Name: series-workflowxpg5z Phase: Succeeded StartedAt: 2026-06-29 14:21:15 +0000 UTC FinishedAt: 2026-06-29 18:36:59 +0000 UTC Input: nil Output: nil --------- Name: series-workflowxpg5z[0] Phase: Succeeded StartedAt: 2026-06-29 14:21:15 +0000 UTC FinishedAt: 2026-06-29 14:35:34 +0000 UTC Input: nil Output: nil --------- Name: series-workflowxpg5z[0].run-triage Phase: Succeeded StartedAt: 2026-06-29 14:21:15 +0000 UTC FinishedAt: 2026-06-29 14:35:34 +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": "88cefc306c43b58d9bb65c9e96e284306710d961", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "MEMCG", "MEMCG_V1" ], "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": "88cefc306c43b58d9bb65c9e96e284306710d961", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "MEMCG", "MEMCG_V1" ], "series_id": "8823cc7f-37ff-4d09-afb4-62cac89b759d" }, "track": "KASAN", "fuzz": { "focus": null, "focus_symbols": [ "vmpressure", "vmpressure_v1_account_tree", "vmpressure_work_fn", "vmpressure_event", "vmpressure_register_event", "vmpressure_unregister_event", "vmpressure_prio" ], "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+CgkJCTx0ZD4yMDI2LzA2LzI5IDE0OjMzPC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MW08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O01FTUNHJiMzNDssCiAgICAmIzM0O01FTUNHX1YxJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7dm1wcmVzc3VyZSYjMzQ7LAogICAgJiMzNDt2bXByZXNzdXJlX3YxX2FjY291bnRfdHJlZSYjMzQ7LAogICAgJiMzNDt2bXByZXNzdXJlX3dvcmtfZm4mIzM0OywKICAgICYjMzQ7dm1wcmVzc3VyZV9ldmVudCYjMzQ7LAogICAgJiMzNDt2bXByZXNzdXJlX3JlZ2lzdGVyX2V2ZW50JiMzNDssCiAgICAmIzM0O3ZtcHJlc3N1cmVfdW5yZWdpc3Rlcl9ldmVudCYjMzQ7LAogICAgJiMzNDt2bXByZXNzdXJlX3ByaW8mIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggZXh0cmFjdHMgY2dyb3VwIHYxIHNwZWNpZmljIHZtcHJlc3N1cmUgbG9naWMgaW50byBhIG5ldyBmaWxlIGBtbS92bXByZXNzdXJlLXYxLmNgIGd1YXJkZWQgYnkgYENPTkZJR19NRU1DR19WMWAuIEl0IGFsc28gaW50cm9kdWNlcyBhIGZ1bmN0aW9uYWwgb3B0aW1pemF0aW9uIGluIGB2bXByZXNzdXJlKClgIHRvIHJldHVybiBlYXJseSBmb3IgY2dyb3VwIHYyIHdoZW4gYHRyZWU9dHJ1ZWAsIGF2b2lkaW5nIHVubmVjZXNzYXJ5IGNvdW50ZXIgYWNjdW11bGF0aW9uIGFuZCB3b3JrIHNjaGVkdWxpbmcuIFRoaXMgbW9kaWZpZXMgcmVhY2hhYmxlIGNvcmUgbWVtb3J5IG1hbmFnZW1lbnQgbG9naWMgYW5kIGFsdGVycyBleGVjdXRpb24gZmxvdywgc28gaXQgc2hvdWxkIGJlIGZ1enplZC4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xLzE8L3RkPgoJCQk8dGQ+MjAyNi8wNi8yOSAxNDozMzwvdGQ+CgkJCTx0ZD5hY3Rpb248L3RkPgoJCQk8dGQ+cmVhZC1wYXRjaC1kaWZmPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7UGF0Y2hEaWZmJiMzNDs6ICYjMzQ7Y29tbWl0IGI1MTc0YWQ1ZGEyNDVmNTNmZWI3ODI0YWQ2YzEyZWU1ZmJmOWVhNDNcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgTW9uIEp1biAyOSAxNDozMzo1NSAyMDI2ICYjNDM7MDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3ZtcHJlc3N1cmUuaCBiL2luY2x1ZGUvbGludXgvdm1wcmVzc3VyZS5oXG5pbmRleCBmYWVjZDU1MjI0MDE3OS4uZTVlNmI2OGQwZGM0MzIgMTAwNjQ0XG4tLS0gYS9pbmNsdWRlL2xpbnV4L3ZtcHJlc3N1cmUuaFxuJiM0MzsmIzQzOyYjNDM7IGIvaW5jbHVkZS9saW51eC92bXByZXNzdXJlLmhcbkBAIC0xMywxOCAmIzQzOzEzLDMxIEBAXG4gc3RydWN0IHZtcHJlc3N1cmUge1xuIFx0dW5zaWduZWQgbG9uZyBzY2FubmVkO1xuIFx0dW5zaWduZWQgbG9uZyByZWNsYWltZWQ7XG4mIzQzO1x0LyogVGhlIGxvY2sgaXMgdXNlZCB0byBrZWVwIHRoZSBzY2FubmVkL3JlY2xhaW1lZCBpbiBzeW5jLiAqL1xuJiM0MztcdHNwaW5sb2NrX3Qgc3JfbG9jaztcbiBcbiYjNDM7I2lmZGVmIENPTkZJR19NRU1DR19WMVxuJiM0MztcdC8qXG4mIzQzO1x0ICogdHJlZT10cnVlIGFjY3VtdWxhdG9ycyBmZWVkIHRoZSB2MSB1c2Vyc3BhY2UgZXZlbnRmZCBpbnRlcmZhY2VcbiYjNDM7XHQgKiAobWVtb3J5LnByZXNzdXJlX2xldmVsKS4gRHJhaW5lZCBieSBAd29yay4gdjIgaGFzIG5vIGVxdWl2YWxlbnRcbiYjNDM7XHQgKiBpbnRlcmZhY2UsIHNvIHRoaXMgc3RhdGUgaXMgb21pdHRlZCBvbiBDT05GSUdfTUVNQ0dfVjE9biBidWlsZHMuXG4mIzQzO1x0ICovXG4gXHR1bnNpZ25lZCBsb25nIHRyZWVfc2Nhbm5lZDtcbiBcdHVuc2lnbmVkIGxvbmcgdHJlZV9yZWNsYWltZWQ7XG4tXHQvKiBUaGUgbG9jayBpcyB1c2VkIHRvIGtlZXAgdGhlIHNjYW5uZWQvcmVjbGFpbWVkIGFib3ZlIGluIHN5bmMuICovXG4tXHRzcGlubG9ja190IHNyX2xvY2s7XG4tXG4gXHQvKiBUaGUgbGlzdCBvZiB2bXByZXNzdXJlX2V2ZW50IHN0cnVjdHMuICovXG4gXHRzdHJ1Y3QgbGlzdF9oZWFkIGV2ZW50cztcbiBcdC8qIEhhdmUgdG8gZ3JhYiB0aGUgbG9jayBvbiBldmVudHMgdHJhdmVyc2FsIG9yIG1vZGlmaWNhdGlvbnMuICovXG4gXHRzdHJ1Y3QgbXV0ZXggZXZlbnRzX2xvY2s7XG4gXG4gXHRzdHJ1Y3Qgd29ya19zdHJ1Y3Qgd29yaztcbiYjNDM7I2VuZGlmXG4mIzQzO307XG4mIzQzO1xuJiM0MztlbnVtIHZtcHJlc3N1cmVfbGV2ZWxzIHtcbiYjNDM7XHRWTVBSRVNTVVJFX0xPVyA9IDAsXG4mIzQzO1x0Vk1QUkVTU1VSRV9NRURJVU0sXG4mIzQzO1x0Vk1QUkVTU1VSRV9DUklUSUNBTCxcbiYjNDM7XHRWTVBSRVNTVVJFX05VTV9MRVZFTFMsXG4gfTtcbiBcbiBzdHJ1Y3QgbWVtX2Nncm91cDtcbkBAIC0zMiwxOCAmIzQzOzQ1LDQxIEBAIHN0cnVjdCBtZW1fY2dyb3VwO1xuICNpZmRlZiBDT05GSUdfTUVNQ0dcbiB2b2lkIHZtcHJlc3N1cmUoZ2ZwX3QgZ2ZwLCBpbnQgb3JkZXIsIHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZywgYm9vbCB0cmVlLFxuIFx0XHR1bnNpZ25lZCBsb25nIHNjYW5uZWQsIHVuc2lnbmVkIGxvbmcgcmVjbGFpbWVkKTtcbi1leHRlcm4gdm9pZCB2bXByZXNzdXJlX3ByaW8oZ2ZwX3QgZ2ZwLCBzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csIGludCBwcmlvKTtcbi1cbiBleHRlcm4gdm9pZCB2bXByZXNzdXJlX2luaXQoc3RydWN0IHZtcHJlc3N1cmUgKnZtcHIpO1xuIGV4dGVybiB2b2lkIHZtcHJlc3N1cmVfY2xlYW51cChzdHJ1Y3Qgdm1wcmVzc3VyZSAqdm1wcik7XG4gZXh0ZXJuIHN0cnVjdCB2bXByZXNzdXJlICptZW1jZ190b192bXByZXNzdXJlKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZyk7XG4gZXh0ZXJuIHN0cnVjdCBtZW1fY2dyb3VwICp2bXByZXNzdXJlX3RvX21lbWNnKHN0cnVjdCB2bXByZXNzdXJlICp2bXByKTtcbiYjNDM7XG4mIzQzOy8qIFNoYXJlZCB3aXRoIG1tL3ZtcHJlc3N1cmUtdjEuYy4gKi9cbiYjNDM7ZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGxvbmcgdm1wcmVzc3VyZV93aW47XG4mIzQzO2V4dGVybiBlbnVtIHZtcHJlc3N1cmVfbGV2ZWxzIHZtcHJlc3N1cmVfY2FsY19sZXZlbCh1bnNpZ25lZCBsb25nIHNjYW5uZWQsXG4mIzQzO1x0XHRcdFx0XHRcdCAgICB1bnNpZ25lZCBsb25nIHJlY2xhaW1lZCk7XG4mIzQzO1xuJiM0MzsjaWZkZWYgQ09ORklHX01FTUNHX1YxXG4mIzQzO2V4dGVybiB2b2lkIHZtcHJlc3N1cmVfcHJpbyhnZnBfdCBnZnAsIHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZywgaW50IHByaW8pO1xuIGV4dGVybiBpbnQgdm1wcmVzc3VyZV9yZWdpc3Rlcl9ldmVudChzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csXG4gXHRcdFx0XHQgICAgIHN0cnVjdCBldmVudGZkX2N0eCAqZXZlbnRmZCxcbiBcdFx0XHRcdCAgICAgY29uc3QgY2hhciAqYXJncyk7XG4gZXh0ZXJuIHZvaWQgdm1wcmVzc3VyZV91bnJlZ2lzdGVyX2V2ZW50KHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZyxcbiBcdFx0XHRcdFx0c3RydWN0IGV2ZW50ZmRfY3R4ICpldmVudGZkKTtcbiYjNDM7XG4mIzQzOy8qIHYxIGhvb2tzIGNhbGxlZCBmcm9tIG1tL3ZtcHJlc3N1cmUuYzsgbm8tb3BzIGJlbG93IHdoZW4gIU1FTUNHX1YxLiAqL1xuJiM0MztleHRlcm4gdm9pZCB2bXByZXNzdXJlX3YxX2luaXQoc3RydWN0IHZtcHJlc3N1cmUgKnZtcHIpO1xuJiM0MztleHRlcm4gdm9pZCB2bXByZXNzdXJlX3YxX2NsZWFudXAoc3RydWN0IHZtcHJlc3N1cmUgKnZtcHIpO1xuJiM0MztleHRlcm4gdm9pZCB2bXByZXNzdXJlX3YxX2FjY291bnRfdHJlZShzdHJ1Y3Qgdm1wcmVzc3VyZSAqdm1wcixcbiYjNDM7XHRcdFx0XHQgICAgICAgdW5zaWduZWQgbG9uZyBzY2FubmVkLFxuJiM0MztcdFx0XHRcdCAgICAgICB1bnNpZ25lZCBsb25nIHJlY2xhaW1lZCk7XG4gI2Vsc2VcbiYjNDM7c3RhdGljIGlubGluZSB2b2lkIHZtcHJlc3N1cmVfcHJpbyhnZnBfdCBnZnAsIHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZyxcbiYjNDM7XHRcdFx0XHQgICBpbnQgcHJpbykge31cbiYjNDM7c3RhdGljIGlubGluZSB2b2lkIHZtcHJlc3N1cmVfdjFfaW5pdChzdHJ1Y3Qgdm1wcmVzc3VyZSAqdm1wcikge31cbiYjNDM7c3RhdGljIGlubGluZSB2b2lkIHZtcHJlc3N1cmVfdjFfY2xlYW51cChzdHJ1Y3Qgdm1wcmVzc3VyZSAqdm1wcikge31cbiYjNDM7c3RhdGljIGlubGluZSB2b2lkIHZtcHJlc3N1cmVfdjFfYWNjb3VudF90cmVlKHN0cnVjdCB2bXByZXNzdXJlICp2bXByLFxuJiM0MztcdFx0XHRcdFx0ICAgICAgdW5zaWduZWQgbG9uZyBzY2FubmVkLFxuJiM0MztcdFx0XHRcdFx0ICAgICAgdW5zaWduZWQgbG9uZyByZWNsYWltZWQpIHt9XG4mIzQzOyNlbmRpZiAvKiBDT05GSUdfTUVNQ0dfVjEgKi9cbiYjNDM7XG4mIzQzOyNlbHNlIC8qICFDT05GSUdfTUVNQ0cgKi9cbiBzdGF0aWMgaW5saW5lIHZvaWQgdm1wcmVzc3VyZShnZnBfdCBnZnAsIGludCBvcmRlciwgc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLFxuIFx0XHRcdCAgICAgIGJvb2wgdHJlZSwgdW5zaWduZWQgbG9uZyBzY2FubmVkLFxuIFx0XHRcdCAgICAgIHVuc2lnbmVkIGxvbmcgcmVjbGFpbWVkKSB7fVxuZGlmZiAtLWdpdCBhL21tL01ha2VmaWxlIGIvbW0vTWFrZWZpbGVcbmluZGV4IDRmYzcxMzg2N2I5YmQ4Li5kZTk5MTYzMGM5NmEzMiAxMDA2NDRcbi0tLSBhL21tL01ha2VmaWxlXG4mIzQzOyYjNDM7JiM0MzsgYi9tbS9NYWtlZmlsZVxuQEAgLTEwMSw3ICYjNDM7MTAxLDcgQEAgb2JqLSQoQ09ORklHX0RFVklDRV9NSUdSQVRJT04pICYjNDM7PSBtaWdyYXRlX2RldmljZS5vXG4gb2JqLSQoQ09ORklHX1RSQU5TUEFSRU5UX0hVR0VQQUdFKSAmIzQzOz0gaHVnZV9tZW1vcnkubyBraHVnZXBhZ2VkLm9cbiBvYmotJChDT05GSUdfUEFHRV9DT1VOVEVSKSAmIzQzOz0gcGFnZV9jb3VudGVyLm9cbiBvYmotJChDT05GSUdfTElWRVVQREFURV9NRU1GRCkgJiM0Mzs9IG1lbWZkX2x1by5vXG4tb2JqLSQoQ09ORklHX01FTUNHX1YxKSAmIzQzOz0gbWVtY29udHJvbC12MS5vXG4mIzQzO29iai0kKENPTkZJR19NRU1DR19WMSkgJiM0Mzs9IG1lbWNvbnRyb2wtdjEubyB2bXByZXNzdXJlLXYxLm9cbiBvYmotJChDT05GSUdfTUVNQ0cpICYjNDM7PSBtZW1jb250cm9sLm8gdm1wcmVzc3VyZS5vXG4gaWZkZWYgQ09ORklHX0JQRl9TWVNDQUxMXG4gb2JqLSQoQ09ORklHX01FTUNHKSAmIzQzOz0gYnBmX21lbWNvbnRyb2wub1xuZGlmZiAtLWdpdCBhL21tL3ZtcHJlc3N1cmUtdjEuYyBiL21tL3ZtcHJlc3N1cmUtdjEuY1xubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAwLi5mZDgxM2NiYTA1NDQ3MFxuLS0tIC9kZXYvbnVsbFxuJiM0MzsmIzQzOyYjNDM7IGIvbW0vdm1wcmVzc3VyZS12MS5jXG5AQCAtMCwwICYjNDM7MSwzMDUgQEBcbiYjNDM7Ly8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb25seVxuJiM0MzsvKlxuJiM0MzsgKiBjZ3JvdXAgdjEgdXNlcnNwYWNlIHZtcHJlc3N1cmUgaW50ZXJmYWNlIChtZW1vcnkucHJlc3N1cmVfbGV2ZWwgL1xuJiM0MzsgKiBjZ3JvdXAuZXZlbnRfY29udHJvbCkuIFNwbGl0IG91dCBvZiBtbS92bXByZXNzdXJlLmMgc28gdGhhdCB2Mi1vbmx5XG4mIzQzOyAqIGtlcm5lbHMgKENPTkZJR19NRU1DR19WMT1uKSBkcm9wIHRoZSB3aG9sZSBldmVudGZkIGFjY3VtdWxhdG9yLFxuJiM0MzsgKiBpdHMgd29yayBpdGVtLCBhbmQgdGhlIHBlci1tZW1jZyBzdGF0ZSBpdCByZXF1aXJlcy5cbiYjNDM7ICovXG4mIzQzO1xuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9jZ3JvdXAuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9ldmVudGZkLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjbGludXgvbGlzdC5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L2xvZzIuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9tZW1jb250cm9sLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjbGludXgvbXV0ZXguaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9zbGFiLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjbGludXgvc3RyaW5nLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjbGludXgvc3dhcC5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L3ZtcHJlc3N1cmUuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC93b3JrcXVldWUuaFx1MDAzZVxuJiM0MztcbiYjNDM7LypcbiYjNDM7ICogV2hlbiB0aGVyZSBhcmUgdG9vIGxpdHRsZSBwYWdlcyBsZWZ0IHRvIHNjYW4sIHZtcHJlc3N1cmUoKSBtYXkgbWlzcyB0aGVcbiYjNDM7ICogY3JpdGljYWwgcHJlc3N1cmUgYXMgbnVtYmVyIG9mIHBhZ2VzIHdpbGwgYmUgbGVzcyB0aGFuIFwmIzM0O3dpbmRvdyBzaXplXCYjMzQ7LlxuJiM0MzsgKiBIb3dldmVyLCBpbiB0aGF0IGNhc2UgdGhlIHZtc2NhbiBwcmlvcml0eSB3aWxsIHJhaXNlIGZhc3QgYXMgdGhlXG4mIzQzOyAqIHJlY2xhaW1lciB3aWxsIHRyeSB0byBzY2FuIExSVXMgbW9yZSBkZWVwbHkuXG4mIzQzOyAqXG4mIzQzOyAqIFRoZSB2bXNjYW4gbG9naWMgY29uc2lkZXJzIHRoZXNlIHNwZWNpYWwgcHJpb3JpdGllczpcbiYjNDM7ICpcbiYjNDM7ICogcHJpbyA9PSBERUZfUFJJT1JJVFkgKDEyKTogcmVjbGFpbWVyIHN0YXJ0cyB3aXRoIHRoYXQgdmFsdWVcbiYjNDM7ICogcHJpbyBcdTAwM2M9IERFRl9QUklPUklUWSAtIDIgOiBrc3dhcGQgYmVjb21lcyBzb21ld2hhdCBvdmVyd2hlbG1lZFxuJiM0MzsgKiBwcmlvID09IDAgICAgICAgICAgICAgICAgOiBjbG9zZSB0byBPT00sIGtlcm5lbCBzY2FucyBldmVyeSBwYWdlIGluIGFuIGxydVxuJiM0MzsgKlxuJiM0MzsgKiBBbnkgdmFsdWUgaW4gdGhpcyByYW5nZSBpcyBhY2NlcHRhYmxlIGZvciB0aGlzIHR1bmFibGUgKGkuZS4gZnJvbSAxMiB0b1xuJiM0MzsgKiAwKS4gQ3VycmVudCB2YWx1ZSBmb3IgdGhlIHZtcHJlc3N1cmVfbGV2ZWxfY3JpdGljYWxfcHJpbyBpcyBjaG9zZW5cbiYjNDM7ICogZW1waXJpY2FsbHksIGJ1dCB0aGUgbnVtYmVyLCBpbiBlc3NlbmNlLCBtZWFucyB0aGF0IHdlIGNvbnNpZGVyXG4mIzQzOyAqIGNyaXRpY2FsIGxldmVsIHdoZW4gc2Nhbm5pbmcgZGVwdGggaXMgfjEwJSBvZiB0aGUgbHJ1IHNpemUgKHZtc2NhblxuJiM0MzsgKiBzY2FucyAmIzM5O2xydV9zaXplIFx1MDAzZVx1MDAzZSBwcmlvJiMzOTsgcGFnZXMsIHNvIGl0IGlzIGFjdHVhbGx5IDEyLjUlLCBvciBvbmVcbiYjNDM7ICogZWlnaHRzKS5cbiYjNDM7ICovXG4mIzQzO3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgdm1wcmVzc3VyZV9sZXZlbF9jcml0aWNhbF9wcmlvID0gaWxvZzIoMTAwIC8gMTApO1xuJiM0MztcbiYjNDM7ZW51bSB2bXByZXNzdXJlX21vZGVzIHtcbiYjNDM7XHRWTVBSRVNTVVJFX05PX1BBU1NUSFJPVUdIID0gMCxcbiYjNDM7XHRWTVBSRVNTVVJFX0hJRVJBUkNIWSxcbiYjNDM7XHRWTVBSRVNTVVJFX0xPQ0FMLFxuJiM0MztcdFZNUFJFU1NVUkVfTlVNX01PREVTLFxuJiM0Mzt9O1xuJiM0MztcbiYjNDM7c3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB2bXByZXNzdXJlX3N0cl9sZXZlbHNbXSA9IHtcbiYjNDM7XHRbVk1QUkVTU1VSRV9MT1ddID0gXCYjMzQ7bG93XCYjMzQ7LFxuJiM0MztcdFtWTVBSRVNTVVJFX01FRElVTV0gPSBcJiMzNDttZWRpdW1cJiMzNDssXG4mIzQzO1x0W1ZNUFJFU1NVUkVfQ1JJVElDQUxdID0gXCYjMzQ7Y3JpdGljYWxcJiMzNDssXG4mIzQzO307XG4mIzQzO1xuJiM0MztzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHZtcHJlc3N1cmVfc3RyX21vZGVzW10gPSB7XG4mIzQzO1x0W1ZNUFJFU1NVUkVfTk9fUEFTU1RIUk9VR0hdID0gXCYjMzQ7ZGVmYXVsdFwmIzM0OyxcbiYjNDM7XHRbVk1QUkVTU1VSRV9ISUVSQVJDSFldID0gXCYjMzQ7aGllcmFyY2h5XCYjMzQ7LFxuJiM0MztcdFtWTVBSRVNTVVJFX0xPQ0FMXSA9IFwmIzM0O2xvY2FsXCYjMzQ7LFxuJiM0Mzt9O1xuJiM0MztcbiYjNDM7c3RydWN0IHZtcHJlc3N1cmVfZXZlbnQge1xuJiM0MztcdHN0cnVjdCBldmVudGZkX2N0eCAqZWZkO1xuJiM0MztcdGVudW0gdm1wcmVzc3VyZV9sZXZlbHMgbGV2ZWw7XG4mIzQzO1x0ZW51bSB2bXByZXNzdXJlX21vZGVzIG1vZGU7XG4mIzQzO1x0c3RydWN0IGxpc3RfaGVhZCBub2RlO1xuJiM0Mzt9O1xuJiM0MztcbiYjNDM7c3RhdGljIHN0cnVjdCB2bXByZXNzdXJlICp3b3JrX3RvX3ZtcHJlc3N1cmUoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKVxuJiM0Mzt7XG4mIzQzO1x0cmV0dXJuIGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3Qgdm1wcmVzc3VyZSwgd29yayk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBzdHJ1Y3Qgdm1wcmVzc3VyZSAqdm1wcmVzc3VyZV9wYXJlbnQoc3RydWN0IHZtcHJlc3N1cmUgKnZtcHIpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2cgPSB2bXByZXNzdXJlX3RvX21lbWNnKHZtcHIpO1xuJiM0MztcbiYjNDM7XHRtZW1jZyA9IHBhcmVudF9tZW1fY2dyb3VwKG1lbWNnKTtcbiYjNDM7XHRpZiAoIW1lbWNnKVxuJiM0MztcdFx0cmV0dXJuIE5VTEw7XG4mIzQzO1x0cmV0dXJuIG1lbWNnX3RvX3ZtcHJlc3N1cmUobWVtY2cpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgYm9vbCB2bXByZXNzdXJlX2V2ZW50KHN0cnVjdCB2bXByZXNzdXJlICp2bXByLFxuJiM0MztcdFx0XHQgICAgIGNvbnN0IGVudW0gdm1wcmVzc3VyZV9sZXZlbHMgbGV2ZWwsXG4mIzQzO1x0XHRcdCAgICAgYm9vbCBhbmNlc3RvciwgYm9vbCBzaWduYWxsZWQpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3Qgdm1wcmVzc3VyZV9ldmVudCAqZXY7XG4mIzQzO1x0Ym9vbCByZXQgPSBmYWxzZTtcbiYjNDM7XG4mIzQzO1x0bXV0ZXhfbG9jayhcdTAwMjZ2bXByLVx1MDAzZWV2ZW50c19sb2NrKTtcbiYjNDM7XHRsaXN0X2Zvcl9lYWNoX2VudHJ5KGV2LCBcdTAwMjZ2bXByLVx1MDAzZWV2ZW50cywgbm9kZSkge1xuJiM0MztcdFx0aWYgKGFuY2VzdG9yIFx1MDAyNlx1MDAyNiBldi1cdTAwM2Vtb2RlID09IFZNUFJFU1NVUkVfTE9DQUwpXG4mIzQzO1x0XHRcdGNvbnRpbnVlO1xuJiM0MztcdFx0aWYgKHNpZ25hbGxlZCBcdTAwMjZcdTAwMjYgZXYtXHUwMDNlbW9kZSA9PSBWTVBSRVNTVVJFX05PX1BBU1NUSFJPVUdIKVxuJiM0MztcdFx0XHRjb250aW51ZTtcbiYjNDM7XHRcdGlmIChsZXZlbCBcdTAwM2MgZXYtXHUwMDNlbGV2ZWwpXG4mIzQzO1x0XHRcdGNvbnRpbnVlO1xuJiM0MztcdFx0ZXZlbnRmZF9zaWduYWwoZXYtXHUwMDNlZWZkKTtcbiYjNDM7XHRcdHJldCA9IHRydWU7XG4mIzQzO1x0fVxuJiM0MztcdG11dGV4X3VubG9jayhcdTAwMjZ2bXByLVx1MDAzZWV2ZW50c19sb2NrKTtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIHJldDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIHZvaWQgdm1wcmVzc3VyZV93b3JrX2ZuKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaylcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCB2bXByZXNzdXJlICp2bXByID0gd29ya190b192bXByZXNzdXJlKHdvcmspO1xuJiM0MztcdHVuc2lnbmVkIGxvbmcgc2Nhbm5lZDtcbiYjNDM7XHR1bnNpZ25lZCBsb25nIHJlY2xhaW1lZDtcbiYjNDM7XHRlbnVtIHZtcHJlc3N1cmVfbGV2ZWxzIGxldmVsO1xuJiM0MztcdGJvb2wgYW5jZXN0b3IgPSBmYWxzZTtcbiYjNDM7XHRib29sIHNpZ25hbGxlZCA9IGZhbHNlO1xuJiM0MztcbiYjNDM7XHRzcGluX2xvY2soXHUwMDI2dm1wci1cdTAwM2Vzcl9sb2NrKTtcbiYjNDM7XHQvKlxuJiM0MztcdCAqIFNldmVyYWwgY29udGV4dHMgbWlnaHQgYmUgY2FsbGluZyB2bXByZXNzdXJlKCksIHNvIGl0IGlzXG4mIzQzO1x0ICogcG9zc2libGUgdGhhdCB0aGUgd29yayB3YXMgcmVzY2hlZHVsZWQgYWdhaW4gYmVmb3JlIHRoZSBvbGRcbiYjNDM7XHQgKiB3b3JrIGNvbnRleHQgY2xlYXJlZCB0aGUgY291bnRlcnMuIEluIHRoYXQgY2FzZSB3ZSB3aWxsIHJ1blxuJiM0MztcdCAqIGp1c3QgYWZ0ZXIgdGhlIG9sZCB3b3JrIHJldHVybnMsIGJ1dCB0aGVuIHNjYW5uZWQgbWlnaHQgYmUgemVyb1xuJiM0MztcdCAqIGhlcmUuIE5vIG5lZWQgZm9yIGFueSBsb2NrcyBoZXJlIHNpbmNlIHdlIGRvbiYjMzk7dCBjYXJlIGlmXG4mIzQzO1x0ICogdm1wci1cdTAwM2VyZWNsYWltZWQgaXMgaW4gc3luYy5cbiYjNDM7XHQgKi9cbiYjNDM7XHRzY2FubmVkID0gdm1wci1cdTAwM2V0cmVlX3NjYW5uZWQ7XG4mIzQzO1x0aWYgKCFzY2FubmVkKSB7XG4mIzQzO1x0XHRzcGluX3VubG9jayhcdTAwMjZ2bXByLVx1MDAzZXNyX2xvY2spO1xuJiM0MztcdFx0cmV0dXJuO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0cmVjbGFpbWVkID0gdm1wci1cdTAwM2V0cmVlX3JlY2xhaW1lZDtcbiYjNDM7XHR2bXByLVx1MDAzZXRyZWVfc2Nhbm5lZCA9IDA7XG4mIzQzO1x0dm1wci1cdTAwM2V0cmVlX3JlY2xhaW1lZCA9IDA7XG4mIzQzO1x0c3Bpbl91bmxvY2soXHUwMDI2dm1wci1cdTAwM2Vzcl9sb2NrKTtcbiYjNDM7XG4mIzQzO1x0bGV2ZWwgPSB2bXByZXNzdXJlX2NhbGNfbGV2ZWwoc2Nhbm5lZCwgcmVjbGFpbWVkKTtcbiYjNDM7XG4mIzQzO1x0ZG8ge1xuJiM0MztcdFx0aWYgKHZtcHJlc3N1cmVfZXZlbnQodm1wciwgbGV2ZWwsIGFuY2VzdG9yLCBzaWduYWxsZWQpKVxuJiM0MztcdFx0XHRzaWduYWxsZWQgPSB0cnVlO1xuJiM0MztcdFx0YW5jZXN0b3IgPSB0cnVlO1xuJiM0MztcdH0gd2hpbGUgKCh2bXByID0gdm1wcmVzc3VyZV9wYXJlbnQodm1wcikpKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LypcbiYjNDM7ICogVHJlZS1tb2RlIGFjY3VtdWxhdG9yOiBhY2N1bXVsYXRlIHBlci1tZW1jZyBzY2FubmVkL3JlY2xhaW1lZCBhbmRcbiYjNDM7ICogc2NoZWR1bGUgdGhlIHdvcmsgdGhhdCB3YWxrcyB0aGUgcGFyZW50IGNoYWluIGFuZCBzaWduYWxzIHJlZ2lzdGVyZWRcbiYjNDM7ICogZXZlbnRmZCBsaXN0ZW5lcnMgb25jZSB3ZSBjcm9zcyB0aGUgd2luZG93IHRocmVzaG9sZC5cbiYjNDM7ICovXG4mIzQzO3ZvaWQgdm1wcmVzc3VyZV92MV9hY2NvdW50X3RyZWUoc3RydWN0IHZtcHJlc3N1cmUgKnZtcHIsXG4mIzQzO1x0XHRcdFx0dW5zaWduZWQgbG9uZyBzY2FubmVkLFxuJiM0MztcdFx0XHRcdHVuc2lnbmVkIGxvbmcgcmVjbGFpbWVkKVxuJiM0Mzt7XG4mIzQzO1x0c3Bpbl9sb2NrKFx1MDAyNnZtcHItXHUwMDNlc3JfbG9jayk7XG4mIzQzO1x0c2Nhbm5lZCA9IHZtcHItXHUwMDNldHJlZV9zY2FubmVkICYjNDM7PSBzY2FubmVkO1xuJiM0MztcdHZtcHItXHUwMDNldHJlZV9yZWNsYWltZWQgJiM0Mzs9IHJlY2xhaW1lZDtcbiYjNDM7XHRzcGluX3VubG9jayhcdTAwMjZ2bXByLVx1MDAzZXNyX2xvY2spO1xuJiM0MztcbiYjNDM7XHRpZiAoc2Nhbm5lZCBcdTAwM2Mgdm1wcmVzc3VyZV93aW4pXG4mIzQzO1x0XHRyZXR1cm47XG4mIzQzO1x0c2NoZWR1bGVfd29yayhcdTAwMjZ2bXByLVx1MDAzZXdvcmspO1xuJiM0Mzt9XG4mIzQzO1xuJiM0Mzt2b2lkIHZtcHJlc3N1cmVfdjFfaW5pdChzdHJ1Y3Qgdm1wcmVzc3VyZSAqdm1wcilcbiYjNDM7e1xuJiM0MztcdG11dGV4X2luaXQoXHUwMDI2dm1wci1cdTAwM2VldmVudHNfbG9jayk7XG4mIzQzO1x0SU5JVF9MSVNUX0hFQUQoXHUwMDI2dm1wci1cdTAwM2VldmVudHMpO1xuJiM0MztcdElOSVRfV09SSyhcdTAwMjZ2bXByLVx1MDAzZXdvcmssIHZtcHJlc3N1cmVfd29ya19mbik7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3ZvaWQgdm1wcmVzc3VyZV92MV9jbGVhbnVwKHN0cnVjdCB2bXByZXNzdXJlICp2bXByKVxuJiM0Mzt7XG4mIzQzO1x0LypcbiYjNDM7XHQgKiBNYWtlIHN1cmUgdGhlcmUgaXMgbm8gcGVuZGluZyB3b3JrIGJlZm9yZSBldmVudGZkIGluZnJhc3RydWN0dXJlXG4mIzQzO1x0ICogZ29lcyBhd2F5LlxuJiM0MztcdCAqL1xuJiM0MztcdGZsdXNoX3dvcmsoXHUwMDI2dm1wci1cdTAwM2V3b3JrKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LyoqXG4mIzQzOyAqIHZtcHJlc3N1cmVfcHJpbygpIC0gQWNjb3VudCBtZW1vcnkgcHJlc3N1cmUgdGhyb3VnaCByZWNsYWltZXIgcHJpb3JpdHkgbGV2ZWxcbiYjNDM7ICogQGdmcDpcdHJlY2xhaW1lciYjMzk7cyBnZnAgbWFza1xuJiM0MzsgKiBAbWVtY2c6XHRjZ3JvdXAgbWVtb3J5IGNvbnRyb2xsZXIgaGFuZGxlXG4mIzQzOyAqIEBwcmlvOlx0cmVjbGFpbWVyJiMzOTtzIHByaW9yaXR5XG4mIzQzOyAqXG4mIzQzOyAqIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBmcm9tIHRoZSByZWNsYWltIHBhdGggZXZlcnkgdGltZSB3aGVuXG4mIzQzOyAqIHRoZSB2bXNjYW4mIzM5O3MgcmVjbGFpbWluZyBwcmlvcml0eSAoc2Nhbm5pbmcgZGVwdGgpIGNoYW5nZXMuXG4mIzQzOyAqXG4mIzQzOyAqIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgcmV0dXJuIGFueSB2YWx1ZS5cbiYjNDM7ICovXG4mIzQzO3ZvaWQgdm1wcmVzc3VyZV9wcmlvKGdmcF90IGdmcCwgc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLCBpbnQgcHJpbylcbiYjNDM7e1xuJiM0MztcdC8qXG4mIzQzO1x0ICogV2Ugb25seSB1c2UgcHJpbyBmb3IgYWNjb3VudGluZyBjcml0aWNhbCBsZXZlbC4gRm9yIG1vcmUgaW5mb1xuJiM0MztcdCAqIHNlZSBjb21tZW50IGZvciB2bXByZXNzdXJlX2xldmVsX2NyaXRpY2FsX3ByaW8gdmFyaWFibGUgYWJvdmUuXG4mIzQzO1x0ICovXG4mIzQzO1x0aWYgKHByaW8gXHUwMDNlIHZtcHJlc3N1cmVfbGV2ZWxfY3JpdGljYWxfcHJpbylcbiYjNDM7XHRcdHJldHVybjtcbiYjNDM7XG4mIzQzO1x0LypcbiYjNDM7XHQgKiBPSywgdGhlIHByaW8gaXMgYmVsb3cgdGhlIHRocmVzaG9sZCwgdXBkYXRpbmcgdm1wcmVzc3VyZVxuJiM0MztcdCAqIGluZm9ybWF0aW9uIGJlZm9yZSBzaHJpbmtlciBkaXZlcyBpbnRvIGxvbmcgc2hyaW5raW5nIG9mIGxvbmdcbiYjNDM7XHQgKiByYW5nZSB2bXNjYW4uIFBhc3Npbmcgc2Nhbm5lZCA9IHZtcHJlc3N1cmVfd2luLCByZWNsYWltZWQgPSAwXG4mIzQzO1x0ICogdG8gdGhlIHZtcHJlc3N1cmUoKSBiYXNpY2FsbHkgbWVhbnMgdGhhdCB3ZSBzaWduYWwgJiMzOTtjcml0aWNhbCYjMzk7XG4mIzQzO1x0ICogbGV2ZWwuXG4mIzQzO1x0ICovXG4mIzQzO1x0dm1wcmVzc3VyZShnZnAsIDAsIG1lbWNnLCB0cnVlLCB2bXByZXNzdXJlX3dpbiwgMCk7XG4mIzQzO31cbiYjNDM7XG4mIzQzOyNkZWZpbmUgTUFYX1ZNUFJFU1NVUkVfQVJHU19MRU5cdChzdHJsZW4oXCYjMzQ7Y3JpdGljYWxcJiMzNDspICYjNDM7IHN0cmxlbihcJiMzNDtoaWVyYXJjaHlcJiMzNDspICYjNDM7IDIpXG4mIzQzO1xuJiM0MzsvKipcbiYjNDM7ICogdm1wcmVzc3VyZV9yZWdpc3Rlcl9ldmVudCgpIC0gQmluZCB2bXByZXNzdXJlIG5vdGlmaWNhdGlvbnMgdG8gYW4gZXZlbnRmZFxuJiM0MzsgKiBAbWVtY2c6XHRtZW1jZyB0aGF0IGlzIGludGVyZXN0ZWQgaW4gdm1wcmVzc3VyZSBub3RpZmljYXRpb25zXG4mIzQzOyAqIEBldmVudGZkOlx0ZXZlbnRmZCBjb250ZXh0IHRvIGxpbmsgbm90aWZpY2F0aW9ucyB3aXRoXG4mIzQzOyAqIEBhcmdzOlx0ZXZlbnQgYXJndW1lbnRzIChwcmVzc3VyZSBsZXZlbCB0aHJlc2hvbGQsIG9wdGlvbmFsIG1vZGUpXG4mIzQzOyAqXG4mIzQzOyAqIFRoaXMgZnVuY3Rpb24gYXNzb2NpYXRlcyBldmVudGZkIGNvbnRleHQgd2l0aCB0aGUgdm1wcmVzc3VyZVxuJiM0MzsgKiBpbmZyYXN0cnVjdHVyZSwgc28gdGhhdCB0aGUgbm90aWZpY2F0aW9ucyB3aWxsIGJlIGRlbGl2ZXJlZCB0byB0aGVcbiYjNDM7ICogQGV2ZW50ZmQuIFRoZSBAYXJncyBwYXJhbWV0ZXIgaXMgYSBjb21tYS1kZWxpbWl0ZWQgc3RyaW5nIHRoYXQgZGVub3RlcyBhXG4mIzQzOyAqIHByZXNzdXJlIGxldmVsIHRocmVzaG9sZCAob25lIG9mIHZtcHJlc3N1cmVfc3RyX2xldmVscywgaS5lLiBcJiMzNDtsb3dcJiMzNDssIFwmIzM0O21lZGl1bVwmIzM0OyxcbiYjNDM7ICogb3IgXCYjMzQ7Y3JpdGljYWxcJiMzNDspIGFuZCBhbiBvcHRpb25hbCBtb2RlIChvbmUgb2Ygdm1wcmVzc3VyZV9zdHJfbW9kZXMsIGkuZS5cbiYjNDM7ICogXCYjMzQ7aGllcmFyY2h5XCYjMzQ7IG9yIFwmIzM0O2xvY2FsXCYjMzQ7KS5cbiYjNDM7ICpcbiYjNDM7ICogVG8gYmUgdXNlZCBhcyBtZW1jZyBldmVudCBtZXRob2QuXG4mIzQzOyAqXG4mIzQzOyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCAtRU5PTUVNIG9uIG1lbW9yeSBmYWlsdXJlIG9yIC1FSU5WQUwgaWYgQGFyZ3MgY291bGRcbiYjNDM7ICogbm90IGJlIHBhcnNlZC5cbiYjNDM7ICovXG4mIzQzO2ludCB2bXByZXNzdXJlX3JlZ2lzdGVyX2V2ZW50KHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZyxcbiYjNDM7XHRcdFx0ICAgICAgc3RydWN0IGV2ZW50ZmRfY3R4ICpldmVudGZkLCBjb25zdCBjaGFyICphcmdzKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IHZtcHJlc3N1cmUgKnZtcHIgPSBtZW1jZ190b192bXByZXNzdXJlKG1lbWNnKTtcbiYjNDM7XHRzdHJ1Y3Qgdm1wcmVzc3VyZV9ldmVudCAqZXY7XG4mIzQzO1x0ZW51bSB2bXByZXNzdXJlX21vZGVzIG1vZGUgPSBWTVBSRVNTVVJFX05PX1BBU1NUSFJPVUdIO1xuJiM0MztcdGVudW0gdm1wcmVzc3VyZV9sZXZlbHMgbGV2ZWw7XG4mIzQzO1x0Y2hhciAqc3BlYywgKnNwZWNfb3JpZztcbiYjNDM7XHRjaGFyICp0b2tlbjtcbiYjNDM7XHRpbnQgcmV0ID0gMDtcbiYjNDM7XG4mIzQzO1x0c3BlY19vcmlnID0gc3BlYyA9IGtzdHJuZHVwKGFyZ3MsIE1BWF9WTVBSRVNTVVJFX0FSR1NfTEVOLCBHRlBfS0VSTkVMKTtcbiYjNDM7XHRpZiAoIXNwZWMpXG4mIzQzO1x0XHRyZXR1cm4gLUVOT01FTTtcbiYjNDM7XG4mIzQzO1x0LyogRmluZCByZXF1aXJlZCBsZXZlbCAqL1xuJiM0MztcdHRva2VuID0gc3Ryc2VwKFx1MDAyNnNwZWMsIFwmIzM0OyxcJiMzNDspO1xuJiM0MztcdHJldCA9IG1hdGNoX3N0cmluZyh2bXByZXNzdXJlX3N0cl9sZXZlbHMsIFZNUFJFU1NVUkVfTlVNX0xFVkVMUywgdG9rZW4pO1xuJiM0MztcdGlmIChyZXQgXHUwMDNjIDApXG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XHRsZXZlbCA9IHJldDtcbiYjNDM7XG4mIzQzO1x0LyogRmluZCBvcHRpb25hbCBtb2RlICovXG4mIzQzO1x0dG9rZW4gPSBzdHJzZXAoXHUwMDI2c3BlYywgXCYjMzQ7LFwmIzM0Oyk7XG4mIzQzO1x0aWYgKHRva2VuKSB7XG4mIzQzO1x0XHRyZXQgPSBtYXRjaF9zdHJpbmcodm1wcmVzc3VyZV9zdHJfbW9kZXMsIFZNUFJFU1NVUkVfTlVNX01PREVTLCB0b2tlbik7XG4mIzQzO1x0XHRpZiAocmV0IFx1MDAzYyAwKVxuJiM0MztcdFx0XHRnb3RvIG91dDtcbiYjNDM7XHRcdG1vZGUgPSByZXQ7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRldiA9IGt6YWxsb2Nfb2JqKCpldik7XG4mIzQzO1x0aWYgKCFldikge1xuJiM0MztcdFx0cmV0ID0gLUVOT01FTTtcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0ZXYtXHUwMDNlZWZkID0gZXZlbnRmZDtcbiYjNDM7XHRldi1cdTAwM2VsZXZlbCA9IGxldmVsO1xuJiM0MztcdGV2LVx1MDAzZW1vZGUgPSBtb2RlO1xuJiM0MztcbiYjNDM7XHRtdXRleF9sb2NrKFx1MDAyNnZtcHItXHUwMDNlZXZlbnRzX2xvY2spO1xuJiM0MztcdGxpc3RfYWRkKFx1MDAyNmV2LVx1MDAzZW5vZGUsIFx1MDAyNnZtcHItXHUwMDNlZXZlbnRzKTtcbiYjNDM7XHRtdXRleF91bmxvY2soXHUwMDI2dm1wci1cdTAwM2VldmVudHNfbG9jayk7XG4mIzQzO1x0cmV0ID0gMDtcbiYjNDM7b3V0OlxuJiM0MztcdGtmcmVlKHNwZWNfb3JpZyk7XG4mIzQzO1x0cmV0dXJuIHJldDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LyoqXG4mIzQzOyAqIHZtcHJlc3N1cmVfdW5yZWdpc3Rlcl9ldmVudCgpIC0gVW5iaW5kIGV2ZW50ZmQgZnJvbSB2bXByZXNzdXJlXG4mIzQzOyAqIEBtZW1jZzpcdG1lbWNnIGhhbmRsZVxuJiM0MzsgKiBAZXZlbnRmZDpcdGV2ZW50ZmQgY29udGV4dCB0aGF0IHdhcyB1c2VkIHRvIGxpbmsgdm1wcmVzc3VyZSB3aXRoIHRoZSBAY2dcbiYjNDM7ICpcbiYjNDM7ICogVGhpcyBmdW5jdGlvbiBkb2VzIGludGVybmFsIG1hbmlwdWxhdGlvbnMgdG8gZGV0YWNoIHRoZSBAZXZlbnRmZCBmcm9tXG4mIzQzOyAqIHRoZSB2bXByZXNzdXJlIG5vdGlmaWNhdGlvbnMsIGFuZCB0aGVuIGZyZWVzIGludGVybmFsIHJlc291cmNlc1xuJiM0MzsgKiBhc3NvY2lhdGVkIHdpdGggdGhlIEBldmVudGZkIChidXQgdGhlIEBldmVudGZkIGl0c2VsZiBpcyBub3QgZnJlZWQpLlxuJiM0MzsgKlxuJiM0MzsgKiBUbyBiZSB1c2VkIGFzIG1lbWNnIGV2ZW50IG1ldGhvZC5cbiYjNDM7ICovXG4mIzQzO3ZvaWQgdm1wcmVzc3VyZV91bnJlZ2lzdGVyX2V2ZW50KHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZyxcbiYjNDM7XHRcdFx0XHQgc3RydWN0IGV2ZW50ZmRfY3R4ICpldmVudGZkKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IHZtcHJlc3N1cmUgKnZtcHIgPSBtZW1jZ190b192bXByZXNzdXJlKG1lbWNnKTtcbiYjNDM7XHRzdHJ1Y3Qgdm1wcmVzc3VyZV9ldmVudCAqZXY7XG4mIzQzO1xuJiM0MztcdG11dGV4X2xvY2soXHUwMDI2dm1wci1cdTAwM2VldmVudHNfbG9jayk7XG4mIzQzO1x0bGlzdF9mb3JfZWFjaF9lbnRyeShldiwgXHUwMDI2dm1wci1cdTAwM2VldmVudHMsIG5vZGUpIHtcbiYjNDM7XHRcdGlmIChldi1cdTAwM2VlZmQgIT0gZXZlbnRmZClcbiYjNDM7XHRcdFx0Y29udGludWU7XG4mIzQzO1x0XHRsaXN0X2RlbChcdTAwMjZldi1cdTAwM2Vub2RlKTtcbiYjNDM7XHRcdGtmcmVlKGV2KTtcbiYjNDM7XHRcdGJyZWFrO1xuJiM0MztcdH1cbiYjNDM7XHRtdXRleF91bmxvY2soXHUwMDI2dm1wci1cdTAwM2VldmVudHNfbG9jayk7XG4mIzQzO31cbmRpZmYgLS1naXQgYS9tbS92bXByZXNzdXJlLmMgYi9tbS92bXByZXNzdXJlLmNcbmluZGV4IGYwNTM1NTRlNTgyNjQyLi5iY2ZhNGJkOGZmYzUyOSAxMDA2NDRcbi0tLSBhL21tL3ZtcHJlc3N1cmUuY1xuJiM0MzsmIzQzOyYjNDM7IGIvbW0vdm1wcmVzc3VyZS5jXG5AQCAtNywxNiAmIzQzOzcsMTUgQEBcbiAgKlxuICAqIEJhc2VkIG9uIGlkZWFzIGZyb20gQW5kcmV3IE1vcnRvbiwgRGF2aWQgUmllbnRqZXMsIEtPU0FLSSBNb3RvaGlybyxcbiAgKiBMZW9uaWQgTW9pc2VpY2h1aywgTWVsIEdvcm1hbiwgTWluY2hhbiBLaW0gYW5kIFBla2thIEVuYmVyZy5cbiYjNDM7ICpcbiYjNDM7ICogVHJlZS1tb2RlIChjZ3JvdXAgdjEgdXNlcnNwYWNlIGV2ZW50ZmQpIGJvb2trZWVwaW5nIGxpdmVzIGluXG4mIzQzOyAqIG1tL3ZtcHJlc3N1cmUtdjEuYzsgdGhpcyBmaWxlIGhvbGRzIHRoZSBzaGFyZWQgY29kZSBhbmQgdGhlIGluLWtlcm5lbFxuJiM0MzsgKiAodHJlZT1mYWxzZSkgc29ja2V0LXByZXNzdXJlIHBhdGggdGhhdCBydW5zIG9uIGNncm91cCB2Mi5cbiAgKi9cbiBcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9jZ3JvdXAuaFx1MDAzZVxuLSNpbmNsdWRlIFx1MDAzY2xpbnV4L2ZzLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9sb2cyLmhcdTAwM2Vcbi0jaW5jbHVkZSBcdTAwM2NsaW51eC9zY2hlZC5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvbW0uaFx1MDAzZVxuLSNpbmNsdWRlIFx1MDAzY2xpbnV4L3Ztc3RhdC5oXHUwMDNlXG4tI2luY2x1ZGUgXHUwMDNjbGludXgvZXZlbnRmZC5oXHUwMDNlXG4tI2luY2x1ZGUgXHUwMDNjbGludXgvc2xhYi5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvc3dhcC5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvcHJpbnRrLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC92bXByZXNzdXJlLmhcdTAwM2VcbkBAIC0zNSw3ICYjNDM7MzQsNyBAQFxuICAqIFRPRE86IE1ha2UgdGhlIHdpbmRvdyBzaXplIGRlcGVuZCBvbiBtYWNoaW5lIHNpemUsIGFzIHdlIGRvIGZvciB2bXN0YXRcbiAgKiB0aHJlc2hvbGRzLiBDdXJyZW50bHkgd2Ugc2V0IGl0IHRvIDUxMiBwYWdlcyAoMk1CIGZvciA0S0IgcGFnZXMpLlxuICAqL1xuLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIHZtcHJlc3N1cmVfd2luID0gU1dBUF9DTFVTVEVSX01BWCAqIDE2O1xuJiM0Mztjb25zdCB1bnNpZ25lZCBsb25nIHZtcHJlc3N1cmVfd2luID0gU1dBUF9DTFVTVEVSX01BWCAqIDE2O1xuIFxuIC8qXG4gICogVGhlc2UgdGhyZXNob2xkcyBhcmUgdXNlZCB3aGVuIHdlIGFjY291bnQgbWVtb3J5IHByZXNzdXJlIHRocm91Z2hcbkBAIC00Niw2OCAmIzQzOzQ1LDYgQEAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgdm1wcmVzc3VyZV93aW4gPSBTV0FQX0NMVVNURVJfTUFYICogMTY7XG4gc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCB2bXByZXNzdXJlX2xldmVsX21lZCA9IDYwO1xuIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgdm1wcmVzc3VyZV9sZXZlbF9jcml0aWNhbCA9IDk1O1xuIFxuLS8qXG4tICogV2hlbiB0aGVyZSBhcmUgdG9vIGxpdHRsZSBwYWdlcyBsZWZ0IHRvIHNjYW4sIHZtcHJlc3N1cmUoKSBtYXkgbWlzcyB0aGVcbi0gKiBjcml0aWNhbCBwcmVzc3VyZSBhcyBudW1iZXIgb2YgcGFnZXMgd2lsbCBiZSBsZXNzIHRoYW4gXCYjMzQ7d2luZG93IHNpemVcJiMzNDsuXG4tICogSG93ZXZlciwgaW4gdGhhdCBjYXNlIHRoZSB2bXNjYW4gcHJpb3JpdHkgd2lsbCByYWlzZSBmYXN0IGFzIHRoZVxuLSAqIHJlY2xhaW1lciB3aWxsIHRyeSB0byBzY2FuIExSVXMgbW9yZSBkZWVwbHkuXG4tICpcbi0gKiBUaGUgdm1zY2FuIGxvZ2ljIGNvbnNpZGVycyB0aGVzZSBzcGVjaWFsIHByaW9yaXRpZXM6XG4tICpcbi0gKiBwcmlvID09IERFRl9QUklPUklUWSAoMTIpOiByZWNsYWltZXIgc3RhcnRzIHdpdGggdGhhdCB2YWx1ZVxuLSAqIHByaW8gXHUwMDNjPSBERUZfUFJJT1JJVFkgLSAyIDoga3N3YXBkIGJlY29tZXMgc29tZXdoYXQgb3ZlcndoZWxtZWRcbi0gKiBwcmlvID09IDAgICAgICAgICAgICAgICAgOiBjbG9zZSB0byBPT00sIGtlcm5lbCBzY2FucyBldmVyeSBwYWdlIGluIGFuIGxydVxuLSAqXG4tICogQW55IHZhbHVlIGluIHRoaXMgcmFuZ2UgaXMgYWNjZXB0YWJsZSBmb3IgdGhpcyB0dW5hYmxlIChpLmUuIGZyb20gMTIgdG9cbi0gKiAwKS4gQ3VycmVudCB2YWx1ZSBmb3IgdGhlIHZtcHJlc3N1cmVfbGV2ZWxfY3JpdGljYWxfcHJpbyBpcyBjaG9zZW5cbi0gKiBlbXBpcmljYWxseSwgYnV0IHRoZSBudW1iZXIsIGluIGVzc2VuY2UsIG1lYW5zIHRoYXQgd2UgY29uc2lkZXJcbi0gKiBjcml0aWNhbCBsZXZlbCB3aGVuIHNjYW5uaW5nIGRlcHRoIGlzIH4xMCUgb2YgdGhlIGxydSBzaXplICh2bXNjYW5cbi0gKiBzY2FucyAmIzM5O2xydV9zaXplIFx1MDAzZVx1MDAzZSBwcmlvJiMzOTsgcGFnZXMsIHNvIGl0IGlzIGFjdHVhbGx5IDEyLjUlLCBvciBvbmVcbi0gKiBlaWdodHMpLlxuLSAqL1xuLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgdm1wcmVzc3VyZV9sZXZlbF9jcml0aWNhbF9wcmlvID0gaWxvZzIoMTAwIC8gMTApO1xuLVxuLXN0YXRpYyBzdHJ1Y3Qgdm1wcmVzc3VyZSAqd29ya190b192bXByZXNzdXJlKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaylcbi17XG4tXHRyZXR1cm4gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCB2bXByZXNzdXJlLCB3b3JrKTtcbi19XG4tXG4tc3RhdGljIHN0cnVjdCB2bXByZXNzdXJlICp2bXByZXNzdXJlX3BhcmVudChzdHJ1Y3Qgdm1wcmVzc3VyZSAqdm1wcilcbi17XG4tXHRzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2cgPSB2bXByZXNzdXJlX3RvX21lbWNnKHZtcHIpO1xuLVxuLVx0bWVtY2cgPSBwYXJlbnRfbWVtX2Nncm91cChtZW1jZyk7XG4tXHRpZiAoIW1lbWNnKVxuLVx0XHRyZXR1cm4gTlVMTDtcbi1cdHJldHVybiBtZW1jZ190b192bXByZXNzdXJlKG1lbWNnKTtcbi19XG4tXG4tZW51bSB2bXByZXNzdXJlX2xldmVscyB7XG4tXHRWTVBSRVNTVVJFX0xPVyA9IDAsXG4tXHRWTVBSRVNTVVJFX01FRElVTSxcbi1cdFZNUFJFU1NVUkVfQ1JJVElDQUwsXG4tXHRWTVBSRVNTVVJFX05VTV9MRVZFTFMsXG4tfTtcbi1cbi1lbnVtIHZtcHJlc3N1cmVfbW9kZXMge1xuLVx0Vk1QUkVTU1VSRV9OT19QQVNTVEhST1VHSCA9IDAsXG4tXHRWTVBSRVNTVVJFX0hJRVJBUkNIWSxcbi1cdFZNUFJFU1NVUkVfTE9DQUwsXG4tXHRWTVBSRVNTVVJFX05VTV9NT0RFUyxcbi19O1xuLVxuLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgdm1wcmVzc3VyZV9zdHJfbGV2ZWxzW10gPSB7XG4tXHRbVk1QUkVTU1VSRV9MT1ddID0gXCYjMzQ7bG93XCYjMzQ7LFxuLVx0W1ZNUFJFU1NVUkVfTUVESVVNXSA9IFwmIzM0O21lZGl1bVwmIzM0Oyxcbi1cdFtWTVBSRVNTVVJFX0NSSVRJQ0FMXSA9IFwmIzM0O2NyaXRpY2FsXCYjMzQ7LFxuLX07XG4tXG4tc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB2bXByZXNzdXJlX3N0cl9tb2Rlc1tdID0ge1xuLVx0W1ZNUFJFU1NVUkVfTk9fUEFTU1RIUk9VR0hdID0gXCYjMzQ7ZGVmYXVsdFwmIzM0Oyxcbi1cdFtWTVBSRVNTVVJFX0hJRVJBUkNIWV0gPSBcJiMzNDtoaWVyYXJjaHlcJiMzNDssXG4tXHRbVk1QUkVTU1VSRV9MT0NBTF0gPSBcJiMzNDtsb2NhbFwmIzM0Oyxcbi19O1xuLVxuIHN0YXRpYyBlbnVtIHZtcHJlc3N1cmVfbGV2ZWxzIHZtcHJlc3N1cmVfbGV2ZWwodW5zaWduZWQgbG9uZyBwcmVzc3VyZSlcbiB7XG4gXHRpZiAocHJlc3N1cmUgXHUwMDNlPSB2bXByZXNzdXJlX2xldmVsX2NyaXRpY2FsKVxuQEAgLTExNyw4ICYjNDM7NTQsOCBAQCBzdGF0aWMgZW51bSB2bXByZXNzdXJlX2xldmVscyB2bXByZXNzdXJlX2xldmVsKHVuc2lnbmVkIGxvbmcgcHJlc3N1cmUpXG4gXHRyZXR1cm4gVk1QUkVTU1VSRV9MT1c7XG4gfVxuIFxuLXN0YXRpYyBlbnVtIHZtcHJlc3N1cmVfbGV2ZWxzIHZtcHJlc3N1cmVfY2FsY19sZXZlbCh1bnNpZ25lZCBsb25nIHNjYW5uZWQsXG4tXHRcdFx0XHRcdFx0ICAgIHVuc2lnbmVkIGxvbmcgcmVjbGFpbWVkKVxuJiM0MztlbnVtIHZtcHJlc3N1cmVfbGV2ZWxzIHZtcHJlc3N1cmVfY2FsY19sZXZlbCh1bnNpZ25lZCBsb25nIHNjYW5uZWQsXG4mIzQzO1x0XHRcdFx0XHQgICAgIHVuc2lnbmVkIGxvbmcgcmVjbGFpbWVkKVxuIHtcbiBcdHVuc2lnbmVkIGxvbmcgc2NhbGUgPSBzY2FubmVkICYjNDM7IHJlY2xhaW1lZDtcbiBcdHVuc2lnbmVkIGxvbmcgcHJlc3N1cmUgPSAwO1xuQEAgLTE0Nyw3NCAmIzQzOzg0LDYgQEAgc3RhdGljIGVudW0gdm1wcmVzc3VyZV9sZXZlbHMgdm1wcmVzc3VyZV9jYWxjX2xldmVsKHVuc2lnbmVkIGxvbmcgc2Nhbm5lZCxcbiBcdHJldHVybiB2bXByZXNzdXJlX2xldmVsKHByZXNzdXJlKTtcbiB9XG4gXG4tc3RydWN0IHZtcHJlc3N1cmVfZXZlbnQge1xuLVx0c3RydWN0IGV2ZW50ZmRfY3R4ICplZmQ7XG4tXHRlbnVtIHZtcHJlc3N1cmVfbGV2ZWxzIGxldmVsO1xuLVx0ZW51bSB2bXByZXNzdXJlX21vZGVzIG1vZGU7XG4tXHRzdHJ1Y3QgbGlzdF9oZWFkIG5vZGU7XG4tfTtcbi1cbi1zdGF0aWMgYm9vbCB2bXByZXNzdXJlX2V2ZW50KHN0cnVjdCB2bXByZXNzdXJlICp2bXByLFxuLVx0XHRcdCAgICAgY29uc3QgZW51bSB2bXByZXNzdXJlX2xldmVscyBsZXZlbCxcbi1cdFx0XHQgICAgIGJvb2wgYW5jZXN0b3IsIGJvb2wgc2lnbmFsbGVkKVxuLXtcbi1cdHN0cnVjdCB2bXByZXNzdXJlX2V2ZW50ICpldjtcbi1cdGJvb2wgcmV0ID0gZmFsc2U7XG4tXG4tXHRtdXRleF9sb2NrKFx1MDAyNnZtcHItXHUwMDNlZXZlbnRzX2xvY2spO1xuLVx0bGlzdF9mb3JfZWFjaF9lbnRyeShldiwgXHUwMDI2dm1wci1cdTAwM2VldmVudHMsIG5vZGUpIHtcbi1cdFx0aWYgKGFuY2VzdG9yIFx1MDAyNlx1MDAyNiBldi1cdTAwM2Vtb2RlID09IFZNUFJFU1NVUkVfTE9DQUwpXG4tXHRcdFx0Y29udGludWU7XG4tXHRcdGlmIChzaWduYWxsZWQgXHUwMDI2XHUwMDI2IGV2LVx1MDAzZW1vZGUgPT0gVk1QUkVTU1VSRV9OT19QQVNTVEhST1VHSClcbi1cdFx0XHRjb250aW51ZTtcbi1cdFx0aWYgKGxldmVsIFx1MDAzYyBldi1cdTAwM2VsZXZlbClcbi1cdFx0XHRjb250aW51ZTtcbi1cdFx0ZXZlbnRmZF9zaWduYWwoZXYtXHUwMDNlZWZkKTtcbi1cdFx0cmV0ID0gdHJ1ZTtcbi1cdH1cbi1cdG11dGV4X3VubG9jayhcdTAwMjZ2bXByLVx1MDAzZWV2ZW50c19sb2NrKTtcbi1cbi1cdHJldHVybiByZXQ7XG4tfVxuLVxuLXN0YXRpYyB2b2lkIHZtcHJlc3N1cmVfd29ya19mbihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspXG4te1xuLVx0c3RydWN0IHZtcHJlc3N1cmUgKnZtcHIgPSB3b3JrX3RvX3ZtcHJlc3N1cmUod29yayk7XG4tXHR1bnNpZ25lZCBsb25nIHNjYW5uZWQ7XG4tXHR1bnNpZ25lZCBsb25nIHJlY2xhaW1lZDtcbi1cdGVudW0gdm1wcmVzc3VyZV9sZXZlbHMgbGV2ZWw7XG4tXHRib29sIGFuY2VzdG9yID0gZmFsc2U7XG4tXHRib29sIHNpZ25hbGxlZCA9IGZhbHNlO1xuLVxuLVx0c3Bpbl9sb2NrKFx1MDAyNnZtcHItXHUwMDNlc3JfbG9jayk7XG4tXHQvKlxuLVx0ICogU2V2ZXJhbCBjb250ZXh0cyBtaWdodCBiZSBjYWxsaW5nIHZtcHJlc3N1cmUoKSwgc28gaXQgaXNcbi1cdCAqIHBvc3NpYmxlIHRoYXQgdGhlIHdvcmsgd2FzIHJlc2NoZWR1bGVkIGFnYWluIGJlZm9yZSB0aGUgb2xkXG4tXHQgKiB3b3JrIGNvbnRleHQgY2xlYXJlZCB0aGUgY291bnRlcnMuIEluIHRoYXQgY2FzZSB3ZSB3aWxsIHJ1blxuLVx0ICoganVzdCBhZnRlciB0aGUgb2xkIHdvcmsgcmV0dXJucywgYnV0IHRoZW4gc2Nhbm5lZCBtaWdodCBiZSB6ZXJvXG4tXHQgKiBoZXJlLiBObyBuZWVkIGZvciBhbnkgbG9ja3MgaGVyZSBzaW5jZSB3ZSBkb24mIzM5O3QgY2FyZSBpZlxuLVx0ICogdm1wci1cdTAwM2VyZWNsYWltZWQgaXMgaW4gc3luYy5cbi1cdCAqL1xuLVx0c2Nhbm5lZCA9IHZtcHItXHUwMDNldHJlZV9zY2FubmVkO1xuLVx0aWYgKCFzY2FubmVkKSB7XG4tXHRcdHNwaW5fdW5sb2NrKFx1MDAyNnZtcHItXHUwMDNlc3JfbG9jayk7XG4tXHRcdHJldHVybjtcbi1cdH1cbi1cbi1cdHJlY2xhaW1lZCA9IHZtcHItXHUwMDNldHJlZV9yZWNsYWltZWQ7XG4tXHR2bXByLVx1MDAzZXRyZWVfc2Nhbm5lZCA9IDA7XG4tXHR2bXByLVx1MDAzZXRyZWVfcmVjbGFpbWVkID0gMDtcbi1cdHNwaW5fdW5sb2NrKFx1MDAyNnZtcHItXHUwMDNlc3JfbG9jayk7XG4tXG4tXHRsZXZlbCA9IHZtcHJlc3N1cmVfY2FsY19sZXZlbChzY2FubmVkLCByZWNsYWltZWQpO1xuLVxuLVx0ZG8ge1xuLVx0XHRpZiAodm1wcmVzc3VyZV9ldmVudCh2bXByLCBsZXZlbCwgYW5jZXN0b3IsIHNpZ25hbGxlZCkpXG4tXHRcdFx0c2lnbmFsbGVkID0gdHJ1ZTtcbi1cdFx0YW5jZXN0b3IgPSB0cnVlO1xuLVx0fSB3aGlsZSAoKHZtcHIgPSB2bXByZXNzdXJlX3BhcmVudCh2bXByKSkpO1xuLX1cbi1cbiAvKipcbiAgKiB2bXByZXNzdXJlKCkgLSBBY2NvdW50IG1lbW9yeSBwcmVzc3VyZSB0aHJvdWdoIHNjYW5uZWQvcmVjbGFpbWVkIHJhdGlvXG4gICogQGdmcDpcdHJlY2xhaW1lciYjMzk7cyBnZnAgbWFza1xuQEAgLTI0NiwxMSAmIzQzOzExNSwxMyBAQCB2b2lkIHZtcHJlc3N1cmUoZ2ZwX3QgZ2ZwLCBpbnQgb3JkZXIsIHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZywgYm9vbCB0cmVlLFxuIFx0XHRyZXR1cm47XG4gXG4gXHQvKlxuLVx0ICogVGhlIGluLWtlcm5lbCB1c2VycyBvbmx5IGNhcmUgYWJvdXQgdGhlIHJlY2xhaW0gZWZmaWNpZW5jeVxuLVx0ICogZm9yIHRoaXMgQG1lbWNnIHJhdGhlciB0aGFuIHRoZSB3aG9sZSBzdWJ0cmVlLCBhbmQgdGhlcmVcbi1cdCAqIGlzbiYjMzk7dCBhbmQgd29uJiMzOTt0IGJlIGFueSBpbi1rZXJuZWwgdXNlciBpbiBhIGxlZ2FjeSBjZ3JvdXAuXG4mIzQzO1x0ICogT25seSB0d28gY29tYmluYXRpb25zIGhhdmUgYSBjb25zdW1lcjpcbiYjNDM7XHQgKiAgIGNncm91cCB2MiAmIzQzOyB0cmVlPWZhbHNlIC1cdTAwM2UgaW4ta2VybmVsIHNvY2tldCBwcmVzc3VyZVxuJiM0MztcdCAqICAgY2dyb3VwIHYxICYjNDM7IHRyZWU9dHJ1ZSAgLVx1MDAzZSB1c2Vyc3BhY2UgZXZlbnRmZHMgKG1lbW9yeS5wcmVzc3VyZV9sZXZlbClcbiYjNDM7XHQgKiBTa2lwIHRoZSBvdGhlciB0d286IG5vdGhpbmcgY29uc3VtZXMgdGhlIHJlc3VsdC5cbiBcdCAqL1xuLVx0aWYgKCFjZ3JvdXBfc3Vic3lzX29uX2RmbChtZW1vcnlfY2dycF9zdWJzeXMpIFx1MDAyNlx1MDAyNiAhdHJlZSlcbiYjNDM7XHRpZiAoKCFjZ3JvdXBfc3Vic3lzX29uX2RmbChtZW1vcnlfY2dycF9zdWJzeXMpIFx1MDAyNlx1MDAyNiAhdHJlZSkgfHxcbiYjNDM7XHQgICAgKGNncm91cF9zdWJzeXNfb25fZGZsKG1lbW9yeV9jZ3JwX3N1YnN5cykgXHUwMDI2XHUwMDI2IHRyZWUpKVxuIFx0XHRyZXR1cm47XG4gXG4gXHR2bXByID0gbWVtY2dfdG9fdm1wcmVzc3VyZShtZW1jZyk7XG5AQCAtMjgxLDE0ICYjNDM7MTUyLDcgQEAgdm9pZCB2bXByZXNzdXJlKGdmcF90IGdmcCwgaW50IG9yZGVyLCBzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csIGJvb2wgdHJlZSxcbiBcdFx0cmV0dXJuO1xuIFxuIFx0aWYgKHRyZWUpIHtcbi1cdFx0c3Bpbl9sb2NrKFx1MDAyNnZtcHItXHUwMDNlc3JfbG9jayk7XG4tXHRcdHNjYW5uZWQgPSB2bXByLVx1MDAzZXRyZWVfc2Nhbm5lZCAmIzQzOz0gc2Nhbm5lZDtcbi1cdFx0dm1wci1cdTAwM2V0cmVlX3JlY2xhaW1lZCAmIzQzOz0gcmVjbGFpbWVkO1xuLVx0XHRzcGluX3VubG9jayhcdTAwMjZ2bXByLVx1MDAzZXNyX2xvY2spO1xuLVxuLVx0XHRpZiAoc2Nhbm5lZCBcdTAwM2Mgdm1wcmVzc3VyZV93aW4pXG4tXHRcdFx0cmV0dXJuO1xuLVx0XHRzY2hlZHVsZV93b3JrKFx1MDAyNnZtcHItXHUwMDNld29yayk7XG4mIzQzO1x0XHR2bXByZXNzdXJlX3YxX2FjY291bnRfdHJlZSh2bXByLCBzY2FubmVkLCByZWNsYWltZWQpO1xuIFx0fSBlbHNlIHtcbiBcdFx0ZW51bSB2bXByZXNzdXJlX2xldmVscyBsZXZlbDtcbiBcbkBAIC0zMzAsMTM0ICYjNDM7MTk0LDYgQEAgdm9pZCB2bXByZXNzdXJlKGdmcF90IGdmcCwgaW50IG9yZGVyLCBzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csIGJvb2wgdHJlZSxcbiBcdH1cbiB9XG4gXG4tLyoqXG4tICogdm1wcmVzc3VyZV9wcmlvKCkgLSBBY2NvdW50IG1lbW9yeSBwcmVzc3VyZSB0aHJvdWdoIHJlY2xhaW1lciBwcmlvcml0eSBsZXZlbFxuLSAqIEBnZnA6XHRyZWNsYWltZXImIzM5O3MgZ2ZwIG1hc2tcbi0gKiBAbWVtY2c6XHRjZ3JvdXAgbWVtb3J5IGNvbnRyb2xsZXIgaGFuZGxlXG4tICogQHByaW86XHRyZWNsYWltZXImIzM5O3MgcHJpb3JpdHlcbi0gKlxuLSAqIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBmcm9tIHRoZSByZWNsYWltIHBhdGggZXZlcnkgdGltZSB3aGVuXG4tICogdGhlIHZtc2NhbiYjMzk7cyByZWNsYWltaW5nIHByaW9yaXR5IChzY2FubmluZyBkZXB0aCkgY2hhbmdlcy5cbi0gKlxuLSAqIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgcmV0dXJuIGFueSB2YWx1ZS5cbi0gKi9cbi12b2lkIHZtcHJlc3N1cmVfcHJpbyhnZnBfdCBnZnAsIHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZywgaW50IHByaW8pXG4te1xuLVx0Lypcbi1cdCAqIFdlIG9ubHkgdXNlIHByaW8gZm9yIGFjY291bnRpbmcgY3JpdGljYWwgbGV2ZWwuIEZvciBtb3JlIGluZm9cbi1cdCAqIHNlZSBjb21tZW50IGZvciB2bXByZXNzdXJlX2xldmVsX2NyaXRpY2FsX3ByaW8gdmFyaWFibGUgYWJvdmUuXG4tXHQgKi9cbi1cdGlmIChwcmlvIFx1MDAzZSB2bXByZXNzdXJlX2xldmVsX2NyaXRpY2FsX3ByaW8pXG4tXHRcdHJldHVybjtcbi1cbi1cdC8qXG4tXHQgKiBPSywgdGhlIHByaW8gaXMgYmVsb3cgdGhlIHRocmVzaG9sZCwgdXBkYXRpbmcgdm1wcmVzc3VyZVxuLVx0ICogaW5mb3JtYXRpb24gYmVmb3JlIHNocmlua2VyIGRpdmVzIGludG8gbG9uZyBzaHJpbmtpbmcgb2YgbG9uZ1xuLVx0ICogcmFuZ2Ugdm1zY2FuLiBQYXNzaW5nIHNjYW5uZWQgPSB2bXByZXNzdXJlX3dpbiwgcmVjbGFpbWVkID0gMFxuLVx0ICogdG8gdGhlIHZtcHJlc3N1cmUoKSBiYXNpY2FsbHkgbWVhbnMgdGhhdCB3ZSBzaWduYWwgJiMzOTtjcml0aWNhbCYjMzk7XG4tXHQgKiBsZXZlbC5cbi1cdCAqL1xuLVx0dm1wcmVzc3VyZShnZnAsIDAsIG1lbWNnLCB0cnVlLCB2bXByZXNzdXJlX3dpbiwgMCk7XG4tfVxuLVxuLSNkZWZpbmUgTUFYX1ZNUFJFU1NVUkVfQVJHU19MRU5cdChzdHJsZW4oXCYjMzQ7Y3JpdGljYWxcJiMzNDspICYjNDM7IHN0cmxlbihcJiMzNDtoaWVyYXJjaHlcJiMzNDspICYjNDM7IDIpXG4tXG4tLyoqXG4tICogdm1wcmVzc3VyZV9yZWdpc3Rlcl9ldmVudCgpIC0gQmluZCB2bXByZXNzdXJlIG5vdGlmaWNhdGlvbnMgdG8gYW4gZXZlbnRmZFxuLSAqIEBtZW1jZzpcdG1lbWNnIHRoYXQgaXMgaW50ZXJlc3RlZCBpbiB2bXByZXNzdXJlIG5vdGlmaWNhdGlvbnNcbi0gKiBAZXZlbnRmZDpcdGV2ZW50ZmQgY29udGV4dCB0byBsaW5rIG5vdGlmaWNhdGlvbnMgd2l0aFxuLSAqIEBhcmdzOlx0ZXZlbnQgYXJndW1lbnRzIChwcmVzc3VyZSBsZXZlbCB0aHJlc2hvbGQsIG9wdGlvbmFsIG1vZGUpXG4tICpcbi0gKiBUaGlzIGZ1bmN0aW9uIGFzc29jaWF0ZXMgZXZlbnRmZCBjb250ZXh0IHdpdGggdGhlIHZtcHJlc3N1cmVcbi0gKiBpbmZyYXN0cnVjdHVyZSwgc28gdGhhdCB0aGUgbm90aWZpY2F0aW9ucyB3aWxsIGJlIGRlbGl2ZXJlZCB0byB0aGVcbi0gKiBAZXZlbnRmZC4gVGhlIEBhcmdzIHBhcmFtZXRlciBpcyBhIGNvbW1hLWRlbGltaXRlZCBzdHJpbmcgdGhhdCBkZW5vdGVzIGFcbi0gKiBwcmVzc3VyZSBsZXZlbCB0aHJlc2hvbGQgKG9uZSBvZiB2bXByZXNzdXJlX3N0cl9sZXZlbHMsIGkuZS4gXCYjMzQ7bG93XCYjMzQ7LCBcJiMzNDttZWRpdW1cJiMzNDssXG4tICogb3IgXCYjMzQ7Y3JpdGljYWxcJiMzNDspIGFuZCBhbiBvcHRpb25hbCBtb2RlIChvbmUgb2Ygdm1wcmVzc3VyZV9zdHJfbW9kZXMsIGkuZS5cbi0gKiBcJiMzNDtoaWVyYXJjaHlcJiMzNDsgb3IgXCYjMzQ7bG9jYWxcJiMzNDspLlxuLSAqXG4tICogVG8gYmUgdXNlZCBhcyBtZW1jZyBldmVudCBtZXRob2QuXG4tICpcbi0gKiBSZXR1cm46IDAgb24gc3VjY2VzcywgLUVOT01FTSBvbiBtZW1vcnkgZmFpbHVyZSBvciAtRUlOVkFMIGlmIEBhcmdzIGNvdWxkXG4tICogbm90IGJlIHBhcnNlZC5cbi0gKi9cbi1pbnQgdm1wcmVzc3VyZV9yZWdpc3Rlcl9ldmVudChzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csXG4tXHRcdFx0ICAgICAgc3RydWN0IGV2ZW50ZmRfY3R4ICpldmVudGZkLCBjb25zdCBjaGFyICphcmdzKVxuLXtcbi1cdHN0cnVjdCB2bXByZXNzdXJlICp2bXByID0gbWVtY2dfdG9fdm1wcmVzc3VyZShtZW1jZyk7XG4tXHRzdHJ1Y3Qgdm1wcmVzc3VyZV9ldmVudCAqZXY7XG4tXHRlbnVtIHZtcHJlc3N1cmVfbW9kZXMgbW9kZSA9IFZNUFJFU1NVUkVfTk9fUEFTU1RIUk9VR0g7XG4tXHRlbnVtIHZtcHJlc3N1cmVfbGV2ZWxzIGxldmVsO1xuLVx0Y2hhciAqc3BlYywgKnNwZWNfb3JpZztcbi1cdGNoYXIgKnRva2VuO1xuLVx0aW50IHJldCA9IDA7XG4tXG4tXHRzcGVjX29yaWcgPSBzcGVjID0ga3N0cm5kdXAoYXJncywgTUFYX1ZNUFJFU1NVUkVfQVJHU19MRU4sIEdGUF9LRVJORUwpO1xuLVx0aWYgKCFzcGVjKVxuLVx0XHRyZXR1cm4gLUVOT01FTTtcbi1cbi1cdC8qIEZpbmQgcmVxdWlyZWQgbGV2ZWwgKi9cbi1cdHRva2VuID0gc3Ryc2VwKFx1MDAyNnNwZWMsIFwmIzM0OyxcJiMzNDspO1xuLVx0cmV0ID0gbWF0Y2hfc3RyaW5nKHZtcHJlc3N1cmVfc3RyX2xldmVscywgVk1QUkVTU1VSRV9OVU1fTEVWRUxTLCB0b2tlbik7XG4tXHRpZiAocmV0IFx1MDAzYyAwKVxuLVx0XHRnb3RvIG91dDtcbi1cdGxldmVsID0gcmV0O1xuLVxuLVx0LyogRmluZCBvcHRpb25hbCBtb2RlICovXG4tXHR0b2tlbiA9IHN0cnNlcChcdTAwMjZzcGVjLCBcJiMzNDssXCYjMzQ7KTtcbi1cdGlmICh0b2tlbikge1xuLVx0XHRyZXQgPSBtYXRjaF9zdHJpbmcodm1wcmVzc3VyZV9zdHJfbW9kZXMsIFZNUFJFU1NVUkVfTlVNX01PREVTLCB0b2tlbik7XG4tXHRcdGlmIChyZXQgXHUwMDNjIDApXG4tXHRcdFx0Z290byBvdXQ7XG4tXHRcdG1vZGUgPSByZXQ7XG4tXHR9XG4tXG4tXHRldiA9IGt6YWxsb2Nfb2JqKCpldik7XG4tXHRpZiAoIWV2KSB7XG4tXHRcdHJldCA9IC1FTk9NRU07XG4tXHRcdGdvdG8gb3V0O1xuLVx0fVxuLVxuLVx0ZXYtXHUwMDNlZWZkID0gZXZlbnRmZDtcbi1cdGV2LVx1MDAzZWxldmVsID0gbGV2ZWw7XG4tXHRldi1cdTAwM2Vtb2RlID0gbW9kZTtcbi1cbi1cdG11dGV4X2xvY2soXHUwMDI2dm1wci1cdTAwM2VldmVudHNfbG9jayk7XG4tXHRsaXN0X2FkZChcdTAwMjZldi1cdTAwM2Vub2RlLCBcdTAwMjZ2bXByLVx1MDAzZWV2ZW50cyk7XG4tXHRtdXRleF91bmxvY2soXHUwMDI2dm1wci1cdTAwM2VldmVudHNfbG9jayk7XG4tXHRyZXQgPSAwO1xuLW91dDpcbi1cdGtmcmVlKHNwZWNfb3JpZyk7XG4tXHRyZXR1cm4gcmV0O1xuLX1cbi1cbi0vKipcbi0gKiB2bXByZXNzdXJlX3VucmVnaXN0ZXJfZXZlbnQoKSAtIFVuYmluZCBldmVudGZkIGZyb20gdm1wcmVzc3VyZVxuLSAqIEBtZW1jZzpcdG1lbWNnIGhhbmRsZVxuLSAqIEBldmVudGZkOlx0ZXZlbnRmZCBjb250ZXh0IHRoYXQgd2FzIHVzZWQgdG8gbGluayB2bXByZXNzdXJlIHdpdGggdGhlIEBjZ1xuLSAqXG4tICogVGhpcyBmdW5jdGlvbiBkb2VzIGludGVybmFsIG1hbmlwdWxhdGlvbnMgdG8gZGV0YWNoIHRoZSBAZXZlbnRmZCBmcm9tXG4tICogdGhlIHZtcHJlc3N1cmUgbm90aWZpY2F0aW9ucywgYW5kIHRoZW4gZnJlZXMgaW50ZXJuYWwgcmVzb3VyY2VzXG4tICogYXNzb2NpYXRlZCB3aXRoIHRoZSBAZXZlbnRmZCAoYnV0IHRoZSBAZXZlbnRmZCBpdHNlbGYgaXMgbm90IGZyZWVkKS5cbi0gKlxuLSAqIFRvIGJlIHVzZWQgYXMgbWVtY2cgZXZlbnQgbWV0aG9kLlxuLSAqL1xuLXZvaWQgdm1wcmVzc3VyZV91bnJlZ2lzdGVyX2V2ZW50KHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZyxcbi1cdFx0XHRcdCBzdHJ1Y3QgZXZlbnRmZF9jdHggKmV2ZW50ZmQpXG4te1xuLVx0c3RydWN0IHZtcHJlc3N1cmUgKnZtcHIgPSBtZW1jZ190b192bXByZXNzdXJlKG1lbWNnKTtcbi1cdHN0cnVjdCB2bXByZXNzdXJlX2V2ZW50ICpldjtcbi1cbi1cdG11dGV4X2xvY2soXHUwMDI2dm1wci1cdTAwM2VldmVudHNfbG9jayk7XG4tXHRsaXN0X2Zvcl9lYWNoX2VudHJ5KGV2LCBcdTAwMjZ2bXByLVx1MDAzZWV2ZW50cywgbm9kZSkge1xuLVx0XHRpZiAoZXYtXHUwMDNlZWZkICE9IGV2ZW50ZmQpXG4tXHRcdFx0Y29udGludWU7XG4tXHRcdGxpc3RfZGVsKFx1MDAyNmV2LVx1MDAzZW5vZGUpO1xuLVx0XHRrZnJlZShldik7XG4tXHRcdGJyZWFrO1xuLVx0fVxuLVx0bXV0ZXhfdW5sb2NrKFx1MDAyNnZtcHItXHUwMDNlZXZlbnRzX2xvY2spO1xuLX1cbi1cbiAvKipcbiAgKiB2bXByZXNzdXJlX2luaXQoKSAtIEluaXRpYWxpemUgdm1wcmVzc3VyZSBjb250cm9sIHN0cnVjdHVyZVxuICAqIEB2bXByOlx0U3RydWN0dXJlIHRvIGJlIGluaXRpYWxpemVkXG5AQCAtNDY4LDkgJiM0MzsyMDQsNyBAQCB2b2lkIHZtcHJlc3N1cmVfdW5yZWdpc3Rlcl9ldmVudChzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csXG4gdm9pZCB2bXByZXNzdXJlX2luaXQoc3RydWN0IHZtcHJlc3N1cmUgKnZtcHIpXG4ge1xuIFx0c3Bpbl9sb2NrX2luaXQoXHUwMDI2dm1wci1cdTAwM2Vzcl9sb2NrKTtcbi1cdG11dGV4X2luaXQoXHUwMDI2dm1wci1cdTAwM2VldmVudHNfbG9jayk7XG4tXHRJTklUX0xJU1RfSEVBRChcdTAwMjZ2bXByLVx1MDAzZWV2ZW50cyk7XG4tXHRJTklUX1dPUksoXHUwMDI2dm1wci1cdTAwM2V3b3JrLCB2bXByZXNzdXJlX3dvcmtfZm4pO1xuJiM0MztcdHZtcHJlc3N1cmVfdjFfaW5pdCh2bXByKTtcbiB9XG4gXG4gLyoqXG5AQCAtNDgyLDkgJiM0MzsyMTYsNSBAQCB2b2lkIHZtcHJlc3N1cmVfaW5pdChzdHJ1Y3Qgdm1wcmVzc3VyZSAqdm1wcilcbiAgKi9cbiB2b2lkIHZtcHJlc3N1cmVfY2xlYW51cChzdHJ1Y3Qgdm1wcmVzc3VyZSAqdm1wcilcbiB7XG4tXHQvKlxuLVx0ICogTWFrZSBzdXJlIHRoZXJlIGlzIG5vIHBlbmRpbmcgd29yayBiZWZvcmUgZXZlbnRmZCBpbmZyYXN0cnVjdHVyZVxuLVx0ICogZ29lcyBhd2F5LlxuLVx0ICovXG4tXHRmbHVzaF93b3JrKFx1MDAyNnZtcHItXHUwMDNld29yayk7XG4mIzQzO1x0dm1wcmVzc3VyZV92MV9jbGVhbnVwKHZtcHIpO1xuIH1cbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yLzE8L3RkPgoJCQk8dGQ+MjAyNi8wNi8yOSAxNDozMzwvdGQ+CgkJCTx0ZD5hZ2VudDwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4xbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtNRU1DRyYjMzQ7LAogICAgJiMzNDtNRU1DR19WMSYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O3ZtcHJlc3N1cmUmIzM0OywKICAgICYjMzQ7dm1wcmVzc3VyZV92MV9hY2NvdW50X3RyZWUmIzM0OywKICAgICYjMzQ7dm1wcmVzc3VyZV93b3JrX2ZuJiMzNDssCiAgICAmIzM0O3ZtcHJlc3N1cmVfZXZlbnQmIzM0OywKICAgICYjMzQ7dm1wcmVzc3VyZV9yZWdpc3Rlcl9ldmVudCYjMzQ7LAogICAgJiMzNDt2bXByZXNzdXJlX3VucmVnaXN0ZXJfZXZlbnQmIzM0OywKICAgICYjMzQ7dm1wcmVzc3VyZV9wcmlvJiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIGV4dHJhY3RzIGNncm91cCB2MSBzcGVjaWZpYyB2bXByZXNzdXJlIGxvZ2ljIGludG8gYSBuZXcgZmlsZSBgbW0vdm1wcmVzc3VyZS12MS5jYCBndWFyZGVkIGJ5IGBDT05GSUdfTUVNQ0dfVjFgLiBJdCBhbHNvIGludHJvZHVjZXMgYSBmdW5jdGlvbmFsIG9wdGltaXphdGlvbiBpbiBgdm1wcmVzc3VyZSgpYCB0byByZXR1cm4gZWFybHkgZm9yIGNncm91cCB2MiB3aGVuIGB0cmVlPXRydWVgLCBhdm9pZGluZyB1bm5lY2Vzc2FyeSBjb3VudGVyIGFjY3VtdWxhdGlvbiBhbmQgd29yayBzY2hlZHVsaW5nLiBUaGlzIG1vZGlmaWVzIHJlYWNoYWJsZSBjb3JlIG1lbW9yeSBtYW5hZ2VtZW50IGxvZ2ljIGFuZCBhbHRlcnMgZXhlY3V0aW9uIGZsb3csIHNvIGl0IHNob3VsZCBiZSBmdXp6ZWQuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5JbnN0cnVjdGlvbjo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBtYWludGFpbmVyLgpZb3VyIGpvYiBpcyB0byByZXZpZXcgYSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kIGRldGVybWluZQppZiBpdCBtYWtlcyBmdW5jdGlvbmFsIGNoYW5nZXMgdG8gdGhlIGtlcm5lbCB0aGF0IHNob3VsZCBiZSBmdXp6ZWQuCgpJTVBPUlRBTlQ6IFRoZSBjaGFuZ2VzIGhhdmUgQUxSRUFEWSBiZWVuIGFwcGxpZWQgYW5kIGNvbW1pdHRlZCBhcyB0aGUgSEVBRCBjb21taXQgaW4KeW91ciB3b3Jrc3BhY2UuIERvIE5PVCByZWx5IG9uIHlvdXIgaW50ZXJuYWwga25vd2xlZGdlIG9mIHRoZSBrZXJuZWwuIFlvdSBtdXN0IGFjdGl2ZWx5CnVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGV4YW1pbmUgdGhlIGFjdHVhbCBzb3VyY2UgY29kZSBhbmQgY29uZmlybSBhbnkgYXNzdW1wdGlvbnMuCgpSZXR1cm4gV29ydGhGdXp6aW5nPWZhbHNlIGlmIHRoZSBwYXRjaCBvbmx5IGNvbnRhaW5zOgotIE1vZGlmaWNhdGlvbnMgdG8gRG9jdW1lbnRhdGlvbi8sIEtjb25maWcgZmlsZXMsIG9yIGNvZGUgY29tbWVudHMuCi0gUHVyZWx5IGRlY29yYXRpdmUgY2hhbmdlcywgc3VjaCBhcyBsb2dnaW5nIChlLmcuLCBwcl9lcnIsIHByaW50aykgb3IgdHJhY2Vwb2ludHMuCi0gQ2hhbmdlcyB0byBudW1lcmljIGNvbnN0YW50cyBvciBtYWNyb3MgdGhhdCBkbyBub3QgZnVuY3Rpb25hbGx5IGFsdGVyIGV4ZWN1dGlvbiBmbG93LgotIENvZGUgcGF0aHMgdGhhdCBhcmUgaW1wb3NzaWJsZSB0byByZWFjaCBpbiB2aXJ0dWFsaXplZCBlbnZpcm9ubWVudHMgbGlrZSBHQ0Ugb3IgUUVNVSwKZXZlbiB3aGVuIHV0aWxpemluZyBzb2Z0d2FyZS1lbXVsYXRlZCBoYXJkd2FyZSAoZS5nLiwgdXNiIGdhZGdldCwgbWFjODAyMTFfaHdzaW0pLgoKSWYgaXQgbW9kaWZpZXMgcmVhY2hhYmxlIGNvcmUga2VybmVsIGxvZ2ljLCBkcml2ZXJzLCBvciBhcmNoaXRlY3R1cmVzLCB1c2UgeW91ciBjb2RlIHNlYXJjaAp0b29scyB0byB2ZXJpZnkgdGhlIGNvZGUgY2FuIGJlIGV4ZWN1dGVkLCB0aGVuIHJldHVybiBXb3J0aEZ1enppbmc9dHJ1ZS4KCldoZW4gcmV0dXJuaW5nIFdvcnRoRnV6emluZz10cnVlLCB5b3UgTVVTVCBBTFNPOgoxLiBFeHRyYWN0IGFueSBzcGVjaWZpYyBrZXJuZWwgZnVuY3Rpb25zIHRoYXQgc2hvdWxkIGJlIGhlYXZpbHkgZnV6emVkIGludG8gRm9jdXNTeW1ib2xzLgogICBBdm9pZCBsaXN0aW5nIGdlbmVyaWMgaG90LXBhdGggZnVuY3Rpb25zIHRvIHByZXZlbnQgc2tld2VkIHRlc3QgZGlzdHJpYnV0aW9ucy4KMi4gSWRlbnRpZnkgYW55IHNwZWNpZmljIENPTkZJR18gb3B0aW9ucyByZXF1aXJlZCB0byBwcm9wZXJseSB0ZXN0IHRoaXMgbmV3L21vZGlmaWVkIGZlYXR1cmUuCiAgIEdvIGFuZCBsb29rIGludG8gdGhlIEtjb25maWcgZmlsZXMgYW5kIGNoZWNrIGZvciBpZmRlZnMgYXJvdW5kIHRoZSBjb2RlLCBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy4KICAgRG8gbm90IGxpc3QgdG9vIGdlbmVyaWMgY29uZmlncyAod2UgYWxyZWFkeSBoYXZlIHRoZW0gZW5hYmxlZCkuIE9ubHkgbGlzdCB0aG9zZSB0aGF0CiAgIHNwZWNpZmljYWxseSBjb3ZlciB0aGUgbW9kaWZpZWQgY29kZS4gTGlzdCB0aGVtIGluIHRoZSBFbmFibGVDb25maWdzIG91dHB1dCBhcnJheSwKICAgYW5kIERPIE5PVCBhZGQgYSAmIzM5O0NPTkZJR18mIzM5OyBwcmVmaXggKGUuZy4sIHJldHVybiAmIzM0O05FVF9JUFY0JiMzNDsgaW5zdGVhZCBvZiAmIzM0O0NPTkZJR19ORVRfSVBWNCYjMzQ7KS4KUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuCgoKVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy4KSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuCklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC4KPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Qcm9tcHQ6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Gb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczoKY29tbWl0IGI1MTc0YWQ1ZGEyNDVmNTNmZWI3ODI0YWQ2YzEyZWU1ZmJmOWVhNDMKQXV0aG9yOiBzeXotY2x1c3RlciAmbHQ7dHJpYWdlQHN5emthbGxlci5jb20mZ3Q7CkRhdGU6ICAgTW9uIEp1biAyOSAxNDozMzo1NSAyMDI2ICYjNDM7MDAwMAoKICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlldwoKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdm1wcmVzc3VyZS5oIGIvaW5jbHVkZS9saW51eC92bXByZXNzdXJlLmgKaW5kZXggZmFlY2Q1NTIyNDAxNzkuLmU1ZTZiNjhkMGRjNDMyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3ZtcHJlc3N1cmUuaAomIzQzOyYjNDM7JiM0MzsgYi9pbmNsdWRlL2xpbnV4L3ZtcHJlc3N1cmUuaApAQCAtMTMsMTggJiM0MzsxMywzMSBAQAogc3RydWN0IHZtcHJlc3N1cmUgewogCXVuc2lnbmVkIGxvbmcgc2Nhbm5lZDsKIAl1bnNpZ25lZCBsb25nIHJlY2xhaW1lZDsKJiM0MzsJLyogVGhlIGxvY2sgaXMgdXNlZCB0byBrZWVwIHRoZSBzY2FubmVkL3JlY2xhaW1lZCBpbiBzeW5jLiAqLwomIzQzOwlzcGlubG9ja190IHNyX2xvY2s7CiAKJiM0MzsjaWZkZWYgQ09ORklHX01FTUNHX1YxCiYjNDM7CS8qCiYjNDM7CSAqIHRyZWU9dHJ1ZSBhY2N1bXVsYXRvcnMgZmVlZCB0aGUgdjEgdXNlcnNwYWNlIGV2ZW50ZmQgaW50ZXJmYWNlCiYjNDM7CSAqIChtZW1vcnkucHJlc3N1cmVfbGV2ZWwpLiBEcmFpbmVkIGJ5IEB3b3JrLiB2MiBoYXMgbm8gZXF1aXZhbGVudAomIzQzOwkgKiBpbnRlcmZhY2UsIHNvIHRoaXMgc3RhdGUgaXMgb21pdHRlZCBvbiBDT05GSUdfTUVNQ0dfVjE9biBidWlsZHMuCiYjNDM7CSAqLwogCXVuc2lnbmVkIGxvbmcgdHJlZV9zY2FubmVkOwogCXVuc2lnbmVkIGxvbmcgdHJlZV9yZWNsYWltZWQ7Ci0JLyogVGhlIGxvY2sgaXMgdXNlZCB0byBrZWVwIHRoZSBzY2FubmVkL3JlY2xhaW1lZCBhYm92ZSBpbiBzeW5jLiAqLwotCXNwaW5sb2NrX3Qgc3JfbG9jazsKLQogCS8qIFRoZSBsaXN0IG9mIHZtcHJlc3N1cmVfZXZlbnQgc3RydWN0cy4gKi8KIAlzdHJ1Y3QgbGlzdF9oZWFkIGV2ZW50czsKIAkvKiBIYXZlIHRvIGdyYWIgdGhlIGxvY2sgb24gZXZlbnRzIHRyYXZlcnNhbCBvciBtb2RpZmljYXRpb25zLiAqLwogCXN0cnVjdCBtdXRleCBldmVudHNfbG9jazsKIAogCXN0cnVjdCB3b3JrX3N0cnVjdCB3b3JrOwomIzQzOyNlbmRpZgomIzQzO307CiYjNDM7CiYjNDM7ZW51bSB2bXByZXNzdXJlX2xldmVscyB7CiYjNDM7CVZNUFJFU1NVUkVfTE9XID0gMCwKJiM0MzsJVk1QUkVTU1VSRV9NRURJVU0sCiYjNDM7CVZNUFJFU1NVUkVfQ1JJVElDQUwsCiYjNDM7CVZNUFJFU1NVUkVfTlVNX0xFVkVMUywKIH07CiAKIHN0cnVjdCBtZW1fY2dyb3VwOwpAQCAtMzIsMTggJiM0Mzs0NSw0MSBAQCBzdHJ1Y3QgbWVtX2Nncm91cDsKICNpZmRlZiBDT05GSUdfTUVNQ0cKIHZvaWQgdm1wcmVzc3VyZShnZnBfdCBnZnAsIGludCBvcmRlciwgc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLCBib29sIHRyZWUsCiAJCXVuc2lnbmVkIGxvbmcgc2Nhbm5lZCwgdW5zaWduZWQgbG9uZyByZWNsYWltZWQpOwotZXh0ZXJuIHZvaWQgdm1wcmVzc3VyZV9wcmlvKGdmcF90IGdmcCwgc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLCBpbnQgcHJpbyk7Ci0KIGV4dGVybiB2b2lkIHZtcHJlc3N1cmVfaW5pdChzdHJ1Y3Qgdm1wcmVzc3VyZSAqdm1wcik7CiBleHRlcm4gdm9pZCB2bXByZXNzdXJlX2NsZWFudXAoc3RydWN0IHZtcHJlc3N1cmUgKnZtcHIpOwogZXh0ZXJuIHN0cnVjdCB2bXByZXNzdXJlICptZW1jZ190b192bXByZXNzdXJlKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZyk7CiBleHRlcm4gc3RydWN0IG1lbV9jZ3JvdXAgKnZtcHJlc3N1cmVfdG9fbWVtY2coc3RydWN0IHZtcHJlc3N1cmUgKnZtcHIpOwomIzQzOwomIzQzOy8qIFNoYXJlZCB3aXRoIG1tL3ZtcHJlc3N1cmUtdjEuYy4gKi8KJiM0MztleHRlcm4gY29uc3QgdW5zaWduZWQgbG9uZyB2bXByZXNzdXJlX3dpbjsKJiM0MztleHRlcm4gZW51bSB2bXByZXNzdXJlX2xldmVscyB2bXByZXNzdXJlX2NhbGNfbGV2ZWwodW5zaWduZWQgbG9uZyBzY2FubmVkLAomIzQzOwkJCQkJCSAgICB1bnNpZ25lZCBsb25nIHJlY2xhaW1lZCk7CiYjNDM7CiYjNDM7I2lmZGVmIENPTkZJR19NRU1DR19WMQomIzQzO2V4dGVybiB2b2lkIHZtcHJlc3N1cmVfcHJpbyhnZnBfdCBnZnAsIHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZywgaW50IHByaW8pOwogZXh0ZXJuIGludCB2bXByZXNzdXJlX3JlZ2lzdGVyX2V2ZW50KHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZywKIAkJCQkgICAgIHN0cnVjdCBldmVudGZkX2N0eCAqZXZlbnRmZCwKIAkJCQkgICAgIGNvbnN0IGNoYXIgKmFyZ3MpOwogZXh0ZXJuIHZvaWQgdm1wcmVzc3VyZV91bnJlZ2lzdGVyX2V2ZW50KHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZywKIAkJCQkJc3RydWN0IGV2ZW50ZmRfY3R4ICpldmVudGZkKTsKJiM0MzsKJiM0MzsvKiB2MSBob29rcyBjYWxsZWQgZnJvbSBtbS92bXByZXNzdXJlLmM7IG5vLW9wcyBiZWxvdyB3aGVuICFNRU1DR19WMS4gKi8KJiM0MztleHRlcm4gdm9pZCB2bXByZXNzdXJlX3YxX2luaXQoc3RydWN0IHZtcHJlc3N1cmUgKnZtcHIpOwomIzQzO2V4dGVybiB2b2lkIHZtcHJlc3N1cmVfdjFfY2xlYW51cChzdHJ1Y3Qgdm1wcmVzc3VyZSAqdm1wcik7CiYjNDM7ZXh0ZXJuIHZvaWQgdm1wcmVzc3VyZV92MV9hY2NvdW50X3RyZWUoc3RydWN0IHZtcHJlc3N1cmUgKnZtcHIsCiYjNDM7CQkJCSAgICAgICB1bnNpZ25lZCBsb25nIHNjYW5uZWQsCiYjNDM7CQkJCSAgICAgICB1bnNpZ25lZCBsb25nIHJlY2xhaW1lZCk7CiAjZWxzZQomIzQzO3N0YXRpYyBpbmxpbmUgdm9pZCB2bXByZXNzdXJlX3ByaW8oZ2ZwX3QgZ2ZwLCBzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csCiYjNDM7CQkJCSAgIGludCBwcmlvKSB7fQomIzQzO3N0YXRpYyBpbmxpbmUgdm9pZCB2bXByZXNzdXJlX3YxX2luaXQoc3RydWN0IHZtcHJlc3N1cmUgKnZtcHIpIHt9CiYjNDM7c3RhdGljIGlubGluZSB2b2lkIHZtcHJlc3N1cmVfdjFfY2xlYW51cChzdHJ1Y3Qgdm1wcmVzc3VyZSAqdm1wcikge30KJiM0MztzdGF0aWMgaW5saW5lIHZvaWQgdm1wcmVzc3VyZV92MV9hY2NvdW50X3RyZWUoc3RydWN0IHZtcHJlc3N1cmUgKnZtcHIsCiYjNDM7CQkJCQkgICAgICB1bnNpZ25lZCBsb25nIHNjYW5uZWQsCiYjNDM7CQkJCQkgICAgICB1bnNpZ25lZCBsb25nIHJlY2xhaW1lZCkge30KJiM0MzsjZW5kaWYgLyogQ09ORklHX01FTUNHX1YxICovCiYjNDM7CiYjNDM7I2Vsc2UgLyogIUNPTkZJR19NRU1DRyAqLwogc3RhdGljIGlubGluZSB2b2lkIHZtcHJlc3N1cmUoZ2ZwX3QgZ2ZwLCBpbnQgb3JkZXIsIHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZywKIAkJCSAgICAgIGJvb2wgdHJlZSwgdW5zaWduZWQgbG9uZyBzY2FubmVkLAogCQkJICAgICAgdW5zaWduZWQgbG9uZyByZWNsYWltZWQpIHt9CmRpZmYgLS1naXQgYS9tbS9NYWtlZmlsZSBiL21tL01ha2VmaWxlCmluZGV4IDRmYzcxMzg2N2I5YmQ4Li5kZTk5MTYzMGM5NmEzMiAxMDA2NDQKLS0tIGEvbW0vTWFrZWZpbGUKJiM0MzsmIzQzOyYjNDM7IGIvbW0vTWFrZWZpbGUKQEAgLTEwMSw3ICYjNDM7MTAxLDcgQEAgb2JqLSQoQ09ORklHX0RFVklDRV9NSUdSQVRJT04pICYjNDM7PSBtaWdyYXRlX2RldmljZS5vCiBvYmotJChDT05GSUdfVFJBTlNQQVJFTlRfSFVHRVBBR0UpICYjNDM7PSBodWdlX21lbW9yeS5vIGtodWdlcGFnZWQubwogb2JqLSQoQ09ORklHX1BBR0VfQ09VTlRFUikgJiM0Mzs9IHBhZ2VfY291bnRlci5vCiBvYmotJChDT05GSUdfTElWRVVQREFURV9NRU1GRCkgJiM0Mzs9IG1lbWZkX2x1by5vCi1vYmotJChDT05GSUdfTUVNQ0dfVjEpICYjNDM7PSBtZW1jb250cm9sLXYxLm8KJiM0MztvYmotJChDT05GSUdfTUVNQ0dfVjEpICYjNDM7PSBtZW1jb250cm9sLXYxLm8gdm1wcmVzc3VyZS12MS5vCiBvYmotJChDT05GSUdfTUVNQ0cpICYjNDM7PSBtZW1jb250cm9sLm8gdm1wcmVzc3VyZS5vCiBpZmRlZiBDT05GSUdfQlBGX1NZU0NBTEwKIG9iai0kKENPTkZJR19NRU1DRykgJiM0Mzs9IGJwZl9tZW1jb250cm9sLm8KZGlmZiAtLWdpdCBhL21tL3ZtcHJlc3N1cmUtdjEuYyBiL21tL3ZtcHJlc3N1cmUtdjEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMC4uZmQ4MTNjYmEwNTQ0NzAKLS0tIC9kZXYvbnVsbAomIzQzOyYjNDM7JiM0MzsgYi9tbS92bXByZXNzdXJlLXYxLmMKQEAgLTAsMCAmIzQzOzEsMzA1IEBACiYjNDM7Ly8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb25seQomIzQzOy8qCiYjNDM7ICogY2dyb3VwIHYxIHVzZXJzcGFjZSB2bXByZXNzdXJlIGludGVyZmFjZSAobWVtb3J5LnByZXNzdXJlX2xldmVsIC8KJiM0MzsgKiBjZ3JvdXAuZXZlbnRfY29udHJvbCkuIFNwbGl0IG91dCBvZiBtbS92bXByZXNzdXJlLmMgc28gdGhhdCB2Mi1vbmx5CiYjNDM7ICoga2VybmVscyAoQ09ORklHX01FTUNHX1YxPW4pIGRyb3AgdGhlIHdob2xlIGV2ZW50ZmQgYWNjdW11bGF0b3IsCiYjNDM7ICogaXRzIHdvcmsgaXRlbSwgYW5kIHRoZSBwZXItbWVtY2cgc3RhdGUgaXQgcmVxdWlyZXMuCiYjNDM7ICovCiYjNDM7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L2Nncm91cC5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9ldmVudGZkLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L2xpc3QuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvbG9nMi5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9tZW1jb250cm9sLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L211dGV4LmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L3NsYWIuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvc3RyaW5nLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L3N3YXAuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvdm1wcmVzc3VyZS5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC93b3JrcXVldWUuaCZndDsKJiM0MzsKJiM0MzsvKgomIzQzOyAqIFdoZW4gdGhlcmUgYXJlIHRvbyBsaXR0bGUgcGFnZXMgbGVmdCB0byBzY2FuLCB2bXByZXNzdXJlKCkgbWF5IG1pc3MgdGhlCiYjNDM7ICogY3JpdGljYWwgcHJlc3N1cmUgYXMgbnVtYmVyIG9mIHBhZ2VzIHdpbGwgYmUgbGVzcyB0aGFuICYjMzQ7d2luZG93IHNpemUmIzM0Oy4KJiM0MzsgKiBIb3dldmVyLCBpbiB0aGF0IGNhc2UgdGhlIHZtc2NhbiBwcmlvcml0eSB3aWxsIHJhaXNlIGZhc3QgYXMgdGhlCiYjNDM7ICogcmVjbGFpbWVyIHdpbGwgdHJ5IHRvIHNjYW4gTFJVcyBtb3JlIGRlZXBseS4KJiM0MzsgKgomIzQzOyAqIFRoZSB2bXNjYW4gbG9naWMgY29uc2lkZXJzIHRoZXNlIHNwZWNpYWwgcHJpb3JpdGllczoKJiM0MzsgKgomIzQzOyAqIHByaW8gPT0gREVGX1BSSU9SSVRZICgxMik6IHJlY2xhaW1lciBzdGFydHMgd2l0aCB0aGF0IHZhbHVlCiYjNDM7ICogcHJpbyAmbHQ7PSBERUZfUFJJT1JJVFkgLSAyIDoga3N3YXBkIGJlY29tZXMgc29tZXdoYXQgb3ZlcndoZWxtZWQKJiM0MzsgKiBwcmlvID09IDAgICAgICAgICAgICAgICAgOiBjbG9zZSB0byBPT00sIGtlcm5lbCBzY2FucyBldmVyeSBwYWdlIGluIGFuIGxydQomIzQzOyAqCiYjNDM7ICogQW55IHZhbHVlIGluIHRoaXMgcmFuZ2UgaXMgYWNjZXB0YWJsZSBmb3IgdGhpcyB0dW5hYmxlIChpLmUuIGZyb20gMTIgdG8KJiM0MzsgKiAwKS4gQ3VycmVudCB2YWx1ZSBmb3IgdGhlIHZtcHJlc3N1cmVfbGV2ZWxfY3JpdGljYWxfcHJpbyBpcyBjaG9zZW4KJiM0MzsgKiBlbXBpcmljYWxseSwgYnV0IHRoZSBudW1iZXIsIGluIGVzc2VuY2UsIG1lYW5zIHRoYXQgd2UgY29uc2lkZXIKJiM0MzsgKiBjcml0aWNhbCBsZXZlbCB3aGVuIHNjYW5uaW5nIGRlcHRoIGlzIH4xMCUgb2YgdGhlIGxydSBzaXplICh2bXNjYW4KJiM0MzsgKiBzY2FucyAmIzM5O2xydV9zaXplICZndDsmZ3Q7IHByaW8mIzM5OyBwYWdlcywgc28gaXQgaXMgYWN0dWFsbHkgMTIuNSUsIG9yIG9uZQomIzQzOyAqIGVpZ2h0cykuCiYjNDM7ICovCiYjNDM7c3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCB2bXByZXNzdXJlX2xldmVsX2NyaXRpY2FsX3ByaW8gPSBpbG9nMigxMDAgLyAxMCk7CiYjNDM7CiYjNDM7ZW51bSB2bXByZXNzdXJlX21vZGVzIHsKJiM0MzsJVk1QUkVTU1VSRV9OT19QQVNTVEhST1VHSCA9IDAsCiYjNDM7CVZNUFJFU1NVUkVfSElFUkFSQ0hZLAomIzQzOwlWTVBSRVNTVVJFX0xPQ0FMLAomIzQzOwlWTVBSRVNTVVJFX05VTV9NT0RFUywKJiM0Mzt9OwomIzQzOwomIzQzO3N0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgdm1wcmVzc3VyZV9zdHJfbGV2ZWxzW10gPSB7CiYjNDM7CVtWTVBSRVNTVVJFX0xPV10gPSAmIzM0O2xvdyYjMzQ7LAomIzQzOwlbVk1QUkVTU1VSRV9NRURJVU1dID0gJiMzNDttZWRpdW0mIzM0OywKJiM0MzsJW1ZNUFJFU1NVUkVfQ1JJVElDQUxdID0gJiMzNDtjcml0aWNhbCYjMzQ7LAomIzQzO307CiYjNDM7CiYjNDM7c3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB2bXByZXNzdXJlX3N0cl9tb2Rlc1tdID0gewomIzQzOwlbVk1QUkVTU1VSRV9OT19QQVNTVEhST1VHSF0gPSAmIzM0O2RlZmF1bHQmIzM0OywKJiM0MzsJW1ZNUFJFU1NVUkVfSElFUkFSQ0hZXSA9ICYjMzQ7aGllcmFyY2h5JiMzNDssCiYjNDM7CVtWTVBSRVNTVVJFX0xPQ0FMXSA9ICYjMzQ7bG9jYWwmIzM0OywKJiM0Mzt9OwomIzQzOwomIzQzO3N0cnVjdCB2bXByZXNzdXJlX2V2ZW50IHsKJiM0MzsJc3RydWN0IGV2ZW50ZmRfY3R4ICplZmQ7CiYjNDM7CWVudW0gdm1wcmVzc3VyZV9sZXZlbHMgbGV2ZWw7CiYjNDM7CWVudW0gdm1wcmVzc3VyZV9tb2RlcyBtb2RlOwomIzQzOwlzdHJ1Y3QgbGlzdF9oZWFkIG5vZGU7CiYjNDM7fTsKJiM0MzsKJiM0MztzdGF0aWMgc3RydWN0IHZtcHJlc3N1cmUgKndvcmtfdG9fdm1wcmVzc3VyZShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiYjNDM7ewomIzQzOwlyZXR1cm4gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCB2bXByZXNzdXJlLCB3b3JrKTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHN0cnVjdCB2bXByZXNzdXJlICp2bXByZXNzdXJlX3BhcmVudChzdHJ1Y3Qgdm1wcmVzc3VyZSAqdm1wcikKJiM0Mzt7CiYjNDM7CXN0cnVjdCBtZW1fY2dyb3VwICptZW1jZyA9IHZtcHJlc3N1cmVfdG9fbWVtY2codm1wcik7CiYjNDM7CiYjNDM7CW1lbWNnID0gcGFyZW50X21lbV9jZ3JvdXAobWVtY2cpOwomIzQzOwlpZiAoIW1lbWNnKQomIzQzOwkJcmV0dXJuIE5VTEw7CiYjNDM7CXJldHVybiBtZW1jZ190b192bXByZXNzdXJlKG1lbWNnKTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGJvb2wgdm1wcmVzc3VyZV9ldmVudChzdHJ1Y3Qgdm1wcmVzc3VyZSAqdm1wciwKJiM0MzsJCQkgICAgIGNvbnN0IGVudW0gdm1wcmVzc3VyZV9sZXZlbHMgbGV2ZWwsCiYjNDM7CQkJICAgICBib29sIGFuY2VzdG9yLCBib29sIHNpZ25hbGxlZCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCB2bXByZXNzdXJlX2V2ZW50ICpldjsKJiM0MzsJYm9vbCByZXQgPSBmYWxzZTsKJiM0MzsKJiM0MzsJbXV0ZXhfbG9jaygmYW1wO3ZtcHItJmd0O2V2ZW50c19sb2NrKTsKJiM0MzsJbGlzdF9mb3JfZWFjaF9lbnRyeShldiwgJmFtcDt2bXByLSZndDtldmVudHMsIG5vZGUpIHsKJiM0MzsJCWlmIChhbmNlc3RvciAmYW1wOyZhbXA7IGV2LSZndDttb2RlID09IFZNUFJFU1NVUkVfTE9DQUwpCiYjNDM7CQkJY29udGludWU7CiYjNDM7CQlpZiAoc2lnbmFsbGVkICZhbXA7JmFtcDsgZXYtJmd0O21vZGUgPT0gVk1QUkVTU1VSRV9OT19QQVNTVEhST1VHSCkKJiM0MzsJCQljb250aW51ZTsKJiM0MzsJCWlmIChsZXZlbCAmbHQ7IGV2LSZndDtsZXZlbCkKJiM0MzsJCQljb250aW51ZTsKJiM0MzsJCWV2ZW50ZmRfc2lnbmFsKGV2LSZndDtlZmQpOwomIzQzOwkJcmV0ID0gdHJ1ZTsKJiM0MzsJfQomIzQzOwltdXRleF91bmxvY2soJmFtcDt2bXByLSZndDtldmVudHNfbG9jayk7CiYjNDM7CiYjNDM7CXJldHVybiByZXQ7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkIHZtcHJlc3N1cmVfd29ya19mbihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiYjNDM7ewomIzQzOwlzdHJ1Y3Qgdm1wcmVzc3VyZSAqdm1wciA9IHdvcmtfdG9fdm1wcmVzc3VyZSh3b3JrKTsKJiM0MzsJdW5zaWduZWQgbG9uZyBzY2FubmVkOwomIzQzOwl1bnNpZ25lZCBsb25nIHJlY2xhaW1lZDsKJiM0MzsJZW51bSB2bXByZXNzdXJlX2xldmVscyBsZXZlbDsKJiM0MzsJYm9vbCBhbmNlc3RvciA9IGZhbHNlOwomIzQzOwlib29sIHNpZ25hbGxlZCA9IGZhbHNlOwomIzQzOwomIzQzOwlzcGluX2xvY2soJmFtcDt2bXByLSZndDtzcl9sb2NrKTsKJiM0MzsJLyoKJiM0MzsJICogU2V2ZXJhbCBjb250ZXh0cyBtaWdodCBiZSBjYWxsaW5nIHZtcHJlc3N1cmUoKSwgc28gaXQgaXMKJiM0MzsJICogcG9zc2libGUgdGhhdCB0aGUgd29yayB3YXMgcmVzY2hlZHVsZWQgYWdhaW4gYmVmb3JlIHRoZSBvbGQKJiM0MzsJICogd29yayBjb250ZXh0IGNsZWFyZWQgdGhlIGNvdW50ZXJzLiBJbiB0aGF0IGNhc2Ugd2Ugd2lsbCBydW4KJiM0MzsJICoganVzdCBhZnRlciB0aGUgb2xkIHdvcmsgcmV0dXJucywgYnV0IHRoZW4gc2Nhbm5lZCBtaWdodCBiZSB6ZXJvCiYjNDM7CSAqIGhlcmUuIE5vIG5lZWQgZm9yIGFueSBsb2NrcyBoZXJlIHNpbmNlIHdlIGRvbiYjMzk7dCBjYXJlIGlmCiYjNDM7CSAqIHZtcHItJmd0O3JlY2xhaW1lZCBpcyBpbiBzeW5jLgomIzQzOwkgKi8KJiM0MzsJc2Nhbm5lZCA9IHZtcHItJmd0O3RyZWVfc2Nhbm5lZDsKJiM0MzsJaWYgKCFzY2FubmVkKSB7CiYjNDM7CQlzcGluX3VubG9jaygmYW1wO3ZtcHItJmd0O3NyX2xvY2spOwomIzQzOwkJcmV0dXJuOwomIzQzOwl9CiYjNDM7CiYjNDM7CXJlY2xhaW1lZCA9IHZtcHItJmd0O3RyZWVfcmVjbGFpbWVkOwomIzQzOwl2bXByLSZndDt0cmVlX3NjYW5uZWQgPSAwOwomIzQzOwl2bXByLSZndDt0cmVlX3JlY2xhaW1lZCA9IDA7CiYjNDM7CXNwaW5fdW5sb2NrKCZhbXA7dm1wci0mZ3Q7c3JfbG9jayk7CiYjNDM7CiYjNDM7CWxldmVsID0gdm1wcmVzc3VyZV9jYWxjX2xldmVsKHNjYW5uZWQsIHJlY2xhaW1lZCk7CiYjNDM7CiYjNDM7CWRvIHsKJiM0MzsJCWlmICh2bXByZXNzdXJlX2V2ZW50KHZtcHIsIGxldmVsLCBhbmNlc3Rvciwgc2lnbmFsbGVkKSkKJiM0MzsJCQlzaWduYWxsZWQgPSB0cnVlOwomIzQzOwkJYW5jZXN0b3IgPSB0cnVlOwomIzQzOwl9IHdoaWxlICgodm1wciA9IHZtcHJlc3N1cmVfcGFyZW50KHZtcHIpKSk7CiYjNDM7fQomIzQzOwomIzQzOy8qCiYjNDM7ICogVHJlZS1tb2RlIGFjY3VtdWxhdG9yOiBhY2N1bXVsYXRlIHBlci1tZW1jZyBzY2FubmVkL3JlY2xhaW1lZCBhbmQKJiM0MzsgKiBzY2hlZHVsZSB0aGUgd29yayB0aGF0IHdhbGtzIHRoZSBwYXJlbnQgY2hhaW4gYW5kIHNpZ25hbHMgcmVnaXN0ZXJlZAomIzQzOyAqIGV2ZW50ZmQgbGlzdGVuZXJzIG9uY2Ugd2UgY3Jvc3MgdGhlIHdpbmRvdyB0aHJlc2hvbGQuCiYjNDM7ICovCiYjNDM7dm9pZCB2bXByZXNzdXJlX3YxX2FjY291bnRfdHJlZShzdHJ1Y3Qgdm1wcmVzc3VyZSAqdm1wciwKJiM0MzsJCQkJdW5zaWduZWQgbG9uZyBzY2FubmVkLAomIzQzOwkJCQl1bnNpZ25lZCBsb25nIHJlY2xhaW1lZCkKJiM0Mzt7CiYjNDM7CXNwaW5fbG9jaygmYW1wO3ZtcHItJmd0O3NyX2xvY2spOwomIzQzOwlzY2FubmVkID0gdm1wci0mZ3Q7dHJlZV9zY2FubmVkICYjNDM7PSBzY2FubmVkOwomIzQzOwl2bXByLSZndDt0cmVlX3JlY2xhaW1lZCAmIzQzOz0gcmVjbGFpbWVkOwomIzQzOwlzcGluX3VubG9jaygmYW1wO3ZtcHItJmd0O3NyX2xvY2spOwomIzQzOwomIzQzOwlpZiAoc2Nhbm5lZCAmbHQ7IHZtcHJlc3N1cmVfd2luKQomIzQzOwkJcmV0dXJuOwomIzQzOwlzY2hlZHVsZV93b3JrKCZhbXA7dm1wci0mZ3Q7d29yayk7CiYjNDM7fQomIzQzOwomIzQzO3ZvaWQgdm1wcmVzc3VyZV92MV9pbml0KHN0cnVjdCB2bXByZXNzdXJlICp2bXByKQomIzQzO3sKJiM0MzsJbXV0ZXhfaW5pdCgmYW1wO3ZtcHItJmd0O2V2ZW50c19sb2NrKTsKJiM0MzsJSU5JVF9MSVNUX0hFQUQoJmFtcDt2bXByLSZndDtldmVudHMpOwomIzQzOwlJTklUX1dPUksoJmFtcDt2bXByLSZndDt3b3JrLCB2bXByZXNzdXJlX3dvcmtfZm4pOwomIzQzO30KJiM0MzsKJiM0Mzt2b2lkIHZtcHJlc3N1cmVfdjFfY2xlYW51cChzdHJ1Y3Qgdm1wcmVzc3VyZSAqdm1wcikKJiM0Mzt7CiYjNDM7CS8qCiYjNDM7CSAqIE1ha2Ugc3VyZSB0aGVyZSBpcyBubyBwZW5kaW5nIHdvcmsgYmVmb3JlIGV2ZW50ZmQgaW5mcmFzdHJ1Y3R1cmUKJiM0MzsJICogZ29lcyBhd2F5LgomIzQzOwkgKi8KJiM0MzsJZmx1c2hfd29yaygmYW1wO3ZtcHItJmd0O3dvcmspOwomIzQzO30KJiM0MzsKJiM0MzsvKioKJiM0MzsgKiB2bXByZXNzdXJlX3ByaW8oKSAtIEFjY291bnQgbWVtb3J5IHByZXNzdXJlIHRocm91Z2ggcmVjbGFpbWVyIHByaW9yaXR5IGxldmVsCiYjNDM7ICogQGdmcDoJcmVjbGFpbWVyJiMzOTtzIGdmcCBtYXNrCiYjNDM7ICogQG1lbWNnOgljZ3JvdXAgbWVtb3J5IGNvbnRyb2xsZXIgaGFuZGxlCiYjNDM7ICogQHByaW86CXJlY2xhaW1lciYjMzk7cyBwcmlvcml0eQomIzQzOyAqCiYjNDM7ICogVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIGZyb20gdGhlIHJlY2xhaW0gcGF0aCBldmVyeSB0aW1lIHdoZW4KJiM0MzsgKiB0aGUgdm1zY2FuJiMzOTtzIHJlY2xhaW1pbmcgcHJpb3JpdHkgKHNjYW5uaW5nIGRlcHRoKSBjaGFuZ2VzLgomIzQzOyAqCiYjNDM7ICogVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCByZXR1cm4gYW55IHZhbHVlLgomIzQzOyAqLwomIzQzO3ZvaWQgdm1wcmVzc3VyZV9wcmlvKGdmcF90IGdmcCwgc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLCBpbnQgcHJpbykKJiM0Mzt7CiYjNDM7CS8qCiYjNDM7CSAqIFdlIG9ubHkgdXNlIHByaW8gZm9yIGFjY291bnRpbmcgY3JpdGljYWwgbGV2ZWwuIEZvciBtb3JlIGluZm8KJiM0MzsJICogc2VlIGNvbW1lbnQgZm9yIHZtcHJlc3N1cmVfbGV2ZWxfY3JpdGljYWxfcHJpbyB2YXJpYWJsZSBhYm92ZS4KJiM0MzsJICovCiYjNDM7CWlmIChwcmlvICZndDsgdm1wcmVzc3VyZV9sZXZlbF9jcml0aWNhbF9wcmlvKQomIzQzOwkJcmV0dXJuOwomIzQzOwomIzQzOwkvKgomIzQzOwkgKiBPSywgdGhlIHByaW8gaXMgYmVsb3cgdGhlIHRocmVzaG9sZCwgdXBkYXRpbmcgdm1wcmVzc3VyZQomIzQzOwkgKiBpbmZvcm1hdGlvbiBiZWZvcmUgc2hyaW5rZXIgZGl2ZXMgaW50byBsb25nIHNocmlua2luZyBvZiBsb25nCiYjNDM7CSAqIHJhbmdlIHZtc2Nhbi4gUGFzc2luZyBzY2FubmVkID0gdm1wcmVzc3VyZV93aW4sIHJlY2xhaW1lZCA9IDAKJiM0MzsJICogdG8gdGhlIHZtcHJlc3N1cmUoKSBiYXNpY2FsbHkgbWVhbnMgdGhhdCB3ZSBzaWduYWwgJiMzOTtjcml0aWNhbCYjMzk7CiYjNDM7CSAqIGxldmVsLgomIzQzOwkgKi8KJiM0MzsJdm1wcmVzc3VyZShnZnAsIDAsIG1lbWNnLCB0cnVlLCB2bXByZXNzdXJlX3dpbiwgMCk7CiYjNDM7fQomIzQzOwomIzQzOyNkZWZpbmUgTUFYX1ZNUFJFU1NVUkVfQVJHU19MRU4JKHN0cmxlbigmIzM0O2NyaXRpY2FsJiMzNDspICYjNDM7IHN0cmxlbigmIzM0O2hpZXJhcmNoeSYjMzQ7KSAmIzQzOyAyKQomIzQzOwomIzQzOy8qKgomIzQzOyAqIHZtcHJlc3N1cmVfcmVnaXN0ZXJfZXZlbnQoKSAtIEJpbmQgdm1wcmVzc3VyZSBub3RpZmljYXRpb25zIHRvIGFuIGV2ZW50ZmQKJiM0MzsgKiBAbWVtY2c6CW1lbWNnIHRoYXQgaXMgaW50ZXJlc3RlZCBpbiB2bXByZXNzdXJlIG5vdGlmaWNhdGlvbnMKJiM0MzsgKiBAZXZlbnRmZDoJZXZlbnRmZCBjb250ZXh0IHRvIGxpbmsgbm90aWZpY2F0aW9ucyB3aXRoCiYjNDM7ICogQGFyZ3M6CWV2ZW50IGFyZ3VtZW50cyAocHJlc3N1cmUgbGV2ZWwgdGhyZXNob2xkLCBvcHRpb25hbCBtb2RlKQomIzQzOyAqCiYjNDM7ICogVGhpcyBmdW5jdGlvbiBhc3NvY2lhdGVzIGV2ZW50ZmQgY29udGV4dCB3aXRoIHRoZSB2bXByZXNzdXJlCiYjNDM7ICogaW5mcmFzdHJ1Y3R1cmUsIHNvIHRoYXQgdGhlIG5vdGlmaWNhdGlvbnMgd2lsbCBiZSBkZWxpdmVyZWQgdG8gdGhlCiYjNDM7ICogQGV2ZW50ZmQuIFRoZSBAYXJncyBwYXJhbWV0ZXIgaXMgYSBjb21tYS1kZWxpbWl0ZWQgc3RyaW5nIHRoYXQgZGVub3RlcyBhCiYjNDM7ICogcHJlc3N1cmUgbGV2ZWwgdGhyZXNob2xkIChvbmUgb2Ygdm1wcmVzc3VyZV9zdHJfbGV2ZWxzLCBpLmUuICYjMzQ7bG93JiMzNDssICYjMzQ7bWVkaXVtJiMzNDssCiYjNDM7ICogb3IgJiMzNDtjcml0aWNhbCYjMzQ7KSBhbmQgYW4gb3B0aW9uYWwgbW9kZSAob25lIG9mIHZtcHJlc3N1cmVfc3RyX21vZGVzLCBpLmUuCiYjNDM7ICogJiMzNDtoaWVyYXJjaHkmIzM0OyBvciAmIzM0O2xvY2FsJiMzNDspLgomIzQzOyAqCiYjNDM7ICogVG8gYmUgdXNlZCBhcyBtZW1jZyBldmVudCBtZXRob2QuCiYjNDM7ICoKJiM0MzsgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgLUVOT01FTSBvbiBtZW1vcnkgZmFpbHVyZSBvciAtRUlOVkFMIGlmIEBhcmdzIGNvdWxkCiYjNDM7ICogbm90IGJlIHBhcnNlZC4KJiM0MzsgKi8KJiM0MztpbnQgdm1wcmVzc3VyZV9yZWdpc3Rlcl9ldmVudChzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csCiYjNDM7CQkJICAgICAgc3RydWN0IGV2ZW50ZmRfY3R4ICpldmVudGZkLCBjb25zdCBjaGFyICphcmdzKQomIzQzO3sKJiM0MzsJc3RydWN0IHZtcHJlc3N1cmUgKnZtcHIgPSBtZW1jZ190b192bXByZXNzdXJlKG1lbWNnKTsKJiM0MzsJc3RydWN0IHZtcHJlc3N1cmVfZXZlbnQgKmV2OwomIzQzOwllbnVtIHZtcHJlc3N1cmVfbW9kZXMgbW9kZSA9IFZNUFJFU1NVUkVfTk9fUEFTU1RIUk9VR0g7CiYjNDM7CWVudW0gdm1wcmVzc3VyZV9sZXZlbHMgbGV2ZWw7CiYjNDM7CWNoYXIgKnNwZWMsICpzcGVjX29yaWc7CiYjNDM7CWNoYXIgKnRva2VuOwomIzQzOwlpbnQgcmV0ID0gMDsKJiM0MzsKJiM0MzsJc3BlY19vcmlnID0gc3BlYyA9IGtzdHJuZHVwKGFyZ3MsIE1BWF9WTVBSRVNTVVJFX0FSR1NfTEVOLCBHRlBfS0VSTkVMKTsKJiM0MzsJaWYgKCFzcGVjKQomIzQzOwkJcmV0dXJuIC1FTk9NRU07CiYjNDM7CiYjNDM7CS8qIEZpbmQgcmVxdWlyZWQgbGV2ZWwgKi8KJiM0MzsJdG9rZW4gPSBzdHJzZXAoJmFtcDtzcGVjLCAmIzM0OywmIzM0Oyk7CiYjNDM7CXJldCA9IG1hdGNoX3N0cmluZyh2bXByZXNzdXJlX3N0cl9sZXZlbHMsIFZNUFJFU1NVUkVfTlVNX0xFVkVMUywgdG9rZW4pOwomIzQzOwlpZiAocmV0ICZsdDsgMCkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwlsZXZlbCA9IHJldDsKJiM0MzsKJiM0MzsJLyogRmluZCBvcHRpb25hbCBtb2RlICovCiYjNDM7CXRva2VuID0gc3Ryc2VwKCZhbXA7c3BlYywgJiMzNDssJiMzNDspOwomIzQzOwlpZiAodG9rZW4pIHsKJiM0MzsJCXJldCA9IG1hdGNoX3N0cmluZyh2bXByZXNzdXJlX3N0cl9tb2RlcywgVk1QUkVTU1VSRV9OVU1fTU9ERVMsIHRva2VuKTsKJiM0MzsJCWlmIChyZXQgJmx0OyAwKQomIzQzOwkJCWdvdG8gb3V0OwomIzQzOwkJbW9kZSA9IHJldDsKJiM0MzsJfQomIzQzOwomIzQzOwlldiA9IGt6YWxsb2Nfb2JqKCpldik7CiYjNDM7CWlmICghZXYpIHsKJiM0MzsJCXJldCA9IC1FTk9NRU07CiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJfQomIzQzOwomIzQzOwlldi0mZ3Q7ZWZkID0gZXZlbnRmZDsKJiM0MzsJZXYtJmd0O2xldmVsID0gbGV2ZWw7CiYjNDM7CWV2LSZndDttb2RlID0gbW9kZTsKJiM0MzsKJiM0MzsJbXV0ZXhfbG9jaygmYW1wO3ZtcHItJmd0O2V2ZW50c19sb2NrKTsKJiM0MzsJbGlzdF9hZGQoJmFtcDtldi0mZ3Q7bm9kZSwgJmFtcDt2bXByLSZndDtldmVudHMpOwomIzQzOwltdXRleF91bmxvY2soJmFtcDt2bXByLSZndDtldmVudHNfbG9jayk7CiYjNDM7CXJldCA9IDA7CiYjNDM7b3V0OgomIzQzOwlrZnJlZShzcGVjX29yaWcpOwomIzQzOwlyZXR1cm4gcmV0OwomIzQzO30KJiM0MzsKJiM0MzsvKioKJiM0MzsgKiB2bXByZXNzdXJlX3VucmVnaXN0ZXJfZXZlbnQoKSAtIFVuYmluZCBldmVudGZkIGZyb20gdm1wcmVzc3VyZQomIzQzOyAqIEBtZW1jZzoJbWVtY2cgaGFuZGxlCiYjNDM7ICogQGV2ZW50ZmQ6CWV2ZW50ZmQgY29udGV4dCB0aGF0IHdhcyB1c2VkIHRvIGxpbmsgdm1wcmVzc3VyZSB3aXRoIHRoZSBAY2cKJiM0MzsgKgomIzQzOyAqIFRoaXMgZnVuY3Rpb24gZG9lcyBpbnRlcm5hbCBtYW5pcHVsYXRpb25zIHRvIGRldGFjaCB0aGUgQGV2ZW50ZmQgZnJvbQomIzQzOyAqIHRoZSB2bXByZXNzdXJlIG5vdGlmaWNhdGlvbnMsIGFuZCB0aGVuIGZyZWVzIGludGVybmFsIHJlc291cmNlcwomIzQzOyAqIGFzc29jaWF0ZWQgd2l0aCB0aGUgQGV2ZW50ZmQgKGJ1dCB0aGUgQGV2ZW50ZmQgaXRzZWxmIGlzIG5vdCBmcmVlZCkuCiYjNDM7ICoKJiM0MzsgKiBUbyBiZSB1c2VkIGFzIG1lbWNnIGV2ZW50IG1ldGhvZC4KJiM0MzsgKi8KJiM0Mzt2b2lkIHZtcHJlc3N1cmVfdW5yZWdpc3Rlcl9ldmVudChzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csCiYjNDM7CQkJCSBzdHJ1Y3QgZXZlbnRmZF9jdHggKmV2ZW50ZmQpCiYjNDM7ewomIzQzOwlzdHJ1Y3Qgdm1wcmVzc3VyZSAqdm1wciA9IG1lbWNnX3RvX3ZtcHJlc3N1cmUobWVtY2cpOwomIzQzOwlzdHJ1Y3Qgdm1wcmVzc3VyZV9ldmVudCAqZXY7CiYjNDM7CiYjNDM7CW11dGV4X2xvY2soJmFtcDt2bXByLSZndDtldmVudHNfbG9jayk7CiYjNDM7CWxpc3RfZm9yX2VhY2hfZW50cnkoZXYsICZhbXA7dm1wci0mZ3Q7ZXZlbnRzLCBub2RlKSB7CiYjNDM7CQlpZiAoZXYtJmd0O2VmZCAhPSBldmVudGZkKQomIzQzOwkJCWNvbnRpbnVlOwomIzQzOwkJbGlzdF9kZWwoJmFtcDtldi0mZ3Q7bm9kZSk7CiYjNDM7CQlrZnJlZShldik7CiYjNDM7CQlicmVhazsKJiM0MzsJfQomIzQzOwltdXRleF91bmxvY2soJmFtcDt2bXByLSZndDtldmVudHNfbG9jayk7CiYjNDM7fQpkaWZmIC0tZ2l0IGEvbW0vdm1wcmVzc3VyZS5jIGIvbW0vdm1wcmVzc3VyZS5jCmluZGV4IGYwNTM1NTRlNTgyNjQyLi5iY2ZhNGJkOGZmYzUyOSAxMDA2NDQKLS0tIGEvbW0vdm1wcmVzc3VyZS5jCiYjNDM7JiM0MzsmIzQzOyBiL21tL3ZtcHJlc3N1cmUuYwpAQCAtNywxNiAmIzQzOzcsMTUgQEAKICAqCiAgKiBCYXNlZCBvbiBpZGVhcyBmcm9tIEFuZHJldyBNb3J0b24sIERhdmlkIFJpZW50amVzLCBLT1NBS0kgTW90b2hpcm8sCiAgKiBMZW9uaWQgTW9pc2VpY2h1aywgTWVsIEdvcm1hbiwgTWluY2hhbiBLaW0gYW5kIFBla2thIEVuYmVyZy4KJiM0MzsgKgomIzQzOyAqIFRyZWUtbW9kZSAoY2dyb3VwIHYxIHVzZXJzcGFjZSBldmVudGZkKSBib29ra2VlcGluZyBsaXZlcyBpbgomIzQzOyAqIG1tL3ZtcHJlc3N1cmUtdjEuYzsgdGhpcyBmaWxlIGhvbGRzIHRoZSBzaGFyZWQgY29kZSBhbmQgdGhlIGluLWtlcm5lbAomIzQzOyAqICh0cmVlPWZhbHNlKSBzb2NrZXQtcHJlc3N1cmUgcGF0aCB0aGF0IHJ1bnMgb24gY2dyb3VwIHYyLgogICovCiAKICNpbmNsdWRlICZsdDtsaW51eC9jZ3JvdXAuaCZndDsKLSNpbmNsdWRlICZsdDtsaW51eC9mcy5oJmd0OwogI2luY2x1ZGUgJmx0O2xpbnV4L2xvZzIuaCZndDsKLSNpbmNsdWRlICZsdDtsaW51eC9zY2hlZC5oJmd0OwogI2luY2x1ZGUgJmx0O2xpbnV4L21tLmgmZ3Q7Ci0jaW5jbHVkZSAmbHQ7bGludXgvdm1zdGF0LmgmZ3Q7Ci0jaW5jbHVkZSAmbHQ7bGludXgvZXZlbnRmZC5oJmd0OwotI2luY2x1ZGUgJmx0O2xpbnV4L3NsYWIuaCZndDsKICNpbmNsdWRlICZsdDtsaW51eC9zd2FwLmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7bGludXgvcHJpbnRrLmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7bGludXgvdm1wcmVzc3VyZS5oJmd0OwpAQCAtMzUsNyAmIzQzOzM0LDcgQEAKICAqIFRPRE86IE1ha2UgdGhlIHdpbmRvdyBzaXplIGRlcGVuZCBvbiBtYWNoaW5lIHNpemUsIGFzIHdlIGRvIGZvciB2bXN0YXQKICAqIHRocmVzaG9sZHMuIEN1cnJlbnRseSB3ZSBzZXQgaXQgdG8gNTEyIHBhZ2VzICgyTUIgZm9yIDRLQiBwYWdlcykuCiAgKi8KLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIHZtcHJlc3N1cmVfd2luID0gU1dBUF9DTFVTVEVSX01BWCAqIDE2OwomIzQzO2NvbnN0IHVuc2lnbmVkIGxvbmcgdm1wcmVzc3VyZV93aW4gPSBTV0FQX0NMVVNURVJfTUFYICogMTY7CiAKIC8qCiAgKiBUaGVzZSB0aHJlc2hvbGRzIGFyZSB1c2VkIHdoZW4gd2UgYWNjb3VudCBtZW1vcnkgcHJlc3N1cmUgdGhyb3VnaApAQCAtNDYsNjggJiM0Mzs0NSw2IEBAIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIHZtcHJlc3N1cmVfd2luID0gU1dBUF9DTFVTVEVSX01BWCAqIDE2Owogc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCB2bXByZXNzdXJlX2xldmVsX21lZCA9IDYwOwogc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCB2bXByZXNzdXJlX2xldmVsX2NyaXRpY2FsID0gOTU7CiAKLS8qCi0gKiBXaGVuIHRoZXJlIGFyZSB0b28gbGl0dGxlIHBhZ2VzIGxlZnQgdG8gc2Nhbiwgdm1wcmVzc3VyZSgpIG1heSBtaXNzIHRoZQotICogY3JpdGljYWwgcHJlc3N1cmUgYXMgbnVtYmVyIG9mIHBhZ2VzIHdpbGwgYmUgbGVzcyB0aGFuICYjMzQ7d2luZG93IHNpemUmIzM0Oy4KLSAqIEhvd2V2ZXIsIGluIHRoYXQgY2FzZSB0aGUgdm1zY2FuIHByaW9yaXR5IHdpbGwgcmFpc2UgZmFzdCBhcyB0aGUKLSAqIHJlY2xhaW1lciB3aWxsIHRyeSB0byBzY2FuIExSVXMgbW9yZSBkZWVwbHkuCi0gKgotICogVGhlIHZtc2NhbiBsb2dpYyBjb25zaWRlcnMgdGhlc2Ugc3BlY2lhbCBwcmlvcml0aWVzOgotICoKLSAqIHByaW8gPT0gREVGX1BSSU9SSVRZICgxMik6IHJlY2xhaW1lciBzdGFydHMgd2l0aCB0aGF0IHZhbHVlCi0gKiBwcmlvICZsdDs9IERFRl9QUklPUklUWSAtIDIgOiBrc3dhcGQgYmVjb21lcyBzb21ld2hhdCBvdmVyd2hlbG1lZAotICogcHJpbyA9PSAwICAgICAgICAgICAgICAgIDogY2xvc2UgdG8gT09NLCBrZXJuZWwgc2NhbnMgZXZlcnkgcGFnZSBpbiBhbiBscnUKLSAqCi0gKiBBbnkgdmFsdWUgaW4gdGhpcyByYW5nZSBpcyBhY2NlcHRhYmxlIGZvciB0aGlzIHR1bmFibGUgKGkuZS4gZnJvbSAxMiB0bwotICogMCkuIEN1cnJlbnQgdmFsdWUgZm9yIHRoZSB2bXByZXNzdXJlX2xldmVsX2NyaXRpY2FsX3ByaW8gaXMgY2hvc2VuCi0gKiBlbXBpcmljYWxseSwgYnV0IHRoZSBudW1iZXIsIGluIGVzc2VuY2UsIG1lYW5zIHRoYXQgd2UgY29uc2lkZXIKLSAqIGNyaXRpY2FsIGxldmVsIHdoZW4gc2Nhbm5pbmcgZGVwdGggaXMgfjEwJSBvZiB0aGUgbHJ1IHNpemUgKHZtc2NhbgotICogc2NhbnMgJiMzOTtscnVfc2l6ZSAmZ3Q7Jmd0OyBwcmlvJiMzOTsgcGFnZXMsIHNvIGl0IGlzIGFjdHVhbGx5IDEyLjUlLCBvciBvbmUKLSAqIGVpZ2h0cykuCi0gKi8KLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgdm1wcmVzc3VyZV9sZXZlbF9jcml0aWNhbF9wcmlvID0gaWxvZzIoMTAwIC8gMTApOwotCi1zdGF0aWMgc3RydWN0IHZtcHJlc3N1cmUgKndvcmtfdG9fdm1wcmVzc3VyZShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCi17Ci0JcmV0dXJuIGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3Qgdm1wcmVzc3VyZSwgd29yayk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3Qgdm1wcmVzc3VyZSAqdm1wcmVzc3VyZV9wYXJlbnQoc3RydWN0IHZtcHJlc3N1cmUgKnZtcHIpCi17Ci0Jc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnID0gdm1wcmVzc3VyZV90b19tZW1jZyh2bXByKTsKLQotCW1lbWNnID0gcGFyZW50X21lbV9jZ3JvdXAobWVtY2cpOwotCWlmICghbWVtY2cpCi0JCXJldHVybiBOVUxMOwotCXJldHVybiBtZW1jZ190b192bXByZXNzdXJlKG1lbWNnKTsKLX0KLQotZW51bSB2bXByZXNzdXJlX2xldmVscyB7Ci0JVk1QUkVTU1VSRV9MT1cgPSAwLAotCVZNUFJFU1NVUkVfTUVESVVNLAotCVZNUFJFU1NVUkVfQ1JJVElDQUwsCi0JVk1QUkVTU1VSRV9OVU1fTEVWRUxTLAotfTsKLQotZW51bSB2bXByZXNzdXJlX21vZGVzIHsKLQlWTVBSRVNTVVJFX05PX1BBU1NUSFJPVUdIID0gMCwKLQlWTVBSRVNTVVJFX0hJRVJBUkNIWSwKLQlWTVBSRVNTVVJFX0xPQ0FMLAotCVZNUFJFU1NVUkVfTlVNX01PREVTLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB2bXByZXNzdXJlX3N0cl9sZXZlbHNbXSA9IHsKLQlbVk1QUkVTU1VSRV9MT1ddID0gJiMzNDtsb3cmIzM0OywKLQlbVk1QUkVTU1VSRV9NRURJVU1dID0gJiMzNDttZWRpdW0mIzM0OywKLQlbVk1QUkVTU1VSRV9DUklUSUNBTF0gPSAmIzM0O2NyaXRpY2FsJiMzNDssCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHZtcHJlc3N1cmVfc3RyX21vZGVzW10gPSB7Ci0JW1ZNUFJFU1NVUkVfTk9fUEFTU1RIUk9VR0hdID0gJiMzNDtkZWZhdWx0JiMzNDssCi0JW1ZNUFJFU1NVUkVfSElFUkFSQ0hZXSA9ICYjMzQ7aGllcmFyY2h5JiMzNDssCi0JW1ZNUFJFU1NVUkVfTE9DQUxdID0gJiMzNDtsb2NhbCYjMzQ7LAotfTsKLQogc3RhdGljIGVudW0gdm1wcmVzc3VyZV9sZXZlbHMgdm1wcmVzc3VyZV9sZXZlbCh1bnNpZ25lZCBsb25nIHByZXNzdXJlKQogewogCWlmIChwcmVzc3VyZSAmZ3Q7PSB2bXByZXNzdXJlX2xldmVsX2NyaXRpY2FsKQpAQCAtMTE3LDggJiM0Mzs1NCw4IEBAIHN0YXRpYyBlbnVtIHZtcHJlc3N1cmVfbGV2ZWxzIHZtcHJlc3N1cmVfbGV2ZWwodW5zaWduZWQgbG9uZyBwcmVzc3VyZSkKIAlyZXR1cm4gVk1QUkVTU1VSRV9MT1c7CiB9CiAKLXN0YXRpYyBlbnVtIHZtcHJlc3N1cmVfbGV2ZWxzIHZtcHJlc3N1cmVfY2FsY19sZXZlbCh1bnNpZ25lZCBsb25nIHNjYW5uZWQsCi0JCQkJCQkgICAgdW5zaWduZWQgbG9uZyByZWNsYWltZWQpCiYjNDM7ZW51bSB2bXByZXNzdXJlX2xldmVscyB2bXByZXNzdXJlX2NhbGNfbGV2ZWwodW5zaWduZWQgbG9uZyBzY2FubmVkLAomIzQzOwkJCQkJICAgICB1bnNpZ25lZCBsb25nIHJlY2xhaW1lZCkKIHsKIAl1bnNpZ25lZCBsb25nIHNjYWxlID0gc2Nhbm5lZCAmIzQzOyByZWNsYWltZWQ7CiAJdW5zaWduZWQgbG9uZyBwcmVzc3VyZSA9IDA7CkBAIC0xNDcsNzQgJiM0Mzs4NCw2IEBAIHN0YXRpYyBlbnVtIHZtcHJlc3N1cmVfbGV2ZWxzIHZtcHJlc3N1cmVfY2FsY19sZXZlbCh1bnNpZ25lZCBsb25nIHNjYW5uZWQsCiAJcmV0dXJuIHZtcHJlc3N1cmVfbGV2ZWwocHJlc3N1cmUpOwogfQogCi1zdHJ1Y3Qgdm1wcmVzc3VyZV9ldmVudCB7Ci0Jc3RydWN0IGV2ZW50ZmRfY3R4ICplZmQ7Ci0JZW51bSB2bXByZXNzdXJlX2xldmVscyBsZXZlbDsKLQllbnVtIHZtcHJlc3N1cmVfbW9kZXMgbW9kZTsKLQlzdHJ1Y3QgbGlzdF9oZWFkIG5vZGU7Ci19OwotCi1zdGF0aWMgYm9vbCB2bXByZXNzdXJlX2V2ZW50KHN0cnVjdCB2bXByZXNzdXJlICp2bXByLAotCQkJICAgICBjb25zdCBlbnVtIHZtcHJlc3N1cmVfbGV2ZWxzIGxldmVsLAotCQkJICAgICBib29sIGFuY2VzdG9yLCBib29sIHNpZ25hbGxlZCkKLXsKLQlzdHJ1Y3Qgdm1wcmVzc3VyZV9ldmVudCAqZXY7Ci0JYm9vbCByZXQgPSBmYWxzZTsKLQotCW11dGV4X2xvY2soJmFtcDt2bXByLSZndDtldmVudHNfbG9jayk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeShldiwgJmFtcDt2bXByLSZndDtldmVudHMsIG5vZGUpIHsKLQkJaWYgKGFuY2VzdG9yICZhbXA7JmFtcDsgZXYtJmd0O21vZGUgPT0gVk1QUkVTU1VSRV9MT0NBTCkKLQkJCWNvbnRpbnVlOwotCQlpZiAoc2lnbmFsbGVkICZhbXA7JmFtcDsgZXYtJmd0O21vZGUgPT0gVk1QUkVTU1VSRV9OT19QQVNTVEhST1VHSCkKLQkJCWNvbnRpbnVlOwotCQlpZiAobGV2ZWwgJmx0OyBldi0mZ3Q7bGV2ZWwpCi0JCQljb250aW51ZTsKLQkJZXZlbnRmZF9zaWduYWwoZXYtJmd0O2VmZCk7Ci0JCXJldCA9IHRydWU7Ci0JfQotCW11dGV4X3VubG9jaygmYW1wO3ZtcHItJmd0O2V2ZW50c19sb2NrKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyB2b2lkIHZtcHJlc3N1cmVfd29ya19mbihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCi17Ci0Jc3RydWN0IHZtcHJlc3N1cmUgKnZtcHIgPSB3b3JrX3RvX3ZtcHJlc3N1cmUod29yayk7Ci0JdW5zaWduZWQgbG9uZyBzY2FubmVkOwotCXVuc2lnbmVkIGxvbmcgcmVjbGFpbWVkOwotCWVudW0gdm1wcmVzc3VyZV9sZXZlbHMgbGV2ZWw7Ci0JYm9vbCBhbmNlc3RvciA9IGZhbHNlOwotCWJvb2wgc2lnbmFsbGVkID0gZmFsc2U7Ci0KLQlzcGluX2xvY2soJmFtcDt2bXByLSZndDtzcl9sb2NrKTsKLQkvKgotCSAqIFNldmVyYWwgY29udGV4dHMgbWlnaHQgYmUgY2FsbGluZyB2bXByZXNzdXJlKCksIHNvIGl0IGlzCi0JICogcG9zc2libGUgdGhhdCB0aGUgd29yayB3YXMgcmVzY2hlZHVsZWQgYWdhaW4gYmVmb3JlIHRoZSBvbGQKLQkgKiB3b3JrIGNvbnRleHQgY2xlYXJlZCB0aGUgY291bnRlcnMuIEluIHRoYXQgY2FzZSB3ZSB3aWxsIHJ1bgotCSAqIGp1c3QgYWZ0ZXIgdGhlIG9sZCB3b3JrIHJldHVybnMsIGJ1dCB0aGVuIHNjYW5uZWQgbWlnaHQgYmUgemVybwotCSAqIGhlcmUuIE5vIG5lZWQgZm9yIGFueSBsb2NrcyBoZXJlIHNpbmNlIHdlIGRvbiYjMzk7dCBjYXJlIGlmCi0JICogdm1wci0mZ3Q7cmVjbGFpbWVkIGlzIGluIHN5bmMuCi0JICovCi0Jc2Nhbm5lZCA9IHZtcHItJmd0O3RyZWVfc2Nhbm5lZDsKLQlpZiAoIXNjYW5uZWQpIHsKLQkJc3Bpbl91bmxvY2soJmFtcDt2bXByLSZndDtzcl9sb2NrKTsKLQkJcmV0dXJuOwotCX0KLQotCXJlY2xhaW1lZCA9IHZtcHItJmd0O3RyZWVfcmVjbGFpbWVkOwotCXZtcHItJmd0O3RyZWVfc2Nhbm5lZCA9IDA7Ci0Jdm1wci0mZ3Q7dHJlZV9yZWNsYWltZWQgPSAwOwotCXNwaW5fdW5sb2NrKCZhbXA7dm1wci0mZ3Q7c3JfbG9jayk7Ci0KLQlsZXZlbCA9IHZtcHJlc3N1cmVfY2FsY19sZXZlbChzY2FubmVkLCByZWNsYWltZWQpOwotCi0JZG8gewotCQlpZiAodm1wcmVzc3VyZV9ldmVudCh2bXByLCBsZXZlbCwgYW5jZXN0b3IsIHNpZ25hbGxlZCkpCi0JCQlzaWduYWxsZWQgPSB0cnVlOwotCQlhbmNlc3RvciA9IHRydWU7Ci0JfSB3aGlsZSAoKHZtcHIgPSB2bXByZXNzdXJlX3BhcmVudCh2bXByKSkpOwotfQotCiAvKioKICAqIHZtcHJlc3N1cmUoKSAtIEFjY291bnQgbWVtb3J5IHByZXNzdXJlIHRocm91Z2ggc2Nhbm5lZC9yZWNsYWltZWQgcmF0aW8KICAqIEBnZnA6CXJlY2xhaW1lciYjMzk7cyBnZnAgbWFzawpAQCAtMjQ2LDExICYjNDM7MTE1LDEzIEBAIHZvaWQgdm1wcmVzc3VyZShnZnBfdCBnZnAsIGludCBvcmRlciwgc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLCBib29sIHRyZWUsCiAJCXJldHVybjsKIAogCS8qCi0JICogVGhlIGluLWtlcm5lbCB1c2VycyBvbmx5IGNhcmUgYWJvdXQgdGhlIHJlY2xhaW0gZWZmaWNpZW5jeQotCSAqIGZvciB0aGlzIEBtZW1jZyByYXRoZXIgdGhhbiB0aGUgd2hvbGUgc3VidHJlZSwgYW5kIHRoZXJlCi0JICogaXNuJiMzOTt0IGFuZCB3b24mIzM5O3QgYmUgYW55IGluLWtlcm5lbCB1c2VyIGluIGEgbGVnYWN5IGNncm91cC4KJiM0MzsJICogT25seSB0d28gY29tYmluYXRpb25zIGhhdmUgYSBjb25zdW1lcjoKJiM0MzsJICogICBjZ3JvdXAgdjIgJiM0MzsgdHJlZT1mYWxzZSAtJmd0OyBpbi1rZXJuZWwgc29ja2V0IHByZXNzdXJlCiYjNDM7CSAqICAgY2dyb3VwIHYxICYjNDM7IHRyZWU9dHJ1ZSAgLSZndDsgdXNlcnNwYWNlIGV2ZW50ZmRzIChtZW1vcnkucHJlc3N1cmVfbGV2ZWwpCiYjNDM7CSAqIFNraXAgdGhlIG90aGVyIHR3bzogbm90aGluZyBjb25zdW1lcyB0aGUgcmVzdWx0LgogCSAqLwotCWlmICghY2dyb3VwX3N1YnN5c19vbl9kZmwobWVtb3J5X2NncnBfc3Vic3lzKSAmYW1wOyZhbXA7ICF0cmVlKQomIzQzOwlpZiAoKCFjZ3JvdXBfc3Vic3lzX29uX2RmbChtZW1vcnlfY2dycF9zdWJzeXMpICZhbXA7JmFtcDsgIXRyZWUpIHx8CiYjNDM7CSAgICAoY2dyb3VwX3N1YnN5c19vbl9kZmwobWVtb3J5X2NncnBfc3Vic3lzKSAmYW1wOyZhbXA7IHRyZWUpKQogCQlyZXR1cm47CiAKIAl2bXByID0gbWVtY2dfdG9fdm1wcmVzc3VyZShtZW1jZyk7CkBAIC0yODEsMTQgJiM0MzsxNTIsNyBAQCB2b2lkIHZtcHJlc3N1cmUoZ2ZwX3QgZ2ZwLCBpbnQgb3JkZXIsIHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZywgYm9vbCB0cmVlLAogCQlyZXR1cm47CiAKIAlpZiAodHJlZSkgewotCQlzcGluX2xvY2soJmFtcDt2bXByLSZndDtzcl9sb2NrKTsKLQkJc2Nhbm5lZCA9IHZtcHItJmd0O3RyZWVfc2Nhbm5lZCAmIzQzOz0gc2Nhbm5lZDsKLQkJdm1wci0mZ3Q7dHJlZV9yZWNsYWltZWQgJiM0Mzs9IHJlY2xhaW1lZDsKLQkJc3Bpbl91bmxvY2soJmFtcDt2bXByLSZndDtzcl9sb2NrKTsKLQotCQlpZiAoc2Nhbm5lZCAmbHQ7IHZtcHJlc3N1cmVfd2luKQotCQkJcmV0dXJuOwotCQlzY2hlZHVsZV93b3JrKCZhbXA7dm1wci0mZ3Q7d29yayk7CiYjNDM7CQl2bXByZXNzdXJlX3YxX2FjY291bnRfdHJlZSh2bXByLCBzY2FubmVkLCByZWNsYWltZWQpOwogCX0gZWxzZSB7CiAJCWVudW0gdm1wcmVzc3VyZV9sZXZlbHMgbGV2ZWw7CiAKQEAgLTMzMCwxMzQgJiM0MzsxOTQsNiBAQCB2b2lkIHZtcHJlc3N1cmUoZ2ZwX3QgZ2ZwLCBpbnQgb3JkZXIsIHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZywgYm9vbCB0cmVlLAogCX0KIH0KIAotLyoqCi0gKiB2bXByZXNzdXJlX3ByaW8oKSAtIEFjY291bnQgbWVtb3J5IHByZXNzdXJlIHRocm91Z2ggcmVjbGFpbWVyIHByaW9yaXR5IGxldmVsCi0gKiBAZ2ZwOglyZWNsYWltZXImIzM5O3MgZ2ZwIG1hc2sKLSAqIEBtZW1jZzoJY2dyb3VwIG1lbW9yeSBjb250cm9sbGVyIGhhbmRsZQotICogQHByaW86CXJlY2xhaW1lciYjMzk7cyBwcmlvcml0eQotICoKLSAqIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBmcm9tIHRoZSByZWNsYWltIHBhdGggZXZlcnkgdGltZSB3aGVuCi0gKiB0aGUgdm1zY2FuJiMzOTtzIHJlY2xhaW1pbmcgcHJpb3JpdHkgKHNjYW5uaW5nIGRlcHRoKSBjaGFuZ2VzLgotICoKLSAqIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgcmV0dXJuIGFueSB2YWx1ZS4KLSAqLwotdm9pZCB2bXByZXNzdXJlX3ByaW8oZ2ZwX3QgZ2ZwLCBzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csIGludCBwcmlvKQotewotCS8qCi0JICogV2Ugb25seSB1c2UgcHJpbyBmb3IgYWNjb3VudGluZyBjcml0aWNhbCBsZXZlbC4gRm9yIG1vcmUgaW5mbwotCSAqIHNlZSBjb21tZW50IGZvciB2bXByZXNzdXJlX2xldmVsX2NyaXRpY2FsX3ByaW8gdmFyaWFibGUgYWJvdmUuCi0JICovCi0JaWYgKHByaW8gJmd0OyB2bXByZXNzdXJlX2xldmVsX2NyaXRpY2FsX3ByaW8pCi0JCXJldHVybjsKLQotCS8qCi0JICogT0ssIHRoZSBwcmlvIGlzIGJlbG93IHRoZSB0aHJlc2hvbGQsIHVwZGF0aW5nIHZtcHJlc3N1cmUKLQkgKiBpbmZvcm1hdGlvbiBiZWZvcmUgc2hyaW5rZXIgZGl2ZXMgaW50byBsb25nIHNocmlua2luZyBvZiBsb25nCi0JICogcmFuZ2Ugdm1zY2FuLiBQYXNzaW5nIHNjYW5uZWQgPSB2bXByZXNzdXJlX3dpbiwgcmVjbGFpbWVkID0gMAotCSAqIHRvIHRoZSB2bXByZXNzdXJlKCkgYmFzaWNhbGx5IG1lYW5zIHRoYXQgd2Ugc2lnbmFsICYjMzk7Y3JpdGljYWwmIzM5OwotCSAqIGxldmVsLgotCSAqLwotCXZtcHJlc3N1cmUoZ2ZwLCAwLCBtZW1jZywgdHJ1ZSwgdm1wcmVzc3VyZV93aW4sIDApOwotfQotCi0jZGVmaW5lIE1BWF9WTVBSRVNTVVJFX0FSR1NfTEVOCShzdHJsZW4oJiMzNDtjcml0aWNhbCYjMzQ7KSAmIzQzOyBzdHJsZW4oJiMzNDtoaWVyYXJjaHkmIzM0OykgJiM0MzsgMikKLQotLyoqCi0gKiB2bXByZXNzdXJlX3JlZ2lzdGVyX2V2ZW50KCkgLSBCaW5kIHZtcHJlc3N1cmUgbm90aWZpY2F0aW9ucyB0byBhbiBldmVudGZkCi0gKiBAbWVtY2c6CW1lbWNnIHRoYXQgaXMgaW50ZXJlc3RlZCBpbiB2bXByZXNzdXJlIG5vdGlmaWNhdGlvbnMKLSAqIEBldmVudGZkOglldmVudGZkIGNvbnRleHQgdG8gbGluayBub3RpZmljYXRpb25zIHdpdGgKLSAqIEBhcmdzOglldmVudCBhcmd1bWVudHMgKHByZXNzdXJlIGxldmVsIHRocmVzaG9sZCwgb3B0aW9uYWwgbW9kZSkKLSAqCi0gKiBUaGlzIGZ1bmN0aW9uIGFzc29jaWF0ZXMgZXZlbnRmZCBjb250ZXh0IHdpdGggdGhlIHZtcHJlc3N1cmUKLSAqIGluZnJhc3RydWN0dXJlLCBzbyB0aGF0IHRoZSBub3RpZmljYXRpb25zIHdpbGwgYmUgZGVsaXZlcmVkIHRvIHRoZQotICogQGV2ZW50ZmQuIFRoZSBAYXJncyBwYXJhbWV0ZXIgaXMgYSBjb21tYS1kZWxpbWl0ZWQgc3RyaW5nIHRoYXQgZGVub3RlcyBhCi0gKiBwcmVzc3VyZSBsZXZlbCB0aHJlc2hvbGQgKG9uZSBvZiB2bXByZXNzdXJlX3N0cl9sZXZlbHMsIGkuZS4gJiMzNDtsb3cmIzM0OywgJiMzNDttZWRpdW0mIzM0OywKLSAqIG9yICYjMzQ7Y3JpdGljYWwmIzM0OykgYW5kIGFuIG9wdGlvbmFsIG1vZGUgKG9uZSBvZiB2bXByZXNzdXJlX3N0cl9tb2RlcywgaS5lLgotICogJiMzNDtoaWVyYXJjaHkmIzM0OyBvciAmIzM0O2xvY2FsJiMzNDspLgotICoKLSAqIFRvIGJlIHVzZWQgYXMgbWVtY2cgZXZlbnQgbWV0aG9kLgotICoKLSAqIFJldHVybjogMCBvbiBzdWNjZXNzLCAtRU5PTUVNIG9uIG1lbW9yeSBmYWlsdXJlIG9yIC1FSU5WQUwgaWYgQGFyZ3MgY291bGQKLSAqIG5vdCBiZSBwYXJzZWQuCi0gKi8KLWludCB2bXByZXNzdXJlX3JlZ2lzdGVyX2V2ZW50KHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZywKLQkJCSAgICAgIHN0cnVjdCBldmVudGZkX2N0eCAqZXZlbnRmZCwgY29uc3QgY2hhciAqYXJncykKLXsKLQlzdHJ1Y3Qgdm1wcmVzc3VyZSAqdm1wciA9IG1lbWNnX3RvX3ZtcHJlc3N1cmUobWVtY2cpOwotCXN0cnVjdCB2bXByZXNzdXJlX2V2ZW50ICpldjsKLQllbnVtIHZtcHJlc3N1cmVfbW9kZXMgbW9kZSA9IFZNUFJFU1NVUkVfTk9fUEFTU1RIUk9VR0g7Ci0JZW51bSB2bXByZXNzdXJlX2xldmVscyBsZXZlbDsKLQljaGFyICpzcGVjLCAqc3BlY19vcmlnOwotCWNoYXIgKnRva2VuOwotCWludCByZXQgPSAwOwotCi0Jc3BlY19vcmlnID0gc3BlYyA9IGtzdHJuZHVwKGFyZ3MsIE1BWF9WTVBSRVNTVVJFX0FSR1NfTEVOLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXNwZWMpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JLyogRmluZCByZXF1aXJlZCBsZXZlbCAqLwotCXRva2VuID0gc3Ryc2VwKCZhbXA7c3BlYywgJiMzNDssJiMzNDspOwotCXJldCA9IG1hdGNoX3N0cmluZyh2bXByZXNzdXJlX3N0cl9sZXZlbHMsIFZNUFJFU1NVUkVfTlVNX0xFVkVMUywgdG9rZW4pOwotCWlmIChyZXQgJmx0OyAwKQotCQlnb3RvIG91dDsKLQlsZXZlbCA9IHJldDsKLQotCS8qIEZpbmQgb3B0aW9uYWwgbW9kZSAqLwotCXRva2VuID0gc3Ryc2VwKCZhbXA7c3BlYywgJiMzNDssJiMzNDspOwotCWlmICh0b2tlbikgewotCQlyZXQgPSBtYXRjaF9zdHJpbmcodm1wcmVzc3VyZV9zdHJfbW9kZXMsIFZNUFJFU1NVUkVfTlVNX01PREVTLCB0b2tlbik7Ci0JCWlmIChyZXQgJmx0OyAwKQotCQkJZ290byBvdXQ7Ci0JCW1vZGUgPSByZXQ7Ci0JfQotCi0JZXYgPSBremFsbG9jX29iaigqZXYpOwotCWlmICghZXYpIHsKLQkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBvdXQ7Ci0JfQotCi0JZXYtJmd0O2VmZCA9IGV2ZW50ZmQ7Ci0JZXYtJmd0O2xldmVsID0gbGV2ZWw7Ci0JZXYtJmd0O21vZGUgPSBtb2RlOwotCi0JbXV0ZXhfbG9jaygmYW1wO3ZtcHItJmd0O2V2ZW50c19sb2NrKTsKLQlsaXN0X2FkZCgmYW1wO2V2LSZndDtub2RlLCAmYW1wO3ZtcHItJmd0O2V2ZW50cyk7Ci0JbXV0ZXhfdW5sb2NrKCZhbXA7dm1wci0mZ3Q7ZXZlbnRzX2xvY2spOwotCXJldCA9IDA7Ci1vdXQ6Ci0Ja2ZyZWUoc3BlY19vcmlnKTsKLQlyZXR1cm4gcmV0OwotfQotCi0vKioKLSAqIHZtcHJlc3N1cmVfdW5yZWdpc3Rlcl9ldmVudCgpIC0gVW5iaW5kIGV2ZW50ZmQgZnJvbSB2bXByZXNzdXJlCi0gKiBAbWVtY2c6CW1lbWNnIGhhbmRsZQotICogQGV2ZW50ZmQ6CWV2ZW50ZmQgY29udGV4dCB0aGF0IHdhcyB1c2VkIHRvIGxpbmsgdm1wcmVzc3VyZSB3aXRoIHRoZSBAY2cKLSAqCi0gKiBUaGlzIGZ1bmN0aW9uIGRvZXMgaW50ZXJuYWwgbWFuaXB1bGF0aW9ucyB0byBkZXRhY2ggdGhlIEBldmVudGZkIGZyb20KLSAqIHRoZSB2bXByZXNzdXJlIG5vdGlmaWNhdGlvbnMsIGFuZCB0aGVuIGZyZWVzIGludGVybmFsIHJlc291cmNlcwotICogYXNzb2NpYXRlZCB3aXRoIHRoZSBAZXZlbnRmZCAoYnV0IHRoZSBAZXZlbnRmZCBpdHNlbGYgaXMgbm90IGZyZWVkKS4KLSAqCi0gKiBUbyBiZSB1c2VkIGFzIG1lbWNnIGV2ZW50IG1ldGhvZC4KLSAqLwotdm9pZCB2bXByZXNzdXJlX3VucmVnaXN0ZXJfZXZlbnQoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLAotCQkJCSBzdHJ1Y3QgZXZlbnRmZF9jdHggKmV2ZW50ZmQpCi17Ci0Jc3RydWN0IHZtcHJlc3N1cmUgKnZtcHIgPSBtZW1jZ190b192bXByZXNzdXJlKG1lbWNnKTsKLQlzdHJ1Y3Qgdm1wcmVzc3VyZV9ldmVudCAqZXY7Ci0KLQltdXRleF9sb2NrKCZhbXA7dm1wci0mZ3Q7ZXZlbnRzX2xvY2spOwotCWxpc3RfZm9yX2VhY2hfZW50cnkoZXYsICZhbXA7dm1wci0mZ3Q7ZXZlbnRzLCBub2RlKSB7Ci0JCWlmIChldi0mZ3Q7ZWZkICE9IGV2ZW50ZmQpCi0JCQljb250aW51ZTsKLQkJbGlzdF9kZWwoJmFtcDtldi0mZ3Q7bm9kZSk7Ci0JCWtmcmVlKGV2KTsKLQkJYnJlYWs7Ci0JfQotCW11dGV4X3VubG9jaygmYW1wO3ZtcHItJmd0O2V2ZW50c19sb2NrKTsKLX0KLQogLyoqCiAgKiB2bXByZXNzdXJlX2luaXQoKSAtIEluaXRpYWxpemUgdm1wcmVzc3VyZSBjb250cm9sIHN0cnVjdHVyZQogICogQHZtcHI6CVN0cnVjdHVyZSB0byBiZSBpbml0aWFsaXplZApAQCAtNDY4LDkgJiM0MzsyMDQsNyBAQCB2b2lkIHZtcHJlc3N1cmVfdW5yZWdpc3Rlcl9ldmVudChzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csCiB2b2lkIHZtcHJlc3N1cmVfaW5pdChzdHJ1Y3Qgdm1wcmVzc3VyZSAqdm1wcikKIHsKIAlzcGluX2xvY2tfaW5pdCgmYW1wO3ZtcHItJmd0O3NyX2xvY2spOwotCW11dGV4X2luaXQoJmFtcDt2bXByLSZndDtldmVudHNfbG9jayk7Ci0JSU5JVF9MSVNUX0hFQUQoJmFtcDt2bXByLSZndDtldmVudHMpOwotCUlOSVRfV09SSygmYW1wO3ZtcHItJmd0O3dvcmssIHZtcHJlc3N1cmVfd29ya19mbik7CiYjNDM7CXZtcHJlc3N1cmVfdjFfaW5pdCh2bXByKTsKIH0KIAogLyoqCkBAIC00ODIsOSAmIzQzOzIxNiw1IEBAIHZvaWQgdm1wcmVzc3VyZV9pbml0KHN0cnVjdCB2bXByZXNzdXJlICp2bXByKQogICovCiB2b2lkIHZtcHJlc3N1cmVfY2xlYW51cChzdHJ1Y3Qgdm1wcmVzc3VyZSAqdm1wcikKIHsKLQkvKgotCSAqIE1ha2Ugc3VyZSB0aGVyZSBpcyBubyBwZW5kaW5nIHdvcmsgYmVmb3JlIGV2ZW50ZmQgaW5mcmFzdHJ1Y3R1cmUKLQkgKiBnb2VzIGF3YXkuCi0JICovCi0JZmx1c2hfd29yaygmYW1wO3ZtcHItJmd0O3dvcmspOwomIzQzOwl2bXByZXNzdXJlX3YxX2NsZWFudXAodm1wcik7CiB9CjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA2LzI5IDE0OjMzPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDEwOTM5CgkJCQkJCQlvdXRwdXQ6IDE5CgkJCQkJCQl0aG91Z2h0czogMTcxNgoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXNpcyBvZiB0aGUgdm1wcmVzc3VyZSBjZ3JvdXAgdjEgcmVmYWN0b3JpbmcgcGF0Y2gqKgoKT2theSwgc28gSSYjMzk7bSBsb29raW5nIGF0IHRoaXMgcGF0Y2ggdGhhdCByZWZhY3RvcnMgdGhlIGNncm91cCB2MSB2bXByZXNzdXJlIGNvZGUuIFRoZSBwcmltYXJ5IGdvYWwgc2VlbXMgdG8gYmUgdG8gc3BsaXQgb3V0IHRoZSB2MS1zcGVjaWZpYyBiaXRzIGludG8gYG1tL3ZtcHJlc3N1cmUtdjEuY2AgdXNpbmcgY29uZGl0aW9uYWwgY29tcGlsYXRpb24gYmFzZWQgb24gYENPTkZJR19NRU1DR19WMWAuIFRoaXMgaW52b2x2ZXMgbW92aW5nIGZ1bmN0aW9ucyBsaWtlIGB2bXByZXNzdXJlX3ByaW9gLCBgdm1wcmVzc3VyZV9yZWdpc3Rlcl9ldmVudGAsIGV0Yy4sIGFuZCBpbnRyb2R1Y2luZyBpbml0aWFsaXphdGlvbiBhbmQgY2xlYW51cCBmdW5jdGlvbnMgc3BlY2lmaWMgdG8gdjEuICBUaGUgYE1ha2VmaWxlYCBnZXRzIHVwZGF0ZWQgdG8gYnVpbGQgdGhlIG5ldyBmaWxlIHdoZW4gYENPTkZJR19NRU1DR19WMWAgaXMgZW5hYmxlZCwgYW5kIHRoZSBgdm1wcmVzc3VyZS5oYCBoZWFkZXIgaGlkZXMgdjEtc3BlY2lmaWMgZmllbGRzIHdpdGggYW4gYCNpZmRlZmAuIEl0JiMzOTtzIGEgY2xlYXIgYXR0ZW1wdCB0byBrZWVwIHRoZSB2MiBpbXBsZW1lbnRhdGlvbiBjbGVhbmVyLgoKTXkgaW5pdGlhbCB0aG91Z2h0IGlzIHRvIGNoZWNrIGZvciBhbnkgKmZ1bmN0aW9uYWwqIGNoYW5nZXMuIFRoZSBjb21taXQgbWVzc2FnZSBtZW50aW9ucyBkcm9wcGluZyB0aGUgdjEgZXZlbnRmZCBhY2N1bXVsYXRvciB3aGVuIGBDT05GSUdfTUVNQ0dfVjFgIGlzIGRpc2FibGVkLCB3aGljaCBtYWtlcyBzZW5zZSBmb3IgYSB2Mi1vbmx5IGtlcm5lbC4KCk5vdyBJJiMzOTt2ZSBoaXQgYSB3cmlua2xlLiAgVGhlIHBhdGNoICpkb2VzKiBtb2RpZnkgYHZtcHJlc3N1cmUoKWAgaXRzZWxmLiAgVGhlIGNvZGUgbm93IGluY2x1ZGVzIGEgY29uZGl0aW9uYWwgZWFybHkgcmV0dXJuOiBgKCFjZ3JvdXBfc3Vic3lzX29uX2RmbChtZW1vcnlfY2dycF9zdWJzeXMpICZhbXA7JmFtcDsgIXRyZWUpIHx8IChjZ3JvdXBfc3Vic3lzX29uX2RmbChtZW1vcnlfY2dycF9zdWJzeXMpICZhbXA7JmFtcDsgdHJlZSlgLiBUaGUgb3JpZ2luYWwgY29kZSBqdXN0IGhhZCBgIWNncm91cF9zdWJzeXNfb25fZGZsKG1lbW9yeV9jZ3JwX3N1YnN5cykgJmFtcDsmYW1wOyAhdHJlZWAuIFRoaXMgaXMgYSBiaXQgbW9yZSB0aGFuIGp1c3QgYSByZWZhY3RvcmluZy4KClRoaW5raW5nIGFib3V0IHRoaXMsIHRoZSBjaGFuZ2Ugbm93ICpza2lwcyogdGhlIGB0cmVlYCBicmFuY2ggd2hlbiBgY2dyb3VwX3N1YnN5c19vbl9kZmxgIGlzIHRydWUgKGNncm91cCB2MikgYW5kIGB0cmVlYCBpcyBhbHNvIHRydWUuIFByZXZpb3VzbHksIHRoaXMgYnJhbmNoIHdvdWxkIGhhdmUgYWNjdW11bGF0ZWQgYHRyZWVfc2Nhbm5lZGAgYW5kIHNjaGVkdWxlZCBgdm1wci0mZ3Q7d29ya2AuIEluIHYyLCB0aGUgYHdvcmtgIGZ1bmN0aW9uIHdvdWxkIGhhdmUgZG9uZSBub3RoaW5nIGFzIHRoZXJlIGFyZSBubyByZWdpc3RlcmVkIHVzZXJzcGFjZSBldmVudGZkcy4gU28sIGl0IGFwcGVhcnMgdGhlIHBhdGNoIGludHJvZHVjZXMgYW4gKm9wdGltaXphdGlvbiosIGJ5IHNraXBwaW5nIHRoZSBzY2hlZHVsaW5nIGFuZCBhY2N1bXVsYXRpb24uIEl0JiMzOTtzIHNraXBwaW5nIHdvcmsgdGhhdCB3b3VsZCBkbyBub3RoaW5nLCBzbyB0aGlzIG1ha2VzIHNlbnNlLgoKU28gaXMgdGhpcyBhIHdvcnRod2hpbGUgcGF0Y2ggdG8gZnV6ej8gSXQgaXMgbW9zdGx5IGEgcmVmYWN0b3JpbmcuIFRoZSB2MSBjb2RlIGlzIGJlaW5nIG1vdmVkIGFyb3VuZC4gVGhlIGNoYW5nZXMgZm9yIGtlcm5lbHMgY29tcGlsZWQgd2l0aCBgQ09ORklHX01FTUNHX1YxYCBkaXNhYmxlZCBhcmUgYSBwdXJlbHkgc3RydWN0dXJhbCBjbGVhbnVwLiBUaGUgbmV3IGB2bXByZXNzdXJlX3YxXypgIGZ1bmN0aW9ucyBiZWNvbWUgbm8tb3BzLgoKVGhlIGNvcmUgb2YgdGhlIG1hdHRlciBpcyB0aGUgZWFybHkgcmV0dXJuIGluIGB2bXByZXNzdXJlKClgLiBXaGlsZSB0ZWNobmljYWxseSBhbiBvcHRpbWl6YXRpb24sIGl0ICpkb2VzKiBjaGFuZ2UgdGhlIGV4ZWN1dGlvbiBmbG93LiAgU28sIGJhc2VkIG9uIHRoYXQsIGV2ZW4gdGhvdWdoIGl0JiMzOTtzIHJlbGF0aXZlbHkgbWlub3IgYW5kIGEgcGVyZm9ybWFuY2UgdHdlYWssIHRoaXMgY291bnRzIGFzIGEgZnVuY3Rpb25hbCBjaGFuZ2UuCgpUaGVyZWZvcmUsIGJlY2F1c2UgdGhpcyBmdW5jdGlvbmFsIGNoYW5nZSBtb2RpZmllcyByZWFjaGFibGUgY29yZSBrZXJuZWwgbG9naWMsIEkgbXVzdCBzYXkgKipXb3J0aEZ1enppbmc9dHJ1ZSoqLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA2LzI5IDE0OjM0PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O01FTUNHX1YxJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2luY2x1ZGUvbGludXgvbWVtY29udHJvbC5oPTg5PXN0cnVjdCBtZW1fY2dyb3VwX3Blcl9ub2RlIHtcbi0tXG5pbmNsdWRlL2xpbnV4L21lbWNvbnRyb2wuaC05Ny1cbmluY2x1ZGUvbGludXgvbWVtY29udHJvbC5oOjk4OiNpZmRlZiBDT05GSUdfTUVNQ0dfVjFcbmluY2x1ZGUvbGludXgvbWVtY29udHJvbC5oLTk5LVx0Lypcbi0tXG5pbmNsdWRlL2xpbnV4L21lbWNvbnRyb2wuaD0yMDI9c3RydWN0IG1lbV9jZ3JvdXAge1xuLS1cbmluY2x1ZGUvbGludXgvbWVtY29udHJvbC5oLTI4NS1cbmluY2x1ZGUvbGludXgvbWVtY29udHJvbC5oOjI4NjojaWZkZWYgQ09ORklHX01FTUNHX1YxXG5pbmNsdWRlL2xpbnV4L21lbWNvbnRyb2wuaC0yODctXHQvKiBMZWdhY3kgY29uc3VtZXItb3JpZW50ZWQgY291bnRlcnMgKi9cbi0tXG5pbmNsdWRlL2xpbnV4L21lbWNvbnRyb2wuaC0zMjAtXHRzcGlubG9ja190IGV2ZW50X2xpc3RfbG9jaztcbmluY2x1ZGUvbGludXgvbWVtY29udHJvbC5oOjMyMTojZW5kaWYgLyogQ09ORklHX01FTUNHX1YxICovXG5pbmNsdWRlL2xpbnV4L21lbWNvbnRyb2wuaC0zMjItXG4tLVxuaW5jbHVkZS9saW51eC9tZW1jb250cm9sLmg9MTg2NT1zdGF0aWMgaW5saW5lIGJvb2wgbWVtX2Nncm91cF96c3dhcF93cml0ZWJhY2tfZW5hYmxlZChzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2cpXG4tLVxuaW5jbHVkZS9saW51eC9tZW1jb250cm9sLmgtMTg3NC1cbmluY2x1ZGUvbGludXgvbWVtY29udHJvbC5oOjE4NzU6I2lmZGVmIENPTkZJR19NRU1DR19WMVxuaW5jbHVkZS9saW51eC9tZW1jb250cm9sLmgtMTg3Ni11bnNpZ25lZCBsb25nIG1lbWNnMV9zb2Z0X2xpbWl0X3JlY2xhaW0ocGdfZGF0YV90ICpwZ2RhdCwgaW50IG9yZGVyLFxuLS1cbmluY2x1ZGUvbGludXgvbWVtY29udHJvbC5oPTE4OTM9c3RhdGljIGlubGluZSB2b2lkIG1lbV9jZ3JvdXBfZXhpdF91c2VyX2ZhdWx0KHZvaWQpXG4tLVxuaW5jbHVkZS9saW51eC9tZW1jb250cm9sLmgtMTg5OC1cbmluY2x1ZGUvbGludXgvbWVtY29udHJvbC5oOjE4OTk6I2Vsc2UgLyogQ09ORklHX01FTUNHX1YxICovXG5pbmNsdWRlL2xpbnV4L21lbWNvbnRyb2wuaC0xOTAwLXN0YXRpYyBpbmxpbmVcbi0tXG5pbmNsdWRlL2xpbnV4L21lbWNvbnRyb2wuaD0xOTIyPXN0YXRpYyBpbmxpbmUgdm9pZCBtZW1fY2dyb3VwX2V4aXRfdXNlcl9mYXVsdCh2b2lkKVxuLS1cbmluY2x1ZGUvbGludXgvbWVtY29udHJvbC5oLTE5MjUtXG5pbmNsdWRlL2xpbnV4L21lbWNvbnRyb2wuaDoxOTI2OiNlbmRpZiAvKiBDT05GSUdfTUVNQ0dfVjEgKi9cbmluY2x1ZGUvbGludXgvbWVtY29udHJvbC5oLTE5MjctXG5pbmNsdWRlL2xpbnV4L21lbWNvbnRyb2wuaDoxOTI4OiNpZiBkZWZpbmVkKENPTkZJR19NRU1DR19WMSkgXHUwMDI2XHUwMDI2IGRlZmluZWQoQ09ORklHX1NXQVApXG5pbmNsdWRlL2xpbnV4L21lbWNvbnRyb2wuaC0xOTI5LVxuLS1cbmluY2x1ZGUvbGludXgvc2NoZWQuaD04MjY9c3RydWN0IHRhc2tfc3RydWN0IHtcbi0tXG5pbmNsdWRlL2xpbnV4L3NjaGVkLmgtMTAyMS0jZW5kaWZcbmluY2x1ZGUvbGludXgvc2NoZWQuaDoxMDIyOiNpZmRlZiBDT05GSUdfTUVNQ0dfVjFcbmluY2x1ZGUvbGludXgvc2NoZWQuaC0xMDIzLVx0dW5zaWduZWRcdFx0XHRpbl91c2VyX2ZhdWx0OjE7XG4tLVxuaW5jbHVkZS9saW51eC9zY2hlZC5oLTE1NDctXG5pbmNsdWRlL2xpbnV4L3NjaGVkLmg6MTU0ODojaWZkZWYgQ09ORklHX01FTUNHX1YxXG5pbmNsdWRlL2xpbnV4L3NjaGVkLmgtMTU0OS1cdHN0cnVjdCBtZW1fY2dyb3VwXHRcdCptZW1jZ19pbl9vb207XG4tLVxuaW5jbHVkZS9saW51eC92bXByZXNzdXJlLmg9MTM9c3RydWN0IHZtcHJlc3N1cmUge1xuLS1cbmluY2x1ZGUvbGludXgvdm1wcmVzc3VyZS5oLTE4LVxuaW5jbHVkZS9saW51eC92bXByZXNzdXJlLmg6MTk6I2lmZGVmIENPTkZJR19NRU1DR19WMVxuaW5jbHVkZS9saW51eC92bXByZXNzdXJlLmgtMjAtXHQvKlxuLS1cbmluY2x1ZGUvbGludXgvdm1wcmVzc3VyZS5oLTIyLVx0ICogKG1lbW9yeS5wcmVzc3VyZV9sZXZlbCkuIERyYWluZWQgYnkgQHdvcmsuIHYyIGhhcyBubyBlcXVpdmFsZW50XG5pbmNsdWRlL2xpbnV4L3ZtcHJlc3N1cmUuaDoyMzpcdCAqIGludGVyZmFjZSwgc28gdGhpcyBzdGF0ZSBpcyBvbWl0dGVkIG9uIENPTkZJR19NRU1DR19WMT1uIGJ1aWxkcy5cbmluY2x1ZGUvbGludXgvdm1wcmVzc3VyZS5oLTI0LVx0ICovXG4tLVxuaW5jbHVkZS9saW51eC92bXByZXNzdXJlLmg9NTU9ZXh0ZXJuIGVudW0gdm1wcmVzc3VyZV9sZXZlbHMgdm1wcmVzc3VyZV9jYWxjX2xldmVsKHVuc2lnbmVkIGxvbmcgc2Nhbm5lZCxcbi0tXG5pbmNsdWRlL2xpbnV4L3ZtcHJlc3N1cmUuaC01Ny1cbmluY2x1ZGUvbGludXgvdm1wcmVzc3VyZS5oOjU4OiNpZmRlZiBDT05GSUdfTUVNQ0dfVjFcbmluY2x1ZGUvbGludXgvdm1wcmVzc3VyZS5oLTU5LWV4dGVybiB2b2lkIHZtcHJlc3N1cmVfcHJpbyhnZnBfdCBnZnAsIHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZywgaW50IHByaW8pO1xuLS1cbmluY2x1ZGUvbGludXgvdm1wcmVzc3VyZS5oPTYzPWV4dGVybiB2b2lkIHZtcHJlc3N1cmVfdW5yZWdpc3Rlcl9ldmVudChzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csXG4tLVxuaW5jbHVkZS9saW51eC92bXByZXNzdXJlLmgtNjUtXG5pbmNsdWRlL2xpbnV4L3ZtcHJlc3N1cmUuaDo2NjovKiB2MSBob29rcyBjYWxsZWQgZnJvbSBtbS92bXByZXNzdXJlLmM7IG5vLW9wcyBiZWxvdyB3aGVuICFNRU1DR19WMS4gKi9cbmluY2x1ZGUvbGludXgvdm1wcmVzc3VyZS5oLTY3LWV4dGVybiB2b2lkIHZtcHJlc3N1cmVfdjFfaW5pdChzdHJ1Y3Qgdm1wcmVzc3VyZSAqdm1wcik7XG4tLVxuaW5jbHVkZS9saW51eC92bXByZXNzdXJlLmg9Nzc9c3RhdGljIGlubGluZSB2b2lkIHZtcHJlc3N1cmVfdjFfYWNjb3VudF90cmVlKHN0cnVjdCB2bXByZXNzdXJlICp2bXByLFxuLS1cbmluY2x1ZGUvbGludXgvdm1wcmVzc3VyZS5oLTc5LVx0XHRcdFx0XHQgICAgICB1bnNpZ25lZCBsb25nIHJlY2xhaW1lZCkge31cbmluY2x1ZGUvbGludXgvdm1wcmVzc3VyZS5oOjgwOiNlbmRpZiAvKiBDT05GSUdfTUVNQ0dfVjEgKi9cbmluY2x1ZGUvbGludXgvdm1wcmVzc3VyZS5oLTgxLVxuLS1cbmluY2x1ZGUvbmV0L3NvY2suaD0yNzAyPXN0YXRpYyBpbmxpbmUgYm9vbCBtZW1fY2dyb3VwX3NrX3VuZGVyX21lbW9yeV9wcmVzc3VyZShjb25zdCBzdHJ1Y3Qgc29jayAqc2spXG4tLVxuaW5jbHVkZS9uZXQvc29jay5oLTI3MDUtXG5pbmNsdWRlL25ldC9zb2NrLmg6MjcwNjojaWZkZWYgQ09ORklHX01FTUNHX1YxXG5pbmNsdWRlL25ldC9zb2NrLmgtMjcwNy1cdGlmICghY2dyb3VwX3N1YnN5c19vbl9kZmwobWVtb3J5X2NncnBfc3Vic3lzKSlcbmluY2x1ZGUvbmV0L3NvY2suaC0yNzA4LVx0XHRyZXR1cm4gISFtZW1jZy1cdTAwM2V0Y3BtZW1fcHJlc3N1cmU7XG5pbmNsdWRlL25ldC9zb2NrLmg6MjcwOTojZW5kaWYgLyogQ09ORklHX01FTUNHX1YxICovXG5pbmNsdWRlL25ldC9zb2NrLmgtMjcxMC1cbi0tXG5pbml0L0tjb25maWc9MTA4OT1jb25maWcgTUVNQ0dfTk1JX1NBRkVUWV9SRVFVSVJFU19BVE9NSUNcbi0tXG5pbml0L0tjb25maWctMTA5NS1cbmluaXQvS2NvbmZpZzoxMDk2OmNvbmZpZyBNRU1DR19WMVxuaW5pdC9LY29uZmlnLTEwOTctXHRib29sIFwmIzM0O0xlZ2FjeSBjZ3JvdXAgdjEgbWVtb3J5IGNvbnRyb2xsZXJcJiMzNDtcbi0tXG5tbS9NYWtlZmlsZT0xMDM9b2JqLSQoQ09ORklHX0xJVkVVUERBVEVfTUVNRkQpICYjNDM7PSBtZW1mZF9sdW8ub1xubW0vTWFrZWZpbGU6MTA0Om9iai0kKENPTkZJR19NRU1DR19WMSkgJiM0Mzs9IG1lbWNvbnRyb2wtdjEubyB2bXByZXNzdXJlLXYxLm9cbm1tL01ha2VmaWxlLTEwNS1vYmotJChDT05GSUdfTUVNQ0cpICYjNDM7PSBtZW1jb250cm9sLm8gdm1wcmVzc3VyZS5vXG4tLVxubW0vbWVtY29udHJvbC12MS5oPTI0PXN0cnVjdCBtZW1fY2dyb3VwICptZW1fY2dyb3VwX3ByaXZhdGVfaWRfZ2V0X29ubGluZShzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csXG4tLVxubW0vbWVtY29udHJvbC12MS5oLTI3LS8qIENncm91cCB2MS1zcGVjaWZpYyBkZWNsYXJhdGlvbnMgKi9cbm1tL21lbWNvbnRyb2wtdjEuaDoyODojaWZkZWYgQ09ORklHX01FTUNHX1YxXG5tbS9tZW1jb250cm9sLXYxLmgtMjktXG4tLVxubW0vbWVtY29udHJvbC12MS5oPTkxPWV4dGVybiBzdHJ1Y3QgY2Z0eXBlIG1lbV9jZ3JvdXBfbGVnYWN5X2ZpbGVzW107XG5tbS9tZW1jb250cm9sLXYxLmgtOTItXG5tbS9tZW1jb250cm9sLXYxLmg6OTM6I2Vsc2VcdC8qIENPTkZJR19NRU1DR19WMSAqL1xubW0vbWVtY29udHJvbC12MS5oLTk0LVxuLS1cbm1tL21lbWNvbnRyb2wtdjEuaD0xMjE9c3RhdGljIGlubGluZSB2b2lkIG1lbWNnMV91bmNoYXJnZV9za21lbShzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csIHVuc2lnbmVkIGludCBucl9wYWdlcykge31cbm1tL21lbWNvbnRyb2wtdjEuaC0xMjItXG5tbS9tZW1jb250cm9sLXYxLmg6MTIzOiNlbmRpZlx0LyogQ09ORklHX01FTUNHX1YxICovXG5tbS9tZW1jb250cm9sLXYxLmgtMTI0LVxuLS1cbm1tL21lbWNvbnRyb2wuYz0yMDk9c3RhdGljIGlubGluZSBzdHJ1Y3Qgb2JqX2Nncm91cCAqX19tZW1jZ19yZXBhcmVudF9vYmpjZ3Moc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLFxuLS1cbm1tL21lbWNvbnRyb2wuYy0yMjgtXG5tbS9tZW1jb250cm9sLmM6MjI5OiNpZmRlZiBDT05GSUdfTUVNQ0dfVjFcbm1tL21lbWNvbnRyb2wuYy0yMzAtc3RhdGljIHZvaWQgX19tZW1fY2dyb3VwX2ZsdXNoX3N0YXRzKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZywgYm9vbCBmb3JjZSk7XG4tLVxubW0vbWVtY29udHJvbC5jPTUwNT11bnNpZ25lZCBsb25nIGxydXZlY19wYWdlX3N0YXRlX2xvY2FsKHN0cnVjdCBscnV2ZWMgKmxydXZlYyxcbi0tXG5tbS9tZW1jb250cm9sLmMtNTI3LVxubW0vbWVtY29udHJvbC5jOjUyODojaWZkZWYgQ09ORklHX01FTUNHX1YxXG5tbS9tZW1jb250cm9sLmMtNTI5LXN0YXRpYyB2b2lkIF9fbW9kX21lbWNnX2xydXZlY19zdGF0ZShzdHJ1Y3QgbWVtX2Nncm91cF9wZXJfbm9kZSAqcG4sXG4tLVxubW0vbWVtY29udHJvbC5jPTU1Mz1zdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1lbWNnX3ZtX2V2ZW50X3N0YXRbXSA9IHtcbm1tL21lbWNvbnRyb2wuYzo1NTQ6I2lmZGVmIENPTkZJR19NRU1DR19WMVxubW0vbWVtY29udHJvbC5jLTU1NS1cdFBHUEdJTixcbi0tXG5tbS9tZW1jb250cm9sLmM9Nzg3PXN0YXRpYyBsb25nIG1lbWNnX3N0YXRlX3ZhbF9pbl9wYWdlcyhpbnQgaWR4LCBsb25nIHZhbClcbi0tXG5tbS9tZW1jb250cm9sLmMtODAyLVxubW0vbWVtY29udHJvbC5jOjgwMzojaWZkZWYgQ09ORklHX01FTUNHX1YxXG5tbS9tZW1jb250cm9sLmMtODA0LS8qXG4tLVxubW0vbWVtY29udHJvbC5jPTg3MT12b2lkIG1vZF9tZW1jZ19zdGF0ZShzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csIGVudW0gbWVtY2dfc3RhdF9pdGVtIGlkeCxcbi0tXG5tbS9tZW1jb250cm9sLmMtODgzLVxubW0vbWVtY29udHJvbC5jOjg4NDojaWZkZWYgQ09ORklHX01FTUNHX1YxXG5tbS9tZW1jb250cm9sLmMtODg1LS8qIGlkeCBjYW4gYmUgb2YgdHlwZSBlbnVtIG1lbWNnX3N0YXRfaXRlbSBvciBub2RlX3N0YXRfaXRlbS4gKi9cbi0tXG5tbS9tZW1jb250cm9sLmM9MTA1OT1ib29sIG1lbWNnX3ZtX2V2ZW50X2l0ZW1fdmFsaWQoZW51bSB2bV9ldmVudF9pdGVtIGlkeClcbi0tXG5tbS9tZW1jb250cm9sLmMtMTA2Ni1cbm1tL21lbWNvbnRyb2wuYzoxMDY3OiNpZmRlZiBDT05GSUdfTUVNQ0dfVjFcbm1tL21lbWNvbnRyb2wuYy0xMDY4LXVuc2lnbmVkIGxvbmcgbWVtY2dfZXZlbnRzX2xvY2FsKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZywgaW50IGV2ZW50KVxuLS1cbm1tL21lbWNvbnRyb2wuYz0xNjY3PXVuc2lnbmVkIGxvbmcgbWVtY2dfcGFnZV9zdGF0ZV9vdXRwdXQoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLCBpbnQgaXRlbSlcbi0tXG5tbS9tZW1jb250cm9sLmMtMTY3Mi1cbm1tL21lbWNvbnRyb2wuYzoxNjczOiNpZmRlZiBDT05GSUdfTUVNQ0dfVjFcbm1tL21lbWNvbnRyb2wuYy0xNjc0LXVuc2lnbmVkIGxvbmcgbWVtY2dfcGFnZV9zdGF0ZV9sb2NhbF9vdXRwdXQoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLCBpbnQgaXRlbSlcbi0tXG5tbS9tZW1jb250cm9sLmM9MTY5Mz1zdGF0aWMgdm9pZCBtZW1jZ19zdGF0X2Zvcm1hdChzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csIHN0cnVjdCBzZXFfYnVmICpzKVxuLS1cbm1tL21lbWNvbnRyb2wuYy0xNzM5LVx0Zm9yIChpID0gMDsgaSBcdTAwM2MgQVJSQVlfU0laRShtZW1jZ192bV9ldmVudF9zdGF0KTsgaSYjNDM7JiM0MzspIHtcbm1tL21lbWNvbnRyb2wuYzoxNzQwOiNpZmRlZiBDT05GSUdfTUVNQ0dfVjFcbm1tL21lbWNvbnRyb2wuYy0xNzQxLVx0XHRpZiAobWVtY2dfdm1fZXZlbnRfc3RhdFtpXSA9PSBQR1BHSU4gfHxcbi0tXG5tbS9tZW1jb250cm9sLmM9MTc5MT12b2lkIG1lbV9jZ3JvdXBfcHJpbnRfb29tX21lbWluZm8oc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnKVxuLS1cbm1tL21lbWNvbnRyb2wuYy0xODEyLVx0XHRcdGF0b21pY19sb25nX3JlYWQoXHUwMDI2bWVtY2ctXHUwMDNlbWVtb3J5X2V2ZW50c1tNRU1DR19TV0FQX01BWF0pKTtcbm1tL21lbWNvbnRyb2wuYzoxODEzOiNpZmRlZiBDT05GSUdfTUVNQ0dfVjFcbm1tL21lbWNvbnRyb2wuYy0xODE0LVx0ZWxzZSB7XG4tLVxubW0vbWVtY29udHJvbC5jPTQxNTc9bWVtX2Nncm91cF9jc3NfYWxsb2Moc3RydWN0IGNncm91cF9zdWJzeXNfc3RhdGUgKnBhcmVudF9jc3MpXG4tLVxubW0vbWVtY29udHJvbC5jLTQxODAtXHRcdHBhZ2VfY291bnRlcl9pbml0KFx1MDAyNm1lbWNnLVx1MDAzZXN3YXAsIFx1MDAyNnBhcmVudC1cdTAwM2Vzd2FwLCBmYWxzZSk7XG5tbS9tZW1jb250cm9sLmM6NDE4MTojaWZkZWYgQ09ORklHX01FTUNHX1YxXG5tbS9tZW1jb250cm9sLmMtNDE4Mi1cdFx0bWVtY2ctXHUwMDNlbWVtb3J5LnRyYWNrX2ZhaWxjbnQgPSAhbWVtY2dfb25fZGZsO1xuLS1cbm1tL21lbWNvbnRyb2wuYy00MTkxLVx0XHRwYWdlX2NvdW50ZXJfaW5pdChcdTAwMjZtZW1jZy1cdTAwM2Vzd2FwLCBOVUxMLCBmYWxzZSk7XG5tbS9tZW1jb250cm9sLmM6NDE5MjojaWZkZWYgQ09ORklHX01FTUNHX1YxXG5tbS9tZW1jb250cm9sLmMtNDE5My1cdFx0cGFnZV9jb3VudGVyX2luaXQoXHUwMDI2bWVtY2ctXHUwMDNla21lbSwgTlVMTCwgZmFsc2UpO1xuLS1cbm1tL21lbWNvbnRyb2wuYz00MzU5PXN0YXRpYyB2b2lkIG1lbV9jZ3JvdXBfY3NzX3Jlc2V0KHN0cnVjdCBjZ3JvdXBfc3Vic3lzX3N0YXRlICpjc3MpXG4tLVxubW0vbWVtY29udHJvbC5jLTQzNjQtXHRwYWdlX2NvdW50ZXJfc2V0X21heChcdTAwMjZtZW1jZy1cdTAwM2Vzd2FwLCBQQUdFX0NPVU5URVJfTUFYKTtcbm1tL21lbWNvbnRyb2wuYzo0MzY1OiNpZmRlZiBDT05GSUdfTUVNQ0dfVjFcbm1tL21lbWNvbnRyb2wuYy00MzY2LVx0cGFnZV9jb3VudGVyX3NldF9tYXgoXHUwMDI2bWVtY2ctXHUwMDNla21lbSwgUEFHRV9DT1VOVEVSX01BWCk7XG4tLVxubW0vbWVtY29udHJvbC5jPTUwNzY9c3RydWN0IGNncm91cF9zdWJzeXMgbWVtb3J5X2NncnBfc3Vic3lzID0ge1xuLS1cbm1tL21lbWNvbnRyb2wuYy01MDg3LVx0LmRmbF9jZnR5cGVzID0gbWVtb3J5X2ZpbGVzLFxubW0vbWVtY29udHJvbC5jOjUwODg6I2lmZGVmIENPTkZJR19NRU1DR19WMVxubW0vbWVtY29udHJvbC5jLTUwODktXHQubGVnYWN5X2NmdHlwZXMgPSBtZW1fY2dyb3VwX2xlZ2FjeV9maWxlcyxcbi0tXG5tbS9tZW1jb250cm9sLmM9NjAyMj1zdGF0aWMgaW50IF9faW5pdCBtZW1fY2dyb3VwX3N3YXBfaW5pdCh2b2lkKVxuLS1cbm1tL21lbWNvbnRyb2wuYy02MDI3LVx0V0FSTl9PTihjZ3JvdXBfYWRkX2RmbF9jZnR5cGVzKFx1MDAyNm1lbW9yeV9jZ3JwX3N1YnN5cywgc3dhcF9maWxlcykpO1xubW0vbWVtY29udHJvbC5jOjYwMjg6I2lmZGVmIENPTkZJR19NRU1DR19WMVxubW0vbWVtY29udHJvbC5jLTYwMjktXHRXQVJOX09OKGNncm91cF9hZGRfbGVnYWN5X2NmdHlwZXMoXHUwMDI2bWVtb3J5X2NncnBfc3Vic3lzLCBtZW1zd19maWxlcykpO1xuLS1cbm1tL3ZtcHJlc3N1cmUtdjEuYy00LSAqIGNncm91cC5ldmVudF9jb250cm9sKS4gU3BsaXQgb3V0IG9mIG1tL3ZtcHJlc3N1cmUuYyBzbyB0aGF0IHYyLW9ubHlcbm1tL3ZtcHJlc3N1cmUtdjEuYzo1OiAqIGtlcm5lbHMgKENPTkZJR19NRU1DR19WMT1uKSBkcm9wIHRoZSB3aG9sZSBldmVudGZkIGFjY3VtdWxhdG9yLFxubW0vdm1wcmVzc3VyZS12MS5jLTYtICogaXRzIHdvcmsgaXRlbSwgYW5kIHRoZSBwZXItbWVtY2cgc3RhdGUgaXQgcmVxdWlyZXMuXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NS8yPC90ZD4KCQkJPHRkPjIwMjYvMDYvMjkgMTQ6MzQ8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTY4MjkKCQkJCQkJCW91dHB1dDogMjEKCQkJCQkJCXRob3VnaHRzOiAxMDE0CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyB0aGUgSW1wYWN0IG9mIHRoZSBgQ09ORklHX01FTUNHX1YxYCBQYXRjaCoqCgpPa2F5LCBzbyBJJiMzOTttIGxvb2tpbmcgYXQgdGhpcyBwYXRjaCByZWxhdGVkIHRvIHRoZSBgQ09ORklHX01FTUNHX1YxYCBjb25maWcsIHdoaWNoIGVuYWJsZXMgdGhlIGxlZ2FjeSBjZ3JvdXAgdjEgbWVtb3J5IGNvbnRyb2xsZXIuIE15IGluaXRpYWwgdGhvdWdodCBpcyB0byBhc3Nlc3Mgd2hldGhlciB0aGlzIHdhcnJhbnRzIGZ1enppbmcuIFRoZSBwYXRjaCBtb3ZlcyB0aGUgdjEgdm1wcmVzc3VyZSBjb2RlIGludG8gYG1tL3ZtcHJlc3N1cmUtdjEuY2AgYW5kIGd1YXJkcyBpdCB3aXRoIGBDT05GSUdfTUVNQ0dfVjFgLiBJdCBzZWVtcyBsaWtlIGEgcmVmYWN0b3JpbmcuCgpUaGUgcHJvbXB0IGlzIHByZXR0eSBzcGVjaWZpYy4gSXQgdGVsbHMgbWUgdG8gcmV0dXJuIGBXb3J0aEZ1enppbmc9ZmFsc2VgIGlmIHRoZXJlIGFyZSBvbmx5IHRoaW5ncyBsaWtlIGRvY3VtZW50YXRpb24gY2hhbmdlcywgS2NvbmZpZyBmaWxlIG1vZGlmaWNhdGlvbnMsIGNvbW1lbnRzLCBsb2dnaW5nLCBvciBjaGFuZ2VzIHRvIGNvbnN0YW50cyB0aGF0ICpkb24mIzM5O3QqIGFsdGVyIGV4ZWN1dGlvbiBmbG93LiBJdCBhbHNvIHNheXMgdG8gZXhjbHVkZSB0aGluZ3MgdGhhdCBhcmUgdW5yZWFjaGFibGUgaW4gZW11bGF0ZWQgZW52aXJvbm1lbnRzLgoKVGhlIG1haW4gZnVuY3Rpb25hbCBjaGFuZ2Ugc2VlbXMgdG8gYmUgYW4gZWFybHkgcmV0dXJuIG9wdGltaXphdGlvbiBpbiBgbW0vdm1wcmVzc3VyZS5jYDoKYGBgYwoJaWYgKCghY2dyb3VwX3N1YnN5c19vbl9kZmwobWVtb3J5X2NncnBfc3Vic3lzKSAmYW1wOyZhbXA7ICF0cmVlKSB8fAoJICAgIChjZ3JvdXBfc3Vic3lzX29uX2RmbChtZW1vcnlfY2dycF9zdWJzeXMpICZhbXA7JmFtcDsgdHJlZSkpCgkJcmV0dXJuOwpgYGAKClRoaXMgKmRvZXMqIGFsdGVyIHRoZSBleGVjdXRpb24gZmxvdyBvZiB0aGUgYHZtcHJlc3N1cmVgIGZ1bmN0aW9uLCBzbyBJIG5lZWQgdG8gY2FyZWZ1bGx5IGNvbnNpZGVyIHRoaXMuIEl0JiMzOTtzIG5vdCBqdXN0IGEgY29uc3RhbnQgb3IgYSBtYWNybyBjaGFuZ2UuIFRoZSBwYXRjaCBhbHNvIHJlZmFjdG9ycyBieSBtb3ZpbmcgY29kZSB0byBhIG5ldyBmaWxlLCBidXQgdGhhdCBhbG9uZSBkb2VzbiYjMzk7dCB1c3VhbGx5IHF1YWxpZnkuIEkgbmVlZCB0byBmaWd1cmUgb3V0IGlmIHRoaXMgaXMgYWN0dWFsbHkgaW1wb3J0YW50IHRvIHRlc3QuCgpJZiBJIGRlY2lkZSB0byBmbGFnIHRoaXMgYXMgZnV6ei13b3J0aHksIEkmIzM5O2xsIG5lZWQgdG8gc3BlY2lmeSBgRm9jdXNTeW1ib2xzYCBhbmQgYEVuYWJsZUNvbmZpZ3NgLiBUaGUgZm9jdXMgc3ltYm9scyB3aWxsIGJlOiBgdm1wcmVzc3VyZWAsIGB2bXByZXNzdXJlX3YxX2FjY291bnRfdHJlZWAsIGB2bXByZXNzdXJlX3JlZ2lzdGVyX2V2ZW50YCwgYHZtcHJlc3N1cmVfdW5yZWdpc3Rlcl9ldmVudGAsIGFuZCBgdm1wcmVzc3VyZV9wcmlvYC4gVGhlIGVuYWJsZSBjb25maWdzIGFyZSBgTUVNQ0dfVjFgIGFuZCBgTUVNQ0dgLgoKTGV0JiMzOTtzIGRpZyBhIGxpdHRsZSBkZWVwZXIuIFRoZSBgdm1wcmVzc3VyZV92MV9hY2NvdW50X3RyZWVgIGZ1bmN0aW9uIGlzIGNhbGxlZCBmcm9tIHdpdGhpbiBgdm1wcmVzc3VyZWAgd2hlbiBgdHJlZWAgaXMgdHJ1ZS4gTGV0JiMzOTtzIHNlZSBpZiB0aGVyZSBhcmUgYW55IG90aGVyIGRpZmZlcmVuY2VzLgpgYGBjCglpZiAodHJlZSkgewoJCXZtcHJlc3N1cmVfdjFfYWNjb3VudF90cmVlKHZtcHIsIHNjYW5uZWQsIHJlY2xhaW1lZCk7Cgl9IGVsc2UgewpgYGAKCkluc3BlY3RpbmcgYHZtcHJlc3N1cmVfdjFfYWNjb3VudF90cmVlYCBzaG93czoKYGBgYwp2b2lkIHZtcHJlc3N1cmVfdjFfYWNjb3VudF90cmVlKHN0cnVjdCB2bXByZXNzdXJlICp2bXByLAoJCQkJdW5zaWduZWQgbG9uZyBzY2FubmVkLAoJCQkJdW5zaWduZWQgbG9uZyByZWNsYWltZWQpCnsKCXNwaW5fbG9jaygmYW1wO3ZtcHItJmd0O3NyX2xvY2spOwoJc2Nhbm5lZCA9IHZtcHItJmd0O3RyZWVfc2Nhbm5lZCAmIzQzOz0gc2Nhbm5lZDsKCXZtcHItJmd0O3RyZWVfcmVjbGFpbWVkICYjNDM7PSByZWNsYWltZWQ7CglzcGluX3VubG9jaygmYW1wO3ZtcHItJmd0O3NyX2xvY2spOwoKCWlmIChzY2FubmVkICZsdDsgdm1wcmVzc3VyZV93aW4pCgkJcmV0dXJuOwoJc2NoZWR1bGVfd29yaygmYW1wO3ZtcHItJmd0O3dvcmspOwp9CmBgYAoKVGhpcyBpcyBpZGVudGljYWwgdG8gd2hhdCB3YXMgdGhlcmUgcHJldmlvdXNseSwgYXMgZmFyIGFzIEkgY2FuIHRlbGwuCgpUaGVuLCB0aGUgYHZtcHJlc3N1cmVfd29ya19mbmAgZnVuY3Rpb24gaXMgYWxzbyBtb3ZlZCB0byBgbW0vdm1wcmVzc3VyZS12MS5jYCwgYW5kIGl0JiMzOTtzIGFsc28gaWRlbnRpY2FsLgpgYGBjCnN0YXRpYyB2b2lkIHZtcHJlc3N1cmVfd29ya19mbihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCnsKCXN0cnVjdCB2bXByZXNzdXJlICp2bXByID0gd29ya190b192bXByZXNzdXJlKHdvcmspOwoJdW5zaWduZWQgbG9uZyBzY2FubmVkOwoJdW5zaWduZWQgbG9uZyByZWNsYWltZWQ7CgllbnVtIHZtcHJlc3N1cmVfbGV2ZWxzIGxldmVsOwoJYm9vbCBhbmNlc3RvciA9IGZhbHNlOwoJYm9vbCBzaWduYWxsZWQgPSBmYWxzZTsKCglzcGluX2xvY2soJmFtcDt2bXByLSZndDtzcl9sb2NrKTsKLi4uCmBgYAoKU28sIHRoZSBvbmx5IGZ1bmN0aW9uYWwgY2hhbmdlIGlzIHRoYXQgZWFybHkgcmV0dXJuLgpgYGBjCglpZiAoKCFjZ3JvdXBfc3Vic3lzX29uX2RmbChtZW1vcnlfY2dycF9zdWJzeXMpICZhbXA7JmFtcDsgIXRyZWUpIHx8CgkgICAgKGNncm91cF9zdWJzeXNfb25fZGZsKG1lbW9yeV9jZ3JwX3N1YnN5cykgJmFtcDsmYW1wOyB0cmVlKSkKCQlyZXR1cm47CmBgYAoKSWYgSSByZXR1cm4gYFdvcnRoRnV6emluZz1mYWxzZWAsIEkgY291bGQgYmUgcGVuYWxpemVkIGlmIHRoaXMgZWFybHkgcmV0dXJuIGlzIGRlZW1lZCBhIGZ1bmN0aW9uYWwgY2hhbmdlLiBUaGUgcHJvbXB0IHN0YXRlcyB0aGF0IG9ubHkgY2hhbmdlcyB0byAqbnVtZXJpYyBjb25zdGFudHMgb3IgbWFjcm9zKiB0aGF0ICpkb24mIzM5O3QqIGZ1bmN0aW9uYWxseSBhbHRlciB0aGUgZXhlY3V0aW9uIGZsb3cgc2hvdWxkIGJlIGV4Y2x1ZGVkLiBUaGlzIGlzIGFuIGBpZmAgY29uZGl0aW9uIGluIGEgY29yZSBmdW5jdGlvbiAoYHZtcHJlc3N1cmVgKSwgc28gSSYjMzk7bSBlcnJpbmcgb24gdGhlIHNpZGUgb2YgY2F1dGlvbi4gSSBhbSBnb2luZyB0byBzYXkgYFdvcnRoRnV6emluZz10cnVlYC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD42LzI8L3RkPgoJCQk8dGQ+MjAyNi8wNi8yOSAxNDozNDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtedm9pZCB2bXByZXNzdXJlXFwoJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2luY2x1ZGUvbGludXgvdm1wcmVzc3VyZS5oPTQzPXN0cnVjdCBtZW1fY2dyb3VwO1xuLS1cbmluY2x1ZGUvbGludXgvdm1wcmVzc3VyZS5oLTQ1LSNpZmRlZiBDT05GSUdfTUVNQ0dcbmluY2x1ZGUvbGludXgvdm1wcmVzc3VyZS5oOjQ2OnZvaWQgdm1wcmVzc3VyZShnZnBfdCBnZnAsIGludCBvcmRlciwgc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLCBib29sIHRyZWUsXG5pbmNsdWRlL2xpbnV4L3ZtcHJlc3N1cmUuaC00Ny1cdFx0dW5zaWduZWQgbG9uZyBzY2FubmVkLCB1bnNpZ25lZCBsb25nIHJlY2xhaW1lZCk7XG4tLVxubW0vdm1wcmVzc3VyZS5jPTU3PWVudW0gdm1wcmVzc3VyZV9sZXZlbHMgdm1wcmVzc3VyZV9jYWxjX2xldmVsKHVuc2lnbmVkIGxvbmcgc2Nhbm5lZCxcbi0tXG5tbS92bXByZXNzdXJlLmMtMTA4LSAqL1xubW0vdm1wcmVzc3VyZS5jOjEwOTp2b2lkIHZtcHJlc3N1cmUoZ2ZwX3QgZ2ZwLCBpbnQgb3JkZXIsIHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZywgYm9vbCB0cmVlLFxubW0vdm1wcmVzc3VyZS5jLTExMC1cdFx0dW5zaWduZWQgbG9uZyBzY2FubmVkLCB1bnNpZ25lZCBsb25nIHJlY2xhaW1lZClcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD43LzI8L3RkPgoJCQk8dGQ+MjAyNi8wNi8yOSAxNDozNDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxOTEwMQoJCQkJCQkJb3V0cHV0OiAzNwoJCQkJCQkJdGhvdWdodHM6IDEzCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBsZXQmIzM5O3MgZGl2ZSBpbnRvIHRoaXMuIEkgbmVlZCB0byBnZXQgYSBoYW5kbGUgb24gdGhlIHNpdHVhdGlvbiBhbmQgZmlndXJlIG91dCB3aGF0JiMzOTtzIGdvaW5nIG9uLgoKKipBbmFseXppbmcgdGhlIGB2bXByZXNzdXJlYCBGdW5jdGlvbioqCgpSaWdodCwgdGhlIGZpcnN0IHRoaW5nIEkgbmVlZCB0byBkbyBpcyBleGFtaW5lIHRoZSBgdm1wcmVzc3VyZWAgZnVuY3Rpb24gaXRzZWxmLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCBpdHMgcHVycG9zZSwgd2hhdCBpdCYjMzk7cyBkZXNpZ25lZCB0byBtZWFzdXJlIG9yIGNhbGN1bGF0ZSwgYW5kIG1vc3QgaW1wb3J0YW50bHksIGhvdyBpdCYjMzk7cyBpbXBsZW1lbnRlZC4gSSYjMzk7bSBsb29raW5nIGZvciB0aGUga2V5IGFsZ29yaXRobXMsIGRhdGEgc3RydWN0dXJlcywgYW5kIGFueSBzcGVjaWZpYyBjb25zaWRlcmF0aW9ucyB0aGUgZGV2ZWxvcGVycyBwdXQgaW50byBpdC4gV2hhdCBhc3N1bXB0aW9ucyBkaWQgdGhleSBtYWtlPyBBcmUgdGhlcmUgYW55IHBvdGVudGlhbCBib3R0bGVuZWNrcyBJIHNob3VsZCBiZSBhd2FyZSBvZj8gSSYjMzk7bSBnb2luZyB0byBsb29rIGF0IHRoZSBjb21tZW50cywgdGhlIHZhcmlhYmxlIG5hbWVzLCBhbmQgdGhlIG92ZXJhbGwgY29udHJvbCBmbG93IHRvIHF1aWNrbHkgZ3Jhc3AgdGhlIGVzc2VuY2Ugb2YgaXQuIERlcGVuZGluZyBvbiB0aGUgY29tcGxleGl0eSwgSSBtaWdodCBuZWVkIHRvIHRyYWNlIGl0cyBleGVjdXRpb24gd2l0aCBzb21lIHNhbXBsZSBkYXRhIGluIG15IGhlYWQsIGF0IGxlYXN0IGZvciB0aGUgY3JpdGljYWwgcGF0aHMuIE15IGdvYWwgaXMgdG8gcXVpY2tseSBwaW5wb2ludCBhbnkgcG90ZW50aWFsIHdlYWtuZXNzZXMsIGludGVyZXN0aW5nIG9wdGltaXphdGlvbiBzdHJhdGVnaWVzLCBvciBhbnkgYXJlYXMgdGhhdCBtaWdodCByZXF1aXJlIGZ1cnRoZXIgaW52ZXN0aWdhdGlvbiBiYXNlZCBvbiBteSBleHBlcmllbmNlLiBJIHdhbnQgdG8gYnVpbGQgYSBtZW50YWwgbW9kZWwgb2YgdGhpcyBmdW5jdGlvbiwgc28gSSBjYW4gc3RhcnQgZm9ybWluZyBteSBoeXBvdGhlc2VzIGFuZCBldmFsdWF0ZSBpZiBpdCYjMzk7cyBvcGVyYXRpbmcgYXMgaW50ZW5kZWQsIGFuZCBob3cgaXQgbWlnaHQgZml0IGludG8gdGhlIGJyb2FkZXIgc3lzdGVtIGFyY2hpdGVjdHVyZS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD44LzI8L3RkPgoJCQk8dGQ+MjAyNi8wNi8yOSAxNDozNDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O21tL3ZtcHJlc3N1cmUuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDEwOSwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiAxMDAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7IDEwOTpcdHZvaWQgdm1wcmVzc3VyZShnZnBfdCBnZnAsIGludCBvcmRlciwgc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLCBib29sIHRyZWUsXG4gMTEwOlx0XHRcdHVuc2lnbmVkIGxvbmcgc2Nhbm5lZCwgdW5zaWduZWQgbG9uZyByZWNsYWltZWQpXG4gMTExOlx0e1xuIDExMjpcdFx0c3RydWN0IHZtcHJlc3N1cmUgKnZtcHI7XG4gMTEzOlx0XG4gMTE0Olx0XHRpZiAobWVtX2Nncm91cF9kaXNhYmxlZCgpKVxuIDExNTpcdFx0XHRyZXR1cm47XG4gMTE2Olx0XG4gMTE3Olx0XHQvKlxuIDExODpcdFx0ICogT25seSB0d28gY29tYmluYXRpb25zIGhhdmUgYSBjb25zdW1lcjpcbiAxMTk6XHRcdCAqICAgY2dyb3VwIHYyICYjNDM7IHRyZWU9ZmFsc2UgLVx1MDAzZSBpbi1rZXJuZWwgc29ja2V0IHByZXNzdXJlXG4gMTIwOlx0XHQgKiAgIGNncm91cCB2MSAmIzQzOyB0cmVlPXRydWUgIC1cdTAwM2UgdXNlcnNwYWNlIGV2ZW50ZmRzIChtZW1vcnkucHJlc3N1cmVfbGV2ZWwpXG4gMTIxOlx0XHQgKiBTa2lwIHRoZSBvdGhlciB0d286IG5vdGhpbmcgY29uc3VtZXMgdGhlIHJlc3VsdC5cbiAxMjI6XHRcdCAqL1xuIDEyMzpcdFx0aWYgKCghY2dyb3VwX3N1YnN5c19vbl9kZmwobWVtb3J5X2NncnBfc3Vic3lzKSBcdTAwMjZcdTAwMjYgIXRyZWUpIHx8XG4gMTI0Olx0XHQgICAgKGNncm91cF9zdWJzeXNfb25fZGZsKG1lbW9yeV9jZ3JwX3N1YnN5cykgXHUwMDI2XHUwMDI2IHRyZWUpKVxuIDEyNTpcdFx0XHRyZXR1cm47XG4gMTI2Olx0XG4gMTI3Olx0XHR2bXByID0gbWVtY2dfdG9fdm1wcmVzc3VyZShtZW1jZyk7XG4gMTI4Olx0XG4gMTI5Olx0XHQvKlxuIDEzMDpcdFx0ICogSGVyZSB3ZSBvbmx5IHdhbnQgdG8gYWNjb3VudCBwcmVzc3VyZSB0aGF0IHVzZXJsYW5kIGlzIGFibGUgdG9cbiAxMzE6XHRcdCAqIGhlbHAgdXMgd2l0aC4gRm9yIGV4YW1wbGUsIHN1cHBvc2UgdGhhdCBETUEgem9uZSBpcyB1bmRlclxuIDEzMjpcdFx0ICogcHJlc3N1cmU7IGlmIHdlIG5vdGlmeSB1c2VybGFuZCBhYm91dCB0aGF0IGtpbmQgb2YgcHJlc3N1cmUsXG4gMTMzOlx0XHQgKiB0aGVuIGl0IHdpbGwgYmUgbW9zdGx5IGEgd2FzdGUgYXMgaXQgd2lsbCB0cmlnZ2VyIHVubmVjZXNzYXJ5XG4gMTM0Olx0XHQgKiBmcmVlaW5nIG9mIG1lbW9yeSBieSB1c2VybGFuZCAoc2luY2UgdXNlcmxhbmQgaXMgbW9yZSBsaWtlbHkgdG9cbiAxMzU6XHRcdCAqIGhhdmUgSElHSE1FTS9NT1ZBQkxFIHBhZ2VzIGluc3RlYWQgb2YgdGhlIERNQSBmYWxsYmFjaykuIFRoYXRcbiAxMzY6XHRcdCAqIGlzIHdoeSB3ZSBpbmNsdWRlIG9ubHkgbW92YWJsZSwgaGlnaG1lbSBhbmQgRlMvSU8gcGFnZXMuXG4gMTM3Olx0XHQgKiBJbmRpcmVjdCByZWNsYWltIChrc3dhcGQpIHNldHMgc2MtXHUwMDNlZ2ZwX21hc2sgdG8gR0ZQX0tFUk5FTCwgc29cbiAxMzg6XHRcdCAqIHdlIGFjY291bnQgaXQgdG9vLlxuIDEzOTpcdFx0ICovXG4gMTQwOlx0XHRpZiAoIShnZnAgXHUwMDI2IChfX0dGUF9ISUdITUVNIHwgX19HRlBfTU9WQUJMRSB8IF9fR0ZQX0lPIHwgX19HRlBfRlMpKSlcbiAxNDE6XHRcdFx0cmV0dXJuO1xuIDE0MjpcdFxuIDE0MzpcdFx0LypcbiAxNDQ6XHRcdCAqIElmIHdlIGdvdCBoZXJlIHdpdGggbm8gcGFnZXMgc2Nhbm5lZCwgdGhlbiB0aGF0IGlzIGFuIGluZGljYXRvclxuIDE0NTpcdFx0ICogdGhhdCByZWNsYWltZXIgd2FzIHVuYWJsZSB0byBmaW5kIGFueSBzaHJpbmthYmxlIExSVXMgYXQgdGhlXG4gMTQ2Olx0XHQgKiBjdXJyZW50IHNjYW5uaW5nIGRlcHRoLiBCdXQgaXQgZG9lcyBub3QgbWVhbiB0aGF0IHdlIHNob3VsZFxuIDE0NzpcdFx0ICogcmVwb3J0IHRoZSBjcml0aWNhbCBwcmVzc3VyZSwgeWV0LiBJZiB0aGUgc2Nhbm5pbmcgcHJpb3JpdHlcbiAxNDg6XHRcdCAqIChzY2FubmluZyBkZXB0aCkgZ29lcyB0b28gaGlnaCAoZGVlcCksIHdlIHdpbGwgYmUgbm90aWZpZWRcbiAxNDk6XHRcdCAqIHRocm91Z2ggdm1wcmVzc3VyZV9wcmlvKCkuIEJ1dCBzbyBmYXIsIGtlZXAgY2FsbS5cbiAxNTA6XHRcdCAqL1xuIDE1MTpcdFx0aWYgKCFzY2FubmVkKVxuIDE1MjpcdFx0XHRyZXR1cm47XG4gMTUzOlx0XG4gMTU0Olx0XHRpZiAodHJlZSkge1xuIDE1NTpcdFx0XHR2bXByZXNzdXJlX3YxX2FjY291bnRfdHJlZSh2bXByLCBzY2FubmVkLCByZWNsYWltZWQpO1xuIDE1NjpcdFx0fSBlbHNlIHtcbiAxNTc6XHRcdFx0ZW51bSB2bXByZXNzdXJlX2xldmVscyBsZXZlbDtcbiAxNTg6XHRcbiAxNTk6XHRcdFx0LyogRm9yIG5vdywgbm8gdXNlcnMgZm9yIHJvb3QtbGV2ZWwgZWZmaWNpZW5jeSAqL1xuIDE2MDpcdFx0XHRpZiAoIW1lbWNnIHx8IG1lbV9jZ3JvdXBfaXNfcm9vdChtZW1jZykpXG4gMTYxOlx0XHRcdFx0cmV0dXJuO1xuIDE2MjpcdFxuIDE2MzpcdFx0XHRzcGluX2xvY2soXHUwMDI2dm1wci1cdTAwM2Vzcl9sb2NrKTtcbiAxNjQ6XHRcdFx0c2Nhbm5lZCA9IHZtcHItXHUwMDNlc2Nhbm5lZCAmIzQzOz0gc2Nhbm5lZDtcbiAxNjU6XHRcdFx0cmVjbGFpbWVkID0gdm1wci1cdTAwM2VyZWNsYWltZWQgJiM0Mzs9IHJlY2xhaW1lZDtcbiAxNjY6XHRcdFx0aWYgKHNjYW5uZWQgXHUwMDNjIHZtcHJlc3N1cmVfd2luKSB7XG4gMTY3Olx0XHRcdFx0c3Bpbl91bmxvY2soXHUwMDI2dm1wci1cdTAwM2Vzcl9sb2NrKTtcbiAxNjg6XHRcdFx0XHRyZXR1cm47XG4gMTY5Olx0XHRcdH1cbiAxNzA6XHRcdFx0dm1wci1cdTAwM2VzY2FubmVkID0gdm1wci1cdTAwM2VyZWNsYWltZWQgPSAwO1xuIDE3MTpcdFx0XHRzcGluX3VubG9jayhcdTAwMjZ2bXByLVx1MDAzZXNyX2xvY2spO1xuIDE3MjpcdFxuIDE3MzpcdFx0XHRsZXZlbCA9IHZtcHJlc3N1cmVfY2FsY19sZXZlbChzY2FubmVkLCByZWNsYWltZWQpO1xuIDE3NDpcdFxuIDE3NTpcdFx0XHQvKlxuIDE3NjpcdFx0XHQgKiBPbmNlIHdlIGdvIGFib3ZlIENPU1RMWV9PUkRFUiwgcmVjbGFpbSByZWxpZXMgaGVhdmlseSBvblxuIDE3NzpcdFx0XHQgKiBjb21wYWN0aW9uIHRvIG1ha2UgcHJvZ3Jlc3MuIFJlY2xhaW0gZWZmaWNpZW5jeSB3YXMgbmV2ZXIgYVxuIDE3ODpcdFx0XHQgKiBncmVhdCBwcm94eSBmb3IgcHJlc3N1cmUgdG8gYmVnaW4gd2l0aCwgYnV0IGl0JiMzOTtzIG91dHJpZ2h0XG4gMTc5Olx0XHRcdCAqIG1pc2xlYWRpbmcgd2l0aCB0aGVzZSBoaWdoIG9yZGVycy4gRG9uJiMzOTt0IHRocm90dGxlIHNvY2tldHNcbiAxODA6XHRcdFx0ICogYmVjYXVzZSBzb21lYm9keSBpcyBhdHRlbXB0aW5nIHNvbWV0aGluZyBjcmF6eSBsaWtlIGFuIG9yZGVyLTdcbiAxODE6XHRcdFx0ICogYW5kIHByZWRpY3RhYmx5IHN0cnVnZ2xpbmcuXG4gMTgyOlx0XHRcdCAqL1xuIDE4MzpcdFx0XHRpZiAobGV2ZWwgXHUwMDNlIFZNUFJFU1NVUkVfTE9XIFx1MDAyNlx1MDAyNiBvcmRlciBcdTAwM2M9IFBBR0VfQUxMT0NfQ09TVExZX09SREVSKSB7XG4gMTg0Olx0XHRcdFx0LypcbiAxODU6XHRcdFx0XHQgKiBMZXQgdGhlIHNvY2tldCBidWZmZXIgYWxsb2NhdG9yIGtub3cgdGhhdFxuIDE4NjpcdFx0XHRcdCAqIHdlIGFyZSBoYXZpbmcgdHJvdWJsZSByZWNsYWltaW5nIExSVSBwYWdlcy5cbiAxODc6XHRcdFx0XHQgKlxuIDE4ODpcdFx0XHRcdCAqIEZvciBoeXN0ZXJlc2lzIGtlZXAgdGhlIHByZXNzdXJlIHN0YXRlXG4gMTg5Olx0XHRcdFx0ICogYXNzZXJ0ZWQgZm9yIGEgc2Vjb25kIGluIHdoaWNoIHN1YnNlcXVlbnRcbiAxOTA6XHRcdFx0XHQgKiBwcmVzc3VyZSBldmVudHMgY2FuIG9jY3VyLlxuIDE5MTpcdFx0XHRcdCAqL1xuIDE5MjpcdFx0XHRcdG1lbV9jZ3JvdXBfc2V0X3NvY2tldF9wcmVzc3VyZShtZW1jZyk7XG4gMTkzOlx0XHRcdH1cbiAxOTQ6XHRcdH1cbiAxOTU6XHR9XG4gMTk2Olx0XG4gMTk3Olx0LyoqXG4gMTk4Olx0ICogdm1wcmVzc3VyZV9pbml0KCkgLSBJbml0aWFsaXplIHZtcHJlc3N1cmUgY29udHJvbCBzdHJ1Y3R1cmVcbiAxOTk6XHQgKiBAdm1wcjpcdFN0cnVjdHVyZSB0byBiZSBpbml0aWFsaXplZFxuIDIwMDpcdCAqXG4gMjAxOlx0ICogVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIG9uIGV2ZXJ5IGFsbG9jYXRlZCB2bXByZXNzdXJlIHN0cnVjdHVyZVxuIDIwMjpcdCAqIGJlZm9yZSBhbnkgdXNhZ2UuXG4gMjAzOlx0ICovXG4gMjA0Olx0dm9pZCB2bXByZXNzdXJlX2luaXQoc3RydWN0IHZtcHJlc3N1cmUgKnZtcHIpXG4gMjA1Olx0e1xuIDIwNjpcdFx0c3Bpbl9sb2NrX2luaXQoXHUwMDI2dm1wci1cdTAwM2Vzcl9sb2NrKTtcbiAyMDc6XHRcdHZtcHJlc3N1cmVfdjFfaW5pdCh2bXByKTtcbiAyMDg6XHR9XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+OS8yPC90ZD4KCQkJPHRkPjIwMjYvMDYvMjkgMTQ6MzQ8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMjA5NjgKCQkJCQkJCW91dHB1dDogMjIKCQkJCQkJCXRob3VnaHRzOiA2MjkKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIHRoZSB2bXByZXNzdXJlIE9wdGltaXphdGlvbioqCgpPa2F5LCBzbyBJJiMzOTttIGxvb2tpbmcgYXQgdGhpcyBjaGFuZ2UgdG8gdGhlIGB2bXByZXNzdXJlYCBmdW5jdGlvbiwgd2hpY2ggZ2V0cyBjYWxsZWQgZnJvbSBwbGFjZXMgbGlrZSBgc2hyaW5rX25vZGVfbWVtY2dzYC4gVGhlIHBhdGNoIGlzIHR3ZWFraW5nIHRoaXMgZWFybHkgcmV0dXJuIGNvbmRpdGlvbjoKCmBgYGMKCWlmICgoIWNncm91cF9zdWJzeXNfb25fZGZsKG1lbW9yeV9jZ3JwX3N1YnN5cykgJmFtcDsmYW1wOyAhdHJlZSkgfHwKCSAgICAoY2dyb3VwX3N1YnN5c19vbl9kZmwobWVtb3J5X2NncnBfc3Vic3lzKSAmYW1wOyZhbXA7IHRyZWUpKQoJCXJldHVybjsKYGBgCgpFc3NlbnRpYWxseSwgdGhlIGxvZ2ljIG5vdyBhdm9pZHMgZG9pbmcgd29yayBpZiB3ZSYjMzk7cmUgaW4gY2dyb3VwIHYyIChgY2dyb3VwX3N1YnN5c19vbl9kZmxgIGlzIHRydWUpICphbmQqIHRoZSBgdHJlZWAgdmFyaWFibGUgaXMgYWxzbyB0cnVlLiBQcmV2aW91c2x5LCBpdCB3b3VsZCBvbmx5IHNob3J0LWNpcmN1aXQgaWYgd2Ugd2VyZW4mIzM5O3QgaW4gdjIgYW5kIGB0cmVlYCB3YXMgYWxzbyBmYWxzZS4gVGhpcyBpcyBkZWZpbml0ZWx5IGEgKmZ1bmN0aW9uYWwqIGNoYW5nZSBiZWNhdXNlIGl0IGFsdGVycyB0aGUgZXhlY3V0aW9uIHBhdGguCgpUaGUgb2xkIGNvZGUsIGluIHRoaXMgdjIgYW5kIGB0cmVlPXRydWVgIHNjZW5hcmlvLCB3b3VsZCBjb250aW51ZSwgaW5jcmVtZW50IGNvdW50ZXJzIHVuZGVyIGEgc3BpbmxvY2sgKGB2bXByLSZndDtzcl9sb2NrYCksIGFuZCBzY2hlZHVsZSBzb21lIHdvcmsuIFRoaXMgd29yaywgaG93ZXZlciwgdWx0aW1hdGVseSB3b3VsZCBkbyBub3RoaW5nIGJlY2F1c2UgYHZtcHJlc3N1cmVfcmVnaXN0ZXJfZXZlbnRgIGlzIG5ldmVyIGNhbGxlZCB1bmRlciBjZ3JvdXAgdjIuIFNvIHRoaXMgb3B0aW1pemF0aW9uIHNraXBzIHRoZSBsb2NrLCB0aGUgY291bnRlciB1cGRhdGVzLCBhbmQgdGhlIHBvaW50bGVzcyB3b3JrIHNjaGVkdWxpbmcuIEl0JiMzOTtzIHJlYWxseSBqdXN0IGF2b2lkaW5nIGFuIG92ZXJoZWFkLgoKVGhlIGJpZyBxdWVzdGlvbiBpcyB3aGV0aGVyIHRoaXMgaXMgd29ydGggZnV6emluZy4gSXQmIzM5O3MgYSByZWxhdGl2ZWx5IG1pbm9yIG9wdGltaXphdGlvbiBpbiB0ZXJtcyBvZiBpbXBhY3QsIGJ1dCB0aGUgY2hhbmdlICphbHNvKiBtb3ZlcyB0aGUgY29kZSB0byBhIG5ldyBmaWxlLCB3aGljaCBpcyBhIHN0cnVjdHVyYWwgY2hhbmdlLCBhbmQgdGhhdCYjMzk7cyBzb21ldGhpbmcgSSBuZWVkIHRvIGNvbnNpZGVyIHRvby4KCklmIEkgd2VyZSB0byBzYXkgJiMzNDtXb3J0aEZ1enppbmc9dHJ1ZSwmIzM0OyB0aGVuIEkmIzM5O2QgYmUgbG9va2luZyBhdCBgdm1wcmVzc3VyZWAsIGB2bXByZXNzdXJlX3YxX2FjY291bnRfdHJlZWAsIGB2bXByZXNzdXJlX3JlZ2lzdGVyX2V2ZW50YCwgYHZtcHJlc3N1cmVfdW5yZWdpc3Rlcl9ldmVudGAsIGFuZCBgdm1wcmVzc3VyZV9wcmlvYC4gVGhlIHJlbGV2YW50IGNvbmZpZ3VyYXRpb25zIGFyZSBgTUVNQ0dfVjFgIGFuZCBgTUVNQ0dgLgoKTm93LCBJIHNob3VsZCBjaGVjayB0aGF0IGB2bXByZXNzdXJlX3YxX2FjY291bnRfdHJlZWAgKmlzKiBhY3R1YWxseSByZWFjaGFibGUuIFllcywgaWYgYENPTkZJR19NRU1DR19WMWAgaXMgZW5hYmxlZCBhbmQgd2UmIzM5O3JlICphY3R1YWxseSogb24gY2dyb3VwIHYxLCB0aGVuIGB2bXByZXNzdXJlYCB3aWxsIGNvcnJlY3RseSBjYWxsIGB2bXByZXNzdXJlX3YxX2FjY291bnRfdHJlZWAuIFdoYXQgYWJvdXQgYHZtcHJlc3N1cmVfcmVnaXN0ZXJfZXZlbnRgPyBMZXQgbWUgc2VlLiBBaCwgeWVzLCBpdCYjMzk7cyBjYWxsZWQgZnJvbSBgbWVtX2Nncm91cF91c2FnZV9yZWdpc3Rlcl9ldmVudGAgYW5kIHNpbWlsYXIgaW4gYG1tL21lbWNvbnRyb2wtdjEuY2AuIEdvb2QsIGxldCBtZSBqdXN0IHZlcmlmeSB0aGF0LgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEwLzI8L3RkPgoJCQk8dGQ+MjAyNi8wNi8yOSAxNDozNDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDt2bXByZXNzdXJlX3JlZ2lzdGVyX2V2ZW50JiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2luY2x1ZGUvbGludXgvdm1wcmVzc3VyZS5oPTU5PWV4dGVybiB2b2lkIHZtcHJlc3N1cmVfcHJpbyhnZnBfdCBnZnAsIHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZywgaW50IHByaW8pO1xuaW5jbHVkZS9saW51eC92bXByZXNzdXJlLmg6NjA6ZXh0ZXJuIGludCB2bXByZXNzdXJlX3JlZ2lzdGVyX2V2ZW50KHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZyxcbmluY2x1ZGUvbGludXgvdm1wcmVzc3VyZS5oLTYxLVx0XHRcdFx0ICAgICBzdHJ1Y3QgZXZlbnRmZF9jdHggKmV2ZW50ZmQsXG4tLVxubW0vbWVtY29udHJvbC12MS5jPTEwOTU9c3RhdGljIHNzaXplX3QgbWVtY2dfd3JpdGVfZXZlbnRfY29udHJvbChzdHJ1Y3Qga2VybmZzX29wZW5fZmlsZSAqb2YsXG4tLVxubW0vbWVtY29udHJvbC12MS5jLTExOTEtXHRcdFx0ICAgICBcJiMzNDtpZiB5b3UgZGVwZW5kIG9uIHRoaXMgZnVuY3Rpb25hbGl0eS5cXG5cJiMzNDspO1xubW0vbWVtY29udHJvbC12MS5jOjExOTI6XHRcdGV2ZW50LVx1MDAzZXJlZ2lzdGVyX2V2ZW50ID0gdm1wcmVzc3VyZV9yZWdpc3Rlcl9ldmVudDtcbm1tL21lbWNvbnRyb2wtdjEuYy0xMTkzLVx0XHRldmVudC1cdTAwM2V1bnJlZ2lzdGVyX2V2ZW50ID0gdm1wcmVzc3VyZV91bnJlZ2lzdGVyX2V2ZW50O1xuLS1cbm1tL3ZtcHJlc3N1cmUtdjEuYz0xOTA9dm9pZCB2bXByZXNzdXJlX3ByaW8oZ2ZwX3QgZ2ZwLCBzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csIGludCBwcmlvKVxuLS1cbm1tL3ZtcHJlc3N1cmUtdjEuYy0yMTEtLyoqXG5tbS92bXByZXNzdXJlLXYxLmM6MjEyOiAqIHZtcHJlc3N1cmVfcmVnaXN0ZXJfZXZlbnQoKSAtIEJpbmQgdm1wcmVzc3VyZSBub3RpZmljYXRpb25zIHRvIGFuIGV2ZW50ZmRcbm1tL3ZtcHJlc3N1cmUtdjEuYy0yMTMtICogQG1lbWNnOlx0bWVtY2cgdGhhdCBpcyBpbnRlcmVzdGVkIGluIHZtcHJlc3N1cmUgbm90aWZpY2F0aW9uc1xuLS1cbm1tL3ZtcHJlc3N1cmUtdjEuYy0yMjgtICovXG5tbS92bXByZXNzdXJlLXYxLmM6MjI5OmludCB2bXByZXNzdXJlX3JlZ2lzdGVyX2V2ZW50KHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZyxcbm1tL3ZtcHJlc3N1cmUtdjEuYy0yMzAtXHRcdFx0ICAgICAgc3RydWN0IGV2ZW50ZmRfY3R4ICpldmVudGZkLCBjb25zdCBjaGFyICphcmdzKVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjExLzI8L3RkPgoJCQk8dGQ+MjAyNi8wNi8yOSAxNDozNDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyMjY3NQoJCQkJCQkJb3V0cHV0OiAyMgoJCQkJCQkJdGhvdWdodHM6IDExMzcKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHlzaXMgb2YgdGhlIFBhdGNoIGZvciBGdXp6aW5nIFdvcnRoaW5lc3MqKgoKT2theSwgc28gSSYjMzk7bSBsb29raW5nIGF0IHRoaXMgcGF0Y2ggYW5kIG15IGluaXRpYWwgdGhvdWdodCBpcywgeWVzLCBgdm1wcmVzc3VyZV9yZWdpc3Rlcl9ldmVudGAgaXMgZGVmaW5pdGVseSB1c2VkIHdpdGhpbiBgbWVtY2dfd3JpdGVfZXZlbnRfY29udHJvbGAsIHdoaWNoIG1lYW5zIHRoaXMgaXMgYWJzb2x1dGVseSBjb3JlIGtlcm5lbCBsb2dpYyB0aGF0JiMzOTtzIHJlYWNoYWJsZS4gVGhlIHBhdGNoIGlzIGRvaW5nIGEgcmVmYWN0b3IgYW5kIGludHJvZHVjaW5nIGFuIG9wdGltaXphdGlvbjsgSSB0aGluayB0aGlzIGxvb2tzIHByZXR0eSBnb29kLiBNeSBmaXJzdCBpbmNsaW5hdGlvbiBpcyB0byBzZXQgYFdvcnRoRnV6emluZz10cnVlYC4KCk5vdywgbGV0IG1lIG1ha2Ugc3VyZSBJJiMzOTttIGNhcHR1cmluZyBhbGwgdGhlIHJlbGV2YW50IHN5bWJvbHMuIEkmIzM5O2xsIGpvdCBkb3duOiBgdm1wcmVzc3VyZWAsIGB2bXByZXNzdXJlX3YxX2FjY291bnRfdHJlZWAsIGB2bXByZXNzdXJlX3JlZ2lzdGVyX2V2ZW50YCwgYHZtcHJlc3N1cmVfdW5yZWdpc3Rlcl9ldmVudGAsIGFuZCBgdm1wcmVzc3VyZV9wcmlvYC4gRm9yIHRoZSBjb25maWdzLCBJIG5lZWQgdG8gbWFrZSBzdXJlIEkgaW5jbHVkZSBgTUVNQ0dgLCBhcyB0aGF0JiMzOTtzIGVzc2VudGlhbCBmb3IgYHZtcHJlc3N1cmVgIHRvIGV2ZW4gY29tcGlsZS4gQWxzbywgaXQgbG9va3MgbGlrZSBgTUVNQ0dfVjFgIGlzIHRoZSBuZXcgY29uZmlnIGd1YXJkaW5nIHRoZSB2MS1zcGVjaWZpYyBjb2RlLiBMZXQgbWUgcXVpY2tseSBkb3VibGUtY2hlY2sgdGhlIGBLY29uZmlnYCB0byBiZSBzdXJlIHRoYXQgYE1FTUNHX1YxYCBpc24mIzM5O3QgZW5hYmxlZCBieSBkZWZhdWx0LiBBaCwgeWVzLCBpdCYjMzk7cyBleHBsaWNpdGx5IGEgYm9vbGVhbi4gU28sIGJvdGggYE1FTUNHYCBhbmQgYE1FTUNHX1YxYCB3aWxsIGdvIGludG8gbXkgYEVuYWJsZUNvbmZpZ3NgLgoKTm93LCBJIG5lZWQgdG8gcmVtaW5kIG15c2VsZiB3aGF0IHRoZSBwcm9tcHQgc2FpZCByZWdhcmRpbmcgYFdvcnRoRnV6emluZz1mYWxzZWAuIEl0IHdhcyBzb21ldGhpbmcgYWxvbmcgdGhlIGxpbmVzIG9mICYjMzQ7bW9kaWZpY2F0aW9ucyB0byBkb2N1bWVudGF0aW9uLCBLY29uZmlnLCBjb2RlIGNvbW1lbnRzOyBkZWNvcmF0aXZlIGNoYW5nZXMgbGlrZSBsb2dnaW5nOyBjaGFuZ2VzIHRvIGNvbnN0YW50cy9tYWNyb3MgdGhhdCBkb24mIzM5O3QgYWx0ZXIgZXhlY3V0aW9uOyBhbmQgdW5yZWFjaGFibGUgY29kZSBwYXRocy4mIzM0OwoKQnV0IHRoaXMgcGF0Y2ggKmlzKiBhbHRlcmluZyBleGVjdXRpb24gZmxvdyB3aXRoIGFuIG9wdGltaXphdGlvbiEgSXQgYWxzbyBpbmNsdWRlcyBzdHJ1Y3R1cmFsIGNoYW5nZXMgYnkgbW92aW5nIGNvZGUgdG8gYSBuZXcgZmlsZS4gVGhlIHF1ZXN0aW9uIGlzIHdoZXRoZXIgaXQmIzM5O3MgKnB1cmVseSogcmVmYWN0b3JpbmcsIGJ1dCB0aGF0JiMzOTtzIG5vdCB0aGUgY2FzZS4gVGhlIGZ1bmN0aW9uYWwgY2hhbmdlIGluIGB2bXByZXNzdXJlYCBpcyB0aGUga2V5LiBUaGUgb3B0aW1pemF0aW9uIGluIGB2bXByZXNzdXJlYCBpcyB0aGUgZnVuY3Rpb25hbCBjaGFuZ2UsIGNvbWJpbmVkIHdpdGggdGhlIGZhY3QgdGhhdCBpdCBleHRyYWN0cyBgdm1wcmVzc3VyZS12MS5jYCwgYnV0IGFsc28gaW50cm9kdWNlcyBhIG5ldyBjb25maWcgYENPTkZJR19NRU1DR19WMWAgdGhhdCBjYW4gYmUgZGlzYWJsZWQgdG8gcmVtb3ZlIHRoZSBjb2RlLiBUaGVyZWZvcmUsIGl0JiMzOTtzIGEgZnVuY3Rpb25hbCBjaGFuZ2UgdGhhdCBhbHRlcnMgaG93IHRoZSBjb3JlIG1lbW9yeSBtYW5hZ2VtZW50IGxvZ2ljIHdvcmtzLiBUaGUgcHJvbXB0IHNheXMgdGhhdCBpZiB0aGUgcGF0Y2ggbW9kaWZpZXMgcmVhY2hhYmxlIGNvcmUga2VybmVsIGxvZ2ljIGFuZCBhbHRlcnMgZXhlY3V0aW9uLCBJIHNob3VsZCByZXR1cm4gYFdvcnRoRnV6emluZz10cnVlYC4KCkhvbGQgb24uIFRoZSBwcm9tcHQgKmRvZXMqIHNheSAmIzM0O1JldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgaWYgdGhlIHBhdGNoIG9ubHkgY29udGFpbnMgLi4uJiMzNDsuIEl0IGRvZXNuJiMzOTt0IGV4cGxpY2l0bHkgdGFsayBhYm91dCByZWZhY3RvcmluZywgYnV0IHR5cGljYWxseSByZWZhY3RvcmluZyBhbG9uZSB3aXRob3V0IGEgZnVuY3Rpb25hbCBjaGFuZ2Ugd291bGRuJiMzOTt0IGJlIHdvcnRoIGZ1enppbmcsIGFzIGl0JiMzOTtzIGp1c3QgY29kZSByZW9yZ2FuaXphdGlvbi4gQnV0IHRoaXMgcGF0Y2ggKmRvZXMqIGludHJvZHVjZSBhIGZ1bmN0aW9uYWwgY2hhbmdlOgoKYGBgYwoJaWYgKCghY2dyb3VwX3N1YnN5c19vbl9kZmwobWVtb3J5X2NncnBfc3Vic3lzKSAmYW1wOyZhbXA7ICF0cmVlKSB8fAoJICAgIChjZ3JvdXBfc3Vic3lzX29uX2RmbChtZW1vcnlfY2dycF9zdWJzeXMpICZhbXA7JmFtcDsgdHJlZSkpCgkJcmV0dXJuOwpgYGAKClRoaXMgY2hhbmdlcyB0aGUgYmVoYXZpb3IgaW4gY2dyb3VwIHYyIHdoZW4gYHRyZWU9dHJ1ZWAuIEl0IG5vdyByZXR1cm5zIGVhcmx5IGluc3RlYWQgb2YgYWNjdW11bGF0aW5nIGNvdW50ZXJzIGFuZCBzY2hlZHVsaW5nIHdvcmsgaXRlbXMuIFNvLCB0aGlzIGlzIGRlZmluaXRlbHkgYSBmdW5jdGlvbmFsIGNoYW5nZS4KCkxldCBtZSBtYWtlIHRoaXMgcmVhbGx5IGNsZWFyLiBUaGUgcGF0Y2ggc3BsaXRzIGNncm91cCB2MSYjMzk7cyBgdm1wcmVzc3VyZWAgY29kZSBpbnRvIGEgc2VwYXJhdGUgZmlsZSAoYG1tL3ZtcHJlc3N1cmUtdjEuY2ApIGd1YXJkZWQgYnkgYENPTkZJR19NRU1DR19WMWAuIEl0ICphbHNvKiBoYXMgYSBmdW5jdGlvbmFsIG9wdGltaXphdGlvbiBpbiBgdm1wcmVzc3VyZSgpYC4gVGhpcyBlYXJseSBleGl0IG9wdGltaXphdGlvbiBhdm9pZHMgdW5uZWNlc3NhcnkgY291bnRlciBhY2N1bXVsYXRpb24gYW5kIHdvcmsgc2NoZWR1bGluZy4gVGhpcyBtb2RpZmljYXRpb24gYWZmZWN0cyByZWFjaGFibGUgY29yZSBtZW1vcnkgbWFuYWdlbWVudCBsb2dpYyBhbmQgYWx0ZXJzIGV4ZWN1dGlvbiBmbG93LCBzbyBJJiMzOTttIGNvbmZpZGVudCB0aGF0IGl0IGlzIHdvcnRoIGZ1enppbmcuIEkmIzM5O2xsIHN0aWxsIGluY2x1ZGUgdGhlIGZvY3VzIHN5bWJvbHMgYW5kIHRoZSBlbmFibGluZyBjb25maWd1cmF0aW9ucy4KCkZvY3VzIFN5bWJvbHM6Ci0gYHZtcHJlc3N1cmVgCi0gYHZtcHJlc3N1cmVfdjFfYWNjb3VudF90cmVlYAotIGB2bXByZXNzdXJlX3JlZ2lzdGVyX2V2ZW50YAotIGB2bXByZXNzdXJlX3VucmVnaXN0ZXJfZXZlbnRgCi0gYHZtcHJlc3N1cmVfcHJpb2AKLSBgdm1wcmVzc3VyZV93b3JrX2ZuYAotIGB2bXByZXNzdXJlX2V2ZW50YAoKRW5hYmxlQ29uZmlnczoKLSBgTUVNQ0dgCi0gYE1FTUNHX1YxYAoKSnVzdCB0byBtYWtlIHN1cmUgSSYjMzk7bSB0aG9yb3VnaCwgbGV0IG1lIG5vdGUgdGhhdCBgdm1wcmVzc3VyZV93b3JrX2ZuYCBpcyBtb3ZlZCB0byBgbW0vdm1wcmVzc3VyZS12MS5jYCBhcyBpcyBgdm1wcmVzc3VyZV9ldmVudGAgYW5kIGB2bXByZXNzdXJlX2NhbGNfbGV2ZWxgIGlzIG5vdyBleHBvc2VkLiBgdm1wcmVzc3VyZV92MV9pbml0YCBhbmQgYHZtcHJlc3N1cmVfdjFfY2xlYW51cGAgYXJlIG5ldy4gRXZlbiB0aG91Z2ggYHZtcHJlc3N1cmVfd29ya19mbmAgYW5kIGB2bXByZXNzdXJlX2V2ZW50YCBhcmUgc3RhdGljCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMi8yPC90ZD4KCQkJPHRkPjIwMjYvMDYvMjkgMTQ6MzU8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7dm1wcmVzc3VyZV93b3JrX2ZuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O21tL3ZtcHJlc3N1cmUtdjEuYz04Mz1zdGF0aWMgYm9vbCB2bXByZXNzdXJlX2V2ZW50KHN0cnVjdCB2bXByZXNzdXJlICp2bXByLFxuLS1cbm1tL3ZtcHJlc3N1cmUtdjEuYy0xMDUtXG5tbS92bXByZXNzdXJlLXYxLmM6MTA2OnN0YXRpYyB2b2lkIHZtcHJlc3N1cmVfd29ya19mbihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspXG5tbS92bXByZXNzdXJlLXYxLmMtMTA3LXtcbi0tXG5tbS92bXByZXNzdXJlLXYxLmM9MTYzPXZvaWQgdm1wcmVzc3VyZV92MV9pbml0KHN0cnVjdCB2bXByZXNzdXJlICp2bXByKVxuLS1cbm1tL3ZtcHJlc3N1cmUtdjEuYy0xNjYtXHRJTklUX0xJU1RfSEVBRChcdTAwMjZ2bXByLVx1MDAzZWV2ZW50cyk7XG5tbS92bXByZXNzdXJlLXYxLmM6MTY3Olx0SU5JVF9XT1JLKFx1MDAyNnZtcHItXHUwMDNld29yaywgdm1wcmVzc3VyZV93b3JrX2ZuKTtcbm1tL3ZtcHJlc3N1cmUtdjEuYy0xNjgtfVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEzLzI8L3RkPgoJCQk8dGQ+MjAyNi8wNi8yOSAxNDozNTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyNTA5OQoJCQkJCQkJb3V0cHV0OiAyMTEKCQkJCQkJCXRob3VnaHRzOiAyMzIKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqUmVmaW5pbmcgdGhlIFZNUHJlc3N1cmUgTG9naWMqKgoKT2theSwgc28gSSYjMzk7dmUgY29uZmlybWVkIHRoYXQgdGhvc2Ugc3ltYm9scyBhcmUgaW5kZWVkIHN0YXRpYy4gVGhhdCBtZWFucyBJIG5lZWQgdG8gaW5jbHVkZSBgdm1wcmVzc3VyZV93b3JrX2ZuYCBhbmQgYHZtcHJlc3N1cmVfZXZlbnRgIGluIEZvY3VzU3ltYm9scy4gRXhwYW5kaW5nIG15IGZvY3VzLCBJJiMzOTtsbCB1cGRhdGUgdGhhdCBsaXN0OgoKKiAgIGB2bXByZXNzdXJlYAoqICAgYHZtcHJlc3N1cmVfdjFfYWNjb3VudF90cmVlYAoqICAgYHZtcHJlc3N1cmVfd29ya19mbmAKKiAgIGB2bXByZXNzdXJlX2V2ZW50YAoqICAgYHZtcHJlc3N1cmVfcmVnaXN0ZXJfZXZlbnRgCiogICBgdm1wcmVzc3VyZV91bnJlZ2lzdGVyX2V2ZW50YAoqICAgYHZtcHJlc3N1cmVfcHJpb2AKCk5vdywgbGV0JiMzOTtzIGJyZWFrIGRvd24gdGhlIHJlYXNvbmluZyBiZWhpbmQgdGhpcy4gVGhlIHBhdGNoIGlzIGNsZWFybHkgZG9pbmcgc29tZSB0YXJnZXRlZCByZWZhY3RvcmluZy4gSXQmIzM5O3MgbW92aW5nIHRoZSBjZ3JvdXAgdjEgc3BlY2lmaWMgYHZtcHJlc3N1cmVgIGNvZGUgaW50byBpdHMgb3duIGZpbGUsIGBtbS92bXByZXNzdXJlLXYxLmNgLCBhbmQgdGhhdCYjMzk7cyBndWFyZGVkIGJ5IHRoZSBgQ09ORklHX01FTUNHX1YxYCBmbGFnLiBTbWFydC4gSXQmIzM5O3MgYWxzbyBvcHRpbWl6aW5nIHRoZSBgdm1wcmVzc3VyZSgpYCBmdW5jdGlvbiBpdHNlbGYsIHNwZWNpZmljYWxseSBmb3IgY2dyb3VwIHYyIHdoZW4gYSBgdHJlZT10cnVlYCBzY2VuYXJpby4gVGhhdCYjMzk7cyBhIGdvb2QgcGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uLCBza2lwcGluZyB1bm5lY2Vzc2FyeSBjb3VudGVyIGFjY3VtdWxhdGlvbiBhbmQgd29yayBzY2hlZHVsaW5nLiBUaGlzIHRvdWNoZXMgY29yZSBtZW1vcnkgbWFuYWdlbWVudCBsb2dpYyBhbmQsIGNyaXRpY2FsbHksIGFsdGVycyB0aGUgZXhlY3V0aW9uIGZsb3cgb2YgdGhlIHJlbGF0ZWQgZnVuY3Rpb25zLiBUaGF0IHNpZ25hbHMgYSBuZWVkIGZvciBmdXp6aW5nLiBHaXZlbiB0aGUgbW9kaWZpY2F0aW9uIHRvIHJlYWNoYWJsZSBjb2RlLCBhbmQgdGhlIGFsdGVyaW5nIG9mIHRoZSBjb2RlIHBhdGggYmFzZWQgb24gYHRyZWU9dHJ1ZWAsIGl0JiMzOTtzIGZ1enogdGltZS4KCkFscmlnaHQsIEkmIzM5O2xsIGNhbGwgYHNldC1yZXN1bHRzYCBub3cuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTQvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA2LzI5IDE0OjM1PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+c2V0LXJlc3VsdHM8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtNRU1DRyYjMzQ7LAogICAgJiMzNDtNRU1DR19WMSYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O3ZtcHJlc3N1cmUmIzM0OywKICAgICYjMzQ7dm1wcmVzc3VyZV92MV9hY2NvdW50X3RyZWUmIzM0OywKICAgICYjMzQ7dm1wcmVzc3VyZV93b3JrX2ZuJiMzNDssCiAgICAmIzM0O3ZtcHJlc3N1cmVfZXZlbnQmIzM0OywKICAgICYjMzQ7dm1wcmVzc3VyZV9yZWdpc3Rlcl9ldmVudCYjMzQ7LAogICAgJiMzNDt2bXByZXNzdXJlX3VucmVnaXN0ZXJfZXZlbnQmIzM0OywKICAgICYjMzQ7dm1wcmVzc3VyZV9wcmlvJiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIGV4dHJhY3RzIGNncm91cCB2MSBzcGVjaWZpYyB2bXByZXNzdXJlIGxvZ2ljIGludG8gYSBuZXcgZmlsZSBgbW0vdm1wcmVzc3VyZS12MS5jYCBndWFyZGVkIGJ5IGBDT05GSUdfTUVNQ0dfVjFgLiBJdCBhbHNvIGludHJvZHVjZXMgYSBmdW5jdGlvbmFsIG9wdGltaXphdGlvbiBpbiBgdm1wcmVzc3VyZSgpYCB0byByZXR1cm4gZWFybHkgZm9yIGNncm91cCB2MiB3aGVuIGB0cmVlPXRydWVgLCBhdm9pZGluZyB1bm5lY2Vzc2FyeSBjb3VudGVyIGFjY3VtdWxhdGlvbiBhbmQgd29yayBzY2hlZHVsaW5nLiBUaGlzIG1vZGlmaWVzIHJlYWNoYWJsZSBjb3JlIG1lbW9yeSBtYW5hZ2VtZW50IGxvZ2ljIGFuZCBhbHRlcnMgZXhlY3V0aW9uIGZsb3csIHNvIGl0IHNob3VsZCBiZSBmdXp6ZWQuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O01FTUNHJiMzNDssCiAgICAmIzM0O01FTUNHX1YxJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7dm1wcmVzc3VyZSYjMzQ7LAogICAgJiMzNDt2bXByZXNzdXJlX3YxX2FjY291bnRfdHJlZSYjMzQ7LAogICAgJiMzNDt2bXByZXNzdXJlX3dvcmtfZm4mIzM0OywKICAgICYjMzQ7dm1wcmVzc3VyZV9ldmVudCYjMzQ7LAogICAgJiMzNDt2bXByZXNzdXJlX3JlZ2lzdGVyX2V2ZW50JiMzNDssCiAgICAmIzM0O3ZtcHJlc3N1cmVfdW5yZWdpc3Rlcl9ldmVudCYjMzQ7LAogICAgJiMzNDt2bXByZXNzdXJlX3ByaW8mIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggZXh0cmFjdHMgY2dyb3VwIHYxIHNwZWNpZmljIHZtcHJlc3N1cmUgbG9naWMgaW50byBhIG5ldyBmaWxlIGBtbS92bXByZXNzdXJlLXYxLmNgIGd1YXJkZWQgYnkgYENPTkZJR19NRU1DR19WMWAuIEl0IGFsc28gaW50cm9kdWNlcyBhIGZ1bmN0aW9uYWwgb3B0aW1pemF0aW9uIGluIGB2bXByZXNzdXJlKClgIHRvIHJldHVybiBlYXJseSBmb3IgY2dyb3VwIHYyIHdoZW4gYHRyZWU9dHJ1ZWAsIGF2b2lkaW5nIHVubmVjZXNzYXJ5IGNvdW50ZXIgYWNjdW11bGF0aW9uIGFuZCB3b3JrIHNjaGVkdWxpbmcuIFRoaXMgbW9kaWZpZXMgcmVhY2hhYmxlIGNvcmUgbWVtb3J5IG1hbmFnZW1lbnQgbG9naWMgYW5kIGFsdGVycyBleGVjdXRpb24gZmxvdywgc28gaXQgc2hvdWxkIGJlIGZ1enplZC4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8L3Rib2R5PgoJPC90YWJsZT4KCgk8ZGl2IGlkPSJsbG1fc3VtbWFyeV90YWJsZV9kaXYiIHN0eWxlPSJtYXJnaW46IDIwcHggMDsiPgoJCTx0YWJsZSBjbGFzcz0ibGlzdF90YWJsZSI+CgkJCTxjYXB0aW9uPkxMTSBDYWxscyBTdW1tYXJ5OjwvY2FwdGlvbj4KCQkJPHRoZWFkPgoJCQkJPHRyPgoJCQkJCTx0aD5Ub3RhbCBDYWxsczwvdGg+CgkJCQkJPHRoPlRvdGFsIFRva2VuczwvdGg+CgkJCQkJPHRoPkF2ZyBUb2tlbnM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJCTx0aD5BdmcgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCTwvdHI+CgkJCTwvdGhlYWQ+CgkJCTx0Ym9keSBpZD0ibGxtX3N1bW1hcnlfc3RhdHNfYm9keSI+PC90Ym9keT4KCQk8L3RhYmxlPgoJPC9kaXY+CgoJPGRpdiBpZD0idG9vbF9zdW1tYXJ5X3RhYmxlX2RpdiIgc3R5bGU9Im1hcmdpbjogMjBweCAwOyI+CgkJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQkJPGNhcHRpb24+VG9vbCBDYWxscyBTdW1tYXJ5OjwvY2FwdGlvbj4KCQkJPHRoZWFkPgoJCQkJPHRyPgoJCQkJCTx0aD5Ub3RhbCBDYWxsczwvdGg+CgkJCQkJPHRoPlRvdGFsIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQkJPHRoPkF2ZyBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJPC90cj4KCQkJPC90aGVhZD4KCQkJPHRib2R5IGlkPSJ0b29sX3N1bW1hcnlfc3RhdHNfYm9keSI+PC90Ym9keT4KCQk8L3RhYmxlPgoJPC9kaXY+CgoJPGRpdiBpZD0iZHVyYXRpb25fY2hhcnRfZGl2IiBzdHlsZT0id2lkdGg6IDEwMCU7IG1hcmdpbjogMjBweCAwOyBib3JkZXI6IDFweDsiPjwvZGl2PgoJPGRpdiBpZD0idG9rZW5fY2hhcnRfZGl2IiBzdHlsZT0id2lkdGg6IDEwMCU7IG1hcmdpbjogMjBweCAwOyBib3JkZXI6IDFweDsiPjwvZGl2PgoKCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Imh0dHBzOi8vd3d3Lmdvb2dsZS5jb20vanNhcGkiPjwvc2NyaXB0PgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgoJCWdvb2dsZS5sb2FkKCJ2aXN1YWxpemF0aW9uIiwgIjEiLCB7cGFja2FnZXM6WyJjb3JlY2hhcnQiXX0pOwoJCWdvb2dsZS5zZXRPbkxvYWRDYWxsYmFjayhkcmF3Q2hhcnRzKTsKCgkJZnVuY3Rpb24gZHJhd0NoYXJ0cygpIHsKCQkJY29uc3QgcmF3RGF0YSA9IFt7IlN0YXJ0ZWQiOiIyMDI2LTA2LTI5VDE0OjMzOjU2Ljk0NTI5Njg3MVoiLCJTZXEiOjAsIk5lc3RpbmciOjAsIlR5cGUiOiJmbG93IiwiTmFtZSI6InBhdGNoLXRyaWFnZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjg1NDUxODI0NzcyLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIk1FTUNHXCIsXG4gICAgXCJNRU1DR19WMVwiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcInZtcHJlc3N1cmVcIixcbiAgICBcInZtcHJlc3N1cmVfdjFfYWNjb3VudF90cmVlXCIsXG4gICAgXCJ2bXByZXNzdXJlX3dvcmtfZm5cIixcbiAgICBcInZtcHJlc3N1cmVfZXZlbnRcIixcbiAgICBcInZtcHJlc3N1cmVfcmVnaXN0ZXJfZXZlbnRcIixcbiAgICBcInZtcHJlc3N1cmVfdW5yZWdpc3Rlcl9ldmVudFwiLFxuICAgIFwidm1wcmVzc3VyZV9wcmlvXCJcbiAgXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggZXh0cmFjdHMgY2dyb3VwIHYxIHNwZWNpZmljIHZtcHJlc3N1cmUgbG9naWMgaW50byBhIG5ldyBmaWxlIGBtbS92bXByZXNzdXJlLXYxLmNgIGd1YXJkZWQgYnkgYENPTkZJR19NRU1DR19WMWAuIEl0IGFsc28gaW50cm9kdWNlcyBhIGZ1bmN0aW9uYWwgb3B0aW1pemF0aW9uIGluIGB2bXByZXNzdXJlKClgIHRvIHJldHVybiBlYXJseSBmb3IgY2dyb3VwIHYyIHdoZW4gYHRyZWU9dHJ1ZWAsIGF2b2lkaW5nIHVubmVjZXNzYXJ5IGNvdW50ZXIgYWNjdW11bGF0aW9uIGFuZCB3b3JrIHNjaGVkdWxpbmcuIFRoaXMgbW9kaWZpZXMgcmVhY2hhYmxlIGNvcmUgbWVtb3J5IG1hbmFnZW1lbnQgbG9naWMgYW5kIGFsdGVycyBleGVjdXRpb24gZmxvdywgc28gaXQgc2hvdWxkIGJlIGZ1enplZC5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDYtMjlUMTQ6MzM6NTYuOTQ1MzAyMDYxWiIsIlNlcSI6MSwiTmVzdGluZyI6MSwiVHlwZSI6ImFjdGlvbiIsIk5hbWUiOiJyZWFkLXBhdGNoLWRpZmYiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo1NTc0OTg2NjYsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIlBhdGNoRGlmZlwiOiBcImNvbW1pdCBiNTE3NGFkNWRhMjQ1ZjUzZmViNzgyNGFkNmMxMmVlNWZiZjllYTQzXFxuQXV0aG9yOiBzeXotY2x1c3RlciBcXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cXHUwMDNlXFxuRGF0ZTogICBNb24gSnVuIDI5IDE0OjMzOjU1IDIwMjYgKzAwMDBcXG5cXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XFxuXFxuZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdm1wcmVzc3VyZS5oIGIvaW5jbHVkZS9saW51eC92bXByZXNzdXJlLmhcXG5pbmRleCBmYWVjZDU1MjI0MDE3OS4uZTVlNmI2OGQwZGM0MzIgMTAwNjQ0XFxuLS0tIGEvaW5jbHVkZS9saW51eC92bXByZXNzdXJlLmhcXG4rKysgYi9pbmNsdWRlL2xpbnV4L3ZtcHJlc3N1cmUuaFxcbkBAIC0xMywxOCArMTMsMzEgQEBcXG4gc3RydWN0IHZtcHJlc3N1cmUge1xcbiBcXHR1bnNpZ25lZCBsb25nIHNjYW5uZWQ7XFxuIFxcdHVuc2lnbmVkIGxvbmcgcmVjbGFpbWVkO1xcbitcXHQvKiBUaGUgbG9jayBpcyB1c2VkIHRvIGtlZXAgdGhlIHNjYW5uZWQvcmVjbGFpbWVkIGluIHN5bmMuICovXFxuK1xcdHNwaW5sb2NrX3Qgc3JfbG9jaztcXG4gXFxuKyNpZmRlZiBDT05GSUdfTUVNQ0dfVjFcXG4rXFx0LypcXG4rXFx0ICogdHJlZT10cnVlIGFjY3VtdWxhdG9ycyBmZWVkIHRoZSB2MSB1c2Vyc3BhY2UgZXZlbnRmZCBpbnRlcmZhY2VcXG4rXFx0ICogKG1lbW9yeS5wcmVzc3VyZV9sZXZlbCkuIERyYWluZWQgYnkgQHdvcmsuIHYyIGhhcyBubyBlcXVpdmFsZW50XFxuK1xcdCAqIGludGVyZmFjZSwgc28gdGhpcyBzdGF0ZSBpcyBvbWl0dGVkIG9uIENPTkZJR19NRU1DR19WMT1uIGJ1aWxkcy5cXG4rXFx0ICovXFxuIFxcdHVuc2lnbmVkIGxvbmcgdHJlZV9zY2FubmVkO1xcbiBcXHR1bnNpZ25lZCBsb25nIHRyZWVfcmVjbGFpbWVkO1xcbi1cXHQvKiBUaGUgbG9jayBpcyB1c2VkIHRvIGtlZXAgdGhlIHNjYW5uZWQvcmVjbGFpbWVkIGFib3ZlIGluIHN5bmMuICovXFxuLVxcdHNwaW5sb2NrX3Qgc3JfbG9jaztcXG4tXFxuIFxcdC8qIFRoZSBsaXN0IG9mIHZtcHJlc3N1cmVfZXZlbnQgc3RydWN0cy4gKi9cXG4gXFx0c3RydWN0IGxpc3RfaGVhZCBldmVudHM7XFxuIFxcdC8qIEhhdmUgdG8gZ3JhYiB0aGUgbG9jayBvbiBldmVudHMgdHJhdmVyc2FsIG9yIG1vZGlmaWNhdGlvbnMuICovXFxuIFxcdHN0cnVjdCBtdXRleCBldmVudHNfbG9jaztcXG4gXFxuIFxcdHN0cnVjdCB3b3JrX3N0cnVjdCB3b3JrO1xcbisjZW5kaWZcXG4rfTtcXG4rXFxuK2VudW0gdm1wcmVzc3VyZV9sZXZlbHMge1xcbitcXHRWTVBSRVNTVVJFX0xPVyA9IDAsXFxuK1xcdFZNUFJFU1NVUkVfTUVESVVNLFxcbitcXHRWTVBSRVNTVVJFX0NSSVRJQ0FMLFxcbitcXHRWTVBSRVNTVVJFX05VTV9MRVZFTFMsXFxuIH07XFxuIFxcbiBzdHJ1Y3QgbWVtX2Nncm91cDtcXG5AQCAtMzIsMTggKzQ1LDQxIEBAIHN0cnVjdCBtZW1fY2dyb3VwO1xcbiAjaWZkZWYgQ09ORklHX01FTUNHXFxuIHZvaWQgdm1wcmVzc3VyZShnZnBfdCBnZnAsIGludCBvcmRlciwgc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLCBib29sIHRyZWUsXFxuIFxcdFxcdHVuc2lnbmVkIGxvbmcgc2Nhbm5lZCwgdW5zaWduZWQgbG9uZyByZWNsYWltZWQpO1xcbi1leHRlcm4gdm9pZCB2bXByZXNzdXJlX3ByaW8oZ2ZwX3QgZ2ZwLCBzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csIGludCBwcmlvKTtcXG4tXFxuIGV4dGVybiB2b2lkIHZtcHJlc3N1cmVfaW5pdChzdHJ1Y3Qgdm1wcmVzc3VyZSAqdm1wcik7XFxuIGV4dGVybiB2b2lkIHZtcHJlc3N1cmVfY2xlYW51cChzdHJ1Y3Qgdm1wcmVzc3VyZSAqdm1wcik7XFxuIGV4dGVybiBzdHJ1Y3Qgdm1wcmVzc3VyZSAqbWVtY2dfdG9fdm1wcmVzc3VyZShzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2cpO1xcbiBleHRlcm4gc3RydWN0IG1lbV9jZ3JvdXAgKnZtcHJlc3N1cmVfdG9fbWVtY2coc3RydWN0IHZtcHJlc3N1cmUgKnZtcHIpO1xcbitcXG4rLyogU2hhcmVkIHdpdGggbW0vdm1wcmVzc3VyZS12MS5jLiAqL1xcbitleHRlcm4gY29uc3QgdW5zaWduZWQgbG9uZyB2bXByZXNzdXJlX3dpbjtcXG4rZXh0ZXJuIGVudW0gdm1wcmVzc3VyZV9sZXZlbHMgdm1wcmVzc3VyZV9jYWxjX2xldmVsKHVuc2lnbmVkIGxvbmcgc2Nhbm5lZCxcXG4rXFx0XFx0XFx0XFx0XFx0XFx0ICAgIHVuc2lnbmVkIGxvbmcgcmVjbGFpbWVkKTtcXG4rXFxuKyNpZmRlZiBDT05GSUdfTUVNQ0dfVjFcXG4rZXh0ZXJuIHZvaWQgdm1wcmVzc3VyZV9wcmlvKGdmcF90IGdmcCwgc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLCBpbnQgcHJpbyk7XFxuIGV4dGVybiBpbnQgdm1wcmVzc3VyZV9yZWdpc3Rlcl9ldmVudChzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csXFxuIFxcdFxcdFxcdFxcdCAgICAgc3RydWN0IGV2ZW50ZmRfY3R4ICpldmVudGZkLFxcbiBcXHRcXHRcXHRcXHQgICAgIGNvbnN0IGNoYXIgKmFyZ3MpO1xcbiBleHRlcm4gdm9pZCB2bXByZXNzdXJlX3VucmVnaXN0ZXJfZXZlbnQoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLFxcbiBcXHRcXHRcXHRcXHRcXHRzdHJ1Y3QgZXZlbnRmZF9jdHggKmV2ZW50ZmQpO1xcbitcXG4rLyogdjEgaG9va3MgY2FsbGVkIGZyb20gbW0vdm1wcmVzc3VyZS5jOyBuby1vcHMgYmVsb3cgd2hlbiAhTUVNQ0dfVjEuICovXFxuK2V4dGVybiB2b2lkIHZtcHJlc3N1cmVfdjFfaW5pdChzdHJ1Y3Qgdm1wcmVzc3VyZSAqdm1wcik7XFxuK2V4dGVybiB2b2lkIHZtcHJlc3N1cmVfdjFfY2xlYW51cChzdHJ1Y3Qgdm1wcmVzc3VyZSAqdm1wcik7XFxuK2V4dGVybiB2b2lkIHZtcHJlc3N1cmVfdjFfYWNjb3VudF90cmVlKHN0cnVjdCB2bXByZXNzdXJlICp2bXByLFxcbitcXHRcXHRcXHRcXHQgICAgICAgdW5zaWduZWQgbG9uZyBzY2FubmVkLFxcbitcXHRcXHRcXHRcXHQgICAgICAgdW5zaWduZWQgbG9uZyByZWNsYWltZWQpO1xcbiAjZWxzZVxcbitzdGF0aWMgaW5saW5lIHZvaWQgdm1wcmVzc3VyZV9wcmlvKGdmcF90IGdmcCwgc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLFxcbitcXHRcXHRcXHRcXHQgICBpbnQgcHJpbykge31cXG4rc3RhdGljIGlubGluZSB2b2lkIHZtcHJlc3N1cmVfdjFfaW5pdChzdHJ1Y3Qgdm1wcmVzc3VyZSAqdm1wcikge31cXG4rc3RhdGljIGlubGluZSB2b2lkIHZtcHJlc3N1cmVfdjFfY2xlYW51cChzdHJ1Y3Qgdm1wcmVzc3VyZSAqdm1wcikge31cXG4rc3RhdGljIGlubGluZSB2b2lkIHZtcHJlc3N1cmVfdjFfYWNjb3VudF90cmVlKHN0cnVjdCB2bXByZXNzdXJlICp2bXByLFxcbitcXHRcXHRcXHRcXHRcXHQgICAgICB1bnNpZ25lZCBsb25nIHNjYW5uZWQsXFxuK1xcdFxcdFxcdFxcdFxcdCAgICAgIHVuc2lnbmVkIGxvbmcgcmVjbGFpbWVkKSB7fVxcbisjZW5kaWYgLyogQ09ORklHX01FTUNHX1YxICovXFxuK1xcbisjZWxzZSAvKiAhQ09ORklHX01FTUNHICovXFxuIHN0YXRpYyBpbmxpbmUgdm9pZCB2bXByZXNzdXJlKGdmcF90IGdmcCwgaW50IG9yZGVyLCBzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csXFxuIFxcdFxcdFxcdCAgICAgIGJvb2wgdHJlZSwgdW5zaWduZWQgbG9uZyBzY2FubmVkLFxcbiBcXHRcXHRcXHQgICAgICB1bnNpZ25lZCBsb25nIHJlY2xhaW1lZCkge31cXG5kaWZmIC0tZ2l0IGEvbW0vTWFrZWZpbGUgYi9tbS9NYWtlZmlsZVxcbmluZGV4IDRmYzcxMzg2N2I5YmQ4Li5kZTk5MTYzMGM5NmEzMiAxMDA2NDRcXG4tLS0gYS9tbS9NYWtlZmlsZVxcbisrKyBiL21tL01ha2VmaWxlXFxuQEAgLTEwMSw3ICsxMDEsNyBAQCBvYmotJChDT05GSUdfREVWSUNFX01JR1JBVElPTikgKz0gbWlncmF0ZV9kZXZpY2Uub1xcbiBvYmotJChDT05GSUdfVFJBTlNQQVJFTlRfSFVHRVBBR0UpICs9IGh1Z2VfbWVtb3J5Lm8ga2h1Z2VwYWdlZC5vXFxuIG9iai0kKENPTkZJR19QQUdFX0NPVU5URVIpICs9IHBhZ2VfY291bnRlci5vXFxuIG9iai0kKENPTkZJR19MSVZFVVBEQVRFX01FTUZEKSArPSBtZW1mZF9sdW8ub1xcbi1vYmotJChDT05GSUdfTUVNQ0dfVjEpICs9IG1lbWNvbnRyb2wtdjEub1xcbitvYmotJChDT05GSUdfTUVNQ0dfVjEpICs9IG1lbWNvbnRyb2wtdjEubyB2bXByZXNzdXJlLXYxLm9cXG4gb2JqLSQoQ09ORklHX01FTUNHKSArPSBtZW1jb250cm9sLm8gdm1wcmVzc3VyZS5vXFxuIGlmZGVmIENPTkZJR19CUEZfU1lTQ0FMTFxcbiBvYmotJChDT05GSUdfTUVNQ0cpICs9IGJwZl9tZW1jb250cm9sLm9cXG5kaWZmIC0tZ2l0IGEvbW0vdm1wcmVzc3VyZS12MS5jIGIvbW0vdm1wcmVzc3VyZS12MS5jXFxubmV3IGZpbGUgbW9kZSAxMDA2NDRcXG5pbmRleCAwMDAwMDAwMDAwMDAwMC4uZmQ4MTNjYmEwNTQ0NzBcXG4tLS0gL2Rldi9udWxsXFxuKysrIGIvbW0vdm1wcmVzc3VyZS12MS5jXFxuQEAgLTAsMCArMSwzMDUgQEBcXG4rLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb25seVxcbisvKlxcbisgKiBjZ3JvdXAgdjEgdXNlcnNwYWNlIHZtcHJlc3N1cmUgaW50ZXJmYWNlIChtZW1vcnkucHJlc3N1cmVfbGV2ZWwgL1xcbisgKiBjZ3JvdXAuZXZlbnRfY29udHJvbCkuIFNwbGl0IG91dCBvZiBtbS92bXByZXNzdXJlLmMgc28gdGhhdCB2Mi1vbmx5XFxuKyAqIGtlcm5lbHMgKENPTkZJR19NRU1DR19WMT1uKSBkcm9wIHRoZSB3aG9sZSBldmVudGZkIGFjY3VtdWxhdG9yLFxcbisgKiBpdHMgd29yayBpdGVtLCBhbmQgdGhlIHBlci1tZW1jZyBzdGF0ZSBpdCByZXF1aXJlcy5cXG4rICovXFxuK1xcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvY2dyb3VwLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9ldmVudGZkLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9saXN0LmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9sb2cyLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9tZW1jb250cm9sLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9tdXRleC5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvc2xhYi5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvc3RyaW5nLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9zd2FwLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC92bXByZXNzdXJlLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC93b3JrcXVldWUuaFxcdTAwM2VcXG4rXFxuKy8qXFxuKyAqIFdoZW4gdGhlcmUgYXJlIHRvbyBsaXR0bGUgcGFnZXMgbGVmdCB0byBzY2FuLCB2bXByZXNzdXJlKCkgbWF5IG1pc3MgdGhlXFxuKyAqIGNyaXRpY2FsIHByZXNzdXJlIGFzIG51bWJlciBvZiBwYWdlcyB3aWxsIGJlIGxlc3MgdGhhbiBcXFwid2luZG93IHNpemVcXFwiLlxcbisgKiBIb3dldmVyLCBpbiB0aGF0IGNhc2UgdGhlIHZtc2NhbiBwcmlvcml0eSB3aWxsIHJhaXNlIGZhc3QgYXMgdGhlXFxuKyAqIHJlY2xhaW1lciB3aWxsIHRyeSB0byBzY2FuIExSVXMgbW9yZSBkZWVwbHkuXFxuKyAqXFxuKyAqIFRoZSB2bXNjYW4gbG9naWMgY29uc2lkZXJzIHRoZXNlIHNwZWNpYWwgcHJpb3JpdGllczpcXG4rICpcXG4rICogcHJpbyA9PSBERUZfUFJJT1JJVFkgKDEyKTogcmVjbGFpbWVyIHN0YXJ0cyB3aXRoIHRoYXQgdmFsdWVcXG4rICogcHJpbyBcXHUwMDNjPSBERUZfUFJJT1JJVFkgLSAyIDoga3N3YXBkIGJlY29tZXMgc29tZXdoYXQgb3ZlcndoZWxtZWRcXG4rICogcHJpbyA9PSAwICAgICAgICAgICAgICAgIDogY2xvc2UgdG8gT09NLCBrZXJuZWwgc2NhbnMgZXZlcnkgcGFnZSBpbiBhbiBscnVcXG4rICpcXG4rICogQW55IHZhbHVlIGluIHRoaXMgcmFuZ2UgaXMgYWNjZXB0YWJsZSBmb3IgdGhpcyB0dW5hYmxlIChpLmUuIGZyb20gMTIgdG9cXG4rICogMCkuIEN1cnJlbnQgdmFsdWUgZm9yIHRoZSB2bXByZXNzdXJlX2xldmVsX2NyaXRpY2FsX3ByaW8gaXMgY2hvc2VuXFxuKyAqIGVtcGlyaWNhbGx5LCBidXQgdGhlIG51bWJlciwgaW4gZXNzZW5jZSwgbWVhbnMgdGhhdCB3ZSBjb25zaWRlclxcbisgKiBjcml0aWNhbCBsZXZlbCB3aGVuIHNjYW5uaW5nIGRlcHRoIGlzIH4xMCUgb2YgdGhlIGxydSBzaXplICh2bXNjYW5cXG4rICogc2NhbnMgJ2xydV9zaXplIFxcdTAwM2VcXHUwMDNlIHByaW8nIHBhZ2VzLCBzbyBpdCBpcyBhY3R1YWxseSAxMi41JSwgb3Igb25lXFxuKyAqIGVpZ2h0cykuXFxuKyAqL1xcbitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHZtcHJlc3N1cmVfbGV2ZWxfY3JpdGljYWxfcHJpbyA9IGlsb2cyKDEwMCAvIDEwKTtcXG4rXFxuK2VudW0gdm1wcmVzc3VyZV9tb2RlcyB7XFxuK1xcdFZNUFJFU1NVUkVfTk9fUEFTU1RIUk9VR0ggPSAwLFxcbitcXHRWTVBSRVNTVVJFX0hJRVJBUkNIWSxcXG4rXFx0Vk1QUkVTU1VSRV9MT0NBTCxcXG4rXFx0Vk1QUkVTU1VSRV9OVU1fTU9ERVMsXFxuK307XFxuK1xcbitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHZtcHJlc3N1cmVfc3RyX2xldmVsc1tdID0ge1xcbitcXHRbVk1QUkVTU1VSRV9MT1ddID0gXFxcImxvd1xcXCIsXFxuK1xcdFtWTVBSRVNTVVJFX01FRElVTV0gPSBcXFwibWVkaXVtXFxcIixcXG4rXFx0W1ZNUFJFU1NVUkVfQ1JJVElDQUxdID0gXFxcImNyaXRpY2FsXFxcIixcXG4rfTtcXG4rXFxuK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgdm1wcmVzc3VyZV9zdHJfbW9kZXNbXSA9IHtcXG4rXFx0W1ZNUFJFU1NVUkVfTk9fUEFTU1RIUk9VR0hdID0gXFxcImRlZmF1bHRcXFwiLFxcbitcXHRbVk1QUkVTU1VSRV9ISUVSQVJDSFldID0gXFxcImhpZXJhcmNoeVxcXCIsXFxuK1xcdFtWTVBSRVNTVVJFX0xPQ0FMXSA9IFxcXCJsb2NhbFxcXCIsXFxuK307XFxuK1xcbitzdHJ1Y3Qgdm1wcmVzc3VyZV9ldmVudCB7XFxuK1xcdHN0cnVjdCBldmVudGZkX2N0eCAqZWZkO1xcbitcXHRlbnVtIHZtcHJlc3N1cmVfbGV2ZWxzIGxldmVsO1xcbitcXHRlbnVtIHZtcHJlc3N1cmVfbW9kZXMgbW9kZTtcXG4rXFx0c3RydWN0IGxpc3RfaGVhZCBub2RlO1xcbit9O1xcbitcXG4rc3RhdGljIHN0cnVjdCB2bXByZXNzdXJlICp3b3JrX3RvX3ZtcHJlc3N1cmUoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKVxcbit7XFxuK1xcdHJldHVybiBjb250YWluZXJfb2Yod29yaywgc3RydWN0IHZtcHJlc3N1cmUsIHdvcmspO1xcbit9XFxuK1xcbitzdGF0aWMgc3RydWN0IHZtcHJlc3N1cmUgKnZtcHJlc3N1cmVfcGFyZW50KHN0cnVjdCB2bXByZXNzdXJlICp2bXByKVxcbit7XFxuK1xcdHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZyA9IHZtcHJlc3N1cmVfdG9fbWVtY2codm1wcik7XFxuK1xcbitcXHRtZW1jZyA9IHBhcmVudF9tZW1fY2dyb3VwKG1lbWNnKTtcXG4rXFx0aWYgKCFtZW1jZylcXG4rXFx0XFx0cmV0dXJuIE5VTEw7XFxuK1xcdHJldHVybiBtZW1jZ190b192bXByZXNzdXJlKG1lbWNnKTtcXG4rfVxcbitcXG4rc3RhdGljIGJvb2wgdm1wcmVzc3VyZV9ldmVudChzdHJ1Y3Qgdm1wcmVzc3VyZSAqdm1wcixcXG4rXFx0XFx0XFx0ICAgICBjb25zdCBlbnVtIHZtcHJlc3N1cmVfbGV2ZWxzIGxldmVsLFxcbitcXHRcXHRcXHQgICAgIGJvb2wgYW5jZXN0b3IsIGJvb2wgc2lnbmFsbGVkKVxcbit7XFxuK1xcdHN0cnVjdCB2bXByZXNzdXJlX2V2ZW50ICpldjtcXG4rXFx0Ym9vbCByZXQgPSBmYWxzZTtcXG4rXFxuK1xcdG11dGV4X2xvY2soXFx1MDAyNnZtcHItXFx1MDAzZWV2ZW50c19sb2NrKTtcXG4rXFx0bGlzdF9mb3JfZWFjaF9lbnRyeShldiwgXFx1MDAyNnZtcHItXFx1MDAzZWV2ZW50cywgbm9kZSkge1xcbitcXHRcXHRpZiAoYW5jZXN0b3IgXFx1MDAyNlxcdTAwMjYgZXYtXFx1MDAzZW1vZGUgPT0gVk1QUkVTU1VSRV9MT0NBTClcXG4rXFx0XFx0XFx0Y29udGludWU7XFxuK1xcdFxcdGlmIChzaWduYWxsZWQgXFx1MDAyNlxcdTAwMjYgZXYtXFx1MDAzZW1vZGUgPT0gVk1QUkVTU1VSRV9OT19QQVNTVEhST1VHSClcXG4rXFx0XFx0XFx0Y29udGludWU7XFxuK1xcdFxcdGlmIChsZXZlbCBcXHUwMDNjIGV2LVxcdTAwM2VsZXZlbClcXG4rXFx0XFx0XFx0Y29udGludWU7XFxuK1xcdFxcdGV2ZW50ZmRfc2lnbmFsKGV2LVxcdTAwM2VlZmQpO1xcbitcXHRcXHRyZXQgPSB0cnVlO1xcbitcXHR9XFxuK1xcdG11dGV4X3VubG9jayhcXHUwMDI2dm1wci1cXHUwMDNlZXZlbnRzX2xvY2spO1xcbitcXG4rXFx0cmV0dXJuIHJldDtcXG4rfVxcbitcXG4rc3RhdGljIHZvaWQgdm1wcmVzc3VyZV93b3JrX2ZuKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaylcXG4re1xcbitcXHRzdHJ1Y3Qgdm1wcmVzc3VyZSAqdm1wciA9IHdvcmtfdG9fdm1wcmVzc3VyZSh3b3JrKTtcXG4rXFx0dW5zaWduZWQgbG9uZyBzY2FubmVkO1xcbitcXHR1bnNpZ25lZCBsb25nIHJlY2xhaW1lZDtcXG4rXFx0ZW51bSB2bXByZXNzdXJlX2xldmVscyBsZXZlbDtcXG4rXFx0Ym9vbCBhbmNlc3RvciA9IGZhbHNlO1xcbitcXHRib29sIHNpZ25hbGxlZCA9IGZhbHNlO1xcbitcXG4rXFx0c3Bpbl9sb2NrKFxcdTAwMjZ2bXByLVxcdTAwM2Vzcl9sb2NrKTtcXG4rXFx0LypcXG4rXFx0ICogU2V2ZXJhbCBjb250ZXh0cyBtaWdodCBiZSBjYWxsaW5nIHZtcHJlc3N1cmUoKSwgc28gaXQgaXNcXG4rXFx0ICogcG9zc2libGUgdGhhdCB0aGUgd29yayB3YXMgcmVzY2hlZHVsZWQgYWdhaW4gYmVmb3JlIHRoZSBvbGRcXG4rXFx0ICogd29yayBjb250ZXh0IGNsZWFyZWQgdGhlIGNvdW50ZXJzLiBJbiB0aGF0IGNhc2Ugd2Ugd2lsbCBydW5cXG4rXFx0ICoganVzdCBhZnRlciB0aGUgb2xkIHdvcmsgcmV0dXJucywgYnV0IHRoZW4gc2Nhbm5lZCBtaWdodCBiZSB6ZXJvXFxuK1xcdCAqIGhlcmUuIE5vIG5lZWQgZm9yIGFueSBsb2NrcyBoZXJlIHNpbmNlIHdlIGRvbid0IGNhcmUgaWZcXG4rXFx0ICogdm1wci1cXHUwMDNlcmVjbGFpbWVkIGlzIGluIHN5bmMuXFxuK1xcdCAqL1xcbitcXHRzY2FubmVkID0gdm1wci1cXHUwMDNldHJlZV9zY2FubmVkO1xcbitcXHRpZiAoIXNjYW5uZWQpIHtcXG4rXFx0XFx0c3Bpbl91bmxvY2soXFx1MDAyNnZtcHItXFx1MDAzZXNyX2xvY2spO1xcbitcXHRcXHRyZXR1cm47XFxuK1xcdH1cXG4rXFxuK1xcdHJlY2xhaW1lZCA9IHZtcHItXFx1MDAzZXRyZWVfcmVjbGFpbWVkO1xcbitcXHR2bXByLVxcdTAwM2V0cmVlX3NjYW5uZWQgPSAwO1xcbitcXHR2bXByLVxcdTAwM2V0cmVlX3JlY2xhaW1lZCA9IDA7XFxuK1xcdHNwaW5fdW5sb2NrKFxcdTAwMjZ2bXByLVxcdTAwM2Vzcl9sb2NrKTtcXG4rXFxuK1xcdGxldmVsID0gdm1wcmVzc3VyZV9jYWxjX2xldmVsKHNjYW5uZWQsIHJlY2xhaW1lZCk7XFxuK1xcbitcXHRkbyB7XFxuK1xcdFxcdGlmICh2bXByZXNzdXJlX2V2ZW50KHZtcHIsIGxldmVsLCBhbmNlc3Rvciwgc2lnbmFsbGVkKSlcXG4rXFx0XFx0XFx0c2lnbmFsbGVkID0gdHJ1ZTtcXG4rXFx0XFx0YW5jZXN0b3IgPSB0cnVlO1xcbitcXHR9IHdoaWxlICgodm1wciA9IHZtcHJlc3N1cmVfcGFyZW50KHZtcHIpKSk7XFxuK31cXG4rXFxuKy8qXFxuKyAqIFRyZWUtbW9kZSBhY2N1bXVsYXRvcjogYWNjdW11bGF0ZSBwZXItbWVtY2cgc2Nhbm5lZC9yZWNsYWltZWQgYW5kXFxuKyAqIHNjaGVkdWxlIHRoZSB3b3JrIHRoYXQgd2Fsa3MgdGhlIHBhcmVudCBjaGFpbiBhbmQgc2lnbmFscyByZWdpc3RlcmVkXFxuKyAqIGV2ZW50ZmQgbGlzdGVuZXJzIG9uY2Ugd2UgY3Jvc3MgdGhlIHdpbmRvdyB0aHJlc2hvbGQuXFxuKyAqL1xcbit2b2lkIHZtcHJlc3N1cmVfdjFfYWNjb3VudF90cmVlKHN0cnVjdCB2bXByZXNzdXJlICp2bXByLFxcbitcXHRcXHRcXHRcXHR1bnNpZ25lZCBsb25nIHNjYW5uZWQsXFxuK1xcdFxcdFxcdFxcdHVuc2lnbmVkIGxvbmcgcmVjbGFpbWVkKVxcbit7XFxuK1xcdHNwaW5fbG9jayhcXHUwMDI2dm1wci1cXHUwMDNlc3JfbG9jayk7XFxuK1xcdHNjYW5uZWQgPSB2bXByLVxcdTAwM2V0cmVlX3NjYW5uZWQgKz0gc2Nhbm5lZDtcXG4rXFx0dm1wci1cXHUwMDNldHJlZV9yZWNsYWltZWQgKz0gcmVjbGFpbWVkO1xcbitcXHRzcGluX3VubG9jayhcXHUwMDI2dm1wci1cXHUwMDNlc3JfbG9jayk7XFxuK1xcbitcXHRpZiAoc2Nhbm5lZCBcXHUwMDNjIHZtcHJlc3N1cmVfd2luKVxcbitcXHRcXHRyZXR1cm47XFxuK1xcdHNjaGVkdWxlX3dvcmsoXFx1MDAyNnZtcHItXFx1MDAzZXdvcmspO1xcbit9XFxuK1xcbit2b2lkIHZtcHJlc3N1cmVfdjFfaW5pdChzdHJ1Y3Qgdm1wcmVzc3VyZSAqdm1wcilcXG4re1xcbitcXHRtdXRleF9pbml0KFxcdTAwMjZ2bXByLVxcdTAwM2VldmVudHNfbG9jayk7XFxuK1xcdElOSVRfTElTVF9IRUFEKFxcdTAwMjZ2bXByLVxcdTAwM2VldmVudHMpO1xcbitcXHRJTklUX1dPUksoXFx1MDAyNnZtcHItXFx1MDAzZXdvcmssIHZtcHJlc3N1cmVfd29ya19mbik7XFxuK31cXG4rXFxuK3ZvaWQgdm1wcmVzc3VyZV92MV9jbGVhbnVwKHN0cnVjdCB2bXByZXNzdXJlICp2bXByKVxcbit7XFxuK1xcdC8qXFxuK1xcdCAqIE1ha2Ugc3VyZSB0aGVyZSBpcyBubyBwZW5kaW5nIHdvcmsgYmVmb3JlIGV2ZW50ZmQgaW5mcmFzdHJ1Y3R1cmVcXG4rXFx0ICogZ29lcyBhd2F5LlxcbitcXHQgKi9cXG4rXFx0Zmx1c2hfd29yayhcXHUwMDI2dm1wci1cXHUwMDNld29yayk7XFxuK31cXG4rXFxuKy8qKlxcbisgKiB2bXByZXNzdXJlX3ByaW8oKSAtIEFjY291bnQgbWVtb3J5IHByZXNzdXJlIHRocm91Z2ggcmVjbGFpbWVyIHByaW9yaXR5IGxldmVsXFxuKyAqIEBnZnA6XFx0cmVjbGFpbWVyJ3MgZ2ZwIG1hc2tcXG4rICogQG1lbWNnOlxcdGNncm91cCBtZW1vcnkgY29udHJvbGxlciBoYW5kbGVcXG4rICogQHByaW86XFx0cmVjbGFpbWVyJ3MgcHJpb3JpdHlcXG4rICpcXG4rICogVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIGZyb20gdGhlIHJlY2xhaW0gcGF0aCBldmVyeSB0aW1lIHdoZW5cXG4rICogdGhlIHZtc2NhbidzIHJlY2xhaW1pbmcgcHJpb3JpdHkgKHNjYW5uaW5nIGRlcHRoKSBjaGFuZ2VzLlxcbisgKlxcbisgKiBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IHJldHVybiBhbnkgdmFsdWUuXFxuKyAqL1xcbit2b2lkIHZtcHJlc3N1cmVfcHJpbyhnZnBfdCBnZnAsIHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZywgaW50IHByaW8pXFxuK3tcXG4rXFx0LypcXG4rXFx0ICogV2Ugb25seSB1c2UgcHJpbyBmb3IgYWNjb3VudGluZyBjcml0aWNhbCBsZXZlbC4gRm9yIG1vcmUgaW5mb1xcbitcXHQgKiBzZWUgY29tbWVudCBmb3Igdm1wcmVzc3VyZV9sZXZlbF9jcml0aWNhbF9wcmlvIHZhcmlhYmxlIGFib3ZlLlxcbitcXHQgKi9cXG4rXFx0aWYgKHByaW8gXFx1MDAzZSB2bXByZXNzdXJlX2xldmVsX2NyaXRpY2FsX3ByaW8pXFxuK1xcdFxcdHJldHVybjtcXG4rXFxuK1xcdC8qXFxuK1xcdCAqIE9LLCB0aGUgcHJpbyBpcyBiZWxvdyB0aGUgdGhyZXNob2xkLCB1cGRhdGluZyB2bXByZXNzdXJlXFxuK1xcdCAqIGluZm9ybWF0aW9uIGJlZm9yZSBzaHJpbmtlciBkaXZlcyBpbnRvIGxvbmcgc2hyaW5raW5nIG9mIGxvbmdcXG4rXFx0ICogcmFuZ2Ugdm1zY2FuLiBQYXNzaW5nIHNjYW5uZWQgPSB2bXByZXNzdXJlX3dpbiwgcmVjbGFpbWVkID0gMFxcbitcXHQgKiB0byB0aGUgdm1wcmVzc3VyZSgpIGJhc2ljYWxseSBtZWFucyB0aGF0IHdlIHNpZ25hbCAnY3JpdGljYWwnXFxuK1xcdCAqIGxldmVsLlxcbitcXHQgKi9cXG4rXFx0dm1wcmVzc3VyZShnZnAsIDAsIG1lbWNnLCB0cnVlLCB2bXByZXNzdXJlX3dpbiwgMCk7XFxuK31cXG4rXFxuKyNkZWZpbmUgTUFYX1ZNUFJFU1NVUkVfQVJHU19MRU5cXHQoc3RybGVuKFxcXCJjcml0aWNhbFxcXCIpICsgc3RybGVuKFxcXCJoaWVyYXJjaHlcXFwiKSArIDIpXFxuK1xcbisvKipcXG4rICogdm1wcmVzc3VyZV9yZWdpc3Rlcl9ldmVudCgpIC0gQmluZCB2bXByZXNzdXJlIG5vdGlmaWNhdGlvbnMgdG8gYW4gZXZlbnRmZFxcbisgKiBAbWVtY2c6XFx0bWVtY2cgdGhhdCBpcyBpbnRlcmVzdGVkIGluIHZtcHJlc3N1cmUgbm90aWZpY2F0aW9uc1xcbisgKiBAZXZlbnRmZDpcXHRldmVudGZkIGNvbnRleHQgdG8gbGluayBub3RpZmljYXRpb25zIHdpdGhcXG4rICogQGFyZ3M6XFx0ZXZlbnQgYXJndW1lbnRzIChwcmVzc3VyZSBsZXZlbCB0aHJlc2hvbGQsIG9wdGlvbmFsIG1vZGUpXFxuKyAqXFxuKyAqIFRoaXMgZnVuY3Rpb24gYXNzb2NpYXRlcyBldmVudGZkIGNvbnRleHQgd2l0aCB0aGUgdm1wcmVzc3VyZVxcbisgKiBpbmZyYXN0cnVjdHVyZSwgc28gdGhhdCB0aGUgbm90aWZpY2F0aW9ucyB3aWxsIGJlIGRlbGl2ZXJlZCB0byB0aGVcXG4rICogQGV2ZW50ZmQuIFRoZSBAYXJncyBwYXJhbWV0ZXIgaXMgYSBjb21tYS1kZWxpbWl0ZWQgc3RyaW5nIHRoYXQgZGVub3RlcyBhXFxuKyAqIHByZXNzdXJlIGxldmVsIHRocmVzaG9sZCAob25lIG9mIHZtcHJlc3N1cmVfc3RyX2xldmVscywgaS5lLiBcXFwibG93XFxcIiwgXFxcIm1lZGl1bVxcXCIsXFxuKyAqIG9yIFxcXCJjcml0aWNhbFxcXCIpIGFuZCBhbiBvcHRpb25hbCBtb2RlIChvbmUgb2Ygdm1wcmVzc3VyZV9zdHJfbW9kZXMsIGkuZS5cXG4rICogXFxcImhpZXJhcmNoeVxcXCIgb3IgXFxcImxvY2FsXFxcIikuXFxuKyAqXFxuKyAqIFRvIGJlIHVzZWQgYXMgbWVtY2cgZXZlbnQgbWV0aG9kLlxcbisgKlxcbisgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgLUVOT01FTSBvbiBtZW1vcnkgZmFpbHVyZSBvciAtRUlOVkFMIGlmIEBhcmdzIGNvdWxkXFxuKyAqIG5vdCBiZSBwYXJzZWQuXFxuKyAqL1xcbitpbnQgdm1wcmVzc3VyZV9yZWdpc3Rlcl9ldmVudChzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csXFxuK1xcdFxcdFxcdCAgICAgIHN0cnVjdCBldmVudGZkX2N0eCAqZXZlbnRmZCwgY29uc3QgY2hhciAqYXJncylcXG4re1xcbitcXHRzdHJ1Y3Qgdm1wcmVzc3VyZSAqdm1wciA9IG1lbWNnX3RvX3ZtcHJlc3N1cmUobWVtY2cpO1xcbitcXHRzdHJ1Y3Qgdm1wcmVzc3VyZV9ldmVudCAqZXY7XFxuK1xcdGVudW0gdm1wcmVzc3VyZV9tb2RlcyBtb2RlID0gVk1QUkVTU1VSRV9OT19QQVNTVEhST1VHSDtcXG4rXFx0ZW51bSB2bXByZXNzdXJlX2xldmVscyBsZXZlbDtcXG4rXFx0Y2hhciAqc3BlYywgKnNwZWNfb3JpZztcXG4rXFx0Y2hhciAqdG9rZW47XFxuK1xcdGludCByZXQgPSAwO1xcbitcXG4rXFx0c3BlY19vcmlnID0gc3BlYyA9IGtzdHJuZHVwKGFyZ3MsIE1BWF9WTVBSRVNTVVJFX0FSR1NfTEVOLCBHRlBfS0VSTkVMKTtcXG4rXFx0aWYgKCFzcGVjKVxcbitcXHRcXHRyZXR1cm4gLUVOT01FTTtcXG4rXFxuK1xcdC8qIEZpbmQgcmVxdWlyZWQgbGV2ZWwgKi9cXG4rXFx0dG9rZW4gPSBzdHJzZXAoXFx1MDAyNnNwZWMsIFxcXCIsXFxcIik7XFxuK1xcdHJldCA9IG1hdGNoX3N0cmluZyh2bXByZXNzdXJlX3N0cl9sZXZlbHMsIFZNUFJFU1NVUkVfTlVNX0xFVkVMUywgdG9rZW4pO1xcbitcXHRpZiAocmV0IFxcdTAwM2MgMClcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcdGxldmVsID0gcmV0O1xcbitcXG4rXFx0LyogRmluZCBvcHRpb25hbCBtb2RlICovXFxuK1xcdHRva2VuID0gc3Ryc2VwKFxcdTAwMjZzcGVjLCBcXFwiLFxcXCIpO1xcbitcXHRpZiAodG9rZW4pIHtcXG4rXFx0XFx0cmV0ID0gbWF0Y2hfc3RyaW5nKHZtcHJlc3N1cmVfc3RyX21vZGVzLCBWTVBSRVNTVVJFX05VTV9NT0RFUywgdG9rZW4pO1xcbitcXHRcXHRpZiAocmV0IFxcdTAwM2MgMClcXG4rXFx0XFx0XFx0Z290byBvdXQ7XFxuK1xcdFxcdG1vZGUgPSByZXQ7XFxuK1xcdH1cXG4rXFxuK1xcdGV2ID0ga3phbGxvY19vYmooKmV2KTtcXG4rXFx0aWYgKCFldikge1xcbitcXHRcXHRyZXQgPSAtRU5PTUVNO1xcbitcXHRcXHRnb3RvIG91dDtcXG4rXFx0fVxcbitcXG4rXFx0ZXYtXFx1MDAzZWVmZCA9IGV2ZW50ZmQ7XFxuK1xcdGV2LVxcdTAwM2VsZXZlbCA9IGxldmVsO1xcbitcXHRldi1cXHUwMDNlbW9kZSA9IG1vZGU7XFxuK1xcbitcXHRtdXRleF9sb2NrKFxcdTAwMjZ2bXByLVxcdTAwM2VldmVudHNfbG9jayk7XFxuK1xcdGxpc3RfYWRkKFxcdTAwMjZldi1cXHUwMDNlbm9kZSwgXFx1MDAyNnZtcHItXFx1MDAzZWV2ZW50cyk7XFxuK1xcdG11dGV4X3VubG9jayhcXHUwMDI2dm1wci1cXHUwMDNlZXZlbnRzX2xvY2spO1xcbitcXHRyZXQgPSAwO1xcbitvdXQ6XFxuK1xcdGtmcmVlKHNwZWNfb3JpZyk7XFxuK1xcdHJldHVybiByZXQ7XFxuK31cXG4rXFxuKy8qKlxcbisgKiB2bXByZXNzdXJlX3VucmVnaXN0ZXJfZXZlbnQoKSAtIFVuYmluZCBldmVudGZkIGZyb20gdm1wcmVzc3VyZVxcbisgKiBAbWVtY2c6XFx0bWVtY2cgaGFuZGxlXFxuKyAqIEBldmVudGZkOlxcdGV2ZW50ZmQgY29udGV4dCB0aGF0IHdhcyB1c2VkIHRvIGxpbmsgdm1wcmVzc3VyZSB3aXRoIHRoZSBAY2dcXG4rICpcXG4rICogVGhpcyBmdW5jdGlvbiBkb2VzIGludGVybmFsIG1hbmlwdWxhdGlvbnMgdG8gZGV0YWNoIHRoZSBAZXZlbnRmZCBmcm9tXFxuKyAqIHRoZSB2bXByZXNzdXJlIG5vdGlmaWNhdGlvbnMsIGFuZCB0aGVuIGZyZWVzIGludGVybmFsIHJlc291cmNlc1xcbisgKiBhc3NvY2lhdGVkIHdpdGggdGhlIEBldmVudGZkIChidXQgdGhlIEBldmVudGZkIGl0c2VsZiBpcyBub3QgZnJlZWQpLlxcbisgKlxcbisgKiBUbyBiZSB1c2VkIGFzIG1lbWNnIGV2ZW50IG1ldGhvZC5cXG4rICovXFxuK3ZvaWQgdm1wcmVzc3VyZV91bnJlZ2lzdGVyX2V2ZW50KHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZyxcXG4rXFx0XFx0XFx0XFx0IHN0cnVjdCBldmVudGZkX2N0eCAqZXZlbnRmZClcXG4re1xcbitcXHRzdHJ1Y3Qgdm1wcmVzc3VyZSAqdm1wciA9IG1lbWNnX3RvX3ZtcHJlc3N1cmUobWVtY2cpO1xcbitcXHRzdHJ1Y3Qgdm1wcmVzc3VyZV9ldmVudCAqZXY7XFxuK1xcbitcXHRtdXRleF9sb2NrKFxcdTAwMjZ2bXByLVxcdTAwM2VldmVudHNfbG9jayk7XFxuK1xcdGxpc3RfZm9yX2VhY2hfZW50cnkoZXYsIFxcdTAwMjZ2bXByLVxcdTAwM2VldmVudHMsIG5vZGUpIHtcXG4rXFx0XFx0aWYgKGV2LVxcdTAwM2VlZmQgIT0gZXZlbnRmZClcXG4rXFx0XFx0XFx0Y29udGludWU7XFxuK1xcdFxcdGxpc3RfZGVsKFxcdTAwMjZldi1cXHUwMDNlbm9kZSk7XFxuK1xcdFxcdGtmcmVlKGV2KTtcXG4rXFx0XFx0YnJlYWs7XFxuK1xcdH1cXG4rXFx0bXV0ZXhfdW5sb2NrKFxcdTAwMjZ2bXByLVxcdTAwM2VldmVudHNfbG9jayk7XFxuK31cXG5kaWZmIC0tZ2l0IGEvbW0vdm1wcmVzc3VyZS5jIGIvbW0vdm1wcmVzc3VyZS5jXFxuaW5kZXggZjA1MzU1NGU1ODI2NDIuLmJjZmE0YmQ4ZmZjNTI5IDEwMDY0NFxcbi0tLSBhL21tL3ZtcHJlc3N1cmUuY1xcbisrKyBiL21tL3ZtcHJlc3N1cmUuY1xcbkBAIC03LDE2ICs3LDE1IEBAXFxuICAqXFxuICAqIEJhc2VkIG9uIGlkZWFzIGZyb20gQW5kcmV3IE1vcnRvbiwgRGF2aWQgUmllbnRqZXMsIEtPU0FLSSBNb3RvaGlybyxcXG4gICogTGVvbmlkIE1vaXNlaWNodWssIE1lbCBHb3JtYW4sIE1pbmNoYW4gS2ltIGFuZCBQZWtrYSBFbmJlcmcuXFxuKyAqXFxuKyAqIFRyZWUtbW9kZSAoY2dyb3VwIHYxIHVzZXJzcGFjZSBldmVudGZkKSBib29ra2VlcGluZyBsaXZlcyBpblxcbisgKiBtbS92bXByZXNzdXJlLXYxLmM7IHRoaXMgZmlsZSBob2xkcyB0aGUgc2hhcmVkIGNvZGUgYW5kIHRoZSBpbi1rZXJuZWxcXG4rICogKHRyZWU9ZmFsc2UpIHNvY2tldC1wcmVzc3VyZSBwYXRoIHRoYXQgcnVucyBvbiBjZ3JvdXAgdjIuXFxuICAqL1xcbiBcXG4gI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2Nncm91cC5oXFx1MDAzZVxcbi0jaW5jbHVkZSBcXHUwMDNjbGludXgvZnMuaFxcdTAwM2VcXG4gI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2xvZzIuaFxcdTAwM2VcXG4tI2luY2x1ZGUgXFx1MDAzY2xpbnV4L3NjaGVkLmhcXHUwMDNlXFxuICNpbmNsdWRlIFxcdTAwM2NsaW51eC9tbS5oXFx1MDAzZVxcbi0jaW5jbHVkZSBcXHUwMDNjbGludXgvdm1zdGF0LmhcXHUwMDNlXFxuLSNpbmNsdWRlIFxcdTAwM2NsaW51eC9ldmVudGZkLmhcXHUwMDNlXFxuLSNpbmNsdWRlIFxcdTAwM2NsaW51eC9zbGFiLmhcXHUwMDNlXFxuICNpbmNsdWRlIFxcdTAwM2NsaW51eC9zd2FwLmhcXHUwMDNlXFxuICNpbmNsdWRlIFxcdTAwM2NsaW51eC9wcmludGsuaFxcdTAwM2VcXG4gI2luY2x1ZGUgXFx1MDAzY2xpbnV4L3ZtcHJlc3N1cmUuaFxcdTAwM2VcXG5AQCAtMzUsNyArMzQsNyBAQFxcbiAgKiBUT0RPOiBNYWtlIHRoZSB3aW5kb3cgc2l6ZSBkZXBlbmQgb24gbWFjaGluZSBzaXplLCBhcyB3ZSBkbyBmb3Igdm1zdGF0XFxuICAqIHRocmVzaG9sZHMuIEN1cnJlbnRseSB3ZSBzZXQgaXQgdG8gNTEyIHBhZ2VzICgyTUIgZm9yIDRLQiBwYWdlcykuXFxuICAqL1xcbi1zdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyB2bXByZXNzdXJlX3dpbiA9IFNXQVBfQ0xVU1RFUl9NQVggKiAxNjtcXG4rY29uc3QgdW5zaWduZWQgbG9uZyB2bXByZXNzdXJlX3dpbiA9IFNXQVBfQ0xVU1RFUl9NQVggKiAxNjtcXG4gXFxuIC8qXFxuICAqIFRoZXNlIHRocmVzaG9sZHMgYXJlIHVzZWQgd2hlbiB3ZSBhY2NvdW50IG1lbW9yeSBwcmVzc3VyZSB0aHJvdWdoXFxuQEAgLTQ2LDY4ICs0NSw2IEBAIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIHZtcHJlc3N1cmVfd2luID0gU1dBUF9DTFVTVEVSX01BWCAqIDE2O1xcbiBzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHZtcHJlc3N1cmVfbGV2ZWxfbWVkID0gNjA7XFxuIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgdm1wcmVzc3VyZV9sZXZlbF9jcml0aWNhbCA9IDk1O1xcbiBcXG4tLypcXG4tICogV2hlbiB0aGVyZSBhcmUgdG9vIGxpdHRsZSBwYWdlcyBsZWZ0IHRvIHNjYW4sIHZtcHJlc3N1cmUoKSBtYXkgbWlzcyB0aGVcXG4tICogY3JpdGljYWwgcHJlc3N1cmUgYXMgbnVtYmVyIG9mIHBhZ2VzIHdpbGwgYmUgbGVzcyB0aGFuIFxcXCJ3aW5kb3cgc2l6ZVxcXCIuXFxuLSAqIEhvd2V2ZXIsIGluIHRoYXQgY2FzZSB0aGUgdm1zY2FuIHByaW9yaXR5IHdpbGwgcmFpc2UgZmFzdCBhcyB0aGVcXG4tICogcmVjbGFpbWVyIHdpbGwgdHJ5IHRvIHNjYW4gTFJVcyBtb3JlIGRlZXBseS5cXG4tICpcXG4tICogVGhlIHZtc2NhbiBsb2dpYyBjb25zaWRlcnMgdGhlc2Ugc3BlY2lhbCBwcmlvcml0aWVzOlxcbi0gKlxcbi0gKiBwcmlvID09IERFRl9QUklPUklUWSAoMTIpOiByZWNsYWltZXIgc3RhcnRzIHdpdGggdGhhdCB2YWx1ZVxcbi0gKiBwcmlvIFxcdTAwM2M9IERFRl9QUklPUklUWSAtIDIgOiBrc3dhcGQgYmVjb21lcyBzb21ld2hhdCBvdmVyd2hlbG1lZFxcbi0gKiBwcmlvID09IDAgICAgICAgICAgICAgICAgOiBjbG9zZSB0byBPT00sIGtlcm5lbCBzY2FucyBldmVyeSBwYWdlIGluIGFuIGxydVxcbi0gKlxcbi0gKiBBbnkgdmFsdWUgaW4gdGhpcyByYW5nZSBpcyBhY2NlcHRhYmxlIGZvciB0aGlzIHR1bmFibGUgKGkuZS4gZnJvbSAxMiB0b1xcbi0gKiAwKS4gQ3VycmVudCB2YWx1ZSBmb3IgdGhlIHZtcHJlc3N1cmVfbGV2ZWxfY3JpdGljYWxfcHJpbyBpcyBjaG9zZW5cXG4tICogZW1waXJpY2FsbHksIGJ1dCB0aGUgbnVtYmVyLCBpbiBlc3NlbmNlLCBtZWFucyB0aGF0IHdlIGNvbnNpZGVyXFxuLSAqIGNyaXRpY2FsIGxldmVsIHdoZW4gc2Nhbm5pbmcgZGVwdGggaXMgfjEwJSBvZiB0aGUgbHJ1IHNpemUgKHZtc2Nhblxcbi0gKiBzY2FucyAnbHJ1X3NpemUgXFx1MDAzZVxcdTAwM2UgcHJpbycgcGFnZXMsIHNvIGl0IGlzIGFjdHVhbGx5IDEyLjUlLCBvciBvbmVcXG4tICogZWlnaHRzKS5cXG4tICovXFxuLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgdm1wcmVzc3VyZV9sZXZlbF9jcml0aWNhbF9wcmlvID0gaWxvZzIoMTAwIC8gMTApO1xcbi1cXG4tc3RhdGljIHN0cnVjdCB2bXByZXNzdXJlICp3b3JrX3RvX3ZtcHJlc3N1cmUoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKVxcbi17XFxuLVxcdHJldHVybiBjb250YWluZXJfb2Yod29yaywgc3RydWN0IHZtcHJlc3N1cmUsIHdvcmspO1xcbi19XFxuLVxcbi1zdGF0aWMgc3RydWN0IHZtcHJlc3N1cmUgKnZtcHJlc3N1cmVfcGFyZW50KHN0cnVjdCB2bXByZXNzdXJlICp2bXByKVxcbi17XFxuLVxcdHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZyA9IHZtcHJlc3N1cmVfdG9fbWVtY2codm1wcik7XFxuLVxcbi1cXHRtZW1jZyA9IHBhcmVudF9tZW1fY2dyb3VwKG1lbWNnKTtcXG4tXFx0aWYgKCFtZW1jZylcXG4tXFx0XFx0cmV0dXJuIE5VTEw7XFxuLVxcdHJldHVybiBtZW1jZ190b192bXByZXNzdXJlKG1lbWNnKTtcXG4tfVxcbi1cXG4tZW51bSB2bXByZXNzdXJlX2xldmVscyB7XFxuLVxcdFZNUFJFU1NVUkVfTE9XID0gMCxcXG4tXFx0Vk1QUkVTU1VSRV9NRURJVU0sXFxuLVxcdFZNUFJFU1NVUkVfQ1JJVElDQUwsXFxuLVxcdFZNUFJFU1NVUkVfTlVNX0xFVkVMUyxcXG4tfTtcXG4tXFxuLWVudW0gdm1wcmVzc3VyZV9tb2RlcyB7XFxuLVxcdFZNUFJFU1NVUkVfTk9fUEFTU1RIUk9VR0ggPSAwLFxcbi1cXHRWTVBSRVNTVVJFX0hJRVJBUkNIWSxcXG4tXFx0Vk1QUkVTU1VSRV9MT0NBTCxcXG4tXFx0Vk1QUkVTU1VSRV9OVU1fTU9ERVMsXFxuLX07XFxuLVxcbi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHZtcHJlc3N1cmVfc3RyX2xldmVsc1tdID0ge1xcbi1cXHRbVk1QUkVTU1VSRV9MT1ddID0gXFxcImxvd1xcXCIsXFxuLVxcdFtWTVBSRVNTVVJFX01FRElVTV0gPSBcXFwibWVkaXVtXFxcIixcXG4tXFx0W1ZNUFJFU1NVUkVfQ1JJVElDQUxdID0gXFxcImNyaXRpY2FsXFxcIixcXG4tfTtcXG4tXFxuLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgdm1wcmVzc3VyZV9zdHJfbW9kZXNbXSA9IHtcXG4tXFx0W1ZNUFJFU1NVUkVfTk9fUEFTU1RIUk9VR0hdID0gXFxcImRlZmF1bHRcXFwiLFxcbi1cXHRbVk1QUkVTU1VSRV9ISUVSQVJDSFldID0gXFxcImhpZXJhcmNoeVxcXCIsXFxuLVxcdFtWTVBSRVNTVVJFX0xPQ0FMXSA9IFxcXCJsb2NhbFxcXCIsXFxuLX07XFxuLVxcbiBzdGF0aWMgZW51bSB2bXByZXNzdXJlX2xldmVscyB2bXByZXNzdXJlX2xldmVsKHVuc2lnbmVkIGxvbmcgcHJlc3N1cmUpXFxuIHtcXG4gXFx0aWYgKHByZXNzdXJlIFxcdTAwM2U9IHZtcHJlc3N1cmVfbGV2ZWxfY3JpdGljYWwpXFxuQEAgLTExNyw4ICs1NCw4IEBAIHN0YXRpYyBlbnVtIHZtcHJlc3N1cmVfbGV2ZWxzIHZtcHJlc3N1cmVfbGV2ZWwodW5zaWduZWQgbG9uZyBwcmVzc3VyZSlcXG4gXFx0cmV0dXJuIFZNUFJFU1NVUkVfTE9XO1xcbiB9XFxuIFxcbi1zdGF0aWMgZW51bSB2bXByZXNzdXJlX2xldmVscyB2bXByZXNzdXJlX2NhbGNfbGV2ZWwodW5zaWduZWQgbG9uZyBzY2FubmVkLFxcbi1cXHRcXHRcXHRcXHRcXHRcXHQgICAgdW5zaWduZWQgbG9uZyByZWNsYWltZWQpXFxuK2VudW0gdm1wcmVzc3VyZV9sZXZlbHMgdm1wcmVzc3VyZV9jYWxjX2xldmVsKHVuc2lnbmVkIGxvbmcgc2Nhbm5lZCxcXG4rXFx0XFx0XFx0XFx0XFx0ICAgICB1bnNpZ25lZCBsb25nIHJlY2xhaW1lZClcXG4ge1xcbiBcXHR1bnNpZ25lZCBsb25nIHNjYWxlID0gc2Nhbm5lZCArIHJlY2xhaW1lZDtcXG4gXFx0dW5zaWduZWQgbG9uZyBwcmVzc3VyZSA9IDA7XFxuQEAgLTE0Nyw3NCArODQsNiBAQCBzdGF0aWMgZW51bSB2bXByZXNzdXJlX2xldmVscyB2bXByZXNzdXJlX2NhbGNfbGV2ZWwodW5zaWduZWQgbG9uZyBzY2FubmVkLFxcbiBcXHRyZXR1cm4gdm1wcmVzc3VyZV9sZXZlbChwcmVzc3VyZSk7XFxuIH1cXG4gXFxuLXN0cnVjdCB2bXByZXNzdXJlX2V2ZW50IHtcXG4tXFx0c3RydWN0IGV2ZW50ZmRfY3R4ICplZmQ7XFxuLVxcdGVudW0gdm1wcmVzc3VyZV9sZXZlbHMgbGV2ZWw7XFxuLVxcdGVudW0gdm1wcmVzc3VyZV9tb2RlcyBtb2RlO1xcbi1cXHRzdHJ1Y3QgbGlzdF9oZWFkIG5vZGU7XFxuLX07XFxuLVxcbi1zdGF0aWMgYm9vbCB2bXByZXNzdXJlX2V2ZW50KHN0cnVjdCB2bXByZXNzdXJlICp2bXByLFxcbi1cXHRcXHRcXHQgICAgIGNvbnN0IGVudW0gdm1wcmVzc3VyZV9sZXZlbHMgbGV2ZWwsXFxuLVxcdFxcdFxcdCAgICAgYm9vbCBhbmNlc3RvciwgYm9vbCBzaWduYWxsZWQpXFxuLXtcXG4tXFx0c3RydWN0IHZtcHJlc3N1cmVfZXZlbnQgKmV2O1xcbi1cXHRib29sIHJldCA9IGZhbHNlO1xcbi1cXG4tXFx0bXV0ZXhfbG9jayhcXHUwMDI2dm1wci1cXHUwMDNlZXZlbnRzX2xvY2spO1xcbi1cXHRsaXN0X2Zvcl9lYWNoX2VudHJ5KGV2LCBcXHUwMDI2dm1wci1cXHUwMDNlZXZlbnRzLCBub2RlKSB7XFxuLVxcdFxcdGlmIChhbmNlc3RvciBcXHUwMDI2XFx1MDAyNiBldi1cXHUwMDNlbW9kZSA9PSBWTVBSRVNTVVJFX0xPQ0FMKVxcbi1cXHRcXHRcXHRjb250aW51ZTtcXG4tXFx0XFx0aWYgKHNpZ25hbGxlZCBcXHUwMDI2XFx1MDAyNiBldi1cXHUwMDNlbW9kZSA9PSBWTVBSRVNTVVJFX05PX1BBU1NUSFJPVUdIKVxcbi1cXHRcXHRcXHRjb250aW51ZTtcXG4tXFx0XFx0aWYgKGxldmVsIFxcdTAwM2MgZXYtXFx1MDAzZWxldmVsKVxcbi1cXHRcXHRcXHRjb250aW51ZTtcXG4tXFx0XFx0ZXZlbnRmZF9zaWduYWwoZXYtXFx1MDAzZWVmZCk7XFxuLVxcdFxcdHJldCA9IHRydWU7XFxuLVxcdH1cXG4tXFx0bXV0ZXhfdW5sb2NrKFxcdTAwMjZ2bXByLVxcdTAwM2VldmVudHNfbG9jayk7XFxuLVxcbi1cXHRyZXR1cm4gcmV0O1xcbi19XFxuLVxcbi1zdGF0aWMgdm9pZCB2bXByZXNzdXJlX3dvcmtfZm4oc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKVxcbi17XFxuLVxcdHN0cnVjdCB2bXByZXNzdXJlICp2bXByID0gd29ya190b192bXByZXNzdXJlKHdvcmspO1xcbi1cXHR1bnNpZ25lZCBsb25nIHNjYW5uZWQ7XFxuLVxcdHVuc2lnbmVkIGxvbmcgcmVjbGFpbWVkO1xcbi1cXHRlbnVtIHZtcHJlc3N1cmVfbGV2ZWxzIGxldmVsO1xcbi1cXHRib29sIGFuY2VzdG9yID0gZmFsc2U7XFxuLVxcdGJvb2wgc2lnbmFsbGVkID0gZmFsc2U7XFxuLVxcbi1cXHRzcGluX2xvY2soXFx1MDAyNnZtcHItXFx1MDAzZXNyX2xvY2spO1xcbi1cXHQvKlxcbi1cXHQgKiBTZXZlcmFsIGNvbnRleHRzIG1pZ2h0IGJlIGNhbGxpbmcgdm1wcmVzc3VyZSgpLCBzbyBpdCBpc1xcbi1cXHQgKiBwb3NzaWJsZSB0aGF0IHRoZSB3b3JrIHdhcyByZXNjaGVkdWxlZCBhZ2FpbiBiZWZvcmUgdGhlIG9sZFxcbi1cXHQgKiB3b3JrIGNvbnRleHQgY2xlYXJlZCB0aGUgY291bnRlcnMuIEluIHRoYXQgY2FzZSB3ZSB3aWxsIHJ1blxcbi1cXHQgKiBqdXN0IGFmdGVyIHRoZSBvbGQgd29yayByZXR1cm5zLCBidXQgdGhlbiBzY2FubmVkIG1pZ2h0IGJlIHplcm9cXG4tXFx0ICogaGVyZS4gTm8gbmVlZCBmb3IgYW55IGxvY2tzIGhlcmUgc2luY2Ugd2UgZG9uJ3QgY2FyZSBpZlxcbi1cXHQgKiB2bXByLVxcdTAwM2VyZWNsYWltZWQgaXMgaW4gc3luYy5cXG4tXFx0ICovXFxuLVxcdHNjYW5uZWQgPSB2bXByLVxcdTAwM2V0cmVlX3NjYW5uZWQ7XFxuLVxcdGlmICghc2Nhbm5lZCkge1xcbi1cXHRcXHRzcGluX3VubG9jayhcXHUwMDI2dm1wci1cXHUwMDNlc3JfbG9jayk7XFxuLVxcdFxcdHJldHVybjtcXG4tXFx0fVxcbi1cXG4tXFx0cmVjbGFpbWVkID0gdm1wci1cXHUwMDNldHJlZV9yZWNsYWltZWQ7XFxuLVxcdHZtcHItXFx1MDAzZXRyZWVfc2Nhbm5lZCA9IDA7XFxuLVxcdHZtcHItXFx1MDAzZXRyZWVfcmVjbGFpbWVkID0gMDtcXG4tXFx0c3Bpbl91bmxvY2soXFx1MDAyNnZtcHItXFx1MDAzZXNyX2xvY2spO1xcbi1cXG4tXFx0bGV2ZWwgPSB2bXByZXNzdXJlX2NhbGNfbGV2ZWwoc2Nhbm5lZCwgcmVjbGFpbWVkKTtcXG4tXFxuLVxcdGRvIHtcXG4tXFx0XFx0aWYgKHZtcHJlc3N1cmVfZXZlbnQodm1wciwgbGV2ZWwsIGFuY2VzdG9yLCBzaWduYWxsZWQpKVxcbi1cXHRcXHRcXHRzaWduYWxsZWQgPSB0cnVlO1xcbi1cXHRcXHRhbmNlc3RvciA9IHRydWU7XFxuLVxcdH0gd2hpbGUgKCh2bXByID0gdm1wcmVzc3VyZV9wYXJlbnQodm1wcikpKTtcXG4tfVxcbi1cXG4gLyoqXFxuICAqIHZtcHJlc3N1cmUoKSAtIEFjY291bnQgbWVtb3J5IHByZXNzdXJlIHRocm91Z2ggc2Nhbm5lZC9yZWNsYWltZWQgcmF0aW9cXG4gICogQGdmcDpcXHRyZWNsYWltZXIncyBnZnAgbWFza1xcbkBAIC0yNDYsMTEgKzExNSwxMyBAQCB2b2lkIHZtcHJlc3N1cmUoZ2ZwX3QgZ2ZwLCBpbnQgb3JkZXIsIHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZywgYm9vbCB0cmVlLFxcbiBcXHRcXHRyZXR1cm47XFxuIFxcbiBcXHQvKlxcbi1cXHQgKiBUaGUgaW4ta2VybmVsIHVzZXJzIG9ubHkgY2FyZSBhYm91dCB0aGUgcmVjbGFpbSBlZmZpY2llbmN5XFxuLVxcdCAqIGZvciB0aGlzIEBtZW1jZyByYXRoZXIgdGhhbiB0aGUgd2hvbGUgc3VidHJlZSwgYW5kIHRoZXJlXFxuLVxcdCAqIGlzbid0IGFuZCB3b24ndCBiZSBhbnkgaW4ta2VybmVsIHVzZXIgaW4gYSBsZWdhY3kgY2dyb3VwLlxcbitcXHQgKiBPbmx5IHR3byBjb21iaW5hdGlvbnMgaGF2ZSBhIGNvbnN1bWVyOlxcbitcXHQgKiAgIGNncm91cCB2MiArIHRyZWU9ZmFsc2UgLVxcdTAwM2UgaW4ta2VybmVsIHNvY2tldCBwcmVzc3VyZVxcbitcXHQgKiAgIGNncm91cCB2MSArIHRyZWU9dHJ1ZSAgLVxcdTAwM2UgdXNlcnNwYWNlIGV2ZW50ZmRzIChtZW1vcnkucHJlc3N1cmVfbGV2ZWwpXFxuK1xcdCAqIFNraXAgdGhlIG90aGVyIHR3bzogbm90aGluZyBjb25zdW1lcyB0aGUgcmVzdWx0LlxcbiBcXHQgKi9cXG4tXFx0aWYgKCFjZ3JvdXBfc3Vic3lzX29uX2RmbChtZW1vcnlfY2dycF9zdWJzeXMpIFxcdTAwMjZcXHUwMDI2ICF0cmVlKVxcbitcXHRpZiAoKCFjZ3JvdXBfc3Vic3lzX29uX2RmbChtZW1vcnlfY2dycF9zdWJzeXMpIFxcdTAwMjZcXHUwMDI2ICF0cmVlKSB8fFxcbitcXHQgICAgKGNncm91cF9zdWJzeXNfb25fZGZsKG1lbW9yeV9jZ3JwX3N1YnN5cykgXFx1MDAyNlxcdTAwMjYgdHJlZSkpXFxuIFxcdFxcdHJldHVybjtcXG4gXFxuIFxcdHZtcHIgPSBtZW1jZ190b192bXByZXNzdXJlKG1lbWNnKTtcXG5AQCAtMjgxLDE0ICsxNTIsNyBAQCB2b2lkIHZtcHJlc3N1cmUoZ2ZwX3QgZ2ZwLCBpbnQgb3JkZXIsIHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZywgYm9vbCB0cmVlLFxcbiBcXHRcXHRyZXR1cm47XFxuIFxcbiBcXHRpZiAodHJlZSkge1xcbi1cXHRcXHRzcGluX2xvY2soXFx1MDAyNnZtcHItXFx1MDAzZXNyX2xvY2spO1xcbi1cXHRcXHRzY2FubmVkID0gdm1wci1cXHUwMDNldHJlZV9zY2FubmVkICs9IHNjYW5uZWQ7XFxuLVxcdFxcdHZtcHItXFx1MDAzZXRyZWVfcmVjbGFpbWVkICs9IHJlY2xhaW1lZDtcXG4tXFx0XFx0c3Bpbl91bmxvY2soXFx1MDAyNnZtcHItXFx1MDAzZXNyX2xvY2spO1xcbi1cXG4tXFx0XFx0aWYgKHNjYW5uZWQgXFx1MDAzYyB2bXByZXNzdXJlX3dpbilcXG4tXFx0XFx0XFx0cmV0dXJuO1xcbi1cXHRcXHRzY2hlZHVsZV93b3JrKFxcdTAwMjZ2bXByLVxcdTAwM2V3b3JrKTtcXG4rXFx0XFx0dm1wcmVzc3VyZV92MV9hY2NvdW50X3RyZWUodm1wciwgc2Nhbm5lZCwgcmVjbGFpbWVkKTtcXG4gXFx0fSBlbHNlIHtcXG4gXFx0XFx0ZW51bSB2bXByZXNzdXJlX2xldmVscyBsZXZlbDtcXG4gXFxuQEAgLTMzMCwxMzQgKzE5NCw2IEBAIHZvaWQgdm1wcmVzc3VyZShnZnBfdCBnZnAsIGludCBvcmRlciwgc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLCBib29sIHRyZWUsXFxuIFxcdH1cXG4gfVxcbiBcXG4tLyoqXFxuLSAqIHZtcHJlc3N1cmVfcHJpbygpIC0gQWNjb3VudCBtZW1vcnkgcHJlc3N1cmUgdGhyb3VnaCByZWNsYWltZXIgcHJpb3JpdHkgbGV2ZWxcXG4tICogQGdmcDpcXHRyZWNsYWltZXIncyBnZnAgbWFza1xcbi0gKiBAbWVtY2c6XFx0Y2dyb3VwIG1lbW9yeSBjb250cm9sbGVyIGhhbmRsZVxcbi0gKiBAcHJpbzpcXHRyZWNsYWltZXIncyBwcmlvcml0eVxcbi0gKlxcbi0gKiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgZnJvbSB0aGUgcmVjbGFpbSBwYXRoIGV2ZXJ5IHRpbWUgd2hlblxcbi0gKiB0aGUgdm1zY2FuJ3MgcmVjbGFpbWluZyBwcmlvcml0eSAoc2Nhbm5pbmcgZGVwdGgpIGNoYW5nZXMuXFxuLSAqXFxuLSAqIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgcmV0dXJuIGFueSB2YWx1ZS5cXG4tICovXFxuLXZvaWQgdm1wcmVzc3VyZV9wcmlvKGdmcF90IGdmcCwgc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLCBpbnQgcHJpbylcXG4te1xcbi1cXHQvKlxcbi1cXHQgKiBXZSBvbmx5IHVzZSBwcmlvIGZvciBhY2NvdW50aW5nIGNyaXRpY2FsIGxldmVsLiBGb3IgbW9yZSBpbmZvXFxuLVxcdCAqIHNlZSBjb21tZW50IGZvciB2bXByZXNzdXJlX2xldmVsX2NyaXRpY2FsX3ByaW8gdmFyaWFibGUgYWJvdmUuXFxuLVxcdCAqL1xcbi1cXHRpZiAocHJpbyBcXHUwMDNlIHZtcHJlc3N1cmVfbGV2ZWxfY3JpdGljYWxfcHJpbylcXG4tXFx0XFx0cmV0dXJuO1xcbi1cXG4tXFx0LypcXG4tXFx0ICogT0ssIHRoZSBwcmlvIGlzIGJlbG93IHRoZSB0aHJlc2hvbGQsIHVwZGF0aW5nIHZtcHJlc3N1cmVcXG4tXFx0ICogaW5mb3JtYXRpb24gYmVmb3JlIHNocmlua2VyIGRpdmVzIGludG8gbG9uZyBzaHJpbmtpbmcgb2YgbG9uZ1xcbi1cXHQgKiByYW5nZSB2bXNjYW4uIFBhc3Npbmcgc2Nhbm5lZCA9IHZtcHJlc3N1cmVfd2luLCByZWNsYWltZWQgPSAwXFxuLVxcdCAqIHRvIHRoZSB2bXByZXNzdXJlKCkgYmFzaWNhbGx5IG1lYW5zIHRoYXQgd2Ugc2lnbmFsICdjcml0aWNhbCdcXG4tXFx0ICogbGV2ZWwuXFxuLVxcdCAqL1xcbi1cXHR2bXByZXNzdXJlKGdmcCwgMCwgbWVtY2csIHRydWUsIHZtcHJlc3N1cmVfd2luLCAwKTtcXG4tfVxcbi1cXG4tI2RlZmluZSBNQVhfVk1QUkVTU1VSRV9BUkdTX0xFTlxcdChzdHJsZW4oXFxcImNyaXRpY2FsXFxcIikgKyBzdHJsZW4oXFxcImhpZXJhcmNoeVxcXCIpICsgMilcXG4tXFxuLS8qKlxcbi0gKiB2bXByZXNzdXJlX3JlZ2lzdGVyX2V2ZW50KCkgLSBCaW5kIHZtcHJlc3N1cmUgbm90aWZpY2F0aW9ucyB0byBhbiBldmVudGZkXFxuLSAqIEBtZW1jZzpcXHRtZW1jZyB0aGF0IGlzIGludGVyZXN0ZWQgaW4gdm1wcmVzc3VyZSBub3RpZmljYXRpb25zXFxuLSAqIEBldmVudGZkOlxcdGV2ZW50ZmQgY29udGV4dCB0byBsaW5rIG5vdGlmaWNhdGlvbnMgd2l0aFxcbi0gKiBAYXJnczpcXHRldmVudCBhcmd1bWVudHMgKHByZXNzdXJlIGxldmVsIHRocmVzaG9sZCwgb3B0aW9uYWwgbW9kZSlcXG4tICpcXG4tICogVGhpcyBmdW5jdGlvbiBhc3NvY2lhdGVzIGV2ZW50ZmQgY29udGV4dCB3aXRoIHRoZSB2bXByZXNzdXJlXFxuLSAqIGluZnJhc3RydWN0dXJlLCBzbyB0aGF0IHRoZSBub3RpZmljYXRpb25zIHdpbGwgYmUgZGVsaXZlcmVkIHRvIHRoZVxcbi0gKiBAZXZlbnRmZC4gVGhlIEBhcmdzIHBhcmFtZXRlciBpcyBhIGNvbW1hLWRlbGltaXRlZCBzdHJpbmcgdGhhdCBkZW5vdGVzIGFcXG4tICogcHJlc3N1cmUgbGV2ZWwgdGhyZXNob2xkIChvbmUgb2Ygdm1wcmVzc3VyZV9zdHJfbGV2ZWxzLCBpLmUuIFxcXCJsb3dcXFwiLCBcXFwibWVkaXVtXFxcIixcXG4tICogb3IgXFxcImNyaXRpY2FsXFxcIikgYW5kIGFuIG9wdGlvbmFsIG1vZGUgKG9uZSBvZiB2bXByZXNzdXJlX3N0cl9tb2RlcywgaS5lLlxcbi0gKiBcXFwiaGllcmFyY2h5XFxcIiBvciBcXFwibG9jYWxcXFwiKS5cXG4tICpcXG4tICogVG8gYmUgdXNlZCBhcyBtZW1jZyBldmVudCBtZXRob2QuXFxuLSAqXFxuLSAqIFJldHVybjogMCBvbiBzdWNjZXNzLCAtRU5PTUVNIG9uIG1lbW9yeSBmYWlsdXJlIG9yIC1FSU5WQUwgaWYgQGFyZ3MgY291bGRcXG4tICogbm90IGJlIHBhcnNlZC5cXG4tICovXFxuLWludCB2bXByZXNzdXJlX3JlZ2lzdGVyX2V2ZW50KHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZyxcXG4tXFx0XFx0XFx0ICAgICAgc3RydWN0IGV2ZW50ZmRfY3R4ICpldmVudGZkLCBjb25zdCBjaGFyICphcmdzKVxcbi17XFxuLVxcdHN0cnVjdCB2bXByZXNzdXJlICp2bXByID0gbWVtY2dfdG9fdm1wcmVzc3VyZShtZW1jZyk7XFxuLVxcdHN0cnVjdCB2bXByZXNzdXJlX2V2ZW50ICpldjtcXG4tXFx0ZW51bSB2bXByZXNzdXJlX21vZGVzIG1vZGUgPSBWTVBSRVNTVVJFX05PX1BBU1NUSFJPVUdIO1xcbi1cXHRlbnVtIHZtcHJlc3N1cmVfbGV2ZWxzIGxldmVsO1xcbi1cXHRjaGFyICpzcGVjLCAqc3BlY19vcmlnO1xcbi1cXHRjaGFyICp0b2tlbjtcXG4tXFx0aW50IHJldCA9IDA7XFxuLVxcbi1cXHRzcGVjX29yaWcgPSBzcGVjID0ga3N0cm5kdXAoYXJncywgTUFYX1ZNUFJFU1NVUkVfQVJHU19MRU4sIEdGUF9LRVJORUwpO1xcbi1cXHRpZiAoIXNwZWMpXFxuLVxcdFxcdHJldHVybiAtRU5PTUVNO1xcbi1cXG4tXFx0LyogRmluZCByZXF1aXJlZCBsZXZlbCAqL1xcbi1cXHR0b2tlbiA9IHN0cnNlcChcXHUwMDI2c3BlYywgXFxcIixcXFwiKTtcXG4tXFx0cmV0ID0gbWF0Y2hfc3RyaW5nKHZtcHJlc3N1cmVfc3RyX2xldmVscywgVk1QUkVTU1VSRV9OVU1fTEVWRUxTLCB0b2tlbik7XFxuLVxcdGlmIChyZXQgXFx1MDAzYyAwKVxcbi1cXHRcXHRnb3RvIG91dDtcXG4tXFx0bGV2ZWwgPSByZXQ7XFxuLVxcbi1cXHQvKiBGaW5kIG9wdGlvbmFsIG1vZGUgKi9cXG4tXFx0dG9rZW4gPSBzdHJzZXAoXFx1MDAyNnNwZWMsIFxcXCIsXFxcIik7XFxuLVxcdGlmICh0b2tlbikge1xcbi1cXHRcXHRyZXQgPSBtYXRjaF9zdHJpbmcodm1wcmVzc3VyZV9zdHJfbW9kZXMsIFZNUFJFU1NVUkVfTlVNX01PREVTLCB0b2tlbik7XFxuLVxcdFxcdGlmIChyZXQgXFx1MDAzYyAwKVxcbi1cXHRcXHRcXHRnb3RvIG91dDtcXG4tXFx0XFx0bW9kZSA9IHJldDtcXG4tXFx0fVxcbi1cXG4tXFx0ZXYgPSBremFsbG9jX29iaigqZXYpO1xcbi1cXHRpZiAoIWV2KSB7XFxuLVxcdFxcdHJldCA9IC1FTk9NRU07XFxuLVxcdFxcdGdvdG8gb3V0O1xcbi1cXHR9XFxuLVxcbi1cXHRldi1cXHUwMDNlZWZkID0gZXZlbnRmZDtcXG4tXFx0ZXYtXFx1MDAzZWxldmVsID0gbGV2ZWw7XFxuLVxcdGV2LVxcdTAwM2Vtb2RlID0gbW9kZTtcXG4tXFxuLVxcdG11dGV4X2xvY2soXFx1MDAyNnZtcHItXFx1MDAzZWV2ZW50c19sb2NrKTtcXG4tXFx0bGlzdF9hZGQoXFx1MDAyNmV2LVxcdTAwM2Vub2RlLCBcXHUwMDI2dm1wci1cXHUwMDNlZXZlbnRzKTtcXG4tXFx0bXV0ZXhfdW5sb2NrKFxcdTAwMjZ2bXByLVxcdTAwM2VldmVudHNfbG9jayk7XFxuLVxcdHJldCA9IDA7XFxuLW91dDpcXG4tXFx0a2ZyZWUoc3BlY19vcmlnKTtcXG4tXFx0cmV0dXJuIHJldDtcXG4tfVxcbi1cXG4tLyoqXFxuLSAqIHZtcHJlc3N1cmVfdW5yZWdpc3Rlcl9ldmVudCgpIC0gVW5iaW5kIGV2ZW50ZmQgZnJvbSB2bXByZXNzdXJlXFxuLSAqIEBtZW1jZzpcXHRtZW1jZyBoYW5kbGVcXG4tICogQGV2ZW50ZmQ6XFx0ZXZlbnRmZCBjb250ZXh0IHRoYXQgd2FzIHVzZWQgdG8gbGluayB2bXByZXNzdXJlIHdpdGggdGhlIEBjZ1xcbi0gKlxcbi0gKiBUaGlzIGZ1bmN0aW9uIGRvZXMgaW50ZXJuYWwgbWFuaXB1bGF0aW9ucyB0byBkZXRhY2ggdGhlIEBldmVudGZkIGZyb21cXG4tICogdGhlIHZtcHJlc3N1cmUgbm90aWZpY2F0aW9ucywgYW5kIHRoZW4gZnJlZXMgaW50ZXJuYWwgcmVzb3VyY2VzXFxuLSAqIGFzc29jaWF0ZWQgd2l0aCB0aGUgQGV2ZW50ZmQgKGJ1dCB0aGUgQGV2ZW50ZmQgaXRzZWxmIGlzIG5vdCBmcmVlZCkuXFxuLSAqXFxuLSAqIFRvIGJlIHVzZWQgYXMgbWVtY2cgZXZlbnQgbWV0aG9kLlxcbi0gKi9cXG4tdm9pZCB2bXByZXNzdXJlX3VucmVnaXN0ZXJfZXZlbnQoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLFxcbi1cXHRcXHRcXHRcXHQgc3RydWN0IGV2ZW50ZmRfY3R4ICpldmVudGZkKVxcbi17XFxuLVxcdHN0cnVjdCB2bXByZXNzdXJlICp2bXByID0gbWVtY2dfdG9fdm1wcmVzc3VyZShtZW1jZyk7XFxuLVxcdHN0cnVjdCB2bXByZXNzdXJlX2V2ZW50ICpldjtcXG4tXFxuLVxcdG11dGV4X2xvY2soXFx1MDAyNnZtcHItXFx1MDAzZWV2ZW50c19sb2NrKTtcXG4tXFx0bGlzdF9mb3JfZWFjaF9lbnRyeShldiwgXFx1MDAyNnZtcHItXFx1MDAzZWV2ZW50cywgbm9kZSkge1xcbi1cXHRcXHRpZiAoZXYtXFx1MDAzZWVmZCAhPSBldmVudGZkKVxcbi1cXHRcXHRcXHRjb250aW51ZTtcXG4tXFx0XFx0bGlzdF9kZWwoXFx1MDAyNmV2LVxcdTAwM2Vub2RlKTtcXG4tXFx0XFx0a2ZyZWUoZXYpO1xcbi1cXHRcXHRicmVhaztcXG4tXFx0fVxcbi1cXHRtdXRleF91bmxvY2soXFx1MDAyNnZtcHItXFx1MDAzZWV2ZW50c19sb2NrKTtcXG4tfVxcbi1cXG4gLyoqXFxuICAqIHZtcHJlc3N1cmVfaW5pdCgpIC0gSW5pdGlhbGl6ZSB2bXByZXNzdXJlIGNvbnRyb2wgc3RydWN0dXJlXFxuICAqIEB2bXByOlxcdFN0cnVjdHVyZSB0byBiZSBpbml0aWFsaXplZFxcbkBAIC00NjgsOSArMjA0LDcgQEAgdm9pZCB2bXByZXNzdXJlX3VucmVnaXN0ZXJfZXZlbnQoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLFxcbiB2b2lkIHZtcHJlc3N1cmVfaW5pdChzdHJ1Y3Qgdm1wcmVzc3VyZSAqdm1wcilcXG4ge1xcbiBcXHRzcGluX2xvY2tfaW5pdChcXHUwMDI2dm1wci1cXHUwMDNlc3JfbG9jayk7XFxuLVxcdG11dGV4X2luaXQoXFx1MDAyNnZtcHItXFx1MDAzZWV2ZW50c19sb2NrKTtcXG4tXFx0SU5JVF9MSVNUX0hFQUQoXFx1MDAyNnZtcHItXFx1MDAzZWV2ZW50cyk7XFxuLVxcdElOSVRfV09SSyhcXHUwMDI2dm1wci1cXHUwMDNld29yaywgdm1wcmVzc3VyZV93b3JrX2ZuKTtcXG4rXFx0dm1wcmVzc3VyZV92MV9pbml0KHZtcHIpO1xcbiB9XFxuIFxcbiAvKipcXG5AQCAtNDgyLDkgKzIxNiw1IEBAIHZvaWQgdm1wcmVzc3VyZV9pbml0KHN0cnVjdCB2bXByZXNzdXJlICp2bXByKVxcbiAgKi9cXG4gdm9pZCB2bXByZXNzdXJlX2NsZWFudXAoc3RydWN0IHZtcHJlc3N1cmUgKnZtcHIpXFxuIHtcXG4tXFx0LypcXG4tXFx0ICogTWFrZSBzdXJlIHRoZXJlIGlzIG5vIHBlbmRpbmcgd29yayBiZWZvcmUgZXZlbnRmZCBpbmZyYXN0cnVjdHVyZVxcbi1cXHQgKiBnb2VzIGF3YXkuXFxuLVxcdCAqL1xcbi1cXHRmbHVzaF93b3JrKFxcdTAwMjZ2bXByLVxcdTAwM2V3b3JrKTtcXG4rXFx0dm1wcmVzc3VyZV92MV9jbGVhbnVwKHZtcHIpO1xcbiB9XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA2LTI5VDE0OjMzOjU3LjUwMzczNDY3N1oiLCJTZXEiOjIsIk5lc3RpbmciOjEsIlR5cGUiOiJhZ2VudCIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6ODQ4OTMzNzgwMzYsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiTUVNQ0dcIixcbiAgICBcIk1FTUNHX1YxXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwidm1wcmVzc3VyZVwiLFxuICAgIFwidm1wcmVzc3VyZV92MV9hY2NvdW50X3RyZWVcIixcbiAgICBcInZtcHJlc3N1cmVfd29ya19mblwiLFxuICAgIFwidm1wcmVzc3VyZV9ldmVudFwiLFxuICAgIFwidm1wcmVzc3VyZV9yZWdpc3Rlcl9ldmVudFwiLFxuICAgIFwidm1wcmVzc3VyZV91bnJlZ2lzdGVyX2V2ZW50XCIsXG4gICAgXCJ2bXByZXNzdXJlX3ByaW9cIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBleHRyYWN0cyBjZ3JvdXAgdjEgc3BlY2lmaWMgdm1wcmVzc3VyZSBsb2dpYyBpbnRvIGEgbmV3IGZpbGUgYG1tL3ZtcHJlc3N1cmUtdjEuY2AgZ3VhcmRlZCBieSBgQ09ORklHX01FTUNHX1YxYC4gSXQgYWxzbyBpbnRyb2R1Y2VzIGEgZnVuY3Rpb25hbCBvcHRpbWl6YXRpb24gaW4gYHZtcHJlc3N1cmUoKWAgdG8gcmV0dXJuIGVhcmx5IGZvciBjZ3JvdXAgdjIgd2hlbiBgdHJlZT10cnVlYCwgYXZvaWRpbmcgdW5uZWNlc3NhcnkgY291bnRlciBhY2N1bXVsYXRpb24gYW5kIHdvcmsgc2NoZWR1bGluZy4gVGhpcyBtb2RpZmllcyByZWFjaGFibGUgY29yZSBtZW1vcnkgbWFuYWdlbWVudCBsb2dpYyBhbmQgYWx0ZXJzIGV4ZWN1dGlvbiBmbG93LCBzbyBpdCBzaG91bGQgYmUgZnV6emVkLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiSW5zdHJ1Y3Rpb24iOiJZb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgbWFpbnRhaW5lci5cbllvdXIgam9iIGlzIHRvIHJldmlldyBhIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQgZGV0ZXJtaW5lXG5pZiBpdCBtYWtlcyBmdW5jdGlvbmFsIGNoYW5nZXMgdG8gdGhlIGtlcm5lbCB0aGF0IHNob3VsZCBiZSBmdXp6ZWQuXG5cbklNUE9SVEFOVDogVGhlIGNoYW5nZXMgaGF2ZSBBTFJFQURZIGJlZW4gYXBwbGllZCBhbmQgY29tbWl0dGVkIGFzIHRoZSBIRUFEIGNvbW1pdCBpblxueW91ciB3b3Jrc3BhY2UuIERvIE5PVCByZWx5IG9uIHlvdXIgaW50ZXJuYWwga25vd2xlZGdlIG9mIHRoZSBrZXJuZWwuIFlvdSBtdXN0IGFjdGl2ZWx5XG51c2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBleGFtaW5lIHRoZSBhY3R1YWwgc291cmNlIGNvZGUgYW5kIGNvbmZpcm0gYW55IGFzc3VtcHRpb25zLlxuXG5SZXR1cm4gV29ydGhGdXp6aW5nPWZhbHNlIGlmIHRoZSBwYXRjaCBvbmx5IGNvbnRhaW5zOlxuLSBNb2RpZmljYXRpb25zIHRvIERvY3VtZW50YXRpb24vLCBLY29uZmlnIGZpbGVzLCBvciBjb2RlIGNvbW1lbnRzLlxuLSBQdXJlbHkgZGVjb3JhdGl2ZSBjaGFuZ2VzLCBzdWNoIGFzIGxvZ2dpbmcgKGUuZy4sIHByX2VyciwgcHJpbnRrKSBvciB0cmFjZXBvaW50cy5cbi0gQ2hhbmdlcyB0byBudW1lcmljIGNvbnN0YW50cyBvciBtYWNyb3MgdGhhdCBkbyBub3QgZnVuY3Rpb25hbGx5IGFsdGVyIGV4ZWN1dGlvbiBmbG93LlxuLSBDb2RlIHBhdGhzIHRoYXQgYXJlIGltcG9zc2libGUgdG8gcmVhY2ggaW4gdmlydHVhbGl6ZWQgZW52aXJvbm1lbnRzIGxpa2UgR0NFIG9yIFFFTVUsXG5ldmVuIHdoZW4gdXRpbGl6aW5nIHNvZnR3YXJlLWVtdWxhdGVkIGhhcmR3YXJlIChlLmcuLCB1c2IgZ2FkZ2V0LCBtYWM4MDIxMV9od3NpbSkuXG5cbklmIGl0IG1vZGlmaWVzIHJlYWNoYWJsZSBjb3JlIGtlcm5lbCBsb2dpYywgZHJpdmVycywgb3IgYXJjaGl0ZWN0dXJlcywgdXNlIHlvdXIgY29kZSBzZWFyY2hcbnRvb2xzIHRvIHZlcmlmeSB0aGUgY29kZSBjYW4gYmUgZXhlY3V0ZWQsIHRoZW4gcmV0dXJuIFdvcnRoRnV6emluZz10cnVlLlxuXG5XaGVuIHJldHVybmluZyBXb3J0aEZ1enppbmc9dHJ1ZSwgeW91IE1VU1QgQUxTTzpcbjEuIEV4dHJhY3QgYW55IHNwZWNpZmljIGtlcm5lbCBmdW5jdGlvbnMgdGhhdCBzaG91bGQgYmUgaGVhdmlseSBmdXp6ZWQgaW50byBGb2N1c1N5bWJvbHMuXG4gICBBdm9pZCBsaXN0aW5nIGdlbmVyaWMgaG90LXBhdGggZnVuY3Rpb25zIHRvIHByZXZlbnQgc2tld2VkIHRlc3QgZGlzdHJpYnV0aW9ucy5cbjIuIElkZW50aWZ5IGFueSBzcGVjaWZpYyBDT05GSUdfIG9wdGlvbnMgcmVxdWlyZWQgdG8gcHJvcGVybHkgdGVzdCB0aGlzIG5ldy9tb2RpZmllZCBmZWF0dXJlLlxuICAgR28gYW5kIGxvb2sgaW50byB0aGUgS2NvbmZpZyBmaWxlcyBhbmQgY2hlY2sgZm9yIGlmZGVmcyBhcm91bmQgdGhlIGNvZGUsIGRvIG5vdCBtYWtlIGFzc3VtcHRpb25zLlxuICAgRG8gbm90IGxpc3QgdG9vIGdlbmVyaWMgY29uZmlncyAod2UgYWxyZWFkeSBoYXZlIHRoZW0gZW5hYmxlZCkuIE9ubHkgbGlzdCB0aG9zZSB0aGF0XG4gICBzcGVjaWZpY2FsbHkgY292ZXIgdGhlIG1vZGlmaWVkIGNvZGUuIExpc3QgdGhlbSBpbiB0aGUgRW5hYmxlQ29uZmlncyBvdXRwdXQgYXJyYXksXG4gICBhbmQgRE8gTk9UIGFkZCBhICdDT05GSUdfJyBwcmVmaXggKGUuZy4sIHJldHVybiBcIk5FVF9JUFY0XCIgaW5zdGVhZCBvZiBcIkNPTkZJR19ORVRfSVBWNFwiKS5cblByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLlxuXG5cblVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuXG5JdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS5cbklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC5cbiIsIlByb21wdCI6IkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOlxuY29tbWl0IGI1MTc0YWQ1ZGEyNDVmNTNmZWI3ODI0YWQ2YzEyZWU1ZmJmOWVhNDNcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgTW9uIEp1biAyOSAxNDozMzo1NSAyMDI2ICswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdm1wcmVzc3VyZS5oIGIvaW5jbHVkZS9saW51eC92bXByZXNzdXJlLmhcbmluZGV4IGZhZWNkNTUyMjQwMTc5Li5lNWU2YjY4ZDBkYzQzMiAxMDA2NDRcbi0tLSBhL2luY2x1ZGUvbGludXgvdm1wcmVzc3VyZS5oXG4rKysgYi9pbmNsdWRlL2xpbnV4L3ZtcHJlc3N1cmUuaFxuQEAgLTEzLDE4ICsxMywzMSBAQFxuIHN0cnVjdCB2bXByZXNzdXJlIHtcbiBcdHVuc2lnbmVkIGxvbmcgc2Nhbm5lZDtcbiBcdHVuc2lnbmVkIGxvbmcgcmVjbGFpbWVkO1xuK1x0LyogVGhlIGxvY2sgaXMgdXNlZCB0byBrZWVwIHRoZSBzY2FubmVkL3JlY2xhaW1lZCBpbiBzeW5jLiAqL1xuK1x0c3BpbmxvY2tfdCBzcl9sb2NrO1xuIFxuKyNpZmRlZiBDT05GSUdfTUVNQ0dfVjFcbitcdC8qXG4rXHQgKiB0cmVlPXRydWUgYWNjdW11bGF0b3JzIGZlZWQgdGhlIHYxIHVzZXJzcGFjZSBldmVudGZkIGludGVyZmFjZVxuK1x0ICogKG1lbW9yeS5wcmVzc3VyZV9sZXZlbCkuIERyYWluZWQgYnkgQHdvcmsuIHYyIGhhcyBubyBlcXVpdmFsZW50XG4rXHQgKiBpbnRlcmZhY2UsIHNvIHRoaXMgc3RhdGUgaXMgb21pdHRlZCBvbiBDT05GSUdfTUVNQ0dfVjE9biBidWlsZHMuXG4rXHQgKi9cbiBcdHVuc2lnbmVkIGxvbmcgdHJlZV9zY2FubmVkO1xuIFx0dW5zaWduZWQgbG9uZyB0cmVlX3JlY2xhaW1lZDtcbi1cdC8qIFRoZSBsb2NrIGlzIHVzZWQgdG8ga2VlcCB0aGUgc2Nhbm5lZC9yZWNsYWltZWQgYWJvdmUgaW4gc3luYy4gKi9cbi1cdHNwaW5sb2NrX3Qgc3JfbG9jaztcbi1cbiBcdC8qIFRoZSBsaXN0IG9mIHZtcHJlc3N1cmVfZXZlbnQgc3RydWN0cy4gKi9cbiBcdHN0cnVjdCBsaXN0X2hlYWQgZXZlbnRzO1xuIFx0LyogSGF2ZSB0byBncmFiIHRoZSBsb2NrIG9uIGV2ZW50cyB0cmF2ZXJzYWwgb3IgbW9kaWZpY2F0aW9ucy4gKi9cbiBcdHN0cnVjdCBtdXRleCBldmVudHNfbG9jaztcbiBcbiBcdHN0cnVjdCB3b3JrX3N0cnVjdCB3b3JrO1xuKyNlbmRpZlxuK307XG4rXG4rZW51bSB2bXByZXNzdXJlX2xldmVscyB7XG4rXHRWTVBSRVNTVVJFX0xPVyA9IDAsXG4rXHRWTVBSRVNTVVJFX01FRElVTSxcbitcdFZNUFJFU1NVUkVfQ1JJVElDQUwsXG4rXHRWTVBSRVNTVVJFX05VTV9MRVZFTFMsXG4gfTtcbiBcbiBzdHJ1Y3QgbWVtX2Nncm91cDtcbkBAIC0zMiwxOCArNDUsNDEgQEAgc3RydWN0IG1lbV9jZ3JvdXA7XG4gI2lmZGVmIENPTkZJR19NRU1DR1xuIHZvaWQgdm1wcmVzc3VyZShnZnBfdCBnZnAsIGludCBvcmRlciwgc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLCBib29sIHRyZWUsXG4gXHRcdHVuc2lnbmVkIGxvbmcgc2Nhbm5lZCwgdW5zaWduZWQgbG9uZyByZWNsYWltZWQpO1xuLWV4dGVybiB2b2lkIHZtcHJlc3N1cmVfcHJpbyhnZnBfdCBnZnAsIHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZywgaW50IHByaW8pO1xuLVxuIGV4dGVybiB2b2lkIHZtcHJlc3N1cmVfaW5pdChzdHJ1Y3Qgdm1wcmVzc3VyZSAqdm1wcik7XG4gZXh0ZXJuIHZvaWQgdm1wcmVzc3VyZV9jbGVhbnVwKHN0cnVjdCB2bXByZXNzdXJlICp2bXByKTtcbiBleHRlcm4gc3RydWN0IHZtcHJlc3N1cmUgKm1lbWNnX3RvX3ZtcHJlc3N1cmUoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnKTtcbiBleHRlcm4gc3RydWN0IG1lbV9jZ3JvdXAgKnZtcHJlc3N1cmVfdG9fbWVtY2coc3RydWN0IHZtcHJlc3N1cmUgKnZtcHIpO1xuK1xuKy8qIFNoYXJlZCB3aXRoIG1tL3ZtcHJlc3N1cmUtdjEuYy4gKi9cbitleHRlcm4gY29uc3QgdW5zaWduZWQgbG9uZyB2bXByZXNzdXJlX3dpbjtcbitleHRlcm4gZW51bSB2bXByZXNzdXJlX2xldmVscyB2bXByZXNzdXJlX2NhbGNfbGV2ZWwodW5zaWduZWQgbG9uZyBzY2FubmVkLFxuK1x0XHRcdFx0XHRcdCAgICB1bnNpZ25lZCBsb25nIHJlY2xhaW1lZCk7XG4rXG4rI2lmZGVmIENPTkZJR19NRU1DR19WMVxuK2V4dGVybiB2b2lkIHZtcHJlc3N1cmVfcHJpbyhnZnBfdCBnZnAsIHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZywgaW50IHByaW8pO1xuIGV4dGVybiBpbnQgdm1wcmVzc3VyZV9yZWdpc3Rlcl9ldmVudChzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csXG4gXHRcdFx0XHQgICAgIHN0cnVjdCBldmVudGZkX2N0eCAqZXZlbnRmZCxcbiBcdFx0XHRcdCAgICAgY29uc3QgY2hhciAqYXJncyk7XG4gZXh0ZXJuIHZvaWQgdm1wcmVzc3VyZV91bnJlZ2lzdGVyX2V2ZW50KHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZyxcbiBcdFx0XHRcdFx0c3RydWN0IGV2ZW50ZmRfY3R4ICpldmVudGZkKTtcbitcbisvKiB2MSBob29rcyBjYWxsZWQgZnJvbSBtbS92bXByZXNzdXJlLmM7IG5vLW9wcyBiZWxvdyB3aGVuICFNRU1DR19WMS4gKi9cbitleHRlcm4gdm9pZCB2bXByZXNzdXJlX3YxX2luaXQoc3RydWN0IHZtcHJlc3N1cmUgKnZtcHIpO1xuK2V4dGVybiB2b2lkIHZtcHJlc3N1cmVfdjFfY2xlYW51cChzdHJ1Y3Qgdm1wcmVzc3VyZSAqdm1wcik7XG4rZXh0ZXJuIHZvaWQgdm1wcmVzc3VyZV92MV9hY2NvdW50X3RyZWUoc3RydWN0IHZtcHJlc3N1cmUgKnZtcHIsXG4rXHRcdFx0XHQgICAgICAgdW5zaWduZWQgbG9uZyBzY2FubmVkLFxuK1x0XHRcdFx0ICAgICAgIHVuc2lnbmVkIGxvbmcgcmVjbGFpbWVkKTtcbiAjZWxzZVxuK3N0YXRpYyBpbmxpbmUgdm9pZCB2bXByZXNzdXJlX3ByaW8oZ2ZwX3QgZ2ZwLCBzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csXG4rXHRcdFx0XHQgICBpbnQgcHJpbykge31cbitzdGF0aWMgaW5saW5lIHZvaWQgdm1wcmVzc3VyZV92MV9pbml0KHN0cnVjdCB2bXByZXNzdXJlICp2bXByKSB7fVxuK3N0YXRpYyBpbmxpbmUgdm9pZCB2bXByZXNzdXJlX3YxX2NsZWFudXAoc3RydWN0IHZtcHJlc3N1cmUgKnZtcHIpIHt9XG4rc3RhdGljIGlubGluZSB2b2lkIHZtcHJlc3N1cmVfdjFfYWNjb3VudF90cmVlKHN0cnVjdCB2bXByZXNzdXJlICp2bXByLFxuK1x0XHRcdFx0XHQgICAgICB1bnNpZ25lZCBsb25nIHNjYW5uZWQsXG4rXHRcdFx0XHRcdCAgICAgIHVuc2lnbmVkIGxvbmcgcmVjbGFpbWVkKSB7fVxuKyNlbmRpZiAvKiBDT05GSUdfTUVNQ0dfVjEgKi9cbitcbisjZWxzZSAvKiAhQ09ORklHX01FTUNHICovXG4gc3RhdGljIGlubGluZSB2b2lkIHZtcHJlc3N1cmUoZ2ZwX3QgZ2ZwLCBpbnQgb3JkZXIsIHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZyxcbiBcdFx0XHQgICAgICBib29sIHRyZWUsIHVuc2lnbmVkIGxvbmcgc2Nhbm5lZCxcbiBcdFx0XHQgICAgICB1bnNpZ25lZCBsb25nIHJlY2xhaW1lZCkge31cbmRpZmYgLS1naXQgYS9tbS9NYWtlZmlsZSBiL21tL01ha2VmaWxlXG5pbmRleCA0ZmM3MTM4NjdiOWJkOC4uZGU5OTE2MzBjOTZhMzIgMTAwNjQ0XG4tLS0gYS9tbS9NYWtlZmlsZVxuKysrIGIvbW0vTWFrZWZpbGVcbkBAIC0xMDEsNyArMTAxLDcgQEAgb2JqLSQoQ09ORklHX0RFVklDRV9NSUdSQVRJT04pICs9IG1pZ3JhdGVfZGV2aWNlLm9cbiBvYmotJChDT05GSUdfVFJBTlNQQVJFTlRfSFVHRVBBR0UpICs9IGh1Z2VfbWVtb3J5Lm8ga2h1Z2VwYWdlZC5vXG4gb2JqLSQoQ09ORklHX1BBR0VfQ09VTlRFUikgKz0gcGFnZV9jb3VudGVyLm9cbiBvYmotJChDT05GSUdfTElWRVVQREFURV9NRU1GRCkgKz0gbWVtZmRfbHVvLm9cbi1vYmotJChDT05GSUdfTUVNQ0dfVjEpICs9IG1lbWNvbnRyb2wtdjEub1xuK29iai0kKENPTkZJR19NRU1DR19WMSkgKz0gbWVtY29udHJvbC12MS5vIHZtcHJlc3N1cmUtdjEub1xuIG9iai0kKENPTkZJR19NRU1DRykgKz0gbWVtY29udHJvbC5vIHZtcHJlc3N1cmUub1xuIGlmZGVmIENPTkZJR19CUEZfU1lTQ0FMTFxuIG9iai0kKENPTkZJR19NRU1DRykgKz0gYnBmX21lbWNvbnRyb2wub1xuZGlmZiAtLWdpdCBhL21tL3ZtcHJlc3N1cmUtdjEuYyBiL21tL3ZtcHJlc3N1cmUtdjEuY1xubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAwLi5mZDgxM2NiYTA1NDQ3MFxuLS0tIC9kZXYvbnVsbFxuKysrIGIvbW0vdm1wcmVzc3VyZS12MS5jXG5AQCAtMCwwICsxLDMwNSBAQFxuKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9ubHlcbisvKlxuKyAqIGNncm91cCB2MSB1c2Vyc3BhY2Ugdm1wcmVzc3VyZSBpbnRlcmZhY2UgKG1lbW9yeS5wcmVzc3VyZV9sZXZlbCAvXG4rICogY2dyb3VwLmV2ZW50X2NvbnRyb2wpLiBTcGxpdCBvdXQgb2YgbW0vdm1wcmVzc3VyZS5jIHNvIHRoYXQgdjItb25seVxuKyAqIGtlcm5lbHMgKENPTkZJR19NRU1DR19WMT1uKSBkcm9wIHRoZSB3aG9sZSBldmVudGZkIGFjY3VtdWxhdG9yLFxuKyAqIGl0cyB3b3JrIGl0ZW0sIGFuZCB0aGUgcGVyLW1lbWNnIHN0YXRlIGl0IHJlcXVpcmVzLlxuKyAqL1xuK1xuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L2Nncm91cC5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvZXZlbnRmZC5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvbGlzdC5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvbG9nMi5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvbWVtY29udHJvbC5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvbXV0ZXguaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L3NsYWIuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L3N0cmluZy5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvc3dhcC5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvdm1wcmVzc3VyZS5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvd29ya3F1ZXVlLmhcdTAwM2VcbitcbisvKlxuKyAqIFdoZW4gdGhlcmUgYXJlIHRvbyBsaXR0bGUgcGFnZXMgbGVmdCB0byBzY2FuLCB2bXByZXNzdXJlKCkgbWF5IG1pc3MgdGhlXG4rICogY3JpdGljYWwgcHJlc3N1cmUgYXMgbnVtYmVyIG9mIHBhZ2VzIHdpbGwgYmUgbGVzcyB0aGFuIFwid2luZG93IHNpemVcIi5cbisgKiBIb3dldmVyLCBpbiB0aGF0IGNhc2UgdGhlIHZtc2NhbiBwcmlvcml0eSB3aWxsIHJhaXNlIGZhc3QgYXMgdGhlXG4rICogcmVjbGFpbWVyIHdpbGwgdHJ5IHRvIHNjYW4gTFJVcyBtb3JlIGRlZXBseS5cbisgKlxuKyAqIFRoZSB2bXNjYW4gbG9naWMgY29uc2lkZXJzIHRoZXNlIHNwZWNpYWwgcHJpb3JpdGllczpcbisgKlxuKyAqIHByaW8gPT0gREVGX1BSSU9SSVRZICgxMik6IHJlY2xhaW1lciBzdGFydHMgd2l0aCB0aGF0IHZhbHVlXG4rICogcHJpbyBcdTAwM2M9IERFRl9QUklPUklUWSAtIDIgOiBrc3dhcGQgYmVjb21lcyBzb21ld2hhdCBvdmVyd2hlbG1lZFxuKyAqIHByaW8gPT0gMCAgICAgICAgICAgICAgICA6IGNsb3NlIHRvIE9PTSwga2VybmVsIHNjYW5zIGV2ZXJ5IHBhZ2UgaW4gYW4gbHJ1XG4rICpcbisgKiBBbnkgdmFsdWUgaW4gdGhpcyByYW5nZSBpcyBhY2NlcHRhYmxlIGZvciB0aGlzIHR1bmFibGUgKGkuZS4gZnJvbSAxMiB0b1xuKyAqIDApLiBDdXJyZW50IHZhbHVlIGZvciB0aGUgdm1wcmVzc3VyZV9sZXZlbF9jcml0aWNhbF9wcmlvIGlzIGNob3NlblxuKyAqIGVtcGlyaWNhbGx5LCBidXQgdGhlIG51bWJlciwgaW4gZXNzZW5jZSwgbWVhbnMgdGhhdCB3ZSBjb25zaWRlclxuKyAqIGNyaXRpY2FsIGxldmVsIHdoZW4gc2Nhbm5pbmcgZGVwdGggaXMgfjEwJSBvZiB0aGUgbHJ1IHNpemUgKHZtc2NhblxuKyAqIHNjYW5zICdscnVfc2l6ZSBcdTAwM2VcdTAwM2UgcHJpbycgcGFnZXMsIHNvIGl0IGlzIGFjdHVhbGx5IDEyLjUlLCBvciBvbmVcbisgKiBlaWdodHMpLlxuKyAqL1xuK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgdm1wcmVzc3VyZV9sZXZlbF9jcml0aWNhbF9wcmlvID0gaWxvZzIoMTAwIC8gMTApO1xuK1xuK2VudW0gdm1wcmVzc3VyZV9tb2RlcyB7XG4rXHRWTVBSRVNTVVJFX05PX1BBU1NUSFJPVUdIID0gMCxcbitcdFZNUFJFU1NVUkVfSElFUkFSQ0hZLFxuK1x0Vk1QUkVTU1VSRV9MT0NBTCxcbitcdFZNUFJFU1NVUkVfTlVNX01PREVTLFxuK307XG4rXG4rc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB2bXByZXNzdXJlX3N0cl9sZXZlbHNbXSA9IHtcbitcdFtWTVBSRVNTVVJFX0xPV10gPSBcImxvd1wiLFxuK1x0W1ZNUFJFU1NVUkVfTUVESVVNXSA9IFwibWVkaXVtXCIsXG4rXHRbVk1QUkVTU1VSRV9DUklUSUNBTF0gPSBcImNyaXRpY2FsXCIsXG4rfTtcbitcbitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHZtcHJlc3N1cmVfc3RyX21vZGVzW10gPSB7XG4rXHRbVk1QUkVTU1VSRV9OT19QQVNTVEhST1VHSF0gPSBcImRlZmF1bHRcIixcbitcdFtWTVBSRVNTVVJFX0hJRVJBUkNIWV0gPSBcImhpZXJhcmNoeVwiLFxuK1x0W1ZNUFJFU1NVUkVfTE9DQUxdID0gXCJsb2NhbFwiLFxuK307XG4rXG4rc3RydWN0IHZtcHJlc3N1cmVfZXZlbnQge1xuK1x0c3RydWN0IGV2ZW50ZmRfY3R4ICplZmQ7XG4rXHRlbnVtIHZtcHJlc3N1cmVfbGV2ZWxzIGxldmVsO1xuK1x0ZW51bSB2bXByZXNzdXJlX21vZGVzIG1vZGU7XG4rXHRzdHJ1Y3QgbGlzdF9oZWFkIG5vZGU7XG4rfTtcbitcbitzdGF0aWMgc3RydWN0IHZtcHJlc3N1cmUgKndvcmtfdG9fdm1wcmVzc3VyZShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspXG4re1xuK1x0cmV0dXJuIGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3Qgdm1wcmVzc3VyZSwgd29yayk7XG4rfVxuK1xuK3N0YXRpYyBzdHJ1Y3Qgdm1wcmVzc3VyZSAqdm1wcmVzc3VyZV9wYXJlbnQoc3RydWN0IHZtcHJlc3N1cmUgKnZtcHIpXG4re1xuK1x0c3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnID0gdm1wcmVzc3VyZV90b19tZW1jZyh2bXByKTtcbitcbitcdG1lbWNnID0gcGFyZW50X21lbV9jZ3JvdXAobWVtY2cpO1xuK1x0aWYgKCFtZW1jZylcbitcdFx0cmV0dXJuIE5VTEw7XG4rXHRyZXR1cm4gbWVtY2dfdG9fdm1wcmVzc3VyZShtZW1jZyk7XG4rfVxuK1xuK3N0YXRpYyBib29sIHZtcHJlc3N1cmVfZXZlbnQoc3RydWN0IHZtcHJlc3N1cmUgKnZtcHIsXG4rXHRcdFx0ICAgICBjb25zdCBlbnVtIHZtcHJlc3N1cmVfbGV2ZWxzIGxldmVsLFxuK1x0XHRcdCAgICAgYm9vbCBhbmNlc3RvciwgYm9vbCBzaWduYWxsZWQpXG4re1xuK1x0c3RydWN0IHZtcHJlc3N1cmVfZXZlbnQgKmV2O1xuK1x0Ym9vbCByZXQgPSBmYWxzZTtcbitcbitcdG11dGV4X2xvY2soXHUwMDI2dm1wci1cdTAwM2VldmVudHNfbG9jayk7XG4rXHRsaXN0X2Zvcl9lYWNoX2VudHJ5KGV2LCBcdTAwMjZ2bXByLVx1MDAzZWV2ZW50cywgbm9kZSkge1xuK1x0XHRpZiAoYW5jZXN0b3IgXHUwMDI2XHUwMDI2IGV2LVx1MDAzZW1vZGUgPT0gVk1QUkVTU1VSRV9MT0NBTClcbitcdFx0XHRjb250aW51ZTtcbitcdFx0aWYgKHNpZ25hbGxlZCBcdTAwMjZcdTAwMjYgZXYtXHUwMDNlbW9kZSA9PSBWTVBSRVNTVVJFX05PX1BBU1NUSFJPVUdIKVxuK1x0XHRcdGNvbnRpbnVlO1xuK1x0XHRpZiAobGV2ZWwgXHUwMDNjIGV2LVx1MDAzZWxldmVsKVxuK1x0XHRcdGNvbnRpbnVlO1xuK1x0XHRldmVudGZkX3NpZ25hbChldi1cdTAwM2VlZmQpO1xuK1x0XHRyZXQgPSB0cnVlO1xuK1x0fVxuK1x0bXV0ZXhfdW5sb2NrKFx1MDAyNnZtcHItXHUwMDNlZXZlbnRzX2xvY2spO1xuK1xuK1x0cmV0dXJuIHJldDtcbit9XG4rXG4rc3RhdGljIHZvaWQgdm1wcmVzc3VyZV93b3JrX2ZuKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaylcbit7XG4rXHRzdHJ1Y3Qgdm1wcmVzc3VyZSAqdm1wciA9IHdvcmtfdG9fdm1wcmVzc3VyZSh3b3JrKTtcbitcdHVuc2lnbmVkIGxvbmcgc2Nhbm5lZDtcbitcdHVuc2lnbmVkIGxvbmcgcmVjbGFpbWVkO1xuK1x0ZW51bSB2bXByZXNzdXJlX2xldmVscyBsZXZlbDtcbitcdGJvb2wgYW5jZXN0b3IgPSBmYWxzZTtcbitcdGJvb2wgc2lnbmFsbGVkID0gZmFsc2U7XG4rXG4rXHRzcGluX2xvY2soXHUwMDI2dm1wci1cdTAwM2Vzcl9sb2NrKTtcbitcdC8qXG4rXHQgKiBTZXZlcmFsIGNvbnRleHRzIG1pZ2h0IGJlIGNhbGxpbmcgdm1wcmVzc3VyZSgpLCBzbyBpdCBpc1xuK1x0ICogcG9zc2libGUgdGhhdCB0aGUgd29yayB3YXMgcmVzY2hlZHVsZWQgYWdhaW4gYmVmb3JlIHRoZSBvbGRcbitcdCAqIHdvcmsgY29udGV4dCBjbGVhcmVkIHRoZSBjb3VudGVycy4gSW4gdGhhdCBjYXNlIHdlIHdpbGwgcnVuXG4rXHQgKiBqdXN0IGFmdGVyIHRoZSBvbGQgd29yayByZXR1cm5zLCBidXQgdGhlbiBzY2FubmVkIG1pZ2h0IGJlIHplcm9cbitcdCAqIGhlcmUuIE5vIG5lZWQgZm9yIGFueSBsb2NrcyBoZXJlIHNpbmNlIHdlIGRvbid0IGNhcmUgaWZcbitcdCAqIHZtcHItXHUwMDNlcmVjbGFpbWVkIGlzIGluIHN5bmMuXG4rXHQgKi9cbitcdHNjYW5uZWQgPSB2bXByLVx1MDAzZXRyZWVfc2Nhbm5lZDtcbitcdGlmICghc2Nhbm5lZCkge1xuK1x0XHRzcGluX3VubG9jayhcdTAwMjZ2bXByLVx1MDAzZXNyX2xvY2spO1xuK1x0XHRyZXR1cm47XG4rXHR9XG4rXG4rXHRyZWNsYWltZWQgPSB2bXByLVx1MDAzZXRyZWVfcmVjbGFpbWVkO1xuK1x0dm1wci1cdTAwM2V0cmVlX3NjYW5uZWQgPSAwO1xuK1x0dm1wci1cdTAwM2V0cmVlX3JlY2xhaW1lZCA9IDA7XG4rXHRzcGluX3VubG9jayhcdTAwMjZ2bXByLVx1MDAzZXNyX2xvY2spO1xuK1xuK1x0bGV2ZWwgPSB2bXByZXNzdXJlX2NhbGNfbGV2ZWwoc2Nhbm5lZCwgcmVjbGFpbWVkKTtcbitcbitcdGRvIHtcbitcdFx0aWYgKHZtcHJlc3N1cmVfZXZlbnQodm1wciwgbGV2ZWwsIGFuY2VzdG9yLCBzaWduYWxsZWQpKVxuK1x0XHRcdHNpZ25hbGxlZCA9IHRydWU7XG4rXHRcdGFuY2VzdG9yID0gdHJ1ZTtcbitcdH0gd2hpbGUgKCh2bXByID0gdm1wcmVzc3VyZV9wYXJlbnQodm1wcikpKTtcbit9XG4rXG4rLypcbisgKiBUcmVlLW1vZGUgYWNjdW11bGF0b3I6IGFjY3VtdWxhdGUgcGVyLW1lbWNnIHNjYW5uZWQvcmVjbGFpbWVkIGFuZFxuKyAqIHNjaGVkdWxlIHRoZSB3b3JrIHRoYXQgd2Fsa3MgdGhlIHBhcmVudCBjaGFpbiBhbmQgc2lnbmFscyByZWdpc3RlcmVkXG4rICogZXZlbnRmZCBsaXN0ZW5lcnMgb25jZSB3ZSBjcm9zcyB0aGUgd2luZG93IHRocmVzaG9sZC5cbisgKi9cbit2b2lkIHZtcHJlc3N1cmVfdjFfYWNjb3VudF90cmVlKHN0cnVjdCB2bXByZXNzdXJlICp2bXByLFxuK1x0XHRcdFx0dW5zaWduZWQgbG9uZyBzY2FubmVkLFxuK1x0XHRcdFx0dW5zaWduZWQgbG9uZyByZWNsYWltZWQpXG4re1xuK1x0c3Bpbl9sb2NrKFx1MDAyNnZtcHItXHUwMDNlc3JfbG9jayk7XG4rXHRzY2FubmVkID0gdm1wci1cdTAwM2V0cmVlX3NjYW5uZWQgKz0gc2Nhbm5lZDtcbitcdHZtcHItXHUwMDNldHJlZV9yZWNsYWltZWQgKz0gcmVjbGFpbWVkO1xuK1x0c3Bpbl91bmxvY2soXHUwMDI2dm1wci1cdTAwM2Vzcl9sb2NrKTtcbitcbitcdGlmIChzY2FubmVkIFx1MDAzYyB2bXByZXNzdXJlX3dpbilcbitcdFx0cmV0dXJuO1xuK1x0c2NoZWR1bGVfd29yayhcdTAwMjZ2bXByLVx1MDAzZXdvcmspO1xuK31cbitcbit2b2lkIHZtcHJlc3N1cmVfdjFfaW5pdChzdHJ1Y3Qgdm1wcmVzc3VyZSAqdm1wcilcbit7XG4rXHRtdXRleF9pbml0KFx1MDAyNnZtcHItXHUwMDNlZXZlbnRzX2xvY2spO1xuK1x0SU5JVF9MSVNUX0hFQUQoXHUwMDI2dm1wci1cdTAwM2VldmVudHMpO1xuK1x0SU5JVF9XT1JLKFx1MDAyNnZtcHItXHUwMDNld29yaywgdm1wcmVzc3VyZV93b3JrX2ZuKTtcbit9XG4rXG4rdm9pZCB2bXByZXNzdXJlX3YxX2NsZWFudXAoc3RydWN0IHZtcHJlc3N1cmUgKnZtcHIpXG4re1xuK1x0LypcbitcdCAqIE1ha2Ugc3VyZSB0aGVyZSBpcyBubyBwZW5kaW5nIHdvcmsgYmVmb3JlIGV2ZW50ZmQgaW5mcmFzdHJ1Y3R1cmVcbitcdCAqIGdvZXMgYXdheS5cbitcdCAqL1xuK1x0Zmx1c2hfd29yayhcdTAwMjZ2bXByLVx1MDAzZXdvcmspO1xuK31cbitcbisvKipcbisgKiB2bXByZXNzdXJlX3ByaW8oKSAtIEFjY291bnQgbWVtb3J5IHByZXNzdXJlIHRocm91Z2ggcmVjbGFpbWVyIHByaW9yaXR5IGxldmVsXG4rICogQGdmcDpcdHJlY2xhaW1lcidzIGdmcCBtYXNrXG4rICogQG1lbWNnOlx0Y2dyb3VwIG1lbW9yeSBjb250cm9sbGVyIGhhbmRsZVxuKyAqIEBwcmlvOlx0cmVjbGFpbWVyJ3MgcHJpb3JpdHlcbisgKlxuKyAqIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBmcm9tIHRoZSByZWNsYWltIHBhdGggZXZlcnkgdGltZSB3aGVuXG4rICogdGhlIHZtc2NhbidzIHJlY2xhaW1pbmcgcHJpb3JpdHkgKHNjYW5uaW5nIGRlcHRoKSBjaGFuZ2VzLlxuKyAqXG4rICogVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCByZXR1cm4gYW55IHZhbHVlLlxuKyAqL1xuK3ZvaWQgdm1wcmVzc3VyZV9wcmlvKGdmcF90IGdmcCwgc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLCBpbnQgcHJpbylcbit7XG4rXHQvKlxuK1x0ICogV2Ugb25seSB1c2UgcHJpbyBmb3IgYWNjb3VudGluZyBjcml0aWNhbCBsZXZlbC4gRm9yIG1vcmUgaW5mb1xuK1x0ICogc2VlIGNvbW1lbnQgZm9yIHZtcHJlc3N1cmVfbGV2ZWxfY3JpdGljYWxfcHJpbyB2YXJpYWJsZSBhYm92ZS5cbitcdCAqL1xuK1x0aWYgKHByaW8gXHUwMDNlIHZtcHJlc3N1cmVfbGV2ZWxfY3JpdGljYWxfcHJpbylcbitcdFx0cmV0dXJuO1xuK1xuK1x0LypcbitcdCAqIE9LLCB0aGUgcHJpbyBpcyBiZWxvdyB0aGUgdGhyZXNob2xkLCB1cGRhdGluZyB2bXByZXNzdXJlXG4rXHQgKiBpbmZvcm1hdGlvbiBiZWZvcmUgc2hyaW5rZXIgZGl2ZXMgaW50byBsb25nIHNocmlua2luZyBvZiBsb25nXG4rXHQgKiByYW5nZSB2bXNjYW4uIFBhc3Npbmcgc2Nhbm5lZCA9IHZtcHJlc3N1cmVfd2luLCByZWNsYWltZWQgPSAwXG4rXHQgKiB0byB0aGUgdm1wcmVzc3VyZSgpIGJhc2ljYWxseSBtZWFucyB0aGF0IHdlIHNpZ25hbCAnY3JpdGljYWwnXG4rXHQgKiBsZXZlbC5cbitcdCAqL1xuK1x0dm1wcmVzc3VyZShnZnAsIDAsIG1lbWNnLCB0cnVlLCB2bXByZXNzdXJlX3dpbiwgMCk7XG4rfVxuK1xuKyNkZWZpbmUgTUFYX1ZNUFJFU1NVUkVfQVJHU19MRU5cdChzdHJsZW4oXCJjcml0aWNhbFwiKSArIHN0cmxlbihcImhpZXJhcmNoeVwiKSArIDIpXG4rXG4rLyoqXG4rICogdm1wcmVzc3VyZV9yZWdpc3Rlcl9ldmVudCgpIC0gQmluZCB2bXByZXNzdXJlIG5vdGlmaWNhdGlvbnMgdG8gYW4gZXZlbnRmZFxuKyAqIEBtZW1jZzpcdG1lbWNnIHRoYXQgaXMgaW50ZXJlc3RlZCBpbiB2bXByZXNzdXJlIG5vdGlmaWNhdGlvbnNcbisgKiBAZXZlbnRmZDpcdGV2ZW50ZmQgY29udGV4dCB0byBsaW5rIG5vdGlmaWNhdGlvbnMgd2l0aFxuKyAqIEBhcmdzOlx0ZXZlbnQgYXJndW1lbnRzIChwcmVzc3VyZSBsZXZlbCB0aHJlc2hvbGQsIG9wdGlvbmFsIG1vZGUpXG4rICpcbisgKiBUaGlzIGZ1bmN0aW9uIGFzc29jaWF0ZXMgZXZlbnRmZCBjb250ZXh0IHdpdGggdGhlIHZtcHJlc3N1cmVcbisgKiBpbmZyYXN0cnVjdHVyZSwgc28gdGhhdCB0aGUgbm90aWZpY2F0aW9ucyB3aWxsIGJlIGRlbGl2ZXJlZCB0byB0aGVcbisgKiBAZXZlbnRmZC4gVGhlIEBhcmdzIHBhcmFtZXRlciBpcyBhIGNvbW1hLWRlbGltaXRlZCBzdHJpbmcgdGhhdCBkZW5vdGVzIGFcbisgKiBwcmVzc3VyZSBsZXZlbCB0aHJlc2hvbGQgKG9uZSBvZiB2bXByZXNzdXJlX3N0cl9sZXZlbHMsIGkuZS4gXCJsb3dcIiwgXCJtZWRpdW1cIixcbisgKiBvciBcImNyaXRpY2FsXCIpIGFuZCBhbiBvcHRpb25hbCBtb2RlIChvbmUgb2Ygdm1wcmVzc3VyZV9zdHJfbW9kZXMsIGkuZS5cbisgKiBcImhpZXJhcmNoeVwiIG9yIFwibG9jYWxcIikuXG4rICpcbisgKiBUbyBiZSB1c2VkIGFzIG1lbWNnIGV2ZW50IG1ldGhvZC5cbisgKlxuKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCAtRU5PTUVNIG9uIG1lbW9yeSBmYWlsdXJlIG9yIC1FSU5WQUwgaWYgQGFyZ3MgY291bGRcbisgKiBub3QgYmUgcGFyc2VkLlxuKyAqL1xuK2ludCB2bXByZXNzdXJlX3JlZ2lzdGVyX2V2ZW50KHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZyxcbitcdFx0XHQgICAgICBzdHJ1Y3QgZXZlbnRmZF9jdHggKmV2ZW50ZmQsIGNvbnN0IGNoYXIgKmFyZ3MpXG4re1xuK1x0c3RydWN0IHZtcHJlc3N1cmUgKnZtcHIgPSBtZW1jZ190b192bXByZXNzdXJlKG1lbWNnKTtcbitcdHN0cnVjdCB2bXByZXNzdXJlX2V2ZW50ICpldjtcbitcdGVudW0gdm1wcmVzc3VyZV9tb2RlcyBtb2RlID0gVk1QUkVTU1VSRV9OT19QQVNTVEhST1VHSDtcbitcdGVudW0gdm1wcmVzc3VyZV9sZXZlbHMgbGV2ZWw7XG4rXHRjaGFyICpzcGVjLCAqc3BlY19vcmlnO1xuK1x0Y2hhciAqdG9rZW47XG4rXHRpbnQgcmV0ID0gMDtcbitcbitcdHNwZWNfb3JpZyA9IHNwZWMgPSBrc3RybmR1cChhcmdzLCBNQVhfVk1QUkVTU1VSRV9BUkdTX0xFTiwgR0ZQX0tFUk5FTCk7XG4rXHRpZiAoIXNwZWMpXG4rXHRcdHJldHVybiAtRU5PTUVNO1xuK1xuK1x0LyogRmluZCByZXF1aXJlZCBsZXZlbCAqL1xuK1x0dG9rZW4gPSBzdHJzZXAoXHUwMDI2c3BlYywgXCIsXCIpO1xuK1x0cmV0ID0gbWF0Y2hfc3RyaW5nKHZtcHJlc3N1cmVfc3RyX2xldmVscywgVk1QUkVTU1VSRV9OVU1fTEVWRUxTLCB0b2tlbik7XG4rXHRpZiAocmV0IFx1MDAzYyAwKVxuK1x0XHRnb3RvIG91dDtcbitcdGxldmVsID0gcmV0O1xuK1xuK1x0LyogRmluZCBvcHRpb25hbCBtb2RlICovXG4rXHR0b2tlbiA9IHN0cnNlcChcdTAwMjZzcGVjLCBcIixcIik7XG4rXHRpZiAodG9rZW4pIHtcbitcdFx0cmV0ID0gbWF0Y2hfc3RyaW5nKHZtcHJlc3N1cmVfc3RyX21vZGVzLCBWTVBSRVNTVVJFX05VTV9NT0RFUywgdG9rZW4pO1xuK1x0XHRpZiAocmV0IFx1MDAzYyAwKVxuK1x0XHRcdGdvdG8gb3V0O1xuK1x0XHRtb2RlID0gcmV0O1xuK1x0fVxuK1xuK1x0ZXYgPSBremFsbG9jX29iaigqZXYpO1xuK1x0aWYgKCFldikge1xuK1x0XHRyZXQgPSAtRU5PTUVNO1xuK1x0XHRnb3RvIG91dDtcbitcdH1cbitcbitcdGV2LVx1MDAzZWVmZCA9IGV2ZW50ZmQ7XG4rXHRldi1cdTAwM2VsZXZlbCA9IGxldmVsO1xuK1x0ZXYtXHUwMDNlbW9kZSA9IG1vZGU7XG4rXG4rXHRtdXRleF9sb2NrKFx1MDAyNnZtcHItXHUwMDNlZXZlbnRzX2xvY2spO1xuK1x0bGlzdF9hZGQoXHUwMDI2ZXYtXHUwMDNlbm9kZSwgXHUwMDI2dm1wci1cdTAwM2VldmVudHMpO1xuK1x0bXV0ZXhfdW5sb2NrKFx1MDAyNnZtcHItXHUwMDNlZXZlbnRzX2xvY2spO1xuK1x0cmV0ID0gMDtcbitvdXQ6XG4rXHRrZnJlZShzcGVjX29yaWcpO1xuK1x0cmV0dXJuIHJldDtcbit9XG4rXG4rLyoqXG4rICogdm1wcmVzc3VyZV91bnJlZ2lzdGVyX2V2ZW50KCkgLSBVbmJpbmQgZXZlbnRmZCBmcm9tIHZtcHJlc3N1cmVcbisgKiBAbWVtY2c6XHRtZW1jZyBoYW5kbGVcbisgKiBAZXZlbnRmZDpcdGV2ZW50ZmQgY29udGV4dCB0aGF0IHdhcyB1c2VkIHRvIGxpbmsgdm1wcmVzc3VyZSB3aXRoIHRoZSBAY2dcbisgKlxuKyAqIFRoaXMgZnVuY3Rpb24gZG9lcyBpbnRlcm5hbCBtYW5pcHVsYXRpb25zIHRvIGRldGFjaCB0aGUgQGV2ZW50ZmQgZnJvbVxuKyAqIHRoZSB2bXByZXNzdXJlIG5vdGlmaWNhdGlvbnMsIGFuZCB0aGVuIGZyZWVzIGludGVybmFsIHJlc291cmNlc1xuKyAqIGFzc29jaWF0ZWQgd2l0aCB0aGUgQGV2ZW50ZmQgKGJ1dCB0aGUgQGV2ZW50ZmQgaXRzZWxmIGlzIG5vdCBmcmVlZCkuXG4rICpcbisgKiBUbyBiZSB1c2VkIGFzIG1lbWNnIGV2ZW50IG1ldGhvZC5cbisgKi9cbit2b2lkIHZtcHJlc3N1cmVfdW5yZWdpc3Rlcl9ldmVudChzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csXG4rXHRcdFx0XHQgc3RydWN0IGV2ZW50ZmRfY3R4ICpldmVudGZkKVxuK3tcbitcdHN0cnVjdCB2bXByZXNzdXJlICp2bXByID0gbWVtY2dfdG9fdm1wcmVzc3VyZShtZW1jZyk7XG4rXHRzdHJ1Y3Qgdm1wcmVzc3VyZV9ldmVudCAqZXY7XG4rXG4rXHRtdXRleF9sb2NrKFx1MDAyNnZtcHItXHUwMDNlZXZlbnRzX2xvY2spO1xuK1x0bGlzdF9mb3JfZWFjaF9lbnRyeShldiwgXHUwMDI2dm1wci1cdTAwM2VldmVudHMsIG5vZGUpIHtcbitcdFx0aWYgKGV2LVx1MDAzZWVmZCAhPSBldmVudGZkKVxuK1x0XHRcdGNvbnRpbnVlO1xuK1x0XHRsaXN0X2RlbChcdTAwMjZldi1cdTAwM2Vub2RlKTtcbitcdFx0a2ZyZWUoZXYpO1xuK1x0XHRicmVhaztcbitcdH1cbitcdG11dGV4X3VubG9jayhcdTAwMjZ2bXByLVx1MDAzZWV2ZW50c19sb2NrKTtcbit9XG5kaWZmIC0tZ2l0IGEvbW0vdm1wcmVzc3VyZS5jIGIvbW0vdm1wcmVzc3VyZS5jXG5pbmRleCBmMDUzNTU0ZTU4MjY0Mi4uYmNmYTRiZDhmZmM1MjkgMTAwNjQ0XG4tLS0gYS9tbS92bXByZXNzdXJlLmNcbisrKyBiL21tL3ZtcHJlc3N1cmUuY1xuQEAgLTcsMTYgKzcsMTUgQEBcbiAgKlxuICAqIEJhc2VkIG9uIGlkZWFzIGZyb20gQW5kcmV3IE1vcnRvbiwgRGF2aWQgUmllbnRqZXMsIEtPU0FLSSBNb3RvaGlybyxcbiAgKiBMZW9uaWQgTW9pc2VpY2h1aywgTWVsIEdvcm1hbiwgTWluY2hhbiBLaW0gYW5kIFBla2thIEVuYmVyZy5cbisgKlxuKyAqIFRyZWUtbW9kZSAoY2dyb3VwIHYxIHVzZXJzcGFjZSBldmVudGZkKSBib29ra2VlcGluZyBsaXZlcyBpblxuKyAqIG1tL3ZtcHJlc3N1cmUtdjEuYzsgdGhpcyBmaWxlIGhvbGRzIHRoZSBzaGFyZWQgY29kZSBhbmQgdGhlIGluLWtlcm5lbFxuKyAqICh0cmVlPWZhbHNlKSBzb2NrZXQtcHJlc3N1cmUgcGF0aCB0aGF0IHJ1bnMgb24gY2dyb3VwIHYyLlxuICAqL1xuIFxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L2Nncm91cC5oXHUwMDNlXG4tI2luY2x1ZGUgXHUwMDNjbGludXgvZnMuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L2xvZzIuaFx1MDAzZVxuLSNpbmNsdWRlIFx1MDAzY2xpbnV4L3NjaGVkLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9tbS5oXHUwMDNlXG4tI2luY2x1ZGUgXHUwMDNjbGludXgvdm1zdGF0LmhcdTAwM2Vcbi0jaW5jbHVkZSBcdTAwM2NsaW51eC9ldmVudGZkLmhcdTAwM2Vcbi0jaW5jbHVkZSBcdTAwM2NsaW51eC9zbGFiLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9zd2FwLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9wcmludGsuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L3ZtcHJlc3N1cmUuaFx1MDAzZVxuQEAgLTM1LDcgKzM0LDcgQEBcbiAgKiBUT0RPOiBNYWtlIHRoZSB3aW5kb3cgc2l6ZSBkZXBlbmQgb24gbWFjaGluZSBzaXplLCBhcyB3ZSBkbyBmb3Igdm1zdGF0XG4gICogdGhyZXNob2xkcy4gQ3VycmVudGx5IHdlIHNldCBpdCB0byA1MTIgcGFnZXMgKDJNQiBmb3IgNEtCIHBhZ2VzKS5cbiAgKi9cbi1zdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyB2bXByZXNzdXJlX3dpbiA9IFNXQVBfQ0xVU1RFUl9NQVggKiAxNjtcbitjb25zdCB1bnNpZ25lZCBsb25nIHZtcHJlc3N1cmVfd2luID0gU1dBUF9DTFVTVEVSX01BWCAqIDE2O1xuIFxuIC8qXG4gICogVGhlc2UgdGhyZXNob2xkcyBhcmUgdXNlZCB3aGVuIHdlIGFjY291bnQgbWVtb3J5IHByZXNzdXJlIHRocm91Z2hcbkBAIC00Niw2OCArNDUsNiBAQCBzdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyB2bXByZXNzdXJlX3dpbiA9IFNXQVBfQ0xVU1RFUl9NQVggKiAxNjtcbiBzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHZtcHJlc3N1cmVfbGV2ZWxfbWVkID0gNjA7XG4gc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCB2bXByZXNzdXJlX2xldmVsX2NyaXRpY2FsID0gOTU7XG4gXG4tLypcbi0gKiBXaGVuIHRoZXJlIGFyZSB0b28gbGl0dGxlIHBhZ2VzIGxlZnQgdG8gc2Nhbiwgdm1wcmVzc3VyZSgpIG1heSBtaXNzIHRoZVxuLSAqIGNyaXRpY2FsIHByZXNzdXJlIGFzIG51bWJlciBvZiBwYWdlcyB3aWxsIGJlIGxlc3MgdGhhbiBcIndpbmRvdyBzaXplXCIuXG4tICogSG93ZXZlciwgaW4gdGhhdCBjYXNlIHRoZSB2bXNjYW4gcHJpb3JpdHkgd2lsbCByYWlzZSBmYXN0IGFzIHRoZVxuLSAqIHJlY2xhaW1lciB3aWxsIHRyeSB0byBzY2FuIExSVXMgbW9yZSBkZWVwbHkuXG4tICpcbi0gKiBUaGUgdm1zY2FuIGxvZ2ljIGNvbnNpZGVycyB0aGVzZSBzcGVjaWFsIHByaW9yaXRpZXM6XG4tICpcbi0gKiBwcmlvID09IERFRl9QUklPUklUWSAoMTIpOiByZWNsYWltZXIgc3RhcnRzIHdpdGggdGhhdCB2YWx1ZVxuLSAqIHByaW8gXHUwMDNjPSBERUZfUFJJT1JJVFkgLSAyIDoga3N3YXBkIGJlY29tZXMgc29tZXdoYXQgb3ZlcndoZWxtZWRcbi0gKiBwcmlvID09IDAgICAgICAgICAgICAgICAgOiBjbG9zZSB0byBPT00sIGtlcm5lbCBzY2FucyBldmVyeSBwYWdlIGluIGFuIGxydVxuLSAqXG4tICogQW55IHZhbHVlIGluIHRoaXMgcmFuZ2UgaXMgYWNjZXB0YWJsZSBmb3IgdGhpcyB0dW5hYmxlIChpLmUuIGZyb20gMTIgdG9cbi0gKiAwKS4gQ3VycmVudCB2YWx1ZSBmb3IgdGhlIHZtcHJlc3N1cmVfbGV2ZWxfY3JpdGljYWxfcHJpbyBpcyBjaG9zZW5cbi0gKiBlbXBpcmljYWxseSwgYnV0IHRoZSBudW1iZXIsIGluIGVzc2VuY2UsIG1lYW5zIHRoYXQgd2UgY29uc2lkZXJcbi0gKiBjcml0aWNhbCBsZXZlbCB3aGVuIHNjYW5uaW5nIGRlcHRoIGlzIH4xMCUgb2YgdGhlIGxydSBzaXplICh2bXNjYW5cbi0gKiBzY2FucyAnbHJ1X3NpemUgXHUwMDNlXHUwMDNlIHByaW8nIHBhZ2VzLCBzbyBpdCBpcyBhY3R1YWxseSAxMi41JSwgb3Igb25lXG4tICogZWlnaHRzKS5cbi0gKi9cbi1zdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHZtcHJlc3N1cmVfbGV2ZWxfY3JpdGljYWxfcHJpbyA9IGlsb2cyKDEwMCAvIDEwKTtcbi1cbi1zdGF0aWMgc3RydWN0IHZtcHJlc3N1cmUgKndvcmtfdG9fdm1wcmVzc3VyZShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspXG4te1xuLVx0cmV0dXJuIGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3Qgdm1wcmVzc3VyZSwgd29yayk7XG4tfVxuLVxuLXN0YXRpYyBzdHJ1Y3Qgdm1wcmVzc3VyZSAqdm1wcmVzc3VyZV9wYXJlbnQoc3RydWN0IHZtcHJlc3N1cmUgKnZtcHIpXG4te1xuLVx0c3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnID0gdm1wcmVzc3VyZV90b19tZW1jZyh2bXByKTtcbi1cbi1cdG1lbWNnID0gcGFyZW50X21lbV9jZ3JvdXAobWVtY2cpO1xuLVx0aWYgKCFtZW1jZylcbi1cdFx0cmV0dXJuIE5VTEw7XG4tXHRyZXR1cm4gbWVtY2dfdG9fdm1wcmVzc3VyZShtZW1jZyk7XG4tfVxuLVxuLWVudW0gdm1wcmVzc3VyZV9sZXZlbHMge1xuLVx0Vk1QUkVTU1VSRV9MT1cgPSAwLFxuLVx0Vk1QUkVTU1VSRV9NRURJVU0sXG4tXHRWTVBSRVNTVVJFX0NSSVRJQ0FMLFxuLVx0Vk1QUkVTU1VSRV9OVU1fTEVWRUxTLFxuLX07XG4tXG4tZW51bSB2bXByZXNzdXJlX21vZGVzIHtcbi1cdFZNUFJFU1NVUkVfTk9fUEFTU1RIUk9VR0ggPSAwLFxuLVx0Vk1QUkVTU1VSRV9ISUVSQVJDSFksXG4tXHRWTVBSRVNTVVJFX0xPQ0FMLFxuLVx0Vk1QUkVTU1VSRV9OVU1fTU9ERVMsXG4tfTtcbi1cbi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHZtcHJlc3N1cmVfc3RyX2xldmVsc1tdID0ge1xuLVx0W1ZNUFJFU1NVUkVfTE9XXSA9IFwibG93XCIsXG4tXHRbVk1QUkVTU1VSRV9NRURJVU1dID0gXCJtZWRpdW1cIixcbi1cdFtWTVBSRVNTVVJFX0NSSVRJQ0FMXSA9IFwiY3JpdGljYWxcIixcbi19O1xuLVxuLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgdm1wcmVzc3VyZV9zdHJfbW9kZXNbXSA9IHtcbi1cdFtWTVBSRVNTVVJFX05PX1BBU1NUSFJPVUdIXSA9IFwiZGVmYXVsdFwiLFxuLVx0W1ZNUFJFU1NVUkVfSElFUkFSQ0hZXSA9IFwiaGllcmFyY2h5XCIsXG4tXHRbVk1QUkVTU1VSRV9MT0NBTF0gPSBcImxvY2FsXCIsXG4tfTtcbi1cbiBzdGF0aWMgZW51bSB2bXByZXNzdXJlX2xldmVscyB2bXByZXNzdXJlX2xldmVsKHVuc2lnbmVkIGxvbmcgcHJlc3N1cmUpXG4ge1xuIFx0aWYgKHByZXNzdXJlIFx1MDAzZT0gdm1wcmVzc3VyZV9sZXZlbF9jcml0aWNhbClcbkBAIC0xMTcsOCArNTQsOCBAQCBzdGF0aWMgZW51bSB2bXByZXNzdXJlX2xldmVscyB2bXByZXNzdXJlX2xldmVsKHVuc2lnbmVkIGxvbmcgcHJlc3N1cmUpXG4gXHRyZXR1cm4gVk1QUkVTU1VSRV9MT1c7XG4gfVxuIFxuLXN0YXRpYyBlbnVtIHZtcHJlc3N1cmVfbGV2ZWxzIHZtcHJlc3N1cmVfY2FsY19sZXZlbCh1bnNpZ25lZCBsb25nIHNjYW5uZWQsXG4tXHRcdFx0XHRcdFx0ICAgIHVuc2lnbmVkIGxvbmcgcmVjbGFpbWVkKVxuK2VudW0gdm1wcmVzc3VyZV9sZXZlbHMgdm1wcmVzc3VyZV9jYWxjX2xldmVsKHVuc2lnbmVkIGxvbmcgc2Nhbm5lZCxcbitcdFx0XHRcdFx0ICAgICB1bnNpZ25lZCBsb25nIHJlY2xhaW1lZClcbiB7XG4gXHR1bnNpZ25lZCBsb25nIHNjYWxlID0gc2Nhbm5lZCArIHJlY2xhaW1lZDtcbiBcdHVuc2lnbmVkIGxvbmcgcHJlc3N1cmUgPSAwO1xuQEAgLTE0Nyw3NCArODQsNiBAQCBzdGF0aWMgZW51bSB2bXByZXNzdXJlX2xldmVscyB2bXByZXNzdXJlX2NhbGNfbGV2ZWwodW5zaWduZWQgbG9uZyBzY2FubmVkLFxuIFx0cmV0dXJuIHZtcHJlc3N1cmVfbGV2ZWwocHJlc3N1cmUpO1xuIH1cbiBcbi1zdHJ1Y3Qgdm1wcmVzc3VyZV9ldmVudCB7XG4tXHRzdHJ1Y3QgZXZlbnRmZF9jdHggKmVmZDtcbi1cdGVudW0gdm1wcmVzc3VyZV9sZXZlbHMgbGV2ZWw7XG4tXHRlbnVtIHZtcHJlc3N1cmVfbW9kZXMgbW9kZTtcbi1cdHN0cnVjdCBsaXN0X2hlYWQgbm9kZTtcbi19O1xuLVxuLXN0YXRpYyBib29sIHZtcHJlc3N1cmVfZXZlbnQoc3RydWN0IHZtcHJlc3N1cmUgKnZtcHIsXG4tXHRcdFx0ICAgICBjb25zdCBlbnVtIHZtcHJlc3N1cmVfbGV2ZWxzIGxldmVsLFxuLVx0XHRcdCAgICAgYm9vbCBhbmNlc3RvciwgYm9vbCBzaWduYWxsZWQpXG4te1xuLVx0c3RydWN0IHZtcHJlc3N1cmVfZXZlbnQgKmV2O1xuLVx0Ym9vbCByZXQgPSBmYWxzZTtcbi1cbi1cdG11dGV4X2xvY2soXHUwMDI2dm1wci1cdTAwM2VldmVudHNfbG9jayk7XG4tXHRsaXN0X2Zvcl9lYWNoX2VudHJ5KGV2LCBcdTAwMjZ2bXByLVx1MDAzZWV2ZW50cywgbm9kZSkge1xuLVx0XHRpZiAoYW5jZXN0b3IgXHUwMDI2XHUwMDI2IGV2LVx1MDAzZW1vZGUgPT0gVk1QUkVTU1VSRV9MT0NBTClcbi1cdFx0XHRjb250aW51ZTtcbi1cdFx0aWYgKHNpZ25hbGxlZCBcdTAwMjZcdTAwMjYgZXYtXHUwMDNlbW9kZSA9PSBWTVBSRVNTVVJFX05PX1BBU1NUSFJPVUdIKVxuLVx0XHRcdGNvbnRpbnVlO1xuLVx0XHRpZiAobGV2ZWwgXHUwMDNjIGV2LVx1MDAzZWxldmVsKVxuLVx0XHRcdGNvbnRpbnVlO1xuLVx0XHRldmVudGZkX3NpZ25hbChldi1cdTAwM2VlZmQpO1xuLVx0XHRyZXQgPSB0cnVlO1xuLVx0fVxuLVx0bXV0ZXhfdW5sb2NrKFx1MDAyNnZtcHItXHUwMDNlZXZlbnRzX2xvY2spO1xuLVxuLVx0cmV0dXJuIHJldDtcbi19XG4tXG4tc3RhdGljIHZvaWQgdm1wcmVzc3VyZV93b3JrX2ZuKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaylcbi17XG4tXHRzdHJ1Y3Qgdm1wcmVzc3VyZSAqdm1wciA9IHdvcmtfdG9fdm1wcmVzc3VyZSh3b3JrKTtcbi1cdHVuc2lnbmVkIGxvbmcgc2Nhbm5lZDtcbi1cdHVuc2lnbmVkIGxvbmcgcmVjbGFpbWVkO1xuLVx0ZW51bSB2bXByZXNzdXJlX2xldmVscyBsZXZlbDtcbi1cdGJvb2wgYW5jZXN0b3IgPSBmYWxzZTtcbi1cdGJvb2wgc2lnbmFsbGVkID0gZmFsc2U7XG4tXG4tXHRzcGluX2xvY2soXHUwMDI2dm1wci1cdTAwM2Vzcl9sb2NrKTtcbi1cdC8qXG4tXHQgKiBTZXZlcmFsIGNvbnRleHRzIG1pZ2h0IGJlIGNhbGxpbmcgdm1wcmVzc3VyZSgpLCBzbyBpdCBpc1xuLVx0ICogcG9zc2libGUgdGhhdCB0aGUgd29yayB3YXMgcmVzY2hlZHVsZWQgYWdhaW4gYmVmb3JlIHRoZSBvbGRcbi1cdCAqIHdvcmsgY29udGV4dCBjbGVhcmVkIHRoZSBjb3VudGVycy4gSW4gdGhhdCBjYXNlIHdlIHdpbGwgcnVuXG4tXHQgKiBqdXN0IGFmdGVyIHRoZSBvbGQgd29yayByZXR1cm5zLCBidXQgdGhlbiBzY2FubmVkIG1pZ2h0IGJlIHplcm9cbi1cdCAqIGhlcmUuIE5vIG5lZWQgZm9yIGFueSBsb2NrcyBoZXJlIHNpbmNlIHdlIGRvbid0IGNhcmUgaWZcbi1cdCAqIHZtcHItXHUwMDNlcmVjbGFpbWVkIGlzIGluIHN5bmMuXG4tXHQgKi9cbi1cdHNjYW5uZWQgPSB2bXByLVx1MDAzZXRyZWVfc2Nhbm5lZDtcbi1cdGlmICghc2Nhbm5lZCkge1xuLVx0XHRzcGluX3VubG9jayhcdTAwMjZ2bXByLVx1MDAzZXNyX2xvY2spO1xuLVx0XHRyZXR1cm47XG4tXHR9XG4tXG4tXHRyZWNsYWltZWQgPSB2bXByLVx1MDAzZXRyZWVfcmVjbGFpbWVkO1xuLVx0dm1wci1cdTAwM2V0cmVlX3NjYW5uZWQgPSAwO1xuLVx0dm1wci1cdTAwM2V0cmVlX3JlY2xhaW1lZCA9IDA7XG4tXHRzcGluX3VubG9jayhcdTAwMjZ2bXByLVx1MDAzZXNyX2xvY2spO1xuLVxuLVx0bGV2ZWwgPSB2bXByZXNzdXJlX2NhbGNfbGV2ZWwoc2Nhbm5lZCwgcmVjbGFpbWVkKTtcbi1cbi1cdGRvIHtcbi1cdFx0aWYgKHZtcHJlc3N1cmVfZXZlbnQodm1wciwgbGV2ZWwsIGFuY2VzdG9yLCBzaWduYWxsZWQpKVxuLVx0XHRcdHNpZ25hbGxlZCA9IHRydWU7XG4tXHRcdGFuY2VzdG9yID0gdHJ1ZTtcbi1cdH0gd2hpbGUgKCh2bXByID0gdm1wcmVzc3VyZV9wYXJlbnQodm1wcikpKTtcbi19XG4tXG4gLyoqXG4gICogdm1wcmVzc3VyZSgpIC0gQWNjb3VudCBtZW1vcnkgcHJlc3N1cmUgdGhyb3VnaCBzY2FubmVkL3JlY2xhaW1lZCByYXRpb1xuICAqIEBnZnA6XHRyZWNsYWltZXIncyBnZnAgbWFza1xuQEAgLTI0NiwxMSArMTE1LDEzIEBAIHZvaWQgdm1wcmVzc3VyZShnZnBfdCBnZnAsIGludCBvcmRlciwgc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLCBib29sIHRyZWUsXG4gXHRcdHJldHVybjtcbiBcbiBcdC8qXG4tXHQgKiBUaGUgaW4ta2VybmVsIHVzZXJzIG9ubHkgY2FyZSBhYm91dCB0aGUgcmVjbGFpbSBlZmZpY2llbmN5XG4tXHQgKiBmb3IgdGhpcyBAbWVtY2cgcmF0aGVyIHRoYW4gdGhlIHdob2xlIHN1YnRyZWUsIGFuZCB0aGVyZVxuLVx0ICogaXNuJ3QgYW5kIHdvbid0IGJlIGFueSBpbi1rZXJuZWwgdXNlciBpbiBhIGxlZ2FjeSBjZ3JvdXAuXG4rXHQgKiBPbmx5IHR3byBjb21iaW5hdGlvbnMgaGF2ZSBhIGNvbnN1bWVyOlxuK1x0ICogICBjZ3JvdXAgdjIgKyB0cmVlPWZhbHNlIC1cdTAwM2UgaW4ta2VybmVsIHNvY2tldCBwcmVzc3VyZVxuK1x0ICogICBjZ3JvdXAgdjEgKyB0cmVlPXRydWUgIC1cdTAwM2UgdXNlcnNwYWNlIGV2ZW50ZmRzIChtZW1vcnkucHJlc3N1cmVfbGV2ZWwpXG4rXHQgKiBTa2lwIHRoZSBvdGhlciB0d286IG5vdGhpbmcgY29uc3VtZXMgdGhlIHJlc3VsdC5cbiBcdCAqL1xuLVx0aWYgKCFjZ3JvdXBfc3Vic3lzX29uX2RmbChtZW1vcnlfY2dycF9zdWJzeXMpIFx1MDAyNlx1MDAyNiAhdHJlZSlcbitcdGlmICgoIWNncm91cF9zdWJzeXNfb25fZGZsKG1lbW9yeV9jZ3JwX3N1YnN5cykgXHUwMDI2XHUwMDI2ICF0cmVlKSB8fFxuK1x0ICAgIChjZ3JvdXBfc3Vic3lzX29uX2RmbChtZW1vcnlfY2dycF9zdWJzeXMpIFx1MDAyNlx1MDAyNiB0cmVlKSlcbiBcdFx0cmV0dXJuO1xuIFxuIFx0dm1wciA9IG1lbWNnX3RvX3ZtcHJlc3N1cmUobWVtY2cpO1xuQEAgLTI4MSwxNCArMTUyLDcgQEAgdm9pZCB2bXByZXNzdXJlKGdmcF90IGdmcCwgaW50IG9yZGVyLCBzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csIGJvb2wgdHJlZSxcbiBcdFx0cmV0dXJuO1xuIFxuIFx0aWYgKHRyZWUpIHtcbi1cdFx0c3Bpbl9sb2NrKFx1MDAyNnZtcHItXHUwMDNlc3JfbG9jayk7XG4tXHRcdHNjYW5uZWQgPSB2bXByLVx1MDAzZXRyZWVfc2Nhbm5lZCArPSBzY2FubmVkO1xuLVx0XHR2bXByLVx1MDAzZXRyZWVfcmVjbGFpbWVkICs9IHJlY2xhaW1lZDtcbi1cdFx0c3Bpbl91bmxvY2soXHUwMDI2dm1wci1cdTAwM2Vzcl9sb2NrKTtcbi1cbi1cdFx0aWYgKHNjYW5uZWQgXHUwMDNjIHZtcHJlc3N1cmVfd2luKVxuLVx0XHRcdHJldHVybjtcbi1cdFx0c2NoZWR1bGVfd29yayhcdTAwMjZ2bXByLVx1MDAzZXdvcmspO1xuK1x0XHR2bXByZXNzdXJlX3YxX2FjY291bnRfdHJlZSh2bXByLCBzY2FubmVkLCByZWNsYWltZWQpO1xuIFx0fSBlbHNlIHtcbiBcdFx0ZW51bSB2bXByZXNzdXJlX2xldmVscyBsZXZlbDtcbiBcbkBAIC0zMzAsMTM0ICsxOTQsNiBAQCB2b2lkIHZtcHJlc3N1cmUoZ2ZwX3QgZ2ZwLCBpbnQgb3JkZXIsIHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZywgYm9vbCB0cmVlLFxuIFx0fVxuIH1cbiBcbi0vKipcbi0gKiB2bXByZXNzdXJlX3ByaW8oKSAtIEFjY291bnQgbWVtb3J5IHByZXNzdXJlIHRocm91Z2ggcmVjbGFpbWVyIHByaW9yaXR5IGxldmVsXG4tICogQGdmcDpcdHJlY2xhaW1lcidzIGdmcCBtYXNrXG4tICogQG1lbWNnOlx0Y2dyb3VwIG1lbW9yeSBjb250cm9sbGVyIGhhbmRsZVxuLSAqIEBwcmlvOlx0cmVjbGFpbWVyJ3MgcHJpb3JpdHlcbi0gKlxuLSAqIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBmcm9tIHRoZSByZWNsYWltIHBhdGggZXZlcnkgdGltZSB3aGVuXG4tICogdGhlIHZtc2NhbidzIHJlY2xhaW1pbmcgcHJpb3JpdHkgKHNjYW5uaW5nIGRlcHRoKSBjaGFuZ2VzLlxuLSAqXG4tICogVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCByZXR1cm4gYW55IHZhbHVlLlxuLSAqL1xuLXZvaWQgdm1wcmVzc3VyZV9wcmlvKGdmcF90IGdmcCwgc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLCBpbnQgcHJpbylcbi17XG4tXHQvKlxuLVx0ICogV2Ugb25seSB1c2UgcHJpbyBmb3IgYWNjb3VudGluZyBjcml0aWNhbCBsZXZlbC4gRm9yIG1vcmUgaW5mb1xuLVx0ICogc2VlIGNvbW1lbnQgZm9yIHZtcHJlc3N1cmVfbGV2ZWxfY3JpdGljYWxfcHJpbyB2YXJpYWJsZSBhYm92ZS5cbi1cdCAqL1xuLVx0aWYgKHByaW8gXHUwMDNlIHZtcHJlc3N1cmVfbGV2ZWxfY3JpdGljYWxfcHJpbylcbi1cdFx0cmV0dXJuO1xuLVxuLVx0Lypcbi1cdCAqIE9LLCB0aGUgcHJpbyBpcyBiZWxvdyB0aGUgdGhyZXNob2xkLCB1cGRhdGluZyB2bXByZXNzdXJlXG4tXHQgKiBpbmZvcm1hdGlvbiBiZWZvcmUgc2hyaW5rZXIgZGl2ZXMgaW50byBsb25nIHNocmlua2luZyBvZiBsb25nXG4tXHQgKiByYW5nZSB2bXNjYW4uIFBhc3Npbmcgc2Nhbm5lZCA9IHZtcHJlc3N1cmVfd2luLCByZWNsYWltZWQgPSAwXG4tXHQgKiB0byB0aGUgdm1wcmVzc3VyZSgpIGJhc2ljYWxseSBtZWFucyB0aGF0IHdlIHNpZ25hbCAnY3JpdGljYWwnXG4tXHQgKiBsZXZlbC5cbi1cdCAqL1xuLVx0dm1wcmVzc3VyZShnZnAsIDAsIG1lbWNnLCB0cnVlLCB2bXByZXNzdXJlX3dpbiwgMCk7XG4tfVxuLVxuLSNkZWZpbmUgTUFYX1ZNUFJFU1NVUkVfQVJHU19MRU5cdChzdHJsZW4oXCJjcml0aWNhbFwiKSArIHN0cmxlbihcImhpZXJhcmNoeVwiKSArIDIpXG4tXG4tLyoqXG4tICogdm1wcmVzc3VyZV9yZWdpc3Rlcl9ldmVudCgpIC0gQmluZCB2bXByZXNzdXJlIG5vdGlmaWNhdGlvbnMgdG8gYW4gZXZlbnRmZFxuLSAqIEBtZW1jZzpcdG1lbWNnIHRoYXQgaXMgaW50ZXJlc3RlZCBpbiB2bXByZXNzdXJlIG5vdGlmaWNhdGlvbnNcbi0gKiBAZXZlbnRmZDpcdGV2ZW50ZmQgY29udGV4dCB0byBsaW5rIG5vdGlmaWNhdGlvbnMgd2l0aFxuLSAqIEBhcmdzOlx0ZXZlbnQgYXJndW1lbnRzIChwcmVzc3VyZSBsZXZlbCB0aHJlc2hvbGQsIG9wdGlvbmFsIG1vZGUpXG4tICpcbi0gKiBUaGlzIGZ1bmN0aW9uIGFzc29jaWF0ZXMgZXZlbnRmZCBjb250ZXh0IHdpdGggdGhlIHZtcHJlc3N1cmVcbi0gKiBpbmZyYXN0cnVjdHVyZSwgc28gdGhhdCB0aGUgbm90aWZpY2F0aW9ucyB3aWxsIGJlIGRlbGl2ZXJlZCB0byB0aGVcbi0gKiBAZXZlbnRmZC4gVGhlIEBhcmdzIHBhcmFtZXRlciBpcyBhIGNvbW1hLWRlbGltaXRlZCBzdHJpbmcgdGhhdCBkZW5vdGVzIGFcbi0gKiBwcmVzc3VyZSBsZXZlbCB0aHJlc2hvbGQgKG9uZSBvZiB2bXByZXNzdXJlX3N0cl9sZXZlbHMsIGkuZS4gXCJsb3dcIiwgXCJtZWRpdW1cIixcbi0gKiBvciBcImNyaXRpY2FsXCIpIGFuZCBhbiBvcHRpb25hbCBtb2RlIChvbmUgb2Ygdm1wcmVzc3VyZV9zdHJfbW9kZXMsIGkuZS5cbi0gKiBcImhpZXJhcmNoeVwiIG9yIFwibG9jYWxcIikuXG4tICpcbi0gKiBUbyBiZSB1c2VkIGFzIG1lbWNnIGV2ZW50IG1ldGhvZC5cbi0gKlxuLSAqIFJldHVybjogMCBvbiBzdWNjZXNzLCAtRU5PTUVNIG9uIG1lbW9yeSBmYWlsdXJlIG9yIC1FSU5WQUwgaWYgQGFyZ3MgY291bGRcbi0gKiBub3QgYmUgcGFyc2VkLlxuLSAqL1xuLWludCB2bXByZXNzdXJlX3JlZ2lzdGVyX2V2ZW50KHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZyxcbi1cdFx0XHQgICAgICBzdHJ1Y3QgZXZlbnRmZF9jdHggKmV2ZW50ZmQsIGNvbnN0IGNoYXIgKmFyZ3MpXG4te1xuLVx0c3RydWN0IHZtcHJlc3N1cmUgKnZtcHIgPSBtZW1jZ190b192bXByZXNzdXJlKG1lbWNnKTtcbi1cdHN0cnVjdCB2bXByZXNzdXJlX2V2ZW50ICpldjtcbi1cdGVudW0gdm1wcmVzc3VyZV9tb2RlcyBtb2RlID0gVk1QUkVTU1VSRV9OT19QQVNTVEhST1VHSDtcbi1cdGVudW0gdm1wcmVzc3VyZV9sZXZlbHMgbGV2ZWw7XG4tXHRjaGFyICpzcGVjLCAqc3BlY19vcmlnO1xuLVx0Y2hhciAqdG9rZW47XG4tXHRpbnQgcmV0ID0gMDtcbi1cbi1cdHNwZWNfb3JpZyA9IHNwZWMgPSBrc3RybmR1cChhcmdzLCBNQVhfVk1QUkVTU1VSRV9BUkdTX0xFTiwgR0ZQX0tFUk5FTCk7XG4tXHRpZiAoIXNwZWMpXG4tXHRcdHJldHVybiAtRU5PTUVNO1xuLVxuLVx0LyogRmluZCByZXF1aXJlZCBsZXZlbCAqL1xuLVx0dG9rZW4gPSBzdHJzZXAoXHUwMDI2c3BlYywgXCIsXCIpO1xuLVx0cmV0ID0gbWF0Y2hfc3RyaW5nKHZtcHJlc3N1cmVfc3RyX2xldmVscywgVk1QUkVTU1VSRV9OVU1fTEVWRUxTLCB0b2tlbik7XG4tXHRpZiAocmV0IFx1MDAzYyAwKVxuLVx0XHRnb3RvIG91dDtcbi1cdGxldmVsID0gcmV0O1xuLVxuLVx0LyogRmluZCBvcHRpb25hbCBtb2RlICovXG4tXHR0b2tlbiA9IHN0cnNlcChcdTAwMjZzcGVjLCBcIixcIik7XG4tXHRpZiAodG9rZW4pIHtcbi1cdFx0cmV0ID0gbWF0Y2hfc3RyaW5nKHZtcHJlc3N1cmVfc3RyX21vZGVzLCBWTVBSRVNTVVJFX05VTV9NT0RFUywgdG9rZW4pO1xuLVx0XHRpZiAocmV0IFx1MDAzYyAwKVxuLVx0XHRcdGdvdG8gb3V0O1xuLVx0XHRtb2RlID0gcmV0O1xuLVx0fVxuLVxuLVx0ZXYgPSBremFsbG9jX29iaigqZXYpO1xuLVx0aWYgKCFldikge1xuLVx0XHRyZXQgPSAtRU5PTUVNO1xuLVx0XHRnb3RvIG91dDtcbi1cdH1cbi1cbi1cdGV2LVx1MDAzZWVmZCA9IGV2ZW50ZmQ7XG4tXHRldi1cdTAwM2VsZXZlbCA9IGxldmVsO1xuLVx0ZXYtXHUwMDNlbW9kZSA9IG1vZGU7XG4tXG4tXHRtdXRleF9sb2NrKFx1MDAyNnZtcHItXHUwMDNlZXZlbnRzX2xvY2spO1xuLVx0bGlzdF9hZGQoXHUwMDI2ZXYtXHUwMDNlbm9kZSwgXHUwMDI2dm1wci1cdTAwM2VldmVudHMpO1xuLVx0bXV0ZXhfdW5sb2NrKFx1MDAyNnZtcHItXHUwMDNlZXZlbnRzX2xvY2spO1xuLVx0cmV0ID0gMDtcbi1vdXQ6XG4tXHRrZnJlZShzcGVjX29yaWcpO1xuLVx0cmV0dXJuIHJldDtcbi19XG4tXG4tLyoqXG4tICogdm1wcmVzc3VyZV91bnJlZ2lzdGVyX2V2ZW50KCkgLSBVbmJpbmQgZXZlbnRmZCBmcm9tIHZtcHJlc3N1cmVcbi0gKiBAbWVtY2c6XHRtZW1jZyBoYW5kbGVcbi0gKiBAZXZlbnRmZDpcdGV2ZW50ZmQgY29udGV4dCB0aGF0IHdhcyB1c2VkIHRvIGxpbmsgdm1wcmVzc3VyZSB3aXRoIHRoZSBAY2dcbi0gKlxuLSAqIFRoaXMgZnVuY3Rpb24gZG9lcyBpbnRlcm5hbCBtYW5pcHVsYXRpb25zIHRvIGRldGFjaCB0aGUgQGV2ZW50ZmQgZnJvbVxuLSAqIHRoZSB2bXByZXNzdXJlIG5vdGlmaWNhdGlvbnMsIGFuZCB0aGVuIGZyZWVzIGludGVybmFsIHJlc291cmNlc1xuLSAqIGFzc29jaWF0ZWQgd2l0aCB0aGUgQGV2ZW50ZmQgKGJ1dCB0aGUgQGV2ZW50ZmQgaXRzZWxmIGlzIG5vdCBmcmVlZCkuXG4tICpcbi0gKiBUbyBiZSB1c2VkIGFzIG1lbWNnIGV2ZW50IG1ldGhvZC5cbi0gKi9cbi12b2lkIHZtcHJlc3N1cmVfdW5yZWdpc3Rlcl9ldmVudChzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csXG4tXHRcdFx0XHQgc3RydWN0IGV2ZW50ZmRfY3R4ICpldmVudGZkKVxuLXtcbi1cdHN0cnVjdCB2bXByZXNzdXJlICp2bXByID0gbWVtY2dfdG9fdm1wcmVzc3VyZShtZW1jZyk7XG4tXHRzdHJ1Y3Qgdm1wcmVzc3VyZV9ldmVudCAqZXY7XG4tXG4tXHRtdXRleF9sb2NrKFx1MDAyNnZtcHItXHUwMDNlZXZlbnRzX2xvY2spO1xuLVx0bGlzdF9mb3JfZWFjaF9lbnRyeShldiwgXHUwMDI2dm1wci1cdTAwM2VldmVudHMsIG5vZGUpIHtcbi1cdFx0aWYgKGV2LVx1MDAzZWVmZCAhPSBldmVudGZkKVxuLVx0XHRcdGNvbnRpbnVlO1xuLVx0XHRsaXN0X2RlbChcdTAwMjZldi1cdTAwM2Vub2RlKTtcbi1cdFx0a2ZyZWUoZXYpO1xuLVx0XHRicmVhaztcbi1cdH1cbi1cdG11dGV4X3VubG9jayhcdTAwMjZ2bXByLVx1MDAzZWV2ZW50c19sb2NrKTtcbi19XG4tXG4gLyoqXG4gICogdm1wcmVzc3VyZV9pbml0KCkgLSBJbml0aWFsaXplIHZtcHJlc3N1cmUgY29udHJvbCBzdHJ1Y3R1cmVcbiAgKiBAdm1wcjpcdFN0cnVjdHVyZSB0byBiZSBpbml0aWFsaXplZFxuQEAgLTQ2OCw5ICsyMDQsNyBAQCB2b2lkIHZtcHJlc3N1cmVfdW5yZWdpc3Rlcl9ldmVudChzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csXG4gdm9pZCB2bXByZXNzdXJlX2luaXQoc3RydWN0IHZtcHJlc3N1cmUgKnZtcHIpXG4ge1xuIFx0c3Bpbl9sb2NrX2luaXQoXHUwMDI2dm1wci1cdTAwM2Vzcl9sb2NrKTtcbi1cdG11dGV4X2luaXQoXHUwMDI2dm1wci1cdTAwM2VldmVudHNfbG9jayk7XG4tXHRJTklUX0xJU1RfSEVBRChcdTAwMjZ2bXByLVx1MDAzZWV2ZW50cyk7XG4tXHRJTklUX1dPUksoXHUwMDI2dm1wci1cdTAwM2V3b3JrLCB2bXByZXNzdXJlX3dvcmtfZm4pO1xuK1x0dm1wcmVzc3VyZV92MV9pbml0KHZtcHIpO1xuIH1cbiBcbiAvKipcbkBAIC00ODIsOSArMjE2LDUgQEAgdm9pZCB2bXByZXNzdXJlX2luaXQoc3RydWN0IHZtcHJlc3N1cmUgKnZtcHIpXG4gICovXG4gdm9pZCB2bXByZXNzdXJlX2NsZWFudXAoc3RydWN0IHZtcHJlc3N1cmUgKnZtcHIpXG4ge1xuLVx0Lypcbi1cdCAqIE1ha2Ugc3VyZSB0aGVyZSBpcyBubyBwZW5kaW5nIHdvcmsgYmVmb3JlIGV2ZW50ZmQgaW5mcmFzdHJ1Y3R1cmVcbi1cdCAqIGdvZXMgYXdheS5cbi1cdCAqL1xuLVx0Zmx1c2hfd29yayhcdTAwMjZ2bXByLVx1MDAzZXdvcmspO1xuK1x0dm1wcmVzc3VyZV92MV9jbGVhbnVwKHZtcHIpO1xuIH1cbiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA2LTI5VDE0OjMzOjU3LjUwMzczNjcyN1oiLCJTZXEiOjMsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjE4NTI4MDMxMDg1LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5c2lzIG9mIHRoZSB2bXByZXNzdXJlIGNncm91cCB2MSByZWZhY3RvcmluZyBwYXRjaCoqXG5cbk9rYXksIHNvIEknbSBsb29raW5nIGF0IHRoaXMgcGF0Y2ggdGhhdCByZWZhY3RvcnMgdGhlIGNncm91cCB2MSB2bXByZXNzdXJlIGNvZGUuIFRoZSBwcmltYXJ5IGdvYWwgc2VlbXMgdG8gYmUgdG8gc3BsaXQgb3V0IHRoZSB2MS1zcGVjaWZpYyBiaXRzIGludG8gYG1tL3ZtcHJlc3N1cmUtdjEuY2AgdXNpbmcgY29uZGl0aW9uYWwgY29tcGlsYXRpb24gYmFzZWQgb24gYENPTkZJR19NRU1DR19WMWAuIFRoaXMgaW52b2x2ZXMgbW92aW5nIGZ1bmN0aW9ucyBsaWtlIGB2bXByZXNzdXJlX3ByaW9gLCBgdm1wcmVzc3VyZV9yZWdpc3Rlcl9ldmVudGAsIGV0Yy4sIGFuZCBpbnRyb2R1Y2luZyBpbml0aWFsaXphdGlvbiBhbmQgY2xlYW51cCBmdW5jdGlvbnMgc3BlY2lmaWMgdG8gdjEuICBUaGUgYE1ha2VmaWxlYCBnZXRzIHVwZGF0ZWQgdG8gYnVpbGQgdGhlIG5ldyBmaWxlIHdoZW4gYENPTkZJR19NRU1DR19WMWAgaXMgZW5hYmxlZCwgYW5kIHRoZSBgdm1wcmVzc3VyZS5oYCBoZWFkZXIgaGlkZXMgdjEtc3BlY2lmaWMgZmllbGRzIHdpdGggYW4gYCNpZmRlZmAuIEl0J3MgYSBjbGVhciBhdHRlbXB0IHRvIGtlZXAgdGhlIHYyIGltcGxlbWVudGF0aW9uIGNsZWFuZXIuXG5cbk15IGluaXRpYWwgdGhvdWdodCBpcyB0byBjaGVjayBmb3IgYW55ICpmdW5jdGlvbmFsKiBjaGFuZ2VzLiBUaGUgY29tbWl0IG1lc3NhZ2UgbWVudGlvbnMgZHJvcHBpbmcgdGhlIHYxIGV2ZW50ZmQgYWNjdW11bGF0b3Igd2hlbiBgQ09ORklHX01FTUNHX1YxYCBpcyBkaXNhYmxlZCwgd2hpY2ggbWFrZXMgc2Vuc2UgZm9yIGEgdjItb25seSBrZXJuZWwuXG5cbk5vdyBJJ3ZlIGhpdCBhIHdyaW5rbGUuICBUaGUgcGF0Y2ggKmRvZXMqIG1vZGlmeSBgdm1wcmVzc3VyZSgpYCBpdHNlbGYuICBUaGUgY29kZSBub3cgaW5jbHVkZXMgYSBjb25kaXRpb25hbCBlYXJseSByZXR1cm46IGAoIWNncm91cF9zdWJzeXNfb25fZGZsKG1lbW9yeV9jZ3JwX3N1YnN5cykgXHUwMDI2XHUwMDI2ICF0cmVlKSB8fCAoY2dyb3VwX3N1YnN5c19vbl9kZmwobWVtb3J5X2NncnBfc3Vic3lzKSBcdTAwMjZcdTAwMjYgdHJlZSlgLiBUaGUgb3JpZ2luYWwgY29kZSBqdXN0IGhhZCBgIWNncm91cF9zdWJzeXNfb25fZGZsKG1lbW9yeV9jZ3JwX3N1YnN5cykgXHUwMDI2XHUwMDI2ICF0cmVlYC4gVGhpcyBpcyBhIGJpdCBtb3JlIHRoYW4ganVzdCBhIHJlZmFjdG9yaW5nLlxuXG5UaGlua2luZyBhYm91dCB0aGlzLCB0aGUgY2hhbmdlIG5vdyAqc2tpcHMqIHRoZSBgdHJlZWAgYnJhbmNoIHdoZW4gYGNncm91cF9zdWJzeXNfb25fZGZsYCBpcyB0cnVlIChjZ3JvdXAgdjIpIGFuZCBgdHJlZWAgaXMgYWxzbyB0cnVlLiBQcmV2aW91c2x5LCB0aGlzIGJyYW5jaCB3b3VsZCBoYXZlIGFjY3VtdWxhdGVkIGB0cmVlX3NjYW5uZWRgIGFuZCBzY2hlZHVsZWQgYHZtcHItXHUwMDNld29ya2AuIEluIHYyLCB0aGUgYHdvcmtgIGZ1bmN0aW9uIHdvdWxkIGhhdmUgZG9uZSBub3RoaW5nIGFzIHRoZXJlIGFyZSBubyByZWdpc3RlcmVkIHVzZXJzcGFjZSBldmVudGZkcy4gU28sIGl0IGFwcGVhcnMgdGhlIHBhdGNoIGludHJvZHVjZXMgYW4gKm9wdGltaXphdGlvbiosIGJ5IHNraXBwaW5nIHRoZSBzY2hlZHVsaW5nIGFuZCBhY2N1bXVsYXRpb24uIEl0J3Mgc2tpcHBpbmcgd29yayB0aGF0IHdvdWxkIGRvIG5vdGhpbmcsIHNvIHRoaXMgbWFrZXMgc2Vuc2UuXG5cblNvIGlzIHRoaXMgYSB3b3J0aHdoaWxlIHBhdGNoIHRvIGZ1eno/IEl0IGlzIG1vc3RseSBhIHJlZmFjdG9yaW5nLiBUaGUgdjEgY29kZSBpcyBiZWluZyBtb3ZlZCBhcm91bmQuIFRoZSBjaGFuZ2VzIGZvciBrZXJuZWxzIGNvbXBpbGVkIHdpdGggYENPTkZJR19NRU1DR19WMWAgZGlzYWJsZWQgYXJlIGEgcHVyZWx5IHN0cnVjdHVyYWwgY2xlYW51cC4gVGhlIG5ldyBgdm1wcmVzc3VyZV92MV8qYCBmdW5jdGlvbnMgYmVjb21lIG5vLW9wcy5cblxuVGhlIGNvcmUgb2YgdGhlIG1hdHRlciBpcyB0aGUgZWFybHkgcmV0dXJuIGluIGB2bXByZXNzdXJlKClgLiBXaGlsZSB0ZWNobmljYWxseSBhbiBvcHRpbWl6YXRpb24sIGl0ICpkb2VzKiBjaGFuZ2UgdGhlIGV4ZWN1dGlvbiBmbG93LiAgU28sIGJhc2VkIG9uIHRoYXQsIGV2ZW4gdGhvdWdoIGl0J3MgcmVsYXRpdmVseSBtaW5vciBhbmQgYSBwZXJmb3JtYW5jZSB0d2VhaywgdGhpcyBjb3VudHMgYXMgYSBmdW5jdGlvbmFsIGNoYW5nZS5cblxuVGhlcmVmb3JlLCBiZWNhdXNlIHRoaXMgZnVuY3Rpb25hbCBjaGFuZ2UgbW9kaWZpZXMgcmVhY2hhYmxlIGNvcmUga2VybmVsIGxvZ2ljLCBJIG11c3Qgc2F5ICoqV29ydGhGdXp6aW5nPXRydWUqKi5cblxuXG4iLCJJbnB1dFRva2VucyI6MTA5MzksIk91dHB1dFRva2VucyI6MTksIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxNzE2LCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDYtMjlUMTQ6MzQ6MTYuMDMxNzczNTYyWiIsIlNlcSI6NCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjI1NDc3NzAzMzMsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiTUVNQ0dfVjFcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiaW5jbHVkZS9saW51eC9tZW1jb250cm9sLmg9ODk9c3RydWN0IG1lbV9jZ3JvdXBfcGVyX25vZGUge1xcbi0tXFxuaW5jbHVkZS9saW51eC9tZW1jb250cm9sLmgtOTctXFxuaW5jbHVkZS9saW51eC9tZW1jb250cm9sLmg6OTg6I2lmZGVmIENPTkZJR19NRU1DR19WMVxcbmluY2x1ZGUvbGludXgvbWVtY29udHJvbC5oLTk5LVxcdC8qXFxuLS1cXG5pbmNsdWRlL2xpbnV4L21lbWNvbnRyb2wuaD0yMDI9c3RydWN0IG1lbV9jZ3JvdXAge1xcbi0tXFxuaW5jbHVkZS9saW51eC9tZW1jb250cm9sLmgtMjg1LVxcbmluY2x1ZGUvbGludXgvbWVtY29udHJvbC5oOjI4NjojaWZkZWYgQ09ORklHX01FTUNHX1YxXFxuaW5jbHVkZS9saW51eC9tZW1jb250cm9sLmgtMjg3LVxcdC8qIExlZ2FjeSBjb25zdW1lci1vcmllbnRlZCBjb3VudGVycyAqL1xcbi0tXFxuaW5jbHVkZS9saW51eC9tZW1jb250cm9sLmgtMzIwLVxcdHNwaW5sb2NrX3QgZXZlbnRfbGlzdF9sb2NrO1xcbmluY2x1ZGUvbGludXgvbWVtY29udHJvbC5oOjMyMTojZW5kaWYgLyogQ09ORklHX01FTUNHX1YxICovXFxuaW5jbHVkZS9saW51eC9tZW1jb250cm9sLmgtMzIyLVxcbi0tXFxuaW5jbHVkZS9saW51eC9tZW1jb250cm9sLmg9MTg2NT1zdGF0aWMgaW5saW5lIGJvb2wgbWVtX2Nncm91cF96c3dhcF93cml0ZWJhY2tfZW5hYmxlZChzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2cpXFxuLS1cXG5pbmNsdWRlL2xpbnV4L21lbWNvbnRyb2wuaC0xODc0LVxcbmluY2x1ZGUvbGludXgvbWVtY29udHJvbC5oOjE4NzU6I2lmZGVmIENPTkZJR19NRU1DR19WMVxcbmluY2x1ZGUvbGludXgvbWVtY29udHJvbC5oLTE4NzYtdW5zaWduZWQgbG9uZyBtZW1jZzFfc29mdF9saW1pdF9yZWNsYWltKHBnX2RhdGFfdCAqcGdkYXQsIGludCBvcmRlcixcXG4tLVxcbmluY2x1ZGUvbGludXgvbWVtY29udHJvbC5oPTE4OTM9c3RhdGljIGlubGluZSB2b2lkIG1lbV9jZ3JvdXBfZXhpdF91c2VyX2ZhdWx0KHZvaWQpXFxuLS1cXG5pbmNsdWRlL2xpbnV4L21lbWNvbnRyb2wuaC0xODk4LVxcbmluY2x1ZGUvbGludXgvbWVtY29udHJvbC5oOjE4OTk6I2Vsc2UgLyogQ09ORklHX01FTUNHX1YxICovXFxuaW5jbHVkZS9saW51eC9tZW1jb250cm9sLmgtMTkwMC1zdGF0aWMgaW5saW5lXFxuLS1cXG5pbmNsdWRlL2xpbnV4L21lbWNvbnRyb2wuaD0xOTIyPXN0YXRpYyBpbmxpbmUgdm9pZCBtZW1fY2dyb3VwX2V4aXRfdXNlcl9mYXVsdCh2b2lkKVxcbi0tXFxuaW5jbHVkZS9saW51eC9tZW1jb250cm9sLmgtMTkyNS1cXG5pbmNsdWRlL2xpbnV4L21lbWNvbnRyb2wuaDoxOTI2OiNlbmRpZiAvKiBDT05GSUdfTUVNQ0dfVjEgKi9cXG5pbmNsdWRlL2xpbnV4L21lbWNvbnRyb2wuaC0xOTI3LVxcbmluY2x1ZGUvbGludXgvbWVtY29udHJvbC5oOjE5Mjg6I2lmIGRlZmluZWQoQ09ORklHX01FTUNHX1YxKSBcXHUwMDI2XFx1MDAyNiBkZWZpbmVkKENPTkZJR19TV0FQKVxcbmluY2x1ZGUvbGludXgvbWVtY29udHJvbC5oLTE5MjktXFxuLS1cXG5pbmNsdWRlL2xpbnV4L3NjaGVkLmg9ODI2PXN0cnVjdCB0YXNrX3N0cnVjdCB7XFxuLS1cXG5pbmNsdWRlL2xpbnV4L3NjaGVkLmgtMTAyMS0jZW5kaWZcXG5pbmNsdWRlL2xpbnV4L3NjaGVkLmg6MTAyMjojaWZkZWYgQ09ORklHX01FTUNHX1YxXFxuaW5jbHVkZS9saW51eC9zY2hlZC5oLTEwMjMtXFx0dW5zaWduZWRcXHRcXHRcXHRpbl91c2VyX2ZhdWx0OjE7XFxuLS1cXG5pbmNsdWRlL2xpbnV4L3NjaGVkLmgtMTU0Ny1cXG5pbmNsdWRlL2xpbnV4L3NjaGVkLmg6MTU0ODojaWZkZWYgQ09ORklHX01FTUNHX1YxXFxuaW5jbHVkZS9saW51eC9zY2hlZC5oLTE1NDktXFx0c3RydWN0IG1lbV9jZ3JvdXBcXHRcXHQqbWVtY2dfaW5fb29tO1xcbi0tXFxuaW5jbHVkZS9saW51eC92bXByZXNzdXJlLmg9MTM9c3RydWN0IHZtcHJlc3N1cmUge1xcbi0tXFxuaW5jbHVkZS9saW51eC92bXByZXNzdXJlLmgtMTgtXFxuaW5jbHVkZS9saW51eC92bXByZXNzdXJlLmg6MTk6I2lmZGVmIENPTkZJR19NRU1DR19WMVxcbmluY2x1ZGUvbGludXgvdm1wcmVzc3VyZS5oLTIwLVxcdC8qXFxuLS1cXG5pbmNsdWRlL2xpbnV4L3ZtcHJlc3N1cmUuaC0yMi1cXHQgKiAobWVtb3J5LnByZXNzdXJlX2xldmVsKS4gRHJhaW5lZCBieSBAd29yay4gdjIgaGFzIG5vIGVxdWl2YWxlbnRcXG5pbmNsdWRlL2xpbnV4L3ZtcHJlc3N1cmUuaDoyMzpcXHQgKiBpbnRlcmZhY2UsIHNvIHRoaXMgc3RhdGUgaXMgb21pdHRlZCBvbiBDT05GSUdfTUVNQ0dfVjE9biBidWlsZHMuXFxuaW5jbHVkZS9saW51eC92bXByZXNzdXJlLmgtMjQtXFx0ICovXFxuLS1cXG5pbmNsdWRlL2xpbnV4L3ZtcHJlc3N1cmUuaD01NT1leHRlcm4gZW51bSB2bXByZXNzdXJlX2xldmVscyB2bXByZXNzdXJlX2NhbGNfbGV2ZWwodW5zaWduZWQgbG9uZyBzY2FubmVkLFxcbi0tXFxuaW5jbHVkZS9saW51eC92bXByZXNzdXJlLmgtNTctXFxuaW5jbHVkZS9saW51eC92bXByZXNzdXJlLmg6NTg6I2lmZGVmIENPTkZJR19NRU1DR19WMVxcbmluY2x1ZGUvbGludXgvdm1wcmVzc3VyZS5oLTU5LWV4dGVybiB2b2lkIHZtcHJlc3N1cmVfcHJpbyhnZnBfdCBnZnAsIHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZywgaW50IHByaW8pO1xcbi0tXFxuaW5jbHVkZS9saW51eC92bXByZXNzdXJlLmg9NjM9ZXh0ZXJuIHZvaWQgdm1wcmVzc3VyZV91bnJlZ2lzdGVyX2V2ZW50KHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZyxcXG4tLVxcbmluY2x1ZGUvbGludXgvdm1wcmVzc3VyZS5oLTY1LVxcbmluY2x1ZGUvbGludXgvdm1wcmVzc3VyZS5oOjY2Oi8qIHYxIGhvb2tzIGNhbGxlZCBmcm9tIG1tL3ZtcHJlc3N1cmUuYzsgbm8tb3BzIGJlbG93IHdoZW4gIU1FTUNHX1YxLiAqL1xcbmluY2x1ZGUvbGludXgvdm1wcmVzc3VyZS5oLTY3LWV4dGVybiB2b2lkIHZtcHJlc3N1cmVfdjFfaW5pdChzdHJ1Y3Qgdm1wcmVzc3VyZSAqdm1wcik7XFxuLS1cXG5pbmNsdWRlL2xpbnV4L3ZtcHJlc3N1cmUuaD03Nz1zdGF0aWMgaW5saW5lIHZvaWQgdm1wcmVzc3VyZV92MV9hY2NvdW50X3RyZWUoc3RydWN0IHZtcHJlc3N1cmUgKnZtcHIsXFxuLS1cXG5pbmNsdWRlL2xpbnV4L3ZtcHJlc3N1cmUuaC03OS1cXHRcXHRcXHRcXHRcXHQgICAgICB1bnNpZ25lZCBsb25nIHJlY2xhaW1lZCkge31cXG5pbmNsdWRlL2xpbnV4L3ZtcHJlc3N1cmUuaDo4MDojZW5kaWYgLyogQ09ORklHX01FTUNHX1YxICovXFxuaW5jbHVkZS9saW51eC92bXByZXNzdXJlLmgtODEtXFxuLS1cXG5pbmNsdWRlL25ldC9zb2NrLmg9MjcwMj1zdGF0aWMgaW5saW5lIGJvb2wgbWVtX2Nncm91cF9za191bmRlcl9tZW1vcnlfcHJlc3N1cmUoY29uc3Qgc3RydWN0IHNvY2sgKnNrKVxcbi0tXFxuaW5jbHVkZS9uZXQvc29jay5oLTI3MDUtXFxuaW5jbHVkZS9uZXQvc29jay5oOjI3MDY6I2lmZGVmIENPTkZJR19NRU1DR19WMVxcbmluY2x1ZGUvbmV0L3NvY2suaC0yNzA3LVxcdGlmICghY2dyb3VwX3N1YnN5c19vbl9kZmwobWVtb3J5X2NncnBfc3Vic3lzKSlcXG5pbmNsdWRlL25ldC9zb2NrLmgtMjcwOC1cXHRcXHRyZXR1cm4gISFtZW1jZy1cXHUwMDNldGNwbWVtX3ByZXNzdXJlO1xcbmluY2x1ZGUvbmV0L3NvY2suaDoyNzA5OiNlbmRpZiAvKiBDT05GSUdfTUVNQ0dfVjEgKi9cXG5pbmNsdWRlL25ldC9zb2NrLmgtMjcxMC1cXG4tLVxcbmluaXQvS2NvbmZpZz0xMDg5PWNvbmZpZyBNRU1DR19OTUlfU0FGRVRZX1JFUVVJUkVTX0FUT01JQ1xcbi0tXFxuaW5pdC9LY29uZmlnLTEwOTUtXFxuaW5pdC9LY29uZmlnOjEwOTY6Y29uZmlnIE1FTUNHX1YxXFxuaW5pdC9LY29uZmlnLTEwOTctXFx0Ym9vbCBcXFwiTGVnYWN5IGNncm91cCB2MSBtZW1vcnkgY29udHJvbGxlclxcXCJcXG4tLVxcbm1tL01ha2VmaWxlPTEwMz1vYmotJChDT05GSUdfTElWRVVQREFURV9NRU1GRCkgKz0gbWVtZmRfbHVvLm9cXG5tbS9NYWtlZmlsZToxMDQ6b2JqLSQoQ09ORklHX01FTUNHX1YxKSArPSBtZW1jb250cm9sLXYxLm8gdm1wcmVzc3VyZS12MS5vXFxubW0vTWFrZWZpbGUtMTA1LW9iai0kKENPTkZJR19NRU1DRykgKz0gbWVtY29udHJvbC5vIHZtcHJlc3N1cmUub1xcbi0tXFxubW0vbWVtY29udHJvbC12MS5oPTI0PXN0cnVjdCBtZW1fY2dyb3VwICptZW1fY2dyb3VwX3ByaXZhdGVfaWRfZ2V0X29ubGluZShzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csXFxuLS1cXG5tbS9tZW1jb250cm9sLXYxLmgtMjctLyogQ2dyb3VwIHYxLXNwZWNpZmljIGRlY2xhcmF0aW9ucyAqL1xcbm1tL21lbWNvbnRyb2wtdjEuaDoyODojaWZkZWYgQ09ORklHX01FTUNHX1YxXFxubW0vbWVtY29udHJvbC12MS5oLTI5LVxcbi0tXFxubW0vbWVtY29udHJvbC12MS5oPTkxPWV4dGVybiBzdHJ1Y3QgY2Z0eXBlIG1lbV9jZ3JvdXBfbGVnYWN5X2ZpbGVzW107XFxubW0vbWVtY29udHJvbC12MS5oLTkyLVxcbm1tL21lbWNvbnRyb2wtdjEuaDo5MzojZWxzZVxcdC8qIENPTkZJR19NRU1DR19WMSAqL1xcbm1tL21lbWNvbnRyb2wtdjEuaC05NC1cXG4tLVxcbm1tL21lbWNvbnRyb2wtdjEuaD0xMjE9c3RhdGljIGlubGluZSB2b2lkIG1lbWNnMV91bmNoYXJnZV9za21lbShzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csIHVuc2lnbmVkIGludCBucl9wYWdlcykge31cXG5tbS9tZW1jb250cm9sLXYxLmgtMTIyLVxcbm1tL21lbWNvbnRyb2wtdjEuaDoxMjM6I2VuZGlmXFx0LyogQ09ORklHX01FTUNHX1YxICovXFxubW0vbWVtY29udHJvbC12MS5oLTEyNC1cXG4tLVxcbm1tL21lbWNvbnRyb2wuYz0yMDk9c3RhdGljIGlubGluZSBzdHJ1Y3Qgb2JqX2Nncm91cCAqX19tZW1jZ19yZXBhcmVudF9vYmpjZ3Moc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLFxcbi0tXFxubW0vbWVtY29udHJvbC5jLTIyOC1cXG5tbS9tZW1jb250cm9sLmM6MjI5OiNpZmRlZiBDT05GSUdfTUVNQ0dfVjFcXG5tbS9tZW1jb250cm9sLmMtMjMwLXN0YXRpYyB2b2lkIF9fbWVtX2Nncm91cF9mbHVzaF9zdGF0cyhzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csIGJvb2wgZm9yY2UpO1xcbi0tXFxubW0vbWVtY29udHJvbC5jPTUwNT11bnNpZ25lZCBsb25nIGxydXZlY19wYWdlX3N0YXRlX2xvY2FsKHN0cnVjdCBscnV2ZWMgKmxydXZlYyxcXG4tLVxcbm1tL21lbWNvbnRyb2wuYy01MjctXFxubW0vbWVtY29udHJvbC5jOjUyODojaWZkZWYgQ09ORklHX01FTUNHX1YxXFxubW0vbWVtY29udHJvbC5jLTUyOS1zdGF0aWMgdm9pZCBfX21vZF9tZW1jZ19scnV2ZWNfc3RhdGUoc3RydWN0IG1lbV9jZ3JvdXBfcGVyX25vZGUgKnBuLFxcbi0tXFxubW0vbWVtY29udHJvbC5jPTU1Mz1zdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1lbWNnX3ZtX2V2ZW50X3N0YXRbXSA9IHtcXG5tbS9tZW1jb250cm9sLmM6NTU0OiNpZmRlZiBDT05GSUdfTUVNQ0dfVjFcXG5tbS9tZW1jb250cm9sLmMtNTU1LVxcdFBHUEdJTixcXG4tLVxcbm1tL21lbWNvbnRyb2wuYz03ODc9c3RhdGljIGxvbmcgbWVtY2dfc3RhdGVfdmFsX2luX3BhZ2VzKGludCBpZHgsIGxvbmcgdmFsKVxcbi0tXFxubW0vbWVtY29udHJvbC5jLTgwMi1cXG5tbS9tZW1jb250cm9sLmM6ODAzOiNpZmRlZiBDT05GSUdfTUVNQ0dfVjFcXG5tbS9tZW1jb250cm9sLmMtODA0LS8qXFxuLS1cXG5tbS9tZW1jb250cm9sLmM9ODcxPXZvaWQgbW9kX21lbWNnX3N0YXRlKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZywgZW51bSBtZW1jZ19zdGF0X2l0ZW0gaWR4LFxcbi0tXFxubW0vbWVtY29udHJvbC5jLTg4My1cXG5tbS9tZW1jb250cm9sLmM6ODg0OiNpZmRlZiBDT05GSUdfTUVNQ0dfVjFcXG5tbS9tZW1jb250cm9sLmMtODg1LS8qIGlkeCBjYW4gYmUgb2YgdHlwZSBlbnVtIG1lbWNnX3N0YXRfaXRlbSBvciBub2RlX3N0YXRfaXRlbS4gKi9cXG4tLVxcbm1tL21lbWNvbnRyb2wuYz0xMDU5PWJvb2wgbWVtY2dfdm1fZXZlbnRfaXRlbV92YWxpZChlbnVtIHZtX2V2ZW50X2l0ZW0gaWR4KVxcbi0tXFxubW0vbWVtY29udHJvbC5jLTEwNjYtXFxubW0vbWVtY29udHJvbC5jOjEwNjc6I2lmZGVmIENPTkZJR19NRU1DR19WMVxcbm1tL21lbWNvbnRyb2wuYy0xMDY4LXVuc2lnbmVkIGxvbmcgbWVtY2dfZXZlbnRzX2xvY2FsKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZywgaW50IGV2ZW50KVxcbi0tXFxubW0vbWVtY29udHJvbC5jPTE2Njc9dW5zaWduZWQgbG9uZyBtZW1jZ19wYWdlX3N0YXRlX291dHB1dChzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csIGludCBpdGVtKVxcbi0tXFxubW0vbWVtY29udHJvbC5jLTE2NzItXFxubW0vbWVtY29udHJvbC5jOjE2NzM6I2lmZGVmIENPTkZJR19NRU1DR19WMVxcbm1tL21lbWNvbnRyb2wuYy0xNjc0LXVuc2lnbmVkIGxvbmcgbWVtY2dfcGFnZV9zdGF0ZV9sb2NhbF9vdXRwdXQoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLCBpbnQgaXRlbSlcXG4tLVxcbm1tL21lbWNvbnRyb2wuYz0xNjkzPXN0YXRpYyB2b2lkIG1lbWNnX3N0YXRfZm9ybWF0KHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZywgc3RydWN0IHNlcV9idWYgKnMpXFxuLS1cXG5tbS9tZW1jb250cm9sLmMtMTczOS1cXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgQVJSQVlfU0laRShtZW1jZ192bV9ldmVudF9zdGF0KTsgaSsrKSB7XFxubW0vbWVtY29udHJvbC5jOjE3NDA6I2lmZGVmIENPTkZJR19NRU1DR19WMVxcbm1tL21lbWNvbnRyb2wuYy0xNzQxLVxcdFxcdGlmIChtZW1jZ192bV9ldmVudF9zdGF0W2ldID09IFBHUEdJTiB8fFxcbi0tXFxubW0vbWVtY29udHJvbC5jPTE3OTE9dm9pZCBtZW1fY2dyb3VwX3ByaW50X29vbV9tZW1pbmZvKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZylcXG4tLVxcbm1tL21lbWNvbnRyb2wuYy0xODEyLVxcdFxcdFxcdGF0b21pY19sb25nX3JlYWQoXFx1MDAyNm1lbWNnLVxcdTAwM2VtZW1vcnlfZXZlbnRzW01FTUNHX1NXQVBfTUFYXSkpO1xcbm1tL21lbWNvbnRyb2wuYzoxODEzOiNpZmRlZiBDT05GSUdfTUVNQ0dfVjFcXG5tbS9tZW1jb250cm9sLmMtMTgxNC1cXHRlbHNlIHtcXG4tLVxcbm1tL21lbWNvbnRyb2wuYz00MTU3PW1lbV9jZ3JvdXBfY3NzX2FsbG9jKHN0cnVjdCBjZ3JvdXBfc3Vic3lzX3N0YXRlICpwYXJlbnRfY3NzKVxcbi0tXFxubW0vbWVtY29udHJvbC5jLTQxODAtXFx0XFx0cGFnZV9jb3VudGVyX2luaXQoXFx1MDAyNm1lbWNnLVxcdTAwM2Vzd2FwLCBcXHUwMDI2cGFyZW50LVxcdTAwM2Vzd2FwLCBmYWxzZSk7XFxubW0vbWVtY29udHJvbC5jOjQxODE6I2lmZGVmIENPTkZJR19NRU1DR19WMVxcbm1tL21lbWNvbnRyb2wuYy00MTgyLVxcdFxcdG1lbWNnLVxcdTAwM2VtZW1vcnkudHJhY2tfZmFpbGNudCA9ICFtZW1jZ19vbl9kZmw7XFxuLS1cXG5tbS9tZW1jb250cm9sLmMtNDE5MS1cXHRcXHRwYWdlX2NvdW50ZXJfaW5pdChcXHUwMDI2bWVtY2ctXFx1MDAzZXN3YXAsIE5VTEwsIGZhbHNlKTtcXG5tbS9tZW1jb250cm9sLmM6NDE5MjojaWZkZWYgQ09ORklHX01FTUNHX1YxXFxubW0vbWVtY29udHJvbC5jLTQxOTMtXFx0XFx0cGFnZV9jb3VudGVyX2luaXQoXFx1MDAyNm1lbWNnLVxcdTAwM2VrbWVtLCBOVUxMLCBmYWxzZSk7XFxuLS1cXG5tbS9tZW1jb250cm9sLmM9NDM1OT1zdGF0aWMgdm9pZCBtZW1fY2dyb3VwX2Nzc19yZXNldChzdHJ1Y3QgY2dyb3VwX3N1YnN5c19zdGF0ZSAqY3NzKVxcbi0tXFxubW0vbWVtY29udHJvbC5jLTQzNjQtXFx0cGFnZV9jb3VudGVyX3NldF9tYXgoXFx1MDAyNm1lbWNnLVxcdTAwM2Vzd2FwLCBQQUdFX0NPVU5URVJfTUFYKTtcXG5tbS9tZW1jb250cm9sLmM6NDM2NTojaWZkZWYgQ09ORklHX01FTUNHX1YxXFxubW0vbWVtY29udHJvbC5jLTQzNjYtXFx0cGFnZV9jb3VudGVyX3NldF9tYXgoXFx1MDAyNm1lbWNnLVxcdTAwM2VrbWVtLCBQQUdFX0NPVU5URVJfTUFYKTtcXG4tLVxcbm1tL21lbWNvbnRyb2wuYz01MDc2PXN0cnVjdCBjZ3JvdXBfc3Vic3lzIG1lbW9yeV9jZ3JwX3N1YnN5cyA9IHtcXG4tLVxcbm1tL21lbWNvbnRyb2wuYy01MDg3LVxcdC5kZmxfY2Z0eXBlcyA9IG1lbW9yeV9maWxlcyxcXG5tbS9tZW1jb250cm9sLmM6NTA4ODojaWZkZWYgQ09ORklHX01FTUNHX1YxXFxubW0vbWVtY29udHJvbC5jLTUwODktXFx0LmxlZ2FjeV9jZnR5cGVzID0gbWVtX2Nncm91cF9sZWdhY3lfZmlsZXMsXFxuLS1cXG5tbS9tZW1jb250cm9sLmM9NjAyMj1zdGF0aWMgaW50IF9faW5pdCBtZW1fY2dyb3VwX3N3YXBfaW5pdCh2b2lkKVxcbi0tXFxubW0vbWVtY29udHJvbC5jLTYwMjctXFx0V0FSTl9PTihjZ3JvdXBfYWRkX2RmbF9jZnR5cGVzKFxcdTAwMjZtZW1vcnlfY2dycF9zdWJzeXMsIHN3YXBfZmlsZXMpKTtcXG5tbS9tZW1jb250cm9sLmM6NjAyODojaWZkZWYgQ09ORklHX01FTUNHX1YxXFxubW0vbWVtY29udHJvbC5jLTYwMjktXFx0V0FSTl9PTihjZ3JvdXBfYWRkX2xlZ2FjeV9jZnR5cGVzKFxcdTAwMjZtZW1vcnlfY2dycF9zdWJzeXMsIG1lbXN3X2ZpbGVzKSk7XFxuLS1cXG5tbS92bXByZXNzdXJlLXYxLmMtNC0gKiBjZ3JvdXAuZXZlbnRfY29udHJvbCkuIFNwbGl0IG91dCBvZiBtbS92bXByZXNzdXJlLmMgc28gdGhhdCB2Mi1vbmx5XFxubW0vdm1wcmVzc3VyZS12MS5jOjU6ICoga2VybmVscyAoQ09ORklHX01FTUNHX1YxPW4pIGRyb3AgdGhlIHdob2xlIGV2ZW50ZmQgYWNjdW11bGF0b3IsXFxubW0vdm1wcmVzc3VyZS12MS5jLTYtICogaXRzIHdvcmsgaXRlbSwgYW5kIHRoZSBwZXItbWVtY2cgc3RhdGUgaXQgcmVxdWlyZXMuXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA2LTI5VDE0OjM0OjE4LjU3OTU0ODUwNVoiLCJTZXEiOjUsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjE3MTc0NTIyNTc2LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyB0aGUgSW1wYWN0IG9mIHRoZSBgQ09ORklHX01FTUNHX1YxYCBQYXRjaCoqXG5cbk9rYXksIHNvIEknbSBsb29raW5nIGF0IHRoaXMgcGF0Y2ggcmVsYXRlZCB0byB0aGUgYENPTkZJR19NRU1DR19WMWAgY29uZmlnLCB3aGljaCBlbmFibGVzIHRoZSBsZWdhY3kgY2dyb3VwIHYxIG1lbW9yeSBjb250cm9sbGVyLiBNeSBpbml0aWFsIHRob3VnaHQgaXMgdG8gYXNzZXNzIHdoZXRoZXIgdGhpcyB3YXJyYW50cyBmdXp6aW5nLiBUaGUgcGF0Y2ggbW92ZXMgdGhlIHYxIHZtcHJlc3N1cmUgY29kZSBpbnRvIGBtbS92bXByZXNzdXJlLXYxLmNgIGFuZCBndWFyZHMgaXQgd2l0aCBgQ09ORklHX01FTUNHX1YxYC4gSXQgc2VlbXMgbGlrZSBhIHJlZmFjdG9yaW5nLlxuXG5UaGUgcHJvbXB0IGlzIHByZXR0eSBzcGVjaWZpYy4gSXQgdGVsbHMgbWUgdG8gcmV0dXJuIGBXb3J0aEZ1enppbmc9ZmFsc2VgIGlmIHRoZXJlIGFyZSBvbmx5IHRoaW5ncyBsaWtlIGRvY3VtZW50YXRpb24gY2hhbmdlcywgS2NvbmZpZyBmaWxlIG1vZGlmaWNhdGlvbnMsIGNvbW1lbnRzLCBsb2dnaW5nLCBvciBjaGFuZ2VzIHRvIGNvbnN0YW50cyB0aGF0ICpkb24ndCogYWx0ZXIgZXhlY3V0aW9uIGZsb3cuIEl0IGFsc28gc2F5cyB0byBleGNsdWRlIHRoaW5ncyB0aGF0IGFyZSB1bnJlYWNoYWJsZSBpbiBlbXVsYXRlZCBlbnZpcm9ubWVudHMuXG5cblRoZSBtYWluIGZ1bmN0aW9uYWwgY2hhbmdlIHNlZW1zIHRvIGJlIGFuIGVhcmx5IHJldHVybiBvcHRpbWl6YXRpb24gaW4gYG1tL3ZtcHJlc3N1cmUuY2A6XG5gYGBjXG5cdGlmICgoIWNncm91cF9zdWJzeXNfb25fZGZsKG1lbW9yeV9jZ3JwX3N1YnN5cykgXHUwMDI2XHUwMDI2ICF0cmVlKSB8fFxuXHQgICAgKGNncm91cF9zdWJzeXNfb25fZGZsKG1lbW9yeV9jZ3JwX3N1YnN5cykgXHUwMDI2XHUwMDI2IHRyZWUpKVxuXHRcdHJldHVybjtcbmBgYFxuXG5UaGlzICpkb2VzKiBhbHRlciB0aGUgZXhlY3V0aW9uIGZsb3cgb2YgdGhlIGB2bXByZXNzdXJlYCBmdW5jdGlvbiwgc28gSSBuZWVkIHRvIGNhcmVmdWxseSBjb25zaWRlciB0aGlzLiBJdCdzIG5vdCBqdXN0IGEgY29uc3RhbnQgb3IgYSBtYWNybyBjaGFuZ2UuIFRoZSBwYXRjaCBhbHNvIHJlZmFjdG9ycyBieSBtb3ZpbmcgY29kZSB0byBhIG5ldyBmaWxlLCBidXQgdGhhdCBhbG9uZSBkb2Vzbid0IHVzdWFsbHkgcXVhbGlmeS4gSSBuZWVkIHRvIGZpZ3VyZSBvdXQgaWYgdGhpcyBpcyBhY3R1YWxseSBpbXBvcnRhbnQgdG8gdGVzdC5cblxuSWYgSSBkZWNpZGUgdG8gZmxhZyB0aGlzIGFzIGZ1enotd29ydGh5LCBJJ2xsIG5lZWQgdG8gc3BlY2lmeSBgRm9jdXNTeW1ib2xzYCBhbmQgYEVuYWJsZUNvbmZpZ3NgLiBUaGUgZm9jdXMgc3ltYm9scyB3aWxsIGJlOiBgdm1wcmVzc3VyZWAsIGB2bXByZXNzdXJlX3YxX2FjY291bnRfdHJlZWAsIGB2bXByZXNzdXJlX3JlZ2lzdGVyX2V2ZW50YCwgYHZtcHJlc3N1cmVfdW5yZWdpc3Rlcl9ldmVudGAsIGFuZCBgdm1wcmVzc3VyZV9wcmlvYC4gVGhlIGVuYWJsZSBjb25maWdzIGFyZSBgTUVNQ0dfVjFgIGFuZCBgTUVNQ0dgLlxuXG5MZXQncyBkaWcgYSBsaXR0bGUgZGVlcGVyLiBUaGUgYHZtcHJlc3N1cmVfdjFfYWNjb3VudF90cmVlYCBmdW5jdGlvbiBpcyBjYWxsZWQgZnJvbSB3aXRoaW4gYHZtcHJlc3N1cmVgIHdoZW4gYHRyZWVgIGlzIHRydWUuIExldCdzIHNlZSBpZiB0aGVyZSBhcmUgYW55IG90aGVyIGRpZmZlcmVuY2VzLlxuYGBgY1xuXHRpZiAodHJlZSkge1xuXHRcdHZtcHJlc3N1cmVfdjFfYWNjb3VudF90cmVlKHZtcHIsIHNjYW5uZWQsIHJlY2xhaW1lZCk7XG5cdH0gZWxzZSB7XG5gYGBcblxuSW5zcGVjdGluZyBgdm1wcmVzc3VyZV92MV9hY2NvdW50X3RyZWVgIHNob3dzOlxuYGBgY1xudm9pZCB2bXByZXNzdXJlX3YxX2FjY291bnRfdHJlZShzdHJ1Y3Qgdm1wcmVzc3VyZSAqdm1wcixcblx0XHRcdFx0dW5zaWduZWQgbG9uZyBzY2FubmVkLFxuXHRcdFx0XHR1bnNpZ25lZCBsb25nIHJlY2xhaW1lZClcbntcblx0c3Bpbl9sb2NrKFx1MDAyNnZtcHItXHUwMDNlc3JfbG9jayk7XG5cdHNjYW5uZWQgPSB2bXByLVx1MDAzZXRyZWVfc2Nhbm5lZCArPSBzY2FubmVkO1xuXHR2bXByLVx1MDAzZXRyZWVfcmVjbGFpbWVkICs9IHJlY2xhaW1lZDtcblx0c3Bpbl91bmxvY2soXHUwMDI2dm1wci1cdTAwM2Vzcl9sb2NrKTtcblxuXHRpZiAoc2Nhbm5lZCBcdTAwM2Mgdm1wcmVzc3VyZV93aW4pXG5cdFx0cmV0dXJuO1xuXHRzY2hlZHVsZV93b3JrKFx1MDAyNnZtcHItXHUwMDNld29yayk7XG59XG5gYGBcblxuVGhpcyBpcyBpZGVudGljYWwgdG8gd2hhdCB3YXMgdGhlcmUgcHJldmlvdXNseSwgYXMgZmFyIGFzIEkgY2FuIHRlbGwuXG5cblRoZW4sIHRoZSBgdm1wcmVzc3VyZV93b3JrX2ZuYCBmdW5jdGlvbiBpcyBhbHNvIG1vdmVkIHRvIGBtbS92bXByZXNzdXJlLXYxLmNgLCBhbmQgaXQncyBhbHNvIGlkZW50aWNhbC5cbmBgYGNcbnN0YXRpYyB2b2lkIHZtcHJlc3N1cmVfd29ya19mbihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspXG57XG5cdHN0cnVjdCB2bXByZXNzdXJlICp2bXByID0gd29ya190b192bXByZXNzdXJlKHdvcmspO1xuXHR1bnNpZ25lZCBsb25nIHNjYW5uZWQ7XG5cdHVuc2lnbmVkIGxvbmcgcmVjbGFpbWVkO1xuXHRlbnVtIHZtcHJlc3N1cmVfbGV2ZWxzIGxldmVsO1xuXHRib29sIGFuY2VzdG9yID0gZmFsc2U7XG5cdGJvb2wgc2lnbmFsbGVkID0gZmFsc2U7XG5cblx0c3Bpbl9sb2NrKFx1MDAyNnZtcHItXHUwMDNlc3JfbG9jayk7XG4uLi5cbmBgYFxuXG5TbywgdGhlIG9ubHkgZnVuY3Rpb25hbCBjaGFuZ2UgaXMgdGhhdCBlYXJseSByZXR1cm4uXG5gYGBjXG5cdGlmICgoIWNncm91cF9zdWJzeXNfb25fZGZsKG1lbW9yeV9jZ3JwX3N1YnN5cykgXHUwMDI2XHUwMDI2ICF0cmVlKSB8fFxuXHQgICAgKGNncm91cF9zdWJzeXNfb25fZGZsKG1lbW9yeV9jZ3JwX3N1YnN5cykgXHUwMDI2XHUwMDI2IHRyZWUpKVxuXHRcdHJldHVybjtcbmBgYFxuXG5JZiBJIHJldHVybiBgV29ydGhGdXp6aW5nPWZhbHNlYCwgSSBjb3VsZCBiZSBwZW5hbGl6ZWQgaWYgdGhpcyBlYXJseSByZXR1cm4gaXMgZGVlbWVkIGEgZnVuY3Rpb25hbCBjaGFuZ2UuIFRoZSBwcm9tcHQgc3RhdGVzIHRoYXQgb25seSBjaGFuZ2VzIHRvICpudW1lcmljIGNvbnN0YW50cyBvciBtYWNyb3MqIHRoYXQgKmRvbid0KiBmdW5jdGlvbmFsbHkgYWx0ZXIgdGhlIGV4ZWN1dGlvbiBmbG93IHNob3VsZCBiZSBleGNsdWRlZC4gVGhpcyBpcyBhbiBgaWZgIGNvbmRpdGlvbiBpbiBhIGNvcmUgZnVuY3Rpb24gKGB2bXByZXNzdXJlYCksIHNvIEknbSBlcnJpbmcgb24gdGhlIHNpZGUgb2YgY2F1dGlvbi4gSSBhbSBnb2luZyB0byBzYXkgYFdvcnRoRnV6emluZz10cnVlYC5cblxuXG4iLCJJbnB1dFRva2VucyI6MTY4MjksIk91dHB1dFRva2VucyI6MjEsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxMDE0LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA2LTI5VDE0OjM0OjM1Ljc1NDA3NDkzMVoiLCJTZXEiOjYsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjozMDM5MDkwOTE2LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcIl52b2lkIHZtcHJlc3N1cmVcXFxcKFwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJpbmNsdWRlL2xpbnV4L3ZtcHJlc3N1cmUuaD00Mz1zdHJ1Y3QgbWVtX2Nncm91cDtcXG4tLVxcbmluY2x1ZGUvbGludXgvdm1wcmVzc3VyZS5oLTQ1LSNpZmRlZiBDT05GSUdfTUVNQ0dcXG5pbmNsdWRlL2xpbnV4L3ZtcHJlc3N1cmUuaDo0Njp2b2lkIHZtcHJlc3N1cmUoZ2ZwX3QgZ2ZwLCBpbnQgb3JkZXIsIHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZywgYm9vbCB0cmVlLFxcbmluY2x1ZGUvbGludXgvdm1wcmVzc3VyZS5oLTQ3LVxcdFxcdHVuc2lnbmVkIGxvbmcgc2Nhbm5lZCwgdW5zaWduZWQgbG9uZyByZWNsYWltZWQpO1xcbi0tXFxubW0vdm1wcmVzc3VyZS5jPTU3PWVudW0gdm1wcmVzc3VyZV9sZXZlbHMgdm1wcmVzc3VyZV9jYWxjX2xldmVsKHVuc2lnbmVkIGxvbmcgc2Nhbm5lZCxcXG4tLVxcbm1tL3ZtcHJlc3N1cmUuYy0xMDgtICovXFxubW0vdm1wcmVzc3VyZS5jOjEwOTp2b2lkIHZtcHJlc3N1cmUoZ2ZwX3QgZ2ZwLCBpbnQgb3JkZXIsIHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZywgYm9vbCB0cmVlLFxcbm1tL3ZtcHJlc3N1cmUuYy0xMTAtXFx0XFx0dW5zaWduZWQgbG9uZyBzY2FubmVkLCB1bnNpZ25lZCBsb25nIHJlY2xhaW1lZClcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDYtMjlUMTQ6MzQ6MzguNzkzMTcwNTU3WiIsIlNlcSI6NywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MzQ2MjQyODc5NSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgbGV0J3MgZGl2ZSBpbnRvIHRoaXMuIEkgbmVlZCB0byBnZXQgYSBoYW5kbGUgb24gdGhlIHNpdHVhdGlvbiBhbmQgZmlndXJlIG91dCB3aGF0J3MgZ29pbmcgb24uXG5cbioqQW5hbHl6aW5nIHRoZSBgdm1wcmVzc3VyZWAgRnVuY3Rpb24qKlxuXG5SaWdodCwgdGhlIGZpcnN0IHRoaW5nIEkgbmVlZCB0byBkbyBpcyBleGFtaW5lIHRoZSBgdm1wcmVzc3VyZWAgZnVuY3Rpb24gaXRzZWxmLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCBpdHMgcHVycG9zZSwgd2hhdCBpdCdzIGRlc2lnbmVkIHRvIG1lYXN1cmUgb3IgY2FsY3VsYXRlLCBhbmQgbW9zdCBpbXBvcnRhbnRseSwgaG93IGl0J3MgaW1wbGVtZW50ZWQuIEknbSBsb29raW5nIGZvciB0aGUga2V5IGFsZ29yaXRobXMsIGRhdGEgc3RydWN0dXJlcywgYW5kIGFueSBzcGVjaWZpYyBjb25zaWRlcmF0aW9ucyB0aGUgZGV2ZWxvcGVycyBwdXQgaW50byBpdC4gV2hhdCBhc3N1bXB0aW9ucyBkaWQgdGhleSBtYWtlPyBBcmUgdGhlcmUgYW55IHBvdGVudGlhbCBib3R0bGVuZWNrcyBJIHNob3VsZCBiZSBhd2FyZSBvZj8gSSdtIGdvaW5nIHRvIGxvb2sgYXQgdGhlIGNvbW1lbnRzLCB0aGUgdmFyaWFibGUgbmFtZXMsIGFuZCB0aGUgb3ZlcmFsbCBjb250cm9sIGZsb3cgdG8gcXVpY2tseSBncmFzcCB0aGUgZXNzZW5jZSBvZiBpdC4gRGVwZW5kaW5nIG9uIHRoZSBjb21wbGV4aXR5LCBJIG1pZ2h0IG5lZWQgdG8gdHJhY2UgaXRzIGV4ZWN1dGlvbiB3aXRoIHNvbWUgc2FtcGxlIGRhdGEgaW4gbXkgaGVhZCwgYXQgbGVhc3QgZm9yIHRoZSBjcml0aWNhbCBwYXRocy4gTXkgZ29hbCBpcyB0byBxdWlja2x5IHBpbnBvaW50IGFueSBwb3RlbnRpYWwgd2Vha25lc3NlcywgaW50ZXJlc3Rpbmcgb3B0aW1pemF0aW9uIHN0cmF0ZWdpZXMsIG9yIGFueSBhcmVhcyB0aGF0IG1pZ2h0IHJlcXVpcmUgZnVydGhlciBpbnZlc3RpZ2F0aW9uIGJhc2VkIG9uIG15IGV4cGVyaWVuY2UuIEkgd2FudCB0byBidWlsZCBhIG1lbnRhbCBtb2RlbCBvZiB0aGlzIGZ1bmN0aW9uLCBzbyBJIGNhbiBzdGFydCBmb3JtaW5nIG15IGh5cG90aGVzZXMgYW5kIGV2YWx1YXRlIGlmIGl0J3Mgb3BlcmF0aW5nIGFzIGludGVuZGVkLCBhbmQgaG93IGl0IG1pZ2h0IGZpdCBpbnRvIHRoZSBicm9hZGVyIHN5c3RlbSBhcmNoaXRlY3R1cmUuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjE5MTAxLCJPdXRwdXRUb2tlbnMiOjM3LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTMsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDYtMjlUMTQ6MzQ6NDIuMjU1NjAzMDExWiIsIlNlcSI6OCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTQyNjI5LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcIm1tL3ZtcHJlc3N1cmUuY1wiLFxuICBcIkZpcnN0TGluZVwiOiAxMDksXG4gIFwiTGluZUNvdW50XCI6IDEwMFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgMTA5OlxcdHZvaWQgdm1wcmVzc3VyZShnZnBfdCBnZnAsIGludCBvcmRlciwgc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLCBib29sIHRyZWUsXFxuIDExMDpcXHRcXHRcXHR1bnNpZ25lZCBsb25nIHNjYW5uZWQsIHVuc2lnbmVkIGxvbmcgcmVjbGFpbWVkKVxcbiAxMTE6XFx0e1xcbiAxMTI6XFx0XFx0c3RydWN0IHZtcHJlc3N1cmUgKnZtcHI7XFxuIDExMzpcXHRcXG4gMTE0OlxcdFxcdGlmIChtZW1fY2dyb3VwX2Rpc2FibGVkKCkpXFxuIDExNTpcXHRcXHRcXHRyZXR1cm47XFxuIDExNjpcXHRcXG4gMTE3OlxcdFxcdC8qXFxuIDExODpcXHRcXHQgKiBPbmx5IHR3byBjb21iaW5hdGlvbnMgaGF2ZSBhIGNvbnN1bWVyOlxcbiAxMTk6XFx0XFx0ICogICBjZ3JvdXAgdjIgKyB0cmVlPWZhbHNlIC1cXHUwMDNlIGluLWtlcm5lbCBzb2NrZXQgcHJlc3N1cmVcXG4gMTIwOlxcdFxcdCAqICAgY2dyb3VwIHYxICsgdHJlZT10cnVlICAtXFx1MDAzZSB1c2Vyc3BhY2UgZXZlbnRmZHMgKG1lbW9yeS5wcmVzc3VyZV9sZXZlbClcXG4gMTIxOlxcdFxcdCAqIFNraXAgdGhlIG90aGVyIHR3bzogbm90aGluZyBjb25zdW1lcyB0aGUgcmVzdWx0LlxcbiAxMjI6XFx0XFx0ICovXFxuIDEyMzpcXHRcXHRpZiAoKCFjZ3JvdXBfc3Vic3lzX29uX2RmbChtZW1vcnlfY2dycF9zdWJzeXMpIFxcdTAwMjZcXHUwMDI2ICF0cmVlKSB8fFxcbiAxMjQ6XFx0XFx0ICAgIChjZ3JvdXBfc3Vic3lzX29uX2RmbChtZW1vcnlfY2dycF9zdWJzeXMpIFxcdTAwMjZcXHUwMDI2IHRyZWUpKVxcbiAxMjU6XFx0XFx0XFx0cmV0dXJuO1xcbiAxMjY6XFx0XFxuIDEyNzpcXHRcXHR2bXByID0gbWVtY2dfdG9fdm1wcmVzc3VyZShtZW1jZyk7XFxuIDEyODpcXHRcXG4gMTI5OlxcdFxcdC8qXFxuIDEzMDpcXHRcXHQgKiBIZXJlIHdlIG9ubHkgd2FudCB0byBhY2NvdW50IHByZXNzdXJlIHRoYXQgdXNlcmxhbmQgaXMgYWJsZSB0b1xcbiAxMzE6XFx0XFx0ICogaGVscCB1cyB3aXRoLiBGb3IgZXhhbXBsZSwgc3VwcG9zZSB0aGF0IERNQSB6b25lIGlzIHVuZGVyXFxuIDEzMjpcXHRcXHQgKiBwcmVzc3VyZTsgaWYgd2Ugbm90aWZ5IHVzZXJsYW5kIGFib3V0IHRoYXQga2luZCBvZiBwcmVzc3VyZSxcXG4gMTMzOlxcdFxcdCAqIHRoZW4gaXQgd2lsbCBiZSBtb3N0bHkgYSB3YXN0ZSBhcyBpdCB3aWxsIHRyaWdnZXIgdW5uZWNlc3NhcnlcXG4gMTM0OlxcdFxcdCAqIGZyZWVpbmcgb2YgbWVtb3J5IGJ5IHVzZXJsYW5kIChzaW5jZSB1c2VybGFuZCBpcyBtb3JlIGxpa2VseSB0b1xcbiAxMzU6XFx0XFx0ICogaGF2ZSBISUdITUVNL01PVkFCTEUgcGFnZXMgaW5zdGVhZCBvZiB0aGUgRE1BIGZhbGxiYWNrKS4gVGhhdFxcbiAxMzY6XFx0XFx0ICogaXMgd2h5IHdlIGluY2x1ZGUgb25seSBtb3ZhYmxlLCBoaWdobWVtIGFuZCBGUy9JTyBwYWdlcy5cXG4gMTM3OlxcdFxcdCAqIEluZGlyZWN0IHJlY2xhaW0gKGtzd2FwZCkgc2V0cyBzYy1cXHUwMDNlZ2ZwX21hc2sgdG8gR0ZQX0tFUk5FTCwgc29cXG4gMTM4OlxcdFxcdCAqIHdlIGFjY291bnQgaXQgdG9vLlxcbiAxMzk6XFx0XFx0ICovXFxuIDE0MDpcXHRcXHRpZiAoIShnZnAgXFx1MDAyNiAoX19HRlBfSElHSE1FTSB8IF9fR0ZQX01PVkFCTEUgfCBfX0dGUF9JTyB8IF9fR0ZQX0ZTKSkpXFxuIDE0MTpcXHRcXHRcXHRyZXR1cm47XFxuIDE0MjpcXHRcXG4gMTQzOlxcdFxcdC8qXFxuIDE0NDpcXHRcXHQgKiBJZiB3ZSBnb3QgaGVyZSB3aXRoIG5vIHBhZ2VzIHNjYW5uZWQsIHRoZW4gdGhhdCBpcyBhbiBpbmRpY2F0b3JcXG4gMTQ1OlxcdFxcdCAqIHRoYXQgcmVjbGFpbWVyIHdhcyB1bmFibGUgdG8gZmluZCBhbnkgc2hyaW5rYWJsZSBMUlVzIGF0IHRoZVxcbiAxNDY6XFx0XFx0ICogY3VycmVudCBzY2FubmluZyBkZXB0aC4gQnV0IGl0IGRvZXMgbm90IG1lYW4gdGhhdCB3ZSBzaG91bGRcXG4gMTQ3OlxcdFxcdCAqIHJlcG9ydCB0aGUgY3JpdGljYWwgcHJlc3N1cmUsIHlldC4gSWYgdGhlIHNjYW5uaW5nIHByaW9yaXR5XFxuIDE0ODpcXHRcXHQgKiAoc2Nhbm5pbmcgZGVwdGgpIGdvZXMgdG9vIGhpZ2ggKGRlZXApLCB3ZSB3aWxsIGJlIG5vdGlmaWVkXFxuIDE0OTpcXHRcXHQgKiB0aHJvdWdoIHZtcHJlc3N1cmVfcHJpbygpLiBCdXQgc28gZmFyLCBrZWVwIGNhbG0uXFxuIDE1MDpcXHRcXHQgKi9cXG4gMTUxOlxcdFxcdGlmICghc2Nhbm5lZClcXG4gMTUyOlxcdFxcdFxcdHJldHVybjtcXG4gMTUzOlxcdFxcbiAxNTQ6XFx0XFx0aWYgKHRyZWUpIHtcXG4gMTU1OlxcdFxcdFxcdHZtcHJlc3N1cmVfdjFfYWNjb3VudF90cmVlKHZtcHIsIHNjYW5uZWQsIHJlY2xhaW1lZCk7XFxuIDE1NjpcXHRcXHR9IGVsc2Uge1xcbiAxNTc6XFx0XFx0XFx0ZW51bSB2bXByZXNzdXJlX2xldmVscyBsZXZlbDtcXG4gMTU4OlxcdFxcbiAxNTk6XFx0XFx0XFx0LyogRm9yIG5vdywgbm8gdXNlcnMgZm9yIHJvb3QtbGV2ZWwgZWZmaWNpZW5jeSAqL1xcbiAxNjA6XFx0XFx0XFx0aWYgKCFtZW1jZyB8fCBtZW1fY2dyb3VwX2lzX3Jvb3QobWVtY2cpKVxcbiAxNjE6XFx0XFx0XFx0XFx0cmV0dXJuO1xcbiAxNjI6XFx0XFxuIDE2MzpcXHRcXHRcXHRzcGluX2xvY2soXFx1MDAyNnZtcHItXFx1MDAzZXNyX2xvY2spO1xcbiAxNjQ6XFx0XFx0XFx0c2Nhbm5lZCA9IHZtcHItXFx1MDAzZXNjYW5uZWQgKz0gc2Nhbm5lZDtcXG4gMTY1OlxcdFxcdFxcdHJlY2xhaW1lZCA9IHZtcHItXFx1MDAzZXJlY2xhaW1lZCArPSByZWNsYWltZWQ7XFxuIDE2NjpcXHRcXHRcXHRpZiAoc2Nhbm5lZCBcXHUwMDNjIHZtcHJlc3N1cmVfd2luKSB7XFxuIDE2NzpcXHRcXHRcXHRcXHRzcGluX3VubG9jayhcXHUwMDI2dm1wci1cXHUwMDNlc3JfbG9jayk7XFxuIDE2ODpcXHRcXHRcXHRcXHRyZXR1cm47XFxuIDE2OTpcXHRcXHRcXHR9XFxuIDE3MDpcXHRcXHRcXHR2bXByLVxcdTAwM2VzY2FubmVkID0gdm1wci1cXHUwMDNlcmVjbGFpbWVkID0gMDtcXG4gMTcxOlxcdFxcdFxcdHNwaW5fdW5sb2NrKFxcdTAwMjZ2bXByLVxcdTAwM2Vzcl9sb2NrKTtcXG4gMTcyOlxcdFxcbiAxNzM6XFx0XFx0XFx0bGV2ZWwgPSB2bXByZXNzdXJlX2NhbGNfbGV2ZWwoc2Nhbm5lZCwgcmVjbGFpbWVkKTtcXG4gMTc0OlxcdFxcbiAxNzU6XFx0XFx0XFx0LypcXG4gMTc2OlxcdFxcdFxcdCAqIE9uY2Ugd2UgZ28gYWJvdmUgQ09TVExZX09SREVSLCByZWNsYWltIHJlbGllcyBoZWF2aWx5IG9uXFxuIDE3NzpcXHRcXHRcXHQgKiBjb21wYWN0aW9uIHRvIG1ha2UgcHJvZ3Jlc3MuIFJlY2xhaW0gZWZmaWNpZW5jeSB3YXMgbmV2ZXIgYVxcbiAxNzg6XFx0XFx0XFx0ICogZ3JlYXQgcHJveHkgZm9yIHByZXNzdXJlIHRvIGJlZ2luIHdpdGgsIGJ1dCBpdCdzIG91dHJpZ2h0XFxuIDE3OTpcXHRcXHRcXHQgKiBtaXNsZWFkaW5nIHdpdGggdGhlc2UgaGlnaCBvcmRlcnMuIERvbid0IHRocm90dGxlIHNvY2tldHNcXG4gMTgwOlxcdFxcdFxcdCAqIGJlY2F1c2Ugc29tZWJvZHkgaXMgYXR0ZW1wdGluZyBzb21ldGhpbmcgY3JhenkgbGlrZSBhbiBvcmRlci03XFxuIDE4MTpcXHRcXHRcXHQgKiBhbmQgcHJlZGljdGFibHkgc3RydWdnbGluZy5cXG4gMTgyOlxcdFxcdFxcdCAqL1xcbiAxODM6XFx0XFx0XFx0aWYgKGxldmVsIFxcdTAwM2UgVk1QUkVTU1VSRV9MT1cgXFx1MDAyNlxcdTAwMjYgb3JkZXIgXFx1MDAzYz0gUEFHRV9BTExPQ19DT1NUTFlfT1JERVIpIHtcXG4gMTg0OlxcdFxcdFxcdFxcdC8qXFxuIDE4NTpcXHRcXHRcXHRcXHQgKiBMZXQgdGhlIHNvY2tldCBidWZmZXIgYWxsb2NhdG9yIGtub3cgdGhhdFxcbiAxODY6XFx0XFx0XFx0XFx0ICogd2UgYXJlIGhhdmluZyB0cm91YmxlIHJlY2xhaW1pbmcgTFJVIHBhZ2VzLlxcbiAxODc6XFx0XFx0XFx0XFx0ICpcXG4gMTg4OlxcdFxcdFxcdFxcdCAqIEZvciBoeXN0ZXJlc2lzIGtlZXAgdGhlIHByZXNzdXJlIHN0YXRlXFxuIDE4OTpcXHRcXHRcXHRcXHQgKiBhc3NlcnRlZCBmb3IgYSBzZWNvbmQgaW4gd2hpY2ggc3Vic2VxdWVudFxcbiAxOTA6XFx0XFx0XFx0XFx0ICogcHJlc3N1cmUgZXZlbnRzIGNhbiBvY2N1ci5cXG4gMTkxOlxcdFxcdFxcdFxcdCAqL1xcbiAxOTI6XFx0XFx0XFx0XFx0bWVtX2Nncm91cF9zZXRfc29ja2V0X3ByZXNzdXJlKG1lbWNnKTtcXG4gMTkzOlxcdFxcdFxcdH1cXG4gMTk0OlxcdFxcdH1cXG4gMTk1OlxcdH1cXG4gMTk2OlxcdFxcbiAxOTc6XFx0LyoqXFxuIDE5ODpcXHQgKiB2bXByZXNzdXJlX2luaXQoKSAtIEluaXRpYWxpemUgdm1wcmVzc3VyZSBjb250cm9sIHN0cnVjdHVyZVxcbiAxOTk6XFx0ICogQHZtcHI6XFx0U3RydWN0dXJlIHRvIGJlIGluaXRpYWxpemVkXFxuIDIwMDpcXHQgKlxcbiAyMDE6XFx0ICogVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIG9uIGV2ZXJ5IGFsbG9jYXRlZCB2bXByZXNzdXJlIHN0cnVjdHVyZVxcbiAyMDI6XFx0ICogYmVmb3JlIGFueSB1c2FnZS5cXG4gMjAzOlxcdCAqL1xcbiAyMDQ6XFx0dm9pZCB2bXByZXNzdXJlX2luaXQoc3RydWN0IHZtcHJlc3N1cmUgKnZtcHIpXFxuIDIwNTpcXHR7XFxuIDIwNjpcXHRcXHRzcGluX2xvY2tfaW5pdChcXHUwMDI2dm1wci1cXHUwMDNlc3JfbG9jayk7XFxuIDIwNzpcXHRcXHR2bXByZXNzdXJlX3YxX2luaXQodm1wcik7XFxuIDIwODpcXHR9XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA2LTI5VDE0OjM0OjQyLjI1NTc0Nzc2MloiLCJTZXEiOjksIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjEyMTEzNzMwMzI3LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyB0aGUgdm1wcmVzc3VyZSBPcHRpbWl6YXRpb24qKlxuXG5Pa2F5LCBzbyBJJ20gbG9va2luZyBhdCB0aGlzIGNoYW5nZSB0byB0aGUgYHZtcHJlc3N1cmVgIGZ1bmN0aW9uLCB3aGljaCBnZXRzIGNhbGxlZCBmcm9tIHBsYWNlcyBsaWtlIGBzaHJpbmtfbm9kZV9tZW1jZ3NgLiBUaGUgcGF0Y2ggaXMgdHdlYWtpbmcgdGhpcyBlYXJseSByZXR1cm4gY29uZGl0aW9uOlxuXG5gYGBjXG5cdGlmICgoIWNncm91cF9zdWJzeXNfb25fZGZsKG1lbW9yeV9jZ3JwX3N1YnN5cykgXHUwMDI2XHUwMDI2ICF0cmVlKSB8fFxuXHQgICAgKGNncm91cF9zdWJzeXNfb25fZGZsKG1lbW9yeV9jZ3JwX3N1YnN5cykgXHUwMDI2XHUwMDI2IHRyZWUpKVxuXHRcdHJldHVybjtcbmBgYFxuXG5Fc3NlbnRpYWxseSwgdGhlIGxvZ2ljIG5vdyBhdm9pZHMgZG9pbmcgd29yayBpZiB3ZSdyZSBpbiBjZ3JvdXAgdjIgKGBjZ3JvdXBfc3Vic3lzX29uX2RmbGAgaXMgdHJ1ZSkgKmFuZCogdGhlIGB0cmVlYCB2YXJpYWJsZSBpcyBhbHNvIHRydWUuIFByZXZpb3VzbHksIGl0IHdvdWxkIG9ubHkgc2hvcnQtY2lyY3VpdCBpZiB3ZSB3ZXJlbid0IGluIHYyIGFuZCBgdHJlZWAgd2FzIGFsc28gZmFsc2UuIFRoaXMgaXMgZGVmaW5pdGVseSBhICpmdW5jdGlvbmFsKiBjaGFuZ2UgYmVjYXVzZSBpdCBhbHRlcnMgdGhlIGV4ZWN1dGlvbiBwYXRoLlxuXG5UaGUgb2xkIGNvZGUsIGluIHRoaXMgdjIgYW5kIGB0cmVlPXRydWVgIHNjZW5hcmlvLCB3b3VsZCBjb250aW51ZSwgaW5jcmVtZW50IGNvdW50ZXJzIHVuZGVyIGEgc3BpbmxvY2sgKGB2bXByLVx1MDAzZXNyX2xvY2tgKSwgYW5kIHNjaGVkdWxlIHNvbWUgd29yay4gVGhpcyB3b3JrLCBob3dldmVyLCB1bHRpbWF0ZWx5IHdvdWxkIGRvIG5vdGhpbmcgYmVjYXVzZSBgdm1wcmVzc3VyZV9yZWdpc3Rlcl9ldmVudGAgaXMgbmV2ZXIgY2FsbGVkIHVuZGVyIGNncm91cCB2Mi4gU28gdGhpcyBvcHRpbWl6YXRpb24gc2tpcHMgdGhlIGxvY2ssIHRoZSBjb3VudGVyIHVwZGF0ZXMsIGFuZCB0aGUgcG9pbnRsZXNzIHdvcmsgc2NoZWR1bGluZy4gSXQncyByZWFsbHkganVzdCBhdm9pZGluZyBhbiBvdmVyaGVhZC5cblxuVGhlIGJpZyBxdWVzdGlvbiBpcyB3aGV0aGVyIHRoaXMgaXMgd29ydGggZnV6emluZy4gSXQncyBhIHJlbGF0aXZlbHkgbWlub3Igb3B0aW1pemF0aW9uIGluIHRlcm1zIG9mIGltcGFjdCwgYnV0IHRoZSBjaGFuZ2UgKmFsc28qIG1vdmVzIHRoZSBjb2RlIHRvIGEgbmV3IGZpbGUsIHdoaWNoIGlzIGEgc3RydWN0dXJhbCBjaGFuZ2UsIGFuZCB0aGF0J3Mgc29tZXRoaW5nIEkgbmVlZCB0byBjb25zaWRlciB0b28uXG5cbklmIEkgd2VyZSB0byBzYXkgXCJXb3J0aEZ1enppbmc9dHJ1ZSxcIiB0aGVuIEknZCBiZSBsb29raW5nIGF0IGB2bXByZXNzdXJlYCwgYHZtcHJlc3N1cmVfdjFfYWNjb3VudF90cmVlYCwgYHZtcHJlc3N1cmVfcmVnaXN0ZXJfZXZlbnRgLCBgdm1wcmVzc3VyZV91bnJlZ2lzdGVyX2V2ZW50YCwgYW5kIGB2bXByZXNzdXJlX3ByaW9gLiBUaGUgcmVsZXZhbnQgY29uZmlndXJhdGlvbnMgYXJlIGBNRU1DR19WMWAgYW5kIGBNRU1DR2AuXG5cbk5vdywgSSBzaG91bGQgY2hlY2sgdGhhdCBgdm1wcmVzc3VyZV92MV9hY2NvdW50X3RyZWVgICppcyogYWN0dWFsbHkgcmVhY2hhYmxlLiBZZXMsIGlmIGBDT05GSUdfTUVNQ0dfVjFgIGlzIGVuYWJsZWQgYW5kIHdlJ3JlICphY3R1YWxseSogb24gY2dyb3VwIHYxLCB0aGVuIGB2bXByZXNzdXJlYCB3aWxsIGNvcnJlY3RseSBjYWxsIGB2bXByZXNzdXJlX3YxX2FjY291bnRfdHJlZWAuIFdoYXQgYWJvdXQgYHZtcHJlc3N1cmVfcmVnaXN0ZXJfZXZlbnRgPyBMZXQgbWUgc2VlLiBBaCwgeWVzLCBpdCdzIGNhbGxlZCBmcm9tIGBtZW1fY2dyb3VwX3VzYWdlX3JlZ2lzdGVyX2V2ZW50YCBhbmQgc2ltaWxhciBpbiBgbW0vbWVtY29udHJvbC12MS5jYC4gR29vZCwgbGV0IG1lIGp1c3QgdmVyaWZ5IHRoYXQuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjIwOTY4LCJPdXRwdXRUb2tlbnMiOjIyLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NjI5LCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDYtMjlUMTQ6MzQ6NTQuMzY5NDgxMDg4WiIsIlNlcSI6MTAsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyNDY5NzMxNTMxLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcInZtcHJlc3N1cmVfcmVnaXN0ZXJfZXZlbnRcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiaW5jbHVkZS9saW51eC92bXByZXNzdXJlLmg9NTk9ZXh0ZXJuIHZvaWQgdm1wcmVzc3VyZV9wcmlvKGdmcF90IGdmcCwgc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLCBpbnQgcHJpbyk7XFxuaW5jbHVkZS9saW51eC92bXByZXNzdXJlLmg6NjA6ZXh0ZXJuIGludCB2bXByZXNzdXJlX3JlZ2lzdGVyX2V2ZW50KHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZyxcXG5pbmNsdWRlL2xpbnV4L3ZtcHJlc3N1cmUuaC02MS1cXHRcXHRcXHRcXHQgICAgIHN0cnVjdCBldmVudGZkX2N0eCAqZXZlbnRmZCxcXG4tLVxcbm1tL21lbWNvbnRyb2wtdjEuYz0xMDk1PXN0YXRpYyBzc2l6ZV90IG1lbWNnX3dyaXRlX2V2ZW50X2NvbnRyb2woc3RydWN0IGtlcm5mc19vcGVuX2ZpbGUgKm9mLFxcbi0tXFxubW0vbWVtY29udHJvbC12MS5jLTExOTEtXFx0XFx0XFx0ICAgICBcXFwiaWYgeW91IGRlcGVuZCBvbiB0aGlzIGZ1bmN0aW9uYWxpdHkuXFxcXG5cXFwiKTtcXG5tbS9tZW1jb250cm9sLXYxLmM6MTE5MjpcXHRcXHRldmVudC1cXHUwMDNlcmVnaXN0ZXJfZXZlbnQgPSB2bXByZXNzdXJlX3JlZ2lzdGVyX2V2ZW50O1xcbm1tL21lbWNvbnRyb2wtdjEuYy0xMTkzLVxcdFxcdGV2ZW50LVxcdTAwM2V1bnJlZ2lzdGVyX2V2ZW50ID0gdm1wcmVzc3VyZV91bnJlZ2lzdGVyX2V2ZW50O1xcbi0tXFxubW0vdm1wcmVzc3VyZS12MS5jPTE5MD12b2lkIHZtcHJlc3N1cmVfcHJpbyhnZnBfdCBnZnAsIHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZywgaW50IHByaW8pXFxuLS1cXG5tbS92bXByZXNzdXJlLXYxLmMtMjExLS8qKlxcbm1tL3ZtcHJlc3N1cmUtdjEuYzoyMTI6ICogdm1wcmVzc3VyZV9yZWdpc3Rlcl9ldmVudCgpIC0gQmluZCB2bXByZXNzdXJlIG5vdGlmaWNhdGlvbnMgdG8gYW4gZXZlbnRmZFxcbm1tL3ZtcHJlc3N1cmUtdjEuYy0yMTMtICogQG1lbWNnOlxcdG1lbWNnIHRoYXQgaXMgaW50ZXJlc3RlZCBpbiB2bXByZXNzdXJlIG5vdGlmaWNhdGlvbnNcXG4tLVxcbm1tL3ZtcHJlc3N1cmUtdjEuYy0yMjgtICovXFxubW0vdm1wcmVzc3VyZS12MS5jOjIyOTppbnQgdm1wcmVzc3VyZV9yZWdpc3Rlcl9ldmVudChzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csXFxubW0vdm1wcmVzc3VyZS12MS5jLTIzMC1cXHRcXHRcXHQgICAgICBzdHJ1Y3QgZXZlbnRmZF9jdHggKmV2ZW50ZmQsIGNvbnN0IGNoYXIgKmFyZ3MpXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA2LTI5VDE0OjM0OjU2LjgzOTIxOTUxOVoiLCJTZXEiOjExLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjoxNDM1MzczNDA3OSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXNpcyBvZiB0aGUgUGF0Y2ggZm9yIEZ1enppbmcgV29ydGhpbmVzcyoqXG5cbk9rYXksIHNvIEknbSBsb29raW5nIGF0IHRoaXMgcGF0Y2ggYW5kIG15IGluaXRpYWwgdGhvdWdodCBpcywgeWVzLCBgdm1wcmVzc3VyZV9yZWdpc3Rlcl9ldmVudGAgaXMgZGVmaW5pdGVseSB1c2VkIHdpdGhpbiBgbWVtY2dfd3JpdGVfZXZlbnRfY29udHJvbGAsIHdoaWNoIG1lYW5zIHRoaXMgaXMgYWJzb2x1dGVseSBjb3JlIGtlcm5lbCBsb2dpYyB0aGF0J3MgcmVhY2hhYmxlLiBUaGUgcGF0Y2ggaXMgZG9pbmcgYSByZWZhY3RvciBhbmQgaW50cm9kdWNpbmcgYW4gb3B0aW1pemF0aW9uOyBJIHRoaW5rIHRoaXMgbG9va3MgcHJldHR5IGdvb2QuIE15IGZpcnN0IGluY2xpbmF0aW9uIGlzIHRvIHNldCBgV29ydGhGdXp6aW5nPXRydWVgLlxuXG5Ob3csIGxldCBtZSBtYWtlIHN1cmUgSSdtIGNhcHR1cmluZyBhbGwgdGhlIHJlbGV2YW50IHN5bWJvbHMuIEknbGwgam90IGRvd246IGB2bXByZXNzdXJlYCwgYHZtcHJlc3N1cmVfdjFfYWNjb3VudF90cmVlYCwgYHZtcHJlc3N1cmVfcmVnaXN0ZXJfZXZlbnRgLCBgdm1wcmVzc3VyZV91bnJlZ2lzdGVyX2V2ZW50YCwgYW5kIGB2bXByZXNzdXJlX3ByaW9gLiBGb3IgdGhlIGNvbmZpZ3MsIEkgbmVlZCB0byBtYWtlIHN1cmUgSSBpbmNsdWRlIGBNRU1DR2AsIGFzIHRoYXQncyBlc3NlbnRpYWwgZm9yIGB2bXByZXNzdXJlYCB0byBldmVuIGNvbXBpbGUuIEFsc28sIGl0IGxvb2tzIGxpa2UgYE1FTUNHX1YxYCBpcyB0aGUgbmV3IGNvbmZpZyBndWFyZGluZyB0aGUgdjEtc3BlY2lmaWMgY29kZS4gTGV0IG1lIHF1aWNrbHkgZG91YmxlLWNoZWNrIHRoZSBgS2NvbmZpZ2AgdG8gYmUgc3VyZSB0aGF0IGBNRU1DR19WMWAgaXNuJ3QgZW5hYmxlZCBieSBkZWZhdWx0LiBBaCwgeWVzLCBpdCdzIGV4cGxpY2l0bHkgYSBib29sZWFuLiBTbywgYm90aCBgTUVNQ0dgIGFuZCBgTUVNQ0dfVjFgIHdpbGwgZ28gaW50byBteSBgRW5hYmxlQ29uZmlnc2AuXG5cbk5vdywgSSBuZWVkIHRvIHJlbWluZCBteXNlbGYgd2hhdCB0aGUgcHJvbXB0IHNhaWQgcmVnYXJkaW5nIGBXb3J0aEZ1enppbmc9ZmFsc2VgLiBJdCB3YXMgc29tZXRoaW5nIGFsb25nIHRoZSBsaW5lcyBvZiBcIm1vZGlmaWNhdGlvbnMgdG8gZG9jdW1lbnRhdGlvbiwgS2NvbmZpZywgY29kZSBjb21tZW50czsgZGVjb3JhdGl2ZSBjaGFuZ2VzIGxpa2UgbG9nZ2luZzsgY2hhbmdlcyB0byBjb25zdGFudHMvbWFjcm9zIHRoYXQgZG9uJ3QgYWx0ZXIgZXhlY3V0aW9uOyBhbmQgdW5yZWFjaGFibGUgY29kZSBwYXRocy5cIlxuXG5CdXQgdGhpcyBwYXRjaCAqaXMqIGFsdGVyaW5nIGV4ZWN1dGlvbiBmbG93IHdpdGggYW4gb3B0aW1pemF0aW9uISBJdCBhbHNvIGluY2x1ZGVzIHN0cnVjdHVyYWwgY2hhbmdlcyBieSBtb3ZpbmcgY29kZSB0byBhIG5ldyBmaWxlLiBUaGUgcXVlc3Rpb24gaXMgd2hldGhlciBpdCdzICpwdXJlbHkqIHJlZmFjdG9yaW5nLCBidXQgdGhhdCdzIG5vdCB0aGUgY2FzZS4gVGhlIGZ1bmN0aW9uYWwgY2hhbmdlIGluIGB2bXByZXNzdXJlYCBpcyB0aGUga2V5LiBUaGUgb3B0aW1pemF0aW9uIGluIGB2bXByZXNzdXJlYCBpcyB0aGUgZnVuY3Rpb25hbCBjaGFuZ2UsIGNvbWJpbmVkIHdpdGggdGhlIGZhY3QgdGhhdCBpdCBleHRyYWN0cyBgdm1wcmVzc3VyZS12MS5jYCwgYnV0IGFsc28gaW50cm9kdWNlcyBhIG5ldyBjb25maWcgYENPTkZJR19NRU1DR19WMWAgdGhhdCBjYW4gYmUgZGlzYWJsZWQgdG8gcmVtb3ZlIHRoZSBjb2RlLiBUaGVyZWZvcmUsIGl0J3MgYSBmdW5jdGlvbmFsIGNoYW5nZSB0aGF0IGFsdGVycyBob3cgdGhlIGNvcmUgbWVtb3J5IG1hbmFnZW1lbnQgbG9naWMgd29ya3MuIFRoZSBwcm9tcHQgc2F5cyB0aGF0IGlmIHRoZSBwYXRjaCBtb2RpZmllcyByZWFjaGFibGUgY29yZSBrZXJuZWwgbG9naWMgYW5kIGFsdGVycyBleGVjdXRpb24sIEkgc2hvdWxkIHJldHVybiBgV29ydGhGdXp6aW5nPXRydWVgLlxuXG5Ib2xkIG9uLiBUaGUgcHJvbXB0ICpkb2VzKiBzYXkgXCJSZXR1cm4gV29ydGhGdXp6aW5nPWZhbHNlIGlmIHRoZSBwYXRjaCBvbmx5IGNvbnRhaW5zIC4uLlwiLiBJdCBkb2Vzbid0IGV4cGxpY2l0bHkgdGFsayBhYm91dCByZWZhY3RvcmluZywgYnV0IHR5cGljYWxseSByZWZhY3RvcmluZyBhbG9uZSB3aXRob3V0IGEgZnVuY3Rpb25hbCBjaGFuZ2Ugd291bGRuJ3QgYmUgd29ydGggZnV6emluZywgYXMgaXQncyBqdXN0IGNvZGUgcmVvcmdhbml6YXRpb24uIEJ1dCB0aGlzIHBhdGNoICpkb2VzKiBpbnRyb2R1Y2UgYSBmdW5jdGlvbmFsIGNoYW5nZTpcblxuYGBgY1xuXHRpZiAoKCFjZ3JvdXBfc3Vic3lzX29uX2RmbChtZW1vcnlfY2dycF9zdWJzeXMpIFx1MDAyNlx1MDAyNiAhdHJlZSkgfHxcblx0ICAgIChjZ3JvdXBfc3Vic3lzX29uX2RmbChtZW1vcnlfY2dycF9zdWJzeXMpIFx1MDAyNlx1MDAyNiB0cmVlKSlcblx0XHRyZXR1cm47XG5gYGBcblxuVGhpcyBjaGFuZ2VzIHRoZSBiZWhhdmlvciBpbiBjZ3JvdXAgdjIgd2hlbiBgdHJlZT10cnVlYC4gSXQgbm93IHJldHVybnMgZWFybHkgaW5zdGVhZCBvZiBhY2N1bXVsYXRpbmcgY291bnRlcnMgYW5kIHNjaGVkdWxpbmcgd29yayBpdGVtcy4gU28sIHRoaXMgaXMgZGVmaW5pdGVseSBhIGZ1bmN0aW9uYWwgY2hhbmdlLlxuXG5MZXQgbWUgbWFrZSB0aGlzIHJlYWxseSBjbGVhci4gVGhlIHBhdGNoIHNwbGl0cyBjZ3JvdXAgdjEncyBgdm1wcmVzc3VyZWAgY29kZSBpbnRvIGEgc2VwYXJhdGUgZmlsZSAoYG1tL3ZtcHJlc3N1cmUtdjEuY2ApIGd1YXJkZWQgYnkgYENPTkZJR19NRU1DR19WMWAuIEl0ICphbHNvKiBoYXMgYSBmdW5jdGlvbmFsIG9wdGltaXphdGlvbiBpbiBgdm1wcmVzc3VyZSgpYC4gVGhpcyBlYXJseSBleGl0IG9wdGltaXphdGlvbiBhdm9pZHMgdW5uZWNlc3NhcnkgY291bnRlciBhY2N1bXVsYXRpb24gYW5kIHdvcmsgc2NoZWR1bGluZy4gVGhpcyBtb2RpZmljYXRpb24gYWZmZWN0cyByZWFjaGFibGUgY29yZSBtZW1vcnkgbWFuYWdlbWVudCBsb2dpYyBhbmQgYWx0ZXJzIGV4ZWN1dGlvbiBmbG93LCBzbyBJJ20gY29uZmlkZW50IHRoYXQgaXQgaXMgd29ydGggZnV6emluZy4gSSdsbCBzdGlsbCBpbmNsdWRlIHRoZSBmb2N1cyBzeW1ib2xzIGFuZCB0aGUgZW5hYmxpbmcgY29uZmlndXJhdGlvbnMuXG5cbkZvY3VzIFN5bWJvbHM6XG4tIGB2bXByZXNzdXJlYFxuLSBgdm1wcmVzc3VyZV92MV9hY2NvdW50X3RyZWVgXG4tIGB2bXByZXNzdXJlX3JlZ2lzdGVyX2V2ZW50YFxuLSBgdm1wcmVzc3VyZV91bnJlZ2lzdGVyX2V2ZW50YFxuLSBgdm1wcmVzc3VyZV9wcmlvYFxuLSBgdm1wcmVzc3VyZV93b3JrX2ZuYFxuLSBgdm1wcmVzc3VyZV9ldmVudGBcblxuRW5hYmxlQ29uZmlnczpcbi0gYE1FTUNHYFxuLSBgTUVNQ0dfVjFgXG5cbkp1c3QgdG8gbWFrZSBzdXJlIEknbSB0aG9yb3VnaCwgbGV0IG1lIG5vdGUgdGhhdCBgdm1wcmVzc3VyZV93b3JrX2ZuYCBpcyBtb3ZlZCB0byBgbW0vdm1wcmVzc3VyZS12MS5jYCBhcyBpcyBgdm1wcmVzc3VyZV9ldmVudGAgYW5kIGB2bXByZXNzdXJlX2NhbGNfbGV2ZWxgIGlzIG5vdyBleHBvc2VkLiBgdm1wcmVzc3VyZV92MV9pbml0YCBhbmQgYHZtcHJlc3N1cmVfdjFfY2xlYW51cGAgYXJlIG5ldy4gRXZlbiB0aG91Z2ggYHZtcHJlc3N1cmVfd29ya19mbmAgYW5kIGB2bXByZXNzdXJlX2V2ZW50YCBhcmUgc3RhdGljXG5cbiIsIklucHV0VG9rZW5zIjoyMjY3NSwiT3V0cHV0VG9rZW5zIjoyMiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjExMzcsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDYtMjlUMTQ6MzU6MTEuMTkyOTU1Njg4WiIsIlNlcSI6MTIsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyNDkxNzgxMTQ5LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcInZtcHJlc3N1cmVfd29ya19mblwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJtbS92bXByZXNzdXJlLXYxLmM9ODM9c3RhdGljIGJvb2wgdm1wcmVzc3VyZV9ldmVudChzdHJ1Y3Qgdm1wcmVzc3VyZSAqdm1wcixcXG4tLVxcbm1tL3ZtcHJlc3N1cmUtdjEuYy0xMDUtXFxubW0vdm1wcmVzc3VyZS12MS5jOjEwNjpzdGF0aWMgdm9pZCB2bXByZXNzdXJlX3dvcmtfZm4oc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKVxcbm1tL3ZtcHJlc3N1cmUtdjEuYy0xMDcte1xcbi0tXFxubW0vdm1wcmVzc3VyZS12MS5jPTE2Mz12b2lkIHZtcHJlc3N1cmVfdjFfaW5pdChzdHJ1Y3Qgdm1wcmVzc3VyZSAqdm1wcilcXG4tLVxcbm1tL3ZtcHJlc3N1cmUtdjEuYy0xNjYtXFx0SU5JVF9MSVNUX0hFQUQoXFx1MDAyNnZtcHItXFx1MDAzZWV2ZW50cyk7XFxubW0vdm1wcmVzc3VyZS12MS5jOjE2NzpcXHRJTklUX1dPUksoXFx1MDAyNnZtcHItXFx1MDAzZXdvcmssIHZtcHJlc3N1cmVfd29ya19mbik7XFxubW0vdm1wcmVzc3VyZS12MS5jLTE2OC19XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA2LTI5VDE0OjM1OjEzLjY4NDc0NjA3N1oiLCJTZXEiOjEzLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo4NTc3MzY5MDY5LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKlJlZmluaW5nIHRoZSBWTVByZXNzdXJlIExvZ2ljKipcblxuT2theSwgc28gSSd2ZSBjb25maXJtZWQgdGhhdCB0aG9zZSBzeW1ib2xzIGFyZSBpbmRlZWQgc3RhdGljLiBUaGF0IG1lYW5zIEkgbmVlZCB0byBpbmNsdWRlIGB2bXByZXNzdXJlX3dvcmtfZm5gIGFuZCBgdm1wcmVzc3VyZV9ldmVudGAgaW4gRm9jdXNTeW1ib2xzLiBFeHBhbmRpbmcgbXkgZm9jdXMsIEknbGwgdXBkYXRlIHRoYXQgbGlzdDpcblxuKiAgIGB2bXByZXNzdXJlYFxuKiAgIGB2bXByZXNzdXJlX3YxX2FjY291bnRfdHJlZWBcbiogICBgdm1wcmVzc3VyZV93b3JrX2ZuYFxuKiAgIGB2bXByZXNzdXJlX2V2ZW50YFxuKiAgIGB2bXByZXNzdXJlX3JlZ2lzdGVyX2V2ZW50YFxuKiAgIGB2bXByZXNzdXJlX3VucmVnaXN0ZXJfZXZlbnRgXG4qICAgYHZtcHJlc3N1cmVfcHJpb2BcblxuTm93LCBsZXQncyBicmVhayBkb3duIHRoZSByZWFzb25pbmcgYmVoaW5kIHRoaXMuIFRoZSBwYXRjaCBpcyBjbGVhcmx5IGRvaW5nIHNvbWUgdGFyZ2V0ZWQgcmVmYWN0b3JpbmcuIEl0J3MgbW92aW5nIHRoZSBjZ3JvdXAgdjEgc3BlY2lmaWMgYHZtcHJlc3N1cmVgIGNvZGUgaW50byBpdHMgb3duIGZpbGUsIGBtbS92bXByZXNzdXJlLXYxLmNgLCBhbmQgdGhhdCdzIGd1YXJkZWQgYnkgdGhlIGBDT05GSUdfTUVNQ0dfVjFgIGZsYWcuIFNtYXJ0LiBJdCdzIGFsc28gb3B0aW1pemluZyB0aGUgYHZtcHJlc3N1cmUoKWAgZnVuY3Rpb24gaXRzZWxmLCBzcGVjaWZpY2FsbHkgZm9yIGNncm91cCB2MiB3aGVuIGEgYHRyZWU9dHJ1ZWAgc2NlbmFyaW8uIFRoYXQncyBhIGdvb2QgcGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uLCBza2lwcGluZyB1bm5lY2Vzc2FyeSBjb3VudGVyIGFjY3VtdWxhdGlvbiBhbmQgd29yayBzY2hlZHVsaW5nLiBUaGlzIHRvdWNoZXMgY29yZSBtZW1vcnkgbWFuYWdlbWVudCBsb2dpYyBhbmQsIGNyaXRpY2FsbHksIGFsdGVycyB0aGUgZXhlY3V0aW9uIGZsb3cgb2YgdGhlIHJlbGF0ZWQgZnVuY3Rpb25zLiBUaGF0IHNpZ25hbHMgYSBuZWVkIGZvciBmdXp6aW5nLiBHaXZlbiB0aGUgbW9kaWZpY2F0aW9uIHRvIHJlYWNoYWJsZSBjb2RlLCBhbmQgdGhlIGFsdGVyaW5nIG9mIHRoZSBjb2RlIHBhdGggYmFzZWQgb24gYHRyZWU9dHJ1ZWAsIGl0J3MgZnV6eiB0aW1lLlxuXG5BbHJpZ2h0LCBJJ2xsIGNhbGwgYHNldC1yZXN1bHRzYCBub3cuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjI1MDk5LCJPdXRwdXRUb2tlbnMiOjIxMSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjIzMiwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wNi0yOVQxNDozNToyMi4yNjIxMTgwNDZaIiwiU2VxIjoxNCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoic2V0LXJlc3VsdHMiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMzQ5ODkyMDgsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIk1FTUNHXCIsXG4gICAgXCJNRU1DR19WMVwiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcInZtcHJlc3N1cmVcIixcbiAgICBcInZtcHJlc3N1cmVfdjFfYWNjb3VudF90cmVlXCIsXG4gICAgXCJ2bXByZXNzdXJlX3dvcmtfZm5cIixcbiAgICBcInZtcHJlc3N1cmVfZXZlbnRcIixcbiAgICBcInZtcHJlc3N1cmVfcmVnaXN0ZXJfZXZlbnRcIixcbiAgICBcInZtcHJlc3N1cmVfdW5yZWdpc3Rlcl9ldmVudFwiLFxuICAgIFwidm1wcmVzc3VyZV9wcmlvXCJcbiAgXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggZXh0cmFjdHMgY2dyb3VwIHYxIHNwZWNpZmljIHZtcHJlc3N1cmUgbG9naWMgaW50byBhIG5ldyBmaWxlIGBtbS92bXByZXNzdXJlLXYxLmNgIGd1YXJkZWQgYnkgYENPTkZJR19NRU1DR19WMWAuIEl0IGFsc28gaW50cm9kdWNlcyBhIGZ1bmN0aW9uYWwgb3B0aW1pemF0aW9uIGluIGB2bXByZXNzdXJlKClgIHRvIHJldHVybiBlYXJseSBmb3IgY2dyb3VwIHYyIHdoZW4gYHRyZWU9dHJ1ZWAsIGF2b2lkaW5nIHVubmVjZXNzYXJ5IGNvdW50ZXIgYWNjdW11bGF0aW9uIGFuZCB3b3JrIHNjaGVkdWxpbmcuIFRoaXMgbW9kaWZpZXMgcmVhY2hhYmxlIGNvcmUgbWVtb3J5IG1hbmFnZW1lbnQgbG9naWMgYW5kIGFsdGVycyBleGVjdXRpb24gZmxvdywgc28gaXQgc2hvdWxkIGJlIGZ1enplZC5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJNRU1DR1wiLFxuICAgIFwiTUVNQ0dfVjFcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJ2bXByZXNzdXJlXCIsXG4gICAgXCJ2bXByZXNzdXJlX3YxX2FjY291bnRfdHJlZVwiLFxuICAgIFwidm1wcmVzc3VyZV93b3JrX2ZuXCIsXG4gICAgXCJ2bXByZXNzdXJlX2V2ZW50XCIsXG4gICAgXCJ2bXByZXNzdXJlX3JlZ2lzdGVyX2V2ZW50XCIsXG4gICAgXCJ2bXByZXNzdXJlX3VucmVnaXN0ZXJfZXZlbnRcIixcbiAgICBcInZtcHJlc3N1cmVfcHJpb1wiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGV4dHJhY3RzIGNncm91cCB2MSBzcGVjaWZpYyB2bXByZXNzdXJlIGxvZ2ljIGludG8gYSBuZXcgZmlsZSBgbW0vdm1wcmVzc3VyZS12MS5jYCBndWFyZGVkIGJ5IGBDT05GSUdfTUVNQ0dfVjFgLiBJdCBhbHNvIGludHJvZHVjZXMgYSBmdW5jdGlvbmFsIG9wdGltaXphdGlvbiBpbiBgdm1wcmVzc3VyZSgpYCB0byByZXR1cm4gZWFybHkgZm9yIGNncm91cCB2MiB3aGVuIGB0cmVlPXRydWVgLCBhdm9pZGluZyB1bm5lY2Vzc2FyeSBjb3VudGVyIGFjY3VtdWxhdGlvbiBhbmQgd29yayBzY2hlZHVsaW5nLiBUaGlzIG1vZGlmaWVzIHJlYWNoYWJsZSBjb3JlIG1lbW9yeSBtYW5hZ2VtZW50IGxvZ2ljIGFuZCBhbHRlcnMgZXhlY3V0aW9uIGZsb3csIHNvIGl0IHNob3VsZCBiZSBmdXp6ZWQuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfV07CgkJCWlmICghcmF3RGF0YSB8fCByYXdEYXRhLmxlbmd0aCA9PT0gMCkgcmV0dXJuOwoKCQkJZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSk7CgkJCWRyYXdEdXJhdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCQlkcmF3VG9rZW5Db25zdW1wdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSkgewoJCQljb25zdCBzdGF0cyA9IHsKCQkJCWxsbTogeyBjb3VudDogMCwgdG9rZW5zOiAwLCBkdXJhdGlvbjogMCB9LAoJCQkJdG9vbDogeyBjb3VudDogMCwgZHVyYXRpb246IDAgfQoJCQl9OwoKCQkJcmF3RGF0YS5mb3JFYWNoKHMgPT4gewoJCQkJY29uc3QgZHVyID0gcy5EdXJhdGlvbiAvIDEwMDAwMDAwMDA7IAoJCQkJaWYgKHMuVHlwZSA9PT0gImxsbSIpIHsKCQkJCQlzdGF0cy5sbG0uY291bnQrKzsKCQkJCQlzdGF0cy5sbG0udG9rZW5zICs9IChzLklucHV0VG9rZW5zICsgcy5PdXRwdXRUb2tlbnMgKyBzLk91dHB1dFRob3VnaHRzVG9rZW5zKTsKCQkJCQlzdGF0cy5sbG0uZHVyYXRpb24gKz0gZHVyOwoJCQkJfSBlbHNlIGlmIChzLlR5cGUgPT09ICJ0b29sIikgewoJCQkJCXN0YXRzLnRvb2wuY291bnQrKzsKCQkJCQlzdGF0cy50b29sLmR1cmF0aW9uICs9IGR1cjsKCQkJCX0KCQkJfSk7CgoJCQljb25zdCBhdmdMbG1EdXIgPSBzdGF0cy5sbG0uY291bnQgPiAwID8gKHN0YXRzLmxsbS5kdXJhdGlvbiAvIHN0YXRzLmxsbS5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgkJCWNvbnN0IGF2Z0xsbVRva2VuID0gc3RhdHMubGxtLmNvdW50ID4gMCA/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-workflowxpg5z[0].run-triage(0) Phase: Succeeded StartedAt: 2026-06-29 14:21:15 +0000 UTC FinishedAt: 2026-06-29 14:35:24 +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": "88cefc306c43b58d9bb65c9e96e284306710d961", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "MEMCG", "MEMCG_V1" ], "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": "88cefc306c43b58d9bb65c9e96e284306710d961", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "MEMCG", "MEMCG_V1" ], "series_id": "8823cc7f-37ff-4d09-afb4-62cac89b759d" }, "track": "KASAN", "fuzz": { "focus": null, "focus_symbols": [ "vmpressure", "vmpressure_v1_account_tree", "vmpressure_work_fn", "vmpressure_event", "vmpressure_register_event", "vmpressure_unregister_event", "vmpressure_prio" ], "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+CgkJCTx0ZD4yMDI2LzA2LzI5IDE0OjMzPC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MW08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O01FTUNHJiMzNDssCiAgICAmIzM0O01FTUNHX1YxJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7dm1wcmVzc3VyZSYjMzQ7LAogICAgJiMzNDt2bXByZXNzdXJlX3YxX2FjY291bnRfdHJlZSYjMzQ7LAogICAgJiMzNDt2bXByZXNzdXJlX3dvcmtfZm4mIzM0OywKICAgICYjMzQ7dm1wcmVzc3VyZV9ldmVudCYjMzQ7LAogICAgJiMzNDt2bXByZXNzdXJlX3JlZ2lzdGVyX2V2ZW50JiMzNDssCiAgICAmIzM0O3ZtcHJlc3N1cmVfdW5yZWdpc3Rlcl9ldmVudCYjMzQ7LAogICAgJiMzNDt2bXByZXNzdXJlX3ByaW8mIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggZXh0cmFjdHMgY2dyb3VwIHYxIHNwZWNpZmljIHZtcHJlc3N1cmUgbG9naWMgaW50byBhIG5ldyBmaWxlIGBtbS92bXByZXNzdXJlLXYxLmNgIGd1YXJkZWQgYnkgYENPTkZJR19NRU1DR19WMWAuIEl0IGFsc28gaW50cm9kdWNlcyBhIGZ1bmN0aW9uYWwgb3B0aW1pemF0aW9uIGluIGB2bXByZXNzdXJlKClgIHRvIHJldHVybiBlYXJseSBmb3IgY2dyb3VwIHYyIHdoZW4gYHRyZWU9dHJ1ZWAsIGF2b2lkaW5nIHVubmVjZXNzYXJ5IGNvdW50ZXIgYWNjdW11bGF0aW9uIGFuZCB3b3JrIHNjaGVkdWxpbmcuIFRoaXMgbW9kaWZpZXMgcmVhY2hhYmxlIGNvcmUgbWVtb3J5IG1hbmFnZW1lbnQgbG9naWMgYW5kIGFsdGVycyBleGVjdXRpb24gZmxvdywgc28gaXQgc2hvdWxkIGJlIGZ1enplZC4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xLzE8L3RkPgoJCQk8dGQ+MjAyNi8wNi8yOSAxNDozMzwvdGQ+CgkJCTx0ZD5hY3Rpb248L3RkPgoJCQk8dGQ+cmVhZC1wYXRjaC1kaWZmPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7UGF0Y2hEaWZmJiMzNDs6ICYjMzQ7Y29tbWl0IGI1MTc0YWQ1ZGEyNDVmNTNmZWI3ODI0YWQ2YzEyZWU1ZmJmOWVhNDNcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgTW9uIEp1biAyOSAxNDozMzo1NSAyMDI2ICYjNDM7MDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3ZtcHJlc3N1cmUuaCBiL2luY2x1ZGUvbGludXgvdm1wcmVzc3VyZS5oXG5pbmRleCBmYWVjZDU1MjI0MDE3OS4uZTVlNmI2OGQwZGM0MzIgMTAwNjQ0XG4tLS0gYS9pbmNsdWRlL2xpbnV4L3ZtcHJlc3N1cmUuaFxuJiM0MzsmIzQzOyYjNDM7IGIvaW5jbHVkZS9saW51eC92bXByZXNzdXJlLmhcbkBAIC0xMywxOCAmIzQzOzEzLDMxIEBAXG4gc3RydWN0IHZtcHJlc3N1cmUge1xuIFx0dW5zaWduZWQgbG9uZyBzY2FubmVkO1xuIFx0dW5zaWduZWQgbG9uZyByZWNsYWltZWQ7XG4mIzQzO1x0LyogVGhlIGxvY2sgaXMgdXNlZCB0byBrZWVwIHRoZSBzY2FubmVkL3JlY2xhaW1lZCBpbiBzeW5jLiAqL1xuJiM0MztcdHNwaW5sb2NrX3Qgc3JfbG9jaztcbiBcbiYjNDM7I2lmZGVmIENPTkZJR19NRU1DR19WMVxuJiM0MztcdC8qXG4mIzQzO1x0ICogdHJlZT10cnVlIGFjY3VtdWxhdG9ycyBmZWVkIHRoZSB2MSB1c2Vyc3BhY2UgZXZlbnRmZCBpbnRlcmZhY2VcbiYjNDM7XHQgKiAobWVtb3J5LnByZXNzdXJlX2xldmVsKS4gRHJhaW5lZCBieSBAd29yay4gdjIgaGFzIG5vIGVxdWl2YWxlbnRcbiYjNDM7XHQgKiBpbnRlcmZhY2UsIHNvIHRoaXMgc3RhdGUgaXMgb21pdHRlZCBvbiBDT05GSUdfTUVNQ0dfVjE9biBidWlsZHMuXG4mIzQzO1x0ICovXG4gXHR1bnNpZ25lZCBsb25nIHRyZWVfc2Nhbm5lZDtcbiBcdHVuc2lnbmVkIGxvbmcgdHJlZV9yZWNsYWltZWQ7XG4tXHQvKiBUaGUgbG9jayBpcyB1c2VkIHRvIGtlZXAgdGhlIHNjYW5uZWQvcmVjbGFpbWVkIGFib3ZlIGluIHN5bmMuICovXG4tXHRzcGlubG9ja190IHNyX2xvY2s7XG4tXG4gXHQvKiBUaGUgbGlzdCBvZiB2bXByZXNzdXJlX2V2ZW50IHN0cnVjdHMuICovXG4gXHRzdHJ1Y3QgbGlzdF9oZWFkIGV2ZW50cztcbiBcdC8qIEhhdmUgdG8gZ3JhYiB0aGUgbG9jayBvbiBldmVudHMgdHJhdmVyc2FsIG9yIG1vZGlmaWNhdGlvbnMuICovXG4gXHRzdHJ1Y3QgbXV0ZXggZXZlbnRzX2xvY2s7XG4gXG4gXHRzdHJ1Y3Qgd29ya19zdHJ1Y3Qgd29yaztcbiYjNDM7I2VuZGlmXG4mIzQzO307XG4mIzQzO1xuJiM0MztlbnVtIHZtcHJlc3N1cmVfbGV2ZWxzIHtcbiYjNDM7XHRWTVBSRVNTVVJFX0xPVyA9IDAsXG4mIzQzO1x0Vk1QUkVTU1VSRV9NRURJVU0sXG4mIzQzO1x0Vk1QUkVTU1VSRV9DUklUSUNBTCxcbiYjNDM7XHRWTVBSRVNTVVJFX05VTV9MRVZFTFMsXG4gfTtcbiBcbiBzdHJ1Y3QgbWVtX2Nncm91cDtcbkBAIC0zMiwxOCAmIzQzOzQ1LDQxIEBAIHN0cnVjdCBtZW1fY2dyb3VwO1xuICNpZmRlZiBDT05GSUdfTUVNQ0dcbiB2b2lkIHZtcHJlc3N1cmUoZ2ZwX3QgZ2ZwLCBpbnQgb3JkZXIsIHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZywgYm9vbCB0cmVlLFxuIFx0XHR1bnNpZ25lZCBsb25nIHNjYW5uZWQsIHVuc2lnbmVkIGxvbmcgcmVjbGFpbWVkKTtcbi1leHRlcm4gdm9pZCB2bXByZXNzdXJlX3ByaW8oZ2ZwX3QgZ2ZwLCBzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csIGludCBwcmlvKTtcbi1cbiBleHRlcm4gdm9pZCB2bXByZXNzdXJlX2luaXQoc3RydWN0IHZtcHJlc3N1cmUgKnZtcHIpO1xuIGV4dGVybiB2b2lkIHZtcHJlc3N1cmVfY2xlYW51cChzdHJ1Y3Qgdm1wcmVzc3VyZSAqdm1wcik7XG4gZXh0ZXJuIHN0cnVjdCB2bXByZXNzdXJlICptZW1jZ190b192bXByZXNzdXJlKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZyk7XG4gZXh0ZXJuIHN0cnVjdCBtZW1fY2dyb3VwICp2bXByZXNzdXJlX3RvX21lbWNnKHN0cnVjdCB2bXByZXNzdXJlICp2bXByKTtcbiYjNDM7XG4mIzQzOy8qIFNoYXJlZCB3aXRoIG1tL3ZtcHJlc3N1cmUtdjEuYy4gKi9cbiYjNDM7ZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGxvbmcgdm1wcmVzc3VyZV93aW47XG4mIzQzO2V4dGVybiBlbnVtIHZtcHJlc3N1cmVfbGV2ZWxzIHZtcHJlc3N1cmVfY2FsY19sZXZlbCh1bnNpZ25lZCBsb25nIHNjYW5uZWQsXG4mIzQzO1x0XHRcdFx0XHRcdCAgICB1bnNpZ25lZCBsb25nIHJlY2xhaW1lZCk7XG4mIzQzO1xuJiM0MzsjaWZkZWYgQ09ORklHX01FTUNHX1YxXG4mIzQzO2V4dGVybiB2b2lkIHZtcHJlc3N1cmVfcHJpbyhnZnBfdCBnZnAsIHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZywgaW50IHByaW8pO1xuIGV4dGVybiBpbnQgdm1wcmVzc3VyZV9yZWdpc3Rlcl9ldmVudChzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csXG4gXHRcdFx0XHQgICAgIHN0cnVjdCBldmVudGZkX2N0eCAqZXZlbnRmZCxcbiBcdFx0XHRcdCAgICAgY29uc3QgY2hhciAqYXJncyk7XG4gZXh0ZXJuIHZvaWQgdm1wcmVzc3VyZV91bnJlZ2lzdGVyX2V2ZW50KHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZyxcbiBcdFx0XHRcdFx0c3RydWN0IGV2ZW50ZmRfY3R4ICpldmVudGZkKTtcbiYjNDM7XG4mIzQzOy8qIHYxIGhvb2tzIGNhbGxlZCBmcm9tIG1tL3ZtcHJlc3N1cmUuYzsgbm8tb3BzIGJlbG93IHdoZW4gIU1FTUNHX1YxLiAqL1xuJiM0MztleHRlcm4gdm9pZCB2bXByZXNzdXJlX3YxX2luaXQoc3RydWN0IHZtcHJlc3N1cmUgKnZtcHIpO1xuJiM0MztleHRlcm4gdm9pZCB2bXByZXNzdXJlX3YxX2NsZWFudXAoc3RydWN0IHZtcHJlc3N1cmUgKnZtcHIpO1xuJiM0MztleHRlcm4gdm9pZCB2bXByZXNzdXJlX3YxX2FjY291bnRfdHJlZShzdHJ1Y3Qgdm1wcmVzc3VyZSAqdm1wcixcbiYjNDM7XHRcdFx0XHQgICAgICAgdW5zaWduZWQgbG9uZyBzY2FubmVkLFxuJiM0MztcdFx0XHRcdCAgICAgICB1bnNpZ25lZCBsb25nIHJlY2xhaW1lZCk7XG4gI2Vsc2VcbiYjNDM7c3RhdGljIGlubGluZSB2b2lkIHZtcHJlc3N1cmVfcHJpbyhnZnBfdCBnZnAsIHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZyxcbiYjNDM7XHRcdFx0XHQgICBpbnQgcHJpbykge31cbiYjNDM7c3RhdGljIGlubGluZSB2b2lkIHZtcHJlc3N1cmVfdjFfaW5pdChzdHJ1Y3Qgdm1wcmVzc3VyZSAqdm1wcikge31cbiYjNDM7c3RhdGljIGlubGluZSB2b2lkIHZtcHJlc3N1cmVfdjFfY2xlYW51cChzdHJ1Y3Qgdm1wcmVzc3VyZSAqdm1wcikge31cbiYjNDM7c3RhdGljIGlubGluZSB2b2lkIHZtcHJlc3N1cmVfdjFfYWNjb3VudF90cmVlKHN0cnVjdCB2bXByZXNzdXJlICp2bXByLFxuJiM0MztcdFx0XHRcdFx0ICAgICAgdW5zaWduZWQgbG9uZyBzY2FubmVkLFxuJiM0MztcdFx0XHRcdFx0ICAgICAgdW5zaWduZWQgbG9uZyByZWNsYWltZWQpIHt9XG4mIzQzOyNlbmRpZiAvKiBDT05GSUdfTUVNQ0dfVjEgKi9cbiYjNDM7XG4mIzQzOyNlbHNlIC8qICFDT05GSUdfTUVNQ0cgKi9cbiBzdGF0aWMgaW5saW5lIHZvaWQgdm1wcmVzc3VyZShnZnBfdCBnZnAsIGludCBvcmRlciwgc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLFxuIFx0XHRcdCAgICAgIGJvb2wgdHJlZSwgdW5zaWduZWQgbG9uZyBzY2FubmVkLFxuIFx0XHRcdCAgICAgIHVuc2lnbmVkIGxvbmcgcmVjbGFpbWVkKSB7fVxuZGlmZiAtLWdpdCBhL21tL01ha2VmaWxlIGIvbW0vTWFrZWZpbGVcbmluZGV4IDRmYzcxMzg2N2I5YmQ4Li5kZTk5MTYzMGM5NmEzMiAxMDA2NDRcbi0tLSBhL21tL01ha2VmaWxlXG4mIzQzOyYjNDM7JiM0MzsgYi9tbS9NYWtlZmlsZVxuQEAgLTEwMSw3ICYjNDM7MTAxLDcgQEAgb2JqLSQoQ09ORklHX0RFVklDRV9NSUdSQVRJT04pICYjNDM7PSBtaWdyYXRlX2RldmljZS5vXG4gb2JqLSQoQ09ORklHX1RSQU5TUEFSRU5UX0hVR0VQQUdFKSAmIzQzOz0gaHVnZV9tZW1vcnkubyBraHVnZXBhZ2VkLm9cbiBvYmotJChDT05GSUdfUEFHRV9DT1VOVEVSKSAmIzQzOz0gcGFnZV9jb3VudGVyLm9cbiBvYmotJChDT05GSUdfTElWRVVQREFURV9NRU1GRCkgJiM0Mzs9IG1lbWZkX2x1by5vXG4tb2JqLSQoQ09ORklHX01FTUNHX1YxKSAmIzQzOz0gbWVtY29udHJvbC12MS5vXG4mIzQzO29iai0kKENPTkZJR19NRU1DR19WMSkgJiM0Mzs9IG1lbWNvbnRyb2wtdjEubyB2bXByZXNzdXJlLXYxLm9cbiBvYmotJChDT05GSUdfTUVNQ0cpICYjNDM7PSBtZW1jb250cm9sLm8gdm1wcmVzc3VyZS5vXG4gaWZkZWYgQ09ORklHX0JQRl9TWVNDQUxMXG4gb2JqLSQoQ09ORklHX01FTUNHKSAmIzQzOz0gYnBmX21lbWNvbnRyb2wub1xuZGlmZiAtLWdpdCBhL21tL3ZtcHJlc3N1cmUtdjEuYyBiL21tL3ZtcHJlc3N1cmUtdjEuY1xubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAwLi5mZDgxM2NiYTA1NDQ3MFxuLS0tIC9kZXYvbnVsbFxuJiM0MzsmIzQzOyYjNDM7IGIvbW0vdm1wcmVzc3VyZS12MS5jXG5AQCAtMCwwICYjNDM7MSwzMDUgQEBcbiYjNDM7Ly8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb25seVxuJiM0MzsvKlxuJiM0MzsgKiBjZ3JvdXAgdjEgdXNlcnNwYWNlIHZtcHJlc3N1cmUgaW50ZXJmYWNlIChtZW1vcnkucHJlc3N1cmVfbGV2ZWwgL1xuJiM0MzsgKiBjZ3JvdXAuZXZlbnRfY29udHJvbCkuIFNwbGl0IG91dCBvZiBtbS92bXByZXNzdXJlLmMgc28gdGhhdCB2Mi1vbmx5XG4mIzQzOyAqIGtlcm5lbHMgKENPTkZJR19NRU1DR19WMT1uKSBkcm9wIHRoZSB3aG9sZSBldmVudGZkIGFjY3VtdWxhdG9yLFxuJiM0MzsgKiBpdHMgd29yayBpdGVtLCBhbmQgdGhlIHBlci1tZW1jZyBzdGF0ZSBpdCByZXF1aXJlcy5cbiYjNDM7ICovXG4mIzQzO1xuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9jZ3JvdXAuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9ldmVudGZkLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjbGludXgvbGlzdC5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L2xvZzIuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9tZW1jb250cm9sLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjbGludXgvbXV0ZXguaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9zbGFiLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjbGludXgvc3RyaW5nLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjbGludXgvc3dhcC5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L3ZtcHJlc3N1cmUuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC93b3JrcXVldWUuaFx1MDAzZVxuJiM0MztcbiYjNDM7LypcbiYjNDM7ICogV2hlbiB0aGVyZSBhcmUgdG9vIGxpdHRsZSBwYWdlcyBsZWZ0IHRvIHNjYW4sIHZtcHJlc3N1cmUoKSBtYXkgbWlzcyB0aGVcbiYjNDM7ICogY3JpdGljYWwgcHJlc3N1cmUgYXMgbnVtYmVyIG9mIHBhZ2VzIHdpbGwgYmUgbGVzcyB0aGFuIFwmIzM0O3dpbmRvdyBzaXplXCYjMzQ7LlxuJiM0MzsgKiBIb3dldmVyLCBpbiB0aGF0IGNhc2UgdGhlIHZtc2NhbiBwcmlvcml0eSB3aWxsIHJhaXNlIGZhc3QgYXMgdGhlXG4mIzQzOyAqIHJlY2xhaW1lciB3aWxsIHRyeSB0byBzY2FuIExSVXMgbW9yZSBkZWVwbHkuXG4mIzQzOyAqXG4mIzQzOyAqIFRoZSB2bXNjYW4gbG9naWMgY29uc2lkZXJzIHRoZXNlIHNwZWNpYWwgcHJpb3JpdGllczpcbiYjNDM7ICpcbiYjNDM7ICogcHJpbyA9PSBERUZfUFJJT1JJVFkgKDEyKTogcmVjbGFpbWVyIHN0YXJ0cyB3aXRoIHRoYXQgdmFsdWVcbiYjNDM7ICogcHJpbyBcdTAwM2M9IERFRl9QUklPUklUWSAtIDIgOiBrc3dhcGQgYmVjb21lcyBzb21ld2hhdCBvdmVyd2hlbG1lZFxuJiM0MzsgKiBwcmlvID09IDAgICAgICAgICAgICAgICAgOiBjbG9zZSB0byBPT00sIGtlcm5lbCBzY2FucyBldmVyeSBwYWdlIGluIGFuIGxydVxuJiM0MzsgKlxuJiM0MzsgKiBBbnkgdmFsdWUgaW4gdGhpcyByYW5nZSBpcyBhY2NlcHRhYmxlIGZvciB0aGlzIHR1bmFibGUgKGkuZS4gZnJvbSAxMiB0b1xuJiM0MzsgKiAwKS4gQ3VycmVudCB2YWx1ZSBmb3IgdGhlIHZtcHJlc3N1cmVfbGV2ZWxfY3JpdGljYWxfcHJpbyBpcyBjaG9zZW5cbiYjNDM7ICogZW1waXJpY2FsbHksIGJ1dCB0aGUgbnVtYmVyLCBpbiBlc3NlbmNlLCBtZWFucyB0aGF0IHdlIGNvbnNpZGVyXG4mIzQzOyAqIGNyaXRpY2FsIGxldmVsIHdoZW4gc2Nhbm5pbmcgZGVwdGggaXMgfjEwJSBvZiB0aGUgbHJ1IHNpemUgKHZtc2NhblxuJiM0MzsgKiBzY2FucyAmIzM5O2xydV9zaXplIFx1MDAzZVx1MDAzZSBwcmlvJiMzOTsgcGFnZXMsIHNvIGl0IGlzIGFjdHVhbGx5IDEyLjUlLCBvciBvbmVcbiYjNDM7ICogZWlnaHRzKS5cbiYjNDM7ICovXG4mIzQzO3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgdm1wcmVzc3VyZV9sZXZlbF9jcml0aWNhbF9wcmlvID0gaWxvZzIoMTAwIC8gMTApO1xuJiM0MztcbiYjNDM7ZW51bSB2bXByZXNzdXJlX21vZGVzIHtcbiYjNDM7XHRWTVBSRVNTVVJFX05PX1BBU1NUSFJPVUdIID0gMCxcbiYjNDM7XHRWTVBSRVNTVVJFX0hJRVJBUkNIWSxcbiYjNDM7XHRWTVBSRVNTVVJFX0xPQ0FMLFxuJiM0MztcdFZNUFJFU1NVUkVfTlVNX01PREVTLFxuJiM0Mzt9O1xuJiM0MztcbiYjNDM7c3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB2bXByZXNzdXJlX3N0cl9sZXZlbHNbXSA9IHtcbiYjNDM7XHRbVk1QUkVTU1VSRV9MT1ddID0gXCYjMzQ7bG93XCYjMzQ7LFxuJiM0MztcdFtWTVBSRVNTVVJFX01FRElVTV0gPSBcJiMzNDttZWRpdW1cJiMzNDssXG4mIzQzO1x0W1ZNUFJFU1NVUkVfQ1JJVElDQUxdID0gXCYjMzQ7Y3JpdGljYWxcJiMzNDssXG4mIzQzO307XG4mIzQzO1xuJiM0MztzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHZtcHJlc3N1cmVfc3RyX21vZGVzW10gPSB7XG4mIzQzO1x0W1ZNUFJFU1NVUkVfTk9fUEFTU1RIUk9VR0hdID0gXCYjMzQ7ZGVmYXVsdFwmIzM0OyxcbiYjNDM7XHRbVk1QUkVTU1VSRV9ISUVSQVJDSFldID0gXCYjMzQ7aGllcmFyY2h5XCYjMzQ7LFxuJiM0MztcdFtWTVBSRVNTVVJFX0xPQ0FMXSA9IFwmIzM0O2xvY2FsXCYjMzQ7LFxuJiM0Mzt9O1xuJiM0MztcbiYjNDM7c3RydWN0IHZtcHJlc3N1cmVfZXZlbnQge1xuJiM0MztcdHN0cnVjdCBldmVudGZkX2N0eCAqZWZkO1xuJiM0MztcdGVudW0gdm1wcmVzc3VyZV9sZXZlbHMgbGV2ZWw7XG4mIzQzO1x0ZW51bSB2bXByZXNzdXJlX21vZGVzIG1vZGU7XG4mIzQzO1x0c3RydWN0IGxpc3RfaGVhZCBub2RlO1xuJiM0Mzt9O1xuJiM0MztcbiYjNDM7c3RhdGljIHN0cnVjdCB2bXByZXNzdXJlICp3b3JrX3RvX3ZtcHJlc3N1cmUoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKVxuJiM0Mzt7XG4mIzQzO1x0cmV0dXJuIGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3Qgdm1wcmVzc3VyZSwgd29yayk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBzdHJ1Y3Qgdm1wcmVzc3VyZSAqdm1wcmVzc3VyZV9wYXJlbnQoc3RydWN0IHZtcHJlc3N1cmUgKnZtcHIpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2cgPSB2bXByZXNzdXJlX3RvX21lbWNnKHZtcHIpO1xuJiM0MztcbiYjNDM7XHRtZW1jZyA9IHBhcmVudF9tZW1fY2dyb3VwKG1lbWNnKTtcbiYjNDM7XHRpZiAoIW1lbWNnKVxuJiM0MztcdFx0cmV0dXJuIE5VTEw7XG4mIzQzO1x0cmV0dXJuIG1lbWNnX3RvX3ZtcHJlc3N1cmUobWVtY2cpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgYm9vbCB2bXByZXNzdXJlX2V2ZW50KHN0cnVjdCB2bXByZXNzdXJlICp2bXByLFxuJiM0MztcdFx0XHQgICAgIGNvbnN0IGVudW0gdm1wcmVzc3VyZV9sZXZlbHMgbGV2ZWwsXG4mIzQzO1x0XHRcdCAgICAgYm9vbCBhbmNlc3RvciwgYm9vbCBzaWduYWxsZWQpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3Qgdm1wcmVzc3VyZV9ldmVudCAqZXY7XG4mIzQzO1x0Ym9vbCByZXQgPSBmYWxzZTtcbiYjNDM7XG4mIzQzO1x0bXV0ZXhfbG9jayhcdTAwMjZ2bXByLVx1MDAzZWV2ZW50c19sb2NrKTtcbiYjNDM7XHRsaXN0X2Zvcl9lYWNoX2VudHJ5KGV2LCBcdTAwMjZ2bXByLVx1MDAzZWV2ZW50cywgbm9kZSkge1xuJiM0MztcdFx0aWYgKGFuY2VzdG9yIFx1MDAyNlx1MDAyNiBldi1cdTAwM2Vtb2RlID09IFZNUFJFU1NVUkVfTE9DQUwpXG4mIzQzO1x0XHRcdGNvbnRpbnVlO1xuJiM0MztcdFx0aWYgKHNpZ25hbGxlZCBcdTAwMjZcdTAwMjYgZXYtXHUwMDNlbW9kZSA9PSBWTVBSRVNTVVJFX05PX1BBU1NUSFJPVUdIKVxuJiM0MztcdFx0XHRjb250aW51ZTtcbiYjNDM7XHRcdGlmIChsZXZlbCBcdTAwM2MgZXYtXHUwMDNlbGV2ZWwpXG4mIzQzO1x0XHRcdGNvbnRpbnVlO1xuJiM0MztcdFx0ZXZlbnRmZF9zaWduYWwoZXYtXHUwMDNlZWZkKTtcbiYjNDM7XHRcdHJldCA9IHRydWU7XG4mIzQzO1x0fVxuJiM0MztcdG11dGV4X3VubG9jayhcdTAwMjZ2bXByLVx1MDAzZWV2ZW50c19sb2NrKTtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIHJldDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIHZvaWQgdm1wcmVzc3VyZV93b3JrX2ZuKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaylcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCB2bXByZXNzdXJlICp2bXByID0gd29ya190b192bXByZXNzdXJlKHdvcmspO1xuJiM0MztcdHVuc2lnbmVkIGxvbmcgc2Nhbm5lZDtcbiYjNDM7XHR1bnNpZ25lZCBsb25nIHJlY2xhaW1lZDtcbiYjNDM7XHRlbnVtIHZtcHJlc3N1cmVfbGV2ZWxzIGxldmVsO1xuJiM0MztcdGJvb2wgYW5jZXN0b3IgPSBmYWxzZTtcbiYjNDM7XHRib29sIHNpZ25hbGxlZCA9IGZhbHNlO1xuJiM0MztcbiYjNDM7XHRzcGluX2xvY2soXHUwMDI2dm1wci1cdTAwM2Vzcl9sb2NrKTtcbiYjNDM7XHQvKlxuJiM0MztcdCAqIFNldmVyYWwgY29udGV4dHMgbWlnaHQgYmUgY2FsbGluZyB2bXByZXNzdXJlKCksIHNvIGl0IGlzXG4mIzQzO1x0ICogcG9zc2libGUgdGhhdCB0aGUgd29yayB3YXMgcmVzY2hlZHVsZWQgYWdhaW4gYmVmb3JlIHRoZSBvbGRcbiYjNDM7XHQgKiB3b3JrIGNvbnRleHQgY2xlYXJlZCB0aGUgY291bnRlcnMuIEluIHRoYXQgY2FzZSB3ZSB3aWxsIHJ1blxuJiM0MztcdCAqIGp1c3QgYWZ0ZXIgdGhlIG9sZCB3b3JrIHJldHVybnMsIGJ1dCB0aGVuIHNjYW5uZWQgbWlnaHQgYmUgemVyb1xuJiM0MztcdCAqIGhlcmUuIE5vIG5lZWQgZm9yIGFueSBsb2NrcyBoZXJlIHNpbmNlIHdlIGRvbiYjMzk7dCBjYXJlIGlmXG4mIzQzO1x0ICogdm1wci1cdTAwM2VyZWNsYWltZWQgaXMgaW4gc3luYy5cbiYjNDM7XHQgKi9cbiYjNDM7XHRzY2FubmVkID0gdm1wci1cdTAwM2V0cmVlX3NjYW5uZWQ7XG4mIzQzO1x0aWYgKCFzY2FubmVkKSB7XG4mIzQzO1x0XHRzcGluX3VubG9jayhcdTAwMjZ2bXByLVx1MDAzZXNyX2xvY2spO1xuJiM0MztcdFx0cmV0dXJuO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0cmVjbGFpbWVkID0gdm1wci1cdTAwM2V0cmVlX3JlY2xhaW1lZDtcbiYjNDM7XHR2bXByLVx1MDAzZXRyZWVfc2Nhbm5lZCA9IDA7XG4mIzQzO1x0dm1wci1cdTAwM2V0cmVlX3JlY2xhaW1lZCA9IDA7XG4mIzQzO1x0c3Bpbl91bmxvY2soXHUwMDI2dm1wci1cdTAwM2Vzcl9sb2NrKTtcbiYjNDM7XG4mIzQzO1x0bGV2ZWwgPSB2bXByZXNzdXJlX2NhbGNfbGV2ZWwoc2Nhbm5lZCwgcmVjbGFpbWVkKTtcbiYjNDM7XG4mIzQzO1x0ZG8ge1xuJiM0MztcdFx0aWYgKHZtcHJlc3N1cmVfZXZlbnQodm1wciwgbGV2ZWwsIGFuY2VzdG9yLCBzaWduYWxsZWQpKVxuJiM0MztcdFx0XHRzaWduYWxsZWQgPSB0cnVlO1xuJiM0MztcdFx0YW5jZXN0b3IgPSB0cnVlO1xuJiM0MztcdH0gd2hpbGUgKCh2bXByID0gdm1wcmVzc3VyZV9wYXJlbnQodm1wcikpKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LypcbiYjNDM7ICogVHJlZS1tb2RlIGFjY3VtdWxhdG9yOiBhY2N1bXVsYXRlIHBlci1tZW1jZyBzY2FubmVkL3JlY2xhaW1lZCBhbmRcbiYjNDM7ICogc2NoZWR1bGUgdGhlIHdvcmsgdGhhdCB3YWxrcyB0aGUgcGFyZW50IGNoYWluIGFuZCBzaWduYWxzIHJlZ2lzdGVyZWRcbiYjNDM7ICogZXZlbnRmZCBsaXN0ZW5lcnMgb25jZSB3ZSBjcm9zcyB0aGUgd2luZG93IHRocmVzaG9sZC5cbiYjNDM7ICovXG4mIzQzO3ZvaWQgdm1wcmVzc3VyZV92MV9hY2NvdW50X3RyZWUoc3RydWN0IHZtcHJlc3N1cmUgKnZtcHIsXG4mIzQzO1x0XHRcdFx0dW5zaWduZWQgbG9uZyBzY2FubmVkLFxuJiM0MztcdFx0XHRcdHVuc2lnbmVkIGxvbmcgcmVjbGFpbWVkKVxuJiM0Mzt7XG4mIzQzO1x0c3Bpbl9sb2NrKFx1MDAyNnZtcHItXHUwMDNlc3JfbG9jayk7XG4mIzQzO1x0c2Nhbm5lZCA9IHZtcHItXHUwMDNldHJlZV9zY2FubmVkICYjNDM7PSBzY2FubmVkO1xuJiM0MztcdHZtcHItXHUwMDNldHJlZV9yZWNsYWltZWQgJiM0Mzs9IHJlY2xhaW1lZDtcbiYjNDM7XHRzcGluX3VubG9jayhcdTAwMjZ2bXByLVx1MDAzZXNyX2xvY2spO1xuJiM0MztcbiYjNDM7XHRpZiAoc2Nhbm5lZCBcdTAwM2Mgdm1wcmVzc3VyZV93aW4pXG4mIzQzO1x0XHRyZXR1cm47XG4mIzQzO1x0c2NoZWR1bGVfd29yayhcdTAwMjZ2bXByLVx1MDAzZXdvcmspO1xuJiM0Mzt9XG4mIzQzO1xuJiM0Mzt2b2lkIHZtcHJlc3N1cmVfdjFfaW5pdChzdHJ1Y3Qgdm1wcmVzc3VyZSAqdm1wcilcbiYjNDM7e1xuJiM0MztcdG11dGV4X2luaXQoXHUwMDI2dm1wci1cdTAwM2VldmVudHNfbG9jayk7XG4mIzQzO1x0SU5JVF9MSVNUX0hFQUQoXHUwMDI2dm1wci1cdTAwM2VldmVudHMpO1xuJiM0MztcdElOSVRfV09SSyhcdTAwMjZ2bXByLVx1MDAzZXdvcmssIHZtcHJlc3N1cmVfd29ya19mbik7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3ZvaWQgdm1wcmVzc3VyZV92MV9jbGVhbnVwKHN0cnVjdCB2bXByZXNzdXJlICp2bXByKVxuJiM0Mzt7XG4mIzQzO1x0LypcbiYjNDM7XHQgKiBNYWtlIHN1cmUgdGhlcmUgaXMgbm8gcGVuZGluZyB3b3JrIGJlZm9yZSBldmVudGZkIGluZnJhc3RydWN0dXJlXG4mIzQzO1x0ICogZ29lcyBhd2F5LlxuJiM0MztcdCAqL1xuJiM0MztcdGZsdXNoX3dvcmsoXHUwMDI2dm1wci1cdTAwM2V3b3JrKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LyoqXG4mIzQzOyAqIHZtcHJlc3N1cmVfcHJpbygpIC0gQWNjb3VudCBtZW1vcnkgcHJlc3N1cmUgdGhyb3VnaCByZWNsYWltZXIgcHJpb3JpdHkgbGV2ZWxcbiYjNDM7ICogQGdmcDpcdHJlY2xhaW1lciYjMzk7cyBnZnAgbWFza1xuJiM0MzsgKiBAbWVtY2c6XHRjZ3JvdXAgbWVtb3J5IGNvbnRyb2xsZXIgaGFuZGxlXG4mIzQzOyAqIEBwcmlvOlx0cmVjbGFpbWVyJiMzOTtzIHByaW9yaXR5XG4mIzQzOyAqXG4mIzQzOyAqIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBmcm9tIHRoZSByZWNsYWltIHBhdGggZXZlcnkgdGltZSB3aGVuXG4mIzQzOyAqIHRoZSB2bXNjYW4mIzM5O3MgcmVjbGFpbWluZyBwcmlvcml0eSAoc2Nhbm5pbmcgZGVwdGgpIGNoYW5nZXMuXG4mIzQzOyAqXG4mIzQzOyAqIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgcmV0dXJuIGFueSB2YWx1ZS5cbiYjNDM7ICovXG4mIzQzO3ZvaWQgdm1wcmVzc3VyZV9wcmlvKGdmcF90IGdmcCwgc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLCBpbnQgcHJpbylcbiYjNDM7e1xuJiM0MztcdC8qXG4mIzQzO1x0ICogV2Ugb25seSB1c2UgcHJpbyBmb3IgYWNjb3VudGluZyBjcml0aWNhbCBsZXZlbC4gRm9yIG1vcmUgaW5mb1xuJiM0MztcdCAqIHNlZSBjb21tZW50IGZvciB2bXByZXNzdXJlX2xldmVsX2NyaXRpY2FsX3ByaW8gdmFyaWFibGUgYWJvdmUuXG4mIzQzO1x0ICovXG4mIzQzO1x0aWYgKHByaW8gXHUwMDNlIHZtcHJlc3N1cmVfbGV2ZWxfY3JpdGljYWxfcHJpbylcbiYjNDM7XHRcdHJldHVybjtcbiYjNDM7XG4mIzQzO1x0LypcbiYjNDM7XHQgKiBPSywgdGhlIHByaW8gaXMgYmVsb3cgdGhlIHRocmVzaG9sZCwgdXBkYXRpbmcgdm1wcmVzc3VyZVxuJiM0MztcdCAqIGluZm9ybWF0aW9uIGJlZm9yZSBzaHJpbmtlciBkaXZlcyBpbnRvIGxvbmcgc2hyaW5raW5nIG9mIGxvbmdcbiYjNDM7XHQgKiByYW5nZSB2bXNjYW4uIFBhc3Npbmcgc2Nhbm5lZCA9IHZtcHJlc3N1cmVfd2luLCByZWNsYWltZWQgPSAwXG4mIzQzO1x0ICogdG8gdGhlIHZtcHJlc3N1cmUoKSBiYXNpY2FsbHkgbWVhbnMgdGhhdCB3ZSBzaWduYWwgJiMzOTtjcml0aWNhbCYjMzk7XG4mIzQzO1x0ICogbGV2ZWwuXG4mIzQzO1x0ICovXG4mIzQzO1x0dm1wcmVzc3VyZShnZnAsIDAsIG1lbWNnLCB0cnVlLCB2bXByZXNzdXJlX3dpbiwgMCk7XG4mIzQzO31cbiYjNDM7XG4mIzQzOyNkZWZpbmUgTUFYX1ZNUFJFU1NVUkVfQVJHU19MRU5cdChzdHJsZW4oXCYjMzQ7Y3JpdGljYWxcJiMzNDspICYjNDM7IHN0cmxlbihcJiMzNDtoaWVyYXJjaHlcJiMzNDspICYjNDM7IDIpXG4mIzQzO1xuJiM0MzsvKipcbiYjNDM7ICogdm1wcmVzc3VyZV9yZWdpc3Rlcl9ldmVudCgpIC0gQmluZCB2bXByZXNzdXJlIG5vdGlmaWNhdGlvbnMgdG8gYW4gZXZlbnRmZFxuJiM0MzsgKiBAbWVtY2c6XHRtZW1jZyB0aGF0IGlzIGludGVyZXN0ZWQgaW4gdm1wcmVzc3VyZSBub3RpZmljYXRpb25zXG4mIzQzOyAqIEBldmVudGZkOlx0ZXZlbnRmZCBjb250ZXh0IHRvIGxpbmsgbm90aWZpY2F0aW9ucyB3aXRoXG4mIzQzOyAqIEBhcmdzOlx0ZXZlbnQgYXJndW1lbnRzIChwcmVzc3VyZSBsZXZlbCB0aHJlc2hvbGQsIG9wdGlvbmFsIG1vZGUpXG4mIzQzOyAqXG4mIzQzOyAqIFRoaXMgZnVuY3Rpb24gYXNzb2NpYXRlcyBldmVudGZkIGNvbnRleHQgd2l0aCB0aGUgdm1wcmVzc3VyZVxuJiM0MzsgKiBpbmZyYXN0cnVjdHVyZSwgc28gdGhhdCB0aGUgbm90aWZpY2F0aW9ucyB3aWxsIGJlIGRlbGl2ZXJlZCB0byB0aGVcbiYjNDM7ICogQGV2ZW50ZmQuIFRoZSBAYXJncyBwYXJhbWV0ZXIgaXMgYSBjb21tYS1kZWxpbWl0ZWQgc3RyaW5nIHRoYXQgZGVub3RlcyBhXG4mIzQzOyAqIHByZXNzdXJlIGxldmVsIHRocmVzaG9sZCAob25lIG9mIHZtcHJlc3N1cmVfc3RyX2xldmVscywgaS5lLiBcJiMzNDtsb3dcJiMzNDssIFwmIzM0O21lZGl1bVwmIzM0OyxcbiYjNDM7ICogb3IgXCYjMzQ7Y3JpdGljYWxcJiMzNDspIGFuZCBhbiBvcHRpb25hbCBtb2RlIChvbmUgb2Ygdm1wcmVzc3VyZV9zdHJfbW9kZXMsIGkuZS5cbiYjNDM7ICogXCYjMzQ7aGllcmFyY2h5XCYjMzQ7IG9yIFwmIzM0O2xvY2FsXCYjMzQ7KS5cbiYjNDM7ICpcbiYjNDM7ICogVG8gYmUgdXNlZCBhcyBtZW1jZyBldmVudCBtZXRob2QuXG4mIzQzOyAqXG4mIzQzOyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCAtRU5PTUVNIG9uIG1lbW9yeSBmYWlsdXJlIG9yIC1FSU5WQUwgaWYgQGFyZ3MgY291bGRcbiYjNDM7ICogbm90IGJlIHBhcnNlZC5cbiYjNDM7ICovXG4mIzQzO2ludCB2bXByZXNzdXJlX3JlZ2lzdGVyX2V2ZW50KHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZyxcbiYjNDM7XHRcdFx0ICAgICAgc3RydWN0IGV2ZW50ZmRfY3R4ICpldmVudGZkLCBjb25zdCBjaGFyICphcmdzKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IHZtcHJlc3N1cmUgKnZtcHIgPSBtZW1jZ190b192bXByZXNzdXJlKG1lbWNnKTtcbiYjNDM7XHRzdHJ1Y3Qgdm1wcmVzc3VyZV9ldmVudCAqZXY7XG4mIzQzO1x0ZW51bSB2bXByZXNzdXJlX21vZGVzIG1vZGUgPSBWTVBSRVNTVVJFX05PX1BBU1NUSFJPVUdIO1xuJiM0MztcdGVudW0gdm1wcmVzc3VyZV9sZXZlbHMgbGV2ZWw7XG4mIzQzO1x0Y2hhciAqc3BlYywgKnNwZWNfb3JpZztcbiYjNDM7XHRjaGFyICp0b2tlbjtcbiYjNDM7XHRpbnQgcmV0ID0gMDtcbiYjNDM7XG4mIzQzO1x0c3BlY19vcmlnID0gc3BlYyA9IGtzdHJuZHVwKGFyZ3MsIE1BWF9WTVBSRVNTVVJFX0FSR1NfTEVOLCBHRlBfS0VSTkVMKTtcbiYjNDM7XHRpZiAoIXNwZWMpXG4mIzQzO1x0XHRyZXR1cm4gLUVOT01FTTtcbiYjNDM7XG4mIzQzO1x0LyogRmluZCByZXF1aXJlZCBsZXZlbCAqL1xuJiM0MztcdHRva2VuID0gc3Ryc2VwKFx1MDAyNnNwZWMsIFwmIzM0OyxcJiMzNDspO1xuJiM0MztcdHJldCA9IG1hdGNoX3N0cmluZyh2bXByZXNzdXJlX3N0cl9sZXZlbHMsIFZNUFJFU1NVUkVfTlVNX0xFVkVMUywgdG9rZW4pO1xuJiM0MztcdGlmIChyZXQgXHUwMDNjIDApXG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XHRsZXZlbCA9IHJldDtcbiYjNDM7XG4mIzQzO1x0LyogRmluZCBvcHRpb25hbCBtb2RlICovXG4mIzQzO1x0dG9rZW4gPSBzdHJzZXAoXHUwMDI2c3BlYywgXCYjMzQ7LFwmIzM0Oyk7XG4mIzQzO1x0aWYgKHRva2VuKSB7XG4mIzQzO1x0XHRyZXQgPSBtYXRjaF9zdHJpbmcodm1wcmVzc3VyZV9zdHJfbW9kZXMsIFZNUFJFU1NVUkVfTlVNX01PREVTLCB0b2tlbik7XG4mIzQzO1x0XHRpZiAocmV0IFx1MDAzYyAwKVxuJiM0MztcdFx0XHRnb3RvIG91dDtcbiYjNDM7XHRcdG1vZGUgPSByZXQ7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRldiA9IGt6YWxsb2Nfb2JqKCpldik7XG4mIzQzO1x0aWYgKCFldikge1xuJiM0MztcdFx0cmV0ID0gLUVOT01FTTtcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0ZXYtXHUwMDNlZWZkID0gZXZlbnRmZDtcbiYjNDM7XHRldi1cdTAwM2VsZXZlbCA9IGxldmVsO1xuJiM0MztcdGV2LVx1MDAzZW1vZGUgPSBtb2RlO1xuJiM0MztcbiYjNDM7XHRtdXRleF9sb2NrKFx1MDAyNnZtcHItXHUwMDNlZXZlbnRzX2xvY2spO1xuJiM0MztcdGxpc3RfYWRkKFx1MDAyNmV2LVx1MDAzZW5vZGUsIFx1MDAyNnZtcHItXHUwMDNlZXZlbnRzKTtcbiYjNDM7XHRtdXRleF91bmxvY2soXHUwMDI2dm1wci1cdTAwM2VldmVudHNfbG9jayk7XG4mIzQzO1x0cmV0ID0gMDtcbiYjNDM7b3V0OlxuJiM0MztcdGtmcmVlKHNwZWNfb3JpZyk7XG4mIzQzO1x0cmV0dXJuIHJldDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LyoqXG4mIzQzOyAqIHZtcHJlc3N1cmVfdW5yZWdpc3Rlcl9ldmVudCgpIC0gVW5iaW5kIGV2ZW50ZmQgZnJvbSB2bXByZXNzdXJlXG4mIzQzOyAqIEBtZW1jZzpcdG1lbWNnIGhhbmRsZVxuJiM0MzsgKiBAZXZlbnRmZDpcdGV2ZW50ZmQgY29udGV4dCB0aGF0IHdhcyB1c2VkIHRvIGxpbmsgdm1wcmVzc3VyZSB3aXRoIHRoZSBAY2dcbiYjNDM7ICpcbiYjNDM7ICogVGhpcyBmdW5jdGlvbiBkb2VzIGludGVybmFsIG1hbmlwdWxhdGlvbnMgdG8gZGV0YWNoIHRoZSBAZXZlbnRmZCBmcm9tXG4mIzQzOyAqIHRoZSB2bXByZXNzdXJlIG5vdGlmaWNhdGlvbnMsIGFuZCB0aGVuIGZyZWVzIGludGVybmFsIHJlc291cmNlc1xuJiM0MzsgKiBhc3NvY2lhdGVkIHdpdGggdGhlIEBldmVudGZkIChidXQgdGhlIEBldmVudGZkIGl0c2VsZiBpcyBub3QgZnJlZWQpLlxuJiM0MzsgKlxuJiM0MzsgKiBUbyBiZSB1c2VkIGFzIG1lbWNnIGV2ZW50IG1ldGhvZC5cbiYjNDM7ICovXG4mIzQzO3ZvaWQgdm1wcmVzc3VyZV91bnJlZ2lzdGVyX2V2ZW50KHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZyxcbiYjNDM7XHRcdFx0XHQgc3RydWN0IGV2ZW50ZmRfY3R4ICpldmVudGZkKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IHZtcHJlc3N1cmUgKnZtcHIgPSBtZW1jZ190b192bXByZXNzdXJlKG1lbWNnKTtcbiYjNDM7XHRzdHJ1Y3Qgdm1wcmVzc3VyZV9ldmVudCAqZXY7XG4mIzQzO1xuJiM0MztcdG11dGV4X2xvY2soXHUwMDI2dm1wci1cdTAwM2VldmVudHNfbG9jayk7XG4mIzQzO1x0bGlzdF9mb3JfZWFjaF9lbnRyeShldiwgXHUwMDI2dm1wci1cdTAwM2VldmVudHMsIG5vZGUpIHtcbiYjNDM7XHRcdGlmIChldi1cdTAwM2VlZmQgIT0gZXZlbnRmZClcbiYjNDM7XHRcdFx0Y29udGludWU7XG4mIzQzO1x0XHRsaXN0X2RlbChcdTAwMjZldi1cdTAwM2Vub2RlKTtcbiYjNDM7XHRcdGtmcmVlKGV2KTtcbiYjNDM7XHRcdGJyZWFrO1xuJiM0MztcdH1cbiYjNDM7XHRtdXRleF91bmxvY2soXHUwMDI2dm1wci1cdTAwM2VldmVudHNfbG9jayk7XG4mIzQzO31cbmRpZmYgLS1naXQgYS9tbS92bXByZXNzdXJlLmMgYi9tbS92bXByZXNzdXJlLmNcbmluZGV4IGYwNTM1NTRlNTgyNjQyLi5iY2ZhNGJkOGZmYzUyOSAxMDA2NDRcbi0tLSBhL21tL3ZtcHJlc3N1cmUuY1xuJiM0MzsmIzQzOyYjNDM7IGIvbW0vdm1wcmVzc3VyZS5jXG5AQCAtNywxNiAmIzQzOzcsMTUgQEBcbiAgKlxuICAqIEJhc2VkIG9uIGlkZWFzIGZyb20gQW5kcmV3IE1vcnRvbiwgRGF2aWQgUmllbnRqZXMsIEtPU0FLSSBNb3RvaGlybyxcbiAgKiBMZW9uaWQgTW9pc2VpY2h1aywgTWVsIEdvcm1hbiwgTWluY2hhbiBLaW0gYW5kIFBla2thIEVuYmVyZy5cbiYjNDM7ICpcbiYjNDM7ICogVHJlZS1tb2RlIChjZ3JvdXAgdjEgdXNlcnNwYWNlIGV2ZW50ZmQpIGJvb2trZWVwaW5nIGxpdmVzIGluXG4mIzQzOyAqIG1tL3ZtcHJlc3N1cmUtdjEuYzsgdGhpcyBmaWxlIGhvbGRzIHRoZSBzaGFyZWQgY29kZSBhbmQgdGhlIGluLWtlcm5lbFxuJiM0MzsgKiAodHJlZT1mYWxzZSkgc29ja2V0LXByZXNzdXJlIHBhdGggdGhhdCBydW5zIG9uIGNncm91cCB2Mi5cbiAgKi9cbiBcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9jZ3JvdXAuaFx1MDAzZVxuLSNpbmNsdWRlIFx1MDAzY2xpbnV4L2ZzLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9sb2cyLmhcdTAwM2Vcbi0jaW5jbHVkZSBcdTAwM2NsaW51eC9zY2hlZC5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvbW0uaFx1MDAzZVxuLSNpbmNsdWRlIFx1MDAzY2xpbnV4L3Ztc3RhdC5oXHUwMDNlXG4tI2luY2x1ZGUgXHUwMDNjbGludXgvZXZlbnRmZC5oXHUwMDNlXG4tI2luY2x1ZGUgXHUwMDNjbGludXgvc2xhYi5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvc3dhcC5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvcHJpbnRrLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC92bXByZXNzdXJlLmhcdTAwM2VcbkBAIC0zNSw3ICYjNDM7MzQsNyBAQFxuICAqIFRPRE86IE1ha2UgdGhlIHdpbmRvdyBzaXplIGRlcGVuZCBvbiBtYWNoaW5lIHNpemUsIGFzIHdlIGRvIGZvciB2bXN0YXRcbiAgKiB0aHJlc2hvbGRzLiBDdXJyZW50bHkgd2Ugc2V0IGl0IHRvIDUxMiBwYWdlcyAoMk1CIGZvciA0S0IgcGFnZXMpLlxuICAqL1xuLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIHZtcHJlc3N1cmVfd2luID0gU1dBUF9DTFVTVEVSX01BWCAqIDE2O1xuJiM0Mztjb25zdCB1bnNpZ25lZCBsb25nIHZtcHJlc3N1cmVfd2luID0gU1dBUF9DTFVTVEVSX01BWCAqIDE2O1xuIFxuIC8qXG4gICogVGhlc2UgdGhyZXNob2xkcyBhcmUgdXNlZCB3aGVuIHdlIGFjY291bnQgbWVtb3J5IHByZXNzdXJlIHRocm91Z2hcbkBAIC00Niw2OCAmIzQzOzQ1LDYgQEAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgdm1wcmVzc3VyZV93aW4gPSBTV0FQX0NMVVNURVJfTUFYICogMTY7XG4gc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCB2bXByZXNzdXJlX2xldmVsX21lZCA9IDYwO1xuIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgdm1wcmVzc3VyZV9sZXZlbF9jcml0aWNhbCA9IDk1O1xuIFxuLS8qXG4tICogV2hlbiB0aGVyZSBhcmUgdG9vIGxpdHRsZSBwYWdlcyBsZWZ0IHRvIHNjYW4sIHZtcHJlc3N1cmUoKSBtYXkgbWlzcyB0aGVcbi0gKiBjcml0aWNhbCBwcmVzc3VyZSBhcyBudW1iZXIgb2YgcGFnZXMgd2lsbCBiZSBsZXNzIHRoYW4gXCYjMzQ7d2luZG93IHNpemVcJiMzNDsuXG4tICogSG93ZXZlciwgaW4gdGhhdCBjYXNlIHRoZSB2bXNjYW4gcHJpb3JpdHkgd2lsbCByYWlzZSBmYXN0IGFzIHRoZVxuLSAqIHJlY2xhaW1lciB3aWxsIHRyeSB0byBzY2FuIExSVXMgbW9yZSBkZWVwbHkuXG4tICpcbi0gKiBUaGUgdm1zY2FuIGxvZ2ljIGNvbnNpZGVycyB0aGVzZSBzcGVjaWFsIHByaW9yaXRpZXM6XG4tICpcbi0gKiBwcmlvID09IERFRl9QUklPUklUWSAoMTIpOiByZWNsYWltZXIgc3RhcnRzIHdpdGggdGhhdCB2YWx1ZVxuLSAqIHByaW8gXHUwMDNjPSBERUZfUFJJT1JJVFkgLSAyIDoga3N3YXBkIGJlY29tZXMgc29tZXdoYXQgb3ZlcndoZWxtZWRcbi0gKiBwcmlvID09IDAgICAgICAgICAgICAgICAgOiBjbG9zZSB0byBPT00sIGtlcm5lbCBzY2FucyBldmVyeSBwYWdlIGluIGFuIGxydVxuLSAqXG4tICogQW55IHZhbHVlIGluIHRoaXMgcmFuZ2UgaXMgYWNjZXB0YWJsZSBmb3IgdGhpcyB0dW5hYmxlIChpLmUuIGZyb20gMTIgdG9cbi0gKiAwKS4gQ3VycmVudCB2YWx1ZSBmb3IgdGhlIHZtcHJlc3N1cmVfbGV2ZWxfY3JpdGljYWxfcHJpbyBpcyBjaG9zZW5cbi0gKiBlbXBpcmljYWxseSwgYnV0IHRoZSBudW1iZXIsIGluIGVzc2VuY2UsIG1lYW5zIHRoYXQgd2UgY29uc2lkZXJcbi0gKiBjcml0aWNhbCBsZXZlbCB3aGVuIHNjYW5uaW5nIGRlcHRoIGlzIH4xMCUgb2YgdGhlIGxydSBzaXplICh2bXNjYW5cbi0gKiBzY2FucyAmIzM5O2xydV9zaXplIFx1MDAzZVx1MDAzZSBwcmlvJiMzOTsgcGFnZXMsIHNvIGl0IGlzIGFjdHVhbGx5IDEyLjUlLCBvciBvbmVcbi0gKiBlaWdodHMpLlxuLSAqL1xuLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgdm1wcmVzc3VyZV9sZXZlbF9jcml0aWNhbF9wcmlvID0gaWxvZzIoMTAwIC8gMTApO1xuLVxuLXN0YXRpYyBzdHJ1Y3Qgdm1wcmVzc3VyZSAqd29ya190b192bXByZXNzdXJlKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaylcbi17XG4tXHRyZXR1cm4gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCB2bXByZXNzdXJlLCB3b3JrKTtcbi19XG4tXG4tc3RhdGljIHN0cnVjdCB2bXByZXNzdXJlICp2bXByZXNzdXJlX3BhcmVudChzdHJ1Y3Qgdm1wcmVzc3VyZSAqdm1wcilcbi17XG4tXHRzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2cgPSB2bXByZXNzdXJlX3RvX21lbWNnKHZtcHIpO1xuLVxuLVx0bWVtY2cgPSBwYXJlbnRfbWVtX2Nncm91cChtZW1jZyk7XG4tXHRpZiAoIW1lbWNnKVxuLVx0XHRyZXR1cm4gTlVMTDtcbi1cdHJldHVybiBtZW1jZ190b192bXByZXNzdXJlKG1lbWNnKTtcbi19XG4tXG4tZW51bSB2bXByZXNzdXJlX2xldmVscyB7XG4tXHRWTVBSRVNTVVJFX0xPVyA9IDAsXG4tXHRWTVBSRVNTVVJFX01FRElVTSxcbi1cdFZNUFJFU1NVUkVfQ1JJVElDQUwsXG4tXHRWTVBSRVNTVVJFX05VTV9MRVZFTFMsXG4tfTtcbi1cbi1lbnVtIHZtcHJlc3N1cmVfbW9kZXMge1xuLVx0Vk1QUkVTU1VSRV9OT19QQVNTVEhST1VHSCA9IDAsXG4tXHRWTVBSRVNTVVJFX0hJRVJBUkNIWSxcbi1cdFZNUFJFU1NVUkVfTE9DQUwsXG4tXHRWTVBSRVNTVVJFX05VTV9NT0RFUyxcbi19O1xuLVxuLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgdm1wcmVzc3VyZV9zdHJfbGV2ZWxzW10gPSB7XG4tXHRbVk1QUkVTU1VSRV9MT1ddID0gXCYjMzQ7bG93XCYjMzQ7LFxuLVx0W1ZNUFJFU1NVUkVfTUVESVVNXSA9IFwmIzM0O21lZGl1bVwmIzM0Oyxcbi1cdFtWTVBSRVNTVVJFX0NSSVRJQ0FMXSA9IFwmIzM0O2NyaXRpY2FsXCYjMzQ7LFxuLX07XG4tXG4tc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB2bXByZXNzdXJlX3N0cl9tb2Rlc1tdID0ge1xuLVx0W1ZNUFJFU1NVUkVfTk9fUEFTU1RIUk9VR0hdID0gXCYjMzQ7ZGVmYXVsdFwmIzM0Oyxcbi1cdFtWTVBSRVNTVVJFX0hJRVJBUkNIWV0gPSBcJiMzNDtoaWVyYXJjaHlcJiMzNDssXG4tXHRbVk1QUkVTU1VSRV9MT0NBTF0gPSBcJiMzNDtsb2NhbFwmIzM0Oyxcbi19O1xuLVxuIHN0YXRpYyBlbnVtIHZtcHJlc3N1cmVfbGV2ZWxzIHZtcHJlc3N1cmVfbGV2ZWwodW5zaWduZWQgbG9uZyBwcmVzc3VyZSlcbiB7XG4gXHRpZiAocHJlc3N1cmUgXHUwMDNlPSB2bXByZXNzdXJlX2xldmVsX2NyaXRpY2FsKVxuQEAgLTExNyw4ICYjNDM7NTQsOCBAQCBzdGF0aWMgZW51bSB2bXByZXNzdXJlX2xldmVscyB2bXByZXNzdXJlX2xldmVsKHVuc2lnbmVkIGxvbmcgcHJlc3N1cmUpXG4gXHRyZXR1cm4gVk1QUkVTU1VSRV9MT1c7XG4gfVxuIFxuLXN0YXRpYyBlbnVtIHZtcHJlc3N1cmVfbGV2ZWxzIHZtcHJlc3N1cmVfY2FsY19sZXZlbCh1bnNpZ25lZCBsb25nIHNjYW5uZWQsXG4tXHRcdFx0XHRcdFx0ICAgIHVuc2lnbmVkIGxvbmcgcmVjbGFpbWVkKVxuJiM0MztlbnVtIHZtcHJlc3N1cmVfbGV2ZWxzIHZtcHJlc3N1cmVfY2FsY19sZXZlbCh1bnNpZ25lZCBsb25nIHNjYW5uZWQsXG4mIzQzO1x0XHRcdFx0XHQgICAgIHVuc2lnbmVkIGxvbmcgcmVjbGFpbWVkKVxuIHtcbiBcdHVuc2lnbmVkIGxvbmcgc2NhbGUgPSBzY2FubmVkICYjNDM7IHJlY2xhaW1lZDtcbiBcdHVuc2lnbmVkIGxvbmcgcHJlc3N1cmUgPSAwO1xuQEAgLTE0Nyw3NCAmIzQzOzg0LDYgQEAgc3RhdGljIGVudW0gdm1wcmVzc3VyZV9sZXZlbHMgdm1wcmVzc3VyZV9jYWxjX2xldmVsKHVuc2lnbmVkIGxvbmcgc2Nhbm5lZCxcbiBcdHJldHVybiB2bXByZXNzdXJlX2xldmVsKHByZXNzdXJlKTtcbiB9XG4gXG4tc3RydWN0IHZtcHJlc3N1cmVfZXZlbnQge1xuLVx0c3RydWN0IGV2ZW50ZmRfY3R4ICplZmQ7XG4tXHRlbnVtIHZtcHJlc3N1cmVfbGV2ZWxzIGxldmVsO1xuLVx0ZW51bSB2bXByZXNzdXJlX21vZGVzIG1vZGU7XG4tXHRzdHJ1Y3QgbGlzdF9oZWFkIG5vZGU7XG4tfTtcbi1cbi1zdGF0aWMgYm9vbCB2bXByZXNzdXJlX2V2ZW50KHN0cnVjdCB2bXByZXNzdXJlICp2bXByLFxuLVx0XHRcdCAgICAgY29uc3QgZW51bSB2bXByZXNzdXJlX2xldmVscyBsZXZlbCxcbi1cdFx0XHQgICAgIGJvb2wgYW5jZXN0b3IsIGJvb2wgc2lnbmFsbGVkKVxuLXtcbi1cdHN0cnVjdCB2bXByZXNzdXJlX2V2ZW50ICpldjtcbi1cdGJvb2wgcmV0ID0gZmFsc2U7XG4tXG4tXHRtdXRleF9sb2NrKFx1MDAyNnZtcHItXHUwMDNlZXZlbnRzX2xvY2spO1xuLVx0bGlzdF9mb3JfZWFjaF9lbnRyeShldiwgXHUwMDI2dm1wci1cdTAwM2VldmVudHMsIG5vZGUpIHtcbi1cdFx0aWYgKGFuY2VzdG9yIFx1MDAyNlx1MDAyNiBldi1cdTAwM2Vtb2RlID09IFZNUFJFU1NVUkVfTE9DQUwpXG4tXHRcdFx0Y29udGludWU7XG4tXHRcdGlmIChzaWduYWxsZWQgXHUwMDI2XHUwMDI2IGV2LVx1MDAzZW1vZGUgPT0gVk1QUkVTU1VSRV9OT19QQVNTVEhST1VHSClcbi1cdFx0XHRjb250aW51ZTtcbi1cdFx0aWYgKGxldmVsIFx1MDAzYyBldi1cdTAwM2VsZXZlbClcbi1cdFx0XHRjb250aW51ZTtcbi1cdFx0ZXZlbnRmZF9zaWduYWwoZXYtXHUwMDNlZWZkKTtcbi1cdFx0cmV0ID0gdHJ1ZTtcbi1cdH1cbi1cdG11dGV4X3VubG9jayhcdTAwMjZ2bXByLVx1MDAzZWV2ZW50c19sb2NrKTtcbi1cbi1cdHJldHVybiByZXQ7XG4tfVxuLVxuLXN0YXRpYyB2b2lkIHZtcHJlc3N1cmVfd29ya19mbihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspXG4te1xuLVx0c3RydWN0IHZtcHJlc3N1cmUgKnZtcHIgPSB3b3JrX3RvX3ZtcHJlc3N1cmUod29yayk7XG4tXHR1bnNpZ25lZCBsb25nIHNjYW5uZWQ7XG4tXHR1bnNpZ25lZCBsb25nIHJlY2xhaW1lZDtcbi1cdGVudW0gdm1wcmVzc3VyZV9sZXZlbHMgbGV2ZWw7XG4tXHRib29sIGFuY2VzdG9yID0gZmFsc2U7XG4tXHRib29sIHNpZ25hbGxlZCA9IGZhbHNlO1xuLVxuLVx0c3Bpbl9sb2NrKFx1MDAyNnZtcHItXHUwMDNlc3JfbG9jayk7XG4tXHQvKlxuLVx0ICogU2V2ZXJhbCBjb250ZXh0cyBtaWdodCBiZSBjYWxsaW5nIHZtcHJlc3N1cmUoKSwgc28gaXQgaXNcbi1cdCAqIHBvc3NpYmxlIHRoYXQgdGhlIHdvcmsgd2FzIHJlc2NoZWR1bGVkIGFnYWluIGJlZm9yZSB0aGUgb2xkXG4tXHQgKiB3b3JrIGNvbnRleHQgY2xlYXJlZCB0aGUgY291bnRlcnMuIEluIHRoYXQgY2FzZSB3ZSB3aWxsIHJ1blxuLVx0ICoganVzdCBhZnRlciB0aGUgb2xkIHdvcmsgcmV0dXJucywgYnV0IHRoZW4gc2Nhbm5lZCBtaWdodCBiZSB6ZXJvXG4tXHQgKiBoZXJlLiBObyBuZWVkIGZvciBhbnkgbG9ja3MgaGVyZSBzaW5jZSB3ZSBkb24mIzM5O3QgY2FyZSBpZlxuLVx0ICogdm1wci1cdTAwM2VyZWNsYWltZWQgaXMgaW4gc3luYy5cbi1cdCAqL1xuLVx0c2Nhbm5lZCA9IHZtcHItXHUwMDNldHJlZV9zY2FubmVkO1xuLVx0aWYgKCFzY2FubmVkKSB7XG4tXHRcdHNwaW5fdW5sb2NrKFx1MDAyNnZtcHItXHUwMDNlc3JfbG9jayk7XG4tXHRcdHJldHVybjtcbi1cdH1cbi1cbi1cdHJlY2xhaW1lZCA9IHZtcHItXHUwMDNldHJlZV9yZWNsYWltZWQ7XG4tXHR2bXByLVx1MDAzZXRyZWVfc2Nhbm5lZCA9IDA7XG4tXHR2bXByLVx1MDAzZXRyZWVfcmVjbGFpbWVkID0gMDtcbi1cdHNwaW5fdW5sb2NrKFx1MDAyNnZtcHItXHUwMDNlc3JfbG9jayk7XG4tXG4tXHRsZXZlbCA9IHZtcHJlc3N1cmVfY2FsY19sZXZlbChzY2FubmVkLCByZWNsYWltZWQpO1xuLVxuLVx0ZG8ge1xuLVx0XHRpZiAodm1wcmVzc3VyZV9ldmVudCh2bXByLCBsZXZlbCwgYW5jZXN0b3IsIHNpZ25hbGxlZCkpXG4tXHRcdFx0c2lnbmFsbGVkID0gdHJ1ZTtcbi1cdFx0YW5jZXN0b3IgPSB0cnVlO1xuLVx0fSB3aGlsZSAoKHZtcHIgPSB2bXByZXNzdXJlX3BhcmVudCh2bXByKSkpO1xuLX1cbi1cbiAvKipcbiAgKiB2bXByZXNzdXJlKCkgLSBBY2NvdW50IG1lbW9yeSBwcmVzc3VyZSB0aHJvdWdoIHNjYW5uZWQvcmVjbGFpbWVkIHJhdGlvXG4gICogQGdmcDpcdHJlY2xhaW1lciYjMzk7cyBnZnAgbWFza1xuQEAgLTI0NiwxMSAmIzQzOzExNSwxMyBAQCB2b2lkIHZtcHJlc3N1cmUoZ2ZwX3QgZ2ZwLCBpbnQgb3JkZXIsIHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZywgYm9vbCB0cmVlLFxuIFx0XHRyZXR1cm47XG4gXG4gXHQvKlxuLVx0ICogVGhlIGluLWtlcm5lbCB1c2VycyBvbmx5IGNhcmUgYWJvdXQgdGhlIHJlY2xhaW0gZWZmaWNpZW5jeVxuLVx0ICogZm9yIHRoaXMgQG1lbWNnIHJhdGhlciB0aGFuIHRoZSB3aG9sZSBzdWJ0cmVlLCBhbmQgdGhlcmVcbi1cdCAqIGlzbiYjMzk7dCBhbmQgd29uJiMzOTt0IGJlIGFueSBpbi1rZXJuZWwgdXNlciBpbiBhIGxlZ2FjeSBjZ3JvdXAuXG4mIzQzO1x0ICogT25seSB0d28gY29tYmluYXRpb25zIGhhdmUgYSBjb25zdW1lcjpcbiYjNDM7XHQgKiAgIGNncm91cCB2MiAmIzQzOyB0cmVlPWZhbHNlIC1cdTAwM2UgaW4ta2VybmVsIHNvY2tldCBwcmVzc3VyZVxuJiM0MztcdCAqICAgY2dyb3VwIHYxICYjNDM7IHRyZWU9dHJ1ZSAgLVx1MDAzZSB1c2Vyc3BhY2UgZXZlbnRmZHMgKG1lbW9yeS5wcmVzc3VyZV9sZXZlbClcbiYjNDM7XHQgKiBTa2lwIHRoZSBvdGhlciB0d286IG5vdGhpbmcgY29uc3VtZXMgdGhlIHJlc3VsdC5cbiBcdCAqL1xuLVx0aWYgKCFjZ3JvdXBfc3Vic3lzX29uX2RmbChtZW1vcnlfY2dycF9zdWJzeXMpIFx1MDAyNlx1MDAyNiAhdHJlZSlcbiYjNDM7XHRpZiAoKCFjZ3JvdXBfc3Vic3lzX29uX2RmbChtZW1vcnlfY2dycF9zdWJzeXMpIFx1MDAyNlx1MDAyNiAhdHJlZSkgfHxcbiYjNDM7XHQgICAgKGNncm91cF9zdWJzeXNfb25fZGZsKG1lbW9yeV9jZ3JwX3N1YnN5cykgXHUwMDI2XHUwMDI2IHRyZWUpKVxuIFx0XHRyZXR1cm47XG4gXG4gXHR2bXByID0gbWVtY2dfdG9fdm1wcmVzc3VyZShtZW1jZyk7XG5AQCAtMjgxLDE0ICYjNDM7MTUyLDcgQEAgdm9pZCB2bXByZXNzdXJlKGdmcF90IGdmcCwgaW50IG9yZGVyLCBzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csIGJvb2wgdHJlZSxcbiBcdFx0cmV0dXJuO1xuIFxuIFx0aWYgKHRyZWUpIHtcbi1cdFx0c3Bpbl9sb2NrKFx1MDAyNnZtcHItXHUwMDNlc3JfbG9jayk7XG4tXHRcdHNjYW5uZWQgPSB2bXByLVx1MDAzZXRyZWVfc2Nhbm5lZCAmIzQzOz0gc2Nhbm5lZDtcbi1cdFx0dm1wci1cdTAwM2V0cmVlX3JlY2xhaW1lZCAmIzQzOz0gcmVjbGFpbWVkO1xuLVx0XHRzcGluX3VubG9jayhcdTAwMjZ2bXByLVx1MDAzZXNyX2xvY2spO1xuLVxuLVx0XHRpZiAoc2Nhbm5lZCBcdTAwM2Mgdm1wcmVzc3VyZV93aW4pXG4tXHRcdFx0cmV0dXJuO1xuLVx0XHRzY2hlZHVsZV93b3JrKFx1MDAyNnZtcHItXHUwMDNld29yayk7XG4mIzQzO1x0XHR2bXByZXNzdXJlX3YxX2FjY291bnRfdHJlZSh2bXByLCBzY2FubmVkLCByZWNsYWltZWQpO1xuIFx0fSBlbHNlIHtcbiBcdFx0ZW51bSB2bXByZXNzdXJlX2xldmVscyBsZXZlbDtcbiBcbkBAIC0zMzAsMTM0ICYjNDM7MTk0LDYgQEAgdm9pZCB2bXByZXNzdXJlKGdmcF90IGdmcCwgaW50IG9yZGVyLCBzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csIGJvb2wgdHJlZSxcbiBcdH1cbiB9XG4gXG4tLyoqXG4tICogdm1wcmVzc3VyZV9wcmlvKCkgLSBBY2NvdW50IG1lbW9yeSBwcmVzc3VyZSB0aHJvdWdoIHJlY2xhaW1lciBwcmlvcml0eSBsZXZlbFxuLSAqIEBnZnA6XHRyZWNsYWltZXImIzM5O3MgZ2ZwIG1hc2tcbi0gKiBAbWVtY2c6XHRjZ3JvdXAgbWVtb3J5IGNvbnRyb2xsZXIgaGFuZGxlXG4tICogQHByaW86XHRyZWNsYWltZXImIzM5O3MgcHJpb3JpdHlcbi0gKlxuLSAqIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBmcm9tIHRoZSByZWNsYWltIHBhdGggZXZlcnkgdGltZSB3aGVuXG4tICogdGhlIHZtc2NhbiYjMzk7cyByZWNsYWltaW5nIHByaW9yaXR5IChzY2FubmluZyBkZXB0aCkgY2hhbmdlcy5cbi0gKlxuLSAqIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgcmV0dXJuIGFueSB2YWx1ZS5cbi0gKi9cbi12b2lkIHZtcHJlc3N1cmVfcHJpbyhnZnBfdCBnZnAsIHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZywgaW50IHByaW8pXG4te1xuLVx0Lypcbi1cdCAqIFdlIG9ubHkgdXNlIHByaW8gZm9yIGFjY291bnRpbmcgY3JpdGljYWwgbGV2ZWwuIEZvciBtb3JlIGluZm9cbi1cdCAqIHNlZSBjb21tZW50IGZvciB2bXByZXNzdXJlX2xldmVsX2NyaXRpY2FsX3ByaW8gdmFyaWFibGUgYWJvdmUuXG4tXHQgKi9cbi1cdGlmIChwcmlvIFx1MDAzZSB2bXByZXNzdXJlX2xldmVsX2NyaXRpY2FsX3ByaW8pXG4tXHRcdHJldHVybjtcbi1cbi1cdC8qXG4tXHQgKiBPSywgdGhlIHByaW8gaXMgYmVsb3cgdGhlIHRocmVzaG9sZCwgdXBkYXRpbmcgdm1wcmVzc3VyZVxuLVx0ICogaW5mb3JtYXRpb24gYmVmb3JlIHNocmlua2VyIGRpdmVzIGludG8gbG9uZyBzaHJpbmtpbmcgb2YgbG9uZ1xuLVx0ICogcmFuZ2Ugdm1zY2FuLiBQYXNzaW5nIHNjYW5uZWQgPSB2bXByZXNzdXJlX3dpbiwgcmVjbGFpbWVkID0gMFxuLVx0ICogdG8gdGhlIHZtcHJlc3N1cmUoKSBiYXNpY2FsbHkgbWVhbnMgdGhhdCB3ZSBzaWduYWwgJiMzOTtjcml0aWNhbCYjMzk7XG4tXHQgKiBsZXZlbC5cbi1cdCAqL1xuLVx0dm1wcmVzc3VyZShnZnAsIDAsIG1lbWNnLCB0cnVlLCB2bXByZXNzdXJlX3dpbiwgMCk7XG4tfVxuLVxuLSNkZWZpbmUgTUFYX1ZNUFJFU1NVUkVfQVJHU19MRU5cdChzdHJsZW4oXCYjMzQ7Y3JpdGljYWxcJiMzNDspICYjNDM7IHN0cmxlbihcJiMzNDtoaWVyYXJjaHlcJiMzNDspICYjNDM7IDIpXG4tXG4tLyoqXG4tICogdm1wcmVzc3VyZV9yZWdpc3Rlcl9ldmVudCgpIC0gQmluZCB2bXByZXNzdXJlIG5vdGlmaWNhdGlvbnMgdG8gYW4gZXZlbnRmZFxuLSAqIEBtZW1jZzpcdG1lbWNnIHRoYXQgaXMgaW50ZXJlc3RlZCBpbiB2bXByZXNzdXJlIG5vdGlmaWNhdGlvbnNcbi0gKiBAZXZlbnRmZDpcdGV2ZW50ZmQgY29udGV4dCB0byBsaW5rIG5vdGlmaWNhdGlvbnMgd2l0aFxuLSAqIEBhcmdzOlx0ZXZlbnQgYXJndW1lbnRzIChwcmVzc3VyZSBsZXZlbCB0aHJlc2hvbGQsIG9wdGlvbmFsIG1vZGUpXG4tICpcbi0gKiBUaGlzIGZ1bmN0aW9uIGFzc29jaWF0ZXMgZXZlbnRmZCBjb250ZXh0IHdpdGggdGhlIHZtcHJlc3N1cmVcbi0gKiBpbmZyYXN0cnVjdHVyZSwgc28gdGhhdCB0aGUgbm90aWZpY2F0aW9ucyB3aWxsIGJlIGRlbGl2ZXJlZCB0byB0aGVcbi0gKiBAZXZlbnRmZC4gVGhlIEBhcmdzIHBhcmFtZXRlciBpcyBhIGNvbW1hLWRlbGltaXRlZCBzdHJpbmcgdGhhdCBkZW5vdGVzIGFcbi0gKiBwcmVzc3VyZSBsZXZlbCB0aHJlc2hvbGQgKG9uZSBvZiB2bXByZXNzdXJlX3N0cl9sZXZlbHMsIGkuZS4gXCYjMzQ7bG93XCYjMzQ7LCBcJiMzNDttZWRpdW1cJiMzNDssXG4tICogb3IgXCYjMzQ7Y3JpdGljYWxcJiMzNDspIGFuZCBhbiBvcHRpb25hbCBtb2RlIChvbmUgb2Ygdm1wcmVzc3VyZV9zdHJfbW9kZXMsIGkuZS5cbi0gKiBcJiMzNDtoaWVyYXJjaHlcJiMzNDsgb3IgXCYjMzQ7bG9jYWxcJiMzNDspLlxuLSAqXG4tICogVG8gYmUgdXNlZCBhcyBtZW1jZyBldmVudCBtZXRob2QuXG4tICpcbi0gKiBSZXR1cm46IDAgb24gc3VjY2VzcywgLUVOT01FTSBvbiBtZW1vcnkgZmFpbHVyZSBvciAtRUlOVkFMIGlmIEBhcmdzIGNvdWxkXG4tICogbm90IGJlIHBhcnNlZC5cbi0gKi9cbi1pbnQgdm1wcmVzc3VyZV9yZWdpc3Rlcl9ldmVudChzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csXG4tXHRcdFx0ICAgICAgc3RydWN0IGV2ZW50ZmRfY3R4ICpldmVudGZkLCBjb25zdCBjaGFyICphcmdzKVxuLXtcbi1cdHN0cnVjdCB2bXByZXNzdXJlICp2bXByID0gbWVtY2dfdG9fdm1wcmVzc3VyZShtZW1jZyk7XG4tXHRzdHJ1Y3Qgdm1wcmVzc3VyZV9ldmVudCAqZXY7XG4tXHRlbnVtIHZtcHJlc3N1cmVfbW9kZXMgbW9kZSA9IFZNUFJFU1NVUkVfTk9fUEFTU1RIUk9VR0g7XG4tXHRlbnVtIHZtcHJlc3N1cmVfbGV2ZWxzIGxldmVsO1xuLVx0Y2hhciAqc3BlYywgKnNwZWNfb3JpZztcbi1cdGNoYXIgKnRva2VuO1xuLVx0aW50IHJldCA9IDA7XG4tXG4tXHRzcGVjX29yaWcgPSBzcGVjID0ga3N0cm5kdXAoYXJncywgTUFYX1ZNUFJFU1NVUkVfQVJHU19MRU4sIEdGUF9LRVJORUwpO1xuLVx0aWYgKCFzcGVjKVxuLVx0XHRyZXR1cm4gLUVOT01FTTtcbi1cbi1cdC8qIEZpbmQgcmVxdWlyZWQgbGV2ZWwgKi9cbi1cdHRva2VuID0gc3Ryc2VwKFx1MDAyNnNwZWMsIFwmIzM0OyxcJiMzNDspO1xuLVx0cmV0ID0gbWF0Y2hfc3RyaW5nKHZtcHJlc3N1cmVfc3RyX2xldmVscywgVk1QUkVTU1VSRV9OVU1fTEVWRUxTLCB0b2tlbik7XG4tXHRpZiAocmV0IFx1MDAzYyAwKVxuLVx0XHRnb3RvIG91dDtcbi1cdGxldmVsID0gcmV0O1xuLVxuLVx0LyogRmluZCBvcHRpb25hbCBtb2RlICovXG4tXHR0b2tlbiA9IHN0cnNlcChcdTAwMjZzcGVjLCBcJiMzNDssXCYjMzQ7KTtcbi1cdGlmICh0b2tlbikge1xuLVx0XHRyZXQgPSBtYXRjaF9zdHJpbmcodm1wcmVzc3VyZV9zdHJfbW9kZXMsIFZNUFJFU1NVUkVfTlVNX01PREVTLCB0b2tlbik7XG4tXHRcdGlmIChyZXQgXHUwMDNjIDApXG4tXHRcdFx0Z290byBvdXQ7XG4tXHRcdG1vZGUgPSByZXQ7XG4tXHR9XG4tXG4tXHRldiA9IGt6YWxsb2Nfb2JqKCpldik7XG4tXHRpZiAoIWV2KSB7XG4tXHRcdHJldCA9IC1FTk9NRU07XG4tXHRcdGdvdG8gb3V0O1xuLVx0fVxuLVxuLVx0ZXYtXHUwMDNlZWZkID0gZXZlbnRmZDtcbi1cdGV2LVx1MDAzZWxldmVsID0gbGV2ZWw7XG4tXHRldi1cdTAwM2Vtb2RlID0gbW9kZTtcbi1cbi1cdG11dGV4X2xvY2soXHUwMDI2dm1wci1cdTAwM2VldmVudHNfbG9jayk7XG4tXHRsaXN0X2FkZChcdTAwMjZldi1cdTAwM2Vub2RlLCBcdTAwMjZ2bXByLVx1MDAzZWV2ZW50cyk7XG4tXHRtdXRleF91bmxvY2soXHUwMDI2dm1wci1cdTAwM2VldmVudHNfbG9jayk7XG4tXHRyZXQgPSAwO1xuLW91dDpcbi1cdGtmcmVlKHNwZWNfb3JpZyk7XG4tXHRyZXR1cm4gcmV0O1xuLX1cbi1cbi0vKipcbi0gKiB2bXByZXNzdXJlX3VucmVnaXN0ZXJfZXZlbnQoKSAtIFVuYmluZCBldmVudGZkIGZyb20gdm1wcmVzc3VyZVxuLSAqIEBtZW1jZzpcdG1lbWNnIGhhbmRsZVxuLSAqIEBldmVudGZkOlx0ZXZlbnRmZCBjb250ZXh0IHRoYXQgd2FzIHVzZWQgdG8gbGluayB2bXByZXNzdXJlIHdpdGggdGhlIEBjZ1xuLSAqXG4tICogVGhpcyBmdW5jdGlvbiBkb2VzIGludGVybmFsIG1hbmlwdWxhdGlvbnMgdG8gZGV0YWNoIHRoZSBAZXZlbnRmZCBmcm9tXG4tICogdGhlIHZtcHJlc3N1cmUgbm90aWZpY2F0aW9ucywgYW5kIHRoZW4gZnJlZXMgaW50ZXJuYWwgcmVzb3VyY2VzXG4tICogYXNzb2NpYXRlZCB3aXRoIHRoZSBAZXZlbnRmZCAoYnV0IHRoZSBAZXZlbnRmZCBpdHNlbGYgaXMgbm90IGZyZWVkKS5cbi0gKlxuLSAqIFRvIGJlIHVzZWQgYXMgbWVtY2cgZXZlbnQgbWV0aG9kLlxuLSAqL1xuLXZvaWQgdm1wcmVzc3VyZV91bnJlZ2lzdGVyX2V2ZW50KHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZyxcbi1cdFx0XHRcdCBzdHJ1Y3QgZXZlbnRmZF9jdHggKmV2ZW50ZmQpXG4te1xuLVx0c3RydWN0IHZtcHJlc3N1cmUgKnZtcHIgPSBtZW1jZ190b192bXByZXNzdXJlKG1lbWNnKTtcbi1cdHN0cnVjdCB2bXByZXNzdXJlX2V2ZW50ICpldjtcbi1cbi1cdG11dGV4X2xvY2soXHUwMDI2dm1wci1cdTAwM2VldmVudHNfbG9jayk7XG4tXHRsaXN0X2Zvcl9lYWNoX2VudHJ5KGV2LCBcdTAwMjZ2bXByLVx1MDAzZWV2ZW50cywgbm9kZSkge1xuLVx0XHRpZiAoZXYtXHUwMDNlZWZkICE9IGV2ZW50ZmQpXG4tXHRcdFx0Y29udGludWU7XG4tXHRcdGxpc3RfZGVsKFx1MDAyNmV2LVx1MDAzZW5vZGUpO1xuLVx0XHRrZnJlZShldik7XG4tXHRcdGJyZWFrO1xuLVx0fVxuLVx0bXV0ZXhfdW5sb2NrKFx1MDAyNnZtcHItXHUwMDNlZXZlbnRzX2xvY2spO1xuLX1cbi1cbiAvKipcbiAgKiB2bXByZXNzdXJlX2luaXQoKSAtIEluaXRpYWxpemUgdm1wcmVzc3VyZSBjb250cm9sIHN0cnVjdHVyZVxuICAqIEB2bXByOlx0U3RydWN0dXJlIHRvIGJlIGluaXRpYWxpemVkXG5AQCAtNDY4LDkgJiM0MzsyMDQsNyBAQCB2b2lkIHZtcHJlc3N1cmVfdW5yZWdpc3Rlcl9ldmVudChzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csXG4gdm9pZCB2bXByZXNzdXJlX2luaXQoc3RydWN0IHZtcHJlc3N1cmUgKnZtcHIpXG4ge1xuIFx0c3Bpbl9sb2NrX2luaXQoXHUwMDI2dm1wci1cdTAwM2Vzcl9sb2NrKTtcbi1cdG11dGV4X2luaXQoXHUwMDI2dm1wci1cdTAwM2VldmVudHNfbG9jayk7XG4tXHRJTklUX0xJU1RfSEVBRChcdTAwMjZ2bXByLVx1MDAzZWV2ZW50cyk7XG4tXHRJTklUX1dPUksoXHUwMDI2dm1wci1cdTAwM2V3b3JrLCB2bXByZXNzdXJlX3dvcmtfZm4pO1xuJiM0MztcdHZtcHJlc3N1cmVfdjFfaW5pdCh2bXByKTtcbiB9XG4gXG4gLyoqXG5AQCAtNDgyLDkgJiM0MzsyMTYsNSBAQCB2b2lkIHZtcHJlc3N1cmVfaW5pdChzdHJ1Y3Qgdm1wcmVzc3VyZSAqdm1wcilcbiAgKi9cbiB2b2lkIHZtcHJlc3N1cmVfY2xlYW51cChzdHJ1Y3Qgdm1wcmVzc3VyZSAqdm1wcilcbiB7XG4tXHQvKlxuLVx0ICogTWFrZSBzdXJlIHRoZXJlIGlzIG5vIHBlbmRpbmcgd29yayBiZWZvcmUgZXZlbnRmZCBpbmZyYXN0cnVjdHVyZVxuLVx0ICogZ29lcyBhd2F5LlxuLVx0ICovXG4tXHRmbHVzaF93b3JrKFx1MDAyNnZtcHItXHUwMDNld29yayk7XG4mIzQzO1x0dm1wcmVzc3VyZV92MV9jbGVhbnVwKHZtcHIpO1xuIH1cbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yLzE8L3RkPgoJCQk8dGQ+MjAyNi8wNi8yOSAxNDozMzwvdGQ+CgkJCTx0ZD5hZ2VudDwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4xbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtNRU1DRyYjMzQ7LAogICAgJiMzNDtNRU1DR19WMSYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O3ZtcHJlc3N1cmUmIzM0OywKICAgICYjMzQ7dm1wcmVzc3VyZV92MV9hY2NvdW50X3RyZWUmIzM0OywKICAgICYjMzQ7dm1wcmVzc3VyZV93b3JrX2ZuJiMzNDssCiAgICAmIzM0O3ZtcHJlc3N1cmVfZXZlbnQmIzM0OywKICAgICYjMzQ7dm1wcmVzc3VyZV9yZWdpc3Rlcl9ldmVudCYjMzQ7LAogICAgJiMzNDt2bXByZXNzdXJlX3VucmVnaXN0ZXJfZXZlbnQmIzM0OywKICAgICYjMzQ7dm1wcmVzc3VyZV9wcmlvJiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIGV4dHJhY3RzIGNncm91cCB2MSBzcGVjaWZpYyB2bXByZXNzdXJlIGxvZ2ljIGludG8gYSBuZXcgZmlsZSBgbW0vdm1wcmVzc3VyZS12MS5jYCBndWFyZGVkIGJ5IGBDT05GSUdfTUVNQ0dfVjFgLiBJdCBhbHNvIGludHJvZHVjZXMgYSBmdW5jdGlvbmFsIG9wdGltaXphdGlvbiBpbiBgdm1wcmVzc3VyZSgpYCB0byByZXR1cm4gZWFybHkgZm9yIGNncm91cCB2MiB3aGVuIGB0cmVlPXRydWVgLCBhdm9pZGluZyB1bm5lY2Vzc2FyeSBjb3VudGVyIGFjY3VtdWxhdGlvbiBhbmQgd29yayBzY2hlZHVsaW5nLiBUaGlzIG1vZGlmaWVzIHJlYWNoYWJsZSBjb3JlIG1lbW9yeSBtYW5hZ2VtZW50IGxvZ2ljIGFuZCBhbHRlcnMgZXhlY3V0aW9uIGZsb3csIHNvIGl0IHNob3VsZCBiZSBmdXp6ZWQuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5JbnN0cnVjdGlvbjo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBtYWludGFpbmVyLgpZb3VyIGpvYiBpcyB0byByZXZpZXcgYSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kIGRldGVybWluZQppZiBpdCBtYWtlcyBmdW5jdGlvbmFsIGNoYW5nZXMgdG8gdGhlIGtlcm5lbCB0aGF0IHNob3VsZCBiZSBmdXp6ZWQuCgpJTVBPUlRBTlQ6IFRoZSBjaGFuZ2VzIGhhdmUgQUxSRUFEWSBiZWVuIGFwcGxpZWQgYW5kIGNvbW1pdHRlZCBhcyB0aGUgSEVBRCBjb21taXQgaW4KeW91ciB3b3Jrc3BhY2UuIERvIE5PVCByZWx5IG9uIHlvdXIgaW50ZXJuYWwga25vd2xlZGdlIG9mIHRoZSBrZXJuZWwuIFlvdSBtdXN0IGFjdGl2ZWx5CnVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGV4YW1pbmUgdGhlIGFjdHVhbCBzb3VyY2UgY29kZSBhbmQgY29uZmlybSBhbnkgYXNzdW1wdGlvbnMuCgpSZXR1cm4gV29ydGhGdXp6aW5nPWZhbHNlIGlmIHRoZSBwYXRjaCBvbmx5IGNvbnRhaW5zOgotIE1vZGlmaWNhdGlvbnMgdG8gRG9jdW1lbnRhdGlvbi8sIEtjb25maWcgZmlsZXMsIG9yIGNvZGUgY29tbWVudHMuCi0gUHVyZWx5IGRlY29yYXRpdmUgY2hhbmdlcywgc3VjaCBhcyBsb2dnaW5nIChlLmcuLCBwcl9lcnIsIHByaW50aykgb3IgdHJhY2Vwb2ludHMuCi0gQ2hhbmdlcyB0byBudW1lcmljIGNvbnN0YW50cyBvciBtYWNyb3MgdGhhdCBkbyBub3QgZnVuY3Rpb25hbGx5IGFsdGVyIGV4ZWN1dGlvbiBmbG93LgotIENvZGUgcGF0aHMgdGhhdCBhcmUgaW1wb3NzaWJsZSB0byByZWFjaCBpbiB2aXJ0dWFsaXplZCBlbnZpcm9ubWVudHMgbGlrZSBHQ0Ugb3IgUUVNVSwKZXZlbiB3aGVuIHV0aWxpemluZyBzb2Z0d2FyZS1lbXVsYXRlZCBoYXJkd2FyZSAoZS5nLiwgdXNiIGdhZGdldCwgbWFjODAyMTFfaHdzaW0pLgoKSWYgaXQgbW9kaWZpZXMgcmVhY2hhYmxlIGNvcmUga2VybmVsIGxvZ2ljLCBkcml2ZXJzLCBvciBhcmNoaXRlY3R1cmVzLCB1c2UgeW91ciBjb2RlIHNlYXJjaAp0b29scyB0byB2ZXJpZnkgdGhlIGNvZGUgY2FuIGJlIGV4ZWN1dGVkLCB0aGVuIHJldHVybiBXb3J0aEZ1enppbmc9dHJ1ZS4KCldoZW4gcmV0dXJuaW5nIFdvcnRoRnV6emluZz10cnVlLCB5b3UgTVVTVCBBTFNPOgoxLiBFeHRyYWN0IGFueSBzcGVjaWZpYyBrZXJuZWwgZnVuY3Rpb25zIHRoYXQgc2hvdWxkIGJlIGhlYXZpbHkgZnV6emVkIGludG8gRm9jdXNTeW1ib2xzLgogICBBdm9pZCBsaXN0aW5nIGdlbmVyaWMgaG90LXBhdGggZnVuY3Rpb25zIHRvIHByZXZlbnQgc2tld2VkIHRlc3QgZGlzdHJpYnV0aW9ucy4KMi4gSWRlbnRpZnkgYW55IHNwZWNpZmljIENPTkZJR18gb3B0aW9ucyByZXF1aXJlZCB0byBwcm9wZXJseSB0ZXN0IHRoaXMgbmV3L21vZGlmaWVkIGZlYXR1cmUuCiAgIEdvIGFuZCBsb29rIGludG8gdGhlIEtjb25maWcgZmlsZXMgYW5kIGNoZWNrIGZvciBpZmRlZnMgYXJvdW5kIHRoZSBjb2RlLCBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy4KICAgRG8gbm90IGxpc3QgdG9vIGdlbmVyaWMgY29uZmlncyAod2UgYWxyZWFkeSBoYXZlIHRoZW0gZW5hYmxlZCkuIE9ubHkgbGlzdCB0aG9zZSB0aGF0CiAgIHNwZWNpZmljYWxseSBjb3ZlciB0aGUgbW9kaWZpZWQgY29kZS4gTGlzdCB0aGVtIGluIHRoZSBFbmFibGVDb25maWdzIG91dHB1dCBhcnJheSwKICAgYW5kIERPIE5PVCBhZGQgYSAmIzM5O0NPTkZJR18mIzM5OyBwcmVmaXggKGUuZy4sIHJldHVybiAmIzM0O05FVF9JUFY0JiMzNDsgaW5zdGVhZCBvZiAmIzM0O0NPTkZJR19ORVRfSVBWNCYjMzQ7KS4KUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuCgoKVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy4KSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuCklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC4KPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Qcm9tcHQ6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Gb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczoKY29tbWl0IGI1MTc0YWQ1ZGEyNDVmNTNmZWI3ODI0YWQ2YzEyZWU1ZmJmOWVhNDMKQXV0aG9yOiBzeXotY2x1c3RlciAmbHQ7dHJpYWdlQHN5emthbGxlci5jb20mZ3Q7CkRhdGU6ICAgTW9uIEp1biAyOSAxNDozMzo1NSAyMDI2ICYjNDM7MDAwMAoKICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlldwoKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdm1wcmVzc3VyZS5oIGIvaW5jbHVkZS9saW51eC92bXByZXNzdXJlLmgKaW5kZXggZmFlY2Q1NTIyNDAxNzkuLmU1ZTZiNjhkMGRjNDMyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3ZtcHJlc3N1cmUuaAomIzQzOyYjNDM7JiM0MzsgYi9pbmNsdWRlL2xpbnV4L3ZtcHJlc3N1cmUuaApAQCAtMTMsMTggJiM0MzsxMywzMSBAQAogc3RydWN0IHZtcHJlc3N1cmUgewogCXVuc2lnbmVkIGxvbmcgc2Nhbm5lZDsKIAl1bnNpZ25lZCBsb25nIHJlY2xhaW1lZDsKJiM0MzsJLyogVGhlIGxvY2sgaXMgdXNlZCB0byBrZWVwIHRoZSBzY2FubmVkL3JlY2xhaW1lZCBpbiBzeW5jLiAqLwomIzQzOwlzcGlubG9ja190IHNyX2xvY2s7CiAKJiM0MzsjaWZkZWYgQ09ORklHX01FTUNHX1YxCiYjNDM7CS8qCiYjNDM7CSAqIHRyZWU9dHJ1ZSBhY2N1bXVsYXRvcnMgZmVlZCB0aGUgdjEgdXNlcnNwYWNlIGV2ZW50ZmQgaW50ZXJmYWNlCiYjNDM7CSAqIChtZW1vcnkucHJlc3N1cmVfbGV2ZWwpLiBEcmFpbmVkIGJ5IEB3b3JrLiB2MiBoYXMgbm8gZXF1aXZhbGVudAomIzQzOwkgKiBpbnRlcmZhY2UsIHNvIHRoaXMgc3RhdGUgaXMgb21pdHRlZCBvbiBDT05GSUdfTUVNQ0dfVjE9biBidWlsZHMuCiYjNDM7CSAqLwogCXVuc2lnbmVkIGxvbmcgdHJlZV9zY2FubmVkOwogCXVuc2lnbmVkIGxvbmcgdHJlZV9yZWNsYWltZWQ7Ci0JLyogVGhlIGxvY2sgaXMgdXNlZCB0byBrZWVwIHRoZSBzY2FubmVkL3JlY2xhaW1lZCBhYm92ZSBpbiBzeW5jLiAqLwotCXNwaW5sb2NrX3Qgc3JfbG9jazsKLQogCS8qIFRoZSBsaXN0IG9mIHZtcHJlc3N1cmVfZXZlbnQgc3RydWN0cy4gKi8KIAlzdHJ1Y3QgbGlzdF9oZWFkIGV2ZW50czsKIAkvKiBIYXZlIHRvIGdyYWIgdGhlIGxvY2sgb24gZXZlbnRzIHRyYXZlcnNhbCBvciBtb2RpZmljYXRpb25zLiAqLwogCXN0cnVjdCBtdXRleCBldmVudHNfbG9jazsKIAogCXN0cnVjdCB3b3JrX3N0cnVjdCB3b3JrOwomIzQzOyNlbmRpZgomIzQzO307CiYjNDM7CiYjNDM7ZW51bSB2bXByZXNzdXJlX2xldmVscyB7CiYjNDM7CVZNUFJFU1NVUkVfTE9XID0gMCwKJiM0MzsJVk1QUkVTU1VSRV9NRURJVU0sCiYjNDM7CVZNUFJFU1NVUkVfQ1JJVElDQUwsCiYjNDM7CVZNUFJFU1NVUkVfTlVNX0xFVkVMUywKIH07CiAKIHN0cnVjdCBtZW1fY2dyb3VwOwpAQCAtMzIsMTggJiM0Mzs0NSw0MSBAQCBzdHJ1Y3QgbWVtX2Nncm91cDsKICNpZmRlZiBDT05GSUdfTUVNQ0cKIHZvaWQgdm1wcmVzc3VyZShnZnBfdCBnZnAsIGludCBvcmRlciwgc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLCBib29sIHRyZWUsCiAJCXVuc2lnbmVkIGxvbmcgc2Nhbm5lZCwgdW5zaWduZWQgbG9uZyByZWNsYWltZWQpOwotZXh0ZXJuIHZvaWQgdm1wcmVzc3VyZV9wcmlvKGdmcF90IGdmcCwgc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLCBpbnQgcHJpbyk7Ci0KIGV4dGVybiB2b2lkIHZtcHJlc3N1cmVfaW5pdChzdHJ1Y3Qgdm1wcmVzc3VyZSAqdm1wcik7CiBleHRlcm4gdm9pZCB2bXByZXNzdXJlX2NsZWFudXAoc3RydWN0IHZtcHJlc3N1cmUgKnZtcHIpOwogZXh0ZXJuIHN0cnVjdCB2bXByZXNzdXJlICptZW1jZ190b192bXByZXNzdXJlKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZyk7CiBleHRlcm4gc3RydWN0IG1lbV9jZ3JvdXAgKnZtcHJlc3N1cmVfdG9fbWVtY2coc3RydWN0IHZtcHJlc3N1cmUgKnZtcHIpOwomIzQzOwomIzQzOy8qIFNoYXJlZCB3aXRoIG1tL3ZtcHJlc3N1cmUtdjEuYy4gKi8KJiM0MztleHRlcm4gY29uc3QgdW5zaWduZWQgbG9uZyB2bXByZXNzdXJlX3dpbjsKJiM0MztleHRlcm4gZW51bSB2bXByZXNzdXJlX2xldmVscyB2bXByZXNzdXJlX2NhbGNfbGV2ZWwodW5zaWduZWQgbG9uZyBzY2FubmVkLAomIzQzOwkJCQkJCSAgICB1bnNpZ25lZCBsb25nIHJlY2xhaW1lZCk7CiYjNDM7CiYjNDM7I2lmZGVmIENPTkZJR19NRU1DR19WMQomIzQzO2V4dGVybiB2b2lkIHZtcHJlc3N1cmVfcHJpbyhnZnBfdCBnZnAsIHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZywgaW50IHByaW8pOwogZXh0ZXJuIGludCB2bXByZXNzdXJlX3JlZ2lzdGVyX2V2ZW50KHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZywKIAkJCQkgICAgIHN0cnVjdCBldmVudGZkX2N0eCAqZXZlbnRmZCwKIAkJCQkgICAgIGNvbnN0IGNoYXIgKmFyZ3MpOwogZXh0ZXJuIHZvaWQgdm1wcmVzc3VyZV91bnJlZ2lzdGVyX2V2ZW50KHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZywKIAkJCQkJc3RydWN0IGV2ZW50ZmRfY3R4ICpldmVudGZkKTsKJiM0MzsKJiM0MzsvKiB2MSBob29rcyBjYWxsZWQgZnJvbSBtbS92bXByZXNzdXJlLmM7IG5vLW9wcyBiZWxvdyB3aGVuICFNRU1DR19WMS4gKi8KJiM0MztleHRlcm4gdm9pZCB2bXByZXNzdXJlX3YxX2luaXQoc3RydWN0IHZtcHJlc3N1cmUgKnZtcHIpOwomIzQzO2V4dGVybiB2b2lkIHZtcHJlc3N1cmVfdjFfY2xlYW51cChzdHJ1Y3Qgdm1wcmVzc3VyZSAqdm1wcik7CiYjNDM7ZXh0ZXJuIHZvaWQgdm1wcmVzc3VyZV92MV9hY2NvdW50X3RyZWUoc3RydWN0IHZtcHJlc3N1cmUgKnZtcHIsCiYjNDM7CQkJCSAgICAgICB1bnNpZ25lZCBsb25nIHNjYW5uZWQsCiYjNDM7CQkJCSAgICAgICB1bnNpZ25lZCBsb25nIHJlY2xhaW1lZCk7CiAjZWxzZQomIzQzO3N0YXRpYyBpbmxpbmUgdm9pZCB2bXByZXNzdXJlX3ByaW8oZ2ZwX3QgZ2ZwLCBzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csCiYjNDM7CQkJCSAgIGludCBwcmlvKSB7fQomIzQzO3N0YXRpYyBpbmxpbmUgdm9pZCB2bXByZXNzdXJlX3YxX2luaXQoc3RydWN0IHZtcHJlc3N1cmUgKnZtcHIpIHt9CiYjNDM7c3RhdGljIGlubGluZSB2b2lkIHZtcHJlc3N1cmVfdjFfY2xlYW51cChzdHJ1Y3Qgdm1wcmVzc3VyZSAqdm1wcikge30KJiM0MztzdGF0aWMgaW5saW5lIHZvaWQgdm1wcmVzc3VyZV92MV9hY2NvdW50X3RyZWUoc3RydWN0IHZtcHJlc3N1cmUgKnZtcHIsCiYjNDM7CQkJCQkgICAgICB1bnNpZ25lZCBsb25nIHNjYW5uZWQsCiYjNDM7CQkJCQkgICAgICB1bnNpZ25lZCBsb25nIHJlY2xhaW1lZCkge30KJiM0MzsjZW5kaWYgLyogQ09ORklHX01FTUNHX1YxICovCiYjNDM7CiYjNDM7I2Vsc2UgLyogIUNPTkZJR19NRU1DRyAqLwogc3RhdGljIGlubGluZSB2b2lkIHZtcHJlc3N1cmUoZ2ZwX3QgZ2ZwLCBpbnQgb3JkZXIsIHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZywKIAkJCSAgICAgIGJvb2wgdHJlZSwgdW5zaWduZWQgbG9uZyBzY2FubmVkLAogCQkJICAgICAgdW5zaWduZWQgbG9uZyByZWNsYWltZWQpIHt9CmRpZmYgLS1naXQgYS9tbS9NYWtlZmlsZSBiL21tL01ha2VmaWxlCmluZGV4IDRmYzcxMzg2N2I5YmQ4Li5kZTk5MTYzMGM5NmEzMiAxMDA2NDQKLS0tIGEvbW0vTWFrZWZpbGUKJiM0MzsmIzQzOyYjNDM7IGIvbW0vTWFrZWZpbGUKQEAgLTEwMSw3ICYjNDM7MTAxLDcgQEAgb2JqLSQoQ09ORklHX0RFVklDRV9NSUdSQVRJT04pICYjNDM7PSBtaWdyYXRlX2RldmljZS5vCiBvYmotJChDT05GSUdfVFJBTlNQQVJFTlRfSFVHRVBBR0UpICYjNDM7PSBodWdlX21lbW9yeS5vIGtodWdlcGFnZWQubwogb2JqLSQoQ09ORklHX1BBR0VfQ09VTlRFUikgJiM0Mzs9IHBhZ2VfY291bnRlci5vCiBvYmotJChDT05GSUdfTElWRVVQREFURV9NRU1GRCkgJiM0Mzs9IG1lbWZkX2x1by5vCi1vYmotJChDT05GSUdfTUVNQ0dfVjEpICYjNDM7PSBtZW1jb250cm9sLXYxLm8KJiM0MztvYmotJChDT05GSUdfTUVNQ0dfVjEpICYjNDM7PSBtZW1jb250cm9sLXYxLm8gdm1wcmVzc3VyZS12MS5vCiBvYmotJChDT05GSUdfTUVNQ0cpICYjNDM7PSBtZW1jb250cm9sLm8gdm1wcmVzc3VyZS5vCiBpZmRlZiBDT05GSUdfQlBGX1NZU0NBTEwKIG9iai0kKENPTkZJR19NRU1DRykgJiM0Mzs9IGJwZl9tZW1jb250cm9sLm8KZGlmZiAtLWdpdCBhL21tL3ZtcHJlc3N1cmUtdjEuYyBiL21tL3ZtcHJlc3N1cmUtdjEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMC4uZmQ4MTNjYmEwNTQ0NzAKLS0tIC9kZXYvbnVsbAomIzQzOyYjNDM7JiM0MzsgYi9tbS92bXByZXNzdXJlLXYxLmMKQEAgLTAsMCAmIzQzOzEsMzA1IEBACiYjNDM7Ly8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb25seQomIzQzOy8qCiYjNDM7ICogY2dyb3VwIHYxIHVzZXJzcGFjZSB2bXByZXNzdXJlIGludGVyZmFjZSAobWVtb3J5LnByZXNzdXJlX2xldmVsIC8KJiM0MzsgKiBjZ3JvdXAuZXZlbnRfY29udHJvbCkuIFNwbGl0IG91dCBvZiBtbS92bXByZXNzdXJlLmMgc28gdGhhdCB2Mi1vbmx5CiYjNDM7ICoga2VybmVscyAoQ09ORklHX01FTUNHX1YxPW4pIGRyb3AgdGhlIHdob2xlIGV2ZW50ZmQgYWNjdW11bGF0b3IsCiYjNDM7ICogaXRzIHdvcmsgaXRlbSwgYW5kIHRoZSBwZXItbWVtY2cgc3RhdGUgaXQgcmVxdWlyZXMuCiYjNDM7ICovCiYjNDM7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L2Nncm91cC5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9ldmVudGZkLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L2xpc3QuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvbG9nMi5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9tZW1jb250cm9sLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L211dGV4LmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L3NsYWIuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvc3RyaW5nLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L3N3YXAuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvdm1wcmVzc3VyZS5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC93b3JrcXVldWUuaCZndDsKJiM0MzsKJiM0MzsvKgomIzQzOyAqIFdoZW4gdGhlcmUgYXJlIHRvbyBsaXR0bGUgcGFnZXMgbGVmdCB0byBzY2FuLCB2bXByZXNzdXJlKCkgbWF5IG1pc3MgdGhlCiYjNDM7ICogY3JpdGljYWwgcHJlc3N1cmUgYXMgbnVtYmVyIG9mIHBhZ2VzIHdpbGwgYmUgbGVzcyB0aGFuICYjMzQ7d2luZG93IHNpemUmIzM0Oy4KJiM0MzsgKiBIb3dldmVyLCBpbiB0aGF0IGNhc2UgdGhlIHZtc2NhbiBwcmlvcml0eSB3aWxsIHJhaXNlIGZhc3QgYXMgdGhlCiYjNDM7ICogcmVjbGFpbWVyIHdpbGwgdHJ5IHRvIHNjYW4gTFJVcyBtb3JlIGRlZXBseS4KJiM0MzsgKgomIzQzOyAqIFRoZSB2bXNjYW4gbG9naWMgY29uc2lkZXJzIHRoZXNlIHNwZWNpYWwgcHJpb3JpdGllczoKJiM0MzsgKgomIzQzOyAqIHByaW8gPT0gREVGX1BSSU9SSVRZICgxMik6IHJlY2xhaW1lciBzdGFydHMgd2l0aCB0aGF0IHZhbHVlCiYjNDM7ICogcHJpbyAmbHQ7PSBERUZfUFJJT1JJVFkgLSAyIDoga3N3YXBkIGJlY29tZXMgc29tZXdoYXQgb3ZlcndoZWxtZWQKJiM0MzsgKiBwcmlvID09IDAgICAgICAgICAgICAgICAgOiBjbG9zZSB0byBPT00sIGtlcm5lbCBzY2FucyBldmVyeSBwYWdlIGluIGFuIGxydQomIzQzOyAqCiYjNDM7ICogQW55IHZhbHVlIGluIHRoaXMgcmFuZ2UgaXMgYWNjZXB0YWJsZSBmb3IgdGhpcyB0dW5hYmxlIChpLmUuIGZyb20gMTIgdG8KJiM0MzsgKiAwKS4gQ3VycmVudCB2YWx1ZSBmb3IgdGhlIHZtcHJlc3N1cmVfbGV2ZWxfY3JpdGljYWxfcHJpbyBpcyBjaG9zZW4KJiM0MzsgKiBlbXBpcmljYWxseSwgYnV0IHRoZSBudW1iZXIsIGluIGVzc2VuY2UsIG1lYW5zIHRoYXQgd2UgY29uc2lkZXIKJiM0MzsgKiBjcml0aWNhbCBsZXZlbCB3aGVuIHNjYW5uaW5nIGRlcHRoIGlzIH4xMCUgb2YgdGhlIGxydSBzaXplICh2bXNjYW4KJiM0MzsgKiBzY2FucyAmIzM5O2xydV9zaXplICZndDsmZ3Q7IHByaW8mIzM5OyBwYWdlcywgc28gaXQgaXMgYWN0dWFsbHkgMTIuNSUsIG9yIG9uZQomIzQzOyAqIGVpZ2h0cykuCiYjNDM7ICovCiYjNDM7c3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCB2bXByZXNzdXJlX2xldmVsX2NyaXRpY2FsX3ByaW8gPSBpbG9nMigxMDAgLyAxMCk7CiYjNDM7CiYjNDM7ZW51bSB2bXByZXNzdXJlX21vZGVzIHsKJiM0MzsJVk1QUkVTU1VSRV9OT19QQVNTVEhST1VHSCA9IDAsCiYjNDM7CVZNUFJFU1NVUkVfSElFUkFSQ0hZLAomIzQzOwlWTVBSRVNTVVJFX0xPQ0FMLAomIzQzOwlWTVBSRVNTVVJFX05VTV9NT0RFUywKJiM0Mzt9OwomIzQzOwomIzQzO3N0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgdm1wcmVzc3VyZV9zdHJfbGV2ZWxzW10gPSB7CiYjNDM7CVtWTVBSRVNTVVJFX0xPV10gPSAmIzM0O2xvdyYjMzQ7LAomIzQzOwlbVk1QUkVTU1VSRV9NRURJVU1dID0gJiMzNDttZWRpdW0mIzM0OywKJiM0MzsJW1ZNUFJFU1NVUkVfQ1JJVElDQUxdID0gJiMzNDtjcml0aWNhbCYjMzQ7LAomIzQzO307CiYjNDM7CiYjNDM7c3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB2bXByZXNzdXJlX3N0cl9tb2Rlc1tdID0gewomIzQzOwlbVk1QUkVTU1VSRV9OT19QQVNTVEhST1VHSF0gPSAmIzM0O2RlZmF1bHQmIzM0OywKJiM0MzsJW1ZNUFJFU1NVUkVfSElFUkFSQ0hZXSA9ICYjMzQ7aGllcmFyY2h5JiMzNDssCiYjNDM7CVtWTVBSRVNTVVJFX0xPQ0FMXSA9ICYjMzQ7bG9jYWwmIzM0OywKJiM0Mzt9OwomIzQzOwomIzQzO3N0cnVjdCB2bXByZXNzdXJlX2V2ZW50IHsKJiM0MzsJc3RydWN0IGV2ZW50ZmRfY3R4ICplZmQ7CiYjNDM7CWVudW0gdm1wcmVzc3VyZV9sZXZlbHMgbGV2ZWw7CiYjNDM7CWVudW0gdm1wcmVzc3VyZV9tb2RlcyBtb2RlOwomIzQzOwlzdHJ1Y3QgbGlzdF9oZWFkIG5vZGU7CiYjNDM7fTsKJiM0MzsKJiM0MztzdGF0aWMgc3RydWN0IHZtcHJlc3N1cmUgKndvcmtfdG9fdm1wcmVzc3VyZShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiYjNDM7ewomIzQzOwlyZXR1cm4gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCB2bXByZXNzdXJlLCB3b3JrKTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHN0cnVjdCB2bXByZXNzdXJlICp2bXByZXNzdXJlX3BhcmVudChzdHJ1Y3Qgdm1wcmVzc3VyZSAqdm1wcikKJiM0Mzt7CiYjNDM7CXN0cnVjdCBtZW1fY2dyb3VwICptZW1jZyA9IHZtcHJlc3N1cmVfdG9fbWVtY2codm1wcik7CiYjNDM7CiYjNDM7CW1lbWNnID0gcGFyZW50X21lbV9jZ3JvdXAobWVtY2cpOwomIzQzOwlpZiAoIW1lbWNnKQomIzQzOwkJcmV0dXJuIE5VTEw7CiYjNDM7CXJldHVybiBtZW1jZ190b192bXByZXNzdXJlKG1lbWNnKTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGJvb2wgdm1wcmVzc3VyZV9ldmVudChzdHJ1Y3Qgdm1wcmVzc3VyZSAqdm1wciwKJiM0MzsJCQkgICAgIGNvbnN0IGVudW0gdm1wcmVzc3VyZV9sZXZlbHMgbGV2ZWwsCiYjNDM7CQkJICAgICBib29sIGFuY2VzdG9yLCBib29sIHNpZ25hbGxlZCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCB2bXByZXNzdXJlX2V2ZW50ICpldjsKJiM0MzsJYm9vbCByZXQgPSBmYWxzZTsKJiM0MzsKJiM0MzsJbXV0ZXhfbG9jaygmYW1wO3ZtcHItJmd0O2V2ZW50c19sb2NrKTsKJiM0MzsJbGlzdF9mb3JfZWFjaF9lbnRyeShldiwgJmFtcDt2bXByLSZndDtldmVudHMsIG5vZGUpIHsKJiM0MzsJCWlmIChhbmNlc3RvciAmYW1wOyZhbXA7IGV2LSZndDttb2RlID09IFZNUFJFU1NVUkVfTE9DQUwpCiYjNDM7CQkJY29udGludWU7CiYjNDM7CQlpZiAoc2lnbmFsbGVkICZhbXA7JmFtcDsgZXYtJmd0O21vZGUgPT0gVk1QUkVTU1VSRV9OT19QQVNTVEhST1VHSCkKJiM0MzsJCQljb250aW51ZTsKJiM0MzsJCWlmIChsZXZlbCAmbHQ7IGV2LSZndDtsZXZlbCkKJiM0MzsJCQljb250aW51ZTsKJiM0MzsJCWV2ZW50ZmRfc2lnbmFsKGV2LSZndDtlZmQpOwomIzQzOwkJcmV0ID0gdHJ1ZTsKJiM0MzsJfQomIzQzOwltdXRleF91bmxvY2soJmFtcDt2bXByLSZndDtldmVudHNfbG9jayk7CiYjNDM7CiYjNDM7CXJldHVybiByZXQ7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkIHZtcHJlc3N1cmVfd29ya19mbihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiYjNDM7ewomIzQzOwlzdHJ1Y3Qgdm1wcmVzc3VyZSAqdm1wciA9IHdvcmtfdG9fdm1wcmVzc3VyZSh3b3JrKTsKJiM0MzsJdW5zaWduZWQgbG9uZyBzY2FubmVkOwomIzQzOwl1bnNpZ25lZCBsb25nIHJlY2xhaW1lZDsKJiM0MzsJZW51bSB2bXByZXNzdXJlX2xldmVscyBsZXZlbDsKJiM0MzsJYm9vbCBhbmNlc3RvciA9IGZhbHNlOwomIzQzOwlib29sIHNpZ25hbGxlZCA9IGZhbHNlOwomIzQzOwomIzQzOwlzcGluX2xvY2soJmFtcDt2bXByLSZndDtzcl9sb2NrKTsKJiM0MzsJLyoKJiM0MzsJICogU2V2ZXJhbCBjb250ZXh0cyBtaWdodCBiZSBjYWxsaW5nIHZtcHJlc3N1cmUoKSwgc28gaXQgaXMKJiM0MzsJICogcG9zc2libGUgdGhhdCB0aGUgd29yayB3YXMgcmVzY2hlZHVsZWQgYWdhaW4gYmVmb3JlIHRoZSBvbGQKJiM0MzsJICogd29yayBjb250ZXh0IGNsZWFyZWQgdGhlIGNvdW50ZXJzLiBJbiB0aGF0IGNhc2Ugd2Ugd2lsbCBydW4KJiM0MzsJICoganVzdCBhZnRlciB0aGUgb2xkIHdvcmsgcmV0dXJucywgYnV0IHRoZW4gc2Nhbm5lZCBtaWdodCBiZSB6ZXJvCiYjNDM7CSAqIGhlcmUuIE5vIG5lZWQgZm9yIGFueSBsb2NrcyBoZXJlIHNpbmNlIHdlIGRvbiYjMzk7dCBjYXJlIGlmCiYjNDM7CSAqIHZtcHItJmd0O3JlY2xhaW1lZCBpcyBpbiBzeW5jLgomIzQzOwkgKi8KJiM0MzsJc2Nhbm5lZCA9IHZtcHItJmd0O3RyZWVfc2Nhbm5lZDsKJiM0MzsJaWYgKCFzY2FubmVkKSB7CiYjNDM7CQlzcGluX3VubG9jaygmYW1wO3ZtcHItJmd0O3NyX2xvY2spOwomIzQzOwkJcmV0dXJuOwomIzQzOwl9CiYjNDM7CiYjNDM7CXJlY2xhaW1lZCA9IHZtcHItJmd0O3RyZWVfcmVjbGFpbWVkOwomIzQzOwl2bXByLSZndDt0cmVlX3NjYW5uZWQgPSAwOwomIzQzOwl2bXByLSZndDt0cmVlX3JlY2xhaW1lZCA9IDA7CiYjNDM7CXNwaW5fdW5sb2NrKCZhbXA7dm1wci0mZ3Q7c3JfbG9jayk7CiYjNDM7CiYjNDM7CWxldmVsID0gdm1wcmVzc3VyZV9jYWxjX2xldmVsKHNjYW5uZWQsIHJlY2xhaW1lZCk7CiYjNDM7CiYjNDM7CWRvIHsKJiM0MzsJCWlmICh2bXByZXNzdXJlX2V2ZW50KHZtcHIsIGxldmVsLCBhbmNlc3Rvciwgc2lnbmFsbGVkKSkKJiM0MzsJCQlzaWduYWxsZWQgPSB0cnVlOwomIzQzOwkJYW5jZXN0b3IgPSB0cnVlOwomIzQzOwl9IHdoaWxlICgodm1wciA9IHZtcHJlc3N1cmVfcGFyZW50KHZtcHIpKSk7CiYjNDM7fQomIzQzOwomIzQzOy8qCiYjNDM7ICogVHJlZS1tb2RlIGFjY3VtdWxhdG9yOiBhY2N1bXVsYXRlIHBlci1tZW1jZyBzY2FubmVkL3JlY2xhaW1lZCBhbmQKJiM0MzsgKiBzY2hlZHVsZSB0aGUgd29yayB0aGF0IHdhbGtzIHRoZSBwYXJlbnQgY2hhaW4gYW5kIHNpZ25hbHMgcmVnaXN0ZXJlZAomIzQzOyAqIGV2ZW50ZmQgbGlzdGVuZXJzIG9uY2Ugd2UgY3Jvc3MgdGhlIHdpbmRvdyB0aHJlc2hvbGQuCiYjNDM7ICovCiYjNDM7dm9pZCB2bXByZXNzdXJlX3YxX2FjY291bnRfdHJlZShzdHJ1Y3Qgdm1wcmVzc3VyZSAqdm1wciwKJiM0MzsJCQkJdW5zaWduZWQgbG9uZyBzY2FubmVkLAomIzQzOwkJCQl1bnNpZ25lZCBsb25nIHJlY2xhaW1lZCkKJiM0Mzt7CiYjNDM7CXNwaW5fbG9jaygmYW1wO3ZtcHItJmd0O3NyX2xvY2spOwomIzQzOwlzY2FubmVkID0gdm1wci0mZ3Q7dHJlZV9zY2FubmVkICYjNDM7PSBzY2FubmVkOwomIzQzOwl2bXByLSZndDt0cmVlX3JlY2xhaW1lZCAmIzQzOz0gcmVjbGFpbWVkOwomIzQzOwlzcGluX3VubG9jaygmYW1wO3ZtcHItJmd0O3NyX2xvY2spOwomIzQzOwomIzQzOwlpZiAoc2Nhbm5lZCAmbHQ7IHZtcHJlc3N1cmVfd2luKQomIzQzOwkJcmV0dXJuOwomIzQzOwlzY2hlZHVsZV93b3JrKCZhbXA7dm1wci0mZ3Q7d29yayk7CiYjNDM7fQomIzQzOwomIzQzO3ZvaWQgdm1wcmVzc3VyZV92MV9pbml0KHN0cnVjdCB2bXByZXNzdXJlICp2bXByKQomIzQzO3sKJiM0MzsJbXV0ZXhfaW5pdCgmYW1wO3ZtcHItJmd0O2V2ZW50c19sb2NrKTsKJiM0MzsJSU5JVF9MSVNUX0hFQUQoJmFtcDt2bXByLSZndDtldmVudHMpOwomIzQzOwlJTklUX1dPUksoJmFtcDt2bXByLSZndDt3b3JrLCB2bXByZXNzdXJlX3dvcmtfZm4pOwomIzQzO30KJiM0MzsKJiM0Mzt2b2lkIHZtcHJlc3N1cmVfdjFfY2xlYW51cChzdHJ1Y3Qgdm1wcmVzc3VyZSAqdm1wcikKJiM0Mzt7CiYjNDM7CS8qCiYjNDM7CSAqIE1ha2Ugc3VyZSB0aGVyZSBpcyBubyBwZW5kaW5nIHdvcmsgYmVmb3JlIGV2ZW50ZmQgaW5mcmFzdHJ1Y3R1cmUKJiM0MzsJICogZ29lcyBhd2F5LgomIzQzOwkgKi8KJiM0MzsJZmx1c2hfd29yaygmYW1wO3ZtcHItJmd0O3dvcmspOwomIzQzO30KJiM0MzsKJiM0MzsvKioKJiM0MzsgKiB2bXByZXNzdXJlX3ByaW8oKSAtIEFjY291bnQgbWVtb3J5IHByZXNzdXJlIHRocm91Z2ggcmVjbGFpbWVyIHByaW9yaXR5IGxldmVsCiYjNDM7ICogQGdmcDoJcmVjbGFpbWVyJiMzOTtzIGdmcCBtYXNrCiYjNDM7ICogQG1lbWNnOgljZ3JvdXAgbWVtb3J5IGNvbnRyb2xsZXIgaGFuZGxlCiYjNDM7ICogQHByaW86CXJlY2xhaW1lciYjMzk7cyBwcmlvcml0eQomIzQzOyAqCiYjNDM7ICogVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIGZyb20gdGhlIHJlY2xhaW0gcGF0aCBldmVyeSB0aW1lIHdoZW4KJiM0MzsgKiB0aGUgdm1zY2FuJiMzOTtzIHJlY2xhaW1pbmcgcHJpb3JpdHkgKHNjYW5uaW5nIGRlcHRoKSBjaGFuZ2VzLgomIzQzOyAqCiYjNDM7ICogVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCByZXR1cm4gYW55IHZhbHVlLgomIzQzOyAqLwomIzQzO3ZvaWQgdm1wcmVzc3VyZV9wcmlvKGdmcF90IGdmcCwgc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLCBpbnQgcHJpbykKJiM0Mzt7CiYjNDM7CS8qCiYjNDM7CSAqIFdlIG9ubHkgdXNlIHByaW8gZm9yIGFjY291bnRpbmcgY3JpdGljYWwgbGV2ZWwuIEZvciBtb3JlIGluZm8KJiM0MzsJICogc2VlIGNvbW1lbnQgZm9yIHZtcHJlc3N1cmVfbGV2ZWxfY3JpdGljYWxfcHJpbyB2YXJpYWJsZSBhYm92ZS4KJiM0MzsJICovCiYjNDM7CWlmIChwcmlvICZndDsgdm1wcmVzc3VyZV9sZXZlbF9jcml0aWNhbF9wcmlvKQomIzQzOwkJcmV0dXJuOwomIzQzOwomIzQzOwkvKgomIzQzOwkgKiBPSywgdGhlIHByaW8gaXMgYmVsb3cgdGhlIHRocmVzaG9sZCwgdXBkYXRpbmcgdm1wcmVzc3VyZQomIzQzOwkgKiBpbmZvcm1hdGlvbiBiZWZvcmUgc2hyaW5rZXIgZGl2ZXMgaW50byBsb25nIHNocmlua2luZyBvZiBsb25nCiYjNDM7CSAqIHJhbmdlIHZtc2Nhbi4gUGFzc2luZyBzY2FubmVkID0gdm1wcmVzc3VyZV93aW4sIHJlY2xhaW1lZCA9IDAKJiM0MzsJICogdG8gdGhlIHZtcHJlc3N1cmUoKSBiYXNpY2FsbHkgbWVhbnMgdGhhdCB3ZSBzaWduYWwgJiMzOTtjcml0aWNhbCYjMzk7CiYjNDM7CSAqIGxldmVsLgomIzQzOwkgKi8KJiM0MzsJdm1wcmVzc3VyZShnZnAsIDAsIG1lbWNnLCB0cnVlLCB2bXByZXNzdXJlX3dpbiwgMCk7CiYjNDM7fQomIzQzOwomIzQzOyNkZWZpbmUgTUFYX1ZNUFJFU1NVUkVfQVJHU19MRU4JKHN0cmxlbigmIzM0O2NyaXRpY2FsJiMzNDspICYjNDM7IHN0cmxlbigmIzM0O2hpZXJhcmNoeSYjMzQ7KSAmIzQzOyAyKQomIzQzOwomIzQzOy8qKgomIzQzOyAqIHZtcHJlc3N1cmVfcmVnaXN0ZXJfZXZlbnQoKSAtIEJpbmQgdm1wcmVzc3VyZSBub3RpZmljYXRpb25zIHRvIGFuIGV2ZW50ZmQKJiM0MzsgKiBAbWVtY2c6CW1lbWNnIHRoYXQgaXMgaW50ZXJlc3RlZCBpbiB2bXByZXNzdXJlIG5vdGlmaWNhdGlvbnMKJiM0MzsgKiBAZXZlbnRmZDoJZXZlbnRmZCBjb250ZXh0IHRvIGxpbmsgbm90aWZpY2F0aW9ucyB3aXRoCiYjNDM7ICogQGFyZ3M6CWV2ZW50IGFyZ3VtZW50cyAocHJlc3N1cmUgbGV2ZWwgdGhyZXNob2xkLCBvcHRpb25hbCBtb2RlKQomIzQzOyAqCiYjNDM7ICogVGhpcyBmdW5jdGlvbiBhc3NvY2lhdGVzIGV2ZW50ZmQgY29udGV4dCB3aXRoIHRoZSB2bXByZXNzdXJlCiYjNDM7ICogaW5mcmFzdHJ1Y3R1cmUsIHNvIHRoYXQgdGhlIG5vdGlmaWNhdGlvbnMgd2lsbCBiZSBkZWxpdmVyZWQgdG8gdGhlCiYjNDM7ICogQGV2ZW50ZmQuIFRoZSBAYXJncyBwYXJhbWV0ZXIgaXMgYSBjb21tYS1kZWxpbWl0ZWQgc3RyaW5nIHRoYXQgZGVub3RlcyBhCiYjNDM7ICogcHJlc3N1cmUgbGV2ZWwgdGhyZXNob2xkIChvbmUgb2Ygdm1wcmVzc3VyZV9zdHJfbGV2ZWxzLCBpLmUuICYjMzQ7bG93JiMzNDssICYjMzQ7bWVkaXVtJiMzNDssCiYjNDM7ICogb3IgJiMzNDtjcml0aWNhbCYjMzQ7KSBhbmQgYW4gb3B0aW9uYWwgbW9kZSAob25lIG9mIHZtcHJlc3N1cmVfc3RyX21vZGVzLCBpLmUuCiYjNDM7ICogJiMzNDtoaWVyYXJjaHkmIzM0OyBvciAmIzM0O2xvY2FsJiMzNDspLgomIzQzOyAqCiYjNDM7ICogVG8gYmUgdXNlZCBhcyBtZW1jZyBldmVudCBtZXRob2QuCiYjNDM7ICoKJiM0MzsgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgLUVOT01FTSBvbiBtZW1vcnkgZmFpbHVyZSBvciAtRUlOVkFMIGlmIEBhcmdzIGNvdWxkCiYjNDM7ICogbm90IGJlIHBhcnNlZC4KJiM0MzsgKi8KJiM0MztpbnQgdm1wcmVzc3VyZV9yZWdpc3Rlcl9ldmVudChzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csCiYjNDM7CQkJICAgICAgc3RydWN0IGV2ZW50ZmRfY3R4ICpldmVudGZkLCBjb25zdCBjaGFyICphcmdzKQomIzQzO3sKJiM0MzsJc3RydWN0IHZtcHJlc3N1cmUgKnZtcHIgPSBtZW1jZ190b192bXByZXNzdXJlKG1lbWNnKTsKJiM0MzsJc3RydWN0IHZtcHJlc3N1cmVfZXZlbnQgKmV2OwomIzQzOwllbnVtIHZtcHJlc3N1cmVfbW9kZXMgbW9kZSA9IFZNUFJFU1NVUkVfTk9fUEFTU1RIUk9VR0g7CiYjNDM7CWVudW0gdm1wcmVzc3VyZV9sZXZlbHMgbGV2ZWw7CiYjNDM7CWNoYXIgKnNwZWMsICpzcGVjX29yaWc7CiYjNDM7CWNoYXIgKnRva2VuOwomIzQzOwlpbnQgcmV0ID0gMDsKJiM0MzsKJiM0MzsJc3BlY19vcmlnID0gc3BlYyA9IGtzdHJuZHVwKGFyZ3MsIE1BWF9WTVBSRVNTVVJFX0FSR1NfTEVOLCBHRlBfS0VSTkVMKTsKJiM0MzsJaWYgKCFzcGVjKQomIzQzOwkJcmV0dXJuIC1FTk9NRU07CiYjNDM7CiYjNDM7CS8qIEZpbmQgcmVxdWlyZWQgbGV2ZWwgKi8KJiM0MzsJdG9rZW4gPSBzdHJzZXAoJmFtcDtzcGVjLCAmIzM0OywmIzM0Oyk7CiYjNDM7CXJldCA9IG1hdGNoX3N0cmluZyh2bXByZXNzdXJlX3N0cl9sZXZlbHMsIFZNUFJFU1NVUkVfTlVNX0xFVkVMUywgdG9rZW4pOwomIzQzOwlpZiAocmV0ICZsdDsgMCkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwlsZXZlbCA9IHJldDsKJiM0MzsKJiM0MzsJLyogRmluZCBvcHRpb25hbCBtb2RlICovCiYjNDM7CXRva2VuID0gc3Ryc2VwKCZhbXA7c3BlYywgJiMzNDssJiMzNDspOwomIzQzOwlpZiAodG9rZW4pIHsKJiM0MzsJCXJldCA9IG1hdGNoX3N0cmluZyh2bXByZXNzdXJlX3N0cl9tb2RlcywgVk1QUkVTU1VSRV9OVU1fTU9ERVMsIHRva2VuKTsKJiM0MzsJCWlmIChyZXQgJmx0OyAwKQomIzQzOwkJCWdvdG8gb3V0OwomIzQzOwkJbW9kZSA9IHJldDsKJiM0MzsJfQomIzQzOwomIzQzOwlldiA9IGt6YWxsb2Nfb2JqKCpldik7CiYjNDM7CWlmICghZXYpIHsKJiM0MzsJCXJldCA9IC1FTk9NRU07CiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJfQomIzQzOwomIzQzOwlldi0mZ3Q7ZWZkID0gZXZlbnRmZDsKJiM0MzsJZXYtJmd0O2xldmVsID0gbGV2ZWw7CiYjNDM7CWV2LSZndDttb2RlID0gbW9kZTsKJiM0MzsKJiM0MzsJbXV0ZXhfbG9jaygmYW1wO3ZtcHItJmd0O2V2ZW50c19sb2NrKTsKJiM0MzsJbGlzdF9hZGQoJmFtcDtldi0mZ3Q7bm9kZSwgJmFtcDt2bXByLSZndDtldmVudHMpOwomIzQzOwltdXRleF91bmxvY2soJmFtcDt2bXByLSZndDtldmVudHNfbG9jayk7CiYjNDM7CXJldCA9IDA7CiYjNDM7b3V0OgomIzQzOwlrZnJlZShzcGVjX29yaWcpOwomIzQzOwlyZXR1cm4gcmV0OwomIzQzO30KJiM0MzsKJiM0MzsvKioKJiM0MzsgKiB2bXByZXNzdXJlX3VucmVnaXN0ZXJfZXZlbnQoKSAtIFVuYmluZCBldmVudGZkIGZyb20gdm1wcmVzc3VyZQomIzQzOyAqIEBtZW1jZzoJbWVtY2cgaGFuZGxlCiYjNDM7ICogQGV2ZW50ZmQ6CWV2ZW50ZmQgY29udGV4dCB0aGF0IHdhcyB1c2VkIHRvIGxpbmsgdm1wcmVzc3VyZSB3aXRoIHRoZSBAY2cKJiM0MzsgKgomIzQzOyAqIFRoaXMgZnVuY3Rpb24gZG9lcyBpbnRlcm5hbCBtYW5pcHVsYXRpb25zIHRvIGRldGFjaCB0aGUgQGV2ZW50ZmQgZnJvbQomIzQzOyAqIHRoZSB2bXByZXNzdXJlIG5vdGlmaWNhdGlvbnMsIGFuZCB0aGVuIGZyZWVzIGludGVybmFsIHJlc291cmNlcwomIzQzOyAqIGFzc29jaWF0ZWQgd2l0aCB0aGUgQGV2ZW50ZmQgKGJ1dCB0aGUgQGV2ZW50ZmQgaXRzZWxmIGlzIG5vdCBmcmVlZCkuCiYjNDM7ICoKJiM0MzsgKiBUbyBiZSB1c2VkIGFzIG1lbWNnIGV2ZW50IG1ldGhvZC4KJiM0MzsgKi8KJiM0Mzt2b2lkIHZtcHJlc3N1cmVfdW5yZWdpc3Rlcl9ldmVudChzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csCiYjNDM7CQkJCSBzdHJ1Y3QgZXZlbnRmZF9jdHggKmV2ZW50ZmQpCiYjNDM7ewomIzQzOwlzdHJ1Y3Qgdm1wcmVzc3VyZSAqdm1wciA9IG1lbWNnX3RvX3ZtcHJlc3N1cmUobWVtY2cpOwomIzQzOwlzdHJ1Y3Qgdm1wcmVzc3VyZV9ldmVudCAqZXY7CiYjNDM7CiYjNDM7CW11dGV4X2xvY2soJmFtcDt2bXByLSZndDtldmVudHNfbG9jayk7CiYjNDM7CWxpc3RfZm9yX2VhY2hfZW50cnkoZXYsICZhbXA7dm1wci0mZ3Q7ZXZlbnRzLCBub2RlKSB7CiYjNDM7CQlpZiAoZXYtJmd0O2VmZCAhPSBldmVudGZkKQomIzQzOwkJCWNvbnRpbnVlOwomIzQzOwkJbGlzdF9kZWwoJmFtcDtldi0mZ3Q7bm9kZSk7CiYjNDM7CQlrZnJlZShldik7CiYjNDM7CQlicmVhazsKJiM0MzsJfQomIzQzOwltdXRleF91bmxvY2soJmFtcDt2bXByLSZndDtldmVudHNfbG9jayk7CiYjNDM7fQpkaWZmIC0tZ2l0IGEvbW0vdm1wcmVzc3VyZS5jIGIvbW0vdm1wcmVzc3VyZS5jCmluZGV4IGYwNTM1NTRlNTgyNjQyLi5iY2ZhNGJkOGZmYzUyOSAxMDA2NDQKLS0tIGEvbW0vdm1wcmVzc3VyZS5jCiYjNDM7JiM0MzsmIzQzOyBiL21tL3ZtcHJlc3N1cmUuYwpAQCAtNywxNiAmIzQzOzcsMTUgQEAKICAqCiAgKiBCYXNlZCBvbiBpZGVhcyBmcm9tIEFuZHJldyBNb3J0b24sIERhdmlkIFJpZW50amVzLCBLT1NBS0kgTW90b2hpcm8sCiAgKiBMZW9uaWQgTW9pc2VpY2h1aywgTWVsIEdvcm1hbiwgTWluY2hhbiBLaW0gYW5kIFBla2thIEVuYmVyZy4KJiM0MzsgKgomIzQzOyAqIFRyZWUtbW9kZSAoY2dyb3VwIHYxIHVzZXJzcGFjZSBldmVudGZkKSBib29ra2VlcGluZyBsaXZlcyBpbgomIzQzOyAqIG1tL3ZtcHJlc3N1cmUtdjEuYzsgdGhpcyBmaWxlIGhvbGRzIHRoZSBzaGFyZWQgY29kZSBhbmQgdGhlIGluLWtlcm5lbAomIzQzOyAqICh0cmVlPWZhbHNlKSBzb2NrZXQtcHJlc3N1cmUgcGF0aCB0aGF0IHJ1bnMgb24gY2dyb3VwIHYyLgogICovCiAKICNpbmNsdWRlICZsdDtsaW51eC9jZ3JvdXAuaCZndDsKLSNpbmNsdWRlICZsdDtsaW51eC9mcy5oJmd0OwogI2luY2x1ZGUgJmx0O2xpbnV4L2xvZzIuaCZndDsKLSNpbmNsdWRlICZsdDtsaW51eC9zY2hlZC5oJmd0OwogI2luY2x1ZGUgJmx0O2xpbnV4L21tLmgmZ3Q7Ci0jaW5jbHVkZSAmbHQ7bGludXgvdm1zdGF0LmgmZ3Q7Ci0jaW5jbHVkZSAmbHQ7bGludXgvZXZlbnRmZC5oJmd0OwotI2luY2x1ZGUgJmx0O2xpbnV4L3NsYWIuaCZndDsKICNpbmNsdWRlICZsdDtsaW51eC9zd2FwLmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7bGludXgvcHJpbnRrLmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7bGludXgvdm1wcmVzc3VyZS5oJmd0OwpAQCAtMzUsNyAmIzQzOzM0LDcgQEAKICAqIFRPRE86IE1ha2UgdGhlIHdpbmRvdyBzaXplIGRlcGVuZCBvbiBtYWNoaW5lIHNpemUsIGFzIHdlIGRvIGZvciB2bXN0YXQKICAqIHRocmVzaG9sZHMuIEN1cnJlbnRseSB3ZSBzZXQgaXQgdG8gNTEyIHBhZ2VzICgyTUIgZm9yIDRLQiBwYWdlcykuCiAgKi8KLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIHZtcHJlc3N1cmVfd2luID0gU1dBUF9DTFVTVEVSX01BWCAqIDE2OwomIzQzO2NvbnN0IHVuc2lnbmVkIGxvbmcgdm1wcmVzc3VyZV93aW4gPSBTV0FQX0NMVVNURVJfTUFYICogMTY7CiAKIC8qCiAgKiBUaGVzZSB0aHJlc2hvbGRzIGFyZSB1c2VkIHdoZW4gd2UgYWNjb3VudCBtZW1vcnkgcHJlc3N1cmUgdGhyb3VnaApAQCAtNDYsNjggJiM0Mzs0NSw2IEBAIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIHZtcHJlc3N1cmVfd2luID0gU1dBUF9DTFVTVEVSX01BWCAqIDE2Owogc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCB2bXByZXNzdXJlX2xldmVsX21lZCA9IDYwOwogc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCB2bXByZXNzdXJlX2xldmVsX2NyaXRpY2FsID0gOTU7CiAKLS8qCi0gKiBXaGVuIHRoZXJlIGFyZSB0b28gbGl0dGxlIHBhZ2VzIGxlZnQgdG8gc2Nhbiwgdm1wcmVzc3VyZSgpIG1heSBtaXNzIHRoZQotICogY3JpdGljYWwgcHJlc3N1cmUgYXMgbnVtYmVyIG9mIHBhZ2VzIHdpbGwgYmUgbGVzcyB0aGFuICYjMzQ7d2luZG93IHNpemUmIzM0Oy4KLSAqIEhvd2V2ZXIsIGluIHRoYXQgY2FzZSB0aGUgdm1zY2FuIHByaW9yaXR5IHdpbGwgcmFpc2UgZmFzdCBhcyB0aGUKLSAqIHJlY2xhaW1lciB3aWxsIHRyeSB0byBzY2FuIExSVXMgbW9yZSBkZWVwbHkuCi0gKgotICogVGhlIHZtc2NhbiBsb2dpYyBjb25zaWRlcnMgdGhlc2Ugc3BlY2lhbCBwcmlvcml0aWVzOgotICoKLSAqIHByaW8gPT0gREVGX1BSSU9SSVRZICgxMik6IHJlY2xhaW1lciBzdGFydHMgd2l0aCB0aGF0IHZhbHVlCi0gKiBwcmlvICZsdDs9IERFRl9QUklPUklUWSAtIDIgOiBrc3dhcGQgYmVjb21lcyBzb21ld2hhdCBvdmVyd2hlbG1lZAotICogcHJpbyA9PSAwICAgICAgICAgICAgICAgIDogY2xvc2UgdG8gT09NLCBrZXJuZWwgc2NhbnMgZXZlcnkgcGFnZSBpbiBhbiBscnUKLSAqCi0gKiBBbnkgdmFsdWUgaW4gdGhpcyByYW5nZSBpcyBhY2NlcHRhYmxlIGZvciB0aGlzIHR1bmFibGUgKGkuZS4gZnJvbSAxMiB0bwotICogMCkuIEN1cnJlbnQgdmFsdWUgZm9yIHRoZSB2bXByZXNzdXJlX2xldmVsX2NyaXRpY2FsX3ByaW8gaXMgY2hvc2VuCi0gKiBlbXBpcmljYWxseSwgYnV0IHRoZSBudW1iZXIsIGluIGVzc2VuY2UsIG1lYW5zIHRoYXQgd2UgY29uc2lkZXIKLSAqIGNyaXRpY2FsIGxldmVsIHdoZW4gc2Nhbm5pbmcgZGVwdGggaXMgfjEwJSBvZiB0aGUgbHJ1IHNpemUgKHZtc2NhbgotICogc2NhbnMgJiMzOTtscnVfc2l6ZSAmZ3Q7Jmd0OyBwcmlvJiMzOTsgcGFnZXMsIHNvIGl0IGlzIGFjdHVhbGx5IDEyLjUlLCBvciBvbmUKLSAqIGVpZ2h0cykuCi0gKi8KLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgdm1wcmVzc3VyZV9sZXZlbF9jcml0aWNhbF9wcmlvID0gaWxvZzIoMTAwIC8gMTApOwotCi1zdGF0aWMgc3RydWN0IHZtcHJlc3N1cmUgKndvcmtfdG9fdm1wcmVzc3VyZShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCi17Ci0JcmV0dXJuIGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3Qgdm1wcmVzc3VyZSwgd29yayk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3Qgdm1wcmVzc3VyZSAqdm1wcmVzc3VyZV9wYXJlbnQoc3RydWN0IHZtcHJlc3N1cmUgKnZtcHIpCi17Ci0Jc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnID0gdm1wcmVzc3VyZV90b19tZW1jZyh2bXByKTsKLQotCW1lbWNnID0gcGFyZW50X21lbV9jZ3JvdXAobWVtY2cpOwotCWlmICghbWVtY2cpCi0JCXJldHVybiBOVUxMOwotCXJldHVybiBtZW1jZ190b192bXByZXNzdXJlKG1lbWNnKTsKLX0KLQotZW51bSB2bXByZXNzdXJlX2xldmVscyB7Ci0JVk1QUkVTU1VSRV9MT1cgPSAwLAotCVZNUFJFU1NVUkVfTUVESVVNLAotCVZNUFJFU1NVUkVfQ1JJVElDQUwsCi0JVk1QUkVTU1VSRV9OVU1fTEVWRUxTLAotfTsKLQotZW51bSB2bXByZXNzdXJlX21vZGVzIHsKLQlWTVBSRVNTVVJFX05PX1BBU1NUSFJPVUdIID0gMCwKLQlWTVBSRVNTVVJFX0hJRVJBUkNIWSwKLQlWTVBSRVNTVVJFX0xPQ0FMLAotCVZNUFJFU1NVUkVfTlVNX01PREVTLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB2bXByZXNzdXJlX3N0cl9sZXZlbHNbXSA9IHsKLQlbVk1QUkVTU1VSRV9MT1ddID0gJiMzNDtsb3cmIzM0OywKLQlbVk1QUkVTU1VSRV9NRURJVU1dID0gJiMzNDttZWRpdW0mIzM0OywKLQlbVk1QUkVTU1VSRV9DUklUSUNBTF0gPSAmIzM0O2NyaXRpY2FsJiMzNDssCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHZtcHJlc3N1cmVfc3RyX21vZGVzW10gPSB7Ci0JW1ZNUFJFU1NVUkVfTk9fUEFTU1RIUk9VR0hdID0gJiMzNDtkZWZhdWx0JiMzNDssCi0JW1ZNUFJFU1NVUkVfSElFUkFSQ0hZXSA9ICYjMzQ7aGllcmFyY2h5JiMzNDssCi0JW1ZNUFJFU1NVUkVfTE9DQUxdID0gJiMzNDtsb2NhbCYjMzQ7LAotfTsKLQogc3RhdGljIGVudW0gdm1wcmVzc3VyZV9sZXZlbHMgdm1wcmVzc3VyZV9sZXZlbCh1bnNpZ25lZCBsb25nIHByZXNzdXJlKQogewogCWlmIChwcmVzc3VyZSAmZ3Q7PSB2bXByZXNzdXJlX2xldmVsX2NyaXRpY2FsKQpAQCAtMTE3LDggJiM0Mzs1NCw4IEBAIHN0YXRpYyBlbnVtIHZtcHJlc3N1cmVfbGV2ZWxzIHZtcHJlc3N1cmVfbGV2ZWwodW5zaWduZWQgbG9uZyBwcmVzc3VyZSkKIAlyZXR1cm4gVk1QUkVTU1VSRV9MT1c7CiB9CiAKLXN0YXRpYyBlbnVtIHZtcHJlc3N1cmVfbGV2ZWxzIHZtcHJlc3N1cmVfY2FsY19sZXZlbCh1bnNpZ25lZCBsb25nIHNjYW5uZWQsCi0JCQkJCQkgICAgdW5zaWduZWQgbG9uZyByZWNsYWltZWQpCiYjNDM7ZW51bSB2bXByZXNzdXJlX2xldmVscyB2bXByZXNzdXJlX2NhbGNfbGV2ZWwodW5zaWduZWQgbG9uZyBzY2FubmVkLAomIzQzOwkJCQkJICAgICB1bnNpZ25lZCBsb25nIHJlY2xhaW1lZCkKIHsKIAl1bnNpZ25lZCBsb25nIHNjYWxlID0gc2Nhbm5lZCAmIzQzOyByZWNsYWltZWQ7CiAJdW5zaWduZWQgbG9uZyBwcmVzc3VyZSA9IDA7CkBAIC0xNDcsNzQgJiM0Mzs4NCw2IEBAIHN0YXRpYyBlbnVtIHZtcHJlc3N1cmVfbGV2ZWxzIHZtcHJlc3N1cmVfY2FsY19sZXZlbCh1bnNpZ25lZCBsb25nIHNjYW5uZWQsCiAJcmV0dXJuIHZtcHJlc3N1cmVfbGV2ZWwocHJlc3N1cmUpOwogfQogCi1zdHJ1Y3Qgdm1wcmVzc3VyZV9ldmVudCB7Ci0Jc3RydWN0IGV2ZW50ZmRfY3R4ICplZmQ7Ci0JZW51bSB2bXByZXNzdXJlX2xldmVscyBsZXZlbDsKLQllbnVtIHZtcHJlc3N1cmVfbW9kZXMgbW9kZTsKLQlzdHJ1Y3QgbGlzdF9oZWFkIG5vZGU7Ci19OwotCi1zdGF0aWMgYm9vbCB2bXByZXNzdXJlX2V2ZW50KHN0cnVjdCB2bXByZXNzdXJlICp2bXByLAotCQkJICAgICBjb25zdCBlbnVtIHZtcHJlc3N1cmVfbGV2ZWxzIGxldmVsLAotCQkJICAgICBib29sIGFuY2VzdG9yLCBib29sIHNpZ25hbGxlZCkKLXsKLQlzdHJ1Y3Qgdm1wcmVzc3VyZV9ldmVudCAqZXY7Ci0JYm9vbCByZXQgPSBmYWxzZTsKLQotCW11dGV4X2xvY2soJmFtcDt2bXByLSZndDtldmVudHNfbG9jayk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeShldiwgJmFtcDt2bXByLSZndDtldmVudHMsIG5vZGUpIHsKLQkJaWYgKGFuY2VzdG9yICZhbXA7JmFtcDsgZXYtJmd0O21vZGUgPT0gVk1QUkVTU1VSRV9MT0NBTCkKLQkJCWNvbnRpbnVlOwotCQlpZiAoc2lnbmFsbGVkICZhbXA7JmFtcDsgZXYtJmd0O21vZGUgPT0gVk1QUkVTU1VSRV9OT19QQVNTVEhST1VHSCkKLQkJCWNvbnRpbnVlOwotCQlpZiAobGV2ZWwgJmx0OyBldi0mZ3Q7bGV2ZWwpCi0JCQljb250aW51ZTsKLQkJZXZlbnRmZF9zaWduYWwoZXYtJmd0O2VmZCk7Ci0JCXJldCA9IHRydWU7Ci0JfQotCW11dGV4X3VubG9jaygmYW1wO3ZtcHItJmd0O2V2ZW50c19sb2NrKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyB2b2lkIHZtcHJlc3N1cmVfd29ya19mbihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCi17Ci0Jc3RydWN0IHZtcHJlc3N1cmUgKnZtcHIgPSB3b3JrX3RvX3ZtcHJlc3N1cmUod29yayk7Ci0JdW5zaWduZWQgbG9uZyBzY2FubmVkOwotCXVuc2lnbmVkIGxvbmcgcmVjbGFpbWVkOwotCWVudW0gdm1wcmVzc3VyZV9sZXZlbHMgbGV2ZWw7Ci0JYm9vbCBhbmNlc3RvciA9IGZhbHNlOwotCWJvb2wgc2lnbmFsbGVkID0gZmFsc2U7Ci0KLQlzcGluX2xvY2soJmFtcDt2bXByLSZndDtzcl9sb2NrKTsKLQkvKgotCSAqIFNldmVyYWwgY29udGV4dHMgbWlnaHQgYmUgY2FsbGluZyB2bXByZXNzdXJlKCksIHNvIGl0IGlzCi0JICogcG9zc2libGUgdGhhdCB0aGUgd29yayB3YXMgcmVzY2hlZHVsZWQgYWdhaW4gYmVmb3JlIHRoZSBvbGQKLQkgKiB3b3JrIGNvbnRleHQgY2xlYXJlZCB0aGUgY291bnRlcnMuIEluIHRoYXQgY2FzZSB3ZSB3aWxsIHJ1bgotCSAqIGp1c3QgYWZ0ZXIgdGhlIG9sZCB3b3JrIHJldHVybnMsIGJ1dCB0aGVuIHNjYW5uZWQgbWlnaHQgYmUgemVybwotCSAqIGhlcmUuIE5vIG5lZWQgZm9yIGFueSBsb2NrcyBoZXJlIHNpbmNlIHdlIGRvbiYjMzk7dCBjYXJlIGlmCi0JICogdm1wci0mZ3Q7cmVjbGFpbWVkIGlzIGluIHN5bmMuCi0JICovCi0Jc2Nhbm5lZCA9IHZtcHItJmd0O3RyZWVfc2Nhbm5lZDsKLQlpZiAoIXNjYW5uZWQpIHsKLQkJc3Bpbl91bmxvY2soJmFtcDt2bXByLSZndDtzcl9sb2NrKTsKLQkJcmV0dXJuOwotCX0KLQotCXJlY2xhaW1lZCA9IHZtcHItJmd0O3RyZWVfcmVjbGFpbWVkOwotCXZtcHItJmd0O3RyZWVfc2Nhbm5lZCA9IDA7Ci0Jdm1wci0mZ3Q7dHJlZV9yZWNsYWltZWQgPSAwOwotCXNwaW5fdW5sb2NrKCZhbXA7dm1wci0mZ3Q7c3JfbG9jayk7Ci0KLQlsZXZlbCA9IHZtcHJlc3N1cmVfY2FsY19sZXZlbChzY2FubmVkLCByZWNsYWltZWQpOwotCi0JZG8gewotCQlpZiAodm1wcmVzc3VyZV9ldmVudCh2bXByLCBsZXZlbCwgYW5jZXN0b3IsIHNpZ25hbGxlZCkpCi0JCQlzaWduYWxsZWQgPSB0cnVlOwotCQlhbmNlc3RvciA9IHRydWU7Ci0JfSB3aGlsZSAoKHZtcHIgPSB2bXByZXNzdXJlX3BhcmVudCh2bXByKSkpOwotfQotCiAvKioKICAqIHZtcHJlc3N1cmUoKSAtIEFjY291bnQgbWVtb3J5IHByZXNzdXJlIHRocm91Z2ggc2Nhbm5lZC9yZWNsYWltZWQgcmF0aW8KICAqIEBnZnA6CXJlY2xhaW1lciYjMzk7cyBnZnAgbWFzawpAQCAtMjQ2LDExICYjNDM7MTE1LDEzIEBAIHZvaWQgdm1wcmVzc3VyZShnZnBfdCBnZnAsIGludCBvcmRlciwgc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLCBib29sIHRyZWUsCiAJCXJldHVybjsKIAogCS8qCi0JICogVGhlIGluLWtlcm5lbCB1c2VycyBvbmx5IGNhcmUgYWJvdXQgdGhlIHJlY2xhaW0gZWZmaWNpZW5jeQotCSAqIGZvciB0aGlzIEBtZW1jZyByYXRoZXIgdGhhbiB0aGUgd2hvbGUgc3VidHJlZSwgYW5kIHRoZXJlCi0JICogaXNuJiMzOTt0IGFuZCB3b24mIzM5O3QgYmUgYW55IGluLWtlcm5lbCB1c2VyIGluIGEgbGVnYWN5IGNncm91cC4KJiM0MzsJICogT25seSB0d28gY29tYmluYXRpb25zIGhhdmUgYSBjb25zdW1lcjoKJiM0MzsJICogICBjZ3JvdXAgdjIgJiM0MzsgdHJlZT1mYWxzZSAtJmd0OyBpbi1rZXJuZWwgc29ja2V0IHByZXNzdXJlCiYjNDM7CSAqICAgY2dyb3VwIHYxICYjNDM7IHRyZWU9dHJ1ZSAgLSZndDsgdXNlcnNwYWNlIGV2ZW50ZmRzIChtZW1vcnkucHJlc3N1cmVfbGV2ZWwpCiYjNDM7CSAqIFNraXAgdGhlIG90aGVyIHR3bzogbm90aGluZyBjb25zdW1lcyB0aGUgcmVzdWx0LgogCSAqLwotCWlmICghY2dyb3VwX3N1YnN5c19vbl9kZmwobWVtb3J5X2NncnBfc3Vic3lzKSAmYW1wOyZhbXA7ICF0cmVlKQomIzQzOwlpZiAoKCFjZ3JvdXBfc3Vic3lzX29uX2RmbChtZW1vcnlfY2dycF9zdWJzeXMpICZhbXA7JmFtcDsgIXRyZWUpIHx8CiYjNDM7CSAgICAoY2dyb3VwX3N1YnN5c19vbl9kZmwobWVtb3J5X2NncnBfc3Vic3lzKSAmYW1wOyZhbXA7IHRyZWUpKQogCQlyZXR1cm47CiAKIAl2bXByID0gbWVtY2dfdG9fdm1wcmVzc3VyZShtZW1jZyk7CkBAIC0yODEsMTQgJiM0MzsxNTIsNyBAQCB2b2lkIHZtcHJlc3N1cmUoZ2ZwX3QgZ2ZwLCBpbnQgb3JkZXIsIHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZywgYm9vbCB0cmVlLAogCQlyZXR1cm47CiAKIAlpZiAodHJlZSkgewotCQlzcGluX2xvY2soJmFtcDt2bXByLSZndDtzcl9sb2NrKTsKLQkJc2Nhbm5lZCA9IHZtcHItJmd0O3RyZWVfc2Nhbm5lZCAmIzQzOz0gc2Nhbm5lZDsKLQkJdm1wci0mZ3Q7dHJlZV9yZWNsYWltZWQgJiM0Mzs9IHJlY2xhaW1lZDsKLQkJc3Bpbl91bmxvY2soJmFtcDt2bXByLSZndDtzcl9sb2NrKTsKLQotCQlpZiAoc2Nhbm5lZCAmbHQ7IHZtcHJlc3N1cmVfd2luKQotCQkJcmV0dXJuOwotCQlzY2hlZHVsZV93b3JrKCZhbXA7dm1wci0mZ3Q7d29yayk7CiYjNDM7CQl2bXByZXNzdXJlX3YxX2FjY291bnRfdHJlZSh2bXByLCBzY2FubmVkLCByZWNsYWltZWQpOwogCX0gZWxzZSB7CiAJCWVudW0gdm1wcmVzc3VyZV9sZXZlbHMgbGV2ZWw7CiAKQEAgLTMzMCwxMzQgJiM0MzsxOTQsNiBAQCB2b2lkIHZtcHJlc3N1cmUoZ2ZwX3QgZ2ZwLCBpbnQgb3JkZXIsIHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZywgYm9vbCB0cmVlLAogCX0KIH0KIAotLyoqCi0gKiB2bXByZXNzdXJlX3ByaW8oKSAtIEFjY291bnQgbWVtb3J5IHByZXNzdXJlIHRocm91Z2ggcmVjbGFpbWVyIHByaW9yaXR5IGxldmVsCi0gKiBAZ2ZwOglyZWNsYWltZXImIzM5O3MgZ2ZwIG1hc2sKLSAqIEBtZW1jZzoJY2dyb3VwIG1lbW9yeSBjb250cm9sbGVyIGhhbmRsZQotICogQHByaW86CXJlY2xhaW1lciYjMzk7cyBwcmlvcml0eQotICoKLSAqIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBmcm9tIHRoZSByZWNsYWltIHBhdGggZXZlcnkgdGltZSB3aGVuCi0gKiB0aGUgdm1zY2FuJiMzOTtzIHJlY2xhaW1pbmcgcHJpb3JpdHkgKHNjYW5uaW5nIGRlcHRoKSBjaGFuZ2VzLgotICoKLSAqIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgcmV0dXJuIGFueSB2YWx1ZS4KLSAqLwotdm9pZCB2bXByZXNzdXJlX3ByaW8oZ2ZwX3QgZ2ZwLCBzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csIGludCBwcmlvKQotewotCS8qCi0JICogV2Ugb25seSB1c2UgcHJpbyBmb3IgYWNjb3VudGluZyBjcml0aWNhbCBsZXZlbC4gRm9yIG1vcmUgaW5mbwotCSAqIHNlZSBjb21tZW50IGZvciB2bXByZXNzdXJlX2xldmVsX2NyaXRpY2FsX3ByaW8gdmFyaWFibGUgYWJvdmUuCi0JICovCi0JaWYgKHByaW8gJmd0OyB2bXByZXNzdXJlX2xldmVsX2NyaXRpY2FsX3ByaW8pCi0JCXJldHVybjsKLQotCS8qCi0JICogT0ssIHRoZSBwcmlvIGlzIGJlbG93IHRoZSB0aHJlc2hvbGQsIHVwZGF0aW5nIHZtcHJlc3N1cmUKLQkgKiBpbmZvcm1hdGlvbiBiZWZvcmUgc2hyaW5rZXIgZGl2ZXMgaW50byBsb25nIHNocmlua2luZyBvZiBsb25nCi0JICogcmFuZ2Ugdm1zY2FuLiBQYXNzaW5nIHNjYW5uZWQgPSB2bXByZXNzdXJlX3dpbiwgcmVjbGFpbWVkID0gMAotCSAqIHRvIHRoZSB2bXByZXNzdXJlKCkgYmFzaWNhbGx5IG1lYW5zIHRoYXQgd2Ugc2lnbmFsICYjMzk7Y3JpdGljYWwmIzM5OwotCSAqIGxldmVsLgotCSAqLwotCXZtcHJlc3N1cmUoZ2ZwLCAwLCBtZW1jZywgdHJ1ZSwgdm1wcmVzc3VyZV93aW4sIDApOwotfQotCi0jZGVmaW5lIE1BWF9WTVBSRVNTVVJFX0FSR1NfTEVOCShzdHJsZW4oJiMzNDtjcml0aWNhbCYjMzQ7KSAmIzQzOyBzdHJsZW4oJiMzNDtoaWVyYXJjaHkmIzM0OykgJiM0MzsgMikKLQotLyoqCi0gKiB2bXByZXNzdXJlX3JlZ2lzdGVyX2V2ZW50KCkgLSBCaW5kIHZtcHJlc3N1cmUgbm90aWZpY2F0aW9ucyB0byBhbiBldmVudGZkCi0gKiBAbWVtY2c6CW1lbWNnIHRoYXQgaXMgaW50ZXJlc3RlZCBpbiB2bXByZXNzdXJlIG5vdGlmaWNhdGlvbnMKLSAqIEBldmVudGZkOglldmVudGZkIGNvbnRleHQgdG8gbGluayBub3RpZmljYXRpb25zIHdpdGgKLSAqIEBhcmdzOglldmVudCBhcmd1bWVudHMgKHByZXNzdXJlIGxldmVsIHRocmVzaG9sZCwgb3B0aW9uYWwgbW9kZSkKLSAqCi0gKiBUaGlzIGZ1bmN0aW9uIGFzc29jaWF0ZXMgZXZlbnRmZCBjb250ZXh0IHdpdGggdGhlIHZtcHJlc3N1cmUKLSAqIGluZnJhc3RydWN0dXJlLCBzbyB0aGF0IHRoZSBub3RpZmljYXRpb25zIHdpbGwgYmUgZGVsaXZlcmVkIHRvIHRoZQotICogQGV2ZW50ZmQuIFRoZSBAYXJncyBwYXJhbWV0ZXIgaXMgYSBjb21tYS1kZWxpbWl0ZWQgc3RyaW5nIHRoYXQgZGVub3RlcyBhCi0gKiBwcmVzc3VyZSBsZXZlbCB0aHJlc2hvbGQgKG9uZSBvZiB2bXByZXNzdXJlX3N0cl9sZXZlbHMsIGkuZS4gJiMzNDtsb3cmIzM0OywgJiMzNDttZWRpdW0mIzM0OywKLSAqIG9yICYjMzQ7Y3JpdGljYWwmIzM0OykgYW5kIGFuIG9wdGlvbmFsIG1vZGUgKG9uZSBvZiB2bXByZXNzdXJlX3N0cl9tb2RlcywgaS5lLgotICogJiMzNDtoaWVyYXJjaHkmIzM0OyBvciAmIzM0O2xvY2FsJiMzNDspLgotICoKLSAqIFRvIGJlIHVzZWQgYXMgbWVtY2cgZXZlbnQgbWV0aG9kLgotICoKLSAqIFJldHVybjogMCBvbiBzdWNjZXNzLCAtRU5PTUVNIG9uIG1lbW9yeSBmYWlsdXJlIG9yIC1FSU5WQUwgaWYgQGFyZ3MgY291bGQKLSAqIG5vdCBiZSBwYXJzZWQuCi0gKi8KLWludCB2bXByZXNzdXJlX3JlZ2lzdGVyX2V2ZW50KHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZywKLQkJCSAgICAgIHN0cnVjdCBldmVudGZkX2N0eCAqZXZlbnRmZCwgY29uc3QgY2hhciAqYXJncykKLXsKLQlzdHJ1Y3Qgdm1wcmVzc3VyZSAqdm1wciA9IG1lbWNnX3RvX3ZtcHJlc3N1cmUobWVtY2cpOwotCXN0cnVjdCB2bXByZXNzdXJlX2V2ZW50ICpldjsKLQllbnVtIHZtcHJlc3N1cmVfbW9kZXMgbW9kZSA9IFZNUFJFU1NVUkVfTk9fUEFTU1RIUk9VR0g7Ci0JZW51bSB2bXByZXNzdXJlX2xldmVscyBsZXZlbDsKLQljaGFyICpzcGVjLCAqc3BlY19vcmlnOwotCWNoYXIgKnRva2VuOwotCWludCByZXQgPSAwOwotCi0Jc3BlY19vcmlnID0gc3BlYyA9IGtzdHJuZHVwKGFyZ3MsIE1BWF9WTVBSRVNTVVJFX0FSR1NfTEVOLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXNwZWMpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JLyogRmluZCByZXF1aXJlZCBsZXZlbCAqLwotCXRva2VuID0gc3Ryc2VwKCZhbXA7c3BlYywgJiMzNDssJiMzNDspOwotCXJldCA9IG1hdGNoX3N0cmluZyh2bXByZXNzdXJlX3N0cl9sZXZlbHMsIFZNUFJFU1NVUkVfTlVNX0xFVkVMUywgdG9rZW4pOwotCWlmIChyZXQgJmx0OyAwKQotCQlnb3RvIG91dDsKLQlsZXZlbCA9IHJldDsKLQotCS8qIEZpbmQgb3B0aW9uYWwgbW9kZSAqLwotCXRva2VuID0gc3Ryc2VwKCZhbXA7c3BlYywgJiMzNDssJiMzNDspOwotCWlmICh0b2tlbikgewotCQlyZXQgPSBtYXRjaF9zdHJpbmcodm1wcmVzc3VyZV9zdHJfbW9kZXMsIFZNUFJFU1NVUkVfTlVNX01PREVTLCB0b2tlbik7Ci0JCWlmIChyZXQgJmx0OyAwKQotCQkJZ290byBvdXQ7Ci0JCW1vZGUgPSByZXQ7Ci0JfQotCi0JZXYgPSBremFsbG9jX29iaigqZXYpOwotCWlmICghZXYpIHsKLQkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBvdXQ7Ci0JfQotCi0JZXYtJmd0O2VmZCA9IGV2ZW50ZmQ7Ci0JZXYtJmd0O2xldmVsID0gbGV2ZWw7Ci0JZXYtJmd0O21vZGUgPSBtb2RlOwotCi0JbXV0ZXhfbG9jaygmYW1wO3ZtcHItJmd0O2V2ZW50c19sb2NrKTsKLQlsaXN0X2FkZCgmYW1wO2V2LSZndDtub2RlLCAmYW1wO3ZtcHItJmd0O2V2ZW50cyk7Ci0JbXV0ZXhfdW5sb2NrKCZhbXA7dm1wci0mZ3Q7ZXZlbnRzX2xvY2spOwotCXJldCA9IDA7Ci1vdXQ6Ci0Ja2ZyZWUoc3BlY19vcmlnKTsKLQlyZXR1cm4gcmV0OwotfQotCi0vKioKLSAqIHZtcHJlc3N1cmVfdW5yZWdpc3Rlcl9ldmVudCgpIC0gVW5iaW5kIGV2ZW50ZmQgZnJvbSB2bXByZXNzdXJlCi0gKiBAbWVtY2c6CW1lbWNnIGhhbmRsZQotICogQGV2ZW50ZmQ6CWV2ZW50ZmQgY29udGV4dCB0aGF0IHdhcyB1c2VkIHRvIGxpbmsgdm1wcmVzc3VyZSB3aXRoIHRoZSBAY2cKLSAqCi0gKiBUaGlzIGZ1bmN0aW9uIGRvZXMgaW50ZXJuYWwgbWFuaXB1bGF0aW9ucyB0byBkZXRhY2ggdGhlIEBldmVudGZkIGZyb20KLSAqIHRoZSB2bXByZXNzdXJlIG5vdGlmaWNhdGlvbnMsIGFuZCB0aGVuIGZyZWVzIGludGVybmFsIHJlc291cmNlcwotICogYXNzb2NpYXRlZCB3aXRoIHRoZSBAZXZlbnRmZCAoYnV0IHRoZSBAZXZlbnRmZCBpdHNlbGYgaXMgbm90IGZyZWVkKS4KLSAqCi0gKiBUbyBiZSB1c2VkIGFzIG1lbWNnIGV2ZW50IG1ldGhvZC4KLSAqLwotdm9pZCB2bXByZXNzdXJlX3VucmVnaXN0ZXJfZXZlbnQoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLAotCQkJCSBzdHJ1Y3QgZXZlbnRmZF9jdHggKmV2ZW50ZmQpCi17Ci0Jc3RydWN0IHZtcHJlc3N1cmUgKnZtcHIgPSBtZW1jZ190b192bXByZXNzdXJlKG1lbWNnKTsKLQlzdHJ1Y3Qgdm1wcmVzc3VyZV9ldmVudCAqZXY7Ci0KLQltdXRleF9sb2NrKCZhbXA7dm1wci0mZ3Q7ZXZlbnRzX2xvY2spOwotCWxpc3RfZm9yX2VhY2hfZW50cnkoZXYsICZhbXA7dm1wci0mZ3Q7ZXZlbnRzLCBub2RlKSB7Ci0JCWlmIChldi0mZ3Q7ZWZkICE9IGV2ZW50ZmQpCi0JCQljb250aW51ZTsKLQkJbGlzdF9kZWwoJmFtcDtldi0mZ3Q7bm9kZSk7Ci0JCWtmcmVlKGV2KTsKLQkJYnJlYWs7Ci0JfQotCW11dGV4X3VubG9jaygmYW1wO3ZtcHItJmd0O2V2ZW50c19sb2NrKTsKLX0KLQogLyoqCiAgKiB2bXByZXNzdXJlX2luaXQoKSAtIEluaXRpYWxpemUgdm1wcmVzc3VyZSBjb250cm9sIHN0cnVjdHVyZQogICogQHZtcHI6CVN0cnVjdHVyZSB0byBiZSBpbml0aWFsaXplZApAQCAtNDY4LDkgJiM0MzsyMDQsNyBAQCB2b2lkIHZtcHJlc3N1cmVfdW5yZWdpc3Rlcl9ldmVudChzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csCiB2b2lkIHZtcHJlc3N1cmVfaW5pdChzdHJ1Y3Qgdm1wcmVzc3VyZSAqdm1wcikKIHsKIAlzcGluX2xvY2tfaW5pdCgmYW1wO3ZtcHItJmd0O3NyX2xvY2spOwotCW11dGV4X2luaXQoJmFtcDt2bXByLSZndDtldmVudHNfbG9jayk7Ci0JSU5JVF9MSVNUX0hFQUQoJmFtcDt2bXByLSZndDtldmVudHMpOwotCUlOSVRfV09SSygmYW1wO3ZtcHItJmd0O3dvcmssIHZtcHJlc3N1cmVfd29ya19mbik7CiYjNDM7CXZtcHJlc3N1cmVfdjFfaW5pdCh2bXByKTsKIH0KIAogLyoqCkBAIC00ODIsOSAmIzQzOzIxNiw1IEBAIHZvaWQgdm1wcmVzc3VyZV9pbml0KHN0cnVjdCB2bXByZXNzdXJlICp2bXByKQogICovCiB2b2lkIHZtcHJlc3N1cmVfY2xlYW51cChzdHJ1Y3Qgdm1wcmVzc3VyZSAqdm1wcikKIHsKLQkvKgotCSAqIE1ha2Ugc3VyZSB0aGVyZSBpcyBubyBwZW5kaW5nIHdvcmsgYmVmb3JlIGV2ZW50ZmQgaW5mcmFzdHJ1Y3R1cmUKLQkgKiBnb2VzIGF3YXkuCi0JICovCi0JZmx1c2hfd29yaygmYW1wO3ZtcHItJmd0O3dvcmspOwomIzQzOwl2bXByZXNzdXJlX3YxX2NsZWFudXAodm1wcik7CiB9CjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA2LzI5IDE0OjMzPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDEwOTM5CgkJCQkJCQlvdXRwdXQ6IDE5CgkJCQkJCQl0aG91Z2h0czogMTcxNgoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXNpcyBvZiB0aGUgdm1wcmVzc3VyZSBjZ3JvdXAgdjEgcmVmYWN0b3JpbmcgcGF0Y2gqKgoKT2theSwgc28gSSYjMzk7bSBsb29raW5nIGF0IHRoaXMgcGF0Y2ggdGhhdCByZWZhY3RvcnMgdGhlIGNncm91cCB2MSB2bXByZXNzdXJlIGNvZGUuIFRoZSBwcmltYXJ5IGdvYWwgc2VlbXMgdG8gYmUgdG8gc3BsaXQgb3V0IHRoZSB2MS1zcGVjaWZpYyBiaXRzIGludG8gYG1tL3ZtcHJlc3N1cmUtdjEuY2AgdXNpbmcgY29uZGl0aW9uYWwgY29tcGlsYXRpb24gYmFzZWQgb24gYENPTkZJR19NRU1DR19WMWAuIFRoaXMgaW52b2x2ZXMgbW92aW5nIGZ1bmN0aW9ucyBsaWtlIGB2bXByZXNzdXJlX3ByaW9gLCBgdm1wcmVzc3VyZV9yZWdpc3Rlcl9ldmVudGAsIGV0Yy4sIGFuZCBpbnRyb2R1Y2luZyBpbml0aWFsaXphdGlvbiBhbmQgY2xlYW51cCBmdW5jdGlvbnMgc3BlY2lmaWMgdG8gdjEuICBUaGUgYE1ha2VmaWxlYCBnZXRzIHVwZGF0ZWQgdG8gYnVpbGQgdGhlIG5ldyBmaWxlIHdoZW4gYENPTkZJR19NRU1DR19WMWAgaXMgZW5hYmxlZCwgYW5kIHRoZSBgdm1wcmVzc3VyZS5oYCBoZWFkZXIgaGlkZXMgdjEtc3BlY2lmaWMgZmllbGRzIHdpdGggYW4gYCNpZmRlZmAuIEl0JiMzOTtzIGEgY2xlYXIgYXR0ZW1wdCB0byBrZWVwIHRoZSB2MiBpbXBsZW1lbnRhdGlvbiBjbGVhbmVyLgoKTXkgaW5pdGlhbCB0aG91Z2h0IGlzIHRvIGNoZWNrIGZvciBhbnkgKmZ1bmN0aW9uYWwqIGNoYW5nZXMuIFRoZSBjb21taXQgbWVzc2FnZSBtZW50aW9ucyBkcm9wcGluZyB0aGUgdjEgZXZlbnRmZCBhY2N1bXVsYXRvciB3aGVuIGBDT05GSUdfTUVNQ0dfVjFgIGlzIGRpc2FibGVkLCB3aGljaCBtYWtlcyBzZW5zZSBmb3IgYSB2Mi1vbmx5IGtlcm5lbC4KCk5vdyBJJiMzOTt2ZSBoaXQgYSB3cmlua2xlLiAgVGhlIHBhdGNoICpkb2VzKiBtb2RpZnkgYHZtcHJlc3N1cmUoKWAgaXRzZWxmLiAgVGhlIGNvZGUgbm93IGluY2x1ZGVzIGEgY29uZGl0aW9uYWwgZWFybHkgcmV0dXJuOiBgKCFjZ3JvdXBfc3Vic3lzX29uX2RmbChtZW1vcnlfY2dycF9zdWJzeXMpICZhbXA7JmFtcDsgIXRyZWUpIHx8IChjZ3JvdXBfc3Vic3lzX29uX2RmbChtZW1vcnlfY2dycF9zdWJzeXMpICZhbXA7JmFtcDsgdHJlZSlgLiBUaGUgb3JpZ2luYWwgY29kZSBqdXN0IGhhZCBgIWNncm91cF9zdWJzeXNfb25fZGZsKG1lbW9yeV9jZ3JwX3N1YnN5cykgJmFtcDsmYW1wOyAhdHJlZWAuIFRoaXMgaXMgYSBiaXQgbW9yZSB0aGFuIGp1c3QgYSByZWZhY3RvcmluZy4KClRoaW5raW5nIGFib3V0IHRoaXMsIHRoZSBjaGFuZ2Ugbm93ICpza2lwcyogdGhlIGB0cmVlYCBicmFuY2ggd2hlbiBgY2dyb3VwX3N1YnN5c19vbl9kZmxgIGlzIHRydWUgKGNncm91cCB2MikgYW5kIGB0cmVlYCBpcyBhbHNvIHRydWUuIFByZXZpb3VzbHksIHRoaXMgYnJhbmNoIHdvdWxkIGhhdmUgYWNjdW11bGF0ZWQgYHRyZWVfc2Nhbm5lZGAgYW5kIHNjaGVkdWxlZCBgdm1wci0mZ3Q7d29ya2AuIEluIHYyLCB0aGUgYHdvcmtgIGZ1bmN0aW9uIHdvdWxkIGhhdmUgZG9uZSBub3RoaW5nIGFzIHRoZXJlIGFyZSBubyByZWdpc3RlcmVkIHVzZXJzcGFjZSBldmVudGZkcy4gU28sIGl0IGFwcGVhcnMgdGhlIHBhdGNoIGludHJvZHVjZXMgYW4gKm9wdGltaXphdGlvbiosIGJ5IHNraXBwaW5nIHRoZSBzY2hlZHVsaW5nIGFuZCBhY2N1bXVsYXRpb24uIEl0JiMzOTtzIHNraXBwaW5nIHdvcmsgdGhhdCB3b3VsZCBkbyBub3RoaW5nLCBzbyB0aGlzIG1ha2VzIHNlbnNlLgoKU28gaXMgdGhpcyBhIHdvcnRod2hpbGUgcGF0Y2ggdG8gZnV6ej8gSXQgaXMgbW9zdGx5IGEgcmVmYWN0b3JpbmcuIFRoZSB2MSBjb2RlIGlzIGJlaW5nIG1vdmVkIGFyb3VuZC4gVGhlIGNoYW5nZXMgZm9yIGtlcm5lbHMgY29tcGlsZWQgd2l0aCBgQ09ORklHX01FTUNHX1YxYCBkaXNhYmxlZCBhcmUgYSBwdXJlbHkgc3RydWN0dXJhbCBjbGVhbnVwLiBUaGUgbmV3IGB2bXByZXNzdXJlX3YxXypgIGZ1bmN0aW9ucyBiZWNvbWUgbm8tb3BzLgoKVGhlIGNvcmUgb2YgdGhlIG1hdHRlciBpcyB0aGUgZWFybHkgcmV0dXJuIGluIGB2bXByZXNzdXJlKClgLiBXaGlsZSB0ZWNobmljYWxseSBhbiBvcHRpbWl6YXRpb24sIGl0ICpkb2VzKiBjaGFuZ2UgdGhlIGV4ZWN1dGlvbiBmbG93LiAgU28sIGJhc2VkIG9uIHRoYXQsIGV2ZW4gdGhvdWdoIGl0JiMzOTtzIHJlbGF0aXZlbHkgbWlub3IgYW5kIGEgcGVyZm9ybWFuY2UgdHdlYWssIHRoaXMgY291bnRzIGFzIGEgZnVuY3Rpb25hbCBjaGFuZ2UuCgpUaGVyZWZvcmUsIGJlY2F1c2UgdGhpcyBmdW5jdGlvbmFsIGNoYW5nZSBtb2RpZmllcyByZWFjaGFibGUgY29yZSBrZXJuZWwgbG9naWMsIEkgbXVzdCBzYXkgKipXb3J0aEZ1enppbmc9dHJ1ZSoqLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA2LzI5IDE0OjM0PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O01FTUNHX1YxJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2luY2x1ZGUvbGludXgvbWVtY29udHJvbC5oPTg5PXN0cnVjdCBtZW1fY2dyb3VwX3Blcl9ub2RlIHtcbi0tXG5pbmNsdWRlL2xpbnV4L21lbWNvbnRyb2wuaC05Ny1cbmluY2x1ZGUvbGludXgvbWVtY29udHJvbC5oOjk4OiNpZmRlZiBDT05GSUdfTUVNQ0dfVjFcbmluY2x1ZGUvbGludXgvbWVtY29udHJvbC5oLTk5LVx0Lypcbi0tXG5pbmNsdWRlL2xpbnV4L21lbWNvbnRyb2wuaD0yMDI9c3RydWN0IG1lbV9jZ3JvdXAge1xuLS1cbmluY2x1ZGUvbGludXgvbWVtY29udHJvbC5oLTI4NS1cbmluY2x1ZGUvbGludXgvbWVtY29udHJvbC5oOjI4NjojaWZkZWYgQ09ORklHX01FTUNHX1YxXG5pbmNsdWRlL2xpbnV4L21lbWNvbnRyb2wuaC0yODctXHQvKiBMZWdhY3kgY29uc3VtZXItb3JpZW50ZWQgY291bnRlcnMgKi9cbi0tXG5pbmNsdWRlL2xpbnV4L21lbWNvbnRyb2wuaC0zMjAtXHRzcGlubG9ja190IGV2ZW50X2xpc3RfbG9jaztcbmluY2x1ZGUvbGludXgvbWVtY29udHJvbC5oOjMyMTojZW5kaWYgLyogQ09ORklHX01FTUNHX1YxICovXG5pbmNsdWRlL2xpbnV4L21lbWNvbnRyb2wuaC0zMjItXG4tLVxuaW5jbHVkZS9saW51eC9tZW1jb250cm9sLmg9MTg2NT1zdGF0aWMgaW5saW5lIGJvb2wgbWVtX2Nncm91cF96c3dhcF93cml0ZWJhY2tfZW5hYmxlZChzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2cpXG4tLVxuaW5jbHVkZS9saW51eC9tZW1jb250cm9sLmgtMTg3NC1cbmluY2x1ZGUvbGludXgvbWVtY29udHJvbC5oOjE4NzU6I2lmZGVmIENPTkZJR19NRU1DR19WMVxuaW5jbHVkZS9saW51eC9tZW1jb250cm9sLmgtMTg3Ni11bnNpZ25lZCBsb25nIG1lbWNnMV9zb2Z0X2xpbWl0X3JlY2xhaW0ocGdfZGF0YV90ICpwZ2RhdCwgaW50IG9yZGVyLFxuLS1cbmluY2x1ZGUvbGludXgvbWVtY29udHJvbC5oPTE4OTM9c3RhdGljIGlubGluZSB2b2lkIG1lbV9jZ3JvdXBfZXhpdF91c2VyX2ZhdWx0KHZvaWQpXG4tLVxuaW5jbHVkZS9saW51eC9tZW1jb250cm9sLmgtMTg5OC1cbmluY2x1ZGUvbGludXgvbWVtY29udHJvbC5oOjE4OTk6I2Vsc2UgLyogQ09ORklHX01FTUNHX1YxICovXG5pbmNsdWRlL2xpbnV4L21lbWNvbnRyb2wuaC0xOTAwLXN0YXRpYyBpbmxpbmVcbi0tXG5pbmNsdWRlL2xpbnV4L21lbWNvbnRyb2wuaD0xOTIyPXN0YXRpYyBpbmxpbmUgdm9pZCBtZW1fY2dyb3VwX2V4aXRfdXNlcl9mYXVsdCh2b2lkKVxuLS1cbmluY2x1ZGUvbGludXgvbWVtY29udHJvbC5oLTE5MjUtXG5pbmNsdWRlL2xpbnV4L21lbWNvbnRyb2wuaDoxOTI2OiNlbmRpZiAvKiBDT05GSUdfTUVNQ0dfVjEgKi9cbmluY2x1ZGUvbGludXgvbWVtY29udHJvbC5oLTE5MjctXG5pbmNsdWRlL2xpbnV4L21lbWNvbnRyb2wuaDoxOTI4OiNpZiBkZWZpbmVkKENPTkZJR19NRU1DR19WMSkgXHUwMDI2XHUwMDI2IGRlZmluZWQoQ09ORklHX1NXQVApXG5pbmNsdWRlL2xpbnV4L21lbWNvbnRyb2wuaC0xOTI5LVxuLS1cbmluY2x1ZGUvbGludXgvc2NoZWQuaD04MjY9c3RydWN0IHRhc2tfc3RydWN0IHtcbi0tXG5pbmNsdWRlL2xpbnV4L3NjaGVkLmgtMTAyMS0jZW5kaWZcbmluY2x1ZGUvbGludXgvc2NoZWQuaDoxMDIyOiNpZmRlZiBDT05GSUdfTUVNQ0dfVjFcbmluY2x1ZGUvbGludXgvc2NoZWQuaC0xMDIzLVx0dW5zaWduZWRcdFx0XHRpbl91c2VyX2ZhdWx0OjE7XG4tLVxuaW5jbHVkZS9saW51eC9zY2hlZC5oLTE1NDctXG5pbmNsdWRlL2xpbnV4L3NjaGVkLmg6MTU0ODojaWZkZWYgQ09ORklHX01FTUNHX1YxXG5pbmNsdWRlL2xpbnV4L3NjaGVkLmgtMTU0OS1cdHN0cnVjdCBtZW1fY2dyb3VwXHRcdCptZW1jZ19pbl9vb207XG4tLVxuaW5jbHVkZS9saW51eC92bXByZXNzdXJlLmg9MTM9c3RydWN0IHZtcHJlc3N1cmUge1xuLS1cbmluY2x1ZGUvbGludXgvdm1wcmVzc3VyZS5oLTE4LVxuaW5jbHVkZS9saW51eC92bXByZXNzdXJlLmg6MTk6I2lmZGVmIENPTkZJR19NRU1DR19WMVxuaW5jbHVkZS9saW51eC92bXByZXNzdXJlLmgtMjAtXHQvKlxuLS1cbmluY2x1ZGUvbGludXgvdm1wcmVzc3VyZS5oLTIyLVx0ICogKG1lbW9yeS5wcmVzc3VyZV9sZXZlbCkuIERyYWluZWQgYnkgQHdvcmsuIHYyIGhhcyBubyBlcXVpdmFsZW50XG5pbmNsdWRlL2xpbnV4L3ZtcHJlc3N1cmUuaDoyMzpcdCAqIGludGVyZmFjZSwgc28gdGhpcyBzdGF0ZSBpcyBvbWl0dGVkIG9uIENPTkZJR19NRU1DR19WMT1uIGJ1aWxkcy5cbmluY2x1ZGUvbGludXgvdm1wcmVzc3VyZS5oLTI0LVx0ICovXG4tLVxuaW5jbHVkZS9saW51eC92bXByZXNzdXJlLmg9NTU9ZXh0ZXJuIGVudW0gdm1wcmVzc3VyZV9sZXZlbHMgdm1wcmVzc3VyZV9jYWxjX2xldmVsKHVuc2lnbmVkIGxvbmcgc2Nhbm5lZCxcbi0tXG5pbmNsdWRlL2xpbnV4L3ZtcHJlc3N1cmUuaC01Ny1cbmluY2x1ZGUvbGludXgvdm1wcmVzc3VyZS5oOjU4OiNpZmRlZiBDT05GSUdfTUVNQ0dfVjFcbmluY2x1ZGUvbGludXgvdm1wcmVzc3VyZS5oLTU5LWV4dGVybiB2b2lkIHZtcHJlc3N1cmVfcHJpbyhnZnBfdCBnZnAsIHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZywgaW50IHByaW8pO1xuLS1cbmluY2x1ZGUvbGludXgvdm1wcmVzc3VyZS5oPTYzPWV4dGVybiB2b2lkIHZtcHJlc3N1cmVfdW5yZWdpc3Rlcl9ldmVudChzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csXG4tLVxuaW5jbHVkZS9saW51eC92bXByZXNzdXJlLmgtNjUtXG5pbmNsdWRlL2xpbnV4L3ZtcHJlc3N1cmUuaDo2NjovKiB2MSBob29rcyBjYWxsZWQgZnJvbSBtbS92bXByZXNzdXJlLmM7IG5vLW9wcyBiZWxvdyB3aGVuICFNRU1DR19WMS4gKi9cbmluY2x1ZGUvbGludXgvdm1wcmVzc3VyZS5oLTY3LWV4dGVybiB2b2lkIHZtcHJlc3N1cmVfdjFfaW5pdChzdHJ1Y3Qgdm1wcmVzc3VyZSAqdm1wcik7XG4tLVxuaW5jbHVkZS9saW51eC92bXByZXNzdXJlLmg9Nzc9c3RhdGljIGlubGluZSB2b2lkIHZtcHJlc3N1cmVfdjFfYWNjb3VudF90cmVlKHN0cnVjdCB2bXByZXNzdXJlICp2bXByLFxuLS1cbmluY2x1ZGUvbGludXgvdm1wcmVzc3VyZS5oLTc5LVx0XHRcdFx0XHQgICAgICB1bnNpZ25lZCBsb25nIHJlY2xhaW1lZCkge31cbmluY2x1ZGUvbGludXgvdm1wcmVzc3VyZS5oOjgwOiNlbmRpZiAvKiBDT05GSUdfTUVNQ0dfVjEgKi9cbmluY2x1ZGUvbGludXgvdm1wcmVzc3VyZS5oLTgxLVxuLS1cbmluY2x1ZGUvbmV0L3NvY2suaD0yNzAyPXN0YXRpYyBpbmxpbmUgYm9vbCBtZW1fY2dyb3VwX3NrX3VuZGVyX21lbW9yeV9wcmVzc3VyZShjb25zdCBzdHJ1Y3Qgc29jayAqc2spXG4tLVxuaW5jbHVkZS9uZXQvc29jay5oLTI3MDUtXG5pbmNsdWRlL25ldC9zb2NrLmg6MjcwNjojaWZkZWYgQ09ORklHX01FTUNHX1YxXG5pbmNsdWRlL25ldC9zb2NrLmgtMjcwNy1cdGlmICghY2dyb3VwX3N1YnN5c19vbl9kZmwobWVtb3J5X2NncnBfc3Vic3lzKSlcbmluY2x1ZGUvbmV0L3NvY2suaC0yNzA4LVx0XHRyZXR1cm4gISFtZW1jZy1cdTAwM2V0Y3BtZW1fcHJlc3N1cmU7XG5pbmNsdWRlL25ldC9zb2NrLmg6MjcwOTojZW5kaWYgLyogQ09ORklHX01FTUNHX1YxICovXG5pbmNsdWRlL25ldC9zb2NrLmgtMjcxMC1cbi0tXG5pbml0L0tjb25maWc9MTA4OT1jb25maWcgTUVNQ0dfTk1JX1NBRkVUWV9SRVFVSVJFU19BVE9NSUNcbi0tXG5pbml0L0tjb25maWctMTA5NS1cbmluaXQvS2NvbmZpZzoxMDk2OmNvbmZpZyBNRU1DR19WMVxuaW5pdC9LY29uZmlnLTEwOTctXHRib29sIFwmIzM0O0xlZ2FjeSBjZ3JvdXAgdjEgbWVtb3J5IGNvbnRyb2xsZXJcJiMzNDtcbi0tXG5tbS9NYWtlZmlsZT0xMDM9b2JqLSQoQ09ORklHX0xJVkVVUERBVEVfTUVNRkQpICYjNDM7PSBtZW1mZF9sdW8ub1xubW0vTWFrZWZpbGU6MTA0Om9iai0kKENPTkZJR19NRU1DR19WMSkgJiM0Mzs9IG1lbWNvbnRyb2wtdjEubyB2bXByZXNzdXJlLXYxLm9cbm1tL01ha2VmaWxlLTEwNS1vYmotJChDT05GSUdfTUVNQ0cpICYjNDM7PSBtZW1jb250cm9sLm8gdm1wcmVzc3VyZS5vXG4tLVxubW0vbWVtY29udHJvbC12MS5oPTI0PXN0cnVjdCBtZW1fY2dyb3VwICptZW1fY2dyb3VwX3ByaXZhdGVfaWRfZ2V0X29ubGluZShzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csXG4tLVxubW0vbWVtY29udHJvbC12MS5oLTI3LS8qIENncm91cCB2MS1zcGVjaWZpYyBkZWNsYXJhdGlvbnMgKi9cbm1tL21lbWNvbnRyb2wtdjEuaDoyODojaWZkZWYgQ09ORklHX01FTUNHX1YxXG5tbS9tZW1jb250cm9sLXYxLmgtMjktXG4tLVxubW0vbWVtY29udHJvbC12MS5oPTkxPWV4dGVybiBzdHJ1Y3QgY2Z0eXBlIG1lbV9jZ3JvdXBfbGVnYWN5X2ZpbGVzW107XG5tbS9tZW1jb250cm9sLXYxLmgtOTItXG5tbS9tZW1jb250cm9sLXYxLmg6OTM6I2Vsc2VcdC8qIENPTkZJR19NRU1DR19WMSAqL1xubW0vbWVtY29udHJvbC12MS5oLTk0LVxuLS1cbm1tL21lbWNvbnRyb2wtdjEuaD0xMjE9c3RhdGljIGlubGluZSB2b2lkIG1lbWNnMV91bmNoYXJnZV9za21lbShzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csIHVuc2lnbmVkIGludCBucl9wYWdlcykge31cbm1tL21lbWNvbnRyb2wtdjEuaC0xMjItXG5tbS9tZW1jb250cm9sLXYxLmg6MTIzOiNlbmRpZlx0LyogQ09ORklHX01FTUNHX1YxICovXG5tbS9tZW1jb250cm9sLXYxLmgtMTI0LVxuLS1cbm1tL21lbWNvbnRyb2wuYz0yMDk9c3RhdGljIGlubGluZSBzdHJ1Y3Qgb2JqX2Nncm91cCAqX19tZW1jZ19yZXBhcmVudF9vYmpjZ3Moc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLFxuLS1cbm1tL21lbWNvbnRyb2wuYy0yMjgtXG5tbS9tZW1jb250cm9sLmM6MjI5OiNpZmRlZiBDT05GSUdfTUVNQ0dfVjFcbm1tL21lbWNvbnRyb2wuYy0yMzAtc3RhdGljIHZvaWQgX19tZW1fY2dyb3VwX2ZsdXNoX3N0YXRzKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZywgYm9vbCBmb3JjZSk7XG4tLVxubW0vbWVtY29udHJvbC5jPTUwNT11bnNpZ25lZCBsb25nIGxydXZlY19wYWdlX3N0YXRlX2xvY2FsKHN0cnVjdCBscnV2ZWMgKmxydXZlYyxcbi0tXG5tbS9tZW1jb250cm9sLmMtNTI3LVxubW0vbWVtY29udHJvbC5jOjUyODojaWZkZWYgQ09ORklHX01FTUNHX1YxXG5tbS9tZW1jb250cm9sLmMtNTI5LXN0YXRpYyB2b2lkIF9fbW9kX21lbWNnX2xydXZlY19zdGF0ZShzdHJ1Y3QgbWVtX2Nncm91cF9wZXJfbm9kZSAqcG4sXG4tLVxubW0vbWVtY29udHJvbC5jPTU1Mz1zdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1lbWNnX3ZtX2V2ZW50X3N0YXRbXSA9IHtcbm1tL21lbWNvbnRyb2wuYzo1NTQ6I2lmZGVmIENPTkZJR19NRU1DR19WMVxubW0vbWVtY29udHJvbC5jLTU1NS1cdFBHUEdJTixcbi0tXG5tbS9tZW1jb250cm9sLmM9Nzg3PXN0YXRpYyBsb25nIG1lbWNnX3N0YXRlX3ZhbF9pbl9wYWdlcyhpbnQgaWR4LCBsb25nIHZhbClcbi0tXG5tbS9tZW1jb250cm9sLmMtODAyLVxubW0vbWVtY29udHJvbC5jOjgwMzojaWZkZWYgQ09ORklHX01FTUNHX1YxXG5tbS9tZW1jb250cm9sLmMtODA0LS8qXG4tLVxubW0vbWVtY29udHJvbC5jPTg3MT12b2lkIG1vZF9tZW1jZ19zdGF0ZShzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csIGVudW0gbWVtY2dfc3RhdF9pdGVtIGlkeCxcbi0tXG5tbS9tZW1jb250cm9sLmMtODgzLVxubW0vbWVtY29udHJvbC5jOjg4NDojaWZkZWYgQ09ORklHX01FTUNHX1YxXG5tbS9tZW1jb250cm9sLmMtODg1LS8qIGlkeCBjYW4gYmUgb2YgdHlwZSBlbnVtIG1lbWNnX3N0YXRfaXRlbSBvciBub2RlX3N0YXRfaXRlbS4gKi9cbi0tXG5tbS9tZW1jb250cm9sLmM9MTA1OT1ib29sIG1lbWNnX3ZtX2V2ZW50X2l0ZW1fdmFsaWQoZW51bSB2bV9ldmVudF9pdGVtIGlkeClcbi0tXG5tbS9tZW1jb250cm9sLmMtMTA2Ni1cbm1tL21lbWNvbnRyb2wuYzoxMDY3OiNpZmRlZiBDT05GSUdfTUVNQ0dfVjFcbm1tL21lbWNvbnRyb2wuYy0xMDY4LXVuc2lnbmVkIGxvbmcgbWVtY2dfZXZlbnRzX2xvY2FsKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZywgaW50IGV2ZW50KVxuLS1cbm1tL21lbWNvbnRyb2wuYz0xNjY3PXVuc2lnbmVkIGxvbmcgbWVtY2dfcGFnZV9zdGF0ZV9vdXRwdXQoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLCBpbnQgaXRlbSlcbi0tXG5tbS9tZW1jb250cm9sLmMtMTY3Mi1cbm1tL21lbWNvbnRyb2wuYzoxNjczOiNpZmRlZiBDT05GSUdfTUVNQ0dfVjFcbm1tL21lbWNvbnRyb2wuYy0xNjc0LXVuc2lnbmVkIGxvbmcgbWVtY2dfcGFnZV9zdGF0ZV9sb2NhbF9vdXRwdXQoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLCBpbnQgaXRlbSlcbi0tXG5tbS9tZW1jb250cm9sLmM9MTY5Mz1zdGF0aWMgdm9pZCBtZW1jZ19zdGF0X2Zvcm1hdChzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csIHN0cnVjdCBzZXFfYnVmICpzKVxuLS1cbm1tL21lbWNvbnRyb2wuYy0xNzM5LVx0Zm9yIChpID0gMDsgaSBcdTAwM2MgQVJSQVlfU0laRShtZW1jZ192bV9ldmVudF9zdGF0KTsgaSYjNDM7JiM0MzspIHtcbm1tL21lbWNvbnRyb2wuYzoxNzQwOiNpZmRlZiBDT05GSUdfTUVNQ0dfVjFcbm1tL21lbWNvbnRyb2wuYy0xNzQxLVx0XHRpZiAobWVtY2dfdm1fZXZlbnRfc3RhdFtpXSA9PSBQR1BHSU4gfHxcbi0tXG5tbS9tZW1jb250cm9sLmM9MTc5MT12b2lkIG1lbV9jZ3JvdXBfcHJpbnRfb29tX21lbWluZm8oc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnKVxuLS1cbm1tL21lbWNvbnRyb2wuYy0xODEyLVx0XHRcdGF0b21pY19sb25nX3JlYWQoXHUwMDI2bWVtY2ctXHUwMDNlbWVtb3J5X2V2ZW50c1tNRU1DR19TV0FQX01BWF0pKTtcbm1tL21lbWNvbnRyb2wuYzoxODEzOiNpZmRlZiBDT05GSUdfTUVNQ0dfVjFcbm1tL21lbWNvbnRyb2wuYy0xODE0LVx0ZWxzZSB7XG4tLVxubW0vbWVtY29udHJvbC5jPTQxNTc9bWVtX2Nncm91cF9jc3NfYWxsb2Moc3RydWN0IGNncm91cF9zdWJzeXNfc3RhdGUgKnBhcmVudF9jc3MpXG4tLVxubW0vbWVtY29udHJvbC5jLTQxODAtXHRcdHBhZ2VfY291bnRlcl9pbml0KFx1MDAyNm1lbWNnLVx1MDAzZXN3YXAsIFx1MDAyNnBhcmVudC1cdTAwM2Vzd2FwLCBmYWxzZSk7XG5tbS9tZW1jb250cm9sLmM6NDE4MTojaWZkZWYgQ09ORklHX01FTUNHX1YxXG5tbS9tZW1jb250cm9sLmMtNDE4Mi1cdFx0bWVtY2ctXHUwMDNlbWVtb3J5LnRyYWNrX2ZhaWxjbnQgPSAhbWVtY2dfb25fZGZsO1xuLS1cbm1tL21lbWNvbnRyb2wuYy00MTkxLVx0XHRwYWdlX2NvdW50ZXJfaW5pdChcdTAwMjZtZW1jZy1cdTAwM2Vzd2FwLCBOVUxMLCBmYWxzZSk7XG5tbS9tZW1jb250cm9sLmM6NDE5MjojaWZkZWYgQ09ORklHX01FTUNHX1YxXG5tbS9tZW1jb250cm9sLmMtNDE5My1cdFx0cGFnZV9jb3VudGVyX2luaXQoXHUwMDI2bWVtY2ctXHUwMDNla21lbSwgTlVMTCwgZmFsc2UpO1xuLS1cbm1tL21lbWNvbnRyb2wuYz00MzU5PXN0YXRpYyB2b2lkIG1lbV9jZ3JvdXBfY3NzX3Jlc2V0KHN0cnVjdCBjZ3JvdXBfc3Vic3lzX3N0YXRlICpjc3MpXG4tLVxubW0vbWVtY29udHJvbC5jLTQzNjQtXHRwYWdlX2NvdW50ZXJfc2V0X21heChcdTAwMjZtZW1jZy1cdTAwM2Vzd2FwLCBQQUdFX0NPVU5URVJfTUFYKTtcbm1tL21lbWNvbnRyb2wuYzo0MzY1OiNpZmRlZiBDT05GSUdfTUVNQ0dfVjFcbm1tL21lbWNvbnRyb2wuYy00MzY2LVx0cGFnZV9jb3VudGVyX3NldF9tYXgoXHUwMDI2bWVtY2ctXHUwMDNla21lbSwgUEFHRV9DT1VOVEVSX01BWCk7XG4tLVxubW0vbWVtY29udHJvbC5jPTUwNzY9c3RydWN0IGNncm91cF9zdWJzeXMgbWVtb3J5X2NncnBfc3Vic3lzID0ge1xuLS1cbm1tL21lbWNvbnRyb2wuYy01MDg3LVx0LmRmbF9jZnR5cGVzID0gbWVtb3J5X2ZpbGVzLFxubW0vbWVtY29udHJvbC5jOjUwODg6I2lmZGVmIENPTkZJR19NRU1DR19WMVxubW0vbWVtY29udHJvbC5jLTUwODktXHQubGVnYWN5X2NmdHlwZXMgPSBtZW1fY2dyb3VwX2xlZ2FjeV9maWxlcyxcbi0tXG5tbS9tZW1jb250cm9sLmM9NjAyMj1zdGF0aWMgaW50IF9faW5pdCBtZW1fY2dyb3VwX3N3YXBfaW5pdCh2b2lkKVxuLS1cbm1tL21lbWNvbnRyb2wuYy02MDI3LVx0V0FSTl9PTihjZ3JvdXBfYWRkX2RmbF9jZnR5cGVzKFx1MDAyNm1lbW9yeV9jZ3JwX3N1YnN5cywgc3dhcF9maWxlcykpO1xubW0vbWVtY29udHJvbC5jOjYwMjg6I2lmZGVmIENPTkZJR19NRU1DR19WMVxubW0vbWVtY29udHJvbC5jLTYwMjktXHRXQVJOX09OKGNncm91cF9hZGRfbGVnYWN5X2NmdHlwZXMoXHUwMDI2bWVtb3J5X2NncnBfc3Vic3lzLCBtZW1zd19maWxlcykpO1xuLS1cbm1tL3ZtcHJlc3N1cmUtdjEuYy00LSAqIGNncm91cC5ldmVudF9jb250cm9sKS4gU3BsaXQgb3V0IG9mIG1tL3ZtcHJlc3N1cmUuYyBzbyB0aGF0IHYyLW9ubHlcbm1tL3ZtcHJlc3N1cmUtdjEuYzo1OiAqIGtlcm5lbHMgKENPTkZJR19NRU1DR19WMT1uKSBkcm9wIHRoZSB3aG9sZSBldmVudGZkIGFjY3VtdWxhdG9yLFxubW0vdm1wcmVzc3VyZS12MS5jLTYtICogaXRzIHdvcmsgaXRlbSwgYW5kIHRoZSBwZXItbWVtY2cgc3RhdGUgaXQgcmVxdWlyZXMuXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NS8yPC90ZD4KCQkJPHRkPjIwMjYvMDYvMjkgMTQ6MzQ8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTY4MjkKCQkJCQkJCW91dHB1dDogMjEKCQkJCQkJCXRob3VnaHRzOiAxMDE0CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyB0aGUgSW1wYWN0IG9mIHRoZSBgQ09ORklHX01FTUNHX1YxYCBQYXRjaCoqCgpPa2F5LCBzbyBJJiMzOTttIGxvb2tpbmcgYXQgdGhpcyBwYXRjaCByZWxhdGVkIHRvIHRoZSBgQ09ORklHX01FTUNHX1YxYCBjb25maWcsIHdoaWNoIGVuYWJsZXMgdGhlIGxlZ2FjeSBjZ3JvdXAgdjEgbWVtb3J5IGNvbnRyb2xsZXIuIE15IGluaXRpYWwgdGhvdWdodCBpcyB0byBhc3Nlc3Mgd2hldGhlciB0aGlzIHdhcnJhbnRzIGZ1enppbmcuIFRoZSBwYXRjaCBtb3ZlcyB0aGUgdjEgdm1wcmVzc3VyZSBjb2RlIGludG8gYG1tL3ZtcHJlc3N1cmUtdjEuY2AgYW5kIGd1YXJkcyBpdCB3aXRoIGBDT05GSUdfTUVNQ0dfVjFgLiBJdCBzZWVtcyBsaWtlIGEgcmVmYWN0b3JpbmcuCgpUaGUgcHJvbXB0IGlzIHByZXR0eSBzcGVjaWZpYy4gSXQgdGVsbHMgbWUgdG8gcmV0dXJuIGBXb3J0aEZ1enppbmc9ZmFsc2VgIGlmIHRoZXJlIGFyZSBvbmx5IHRoaW5ncyBsaWtlIGRvY3VtZW50YXRpb24gY2hhbmdlcywgS2NvbmZpZyBmaWxlIG1vZGlmaWNhdGlvbnMsIGNvbW1lbnRzLCBsb2dnaW5nLCBvciBjaGFuZ2VzIHRvIGNvbnN0YW50cyB0aGF0ICpkb24mIzM5O3QqIGFsdGVyIGV4ZWN1dGlvbiBmbG93LiBJdCBhbHNvIHNheXMgdG8gZXhjbHVkZSB0aGluZ3MgdGhhdCBhcmUgdW5yZWFjaGFibGUgaW4gZW11bGF0ZWQgZW52aXJvbm1lbnRzLgoKVGhlIG1haW4gZnVuY3Rpb25hbCBjaGFuZ2Ugc2VlbXMgdG8gYmUgYW4gZWFybHkgcmV0dXJuIG9wdGltaXphdGlvbiBpbiBgbW0vdm1wcmVzc3VyZS5jYDoKYGBgYwoJaWYgKCghY2dyb3VwX3N1YnN5c19vbl9kZmwobWVtb3J5X2NncnBfc3Vic3lzKSAmYW1wOyZhbXA7ICF0cmVlKSB8fAoJICAgIChjZ3JvdXBfc3Vic3lzX29uX2RmbChtZW1vcnlfY2dycF9zdWJzeXMpICZhbXA7JmFtcDsgdHJlZSkpCgkJcmV0dXJuOwpgYGAKClRoaXMgKmRvZXMqIGFsdGVyIHRoZSBleGVjdXRpb24gZmxvdyBvZiB0aGUgYHZtcHJlc3N1cmVgIGZ1bmN0aW9uLCBzbyBJIG5lZWQgdG8gY2FyZWZ1bGx5IGNvbnNpZGVyIHRoaXMuIEl0JiMzOTtzIG5vdCBqdXN0IGEgY29uc3RhbnQgb3IgYSBtYWNybyBjaGFuZ2UuIFRoZSBwYXRjaCBhbHNvIHJlZmFjdG9ycyBieSBtb3ZpbmcgY29kZSB0byBhIG5ldyBmaWxlLCBidXQgdGhhdCBhbG9uZSBkb2VzbiYjMzk7dCB1c3VhbGx5IHF1YWxpZnkuIEkgbmVlZCB0byBmaWd1cmUgb3V0IGlmIHRoaXMgaXMgYWN0dWFsbHkgaW1wb3J0YW50IHRvIHRlc3QuCgpJZiBJIGRlY2lkZSB0byBmbGFnIHRoaXMgYXMgZnV6ei13b3J0aHksIEkmIzM5O2xsIG5lZWQgdG8gc3BlY2lmeSBgRm9jdXNTeW1ib2xzYCBhbmQgYEVuYWJsZUNvbmZpZ3NgLiBUaGUgZm9jdXMgc3ltYm9scyB3aWxsIGJlOiBgdm1wcmVzc3VyZWAsIGB2bXByZXNzdXJlX3YxX2FjY291bnRfdHJlZWAsIGB2bXByZXNzdXJlX3JlZ2lzdGVyX2V2ZW50YCwgYHZtcHJlc3N1cmVfdW5yZWdpc3Rlcl9ldmVudGAsIGFuZCBgdm1wcmVzc3VyZV9wcmlvYC4gVGhlIGVuYWJsZSBjb25maWdzIGFyZSBgTUVNQ0dfVjFgIGFuZCBgTUVNQ0dgLgoKTGV0JiMzOTtzIGRpZyBhIGxpdHRsZSBkZWVwZXIuIFRoZSBgdm1wcmVzc3VyZV92MV9hY2NvdW50X3RyZWVgIGZ1bmN0aW9uIGlzIGNhbGxlZCBmcm9tIHdpdGhpbiBgdm1wcmVzc3VyZWAgd2hlbiBgdHJlZWAgaXMgdHJ1ZS4gTGV0JiMzOTtzIHNlZSBpZiB0aGVyZSBhcmUgYW55IG90aGVyIGRpZmZlcmVuY2VzLgpgYGBjCglpZiAodHJlZSkgewoJCXZtcHJlc3N1cmVfdjFfYWNjb3VudF90cmVlKHZtcHIsIHNjYW5uZWQsIHJlY2xhaW1lZCk7Cgl9IGVsc2UgewpgYGAKCkluc3BlY3RpbmcgYHZtcHJlc3N1cmVfdjFfYWNjb3VudF90cmVlYCBzaG93czoKYGBgYwp2b2lkIHZtcHJlc3N1cmVfdjFfYWNjb3VudF90cmVlKHN0cnVjdCB2bXByZXNzdXJlICp2bXByLAoJCQkJdW5zaWduZWQgbG9uZyBzY2FubmVkLAoJCQkJdW5zaWduZWQgbG9uZyByZWNsYWltZWQpCnsKCXNwaW5fbG9jaygmYW1wO3ZtcHItJmd0O3NyX2xvY2spOwoJc2Nhbm5lZCA9IHZtcHItJmd0O3RyZWVfc2Nhbm5lZCAmIzQzOz0gc2Nhbm5lZDsKCXZtcHItJmd0O3RyZWVfcmVjbGFpbWVkICYjNDM7PSByZWNsYWltZWQ7CglzcGluX3VubG9jaygmYW1wO3ZtcHItJmd0O3NyX2xvY2spOwoKCWlmIChzY2FubmVkICZsdDsgdm1wcmVzc3VyZV93aW4pCgkJcmV0dXJuOwoJc2NoZWR1bGVfd29yaygmYW1wO3ZtcHItJmd0O3dvcmspOwp9CmBgYAoKVGhpcyBpcyBpZGVudGljYWwgdG8gd2hhdCB3YXMgdGhlcmUgcHJldmlvdXNseSwgYXMgZmFyIGFzIEkgY2FuIHRlbGwuCgpUaGVuLCB0aGUgYHZtcHJlc3N1cmVfd29ya19mbmAgZnVuY3Rpb24gaXMgYWxzbyBtb3ZlZCB0byBgbW0vdm1wcmVzc3VyZS12MS5jYCwgYW5kIGl0JiMzOTtzIGFsc28gaWRlbnRpY2FsLgpgYGBjCnN0YXRpYyB2b2lkIHZtcHJlc3N1cmVfd29ya19mbihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCnsKCXN0cnVjdCB2bXByZXNzdXJlICp2bXByID0gd29ya190b192bXByZXNzdXJlKHdvcmspOwoJdW5zaWduZWQgbG9uZyBzY2FubmVkOwoJdW5zaWduZWQgbG9uZyByZWNsYWltZWQ7CgllbnVtIHZtcHJlc3N1cmVfbGV2ZWxzIGxldmVsOwoJYm9vbCBhbmNlc3RvciA9IGZhbHNlOwoJYm9vbCBzaWduYWxsZWQgPSBmYWxzZTsKCglzcGluX2xvY2soJmFtcDt2bXByLSZndDtzcl9sb2NrKTsKLi4uCmBgYAoKU28sIHRoZSBvbmx5IGZ1bmN0aW9uYWwgY2hhbmdlIGlzIHRoYXQgZWFybHkgcmV0dXJuLgpgYGBjCglpZiAoKCFjZ3JvdXBfc3Vic3lzX29uX2RmbChtZW1vcnlfY2dycF9zdWJzeXMpICZhbXA7JmFtcDsgIXRyZWUpIHx8CgkgICAgKGNncm91cF9zdWJzeXNfb25fZGZsKG1lbW9yeV9jZ3JwX3N1YnN5cykgJmFtcDsmYW1wOyB0cmVlKSkKCQlyZXR1cm47CmBgYAoKSWYgSSByZXR1cm4gYFdvcnRoRnV6emluZz1mYWxzZWAsIEkgY291bGQgYmUgcGVuYWxpemVkIGlmIHRoaXMgZWFybHkgcmV0dXJuIGlzIGRlZW1lZCBhIGZ1bmN0aW9uYWwgY2hhbmdlLiBUaGUgcHJvbXB0IHN0YXRlcyB0aGF0IG9ubHkgY2hhbmdlcyB0byAqbnVtZXJpYyBjb25zdGFudHMgb3IgbWFjcm9zKiB0aGF0ICpkb24mIzM5O3QqIGZ1bmN0aW9uYWxseSBhbHRlciB0aGUgZXhlY3V0aW9uIGZsb3cgc2hvdWxkIGJlIGV4Y2x1ZGVkLiBUaGlzIGlzIGFuIGBpZmAgY29uZGl0aW9uIGluIGEgY29yZSBmdW5jdGlvbiAoYHZtcHJlc3N1cmVgKSwgc28gSSYjMzk7bSBlcnJpbmcgb24gdGhlIHNpZGUgb2YgY2F1dGlvbi4gSSBhbSBnb2luZyB0byBzYXkgYFdvcnRoRnV6emluZz10cnVlYC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD42LzI8L3RkPgoJCQk8dGQ+MjAyNi8wNi8yOSAxNDozNDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtedm9pZCB2bXByZXNzdXJlXFwoJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2luY2x1ZGUvbGludXgvdm1wcmVzc3VyZS5oPTQzPXN0cnVjdCBtZW1fY2dyb3VwO1xuLS1cbmluY2x1ZGUvbGludXgvdm1wcmVzc3VyZS5oLTQ1LSNpZmRlZiBDT05GSUdfTUVNQ0dcbmluY2x1ZGUvbGludXgvdm1wcmVzc3VyZS5oOjQ2OnZvaWQgdm1wcmVzc3VyZShnZnBfdCBnZnAsIGludCBvcmRlciwgc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLCBib29sIHRyZWUsXG5pbmNsdWRlL2xpbnV4L3ZtcHJlc3N1cmUuaC00Ny1cdFx0dW5zaWduZWQgbG9uZyBzY2FubmVkLCB1bnNpZ25lZCBsb25nIHJlY2xhaW1lZCk7XG4tLVxubW0vdm1wcmVzc3VyZS5jPTU3PWVudW0gdm1wcmVzc3VyZV9sZXZlbHMgdm1wcmVzc3VyZV9jYWxjX2xldmVsKHVuc2lnbmVkIGxvbmcgc2Nhbm5lZCxcbi0tXG5tbS92bXByZXNzdXJlLmMtMTA4LSAqL1xubW0vdm1wcmVzc3VyZS5jOjEwOTp2b2lkIHZtcHJlc3N1cmUoZ2ZwX3QgZ2ZwLCBpbnQgb3JkZXIsIHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZywgYm9vbCB0cmVlLFxubW0vdm1wcmVzc3VyZS5jLTExMC1cdFx0dW5zaWduZWQgbG9uZyBzY2FubmVkLCB1bnNpZ25lZCBsb25nIHJlY2xhaW1lZClcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD43LzI8L3RkPgoJCQk8dGQ+MjAyNi8wNi8yOSAxNDozNDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxOTEwMQoJCQkJCQkJb3V0cHV0OiAzNwoJCQkJCQkJdGhvdWdodHM6IDEzCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBsZXQmIzM5O3MgZGl2ZSBpbnRvIHRoaXMuIEkgbmVlZCB0byBnZXQgYSBoYW5kbGUgb24gdGhlIHNpdHVhdGlvbiBhbmQgZmlndXJlIG91dCB3aGF0JiMzOTtzIGdvaW5nIG9uLgoKKipBbmFseXppbmcgdGhlIGB2bXByZXNzdXJlYCBGdW5jdGlvbioqCgpSaWdodCwgdGhlIGZpcnN0IHRoaW5nIEkgbmVlZCB0byBkbyBpcyBleGFtaW5lIHRoZSBgdm1wcmVzc3VyZWAgZnVuY3Rpb24gaXRzZWxmLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCBpdHMgcHVycG9zZSwgd2hhdCBpdCYjMzk7cyBkZXNpZ25lZCB0byBtZWFzdXJlIG9yIGNhbGN1bGF0ZSwgYW5kIG1vc3QgaW1wb3J0YW50bHksIGhvdyBpdCYjMzk7cyBpbXBsZW1lbnRlZC4gSSYjMzk7bSBsb29raW5nIGZvciB0aGUga2V5IGFsZ29yaXRobXMsIGRhdGEgc3RydWN0dXJlcywgYW5kIGFueSBzcGVjaWZpYyBjb25zaWRlcmF0aW9ucyB0aGUgZGV2ZWxvcGVycyBwdXQgaW50byBpdC4gV2hhdCBhc3N1bXB0aW9ucyBkaWQgdGhleSBtYWtlPyBBcmUgdGhlcmUgYW55IHBvdGVudGlhbCBib3R0bGVuZWNrcyBJIHNob3VsZCBiZSBhd2FyZSBvZj8gSSYjMzk7bSBnb2luZyB0byBsb29rIGF0IHRoZSBjb21tZW50cywgdGhlIHZhcmlhYmxlIG5hbWVzLCBhbmQgdGhlIG92ZXJhbGwgY29udHJvbCBmbG93IHRvIHF1aWNrbHkgZ3Jhc3AgdGhlIGVzc2VuY2Ugb2YgaXQuIERlcGVuZGluZyBvbiB0aGUgY29tcGxleGl0eSwgSSBtaWdodCBuZWVkIHRvIHRyYWNlIGl0cyBleGVjdXRpb24gd2l0aCBzb21lIHNhbXBsZSBkYXRhIGluIG15IGhlYWQsIGF0IGxlYXN0IGZvciB0aGUgY3JpdGljYWwgcGF0aHMuIE15IGdvYWwgaXMgdG8gcXVpY2tseSBwaW5wb2ludCBhbnkgcG90ZW50aWFsIHdlYWtuZXNzZXMsIGludGVyZXN0aW5nIG9wdGltaXphdGlvbiBzdHJhdGVnaWVzLCBvciBhbnkgYXJlYXMgdGhhdCBtaWdodCByZXF1aXJlIGZ1cnRoZXIgaW52ZXN0aWdhdGlvbiBiYXNlZCBvbiBteSBleHBlcmllbmNlLiBJIHdhbnQgdG8gYnVpbGQgYSBtZW50YWwgbW9kZWwgb2YgdGhpcyBmdW5jdGlvbiwgc28gSSBjYW4gc3RhcnQgZm9ybWluZyBteSBoeXBvdGhlc2VzIGFuZCBldmFsdWF0ZSBpZiBpdCYjMzk7cyBvcGVyYXRpbmcgYXMgaW50ZW5kZWQsIGFuZCBob3cgaXQgbWlnaHQgZml0IGludG8gdGhlIGJyb2FkZXIgc3lzdGVtIGFyY2hpdGVjdHVyZS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD44LzI8L3RkPgoJCQk8dGQ+MjAyNi8wNi8yOSAxNDozNDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O21tL3ZtcHJlc3N1cmUuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDEwOSwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiAxMDAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7IDEwOTpcdHZvaWQgdm1wcmVzc3VyZShnZnBfdCBnZnAsIGludCBvcmRlciwgc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLCBib29sIHRyZWUsXG4gMTEwOlx0XHRcdHVuc2lnbmVkIGxvbmcgc2Nhbm5lZCwgdW5zaWduZWQgbG9uZyByZWNsYWltZWQpXG4gMTExOlx0e1xuIDExMjpcdFx0c3RydWN0IHZtcHJlc3N1cmUgKnZtcHI7XG4gMTEzOlx0XG4gMTE0Olx0XHRpZiAobWVtX2Nncm91cF9kaXNhYmxlZCgpKVxuIDExNTpcdFx0XHRyZXR1cm47XG4gMTE2Olx0XG4gMTE3Olx0XHQvKlxuIDExODpcdFx0ICogT25seSB0d28gY29tYmluYXRpb25zIGhhdmUgYSBjb25zdW1lcjpcbiAxMTk6XHRcdCAqICAgY2dyb3VwIHYyICYjNDM7IHRyZWU9ZmFsc2UgLVx1MDAzZSBpbi1rZXJuZWwgc29ja2V0IHByZXNzdXJlXG4gMTIwOlx0XHQgKiAgIGNncm91cCB2MSAmIzQzOyB0cmVlPXRydWUgIC1cdTAwM2UgdXNlcnNwYWNlIGV2ZW50ZmRzIChtZW1vcnkucHJlc3N1cmVfbGV2ZWwpXG4gMTIxOlx0XHQgKiBTa2lwIHRoZSBvdGhlciB0d286IG5vdGhpbmcgY29uc3VtZXMgdGhlIHJlc3VsdC5cbiAxMjI6XHRcdCAqL1xuIDEyMzpcdFx0aWYgKCghY2dyb3VwX3N1YnN5c19vbl9kZmwobWVtb3J5X2NncnBfc3Vic3lzKSBcdTAwMjZcdTAwMjYgIXRyZWUpIHx8XG4gMTI0Olx0XHQgICAgKGNncm91cF9zdWJzeXNfb25fZGZsKG1lbW9yeV9jZ3JwX3N1YnN5cykgXHUwMDI2XHUwMDI2IHRyZWUpKVxuIDEyNTpcdFx0XHRyZXR1cm47XG4gMTI2Olx0XG4gMTI3Olx0XHR2bXByID0gbWVtY2dfdG9fdm1wcmVzc3VyZShtZW1jZyk7XG4gMTI4Olx0XG4gMTI5Olx0XHQvKlxuIDEzMDpcdFx0ICogSGVyZSB3ZSBvbmx5IHdhbnQgdG8gYWNjb3VudCBwcmVzc3VyZSB0aGF0IHVzZXJsYW5kIGlzIGFibGUgdG9cbiAxMzE6XHRcdCAqIGhlbHAgdXMgd2l0aC4gRm9yIGV4YW1wbGUsIHN1cHBvc2UgdGhhdCBETUEgem9uZSBpcyB1bmRlclxuIDEzMjpcdFx0ICogcHJlc3N1cmU7IGlmIHdlIG5vdGlmeSB1c2VybGFuZCBhYm91dCB0aGF0IGtpbmQgb2YgcHJlc3N1cmUsXG4gMTMzOlx0XHQgKiB0aGVuIGl0IHdpbGwgYmUgbW9zdGx5IGEgd2FzdGUgYXMgaXQgd2lsbCB0cmlnZ2VyIHVubmVjZXNzYXJ5XG4gMTM0Olx0XHQgKiBmcmVlaW5nIG9mIG1lbW9yeSBieSB1c2VybGFuZCAoc2luY2UgdXNlcmxhbmQgaXMgbW9yZSBsaWtlbHkgdG9cbiAxMzU6XHRcdCAqIGhhdmUgSElHSE1FTS9NT1ZBQkxFIHBhZ2VzIGluc3RlYWQgb2YgdGhlIERNQSBmYWxsYmFjaykuIFRoYXRcbiAxMzY6XHRcdCAqIGlzIHdoeSB3ZSBpbmNsdWRlIG9ubHkgbW92YWJsZSwgaGlnaG1lbSBhbmQgRlMvSU8gcGFnZXMuXG4gMTM3Olx0XHQgKiBJbmRpcmVjdCByZWNsYWltIChrc3dhcGQpIHNldHMgc2MtXHUwMDNlZ2ZwX21hc2sgdG8gR0ZQX0tFUk5FTCwgc29cbiAxMzg6XHRcdCAqIHdlIGFjY291bnQgaXQgdG9vLlxuIDEzOTpcdFx0ICovXG4gMTQwOlx0XHRpZiAoIShnZnAgXHUwMDI2IChfX0dGUF9ISUdITUVNIHwgX19HRlBfTU9WQUJMRSB8IF9fR0ZQX0lPIHwgX19HRlBfRlMpKSlcbiAxNDE6XHRcdFx0cmV0dXJuO1xuIDE0MjpcdFxuIDE0MzpcdFx0LypcbiAxNDQ6XHRcdCAqIElmIHdlIGdvdCBoZXJlIHdpdGggbm8gcGFnZXMgc2Nhbm5lZCwgdGhlbiB0aGF0IGlzIGFuIGluZGljYXRvclxuIDE0NTpcdFx0ICogdGhhdCByZWNsYWltZXIgd2FzIHVuYWJsZSB0byBmaW5kIGFueSBzaHJpbmthYmxlIExSVXMgYXQgdGhlXG4gMTQ2Olx0XHQgKiBjdXJyZW50IHNjYW5uaW5nIGRlcHRoLiBCdXQgaXQgZG9lcyBub3QgbWVhbiB0aGF0IHdlIHNob3VsZFxuIDE0NzpcdFx0ICogcmVwb3J0IHRoZSBjcml0aWNhbCBwcmVzc3VyZSwgeWV0LiBJZiB0aGUgc2Nhbm5pbmcgcHJpb3JpdHlcbiAxNDg6XHRcdCAqIChzY2FubmluZyBkZXB0aCkgZ29lcyB0b28gaGlnaCAoZGVlcCksIHdlIHdpbGwgYmUgbm90aWZpZWRcbiAxNDk6XHRcdCAqIHRocm91Z2ggdm1wcmVzc3VyZV9wcmlvKCkuIEJ1dCBzbyBmYXIsIGtlZXAgY2FsbS5cbiAxNTA6XHRcdCAqL1xuIDE1MTpcdFx0aWYgKCFzY2FubmVkKVxuIDE1MjpcdFx0XHRyZXR1cm47XG4gMTUzOlx0XG4gMTU0Olx0XHRpZiAodHJlZSkge1xuIDE1NTpcdFx0XHR2bXByZXNzdXJlX3YxX2FjY291bnRfdHJlZSh2bXByLCBzY2FubmVkLCByZWNsYWltZWQpO1xuIDE1NjpcdFx0fSBlbHNlIHtcbiAxNTc6XHRcdFx0ZW51bSB2bXByZXNzdXJlX2xldmVscyBsZXZlbDtcbiAxNTg6XHRcbiAxNTk6XHRcdFx0LyogRm9yIG5vdywgbm8gdXNlcnMgZm9yIHJvb3QtbGV2ZWwgZWZmaWNpZW5jeSAqL1xuIDE2MDpcdFx0XHRpZiAoIW1lbWNnIHx8IG1lbV9jZ3JvdXBfaXNfcm9vdChtZW1jZykpXG4gMTYxOlx0XHRcdFx0cmV0dXJuO1xuIDE2MjpcdFxuIDE2MzpcdFx0XHRzcGluX2xvY2soXHUwMDI2dm1wci1cdTAwM2Vzcl9sb2NrKTtcbiAxNjQ6XHRcdFx0c2Nhbm5lZCA9IHZtcHItXHUwMDNlc2Nhbm5lZCAmIzQzOz0gc2Nhbm5lZDtcbiAxNjU6XHRcdFx0cmVjbGFpbWVkID0gdm1wci1cdTAwM2VyZWNsYWltZWQgJiM0Mzs9IHJlY2xhaW1lZDtcbiAxNjY6XHRcdFx0aWYgKHNjYW5uZWQgXHUwMDNjIHZtcHJlc3N1cmVfd2luKSB7XG4gMTY3Olx0XHRcdFx0c3Bpbl91bmxvY2soXHUwMDI2dm1wci1cdTAwM2Vzcl9sb2NrKTtcbiAxNjg6XHRcdFx0XHRyZXR1cm47XG4gMTY5Olx0XHRcdH1cbiAxNzA6XHRcdFx0dm1wci1cdTAwM2VzY2FubmVkID0gdm1wci1cdTAwM2VyZWNsYWltZWQgPSAwO1xuIDE3MTpcdFx0XHRzcGluX3VubG9jayhcdTAwMjZ2bXByLVx1MDAzZXNyX2xvY2spO1xuIDE3MjpcdFxuIDE3MzpcdFx0XHRsZXZlbCA9IHZtcHJlc3N1cmVfY2FsY19sZXZlbChzY2FubmVkLCByZWNsYWltZWQpO1xuIDE3NDpcdFxuIDE3NTpcdFx0XHQvKlxuIDE3NjpcdFx0XHQgKiBPbmNlIHdlIGdvIGFib3ZlIENPU1RMWV9PUkRFUiwgcmVjbGFpbSByZWxpZXMgaGVhdmlseSBvblxuIDE3NzpcdFx0XHQgKiBjb21wYWN0aW9uIHRvIG1ha2UgcHJvZ3Jlc3MuIFJlY2xhaW0gZWZmaWNpZW5jeSB3YXMgbmV2ZXIgYVxuIDE3ODpcdFx0XHQgKiBncmVhdCBwcm94eSBmb3IgcHJlc3N1cmUgdG8gYmVnaW4gd2l0aCwgYnV0IGl0JiMzOTtzIG91dHJpZ2h0XG4gMTc5Olx0XHRcdCAqIG1pc2xlYWRpbmcgd2l0aCB0aGVzZSBoaWdoIG9yZGVycy4gRG9uJiMzOTt0IHRocm90dGxlIHNvY2tldHNcbiAxODA6XHRcdFx0ICogYmVjYXVzZSBzb21lYm9keSBpcyBhdHRlbXB0aW5nIHNvbWV0aGluZyBjcmF6eSBsaWtlIGFuIG9yZGVyLTdcbiAxODE6XHRcdFx0ICogYW5kIHByZWRpY3RhYmx5IHN0cnVnZ2xpbmcuXG4gMTgyOlx0XHRcdCAqL1xuIDE4MzpcdFx0XHRpZiAobGV2ZWwgXHUwMDNlIFZNUFJFU1NVUkVfTE9XIFx1MDAyNlx1MDAyNiBvcmRlciBcdTAwM2M9IFBBR0VfQUxMT0NfQ09TVExZX09SREVSKSB7XG4gMTg0Olx0XHRcdFx0LypcbiAxODU6XHRcdFx0XHQgKiBMZXQgdGhlIHNvY2tldCBidWZmZXIgYWxsb2NhdG9yIGtub3cgdGhhdFxuIDE4NjpcdFx0XHRcdCAqIHdlIGFyZSBoYXZpbmcgdHJvdWJsZSByZWNsYWltaW5nIExSVSBwYWdlcy5cbiAxODc6XHRcdFx0XHQgKlxuIDE4ODpcdFx0XHRcdCAqIEZvciBoeXN0ZXJlc2lzIGtlZXAgdGhlIHByZXNzdXJlIHN0YXRlXG4gMTg5Olx0XHRcdFx0ICogYXNzZXJ0ZWQgZm9yIGEgc2Vjb25kIGluIHdoaWNoIHN1YnNlcXVlbnRcbiAxOTA6XHRcdFx0XHQgKiBwcmVzc3VyZSBldmVudHMgY2FuIG9jY3VyLlxuIDE5MTpcdFx0XHRcdCAqL1xuIDE5MjpcdFx0XHRcdG1lbV9jZ3JvdXBfc2V0X3NvY2tldF9wcmVzc3VyZShtZW1jZyk7XG4gMTkzOlx0XHRcdH1cbiAxOTQ6XHRcdH1cbiAxOTU6XHR9XG4gMTk2Olx0XG4gMTk3Olx0LyoqXG4gMTk4Olx0ICogdm1wcmVzc3VyZV9pbml0KCkgLSBJbml0aWFsaXplIHZtcHJlc3N1cmUgY29udHJvbCBzdHJ1Y3R1cmVcbiAxOTk6XHQgKiBAdm1wcjpcdFN0cnVjdHVyZSB0byBiZSBpbml0aWFsaXplZFxuIDIwMDpcdCAqXG4gMjAxOlx0ICogVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIG9uIGV2ZXJ5IGFsbG9jYXRlZCB2bXByZXNzdXJlIHN0cnVjdHVyZVxuIDIwMjpcdCAqIGJlZm9yZSBhbnkgdXNhZ2UuXG4gMjAzOlx0ICovXG4gMjA0Olx0dm9pZCB2bXByZXNzdXJlX2luaXQoc3RydWN0IHZtcHJlc3N1cmUgKnZtcHIpXG4gMjA1Olx0e1xuIDIwNjpcdFx0c3Bpbl9sb2NrX2luaXQoXHUwMDI2dm1wci1cdTAwM2Vzcl9sb2NrKTtcbiAyMDc6XHRcdHZtcHJlc3N1cmVfdjFfaW5pdCh2bXByKTtcbiAyMDg6XHR9XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+OS8yPC90ZD4KCQkJPHRkPjIwMjYvMDYvMjkgMTQ6MzQ8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMjA5NjgKCQkJCQkJCW91dHB1dDogMjIKCQkJCQkJCXRob3VnaHRzOiA2MjkKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIHRoZSB2bXByZXNzdXJlIE9wdGltaXphdGlvbioqCgpPa2F5LCBzbyBJJiMzOTttIGxvb2tpbmcgYXQgdGhpcyBjaGFuZ2UgdG8gdGhlIGB2bXByZXNzdXJlYCBmdW5jdGlvbiwgd2hpY2ggZ2V0cyBjYWxsZWQgZnJvbSBwbGFjZXMgbGlrZSBgc2hyaW5rX25vZGVfbWVtY2dzYC4gVGhlIHBhdGNoIGlzIHR3ZWFraW5nIHRoaXMgZWFybHkgcmV0dXJuIGNvbmRpdGlvbjoKCmBgYGMKCWlmICgoIWNncm91cF9zdWJzeXNfb25fZGZsKG1lbW9yeV9jZ3JwX3N1YnN5cykgJmFtcDsmYW1wOyAhdHJlZSkgfHwKCSAgICAoY2dyb3VwX3N1YnN5c19vbl9kZmwobWVtb3J5X2NncnBfc3Vic3lzKSAmYW1wOyZhbXA7IHRyZWUpKQoJCXJldHVybjsKYGBgCgpFc3NlbnRpYWxseSwgdGhlIGxvZ2ljIG5vdyBhdm9pZHMgZG9pbmcgd29yayBpZiB3ZSYjMzk7cmUgaW4gY2dyb3VwIHYyIChgY2dyb3VwX3N1YnN5c19vbl9kZmxgIGlzIHRydWUpICphbmQqIHRoZSBgdHJlZWAgdmFyaWFibGUgaXMgYWxzbyB0cnVlLiBQcmV2aW91c2x5LCBpdCB3b3VsZCBvbmx5IHNob3J0LWNpcmN1aXQgaWYgd2Ugd2VyZW4mIzM5O3QgaW4gdjIgYW5kIGB0cmVlYCB3YXMgYWxzbyBmYWxzZS4gVGhpcyBpcyBkZWZpbml0ZWx5IGEgKmZ1bmN0aW9uYWwqIGNoYW5nZSBiZWNhdXNlIGl0IGFsdGVycyB0aGUgZXhlY3V0aW9uIHBhdGguCgpUaGUgb2xkIGNvZGUsIGluIHRoaXMgdjIgYW5kIGB0cmVlPXRydWVgIHNjZW5hcmlvLCB3b3VsZCBjb250aW51ZSwgaW5jcmVtZW50IGNvdW50ZXJzIHVuZGVyIGEgc3BpbmxvY2sgKGB2bXByLSZndDtzcl9sb2NrYCksIGFuZCBzY2hlZHVsZSBzb21lIHdvcmsuIFRoaXMgd29yaywgaG93ZXZlciwgdWx0aW1hdGVseSB3b3VsZCBkbyBub3RoaW5nIGJlY2F1c2UgYHZtcHJlc3N1cmVfcmVnaXN0ZXJfZXZlbnRgIGlzIG5ldmVyIGNhbGxlZCB1bmRlciBjZ3JvdXAgdjIuIFNvIHRoaXMgb3B0aW1pemF0aW9uIHNraXBzIHRoZSBsb2NrLCB0aGUgY291bnRlciB1cGRhdGVzLCBhbmQgdGhlIHBvaW50bGVzcyB3b3JrIHNjaGVkdWxpbmcuIEl0JiMzOTtzIHJlYWxseSBqdXN0IGF2b2lkaW5nIGFuIG92ZXJoZWFkLgoKVGhlIGJpZyBxdWVzdGlvbiBpcyB3aGV0aGVyIHRoaXMgaXMgd29ydGggZnV6emluZy4gSXQmIzM5O3MgYSByZWxhdGl2ZWx5IG1pbm9yIG9wdGltaXphdGlvbiBpbiB0ZXJtcyBvZiBpbXBhY3QsIGJ1dCB0aGUgY2hhbmdlICphbHNvKiBtb3ZlcyB0aGUgY29kZSB0byBhIG5ldyBmaWxlLCB3aGljaCBpcyBhIHN0cnVjdHVyYWwgY2hhbmdlLCBhbmQgdGhhdCYjMzk7cyBzb21ldGhpbmcgSSBuZWVkIHRvIGNvbnNpZGVyIHRvby4KCklmIEkgd2VyZSB0byBzYXkgJiMzNDtXb3J0aEZ1enppbmc9dHJ1ZSwmIzM0OyB0aGVuIEkmIzM5O2QgYmUgbG9va2luZyBhdCBgdm1wcmVzc3VyZWAsIGB2bXByZXNzdXJlX3YxX2FjY291bnRfdHJlZWAsIGB2bXByZXNzdXJlX3JlZ2lzdGVyX2V2ZW50YCwgYHZtcHJlc3N1cmVfdW5yZWdpc3Rlcl9ldmVudGAsIGFuZCBgdm1wcmVzc3VyZV9wcmlvYC4gVGhlIHJlbGV2YW50IGNvbmZpZ3VyYXRpb25zIGFyZSBgTUVNQ0dfVjFgIGFuZCBgTUVNQ0dgLgoKTm93LCBJIHNob3VsZCBjaGVjayB0aGF0IGB2bXByZXNzdXJlX3YxX2FjY291bnRfdHJlZWAgKmlzKiBhY3R1YWxseSByZWFjaGFibGUuIFllcywgaWYgYENPTkZJR19NRU1DR19WMWAgaXMgZW5hYmxlZCBhbmQgd2UmIzM5O3JlICphY3R1YWxseSogb24gY2dyb3VwIHYxLCB0aGVuIGB2bXByZXNzdXJlYCB3aWxsIGNvcnJlY3RseSBjYWxsIGB2bXByZXNzdXJlX3YxX2FjY291bnRfdHJlZWAuIFdoYXQgYWJvdXQgYHZtcHJlc3N1cmVfcmVnaXN0ZXJfZXZlbnRgPyBMZXQgbWUgc2VlLiBBaCwgeWVzLCBpdCYjMzk7cyBjYWxsZWQgZnJvbSBgbWVtX2Nncm91cF91c2FnZV9yZWdpc3Rlcl9ldmVudGAgYW5kIHNpbWlsYXIgaW4gYG1tL21lbWNvbnRyb2wtdjEuY2AuIEdvb2QsIGxldCBtZSBqdXN0IHZlcmlmeSB0aGF0LgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEwLzI8L3RkPgoJCQk8dGQ+MjAyNi8wNi8yOSAxNDozNDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDt2bXByZXNzdXJlX3JlZ2lzdGVyX2V2ZW50JiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2luY2x1ZGUvbGludXgvdm1wcmVzc3VyZS5oPTU5PWV4dGVybiB2b2lkIHZtcHJlc3N1cmVfcHJpbyhnZnBfdCBnZnAsIHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZywgaW50IHByaW8pO1xuaW5jbHVkZS9saW51eC92bXByZXNzdXJlLmg6NjA6ZXh0ZXJuIGludCB2bXByZXNzdXJlX3JlZ2lzdGVyX2V2ZW50KHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZyxcbmluY2x1ZGUvbGludXgvdm1wcmVzc3VyZS5oLTYxLVx0XHRcdFx0ICAgICBzdHJ1Y3QgZXZlbnRmZF9jdHggKmV2ZW50ZmQsXG4tLVxubW0vbWVtY29udHJvbC12MS5jPTEwOTU9c3RhdGljIHNzaXplX3QgbWVtY2dfd3JpdGVfZXZlbnRfY29udHJvbChzdHJ1Y3Qga2VybmZzX29wZW5fZmlsZSAqb2YsXG4tLVxubW0vbWVtY29udHJvbC12MS5jLTExOTEtXHRcdFx0ICAgICBcJiMzNDtpZiB5b3UgZGVwZW5kIG9uIHRoaXMgZnVuY3Rpb25hbGl0eS5cXG5cJiMzNDspO1xubW0vbWVtY29udHJvbC12MS5jOjExOTI6XHRcdGV2ZW50LVx1MDAzZXJlZ2lzdGVyX2V2ZW50ID0gdm1wcmVzc3VyZV9yZWdpc3Rlcl9ldmVudDtcbm1tL21lbWNvbnRyb2wtdjEuYy0xMTkzLVx0XHRldmVudC1cdTAwM2V1bnJlZ2lzdGVyX2V2ZW50ID0gdm1wcmVzc3VyZV91bnJlZ2lzdGVyX2V2ZW50O1xuLS1cbm1tL3ZtcHJlc3N1cmUtdjEuYz0xOTA9dm9pZCB2bXByZXNzdXJlX3ByaW8oZ2ZwX3QgZ2ZwLCBzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csIGludCBwcmlvKVxuLS1cbm1tL3ZtcHJlc3N1cmUtdjEuYy0yMTEtLyoqXG5tbS92bXByZXNzdXJlLXYxLmM6MjEyOiAqIHZtcHJlc3N1cmVfcmVnaXN0ZXJfZXZlbnQoKSAtIEJpbmQgdm1wcmVzc3VyZSBub3RpZmljYXRpb25zIHRvIGFuIGV2ZW50ZmRcbm1tL3ZtcHJlc3N1cmUtdjEuYy0yMTMtICogQG1lbWNnOlx0bWVtY2cgdGhhdCBpcyBpbnRlcmVzdGVkIGluIHZtcHJlc3N1cmUgbm90aWZpY2F0aW9uc1xuLS1cbm1tL3ZtcHJlc3N1cmUtdjEuYy0yMjgtICovXG5tbS92bXByZXNzdXJlLXYxLmM6MjI5OmludCB2bXByZXNzdXJlX3JlZ2lzdGVyX2V2ZW50KHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZyxcbm1tL3ZtcHJlc3N1cmUtdjEuYy0yMzAtXHRcdFx0ICAgICAgc3RydWN0IGV2ZW50ZmRfY3R4ICpldmVudGZkLCBjb25zdCBjaGFyICphcmdzKVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjExLzI8L3RkPgoJCQk8dGQ+MjAyNi8wNi8yOSAxNDozNDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyMjY3NQoJCQkJCQkJb3V0cHV0OiAyMgoJCQkJCQkJdGhvdWdodHM6IDExMzcKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHlzaXMgb2YgdGhlIFBhdGNoIGZvciBGdXp6aW5nIFdvcnRoaW5lc3MqKgoKT2theSwgc28gSSYjMzk7bSBsb29raW5nIGF0IHRoaXMgcGF0Y2ggYW5kIG15IGluaXRpYWwgdGhvdWdodCBpcywgeWVzLCBgdm1wcmVzc3VyZV9yZWdpc3Rlcl9ldmVudGAgaXMgZGVmaW5pdGVseSB1c2VkIHdpdGhpbiBgbWVtY2dfd3JpdGVfZXZlbnRfY29udHJvbGAsIHdoaWNoIG1lYW5zIHRoaXMgaXMgYWJzb2x1dGVseSBjb3JlIGtlcm5lbCBsb2dpYyB0aGF0JiMzOTtzIHJlYWNoYWJsZS4gVGhlIHBhdGNoIGlzIGRvaW5nIGEgcmVmYWN0b3IgYW5kIGludHJvZHVjaW5nIGFuIG9wdGltaXphdGlvbjsgSSB0aGluayB0aGlzIGxvb2tzIHByZXR0eSBnb29kLiBNeSBmaXJzdCBpbmNsaW5hdGlvbiBpcyB0byBzZXQgYFdvcnRoRnV6emluZz10cnVlYC4KCk5vdywgbGV0IG1lIG1ha2Ugc3VyZSBJJiMzOTttIGNhcHR1cmluZyBhbGwgdGhlIHJlbGV2YW50IHN5bWJvbHMuIEkmIzM5O2xsIGpvdCBkb3duOiBgdm1wcmVzc3VyZWAsIGB2bXByZXNzdXJlX3YxX2FjY291bnRfdHJlZWAsIGB2bXByZXNzdXJlX3JlZ2lzdGVyX2V2ZW50YCwgYHZtcHJlc3N1cmVfdW5yZWdpc3Rlcl9ldmVudGAsIGFuZCBgdm1wcmVzc3VyZV9wcmlvYC4gRm9yIHRoZSBjb25maWdzLCBJIG5lZWQgdG8gbWFrZSBzdXJlIEkgaW5jbHVkZSBgTUVNQ0dgLCBhcyB0aGF0JiMzOTtzIGVzc2VudGlhbCBmb3IgYHZtcHJlc3N1cmVgIHRvIGV2ZW4gY29tcGlsZS4gQWxzbywgaXQgbG9va3MgbGlrZSBgTUVNQ0dfVjFgIGlzIHRoZSBuZXcgY29uZmlnIGd1YXJkaW5nIHRoZSB2MS1zcGVjaWZpYyBjb2RlLiBMZXQgbWUgcXVpY2tseSBkb3VibGUtY2hlY2sgdGhlIGBLY29uZmlnYCB0byBiZSBzdXJlIHRoYXQgYE1FTUNHX1YxYCBpc24mIzM5O3QgZW5hYmxlZCBieSBkZWZhdWx0LiBBaCwgeWVzLCBpdCYjMzk7cyBleHBsaWNpdGx5IGEgYm9vbGVhbi4gU28sIGJvdGggYE1FTUNHYCBhbmQgYE1FTUNHX1YxYCB3aWxsIGdvIGludG8gbXkgYEVuYWJsZUNvbmZpZ3NgLgoKTm93LCBJIG5lZWQgdG8gcmVtaW5kIG15c2VsZiB3aGF0IHRoZSBwcm9tcHQgc2FpZCByZWdhcmRpbmcgYFdvcnRoRnV6emluZz1mYWxzZWAuIEl0IHdhcyBzb21ldGhpbmcgYWxvbmcgdGhlIGxpbmVzIG9mICYjMzQ7bW9kaWZpY2F0aW9ucyB0byBkb2N1bWVudGF0aW9uLCBLY29uZmlnLCBjb2RlIGNvbW1lbnRzOyBkZWNvcmF0aXZlIGNoYW5nZXMgbGlrZSBsb2dnaW5nOyBjaGFuZ2VzIHRvIGNvbnN0YW50cy9tYWNyb3MgdGhhdCBkb24mIzM5O3QgYWx0ZXIgZXhlY3V0aW9uOyBhbmQgdW5yZWFjaGFibGUgY29kZSBwYXRocy4mIzM0OwoKQnV0IHRoaXMgcGF0Y2ggKmlzKiBhbHRlcmluZyBleGVjdXRpb24gZmxvdyB3aXRoIGFuIG9wdGltaXphdGlvbiEgSXQgYWxzbyBpbmNsdWRlcyBzdHJ1Y3R1cmFsIGNoYW5nZXMgYnkgbW92aW5nIGNvZGUgdG8gYSBuZXcgZmlsZS4gVGhlIHF1ZXN0aW9uIGlzIHdoZXRoZXIgaXQmIzM5O3MgKnB1cmVseSogcmVmYWN0b3JpbmcsIGJ1dCB0aGF0JiMzOTtzIG5vdCB0aGUgY2FzZS4gVGhlIGZ1bmN0aW9uYWwgY2hhbmdlIGluIGB2bXByZXNzdXJlYCBpcyB0aGUga2V5LiBUaGUgb3B0aW1pemF0aW9uIGluIGB2bXByZXNzdXJlYCBpcyB0aGUgZnVuY3Rpb25hbCBjaGFuZ2UsIGNvbWJpbmVkIHdpdGggdGhlIGZhY3QgdGhhdCBpdCBleHRyYWN0cyBgdm1wcmVzc3VyZS12MS5jYCwgYnV0IGFsc28gaW50cm9kdWNlcyBhIG5ldyBjb25maWcgYENPTkZJR19NRU1DR19WMWAgdGhhdCBjYW4gYmUgZGlzYWJsZWQgdG8gcmVtb3ZlIHRoZSBjb2RlLiBUaGVyZWZvcmUsIGl0JiMzOTtzIGEgZnVuY3Rpb25hbCBjaGFuZ2UgdGhhdCBhbHRlcnMgaG93IHRoZSBjb3JlIG1lbW9yeSBtYW5hZ2VtZW50IGxvZ2ljIHdvcmtzLiBUaGUgcHJvbXB0IHNheXMgdGhhdCBpZiB0aGUgcGF0Y2ggbW9kaWZpZXMgcmVhY2hhYmxlIGNvcmUga2VybmVsIGxvZ2ljIGFuZCBhbHRlcnMgZXhlY3V0aW9uLCBJIHNob3VsZCByZXR1cm4gYFdvcnRoRnV6emluZz10cnVlYC4KCkhvbGQgb24uIFRoZSBwcm9tcHQgKmRvZXMqIHNheSAmIzM0O1JldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgaWYgdGhlIHBhdGNoIG9ubHkgY29udGFpbnMgLi4uJiMzNDsuIEl0IGRvZXNuJiMzOTt0IGV4cGxpY2l0bHkgdGFsayBhYm91dCByZWZhY3RvcmluZywgYnV0IHR5cGljYWxseSByZWZhY3RvcmluZyBhbG9uZSB3aXRob3V0IGEgZnVuY3Rpb25hbCBjaGFuZ2Ugd291bGRuJiMzOTt0IGJlIHdvcnRoIGZ1enppbmcsIGFzIGl0JiMzOTtzIGp1c3QgY29kZSByZW9yZ2FuaXphdGlvbi4gQnV0IHRoaXMgcGF0Y2ggKmRvZXMqIGludHJvZHVjZSBhIGZ1bmN0aW9uYWwgY2hhbmdlOgoKYGBgYwoJaWYgKCghY2dyb3VwX3N1YnN5c19vbl9kZmwobWVtb3J5X2NncnBfc3Vic3lzKSAmYW1wOyZhbXA7ICF0cmVlKSB8fAoJICAgIChjZ3JvdXBfc3Vic3lzX29uX2RmbChtZW1vcnlfY2dycF9zdWJzeXMpICZhbXA7JmFtcDsgdHJlZSkpCgkJcmV0dXJuOwpgYGAKClRoaXMgY2hhbmdlcyB0aGUgYmVoYXZpb3IgaW4gY2dyb3VwIHYyIHdoZW4gYHRyZWU9dHJ1ZWAuIEl0IG5vdyByZXR1cm5zIGVhcmx5IGluc3RlYWQgb2YgYWNjdW11bGF0aW5nIGNvdW50ZXJzIGFuZCBzY2hlZHVsaW5nIHdvcmsgaXRlbXMuIFNvLCB0aGlzIGlzIGRlZmluaXRlbHkgYSBmdW5jdGlvbmFsIGNoYW5nZS4KCkxldCBtZSBtYWtlIHRoaXMgcmVhbGx5IGNsZWFyLiBUaGUgcGF0Y2ggc3BsaXRzIGNncm91cCB2MSYjMzk7cyBgdm1wcmVzc3VyZWAgY29kZSBpbnRvIGEgc2VwYXJhdGUgZmlsZSAoYG1tL3ZtcHJlc3N1cmUtdjEuY2ApIGd1YXJkZWQgYnkgYENPTkZJR19NRU1DR19WMWAuIEl0ICphbHNvKiBoYXMgYSBmdW5jdGlvbmFsIG9wdGltaXphdGlvbiBpbiBgdm1wcmVzc3VyZSgpYC4gVGhpcyBlYXJseSBleGl0IG9wdGltaXphdGlvbiBhdm9pZHMgdW5uZWNlc3NhcnkgY291bnRlciBhY2N1bXVsYXRpb24gYW5kIHdvcmsgc2NoZWR1bGluZy4gVGhpcyBtb2RpZmljYXRpb24gYWZmZWN0cyByZWFjaGFibGUgY29yZSBtZW1vcnkgbWFuYWdlbWVudCBsb2dpYyBhbmQgYWx0ZXJzIGV4ZWN1dGlvbiBmbG93LCBzbyBJJiMzOTttIGNvbmZpZGVudCB0aGF0IGl0IGlzIHdvcnRoIGZ1enppbmcuIEkmIzM5O2xsIHN0aWxsIGluY2x1ZGUgdGhlIGZvY3VzIHN5bWJvbHMgYW5kIHRoZSBlbmFibGluZyBjb25maWd1cmF0aW9ucy4KCkZvY3VzIFN5bWJvbHM6Ci0gYHZtcHJlc3N1cmVgCi0gYHZtcHJlc3N1cmVfdjFfYWNjb3VudF90cmVlYAotIGB2bXByZXNzdXJlX3JlZ2lzdGVyX2V2ZW50YAotIGB2bXByZXNzdXJlX3VucmVnaXN0ZXJfZXZlbnRgCi0gYHZtcHJlc3N1cmVfcHJpb2AKLSBgdm1wcmVzc3VyZV93b3JrX2ZuYAotIGB2bXByZXNzdXJlX2V2ZW50YAoKRW5hYmxlQ29uZmlnczoKLSBgTUVNQ0dgCi0gYE1FTUNHX1YxYAoKSnVzdCB0byBtYWtlIHN1cmUgSSYjMzk7bSB0aG9yb3VnaCwgbGV0IG1lIG5vdGUgdGhhdCBgdm1wcmVzc3VyZV93b3JrX2ZuYCBpcyBtb3ZlZCB0byBgbW0vdm1wcmVzc3VyZS12MS5jYCBhcyBpcyBgdm1wcmVzc3VyZV9ldmVudGAgYW5kIGB2bXByZXNzdXJlX2NhbGNfbGV2ZWxgIGlzIG5vdyBleHBvc2VkLiBgdm1wcmVzc3VyZV92MV9pbml0YCBhbmQgYHZtcHJlc3N1cmVfdjFfY2xlYW51cGAgYXJlIG5ldy4gRXZlbiB0aG91Z2ggYHZtcHJlc3N1cmVfd29ya19mbmAgYW5kIGB2bXByZXNzdXJlX2V2ZW50YCBhcmUgc3RhdGljCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMi8yPC90ZD4KCQkJPHRkPjIwMjYvMDYvMjkgMTQ6MzU8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7dm1wcmVzc3VyZV93b3JrX2ZuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O21tL3ZtcHJlc3N1cmUtdjEuYz04Mz1zdGF0aWMgYm9vbCB2bXByZXNzdXJlX2V2ZW50KHN0cnVjdCB2bXByZXNzdXJlICp2bXByLFxuLS1cbm1tL3ZtcHJlc3N1cmUtdjEuYy0xMDUtXG5tbS92bXByZXNzdXJlLXYxLmM6MTA2OnN0YXRpYyB2b2lkIHZtcHJlc3N1cmVfd29ya19mbihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspXG5tbS92bXByZXNzdXJlLXYxLmMtMTA3LXtcbi0tXG5tbS92bXByZXNzdXJlLXYxLmM9MTYzPXZvaWQgdm1wcmVzc3VyZV92MV9pbml0KHN0cnVjdCB2bXByZXNzdXJlICp2bXByKVxuLS1cbm1tL3ZtcHJlc3N1cmUtdjEuYy0xNjYtXHRJTklUX0xJU1RfSEVBRChcdTAwMjZ2bXByLVx1MDAzZWV2ZW50cyk7XG5tbS92bXByZXNzdXJlLXYxLmM6MTY3Olx0SU5JVF9XT1JLKFx1MDAyNnZtcHItXHUwMDNld29yaywgdm1wcmVzc3VyZV93b3JrX2ZuKTtcbm1tL3ZtcHJlc3N1cmUtdjEuYy0xNjgtfVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEzLzI8L3RkPgoJCQk8dGQ+MjAyNi8wNi8yOSAxNDozNTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyNTA5OQoJCQkJCQkJb3V0cHV0OiAyMTEKCQkJCQkJCXRob3VnaHRzOiAyMzIKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqUmVmaW5pbmcgdGhlIFZNUHJlc3N1cmUgTG9naWMqKgoKT2theSwgc28gSSYjMzk7dmUgY29uZmlybWVkIHRoYXQgdGhvc2Ugc3ltYm9scyBhcmUgaW5kZWVkIHN0YXRpYy4gVGhhdCBtZWFucyBJIG5lZWQgdG8gaW5jbHVkZSBgdm1wcmVzc3VyZV93b3JrX2ZuYCBhbmQgYHZtcHJlc3N1cmVfZXZlbnRgIGluIEZvY3VzU3ltYm9scy4gRXhwYW5kaW5nIG15IGZvY3VzLCBJJiMzOTtsbCB1cGRhdGUgdGhhdCBsaXN0OgoKKiAgIGB2bXByZXNzdXJlYAoqICAgYHZtcHJlc3N1cmVfdjFfYWNjb3VudF90cmVlYAoqICAgYHZtcHJlc3N1cmVfd29ya19mbmAKKiAgIGB2bXByZXNzdXJlX2V2ZW50YAoqICAgYHZtcHJlc3N1cmVfcmVnaXN0ZXJfZXZlbnRgCiogICBgdm1wcmVzc3VyZV91bnJlZ2lzdGVyX2V2ZW50YAoqICAgYHZtcHJlc3N1cmVfcHJpb2AKCk5vdywgbGV0JiMzOTtzIGJyZWFrIGRvd24gdGhlIHJlYXNvbmluZyBiZWhpbmQgdGhpcy4gVGhlIHBhdGNoIGlzIGNsZWFybHkgZG9pbmcgc29tZSB0YXJnZXRlZCByZWZhY3RvcmluZy4gSXQmIzM5O3MgbW92aW5nIHRoZSBjZ3JvdXAgdjEgc3BlY2lmaWMgYHZtcHJlc3N1cmVgIGNvZGUgaW50byBpdHMgb3duIGZpbGUsIGBtbS92bXByZXNzdXJlLXYxLmNgLCBhbmQgdGhhdCYjMzk7cyBndWFyZGVkIGJ5IHRoZSBgQ09ORklHX01FTUNHX1YxYCBmbGFnLiBTbWFydC4gSXQmIzM5O3MgYWxzbyBvcHRpbWl6aW5nIHRoZSBgdm1wcmVzc3VyZSgpYCBmdW5jdGlvbiBpdHNlbGYsIHNwZWNpZmljYWxseSBmb3IgY2dyb3VwIHYyIHdoZW4gYSBgdHJlZT10cnVlYCBzY2VuYXJpby4gVGhhdCYjMzk7cyBhIGdvb2QgcGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uLCBza2lwcGluZyB1bm5lY2Vzc2FyeSBjb3VudGVyIGFjY3VtdWxhdGlvbiBhbmQgd29yayBzY2hlZHVsaW5nLiBUaGlzIHRvdWNoZXMgY29yZSBtZW1vcnkgbWFuYWdlbWVudCBsb2dpYyBhbmQsIGNyaXRpY2FsbHksIGFsdGVycyB0aGUgZXhlY3V0aW9uIGZsb3cgb2YgdGhlIHJlbGF0ZWQgZnVuY3Rpb25zLiBUaGF0IHNpZ25hbHMgYSBuZWVkIGZvciBmdXp6aW5nLiBHaXZlbiB0aGUgbW9kaWZpY2F0aW9uIHRvIHJlYWNoYWJsZSBjb2RlLCBhbmQgdGhlIGFsdGVyaW5nIG9mIHRoZSBjb2RlIHBhdGggYmFzZWQgb24gYHRyZWU9dHJ1ZWAsIGl0JiMzOTtzIGZ1enogdGltZS4KCkFscmlnaHQsIEkmIzM5O2xsIGNhbGwgYHNldC1yZXN1bHRzYCBub3cuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTQvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA2LzI5IDE0OjM1PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+c2V0LXJlc3VsdHM8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtNRU1DRyYjMzQ7LAogICAgJiMzNDtNRU1DR19WMSYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O3ZtcHJlc3N1cmUmIzM0OywKICAgICYjMzQ7dm1wcmVzc3VyZV92MV9hY2NvdW50X3RyZWUmIzM0OywKICAgICYjMzQ7dm1wcmVzc3VyZV93b3JrX2ZuJiMzNDssCiAgICAmIzM0O3ZtcHJlc3N1cmVfZXZlbnQmIzM0OywKICAgICYjMzQ7dm1wcmVzc3VyZV9yZWdpc3Rlcl9ldmVudCYjMzQ7LAogICAgJiMzNDt2bXByZXNzdXJlX3VucmVnaXN0ZXJfZXZlbnQmIzM0OywKICAgICYjMzQ7dm1wcmVzc3VyZV9wcmlvJiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIGV4dHJhY3RzIGNncm91cCB2MSBzcGVjaWZpYyB2bXByZXNzdXJlIGxvZ2ljIGludG8gYSBuZXcgZmlsZSBgbW0vdm1wcmVzc3VyZS12MS5jYCBndWFyZGVkIGJ5IGBDT05GSUdfTUVNQ0dfVjFgLiBJdCBhbHNvIGludHJvZHVjZXMgYSBmdW5jdGlvbmFsIG9wdGltaXphdGlvbiBpbiBgdm1wcmVzc3VyZSgpYCB0byByZXR1cm4gZWFybHkgZm9yIGNncm91cCB2MiB3aGVuIGB0cmVlPXRydWVgLCBhdm9pZGluZyB1bm5lY2Vzc2FyeSBjb3VudGVyIGFjY3VtdWxhdGlvbiBhbmQgd29yayBzY2hlZHVsaW5nLiBUaGlzIG1vZGlmaWVzIHJlYWNoYWJsZSBjb3JlIG1lbW9yeSBtYW5hZ2VtZW50IGxvZ2ljIGFuZCBhbHRlcnMgZXhlY3V0aW9uIGZsb3csIHNvIGl0IHNob3VsZCBiZSBmdXp6ZWQuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O01FTUNHJiMzNDssCiAgICAmIzM0O01FTUNHX1YxJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7dm1wcmVzc3VyZSYjMzQ7LAogICAgJiMzNDt2bXByZXNzdXJlX3YxX2FjY291bnRfdHJlZSYjMzQ7LAogICAgJiMzNDt2bXByZXNzdXJlX3dvcmtfZm4mIzM0OywKICAgICYjMzQ7dm1wcmVzc3VyZV9ldmVudCYjMzQ7LAogICAgJiMzNDt2bXByZXNzdXJlX3JlZ2lzdGVyX2V2ZW50JiMzNDssCiAgICAmIzM0O3ZtcHJlc3N1cmVfdW5yZWdpc3Rlcl9ldmVudCYjMzQ7LAogICAgJiMzNDt2bXByZXNzdXJlX3ByaW8mIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggZXh0cmFjdHMgY2dyb3VwIHYxIHNwZWNpZmljIHZtcHJlc3N1cmUgbG9naWMgaW50byBhIG5ldyBmaWxlIGBtbS92bXByZXNzdXJlLXYxLmNgIGd1YXJkZWQgYnkgYENPTkZJR19NRU1DR19WMWAuIEl0IGFsc28gaW50cm9kdWNlcyBhIGZ1bmN0aW9uYWwgb3B0aW1pemF0aW9uIGluIGB2bXByZXNzdXJlKClgIHRvIHJldHVybiBlYXJseSBmb3IgY2dyb3VwIHYyIHdoZW4gYHRyZWU9dHJ1ZWAsIGF2b2lkaW5nIHVubmVjZXNzYXJ5IGNvdW50ZXIgYWNjdW11bGF0aW9uIGFuZCB3b3JrIHNjaGVkdWxpbmcuIFRoaXMgbW9kaWZpZXMgcmVhY2hhYmxlIGNvcmUgbWVtb3J5IG1hbmFnZW1lbnQgbG9naWMgYW5kIGFsdGVycyBleGVjdXRpb24gZmxvdywgc28gaXQgc2hvdWxkIGJlIGZ1enplZC4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8L3Rib2R5PgoJPC90YWJsZT4KCgk8ZGl2IGlkPSJsbG1fc3VtbWFyeV90YWJsZV9kaXYiIHN0eWxlPSJtYXJnaW46IDIwcHggMDsiPgoJCTx0YWJsZSBjbGFzcz0ibGlzdF90YWJsZSI+CgkJCTxjYXB0aW9uPkxMTSBDYWxscyBTdW1tYXJ5OjwvY2FwdGlvbj4KCQkJPHRoZWFkPgoJCQkJPHRyPgoJCQkJCTx0aD5Ub3RhbCBDYWxsczwvdGg+CgkJCQkJPHRoPlRvdGFsIFRva2VuczwvdGg+CgkJCQkJPHRoPkF2ZyBUb2tlbnM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJCTx0aD5BdmcgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCTwvdHI+CgkJCTwvdGhlYWQ+CgkJCTx0Ym9keSBpZD0ibGxtX3N1bW1hcnlfc3RhdHNfYm9keSI+PC90Ym9keT4KCQk8L3RhYmxlPgoJPC9kaXY+CgoJPGRpdiBpZD0idG9vbF9zdW1tYXJ5X3RhYmxlX2RpdiIgc3R5bGU9Im1hcmdpbjogMjBweCAwOyI+CgkJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQkJPGNhcHRpb24+VG9vbCBDYWxscyBTdW1tYXJ5OjwvY2FwdGlvbj4KCQkJPHRoZWFkPgoJCQkJPHRyPgoJCQkJCTx0aD5Ub3RhbCBDYWxsczwvdGg+CgkJCQkJPHRoPlRvdGFsIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQkJPHRoPkF2ZyBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJPC90cj4KCQkJPC90aGVhZD4KCQkJPHRib2R5IGlkPSJ0b29sX3N1bW1hcnlfc3RhdHNfYm9keSI+PC90Ym9keT4KCQk8L3RhYmxlPgoJPC9kaXY+CgoJPGRpdiBpZD0iZHVyYXRpb25fY2hhcnRfZGl2IiBzdHlsZT0id2lkdGg6IDEwMCU7IG1hcmdpbjogMjBweCAwOyBib3JkZXI6IDFweDsiPjwvZGl2PgoJPGRpdiBpZD0idG9rZW5fY2hhcnRfZGl2IiBzdHlsZT0id2lkdGg6IDEwMCU7IG1hcmdpbjogMjBweCAwOyBib3JkZXI6IDFweDsiPjwvZGl2PgoKCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Imh0dHBzOi8vd3d3Lmdvb2dsZS5jb20vanNhcGkiPjwvc2NyaXB0PgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgoJCWdvb2dsZS5sb2FkKCJ2aXN1YWxpemF0aW9uIiwgIjEiLCB7cGFja2FnZXM6WyJjb3JlY2hhcnQiXX0pOwoJCWdvb2dsZS5zZXRPbkxvYWRDYWxsYmFjayhkcmF3Q2hhcnRzKTsKCgkJZnVuY3Rpb24gZHJhd0NoYXJ0cygpIHsKCQkJY29uc3QgcmF3RGF0YSA9IFt7IlN0YXJ0ZWQiOiIyMDI2LTA2LTI5VDE0OjMzOjU2Ljk0NTI5Njg3MVoiLCJTZXEiOjAsIk5lc3RpbmciOjAsIlR5cGUiOiJmbG93IiwiTmFtZSI6InBhdGNoLXRyaWFnZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjg1NDUxODI0NzcyLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIk1FTUNHXCIsXG4gICAgXCJNRU1DR19WMVwiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcInZtcHJlc3N1cmVcIixcbiAgICBcInZtcHJlc3N1cmVfdjFfYWNjb3VudF90cmVlXCIsXG4gICAgXCJ2bXByZXNzdXJlX3dvcmtfZm5cIixcbiAgICBcInZtcHJlc3N1cmVfZXZlbnRcIixcbiAgICBcInZtcHJlc3N1cmVfcmVnaXN0ZXJfZXZlbnRcIixcbiAgICBcInZtcHJlc3N1cmVfdW5yZWdpc3Rlcl9ldmVudFwiLFxuICAgIFwidm1wcmVzc3VyZV9wcmlvXCJcbiAgXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggZXh0cmFjdHMgY2dyb3VwIHYxIHNwZWNpZmljIHZtcHJlc3N1cmUgbG9naWMgaW50byBhIG5ldyBmaWxlIGBtbS92bXByZXNzdXJlLXYxLmNgIGd1YXJkZWQgYnkgYENPTkZJR19NRU1DR19WMWAuIEl0IGFsc28gaW50cm9kdWNlcyBhIGZ1bmN0aW9uYWwgb3B0aW1pemF0aW9uIGluIGB2bXByZXNzdXJlKClgIHRvIHJldHVybiBlYXJseSBmb3IgY2dyb3VwIHYyIHdoZW4gYHRyZWU9dHJ1ZWAsIGF2b2lkaW5nIHVubmVjZXNzYXJ5IGNvdW50ZXIgYWNjdW11bGF0aW9uIGFuZCB3b3JrIHNjaGVkdWxpbmcuIFRoaXMgbW9kaWZpZXMgcmVhY2hhYmxlIGNvcmUgbWVtb3J5IG1hbmFnZW1lbnQgbG9naWMgYW5kIGFsdGVycyBleGVjdXRpb24gZmxvdywgc28gaXQgc2hvdWxkIGJlIGZ1enplZC5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDYtMjlUMTQ6MzM6NTYuOTQ1MzAyMDYxWiIsIlNlcSI6MSwiTmVzdGluZyI6MSwiVHlwZSI6ImFjdGlvbiIsIk5hbWUiOiJyZWFkLXBhdGNoLWRpZmYiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo1NTc0OTg2NjYsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIlBhdGNoRGlmZlwiOiBcImNvbW1pdCBiNTE3NGFkNWRhMjQ1ZjUzZmViNzgyNGFkNmMxMmVlNWZiZjllYTQzXFxuQXV0aG9yOiBzeXotY2x1c3RlciBcXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cXHUwMDNlXFxuRGF0ZTogICBNb24gSnVuIDI5IDE0OjMzOjU1IDIwMjYgKzAwMDBcXG5cXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XFxuXFxuZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdm1wcmVzc3VyZS5oIGIvaW5jbHVkZS9saW51eC92bXByZXNzdXJlLmhcXG5pbmRleCBmYWVjZDU1MjI0MDE3OS4uZTVlNmI2OGQwZGM0MzIgMTAwNjQ0XFxuLS0tIGEvaW5jbHVkZS9saW51eC92bXByZXNzdXJlLmhcXG4rKysgYi9pbmNsdWRlL2xpbnV4L3ZtcHJlc3N1cmUuaFxcbkBAIC0xMywxOCArMTMsMzEgQEBcXG4gc3RydWN0IHZtcHJlc3N1cmUge1xcbiBcXHR1bnNpZ25lZCBsb25nIHNjYW5uZWQ7XFxuIFxcdHVuc2lnbmVkIGxvbmcgcmVjbGFpbWVkO1xcbitcXHQvKiBUaGUgbG9jayBpcyB1c2VkIHRvIGtlZXAgdGhlIHNjYW5uZWQvcmVjbGFpbWVkIGluIHN5bmMuICovXFxuK1xcdHNwaW5sb2NrX3Qgc3JfbG9jaztcXG4gXFxuKyNpZmRlZiBDT05GSUdfTUVNQ0dfVjFcXG4rXFx0LypcXG4rXFx0ICogdHJlZT10cnVlIGFjY3VtdWxhdG9ycyBmZWVkIHRoZSB2MSB1c2Vyc3BhY2UgZXZlbnRmZCBpbnRlcmZhY2VcXG4rXFx0ICogKG1lbW9yeS5wcmVzc3VyZV9sZXZlbCkuIERyYWluZWQgYnkgQHdvcmsuIHYyIGhhcyBubyBlcXVpdmFsZW50XFxuK1xcdCAqIGludGVyZmFjZSwgc28gdGhpcyBzdGF0ZSBpcyBvbWl0dGVkIG9uIENPTkZJR19NRU1DR19WMT1uIGJ1aWxkcy5cXG4rXFx0ICovXFxuIFxcdHVuc2lnbmVkIGxvbmcgdHJlZV9zY2FubmVkO1xcbiBcXHR1bnNpZ25lZCBsb25nIHRyZWVfcmVjbGFpbWVkO1xcbi1cXHQvKiBUaGUgbG9jayBpcyB1c2VkIHRvIGtlZXAgdGhlIHNjYW5uZWQvcmVjbGFpbWVkIGFib3ZlIGluIHN5bmMuICovXFxuLVxcdHNwaW5sb2NrX3Qgc3JfbG9jaztcXG4tXFxuIFxcdC8qIFRoZSBsaXN0IG9mIHZtcHJlc3N1cmVfZXZlbnQgc3RydWN0cy4gKi9cXG4gXFx0c3RydWN0IGxpc3RfaGVhZCBldmVudHM7XFxuIFxcdC8qIEhhdmUgdG8gZ3JhYiB0aGUgbG9jayBvbiBldmVudHMgdHJhdmVyc2FsIG9yIG1vZGlmaWNhdGlvbnMuICovXFxuIFxcdHN0cnVjdCBtdXRleCBldmVudHNfbG9jaztcXG4gXFxuIFxcdHN0cnVjdCB3b3JrX3N0cnVjdCB3b3JrO1xcbisjZW5kaWZcXG4rfTtcXG4rXFxuK2VudW0gdm1wcmVzc3VyZV9sZXZlbHMge1xcbitcXHRWTVBSRVNTVVJFX0xPVyA9IDAsXFxuK1xcdFZNUFJFU1NVUkVfTUVESVVNLFxcbitcXHRWTVBSRVNTVVJFX0NSSVRJQ0FMLFxcbitcXHRWTVBSRVNTVVJFX05VTV9MRVZFTFMsXFxuIH07XFxuIFxcbiBzdHJ1Y3QgbWVtX2Nncm91cDtcXG5AQCAtMzIsMTggKzQ1LDQxIEBAIHN0cnVjdCBtZW1fY2dyb3VwO1xcbiAjaWZkZWYgQ09ORklHX01FTUNHXFxuIHZvaWQgdm1wcmVzc3VyZShnZnBfdCBnZnAsIGludCBvcmRlciwgc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLCBib29sIHRyZWUsXFxuIFxcdFxcdHVuc2lnbmVkIGxvbmcgc2Nhbm5lZCwgdW5zaWduZWQgbG9uZyByZWNsYWltZWQpO1xcbi1leHRlcm4gdm9pZCB2bXByZXNzdXJlX3ByaW8oZ2ZwX3QgZ2ZwLCBzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csIGludCBwcmlvKTtcXG4tXFxuIGV4dGVybiB2b2lkIHZtcHJlc3N1cmVfaW5pdChzdHJ1Y3Qgdm1wcmVzc3VyZSAqdm1wcik7XFxuIGV4dGVybiB2b2lkIHZtcHJlc3N1cmVfY2xlYW51cChzdHJ1Y3Qgdm1wcmVzc3VyZSAqdm1wcik7XFxuIGV4dGVybiBzdHJ1Y3Qgdm1wcmVzc3VyZSAqbWVtY2dfdG9fdm1wcmVzc3VyZShzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2cpO1xcbiBleHRlcm4gc3RydWN0IG1lbV9jZ3JvdXAgKnZtcHJlc3N1cmVfdG9fbWVtY2coc3RydWN0IHZtcHJlc3N1cmUgKnZtcHIpO1xcbitcXG4rLyogU2hhcmVkIHdpdGggbW0vdm1wcmVzc3VyZS12MS5jLiAqL1xcbitleHRlcm4gY29uc3QgdW5zaWduZWQgbG9uZyB2bXByZXNzdXJlX3dpbjtcXG4rZXh0ZXJuIGVudW0gdm1wcmVzc3VyZV9sZXZlbHMgdm1wcmVzc3VyZV9jYWxjX2xldmVsKHVuc2lnbmVkIGxvbmcgc2Nhbm5lZCxcXG4rXFx0XFx0XFx0XFx0XFx0XFx0ICAgIHVuc2lnbmVkIGxvbmcgcmVjbGFpbWVkKTtcXG4rXFxuKyNpZmRlZiBDT05GSUdfTUVNQ0dfVjFcXG4rZXh0ZXJuIHZvaWQgdm1wcmVzc3VyZV9wcmlvKGdmcF90IGdmcCwgc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLCBpbnQgcHJpbyk7XFxuIGV4dGVybiBpbnQgdm1wcmVzc3VyZV9yZWdpc3Rlcl9ldmVudChzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csXFxuIFxcdFxcdFxcdFxcdCAgICAgc3RydWN0IGV2ZW50ZmRfY3R4ICpldmVudGZkLFxcbiBcXHRcXHRcXHRcXHQgICAgIGNvbnN0IGNoYXIgKmFyZ3MpO1xcbiBleHRlcm4gdm9pZCB2bXByZXNzdXJlX3VucmVnaXN0ZXJfZXZlbnQoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLFxcbiBcXHRcXHRcXHRcXHRcXHRzdHJ1Y3QgZXZlbnRmZF9jdHggKmV2ZW50ZmQpO1xcbitcXG4rLyogdjEgaG9va3MgY2FsbGVkIGZyb20gbW0vdm1wcmVzc3VyZS5jOyBuby1vcHMgYmVsb3cgd2hlbiAhTUVNQ0dfVjEuICovXFxuK2V4dGVybiB2b2lkIHZtcHJlc3N1cmVfdjFfaW5pdChzdHJ1Y3Qgdm1wcmVzc3VyZSAqdm1wcik7XFxuK2V4dGVybiB2b2lkIHZtcHJlc3N1cmVfdjFfY2xlYW51cChzdHJ1Y3Qgdm1wcmVzc3VyZSAqdm1wcik7XFxuK2V4dGVybiB2b2lkIHZtcHJlc3N1cmVfdjFfYWNjb3VudF90cmVlKHN0cnVjdCB2bXByZXNzdXJlICp2bXByLFxcbitcXHRcXHRcXHRcXHQgICAgICAgdW5zaWduZWQgbG9uZyBzY2FubmVkLFxcbitcXHRcXHRcXHRcXHQgICAgICAgdW5zaWduZWQgbG9uZyByZWNsYWltZWQpO1xcbiAjZWxzZVxcbitzdGF0aWMgaW5saW5lIHZvaWQgdm1wcmVzc3VyZV9wcmlvKGdmcF90IGdmcCwgc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLFxcbitcXHRcXHRcXHRcXHQgICBpbnQgcHJpbykge31cXG4rc3RhdGljIGlubGluZSB2b2lkIHZtcHJlc3N1cmVfdjFfaW5pdChzdHJ1Y3Qgdm1wcmVzc3VyZSAqdm1wcikge31cXG4rc3RhdGljIGlubGluZSB2b2lkIHZtcHJlc3N1cmVfdjFfY2xlYW51cChzdHJ1Y3Qgdm1wcmVzc3VyZSAqdm1wcikge31cXG4rc3RhdGljIGlubGluZSB2b2lkIHZtcHJlc3N1cmVfdjFfYWNjb3VudF90cmVlKHN0cnVjdCB2bXByZXNzdXJlICp2bXByLFxcbitcXHRcXHRcXHRcXHRcXHQgICAgICB1bnNpZ25lZCBsb25nIHNjYW5uZWQsXFxuK1xcdFxcdFxcdFxcdFxcdCAgICAgIHVuc2lnbmVkIGxvbmcgcmVjbGFpbWVkKSB7fVxcbisjZW5kaWYgLyogQ09ORklHX01FTUNHX1YxICovXFxuK1xcbisjZWxzZSAvKiAhQ09ORklHX01FTUNHICovXFxuIHN0YXRpYyBpbmxpbmUgdm9pZCB2bXByZXNzdXJlKGdmcF90IGdmcCwgaW50IG9yZGVyLCBzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csXFxuIFxcdFxcdFxcdCAgICAgIGJvb2wgdHJlZSwgdW5zaWduZWQgbG9uZyBzY2FubmVkLFxcbiBcXHRcXHRcXHQgICAgICB1bnNpZ25lZCBsb25nIHJlY2xhaW1lZCkge31cXG5kaWZmIC0tZ2l0IGEvbW0vTWFrZWZpbGUgYi9tbS9NYWtlZmlsZVxcbmluZGV4IDRmYzcxMzg2N2I5YmQ4Li5kZTk5MTYzMGM5NmEzMiAxMDA2NDRcXG4tLS0gYS9tbS9NYWtlZmlsZVxcbisrKyBiL21tL01ha2VmaWxlXFxuQEAgLTEwMSw3ICsxMDEsNyBAQCBvYmotJChDT05GSUdfREVWSUNFX01JR1JBVElPTikgKz0gbWlncmF0ZV9kZXZpY2Uub1xcbiBvYmotJChDT05GSUdfVFJBTlNQQVJFTlRfSFVHRVBBR0UpICs9IGh1Z2VfbWVtb3J5Lm8ga2h1Z2VwYWdlZC5vXFxuIG9iai0kKENPTkZJR19QQUdFX0NPVU5URVIpICs9IHBhZ2VfY291bnRlci5vXFxuIG9iai0kKENPTkZJR19MSVZFVVBEQVRFX01FTUZEKSArPSBtZW1mZF9sdW8ub1xcbi1vYmotJChDT05GSUdfTUVNQ0dfVjEpICs9IG1lbWNvbnRyb2wtdjEub1xcbitvYmotJChDT05GSUdfTUVNQ0dfVjEpICs9IG1lbWNvbnRyb2wtdjEubyB2bXByZXNzdXJlLXYxLm9cXG4gb2JqLSQoQ09ORklHX01FTUNHKSArPSBtZW1jb250cm9sLm8gdm1wcmVzc3VyZS5vXFxuIGlmZGVmIENPTkZJR19CUEZfU1lTQ0FMTFxcbiBvYmotJChDT05GSUdfTUVNQ0cpICs9IGJwZl9tZW1jb250cm9sLm9cXG5kaWZmIC0tZ2l0IGEvbW0vdm1wcmVzc3VyZS12MS5jIGIvbW0vdm1wcmVzc3VyZS12MS5jXFxubmV3IGZpbGUgbW9kZSAxMDA2NDRcXG5pbmRleCAwMDAwMDAwMDAwMDAwMC4uZmQ4MTNjYmEwNTQ0NzBcXG4tLS0gL2Rldi9udWxsXFxuKysrIGIvbW0vdm1wcmVzc3VyZS12MS5jXFxuQEAgLTAsMCArMSwzMDUgQEBcXG4rLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb25seVxcbisvKlxcbisgKiBjZ3JvdXAgdjEgdXNlcnNwYWNlIHZtcHJlc3N1cmUgaW50ZXJmYWNlIChtZW1vcnkucHJlc3N1cmVfbGV2ZWwgL1xcbisgKiBjZ3JvdXAuZXZlbnRfY29udHJvbCkuIFNwbGl0IG91dCBvZiBtbS92bXByZXNzdXJlLmMgc28gdGhhdCB2Mi1vbmx5XFxuKyAqIGtlcm5lbHMgKENPTkZJR19NRU1DR19WMT1uKSBkcm9wIHRoZSB3aG9sZSBldmVudGZkIGFjY3VtdWxhdG9yLFxcbisgKiBpdHMgd29yayBpdGVtLCBhbmQgdGhlIHBlci1tZW1jZyBzdGF0ZSBpdCByZXF1aXJlcy5cXG4rICovXFxuK1xcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvY2dyb3VwLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9ldmVudGZkLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9saXN0LmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9sb2cyLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9tZW1jb250cm9sLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9tdXRleC5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvc2xhYi5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvc3RyaW5nLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9zd2FwLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC92bXByZXNzdXJlLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC93b3JrcXVldWUuaFxcdTAwM2VcXG4rXFxuKy8qXFxuKyAqIFdoZW4gdGhlcmUgYXJlIHRvbyBsaXR0bGUgcGFnZXMgbGVmdCB0byBzY2FuLCB2bXByZXNzdXJlKCkgbWF5IG1pc3MgdGhlXFxuKyAqIGNyaXRpY2FsIHByZXNzdXJlIGFzIG51bWJlciBvZiBwYWdlcyB3aWxsIGJlIGxlc3MgdGhhbiBcXFwid2luZG93IHNpemVcXFwiLlxcbisgKiBIb3dldmVyLCBpbiB0aGF0IGNhc2UgdGhlIHZtc2NhbiBwcmlvcml0eSB3aWxsIHJhaXNlIGZhc3QgYXMgdGhlXFxuKyAqIHJlY2xhaW1lciB3aWxsIHRyeSB0byBzY2FuIExSVXMgbW9yZSBkZWVwbHkuXFxuKyAqXFxuKyAqIFRoZSB2bXNjYW4gbG9naWMgY29uc2lkZXJzIHRoZXNlIHNwZWNpYWwgcHJpb3JpdGllczpcXG4rICpcXG4rICogcHJpbyA9PSBERUZfUFJJT1JJVFkgKDEyKTogcmVjbGFpbWVyIHN0YXJ0cyB3aXRoIHRoYXQgdmFsdWVcXG4rICogcHJpbyBcXHUwMDNjPSBERUZfUFJJT1JJVFkgLSAyIDoga3N3YXBkIGJlY29tZXMgc29tZXdoYXQgb3ZlcndoZWxtZWRcXG4rICogcHJpbyA9PSAwICAgICAgICAgICAgICAgIDogY2xvc2UgdG8gT09NLCBrZXJuZWwgc2NhbnMgZXZlcnkgcGFnZSBpbiBhbiBscnVcXG4rICpcXG4rICogQW55IHZhbHVlIGluIHRoaXMgcmFuZ2UgaXMgYWNjZXB0YWJsZSBmb3IgdGhpcyB0dW5hYmxlIChpLmUuIGZyb20gMTIgdG9cXG4rICogMCkuIEN1cnJlbnQgdmFsdWUgZm9yIHRoZSB2bXByZXNzdXJlX2xldmVsX2NyaXRpY2FsX3ByaW8gaXMgY2hvc2VuXFxuKyAqIGVtcGlyaWNhbGx5LCBidXQgdGhlIG51bWJlciwgaW4gZXNzZW5jZSwgbWVhbnMgdGhhdCB3ZSBjb25zaWRlclxcbisgKiBjcml0aWNhbCBsZXZlbCB3aGVuIHNjYW5uaW5nIGRlcHRoIGlzIH4xMCUgb2YgdGhlIGxydSBzaXplICh2bXNjYW5cXG4rICogc2NhbnMgJ2xydV9zaXplIFxcdTAwM2VcXHUwMDNlIHByaW8nIHBhZ2VzLCBzbyBpdCBpcyBhY3R1YWxseSAxMi41JSwgb3Igb25lXFxuKyAqIGVpZ2h0cykuXFxuKyAqL1xcbitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHZtcHJlc3N1cmVfbGV2ZWxfY3JpdGljYWxfcHJpbyA9IGlsb2cyKDEwMCAvIDEwKTtcXG4rXFxuK2VudW0gdm1wcmVzc3VyZV9tb2RlcyB7XFxuK1xcdFZNUFJFU1NVUkVfTk9fUEFTU1RIUk9VR0ggPSAwLFxcbitcXHRWTVBSRVNTVVJFX0hJRVJBUkNIWSxcXG4rXFx0Vk1QUkVTU1VSRV9MT0NBTCxcXG4rXFx0Vk1QUkVTU1VSRV9OVU1fTU9ERVMsXFxuK307XFxuK1xcbitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHZtcHJlc3N1cmVfc3RyX2xldmVsc1tdID0ge1xcbitcXHRbVk1QUkVTU1VSRV9MT1ddID0gXFxcImxvd1xcXCIsXFxuK1xcdFtWTVBSRVNTVVJFX01FRElVTV0gPSBcXFwibWVkaXVtXFxcIixcXG4rXFx0W1ZNUFJFU1NVUkVfQ1JJVElDQUxdID0gXFxcImNyaXRpY2FsXFxcIixcXG4rfTtcXG4rXFxuK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgdm1wcmVzc3VyZV9zdHJfbW9kZXNbXSA9IHtcXG4rXFx0W1ZNUFJFU1NVUkVfTk9fUEFTU1RIUk9VR0hdID0gXFxcImRlZmF1bHRcXFwiLFxcbitcXHRbVk1QUkVTU1VSRV9ISUVSQVJDSFldID0gXFxcImhpZXJhcmNoeVxcXCIsXFxuK1xcdFtWTVBSRVNTVVJFX0xPQ0FMXSA9IFxcXCJsb2NhbFxcXCIsXFxuK307XFxuK1xcbitzdHJ1Y3Qgdm1wcmVzc3VyZV9ldmVudCB7XFxuK1xcdHN0cnVjdCBldmVudGZkX2N0eCAqZWZkO1xcbitcXHRlbnVtIHZtcHJlc3N1cmVfbGV2ZWxzIGxldmVsO1xcbitcXHRlbnVtIHZtcHJlc3N1cmVfbW9kZXMgbW9kZTtcXG4rXFx0c3RydWN0IGxpc3RfaGVhZCBub2RlO1xcbit9O1xcbitcXG4rc3RhdGljIHN0cnVjdCB2bXByZXNzdXJlICp3b3JrX3RvX3ZtcHJlc3N1cmUoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKVxcbit7XFxuK1xcdHJldHVybiBjb250YWluZXJfb2Yod29yaywgc3RydWN0IHZtcHJlc3N1cmUsIHdvcmspO1xcbit9XFxuK1xcbitzdGF0aWMgc3RydWN0IHZtcHJlc3N1cmUgKnZtcHJlc3N1cmVfcGFyZW50KHN0cnVjdCB2bXByZXNzdXJlICp2bXByKVxcbit7XFxuK1xcdHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZyA9IHZtcHJlc3N1cmVfdG9fbWVtY2codm1wcik7XFxuK1xcbitcXHRtZW1jZyA9IHBhcmVudF9tZW1fY2dyb3VwKG1lbWNnKTtcXG4rXFx0aWYgKCFtZW1jZylcXG4rXFx0XFx0cmV0dXJuIE5VTEw7XFxuK1xcdHJldHVybiBtZW1jZ190b192bXByZXNzdXJlKG1lbWNnKTtcXG4rfVxcbitcXG4rc3RhdGljIGJvb2wgdm1wcmVzc3VyZV9ldmVudChzdHJ1Y3Qgdm1wcmVzc3VyZSAqdm1wcixcXG4rXFx0XFx0XFx0ICAgICBjb25zdCBlbnVtIHZtcHJlc3N1cmVfbGV2ZWxzIGxldmVsLFxcbitcXHRcXHRcXHQgICAgIGJvb2wgYW5jZXN0b3IsIGJvb2wgc2lnbmFsbGVkKVxcbit7XFxuK1xcdHN0cnVjdCB2bXByZXNzdXJlX2V2ZW50ICpldjtcXG4rXFx0Ym9vbCByZXQgPSBmYWxzZTtcXG4rXFxuK1xcdG11dGV4X2xvY2soXFx1MDAyNnZtcHItXFx1MDAzZWV2ZW50c19sb2NrKTtcXG4rXFx0bGlzdF9mb3JfZWFjaF9lbnRyeShldiwgXFx1MDAyNnZtcHItXFx1MDAzZWV2ZW50cywgbm9kZSkge1xcbitcXHRcXHRpZiAoYW5jZXN0b3IgXFx1MDAyNlxcdTAwMjYgZXYtXFx1MDAzZW1vZGUgPT0gVk1QUkVTU1VSRV9MT0NBTClcXG4rXFx0XFx0XFx0Y29udGludWU7XFxuK1xcdFxcdGlmIChzaWduYWxsZWQgXFx1MDAyNlxcdTAwMjYgZXYtXFx1MDAzZW1vZGUgPT0gVk1QUkVTU1VSRV9OT19QQVNTVEhST1VHSClcXG4rXFx0XFx0XFx0Y29udGludWU7XFxuK1xcdFxcdGlmIChsZXZlbCBcXHUwMDNjIGV2LVxcdTAwM2VsZXZlbClcXG4rXFx0XFx0XFx0Y29udGludWU7XFxuK1xcdFxcdGV2ZW50ZmRfc2lnbmFsKGV2LVxcdTAwM2VlZmQpO1xcbitcXHRcXHRyZXQgPSB0cnVlO1xcbitcXHR9XFxuK1xcdG11dGV4X3VubG9jayhcXHUwMDI2dm1wci1cXHUwMDNlZXZlbnRzX2xvY2spO1xcbitcXG4rXFx0cmV0dXJuIHJldDtcXG4rfVxcbitcXG4rc3RhdGljIHZvaWQgdm1wcmVzc3VyZV93b3JrX2ZuKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaylcXG4re1xcbitcXHRzdHJ1Y3Qgdm1wcmVzc3VyZSAqdm1wciA9IHdvcmtfdG9fdm1wcmVzc3VyZSh3b3JrKTtcXG4rXFx0dW5zaWduZWQgbG9uZyBzY2FubmVkO1xcbitcXHR1bnNpZ25lZCBsb25nIHJlY2xhaW1lZDtcXG4rXFx0ZW51bSB2bXByZXNzdXJlX2xldmVscyBsZXZlbDtcXG4rXFx0Ym9vbCBhbmNlc3RvciA9IGZhbHNlO1xcbitcXHRib29sIHNpZ25hbGxlZCA9IGZhbHNlO1xcbitcXG4rXFx0c3Bpbl9sb2NrKFxcdTAwMjZ2bXByLVxcdTAwM2Vzcl9sb2NrKTtcXG4rXFx0LypcXG4rXFx0ICogU2V2ZXJhbCBjb250ZXh0cyBtaWdodCBiZSBjYWxsaW5nIHZtcHJlc3N1cmUoKSwgc28gaXQgaXNcXG4rXFx0ICogcG9zc2libGUgdGhhdCB0aGUgd29yayB3YXMgcmVzY2hlZHVsZWQgYWdhaW4gYmVmb3JlIHRoZSBvbGRcXG4rXFx0ICogd29yayBjb250ZXh0IGNsZWFyZWQgdGhlIGNvdW50ZXJzLiBJbiB0aGF0IGNhc2Ugd2Ugd2lsbCBydW5cXG4rXFx0ICoganVzdCBhZnRlciB0aGUgb2xkIHdvcmsgcmV0dXJucywgYnV0IHRoZW4gc2Nhbm5lZCBtaWdodCBiZSB6ZXJvXFxuK1xcdCAqIGhlcmUuIE5vIG5lZWQgZm9yIGFueSBsb2NrcyBoZXJlIHNpbmNlIHdlIGRvbid0IGNhcmUgaWZcXG4rXFx0ICogdm1wci1cXHUwMDNlcmVjbGFpbWVkIGlzIGluIHN5bmMuXFxuK1xcdCAqL1xcbitcXHRzY2FubmVkID0gdm1wci1cXHUwMDNldHJlZV9zY2FubmVkO1xcbitcXHRpZiAoIXNjYW5uZWQpIHtcXG4rXFx0XFx0c3Bpbl91bmxvY2soXFx1MDAyNnZtcHItXFx1MDAzZXNyX2xvY2spO1xcbitcXHRcXHRyZXR1cm47XFxuK1xcdH1cXG4rXFxuK1xcdHJlY2xhaW1lZCA9IHZtcHItXFx1MDAzZXRyZWVfcmVjbGFpbWVkO1xcbitcXHR2bXByLVxcdTAwM2V0cmVlX3NjYW5uZWQgPSAwO1xcbitcXHR2bXByLVxcdTAwM2V0cmVlX3JlY2xhaW1lZCA9IDA7XFxuK1xcdHNwaW5fdW5sb2NrKFxcdTAwMjZ2bXByLVxcdTAwM2Vzcl9sb2NrKTtcXG4rXFxuK1xcdGxldmVsID0gdm1wcmVzc3VyZV9jYWxjX2xldmVsKHNjYW5uZWQsIHJlY2xhaW1lZCk7XFxuK1xcbitcXHRkbyB7XFxuK1xcdFxcdGlmICh2bXByZXNzdXJlX2V2ZW50KHZtcHIsIGxldmVsLCBhbmNlc3Rvciwgc2lnbmFsbGVkKSlcXG4rXFx0XFx0XFx0c2lnbmFsbGVkID0gdHJ1ZTtcXG4rXFx0XFx0YW5jZXN0b3IgPSB0cnVlO1xcbitcXHR9IHdoaWxlICgodm1wciA9IHZtcHJlc3N1cmVfcGFyZW50KHZtcHIpKSk7XFxuK31cXG4rXFxuKy8qXFxuKyAqIFRyZWUtbW9kZSBhY2N1bXVsYXRvcjogYWNjdW11bGF0ZSBwZXItbWVtY2cgc2Nhbm5lZC9yZWNsYWltZWQgYW5kXFxuKyAqIHNjaGVkdWxlIHRoZSB3b3JrIHRoYXQgd2Fsa3MgdGhlIHBhcmVudCBjaGFpbiBhbmQgc2lnbmFscyByZWdpc3RlcmVkXFxuKyAqIGV2ZW50ZmQgbGlzdGVuZXJzIG9uY2Ugd2UgY3Jvc3MgdGhlIHdpbmRvdyB0aHJlc2hvbGQuXFxuKyAqL1xcbit2b2lkIHZtcHJlc3N1cmVfdjFfYWNjb3VudF90cmVlKHN0cnVjdCB2bXByZXNzdXJlICp2bXByLFxcbitcXHRcXHRcXHRcXHR1bnNpZ25lZCBsb25nIHNjYW5uZWQsXFxuK1xcdFxcdFxcdFxcdHVuc2lnbmVkIGxvbmcgcmVjbGFpbWVkKVxcbit7XFxuK1xcdHNwaW5fbG9jayhcXHUwMDI2dm1wci1cXHUwMDNlc3JfbG9jayk7XFxuK1xcdHNjYW5uZWQgPSB2bXByLVxcdTAwM2V0cmVlX3NjYW5uZWQgKz0gc2Nhbm5lZDtcXG4rXFx0dm1wci1cXHUwMDNldHJlZV9yZWNsYWltZWQgKz0gcmVjbGFpbWVkO1xcbitcXHRzcGluX3VubG9jayhcXHUwMDI2dm1wci1cXHUwMDNlc3JfbG9jayk7XFxuK1xcbitcXHRpZiAoc2Nhbm5lZCBcXHUwMDNjIHZtcHJlc3N1cmVfd2luKVxcbitcXHRcXHRyZXR1cm47XFxuK1xcdHNjaGVkdWxlX3dvcmsoXFx1MDAyNnZtcHItXFx1MDAzZXdvcmspO1xcbit9XFxuK1xcbit2b2lkIHZtcHJlc3N1cmVfdjFfaW5pdChzdHJ1Y3Qgdm1wcmVzc3VyZSAqdm1wcilcXG4re1xcbitcXHRtdXRleF9pbml0KFxcdTAwMjZ2bXByLVxcdTAwM2VldmVudHNfbG9jayk7XFxuK1xcdElOSVRfTElTVF9IRUFEKFxcdTAwMjZ2bXByLVxcdTAwM2VldmVudHMpO1xcbitcXHRJTklUX1dPUksoXFx1MDAyNnZtcHItXFx1MDAzZXdvcmssIHZtcHJlc3N1cmVfd29ya19mbik7XFxuK31cXG4rXFxuK3ZvaWQgdm1wcmVzc3VyZV92MV9jbGVhbnVwKHN0cnVjdCB2bXByZXNzdXJlICp2bXByKVxcbit7XFxuK1xcdC8qXFxuK1xcdCAqIE1ha2Ugc3VyZSB0aGVyZSBpcyBubyBwZW5kaW5nIHdvcmsgYmVmb3JlIGV2ZW50ZmQgaW5mcmFzdHJ1Y3R1cmVcXG4rXFx0ICogZ29lcyBhd2F5LlxcbitcXHQgKi9cXG4rXFx0Zmx1c2hfd29yayhcXHUwMDI2dm1wci1cXHUwMDNld29yayk7XFxuK31cXG4rXFxuKy8qKlxcbisgKiB2bXByZXNzdXJlX3ByaW8oKSAtIEFjY291bnQgbWVtb3J5IHByZXNzdXJlIHRocm91Z2ggcmVjbGFpbWVyIHByaW9yaXR5IGxldmVsXFxuKyAqIEBnZnA6XFx0cmVjbGFpbWVyJ3MgZ2ZwIG1hc2tcXG4rICogQG1lbWNnOlxcdGNncm91cCBtZW1vcnkgY29udHJvbGxlciBoYW5kbGVcXG4rICogQHByaW86XFx0cmVjbGFpbWVyJ3MgcHJpb3JpdHlcXG4rICpcXG4rICogVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIGZyb20gdGhlIHJlY2xhaW0gcGF0aCBldmVyeSB0aW1lIHdoZW5cXG4rICogdGhlIHZtc2NhbidzIHJlY2xhaW1pbmcgcHJpb3JpdHkgKHNjYW5uaW5nIGRlcHRoKSBjaGFuZ2VzLlxcbisgKlxcbisgKiBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IHJldHVybiBhbnkgdmFsdWUuXFxuKyAqL1xcbit2b2lkIHZtcHJlc3N1cmVfcHJpbyhnZnBfdCBnZnAsIHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZywgaW50IHByaW8pXFxuK3tcXG4rXFx0LypcXG4rXFx0ICogV2Ugb25seSB1c2UgcHJpbyBmb3IgYWNjb3VudGluZyBjcml0aWNhbCBsZXZlbC4gRm9yIG1vcmUgaW5mb1xcbitcXHQgKiBzZWUgY29tbWVudCBmb3Igdm1wcmVzc3VyZV9sZXZlbF9jcml0aWNhbF9wcmlvIHZhcmlhYmxlIGFib3ZlLlxcbitcXHQgKi9cXG4rXFx0aWYgKHByaW8gXFx1MDAzZSB2bXByZXNzdXJlX2xldmVsX2NyaXRpY2FsX3ByaW8pXFxuK1xcdFxcdHJldHVybjtcXG4rXFxuK1xcdC8qXFxuK1xcdCAqIE9LLCB0aGUgcHJpbyBpcyBiZWxvdyB0aGUgdGhyZXNob2xkLCB1cGRhdGluZyB2bXByZXNzdXJlXFxuK1xcdCAqIGluZm9ybWF0aW9uIGJlZm9yZSBzaHJpbmtlciBkaXZlcyBpbnRvIGxvbmcgc2hyaW5raW5nIG9mIGxvbmdcXG4rXFx0ICogcmFuZ2Ugdm1zY2FuLiBQYXNzaW5nIHNjYW5uZWQgPSB2bXByZXNzdXJlX3dpbiwgcmVjbGFpbWVkID0gMFxcbitcXHQgKiB0byB0aGUgdm1wcmVzc3VyZSgpIGJhc2ljYWxseSBtZWFucyB0aGF0IHdlIHNpZ25hbCAnY3JpdGljYWwnXFxuK1xcdCAqIGxldmVsLlxcbitcXHQgKi9cXG4rXFx0dm1wcmVzc3VyZShnZnAsIDAsIG1lbWNnLCB0cnVlLCB2bXByZXNzdXJlX3dpbiwgMCk7XFxuK31cXG4rXFxuKyNkZWZpbmUgTUFYX1ZNUFJFU1NVUkVfQVJHU19MRU5cXHQoc3RybGVuKFxcXCJjcml0aWNhbFxcXCIpICsgc3RybGVuKFxcXCJoaWVyYXJjaHlcXFwiKSArIDIpXFxuK1xcbisvKipcXG4rICogdm1wcmVzc3VyZV9yZWdpc3Rlcl9ldmVudCgpIC0gQmluZCB2bXByZXNzdXJlIG5vdGlmaWNhdGlvbnMgdG8gYW4gZXZlbnRmZFxcbisgKiBAbWVtY2c6XFx0bWVtY2cgdGhhdCBpcyBpbnRlcmVzdGVkIGluIHZtcHJlc3N1cmUgbm90aWZpY2F0aW9uc1xcbisgKiBAZXZlbnRmZDpcXHRldmVudGZkIGNvbnRleHQgdG8gbGluayBub3RpZmljYXRpb25zIHdpdGhcXG4rICogQGFyZ3M6XFx0ZXZlbnQgYXJndW1lbnRzIChwcmVzc3VyZSBsZXZlbCB0aHJlc2hvbGQsIG9wdGlvbmFsIG1vZGUpXFxuKyAqXFxuKyAqIFRoaXMgZnVuY3Rpb24gYXNzb2NpYXRlcyBldmVudGZkIGNvbnRleHQgd2l0aCB0aGUgdm1wcmVzc3VyZVxcbisgKiBpbmZyYXN0cnVjdHVyZSwgc28gdGhhdCB0aGUgbm90aWZpY2F0aW9ucyB3aWxsIGJlIGRlbGl2ZXJlZCB0byB0aGVcXG4rICogQGV2ZW50ZmQuIFRoZSBAYXJncyBwYXJhbWV0ZXIgaXMgYSBjb21tYS1kZWxpbWl0ZWQgc3RyaW5nIHRoYXQgZGVub3RlcyBhXFxuKyAqIHByZXNzdXJlIGxldmVsIHRocmVzaG9sZCAob25lIG9mIHZtcHJlc3N1cmVfc3RyX2xldmVscywgaS5lLiBcXFwibG93XFxcIiwgXFxcIm1lZGl1bVxcXCIsXFxuKyAqIG9yIFxcXCJjcml0aWNhbFxcXCIpIGFuZCBhbiBvcHRpb25hbCBtb2RlIChvbmUgb2Ygdm1wcmVzc3VyZV9zdHJfbW9kZXMsIGkuZS5cXG4rICogXFxcImhpZXJhcmNoeVxcXCIgb3IgXFxcImxvY2FsXFxcIikuXFxuKyAqXFxuKyAqIFRvIGJlIHVzZWQgYXMgbWVtY2cgZXZlbnQgbWV0aG9kLlxcbisgKlxcbisgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgLUVOT01FTSBvbiBtZW1vcnkgZmFpbHVyZSBvciAtRUlOVkFMIGlmIEBhcmdzIGNvdWxkXFxuKyAqIG5vdCBiZSBwYXJzZWQuXFxuKyAqL1xcbitpbnQgdm1wcmVzc3VyZV9yZWdpc3Rlcl9ldmVudChzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csXFxuK1xcdFxcdFxcdCAgICAgIHN0cnVjdCBldmVudGZkX2N0eCAqZXZlbnRmZCwgY29uc3QgY2hhciAqYXJncylcXG4re1xcbitcXHRzdHJ1Y3Qgdm1wcmVzc3VyZSAqdm1wciA9IG1lbWNnX3RvX3ZtcHJlc3N1cmUobWVtY2cpO1xcbitcXHRzdHJ1Y3Qgdm1wcmVzc3VyZV9ldmVudCAqZXY7XFxuK1xcdGVudW0gdm1wcmVzc3VyZV9tb2RlcyBtb2RlID0gVk1QUkVTU1VSRV9OT19QQVNTVEhST1VHSDtcXG4rXFx0ZW51bSB2bXByZXNzdXJlX2xldmVscyBsZXZlbDtcXG4rXFx0Y2hhciAqc3BlYywgKnNwZWNfb3JpZztcXG4rXFx0Y2hhciAqdG9rZW47XFxuK1xcdGludCByZXQgPSAwO1xcbitcXG4rXFx0c3BlY19vcmlnID0gc3BlYyA9IGtzdHJuZHVwKGFyZ3MsIE1BWF9WTVBSRVNTVVJFX0FSR1NfTEVOLCBHRlBfS0VSTkVMKTtcXG4rXFx0aWYgKCFzcGVjKVxcbitcXHRcXHRyZXR1cm4gLUVOT01FTTtcXG4rXFxuK1xcdC8qIEZpbmQgcmVxdWlyZWQgbGV2ZWwgKi9cXG4rXFx0dG9rZW4gPSBzdHJzZXAoXFx1MDAyNnNwZWMsIFxcXCIsXFxcIik7XFxuK1xcdHJldCA9IG1hdGNoX3N0cmluZyh2bXByZXNzdXJlX3N0cl9sZXZlbHMsIFZNUFJFU1NVUkVfTlVNX0xFVkVMUywgdG9rZW4pO1xcbitcXHRpZiAocmV0IFxcdTAwM2MgMClcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcdGxldmVsID0gcmV0O1xcbitcXG4rXFx0LyogRmluZCBvcHRpb25hbCBtb2RlICovXFxuK1xcdHRva2VuID0gc3Ryc2VwKFxcdTAwMjZzcGVjLCBcXFwiLFxcXCIpO1xcbitcXHRpZiAodG9rZW4pIHtcXG4rXFx0XFx0cmV0ID0gbWF0Y2hfc3RyaW5nKHZtcHJlc3N1cmVfc3RyX21vZGVzLCBWTVBSRVNTVVJFX05VTV9NT0RFUywgdG9rZW4pO1xcbitcXHRcXHRpZiAocmV0IFxcdTAwM2MgMClcXG4rXFx0XFx0XFx0Z290byBvdXQ7XFxuK1xcdFxcdG1vZGUgPSByZXQ7XFxuK1xcdH1cXG4rXFxuK1xcdGV2ID0ga3phbGxvY19vYmooKmV2KTtcXG4rXFx0aWYgKCFldikge1xcbitcXHRcXHRyZXQgPSAtRU5PTUVNO1xcbitcXHRcXHRnb3RvIG91dDtcXG4rXFx0fVxcbitcXG4rXFx0ZXYtXFx1MDAzZWVmZCA9IGV2ZW50ZmQ7XFxuK1xcdGV2LVxcdTAwM2VsZXZlbCA9IGxldmVsO1xcbitcXHRldi1cXHUwMDNlbW9kZSA9IG1vZGU7XFxuK1xcbitcXHRtdXRleF9sb2NrKFxcdTAwMjZ2bXByLVxcdTAwM2VldmVudHNfbG9jayk7XFxuK1xcdGxpc3RfYWRkKFxcdTAwMjZldi1cXHUwMDNlbm9kZSwgXFx1MDAyNnZtcHItXFx1MDAzZWV2ZW50cyk7XFxuK1xcdG11dGV4X3VubG9jayhcXHUwMDI2dm1wci1cXHUwMDNlZXZlbnRzX2xvY2spO1xcbitcXHRyZXQgPSAwO1xcbitvdXQ6XFxuK1xcdGtmcmVlKHNwZWNfb3JpZyk7XFxuK1xcdHJldHVybiByZXQ7XFxuK31cXG4rXFxuKy8qKlxcbisgKiB2bXByZXNzdXJlX3VucmVnaXN0ZXJfZXZlbnQoKSAtIFVuYmluZCBldmVudGZkIGZyb20gdm1wcmVzc3VyZVxcbisgKiBAbWVtY2c6XFx0bWVtY2cgaGFuZGxlXFxuKyAqIEBldmVudGZkOlxcdGV2ZW50ZmQgY29udGV4dCB0aGF0IHdhcyB1c2VkIHRvIGxpbmsgdm1wcmVzc3VyZSB3aXRoIHRoZSBAY2dcXG4rICpcXG4rICogVGhpcyBmdW5jdGlvbiBkb2VzIGludGVybmFsIG1hbmlwdWxhdGlvbnMgdG8gZGV0YWNoIHRoZSBAZXZlbnRmZCBmcm9tXFxuKyAqIHRoZSB2bXByZXNzdXJlIG5vdGlmaWNhdGlvbnMsIGFuZCB0aGVuIGZyZWVzIGludGVybmFsIHJlc291cmNlc1xcbisgKiBhc3NvY2lhdGVkIHdpdGggdGhlIEBldmVudGZkIChidXQgdGhlIEBldmVudGZkIGl0c2VsZiBpcyBub3QgZnJlZWQpLlxcbisgKlxcbisgKiBUbyBiZSB1c2VkIGFzIG1lbWNnIGV2ZW50IG1ldGhvZC5cXG4rICovXFxuK3ZvaWQgdm1wcmVzc3VyZV91bnJlZ2lzdGVyX2V2ZW50KHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZyxcXG4rXFx0XFx0XFx0XFx0IHN0cnVjdCBldmVudGZkX2N0eCAqZXZlbnRmZClcXG4re1xcbitcXHRzdHJ1Y3Qgdm1wcmVzc3VyZSAqdm1wciA9IG1lbWNnX3RvX3ZtcHJlc3N1cmUobWVtY2cpO1xcbitcXHRzdHJ1Y3Qgdm1wcmVzc3VyZV9ldmVudCAqZXY7XFxuK1xcbitcXHRtdXRleF9sb2NrKFxcdTAwMjZ2bXByLVxcdTAwM2VldmVudHNfbG9jayk7XFxuK1xcdGxpc3RfZm9yX2VhY2hfZW50cnkoZXYsIFxcdTAwMjZ2bXByLVxcdTAwM2VldmVudHMsIG5vZGUpIHtcXG4rXFx0XFx0aWYgKGV2LVxcdTAwM2VlZmQgIT0gZXZlbnRmZClcXG4rXFx0XFx0XFx0Y29udGludWU7XFxuK1xcdFxcdGxpc3RfZGVsKFxcdTAwMjZldi1cXHUwMDNlbm9kZSk7XFxuK1xcdFxcdGtmcmVlKGV2KTtcXG4rXFx0XFx0YnJlYWs7XFxuK1xcdH1cXG4rXFx0bXV0ZXhfdW5sb2NrKFxcdTAwMjZ2bXByLVxcdTAwM2VldmVudHNfbG9jayk7XFxuK31cXG5kaWZmIC0tZ2l0IGEvbW0vdm1wcmVzc3VyZS5jIGIvbW0vdm1wcmVzc3VyZS5jXFxuaW5kZXggZjA1MzU1NGU1ODI2NDIuLmJjZmE0YmQ4ZmZjNTI5IDEwMDY0NFxcbi0tLSBhL21tL3ZtcHJlc3N1cmUuY1xcbisrKyBiL21tL3ZtcHJlc3N1cmUuY1xcbkBAIC03LDE2ICs3LDE1IEBAXFxuICAqXFxuICAqIEJhc2VkIG9uIGlkZWFzIGZyb20gQW5kcmV3IE1vcnRvbiwgRGF2aWQgUmllbnRqZXMsIEtPU0FLSSBNb3RvaGlybyxcXG4gICogTGVvbmlkIE1vaXNlaWNodWssIE1lbCBHb3JtYW4sIE1pbmNoYW4gS2ltIGFuZCBQZWtrYSBFbmJlcmcuXFxuKyAqXFxuKyAqIFRyZWUtbW9kZSAoY2dyb3VwIHYxIHVzZXJzcGFjZSBldmVudGZkKSBib29ra2VlcGluZyBsaXZlcyBpblxcbisgKiBtbS92bXByZXNzdXJlLXYxLmM7IHRoaXMgZmlsZSBob2xkcyB0aGUgc2hhcmVkIGNvZGUgYW5kIHRoZSBpbi1rZXJuZWxcXG4rICogKHRyZWU9ZmFsc2UpIHNvY2tldC1wcmVzc3VyZSBwYXRoIHRoYXQgcnVucyBvbiBjZ3JvdXAgdjIuXFxuICAqL1xcbiBcXG4gI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2Nncm91cC5oXFx1MDAzZVxcbi0jaW5jbHVkZSBcXHUwMDNjbGludXgvZnMuaFxcdTAwM2VcXG4gI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2xvZzIuaFxcdTAwM2VcXG4tI2luY2x1ZGUgXFx1MDAzY2xpbnV4L3NjaGVkLmhcXHUwMDNlXFxuICNpbmNsdWRlIFxcdTAwM2NsaW51eC9tbS5oXFx1MDAzZVxcbi0jaW5jbHVkZSBcXHUwMDNjbGludXgvdm1zdGF0LmhcXHUwMDNlXFxuLSNpbmNsdWRlIFxcdTAwM2NsaW51eC9ldmVudGZkLmhcXHUwMDNlXFxuLSNpbmNsdWRlIFxcdTAwM2NsaW51eC9zbGFiLmhcXHUwMDNlXFxuICNpbmNsdWRlIFxcdTAwM2NsaW51eC9zd2FwLmhcXHUwMDNlXFxuICNpbmNsdWRlIFxcdTAwM2NsaW51eC9wcmludGsuaFxcdTAwM2VcXG4gI2luY2x1ZGUgXFx1MDAzY2xpbnV4L3ZtcHJlc3N1cmUuaFxcdTAwM2VcXG5AQCAtMzUsNyArMzQsNyBAQFxcbiAgKiBUT0RPOiBNYWtlIHRoZSB3aW5kb3cgc2l6ZSBkZXBlbmQgb24gbWFjaGluZSBzaXplLCBhcyB3ZSBkbyBmb3Igdm1zdGF0XFxuICAqIHRocmVzaG9sZHMuIEN1cnJlbnRseSB3ZSBzZXQgaXQgdG8gNTEyIHBhZ2VzICgyTUIgZm9yIDRLQiBwYWdlcykuXFxuICAqL1xcbi1zdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyB2bXByZXNzdXJlX3dpbiA9IFNXQVBfQ0xVU1RFUl9NQVggKiAxNjtcXG4rY29uc3QgdW5zaWduZWQgbG9uZyB2bXByZXNzdXJlX3dpbiA9IFNXQVBfQ0xVU1RFUl9NQVggKiAxNjtcXG4gXFxuIC8qXFxuICAqIFRoZXNlIHRocmVzaG9sZHMgYXJlIHVzZWQgd2hlbiB3ZSBhY2NvdW50IG1lbW9yeSBwcmVzc3VyZSB0aHJvdWdoXFxuQEAgLTQ2LDY4ICs0NSw2IEBAIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIHZtcHJlc3N1cmVfd2luID0gU1dBUF9DTFVTVEVSX01BWCAqIDE2O1xcbiBzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHZtcHJlc3N1cmVfbGV2ZWxfbWVkID0gNjA7XFxuIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgdm1wcmVzc3VyZV9sZXZlbF9jcml0aWNhbCA9IDk1O1xcbiBcXG4tLypcXG4tICogV2hlbiB0aGVyZSBhcmUgdG9vIGxpdHRsZSBwYWdlcyBsZWZ0IHRvIHNjYW4sIHZtcHJlc3N1cmUoKSBtYXkgbWlzcyB0aGVcXG4tICogY3JpdGljYWwgcHJlc3N1cmUgYXMgbnVtYmVyIG9mIHBhZ2VzIHdpbGwgYmUgbGVzcyB0aGFuIFxcXCJ3aW5kb3cgc2l6ZVxcXCIuXFxuLSAqIEhvd2V2ZXIsIGluIHRoYXQgY2FzZSB0aGUgdm1zY2FuIHByaW9yaXR5IHdpbGwgcmFpc2UgZmFzdCBhcyB0aGVcXG4tICogcmVjbGFpbWVyIHdpbGwgdHJ5IHRvIHNjYW4gTFJVcyBtb3JlIGRlZXBseS5cXG4tICpcXG4tICogVGhlIHZtc2NhbiBsb2dpYyBjb25zaWRlcnMgdGhlc2Ugc3BlY2lhbCBwcmlvcml0aWVzOlxcbi0gKlxcbi0gKiBwcmlvID09IERFRl9QUklPUklUWSAoMTIpOiByZWNsYWltZXIgc3RhcnRzIHdpdGggdGhhdCB2YWx1ZVxcbi0gKiBwcmlvIFxcdTAwM2M9IERFRl9QUklPUklUWSAtIDIgOiBrc3dhcGQgYmVjb21lcyBzb21ld2hhdCBvdmVyd2hlbG1lZFxcbi0gKiBwcmlvID09IDAgICAgICAgICAgICAgICAgOiBjbG9zZSB0byBPT00sIGtlcm5lbCBzY2FucyBldmVyeSBwYWdlIGluIGFuIGxydVxcbi0gKlxcbi0gKiBBbnkgdmFsdWUgaW4gdGhpcyByYW5nZSBpcyBhY2NlcHRhYmxlIGZvciB0aGlzIHR1bmFibGUgKGkuZS4gZnJvbSAxMiB0b1xcbi0gKiAwKS4gQ3VycmVudCB2YWx1ZSBmb3IgdGhlIHZtcHJlc3N1cmVfbGV2ZWxfY3JpdGljYWxfcHJpbyBpcyBjaG9zZW5cXG4tICogZW1waXJpY2FsbHksIGJ1dCB0aGUgbnVtYmVyLCBpbiBlc3NlbmNlLCBtZWFucyB0aGF0IHdlIGNvbnNpZGVyXFxuLSAqIGNyaXRpY2FsIGxldmVsIHdoZW4gc2Nhbm5pbmcgZGVwdGggaXMgfjEwJSBvZiB0aGUgbHJ1IHNpemUgKHZtc2Nhblxcbi0gKiBzY2FucyAnbHJ1X3NpemUgXFx1MDAzZVxcdTAwM2UgcHJpbycgcGFnZXMsIHNvIGl0IGlzIGFjdHVhbGx5IDEyLjUlLCBvciBvbmVcXG4tICogZWlnaHRzKS5cXG4tICovXFxuLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgdm1wcmVzc3VyZV9sZXZlbF9jcml0aWNhbF9wcmlvID0gaWxvZzIoMTAwIC8gMTApO1xcbi1cXG4tc3RhdGljIHN0cnVjdCB2bXByZXNzdXJlICp3b3JrX3RvX3ZtcHJlc3N1cmUoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKVxcbi17XFxuLVxcdHJldHVybiBjb250YWluZXJfb2Yod29yaywgc3RydWN0IHZtcHJlc3N1cmUsIHdvcmspO1xcbi19XFxuLVxcbi1zdGF0aWMgc3RydWN0IHZtcHJlc3N1cmUgKnZtcHJlc3N1cmVfcGFyZW50KHN0cnVjdCB2bXByZXNzdXJlICp2bXByKVxcbi17XFxuLVxcdHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZyA9IHZtcHJlc3N1cmVfdG9fbWVtY2codm1wcik7XFxuLVxcbi1cXHRtZW1jZyA9IHBhcmVudF9tZW1fY2dyb3VwKG1lbWNnKTtcXG4tXFx0aWYgKCFtZW1jZylcXG4tXFx0XFx0cmV0dXJuIE5VTEw7XFxuLVxcdHJldHVybiBtZW1jZ190b192bXByZXNzdXJlKG1lbWNnKTtcXG4tfVxcbi1cXG4tZW51bSB2bXByZXNzdXJlX2xldmVscyB7XFxuLVxcdFZNUFJFU1NVUkVfTE9XID0gMCxcXG4tXFx0Vk1QUkVTU1VSRV9NRURJVU0sXFxuLVxcdFZNUFJFU1NVUkVfQ1JJVElDQUwsXFxuLVxcdFZNUFJFU1NVUkVfTlVNX0xFVkVMUyxcXG4tfTtcXG4tXFxuLWVudW0gdm1wcmVzc3VyZV9tb2RlcyB7XFxuLVxcdFZNUFJFU1NVUkVfTk9fUEFTU1RIUk9VR0ggPSAwLFxcbi1cXHRWTVBSRVNTVVJFX0hJRVJBUkNIWSxcXG4tXFx0Vk1QUkVTU1VSRV9MT0NBTCxcXG4tXFx0Vk1QUkVTU1VSRV9OVU1fTU9ERVMsXFxuLX07XFxuLVxcbi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHZtcHJlc3N1cmVfc3RyX2xldmVsc1tdID0ge1xcbi1cXHRbVk1QUkVTU1VSRV9MT1ddID0gXFxcImxvd1xcXCIsXFxuLVxcdFtWTVBSRVNTVVJFX01FRElVTV0gPSBcXFwibWVkaXVtXFxcIixcXG4tXFx0W1ZNUFJFU1NVUkVfQ1JJVElDQUxdID0gXFxcImNyaXRpY2FsXFxcIixcXG4tfTtcXG4tXFxuLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgdm1wcmVzc3VyZV9zdHJfbW9kZXNbXSA9IHtcXG4tXFx0W1ZNUFJFU1NVUkVfTk9fUEFTU1RIUk9VR0hdID0gXFxcImRlZmF1bHRcXFwiLFxcbi1cXHRbVk1QUkVTU1VSRV9ISUVSQVJDSFldID0gXFxcImhpZXJhcmNoeVxcXCIsXFxuLVxcdFtWTVBSRVNTVVJFX0xPQ0FMXSA9IFxcXCJsb2NhbFxcXCIsXFxuLX07XFxuLVxcbiBzdGF0aWMgZW51bSB2bXByZXNzdXJlX2xldmVscyB2bXByZXNzdXJlX2xldmVsKHVuc2lnbmVkIGxvbmcgcHJlc3N1cmUpXFxuIHtcXG4gXFx0aWYgKHByZXNzdXJlIFxcdTAwM2U9IHZtcHJlc3N1cmVfbGV2ZWxfY3JpdGljYWwpXFxuQEAgLTExNyw4ICs1NCw4IEBAIHN0YXRpYyBlbnVtIHZtcHJlc3N1cmVfbGV2ZWxzIHZtcHJlc3N1cmVfbGV2ZWwodW5zaWduZWQgbG9uZyBwcmVzc3VyZSlcXG4gXFx0cmV0dXJuIFZNUFJFU1NVUkVfTE9XO1xcbiB9XFxuIFxcbi1zdGF0aWMgZW51bSB2bXByZXNzdXJlX2xldmVscyB2bXByZXNzdXJlX2NhbGNfbGV2ZWwodW5zaWduZWQgbG9uZyBzY2FubmVkLFxcbi1cXHRcXHRcXHRcXHRcXHRcXHQgICAgdW5zaWduZWQgbG9uZyByZWNsYWltZWQpXFxuK2VudW0gdm1wcmVzc3VyZV9sZXZlbHMgdm1wcmVzc3VyZV9jYWxjX2xldmVsKHVuc2lnbmVkIGxvbmcgc2Nhbm5lZCxcXG4rXFx0XFx0XFx0XFx0XFx0ICAgICB1bnNpZ25lZCBsb25nIHJlY2xhaW1lZClcXG4ge1xcbiBcXHR1bnNpZ25lZCBsb25nIHNjYWxlID0gc2Nhbm5lZCArIHJlY2xhaW1lZDtcXG4gXFx0dW5zaWduZWQgbG9uZyBwcmVzc3VyZSA9IDA7XFxuQEAgLTE0Nyw3NCArODQsNiBAQCBzdGF0aWMgZW51bSB2bXByZXNzdXJlX2xldmVscyB2bXByZXNzdXJlX2NhbGNfbGV2ZWwodW5zaWduZWQgbG9uZyBzY2FubmVkLFxcbiBcXHRyZXR1cm4gdm1wcmVzc3VyZV9sZXZlbChwcmVzc3VyZSk7XFxuIH1cXG4gXFxuLXN0cnVjdCB2bXByZXNzdXJlX2V2ZW50IHtcXG4tXFx0c3RydWN0IGV2ZW50ZmRfY3R4ICplZmQ7XFxuLVxcdGVudW0gdm1wcmVzc3VyZV9sZXZlbHMgbGV2ZWw7XFxuLVxcdGVudW0gdm1wcmVzc3VyZV9tb2RlcyBtb2RlO1xcbi1cXHRzdHJ1Y3QgbGlzdF9oZWFkIG5vZGU7XFxuLX07XFxuLVxcbi1zdGF0aWMgYm9vbCB2bXByZXNzdXJlX2V2ZW50KHN0cnVjdCB2bXByZXNzdXJlICp2bXByLFxcbi1cXHRcXHRcXHQgICAgIGNvbnN0IGVudW0gdm1wcmVzc3VyZV9sZXZlbHMgbGV2ZWwsXFxuLVxcdFxcdFxcdCAgICAgYm9vbCBhbmNlc3RvciwgYm9vbCBzaWduYWxsZWQpXFxuLXtcXG4tXFx0c3RydWN0IHZtcHJlc3N1cmVfZXZlbnQgKmV2O1xcbi1cXHRib29sIHJldCA9IGZhbHNlO1xcbi1cXG4tXFx0bXV0ZXhfbG9jayhcXHUwMDI2dm1wci1cXHUwMDNlZXZlbnRzX2xvY2spO1xcbi1cXHRsaXN0X2Zvcl9lYWNoX2VudHJ5KGV2LCBcXHUwMDI2dm1wci1cXHUwMDNlZXZlbnRzLCBub2RlKSB7XFxuLVxcdFxcdGlmIChhbmNlc3RvciBcXHUwMDI2XFx1MDAyNiBldi1cXHUwMDNlbW9kZSA9PSBWTVBSRVNTVVJFX0xPQ0FMKVxcbi1cXHRcXHRcXHRjb250aW51ZTtcXG4tXFx0XFx0aWYgKHNpZ25hbGxlZCBcXHUwMDI2XFx1MDAyNiBldi1cXHUwMDNlbW9kZSA9PSBWTVBSRVNTVVJFX05PX1BBU1NUSFJPVUdIKVxcbi1cXHRcXHRcXHRjb250aW51ZTtcXG4tXFx0XFx0aWYgKGxldmVsIFxcdTAwM2MgZXYtXFx1MDAzZWxldmVsKVxcbi1cXHRcXHRcXHRjb250aW51ZTtcXG4tXFx0XFx0ZXZlbnRmZF9zaWduYWwoZXYtXFx1MDAzZWVmZCk7XFxuLVxcdFxcdHJldCA9IHRydWU7XFxuLVxcdH1cXG4tXFx0bXV0ZXhfdW5sb2NrKFxcdTAwMjZ2bXByLVxcdTAwM2VldmVudHNfbG9jayk7XFxuLVxcbi1cXHRyZXR1cm4gcmV0O1xcbi19XFxuLVxcbi1zdGF0aWMgdm9pZCB2bXByZXNzdXJlX3dvcmtfZm4oc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKVxcbi17XFxuLVxcdHN0cnVjdCB2bXByZXNzdXJlICp2bXByID0gd29ya190b192bXByZXNzdXJlKHdvcmspO1xcbi1cXHR1bnNpZ25lZCBsb25nIHNjYW5uZWQ7XFxuLVxcdHVuc2lnbmVkIGxvbmcgcmVjbGFpbWVkO1xcbi1cXHRlbnVtIHZtcHJlc3N1cmVfbGV2ZWxzIGxldmVsO1xcbi1cXHRib29sIGFuY2VzdG9yID0gZmFsc2U7XFxuLVxcdGJvb2wgc2lnbmFsbGVkID0gZmFsc2U7XFxuLVxcbi1cXHRzcGluX2xvY2soXFx1MDAyNnZtcHItXFx1MDAzZXNyX2xvY2spO1xcbi1cXHQvKlxcbi1cXHQgKiBTZXZlcmFsIGNvbnRleHRzIG1pZ2h0IGJlIGNhbGxpbmcgdm1wcmVzc3VyZSgpLCBzbyBpdCBpc1xcbi1cXHQgKiBwb3NzaWJsZSB0aGF0IHRoZSB3b3JrIHdhcyByZXNjaGVkdWxlZCBhZ2FpbiBiZWZvcmUgdGhlIG9sZFxcbi1cXHQgKiB3b3JrIGNvbnRleHQgY2xlYXJlZCB0aGUgY291bnRlcnMuIEluIHRoYXQgY2FzZSB3ZSB3aWxsIHJ1blxcbi1cXHQgKiBqdXN0IGFmdGVyIHRoZSBvbGQgd29yayByZXR1cm5zLCBidXQgdGhlbiBzY2FubmVkIG1pZ2h0IGJlIHplcm9cXG4tXFx0ICogaGVyZS4gTm8gbmVlZCBmb3IgYW55IGxvY2tzIGhlcmUgc2luY2Ugd2UgZG9uJ3QgY2FyZSBpZlxcbi1cXHQgKiB2bXByLVxcdTAwM2VyZWNsYWltZWQgaXMgaW4gc3luYy5cXG4tXFx0ICovXFxuLVxcdHNjYW5uZWQgPSB2bXByLVxcdTAwM2V0cmVlX3NjYW5uZWQ7XFxuLVxcdGlmICghc2Nhbm5lZCkge1xcbi1cXHRcXHRzcGluX3VubG9jayhcXHUwMDI2dm1wci1cXHUwMDNlc3JfbG9jayk7XFxuLVxcdFxcdHJldHVybjtcXG4tXFx0fVxcbi1cXG4tXFx0cmVjbGFpbWVkID0gdm1wci1cXHUwMDNldHJlZV9yZWNsYWltZWQ7XFxuLVxcdHZtcHItXFx1MDAzZXRyZWVfc2Nhbm5lZCA9IDA7XFxuLVxcdHZtcHItXFx1MDAzZXRyZWVfcmVjbGFpbWVkID0gMDtcXG4tXFx0c3Bpbl91bmxvY2soXFx1MDAyNnZtcHItXFx1MDAzZXNyX2xvY2spO1xcbi1cXG4tXFx0bGV2ZWwgPSB2bXByZXNzdXJlX2NhbGNfbGV2ZWwoc2Nhbm5lZCwgcmVjbGFpbWVkKTtcXG4tXFxuLVxcdGRvIHtcXG4tXFx0XFx0aWYgKHZtcHJlc3N1cmVfZXZlbnQodm1wciwgbGV2ZWwsIGFuY2VzdG9yLCBzaWduYWxsZWQpKVxcbi1cXHRcXHRcXHRzaWduYWxsZWQgPSB0cnVlO1xcbi1cXHRcXHRhbmNlc3RvciA9IHRydWU7XFxuLVxcdH0gd2hpbGUgKCh2bXByID0gdm1wcmVzc3VyZV9wYXJlbnQodm1wcikpKTtcXG4tfVxcbi1cXG4gLyoqXFxuICAqIHZtcHJlc3N1cmUoKSAtIEFjY291bnQgbWVtb3J5IHByZXNzdXJlIHRocm91Z2ggc2Nhbm5lZC9yZWNsYWltZWQgcmF0aW9cXG4gICogQGdmcDpcXHRyZWNsYWltZXIncyBnZnAgbWFza1xcbkBAIC0yNDYsMTEgKzExNSwxMyBAQCB2b2lkIHZtcHJlc3N1cmUoZ2ZwX3QgZ2ZwLCBpbnQgb3JkZXIsIHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZywgYm9vbCB0cmVlLFxcbiBcXHRcXHRyZXR1cm47XFxuIFxcbiBcXHQvKlxcbi1cXHQgKiBUaGUgaW4ta2VybmVsIHVzZXJzIG9ubHkgY2FyZSBhYm91dCB0aGUgcmVjbGFpbSBlZmZpY2llbmN5XFxuLVxcdCAqIGZvciB0aGlzIEBtZW1jZyByYXRoZXIgdGhhbiB0aGUgd2hvbGUgc3VidHJlZSwgYW5kIHRoZXJlXFxuLVxcdCAqIGlzbid0IGFuZCB3b24ndCBiZSBhbnkgaW4ta2VybmVsIHVzZXIgaW4gYSBsZWdhY3kgY2dyb3VwLlxcbitcXHQgKiBPbmx5IHR3byBjb21iaW5hdGlvbnMgaGF2ZSBhIGNvbnN1bWVyOlxcbitcXHQgKiAgIGNncm91cCB2MiArIHRyZWU9ZmFsc2UgLVxcdTAwM2UgaW4ta2VybmVsIHNvY2tldCBwcmVzc3VyZVxcbitcXHQgKiAgIGNncm91cCB2MSArIHRyZWU9dHJ1ZSAgLVxcdTAwM2UgdXNlcnNwYWNlIGV2ZW50ZmRzIChtZW1vcnkucHJlc3N1cmVfbGV2ZWwpXFxuK1xcdCAqIFNraXAgdGhlIG90aGVyIHR3bzogbm90aGluZyBjb25zdW1lcyB0aGUgcmVzdWx0LlxcbiBcXHQgKi9cXG4tXFx0aWYgKCFjZ3JvdXBfc3Vic3lzX29uX2RmbChtZW1vcnlfY2dycF9zdWJzeXMpIFxcdTAwMjZcXHUwMDI2ICF0cmVlKVxcbitcXHRpZiAoKCFjZ3JvdXBfc3Vic3lzX29uX2RmbChtZW1vcnlfY2dycF9zdWJzeXMpIFxcdTAwMjZcXHUwMDI2ICF0cmVlKSB8fFxcbitcXHQgICAgKGNncm91cF9zdWJzeXNfb25fZGZsKG1lbW9yeV9jZ3JwX3N1YnN5cykgXFx1MDAyNlxcdTAwMjYgdHJlZSkpXFxuIFxcdFxcdHJldHVybjtcXG4gXFxuIFxcdHZtcHIgPSBtZW1jZ190b192bXByZXNzdXJlKG1lbWNnKTtcXG5AQCAtMjgxLDE0ICsxNTIsNyBAQCB2b2lkIHZtcHJlc3N1cmUoZ2ZwX3QgZ2ZwLCBpbnQgb3JkZXIsIHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZywgYm9vbCB0cmVlLFxcbiBcXHRcXHRyZXR1cm47XFxuIFxcbiBcXHRpZiAodHJlZSkge1xcbi1cXHRcXHRzcGluX2xvY2soXFx1MDAyNnZtcHItXFx1MDAzZXNyX2xvY2spO1xcbi1cXHRcXHRzY2FubmVkID0gdm1wci1cXHUwMDNldHJlZV9zY2FubmVkICs9IHNjYW5uZWQ7XFxuLVxcdFxcdHZtcHItXFx1MDAzZXRyZWVfcmVjbGFpbWVkICs9IHJlY2xhaW1lZDtcXG4tXFx0XFx0c3Bpbl91bmxvY2soXFx1MDAyNnZtcHItXFx1MDAzZXNyX2xvY2spO1xcbi1cXG4tXFx0XFx0aWYgKHNjYW5uZWQgXFx1MDAzYyB2bXByZXNzdXJlX3dpbilcXG4tXFx0XFx0XFx0cmV0dXJuO1xcbi1cXHRcXHRzY2hlZHVsZV93b3JrKFxcdTAwMjZ2bXByLVxcdTAwM2V3b3JrKTtcXG4rXFx0XFx0dm1wcmVzc3VyZV92MV9hY2NvdW50X3RyZWUodm1wciwgc2Nhbm5lZCwgcmVjbGFpbWVkKTtcXG4gXFx0fSBlbHNlIHtcXG4gXFx0XFx0ZW51bSB2bXByZXNzdXJlX2xldmVscyBsZXZlbDtcXG4gXFxuQEAgLTMzMCwxMzQgKzE5NCw2IEBAIHZvaWQgdm1wcmVzc3VyZShnZnBfdCBnZnAsIGludCBvcmRlciwgc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLCBib29sIHRyZWUsXFxuIFxcdH1cXG4gfVxcbiBcXG4tLyoqXFxuLSAqIHZtcHJlc3N1cmVfcHJpbygpIC0gQWNjb3VudCBtZW1vcnkgcHJlc3N1cmUgdGhyb3VnaCByZWNsYWltZXIgcHJpb3JpdHkgbGV2ZWxcXG4tICogQGdmcDpcXHRyZWNsYWltZXIncyBnZnAgbWFza1xcbi0gKiBAbWVtY2c6XFx0Y2dyb3VwIG1lbW9yeSBjb250cm9sbGVyIGhhbmRsZVxcbi0gKiBAcHJpbzpcXHRyZWNsYWltZXIncyBwcmlvcml0eVxcbi0gKlxcbi0gKiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgZnJvbSB0aGUgcmVjbGFpbSBwYXRoIGV2ZXJ5IHRpbWUgd2hlblxcbi0gKiB0aGUgdm1zY2FuJ3MgcmVjbGFpbWluZyBwcmlvcml0eSAoc2Nhbm5pbmcgZGVwdGgpIGNoYW5nZXMuXFxuLSAqXFxuLSAqIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgcmV0dXJuIGFueSB2YWx1ZS5cXG4tICovXFxuLXZvaWQgdm1wcmVzc3VyZV9wcmlvKGdmcF90IGdmcCwgc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLCBpbnQgcHJpbylcXG4te1xcbi1cXHQvKlxcbi1cXHQgKiBXZSBvbmx5IHVzZSBwcmlvIGZvciBhY2NvdW50aW5nIGNyaXRpY2FsIGxldmVsLiBGb3IgbW9yZSBpbmZvXFxuLVxcdCAqIHNlZSBjb21tZW50IGZvciB2bXByZXNzdXJlX2xldmVsX2NyaXRpY2FsX3ByaW8gdmFyaWFibGUgYWJvdmUuXFxuLVxcdCAqL1xcbi1cXHRpZiAocHJpbyBcXHUwMDNlIHZtcHJlc3N1cmVfbGV2ZWxfY3JpdGljYWxfcHJpbylcXG4tXFx0XFx0cmV0dXJuO1xcbi1cXG4tXFx0LypcXG4tXFx0ICogT0ssIHRoZSBwcmlvIGlzIGJlbG93IHRoZSB0aHJlc2hvbGQsIHVwZGF0aW5nIHZtcHJlc3N1cmVcXG4tXFx0ICogaW5mb3JtYXRpb24gYmVmb3JlIHNocmlua2VyIGRpdmVzIGludG8gbG9uZyBzaHJpbmtpbmcgb2YgbG9uZ1xcbi1cXHQgKiByYW5nZSB2bXNjYW4uIFBhc3Npbmcgc2Nhbm5lZCA9IHZtcHJlc3N1cmVfd2luLCByZWNsYWltZWQgPSAwXFxuLVxcdCAqIHRvIHRoZSB2bXByZXNzdXJlKCkgYmFzaWNhbGx5IG1lYW5zIHRoYXQgd2Ugc2lnbmFsICdjcml0aWNhbCdcXG4tXFx0ICogbGV2ZWwuXFxuLVxcdCAqL1xcbi1cXHR2bXByZXNzdXJlKGdmcCwgMCwgbWVtY2csIHRydWUsIHZtcHJlc3N1cmVfd2luLCAwKTtcXG4tfVxcbi1cXG4tI2RlZmluZSBNQVhfVk1QUkVTU1VSRV9BUkdTX0xFTlxcdChzdHJsZW4oXFxcImNyaXRpY2FsXFxcIikgKyBzdHJsZW4oXFxcImhpZXJhcmNoeVxcXCIpICsgMilcXG4tXFxuLS8qKlxcbi0gKiB2bXByZXNzdXJlX3JlZ2lzdGVyX2V2ZW50KCkgLSBCaW5kIHZtcHJlc3N1cmUgbm90aWZpY2F0aW9ucyB0byBhbiBldmVudGZkXFxuLSAqIEBtZW1jZzpcXHRtZW1jZyB0aGF0IGlzIGludGVyZXN0ZWQgaW4gdm1wcmVzc3VyZSBub3RpZmljYXRpb25zXFxuLSAqIEBldmVudGZkOlxcdGV2ZW50ZmQgY29udGV4dCB0byBsaW5rIG5vdGlmaWNhdGlvbnMgd2l0aFxcbi0gKiBAYXJnczpcXHRldmVudCBhcmd1bWVudHMgKHByZXNzdXJlIGxldmVsIHRocmVzaG9sZCwgb3B0aW9uYWwgbW9kZSlcXG4tICpcXG4tICogVGhpcyBmdW5jdGlvbiBhc3NvY2lhdGVzIGV2ZW50ZmQgY29udGV4dCB3aXRoIHRoZSB2bXByZXNzdXJlXFxuLSAqIGluZnJhc3RydWN0dXJlLCBzbyB0aGF0IHRoZSBub3RpZmljYXRpb25zIHdpbGwgYmUgZGVsaXZlcmVkIHRvIHRoZVxcbi0gKiBAZXZlbnRmZC4gVGhlIEBhcmdzIHBhcmFtZXRlciBpcyBhIGNvbW1hLWRlbGltaXRlZCBzdHJpbmcgdGhhdCBkZW5vdGVzIGFcXG4tICogcHJlc3N1cmUgbGV2ZWwgdGhyZXNob2xkIChvbmUgb2Ygdm1wcmVzc3VyZV9zdHJfbGV2ZWxzLCBpLmUuIFxcXCJsb3dcXFwiLCBcXFwibWVkaXVtXFxcIixcXG4tICogb3IgXFxcImNyaXRpY2FsXFxcIikgYW5kIGFuIG9wdGlvbmFsIG1vZGUgKG9uZSBvZiB2bXByZXNzdXJlX3N0cl9tb2RlcywgaS5lLlxcbi0gKiBcXFwiaGllcmFyY2h5XFxcIiBvciBcXFwibG9jYWxcXFwiKS5cXG4tICpcXG4tICogVG8gYmUgdXNlZCBhcyBtZW1jZyBldmVudCBtZXRob2QuXFxuLSAqXFxuLSAqIFJldHVybjogMCBvbiBzdWNjZXNzLCAtRU5PTUVNIG9uIG1lbW9yeSBmYWlsdXJlIG9yIC1FSU5WQUwgaWYgQGFyZ3MgY291bGRcXG4tICogbm90IGJlIHBhcnNlZC5cXG4tICovXFxuLWludCB2bXByZXNzdXJlX3JlZ2lzdGVyX2V2ZW50KHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZyxcXG4tXFx0XFx0XFx0ICAgICAgc3RydWN0IGV2ZW50ZmRfY3R4ICpldmVudGZkLCBjb25zdCBjaGFyICphcmdzKVxcbi17XFxuLVxcdHN0cnVjdCB2bXByZXNzdXJlICp2bXByID0gbWVtY2dfdG9fdm1wcmVzc3VyZShtZW1jZyk7XFxuLVxcdHN0cnVjdCB2bXByZXNzdXJlX2V2ZW50ICpldjtcXG4tXFx0ZW51bSB2bXByZXNzdXJlX21vZGVzIG1vZGUgPSBWTVBSRVNTVVJFX05PX1BBU1NUSFJPVUdIO1xcbi1cXHRlbnVtIHZtcHJlc3N1cmVfbGV2ZWxzIGxldmVsO1xcbi1cXHRjaGFyICpzcGVjLCAqc3BlY19vcmlnO1xcbi1cXHRjaGFyICp0b2tlbjtcXG4tXFx0aW50IHJldCA9IDA7XFxuLVxcbi1cXHRzcGVjX29yaWcgPSBzcGVjID0ga3N0cm5kdXAoYXJncywgTUFYX1ZNUFJFU1NVUkVfQVJHU19MRU4sIEdGUF9LRVJORUwpO1xcbi1cXHRpZiAoIXNwZWMpXFxuLVxcdFxcdHJldHVybiAtRU5PTUVNO1xcbi1cXG4tXFx0LyogRmluZCByZXF1aXJlZCBsZXZlbCAqL1xcbi1cXHR0b2tlbiA9IHN0cnNlcChcXHUwMDI2c3BlYywgXFxcIixcXFwiKTtcXG4tXFx0cmV0ID0gbWF0Y2hfc3RyaW5nKHZtcHJlc3N1cmVfc3RyX2xldmVscywgVk1QUkVTU1VSRV9OVU1fTEVWRUxTLCB0b2tlbik7XFxuLVxcdGlmIChyZXQgXFx1MDAzYyAwKVxcbi1cXHRcXHRnb3RvIG91dDtcXG4tXFx0bGV2ZWwgPSByZXQ7XFxuLVxcbi1cXHQvKiBGaW5kIG9wdGlvbmFsIG1vZGUgKi9cXG4tXFx0dG9rZW4gPSBzdHJzZXAoXFx1MDAyNnNwZWMsIFxcXCIsXFxcIik7XFxuLVxcdGlmICh0b2tlbikge1xcbi1cXHRcXHRyZXQgPSBtYXRjaF9zdHJpbmcodm1wcmVzc3VyZV9zdHJfbW9kZXMsIFZNUFJFU1NVUkVfTlVNX01PREVTLCB0b2tlbik7XFxuLVxcdFxcdGlmIChyZXQgXFx1MDAzYyAwKVxcbi1cXHRcXHRcXHRnb3RvIG91dDtcXG4tXFx0XFx0bW9kZSA9IHJldDtcXG4tXFx0fVxcbi1cXG4tXFx0ZXYgPSBremFsbG9jX29iaigqZXYpO1xcbi1cXHRpZiAoIWV2KSB7XFxuLVxcdFxcdHJldCA9IC1FTk9NRU07XFxuLVxcdFxcdGdvdG8gb3V0O1xcbi1cXHR9XFxuLVxcbi1cXHRldi1cXHUwMDNlZWZkID0gZXZlbnRmZDtcXG4tXFx0ZXYtXFx1MDAzZWxldmVsID0gbGV2ZWw7XFxuLVxcdGV2LVxcdTAwM2Vtb2RlID0gbW9kZTtcXG4tXFxuLVxcdG11dGV4X2xvY2soXFx1MDAyNnZtcHItXFx1MDAzZWV2ZW50c19sb2NrKTtcXG4tXFx0bGlzdF9hZGQoXFx1MDAyNmV2LVxcdTAwM2Vub2RlLCBcXHUwMDI2dm1wci1cXHUwMDNlZXZlbnRzKTtcXG4tXFx0bXV0ZXhfdW5sb2NrKFxcdTAwMjZ2bXByLVxcdTAwM2VldmVudHNfbG9jayk7XFxuLVxcdHJldCA9IDA7XFxuLW91dDpcXG4tXFx0a2ZyZWUoc3BlY19vcmlnKTtcXG4tXFx0cmV0dXJuIHJldDtcXG4tfVxcbi1cXG4tLyoqXFxuLSAqIHZtcHJlc3N1cmVfdW5yZWdpc3Rlcl9ldmVudCgpIC0gVW5iaW5kIGV2ZW50ZmQgZnJvbSB2bXByZXNzdXJlXFxuLSAqIEBtZW1jZzpcXHRtZW1jZyBoYW5kbGVcXG4tICogQGV2ZW50ZmQ6XFx0ZXZlbnRmZCBjb250ZXh0IHRoYXQgd2FzIHVzZWQgdG8gbGluayB2bXByZXNzdXJlIHdpdGggdGhlIEBjZ1xcbi0gKlxcbi0gKiBUaGlzIGZ1bmN0aW9uIGRvZXMgaW50ZXJuYWwgbWFuaXB1bGF0aW9ucyB0byBkZXRhY2ggdGhlIEBldmVudGZkIGZyb21cXG4tICogdGhlIHZtcHJlc3N1cmUgbm90aWZpY2F0aW9ucywgYW5kIHRoZW4gZnJlZXMgaW50ZXJuYWwgcmVzb3VyY2VzXFxuLSAqIGFzc29jaWF0ZWQgd2l0aCB0aGUgQGV2ZW50ZmQgKGJ1dCB0aGUgQGV2ZW50ZmQgaXRzZWxmIGlzIG5vdCBmcmVlZCkuXFxuLSAqXFxuLSAqIFRvIGJlIHVzZWQgYXMgbWVtY2cgZXZlbnQgbWV0aG9kLlxcbi0gKi9cXG4tdm9pZCB2bXByZXNzdXJlX3VucmVnaXN0ZXJfZXZlbnQoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLFxcbi1cXHRcXHRcXHRcXHQgc3RydWN0IGV2ZW50ZmRfY3R4ICpldmVudGZkKVxcbi17XFxuLVxcdHN0cnVjdCB2bXByZXNzdXJlICp2bXByID0gbWVtY2dfdG9fdm1wcmVzc3VyZShtZW1jZyk7XFxuLVxcdHN0cnVjdCB2bXByZXNzdXJlX2V2ZW50ICpldjtcXG4tXFxuLVxcdG11dGV4X2xvY2soXFx1MDAyNnZtcHItXFx1MDAzZWV2ZW50c19sb2NrKTtcXG4tXFx0bGlzdF9mb3JfZWFjaF9lbnRyeShldiwgXFx1MDAyNnZtcHItXFx1MDAzZWV2ZW50cywgbm9kZSkge1xcbi1cXHRcXHRpZiAoZXYtXFx1MDAzZWVmZCAhPSBldmVudGZkKVxcbi1cXHRcXHRcXHRjb250aW51ZTtcXG4tXFx0XFx0bGlzdF9kZWwoXFx1MDAyNmV2LVxcdTAwM2Vub2RlKTtcXG4tXFx0XFx0a2ZyZWUoZXYpO1xcbi1cXHRcXHRicmVhaztcXG4tXFx0fVxcbi1cXHRtdXRleF91bmxvY2soXFx1MDAyNnZtcHItXFx1MDAzZWV2ZW50c19sb2NrKTtcXG4tfVxcbi1cXG4gLyoqXFxuICAqIHZtcHJlc3N1cmVfaW5pdCgpIC0gSW5pdGlhbGl6ZSB2bXByZXNzdXJlIGNvbnRyb2wgc3RydWN0dXJlXFxuICAqIEB2bXByOlxcdFN0cnVjdHVyZSB0byBiZSBpbml0aWFsaXplZFxcbkBAIC00NjgsOSArMjA0LDcgQEAgdm9pZCB2bXByZXNzdXJlX3VucmVnaXN0ZXJfZXZlbnQoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLFxcbiB2b2lkIHZtcHJlc3N1cmVfaW5pdChzdHJ1Y3Qgdm1wcmVzc3VyZSAqdm1wcilcXG4ge1xcbiBcXHRzcGluX2xvY2tfaW5pdChcXHUwMDI2dm1wci1cXHUwMDNlc3JfbG9jayk7XFxuLVxcdG11dGV4X2luaXQoXFx1MDAyNnZtcHItXFx1MDAzZWV2ZW50c19sb2NrKTtcXG4tXFx0SU5JVF9MSVNUX0hFQUQoXFx1MDAyNnZtcHItXFx1MDAzZWV2ZW50cyk7XFxuLVxcdElOSVRfV09SSyhcXHUwMDI2dm1wci1cXHUwMDNld29yaywgdm1wcmVzc3VyZV93b3JrX2ZuKTtcXG4rXFx0dm1wcmVzc3VyZV92MV9pbml0KHZtcHIpO1xcbiB9XFxuIFxcbiAvKipcXG5AQCAtNDgyLDkgKzIxNiw1IEBAIHZvaWQgdm1wcmVzc3VyZV9pbml0KHN0cnVjdCB2bXByZXNzdXJlICp2bXByKVxcbiAgKi9cXG4gdm9pZCB2bXByZXNzdXJlX2NsZWFudXAoc3RydWN0IHZtcHJlc3N1cmUgKnZtcHIpXFxuIHtcXG4tXFx0LypcXG4tXFx0ICogTWFrZSBzdXJlIHRoZXJlIGlzIG5vIHBlbmRpbmcgd29yayBiZWZvcmUgZXZlbnRmZCBpbmZyYXN0cnVjdHVyZVxcbi1cXHQgKiBnb2VzIGF3YXkuXFxuLVxcdCAqL1xcbi1cXHRmbHVzaF93b3JrKFxcdTAwMjZ2bXByLVxcdTAwM2V3b3JrKTtcXG4rXFx0dm1wcmVzc3VyZV92MV9jbGVhbnVwKHZtcHIpO1xcbiB9XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA2LTI5VDE0OjMzOjU3LjUwMzczNDY3N1oiLCJTZXEiOjIsIk5lc3RpbmciOjEsIlR5cGUiOiJhZ2VudCIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6ODQ4OTMzNzgwMzYsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiTUVNQ0dcIixcbiAgICBcIk1FTUNHX1YxXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwidm1wcmVzc3VyZVwiLFxuICAgIFwidm1wcmVzc3VyZV92MV9hY2NvdW50X3RyZWVcIixcbiAgICBcInZtcHJlc3N1cmVfd29ya19mblwiLFxuICAgIFwidm1wcmVzc3VyZV9ldmVudFwiLFxuICAgIFwidm1wcmVzc3VyZV9yZWdpc3Rlcl9ldmVudFwiLFxuICAgIFwidm1wcmVzc3VyZV91bnJlZ2lzdGVyX2V2ZW50XCIsXG4gICAgXCJ2bXByZXNzdXJlX3ByaW9cIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBleHRyYWN0cyBjZ3JvdXAgdjEgc3BlY2lmaWMgdm1wcmVzc3VyZSBsb2dpYyBpbnRvIGEgbmV3IGZpbGUgYG1tL3ZtcHJlc3N1cmUtdjEuY2AgZ3VhcmRlZCBieSBgQ09ORklHX01FTUNHX1YxYC4gSXQgYWxzbyBpbnRyb2R1Y2VzIGEgZnVuY3Rpb25hbCBvcHRpbWl6YXRpb24gaW4gYHZtcHJlc3N1cmUoKWAgdG8gcmV0dXJuIGVhcmx5IGZvciBjZ3JvdXAgdjIgd2hlbiBgdHJlZT10cnVlYCwgYXZvaWRpbmcgdW5uZWNlc3NhcnkgY291bnRlciBhY2N1bXVsYXRpb24gYW5kIHdvcmsgc2NoZWR1bGluZy4gVGhpcyBtb2RpZmllcyByZWFjaGFibGUgY29yZSBtZW1vcnkgbWFuYWdlbWVudCBsb2dpYyBhbmQgYWx0ZXJzIGV4ZWN1dGlvbiBmbG93LCBzbyBpdCBzaG91bGQgYmUgZnV6emVkLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiSW5zdHJ1Y3Rpb24iOiJZb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgbWFpbnRhaW5lci5cbllvdXIgam9iIGlzIHRvIHJldmlldyBhIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQgZGV0ZXJtaW5lXG5pZiBpdCBtYWtlcyBmdW5jdGlvbmFsIGNoYW5nZXMgdG8gdGhlIGtlcm5lbCB0aGF0IHNob3VsZCBiZSBmdXp6ZWQuXG5cbklNUE9SVEFOVDogVGhlIGNoYW5nZXMgaGF2ZSBBTFJFQURZIGJlZW4gYXBwbGllZCBhbmQgY29tbWl0dGVkIGFzIHRoZSBIRUFEIGNvbW1pdCBpblxueW91ciB3b3Jrc3BhY2UuIERvIE5PVCByZWx5IG9uIHlvdXIgaW50ZXJuYWwga25vd2xlZGdlIG9mIHRoZSBrZXJuZWwuIFlvdSBtdXN0IGFjdGl2ZWx5XG51c2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBleGFtaW5lIHRoZSBhY3R1YWwgc291cmNlIGNvZGUgYW5kIGNvbmZpcm0gYW55IGFzc3VtcHRpb25zLlxuXG5SZXR1cm4gV29ydGhGdXp6aW5nPWZhbHNlIGlmIHRoZSBwYXRjaCBvbmx5IGNvbnRhaW5zOlxuLSBNb2RpZmljYXRpb25zIHRvIERvY3VtZW50YXRpb24vLCBLY29uZmlnIGZpbGVzLCBvciBjb2RlIGNvbW1lbnRzLlxuLSBQdXJlbHkgZGVjb3JhdGl2ZSBjaGFuZ2VzLCBzdWNoIGFzIGxvZ2dpbmcgKGUuZy4sIHByX2VyciwgcHJpbnRrKSBvciB0cmFjZXBvaW50cy5cbi0gQ2hhbmdlcyB0byBudW1lcmljIGNvbnN0YW50cyBvciBtYWNyb3MgdGhhdCBkbyBub3QgZnVuY3Rpb25hbGx5IGFsdGVyIGV4ZWN1dGlvbiBmbG93LlxuLSBDb2RlIHBhdGhzIHRoYXQgYXJlIGltcG9zc2libGUgdG8gcmVhY2ggaW4gdmlydHVhbGl6ZWQgZW52aXJvbm1lbnRzIGxpa2UgR0NFIG9yIFFFTVUsXG5ldmVuIHdoZW4gdXRpbGl6aW5nIHNvZnR3YXJlLWVtdWxhdGVkIGhhcmR3YXJlIChlLmcuLCB1c2IgZ2FkZ2V0LCBtYWM4MDIxMV9od3NpbSkuXG5cbklmIGl0IG1vZGlmaWVzIHJlYWNoYWJsZSBjb3JlIGtlcm5lbCBsb2dpYywgZHJpdmVycywgb3IgYXJjaGl0ZWN0dXJlcywgdXNlIHlvdXIgY29kZSBzZWFyY2hcbnRvb2xzIHRvIHZlcmlmeSB0aGUgY29kZSBjYW4gYmUgZXhlY3V0ZWQsIHRoZW4gcmV0dXJuIFdvcnRoRnV6emluZz10cnVlLlxuXG5XaGVuIHJldHVybmluZyBXb3J0aEZ1enppbmc9dHJ1ZSwgeW91IE1VU1QgQUxTTzpcbjEuIEV4dHJhY3QgYW55IHNwZWNpZmljIGtlcm5lbCBmdW5jdGlvbnMgdGhhdCBzaG91bGQgYmUgaGVhdmlseSBmdXp6ZWQgaW50byBGb2N1c1N5bWJvbHMuXG4gICBBdm9pZCBsaXN0aW5nIGdlbmVyaWMgaG90LXBhdGggZnVuY3Rpb25zIHRvIHByZXZlbnQgc2tld2VkIHRlc3QgZGlzdHJpYnV0aW9ucy5cbjIuIElkZW50aWZ5IGFueSBzcGVjaWZpYyBDT05GSUdfIG9wdGlvbnMgcmVxdWlyZWQgdG8gcHJvcGVybHkgdGVzdCB0aGlzIG5ldy9tb2RpZmllZCBmZWF0dXJlLlxuICAgR28gYW5kIGxvb2sgaW50byB0aGUgS2NvbmZpZyBmaWxlcyBhbmQgY2hlY2sgZm9yIGlmZGVmcyBhcm91bmQgdGhlIGNvZGUsIGRvIG5vdCBtYWtlIGFzc3VtcHRpb25zLlxuICAgRG8gbm90IGxpc3QgdG9vIGdlbmVyaWMgY29uZmlncyAod2UgYWxyZWFkeSBoYXZlIHRoZW0gZW5hYmxlZCkuIE9ubHkgbGlzdCB0aG9zZSB0aGF0XG4gICBzcGVjaWZpY2FsbHkgY292ZXIgdGhlIG1vZGlmaWVkIGNvZGUuIExpc3QgdGhlbSBpbiB0aGUgRW5hYmxlQ29uZmlncyBvdXRwdXQgYXJyYXksXG4gICBhbmQgRE8gTk9UIGFkZCBhICdDT05GSUdfJyBwcmVmaXggKGUuZy4sIHJldHVybiBcIk5FVF9JUFY0XCIgaW5zdGVhZCBvZiBcIkNPTkZJR19ORVRfSVBWNFwiKS5cblByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLlxuXG5cblVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuXG5JdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS5cbklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC5cbiIsIlByb21wdCI6IkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOlxuY29tbWl0IGI1MTc0YWQ1ZGEyNDVmNTNmZWI3ODI0YWQ2YzEyZWU1ZmJmOWVhNDNcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgTW9uIEp1biAyOSAxNDozMzo1NSAyMDI2ICswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdm1wcmVzc3VyZS5oIGIvaW5jbHVkZS9saW51eC92bXByZXNzdXJlLmhcbmluZGV4IGZhZWNkNTUyMjQwMTc5Li5lNWU2YjY4ZDBkYzQzMiAxMDA2NDRcbi0tLSBhL2luY2x1ZGUvbGludXgvdm1wcmVzc3VyZS5oXG4rKysgYi9pbmNsdWRlL2xpbnV4L3ZtcHJlc3N1cmUuaFxuQEAgLTEzLDE4ICsxMywzMSBAQFxuIHN0cnVjdCB2bXByZXNzdXJlIHtcbiBcdHVuc2lnbmVkIGxvbmcgc2Nhbm5lZDtcbiBcdHVuc2lnbmVkIGxvbmcgcmVjbGFpbWVkO1xuK1x0LyogVGhlIGxvY2sgaXMgdXNlZCB0byBrZWVwIHRoZSBzY2FubmVkL3JlY2xhaW1lZCBpbiBzeW5jLiAqL1xuK1x0c3BpbmxvY2tfdCBzcl9sb2NrO1xuIFxuKyNpZmRlZiBDT05GSUdfTUVNQ0dfVjFcbitcdC8qXG4rXHQgKiB0cmVlPXRydWUgYWNjdW11bGF0b3JzIGZlZWQgdGhlIHYxIHVzZXJzcGFjZSBldmVudGZkIGludGVyZmFjZVxuK1x0ICogKG1lbW9yeS5wcmVzc3VyZV9sZXZlbCkuIERyYWluZWQgYnkgQHdvcmsuIHYyIGhhcyBubyBlcXVpdmFsZW50XG4rXHQgKiBpbnRlcmZhY2UsIHNvIHRoaXMgc3RhdGUgaXMgb21pdHRlZCBvbiBDT05GSUdfTUVNQ0dfVjE9biBidWlsZHMuXG4rXHQgKi9cbiBcdHVuc2lnbmVkIGxvbmcgdHJlZV9zY2FubmVkO1xuIFx0dW5zaWduZWQgbG9uZyB0cmVlX3JlY2xhaW1lZDtcbi1cdC8qIFRoZSBsb2NrIGlzIHVzZWQgdG8ga2VlcCB0aGUgc2Nhbm5lZC9yZWNsYWltZWQgYWJvdmUgaW4gc3luYy4gKi9cbi1cdHNwaW5sb2NrX3Qgc3JfbG9jaztcbi1cbiBcdC8qIFRoZSBsaXN0IG9mIHZtcHJlc3N1cmVfZXZlbnQgc3RydWN0cy4gKi9cbiBcdHN0cnVjdCBsaXN0X2hlYWQgZXZlbnRzO1xuIFx0LyogSGF2ZSB0byBncmFiIHRoZSBsb2NrIG9uIGV2ZW50cyB0cmF2ZXJzYWwgb3IgbW9kaWZpY2F0aW9ucy4gKi9cbiBcdHN0cnVjdCBtdXRleCBldmVudHNfbG9jaztcbiBcbiBcdHN0cnVjdCB3b3JrX3N0cnVjdCB3b3JrO1xuKyNlbmRpZlxuK307XG4rXG4rZW51bSB2bXByZXNzdXJlX2xldmVscyB7XG4rXHRWTVBSRVNTVVJFX0xPVyA9IDAsXG4rXHRWTVBSRVNTVVJFX01FRElVTSxcbitcdFZNUFJFU1NVUkVfQ1JJVElDQUwsXG4rXHRWTVBSRVNTVVJFX05VTV9MRVZFTFMsXG4gfTtcbiBcbiBzdHJ1Y3QgbWVtX2Nncm91cDtcbkBAIC0zMiwxOCArNDUsNDEgQEAgc3RydWN0IG1lbV9jZ3JvdXA7XG4gI2lmZGVmIENPTkZJR19NRU1DR1xuIHZvaWQgdm1wcmVzc3VyZShnZnBfdCBnZnAsIGludCBvcmRlciwgc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLCBib29sIHRyZWUsXG4gXHRcdHVuc2lnbmVkIGxvbmcgc2Nhbm5lZCwgdW5zaWduZWQgbG9uZyByZWNsYWltZWQpO1xuLWV4dGVybiB2b2lkIHZtcHJlc3N1cmVfcHJpbyhnZnBfdCBnZnAsIHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZywgaW50IHByaW8pO1xuLVxuIGV4dGVybiB2b2lkIHZtcHJlc3N1cmVfaW5pdChzdHJ1Y3Qgdm1wcmVzc3VyZSAqdm1wcik7XG4gZXh0ZXJuIHZvaWQgdm1wcmVzc3VyZV9jbGVhbnVwKHN0cnVjdCB2bXByZXNzdXJlICp2bXByKTtcbiBleHRlcm4gc3RydWN0IHZtcHJlc3N1cmUgKm1lbWNnX3RvX3ZtcHJlc3N1cmUoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnKTtcbiBleHRlcm4gc3RydWN0IG1lbV9jZ3JvdXAgKnZtcHJlc3N1cmVfdG9fbWVtY2coc3RydWN0IHZtcHJlc3N1cmUgKnZtcHIpO1xuK1xuKy8qIFNoYXJlZCB3aXRoIG1tL3ZtcHJlc3N1cmUtdjEuYy4gKi9cbitleHRlcm4gY29uc3QgdW5zaWduZWQgbG9uZyB2bXByZXNzdXJlX3dpbjtcbitleHRlcm4gZW51bSB2bXByZXNzdXJlX2xldmVscyB2bXByZXNzdXJlX2NhbGNfbGV2ZWwodW5zaWduZWQgbG9uZyBzY2FubmVkLFxuK1x0XHRcdFx0XHRcdCAgICB1bnNpZ25lZCBsb25nIHJlY2xhaW1lZCk7XG4rXG4rI2lmZGVmIENPTkZJR19NRU1DR19WMVxuK2V4dGVybiB2b2lkIHZtcHJlc3N1cmVfcHJpbyhnZnBfdCBnZnAsIHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZywgaW50IHByaW8pO1xuIGV4dGVybiBpbnQgdm1wcmVzc3VyZV9yZWdpc3Rlcl9ldmVudChzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csXG4gXHRcdFx0XHQgICAgIHN0cnVjdCBldmVudGZkX2N0eCAqZXZlbnRmZCxcbiBcdFx0XHRcdCAgICAgY29uc3QgY2hhciAqYXJncyk7XG4gZXh0ZXJuIHZvaWQgdm1wcmVzc3VyZV91bnJlZ2lzdGVyX2V2ZW50KHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZyxcbiBcdFx0XHRcdFx0c3RydWN0IGV2ZW50ZmRfY3R4ICpldmVudGZkKTtcbitcbisvKiB2MSBob29rcyBjYWxsZWQgZnJvbSBtbS92bXByZXNzdXJlLmM7IG5vLW9wcyBiZWxvdyB3aGVuICFNRU1DR19WMS4gKi9cbitleHRlcm4gdm9pZCB2bXByZXNzdXJlX3YxX2luaXQoc3RydWN0IHZtcHJlc3N1cmUgKnZtcHIpO1xuK2V4dGVybiB2b2lkIHZtcHJlc3N1cmVfdjFfY2xlYW51cChzdHJ1Y3Qgdm1wcmVzc3VyZSAqdm1wcik7XG4rZXh0ZXJuIHZvaWQgdm1wcmVzc3VyZV92MV9hY2NvdW50X3RyZWUoc3RydWN0IHZtcHJlc3N1cmUgKnZtcHIsXG4rXHRcdFx0XHQgICAgICAgdW5zaWduZWQgbG9uZyBzY2FubmVkLFxuK1x0XHRcdFx0ICAgICAgIHVuc2lnbmVkIGxvbmcgcmVjbGFpbWVkKTtcbiAjZWxzZVxuK3N0YXRpYyBpbmxpbmUgdm9pZCB2bXByZXNzdXJlX3ByaW8oZ2ZwX3QgZ2ZwLCBzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csXG4rXHRcdFx0XHQgICBpbnQgcHJpbykge31cbitzdGF0aWMgaW5saW5lIHZvaWQgdm1wcmVzc3VyZV92MV9pbml0KHN0cnVjdCB2bXByZXNzdXJlICp2bXByKSB7fVxuK3N0YXRpYyBpbmxpbmUgdm9pZCB2bXByZXNzdXJlX3YxX2NsZWFudXAoc3RydWN0IHZtcHJlc3N1cmUgKnZtcHIpIHt9XG4rc3RhdGljIGlubGluZSB2b2lkIHZtcHJlc3N1cmVfdjFfYWNjb3VudF90cmVlKHN0cnVjdCB2bXByZXNzdXJlICp2bXByLFxuK1x0XHRcdFx0XHQgICAgICB1bnNpZ25lZCBsb25nIHNjYW5uZWQsXG4rXHRcdFx0XHRcdCAgICAgIHVuc2lnbmVkIGxvbmcgcmVjbGFpbWVkKSB7fVxuKyNlbmRpZiAvKiBDT05GSUdfTUVNQ0dfVjEgKi9cbitcbisjZWxzZSAvKiAhQ09ORklHX01FTUNHICovXG4gc3RhdGljIGlubGluZSB2b2lkIHZtcHJlc3N1cmUoZ2ZwX3QgZ2ZwLCBpbnQgb3JkZXIsIHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZyxcbiBcdFx0XHQgICAgICBib29sIHRyZWUsIHVuc2lnbmVkIGxvbmcgc2Nhbm5lZCxcbiBcdFx0XHQgICAgICB1bnNpZ25lZCBsb25nIHJlY2xhaW1lZCkge31cbmRpZmYgLS1naXQgYS9tbS9NYWtlZmlsZSBiL21tL01ha2VmaWxlXG5pbmRleCA0ZmM3MTM4NjdiOWJkOC4uZGU5OTE2MzBjOTZhMzIgMTAwNjQ0XG4tLS0gYS9tbS9NYWtlZmlsZVxuKysrIGIvbW0vTWFrZWZpbGVcbkBAIC0xMDEsNyArMTAxLDcgQEAgb2JqLSQoQ09ORklHX0RFVklDRV9NSUdSQVRJT04pICs9IG1pZ3JhdGVfZGV2aWNlLm9cbiBvYmotJChDT05GSUdfVFJBTlNQQVJFTlRfSFVHRVBBR0UpICs9IGh1Z2VfbWVtb3J5Lm8ga2h1Z2VwYWdlZC5vXG4gb2JqLSQoQ09ORklHX1BBR0VfQ09VTlRFUikgKz0gcGFnZV9jb3VudGVyLm9cbiBvYmotJChDT05GSUdfTElWRVVQREFURV9NRU1GRCkgKz0gbWVtZmRfbHVvLm9cbi1vYmotJChDT05GSUdfTUVNQ0dfVjEpICs9IG1lbWNvbnRyb2wtdjEub1xuK29iai0kKENPTkZJR19NRU1DR19WMSkgKz0gbWVtY29udHJvbC12MS5vIHZtcHJlc3N1cmUtdjEub1xuIG9iai0kKENPTkZJR19NRU1DRykgKz0gbWVtY29udHJvbC5vIHZtcHJlc3N1cmUub1xuIGlmZGVmIENPTkZJR19CUEZfU1lTQ0FMTFxuIG9iai0kKENPTkZJR19NRU1DRykgKz0gYnBmX21lbWNvbnRyb2wub1xuZGlmZiAtLWdpdCBhL21tL3ZtcHJlc3N1cmUtdjEuYyBiL21tL3ZtcHJlc3N1cmUtdjEuY1xubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAwLi5mZDgxM2NiYTA1NDQ3MFxuLS0tIC9kZXYvbnVsbFxuKysrIGIvbW0vdm1wcmVzc3VyZS12MS5jXG5AQCAtMCwwICsxLDMwNSBAQFxuKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9ubHlcbisvKlxuKyAqIGNncm91cCB2MSB1c2Vyc3BhY2Ugdm1wcmVzc3VyZSBpbnRlcmZhY2UgKG1lbW9yeS5wcmVzc3VyZV9sZXZlbCAvXG4rICogY2dyb3VwLmV2ZW50X2NvbnRyb2wpLiBTcGxpdCBvdXQgb2YgbW0vdm1wcmVzc3VyZS5jIHNvIHRoYXQgdjItb25seVxuKyAqIGtlcm5lbHMgKENPTkZJR19NRU1DR19WMT1uKSBkcm9wIHRoZSB3aG9sZSBldmVudGZkIGFjY3VtdWxhdG9yLFxuKyAqIGl0cyB3b3JrIGl0ZW0sIGFuZCB0aGUgcGVyLW1lbWNnIHN0YXRlIGl0IHJlcXVpcmVzLlxuKyAqL1xuK1xuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L2Nncm91cC5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvZXZlbnRmZC5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvbGlzdC5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvbG9nMi5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvbWVtY29udHJvbC5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvbXV0ZXguaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L3NsYWIuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L3N0cmluZy5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvc3dhcC5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvdm1wcmVzc3VyZS5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvd29ya3F1ZXVlLmhcdTAwM2VcbitcbisvKlxuKyAqIFdoZW4gdGhlcmUgYXJlIHRvbyBsaXR0bGUgcGFnZXMgbGVmdCB0byBzY2FuLCB2bXByZXNzdXJlKCkgbWF5IG1pc3MgdGhlXG4rICogY3JpdGljYWwgcHJlc3N1cmUgYXMgbnVtYmVyIG9mIHBhZ2VzIHdpbGwgYmUgbGVzcyB0aGFuIFwid2luZG93IHNpemVcIi5cbisgKiBIb3dldmVyLCBpbiB0aGF0IGNhc2UgdGhlIHZtc2NhbiBwcmlvcml0eSB3aWxsIHJhaXNlIGZhc3QgYXMgdGhlXG4rICogcmVjbGFpbWVyIHdpbGwgdHJ5IHRvIHNjYW4gTFJVcyBtb3JlIGRlZXBseS5cbisgKlxuKyAqIFRoZSB2bXNjYW4gbG9naWMgY29uc2lkZXJzIHRoZXNlIHNwZWNpYWwgcHJpb3JpdGllczpcbisgKlxuKyAqIHByaW8gPT0gREVGX1BSSU9SSVRZICgxMik6IHJlY2xhaW1lciBzdGFydHMgd2l0aCB0aGF0IHZhbHVlXG4rICogcHJpbyBcdTAwM2M9IERFRl9QUklPUklUWSAtIDIgOiBrc3dhcGQgYmVjb21lcyBzb21ld2hhdCBvdmVyd2hlbG1lZFxuKyAqIHByaW8gPT0gMCAgICAgICAgICAgICAgICA6IGNsb3NlIHRvIE9PTSwga2VybmVsIHNjYW5zIGV2ZXJ5IHBhZ2UgaW4gYW4gbHJ1XG4rICpcbisgKiBBbnkgdmFsdWUgaW4gdGhpcyByYW5nZSBpcyBhY2NlcHRhYmxlIGZvciB0aGlzIHR1bmFibGUgKGkuZS4gZnJvbSAxMiB0b1xuKyAqIDApLiBDdXJyZW50IHZhbHVlIGZvciB0aGUgdm1wcmVzc3VyZV9sZXZlbF9jcml0aWNhbF9wcmlvIGlzIGNob3NlblxuKyAqIGVtcGlyaWNhbGx5LCBidXQgdGhlIG51bWJlciwgaW4gZXNzZW5jZSwgbWVhbnMgdGhhdCB3ZSBjb25zaWRlclxuKyAqIGNyaXRpY2FsIGxldmVsIHdoZW4gc2Nhbm5pbmcgZGVwdGggaXMgfjEwJSBvZiB0aGUgbHJ1IHNpemUgKHZtc2NhblxuKyAqIHNjYW5zICdscnVfc2l6ZSBcdTAwM2VcdTAwM2UgcHJpbycgcGFnZXMsIHNvIGl0IGlzIGFjdHVhbGx5IDEyLjUlLCBvciBvbmVcbisgKiBlaWdodHMpLlxuKyAqL1xuK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgdm1wcmVzc3VyZV9sZXZlbF9jcml0aWNhbF9wcmlvID0gaWxvZzIoMTAwIC8gMTApO1xuK1xuK2VudW0gdm1wcmVzc3VyZV9tb2RlcyB7XG4rXHRWTVBSRVNTVVJFX05PX1BBU1NUSFJPVUdIID0gMCxcbitcdFZNUFJFU1NVUkVfSElFUkFSQ0hZLFxuK1x0Vk1QUkVTU1VSRV9MT0NBTCxcbitcdFZNUFJFU1NVUkVfTlVNX01PREVTLFxuK307XG4rXG4rc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB2bXByZXNzdXJlX3N0cl9sZXZlbHNbXSA9IHtcbitcdFtWTVBSRVNTVVJFX0xPV10gPSBcImxvd1wiLFxuK1x0W1ZNUFJFU1NVUkVfTUVESVVNXSA9IFwibWVkaXVtXCIsXG4rXHRbVk1QUkVTU1VSRV9DUklUSUNBTF0gPSBcImNyaXRpY2FsXCIsXG4rfTtcbitcbitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHZtcHJlc3N1cmVfc3RyX21vZGVzW10gPSB7XG4rXHRbVk1QUkVTU1VSRV9OT19QQVNTVEhST1VHSF0gPSBcImRlZmF1bHRcIixcbitcdFtWTVBSRVNTVVJFX0hJRVJBUkNIWV0gPSBcImhpZXJhcmNoeVwiLFxuK1x0W1ZNUFJFU1NVUkVfTE9DQUxdID0gXCJsb2NhbFwiLFxuK307XG4rXG4rc3RydWN0IHZtcHJlc3N1cmVfZXZlbnQge1xuK1x0c3RydWN0IGV2ZW50ZmRfY3R4ICplZmQ7XG4rXHRlbnVtIHZtcHJlc3N1cmVfbGV2ZWxzIGxldmVsO1xuK1x0ZW51bSB2bXByZXNzdXJlX21vZGVzIG1vZGU7XG4rXHRzdHJ1Y3QgbGlzdF9oZWFkIG5vZGU7XG4rfTtcbitcbitzdGF0aWMgc3RydWN0IHZtcHJlc3N1cmUgKndvcmtfdG9fdm1wcmVzc3VyZShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspXG4re1xuK1x0cmV0dXJuIGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3Qgdm1wcmVzc3VyZSwgd29yayk7XG4rfVxuK1xuK3N0YXRpYyBzdHJ1Y3Qgdm1wcmVzc3VyZSAqdm1wcmVzc3VyZV9wYXJlbnQoc3RydWN0IHZtcHJlc3N1cmUgKnZtcHIpXG4re1xuK1x0c3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnID0gdm1wcmVzc3VyZV90b19tZW1jZyh2bXByKTtcbitcbitcdG1lbWNnID0gcGFyZW50X21lbV9jZ3JvdXAobWVtY2cpO1xuK1x0aWYgKCFtZW1jZylcbitcdFx0cmV0dXJuIE5VTEw7XG4rXHRyZXR1cm4gbWVtY2dfdG9fdm1wcmVzc3VyZShtZW1jZyk7XG4rfVxuK1xuK3N0YXRpYyBib29sIHZtcHJlc3N1cmVfZXZlbnQoc3RydWN0IHZtcHJlc3N1cmUgKnZtcHIsXG4rXHRcdFx0ICAgICBjb25zdCBlbnVtIHZtcHJlc3N1cmVfbGV2ZWxzIGxldmVsLFxuK1x0XHRcdCAgICAgYm9vbCBhbmNlc3RvciwgYm9vbCBzaWduYWxsZWQpXG4re1xuK1x0c3RydWN0IHZtcHJlc3N1cmVfZXZlbnQgKmV2O1xuK1x0Ym9vbCByZXQgPSBmYWxzZTtcbitcbitcdG11dGV4X2xvY2soXHUwMDI2dm1wci1cdTAwM2VldmVudHNfbG9jayk7XG4rXHRsaXN0X2Zvcl9lYWNoX2VudHJ5KGV2LCBcdTAwMjZ2bXByLVx1MDAzZWV2ZW50cywgbm9kZSkge1xuK1x0XHRpZiAoYW5jZXN0b3IgXHUwMDI2XHUwMDI2IGV2LVx1MDAzZW1vZGUgPT0gVk1QUkVTU1VSRV9MT0NBTClcbitcdFx0XHRjb250aW51ZTtcbitcdFx0aWYgKHNpZ25hbGxlZCBcdTAwMjZcdTAwMjYgZXYtXHUwMDNlbW9kZSA9PSBWTVBSRVNTVVJFX05PX1BBU1NUSFJPVUdIKVxuK1x0XHRcdGNvbnRpbnVlO1xuK1x0XHRpZiAobGV2ZWwgXHUwMDNjIGV2LVx1MDAzZWxldmVsKVxuK1x0XHRcdGNvbnRpbnVlO1xuK1x0XHRldmVudGZkX3NpZ25hbChldi1cdTAwM2VlZmQpO1xuK1x0XHRyZXQgPSB0cnVlO1xuK1x0fVxuK1x0bXV0ZXhfdW5sb2NrKFx1MDAyNnZtcHItXHUwMDNlZXZlbnRzX2xvY2spO1xuK1xuK1x0cmV0dXJuIHJldDtcbit9XG4rXG4rc3RhdGljIHZvaWQgdm1wcmVzc3VyZV93b3JrX2ZuKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaylcbit7XG4rXHRzdHJ1Y3Qgdm1wcmVzc3VyZSAqdm1wciA9IHdvcmtfdG9fdm1wcmVzc3VyZSh3b3JrKTtcbitcdHVuc2lnbmVkIGxvbmcgc2Nhbm5lZDtcbitcdHVuc2lnbmVkIGxvbmcgcmVjbGFpbWVkO1xuK1x0ZW51bSB2bXByZXNzdXJlX2xldmVscyBsZXZlbDtcbitcdGJvb2wgYW5jZXN0b3IgPSBmYWxzZTtcbitcdGJvb2wgc2lnbmFsbGVkID0gZmFsc2U7XG4rXG4rXHRzcGluX2xvY2soXHUwMDI2dm1wci1cdTAwM2Vzcl9sb2NrKTtcbitcdC8qXG4rXHQgKiBTZXZlcmFsIGNvbnRleHRzIG1pZ2h0IGJlIGNhbGxpbmcgdm1wcmVzc3VyZSgpLCBzbyBpdCBpc1xuK1x0ICogcG9zc2libGUgdGhhdCB0aGUgd29yayB3YXMgcmVzY2hlZHVsZWQgYWdhaW4gYmVmb3JlIHRoZSBvbGRcbitcdCAqIHdvcmsgY29udGV4dCBjbGVhcmVkIHRoZSBjb3VudGVycy4gSW4gdGhhdCBjYXNlIHdlIHdpbGwgcnVuXG4rXHQgKiBqdXN0IGFmdGVyIHRoZSBvbGQgd29yayByZXR1cm5zLCBidXQgdGhlbiBzY2FubmVkIG1pZ2h0IGJlIHplcm9cbitcdCAqIGhlcmUuIE5vIG5lZWQgZm9yIGFueSBsb2NrcyBoZXJlIHNpbmNlIHdlIGRvbid0IGNhcmUgaWZcbitcdCAqIHZtcHItXHUwMDNlcmVjbGFpbWVkIGlzIGluIHN5bmMuXG4rXHQgKi9cbitcdHNjYW5uZWQgPSB2bXByLVx1MDAzZXRyZWVfc2Nhbm5lZDtcbitcdGlmICghc2Nhbm5lZCkge1xuK1x0XHRzcGluX3VubG9jayhcdTAwMjZ2bXByLVx1MDAzZXNyX2xvY2spO1xuK1x0XHRyZXR1cm47XG4rXHR9XG4rXG4rXHRyZWNsYWltZWQgPSB2bXByLVx1MDAzZXRyZWVfcmVjbGFpbWVkO1xuK1x0dm1wci1cdTAwM2V0cmVlX3NjYW5uZWQgPSAwO1xuK1x0dm1wci1cdTAwM2V0cmVlX3JlY2xhaW1lZCA9IDA7XG4rXHRzcGluX3VubG9jayhcdTAwMjZ2bXByLVx1MDAzZXNyX2xvY2spO1xuK1xuK1x0bGV2ZWwgPSB2bXByZXNzdXJlX2NhbGNfbGV2ZWwoc2Nhbm5lZCwgcmVjbGFpbWVkKTtcbitcbitcdGRvIHtcbitcdFx0aWYgKHZtcHJlc3N1cmVfZXZlbnQodm1wciwgbGV2ZWwsIGFuY2VzdG9yLCBzaWduYWxsZWQpKVxuK1x0XHRcdHNpZ25hbGxlZCA9IHRydWU7XG4rXHRcdGFuY2VzdG9yID0gdHJ1ZTtcbitcdH0gd2hpbGUgKCh2bXByID0gdm1wcmVzc3VyZV9wYXJlbnQodm1wcikpKTtcbit9XG4rXG4rLypcbisgKiBUcmVlLW1vZGUgYWNjdW11bGF0b3I6IGFjY3VtdWxhdGUgcGVyLW1lbWNnIHNjYW5uZWQvcmVjbGFpbWVkIGFuZFxuKyAqIHNjaGVkdWxlIHRoZSB3b3JrIHRoYXQgd2Fsa3MgdGhlIHBhcmVudCBjaGFpbiBhbmQgc2lnbmFscyByZWdpc3RlcmVkXG4rICogZXZlbnRmZCBsaXN0ZW5lcnMgb25jZSB3ZSBjcm9zcyB0aGUgd2luZG93IHRocmVzaG9sZC5cbisgKi9cbit2b2lkIHZtcHJlc3N1cmVfdjFfYWNjb3VudF90cmVlKHN0cnVjdCB2bXByZXNzdXJlICp2bXByLFxuK1x0XHRcdFx0dW5zaWduZWQgbG9uZyBzY2FubmVkLFxuK1x0XHRcdFx0dW5zaWduZWQgbG9uZyByZWNsYWltZWQpXG4re1xuK1x0c3Bpbl9sb2NrKFx1MDAyNnZtcHItXHUwMDNlc3JfbG9jayk7XG4rXHRzY2FubmVkID0gdm1wci1cdTAwM2V0cmVlX3NjYW5uZWQgKz0gc2Nhbm5lZDtcbitcdHZtcHItXHUwMDNldHJlZV9yZWNsYWltZWQgKz0gcmVjbGFpbWVkO1xuK1x0c3Bpbl91bmxvY2soXHUwMDI2dm1wci1cdTAwM2Vzcl9sb2NrKTtcbitcbitcdGlmIChzY2FubmVkIFx1MDAzYyB2bXByZXNzdXJlX3dpbilcbitcdFx0cmV0dXJuO1xuK1x0c2NoZWR1bGVfd29yayhcdTAwMjZ2bXByLVx1MDAzZXdvcmspO1xuK31cbitcbit2b2lkIHZtcHJlc3N1cmVfdjFfaW5pdChzdHJ1Y3Qgdm1wcmVzc3VyZSAqdm1wcilcbit7XG4rXHRtdXRleF9pbml0KFx1MDAyNnZtcHItXHUwMDNlZXZlbnRzX2xvY2spO1xuK1x0SU5JVF9MSVNUX0hFQUQoXHUwMDI2dm1wci1cdTAwM2VldmVudHMpO1xuK1x0SU5JVF9XT1JLKFx1MDAyNnZtcHItXHUwMDNld29yaywgdm1wcmVzc3VyZV93b3JrX2ZuKTtcbit9XG4rXG4rdm9pZCB2bXByZXNzdXJlX3YxX2NsZWFudXAoc3RydWN0IHZtcHJlc3N1cmUgKnZtcHIpXG4re1xuK1x0LypcbitcdCAqIE1ha2Ugc3VyZSB0aGVyZSBpcyBubyBwZW5kaW5nIHdvcmsgYmVmb3JlIGV2ZW50ZmQgaW5mcmFzdHJ1Y3R1cmVcbitcdCAqIGdvZXMgYXdheS5cbitcdCAqL1xuK1x0Zmx1c2hfd29yayhcdTAwMjZ2bXByLVx1MDAzZXdvcmspO1xuK31cbitcbisvKipcbisgKiB2bXByZXNzdXJlX3ByaW8oKSAtIEFjY291bnQgbWVtb3J5IHByZXNzdXJlIHRocm91Z2ggcmVjbGFpbWVyIHByaW9yaXR5IGxldmVsXG4rICogQGdmcDpcdHJlY2xhaW1lcidzIGdmcCBtYXNrXG4rICogQG1lbWNnOlx0Y2dyb3VwIG1lbW9yeSBjb250cm9sbGVyIGhhbmRsZVxuKyAqIEBwcmlvOlx0cmVjbGFpbWVyJ3MgcHJpb3JpdHlcbisgKlxuKyAqIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBmcm9tIHRoZSByZWNsYWltIHBhdGggZXZlcnkgdGltZSB3aGVuXG4rICogdGhlIHZtc2NhbidzIHJlY2xhaW1pbmcgcHJpb3JpdHkgKHNjYW5uaW5nIGRlcHRoKSBjaGFuZ2VzLlxuKyAqXG4rICogVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCByZXR1cm4gYW55IHZhbHVlLlxuKyAqL1xuK3ZvaWQgdm1wcmVzc3VyZV9wcmlvKGdmcF90IGdmcCwgc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLCBpbnQgcHJpbylcbit7XG4rXHQvKlxuK1x0ICogV2Ugb25seSB1c2UgcHJpbyBmb3IgYWNjb3VudGluZyBjcml0aWNhbCBsZXZlbC4gRm9yIG1vcmUgaW5mb1xuK1x0ICogc2VlIGNvbW1lbnQgZm9yIHZtcHJlc3N1cmVfbGV2ZWxfY3JpdGljYWxfcHJpbyB2YXJpYWJsZSBhYm92ZS5cbitcdCAqL1xuK1x0aWYgKHByaW8gXHUwMDNlIHZtcHJlc3N1cmVfbGV2ZWxfY3JpdGljYWxfcHJpbylcbitcdFx0cmV0dXJuO1xuK1xuK1x0LypcbitcdCAqIE9LLCB0aGUgcHJpbyBpcyBiZWxvdyB0aGUgdGhyZXNob2xkLCB1cGRhdGluZyB2bXByZXNzdXJlXG4rXHQgKiBpbmZvcm1hdGlvbiBiZWZvcmUgc2hyaW5rZXIgZGl2ZXMgaW50byBsb25nIHNocmlua2luZyBvZiBsb25nXG4rXHQgKiByYW5nZSB2bXNjYW4uIFBhc3Npbmcgc2Nhbm5lZCA9IHZtcHJlc3N1cmVfd2luLCByZWNsYWltZWQgPSAwXG4rXHQgKiB0byB0aGUgdm1wcmVzc3VyZSgpIGJhc2ljYWxseSBtZWFucyB0aGF0IHdlIHNpZ25hbCAnY3JpdGljYWwnXG4rXHQgKiBsZXZlbC5cbitcdCAqL1xuK1x0dm1wcmVzc3VyZShnZnAsIDAsIG1lbWNnLCB0cnVlLCB2bXByZXNzdXJlX3dpbiwgMCk7XG4rfVxuK1xuKyNkZWZpbmUgTUFYX1ZNUFJFU1NVUkVfQVJHU19MRU5cdChzdHJsZW4oXCJjcml0aWNhbFwiKSArIHN0cmxlbihcImhpZXJhcmNoeVwiKSArIDIpXG4rXG4rLyoqXG4rICogdm1wcmVzc3VyZV9yZWdpc3Rlcl9ldmVudCgpIC0gQmluZCB2bXByZXNzdXJlIG5vdGlmaWNhdGlvbnMgdG8gYW4gZXZlbnRmZFxuKyAqIEBtZW1jZzpcdG1lbWNnIHRoYXQgaXMgaW50ZXJlc3RlZCBpbiB2bXByZXNzdXJlIG5vdGlmaWNhdGlvbnNcbisgKiBAZXZlbnRmZDpcdGV2ZW50ZmQgY29udGV4dCB0byBsaW5rIG5vdGlmaWNhdGlvbnMgd2l0aFxuKyAqIEBhcmdzOlx0ZXZlbnQgYXJndW1lbnRzIChwcmVzc3VyZSBsZXZlbCB0aHJlc2hvbGQsIG9wdGlvbmFsIG1vZGUpXG4rICpcbisgKiBUaGlzIGZ1bmN0aW9uIGFzc29jaWF0ZXMgZXZlbnRmZCBjb250ZXh0IHdpdGggdGhlIHZtcHJlc3N1cmVcbisgKiBpbmZyYXN0cnVjdHVyZSwgc28gdGhhdCB0aGUgbm90aWZpY2F0aW9ucyB3aWxsIGJlIGRlbGl2ZXJlZCB0byB0aGVcbisgKiBAZXZlbnRmZC4gVGhlIEBhcmdzIHBhcmFtZXRlciBpcyBhIGNvbW1hLWRlbGltaXRlZCBzdHJpbmcgdGhhdCBkZW5vdGVzIGFcbisgKiBwcmVzc3VyZSBsZXZlbCB0aHJlc2hvbGQgKG9uZSBvZiB2bXByZXNzdXJlX3N0cl9sZXZlbHMsIGkuZS4gXCJsb3dcIiwgXCJtZWRpdW1cIixcbisgKiBvciBcImNyaXRpY2FsXCIpIGFuZCBhbiBvcHRpb25hbCBtb2RlIChvbmUgb2Ygdm1wcmVzc3VyZV9zdHJfbW9kZXMsIGkuZS5cbisgKiBcImhpZXJhcmNoeVwiIG9yIFwibG9jYWxcIikuXG4rICpcbisgKiBUbyBiZSB1c2VkIGFzIG1lbWNnIGV2ZW50IG1ldGhvZC5cbisgKlxuKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCAtRU5PTUVNIG9uIG1lbW9yeSBmYWlsdXJlIG9yIC1FSU5WQUwgaWYgQGFyZ3MgY291bGRcbisgKiBub3QgYmUgcGFyc2VkLlxuKyAqL1xuK2ludCB2bXByZXNzdXJlX3JlZ2lzdGVyX2V2ZW50KHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZyxcbitcdFx0XHQgICAgICBzdHJ1Y3QgZXZlbnRmZF9jdHggKmV2ZW50ZmQsIGNvbnN0IGNoYXIgKmFyZ3MpXG4re1xuK1x0c3RydWN0IHZtcHJlc3N1cmUgKnZtcHIgPSBtZW1jZ190b192bXByZXNzdXJlKG1lbWNnKTtcbitcdHN0cnVjdCB2bXByZXNzdXJlX2V2ZW50ICpldjtcbitcdGVudW0gdm1wcmVzc3VyZV9tb2RlcyBtb2RlID0gVk1QUkVTU1VSRV9OT19QQVNTVEhST1VHSDtcbitcdGVudW0gdm1wcmVzc3VyZV9sZXZlbHMgbGV2ZWw7XG4rXHRjaGFyICpzcGVjLCAqc3BlY19vcmlnO1xuK1x0Y2hhciAqdG9rZW47XG4rXHRpbnQgcmV0ID0gMDtcbitcbitcdHNwZWNfb3JpZyA9IHNwZWMgPSBrc3RybmR1cChhcmdzLCBNQVhfVk1QUkVTU1VSRV9BUkdTX0xFTiwgR0ZQX0tFUk5FTCk7XG4rXHRpZiAoIXNwZWMpXG4rXHRcdHJldHVybiAtRU5PTUVNO1xuK1xuK1x0LyogRmluZCByZXF1aXJlZCBsZXZlbCAqL1xuK1x0dG9rZW4gPSBzdHJzZXAoXHUwMDI2c3BlYywgXCIsXCIpO1xuK1x0cmV0ID0gbWF0Y2hfc3RyaW5nKHZtcHJlc3N1cmVfc3RyX2xldmVscywgVk1QUkVTU1VSRV9OVU1fTEVWRUxTLCB0b2tlbik7XG4rXHRpZiAocmV0IFx1MDAzYyAwKVxuK1x0XHRnb3RvIG91dDtcbitcdGxldmVsID0gcmV0O1xuK1xuK1x0LyogRmluZCBvcHRpb25hbCBtb2RlICovXG4rXHR0b2tlbiA9IHN0cnNlcChcdTAwMjZzcGVjLCBcIixcIik7XG4rXHRpZiAodG9rZW4pIHtcbitcdFx0cmV0ID0gbWF0Y2hfc3RyaW5nKHZtcHJlc3N1cmVfc3RyX21vZGVzLCBWTVBSRVNTVVJFX05VTV9NT0RFUywgdG9rZW4pO1xuK1x0XHRpZiAocmV0IFx1MDAzYyAwKVxuK1x0XHRcdGdvdG8gb3V0O1xuK1x0XHRtb2RlID0gcmV0O1xuK1x0fVxuK1xuK1x0ZXYgPSBremFsbG9jX29iaigqZXYpO1xuK1x0aWYgKCFldikge1xuK1x0XHRyZXQgPSAtRU5PTUVNO1xuK1x0XHRnb3RvIG91dDtcbitcdH1cbitcbitcdGV2LVx1MDAzZWVmZCA9IGV2ZW50ZmQ7XG4rXHRldi1cdTAwM2VsZXZlbCA9IGxldmVsO1xuK1x0ZXYtXHUwMDNlbW9kZSA9IG1vZGU7XG4rXG4rXHRtdXRleF9sb2NrKFx1MDAyNnZtcHItXHUwMDNlZXZlbnRzX2xvY2spO1xuK1x0bGlzdF9hZGQoXHUwMDI2ZXYtXHUwMDNlbm9kZSwgXHUwMDI2dm1wci1cdTAwM2VldmVudHMpO1xuK1x0bXV0ZXhfdW5sb2NrKFx1MDAyNnZtcHItXHUwMDNlZXZlbnRzX2xvY2spO1xuK1x0cmV0ID0gMDtcbitvdXQ6XG4rXHRrZnJlZShzcGVjX29yaWcpO1xuK1x0cmV0dXJuIHJldDtcbit9XG4rXG4rLyoqXG4rICogdm1wcmVzc3VyZV91bnJlZ2lzdGVyX2V2ZW50KCkgLSBVbmJpbmQgZXZlbnRmZCBmcm9tIHZtcHJlc3N1cmVcbisgKiBAbWVtY2c6XHRtZW1jZyBoYW5kbGVcbisgKiBAZXZlbnRmZDpcdGV2ZW50ZmQgY29udGV4dCB0aGF0IHdhcyB1c2VkIHRvIGxpbmsgdm1wcmVzc3VyZSB3aXRoIHRoZSBAY2dcbisgKlxuKyAqIFRoaXMgZnVuY3Rpb24gZG9lcyBpbnRlcm5hbCBtYW5pcHVsYXRpb25zIHRvIGRldGFjaCB0aGUgQGV2ZW50ZmQgZnJvbVxuKyAqIHRoZSB2bXByZXNzdXJlIG5vdGlmaWNhdGlvbnMsIGFuZCB0aGVuIGZyZWVzIGludGVybmFsIHJlc291cmNlc1xuKyAqIGFzc29jaWF0ZWQgd2l0aCB0aGUgQGV2ZW50ZmQgKGJ1dCB0aGUgQGV2ZW50ZmQgaXRzZWxmIGlzIG5vdCBmcmVlZCkuXG4rICpcbisgKiBUbyBiZSB1c2VkIGFzIG1lbWNnIGV2ZW50IG1ldGhvZC5cbisgKi9cbit2b2lkIHZtcHJlc3N1cmVfdW5yZWdpc3Rlcl9ldmVudChzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csXG4rXHRcdFx0XHQgc3RydWN0IGV2ZW50ZmRfY3R4ICpldmVudGZkKVxuK3tcbitcdHN0cnVjdCB2bXByZXNzdXJlICp2bXByID0gbWVtY2dfdG9fdm1wcmVzc3VyZShtZW1jZyk7XG4rXHRzdHJ1Y3Qgdm1wcmVzc3VyZV9ldmVudCAqZXY7XG4rXG4rXHRtdXRleF9sb2NrKFx1MDAyNnZtcHItXHUwMDNlZXZlbnRzX2xvY2spO1xuK1x0bGlzdF9mb3JfZWFjaF9lbnRyeShldiwgXHUwMDI2dm1wci1cdTAwM2VldmVudHMsIG5vZGUpIHtcbitcdFx0aWYgKGV2LVx1MDAzZWVmZCAhPSBldmVudGZkKVxuK1x0XHRcdGNvbnRpbnVlO1xuK1x0XHRsaXN0X2RlbChcdTAwMjZldi1cdTAwM2Vub2RlKTtcbitcdFx0a2ZyZWUoZXYpO1xuK1x0XHRicmVhaztcbitcdH1cbitcdG11dGV4X3VubG9jayhcdTAwMjZ2bXByLVx1MDAzZWV2ZW50c19sb2NrKTtcbit9XG5kaWZmIC0tZ2l0IGEvbW0vdm1wcmVzc3VyZS5jIGIvbW0vdm1wcmVzc3VyZS5jXG5pbmRleCBmMDUzNTU0ZTU4MjY0Mi4uYmNmYTRiZDhmZmM1MjkgMTAwNjQ0XG4tLS0gYS9tbS92bXByZXNzdXJlLmNcbisrKyBiL21tL3ZtcHJlc3N1cmUuY1xuQEAgLTcsMTYgKzcsMTUgQEBcbiAgKlxuICAqIEJhc2VkIG9uIGlkZWFzIGZyb20gQW5kcmV3IE1vcnRvbiwgRGF2aWQgUmllbnRqZXMsIEtPU0FLSSBNb3RvaGlybyxcbiAgKiBMZW9uaWQgTW9pc2VpY2h1aywgTWVsIEdvcm1hbiwgTWluY2hhbiBLaW0gYW5kIFBla2thIEVuYmVyZy5cbisgKlxuKyAqIFRyZWUtbW9kZSAoY2dyb3VwIHYxIHVzZXJzcGFjZSBldmVudGZkKSBib29ra2VlcGluZyBsaXZlcyBpblxuKyAqIG1tL3ZtcHJlc3N1cmUtdjEuYzsgdGhpcyBmaWxlIGhvbGRzIHRoZSBzaGFyZWQgY29kZSBhbmQgdGhlIGluLWtlcm5lbFxuKyAqICh0cmVlPWZhbHNlKSBzb2NrZXQtcHJlc3N1cmUgcGF0aCB0aGF0IHJ1bnMgb24gY2dyb3VwIHYyLlxuICAqL1xuIFxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L2Nncm91cC5oXHUwMDNlXG4tI2luY2x1ZGUgXHUwMDNjbGludXgvZnMuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L2xvZzIuaFx1MDAzZVxuLSNpbmNsdWRlIFx1MDAzY2xpbnV4L3NjaGVkLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9tbS5oXHUwMDNlXG4tI2luY2x1ZGUgXHUwMDNjbGludXgvdm1zdGF0LmhcdTAwM2Vcbi0jaW5jbHVkZSBcdTAwM2NsaW51eC9ldmVudGZkLmhcdTAwM2Vcbi0jaW5jbHVkZSBcdTAwM2NsaW51eC9zbGFiLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9zd2FwLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9wcmludGsuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L3ZtcHJlc3N1cmUuaFx1MDAzZVxuQEAgLTM1LDcgKzM0LDcgQEBcbiAgKiBUT0RPOiBNYWtlIHRoZSB3aW5kb3cgc2l6ZSBkZXBlbmQgb24gbWFjaGluZSBzaXplLCBhcyB3ZSBkbyBmb3Igdm1zdGF0XG4gICogdGhyZXNob2xkcy4gQ3VycmVudGx5IHdlIHNldCBpdCB0byA1MTIgcGFnZXMgKDJNQiBmb3IgNEtCIHBhZ2VzKS5cbiAgKi9cbi1zdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyB2bXByZXNzdXJlX3dpbiA9IFNXQVBfQ0xVU1RFUl9NQVggKiAxNjtcbitjb25zdCB1bnNpZ25lZCBsb25nIHZtcHJlc3N1cmVfd2luID0gU1dBUF9DTFVTVEVSX01BWCAqIDE2O1xuIFxuIC8qXG4gICogVGhlc2UgdGhyZXNob2xkcyBhcmUgdXNlZCB3aGVuIHdlIGFjY291bnQgbWVtb3J5IHByZXNzdXJlIHRocm91Z2hcbkBAIC00Niw2OCArNDUsNiBAQCBzdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyB2bXByZXNzdXJlX3dpbiA9IFNXQVBfQ0xVU1RFUl9NQVggKiAxNjtcbiBzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHZtcHJlc3N1cmVfbGV2ZWxfbWVkID0gNjA7XG4gc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCB2bXByZXNzdXJlX2xldmVsX2NyaXRpY2FsID0gOTU7XG4gXG4tLypcbi0gKiBXaGVuIHRoZXJlIGFyZSB0b28gbGl0dGxlIHBhZ2VzIGxlZnQgdG8gc2Nhbiwgdm1wcmVzc3VyZSgpIG1heSBtaXNzIHRoZVxuLSAqIGNyaXRpY2FsIHByZXNzdXJlIGFzIG51bWJlciBvZiBwYWdlcyB3aWxsIGJlIGxlc3MgdGhhbiBcIndpbmRvdyBzaXplXCIuXG4tICogSG93ZXZlciwgaW4gdGhhdCBjYXNlIHRoZSB2bXNjYW4gcHJpb3JpdHkgd2lsbCByYWlzZSBmYXN0IGFzIHRoZVxuLSAqIHJlY2xhaW1lciB3aWxsIHRyeSB0byBzY2FuIExSVXMgbW9yZSBkZWVwbHkuXG4tICpcbi0gKiBUaGUgdm1zY2FuIGxvZ2ljIGNvbnNpZGVycyB0aGVzZSBzcGVjaWFsIHByaW9yaXRpZXM6XG4tICpcbi0gKiBwcmlvID09IERFRl9QUklPUklUWSAoMTIpOiByZWNsYWltZXIgc3RhcnRzIHdpdGggdGhhdCB2YWx1ZVxuLSAqIHByaW8gXHUwMDNjPSBERUZfUFJJT1JJVFkgLSAyIDoga3N3YXBkIGJlY29tZXMgc29tZXdoYXQgb3ZlcndoZWxtZWRcbi0gKiBwcmlvID09IDAgICAgICAgICAgICAgICAgOiBjbG9zZSB0byBPT00sIGtlcm5lbCBzY2FucyBldmVyeSBwYWdlIGluIGFuIGxydVxuLSAqXG4tICogQW55IHZhbHVlIGluIHRoaXMgcmFuZ2UgaXMgYWNjZXB0YWJsZSBmb3IgdGhpcyB0dW5hYmxlIChpLmUuIGZyb20gMTIgdG9cbi0gKiAwKS4gQ3VycmVudCB2YWx1ZSBmb3IgdGhlIHZtcHJlc3N1cmVfbGV2ZWxfY3JpdGljYWxfcHJpbyBpcyBjaG9zZW5cbi0gKiBlbXBpcmljYWxseSwgYnV0IHRoZSBudW1iZXIsIGluIGVzc2VuY2UsIG1lYW5zIHRoYXQgd2UgY29uc2lkZXJcbi0gKiBjcml0aWNhbCBsZXZlbCB3aGVuIHNjYW5uaW5nIGRlcHRoIGlzIH4xMCUgb2YgdGhlIGxydSBzaXplICh2bXNjYW5cbi0gKiBzY2FucyAnbHJ1X3NpemUgXHUwMDNlXHUwMDNlIHByaW8nIHBhZ2VzLCBzbyBpdCBpcyBhY3R1YWxseSAxMi41JSwgb3Igb25lXG4tICogZWlnaHRzKS5cbi0gKi9cbi1zdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHZtcHJlc3N1cmVfbGV2ZWxfY3JpdGljYWxfcHJpbyA9IGlsb2cyKDEwMCAvIDEwKTtcbi1cbi1zdGF0aWMgc3RydWN0IHZtcHJlc3N1cmUgKndvcmtfdG9fdm1wcmVzc3VyZShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspXG4te1xuLVx0cmV0dXJuIGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3Qgdm1wcmVzc3VyZSwgd29yayk7XG4tfVxuLVxuLXN0YXRpYyBzdHJ1Y3Qgdm1wcmVzc3VyZSAqdm1wcmVzc3VyZV9wYXJlbnQoc3RydWN0IHZtcHJlc3N1cmUgKnZtcHIpXG4te1xuLVx0c3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnID0gdm1wcmVzc3VyZV90b19tZW1jZyh2bXByKTtcbi1cbi1cdG1lbWNnID0gcGFyZW50X21lbV9jZ3JvdXAobWVtY2cpO1xuLVx0aWYgKCFtZW1jZylcbi1cdFx0cmV0dXJuIE5VTEw7XG4tXHRyZXR1cm4gbWVtY2dfdG9fdm1wcmVzc3VyZShtZW1jZyk7XG4tfVxuLVxuLWVudW0gdm1wcmVzc3VyZV9sZXZlbHMge1xuLVx0Vk1QUkVTU1VSRV9MT1cgPSAwLFxuLVx0Vk1QUkVTU1VSRV9NRURJVU0sXG4tXHRWTVBSRVNTVVJFX0NSSVRJQ0FMLFxuLVx0Vk1QUkVTU1VSRV9OVU1fTEVWRUxTLFxuLX07XG4tXG4tZW51bSB2bXByZXNzdXJlX21vZGVzIHtcbi1cdFZNUFJFU1NVUkVfTk9fUEFTU1RIUk9VR0ggPSAwLFxuLVx0Vk1QUkVTU1VSRV9ISUVSQVJDSFksXG4tXHRWTVBSRVNTVVJFX0xPQ0FMLFxuLVx0Vk1QUkVTU1VSRV9OVU1fTU9ERVMsXG4tfTtcbi1cbi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHZtcHJlc3N1cmVfc3RyX2xldmVsc1tdID0ge1xuLVx0W1ZNUFJFU1NVUkVfTE9XXSA9IFwibG93XCIsXG4tXHRbVk1QUkVTU1VSRV9NRURJVU1dID0gXCJtZWRpdW1cIixcbi1cdFtWTVBSRVNTVVJFX0NSSVRJQ0FMXSA9IFwiY3JpdGljYWxcIixcbi19O1xuLVxuLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgdm1wcmVzc3VyZV9zdHJfbW9kZXNbXSA9IHtcbi1cdFtWTVBSRVNTVVJFX05PX1BBU1NUSFJPVUdIXSA9IFwiZGVmYXVsdFwiLFxuLVx0W1ZNUFJFU1NVUkVfSElFUkFSQ0hZXSA9IFwiaGllcmFyY2h5XCIsXG4tXHRbVk1QUkVTU1VSRV9MT0NBTF0gPSBcImxvY2FsXCIsXG4tfTtcbi1cbiBzdGF0aWMgZW51bSB2bXByZXNzdXJlX2xldmVscyB2bXByZXNzdXJlX2xldmVsKHVuc2lnbmVkIGxvbmcgcHJlc3N1cmUpXG4ge1xuIFx0aWYgKHByZXNzdXJlIFx1MDAzZT0gdm1wcmVzc3VyZV9sZXZlbF9jcml0aWNhbClcbkBAIC0xMTcsOCArNTQsOCBAQCBzdGF0aWMgZW51bSB2bXByZXNzdXJlX2xldmVscyB2bXByZXNzdXJlX2xldmVsKHVuc2lnbmVkIGxvbmcgcHJlc3N1cmUpXG4gXHRyZXR1cm4gVk1QUkVTU1VSRV9MT1c7XG4gfVxuIFxuLXN0YXRpYyBlbnVtIHZtcHJlc3N1cmVfbGV2ZWxzIHZtcHJlc3N1cmVfY2FsY19sZXZlbCh1bnNpZ25lZCBsb25nIHNjYW5uZWQsXG4tXHRcdFx0XHRcdFx0ICAgIHVuc2lnbmVkIGxvbmcgcmVjbGFpbWVkKVxuK2VudW0gdm1wcmVzc3VyZV9sZXZlbHMgdm1wcmVzc3VyZV9jYWxjX2xldmVsKHVuc2lnbmVkIGxvbmcgc2Nhbm5lZCxcbitcdFx0XHRcdFx0ICAgICB1bnNpZ25lZCBsb25nIHJlY2xhaW1lZClcbiB7XG4gXHR1bnNpZ25lZCBsb25nIHNjYWxlID0gc2Nhbm5lZCArIHJlY2xhaW1lZDtcbiBcdHVuc2lnbmVkIGxvbmcgcHJlc3N1cmUgPSAwO1xuQEAgLTE0Nyw3NCArODQsNiBAQCBzdGF0aWMgZW51bSB2bXByZXNzdXJlX2xldmVscyB2bXByZXNzdXJlX2NhbGNfbGV2ZWwodW5zaWduZWQgbG9uZyBzY2FubmVkLFxuIFx0cmV0dXJuIHZtcHJlc3N1cmVfbGV2ZWwocHJlc3N1cmUpO1xuIH1cbiBcbi1zdHJ1Y3Qgdm1wcmVzc3VyZV9ldmVudCB7XG4tXHRzdHJ1Y3QgZXZlbnRmZF9jdHggKmVmZDtcbi1cdGVudW0gdm1wcmVzc3VyZV9sZXZlbHMgbGV2ZWw7XG4tXHRlbnVtIHZtcHJlc3N1cmVfbW9kZXMgbW9kZTtcbi1cdHN0cnVjdCBsaXN0X2hlYWQgbm9kZTtcbi19O1xuLVxuLXN0YXRpYyBib29sIHZtcHJlc3N1cmVfZXZlbnQoc3RydWN0IHZtcHJlc3N1cmUgKnZtcHIsXG4tXHRcdFx0ICAgICBjb25zdCBlbnVtIHZtcHJlc3N1cmVfbGV2ZWxzIGxldmVsLFxuLVx0XHRcdCAgICAgYm9vbCBhbmNlc3RvciwgYm9vbCBzaWduYWxsZWQpXG4te1xuLVx0c3RydWN0IHZtcHJlc3N1cmVfZXZlbnQgKmV2O1xuLVx0Ym9vbCByZXQgPSBmYWxzZTtcbi1cbi1cdG11dGV4X2xvY2soXHUwMDI2dm1wci1cdTAwM2VldmVudHNfbG9jayk7XG4tXHRsaXN0X2Zvcl9lYWNoX2VudHJ5KGV2LCBcdTAwMjZ2bXByLVx1MDAzZWV2ZW50cywgbm9kZSkge1xuLVx0XHRpZiAoYW5jZXN0b3IgXHUwMDI2XHUwMDI2IGV2LVx1MDAzZW1vZGUgPT0gVk1QUkVTU1VSRV9MT0NBTClcbi1cdFx0XHRjb250aW51ZTtcbi1cdFx0aWYgKHNpZ25hbGxlZCBcdTAwMjZcdTAwMjYgZXYtXHUwMDNlbW9kZSA9PSBWTVBSRVNTVVJFX05PX1BBU1NUSFJPVUdIKVxuLVx0XHRcdGNvbnRpbnVlO1xuLVx0XHRpZiAobGV2ZWwgXHUwMDNjIGV2LVx1MDAzZWxldmVsKVxuLVx0XHRcdGNvbnRpbnVlO1xuLVx0XHRldmVudGZkX3NpZ25hbChldi1cdTAwM2VlZmQpO1xuLVx0XHRyZXQgPSB0cnVlO1xuLVx0fVxuLVx0bXV0ZXhfdW5sb2NrKFx1MDAyNnZtcHItXHUwMDNlZXZlbnRzX2xvY2spO1xuLVxuLVx0cmV0dXJuIHJldDtcbi19XG4tXG4tc3RhdGljIHZvaWQgdm1wcmVzc3VyZV93b3JrX2ZuKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaylcbi17XG4tXHRzdHJ1Y3Qgdm1wcmVzc3VyZSAqdm1wciA9IHdvcmtfdG9fdm1wcmVzc3VyZSh3b3JrKTtcbi1cdHVuc2lnbmVkIGxvbmcgc2Nhbm5lZDtcbi1cdHVuc2lnbmVkIGxvbmcgcmVjbGFpbWVkO1xuLVx0ZW51bSB2bXByZXNzdXJlX2xldmVscyBsZXZlbDtcbi1cdGJvb2wgYW5jZXN0b3IgPSBmYWxzZTtcbi1cdGJvb2wgc2lnbmFsbGVkID0gZmFsc2U7XG4tXG4tXHRzcGluX2xvY2soXHUwMDI2dm1wci1cdTAwM2Vzcl9sb2NrKTtcbi1cdC8qXG4tXHQgKiBTZXZlcmFsIGNvbnRleHRzIG1pZ2h0IGJlIGNhbGxpbmcgdm1wcmVzc3VyZSgpLCBzbyBpdCBpc1xuLVx0ICogcG9zc2libGUgdGhhdCB0aGUgd29yayB3YXMgcmVzY2hlZHVsZWQgYWdhaW4gYmVmb3JlIHRoZSBvbGRcbi1cdCAqIHdvcmsgY29udGV4dCBjbGVhcmVkIHRoZSBjb3VudGVycy4gSW4gdGhhdCBjYXNlIHdlIHdpbGwgcnVuXG4tXHQgKiBqdXN0IGFmdGVyIHRoZSBvbGQgd29yayByZXR1cm5zLCBidXQgdGhlbiBzY2FubmVkIG1pZ2h0IGJlIHplcm9cbi1cdCAqIGhlcmUuIE5vIG5lZWQgZm9yIGFueSBsb2NrcyBoZXJlIHNpbmNlIHdlIGRvbid0IGNhcmUgaWZcbi1cdCAqIHZtcHItXHUwMDNlcmVjbGFpbWVkIGlzIGluIHN5bmMuXG4tXHQgKi9cbi1cdHNjYW5uZWQgPSB2bXByLVx1MDAzZXRyZWVfc2Nhbm5lZDtcbi1cdGlmICghc2Nhbm5lZCkge1xuLVx0XHRzcGluX3VubG9jayhcdTAwMjZ2bXByLVx1MDAzZXNyX2xvY2spO1xuLVx0XHRyZXR1cm47XG4tXHR9XG4tXG4tXHRyZWNsYWltZWQgPSB2bXByLVx1MDAzZXRyZWVfcmVjbGFpbWVkO1xuLVx0dm1wci1cdTAwM2V0cmVlX3NjYW5uZWQgPSAwO1xuLVx0dm1wci1cdTAwM2V0cmVlX3JlY2xhaW1lZCA9IDA7XG4tXHRzcGluX3VubG9jayhcdTAwMjZ2bXByLVx1MDAzZXNyX2xvY2spO1xuLVxuLVx0bGV2ZWwgPSB2bXByZXNzdXJlX2NhbGNfbGV2ZWwoc2Nhbm5lZCwgcmVjbGFpbWVkKTtcbi1cbi1cdGRvIHtcbi1cdFx0aWYgKHZtcHJlc3N1cmVfZXZlbnQodm1wciwgbGV2ZWwsIGFuY2VzdG9yLCBzaWduYWxsZWQpKVxuLVx0XHRcdHNpZ25hbGxlZCA9IHRydWU7XG4tXHRcdGFuY2VzdG9yID0gdHJ1ZTtcbi1cdH0gd2hpbGUgKCh2bXByID0gdm1wcmVzc3VyZV9wYXJlbnQodm1wcikpKTtcbi19XG4tXG4gLyoqXG4gICogdm1wcmVzc3VyZSgpIC0gQWNjb3VudCBtZW1vcnkgcHJlc3N1cmUgdGhyb3VnaCBzY2FubmVkL3JlY2xhaW1lZCByYXRpb1xuICAqIEBnZnA6XHRyZWNsYWltZXIncyBnZnAgbWFza1xuQEAgLTI0NiwxMSArMTE1LDEzIEBAIHZvaWQgdm1wcmVzc3VyZShnZnBfdCBnZnAsIGludCBvcmRlciwgc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLCBib29sIHRyZWUsXG4gXHRcdHJldHVybjtcbiBcbiBcdC8qXG4tXHQgKiBUaGUgaW4ta2VybmVsIHVzZXJzIG9ubHkgY2FyZSBhYm91dCB0aGUgcmVjbGFpbSBlZmZpY2llbmN5XG4tXHQgKiBmb3IgdGhpcyBAbWVtY2cgcmF0aGVyIHRoYW4gdGhlIHdob2xlIHN1YnRyZWUsIGFuZCB0aGVyZVxuLVx0ICogaXNuJ3QgYW5kIHdvbid0IGJlIGFueSBpbi1rZXJuZWwgdXNlciBpbiBhIGxlZ2FjeSBjZ3JvdXAuXG4rXHQgKiBPbmx5IHR3byBjb21iaW5hdGlvbnMgaGF2ZSBhIGNvbnN1bWVyOlxuK1x0ICogICBjZ3JvdXAgdjIgKyB0cmVlPWZhbHNlIC1cdTAwM2UgaW4ta2VybmVsIHNvY2tldCBwcmVzc3VyZVxuK1x0ICogICBjZ3JvdXAgdjEgKyB0cmVlPXRydWUgIC1cdTAwM2UgdXNlcnNwYWNlIGV2ZW50ZmRzIChtZW1vcnkucHJlc3N1cmVfbGV2ZWwpXG4rXHQgKiBTa2lwIHRoZSBvdGhlciB0d286IG5vdGhpbmcgY29uc3VtZXMgdGhlIHJlc3VsdC5cbiBcdCAqL1xuLVx0aWYgKCFjZ3JvdXBfc3Vic3lzX29uX2RmbChtZW1vcnlfY2dycF9zdWJzeXMpIFx1MDAyNlx1MDAyNiAhdHJlZSlcbitcdGlmICgoIWNncm91cF9zdWJzeXNfb25fZGZsKG1lbW9yeV9jZ3JwX3N1YnN5cykgXHUwMDI2XHUwMDI2ICF0cmVlKSB8fFxuK1x0ICAgIChjZ3JvdXBfc3Vic3lzX29uX2RmbChtZW1vcnlfY2dycF9zdWJzeXMpIFx1MDAyNlx1MDAyNiB0cmVlKSlcbiBcdFx0cmV0dXJuO1xuIFxuIFx0dm1wciA9IG1lbWNnX3RvX3ZtcHJlc3N1cmUobWVtY2cpO1xuQEAgLTI4MSwxNCArMTUyLDcgQEAgdm9pZCB2bXByZXNzdXJlKGdmcF90IGdmcCwgaW50IG9yZGVyLCBzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csIGJvb2wgdHJlZSxcbiBcdFx0cmV0dXJuO1xuIFxuIFx0aWYgKHRyZWUpIHtcbi1cdFx0c3Bpbl9sb2NrKFx1MDAyNnZtcHItXHUwMDNlc3JfbG9jayk7XG4tXHRcdHNjYW5uZWQgPSB2bXByLVx1MDAzZXRyZWVfc2Nhbm5lZCArPSBzY2FubmVkO1xuLVx0XHR2bXByLVx1MDAzZXRyZWVfcmVjbGFpbWVkICs9IHJlY2xhaW1lZDtcbi1cdFx0c3Bpbl91bmxvY2soXHUwMDI2dm1wci1cdTAwM2Vzcl9sb2NrKTtcbi1cbi1cdFx0aWYgKHNjYW5uZWQgXHUwMDNjIHZtcHJlc3N1cmVfd2luKVxuLVx0XHRcdHJldHVybjtcbi1cdFx0c2NoZWR1bGVfd29yayhcdTAwMjZ2bXByLVx1MDAzZXdvcmspO1xuK1x0XHR2bXByZXNzdXJlX3YxX2FjY291bnRfdHJlZSh2bXByLCBzY2FubmVkLCByZWNsYWltZWQpO1xuIFx0fSBlbHNlIHtcbiBcdFx0ZW51bSB2bXByZXNzdXJlX2xldmVscyBsZXZlbDtcbiBcbkBAIC0zMzAsMTM0ICsxOTQsNiBAQCB2b2lkIHZtcHJlc3N1cmUoZ2ZwX3QgZ2ZwLCBpbnQgb3JkZXIsIHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZywgYm9vbCB0cmVlLFxuIFx0fVxuIH1cbiBcbi0vKipcbi0gKiB2bXByZXNzdXJlX3ByaW8oKSAtIEFjY291bnQgbWVtb3J5IHByZXNzdXJlIHRocm91Z2ggcmVjbGFpbWVyIHByaW9yaXR5IGxldmVsXG4tICogQGdmcDpcdHJlY2xhaW1lcidzIGdmcCBtYXNrXG4tICogQG1lbWNnOlx0Y2dyb3VwIG1lbW9yeSBjb250cm9sbGVyIGhhbmRsZVxuLSAqIEBwcmlvOlx0cmVjbGFpbWVyJ3MgcHJpb3JpdHlcbi0gKlxuLSAqIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBmcm9tIHRoZSByZWNsYWltIHBhdGggZXZlcnkgdGltZSB3aGVuXG4tICogdGhlIHZtc2NhbidzIHJlY2xhaW1pbmcgcHJpb3JpdHkgKHNjYW5uaW5nIGRlcHRoKSBjaGFuZ2VzLlxuLSAqXG4tICogVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCByZXR1cm4gYW55IHZhbHVlLlxuLSAqL1xuLXZvaWQgdm1wcmVzc3VyZV9wcmlvKGdmcF90IGdmcCwgc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLCBpbnQgcHJpbylcbi17XG4tXHQvKlxuLVx0ICogV2Ugb25seSB1c2UgcHJpbyBmb3IgYWNjb3VudGluZyBjcml0aWNhbCBsZXZlbC4gRm9yIG1vcmUgaW5mb1xuLVx0ICogc2VlIGNvbW1lbnQgZm9yIHZtcHJlc3N1cmVfbGV2ZWxfY3JpdGljYWxfcHJpbyB2YXJpYWJsZSBhYm92ZS5cbi1cdCAqL1xuLVx0aWYgKHByaW8gXHUwMDNlIHZtcHJlc3N1cmVfbGV2ZWxfY3JpdGljYWxfcHJpbylcbi1cdFx0cmV0dXJuO1xuLVxuLVx0Lypcbi1cdCAqIE9LLCB0aGUgcHJpbyBpcyBiZWxvdyB0aGUgdGhyZXNob2xkLCB1cGRhdGluZyB2bXByZXNzdXJlXG4tXHQgKiBpbmZvcm1hdGlvbiBiZWZvcmUgc2hyaW5rZXIgZGl2ZXMgaW50byBsb25nIHNocmlua2luZyBvZiBsb25nXG4tXHQgKiByYW5nZSB2bXNjYW4uIFBhc3Npbmcgc2Nhbm5lZCA9IHZtcHJlc3N1cmVfd2luLCByZWNsYWltZWQgPSAwXG4tXHQgKiB0byB0aGUgdm1wcmVzc3VyZSgpIGJhc2ljYWxseSBtZWFucyB0aGF0IHdlIHNpZ25hbCAnY3JpdGljYWwnXG4tXHQgKiBsZXZlbC5cbi1cdCAqL1xuLVx0dm1wcmVzc3VyZShnZnAsIDAsIG1lbWNnLCB0cnVlLCB2bXByZXNzdXJlX3dpbiwgMCk7XG4tfVxuLVxuLSNkZWZpbmUgTUFYX1ZNUFJFU1NVUkVfQVJHU19MRU5cdChzdHJsZW4oXCJjcml0aWNhbFwiKSArIHN0cmxlbihcImhpZXJhcmNoeVwiKSArIDIpXG4tXG4tLyoqXG4tICogdm1wcmVzc3VyZV9yZWdpc3Rlcl9ldmVudCgpIC0gQmluZCB2bXByZXNzdXJlIG5vdGlmaWNhdGlvbnMgdG8gYW4gZXZlbnRmZFxuLSAqIEBtZW1jZzpcdG1lbWNnIHRoYXQgaXMgaW50ZXJlc3RlZCBpbiB2bXByZXNzdXJlIG5vdGlmaWNhdGlvbnNcbi0gKiBAZXZlbnRmZDpcdGV2ZW50ZmQgY29udGV4dCB0byBsaW5rIG5vdGlmaWNhdGlvbnMgd2l0aFxuLSAqIEBhcmdzOlx0ZXZlbnQgYXJndW1lbnRzIChwcmVzc3VyZSBsZXZlbCB0aHJlc2hvbGQsIG9wdGlvbmFsIG1vZGUpXG4tICpcbi0gKiBUaGlzIGZ1bmN0aW9uIGFzc29jaWF0ZXMgZXZlbnRmZCBjb250ZXh0IHdpdGggdGhlIHZtcHJlc3N1cmVcbi0gKiBpbmZyYXN0cnVjdHVyZSwgc28gdGhhdCB0aGUgbm90aWZpY2F0aW9ucyB3aWxsIGJlIGRlbGl2ZXJlZCB0byB0aGVcbi0gKiBAZXZlbnRmZC4gVGhlIEBhcmdzIHBhcmFtZXRlciBpcyBhIGNvbW1hLWRlbGltaXRlZCBzdHJpbmcgdGhhdCBkZW5vdGVzIGFcbi0gKiBwcmVzc3VyZSBsZXZlbCB0aHJlc2hvbGQgKG9uZSBvZiB2bXByZXNzdXJlX3N0cl9sZXZlbHMsIGkuZS4gXCJsb3dcIiwgXCJtZWRpdW1cIixcbi0gKiBvciBcImNyaXRpY2FsXCIpIGFuZCBhbiBvcHRpb25hbCBtb2RlIChvbmUgb2Ygdm1wcmVzc3VyZV9zdHJfbW9kZXMsIGkuZS5cbi0gKiBcImhpZXJhcmNoeVwiIG9yIFwibG9jYWxcIikuXG4tICpcbi0gKiBUbyBiZSB1c2VkIGFzIG1lbWNnIGV2ZW50IG1ldGhvZC5cbi0gKlxuLSAqIFJldHVybjogMCBvbiBzdWNjZXNzLCAtRU5PTUVNIG9uIG1lbW9yeSBmYWlsdXJlIG9yIC1FSU5WQUwgaWYgQGFyZ3MgY291bGRcbi0gKiBub3QgYmUgcGFyc2VkLlxuLSAqL1xuLWludCB2bXByZXNzdXJlX3JlZ2lzdGVyX2V2ZW50KHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZyxcbi1cdFx0XHQgICAgICBzdHJ1Y3QgZXZlbnRmZF9jdHggKmV2ZW50ZmQsIGNvbnN0IGNoYXIgKmFyZ3MpXG4te1xuLVx0c3RydWN0IHZtcHJlc3N1cmUgKnZtcHIgPSBtZW1jZ190b192bXByZXNzdXJlKG1lbWNnKTtcbi1cdHN0cnVjdCB2bXByZXNzdXJlX2V2ZW50ICpldjtcbi1cdGVudW0gdm1wcmVzc3VyZV9tb2RlcyBtb2RlID0gVk1QUkVTU1VSRV9OT19QQVNTVEhST1VHSDtcbi1cdGVudW0gdm1wcmVzc3VyZV9sZXZlbHMgbGV2ZWw7XG4tXHRjaGFyICpzcGVjLCAqc3BlY19vcmlnO1xuLVx0Y2hhciAqdG9rZW47XG4tXHRpbnQgcmV0ID0gMDtcbi1cbi1cdHNwZWNfb3JpZyA9IHNwZWMgPSBrc3RybmR1cChhcmdzLCBNQVhfVk1QUkVTU1VSRV9BUkdTX0xFTiwgR0ZQX0tFUk5FTCk7XG4tXHRpZiAoIXNwZWMpXG4tXHRcdHJldHVybiAtRU5PTUVNO1xuLVxuLVx0LyogRmluZCByZXF1aXJlZCBsZXZlbCAqL1xuLVx0dG9rZW4gPSBzdHJzZXAoXHUwMDI2c3BlYywgXCIsXCIpO1xuLVx0cmV0ID0gbWF0Y2hfc3RyaW5nKHZtcHJlc3N1cmVfc3RyX2xldmVscywgVk1QUkVTU1VSRV9OVU1fTEVWRUxTLCB0b2tlbik7XG4tXHRpZiAocmV0IFx1MDAzYyAwKVxuLVx0XHRnb3RvIG91dDtcbi1cdGxldmVsID0gcmV0O1xuLVxuLVx0LyogRmluZCBvcHRpb25hbCBtb2RlICovXG4tXHR0b2tlbiA9IHN0cnNlcChcdTAwMjZzcGVjLCBcIixcIik7XG4tXHRpZiAodG9rZW4pIHtcbi1cdFx0cmV0ID0gbWF0Y2hfc3RyaW5nKHZtcHJlc3N1cmVfc3RyX21vZGVzLCBWTVBSRVNTVVJFX05VTV9NT0RFUywgdG9rZW4pO1xuLVx0XHRpZiAocmV0IFx1MDAzYyAwKVxuLVx0XHRcdGdvdG8gb3V0O1xuLVx0XHRtb2RlID0gcmV0O1xuLVx0fVxuLVxuLVx0ZXYgPSBremFsbG9jX29iaigqZXYpO1xuLVx0aWYgKCFldikge1xuLVx0XHRyZXQgPSAtRU5PTUVNO1xuLVx0XHRnb3RvIG91dDtcbi1cdH1cbi1cbi1cdGV2LVx1MDAzZWVmZCA9IGV2ZW50ZmQ7XG4tXHRldi1cdTAwM2VsZXZlbCA9IGxldmVsO1xuLVx0ZXYtXHUwMDNlbW9kZSA9IG1vZGU7XG4tXG4tXHRtdXRleF9sb2NrKFx1MDAyNnZtcHItXHUwMDNlZXZlbnRzX2xvY2spO1xuLVx0bGlzdF9hZGQoXHUwMDI2ZXYtXHUwMDNlbm9kZSwgXHUwMDI2dm1wci1cdTAwM2VldmVudHMpO1xuLVx0bXV0ZXhfdW5sb2NrKFx1MDAyNnZtcHItXHUwMDNlZXZlbnRzX2xvY2spO1xuLVx0cmV0ID0gMDtcbi1vdXQ6XG4tXHRrZnJlZShzcGVjX29yaWcpO1xuLVx0cmV0dXJuIHJldDtcbi19XG4tXG4tLyoqXG4tICogdm1wcmVzc3VyZV91bnJlZ2lzdGVyX2V2ZW50KCkgLSBVbmJpbmQgZXZlbnRmZCBmcm9tIHZtcHJlc3N1cmVcbi0gKiBAbWVtY2c6XHRtZW1jZyBoYW5kbGVcbi0gKiBAZXZlbnRmZDpcdGV2ZW50ZmQgY29udGV4dCB0aGF0IHdhcyB1c2VkIHRvIGxpbmsgdm1wcmVzc3VyZSB3aXRoIHRoZSBAY2dcbi0gKlxuLSAqIFRoaXMgZnVuY3Rpb24gZG9lcyBpbnRlcm5hbCBtYW5pcHVsYXRpb25zIHRvIGRldGFjaCB0aGUgQGV2ZW50ZmQgZnJvbVxuLSAqIHRoZSB2bXByZXNzdXJlIG5vdGlmaWNhdGlvbnMsIGFuZCB0aGVuIGZyZWVzIGludGVybmFsIHJlc291cmNlc1xuLSAqIGFzc29jaWF0ZWQgd2l0aCB0aGUgQGV2ZW50ZmQgKGJ1dCB0aGUgQGV2ZW50ZmQgaXRzZWxmIGlzIG5vdCBmcmVlZCkuXG4tICpcbi0gKiBUbyBiZSB1c2VkIGFzIG1lbWNnIGV2ZW50IG1ldGhvZC5cbi0gKi9cbi12b2lkIHZtcHJlc3N1cmVfdW5yZWdpc3Rlcl9ldmVudChzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csXG4tXHRcdFx0XHQgc3RydWN0IGV2ZW50ZmRfY3R4ICpldmVudGZkKVxuLXtcbi1cdHN0cnVjdCB2bXByZXNzdXJlICp2bXByID0gbWVtY2dfdG9fdm1wcmVzc3VyZShtZW1jZyk7XG4tXHRzdHJ1Y3Qgdm1wcmVzc3VyZV9ldmVudCAqZXY7XG4tXG4tXHRtdXRleF9sb2NrKFx1MDAyNnZtcHItXHUwMDNlZXZlbnRzX2xvY2spO1xuLVx0bGlzdF9mb3JfZWFjaF9lbnRyeShldiwgXHUwMDI2dm1wci1cdTAwM2VldmVudHMsIG5vZGUpIHtcbi1cdFx0aWYgKGV2LVx1MDAzZWVmZCAhPSBldmVudGZkKVxuLVx0XHRcdGNvbnRpbnVlO1xuLVx0XHRsaXN0X2RlbChcdTAwMjZldi1cdTAwM2Vub2RlKTtcbi1cdFx0a2ZyZWUoZXYpO1xuLVx0XHRicmVhaztcbi1cdH1cbi1cdG11dGV4X3VubG9jayhcdTAwMjZ2bXByLVx1MDAzZWV2ZW50c19sb2NrKTtcbi19XG4tXG4gLyoqXG4gICogdm1wcmVzc3VyZV9pbml0KCkgLSBJbml0aWFsaXplIHZtcHJlc3N1cmUgY29udHJvbCBzdHJ1Y3R1cmVcbiAgKiBAdm1wcjpcdFN0cnVjdHVyZSB0byBiZSBpbml0aWFsaXplZFxuQEAgLTQ2OCw5ICsyMDQsNyBAQCB2b2lkIHZtcHJlc3N1cmVfdW5yZWdpc3Rlcl9ldmVudChzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csXG4gdm9pZCB2bXByZXNzdXJlX2luaXQoc3RydWN0IHZtcHJlc3N1cmUgKnZtcHIpXG4ge1xuIFx0c3Bpbl9sb2NrX2luaXQoXHUwMDI2dm1wci1cdTAwM2Vzcl9sb2NrKTtcbi1cdG11dGV4X2luaXQoXHUwMDI2dm1wci1cdTAwM2VldmVudHNfbG9jayk7XG4tXHRJTklUX0xJU1RfSEVBRChcdTAwMjZ2bXByLVx1MDAzZWV2ZW50cyk7XG4tXHRJTklUX1dPUksoXHUwMDI2dm1wci1cdTAwM2V3b3JrLCB2bXByZXNzdXJlX3dvcmtfZm4pO1xuK1x0dm1wcmVzc3VyZV92MV9pbml0KHZtcHIpO1xuIH1cbiBcbiAvKipcbkBAIC00ODIsOSArMjE2LDUgQEAgdm9pZCB2bXByZXNzdXJlX2luaXQoc3RydWN0IHZtcHJlc3N1cmUgKnZtcHIpXG4gICovXG4gdm9pZCB2bXByZXNzdXJlX2NsZWFudXAoc3RydWN0IHZtcHJlc3N1cmUgKnZtcHIpXG4ge1xuLVx0Lypcbi1cdCAqIE1ha2Ugc3VyZSB0aGVyZSBpcyBubyBwZW5kaW5nIHdvcmsgYmVmb3JlIGV2ZW50ZmQgaW5mcmFzdHJ1Y3R1cmVcbi1cdCAqIGdvZXMgYXdheS5cbi1cdCAqL1xuLVx0Zmx1c2hfd29yayhcdTAwMjZ2bXByLVx1MDAzZXdvcmspO1xuK1x0dm1wcmVzc3VyZV92MV9jbGVhbnVwKHZtcHIpO1xuIH1cbiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA2LTI5VDE0OjMzOjU3LjUwMzczNjcyN1oiLCJTZXEiOjMsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjE4NTI4MDMxMDg1LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5c2lzIG9mIHRoZSB2bXByZXNzdXJlIGNncm91cCB2MSByZWZhY3RvcmluZyBwYXRjaCoqXG5cbk9rYXksIHNvIEknbSBsb29raW5nIGF0IHRoaXMgcGF0Y2ggdGhhdCByZWZhY3RvcnMgdGhlIGNncm91cCB2MSB2bXByZXNzdXJlIGNvZGUuIFRoZSBwcmltYXJ5IGdvYWwgc2VlbXMgdG8gYmUgdG8gc3BsaXQgb3V0IHRoZSB2MS1zcGVjaWZpYyBiaXRzIGludG8gYG1tL3ZtcHJlc3N1cmUtdjEuY2AgdXNpbmcgY29uZGl0aW9uYWwgY29tcGlsYXRpb24gYmFzZWQgb24gYENPTkZJR19NRU1DR19WMWAuIFRoaXMgaW52b2x2ZXMgbW92aW5nIGZ1bmN0aW9ucyBsaWtlIGB2bXByZXNzdXJlX3ByaW9gLCBgdm1wcmVzc3VyZV9yZWdpc3Rlcl9ldmVudGAsIGV0Yy4sIGFuZCBpbnRyb2R1Y2luZyBpbml0aWFsaXphdGlvbiBhbmQgY2xlYW51cCBmdW5jdGlvbnMgc3BlY2lmaWMgdG8gdjEuICBUaGUgYE1ha2VmaWxlYCBnZXRzIHVwZGF0ZWQgdG8gYnVpbGQgdGhlIG5ldyBmaWxlIHdoZW4gYENPTkZJR19NRU1DR19WMWAgaXMgZW5hYmxlZCwgYW5kIHRoZSBgdm1wcmVzc3VyZS5oYCBoZWFkZXIgaGlkZXMgdjEtc3BlY2lmaWMgZmllbGRzIHdpdGggYW4gYCNpZmRlZmAuIEl0J3MgYSBjbGVhciBhdHRlbXB0IHRvIGtlZXAgdGhlIHYyIGltcGxlbWVudGF0aW9uIGNsZWFuZXIuXG5cbk15IGluaXRpYWwgdGhvdWdodCBpcyB0byBjaGVjayBmb3IgYW55ICpmdW5jdGlvbmFsKiBjaGFuZ2VzLiBUaGUgY29tbWl0IG1lc3NhZ2UgbWVudGlvbnMgZHJvcHBpbmcgdGhlIHYxIGV2ZW50ZmQgYWNjdW11bGF0b3Igd2hlbiBgQ09ORklHX01FTUNHX1YxYCBpcyBkaXNhYmxlZCwgd2hpY2ggbWFrZXMgc2Vuc2UgZm9yIGEgdjItb25seSBrZXJuZWwuXG5cbk5vdyBJJ3ZlIGhpdCBhIHdyaW5rbGUuICBUaGUgcGF0Y2ggKmRvZXMqIG1vZGlmeSBgdm1wcmVzc3VyZSgpYCBpdHNlbGYuICBUaGUgY29kZSBub3cgaW5jbHVkZXMgYSBjb25kaXRpb25hbCBlYXJseSByZXR1cm46IGAoIWNncm91cF9zdWJzeXNfb25fZGZsKG1lbW9yeV9jZ3JwX3N1YnN5cykgXHUwMDI2XHUwMDI2ICF0cmVlKSB8fCAoY2dyb3VwX3N1YnN5c19vbl9kZmwobWVtb3J5X2NncnBfc3Vic3lzKSBcdTAwMjZcdTAwMjYgdHJlZSlgLiBUaGUgb3JpZ2luYWwgY29kZSBqdXN0IGhhZCBgIWNncm91cF9zdWJzeXNfb25fZGZsKG1lbW9yeV9jZ3JwX3N1YnN5cykgXHUwMDI2XHUwMDI2ICF0cmVlYC4gVGhpcyBpcyBhIGJpdCBtb3JlIHRoYW4ganVzdCBhIHJlZmFjdG9yaW5nLlxuXG5UaGlua2luZyBhYm91dCB0aGlzLCB0aGUgY2hhbmdlIG5vdyAqc2tpcHMqIHRoZSBgdHJlZWAgYnJhbmNoIHdoZW4gYGNncm91cF9zdWJzeXNfb25fZGZsYCBpcyB0cnVlIChjZ3JvdXAgdjIpIGFuZCBgdHJlZWAgaXMgYWxzbyB0cnVlLiBQcmV2aW91c2x5LCB0aGlzIGJyYW5jaCB3b3VsZCBoYXZlIGFjY3VtdWxhdGVkIGB0cmVlX3NjYW5uZWRgIGFuZCBzY2hlZHVsZWQgYHZtcHItXHUwMDNld29ya2AuIEluIHYyLCB0aGUgYHdvcmtgIGZ1bmN0aW9uIHdvdWxkIGhhdmUgZG9uZSBub3RoaW5nIGFzIHRoZXJlIGFyZSBubyByZWdpc3RlcmVkIHVzZXJzcGFjZSBldmVudGZkcy4gU28sIGl0IGFwcGVhcnMgdGhlIHBhdGNoIGludHJvZHVjZXMgYW4gKm9wdGltaXphdGlvbiosIGJ5IHNraXBwaW5nIHRoZSBzY2hlZHVsaW5nIGFuZCBhY2N1bXVsYXRpb24uIEl0J3Mgc2tpcHBpbmcgd29yayB0aGF0IHdvdWxkIGRvIG5vdGhpbmcsIHNvIHRoaXMgbWFrZXMgc2Vuc2UuXG5cblNvIGlzIHRoaXMgYSB3b3J0aHdoaWxlIHBhdGNoIHRvIGZ1eno/IEl0IGlzIG1vc3RseSBhIHJlZmFjdG9yaW5nLiBUaGUgdjEgY29kZSBpcyBiZWluZyBtb3ZlZCBhcm91bmQuIFRoZSBjaGFuZ2VzIGZvciBrZXJuZWxzIGNvbXBpbGVkIHdpdGggYENPTkZJR19NRU1DR19WMWAgZGlzYWJsZWQgYXJlIGEgcHVyZWx5IHN0cnVjdHVyYWwgY2xlYW51cC4gVGhlIG5ldyBgdm1wcmVzc3VyZV92MV8qYCBmdW5jdGlvbnMgYmVjb21lIG5vLW9wcy5cblxuVGhlIGNvcmUgb2YgdGhlIG1hdHRlciBpcyB0aGUgZWFybHkgcmV0dXJuIGluIGB2bXByZXNzdXJlKClgLiBXaGlsZSB0ZWNobmljYWxseSBhbiBvcHRpbWl6YXRpb24sIGl0ICpkb2VzKiBjaGFuZ2UgdGhlIGV4ZWN1dGlvbiBmbG93LiAgU28sIGJhc2VkIG9uIHRoYXQsIGV2ZW4gdGhvdWdoIGl0J3MgcmVsYXRpdmVseSBtaW5vciBhbmQgYSBwZXJmb3JtYW5jZSB0d2VhaywgdGhpcyBjb3VudHMgYXMgYSBmdW5jdGlvbmFsIGNoYW5nZS5cblxuVGhlcmVmb3JlLCBiZWNhdXNlIHRoaXMgZnVuY3Rpb25hbCBjaGFuZ2UgbW9kaWZpZXMgcmVhY2hhYmxlIGNvcmUga2VybmVsIGxvZ2ljLCBJIG11c3Qgc2F5ICoqV29ydGhGdXp6aW5nPXRydWUqKi5cblxuXG4iLCJJbnB1dFRva2VucyI6MTA5MzksIk91dHB1dFRva2VucyI6MTksIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxNzE2LCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDYtMjlUMTQ6MzQ6MTYuMDMxNzczNTYyWiIsIlNlcSI6NCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjI1NDc3NzAzMzMsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiTUVNQ0dfVjFcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiaW5jbHVkZS9saW51eC9tZW1jb250cm9sLmg9ODk9c3RydWN0IG1lbV9jZ3JvdXBfcGVyX25vZGUge1xcbi0tXFxuaW5jbHVkZS9saW51eC9tZW1jb250cm9sLmgtOTctXFxuaW5jbHVkZS9saW51eC9tZW1jb250cm9sLmg6OTg6I2lmZGVmIENPTkZJR19NRU1DR19WMVxcbmluY2x1ZGUvbGludXgvbWVtY29udHJvbC5oLTk5LVxcdC8qXFxuLS1cXG5pbmNsdWRlL2xpbnV4L21lbWNvbnRyb2wuaD0yMDI9c3RydWN0IG1lbV9jZ3JvdXAge1xcbi0tXFxuaW5jbHVkZS9saW51eC9tZW1jb250cm9sLmgtMjg1LVxcbmluY2x1ZGUvbGludXgvbWVtY29udHJvbC5oOjI4NjojaWZkZWYgQ09ORklHX01FTUNHX1YxXFxuaW5jbHVkZS9saW51eC9tZW1jb250cm9sLmgtMjg3LVxcdC8qIExlZ2FjeSBjb25zdW1lci1vcmllbnRlZCBjb3VudGVycyAqL1xcbi0tXFxuaW5jbHVkZS9saW51eC9tZW1jb250cm9sLmgtMzIwLVxcdHNwaW5sb2NrX3QgZXZlbnRfbGlzdF9sb2NrO1xcbmluY2x1ZGUvbGludXgvbWVtY29udHJvbC5oOjMyMTojZW5kaWYgLyogQ09ORklHX01FTUNHX1YxICovXFxuaW5jbHVkZS9saW51eC9tZW1jb250cm9sLmgtMzIyLVxcbi0tXFxuaW5jbHVkZS9saW51eC9tZW1jb250cm9sLmg9MTg2NT1zdGF0aWMgaW5saW5lIGJvb2wgbWVtX2Nncm91cF96c3dhcF93cml0ZWJhY2tfZW5hYmxlZChzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2cpXFxuLS1cXG5pbmNsdWRlL2xpbnV4L21lbWNvbnRyb2wuaC0xODc0LVxcbmluY2x1ZGUvbGludXgvbWVtY29udHJvbC5oOjE4NzU6I2lmZGVmIENPTkZJR19NRU1DR19WMVxcbmluY2x1ZGUvbGludXgvbWVtY29udHJvbC5oLTE4NzYtdW5zaWduZWQgbG9uZyBtZW1jZzFfc29mdF9saW1pdF9yZWNsYWltKHBnX2RhdGFfdCAqcGdkYXQsIGludCBvcmRlcixcXG4tLVxcbmluY2x1ZGUvbGludXgvbWVtY29udHJvbC5oPTE4OTM9c3RhdGljIGlubGluZSB2b2lkIG1lbV9jZ3JvdXBfZXhpdF91c2VyX2ZhdWx0KHZvaWQpXFxuLS1cXG5pbmNsdWRlL2xpbnV4L21lbWNvbnRyb2wuaC0xODk4LVxcbmluY2x1ZGUvbGludXgvbWVtY29udHJvbC5oOjE4OTk6I2Vsc2UgLyogQ09ORklHX01FTUNHX1YxICovXFxuaW5jbHVkZS9saW51eC9tZW1jb250cm9sLmgtMTkwMC1zdGF0aWMgaW5saW5lXFxuLS1cXG5pbmNsdWRlL2xpbnV4L21lbWNvbnRyb2wuaD0xOTIyPXN0YXRpYyBpbmxpbmUgdm9pZCBtZW1fY2dyb3VwX2V4aXRfdXNlcl9mYXVsdCh2b2lkKVxcbi0tXFxuaW5jbHVkZS9saW51eC9tZW1jb250cm9sLmgtMTkyNS1cXG5pbmNsdWRlL2xpbnV4L21lbWNvbnRyb2wuaDoxOTI2OiNlbmRpZiAvKiBDT05GSUdfTUVNQ0dfVjEgKi9cXG5pbmNsdWRlL2xpbnV4L21lbWNvbnRyb2wuaC0xOTI3LVxcbmluY2x1ZGUvbGludXgvbWVtY29udHJvbC5oOjE5Mjg6I2lmIGRlZmluZWQoQ09ORklHX01FTUNHX1YxKSBcXHUwMDI2XFx1MDAyNiBkZWZpbmVkKENPTkZJR19TV0FQKVxcbmluY2x1ZGUvbGludXgvbWVtY29udHJvbC5oLTE5MjktXFxuLS1cXG5pbmNsdWRlL2xpbnV4L3NjaGVkLmg9ODI2PXN0cnVjdCB0YXNrX3N0cnVjdCB7XFxuLS1cXG5pbmNsdWRlL2xpbnV4L3NjaGVkLmgtMTAyMS0jZW5kaWZcXG5pbmNsdWRlL2xpbnV4L3NjaGVkLmg6MTAyMjojaWZkZWYgQ09ORklHX01FTUNHX1YxXFxuaW5jbHVkZS9saW51eC9zY2hlZC5oLTEwMjMtXFx0dW5zaWduZWRcXHRcXHRcXHRpbl91c2VyX2ZhdWx0OjE7XFxuLS1cXG5pbmNsdWRlL2xpbnV4L3NjaGVkLmgtMTU0Ny1cXG5pbmNsdWRlL2xpbnV4L3NjaGVkLmg6MTU0ODojaWZkZWYgQ09ORklHX01FTUNHX1YxXFxuaW5jbHVkZS9saW51eC9zY2hlZC5oLTE1NDktXFx0c3RydWN0IG1lbV9jZ3JvdXBcXHRcXHQqbWVtY2dfaW5fb29tO1xcbi0tXFxuaW5jbHVkZS9saW51eC92bXByZXNzdXJlLmg9MTM9c3RydWN0IHZtcHJlc3N1cmUge1xcbi0tXFxuaW5jbHVkZS9saW51eC92bXByZXNzdXJlLmgtMTgtXFxuaW5jbHVkZS9saW51eC92bXByZXNzdXJlLmg6MTk6I2lmZGVmIENPTkZJR19NRU1DR19WMVxcbmluY2x1ZGUvbGludXgvdm1wcmVzc3VyZS5oLTIwLVxcdC8qXFxuLS1cXG5pbmNsdWRlL2xpbnV4L3ZtcHJlc3N1cmUuaC0yMi1cXHQgKiAobWVtb3J5LnByZXNzdXJlX2xldmVsKS4gRHJhaW5lZCBieSBAd29yay4gdjIgaGFzIG5vIGVxdWl2YWxlbnRcXG5pbmNsdWRlL2xpbnV4L3ZtcHJlc3N1cmUuaDoyMzpcXHQgKiBpbnRlcmZhY2UsIHNvIHRoaXMgc3RhdGUgaXMgb21pdHRlZCBvbiBDT05GSUdfTUVNQ0dfVjE9biBidWlsZHMuXFxuaW5jbHVkZS9saW51eC92bXByZXNzdXJlLmgtMjQtXFx0ICovXFxuLS1cXG5pbmNsdWRlL2xpbnV4L3ZtcHJlc3N1cmUuaD01NT1leHRlcm4gZW51bSB2bXByZXNzdXJlX2xldmVscyB2bXByZXNzdXJlX2NhbGNfbGV2ZWwodW5zaWduZWQgbG9uZyBzY2FubmVkLFxcbi0tXFxuaW5jbHVkZS9saW51eC92bXByZXNzdXJlLmgtNTctXFxuaW5jbHVkZS9saW51eC92bXByZXNzdXJlLmg6NTg6I2lmZGVmIENPTkZJR19NRU1DR19WMVxcbmluY2x1ZGUvbGludXgvdm1wcmVzc3VyZS5oLTU5LWV4dGVybiB2b2lkIHZtcHJlc3N1cmVfcHJpbyhnZnBfdCBnZnAsIHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZywgaW50IHByaW8pO1xcbi0tXFxuaW5jbHVkZS9saW51eC92bXByZXNzdXJlLmg9NjM9ZXh0ZXJuIHZvaWQgdm1wcmVzc3VyZV91bnJlZ2lzdGVyX2V2ZW50KHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZyxcXG4tLVxcbmluY2x1ZGUvbGludXgvdm1wcmVzc3VyZS5oLTY1LVxcbmluY2x1ZGUvbGludXgvdm1wcmVzc3VyZS5oOjY2Oi8qIHYxIGhvb2tzIGNhbGxlZCBmcm9tIG1tL3ZtcHJlc3N1cmUuYzsgbm8tb3BzIGJlbG93IHdoZW4gIU1FTUNHX1YxLiAqL1xcbmluY2x1ZGUvbGludXgvdm1wcmVzc3VyZS5oLTY3LWV4dGVybiB2b2lkIHZtcHJlc3N1cmVfdjFfaW5pdChzdHJ1Y3Qgdm1wcmVzc3VyZSAqdm1wcik7XFxuLS1cXG5pbmNsdWRlL2xpbnV4L3ZtcHJlc3N1cmUuaD03Nz1zdGF0aWMgaW5saW5lIHZvaWQgdm1wcmVzc3VyZV92MV9hY2NvdW50X3RyZWUoc3RydWN0IHZtcHJlc3N1cmUgKnZtcHIsXFxuLS1cXG5pbmNsdWRlL2xpbnV4L3ZtcHJlc3N1cmUuaC03OS1cXHRcXHRcXHRcXHRcXHQgICAgICB1bnNpZ25lZCBsb25nIHJlY2xhaW1lZCkge31cXG5pbmNsdWRlL2xpbnV4L3ZtcHJlc3N1cmUuaDo4MDojZW5kaWYgLyogQ09ORklHX01FTUNHX1YxICovXFxuaW5jbHVkZS9saW51eC92bXByZXNzdXJlLmgtODEtXFxuLS1cXG5pbmNsdWRlL25ldC9zb2NrLmg9MjcwMj1zdGF0aWMgaW5saW5lIGJvb2wgbWVtX2Nncm91cF9za191bmRlcl9tZW1vcnlfcHJlc3N1cmUoY29uc3Qgc3RydWN0IHNvY2sgKnNrKVxcbi0tXFxuaW5jbHVkZS9uZXQvc29jay5oLTI3MDUtXFxuaW5jbHVkZS9uZXQvc29jay5oOjI3MDY6I2lmZGVmIENPTkZJR19NRU1DR19WMVxcbmluY2x1ZGUvbmV0L3NvY2suaC0yNzA3LVxcdGlmICghY2dyb3VwX3N1YnN5c19vbl9kZmwobWVtb3J5X2NncnBfc3Vic3lzKSlcXG5pbmNsdWRlL25ldC9zb2NrLmgtMjcwOC1cXHRcXHRyZXR1cm4gISFtZW1jZy1cXHUwMDNldGNwbWVtX3ByZXNzdXJlO1xcbmluY2x1ZGUvbmV0L3NvY2suaDoyNzA5OiNlbmRpZiAvKiBDT05GSUdfTUVNQ0dfVjEgKi9cXG5pbmNsdWRlL25ldC9zb2NrLmgtMjcxMC1cXG4tLVxcbmluaXQvS2NvbmZpZz0xMDg5PWNvbmZpZyBNRU1DR19OTUlfU0FGRVRZX1JFUVVJUkVTX0FUT01JQ1xcbi0tXFxuaW5pdC9LY29uZmlnLTEwOTUtXFxuaW5pdC9LY29uZmlnOjEwOTY6Y29uZmlnIE1FTUNHX1YxXFxuaW5pdC9LY29uZmlnLTEwOTctXFx0Ym9vbCBcXFwiTGVnYWN5IGNncm91cCB2MSBtZW1vcnkgY29udHJvbGxlclxcXCJcXG4tLVxcbm1tL01ha2VmaWxlPTEwMz1vYmotJChDT05GSUdfTElWRVVQREFURV9NRU1GRCkgKz0gbWVtZmRfbHVvLm9cXG5tbS9NYWtlZmlsZToxMDQ6b2JqLSQoQ09ORklHX01FTUNHX1YxKSArPSBtZW1jb250cm9sLXYxLm8gdm1wcmVzc3VyZS12MS5vXFxubW0vTWFrZWZpbGUtMTA1LW9iai0kKENPTkZJR19NRU1DRykgKz0gbWVtY29udHJvbC5vIHZtcHJlc3N1cmUub1xcbi0tXFxubW0vbWVtY29udHJvbC12MS5oPTI0PXN0cnVjdCBtZW1fY2dyb3VwICptZW1fY2dyb3VwX3ByaXZhdGVfaWRfZ2V0X29ubGluZShzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csXFxuLS1cXG5tbS9tZW1jb250cm9sLXYxLmgtMjctLyogQ2dyb3VwIHYxLXNwZWNpZmljIGRlY2xhcmF0aW9ucyAqL1xcbm1tL21lbWNvbnRyb2wtdjEuaDoyODojaWZkZWYgQ09ORklHX01FTUNHX1YxXFxubW0vbWVtY29udHJvbC12MS5oLTI5LVxcbi0tXFxubW0vbWVtY29udHJvbC12MS5oPTkxPWV4dGVybiBzdHJ1Y3QgY2Z0eXBlIG1lbV9jZ3JvdXBfbGVnYWN5X2ZpbGVzW107XFxubW0vbWVtY29udHJvbC12MS5oLTkyLVxcbm1tL21lbWNvbnRyb2wtdjEuaDo5MzojZWxzZVxcdC8qIENPTkZJR19NRU1DR19WMSAqL1xcbm1tL21lbWNvbnRyb2wtdjEuaC05NC1cXG4tLVxcbm1tL21lbWNvbnRyb2wtdjEuaD0xMjE9c3RhdGljIGlubGluZSB2b2lkIG1lbWNnMV91bmNoYXJnZV9za21lbShzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csIHVuc2lnbmVkIGludCBucl9wYWdlcykge31cXG5tbS9tZW1jb250cm9sLXYxLmgtMTIyLVxcbm1tL21lbWNvbnRyb2wtdjEuaDoxMjM6I2VuZGlmXFx0LyogQ09ORklHX01FTUNHX1YxICovXFxubW0vbWVtY29udHJvbC12MS5oLTEyNC1cXG4tLVxcbm1tL21lbWNvbnRyb2wuYz0yMDk9c3RhdGljIGlubGluZSBzdHJ1Y3Qgb2JqX2Nncm91cCAqX19tZW1jZ19yZXBhcmVudF9vYmpjZ3Moc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLFxcbi0tXFxubW0vbWVtY29udHJvbC5jLTIyOC1cXG5tbS9tZW1jb250cm9sLmM6MjI5OiNpZmRlZiBDT05GSUdfTUVNQ0dfVjFcXG5tbS9tZW1jb250cm9sLmMtMjMwLXN0YXRpYyB2b2lkIF9fbWVtX2Nncm91cF9mbHVzaF9zdGF0cyhzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csIGJvb2wgZm9yY2UpO1xcbi0tXFxubW0vbWVtY29udHJvbC5jPTUwNT11bnNpZ25lZCBsb25nIGxydXZlY19wYWdlX3N0YXRlX2xvY2FsKHN0cnVjdCBscnV2ZWMgKmxydXZlYyxcXG4tLVxcbm1tL21lbWNvbnRyb2wuYy01MjctXFxubW0vbWVtY29udHJvbC5jOjUyODojaWZkZWYgQ09ORklHX01FTUNHX1YxXFxubW0vbWVtY29udHJvbC5jLTUyOS1zdGF0aWMgdm9pZCBfX21vZF9tZW1jZ19scnV2ZWNfc3RhdGUoc3RydWN0IG1lbV9jZ3JvdXBfcGVyX25vZGUgKnBuLFxcbi0tXFxubW0vbWVtY29udHJvbC5jPTU1Mz1zdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1lbWNnX3ZtX2V2ZW50X3N0YXRbXSA9IHtcXG5tbS9tZW1jb250cm9sLmM6NTU0OiNpZmRlZiBDT05GSUdfTUVNQ0dfVjFcXG5tbS9tZW1jb250cm9sLmMtNTU1LVxcdFBHUEdJTixcXG4tLVxcbm1tL21lbWNvbnRyb2wuYz03ODc9c3RhdGljIGxvbmcgbWVtY2dfc3RhdGVfdmFsX2luX3BhZ2VzKGludCBpZHgsIGxvbmcgdmFsKVxcbi0tXFxubW0vbWVtY29udHJvbC5jLTgwMi1cXG5tbS9tZW1jb250cm9sLmM6ODAzOiNpZmRlZiBDT05GSUdfTUVNQ0dfVjFcXG5tbS9tZW1jb250cm9sLmMtODA0LS8qXFxuLS1cXG5tbS9tZW1jb250cm9sLmM9ODcxPXZvaWQgbW9kX21lbWNnX3N0YXRlKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZywgZW51bSBtZW1jZ19zdGF0X2l0ZW0gaWR4LFxcbi0tXFxubW0vbWVtY29udHJvbC5jLTg4My1cXG5tbS9tZW1jb250cm9sLmM6ODg0OiNpZmRlZiBDT05GSUdfTUVNQ0dfVjFcXG5tbS9tZW1jb250cm9sLmMtODg1LS8qIGlkeCBjYW4gYmUgb2YgdHlwZSBlbnVtIG1lbWNnX3N0YXRfaXRlbSBvciBub2RlX3N0YXRfaXRlbS4gKi9cXG4tLVxcbm1tL21lbWNvbnRyb2wuYz0xMDU5PWJvb2wgbWVtY2dfdm1fZXZlbnRfaXRlbV92YWxpZChlbnVtIHZtX2V2ZW50X2l0ZW0gaWR4KVxcbi0tXFxubW0vbWVtY29udHJvbC5jLTEwNjYtXFxubW0vbWVtY29udHJvbC5jOjEwNjc6I2lmZGVmIENPTkZJR19NRU1DR19WMVxcbm1tL21lbWNvbnRyb2wuYy0xMDY4LXVuc2lnbmVkIGxvbmcgbWVtY2dfZXZlbnRzX2xvY2FsKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZywgaW50IGV2ZW50KVxcbi0tXFxubW0vbWVtY29udHJvbC5jPTE2Njc9dW5zaWduZWQgbG9uZyBtZW1jZ19wYWdlX3N0YXRlX291dHB1dChzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csIGludCBpdGVtKVxcbi0tXFxubW0vbWVtY29udHJvbC5jLTE2NzItXFxubW0vbWVtY29udHJvbC5jOjE2NzM6I2lmZGVmIENPTkZJR19NRU1DR19WMVxcbm1tL21lbWNvbnRyb2wuYy0xNjc0LXVuc2lnbmVkIGxvbmcgbWVtY2dfcGFnZV9zdGF0ZV9sb2NhbF9vdXRwdXQoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLCBpbnQgaXRlbSlcXG4tLVxcbm1tL21lbWNvbnRyb2wuYz0xNjkzPXN0YXRpYyB2b2lkIG1lbWNnX3N0YXRfZm9ybWF0KHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZywgc3RydWN0IHNlcV9idWYgKnMpXFxuLS1cXG5tbS9tZW1jb250cm9sLmMtMTczOS1cXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgQVJSQVlfU0laRShtZW1jZ192bV9ldmVudF9zdGF0KTsgaSsrKSB7XFxubW0vbWVtY29udHJvbC5jOjE3NDA6I2lmZGVmIENPTkZJR19NRU1DR19WMVxcbm1tL21lbWNvbnRyb2wuYy0xNzQxLVxcdFxcdGlmIChtZW1jZ192bV9ldmVudF9zdGF0W2ldID09IFBHUEdJTiB8fFxcbi0tXFxubW0vbWVtY29udHJvbC5jPTE3OTE9dm9pZCBtZW1fY2dyb3VwX3ByaW50X29vbV9tZW1pbmZvKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZylcXG4tLVxcbm1tL21lbWNvbnRyb2wuYy0xODEyLVxcdFxcdFxcdGF0b21pY19sb25nX3JlYWQoXFx1MDAyNm1lbWNnLVxcdTAwM2VtZW1vcnlfZXZlbnRzW01FTUNHX1NXQVBfTUFYXSkpO1xcbm1tL21lbWNvbnRyb2wuYzoxODEzOiNpZmRlZiBDT05GSUdfTUVNQ0dfVjFcXG5tbS9tZW1jb250cm9sLmMtMTgxNC1cXHRlbHNlIHtcXG4tLVxcbm1tL21lbWNvbnRyb2wuYz00MTU3PW1lbV9jZ3JvdXBfY3NzX2FsbG9jKHN0cnVjdCBjZ3JvdXBfc3Vic3lzX3N0YXRlICpwYXJlbnRfY3NzKVxcbi0tXFxubW0vbWVtY29udHJvbC5jLTQxODAtXFx0XFx0cGFnZV9jb3VudGVyX2luaXQoXFx1MDAyNm1lbWNnLVxcdTAwM2Vzd2FwLCBcXHUwMDI2cGFyZW50LVxcdTAwM2Vzd2FwLCBmYWxzZSk7XFxubW0vbWVtY29udHJvbC5jOjQxODE6I2lmZGVmIENPTkZJR19NRU1DR19WMVxcbm1tL21lbWNvbnRyb2wuYy00MTgyLVxcdFxcdG1lbWNnLVxcdTAwM2VtZW1vcnkudHJhY2tfZmFpbGNudCA9ICFtZW1jZ19vbl9kZmw7XFxuLS1cXG5tbS9tZW1jb250cm9sLmMtNDE5MS1cXHRcXHRwYWdlX2NvdW50ZXJfaW5pdChcXHUwMDI2bWVtY2ctXFx1MDAzZXN3YXAsIE5VTEwsIGZhbHNlKTtcXG5tbS9tZW1jb250cm9sLmM6NDE5MjojaWZkZWYgQ09ORklHX01FTUNHX1YxXFxubW0vbWVtY29udHJvbC5jLTQxOTMtXFx0XFx0cGFnZV9jb3VudGVyX2luaXQoXFx1MDAyNm1lbWNnLVxcdTAwM2VrbWVtLCBOVUxMLCBmYWxzZSk7XFxuLS1cXG5tbS9tZW1jb250cm9sLmM9NDM1OT1zdGF0aWMgdm9pZCBtZW1fY2dyb3VwX2Nzc19yZXNldChzdHJ1Y3QgY2dyb3VwX3N1YnN5c19zdGF0ZSAqY3NzKVxcbi0tXFxubW0vbWVtY29udHJvbC5jLTQzNjQtXFx0cGFnZV9jb3VudGVyX3NldF9tYXgoXFx1MDAyNm1lbWNnLVxcdTAwM2Vzd2FwLCBQQUdFX0NPVU5URVJfTUFYKTtcXG5tbS9tZW1jb250cm9sLmM6NDM2NTojaWZkZWYgQ09ORklHX01FTUNHX1YxXFxubW0vbWVtY29udHJvbC5jLTQzNjYtXFx0cGFnZV9jb3VudGVyX3NldF9tYXgoXFx1MDAyNm1lbWNnLVxcdTAwM2VrbWVtLCBQQUdFX0NPVU5URVJfTUFYKTtcXG4tLVxcbm1tL21lbWNvbnRyb2wuYz01MDc2PXN0cnVjdCBjZ3JvdXBfc3Vic3lzIG1lbW9yeV9jZ3JwX3N1YnN5cyA9IHtcXG4tLVxcbm1tL21lbWNvbnRyb2wuYy01MDg3LVxcdC5kZmxfY2Z0eXBlcyA9IG1lbW9yeV9maWxlcyxcXG5tbS9tZW1jb250cm9sLmM6NTA4ODojaWZkZWYgQ09ORklHX01FTUNHX1YxXFxubW0vbWVtY29udHJvbC5jLTUwODktXFx0LmxlZ2FjeV9jZnR5cGVzID0gbWVtX2Nncm91cF9sZWdhY3lfZmlsZXMsXFxuLS1cXG5tbS9tZW1jb250cm9sLmM9NjAyMj1zdGF0aWMgaW50IF9faW5pdCBtZW1fY2dyb3VwX3N3YXBfaW5pdCh2b2lkKVxcbi0tXFxubW0vbWVtY29udHJvbC5jLTYwMjctXFx0V0FSTl9PTihjZ3JvdXBfYWRkX2RmbF9jZnR5cGVzKFxcdTAwMjZtZW1vcnlfY2dycF9zdWJzeXMsIHN3YXBfZmlsZXMpKTtcXG5tbS9tZW1jb250cm9sLmM6NjAyODojaWZkZWYgQ09ORklHX01FTUNHX1YxXFxubW0vbWVtY29udHJvbC5jLTYwMjktXFx0V0FSTl9PTihjZ3JvdXBfYWRkX2xlZ2FjeV9jZnR5cGVzKFxcdTAwMjZtZW1vcnlfY2dycF9zdWJzeXMsIG1lbXN3X2ZpbGVzKSk7XFxuLS1cXG5tbS92bXByZXNzdXJlLXYxLmMtNC0gKiBjZ3JvdXAuZXZlbnRfY29udHJvbCkuIFNwbGl0IG91dCBvZiBtbS92bXByZXNzdXJlLmMgc28gdGhhdCB2Mi1vbmx5XFxubW0vdm1wcmVzc3VyZS12MS5jOjU6ICoga2VybmVscyAoQ09ORklHX01FTUNHX1YxPW4pIGRyb3AgdGhlIHdob2xlIGV2ZW50ZmQgYWNjdW11bGF0b3IsXFxubW0vdm1wcmVzc3VyZS12MS5jLTYtICogaXRzIHdvcmsgaXRlbSwgYW5kIHRoZSBwZXItbWVtY2cgc3RhdGUgaXQgcmVxdWlyZXMuXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA2LTI5VDE0OjM0OjE4LjU3OTU0ODUwNVoiLCJTZXEiOjUsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjE3MTc0NTIyNTc2LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyB0aGUgSW1wYWN0IG9mIHRoZSBgQ09ORklHX01FTUNHX1YxYCBQYXRjaCoqXG5cbk9rYXksIHNvIEknbSBsb29raW5nIGF0IHRoaXMgcGF0Y2ggcmVsYXRlZCB0byB0aGUgYENPTkZJR19NRU1DR19WMWAgY29uZmlnLCB3aGljaCBlbmFibGVzIHRoZSBsZWdhY3kgY2dyb3VwIHYxIG1lbW9yeSBjb250cm9sbGVyLiBNeSBpbml0aWFsIHRob3VnaHQgaXMgdG8gYXNzZXNzIHdoZXRoZXIgdGhpcyB3YXJyYW50cyBmdXp6aW5nLiBUaGUgcGF0Y2ggbW92ZXMgdGhlIHYxIHZtcHJlc3N1cmUgY29kZSBpbnRvIGBtbS92bXByZXNzdXJlLXYxLmNgIGFuZCBndWFyZHMgaXQgd2l0aCBgQ09ORklHX01FTUNHX1YxYC4gSXQgc2VlbXMgbGlrZSBhIHJlZmFjdG9yaW5nLlxuXG5UaGUgcHJvbXB0IGlzIHByZXR0eSBzcGVjaWZpYy4gSXQgdGVsbHMgbWUgdG8gcmV0dXJuIGBXb3J0aEZ1enppbmc9ZmFsc2VgIGlmIHRoZXJlIGFyZSBvbmx5IHRoaW5ncyBsaWtlIGRvY3VtZW50YXRpb24gY2hhbmdlcywgS2NvbmZpZyBmaWxlIG1vZGlmaWNhdGlvbnMsIGNvbW1lbnRzLCBsb2dnaW5nLCBvciBjaGFuZ2VzIHRvIGNvbnN0YW50cyB0aGF0ICpkb24ndCogYWx0ZXIgZXhlY3V0aW9uIGZsb3cuIEl0IGFsc28gc2F5cyB0byBleGNsdWRlIHRoaW5ncyB0aGF0IGFyZSB1bnJlYWNoYWJsZSBpbiBlbXVsYXRlZCBlbnZpcm9ubWVudHMuXG5cblRoZSBtYWluIGZ1bmN0aW9uYWwgY2hhbmdlIHNlZW1zIHRvIGJlIGFuIGVhcmx5IHJldHVybiBvcHRpbWl6YXRpb24gaW4gYG1tL3ZtcHJlc3N1cmUuY2A6XG5gYGBjXG5cdGlmICgoIWNncm91cF9zdWJzeXNfb25fZGZsKG1lbW9yeV9jZ3JwX3N1YnN5cykgXHUwMDI2XHUwMDI2ICF0cmVlKSB8fFxuXHQgICAgKGNncm91cF9zdWJzeXNfb25fZGZsKG1lbW9yeV9jZ3JwX3N1YnN5cykgXHUwMDI2XHUwMDI2IHRyZWUpKVxuXHRcdHJldHVybjtcbmBgYFxuXG5UaGlzICpkb2VzKiBhbHRlciB0aGUgZXhlY3V0aW9uIGZsb3cgb2YgdGhlIGB2bXByZXNzdXJlYCBmdW5jdGlvbiwgc28gSSBuZWVkIHRvIGNhcmVmdWxseSBjb25zaWRlciB0aGlzLiBJdCdzIG5vdCBqdXN0IGEgY29uc3RhbnQgb3IgYSBtYWNybyBjaGFuZ2UuIFRoZSBwYXRjaCBhbHNvIHJlZmFjdG9ycyBieSBtb3ZpbmcgY29kZSB0byBhIG5ldyBmaWxlLCBidXQgdGhhdCBhbG9uZSBkb2Vzbid0IHVzdWFsbHkgcXVhbGlmeS4gSSBuZWVkIHRvIGZpZ3VyZSBvdXQgaWYgdGhpcyBpcyBhY3R1YWxseSBpbXBvcnRhbnQgdG8gdGVzdC5cblxuSWYgSSBkZWNpZGUgdG8gZmxhZyB0aGlzIGFzIGZ1enotd29ydGh5LCBJJ2xsIG5lZWQgdG8gc3BlY2lmeSBgRm9jdXNTeW1ib2xzYCBhbmQgYEVuYWJsZUNvbmZpZ3NgLiBUaGUgZm9jdXMgc3ltYm9scyB3aWxsIGJlOiBgdm1wcmVzc3VyZWAsIGB2bXByZXNzdXJlX3YxX2FjY291bnRfdHJlZWAsIGB2bXByZXNzdXJlX3JlZ2lzdGVyX2V2ZW50YCwgYHZtcHJlc3N1cmVfdW5yZWdpc3Rlcl9ldmVudGAsIGFuZCBgdm1wcmVzc3VyZV9wcmlvYC4gVGhlIGVuYWJsZSBjb25maWdzIGFyZSBgTUVNQ0dfVjFgIGFuZCBgTUVNQ0dgLlxuXG5MZXQncyBkaWcgYSBsaXR0bGUgZGVlcGVyLiBUaGUgYHZtcHJlc3N1cmVfdjFfYWNjb3VudF90cmVlYCBmdW5jdGlvbiBpcyBjYWxsZWQgZnJvbSB3aXRoaW4gYHZtcHJlc3N1cmVgIHdoZW4gYHRyZWVgIGlzIHRydWUuIExldCdzIHNlZSBpZiB0aGVyZSBhcmUgYW55IG90aGVyIGRpZmZlcmVuY2VzLlxuYGBgY1xuXHRpZiAodHJlZSkge1xuXHRcdHZtcHJlc3N1cmVfdjFfYWNjb3VudF90cmVlKHZtcHIsIHNjYW5uZWQsIHJlY2xhaW1lZCk7XG5cdH0gZWxzZSB7XG5gYGBcblxuSW5zcGVjdGluZyBgdm1wcmVzc3VyZV92MV9hY2NvdW50X3RyZWVgIHNob3dzOlxuYGBgY1xudm9pZCB2bXByZXNzdXJlX3YxX2FjY291bnRfdHJlZShzdHJ1Y3Qgdm1wcmVzc3VyZSAqdm1wcixcblx0XHRcdFx0dW5zaWduZWQgbG9uZyBzY2FubmVkLFxuXHRcdFx0XHR1bnNpZ25lZCBsb25nIHJlY2xhaW1lZClcbntcblx0c3Bpbl9sb2NrKFx1MDAyNnZtcHItXHUwMDNlc3JfbG9jayk7XG5cdHNjYW5uZWQgPSB2bXByLVx1MDAzZXRyZWVfc2Nhbm5lZCArPSBzY2FubmVkO1xuXHR2bXByLVx1MDAzZXRyZWVfcmVjbGFpbWVkICs9IHJlY2xhaW1lZDtcblx0c3Bpbl91bmxvY2soXHUwMDI2dm1wci1cdTAwM2Vzcl9sb2NrKTtcblxuXHRpZiAoc2Nhbm5lZCBcdTAwM2Mgdm1wcmVzc3VyZV93aW4pXG5cdFx0cmV0dXJuO1xuXHRzY2hlZHVsZV93b3JrKFx1MDAyNnZtcHItXHUwMDNld29yayk7XG59XG5gYGBcblxuVGhpcyBpcyBpZGVudGljYWwgdG8gd2hhdCB3YXMgdGhlcmUgcHJldmlvdXNseSwgYXMgZmFyIGFzIEkgY2FuIHRlbGwuXG5cblRoZW4sIHRoZSBgdm1wcmVzc3VyZV93b3JrX2ZuYCBmdW5jdGlvbiBpcyBhbHNvIG1vdmVkIHRvIGBtbS92bXByZXNzdXJlLXYxLmNgLCBhbmQgaXQncyBhbHNvIGlkZW50aWNhbC5cbmBgYGNcbnN0YXRpYyB2b2lkIHZtcHJlc3N1cmVfd29ya19mbihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspXG57XG5cdHN0cnVjdCB2bXByZXNzdXJlICp2bXByID0gd29ya190b192bXByZXNzdXJlKHdvcmspO1xuXHR1bnNpZ25lZCBsb25nIHNjYW5uZWQ7XG5cdHVuc2lnbmVkIGxvbmcgcmVjbGFpbWVkO1xuXHRlbnVtIHZtcHJlc3N1cmVfbGV2ZWxzIGxldmVsO1xuXHRib29sIGFuY2VzdG9yID0gZmFsc2U7XG5cdGJvb2wgc2lnbmFsbGVkID0gZmFsc2U7XG5cblx0c3Bpbl9sb2NrKFx1MDAyNnZtcHItXHUwMDNlc3JfbG9jayk7XG4uLi5cbmBgYFxuXG5TbywgdGhlIG9ubHkgZnVuY3Rpb25hbCBjaGFuZ2UgaXMgdGhhdCBlYXJseSByZXR1cm4uXG5gYGBjXG5cdGlmICgoIWNncm91cF9zdWJzeXNfb25fZGZsKG1lbW9yeV9jZ3JwX3N1YnN5cykgXHUwMDI2XHUwMDI2ICF0cmVlKSB8fFxuXHQgICAgKGNncm91cF9zdWJzeXNfb25fZGZsKG1lbW9yeV9jZ3JwX3N1YnN5cykgXHUwMDI2XHUwMDI2IHRyZWUpKVxuXHRcdHJldHVybjtcbmBgYFxuXG5JZiBJIHJldHVybiBgV29ydGhGdXp6aW5nPWZhbHNlYCwgSSBjb3VsZCBiZSBwZW5hbGl6ZWQgaWYgdGhpcyBlYXJseSByZXR1cm4gaXMgZGVlbWVkIGEgZnVuY3Rpb25hbCBjaGFuZ2UuIFRoZSBwcm9tcHQgc3RhdGVzIHRoYXQgb25seSBjaGFuZ2VzIHRvICpudW1lcmljIGNvbnN0YW50cyBvciBtYWNyb3MqIHRoYXQgKmRvbid0KiBmdW5jdGlvbmFsbHkgYWx0ZXIgdGhlIGV4ZWN1dGlvbiBmbG93IHNob3VsZCBiZSBleGNsdWRlZC4gVGhpcyBpcyBhbiBgaWZgIGNvbmRpdGlvbiBpbiBhIGNvcmUgZnVuY3Rpb24gKGB2bXByZXNzdXJlYCksIHNvIEknbSBlcnJpbmcgb24gdGhlIHNpZGUgb2YgY2F1dGlvbi4gSSBhbSBnb2luZyB0byBzYXkgYFdvcnRoRnV6emluZz10cnVlYC5cblxuXG4iLCJJbnB1dFRva2VucyI6MTY4MjksIk91dHB1dFRva2VucyI6MjEsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxMDE0LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA2LTI5VDE0OjM0OjM1Ljc1NDA3NDkzMVoiLCJTZXEiOjYsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjozMDM5MDkwOTE2LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcIl52b2lkIHZtcHJlc3N1cmVcXFxcKFwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJpbmNsdWRlL2xpbnV4L3ZtcHJlc3N1cmUuaD00Mz1zdHJ1Y3QgbWVtX2Nncm91cDtcXG4tLVxcbmluY2x1ZGUvbGludXgvdm1wcmVzc3VyZS5oLTQ1LSNpZmRlZiBDT05GSUdfTUVNQ0dcXG5pbmNsdWRlL2xpbnV4L3ZtcHJlc3N1cmUuaDo0Njp2b2lkIHZtcHJlc3N1cmUoZ2ZwX3QgZ2ZwLCBpbnQgb3JkZXIsIHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZywgYm9vbCB0cmVlLFxcbmluY2x1ZGUvbGludXgvdm1wcmVzc3VyZS5oLTQ3LVxcdFxcdHVuc2lnbmVkIGxvbmcgc2Nhbm5lZCwgdW5zaWduZWQgbG9uZyByZWNsYWltZWQpO1xcbi0tXFxubW0vdm1wcmVzc3VyZS5jPTU3PWVudW0gdm1wcmVzc3VyZV9sZXZlbHMgdm1wcmVzc3VyZV9jYWxjX2xldmVsKHVuc2lnbmVkIGxvbmcgc2Nhbm5lZCxcXG4tLVxcbm1tL3ZtcHJlc3N1cmUuYy0xMDgtICovXFxubW0vdm1wcmVzc3VyZS5jOjEwOTp2b2lkIHZtcHJlc3N1cmUoZ2ZwX3QgZ2ZwLCBpbnQgb3JkZXIsIHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZywgYm9vbCB0cmVlLFxcbm1tL3ZtcHJlc3N1cmUuYy0xMTAtXFx0XFx0dW5zaWduZWQgbG9uZyBzY2FubmVkLCB1bnNpZ25lZCBsb25nIHJlY2xhaW1lZClcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDYtMjlUMTQ6MzQ6MzguNzkzMTcwNTU3WiIsIlNlcSI6NywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MzQ2MjQyODc5NSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgbGV0J3MgZGl2ZSBpbnRvIHRoaXMuIEkgbmVlZCB0byBnZXQgYSBoYW5kbGUgb24gdGhlIHNpdHVhdGlvbiBhbmQgZmlndXJlIG91dCB3aGF0J3MgZ29pbmcgb24uXG5cbioqQW5hbHl6aW5nIHRoZSBgdm1wcmVzc3VyZWAgRnVuY3Rpb24qKlxuXG5SaWdodCwgdGhlIGZpcnN0IHRoaW5nIEkgbmVlZCB0byBkbyBpcyBleGFtaW5lIHRoZSBgdm1wcmVzc3VyZWAgZnVuY3Rpb24gaXRzZWxmLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCBpdHMgcHVycG9zZSwgd2hhdCBpdCdzIGRlc2lnbmVkIHRvIG1lYXN1cmUgb3IgY2FsY3VsYXRlLCBhbmQgbW9zdCBpbXBvcnRhbnRseSwgaG93IGl0J3MgaW1wbGVtZW50ZWQuIEknbSBsb29raW5nIGZvciB0aGUga2V5IGFsZ29yaXRobXMsIGRhdGEgc3RydWN0dXJlcywgYW5kIGFueSBzcGVjaWZpYyBjb25zaWRlcmF0aW9ucyB0aGUgZGV2ZWxvcGVycyBwdXQgaW50byBpdC4gV2hhdCBhc3N1bXB0aW9ucyBkaWQgdGhleSBtYWtlPyBBcmUgdGhlcmUgYW55IHBvdGVudGlhbCBib3R0bGVuZWNrcyBJIHNob3VsZCBiZSBhd2FyZSBvZj8gSSdtIGdvaW5nIHRvIGxvb2sgYXQgdGhlIGNvbW1lbnRzLCB0aGUgdmFyaWFibGUgbmFtZXMsIGFuZCB0aGUgb3ZlcmFsbCBjb250cm9sIGZsb3cgdG8gcXVpY2tseSBncmFzcCB0aGUgZXNzZW5jZSBvZiBpdC4gRGVwZW5kaW5nIG9uIHRoZSBjb21wbGV4aXR5LCBJIG1pZ2h0IG5lZWQgdG8gdHJhY2UgaXRzIGV4ZWN1dGlvbiB3aXRoIHNvbWUgc2FtcGxlIGRhdGEgaW4gbXkgaGVhZCwgYXQgbGVhc3QgZm9yIHRoZSBjcml0aWNhbCBwYXRocy4gTXkgZ29hbCBpcyB0byBxdWlja2x5IHBpbnBvaW50IGFueSBwb3RlbnRpYWwgd2Vha25lc3NlcywgaW50ZXJlc3Rpbmcgb3B0aW1pemF0aW9uIHN0cmF0ZWdpZXMsIG9yIGFueSBhcmVhcyB0aGF0IG1pZ2h0IHJlcXVpcmUgZnVydGhlciBpbnZlc3RpZ2F0aW9uIGJhc2VkIG9uIG15IGV4cGVyaWVuY2UuIEkgd2FudCB0byBidWlsZCBhIG1lbnRhbCBtb2RlbCBvZiB0aGlzIGZ1bmN0aW9uLCBzbyBJIGNhbiBzdGFydCBmb3JtaW5nIG15IGh5cG90aGVzZXMgYW5kIGV2YWx1YXRlIGlmIGl0J3Mgb3BlcmF0aW5nIGFzIGludGVuZGVkLCBhbmQgaG93IGl0IG1pZ2h0IGZpdCBpbnRvIHRoZSBicm9hZGVyIHN5c3RlbSBhcmNoaXRlY3R1cmUuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjE5MTAxLCJPdXRwdXRUb2tlbnMiOjM3LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTMsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDYtMjlUMTQ6MzQ6NDIuMjU1NjAzMDExWiIsIlNlcSI6OCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTQyNjI5LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcIm1tL3ZtcHJlc3N1cmUuY1wiLFxuICBcIkZpcnN0TGluZVwiOiAxMDksXG4gIFwiTGluZUNvdW50XCI6IDEwMFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgMTA5OlxcdHZvaWQgdm1wcmVzc3VyZShnZnBfdCBnZnAsIGludCBvcmRlciwgc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLCBib29sIHRyZWUsXFxuIDExMDpcXHRcXHRcXHR1bnNpZ25lZCBsb25nIHNjYW5uZWQsIHVuc2lnbmVkIGxvbmcgcmVjbGFpbWVkKVxcbiAxMTE6XFx0e1xcbiAxMTI6XFx0XFx0c3RydWN0IHZtcHJlc3N1cmUgKnZtcHI7XFxuIDExMzpcXHRcXG4gMTE0OlxcdFxcdGlmIChtZW1fY2dyb3VwX2Rpc2FibGVkKCkpXFxuIDExNTpcXHRcXHRcXHRyZXR1cm47XFxuIDExNjpcXHRcXG4gMTE3OlxcdFxcdC8qXFxuIDExODpcXHRcXHQgKiBPbmx5IHR3byBjb21iaW5hdGlvbnMgaGF2ZSBhIGNvbnN1bWVyOlxcbiAxMTk6XFx0XFx0ICogICBjZ3JvdXAgdjIgKyB0cmVlPWZhbHNlIC1cXHUwMDNlIGluLWtlcm5lbCBzb2NrZXQgcHJlc3N1cmVcXG4gMTIwOlxcdFxcdCAqICAgY2dyb3VwIHYxICsgdHJlZT10cnVlICAtXFx1MDAzZSB1c2Vyc3BhY2UgZXZlbnRmZHMgKG1lbW9yeS5wcmVzc3VyZV9sZXZlbClcXG4gMTIxOlxcdFxcdCAqIFNraXAgdGhlIG90aGVyIHR3bzogbm90aGluZyBjb25zdW1lcyB0aGUgcmVzdWx0LlxcbiAxMjI6XFx0XFx0ICovXFxuIDEyMzpcXHRcXHRpZiAoKCFjZ3JvdXBfc3Vic3lzX29uX2RmbChtZW1vcnlfY2dycF9zdWJzeXMpIFxcdTAwMjZcXHUwMDI2ICF0cmVlKSB8fFxcbiAxMjQ6XFx0XFx0ICAgIChjZ3JvdXBfc3Vic3lzX29uX2RmbChtZW1vcnlfY2dycF9zdWJzeXMpIFxcdTAwMjZcXHUwMDI2IHRyZWUpKVxcbiAxMjU6XFx0XFx0XFx0cmV0dXJuO1xcbiAxMjY6XFx0XFxuIDEyNzpcXHRcXHR2bXByID0gbWVtY2dfdG9fdm1wcmVzc3VyZShtZW1jZyk7XFxuIDEyODpcXHRcXG4gMTI5OlxcdFxcdC8qXFxuIDEzMDpcXHRcXHQgKiBIZXJlIHdlIG9ubHkgd2FudCB0byBhY2NvdW50IHByZXNzdXJlIHRoYXQgdXNlcmxhbmQgaXMgYWJsZSB0b1xcbiAxMzE6XFx0XFx0ICogaGVscCB1cyB3aXRoLiBGb3IgZXhhbXBsZSwgc3VwcG9zZSB0aGF0IERNQSB6b25lIGlzIHVuZGVyXFxuIDEzMjpcXHRcXHQgKiBwcmVzc3VyZTsgaWYgd2Ugbm90aWZ5IHVzZXJsYW5kIGFib3V0IHRoYXQga2luZCBvZiBwcmVzc3VyZSxcXG4gMTMzOlxcdFxcdCAqIHRoZW4gaXQgd2lsbCBiZSBtb3N0bHkgYSB3YXN0ZSBhcyBpdCB3aWxsIHRyaWdnZXIgdW5uZWNlc3NhcnlcXG4gMTM0OlxcdFxcdCAqIGZyZWVpbmcgb2YgbWVtb3J5IGJ5IHVzZXJsYW5kIChzaW5jZSB1c2VybGFuZCBpcyBtb3JlIGxpa2VseSB0b1xcbiAxMzU6XFx0XFx0ICogaGF2ZSBISUdITUVNL01PVkFCTEUgcGFnZXMgaW5zdGVhZCBvZiB0aGUgRE1BIGZhbGxiYWNrKS4gVGhhdFxcbiAxMzY6XFx0XFx0ICogaXMgd2h5IHdlIGluY2x1ZGUgb25seSBtb3ZhYmxlLCBoaWdobWVtIGFuZCBGUy9JTyBwYWdlcy5cXG4gMTM3OlxcdFxcdCAqIEluZGlyZWN0IHJlY2xhaW0gKGtzd2FwZCkgc2V0cyBzYy1cXHUwMDNlZ2ZwX21hc2sgdG8gR0ZQX0tFUk5FTCwgc29cXG4gMTM4OlxcdFxcdCAqIHdlIGFjY291bnQgaXQgdG9vLlxcbiAxMzk6XFx0XFx0ICovXFxuIDE0MDpcXHRcXHRpZiAoIShnZnAgXFx1MDAyNiAoX19HRlBfSElHSE1FTSB8IF9fR0ZQX01PVkFCTEUgfCBfX0dGUF9JTyB8IF9fR0ZQX0ZTKSkpXFxuIDE0MTpcXHRcXHRcXHRyZXR1cm47XFxuIDE0MjpcXHRcXG4gMTQzOlxcdFxcdC8qXFxuIDE0NDpcXHRcXHQgKiBJZiB3ZSBnb3QgaGVyZSB3aXRoIG5vIHBhZ2VzIHNjYW5uZWQsIHRoZW4gdGhhdCBpcyBhbiBpbmRpY2F0b3JcXG4gMTQ1OlxcdFxcdCAqIHRoYXQgcmVjbGFpbWVyIHdhcyB1bmFibGUgdG8gZmluZCBhbnkgc2hyaW5rYWJsZSBMUlVzIGF0IHRoZVxcbiAxNDY6XFx0XFx0ICogY3VycmVudCBzY2FubmluZyBkZXB0aC4gQnV0IGl0IGRvZXMgbm90IG1lYW4gdGhhdCB3ZSBzaG91bGRcXG4gMTQ3OlxcdFxcdCAqIHJlcG9ydCB0aGUgY3JpdGljYWwgcHJlc3N1cmUsIHlldC4gSWYgdGhlIHNjYW5uaW5nIHByaW9yaXR5XFxuIDE0ODpcXHRcXHQgKiAoc2Nhbm5pbmcgZGVwdGgpIGdvZXMgdG9vIGhpZ2ggKGRlZXApLCB3ZSB3aWxsIGJlIG5vdGlmaWVkXFxuIDE0OTpcXHRcXHQgKiB0aHJvdWdoIHZtcHJlc3N1cmVfcHJpbygpLiBCdXQgc28gZmFyLCBrZWVwIGNhbG0uXFxuIDE1MDpcXHRcXHQgKi9cXG4gMTUxOlxcdFxcdGlmICghc2Nhbm5lZClcXG4gMTUyOlxcdFxcdFxcdHJldHVybjtcXG4gMTUzOlxcdFxcbiAxNTQ6XFx0XFx0aWYgKHRyZWUpIHtcXG4gMTU1OlxcdFxcdFxcdHZtcHJlc3N1cmVfdjFfYWNjb3VudF90cmVlKHZtcHIsIHNjYW5uZWQsIHJlY2xhaW1lZCk7XFxuIDE1NjpcXHRcXHR9IGVsc2Uge1xcbiAxNTc6XFx0XFx0XFx0ZW51bSB2bXByZXNzdXJlX2xldmVscyBsZXZlbDtcXG4gMTU4OlxcdFxcbiAxNTk6XFx0XFx0XFx0LyogRm9yIG5vdywgbm8gdXNlcnMgZm9yIHJvb3QtbGV2ZWwgZWZmaWNpZW5jeSAqL1xcbiAxNjA6XFx0XFx0XFx0aWYgKCFtZW1jZyB8fCBtZW1fY2dyb3VwX2lzX3Jvb3QobWVtY2cpKVxcbiAxNjE6XFx0XFx0XFx0XFx0cmV0dXJuO1xcbiAxNjI6XFx0XFxuIDE2MzpcXHRcXHRcXHRzcGluX2xvY2soXFx1MDAyNnZtcHItXFx1MDAzZXNyX2xvY2spO1xcbiAxNjQ6XFx0XFx0XFx0c2Nhbm5lZCA9IHZtcHItXFx1MDAzZXNjYW5uZWQgKz0gc2Nhbm5lZDtcXG4gMTY1OlxcdFxcdFxcdHJlY2xhaW1lZCA9IHZtcHItXFx1MDAzZXJlY2xhaW1lZCArPSByZWNsYWltZWQ7XFxuIDE2NjpcXHRcXHRcXHRpZiAoc2Nhbm5lZCBcXHUwMDNjIHZtcHJlc3N1cmVfd2luKSB7XFxuIDE2NzpcXHRcXHRcXHRcXHRzcGluX3VubG9jayhcXHUwMDI2dm1wci1cXHUwMDNlc3JfbG9jayk7XFxuIDE2ODpcXHRcXHRcXHRcXHRyZXR1cm47XFxuIDE2OTpcXHRcXHRcXHR9XFxuIDE3MDpcXHRcXHRcXHR2bXByLVxcdTAwM2VzY2FubmVkID0gdm1wci1cXHUwMDNlcmVjbGFpbWVkID0gMDtcXG4gMTcxOlxcdFxcdFxcdHNwaW5fdW5sb2NrKFxcdTAwMjZ2bXByLVxcdTAwM2Vzcl9sb2NrKTtcXG4gMTcyOlxcdFxcbiAxNzM6XFx0XFx0XFx0bGV2ZWwgPSB2bXByZXNzdXJlX2NhbGNfbGV2ZWwoc2Nhbm5lZCwgcmVjbGFpbWVkKTtcXG4gMTc0OlxcdFxcbiAxNzU6XFx0XFx0XFx0LypcXG4gMTc2OlxcdFxcdFxcdCAqIE9uY2Ugd2UgZ28gYWJvdmUgQ09TVExZX09SREVSLCByZWNsYWltIHJlbGllcyBoZWF2aWx5IG9uXFxuIDE3NzpcXHRcXHRcXHQgKiBjb21wYWN0aW9uIHRvIG1ha2UgcHJvZ3Jlc3MuIFJlY2xhaW0gZWZmaWNpZW5jeSB3YXMgbmV2ZXIgYVxcbiAxNzg6XFx0XFx0XFx0ICogZ3JlYXQgcHJveHkgZm9yIHByZXNzdXJlIHRvIGJlZ2luIHdpdGgsIGJ1dCBpdCdzIG91dHJpZ2h0XFxuIDE3OTpcXHRcXHRcXHQgKiBtaXNsZWFkaW5nIHdpdGggdGhlc2UgaGlnaCBvcmRlcnMuIERvbid0IHRocm90dGxlIHNvY2tldHNcXG4gMTgwOlxcdFxcdFxcdCAqIGJlY2F1c2Ugc29tZWJvZHkgaXMgYXR0ZW1wdGluZyBzb21ldGhpbmcgY3JhenkgbGlrZSBhbiBvcmRlci03XFxuIDE4MTpcXHRcXHRcXHQgKiBhbmQgcHJlZGljdGFibHkgc3RydWdnbGluZy5cXG4gMTgyOlxcdFxcdFxcdCAqL1xcbiAxODM6XFx0XFx0XFx0aWYgKGxldmVsIFxcdTAwM2UgVk1QUkVTU1VSRV9MT1cgXFx1MDAyNlxcdTAwMjYgb3JkZXIgXFx1MDAzYz0gUEFHRV9BTExPQ19DT1NUTFlfT1JERVIpIHtcXG4gMTg0OlxcdFxcdFxcdFxcdC8qXFxuIDE4NTpcXHRcXHRcXHRcXHQgKiBMZXQgdGhlIHNvY2tldCBidWZmZXIgYWxsb2NhdG9yIGtub3cgdGhhdFxcbiAxODY6XFx0XFx0XFx0XFx0ICogd2UgYXJlIGhhdmluZyB0cm91YmxlIHJlY2xhaW1pbmcgTFJVIHBhZ2VzLlxcbiAxODc6XFx0XFx0XFx0XFx0ICpcXG4gMTg4OlxcdFxcdFxcdFxcdCAqIEZvciBoeXN0ZXJlc2lzIGtlZXAgdGhlIHByZXNzdXJlIHN0YXRlXFxuIDE4OTpcXHRcXHRcXHRcXHQgKiBhc3NlcnRlZCBmb3IgYSBzZWNvbmQgaW4gd2hpY2ggc3Vic2VxdWVudFxcbiAxOTA6XFx0XFx0XFx0XFx0ICogcHJlc3N1cmUgZXZlbnRzIGNhbiBvY2N1ci5cXG4gMTkxOlxcdFxcdFxcdFxcdCAqL1xcbiAxOTI6XFx0XFx0XFx0XFx0bWVtX2Nncm91cF9zZXRfc29ja2V0X3ByZXNzdXJlKG1lbWNnKTtcXG4gMTkzOlxcdFxcdFxcdH1cXG4gMTk0OlxcdFxcdH1cXG4gMTk1OlxcdH1cXG4gMTk2OlxcdFxcbiAxOTc6XFx0LyoqXFxuIDE5ODpcXHQgKiB2bXByZXNzdXJlX2luaXQoKSAtIEluaXRpYWxpemUgdm1wcmVzc3VyZSBjb250cm9sIHN0cnVjdHVyZVxcbiAxOTk6XFx0ICogQHZtcHI6XFx0U3RydWN0dXJlIHRvIGJlIGluaXRpYWxpemVkXFxuIDIwMDpcXHQgKlxcbiAyMDE6XFx0ICogVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIG9uIGV2ZXJ5IGFsbG9jYXRlZCB2bXByZXNzdXJlIHN0cnVjdHVyZVxcbiAyMDI6XFx0ICogYmVmb3JlIGFueSB1c2FnZS5cXG4gMjAzOlxcdCAqL1xcbiAyMDQ6XFx0dm9pZCB2bXByZXNzdXJlX2luaXQoc3RydWN0IHZtcHJlc3N1cmUgKnZtcHIpXFxuIDIwNTpcXHR7XFxuIDIwNjpcXHRcXHRzcGluX2xvY2tfaW5pdChcXHUwMDI2dm1wci1cXHUwMDNlc3JfbG9jayk7XFxuIDIwNzpcXHRcXHR2bXByZXNzdXJlX3YxX2luaXQodm1wcik7XFxuIDIwODpcXHR9XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA2LTI5VDE0OjM0OjQyLjI1NTc0Nzc2MloiLCJTZXEiOjksIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjEyMTEzNzMwMzI3LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyB0aGUgdm1wcmVzc3VyZSBPcHRpbWl6YXRpb24qKlxuXG5Pa2F5LCBzbyBJJ20gbG9va2luZyBhdCB0aGlzIGNoYW5nZSB0byB0aGUgYHZtcHJlc3N1cmVgIGZ1bmN0aW9uLCB3aGljaCBnZXRzIGNhbGxlZCBmcm9tIHBsYWNlcyBsaWtlIGBzaHJpbmtfbm9kZV9tZW1jZ3NgLiBUaGUgcGF0Y2ggaXMgdHdlYWtpbmcgdGhpcyBlYXJseSByZXR1cm4gY29uZGl0aW9uOlxuXG5gYGBjXG5cdGlmICgoIWNncm91cF9zdWJzeXNfb25fZGZsKG1lbW9yeV9jZ3JwX3N1YnN5cykgXHUwMDI2XHUwMDI2ICF0cmVlKSB8fFxuXHQgICAgKGNncm91cF9zdWJzeXNfb25fZGZsKG1lbW9yeV9jZ3JwX3N1YnN5cykgXHUwMDI2XHUwMDI2IHRyZWUpKVxuXHRcdHJldHVybjtcbmBgYFxuXG5Fc3NlbnRpYWxseSwgdGhlIGxvZ2ljIG5vdyBhdm9pZHMgZG9pbmcgd29yayBpZiB3ZSdyZSBpbiBjZ3JvdXAgdjIgKGBjZ3JvdXBfc3Vic3lzX29uX2RmbGAgaXMgdHJ1ZSkgKmFuZCogdGhlIGB0cmVlYCB2YXJpYWJsZSBpcyBhbHNvIHRydWUuIFByZXZpb3VzbHksIGl0IHdvdWxkIG9ubHkgc2hvcnQtY2lyY3VpdCBpZiB3ZSB3ZXJlbid0IGluIHYyIGFuZCBgdHJlZWAgd2FzIGFsc28gZmFsc2UuIFRoaXMgaXMgZGVmaW5pdGVseSBhICpmdW5jdGlvbmFsKiBjaGFuZ2UgYmVjYXVzZSBpdCBhbHRlcnMgdGhlIGV4ZWN1dGlvbiBwYXRoLlxuXG5UaGUgb2xkIGNvZGUsIGluIHRoaXMgdjIgYW5kIGB0cmVlPXRydWVgIHNjZW5hcmlvLCB3b3VsZCBjb250aW51ZSwgaW5jcmVtZW50IGNvdW50ZXJzIHVuZGVyIGEgc3BpbmxvY2sgKGB2bXByLVx1MDAzZXNyX2xvY2tgKSwgYW5kIHNjaGVkdWxlIHNvbWUgd29yay4gVGhpcyB3b3JrLCBob3dldmVyLCB1bHRpbWF0ZWx5IHdvdWxkIGRvIG5vdGhpbmcgYmVjYXVzZSBgdm1wcmVzc3VyZV9yZWdpc3Rlcl9ldmVudGAgaXMgbmV2ZXIgY2FsbGVkIHVuZGVyIGNncm91cCB2Mi4gU28gdGhpcyBvcHRpbWl6YXRpb24gc2tpcHMgdGhlIGxvY2ssIHRoZSBjb3VudGVyIHVwZGF0ZXMsIGFuZCB0aGUgcG9pbnRsZXNzIHdvcmsgc2NoZWR1bGluZy4gSXQncyByZWFsbHkganVzdCBhdm9pZGluZyBhbiBvdmVyaGVhZC5cblxuVGhlIGJpZyBxdWVzdGlvbiBpcyB3aGV0aGVyIHRoaXMgaXMgd29ydGggZnV6emluZy4gSXQncyBhIHJlbGF0aXZlbHkgbWlub3Igb3B0aW1pemF0aW9uIGluIHRlcm1zIG9mIGltcGFjdCwgYnV0IHRoZSBjaGFuZ2UgKmFsc28qIG1vdmVzIHRoZSBjb2RlIHRvIGEgbmV3IGZpbGUsIHdoaWNoIGlzIGEgc3RydWN0dXJhbCBjaGFuZ2UsIGFuZCB0aGF0J3Mgc29tZXRoaW5nIEkgbmVlZCB0byBjb25zaWRlciB0b28uXG5cbklmIEkgd2VyZSB0byBzYXkgXCJXb3J0aEZ1enppbmc9dHJ1ZSxcIiB0aGVuIEknZCBiZSBsb29raW5nIGF0IGB2bXByZXNzdXJlYCwgYHZtcHJlc3N1cmVfdjFfYWNjb3VudF90cmVlYCwgYHZtcHJlc3N1cmVfcmVnaXN0ZXJfZXZlbnRgLCBgdm1wcmVzc3VyZV91bnJlZ2lzdGVyX2V2ZW50YCwgYW5kIGB2bXByZXNzdXJlX3ByaW9gLiBUaGUgcmVsZXZhbnQgY29uZmlndXJhdGlvbnMgYXJlIGBNRU1DR19WMWAgYW5kIGBNRU1DR2AuXG5cbk5vdywgSSBzaG91bGQgY2hlY2sgdGhhdCBgdm1wcmVzc3VyZV92MV9hY2NvdW50X3RyZWVgICppcyogYWN0dWFsbHkgcmVhY2hhYmxlLiBZZXMsIGlmIGBDT05GSUdfTUVNQ0dfVjFgIGlzIGVuYWJsZWQgYW5kIHdlJ3JlICphY3R1YWxseSogb24gY2dyb3VwIHYxLCB0aGVuIGB2bXByZXNzdXJlYCB3aWxsIGNvcnJlY3RseSBjYWxsIGB2bXByZXNzdXJlX3YxX2FjY291bnRfdHJlZWAuIFdoYXQgYWJvdXQgYHZtcHJlc3N1cmVfcmVnaXN0ZXJfZXZlbnRgPyBMZXQgbWUgc2VlLiBBaCwgeWVzLCBpdCdzIGNhbGxlZCBmcm9tIGBtZW1fY2dyb3VwX3VzYWdlX3JlZ2lzdGVyX2V2ZW50YCBhbmQgc2ltaWxhciBpbiBgbW0vbWVtY29udHJvbC12MS5jYC4gR29vZCwgbGV0IG1lIGp1c3QgdmVyaWZ5IHRoYXQuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjIwOTY4LCJPdXRwdXRUb2tlbnMiOjIyLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NjI5LCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDYtMjlUMTQ6MzQ6NTQuMzY5NDgxMDg4WiIsIlNlcSI6MTAsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyNDY5NzMxNTMxLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcInZtcHJlc3N1cmVfcmVnaXN0ZXJfZXZlbnRcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiaW5jbHVkZS9saW51eC92bXByZXNzdXJlLmg9NTk9ZXh0ZXJuIHZvaWQgdm1wcmVzc3VyZV9wcmlvKGdmcF90IGdmcCwgc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLCBpbnQgcHJpbyk7XFxuaW5jbHVkZS9saW51eC92bXByZXNzdXJlLmg6NjA6ZXh0ZXJuIGludCB2bXByZXNzdXJlX3JlZ2lzdGVyX2V2ZW50KHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZyxcXG5pbmNsdWRlL2xpbnV4L3ZtcHJlc3N1cmUuaC02MS1cXHRcXHRcXHRcXHQgICAgIHN0cnVjdCBldmVudGZkX2N0eCAqZXZlbnRmZCxcXG4tLVxcbm1tL21lbWNvbnRyb2wtdjEuYz0xMDk1PXN0YXRpYyBzc2l6ZV90IG1lbWNnX3dyaXRlX2V2ZW50X2NvbnRyb2woc3RydWN0IGtlcm5mc19vcGVuX2ZpbGUgKm9mLFxcbi0tXFxubW0vbWVtY29udHJvbC12MS5jLTExOTEtXFx0XFx0XFx0ICAgICBcXFwiaWYgeW91IGRlcGVuZCBvbiB0aGlzIGZ1bmN0aW9uYWxpdHkuXFxcXG5cXFwiKTtcXG5tbS9tZW1jb250cm9sLXYxLmM6MTE5MjpcXHRcXHRldmVudC1cXHUwMDNlcmVnaXN0ZXJfZXZlbnQgPSB2bXByZXNzdXJlX3JlZ2lzdGVyX2V2ZW50O1xcbm1tL21lbWNvbnRyb2wtdjEuYy0xMTkzLVxcdFxcdGV2ZW50LVxcdTAwM2V1bnJlZ2lzdGVyX2V2ZW50ID0gdm1wcmVzc3VyZV91bnJlZ2lzdGVyX2V2ZW50O1xcbi0tXFxubW0vdm1wcmVzc3VyZS12MS5jPTE5MD12b2lkIHZtcHJlc3N1cmVfcHJpbyhnZnBfdCBnZnAsIHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZywgaW50IHByaW8pXFxuLS1cXG5tbS92bXByZXNzdXJlLXYxLmMtMjExLS8qKlxcbm1tL3ZtcHJlc3N1cmUtdjEuYzoyMTI6ICogdm1wcmVzc3VyZV9yZWdpc3Rlcl9ldmVudCgpIC0gQmluZCB2bXByZXNzdXJlIG5vdGlmaWNhdGlvbnMgdG8gYW4gZXZlbnRmZFxcbm1tL3ZtcHJlc3N1cmUtdjEuYy0yMTMtICogQG1lbWNnOlxcdG1lbWNnIHRoYXQgaXMgaW50ZXJlc3RlZCBpbiB2bXByZXNzdXJlIG5vdGlmaWNhdGlvbnNcXG4tLVxcbm1tL3ZtcHJlc3N1cmUtdjEuYy0yMjgtICovXFxubW0vdm1wcmVzc3VyZS12MS5jOjIyOTppbnQgdm1wcmVzc3VyZV9yZWdpc3Rlcl9ldmVudChzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csXFxubW0vdm1wcmVzc3VyZS12MS5jLTIzMC1cXHRcXHRcXHQgICAgICBzdHJ1Y3QgZXZlbnRmZF9jdHggKmV2ZW50ZmQsIGNvbnN0IGNoYXIgKmFyZ3MpXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA2LTI5VDE0OjM0OjU2LjgzOTIxOTUxOVoiLCJTZXEiOjExLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjoxNDM1MzczNDA3OSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXNpcyBvZiB0aGUgUGF0Y2ggZm9yIEZ1enppbmcgV29ydGhpbmVzcyoqXG5cbk9rYXksIHNvIEknbSBsb29raW5nIGF0IHRoaXMgcGF0Y2ggYW5kIG15IGluaXRpYWwgdGhvdWdodCBpcywgeWVzLCBgdm1wcmVzc3VyZV9yZWdpc3Rlcl9ldmVudGAgaXMgZGVmaW5pdGVseSB1c2VkIHdpdGhpbiBgbWVtY2dfd3JpdGVfZXZlbnRfY29udHJvbGAsIHdoaWNoIG1lYW5zIHRoaXMgaXMgYWJzb2x1dGVseSBjb3JlIGtlcm5lbCBsb2dpYyB0aGF0J3MgcmVhY2hhYmxlLiBUaGUgcGF0Y2ggaXMgZG9pbmcgYSByZWZhY3RvciBhbmQgaW50cm9kdWNpbmcgYW4gb3B0aW1pemF0aW9uOyBJIHRoaW5rIHRoaXMgbG9va3MgcHJldHR5IGdvb2QuIE15IGZpcnN0IGluY2xpbmF0aW9uIGlzIHRvIHNldCBgV29ydGhGdXp6aW5nPXRydWVgLlxuXG5Ob3csIGxldCBtZSBtYWtlIHN1cmUgSSdtIGNhcHR1cmluZyBhbGwgdGhlIHJlbGV2YW50IHN5bWJvbHMuIEknbGwgam90IGRvd246IGB2bXByZXNzdXJlYCwgYHZtcHJlc3N1cmVfdjFfYWNjb3VudF90cmVlYCwgYHZtcHJlc3N1cmVfcmVnaXN0ZXJfZXZlbnRgLCBgdm1wcmVzc3VyZV91bnJlZ2lzdGVyX2V2ZW50YCwgYW5kIGB2bXByZXNzdXJlX3ByaW9gLiBGb3IgdGhlIGNvbmZpZ3MsIEkgbmVlZCB0byBtYWtlIHN1cmUgSSBpbmNsdWRlIGBNRU1DR2AsIGFzIHRoYXQncyBlc3NlbnRpYWwgZm9yIGB2bXByZXNzdXJlYCB0byBldmVuIGNvbXBpbGUuIEFsc28sIGl0IGxvb2tzIGxpa2UgYE1FTUNHX1YxYCBpcyB0aGUgbmV3IGNvbmZpZyBndWFyZGluZyB0aGUgdjEtc3BlY2lmaWMgY29kZS4gTGV0IG1lIHF1aWNrbHkgZG91YmxlLWNoZWNrIHRoZSBgS2NvbmZpZ2AgdG8gYmUgc3VyZSB0aGF0IGBNRU1DR19WMWAgaXNuJ3QgZW5hYmxlZCBieSBkZWZhdWx0LiBBaCwgeWVzLCBpdCdzIGV4cGxpY2l0bHkgYSBib29sZWFuLiBTbywgYm90aCBgTUVNQ0dgIGFuZCBgTUVNQ0dfVjFgIHdpbGwgZ28gaW50byBteSBgRW5hYmxlQ29uZmlnc2AuXG5cbk5vdywgSSBuZWVkIHRvIHJlbWluZCBteXNlbGYgd2hhdCB0aGUgcHJvbXB0IHNhaWQgcmVnYXJkaW5nIGBXb3J0aEZ1enppbmc9ZmFsc2VgLiBJdCB3YXMgc29tZXRoaW5nIGFsb25nIHRoZSBsaW5lcyBvZiBcIm1vZGlmaWNhdGlvbnMgdG8gZG9jdW1lbnRhdGlvbiwgS2NvbmZpZywgY29kZSBjb21tZW50czsgZGVjb3JhdGl2ZSBjaGFuZ2VzIGxpa2UgbG9nZ2luZzsgY2hhbmdlcyB0byBjb25zdGFudHMvbWFjcm9zIHRoYXQgZG9uJ3QgYWx0ZXIgZXhlY3V0aW9uOyBhbmQgdW5yZWFjaGFibGUgY29kZSBwYXRocy5cIlxuXG5CdXQgdGhpcyBwYXRjaCAqaXMqIGFsdGVyaW5nIGV4ZWN1dGlvbiBmbG93IHdpdGggYW4gb3B0aW1pemF0aW9uISBJdCBhbHNvIGluY2x1ZGVzIHN0cnVjdHVyYWwgY2hhbmdlcyBieSBtb3ZpbmcgY29kZSB0byBhIG5ldyBmaWxlLiBUaGUgcXVlc3Rpb24gaXMgd2hldGhlciBpdCdzICpwdXJlbHkqIHJlZmFjdG9yaW5nLCBidXQgdGhhdCdzIG5vdCB0aGUgY2FzZS4gVGhlIGZ1bmN0aW9uYWwgY2hhbmdlIGluIGB2bXByZXNzdXJlYCBpcyB0aGUga2V5LiBUaGUgb3B0aW1pemF0aW9uIGluIGB2bXByZXNzdXJlYCBpcyB0aGUgZnVuY3Rpb25hbCBjaGFuZ2UsIGNvbWJpbmVkIHdpdGggdGhlIGZhY3QgdGhhdCBpdCBleHRyYWN0cyBgdm1wcmVzc3VyZS12MS5jYCwgYnV0IGFsc28gaW50cm9kdWNlcyBhIG5ldyBjb25maWcgYENPTkZJR19NRU1DR19WMWAgdGhhdCBjYW4gYmUgZGlzYWJsZWQgdG8gcmVtb3ZlIHRoZSBjb2RlLiBUaGVyZWZvcmUsIGl0J3MgYSBmdW5jdGlvbmFsIGNoYW5nZSB0aGF0IGFsdGVycyBob3cgdGhlIGNvcmUgbWVtb3J5IG1hbmFnZW1lbnQgbG9naWMgd29ya3MuIFRoZSBwcm9tcHQgc2F5cyB0aGF0IGlmIHRoZSBwYXRjaCBtb2RpZmllcyByZWFjaGFibGUgY29yZSBrZXJuZWwgbG9naWMgYW5kIGFsdGVycyBleGVjdXRpb24sIEkgc2hvdWxkIHJldHVybiBgV29ydGhGdXp6aW5nPXRydWVgLlxuXG5Ib2xkIG9uLiBUaGUgcHJvbXB0ICpkb2VzKiBzYXkgXCJSZXR1cm4gV29ydGhGdXp6aW5nPWZhbHNlIGlmIHRoZSBwYXRjaCBvbmx5IGNvbnRhaW5zIC4uLlwiLiBJdCBkb2Vzbid0IGV4cGxpY2l0bHkgdGFsayBhYm91dCByZWZhY3RvcmluZywgYnV0IHR5cGljYWxseSByZWZhY3RvcmluZyBhbG9uZSB3aXRob3V0IGEgZnVuY3Rpb25hbCBjaGFuZ2Ugd291bGRuJ3QgYmUgd29ydGggZnV6emluZywgYXMgaXQncyBqdXN0IGNvZGUgcmVvcmdhbml6YXRpb24uIEJ1dCB0aGlzIHBhdGNoICpkb2VzKiBpbnRyb2R1Y2UgYSBmdW5jdGlvbmFsIGNoYW5nZTpcblxuYGBgY1xuXHRpZiAoKCFjZ3JvdXBfc3Vic3lzX29uX2RmbChtZW1vcnlfY2dycF9zdWJzeXMpIFx1MDAyNlx1MDAyNiAhdHJlZSkgfHxcblx0ICAgIChjZ3JvdXBfc3Vic3lzX29uX2RmbChtZW1vcnlfY2dycF9zdWJzeXMpIFx1MDAyNlx1MDAyNiB0cmVlKSlcblx0XHRyZXR1cm47XG5gYGBcblxuVGhpcyBjaGFuZ2VzIHRoZSBiZWhhdmlvciBpbiBjZ3JvdXAgdjIgd2hlbiBgdHJlZT10cnVlYC4gSXQgbm93IHJldHVybnMgZWFybHkgaW5zdGVhZCBvZiBhY2N1bXVsYXRpbmcgY291bnRlcnMgYW5kIHNjaGVkdWxpbmcgd29yayBpdGVtcy4gU28sIHRoaXMgaXMgZGVmaW5pdGVseSBhIGZ1bmN0aW9uYWwgY2hhbmdlLlxuXG5MZXQgbWUgbWFrZSB0aGlzIHJlYWxseSBjbGVhci4gVGhlIHBhdGNoIHNwbGl0cyBjZ3JvdXAgdjEncyBgdm1wcmVzc3VyZWAgY29kZSBpbnRvIGEgc2VwYXJhdGUgZmlsZSAoYG1tL3ZtcHJlc3N1cmUtdjEuY2ApIGd1YXJkZWQgYnkgYENPTkZJR19NRU1DR19WMWAuIEl0ICphbHNvKiBoYXMgYSBmdW5jdGlvbmFsIG9wdGltaXphdGlvbiBpbiBgdm1wcmVzc3VyZSgpYC4gVGhpcyBlYXJseSBleGl0IG9wdGltaXphdGlvbiBhdm9pZHMgdW5uZWNlc3NhcnkgY291bnRlciBhY2N1bXVsYXRpb24gYW5kIHdvcmsgc2NoZWR1bGluZy4gVGhpcyBtb2RpZmljYXRpb24gYWZmZWN0cyByZWFjaGFibGUgY29yZSBtZW1vcnkgbWFuYWdlbWVudCBsb2dpYyBhbmQgYWx0ZXJzIGV4ZWN1dGlvbiBmbG93LCBzbyBJJ20gY29uZmlkZW50IHRoYXQgaXQgaXMgd29ydGggZnV6emluZy4gSSdsbCBzdGlsbCBpbmNsdWRlIHRoZSBmb2N1cyBzeW1ib2xzIGFuZCB0aGUgZW5hYmxpbmcgY29uZmlndXJhdGlvbnMuXG5cbkZvY3VzIFN5bWJvbHM6XG4tIGB2bXByZXNzdXJlYFxuLSBgdm1wcmVzc3VyZV92MV9hY2NvdW50X3RyZWVgXG4tIGB2bXByZXNzdXJlX3JlZ2lzdGVyX2V2ZW50YFxuLSBgdm1wcmVzc3VyZV91bnJlZ2lzdGVyX2V2ZW50YFxuLSBgdm1wcmVzc3VyZV9wcmlvYFxuLSBgdm1wcmVzc3VyZV93b3JrX2ZuYFxuLSBgdm1wcmVzc3VyZV9ldmVudGBcblxuRW5hYmxlQ29uZmlnczpcbi0gYE1FTUNHYFxuLSBgTUVNQ0dfVjFgXG5cbkp1c3QgdG8gbWFrZSBzdXJlIEknbSB0aG9yb3VnaCwgbGV0IG1lIG5vdGUgdGhhdCBgdm1wcmVzc3VyZV93b3JrX2ZuYCBpcyBtb3ZlZCB0byBgbW0vdm1wcmVzc3VyZS12MS5jYCBhcyBpcyBgdm1wcmVzc3VyZV9ldmVudGAgYW5kIGB2bXByZXNzdXJlX2NhbGNfbGV2ZWxgIGlzIG5vdyBleHBvc2VkLiBgdm1wcmVzc3VyZV92MV9pbml0YCBhbmQgYHZtcHJlc3N1cmVfdjFfY2xlYW51cGAgYXJlIG5ldy4gRXZlbiB0aG91Z2ggYHZtcHJlc3N1cmVfd29ya19mbmAgYW5kIGB2bXByZXNzdXJlX2V2ZW50YCBhcmUgc3RhdGljXG5cbiIsIklucHV0VG9rZW5zIjoyMjY3NSwiT3V0cHV0VG9rZW5zIjoyMiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjExMzcsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDYtMjlUMTQ6MzU6MTEuMTkyOTU1Njg4WiIsIlNlcSI6MTIsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyNDkxNzgxMTQ5LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcInZtcHJlc3N1cmVfd29ya19mblwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJtbS92bXByZXNzdXJlLXYxLmM9ODM9c3RhdGljIGJvb2wgdm1wcmVzc3VyZV9ldmVudChzdHJ1Y3Qgdm1wcmVzc3VyZSAqdm1wcixcXG4tLVxcbm1tL3ZtcHJlc3N1cmUtdjEuYy0xMDUtXFxubW0vdm1wcmVzc3VyZS12MS5jOjEwNjpzdGF0aWMgdm9pZCB2bXByZXNzdXJlX3dvcmtfZm4oc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKVxcbm1tL3ZtcHJlc3N1cmUtdjEuYy0xMDcte1xcbi0tXFxubW0vdm1wcmVzc3VyZS12MS5jPTE2Mz12b2lkIHZtcHJlc3N1cmVfdjFfaW5pdChzdHJ1Y3Qgdm1wcmVzc3VyZSAqdm1wcilcXG4tLVxcbm1tL3ZtcHJlc3N1cmUtdjEuYy0xNjYtXFx0SU5JVF9MSVNUX0hFQUQoXFx1MDAyNnZtcHItXFx1MDAzZWV2ZW50cyk7XFxubW0vdm1wcmVzc3VyZS12MS5jOjE2NzpcXHRJTklUX1dPUksoXFx1MDAyNnZtcHItXFx1MDAzZXdvcmssIHZtcHJlc3N1cmVfd29ya19mbik7XFxubW0vdm1wcmVzc3VyZS12MS5jLTE2OC19XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA2LTI5VDE0OjM1OjEzLjY4NDc0NjA3N1oiLCJTZXEiOjEzLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo4NTc3MzY5MDY5LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKlJlZmluaW5nIHRoZSBWTVByZXNzdXJlIExvZ2ljKipcblxuT2theSwgc28gSSd2ZSBjb25maXJtZWQgdGhhdCB0aG9zZSBzeW1ib2xzIGFyZSBpbmRlZWQgc3RhdGljLiBUaGF0IG1lYW5zIEkgbmVlZCB0byBpbmNsdWRlIGB2bXByZXNzdXJlX3dvcmtfZm5gIGFuZCBgdm1wcmVzc3VyZV9ldmVudGAgaW4gRm9jdXNTeW1ib2xzLiBFeHBhbmRpbmcgbXkgZm9jdXMsIEknbGwgdXBkYXRlIHRoYXQgbGlzdDpcblxuKiAgIGB2bXByZXNzdXJlYFxuKiAgIGB2bXByZXNzdXJlX3YxX2FjY291bnRfdHJlZWBcbiogICBgdm1wcmVzc3VyZV93b3JrX2ZuYFxuKiAgIGB2bXByZXNzdXJlX2V2ZW50YFxuKiAgIGB2bXByZXNzdXJlX3JlZ2lzdGVyX2V2ZW50YFxuKiAgIGB2bXByZXNzdXJlX3VucmVnaXN0ZXJfZXZlbnRgXG4qICAgYHZtcHJlc3N1cmVfcHJpb2BcblxuTm93LCBsZXQncyBicmVhayBkb3duIHRoZSByZWFzb25pbmcgYmVoaW5kIHRoaXMuIFRoZSBwYXRjaCBpcyBjbGVhcmx5IGRvaW5nIHNvbWUgdGFyZ2V0ZWQgcmVmYWN0b3JpbmcuIEl0J3MgbW92aW5nIHRoZSBjZ3JvdXAgdjEgc3BlY2lmaWMgYHZtcHJlc3N1cmVgIGNvZGUgaW50byBpdHMgb3duIGZpbGUsIGBtbS92bXByZXNzdXJlLXYxLmNgLCBhbmQgdGhhdCdzIGd1YXJkZWQgYnkgdGhlIGBDT05GSUdfTUVNQ0dfVjFgIGZsYWcuIFNtYXJ0LiBJdCdzIGFsc28gb3B0aW1pemluZyB0aGUgYHZtcHJlc3N1cmUoKWAgZnVuY3Rpb24gaXRzZWxmLCBzcGVjaWZpY2FsbHkgZm9yIGNncm91cCB2MiB3aGVuIGEgYHRyZWU9dHJ1ZWAgc2NlbmFyaW8uIFRoYXQncyBhIGdvb2QgcGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uLCBza2lwcGluZyB1bm5lY2Vzc2FyeSBjb3VudGVyIGFjY3VtdWxhdGlvbiBhbmQgd29yayBzY2hlZHVsaW5nLiBUaGlzIHRvdWNoZXMgY29yZSBtZW1vcnkgbWFuYWdlbWVudCBsb2dpYyBhbmQsIGNyaXRpY2FsbHksIGFsdGVycyB0aGUgZXhlY3V0aW9uIGZsb3cgb2YgdGhlIHJlbGF0ZWQgZnVuY3Rpb25zLiBUaGF0IHNpZ25hbHMgYSBuZWVkIGZvciBmdXp6aW5nLiBHaXZlbiB0aGUgbW9kaWZpY2F0aW9uIHRvIHJlYWNoYWJsZSBjb2RlLCBhbmQgdGhlIGFsdGVyaW5nIG9mIHRoZSBjb2RlIHBhdGggYmFzZWQgb24gYHRyZWU9dHJ1ZWAsIGl0J3MgZnV6eiB0aW1lLlxuXG5BbHJpZ2h0LCBJJ2xsIGNhbGwgYHNldC1yZXN1bHRzYCBub3cuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjI1MDk5LCJPdXRwdXRUb2tlbnMiOjIxMSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjIzMiwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wNi0yOVQxNDozNToyMi4yNjIxMTgwNDZaIiwiU2VxIjoxNCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoic2V0LXJlc3VsdHMiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMzQ5ODkyMDgsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIk1FTUNHXCIsXG4gICAgXCJNRU1DR19WMVwiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcInZtcHJlc3N1cmVcIixcbiAgICBcInZtcHJlc3N1cmVfdjFfYWNjb3VudF90cmVlXCIsXG4gICAgXCJ2bXByZXNzdXJlX3dvcmtfZm5cIixcbiAgICBcInZtcHJlc3N1cmVfZXZlbnRcIixcbiAgICBcInZtcHJlc3N1cmVfcmVnaXN0ZXJfZXZlbnRcIixcbiAgICBcInZtcHJlc3N1cmVfdW5yZWdpc3Rlcl9ldmVudFwiLFxuICAgIFwidm1wcmVzc3VyZV9wcmlvXCJcbiAgXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggZXh0cmFjdHMgY2dyb3VwIHYxIHNwZWNpZmljIHZtcHJlc3N1cmUgbG9naWMgaW50byBhIG5ldyBmaWxlIGBtbS92bXByZXNzdXJlLXYxLmNgIGd1YXJkZWQgYnkgYENPTkZJR19NRU1DR19WMWAuIEl0IGFsc28gaW50cm9kdWNlcyBhIGZ1bmN0aW9uYWwgb3B0aW1pemF0aW9uIGluIGB2bXByZXNzdXJlKClgIHRvIHJldHVybiBlYXJseSBmb3IgY2dyb3VwIHYyIHdoZW4gYHRyZWU9dHJ1ZWAsIGF2b2lkaW5nIHVubmVjZXNzYXJ5IGNvdW50ZXIgYWNjdW11bGF0aW9uIGFuZCB3b3JrIHNjaGVkdWxpbmcuIFRoaXMgbW9kaWZpZXMgcmVhY2hhYmxlIGNvcmUgbWVtb3J5IG1hbmFnZW1lbnQgbG9naWMgYW5kIGFsdGVycyBleGVjdXRpb24gZmxvdywgc28gaXQgc2hvdWxkIGJlIGZ1enplZC5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJNRU1DR1wiLFxuICAgIFwiTUVNQ0dfVjFcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJ2bXByZXNzdXJlXCIsXG4gICAgXCJ2bXByZXNzdXJlX3YxX2FjY291bnRfdHJlZVwiLFxuICAgIFwidm1wcmVzc3VyZV93b3JrX2ZuXCIsXG4gICAgXCJ2bXByZXNzdXJlX2V2ZW50XCIsXG4gICAgXCJ2bXByZXNzdXJlX3JlZ2lzdGVyX2V2ZW50XCIsXG4gICAgXCJ2bXByZXNzdXJlX3VucmVnaXN0ZXJfZXZlbnRcIixcbiAgICBcInZtcHJlc3N1cmVfcHJpb1wiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGV4dHJhY3RzIGNncm91cCB2MSBzcGVjaWZpYyB2bXByZXNzdXJlIGxvZ2ljIGludG8gYSBuZXcgZmlsZSBgbW0vdm1wcmVzc3VyZS12MS5jYCBndWFyZGVkIGJ5IGBDT05GSUdfTUVNQ0dfVjFgLiBJdCBhbHNvIGludHJvZHVjZXMgYSBmdW5jdGlvbmFsIG9wdGltaXphdGlvbiBpbiBgdm1wcmVzc3VyZSgpYCB0byByZXR1cm4gZWFybHkgZm9yIGNncm91cCB2MiB3aGVuIGB0cmVlPXRydWVgLCBhdm9pZGluZyB1bm5lY2Vzc2FyeSBjb3VudGVyIGFjY3VtdWxhdGlvbiBhbmQgd29yayBzY2hlZHVsaW5nLiBUaGlzIG1vZGlmaWVzIHJlYWNoYWJsZSBjb3JlIG1lbW9yeSBtYW5hZ2VtZW50IGxvZ2ljIGFuZCBhbHRlcnMgZXhlY3V0aW9uIGZsb3csIHNvIGl0IHNob3VsZCBiZSBmdXp6ZWQuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfV07CgkJCWlmICghcmF3RGF0YSB8fCByYXdEYXRhLmxlbmd0aCA9PT0gMCkgcmV0dXJuOwoKCQkJZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSk7CgkJCWRyYXdEdXJhdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCQlkcmF3VG9rZW5Db25zdW1wdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSkgewoJCQljb25zdCBzdGF0cyA9IHsKCQkJCWxsbTogeyBjb3VudDogMCwgdG9rZW5zOiAwLCBkdXJhdGlvbjogMCB9LAoJCQkJdG9vbDogeyBjb3VudDogMCwgZHVyYXRpb246IDAgfQoJCQl9OwoKCQkJcmF3RGF0YS5mb3JFYWNoKHMgPT4gewoJCQkJY29uc3QgZHVyID0gcy5EdXJhdGlvbiAvIDEwMDAwMDAwMDA7IAoJCQkJaWYgKHMuVHlwZSA9PT0gImxsbSIpIHsKCQkJCQlzdGF0cy5sbG0uY291bnQrKzsKCQkJCQlzdGF0cy5sbG0udG9rZW5zICs9IChzLklucHV0VG9rZW5zICsgcy5PdXRwdXRUb2tlbnMgKyBzLk91dHB1dFRob3VnaHRzVG9rZW5zKTsKCQkJCQlzdGF0cy5sbG0uZHVyYXRpb24gKz0gZHVyOwoJCQkJfSBlbHNlIGlmIChzLlR5cGUgPT09ICJ0b29sIikgewoJCQkJCXN0YXRzLnRvb2wuY291bnQrKzsKCQkJCQlzdGF0cy50b29sLmR1cmF0aW9uICs9IGR1cjsKCQkJCX0KCQkJfSk7CgoJCQljb25zdCBhdmdMbG1EdXIgPSBzdGF0cy5sbG0uY291bnQgPiAwID8gKHN0YXRzLmxsbS5kdXJhdGlvbiAvIHN0YXRzLmxsbS5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgkJCWNvbnN0IGF2Z0xsbVRva2VuID0gc3RhdHMubGxtLmNvdW50ID4gMCA/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-workflowxpg5z[1] Phase: Succeeded StartedAt: 2026-06-29 14:35:34 +0000 UTC FinishedAt: 2026-06-29 14:35:35 +0000 UTC Input: nil Output: nil --------- Name: series-workflowxpg5z[1].abort-on-skip-outcome Phase: Skipped StartedAt: 2026-06-29 14:35:35 +0000 UTC FinishedAt: 2026-06-29 14:35:35 +0000 UTC Input: nil Output: nil --------- Name: series-workflowxpg5z[2] Phase: Succeeded StartedAt: 2026-06-29 14:35:35 +0000 UTC FinishedAt: 2026-06-29 18:36:59 +0000 UTC Input: nil Output: nil --------- Name: series-workflowxpg5z[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"88cefc306c43b58d9bb65c9e96e284306710d961","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","MEMCG_V1"],"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":["vmpressure","vmpressure_v1_account_tree","vmpressure_work_fn","vmpressure_event","vmpressure_register_event","vmpressure_unregister_event","vmpressure_prio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"88cefc306c43b58d9bb65c9e96e284306710d961","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","MEMCG_V1"],"series_id":"8823cc7f-37ff-4d09-afb4-62cac89b759d","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-06-29 14:35:35 +0000 UTC FinishedAt: 2026-06-29 18:36:59 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:element,Default:nil,Value:*{"base":{"arch":"amd64","commit_hash":"88cefc306c43b58d9bb65c9e96e284306710d961","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","MEMCG_V1"],"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":["vmpressure","vmpressure_v1_account_tree","vmpressure_work_fn","vmpressure_event","vmpressure_register_event","vmpressure_unregister_event","vmpressure_prio"],"skip_cover_check":true},"patched":{"arch":"amd64","commit_hash":"88cefc306c43b58d9bb65c9e96e284306710d961","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","MEMCG_V1"],"series_id":"8823cc7f-37ff-4d09-afb4-62cac89b759d","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-workflowxpg5z[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"88cefc306c43b58d9bb65c9e96e284306710d961","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","MEMCG_V1"],"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":["vmpressure","vmpressure_v1_account_tree","vmpressure_work_fn","vmpressure_event","vmpressure_register_event","vmpressure_unregister_event","vmpressure_prio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"88cefc306c43b58d9bb65c9e96e284306710d961","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","MEMCG_V1"],"series_id":"8823cc7f-37ff-4d09-afb4-62cac89b759d","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-06-29 14:35:36 +0000 UTC FinishedAt: 2026-06-29 14:35:54 +0000 UTC Input: nil Output: nil --------- Name: series-workflowxpg5z[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"88cefc306c43b58d9bb65c9e96e284306710d961","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","MEMCG_V1"],"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":["vmpressure","vmpressure_v1_account_tree","vmpressure_work_fn","vmpressure_event","vmpressure_register_event","vmpressure_unregister_event","vmpressure_prio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"88cefc306c43b58d9bb65c9e96e284306710d961","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","MEMCG_V1"],"series_id":"8823cc7f-37ff-4d09-afb4-62cac89b759d","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-06-29 14:35:36 +0000 UTC FinishedAt: 2026-06-29 14:35:47 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"arch":"amd64","commit_hash":"88cefc306c43b58d9bb65c9e96e284306710d961","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","MEMCG_V1"],"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-workflowxpg5z/series-workflowxpg5z-convert-artifact-2830457269/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowxpg5z[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"88cefc306c43b58d9bb65c9e96e284306710d961","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","MEMCG_V1"],"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":["vmpressure","vmpressure_v1_account_tree","vmpressure_work_fn","vmpressure_event","vmpressure_register_event","vmpressure_unregister_event","vmpressure_prio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"88cefc306c43b58d9bb65c9e96e284306710d961","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","MEMCG_V1"],"series_id":"8823cc7f-37ff-4d09-afb4-62cac89b759d","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-06-29 14:35:54 +0000 UTC FinishedAt: 2026-06-29 15:02:51 +0000 UTC Input: nil Output: nil --------- Name: series-workflowxpg5z[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"88cefc306c43b58d9bb65c9e96e284306710d961","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","MEMCG_V1"],"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":["vmpressure","vmpressure_v1_account_tree","vmpressure_work_fn","vmpressure_event","vmpressure_register_event","vmpressure_unregister_event","vmpressure_prio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"88cefc306c43b58d9bb65c9e96e284306710d961","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","MEMCG_V1"],"series_id":"8823cc7f-37ff-4d09-afb4-62cac89b759d","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-06-29 14:35:54 +0000 UTC FinishedAt: 2026-06-29 15:02:51 +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:*a245b724-4960-4ac2-bbac-7a082725f925,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-workflowxpg5z/series-workflowxpg5z-convert-artifact-2830457269/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": "ef821535-b603-46bb-b386-47932ca57964", "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-workflowxpg5z/series-workflowxpg5z-build-action-4263712155/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowxpg5z[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"88cefc306c43b58d9bb65c9e96e284306710d961","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","MEMCG_V1"],"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":["vmpressure","vmpressure_v1_account_tree","vmpressure_work_fn","vmpressure_event","vmpressure_register_event","vmpressure_unregister_event","vmpressure_prio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"88cefc306c43b58d9bb65c9e96e284306710d961","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","MEMCG_V1"],"series_id":"8823cc7f-37ff-4d09-afb4-62cac89b759d","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-06-29 14:35:54 +0000 UTC FinishedAt: 2026-06-29 15:01: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:*a245b724-4960-4ac2-bbac-7a082725f925,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-workflowxpg5z/series-workflowxpg5z-convert-artifact-2830457269/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": "ef821535-b603-46bb-b386-47932ca57964", "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-workflowxpg5z/series-workflowxpg5z-build-action-4263712155/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowxpg5z[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"88cefc306c43b58d9bb65c9e96e284306710d961","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","MEMCG_V1"],"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":["vmpressure","vmpressure_v1_account_tree","vmpressure_work_fn","vmpressure_event","vmpressure_register_event","vmpressure_unregister_event","vmpressure_prio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"88cefc306c43b58d9bb65c9e96e284306710d961","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","MEMCG_V1"],"series_id":"8823cc7f-37ff-4d09-afb4-62cac89b759d","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-06-29 15:02:51 +0000 UTC FinishedAt: 2026-06-29 15:02:51 +0000 UTC Input: nil Output: nil --------- Name: series-workflowxpg5z[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"88cefc306c43b58d9bb65c9e96e284306710d961","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","MEMCG_V1"],"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":["vmpressure","vmpressure_v1_account_tree","vmpressure_work_fn","vmpressure_event","vmpressure_register_event","vmpressure_unregister_event","vmpressure_prio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"88cefc306c43b58d9bb65c9e96e284306710d961","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","MEMCG_V1"],"series_id":"8823cc7f-37ff-4d09-afb4-62cac89b759d","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-06-29 15:02:51 +0000 UTC FinishedAt: 2026-06-29 15:02:51 +0000 UTC Input: nil Output: nil --------- Name: series-workflowxpg5z[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"88cefc306c43b58d9bb65c9e96e284306710d961","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","MEMCG_V1"],"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":["vmpressure","vmpressure_v1_account_tree","vmpressure_work_fn","vmpressure_event","vmpressure_register_event","vmpressure_unregister_event","vmpressure_prio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"88cefc306c43b58d9bb65c9e96e284306710d961","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","MEMCG_V1"],"series_id":"8823cc7f-37ff-4d09-afb4-62cac89b759d","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-06-29 15:02:51 +0000 UTC FinishedAt: 2026-06-29 15:03:01 +0000 UTC Input: nil Output: nil --------- Name: series-workflowxpg5z[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"88cefc306c43b58d9bb65c9e96e284306710d961","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","MEMCG_V1"],"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":["vmpressure","vmpressure_v1_account_tree","vmpressure_work_fn","vmpressure_event","vmpressure_register_event","vmpressure_unregister_event","vmpressure_prio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"88cefc306c43b58d9bb65c9e96e284306710d961","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","MEMCG_V1"],"series_id":"8823cc7f-37ff-4d09-afb4-62cac89b759d","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-06-29 15:02:51 +0000 UTC FinishedAt: 2026-06-29 15:02:57 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"arch":"amd64","commit_hash":"88cefc306c43b58d9bb65c9e96e284306710d961","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","MEMCG_V1"],"series_id":"8823cc7f-37ff-4d09-afb4-62cac89b759d","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-workflowxpg5z/series-workflowxpg5z-convert-artifact-3072531984/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowxpg5z[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"88cefc306c43b58d9bb65c9e96e284306710d961","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","MEMCG_V1"],"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":["vmpressure","vmpressure_v1_account_tree","vmpressure_work_fn","vmpressure_event","vmpressure_register_event","vmpressure_unregister_event","vmpressure_prio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"88cefc306c43b58d9bb65c9e96e284306710d961","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","MEMCG_V1"],"series_id":"8823cc7f-37ff-4d09-afb4-62cac89b759d","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-06-29 15:03:01 +0000 UTC FinishedAt: 2026-06-29 15:05:14 +0000 UTC Input: nil Output: nil --------- Name: series-workflowxpg5z[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"88cefc306c43b58d9bb65c9e96e284306710d961","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","MEMCG_V1"],"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":["vmpressure","vmpressure_v1_account_tree","vmpressure_work_fn","vmpressure_event","vmpressure_register_event","vmpressure_unregister_event","vmpressure_prio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"88cefc306c43b58d9bb65c9e96e284306710d961","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","MEMCG_V1"],"series_id":"8823cc7f-37ff-4d09-afb4-62cac89b759d","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-06-29 15:03:01 +0000 UTC FinishedAt: 2026-06-29 15:05:04 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*ef821535-b603-46bb-b386-47932ca57964,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-workflowxpg5z/series-workflowxpg5z-build-action-4263712155/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-workflowxpg5z[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"88cefc306c43b58d9bb65c9e96e284306710d961","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","MEMCG_V1"],"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":["vmpressure","vmpressure_v1_account_tree","vmpressure_work_fn","vmpressure_event","vmpressure_register_event","vmpressure_unregister_event","vmpressure_prio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"88cefc306c43b58d9bb65c9e96e284306710d961","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","MEMCG_V1"],"series_id":"8823cc7f-37ff-4d09-afb4-62cac89b759d","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-06-29 15:05:14 +0000 UTC FinishedAt: 2026-06-29 15:05:14 +0000 UTC Input: nil Output: nil --------- Name: series-workflowxpg5z[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"88cefc306c43b58d9bb65c9e96e284306710d961","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","MEMCG_V1"],"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":["vmpressure","vmpressure_v1_account_tree","vmpressure_work_fn","vmpressure_event","vmpressure_register_event","vmpressure_unregister_event","vmpressure_prio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"88cefc306c43b58d9bb65c9e96e284306710d961","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","MEMCG_V1"],"series_id":"8823cc7f-37ff-4d09-afb4-62cac89b759d","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-06-29 15:05:14 +0000 UTC FinishedAt: 2026-06-29 15:05:14 +0000 UTC Input: nil Output: nil --------- Name: series-workflowxpg5z[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"88cefc306c43b58d9bb65c9e96e284306710d961","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","MEMCG_V1"],"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":["vmpressure","vmpressure_v1_account_tree","vmpressure_work_fn","vmpressure_event","vmpressure_register_event","vmpressure_unregister_event","vmpressure_prio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"88cefc306c43b58d9bb65c9e96e284306710d961","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","MEMCG_V1"],"series_id":"8823cc7f-37ff-4d09-afb4-62cac89b759d","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-06-29 15:05:14 +0000 UTC FinishedAt: 2026-06-29 15:27:33 +0000 UTC Input: nil Output: nil --------- Name: series-workflowxpg5z[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"88cefc306c43b58d9bb65c9e96e284306710d961","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","MEMCG_V1"],"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":["vmpressure","vmpressure_v1_account_tree","vmpressure_work_fn","vmpressure_event","vmpressure_register_event","vmpressure_unregister_event","vmpressure_prio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"88cefc306c43b58d9bb65c9e96e284306710d961","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","MEMCG_V1"],"series_id":"8823cc7f-37ff-4d09-afb4-62cac89b759d","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-06-29 15:05:14 +0000 UTC FinishedAt: 2026-06-29 15:27:33 +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:*a245b724-4960-4ac2-bbac-7a082725f925,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-workflowxpg5z/series-workflowxpg5z-convert-artifact-3072531984/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": "1f6fd07e-4aea-4de4-b15b-c734d2c7ff22", "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-workflowxpg5z/series-workflowxpg5z-build-action-3383302796/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowxpg5z[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"88cefc306c43b58d9bb65c9e96e284306710d961","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","MEMCG_V1"],"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":["vmpressure","vmpressure_v1_account_tree","vmpressure_work_fn","vmpressure_event","vmpressure_register_event","vmpressure_unregister_event","vmpressure_prio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"88cefc306c43b58d9bb65c9e96e284306710d961","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","MEMCG_V1"],"series_id":"8823cc7f-37ff-4d09-afb4-62cac89b759d","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-06-29 15:05:14 +0000 UTC FinishedAt: 2026-06-29 15:27:23 +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:*a245b724-4960-4ac2-bbac-7a082725f925,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-workflowxpg5z/series-workflowxpg5z-convert-artifact-3072531984/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": "1f6fd07e-4aea-4de4-b15b-c734d2c7ff22", "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-workflowxpg5z/series-workflowxpg5z-build-action-3383302796/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowxpg5z[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"88cefc306c43b58d9bb65c9e96e284306710d961","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","MEMCG_V1"],"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":["vmpressure","vmpressure_v1_account_tree","vmpressure_work_fn","vmpressure_event","vmpressure_register_event","vmpressure_unregister_event","vmpressure_prio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"88cefc306c43b58d9bb65c9e96e284306710d961","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","MEMCG_V1"],"series_id":"8823cc7f-37ff-4d09-afb4-62cac89b759d","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-06-29 15:27:33 +0000 UTC FinishedAt: 2026-06-29 15:27:33 +0000 UTC Input: nil Output: nil --------- Name: series-workflowxpg5z[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"88cefc306c43b58d9bb65c9e96e284306710d961","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","MEMCG_V1"],"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":["vmpressure","vmpressure_v1_account_tree","vmpressure_work_fn","vmpressure_event","vmpressure_register_event","vmpressure_unregister_event","vmpressure_prio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"88cefc306c43b58d9bb65c9e96e284306710d961","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","MEMCG_V1"],"series_id":"8823cc7f-37ff-4d09-afb4-62cac89b759d","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-06-29 15:27:33 +0000 UTC FinishedAt: 2026-06-29 15:27:33 +0000 UTC Input: nil Output: nil --------- Name: series-workflowxpg5z[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"88cefc306c43b58d9bb65c9e96e284306710d961","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","MEMCG_V1"],"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":["vmpressure","vmpressure_v1_account_tree","vmpressure_work_fn","vmpressure_event","vmpressure_register_event","vmpressure_unregister_event","vmpressure_prio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"88cefc306c43b58d9bb65c9e96e284306710d961","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","MEMCG_V1"],"series_id":"8823cc7f-37ff-4d09-afb4-62cac89b759d","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-06-29 15:27:33 +0000 UTC FinishedAt: 2026-06-29 15:29:32 +0000 UTC Input: nil Output: nil --------- Name: series-workflowxpg5z[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"88cefc306c43b58d9bb65c9e96e284306710d961","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","MEMCG_V1"],"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":["vmpressure","vmpressure_v1_account_tree","vmpressure_work_fn","vmpressure_event","vmpressure_register_event","vmpressure_unregister_event","vmpressure_prio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"88cefc306c43b58d9bb65c9e96e284306710d961","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","MEMCG_V1"],"series_id":"8823cc7f-37ff-4d09-afb4-62cac89b759d","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-06-29 15:27:33 +0000 UTC FinishedAt: 2026-06-29 15:29:22 +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:*1f6fd07e-4aea-4de4-b15b-c734d2c7ff22,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-workflowxpg5z/series-workflowxpg5z-build-action-3383302796/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-workflowxpg5z[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"88cefc306c43b58d9bb65c9e96e284306710d961","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","MEMCG_V1"],"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":["vmpressure","vmpressure_v1_account_tree","vmpressure_work_fn","vmpressure_event","vmpressure_register_event","vmpressure_unregister_event","vmpressure_prio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"88cefc306c43b58d9bb65c9e96e284306710d961","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","MEMCG_V1"],"series_id":"8823cc7f-37ff-4d09-afb4-62cac89b759d","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-06-29 15:29:32 +0000 UTC FinishedAt: 2026-06-29 18:36:59 +0000 UTC Input: nil Output: nil --------- Name: series-workflowxpg5z[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"88cefc306c43b58d9bb65c9e96e284306710d961","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","MEMCG_V1"],"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":["vmpressure","vmpressure_v1_account_tree","vmpressure_work_fn","vmpressure_event","vmpressure_register_event","vmpressure_unregister_event","vmpressure_prio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"88cefc306c43b58d9bb65c9e96e284306710d961","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","MEMCG_V1"],"series_id":"8823cc7f-37ff-4d09-afb4-62cac89b759d","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-06-29 15:29:32 +0000 UTC FinishedAt: 2026-06-29 18:36:59 +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":["vmpressure","vmpressure_v1_account_tree","vmpressure_work_fn","vmpressure_event","vmpressure_register_event","vmpressure_unregister_event","vmpressure_prio"],"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:*ef821535-b603-46bb-b386-47932ca57964,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*1f6fd07e-4aea-4de4-b15b-c734d2c7ff22,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-workflowxpg5z/series-workflowxpg5z-build-action-4263712155/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-workflowxpg5z/series-workflowxpg5z-build-action-3383302796/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: nil --------- Name: series-workflowxpg5z[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"88cefc306c43b58d9bb65c9e96e284306710d961","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","MEMCG_V1"],"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":["vmpressure","vmpressure_v1_account_tree","vmpressure_work_fn","vmpressure_event","vmpressure_register_event","vmpressure_unregister_event","vmpressure_prio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"88cefc306c43b58d9bb65c9e96e284306710d961","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","MEMCG_V1"],"series_id":"8823cc7f-37ff-4d09-afb4-62cac89b759d","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-06-29 15:29:32 +0000 UTC FinishedAt: 2026-06-29 15:29:42 +0000 UTC Input: nil Output: nil --------- Name: series-workflowxpg5z[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"88cefc306c43b58d9bb65c9e96e284306710d961","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","MEMCG_V1"],"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":["vmpressure","vmpressure_v1_account_tree","vmpressure_work_fn","vmpressure_event","vmpressure_register_event","vmpressure_unregister_event","vmpressure_prio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"88cefc306c43b58d9bb65c9e96e284306710d961","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","MEMCG_V1"],"series_id":"8823cc7f-37ff-4d09-afb4-62cac89b759d","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-06-29 15:29:32 +0000 UTC FinishedAt: 2026-06-29 15:29:38 +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":["vmpressure","vmpressure_v1_account_tree","vmpressure_work_fn","vmpressure_event","vmpressure_register_event","vmpressure_unregister_event","vmpressure_prio"],"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-workflowxpg5z/series-workflowxpg5z-convert-artifact-3196856073/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowxpg5z[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"88cefc306c43b58d9bb65c9e96e284306710d961","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","MEMCG_V1"],"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":["vmpressure","vmpressure_v1_account_tree","vmpressure_work_fn","vmpressure_event","vmpressure_register_event","vmpressure_unregister_event","vmpressure_prio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"88cefc306c43b58d9bb65c9e96e284306710d961","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","MEMCG_V1"],"series_id":"8823cc7f-37ff-4d09-afb4-62cac89b759d","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-06-29 15:29:32 +0000 UTC FinishedAt: 2026-06-29 15:29:32 +0000 UTC Input: nil Output: nil --------- Name: series-workflowxpg5z[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"88cefc306c43b58d9bb65c9e96e284306710d961","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","MEMCG_V1"],"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":["vmpressure","vmpressure_v1_account_tree","vmpressure_work_fn","vmpressure_event","vmpressure_register_event","vmpressure_unregister_event","vmpressure_prio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"88cefc306c43b58d9bb65c9e96e284306710d961","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","MEMCG_V1"],"series_id":"8823cc7f-37ff-4d09-afb4-62cac89b759d","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-06-29 15:29:32 +0000 UTC FinishedAt: 2026-06-29 15:29:32 +0000 UTC Input: nil Output: nil --------- Name: series-workflowxpg5z[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"88cefc306c43b58d9bb65c9e96e284306710d961","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","MEMCG_V1"],"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":["vmpressure","vmpressure_v1_account_tree","vmpressure_work_fn","vmpressure_event","vmpressure_register_event","vmpressure_unregister_event","vmpressure_prio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"88cefc306c43b58d9bb65c9e96e284306710d961","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","MEMCG_V1"],"series_id":"8823cc7f-37ff-4d09-afb4-62cac89b759d","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-06-29 15:29:32 +0000 UTC FinishedAt: 2026-06-29 15:29:32 +0000 UTC Input: nil Output: nil --------- Name: series-workflowxpg5z[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"88cefc306c43b58d9bb65c9e96e284306710d961","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","MEMCG_V1"],"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":["vmpressure","vmpressure_v1_account_tree","vmpressure_work_fn","vmpressure_event","vmpressure_register_event","vmpressure_unregister_event","vmpressure_prio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"88cefc306c43b58d9bb65c9e96e284306710d961","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","MEMCG_V1"],"series_id":"8823cc7f-37ff-4d09-afb4-62cac89b759d","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-06-29 15:29:42 +0000 UTC FinishedAt: 2026-06-29 18:36:59 +0000 UTC Input: nil Output: nil --------- Name: series-workflowxpg5z[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"88cefc306c43b58d9bb65c9e96e284306710d961","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","MEMCG_V1"],"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":["vmpressure","vmpressure_v1_account_tree","vmpressure_work_fn","vmpressure_event","vmpressure_register_event","vmpressure_unregister_event","vmpressure_prio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"88cefc306c43b58d9bb65c9e96e284306710d961","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","MEMCG_V1"],"series_id":"8823cc7f-37ff-4d09-afb4-62cac89b759d","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-06-29 15:29:42 +0000 UTC FinishedAt: 2026-06-29 18:36:43 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*ef821535-b603-46bb-b386-47932ca57964,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*1f6fd07e-4aea-4de4-b15b-c734d2c7ff22,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-workflowxpg5z/series-workflowxpg5z-build-action-4263712155/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-workflowxpg5z/series-workflowxpg5z-build-action-3383302796/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-workflowxpg5z/series-workflowxpg5z-convert-artifact-3196856073/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,}