Name: series-workflowfntnl Phase: Succeeded StartedAt: 2026-06-29 16:20:33 +0000 UTC FinishedAt: 2026-06-29 20:44:02 +0000 UTC Input: nil Output: nil --------- Name: series-workflowfntnl[0] Phase: Succeeded StartedAt: 2026-06-29 16:20:33 +0000 UTC FinishedAt: 2026-06-29 16:40:13 +0000 UTC Input: nil Output: nil --------- Name: series-workflowfntnl[0].run-triage Phase: Succeeded StartedAt: 2026-06-29 16:20:33 +0000 UTC FinishedAt: 2026-06-29 16:40:13 +0000 UTC Input: nil Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "skip_reason": "", "targets": [ { "base": { "arch": "amd64", "tree_name": "bpf-next", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git", "commit_hash": "53435562a725962e4de0c29653223129ba11643a", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "BPF_SYSCALL", "BPF_JIT" ], "series_id": "" }, "patched": { "arch": "amd64", "tree_name": "bpf-next", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git", "commit_hash": "53435562a725962e4de0c29653223129ba11643a", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "BPF_SYSCALL", "BPF_JIT" ], "series_id": "441a2867-de39-4d18-beec-5c7a8e65f4f1" }, "track": "KASAN", "fuzz": { "focus": [ "bpf" ], "focus_symbols": [ "percpu_array_map_direct_value_addr", "percpu_array_map_direct_value_meta" ], "corpus_urls": [ "https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db" ], "skip_cover_check": false, "bug_title_re": "" }, "retest": null } ], "trajectory": "CjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KPGhlYWQ+Cgk8dGl0bGU+QUkgVHJhamVjdG9yeTwvdGl0bGU+Cgk8c3R5bGU+CgkJdGFibGUgewoJCQlib3JkZXI6IDFweCBzb2xpZCAjY2NjOwoJCQltYXJnaW46IDIwcHggNXB4OwoJCQlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwoJCQl3aGl0ZS1zcGFjZTogbm93cmFwOwoJCQl0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKCQkJb3ZlcmZsb3c6IGhpZGRlbjsKCQl9CgoJCXRhYmxlIGNhcHRpb24gewoJCQlmb250LXdlaWdodDogYm9sZDsKCQl9CgoJCXRhYmxlIHRkLCB0YWJsZSB0aCB7CgkJCXZlcnRpY2FsLWFsaWduOiB0b3A7CgkJCXBhZGRpbmc6IDJweCA4cHg7CgkJCXRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwoJCQlvdmVyZmxvdzogaGlkZGVuOwoJCX0KCgkJLmxpc3RfdGFibGUgdGQsIC5saXN0X3RhYmxlIHRoIHsKCQkJYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjY2NjOwoJCX0KCgkJLmxpc3RfdGFibGUgdGggewoJCQliYWNrZ3JvdW5kOiAjRjRGNEY0OwoJCX0KCgkJLmxpc3RfdGFibGUgdHI6bnRoLWNoaWxkKDJuKSB7CgkJCWJhY2tncm91bmQ6ICNGNEY0RjQ7CgkJfQoKCQkubGlzdF90YWJsZSB0cjpob3ZlciB7CgkJCWJhY2tncm91bmQ6ICNmZmZmOTk7CgkJfQoKCQkjYWlfZGV0YWlsc19kaXYgcHJlIHsKCQkJbWFyZ2luOiAxcHg7CgkJCW1heC13aWR0aDogMTIwY2g7CgkJCXdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKCQkJb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKCQl9Cgk8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PgoJPGgxPkFJIFRyYWplY3Rvcnk8L2gxPgoJPGJyPgoKCQoJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQk8Y2FwdGlvbj5UcmFqZWN0b3J5OiAoPGEgaHJlZj0iIyIgb25jbGljaz0idG9nZ2xlQWxsRGV0YWlscygpOyByZXR1cm4gZmFsc2U7Ij5FeHBhbmQvQ29sbGFwc2UgQWxsPC9hPik8L2NhcHRpb24+CgkJPHRoZWFkPjx0cj4KCQkJPHRoPlNlcTwvdGg+CgkJCTx0aD5UaW1lc3RhbXA8L3RoPgoJCQk8dGg+VHlwZTwvdGg+CgkJCTx0aD5OYW1lPC90aD4KCQkJPHRoPkR1cmF0aW9uPC90aD4KCQk8L3RyPjwvdGhlYWQ+CgkJPHRib2R5PgoJCQoJCTx0cj4KCQkJPHRkPjAvMDwvdGQ+CgkJCTx0ZD4yMDI2LzA2LzI5IDE2OjM5PC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0JQRl9TWVNDQUxMJiMzNDssCiAgICAmIzM0O0JQRl9KSVQmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDtwZXJjcHVfYXJyYXlfbWFwX2RpcmVjdF92YWx1ZV9hZGRyJiMzNDssCiAgICAmIzM0O3BlcmNwdV9hcnJheV9tYXBfZGlyZWN0X3ZhbHVlX21ldGEmIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggaW50cm9kdWNlcyBzdXBwb3J0IGZvciBgLnBlcmNwdWAgZ2xvYmFsIGRhdGEgbWFwcyBpbiBCUEYsIHdoaWNoIHRyYW5zbGF0ZXMgdG8gYEJQRl9NQVBfVFlQRV9QRVJDUFVfQVJSQVlgLiBJdCBhZGRzIG5ldyBtYXAgb3BlcmF0aW9ucyBgbWFwX2RpcmVjdF92YWx1ZV9hZGRyYCBhbmQgYG1hcF9kaXJlY3RfdmFsdWVfbWV0YWAgZm9yIHBlcmNwdSBhcnJheXMsIGFuZCBtb2RpZmllcyB0aGUgdmVyaWZpZXIgdG8gaGFuZGxlIHBlcmNwdSBhcnJheSBhY2Nlc3NlcyBhbmQgcGF0Y2ggaW5zdHJ1Y3Rpb25zIGZvciBKSVQuIFRoaXMgaXMgYSBmdW5jdGlvbmFsIGNoYW5nZSBpbiB0aGUgY29yZSBCUEYgc3Vic3lzdGVtIGFuZCBzaG91bGQgYmUgZnV6emVkLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA2LzI5IDE2OjM5PC90ZD4KCQkJPHRkPmFjdGlvbjwvdGQ+CgkJCTx0ZD5yZWFkLXBhdGNoLWRpZmY8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtQYXRjaERpZmYmIzM0OzogJiMzNDtjb21taXQgNmJmNzcxNDI3YjNjZDQ4NTJjOTcwZDZiNDRiM2MwMWJkMThjYTczMFxuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBNb24gSnVuIDI5IDE2OjM5OjI4IDIwMjYgJiM0MzswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL2tlcm5lbC9icGYvYXJyYXltYXAuYyBiL2tlcm5lbC9icGYvYXJyYXltYXAuY1xuaW5kZXggMjQ4YjQ4MTgxNzhjZDEuLmM0ZTk0MzA5NDFlNTQ5IDEwMDY0NFxuLS0tIGEva2VybmVsL2JwZi9hcnJheW1hcC5jXG4mIzQzOyYjNDM7JiM0MzsgYi9rZXJuZWwvYnBmL2FycmF5bWFwLmNcbkBAIC0yNTksNiAmIzQzOzI1OSwzNyBAQCBzdGF0aWMgdm9pZCAqcGVyY3B1X2FycmF5X21hcF9sb29rdXBfZWxlbShzdHJ1Y3QgYnBmX21hcCAqbWFwLCB2b2lkICprZXkpXG4gXHRyZXR1cm4gdGhpc19jcHVfcHRyKGFycmF5LVx1MDAzZXBwdHJzW2luZGV4IFx1MDAyNiBhcnJheS1cdTAwM2VpbmRleF9tYXNrXSk7XG4gfVxuIFxuJiM0MztzdGF0aWMgaW50IHBlcmNwdV9hcnJheV9tYXBfZGlyZWN0X3ZhbHVlX2FkZHIoY29uc3Qgc3RydWN0IGJwZl9tYXAgKm1hcCwgdTY0ICppbW0sIHUzMiBvZmYpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgYnBmX2FycmF5ICphcnJheSA9IGNvbnRhaW5lcl9vZihtYXAsIHN0cnVjdCBicGZfYXJyYXksIG1hcCk7XG4mIzQzO1xuJiM0MztcdGlmIChtYXAtXHUwMDNlbWF4X2VudHJpZXMgIT0gMSlcbiYjNDM7XHRcdHJldHVybiAtRU9QTk9UU1VQUDtcbiYjNDM7XHRpZiAob2ZmIFx1MDAzZT0gbWFwLVx1MDAzZXZhbHVlX3NpemUpXG4mIzQzO1x0XHRyZXR1cm4gLUVJTlZBTDtcbiYjNDM7XHRpZiAoIWJwZl9qaXRfc3VwcG9ydHNfcGVyY3B1X2luc24oKSlcbiYjNDM7XHRcdHJldHVybiAtRU9QTk9UU1VQUDtcbiYjNDM7XG4mIzQzO1x0KmltbSA9ICh1NjQpKF9fZm9yY2UgdW5zaWduZWQgbG9uZykgYXJyYXktXHUwMDNlcHB0cnNbMF07XG4mIzQzO1x0cmV0dXJuIDA7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBpbnQgcGVyY3B1X2FycmF5X21hcF9kaXJlY3RfdmFsdWVfbWV0YShjb25zdCBzdHJ1Y3QgYnBmX21hcCAqbWFwLCB1NjQgaW1tLCB1MzIgKm9mZilcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBicGZfYXJyYXkgKmFycmF5ID0gY29udGFpbmVyX29mKG1hcCwgc3RydWN0IGJwZl9hcnJheSwgbWFwKTtcbiYjNDM7XHR1NjQgYmFzZSA9ICh1NjQpKF9fZm9yY2UgdW5zaWduZWQgbG9uZykgYXJyYXktXHUwMDNlcHB0cnNbMF07XG4mIzQzO1xuJiM0MztcdGlmIChtYXAtXHUwMDNlbWF4X2VudHJpZXMgIT0gMSlcbiYjNDM7XHRcdHJldHVybiAtRU9QTk9UU1VQUDtcbiYjNDM7XHRpZiAoaW1tIFx1MDAzYyBiYXNlIHx8IGltbSBcdTAwM2U9IGJhc2UgJiM0MzsgYXJyYXktXHUwMDNlZWxlbV9zaXplKVxuJiM0MztcdFx0cmV0dXJuIC1FTk9FTlQ7XG4mIzQzO1x0aWYgKCFicGZfaml0X3N1cHBvcnRzX3BlcmNwdV9pbnNuKCkpXG4mIzQzO1x0XHRyZXR1cm4gLUVPUE5PVFNVUFA7XG4mIzQzO1xuJiM0MztcdCpvZmYgPSBpbW0gLSBiYXNlO1xuJiM0MztcdHJldHVybiAwO1xuJiM0Mzt9XG4mIzQzO1xuIC8qIGVtaXQgQlBGIGluc3RydWN0aW9ucyBlcXVpdmFsZW50IHRvIEMgY29kZSBvZiBwZXJjcHVfYXJyYXlfbWFwX2xvb2t1cF9lbGVtKCkgKi9cbiBzdGF0aWMgaW50IHBlcmNwdV9hcnJheV9tYXBfZ2VuX2xvb2t1cChzdHJ1Y3QgYnBmX21hcCAqbWFwLCBzdHJ1Y3QgYnBmX2luc24gKmluc25fYnVmKVxuIHtcbkBAIC01NTEsOSAmIzQzOzU4MiwxMCBAQCBzdGF0aWMgaW50IGFycmF5X21hcF9jaGVja19idGYoc3RydWN0IGJwZl9tYXAgKm1hcCxcbiBcdFx0XHQgICAgICAgY29uc3Qgc3RydWN0IGJ0Zl90eXBlICprZXlfdHlwZSxcbiBcdFx0XHQgICAgICAgY29uc3Qgc3RydWN0IGJ0Zl90eXBlICp2YWx1ZV90eXBlKVxuIHtcbi1cdC8qIE9uZSBleGNlcHRpb24gZm9yIGtleWxlc3MgQlRGOiAuYnNzLy5kYXRhLy5yb2RhdGEgbWFwICovXG4mIzQzO1x0LyogT25lIGV4Y2VwdGlvbiBmb3Iga2V5bGVzcyBCVEY6IC5ic3MvLmRhdGEvLnJvZGF0YS8ucGVyY3B1IG1hcCAqL1xuIFx0aWYgKGJ0Zl90eXBlX2lzX3ZvaWQoa2V5X3R5cGUpKSB7XG4tXHRcdGlmIChtYXAtXHUwMDNlbWFwX3R5cGUgIT0gQlBGX01BUF9UWVBFX0FSUkFZIHx8XG4mIzQzO1x0XHRpZiAoKG1hcC1cdTAwM2VtYXBfdHlwZSAhPSBCUEZfTUFQX1RZUEVfQVJSQVkgXHUwMDI2XHUwMDI2XG4mIzQzO1x0XHQgICAgIG1hcC1cdTAwM2VtYXBfdHlwZSAhPSBCUEZfTUFQX1RZUEVfUEVSQ1BVX0FSUkFZKSB8fFxuIFx0XHQgICAgbWFwLVx1MDAzZW1heF9lbnRyaWVzICE9IDEpXG4gXHRcdFx0cmV0dXJuIC1FSU5WQUw7XG4gXG5AQCAtODMyLDYgJiM0Mzs4NjQsOCBAQCBjb25zdCBzdHJ1Y3QgYnBmX21hcF9vcHMgcGVyY3B1X2FycmF5X21hcF9vcHMgPSB7XG4gXHQubWFwX2dldF9uZXh0X2tleSA9IGJwZl9hcnJheV9nZXRfbmV4dF9rZXksXG4gXHQubWFwX2xvb2t1cF9lbGVtID0gcGVyY3B1X2FycmF5X21hcF9sb29rdXBfZWxlbSxcbiBcdC5tYXBfZ2VuX2xvb2t1cCA9IHBlcmNwdV9hcnJheV9tYXBfZ2VuX2xvb2t1cCxcbiYjNDM7XHQubWFwX2RpcmVjdF92YWx1ZV9hZGRyID0gcGVyY3B1X2FycmF5X21hcF9kaXJlY3RfdmFsdWVfYWRkcixcbiYjNDM7XHQubWFwX2RpcmVjdF92YWx1ZV9tZXRhID0gcGVyY3B1X2FycmF5X21hcF9kaXJlY3RfdmFsdWVfbWV0YSxcbiBcdC5tYXBfdXBkYXRlX2VsZW0gPSBhcnJheV9tYXBfdXBkYXRlX2VsZW0sXG4gXHQubWFwX2RlbGV0ZV9lbGVtID0gYXJyYXlfbWFwX2RlbGV0ZV9lbGVtLFxuIFx0Lm1hcF9sb29rdXBfcGVyY3B1X2VsZW0gPSBwZXJjcHVfYXJyYXlfbWFwX2xvb2t1cF9wZXJjcHVfZWxlbSxcbmRpZmYgLS1naXQgYS9rZXJuZWwvYnBmL2NvbnN0X2ZvbGQuYyBiL2tlcm5lbC9icGYvY29uc3RfZm9sZC5jXG5pbmRleCBiMmExOWFjYWRiOTFlYy4uNTc4NzI0NmJlZjMwMTAgMTAwNjQ0XG4tLS0gYS9rZXJuZWwvYnBmL2NvbnN0X2ZvbGQuY1xuJiM0MzsmIzQzOyYjNDM7IGIva2VybmVsL2JwZi9jb25zdF9mb2xkLmNcbkBAIC0xODIsNyAmIzQzOzE4Miw2IEBAIHN0YXRpYyB2b2lkIGNvbnN0X3JlZ194ZmVyKHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsIHN0cnVjdCBjb25zdF9hcmdfaW5mbyAqXG4gXHRcdHU2NCB2YWwgPSAwO1xuIFxuIFx0XHRpZiAoIWJwZl9tYXBfaXNfcmRvbmx5KG1hcCkgfHwgIW1hcC1cdTAwM2VvcHMtXHUwMDNlbWFwX2RpcmVjdF92YWx1ZV9hZGRyIHx8XG4tXHRcdCAgICBtYXAtXHUwMDNlbWFwX3R5cGUgPT0gQlBGX01BUF9UWVBFX0lOU05fQVJSQVkgfHxcbiBcdFx0ICAgIG9mZiBcdTAwM2MgMCB8fCBvZmYgJiM0Mzsgc2l6ZSBcdTAwM2UgbWFwLVx1MDAzZXZhbHVlX3NpemUgfHxcbiBcdFx0ICAgIGJwZl9tYXBfZGlyZWN0X3JlYWQobWFwLCBvZmYsIHNpemUsIFx1MDAyNnZhbCwgaXNfbGRzeCkpIHtcbiBcdFx0XHQqZHN0ID0gdW5rbm93bjtcbmRpZmYgLS1naXQgYS9rZXJuZWwvYnBmL2ZpeHVwcy5jIGIva2VybmVsL2JwZi9maXh1cHMuY1xuaW5kZXggM2NmMmNjNmUzYWI2NmEuLjRmODRkMDg3Y2E2OWUzIDEwMDY0NFxuLS0tIGEva2VybmVsL2JwZi9maXh1cHMuY1xuJiM0MzsmIzQzOyYjNDM7IGIva2VybmVsL2JwZi9maXh1cHMuY1xuQEAgLTE4MTksNiAmIzQzOzE4MTksMzggQEAgaW50IGJwZl9kb19taXNjX2ZpeHVwcyhzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52KVxuIFx0XHRcdGdvdG8gbmV4dF9pbnNuO1xuIFx0XHR9XG4gXG4mIzQzO1x0XHRpZiAoZW52LVx1MDAzZXByb2ctXHUwMDNlaml0X3JlcXVlc3RlZCBcdTAwMjZcdTAwMjZcbiYjNDM7XHRcdCAgICBicGZfaml0X3N1cHBvcnRzX3BlcmNwdV9pbnNuKCkgXHUwMDI2XHUwMDI2XG4mIzQzO1x0XHQgICAgaW5zbi1cdTAwM2Vjb2RlID09IChCUEZfTEQgfCBCUEZfSU1NIHwgQlBGX0RXKSBcdTAwMjZcdTAwMjZcbiYjNDM7XHRcdCAgICAoaW5zbi1cdTAwM2VzcmNfcmVnID09IEJQRl9QU0VVRE9fTUFQX1ZBTFVFIHx8XG4mIzQzO1x0XHQgICAgIGluc24tXHUwMDNlc3JjX3JlZyA9PSBCUEZfUFNFVURPX01BUF9JRFhfVkFMVUUpKSB7XG4mIzQzO1x0XHRcdHN0cnVjdCBicGZfbWFwICptYXA7XG4mIzQzO1xuJiM0MztcdFx0XHRhdXggPSBcdTAwMjZlbnYtXHUwMDNlaW5zbl9hdXhfZGF0YVtpICYjNDM7IGRlbHRhXTtcbiYjNDM7XHRcdFx0bWFwID0gZW52LVx1MDAzZXVzZWRfbWFwc1thdXgtXHUwMDNlbWFwX2luZGV4XTtcbiYjNDM7XHRcdFx0aWYgKG1hcC1cdTAwM2VtYXBfdHlwZSAhPSBCUEZfTUFQX1RZUEVfUEVSQ1BVX0FSUkFZKVxuJiM0MztcdFx0XHRcdGdvdG8gbmV4dF9pbnNuO1xuJiM0MztcbiYjNDM7XHRcdFx0LypcbiYjNDM7XHRcdFx0ICogUmV1c2UgdGhlIG9yaWdpbmFsIGxkX2ltbTY0IGluc24sIGFuZCBhZGQgb25lXG4mIzQzO1x0XHRcdCAqIG1vdjY0X3BlcmNwdV9yZWcgaW5zbi5cbiYjNDM7XHRcdFx0ICovXG4mIzQzO1xuJiM0MztcdFx0XHRpbnNuX2J1ZlswXSA9IGluc25bMV07XG4mIzQzO1x0XHRcdGluc25fYnVmWzFdID0gQlBGX01PVjY0X1BFUkNQVV9SRUcoaW5zbi1cdTAwM2Vkc3RfcmVnLCBpbnNuLVx1MDAzZWRzdF9yZWcpO1xuJiM0MztcdFx0XHRjbnQgPSAyO1xuJiM0MztcbiYjNDM7XHRcdFx0aSYjNDM7JiM0Mzs7XG4mIzQzO1x0XHRcdG5ld19wcm9nID0gYnBmX3BhdGNoX2luc25fZGF0YShlbnYsIGkgJiM0MzsgZGVsdGEsIGluc25fYnVmLCBjbnQpO1xuJiM0MztcdFx0XHRpZiAoIW5ld19wcm9nKVxuJiM0MztcdFx0XHRcdHJldHVybiAtRU5PTUVNO1xuJiM0MztcbiYjNDM7XHRcdFx0ZGVsdGEgICAgJiM0Mzs9IGNudCAtIDE7XG4mIzQzO1x0XHRcdGVudi1cdTAwM2Vwcm9nID0gcHJvZyA9IG5ld19wcm9nO1xuJiM0MztcdFx0XHRpbnNuICAgICAgPSBuZXdfcHJvZy1cdTAwM2VpbnNuc2kgJiM0MzsgaSAmIzQzOyBkZWx0YTtcbiYjNDM7XHRcdFx0Z290byBuZXh0X2luc247XG4mIzQzO1x0XHR9XG4mIzQzO1xuIFx0XHRpZiAoaW5zbi1cdTAwM2Vjb2RlICE9IChCUEZfSk1QIHwgQlBGX0NBTEwpKVxuIFx0XHRcdGdvdG8gbmV4dF9pbnNuO1xuIFx0XHRpZiAoaW5zbi1cdTAwM2VzcmNfcmVnID09IEJQRl9QU0VVRE9fQ0FMTClcbmRpZmYgLS1naXQgYS9rZXJuZWwvYnBmL3ZlcmlmaWVyLmMgYi9rZXJuZWwvYnBmL3ZlcmlmaWVyLmNcbmluZGV4IDI1YWVhNDI3MWNkMDg5Li5kYmY3NmZhOWQ0M2Q4ZSAxMDA2NDRcbi0tLSBhL2tlcm5lbC9icGYvdmVyaWZpZXIuY1xuJiM0MzsmIzQzOyYjNDM7IGIva2VybmVsL2JwZi92ZXJpZmllci5jXG5AQCAtNjUyLDcgJiM0Mzs2NTIsNiBAQCBzdGF0aWMgdm9pZCBfX21hcmtfZHlucHRyX3JlZyhzdHJ1Y3QgYnBmX3JlZ19zdGF0ZSAqcmVnLFxuIFx0XHRcdCAgICAgIGVudW0gYnBmX2R5bnB0cl90eXBlIHR5cGUsXG4gXHRcdFx0ICAgICAgYm9vbCBmaXJzdF9zbG90LCBpbnQgaWQsIGludCBwYXJlbnRfaWQpO1xuIFxuLVxuIHN0YXRpYyB2b2lkIG1hcmtfZHlucHRyX3N0YWNrX3JlZ3Moc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudixcbiBcdFx0XHRcdCAgIHN0cnVjdCBicGZfcmVnX3N0YXRlICpzcmVnMSxcbiBcdFx0XHRcdCAgIHN0cnVjdCBicGZfcmVnX3N0YXRlICpzcmVnMixcbkBAIC0xNjg5LDcgJiM0MzsxNjg4LDYgQEAgc3RhdGljIGJvb2wgc2FtZV9jYWxsc2l0ZXMoc3RydWN0IGJwZl92ZXJpZmllcl9zdGF0ZSAqYSwgc3RydWN0IGJwZl92ZXJpZmllcl9zdGFcbiBcdHJldHVybiB0cnVlO1xuIH1cbiBcbi1cbiB2b2lkIGJwZl9mcmVlX2JhY2tlZGdlcyhzdHJ1Y3QgYnBmX3NjY192aXNpdCAqdmlzaXQpXG4ge1xuIFx0c3RydWN0IGJwZl9zY2NfYmFja2VkZ2UgKmJhY2tlZGdlLCAqbmV4dDtcbkBAIC0yMzA5LDcgJiM0MzsyMzA3LDYgQEAgc3RhdGljIHN0cnVjdCBicGZfdmVyaWZpZXJfc3RhdGUgKnB1c2hfYXN5bmNfY2Ioc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudixcbiBcdHJldHVybiBcdTAwMjZlbGVtLVx1MDAzZXN0O1xuIH1cbiBcbi1cbiBzdGF0aWMgaW50IGNtcF9zdWJwcm9ncyhjb25zdCB2b2lkICphLCBjb25zdCB2b2lkICpiKVxuIHtcbiBcdHJldHVybiAoKHN0cnVjdCBicGZfc3VicHJvZ19pbmZvICopYSktXHUwMDNlc3RhcnQgLVxuQEAgLTMzMzEsNyAmIzQzOzMzMjgsNiBAQCBzdGF0aWMgYm9vbCBpc19zcGlsbGFibGVfcmVndHlwZShlbnVtIGJwZl9yZWdfdHlwZSB0eXBlKVxuIFx0fVxuIH1cbiBcbi1cbiAvKiBjaGVjayBpZiByZWdpc3RlciBpcyBhIGNvbnN0YW50IHNjYWxhciB2YWx1ZSAqL1xuIHN0YXRpYyBib29sIGlzX3JlZ19jb25zdChzdHJ1Y3QgYnBmX3JlZ19zdGF0ZSAqcmVnLCBib29sIHN1YnJlZzMyKVxuIHtcbkBAIC00MDI1LDcgJiM0Mzs0MDIxLDYgQEAgc3RhdGljIGludCBjaGVja19zdGFja19yZWFkKHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsXG4gXHRyZXR1cm4gZXJyO1xuIH1cbiBcbi1cbiAvKiBjaGVja19zdGFja193cml0ZSBkaXNwYXRjaGVzIHRvIGNoZWNrX3N0YWNrX3dyaXRlX2ZpeGVkX29mZiBvclxuICAqIGNoZWNrX3N0YWNrX3dyaXRlX3Zhcl9vZmYuXG4gICpcbkBAIC00ODIwLDcgJiM0Mzs0ODE1LDYgQEAgc3RhdGljIGludCBjaGVja19zb2NrX2FjY2VzcyhzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52LCBpbnQgaW5zbl9pZHgsXG4gXHRcdHZhbGlkID0gZmFsc2U7XG4gXHR9XG4gXG4tXG4gXHRpZiAodmFsaWQpIHtcbiBcdFx0ZW52LVx1MDAzZWluc25fYXV4X2RhdGFbaW5zbl9pZHhdLmN0eF9maWVsZF9zaXplID1cbiBcdFx0XHRpbmZvLmN0eF9maWVsZF9zaXplO1xuQEAgLTU2MDAsNiAmIzQzOzU1OTQsOCBAQCBpbnQgYnBmX21hcF9kaXJlY3RfcmVhZChzdHJ1Y3QgYnBmX21hcCAqbWFwLCBpbnQgb2ZmLCBpbnQgc2l6ZSwgdTY0ICp2YWwsXG4gXHR1NjQgYWRkcjtcbiBcdGludCBlcnI7XG4gXG4mIzQzO1x0aWYgKG1hcC1cdTAwM2VtYXBfdHlwZSA9PSBCUEZfTUFQX1RZUEVfSU5TTl9BUlJBWSB8fCBtYXAtXHUwMDNlbWFwX3R5cGUgPT0gQlBGX01BUF9UWVBFX1BFUkNQVV9BUlJBWSlcbiYjNDM7XHRcdHJldHVybiAtRUlOVkFMO1xuIFx0ZXJyID0gbWFwLVx1MDAzZW9wcy1cdTAwM2VtYXBfZGlyZWN0X3ZhbHVlX2FkZHIobWFwLCBcdTAwMjZhZGRyLCBvZmYpO1xuIFx0aWYgKGVycilcbiBcdFx0cmV0dXJuIGVycjtcbkBAIC02MTU1LDYgJiM0Mzs2MTUxLDcgQEAgc3RhdGljIGludCBjaGVja19tZW1fYWNjZXNzKHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsIGludCBpbnNuX2lkeCwgc3RydWN0IGJcbiBcdFx0XHRpZiAodG51bV9pc19jb25zdChyZWctXHUwMDNldmFyX29mZikgXHUwMDI2XHUwMDI2XG4gXHRcdFx0ICAgIGJwZl9tYXBfaXNfcmRvbmx5KG1hcCkgXHUwMDI2XHUwMDI2XG4gXHRcdFx0ICAgIG1hcC1cdTAwM2VvcHMtXHUwMDNlbWFwX2RpcmVjdF92YWx1ZV9hZGRyIFx1MDAyNlx1MDAyNlxuJiM0MztcdFx0XHQgICAgbWFwLVx1MDAzZW1hcF90eXBlICE9IEJQRl9NQVBfVFlQRV9QRVJDUFVfQVJSQVkgXHUwMDI2XHUwMDI2XG4gXHRcdFx0ICAgIG1hcC1cdTAwM2VtYXBfdHlwZSAhPSBCUEZfTUFQX1RZUEVfSU5TTl9BUlJBWSkge1xuIFx0XHRcdFx0aW50IG1hcF9vZmYgPSBvZmYgJiM0MzsgcmVnLVx1MDAzZXZhcl9vZmYudmFsdWU7XG4gXHRcdFx0XHR1NjQgdmFsID0gMDtcbkBAIC02NjQ1LDcgJiM0Mzs2NjQyLDYgQEAgc3RhdGljIGludCBjaGVja19zdGFja19yYW5nZV9pbml0aWFsaXplZChcbiBcdGlmIChlcnIpXG4gXHRcdHJldHVybiBlcnI7XG4gXG4tXG4gXHRpZiAodG51bV9pc19jb25zdChyZWctXHUwMDNldmFyX29mZikpIHtcbiBcdFx0bWluX29mZiA9IG1heF9vZmYgPSByZWctXHUwMDNldmFyX29mZi52YWx1ZSAmIzQzOyBvZmY7XG4gXHR9IGVsc2Uge1xuQEAgLTczNTksNyAmIzQzOzczNTUsNiBAQCBzdGF0aWMgYm9vbCBpc19pdGVyX25ld19rZnVuYyhzdHJ1Y3QgYnBmX2tmdW5jX2NhbGxfYXJnX21ldGEgKm1ldGEpXG4gXHRyZXR1cm4gbWV0YS1cdTAwM2VrZnVuY19mbGFncyBcdTAwMjYgS0ZfSVRFUl9ORVc7XG4gfVxuIFxuLVxuIHN0YXRpYyBib29sIGlzX2l0ZXJfZGVzdHJveV9rZnVuYyhzdHJ1Y3QgYnBmX2tmdW5jX2NhbGxfYXJnX21ldGEgKm1ldGEpXG4ge1xuIFx0cmV0dXJuIG1ldGEtXHUwMDNla2Z1bmNfZmxhZ3MgXHUwMDI2IEtGX0lURVJfREVTVFJPWTtcbkBAIC04MTI1LDYgJiM0Mzs4MTIwLDEyIEBAIHN0YXRpYyBpbnQgY2hlY2tfYXJnX2NvbnN0X3N0cihzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52LFxuIFx0XHRyZXR1cm4gLUVBQ0NFUztcbiBcdH1cbiBcbiYjNDM7XHRpZiAobWFwLVx1MDAzZW1hcF90eXBlID09IEJQRl9NQVBfVFlQRV9QRVJDUFVfQVJSQVkpIHtcbiYjNDM7XHRcdHZlcmJvc2UoZW52LCBcJiMzNDslcyBwb2ludHMgdG8gcGVyY3B1X2FycmF5IG1hcCB3aGljaCBjYW5ub3QgYmUgdXNlZCBhcyBjb25zdCBzdHJpbmdcXG5cJiMzNDssXG4mIzQzO1x0XHRcdHJlZ19hcmdfbmFtZShlbnYsIGFyZ25vKSk7XG4mIzQzO1x0XHRyZXR1cm4gLUVBQ0NFUztcbiYjNDM7XHR9XG4mIzQzO1xuIFx0aWYgKCFicGZfbWFwX2lzX3Jkb25seShtYXApKSB7XG4gXHRcdHZlcmJvc2UoZW52LCBcJiMzNDslcyBkb2VzIG5vdCBwb2ludCB0byBhIHJlYWRvbmx5IG1hcCYjMzk7XFxuXCYjMzQ7LCByZWdfYXJnX25hbWUoZW52LCBhcmdubykpO1xuIFx0XHRyZXR1cm4gLUVBQ0NFUztcbkBAIC0xMTUwMiw3ICYjNDM7MTE1MDMsNiBAQCBzdGF0aWMgaW50IHByb2Nlc3NfaXJxX2ZsYWcoc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudiwgc3RydWN0IGJwZl9yZWdfc3RhdGUgKlxuIFx0cmV0dXJuIDA7XG4gfVxuIFxuLVxuIHN0YXRpYyBpbnQgcmVmX3NldF9ub25fb3duaW5nKHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsIHN0cnVjdCBicGZfcmVnX3N0YXRlICpyZWcpXG4ge1xuIFx0c3RydWN0IGJ0Zl9yZWNvcmQgKnJlYyA9IHJlZ19idGZfcmVjb3JkKHJlZyk7XG5AQCAtMTYzOTQsNyAmIzQzOzE2Mzk0LDYgQEAgc3RhdGljIGludCBjaGVja19sZF9hYnMoc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudiwgc3RydWN0IGJwZl9pbnNuICppbnNuKVxuIFx0cmV0dXJuIDA7XG4gfVxuIFxuLVxuIHN0YXRpYyBib29sIHJldHVybl9yZXR2YWxfcmFuZ2Uoc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudiwgc3RydWN0IGJwZl9yZXR2YWxfcmFuZ2UgKnJhbmdlKVxuIHtcbiBcdGVudW0gYnBmX3Byb2dfdHlwZSBwcm9nX3R5cGUgPSByZXNvbHZlX3Byb2dfdHlwZShlbnYtXHUwMDNlcHJvZyk7XG5AQCAtMTgyMTMsNiAmIzQzOzE4MjEyLDEyIEBAIHN0YXRpYyBpbnQgY2hlY2tfYW5kX3Jlc29sdmVfaW5zbnMoc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudilcbiBcdFx0XHRcdFx0cmV0dXJuIC1FSU5WQUw7XG4gXHRcdFx0XHR9XG4gXG4mIzQzO1x0XHRcdFx0aWYgKG1hcC1cdTAwM2VtYXBfdHlwZSA9PSBCUEZfTUFQX1RZUEVfUEVSQ1BVX0FSUkFZIFx1MDAyNlx1MDAyNlxuJiM0MztcdFx0XHRcdCAgICAhZW52LVx1MDAzZXByb2ctXHUwMDNlaml0X3JlcXVlc3RlZCkge1xuJiM0MztcdFx0XHRcdFx0dmVyYm9zZShlbnYsIFwmIzM0O0pJVCBpcyByZXF1aXJlZCB0byB1c2UgZ2xvYmFsIHBlcmNwdSBkYXRhXFxuXCYjMzQ7KTtcbiYjNDM7XHRcdFx0XHRcdHJldHVybiAtRU9QTk9UU1VQUDtcbiYjNDM7XHRcdFx0XHR9XG4mIzQzO1xuIFx0XHRcdFx0ZXJyID0gbWFwLVx1MDAzZW9wcy1cdTAwM2VtYXBfZGlyZWN0X3ZhbHVlX2FkZHIobWFwLCBcdTAwMjZhZGRyLCBvZmYpO1xuIFx0XHRcdFx0aWYgKGVycikge1xuIFx0XHRcdFx0XHR2ZXJib3NlKGVudiwgXCYjMzQ7aW52YWxpZCBhY2Nlc3MgdG8gbWFwIHZhbHVlIHBvaW50ZXIsIHZhbHVlX3NpemU9JXUgb2ZmPSV1XFxuXCYjMzQ7LFxuQEAgLTE4Mjg4LDggJiM0MzsxODI5Myw2IEBAIHN0YXRpYyB2b2lkIHJlbGVhc2VfaW5zbl9hcnJheXMoc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudilcbiBcdFx0YnBmX2luc25fYXJyYXlfcmVsZWFzZShlbnYtXHUwMDNlaW5zbl9hcnJheV9tYXBzW2ldKTtcbiB9XG4gXG4tXG4tXG4gLyogVGhlIHZlcmlmaWVyIGRvZXMgbW9yZSBkYXRhIGZsb3cgYW5hbHlzaXMgdGhhbiBsbHZtIGFuZCB3aWxsIG5vdFxuICAqIGV4cGxvcmUgYnJhbmNoZXMgdGhhdCBhcmUgZGVhZCBhdCBydW4gdGltZS4gTWFsaWNpb3VzIHByb2dyYW1zIGNhblxuICAqIGhhdmUgZGVhZCBjb2RlIHRvby4gVGhlcmVmb3JlIHJlcGxhY2UgYWxsIGRlYWQgYXQtcnVuLXRpbWUgY29kZVxuQEAgLTE4MzE3LDggJiM0MzsxODMyMCw2IEBAIHN0YXRpYyB2b2lkIHNhbml0aXplX2RlYWRfY29kZShzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52KVxuIFx0fVxuIH1cbiBcbi1cbi1cbiBzdGF0aWMgdm9pZCBmcmVlX3N0YXRlcyhzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52KVxuIHtcbiBcdHN0cnVjdCBicGZfdmVyaWZpZXJfc3RhdGVfbGlzdCAqc2w7XG5AQCAtMTg2MDAsNyAmIzQzOzE4NjAxLDYgQEAgc3RhdGljIGludCBkb19jaGVja19tYWluKHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYpXG4gXHRyZXR1cm4gcmV0O1xuIH1cbiBcbi1cbiBzdGF0aWMgdm9pZCBwcmludF92ZXJpZmljYXRpb25fc3RhdHMoc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudilcbiB7XG4gXHQvKiBTa2lwIG92ZXIgaGlkZGVuIHN1YnByb2dzIHdoaWNoIGFyZSBub3QgdmVyaWZpZWQuICovXG5kaWZmIC0tZ2l0IGEvdG9vbHMvYnBmL2JwZnRvb2wvZ2VuLmMgYi90b29scy9icGYvYnBmdG9vbC9nZW4uY1xuaW5kZXggNmFlNzI2MmViZTBjMWQuLjJlNjAyOTYzNThkYjVlIDEwMDY0NFxuLS0tIGEvdG9vbHMvYnBmL2JwZnRvb2wvZ2VuLmNcbiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL2JwZi9icGZ0b29sL2dlbi5jXG5AQCAtOTIsNyAmIzQzOzkyLDcgQEAgc3RhdGljIHZvaWQgZ2V0X2hlYWRlcl9ndWFyZChjaGFyICpndWFyZCwgY29uc3QgY2hhciAqb2JqX25hbWUsIGNvbnN0IGNoYXIgKnN1ZmZcbiBcbiBzdGF0aWMgYm9vbCBnZXRfbWFwX2lkZW50KGNvbnN0IHN0cnVjdCBicGZfbWFwICptYXAsIGNoYXIgKmJ1Ziwgc2l6ZV90IGJ1Zl9zeilcbiB7XG4tXHRzdGF0aWMgY29uc3QgY2hhciAqc2Z4c1tdID0geyBcJiMzNDsuZGF0YVwmIzM0OywgXCYjMzQ7LnJvZGF0YVwmIzM0OywgXCYjMzQ7LmJzc1wmIzM0OywgXCYjMzQ7Lmtjb25maWdcJiMzNDsgfTtcbiYjNDM7XHRzdGF0aWMgY29uc3QgY2hhciAqc2Z4c1tdID0geyBcJiMzNDsuZGF0YVwmIzM0OywgXCYjMzQ7LnJvZGF0YVwmIzM0OywgXCYjMzQ7LmJzc1wmIzM0OywgXCYjMzQ7LnBlcmNwdVwmIzM0OywgXCYjMzQ7Lmtjb25maWdcJiMzNDsgfTtcbiBcdGNvbnN0IGNoYXIgKm5hbWUgPSBicGZfbWFwX19uYW1lKG1hcCk7XG4gXHRpbnQgaSwgbjtcbiBcbkBAIC0xMTcsNyAmIzQzOzExNyw3IEBAIHN0YXRpYyBib29sIGdldF9tYXBfaWRlbnQoY29uc3Qgc3RydWN0IGJwZl9tYXAgKm1hcCwgY2hhciAqYnVmLCBzaXplX3QgYnVmX3N6KVxuIFxuIHN0YXRpYyBib29sIGdldF9kYXRhc2VjX2lkZW50KGNvbnN0IGNoYXIgKnNlY19uYW1lLCBjaGFyICpidWYsIHNpemVfdCBidWZfc3opXG4ge1xuLVx0c3RhdGljIGNvbnN0IGNoYXIgKnBmeHNbXSA9IHsgXCYjMzQ7LmRhdGFcJiMzNDssIFwmIzM0Oy5yb2RhdGFcJiMzNDssIFwmIzM0Oy5ic3NcJiMzNDssIFwmIzM0Oy5rY29uZmlnXCYjMzQ7IH07XG4mIzQzO1x0c3RhdGljIGNvbnN0IGNoYXIgKnBmeHNbXSA9IHsgXCYjMzQ7LmRhdGFcJiMzNDssIFwmIzM0Oy5yb2RhdGFcJiMzNDssIFwmIzM0Oy5ic3NcJiMzNDssIFwmIzM0Oy5wZXJjcHVcJiMzNDssIFwmIzM0Oy5rY29uZmlnXCYjMzQ7IH07XG4gXHRpbnQgaSwgbjtcbiBcbiBcdC8qIHJlY29nbml6ZSBoYXJkIGNvZGVkIExMVk0gc2VjdGlvbiBuYW1lICovXG5AQCAtMjU0LDYgJiM0MzsyNTQsMjAgQEAgc3RhdGljIGNvbnN0IHN0cnVjdCBidGZfdHlwZSAqZmluZF90eXBlX2Zvcl9tYXAoc3RydWN0IGJ0ZiAqYnRmLCBjb25zdCBjaGFyICptYXBcbiBcdHJldHVybiBOVUxMO1xuIH1cbiBcbiYjNDM7c3RhdGljIGJvb2wgYnBmX21hcF9pc19za2VsX2RhdGEoY29uc3Qgc3RydWN0IGJwZl9tYXAgKm1hcClcbiYjNDM7e1xuJiM0MztcdGlmICghYnBmX21hcF9faXNfaW50ZXJuYWwobWFwKSlcbiYjNDM7XHRcdHJldHVybiBmYWxzZTtcbiYjNDM7XG4mIzQzO1x0aWYgKGJwZl9tYXBfX21hcF9mbGFncyhtYXApIFx1MDAyNiBCUEZfRl9NTUFQQUJMRSlcbiYjNDM7XHRcdHJldHVybiB0cnVlO1xuJiM0MztcbiYjNDM7XHRpZiAoYnBmX21hcF9fdHlwZShtYXApID09IEJQRl9NQVBfVFlQRV9QRVJDUFVfQVJSQVkpXG4mIzQzO1x0XHRyZXR1cm4gdHJ1ZTtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIGZhbHNlO1xuJiM0Mzt9XG4mIzQzO1xuIHN0YXRpYyBib29sIGlzX21tYXBhYmxlX21hcChjb25zdCBzdHJ1Y3QgYnBmX21hcCAqbWFwLCBjaGFyICpidWYsIHNpemVfdCBzeilcbiB7XG4gXHRzaXplX3QgdG1wX3N6O1xuQEAgLTI2Myw3ICYjNDM7Mjc3LDcgQEAgc3RhdGljIGJvb2wgaXNfbW1hcGFibGVfbWFwKGNvbnN0IHN0cnVjdCBicGZfbWFwICptYXAsIGNoYXIgKmJ1Ziwgc2l6ZV90IHN6KVxuIFx0XHRyZXR1cm4gdHJ1ZTtcbiBcdH1cbiBcbi1cdGlmICghYnBmX21hcF9faXNfaW50ZXJuYWwobWFwKSB8fCAhKGJwZl9tYXBfX21hcF9mbGFncyhtYXApIFx1MDAyNiBCUEZfRl9NTUFQQUJMRSkpXG4mIzQzO1x0aWYgKCFicGZfbWFwX2lzX3NrZWxfZGF0YShtYXApKVxuIFx0XHRyZXR1cm4gZmFsc2U7XG4gXG4gXHRpZiAoIWdldF9tYXBfaWRlbnQobWFwLCBidWYsIHN6KSlcbkBAIC0zMjEsNiAmIzQzOzMzNSwxMSBAQCBzdGF0aWMgYm9vbCBidGZfaXNfcHRyX3RvX2Z1bmNfcHJvdG8oY29uc3Qgc3RydWN0IGJ0ZiAqYnRmLFxuIFx0cmV0dXJuIGJ0Zl9pc19wdHIodikgXHUwMDI2XHUwMDI2IGJ0Zl9pc19mdW5jX3Byb3RvKGJ0Zl9fdHlwZV9ieV9pZChidGYsIHYtXHUwMDNldHlwZSkpO1xuIH1cbiBcbiYjNDM7c3RhdGljIGJvb2wgYnBmX21hcF9pc19wZXJjcHVfZGF0YShjb25zdCBzdHJ1Y3QgYnBmX21hcCAqbWFwKVxuJiM0Mzt7XG4mIzQzO1x0cmV0dXJuIGJwZl9tYXBfX2lzX2ludGVybmFsKG1hcCkgXHUwMDI2XHUwMDI2IGJwZl9tYXBfX3R5cGUobWFwKSA9PSBCUEZfTUFQX1RZUEVfUEVSQ1BVX0FSUkFZO1xuJiM0Mzt9XG4mIzQzO1xuIHN0YXRpYyBpbnQgY29kZWdlbl9zdWJza2VsX2RhdGFzZWNzKHN0cnVjdCBicGZfb2JqZWN0ICpvYmosIGNvbnN0IGNoYXIgKm9ial9uYW1lKVxuIHtcbiBcdHN0cnVjdCBidGYgKmJ0ZiA9IGJwZl9vYmplY3RfX2J0ZihvYmopO1xuQEAgLTM0Myw2ICYjNDM7MzYyLDkgQEAgc3RhdGljIGludCBjb2RlZ2VuX3N1YnNrZWxfZGF0YXNlY3Moc3RydWN0IGJwZl9vYmplY3QgKm9iaiwgY29uc3QgY2hhciAqb2JqX25hbWVcbiBcdFx0aWYgKCFpc19tbWFwYWJsZV9tYXAobWFwLCBtYXBfaWRlbnQsIHNpemVvZihtYXBfaWRlbnQpKSlcbiBcdFx0XHRjb250aW51ZTtcbiBcbiYjNDM7XHRcdGlmIChicGZfbWFwX2lzX3BlcmNwdV9kYXRhKG1hcCkpXG4mIzQzO1x0XHRcdGNvbnRpbnVlO1xuJiM0MztcbiBcdFx0c2VjID0gZmluZF90eXBlX2Zvcl9tYXAoYnRmLCBtYXBfaWRlbnQpO1xuIFx0XHRpZiAoIXNlYylcbiBcdFx0XHRjb250aW51ZTtcbkBAIC02NjgsOCAmIzQzOzY5MCw3IEBAIHN0YXRpYyB2b2lkIGNvZGVnZW5fZGVzdHJveShzdHJ1Y3QgYnBmX29iamVjdCAqb2JqLCBjb25zdCBjaGFyICpvYmpfbmFtZSlcbiBcdGJwZl9vYmplY3RfX2Zvcl9lYWNoX21hcChtYXAsIG9iaikge1xuIFx0XHRpZiAoIWdldF9tYXBfaWRlbnQobWFwLCBpZGVudCwgc2l6ZW9mKGlkZW50KSkpXG4gXHRcdFx0Y29udGludWU7XG4tXHRcdGlmIChicGZfbWFwX19pc19pbnRlcm5hbChtYXApIFx1MDAyNlx1MDAyNlxuLVx0XHQgICAgKGJwZl9tYXBfX21hcF9mbGFncyhtYXApIFx1MDAyNiBCUEZfRl9NTUFQQUJMRSkpXG4mIzQzO1x0XHRpZiAoYnBmX21hcF9pc19za2VsX2RhdGEobWFwKSlcbiBcdFx0XHRwcmludGYoXCYjMzQ7XFx0c2tlbF9mcmVlX21hcF9kYXRhKHNrZWwtXHUwMDNlJTEkcywgc2tlbC1cdTAwM2VtYXBzLiUxJHMuaW5pdGlhbF92YWx1ZSwgJTIkenUpO1xcblwmIzM0OyxcbiBcdFx0XHQgICAgICAgaWRlbnQsIGJwZl9tYXBfbW1hcF9zeihtYXApKTtcbiBcdFx0Y29kZWdlbihcJiMzNDtcXFxuQEAgLTg1MCw2ICYjNDM7ODcxLDIwIEBAIHN0YXRpYyBpbnQgZ2VuX3RyYWNlKHN0cnVjdCBicGZfb2JqZWN0ICpvYmosIGNvbnN0IGNoYXIgKm9ial9uYW1lLCBjb25zdCBjaGFyICpoXG4gXHRcdGlmICghaXNfbW1hcGFibGVfbWFwKG1hcCwgaWRlbnQsIHNpemVvZihpZGVudCkpKVxuIFx0XHRcdGNvbnRpbnVlO1xuIFxuJiM0MztcdFx0aWYgKGJwZl9tYXBfaXNfcGVyY3B1X2RhdGEobWFwKSkge1xuJiM0MztcdFx0XHRjb2RlZ2VuKFwmIzM0O1xcXG4mIzQzO1x0XHRcXG5cXFxuJiM0MztcdFx0XHRlcnIgPSBza2VsX3Byb3RlY3RfbWFwX2RhdGEoc2tlbC1cdTAwM2UlMSRzLCBcdTAwMjZza2VsLVx1MDAzZW1hcHMuJTEkcy5pbml0aWFsX3ZhbHVlLCAlMiR6ZCk7XFxuXFxcbiYjNDM7XHRcdFx0aWYgKGVycilcdFx0XHRcdFx0ICAgIFxcblxcXG4mIzQzO1x0XHRcdFx0cmV0dXJuIGVycjtcdFx0XHRcdCAgICBcXG5cXFxuJiM0MztcdFx0I2lmZGVmIF9fS0VSTkVMX19cdFx0XHRcdFx0ICAgIFxcblxcXG4mIzQzO1x0XHRcdHNrZWwtXHUwMDNlJTEkcyA9IE5VTEw7XHRcdFx0XHQgICAgXFxuXFxcbiYjNDM7XHRcdCNlbmRpZlx0XHRcdFx0XHRcdFx0ICAgIFxcblxcXG4mIzQzO1x0XHRcdFwmIzM0OyxcbiYjNDM7XHRcdFx0aWRlbnQsIGJwZl9tYXBfbW1hcF9zeihtYXApKTtcbiYjNDM7XHRcdFx0Y29udGludWU7XG4mIzQzO1x0XHR9XG4mIzQzO1xuIFx0XHRpZiAoYnBmX21hcF9fbWFwX2ZsYWdzKG1hcCkgXHUwMDI2IEJQRl9GX1JET05MWV9QUk9HKVxuIFx0XHRcdG1tYXBfZmxhZ3MgPSBcJiMzNDtQUk9UX1JFQURcJiMzNDs7XG4gXHRcdGVsc2VcbkBAIC0xNzQwLDYgJiM0MzsxNzc1LDggQEAgc3RhdGljIGludCBkb19zdWJza2VsZXRvbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpXG4gXG4gXHRcdGlmICghaXNfbW1hcGFibGVfbWFwKG1hcCwgaWRlbnQsIHNpemVvZihpZGVudCkpKVxuIFx0XHRcdGNvbnRpbnVlO1xuJiM0MztcdFx0aWYgKGJwZl9tYXBfaXNfcGVyY3B1X2RhdGEobWFwKSlcbiYjNDM7XHRcdFx0Y29udGludWU7XG4gXG4gXHRcdG1hcF90eXBlX2lkID0gYnBmX21hcF9fYnRmX3ZhbHVlX3R5cGVfaWQobWFwKTtcbiBcdFx0aWYgKG1hcF90eXBlX2lkIFx1MDAzYz0gMCkge1xuQEAgLTE4NjMsNiAmIzQzOzE5MDAsOCBAQCBzdGF0aWMgaW50IGRvX3N1YnNrZWxldG9uKGludCBhcmdjLCBjaGFyICoqYXJndilcbiBcdGJwZl9vYmplY3RfX2Zvcl9lYWNoX21hcChtYXAsIG9iaikge1xuIFx0XHRpZiAoIWlzX21tYXBhYmxlX21hcChtYXAsIGlkZW50LCBzaXplb2YoaWRlbnQpKSlcbiBcdFx0XHRjb250aW51ZTtcbiYjNDM7XHRcdGlmIChicGZfbWFwX2lzX3BlcmNwdV9kYXRhKG1hcCkpXG4mIzQzO1x0XHRcdGNvbnRpbnVlO1xuIFxuIFx0XHRtYXBfdHlwZV9pZCA9IGJwZl9tYXBfX2J0Zl92YWx1ZV90eXBlX2lkKG1hcCk7XG4gXHRcdGlmIChtYXBfdHlwZV9pZCBcdTAwM2M9IDApXG5kaWZmIC0tZ2l0IGEvdG9vbHMvbGliL2JwZi9icGZfZ2VuX2ludGVybmFsLmggYi90b29scy9saWIvYnBmL2JwZl9nZW5faW50ZXJuYWwuaFxuaW5kZXggNDlhZjQyNjBiOGU2YjcuLjVlYTgzODM4MDVkM2JjIDEwMDY0NFxuLS0tIGEvdG9vbHMvbGliL2JwZi9icGZfZ2VuX2ludGVybmFsLmhcbiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL2xpYi9icGYvYnBmX2dlbl9pbnRlcm5hbC5oXG5AQCAtNjYsNyAmIzQzOzY2LDggQEAgdm9pZCBicGZfZ2VuX19wcm9nX2xvYWQoc3RydWN0IGJwZl9nZW4gKmdlbixcbiBcdFx0XHRlbnVtIGJwZl9wcm9nX3R5cGUgcHJvZ190eXBlLCBjb25zdCBjaGFyICpwcm9nX25hbWUsXG4gXHRcdFx0Y29uc3QgY2hhciAqbGljZW5zZSwgc3RydWN0IGJwZl9pbnNuICppbnNucywgc2l6ZV90IGluc25fY250LFxuIFx0XHRcdHN0cnVjdCBicGZfcHJvZ19sb2FkX29wdHMgKmxvYWRfYXR0ciwgaW50IHByb2dfaWR4KTtcbi12b2lkIGJwZl9nZW5fX21hcF91cGRhdGVfZWxlbShzdHJ1Y3QgYnBmX2dlbiAqZ2VuLCBpbnQgbWFwX2lkeCwgdm9pZCAqdmFsdWUsIF9fdTMyIHZhbHVlX3NpemUpO1xuJiM0Mzt2b2lkIGJwZl9nZW5fX21hcF91cGRhdGVfZWxlbShzdHJ1Y3QgYnBmX2dlbiAqZ2VuLCBpbnQgbWFwX2lkeCwgdm9pZCAqdmFsdWUsIF9fdTMyIHZhbHVlX3NpemUsXG4mIzQzO1x0XHRcdCAgICAgIF9fdTY0IGZsYWdzKTtcbiB2b2lkIGJwZl9nZW5fX21hcF9mcmVlemUoc3RydWN0IGJwZl9nZW4gKmdlbiwgaW50IG1hcF9pZHgpO1xuIHZvaWQgYnBmX2dlbl9fcmVjb3JkX2F0dGFjaF90YXJnZXQoc3RydWN0IGJwZl9nZW4gKmdlbiwgY29uc3QgY2hhciAqbmFtZSwgZW51bSBicGZfYXR0YWNoX3R5cGUgdHlwZSk7XG4gdm9pZCBicGZfZ2VuX19yZWNvcmRfZXh0ZXJuKHN0cnVjdCBicGZfZ2VuICpnZW4sIGNvbnN0IGNoYXIgKm5hbWUsIGJvb2wgaXNfd2VhayxcbmRpZmYgLS1naXQgYS90b29scy9saWIvYnBmL2ZlYXR1cmVzLmMgYi90b29scy9saWIvYnBmL2ZlYXR1cmVzLmNcbmluZGV4IGI3ZTM4OGY5OWQwYmJkLi5lZjk1ODFjMTEzMDM1NSAxMDA2NDRcbi0tLSBhL3Rvb2xzL2xpYi9icGYvZmVhdHVyZXMuY1xuJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvbGliL2JwZi9mZWF0dXJlcy5jXG5AQCAtNjIwLDYgJiM0Mzs2MjAsMzggQEAgc3RhdGljIGludCBwcm9iZV9icGZfc3lzY2FsbF9jb21tb25fYXR0cnMoaW50IHRva2VuX2ZkKVxuIFx0cmV0dXJuIHByb2JlX3N5c19icGZfZXh0KCk7XG4gfVxuIFxuJiM0MztzdGF0aWMgaW50IHByb2JlX2tlcm5fcGVyY3B1X2RhdGEoaW50IHRva2VuX2ZkKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IGJwZl9pbnNuIGluc25zW10gPSB7XG4mIzQzO1x0XHRCUEZfTERfTUFQX1ZBTFVFKEJQRl9SRUdfMSwgMCwgMCksXG4mIzQzO1x0XHRCUEZfTERYX01FTShCUEZfRFcsIEJQRl9SRUdfMCwgQlBGX1JFR18xLCAwKSxcbiYjNDM7XHRcdEJQRl9FWElUX0lOU04oKSxcbiYjNDM7XHR9O1xuJiM0MztcdExJQkJQRl9PUFRTKGJwZl9tYXBfY3JlYXRlX29wdHMsIG1hcF9vcHRzLFxuJiM0MztcdFx0LnRva2VuX2ZkID0gdG9rZW5fZmQsXG4mIzQzO1x0XHQubWFwX2ZsYWdzID0gdG9rZW5fZmQgPyBCUEZfRl9UT0tFTl9GRCA6IDAsXG4mIzQzO1x0KTtcbiYjNDM7XHRMSUJCUEZfT1BUUyhicGZfcHJvZ19sb2FkX29wdHMsIHByb2dfb3B0cyxcbiYjNDM7XHRcdC50b2tlbl9mZCA9IHRva2VuX2ZkLFxuJiM0MztcdFx0LnByb2dfZmxhZ3MgPSB0b2tlbl9mZCA/IEJQRl9GX1RPS0VOX0ZEIDogMCxcbiYjNDM7XHQpO1xuJiM0MztcdGludCByZXQsIG1hcCwgaW5zbl9jbnQgPSBBUlJBWV9TSVpFKGluc25zKTtcbiYjNDM7XG4mIzQzO1x0bWFwID0gYnBmX21hcF9jcmVhdGUoQlBGX01BUF9UWVBFX1BFUkNQVV9BUlJBWSwgXCYjMzQ7bGliYnBmX3BlcmNwdVwmIzM0Oywgc2l6ZW9mKGludCksIDgsIDEsXG4mIzQzO1x0XHRcdCAgICAgXHUwMDI2bWFwX29wdHMpO1xuJiM0MztcdGlmIChtYXAgXHUwMDNjIDApIHtcbiYjNDM7XHRcdHByX3dhcm4oXCYjMzQ7RXJyb3IgaW4gJXMoKTogJXMuIENvdWxkbiYjMzk7dCBjcmVhdGUgc2ltcGxlIHBlcmNwdV9hcnJheSBtYXAuXFxuXCYjMzQ7LFxuJiM0MztcdFx0XHRfX2Z1bmNfXywgZXJyc3RyKG1hcCkpO1xuJiM0MztcdFx0cmV0dXJuIG1hcDtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdGluc25zWzBdLmltbSA9IG1hcDtcbiYjNDM7XG4mIzQzO1x0cmV0ID0gYnBmX3Byb2dfbG9hZChCUEZfUFJPR19UWVBFX1NPQ0tFVF9GSUxURVIsIE5VTEwsIFwmIzM0O0dQTFwmIzM0OywgaW5zbnMsIGluc25fY250LCBcdTAwMjZwcm9nX29wdHMpO1xuJiM0MztcdGNsb3NlKG1hcCk7XG4mIzQzO1x0cmV0dXJuIHByb2JlX2ZkKHJldCk7XG4mIzQzO31cbiYjNDM7XG4gdHlwZWRlZiBpbnQgKCpmZWF0dXJlX3Byb2JlX2ZuKShpbnQgLyogdG9rZW5fZmQgKi8pO1xuIFxuIHN0YXRpYyBzdHJ1Y3Qga2Vybl9mZWF0dXJlX2NhY2hlIGZlYXR1cmVfY2FjaGU7XG5AQCAtNzA3LDYgJiM0Mzs3MzksOSBAQCBzdGF0aWMgc3RydWN0IGtlcm5fZmVhdHVyZV9kZXNjIHtcbiBcdFtGRUFUX0JQRl9TWVNDQUxMX0NPTU1PTl9BVFRSU10gPSB7XG4gXHRcdFwmIzM0O0JQRiBzeXNjYWxsIGNvbW1vbiBhdHRyaWJ1dGVzIHN1cHBvcnRcJiMzNDssIHByb2JlX2JwZl9zeXNjYWxsX2NvbW1vbl9hdHRycyxcbiBcdH0sXG4mIzQzO1x0W0ZFQVRfUEVSQ1BVX0RBVEFdID0ge1xuJiM0MztcdFx0XCYjMzQ7a2VybmVsIHN1cHBvcnRzIHBlcmNwdSBkYXRhXCYjMzQ7LCBwcm9iZV9rZXJuX3BlcmNwdV9kYXRhLFxuJiM0MztcdH0sXG4gfTtcbiBcbiBib29sIGZlYXRfc3VwcG9ydGVkKHN0cnVjdCBrZXJuX2ZlYXR1cmVfY2FjaGUgKmNhY2hlLCBlbnVtIGtlcm5fZmVhdHVyZV9pZCBmZWF0X2lkKVxuZGlmZiAtLWdpdCBhL3Rvb2xzL2xpYi9icGYvZ2VuX2xvYWRlci5jIGIvdG9vbHMvbGliL2JwZi9nZW5fbG9hZGVyLmNcbmluZGV4IGM3ZjJkMmFjN2JiMzVmLi42MGExMjA0ZTlhMjYzYyAxMDA2NDRcbi0tLSBhL3Rvb2xzL2xpYi9icGYvZ2VuX2xvYWRlci5jXG4mIzQzOyYjNDM7JiM0MzsgYi90b29scy9saWIvYnBmL2dlbl9sb2FkZXIuY1xuQEAgLTExOTAsNyAmIzQzOzExOTAsNyBAQCB2b2lkIGJwZl9nZW5fX3Byb2dfbG9hZChzdHJ1Y3QgYnBmX2dlbiAqZ2VuLFxuIH1cbiBcbiB2b2lkIGJwZl9nZW5fX21hcF91cGRhdGVfZWxlbShzdHJ1Y3QgYnBmX2dlbiAqZ2VuLCBpbnQgbWFwX2lkeCwgdm9pZCAqcHZhbHVlLFxuLVx0XHRcdCAgICAgIF9fdTMyIHZhbHVlX3NpemUpXG4mIzQzO1x0XHRcdCAgICAgIF9fdTMyIHZhbHVlX3NpemUsIF9fdTY0IGZsYWdzKVxuIHtcbiBcdGludCBhdHRyX3NpemUgPSBvZmZzZXRvZmVuZCh1bmlvbiBicGZfYXR0ciwgZmxhZ3MpO1xuIFx0aW50IG1hcF91cGRhdGVfYXR0ciwgdmFsdWUsIGtleTtcbkBAIC0xMTk4LDYgJiM0MzsxMTk4LDcgQEAgdm9pZCBicGZfZ2VuX19tYXBfdXBkYXRlX2VsZW0oc3RydWN0IGJwZl9nZW4gKmdlbiwgaW50IG1hcF9pZHgsIHZvaWQgKnB2YWx1ZSxcbiBcdGludCB6ZXJvID0gMDtcbiBcbiBcdG1lbXNldChcdTAwMjZhdHRyLCAwLCBhdHRyX3NpemUpO1xuJiM0MztcdGF0dHIuZmxhZ3MgPSB0Z3RfZW5kaWFuKGZsYWdzKTtcbiBcbiBcdHZhbHVlID0gYWRkX2RhdGEoZ2VuLCBwdmFsdWUsIHZhbHVlX3NpemUpO1xuIFx0a2V5ID0gYWRkX2RhdGEoZ2VuLCBcdTAwMjZ6ZXJvLCBzaXplb2YoemVybykpO1xuZGlmZiAtLWdpdCBhL3Rvb2xzL2xpYi9icGYvbGliYnBmLmMgYi90b29scy9saWIvYnBmL2xpYmJwZi5jXG5pbmRleCA3MTYyMTQ2MjgwYTgwZS4uNmUxOGExNjI4ZTEzOTYgMTAwNjQ0XG4tLS0gYS90b29scy9saWIvYnBmL2xpYmJwZi5jXG4mIzQzOyYjNDM7JiM0MzsgYi90b29scy9saWIvYnBmL2xpYmJwZi5jXG5AQCAtNTQxLDYgJiM0Mzs1NDEsNyBAQCBzdHJ1Y3QgYnBmX3N0cnVjdF9vcHMge1xuIH07XG4gXG4gI2RlZmluZSBEQVRBX1NFQyBcJiMzNDsuZGF0YVwmIzM0O1xuJiM0MzsjZGVmaW5lIFBFUkNQVV9TRUMgXCYjMzQ7LnBlcmNwdVwmIzM0O1xuICNkZWZpbmUgQlNTX1NFQyBcJiMzNDsuYnNzXCYjMzQ7XG4gI2RlZmluZSBST0RBVEFfU0VDIFwmIzM0Oy5yb2RhdGFcJiMzNDtcbiAjZGVmaW5lIEtDT05GSUdfU0VDIFwmIzM0Oy5rY29uZmlnXCYjMzQ7XG5AQCAtNTU1LDYgJiM0Mzs1NTYsNyBAQCBlbnVtIGxpYmJwZl9tYXBfdHlwZSB7XG4gXHRMSUJCUEZfTUFQX0JTUyxcbiBcdExJQkJQRl9NQVBfUk9EQVRBLFxuIFx0TElCQlBGX01BUF9LQ09ORklHLFxuJiM0MztcdExJQkJQRl9NQVBfUEVSQ1BVLFxuIH07XG4gXG4gc3RydWN0IGJwZl9tYXBfZGVmIHtcbkBAIC02NjYsNiAmIzQzOzY2OCw3IEBAIGVudW0gc2VjX3R5cGUge1xuIFx0U0VDX0RBVEEsXG4gXHRTRUNfUk9EQVRBLFxuIFx0U0VDX1NUX09QUyxcbiYjNDM7XHRTRUNfUEVSQ1BVLFxuIH07XG4gXG4gc3RydWN0IGVsZl9zZWNfZGVzYyB7XG5AQCAtMTgzOSw2ICYjNDM7MTg0Miw4IEBAIHN0YXRpYyBzaXplX3QgYnBmX21hcF9tbWFwX3N6KGNvbnN0IHN0cnVjdCBicGZfbWFwICptYXApXG4gXHRzd2l0Y2ggKG1hcC1cdTAwM2VkZWYudHlwZSkge1xuIFx0Y2FzZSBCUEZfTUFQX1RZUEVfQVJSQVk6XG4gXHRcdHJldHVybiBhcnJheV9tYXBfbW1hcF9zeihtYXAtXHUwMDNlZGVmLnZhbHVlX3NpemUsIG1hcC1cdTAwM2VkZWYubWF4X2VudHJpZXMpO1xuJiM0MztcdGNhc2UgQlBGX01BUF9UWVBFX1BFUkNQVV9BUlJBWTpcbiYjNDM7XHRcdHJldHVybiBtYXAtXHUwMDNlZGVmLnZhbHVlX3NpemU7XG4gXHRjYXNlIEJQRl9NQVBfVFlQRV9BUkVOQTpcbiBcdFx0cmV0dXJuIHBhZ2Vfc3ogKiBtYXAtXHUwMDNlZGVmLm1heF9lbnRyaWVzO1xuIFx0ZGVmYXVsdDpcbkBAIC0xOTM4LDcgJiM0MzsxOTQzLDcgQEAgc3RhdGljIGJvb2wgbWFwX2lzX21tYXBhYmxlKHN0cnVjdCBicGZfb2JqZWN0ICpvYmosIHN0cnVjdCBicGZfbWFwICptYXApXG4gXHRzdHJ1Y3QgYnRmX3Zhcl9zZWNpbmZvICp2c2k7XG4gXHRpbnQgaSwgbjtcbiBcbi1cdGlmICghbWFwLVx1MDAzZWJ0Zl92YWx1ZV90eXBlX2lkKVxuJiM0MztcdGlmICghbWFwLVx1MDAzZWJ0Zl92YWx1ZV90eXBlX2lkIHx8IG1hcC1cdTAwM2VsaWJicGZfdHlwZSA9PSBMSUJCUEZfTUFQX1BFUkNQVSlcbiBcdFx0cmV0dXJuIGZhbHNlO1xuIFxuIFx0dCA9IGJ0Zl9fdHlwZV9ieV9pZChvYmotXHUwMDNlYnRmLCBtYXAtXHUwMDNlYnRmX3ZhbHVlX3R5cGVfaWQpO1xuQEAgLTE5NjIsNiAmIzQzOzE5NjcsNyBAQCBzdGF0aWMgaW50XG4gYnBmX29iamVjdF9faW5pdF9pbnRlcm5hbF9tYXAoc3RydWN0IGJwZl9vYmplY3QgKm9iaiwgZW51bSBsaWJicGZfbWFwX3R5cGUgdHlwZSxcbiBcdFx0XHQgICAgICBjb25zdCBjaGFyICpyZWFsX25hbWUsIGludCBzZWNfaWR4LCB2b2lkICpkYXRhLCBzaXplX3QgZGF0YV9zeilcbiB7XG4mIzQzO1x0Ym9vbCBpc19wZXJjcHUgPSB0eXBlID09IExJQkJQRl9NQVBfUEVSQ1BVO1xuIFx0c3RydWN0IGJwZl9tYXBfZGVmICpkZWY7XG4gXHRzdHJ1Y3QgYnBmX21hcCAqbWFwO1xuIFx0c2l6ZV90IG1tYXBfc3o7XG5AQCAtMTk3NSw3ICYjNDM7MTk4MSw3IEBAIGJwZl9vYmplY3RfX2luaXRfaW50ZXJuYWxfbWFwKHN0cnVjdCBicGZfb2JqZWN0ICpvYmosIGVudW0gbGliYnBmX21hcF90eXBlIHR5cGUsXG4gXHRtYXAtXHUwMDNlc2VjX2lkeCA9IHNlY19pZHg7XG4gXHRtYXAtXHUwMDNlc2VjX29mZnNldCA9IDA7XG4gXHRtYXAtXHUwMDNlcmVhbF9uYW1lID0gc3RyZHVwKHJlYWxfbmFtZSk7XG4tXHRtYXAtXHUwMDNlbmFtZSA9IGludGVybmFsX21hcF9uYW1lKG9iaiwgcmVhbF9uYW1lKTtcbiYjNDM7XHRtYXAtXHUwMDNlbmFtZSA9IGlzX3BlcmNwdSA/IHN0cmR1cChyZWFsX25hbWUpIDogaW50ZXJuYWxfbWFwX25hbWUob2JqLCByZWFsX25hbWUpO1xuIFx0aWYgKCFtYXAtXHUwMDNlcmVhbF9uYW1lIHx8ICFtYXAtXHUwMDNlbmFtZSkge1xuIFx0XHR6ZnJlZShcdTAwMjZtYXAtXHUwMDNlcmVhbF9uYW1lKTtcbiBcdFx0emZyZWUoXHUwMDI2bWFwLVx1MDAzZW5hbWUpO1xuQEAgLTE5ODMsNyAmIzQzOzE5ODksNyBAQCBicGZfb2JqZWN0X19pbml0X2ludGVybmFsX21hcChzdHJ1Y3QgYnBmX29iamVjdCAqb2JqLCBlbnVtIGxpYmJwZl9tYXBfdHlwZSB0eXBlLFxuIFx0fVxuIFxuIFx0ZGVmID0gXHUwMDI2bWFwLVx1MDAzZWRlZjtcbi1cdGRlZi1cdTAwM2V0eXBlID0gQlBGX01BUF9UWVBFX0FSUkFZO1xuJiM0MztcdGRlZi1cdTAwM2V0eXBlID0gaXNfcGVyY3B1ID8gQlBGX01BUF9UWVBFX1BFUkNQVV9BUlJBWSA6IEJQRl9NQVBfVFlQRV9BUlJBWTtcbiBcdGRlZi1cdTAwM2VrZXlfc2l6ZSA9IHNpemVvZihpbnQpO1xuIFx0ZGVmLVx1MDAzZXZhbHVlX3NpemUgPSBkYXRhX3N6O1xuIFx0ZGVmLVx1MDAzZW1heF9lbnRyaWVzID0gMTtcbkBAIC0xOTk2LDggJiM0MzsyMDAyLDkgQEAgYnBmX29iamVjdF9faW5pdF9pbnRlcm5hbF9tYXAoc3RydWN0IGJwZl9vYmplY3QgKm9iaiwgZW51bSBsaWJicGZfbWFwX3R5cGUgdHlwZSxcbiBcdGlmIChtYXBfaXNfbW1hcGFibGUob2JqLCBtYXApKVxuIFx0XHRkZWYtXHUwMDNlbWFwX2ZsYWdzIHw9IEJQRl9GX01NQVBBQkxFO1xuIFxuLVx0cHJfZGVidWcoXCYjMzQ7bWFwICYjMzk7JXMmIzM5OyAoZ2xvYmFsIGRhdGEpOiBhdCBzZWNfaWR4ICVkLCBvZmZzZXQgJXp1LCBmbGFncyAleC5cXG5cJiMzNDssXG4tXHRcdCBtYXAtXHUwMDNlbmFtZSwgbWFwLVx1MDAzZXNlY19pZHgsIG1hcC1cdTAwM2VzZWNfb2Zmc2V0LCBkZWYtXHUwMDNlbWFwX2ZsYWdzKTtcbiYjNDM7XHRwcl9kZWJ1ZyhcJiMzNDttYXAgJiMzOTslcyYjMzk7IChnbG9iYWwgJXNkYXRhKTogYXQgc2VjX2lkeCAlZCwgb2Zmc2V0ICV6dSwgZmxhZ3MgJXguXFxuXCYjMzQ7LFxuJiM0MztcdFx0IG1hcC1cdTAwM2VuYW1lLCBpc19wZXJjcHUgPyBcJiMzNDtwZXJjcHUgXCYjMzQ7IDogXCYjMzQ7XCYjMzQ7LCBtYXAtXHUwMDNlc2VjX2lkeCxcbiYjNDM7XHRcdCBtYXAtXHUwMDNlc2VjX29mZnNldCwgZGVmLVx1MDAzZW1hcF9mbGFncyk7XG4gXG4gXHRtbWFwX3N6ID0gYnBmX21hcF9tbWFwX3N6KG1hcCk7XG4gXHRtYXAtXHUwMDNlbW1hcGVkID0gbW1hcChOVUxMLCBtbWFwX3N6LCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLFxuQEAgLTIwNTcsNiAmIzQzOzIwNjQsMTMgQEAgc3RhdGljIGludCBicGZfb2JqZWN0X19pbml0X2dsb2JhbF9kYXRhX21hcHMoc3RydWN0IGJwZl9vYmplY3QgKm9iailcbiBcdFx0XHRcdFx0XHRcdCAgICBOVUxMLFxuIFx0XHRcdFx0XHRcdFx0ICAgIHNlY19kZXNjLVx1MDAzZWRhdGEtXHUwMDNlZF9zaXplKTtcbiBcdFx0XHRicmVhaztcbiYjNDM7XHRcdGNhc2UgU0VDX1BFUkNQVTpcbiYjNDM7XHRcdFx0c2VjX25hbWUgPSBlbGZfc2VjX25hbWUob2JqLCBlbGZfc2VjX2J5X2lkeChvYmosIHNlY19pZHgpKTtcbiYjNDM7XHRcdFx0ZXJyID0gYnBmX29iamVjdF9faW5pdF9pbnRlcm5hbF9tYXAob2JqLCBMSUJCUEZfTUFQX1BFUkNQVSxcbiYjNDM7XHRcdFx0XHRcdFx0XHQgICAgc2VjX25hbWUsIHNlY19pZHgsXG4mIzQzO1x0XHRcdFx0XHRcdFx0ICAgIHNlY19kZXNjLVx1MDAzZWRhdGEtXHUwMDNlZF9idWYsXG4mIzQzO1x0XHRcdFx0XHRcdFx0ICAgIHNlY19kZXNjLVx1MDAzZWRhdGEtXHUwMDNlZF9zaXplKTtcbiYjNDM7XHRcdFx0YnJlYWs7XG4gXHRcdGRlZmF1bHQ6XG4gXHRcdFx0Lyogc2tpcCAqL1xuIFx0XHRcdGJyZWFrO1xuQEAgLTQwMTYsNiAmIzQzOzQwMzAsMTEgQEAgc3RhdGljIGludCBicGZfb2JqZWN0X19lbGZfY29sbGVjdChzdHJ1Y3QgYnBmX29iamVjdCAqb2JqKVxuIFx0XHRcdFx0c2VjX2Rlc2MtXHUwMDNlc2VjX3R5cGUgPSBTRUNfUk9EQVRBO1xuIFx0XHRcdFx0c2VjX2Rlc2MtXHUwMDNlc2hkciA9IHNoO1xuIFx0XHRcdFx0c2VjX2Rlc2MtXHUwMDNlZGF0YSA9IGRhdGE7XG4mIzQzO1x0XHRcdH0gZWxzZSBpZiAoc3RyY21wKG5hbWUsIFBFUkNQVV9TRUMpID09IDAgfHxcbiYjNDM7XHRcdFx0XHQgICBzdHJfaGFzX3BmeChuYW1lLCBQRVJDUFVfU0VDIFwmIzM0Oy5cJiMzNDspKSB7XG4mIzQzO1x0XHRcdFx0c2VjX2Rlc2MtXHUwMDNlc2VjX3R5cGUgPSBTRUNfUEVSQ1BVO1xuJiM0MztcdFx0XHRcdHNlY19kZXNjLVx1MDAzZXNoZHIgPSBzaDtcbiYjNDM7XHRcdFx0XHRzZWNfZGVzYy1cdTAwM2VkYXRhID0gZGF0YTtcbiBcdFx0XHR9IGVsc2UgaWYgKHN0cmNtcChuYW1lLCBTVFJVQ1RfT1BTX1NFQykgPT0gMCB8fFxuIFx0XHRcdFx0ICAgc3RyY21wKG5hbWUsIFNUUlVDVF9PUFNfTElOS19TRUMpID09IDAgfHxcbiBcdFx0XHRcdCAgIHN0cmNtcChuYW1lLCBcJiMzNDs/XCYjMzQ7IFNUUlVDVF9PUFNfU0VDKSA9PSAwIHx8XG5AQCAtNDU0NCw2ICYjNDM7NDU2Myw3IEBAIHN0YXRpYyBib29sIGJwZl9vYmplY3RfX3NobmR4X2lzX2RhdGEoY29uc3Qgc3RydWN0IGJwZl9vYmplY3QgKm9iaixcbiBcdGNhc2UgU0VDX0JTUzpcbiBcdGNhc2UgU0VDX0RBVEE6XG4gXHRjYXNlIFNFQ19ST0RBVEE6XG4mIzQzO1x0Y2FzZSBTRUNfUEVSQ1BVOlxuIFx0XHRyZXR1cm4gdHJ1ZTtcbiBcdGRlZmF1bHQ6XG4gXHRcdHJldHVybiBmYWxzZTtcbkBAIC00NTY5LDYgJiM0Mzs0NTg5LDggQEAgYnBmX29iamVjdF9fc2VjdGlvbl90b19saWJicGZfbWFwX3R5cGUoY29uc3Qgc3RydWN0IGJwZl9vYmplY3QgKm9iaiwgaW50IHNobmR4KVxuIFx0XHRyZXR1cm4gTElCQlBGX01BUF9EQVRBO1xuIFx0Y2FzZSBTRUNfUk9EQVRBOlxuIFx0XHRyZXR1cm4gTElCQlBGX01BUF9ST0RBVEE7XG4mIzQzO1x0Y2FzZSBTRUNfUEVSQ1BVOlxuJiM0MztcdFx0cmV0dXJuIExJQkJQRl9NQVBfUEVSQ1BVO1xuIFx0ZGVmYXVsdDpcbiBcdFx0cmV0dXJuIExJQkJQRl9NQVBfVU5TUEVDO1xuIFx0fVxuQEAgLTQ5NDQsNyAmIzQzOzQ5NjYsNyBAQCBzdGF0aWMgaW50IG1hcF9maWxsX2J0Zl90eXBlX2luZm8oc3RydWN0IGJwZl9vYmplY3QgKm9iaiwgc3RydWN0IGJwZl9tYXAgKm1hcClcbiBcbiBcdC8qXG4gXHQgKiBMTFZNIGFubm90YXRlcyBnbG9iYWwgZGF0YSBkaWZmZXJlbnRseSBpbiBCVEYsIHRoYXQgaXMsXG4tXHQgKiBvbmx5IGFzICYjMzk7LmRhdGEmIzM5OywgJiMzOTsuYnNzJiMzOTsgb3IgJiMzOTsucm9kYXRhJiMzOTsuXG4mIzQzO1x0ICogb25seSBhcyAmIzM5Oy5kYXRhJiMzOTssICYjMzk7LmJzcyYjMzk7LCAmIzM5Oy5wZXJjcHUmIzM5OyBvciAmIzM5Oy5yb2RhdGEmIzM5Oy5cbiBcdCAqL1xuIFx0aWYgKCFicGZfbWFwX19pc19pbnRlcm5hbChtYXApKVxuIFx0XHRyZXR1cm4gLUVOT0VOVDtcbkBAIC01Mjk3LDE4ICYjNDM7NTMxOSwzMCBAQCBzdGF0aWMgaW50XG4gYnBmX29iamVjdF9fcG9wdWxhdGVfaW50ZXJuYWxfbWFwKHN0cnVjdCBicGZfb2JqZWN0ICpvYmosIHN0cnVjdCBicGZfbWFwICptYXApXG4ge1xuIFx0ZW51bSBsaWJicGZfbWFwX3R5cGUgbWFwX3R5cGUgPSBtYXAtXHUwMDNlbGliYnBmX3R5cGU7XG4mIzQzO1x0Ym9vbCBpc19wZXJjcHUgPSBtYXBfdHlwZSA9PSBMSUJCUEZfTUFQX1BFUkNQVTtcbiYjNDM7XHRfX3U2NCB1cGRhdGVfZmxhZ3MgPSAwO1xuIFx0aW50IGVyciwgemVybyA9IDA7XG4gXHRzaXplX3QgbW1hcF9zejtcbiBcbiYjNDM7XHRpZiAoaXNfcGVyY3B1KSB7XG4mIzQzO1x0XHRpZiAoIW9iai1cdTAwM2VnZW5fbG9hZGVyIFx1MDAyNlx1MDAyNiAha2VybmVsX3N1cHBvcnRzKG9iaiwgRkVBVF9QRVJDUFVfREFUQSkpIHtcbiYjNDM7XHRcdFx0cHJfd2FybihcJiMzNDttYXAgJiMzOTslcyYjMzk7OiBrZXJuZWwgZG9lcyBub3Qgc3VwcG9ydCBwZXJjcHUgZGF0YS5cXG5cJiMzNDssXG4mIzQzO1x0XHRcdFx0YnBmX21hcF9fbmFtZShtYXApKTtcbiYjNDM7XHRcdFx0cmV0dXJuIC1FT1BOT1RTVVBQO1xuJiM0MztcdFx0fVxuJiM0MztcbiYjNDM7XHRcdHVwZGF0ZV9mbGFncyA9IEJQRl9GX0FMTF9DUFVTO1xuJiM0MztcdH1cbiYjNDM7XG4gXHRpZiAob2JqLVx1MDAzZWdlbl9sb2FkZXIpIHtcbiBcdFx0YnBmX2dlbl9fbWFwX3VwZGF0ZV9lbGVtKG9iai1cdTAwM2VnZW5fbG9hZGVyLCBtYXAgLSBvYmotXHUwMDNlbWFwcyxcbi1cdFx0XHRcdFx0IG1hcC1cdTAwM2VtbWFwZWQsIG1hcC1cdTAwM2VkZWYudmFsdWVfc2l6ZSk7XG4mIzQzO1x0XHRcdFx0XHQgbWFwLVx1MDAzZW1tYXBlZCwgbWFwLVx1MDAzZWRlZi52YWx1ZV9zaXplLCB1cGRhdGVfZmxhZ3MpO1xuIFx0XHRpZiAobWFwX3R5cGUgPT0gTElCQlBGX01BUF9ST0RBVEEgfHwgbWFwX3R5cGUgPT0gTElCQlBGX01BUF9LQ09ORklHKVxuIFx0XHRcdGJwZl9nZW5fX21hcF9mcmVlemUob2JqLVx1MDAzZWdlbl9sb2FkZXIsIG1hcCAtIG9iai1cdTAwM2VtYXBzKTtcbiBcdFx0cmV0dXJuIDA7XG4gXHR9XG4gXG4tXHRlcnIgPSBicGZfbWFwX3VwZGF0ZV9lbGVtKG1hcC1cdTAwM2VmZCwgXHUwMDI2emVybywgbWFwLVx1MDAzZW1tYXBlZCwgMCk7XG4mIzQzO1x0ZXJyID0gYnBmX21hcF91cGRhdGVfZWxlbShtYXAtXHUwMDNlZmQsIFx1MDAyNnplcm8sIG1hcC1cdTAwM2VtbWFwZWQsIHVwZGF0ZV9mbGFncyk7XG4gXHRpZiAoZXJyKSB7XG4gXHRcdGVyciA9IC1lcnJubztcbiBcdFx0cHJfd2FybihcJiMzNDttYXAgJiMzOTslcyYjMzk7OiBmYWlsZWQgdG8gc2V0IGluaXRpYWwgY29udGVudHM6ICVzXFxuXCYjMzQ7LFxuQEAgLTUzNTMsNiAmIzQzOzUzODcsMTMgQEAgYnBmX29iamVjdF9fcG9wdWxhdGVfaW50ZXJuYWxfbWFwKHN0cnVjdCBicGZfb2JqZWN0ICpvYmosIHN0cnVjdCBicGZfbWFwICptYXApXG4gXHRcdFx0cmV0dXJuIGVycjtcbiBcdFx0fVxuIFx0XHRtYXAtXHUwMDNlbW1hcGVkID0gbW1hcGVkO1xuJiM0MztcdH0gZWxzZSBpZiAoaXNfcGVyY3B1KSB7XG4mIzQzO1x0XHRpZiAobXByb3RlY3QobWFwLVx1MDAzZW1tYXBlZCwgbW1hcF9zeiwgUFJPVF9SRUFEKSkge1xuJiM0MztcdFx0XHRlcnIgPSAtZXJybm87XG4mIzQzO1x0XHRcdHByX3dhcm4oXCYjMzQ7bWFwICYjMzk7JXMmIzM5OzogZmFpbGVkIHRvIG1wcm90ZWN0KCkgY29udGVudHM6ICVzXFxuXCYjMzQ7LFxuJiM0MztcdFx0XHRcdGJwZl9tYXBfX25hbWUobWFwKSwgZXJyc3RyKGVycikpO1xuJiM0MztcdFx0XHRyZXR1cm4gZXJyO1xuJiM0MztcdFx0fVxuIFx0fSBlbHNlIGlmIChtYXAtXHUwMDNlbW1hcGVkKSB7XG4gXHRcdG11bm1hcChtYXAtXHUwMDNlbW1hcGVkLCBtbWFwX3N6KTtcbiBcdFx0bWFwLVx1MDAzZW1tYXBlZCA9IE5VTEw7XG5kaWZmIC0tZ2l0IGEvdG9vbHMvbGliL2JwZi9saWJicGZfaW50ZXJuYWwuaCBiL3Rvb2xzL2xpYi9icGYvbGliYnBmX2ludGVybmFsLmhcbmluZGV4IDA0Y2QzMDNmYjVhODc5Li40N2FlMzkxMjVmNjhmOSAxMDA2NDRcbi0tLSBhL3Rvb2xzL2xpYi9icGYvbGliYnBmX2ludGVybmFsLmhcbiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL2xpYi9icGYvbGliYnBmX2ludGVybmFsLmhcbkBAIC00MDEsNiAmIzQzOzQwMSw4IEBAIGVudW0ga2Vybl9mZWF0dXJlX2lkIHtcbiBcdEZFQVRfQlRGX0xBWU9VVCxcbiBcdC8qIEtlcm5lbCBzdXBwb3J0cyBCUEYgc3lzY2FsbCBjb21tb24gYXR0cmlidXRlcyAqL1xuIFx0RkVBVF9CUEZfU1lTQ0FMTF9DT01NT05fQVRUUlMsXG4mIzQzO1x0LyogS2VybmVsIHN1cHBvcnRzIHBlcmNwdSBkYXRhICovXG4mIzQzO1x0RkVBVF9QRVJDUFVfREFUQSxcbiBcdF9fRkVBVF9DTlQsXG4gfTtcbiBcbmRpZmYgLS1naXQgYS90b29scy9saWIvYnBmL3NrZWxfaW50ZXJuYWwuaCBiL3Rvb2xzL2xpYi9icGYvc2tlbF9pbnRlcm5hbC5oXG5pbmRleCA3NDUwM2QzNThiYzhhNS4uNDg1YjBjZDE3MDE3MzkgMTAwNjQ0XG4tLS0gYS90b29scy9saWIvYnBmL3NrZWxfaW50ZXJuYWwuaFxuJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvbGliL2JwZi9za2VsX2ludGVybmFsLmhcbkBAIC0xMzUsOCAmIzQzOzEzNSwxMCBAQCBzdGF0aWMgaW5saW5lIHZvaWQgc2tlbF9mcmVlX21hcF9kYXRhKHZvaWQgKnAsIF9fdTY0IGFkZHIsIHNpemVfdCBzeilcbiB7XG4gXHRpZiAoYWRkciAhPSB+MFVMTClcbiBcdFx0a3ZmcmVlKHApO1xuLVx0LyogV2hlbiBhZGRyID09IH4wVUxMIHRoZSAmIzM5O3AmIzM5OyBwb2ludHMgdG9cbi1cdCAqICgoc3RydWN0IGJwZl9hcnJheSAqKW1hcCktXHUwMDNldmFsdWUuIFNlZSBza2VsX2ZpbmFsaXplX21hcF9kYXRhLlxuJiM0MztcdC8qXG4mIzQzO1x0ICogV2hlbiBhZGRyID09IH4wVUxMIHRoZSBpbml0IGJ1ZmZlciBoYXMgYWxyZWFkeSBiZWVuIHJlbGVhc2VkLlxuJiM0MztcdCAqIEZvciBza2VsX2ZpbmFsaXplX21hcF9kYXRhKCksICYjMzk7cCYjMzk7IHBvaW50cyB0b1xuJiM0MztcdCAqICgoc3RydWN0IGJwZl9hcnJheSAqKW1hcCktXHUwMDNldmFsdWUuXG4gXHQgKi9cbiB9XG4gXG5AQCAtMTc0LDYgJiM0MzsxNzYsMTUgQEAgc3RhdGljIGlubGluZSB2b2lkICpza2VsX2ZpbmFsaXplX21hcF9kYXRhKF9fdTY0ICppbml0X3ZhbCwgc2l6ZV90IG1tYXBfc3osIGludFxuIFx0cmV0dXJuIGFkZHI7XG4gfVxuIFxuJiM0MztzdGF0aWMgaW5saW5lIGludCBza2VsX3Byb3RlY3RfbWFwX2RhdGEodm9pZCAqcCwgX191NjQgKmluaXRfdmFsLCBzaXplX3Qgc3opXG4mIzQzO3tcbiYjNDM7XHQodm9pZClzejtcbiYjNDM7XG4mIzQzO1x0a3ZmcmVlKHApO1xuJiM0MztcdCppbml0X3ZhbCA9IH4wVUxMO1xuJiM0MztcdHJldHVybiAwO1xuJiM0Mzt9XG4mIzQzO1xuICNlbHNlXG4gXG4gc3RhdGljIGlubGluZSB2b2lkICpza2VsX2FsbG9jKHNpemVfdCBzaXplKVxuQEAgLTIxMiw2ICYjNDM7MjIzLDE1IEBAIHN0YXRpYyBpbmxpbmUgdm9pZCAqc2tlbF9maW5hbGl6ZV9tYXBfZGF0YShfX3U2NCAqaW5pdF92YWwsIHNpemVfdCBtbWFwX3N6LCBpbnRcbiBcdFx0cmV0dXJuIE5VTEw7XG4gXHRyZXR1cm4gYWRkcjtcbiB9XG4mIzQzO1xuJiM0MztzdGF0aWMgaW5saW5lIGludCBza2VsX3Byb3RlY3RfbWFwX2RhdGEodm9pZCAqcCwgX191NjQgKmluaXRfdmFsLCBzaXplX3Qgc3opXG4mIzQzO3tcbiYjNDM7XHQodm9pZClpbml0X3ZhbDtcbiYjNDM7XG4mIzQzO1x0aWYgKG1wcm90ZWN0KHAsIHN6LCBQUk9UX1JFQUQpKVxuJiM0MztcdFx0cmV0dXJuIC1lcnJubztcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7fVxuICNlbmRpZlxuIFxuIHN0YXRpYyBpbmxpbmUgaW50IHNrZWxfY2xvc2VueihpbnQgZmQpXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL01ha2VmaWxlIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL01ha2VmaWxlXG5pbmRleCBiNjQyZWU0ODllYTY0MC4uYzM3ZWQ5ZTdiOTdjZDAgMTAwNjQ0XG4tLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvTWFrZWZpbGVcbiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9NYWtlZmlsZVxuQEAgLTUzMyw3ICYjNDM7NTMzLDcgQEAgTFNLRUxTX1NJR05FRCA6PSBmZW50cnlfdGVzdC5jIGZleGl0X3Rlc3QuYyBhdG9taWNzLmNcbiBcbiAjIEdlbmVyYXRlIGJvdGggbGlnaHQgc2tlbGV0b24gYW5kIGxpYmJwZiBza2VsZXRvbiBmb3IgdGhlc2VcbiBMU0tFTFNfRVhUUkEgOj0gdGVzdF9rc3ltc19tb2R1bGUuYyB0ZXN0X2tzeW1zX3dlYWsuYyBrZnVuY19jYWxsX3Rlc3QuYyBcXFxuLVx0a2Z1bmNfY2FsbF90ZXN0X3N1YnByb2cuY1xuJiM0MztcdGtmdW5jX2NhbGxfdGVzdF9zdWJwcm9nLmMgdGVzdF9nbG9iYWxfcGVyY3B1X2RhdGEuY1xuIFNLRUxfQkxBQ0tMSVNUICYjNDM7PSAkJChMU0tFTFMpICQkKExTS0VMU19TSUdORUQpXG4gXG4gdGVzdF9zdGF0aWNfbGlua2VkLnNrZWwuaC1kZXBzIDo9IHRlc3Rfc3RhdGljX2xpbmtlZDEuYnBmLm8gdGVzdF9zdGF0aWNfbGlua2VkMi5icGYub1xuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2dsb2JhbF9kYXRhX2luaXQuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2dsb2JhbF9kYXRhX2luaXQuY1xuaW5kZXggODQ2NjMzMmQ3NDA2ZjQuLmE1ZDg3NzY4ZjZlZTJmIDEwMDY0NFxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvZ2xvYmFsX2RhdGFfaW5pdC5jXG4mIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9nbG9iYWxfZGF0YV9pbml0LmNcbkBAIC0xLDUgJiM0MzsxLDggQEBcbiAvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxuICNpbmNsdWRlIFx1MDAzY3Rlc3RfcHJvZ3MuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcJiMzNDticGYvbGliYnBmX2ludGVybmFsLmhcJiMzNDtcbiYjNDM7I2luY2x1ZGUgXCYjMzQ7dGVzdF9nbG9iYWxfcGVyY3B1X2RhdGEuc2tlbC5oXCYjMzQ7XG4mIzQzOyNpbmNsdWRlIFwmIzM0O3Rlc3RfZ2xvYmFsX3BlcmNwdV9kYXRhLmxza2VsLmhcJiMzNDtcbiBcbiB2b2lkIHRlc3RfZ2xvYmFsX2RhdGFfaW5pdCh2b2lkKVxuIHtcbkBAIC02MCwzICYjNDM7NjMsMjkwIEBAIHZvaWQgdGVzdF9nbG9iYWxfZGF0YV9pbml0KHZvaWQpXG4gXHRmcmVlKG5ld3ZhbCk7XG4gXHRicGZfb2JqZWN0X19jbG9zZShvYmopO1xuIH1cbiYjNDM7XG4mIzQzO3N0YXRpYyB2b2lkIHRlc3RfcGVyY3B1X2RhdGFfb25fY3B1cyhpbnQgbWFwX2ZkLCBpbnQgcHJvZ19mZCwgaW50IG51bV9vbmxpbmUsIGJvb2wgKm9ubGluZSlcbiYjNDM7e1xuJiM0MztcdF9fdTY0IGFyZ3NbMl0gPSB7MHgxMjM0VUxMLCAweDU2NzhVTEx9O1xuJiM0MztcdExJQkJQRl9PUFRTKGJwZl90ZXN0X3J1bl9vcHRzLCB0b3B0cyxcbiYjNDM7XHRcdCAgICAuY3R4X2luID0gYXJncyxcbiYjNDM7XHRcdCAgICAuY3R4X3NpemVfaW4gPSBzaXplb2YoYXJncyksXG4mIzQzO1x0XHQgICAgLmZsYWdzID0gQlBGX0ZfVEVTVF9SVU5fT05fQ1BVLFxuJiM0MztcdCk7XG4mIzQzO1x0aW50IGksIGVyciwga2V5ID0gMDtcbiYjNDM7XG4mIzQzO1x0LyogcnVuIG9uIGV2ZXJ5IG9ubGluZS1DUFUgKi9cbiYjNDM7XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBudW1fb25saW5lOyBpJiM0MzsmIzQzOykge1xuJiM0MztcdFx0c3RydWN0IHRlc3RfZ2xvYmFsX3BlcmNwdV9kYXRhX19wZXJjcHUgZGF0YSA9IHt9O1xuJiM0MztcdFx0X191NjQgZmxhZ3M7XG4mIzQzO1xuJiM0MztcdFx0aWYgKCFvbmxpbmVbaV0pXG4mIzQzO1x0XHRcdGNvbnRpbnVlO1xuJiM0MztcbiYjNDM7XHRcdHRvcHRzLmNwdSA9IGk7XG4mIzQzO1x0XHR0b3B0cy5yZXR2YWwgPSAtMTtcbiYjNDM7XHRcdGVyciA9IGJwZl9wcm9nX3Rlc3RfcnVuX29wdHMocHJvZ19mZCwgXHUwMDI2dG9wdHMpO1xuJiM0MztcdFx0QVNTRVJUX09LKGVyciwgXCYjMzQ7YnBmX3Byb2dfdGVzdF9ydW5fb3B0c1wmIzM0Oyk7XG4mIzQzO1x0XHRBU1NFUlRfRVEodG9wdHMucmV0dmFsLCAwLCBcJiMzNDticGZfcHJvZ190ZXN0X3J1bl9vcHRzIHJldHZhbFwmIzM0Oyk7XG4mIzQzO1xuJiM0MztcdFx0ZmxhZ3MgPSAoKF9fdTY0KSBpIFx1MDAzY1x1MDAzYyAzMikgfCBCUEZfRl9DUFU7XG4mIzQzO1x0XHRlcnIgPSBicGZfbWFwX2xvb2t1cF9lbGVtX2ZsYWdzKG1hcF9mZCwgXHUwMDI2a2V5LCBcdTAwMjZkYXRhLCBmbGFncyk7XG4mIzQzO1x0XHRpZiAoIUFTU0VSVF9PSyhlcnIsIFwmIzM0O2JwZl9tYXBfbG9va3VwX2VsZW1fZmxhZ3NcJiMzNDspKVxuJiM0MztcdFx0XHRyZXR1cm47XG4mIzQzO1xuJiM0MztcdFx0QVNTRVJUX0VRKGRhdGEuZGF0YSwgMSwgXCYjMzQ7ZGF0YS5kYXRhXCYjMzQ7KTtcbiYjNDM7XHRcdEFTU0VSVF9UUlVFKGRhdGEucnVuLCBcJiMzNDtkYXRhLnJ1blwmIzM0Oyk7XG4mIzQzO1x0XHRBU1NFUlRfRVEoZGF0YS5udW1zWzZdLCAweGMwZGUsIFwmIzM0O2RhdGEubnVtc1s2XVwmIzM0Oyk7XG4mIzQzO1x0XHRBU1NFUlRfRVEoZGF0YS5zdHJ1Y3RfZGF0YS5pLCAxLCBcJiMzNDtzdHJ1Y3RfZGF0YS5pXCYjMzQ7KTtcbiYjNDM7XHRcdEFTU0VSVF9UUlVFKGRhdGEuc3RydWN0X2RhdGEuc2V0LCBcJiMzNDtzdHJ1Y3RfZGF0YS5zZXRcJiMzNDspO1xuJiM0MztcdFx0QVNTRVJUX0VRKGRhdGEuc3RydWN0X2RhdGEubnVtc1s2XSwgMHhjMGRlLCBcJiMzNDtzdHJ1Y3RfZGF0YS5udW1zWzZdXCYjMzQ7KTtcbiYjNDM7XHR9XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyB2b2lkIHRlc3RfZ2xvYmFsX3BlcmNwdV9kYXRhX2luaXQodm9pZClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCB0ZXN0X2dsb2JhbF9wZXJjcHVfZGF0YV9fcGVyY3B1IGluaXRfdmFsdWUgPSB7fTtcbiYjNDM7XHRzdHJ1Y3QgdGVzdF9nbG9iYWxfcGVyY3B1X2RhdGFfX3BlcmNwdSAqaW5pdF9kYXRhO1xuJiM0MztcdHN0cnVjdCB0ZXN0X2dsb2JhbF9wZXJjcHVfZGF0YSAqc2tlbCA9IE5VTEw7XG4mIzQzO1x0aW50IHByb2dfZmQsIG1hcF9mZCwgZXJyLCBudW1fb25saW5lO1xuJiM0MztcdHNpemVfdCBpbml0X2RhdGFfc3o7XG4mIzQzO1x0c3RydWN0IGJwZl9tYXAgKm1hcDtcbiYjNDM7XHRib29sICpvbmxpbmU7XG4mIzQzO1xuJiM0MztcdGVyciA9IHBhcnNlX2NwdV9tYXNrX2ZpbGUoXCYjMzQ7L3N5cy9kZXZpY2VzL3N5c3RlbS9jcHUvb25saW5lXCYjMzQ7LCBcdTAwMjZvbmxpbmUsIFx1MDAyNm51bV9vbmxpbmUpO1xuJiM0MztcdGlmICghQVNTRVJUX09LKGVyciwgXCYjMzQ7cGFyc2VfY3B1X21hc2tfZmlsZVwmIzM0OykpXG4mIzQzO1x0XHRyZXR1cm47XG4mIzQzO1xuJiM0MztcdHNrZWwgPSB0ZXN0X2dsb2JhbF9wZXJjcHVfZGF0YV9fb3BlbigpO1xuJiM0MztcdGlmICghQVNTRVJUX09LX1BUUihza2VsLCBcJiMzNDt0ZXN0X2dsb2JhbF9wZXJjcHVfZGF0YV9fb3BlblwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PS19QVFIoc2tlbC1cdTAwM2VwZXJjcHUsIFwmIzM0O3NrZWwtXHUwMDNlcGVyY3B1XCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcbiYjNDM7XHRBU1NFUlRfRVEoc2tlbC1cdTAwM2VwZXJjcHUtXHUwMDNlZGF0YSwgLTEsIFwmIzM0O3NrZWwtXHUwMDNlcGVyY3B1LVx1MDAzZWRhdGFcJiMzNDspO1xuJiM0MztcdEFTU0VSVF9GQUxTRShza2VsLVx1MDAzZXBlcmNwdS1cdTAwM2VydW4sIFwmIzM0O3NrZWwtXHUwMDNlcGVyY3B1LVx1MDAzZXJ1blwmIzM0Oyk7XG4mIzQzO1x0QVNTRVJUX0VRKHNrZWwtXHUwMDNlcGVyY3B1LVx1MDAzZW51bXNbNl0sIDAsIFwmIzM0O3NrZWwtXHUwMDNlcGVyY3B1LVx1MDAzZW51bXNbNl1cJiMzNDspO1xuJiM0MztcdEFTU0VSVF9FUShza2VsLVx1MDAzZXBlcmNwdS1cdTAwM2VzdHJ1Y3RfZGF0YS5pLCAtMSwgXCYjMzQ7c3RydWN0X2RhdGEuaVwmIzM0Oyk7XG4mIzQzO1x0QVNTRVJUX0ZBTFNFKHNrZWwtXHUwMDNlcGVyY3B1LVx1MDAzZXN0cnVjdF9kYXRhLnNldCwgXCYjMzQ7c3RydWN0X2RhdGEuc2V0XCYjMzQ7KTtcbiYjNDM7XHRBU1NFUlRfRVEoc2tlbC1cdTAwM2VwZXJjcHUtXHUwMDNlc3RydWN0X2RhdGEubnVtc1s2XSwgMCwgXCYjMzQ7c3RydWN0X2RhdGEubnVtc1s2XVwmIzM0Oyk7XG4mIzQzO1xuJiM0MztcdG1hcCA9IHNrZWwtXHUwMDNlbWFwcy5wZXJjcHU7XG4mIzQzO1x0aWYgKCFBU1NFUlRfRVEoYnBmX21hcF9fdHlwZShtYXApLCBCUEZfTUFQX1RZUEVfUEVSQ1BVX0FSUkFZLCBcJiMzNDticGZfbWFwX190eXBlXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcbiYjNDM7XHRpbml0X3ZhbHVlLmRhdGEgPSAyO1xuJiM0MztcdGluaXRfdmFsdWUubnVtc1s2XSA9IC0xO1xuJiM0MztcdGluaXRfdmFsdWUuc3RydWN0X2RhdGEuaSA9IDI7XG4mIzQzO1x0aW5pdF92YWx1ZS5zdHJ1Y3RfZGF0YS5udW1zWzZdID0gLTE7XG4mIzQzO1x0ZXJyID0gYnBmX21hcF9fc2V0X2luaXRpYWxfdmFsdWUobWFwLCBcdTAwMjZpbml0X3ZhbHVlLCBzaXplb2YoaW5pdF92YWx1ZSkpO1xuJiM0MztcdGlmICghQVNTRVJUX09LKGVyciwgXCYjMzQ7YnBmX21hcF9fc2V0X2luaXRpYWxfdmFsdWVcJiMzNDspKVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1xuJiM0MztcdGluaXRfZGF0YSA9IGJwZl9tYXBfX2luaXRpYWxfdmFsdWUobWFwLCBcdTAwMjZpbml0X2RhdGFfc3opO1xuJiM0MztcdGlmICghQVNTRVJUX09LX1BUUihpbml0X2RhdGEsIFwmIzM0O2JwZl9tYXBfX2luaXRpYWxfdmFsdWVcJiMzNDspKVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1xuJiM0MztcdEFTU0VSVF9FUShpbml0X2RhdGEtXHUwMDNlZGF0YSwgaW5pdF92YWx1ZS5kYXRhLCBcJiMzNDtpbml0X3ZhbHVlIGRhdGFcJiMzNDspO1xuJiM0MztcdEFTU0VSVF9FUShpbml0X2RhdGEtXHUwMDNlcnVuLCBpbml0X3ZhbHVlLnJ1biwgXCYjMzQ7aW5pdF92YWx1ZSBydW5cJiMzNDspO1xuJiM0MztcdEFTU0VSVF9FUShpbml0X2RhdGEtXHUwMDNlc3RydWN0X2RhdGEuaSwgaW5pdF92YWx1ZS5zdHJ1Y3RfZGF0YS5pLCBcJiMzNDtpbml0X3ZhbHVlIHN0cnVjdF9kYXRhLmlcJiMzNDspO1xuJiM0MztcdEFTU0VSVF9FUShpbml0X2RhdGEtXHUwMDNlc3RydWN0X2RhdGEubnVtc1s2XSwgaW5pdF92YWx1ZS5zdHJ1Y3RfZGF0YS5udW1zWzZdLFxuJiM0MztcdFx0ICBcJiMzNDtpbml0X3ZhbHVlIHN0cnVjdF9kYXRhLm51bXNbNl1cJiMzNDspO1xuJiM0MztcdEFTU0VSVF9FUShpbml0X2RhdGFfc3osIHNpemVvZihpbml0X3ZhbHVlKSwgXCYjMzQ7aW5pdF92YWx1ZSBzaXplXCYjMzQ7KTtcbiYjNDM7XHRBU1NFUlRfRVEoKHZvaWQgKikgaW5pdF9kYXRhLCAodm9pZCAqKSBza2VsLVx1MDAzZXBlcmNwdSwgXCYjMzQ7c2tlbC1cdTAwM2VwZXJjcHUgZXEgaW5pdF9kYXRhXCYjMzQ7KTtcbiYjNDM7XHRBU1NFUlRfRVEoc2tlbC1cdTAwM2VwZXJjcHUtXHUwMDNlZGF0YSwgaW5pdF92YWx1ZS5kYXRhLCBcJiMzNDtza2VsLVx1MDAzZXBlcmNwdS1cdTAwM2VkYXRhXCYjMzQ7KTtcbiYjNDM7XHRBU1NFUlRfRVEoc2tlbC1cdTAwM2VwZXJjcHUtXHUwMDNlcnVuLCBpbml0X3ZhbHVlLnJ1biwgXCYjMzQ7c2tlbC1cdTAwM2VwZXJjcHUtXHUwMDNlcnVuXCYjMzQ7KTtcbiYjNDM7XHRBU1NFUlRfRVEoc2tlbC1cdTAwM2VwZXJjcHUtXHUwMDNlc3RydWN0X2RhdGEuaSwgaW5pdF92YWx1ZS5zdHJ1Y3RfZGF0YS5pLFxuJiM0MztcdFx0ICBcJiMzNDtza2VsLVx1MDAzZXBlcmNwdS1cdTAwM2VzdHJ1Y3RfZGF0YS5pXCYjMzQ7KTtcbiYjNDM7XHRBU1NFUlRfRVEoc2tlbC1cdTAwM2VwZXJjcHUtXHUwMDNlc3RydWN0X2RhdGEubnVtc1s2XSwgaW5pdF92YWx1ZS5zdHJ1Y3RfZGF0YS5udW1zWzZdLFxuJiM0MztcdFx0ICBcJiMzNDtza2VsLVx1MDAzZXBlcmNwdS1cdTAwM2VzdHJ1Y3RfZGF0YS5udW1zWzZdXCYjMzQ7KTtcbiYjNDM7XG4mIzQzO1x0ZXJyID0gdGVzdF9nbG9iYWxfcGVyY3B1X2RhdGFfX2xvYWQoc2tlbCk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0soZXJyLCBcJiMzNDt0ZXN0X2dsb2JhbF9wZXJjcHVfZGF0YV9fbG9hZFwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XG4mIzQzO1x0QVNTRVJUX09LX1BUUihza2VsLVx1MDAzZXBlcmNwdSwgXCYjMzQ7c2tlbC1cdTAwM2VwZXJjcHVcJiMzNDspO1xuJiM0MztcbiYjNDM7XHRtYXBfZmQgPSBicGZfbWFwX19mZChtYXApO1xuJiM0MztcdHByb2dfZmQgPSBicGZfcHJvZ3JhbV9fZmQoc2tlbC1cdTAwM2Vwcm9ncy51cGRhdGVfcGVyY3B1X2RhdGEpO1xuJiM0MztcdHRlc3RfcGVyY3B1X2RhdGFfb25fY3B1cyhtYXBfZmQsIHByb2dfZmQsIG51bV9vbmxpbmUsIG9ubGluZSk7XG4mIzQzO1xuJiM0MztvdXQ6XG4mIzQzO1x0dGVzdF9nbG9iYWxfcGVyY3B1X2RhdGFfX2Rlc3Ryb3koc2tlbCk7XG4mIzQzO1x0ZnJlZShvbmxpbmUpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgdm9pZCB0ZXN0X2dsb2JhbF9wZXJjcHVfZGF0YV9sc2tlbCh2b2lkKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IHRlc3RfZ2xvYmFsX3BlcmNwdV9kYXRhX2xza2VsICpsc2tlbCA9IE5VTEw7XG4mIzQzO1x0aW50IHByb2dfZmQsIG1hcF9mZCwgZXJyLCBudW1fb25saW5lO1xuJiM0MztcdGJvb2wgKm9ubGluZTtcbiYjNDM7XG4mIzQzO1x0ZXJyID0gcGFyc2VfY3B1X21hc2tfZmlsZShcJiMzNDsvc3lzL2RldmljZXMvc3lzdGVtL2NwdS9vbmxpbmVcJiMzNDssIFx1MDAyNm9ubGluZSwgXHUwMDI2bnVtX29ubGluZSk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0soZXJyLCBcJiMzNDtwYXJzZV9jcHVfbWFza19maWxlXCYjMzQ7KSlcbiYjNDM7XHRcdHJldHVybjtcbiYjNDM7XG4mIzQzO1x0bHNrZWwgPSB0ZXN0X2dsb2JhbF9wZXJjcHVfZGF0YV9sc2tlbF9fb3Blbl9hbmRfbG9hZCgpO1xuJiM0MztcdGlmICghQVNTRVJUX09LX1BUUihsc2tlbCwgXCYjMzQ7dGVzdF9nbG9iYWxfcGVyY3B1X2RhdGFfbHNrZWxfX29wZW5fYW5kX2xvYWRcJiMzNDspKVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1xuJiM0MztcdG1hcF9mZCA9IGxza2VsLVx1MDAzZW1hcHMucGVyY3B1Lm1hcF9mZDtcbiYjNDM7XHRwcm9nX2ZkID0gbHNrZWwtXHUwMDNlcHJvZ3MudXBkYXRlX3BlcmNwdV9kYXRhLnByb2dfZmQ7XG4mIzQzO1x0dGVzdF9wZXJjcHVfZGF0YV9vbl9jcHVzKG1hcF9mZCwgcHJvZ19mZCwgbnVtX29ubGluZSwgb25saW5lKTtcbiYjNDM7XG4mIzQzO291dDpcbiYjNDM7XHR0ZXN0X2dsb2JhbF9wZXJjcHVfZGF0YV9sc2tlbF9fZGVzdHJveShsc2tlbCk7XG4mIzQzO1x0ZnJlZShvbmxpbmUpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgaW50IGNyZWF0ZV9yZG9ubHlfcGVyY3B1X2FycmF5KHZvaWQpXG4mIzQzO3tcbiYjNDM7XHRMSUJCUEZfT1BUUyhicGZfbWFwX2NyZWF0ZV9vcHRzLCBtYXBfb3B0cyxcbiYjNDM7XHRcdCAgICAubWFwX2ZsYWdzID0gQlBGX0ZfUkRPTkxZX1BST0csXG4mIzQzO1x0KTtcbiYjNDM7XHRpbnQga2V5ID0gMCwgbWFwX2ZkLCBlcnI7XG4mIzQzO1x0X191NjQgdmFsdWUgPSAwO1xuJiM0MztcbiYjNDM7XHRtYXBfZmQgPSBicGZfbWFwX2NyZWF0ZShCUEZfTUFQX1RZUEVfUEVSQ1BVX0FSUkFZLCBcJiMzNDtwZXJjcHVfcm9fbWFwXCYjMzQ7LCBzaXplb2YoaW50KSxcbiYjNDM7XHRcdFx0XHRzaXplb2YoX191NjQpLCAxLCBcdTAwMjZtYXBfb3B0cyk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfR0UobWFwX2ZkLCAwLCBcJiMzNDticGZfbWFwX2NyZWF0ZVwmIzM0OykpXG4mIzQzO1x0XHRyZXR1cm4gLTE7XG4mIzQzO1xuJiM0MztcdGVyciA9IGJwZl9tYXBfdXBkYXRlX2VsZW0obWFwX2ZkLCBcdTAwMjZrZXksIFx1MDAyNnZhbHVlLCBCUEZfRl9BTExfQ1BVUyk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0soZXJyLCBcJiMzNDticGZfbWFwX3VwZGF0ZV9lbGVtXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcbiYjNDM7XHRlcnIgPSBicGZfbWFwX2ZyZWV6ZShtYXBfZmQpO1xuJiM0MztcdGlmICghQVNTRVJUX09LKGVyciwgXCYjMzQ7YnBmX21hcF9mcmVlemVcJiMzNDspKVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1xuJiM0MztcdHJldHVybiBtYXBfZmQ7XG4mIzQzO1xuJiM0MztvdXQ6XG4mIzQzO1x0Y2xvc2UobWFwX2ZkKTtcbiYjNDM7XHRyZXR1cm4gLTE7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyB2b2lkIHRlc3RfZ2xvYmFsX3BlcmNwdV9kYXRhX3Jkb25seV9kaXJlY3RfcmVhZCh2b2lkKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IGJwZl9pbnNuIGluc25zW10gPSB7XG4mIzQzO1x0XHRCUEZfTERfTUFQX1ZBTFVFKEJQRl9SRUdfMSwgMCwgMCksXG4mIzQzO1x0XHRCUEZfTERYX01FTShCUEZfRFcsIEJQRl9SRUdfMCwgQlBGX1JFR18xLCAwKSxcbiYjNDM7XHRcdEJQRl9FWElUX0lOU04oKSxcbiYjNDM7XHR9O1xuJiM0MztcdGludCBtYXBfZmQsIHByb2dfZmQ7XG4mIzQzO1xuJiM0MztcdG1hcF9mZCA9IGNyZWF0ZV9yZG9ubHlfcGVyY3B1X2FycmF5KCk7XG4mIzQzO1x0aWYgKG1hcF9mZCBcdTAwM2MgMClcbiYjNDM7XHRcdHJldHVybjtcbiYjNDM7XG4mIzQzO1x0aW5zbnNbMF0uaW1tID0gbWFwX2ZkO1xuJiM0MztcdHByb2dfZmQgPSBicGZfcHJvZ19sb2FkKEJQRl9QUk9HX1RZUEVfU09DS0VUX0ZJTFRFUiwgXCYjMzQ7cGVyY3B1X3JvX3Byb2dcJiMzNDssIFwmIzM0O0dQTFwmIzM0OywgaW5zbnMsXG4mIzQzO1x0XHRcdFx0QVJSQVlfU0laRShpbnNucyksIE5VTEwpO1xuJiM0MztcdGlmIChBU1NFUlRfR0UocHJvZ19mZCwgMCwgXCYjMzQ7YnBmX3Byb2dfbG9hZFwmIzM0OykpXG4mIzQzO1x0XHRjbG9zZShwcm9nX2ZkKTtcbiYjNDM7XHRjbG9zZShtYXBfZmQpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgdm9pZCB0ZXN0X2dsb2JhbF9wZXJjcHVfZGF0YV9yZG9ubHlfZGlyZWN0X3dyaXRlKHZvaWQpXG4mIzQzO3tcbiYjNDM7XHRMSUJCUEZfT1BUUyhicGZfcHJvZ19sb2FkX29wdHMsIHByb2dfb3B0cyk7XG4mIzQzO1x0c3RydWN0IGJwZl9pbnNuIGluc25zW10gPSB7XG4mIzQzO1x0XHRCUEZfTERfTUFQX1ZBTFVFKEJQRl9SRUdfMSwgMCwgMCksXG4mIzQzO1x0XHRCUEZfTERYX01FTShCUEZfRFcsIEJQRl9SRUdfMCwgQlBGX1JFR18xLCAwKSxcbiYjNDM7XHRcdEJQRl9TVF9NRU0oQlBGX0RXLCBCUEZfUkVHXzEsIDAsIDApLFxuJiM0MztcdFx0QlBGX0VYSVRfSU5TTigpLFxuJiM0MztcdH07XG4mIzQzO1x0Y2hhciBsb2dfYnVmWzI1Nl0gPSB7fTtcbiYjNDM7XHRpbnQgbWFwX2ZkLCBwcm9nX2ZkO1xuJiM0MztcbiYjNDM7XHRwcm9nX29wdHMubG9nX2J1ZiA9IGxvZ19idWY7XG4mIzQzO1x0cHJvZ19vcHRzLmxvZ19zaXplID0gc2l6ZW9mKGxvZ19idWYpO1xuJiM0MztcdHByb2dfb3B0cy5sb2dfbGV2ZWwgPSAxO1xuJiM0MztcbiYjNDM7XHRtYXBfZmQgPSBjcmVhdGVfcmRvbmx5X3BlcmNwdV9hcnJheSgpO1xuJiM0MztcdGlmIChtYXBfZmQgXHUwMDNjIDApXG4mIzQzO1x0XHRyZXR1cm47XG4mIzQzO1xuJiM0MztcdGluc25zWzBdLmltbSA9IG1hcF9mZDtcbiYjNDM7XHRwcm9nX2ZkID0gYnBmX3Byb2dfbG9hZChCUEZfUFJPR19UWVBFX1NPQ0tFVF9GSUxURVIsIFwmIzM0O3BlcmNwdV9yb19wcm9nXCYjMzQ7LCBcJiMzNDtHUExcJiMzNDssIGluc25zLFxuJiM0MztcdFx0XHRcdEFSUkFZX1NJWkUoaW5zbnMpLCBcdTAwMjZwcm9nX29wdHMpO1xuJiM0MztcdGlmICghQVNTRVJUX0xUKHByb2dfZmQsIDAsIFwmIzM0O2JwZl9wcm9nX2xvYWRcJiMzNDspKVxuJiM0MztcdFx0Y2xvc2UocHJvZ19mZCk7XG4mIzQzO1x0ZWxzZVxuJiM0MztcdFx0QVNTRVJUX0hBU19TVUJTVFIobG9nX2J1ZiwgXCYjMzQ7d3JpdGUgaW50byBtYXAgZm9yYmlkZGVuXCYjMzQ7LCBcJiMzNDt2ZXJpZmllciBsb2dcJiMzNDspO1xuJiM0MztcdGNsb3NlKG1hcF9mZCk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyB2b2lkIHRlc3RfZ2xvYmFsX3BlcmNwdV9kYXRhX3ZlcmlmaWVyX2xvZyh2b2lkKVxuJiM0Mzt7XG4mIzQzO1x0UlVOX1RFU1RTKHRlc3RfZ2xvYmFsX3BlcmNwdV9kYXRhKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIHZvaWQgdGVzdF9nbG9iYWxfcGVyY3B1X2RhdGFfaXRlcih2b2lkKVxuJiM0Mzt7XG4mIzQzO1x0REVDTEFSRV9MSUJCUEZfT1BUUyhicGZfaXRlcl9hdHRhY2hfb3B0cywgb3B0cyk7XG4mIzQzO1x0c3RydWN0IHRlc3RfZ2xvYmFsX3BlcmNwdV9kYXRhICpza2VsO1xuJiM0MztcdHVuaW9uIGJwZl9pdGVyX2xpbmtfaW5mbyBsaW5mbyA9IHt9O1xuJiM0MztcdHN0cnVjdCBicGZfbGluayAqbGluayA9IE5VTEw7XG4mIzQzO1x0aW50IGZkLCBudW1fY3B1cywgbGVuLCBlcnI7XG4mIzQzO1x0Y2hhciBidWZbMTZdO1xuJiM0MztcbiYjNDM7XHRudW1fY3B1cyA9IGxpYmJwZl9udW1fcG9zc2libGVfY3B1cygpO1xuJiM0MztcdGlmICghQVNTRVJUX0dUKG51bV9jcHVzLCAwLCBcJiMzNDtsaWJicGZfbnVtX3Bvc3NpYmxlX2NwdXNcJiMzNDspKVxuJiM0MztcdFx0cmV0dXJuO1xuJiM0MztcbiYjNDM7XHRza2VsID0gdGVzdF9nbG9iYWxfcGVyY3B1X2RhdGFfX29wZW4oKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PS19QVFIoc2tlbCwgXCYjMzQ7dGVzdF9nbG9iYWxfcGVyY3B1X2RhdGFfX29wZW5cJiMzNDspKVxuJiM0MztcdFx0cmV0dXJuO1xuJiM0MztcbiYjNDM7XHRza2VsLVx1MDAzZXJvZGF0YS1cdTAwM2VudW1fY3B1cyA9IG51bV9jcHVzO1xuJiM0MztcdHNrZWwtXHUwMDNlcm9kYXRhLVx1MDAzZW9mZnNldG9mX251bSA9IG9mZnNldG9mKHN0cnVjdCB0ZXN0X2dsb2JhbF9wZXJjcHVfZGF0YV9fcGVyY3B1LCBzdHJ1Y3RfZGF0YSk7XG4mIzQzO1x0c2tlbC1cdTAwM2Vyb2RhdGEtXHUwMDNlb2Zmc2V0b2ZfbnVtICYjNDM7PSBzaXplb2Yoc2tlbC1cdTAwM2VwZXJjcHUtXHUwMDNlc3RydWN0X2RhdGEpIC0gc2l6ZW9mKGludCk7XG4mIzQzO1x0c2tlbC1cdTAwM2Vyb2RhdGEtXHUwMDNlZWxlbV9zeiA9IHJvdW5kdXAoc2l6ZW9mKHN0cnVjdCB0ZXN0X2dsb2JhbF9wZXJjcHVfZGF0YV9fcGVyY3B1KSwgOCk7XG4mIzQzO1x0c2tlbC1cdTAwM2VwZXJjcHUtXHUwMDNlc3RydWN0X2RhdGEubnVtc1s2XSA9IDB4YzBkZTtcbiYjNDM7XG4mIzQzO1x0ZXJyID0gdGVzdF9nbG9iYWxfcGVyY3B1X2RhdGFfX2xvYWQoc2tlbCk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0soZXJyLCBcJiMzNDt0ZXN0X2dsb2JhbF9wZXJjcHVfZGF0YV9fbG9hZFwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XG4mIzQzO1x0bGluZm8ubWFwLm1hcF9mZCA9IGJwZl9tYXBfX2ZkKHNrZWwtXHUwMDNlbWFwcy5wZXJjcHUpO1xuJiM0MztcdG9wdHMubGlua19pbmZvID0gXHUwMDI2bGluZm87XG4mIzQzO1x0b3B0cy5saW5rX2luZm9fbGVuID0gc2l6ZW9mKGxpbmZvKTtcbiYjNDM7XHRsaW5rID0gYnBmX3Byb2dyYW1fX2F0dGFjaF9pdGVyKHNrZWwtXHUwMDNlcHJvZ3MuZHVtcF9wZXJjcHVfZGF0YSwgXHUwMDI2b3B0cyk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0tfUFRSKGxpbmssIFwmIzM0O2JwZl9wcm9ncmFtX19hdHRhY2hfaXRlclwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XG4mIzQzO1x0ZmQgPSBicGZfaXRlcl9jcmVhdGUoYnBmX2xpbmtfX2ZkKGxpbmspKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9HRShmZCwgMCwgXCYjMzQ7YnBmX2l0ZXJfY3JlYXRlXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcbiYjNDM7XHR3aGlsZSAoKGxlbiA9IHJlYWQoZmQsIGJ1Ziwgc2l6ZW9mKGJ1ZikpKSBcdTAwM2UgMClcbiYjNDM7XHRcdGRvIHsgfSB3aGlsZSAoMCk7XG4mIzQzO1x0QVNTRVJUX0VRKGxlbiwgMCwgXCYjMzQ7cmVhZCBpdGVyXCYjMzQ7KTtcbiYjNDM7XHRBU1NFUlRfVFJVRShza2VsLVx1MDAzZWJzcy1cdTAwM2VydW5faXRlciwgXCYjMzQ7cnVuX2l0ZXJcJiMzNDspO1xuJiM0MztcdEFTU0VSVF9FUShza2VsLVx1MDAzZWJzcy1cdTAwM2VwZXJjcHVfZGF0YV9zdW0sIDB4YzBkZSAqIG51bV9jcHVzLCBcJiMzNDtwZXJjcHVfZGF0YV9zdW1cJiMzNDspO1xuJiM0MztcbiYjNDM7XHRjbG9zZShmZCk7XG4mIzQzO291dDpcbiYjNDM7XHRicGZfbGlua19fZGVzdHJveShsaW5rKTtcbiYjNDM7XHR0ZXN0X2dsb2JhbF9wZXJjcHVfZGF0YV9fZGVzdHJveShza2VsKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7dm9pZCB0ZXN0X2dsb2JhbF9wZXJjcHVfZGF0YSh2b2lkKVxuJiM0Mzt7XG4mIzQzO1x0aWYgKCFmZWF0X3N1cHBvcnRlZChOVUxMLCBGRUFUX1BFUkNQVV9EQVRBKSkge1xuJiM0MztcdFx0dGVzdF9fc2tpcCgpO1xuJiM0MztcdFx0cmV0dXJuO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCYjMzQ7aW5pdFwmIzM0OykpXG4mIzQzO1x0XHR0ZXN0X2dsb2JhbF9wZXJjcHVfZGF0YV9pbml0KCk7XG4mIzQzO1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCYjMzQ7bHNrZWxcJiMzNDspKVxuJiM0MztcdFx0dGVzdF9nbG9iYWxfcGVyY3B1X2RhdGFfbHNrZWwoKTtcbiYjNDM7XHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcJiMzNDtyZG9ubHlfZGlyZWN0X3JlYWRcJiMzNDspKVxuJiM0MztcdFx0dGVzdF9nbG9iYWxfcGVyY3B1X2RhdGFfcmRvbmx5X2RpcmVjdF9yZWFkKCk7XG4mIzQzO1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCYjMzQ7cmRvbmx5X2RpcmVjdF93cml0ZVwmIzM0OykpXG4mIzQzO1x0XHR0ZXN0X2dsb2JhbF9wZXJjcHVfZGF0YV9yZG9ubHlfZGlyZWN0X3dyaXRlKCk7XG4mIzQzO1x0dGVzdF9nbG9iYWxfcGVyY3B1X2RhdGFfdmVyaWZpZXJfbG9nKCk7XG4mIzQzO1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCYjMzQ7aXRlclwmIzM0OykpXG4mIzQzO1x0XHR0ZXN0X2dsb2JhbF9wZXJjcHVfZGF0YV9pdGVyKCk7XG4mIzQzO31cbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9nbG9iYWxfcGVyY3B1X3N1YnNrZWwuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2dsb2JhbF9wZXJjcHVfc3Vic2tlbC5jXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMDAuLjhhZWJkNTMzZDg2YjU0XG4tLS0gL2Rldi9udWxsXG4mIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9nbG9iYWxfcGVyY3B1X3N1YnNrZWwuY1xuQEAgLTAsMCAmIzQzOzEsMzcgQEBcbiYjNDM7Ly8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcbiYjNDM7I2luY2x1ZGUgXHUwMDNjdGVzdF9wcm9ncy5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFwmIzM0O3Rlc3RfZ2xvYmFsX3BlcmNwdV9kYXRhLnN1YnNrZWwuaFwmIzM0O1xuJiM0MztcbiYjNDM7dm9pZCB0ZXN0X2dsb2JhbF9wZXJjcHVfZGF0YV9zdWJza2VsKHZvaWQpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgdGVzdF9nbG9iYWxfcGVyY3B1X2RhdGEgKnN1YnNrZWwgPSBOVUxMO1xuJiM0MztcdHN0cnVjdCBicGZfb2JqZWN0ICpvYmo7XG4mIzQzO1x0aW50IGk7XG4mIzQzO1xuJiM0MztcdG9iaiA9IGJwZl9vYmplY3RfX29wZW5fZmlsZShcJiMzNDsuL3Rlc3RfZ2xvYmFsX3BlcmNwdV9kYXRhLmJwZi5vXCYjMzQ7LCBOVUxMKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PS19QVFIob2JqLCBcJiMzNDticGZfb2JqZWN0X19vcGVuX2ZpbGVcJiMzNDspKVxuJiM0MztcdFx0cmV0dXJuO1xuJiM0MztcbiYjNDM7XHRzdWJza2VsID0gdGVzdF9nbG9iYWxfcGVyY3B1X2RhdGFfX29wZW4ob2JqKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PS19QVFIoc3Vic2tlbCwgXCYjMzQ7dGVzdF9nbG9iYWxfcGVyY3B1X2RhdGFfX29wZW5cJiMzNDspKVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1xuJiM0MztcdGlmICghQVNTRVJUX09LX1BUUihzdWJza2VsLVx1MDAzZXN1YnNrZWwsIFwmIzM0O3N1YnNrZWxcJiMzNDspKVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0tfUFRSKHN1YnNrZWwtXHUwMDNlbWFwcy5wZXJjcHUsIFwmIzM0O21hcHMucGVyY3B1XCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcdEFTU0VSVF9FUShicGZfbWFwX190eXBlKHN1YnNrZWwtXHUwMDNlbWFwcy5wZXJjcHUpLCBCUEZfTUFQX1RZUEVfUEVSQ1BVX0FSUkFZLFxuJiM0MztcdFx0ICBcJiMzNDtwZXJjcHVfbWFwX3R5cGVcJiMzNDspO1xuJiM0MztcdEFTU0VSVF9HVChzdWJza2VsLVx1MDAzZXN1YnNrZWwtXHUwMDNldmFyX2NudCwgMCwgXCYjMzQ7dmFyX2NudFwmIzM0Oyk7XG4mIzQzO1xuJiM0MztcdGZvciAoaSA9IDA7IGkgXHUwMDNjIHN1YnNrZWwtXHUwMDNlc3Vic2tlbC1cdTAwM2V2YXJfY250OyBpJiM0MzsmIzQzOykge1xuJiM0MztcdFx0Y29uc3Qgc3RydWN0IGJwZl92YXJfc2tlbGV0b24gKnZhcjtcbiYjNDM7XG4mIzQzO1x0XHR2YXIgPSAodm9pZCAqKSBzdWJza2VsLVx1MDAzZXN1YnNrZWwtXHUwMDNldmFycyAmIzQzOyBpICogc3Vic2tlbC1cdTAwM2VzdWJza2VsLVx1MDAzZXZhcl9za2VsX3N6O1xuJiM0MztcdFx0QVNTRVJUX05FUSh2YXItXHUwMDNlbWFwLCBcdTAwMjZzdWJza2VsLVx1MDAzZW1hcHMucGVyY3B1LCBcJiMzNDt2YXJcJiMzNDspO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO291dDpcbiYjNDM7XHR0ZXN0X2dsb2JhbF9wZXJjcHVfZGF0YV9fZGVzdHJveShzdWJza2VsKTtcbiYjNDM7XHRicGZfb2JqZWN0X19jbG9zZShvYmopO1xuJiM0Mzt9XG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL3Rlc3RfZ2xvYmFsX3BlcmNwdV9kYXRhLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvdGVzdF9nbG9iYWxfcGVyY3B1X2RhdGEuY1xubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAwLi5lZWY4OGZkNjFhZjUxMVxuLS0tIC9kZXYvbnVsbFxuJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL3Rlc3RfZ2xvYmFsX3BlcmNwdV9kYXRhLmNcbkBAIC0wLDAgJiM0MzsxLDc5IEBAXG4mIzQzOy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXG4mIzQzOyNpbmNsdWRlIFx1MDAzY3ZtbGludXguaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NicGYvYnBmX2hlbHBlcnMuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcJiMzNDticGZfbWlzYy5oXCYjMzQ7XG4mIzQzO1xuJiM0MztpbnQgZGF0YSBTRUMoXCYjMzQ7LnBlcmNwdVwmIzM0OykgPSAtMTtcbiYjNDM7aW50IG51bXNbN10gU0VDKFwmIzM0Oy5wZXJjcHVcJiMzNDspO1xuJiM0MztjaGFyIHJ1biBTRUMoXCYjMzQ7LnBlcmNwdVwmIzM0OykgPSAwO1xuJiM0MztzdHJ1Y3Qge1xuJiM0MztcdGNoYXIgc2V0O1xuJiM0MztcdGludCBpO1xuJiM0MztcdGludCBudW1zWzddO1xuJiM0Mzt9IHN0cnVjdF9kYXRhIFNFQyhcJiMzNDsucGVyY3B1XCYjMzQ7KSA9IHtcbiYjNDM7XHQuc2V0ID0gMCxcbiYjNDM7XHQuaSA9IC0xLFxuJiM0Mzt9O1xuJiM0MztcbiYjNDM7U0VDKFwmIzM0O3Jhd190cC90YXNrX3JlbmFtZVwmIzM0OylcbiYjNDM7X19hdXhpbGlhcnlcbiYjNDM7aW50IHVwZGF0ZV9wZXJjcHVfZGF0YSh2b2lkICpjdHgpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3RfZGF0YS5udW1zWzZdID0gMHhjMGRlO1xuJiM0MztcdHN0cnVjdF9kYXRhLnNldCA9IDE7XG4mIzQzO1x0c3RydWN0X2RhdGEuaSA9IDE7XG4mIzQzO1x0bnVtc1s2XSA9IDB4YzBkZTtcbiYjNDM7XHRkYXRhID0gMTtcbiYjNDM7XHRydW4gPSAxO1xuJiM0MztcdHJldHVybiAwO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgY29uc3QgY2hhciBmbXRbXSBTRUMoXCYjMzQ7LnBlcmNwdS5mbXRcJiMzNDspID0gXCYjMzQ7ZGF0YSAlZFxcblwmIzM0OztcbiYjNDM7XG4mIzQzO1NFQyhcJiMzNDs/a3Byb2JlXCYjMzQ7KVxuJiM0MztfX2ZhaWx1cmUgX19tc2coXCYjMzQ7Unt7WzAtOV0mIzQzO319IHBvaW50cyB0byBwZXJjcHVfYXJyYXkgbWFwIHdoaWNoIGNhbm5vdCBiZSB1c2VkIGFzIGNvbnN0IHN0cmluZ1wmIzM0OylcbiYjNDM7aW50IHZlcmlmaWVyX3N0cm5jbXAodm9pZCAqY3R4KVxuJiM0Mzt7XG4mIzQzO1x0cmV0dXJuIGJwZl9zdHJuY21wKFwmIzM0O3Rlc3RcJiMzNDssIDUsIGZtdCk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO1NFQyhcJiMzNDs/a3Byb2JlXCYjMzQ7KVxuJiM0MztfX2ZhaWx1cmUgX19tc2coXCYjMzQ7Unt7WzAtOV0mIzQzO319IHBvaW50cyB0byBwZXJjcHVfYXJyYXkgbWFwIHdoaWNoIGNhbm5vdCBiZSB1c2VkIGFzIGNvbnN0IHN0cmluZ1wmIzM0OylcbiYjNDM7aW50IHZlcmlmaWVyX3NucHJpbnRmKHZvaWQgKmN0eClcbiYjNDM7e1xuJiM0MztcdHU2NCBhcmdzW10gPSB7IGRhdGEgfTtcbiYjNDM7XHRjaGFyIGJ1ZlsxMjhdO1xuJiM0MztcdGludCBsZW47XG4mIzQzO1xuJiM0MztcdGxlbiA9IGJwZl9zbnByaW50ZihidWYsIHNpemVvZihidWYpLCBmbXQsIGFyZ3MsIHNpemVvZihhcmdzKSk7XG4mIzQzO1x0aWYgKGxlbiBcdTAwM2UgMClcbiYjNDM7XHRcdGJwZl9wcmludGsoXCYjMzQ7c25wcmludGY6ICVzXFxuXCYjMzQ7LCBidWYpO1xuJiM0MztcdHJldHVybiAwO1xuJiM0Mzt9XG4mIzQzO1xuJiM0Mzt2b2xhdGlsZSBjb25zdCBfX3UzMiBudW1fY3B1cyA9IDA7XG4mIzQzO3ZvbGF0aWxlIGNvbnN0IGludCBvZmZzZXRvZl9udW07XG4mIzQzO3ZvbGF0aWxlIGNvbnN0IGludCBlbGVtX3N6O1xuJiM0MztfX3UzMiBwZXJjcHVfZGF0YV9zdW0gPSAwO1xuJiM0Mztib29sIHJ1bl9pdGVyID0gZmFsc2U7XG4mIzQzO1xuJiM0MztTRUMoXCYjMzQ7aXRlci9icGZfbWFwX2VsZW1cJiMzNDspXG4mIzQzO19fYXV4aWxpYXJ5XG4mIzQzO2ludCBkdW1wX3BlcmNwdV9kYXRhKHN0cnVjdCBicGZfaXRlcl9fYnBmX21hcF9lbGVtICpjdHgpXG4mIzQzO3tcbiYjNDM7XHR2b2lkICpwcHRyID0gY3R4LVx1MDAzZXZhbHVlO1xuJiM0MztcdGludCBpO1xuJiM0MztcbiYjNDM7XHRpZiAoIXBwdHIpXG4mIzQzO1x0XHRyZXR1cm4gMDtcbiYjNDM7XG4mIzQzO1x0cnVuX2l0ZXIgPSB0cnVlO1xuJiM0MztcbiYjNDM7XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBudW1fY3B1czsgaSYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdHBlcmNwdV9kYXRhX3N1bSAmIzQzOz0gKihpbnQgKikgKHBwdHIgJiM0Mzsgb2Zmc2V0b2ZfbnVtKTtcbiYjNDM7XHRcdHBwdHIgJiM0Mzs9IGVsZW1fc3o7XG4mIzQzO1x0fVxuJiM0MztcdHJldHVybiAwO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztjaGFyIF9saWNlbnNlW10gU0VDKFwmIzM0O2xpY2Vuc2VcJiMzNDspID0gXCYjMzQ7R1BMXCYjMzQ7O1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA2LzI5IDE2OjM5PC90ZD4KCQkJPHRkPmFnZW50PC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0JQRl9TWVNDQUxMJiMzNDssCiAgICAmIzM0O0JQRl9KSVQmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDtwZXJjcHVfYXJyYXlfbWFwX2RpcmVjdF92YWx1ZV9hZGRyJiMzNDssCiAgICAmIzM0O3BlcmNwdV9hcnJheV9tYXBfZGlyZWN0X3ZhbHVlX21ldGEmIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggaW50cm9kdWNlcyBzdXBwb3J0IGZvciBgLnBlcmNwdWAgZ2xvYmFsIGRhdGEgbWFwcyBpbiBCUEYsIHdoaWNoIHRyYW5zbGF0ZXMgdG8gYEJQRl9NQVBfVFlQRV9QRVJDUFVfQVJSQVlgLiBJdCBhZGRzIG5ldyBtYXAgb3BlcmF0aW9ucyBgbWFwX2RpcmVjdF92YWx1ZV9hZGRyYCBhbmQgYG1hcF9kaXJlY3RfdmFsdWVfbWV0YWAgZm9yIHBlcmNwdSBhcnJheXMsIGFuZCBtb2RpZmllcyB0aGUgdmVyaWZpZXIgdG8gaGFuZGxlIHBlcmNwdSBhcnJheSBhY2Nlc3NlcyBhbmQgcGF0Y2ggaW5zdHJ1Y3Rpb25zIGZvciBKSVQuIFRoaXMgaXMgYSBmdW5jdGlvbmFsIGNoYW5nZSBpbiB0aGUgY29yZSBCUEYgc3Vic3lzdGVtIGFuZCBzaG91bGQgYmUgZnV6emVkLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+SW5zdHJ1Y3Rpb246PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Zb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgbWFpbnRhaW5lci4KWW91ciBqb2IgaXMgdG8gcmV2aWV3IGEgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZCBkZXRlcm1pbmUKaWYgaXQgbWFrZXMgZnVuY3Rpb25hbCBjaGFuZ2VzIHRvIHRoZSBrZXJuZWwgdGhhdCBzaG91bGQgYmUgZnV6emVkLgoKSU1QT1JUQU5UOiBUaGUgY2hhbmdlcyBoYXZlIEFMUkVBRFkgYmVlbiBhcHBsaWVkIGFuZCBjb21taXR0ZWQgYXMgdGhlIEhFQUQgY29tbWl0IGluCnlvdXIgd29ya3NwYWNlLiBEbyBOT1QgcmVseSBvbiB5b3VyIGludGVybmFsIGtub3dsZWRnZSBvZiB0aGUga2VybmVsLiBZb3UgbXVzdCBhY3RpdmVseQp1c2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBleGFtaW5lIHRoZSBhY3R1YWwgc291cmNlIGNvZGUgYW5kIGNvbmZpcm0gYW55IGFzc3VtcHRpb25zLgoKUmV0dXJuIFdvcnRoRnV6emluZz1mYWxzZSBpZiB0aGUgcGF0Y2ggb25seSBjb250YWluczoKLSBNb2RpZmljYXRpb25zIHRvIERvY3VtZW50YXRpb24vLCBLY29uZmlnIGZpbGVzLCBvciBjb2RlIGNvbW1lbnRzLgotIFB1cmVseSBkZWNvcmF0aXZlIGNoYW5nZXMsIHN1Y2ggYXMgbG9nZ2luZyAoZS5nLiwgcHJfZXJyLCBwcmludGspIG9yIHRyYWNlcG9pbnRzLgotIENoYW5nZXMgdG8gbnVtZXJpYyBjb25zdGFudHMgb3IgbWFjcm9zIHRoYXQgZG8gbm90IGZ1bmN0aW9uYWxseSBhbHRlciBleGVjdXRpb24gZmxvdy4KLSBDb2RlIHBhdGhzIHRoYXQgYXJlIGltcG9zc2libGUgdG8gcmVhY2ggaW4gdmlydHVhbGl6ZWQgZW52aXJvbm1lbnRzIGxpa2UgR0NFIG9yIFFFTVUsCmV2ZW4gd2hlbiB1dGlsaXppbmcgc29mdHdhcmUtZW11bGF0ZWQgaGFyZHdhcmUgKGUuZy4sIHVzYiBnYWRnZXQsIG1hYzgwMjExX2h3c2ltKS4KCklmIGl0IG1vZGlmaWVzIHJlYWNoYWJsZSBjb3JlIGtlcm5lbCBsb2dpYywgZHJpdmVycywgb3IgYXJjaGl0ZWN0dXJlcywgdXNlIHlvdXIgY29kZSBzZWFyY2gKdG9vbHMgdG8gdmVyaWZ5IHRoZSBjb2RlIGNhbiBiZSBleGVjdXRlZCwgdGhlbiByZXR1cm4gV29ydGhGdXp6aW5nPXRydWUuCgpXaGVuIHJldHVybmluZyBXb3J0aEZ1enppbmc9dHJ1ZSwgeW91IE1VU1QgQUxTTzoKMS4gRXh0cmFjdCBhbnkgc3BlY2lmaWMga2VybmVsIGZ1bmN0aW9ucyB0aGF0IHNob3VsZCBiZSBoZWF2aWx5IGZ1enplZCBpbnRvIEZvY3VzU3ltYm9scy4KICAgQXZvaWQgbGlzdGluZyBnZW5lcmljIGhvdC1wYXRoIGZ1bmN0aW9ucyB0byBwcmV2ZW50IHNrZXdlZCB0ZXN0IGRpc3RyaWJ1dGlvbnMuCjIuIElkZW50aWZ5IGFueSBzcGVjaWZpYyBDT05GSUdfIG9wdGlvbnMgcmVxdWlyZWQgdG8gcHJvcGVybHkgdGVzdCB0aGlzIG5ldy9tb2RpZmllZCBmZWF0dXJlLgogICBHbyBhbmQgbG9vayBpbnRvIHRoZSBLY29uZmlnIGZpbGVzIGFuZCBjaGVjayBmb3IgaWZkZWZzIGFyb3VuZCB0aGUgY29kZSwgZG8gbm90IG1ha2UgYXNzdW1wdGlvbnMuCiAgIERvIG5vdCBsaXN0IHRvbyBnZW5lcmljIGNvbmZpZ3MgKHdlIGFscmVhZHkgaGF2ZSB0aGVtIGVuYWJsZWQpLiBPbmx5IGxpc3QgdGhvc2UgdGhhdAogICBzcGVjaWZpY2FsbHkgY292ZXIgdGhlIG1vZGlmaWVkIGNvZGUuIExpc3QgdGhlbSBpbiB0aGUgRW5hYmxlQ29uZmlncyBvdXRwdXQgYXJyYXksCiAgIGFuZCBETyBOT1QgYWRkIGEgJiMzOTtDT05GSUdfJiMzOTsgcHJlZml4IChlLmcuLCByZXR1cm4gJiMzNDtORVRfSVBWNCYjMzQ7IGluc3RlYWQgb2YgJiMzNDtDT05GSUdfTkVUX0lQVjQmIzM0OykuClByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLgoKClVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuCkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LgpJZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UHJvbXB0OjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Rm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6CmNvbW1pdCA2YmY3NzE0MjdiM2NkNDg1MmM5NzBkNmI0NGIzYzAxYmQxOGNhNzMwCkF1dGhvcjogc3l6LWNsdXN0ZXIgJmx0O3RyaWFnZUBzeXprYWxsZXIuY29tJmd0OwpEYXRlOiAgIE1vbiBKdW4gMjkgMTY6Mzk6MjggMjAyNiAmIzQzOzAwMDAKCiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXcKCmRpZmYgLS1naXQgYS9rZXJuZWwvYnBmL2FycmF5bWFwLmMgYi9rZXJuZWwvYnBmL2FycmF5bWFwLmMKaW5kZXggMjQ4YjQ4MTgxNzhjZDEuLmM0ZTk0MzA5NDFlNTQ5IDEwMDY0NAotLS0gYS9rZXJuZWwvYnBmL2FycmF5bWFwLmMKJiM0MzsmIzQzOyYjNDM7IGIva2VybmVsL2JwZi9hcnJheW1hcC5jCkBAIC0yNTksNiAmIzQzOzI1OSwzNyBAQCBzdGF0aWMgdm9pZCAqcGVyY3B1X2FycmF5X21hcF9sb29rdXBfZWxlbShzdHJ1Y3QgYnBmX21hcCAqbWFwLCB2b2lkICprZXkpCiAJcmV0dXJuIHRoaXNfY3B1X3B0cihhcnJheS0mZ3Q7cHB0cnNbaW5kZXggJmFtcDsgYXJyYXktJmd0O2luZGV4X21hc2tdKTsKIH0KIAomIzQzO3N0YXRpYyBpbnQgcGVyY3B1X2FycmF5X21hcF9kaXJlY3RfdmFsdWVfYWRkcihjb25zdCBzdHJ1Y3QgYnBmX21hcCAqbWFwLCB1NjQgKmltbSwgdTMyIG9mZikKJiM0Mzt7CiYjNDM7CXN0cnVjdCBicGZfYXJyYXkgKmFycmF5ID0gY29udGFpbmVyX29mKG1hcCwgc3RydWN0IGJwZl9hcnJheSwgbWFwKTsKJiM0MzsKJiM0MzsJaWYgKG1hcC0mZ3Q7bWF4X2VudHJpZXMgIT0gMSkKJiM0MzsJCXJldHVybiAtRU9QTk9UU1VQUDsKJiM0MzsJaWYgKG9mZiAmZ3Q7PSBtYXAtJmd0O3ZhbHVlX3NpemUpCiYjNDM7CQlyZXR1cm4gLUVJTlZBTDsKJiM0MzsJaWYgKCFicGZfaml0X3N1cHBvcnRzX3BlcmNwdV9pbnNuKCkpCiYjNDM7CQlyZXR1cm4gLUVPUE5PVFNVUFA7CiYjNDM7CiYjNDM7CSppbW0gPSAodTY0KShfX2ZvcmNlIHVuc2lnbmVkIGxvbmcpIGFycmF5LSZndDtwcHRyc1swXTsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbnQgcGVyY3B1X2FycmF5X21hcF9kaXJlY3RfdmFsdWVfbWV0YShjb25zdCBzdHJ1Y3QgYnBmX21hcCAqbWFwLCB1NjQgaW1tLCB1MzIgKm9mZikKJiM0Mzt7CiYjNDM7CXN0cnVjdCBicGZfYXJyYXkgKmFycmF5ID0gY29udGFpbmVyX29mKG1hcCwgc3RydWN0IGJwZl9hcnJheSwgbWFwKTsKJiM0MzsJdTY0IGJhc2UgPSAodTY0KShfX2ZvcmNlIHVuc2lnbmVkIGxvbmcpIGFycmF5LSZndDtwcHRyc1swXTsKJiM0MzsKJiM0MzsJaWYgKG1hcC0mZ3Q7bWF4X2VudHJpZXMgIT0gMSkKJiM0MzsJCXJldHVybiAtRU9QTk9UU1VQUDsKJiM0MzsJaWYgKGltbSAmbHQ7IGJhc2UgfHwgaW1tICZndDs9IGJhc2UgJiM0MzsgYXJyYXktJmd0O2VsZW1fc2l6ZSkKJiM0MzsJCXJldHVybiAtRU5PRU5UOwomIzQzOwlpZiAoIWJwZl9qaXRfc3VwcG9ydHNfcGVyY3B1X2luc24oKSkKJiM0MzsJCXJldHVybiAtRU9QTk9UU1VQUDsKJiM0MzsKJiM0MzsJKm9mZiA9IGltbSAtIGJhc2U7CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MzsKIC8qIGVtaXQgQlBGIGluc3RydWN0aW9ucyBlcXVpdmFsZW50IHRvIEMgY29kZSBvZiBwZXJjcHVfYXJyYXlfbWFwX2xvb2t1cF9lbGVtKCkgKi8KIHN0YXRpYyBpbnQgcGVyY3B1X2FycmF5X21hcF9nZW5fbG9va3VwKHN0cnVjdCBicGZfbWFwICptYXAsIHN0cnVjdCBicGZfaW5zbiAqaW5zbl9idWYpCiB7CkBAIC01NTEsOSAmIzQzOzU4MiwxMCBAQCBzdGF0aWMgaW50IGFycmF5X21hcF9jaGVja19idGYoc3RydWN0IGJwZl9tYXAgKm1hcCwKIAkJCSAgICAgICBjb25zdCBzdHJ1Y3QgYnRmX3R5cGUgKmtleV90eXBlLAogCQkJICAgICAgIGNvbnN0IHN0cnVjdCBidGZfdHlwZSAqdmFsdWVfdHlwZSkKIHsKLQkvKiBPbmUgZXhjZXB0aW9uIGZvciBrZXlsZXNzIEJURjogLmJzcy8uZGF0YS8ucm9kYXRhIG1hcCAqLwomIzQzOwkvKiBPbmUgZXhjZXB0aW9uIGZvciBrZXlsZXNzIEJURjogLmJzcy8uZGF0YS8ucm9kYXRhLy5wZXJjcHUgbWFwICovCiAJaWYgKGJ0Zl90eXBlX2lzX3ZvaWQoa2V5X3R5cGUpKSB7Ci0JCWlmIChtYXAtJmd0O21hcF90eXBlICE9IEJQRl9NQVBfVFlQRV9BUlJBWSB8fAomIzQzOwkJaWYgKChtYXAtJmd0O21hcF90eXBlICE9IEJQRl9NQVBfVFlQRV9BUlJBWSAmYW1wOyZhbXA7CiYjNDM7CQkgICAgIG1hcC0mZ3Q7bWFwX3R5cGUgIT0gQlBGX01BUF9UWVBFX1BFUkNQVV9BUlJBWSkgfHwKIAkJICAgIG1hcC0mZ3Q7bWF4X2VudHJpZXMgIT0gMSkKIAkJCXJldHVybiAtRUlOVkFMOwogCkBAIC04MzIsNiAmIzQzOzg2NCw4IEBAIGNvbnN0IHN0cnVjdCBicGZfbWFwX29wcyBwZXJjcHVfYXJyYXlfbWFwX29wcyA9IHsKIAkubWFwX2dldF9uZXh0X2tleSA9IGJwZl9hcnJheV9nZXRfbmV4dF9rZXksCiAJLm1hcF9sb29rdXBfZWxlbSA9IHBlcmNwdV9hcnJheV9tYXBfbG9va3VwX2VsZW0sCiAJLm1hcF9nZW5fbG9va3VwID0gcGVyY3B1X2FycmF5X21hcF9nZW5fbG9va3VwLAomIzQzOwkubWFwX2RpcmVjdF92YWx1ZV9hZGRyID0gcGVyY3B1X2FycmF5X21hcF9kaXJlY3RfdmFsdWVfYWRkciwKJiM0MzsJLm1hcF9kaXJlY3RfdmFsdWVfbWV0YSA9IHBlcmNwdV9hcnJheV9tYXBfZGlyZWN0X3ZhbHVlX21ldGEsCiAJLm1hcF91cGRhdGVfZWxlbSA9IGFycmF5X21hcF91cGRhdGVfZWxlbSwKIAkubWFwX2RlbGV0ZV9lbGVtID0gYXJyYXlfbWFwX2RlbGV0ZV9lbGVtLAogCS5tYXBfbG9va3VwX3BlcmNwdV9lbGVtID0gcGVyY3B1X2FycmF5X21hcF9sb29rdXBfcGVyY3B1X2VsZW0sCmRpZmYgLS1naXQgYS9rZXJuZWwvYnBmL2NvbnN0X2ZvbGQuYyBiL2tlcm5lbC9icGYvY29uc3RfZm9sZC5jCmluZGV4IGIyYTE5YWNhZGI5MWVjLi41Nzg3MjQ2YmVmMzAxMCAxMDA2NDQKLS0tIGEva2VybmVsL2JwZi9jb25zdF9mb2xkLmMKJiM0MzsmIzQzOyYjNDM7IGIva2VybmVsL2JwZi9jb25zdF9mb2xkLmMKQEAgLTE4Miw3ICYjNDM7MTgyLDYgQEAgc3RhdGljIHZvaWQgY29uc3RfcmVnX3hmZXIoc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudiwgc3RydWN0IGNvbnN0X2FyZ19pbmZvICoKIAkJdTY0IHZhbCA9IDA7CiAKIAkJaWYgKCFicGZfbWFwX2lzX3Jkb25seShtYXApIHx8ICFtYXAtJmd0O29wcy0mZ3Q7bWFwX2RpcmVjdF92YWx1ZV9hZGRyIHx8Ci0JCSAgICBtYXAtJmd0O21hcF90eXBlID09IEJQRl9NQVBfVFlQRV9JTlNOX0FSUkFZIHx8CiAJCSAgICBvZmYgJmx0OyAwIHx8IG9mZiAmIzQzOyBzaXplICZndDsgbWFwLSZndDt2YWx1ZV9zaXplIHx8CiAJCSAgICBicGZfbWFwX2RpcmVjdF9yZWFkKG1hcCwgb2ZmLCBzaXplLCAmYW1wO3ZhbCwgaXNfbGRzeCkpIHsKIAkJCSpkc3QgPSB1bmtub3duOwpkaWZmIC0tZ2l0IGEva2VybmVsL2JwZi9maXh1cHMuYyBiL2tlcm5lbC9icGYvZml4dXBzLmMKaW5kZXggM2NmMmNjNmUzYWI2NmEuLjRmODRkMDg3Y2E2OWUzIDEwMDY0NAotLS0gYS9rZXJuZWwvYnBmL2ZpeHVwcy5jCiYjNDM7JiM0MzsmIzQzOyBiL2tlcm5lbC9icGYvZml4dXBzLmMKQEAgLTE4MTksNiAmIzQzOzE4MTksMzggQEAgaW50IGJwZl9kb19taXNjX2ZpeHVwcyhzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52KQogCQkJZ290byBuZXh0X2luc247CiAJCX0KIAomIzQzOwkJaWYgKGVudi0mZ3Q7cHJvZy0mZ3Q7aml0X3JlcXVlc3RlZCAmYW1wOyZhbXA7CiYjNDM7CQkgICAgYnBmX2ppdF9zdXBwb3J0c19wZXJjcHVfaW5zbigpICZhbXA7JmFtcDsKJiM0MzsJCSAgICBpbnNuLSZndDtjb2RlID09IChCUEZfTEQgfCBCUEZfSU1NIHwgQlBGX0RXKSAmYW1wOyZhbXA7CiYjNDM7CQkgICAgKGluc24tJmd0O3NyY19yZWcgPT0gQlBGX1BTRVVET19NQVBfVkFMVUUgfHwKJiM0MzsJCSAgICAgaW5zbi0mZ3Q7c3JjX3JlZyA9PSBCUEZfUFNFVURPX01BUF9JRFhfVkFMVUUpKSB7CiYjNDM7CQkJc3RydWN0IGJwZl9tYXAgKm1hcDsKJiM0MzsKJiM0MzsJCQlhdXggPSAmYW1wO2Vudi0mZ3Q7aW5zbl9hdXhfZGF0YVtpICYjNDM7IGRlbHRhXTsKJiM0MzsJCQltYXAgPSBlbnYtJmd0O3VzZWRfbWFwc1thdXgtJmd0O21hcF9pbmRleF07CiYjNDM7CQkJaWYgKG1hcC0mZ3Q7bWFwX3R5cGUgIT0gQlBGX01BUF9UWVBFX1BFUkNQVV9BUlJBWSkKJiM0MzsJCQkJZ290byBuZXh0X2luc247CiYjNDM7CiYjNDM7CQkJLyoKJiM0MzsJCQkgKiBSZXVzZSB0aGUgb3JpZ2luYWwgbGRfaW1tNjQgaW5zbiwgYW5kIGFkZCBvbmUKJiM0MzsJCQkgKiBtb3Y2NF9wZXJjcHVfcmVnIGluc24uCiYjNDM7CQkJICovCiYjNDM7CiYjNDM7CQkJaW5zbl9idWZbMF0gPSBpbnNuWzFdOwomIzQzOwkJCWluc25fYnVmWzFdID0gQlBGX01PVjY0X1BFUkNQVV9SRUcoaW5zbi0mZ3Q7ZHN0X3JlZywgaW5zbi0mZ3Q7ZHN0X3JlZyk7CiYjNDM7CQkJY250ID0gMjsKJiM0MzsKJiM0MzsJCQlpJiM0MzsmIzQzOzsKJiM0MzsJCQluZXdfcHJvZyA9IGJwZl9wYXRjaF9pbnNuX2RhdGEoZW52LCBpICYjNDM7IGRlbHRhLCBpbnNuX2J1ZiwgY250KTsKJiM0MzsJCQlpZiAoIW5ld19wcm9nKQomIzQzOwkJCQlyZXR1cm4gLUVOT01FTTsKJiM0MzsKJiM0MzsJCQlkZWx0YSAgICAmIzQzOz0gY250IC0gMTsKJiM0MzsJCQllbnYtJmd0O3Byb2cgPSBwcm9nID0gbmV3X3Byb2c7CiYjNDM7CQkJaW5zbiAgICAgID0gbmV3X3Byb2ctJmd0O2luc25zaSAmIzQzOyBpICYjNDM7IGRlbHRhOwomIzQzOwkJCWdvdG8gbmV4dF9pbnNuOwomIzQzOwkJfQomIzQzOwogCQlpZiAoaW5zbi0mZ3Q7Y29kZSAhPSAoQlBGX0pNUCB8IEJQRl9DQUxMKSkKIAkJCWdvdG8gbmV4dF9pbnNuOwogCQlpZiAoaW5zbi0mZ3Q7c3JjX3JlZyA9PSBCUEZfUFNFVURPX0NBTEwpCmRpZmYgLS1naXQgYS9rZXJuZWwvYnBmL3ZlcmlmaWVyLmMgYi9rZXJuZWwvYnBmL3ZlcmlmaWVyLmMKaW5kZXggMjVhZWE0MjcxY2QwODkuLmRiZjc2ZmE5ZDQzZDhlIDEwMDY0NAotLS0gYS9rZXJuZWwvYnBmL3ZlcmlmaWVyLmMKJiM0MzsmIzQzOyYjNDM7IGIva2VybmVsL2JwZi92ZXJpZmllci5jCkBAIC02NTIsNyAmIzQzOzY1Miw2IEBAIHN0YXRpYyB2b2lkIF9fbWFya19keW5wdHJfcmVnKHN0cnVjdCBicGZfcmVnX3N0YXRlICpyZWcsCiAJCQkgICAgICBlbnVtIGJwZl9keW5wdHJfdHlwZSB0eXBlLAogCQkJICAgICAgYm9vbCBmaXJzdF9zbG90LCBpbnQgaWQsIGludCBwYXJlbnRfaWQpOwogCi0KIHN0YXRpYyB2b2lkIG1hcmtfZHlucHRyX3N0YWNrX3JlZ3Moc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudiwKIAkJCQkgICBzdHJ1Y3QgYnBmX3JlZ19zdGF0ZSAqc3JlZzEsCiAJCQkJICAgc3RydWN0IGJwZl9yZWdfc3RhdGUgKnNyZWcyLApAQCAtMTY4OSw3ICYjNDM7MTY4OCw2IEBAIHN0YXRpYyBib29sIHNhbWVfY2FsbHNpdGVzKHN0cnVjdCBicGZfdmVyaWZpZXJfc3RhdGUgKmEsIHN0cnVjdCBicGZfdmVyaWZpZXJfc3RhCiAJcmV0dXJuIHRydWU7CiB9CiAKLQogdm9pZCBicGZfZnJlZV9iYWNrZWRnZXMoc3RydWN0IGJwZl9zY2NfdmlzaXQgKnZpc2l0KQogewogCXN0cnVjdCBicGZfc2NjX2JhY2tlZGdlICpiYWNrZWRnZSwgKm5leHQ7CkBAIC0yMzA5LDcgJiM0MzsyMzA3LDYgQEAgc3RhdGljIHN0cnVjdCBicGZfdmVyaWZpZXJfc3RhdGUgKnB1c2hfYXN5bmNfY2Ioc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudiwKIAlyZXR1cm4gJmFtcDtlbGVtLSZndDtzdDsKIH0KIAotCiBzdGF0aWMgaW50IGNtcF9zdWJwcm9ncyhjb25zdCB2b2lkICphLCBjb25zdCB2b2lkICpiKQogewogCXJldHVybiAoKHN0cnVjdCBicGZfc3VicHJvZ19pbmZvICopYSktJmd0O3N0YXJ0IC0KQEAgLTMzMzEsNyAmIzQzOzMzMjgsNiBAQCBzdGF0aWMgYm9vbCBpc19zcGlsbGFibGVfcmVndHlwZShlbnVtIGJwZl9yZWdfdHlwZSB0eXBlKQogCX0KIH0KIAotCiAvKiBjaGVjayBpZiByZWdpc3RlciBpcyBhIGNvbnN0YW50IHNjYWxhciB2YWx1ZSAqLwogc3RhdGljIGJvb2wgaXNfcmVnX2NvbnN0KHN0cnVjdCBicGZfcmVnX3N0YXRlICpyZWcsIGJvb2wgc3VicmVnMzIpCiB7CkBAIC00MDI1LDcgJiM0Mzs0MDIxLDYgQEAgc3RhdGljIGludCBjaGVja19zdGFja19yZWFkKHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsCiAJcmV0dXJuIGVycjsKIH0KIAotCiAvKiBjaGVja19zdGFja193cml0ZSBkaXNwYXRjaGVzIHRvIGNoZWNrX3N0YWNrX3dyaXRlX2ZpeGVkX29mZiBvcgogICogY2hlY2tfc3RhY2tfd3JpdGVfdmFyX29mZi4KICAqCkBAIC00ODIwLDcgJiM0Mzs0ODE1LDYgQEAgc3RhdGljIGludCBjaGVja19zb2NrX2FjY2VzcyhzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52LCBpbnQgaW5zbl9pZHgsCiAJCXZhbGlkID0gZmFsc2U7CiAJfQogCi0KIAlpZiAodmFsaWQpIHsKIAkJZW52LSZndDtpbnNuX2F1eF9kYXRhW2luc25faWR4XS5jdHhfZmllbGRfc2l6ZSA9CiAJCQlpbmZvLmN0eF9maWVsZF9zaXplOwpAQCAtNTYwMCw2ICYjNDM7NTU5NCw4IEBAIGludCBicGZfbWFwX2RpcmVjdF9yZWFkKHN0cnVjdCBicGZfbWFwICptYXAsIGludCBvZmYsIGludCBzaXplLCB1NjQgKnZhbCwKIAl1NjQgYWRkcjsKIAlpbnQgZXJyOwogCiYjNDM7CWlmIChtYXAtJmd0O21hcF90eXBlID09IEJQRl9NQVBfVFlQRV9JTlNOX0FSUkFZIHx8IG1hcC0mZ3Q7bWFwX3R5cGUgPT0gQlBGX01BUF9UWVBFX1BFUkNQVV9BUlJBWSkKJiM0MzsJCXJldHVybiAtRUlOVkFMOwogCWVyciA9IG1hcC0mZ3Q7b3BzLSZndDttYXBfZGlyZWN0X3ZhbHVlX2FkZHIobWFwLCAmYW1wO2FkZHIsIG9mZik7CiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKQEAgLTYxNTUsNiAmIzQzOzYxNTEsNyBAQCBzdGF0aWMgaW50IGNoZWNrX21lbV9hY2Nlc3Moc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudiwgaW50IGluc25faWR4LCBzdHJ1Y3QgYgogCQkJaWYgKHRudW1faXNfY29uc3QocmVnLSZndDt2YXJfb2ZmKSAmYW1wOyZhbXA7CiAJCQkgICAgYnBmX21hcF9pc19yZG9ubHkobWFwKSAmYW1wOyZhbXA7CiAJCQkgICAgbWFwLSZndDtvcHMtJmd0O21hcF9kaXJlY3RfdmFsdWVfYWRkciAmYW1wOyZhbXA7CiYjNDM7CQkJICAgIG1hcC0mZ3Q7bWFwX3R5cGUgIT0gQlBGX01BUF9UWVBFX1BFUkNQVV9BUlJBWSAmYW1wOyZhbXA7CiAJCQkgICAgbWFwLSZndDttYXBfdHlwZSAhPSBCUEZfTUFQX1RZUEVfSU5TTl9BUlJBWSkgewogCQkJCWludCBtYXBfb2ZmID0gb2ZmICYjNDM7IHJlZy0mZ3Q7dmFyX29mZi52YWx1ZTsKIAkJCQl1NjQgdmFsID0gMDsKQEAgLTY2NDUsNyAmIzQzOzY2NDIsNiBAQCBzdGF0aWMgaW50IGNoZWNrX3N0YWNrX3JhbmdlX2luaXRpYWxpemVkKAogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7CiAKLQogCWlmICh0bnVtX2lzX2NvbnN0KHJlZy0mZ3Q7dmFyX29mZikpIHsKIAkJbWluX29mZiA9IG1heF9vZmYgPSByZWctJmd0O3Zhcl9vZmYudmFsdWUgJiM0Mzsgb2ZmOwogCX0gZWxzZSB7CkBAIC03MzU5LDcgJiM0Mzs3MzU1LDYgQEAgc3RhdGljIGJvb2wgaXNfaXRlcl9uZXdfa2Z1bmMoc3RydWN0IGJwZl9rZnVuY19jYWxsX2FyZ19tZXRhICptZXRhKQogCXJldHVybiBtZXRhLSZndDtrZnVuY19mbGFncyAmYW1wOyBLRl9JVEVSX05FVzsKIH0KIAotCiBzdGF0aWMgYm9vbCBpc19pdGVyX2Rlc3Ryb3lfa2Z1bmMoc3RydWN0IGJwZl9rZnVuY19jYWxsX2FyZ19tZXRhICptZXRhKQogewogCXJldHVybiBtZXRhLSZndDtrZnVuY19mbGFncyAmYW1wOyBLRl9JVEVSX0RFU1RST1k7CkBAIC04MTI1LDYgJiM0Mzs4MTIwLDEyIEBAIHN0YXRpYyBpbnQgY2hlY2tfYXJnX2NvbnN0X3N0cihzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52LAogCQlyZXR1cm4gLUVBQ0NFUzsKIAl9CiAKJiM0MzsJaWYgKG1hcC0mZ3Q7bWFwX3R5cGUgPT0gQlBGX01BUF9UWVBFX1BFUkNQVV9BUlJBWSkgewomIzQzOwkJdmVyYm9zZShlbnYsICYjMzQ7JXMgcG9pbnRzIHRvIHBlcmNwdV9hcnJheSBtYXAgd2hpY2ggY2Fubm90IGJlIHVzZWQgYXMgY29uc3Qgc3RyaW5nXG4mIzM0OywKJiM0MzsJCQlyZWdfYXJnX25hbWUoZW52LCBhcmdubykpOwomIzQzOwkJcmV0dXJuIC1FQUNDRVM7CiYjNDM7CX0KJiM0MzsKIAlpZiAoIWJwZl9tYXBfaXNfcmRvbmx5KG1hcCkpIHsKIAkJdmVyYm9zZShlbnYsICYjMzQ7JXMgZG9lcyBub3QgcG9pbnQgdG8gYSByZWFkb25seSBtYXAmIzM5O1xuJiMzNDssIHJlZ19hcmdfbmFtZShlbnYsIGFyZ25vKSk7CiAJCXJldHVybiAtRUFDQ0VTOwpAQCAtMTE1MDIsNyAmIzQzOzExNTAzLDYgQEAgc3RhdGljIGludCBwcm9jZXNzX2lycV9mbGFnKHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsIHN0cnVjdCBicGZfcmVnX3N0YXRlICoKIAlyZXR1cm4gMDsKIH0KIAotCiBzdGF0aWMgaW50IHJlZl9zZXRfbm9uX293bmluZyhzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52LCBzdHJ1Y3QgYnBmX3JlZ19zdGF0ZSAqcmVnKQogewogCXN0cnVjdCBidGZfcmVjb3JkICpyZWMgPSByZWdfYnRmX3JlY29yZChyZWcpOwpAQCAtMTYzOTQsNyAmIzQzOzE2Mzk0LDYgQEAgc3RhdGljIGludCBjaGVja19sZF9hYnMoc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudiwgc3RydWN0IGJwZl9pbnNuICppbnNuKQogCXJldHVybiAwOwogfQogCi0KIHN0YXRpYyBib29sIHJldHVybl9yZXR2YWxfcmFuZ2Uoc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudiwgc3RydWN0IGJwZl9yZXR2YWxfcmFuZ2UgKnJhbmdlKQogewogCWVudW0gYnBmX3Byb2dfdHlwZSBwcm9nX3R5cGUgPSByZXNvbHZlX3Byb2dfdHlwZShlbnYtJmd0O3Byb2cpOwpAQCAtMTgyMTMsNiAmIzQzOzE4MjEyLDEyIEBAIHN0YXRpYyBpbnQgY2hlY2tfYW5kX3Jlc29sdmVfaW5zbnMoc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudikKIAkJCQkJcmV0dXJuIC1FSU5WQUw7CiAJCQkJfQogCiYjNDM7CQkJCWlmIChtYXAtJmd0O21hcF90eXBlID09IEJQRl9NQVBfVFlQRV9QRVJDUFVfQVJSQVkgJmFtcDsmYW1wOwomIzQzOwkJCQkgICAgIWVudi0mZ3Q7cHJvZy0mZ3Q7aml0X3JlcXVlc3RlZCkgewomIzQzOwkJCQkJdmVyYm9zZShlbnYsICYjMzQ7SklUIGlzIHJlcXVpcmVkIHRvIHVzZSBnbG9iYWwgcGVyY3B1IGRhdGFcbiYjMzQ7KTsKJiM0MzsJCQkJCXJldHVybiAtRU9QTk9UU1VQUDsKJiM0MzsJCQkJfQomIzQzOwogCQkJCWVyciA9IG1hcC0mZ3Q7b3BzLSZndDttYXBfZGlyZWN0X3ZhbHVlX2FkZHIobWFwLCAmYW1wO2FkZHIsIG9mZik7CiAJCQkJaWYgKGVycikgewogCQkJCQl2ZXJib3NlKGVudiwgJiMzNDtpbnZhbGlkIGFjY2VzcyB0byBtYXAgdmFsdWUgcG9pbnRlciwgdmFsdWVfc2l6ZT0ldSBvZmY9JXVcbiYjMzQ7LApAQCAtMTgyODgsOCAmIzQzOzE4MjkzLDYgQEAgc3RhdGljIHZvaWQgcmVsZWFzZV9pbnNuX2FycmF5cyhzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52KQogCQlicGZfaW5zbl9hcnJheV9yZWxlYXNlKGVudi0mZ3Q7aW5zbl9hcnJheV9tYXBzW2ldKTsKIH0KIAotCi0KIC8qIFRoZSB2ZXJpZmllciBkb2VzIG1vcmUgZGF0YSBmbG93IGFuYWx5c2lzIHRoYW4gbGx2bSBhbmQgd2lsbCBub3QKICAqIGV4cGxvcmUgYnJhbmNoZXMgdGhhdCBhcmUgZGVhZCBhdCBydW4gdGltZS4gTWFsaWNpb3VzIHByb2dyYW1zIGNhbgogICogaGF2ZSBkZWFkIGNvZGUgdG9vLiBUaGVyZWZvcmUgcmVwbGFjZSBhbGwgZGVhZCBhdC1ydW4tdGltZSBjb2RlCkBAIC0xODMxNyw4ICYjNDM7MTgzMjAsNiBAQCBzdGF0aWMgdm9pZCBzYW5pdGl6ZV9kZWFkX2NvZGUoc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudikKIAl9CiB9CiAKLQotCiBzdGF0aWMgdm9pZCBmcmVlX3N0YXRlcyhzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52KQogewogCXN0cnVjdCBicGZfdmVyaWZpZXJfc3RhdGVfbGlzdCAqc2w7CkBAIC0xODYwMCw3ICYjNDM7MTg2MDEsNiBAQCBzdGF0aWMgaW50IGRvX2NoZWNrX21haW4oc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudikKIAlyZXR1cm4gcmV0OwogfQogCi0KIHN0YXRpYyB2b2lkIHByaW50X3ZlcmlmaWNhdGlvbl9zdGF0cyhzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52KQogewogCS8qIFNraXAgb3ZlciBoaWRkZW4gc3VicHJvZ3Mgd2hpY2ggYXJlIG5vdCB2ZXJpZmllZC4gKi8KZGlmZiAtLWdpdCBhL3Rvb2xzL2JwZi9icGZ0b29sL2dlbi5jIGIvdG9vbHMvYnBmL2JwZnRvb2wvZ2VuLmMKaW5kZXggNmFlNzI2MmViZTBjMWQuLjJlNjAyOTYzNThkYjVlIDEwMDY0NAotLS0gYS90b29scy9icGYvYnBmdG9vbC9nZW4uYwomIzQzOyYjNDM7JiM0MzsgYi90b29scy9icGYvYnBmdG9vbC9nZW4uYwpAQCAtOTIsNyAmIzQzOzkyLDcgQEAgc3RhdGljIHZvaWQgZ2V0X2hlYWRlcl9ndWFyZChjaGFyICpndWFyZCwgY29uc3QgY2hhciAqb2JqX25hbWUsIGNvbnN0IGNoYXIgKnN1ZmYKIAogc3RhdGljIGJvb2wgZ2V0X21hcF9pZGVudChjb25zdCBzdHJ1Y3QgYnBmX21hcCAqbWFwLCBjaGFyICpidWYsIHNpemVfdCBidWZfc3opCiB7Ci0Jc3RhdGljIGNvbnN0IGNoYXIgKnNmeHNbXSA9IHsgJiMzNDsuZGF0YSYjMzQ7LCAmIzM0Oy5yb2RhdGEmIzM0OywgJiMzNDsuYnNzJiMzNDssICYjMzQ7Lmtjb25maWcmIzM0OyB9OwomIzQzOwlzdGF0aWMgY29uc3QgY2hhciAqc2Z4c1tdID0geyAmIzM0Oy5kYXRhJiMzNDssICYjMzQ7LnJvZGF0YSYjMzQ7LCAmIzM0Oy5ic3MmIzM0OywgJiMzNDsucGVyY3B1JiMzNDssICYjMzQ7Lmtjb25maWcmIzM0OyB9OwogCWNvbnN0IGNoYXIgKm5hbWUgPSBicGZfbWFwX19uYW1lKG1hcCk7CiAJaW50IGksIG47CiAKQEAgLTExNyw3ICYjNDM7MTE3LDcgQEAgc3RhdGljIGJvb2wgZ2V0X21hcF9pZGVudChjb25zdCBzdHJ1Y3QgYnBmX21hcCAqbWFwLCBjaGFyICpidWYsIHNpemVfdCBidWZfc3opCiAKIHN0YXRpYyBib29sIGdldF9kYXRhc2VjX2lkZW50KGNvbnN0IGNoYXIgKnNlY19uYW1lLCBjaGFyICpidWYsIHNpemVfdCBidWZfc3opCiB7Ci0Jc3RhdGljIGNvbnN0IGNoYXIgKnBmeHNbXSA9IHsgJiMzNDsuZGF0YSYjMzQ7LCAmIzM0Oy5yb2RhdGEmIzM0OywgJiMzNDsuYnNzJiMzNDssICYjMzQ7Lmtjb25maWcmIzM0OyB9OwomIzQzOwlzdGF0aWMgY29uc3QgY2hhciAqcGZ4c1tdID0geyAmIzM0Oy5kYXRhJiMzNDssICYjMzQ7LnJvZGF0YSYjMzQ7LCAmIzM0Oy5ic3MmIzM0OywgJiMzNDsucGVyY3B1JiMzNDssICYjMzQ7Lmtjb25maWcmIzM0OyB9OwogCWludCBpLCBuOwogCiAJLyogcmVjb2duaXplIGhhcmQgY29kZWQgTExWTSBzZWN0aW9uIG5hbWUgKi8KQEAgLTI1NCw2ICYjNDM7MjU0LDIwIEBAIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYnRmX3R5cGUgKmZpbmRfdHlwZV9mb3JfbWFwKHN0cnVjdCBidGYgKmJ0ZiwgY29uc3QgY2hhciAqbWFwCiAJcmV0dXJuIE5VTEw7CiB9CiAKJiM0MztzdGF0aWMgYm9vbCBicGZfbWFwX2lzX3NrZWxfZGF0YShjb25zdCBzdHJ1Y3QgYnBmX21hcCAqbWFwKQomIzQzO3sKJiM0MzsJaWYgKCFicGZfbWFwX19pc19pbnRlcm5hbChtYXApKQomIzQzOwkJcmV0dXJuIGZhbHNlOwomIzQzOwomIzQzOwlpZiAoYnBmX21hcF9fbWFwX2ZsYWdzKG1hcCkgJmFtcDsgQlBGX0ZfTU1BUEFCTEUpCiYjNDM7CQlyZXR1cm4gdHJ1ZTsKJiM0MzsKJiM0MzsJaWYgKGJwZl9tYXBfX3R5cGUobWFwKSA9PSBCUEZfTUFQX1RZUEVfUEVSQ1BVX0FSUkFZKQomIzQzOwkJcmV0dXJuIHRydWU7CiYjNDM7CiYjNDM7CXJldHVybiBmYWxzZTsKJiM0Mzt9CiYjNDM7CiBzdGF0aWMgYm9vbCBpc19tbWFwYWJsZV9tYXAoY29uc3Qgc3RydWN0IGJwZl9tYXAgKm1hcCwgY2hhciAqYnVmLCBzaXplX3Qgc3opCiB7CiAJc2l6ZV90IHRtcF9zejsKQEAgLTI2Myw3ICYjNDM7Mjc3LDcgQEAgc3RhdGljIGJvb2wgaXNfbW1hcGFibGVfbWFwKGNvbnN0IHN0cnVjdCBicGZfbWFwICptYXAsIGNoYXIgKmJ1Ziwgc2l6ZV90IHN6KQogCQlyZXR1cm4gdHJ1ZTsKIAl9CiAKLQlpZiAoIWJwZl9tYXBfX2lzX2ludGVybmFsKG1hcCkgfHwgIShicGZfbWFwX19tYXBfZmxhZ3MobWFwKSAmYW1wOyBCUEZfRl9NTUFQQUJMRSkpCiYjNDM7CWlmICghYnBmX21hcF9pc19za2VsX2RhdGEobWFwKSkKIAkJcmV0dXJuIGZhbHNlOwogCiAJaWYgKCFnZXRfbWFwX2lkZW50KG1hcCwgYnVmLCBzeikpCkBAIC0zMjEsNiAmIzQzOzMzNSwxMSBAQCBzdGF0aWMgYm9vbCBidGZfaXNfcHRyX3RvX2Z1bmNfcHJvdG8oY29uc3Qgc3RydWN0IGJ0ZiAqYnRmLAogCXJldHVybiBidGZfaXNfcHRyKHYpICZhbXA7JmFtcDsgYnRmX2lzX2Z1bmNfcHJvdG8oYnRmX190eXBlX2J5X2lkKGJ0Ziwgdi0mZ3Q7dHlwZSkpOwogfQogCiYjNDM7c3RhdGljIGJvb2wgYnBmX21hcF9pc19wZXJjcHVfZGF0YShjb25zdCBzdHJ1Y3QgYnBmX21hcCAqbWFwKQomIzQzO3sKJiM0MzsJcmV0dXJuIGJwZl9tYXBfX2lzX2ludGVybmFsKG1hcCkgJmFtcDsmYW1wOyBicGZfbWFwX190eXBlKG1hcCkgPT0gQlBGX01BUF9UWVBFX1BFUkNQVV9BUlJBWTsKJiM0Mzt9CiYjNDM7CiBzdGF0aWMgaW50IGNvZGVnZW5fc3Vic2tlbF9kYXRhc2VjcyhzdHJ1Y3QgYnBmX29iamVjdCAqb2JqLCBjb25zdCBjaGFyICpvYmpfbmFtZSkKIHsKIAlzdHJ1Y3QgYnRmICpidGYgPSBicGZfb2JqZWN0X19idGYob2JqKTsKQEAgLTM0Myw2ICYjNDM7MzYyLDkgQEAgc3RhdGljIGludCBjb2RlZ2VuX3N1YnNrZWxfZGF0YXNlY3Moc3RydWN0IGJwZl9vYmplY3QgKm9iaiwgY29uc3QgY2hhciAqb2JqX25hbWUKIAkJaWYgKCFpc19tbWFwYWJsZV9tYXAobWFwLCBtYXBfaWRlbnQsIHNpemVvZihtYXBfaWRlbnQpKSkKIAkJCWNvbnRpbnVlOwogCiYjNDM7CQlpZiAoYnBmX21hcF9pc19wZXJjcHVfZGF0YShtYXApKQomIzQzOwkJCWNvbnRpbnVlOwomIzQzOwogCQlzZWMgPSBmaW5kX3R5cGVfZm9yX21hcChidGYsIG1hcF9pZGVudCk7CiAJCWlmICghc2VjKQogCQkJY29udGludWU7CkBAIC02NjgsOCAmIzQzOzY5MCw3IEBAIHN0YXRpYyB2b2lkIGNvZGVnZW5fZGVzdHJveShzdHJ1Y3QgYnBmX29iamVjdCAqb2JqLCBjb25zdCBjaGFyICpvYmpfbmFtZSkKIAlicGZfb2JqZWN0X19mb3JfZWFjaF9tYXAobWFwLCBvYmopIHsKIAkJaWYgKCFnZXRfbWFwX2lkZW50KG1hcCwgaWRlbnQsIHNpemVvZihpZGVudCkpKQogCQkJY29udGludWU7Ci0JCWlmIChicGZfbWFwX19pc19pbnRlcm5hbChtYXApICZhbXA7JmFtcDsKLQkJICAgIChicGZfbWFwX19tYXBfZmxhZ3MobWFwKSAmYW1wOyBCUEZfRl9NTUFQQUJMRSkpCiYjNDM7CQlpZiAoYnBmX21hcF9pc19za2VsX2RhdGEobWFwKSkKIAkJCXByaW50ZigmIzM0O1x0c2tlbF9mcmVlX21hcF9kYXRhKHNrZWwtJmd0OyUxJHMsIHNrZWwtJmd0O21hcHMuJTEkcy5pbml0aWFsX3ZhbHVlLCAlMiR6dSk7XG4mIzM0OywKIAkJCSAgICAgICBpZGVudCwgYnBmX21hcF9tbWFwX3N6KG1hcCkpOwogCQljb2RlZ2VuKCYjMzQ7XApAQCAtODUwLDYgJiM0Mzs4NzEsMjAgQEAgc3RhdGljIGludCBnZW5fdHJhY2Uoc3RydWN0IGJwZl9vYmplY3QgKm9iaiwgY29uc3QgY2hhciAqb2JqX25hbWUsIGNvbnN0IGNoYXIgKmgKIAkJaWYgKCFpc19tbWFwYWJsZV9tYXAobWFwLCBpZGVudCwgc2l6ZW9mKGlkZW50KSkpCiAJCQljb250aW51ZTsKIAomIzQzOwkJaWYgKGJwZl9tYXBfaXNfcGVyY3B1X2RhdGEobWFwKSkgewomIzQzOwkJCWNvZGVnZW4oJiMzNDtcCiYjNDM7CQlcblwKJiM0MzsJCQllcnIgPSBza2VsX3Byb3RlY3RfbWFwX2RhdGEoc2tlbC0mZ3Q7JTEkcywgJmFtcDtza2VsLSZndDttYXBzLiUxJHMuaW5pdGlhbF92YWx1ZSwgJTIkemQpO1xuXAomIzQzOwkJCWlmIChlcnIpCQkJCQkgICAgXG5cCiYjNDM7CQkJCXJldHVybiBlcnI7CQkJCSAgICBcblwKJiM0MzsJCSNpZmRlZiBfX0tFUk5FTF9fCQkJCQkgICAgXG5cCiYjNDM7CQkJc2tlbC0mZ3Q7JTEkcyA9IE5VTEw7CQkJCSAgICBcblwKJiM0MzsJCSNlbmRpZgkJCQkJCQkgICAgXG5cCiYjNDM7CQkJJiMzNDssCiYjNDM7CQkJaWRlbnQsIGJwZl9tYXBfbW1hcF9zeihtYXApKTsKJiM0MzsJCQljb250aW51ZTsKJiM0MzsJCX0KJiM0MzsKIAkJaWYgKGJwZl9tYXBfX21hcF9mbGFncyhtYXApICZhbXA7IEJQRl9GX1JET05MWV9QUk9HKQogCQkJbW1hcF9mbGFncyA9ICYjMzQ7UFJPVF9SRUFEJiMzNDs7CiAJCWVsc2UKQEAgLTE3NDAsNiAmIzQzOzE3NzUsOCBAQCBzdGF0aWMgaW50IGRvX3N1YnNrZWxldG9uKGludCBhcmdjLCBjaGFyICoqYXJndikKIAogCQlpZiAoIWlzX21tYXBhYmxlX21hcChtYXAsIGlkZW50LCBzaXplb2YoaWRlbnQpKSkKIAkJCWNvbnRpbnVlOwomIzQzOwkJaWYgKGJwZl9tYXBfaXNfcGVyY3B1X2RhdGEobWFwKSkKJiM0MzsJCQljb250aW51ZTsKIAogCQltYXBfdHlwZV9pZCA9IGJwZl9tYXBfX2J0Zl92YWx1ZV90eXBlX2lkKG1hcCk7CiAJCWlmIChtYXBfdHlwZV9pZCAmbHQ7PSAwKSB7CkBAIC0xODYzLDYgJiM0MzsxOTAwLDggQEAgc3RhdGljIGludCBkb19zdWJza2VsZXRvbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCiAJYnBmX29iamVjdF9fZm9yX2VhY2hfbWFwKG1hcCwgb2JqKSB7CiAJCWlmICghaXNfbW1hcGFibGVfbWFwKG1hcCwgaWRlbnQsIHNpemVvZihpZGVudCkpKQogCQkJY29udGludWU7CiYjNDM7CQlpZiAoYnBmX21hcF9pc19wZXJjcHVfZGF0YShtYXApKQomIzQzOwkJCWNvbnRpbnVlOwogCiAJCW1hcF90eXBlX2lkID0gYnBmX21hcF9fYnRmX3ZhbHVlX3R5cGVfaWQobWFwKTsKIAkJaWYgKG1hcF90eXBlX2lkICZsdDs9IDApCmRpZmYgLS1naXQgYS90b29scy9saWIvYnBmL2JwZl9nZW5faW50ZXJuYWwuaCBiL3Rvb2xzL2xpYi9icGYvYnBmX2dlbl9pbnRlcm5hbC5oCmluZGV4IDQ5YWY0MjYwYjhlNmI3Li41ZWE4MzgzODA1ZDNiYyAxMDA2NDQKLS0tIGEvdG9vbHMvbGliL2JwZi9icGZfZ2VuX2ludGVybmFsLmgKJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvbGliL2JwZi9icGZfZ2VuX2ludGVybmFsLmgKQEAgLTY2LDcgJiM0Mzs2Niw4IEBAIHZvaWQgYnBmX2dlbl9fcHJvZ19sb2FkKHN0cnVjdCBicGZfZ2VuICpnZW4sCiAJCQllbnVtIGJwZl9wcm9nX3R5cGUgcHJvZ190eXBlLCBjb25zdCBjaGFyICpwcm9nX25hbWUsCiAJCQljb25zdCBjaGFyICpsaWNlbnNlLCBzdHJ1Y3QgYnBmX2luc24gKmluc25zLCBzaXplX3QgaW5zbl9jbnQsCiAJCQlzdHJ1Y3QgYnBmX3Byb2dfbG9hZF9vcHRzICpsb2FkX2F0dHIsIGludCBwcm9nX2lkeCk7Ci12b2lkIGJwZl9nZW5fX21hcF91cGRhdGVfZWxlbShzdHJ1Y3QgYnBmX2dlbiAqZ2VuLCBpbnQgbWFwX2lkeCwgdm9pZCAqdmFsdWUsIF9fdTMyIHZhbHVlX3NpemUpOwomIzQzO3ZvaWQgYnBmX2dlbl9fbWFwX3VwZGF0ZV9lbGVtKHN0cnVjdCBicGZfZ2VuICpnZW4sIGludCBtYXBfaWR4LCB2b2lkICp2YWx1ZSwgX191MzIgdmFsdWVfc2l6ZSwKJiM0MzsJCQkgICAgICBfX3U2NCBmbGFncyk7CiB2b2lkIGJwZl9nZW5fX21hcF9mcmVlemUoc3RydWN0IGJwZl9nZW4gKmdlbiwgaW50IG1hcF9pZHgpOwogdm9pZCBicGZfZ2VuX19yZWNvcmRfYXR0YWNoX3RhcmdldChzdHJ1Y3QgYnBmX2dlbiAqZ2VuLCBjb25zdCBjaGFyICpuYW1lLCBlbnVtIGJwZl9hdHRhY2hfdHlwZSB0eXBlKTsKIHZvaWQgYnBmX2dlbl9fcmVjb3JkX2V4dGVybihzdHJ1Y3QgYnBmX2dlbiAqZ2VuLCBjb25zdCBjaGFyICpuYW1lLCBib29sIGlzX3dlYWssCmRpZmYgLS1naXQgYS90b29scy9saWIvYnBmL2ZlYXR1cmVzLmMgYi90b29scy9saWIvYnBmL2ZlYXR1cmVzLmMKaW5kZXggYjdlMzg4Zjk5ZDBiYmQuLmVmOTU4MWMxMTMwMzU1IDEwMDY0NAotLS0gYS90b29scy9saWIvYnBmL2ZlYXR1cmVzLmMKJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvbGliL2JwZi9mZWF0dXJlcy5jCkBAIC02MjAsNiAmIzQzOzYyMCwzOCBAQCBzdGF0aWMgaW50IHByb2JlX2JwZl9zeXNjYWxsX2NvbW1vbl9hdHRycyhpbnQgdG9rZW5fZmQpCiAJcmV0dXJuIHByb2JlX3N5c19icGZfZXh0KCk7CiB9CiAKJiM0MztzdGF0aWMgaW50IHByb2JlX2tlcm5fcGVyY3B1X2RhdGEoaW50IHRva2VuX2ZkKQomIzQzO3sKJiM0MzsJc3RydWN0IGJwZl9pbnNuIGluc25zW10gPSB7CiYjNDM7CQlCUEZfTERfTUFQX1ZBTFVFKEJQRl9SRUdfMSwgMCwgMCksCiYjNDM7CQlCUEZfTERYX01FTShCUEZfRFcsIEJQRl9SRUdfMCwgQlBGX1JFR18xLCAwKSwKJiM0MzsJCUJQRl9FWElUX0lOU04oKSwKJiM0MzsJfTsKJiM0MzsJTElCQlBGX09QVFMoYnBmX21hcF9jcmVhdGVfb3B0cywgbWFwX29wdHMsCiYjNDM7CQkudG9rZW5fZmQgPSB0b2tlbl9mZCwKJiM0MzsJCS5tYXBfZmxhZ3MgPSB0b2tlbl9mZCA/IEJQRl9GX1RPS0VOX0ZEIDogMCwKJiM0MzsJKTsKJiM0MzsJTElCQlBGX09QVFMoYnBmX3Byb2dfbG9hZF9vcHRzLCBwcm9nX29wdHMsCiYjNDM7CQkudG9rZW5fZmQgPSB0b2tlbl9mZCwKJiM0MzsJCS5wcm9nX2ZsYWdzID0gdG9rZW5fZmQgPyBCUEZfRl9UT0tFTl9GRCA6IDAsCiYjNDM7CSk7CiYjNDM7CWludCByZXQsIG1hcCwgaW5zbl9jbnQgPSBBUlJBWV9TSVpFKGluc25zKTsKJiM0MzsKJiM0MzsJbWFwID0gYnBmX21hcF9jcmVhdGUoQlBGX01BUF9UWVBFX1BFUkNQVV9BUlJBWSwgJiMzNDtsaWJicGZfcGVyY3B1JiMzNDssIHNpemVvZihpbnQpLCA4LCAxLAomIzQzOwkJCSAgICAgJmFtcDttYXBfb3B0cyk7CiYjNDM7CWlmIChtYXAgJmx0OyAwKSB7CiYjNDM7CQlwcl93YXJuKCYjMzQ7RXJyb3IgaW4gJXMoKTogJXMuIENvdWxkbiYjMzk7dCBjcmVhdGUgc2ltcGxlIHBlcmNwdV9hcnJheSBtYXAuXG4mIzM0OywKJiM0MzsJCQlfX2Z1bmNfXywgZXJyc3RyKG1hcCkpOwomIzQzOwkJcmV0dXJuIG1hcDsKJiM0MzsJfQomIzQzOwomIzQzOwlpbnNuc1swXS5pbW0gPSBtYXA7CiYjNDM7CiYjNDM7CXJldCA9IGJwZl9wcm9nX2xvYWQoQlBGX1BST0dfVFlQRV9TT0NLRVRfRklMVEVSLCBOVUxMLCAmIzM0O0dQTCYjMzQ7LCBpbnNucywgaW5zbl9jbnQsICZhbXA7cHJvZ19vcHRzKTsKJiM0MzsJY2xvc2UobWFwKTsKJiM0MzsJcmV0dXJuIHByb2JlX2ZkKHJldCk7CiYjNDM7fQomIzQzOwogdHlwZWRlZiBpbnQgKCpmZWF0dXJlX3Byb2JlX2ZuKShpbnQgLyogdG9rZW5fZmQgKi8pOwogCiBzdGF0aWMgc3RydWN0IGtlcm5fZmVhdHVyZV9jYWNoZSBmZWF0dXJlX2NhY2hlOwpAQCAtNzA3LDYgJiM0Mzs3MzksOSBAQCBzdGF0aWMgc3RydWN0IGtlcm5fZmVhdHVyZV9kZXNjIHsKIAlbRkVBVF9CUEZfU1lTQ0FMTF9DT01NT05fQVRUUlNdID0gewogCQkmIzM0O0JQRiBzeXNjYWxsIGNvbW1vbiBhdHRyaWJ1dGVzIHN1cHBvcnQmIzM0OywgcHJvYmVfYnBmX3N5c2NhbGxfY29tbW9uX2F0dHJzLAogCX0sCiYjNDM7CVtGRUFUX1BFUkNQVV9EQVRBXSA9IHsKJiM0MzsJCSYjMzQ7a2VybmVsIHN1cHBvcnRzIHBlcmNwdSBkYXRhJiMzNDssIHByb2JlX2tlcm5fcGVyY3B1X2RhdGEsCiYjNDM7CX0sCiB9OwogCiBib29sIGZlYXRfc3VwcG9ydGVkKHN0cnVjdCBrZXJuX2ZlYXR1cmVfY2FjaGUgKmNhY2hlLCBlbnVtIGtlcm5fZmVhdHVyZV9pZCBmZWF0X2lkKQpkaWZmIC0tZ2l0IGEvdG9vbHMvbGliL2JwZi9nZW5fbG9hZGVyLmMgYi90b29scy9saWIvYnBmL2dlbl9sb2FkZXIuYwppbmRleCBjN2YyZDJhYzdiYjM1Zi4uNjBhMTIwNGU5YTI2M2MgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2xpYi9icGYvZ2VuX2xvYWRlci5jCiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL2xpYi9icGYvZ2VuX2xvYWRlci5jCkBAIC0xMTkwLDcgJiM0MzsxMTkwLDcgQEAgdm9pZCBicGZfZ2VuX19wcm9nX2xvYWQoc3RydWN0IGJwZl9nZW4gKmdlbiwKIH0KIAogdm9pZCBicGZfZ2VuX19tYXBfdXBkYXRlX2VsZW0oc3RydWN0IGJwZl9nZW4gKmdlbiwgaW50IG1hcF9pZHgsIHZvaWQgKnB2YWx1ZSwKLQkJCSAgICAgIF9fdTMyIHZhbHVlX3NpemUpCiYjNDM7CQkJICAgICAgX191MzIgdmFsdWVfc2l6ZSwgX191NjQgZmxhZ3MpCiB7CiAJaW50IGF0dHJfc2l6ZSA9IG9mZnNldG9mZW5kKHVuaW9uIGJwZl9hdHRyLCBmbGFncyk7CiAJaW50IG1hcF91cGRhdGVfYXR0ciwgdmFsdWUsIGtleTsKQEAgLTExOTgsNiAmIzQzOzExOTgsNyBAQCB2b2lkIGJwZl9nZW5fX21hcF91cGRhdGVfZWxlbShzdHJ1Y3QgYnBmX2dlbiAqZ2VuLCBpbnQgbWFwX2lkeCwgdm9pZCAqcHZhbHVlLAogCWludCB6ZXJvID0gMDsKIAogCW1lbXNldCgmYW1wO2F0dHIsIDAsIGF0dHJfc2l6ZSk7CiYjNDM7CWF0dHIuZmxhZ3MgPSB0Z3RfZW5kaWFuKGZsYWdzKTsKIAogCXZhbHVlID0gYWRkX2RhdGEoZ2VuLCBwdmFsdWUsIHZhbHVlX3NpemUpOwogCWtleSA9IGFkZF9kYXRhKGdlbiwgJmFtcDt6ZXJvLCBzaXplb2YoemVybykpOwpkaWZmIC0tZ2l0IGEvdG9vbHMvbGliL2JwZi9saWJicGYuYyBiL3Rvb2xzL2xpYi9icGYvbGliYnBmLmMKaW5kZXggNzE2MjE0NjI4MGE4MGUuLjZlMThhMTYyOGUxMzk2IDEwMDY0NAotLS0gYS90b29scy9saWIvYnBmL2xpYmJwZi5jCiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL2xpYi9icGYvbGliYnBmLmMKQEAgLTU0MSw2ICYjNDM7NTQxLDcgQEAgc3RydWN0IGJwZl9zdHJ1Y3Rfb3BzIHsKIH07CiAKICNkZWZpbmUgREFUQV9TRUMgJiMzNDsuZGF0YSYjMzQ7CiYjNDM7I2RlZmluZSBQRVJDUFVfU0VDICYjMzQ7LnBlcmNwdSYjMzQ7CiAjZGVmaW5lIEJTU19TRUMgJiMzNDsuYnNzJiMzNDsKICNkZWZpbmUgUk9EQVRBX1NFQyAmIzM0Oy5yb2RhdGEmIzM0OwogI2RlZmluZSBLQ09ORklHX1NFQyAmIzM0Oy5rY29uZmlnJiMzNDsKQEAgLTU1NSw2ICYjNDM7NTU2LDcgQEAgZW51bSBsaWJicGZfbWFwX3R5cGUgewogCUxJQkJQRl9NQVBfQlNTLAogCUxJQkJQRl9NQVBfUk9EQVRBLAogCUxJQkJQRl9NQVBfS0NPTkZJRywKJiM0MzsJTElCQlBGX01BUF9QRVJDUFUsCiB9OwogCiBzdHJ1Y3QgYnBmX21hcF9kZWYgewpAQCAtNjY2LDYgJiM0Mzs2NjgsNyBAQCBlbnVtIHNlY190eXBlIHsKIAlTRUNfREFUQSwKIAlTRUNfUk9EQVRBLAogCVNFQ19TVF9PUFMsCiYjNDM7CVNFQ19QRVJDUFUsCiB9OwogCiBzdHJ1Y3QgZWxmX3NlY19kZXNjIHsKQEAgLTE4MzksNiAmIzQzOzE4NDIsOCBAQCBzdGF0aWMgc2l6ZV90IGJwZl9tYXBfbW1hcF9zeihjb25zdCBzdHJ1Y3QgYnBmX21hcCAqbWFwKQogCXN3aXRjaCAobWFwLSZndDtkZWYudHlwZSkgewogCWNhc2UgQlBGX01BUF9UWVBFX0FSUkFZOgogCQlyZXR1cm4gYXJyYXlfbWFwX21tYXBfc3oobWFwLSZndDtkZWYudmFsdWVfc2l6ZSwgbWFwLSZndDtkZWYubWF4X2VudHJpZXMpOwomIzQzOwljYXNlIEJQRl9NQVBfVFlQRV9QRVJDUFVfQVJSQVk6CiYjNDM7CQlyZXR1cm4gbWFwLSZndDtkZWYudmFsdWVfc2l6ZTsKIAljYXNlIEJQRl9NQVBfVFlQRV9BUkVOQToKIAkJcmV0dXJuIHBhZ2Vfc3ogKiBtYXAtJmd0O2RlZi5tYXhfZW50cmllczsKIAlkZWZhdWx0OgpAQCAtMTkzOCw3ICYjNDM7MTk0Myw3IEBAIHN0YXRpYyBib29sIG1hcF9pc19tbWFwYWJsZShzdHJ1Y3QgYnBmX29iamVjdCAqb2JqLCBzdHJ1Y3QgYnBmX21hcCAqbWFwKQogCXN0cnVjdCBidGZfdmFyX3NlY2luZm8gKnZzaTsKIAlpbnQgaSwgbjsKIAotCWlmICghbWFwLSZndDtidGZfdmFsdWVfdHlwZV9pZCkKJiM0MzsJaWYgKCFtYXAtJmd0O2J0Zl92YWx1ZV90eXBlX2lkIHx8IG1hcC0mZ3Q7bGliYnBmX3R5cGUgPT0gTElCQlBGX01BUF9QRVJDUFUpCiAJCXJldHVybiBmYWxzZTsKIAogCXQgPSBidGZfX3R5cGVfYnlfaWQob2JqLSZndDtidGYsIG1hcC0mZ3Q7YnRmX3ZhbHVlX3R5cGVfaWQpOwpAQCAtMTk2Miw2ICYjNDM7MTk2Nyw3IEBAIHN0YXRpYyBpbnQKIGJwZl9vYmplY3RfX2luaXRfaW50ZXJuYWxfbWFwKHN0cnVjdCBicGZfb2JqZWN0ICpvYmosIGVudW0gbGliYnBmX21hcF90eXBlIHR5cGUsCiAJCQkgICAgICBjb25zdCBjaGFyICpyZWFsX25hbWUsIGludCBzZWNfaWR4LCB2b2lkICpkYXRhLCBzaXplX3QgZGF0YV9zeikKIHsKJiM0MzsJYm9vbCBpc19wZXJjcHUgPSB0eXBlID09IExJQkJQRl9NQVBfUEVSQ1BVOwogCXN0cnVjdCBicGZfbWFwX2RlZiAqZGVmOwogCXN0cnVjdCBicGZfbWFwICptYXA7CiAJc2l6ZV90IG1tYXBfc3o7CkBAIC0xOTc1LDcgJiM0MzsxOTgxLDcgQEAgYnBmX29iamVjdF9faW5pdF9pbnRlcm5hbF9tYXAoc3RydWN0IGJwZl9vYmplY3QgKm9iaiwgZW51bSBsaWJicGZfbWFwX3R5cGUgdHlwZSwKIAltYXAtJmd0O3NlY19pZHggPSBzZWNfaWR4OwogCW1hcC0mZ3Q7c2VjX29mZnNldCA9IDA7CiAJbWFwLSZndDtyZWFsX25hbWUgPSBzdHJkdXAocmVhbF9uYW1lKTsKLQltYXAtJmd0O25hbWUgPSBpbnRlcm5hbF9tYXBfbmFtZShvYmosIHJlYWxfbmFtZSk7CiYjNDM7CW1hcC0mZ3Q7bmFtZSA9IGlzX3BlcmNwdSA/IHN0cmR1cChyZWFsX25hbWUpIDogaW50ZXJuYWxfbWFwX25hbWUob2JqLCByZWFsX25hbWUpOwogCWlmICghbWFwLSZndDtyZWFsX25hbWUgfHwgIW1hcC0mZ3Q7bmFtZSkgewogCQl6ZnJlZSgmYW1wO21hcC0mZ3Q7cmVhbF9uYW1lKTsKIAkJemZyZWUoJmFtcDttYXAtJmd0O25hbWUpOwpAQCAtMTk4Myw3ICYjNDM7MTk4OSw3IEBAIGJwZl9vYmplY3RfX2luaXRfaW50ZXJuYWxfbWFwKHN0cnVjdCBicGZfb2JqZWN0ICpvYmosIGVudW0gbGliYnBmX21hcF90eXBlIHR5cGUsCiAJfQogCiAJZGVmID0gJmFtcDttYXAtJmd0O2RlZjsKLQlkZWYtJmd0O3R5cGUgPSBCUEZfTUFQX1RZUEVfQVJSQVk7CiYjNDM7CWRlZi0mZ3Q7dHlwZSA9IGlzX3BlcmNwdSA/IEJQRl9NQVBfVFlQRV9QRVJDUFVfQVJSQVkgOiBCUEZfTUFQX1RZUEVfQVJSQVk7CiAJZGVmLSZndDtrZXlfc2l6ZSA9IHNpemVvZihpbnQpOwogCWRlZi0mZ3Q7dmFsdWVfc2l6ZSA9IGRhdGFfc3o7CiAJZGVmLSZndDttYXhfZW50cmllcyA9IDE7CkBAIC0xOTk2LDggJiM0MzsyMDAyLDkgQEAgYnBmX29iamVjdF9faW5pdF9pbnRlcm5hbF9tYXAoc3RydWN0IGJwZl9vYmplY3QgKm9iaiwgZW51bSBsaWJicGZfbWFwX3R5cGUgdHlwZSwKIAlpZiAobWFwX2lzX21tYXBhYmxlKG9iaiwgbWFwKSkKIAkJZGVmLSZndDttYXBfZmxhZ3MgfD0gQlBGX0ZfTU1BUEFCTEU7CiAKLQlwcl9kZWJ1ZygmIzM0O21hcCAmIzM5OyVzJiMzOTsgKGdsb2JhbCBkYXRhKTogYXQgc2VjX2lkeCAlZCwgb2Zmc2V0ICV6dSwgZmxhZ3MgJXguXG4mIzM0OywKLQkJIG1hcC0mZ3Q7bmFtZSwgbWFwLSZndDtzZWNfaWR4LCBtYXAtJmd0O3NlY19vZmZzZXQsIGRlZi0mZ3Q7bWFwX2ZsYWdzKTsKJiM0MzsJcHJfZGVidWcoJiMzNDttYXAgJiMzOTslcyYjMzk7IChnbG9iYWwgJXNkYXRhKTogYXQgc2VjX2lkeCAlZCwgb2Zmc2V0ICV6dSwgZmxhZ3MgJXguXG4mIzM0OywKJiM0MzsJCSBtYXAtJmd0O25hbWUsIGlzX3BlcmNwdSA/ICYjMzQ7cGVyY3B1ICYjMzQ7IDogJiMzNDsmIzM0OywgbWFwLSZndDtzZWNfaWR4LAomIzQzOwkJIG1hcC0mZ3Q7c2VjX29mZnNldCwgZGVmLSZndDttYXBfZmxhZ3MpOwogCiAJbW1hcF9zeiA9IGJwZl9tYXBfbW1hcF9zeihtYXApOwogCW1hcC0mZ3Q7bW1hcGVkID0gbW1hcChOVUxMLCBtbWFwX3N6LCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLApAQCAtMjA1Nyw2ICYjNDM7MjA2NCwxMyBAQCBzdGF0aWMgaW50IGJwZl9vYmplY3RfX2luaXRfZ2xvYmFsX2RhdGFfbWFwcyhzdHJ1Y3QgYnBmX29iamVjdCAqb2JqKQogCQkJCQkJCSAgICBOVUxMLAogCQkJCQkJCSAgICBzZWNfZGVzYy0mZ3Q7ZGF0YS0mZ3Q7ZF9zaXplKTsKIAkJCWJyZWFrOwomIzQzOwkJY2FzZSBTRUNfUEVSQ1BVOgomIzQzOwkJCXNlY19uYW1lID0gZWxmX3NlY19uYW1lKG9iaiwgZWxmX3NlY19ieV9pZHgob2JqLCBzZWNfaWR4KSk7CiYjNDM7CQkJZXJyID0gYnBmX29iamVjdF9faW5pdF9pbnRlcm5hbF9tYXAob2JqLCBMSUJCUEZfTUFQX1BFUkNQVSwKJiM0MzsJCQkJCQkJICAgIHNlY19uYW1lLCBzZWNfaWR4LAomIzQzOwkJCQkJCQkgICAgc2VjX2Rlc2MtJmd0O2RhdGEtJmd0O2RfYnVmLAomIzQzOwkJCQkJCQkgICAgc2VjX2Rlc2MtJmd0O2RhdGEtJmd0O2Rfc2l6ZSk7CiYjNDM7CQkJYnJlYWs7CiAJCWRlZmF1bHQ6CiAJCQkvKiBza2lwICovCiAJCQlicmVhazsKQEAgLTQwMTYsNiAmIzQzOzQwMzAsMTEgQEAgc3RhdGljIGludCBicGZfb2JqZWN0X19lbGZfY29sbGVjdChzdHJ1Y3QgYnBmX29iamVjdCAqb2JqKQogCQkJCXNlY19kZXNjLSZndDtzZWNfdHlwZSA9IFNFQ19ST0RBVEE7CiAJCQkJc2VjX2Rlc2MtJmd0O3NoZHIgPSBzaDsKIAkJCQlzZWNfZGVzYy0mZ3Q7ZGF0YSA9IGRhdGE7CiYjNDM7CQkJfSBlbHNlIGlmIChzdHJjbXAobmFtZSwgUEVSQ1BVX1NFQykgPT0gMCB8fAomIzQzOwkJCQkgICBzdHJfaGFzX3BmeChuYW1lLCBQRVJDUFVfU0VDICYjMzQ7LiYjMzQ7KSkgewomIzQzOwkJCQlzZWNfZGVzYy0mZ3Q7c2VjX3R5cGUgPSBTRUNfUEVSQ1BVOwomIzQzOwkJCQlzZWNfZGVzYy0mZ3Q7c2hkciA9IHNoOwomIzQzOwkJCQlzZWNfZGVzYy0mZ3Q7ZGF0YSA9IGRhdGE7CiAJCQl9IGVsc2UgaWYgKHN0cmNtcChuYW1lLCBTVFJVQ1RfT1BTX1NFQykgPT0gMCB8fAogCQkJCSAgIHN0cmNtcChuYW1lLCBTVFJVQ1RfT1BTX0xJTktfU0VDKSA9PSAwIHx8CiAJCQkJICAgc3RyY21wKG5hbWUsICYjMzQ7PyYjMzQ7IFNUUlVDVF9PUFNfU0VDKSA9PSAwIHx8CkBAIC00NTQ0LDYgJiM0Mzs0NTYzLDcgQEAgc3RhdGljIGJvb2wgYnBmX29iamVjdF9fc2huZHhfaXNfZGF0YShjb25zdCBzdHJ1Y3QgYnBmX29iamVjdCAqb2JqLAogCWNhc2UgU0VDX0JTUzoKIAljYXNlIFNFQ19EQVRBOgogCWNhc2UgU0VDX1JPREFUQToKJiM0MzsJY2FzZSBTRUNfUEVSQ1BVOgogCQlyZXR1cm4gdHJ1ZTsKIAlkZWZhdWx0OgogCQlyZXR1cm4gZmFsc2U7CkBAIC00NTY5LDYgJiM0Mzs0NTg5LDggQEAgYnBmX29iamVjdF9fc2VjdGlvbl90b19saWJicGZfbWFwX3R5cGUoY29uc3Qgc3RydWN0IGJwZl9vYmplY3QgKm9iaiwgaW50IHNobmR4KQogCQlyZXR1cm4gTElCQlBGX01BUF9EQVRBOwogCWNhc2UgU0VDX1JPREFUQToKIAkJcmV0dXJuIExJQkJQRl9NQVBfUk9EQVRBOwomIzQzOwljYXNlIFNFQ19QRVJDUFU6CiYjNDM7CQlyZXR1cm4gTElCQlBGX01BUF9QRVJDUFU7CiAJZGVmYXVsdDoKIAkJcmV0dXJuIExJQkJQRl9NQVBfVU5TUEVDOwogCX0KQEAgLTQ5NDQsNyAmIzQzOzQ5NjYsNyBAQCBzdGF0aWMgaW50IG1hcF9maWxsX2J0Zl90eXBlX2luZm8oc3RydWN0IGJwZl9vYmplY3QgKm9iaiwgc3RydWN0IGJwZl9tYXAgKm1hcCkKIAogCS8qCiAJICogTExWTSBhbm5vdGF0ZXMgZ2xvYmFsIGRhdGEgZGlmZmVyZW50bHkgaW4gQlRGLCB0aGF0IGlzLAotCSAqIG9ubHkgYXMgJiMzOTsuZGF0YSYjMzk7LCAmIzM5Oy5ic3MmIzM5OyBvciAmIzM5Oy5yb2RhdGEmIzM5Oy4KJiM0MzsJICogb25seSBhcyAmIzM5Oy5kYXRhJiMzOTssICYjMzk7LmJzcyYjMzk7LCAmIzM5Oy5wZXJjcHUmIzM5OyBvciAmIzM5Oy5yb2RhdGEmIzM5Oy4KIAkgKi8KIAlpZiAoIWJwZl9tYXBfX2lzX2ludGVybmFsKG1hcCkpCiAJCXJldHVybiAtRU5PRU5UOwpAQCAtNTI5NywxOCAmIzQzOzUzMTksMzAgQEAgc3RhdGljIGludAogYnBmX29iamVjdF9fcG9wdWxhdGVfaW50ZXJuYWxfbWFwKHN0cnVjdCBicGZfb2JqZWN0ICpvYmosIHN0cnVjdCBicGZfbWFwICptYXApCiB7CiAJZW51bSBsaWJicGZfbWFwX3R5cGUgbWFwX3R5cGUgPSBtYXAtJmd0O2xpYmJwZl90eXBlOwomIzQzOwlib29sIGlzX3BlcmNwdSA9IG1hcF90eXBlID09IExJQkJQRl9NQVBfUEVSQ1BVOwomIzQzOwlfX3U2NCB1cGRhdGVfZmxhZ3MgPSAwOwogCWludCBlcnIsIHplcm8gPSAwOwogCXNpemVfdCBtbWFwX3N6OwogCiYjNDM7CWlmIChpc19wZXJjcHUpIHsKJiM0MzsJCWlmICghb2JqLSZndDtnZW5fbG9hZGVyICZhbXA7JmFtcDsgIWtlcm5lbF9zdXBwb3J0cyhvYmosIEZFQVRfUEVSQ1BVX0RBVEEpKSB7CiYjNDM7CQkJcHJfd2FybigmIzM0O21hcCAmIzM5OyVzJiMzOTs6IGtlcm5lbCBkb2VzIG5vdCBzdXBwb3J0IHBlcmNwdSBkYXRhLlxuJiMzNDssCiYjNDM7CQkJCWJwZl9tYXBfX25hbWUobWFwKSk7CiYjNDM7CQkJcmV0dXJuIC1FT1BOT1RTVVBQOwomIzQzOwkJfQomIzQzOwomIzQzOwkJdXBkYXRlX2ZsYWdzID0gQlBGX0ZfQUxMX0NQVVM7CiYjNDM7CX0KJiM0MzsKIAlpZiAob2JqLSZndDtnZW5fbG9hZGVyKSB7CiAJCWJwZl9nZW5fX21hcF91cGRhdGVfZWxlbShvYmotJmd0O2dlbl9sb2FkZXIsIG1hcCAtIG9iai0mZ3Q7bWFwcywKLQkJCQkJIG1hcC0mZ3Q7bW1hcGVkLCBtYXAtJmd0O2RlZi52YWx1ZV9zaXplKTsKJiM0MzsJCQkJCSBtYXAtJmd0O21tYXBlZCwgbWFwLSZndDtkZWYudmFsdWVfc2l6ZSwgdXBkYXRlX2ZsYWdzKTsKIAkJaWYgKG1hcF90eXBlID09IExJQkJQRl9NQVBfUk9EQVRBIHx8IG1hcF90eXBlID09IExJQkJQRl9NQVBfS0NPTkZJRykKIAkJCWJwZl9nZW5fX21hcF9mcmVlemUob2JqLSZndDtnZW5fbG9hZGVyLCBtYXAgLSBvYmotJmd0O21hcHMpOwogCQlyZXR1cm4gMDsKIAl9CiAKLQllcnIgPSBicGZfbWFwX3VwZGF0ZV9lbGVtKG1hcC0mZ3Q7ZmQsICZhbXA7emVybywgbWFwLSZndDttbWFwZWQsIDApOwomIzQzOwllcnIgPSBicGZfbWFwX3VwZGF0ZV9lbGVtKG1hcC0mZ3Q7ZmQsICZhbXA7emVybywgbWFwLSZndDttbWFwZWQsIHVwZGF0ZV9mbGFncyk7CiAJaWYgKGVycikgewogCQllcnIgPSAtZXJybm87CiAJCXByX3dhcm4oJiMzNDttYXAgJiMzOTslcyYjMzk7OiBmYWlsZWQgdG8gc2V0IGluaXRpYWwgY29udGVudHM6ICVzXG4mIzM0OywKQEAgLTUzNTMsNiAmIzQzOzUzODcsMTMgQEAgYnBmX29iamVjdF9fcG9wdWxhdGVfaW50ZXJuYWxfbWFwKHN0cnVjdCBicGZfb2JqZWN0ICpvYmosIHN0cnVjdCBicGZfbWFwICptYXApCiAJCQlyZXR1cm4gZXJyOwogCQl9CiAJCW1hcC0mZ3Q7bW1hcGVkID0gbW1hcGVkOwomIzQzOwl9IGVsc2UgaWYgKGlzX3BlcmNwdSkgewomIzQzOwkJaWYgKG1wcm90ZWN0KG1hcC0mZ3Q7bW1hcGVkLCBtbWFwX3N6LCBQUk9UX1JFQUQpKSB7CiYjNDM7CQkJZXJyID0gLWVycm5vOwomIzQzOwkJCXByX3dhcm4oJiMzNDttYXAgJiMzOTslcyYjMzk7OiBmYWlsZWQgdG8gbXByb3RlY3QoKSBjb250ZW50czogJXNcbiYjMzQ7LAomIzQzOwkJCQlicGZfbWFwX19uYW1lKG1hcCksIGVycnN0cihlcnIpKTsKJiM0MzsJCQlyZXR1cm4gZXJyOwomIzQzOwkJfQogCX0gZWxzZSBpZiAobWFwLSZndDttbWFwZWQpIHsKIAkJbXVubWFwKG1hcC0mZ3Q7bW1hcGVkLCBtbWFwX3N6KTsKIAkJbWFwLSZndDttbWFwZWQgPSBOVUxMOwpkaWZmIC0tZ2l0IGEvdG9vbHMvbGliL2JwZi9saWJicGZfaW50ZXJuYWwuaCBiL3Rvb2xzL2xpYi9icGYvbGliYnBmX2ludGVybmFsLmgKaW5kZXggMDRjZDMwM2ZiNWE4NzkuLjQ3YWUzOTEyNWY2OGY5IDEwMDY0NAotLS0gYS90b29scy9saWIvYnBmL2xpYmJwZl9pbnRlcm5hbC5oCiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL2xpYi9icGYvbGliYnBmX2ludGVybmFsLmgKQEAgLTQwMSw2ICYjNDM7NDAxLDggQEAgZW51bSBrZXJuX2ZlYXR1cmVfaWQgewogCUZFQVRfQlRGX0xBWU9VVCwKIAkvKiBLZXJuZWwgc3VwcG9ydHMgQlBGIHN5c2NhbGwgY29tbW9uIGF0dHJpYnV0ZXMgKi8KIAlGRUFUX0JQRl9TWVNDQUxMX0NPTU1PTl9BVFRSUywKJiM0MzsJLyogS2VybmVsIHN1cHBvcnRzIHBlcmNwdSBkYXRhICovCiYjNDM7CUZFQVRfUEVSQ1BVX0RBVEEsCiAJX19GRUFUX0NOVCwKIH07CiAKZGlmZiAtLWdpdCBhL3Rvb2xzL2xpYi9icGYvc2tlbF9pbnRlcm5hbC5oIGIvdG9vbHMvbGliL2JwZi9za2VsX2ludGVybmFsLmgKaW5kZXggNzQ1MDNkMzU4YmM4YTUuLjQ4NWIwY2QxNzAxNzM5IDEwMDY0NAotLS0gYS90b29scy9saWIvYnBmL3NrZWxfaW50ZXJuYWwuaAomIzQzOyYjNDM7JiM0MzsgYi90b29scy9saWIvYnBmL3NrZWxfaW50ZXJuYWwuaApAQCAtMTM1LDggJiM0MzsxMzUsMTAgQEAgc3RhdGljIGlubGluZSB2b2lkIHNrZWxfZnJlZV9tYXBfZGF0YSh2b2lkICpwLCBfX3U2NCBhZGRyLCBzaXplX3Qgc3opCiB7CiAJaWYgKGFkZHIgIT0gfjBVTEwpCiAJCWt2ZnJlZShwKTsKLQkvKiBXaGVuIGFkZHIgPT0gfjBVTEwgdGhlICYjMzk7cCYjMzk7IHBvaW50cyB0bwotCSAqICgoc3RydWN0IGJwZl9hcnJheSAqKW1hcCktJmd0O3ZhbHVlLiBTZWUgc2tlbF9maW5hbGl6ZV9tYXBfZGF0YS4KJiM0MzsJLyoKJiM0MzsJICogV2hlbiBhZGRyID09IH4wVUxMIHRoZSBpbml0IGJ1ZmZlciBoYXMgYWxyZWFkeSBiZWVuIHJlbGVhc2VkLgomIzQzOwkgKiBGb3Igc2tlbF9maW5hbGl6ZV9tYXBfZGF0YSgpLCAmIzM5O3AmIzM5OyBwb2ludHMgdG8KJiM0MzsJICogKChzdHJ1Y3QgYnBmX2FycmF5ICopbWFwKS0mZ3Q7dmFsdWUuCiAJICovCiB9CiAKQEAgLTE3NCw2ICYjNDM7MTc2LDE1IEBAIHN0YXRpYyBpbmxpbmUgdm9pZCAqc2tlbF9maW5hbGl6ZV9tYXBfZGF0YShfX3U2NCAqaW5pdF92YWwsIHNpemVfdCBtbWFwX3N6LCBpbnQKIAlyZXR1cm4gYWRkcjsKIH0KIAomIzQzO3N0YXRpYyBpbmxpbmUgaW50IHNrZWxfcHJvdGVjdF9tYXBfZGF0YSh2b2lkICpwLCBfX3U2NCAqaW5pdF92YWwsIHNpemVfdCBzeikKJiM0Mzt7CiYjNDM7CSh2b2lkKXN6OwomIzQzOwomIzQzOwlrdmZyZWUocCk7CiYjNDM7CSppbml0X3ZhbCA9IH4wVUxMOwomIzQzOwlyZXR1cm4gMDsKJiM0Mzt9CiYjNDM7CiAjZWxzZQogCiBzdGF0aWMgaW5saW5lIHZvaWQgKnNrZWxfYWxsb2Moc2l6ZV90IHNpemUpCkBAIC0yMTIsNiAmIzQzOzIyMywxNSBAQCBzdGF0aWMgaW5saW5lIHZvaWQgKnNrZWxfZmluYWxpemVfbWFwX2RhdGEoX191NjQgKmluaXRfdmFsLCBzaXplX3QgbW1hcF9zeiwgaW50CiAJCXJldHVybiBOVUxMOwogCXJldHVybiBhZGRyOwogfQomIzQzOwomIzQzO3N0YXRpYyBpbmxpbmUgaW50IHNrZWxfcHJvdGVjdF9tYXBfZGF0YSh2b2lkICpwLCBfX3U2NCAqaW5pdF92YWwsIHNpemVfdCBzeikKJiM0Mzt7CiYjNDM7CSh2b2lkKWluaXRfdmFsOwomIzQzOwomIzQzOwlpZiAobXByb3RlY3QocCwgc3osIFBST1RfUkVBRCkpCiYjNDM7CQlyZXR1cm4gLWVycm5vOwomIzQzOwlyZXR1cm4gMDsKJiM0Mzt9CiAjZW5kaWYKIAogc3RhdGljIGlubGluZSBpbnQgc2tlbF9jbG9zZW56KGludCBmZCkKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9NYWtlZmlsZSBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9NYWtlZmlsZQppbmRleCBiNjQyZWU0ODllYTY0MC4uYzM3ZWQ5ZTdiOTdjZDAgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9NYWtlZmlsZQomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvTWFrZWZpbGUKQEAgLTUzMyw3ICYjNDM7NTMzLDcgQEAgTFNLRUxTX1NJR05FRCA6PSBmZW50cnlfdGVzdC5jIGZleGl0X3Rlc3QuYyBhdG9taWNzLmMKIAogIyBHZW5lcmF0ZSBib3RoIGxpZ2h0IHNrZWxldG9uIGFuZCBsaWJicGYgc2tlbGV0b24gZm9yIHRoZXNlCiBMU0tFTFNfRVhUUkEgOj0gdGVzdF9rc3ltc19tb2R1bGUuYyB0ZXN0X2tzeW1zX3dlYWsuYyBrZnVuY19jYWxsX3Rlc3QuYyBcCi0Ja2Z1bmNfY2FsbF90ZXN0X3N1YnByb2cuYwomIzQzOwlrZnVuY19jYWxsX3Rlc3Rfc3VicHJvZy5jIHRlc3RfZ2xvYmFsX3BlcmNwdV9kYXRhLmMKIFNLRUxfQkxBQ0tMSVNUICYjNDM7PSAkJChMU0tFTFMpICQkKExTS0VMU19TSUdORUQpCiAKIHRlc3Rfc3RhdGljX2xpbmtlZC5za2VsLmgtZGVwcyA6PSB0ZXN0X3N0YXRpY19saW5rZWQxLmJwZi5vIHRlc3Rfc3RhdGljX2xpbmtlZDIuYnBmLm8KZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2dsb2JhbF9kYXRhX2luaXQuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2dsb2JhbF9kYXRhX2luaXQuYwppbmRleCA4NDY2MzMyZDc0MDZmNC4uYTVkODc3NjhmNmVlMmYgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2dsb2JhbF9kYXRhX2luaXQuYwomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9nbG9iYWxfZGF0YV9pbml0LmMKQEAgLTEsNSAmIzQzOzEsOCBAQAogLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAKICNpbmNsdWRlICZsdDt0ZXN0X3Byb2dzLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJiMzNDticGYvbGliYnBmX2ludGVybmFsLmgmIzM0OwomIzQzOyNpbmNsdWRlICYjMzQ7dGVzdF9nbG9iYWxfcGVyY3B1X2RhdGEuc2tlbC5oJiMzNDsKJiM0MzsjaW5jbHVkZSAmIzM0O3Rlc3RfZ2xvYmFsX3BlcmNwdV9kYXRhLmxza2VsLmgmIzM0OwogCiB2b2lkIHRlc3RfZ2xvYmFsX2RhdGFfaW5pdCh2b2lkKQogewpAQCAtNjAsMyAmIzQzOzYzLDI5MCBAQCB2b2lkIHRlc3RfZ2xvYmFsX2RhdGFfaW5pdCh2b2lkKQogCWZyZWUobmV3dmFsKTsKIAlicGZfb2JqZWN0X19jbG9zZShvYmopOwogfQomIzQzOwomIzQzO3N0YXRpYyB2b2lkIHRlc3RfcGVyY3B1X2RhdGFfb25fY3B1cyhpbnQgbWFwX2ZkLCBpbnQgcHJvZ19mZCwgaW50IG51bV9vbmxpbmUsIGJvb2wgKm9ubGluZSkKJiM0Mzt7CiYjNDM7CV9fdTY0IGFyZ3NbMl0gPSB7MHgxMjM0VUxMLCAweDU2NzhVTEx9OwomIzQzOwlMSUJCUEZfT1BUUyhicGZfdGVzdF9ydW5fb3B0cywgdG9wdHMsCiYjNDM7CQkgICAgLmN0eF9pbiA9IGFyZ3MsCiYjNDM7CQkgICAgLmN0eF9zaXplX2luID0gc2l6ZW9mKGFyZ3MpLAomIzQzOwkJICAgIC5mbGFncyA9IEJQRl9GX1RFU1RfUlVOX09OX0NQVSwKJiM0MzsJKTsKJiM0MzsJaW50IGksIGVyciwga2V5ID0gMDsKJiM0MzsKJiM0MzsJLyogcnVuIG9uIGV2ZXJ5IG9ubGluZS1DUFUgKi8KJiM0MzsJZm9yIChpID0gMDsgaSAmbHQ7IG51bV9vbmxpbmU7IGkmIzQzOyYjNDM7KSB7CiYjNDM7CQlzdHJ1Y3QgdGVzdF9nbG9iYWxfcGVyY3B1X2RhdGFfX3BlcmNwdSBkYXRhID0ge307CiYjNDM7CQlfX3U2NCBmbGFnczsKJiM0MzsKJiM0MzsJCWlmICghb25saW5lW2ldKQomIzQzOwkJCWNvbnRpbnVlOwomIzQzOwomIzQzOwkJdG9wdHMuY3B1ID0gaTsKJiM0MzsJCXRvcHRzLnJldHZhbCA9IC0xOwomIzQzOwkJZXJyID0gYnBmX3Byb2dfdGVzdF9ydW5fb3B0cyhwcm9nX2ZkLCAmYW1wO3RvcHRzKTsKJiM0MzsJCUFTU0VSVF9PSyhlcnIsICYjMzQ7YnBmX3Byb2dfdGVzdF9ydW5fb3B0cyYjMzQ7KTsKJiM0MzsJCUFTU0VSVF9FUSh0b3B0cy5yZXR2YWwsIDAsICYjMzQ7YnBmX3Byb2dfdGVzdF9ydW5fb3B0cyByZXR2YWwmIzM0Oyk7CiYjNDM7CiYjNDM7CQlmbGFncyA9ICgoX191NjQpIGkgJmx0OyZsdDsgMzIpIHwgQlBGX0ZfQ1BVOwomIzQzOwkJZXJyID0gYnBmX21hcF9sb29rdXBfZWxlbV9mbGFncyhtYXBfZmQsICZhbXA7a2V5LCAmYW1wO2RhdGEsIGZsYWdzKTsKJiM0MzsJCWlmICghQVNTRVJUX09LKGVyciwgJiMzNDticGZfbWFwX2xvb2t1cF9lbGVtX2ZsYWdzJiMzNDspKQomIzQzOwkJCXJldHVybjsKJiM0MzsKJiM0MzsJCUFTU0VSVF9FUShkYXRhLmRhdGEsIDEsICYjMzQ7ZGF0YS5kYXRhJiMzNDspOwomIzQzOwkJQVNTRVJUX1RSVUUoZGF0YS5ydW4sICYjMzQ7ZGF0YS5ydW4mIzM0Oyk7CiYjNDM7CQlBU1NFUlRfRVEoZGF0YS5udW1zWzZdLCAweGMwZGUsICYjMzQ7ZGF0YS5udW1zWzZdJiMzNDspOwomIzQzOwkJQVNTRVJUX0VRKGRhdGEuc3RydWN0X2RhdGEuaSwgMSwgJiMzNDtzdHJ1Y3RfZGF0YS5pJiMzNDspOwomIzQzOwkJQVNTRVJUX1RSVUUoZGF0YS5zdHJ1Y3RfZGF0YS5zZXQsICYjMzQ7c3RydWN0X2RhdGEuc2V0JiMzNDspOwomIzQzOwkJQVNTRVJUX0VRKGRhdGEuc3RydWN0X2RhdGEubnVtc1s2XSwgMHhjMGRlLCAmIzM0O3N0cnVjdF9kYXRhLm51bXNbNl0mIzM0Oyk7CiYjNDM7CX0KJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgdGVzdF9nbG9iYWxfcGVyY3B1X2RhdGFfaW5pdCh2b2lkKQomIzQzO3sKJiM0MzsJc3RydWN0IHRlc3RfZ2xvYmFsX3BlcmNwdV9kYXRhX19wZXJjcHUgaW5pdF92YWx1ZSA9IHt9OwomIzQzOwlzdHJ1Y3QgdGVzdF9nbG9iYWxfcGVyY3B1X2RhdGFfX3BlcmNwdSAqaW5pdF9kYXRhOwomIzQzOwlzdHJ1Y3QgdGVzdF9nbG9iYWxfcGVyY3B1X2RhdGEgKnNrZWwgPSBOVUxMOwomIzQzOwlpbnQgcHJvZ19mZCwgbWFwX2ZkLCBlcnIsIG51bV9vbmxpbmU7CiYjNDM7CXNpemVfdCBpbml0X2RhdGFfc3o7CiYjNDM7CXN0cnVjdCBicGZfbWFwICptYXA7CiYjNDM7CWJvb2wgKm9ubGluZTsKJiM0MzsKJiM0MzsJZXJyID0gcGFyc2VfY3B1X21hc2tfZmlsZSgmIzM0Oy9zeXMvZGV2aWNlcy9zeXN0ZW0vY3B1L29ubGluZSYjMzQ7LCAmYW1wO29ubGluZSwgJmFtcDtudW1fb25saW5lKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0soZXJyLCAmIzM0O3BhcnNlX2NwdV9tYXNrX2ZpbGUmIzM0OykpCiYjNDM7CQlyZXR1cm47CiYjNDM7CiYjNDM7CXNrZWwgPSB0ZXN0X2dsb2JhbF9wZXJjcHVfZGF0YV9fb3BlbigpOwomIzQzOwlpZiAoIUFTU0VSVF9PS19QVFIoc2tlbCwgJiMzNDt0ZXN0X2dsb2JhbF9wZXJjcHVfZGF0YV9fb3BlbiYjMzQ7KSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwlpZiAoIUFTU0VSVF9PS19QVFIoc2tlbC0mZ3Q7cGVyY3B1LCAmIzM0O3NrZWwtJmd0O3BlcmNwdSYjMzQ7KSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwomIzQzOwlBU1NFUlRfRVEoc2tlbC0mZ3Q7cGVyY3B1LSZndDtkYXRhLCAtMSwgJiMzNDtza2VsLSZndDtwZXJjcHUtJmd0O2RhdGEmIzM0Oyk7CiYjNDM7CUFTU0VSVF9GQUxTRShza2VsLSZndDtwZXJjcHUtJmd0O3J1biwgJiMzNDtza2VsLSZndDtwZXJjcHUtJmd0O3J1biYjMzQ7KTsKJiM0MzsJQVNTRVJUX0VRKHNrZWwtJmd0O3BlcmNwdS0mZ3Q7bnVtc1s2XSwgMCwgJiMzNDtza2VsLSZndDtwZXJjcHUtJmd0O251bXNbNl0mIzM0Oyk7CiYjNDM7CUFTU0VSVF9FUShza2VsLSZndDtwZXJjcHUtJmd0O3N0cnVjdF9kYXRhLmksIC0xLCAmIzM0O3N0cnVjdF9kYXRhLmkmIzM0Oyk7CiYjNDM7CUFTU0VSVF9GQUxTRShza2VsLSZndDtwZXJjcHUtJmd0O3N0cnVjdF9kYXRhLnNldCwgJiMzNDtzdHJ1Y3RfZGF0YS5zZXQmIzM0Oyk7CiYjNDM7CUFTU0VSVF9FUShza2VsLSZndDtwZXJjcHUtJmd0O3N0cnVjdF9kYXRhLm51bXNbNl0sIDAsICYjMzQ7c3RydWN0X2RhdGEubnVtc1s2XSYjMzQ7KTsKJiM0MzsKJiM0MzsJbWFwID0gc2tlbC0mZ3Q7bWFwcy5wZXJjcHU7CiYjNDM7CWlmICghQVNTRVJUX0VRKGJwZl9tYXBfX3R5cGUobWFwKSwgQlBGX01BUF9UWVBFX1BFUkNQVV9BUlJBWSwgJiMzNDticGZfbWFwX190eXBlJiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CiYjNDM7CWluaXRfdmFsdWUuZGF0YSA9IDI7CiYjNDM7CWluaXRfdmFsdWUubnVtc1s2XSA9IC0xOwomIzQzOwlpbml0X3ZhbHVlLnN0cnVjdF9kYXRhLmkgPSAyOwomIzQzOwlpbml0X3ZhbHVlLnN0cnVjdF9kYXRhLm51bXNbNl0gPSAtMTsKJiM0MzsJZXJyID0gYnBmX21hcF9fc2V0X2luaXRpYWxfdmFsdWUobWFwLCAmYW1wO2luaXRfdmFsdWUsIHNpemVvZihpbml0X3ZhbHVlKSk7CiYjNDM7CWlmICghQVNTRVJUX09LKGVyciwgJiMzNDticGZfbWFwX19zZXRfaW5pdGlhbF92YWx1ZSYjMzQ7KSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwomIzQzOwlpbml0X2RhdGEgPSBicGZfbWFwX19pbml0aWFsX3ZhbHVlKG1hcCwgJmFtcDtpbml0X2RhdGFfc3opOwomIzQzOwlpZiAoIUFTU0VSVF9PS19QVFIoaW5pdF9kYXRhLCAmIzM0O2JwZl9tYXBfX2luaXRpYWxfdmFsdWUmIzM0OykpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsKJiM0MzsJQVNTRVJUX0VRKGluaXRfZGF0YS0mZ3Q7ZGF0YSwgaW5pdF92YWx1ZS5kYXRhLCAmIzM0O2luaXRfdmFsdWUgZGF0YSYjMzQ7KTsKJiM0MzsJQVNTRVJUX0VRKGluaXRfZGF0YS0mZ3Q7cnVuLCBpbml0X3ZhbHVlLnJ1biwgJiMzNDtpbml0X3ZhbHVlIHJ1biYjMzQ7KTsKJiM0MzsJQVNTRVJUX0VRKGluaXRfZGF0YS0mZ3Q7c3RydWN0X2RhdGEuaSwgaW5pdF92YWx1ZS5zdHJ1Y3RfZGF0YS5pLCAmIzM0O2luaXRfdmFsdWUgc3RydWN0X2RhdGEuaSYjMzQ7KTsKJiM0MzsJQVNTRVJUX0VRKGluaXRfZGF0YS0mZ3Q7c3RydWN0X2RhdGEubnVtc1s2XSwgaW5pdF92YWx1ZS5zdHJ1Y3RfZGF0YS5udW1zWzZdLAomIzQzOwkJICAmIzM0O2luaXRfdmFsdWUgc3RydWN0X2RhdGEubnVtc1s2XSYjMzQ7KTsKJiM0MzsJQVNTRVJUX0VRKGluaXRfZGF0YV9zeiwgc2l6ZW9mKGluaXRfdmFsdWUpLCAmIzM0O2luaXRfdmFsdWUgc2l6ZSYjMzQ7KTsKJiM0MzsJQVNTRVJUX0VRKCh2b2lkICopIGluaXRfZGF0YSwgKHZvaWQgKikgc2tlbC0mZ3Q7cGVyY3B1LCAmIzM0O3NrZWwtJmd0O3BlcmNwdSBlcSBpbml0X2RhdGEmIzM0Oyk7CiYjNDM7CUFTU0VSVF9FUShza2VsLSZndDtwZXJjcHUtJmd0O2RhdGEsIGluaXRfdmFsdWUuZGF0YSwgJiMzNDtza2VsLSZndDtwZXJjcHUtJmd0O2RhdGEmIzM0Oyk7CiYjNDM7CUFTU0VSVF9FUShza2VsLSZndDtwZXJjcHUtJmd0O3J1biwgaW5pdF92YWx1ZS5ydW4sICYjMzQ7c2tlbC0mZ3Q7cGVyY3B1LSZndDtydW4mIzM0Oyk7CiYjNDM7CUFTU0VSVF9FUShza2VsLSZndDtwZXJjcHUtJmd0O3N0cnVjdF9kYXRhLmksIGluaXRfdmFsdWUuc3RydWN0X2RhdGEuaSwKJiM0MzsJCSAgJiMzNDtza2VsLSZndDtwZXJjcHUtJmd0O3N0cnVjdF9kYXRhLmkmIzM0Oyk7CiYjNDM7CUFTU0VSVF9FUShza2VsLSZndDtwZXJjcHUtJmd0O3N0cnVjdF9kYXRhLm51bXNbNl0sIGluaXRfdmFsdWUuc3RydWN0X2RhdGEubnVtc1s2XSwKJiM0MzsJCSAgJiMzNDtza2VsLSZndDtwZXJjcHUtJmd0O3N0cnVjdF9kYXRhLm51bXNbNl0mIzM0Oyk7CiYjNDM7CiYjNDM7CWVyciA9IHRlc3RfZ2xvYmFsX3BlcmNwdV9kYXRhX19sb2FkKHNrZWwpOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhlcnIsICYjMzQ7dGVzdF9nbG9iYWxfcGVyY3B1X2RhdGFfX2xvYWQmIzM0OykpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsKJiM0MzsJQVNTRVJUX09LX1BUUihza2VsLSZndDtwZXJjcHUsICYjMzQ7c2tlbC0mZ3Q7cGVyY3B1JiMzNDspOwomIzQzOwomIzQzOwltYXBfZmQgPSBicGZfbWFwX19mZChtYXApOwomIzQzOwlwcm9nX2ZkID0gYnBmX3Byb2dyYW1fX2ZkKHNrZWwtJmd0O3Byb2dzLnVwZGF0ZV9wZXJjcHVfZGF0YSk7CiYjNDM7CXRlc3RfcGVyY3B1X2RhdGFfb25fY3B1cyhtYXBfZmQsIHByb2dfZmQsIG51bV9vbmxpbmUsIG9ubGluZSk7CiYjNDM7CiYjNDM7b3V0OgomIzQzOwl0ZXN0X2dsb2JhbF9wZXJjcHVfZGF0YV9fZGVzdHJveShza2VsKTsKJiM0MzsJZnJlZShvbmxpbmUpOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgdm9pZCB0ZXN0X2dsb2JhbF9wZXJjcHVfZGF0YV9sc2tlbCh2b2lkKQomIzQzO3sKJiM0MzsJc3RydWN0IHRlc3RfZ2xvYmFsX3BlcmNwdV9kYXRhX2xza2VsICpsc2tlbCA9IE5VTEw7CiYjNDM7CWludCBwcm9nX2ZkLCBtYXBfZmQsIGVyciwgbnVtX29ubGluZTsKJiM0MzsJYm9vbCAqb25saW5lOwomIzQzOwomIzQzOwllcnIgPSBwYXJzZV9jcHVfbWFza19maWxlKCYjMzQ7L3N5cy9kZXZpY2VzL3N5c3RlbS9jcHUvb25saW5lJiMzNDssICZhbXA7b25saW5lLCAmYW1wO251bV9vbmxpbmUpOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhlcnIsICYjMzQ7cGFyc2VfY3B1X21hc2tfZmlsZSYjMzQ7KSkKJiM0MzsJCXJldHVybjsKJiM0MzsKJiM0MzsJbHNrZWwgPSB0ZXN0X2dsb2JhbF9wZXJjcHVfZGF0YV9sc2tlbF9fb3Blbl9hbmRfbG9hZCgpOwomIzQzOwlpZiAoIUFTU0VSVF9PS19QVFIobHNrZWwsICYjMzQ7dGVzdF9nbG9iYWxfcGVyY3B1X2RhdGFfbHNrZWxfX29wZW5fYW5kX2xvYWQmIzM0OykpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsKJiM0MzsJbWFwX2ZkID0gbHNrZWwtJmd0O21hcHMucGVyY3B1Lm1hcF9mZDsKJiM0MzsJcHJvZ19mZCA9IGxza2VsLSZndDtwcm9ncy51cGRhdGVfcGVyY3B1X2RhdGEucHJvZ19mZDsKJiM0MzsJdGVzdF9wZXJjcHVfZGF0YV9vbl9jcHVzKG1hcF9mZCwgcHJvZ19mZCwgbnVtX29ubGluZSwgb25saW5lKTsKJiM0MzsKJiM0MztvdXQ6CiYjNDM7CXRlc3RfZ2xvYmFsX3BlcmNwdV9kYXRhX2xza2VsX19kZXN0cm95KGxza2VsKTsKJiM0MzsJZnJlZShvbmxpbmUpOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50IGNyZWF0ZV9yZG9ubHlfcGVyY3B1X2FycmF5KHZvaWQpCiYjNDM7ewomIzQzOwlMSUJCUEZfT1BUUyhicGZfbWFwX2NyZWF0ZV9vcHRzLCBtYXBfb3B0cywKJiM0MzsJCSAgICAubWFwX2ZsYWdzID0gQlBGX0ZfUkRPTkxZX1BST0csCiYjNDM7CSk7CiYjNDM7CWludCBrZXkgPSAwLCBtYXBfZmQsIGVycjsKJiM0MzsJX191NjQgdmFsdWUgPSAwOwomIzQzOwomIzQzOwltYXBfZmQgPSBicGZfbWFwX2NyZWF0ZShCUEZfTUFQX1RZUEVfUEVSQ1BVX0FSUkFZLCAmIzM0O3BlcmNwdV9yb19tYXAmIzM0Oywgc2l6ZW9mKGludCksCiYjNDM7CQkJCXNpemVvZihfX3U2NCksIDEsICZhbXA7bWFwX29wdHMpOwomIzQzOwlpZiAoIUFTU0VSVF9HRShtYXBfZmQsIDAsICYjMzQ7YnBmX21hcF9jcmVhdGUmIzM0OykpCiYjNDM7CQlyZXR1cm4gLTE7CiYjNDM7CiYjNDM7CWVyciA9IGJwZl9tYXBfdXBkYXRlX2VsZW0obWFwX2ZkLCAmYW1wO2tleSwgJmFtcDt2YWx1ZSwgQlBGX0ZfQUxMX0NQVVMpOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhlcnIsICYjMzQ7YnBmX21hcF91cGRhdGVfZWxlbSYjMzQ7KSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwomIzQzOwllcnIgPSBicGZfbWFwX2ZyZWV6ZShtYXBfZmQpOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhlcnIsICYjMzQ7YnBmX21hcF9mcmVlemUmIzM0OykpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsKJiM0MzsJcmV0dXJuIG1hcF9mZDsKJiM0MzsKJiM0MztvdXQ6CiYjNDM7CWNsb3NlKG1hcF9mZCk7CiYjNDM7CXJldHVybiAtMTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgdGVzdF9nbG9iYWxfcGVyY3B1X2RhdGFfcmRvbmx5X2RpcmVjdF9yZWFkKHZvaWQpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgYnBmX2luc24gaW5zbnNbXSA9IHsKJiM0MzsJCUJQRl9MRF9NQVBfVkFMVUUoQlBGX1JFR18xLCAwLCAwKSwKJiM0MzsJCUJQRl9MRFhfTUVNKEJQRl9EVywgQlBGX1JFR18wLCBCUEZfUkVHXzEsIDApLAomIzQzOwkJQlBGX0VYSVRfSU5TTigpLAomIzQzOwl9OwomIzQzOwlpbnQgbWFwX2ZkLCBwcm9nX2ZkOwomIzQzOwomIzQzOwltYXBfZmQgPSBjcmVhdGVfcmRvbmx5X3BlcmNwdV9hcnJheSgpOwomIzQzOwlpZiAobWFwX2ZkICZsdDsgMCkKJiM0MzsJCXJldHVybjsKJiM0MzsKJiM0MzsJaW5zbnNbMF0uaW1tID0gbWFwX2ZkOwomIzQzOwlwcm9nX2ZkID0gYnBmX3Byb2dfbG9hZChCUEZfUFJPR19UWVBFX1NPQ0tFVF9GSUxURVIsICYjMzQ7cGVyY3B1X3JvX3Byb2cmIzM0OywgJiMzNDtHUEwmIzM0OywgaW5zbnMsCiYjNDM7CQkJCUFSUkFZX1NJWkUoaW5zbnMpLCBOVUxMKTsKJiM0MzsJaWYgKEFTU0VSVF9HRShwcm9nX2ZkLCAwLCAmIzM0O2JwZl9wcm9nX2xvYWQmIzM0OykpCiYjNDM7CQljbG9zZShwcm9nX2ZkKTsKJiM0MzsJY2xvc2UobWFwX2ZkKTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgdGVzdF9nbG9iYWxfcGVyY3B1X2RhdGFfcmRvbmx5X2RpcmVjdF93cml0ZSh2b2lkKQomIzQzO3sKJiM0MzsJTElCQlBGX09QVFMoYnBmX3Byb2dfbG9hZF9vcHRzLCBwcm9nX29wdHMpOwomIzQzOwlzdHJ1Y3QgYnBmX2luc24gaW5zbnNbXSA9IHsKJiM0MzsJCUJQRl9MRF9NQVBfVkFMVUUoQlBGX1JFR18xLCAwLCAwKSwKJiM0MzsJCUJQRl9MRFhfTUVNKEJQRl9EVywgQlBGX1JFR18wLCBCUEZfUkVHXzEsIDApLAomIzQzOwkJQlBGX1NUX01FTShCUEZfRFcsIEJQRl9SRUdfMSwgMCwgMCksCiYjNDM7CQlCUEZfRVhJVF9JTlNOKCksCiYjNDM7CX07CiYjNDM7CWNoYXIgbG9nX2J1ZlsyNTZdID0ge307CiYjNDM7CWludCBtYXBfZmQsIHByb2dfZmQ7CiYjNDM7CiYjNDM7CXByb2dfb3B0cy5sb2dfYnVmID0gbG9nX2J1ZjsKJiM0MzsJcHJvZ19vcHRzLmxvZ19zaXplID0gc2l6ZW9mKGxvZ19idWYpOwomIzQzOwlwcm9nX29wdHMubG9nX2xldmVsID0gMTsKJiM0MzsKJiM0MzsJbWFwX2ZkID0gY3JlYXRlX3Jkb25seV9wZXJjcHVfYXJyYXkoKTsKJiM0MzsJaWYgKG1hcF9mZCAmbHQ7IDApCiYjNDM7CQlyZXR1cm47CiYjNDM7CiYjNDM7CWluc25zWzBdLmltbSA9IG1hcF9mZDsKJiM0MzsJcHJvZ19mZCA9IGJwZl9wcm9nX2xvYWQoQlBGX1BST0dfVFlQRV9TT0NLRVRfRklMVEVSLCAmIzM0O3BlcmNwdV9yb19wcm9nJiMzNDssICYjMzQ7R1BMJiMzNDssIGluc25zLAomIzQzOwkJCQlBUlJBWV9TSVpFKGluc25zKSwgJmFtcDtwcm9nX29wdHMpOwomIzQzOwlpZiAoIUFTU0VSVF9MVChwcm9nX2ZkLCAwLCAmIzM0O2JwZl9wcm9nX2xvYWQmIzM0OykpCiYjNDM7CQljbG9zZShwcm9nX2ZkKTsKJiM0MzsJZWxzZQomIzQzOwkJQVNTRVJUX0hBU19TVUJTVFIobG9nX2J1ZiwgJiMzNDt3cml0ZSBpbnRvIG1hcCBmb3JiaWRkZW4mIzM0OywgJiMzNDt2ZXJpZmllciBsb2cmIzM0Oyk7CiYjNDM7CWNsb3NlKG1hcF9mZCk7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkIHRlc3RfZ2xvYmFsX3BlcmNwdV9kYXRhX3ZlcmlmaWVyX2xvZyh2b2lkKQomIzQzO3sKJiM0MzsJUlVOX1RFU1RTKHRlc3RfZ2xvYmFsX3BlcmNwdV9kYXRhKTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgdGVzdF9nbG9iYWxfcGVyY3B1X2RhdGFfaXRlcih2b2lkKQomIzQzO3sKJiM0MzsJREVDTEFSRV9MSUJCUEZfT1BUUyhicGZfaXRlcl9hdHRhY2hfb3B0cywgb3B0cyk7CiYjNDM7CXN0cnVjdCB0ZXN0X2dsb2JhbF9wZXJjcHVfZGF0YSAqc2tlbDsKJiM0MzsJdW5pb24gYnBmX2l0ZXJfbGlua19pbmZvIGxpbmZvID0ge307CiYjNDM7CXN0cnVjdCBicGZfbGluayAqbGluayA9IE5VTEw7CiYjNDM7CWludCBmZCwgbnVtX2NwdXMsIGxlbiwgZXJyOwomIzQzOwljaGFyIGJ1ZlsxNl07CiYjNDM7CiYjNDM7CW51bV9jcHVzID0gbGliYnBmX251bV9wb3NzaWJsZV9jcHVzKCk7CiYjNDM7CWlmICghQVNTRVJUX0dUKG51bV9jcHVzLCAwLCAmIzM0O2xpYmJwZl9udW1fcG9zc2libGVfY3B1cyYjMzQ7KSkKJiM0MzsJCXJldHVybjsKJiM0MzsKJiM0MzsJc2tlbCA9IHRlc3RfZ2xvYmFsX3BlcmNwdV9kYXRhX19vcGVuKCk7CiYjNDM7CWlmICghQVNTRVJUX09LX1BUUihza2VsLCAmIzM0O3Rlc3RfZ2xvYmFsX3BlcmNwdV9kYXRhX19vcGVuJiMzNDspKQomIzQzOwkJcmV0dXJuOwomIzQzOwomIzQzOwlza2VsLSZndDtyb2RhdGEtJmd0O251bV9jcHVzID0gbnVtX2NwdXM7CiYjNDM7CXNrZWwtJmd0O3JvZGF0YS0mZ3Q7b2Zmc2V0b2ZfbnVtID0gb2Zmc2V0b2Yoc3RydWN0IHRlc3RfZ2xvYmFsX3BlcmNwdV9kYXRhX19wZXJjcHUsIHN0cnVjdF9kYXRhKTsKJiM0MzsJc2tlbC0mZ3Q7cm9kYXRhLSZndDtvZmZzZXRvZl9udW0gJiM0Mzs9IHNpemVvZihza2VsLSZndDtwZXJjcHUtJmd0O3N0cnVjdF9kYXRhKSAtIHNpemVvZihpbnQpOwomIzQzOwlza2VsLSZndDtyb2RhdGEtJmd0O2VsZW1fc3ogPSByb3VuZHVwKHNpemVvZihzdHJ1Y3QgdGVzdF9nbG9iYWxfcGVyY3B1X2RhdGFfX3BlcmNwdSksIDgpOwomIzQzOwlza2VsLSZndDtwZXJjcHUtJmd0O3N0cnVjdF9kYXRhLm51bXNbNl0gPSAweGMwZGU7CiYjNDM7CiYjNDM7CWVyciA9IHRlc3RfZ2xvYmFsX3BlcmNwdV9kYXRhX19sb2FkKHNrZWwpOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhlcnIsICYjMzQ7dGVzdF9nbG9iYWxfcGVyY3B1X2RhdGFfX2xvYWQmIzM0OykpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsKJiM0MzsJbGluZm8ubWFwLm1hcF9mZCA9IGJwZl9tYXBfX2ZkKHNrZWwtJmd0O21hcHMucGVyY3B1KTsKJiM0MzsJb3B0cy5saW5rX2luZm8gPSAmYW1wO2xpbmZvOwomIzQzOwlvcHRzLmxpbmtfaW5mb19sZW4gPSBzaXplb2YobGluZm8pOwomIzQzOwlsaW5rID0gYnBmX3Byb2dyYW1fX2F0dGFjaF9pdGVyKHNrZWwtJmd0O3Byb2dzLmR1bXBfcGVyY3B1X2RhdGEsICZhbXA7b3B0cyk7CiYjNDM7CWlmICghQVNTRVJUX09LX1BUUihsaW5rLCAmIzM0O2JwZl9wcm9ncmFtX19hdHRhY2hfaXRlciYjMzQ7KSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwomIzQzOwlmZCA9IGJwZl9pdGVyX2NyZWF0ZShicGZfbGlua19fZmQobGluaykpOwomIzQzOwlpZiAoIUFTU0VSVF9HRShmZCwgMCwgJiMzNDticGZfaXRlcl9jcmVhdGUmIzM0OykpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsKJiM0MzsJd2hpbGUgKChsZW4gPSByZWFkKGZkLCBidWYsIHNpemVvZihidWYpKSkgJmd0OyAwKQomIzQzOwkJZG8geyB9IHdoaWxlICgwKTsKJiM0MzsJQVNTRVJUX0VRKGxlbiwgMCwgJiMzNDtyZWFkIGl0ZXImIzM0Oyk7CiYjNDM7CUFTU0VSVF9UUlVFKHNrZWwtJmd0O2Jzcy0mZ3Q7cnVuX2l0ZXIsICYjMzQ7cnVuX2l0ZXImIzM0Oyk7CiYjNDM7CUFTU0VSVF9FUShza2VsLSZndDtic3MtJmd0O3BlcmNwdV9kYXRhX3N1bSwgMHhjMGRlICogbnVtX2NwdXMsICYjMzQ7cGVyY3B1X2RhdGFfc3VtJiMzNDspOwomIzQzOwomIzQzOwljbG9zZShmZCk7CiYjNDM7b3V0OgomIzQzOwlicGZfbGlua19fZGVzdHJveShsaW5rKTsKJiM0MzsJdGVzdF9nbG9iYWxfcGVyY3B1X2RhdGFfX2Rlc3Ryb3koc2tlbCk7CiYjNDM7fQomIzQzOwomIzQzO3ZvaWQgdGVzdF9nbG9iYWxfcGVyY3B1X2RhdGEodm9pZCkKJiM0Mzt7CiYjNDM7CWlmICghZmVhdF9zdXBwb3J0ZWQoTlVMTCwgRkVBVF9QRVJDUFVfREFUQSkpIHsKJiM0MzsJCXRlc3RfX3NraXAoKTsKJiM0MzsJCXJldHVybjsKJiM0MzsJfQomIzQzOwomIzQzOwlpZiAodGVzdF9fc3RhcnRfc3VidGVzdCgmIzM0O2luaXQmIzM0OykpCiYjNDM7CQl0ZXN0X2dsb2JhbF9wZXJjcHVfZGF0YV9pbml0KCk7CiYjNDM7CWlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KCYjMzQ7bHNrZWwmIzM0OykpCiYjNDM7CQl0ZXN0X2dsb2JhbF9wZXJjcHVfZGF0YV9sc2tlbCgpOwomIzQzOwlpZiAodGVzdF9fc3RhcnRfc3VidGVzdCgmIzM0O3Jkb25seV9kaXJlY3RfcmVhZCYjMzQ7KSkKJiM0MzsJCXRlc3RfZ2xvYmFsX3BlcmNwdV9kYXRhX3Jkb25seV9kaXJlY3RfcmVhZCgpOwomIzQzOwlpZiAodGVzdF9fc3RhcnRfc3VidGVzdCgmIzM0O3Jkb25seV9kaXJlY3Rfd3JpdGUmIzM0OykpCiYjNDM7CQl0ZXN0X2dsb2JhbF9wZXJjcHVfZGF0YV9yZG9ubHlfZGlyZWN0X3dyaXRlKCk7CiYjNDM7CXRlc3RfZ2xvYmFsX3BlcmNwdV9kYXRhX3ZlcmlmaWVyX2xvZygpOwomIzQzOwlpZiAodGVzdF9fc3RhcnRfc3VidGVzdCgmIzM0O2l0ZXImIzM0OykpCiYjNDM7CQl0ZXN0X2dsb2JhbF9wZXJjcHVfZGF0YV9pdGVyKCk7CiYjNDM7fQpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvZ2xvYmFsX3BlcmNwdV9zdWJza2VsLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9nbG9iYWxfcGVyY3B1X3N1YnNrZWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMC4uOGFlYmQ1MzNkODZiNTQKLS0tIC9kZXYvbnVsbAomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9nbG9iYWxfcGVyY3B1X3N1YnNrZWwuYwpAQCAtMCwwICYjNDM7MSwzNyBAQAomIzQzOy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wCiYjNDM7I2luY2x1ZGUgJmx0O3Rlc3RfcHJvZ3MuaCZndDsKJiM0MzsjaW5jbHVkZSAmIzM0O3Rlc3RfZ2xvYmFsX3BlcmNwdV9kYXRhLnN1YnNrZWwuaCYjMzQ7CiYjNDM7CiYjNDM7dm9pZCB0ZXN0X2dsb2JhbF9wZXJjcHVfZGF0YV9zdWJza2VsKHZvaWQpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgdGVzdF9nbG9iYWxfcGVyY3B1X2RhdGEgKnN1YnNrZWwgPSBOVUxMOwomIzQzOwlzdHJ1Y3QgYnBmX29iamVjdCAqb2JqOwomIzQzOwlpbnQgaTsKJiM0MzsKJiM0MzsJb2JqID0gYnBmX29iamVjdF9fb3Blbl9maWxlKCYjMzQ7Li90ZXN0X2dsb2JhbF9wZXJjcHVfZGF0YS5icGYubyYjMzQ7LCBOVUxMKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0tfUFRSKG9iaiwgJiMzNDticGZfb2JqZWN0X19vcGVuX2ZpbGUmIzM0OykpCiYjNDM7CQlyZXR1cm47CiYjNDM7CiYjNDM7CXN1YnNrZWwgPSB0ZXN0X2dsb2JhbF9wZXJjcHVfZGF0YV9fb3BlbihvYmopOwomIzQzOwlpZiAoIUFTU0VSVF9PS19QVFIoc3Vic2tlbCwgJiMzNDt0ZXN0X2dsb2JhbF9wZXJjcHVfZGF0YV9fb3BlbiYjMzQ7KSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwomIzQzOwlpZiAoIUFTU0VSVF9PS19QVFIoc3Vic2tlbC0mZ3Q7c3Vic2tlbCwgJiMzNDtzdWJza2VsJiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CWlmICghQVNTRVJUX09LX1BUUihzdWJza2VsLSZndDttYXBzLnBlcmNwdSwgJiMzNDttYXBzLnBlcmNwdSYjMzQ7KSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwlBU1NFUlRfRVEoYnBmX21hcF9fdHlwZShzdWJza2VsLSZndDttYXBzLnBlcmNwdSksIEJQRl9NQVBfVFlQRV9QRVJDUFVfQVJSQVksCiYjNDM7CQkgICYjMzQ7cGVyY3B1X21hcF90eXBlJiMzNDspOwomIzQzOwlBU1NFUlRfR1Qoc3Vic2tlbC0mZ3Q7c3Vic2tlbC0mZ3Q7dmFyX2NudCwgMCwgJiMzNDt2YXJfY250JiMzNDspOwomIzQzOwomIzQzOwlmb3IgKGkgPSAwOyBpICZsdDsgc3Vic2tlbC0mZ3Q7c3Vic2tlbC0mZ3Q7dmFyX2NudDsgaSYjNDM7JiM0MzspIHsKJiM0MzsJCWNvbnN0IHN0cnVjdCBicGZfdmFyX3NrZWxldG9uICp2YXI7CiYjNDM7CiYjNDM7CQl2YXIgPSAodm9pZCAqKSBzdWJza2VsLSZndDtzdWJza2VsLSZndDt2YXJzICYjNDM7IGkgKiBzdWJza2VsLSZndDtzdWJza2VsLSZndDt2YXJfc2tlbF9zejsKJiM0MzsJCUFTU0VSVF9ORVEodmFyLSZndDttYXAsICZhbXA7c3Vic2tlbC0mZ3Q7bWFwcy5wZXJjcHUsICYjMzQ7dmFyJiMzNDspOwomIzQzOwl9CiYjNDM7CiYjNDM7b3V0OgomIzQzOwl0ZXN0X2dsb2JhbF9wZXJjcHVfZGF0YV9fZGVzdHJveShzdWJza2VsKTsKJiM0MzsJYnBmX29iamVjdF9fY2xvc2Uob2JqKTsKJiM0Mzt9CmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvdGVzdF9nbG9iYWxfcGVyY3B1X2RhdGEuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy90ZXN0X2dsb2JhbF9wZXJjcHVfZGF0YS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwLi5lZWY4OGZkNjFhZjUxMQotLS0gL2Rldi9udWxsCiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy90ZXN0X2dsb2JhbF9wZXJjcHVfZGF0YS5jCkBAIC0wLDAgJiM0MzsxLDc5IEBACiYjNDM7Ly8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAKJiM0MzsjaW5jbHVkZSAmbHQ7dm1saW51eC5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDticGYvYnBmX2hlbHBlcnMuaCZndDsKJiM0MzsjaW5jbHVkZSAmIzM0O2JwZl9taXNjLmgmIzM0OwomIzQzOwomIzQzO2ludCBkYXRhIFNFQygmIzM0Oy5wZXJjcHUmIzM0OykgPSAtMTsKJiM0MztpbnQgbnVtc1s3XSBTRUMoJiMzNDsucGVyY3B1JiMzNDspOwomIzQzO2NoYXIgcnVuIFNFQygmIzM0Oy5wZXJjcHUmIzM0OykgPSAwOwomIzQzO3N0cnVjdCB7CiYjNDM7CWNoYXIgc2V0OwomIzQzOwlpbnQgaTsKJiM0MzsJaW50IG51bXNbN107CiYjNDM7fSBzdHJ1Y3RfZGF0YSBTRUMoJiMzNDsucGVyY3B1JiMzNDspID0gewomIzQzOwkuc2V0ID0gMCwKJiM0MzsJLmkgPSAtMSwKJiM0Mzt9OwomIzQzOwomIzQzO1NFQygmIzM0O3Jhd190cC90YXNrX3JlbmFtZSYjMzQ7KQomIzQzO19fYXV4aWxpYXJ5CiYjNDM7aW50IHVwZGF0ZV9wZXJjcHVfZGF0YSh2b2lkICpjdHgpCiYjNDM7ewomIzQzOwlzdHJ1Y3RfZGF0YS5udW1zWzZdID0gMHhjMGRlOwomIzQzOwlzdHJ1Y3RfZGF0YS5zZXQgPSAxOwomIzQzOwlzdHJ1Y3RfZGF0YS5pID0gMTsKJiM0MzsJbnVtc1s2XSA9IDB4YzBkZTsKJiM0MzsJZGF0YSA9IDE7CiYjNDM7CXJ1biA9IDE7CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgY29uc3QgY2hhciBmbXRbXSBTRUMoJiMzNDsucGVyY3B1LmZtdCYjMzQ7KSA9ICYjMzQ7ZGF0YSAlZFxuJiMzNDs7CiYjNDM7CiYjNDM7U0VDKCYjMzQ7P2twcm9iZSYjMzQ7KQomIzQzO19fZmFpbHVyZSBfX21zZygmIzM0O1J7e1swLTldJiM0Mzt9fSBwb2ludHMgdG8gcGVyY3B1X2FycmF5IG1hcCB3aGljaCBjYW5ub3QgYmUgdXNlZCBhcyBjb25zdCBzdHJpbmcmIzM0OykKJiM0MztpbnQgdmVyaWZpZXJfc3RybmNtcCh2b2lkICpjdHgpCiYjNDM7ewomIzQzOwlyZXR1cm4gYnBmX3N0cm5jbXAoJiMzNDt0ZXN0JiMzNDssIDUsIGZtdCk7CiYjNDM7fQomIzQzOwomIzQzO1NFQygmIzM0Oz9rcHJvYmUmIzM0OykKJiM0MztfX2ZhaWx1cmUgX19tc2coJiMzNDtSe3tbMC05XSYjNDM7fX0gcG9pbnRzIHRvIHBlcmNwdV9hcnJheSBtYXAgd2hpY2ggY2Fubm90IGJlIHVzZWQgYXMgY29uc3Qgc3RyaW5nJiMzNDspCiYjNDM7aW50IHZlcmlmaWVyX3NucHJpbnRmKHZvaWQgKmN0eCkKJiM0Mzt7CiYjNDM7CXU2NCBhcmdzW10gPSB7IGRhdGEgfTsKJiM0MzsJY2hhciBidWZbMTI4XTsKJiM0MzsJaW50IGxlbjsKJiM0MzsKJiM0MzsJbGVuID0gYnBmX3NucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksIGZtdCwgYXJncywgc2l6ZW9mKGFyZ3MpKTsKJiM0MzsJaWYgKGxlbiAmZ3Q7IDApCiYjNDM7CQlicGZfcHJpbnRrKCYjMzQ7c25wcmludGY6ICVzXG4mIzM0OywgYnVmKTsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOwomIzQzO3ZvbGF0aWxlIGNvbnN0IF9fdTMyIG51bV9jcHVzID0gMDsKJiM0Mzt2b2xhdGlsZSBjb25zdCBpbnQgb2Zmc2V0b2ZfbnVtOwomIzQzO3ZvbGF0aWxlIGNvbnN0IGludCBlbGVtX3N6OwomIzQzO19fdTMyIHBlcmNwdV9kYXRhX3N1bSA9IDA7CiYjNDM7Ym9vbCBydW5faXRlciA9IGZhbHNlOwomIzQzOwomIzQzO1NFQygmIzM0O2l0ZXIvYnBmX21hcF9lbGVtJiMzNDspCiYjNDM7X19hdXhpbGlhcnkKJiM0MztpbnQgZHVtcF9wZXJjcHVfZGF0YShzdHJ1Y3QgYnBmX2l0ZXJfX2JwZl9tYXBfZWxlbSAqY3R4KQomIzQzO3sKJiM0MzsJdm9pZCAqcHB0ciA9IGN0eC0mZ3Q7dmFsdWU7CiYjNDM7CWludCBpOwomIzQzOwomIzQzOwlpZiAoIXBwdHIpCiYjNDM7CQlyZXR1cm4gMDsKJiM0MzsKJiM0MzsJcnVuX2l0ZXIgPSB0cnVlOwomIzQzOwomIzQzOwlmb3IgKGkgPSAwOyBpICZsdDsgbnVtX2NwdXM7IGkmIzQzOyYjNDM7KSB7CiYjNDM7CQlwZXJjcHVfZGF0YV9zdW0gJiM0Mzs9ICooaW50ICopIChwcHRyICYjNDM7IG9mZnNldG9mX251bSk7CiYjNDM7CQlwcHRyICYjNDM7PSBlbGVtX3N6OwomIzQzOwl9CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MzsKJiM0MztjaGFyIF9saWNlbnNlW10gU0VDKCYjMzQ7bGljZW5zZSYjMzQ7KSA9ICYjMzQ7R1BMJiMzNDs7CjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA2LzI5IDE2OjM5PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDE4NzU4CgkJCQkJCQlvdXRwdXQ6IDI2CgkJCQkJCQl0aG91Z2h0czogNDUwCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKk15IEJQRiBQZXItQ1BVIE1hcCBJbXBsZW1lbnRhdGlvbiBBc3Nlc3NtZW50KioKCk9rYXksIHNvIEkmIzM5O20gbG9va2luZyBhdCB0aGlzIHBhdGNoIGludHJvZHVjaW5nIGAucGVyY3B1YCBtYXAgc3VwcG9ydCB3aXRoaW4gQlBGLCBhbmQgbXkgaW5pdGlhbCB0aG91Z2h0IGlzLCAmIzM0O1RoaXMgaXMgYSBwcmV0dHkgc2lnbmlmaWNhbnQgYWRkaXRpb24uJiMzNDsgSXQgdG91Y2hlcyBzZXZlcmFsIGtleSBmaWxlcywgc3BlY2lmaWNhbGx5IGBhcnJheW1hcC5jYCwgYGNvbnN0X2ZvbGQuY2AsIGBmaXh1cHMuY2AsIGFuZCB0aGUgdmVyaWZpZXIsIHNvIHdlJiMzOTtyZSB0YWxraW5nIGFib3V0IGEgZmFpciBhbW91bnQgb2YgdW5kZXJseWluZyBtZWNoYW5pc20gY2hhbmdlcy4gSSBzZWUgdGhhdCBpdCBpbnRyb2R1Y2VzIGBCUEZfTUFQX1RZUEVfUEVSQ1BVX0FSUkFZYCBhcyBhIG5ldyBtYXAgdHlwZSwgd2hpY2ggYWxsb3dzIGZvciBgLnBlcmNwdWAgc2VjdGlvbnMgdG8gYmUgdXNlZCBhbmQgdHJhbnNsYXRlZC4gVGhhdCBzZWVtcyBjbGVhbiBlbm91Z2guIFNwZWNpZmljYWxseSwgaXQgc2VlbXMgaXQgaW50cm9kdWNlcyBuZXcgZnVuY3Rpb25zIGBwZXJjcHVfYXJyYXlfbWFwX2RpcmVjdF92YWx1ZV9hZGRyYCBhbmQgYHBlcmNwdV9hcnJheV9tYXBfZGlyZWN0X3ZhbHVlX21ldGFgIHdpdGhpbiBgcGVyY3B1X2FycmF5X21hcF9vcHNgLCB3aGljaCBhcmUgY3JpdGljYWwgYWRkaXRpb25zLgoKVGhlIGNydWNpYWwgYXNwZWN0IHNlZW1zIHRvIGJlIGhvdyBpdCBoYW5kbGVzIHRoZSBpbnN0cnVjdGlvbiBmaXh1cHMuIE1vZGlmeWluZyBgYnBmX2RvX21pc2NfZml4dXBzYCB0byBwYXRjaCBgQlBGX0xEIHwgQlBGX0lNTSB8IEJQRl9EV2AgaW5zdHJ1Y3Rpb25zIHRoYXQgbG9hZCBmcm9tIHRoZSBwZXJjcHUgYXJyYXkgdG8gdXNlIGBCUEZfTU9WNjRfUEVSQ1BVX1JFR2AgaXMgZ29pbmcgdG8gYmUgYSBmb2N1cy4gVGhpcyBpcyBhIGZ1bmN0aW9uYWwgY2hhbmdlLCBhbmQgZ2l2ZW4gaXRzIHNjb3BlLCBpdCYjMzk7cyBkZWZpbml0ZWx5IGEgY2FuZGlkYXRlIGZvciB0aG9yb3VnaCBmdXp6aW5nLgoKTm93LCBsZXQmIzM5O3MgbmFpbCBkb3duIHRoZSBjb25maWd1cmF0aW9uIGRlcGVuZGVuY2llcy4gYENPTkZJR19CUEZfU1lTQ0FMTGAgaXMgYSBnaXZlbiwgb2YgY291cnNlLiBTaW5jZSB3ZSYjMzk7cmUgZGVhbGluZyB3aXRoIHBlcmNwdSBkYXRhLCBhbmQgSSBuZWVkIHRoZSBKSVQgZm9yIHBlcmZvcm1hbmNlLCBJJiMzOTtsbCBuZWVkIGBDT05GSUdfQlBGX0pJVGAgYXMgd2VsbC4KCk1vdmluZyBvbnRvIHRoZSBzeW1ib2xzLCBJJiMzOTttIGdvaW5nIHRvIHdhbnQgdG8gdHJhY2sgdGhlc2Ugc3BlY2lmaWNhbGx5OgoqICAgYHBlcmNwdV9hcnJheV9tYXBfZGlyZWN0X3ZhbHVlX2FkZHJgCiogICBgcGVyY3B1X2FycmF5X21hcF9kaXJlY3RfdmFsdWVfbWV0YWAKKiAgIGBicGZfZG9fbWlzY19maXh1cHNgIChhbHRob3VnaCB0aGlzIGlzIGEgbW9yZSBnZW5lcmljIGZ1bmN0aW9uLCB0aGUgcGF0Y2ggc3BlY2lmaWNhbGx5IHRhcmdldHMgYSBuZXcgYnJhbmNoIGhlcmUsIHNvIGl0IGlzIGhpZ2gtcHJpb3JpdHkpCiogICBgYXJyYXlfbWFwX2NoZWNrX2J0ZmAgKG1vZGlmaWVkKQoqICAgYGNoZWNrX2FuZF9yZXNvbHZlX2luc25zYCAobW9kaWZpZWQpCgpJJiMzOTtsbCBjaGVjayB0aGUgZGVmaW5pdGlvbiBvZiBgYnBmX2ppdF9zdXBwb3J0c19wZXJjcHVfaW5zbmAuIEkmIzM5O2xsIHVzZSBgZ3JlcHBlcmAgdG8gZGV0ZXJtaW5lIHRoZSBzcGVjaWZpYyBhcmNoaXRlY3R1cmVzIHRoYXQgYWN0dWFsbHkgc3VwcG9ydCB0aGlzLiBUaGlzIHdpbGwgaW5mb3JtIG15IGZ1enppbmcgdGFyZ2V0IGxpc3QuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NC8yPC90ZD4KCQkJPHRkPjIwMjYvMDYvMjkgMTY6Mzk8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7YnBmX2ppdF9zdXBwb3J0c19wZXJjcHVfaW5zbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDthcmNoL2FybTY0L25ldC9icGZfaml0X2NvbXAuYz0zMTcxPWJvb2wgYnBmX2ppdF9zdXBwb3J0c19pbnNuKHN0cnVjdCBicGZfaW5zbiAqaW5zbiwgYm9vbCBpbl9hcmVuYSlcbi0tXG5hcmNoL2FybTY0L25ldC9icGZfaml0X2NvbXAuYy0zMTg0LVxuYXJjaC9hcm02NC9uZXQvYnBmX2ppdF9jb21wLmM6MzE4NTpib29sIGJwZl9qaXRfc3VwcG9ydHNfcGVyY3B1X2luc24odm9pZClcbmFyY2gvYXJtNjQvbmV0L2JwZl9qaXRfY29tcC5jLTMxODYte1xuLS1cbmFyY2gvcG93ZXJwYy9uZXQvYnBmX2ppdF9jb21wLmM9NTU2PWJvb2wgYnBmX2ppdF9zdXBwb3J0c19pbnNuKHN0cnVjdCBicGZfaW5zbiAqaW5zbiwgYm9vbCBpbl9hcmVuYSlcbi0tXG5hcmNoL3Bvd2VycGMvbmV0L2JwZl9qaXRfY29tcC5jLTU3MS1cbmFyY2gvcG93ZXJwYy9uZXQvYnBmX2ppdF9jb21wLmM6NTcyOmJvb2wgYnBmX2ppdF9zdXBwb3J0c19wZXJjcHVfaW5zbih2b2lkKVxuYXJjaC9wb3dlcnBjL25ldC9icGZfaml0X2NvbXAuYy01NzMte1xuLS1cbmFyY2gvcmlzY3YvbmV0L2JwZl9qaXRfY29tcDY0LmM9MjEyMD1ib29sIGJwZl9qaXRfc3VwcG9ydHNfaW5zbihzdHJ1Y3QgYnBmX2luc24gKmluc24sIGJvb2wgaW5fYXJlbmEpXG4tLVxuYXJjaC9yaXNjdi9uZXQvYnBmX2ppdF9jb21wNjQuYy0yMTM4LVxuYXJjaC9yaXNjdi9uZXQvYnBmX2ppdF9jb21wNjQuYzoyMTM5OmJvb2wgYnBmX2ppdF9zdXBwb3J0c19wZXJjcHVfaW5zbih2b2lkKVxuYXJjaC9yaXNjdi9uZXQvYnBmX2ppdF9jb21wNjQuYy0yMTQwLXtcbi0tXG5hcmNoL3g4Ni9uZXQvYnBmX2ppdF9jb21wLmM9NDA2MD1ib29sIGJwZl9qaXRfc3VwcG9ydHNfc3VicHJvZ190YWlsY2FsbHModm9pZClcbi0tXG5hcmNoL3g4Ni9uZXQvYnBmX2ppdF9jb21wLmMtNDA2NC1cbmFyY2gveDg2L25ldC9icGZfaml0X2NvbXAuYzo0MDY1OmJvb2wgYnBmX2ppdF9zdXBwb3J0c19wZXJjcHVfaW5zbih2b2lkKVxuYXJjaC94ODYvbmV0L2JwZl9qaXRfY29tcC5jLTQwNjYte1xuLS1cbmluY2x1ZGUvbGludXgvZmlsdGVyLmg9MTE4MT1ib29sIGJwZl9qaXRfc3VwcG9ydHNfc3VicHJvZ190YWlsY2FsbHModm9pZCk7XG5pbmNsdWRlL2xpbnV4L2ZpbHRlci5oOjExODI6Ym9vbCBicGZfaml0X3N1cHBvcnRzX3BlcmNwdV9pbnNuKHZvaWQpO1xuaW5jbHVkZS9saW51eC9maWx0ZXIuaC0xMTgzLWJvb2wgYnBmX2ppdF9zdXBwb3J0c19rZnVuY19jYWxsKHZvaWQpO1xuLS1cbmtlcm5lbC9icGYvYXJyYXltYXAuYz0yNjI9c3RhdGljIGludCBwZXJjcHVfYXJyYXlfbWFwX2RpcmVjdF92YWx1ZV9hZGRyKGNvbnN0IHN0cnVjdCBicGZfbWFwICptYXAsIHU2NCAqaW1tLCB1MzIgb2ZmKVxuLS1cbmtlcm5lbC9icGYvYXJyYXltYXAuYy0yNjktXHRcdHJldHVybiAtRUlOVkFMO1xua2VybmVsL2JwZi9hcnJheW1hcC5jOjI3MDpcdGlmICghYnBmX2ppdF9zdXBwb3J0c19wZXJjcHVfaW5zbigpKVxua2VybmVsL2JwZi9hcnJheW1hcC5jLTI3MS1cdFx0cmV0dXJuIC1FT1BOT1RTVVBQO1xuLS1cbmtlcm5lbC9icGYvYXJyYXltYXAuYz0yNzc9c3RhdGljIGludCBwZXJjcHVfYXJyYXlfbWFwX2RpcmVjdF92YWx1ZV9tZXRhKGNvbnN0IHN0cnVjdCBicGZfbWFwICptYXAsIHU2NCBpbW0sIHUzMiAqb2ZmKVxuLS1cbmtlcm5lbC9icGYvYXJyYXltYXAuYy0yODUtXHRcdHJldHVybiAtRU5PRU5UO1xua2VybmVsL2JwZi9hcnJheW1hcC5jOjI4NjpcdGlmICghYnBmX2ppdF9zdXBwb3J0c19wZXJjcHVfaW5zbigpKVxua2VybmVsL2JwZi9hcnJheW1hcC5jLTI4Ny1cdFx0cmV0dXJuIC1FT1BOT1RTVVBQO1xuLS1cbmtlcm5lbC9icGYvYXJyYXltYXAuYz0yOTQ9c3RhdGljIGludCBwZXJjcHVfYXJyYXlfbWFwX2dlbl9sb29rdXAoc3RydWN0IGJwZl9tYXAgKm1hcCwgc3RydWN0IGJwZl9pbnNuICppbnNuX2J1Zilcbi0tXG5rZXJuZWwvYnBmL2FycmF5bWFwLmMtMjk4LVxua2VybmVsL2JwZi9hcnJheW1hcC5jOjI5OTpcdGlmICghYnBmX2ppdF9zdXBwb3J0c19wZXJjcHVfaW5zbigpKVxua2VybmVsL2JwZi9hcnJheW1hcC5jLTMwMC1cdFx0cmV0dXJuIC1FT1BOT1RTVVBQO1xuLS1cbmtlcm5lbC9icGYvY29yZS5jPTMyMjY9Ym9vbCBfX3dlYWsgYnBmX2ppdF9zdXBwb3J0c19zdWJwcm9nX3RhaWxjYWxscyh2b2lkKVxuLS1cbmtlcm5lbC9icGYvY29yZS5jLTMyMzAtXG5rZXJuZWwvYnBmL2NvcmUuYzozMjMxOmJvb2wgX193ZWFrIGJwZl9qaXRfc3VwcG9ydHNfcGVyY3B1X2luc24odm9pZClcbmtlcm5lbC9icGYvY29yZS5jLTMyMzIte1xuLS1cbmtlcm5lbC9icGYvZml4dXBzLmM9MTQ4MT1pbnQgYnBmX2RvX21pc2NfZml4dXBzKHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYpXG4tLVxua2VybmVsL2JwZi9maXh1cHMuYy0xODIyLVx0XHRpZiAoZW52LVx1MDAzZXByb2ctXHUwMDNlaml0X3JlcXVlc3RlZCBcdTAwMjZcdTAwMjZcbmtlcm5lbC9icGYvZml4dXBzLmM6MTgyMzpcdFx0ICAgIGJwZl9qaXRfc3VwcG9ydHNfcGVyY3B1X2luc24oKSBcdTAwMjZcdTAwMjZcbmtlcm5lbC9icGYvZml4dXBzLmMtMTgyNC1cdFx0ICAgIGluc24tXHUwMDNlY29kZSA9PSAoQlBGX0xEIHwgQlBGX0lNTSB8IEJQRl9EVykgXHUwMDI2XHUwMDI2XG4tLVxua2VybmVsL2JwZi9oYXNodGFiLmM9MjQxNT1zdGF0aWMgaW50IGh0YWJfcGVyY3B1X21hcF9nZW5fbG9va3VwKHN0cnVjdCBicGZfbWFwICptYXAsIHN0cnVjdCBicGZfaW5zbiAqaW5zbl9idWYpXG4tLVxua2VybmVsL2JwZi9oYXNodGFiLmMtMjQxOC1cbmtlcm5lbC9icGYvaGFzaHRhYi5jOjI0MTk6XHRpZiAoIWJwZl9qaXRfc3VwcG9ydHNfcGVyY3B1X2luc24oKSlcbmtlcm5lbC9icGYvaGFzaHRhYi5jLTI0MjAtXHRcdHJldHVybiAtRU9QTk9UU1VQUDtcbi0tXG5rZXJuZWwvYnBmL3ZlcmlmaWVyLmM9MTY2NjM9Ym9vbCBicGZfdmVyaWZpZXJfaW5saW5lc19oZWxwZXJfY2FsbChzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52LCBzMzIgaW1tKVxuLS1cbmtlcm5lbC9icGYvdmVyaWZpZXIuYy0xNjY3MS0jZW5kaWZcbmtlcm5lbC9icGYvdmVyaWZpZXIuYzoxNjY3MjpcdFx0cmV0dXJuIGVudi1cdTAwM2Vwcm9nLVx1MDAzZWppdF9yZXF1ZXN0ZWQgXHUwMDI2XHUwMDI2IGJwZl9qaXRfc3VwcG9ydHNfcGVyY3B1X2luc24oKTtcbmtlcm5lbC9icGYvdmVyaWZpZXIuYy0xNjY3My0jZW5kaWZcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD41LzI8L3RkPgoJCQk8dGQ+MjAyNi8wNi8yOSAxNjozOTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyMTI2NQoJCQkJCQkJb3V0cHV0OiAxNzMKCQkJCQkJCXRob3VnaHRzOiA1MzQKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqTXkgQXNzZXNzbWVudCBvZiB0aGUgQlBGIFBhdGNoKioKCk9rYXksIGxldCYjMzk7cyBicmVhayB0aGlzIGRvd24uIFRoaXMgcGF0Y2ggaXMgY2xlYXJseSBzaWduaWZpY2FudCwgZm9jdXNpbmcgb24gZW5hYmxpbmcgZGlyZWN0IGFjY2VzcyB0byBgLnBlcmNwdWAgZGF0YSBtYXBzIHdpdGhpbiBCUEYuIFRoaXMgdHJhbnNsYXRlcyBzcGVjaWZpY2FsbHkgdG8gc3VwcG9ydGluZyBgQlBGX01BUF9UWVBFX1BFUkNQVV9BUlJBWWAuCgpNeSBpbml0aWFsIHRob3VnaHQgaXMgdG8gaWRlbnRpZnkgdGhlIGtleSBmdW5jdGlvbnMgaW1wYWN0ZWQuIEkgc2VlIHRoZSBhZGRpdGlvbiBvZiB0d28gbmV3IGZ1bmN0aW9uczogYHBlcmNwdV9hcnJheV9tYXBfZGlyZWN0X3ZhbHVlX2FkZHJgIGFuZCBgcGVyY3B1X2FycmF5X21hcF9kaXJlY3RfdmFsdWVfbWV0YWAuIFRoZXNlIGFyZSB0aGUgY29yZSBtYXAgb3BlcmF0aW9ucyBmb3IgdGhpcyBuZXcgY2FwYWJpbGl0eS4KCkl0JiMzOTtzIGFsc28gbW9kaWZ5aW5nIHNldmVyYWwgZXhpc3RpbmcgZnVuY3Rpb25zIHRvIGFjY29tbW9kYXRlIHRoaXMgbmV3IGZ1bmN0aW9uYWxpdHkuIEluaXRpYWxseSwgSSBub3RlZCBgYXJyYXlfbWFwX2NoZWNrX2J0ZmAsIGBicGZfZG9fbWlzY19maXh1cHNgLCBgYnBmX21hcF9kaXJlY3RfcmVhZGAsIGBjaGVja19tZW1fYWNjZXNzYCwgYGNoZWNrX2FyZ19jb25zdF9zdHJgLCBhbmQgYGNoZWNrX2FuZF9yZXNvbHZlX2luc25zYC4gSG93ZXZlciwgYGJwZl9kb19taXNjX2ZpeHVwc2AgYW5kIGBjaGVja19hbmRfcmVzb2x2ZV9pbnNuc2AgYXJlIHN1Y2ggaGVhdmlseSB1c2VkIHBhdGhzIGluIHRoZSB2ZXJpZmllciB0aGF0IEkmIzM5O2xsIHNpbXBsaWZ5IHRoZSBmb2N1cyB0byB0aGUgbmV3IGZ1bmN0aW9ucy4gSSBuZWVkIHRvIGJlIGVmZmljaWVudCB3aXRoIG15IHRpbWUgYW5kIGF0dGVudGlvbi4gSSBhbSBtYWtpbmcgdGhlIGZpbmFsIGxpc3Qgb2YgdGhlIG5ldyBhbmQgaW1wYWN0ZWQgZnVuY3Rpb25zIGBwZXJjcHVfYXJyYXlfbWFwX2RpcmVjdF92YWx1ZV9hZGRyYCwgYHBlcmNwdV9hcnJheV9tYXBfZGlyZWN0X3ZhbHVlX21ldGFgLCBgYnBmX21hcF9kaXJlY3RfcmVhZGAsIGBjaGVja19tZW1fYWNjZXNzYCwgYW5kIGBjaGVja19hcmdfY29uc3Rfc3RyYC4KCkNoZWNraW5nIHRoZSBjb25maWd1cmF0aW9ucywgaXQgbG9va3MgbGlrZSBgQ09ORklHX0JQRl9TWVNDQUxMYCBpcyBzdGFuZGFyZCwgd2hpY2ggaXMgZXhwZWN0ZWQuIEhvd2V2ZXIsIGBDT05GSUdfQlBGX0pJVGAgaXMgbmVjZXNzYXJ5IGZvciBgYnBmX2ppdF9zdXBwb3J0c19wZXJjcHVfaW5zbigpYC4gVGhpcyBpbXBsaWVzIHRoYXQgdGhlIEpJVCBjb21waWxlciB3aWxsIG5lZWQgdG8gYmUgdXBkYXRlZCB0byBoYW5kbGUgdGhlc2UgYC5wZXJjcHVgIGFjY2Vzc2VzLgoKR2l2ZW4gdGhlIGZ1bmN0aW9uYWwgbmF0dXJlIG9mIHRoZXNlIGNoYW5nZXMsIHRoZSBpbnRyb2R1Y3Rpb24gb2YgYC5wZXJjcHVgIHN1cHBvcnQsIGFuZCB0aGUgbW9kaWZpY2F0aW9ucyB0byB0aGUgQlBGIHZlcmlmaWVyIHRvIGhhbmRsZSBpdCwgdGhpcyBpcyBhIGNsZWFyIGNhbmRpZGF0ZSBmb3IgZnV6emluZy4gSSYjMzk7bGwgbmVlZCB0byBkZXZlbG9wIGZ1enogdGFyZ2V0cyB0byBjb3ZlciB0aGUgbmV3IGNvZGUgcGF0aHMsIHBhcnRpY3VsYXJseSBhcm91bmQgdGhlIG1hcCBvcGVyYXRpb25zIGFuZCB0aGUgdmVyaWZpZXIgbW9kaWZpY2F0aW9ucy4gTGV0JiMzOTtzIGNhbGwgYHNldC1yZXN1bHRzYC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD42LzI8L3RkPgoJCQk8dGQ+MjAyNi8wNi8yOSAxNjo0MDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnNldC1yZXN1bHRzPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7QlBGX1NZU0NBTEwmIzM0OywKICAgICYjMzQ7QlBGX0pJVCYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O3BlcmNwdV9hcnJheV9tYXBfZGlyZWN0X3ZhbHVlX2FkZHImIzM0OywKICAgICYjMzQ7cGVyY3B1X2FycmF5X21hcF9kaXJlY3RfdmFsdWVfbWV0YSYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBpbnRyb2R1Y2VzIHN1cHBvcnQgZm9yIGAucGVyY3B1YCBnbG9iYWwgZGF0YSBtYXBzIGluIEJQRiwgd2hpY2ggdHJhbnNsYXRlcyB0byBgQlBGX01BUF9UWVBFX1BFUkNQVV9BUlJBWWAuIEl0IGFkZHMgbmV3IG1hcCBvcGVyYXRpb25zIGBtYXBfZGlyZWN0X3ZhbHVlX2FkZHJgIGFuZCBgbWFwX2RpcmVjdF92YWx1ZV9tZXRhYCBmb3IgcGVyY3B1IGFycmF5cywgYW5kIG1vZGlmaWVzIHRoZSB2ZXJpZmllciB0byBoYW5kbGUgcGVyY3B1IGFycmF5IGFjY2Vzc2VzIGFuZCBwYXRjaCBpbnN0cnVjdGlvbnMgZm9yIEpJVC4gVGhpcyBpcyBhIGZ1bmN0aW9uYWwgY2hhbmdlIGluIHRoZSBjb3JlIEJQRiBzdWJzeXN0ZW0gYW5kIHNob3VsZCBiZSBmdXp6ZWQuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0JQRl9TWVNDQUxMJiMzNDssCiAgICAmIzM0O0JQRl9KSVQmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDtwZXJjcHVfYXJyYXlfbWFwX2RpcmVjdF92YWx1ZV9hZGRyJiMzNDssCiAgICAmIzM0O3BlcmNwdV9hcnJheV9tYXBfZGlyZWN0X3ZhbHVlX21ldGEmIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggaW50cm9kdWNlcyBzdXBwb3J0IGZvciBgLnBlcmNwdWAgZ2xvYmFsIGRhdGEgbWFwcyBpbiBCUEYsIHdoaWNoIHRyYW5zbGF0ZXMgdG8gYEJQRl9NQVBfVFlQRV9QRVJDUFVfQVJSQVlgLiBJdCBhZGRzIG5ldyBtYXAgb3BlcmF0aW9ucyBgbWFwX2RpcmVjdF92YWx1ZV9hZGRyYCBhbmQgYG1hcF9kaXJlY3RfdmFsdWVfbWV0YWAgZm9yIHBlcmNwdSBhcnJheXMsIGFuZCBtb2RpZmllcyB0aGUgdmVyaWZpZXIgdG8gaGFuZGxlIHBlcmNwdSBhcnJheSBhY2Nlc3NlcyBhbmQgcGF0Y2ggaW5zdHJ1Y3Rpb25zIGZvciBKSVQuIFRoaXMgaXMgYSBmdW5jdGlvbmFsIGNoYW5nZSBpbiB0aGUgY29yZSBCUEYgc3Vic3lzdGVtIGFuZCBzaG91bGQgYmUgZnV6emVkLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTwvdGJvZHk+Cgk8L3RhYmxlPgoKCTxkaXYgaWQ9ImxsbV9zdW1tYXJ5X3RhYmxlX2RpdiIgc3R5bGU9Im1hcmdpbjogMjBweCAwOyI+CgkJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQkJPGNhcHRpb24+TExNIENhbGxzIFN1bW1hcnk6PC9jYXB0aW9uPgoJCQk8dGhlYWQ+CgkJCQk8dHI+CgkJCQkJPHRoPlRvdGFsIENhbGxzPC90aD4KCQkJCQk8dGg+VG90YWwgVG9rZW5zPC90aD4KCQkJCQk8dGg+QXZnIFRva2VuczwvdGg+CgkJCQkJPHRoPlRvdGFsIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQkJPHRoPkF2ZyBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJPC90cj4KCQkJPC90aGVhZD4KCQkJPHRib2R5IGlkPSJsbG1fc3VtbWFyeV9zdGF0c19ib2R5Ij48L3Rib2R5PgoJCTwvdGFibGU+Cgk8L2Rpdj4KCgk8ZGl2IGlkPSJ0b29sX3N1bW1hcnlfdGFibGVfZGl2IiBzdHlsZT0ibWFyZ2luOiAyMHB4IDA7Ij4KCQk8dGFibGUgY2xhc3M9Imxpc3RfdGFibGUiPgoJCQk8Y2FwdGlvbj5Ub29sIENhbGxzIFN1bW1hcnk6PC9jYXB0aW9uPgoJCQk8dGhlYWQ+CgkJCQk8dHI+CgkJCQkJPHRoPlRvdGFsIENhbGxzPC90aD4KCQkJCQk8dGg+VG90YWwgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCQk8dGg+QXZnIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQk8L3RyPgoJCQk8L3RoZWFkPgoJCQk8dGJvZHkgaWQ9InRvb2xfc3VtbWFyeV9zdGF0c19ib2R5Ij48L3Rib2R5PgoJCTwvdGFibGU+Cgk8L2Rpdj4KCgk8ZGl2IGlkPSJkdXJhdGlvbl9jaGFydF9kaXYiIHN0eWxlPSJ3aWR0aDogMTAwJTsgbWFyZ2luOiAyMHB4IDA7IGJvcmRlcjogMXB4OyI+PC9kaXY+Cgk8ZGl2IGlkPSJ0b2tlbl9jaGFydF9kaXYiIHN0eWxlPSJ3aWR0aDogMTAwJTsgbWFyZ2luOiAyMHB4IDA7IGJvcmRlcjogMXB4OyI+PC9kaXY+CgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS9qc2FwaSI+PC9zY3JpcHQ+Cgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CgkJZ29vZ2xlLmxvYWQoInZpc3VhbGl6YXRpb24iLCAiMSIsIHtwYWNrYWdlczpbImNvcmVjaGFydCJdfSk7CgkJZ29vZ2xlLnNldE9uTG9hZENhbGxiYWNrKGRyYXdDaGFydHMpOwoKCQlmdW5jdGlvbiBkcmF3Q2hhcnRzKCkgewoJCQljb25zdCByYXdEYXRhID0gW3siU3RhcnRlZCI6IjIwMjYtMDYtMjlUMTY6Mzk6MzAuNDI5MzA0MzQ2WiIsIlNlcSI6MCwiTmVzdGluZyI6MCwiVHlwZSI6ImZsb3ciLCJOYW1lIjoicGF0Y2gtdHJpYWdlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MzA5MTMyMTA1NDEsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiQlBGX1NZU0NBTExcIixcbiAgICBcIkJQRl9KSVRcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJwZXJjcHVfYXJyYXlfbWFwX2RpcmVjdF92YWx1ZV9hZGRyXCIsXG4gICAgXCJwZXJjcHVfYXJyYXlfbWFwX2RpcmVjdF92YWx1ZV9tZXRhXCJcbiAgXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggaW50cm9kdWNlcyBzdXBwb3J0IGZvciBgLnBlcmNwdWAgZ2xvYmFsIGRhdGEgbWFwcyBpbiBCUEYsIHdoaWNoIHRyYW5zbGF0ZXMgdG8gYEJQRl9NQVBfVFlQRV9QRVJDUFVfQVJSQVlgLiBJdCBhZGRzIG5ldyBtYXAgb3BlcmF0aW9ucyBgbWFwX2RpcmVjdF92YWx1ZV9hZGRyYCBhbmQgYG1hcF9kaXJlY3RfdmFsdWVfbWV0YWAgZm9yIHBlcmNwdSBhcnJheXMsIGFuZCBtb2RpZmllcyB0aGUgdmVyaWZpZXIgdG8gaGFuZGxlIHBlcmNwdSBhcnJheSBhY2Nlc3NlcyBhbmQgcGF0Y2ggaW5zdHJ1Y3Rpb25zIGZvciBKSVQuIFRoaXMgaXMgYSBmdW5jdGlvbmFsIGNoYW5nZSBpbiB0aGUgY29yZSBCUEYgc3Vic3lzdGVtIGFuZCBzaG91bGQgYmUgZnV6emVkLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wNi0yOVQxNjozOTozMC40MjkzMTM4MzZaIiwiU2VxIjoxLCJOZXN0aW5nIjoxLCJUeXBlIjoiYWN0aW9uIiwiTmFtZSI6InJlYWQtcGF0Y2gtZGlmZiIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjEyODk3NTkxNjcsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIlBhdGNoRGlmZlwiOiBcImNvbW1pdCA2YmY3NzE0MjdiM2NkNDg1MmM5NzBkNmI0NGIzYzAxYmQxOGNhNzMwXFxuQXV0aG9yOiBzeXotY2x1c3RlciBcXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cXHUwMDNlXFxuRGF0ZTogICBNb24gSnVuIDI5IDE2OjM5OjI4IDIwMjYgKzAwMDBcXG5cXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XFxuXFxuZGlmZiAtLWdpdCBhL2tlcm5lbC9icGYvYXJyYXltYXAuYyBiL2tlcm5lbC9icGYvYXJyYXltYXAuY1xcbmluZGV4IDI0OGI0ODE4MTc4Y2QxLi5jNGU5NDMwOTQxZTU0OSAxMDA2NDRcXG4tLS0gYS9rZXJuZWwvYnBmL2FycmF5bWFwLmNcXG4rKysgYi9rZXJuZWwvYnBmL2FycmF5bWFwLmNcXG5AQCAtMjU5LDYgKzI1OSwzNyBAQCBzdGF0aWMgdm9pZCAqcGVyY3B1X2FycmF5X21hcF9sb29rdXBfZWxlbShzdHJ1Y3QgYnBmX21hcCAqbWFwLCB2b2lkICprZXkpXFxuIFxcdHJldHVybiB0aGlzX2NwdV9wdHIoYXJyYXktXFx1MDAzZXBwdHJzW2luZGV4IFxcdTAwMjYgYXJyYXktXFx1MDAzZWluZGV4X21hc2tdKTtcXG4gfVxcbiBcXG4rc3RhdGljIGludCBwZXJjcHVfYXJyYXlfbWFwX2RpcmVjdF92YWx1ZV9hZGRyKGNvbnN0IHN0cnVjdCBicGZfbWFwICptYXAsIHU2NCAqaW1tLCB1MzIgb2ZmKVxcbit7XFxuK1xcdHN0cnVjdCBicGZfYXJyYXkgKmFycmF5ID0gY29udGFpbmVyX29mKG1hcCwgc3RydWN0IGJwZl9hcnJheSwgbWFwKTtcXG4rXFxuK1xcdGlmIChtYXAtXFx1MDAzZW1heF9lbnRyaWVzICE9IDEpXFxuK1xcdFxcdHJldHVybiAtRU9QTk9UU1VQUDtcXG4rXFx0aWYgKG9mZiBcXHUwMDNlPSBtYXAtXFx1MDAzZXZhbHVlX3NpemUpXFxuK1xcdFxcdHJldHVybiAtRUlOVkFMO1xcbitcXHRpZiAoIWJwZl9qaXRfc3VwcG9ydHNfcGVyY3B1X2luc24oKSlcXG4rXFx0XFx0cmV0dXJuIC1FT1BOT1RTVVBQO1xcbitcXG4rXFx0KmltbSA9ICh1NjQpKF9fZm9yY2UgdW5zaWduZWQgbG9uZykgYXJyYXktXFx1MDAzZXBwdHJzWzBdO1xcbitcXHRyZXR1cm4gMDtcXG4rfVxcbitcXG4rc3RhdGljIGludCBwZXJjcHVfYXJyYXlfbWFwX2RpcmVjdF92YWx1ZV9tZXRhKGNvbnN0IHN0cnVjdCBicGZfbWFwICptYXAsIHU2NCBpbW0sIHUzMiAqb2ZmKVxcbit7XFxuK1xcdHN0cnVjdCBicGZfYXJyYXkgKmFycmF5ID0gY29udGFpbmVyX29mKG1hcCwgc3RydWN0IGJwZl9hcnJheSwgbWFwKTtcXG4rXFx0dTY0IGJhc2UgPSAodTY0KShfX2ZvcmNlIHVuc2lnbmVkIGxvbmcpIGFycmF5LVxcdTAwM2VwcHRyc1swXTtcXG4rXFxuK1xcdGlmIChtYXAtXFx1MDAzZW1heF9lbnRyaWVzICE9IDEpXFxuK1xcdFxcdHJldHVybiAtRU9QTk9UU1VQUDtcXG4rXFx0aWYgKGltbSBcXHUwMDNjIGJhc2UgfHwgaW1tIFxcdTAwM2U9IGJhc2UgKyBhcnJheS1cXHUwMDNlZWxlbV9zaXplKVxcbitcXHRcXHRyZXR1cm4gLUVOT0VOVDtcXG4rXFx0aWYgKCFicGZfaml0X3N1cHBvcnRzX3BlcmNwdV9pbnNuKCkpXFxuK1xcdFxcdHJldHVybiAtRU9QTk9UU1VQUDtcXG4rXFxuK1xcdCpvZmYgPSBpbW0gLSBiYXNlO1xcbitcXHRyZXR1cm4gMDtcXG4rfVxcbitcXG4gLyogZW1pdCBCUEYgaW5zdHJ1Y3Rpb25zIGVxdWl2YWxlbnQgdG8gQyBjb2RlIG9mIHBlcmNwdV9hcnJheV9tYXBfbG9va3VwX2VsZW0oKSAqL1xcbiBzdGF0aWMgaW50IHBlcmNwdV9hcnJheV9tYXBfZ2VuX2xvb2t1cChzdHJ1Y3QgYnBmX21hcCAqbWFwLCBzdHJ1Y3QgYnBmX2luc24gKmluc25fYnVmKVxcbiB7XFxuQEAgLTU1MSw5ICs1ODIsMTAgQEAgc3RhdGljIGludCBhcnJheV9tYXBfY2hlY2tfYnRmKHN0cnVjdCBicGZfbWFwICptYXAsXFxuIFxcdFxcdFxcdCAgICAgICBjb25zdCBzdHJ1Y3QgYnRmX3R5cGUgKmtleV90eXBlLFxcbiBcXHRcXHRcXHQgICAgICAgY29uc3Qgc3RydWN0IGJ0Zl90eXBlICp2YWx1ZV90eXBlKVxcbiB7XFxuLVxcdC8qIE9uZSBleGNlcHRpb24gZm9yIGtleWxlc3MgQlRGOiAuYnNzLy5kYXRhLy5yb2RhdGEgbWFwICovXFxuK1xcdC8qIE9uZSBleGNlcHRpb24gZm9yIGtleWxlc3MgQlRGOiAuYnNzLy5kYXRhLy5yb2RhdGEvLnBlcmNwdSBtYXAgKi9cXG4gXFx0aWYgKGJ0Zl90eXBlX2lzX3ZvaWQoa2V5X3R5cGUpKSB7XFxuLVxcdFxcdGlmIChtYXAtXFx1MDAzZW1hcF90eXBlICE9IEJQRl9NQVBfVFlQRV9BUlJBWSB8fFxcbitcXHRcXHRpZiAoKG1hcC1cXHUwMDNlbWFwX3R5cGUgIT0gQlBGX01BUF9UWVBFX0FSUkFZIFxcdTAwMjZcXHUwMDI2XFxuK1xcdFxcdCAgICAgbWFwLVxcdTAwM2VtYXBfdHlwZSAhPSBCUEZfTUFQX1RZUEVfUEVSQ1BVX0FSUkFZKSB8fFxcbiBcXHRcXHQgICAgbWFwLVxcdTAwM2VtYXhfZW50cmllcyAhPSAxKVxcbiBcXHRcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG4gXFxuQEAgLTgzMiw2ICs4NjQsOCBAQCBjb25zdCBzdHJ1Y3QgYnBmX21hcF9vcHMgcGVyY3B1X2FycmF5X21hcF9vcHMgPSB7XFxuIFxcdC5tYXBfZ2V0X25leHRfa2V5ID0gYnBmX2FycmF5X2dldF9uZXh0X2tleSxcXG4gXFx0Lm1hcF9sb29rdXBfZWxlbSA9IHBlcmNwdV9hcnJheV9tYXBfbG9va3VwX2VsZW0sXFxuIFxcdC5tYXBfZ2VuX2xvb2t1cCA9IHBlcmNwdV9hcnJheV9tYXBfZ2VuX2xvb2t1cCxcXG4rXFx0Lm1hcF9kaXJlY3RfdmFsdWVfYWRkciA9IHBlcmNwdV9hcnJheV9tYXBfZGlyZWN0X3ZhbHVlX2FkZHIsXFxuK1xcdC5tYXBfZGlyZWN0X3ZhbHVlX21ldGEgPSBwZXJjcHVfYXJyYXlfbWFwX2RpcmVjdF92YWx1ZV9tZXRhLFxcbiBcXHQubWFwX3VwZGF0ZV9lbGVtID0gYXJyYXlfbWFwX3VwZGF0ZV9lbGVtLFxcbiBcXHQubWFwX2RlbGV0ZV9lbGVtID0gYXJyYXlfbWFwX2RlbGV0ZV9lbGVtLFxcbiBcXHQubWFwX2xvb2t1cF9wZXJjcHVfZWxlbSA9IHBlcmNwdV9hcnJheV9tYXBfbG9va3VwX3BlcmNwdV9lbGVtLFxcbmRpZmYgLS1naXQgYS9rZXJuZWwvYnBmL2NvbnN0X2ZvbGQuYyBiL2tlcm5lbC9icGYvY29uc3RfZm9sZC5jXFxuaW5kZXggYjJhMTlhY2FkYjkxZWMuLjU3ODcyNDZiZWYzMDEwIDEwMDY0NFxcbi0tLSBhL2tlcm5lbC9icGYvY29uc3RfZm9sZC5jXFxuKysrIGIva2VybmVsL2JwZi9jb25zdF9mb2xkLmNcXG5AQCAtMTgyLDcgKzE4Miw2IEBAIHN0YXRpYyB2b2lkIGNvbnN0X3JlZ194ZmVyKHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsIHN0cnVjdCBjb25zdF9hcmdfaW5mbyAqXFxuIFxcdFxcdHU2NCB2YWwgPSAwO1xcbiBcXG4gXFx0XFx0aWYgKCFicGZfbWFwX2lzX3Jkb25seShtYXApIHx8ICFtYXAtXFx1MDAzZW9wcy1cXHUwMDNlbWFwX2RpcmVjdF92YWx1ZV9hZGRyIHx8XFxuLVxcdFxcdCAgICBtYXAtXFx1MDAzZW1hcF90eXBlID09IEJQRl9NQVBfVFlQRV9JTlNOX0FSUkFZIHx8XFxuIFxcdFxcdCAgICBvZmYgXFx1MDAzYyAwIHx8IG9mZiArIHNpemUgXFx1MDAzZSBtYXAtXFx1MDAzZXZhbHVlX3NpemUgfHxcXG4gXFx0XFx0ICAgIGJwZl9tYXBfZGlyZWN0X3JlYWQobWFwLCBvZmYsIHNpemUsIFxcdTAwMjZ2YWwsIGlzX2xkc3gpKSB7XFxuIFxcdFxcdFxcdCpkc3QgPSB1bmtub3duO1xcbmRpZmYgLS1naXQgYS9rZXJuZWwvYnBmL2ZpeHVwcy5jIGIva2VybmVsL2JwZi9maXh1cHMuY1xcbmluZGV4IDNjZjJjYzZlM2FiNjZhLi40Zjg0ZDA4N2NhNjllMyAxMDA2NDRcXG4tLS0gYS9rZXJuZWwvYnBmL2ZpeHVwcy5jXFxuKysrIGIva2VybmVsL2JwZi9maXh1cHMuY1xcbkBAIC0xODE5LDYgKzE4MTksMzggQEAgaW50IGJwZl9kb19taXNjX2ZpeHVwcyhzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52KVxcbiBcXHRcXHRcXHRnb3RvIG5leHRfaW5zbjtcXG4gXFx0XFx0fVxcbiBcXG4rXFx0XFx0aWYgKGVudi1cXHUwMDNlcHJvZy1cXHUwMDNlaml0X3JlcXVlc3RlZCBcXHUwMDI2XFx1MDAyNlxcbitcXHRcXHQgICAgYnBmX2ppdF9zdXBwb3J0c19wZXJjcHVfaW5zbigpIFxcdTAwMjZcXHUwMDI2XFxuK1xcdFxcdCAgICBpbnNuLVxcdTAwM2Vjb2RlID09IChCUEZfTEQgfCBCUEZfSU1NIHwgQlBGX0RXKSBcXHUwMDI2XFx1MDAyNlxcbitcXHRcXHQgICAgKGluc24tXFx1MDAzZXNyY19yZWcgPT0gQlBGX1BTRVVET19NQVBfVkFMVUUgfHxcXG4rXFx0XFx0ICAgICBpbnNuLVxcdTAwM2VzcmNfcmVnID09IEJQRl9QU0VVRE9fTUFQX0lEWF9WQUxVRSkpIHtcXG4rXFx0XFx0XFx0c3RydWN0IGJwZl9tYXAgKm1hcDtcXG4rXFxuK1xcdFxcdFxcdGF1eCA9IFxcdTAwMjZlbnYtXFx1MDAzZWluc25fYXV4X2RhdGFbaSArIGRlbHRhXTtcXG4rXFx0XFx0XFx0bWFwID0gZW52LVxcdTAwM2V1c2VkX21hcHNbYXV4LVxcdTAwM2VtYXBfaW5kZXhdO1xcbitcXHRcXHRcXHRpZiAobWFwLVxcdTAwM2VtYXBfdHlwZSAhPSBCUEZfTUFQX1RZUEVfUEVSQ1BVX0FSUkFZKVxcbitcXHRcXHRcXHRcXHRnb3RvIG5leHRfaW5zbjtcXG4rXFxuK1xcdFxcdFxcdC8qXFxuK1xcdFxcdFxcdCAqIFJldXNlIHRoZSBvcmlnaW5hbCBsZF9pbW02NCBpbnNuLCBhbmQgYWRkIG9uZVxcbitcXHRcXHRcXHQgKiBtb3Y2NF9wZXJjcHVfcmVnIGluc24uXFxuK1xcdFxcdFxcdCAqL1xcbitcXG4rXFx0XFx0XFx0aW5zbl9idWZbMF0gPSBpbnNuWzFdO1xcbitcXHRcXHRcXHRpbnNuX2J1ZlsxXSA9IEJQRl9NT1Y2NF9QRVJDUFVfUkVHKGluc24tXFx1MDAzZWRzdF9yZWcsIGluc24tXFx1MDAzZWRzdF9yZWcpO1xcbitcXHRcXHRcXHRjbnQgPSAyO1xcbitcXG4rXFx0XFx0XFx0aSsrO1xcbitcXHRcXHRcXHRuZXdfcHJvZyA9IGJwZl9wYXRjaF9pbnNuX2RhdGEoZW52LCBpICsgZGVsdGEsIGluc25fYnVmLCBjbnQpO1xcbitcXHRcXHRcXHRpZiAoIW5ld19wcm9nKVxcbitcXHRcXHRcXHRcXHRyZXR1cm4gLUVOT01FTTtcXG4rXFxuK1xcdFxcdFxcdGRlbHRhICAgICs9IGNudCAtIDE7XFxuK1xcdFxcdFxcdGVudi1cXHUwMDNlcHJvZyA9IHByb2cgPSBuZXdfcHJvZztcXG4rXFx0XFx0XFx0aW5zbiAgICAgID0gbmV3X3Byb2ctXFx1MDAzZWluc25zaSArIGkgKyBkZWx0YTtcXG4rXFx0XFx0XFx0Z290byBuZXh0X2luc247XFxuK1xcdFxcdH1cXG4rXFxuIFxcdFxcdGlmIChpbnNuLVxcdTAwM2Vjb2RlICE9IChCUEZfSk1QIHwgQlBGX0NBTEwpKVxcbiBcXHRcXHRcXHRnb3RvIG5leHRfaW5zbjtcXG4gXFx0XFx0aWYgKGluc24tXFx1MDAzZXNyY19yZWcgPT0gQlBGX1BTRVVET19DQUxMKVxcbmRpZmYgLS1naXQgYS9rZXJuZWwvYnBmL3ZlcmlmaWVyLmMgYi9rZXJuZWwvYnBmL3ZlcmlmaWVyLmNcXG5pbmRleCAyNWFlYTQyNzFjZDA4OS4uZGJmNzZmYTlkNDNkOGUgMTAwNjQ0XFxuLS0tIGEva2VybmVsL2JwZi92ZXJpZmllci5jXFxuKysrIGIva2VybmVsL2JwZi92ZXJpZmllci5jXFxuQEAgLTY1Miw3ICs2NTIsNiBAQCBzdGF0aWMgdm9pZCBfX21hcmtfZHlucHRyX3JlZyhzdHJ1Y3QgYnBmX3JlZ19zdGF0ZSAqcmVnLFxcbiBcXHRcXHRcXHQgICAgICBlbnVtIGJwZl9keW5wdHJfdHlwZSB0eXBlLFxcbiBcXHRcXHRcXHQgICAgICBib29sIGZpcnN0X3Nsb3QsIGludCBpZCwgaW50IHBhcmVudF9pZCk7XFxuIFxcbi1cXG4gc3RhdGljIHZvaWQgbWFya19keW5wdHJfc3RhY2tfcmVncyhzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52LFxcbiBcXHRcXHRcXHRcXHQgICBzdHJ1Y3QgYnBmX3JlZ19zdGF0ZSAqc3JlZzEsXFxuIFxcdFxcdFxcdFxcdCAgIHN0cnVjdCBicGZfcmVnX3N0YXRlICpzcmVnMixcXG5AQCAtMTY4OSw3ICsxNjg4LDYgQEAgc3RhdGljIGJvb2wgc2FtZV9jYWxsc2l0ZXMoc3RydWN0IGJwZl92ZXJpZmllcl9zdGF0ZSAqYSwgc3RydWN0IGJwZl92ZXJpZmllcl9zdGFcXG4gXFx0cmV0dXJuIHRydWU7XFxuIH1cXG4gXFxuLVxcbiB2b2lkIGJwZl9mcmVlX2JhY2tlZGdlcyhzdHJ1Y3QgYnBmX3NjY192aXNpdCAqdmlzaXQpXFxuIHtcXG4gXFx0c3RydWN0IGJwZl9zY2NfYmFja2VkZ2UgKmJhY2tlZGdlLCAqbmV4dDtcXG5AQCAtMjMwOSw3ICsyMzA3LDYgQEAgc3RhdGljIHN0cnVjdCBicGZfdmVyaWZpZXJfc3RhdGUgKnB1c2hfYXN5bmNfY2Ioc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudixcXG4gXFx0cmV0dXJuIFxcdTAwMjZlbGVtLVxcdTAwM2VzdDtcXG4gfVxcbiBcXG4tXFxuIHN0YXRpYyBpbnQgY21wX3N1YnByb2dzKGNvbnN0IHZvaWQgKmEsIGNvbnN0IHZvaWQgKmIpXFxuIHtcXG4gXFx0cmV0dXJuICgoc3RydWN0IGJwZl9zdWJwcm9nX2luZm8gKilhKS1cXHUwMDNlc3RhcnQgLVxcbkBAIC0zMzMxLDcgKzMzMjgsNiBAQCBzdGF0aWMgYm9vbCBpc19zcGlsbGFibGVfcmVndHlwZShlbnVtIGJwZl9yZWdfdHlwZSB0eXBlKVxcbiBcXHR9XFxuIH1cXG4gXFxuLVxcbiAvKiBjaGVjayBpZiByZWdpc3RlciBpcyBhIGNvbnN0YW50IHNjYWxhciB2YWx1ZSAqL1xcbiBzdGF0aWMgYm9vbCBpc19yZWdfY29uc3Qoc3RydWN0IGJwZl9yZWdfc3RhdGUgKnJlZywgYm9vbCBzdWJyZWczMilcXG4ge1xcbkBAIC00MDI1LDcgKzQwMjEsNiBAQCBzdGF0aWMgaW50IGNoZWNrX3N0YWNrX3JlYWQoc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudixcXG4gXFx0cmV0dXJuIGVycjtcXG4gfVxcbiBcXG4tXFxuIC8qIGNoZWNrX3N0YWNrX3dyaXRlIGRpc3BhdGNoZXMgdG8gY2hlY2tfc3RhY2tfd3JpdGVfZml4ZWRfb2ZmIG9yXFxuICAqIGNoZWNrX3N0YWNrX3dyaXRlX3Zhcl9vZmYuXFxuICAqXFxuQEAgLTQ4MjAsNyArNDgxNSw2IEBAIHN0YXRpYyBpbnQgY2hlY2tfc29ja19hY2Nlc3Moc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudiwgaW50IGluc25faWR4LFxcbiBcXHRcXHR2YWxpZCA9IGZhbHNlO1xcbiBcXHR9XFxuIFxcbi1cXG4gXFx0aWYgKHZhbGlkKSB7XFxuIFxcdFxcdGVudi1cXHUwMDNlaW5zbl9hdXhfZGF0YVtpbnNuX2lkeF0uY3R4X2ZpZWxkX3NpemUgPVxcbiBcXHRcXHRcXHRpbmZvLmN0eF9maWVsZF9zaXplO1xcbkBAIC01NjAwLDYgKzU1OTQsOCBAQCBpbnQgYnBmX21hcF9kaXJlY3RfcmVhZChzdHJ1Y3QgYnBmX21hcCAqbWFwLCBpbnQgb2ZmLCBpbnQgc2l6ZSwgdTY0ICp2YWwsXFxuIFxcdHU2NCBhZGRyO1xcbiBcXHRpbnQgZXJyO1xcbiBcXG4rXFx0aWYgKG1hcC1cXHUwMDNlbWFwX3R5cGUgPT0gQlBGX01BUF9UWVBFX0lOU05fQVJSQVkgfHwgbWFwLVxcdTAwM2VtYXBfdHlwZSA9PSBCUEZfTUFQX1RZUEVfUEVSQ1BVX0FSUkFZKVxcbitcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG4gXFx0ZXJyID0gbWFwLVxcdTAwM2VvcHMtXFx1MDAzZW1hcF9kaXJlY3RfdmFsdWVfYWRkcihtYXAsIFxcdTAwMjZhZGRyLCBvZmYpO1xcbiBcXHRpZiAoZXJyKVxcbiBcXHRcXHRyZXR1cm4gZXJyO1xcbkBAIC02MTU1LDYgKzYxNTEsNyBAQCBzdGF0aWMgaW50IGNoZWNrX21lbV9hY2Nlc3Moc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudiwgaW50IGluc25faWR4LCBzdHJ1Y3QgYlxcbiBcXHRcXHRcXHRpZiAodG51bV9pc19jb25zdChyZWctXFx1MDAzZXZhcl9vZmYpIFxcdTAwMjZcXHUwMDI2XFxuIFxcdFxcdFxcdCAgICBicGZfbWFwX2lzX3Jkb25seShtYXApIFxcdTAwMjZcXHUwMDI2XFxuIFxcdFxcdFxcdCAgICBtYXAtXFx1MDAzZW9wcy1cXHUwMDNlbWFwX2RpcmVjdF92YWx1ZV9hZGRyIFxcdTAwMjZcXHUwMDI2XFxuK1xcdFxcdFxcdCAgICBtYXAtXFx1MDAzZW1hcF90eXBlICE9IEJQRl9NQVBfVFlQRV9QRVJDUFVfQVJSQVkgXFx1MDAyNlxcdTAwMjZcXG4gXFx0XFx0XFx0ICAgIG1hcC1cXHUwMDNlbWFwX3R5cGUgIT0gQlBGX01BUF9UWVBFX0lOU05fQVJSQVkpIHtcXG4gXFx0XFx0XFx0XFx0aW50IG1hcF9vZmYgPSBvZmYgKyByZWctXFx1MDAzZXZhcl9vZmYudmFsdWU7XFxuIFxcdFxcdFxcdFxcdHU2NCB2YWwgPSAwO1xcbkBAIC02NjQ1LDcgKzY2NDIsNiBAQCBzdGF0aWMgaW50IGNoZWNrX3N0YWNrX3JhbmdlX2luaXRpYWxpemVkKFxcbiBcXHRpZiAoZXJyKVxcbiBcXHRcXHRyZXR1cm4gZXJyO1xcbiBcXG4tXFxuIFxcdGlmICh0bnVtX2lzX2NvbnN0KHJlZy1cXHUwMDNldmFyX29mZikpIHtcXG4gXFx0XFx0bWluX29mZiA9IG1heF9vZmYgPSByZWctXFx1MDAzZXZhcl9vZmYudmFsdWUgKyBvZmY7XFxuIFxcdH0gZWxzZSB7XFxuQEAgLTczNTksNyArNzM1NSw2IEBAIHN0YXRpYyBib29sIGlzX2l0ZXJfbmV3X2tmdW5jKHN0cnVjdCBicGZfa2Z1bmNfY2FsbF9hcmdfbWV0YSAqbWV0YSlcXG4gXFx0cmV0dXJuIG1ldGEtXFx1MDAzZWtmdW5jX2ZsYWdzIFxcdTAwMjYgS0ZfSVRFUl9ORVc7XFxuIH1cXG4gXFxuLVxcbiBzdGF0aWMgYm9vbCBpc19pdGVyX2Rlc3Ryb3lfa2Z1bmMoc3RydWN0IGJwZl9rZnVuY19jYWxsX2FyZ19tZXRhICptZXRhKVxcbiB7XFxuIFxcdHJldHVybiBtZXRhLVxcdTAwM2VrZnVuY19mbGFncyBcXHUwMDI2IEtGX0lURVJfREVTVFJPWTtcXG5AQCAtODEyNSw2ICs4MTIwLDEyIEBAIHN0YXRpYyBpbnQgY2hlY2tfYXJnX2NvbnN0X3N0cihzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52LFxcbiBcXHRcXHRyZXR1cm4gLUVBQ0NFUztcXG4gXFx0fVxcbiBcXG4rXFx0aWYgKG1hcC1cXHUwMDNlbWFwX3R5cGUgPT0gQlBGX01BUF9UWVBFX1BFUkNQVV9BUlJBWSkge1xcbitcXHRcXHR2ZXJib3NlKGVudiwgXFxcIiVzIHBvaW50cyB0byBwZXJjcHVfYXJyYXkgbWFwIHdoaWNoIGNhbm5vdCBiZSB1c2VkIGFzIGNvbnN0IHN0cmluZ1xcXFxuXFxcIixcXG4rXFx0XFx0XFx0cmVnX2FyZ19uYW1lKGVudiwgYXJnbm8pKTtcXG4rXFx0XFx0cmV0dXJuIC1FQUNDRVM7XFxuK1xcdH1cXG4rXFxuIFxcdGlmICghYnBmX21hcF9pc19yZG9ubHkobWFwKSkge1xcbiBcXHRcXHR2ZXJib3NlKGVudiwgXFxcIiVzIGRvZXMgbm90IHBvaW50IHRvIGEgcmVhZG9ubHkgbWFwJ1xcXFxuXFxcIiwgcmVnX2FyZ19uYW1lKGVudiwgYXJnbm8pKTtcXG4gXFx0XFx0cmV0dXJuIC1FQUNDRVM7XFxuQEAgLTExNTAyLDcgKzExNTAzLDYgQEAgc3RhdGljIGludCBwcm9jZXNzX2lycV9mbGFnKHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsIHN0cnVjdCBicGZfcmVnX3N0YXRlICpcXG4gXFx0cmV0dXJuIDA7XFxuIH1cXG4gXFxuLVxcbiBzdGF0aWMgaW50IHJlZl9zZXRfbm9uX293bmluZyhzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52LCBzdHJ1Y3QgYnBmX3JlZ19zdGF0ZSAqcmVnKVxcbiB7XFxuIFxcdHN0cnVjdCBidGZfcmVjb3JkICpyZWMgPSByZWdfYnRmX3JlY29yZChyZWcpO1xcbkBAIC0xNjM5NCw3ICsxNjM5NCw2IEBAIHN0YXRpYyBpbnQgY2hlY2tfbGRfYWJzKHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsIHN0cnVjdCBicGZfaW5zbiAqaW5zbilcXG4gXFx0cmV0dXJuIDA7XFxuIH1cXG4gXFxuLVxcbiBzdGF0aWMgYm9vbCByZXR1cm5fcmV0dmFsX3JhbmdlKHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsIHN0cnVjdCBicGZfcmV0dmFsX3JhbmdlICpyYW5nZSlcXG4ge1xcbiBcXHRlbnVtIGJwZl9wcm9nX3R5cGUgcHJvZ190eXBlID0gcmVzb2x2ZV9wcm9nX3R5cGUoZW52LVxcdTAwM2Vwcm9nKTtcXG5AQCAtMTgyMTMsNiArMTgyMTIsMTIgQEAgc3RhdGljIGludCBjaGVja19hbmRfcmVzb2x2ZV9pbnNucyhzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52KVxcbiBcXHRcXHRcXHRcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG4gXFx0XFx0XFx0XFx0fVxcbiBcXG4rXFx0XFx0XFx0XFx0aWYgKG1hcC1cXHUwMDNlbWFwX3R5cGUgPT0gQlBGX01BUF9UWVBFX1BFUkNQVV9BUlJBWSBcXHUwMDI2XFx1MDAyNlxcbitcXHRcXHRcXHRcXHQgICAgIWVudi1cXHUwMDNlcHJvZy1cXHUwMDNlaml0X3JlcXVlc3RlZCkge1xcbitcXHRcXHRcXHRcXHRcXHR2ZXJib3NlKGVudiwgXFxcIkpJVCBpcyByZXF1aXJlZCB0byB1c2UgZ2xvYmFsIHBlcmNwdSBkYXRhXFxcXG5cXFwiKTtcXG4rXFx0XFx0XFx0XFx0XFx0cmV0dXJuIC1FT1BOT1RTVVBQO1xcbitcXHRcXHRcXHRcXHR9XFxuK1xcbiBcXHRcXHRcXHRcXHRlcnIgPSBtYXAtXFx1MDAzZW9wcy1cXHUwMDNlbWFwX2RpcmVjdF92YWx1ZV9hZGRyKG1hcCwgXFx1MDAyNmFkZHIsIG9mZik7XFxuIFxcdFxcdFxcdFxcdGlmIChlcnIpIHtcXG4gXFx0XFx0XFx0XFx0XFx0dmVyYm9zZShlbnYsIFxcXCJpbnZhbGlkIGFjY2VzcyB0byBtYXAgdmFsdWUgcG9pbnRlciwgdmFsdWVfc2l6ZT0ldSBvZmY9JXVcXFxcblxcXCIsXFxuQEAgLTE4Mjg4LDggKzE4MjkzLDYgQEAgc3RhdGljIHZvaWQgcmVsZWFzZV9pbnNuX2FycmF5cyhzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52KVxcbiBcXHRcXHRicGZfaW5zbl9hcnJheV9yZWxlYXNlKGVudi1cXHUwMDNlaW5zbl9hcnJheV9tYXBzW2ldKTtcXG4gfVxcbiBcXG4tXFxuLVxcbiAvKiBUaGUgdmVyaWZpZXIgZG9lcyBtb3JlIGRhdGEgZmxvdyBhbmFseXNpcyB0aGFuIGxsdm0gYW5kIHdpbGwgbm90XFxuICAqIGV4cGxvcmUgYnJhbmNoZXMgdGhhdCBhcmUgZGVhZCBhdCBydW4gdGltZS4gTWFsaWNpb3VzIHByb2dyYW1zIGNhblxcbiAgKiBoYXZlIGRlYWQgY29kZSB0b28uIFRoZXJlZm9yZSByZXBsYWNlIGFsbCBkZWFkIGF0LXJ1bi10aW1lIGNvZGVcXG5AQCAtMTgzMTcsOCArMTgzMjAsNiBAQCBzdGF0aWMgdm9pZCBzYW5pdGl6ZV9kZWFkX2NvZGUoc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudilcXG4gXFx0fVxcbiB9XFxuIFxcbi1cXG4tXFxuIHN0YXRpYyB2b2lkIGZyZWVfc3RhdGVzKHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYpXFxuIHtcXG4gXFx0c3RydWN0IGJwZl92ZXJpZmllcl9zdGF0ZV9saXN0ICpzbDtcXG5AQCAtMTg2MDAsNyArMTg2MDEsNiBAQCBzdGF0aWMgaW50IGRvX2NoZWNrX21haW4oc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudilcXG4gXFx0cmV0dXJuIHJldDtcXG4gfVxcbiBcXG4tXFxuIHN0YXRpYyB2b2lkIHByaW50X3ZlcmlmaWNhdGlvbl9zdGF0cyhzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52KVxcbiB7XFxuIFxcdC8qIFNraXAgb3ZlciBoaWRkZW4gc3VicHJvZ3Mgd2hpY2ggYXJlIG5vdCB2ZXJpZmllZC4gKi9cXG5kaWZmIC0tZ2l0IGEvdG9vbHMvYnBmL2JwZnRvb2wvZ2VuLmMgYi90b29scy9icGYvYnBmdG9vbC9nZW4uY1xcbmluZGV4IDZhZTcyNjJlYmUwYzFkLi4yZTYwMjk2MzU4ZGI1ZSAxMDA2NDRcXG4tLS0gYS90b29scy9icGYvYnBmdG9vbC9nZW4uY1xcbisrKyBiL3Rvb2xzL2JwZi9icGZ0b29sL2dlbi5jXFxuQEAgLTkyLDcgKzkyLDcgQEAgc3RhdGljIHZvaWQgZ2V0X2hlYWRlcl9ndWFyZChjaGFyICpndWFyZCwgY29uc3QgY2hhciAqb2JqX25hbWUsIGNvbnN0IGNoYXIgKnN1ZmZcXG4gXFxuIHN0YXRpYyBib29sIGdldF9tYXBfaWRlbnQoY29uc3Qgc3RydWN0IGJwZl9tYXAgKm1hcCwgY2hhciAqYnVmLCBzaXplX3QgYnVmX3N6KVxcbiB7XFxuLVxcdHN0YXRpYyBjb25zdCBjaGFyICpzZnhzW10gPSB7IFxcXCIuZGF0YVxcXCIsIFxcXCIucm9kYXRhXFxcIiwgXFxcIi5ic3NcXFwiLCBcXFwiLmtjb25maWdcXFwiIH07XFxuK1xcdHN0YXRpYyBjb25zdCBjaGFyICpzZnhzW10gPSB7IFxcXCIuZGF0YVxcXCIsIFxcXCIucm9kYXRhXFxcIiwgXFxcIi5ic3NcXFwiLCBcXFwiLnBlcmNwdVxcXCIsIFxcXCIua2NvbmZpZ1xcXCIgfTtcXG4gXFx0Y29uc3QgY2hhciAqbmFtZSA9IGJwZl9tYXBfX25hbWUobWFwKTtcXG4gXFx0aW50IGksIG47XFxuIFxcbkBAIC0xMTcsNyArMTE3LDcgQEAgc3RhdGljIGJvb2wgZ2V0X21hcF9pZGVudChjb25zdCBzdHJ1Y3QgYnBmX21hcCAqbWFwLCBjaGFyICpidWYsIHNpemVfdCBidWZfc3opXFxuIFxcbiBzdGF0aWMgYm9vbCBnZXRfZGF0YXNlY19pZGVudChjb25zdCBjaGFyICpzZWNfbmFtZSwgY2hhciAqYnVmLCBzaXplX3QgYnVmX3N6KVxcbiB7XFxuLVxcdHN0YXRpYyBjb25zdCBjaGFyICpwZnhzW10gPSB7IFxcXCIuZGF0YVxcXCIsIFxcXCIucm9kYXRhXFxcIiwgXFxcIi5ic3NcXFwiLCBcXFwiLmtjb25maWdcXFwiIH07XFxuK1xcdHN0YXRpYyBjb25zdCBjaGFyICpwZnhzW10gPSB7IFxcXCIuZGF0YVxcXCIsIFxcXCIucm9kYXRhXFxcIiwgXFxcIi5ic3NcXFwiLCBcXFwiLnBlcmNwdVxcXCIsIFxcXCIua2NvbmZpZ1xcXCIgfTtcXG4gXFx0aW50IGksIG47XFxuIFxcbiBcXHQvKiByZWNvZ25pemUgaGFyZCBjb2RlZCBMTFZNIHNlY3Rpb24gbmFtZSAqL1xcbkBAIC0yNTQsNiArMjU0LDIwIEBAIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYnRmX3R5cGUgKmZpbmRfdHlwZV9mb3JfbWFwKHN0cnVjdCBidGYgKmJ0ZiwgY29uc3QgY2hhciAqbWFwXFxuIFxcdHJldHVybiBOVUxMO1xcbiB9XFxuIFxcbitzdGF0aWMgYm9vbCBicGZfbWFwX2lzX3NrZWxfZGF0YShjb25zdCBzdHJ1Y3QgYnBmX21hcCAqbWFwKVxcbit7XFxuK1xcdGlmICghYnBmX21hcF9faXNfaW50ZXJuYWwobWFwKSlcXG4rXFx0XFx0cmV0dXJuIGZhbHNlO1xcbitcXG4rXFx0aWYgKGJwZl9tYXBfX21hcF9mbGFncyhtYXApIFxcdTAwMjYgQlBGX0ZfTU1BUEFCTEUpXFxuK1xcdFxcdHJldHVybiB0cnVlO1xcbitcXG4rXFx0aWYgKGJwZl9tYXBfX3R5cGUobWFwKSA9PSBCUEZfTUFQX1RZUEVfUEVSQ1BVX0FSUkFZKVxcbitcXHRcXHRyZXR1cm4gdHJ1ZTtcXG4rXFxuK1xcdHJldHVybiBmYWxzZTtcXG4rfVxcbitcXG4gc3RhdGljIGJvb2wgaXNfbW1hcGFibGVfbWFwKGNvbnN0IHN0cnVjdCBicGZfbWFwICptYXAsIGNoYXIgKmJ1Ziwgc2l6ZV90IHN6KVxcbiB7XFxuIFxcdHNpemVfdCB0bXBfc3o7XFxuQEAgLTI2Myw3ICsyNzcsNyBAQCBzdGF0aWMgYm9vbCBpc19tbWFwYWJsZV9tYXAoY29uc3Qgc3RydWN0IGJwZl9tYXAgKm1hcCwgY2hhciAqYnVmLCBzaXplX3Qgc3opXFxuIFxcdFxcdHJldHVybiB0cnVlO1xcbiBcXHR9XFxuIFxcbi1cXHRpZiAoIWJwZl9tYXBfX2lzX2ludGVybmFsKG1hcCkgfHwgIShicGZfbWFwX19tYXBfZmxhZ3MobWFwKSBcXHUwMDI2IEJQRl9GX01NQVBBQkxFKSlcXG4rXFx0aWYgKCFicGZfbWFwX2lzX3NrZWxfZGF0YShtYXApKVxcbiBcXHRcXHRyZXR1cm4gZmFsc2U7XFxuIFxcbiBcXHRpZiAoIWdldF9tYXBfaWRlbnQobWFwLCBidWYsIHN6KSlcXG5AQCAtMzIxLDYgKzMzNSwxMSBAQCBzdGF0aWMgYm9vbCBidGZfaXNfcHRyX3RvX2Z1bmNfcHJvdG8oY29uc3Qgc3RydWN0IGJ0ZiAqYnRmLFxcbiBcXHRyZXR1cm4gYnRmX2lzX3B0cih2KSBcXHUwMDI2XFx1MDAyNiBidGZfaXNfZnVuY19wcm90byhidGZfX3R5cGVfYnlfaWQoYnRmLCB2LVxcdTAwM2V0eXBlKSk7XFxuIH1cXG4gXFxuK3N0YXRpYyBib29sIGJwZl9tYXBfaXNfcGVyY3B1X2RhdGEoY29uc3Qgc3RydWN0IGJwZl9tYXAgKm1hcClcXG4re1xcbitcXHRyZXR1cm4gYnBmX21hcF9faXNfaW50ZXJuYWwobWFwKSBcXHUwMDI2XFx1MDAyNiBicGZfbWFwX190eXBlKG1hcCkgPT0gQlBGX01BUF9UWVBFX1BFUkNQVV9BUlJBWTtcXG4rfVxcbitcXG4gc3RhdGljIGludCBjb2RlZ2VuX3N1YnNrZWxfZGF0YXNlY3Moc3RydWN0IGJwZl9vYmplY3QgKm9iaiwgY29uc3QgY2hhciAqb2JqX25hbWUpXFxuIHtcXG4gXFx0c3RydWN0IGJ0ZiAqYnRmID0gYnBmX29iamVjdF9fYnRmKG9iaik7XFxuQEAgLTM0Myw2ICszNjIsOSBAQCBzdGF0aWMgaW50IGNvZGVnZW5fc3Vic2tlbF9kYXRhc2VjcyhzdHJ1Y3QgYnBmX29iamVjdCAqb2JqLCBjb25zdCBjaGFyICpvYmpfbmFtZVxcbiBcXHRcXHRpZiAoIWlzX21tYXBhYmxlX21hcChtYXAsIG1hcF9pZGVudCwgc2l6ZW9mKG1hcF9pZGVudCkpKVxcbiBcXHRcXHRcXHRjb250aW51ZTtcXG4gXFxuK1xcdFxcdGlmIChicGZfbWFwX2lzX3BlcmNwdV9kYXRhKG1hcCkpXFxuK1xcdFxcdFxcdGNvbnRpbnVlO1xcbitcXG4gXFx0XFx0c2VjID0gZmluZF90eXBlX2Zvcl9tYXAoYnRmLCBtYXBfaWRlbnQpO1xcbiBcXHRcXHRpZiAoIXNlYylcXG4gXFx0XFx0XFx0Y29udGludWU7XFxuQEAgLTY2OCw4ICs2OTAsNyBAQCBzdGF0aWMgdm9pZCBjb2RlZ2VuX2Rlc3Ryb3koc3RydWN0IGJwZl9vYmplY3QgKm9iaiwgY29uc3QgY2hhciAqb2JqX25hbWUpXFxuIFxcdGJwZl9vYmplY3RfX2Zvcl9lYWNoX21hcChtYXAsIG9iaikge1xcbiBcXHRcXHRpZiAoIWdldF9tYXBfaWRlbnQobWFwLCBpZGVudCwgc2l6ZW9mKGlkZW50KSkpXFxuIFxcdFxcdFxcdGNvbnRpbnVlO1xcbi1cXHRcXHRpZiAoYnBmX21hcF9faXNfaW50ZXJuYWwobWFwKSBcXHUwMDI2XFx1MDAyNlxcbi1cXHRcXHQgICAgKGJwZl9tYXBfX21hcF9mbGFncyhtYXApIFxcdTAwMjYgQlBGX0ZfTU1BUEFCTEUpKVxcbitcXHRcXHRpZiAoYnBmX21hcF9pc19za2VsX2RhdGEobWFwKSlcXG4gXFx0XFx0XFx0cHJpbnRmKFxcXCJcXFxcdHNrZWxfZnJlZV9tYXBfZGF0YShza2VsLVxcdTAwM2UlMSRzLCBza2VsLVxcdTAwM2VtYXBzLiUxJHMuaW5pdGlhbF92YWx1ZSwgJTIkenUpO1xcXFxuXFxcIixcXG4gXFx0XFx0XFx0ICAgICAgIGlkZW50LCBicGZfbWFwX21tYXBfc3oobWFwKSk7XFxuIFxcdFxcdGNvZGVnZW4oXFxcIlxcXFxcXG5AQCAtODUwLDYgKzg3MSwyMCBAQCBzdGF0aWMgaW50IGdlbl90cmFjZShzdHJ1Y3QgYnBmX29iamVjdCAqb2JqLCBjb25zdCBjaGFyICpvYmpfbmFtZSwgY29uc3QgY2hhciAqaFxcbiBcXHRcXHRpZiAoIWlzX21tYXBhYmxlX21hcChtYXAsIGlkZW50LCBzaXplb2YoaWRlbnQpKSlcXG4gXFx0XFx0XFx0Y29udGludWU7XFxuIFxcbitcXHRcXHRpZiAoYnBmX21hcF9pc19wZXJjcHVfZGF0YShtYXApKSB7XFxuK1xcdFxcdFxcdGNvZGVnZW4oXFxcIlxcXFxcXG4rXFx0XFx0XFxcXG5cXFxcXFxuK1xcdFxcdFxcdGVyciA9IHNrZWxfcHJvdGVjdF9tYXBfZGF0YShza2VsLVxcdTAwM2UlMSRzLCBcXHUwMDI2c2tlbC1cXHUwMDNlbWFwcy4lMSRzLmluaXRpYWxfdmFsdWUsICUyJHpkKTtcXFxcblxcXFxcXG4rXFx0XFx0XFx0aWYgKGVycilcXHRcXHRcXHRcXHRcXHQgICAgXFxcXG5cXFxcXFxuK1xcdFxcdFxcdFxcdHJldHVybiBlcnI7XFx0XFx0XFx0XFx0ICAgIFxcXFxuXFxcXFxcbitcXHRcXHQjaWZkZWYgX19LRVJORUxfX1xcdFxcdFxcdFxcdFxcdCAgICBcXFxcblxcXFxcXG4rXFx0XFx0XFx0c2tlbC1cXHUwMDNlJTEkcyA9IE5VTEw7XFx0XFx0XFx0XFx0ICAgIFxcXFxuXFxcXFxcbitcXHRcXHQjZW5kaWZcXHRcXHRcXHRcXHRcXHRcXHRcXHQgICAgXFxcXG5cXFxcXFxuK1xcdFxcdFxcdFxcXCIsXFxuK1xcdFxcdFxcdGlkZW50LCBicGZfbWFwX21tYXBfc3oobWFwKSk7XFxuK1xcdFxcdFxcdGNvbnRpbnVlO1xcbitcXHRcXHR9XFxuK1xcbiBcXHRcXHRpZiAoYnBmX21hcF9fbWFwX2ZsYWdzKG1hcCkgXFx1MDAyNiBCUEZfRl9SRE9OTFlfUFJPRylcXG4gXFx0XFx0XFx0bW1hcF9mbGFncyA9IFxcXCJQUk9UX1JFQURcXFwiO1xcbiBcXHRcXHRlbHNlXFxuQEAgLTE3NDAsNiArMTc3NSw4IEBAIHN0YXRpYyBpbnQgZG9fc3Vic2tlbGV0b24oaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxcbiBcXG4gXFx0XFx0aWYgKCFpc19tbWFwYWJsZV9tYXAobWFwLCBpZGVudCwgc2l6ZW9mKGlkZW50KSkpXFxuIFxcdFxcdFxcdGNvbnRpbnVlO1xcbitcXHRcXHRpZiAoYnBmX21hcF9pc19wZXJjcHVfZGF0YShtYXApKVxcbitcXHRcXHRcXHRjb250aW51ZTtcXG4gXFxuIFxcdFxcdG1hcF90eXBlX2lkID0gYnBmX21hcF9fYnRmX3ZhbHVlX3R5cGVfaWQobWFwKTtcXG4gXFx0XFx0aWYgKG1hcF90eXBlX2lkIFxcdTAwM2M9IDApIHtcXG5AQCAtMTg2Myw2ICsxOTAwLDggQEAgc3RhdGljIGludCBkb19zdWJza2VsZXRvbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpXFxuIFxcdGJwZl9vYmplY3RfX2Zvcl9lYWNoX21hcChtYXAsIG9iaikge1xcbiBcXHRcXHRpZiAoIWlzX21tYXBhYmxlX21hcChtYXAsIGlkZW50LCBzaXplb2YoaWRlbnQpKSlcXG4gXFx0XFx0XFx0Y29udGludWU7XFxuK1xcdFxcdGlmIChicGZfbWFwX2lzX3BlcmNwdV9kYXRhKG1hcCkpXFxuK1xcdFxcdFxcdGNvbnRpbnVlO1xcbiBcXG4gXFx0XFx0bWFwX3R5cGVfaWQgPSBicGZfbWFwX19idGZfdmFsdWVfdHlwZV9pZChtYXApO1xcbiBcXHRcXHRpZiAobWFwX3R5cGVfaWQgXFx1MDAzYz0gMClcXG5kaWZmIC0tZ2l0IGEvdG9vbHMvbGliL2JwZi9icGZfZ2VuX2ludGVybmFsLmggYi90b29scy9saWIvYnBmL2JwZl9nZW5faW50ZXJuYWwuaFxcbmluZGV4IDQ5YWY0MjYwYjhlNmI3Li41ZWE4MzgzODA1ZDNiYyAxMDA2NDRcXG4tLS0gYS90b29scy9saWIvYnBmL2JwZl9nZW5faW50ZXJuYWwuaFxcbisrKyBiL3Rvb2xzL2xpYi9icGYvYnBmX2dlbl9pbnRlcm5hbC5oXFxuQEAgLTY2LDcgKzY2LDggQEAgdm9pZCBicGZfZ2VuX19wcm9nX2xvYWQoc3RydWN0IGJwZl9nZW4gKmdlbixcXG4gXFx0XFx0XFx0ZW51bSBicGZfcHJvZ190eXBlIHByb2dfdHlwZSwgY29uc3QgY2hhciAqcHJvZ19uYW1lLFxcbiBcXHRcXHRcXHRjb25zdCBjaGFyICpsaWNlbnNlLCBzdHJ1Y3QgYnBmX2luc24gKmluc25zLCBzaXplX3QgaW5zbl9jbnQsXFxuIFxcdFxcdFxcdHN0cnVjdCBicGZfcHJvZ19sb2FkX29wdHMgKmxvYWRfYXR0ciwgaW50IHByb2dfaWR4KTtcXG4tdm9pZCBicGZfZ2VuX19tYXBfdXBkYXRlX2VsZW0oc3RydWN0IGJwZl9nZW4gKmdlbiwgaW50IG1hcF9pZHgsIHZvaWQgKnZhbHVlLCBfX3UzMiB2YWx1ZV9zaXplKTtcXG4rdm9pZCBicGZfZ2VuX19tYXBfdXBkYXRlX2VsZW0oc3RydWN0IGJwZl9nZW4gKmdlbiwgaW50IG1hcF9pZHgsIHZvaWQgKnZhbHVlLCBfX3UzMiB2YWx1ZV9zaXplLFxcbitcXHRcXHRcXHQgICAgICBfX3U2NCBmbGFncyk7XFxuIHZvaWQgYnBmX2dlbl9fbWFwX2ZyZWV6ZShzdHJ1Y3QgYnBmX2dlbiAqZ2VuLCBpbnQgbWFwX2lkeCk7XFxuIHZvaWQgYnBmX2dlbl9fcmVjb3JkX2F0dGFjaF90YXJnZXQoc3RydWN0IGJwZl9nZW4gKmdlbiwgY29uc3QgY2hhciAqbmFtZSwgZW51bSBicGZfYXR0YWNoX3R5cGUgdHlwZSk7XFxuIHZvaWQgYnBmX2dlbl9fcmVjb3JkX2V4dGVybihzdHJ1Y3QgYnBmX2dlbiAqZ2VuLCBjb25zdCBjaGFyICpuYW1lLCBib29sIGlzX3dlYWssXFxuZGlmZiAtLWdpdCBhL3Rvb2xzL2xpYi9icGYvZmVhdHVyZXMuYyBiL3Rvb2xzL2xpYi9icGYvZmVhdHVyZXMuY1xcbmluZGV4IGI3ZTM4OGY5OWQwYmJkLi5lZjk1ODFjMTEzMDM1NSAxMDA2NDRcXG4tLS0gYS90b29scy9saWIvYnBmL2ZlYXR1cmVzLmNcXG4rKysgYi90b29scy9saWIvYnBmL2ZlYXR1cmVzLmNcXG5AQCAtNjIwLDYgKzYyMCwzOCBAQCBzdGF0aWMgaW50IHByb2JlX2JwZl9zeXNjYWxsX2NvbW1vbl9hdHRycyhpbnQgdG9rZW5fZmQpXFxuIFxcdHJldHVybiBwcm9iZV9zeXNfYnBmX2V4dCgpO1xcbiB9XFxuIFxcbitzdGF0aWMgaW50IHByb2JlX2tlcm5fcGVyY3B1X2RhdGEoaW50IHRva2VuX2ZkKVxcbit7XFxuK1xcdHN0cnVjdCBicGZfaW5zbiBpbnNuc1tdID0ge1xcbitcXHRcXHRCUEZfTERfTUFQX1ZBTFVFKEJQRl9SRUdfMSwgMCwgMCksXFxuK1xcdFxcdEJQRl9MRFhfTUVNKEJQRl9EVywgQlBGX1JFR18wLCBCUEZfUkVHXzEsIDApLFxcbitcXHRcXHRCUEZfRVhJVF9JTlNOKCksXFxuK1xcdH07XFxuK1xcdExJQkJQRl9PUFRTKGJwZl9tYXBfY3JlYXRlX29wdHMsIG1hcF9vcHRzLFxcbitcXHRcXHQudG9rZW5fZmQgPSB0b2tlbl9mZCxcXG4rXFx0XFx0Lm1hcF9mbGFncyA9IHRva2VuX2ZkID8gQlBGX0ZfVE9LRU5fRkQgOiAwLFxcbitcXHQpO1xcbitcXHRMSUJCUEZfT1BUUyhicGZfcHJvZ19sb2FkX29wdHMsIHByb2dfb3B0cyxcXG4rXFx0XFx0LnRva2VuX2ZkID0gdG9rZW5fZmQsXFxuK1xcdFxcdC5wcm9nX2ZsYWdzID0gdG9rZW5fZmQgPyBCUEZfRl9UT0tFTl9GRCA6IDAsXFxuK1xcdCk7XFxuK1xcdGludCByZXQsIG1hcCwgaW5zbl9jbnQgPSBBUlJBWV9TSVpFKGluc25zKTtcXG4rXFxuK1xcdG1hcCA9IGJwZl9tYXBfY3JlYXRlKEJQRl9NQVBfVFlQRV9QRVJDUFVfQVJSQVksIFxcXCJsaWJicGZfcGVyY3B1XFxcIiwgc2l6ZW9mKGludCksIDgsIDEsXFxuK1xcdFxcdFxcdCAgICAgXFx1MDAyNm1hcF9vcHRzKTtcXG4rXFx0aWYgKG1hcCBcXHUwMDNjIDApIHtcXG4rXFx0XFx0cHJfd2FybihcXFwiRXJyb3IgaW4gJXMoKTogJXMuIENvdWxkbid0IGNyZWF0ZSBzaW1wbGUgcGVyY3B1X2FycmF5IG1hcC5cXFxcblxcXCIsXFxuK1xcdFxcdFxcdF9fZnVuY19fLCBlcnJzdHIobWFwKSk7XFxuK1xcdFxcdHJldHVybiBtYXA7XFxuK1xcdH1cXG4rXFxuK1xcdGluc25zWzBdLmltbSA9IG1hcDtcXG4rXFxuK1xcdHJldCA9IGJwZl9wcm9nX2xvYWQoQlBGX1BST0dfVFlQRV9TT0NLRVRfRklMVEVSLCBOVUxMLCBcXFwiR1BMXFxcIiwgaW5zbnMsIGluc25fY250LCBcXHUwMDI2cHJvZ19vcHRzKTtcXG4rXFx0Y2xvc2UobWFwKTtcXG4rXFx0cmV0dXJuIHByb2JlX2ZkKHJldCk7XFxuK31cXG4rXFxuIHR5cGVkZWYgaW50ICgqZmVhdHVyZV9wcm9iZV9mbikoaW50IC8qIHRva2VuX2ZkICovKTtcXG4gXFxuIHN0YXRpYyBzdHJ1Y3Qga2Vybl9mZWF0dXJlX2NhY2hlIGZlYXR1cmVfY2FjaGU7XFxuQEAgLTcwNyw2ICs3MzksOSBAQCBzdGF0aWMgc3RydWN0IGtlcm5fZmVhdHVyZV9kZXNjIHtcXG4gXFx0W0ZFQVRfQlBGX1NZU0NBTExfQ09NTU9OX0FUVFJTXSA9IHtcXG4gXFx0XFx0XFxcIkJQRiBzeXNjYWxsIGNvbW1vbiBhdHRyaWJ1dGVzIHN1cHBvcnRcXFwiLCBwcm9iZV9icGZfc3lzY2FsbF9jb21tb25fYXR0cnMsXFxuIFxcdH0sXFxuK1xcdFtGRUFUX1BFUkNQVV9EQVRBXSA9IHtcXG4rXFx0XFx0XFxcImtlcm5lbCBzdXBwb3J0cyBwZXJjcHUgZGF0YVxcXCIsIHByb2JlX2tlcm5fcGVyY3B1X2RhdGEsXFxuK1xcdH0sXFxuIH07XFxuIFxcbiBib29sIGZlYXRfc3VwcG9ydGVkKHN0cnVjdCBrZXJuX2ZlYXR1cmVfY2FjaGUgKmNhY2hlLCBlbnVtIGtlcm5fZmVhdHVyZV9pZCBmZWF0X2lkKVxcbmRpZmYgLS1naXQgYS90b29scy9saWIvYnBmL2dlbl9sb2FkZXIuYyBiL3Rvb2xzL2xpYi9icGYvZ2VuX2xvYWRlci5jXFxuaW5kZXggYzdmMmQyYWM3YmIzNWYuLjYwYTEyMDRlOWEyNjNjIDEwMDY0NFxcbi0tLSBhL3Rvb2xzL2xpYi9icGYvZ2VuX2xvYWRlci5jXFxuKysrIGIvdG9vbHMvbGliL2JwZi9nZW5fbG9hZGVyLmNcXG5AQCAtMTE5MCw3ICsxMTkwLDcgQEAgdm9pZCBicGZfZ2VuX19wcm9nX2xvYWQoc3RydWN0IGJwZl9nZW4gKmdlbixcXG4gfVxcbiBcXG4gdm9pZCBicGZfZ2VuX19tYXBfdXBkYXRlX2VsZW0oc3RydWN0IGJwZl9nZW4gKmdlbiwgaW50IG1hcF9pZHgsIHZvaWQgKnB2YWx1ZSxcXG4tXFx0XFx0XFx0ICAgICAgX191MzIgdmFsdWVfc2l6ZSlcXG4rXFx0XFx0XFx0ICAgICAgX191MzIgdmFsdWVfc2l6ZSwgX191NjQgZmxhZ3MpXFxuIHtcXG4gXFx0aW50IGF0dHJfc2l6ZSA9IG9mZnNldG9mZW5kKHVuaW9uIGJwZl9hdHRyLCBmbGFncyk7XFxuIFxcdGludCBtYXBfdXBkYXRlX2F0dHIsIHZhbHVlLCBrZXk7XFxuQEAgLTExOTgsNiArMTE5OCw3IEBAIHZvaWQgYnBmX2dlbl9fbWFwX3VwZGF0ZV9lbGVtKHN0cnVjdCBicGZfZ2VuICpnZW4sIGludCBtYXBfaWR4LCB2b2lkICpwdmFsdWUsXFxuIFxcdGludCB6ZXJvID0gMDtcXG4gXFxuIFxcdG1lbXNldChcXHUwMDI2YXR0ciwgMCwgYXR0cl9zaXplKTtcXG4rXFx0YXR0ci5mbGFncyA9IHRndF9lbmRpYW4oZmxhZ3MpO1xcbiBcXG4gXFx0dmFsdWUgPSBhZGRfZGF0YShnZW4sIHB2YWx1ZSwgdmFsdWVfc2l6ZSk7XFxuIFxcdGtleSA9IGFkZF9kYXRhKGdlbiwgXFx1MDAyNnplcm8sIHNpemVvZih6ZXJvKSk7XFxuZGlmZiAtLWdpdCBhL3Rvb2xzL2xpYi9icGYvbGliYnBmLmMgYi90b29scy9saWIvYnBmL2xpYmJwZi5jXFxuaW5kZXggNzE2MjE0NjI4MGE4MGUuLjZlMThhMTYyOGUxMzk2IDEwMDY0NFxcbi0tLSBhL3Rvb2xzL2xpYi9icGYvbGliYnBmLmNcXG4rKysgYi90b29scy9saWIvYnBmL2xpYmJwZi5jXFxuQEAgLTU0MSw2ICs1NDEsNyBAQCBzdHJ1Y3QgYnBmX3N0cnVjdF9vcHMge1xcbiB9O1xcbiBcXG4gI2RlZmluZSBEQVRBX1NFQyBcXFwiLmRhdGFcXFwiXFxuKyNkZWZpbmUgUEVSQ1BVX1NFQyBcXFwiLnBlcmNwdVxcXCJcXG4gI2RlZmluZSBCU1NfU0VDIFxcXCIuYnNzXFxcIlxcbiAjZGVmaW5lIFJPREFUQV9TRUMgXFxcIi5yb2RhdGFcXFwiXFxuICNkZWZpbmUgS0NPTkZJR19TRUMgXFxcIi5rY29uZmlnXFxcIlxcbkBAIC01NTUsNiArNTU2LDcgQEAgZW51bSBsaWJicGZfbWFwX3R5cGUge1xcbiBcXHRMSUJCUEZfTUFQX0JTUyxcXG4gXFx0TElCQlBGX01BUF9ST0RBVEEsXFxuIFxcdExJQkJQRl9NQVBfS0NPTkZJRyxcXG4rXFx0TElCQlBGX01BUF9QRVJDUFUsXFxuIH07XFxuIFxcbiBzdHJ1Y3QgYnBmX21hcF9kZWYge1xcbkBAIC02NjYsNiArNjY4LDcgQEAgZW51bSBzZWNfdHlwZSB7XFxuIFxcdFNFQ19EQVRBLFxcbiBcXHRTRUNfUk9EQVRBLFxcbiBcXHRTRUNfU1RfT1BTLFxcbitcXHRTRUNfUEVSQ1BVLFxcbiB9O1xcbiBcXG4gc3RydWN0IGVsZl9zZWNfZGVzYyB7XFxuQEAgLTE4MzksNiArMTg0Miw4IEBAIHN0YXRpYyBzaXplX3QgYnBmX21hcF9tbWFwX3N6KGNvbnN0IHN0cnVjdCBicGZfbWFwICptYXApXFxuIFxcdHN3aXRjaCAobWFwLVxcdTAwM2VkZWYudHlwZSkge1xcbiBcXHRjYXNlIEJQRl9NQVBfVFlQRV9BUlJBWTpcXG4gXFx0XFx0cmV0dXJuIGFycmF5X21hcF9tbWFwX3N6KG1hcC1cXHUwMDNlZGVmLnZhbHVlX3NpemUsIG1hcC1cXHUwMDNlZGVmLm1heF9lbnRyaWVzKTtcXG4rXFx0Y2FzZSBCUEZfTUFQX1RZUEVfUEVSQ1BVX0FSUkFZOlxcbitcXHRcXHRyZXR1cm4gbWFwLVxcdTAwM2VkZWYudmFsdWVfc2l6ZTtcXG4gXFx0Y2FzZSBCUEZfTUFQX1RZUEVfQVJFTkE6XFxuIFxcdFxcdHJldHVybiBwYWdlX3N6ICogbWFwLVxcdTAwM2VkZWYubWF4X2VudHJpZXM7XFxuIFxcdGRlZmF1bHQ6XFxuQEAgLTE5MzgsNyArMTk0Myw3IEBAIHN0YXRpYyBib29sIG1hcF9pc19tbWFwYWJsZShzdHJ1Y3QgYnBmX29iamVjdCAqb2JqLCBzdHJ1Y3QgYnBmX21hcCAqbWFwKVxcbiBcXHRzdHJ1Y3QgYnRmX3Zhcl9zZWNpbmZvICp2c2k7XFxuIFxcdGludCBpLCBuO1xcbiBcXG4tXFx0aWYgKCFtYXAtXFx1MDAzZWJ0Zl92YWx1ZV90eXBlX2lkKVxcbitcXHRpZiAoIW1hcC1cXHUwMDNlYnRmX3ZhbHVlX3R5cGVfaWQgfHwgbWFwLVxcdTAwM2VsaWJicGZfdHlwZSA9PSBMSUJCUEZfTUFQX1BFUkNQVSlcXG4gXFx0XFx0cmV0dXJuIGZhbHNlO1xcbiBcXG4gXFx0dCA9IGJ0Zl9fdHlwZV9ieV9pZChvYmotXFx1MDAzZWJ0ZiwgbWFwLVxcdTAwM2VidGZfdmFsdWVfdHlwZV9pZCk7XFxuQEAgLTE5NjIsNiArMTk2Nyw3IEBAIHN0YXRpYyBpbnRcXG4gYnBmX29iamVjdF9faW5pdF9pbnRlcm5hbF9tYXAoc3RydWN0IGJwZl9vYmplY3QgKm9iaiwgZW51bSBsaWJicGZfbWFwX3R5cGUgdHlwZSxcXG4gXFx0XFx0XFx0ICAgICAgY29uc3QgY2hhciAqcmVhbF9uYW1lLCBpbnQgc2VjX2lkeCwgdm9pZCAqZGF0YSwgc2l6ZV90IGRhdGFfc3opXFxuIHtcXG4rXFx0Ym9vbCBpc19wZXJjcHUgPSB0eXBlID09IExJQkJQRl9NQVBfUEVSQ1BVO1xcbiBcXHRzdHJ1Y3QgYnBmX21hcF9kZWYgKmRlZjtcXG4gXFx0c3RydWN0IGJwZl9tYXAgKm1hcDtcXG4gXFx0c2l6ZV90IG1tYXBfc3o7XFxuQEAgLTE5NzUsNyArMTk4MSw3IEBAIGJwZl9vYmplY3RfX2luaXRfaW50ZXJuYWxfbWFwKHN0cnVjdCBicGZfb2JqZWN0ICpvYmosIGVudW0gbGliYnBmX21hcF90eXBlIHR5cGUsXFxuIFxcdG1hcC1cXHUwMDNlc2VjX2lkeCA9IHNlY19pZHg7XFxuIFxcdG1hcC1cXHUwMDNlc2VjX29mZnNldCA9IDA7XFxuIFxcdG1hcC1cXHUwMDNlcmVhbF9uYW1lID0gc3RyZHVwKHJlYWxfbmFtZSk7XFxuLVxcdG1hcC1cXHUwMDNlbmFtZSA9IGludGVybmFsX21hcF9uYW1lKG9iaiwgcmVhbF9uYW1lKTtcXG4rXFx0bWFwLVxcdTAwM2VuYW1lID0gaXNfcGVyY3B1ID8gc3RyZHVwKHJlYWxfbmFtZSkgOiBpbnRlcm5hbF9tYXBfbmFtZShvYmosIHJlYWxfbmFtZSk7XFxuIFxcdGlmICghbWFwLVxcdTAwM2VyZWFsX25hbWUgfHwgIW1hcC1cXHUwMDNlbmFtZSkge1xcbiBcXHRcXHR6ZnJlZShcXHUwMDI2bWFwLVxcdTAwM2VyZWFsX25hbWUpO1xcbiBcXHRcXHR6ZnJlZShcXHUwMDI2bWFwLVxcdTAwM2VuYW1lKTtcXG5AQCAtMTk4Myw3ICsxOTg5LDcgQEAgYnBmX29iamVjdF9faW5pdF9pbnRlcm5hbF9tYXAoc3RydWN0IGJwZl9vYmplY3QgKm9iaiwgZW51bSBsaWJicGZfbWFwX3R5cGUgdHlwZSxcXG4gXFx0fVxcbiBcXG4gXFx0ZGVmID0gXFx1MDAyNm1hcC1cXHUwMDNlZGVmO1xcbi1cXHRkZWYtXFx1MDAzZXR5cGUgPSBCUEZfTUFQX1RZUEVfQVJSQVk7XFxuK1xcdGRlZi1cXHUwMDNldHlwZSA9IGlzX3BlcmNwdSA/IEJQRl9NQVBfVFlQRV9QRVJDUFVfQVJSQVkgOiBCUEZfTUFQX1RZUEVfQVJSQVk7XFxuIFxcdGRlZi1cXHUwMDNla2V5X3NpemUgPSBzaXplb2YoaW50KTtcXG4gXFx0ZGVmLVxcdTAwM2V2YWx1ZV9zaXplID0gZGF0YV9zejtcXG4gXFx0ZGVmLVxcdTAwM2VtYXhfZW50cmllcyA9IDE7XFxuQEAgLTE5OTYsOCArMjAwMiw5IEBAIGJwZl9vYmplY3RfX2luaXRfaW50ZXJuYWxfbWFwKHN0cnVjdCBicGZfb2JqZWN0ICpvYmosIGVudW0gbGliYnBmX21hcF90eXBlIHR5cGUsXFxuIFxcdGlmIChtYXBfaXNfbW1hcGFibGUob2JqLCBtYXApKVxcbiBcXHRcXHRkZWYtXFx1MDAzZW1hcF9mbGFncyB8PSBCUEZfRl9NTUFQQUJMRTtcXG4gXFxuLVxcdHByX2RlYnVnKFxcXCJtYXAgJyVzJyAoZ2xvYmFsIGRhdGEpOiBhdCBzZWNfaWR4ICVkLCBvZmZzZXQgJXp1LCBmbGFncyAleC5cXFxcblxcXCIsXFxuLVxcdFxcdCBtYXAtXFx1MDAzZW5hbWUsIG1hcC1cXHUwMDNlc2VjX2lkeCwgbWFwLVxcdTAwM2VzZWNfb2Zmc2V0LCBkZWYtXFx1MDAzZW1hcF9mbGFncyk7XFxuK1xcdHByX2RlYnVnKFxcXCJtYXAgJyVzJyAoZ2xvYmFsICVzZGF0YSk6IGF0IHNlY19pZHggJWQsIG9mZnNldCAlenUsIGZsYWdzICV4LlxcXFxuXFxcIixcXG4rXFx0XFx0IG1hcC1cXHUwMDNlbmFtZSwgaXNfcGVyY3B1ID8gXFxcInBlcmNwdSBcXFwiIDogXFxcIlxcXCIsIG1hcC1cXHUwMDNlc2VjX2lkeCxcXG4rXFx0XFx0IG1hcC1cXHUwMDNlc2VjX29mZnNldCwgZGVmLVxcdTAwM2VtYXBfZmxhZ3MpO1xcbiBcXG4gXFx0bW1hcF9zeiA9IGJwZl9tYXBfbW1hcF9zeihtYXApO1xcbiBcXHRtYXAtXFx1MDAzZW1tYXBlZCA9IG1tYXAoTlVMTCwgbW1hcF9zeiwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSxcXG5AQCAtMjA1Nyw2ICsyMDY0LDEzIEBAIHN0YXRpYyBpbnQgYnBmX29iamVjdF9faW5pdF9nbG9iYWxfZGF0YV9tYXBzKHN0cnVjdCBicGZfb2JqZWN0ICpvYmopXFxuIFxcdFxcdFxcdFxcdFxcdFxcdFxcdCAgICBOVUxMLFxcbiBcXHRcXHRcXHRcXHRcXHRcXHRcXHQgICAgc2VjX2Rlc2MtXFx1MDAzZWRhdGEtXFx1MDAzZWRfc2l6ZSk7XFxuIFxcdFxcdFxcdGJyZWFrO1xcbitcXHRcXHRjYXNlIFNFQ19QRVJDUFU6XFxuK1xcdFxcdFxcdHNlY19uYW1lID0gZWxmX3NlY19uYW1lKG9iaiwgZWxmX3NlY19ieV9pZHgob2JqLCBzZWNfaWR4KSk7XFxuK1xcdFxcdFxcdGVyciA9IGJwZl9vYmplY3RfX2luaXRfaW50ZXJuYWxfbWFwKG9iaiwgTElCQlBGX01BUF9QRVJDUFUsXFxuK1xcdFxcdFxcdFxcdFxcdFxcdFxcdCAgICBzZWNfbmFtZSwgc2VjX2lkeCxcXG4rXFx0XFx0XFx0XFx0XFx0XFx0XFx0ICAgIHNlY19kZXNjLVxcdTAwM2VkYXRhLVxcdTAwM2VkX2J1ZixcXG4rXFx0XFx0XFx0XFx0XFx0XFx0XFx0ICAgIHNlY19kZXNjLVxcdTAwM2VkYXRhLVxcdTAwM2VkX3NpemUpO1xcbitcXHRcXHRcXHRicmVhaztcXG4gXFx0XFx0ZGVmYXVsdDpcXG4gXFx0XFx0XFx0Lyogc2tpcCAqL1xcbiBcXHRcXHRcXHRicmVhaztcXG5AQCAtNDAxNiw2ICs0MDMwLDExIEBAIHN0YXRpYyBpbnQgYnBmX29iamVjdF9fZWxmX2NvbGxlY3Qoc3RydWN0IGJwZl9vYmplY3QgKm9iailcXG4gXFx0XFx0XFx0XFx0c2VjX2Rlc2MtXFx1MDAzZXNlY190eXBlID0gU0VDX1JPREFUQTtcXG4gXFx0XFx0XFx0XFx0c2VjX2Rlc2MtXFx1MDAzZXNoZHIgPSBzaDtcXG4gXFx0XFx0XFx0XFx0c2VjX2Rlc2MtXFx1MDAzZWRhdGEgPSBkYXRhO1xcbitcXHRcXHRcXHR9IGVsc2UgaWYgKHN0cmNtcChuYW1lLCBQRVJDUFVfU0VDKSA9PSAwIHx8XFxuK1xcdFxcdFxcdFxcdCAgIHN0cl9oYXNfcGZ4KG5hbWUsIFBFUkNQVV9TRUMgXFxcIi5cXFwiKSkge1xcbitcXHRcXHRcXHRcXHRzZWNfZGVzYy1cXHUwMDNlc2VjX3R5cGUgPSBTRUNfUEVSQ1BVO1xcbitcXHRcXHRcXHRcXHRzZWNfZGVzYy1cXHUwMDNlc2hkciA9IHNoO1xcbitcXHRcXHRcXHRcXHRzZWNfZGVzYy1cXHUwMDNlZGF0YSA9IGRhdGE7XFxuIFxcdFxcdFxcdH0gZWxzZSBpZiAoc3RyY21wKG5hbWUsIFNUUlVDVF9PUFNfU0VDKSA9PSAwIHx8XFxuIFxcdFxcdFxcdFxcdCAgIHN0cmNtcChuYW1lLCBTVFJVQ1RfT1BTX0xJTktfU0VDKSA9PSAwIHx8XFxuIFxcdFxcdFxcdFxcdCAgIHN0cmNtcChuYW1lLCBcXFwiP1xcXCIgU1RSVUNUX09QU19TRUMpID09IDAgfHxcXG5AQCAtNDU0NCw2ICs0NTYzLDcgQEAgc3RhdGljIGJvb2wgYnBmX29iamVjdF9fc2huZHhfaXNfZGF0YShjb25zdCBzdHJ1Y3QgYnBmX29iamVjdCAqb2JqLFxcbiBcXHRjYXNlIFNFQ19CU1M6XFxuIFxcdGNhc2UgU0VDX0RBVEE6XFxuIFxcdGNhc2UgU0VDX1JPREFUQTpcXG4rXFx0Y2FzZSBTRUNfUEVSQ1BVOlxcbiBcXHRcXHRyZXR1cm4gdHJ1ZTtcXG4gXFx0ZGVmYXVsdDpcXG4gXFx0XFx0cmV0dXJuIGZhbHNlO1xcbkBAIC00NTY5LDYgKzQ1ODksOCBAQCBicGZfb2JqZWN0X19zZWN0aW9uX3RvX2xpYmJwZl9tYXBfdHlwZShjb25zdCBzdHJ1Y3QgYnBmX29iamVjdCAqb2JqLCBpbnQgc2huZHgpXFxuIFxcdFxcdHJldHVybiBMSUJCUEZfTUFQX0RBVEE7XFxuIFxcdGNhc2UgU0VDX1JPREFUQTpcXG4gXFx0XFx0cmV0dXJuIExJQkJQRl9NQVBfUk9EQVRBO1xcbitcXHRjYXNlIFNFQ19QRVJDUFU6XFxuK1xcdFxcdHJldHVybiBMSUJCUEZfTUFQX1BFUkNQVTtcXG4gXFx0ZGVmYXVsdDpcXG4gXFx0XFx0cmV0dXJuIExJQkJQRl9NQVBfVU5TUEVDO1xcbiBcXHR9XFxuQEAgLTQ5NDQsNyArNDk2Niw3IEBAIHN0YXRpYyBpbnQgbWFwX2ZpbGxfYnRmX3R5cGVfaW5mbyhzdHJ1Y3QgYnBmX29iamVjdCAqb2JqLCBzdHJ1Y3QgYnBmX21hcCAqbWFwKVxcbiBcXG4gXFx0LypcXG4gXFx0ICogTExWTSBhbm5vdGF0ZXMgZ2xvYmFsIGRhdGEgZGlmZmVyZW50bHkgaW4gQlRGLCB0aGF0IGlzLFxcbi1cXHQgKiBvbmx5IGFzICcuZGF0YScsICcuYnNzJyBvciAnLnJvZGF0YScuXFxuK1xcdCAqIG9ubHkgYXMgJy5kYXRhJywgJy5ic3MnLCAnLnBlcmNwdScgb3IgJy5yb2RhdGEnLlxcbiBcXHQgKi9cXG4gXFx0aWYgKCFicGZfbWFwX19pc19pbnRlcm5hbChtYXApKVxcbiBcXHRcXHRyZXR1cm4gLUVOT0VOVDtcXG5AQCAtNTI5NywxOCArNTMxOSwzMCBAQCBzdGF0aWMgaW50XFxuIGJwZl9vYmplY3RfX3BvcHVsYXRlX2ludGVybmFsX21hcChzdHJ1Y3QgYnBmX29iamVjdCAqb2JqLCBzdHJ1Y3QgYnBmX21hcCAqbWFwKVxcbiB7XFxuIFxcdGVudW0gbGliYnBmX21hcF90eXBlIG1hcF90eXBlID0gbWFwLVxcdTAwM2VsaWJicGZfdHlwZTtcXG4rXFx0Ym9vbCBpc19wZXJjcHUgPSBtYXBfdHlwZSA9PSBMSUJCUEZfTUFQX1BFUkNQVTtcXG4rXFx0X191NjQgdXBkYXRlX2ZsYWdzID0gMDtcXG4gXFx0aW50IGVyciwgemVybyA9IDA7XFxuIFxcdHNpemVfdCBtbWFwX3N6O1xcbiBcXG4rXFx0aWYgKGlzX3BlcmNwdSkge1xcbitcXHRcXHRpZiAoIW9iai1cXHUwMDNlZ2VuX2xvYWRlciBcXHUwMDI2XFx1MDAyNiAha2VybmVsX3N1cHBvcnRzKG9iaiwgRkVBVF9QRVJDUFVfREFUQSkpIHtcXG4rXFx0XFx0XFx0cHJfd2FybihcXFwibWFwICclcyc6IGtlcm5lbCBkb2VzIG5vdCBzdXBwb3J0IHBlcmNwdSBkYXRhLlxcXFxuXFxcIixcXG4rXFx0XFx0XFx0XFx0YnBmX21hcF9fbmFtZShtYXApKTtcXG4rXFx0XFx0XFx0cmV0dXJuIC1FT1BOT1RTVVBQO1xcbitcXHRcXHR9XFxuK1xcbitcXHRcXHR1cGRhdGVfZmxhZ3MgPSBCUEZfRl9BTExfQ1BVUztcXG4rXFx0fVxcbitcXG4gXFx0aWYgKG9iai1cXHUwMDNlZ2VuX2xvYWRlcikge1xcbiBcXHRcXHRicGZfZ2VuX19tYXBfdXBkYXRlX2VsZW0ob2JqLVxcdTAwM2VnZW5fbG9hZGVyLCBtYXAgLSBvYmotXFx1MDAzZW1hcHMsXFxuLVxcdFxcdFxcdFxcdFxcdCBtYXAtXFx1MDAzZW1tYXBlZCwgbWFwLVxcdTAwM2VkZWYudmFsdWVfc2l6ZSk7XFxuK1xcdFxcdFxcdFxcdFxcdCBtYXAtXFx1MDAzZW1tYXBlZCwgbWFwLVxcdTAwM2VkZWYudmFsdWVfc2l6ZSwgdXBkYXRlX2ZsYWdzKTtcXG4gXFx0XFx0aWYgKG1hcF90eXBlID09IExJQkJQRl9NQVBfUk9EQVRBIHx8IG1hcF90eXBlID09IExJQkJQRl9NQVBfS0NPTkZJRylcXG4gXFx0XFx0XFx0YnBmX2dlbl9fbWFwX2ZyZWV6ZShvYmotXFx1MDAzZWdlbl9sb2FkZXIsIG1hcCAtIG9iai1cXHUwMDNlbWFwcyk7XFxuIFxcdFxcdHJldHVybiAwO1xcbiBcXHR9XFxuIFxcbi1cXHRlcnIgPSBicGZfbWFwX3VwZGF0ZV9lbGVtKG1hcC1cXHUwMDNlZmQsIFxcdTAwMjZ6ZXJvLCBtYXAtXFx1MDAzZW1tYXBlZCwgMCk7XFxuK1xcdGVyciA9IGJwZl9tYXBfdXBkYXRlX2VsZW0obWFwLVxcdTAwM2VmZCwgXFx1MDAyNnplcm8sIG1hcC1cXHUwMDNlbW1hcGVkLCB1cGRhdGVfZmxhZ3MpO1xcbiBcXHRpZiAoZXJyKSB7XFxuIFxcdFxcdGVyciA9IC1lcnJubztcXG4gXFx0XFx0cHJfd2FybihcXFwibWFwICclcyc6IGZhaWxlZCB0byBzZXQgaW5pdGlhbCBjb250ZW50czogJXNcXFxcblxcXCIsXFxuQEAgLTUzNTMsNiArNTM4NywxMyBAQCBicGZfb2JqZWN0X19wb3B1bGF0ZV9pbnRlcm5hbF9tYXAoc3RydWN0IGJwZl9vYmplY3QgKm9iaiwgc3RydWN0IGJwZl9tYXAgKm1hcClcXG4gXFx0XFx0XFx0cmV0dXJuIGVycjtcXG4gXFx0XFx0fVxcbiBcXHRcXHRtYXAtXFx1MDAzZW1tYXBlZCA9IG1tYXBlZDtcXG4rXFx0fSBlbHNlIGlmIChpc19wZXJjcHUpIHtcXG4rXFx0XFx0aWYgKG1wcm90ZWN0KG1hcC1cXHUwMDNlbW1hcGVkLCBtbWFwX3N6LCBQUk9UX1JFQUQpKSB7XFxuK1xcdFxcdFxcdGVyciA9IC1lcnJubztcXG4rXFx0XFx0XFx0cHJfd2FybihcXFwibWFwICclcyc6IGZhaWxlZCB0byBtcHJvdGVjdCgpIGNvbnRlbnRzOiAlc1xcXFxuXFxcIixcXG4rXFx0XFx0XFx0XFx0YnBmX21hcF9fbmFtZShtYXApLCBlcnJzdHIoZXJyKSk7XFxuK1xcdFxcdFxcdHJldHVybiBlcnI7XFxuK1xcdFxcdH1cXG4gXFx0fSBlbHNlIGlmIChtYXAtXFx1MDAzZW1tYXBlZCkge1xcbiBcXHRcXHRtdW5tYXAobWFwLVxcdTAwM2VtbWFwZWQsIG1tYXBfc3opO1xcbiBcXHRcXHRtYXAtXFx1MDAzZW1tYXBlZCA9IE5VTEw7XFxuZGlmZiAtLWdpdCBhL3Rvb2xzL2xpYi9icGYvbGliYnBmX2ludGVybmFsLmggYi90b29scy9saWIvYnBmL2xpYmJwZl9pbnRlcm5hbC5oXFxuaW5kZXggMDRjZDMwM2ZiNWE4NzkuLjQ3YWUzOTEyNWY2OGY5IDEwMDY0NFxcbi0tLSBhL3Rvb2xzL2xpYi9icGYvbGliYnBmX2ludGVybmFsLmhcXG4rKysgYi90b29scy9saWIvYnBmL2xpYmJwZl9pbnRlcm5hbC5oXFxuQEAgLTQwMSw2ICs0MDEsOCBAQCBlbnVtIGtlcm5fZmVhdHVyZV9pZCB7XFxuIFxcdEZFQVRfQlRGX0xBWU9VVCxcXG4gXFx0LyogS2VybmVsIHN1cHBvcnRzIEJQRiBzeXNjYWxsIGNvbW1vbiBhdHRyaWJ1dGVzICovXFxuIFxcdEZFQVRfQlBGX1NZU0NBTExfQ09NTU9OX0FUVFJTLFxcbitcXHQvKiBLZXJuZWwgc3VwcG9ydHMgcGVyY3B1IGRhdGEgKi9cXG4rXFx0RkVBVF9QRVJDUFVfREFUQSxcXG4gXFx0X19GRUFUX0NOVCxcXG4gfTtcXG4gXFxuZGlmZiAtLWdpdCBhL3Rvb2xzL2xpYi9icGYvc2tlbF9pbnRlcm5hbC5oIGIvdG9vbHMvbGliL2JwZi9za2VsX2ludGVybmFsLmhcXG5pbmRleCA3NDUwM2QzNThiYzhhNS4uNDg1YjBjZDE3MDE3MzkgMTAwNjQ0XFxuLS0tIGEvdG9vbHMvbGliL2JwZi9za2VsX2ludGVybmFsLmhcXG4rKysgYi90b29scy9saWIvYnBmL3NrZWxfaW50ZXJuYWwuaFxcbkBAIC0xMzUsOCArMTM1LDEwIEBAIHN0YXRpYyBpbmxpbmUgdm9pZCBza2VsX2ZyZWVfbWFwX2RhdGEodm9pZCAqcCwgX191NjQgYWRkciwgc2l6ZV90IHN6KVxcbiB7XFxuIFxcdGlmIChhZGRyICE9IH4wVUxMKVxcbiBcXHRcXHRrdmZyZWUocCk7XFxuLVxcdC8qIFdoZW4gYWRkciA9PSB+MFVMTCB0aGUgJ3AnIHBvaW50cyB0b1xcbi1cXHQgKiAoKHN0cnVjdCBicGZfYXJyYXkgKiltYXApLVxcdTAwM2V2YWx1ZS4gU2VlIHNrZWxfZmluYWxpemVfbWFwX2RhdGEuXFxuK1xcdC8qXFxuK1xcdCAqIFdoZW4gYWRkciA9PSB+MFVMTCB0aGUgaW5pdCBidWZmZXIgaGFzIGFscmVhZHkgYmVlbiByZWxlYXNlZC5cXG4rXFx0ICogRm9yIHNrZWxfZmluYWxpemVfbWFwX2RhdGEoKSwgJ3AnIHBvaW50cyB0b1xcbitcXHQgKiAoKHN0cnVjdCBicGZfYXJyYXkgKiltYXApLVxcdTAwM2V2YWx1ZS5cXG4gXFx0ICovXFxuIH1cXG4gXFxuQEAgLTE3NCw2ICsxNzYsMTUgQEAgc3RhdGljIGlubGluZSB2b2lkICpza2VsX2ZpbmFsaXplX21hcF9kYXRhKF9fdTY0ICppbml0X3ZhbCwgc2l6ZV90IG1tYXBfc3osIGludFxcbiBcXHRyZXR1cm4gYWRkcjtcXG4gfVxcbiBcXG4rc3RhdGljIGlubGluZSBpbnQgc2tlbF9wcm90ZWN0X21hcF9kYXRhKHZvaWQgKnAsIF9fdTY0ICppbml0X3ZhbCwgc2l6ZV90IHN6KVxcbit7XFxuK1xcdCh2b2lkKXN6O1xcbitcXG4rXFx0a3ZmcmVlKHApO1xcbitcXHQqaW5pdF92YWwgPSB+MFVMTDtcXG4rXFx0cmV0dXJuIDA7XFxuK31cXG4rXFxuICNlbHNlXFxuIFxcbiBzdGF0aWMgaW5saW5lIHZvaWQgKnNrZWxfYWxsb2Moc2l6ZV90IHNpemUpXFxuQEAgLTIxMiw2ICsyMjMsMTUgQEAgc3RhdGljIGlubGluZSB2b2lkICpza2VsX2ZpbmFsaXplX21hcF9kYXRhKF9fdTY0ICppbml0X3ZhbCwgc2l6ZV90IG1tYXBfc3osIGludFxcbiBcXHRcXHRyZXR1cm4gTlVMTDtcXG4gXFx0cmV0dXJuIGFkZHI7XFxuIH1cXG4rXFxuK3N0YXRpYyBpbmxpbmUgaW50IHNrZWxfcHJvdGVjdF9tYXBfZGF0YSh2b2lkICpwLCBfX3U2NCAqaW5pdF92YWwsIHNpemVfdCBzeilcXG4re1xcbitcXHQodm9pZClpbml0X3ZhbDtcXG4rXFxuK1xcdGlmIChtcHJvdGVjdChwLCBzeiwgUFJPVF9SRUFEKSlcXG4rXFx0XFx0cmV0dXJuIC1lcnJubztcXG4rXFx0cmV0dXJuIDA7XFxuK31cXG4gI2VuZGlmXFxuIFxcbiBzdGF0aWMgaW5saW5lIGludCBza2VsX2Nsb3NlbnooaW50IGZkKVxcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvTWFrZWZpbGUgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvTWFrZWZpbGVcXG5pbmRleCBiNjQyZWU0ODllYTY0MC4uYzM3ZWQ5ZTdiOTdjZDAgMTAwNjQ0XFxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL01ha2VmaWxlXFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL01ha2VmaWxlXFxuQEAgLTUzMyw3ICs1MzMsNyBAQCBMU0tFTFNfU0lHTkVEIDo9IGZlbnRyeV90ZXN0LmMgZmV4aXRfdGVzdC5jIGF0b21pY3MuY1xcbiBcXG4gIyBHZW5lcmF0ZSBib3RoIGxpZ2h0IHNrZWxldG9uIGFuZCBsaWJicGYgc2tlbGV0b24gZm9yIHRoZXNlXFxuIExTS0VMU19FWFRSQSA6PSB0ZXN0X2tzeW1zX21vZHVsZS5jIHRlc3Rfa3N5bXNfd2Vhay5jIGtmdW5jX2NhbGxfdGVzdC5jIFxcXFxcXG4tXFx0a2Z1bmNfY2FsbF90ZXN0X3N1YnByb2cuY1xcbitcXHRrZnVuY19jYWxsX3Rlc3Rfc3VicHJvZy5jIHRlc3RfZ2xvYmFsX3BlcmNwdV9kYXRhLmNcXG4gU0tFTF9CTEFDS0xJU1QgKz0gJCQoTFNLRUxTKSAkJChMU0tFTFNfU0lHTkVEKVxcbiBcXG4gdGVzdF9zdGF0aWNfbGlua2VkLnNrZWwuaC1kZXBzIDo9IHRlc3Rfc3RhdGljX2xpbmtlZDEuYnBmLm8gdGVzdF9zdGF0aWNfbGlua2VkMi5icGYub1xcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9nbG9iYWxfZGF0YV9pbml0LmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9nbG9iYWxfZGF0YV9pbml0LmNcXG5pbmRleCA4NDY2MzMyZDc0MDZmNC4uYTVkODc3NjhmNmVlMmYgMTAwNjQ0XFxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvZ2xvYmFsX2RhdGFfaW5pdC5jXFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvZ2xvYmFsX2RhdGFfaW5pdC5jXFxuQEAgLTEsNSArMSw4IEBAXFxuIC8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXFxuICNpbmNsdWRlIFxcdTAwM2N0ZXN0X3Byb2dzLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcXCJicGYvbGliYnBmX2ludGVybmFsLmhcXFwiXFxuKyNpbmNsdWRlIFxcXCJ0ZXN0X2dsb2JhbF9wZXJjcHVfZGF0YS5za2VsLmhcXFwiXFxuKyNpbmNsdWRlIFxcXCJ0ZXN0X2dsb2JhbF9wZXJjcHVfZGF0YS5sc2tlbC5oXFxcIlxcbiBcXG4gdm9pZCB0ZXN0X2dsb2JhbF9kYXRhX2luaXQodm9pZClcXG4ge1xcbkBAIC02MCwzICs2MywyOTAgQEAgdm9pZCB0ZXN0X2dsb2JhbF9kYXRhX2luaXQodm9pZClcXG4gXFx0ZnJlZShuZXd2YWwpO1xcbiBcXHRicGZfb2JqZWN0X19jbG9zZShvYmopO1xcbiB9XFxuK1xcbitzdGF0aWMgdm9pZCB0ZXN0X3BlcmNwdV9kYXRhX29uX2NwdXMoaW50IG1hcF9mZCwgaW50IHByb2dfZmQsIGludCBudW1fb25saW5lLCBib29sICpvbmxpbmUpXFxuK3tcXG4rXFx0X191NjQgYXJnc1syXSA9IHsweDEyMzRVTEwsIDB4NTY3OFVMTH07XFxuK1xcdExJQkJQRl9PUFRTKGJwZl90ZXN0X3J1bl9vcHRzLCB0b3B0cyxcXG4rXFx0XFx0ICAgIC5jdHhfaW4gPSBhcmdzLFxcbitcXHRcXHQgICAgLmN0eF9zaXplX2luID0gc2l6ZW9mKGFyZ3MpLFxcbitcXHRcXHQgICAgLmZsYWdzID0gQlBGX0ZfVEVTVF9SVU5fT05fQ1BVLFxcbitcXHQpO1xcbitcXHRpbnQgaSwgZXJyLCBrZXkgPSAwO1xcbitcXG4rXFx0LyogcnVuIG9uIGV2ZXJ5IG9ubGluZS1DUFUgKi9cXG4rXFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIG51bV9vbmxpbmU7IGkrKykge1xcbitcXHRcXHRzdHJ1Y3QgdGVzdF9nbG9iYWxfcGVyY3B1X2RhdGFfX3BlcmNwdSBkYXRhID0ge307XFxuK1xcdFxcdF9fdTY0IGZsYWdzO1xcbitcXG4rXFx0XFx0aWYgKCFvbmxpbmVbaV0pXFxuK1xcdFxcdFxcdGNvbnRpbnVlO1xcbitcXG4rXFx0XFx0dG9wdHMuY3B1ID0gaTtcXG4rXFx0XFx0dG9wdHMucmV0dmFsID0gLTE7XFxuK1xcdFxcdGVyciA9IGJwZl9wcm9nX3Rlc3RfcnVuX29wdHMocHJvZ19mZCwgXFx1MDAyNnRvcHRzKTtcXG4rXFx0XFx0QVNTRVJUX09LKGVyciwgXFxcImJwZl9wcm9nX3Rlc3RfcnVuX29wdHNcXFwiKTtcXG4rXFx0XFx0QVNTRVJUX0VRKHRvcHRzLnJldHZhbCwgMCwgXFxcImJwZl9wcm9nX3Rlc3RfcnVuX29wdHMgcmV0dmFsXFxcIik7XFxuK1xcbitcXHRcXHRmbGFncyA9ICgoX191NjQpIGkgXFx1MDAzY1xcdTAwM2MgMzIpIHwgQlBGX0ZfQ1BVO1xcbitcXHRcXHRlcnIgPSBicGZfbWFwX2xvb2t1cF9lbGVtX2ZsYWdzKG1hcF9mZCwgXFx1MDAyNmtleSwgXFx1MDAyNmRhdGEsIGZsYWdzKTtcXG4rXFx0XFx0aWYgKCFBU1NFUlRfT0soZXJyLCBcXFwiYnBmX21hcF9sb29rdXBfZWxlbV9mbGFnc1xcXCIpKVxcbitcXHRcXHRcXHRyZXR1cm47XFxuK1xcbitcXHRcXHRBU1NFUlRfRVEoZGF0YS5kYXRhLCAxLCBcXFwiZGF0YS5kYXRhXFxcIik7XFxuK1xcdFxcdEFTU0VSVF9UUlVFKGRhdGEucnVuLCBcXFwiZGF0YS5ydW5cXFwiKTtcXG4rXFx0XFx0QVNTRVJUX0VRKGRhdGEubnVtc1s2XSwgMHhjMGRlLCBcXFwiZGF0YS5udW1zWzZdXFxcIik7XFxuK1xcdFxcdEFTU0VSVF9FUShkYXRhLnN0cnVjdF9kYXRhLmksIDEsIFxcXCJzdHJ1Y3RfZGF0YS5pXFxcIik7XFxuK1xcdFxcdEFTU0VSVF9UUlVFKGRhdGEuc3RydWN0X2RhdGEuc2V0LCBcXFwic3RydWN0X2RhdGEuc2V0XFxcIik7XFxuK1xcdFxcdEFTU0VSVF9FUShkYXRhLnN0cnVjdF9kYXRhLm51bXNbNl0sIDB4YzBkZSwgXFxcInN0cnVjdF9kYXRhLm51bXNbNl1cXFwiKTtcXG4rXFx0fVxcbit9XFxuK1xcbitzdGF0aWMgdm9pZCB0ZXN0X2dsb2JhbF9wZXJjcHVfZGF0YV9pbml0KHZvaWQpXFxuK3tcXG4rXFx0c3RydWN0IHRlc3RfZ2xvYmFsX3BlcmNwdV9kYXRhX19wZXJjcHUgaW5pdF92YWx1ZSA9IHt9O1xcbitcXHRzdHJ1Y3QgdGVzdF9nbG9iYWxfcGVyY3B1X2RhdGFfX3BlcmNwdSAqaW5pdF9kYXRhO1xcbitcXHRzdHJ1Y3QgdGVzdF9nbG9iYWxfcGVyY3B1X2RhdGEgKnNrZWwgPSBOVUxMO1xcbitcXHRpbnQgcHJvZ19mZCwgbWFwX2ZkLCBlcnIsIG51bV9vbmxpbmU7XFxuK1xcdHNpemVfdCBpbml0X2RhdGFfc3o7XFxuK1xcdHN0cnVjdCBicGZfbWFwICptYXA7XFxuK1xcdGJvb2wgKm9ubGluZTtcXG4rXFxuK1xcdGVyciA9IHBhcnNlX2NwdV9tYXNrX2ZpbGUoXFxcIi9zeXMvZGV2aWNlcy9zeXN0ZW0vY3B1L29ubGluZVxcXCIsIFxcdTAwMjZvbmxpbmUsIFxcdTAwMjZudW1fb25saW5lKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0soZXJyLCBcXFwicGFyc2VfY3B1X21hc2tfZmlsZVxcXCIpKVxcbitcXHRcXHRyZXR1cm47XFxuK1xcbitcXHRza2VsID0gdGVzdF9nbG9iYWxfcGVyY3B1X2RhdGFfX29wZW4oKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0tfUFRSKHNrZWwsIFxcXCJ0ZXN0X2dsb2JhbF9wZXJjcHVfZGF0YV9fb3BlblxcXCIpKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFx0aWYgKCFBU1NFUlRfT0tfUFRSKHNrZWwtXFx1MDAzZXBlcmNwdSwgXFxcInNrZWwtXFx1MDAzZXBlcmNwdVxcXCIpKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFxuK1xcdEFTU0VSVF9FUShza2VsLVxcdTAwM2VwZXJjcHUtXFx1MDAzZWRhdGEsIC0xLCBcXFwic2tlbC1cXHUwMDNlcGVyY3B1LVxcdTAwM2VkYXRhXFxcIik7XFxuK1xcdEFTU0VSVF9GQUxTRShza2VsLVxcdTAwM2VwZXJjcHUtXFx1MDAzZXJ1biwgXFxcInNrZWwtXFx1MDAzZXBlcmNwdS1cXHUwMDNlcnVuXFxcIik7XFxuK1xcdEFTU0VSVF9FUShza2VsLVxcdTAwM2VwZXJjcHUtXFx1MDAzZW51bXNbNl0sIDAsIFxcXCJza2VsLVxcdTAwM2VwZXJjcHUtXFx1MDAzZW51bXNbNl1cXFwiKTtcXG4rXFx0QVNTRVJUX0VRKHNrZWwtXFx1MDAzZXBlcmNwdS1cXHUwMDNlc3RydWN0X2RhdGEuaSwgLTEsIFxcXCJzdHJ1Y3RfZGF0YS5pXFxcIik7XFxuK1xcdEFTU0VSVF9GQUxTRShza2VsLVxcdTAwM2VwZXJjcHUtXFx1MDAzZXN0cnVjdF9kYXRhLnNldCwgXFxcInN0cnVjdF9kYXRhLnNldFxcXCIpO1xcbitcXHRBU1NFUlRfRVEoc2tlbC1cXHUwMDNlcGVyY3B1LVxcdTAwM2VzdHJ1Y3RfZGF0YS5udW1zWzZdLCAwLCBcXFwic3RydWN0X2RhdGEubnVtc1s2XVxcXCIpO1xcbitcXG4rXFx0bWFwID0gc2tlbC1cXHUwMDNlbWFwcy5wZXJjcHU7XFxuK1xcdGlmICghQVNTRVJUX0VRKGJwZl9tYXBfX3R5cGUobWFwKSwgQlBGX01BUF9UWVBFX1BFUkNQVV9BUlJBWSwgXFxcImJwZl9tYXBfX3R5cGVcXFwiKSlcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcbitcXHRpbml0X3ZhbHVlLmRhdGEgPSAyO1xcbitcXHRpbml0X3ZhbHVlLm51bXNbNl0gPSAtMTtcXG4rXFx0aW5pdF92YWx1ZS5zdHJ1Y3RfZGF0YS5pID0gMjtcXG4rXFx0aW5pdF92YWx1ZS5zdHJ1Y3RfZGF0YS5udW1zWzZdID0gLTE7XFxuK1xcdGVyciA9IGJwZl9tYXBfX3NldF9pbml0aWFsX3ZhbHVlKG1hcCwgXFx1MDAyNmluaXRfdmFsdWUsIHNpemVvZihpbml0X3ZhbHVlKSk7XFxuK1xcdGlmICghQVNTRVJUX09LKGVyciwgXFxcImJwZl9tYXBfX3NldF9pbml0aWFsX3ZhbHVlXFxcIikpXFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXG4rXFx0aW5pdF9kYXRhID0gYnBmX21hcF9faW5pdGlhbF92YWx1ZShtYXAsIFxcdTAwMjZpbml0X2RhdGFfc3opO1xcbitcXHRpZiAoIUFTU0VSVF9PS19QVFIoaW5pdF9kYXRhLCBcXFwiYnBmX21hcF9faW5pdGlhbF92YWx1ZVxcXCIpKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFxuK1xcdEFTU0VSVF9FUShpbml0X2RhdGEtXFx1MDAzZWRhdGEsIGluaXRfdmFsdWUuZGF0YSwgXFxcImluaXRfdmFsdWUgZGF0YVxcXCIpO1xcbitcXHRBU1NFUlRfRVEoaW5pdF9kYXRhLVxcdTAwM2VydW4sIGluaXRfdmFsdWUucnVuLCBcXFwiaW5pdF92YWx1ZSBydW5cXFwiKTtcXG4rXFx0QVNTRVJUX0VRKGluaXRfZGF0YS1cXHUwMDNlc3RydWN0X2RhdGEuaSwgaW5pdF92YWx1ZS5zdHJ1Y3RfZGF0YS5pLCBcXFwiaW5pdF92YWx1ZSBzdHJ1Y3RfZGF0YS5pXFxcIik7XFxuK1xcdEFTU0VSVF9FUShpbml0X2RhdGEtXFx1MDAzZXN0cnVjdF9kYXRhLm51bXNbNl0sIGluaXRfdmFsdWUuc3RydWN0X2RhdGEubnVtc1s2XSxcXG4rXFx0XFx0ICBcXFwiaW5pdF92YWx1ZSBzdHJ1Y3RfZGF0YS5udW1zWzZdXFxcIik7XFxuK1xcdEFTU0VSVF9FUShpbml0X2RhdGFfc3osIHNpemVvZihpbml0X3ZhbHVlKSwgXFxcImluaXRfdmFsdWUgc2l6ZVxcXCIpO1xcbitcXHRBU1NFUlRfRVEoKHZvaWQgKikgaW5pdF9kYXRhLCAodm9pZCAqKSBza2VsLVxcdTAwM2VwZXJjcHUsIFxcXCJza2VsLVxcdTAwM2VwZXJjcHUgZXEgaW5pdF9kYXRhXFxcIik7XFxuK1xcdEFTU0VSVF9FUShza2VsLVxcdTAwM2VwZXJjcHUtXFx1MDAzZWRhdGEsIGluaXRfdmFsdWUuZGF0YSwgXFxcInNrZWwtXFx1MDAzZXBlcmNwdS1cXHUwMDNlZGF0YVxcXCIpO1xcbitcXHRBU1NFUlRfRVEoc2tlbC1cXHUwMDNlcGVyY3B1LVxcdTAwM2VydW4sIGluaXRfdmFsdWUucnVuLCBcXFwic2tlbC1cXHUwMDNlcGVyY3B1LVxcdTAwM2VydW5cXFwiKTtcXG4rXFx0QVNTRVJUX0VRKHNrZWwtXFx1MDAzZXBlcmNwdS1cXHUwMDNlc3RydWN0X2RhdGEuaSwgaW5pdF92YWx1ZS5zdHJ1Y3RfZGF0YS5pLFxcbitcXHRcXHQgIFxcXCJza2VsLVxcdTAwM2VwZXJjcHUtXFx1MDAzZXN0cnVjdF9kYXRhLmlcXFwiKTtcXG4rXFx0QVNTRVJUX0VRKHNrZWwtXFx1MDAzZXBlcmNwdS1cXHUwMDNlc3RydWN0X2RhdGEubnVtc1s2XSwgaW5pdF92YWx1ZS5zdHJ1Y3RfZGF0YS5udW1zWzZdLFxcbitcXHRcXHQgIFxcXCJza2VsLVxcdTAwM2VwZXJjcHUtXFx1MDAzZXN0cnVjdF9kYXRhLm51bXNbNl1cXFwiKTtcXG4rXFxuK1xcdGVyciA9IHRlc3RfZ2xvYmFsX3BlcmNwdV9kYXRhX19sb2FkKHNrZWwpO1xcbitcXHRpZiAoIUFTU0VSVF9PSyhlcnIsIFxcXCJ0ZXN0X2dsb2JhbF9wZXJjcHVfZGF0YV9fbG9hZFxcXCIpKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFxuK1xcdEFTU0VSVF9PS19QVFIoc2tlbC1cXHUwMDNlcGVyY3B1LCBcXFwic2tlbC1cXHUwMDNlcGVyY3B1XFxcIik7XFxuK1xcbitcXHRtYXBfZmQgPSBicGZfbWFwX19mZChtYXApO1xcbitcXHRwcm9nX2ZkID0gYnBmX3Byb2dyYW1fX2ZkKHNrZWwtXFx1MDAzZXByb2dzLnVwZGF0ZV9wZXJjcHVfZGF0YSk7XFxuK1xcdHRlc3RfcGVyY3B1X2RhdGFfb25fY3B1cyhtYXBfZmQsIHByb2dfZmQsIG51bV9vbmxpbmUsIG9ubGluZSk7XFxuK1xcbitvdXQ6XFxuK1xcdHRlc3RfZ2xvYmFsX3BlcmNwdV9kYXRhX19kZXN0cm95KHNrZWwpO1xcbitcXHRmcmVlKG9ubGluZSk7XFxuK31cXG4rXFxuK3N0YXRpYyB2b2lkIHRlc3RfZ2xvYmFsX3BlcmNwdV9kYXRhX2xza2VsKHZvaWQpXFxuK3tcXG4rXFx0c3RydWN0IHRlc3RfZ2xvYmFsX3BlcmNwdV9kYXRhX2xza2VsICpsc2tlbCA9IE5VTEw7XFxuK1xcdGludCBwcm9nX2ZkLCBtYXBfZmQsIGVyciwgbnVtX29ubGluZTtcXG4rXFx0Ym9vbCAqb25saW5lO1xcbitcXG4rXFx0ZXJyID0gcGFyc2VfY3B1X21hc2tfZmlsZShcXFwiL3N5cy9kZXZpY2VzL3N5c3RlbS9jcHUvb25saW5lXFxcIiwgXFx1MDAyNm9ubGluZSwgXFx1MDAyNm51bV9vbmxpbmUpO1xcbitcXHRpZiAoIUFTU0VSVF9PSyhlcnIsIFxcXCJwYXJzZV9jcHVfbWFza19maWxlXFxcIikpXFxuK1xcdFxcdHJldHVybjtcXG4rXFxuK1xcdGxza2VsID0gdGVzdF9nbG9iYWxfcGVyY3B1X2RhdGFfbHNrZWxfX29wZW5fYW5kX2xvYWQoKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0tfUFRSKGxza2VsLCBcXFwidGVzdF9nbG9iYWxfcGVyY3B1X2RhdGFfbHNrZWxfX29wZW5fYW5kX2xvYWRcXFwiKSlcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcbitcXHRtYXBfZmQgPSBsc2tlbC1cXHUwMDNlbWFwcy5wZXJjcHUubWFwX2ZkO1xcbitcXHRwcm9nX2ZkID0gbHNrZWwtXFx1MDAzZXByb2dzLnVwZGF0ZV9wZXJjcHVfZGF0YS5wcm9nX2ZkO1xcbitcXHR0ZXN0X3BlcmNwdV9kYXRhX29uX2NwdXMobWFwX2ZkLCBwcm9nX2ZkLCBudW1fb25saW5lLCBvbmxpbmUpO1xcbitcXG4rb3V0OlxcbitcXHR0ZXN0X2dsb2JhbF9wZXJjcHVfZGF0YV9sc2tlbF9fZGVzdHJveShsc2tlbCk7XFxuK1xcdGZyZWUob25saW5lKTtcXG4rfVxcbitcXG4rc3RhdGljIGludCBjcmVhdGVfcmRvbmx5X3BlcmNwdV9hcnJheSh2b2lkKVxcbit7XFxuK1xcdExJQkJQRl9PUFRTKGJwZl9tYXBfY3JlYXRlX29wdHMsIG1hcF9vcHRzLFxcbitcXHRcXHQgICAgLm1hcF9mbGFncyA9IEJQRl9GX1JET05MWV9QUk9HLFxcbitcXHQpO1xcbitcXHRpbnQga2V5ID0gMCwgbWFwX2ZkLCBlcnI7XFxuK1xcdF9fdTY0IHZhbHVlID0gMDtcXG4rXFxuK1xcdG1hcF9mZCA9IGJwZl9tYXBfY3JlYXRlKEJQRl9NQVBfVFlQRV9QRVJDUFVfQVJSQVksIFxcXCJwZXJjcHVfcm9fbWFwXFxcIiwgc2l6ZW9mKGludCksXFxuK1xcdFxcdFxcdFxcdHNpemVvZihfX3U2NCksIDEsIFxcdTAwMjZtYXBfb3B0cyk7XFxuK1xcdGlmICghQVNTRVJUX0dFKG1hcF9mZCwgMCwgXFxcImJwZl9tYXBfY3JlYXRlXFxcIikpXFxuK1xcdFxcdHJldHVybiAtMTtcXG4rXFxuK1xcdGVyciA9IGJwZl9tYXBfdXBkYXRlX2VsZW0obWFwX2ZkLCBcXHUwMDI2a2V5LCBcXHUwMDI2dmFsdWUsIEJQRl9GX0FMTF9DUFVTKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0soZXJyLCBcXFwiYnBmX21hcF91cGRhdGVfZWxlbVxcXCIpKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFxuK1xcdGVyciA9IGJwZl9tYXBfZnJlZXplKG1hcF9mZCk7XFxuK1xcdGlmICghQVNTRVJUX09LKGVyciwgXFxcImJwZl9tYXBfZnJlZXplXFxcIikpXFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXG4rXFx0cmV0dXJuIG1hcF9mZDtcXG4rXFxuK291dDpcXG4rXFx0Y2xvc2UobWFwX2ZkKTtcXG4rXFx0cmV0dXJuIC0xO1xcbit9XFxuK1xcbitzdGF0aWMgdm9pZCB0ZXN0X2dsb2JhbF9wZXJjcHVfZGF0YV9yZG9ubHlfZGlyZWN0X3JlYWQodm9pZClcXG4re1xcbitcXHRzdHJ1Y3QgYnBmX2luc24gaW5zbnNbXSA9IHtcXG4rXFx0XFx0QlBGX0xEX01BUF9WQUxVRShCUEZfUkVHXzEsIDAsIDApLFxcbitcXHRcXHRCUEZfTERYX01FTShCUEZfRFcsIEJQRl9SRUdfMCwgQlBGX1JFR18xLCAwKSxcXG4rXFx0XFx0QlBGX0VYSVRfSU5TTigpLFxcbitcXHR9O1xcbitcXHRpbnQgbWFwX2ZkLCBwcm9nX2ZkO1xcbitcXG4rXFx0bWFwX2ZkID0gY3JlYXRlX3Jkb25seV9wZXJjcHVfYXJyYXkoKTtcXG4rXFx0aWYgKG1hcF9mZCBcXHUwMDNjIDApXFxuK1xcdFxcdHJldHVybjtcXG4rXFxuK1xcdGluc25zWzBdLmltbSA9IG1hcF9mZDtcXG4rXFx0cHJvZ19mZCA9IGJwZl9wcm9nX2xvYWQoQlBGX1BST0dfVFlQRV9TT0NLRVRfRklMVEVSLCBcXFwicGVyY3B1X3JvX3Byb2dcXFwiLCBcXFwiR1BMXFxcIiwgaW5zbnMsXFxuK1xcdFxcdFxcdFxcdEFSUkFZX1NJWkUoaW5zbnMpLCBOVUxMKTtcXG4rXFx0aWYgKEFTU0VSVF9HRShwcm9nX2ZkLCAwLCBcXFwiYnBmX3Byb2dfbG9hZFxcXCIpKVxcbitcXHRcXHRjbG9zZShwcm9nX2ZkKTtcXG4rXFx0Y2xvc2UobWFwX2ZkKTtcXG4rfVxcbitcXG4rc3RhdGljIHZvaWQgdGVzdF9nbG9iYWxfcGVyY3B1X2RhdGFfcmRvbmx5X2RpcmVjdF93cml0ZSh2b2lkKVxcbit7XFxuK1xcdExJQkJQRl9PUFRTKGJwZl9wcm9nX2xvYWRfb3B0cywgcHJvZ19vcHRzKTtcXG4rXFx0c3RydWN0IGJwZl9pbnNuIGluc25zW10gPSB7XFxuK1xcdFxcdEJQRl9MRF9NQVBfVkFMVUUoQlBGX1JFR18xLCAwLCAwKSxcXG4rXFx0XFx0QlBGX0xEWF9NRU0oQlBGX0RXLCBCUEZfUkVHXzAsIEJQRl9SRUdfMSwgMCksXFxuK1xcdFxcdEJQRl9TVF9NRU0oQlBGX0RXLCBCUEZfUkVHXzEsIDAsIDApLFxcbitcXHRcXHRCUEZfRVhJVF9JTlNOKCksXFxuK1xcdH07XFxuK1xcdGNoYXIgbG9nX2J1ZlsyNTZdID0ge307XFxuK1xcdGludCBtYXBfZmQsIHByb2dfZmQ7XFxuK1xcbitcXHRwcm9nX29wdHMubG9nX2J1ZiA9IGxvZ19idWY7XFxuK1xcdHByb2dfb3B0cy5sb2dfc2l6ZSA9IHNpemVvZihsb2dfYnVmKTtcXG4rXFx0cHJvZ19vcHRzLmxvZ19sZXZlbCA9IDE7XFxuK1xcbitcXHRtYXBfZmQgPSBjcmVhdGVfcmRvbmx5X3BlcmNwdV9hcnJheSgpO1xcbitcXHRpZiAobWFwX2ZkIFxcdTAwM2MgMClcXG4rXFx0XFx0cmV0dXJuO1xcbitcXG4rXFx0aW5zbnNbMF0uaW1tID0gbWFwX2ZkO1xcbitcXHRwcm9nX2ZkID0gYnBmX3Byb2dfbG9hZChCUEZfUFJPR19UWVBFX1NPQ0tFVF9GSUxURVIsIFxcXCJwZXJjcHVfcm9fcHJvZ1xcXCIsIFxcXCJHUExcXFwiLCBpbnNucyxcXG4rXFx0XFx0XFx0XFx0QVJSQVlfU0laRShpbnNucyksIFxcdTAwMjZwcm9nX29wdHMpO1xcbitcXHRpZiAoIUFTU0VSVF9MVChwcm9nX2ZkLCAwLCBcXFwiYnBmX3Byb2dfbG9hZFxcXCIpKVxcbitcXHRcXHRjbG9zZShwcm9nX2ZkKTtcXG4rXFx0ZWxzZVxcbitcXHRcXHRBU1NFUlRfSEFTX1NVQlNUUihsb2dfYnVmLCBcXFwid3JpdGUgaW50byBtYXAgZm9yYmlkZGVuXFxcIiwgXFxcInZlcmlmaWVyIGxvZ1xcXCIpO1xcbitcXHRjbG9zZShtYXBfZmQpO1xcbit9XFxuK1xcbitzdGF0aWMgdm9pZCB0ZXN0X2dsb2JhbF9wZXJjcHVfZGF0YV92ZXJpZmllcl9sb2codm9pZClcXG4re1xcbitcXHRSVU5fVEVTVFModGVzdF9nbG9iYWxfcGVyY3B1X2RhdGEpO1xcbit9XFxuK1xcbitzdGF0aWMgdm9pZCB0ZXN0X2dsb2JhbF9wZXJjcHVfZGF0YV9pdGVyKHZvaWQpXFxuK3tcXG4rXFx0REVDTEFSRV9MSUJCUEZfT1BUUyhicGZfaXRlcl9hdHRhY2hfb3B0cywgb3B0cyk7XFxuK1xcdHN0cnVjdCB0ZXN0X2dsb2JhbF9wZXJjcHVfZGF0YSAqc2tlbDtcXG4rXFx0dW5pb24gYnBmX2l0ZXJfbGlua19pbmZvIGxpbmZvID0ge307XFxuK1xcdHN0cnVjdCBicGZfbGluayAqbGluayA9IE5VTEw7XFxuK1xcdGludCBmZCwgbnVtX2NwdXMsIGxlbiwgZXJyO1xcbitcXHRjaGFyIGJ1ZlsxNl07XFxuK1xcbitcXHRudW1fY3B1cyA9IGxpYmJwZl9udW1fcG9zc2libGVfY3B1cygpO1xcbitcXHRpZiAoIUFTU0VSVF9HVChudW1fY3B1cywgMCwgXFxcImxpYmJwZl9udW1fcG9zc2libGVfY3B1c1xcXCIpKVxcbitcXHRcXHRyZXR1cm47XFxuK1xcbitcXHRza2VsID0gdGVzdF9nbG9iYWxfcGVyY3B1X2RhdGFfX29wZW4oKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0tfUFRSKHNrZWwsIFxcXCJ0ZXN0X2dsb2JhbF9wZXJjcHVfZGF0YV9fb3BlblxcXCIpKVxcbitcXHRcXHRyZXR1cm47XFxuK1xcbitcXHRza2VsLVxcdTAwM2Vyb2RhdGEtXFx1MDAzZW51bV9jcHVzID0gbnVtX2NwdXM7XFxuK1xcdHNrZWwtXFx1MDAzZXJvZGF0YS1cXHUwMDNlb2Zmc2V0b2ZfbnVtID0gb2Zmc2V0b2Yoc3RydWN0IHRlc3RfZ2xvYmFsX3BlcmNwdV9kYXRhX19wZXJjcHUsIHN0cnVjdF9kYXRhKTtcXG4rXFx0c2tlbC1cXHUwMDNlcm9kYXRhLVxcdTAwM2VvZmZzZXRvZl9udW0gKz0gc2l6ZW9mKHNrZWwtXFx1MDAzZXBlcmNwdS1cXHUwMDNlc3RydWN0X2RhdGEpIC0gc2l6ZW9mKGludCk7XFxuK1xcdHNrZWwtXFx1MDAzZXJvZGF0YS1cXHUwMDNlZWxlbV9zeiA9IHJvdW5kdXAoc2l6ZW9mKHN0cnVjdCB0ZXN0X2dsb2JhbF9wZXJjcHVfZGF0YV9fcGVyY3B1KSwgOCk7XFxuK1xcdHNrZWwtXFx1MDAzZXBlcmNwdS1cXHUwMDNlc3RydWN0X2RhdGEubnVtc1s2XSA9IDB4YzBkZTtcXG4rXFxuK1xcdGVyciA9IHRlc3RfZ2xvYmFsX3BlcmNwdV9kYXRhX19sb2FkKHNrZWwpO1xcbitcXHRpZiAoIUFTU0VSVF9PSyhlcnIsIFxcXCJ0ZXN0X2dsb2JhbF9wZXJjcHVfZGF0YV9fbG9hZFxcXCIpKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFxuK1xcdGxpbmZvLm1hcC5tYXBfZmQgPSBicGZfbWFwX19mZChza2VsLVxcdTAwM2VtYXBzLnBlcmNwdSk7XFxuK1xcdG9wdHMubGlua19pbmZvID0gXFx1MDAyNmxpbmZvO1xcbitcXHRvcHRzLmxpbmtfaW5mb19sZW4gPSBzaXplb2YobGluZm8pO1xcbitcXHRsaW5rID0gYnBmX3Byb2dyYW1fX2F0dGFjaF9pdGVyKHNrZWwtXFx1MDAzZXByb2dzLmR1bXBfcGVyY3B1X2RhdGEsIFxcdTAwMjZvcHRzKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0tfUFRSKGxpbmssIFxcXCJicGZfcHJvZ3JhbV9fYXR0YWNoX2l0ZXJcXFwiKSlcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcbitcXHRmZCA9IGJwZl9pdGVyX2NyZWF0ZShicGZfbGlua19fZmQobGluaykpO1xcbitcXHRpZiAoIUFTU0VSVF9HRShmZCwgMCwgXFxcImJwZl9pdGVyX2NyZWF0ZVxcXCIpKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFxuK1xcdHdoaWxlICgobGVuID0gcmVhZChmZCwgYnVmLCBzaXplb2YoYnVmKSkpIFxcdTAwM2UgMClcXG4rXFx0XFx0ZG8geyB9IHdoaWxlICgwKTtcXG4rXFx0QVNTRVJUX0VRKGxlbiwgMCwgXFxcInJlYWQgaXRlclxcXCIpO1xcbitcXHRBU1NFUlRfVFJVRShza2VsLVxcdTAwM2Vic3MtXFx1MDAzZXJ1bl9pdGVyLCBcXFwicnVuX2l0ZXJcXFwiKTtcXG4rXFx0QVNTRVJUX0VRKHNrZWwtXFx1MDAzZWJzcy1cXHUwMDNlcGVyY3B1X2RhdGFfc3VtLCAweGMwZGUgKiBudW1fY3B1cywgXFxcInBlcmNwdV9kYXRhX3N1bVxcXCIpO1xcbitcXG4rXFx0Y2xvc2UoZmQpO1xcbitvdXQ6XFxuK1xcdGJwZl9saW5rX19kZXN0cm95KGxpbmspO1xcbitcXHR0ZXN0X2dsb2JhbF9wZXJjcHVfZGF0YV9fZGVzdHJveShza2VsKTtcXG4rfVxcbitcXG4rdm9pZCB0ZXN0X2dsb2JhbF9wZXJjcHVfZGF0YSh2b2lkKVxcbit7XFxuK1xcdGlmICghZmVhdF9zdXBwb3J0ZWQoTlVMTCwgRkVBVF9QRVJDUFVfREFUQSkpIHtcXG4rXFx0XFx0dGVzdF9fc2tpcCgpO1xcbitcXHRcXHRyZXR1cm47XFxuK1xcdH1cXG4rXFxuK1xcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFxcXCJpbml0XFxcIikpXFxuK1xcdFxcdHRlc3RfZ2xvYmFsX3BlcmNwdV9kYXRhX2luaXQoKTtcXG4rXFx0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXFxcImxza2VsXFxcIikpXFxuK1xcdFxcdHRlc3RfZ2xvYmFsX3BlcmNwdV9kYXRhX2xza2VsKCk7XFxuK1xcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFxcXCJyZG9ubHlfZGlyZWN0X3JlYWRcXFwiKSlcXG4rXFx0XFx0dGVzdF9nbG9iYWxfcGVyY3B1X2RhdGFfcmRvbmx5X2RpcmVjdF9yZWFkKCk7XFxuK1xcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFxcXCJyZG9ubHlfZGlyZWN0X3dyaXRlXFxcIikpXFxuK1xcdFxcdHRlc3RfZ2xvYmFsX3BlcmNwdV9kYXRhX3Jkb25seV9kaXJlY3Rfd3JpdGUoKTtcXG4rXFx0dGVzdF9nbG9iYWxfcGVyY3B1X2RhdGFfdmVyaWZpZXJfbG9nKCk7XFxuK1xcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFxcXCJpdGVyXFxcIikpXFxuK1xcdFxcdHRlc3RfZ2xvYmFsX3BlcmNwdV9kYXRhX2l0ZXIoKTtcXG4rfVxcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9nbG9iYWxfcGVyY3B1X3N1YnNrZWwuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2dsb2JhbF9wZXJjcHVfc3Vic2tlbC5jXFxubmV3IGZpbGUgbW9kZSAxMDA2NDRcXG5pbmRleCAwMDAwMDAwMDAwMDAwMC4uOGFlYmQ1MzNkODZiNTRcXG4tLS0gL2Rldi9udWxsXFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvZ2xvYmFsX3BlcmNwdV9zdWJza2VsLmNcXG5AQCAtMCwwICsxLDM3IEBAXFxuKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXFxuKyNpbmNsdWRlIFxcdTAwM2N0ZXN0X3Byb2dzLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcXCJ0ZXN0X2dsb2JhbF9wZXJjcHVfZGF0YS5zdWJza2VsLmhcXFwiXFxuK1xcbit2b2lkIHRlc3RfZ2xvYmFsX3BlcmNwdV9kYXRhX3N1YnNrZWwodm9pZClcXG4re1xcbitcXHRzdHJ1Y3QgdGVzdF9nbG9iYWxfcGVyY3B1X2RhdGEgKnN1YnNrZWwgPSBOVUxMO1xcbitcXHRzdHJ1Y3QgYnBmX29iamVjdCAqb2JqO1xcbitcXHRpbnQgaTtcXG4rXFxuK1xcdG9iaiA9IGJwZl9vYmplY3RfX29wZW5fZmlsZShcXFwiLi90ZXN0X2dsb2JhbF9wZXJjcHVfZGF0YS5icGYub1xcXCIsIE5VTEwpO1xcbitcXHRpZiAoIUFTU0VSVF9PS19QVFIob2JqLCBcXFwiYnBmX29iamVjdF9fb3Blbl9maWxlXFxcIikpXFxuK1xcdFxcdHJldHVybjtcXG4rXFxuK1xcdHN1YnNrZWwgPSB0ZXN0X2dsb2JhbF9wZXJjcHVfZGF0YV9fb3BlbihvYmopO1xcbitcXHRpZiAoIUFTU0VSVF9PS19QVFIoc3Vic2tlbCwgXFxcInRlc3RfZ2xvYmFsX3BlcmNwdV9kYXRhX19vcGVuXFxcIikpXFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXG4rXFx0aWYgKCFBU1NFUlRfT0tfUFRSKHN1YnNrZWwtXFx1MDAzZXN1YnNrZWwsIFxcXCJzdWJza2VsXFxcIikpXFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXHRpZiAoIUFTU0VSVF9PS19QVFIoc3Vic2tlbC1cXHUwMDNlbWFwcy5wZXJjcHUsIFxcXCJtYXBzLnBlcmNwdVxcXCIpKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFx0QVNTRVJUX0VRKGJwZl9tYXBfX3R5cGUoc3Vic2tlbC1cXHUwMDNlbWFwcy5wZXJjcHUpLCBCUEZfTUFQX1RZUEVfUEVSQ1BVX0FSUkFZLFxcbitcXHRcXHQgIFxcXCJwZXJjcHVfbWFwX3R5cGVcXFwiKTtcXG4rXFx0QVNTRVJUX0dUKHN1YnNrZWwtXFx1MDAzZXN1YnNrZWwtXFx1MDAzZXZhcl9jbnQsIDAsIFxcXCJ2YXJfY250XFxcIik7XFxuK1xcbitcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2Mgc3Vic2tlbC1cXHUwMDNlc3Vic2tlbC1cXHUwMDNldmFyX2NudDsgaSsrKSB7XFxuK1xcdFxcdGNvbnN0IHN0cnVjdCBicGZfdmFyX3NrZWxldG9uICp2YXI7XFxuK1xcbitcXHRcXHR2YXIgPSAodm9pZCAqKSBzdWJza2VsLVxcdTAwM2VzdWJza2VsLVxcdTAwM2V2YXJzICsgaSAqIHN1YnNrZWwtXFx1MDAzZXN1YnNrZWwtXFx1MDAzZXZhcl9za2VsX3N6O1xcbitcXHRcXHRBU1NFUlRfTkVRKHZhci1cXHUwMDNlbWFwLCBcXHUwMDI2c3Vic2tlbC1cXHUwMDNlbWFwcy5wZXJjcHUsIFxcXCJ2YXJcXFwiKTtcXG4rXFx0fVxcbitcXG4rb3V0OlxcbitcXHR0ZXN0X2dsb2JhbF9wZXJjcHVfZGF0YV9fZGVzdHJveShzdWJza2VsKTtcXG4rXFx0YnBmX29iamVjdF9fY2xvc2Uob2JqKTtcXG4rfVxcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvdGVzdF9nbG9iYWxfcGVyY3B1X2RhdGEuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy90ZXN0X2dsb2JhbF9wZXJjcHVfZGF0YS5jXFxubmV3IGZpbGUgbW9kZSAxMDA2NDRcXG5pbmRleCAwMDAwMDAwMDAwMDAwMC4uZWVmODhmZDYxYWY1MTFcXG4tLS0gL2Rldi9udWxsXFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL3Rlc3RfZ2xvYmFsX3BlcmNwdV9kYXRhLmNcXG5AQCAtMCwwICsxLDc5IEBAXFxuKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXFxuKyNpbmNsdWRlIFxcdTAwM2N2bWxpbnV4LmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NicGYvYnBmX2hlbHBlcnMuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFxcImJwZl9taXNjLmhcXFwiXFxuK1xcbitpbnQgZGF0YSBTRUMoXFxcIi5wZXJjcHVcXFwiKSA9IC0xO1xcbitpbnQgbnVtc1s3XSBTRUMoXFxcIi5wZXJjcHVcXFwiKTtcXG4rY2hhciBydW4gU0VDKFxcXCIucGVyY3B1XFxcIikgPSAwO1xcbitzdHJ1Y3Qge1xcbitcXHRjaGFyIHNldDtcXG4rXFx0aW50IGk7XFxuK1xcdGludCBudW1zWzddO1xcbit9IHN0cnVjdF9kYXRhIFNFQyhcXFwiLnBlcmNwdVxcXCIpID0ge1xcbitcXHQuc2V0ID0gMCxcXG4rXFx0LmkgPSAtMSxcXG4rfTtcXG4rXFxuK1NFQyhcXFwicmF3X3RwL3Rhc2tfcmVuYW1lXFxcIilcXG4rX19hdXhpbGlhcnlcXG4raW50IHVwZGF0ZV9wZXJjcHVfZGF0YSh2b2lkICpjdHgpXFxuK3tcXG4rXFx0c3RydWN0X2RhdGEubnVtc1s2XSA9IDB4YzBkZTtcXG4rXFx0c3RydWN0X2RhdGEuc2V0ID0gMTtcXG4rXFx0c3RydWN0X2RhdGEuaSA9IDE7XFxuK1xcdG51bXNbNl0gPSAweGMwZGU7XFxuK1xcdGRhdGEgPSAxO1xcbitcXHRydW4gPSAxO1xcbitcXHRyZXR1cm4gMDtcXG4rfVxcbitcXG4rc3RhdGljIGNvbnN0IGNoYXIgZm10W10gU0VDKFxcXCIucGVyY3B1LmZtdFxcXCIpID0gXFxcImRhdGEgJWRcXFxcblxcXCI7XFxuK1xcbitTRUMoXFxcIj9rcHJvYmVcXFwiKVxcbitfX2ZhaWx1cmUgX19tc2coXFxcIlJ7e1swLTldK319IHBvaW50cyB0byBwZXJjcHVfYXJyYXkgbWFwIHdoaWNoIGNhbm5vdCBiZSB1c2VkIGFzIGNvbnN0IHN0cmluZ1xcXCIpXFxuK2ludCB2ZXJpZmllcl9zdHJuY21wKHZvaWQgKmN0eClcXG4re1xcbitcXHRyZXR1cm4gYnBmX3N0cm5jbXAoXFxcInRlc3RcXFwiLCA1LCBmbXQpO1xcbit9XFxuK1xcbitTRUMoXFxcIj9rcHJvYmVcXFwiKVxcbitfX2ZhaWx1cmUgX19tc2coXFxcIlJ7e1swLTldK319IHBvaW50cyB0byBwZXJjcHVfYXJyYXkgbWFwIHdoaWNoIGNhbm5vdCBiZSB1c2VkIGFzIGNvbnN0IHN0cmluZ1xcXCIpXFxuK2ludCB2ZXJpZmllcl9zbnByaW50Zih2b2lkICpjdHgpXFxuK3tcXG4rXFx0dTY0IGFyZ3NbXSA9IHsgZGF0YSB9O1xcbitcXHRjaGFyIGJ1ZlsxMjhdO1xcbitcXHRpbnQgbGVuO1xcbitcXG4rXFx0bGVuID0gYnBmX3NucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksIGZtdCwgYXJncywgc2l6ZW9mKGFyZ3MpKTtcXG4rXFx0aWYgKGxlbiBcXHUwMDNlIDApXFxuK1xcdFxcdGJwZl9wcmludGsoXFxcInNucHJpbnRmOiAlc1xcXFxuXFxcIiwgYnVmKTtcXG4rXFx0cmV0dXJuIDA7XFxuK31cXG4rXFxuK3ZvbGF0aWxlIGNvbnN0IF9fdTMyIG51bV9jcHVzID0gMDtcXG4rdm9sYXRpbGUgY29uc3QgaW50IG9mZnNldG9mX251bTtcXG4rdm9sYXRpbGUgY29uc3QgaW50IGVsZW1fc3o7XFxuK19fdTMyIHBlcmNwdV9kYXRhX3N1bSA9IDA7XFxuK2Jvb2wgcnVuX2l0ZXIgPSBmYWxzZTtcXG4rXFxuK1NFQyhcXFwiaXRlci9icGZfbWFwX2VsZW1cXFwiKVxcbitfX2F1eGlsaWFyeVxcbitpbnQgZHVtcF9wZXJjcHVfZGF0YShzdHJ1Y3QgYnBmX2l0ZXJfX2JwZl9tYXBfZWxlbSAqY3R4KVxcbit7XFxuK1xcdHZvaWQgKnBwdHIgPSBjdHgtXFx1MDAzZXZhbHVlO1xcbitcXHRpbnQgaTtcXG4rXFxuK1xcdGlmICghcHB0cilcXG4rXFx0XFx0cmV0dXJuIDA7XFxuK1xcbitcXHRydW5faXRlciA9IHRydWU7XFxuK1xcbitcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgbnVtX2NwdXM7IGkrKykge1xcbitcXHRcXHRwZXJjcHVfZGF0YV9zdW0gKz0gKihpbnQgKikgKHBwdHIgKyBvZmZzZXRvZl9udW0pO1xcbitcXHRcXHRwcHRyICs9IGVsZW1fc3o7XFxuK1xcdH1cXG4rXFx0cmV0dXJuIDA7XFxuK31cXG4rXFxuK2NoYXIgX2xpY2Vuc2VbXSBTRUMoXFxcImxpY2Vuc2VcXFwiKSA9IFxcXCJHUExcXFwiO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wNi0yOVQxNjozOTozMS43MTk3MDE3OTNaIiwiU2VxIjoyLCJOZXN0aW5nIjoxLCJUeXBlIjoiYWdlbnQiLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjI5NjIyODAxMjk0LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIkJQRl9TWVNDQUxMXCIsXG4gICAgXCJCUEZfSklUXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwicGVyY3B1X2FycmF5X21hcF9kaXJlY3RfdmFsdWVfYWRkclwiLFxuICAgIFwicGVyY3B1X2FycmF5X21hcF9kaXJlY3RfdmFsdWVfbWV0YVwiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGludHJvZHVjZXMgc3VwcG9ydCBmb3IgYC5wZXJjcHVgIGdsb2JhbCBkYXRhIG1hcHMgaW4gQlBGLCB3aGljaCB0cmFuc2xhdGVzIHRvIGBCUEZfTUFQX1RZUEVfUEVSQ1BVX0FSUkFZYC4gSXQgYWRkcyBuZXcgbWFwIG9wZXJhdGlvbnMgYG1hcF9kaXJlY3RfdmFsdWVfYWRkcmAgYW5kIGBtYXBfZGlyZWN0X3ZhbHVlX21ldGFgIGZvciBwZXJjcHUgYXJyYXlzLCBhbmQgbW9kaWZpZXMgdGhlIHZlcmlmaWVyIHRvIGhhbmRsZSBwZXJjcHUgYXJyYXkgYWNjZXNzZXMgYW5kIHBhdGNoIGluc3RydWN0aW9ucyBmb3IgSklULiBUaGlzIGlzIGEgZnVuY3Rpb25hbCBjaGFuZ2UgaW4gdGhlIGNvcmUgQlBGIHN1YnN5c3RlbSBhbmQgc2hvdWxkIGJlIGZ1enplZC5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiWW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIG1haW50YWluZXIuXG5Zb3VyIGpvYiBpcyB0byByZXZpZXcgYSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kIGRldGVybWluZVxuaWYgaXQgbWFrZXMgZnVuY3Rpb25hbCBjaGFuZ2VzIHRvIHRoZSBrZXJuZWwgdGhhdCBzaG91bGQgYmUgZnV6emVkLlxuXG5JTVBPUlRBTlQ6IFRoZSBjaGFuZ2VzIGhhdmUgQUxSRUFEWSBiZWVuIGFwcGxpZWQgYW5kIGNvbW1pdHRlZCBhcyB0aGUgSEVBRCBjb21taXQgaW5cbnlvdXIgd29ya3NwYWNlLiBEbyBOT1QgcmVseSBvbiB5b3VyIGludGVybmFsIGtub3dsZWRnZSBvZiB0aGUga2VybmVsLiBZb3UgbXVzdCBhY3RpdmVseVxudXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gZXhhbWluZSB0aGUgYWN0dWFsIHNvdXJjZSBjb2RlIGFuZCBjb25maXJtIGFueSBhc3N1bXB0aW9ucy5cblxuUmV0dXJuIFdvcnRoRnV6emluZz1mYWxzZSBpZiB0aGUgcGF0Y2ggb25seSBjb250YWluczpcbi0gTW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLywgS2NvbmZpZyBmaWxlcywgb3IgY29kZSBjb21tZW50cy5cbi0gUHVyZWx5IGRlY29yYXRpdmUgY2hhbmdlcywgc3VjaCBhcyBsb2dnaW5nIChlLmcuLCBwcl9lcnIsIHByaW50aykgb3IgdHJhY2Vwb2ludHMuXG4tIENoYW5nZXMgdG8gbnVtZXJpYyBjb25zdGFudHMgb3IgbWFjcm9zIHRoYXQgZG8gbm90IGZ1bmN0aW9uYWxseSBhbHRlciBleGVjdXRpb24gZmxvdy5cbi0gQ29kZSBwYXRocyB0aGF0IGFyZSBpbXBvc3NpYmxlIHRvIHJlYWNoIGluIHZpcnR1YWxpemVkIGVudmlyb25tZW50cyBsaWtlIEdDRSBvciBRRU1VLFxuZXZlbiB3aGVuIHV0aWxpemluZyBzb2Z0d2FyZS1lbXVsYXRlZCBoYXJkd2FyZSAoZS5nLiwgdXNiIGdhZGdldCwgbWFjODAyMTFfaHdzaW0pLlxuXG5JZiBpdCBtb2RpZmllcyByZWFjaGFibGUgY29yZSBrZXJuZWwgbG9naWMsIGRyaXZlcnMsIG9yIGFyY2hpdGVjdHVyZXMsIHVzZSB5b3VyIGNvZGUgc2VhcmNoXG50b29scyB0byB2ZXJpZnkgdGhlIGNvZGUgY2FuIGJlIGV4ZWN1dGVkLCB0aGVuIHJldHVybiBXb3J0aEZ1enppbmc9dHJ1ZS5cblxuV2hlbiByZXR1cm5pbmcgV29ydGhGdXp6aW5nPXRydWUsIHlvdSBNVVNUIEFMU086XG4xLiBFeHRyYWN0IGFueSBzcGVjaWZpYyBrZXJuZWwgZnVuY3Rpb25zIHRoYXQgc2hvdWxkIGJlIGhlYXZpbHkgZnV6emVkIGludG8gRm9jdXNTeW1ib2xzLlxuICAgQXZvaWQgbGlzdGluZyBnZW5lcmljIGhvdC1wYXRoIGZ1bmN0aW9ucyB0byBwcmV2ZW50IHNrZXdlZCB0ZXN0IGRpc3RyaWJ1dGlvbnMuXG4yLiBJZGVudGlmeSBhbnkgc3BlY2lmaWMgQ09ORklHXyBvcHRpb25zIHJlcXVpcmVkIHRvIHByb3Blcmx5IHRlc3QgdGhpcyBuZXcvbW9kaWZpZWQgZmVhdHVyZS5cbiAgIEdvIGFuZCBsb29rIGludG8gdGhlIEtjb25maWcgZmlsZXMgYW5kIGNoZWNrIGZvciBpZmRlZnMgYXJvdW5kIHRoZSBjb2RlLCBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy5cbiAgIERvIG5vdCBsaXN0IHRvbyBnZW5lcmljIGNvbmZpZ3MgKHdlIGFscmVhZHkgaGF2ZSB0aGVtIGVuYWJsZWQpLiBPbmx5IGxpc3QgdGhvc2UgdGhhdFxuICAgc3BlY2lmaWNhbGx5IGNvdmVyIHRoZSBtb2RpZmllZCBjb2RlLiBMaXN0IHRoZW0gaW4gdGhlIEVuYWJsZUNvbmZpZ3Mgb3V0cHV0IGFycmF5LFxuICAgYW5kIERPIE5PVCBhZGQgYSAnQ09ORklHXycgcHJlZml4IChlLmcuLCByZXR1cm4gXCJORVRfSVBWNFwiIGluc3RlYWQgb2YgXCJDT05GSUdfTkVUX0lQVjRcIikuXG5QcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy5cblxuXG5Vc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLlxuSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuXG5JZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuXG4iLCJQcm9tcHQiOiJGb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczpcbmNvbW1pdCA2YmY3NzE0MjdiM2NkNDg1MmM5NzBkNmI0NGIzYzAxYmQxOGNhNzMwXG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIE1vbiBKdW4gMjkgMTY6Mzk6MjggMjAyNiArMDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS9rZXJuZWwvYnBmL2FycmF5bWFwLmMgYi9rZXJuZWwvYnBmL2FycmF5bWFwLmNcbmluZGV4IDI0OGI0ODE4MTc4Y2QxLi5jNGU5NDMwOTQxZTU0OSAxMDA2NDRcbi0tLSBhL2tlcm5lbC9icGYvYXJyYXltYXAuY1xuKysrIGIva2VybmVsL2JwZi9hcnJheW1hcC5jXG5AQCAtMjU5LDYgKzI1OSwzNyBAQCBzdGF0aWMgdm9pZCAqcGVyY3B1X2FycmF5X21hcF9sb29rdXBfZWxlbShzdHJ1Y3QgYnBmX21hcCAqbWFwLCB2b2lkICprZXkpXG4gXHRyZXR1cm4gdGhpc19jcHVfcHRyKGFycmF5LVx1MDAzZXBwdHJzW2luZGV4IFx1MDAyNiBhcnJheS1cdTAwM2VpbmRleF9tYXNrXSk7XG4gfVxuIFxuK3N0YXRpYyBpbnQgcGVyY3B1X2FycmF5X21hcF9kaXJlY3RfdmFsdWVfYWRkcihjb25zdCBzdHJ1Y3QgYnBmX21hcCAqbWFwLCB1NjQgKmltbSwgdTMyIG9mZilcbit7XG4rXHRzdHJ1Y3QgYnBmX2FycmF5ICphcnJheSA9IGNvbnRhaW5lcl9vZihtYXAsIHN0cnVjdCBicGZfYXJyYXksIG1hcCk7XG4rXG4rXHRpZiAobWFwLVx1MDAzZW1heF9lbnRyaWVzICE9IDEpXG4rXHRcdHJldHVybiAtRU9QTk9UU1VQUDtcbitcdGlmIChvZmYgXHUwMDNlPSBtYXAtXHUwMDNldmFsdWVfc2l6ZSlcbitcdFx0cmV0dXJuIC1FSU5WQUw7XG4rXHRpZiAoIWJwZl9qaXRfc3VwcG9ydHNfcGVyY3B1X2luc24oKSlcbitcdFx0cmV0dXJuIC1FT1BOT1RTVVBQO1xuK1xuK1x0KmltbSA9ICh1NjQpKF9fZm9yY2UgdW5zaWduZWQgbG9uZykgYXJyYXktXHUwMDNlcHB0cnNbMF07XG4rXHRyZXR1cm4gMDtcbit9XG4rXG4rc3RhdGljIGludCBwZXJjcHVfYXJyYXlfbWFwX2RpcmVjdF92YWx1ZV9tZXRhKGNvbnN0IHN0cnVjdCBicGZfbWFwICptYXAsIHU2NCBpbW0sIHUzMiAqb2ZmKVxuK3tcbitcdHN0cnVjdCBicGZfYXJyYXkgKmFycmF5ID0gY29udGFpbmVyX29mKG1hcCwgc3RydWN0IGJwZl9hcnJheSwgbWFwKTtcbitcdHU2NCBiYXNlID0gKHU2NCkoX19mb3JjZSB1bnNpZ25lZCBsb25nKSBhcnJheS1cdTAwM2VwcHRyc1swXTtcbitcbitcdGlmIChtYXAtXHUwMDNlbWF4X2VudHJpZXMgIT0gMSlcbitcdFx0cmV0dXJuIC1FT1BOT1RTVVBQO1xuK1x0aWYgKGltbSBcdTAwM2MgYmFzZSB8fCBpbW0gXHUwMDNlPSBiYXNlICsgYXJyYXktXHUwMDNlZWxlbV9zaXplKVxuK1x0XHRyZXR1cm4gLUVOT0VOVDtcbitcdGlmICghYnBmX2ppdF9zdXBwb3J0c19wZXJjcHVfaW5zbigpKVxuK1x0XHRyZXR1cm4gLUVPUE5PVFNVUFA7XG4rXG4rXHQqb2ZmID0gaW1tIC0gYmFzZTtcbitcdHJldHVybiAwO1xuK31cbitcbiAvKiBlbWl0IEJQRiBpbnN0cnVjdGlvbnMgZXF1aXZhbGVudCB0byBDIGNvZGUgb2YgcGVyY3B1X2FycmF5X21hcF9sb29rdXBfZWxlbSgpICovXG4gc3RhdGljIGludCBwZXJjcHVfYXJyYXlfbWFwX2dlbl9sb29rdXAoc3RydWN0IGJwZl9tYXAgKm1hcCwgc3RydWN0IGJwZl9pbnNuICppbnNuX2J1ZilcbiB7XG5AQCAtNTUxLDkgKzU4MiwxMCBAQCBzdGF0aWMgaW50IGFycmF5X21hcF9jaGVja19idGYoc3RydWN0IGJwZl9tYXAgKm1hcCxcbiBcdFx0XHQgICAgICAgY29uc3Qgc3RydWN0IGJ0Zl90eXBlICprZXlfdHlwZSxcbiBcdFx0XHQgICAgICAgY29uc3Qgc3RydWN0IGJ0Zl90eXBlICp2YWx1ZV90eXBlKVxuIHtcbi1cdC8qIE9uZSBleGNlcHRpb24gZm9yIGtleWxlc3MgQlRGOiAuYnNzLy5kYXRhLy5yb2RhdGEgbWFwICovXG4rXHQvKiBPbmUgZXhjZXB0aW9uIGZvciBrZXlsZXNzIEJURjogLmJzcy8uZGF0YS8ucm9kYXRhLy5wZXJjcHUgbWFwICovXG4gXHRpZiAoYnRmX3R5cGVfaXNfdm9pZChrZXlfdHlwZSkpIHtcbi1cdFx0aWYgKG1hcC1cdTAwM2VtYXBfdHlwZSAhPSBCUEZfTUFQX1RZUEVfQVJSQVkgfHxcbitcdFx0aWYgKChtYXAtXHUwMDNlbWFwX3R5cGUgIT0gQlBGX01BUF9UWVBFX0FSUkFZIFx1MDAyNlx1MDAyNlxuK1x0XHQgICAgIG1hcC1cdTAwM2VtYXBfdHlwZSAhPSBCUEZfTUFQX1RZUEVfUEVSQ1BVX0FSUkFZKSB8fFxuIFx0XHQgICAgbWFwLVx1MDAzZW1heF9lbnRyaWVzICE9IDEpXG4gXHRcdFx0cmV0dXJuIC1FSU5WQUw7XG4gXG5AQCAtODMyLDYgKzg2NCw4IEBAIGNvbnN0IHN0cnVjdCBicGZfbWFwX29wcyBwZXJjcHVfYXJyYXlfbWFwX29wcyA9IHtcbiBcdC5tYXBfZ2V0X25leHRfa2V5ID0gYnBmX2FycmF5X2dldF9uZXh0X2tleSxcbiBcdC5tYXBfbG9va3VwX2VsZW0gPSBwZXJjcHVfYXJyYXlfbWFwX2xvb2t1cF9lbGVtLFxuIFx0Lm1hcF9nZW5fbG9va3VwID0gcGVyY3B1X2FycmF5X21hcF9nZW5fbG9va3VwLFxuK1x0Lm1hcF9kaXJlY3RfdmFsdWVfYWRkciA9IHBlcmNwdV9hcnJheV9tYXBfZGlyZWN0X3ZhbHVlX2FkZHIsXG4rXHQubWFwX2RpcmVjdF92YWx1ZV9tZXRhID0gcGVyY3B1X2FycmF5X21hcF9kaXJlY3RfdmFsdWVfbWV0YSxcbiBcdC5tYXBfdXBkYXRlX2VsZW0gPSBhcnJheV9tYXBfdXBkYXRlX2VsZW0sXG4gXHQubWFwX2RlbGV0ZV9lbGVtID0gYXJyYXlfbWFwX2RlbGV0ZV9lbGVtLFxuIFx0Lm1hcF9sb29rdXBfcGVyY3B1X2VsZW0gPSBwZXJjcHVfYXJyYXlfbWFwX2xvb2t1cF9wZXJjcHVfZWxlbSxcbmRpZmYgLS1naXQgYS9rZXJuZWwvYnBmL2NvbnN0X2ZvbGQuYyBiL2tlcm5lbC9icGYvY29uc3RfZm9sZC5jXG5pbmRleCBiMmExOWFjYWRiOTFlYy4uNTc4NzI0NmJlZjMwMTAgMTAwNjQ0XG4tLS0gYS9rZXJuZWwvYnBmL2NvbnN0X2ZvbGQuY1xuKysrIGIva2VybmVsL2JwZi9jb25zdF9mb2xkLmNcbkBAIC0xODIsNyArMTgyLDYgQEAgc3RhdGljIHZvaWQgY29uc3RfcmVnX3hmZXIoc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudiwgc3RydWN0IGNvbnN0X2FyZ19pbmZvICpcbiBcdFx0dTY0IHZhbCA9IDA7XG4gXG4gXHRcdGlmICghYnBmX21hcF9pc19yZG9ubHkobWFwKSB8fCAhbWFwLVx1MDAzZW9wcy1cdTAwM2VtYXBfZGlyZWN0X3ZhbHVlX2FkZHIgfHxcbi1cdFx0ICAgIG1hcC1cdTAwM2VtYXBfdHlwZSA9PSBCUEZfTUFQX1RZUEVfSU5TTl9BUlJBWSB8fFxuIFx0XHQgICAgb2ZmIFx1MDAzYyAwIHx8IG9mZiArIHNpemUgXHUwMDNlIG1hcC1cdTAwM2V2YWx1ZV9zaXplIHx8XG4gXHRcdCAgICBicGZfbWFwX2RpcmVjdF9yZWFkKG1hcCwgb2ZmLCBzaXplLCBcdTAwMjZ2YWwsIGlzX2xkc3gpKSB7XG4gXHRcdFx0KmRzdCA9IHVua25vd247XG5kaWZmIC0tZ2l0IGEva2VybmVsL2JwZi9maXh1cHMuYyBiL2tlcm5lbC9icGYvZml4dXBzLmNcbmluZGV4IDNjZjJjYzZlM2FiNjZhLi40Zjg0ZDA4N2NhNjllMyAxMDA2NDRcbi0tLSBhL2tlcm5lbC9icGYvZml4dXBzLmNcbisrKyBiL2tlcm5lbC9icGYvZml4dXBzLmNcbkBAIC0xODE5LDYgKzE4MTksMzggQEAgaW50IGJwZl9kb19taXNjX2ZpeHVwcyhzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52KVxuIFx0XHRcdGdvdG8gbmV4dF9pbnNuO1xuIFx0XHR9XG4gXG4rXHRcdGlmIChlbnYtXHUwMDNlcHJvZy1cdTAwM2VqaXRfcmVxdWVzdGVkIFx1MDAyNlx1MDAyNlxuK1x0XHQgICAgYnBmX2ppdF9zdXBwb3J0c19wZXJjcHVfaW5zbigpIFx1MDAyNlx1MDAyNlxuK1x0XHQgICAgaW5zbi1cdTAwM2Vjb2RlID09IChCUEZfTEQgfCBCUEZfSU1NIHwgQlBGX0RXKSBcdTAwMjZcdTAwMjZcbitcdFx0ICAgIChpbnNuLVx1MDAzZXNyY19yZWcgPT0gQlBGX1BTRVVET19NQVBfVkFMVUUgfHxcbitcdFx0ICAgICBpbnNuLVx1MDAzZXNyY19yZWcgPT0gQlBGX1BTRVVET19NQVBfSURYX1ZBTFVFKSkge1xuK1x0XHRcdHN0cnVjdCBicGZfbWFwICptYXA7XG4rXG4rXHRcdFx0YXV4ID0gXHUwMDI2ZW52LVx1MDAzZWluc25fYXV4X2RhdGFbaSArIGRlbHRhXTtcbitcdFx0XHRtYXAgPSBlbnYtXHUwMDNldXNlZF9tYXBzW2F1eC1cdTAwM2VtYXBfaW5kZXhdO1xuK1x0XHRcdGlmIChtYXAtXHUwMDNlbWFwX3R5cGUgIT0gQlBGX01BUF9UWVBFX1BFUkNQVV9BUlJBWSlcbitcdFx0XHRcdGdvdG8gbmV4dF9pbnNuO1xuK1xuK1x0XHRcdC8qXG4rXHRcdFx0ICogUmV1c2UgdGhlIG9yaWdpbmFsIGxkX2ltbTY0IGluc24sIGFuZCBhZGQgb25lXG4rXHRcdFx0ICogbW92NjRfcGVyY3B1X3JlZyBpbnNuLlxuK1x0XHRcdCAqL1xuK1xuK1x0XHRcdGluc25fYnVmWzBdID0gaW5zblsxXTtcbitcdFx0XHRpbnNuX2J1ZlsxXSA9IEJQRl9NT1Y2NF9QRVJDUFVfUkVHKGluc24tXHUwMDNlZHN0X3JlZywgaW5zbi1cdTAwM2Vkc3RfcmVnKTtcbitcdFx0XHRjbnQgPSAyO1xuK1xuK1x0XHRcdGkrKztcbitcdFx0XHRuZXdfcHJvZyA9IGJwZl9wYXRjaF9pbnNuX2RhdGEoZW52LCBpICsgZGVsdGEsIGluc25fYnVmLCBjbnQpO1xuK1x0XHRcdGlmICghbmV3X3Byb2cpXG4rXHRcdFx0XHRyZXR1cm4gLUVOT01FTTtcbitcbitcdFx0XHRkZWx0YSAgICArPSBjbnQgLSAxO1xuK1x0XHRcdGVudi1cdTAwM2Vwcm9nID0gcHJvZyA9IG5ld19wcm9nO1xuK1x0XHRcdGluc24gICAgICA9IG5ld19wcm9nLVx1MDAzZWluc25zaSArIGkgKyBkZWx0YTtcbitcdFx0XHRnb3RvIG5leHRfaW5zbjtcbitcdFx0fVxuK1xuIFx0XHRpZiAoaW5zbi1cdTAwM2Vjb2RlICE9IChCUEZfSk1QIHwgQlBGX0NBTEwpKVxuIFx0XHRcdGdvdG8gbmV4dF9pbnNuO1xuIFx0XHRpZiAoaW5zbi1cdTAwM2VzcmNfcmVnID09IEJQRl9QU0VVRE9fQ0FMTClcbmRpZmYgLS1naXQgYS9rZXJuZWwvYnBmL3ZlcmlmaWVyLmMgYi9rZXJuZWwvYnBmL3ZlcmlmaWVyLmNcbmluZGV4IDI1YWVhNDI3MWNkMDg5Li5kYmY3NmZhOWQ0M2Q4ZSAxMDA2NDRcbi0tLSBhL2tlcm5lbC9icGYvdmVyaWZpZXIuY1xuKysrIGIva2VybmVsL2JwZi92ZXJpZmllci5jXG5AQCAtNjUyLDcgKzY1Miw2IEBAIHN0YXRpYyB2b2lkIF9fbWFya19keW5wdHJfcmVnKHN0cnVjdCBicGZfcmVnX3N0YXRlICpyZWcsXG4gXHRcdFx0ICAgICAgZW51bSBicGZfZHlucHRyX3R5cGUgdHlwZSxcbiBcdFx0XHQgICAgICBib29sIGZpcnN0X3Nsb3QsIGludCBpZCwgaW50IHBhcmVudF9pZCk7XG4gXG4tXG4gc3RhdGljIHZvaWQgbWFya19keW5wdHJfc3RhY2tfcmVncyhzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52LFxuIFx0XHRcdFx0ICAgc3RydWN0IGJwZl9yZWdfc3RhdGUgKnNyZWcxLFxuIFx0XHRcdFx0ICAgc3RydWN0IGJwZl9yZWdfc3RhdGUgKnNyZWcyLFxuQEAgLTE2ODksNyArMTY4OCw2IEBAIHN0YXRpYyBib29sIHNhbWVfY2FsbHNpdGVzKHN0cnVjdCBicGZfdmVyaWZpZXJfc3RhdGUgKmEsIHN0cnVjdCBicGZfdmVyaWZpZXJfc3RhXG4gXHRyZXR1cm4gdHJ1ZTtcbiB9XG4gXG4tXG4gdm9pZCBicGZfZnJlZV9iYWNrZWRnZXMoc3RydWN0IGJwZl9zY2NfdmlzaXQgKnZpc2l0KVxuIHtcbiBcdHN0cnVjdCBicGZfc2NjX2JhY2tlZGdlICpiYWNrZWRnZSwgKm5leHQ7XG5AQCAtMjMwOSw3ICsyMzA3LDYgQEAgc3RhdGljIHN0cnVjdCBicGZfdmVyaWZpZXJfc3RhdGUgKnB1c2hfYXN5bmNfY2Ioc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudixcbiBcdHJldHVybiBcdTAwMjZlbGVtLVx1MDAzZXN0O1xuIH1cbiBcbi1cbiBzdGF0aWMgaW50IGNtcF9zdWJwcm9ncyhjb25zdCB2b2lkICphLCBjb25zdCB2b2lkICpiKVxuIHtcbiBcdHJldHVybiAoKHN0cnVjdCBicGZfc3VicHJvZ19pbmZvICopYSktXHUwMDNlc3RhcnQgLVxuQEAgLTMzMzEsNyArMzMyOCw2IEBAIHN0YXRpYyBib29sIGlzX3NwaWxsYWJsZV9yZWd0eXBlKGVudW0gYnBmX3JlZ190eXBlIHR5cGUpXG4gXHR9XG4gfVxuIFxuLVxuIC8qIGNoZWNrIGlmIHJlZ2lzdGVyIGlzIGEgY29uc3RhbnQgc2NhbGFyIHZhbHVlICovXG4gc3RhdGljIGJvb2wgaXNfcmVnX2NvbnN0KHN0cnVjdCBicGZfcmVnX3N0YXRlICpyZWcsIGJvb2wgc3VicmVnMzIpXG4ge1xuQEAgLTQwMjUsNyArNDAyMSw2IEBAIHN0YXRpYyBpbnQgY2hlY2tfc3RhY2tfcmVhZChzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52LFxuIFx0cmV0dXJuIGVycjtcbiB9XG4gXG4tXG4gLyogY2hlY2tfc3RhY2tfd3JpdGUgZGlzcGF0Y2hlcyB0byBjaGVja19zdGFja193cml0ZV9maXhlZF9vZmYgb3JcbiAgKiBjaGVja19zdGFja193cml0ZV92YXJfb2ZmLlxuICAqXG5AQCAtNDgyMCw3ICs0ODE1LDYgQEAgc3RhdGljIGludCBjaGVja19zb2NrX2FjY2VzcyhzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52LCBpbnQgaW5zbl9pZHgsXG4gXHRcdHZhbGlkID0gZmFsc2U7XG4gXHR9XG4gXG4tXG4gXHRpZiAodmFsaWQpIHtcbiBcdFx0ZW52LVx1MDAzZWluc25fYXV4X2RhdGFbaW5zbl9pZHhdLmN0eF9maWVsZF9zaXplID1cbiBcdFx0XHRpbmZvLmN0eF9maWVsZF9zaXplO1xuQEAgLTU2MDAsNiArNTU5NCw4IEBAIGludCBicGZfbWFwX2RpcmVjdF9yZWFkKHN0cnVjdCBicGZfbWFwICptYXAsIGludCBvZmYsIGludCBzaXplLCB1NjQgKnZhbCxcbiBcdHU2NCBhZGRyO1xuIFx0aW50IGVycjtcbiBcbitcdGlmIChtYXAtXHUwMDNlbWFwX3R5cGUgPT0gQlBGX01BUF9UWVBFX0lOU05fQVJSQVkgfHwgbWFwLVx1MDAzZW1hcF90eXBlID09IEJQRl9NQVBfVFlQRV9QRVJDUFVfQVJSQVkpXG4rXHRcdHJldHVybiAtRUlOVkFMO1xuIFx0ZXJyID0gbWFwLVx1MDAzZW9wcy1cdTAwM2VtYXBfZGlyZWN0X3ZhbHVlX2FkZHIobWFwLCBcdTAwMjZhZGRyLCBvZmYpO1xuIFx0aWYgKGVycilcbiBcdFx0cmV0dXJuIGVycjtcbkBAIC02MTU1LDYgKzYxNTEsNyBAQCBzdGF0aWMgaW50IGNoZWNrX21lbV9hY2Nlc3Moc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudiwgaW50IGluc25faWR4LCBzdHJ1Y3QgYlxuIFx0XHRcdGlmICh0bnVtX2lzX2NvbnN0KHJlZy1cdTAwM2V2YXJfb2ZmKSBcdTAwMjZcdTAwMjZcbiBcdFx0XHQgICAgYnBmX21hcF9pc19yZG9ubHkobWFwKSBcdTAwMjZcdTAwMjZcbiBcdFx0XHQgICAgbWFwLVx1MDAzZW9wcy1cdTAwM2VtYXBfZGlyZWN0X3ZhbHVlX2FkZHIgXHUwMDI2XHUwMDI2XG4rXHRcdFx0ICAgIG1hcC1cdTAwM2VtYXBfdHlwZSAhPSBCUEZfTUFQX1RZUEVfUEVSQ1BVX0FSUkFZIFx1MDAyNlx1MDAyNlxuIFx0XHRcdCAgICBtYXAtXHUwMDNlbWFwX3R5cGUgIT0gQlBGX01BUF9UWVBFX0lOU05fQVJSQVkpIHtcbiBcdFx0XHRcdGludCBtYXBfb2ZmID0gb2ZmICsgcmVnLVx1MDAzZXZhcl9vZmYudmFsdWU7XG4gXHRcdFx0XHR1NjQgdmFsID0gMDtcbkBAIC02NjQ1LDcgKzY2NDIsNiBAQCBzdGF0aWMgaW50IGNoZWNrX3N0YWNrX3JhbmdlX2luaXRpYWxpemVkKFxuIFx0aWYgKGVycilcbiBcdFx0cmV0dXJuIGVycjtcbiBcbi1cbiBcdGlmICh0bnVtX2lzX2NvbnN0KHJlZy1cdTAwM2V2YXJfb2ZmKSkge1xuIFx0XHRtaW5fb2ZmID0gbWF4X29mZiA9IHJlZy1cdTAwM2V2YXJfb2ZmLnZhbHVlICsgb2ZmO1xuIFx0fSBlbHNlIHtcbkBAIC03MzU5LDcgKzczNTUsNiBAQCBzdGF0aWMgYm9vbCBpc19pdGVyX25ld19rZnVuYyhzdHJ1Y3QgYnBmX2tmdW5jX2NhbGxfYXJnX21ldGEgKm1ldGEpXG4gXHRyZXR1cm4gbWV0YS1cdTAwM2VrZnVuY19mbGFncyBcdTAwMjYgS0ZfSVRFUl9ORVc7XG4gfVxuIFxuLVxuIHN0YXRpYyBib29sIGlzX2l0ZXJfZGVzdHJveV9rZnVuYyhzdHJ1Y3QgYnBmX2tmdW5jX2NhbGxfYXJnX21ldGEgKm1ldGEpXG4ge1xuIFx0cmV0dXJuIG1ldGEtXHUwMDNla2Z1bmNfZmxhZ3MgXHUwMDI2IEtGX0lURVJfREVTVFJPWTtcbkBAIC04MTI1LDYgKzgxMjAsMTIgQEAgc3RhdGljIGludCBjaGVja19hcmdfY29uc3Rfc3RyKHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsXG4gXHRcdHJldHVybiAtRUFDQ0VTO1xuIFx0fVxuIFxuK1x0aWYgKG1hcC1cdTAwM2VtYXBfdHlwZSA9PSBCUEZfTUFQX1RZUEVfUEVSQ1BVX0FSUkFZKSB7XG4rXHRcdHZlcmJvc2UoZW52LCBcIiVzIHBvaW50cyB0byBwZXJjcHVfYXJyYXkgbWFwIHdoaWNoIGNhbm5vdCBiZSB1c2VkIGFzIGNvbnN0IHN0cmluZ1xcblwiLFxuK1x0XHRcdHJlZ19hcmdfbmFtZShlbnYsIGFyZ25vKSk7XG4rXHRcdHJldHVybiAtRUFDQ0VTO1xuK1x0fVxuK1xuIFx0aWYgKCFicGZfbWFwX2lzX3Jkb25seShtYXApKSB7XG4gXHRcdHZlcmJvc2UoZW52LCBcIiVzIGRvZXMgbm90IHBvaW50IHRvIGEgcmVhZG9ubHkgbWFwJ1xcblwiLCByZWdfYXJnX25hbWUoZW52LCBhcmdubykpO1xuIFx0XHRyZXR1cm4gLUVBQ0NFUztcbkBAIC0xMTUwMiw3ICsxMTUwMyw2IEBAIHN0YXRpYyBpbnQgcHJvY2Vzc19pcnFfZmxhZyhzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52LCBzdHJ1Y3QgYnBmX3JlZ19zdGF0ZSAqXG4gXHRyZXR1cm4gMDtcbiB9XG4gXG4tXG4gc3RhdGljIGludCByZWZfc2V0X25vbl9vd25pbmcoc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudiwgc3RydWN0IGJwZl9yZWdfc3RhdGUgKnJlZylcbiB7XG4gXHRzdHJ1Y3QgYnRmX3JlY29yZCAqcmVjID0gcmVnX2J0Zl9yZWNvcmQocmVnKTtcbkBAIC0xNjM5NCw3ICsxNjM5NCw2IEBAIHN0YXRpYyBpbnQgY2hlY2tfbGRfYWJzKHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsIHN0cnVjdCBicGZfaW5zbiAqaW5zbilcbiBcdHJldHVybiAwO1xuIH1cbiBcbi1cbiBzdGF0aWMgYm9vbCByZXR1cm5fcmV0dmFsX3JhbmdlKHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsIHN0cnVjdCBicGZfcmV0dmFsX3JhbmdlICpyYW5nZSlcbiB7XG4gXHRlbnVtIGJwZl9wcm9nX3R5cGUgcHJvZ190eXBlID0gcmVzb2x2ZV9wcm9nX3R5cGUoZW52LVx1MDAzZXByb2cpO1xuQEAgLTE4MjEzLDYgKzE4MjEyLDEyIEBAIHN0YXRpYyBpbnQgY2hlY2tfYW5kX3Jlc29sdmVfaW5zbnMoc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudilcbiBcdFx0XHRcdFx0cmV0dXJuIC1FSU5WQUw7XG4gXHRcdFx0XHR9XG4gXG4rXHRcdFx0XHRpZiAobWFwLVx1MDAzZW1hcF90eXBlID09IEJQRl9NQVBfVFlQRV9QRVJDUFVfQVJSQVkgXHUwMDI2XHUwMDI2XG4rXHRcdFx0XHQgICAgIWVudi1cdTAwM2Vwcm9nLVx1MDAzZWppdF9yZXF1ZXN0ZWQpIHtcbitcdFx0XHRcdFx0dmVyYm9zZShlbnYsIFwiSklUIGlzIHJlcXVpcmVkIHRvIHVzZSBnbG9iYWwgcGVyY3B1IGRhdGFcXG5cIik7XG4rXHRcdFx0XHRcdHJldHVybiAtRU9QTk9UU1VQUDtcbitcdFx0XHRcdH1cbitcbiBcdFx0XHRcdGVyciA9IG1hcC1cdTAwM2VvcHMtXHUwMDNlbWFwX2RpcmVjdF92YWx1ZV9hZGRyKG1hcCwgXHUwMDI2YWRkciwgb2ZmKTtcbiBcdFx0XHRcdGlmIChlcnIpIHtcbiBcdFx0XHRcdFx0dmVyYm9zZShlbnYsIFwiaW52YWxpZCBhY2Nlc3MgdG8gbWFwIHZhbHVlIHBvaW50ZXIsIHZhbHVlX3NpemU9JXUgb2ZmPSV1XFxuXCIsXG5AQCAtMTgyODgsOCArMTgyOTMsNiBAQCBzdGF0aWMgdm9pZCByZWxlYXNlX2luc25fYXJyYXlzKHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYpXG4gXHRcdGJwZl9pbnNuX2FycmF5X3JlbGVhc2UoZW52LVx1MDAzZWluc25fYXJyYXlfbWFwc1tpXSk7XG4gfVxuIFxuLVxuLVxuIC8qIFRoZSB2ZXJpZmllciBkb2VzIG1vcmUgZGF0YSBmbG93IGFuYWx5c2lzIHRoYW4gbGx2bSBhbmQgd2lsbCBub3RcbiAgKiBleHBsb3JlIGJyYW5jaGVzIHRoYXQgYXJlIGRlYWQgYXQgcnVuIHRpbWUuIE1hbGljaW91cyBwcm9ncmFtcyBjYW5cbiAgKiBoYXZlIGRlYWQgY29kZSB0b28uIFRoZXJlZm9yZSByZXBsYWNlIGFsbCBkZWFkIGF0LXJ1bi10aW1lIGNvZGVcbkBAIC0xODMxNyw4ICsxODMyMCw2IEBAIHN0YXRpYyB2b2lkIHNhbml0aXplX2RlYWRfY29kZShzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52KVxuIFx0fVxuIH1cbiBcbi1cbi1cbiBzdGF0aWMgdm9pZCBmcmVlX3N0YXRlcyhzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52KVxuIHtcbiBcdHN0cnVjdCBicGZfdmVyaWZpZXJfc3RhdGVfbGlzdCAqc2w7XG5AQCAtMTg2MDAsNyArMTg2MDEsNiBAQCBzdGF0aWMgaW50IGRvX2NoZWNrX21haW4oc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudilcbiBcdHJldHVybiByZXQ7XG4gfVxuIFxuLVxuIHN0YXRpYyB2b2lkIHByaW50X3ZlcmlmaWNhdGlvbl9zdGF0cyhzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52KVxuIHtcbiBcdC8qIFNraXAgb3ZlciBoaWRkZW4gc3VicHJvZ3Mgd2hpY2ggYXJlIG5vdCB2ZXJpZmllZC4gKi9cbmRpZmYgLS1naXQgYS90b29scy9icGYvYnBmdG9vbC9nZW4uYyBiL3Rvb2xzL2JwZi9icGZ0b29sL2dlbi5jXG5pbmRleCA2YWU3MjYyZWJlMGMxZC4uMmU2MDI5NjM1OGRiNWUgMTAwNjQ0XG4tLS0gYS90b29scy9icGYvYnBmdG9vbC9nZW4uY1xuKysrIGIvdG9vbHMvYnBmL2JwZnRvb2wvZ2VuLmNcbkBAIC05Miw3ICs5Miw3IEBAIHN0YXRpYyB2b2lkIGdldF9oZWFkZXJfZ3VhcmQoY2hhciAqZ3VhcmQsIGNvbnN0IGNoYXIgKm9ial9uYW1lLCBjb25zdCBjaGFyICpzdWZmXG4gXG4gc3RhdGljIGJvb2wgZ2V0X21hcF9pZGVudChjb25zdCBzdHJ1Y3QgYnBmX21hcCAqbWFwLCBjaGFyICpidWYsIHNpemVfdCBidWZfc3opXG4ge1xuLVx0c3RhdGljIGNvbnN0IGNoYXIgKnNmeHNbXSA9IHsgXCIuZGF0YVwiLCBcIi5yb2RhdGFcIiwgXCIuYnNzXCIsIFwiLmtjb25maWdcIiB9O1xuK1x0c3RhdGljIGNvbnN0IGNoYXIgKnNmeHNbXSA9IHsgXCIuZGF0YVwiLCBcIi5yb2RhdGFcIiwgXCIuYnNzXCIsIFwiLnBlcmNwdVwiLCBcIi5rY29uZmlnXCIgfTtcbiBcdGNvbnN0IGNoYXIgKm5hbWUgPSBicGZfbWFwX19uYW1lKG1hcCk7XG4gXHRpbnQgaSwgbjtcbiBcbkBAIC0xMTcsNyArMTE3LDcgQEAgc3RhdGljIGJvb2wgZ2V0X21hcF9pZGVudChjb25zdCBzdHJ1Y3QgYnBmX21hcCAqbWFwLCBjaGFyICpidWYsIHNpemVfdCBidWZfc3opXG4gXG4gc3RhdGljIGJvb2wgZ2V0X2RhdGFzZWNfaWRlbnQoY29uc3QgY2hhciAqc2VjX25hbWUsIGNoYXIgKmJ1Ziwgc2l6ZV90IGJ1Zl9zeilcbiB7XG4tXHRzdGF0aWMgY29uc3QgY2hhciAqcGZ4c1tdID0geyBcIi5kYXRhXCIsIFwiLnJvZGF0YVwiLCBcIi5ic3NcIiwgXCIua2NvbmZpZ1wiIH07XG4rXHRzdGF0aWMgY29uc3QgY2hhciAqcGZ4c1tdID0geyBcIi5kYXRhXCIsIFwiLnJvZGF0YVwiLCBcIi5ic3NcIiwgXCIucGVyY3B1XCIsIFwiLmtjb25maWdcIiB9O1xuIFx0aW50IGksIG47XG4gXG4gXHQvKiByZWNvZ25pemUgaGFyZCBjb2RlZCBMTFZNIHNlY3Rpb24gbmFtZSAqL1xuQEAgLTI1NCw2ICsyNTQsMjAgQEAgc3RhdGljIGNvbnN0IHN0cnVjdCBidGZfdHlwZSAqZmluZF90eXBlX2Zvcl9tYXAoc3RydWN0IGJ0ZiAqYnRmLCBjb25zdCBjaGFyICptYXBcbiBcdHJldHVybiBOVUxMO1xuIH1cbiBcbitzdGF0aWMgYm9vbCBicGZfbWFwX2lzX3NrZWxfZGF0YShjb25zdCBzdHJ1Y3QgYnBmX21hcCAqbWFwKVxuK3tcbitcdGlmICghYnBmX21hcF9faXNfaW50ZXJuYWwobWFwKSlcbitcdFx0cmV0dXJuIGZhbHNlO1xuK1xuK1x0aWYgKGJwZl9tYXBfX21hcF9mbGFncyhtYXApIFx1MDAyNiBCUEZfRl9NTUFQQUJMRSlcbitcdFx0cmV0dXJuIHRydWU7XG4rXG4rXHRpZiAoYnBmX21hcF9fdHlwZShtYXApID09IEJQRl9NQVBfVFlQRV9QRVJDUFVfQVJSQVkpXG4rXHRcdHJldHVybiB0cnVlO1xuK1xuK1x0cmV0dXJuIGZhbHNlO1xuK31cbitcbiBzdGF0aWMgYm9vbCBpc19tbWFwYWJsZV9tYXAoY29uc3Qgc3RydWN0IGJwZl9tYXAgKm1hcCwgY2hhciAqYnVmLCBzaXplX3Qgc3opXG4ge1xuIFx0c2l6ZV90IHRtcF9zejtcbkBAIC0yNjMsNyArMjc3LDcgQEAgc3RhdGljIGJvb2wgaXNfbW1hcGFibGVfbWFwKGNvbnN0IHN0cnVjdCBicGZfbWFwICptYXAsIGNoYXIgKmJ1Ziwgc2l6ZV90IHN6KVxuIFx0XHRyZXR1cm4gdHJ1ZTtcbiBcdH1cbiBcbi1cdGlmICghYnBmX21hcF9faXNfaW50ZXJuYWwobWFwKSB8fCAhKGJwZl9tYXBfX21hcF9mbGFncyhtYXApIFx1MDAyNiBCUEZfRl9NTUFQQUJMRSkpXG4rXHRpZiAoIWJwZl9tYXBfaXNfc2tlbF9kYXRhKG1hcCkpXG4gXHRcdHJldHVybiBmYWxzZTtcbiBcbiBcdGlmICghZ2V0X21hcF9pZGVudChtYXAsIGJ1Ziwgc3opKVxuQEAgLTMyMSw2ICszMzUsMTEgQEAgc3RhdGljIGJvb2wgYnRmX2lzX3B0cl90b19mdW5jX3Byb3RvKGNvbnN0IHN0cnVjdCBidGYgKmJ0ZixcbiBcdHJldHVybiBidGZfaXNfcHRyKHYpIFx1MDAyNlx1MDAyNiBidGZfaXNfZnVuY19wcm90byhidGZfX3R5cGVfYnlfaWQoYnRmLCB2LVx1MDAzZXR5cGUpKTtcbiB9XG4gXG4rc3RhdGljIGJvb2wgYnBmX21hcF9pc19wZXJjcHVfZGF0YShjb25zdCBzdHJ1Y3QgYnBmX21hcCAqbWFwKVxuK3tcbitcdHJldHVybiBicGZfbWFwX19pc19pbnRlcm5hbChtYXApIFx1MDAyNlx1MDAyNiBicGZfbWFwX190eXBlKG1hcCkgPT0gQlBGX01BUF9UWVBFX1BFUkNQVV9BUlJBWTtcbit9XG4rXG4gc3RhdGljIGludCBjb2RlZ2VuX3N1YnNrZWxfZGF0YXNlY3Moc3RydWN0IGJwZl9vYmplY3QgKm9iaiwgY29uc3QgY2hhciAqb2JqX25hbWUpXG4ge1xuIFx0c3RydWN0IGJ0ZiAqYnRmID0gYnBmX29iamVjdF9fYnRmKG9iaik7XG5AQCAtMzQzLDYgKzM2Miw5IEBAIHN0YXRpYyBpbnQgY29kZWdlbl9zdWJza2VsX2RhdGFzZWNzKHN0cnVjdCBicGZfb2JqZWN0ICpvYmosIGNvbnN0IGNoYXIgKm9ial9uYW1lXG4gXHRcdGlmICghaXNfbW1hcGFibGVfbWFwKG1hcCwgbWFwX2lkZW50LCBzaXplb2YobWFwX2lkZW50KSkpXG4gXHRcdFx0Y29udGludWU7XG4gXG4rXHRcdGlmIChicGZfbWFwX2lzX3BlcmNwdV9kYXRhKG1hcCkpXG4rXHRcdFx0Y29udGludWU7XG4rXG4gXHRcdHNlYyA9IGZpbmRfdHlwZV9mb3JfbWFwKGJ0ZiwgbWFwX2lkZW50KTtcbiBcdFx0aWYgKCFzZWMpXG4gXHRcdFx0Y29udGludWU7XG5AQCAtNjY4LDggKzY5MCw3IEBAIHN0YXRpYyB2b2lkIGNvZGVnZW5fZGVzdHJveShzdHJ1Y3QgYnBmX29iamVjdCAqb2JqLCBjb25zdCBjaGFyICpvYmpfbmFtZSlcbiBcdGJwZl9vYmplY3RfX2Zvcl9lYWNoX21hcChtYXAsIG9iaikge1xuIFx0XHRpZiAoIWdldF9tYXBfaWRlbnQobWFwLCBpZGVudCwgc2l6ZW9mKGlkZW50KSkpXG4gXHRcdFx0Y29udGludWU7XG4tXHRcdGlmIChicGZfbWFwX19pc19pbnRlcm5hbChtYXApIFx1MDAyNlx1MDAyNlxuLVx0XHQgICAgKGJwZl9tYXBfX21hcF9mbGFncyhtYXApIFx1MDAyNiBCUEZfRl9NTUFQQUJMRSkpXG4rXHRcdGlmIChicGZfbWFwX2lzX3NrZWxfZGF0YShtYXApKVxuIFx0XHRcdHByaW50ZihcIlxcdHNrZWxfZnJlZV9tYXBfZGF0YShza2VsLVx1MDAzZSUxJHMsIHNrZWwtXHUwMDNlbWFwcy4lMSRzLmluaXRpYWxfdmFsdWUsICUyJHp1KTtcXG5cIixcbiBcdFx0XHQgICAgICAgaWRlbnQsIGJwZl9tYXBfbW1hcF9zeihtYXApKTtcbiBcdFx0Y29kZWdlbihcIlxcXG5AQCAtODUwLDYgKzg3MSwyMCBAQCBzdGF0aWMgaW50IGdlbl90cmFjZShzdHJ1Y3QgYnBmX29iamVjdCAqb2JqLCBjb25zdCBjaGFyICpvYmpfbmFtZSwgY29uc3QgY2hhciAqaFxuIFx0XHRpZiAoIWlzX21tYXBhYmxlX21hcChtYXAsIGlkZW50LCBzaXplb2YoaWRlbnQpKSlcbiBcdFx0XHRjb250aW51ZTtcbiBcbitcdFx0aWYgKGJwZl9tYXBfaXNfcGVyY3B1X2RhdGEobWFwKSkge1xuK1x0XHRcdGNvZGVnZW4oXCJcXFxuK1x0XHRcXG5cXFxuK1x0XHRcdGVyciA9IHNrZWxfcHJvdGVjdF9tYXBfZGF0YShza2VsLVx1MDAzZSUxJHMsIFx1MDAyNnNrZWwtXHUwMDNlbWFwcy4lMSRzLmluaXRpYWxfdmFsdWUsICUyJHpkKTtcXG5cXFxuK1x0XHRcdGlmIChlcnIpXHRcdFx0XHRcdCAgICBcXG5cXFxuK1x0XHRcdFx0cmV0dXJuIGVycjtcdFx0XHRcdCAgICBcXG5cXFxuK1x0XHQjaWZkZWYgX19LRVJORUxfX1x0XHRcdFx0XHQgICAgXFxuXFxcbitcdFx0XHRza2VsLVx1MDAzZSUxJHMgPSBOVUxMO1x0XHRcdFx0ICAgIFxcblxcXG4rXHRcdCNlbmRpZlx0XHRcdFx0XHRcdFx0ICAgIFxcblxcXG4rXHRcdFx0XCIsXG4rXHRcdFx0aWRlbnQsIGJwZl9tYXBfbW1hcF9zeihtYXApKTtcbitcdFx0XHRjb250aW51ZTtcbitcdFx0fVxuK1xuIFx0XHRpZiAoYnBmX21hcF9fbWFwX2ZsYWdzKG1hcCkgXHUwMDI2IEJQRl9GX1JET05MWV9QUk9HKVxuIFx0XHRcdG1tYXBfZmxhZ3MgPSBcIlBST1RfUkVBRFwiO1xuIFx0XHRlbHNlXG5AQCAtMTc0MCw2ICsxNzc1LDggQEAgc3RhdGljIGludCBkb19zdWJza2VsZXRvbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpXG4gXG4gXHRcdGlmICghaXNfbW1hcGFibGVfbWFwKG1hcCwgaWRlbnQsIHNpemVvZihpZGVudCkpKVxuIFx0XHRcdGNvbnRpbnVlO1xuK1x0XHRpZiAoYnBmX21hcF9pc19wZXJjcHVfZGF0YShtYXApKVxuK1x0XHRcdGNvbnRpbnVlO1xuIFxuIFx0XHRtYXBfdHlwZV9pZCA9IGJwZl9tYXBfX2J0Zl92YWx1ZV90eXBlX2lkKG1hcCk7XG4gXHRcdGlmIChtYXBfdHlwZV9pZCBcdTAwM2M9IDApIHtcbkBAIC0xODYzLDYgKzE5MDAsOCBAQCBzdGF0aWMgaW50IGRvX3N1YnNrZWxldG9uKGludCBhcmdjLCBjaGFyICoqYXJndilcbiBcdGJwZl9vYmplY3RfX2Zvcl9lYWNoX21hcChtYXAsIG9iaikge1xuIFx0XHRpZiAoIWlzX21tYXBhYmxlX21hcChtYXAsIGlkZW50LCBzaXplb2YoaWRlbnQpKSlcbiBcdFx0XHRjb250aW51ZTtcbitcdFx0aWYgKGJwZl9tYXBfaXNfcGVyY3B1X2RhdGEobWFwKSlcbitcdFx0XHRjb250aW51ZTtcbiBcbiBcdFx0bWFwX3R5cGVfaWQgPSBicGZfbWFwX19idGZfdmFsdWVfdHlwZV9pZChtYXApO1xuIFx0XHRpZiAobWFwX3R5cGVfaWQgXHUwMDNjPSAwKVxuZGlmZiAtLWdpdCBhL3Rvb2xzL2xpYi9icGYvYnBmX2dlbl9pbnRlcm5hbC5oIGIvdG9vbHMvbGliL2JwZi9icGZfZ2VuX2ludGVybmFsLmhcbmluZGV4IDQ5YWY0MjYwYjhlNmI3Li41ZWE4MzgzODA1ZDNiYyAxMDA2NDRcbi0tLSBhL3Rvb2xzL2xpYi9icGYvYnBmX2dlbl9pbnRlcm5hbC5oXG4rKysgYi90b29scy9saWIvYnBmL2JwZl9nZW5faW50ZXJuYWwuaFxuQEAgLTY2LDcgKzY2LDggQEAgdm9pZCBicGZfZ2VuX19wcm9nX2xvYWQoc3RydWN0IGJwZl9nZW4gKmdlbixcbiBcdFx0XHRlbnVtIGJwZl9wcm9nX3R5cGUgcHJvZ190eXBlLCBjb25zdCBjaGFyICpwcm9nX25hbWUsXG4gXHRcdFx0Y29uc3QgY2hhciAqbGljZW5zZSwgc3RydWN0IGJwZl9pbnNuICppbnNucywgc2l6ZV90IGluc25fY250LFxuIFx0XHRcdHN0cnVjdCBicGZfcHJvZ19sb2FkX29wdHMgKmxvYWRfYXR0ciwgaW50IHByb2dfaWR4KTtcbi12b2lkIGJwZl9nZW5fX21hcF91cGRhdGVfZWxlbShzdHJ1Y3QgYnBmX2dlbiAqZ2VuLCBpbnQgbWFwX2lkeCwgdm9pZCAqdmFsdWUsIF9fdTMyIHZhbHVlX3NpemUpO1xuK3ZvaWQgYnBmX2dlbl9fbWFwX3VwZGF0ZV9lbGVtKHN0cnVjdCBicGZfZ2VuICpnZW4sIGludCBtYXBfaWR4LCB2b2lkICp2YWx1ZSwgX191MzIgdmFsdWVfc2l6ZSxcbitcdFx0XHQgICAgICBfX3U2NCBmbGFncyk7XG4gdm9pZCBicGZfZ2VuX19tYXBfZnJlZXplKHN0cnVjdCBicGZfZ2VuICpnZW4sIGludCBtYXBfaWR4KTtcbiB2b2lkIGJwZl9nZW5fX3JlY29yZF9hdHRhY2hfdGFyZ2V0KHN0cnVjdCBicGZfZ2VuICpnZW4sIGNvbnN0IGNoYXIgKm5hbWUsIGVudW0gYnBmX2F0dGFjaF90eXBlIHR5cGUpO1xuIHZvaWQgYnBmX2dlbl9fcmVjb3JkX2V4dGVybihzdHJ1Y3QgYnBmX2dlbiAqZ2VuLCBjb25zdCBjaGFyICpuYW1lLCBib29sIGlzX3dlYWssXG5kaWZmIC0tZ2l0IGEvdG9vbHMvbGliL2JwZi9mZWF0dXJlcy5jIGIvdG9vbHMvbGliL2JwZi9mZWF0dXJlcy5jXG5pbmRleCBiN2UzODhmOTlkMGJiZC4uZWY5NTgxYzExMzAzNTUgMTAwNjQ0XG4tLS0gYS90b29scy9saWIvYnBmL2ZlYXR1cmVzLmNcbisrKyBiL3Rvb2xzL2xpYi9icGYvZmVhdHVyZXMuY1xuQEAgLTYyMCw2ICs2MjAsMzggQEAgc3RhdGljIGludCBwcm9iZV9icGZfc3lzY2FsbF9jb21tb25fYXR0cnMoaW50IHRva2VuX2ZkKVxuIFx0cmV0dXJuIHByb2JlX3N5c19icGZfZXh0KCk7XG4gfVxuIFxuK3N0YXRpYyBpbnQgcHJvYmVfa2Vybl9wZXJjcHVfZGF0YShpbnQgdG9rZW5fZmQpXG4re1xuK1x0c3RydWN0IGJwZl9pbnNuIGluc25zW10gPSB7XG4rXHRcdEJQRl9MRF9NQVBfVkFMVUUoQlBGX1JFR18xLCAwLCAwKSxcbitcdFx0QlBGX0xEWF9NRU0oQlBGX0RXLCBCUEZfUkVHXzAsIEJQRl9SRUdfMSwgMCksXG4rXHRcdEJQRl9FWElUX0lOU04oKSxcbitcdH07XG4rXHRMSUJCUEZfT1BUUyhicGZfbWFwX2NyZWF0ZV9vcHRzLCBtYXBfb3B0cyxcbitcdFx0LnRva2VuX2ZkID0gdG9rZW5fZmQsXG4rXHRcdC5tYXBfZmxhZ3MgPSB0b2tlbl9mZCA/IEJQRl9GX1RPS0VOX0ZEIDogMCxcbitcdCk7XG4rXHRMSUJCUEZfT1BUUyhicGZfcHJvZ19sb2FkX29wdHMsIHByb2dfb3B0cyxcbitcdFx0LnRva2VuX2ZkID0gdG9rZW5fZmQsXG4rXHRcdC5wcm9nX2ZsYWdzID0gdG9rZW5fZmQgPyBCUEZfRl9UT0tFTl9GRCA6IDAsXG4rXHQpO1xuK1x0aW50IHJldCwgbWFwLCBpbnNuX2NudCA9IEFSUkFZX1NJWkUoaW5zbnMpO1xuK1xuK1x0bWFwID0gYnBmX21hcF9jcmVhdGUoQlBGX01BUF9UWVBFX1BFUkNQVV9BUlJBWSwgXCJsaWJicGZfcGVyY3B1XCIsIHNpemVvZihpbnQpLCA4LCAxLFxuK1x0XHRcdCAgICAgXHUwMDI2bWFwX29wdHMpO1xuK1x0aWYgKG1hcCBcdTAwM2MgMCkge1xuK1x0XHRwcl93YXJuKFwiRXJyb3IgaW4gJXMoKTogJXMuIENvdWxkbid0IGNyZWF0ZSBzaW1wbGUgcGVyY3B1X2FycmF5IG1hcC5cXG5cIixcbitcdFx0XHRfX2Z1bmNfXywgZXJyc3RyKG1hcCkpO1xuK1x0XHRyZXR1cm4gbWFwO1xuK1x0fVxuK1xuK1x0aW5zbnNbMF0uaW1tID0gbWFwO1xuK1xuK1x0cmV0ID0gYnBmX3Byb2dfbG9hZChCUEZfUFJPR19UWVBFX1NPQ0tFVF9GSUxURVIsIE5VTEwsIFwiR1BMXCIsIGluc25zLCBpbnNuX2NudCwgXHUwMDI2cHJvZ19vcHRzKTtcbitcdGNsb3NlKG1hcCk7XG4rXHRyZXR1cm4gcHJvYmVfZmQocmV0KTtcbit9XG4rXG4gdHlwZWRlZiBpbnQgKCpmZWF0dXJlX3Byb2JlX2ZuKShpbnQgLyogdG9rZW5fZmQgKi8pO1xuIFxuIHN0YXRpYyBzdHJ1Y3Qga2Vybl9mZWF0dXJlX2NhY2hlIGZlYXR1cmVfY2FjaGU7XG5AQCAtNzA3LDYgKzczOSw5IEBAIHN0YXRpYyBzdHJ1Y3Qga2Vybl9mZWF0dXJlX2Rlc2Mge1xuIFx0W0ZFQVRfQlBGX1NZU0NBTExfQ09NTU9OX0FUVFJTXSA9IHtcbiBcdFx0XCJCUEYgc3lzY2FsbCBjb21tb24gYXR0cmlidXRlcyBzdXBwb3J0XCIsIHByb2JlX2JwZl9zeXNjYWxsX2NvbW1vbl9hdHRycyxcbiBcdH0sXG4rXHRbRkVBVF9QRVJDUFVfREFUQV0gPSB7XG4rXHRcdFwia2VybmVsIHN1cHBvcnRzIHBlcmNwdSBkYXRhXCIsIHByb2JlX2tlcm5fcGVyY3B1X2RhdGEsXG4rXHR9LFxuIH07XG4gXG4gYm9vbCBmZWF0X3N1cHBvcnRlZChzdHJ1Y3Qga2Vybl9mZWF0dXJlX2NhY2hlICpjYWNoZSwgZW51bSBrZXJuX2ZlYXR1cmVfaWQgZmVhdF9pZClcbmRpZmYgLS1naXQgYS90b29scy9saWIvYnBmL2dlbl9sb2FkZXIuYyBiL3Rvb2xzL2xpYi9icGYvZ2VuX2xvYWRlci5jXG5pbmRleCBjN2YyZDJhYzdiYjM1Zi4uNjBhMTIwNGU5YTI2M2MgMTAwNjQ0XG4tLS0gYS90b29scy9saWIvYnBmL2dlbl9sb2FkZXIuY1xuKysrIGIvdG9vbHMvbGliL2JwZi9nZW5fbG9hZGVyLmNcbkBAIC0xMTkwLDcgKzExOTAsNyBAQCB2b2lkIGJwZl9nZW5fX3Byb2dfbG9hZChzdHJ1Y3QgYnBmX2dlbiAqZ2VuLFxuIH1cbiBcbiB2b2lkIGJwZl9nZW5fX21hcF91cGRhdGVfZWxlbShzdHJ1Y3QgYnBmX2dlbiAqZ2VuLCBpbnQgbWFwX2lkeCwgdm9pZCAqcHZhbHVlLFxuLVx0XHRcdCAgICAgIF9fdTMyIHZhbHVlX3NpemUpXG4rXHRcdFx0ICAgICAgX191MzIgdmFsdWVfc2l6ZSwgX191NjQgZmxhZ3MpXG4ge1xuIFx0aW50IGF0dHJfc2l6ZSA9IG9mZnNldG9mZW5kKHVuaW9uIGJwZl9hdHRyLCBmbGFncyk7XG4gXHRpbnQgbWFwX3VwZGF0ZV9hdHRyLCB2YWx1ZSwga2V5O1xuQEAgLTExOTgsNiArMTE5OCw3IEBAIHZvaWQgYnBmX2dlbl9fbWFwX3VwZGF0ZV9lbGVtKHN0cnVjdCBicGZfZ2VuICpnZW4sIGludCBtYXBfaWR4LCB2b2lkICpwdmFsdWUsXG4gXHRpbnQgemVybyA9IDA7XG4gXG4gXHRtZW1zZXQoXHUwMDI2YXR0ciwgMCwgYXR0cl9zaXplKTtcbitcdGF0dHIuZmxhZ3MgPSB0Z3RfZW5kaWFuKGZsYWdzKTtcbiBcbiBcdHZhbHVlID0gYWRkX2RhdGEoZ2VuLCBwdmFsdWUsIHZhbHVlX3NpemUpO1xuIFx0a2V5ID0gYWRkX2RhdGEoZ2VuLCBcdTAwMjZ6ZXJvLCBzaXplb2YoemVybykpO1xuZGlmZiAtLWdpdCBhL3Rvb2xzL2xpYi9icGYvbGliYnBmLmMgYi90b29scy9saWIvYnBmL2xpYmJwZi5jXG5pbmRleCA3MTYyMTQ2MjgwYTgwZS4uNmUxOGExNjI4ZTEzOTYgMTAwNjQ0XG4tLS0gYS90b29scy9saWIvYnBmL2xpYmJwZi5jXG4rKysgYi90b29scy9saWIvYnBmL2xpYmJwZi5jXG5AQCAtNTQxLDYgKzU0MSw3IEBAIHN0cnVjdCBicGZfc3RydWN0X29wcyB7XG4gfTtcbiBcbiAjZGVmaW5lIERBVEFfU0VDIFwiLmRhdGFcIlxuKyNkZWZpbmUgUEVSQ1BVX1NFQyBcIi5wZXJjcHVcIlxuICNkZWZpbmUgQlNTX1NFQyBcIi5ic3NcIlxuICNkZWZpbmUgUk9EQVRBX1NFQyBcIi5yb2RhdGFcIlxuICNkZWZpbmUgS0NPTkZJR19TRUMgXCIua2NvbmZpZ1wiXG5AQCAtNTU1LDYgKzU1Niw3IEBAIGVudW0gbGliYnBmX21hcF90eXBlIHtcbiBcdExJQkJQRl9NQVBfQlNTLFxuIFx0TElCQlBGX01BUF9ST0RBVEEsXG4gXHRMSUJCUEZfTUFQX0tDT05GSUcsXG4rXHRMSUJCUEZfTUFQX1BFUkNQVSxcbiB9O1xuIFxuIHN0cnVjdCBicGZfbWFwX2RlZiB7XG5AQCAtNjY2LDYgKzY2OCw3IEBAIGVudW0gc2VjX3R5cGUge1xuIFx0U0VDX0RBVEEsXG4gXHRTRUNfUk9EQVRBLFxuIFx0U0VDX1NUX09QUyxcbitcdFNFQ19QRVJDUFUsXG4gfTtcbiBcbiBzdHJ1Y3QgZWxmX3NlY19kZXNjIHtcbkBAIC0xODM5LDYgKzE4NDIsOCBAQCBzdGF0aWMgc2l6ZV90IGJwZl9tYXBfbW1hcF9zeihjb25zdCBzdHJ1Y3QgYnBmX21hcCAqbWFwKVxuIFx0c3dpdGNoIChtYXAtXHUwMDNlZGVmLnR5cGUpIHtcbiBcdGNhc2UgQlBGX01BUF9UWVBFX0FSUkFZOlxuIFx0XHRyZXR1cm4gYXJyYXlfbWFwX21tYXBfc3oobWFwLVx1MDAzZWRlZi52YWx1ZV9zaXplLCBtYXAtXHUwMDNlZGVmLm1heF9lbnRyaWVzKTtcbitcdGNhc2UgQlBGX01BUF9UWVBFX1BFUkNQVV9BUlJBWTpcbitcdFx0cmV0dXJuIG1hcC1cdTAwM2VkZWYudmFsdWVfc2l6ZTtcbiBcdGNhc2UgQlBGX01BUF9UWVBFX0FSRU5BOlxuIFx0XHRyZXR1cm4gcGFnZV9zeiAqIG1hcC1cdTAwM2VkZWYubWF4X2VudHJpZXM7XG4gXHRkZWZhdWx0OlxuQEAgLTE5MzgsNyArMTk0Myw3IEBAIHN0YXRpYyBib29sIG1hcF9pc19tbWFwYWJsZShzdHJ1Y3QgYnBmX29iamVjdCAqb2JqLCBzdHJ1Y3QgYnBmX21hcCAqbWFwKVxuIFx0c3RydWN0IGJ0Zl92YXJfc2VjaW5mbyAqdnNpO1xuIFx0aW50IGksIG47XG4gXG4tXHRpZiAoIW1hcC1cdTAwM2VidGZfdmFsdWVfdHlwZV9pZClcbitcdGlmICghbWFwLVx1MDAzZWJ0Zl92YWx1ZV90eXBlX2lkIHx8IG1hcC1cdTAwM2VsaWJicGZfdHlwZSA9PSBMSUJCUEZfTUFQX1BFUkNQVSlcbiBcdFx0cmV0dXJuIGZhbHNlO1xuIFxuIFx0dCA9IGJ0Zl9fdHlwZV9ieV9pZChvYmotXHUwMDNlYnRmLCBtYXAtXHUwMDNlYnRmX3ZhbHVlX3R5cGVfaWQpO1xuQEAgLTE5NjIsNiArMTk2Nyw3IEBAIHN0YXRpYyBpbnRcbiBicGZfb2JqZWN0X19pbml0X2ludGVybmFsX21hcChzdHJ1Y3QgYnBmX29iamVjdCAqb2JqLCBlbnVtIGxpYmJwZl9tYXBfdHlwZSB0eXBlLFxuIFx0XHRcdCAgICAgIGNvbnN0IGNoYXIgKnJlYWxfbmFtZSwgaW50IHNlY19pZHgsIHZvaWQgKmRhdGEsIHNpemVfdCBkYXRhX3N6KVxuIHtcbitcdGJvb2wgaXNfcGVyY3B1ID0gdHlwZSA9PSBMSUJCUEZfTUFQX1BFUkNQVTtcbiBcdHN0cnVjdCBicGZfbWFwX2RlZiAqZGVmO1xuIFx0c3RydWN0IGJwZl9tYXAgKm1hcDtcbiBcdHNpemVfdCBtbWFwX3N6O1xuQEAgLTE5NzUsNyArMTk4MSw3IEBAIGJwZl9vYmplY3RfX2luaXRfaW50ZXJuYWxfbWFwKHN0cnVjdCBicGZfb2JqZWN0ICpvYmosIGVudW0gbGliYnBmX21hcF90eXBlIHR5cGUsXG4gXHRtYXAtXHUwMDNlc2VjX2lkeCA9IHNlY19pZHg7XG4gXHRtYXAtXHUwMDNlc2VjX29mZnNldCA9IDA7XG4gXHRtYXAtXHUwMDNlcmVhbF9uYW1lID0gc3RyZHVwKHJlYWxfbmFtZSk7XG4tXHRtYXAtXHUwMDNlbmFtZSA9IGludGVybmFsX21hcF9uYW1lKG9iaiwgcmVhbF9uYW1lKTtcbitcdG1hcC1cdTAwM2VuYW1lID0gaXNfcGVyY3B1ID8gc3RyZHVwKHJlYWxfbmFtZSkgOiBpbnRlcm5hbF9tYXBfbmFtZShvYmosIHJlYWxfbmFtZSk7XG4gXHRpZiAoIW1hcC1cdTAwM2VyZWFsX25hbWUgfHwgIW1hcC1cdTAwM2VuYW1lKSB7XG4gXHRcdHpmcmVlKFx1MDAyNm1hcC1cdTAwM2VyZWFsX25hbWUpO1xuIFx0XHR6ZnJlZShcdTAwMjZtYXAtXHUwMDNlbmFtZSk7XG5AQCAtMTk4Myw3ICsxOTg5LDcgQEAgYnBmX29iamVjdF9faW5pdF9pbnRlcm5hbF9tYXAoc3RydWN0IGJwZl9vYmplY3QgKm9iaiwgZW51bSBsaWJicGZfbWFwX3R5cGUgdHlwZSxcbiBcdH1cbiBcbiBcdGRlZiA9IFx1MDAyNm1hcC1cdTAwM2VkZWY7XG4tXHRkZWYtXHUwMDNldHlwZSA9IEJQRl9NQVBfVFlQRV9BUlJBWTtcbitcdGRlZi1cdTAwM2V0eXBlID0gaXNfcGVyY3B1ID8gQlBGX01BUF9UWVBFX1BFUkNQVV9BUlJBWSA6IEJQRl9NQVBfVFlQRV9BUlJBWTtcbiBcdGRlZi1cdTAwM2VrZXlfc2l6ZSA9IHNpemVvZihpbnQpO1xuIFx0ZGVmLVx1MDAzZXZhbHVlX3NpemUgPSBkYXRhX3N6O1xuIFx0ZGVmLVx1MDAzZW1heF9lbnRyaWVzID0gMTtcbkBAIC0xOTk2LDggKzIwMDIsOSBAQCBicGZfb2JqZWN0X19pbml0X2ludGVybmFsX21hcChzdHJ1Y3QgYnBmX29iamVjdCAqb2JqLCBlbnVtIGxpYmJwZl9tYXBfdHlwZSB0eXBlLFxuIFx0aWYgKG1hcF9pc19tbWFwYWJsZShvYmosIG1hcCkpXG4gXHRcdGRlZi1cdTAwM2VtYXBfZmxhZ3MgfD0gQlBGX0ZfTU1BUEFCTEU7XG4gXG4tXHRwcl9kZWJ1ZyhcIm1hcCAnJXMnIChnbG9iYWwgZGF0YSk6IGF0IHNlY19pZHggJWQsIG9mZnNldCAlenUsIGZsYWdzICV4LlxcblwiLFxuLVx0XHQgbWFwLVx1MDAzZW5hbWUsIG1hcC1cdTAwM2VzZWNfaWR4LCBtYXAtXHUwMDNlc2VjX29mZnNldCwgZGVmLVx1MDAzZW1hcF9mbGFncyk7XG4rXHRwcl9kZWJ1ZyhcIm1hcCAnJXMnIChnbG9iYWwgJXNkYXRhKTogYXQgc2VjX2lkeCAlZCwgb2Zmc2V0ICV6dSwgZmxhZ3MgJXguXFxuXCIsXG4rXHRcdCBtYXAtXHUwMDNlbmFtZSwgaXNfcGVyY3B1ID8gXCJwZXJjcHUgXCIgOiBcIlwiLCBtYXAtXHUwMDNlc2VjX2lkeCxcbitcdFx0IG1hcC1cdTAwM2VzZWNfb2Zmc2V0LCBkZWYtXHUwMDNlbWFwX2ZsYWdzKTtcbiBcbiBcdG1tYXBfc3ogPSBicGZfbWFwX21tYXBfc3oobWFwKTtcbiBcdG1hcC1cdTAwM2VtbWFwZWQgPSBtbWFwKE5VTEwsIG1tYXBfc3osIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsXG5AQCAtMjA1Nyw2ICsyMDY0LDEzIEBAIHN0YXRpYyBpbnQgYnBmX29iamVjdF9faW5pdF9nbG9iYWxfZGF0YV9tYXBzKHN0cnVjdCBicGZfb2JqZWN0ICpvYmopXG4gXHRcdFx0XHRcdFx0XHQgICAgTlVMTCxcbiBcdFx0XHRcdFx0XHRcdCAgICBzZWNfZGVzYy1cdTAwM2VkYXRhLVx1MDAzZWRfc2l6ZSk7XG4gXHRcdFx0YnJlYWs7XG4rXHRcdGNhc2UgU0VDX1BFUkNQVTpcbitcdFx0XHRzZWNfbmFtZSA9IGVsZl9zZWNfbmFtZShvYmosIGVsZl9zZWNfYnlfaWR4KG9iaiwgc2VjX2lkeCkpO1xuK1x0XHRcdGVyciA9IGJwZl9vYmplY3RfX2luaXRfaW50ZXJuYWxfbWFwKG9iaiwgTElCQlBGX01BUF9QRVJDUFUsXG4rXHRcdFx0XHRcdFx0XHQgICAgc2VjX25hbWUsIHNlY19pZHgsXG4rXHRcdFx0XHRcdFx0XHQgICAgc2VjX2Rlc2MtXHUwMDNlZGF0YS1cdTAwM2VkX2J1ZixcbitcdFx0XHRcdFx0XHRcdCAgICBzZWNfZGVzYy1cdTAwM2VkYXRhLVx1MDAzZWRfc2l6ZSk7XG4rXHRcdFx0YnJlYWs7XG4gXHRcdGRlZmF1bHQ6XG4gXHRcdFx0Lyogc2tpcCAqL1xuIFx0XHRcdGJyZWFrO1xuQEAgLTQwMTYsNiArNDAzMCwxMSBAQCBzdGF0aWMgaW50IGJwZl9vYmplY3RfX2VsZl9jb2xsZWN0KHN0cnVjdCBicGZfb2JqZWN0ICpvYmopXG4gXHRcdFx0XHRzZWNfZGVzYy1cdTAwM2VzZWNfdHlwZSA9IFNFQ19ST0RBVEE7XG4gXHRcdFx0XHRzZWNfZGVzYy1cdTAwM2VzaGRyID0gc2g7XG4gXHRcdFx0XHRzZWNfZGVzYy1cdTAwM2VkYXRhID0gZGF0YTtcbitcdFx0XHR9IGVsc2UgaWYgKHN0cmNtcChuYW1lLCBQRVJDUFVfU0VDKSA9PSAwIHx8XG4rXHRcdFx0XHQgICBzdHJfaGFzX3BmeChuYW1lLCBQRVJDUFVfU0VDIFwiLlwiKSkge1xuK1x0XHRcdFx0c2VjX2Rlc2MtXHUwMDNlc2VjX3R5cGUgPSBTRUNfUEVSQ1BVO1xuK1x0XHRcdFx0c2VjX2Rlc2MtXHUwMDNlc2hkciA9IHNoO1xuK1x0XHRcdFx0c2VjX2Rlc2MtXHUwMDNlZGF0YSA9IGRhdGE7XG4gXHRcdFx0fSBlbHNlIGlmIChzdHJjbXAobmFtZSwgU1RSVUNUX09QU19TRUMpID09IDAgfHxcbiBcdFx0XHRcdCAgIHN0cmNtcChuYW1lLCBTVFJVQ1RfT1BTX0xJTktfU0VDKSA9PSAwIHx8XG4gXHRcdFx0XHQgICBzdHJjbXAobmFtZSwgXCI/XCIgU1RSVUNUX09QU19TRUMpID09IDAgfHxcbkBAIC00NTQ0LDYgKzQ1NjMsNyBAQCBzdGF0aWMgYm9vbCBicGZfb2JqZWN0X19zaG5keF9pc19kYXRhKGNvbnN0IHN0cnVjdCBicGZfb2JqZWN0ICpvYmosXG4gXHRjYXNlIFNFQ19CU1M6XG4gXHRjYXNlIFNFQ19EQVRBOlxuIFx0Y2FzZSBTRUNfUk9EQVRBOlxuK1x0Y2FzZSBTRUNfUEVSQ1BVOlxuIFx0XHRyZXR1cm4gdHJ1ZTtcbiBcdGRlZmF1bHQ6XG4gXHRcdHJldHVybiBmYWxzZTtcbkBAIC00NTY5LDYgKzQ1ODksOCBAQCBicGZfb2JqZWN0X19zZWN0aW9uX3RvX2xpYmJwZl9tYXBfdHlwZShjb25zdCBzdHJ1Y3QgYnBmX29iamVjdCAqb2JqLCBpbnQgc2huZHgpXG4gXHRcdHJldHVybiBMSUJCUEZfTUFQX0RBVEE7XG4gXHRjYXNlIFNFQ19ST0RBVEE6XG4gXHRcdHJldHVybiBMSUJCUEZfTUFQX1JPREFUQTtcbitcdGNhc2UgU0VDX1BFUkNQVTpcbitcdFx0cmV0dXJuIExJQkJQRl9NQVBfUEVSQ1BVO1xuIFx0ZGVmYXVsdDpcbiBcdFx0cmV0dXJuIExJQkJQRl9NQVBfVU5TUEVDO1xuIFx0fVxuQEAgLTQ5NDQsNyArNDk2Niw3IEBAIHN0YXRpYyBpbnQgbWFwX2ZpbGxfYnRmX3R5cGVfaW5mbyhzdHJ1Y3QgYnBmX29iamVjdCAqb2JqLCBzdHJ1Y3QgYnBmX21hcCAqbWFwKVxuIFxuIFx0LypcbiBcdCAqIExMVk0gYW5ub3RhdGVzIGdsb2JhbCBkYXRhIGRpZmZlcmVudGx5IGluIEJURiwgdGhhdCBpcyxcbi1cdCAqIG9ubHkgYXMgJy5kYXRhJywgJy5ic3MnIG9yICcucm9kYXRhJy5cbitcdCAqIG9ubHkgYXMgJy5kYXRhJywgJy5ic3MnLCAnLnBlcmNwdScgb3IgJy5yb2RhdGEnLlxuIFx0ICovXG4gXHRpZiAoIWJwZl9tYXBfX2lzX2ludGVybmFsKG1hcCkpXG4gXHRcdHJldHVybiAtRU5PRU5UO1xuQEAgLTUyOTcsMTggKzUzMTksMzAgQEAgc3RhdGljIGludFxuIGJwZl9vYmplY3RfX3BvcHVsYXRlX2ludGVybmFsX21hcChzdHJ1Y3QgYnBmX29iamVjdCAqb2JqLCBzdHJ1Y3QgYnBmX21hcCAqbWFwKVxuIHtcbiBcdGVudW0gbGliYnBmX21hcF90eXBlIG1hcF90eXBlID0gbWFwLVx1MDAzZWxpYmJwZl90eXBlO1xuK1x0Ym9vbCBpc19wZXJjcHUgPSBtYXBfdHlwZSA9PSBMSUJCUEZfTUFQX1BFUkNQVTtcbitcdF9fdTY0IHVwZGF0ZV9mbGFncyA9IDA7XG4gXHRpbnQgZXJyLCB6ZXJvID0gMDtcbiBcdHNpemVfdCBtbWFwX3N6O1xuIFxuK1x0aWYgKGlzX3BlcmNwdSkge1xuK1x0XHRpZiAoIW9iai1cdTAwM2VnZW5fbG9hZGVyIFx1MDAyNlx1MDAyNiAha2VybmVsX3N1cHBvcnRzKG9iaiwgRkVBVF9QRVJDUFVfREFUQSkpIHtcbitcdFx0XHRwcl93YXJuKFwibWFwICclcyc6IGtlcm5lbCBkb2VzIG5vdCBzdXBwb3J0IHBlcmNwdSBkYXRhLlxcblwiLFxuK1x0XHRcdFx0YnBmX21hcF9fbmFtZShtYXApKTtcbitcdFx0XHRyZXR1cm4gLUVPUE5PVFNVUFA7XG4rXHRcdH1cbitcbitcdFx0dXBkYXRlX2ZsYWdzID0gQlBGX0ZfQUxMX0NQVVM7XG4rXHR9XG4rXG4gXHRpZiAob2JqLVx1MDAzZWdlbl9sb2FkZXIpIHtcbiBcdFx0YnBmX2dlbl9fbWFwX3VwZGF0ZV9lbGVtKG9iai1cdTAwM2VnZW5fbG9hZGVyLCBtYXAgLSBvYmotXHUwMDNlbWFwcyxcbi1cdFx0XHRcdFx0IG1hcC1cdTAwM2VtbWFwZWQsIG1hcC1cdTAwM2VkZWYudmFsdWVfc2l6ZSk7XG4rXHRcdFx0XHRcdCBtYXAtXHUwMDNlbW1hcGVkLCBtYXAtXHUwMDNlZGVmLnZhbHVlX3NpemUsIHVwZGF0ZV9mbGFncyk7XG4gXHRcdGlmIChtYXBfdHlwZSA9PSBMSUJCUEZfTUFQX1JPREFUQSB8fCBtYXBfdHlwZSA9PSBMSUJCUEZfTUFQX0tDT05GSUcpXG4gXHRcdFx0YnBmX2dlbl9fbWFwX2ZyZWV6ZShvYmotXHUwMDNlZ2VuX2xvYWRlciwgbWFwIC0gb2JqLVx1MDAzZW1hcHMpO1xuIFx0XHRyZXR1cm4gMDtcbiBcdH1cbiBcbi1cdGVyciA9IGJwZl9tYXBfdXBkYXRlX2VsZW0obWFwLVx1MDAzZWZkLCBcdTAwMjZ6ZXJvLCBtYXAtXHUwMDNlbW1hcGVkLCAwKTtcbitcdGVyciA9IGJwZl9tYXBfdXBkYXRlX2VsZW0obWFwLVx1MDAzZWZkLCBcdTAwMjZ6ZXJvLCBtYXAtXHUwMDNlbW1hcGVkLCB1cGRhdGVfZmxhZ3MpO1xuIFx0aWYgKGVycikge1xuIFx0XHRlcnIgPSAtZXJybm87XG4gXHRcdHByX3dhcm4oXCJtYXAgJyVzJzogZmFpbGVkIHRvIHNldCBpbml0aWFsIGNvbnRlbnRzOiAlc1xcblwiLFxuQEAgLTUzNTMsNiArNTM4NywxMyBAQCBicGZfb2JqZWN0X19wb3B1bGF0ZV9pbnRlcm5hbF9tYXAoc3RydWN0IGJwZl9vYmplY3QgKm9iaiwgc3RydWN0IGJwZl9tYXAgKm1hcClcbiBcdFx0XHRyZXR1cm4gZXJyO1xuIFx0XHR9XG4gXHRcdG1hcC1cdTAwM2VtbWFwZWQgPSBtbWFwZWQ7XG4rXHR9IGVsc2UgaWYgKGlzX3BlcmNwdSkge1xuK1x0XHRpZiAobXByb3RlY3QobWFwLVx1MDAzZW1tYXBlZCwgbW1hcF9zeiwgUFJPVF9SRUFEKSkge1xuK1x0XHRcdGVyciA9IC1lcnJubztcbitcdFx0XHRwcl93YXJuKFwibWFwICclcyc6IGZhaWxlZCB0byBtcHJvdGVjdCgpIGNvbnRlbnRzOiAlc1xcblwiLFxuK1x0XHRcdFx0YnBmX21hcF9fbmFtZShtYXApLCBlcnJzdHIoZXJyKSk7XG4rXHRcdFx0cmV0dXJuIGVycjtcbitcdFx0fVxuIFx0fSBlbHNlIGlmIChtYXAtXHUwMDNlbW1hcGVkKSB7XG4gXHRcdG11bm1hcChtYXAtXHUwMDNlbW1hcGVkLCBtbWFwX3N6KTtcbiBcdFx0bWFwLVx1MDAzZW1tYXBlZCA9IE5VTEw7XG5kaWZmIC0tZ2l0IGEvdG9vbHMvbGliL2JwZi9saWJicGZfaW50ZXJuYWwuaCBiL3Rvb2xzL2xpYi9icGYvbGliYnBmX2ludGVybmFsLmhcbmluZGV4IDA0Y2QzMDNmYjVhODc5Li40N2FlMzkxMjVmNjhmOSAxMDA2NDRcbi0tLSBhL3Rvb2xzL2xpYi9icGYvbGliYnBmX2ludGVybmFsLmhcbisrKyBiL3Rvb2xzL2xpYi9icGYvbGliYnBmX2ludGVybmFsLmhcbkBAIC00MDEsNiArNDAxLDggQEAgZW51bSBrZXJuX2ZlYXR1cmVfaWQge1xuIFx0RkVBVF9CVEZfTEFZT1VULFxuIFx0LyogS2VybmVsIHN1cHBvcnRzIEJQRiBzeXNjYWxsIGNvbW1vbiBhdHRyaWJ1dGVzICovXG4gXHRGRUFUX0JQRl9TWVNDQUxMX0NPTU1PTl9BVFRSUyxcbitcdC8qIEtlcm5lbCBzdXBwb3J0cyBwZXJjcHUgZGF0YSAqL1xuK1x0RkVBVF9QRVJDUFVfREFUQSxcbiBcdF9fRkVBVF9DTlQsXG4gfTtcbiBcbmRpZmYgLS1naXQgYS90b29scy9saWIvYnBmL3NrZWxfaW50ZXJuYWwuaCBiL3Rvb2xzL2xpYi9icGYvc2tlbF9pbnRlcm5hbC5oXG5pbmRleCA3NDUwM2QzNThiYzhhNS4uNDg1YjBjZDE3MDE3MzkgMTAwNjQ0XG4tLS0gYS90b29scy9saWIvYnBmL3NrZWxfaW50ZXJuYWwuaFxuKysrIGIvdG9vbHMvbGliL2JwZi9za2VsX2ludGVybmFsLmhcbkBAIC0xMzUsOCArMTM1LDEwIEBAIHN0YXRpYyBpbmxpbmUgdm9pZCBza2VsX2ZyZWVfbWFwX2RhdGEodm9pZCAqcCwgX191NjQgYWRkciwgc2l6ZV90IHN6KVxuIHtcbiBcdGlmIChhZGRyICE9IH4wVUxMKVxuIFx0XHRrdmZyZWUocCk7XG4tXHQvKiBXaGVuIGFkZHIgPT0gfjBVTEwgdGhlICdwJyBwb2ludHMgdG9cbi1cdCAqICgoc3RydWN0IGJwZl9hcnJheSAqKW1hcCktXHUwMDNldmFsdWUuIFNlZSBza2VsX2ZpbmFsaXplX21hcF9kYXRhLlxuK1x0LypcbitcdCAqIFdoZW4gYWRkciA9PSB+MFVMTCB0aGUgaW5pdCBidWZmZXIgaGFzIGFscmVhZHkgYmVlbiByZWxlYXNlZC5cbitcdCAqIEZvciBza2VsX2ZpbmFsaXplX21hcF9kYXRhKCksICdwJyBwb2ludHMgdG9cbitcdCAqICgoc3RydWN0IGJwZl9hcnJheSAqKW1hcCktXHUwMDNldmFsdWUuXG4gXHQgKi9cbiB9XG4gXG5AQCAtMTc0LDYgKzE3NiwxNSBAQCBzdGF0aWMgaW5saW5lIHZvaWQgKnNrZWxfZmluYWxpemVfbWFwX2RhdGEoX191NjQgKmluaXRfdmFsLCBzaXplX3QgbW1hcF9zeiwgaW50XG4gXHRyZXR1cm4gYWRkcjtcbiB9XG4gXG4rc3RhdGljIGlubGluZSBpbnQgc2tlbF9wcm90ZWN0X21hcF9kYXRhKHZvaWQgKnAsIF9fdTY0ICppbml0X3ZhbCwgc2l6ZV90IHN6KVxuK3tcbitcdCh2b2lkKXN6O1xuK1xuK1x0a3ZmcmVlKHApO1xuK1x0KmluaXRfdmFsID0gfjBVTEw7XG4rXHRyZXR1cm4gMDtcbit9XG4rXG4gI2Vsc2VcbiBcbiBzdGF0aWMgaW5saW5lIHZvaWQgKnNrZWxfYWxsb2Moc2l6ZV90IHNpemUpXG5AQCAtMjEyLDYgKzIyMywxNSBAQCBzdGF0aWMgaW5saW5lIHZvaWQgKnNrZWxfZmluYWxpemVfbWFwX2RhdGEoX191NjQgKmluaXRfdmFsLCBzaXplX3QgbW1hcF9zeiwgaW50XG4gXHRcdHJldHVybiBOVUxMO1xuIFx0cmV0dXJuIGFkZHI7XG4gfVxuK1xuK3N0YXRpYyBpbmxpbmUgaW50IHNrZWxfcHJvdGVjdF9tYXBfZGF0YSh2b2lkICpwLCBfX3U2NCAqaW5pdF92YWwsIHNpemVfdCBzeilcbit7XG4rXHQodm9pZClpbml0X3ZhbDtcbitcbitcdGlmIChtcHJvdGVjdChwLCBzeiwgUFJPVF9SRUFEKSlcbitcdFx0cmV0dXJuIC1lcnJubztcbitcdHJldHVybiAwO1xuK31cbiAjZW5kaWZcbiBcbiBzdGF0aWMgaW5saW5lIGludCBza2VsX2Nsb3NlbnooaW50IGZkKVxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9NYWtlZmlsZSBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9NYWtlZmlsZVxuaW5kZXggYjY0MmVlNDg5ZWE2NDAuLmMzN2VkOWU3Yjk3Y2QwIDEwMDY0NFxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL01ha2VmaWxlXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvTWFrZWZpbGVcbkBAIC01MzMsNyArNTMzLDcgQEAgTFNLRUxTX1NJR05FRCA6PSBmZW50cnlfdGVzdC5jIGZleGl0X3Rlc3QuYyBhdG9taWNzLmNcbiBcbiAjIEdlbmVyYXRlIGJvdGggbGlnaHQgc2tlbGV0b24gYW5kIGxpYmJwZiBza2VsZXRvbiBmb3IgdGhlc2VcbiBMU0tFTFNfRVhUUkEgOj0gdGVzdF9rc3ltc19tb2R1bGUuYyB0ZXN0X2tzeW1zX3dlYWsuYyBrZnVuY19jYWxsX3Rlc3QuYyBcXFxuLVx0a2Z1bmNfY2FsbF90ZXN0X3N1YnByb2cuY1xuK1x0a2Z1bmNfY2FsbF90ZXN0X3N1YnByb2cuYyB0ZXN0X2dsb2JhbF9wZXJjcHVfZGF0YS5jXG4gU0tFTF9CTEFDS0xJU1QgKz0gJCQoTFNLRUxTKSAkJChMU0tFTFNfU0lHTkVEKVxuIFxuIHRlc3Rfc3RhdGljX2xpbmtlZC5za2VsLmgtZGVwcyA6PSB0ZXN0X3N0YXRpY19saW5rZWQxLmJwZi5vIHRlc3Rfc3RhdGljX2xpbmtlZDIuYnBmLm9cbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9nbG9iYWxfZGF0YV9pbml0LmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9nbG9iYWxfZGF0YV9pbml0LmNcbmluZGV4IDg0NjYzMzJkNzQwNmY0Li5hNWQ4Nzc2OGY2ZWUyZiAxMDA2NDRcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2dsb2JhbF9kYXRhX2luaXQuY1xuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvZ2xvYmFsX2RhdGFfaW5pdC5jXG5AQCAtMSw1ICsxLDggQEBcbiAvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxuICNpbmNsdWRlIFx1MDAzY3Rlc3RfcHJvZ3MuaFx1MDAzZVxuKyNpbmNsdWRlIFwiYnBmL2xpYmJwZl9pbnRlcm5hbC5oXCJcbisjaW5jbHVkZSBcInRlc3RfZ2xvYmFsX3BlcmNwdV9kYXRhLnNrZWwuaFwiXG4rI2luY2x1ZGUgXCJ0ZXN0X2dsb2JhbF9wZXJjcHVfZGF0YS5sc2tlbC5oXCJcbiBcbiB2b2lkIHRlc3RfZ2xvYmFsX2RhdGFfaW5pdCh2b2lkKVxuIHtcbkBAIC02MCwzICs2MywyOTAgQEAgdm9pZCB0ZXN0X2dsb2JhbF9kYXRhX2luaXQodm9pZClcbiBcdGZyZWUobmV3dmFsKTtcbiBcdGJwZl9vYmplY3RfX2Nsb3NlKG9iaik7XG4gfVxuK1xuK3N0YXRpYyB2b2lkIHRlc3RfcGVyY3B1X2RhdGFfb25fY3B1cyhpbnQgbWFwX2ZkLCBpbnQgcHJvZ19mZCwgaW50IG51bV9vbmxpbmUsIGJvb2wgKm9ubGluZSlcbit7XG4rXHRfX3U2NCBhcmdzWzJdID0gezB4MTIzNFVMTCwgMHg1Njc4VUxMfTtcbitcdExJQkJQRl9PUFRTKGJwZl90ZXN0X3J1bl9vcHRzLCB0b3B0cyxcbitcdFx0ICAgIC5jdHhfaW4gPSBhcmdzLFxuK1x0XHQgICAgLmN0eF9zaXplX2luID0gc2l6ZW9mKGFyZ3MpLFxuK1x0XHQgICAgLmZsYWdzID0gQlBGX0ZfVEVTVF9SVU5fT05fQ1BVLFxuK1x0KTtcbitcdGludCBpLCBlcnIsIGtleSA9IDA7XG4rXG4rXHQvKiBydW4gb24gZXZlcnkgb25saW5lLUNQVSAqL1xuK1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgbnVtX29ubGluZTsgaSsrKSB7XG4rXHRcdHN0cnVjdCB0ZXN0X2dsb2JhbF9wZXJjcHVfZGF0YV9fcGVyY3B1IGRhdGEgPSB7fTtcbitcdFx0X191NjQgZmxhZ3M7XG4rXG4rXHRcdGlmICghb25saW5lW2ldKVxuK1x0XHRcdGNvbnRpbnVlO1xuK1xuK1x0XHR0b3B0cy5jcHUgPSBpO1xuK1x0XHR0b3B0cy5yZXR2YWwgPSAtMTtcbitcdFx0ZXJyID0gYnBmX3Byb2dfdGVzdF9ydW5fb3B0cyhwcm9nX2ZkLCBcdTAwMjZ0b3B0cyk7XG4rXHRcdEFTU0VSVF9PSyhlcnIsIFwiYnBmX3Byb2dfdGVzdF9ydW5fb3B0c1wiKTtcbitcdFx0QVNTRVJUX0VRKHRvcHRzLnJldHZhbCwgMCwgXCJicGZfcHJvZ190ZXN0X3J1bl9vcHRzIHJldHZhbFwiKTtcbitcbitcdFx0ZmxhZ3MgPSAoKF9fdTY0KSBpIFx1MDAzY1x1MDAzYyAzMikgfCBCUEZfRl9DUFU7XG4rXHRcdGVyciA9IGJwZl9tYXBfbG9va3VwX2VsZW1fZmxhZ3MobWFwX2ZkLCBcdTAwMjZrZXksIFx1MDAyNmRhdGEsIGZsYWdzKTtcbitcdFx0aWYgKCFBU1NFUlRfT0soZXJyLCBcImJwZl9tYXBfbG9va3VwX2VsZW1fZmxhZ3NcIikpXG4rXHRcdFx0cmV0dXJuO1xuK1xuK1x0XHRBU1NFUlRfRVEoZGF0YS5kYXRhLCAxLCBcImRhdGEuZGF0YVwiKTtcbitcdFx0QVNTRVJUX1RSVUUoZGF0YS5ydW4sIFwiZGF0YS5ydW5cIik7XG4rXHRcdEFTU0VSVF9FUShkYXRhLm51bXNbNl0sIDB4YzBkZSwgXCJkYXRhLm51bXNbNl1cIik7XG4rXHRcdEFTU0VSVF9FUShkYXRhLnN0cnVjdF9kYXRhLmksIDEsIFwic3RydWN0X2RhdGEuaVwiKTtcbitcdFx0QVNTRVJUX1RSVUUoZGF0YS5zdHJ1Y3RfZGF0YS5zZXQsIFwic3RydWN0X2RhdGEuc2V0XCIpO1xuK1x0XHRBU1NFUlRfRVEoZGF0YS5zdHJ1Y3RfZGF0YS5udW1zWzZdLCAweGMwZGUsIFwic3RydWN0X2RhdGEubnVtc1s2XVwiKTtcbitcdH1cbit9XG4rXG4rc3RhdGljIHZvaWQgdGVzdF9nbG9iYWxfcGVyY3B1X2RhdGFfaW5pdCh2b2lkKVxuK3tcbitcdHN0cnVjdCB0ZXN0X2dsb2JhbF9wZXJjcHVfZGF0YV9fcGVyY3B1IGluaXRfdmFsdWUgPSB7fTtcbitcdHN0cnVjdCB0ZXN0X2dsb2JhbF9wZXJjcHVfZGF0YV9fcGVyY3B1ICppbml0X2RhdGE7XG4rXHRzdHJ1Y3QgdGVzdF9nbG9iYWxfcGVyY3B1X2RhdGEgKnNrZWwgPSBOVUxMO1xuK1x0aW50IHByb2dfZmQsIG1hcF9mZCwgZXJyLCBudW1fb25saW5lO1xuK1x0c2l6ZV90IGluaXRfZGF0YV9zejtcbitcdHN0cnVjdCBicGZfbWFwICptYXA7XG4rXHRib29sICpvbmxpbmU7XG4rXG4rXHRlcnIgPSBwYXJzZV9jcHVfbWFza19maWxlKFwiL3N5cy9kZXZpY2VzL3N5c3RlbS9jcHUvb25saW5lXCIsIFx1MDAyNm9ubGluZSwgXHUwMDI2bnVtX29ubGluZSk7XG4rXHRpZiAoIUFTU0VSVF9PSyhlcnIsIFwicGFyc2VfY3B1X21hc2tfZmlsZVwiKSlcbitcdFx0cmV0dXJuO1xuK1xuK1x0c2tlbCA9IHRlc3RfZ2xvYmFsX3BlcmNwdV9kYXRhX19vcGVuKCk7XG4rXHRpZiAoIUFTU0VSVF9PS19QVFIoc2tlbCwgXCJ0ZXN0X2dsb2JhbF9wZXJjcHVfZGF0YV9fb3BlblwiKSlcbitcdFx0Z290byBvdXQ7XG4rXHRpZiAoIUFTU0VSVF9PS19QVFIoc2tlbC1cdTAwM2VwZXJjcHUsIFwic2tlbC1cdTAwM2VwZXJjcHVcIikpXG4rXHRcdGdvdG8gb3V0O1xuK1xuK1x0QVNTRVJUX0VRKHNrZWwtXHUwMDNlcGVyY3B1LVx1MDAzZWRhdGEsIC0xLCBcInNrZWwtXHUwMDNlcGVyY3B1LVx1MDAzZWRhdGFcIik7XG4rXHRBU1NFUlRfRkFMU0Uoc2tlbC1cdTAwM2VwZXJjcHUtXHUwMDNlcnVuLCBcInNrZWwtXHUwMDNlcGVyY3B1LVx1MDAzZXJ1blwiKTtcbitcdEFTU0VSVF9FUShza2VsLVx1MDAzZXBlcmNwdS1cdTAwM2VudW1zWzZdLCAwLCBcInNrZWwtXHUwMDNlcGVyY3B1LVx1MDAzZW51bXNbNl1cIik7XG4rXHRBU1NFUlRfRVEoc2tlbC1cdTAwM2VwZXJjcHUtXHUwMDNlc3RydWN0X2RhdGEuaSwgLTEsIFwic3RydWN0X2RhdGEuaVwiKTtcbitcdEFTU0VSVF9GQUxTRShza2VsLVx1MDAzZXBlcmNwdS1cdTAwM2VzdHJ1Y3RfZGF0YS5zZXQsIFwic3RydWN0X2RhdGEuc2V0XCIpO1xuK1x0QVNTRVJUX0VRKHNrZWwtXHUwMDNlcGVyY3B1LVx1MDAzZXN0cnVjdF9kYXRhLm51bXNbNl0sIDAsIFwic3RydWN0X2RhdGEubnVtc1s2XVwiKTtcbitcbitcdG1hcCA9IHNrZWwtXHUwMDNlbWFwcy5wZXJjcHU7XG4rXHRpZiAoIUFTU0VSVF9FUShicGZfbWFwX190eXBlKG1hcCksIEJQRl9NQVBfVFlQRV9QRVJDUFVfQVJSQVksIFwiYnBmX21hcF9fdHlwZVwiKSlcbitcdFx0Z290byBvdXQ7XG4rXG4rXHRpbml0X3ZhbHVlLmRhdGEgPSAyO1xuK1x0aW5pdF92YWx1ZS5udW1zWzZdID0gLTE7XG4rXHRpbml0X3ZhbHVlLnN0cnVjdF9kYXRhLmkgPSAyO1xuK1x0aW5pdF92YWx1ZS5zdHJ1Y3RfZGF0YS5udW1zWzZdID0gLTE7XG4rXHRlcnIgPSBicGZfbWFwX19zZXRfaW5pdGlhbF92YWx1ZShtYXAsIFx1MDAyNmluaXRfdmFsdWUsIHNpemVvZihpbml0X3ZhbHVlKSk7XG4rXHRpZiAoIUFTU0VSVF9PSyhlcnIsIFwiYnBmX21hcF9fc2V0X2luaXRpYWxfdmFsdWVcIikpXG4rXHRcdGdvdG8gb3V0O1xuK1xuK1x0aW5pdF9kYXRhID0gYnBmX21hcF9faW5pdGlhbF92YWx1ZShtYXAsIFx1MDAyNmluaXRfZGF0YV9zeik7XG4rXHRpZiAoIUFTU0VSVF9PS19QVFIoaW5pdF9kYXRhLCBcImJwZl9tYXBfX2luaXRpYWxfdmFsdWVcIikpXG4rXHRcdGdvdG8gb3V0O1xuK1xuK1x0QVNTRVJUX0VRKGluaXRfZGF0YS1cdTAwM2VkYXRhLCBpbml0X3ZhbHVlLmRhdGEsIFwiaW5pdF92YWx1ZSBkYXRhXCIpO1xuK1x0QVNTRVJUX0VRKGluaXRfZGF0YS1cdTAwM2VydW4sIGluaXRfdmFsdWUucnVuLCBcImluaXRfdmFsdWUgcnVuXCIpO1xuK1x0QVNTRVJUX0VRKGluaXRfZGF0YS1cdTAwM2VzdHJ1Y3RfZGF0YS5pLCBpbml0X3ZhbHVlLnN0cnVjdF9kYXRhLmksIFwiaW5pdF92YWx1ZSBzdHJ1Y3RfZGF0YS5pXCIpO1xuK1x0QVNTRVJUX0VRKGluaXRfZGF0YS1cdTAwM2VzdHJ1Y3RfZGF0YS5udW1zWzZdLCBpbml0X3ZhbHVlLnN0cnVjdF9kYXRhLm51bXNbNl0sXG4rXHRcdCAgXCJpbml0X3ZhbHVlIHN0cnVjdF9kYXRhLm51bXNbNl1cIik7XG4rXHRBU1NFUlRfRVEoaW5pdF9kYXRhX3N6LCBzaXplb2YoaW5pdF92YWx1ZSksIFwiaW5pdF92YWx1ZSBzaXplXCIpO1xuK1x0QVNTRVJUX0VRKCh2b2lkICopIGluaXRfZGF0YSwgKHZvaWQgKikgc2tlbC1cdTAwM2VwZXJjcHUsIFwic2tlbC1cdTAwM2VwZXJjcHUgZXEgaW5pdF9kYXRhXCIpO1xuK1x0QVNTRVJUX0VRKHNrZWwtXHUwMDNlcGVyY3B1LVx1MDAzZWRhdGEsIGluaXRfdmFsdWUuZGF0YSwgXCJza2VsLVx1MDAzZXBlcmNwdS1cdTAwM2VkYXRhXCIpO1xuK1x0QVNTRVJUX0VRKHNrZWwtXHUwMDNlcGVyY3B1LVx1MDAzZXJ1biwgaW5pdF92YWx1ZS5ydW4sIFwic2tlbC1cdTAwM2VwZXJjcHUtXHUwMDNlcnVuXCIpO1xuK1x0QVNTRVJUX0VRKHNrZWwtXHUwMDNlcGVyY3B1LVx1MDAzZXN0cnVjdF9kYXRhLmksIGluaXRfdmFsdWUuc3RydWN0X2RhdGEuaSxcbitcdFx0ICBcInNrZWwtXHUwMDNlcGVyY3B1LVx1MDAzZXN0cnVjdF9kYXRhLmlcIik7XG4rXHRBU1NFUlRfRVEoc2tlbC1cdTAwM2VwZXJjcHUtXHUwMDNlc3RydWN0X2RhdGEubnVtc1s2XSwgaW5pdF92YWx1ZS5zdHJ1Y3RfZGF0YS5udW1zWzZdLFxuK1x0XHQgIFwic2tlbC1cdTAwM2VwZXJjcHUtXHUwMDNlc3RydWN0X2RhdGEubnVtc1s2XVwiKTtcbitcbitcdGVyciA9IHRlc3RfZ2xvYmFsX3BlcmNwdV9kYXRhX19sb2FkKHNrZWwpO1xuK1x0aWYgKCFBU1NFUlRfT0soZXJyLCBcInRlc3RfZ2xvYmFsX3BlcmNwdV9kYXRhX19sb2FkXCIpKVxuK1x0XHRnb3RvIG91dDtcbitcbitcdEFTU0VSVF9PS19QVFIoc2tlbC1cdTAwM2VwZXJjcHUsIFwic2tlbC1cdTAwM2VwZXJjcHVcIik7XG4rXG4rXHRtYXBfZmQgPSBicGZfbWFwX19mZChtYXApO1xuK1x0cHJvZ19mZCA9IGJwZl9wcm9ncmFtX19mZChza2VsLVx1MDAzZXByb2dzLnVwZGF0ZV9wZXJjcHVfZGF0YSk7XG4rXHR0ZXN0X3BlcmNwdV9kYXRhX29uX2NwdXMobWFwX2ZkLCBwcm9nX2ZkLCBudW1fb25saW5lLCBvbmxpbmUpO1xuK1xuK291dDpcbitcdHRlc3RfZ2xvYmFsX3BlcmNwdV9kYXRhX19kZXN0cm95KHNrZWwpO1xuK1x0ZnJlZShvbmxpbmUpO1xuK31cbitcbitzdGF0aWMgdm9pZCB0ZXN0X2dsb2JhbF9wZXJjcHVfZGF0YV9sc2tlbCh2b2lkKVxuK3tcbitcdHN0cnVjdCB0ZXN0X2dsb2JhbF9wZXJjcHVfZGF0YV9sc2tlbCAqbHNrZWwgPSBOVUxMO1xuK1x0aW50IHByb2dfZmQsIG1hcF9mZCwgZXJyLCBudW1fb25saW5lO1xuK1x0Ym9vbCAqb25saW5lO1xuK1xuK1x0ZXJyID0gcGFyc2VfY3B1X21hc2tfZmlsZShcIi9zeXMvZGV2aWNlcy9zeXN0ZW0vY3B1L29ubGluZVwiLCBcdTAwMjZvbmxpbmUsIFx1MDAyNm51bV9vbmxpbmUpO1xuK1x0aWYgKCFBU1NFUlRfT0soZXJyLCBcInBhcnNlX2NwdV9tYXNrX2ZpbGVcIikpXG4rXHRcdHJldHVybjtcbitcbitcdGxza2VsID0gdGVzdF9nbG9iYWxfcGVyY3B1X2RhdGFfbHNrZWxfX29wZW5fYW5kX2xvYWQoKTtcbitcdGlmICghQVNTRVJUX09LX1BUUihsc2tlbCwgXCJ0ZXN0X2dsb2JhbF9wZXJjcHVfZGF0YV9sc2tlbF9fb3Blbl9hbmRfbG9hZFwiKSlcbitcdFx0Z290byBvdXQ7XG4rXG4rXHRtYXBfZmQgPSBsc2tlbC1cdTAwM2VtYXBzLnBlcmNwdS5tYXBfZmQ7XG4rXHRwcm9nX2ZkID0gbHNrZWwtXHUwMDNlcHJvZ3MudXBkYXRlX3BlcmNwdV9kYXRhLnByb2dfZmQ7XG4rXHR0ZXN0X3BlcmNwdV9kYXRhX29uX2NwdXMobWFwX2ZkLCBwcm9nX2ZkLCBudW1fb25saW5lLCBvbmxpbmUpO1xuK1xuK291dDpcbitcdHRlc3RfZ2xvYmFsX3BlcmNwdV9kYXRhX2xza2VsX19kZXN0cm95KGxza2VsKTtcbitcdGZyZWUob25saW5lKTtcbit9XG4rXG4rc3RhdGljIGludCBjcmVhdGVfcmRvbmx5X3BlcmNwdV9hcnJheSh2b2lkKVxuK3tcbitcdExJQkJQRl9PUFRTKGJwZl9tYXBfY3JlYXRlX29wdHMsIG1hcF9vcHRzLFxuK1x0XHQgICAgLm1hcF9mbGFncyA9IEJQRl9GX1JET05MWV9QUk9HLFxuK1x0KTtcbitcdGludCBrZXkgPSAwLCBtYXBfZmQsIGVycjtcbitcdF9fdTY0IHZhbHVlID0gMDtcbitcbitcdG1hcF9mZCA9IGJwZl9tYXBfY3JlYXRlKEJQRl9NQVBfVFlQRV9QRVJDUFVfQVJSQVksIFwicGVyY3B1X3JvX21hcFwiLCBzaXplb2YoaW50KSxcbitcdFx0XHRcdHNpemVvZihfX3U2NCksIDEsIFx1MDAyNm1hcF9vcHRzKTtcbitcdGlmICghQVNTRVJUX0dFKG1hcF9mZCwgMCwgXCJicGZfbWFwX2NyZWF0ZVwiKSlcbitcdFx0cmV0dXJuIC0xO1xuK1xuK1x0ZXJyID0gYnBmX21hcF91cGRhdGVfZWxlbShtYXBfZmQsIFx1MDAyNmtleSwgXHUwMDI2dmFsdWUsIEJQRl9GX0FMTF9DUFVTKTtcbitcdGlmICghQVNTRVJUX09LKGVyciwgXCJicGZfbWFwX3VwZGF0ZV9lbGVtXCIpKVxuK1x0XHRnb3RvIG91dDtcbitcbitcdGVyciA9IGJwZl9tYXBfZnJlZXplKG1hcF9mZCk7XG4rXHRpZiAoIUFTU0VSVF9PSyhlcnIsIFwiYnBmX21hcF9mcmVlemVcIikpXG4rXHRcdGdvdG8gb3V0O1xuK1xuK1x0cmV0dXJuIG1hcF9mZDtcbitcbitvdXQ6XG4rXHRjbG9zZShtYXBfZmQpO1xuK1x0cmV0dXJuIC0xO1xuK31cbitcbitzdGF0aWMgdm9pZCB0ZXN0X2dsb2JhbF9wZXJjcHVfZGF0YV9yZG9ubHlfZGlyZWN0X3JlYWQodm9pZClcbit7XG4rXHRzdHJ1Y3QgYnBmX2luc24gaW5zbnNbXSA9IHtcbitcdFx0QlBGX0xEX01BUF9WQUxVRShCUEZfUkVHXzEsIDAsIDApLFxuK1x0XHRCUEZfTERYX01FTShCUEZfRFcsIEJQRl9SRUdfMCwgQlBGX1JFR18xLCAwKSxcbitcdFx0QlBGX0VYSVRfSU5TTigpLFxuK1x0fTtcbitcdGludCBtYXBfZmQsIHByb2dfZmQ7XG4rXG4rXHRtYXBfZmQgPSBjcmVhdGVfcmRvbmx5X3BlcmNwdV9hcnJheSgpO1xuK1x0aWYgKG1hcF9mZCBcdTAwM2MgMClcbitcdFx0cmV0dXJuO1xuK1xuK1x0aW5zbnNbMF0uaW1tID0gbWFwX2ZkO1xuK1x0cHJvZ19mZCA9IGJwZl9wcm9nX2xvYWQoQlBGX1BST0dfVFlQRV9TT0NLRVRfRklMVEVSLCBcInBlcmNwdV9yb19wcm9nXCIsIFwiR1BMXCIsIGluc25zLFxuK1x0XHRcdFx0QVJSQVlfU0laRShpbnNucyksIE5VTEwpO1xuK1x0aWYgKEFTU0VSVF9HRShwcm9nX2ZkLCAwLCBcImJwZl9wcm9nX2xvYWRcIikpXG4rXHRcdGNsb3NlKHByb2dfZmQpO1xuK1x0Y2xvc2UobWFwX2ZkKTtcbit9XG4rXG4rc3RhdGljIHZvaWQgdGVzdF9nbG9iYWxfcGVyY3B1X2RhdGFfcmRvbmx5X2RpcmVjdF93cml0ZSh2b2lkKVxuK3tcbitcdExJQkJQRl9PUFRTKGJwZl9wcm9nX2xvYWRfb3B0cywgcHJvZ19vcHRzKTtcbitcdHN0cnVjdCBicGZfaW5zbiBpbnNuc1tdID0ge1xuK1x0XHRCUEZfTERfTUFQX1ZBTFVFKEJQRl9SRUdfMSwgMCwgMCksXG4rXHRcdEJQRl9MRFhfTUVNKEJQRl9EVywgQlBGX1JFR18wLCBCUEZfUkVHXzEsIDApLFxuK1x0XHRCUEZfU1RfTUVNKEJQRl9EVywgQlBGX1JFR18xLCAwLCAwKSxcbitcdFx0QlBGX0VYSVRfSU5TTigpLFxuK1x0fTtcbitcdGNoYXIgbG9nX2J1ZlsyNTZdID0ge307XG4rXHRpbnQgbWFwX2ZkLCBwcm9nX2ZkO1xuK1xuK1x0cHJvZ19vcHRzLmxvZ19idWYgPSBsb2dfYnVmO1xuK1x0cHJvZ19vcHRzLmxvZ19zaXplID0gc2l6ZW9mKGxvZ19idWYpO1xuK1x0cHJvZ19vcHRzLmxvZ19sZXZlbCA9IDE7XG4rXG4rXHRtYXBfZmQgPSBjcmVhdGVfcmRvbmx5X3BlcmNwdV9hcnJheSgpO1xuK1x0aWYgKG1hcF9mZCBcdTAwM2MgMClcbitcdFx0cmV0dXJuO1xuK1xuK1x0aW5zbnNbMF0uaW1tID0gbWFwX2ZkO1xuK1x0cHJvZ19mZCA9IGJwZl9wcm9nX2xvYWQoQlBGX1BST0dfVFlQRV9TT0NLRVRfRklMVEVSLCBcInBlcmNwdV9yb19wcm9nXCIsIFwiR1BMXCIsIGluc25zLFxuK1x0XHRcdFx0QVJSQVlfU0laRShpbnNucyksIFx1MDAyNnByb2dfb3B0cyk7XG4rXHRpZiAoIUFTU0VSVF9MVChwcm9nX2ZkLCAwLCBcImJwZl9wcm9nX2xvYWRcIikpXG4rXHRcdGNsb3NlKHByb2dfZmQpO1xuK1x0ZWxzZVxuK1x0XHRBU1NFUlRfSEFTX1NVQlNUUihsb2dfYnVmLCBcIndyaXRlIGludG8gbWFwIGZvcmJpZGRlblwiLCBcInZlcmlmaWVyIGxvZ1wiKTtcbitcdGNsb3NlKG1hcF9mZCk7XG4rfVxuK1xuK3N0YXRpYyB2b2lkIHRlc3RfZ2xvYmFsX3BlcmNwdV9kYXRhX3ZlcmlmaWVyX2xvZyh2b2lkKVxuK3tcbitcdFJVTl9URVNUUyh0ZXN0X2dsb2JhbF9wZXJjcHVfZGF0YSk7XG4rfVxuK1xuK3N0YXRpYyB2b2lkIHRlc3RfZ2xvYmFsX3BlcmNwdV9kYXRhX2l0ZXIodm9pZClcbit7XG4rXHRERUNMQVJFX0xJQkJQRl9PUFRTKGJwZl9pdGVyX2F0dGFjaF9vcHRzLCBvcHRzKTtcbitcdHN0cnVjdCB0ZXN0X2dsb2JhbF9wZXJjcHVfZGF0YSAqc2tlbDtcbitcdHVuaW9uIGJwZl9pdGVyX2xpbmtfaW5mbyBsaW5mbyA9IHt9O1xuK1x0c3RydWN0IGJwZl9saW5rICpsaW5rID0gTlVMTDtcbitcdGludCBmZCwgbnVtX2NwdXMsIGxlbiwgZXJyO1xuK1x0Y2hhciBidWZbMTZdO1xuK1xuK1x0bnVtX2NwdXMgPSBsaWJicGZfbnVtX3Bvc3NpYmxlX2NwdXMoKTtcbitcdGlmICghQVNTRVJUX0dUKG51bV9jcHVzLCAwLCBcImxpYmJwZl9udW1fcG9zc2libGVfY3B1c1wiKSlcbitcdFx0cmV0dXJuO1xuK1xuK1x0c2tlbCA9IHRlc3RfZ2xvYmFsX3BlcmNwdV9kYXRhX19vcGVuKCk7XG4rXHRpZiAoIUFTU0VSVF9PS19QVFIoc2tlbCwgXCJ0ZXN0X2dsb2JhbF9wZXJjcHVfZGF0YV9fb3BlblwiKSlcbitcdFx0cmV0dXJuO1xuK1xuK1x0c2tlbC1cdTAwM2Vyb2RhdGEtXHUwMDNlbnVtX2NwdXMgPSBudW1fY3B1cztcbitcdHNrZWwtXHUwMDNlcm9kYXRhLVx1MDAzZW9mZnNldG9mX251bSA9IG9mZnNldG9mKHN0cnVjdCB0ZXN0X2dsb2JhbF9wZXJjcHVfZGF0YV9fcGVyY3B1LCBzdHJ1Y3RfZGF0YSk7XG4rXHRza2VsLVx1MDAzZXJvZGF0YS1cdTAwM2VvZmZzZXRvZl9udW0gKz0gc2l6ZW9mKHNrZWwtXHUwMDNlcGVyY3B1LVx1MDAzZXN0cnVjdF9kYXRhKSAtIHNpemVvZihpbnQpO1xuK1x0c2tlbC1cdTAwM2Vyb2RhdGEtXHUwMDNlZWxlbV9zeiA9IHJvdW5kdXAoc2l6ZW9mKHN0cnVjdCB0ZXN0X2dsb2JhbF9wZXJjcHVfZGF0YV9fcGVyY3B1KSwgOCk7XG4rXHRza2VsLVx1MDAzZXBlcmNwdS1cdTAwM2VzdHJ1Y3RfZGF0YS5udW1zWzZdID0gMHhjMGRlO1xuK1xuK1x0ZXJyID0gdGVzdF9nbG9iYWxfcGVyY3B1X2RhdGFfX2xvYWQoc2tlbCk7XG4rXHRpZiAoIUFTU0VSVF9PSyhlcnIsIFwidGVzdF9nbG9iYWxfcGVyY3B1X2RhdGFfX2xvYWRcIikpXG4rXHRcdGdvdG8gb3V0O1xuK1xuK1x0bGluZm8ubWFwLm1hcF9mZCA9IGJwZl9tYXBfX2ZkKHNrZWwtXHUwMDNlbWFwcy5wZXJjcHUpO1xuK1x0b3B0cy5saW5rX2luZm8gPSBcdTAwMjZsaW5mbztcbitcdG9wdHMubGlua19pbmZvX2xlbiA9IHNpemVvZihsaW5mbyk7XG4rXHRsaW5rID0gYnBmX3Byb2dyYW1fX2F0dGFjaF9pdGVyKHNrZWwtXHUwMDNlcHJvZ3MuZHVtcF9wZXJjcHVfZGF0YSwgXHUwMDI2b3B0cyk7XG4rXHRpZiAoIUFTU0VSVF9PS19QVFIobGluaywgXCJicGZfcHJvZ3JhbV9fYXR0YWNoX2l0ZXJcIikpXG4rXHRcdGdvdG8gb3V0O1xuK1xuK1x0ZmQgPSBicGZfaXRlcl9jcmVhdGUoYnBmX2xpbmtfX2ZkKGxpbmspKTtcbitcdGlmICghQVNTRVJUX0dFKGZkLCAwLCBcImJwZl9pdGVyX2NyZWF0ZVwiKSlcbitcdFx0Z290byBvdXQ7XG4rXG4rXHR3aGlsZSAoKGxlbiA9IHJlYWQoZmQsIGJ1Ziwgc2l6ZW9mKGJ1ZikpKSBcdTAwM2UgMClcbitcdFx0ZG8geyB9IHdoaWxlICgwKTtcbitcdEFTU0VSVF9FUShsZW4sIDAsIFwicmVhZCBpdGVyXCIpO1xuK1x0QVNTRVJUX1RSVUUoc2tlbC1cdTAwM2Vic3MtXHUwMDNlcnVuX2l0ZXIsIFwicnVuX2l0ZXJcIik7XG4rXHRBU1NFUlRfRVEoc2tlbC1cdTAwM2Vic3MtXHUwMDNlcGVyY3B1X2RhdGFfc3VtLCAweGMwZGUgKiBudW1fY3B1cywgXCJwZXJjcHVfZGF0YV9zdW1cIik7XG4rXG4rXHRjbG9zZShmZCk7XG4rb3V0OlxuK1x0YnBmX2xpbmtfX2Rlc3Ryb3kobGluayk7XG4rXHR0ZXN0X2dsb2JhbF9wZXJjcHVfZGF0YV9fZGVzdHJveShza2VsKTtcbit9XG4rXG4rdm9pZCB0ZXN0X2dsb2JhbF9wZXJjcHVfZGF0YSh2b2lkKVxuK3tcbitcdGlmICghZmVhdF9zdXBwb3J0ZWQoTlVMTCwgRkVBVF9QRVJDUFVfREFUQSkpIHtcbitcdFx0dGVzdF9fc2tpcCgpO1xuK1x0XHRyZXR1cm47XG4rXHR9XG4rXG4rXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcImluaXRcIikpXG4rXHRcdHRlc3RfZ2xvYmFsX3BlcmNwdV9kYXRhX2luaXQoKTtcbitcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwibHNrZWxcIikpXG4rXHRcdHRlc3RfZ2xvYmFsX3BlcmNwdV9kYXRhX2xza2VsKCk7XG4rXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcInJkb25seV9kaXJlY3RfcmVhZFwiKSlcbitcdFx0dGVzdF9nbG9iYWxfcGVyY3B1X2RhdGFfcmRvbmx5X2RpcmVjdF9yZWFkKCk7XG4rXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcInJkb25seV9kaXJlY3Rfd3JpdGVcIikpXG4rXHRcdHRlc3RfZ2xvYmFsX3BlcmNwdV9kYXRhX3Jkb25seV9kaXJlY3Rfd3JpdGUoKTtcbitcdHRlc3RfZ2xvYmFsX3BlcmNwdV9kYXRhX3ZlcmlmaWVyX2xvZygpO1xuK1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCJpdGVyXCIpKVxuK1x0XHR0ZXN0X2dsb2JhbF9wZXJjcHVfZGF0YV9pdGVyKCk7XG4rfVxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2dsb2JhbF9wZXJjcHVfc3Vic2tlbC5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvZ2xvYmFsX3BlcmNwdV9zdWJza2VsLmNcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwMC4uOGFlYmQ1MzNkODZiNTRcbi0tLSAvZGV2L251bGxcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2dsb2JhbF9wZXJjcHVfc3Vic2tlbC5jXG5AQCAtMCwwICsxLDM3IEBAXG4rLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcbisjaW5jbHVkZSBcdTAwM2N0ZXN0X3Byb2dzLmhcdTAwM2VcbisjaW5jbHVkZSBcInRlc3RfZ2xvYmFsX3BlcmNwdV9kYXRhLnN1YnNrZWwuaFwiXG4rXG4rdm9pZCB0ZXN0X2dsb2JhbF9wZXJjcHVfZGF0YV9zdWJza2VsKHZvaWQpXG4re1xuK1x0c3RydWN0IHRlc3RfZ2xvYmFsX3BlcmNwdV9kYXRhICpzdWJza2VsID0gTlVMTDtcbitcdHN0cnVjdCBicGZfb2JqZWN0ICpvYmo7XG4rXHRpbnQgaTtcbitcbitcdG9iaiA9IGJwZl9vYmplY3RfX29wZW5fZmlsZShcIi4vdGVzdF9nbG9iYWxfcGVyY3B1X2RhdGEuYnBmLm9cIiwgTlVMTCk7XG4rXHRpZiAoIUFTU0VSVF9PS19QVFIob2JqLCBcImJwZl9vYmplY3RfX29wZW5fZmlsZVwiKSlcbitcdFx0cmV0dXJuO1xuK1xuK1x0c3Vic2tlbCA9IHRlc3RfZ2xvYmFsX3BlcmNwdV9kYXRhX19vcGVuKG9iaik7XG4rXHRpZiAoIUFTU0VSVF9PS19QVFIoc3Vic2tlbCwgXCJ0ZXN0X2dsb2JhbF9wZXJjcHVfZGF0YV9fb3BlblwiKSlcbitcdFx0Z290byBvdXQ7XG4rXG4rXHRpZiAoIUFTU0VSVF9PS19QVFIoc3Vic2tlbC1cdTAwM2VzdWJza2VsLCBcInN1YnNrZWxcIikpXG4rXHRcdGdvdG8gb3V0O1xuK1x0aWYgKCFBU1NFUlRfT0tfUFRSKHN1YnNrZWwtXHUwMDNlbWFwcy5wZXJjcHUsIFwibWFwcy5wZXJjcHVcIikpXG4rXHRcdGdvdG8gb3V0O1xuK1x0QVNTRVJUX0VRKGJwZl9tYXBfX3R5cGUoc3Vic2tlbC1cdTAwM2VtYXBzLnBlcmNwdSksIEJQRl9NQVBfVFlQRV9QRVJDUFVfQVJSQVksXG4rXHRcdCAgXCJwZXJjcHVfbWFwX3R5cGVcIik7XG4rXHRBU1NFUlRfR1Qoc3Vic2tlbC1cdTAwM2VzdWJza2VsLVx1MDAzZXZhcl9jbnQsIDAsIFwidmFyX2NudFwiKTtcbitcbitcdGZvciAoaSA9IDA7IGkgXHUwMDNjIHN1YnNrZWwtXHUwMDNlc3Vic2tlbC1cdTAwM2V2YXJfY250OyBpKyspIHtcbitcdFx0Y29uc3Qgc3RydWN0IGJwZl92YXJfc2tlbGV0b24gKnZhcjtcbitcbitcdFx0dmFyID0gKHZvaWQgKikgc3Vic2tlbC1cdTAwM2VzdWJza2VsLVx1MDAzZXZhcnMgKyBpICogc3Vic2tlbC1cdTAwM2VzdWJza2VsLVx1MDAzZXZhcl9za2VsX3N6O1xuK1x0XHRBU1NFUlRfTkVRKHZhci1cdTAwM2VtYXAsIFx1MDAyNnN1YnNrZWwtXHUwMDNlbWFwcy5wZXJjcHUsIFwidmFyXCIpO1xuK1x0fVxuK1xuK291dDpcbitcdHRlc3RfZ2xvYmFsX3BlcmNwdV9kYXRhX19kZXN0cm95KHN1YnNrZWwpO1xuK1x0YnBmX29iamVjdF9fY2xvc2Uob2JqKTtcbit9XG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL3Rlc3RfZ2xvYmFsX3BlcmNwdV9kYXRhLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvdGVzdF9nbG9iYWxfcGVyY3B1X2RhdGEuY1xubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAwLi5lZWY4OGZkNjFhZjUxMVxuLS0tIC9kZXYvbnVsbFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL3Rlc3RfZ2xvYmFsX3BlcmNwdV9kYXRhLmNcbkBAIC0wLDAgKzEsNzkgQEBcbisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxuKyNpbmNsdWRlIFx1MDAzY3ZtbGludXguaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2JwZi9icGZfaGVscGVycy5oXHUwMDNlXG4rI2luY2x1ZGUgXCJicGZfbWlzYy5oXCJcbitcbitpbnQgZGF0YSBTRUMoXCIucGVyY3B1XCIpID0gLTE7XG4raW50IG51bXNbN10gU0VDKFwiLnBlcmNwdVwiKTtcbitjaGFyIHJ1biBTRUMoXCIucGVyY3B1XCIpID0gMDtcbitzdHJ1Y3Qge1xuK1x0Y2hhciBzZXQ7XG4rXHRpbnQgaTtcbitcdGludCBudW1zWzddO1xuK30gc3RydWN0X2RhdGEgU0VDKFwiLnBlcmNwdVwiKSA9IHtcbitcdC5zZXQgPSAwLFxuK1x0LmkgPSAtMSxcbit9O1xuK1xuK1NFQyhcInJhd190cC90YXNrX3JlbmFtZVwiKVxuK19fYXV4aWxpYXJ5XG4raW50IHVwZGF0ZV9wZXJjcHVfZGF0YSh2b2lkICpjdHgpXG4re1xuK1x0c3RydWN0X2RhdGEubnVtc1s2XSA9IDB4YzBkZTtcbitcdHN0cnVjdF9kYXRhLnNldCA9IDE7XG4rXHRzdHJ1Y3RfZGF0YS5pID0gMTtcbitcdG51bXNbNl0gPSAweGMwZGU7XG4rXHRkYXRhID0gMTtcbitcdHJ1biA9IDE7XG4rXHRyZXR1cm4gMDtcbit9XG4rXG4rc3RhdGljIGNvbnN0IGNoYXIgZm10W10gU0VDKFwiLnBlcmNwdS5mbXRcIikgPSBcImRhdGEgJWRcXG5cIjtcbitcbitTRUMoXCI/a3Byb2JlXCIpXG4rX19mYWlsdXJlIF9fbXNnKFwiUnt7WzAtOV0rfX0gcG9pbnRzIHRvIHBlcmNwdV9hcnJheSBtYXAgd2hpY2ggY2Fubm90IGJlIHVzZWQgYXMgY29uc3Qgc3RyaW5nXCIpXG4raW50IHZlcmlmaWVyX3N0cm5jbXAodm9pZCAqY3R4KVxuK3tcbitcdHJldHVybiBicGZfc3RybmNtcChcInRlc3RcIiwgNSwgZm10KTtcbit9XG4rXG4rU0VDKFwiP2twcm9iZVwiKVxuK19fZmFpbHVyZSBfX21zZyhcIlJ7e1swLTldK319IHBvaW50cyB0byBwZXJjcHVfYXJyYXkgbWFwIHdoaWNoIGNhbm5vdCBiZSB1c2VkIGFzIGNvbnN0IHN0cmluZ1wiKVxuK2ludCB2ZXJpZmllcl9zbnByaW50Zih2b2lkICpjdHgpXG4re1xuK1x0dTY0IGFyZ3NbXSA9IHsgZGF0YSB9O1xuK1x0Y2hhciBidWZbMTI4XTtcbitcdGludCBsZW47XG4rXG4rXHRsZW4gPSBicGZfc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgZm10LCBhcmdzLCBzaXplb2YoYXJncykpO1xuK1x0aWYgKGxlbiBcdTAwM2UgMClcbitcdFx0YnBmX3ByaW50ayhcInNucHJpbnRmOiAlc1xcblwiLCBidWYpO1xuK1x0cmV0dXJuIDA7XG4rfVxuK1xuK3ZvbGF0aWxlIGNvbnN0IF9fdTMyIG51bV9jcHVzID0gMDtcbit2b2xhdGlsZSBjb25zdCBpbnQgb2Zmc2V0b2ZfbnVtO1xuK3ZvbGF0aWxlIGNvbnN0IGludCBlbGVtX3N6O1xuK19fdTMyIHBlcmNwdV9kYXRhX3N1bSA9IDA7XG4rYm9vbCBydW5faXRlciA9IGZhbHNlO1xuK1xuK1NFQyhcIml0ZXIvYnBmX21hcF9lbGVtXCIpXG4rX19hdXhpbGlhcnlcbitpbnQgZHVtcF9wZXJjcHVfZGF0YShzdHJ1Y3QgYnBmX2l0ZXJfX2JwZl9tYXBfZWxlbSAqY3R4KVxuK3tcbitcdHZvaWQgKnBwdHIgPSBjdHgtXHUwMDNldmFsdWU7XG4rXHRpbnQgaTtcbitcbitcdGlmICghcHB0cilcbitcdFx0cmV0dXJuIDA7XG4rXG4rXHRydW5faXRlciA9IHRydWU7XG4rXG4rXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBudW1fY3B1czsgaSsrKSB7XG4rXHRcdHBlcmNwdV9kYXRhX3N1bSArPSAqKGludCAqKSAocHB0ciArIG9mZnNldG9mX251bSk7XG4rXHRcdHBwdHIgKz0gZWxlbV9zejtcbitcdH1cbitcdHJldHVybiAwO1xuK31cbitcbitjaGFyIF9saWNlbnNlW10gU0VDKFwibGljZW5zZVwiKSA9IFwiR1BMXCI7XG4iLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wNi0yOVQxNjozOTozMS43MTk3MDQ4NjNaIiwiU2VxIjozLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjoxNjQ2MjczMzA0MiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipNeSBCUEYgUGVyLUNQVSBNYXAgSW1wbGVtZW50YXRpb24gQXNzZXNzbWVudCoqXG5cbk9rYXksIHNvIEknbSBsb29raW5nIGF0IHRoaXMgcGF0Y2ggaW50cm9kdWNpbmcgYC5wZXJjcHVgIG1hcCBzdXBwb3J0IHdpdGhpbiBCUEYsIGFuZCBteSBpbml0aWFsIHRob3VnaHQgaXMsIFwiVGhpcyBpcyBhIHByZXR0eSBzaWduaWZpY2FudCBhZGRpdGlvbi5cIiBJdCB0b3VjaGVzIHNldmVyYWwga2V5IGZpbGVzLCBzcGVjaWZpY2FsbHkgYGFycmF5bWFwLmNgLCBgY29uc3RfZm9sZC5jYCwgYGZpeHVwcy5jYCwgYW5kIHRoZSB2ZXJpZmllciwgc28gd2UncmUgdGFsa2luZyBhYm91dCBhIGZhaXIgYW1vdW50IG9mIHVuZGVybHlpbmcgbWVjaGFuaXNtIGNoYW5nZXMuIEkgc2VlIHRoYXQgaXQgaW50cm9kdWNlcyBgQlBGX01BUF9UWVBFX1BFUkNQVV9BUlJBWWAgYXMgYSBuZXcgbWFwIHR5cGUsIHdoaWNoIGFsbG93cyBmb3IgYC5wZXJjcHVgIHNlY3Rpb25zIHRvIGJlIHVzZWQgYW5kIHRyYW5zbGF0ZWQuIFRoYXQgc2VlbXMgY2xlYW4gZW5vdWdoLiBTcGVjaWZpY2FsbHksIGl0IHNlZW1zIGl0IGludHJvZHVjZXMgbmV3IGZ1bmN0aW9ucyBgcGVyY3B1X2FycmF5X21hcF9kaXJlY3RfdmFsdWVfYWRkcmAgYW5kIGBwZXJjcHVfYXJyYXlfbWFwX2RpcmVjdF92YWx1ZV9tZXRhYCB3aXRoaW4gYHBlcmNwdV9hcnJheV9tYXBfb3BzYCwgd2hpY2ggYXJlIGNyaXRpY2FsIGFkZGl0aW9ucy5cblxuVGhlIGNydWNpYWwgYXNwZWN0IHNlZW1zIHRvIGJlIGhvdyBpdCBoYW5kbGVzIHRoZSBpbnN0cnVjdGlvbiBmaXh1cHMuIE1vZGlmeWluZyBgYnBmX2RvX21pc2NfZml4dXBzYCB0byBwYXRjaCBgQlBGX0xEIHwgQlBGX0lNTSB8IEJQRl9EV2AgaW5zdHJ1Y3Rpb25zIHRoYXQgbG9hZCBmcm9tIHRoZSBwZXJjcHUgYXJyYXkgdG8gdXNlIGBCUEZfTU9WNjRfUEVSQ1BVX1JFR2AgaXMgZ29pbmcgdG8gYmUgYSBmb2N1cy4gVGhpcyBpcyBhIGZ1bmN0aW9uYWwgY2hhbmdlLCBhbmQgZ2l2ZW4gaXRzIHNjb3BlLCBpdCdzIGRlZmluaXRlbHkgYSBjYW5kaWRhdGUgZm9yIHRob3JvdWdoIGZ1enppbmcuXG5cbk5vdywgbGV0J3MgbmFpbCBkb3duIHRoZSBjb25maWd1cmF0aW9uIGRlcGVuZGVuY2llcy4gYENPTkZJR19CUEZfU1lTQ0FMTGAgaXMgYSBnaXZlbiwgb2YgY291cnNlLiBTaW5jZSB3ZSdyZSBkZWFsaW5nIHdpdGggcGVyY3B1IGRhdGEsIGFuZCBJIG5lZWQgdGhlIEpJVCBmb3IgcGVyZm9ybWFuY2UsIEknbGwgbmVlZCBgQ09ORklHX0JQRl9KSVRgIGFzIHdlbGwuXG5cbk1vdmluZyBvbnRvIHRoZSBzeW1ib2xzLCBJJ20gZ29pbmcgdG8gd2FudCB0byB0cmFjayB0aGVzZSBzcGVjaWZpY2FsbHk6XG4qICAgYHBlcmNwdV9hcnJheV9tYXBfZGlyZWN0X3ZhbHVlX2FkZHJgXG4qICAgYHBlcmNwdV9hcnJheV9tYXBfZGlyZWN0X3ZhbHVlX21ldGFgXG4qICAgYGJwZl9kb19taXNjX2ZpeHVwc2AgKGFsdGhvdWdoIHRoaXMgaXMgYSBtb3JlIGdlbmVyaWMgZnVuY3Rpb24sIHRoZSBwYXRjaCBzcGVjaWZpY2FsbHkgdGFyZ2V0cyBhIG5ldyBicmFuY2ggaGVyZSwgc28gaXQgaXMgaGlnaC1wcmlvcml0eSlcbiogICBgYXJyYXlfbWFwX2NoZWNrX2J0ZmAgKG1vZGlmaWVkKVxuKiAgIGBjaGVja19hbmRfcmVzb2x2ZV9pbnNuc2AgKG1vZGlmaWVkKVxuXG5JJ2xsIGNoZWNrIHRoZSBkZWZpbml0aW9uIG9mIGBicGZfaml0X3N1cHBvcnRzX3BlcmNwdV9pbnNuYC4gSSdsbCB1c2UgYGdyZXBwZXJgIHRvIGRldGVybWluZSB0aGUgc3BlY2lmaWMgYXJjaGl0ZWN0dXJlcyB0aGF0IGFjdHVhbGx5IHN1cHBvcnQgdGhpcy4gVGhpcyB3aWxsIGluZm9ybSBteSBmdXp6aW5nIHRhcmdldCBsaXN0LlxuXG5cbiIsIklucHV0VG9rZW5zIjoxODc1OCwiT3V0cHV0VG9rZW5zIjoyNiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjQ1MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA2LTI5VDE2OjM5OjQ4LjE4MjQ0MjAyNVoiLCJTZXEiOjQsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjozMjgwNzE2NjQ1LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImJwZl9qaXRfc3VwcG9ydHNfcGVyY3B1X2luc25cIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiYXJjaC9hcm02NC9uZXQvYnBmX2ppdF9jb21wLmM9MzE3MT1ib29sIGJwZl9qaXRfc3VwcG9ydHNfaW5zbihzdHJ1Y3QgYnBmX2luc24gKmluc24sIGJvb2wgaW5fYXJlbmEpXFxuLS1cXG5hcmNoL2FybTY0L25ldC9icGZfaml0X2NvbXAuYy0zMTg0LVxcbmFyY2gvYXJtNjQvbmV0L2JwZl9qaXRfY29tcC5jOjMxODU6Ym9vbCBicGZfaml0X3N1cHBvcnRzX3BlcmNwdV9pbnNuKHZvaWQpXFxuYXJjaC9hcm02NC9uZXQvYnBmX2ppdF9jb21wLmMtMzE4Ni17XFxuLS1cXG5hcmNoL3Bvd2VycGMvbmV0L2JwZl9qaXRfY29tcC5jPTU1Nj1ib29sIGJwZl9qaXRfc3VwcG9ydHNfaW5zbihzdHJ1Y3QgYnBmX2luc24gKmluc24sIGJvb2wgaW5fYXJlbmEpXFxuLS1cXG5hcmNoL3Bvd2VycGMvbmV0L2JwZl9qaXRfY29tcC5jLTU3MS1cXG5hcmNoL3Bvd2VycGMvbmV0L2JwZl9qaXRfY29tcC5jOjU3Mjpib29sIGJwZl9qaXRfc3VwcG9ydHNfcGVyY3B1X2luc24odm9pZClcXG5hcmNoL3Bvd2VycGMvbmV0L2JwZl9qaXRfY29tcC5jLTU3My17XFxuLS1cXG5hcmNoL3Jpc2N2L25ldC9icGZfaml0X2NvbXA2NC5jPTIxMjA9Ym9vbCBicGZfaml0X3N1cHBvcnRzX2luc24oc3RydWN0IGJwZl9pbnNuICppbnNuLCBib29sIGluX2FyZW5hKVxcbi0tXFxuYXJjaC9yaXNjdi9uZXQvYnBmX2ppdF9jb21wNjQuYy0yMTM4LVxcbmFyY2gvcmlzY3YvbmV0L2JwZl9qaXRfY29tcDY0LmM6MjEzOTpib29sIGJwZl9qaXRfc3VwcG9ydHNfcGVyY3B1X2luc24odm9pZClcXG5hcmNoL3Jpc2N2L25ldC9icGZfaml0X2NvbXA2NC5jLTIxNDAte1xcbi0tXFxuYXJjaC94ODYvbmV0L2JwZl9qaXRfY29tcC5jPTQwNjA9Ym9vbCBicGZfaml0X3N1cHBvcnRzX3N1YnByb2dfdGFpbGNhbGxzKHZvaWQpXFxuLS1cXG5hcmNoL3g4Ni9uZXQvYnBmX2ppdF9jb21wLmMtNDA2NC1cXG5hcmNoL3g4Ni9uZXQvYnBmX2ppdF9jb21wLmM6NDA2NTpib29sIGJwZl9qaXRfc3VwcG9ydHNfcGVyY3B1X2luc24odm9pZClcXG5hcmNoL3g4Ni9uZXQvYnBmX2ppdF9jb21wLmMtNDA2Ni17XFxuLS1cXG5pbmNsdWRlL2xpbnV4L2ZpbHRlci5oPTExODE9Ym9vbCBicGZfaml0X3N1cHBvcnRzX3N1YnByb2dfdGFpbGNhbGxzKHZvaWQpO1xcbmluY2x1ZGUvbGludXgvZmlsdGVyLmg6MTE4Mjpib29sIGJwZl9qaXRfc3VwcG9ydHNfcGVyY3B1X2luc24odm9pZCk7XFxuaW5jbHVkZS9saW51eC9maWx0ZXIuaC0xMTgzLWJvb2wgYnBmX2ppdF9zdXBwb3J0c19rZnVuY19jYWxsKHZvaWQpO1xcbi0tXFxua2VybmVsL2JwZi9hcnJheW1hcC5jPTI2Mj1zdGF0aWMgaW50IHBlcmNwdV9hcnJheV9tYXBfZGlyZWN0X3ZhbHVlX2FkZHIoY29uc3Qgc3RydWN0IGJwZl9tYXAgKm1hcCwgdTY0ICppbW0sIHUzMiBvZmYpXFxuLS1cXG5rZXJuZWwvYnBmL2FycmF5bWFwLmMtMjY5LVxcdFxcdHJldHVybiAtRUlOVkFMO1xcbmtlcm5lbC9icGYvYXJyYXltYXAuYzoyNzA6XFx0aWYgKCFicGZfaml0X3N1cHBvcnRzX3BlcmNwdV9pbnNuKCkpXFxua2VybmVsL2JwZi9hcnJheW1hcC5jLTI3MS1cXHRcXHRyZXR1cm4gLUVPUE5PVFNVUFA7XFxuLS1cXG5rZXJuZWwvYnBmL2FycmF5bWFwLmM9Mjc3PXN0YXRpYyBpbnQgcGVyY3B1X2FycmF5X21hcF9kaXJlY3RfdmFsdWVfbWV0YShjb25zdCBzdHJ1Y3QgYnBmX21hcCAqbWFwLCB1NjQgaW1tLCB1MzIgKm9mZilcXG4tLVxcbmtlcm5lbC9icGYvYXJyYXltYXAuYy0yODUtXFx0XFx0cmV0dXJuIC1FTk9FTlQ7XFxua2VybmVsL2JwZi9hcnJheW1hcC5jOjI4NjpcXHRpZiAoIWJwZl9qaXRfc3VwcG9ydHNfcGVyY3B1X2luc24oKSlcXG5rZXJuZWwvYnBmL2FycmF5bWFwLmMtMjg3LVxcdFxcdHJldHVybiAtRU9QTk9UU1VQUDtcXG4tLVxcbmtlcm5lbC9icGYvYXJyYXltYXAuYz0yOTQ9c3RhdGljIGludCBwZXJjcHVfYXJyYXlfbWFwX2dlbl9sb29rdXAoc3RydWN0IGJwZl9tYXAgKm1hcCwgc3RydWN0IGJwZl9pbnNuICppbnNuX2J1ZilcXG4tLVxcbmtlcm5lbC9icGYvYXJyYXltYXAuYy0yOTgtXFxua2VybmVsL2JwZi9hcnJheW1hcC5jOjI5OTpcXHRpZiAoIWJwZl9qaXRfc3VwcG9ydHNfcGVyY3B1X2luc24oKSlcXG5rZXJuZWwvYnBmL2FycmF5bWFwLmMtMzAwLVxcdFxcdHJldHVybiAtRU9QTk9UU1VQUDtcXG4tLVxcbmtlcm5lbC9icGYvY29yZS5jPTMyMjY9Ym9vbCBfX3dlYWsgYnBmX2ppdF9zdXBwb3J0c19zdWJwcm9nX3RhaWxjYWxscyh2b2lkKVxcbi0tXFxua2VybmVsL2JwZi9jb3JlLmMtMzIzMC1cXG5rZXJuZWwvYnBmL2NvcmUuYzozMjMxOmJvb2wgX193ZWFrIGJwZl9qaXRfc3VwcG9ydHNfcGVyY3B1X2luc24odm9pZClcXG5rZXJuZWwvYnBmL2NvcmUuYy0zMjMyLXtcXG4tLVxcbmtlcm5lbC9icGYvZml4dXBzLmM9MTQ4MT1pbnQgYnBmX2RvX21pc2NfZml4dXBzKHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYpXFxuLS1cXG5rZXJuZWwvYnBmL2ZpeHVwcy5jLTE4MjItXFx0XFx0aWYgKGVudi1cXHUwMDNlcHJvZy1cXHUwMDNlaml0X3JlcXVlc3RlZCBcXHUwMDI2XFx1MDAyNlxcbmtlcm5lbC9icGYvZml4dXBzLmM6MTgyMzpcXHRcXHQgICAgYnBmX2ppdF9zdXBwb3J0c19wZXJjcHVfaW5zbigpIFxcdTAwMjZcXHUwMDI2XFxua2VybmVsL2JwZi9maXh1cHMuYy0xODI0LVxcdFxcdCAgICBpbnNuLVxcdTAwM2Vjb2RlID09IChCUEZfTEQgfCBCUEZfSU1NIHwgQlBGX0RXKSBcXHUwMDI2XFx1MDAyNlxcbi0tXFxua2VybmVsL2JwZi9oYXNodGFiLmM9MjQxNT1zdGF0aWMgaW50IGh0YWJfcGVyY3B1X21hcF9nZW5fbG9va3VwKHN0cnVjdCBicGZfbWFwICptYXAsIHN0cnVjdCBicGZfaW5zbiAqaW5zbl9idWYpXFxuLS1cXG5rZXJuZWwvYnBmL2hhc2h0YWIuYy0yNDE4LVxcbmtlcm5lbC9icGYvaGFzaHRhYi5jOjI0MTk6XFx0aWYgKCFicGZfaml0X3N1cHBvcnRzX3BlcmNwdV9pbnNuKCkpXFxua2VybmVsL2JwZi9oYXNodGFiLmMtMjQyMC1cXHRcXHRyZXR1cm4gLUVPUE5PVFNVUFA7XFxuLS1cXG5rZXJuZWwvYnBmL3ZlcmlmaWVyLmM9MTY2NjM9Ym9vbCBicGZfdmVyaWZpZXJfaW5saW5lc19oZWxwZXJfY2FsbChzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52LCBzMzIgaW1tKVxcbi0tXFxua2VybmVsL2JwZi92ZXJpZmllci5jLTE2NjcxLSNlbmRpZlxcbmtlcm5lbC9icGYvdmVyaWZpZXIuYzoxNjY3MjpcXHRcXHRyZXR1cm4gZW52LVxcdTAwM2Vwcm9nLVxcdTAwM2VqaXRfcmVxdWVzdGVkIFxcdTAwMjZcXHUwMDI2IGJwZl9qaXRfc3VwcG9ydHNfcGVyY3B1X2luc24oKTtcXG5rZXJuZWwvYnBmL3ZlcmlmaWVyLmMtMTY2NzMtI2VuZGlmXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA2LTI5VDE2OjM5OjUxLjQ2MzE2ODQzWiIsIlNlcSI6NSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6OTc0MjEzOTk0MSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipNeSBBc3Nlc3NtZW50IG9mIHRoZSBCUEYgUGF0Y2gqKlxuXG5Pa2F5LCBsZXQncyBicmVhayB0aGlzIGRvd24uIFRoaXMgcGF0Y2ggaXMgY2xlYXJseSBzaWduaWZpY2FudCwgZm9jdXNpbmcgb24gZW5hYmxpbmcgZGlyZWN0IGFjY2VzcyB0byBgLnBlcmNwdWAgZGF0YSBtYXBzIHdpdGhpbiBCUEYuIFRoaXMgdHJhbnNsYXRlcyBzcGVjaWZpY2FsbHkgdG8gc3VwcG9ydGluZyBgQlBGX01BUF9UWVBFX1BFUkNQVV9BUlJBWWAuXG5cbk15IGluaXRpYWwgdGhvdWdodCBpcyB0byBpZGVudGlmeSB0aGUga2V5IGZ1bmN0aW9ucyBpbXBhY3RlZC4gSSBzZWUgdGhlIGFkZGl0aW9uIG9mIHR3byBuZXcgZnVuY3Rpb25zOiBgcGVyY3B1X2FycmF5X21hcF9kaXJlY3RfdmFsdWVfYWRkcmAgYW5kIGBwZXJjcHVfYXJyYXlfbWFwX2RpcmVjdF92YWx1ZV9tZXRhYC4gVGhlc2UgYXJlIHRoZSBjb3JlIG1hcCBvcGVyYXRpb25zIGZvciB0aGlzIG5ldyBjYXBhYmlsaXR5LlxuXG5JdCdzIGFsc28gbW9kaWZ5aW5nIHNldmVyYWwgZXhpc3RpbmcgZnVuY3Rpb25zIHRvIGFjY29tbW9kYXRlIHRoaXMgbmV3IGZ1bmN0aW9uYWxpdHkuIEluaXRpYWxseSwgSSBub3RlZCBgYXJyYXlfbWFwX2NoZWNrX2J0ZmAsIGBicGZfZG9fbWlzY19maXh1cHNgLCBgYnBmX21hcF9kaXJlY3RfcmVhZGAsIGBjaGVja19tZW1fYWNjZXNzYCwgYGNoZWNrX2FyZ19jb25zdF9zdHJgLCBhbmQgYGNoZWNrX2FuZF9yZXNvbHZlX2luc25zYC4gSG93ZXZlciwgYGJwZl9kb19taXNjX2ZpeHVwc2AgYW5kIGBjaGVja19hbmRfcmVzb2x2ZV9pbnNuc2AgYXJlIHN1Y2ggaGVhdmlseSB1c2VkIHBhdGhzIGluIHRoZSB2ZXJpZmllciB0aGF0IEknbGwgc2ltcGxpZnkgdGhlIGZvY3VzIHRvIHRoZSBuZXcgZnVuY3Rpb25zLiBJIG5lZWQgdG8gYmUgZWZmaWNpZW50IHdpdGggbXkgdGltZSBhbmQgYXR0ZW50aW9uLiBJIGFtIG1ha2luZyB0aGUgZmluYWwgbGlzdCBvZiB0aGUgbmV3IGFuZCBpbXBhY3RlZCBmdW5jdGlvbnMgYHBlcmNwdV9hcnJheV9tYXBfZGlyZWN0X3ZhbHVlX2FkZHJgLCBgcGVyY3B1X2FycmF5X21hcF9kaXJlY3RfdmFsdWVfbWV0YWAsIGBicGZfbWFwX2RpcmVjdF9yZWFkYCwgYGNoZWNrX21lbV9hY2Nlc3NgLCBhbmQgYGNoZWNrX2FyZ19jb25zdF9zdHJgLlxuXG5DaGVja2luZyB0aGUgY29uZmlndXJhdGlvbnMsIGl0IGxvb2tzIGxpa2UgYENPTkZJR19CUEZfU1lTQ0FMTGAgaXMgc3RhbmRhcmQsIHdoaWNoIGlzIGV4cGVjdGVkLiBIb3dldmVyLCBgQ09ORklHX0JQRl9KSVRgIGlzIG5lY2Vzc2FyeSBmb3IgYGJwZl9qaXRfc3VwcG9ydHNfcGVyY3B1X2luc24oKWAuIFRoaXMgaW1wbGllcyB0aGF0IHRoZSBKSVQgY29tcGlsZXIgd2lsbCBuZWVkIHRvIGJlIHVwZGF0ZWQgdG8gaGFuZGxlIHRoZXNlIGAucGVyY3B1YCBhY2Nlc3Nlcy5cblxuR2l2ZW4gdGhlIGZ1bmN0aW9uYWwgbmF0dXJlIG9mIHRoZXNlIGNoYW5nZXMsIHRoZSBpbnRyb2R1Y3Rpb24gb2YgYC5wZXJjcHVgIHN1cHBvcnQsIGFuZCB0aGUgbW9kaWZpY2F0aW9ucyB0byB0aGUgQlBGIHZlcmlmaWVyIHRvIGhhbmRsZSBpdCwgdGhpcyBpcyBhIGNsZWFyIGNhbmRpZGF0ZSBmb3IgZnV6emluZy4gSSdsbCBuZWVkIHRvIGRldmVsb3AgZnV6eiB0YXJnZXRzIHRvIGNvdmVyIHRoZSBuZXcgY29kZSBwYXRocywgcGFydGljdWxhcmx5IGFyb3VuZCB0aGUgbWFwIG9wZXJhdGlvbnMgYW5kIHRoZSB2ZXJpZmllciBtb2RpZmljYXRpb25zLiBMZXQncyBjYWxsIGBzZXQtcmVzdWx0c2AuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjIxMjY1LCJPdXRwdXRUb2tlbnMiOjE3MywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjUzNCwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wNi0yOVQxNjo0MDowMS4yMDUzMTQ5ODFaIiwiU2VxIjo2LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJzZXQtcmVzdWx0cyIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjEzNzE4MTg5NiwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiQlBGX1NZU0NBTExcIixcbiAgICBcIkJQRl9KSVRcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJwZXJjcHVfYXJyYXlfbWFwX2RpcmVjdF92YWx1ZV9hZGRyXCIsXG4gICAgXCJwZXJjcHVfYXJyYXlfbWFwX2RpcmVjdF92YWx1ZV9tZXRhXCJcbiAgXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggaW50cm9kdWNlcyBzdXBwb3J0IGZvciBgLnBlcmNwdWAgZ2xvYmFsIGRhdGEgbWFwcyBpbiBCUEYsIHdoaWNoIHRyYW5zbGF0ZXMgdG8gYEJQRl9NQVBfVFlQRV9QRVJDUFVfQVJSQVlgLiBJdCBhZGRzIG5ldyBtYXAgb3BlcmF0aW9ucyBgbWFwX2RpcmVjdF92YWx1ZV9hZGRyYCBhbmQgYG1hcF9kaXJlY3RfdmFsdWVfbWV0YWAgZm9yIHBlcmNwdSBhcnJheXMsIGFuZCBtb2RpZmllcyB0aGUgdmVyaWZpZXIgdG8gaGFuZGxlIHBlcmNwdSBhcnJheSBhY2Nlc3NlcyBhbmQgcGF0Y2ggaW5zdHJ1Y3Rpb25zIGZvciBKSVQuIFRoaXMgaXMgYSBmdW5jdGlvbmFsIGNoYW5nZSBpbiB0aGUgY29yZSBCUEYgc3Vic3lzdGVtIGFuZCBzaG91bGQgYmUgZnV6emVkLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIkJQRl9TWVNDQUxMXCIsXG4gICAgXCJCUEZfSklUXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwicGVyY3B1X2FycmF5X21hcF9kaXJlY3RfdmFsdWVfYWRkclwiLFxuICAgIFwicGVyY3B1X2FycmF5X21hcF9kaXJlY3RfdmFsdWVfbWV0YVwiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGludHJvZHVjZXMgc3VwcG9ydCBmb3IgYC5wZXJjcHVgIGdsb2JhbCBkYXRhIG1hcHMgaW4gQlBGLCB3aGljaCB0cmFuc2xhdGVzIHRvIGBCUEZfTUFQX1RZUEVfUEVSQ1BVX0FSUkFZYC4gSXQgYWRkcyBuZXcgbWFwIG9wZXJhdGlvbnMgYG1hcF9kaXJlY3RfdmFsdWVfYWRkcmAgYW5kIGBtYXBfZGlyZWN0X3ZhbHVlX21ldGFgIGZvciBwZXJjcHUgYXJyYXlzLCBhbmQgbW9kaWZpZXMgdGhlIHZlcmlmaWVyIHRvIGhhbmRsZSBwZXJjcHUgYXJyYXkgYWNjZXNzZXMgYW5kIHBhdGNoIGluc3RydWN0aW9ucyBmb3IgSklULiBUaGlzIGlzIGEgZnVuY3Rpb25hbCBjaGFuZ2UgaW4gdGhlIGNvcmUgQlBGIHN1YnN5c3RlbSBhbmQgc2hvdWxkIGJlIGZ1enplZC5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9XTsKCQkJaWYgKCFyYXdEYXRhIHx8IHJhd0RhdGEubGVuZ3RoID09PSAwKSByZXR1cm47CgoJCQlkcmF3U3VtbWFyeVRhYmxlcyhyYXdEYXRhKTsKCQkJZHJhd0R1cmF0aW9uQ2hhcnQocmF3RGF0YSk7CgkJCWRyYXdUb2tlbkNvbnN1bXB0aW9uQ2hhcnQocmF3RGF0YSk7CgkJfQoKCQlmdW5jdGlvbiBkcmF3U3VtbWFyeVRhYmxlcyhyYXdEYXRhKSB7CgkJCWNvbnN0IHN0YXRzID0gewoJCQkJbGxtOiB7IGNvdW50OiAwLCB0b2tlbnM6IDAsIGR1cmF0aW9uOiAwIH0sCgkJCQl0b29sOiB7IGNvdW50OiAwLCBkdXJhdGlvbjogMCB9CgkJCX07CgoJCQlyYXdEYXRhLmZvckVhY2gocyA9PiB7CgkJCQljb25zdCBkdXIgPSBzLkR1cmF0aW9uIC8gMTAwMDAwMDAwMDsgCgkJCQlpZiAocy5UeXBlID09PSAibGxtIikgewoJCQkJCXN0YXRzLmxsbS5jb3VudCsrOwoJCQkJCXN0YXRzLmxsbS50b2tlbnMgKz0gKHMuSW5wdXRUb2tlbnMgKyBzLk91dHB1dFRva2VucyArIHMuT3V0cHV0VGhvdWdodHNUb2tlbnMpOwoJCQkJCXN0YXRzLmxsbS5kdXJhdGlvbiArPSBkdXI7CgkJCQl9IGVsc2UgaWYgKHMuVHlwZSA9PT0gInRvb2wiKSB7CgkJCQkJc3RhdHMudG9vbC5jb3VudCsrOwoJCQkJCXN0YXRzLnRvb2wuZHVyYXRpb24gKz0gZHVyOwoJCQkJfQoJCQl9KTsKCgkJCWNvbnN0IGF2Z0xsbUR1ciA9IHN0YXRzLmxsbS5jb3VudCA+IDAgPyAoc3RhdHMubGxtLmR1cmF0aW9uIC8gc3RhdHMubGxtLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCQkJY29uc3QgYXZnTGxtVG9rZW4gPSBzdGF0cy5sbG0uY291bnQgPiAwID8gKHN0YXRzLmxsbS50b2tlbnMgLyBzdGF0cy5sbG0uY291bnQpLnRvRml4ZWQoMikgOiAwOwoJCQljb25zdCBhdmdUb29sRHVyID0gc3RhdHMudG9vbC5jb3VudCA+IDAgPyAoc3RhdHMudG9vbC5kdXJhdGlvbiAvIHN0YXRzLnRvb2wuY291bnQpLnRvRml4ZWQoMikgOiAwOwoKCQkJY29uc3QgbGxtU3VtYXJ5Q2VsbHMgPSBbc3RhdHMubGxtLmNvdW50LCBzdGF0cy5sbG0udG9rZW5zLCBhdmdMbG1Ub2tlbiwgc3RhdHMubGxtLmR1cmF0aW9uLCBhdmdMbG1EdXJdOwoJCQljb25zdCB0b29sU3VtbWFyeUNlbGxzID0gW3N0YXRzLnRvb2wuY291bnQsIHN0YXRzLnRvb2wuZHVyYXRpb24sIGF2Z1Rvb2xEdXJdOwoKCQkJY29uc3QgbGxtU3VtbWFyeUJvZHkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGxtX3N1bW1hcnlfc3RhdHNfYm9keScpOwoJCQlsbG1TdW1tYXJ5Qm9keS5pbm5lckhUTUwgPSAiIjsKCQkJY29uc3QgbGxtVHIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0cicpOwoJCQlsbG1TdW1hcnlDZWxscy5mb3JFYWNoKGNlbGwgPT4gewoJCQkJY29uc3QgdGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZCcpOwoJCQkJdGQudGV4dENvbnRlbnQgPSBjZWxsOwoJCQkJbGxtVHIuYXBwZW5kQ2hpbGQodGQpOwoJCQl9KTsKCQkJbGxtU3VtbWFyeUJvZHkuYXBwZW5kQ2hpbGQobGxtVHIpOwoKCQkJY29uc3QgdG9vbFN1bW1hcnlCb2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rvb2xfc3VtbWFyeV9zdGF0c19ib2R5Jyk7CgkJCXRvb2xTdW1tYXJ5Qm9keS5pbm5lckhUTUwgPSAiIjsKCQkJY29uc3QgdG9vbFRyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndHInKTsKCQkJdG9vbFN1bW1hcnlDZWxscy5mb3JFYWNoKGNlbGwgPT4gewoJCQkJY29uc3QgdGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZCcpOwoJCQkJdGQudGV4dENvbnRlbnQgPSBjZWxsOwoJCQkJdG9vbFRyLmFwcGVuZENoaWxkKHRkKTsKCQkJfSk7CgkJCXRvb2xTdW1tYXJ5Qm9keS5hcHBlbmRDaGlsZCh0b29sVHIpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd0R1cmF0aW9uQ2hhcnQocmF3RGF0YSkgewoJCQljb25zdCBmaWx0ZXJlZFN0ZXBzID0gcmF3RGF0YS5maWx0ZXIoZCA9PiBbImxsbSIsICJ0b29sIl0uaW5jbHVkZXMoZC5UeXBlKSk7CgkJCWNvbnN0IGRhdGEgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uRGF0YVRhYmxlKCk7CgkJCWRhdGEuYWRkQ29sdW1uKCdzdHJpbmcnLCAnU3RlcCcpOwoJCQlkYXRhLmFkZENvbHVtbignbnVtYmVyJywgJ0R1cmF0aW9uJyk7CgkJCWRhdGEuYWRkQ29sdW1uKHt0eXBlOiAnc3RyaW5nJywgcm9sZTogJ3Rvb2x0aXAnfSk7IAoKCQkJZmlsdGVyZWRTdGVwcy5mb3JFYWNoKHMgPT4gewoJCQkJCgkJCQljb25zdCBkdXIgPSBzLkR1cmF0aW9uIC8gMTAwMDAwMDAwMDsKCQkJCWxldCB0b29sdGlwID0gcy5OYW1lOwoJCQkJaWYgKHMuVHlwZSA9PT0gImxsbSIgJiYgcy5Ub29sQ2FsbHMgJiYgcy5Ub29sQ2FsbHMubGVuZ3RoID4gMCkgewoJCQkJCXRvb2x0aXAgKz0gYFxuVG9vbHM6ICR7cy5Ub29sQ2FsbHMuam9pbignLCAnKX1gOwoJCQkJfQoJCQkJZGF0YS5hZGRSb3coW2Ake3MuU2VxfWAsIGR1ciwgdG9vbHRpcF0pOwoJCQl9KTsKCgkJCWNvbnN0IG9wdGlvbnMgPSB7CgkJCQl0aXRsZTogJ1RpbWUgQ29uc3VtcHRpb24gb2YgTExNL1Rvb2wgQ2FsbHMnLAoJCQkJaEF4aXM6IHsKCQkJCQl0aXRsZTogJ0xMTS9Ub29sIFN0ZXBzJywKCQkJCX0sCgkJCQl2QXhpczogeyB0aXRsZTogJ1NlY29uZHMnIH0sCgkJCQlsZWdlbmQ6IHsgcG9zaXRpb246ICdub25lJyB9LAoJCQkJYmFyOiB7IGdyb3VwV2lkdGg6ICc3NSUnIH0sCgkJCQljaGFydEFyZWE6IHsgd2lkdGg6ICc4NSUnLCBoZWlnaHQ6ICc3MCUnIH0sCgkJCQloZWlnaHQ6IDQwMAoJCQl9OwoKCQkJY29uc3QgY2hhcnQgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uQ29sdW1uQ2hhcnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2R1cmF0aW9uX2NoYXJ0X2RpdicpKTsKCQkJY2hhcnQuZHJhdyhkYXRhLCBvcHRpb25zKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdUb2tlbkNvbnN1bXB0aW9uQ2hhcnQocmF3RGF0YSkgewoJCQljb25zdCBsbG1TdGVwcyA9IHJhd0RhdGEuZmlsdGVyKGQgPT4gZC5UeXBlID09PSAibGxtIik7CgkJCWlmIChsbG1TdGVwcy5sZW5ndGggPT09IDApIHJldHVybjsKCgkJCWNvbnN0IGRhdGEgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uRGF0YVRhYmxlKCk7CgkJCWRhdGEuYWRkQ29sdW1uKCdzdHJpbmcnLCAnU3RlcCcpOwkJCQoJCQlkYXRhLmFkZENvbHVtbignbnVtYmVyJywgJ1Rva2VucycpOwkJCQoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICdzdHlsZSd9KTsJCgkJCWRhdGEuYWRkQ29sdW1uKHt0eXBlOiAnc3RyaW5nJywgcm9sZTogJ3Rvb2x0aXAnfSk7CQoKCQkJY29uc3QgYWdlbnRDb2xvcnMgPSB7fTsKCQkJY29uc3QgcGFsZXR0ZSA9IFsnIzQyODVGNCcsICcjREI0NDM3JywgJyNGNEI0MDAnLCAnIzBGOUQ1OCcsICcjQUI0N0JDJywgJyMwMEFDQzEnXTsKCQkJbGV0IGNvbG9ySWR4ID0gMDsKCQkJY29uc3QgYWdlbnRMTE1Db3VudHMgPSB7fTsKCQkJbGxtU3RlcHMuZm9yRWFjaChzID0+IHsKCQkJCWlmICghYWdlbnRDb2xvcnNbcy5OYW1lXSkgewoJCQkJCWFnZW50Q29sb3JzW3MuTmFtZV0gPSBwYWxldHRlW2NvbG9ySWR4ICUgcGFsZXR0ZS5sZW5ndGhdOwoJCQkJCWNvbG9ySWR4Kys7CgkJCQl9CgoJCQkJYWdlbnRMTE1Db3VudHNbcy5OYW1lXSA9IChhZ2VudExMTUNvdW50c1tzLk5hbWVdIHx8IDApICsgMTsKCQkJCWNvbnN0IGxhYmVsID0gYCR7cy5OYW1lfS0ke2FnZW50TExNQ291bnRzW3MuTmFtZV19YDsKCQkJCWNvbnN0IHRvdGFsVG9rZW5zID0gcy5JbnB1dFRva2VucyArIHMuT3V0cHV0VG9rZW5zICsgcy5PdXRwdXRUaG91Z2h0c1Rva2VuczsKCQkJCWNvbnN0IHN0eWxlID0gYGNvbG9yOiAke2FnZW50Q29sb3JzW3MuTmFtZV19YDsKCQkJCWxldCB0b29sdGlwID0gYFRvdGFsIFRva2VuczogJHt0b3RhbFRva2Vuc31cbihJbjogJHtzLklucHV0VG9rZW5zfSwgT3V0OiAke3MuT3V0cHV0VG9rZW5zfSwgVGhvdWdodHM6ICR7cy5PdXRwdXRUaG91Z2h0c1Rva2Vuc30pYDsKCQkJCWlmIChzLlRvb2xDYWxscyAmJiBzLlRvb2xDYWxscy5sZW5ndGggPiAwKSB7CgkJCQkJdG9vbHRpcCArPSBgXG5Ub29sczogJHtzLlRvb2xDYWxscy5qb2luKCcsICcpfWA7CgkJCQl9CgoJCQkJZGF0YS5hZGRSb3coW2xhYmVsLCB0b3RhbFRva2Vucywgc3R5bGUsIHRvb2x0aXBdKTsKCQkJfSk7CgoJCQljb25zdCBvcHRpb25zID0gewoJCQkJdGl0bGU6ICdUb2tlbiBDb25zdW1wdGlvbiBieSBMTE0gQ2FsbHMnLAoJCQkJaEF4aXM6IHsKCQkJCQl0aXRsZTogJ0xMTSBDYWxsIFNlcXVlbmNlJywKCQkJCX0sCgkJCQl2QXhpczogeyB0aXRsZTogJ0NvbnN1bWVkIFRva2VucycgfSwKCQkJCWxlZ2VuZDogeyBwb3NpdGlvbjogJ25vbmUnIH0sCgkJCQliYXI6IHsgZ3JvdXBXaWR0aDogJzc1JScgfSwKCQkJCWNoYXJ0QXJlYTogeyB3aWR0aDogJzg1JScsIGhlaWdodDogJzcwJScgfSwKCQkJCWhlaWdodDogNDAwCgkJCX07CgoJCQljb25zdCBjaGFydCA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5Db2x1bW5DaGFydChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG9rZW5fY2hhcnRfZGl2JykpOwoJCQljaGFydC5kcmF3KGRhdGEsIG9wdGlvbnMpOwoJCX0KCQlsZXQgYWxsRXhwYW5kZWQgPSBmYWxzZTsKCQlmdW5jdGlvbiB0b2dnbGVBbGxEZXRhaWxzKCkgewoJCQlhbGxFeHBhbmRlZCA9ICFhbGxFeHBhbmRlZDsKCQkJZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnZGV0YWlscycpLmZvckVhY2goZCA9PiB7CgkJCQlpZiAoYWxsRXhwYW5kZWQpIGQuc2V0QXR0cmlidXRlKCdvcGVuJywgJycpOwoJCQkJZWxzZSBkLnJlbW92ZUF0dHJpYnV0ZSgnb3BlbicpOwoJCQl9KTsKCQl9Cgk8L3NjcmlwdD4KCgo8L2JvZHk+CjwvaHRtbD4K" },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:nil,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,} --------- Name: series-workflowfntnl[0].run-triage(0) Phase: Succeeded StartedAt: 2026-06-29 16:20:33 +0000 UTC FinishedAt: 2026-06-29 16:40:03 +0000 UTC Input: nil Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "skip_reason": "", "targets": [ { "base": { "arch": "amd64", "tree_name": "bpf-next", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git", "commit_hash": "53435562a725962e4de0c29653223129ba11643a", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "BPF_SYSCALL", "BPF_JIT" ], "series_id": "" }, "patched": { "arch": "amd64", "tree_name": "bpf-next", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git", "commit_hash": "53435562a725962e4de0c29653223129ba11643a", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "BPF_SYSCALL", "BPF_JIT" ], "series_id": "441a2867-de39-4d18-beec-5c7a8e65f4f1" }, "track": "KASAN", "fuzz": { "focus": [ "bpf" ], "focus_symbols": [ "percpu_array_map_direct_value_addr", "percpu_array_map_direct_value_meta" ], "corpus_urls": [ "https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db" ], "skip_cover_check": false, "bug_title_re": "" }, "retest": null } ], "trajectory": "CjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KPGhlYWQ+Cgk8dGl0bGU+QUkgVHJhamVjdG9yeTwvdGl0bGU+Cgk8c3R5bGU+CgkJdGFibGUgewoJCQlib3JkZXI6IDFweCBzb2xpZCAjY2NjOwoJCQltYXJnaW46IDIwcHggNXB4OwoJCQlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwoJCQl3aGl0ZS1zcGFjZTogbm93cmFwOwoJCQl0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKCQkJb3ZlcmZsb3c6IGhpZGRlbjsKCQl9CgoJCXRhYmxlIGNhcHRpb24gewoJCQlmb250LXdlaWdodDogYm9sZDsKCQl9CgoJCXRhYmxlIHRkLCB0YWJsZSB0aCB7CgkJCXZlcnRpY2FsLWFsaWduOiB0b3A7CgkJCXBhZGRpbmc6IDJweCA4cHg7CgkJCXRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwoJCQlvdmVyZmxvdzogaGlkZGVuOwoJCX0KCgkJLmxpc3RfdGFibGUgdGQsIC5saXN0X3RhYmxlIHRoIHsKCQkJYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjY2NjOwoJCX0KCgkJLmxpc3RfdGFibGUgdGggewoJCQliYWNrZ3JvdW5kOiAjRjRGNEY0OwoJCX0KCgkJLmxpc3RfdGFibGUgdHI6bnRoLWNoaWxkKDJuKSB7CgkJCWJhY2tncm91bmQ6ICNGNEY0RjQ7CgkJfQoKCQkubGlzdF90YWJsZSB0cjpob3ZlciB7CgkJCWJhY2tncm91bmQ6ICNmZmZmOTk7CgkJfQoKCQkjYWlfZGV0YWlsc19kaXYgcHJlIHsKCQkJbWFyZ2luOiAxcHg7CgkJCW1heC13aWR0aDogMTIwY2g7CgkJCXdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKCQkJb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKCQl9Cgk8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PgoJPGgxPkFJIFRyYWplY3Rvcnk8L2gxPgoJPGJyPgoKCQoJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQk8Y2FwdGlvbj5UcmFqZWN0b3J5OiAoPGEgaHJlZj0iIyIgb25jbGljaz0idG9nZ2xlQWxsRGV0YWlscygpOyByZXR1cm4gZmFsc2U7Ij5FeHBhbmQvQ29sbGFwc2UgQWxsPC9hPik8L2NhcHRpb24+CgkJPHRoZWFkPjx0cj4KCQkJPHRoPlNlcTwvdGg+CgkJCTx0aD5UaW1lc3RhbXA8L3RoPgoJCQk8dGg+VHlwZTwvdGg+CgkJCTx0aD5OYW1lPC90aD4KCQkJPHRoPkR1cmF0aW9uPC90aD4KCQk8L3RyPjwvdGhlYWQ+CgkJPHRib2R5PgoJCQoJCTx0cj4KCQkJPHRkPjAvMDwvdGQ+CgkJCTx0ZD4yMDI2LzA2LzI5IDE2OjM5PC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0JQRl9TWVNDQUxMJiMzNDssCiAgICAmIzM0O0JQRl9KSVQmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDtwZXJjcHVfYXJyYXlfbWFwX2RpcmVjdF92YWx1ZV9hZGRyJiMzNDssCiAgICAmIzM0O3BlcmNwdV9hcnJheV9tYXBfZGlyZWN0X3ZhbHVlX21ldGEmIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggaW50cm9kdWNlcyBzdXBwb3J0IGZvciBgLnBlcmNwdWAgZ2xvYmFsIGRhdGEgbWFwcyBpbiBCUEYsIHdoaWNoIHRyYW5zbGF0ZXMgdG8gYEJQRl9NQVBfVFlQRV9QRVJDUFVfQVJSQVlgLiBJdCBhZGRzIG5ldyBtYXAgb3BlcmF0aW9ucyBgbWFwX2RpcmVjdF92YWx1ZV9hZGRyYCBhbmQgYG1hcF9kaXJlY3RfdmFsdWVfbWV0YWAgZm9yIHBlcmNwdSBhcnJheXMsIGFuZCBtb2RpZmllcyB0aGUgdmVyaWZpZXIgdG8gaGFuZGxlIHBlcmNwdSBhcnJheSBhY2Nlc3NlcyBhbmQgcGF0Y2ggaW5zdHJ1Y3Rpb25zIGZvciBKSVQuIFRoaXMgaXMgYSBmdW5jdGlvbmFsIGNoYW5nZSBpbiB0aGUgY29yZSBCUEYgc3Vic3lzdGVtIGFuZCBzaG91bGQgYmUgZnV6emVkLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA2LzI5IDE2OjM5PC90ZD4KCQkJPHRkPmFjdGlvbjwvdGQ+CgkJCTx0ZD5yZWFkLXBhdGNoLWRpZmY8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtQYXRjaERpZmYmIzM0OzogJiMzNDtjb21taXQgNmJmNzcxNDI3YjNjZDQ4NTJjOTcwZDZiNDRiM2MwMWJkMThjYTczMFxuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBNb24gSnVuIDI5IDE2OjM5OjI4IDIwMjYgJiM0MzswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL2tlcm5lbC9icGYvYXJyYXltYXAuYyBiL2tlcm5lbC9icGYvYXJyYXltYXAuY1xuaW5kZXggMjQ4YjQ4MTgxNzhjZDEuLmM0ZTk0MzA5NDFlNTQ5IDEwMDY0NFxuLS0tIGEva2VybmVsL2JwZi9hcnJheW1hcC5jXG4mIzQzOyYjNDM7JiM0MzsgYi9rZXJuZWwvYnBmL2FycmF5bWFwLmNcbkBAIC0yNTksNiAmIzQzOzI1OSwzNyBAQCBzdGF0aWMgdm9pZCAqcGVyY3B1X2FycmF5X21hcF9sb29rdXBfZWxlbShzdHJ1Y3QgYnBmX21hcCAqbWFwLCB2b2lkICprZXkpXG4gXHRyZXR1cm4gdGhpc19jcHVfcHRyKGFycmF5LVx1MDAzZXBwdHJzW2luZGV4IFx1MDAyNiBhcnJheS1cdTAwM2VpbmRleF9tYXNrXSk7XG4gfVxuIFxuJiM0MztzdGF0aWMgaW50IHBlcmNwdV9hcnJheV9tYXBfZGlyZWN0X3ZhbHVlX2FkZHIoY29uc3Qgc3RydWN0IGJwZl9tYXAgKm1hcCwgdTY0ICppbW0sIHUzMiBvZmYpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgYnBmX2FycmF5ICphcnJheSA9IGNvbnRhaW5lcl9vZihtYXAsIHN0cnVjdCBicGZfYXJyYXksIG1hcCk7XG4mIzQzO1xuJiM0MztcdGlmIChtYXAtXHUwMDNlbWF4X2VudHJpZXMgIT0gMSlcbiYjNDM7XHRcdHJldHVybiAtRU9QTk9UU1VQUDtcbiYjNDM7XHRpZiAob2ZmIFx1MDAzZT0gbWFwLVx1MDAzZXZhbHVlX3NpemUpXG4mIzQzO1x0XHRyZXR1cm4gLUVJTlZBTDtcbiYjNDM7XHRpZiAoIWJwZl9qaXRfc3VwcG9ydHNfcGVyY3B1X2luc24oKSlcbiYjNDM7XHRcdHJldHVybiAtRU9QTk9UU1VQUDtcbiYjNDM7XG4mIzQzO1x0KmltbSA9ICh1NjQpKF9fZm9yY2UgdW5zaWduZWQgbG9uZykgYXJyYXktXHUwMDNlcHB0cnNbMF07XG4mIzQzO1x0cmV0dXJuIDA7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBpbnQgcGVyY3B1X2FycmF5X21hcF9kaXJlY3RfdmFsdWVfbWV0YShjb25zdCBzdHJ1Y3QgYnBmX21hcCAqbWFwLCB1NjQgaW1tLCB1MzIgKm9mZilcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBicGZfYXJyYXkgKmFycmF5ID0gY29udGFpbmVyX29mKG1hcCwgc3RydWN0IGJwZl9hcnJheSwgbWFwKTtcbiYjNDM7XHR1NjQgYmFzZSA9ICh1NjQpKF9fZm9yY2UgdW5zaWduZWQgbG9uZykgYXJyYXktXHUwMDNlcHB0cnNbMF07XG4mIzQzO1xuJiM0MztcdGlmIChtYXAtXHUwMDNlbWF4X2VudHJpZXMgIT0gMSlcbiYjNDM7XHRcdHJldHVybiAtRU9QTk9UU1VQUDtcbiYjNDM7XHRpZiAoaW1tIFx1MDAzYyBiYXNlIHx8IGltbSBcdTAwM2U9IGJhc2UgJiM0MzsgYXJyYXktXHUwMDNlZWxlbV9zaXplKVxuJiM0MztcdFx0cmV0dXJuIC1FTk9FTlQ7XG4mIzQzO1x0aWYgKCFicGZfaml0X3N1cHBvcnRzX3BlcmNwdV9pbnNuKCkpXG4mIzQzO1x0XHRyZXR1cm4gLUVPUE5PVFNVUFA7XG4mIzQzO1xuJiM0MztcdCpvZmYgPSBpbW0gLSBiYXNlO1xuJiM0MztcdHJldHVybiAwO1xuJiM0Mzt9XG4mIzQzO1xuIC8qIGVtaXQgQlBGIGluc3RydWN0aW9ucyBlcXVpdmFsZW50IHRvIEMgY29kZSBvZiBwZXJjcHVfYXJyYXlfbWFwX2xvb2t1cF9lbGVtKCkgKi9cbiBzdGF0aWMgaW50IHBlcmNwdV9hcnJheV9tYXBfZ2VuX2xvb2t1cChzdHJ1Y3QgYnBmX21hcCAqbWFwLCBzdHJ1Y3QgYnBmX2luc24gKmluc25fYnVmKVxuIHtcbkBAIC01NTEsOSAmIzQzOzU4MiwxMCBAQCBzdGF0aWMgaW50IGFycmF5X21hcF9jaGVja19idGYoc3RydWN0IGJwZl9tYXAgKm1hcCxcbiBcdFx0XHQgICAgICAgY29uc3Qgc3RydWN0IGJ0Zl90eXBlICprZXlfdHlwZSxcbiBcdFx0XHQgICAgICAgY29uc3Qgc3RydWN0IGJ0Zl90eXBlICp2YWx1ZV90eXBlKVxuIHtcbi1cdC8qIE9uZSBleGNlcHRpb24gZm9yIGtleWxlc3MgQlRGOiAuYnNzLy5kYXRhLy5yb2RhdGEgbWFwICovXG4mIzQzO1x0LyogT25lIGV4Y2VwdGlvbiBmb3Iga2V5bGVzcyBCVEY6IC5ic3MvLmRhdGEvLnJvZGF0YS8ucGVyY3B1IG1hcCAqL1xuIFx0aWYgKGJ0Zl90eXBlX2lzX3ZvaWQoa2V5X3R5cGUpKSB7XG4tXHRcdGlmIChtYXAtXHUwMDNlbWFwX3R5cGUgIT0gQlBGX01BUF9UWVBFX0FSUkFZIHx8XG4mIzQzO1x0XHRpZiAoKG1hcC1cdTAwM2VtYXBfdHlwZSAhPSBCUEZfTUFQX1RZUEVfQVJSQVkgXHUwMDI2XHUwMDI2XG4mIzQzO1x0XHQgICAgIG1hcC1cdTAwM2VtYXBfdHlwZSAhPSBCUEZfTUFQX1RZUEVfUEVSQ1BVX0FSUkFZKSB8fFxuIFx0XHQgICAgbWFwLVx1MDAzZW1heF9lbnRyaWVzICE9IDEpXG4gXHRcdFx0cmV0dXJuIC1FSU5WQUw7XG4gXG5AQCAtODMyLDYgJiM0Mzs4NjQsOCBAQCBjb25zdCBzdHJ1Y3QgYnBmX21hcF9vcHMgcGVyY3B1X2FycmF5X21hcF9vcHMgPSB7XG4gXHQubWFwX2dldF9uZXh0X2tleSA9IGJwZl9hcnJheV9nZXRfbmV4dF9rZXksXG4gXHQubWFwX2xvb2t1cF9lbGVtID0gcGVyY3B1X2FycmF5X21hcF9sb29rdXBfZWxlbSxcbiBcdC5tYXBfZ2VuX2xvb2t1cCA9IHBlcmNwdV9hcnJheV9tYXBfZ2VuX2xvb2t1cCxcbiYjNDM7XHQubWFwX2RpcmVjdF92YWx1ZV9hZGRyID0gcGVyY3B1X2FycmF5X21hcF9kaXJlY3RfdmFsdWVfYWRkcixcbiYjNDM7XHQubWFwX2RpcmVjdF92YWx1ZV9tZXRhID0gcGVyY3B1X2FycmF5X21hcF9kaXJlY3RfdmFsdWVfbWV0YSxcbiBcdC5tYXBfdXBkYXRlX2VsZW0gPSBhcnJheV9tYXBfdXBkYXRlX2VsZW0sXG4gXHQubWFwX2RlbGV0ZV9lbGVtID0gYXJyYXlfbWFwX2RlbGV0ZV9lbGVtLFxuIFx0Lm1hcF9sb29rdXBfcGVyY3B1X2VsZW0gPSBwZXJjcHVfYXJyYXlfbWFwX2xvb2t1cF9wZXJjcHVfZWxlbSxcbmRpZmYgLS1naXQgYS9rZXJuZWwvYnBmL2NvbnN0X2ZvbGQuYyBiL2tlcm5lbC9icGYvY29uc3RfZm9sZC5jXG5pbmRleCBiMmExOWFjYWRiOTFlYy4uNTc4NzI0NmJlZjMwMTAgMTAwNjQ0XG4tLS0gYS9rZXJuZWwvYnBmL2NvbnN0X2ZvbGQuY1xuJiM0MzsmIzQzOyYjNDM7IGIva2VybmVsL2JwZi9jb25zdF9mb2xkLmNcbkBAIC0xODIsNyAmIzQzOzE4Miw2IEBAIHN0YXRpYyB2b2lkIGNvbnN0X3JlZ194ZmVyKHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsIHN0cnVjdCBjb25zdF9hcmdfaW5mbyAqXG4gXHRcdHU2NCB2YWwgPSAwO1xuIFxuIFx0XHRpZiAoIWJwZl9tYXBfaXNfcmRvbmx5KG1hcCkgfHwgIW1hcC1cdTAwM2VvcHMtXHUwMDNlbWFwX2RpcmVjdF92YWx1ZV9hZGRyIHx8XG4tXHRcdCAgICBtYXAtXHUwMDNlbWFwX3R5cGUgPT0gQlBGX01BUF9UWVBFX0lOU05fQVJSQVkgfHxcbiBcdFx0ICAgIG9mZiBcdTAwM2MgMCB8fCBvZmYgJiM0Mzsgc2l6ZSBcdTAwM2UgbWFwLVx1MDAzZXZhbHVlX3NpemUgfHxcbiBcdFx0ICAgIGJwZl9tYXBfZGlyZWN0X3JlYWQobWFwLCBvZmYsIHNpemUsIFx1MDAyNnZhbCwgaXNfbGRzeCkpIHtcbiBcdFx0XHQqZHN0ID0gdW5rbm93bjtcbmRpZmYgLS1naXQgYS9rZXJuZWwvYnBmL2ZpeHVwcy5jIGIva2VybmVsL2JwZi9maXh1cHMuY1xuaW5kZXggM2NmMmNjNmUzYWI2NmEuLjRmODRkMDg3Y2E2OWUzIDEwMDY0NFxuLS0tIGEva2VybmVsL2JwZi9maXh1cHMuY1xuJiM0MzsmIzQzOyYjNDM7IGIva2VybmVsL2JwZi9maXh1cHMuY1xuQEAgLTE4MTksNiAmIzQzOzE4MTksMzggQEAgaW50IGJwZl9kb19taXNjX2ZpeHVwcyhzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52KVxuIFx0XHRcdGdvdG8gbmV4dF9pbnNuO1xuIFx0XHR9XG4gXG4mIzQzO1x0XHRpZiAoZW52LVx1MDAzZXByb2ctXHUwMDNlaml0X3JlcXVlc3RlZCBcdTAwMjZcdTAwMjZcbiYjNDM7XHRcdCAgICBicGZfaml0X3N1cHBvcnRzX3BlcmNwdV9pbnNuKCkgXHUwMDI2XHUwMDI2XG4mIzQzO1x0XHQgICAgaW5zbi1cdTAwM2Vjb2RlID09IChCUEZfTEQgfCBCUEZfSU1NIHwgQlBGX0RXKSBcdTAwMjZcdTAwMjZcbiYjNDM7XHRcdCAgICAoaW5zbi1cdTAwM2VzcmNfcmVnID09IEJQRl9QU0VVRE9fTUFQX1ZBTFVFIHx8XG4mIzQzO1x0XHQgICAgIGluc24tXHUwMDNlc3JjX3JlZyA9PSBCUEZfUFNFVURPX01BUF9JRFhfVkFMVUUpKSB7XG4mIzQzO1x0XHRcdHN0cnVjdCBicGZfbWFwICptYXA7XG4mIzQzO1xuJiM0MztcdFx0XHRhdXggPSBcdTAwMjZlbnYtXHUwMDNlaW5zbl9hdXhfZGF0YVtpICYjNDM7IGRlbHRhXTtcbiYjNDM7XHRcdFx0bWFwID0gZW52LVx1MDAzZXVzZWRfbWFwc1thdXgtXHUwMDNlbWFwX2luZGV4XTtcbiYjNDM7XHRcdFx0aWYgKG1hcC1cdTAwM2VtYXBfdHlwZSAhPSBCUEZfTUFQX1RZUEVfUEVSQ1BVX0FSUkFZKVxuJiM0MztcdFx0XHRcdGdvdG8gbmV4dF9pbnNuO1xuJiM0MztcbiYjNDM7XHRcdFx0LypcbiYjNDM7XHRcdFx0ICogUmV1c2UgdGhlIG9yaWdpbmFsIGxkX2ltbTY0IGluc24sIGFuZCBhZGQgb25lXG4mIzQzO1x0XHRcdCAqIG1vdjY0X3BlcmNwdV9yZWcgaW5zbi5cbiYjNDM7XHRcdFx0ICovXG4mIzQzO1xuJiM0MztcdFx0XHRpbnNuX2J1ZlswXSA9IGluc25bMV07XG4mIzQzO1x0XHRcdGluc25fYnVmWzFdID0gQlBGX01PVjY0X1BFUkNQVV9SRUcoaW5zbi1cdTAwM2Vkc3RfcmVnLCBpbnNuLVx1MDAzZWRzdF9yZWcpO1xuJiM0MztcdFx0XHRjbnQgPSAyO1xuJiM0MztcbiYjNDM7XHRcdFx0aSYjNDM7JiM0Mzs7XG4mIzQzO1x0XHRcdG5ld19wcm9nID0gYnBmX3BhdGNoX2luc25fZGF0YShlbnYsIGkgJiM0MzsgZGVsdGEsIGluc25fYnVmLCBjbnQpO1xuJiM0MztcdFx0XHRpZiAoIW5ld19wcm9nKVxuJiM0MztcdFx0XHRcdHJldHVybiAtRU5PTUVNO1xuJiM0MztcbiYjNDM7XHRcdFx0ZGVsdGEgICAgJiM0Mzs9IGNudCAtIDE7XG4mIzQzO1x0XHRcdGVudi1cdTAwM2Vwcm9nID0gcHJvZyA9IG5ld19wcm9nO1xuJiM0MztcdFx0XHRpbnNuICAgICAgPSBuZXdfcHJvZy1cdTAwM2VpbnNuc2kgJiM0MzsgaSAmIzQzOyBkZWx0YTtcbiYjNDM7XHRcdFx0Z290byBuZXh0X2luc247XG4mIzQzO1x0XHR9XG4mIzQzO1xuIFx0XHRpZiAoaW5zbi1cdTAwM2Vjb2RlICE9IChCUEZfSk1QIHwgQlBGX0NBTEwpKVxuIFx0XHRcdGdvdG8gbmV4dF9pbnNuO1xuIFx0XHRpZiAoaW5zbi1cdTAwM2VzcmNfcmVnID09IEJQRl9QU0VVRE9fQ0FMTClcbmRpZmYgLS1naXQgYS9rZXJuZWwvYnBmL3ZlcmlmaWVyLmMgYi9rZXJuZWwvYnBmL3ZlcmlmaWVyLmNcbmluZGV4IDI1YWVhNDI3MWNkMDg5Li5kYmY3NmZhOWQ0M2Q4ZSAxMDA2NDRcbi0tLSBhL2tlcm5lbC9icGYvdmVyaWZpZXIuY1xuJiM0MzsmIzQzOyYjNDM7IGIva2VybmVsL2JwZi92ZXJpZmllci5jXG5AQCAtNjUyLDcgJiM0Mzs2NTIsNiBAQCBzdGF0aWMgdm9pZCBfX21hcmtfZHlucHRyX3JlZyhzdHJ1Y3QgYnBmX3JlZ19zdGF0ZSAqcmVnLFxuIFx0XHRcdCAgICAgIGVudW0gYnBmX2R5bnB0cl90eXBlIHR5cGUsXG4gXHRcdFx0ICAgICAgYm9vbCBmaXJzdF9zbG90LCBpbnQgaWQsIGludCBwYXJlbnRfaWQpO1xuIFxuLVxuIHN0YXRpYyB2b2lkIG1hcmtfZHlucHRyX3N0YWNrX3JlZ3Moc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudixcbiBcdFx0XHRcdCAgIHN0cnVjdCBicGZfcmVnX3N0YXRlICpzcmVnMSxcbiBcdFx0XHRcdCAgIHN0cnVjdCBicGZfcmVnX3N0YXRlICpzcmVnMixcbkBAIC0xNjg5LDcgJiM0MzsxNjg4LDYgQEAgc3RhdGljIGJvb2wgc2FtZV9jYWxsc2l0ZXMoc3RydWN0IGJwZl92ZXJpZmllcl9zdGF0ZSAqYSwgc3RydWN0IGJwZl92ZXJpZmllcl9zdGFcbiBcdHJldHVybiB0cnVlO1xuIH1cbiBcbi1cbiB2b2lkIGJwZl9mcmVlX2JhY2tlZGdlcyhzdHJ1Y3QgYnBmX3NjY192aXNpdCAqdmlzaXQpXG4ge1xuIFx0c3RydWN0IGJwZl9zY2NfYmFja2VkZ2UgKmJhY2tlZGdlLCAqbmV4dDtcbkBAIC0yMzA5LDcgJiM0MzsyMzA3LDYgQEAgc3RhdGljIHN0cnVjdCBicGZfdmVyaWZpZXJfc3RhdGUgKnB1c2hfYXN5bmNfY2Ioc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudixcbiBcdHJldHVybiBcdTAwMjZlbGVtLVx1MDAzZXN0O1xuIH1cbiBcbi1cbiBzdGF0aWMgaW50IGNtcF9zdWJwcm9ncyhjb25zdCB2b2lkICphLCBjb25zdCB2b2lkICpiKVxuIHtcbiBcdHJldHVybiAoKHN0cnVjdCBicGZfc3VicHJvZ19pbmZvICopYSktXHUwMDNlc3RhcnQgLVxuQEAgLTMzMzEsNyAmIzQzOzMzMjgsNiBAQCBzdGF0aWMgYm9vbCBpc19zcGlsbGFibGVfcmVndHlwZShlbnVtIGJwZl9yZWdfdHlwZSB0eXBlKVxuIFx0fVxuIH1cbiBcbi1cbiAvKiBjaGVjayBpZiByZWdpc3RlciBpcyBhIGNvbnN0YW50IHNjYWxhciB2YWx1ZSAqL1xuIHN0YXRpYyBib29sIGlzX3JlZ19jb25zdChzdHJ1Y3QgYnBmX3JlZ19zdGF0ZSAqcmVnLCBib29sIHN1YnJlZzMyKVxuIHtcbkBAIC00MDI1LDcgJiM0Mzs0MDIxLDYgQEAgc3RhdGljIGludCBjaGVja19zdGFja19yZWFkKHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsXG4gXHRyZXR1cm4gZXJyO1xuIH1cbiBcbi1cbiAvKiBjaGVja19zdGFja193cml0ZSBkaXNwYXRjaGVzIHRvIGNoZWNrX3N0YWNrX3dyaXRlX2ZpeGVkX29mZiBvclxuICAqIGNoZWNrX3N0YWNrX3dyaXRlX3Zhcl9vZmYuXG4gICpcbkBAIC00ODIwLDcgJiM0Mzs0ODE1LDYgQEAgc3RhdGljIGludCBjaGVja19zb2NrX2FjY2VzcyhzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52LCBpbnQgaW5zbl9pZHgsXG4gXHRcdHZhbGlkID0gZmFsc2U7XG4gXHR9XG4gXG4tXG4gXHRpZiAodmFsaWQpIHtcbiBcdFx0ZW52LVx1MDAzZWluc25fYXV4X2RhdGFbaW5zbl9pZHhdLmN0eF9maWVsZF9zaXplID1cbiBcdFx0XHRpbmZvLmN0eF9maWVsZF9zaXplO1xuQEAgLTU2MDAsNiAmIzQzOzU1OTQsOCBAQCBpbnQgYnBmX21hcF9kaXJlY3RfcmVhZChzdHJ1Y3QgYnBmX21hcCAqbWFwLCBpbnQgb2ZmLCBpbnQgc2l6ZSwgdTY0ICp2YWwsXG4gXHR1NjQgYWRkcjtcbiBcdGludCBlcnI7XG4gXG4mIzQzO1x0aWYgKG1hcC1cdTAwM2VtYXBfdHlwZSA9PSBCUEZfTUFQX1RZUEVfSU5TTl9BUlJBWSB8fCBtYXAtXHUwMDNlbWFwX3R5cGUgPT0gQlBGX01BUF9UWVBFX1BFUkNQVV9BUlJBWSlcbiYjNDM7XHRcdHJldHVybiAtRUlOVkFMO1xuIFx0ZXJyID0gbWFwLVx1MDAzZW9wcy1cdTAwM2VtYXBfZGlyZWN0X3ZhbHVlX2FkZHIobWFwLCBcdTAwMjZhZGRyLCBvZmYpO1xuIFx0aWYgKGVycilcbiBcdFx0cmV0dXJuIGVycjtcbkBAIC02MTU1LDYgJiM0Mzs2MTUxLDcgQEAgc3RhdGljIGludCBjaGVja19tZW1fYWNjZXNzKHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsIGludCBpbnNuX2lkeCwgc3RydWN0IGJcbiBcdFx0XHRpZiAodG51bV9pc19jb25zdChyZWctXHUwMDNldmFyX29mZikgXHUwMDI2XHUwMDI2XG4gXHRcdFx0ICAgIGJwZl9tYXBfaXNfcmRvbmx5KG1hcCkgXHUwMDI2XHUwMDI2XG4gXHRcdFx0ICAgIG1hcC1cdTAwM2VvcHMtXHUwMDNlbWFwX2RpcmVjdF92YWx1ZV9hZGRyIFx1MDAyNlx1MDAyNlxuJiM0MztcdFx0XHQgICAgbWFwLVx1MDAzZW1hcF90eXBlICE9IEJQRl9NQVBfVFlQRV9QRVJDUFVfQVJSQVkgXHUwMDI2XHUwMDI2XG4gXHRcdFx0ICAgIG1hcC1cdTAwM2VtYXBfdHlwZSAhPSBCUEZfTUFQX1RZUEVfSU5TTl9BUlJBWSkge1xuIFx0XHRcdFx0aW50IG1hcF9vZmYgPSBvZmYgJiM0MzsgcmVnLVx1MDAzZXZhcl9vZmYudmFsdWU7XG4gXHRcdFx0XHR1NjQgdmFsID0gMDtcbkBAIC02NjQ1LDcgJiM0Mzs2NjQyLDYgQEAgc3RhdGljIGludCBjaGVja19zdGFja19yYW5nZV9pbml0aWFsaXplZChcbiBcdGlmIChlcnIpXG4gXHRcdHJldHVybiBlcnI7XG4gXG4tXG4gXHRpZiAodG51bV9pc19jb25zdChyZWctXHUwMDNldmFyX29mZikpIHtcbiBcdFx0bWluX29mZiA9IG1heF9vZmYgPSByZWctXHUwMDNldmFyX29mZi52YWx1ZSAmIzQzOyBvZmY7XG4gXHR9IGVsc2Uge1xuQEAgLTczNTksNyAmIzQzOzczNTUsNiBAQCBzdGF0aWMgYm9vbCBpc19pdGVyX25ld19rZnVuYyhzdHJ1Y3QgYnBmX2tmdW5jX2NhbGxfYXJnX21ldGEgKm1ldGEpXG4gXHRyZXR1cm4gbWV0YS1cdTAwM2VrZnVuY19mbGFncyBcdTAwMjYgS0ZfSVRFUl9ORVc7XG4gfVxuIFxuLVxuIHN0YXRpYyBib29sIGlzX2l0ZXJfZGVzdHJveV9rZnVuYyhzdHJ1Y3QgYnBmX2tmdW5jX2NhbGxfYXJnX21ldGEgKm1ldGEpXG4ge1xuIFx0cmV0dXJuIG1ldGEtXHUwMDNla2Z1bmNfZmxhZ3MgXHUwMDI2IEtGX0lURVJfREVTVFJPWTtcbkBAIC04MTI1LDYgJiM0Mzs4MTIwLDEyIEBAIHN0YXRpYyBpbnQgY2hlY2tfYXJnX2NvbnN0X3N0cihzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52LFxuIFx0XHRyZXR1cm4gLUVBQ0NFUztcbiBcdH1cbiBcbiYjNDM7XHRpZiAobWFwLVx1MDAzZW1hcF90eXBlID09IEJQRl9NQVBfVFlQRV9QRVJDUFVfQVJSQVkpIHtcbiYjNDM7XHRcdHZlcmJvc2UoZW52LCBcJiMzNDslcyBwb2ludHMgdG8gcGVyY3B1X2FycmF5IG1hcCB3aGljaCBjYW5ub3QgYmUgdXNlZCBhcyBjb25zdCBzdHJpbmdcXG5cJiMzNDssXG4mIzQzO1x0XHRcdHJlZ19hcmdfbmFtZShlbnYsIGFyZ25vKSk7XG4mIzQzO1x0XHRyZXR1cm4gLUVBQ0NFUztcbiYjNDM7XHR9XG4mIzQzO1xuIFx0aWYgKCFicGZfbWFwX2lzX3Jkb25seShtYXApKSB7XG4gXHRcdHZlcmJvc2UoZW52LCBcJiMzNDslcyBkb2VzIG5vdCBwb2ludCB0byBhIHJlYWRvbmx5IG1hcCYjMzk7XFxuXCYjMzQ7LCByZWdfYXJnX25hbWUoZW52LCBhcmdubykpO1xuIFx0XHRyZXR1cm4gLUVBQ0NFUztcbkBAIC0xMTUwMiw3ICYjNDM7MTE1MDMsNiBAQCBzdGF0aWMgaW50IHByb2Nlc3NfaXJxX2ZsYWcoc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudiwgc3RydWN0IGJwZl9yZWdfc3RhdGUgKlxuIFx0cmV0dXJuIDA7XG4gfVxuIFxuLVxuIHN0YXRpYyBpbnQgcmVmX3NldF9ub25fb3duaW5nKHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsIHN0cnVjdCBicGZfcmVnX3N0YXRlICpyZWcpXG4ge1xuIFx0c3RydWN0IGJ0Zl9yZWNvcmQgKnJlYyA9IHJlZ19idGZfcmVjb3JkKHJlZyk7XG5AQCAtMTYzOTQsNyAmIzQzOzE2Mzk0LDYgQEAgc3RhdGljIGludCBjaGVja19sZF9hYnMoc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudiwgc3RydWN0IGJwZl9pbnNuICppbnNuKVxuIFx0cmV0dXJuIDA7XG4gfVxuIFxuLVxuIHN0YXRpYyBib29sIHJldHVybl9yZXR2YWxfcmFuZ2Uoc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudiwgc3RydWN0IGJwZl9yZXR2YWxfcmFuZ2UgKnJhbmdlKVxuIHtcbiBcdGVudW0gYnBmX3Byb2dfdHlwZSBwcm9nX3R5cGUgPSByZXNvbHZlX3Byb2dfdHlwZShlbnYtXHUwMDNlcHJvZyk7XG5AQCAtMTgyMTMsNiAmIzQzOzE4MjEyLDEyIEBAIHN0YXRpYyBpbnQgY2hlY2tfYW5kX3Jlc29sdmVfaW5zbnMoc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudilcbiBcdFx0XHRcdFx0cmV0dXJuIC1FSU5WQUw7XG4gXHRcdFx0XHR9XG4gXG4mIzQzO1x0XHRcdFx0aWYgKG1hcC1cdTAwM2VtYXBfdHlwZSA9PSBCUEZfTUFQX1RZUEVfUEVSQ1BVX0FSUkFZIFx1MDAyNlx1MDAyNlxuJiM0MztcdFx0XHRcdCAgICAhZW52LVx1MDAzZXByb2ctXHUwMDNlaml0X3JlcXVlc3RlZCkge1xuJiM0MztcdFx0XHRcdFx0dmVyYm9zZShlbnYsIFwmIzM0O0pJVCBpcyByZXF1aXJlZCB0byB1c2UgZ2xvYmFsIHBlcmNwdSBkYXRhXFxuXCYjMzQ7KTtcbiYjNDM7XHRcdFx0XHRcdHJldHVybiAtRU9QTk9UU1VQUDtcbiYjNDM7XHRcdFx0XHR9XG4mIzQzO1xuIFx0XHRcdFx0ZXJyID0gbWFwLVx1MDAzZW9wcy1cdTAwM2VtYXBfZGlyZWN0X3ZhbHVlX2FkZHIobWFwLCBcdTAwMjZhZGRyLCBvZmYpO1xuIFx0XHRcdFx0aWYgKGVycikge1xuIFx0XHRcdFx0XHR2ZXJib3NlKGVudiwgXCYjMzQ7aW52YWxpZCBhY2Nlc3MgdG8gbWFwIHZhbHVlIHBvaW50ZXIsIHZhbHVlX3NpemU9JXUgb2ZmPSV1XFxuXCYjMzQ7LFxuQEAgLTE4Mjg4LDggJiM0MzsxODI5Myw2IEBAIHN0YXRpYyB2b2lkIHJlbGVhc2VfaW5zbl9hcnJheXMoc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudilcbiBcdFx0YnBmX2luc25fYXJyYXlfcmVsZWFzZShlbnYtXHUwMDNlaW5zbl9hcnJheV9tYXBzW2ldKTtcbiB9XG4gXG4tXG4tXG4gLyogVGhlIHZlcmlmaWVyIGRvZXMgbW9yZSBkYXRhIGZsb3cgYW5hbHlzaXMgdGhhbiBsbHZtIGFuZCB3aWxsIG5vdFxuICAqIGV4cGxvcmUgYnJhbmNoZXMgdGhhdCBhcmUgZGVhZCBhdCBydW4gdGltZS4gTWFsaWNpb3VzIHByb2dyYW1zIGNhblxuICAqIGhhdmUgZGVhZCBjb2RlIHRvby4gVGhlcmVmb3JlIHJlcGxhY2UgYWxsIGRlYWQgYXQtcnVuLXRpbWUgY29kZVxuQEAgLTE4MzE3LDggJiM0MzsxODMyMCw2IEBAIHN0YXRpYyB2b2lkIHNhbml0aXplX2RlYWRfY29kZShzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52KVxuIFx0fVxuIH1cbiBcbi1cbi1cbiBzdGF0aWMgdm9pZCBmcmVlX3N0YXRlcyhzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52KVxuIHtcbiBcdHN0cnVjdCBicGZfdmVyaWZpZXJfc3RhdGVfbGlzdCAqc2w7XG5AQCAtMTg2MDAsNyAmIzQzOzE4NjAxLDYgQEAgc3RhdGljIGludCBkb19jaGVja19tYWluKHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYpXG4gXHRyZXR1cm4gcmV0O1xuIH1cbiBcbi1cbiBzdGF0aWMgdm9pZCBwcmludF92ZXJpZmljYXRpb25fc3RhdHMoc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudilcbiB7XG4gXHQvKiBTa2lwIG92ZXIgaGlkZGVuIHN1YnByb2dzIHdoaWNoIGFyZSBub3QgdmVyaWZpZWQuICovXG5kaWZmIC0tZ2l0IGEvdG9vbHMvYnBmL2JwZnRvb2wvZ2VuLmMgYi90b29scy9icGYvYnBmdG9vbC9nZW4uY1xuaW5kZXggNmFlNzI2MmViZTBjMWQuLjJlNjAyOTYzNThkYjVlIDEwMDY0NFxuLS0tIGEvdG9vbHMvYnBmL2JwZnRvb2wvZ2VuLmNcbiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL2JwZi9icGZ0b29sL2dlbi5jXG5AQCAtOTIsNyAmIzQzOzkyLDcgQEAgc3RhdGljIHZvaWQgZ2V0X2hlYWRlcl9ndWFyZChjaGFyICpndWFyZCwgY29uc3QgY2hhciAqb2JqX25hbWUsIGNvbnN0IGNoYXIgKnN1ZmZcbiBcbiBzdGF0aWMgYm9vbCBnZXRfbWFwX2lkZW50KGNvbnN0IHN0cnVjdCBicGZfbWFwICptYXAsIGNoYXIgKmJ1Ziwgc2l6ZV90IGJ1Zl9zeilcbiB7XG4tXHRzdGF0aWMgY29uc3QgY2hhciAqc2Z4c1tdID0geyBcJiMzNDsuZGF0YVwmIzM0OywgXCYjMzQ7LnJvZGF0YVwmIzM0OywgXCYjMzQ7LmJzc1wmIzM0OywgXCYjMzQ7Lmtjb25maWdcJiMzNDsgfTtcbiYjNDM7XHRzdGF0aWMgY29uc3QgY2hhciAqc2Z4c1tdID0geyBcJiMzNDsuZGF0YVwmIzM0OywgXCYjMzQ7LnJvZGF0YVwmIzM0OywgXCYjMzQ7LmJzc1wmIzM0OywgXCYjMzQ7LnBlcmNwdVwmIzM0OywgXCYjMzQ7Lmtjb25maWdcJiMzNDsgfTtcbiBcdGNvbnN0IGNoYXIgKm5hbWUgPSBicGZfbWFwX19uYW1lKG1hcCk7XG4gXHRpbnQgaSwgbjtcbiBcbkBAIC0xMTcsNyAmIzQzOzExNyw3IEBAIHN0YXRpYyBib29sIGdldF9tYXBfaWRlbnQoY29uc3Qgc3RydWN0IGJwZl9tYXAgKm1hcCwgY2hhciAqYnVmLCBzaXplX3QgYnVmX3N6KVxuIFxuIHN0YXRpYyBib29sIGdldF9kYXRhc2VjX2lkZW50KGNvbnN0IGNoYXIgKnNlY19uYW1lLCBjaGFyICpidWYsIHNpemVfdCBidWZfc3opXG4ge1xuLVx0c3RhdGljIGNvbnN0IGNoYXIgKnBmeHNbXSA9IHsgXCYjMzQ7LmRhdGFcJiMzNDssIFwmIzM0Oy5yb2RhdGFcJiMzNDssIFwmIzM0Oy5ic3NcJiMzNDssIFwmIzM0Oy5rY29uZmlnXCYjMzQ7IH07XG4mIzQzO1x0c3RhdGljIGNvbnN0IGNoYXIgKnBmeHNbXSA9IHsgXCYjMzQ7LmRhdGFcJiMzNDssIFwmIzM0Oy5yb2RhdGFcJiMzNDssIFwmIzM0Oy5ic3NcJiMzNDssIFwmIzM0Oy5wZXJjcHVcJiMzNDssIFwmIzM0Oy5rY29uZmlnXCYjMzQ7IH07XG4gXHRpbnQgaSwgbjtcbiBcbiBcdC8qIHJlY29nbml6ZSBoYXJkIGNvZGVkIExMVk0gc2VjdGlvbiBuYW1lICovXG5AQCAtMjU0LDYgJiM0MzsyNTQsMjAgQEAgc3RhdGljIGNvbnN0IHN0cnVjdCBidGZfdHlwZSAqZmluZF90eXBlX2Zvcl9tYXAoc3RydWN0IGJ0ZiAqYnRmLCBjb25zdCBjaGFyICptYXBcbiBcdHJldHVybiBOVUxMO1xuIH1cbiBcbiYjNDM7c3RhdGljIGJvb2wgYnBmX21hcF9pc19za2VsX2RhdGEoY29uc3Qgc3RydWN0IGJwZl9tYXAgKm1hcClcbiYjNDM7e1xuJiM0MztcdGlmICghYnBmX21hcF9faXNfaW50ZXJuYWwobWFwKSlcbiYjNDM7XHRcdHJldHVybiBmYWxzZTtcbiYjNDM7XG4mIzQzO1x0aWYgKGJwZl9tYXBfX21hcF9mbGFncyhtYXApIFx1MDAyNiBCUEZfRl9NTUFQQUJMRSlcbiYjNDM7XHRcdHJldHVybiB0cnVlO1xuJiM0MztcbiYjNDM7XHRpZiAoYnBmX21hcF9fdHlwZShtYXApID09IEJQRl9NQVBfVFlQRV9QRVJDUFVfQVJSQVkpXG4mIzQzO1x0XHRyZXR1cm4gdHJ1ZTtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIGZhbHNlO1xuJiM0Mzt9XG4mIzQzO1xuIHN0YXRpYyBib29sIGlzX21tYXBhYmxlX21hcChjb25zdCBzdHJ1Y3QgYnBmX21hcCAqbWFwLCBjaGFyICpidWYsIHNpemVfdCBzeilcbiB7XG4gXHRzaXplX3QgdG1wX3N6O1xuQEAgLTI2Myw3ICYjNDM7Mjc3LDcgQEAgc3RhdGljIGJvb2wgaXNfbW1hcGFibGVfbWFwKGNvbnN0IHN0cnVjdCBicGZfbWFwICptYXAsIGNoYXIgKmJ1Ziwgc2l6ZV90IHN6KVxuIFx0XHRyZXR1cm4gdHJ1ZTtcbiBcdH1cbiBcbi1cdGlmICghYnBmX21hcF9faXNfaW50ZXJuYWwobWFwKSB8fCAhKGJwZl9tYXBfX21hcF9mbGFncyhtYXApIFx1MDAyNiBCUEZfRl9NTUFQQUJMRSkpXG4mIzQzO1x0aWYgKCFicGZfbWFwX2lzX3NrZWxfZGF0YShtYXApKVxuIFx0XHRyZXR1cm4gZmFsc2U7XG4gXG4gXHRpZiAoIWdldF9tYXBfaWRlbnQobWFwLCBidWYsIHN6KSlcbkBAIC0zMjEsNiAmIzQzOzMzNSwxMSBAQCBzdGF0aWMgYm9vbCBidGZfaXNfcHRyX3RvX2Z1bmNfcHJvdG8oY29uc3Qgc3RydWN0IGJ0ZiAqYnRmLFxuIFx0cmV0dXJuIGJ0Zl9pc19wdHIodikgXHUwMDI2XHUwMDI2IGJ0Zl9pc19mdW5jX3Byb3RvKGJ0Zl9fdHlwZV9ieV9pZChidGYsIHYtXHUwMDNldHlwZSkpO1xuIH1cbiBcbiYjNDM7c3RhdGljIGJvb2wgYnBmX21hcF9pc19wZXJjcHVfZGF0YShjb25zdCBzdHJ1Y3QgYnBmX21hcCAqbWFwKVxuJiM0Mzt7XG4mIzQzO1x0cmV0dXJuIGJwZl9tYXBfX2lzX2ludGVybmFsKG1hcCkgXHUwMDI2XHUwMDI2IGJwZl9tYXBfX3R5cGUobWFwKSA9PSBCUEZfTUFQX1RZUEVfUEVSQ1BVX0FSUkFZO1xuJiM0Mzt9XG4mIzQzO1xuIHN0YXRpYyBpbnQgY29kZWdlbl9zdWJza2VsX2RhdGFzZWNzKHN0cnVjdCBicGZfb2JqZWN0ICpvYmosIGNvbnN0IGNoYXIgKm9ial9uYW1lKVxuIHtcbiBcdHN0cnVjdCBidGYgKmJ0ZiA9IGJwZl9vYmplY3RfX2J0ZihvYmopO1xuQEAgLTM0Myw2ICYjNDM7MzYyLDkgQEAgc3RhdGljIGludCBjb2RlZ2VuX3N1YnNrZWxfZGF0YXNlY3Moc3RydWN0IGJwZl9vYmplY3QgKm9iaiwgY29uc3QgY2hhciAqb2JqX25hbWVcbiBcdFx0aWYgKCFpc19tbWFwYWJsZV9tYXAobWFwLCBtYXBfaWRlbnQsIHNpemVvZihtYXBfaWRlbnQpKSlcbiBcdFx0XHRjb250aW51ZTtcbiBcbiYjNDM7XHRcdGlmIChicGZfbWFwX2lzX3BlcmNwdV9kYXRhKG1hcCkpXG4mIzQzO1x0XHRcdGNvbnRpbnVlO1xuJiM0MztcbiBcdFx0c2VjID0gZmluZF90eXBlX2Zvcl9tYXAoYnRmLCBtYXBfaWRlbnQpO1xuIFx0XHRpZiAoIXNlYylcbiBcdFx0XHRjb250aW51ZTtcbkBAIC02NjgsOCAmIzQzOzY5MCw3IEBAIHN0YXRpYyB2b2lkIGNvZGVnZW5fZGVzdHJveShzdHJ1Y3QgYnBmX29iamVjdCAqb2JqLCBjb25zdCBjaGFyICpvYmpfbmFtZSlcbiBcdGJwZl9vYmplY3RfX2Zvcl9lYWNoX21hcChtYXAsIG9iaikge1xuIFx0XHRpZiAoIWdldF9tYXBfaWRlbnQobWFwLCBpZGVudCwgc2l6ZW9mKGlkZW50KSkpXG4gXHRcdFx0Y29udGludWU7XG4tXHRcdGlmIChicGZfbWFwX19pc19pbnRlcm5hbChtYXApIFx1MDAyNlx1MDAyNlxuLVx0XHQgICAgKGJwZl9tYXBfX21hcF9mbGFncyhtYXApIFx1MDAyNiBCUEZfRl9NTUFQQUJMRSkpXG4mIzQzO1x0XHRpZiAoYnBmX21hcF9pc19za2VsX2RhdGEobWFwKSlcbiBcdFx0XHRwcmludGYoXCYjMzQ7XFx0c2tlbF9mcmVlX21hcF9kYXRhKHNrZWwtXHUwMDNlJTEkcywgc2tlbC1cdTAwM2VtYXBzLiUxJHMuaW5pdGlhbF92YWx1ZSwgJTIkenUpO1xcblwmIzM0OyxcbiBcdFx0XHQgICAgICAgaWRlbnQsIGJwZl9tYXBfbW1hcF9zeihtYXApKTtcbiBcdFx0Y29kZWdlbihcJiMzNDtcXFxuQEAgLTg1MCw2ICYjNDM7ODcxLDIwIEBAIHN0YXRpYyBpbnQgZ2VuX3RyYWNlKHN0cnVjdCBicGZfb2JqZWN0ICpvYmosIGNvbnN0IGNoYXIgKm9ial9uYW1lLCBjb25zdCBjaGFyICpoXG4gXHRcdGlmICghaXNfbW1hcGFibGVfbWFwKG1hcCwgaWRlbnQsIHNpemVvZihpZGVudCkpKVxuIFx0XHRcdGNvbnRpbnVlO1xuIFxuJiM0MztcdFx0aWYgKGJwZl9tYXBfaXNfcGVyY3B1X2RhdGEobWFwKSkge1xuJiM0MztcdFx0XHRjb2RlZ2VuKFwmIzM0O1xcXG4mIzQzO1x0XHRcXG5cXFxuJiM0MztcdFx0XHRlcnIgPSBza2VsX3Byb3RlY3RfbWFwX2RhdGEoc2tlbC1cdTAwM2UlMSRzLCBcdTAwMjZza2VsLVx1MDAzZW1hcHMuJTEkcy5pbml0aWFsX3ZhbHVlLCAlMiR6ZCk7XFxuXFxcbiYjNDM7XHRcdFx0aWYgKGVycilcdFx0XHRcdFx0ICAgIFxcblxcXG4mIzQzO1x0XHRcdFx0cmV0dXJuIGVycjtcdFx0XHRcdCAgICBcXG5cXFxuJiM0MztcdFx0I2lmZGVmIF9fS0VSTkVMX19cdFx0XHRcdFx0ICAgIFxcblxcXG4mIzQzO1x0XHRcdHNrZWwtXHUwMDNlJTEkcyA9IE5VTEw7XHRcdFx0XHQgICAgXFxuXFxcbiYjNDM7XHRcdCNlbmRpZlx0XHRcdFx0XHRcdFx0ICAgIFxcblxcXG4mIzQzO1x0XHRcdFwmIzM0OyxcbiYjNDM7XHRcdFx0aWRlbnQsIGJwZl9tYXBfbW1hcF9zeihtYXApKTtcbiYjNDM7XHRcdFx0Y29udGludWU7XG4mIzQzO1x0XHR9XG4mIzQzO1xuIFx0XHRpZiAoYnBmX21hcF9fbWFwX2ZsYWdzKG1hcCkgXHUwMDI2IEJQRl9GX1JET05MWV9QUk9HKVxuIFx0XHRcdG1tYXBfZmxhZ3MgPSBcJiMzNDtQUk9UX1JFQURcJiMzNDs7XG4gXHRcdGVsc2VcbkBAIC0xNzQwLDYgJiM0MzsxNzc1LDggQEAgc3RhdGljIGludCBkb19zdWJza2VsZXRvbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpXG4gXG4gXHRcdGlmICghaXNfbW1hcGFibGVfbWFwKG1hcCwgaWRlbnQsIHNpemVvZihpZGVudCkpKVxuIFx0XHRcdGNvbnRpbnVlO1xuJiM0MztcdFx0aWYgKGJwZl9tYXBfaXNfcGVyY3B1X2RhdGEobWFwKSlcbiYjNDM7XHRcdFx0Y29udGludWU7XG4gXG4gXHRcdG1hcF90eXBlX2lkID0gYnBmX21hcF9fYnRmX3ZhbHVlX3R5cGVfaWQobWFwKTtcbiBcdFx0aWYgKG1hcF90eXBlX2lkIFx1MDAzYz0gMCkge1xuQEAgLTE4NjMsNiAmIzQzOzE5MDAsOCBAQCBzdGF0aWMgaW50IGRvX3N1YnNrZWxldG9uKGludCBhcmdjLCBjaGFyICoqYXJndilcbiBcdGJwZl9vYmplY3RfX2Zvcl9lYWNoX21hcChtYXAsIG9iaikge1xuIFx0XHRpZiAoIWlzX21tYXBhYmxlX21hcChtYXAsIGlkZW50LCBzaXplb2YoaWRlbnQpKSlcbiBcdFx0XHRjb250aW51ZTtcbiYjNDM7XHRcdGlmIChicGZfbWFwX2lzX3BlcmNwdV9kYXRhKG1hcCkpXG4mIzQzO1x0XHRcdGNvbnRpbnVlO1xuIFxuIFx0XHRtYXBfdHlwZV9pZCA9IGJwZl9tYXBfX2J0Zl92YWx1ZV90eXBlX2lkKG1hcCk7XG4gXHRcdGlmIChtYXBfdHlwZV9pZCBcdTAwM2M9IDApXG5kaWZmIC0tZ2l0IGEvdG9vbHMvbGliL2JwZi9icGZfZ2VuX2ludGVybmFsLmggYi90b29scy9saWIvYnBmL2JwZl9nZW5faW50ZXJuYWwuaFxuaW5kZXggNDlhZjQyNjBiOGU2YjcuLjVlYTgzODM4MDVkM2JjIDEwMDY0NFxuLS0tIGEvdG9vbHMvbGliL2JwZi9icGZfZ2VuX2ludGVybmFsLmhcbiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL2xpYi9icGYvYnBmX2dlbl9pbnRlcm5hbC5oXG5AQCAtNjYsNyAmIzQzOzY2LDggQEAgdm9pZCBicGZfZ2VuX19wcm9nX2xvYWQoc3RydWN0IGJwZl9nZW4gKmdlbixcbiBcdFx0XHRlbnVtIGJwZl9wcm9nX3R5cGUgcHJvZ190eXBlLCBjb25zdCBjaGFyICpwcm9nX25hbWUsXG4gXHRcdFx0Y29uc3QgY2hhciAqbGljZW5zZSwgc3RydWN0IGJwZl9pbnNuICppbnNucywgc2l6ZV90IGluc25fY250LFxuIFx0XHRcdHN0cnVjdCBicGZfcHJvZ19sb2FkX29wdHMgKmxvYWRfYXR0ciwgaW50IHByb2dfaWR4KTtcbi12b2lkIGJwZl9nZW5fX21hcF91cGRhdGVfZWxlbShzdHJ1Y3QgYnBmX2dlbiAqZ2VuLCBpbnQgbWFwX2lkeCwgdm9pZCAqdmFsdWUsIF9fdTMyIHZhbHVlX3NpemUpO1xuJiM0Mzt2b2lkIGJwZl9nZW5fX21hcF91cGRhdGVfZWxlbShzdHJ1Y3QgYnBmX2dlbiAqZ2VuLCBpbnQgbWFwX2lkeCwgdm9pZCAqdmFsdWUsIF9fdTMyIHZhbHVlX3NpemUsXG4mIzQzO1x0XHRcdCAgICAgIF9fdTY0IGZsYWdzKTtcbiB2b2lkIGJwZl9nZW5fX21hcF9mcmVlemUoc3RydWN0IGJwZl9nZW4gKmdlbiwgaW50IG1hcF9pZHgpO1xuIHZvaWQgYnBmX2dlbl9fcmVjb3JkX2F0dGFjaF90YXJnZXQoc3RydWN0IGJwZl9nZW4gKmdlbiwgY29uc3QgY2hhciAqbmFtZSwgZW51bSBicGZfYXR0YWNoX3R5cGUgdHlwZSk7XG4gdm9pZCBicGZfZ2VuX19yZWNvcmRfZXh0ZXJuKHN0cnVjdCBicGZfZ2VuICpnZW4sIGNvbnN0IGNoYXIgKm5hbWUsIGJvb2wgaXNfd2VhayxcbmRpZmYgLS1naXQgYS90b29scy9saWIvYnBmL2ZlYXR1cmVzLmMgYi90b29scy9saWIvYnBmL2ZlYXR1cmVzLmNcbmluZGV4IGI3ZTM4OGY5OWQwYmJkLi5lZjk1ODFjMTEzMDM1NSAxMDA2NDRcbi0tLSBhL3Rvb2xzL2xpYi9icGYvZmVhdHVyZXMuY1xuJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvbGliL2JwZi9mZWF0dXJlcy5jXG5AQCAtNjIwLDYgJiM0Mzs2MjAsMzggQEAgc3RhdGljIGludCBwcm9iZV9icGZfc3lzY2FsbF9jb21tb25fYXR0cnMoaW50IHRva2VuX2ZkKVxuIFx0cmV0dXJuIHByb2JlX3N5c19icGZfZXh0KCk7XG4gfVxuIFxuJiM0MztzdGF0aWMgaW50IHByb2JlX2tlcm5fcGVyY3B1X2RhdGEoaW50IHRva2VuX2ZkKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IGJwZl9pbnNuIGluc25zW10gPSB7XG4mIzQzO1x0XHRCUEZfTERfTUFQX1ZBTFVFKEJQRl9SRUdfMSwgMCwgMCksXG4mIzQzO1x0XHRCUEZfTERYX01FTShCUEZfRFcsIEJQRl9SRUdfMCwgQlBGX1JFR18xLCAwKSxcbiYjNDM7XHRcdEJQRl9FWElUX0lOU04oKSxcbiYjNDM7XHR9O1xuJiM0MztcdExJQkJQRl9PUFRTKGJwZl9tYXBfY3JlYXRlX29wdHMsIG1hcF9vcHRzLFxuJiM0MztcdFx0LnRva2VuX2ZkID0gdG9rZW5fZmQsXG4mIzQzO1x0XHQubWFwX2ZsYWdzID0gdG9rZW5fZmQgPyBCUEZfRl9UT0tFTl9GRCA6IDAsXG4mIzQzO1x0KTtcbiYjNDM7XHRMSUJCUEZfT1BUUyhicGZfcHJvZ19sb2FkX29wdHMsIHByb2dfb3B0cyxcbiYjNDM7XHRcdC50b2tlbl9mZCA9IHRva2VuX2ZkLFxuJiM0MztcdFx0LnByb2dfZmxhZ3MgPSB0b2tlbl9mZCA/IEJQRl9GX1RPS0VOX0ZEIDogMCxcbiYjNDM7XHQpO1xuJiM0MztcdGludCByZXQsIG1hcCwgaW5zbl9jbnQgPSBBUlJBWV9TSVpFKGluc25zKTtcbiYjNDM7XG4mIzQzO1x0bWFwID0gYnBmX21hcF9jcmVhdGUoQlBGX01BUF9UWVBFX1BFUkNQVV9BUlJBWSwgXCYjMzQ7bGliYnBmX3BlcmNwdVwmIzM0Oywgc2l6ZW9mKGludCksIDgsIDEsXG4mIzQzO1x0XHRcdCAgICAgXHUwMDI2bWFwX29wdHMpO1xuJiM0MztcdGlmIChtYXAgXHUwMDNjIDApIHtcbiYjNDM7XHRcdHByX3dhcm4oXCYjMzQ7RXJyb3IgaW4gJXMoKTogJXMuIENvdWxkbiYjMzk7dCBjcmVhdGUgc2ltcGxlIHBlcmNwdV9hcnJheSBtYXAuXFxuXCYjMzQ7LFxuJiM0MztcdFx0XHRfX2Z1bmNfXywgZXJyc3RyKG1hcCkpO1xuJiM0MztcdFx0cmV0dXJuIG1hcDtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdGluc25zWzBdLmltbSA9IG1hcDtcbiYjNDM7XG4mIzQzO1x0cmV0ID0gYnBmX3Byb2dfbG9hZChCUEZfUFJPR19UWVBFX1NPQ0tFVF9GSUxURVIsIE5VTEwsIFwmIzM0O0dQTFwmIzM0OywgaW5zbnMsIGluc25fY250LCBcdTAwMjZwcm9nX29wdHMpO1xuJiM0MztcdGNsb3NlKG1hcCk7XG4mIzQzO1x0cmV0dXJuIHByb2JlX2ZkKHJldCk7XG4mIzQzO31cbiYjNDM7XG4gdHlwZWRlZiBpbnQgKCpmZWF0dXJlX3Byb2JlX2ZuKShpbnQgLyogdG9rZW5fZmQgKi8pO1xuIFxuIHN0YXRpYyBzdHJ1Y3Qga2Vybl9mZWF0dXJlX2NhY2hlIGZlYXR1cmVfY2FjaGU7XG5AQCAtNzA3LDYgJiM0Mzs3MzksOSBAQCBzdGF0aWMgc3RydWN0IGtlcm5fZmVhdHVyZV9kZXNjIHtcbiBcdFtGRUFUX0JQRl9TWVNDQUxMX0NPTU1PTl9BVFRSU10gPSB7XG4gXHRcdFwmIzM0O0JQRiBzeXNjYWxsIGNvbW1vbiBhdHRyaWJ1dGVzIHN1cHBvcnRcJiMzNDssIHByb2JlX2JwZl9zeXNjYWxsX2NvbW1vbl9hdHRycyxcbiBcdH0sXG4mIzQzO1x0W0ZFQVRfUEVSQ1BVX0RBVEFdID0ge1xuJiM0MztcdFx0XCYjMzQ7a2VybmVsIHN1cHBvcnRzIHBlcmNwdSBkYXRhXCYjMzQ7LCBwcm9iZV9rZXJuX3BlcmNwdV9kYXRhLFxuJiM0MztcdH0sXG4gfTtcbiBcbiBib29sIGZlYXRfc3VwcG9ydGVkKHN0cnVjdCBrZXJuX2ZlYXR1cmVfY2FjaGUgKmNhY2hlLCBlbnVtIGtlcm5fZmVhdHVyZV9pZCBmZWF0X2lkKVxuZGlmZiAtLWdpdCBhL3Rvb2xzL2xpYi9icGYvZ2VuX2xvYWRlci5jIGIvdG9vbHMvbGliL2JwZi9nZW5fbG9hZGVyLmNcbmluZGV4IGM3ZjJkMmFjN2JiMzVmLi42MGExMjA0ZTlhMjYzYyAxMDA2NDRcbi0tLSBhL3Rvb2xzL2xpYi9icGYvZ2VuX2xvYWRlci5jXG4mIzQzOyYjNDM7JiM0MzsgYi90b29scy9saWIvYnBmL2dlbl9sb2FkZXIuY1xuQEAgLTExOTAsNyAmIzQzOzExOTAsNyBAQCB2b2lkIGJwZl9nZW5fX3Byb2dfbG9hZChzdHJ1Y3QgYnBmX2dlbiAqZ2VuLFxuIH1cbiBcbiB2b2lkIGJwZl9nZW5fX21hcF91cGRhdGVfZWxlbShzdHJ1Y3QgYnBmX2dlbiAqZ2VuLCBpbnQgbWFwX2lkeCwgdm9pZCAqcHZhbHVlLFxuLVx0XHRcdCAgICAgIF9fdTMyIHZhbHVlX3NpemUpXG4mIzQzO1x0XHRcdCAgICAgIF9fdTMyIHZhbHVlX3NpemUsIF9fdTY0IGZsYWdzKVxuIHtcbiBcdGludCBhdHRyX3NpemUgPSBvZmZzZXRvZmVuZCh1bmlvbiBicGZfYXR0ciwgZmxhZ3MpO1xuIFx0aW50IG1hcF91cGRhdGVfYXR0ciwgdmFsdWUsIGtleTtcbkBAIC0xMTk4LDYgJiM0MzsxMTk4LDcgQEAgdm9pZCBicGZfZ2VuX19tYXBfdXBkYXRlX2VsZW0oc3RydWN0IGJwZl9nZW4gKmdlbiwgaW50IG1hcF9pZHgsIHZvaWQgKnB2YWx1ZSxcbiBcdGludCB6ZXJvID0gMDtcbiBcbiBcdG1lbXNldChcdTAwMjZhdHRyLCAwLCBhdHRyX3NpemUpO1xuJiM0MztcdGF0dHIuZmxhZ3MgPSB0Z3RfZW5kaWFuKGZsYWdzKTtcbiBcbiBcdHZhbHVlID0gYWRkX2RhdGEoZ2VuLCBwdmFsdWUsIHZhbHVlX3NpemUpO1xuIFx0a2V5ID0gYWRkX2RhdGEoZ2VuLCBcdTAwMjZ6ZXJvLCBzaXplb2YoemVybykpO1xuZGlmZiAtLWdpdCBhL3Rvb2xzL2xpYi9icGYvbGliYnBmLmMgYi90b29scy9saWIvYnBmL2xpYmJwZi5jXG5pbmRleCA3MTYyMTQ2MjgwYTgwZS4uNmUxOGExNjI4ZTEzOTYgMTAwNjQ0XG4tLS0gYS90b29scy9saWIvYnBmL2xpYmJwZi5jXG4mIzQzOyYjNDM7JiM0MzsgYi90b29scy9saWIvYnBmL2xpYmJwZi5jXG5AQCAtNTQxLDYgJiM0Mzs1NDEsNyBAQCBzdHJ1Y3QgYnBmX3N0cnVjdF9vcHMge1xuIH07XG4gXG4gI2RlZmluZSBEQVRBX1NFQyBcJiMzNDsuZGF0YVwmIzM0O1xuJiM0MzsjZGVmaW5lIFBFUkNQVV9TRUMgXCYjMzQ7LnBlcmNwdVwmIzM0O1xuICNkZWZpbmUgQlNTX1NFQyBcJiMzNDsuYnNzXCYjMzQ7XG4gI2RlZmluZSBST0RBVEFfU0VDIFwmIzM0Oy5yb2RhdGFcJiMzNDtcbiAjZGVmaW5lIEtDT05GSUdfU0VDIFwmIzM0Oy5rY29uZmlnXCYjMzQ7XG5AQCAtNTU1LDYgJiM0Mzs1NTYsNyBAQCBlbnVtIGxpYmJwZl9tYXBfdHlwZSB7XG4gXHRMSUJCUEZfTUFQX0JTUyxcbiBcdExJQkJQRl9NQVBfUk9EQVRBLFxuIFx0TElCQlBGX01BUF9LQ09ORklHLFxuJiM0MztcdExJQkJQRl9NQVBfUEVSQ1BVLFxuIH07XG4gXG4gc3RydWN0IGJwZl9tYXBfZGVmIHtcbkBAIC02NjYsNiAmIzQzOzY2OCw3IEBAIGVudW0gc2VjX3R5cGUge1xuIFx0U0VDX0RBVEEsXG4gXHRTRUNfUk9EQVRBLFxuIFx0U0VDX1NUX09QUyxcbiYjNDM7XHRTRUNfUEVSQ1BVLFxuIH07XG4gXG4gc3RydWN0IGVsZl9zZWNfZGVzYyB7XG5AQCAtMTgzOSw2ICYjNDM7MTg0Miw4IEBAIHN0YXRpYyBzaXplX3QgYnBmX21hcF9tbWFwX3N6KGNvbnN0IHN0cnVjdCBicGZfbWFwICptYXApXG4gXHRzd2l0Y2ggKG1hcC1cdTAwM2VkZWYudHlwZSkge1xuIFx0Y2FzZSBCUEZfTUFQX1RZUEVfQVJSQVk6XG4gXHRcdHJldHVybiBhcnJheV9tYXBfbW1hcF9zeihtYXAtXHUwMDNlZGVmLnZhbHVlX3NpemUsIG1hcC1cdTAwM2VkZWYubWF4X2VudHJpZXMpO1xuJiM0MztcdGNhc2UgQlBGX01BUF9UWVBFX1BFUkNQVV9BUlJBWTpcbiYjNDM7XHRcdHJldHVybiBtYXAtXHUwMDNlZGVmLnZhbHVlX3NpemU7XG4gXHRjYXNlIEJQRl9NQVBfVFlQRV9BUkVOQTpcbiBcdFx0cmV0dXJuIHBhZ2Vfc3ogKiBtYXAtXHUwMDNlZGVmLm1heF9lbnRyaWVzO1xuIFx0ZGVmYXVsdDpcbkBAIC0xOTM4LDcgJiM0MzsxOTQzLDcgQEAgc3RhdGljIGJvb2wgbWFwX2lzX21tYXBhYmxlKHN0cnVjdCBicGZfb2JqZWN0ICpvYmosIHN0cnVjdCBicGZfbWFwICptYXApXG4gXHRzdHJ1Y3QgYnRmX3Zhcl9zZWNpbmZvICp2c2k7XG4gXHRpbnQgaSwgbjtcbiBcbi1cdGlmICghbWFwLVx1MDAzZWJ0Zl92YWx1ZV90eXBlX2lkKVxuJiM0MztcdGlmICghbWFwLVx1MDAzZWJ0Zl92YWx1ZV90eXBlX2lkIHx8IG1hcC1cdTAwM2VsaWJicGZfdHlwZSA9PSBMSUJCUEZfTUFQX1BFUkNQVSlcbiBcdFx0cmV0dXJuIGZhbHNlO1xuIFxuIFx0dCA9IGJ0Zl9fdHlwZV9ieV9pZChvYmotXHUwMDNlYnRmLCBtYXAtXHUwMDNlYnRmX3ZhbHVlX3R5cGVfaWQpO1xuQEAgLTE5NjIsNiAmIzQzOzE5NjcsNyBAQCBzdGF0aWMgaW50XG4gYnBmX29iamVjdF9faW5pdF9pbnRlcm5hbF9tYXAoc3RydWN0IGJwZl9vYmplY3QgKm9iaiwgZW51bSBsaWJicGZfbWFwX3R5cGUgdHlwZSxcbiBcdFx0XHQgICAgICBjb25zdCBjaGFyICpyZWFsX25hbWUsIGludCBzZWNfaWR4LCB2b2lkICpkYXRhLCBzaXplX3QgZGF0YV9zeilcbiB7XG4mIzQzO1x0Ym9vbCBpc19wZXJjcHUgPSB0eXBlID09IExJQkJQRl9NQVBfUEVSQ1BVO1xuIFx0c3RydWN0IGJwZl9tYXBfZGVmICpkZWY7XG4gXHRzdHJ1Y3QgYnBmX21hcCAqbWFwO1xuIFx0c2l6ZV90IG1tYXBfc3o7XG5AQCAtMTk3NSw3ICYjNDM7MTk4MSw3IEBAIGJwZl9vYmplY3RfX2luaXRfaW50ZXJuYWxfbWFwKHN0cnVjdCBicGZfb2JqZWN0ICpvYmosIGVudW0gbGliYnBmX21hcF90eXBlIHR5cGUsXG4gXHRtYXAtXHUwMDNlc2VjX2lkeCA9IHNlY19pZHg7XG4gXHRtYXAtXHUwMDNlc2VjX29mZnNldCA9IDA7XG4gXHRtYXAtXHUwMDNlcmVhbF9uYW1lID0gc3RyZHVwKHJlYWxfbmFtZSk7XG4tXHRtYXAtXHUwMDNlbmFtZSA9IGludGVybmFsX21hcF9uYW1lKG9iaiwgcmVhbF9uYW1lKTtcbiYjNDM7XHRtYXAtXHUwMDNlbmFtZSA9IGlzX3BlcmNwdSA/IHN0cmR1cChyZWFsX25hbWUpIDogaW50ZXJuYWxfbWFwX25hbWUob2JqLCByZWFsX25hbWUpO1xuIFx0aWYgKCFtYXAtXHUwMDNlcmVhbF9uYW1lIHx8ICFtYXAtXHUwMDNlbmFtZSkge1xuIFx0XHR6ZnJlZShcdTAwMjZtYXAtXHUwMDNlcmVhbF9uYW1lKTtcbiBcdFx0emZyZWUoXHUwMDI2bWFwLVx1MDAzZW5hbWUpO1xuQEAgLTE5ODMsNyAmIzQzOzE5ODksNyBAQCBicGZfb2JqZWN0X19pbml0X2ludGVybmFsX21hcChzdHJ1Y3QgYnBmX29iamVjdCAqb2JqLCBlbnVtIGxpYmJwZl9tYXBfdHlwZSB0eXBlLFxuIFx0fVxuIFxuIFx0ZGVmID0gXHUwMDI2bWFwLVx1MDAzZWRlZjtcbi1cdGRlZi1cdTAwM2V0eXBlID0gQlBGX01BUF9UWVBFX0FSUkFZO1xuJiM0MztcdGRlZi1cdTAwM2V0eXBlID0gaXNfcGVyY3B1ID8gQlBGX01BUF9UWVBFX1BFUkNQVV9BUlJBWSA6IEJQRl9NQVBfVFlQRV9BUlJBWTtcbiBcdGRlZi1cdTAwM2VrZXlfc2l6ZSA9IHNpemVvZihpbnQpO1xuIFx0ZGVmLVx1MDAzZXZhbHVlX3NpemUgPSBkYXRhX3N6O1xuIFx0ZGVmLVx1MDAzZW1heF9lbnRyaWVzID0gMTtcbkBAIC0xOTk2LDggJiM0MzsyMDAyLDkgQEAgYnBmX29iamVjdF9faW5pdF9pbnRlcm5hbF9tYXAoc3RydWN0IGJwZl9vYmplY3QgKm9iaiwgZW51bSBsaWJicGZfbWFwX3R5cGUgdHlwZSxcbiBcdGlmIChtYXBfaXNfbW1hcGFibGUob2JqLCBtYXApKVxuIFx0XHRkZWYtXHUwMDNlbWFwX2ZsYWdzIHw9IEJQRl9GX01NQVBBQkxFO1xuIFxuLVx0cHJfZGVidWcoXCYjMzQ7bWFwICYjMzk7JXMmIzM5OyAoZ2xvYmFsIGRhdGEpOiBhdCBzZWNfaWR4ICVkLCBvZmZzZXQgJXp1LCBmbGFncyAleC5cXG5cJiMzNDssXG4tXHRcdCBtYXAtXHUwMDNlbmFtZSwgbWFwLVx1MDAzZXNlY19pZHgsIG1hcC1cdTAwM2VzZWNfb2Zmc2V0LCBkZWYtXHUwMDNlbWFwX2ZsYWdzKTtcbiYjNDM7XHRwcl9kZWJ1ZyhcJiMzNDttYXAgJiMzOTslcyYjMzk7IChnbG9iYWwgJXNkYXRhKTogYXQgc2VjX2lkeCAlZCwgb2Zmc2V0ICV6dSwgZmxhZ3MgJXguXFxuXCYjMzQ7LFxuJiM0MztcdFx0IG1hcC1cdTAwM2VuYW1lLCBpc19wZXJjcHUgPyBcJiMzNDtwZXJjcHUgXCYjMzQ7IDogXCYjMzQ7XCYjMzQ7LCBtYXAtXHUwMDNlc2VjX2lkeCxcbiYjNDM7XHRcdCBtYXAtXHUwMDNlc2VjX29mZnNldCwgZGVmLVx1MDAzZW1hcF9mbGFncyk7XG4gXG4gXHRtbWFwX3N6ID0gYnBmX21hcF9tbWFwX3N6KG1hcCk7XG4gXHRtYXAtXHUwMDNlbW1hcGVkID0gbW1hcChOVUxMLCBtbWFwX3N6LCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLFxuQEAgLTIwNTcsNiAmIzQzOzIwNjQsMTMgQEAgc3RhdGljIGludCBicGZfb2JqZWN0X19pbml0X2dsb2JhbF9kYXRhX21hcHMoc3RydWN0IGJwZl9vYmplY3QgKm9iailcbiBcdFx0XHRcdFx0XHRcdCAgICBOVUxMLFxuIFx0XHRcdFx0XHRcdFx0ICAgIHNlY19kZXNjLVx1MDAzZWRhdGEtXHUwMDNlZF9zaXplKTtcbiBcdFx0XHRicmVhaztcbiYjNDM7XHRcdGNhc2UgU0VDX1BFUkNQVTpcbiYjNDM7XHRcdFx0c2VjX25hbWUgPSBlbGZfc2VjX25hbWUob2JqLCBlbGZfc2VjX2J5X2lkeChvYmosIHNlY19pZHgpKTtcbiYjNDM7XHRcdFx0ZXJyID0gYnBmX29iamVjdF9faW5pdF9pbnRlcm5hbF9tYXAob2JqLCBMSUJCUEZfTUFQX1BFUkNQVSxcbiYjNDM7XHRcdFx0XHRcdFx0XHQgICAgc2VjX25hbWUsIHNlY19pZHgsXG4mIzQzO1x0XHRcdFx0XHRcdFx0ICAgIHNlY19kZXNjLVx1MDAzZWRhdGEtXHUwMDNlZF9idWYsXG4mIzQzO1x0XHRcdFx0XHRcdFx0ICAgIHNlY19kZXNjLVx1MDAzZWRhdGEtXHUwMDNlZF9zaXplKTtcbiYjNDM7XHRcdFx0YnJlYWs7XG4gXHRcdGRlZmF1bHQ6XG4gXHRcdFx0Lyogc2tpcCAqL1xuIFx0XHRcdGJyZWFrO1xuQEAgLTQwMTYsNiAmIzQzOzQwMzAsMTEgQEAgc3RhdGljIGludCBicGZfb2JqZWN0X19lbGZfY29sbGVjdChzdHJ1Y3QgYnBmX29iamVjdCAqb2JqKVxuIFx0XHRcdFx0c2VjX2Rlc2MtXHUwMDNlc2VjX3R5cGUgPSBTRUNfUk9EQVRBO1xuIFx0XHRcdFx0c2VjX2Rlc2MtXHUwMDNlc2hkciA9IHNoO1xuIFx0XHRcdFx0c2VjX2Rlc2MtXHUwMDNlZGF0YSA9IGRhdGE7XG4mIzQzO1x0XHRcdH0gZWxzZSBpZiAoc3RyY21wKG5hbWUsIFBFUkNQVV9TRUMpID09IDAgfHxcbiYjNDM7XHRcdFx0XHQgICBzdHJfaGFzX3BmeChuYW1lLCBQRVJDUFVfU0VDIFwmIzM0Oy5cJiMzNDspKSB7XG4mIzQzO1x0XHRcdFx0c2VjX2Rlc2MtXHUwMDNlc2VjX3R5cGUgPSBTRUNfUEVSQ1BVO1xuJiM0MztcdFx0XHRcdHNlY19kZXNjLVx1MDAzZXNoZHIgPSBzaDtcbiYjNDM7XHRcdFx0XHRzZWNfZGVzYy1cdTAwM2VkYXRhID0gZGF0YTtcbiBcdFx0XHR9IGVsc2UgaWYgKHN0cmNtcChuYW1lLCBTVFJVQ1RfT1BTX1NFQykgPT0gMCB8fFxuIFx0XHRcdFx0ICAgc3RyY21wKG5hbWUsIFNUUlVDVF9PUFNfTElOS19TRUMpID09IDAgfHxcbiBcdFx0XHRcdCAgIHN0cmNtcChuYW1lLCBcJiMzNDs/XCYjMzQ7IFNUUlVDVF9PUFNfU0VDKSA9PSAwIHx8XG5AQCAtNDU0NCw2ICYjNDM7NDU2Myw3IEBAIHN0YXRpYyBib29sIGJwZl9vYmplY3RfX3NobmR4X2lzX2RhdGEoY29uc3Qgc3RydWN0IGJwZl9vYmplY3QgKm9iaixcbiBcdGNhc2UgU0VDX0JTUzpcbiBcdGNhc2UgU0VDX0RBVEE6XG4gXHRjYXNlIFNFQ19ST0RBVEE6XG4mIzQzO1x0Y2FzZSBTRUNfUEVSQ1BVOlxuIFx0XHRyZXR1cm4gdHJ1ZTtcbiBcdGRlZmF1bHQ6XG4gXHRcdHJldHVybiBmYWxzZTtcbkBAIC00NTY5LDYgJiM0Mzs0NTg5LDggQEAgYnBmX29iamVjdF9fc2VjdGlvbl90b19saWJicGZfbWFwX3R5cGUoY29uc3Qgc3RydWN0IGJwZl9vYmplY3QgKm9iaiwgaW50IHNobmR4KVxuIFx0XHRyZXR1cm4gTElCQlBGX01BUF9EQVRBO1xuIFx0Y2FzZSBTRUNfUk9EQVRBOlxuIFx0XHRyZXR1cm4gTElCQlBGX01BUF9ST0RBVEE7XG4mIzQzO1x0Y2FzZSBTRUNfUEVSQ1BVOlxuJiM0MztcdFx0cmV0dXJuIExJQkJQRl9NQVBfUEVSQ1BVO1xuIFx0ZGVmYXVsdDpcbiBcdFx0cmV0dXJuIExJQkJQRl9NQVBfVU5TUEVDO1xuIFx0fVxuQEAgLTQ5NDQsNyAmIzQzOzQ5NjYsNyBAQCBzdGF0aWMgaW50IG1hcF9maWxsX2J0Zl90eXBlX2luZm8oc3RydWN0IGJwZl9vYmplY3QgKm9iaiwgc3RydWN0IGJwZl9tYXAgKm1hcClcbiBcbiBcdC8qXG4gXHQgKiBMTFZNIGFubm90YXRlcyBnbG9iYWwgZGF0YSBkaWZmZXJlbnRseSBpbiBCVEYsIHRoYXQgaXMsXG4tXHQgKiBvbmx5IGFzICYjMzk7LmRhdGEmIzM5OywgJiMzOTsuYnNzJiMzOTsgb3IgJiMzOTsucm9kYXRhJiMzOTsuXG4mIzQzO1x0ICogb25seSBhcyAmIzM5Oy5kYXRhJiMzOTssICYjMzk7LmJzcyYjMzk7LCAmIzM5Oy5wZXJjcHUmIzM5OyBvciAmIzM5Oy5yb2RhdGEmIzM5Oy5cbiBcdCAqL1xuIFx0aWYgKCFicGZfbWFwX19pc19pbnRlcm5hbChtYXApKVxuIFx0XHRyZXR1cm4gLUVOT0VOVDtcbkBAIC01Mjk3LDE4ICYjNDM7NTMxOSwzMCBAQCBzdGF0aWMgaW50XG4gYnBmX29iamVjdF9fcG9wdWxhdGVfaW50ZXJuYWxfbWFwKHN0cnVjdCBicGZfb2JqZWN0ICpvYmosIHN0cnVjdCBicGZfbWFwICptYXApXG4ge1xuIFx0ZW51bSBsaWJicGZfbWFwX3R5cGUgbWFwX3R5cGUgPSBtYXAtXHUwMDNlbGliYnBmX3R5cGU7XG4mIzQzO1x0Ym9vbCBpc19wZXJjcHUgPSBtYXBfdHlwZSA9PSBMSUJCUEZfTUFQX1BFUkNQVTtcbiYjNDM7XHRfX3U2NCB1cGRhdGVfZmxhZ3MgPSAwO1xuIFx0aW50IGVyciwgemVybyA9IDA7XG4gXHRzaXplX3QgbW1hcF9zejtcbiBcbiYjNDM7XHRpZiAoaXNfcGVyY3B1KSB7XG4mIzQzO1x0XHRpZiAoIW9iai1cdTAwM2VnZW5fbG9hZGVyIFx1MDAyNlx1MDAyNiAha2VybmVsX3N1cHBvcnRzKG9iaiwgRkVBVF9QRVJDUFVfREFUQSkpIHtcbiYjNDM7XHRcdFx0cHJfd2FybihcJiMzNDttYXAgJiMzOTslcyYjMzk7OiBrZXJuZWwgZG9lcyBub3Qgc3VwcG9ydCBwZXJjcHUgZGF0YS5cXG5cJiMzNDssXG4mIzQzO1x0XHRcdFx0YnBmX21hcF9fbmFtZShtYXApKTtcbiYjNDM7XHRcdFx0cmV0dXJuIC1FT1BOT1RTVVBQO1xuJiM0MztcdFx0fVxuJiM0MztcbiYjNDM7XHRcdHVwZGF0ZV9mbGFncyA9IEJQRl9GX0FMTF9DUFVTO1xuJiM0MztcdH1cbiYjNDM7XG4gXHRpZiAob2JqLVx1MDAzZWdlbl9sb2FkZXIpIHtcbiBcdFx0YnBmX2dlbl9fbWFwX3VwZGF0ZV9lbGVtKG9iai1cdTAwM2VnZW5fbG9hZGVyLCBtYXAgLSBvYmotXHUwMDNlbWFwcyxcbi1cdFx0XHRcdFx0IG1hcC1cdTAwM2VtbWFwZWQsIG1hcC1cdTAwM2VkZWYudmFsdWVfc2l6ZSk7XG4mIzQzO1x0XHRcdFx0XHQgbWFwLVx1MDAzZW1tYXBlZCwgbWFwLVx1MDAzZWRlZi52YWx1ZV9zaXplLCB1cGRhdGVfZmxhZ3MpO1xuIFx0XHRpZiAobWFwX3R5cGUgPT0gTElCQlBGX01BUF9ST0RBVEEgfHwgbWFwX3R5cGUgPT0gTElCQlBGX01BUF9LQ09ORklHKVxuIFx0XHRcdGJwZl9nZW5fX21hcF9mcmVlemUob2JqLVx1MDAzZWdlbl9sb2FkZXIsIG1hcCAtIG9iai1cdTAwM2VtYXBzKTtcbiBcdFx0cmV0dXJuIDA7XG4gXHR9XG4gXG4tXHRlcnIgPSBicGZfbWFwX3VwZGF0ZV9lbGVtKG1hcC1cdTAwM2VmZCwgXHUwMDI2emVybywgbWFwLVx1MDAzZW1tYXBlZCwgMCk7XG4mIzQzO1x0ZXJyID0gYnBmX21hcF91cGRhdGVfZWxlbShtYXAtXHUwMDNlZmQsIFx1MDAyNnplcm8sIG1hcC1cdTAwM2VtbWFwZWQsIHVwZGF0ZV9mbGFncyk7XG4gXHRpZiAoZXJyKSB7XG4gXHRcdGVyciA9IC1lcnJubztcbiBcdFx0cHJfd2FybihcJiMzNDttYXAgJiMzOTslcyYjMzk7OiBmYWlsZWQgdG8gc2V0IGluaXRpYWwgY29udGVudHM6ICVzXFxuXCYjMzQ7LFxuQEAgLTUzNTMsNiAmIzQzOzUzODcsMTMgQEAgYnBmX29iamVjdF9fcG9wdWxhdGVfaW50ZXJuYWxfbWFwKHN0cnVjdCBicGZfb2JqZWN0ICpvYmosIHN0cnVjdCBicGZfbWFwICptYXApXG4gXHRcdFx0cmV0dXJuIGVycjtcbiBcdFx0fVxuIFx0XHRtYXAtXHUwMDNlbW1hcGVkID0gbW1hcGVkO1xuJiM0MztcdH0gZWxzZSBpZiAoaXNfcGVyY3B1KSB7XG4mIzQzO1x0XHRpZiAobXByb3RlY3QobWFwLVx1MDAzZW1tYXBlZCwgbW1hcF9zeiwgUFJPVF9SRUFEKSkge1xuJiM0MztcdFx0XHRlcnIgPSAtZXJybm87XG4mIzQzO1x0XHRcdHByX3dhcm4oXCYjMzQ7bWFwICYjMzk7JXMmIzM5OzogZmFpbGVkIHRvIG1wcm90ZWN0KCkgY29udGVudHM6ICVzXFxuXCYjMzQ7LFxuJiM0MztcdFx0XHRcdGJwZl9tYXBfX25hbWUobWFwKSwgZXJyc3RyKGVycikpO1xuJiM0MztcdFx0XHRyZXR1cm4gZXJyO1xuJiM0MztcdFx0fVxuIFx0fSBlbHNlIGlmIChtYXAtXHUwMDNlbW1hcGVkKSB7XG4gXHRcdG11bm1hcChtYXAtXHUwMDNlbW1hcGVkLCBtbWFwX3N6KTtcbiBcdFx0bWFwLVx1MDAzZW1tYXBlZCA9IE5VTEw7XG5kaWZmIC0tZ2l0IGEvdG9vbHMvbGliL2JwZi9saWJicGZfaW50ZXJuYWwuaCBiL3Rvb2xzL2xpYi9icGYvbGliYnBmX2ludGVybmFsLmhcbmluZGV4IDA0Y2QzMDNmYjVhODc5Li40N2FlMzkxMjVmNjhmOSAxMDA2NDRcbi0tLSBhL3Rvb2xzL2xpYi9icGYvbGliYnBmX2ludGVybmFsLmhcbiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL2xpYi9icGYvbGliYnBmX2ludGVybmFsLmhcbkBAIC00MDEsNiAmIzQzOzQwMSw4IEBAIGVudW0ga2Vybl9mZWF0dXJlX2lkIHtcbiBcdEZFQVRfQlRGX0xBWU9VVCxcbiBcdC8qIEtlcm5lbCBzdXBwb3J0cyBCUEYgc3lzY2FsbCBjb21tb24gYXR0cmlidXRlcyAqL1xuIFx0RkVBVF9CUEZfU1lTQ0FMTF9DT01NT05fQVRUUlMsXG4mIzQzO1x0LyogS2VybmVsIHN1cHBvcnRzIHBlcmNwdSBkYXRhICovXG4mIzQzO1x0RkVBVF9QRVJDUFVfREFUQSxcbiBcdF9fRkVBVF9DTlQsXG4gfTtcbiBcbmRpZmYgLS1naXQgYS90b29scy9saWIvYnBmL3NrZWxfaW50ZXJuYWwuaCBiL3Rvb2xzL2xpYi9icGYvc2tlbF9pbnRlcm5hbC5oXG5pbmRleCA3NDUwM2QzNThiYzhhNS4uNDg1YjBjZDE3MDE3MzkgMTAwNjQ0XG4tLS0gYS90b29scy9saWIvYnBmL3NrZWxfaW50ZXJuYWwuaFxuJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvbGliL2JwZi9za2VsX2ludGVybmFsLmhcbkBAIC0xMzUsOCAmIzQzOzEzNSwxMCBAQCBzdGF0aWMgaW5saW5lIHZvaWQgc2tlbF9mcmVlX21hcF9kYXRhKHZvaWQgKnAsIF9fdTY0IGFkZHIsIHNpemVfdCBzeilcbiB7XG4gXHRpZiAoYWRkciAhPSB+MFVMTClcbiBcdFx0a3ZmcmVlKHApO1xuLVx0LyogV2hlbiBhZGRyID09IH4wVUxMIHRoZSAmIzM5O3AmIzM5OyBwb2ludHMgdG9cbi1cdCAqICgoc3RydWN0IGJwZl9hcnJheSAqKW1hcCktXHUwMDNldmFsdWUuIFNlZSBza2VsX2ZpbmFsaXplX21hcF9kYXRhLlxuJiM0MztcdC8qXG4mIzQzO1x0ICogV2hlbiBhZGRyID09IH4wVUxMIHRoZSBpbml0IGJ1ZmZlciBoYXMgYWxyZWFkeSBiZWVuIHJlbGVhc2VkLlxuJiM0MztcdCAqIEZvciBza2VsX2ZpbmFsaXplX21hcF9kYXRhKCksICYjMzk7cCYjMzk7IHBvaW50cyB0b1xuJiM0MztcdCAqICgoc3RydWN0IGJwZl9hcnJheSAqKW1hcCktXHUwMDNldmFsdWUuXG4gXHQgKi9cbiB9XG4gXG5AQCAtMTc0LDYgJiM0MzsxNzYsMTUgQEAgc3RhdGljIGlubGluZSB2b2lkICpza2VsX2ZpbmFsaXplX21hcF9kYXRhKF9fdTY0ICppbml0X3ZhbCwgc2l6ZV90IG1tYXBfc3osIGludFxuIFx0cmV0dXJuIGFkZHI7XG4gfVxuIFxuJiM0MztzdGF0aWMgaW5saW5lIGludCBza2VsX3Byb3RlY3RfbWFwX2RhdGEodm9pZCAqcCwgX191NjQgKmluaXRfdmFsLCBzaXplX3Qgc3opXG4mIzQzO3tcbiYjNDM7XHQodm9pZClzejtcbiYjNDM7XG4mIzQzO1x0a3ZmcmVlKHApO1xuJiM0MztcdCppbml0X3ZhbCA9IH4wVUxMO1xuJiM0MztcdHJldHVybiAwO1xuJiM0Mzt9XG4mIzQzO1xuICNlbHNlXG4gXG4gc3RhdGljIGlubGluZSB2b2lkICpza2VsX2FsbG9jKHNpemVfdCBzaXplKVxuQEAgLTIxMiw2ICYjNDM7MjIzLDE1IEBAIHN0YXRpYyBpbmxpbmUgdm9pZCAqc2tlbF9maW5hbGl6ZV9tYXBfZGF0YShfX3U2NCAqaW5pdF92YWwsIHNpemVfdCBtbWFwX3N6LCBpbnRcbiBcdFx0cmV0dXJuIE5VTEw7XG4gXHRyZXR1cm4gYWRkcjtcbiB9XG4mIzQzO1xuJiM0MztzdGF0aWMgaW5saW5lIGludCBza2VsX3Byb3RlY3RfbWFwX2RhdGEodm9pZCAqcCwgX191NjQgKmluaXRfdmFsLCBzaXplX3Qgc3opXG4mIzQzO3tcbiYjNDM7XHQodm9pZClpbml0X3ZhbDtcbiYjNDM7XG4mIzQzO1x0aWYgKG1wcm90ZWN0KHAsIHN6LCBQUk9UX1JFQUQpKVxuJiM0MztcdFx0cmV0dXJuIC1lcnJubztcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7fVxuICNlbmRpZlxuIFxuIHN0YXRpYyBpbmxpbmUgaW50IHNrZWxfY2xvc2VueihpbnQgZmQpXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL01ha2VmaWxlIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL01ha2VmaWxlXG5pbmRleCBiNjQyZWU0ODllYTY0MC4uYzM3ZWQ5ZTdiOTdjZDAgMTAwNjQ0XG4tLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvTWFrZWZpbGVcbiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9NYWtlZmlsZVxuQEAgLTUzMyw3ICYjNDM7NTMzLDcgQEAgTFNLRUxTX1NJR05FRCA6PSBmZW50cnlfdGVzdC5jIGZleGl0X3Rlc3QuYyBhdG9taWNzLmNcbiBcbiAjIEdlbmVyYXRlIGJvdGggbGlnaHQgc2tlbGV0b24gYW5kIGxpYmJwZiBza2VsZXRvbiBmb3IgdGhlc2VcbiBMU0tFTFNfRVhUUkEgOj0gdGVzdF9rc3ltc19tb2R1bGUuYyB0ZXN0X2tzeW1zX3dlYWsuYyBrZnVuY19jYWxsX3Rlc3QuYyBcXFxuLVx0a2Z1bmNfY2FsbF90ZXN0X3N1YnByb2cuY1xuJiM0MztcdGtmdW5jX2NhbGxfdGVzdF9zdWJwcm9nLmMgdGVzdF9nbG9iYWxfcGVyY3B1X2RhdGEuY1xuIFNLRUxfQkxBQ0tMSVNUICYjNDM7PSAkJChMU0tFTFMpICQkKExTS0VMU19TSUdORUQpXG4gXG4gdGVzdF9zdGF0aWNfbGlua2VkLnNrZWwuaC1kZXBzIDo9IHRlc3Rfc3RhdGljX2xpbmtlZDEuYnBmLm8gdGVzdF9zdGF0aWNfbGlua2VkMi5icGYub1xuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2dsb2JhbF9kYXRhX2luaXQuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2dsb2JhbF9kYXRhX2luaXQuY1xuaW5kZXggODQ2NjMzMmQ3NDA2ZjQuLmE1ZDg3NzY4ZjZlZTJmIDEwMDY0NFxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvZ2xvYmFsX2RhdGFfaW5pdC5jXG4mIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9nbG9iYWxfZGF0YV9pbml0LmNcbkBAIC0xLDUgJiM0MzsxLDggQEBcbiAvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxuICNpbmNsdWRlIFx1MDAzY3Rlc3RfcHJvZ3MuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcJiMzNDticGYvbGliYnBmX2ludGVybmFsLmhcJiMzNDtcbiYjNDM7I2luY2x1ZGUgXCYjMzQ7dGVzdF9nbG9iYWxfcGVyY3B1X2RhdGEuc2tlbC5oXCYjMzQ7XG4mIzQzOyNpbmNsdWRlIFwmIzM0O3Rlc3RfZ2xvYmFsX3BlcmNwdV9kYXRhLmxza2VsLmhcJiMzNDtcbiBcbiB2b2lkIHRlc3RfZ2xvYmFsX2RhdGFfaW5pdCh2b2lkKVxuIHtcbkBAIC02MCwzICYjNDM7NjMsMjkwIEBAIHZvaWQgdGVzdF9nbG9iYWxfZGF0YV9pbml0KHZvaWQpXG4gXHRmcmVlKG5ld3ZhbCk7XG4gXHRicGZfb2JqZWN0X19jbG9zZShvYmopO1xuIH1cbiYjNDM7XG4mIzQzO3N0YXRpYyB2b2lkIHRlc3RfcGVyY3B1X2RhdGFfb25fY3B1cyhpbnQgbWFwX2ZkLCBpbnQgcHJvZ19mZCwgaW50IG51bV9vbmxpbmUsIGJvb2wgKm9ubGluZSlcbiYjNDM7e1xuJiM0MztcdF9fdTY0IGFyZ3NbMl0gPSB7MHgxMjM0VUxMLCAweDU2NzhVTEx9O1xuJiM0MztcdExJQkJQRl9PUFRTKGJwZl90ZXN0X3J1bl9vcHRzLCB0b3B0cyxcbiYjNDM7XHRcdCAgICAuY3R4X2luID0gYXJncyxcbiYjNDM7XHRcdCAgICAuY3R4X3NpemVfaW4gPSBzaXplb2YoYXJncyksXG4mIzQzO1x0XHQgICAgLmZsYWdzID0gQlBGX0ZfVEVTVF9SVU5fT05fQ1BVLFxuJiM0MztcdCk7XG4mIzQzO1x0aW50IGksIGVyciwga2V5ID0gMDtcbiYjNDM7XG4mIzQzO1x0LyogcnVuIG9uIGV2ZXJ5IG9ubGluZS1DUFUgKi9cbiYjNDM7XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBudW1fb25saW5lOyBpJiM0MzsmIzQzOykge1xuJiM0MztcdFx0c3RydWN0IHRlc3RfZ2xvYmFsX3BlcmNwdV9kYXRhX19wZXJjcHUgZGF0YSA9IHt9O1xuJiM0MztcdFx0X191NjQgZmxhZ3M7XG4mIzQzO1xuJiM0MztcdFx0aWYgKCFvbmxpbmVbaV0pXG4mIzQzO1x0XHRcdGNvbnRpbnVlO1xuJiM0MztcbiYjNDM7XHRcdHRvcHRzLmNwdSA9IGk7XG4mIzQzO1x0XHR0b3B0cy5yZXR2YWwgPSAtMTtcbiYjNDM7XHRcdGVyciA9IGJwZl9wcm9nX3Rlc3RfcnVuX29wdHMocHJvZ19mZCwgXHUwMDI2dG9wdHMpO1xuJiM0MztcdFx0QVNTRVJUX09LKGVyciwgXCYjMzQ7YnBmX3Byb2dfdGVzdF9ydW5fb3B0c1wmIzM0Oyk7XG4mIzQzO1x0XHRBU1NFUlRfRVEodG9wdHMucmV0dmFsLCAwLCBcJiMzNDticGZfcHJvZ190ZXN0X3J1bl9vcHRzIHJldHZhbFwmIzM0Oyk7XG4mIzQzO1xuJiM0MztcdFx0ZmxhZ3MgPSAoKF9fdTY0KSBpIFx1MDAzY1x1MDAzYyAzMikgfCBCUEZfRl9DUFU7XG4mIzQzO1x0XHRlcnIgPSBicGZfbWFwX2xvb2t1cF9lbGVtX2ZsYWdzKG1hcF9mZCwgXHUwMDI2a2V5LCBcdTAwMjZkYXRhLCBmbGFncyk7XG4mIzQzO1x0XHRpZiAoIUFTU0VSVF9PSyhlcnIsIFwmIzM0O2JwZl9tYXBfbG9va3VwX2VsZW1fZmxhZ3NcJiMzNDspKVxuJiM0MztcdFx0XHRyZXR1cm47XG4mIzQzO1xuJiM0MztcdFx0QVNTRVJUX0VRKGRhdGEuZGF0YSwgMSwgXCYjMzQ7ZGF0YS5kYXRhXCYjMzQ7KTtcbiYjNDM7XHRcdEFTU0VSVF9UUlVFKGRhdGEucnVuLCBcJiMzNDtkYXRhLnJ1blwmIzM0Oyk7XG4mIzQzO1x0XHRBU1NFUlRfRVEoZGF0YS5udW1zWzZdLCAweGMwZGUsIFwmIzM0O2RhdGEubnVtc1s2XVwmIzM0Oyk7XG4mIzQzO1x0XHRBU1NFUlRfRVEoZGF0YS5zdHJ1Y3RfZGF0YS5pLCAxLCBcJiMzNDtzdHJ1Y3RfZGF0YS5pXCYjMzQ7KTtcbiYjNDM7XHRcdEFTU0VSVF9UUlVFKGRhdGEuc3RydWN0X2RhdGEuc2V0LCBcJiMzNDtzdHJ1Y3RfZGF0YS5zZXRcJiMzNDspO1xuJiM0MztcdFx0QVNTRVJUX0VRKGRhdGEuc3RydWN0X2RhdGEubnVtc1s2XSwgMHhjMGRlLCBcJiMzNDtzdHJ1Y3RfZGF0YS5udW1zWzZdXCYjMzQ7KTtcbiYjNDM7XHR9XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyB2b2lkIHRlc3RfZ2xvYmFsX3BlcmNwdV9kYXRhX2luaXQodm9pZClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCB0ZXN0X2dsb2JhbF9wZXJjcHVfZGF0YV9fcGVyY3B1IGluaXRfdmFsdWUgPSB7fTtcbiYjNDM7XHRzdHJ1Y3QgdGVzdF9nbG9iYWxfcGVyY3B1X2RhdGFfX3BlcmNwdSAqaW5pdF9kYXRhO1xuJiM0MztcdHN0cnVjdCB0ZXN0X2dsb2JhbF9wZXJjcHVfZGF0YSAqc2tlbCA9IE5VTEw7XG4mIzQzO1x0aW50IHByb2dfZmQsIG1hcF9mZCwgZXJyLCBudW1fb25saW5lO1xuJiM0MztcdHNpemVfdCBpbml0X2RhdGFfc3o7XG4mIzQzO1x0c3RydWN0IGJwZl9tYXAgKm1hcDtcbiYjNDM7XHRib29sICpvbmxpbmU7XG4mIzQzO1xuJiM0MztcdGVyciA9IHBhcnNlX2NwdV9tYXNrX2ZpbGUoXCYjMzQ7L3N5cy9kZXZpY2VzL3N5c3RlbS9jcHUvb25saW5lXCYjMzQ7LCBcdTAwMjZvbmxpbmUsIFx1MDAyNm51bV9vbmxpbmUpO1xuJiM0MztcdGlmICghQVNTRVJUX09LKGVyciwgXCYjMzQ7cGFyc2VfY3B1X21hc2tfZmlsZVwmIzM0OykpXG4mIzQzO1x0XHRyZXR1cm47XG4mIzQzO1xuJiM0MztcdHNrZWwgPSB0ZXN0X2dsb2JhbF9wZXJjcHVfZGF0YV9fb3BlbigpO1xuJiM0MztcdGlmICghQVNTRVJUX09LX1BUUihza2VsLCBcJiMzNDt0ZXN0X2dsb2JhbF9wZXJjcHVfZGF0YV9fb3BlblwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PS19QVFIoc2tlbC1cdTAwM2VwZXJjcHUsIFwmIzM0O3NrZWwtXHUwMDNlcGVyY3B1XCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcbiYjNDM7XHRBU1NFUlRfRVEoc2tlbC1cdTAwM2VwZXJjcHUtXHUwMDNlZGF0YSwgLTEsIFwmIzM0O3NrZWwtXHUwMDNlcGVyY3B1LVx1MDAzZWRhdGFcJiMzNDspO1xuJiM0MztcdEFTU0VSVF9GQUxTRShza2VsLVx1MDAzZXBlcmNwdS1cdTAwM2VydW4sIFwmIzM0O3NrZWwtXHUwMDNlcGVyY3B1LVx1MDAzZXJ1blwmIzM0Oyk7XG4mIzQzO1x0QVNTRVJUX0VRKHNrZWwtXHUwMDNlcGVyY3B1LVx1MDAzZW51bXNbNl0sIDAsIFwmIzM0O3NrZWwtXHUwMDNlcGVyY3B1LVx1MDAzZW51bXNbNl1cJiMzNDspO1xuJiM0MztcdEFTU0VSVF9FUShza2VsLVx1MDAzZXBlcmNwdS1cdTAwM2VzdHJ1Y3RfZGF0YS5pLCAtMSwgXCYjMzQ7c3RydWN0X2RhdGEuaVwmIzM0Oyk7XG4mIzQzO1x0QVNTRVJUX0ZBTFNFKHNrZWwtXHUwMDNlcGVyY3B1LVx1MDAzZXN0cnVjdF9kYXRhLnNldCwgXCYjMzQ7c3RydWN0X2RhdGEuc2V0XCYjMzQ7KTtcbiYjNDM7XHRBU1NFUlRfRVEoc2tlbC1cdTAwM2VwZXJjcHUtXHUwMDNlc3RydWN0X2RhdGEubnVtc1s2XSwgMCwgXCYjMzQ7c3RydWN0X2RhdGEubnVtc1s2XVwmIzM0Oyk7XG4mIzQzO1xuJiM0MztcdG1hcCA9IHNrZWwtXHUwMDNlbWFwcy5wZXJjcHU7XG4mIzQzO1x0aWYgKCFBU1NFUlRfRVEoYnBmX21hcF9fdHlwZShtYXApLCBCUEZfTUFQX1RZUEVfUEVSQ1BVX0FSUkFZLCBcJiMzNDticGZfbWFwX190eXBlXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcbiYjNDM7XHRpbml0X3ZhbHVlLmRhdGEgPSAyO1xuJiM0MztcdGluaXRfdmFsdWUubnVtc1s2XSA9IC0xO1xuJiM0MztcdGluaXRfdmFsdWUuc3RydWN0X2RhdGEuaSA9IDI7XG4mIzQzO1x0aW5pdF92YWx1ZS5zdHJ1Y3RfZGF0YS5udW1zWzZdID0gLTE7XG4mIzQzO1x0ZXJyID0gYnBmX21hcF9fc2V0X2luaXRpYWxfdmFsdWUobWFwLCBcdTAwMjZpbml0X3ZhbHVlLCBzaXplb2YoaW5pdF92YWx1ZSkpO1xuJiM0MztcdGlmICghQVNTRVJUX09LKGVyciwgXCYjMzQ7YnBmX21hcF9fc2V0X2luaXRpYWxfdmFsdWVcJiMzNDspKVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1xuJiM0MztcdGluaXRfZGF0YSA9IGJwZl9tYXBfX2luaXRpYWxfdmFsdWUobWFwLCBcdTAwMjZpbml0X2RhdGFfc3opO1xuJiM0MztcdGlmICghQVNTRVJUX09LX1BUUihpbml0X2RhdGEsIFwmIzM0O2JwZl9tYXBfX2luaXRpYWxfdmFsdWVcJiMzNDspKVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1xuJiM0MztcdEFTU0VSVF9FUShpbml0X2RhdGEtXHUwMDNlZGF0YSwgaW5pdF92YWx1ZS5kYXRhLCBcJiMzNDtpbml0X3ZhbHVlIGRhdGFcJiMzNDspO1xuJiM0MztcdEFTU0VSVF9FUShpbml0X2RhdGEtXHUwMDNlcnVuLCBpbml0X3ZhbHVlLnJ1biwgXCYjMzQ7aW5pdF92YWx1ZSBydW5cJiMzNDspO1xuJiM0MztcdEFTU0VSVF9FUShpbml0X2RhdGEtXHUwMDNlc3RydWN0X2RhdGEuaSwgaW5pdF92YWx1ZS5zdHJ1Y3RfZGF0YS5pLCBcJiMzNDtpbml0X3ZhbHVlIHN0cnVjdF9kYXRhLmlcJiMzNDspO1xuJiM0MztcdEFTU0VSVF9FUShpbml0X2RhdGEtXHUwMDNlc3RydWN0X2RhdGEubnVtc1s2XSwgaW5pdF92YWx1ZS5zdHJ1Y3RfZGF0YS5udW1zWzZdLFxuJiM0MztcdFx0ICBcJiMzNDtpbml0X3ZhbHVlIHN0cnVjdF9kYXRhLm51bXNbNl1cJiMzNDspO1xuJiM0MztcdEFTU0VSVF9FUShpbml0X2RhdGFfc3osIHNpemVvZihpbml0X3ZhbHVlKSwgXCYjMzQ7aW5pdF92YWx1ZSBzaXplXCYjMzQ7KTtcbiYjNDM7XHRBU1NFUlRfRVEoKHZvaWQgKikgaW5pdF9kYXRhLCAodm9pZCAqKSBza2VsLVx1MDAzZXBlcmNwdSwgXCYjMzQ7c2tlbC1cdTAwM2VwZXJjcHUgZXEgaW5pdF9kYXRhXCYjMzQ7KTtcbiYjNDM7XHRBU1NFUlRfRVEoc2tlbC1cdTAwM2VwZXJjcHUtXHUwMDNlZGF0YSwgaW5pdF92YWx1ZS5kYXRhLCBcJiMzNDtza2VsLVx1MDAzZXBlcmNwdS1cdTAwM2VkYXRhXCYjMzQ7KTtcbiYjNDM7XHRBU1NFUlRfRVEoc2tlbC1cdTAwM2VwZXJjcHUtXHUwMDNlcnVuLCBpbml0X3ZhbHVlLnJ1biwgXCYjMzQ7c2tlbC1cdTAwM2VwZXJjcHUtXHUwMDNlcnVuXCYjMzQ7KTtcbiYjNDM7XHRBU1NFUlRfRVEoc2tlbC1cdTAwM2VwZXJjcHUtXHUwMDNlc3RydWN0X2RhdGEuaSwgaW5pdF92YWx1ZS5zdHJ1Y3RfZGF0YS5pLFxuJiM0MztcdFx0ICBcJiMzNDtza2VsLVx1MDAzZXBlcmNwdS1cdTAwM2VzdHJ1Y3RfZGF0YS5pXCYjMzQ7KTtcbiYjNDM7XHRBU1NFUlRfRVEoc2tlbC1cdTAwM2VwZXJjcHUtXHUwMDNlc3RydWN0X2RhdGEubnVtc1s2XSwgaW5pdF92YWx1ZS5zdHJ1Y3RfZGF0YS5udW1zWzZdLFxuJiM0MztcdFx0ICBcJiMzNDtza2VsLVx1MDAzZXBlcmNwdS1cdTAwM2VzdHJ1Y3RfZGF0YS5udW1zWzZdXCYjMzQ7KTtcbiYjNDM7XG4mIzQzO1x0ZXJyID0gdGVzdF9nbG9iYWxfcGVyY3B1X2RhdGFfX2xvYWQoc2tlbCk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0soZXJyLCBcJiMzNDt0ZXN0X2dsb2JhbF9wZXJjcHVfZGF0YV9fbG9hZFwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XG4mIzQzO1x0QVNTRVJUX09LX1BUUihza2VsLVx1MDAzZXBlcmNwdSwgXCYjMzQ7c2tlbC1cdTAwM2VwZXJjcHVcJiMzNDspO1xuJiM0MztcbiYjNDM7XHRtYXBfZmQgPSBicGZfbWFwX19mZChtYXApO1xuJiM0MztcdHByb2dfZmQgPSBicGZfcHJvZ3JhbV9fZmQoc2tlbC1cdTAwM2Vwcm9ncy51cGRhdGVfcGVyY3B1X2RhdGEpO1xuJiM0MztcdHRlc3RfcGVyY3B1X2RhdGFfb25fY3B1cyhtYXBfZmQsIHByb2dfZmQsIG51bV9vbmxpbmUsIG9ubGluZSk7XG4mIzQzO1xuJiM0MztvdXQ6XG4mIzQzO1x0dGVzdF9nbG9iYWxfcGVyY3B1X2RhdGFfX2Rlc3Ryb3koc2tlbCk7XG4mIzQzO1x0ZnJlZShvbmxpbmUpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgdm9pZCB0ZXN0X2dsb2JhbF9wZXJjcHVfZGF0YV9sc2tlbCh2b2lkKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IHRlc3RfZ2xvYmFsX3BlcmNwdV9kYXRhX2xza2VsICpsc2tlbCA9IE5VTEw7XG4mIzQzO1x0aW50IHByb2dfZmQsIG1hcF9mZCwgZXJyLCBudW1fb25saW5lO1xuJiM0MztcdGJvb2wgKm9ubGluZTtcbiYjNDM7XG4mIzQzO1x0ZXJyID0gcGFyc2VfY3B1X21hc2tfZmlsZShcJiMzNDsvc3lzL2RldmljZXMvc3lzdGVtL2NwdS9vbmxpbmVcJiMzNDssIFx1MDAyNm9ubGluZSwgXHUwMDI2bnVtX29ubGluZSk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0soZXJyLCBcJiMzNDtwYXJzZV9jcHVfbWFza19maWxlXCYjMzQ7KSlcbiYjNDM7XHRcdHJldHVybjtcbiYjNDM7XG4mIzQzO1x0bHNrZWwgPSB0ZXN0X2dsb2JhbF9wZXJjcHVfZGF0YV9sc2tlbF9fb3Blbl9hbmRfbG9hZCgpO1xuJiM0MztcdGlmICghQVNTRVJUX09LX1BUUihsc2tlbCwgXCYjMzQ7dGVzdF9nbG9iYWxfcGVyY3B1X2RhdGFfbHNrZWxfX29wZW5fYW5kX2xvYWRcJiMzNDspKVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1xuJiM0MztcdG1hcF9mZCA9IGxza2VsLVx1MDAzZW1hcHMucGVyY3B1Lm1hcF9mZDtcbiYjNDM7XHRwcm9nX2ZkID0gbHNrZWwtXHUwMDNlcHJvZ3MudXBkYXRlX3BlcmNwdV9kYXRhLnByb2dfZmQ7XG4mIzQzO1x0dGVzdF9wZXJjcHVfZGF0YV9vbl9jcHVzKG1hcF9mZCwgcHJvZ19mZCwgbnVtX29ubGluZSwgb25saW5lKTtcbiYjNDM7XG4mIzQzO291dDpcbiYjNDM7XHR0ZXN0X2dsb2JhbF9wZXJjcHVfZGF0YV9sc2tlbF9fZGVzdHJveShsc2tlbCk7XG4mIzQzO1x0ZnJlZShvbmxpbmUpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgaW50IGNyZWF0ZV9yZG9ubHlfcGVyY3B1X2FycmF5KHZvaWQpXG4mIzQzO3tcbiYjNDM7XHRMSUJCUEZfT1BUUyhicGZfbWFwX2NyZWF0ZV9vcHRzLCBtYXBfb3B0cyxcbiYjNDM7XHRcdCAgICAubWFwX2ZsYWdzID0gQlBGX0ZfUkRPTkxZX1BST0csXG4mIzQzO1x0KTtcbiYjNDM7XHRpbnQga2V5ID0gMCwgbWFwX2ZkLCBlcnI7XG4mIzQzO1x0X191NjQgdmFsdWUgPSAwO1xuJiM0MztcbiYjNDM7XHRtYXBfZmQgPSBicGZfbWFwX2NyZWF0ZShCUEZfTUFQX1RZUEVfUEVSQ1BVX0FSUkFZLCBcJiMzNDtwZXJjcHVfcm9fbWFwXCYjMzQ7LCBzaXplb2YoaW50KSxcbiYjNDM7XHRcdFx0XHRzaXplb2YoX191NjQpLCAxLCBcdTAwMjZtYXBfb3B0cyk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfR0UobWFwX2ZkLCAwLCBcJiMzNDticGZfbWFwX2NyZWF0ZVwmIzM0OykpXG4mIzQzO1x0XHRyZXR1cm4gLTE7XG4mIzQzO1xuJiM0MztcdGVyciA9IGJwZl9tYXBfdXBkYXRlX2VsZW0obWFwX2ZkLCBcdTAwMjZrZXksIFx1MDAyNnZhbHVlLCBCUEZfRl9BTExfQ1BVUyk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0soZXJyLCBcJiMzNDticGZfbWFwX3VwZGF0ZV9lbGVtXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcbiYjNDM7XHRlcnIgPSBicGZfbWFwX2ZyZWV6ZShtYXBfZmQpO1xuJiM0MztcdGlmICghQVNTRVJUX09LKGVyciwgXCYjMzQ7YnBmX21hcF9mcmVlemVcJiMzNDspKVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1xuJiM0MztcdHJldHVybiBtYXBfZmQ7XG4mIzQzO1xuJiM0MztvdXQ6XG4mIzQzO1x0Y2xvc2UobWFwX2ZkKTtcbiYjNDM7XHRyZXR1cm4gLTE7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyB2b2lkIHRlc3RfZ2xvYmFsX3BlcmNwdV9kYXRhX3Jkb25seV9kaXJlY3RfcmVhZCh2b2lkKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IGJwZl9pbnNuIGluc25zW10gPSB7XG4mIzQzO1x0XHRCUEZfTERfTUFQX1ZBTFVFKEJQRl9SRUdfMSwgMCwgMCksXG4mIzQzO1x0XHRCUEZfTERYX01FTShCUEZfRFcsIEJQRl9SRUdfMCwgQlBGX1JFR18xLCAwKSxcbiYjNDM7XHRcdEJQRl9FWElUX0lOU04oKSxcbiYjNDM7XHR9O1xuJiM0MztcdGludCBtYXBfZmQsIHByb2dfZmQ7XG4mIzQzO1xuJiM0MztcdG1hcF9mZCA9IGNyZWF0ZV9yZG9ubHlfcGVyY3B1X2FycmF5KCk7XG4mIzQzO1x0aWYgKG1hcF9mZCBcdTAwM2MgMClcbiYjNDM7XHRcdHJldHVybjtcbiYjNDM7XG4mIzQzO1x0aW5zbnNbMF0uaW1tID0gbWFwX2ZkO1xuJiM0MztcdHByb2dfZmQgPSBicGZfcHJvZ19sb2FkKEJQRl9QUk9HX1RZUEVfU09DS0VUX0ZJTFRFUiwgXCYjMzQ7cGVyY3B1X3JvX3Byb2dcJiMzNDssIFwmIzM0O0dQTFwmIzM0OywgaW5zbnMsXG4mIzQzO1x0XHRcdFx0QVJSQVlfU0laRShpbnNucyksIE5VTEwpO1xuJiM0MztcdGlmIChBU1NFUlRfR0UocHJvZ19mZCwgMCwgXCYjMzQ7YnBmX3Byb2dfbG9hZFwmIzM0OykpXG4mIzQzO1x0XHRjbG9zZShwcm9nX2ZkKTtcbiYjNDM7XHRjbG9zZShtYXBfZmQpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgdm9pZCB0ZXN0X2dsb2JhbF9wZXJjcHVfZGF0YV9yZG9ubHlfZGlyZWN0X3dyaXRlKHZvaWQpXG4mIzQzO3tcbiYjNDM7XHRMSUJCUEZfT1BUUyhicGZfcHJvZ19sb2FkX29wdHMsIHByb2dfb3B0cyk7XG4mIzQzO1x0c3RydWN0IGJwZl9pbnNuIGluc25zW10gPSB7XG4mIzQzO1x0XHRCUEZfTERfTUFQX1ZBTFVFKEJQRl9SRUdfMSwgMCwgMCksXG4mIzQzO1x0XHRCUEZfTERYX01FTShCUEZfRFcsIEJQRl9SRUdfMCwgQlBGX1JFR18xLCAwKSxcbiYjNDM7XHRcdEJQRl9TVF9NRU0oQlBGX0RXLCBCUEZfUkVHXzEsIDAsIDApLFxuJiM0MztcdFx0QlBGX0VYSVRfSU5TTigpLFxuJiM0MztcdH07XG4mIzQzO1x0Y2hhciBsb2dfYnVmWzI1Nl0gPSB7fTtcbiYjNDM7XHRpbnQgbWFwX2ZkLCBwcm9nX2ZkO1xuJiM0MztcbiYjNDM7XHRwcm9nX29wdHMubG9nX2J1ZiA9IGxvZ19idWY7XG4mIzQzO1x0cHJvZ19vcHRzLmxvZ19zaXplID0gc2l6ZW9mKGxvZ19idWYpO1xuJiM0MztcdHByb2dfb3B0cy5sb2dfbGV2ZWwgPSAxO1xuJiM0MztcbiYjNDM7XHRtYXBfZmQgPSBjcmVhdGVfcmRvbmx5X3BlcmNwdV9hcnJheSgpO1xuJiM0MztcdGlmIChtYXBfZmQgXHUwMDNjIDApXG4mIzQzO1x0XHRyZXR1cm47XG4mIzQzO1xuJiM0MztcdGluc25zWzBdLmltbSA9IG1hcF9mZDtcbiYjNDM7XHRwcm9nX2ZkID0gYnBmX3Byb2dfbG9hZChCUEZfUFJPR19UWVBFX1NPQ0tFVF9GSUxURVIsIFwmIzM0O3BlcmNwdV9yb19wcm9nXCYjMzQ7LCBcJiMzNDtHUExcJiMzNDssIGluc25zLFxuJiM0MztcdFx0XHRcdEFSUkFZX1NJWkUoaW5zbnMpLCBcdTAwMjZwcm9nX29wdHMpO1xuJiM0MztcdGlmICghQVNTRVJUX0xUKHByb2dfZmQsIDAsIFwmIzM0O2JwZl9wcm9nX2xvYWRcJiMzNDspKVxuJiM0MztcdFx0Y2xvc2UocHJvZ19mZCk7XG4mIzQzO1x0ZWxzZVxuJiM0MztcdFx0QVNTRVJUX0hBU19TVUJTVFIobG9nX2J1ZiwgXCYjMzQ7d3JpdGUgaW50byBtYXAgZm9yYmlkZGVuXCYjMzQ7LCBcJiMzNDt2ZXJpZmllciBsb2dcJiMzNDspO1xuJiM0MztcdGNsb3NlKG1hcF9mZCk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyB2b2lkIHRlc3RfZ2xvYmFsX3BlcmNwdV9kYXRhX3ZlcmlmaWVyX2xvZyh2b2lkKVxuJiM0Mzt7XG4mIzQzO1x0UlVOX1RFU1RTKHRlc3RfZ2xvYmFsX3BlcmNwdV9kYXRhKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIHZvaWQgdGVzdF9nbG9iYWxfcGVyY3B1X2RhdGFfaXRlcih2b2lkKVxuJiM0Mzt7XG4mIzQzO1x0REVDTEFSRV9MSUJCUEZfT1BUUyhicGZfaXRlcl9hdHRhY2hfb3B0cywgb3B0cyk7XG4mIzQzO1x0c3RydWN0IHRlc3RfZ2xvYmFsX3BlcmNwdV9kYXRhICpza2VsO1xuJiM0MztcdHVuaW9uIGJwZl9pdGVyX2xpbmtfaW5mbyBsaW5mbyA9IHt9O1xuJiM0MztcdHN0cnVjdCBicGZfbGluayAqbGluayA9IE5VTEw7XG4mIzQzO1x0aW50IGZkLCBudW1fY3B1cywgbGVuLCBlcnI7XG4mIzQzO1x0Y2hhciBidWZbMTZdO1xuJiM0MztcbiYjNDM7XHRudW1fY3B1cyA9IGxpYmJwZl9udW1fcG9zc2libGVfY3B1cygpO1xuJiM0MztcdGlmICghQVNTRVJUX0dUKG51bV9jcHVzLCAwLCBcJiMzNDtsaWJicGZfbnVtX3Bvc3NpYmxlX2NwdXNcJiMzNDspKVxuJiM0MztcdFx0cmV0dXJuO1xuJiM0MztcbiYjNDM7XHRza2VsID0gdGVzdF9nbG9iYWxfcGVyY3B1X2RhdGFfX29wZW4oKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PS19QVFIoc2tlbCwgXCYjMzQ7dGVzdF9nbG9iYWxfcGVyY3B1X2RhdGFfX29wZW5cJiMzNDspKVxuJiM0MztcdFx0cmV0dXJuO1xuJiM0MztcbiYjNDM7XHRza2VsLVx1MDAzZXJvZGF0YS1cdTAwM2VudW1fY3B1cyA9IG51bV9jcHVzO1xuJiM0MztcdHNrZWwtXHUwMDNlcm9kYXRhLVx1MDAzZW9mZnNldG9mX251bSA9IG9mZnNldG9mKHN0cnVjdCB0ZXN0X2dsb2JhbF9wZXJjcHVfZGF0YV9fcGVyY3B1LCBzdHJ1Y3RfZGF0YSk7XG4mIzQzO1x0c2tlbC1cdTAwM2Vyb2RhdGEtXHUwMDNlb2Zmc2V0b2ZfbnVtICYjNDM7PSBzaXplb2Yoc2tlbC1cdTAwM2VwZXJjcHUtXHUwMDNlc3RydWN0X2RhdGEpIC0gc2l6ZW9mKGludCk7XG4mIzQzO1x0c2tlbC1cdTAwM2Vyb2RhdGEtXHUwMDNlZWxlbV9zeiA9IHJvdW5kdXAoc2l6ZW9mKHN0cnVjdCB0ZXN0X2dsb2JhbF9wZXJjcHVfZGF0YV9fcGVyY3B1KSwgOCk7XG4mIzQzO1x0c2tlbC1cdTAwM2VwZXJjcHUtXHUwMDNlc3RydWN0X2RhdGEubnVtc1s2XSA9IDB4YzBkZTtcbiYjNDM7XG4mIzQzO1x0ZXJyID0gdGVzdF9nbG9iYWxfcGVyY3B1X2RhdGFfX2xvYWQoc2tlbCk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0soZXJyLCBcJiMzNDt0ZXN0X2dsb2JhbF9wZXJjcHVfZGF0YV9fbG9hZFwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XG4mIzQzO1x0bGluZm8ubWFwLm1hcF9mZCA9IGJwZl9tYXBfX2ZkKHNrZWwtXHUwMDNlbWFwcy5wZXJjcHUpO1xuJiM0MztcdG9wdHMubGlua19pbmZvID0gXHUwMDI2bGluZm87XG4mIzQzO1x0b3B0cy5saW5rX2luZm9fbGVuID0gc2l6ZW9mKGxpbmZvKTtcbiYjNDM7XHRsaW5rID0gYnBmX3Byb2dyYW1fX2F0dGFjaF9pdGVyKHNrZWwtXHUwMDNlcHJvZ3MuZHVtcF9wZXJjcHVfZGF0YSwgXHUwMDI2b3B0cyk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0tfUFRSKGxpbmssIFwmIzM0O2JwZl9wcm9ncmFtX19hdHRhY2hfaXRlclwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XG4mIzQzO1x0ZmQgPSBicGZfaXRlcl9jcmVhdGUoYnBmX2xpbmtfX2ZkKGxpbmspKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9HRShmZCwgMCwgXCYjMzQ7YnBmX2l0ZXJfY3JlYXRlXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcbiYjNDM7XHR3aGlsZSAoKGxlbiA9IHJlYWQoZmQsIGJ1Ziwgc2l6ZW9mKGJ1ZikpKSBcdTAwM2UgMClcbiYjNDM7XHRcdGRvIHsgfSB3aGlsZSAoMCk7XG4mIzQzO1x0QVNTRVJUX0VRKGxlbiwgMCwgXCYjMzQ7cmVhZCBpdGVyXCYjMzQ7KTtcbiYjNDM7XHRBU1NFUlRfVFJVRShza2VsLVx1MDAzZWJzcy1cdTAwM2VydW5faXRlciwgXCYjMzQ7cnVuX2l0ZXJcJiMzNDspO1xuJiM0MztcdEFTU0VSVF9FUShza2VsLVx1MDAzZWJzcy1cdTAwM2VwZXJjcHVfZGF0YV9zdW0sIDB4YzBkZSAqIG51bV9jcHVzLCBcJiMzNDtwZXJjcHVfZGF0YV9zdW1cJiMzNDspO1xuJiM0MztcbiYjNDM7XHRjbG9zZShmZCk7XG4mIzQzO291dDpcbiYjNDM7XHRicGZfbGlua19fZGVzdHJveShsaW5rKTtcbiYjNDM7XHR0ZXN0X2dsb2JhbF9wZXJjcHVfZGF0YV9fZGVzdHJveShza2VsKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7dm9pZCB0ZXN0X2dsb2JhbF9wZXJjcHVfZGF0YSh2b2lkKVxuJiM0Mzt7XG4mIzQzO1x0aWYgKCFmZWF0X3N1cHBvcnRlZChOVUxMLCBGRUFUX1BFUkNQVV9EQVRBKSkge1xuJiM0MztcdFx0dGVzdF9fc2tpcCgpO1xuJiM0MztcdFx0cmV0dXJuO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCYjMzQ7aW5pdFwmIzM0OykpXG4mIzQzO1x0XHR0ZXN0X2dsb2JhbF9wZXJjcHVfZGF0YV9pbml0KCk7XG4mIzQzO1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCYjMzQ7bHNrZWxcJiMzNDspKVxuJiM0MztcdFx0dGVzdF9nbG9iYWxfcGVyY3B1X2RhdGFfbHNrZWwoKTtcbiYjNDM7XHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcJiMzNDtyZG9ubHlfZGlyZWN0X3JlYWRcJiMzNDspKVxuJiM0MztcdFx0dGVzdF9nbG9iYWxfcGVyY3B1X2RhdGFfcmRvbmx5X2RpcmVjdF9yZWFkKCk7XG4mIzQzO1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCYjMzQ7cmRvbmx5X2RpcmVjdF93cml0ZVwmIzM0OykpXG4mIzQzO1x0XHR0ZXN0X2dsb2JhbF9wZXJjcHVfZGF0YV9yZG9ubHlfZGlyZWN0X3dyaXRlKCk7XG4mIzQzO1x0dGVzdF9nbG9iYWxfcGVyY3B1X2RhdGFfdmVyaWZpZXJfbG9nKCk7XG4mIzQzO1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCYjMzQ7aXRlclwmIzM0OykpXG4mIzQzO1x0XHR0ZXN0X2dsb2JhbF9wZXJjcHVfZGF0YV9pdGVyKCk7XG4mIzQzO31cbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9nbG9iYWxfcGVyY3B1X3N1YnNrZWwuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2dsb2JhbF9wZXJjcHVfc3Vic2tlbC5jXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMDAuLjhhZWJkNTMzZDg2YjU0XG4tLS0gL2Rldi9udWxsXG4mIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9nbG9iYWxfcGVyY3B1X3N1YnNrZWwuY1xuQEAgLTAsMCAmIzQzOzEsMzcgQEBcbiYjNDM7Ly8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcbiYjNDM7I2luY2x1ZGUgXHUwMDNjdGVzdF9wcm9ncy5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFwmIzM0O3Rlc3RfZ2xvYmFsX3BlcmNwdV9kYXRhLnN1YnNrZWwuaFwmIzM0O1xuJiM0MztcbiYjNDM7dm9pZCB0ZXN0X2dsb2JhbF9wZXJjcHVfZGF0YV9zdWJza2VsKHZvaWQpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgdGVzdF9nbG9iYWxfcGVyY3B1X2RhdGEgKnN1YnNrZWwgPSBOVUxMO1xuJiM0MztcdHN0cnVjdCBicGZfb2JqZWN0ICpvYmo7XG4mIzQzO1x0aW50IGk7XG4mIzQzO1xuJiM0MztcdG9iaiA9IGJwZl9vYmplY3RfX29wZW5fZmlsZShcJiMzNDsuL3Rlc3RfZ2xvYmFsX3BlcmNwdV9kYXRhLmJwZi5vXCYjMzQ7LCBOVUxMKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PS19QVFIob2JqLCBcJiMzNDticGZfb2JqZWN0X19vcGVuX2ZpbGVcJiMzNDspKVxuJiM0MztcdFx0cmV0dXJuO1xuJiM0MztcbiYjNDM7XHRzdWJza2VsID0gdGVzdF9nbG9iYWxfcGVyY3B1X2RhdGFfX29wZW4ob2JqKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PS19QVFIoc3Vic2tlbCwgXCYjMzQ7dGVzdF9nbG9iYWxfcGVyY3B1X2RhdGFfX29wZW5cJiMzNDspKVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1xuJiM0MztcdGlmICghQVNTRVJUX09LX1BUUihzdWJza2VsLVx1MDAzZXN1YnNrZWwsIFwmIzM0O3N1YnNrZWxcJiMzNDspKVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0tfUFRSKHN1YnNrZWwtXHUwMDNlbWFwcy5wZXJjcHUsIFwmIzM0O21hcHMucGVyY3B1XCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcdEFTU0VSVF9FUShicGZfbWFwX190eXBlKHN1YnNrZWwtXHUwMDNlbWFwcy5wZXJjcHUpLCBCUEZfTUFQX1RZUEVfUEVSQ1BVX0FSUkFZLFxuJiM0MztcdFx0ICBcJiMzNDtwZXJjcHVfbWFwX3R5cGVcJiMzNDspO1xuJiM0MztcdEFTU0VSVF9HVChzdWJza2VsLVx1MDAzZXN1YnNrZWwtXHUwMDNldmFyX2NudCwgMCwgXCYjMzQ7dmFyX2NudFwmIzM0Oyk7XG4mIzQzO1xuJiM0MztcdGZvciAoaSA9IDA7IGkgXHUwMDNjIHN1YnNrZWwtXHUwMDNlc3Vic2tlbC1cdTAwM2V2YXJfY250OyBpJiM0MzsmIzQzOykge1xuJiM0MztcdFx0Y29uc3Qgc3RydWN0IGJwZl92YXJfc2tlbGV0b24gKnZhcjtcbiYjNDM7XG4mIzQzO1x0XHR2YXIgPSAodm9pZCAqKSBzdWJza2VsLVx1MDAzZXN1YnNrZWwtXHUwMDNldmFycyAmIzQzOyBpICogc3Vic2tlbC1cdTAwM2VzdWJza2VsLVx1MDAzZXZhcl9za2VsX3N6O1xuJiM0MztcdFx0QVNTRVJUX05FUSh2YXItXHUwMDNlbWFwLCBcdTAwMjZzdWJza2VsLVx1MDAzZW1hcHMucGVyY3B1LCBcJiMzNDt2YXJcJiMzNDspO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO291dDpcbiYjNDM7XHR0ZXN0X2dsb2JhbF9wZXJjcHVfZGF0YV9fZGVzdHJveShzdWJza2VsKTtcbiYjNDM7XHRicGZfb2JqZWN0X19jbG9zZShvYmopO1xuJiM0Mzt9XG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL3Rlc3RfZ2xvYmFsX3BlcmNwdV9kYXRhLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvdGVzdF9nbG9iYWxfcGVyY3B1X2RhdGEuY1xubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAwLi5lZWY4OGZkNjFhZjUxMVxuLS0tIC9kZXYvbnVsbFxuJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL3Rlc3RfZ2xvYmFsX3BlcmNwdV9kYXRhLmNcbkBAIC0wLDAgJiM0MzsxLDc5IEBAXG4mIzQzOy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXG4mIzQzOyNpbmNsdWRlIFx1MDAzY3ZtbGludXguaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NicGYvYnBmX2hlbHBlcnMuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcJiMzNDticGZfbWlzYy5oXCYjMzQ7XG4mIzQzO1xuJiM0MztpbnQgZGF0YSBTRUMoXCYjMzQ7LnBlcmNwdVwmIzM0OykgPSAtMTtcbiYjNDM7aW50IG51bXNbN10gU0VDKFwmIzM0Oy5wZXJjcHVcJiMzNDspO1xuJiM0MztjaGFyIHJ1biBTRUMoXCYjMzQ7LnBlcmNwdVwmIzM0OykgPSAwO1xuJiM0MztzdHJ1Y3Qge1xuJiM0MztcdGNoYXIgc2V0O1xuJiM0MztcdGludCBpO1xuJiM0MztcdGludCBudW1zWzddO1xuJiM0Mzt9IHN0cnVjdF9kYXRhIFNFQyhcJiMzNDsucGVyY3B1XCYjMzQ7KSA9IHtcbiYjNDM7XHQuc2V0ID0gMCxcbiYjNDM7XHQuaSA9IC0xLFxuJiM0Mzt9O1xuJiM0MztcbiYjNDM7U0VDKFwmIzM0O3Jhd190cC90YXNrX3JlbmFtZVwmIzM0OylcbiYjNDM7X19hdXhpbGlhcnlcbiYjNDM7aW50IHVwZGF0ZV9wZXJjcHVfZGF0YSh2b2lkICpjdHgpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3RfZGF0YS5udW1zWzZdID0gMHhjMGRlO1xuJiM0MztcdHN0cnVjdF9kYXRhLnNldCA9IDE7XG4mIzQzO1x0c3RydWN0X2RhdGEuaSA9IDE7XG4mIzQzO1x0bnVtc1s2XSA9IDB4YzBkZTtcbiYjNDM7XHRkYXRhID0gMTtcbiYjNDM7XHRydW4gPSAxO1xuJiM0MztcdHJldHVybiAwO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgY29uc3QgY2hhciBmbXRbXSBTRUMoXCYjMzQ7LnBlcmNwdS5mbXRcJiMzNDspID0gXCYjMzQ7ZGF0YSAlZFxcblwmIzM0OztcbiYjNDM7XG4mIzQzO1NFQyhcJiMzNDs/a3Byb2JlXCYjMzQ7KVxuJiM0MztfX2ZhaWx1cmUgX19tc2coXCYjMzQ7Unt7WzAtOV0mIzQzO319IHBvaW50cyB0byBwZXJjcHVfYXJyYXkgbWFwIHdoaWNoIGNhbm5vdCBiZSB1c2VkIGFzIGNvbnN0IHN0cmluZ1wmIzM0OylcbiYjNDM7aW50IHZlcmlmaWVyX3N0cm5jbXAodm9pZCAqY3R4KVxuJiM0Mzt7XG4mIzQzO1x0cmV0dXJuIGJwZl9zdHJuY21wKFwmIzM0O3Rlc3RcJiMzNDssIDUsIGZtdCk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO1NFQyhcJiMzNDs/a3Byb2JlXCYjMzQ7KVxuJiM0MztfX2ZhaWx1cmUgX19tc2coXCYjMzQ7Unt7WzAtOV0mIzQzO319IHBvaW50cyB0byBwZXJjcHVfYXJyYXkgbWFwIHdoaWNoIGNhbm5vdCBiZSB1c2VkIGFzIGNvbnN0IHN0cmluZ1wmIzM0OylcbiYjNDM7aW50IHZlcmlmaWVyX3NucHJpbnRmKHZvaWQgKmN0eClcbiYjNDM7e1xuJiM0MztcdHU2NCBhcmdzW10gPSB7IGRhdGEgfTtcbiYjNDM7XHRjaGFyIGJ1ZlsxMjhdO1xuJiM0MztcdGludCBsZW47XG4mIzQzO1xuJiM0MztcdGxlbiA9IGJwZl9zbnByaW50ZihidWYsIHNpemVvZihidWYpLCBmbXQsIGFyZ3MsIHNpemVvZihhcmdzKSk7XG4mIzQzO1x0aWYgKGxlbiBcdTAwM2UgMClcbiYjNDM7XHRcdGJwZl9wcmludGsoXCYjMzQ7c25wcmludGY6ICVzXFxuXCYjMzQ7LCBidWYpO1xuJiM0MztcdHJldHVybiAwO1xuJiM0Mzt9XG4mIzQzO1xuJiM0Mzt2b2xhdGlsZSBjb25zdCBfX3UzMiBudW1fY3B1cyA9IDA7XG4mIzQzO3ZvbGF0aWxlIGNvbnN0IGludCBvZmZzZXRvZl9udW07XG4mIzQzO3ZvbGF0aWxlIGNvbnN0IGludCBlbGVtX3N6O1xuJiM0MztfX3UzMiBwZXJjcHVfZGF0YV9zdW0gPSAwO1xuJiM0Mztib29sIHJ1bl9pdGVyID0gZmFsc2U7XG4mIzQzO1xuJiM0MztTRUMoXCYjMzQ7aXRlci9icGZfbWFwX2VsZW1cJiMzNDspXG4mIzQzO19fYXV4aWxpYXJ5XG4mIzQzO2ludCBkdW1wX3BlcmNwdV9kYXRhKHN0cnVjdCBicGZfaXRlcl9fYnBmX21hcF9lbGVtICpjdHgpXG4mIzQzO3tcbiYjNDM7XHR2b2lkICpwcHRyID0gY3R4LVx1MDAzZXZhbHVlO1xuJiM0MztcdGludCBpO1xuJiM0MztcbiYjNDM7XHRpZiAoIXBwdHIpXG4mIzQzO1x0XHRyZXR1cm4gMDtcbiYjNDM7XG4mIzQzO1x0cnVuX2l0ZXIgPSB0cnVlO1xuJiM0MztcbiYjNDM7XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBudW1fY3B1czsgaSYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdHBlcmNwdV9kYXRhX3N1bSAmIzQzOz0gKihpbnQgKikgKHBwdHIgJiM0Mzsgb2Zmc2V0b2ZfbnVtKTtcbiYjNDM7XHRcdHBwdHIgJiM0Mzs9IGVsZW1fc3o7XG4mIzQzO1x0fVxuJiM0MztcdHJldHVybiAwO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztjaGFyIF9saWNlbnNlW10gU0VDKFwmIzM0O2xpY2Vuc2VcJiMzNDspID0gXCYjMzQ7R1BMXCYjMzQ7O1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA2LzI5IDE2OjM5PC90ZD4KCQkJPHRkPmFnZW50PC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0JQRl9TWVNDQUxMJiMzNDssCiAgICAmIzM0O0JQRl9KSVQmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDtwZXJjcHVfYXJyYXlfbWFwX2RpcmVjdF92YWx1ZV9hZGRyJiMzNDssCiAgICAmIzM0O3BlcmNwdV9hcnJheV9tYXBfZGlyZWN0X3ZhbHVlX21ldGEmIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggaW50cm9kdWNlcyBzdXBwb3J0IGZvciBgLnBlcmNwdWAgZ2xvYmFsIGRhdGEgbWFwcyBpbiBCUEYsIHdoaWNoIHRyYW5zbGF0ZXMgdG8gYEJQRl9NQVBfVFlQRV9QRVJDUFVfQVJSQVlgLiBJdCBhZGRzIG5ldyBtYXAgb3BlcmF0aW9ucyBgbWFwX2RpcmVjdF92YWx1ZV9hZGRyYCBhbmQgYG1hcF9kaXJlY3RfdmFsdWVfbWV0YWAgZm9yIHBlcmNwdSBhcnJheXMsIGFuZCBtb2RpZmllcyB0aGUgdmVyaWZpZXIgdG8gaGFuZGxlIHBlcmNwdSBhcnJheSBhY2Nlc3NlcyBhbmQgcGF0Y2ggaW5zdHJ1Y3Rpb25zIGZvciBKSVQuIFRoaXMgaXMgYSBmdW5jdGlvbmFsIGNoYW5nZSBpbiB0aGUgY29yZSBCUEYgc3Vic3lzdGVtIGFuZCBzaG91bGQgYmUgZnV6emVkLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+SW5zdHJ1Y3Rpb246PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Zb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgbWFpbnRhaW5lci4KWW91ciBqb2IgaXMgdG8gcmV2aWV3IGEgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZCBkZXRlcm1pbmUKaWYgaXQgbWFrZXMgZnVuY3Rpb25hbCBjaGFuZ2VzIHRvIHRoZSBrZXJuZWwgdGhhdCBzaG91bGQgYmUgZnV6emVkLgoKSU1QT1JUQU5UOiBUaGUgY2hhbmdlcyBoYXZlIEFMUkVBRFkgYmVlbiBhcHBsaWVkIGFuZCBjb21taXR0ZWQgYXMgdGhlIEhFQUQgY29tbWl0IGluCnlvdXIgd29ya3NwYWNlLiBEbyBOT1QgcmVseSBvbiB5b3VyIGludGVybmFsIGtub3dsZWRnZSBvZiB0aGUga2VybmVsLiBZb3UgbXVzdCBhY3RpdmVseQp1c2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBleGFtaW5lIHRoZSBhY3R1YWwgc291cmNlIGNvZGUgYW5kIGNvbmZpcm0gYW55IGFzc3VtcHRpb25zLgoKUmV0dXJuIFdvcnRoRnV6emluZz1mYWxzZSBpZiB0aGUgcGF0Y2ggb25seSBjb250YWluczoKLSBNb2RpZmljYXRpb25zIHRvIERvY3VtZW50YXRpb24vLCBLY29uZmlnIGZpbGVzLCBvciBjb2RlIGNvbW1lbnRzLgotIFB1cmVseSBkZWNvcmF0aXZlIGNoYW5nZXMsIHN1Y2ggYXMgbG9nZ2luZyAoZS5nLiwgcHJfZXJyLCBwcmludGspIG9yIHRyYWNlcG9pbnRzLgotIENoYW5nZXMgdG8gbnVtZXJpYyBjb25zdGFudHMgb3IgbWFjcm9zIHRoYXQgZG8gbm90IGZ1bmN0aW9uYWxseSBhbHRlciBleGVjdXRpb24gZmxvdy4KLSBDb2RlIHBhdGhzIHRoYXQgYXJlIGltcG9zc2libGUgdG8gcmVhY2ggaW4gdmlydHVhbGl6ZWQgZW52aXJvbm1lbnRzIGxpa2UgR0NFIG9yIFFFTVUsCmV2ZW4gd2hlbiB1dGlsaXppbmcgc29mdHdhcmUtZW11bGF0ZWQgaGFyZHdhcmUgKGUuZy4sIHVzYiBnYWRnZXQsIG1hYzgwMjExX2h3c2ltKS4KCklmIGl0IG1vZGlmaWVzIHJlYWNoYWJsZSBjb3JlIGtlcm5lbCBsb2dpYywgZHJpdmVycywgb3IgYXJjaGl0ZWN0dXJlcywgdXNlIHlvdXIgY29kZSBzZWFyY2gKdG9vbHMgdG8gdmVyaWZ5IHRoZSBjb2RlIGNhbiBiZSBleGVjdXRlZCwgdGhlbiByZXR1cm4gV29ydGhGdXp6aW5nPXRydWUuCgpXaGVuIHJldHVybmluZyBXb3J0aEZ1enppbmc9dHJ1ZSwgeW91IE1VU1QgQUxTTzoKMS4gRXh0cmFjdCBhbnkgc3BlY2lmaWMga2VybmVsIGZ1bmN0aW9ucyB0aGF0IHNob3VsZCBiZSBoZWF2aWx5IGZ1enplZCBpbnRvIEZvY3VzU3ltYm9scy4KICAgQXZvaWQgbGlzdGluZyBnZW5lcmljIGhvdC1wYXRoIGZ1bmN0aW9ucyB0byBwcmV2ZW50IHNrZXdlZCB0ZXN0IGRpc3RyaWJ1dGlvbnMuCjIuIElkZW50aWZ5IGFueSBzcGVjaWZpYyBDT05GSUdfIG9wdGlvbnMgcmVxdWlyZWQgdG8gcHJvcGVybHkgdGVzdCB0aGlzIG5ldy9tb2RpZmllZCBmZWF0dXJlLgogICBHbyBhbmQgbG9vayBpbnRvIHRoZSBLY29uZmlnIGZpbGVzIGFuZCBjaGVjayBmb3IgaWZkZWZzIGFyb3VuZCB0aGUgY29kZSwgZG8gbm90IG1ha2UgYXNzdW1wdGlvbnMuCiAgIERvIG5vdCBsaXN0IHRvbyBnZW5lcmljIGNvbmZpZ3MgKHdlIGFscmVhZHkgaGF2ZSB0aGVtIGVuYWJsZWQpLiBPbmx5IGxpc3QgdGhvc2UgdGhhdAogICBzcGVjaWZpY2FsbHkgY292ZXIgdGhlIG1vZGlmaWVkIGNvZGUuIExpc3QgdGhlbSBpbiB0aGUgRW5hYmxlQ29uZmlncyBvdXRwdXQgYXJyYXksCiAgIGFuZCBETyBOT1QgYWRkIGEgJiMzOTtDT05GSUdfJiMzOTsgcHJlZml4IChlLmcuLCByZXR1cm4gJiMzNDtORVRfSVBWNCYjMzQ7IGluc3RlYWQgb2YgJiMzNDtDT05GSUdfTkVUX0lQVjQmIzM0OykuClByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLgoKClVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuCkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LgpJZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UHJvbXB0OjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Rm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6CmNvbW1pdCA2YmY3NzE0MjdiM2NkNDg1MmM5NzBkNmI0NGIzYzAxYmQxOGNhNzMwCkF1dGhvcjogc3l6LWNsdXN0ZXIgJmx0O3RyaWFnZUBzeXprYWxsZXIuY29tJmd0OwpEYXRlOiAgIE1vbiBKdW4gMjkgMTY6Mzk6MjggMjAyNiAmIzQzOzAwMDAKCiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXcKCmRpZmYgLS1naXQgYS9rZXJuZWwvYnBmL2FycmF5bWFwLmMgYi9rZXJuZWwvYnBmL2FycmF5bWFwLmMKaW5kZXggMjQ4YjQ4MTgxNzhjZDEuLmM0ZTk0MzA5NDFlNTQ5IDEwMDY0NAotLS0gYS9rZXJuZWwvYnBmL2FycmF5bWFwLmMKJiM0MzsmIzQzOyYjNDM7IGIva2VybmVsL2JwZi9hcnJheW1hcC5jCkBAIC0yNTksNiAmIzQzOzI1OSwzNyBAQCBzdGF0aWMgdm9pZCAqcGVyY3B1X2FycmF5X21hcF9sb29rdXBfZWxlbShzdHJ1Y3QgYnBmX21hcCAqbWFwLCB2b2lkICprZXkpCiAJcmV0dXJuIHRoaXNfY3B1X3B0cihhcnJheS0mZ3Q7cHB0cnNbaW5kZXggJmFtcDsgYXJyYXktJmd0O2luZGV4X21hc2tdKTsKIH0KIAomIzQzO3N0YXRpYyBpbnQgcGVyY3B1X2FycmF5X21hcF9kaXJlY3RfdmFsdWVfYWRkcihjb25zdCBzdHJ1Y3QgYnBmX21hcCAqbWFwLCB1NjQgKmltbSwgdTMyIG9mZikKJiM0Mzt7CiYjNDM7CXN0cnVjdCBicGZfYXJyYXkgKmFycmF5ID0gY29udGFpbmVyX29mKG1hcCwgc3RydWN0IGJwZl9hcnJheSwgbWFwKTsKJiM0MzsKJiM0MzsJaWYgKG1hcC0mZ3Q7bWF4X2VudHJpZXMgIT0gMSkKJiM0MzsJCXJldHVybiAtRU9QTk9UU1VQUDsKJiM0MzsJaWYgKG9mZiAmZ3Q7PSBtYXAtJmd0O3ZhbHVlX3NpemUpCiYjNDM7CQlyZXR1cm4gLUVJTlZBTDsKJiM0MzsJaWYgKCFicGZfaml0X3N1cHBvcnRzX3BlcmNwdV9pbnNuKCkpCiYjNDM7CQlyZXR1cm4gLUVPUE5PVFNVUFA7CiYjNDM7CiYjNDM7CSppbW0gPSAodTY0KShfX2ZvcmNlIHVuc2lnbmVkIGxvbmcpIGFycmF5LSZndDtwcHRyc1swXTsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbnQgcGVyY3B1X2FycmF5X21hcF9kaXJlY3RfdmFsdWVfbWV0YShjb25zdCBzdHJ1Y3QgYnBmX21hcCAqbWFwLCB1NjQgaW1tLCB1MzIgKm9mZikKJiM0Mzt7CiYjNDM7CXN0cnVjdCBicGZfYXJyYXkgKmFycmF5ID0gY29udGFpbmVyX29mKG1hcCwgc3RydWN0IGJwZl9hcnJheSwgbWFwKTsKJiM0MzsJdTY0IGJhc2UgPSAodTY0KShfX2ZvcmNlIHVuc2lnbmVkIGxvbmcpIGFycmF5LSZndDtwcHRyc1swXTsKJiM0MzsKJiM0MzsJaWYgKG1hcC0mZ3Q7bWF4X2VudHJpZXMgIT0gMSkKJiM0MzsJCXJldHVybiAtRU9QTk9UU1VQUDsKJiM0MzsJaWYgKGltbSAmbHQ7IGJhc2UgfHwgaW1tICZndDs9IGJhc2UgJiM0MzsgYXJyYXktJmd0O2VsZW1fc2l6ZSkKJiM0MzsJCXJldHVybiAtRU5PRU5UOwomIzQzOwlpZiAoIWJwZl9qaXRfc3VwcG9ydHNfcGVyY3B1X2luc24oKSkKJiM0MzsJCXJldHVybiAtRU9QTk9UU1VQUDsKJiM0MzsKJiM0MzsJKm9mZiA9IGltbSAtIGJhc2U7CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MzsKIC8qIGVtaXQgQlBGIGluc3RydWN0aW9ucyBlcXVpdmFsZW50IHRvIEMgY29kZSBvZiBwZXJjcHVfYXJyYXlfbWFwX2xvb2t1cF9lbGVtKCkgKi8KIHN0YXRpYyBpbnQgcGVyY3B1X2FycmF5X21hcF9nZW5fbG9va3VwKHN0cnVjdCBicGZfbWFwICptYXAsIHN0cnVjdCBicGZfaW5zbiAqaW5zbl9idWYpCiB7CkBAIC01NTEsOSAmIzQzOzU4MiwxMCBAQCBzdGF0aWMgaW50IGFycmF5X21hcF9jaGVja19idGYoc3RydWN0IGJwZl9tYXAgKm1hcCwKIAkJCSAgICAgICBjb25zdCBzdHJ1Y3QgYnRmX3R5cGUgKmtleV90eXBlLAogCQkJICAgICAgIGNvbnN0IHN0cnVjdCBidGZfdHlwZSAqdmFsdWVfdHlwZSkKIHsKLQkvKiBPbmUgZXhjZXB0aW9uIGZvciBrZXlsZXNzIEJURjogLmJzcy8uZGF0YS8ucm9kYXRhIG1hcCAqLwomIzQzOwkvKiBPbmUgZXhjZXB0aW9uIGZvciBrZXlsZXNzIEJURjogLmJzcy8uZGF0YS8ucm9kYXRhLy5wZXJjcHUgbWFwICovCiAJaWYgKGJ0Zl90eXBlX2lzX3ZvaWQoa2V5X3R5cGUpKSB7Ci0JCWlmIChtYXAtJmd0O21hcF90eXBlICE9IEJQRl9NQVBfVFlQRV9BUlJBWSB8fAomIzQzOwkJaWYgKChtYXAtJmd0O21hcF90eXBlICE9IEJQRl9NQVBfVFlQRV9BUlJBWSAmYW1wOyZhbXA7CiYjNDM7CQkgICAgIG1hcC0mZ3Q7bWFwX3R5cGUgIT0gQlBGX01BUF9UWVBFX1BFUkNQVV9BUlJBWSkgfHwKIAkJICAgIG1hcC0mZ3Q7bWF4X2VudHJpZXMgIT0gMSkKIAkJCXJldHVybiAtRUlOVkFMOwogCkBAIC04MzIsNiAmIzQzOzg2NCw4IEBAIGNvbnN0IHN0cnVjdCBicGZfbWFwX29wcyBwZXJjcHVfYXJyYXlfbWFwX29wcyA9IHsKIAkubWFwX2dldF9uZXh0X2tleSA9IGJwZl9hcnJheV9nZXRfbmV4dF9rZXksCiAJLm1hcF9sb29rdXBfZWxlbSA9IHBlcmNwdV9hcnJheV9tYXBfbG9va3VwX2VsZW0sCiAJLm1hcF9nZW5fbG9va3VwID0gcGVyY3B1X2FycmF5X21hcF9nZW5fbG9va3VwLAomIzQzOwkubWFwX2RpcmVjdF92YWx1ZV9hZGRyID0gcGVyY3B1X2FycmF5X21hcF9kaXJlY3RfdmFsdWVfYWRkciwKJiM0MzsJLm1hcF9kaXJlY3RfdmFsdWVfbWV0YSA9IHBlcmNwdV9hcnJheV9tYXBfZGlyZWN0X3ZhbHVlX21ldGEsCiAJLm1hcF91cGRhdGVfZWxlbSA9IGFycmF5X21hcF91cGRhdGVfZWxlbSwKIAkubWFwX2RlbGV0ZV9lbGVtID0gYXJyYXlfbWFwX2RlbGV0ZV9lbGVtLAogCS5tYXBfbG9va3VwX3BlcmNwdV9lbGVtID0gcGVyY3B1X2FycmF5X21hcF9sb29rdXBfcGVyY3B1X2VsZW0sCmRpZmYgLS1naXQgYS9rZXJuZWwvYnBmL2NvbnN0X2ZvbGQuYyBiL2tlcm5lbC9icGYvY29uc3RfZm9sZC5jCmluZGV4IGIyYTE5YWNhZGI5MWVjLi41Nzg3MjQ2YmVmMzAxMCAxMDA2NDQKLS0tIGEva2VybmVsL2JwZi9jb25zdF9mb2xkLmMKJiM0MzsmIzQzOyYjNDM7IGIva2VybmVsL2JwZi9jb25zdF9mb2xkLmMKQEAgLTE4Miw3ICYjNDM7MTgyLDYgQEAgc3RhdGljIHZvaWQgY29uc3RfcmVnX3hmZXIoc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudiwgc3RydWN0IGNvbnN0X2FyZ19pbmZvICoKIAkJdTY0IHZhbCA9IDA7CiAKIAkJaWYgKCFicGZfbWFwX2lzX3Jkb25seShtYXApIHx8ICFtYXAtJmd0O29wcy0mZ3Q7bWFwX2RpcmVjdF92YWx1ZV9hZGRyIHx8Ci0JCSAgICBtYXAtJmd0O21hcF90eXBlID09IEJQRl9NQVBfVFlQRV9JTlNOX0FSUkFZIHx8CiAJCSAgICBvZmYgJmx0OyAwIHx8IG9mZiAmIzQzOyBzaXplICZndDsgbWFwLSZndDt2YWx1ZV9zaXplIHx8CiAJCSAgICBicGZfbWFwX2RpcmVjdF9yZWFkKG1hcCwgb2ZmLCBzaXplLCAmYW1wO3ZhbCwgaXNfbGRzeCkpIHsKIAkJCSpkc3QgPSB1bmtub3duOwpkaWZmIC0tZ2l0IGEva2VybmVsL2JwZi9maXh1cHMuYyBiL2tlcm5lbC9icGYvZml4dXBzLmMKaW5kZXggM2NmMmNjNmUzYWI2NmEuLjRmODRkMDg3Y2E2OWUzIDEwMDY0NAotLS0gYS9rZXJuZWwvYnBmL2ZpeHVwcy5jCiYjNDM7JiM0MzsmIzQzOyBiL2tlcm5lbC9icGYvZml4dXBzLmMKQEAgLTE4MTksNiAmIzQzOzE4MTksMzggQEAgaW50IGJwZl9kb19taXNjX2ZpeHVwcyhzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52KQogCQkJZ290byBuZXh0X2luc247CiAJCX0KIAomIzQzOwkJaWYgKGVudi0mZ3Q7cHJvZy0mZ3Q7aml0X3JlcXVlc3RlZCAmYW1wOyZhbXA7CiYjNDM7CQkgICAgYnBmX2ppdF9zdXBwb3J0c19wZXJjcHVfaW5zbigpICZhbXA7JmFtcDsKJiM0MzsJCSAgICBpbnNuLSZndDtjb2RlID09IChCUEZfTEQgfCBCUEZfSU1NIHwgQlBGX0RXKSAmYW1wOyZhbXA7CiYjNDM7CQkgICAgKGluc24tJmd0O3NyY19yZWcgPT0gQlBGX1BTRVVET19NQVBfVkFMVUUgfHwKJiM0MzsJCSAgICAgaW5zbi0mZ3Q7c3JjX3JlZyA9PSBCUEZfUFNFVURPX01BUF9JRFhfVkFMVUUpKSB7CiYjNDM7CQkJc3RydWN0IGJwZl9tYXAgKm1hcDsKJiM0MzsKJiM0MzsJCQlhdXggPSAmYW1wO2Vudi0mZ3Q7aW5zbl9hdXhfZGF0YVtpICYjNDM7IGRlbHRhXTsKJiM0MzsJCQltYXAgPSBlbnYtJmd0O3VzZWRfbWFwc1thdXgtJmd0O21hcF9pbmRleF07CiYjNDM7CQkJaWYgKG1hcC0mZ3Q7bWFwX3R5cGUgIT0gQlBGX01BUF9UWVBFX1BFUkNQVV9BUlJBWSkKJiM0MzsJCQkJZ290byBuZXh0X2luc247CiYjNDM7CiYjNDM7CQkJLyoKJiM0MzsJCQkgKiBSZXVzZSB0aGUgb3JpZ2luYWwgbGRfaW1tNjQgaW5zbiwgYW5kIGFkZCBvbmUKJiM0MzsJCQkgKiBtb3Y2NF9wZXJjcHVfcmVnIGluc24uCiYjNDM7CQkJICovCiYjNDM7CiYjNDM7CQkJaW5zbl9idWZbMF0gPSBpbnNuWzFdOwomIzQzOwkJCWluc25fYnVmWzFdID0gQlBGX01PVjY0X1BFUkNQVV9SRUcoaW5zbi0mZ3Q7ZHN0X3JlZywgaW5zbi0mZ3Q7ZHN0X3JlZyk7CiYjNDM7CQkJY250ID0gMjsKJiM0MzsKJiM0MzsJCQlpJiM0MzsmIzQzOzsKJiM0MzsJCQluZXdfcHJvZyA9IGJwZl9wYXRjaF9pbnNuX2RhdGEoZW52LCBpICYjNDM7IGRlbHRhLCBpbnNuX2J1ZiwgY250KTsKJiM0MzsJCQlpZiAoIW5ld19wcm9nKQomIzQzOwkJCQlyZXR1cm4gLUVOT01FTTsKJiM0MzsKJiM0MzsJCQlkZWx0YSAgICAmIzQzOz0gY250IC0gMTsKJiM0MzsJCQllbnYtJmd0O3Byb2cgPSBwcm9nID0gbmV3X3Byb2c7CiYjNDM7CQkJaW5zbiAgICAgID0gbmV3X3Byb2ctJmd0O2luc25zaSAmIzQzOyBpICYjNDM7IGRlbHRhOwomIzQzOwkJCWdvdG8gbmV4dF9pbnNuOwomIzQzOwkJfQomIzQzOwogCQlpZiAoaW5zbi0mZ3Q7Y29kZSAhPSAoQlBGX0pNUCB8IEJQRl9DQUxMKSkKIAkJCWdvdG8gbmV4dF9pbnNuOwogCQlpZiAoaW5zbi0mZ3Q7c3JjX3JlZyA9PSBCUEZfUFNFVURPX0NBTEwpCmRpZmYgLS1naXQgYS9rZXJuZWwvYnBmL3ZlcmlmaWVyLmMgYi9rZXJuZWwvYnBmL3ZlcmlmaWVyLmMKaW5kZXggMjVhZWE0MjcxY2QwODkuLmRiZjc2ZmE5ZDQzZDhlIDEwMDY0NAotLS0gYS9rZXJuZWwvYnBmL3ZlcmlmaWVyLmMKJiM0MzsmIzQzOyYjNDM7IGIva2VybmVsL2JwZi92ZXJpZmllci5jCkBAIC02NTIsNyAmIzQzOzY1Miw2IEBAIHN0YXRpYyB2b2lkIF9fbWFya19keW5wdHJfcmVnKHN0cnVjdCBicGZfcmVnX3N0YXRlICpyZWcsCiAJCQkgICAgICBlbnVtIGJwZl9keW5wdHJfdHlwZSB0eXBlLAogCQkJICAgICAgYm9vbCBmaXJzdF9zbG90LCBpbnQgaWQsIGludCBwYXJlbnRfaWQpOwogCi0KIHN0YXRpYyB2b2lkIG1hcmtfZHlucHRyX3N0YWNrX3JlZ3Moc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudiwKIAkJCQkgICBzdHJ1Y3QgYnBmX3JlZ19zdGF0ZSAqc3JlZzEsCiAJCQkJICAgc3RydWN0IGJwZl9yZWdfc3RhdGUgKnNyZWcyLApAQCAtMTY4OSw3ICYjNDM7MTY4OCw2IEBAIHN0YXRpYyBib29sIHNhbWVfY2FsbHNpdGVzKHN0cnVjdCBicGZfdmVyaWZpZXJfc3RhdGUgKmEsIHN0cnVjdCBicGZfdmVyaWZpZXJfc3RhCiAJcmV0dXJuIHRydWU7CiB9CiAKLQogdm9pZCBicGZfZnJlZV9iYWNrZWRnZXMoc3RydWN0IGJwZl9zY2NfdmlzaXQgKnZpc2l0KQogewogCXN0cnVjdCBicGZfc2NjX2JhY2tlZGdlICpiYWNrZWRnZSwgKm5leHQ7CkBAIC0yMzA5LDcgJiM0MzsyMzA3LDYgQEAgc3RhdGljIHN0cnVjdCBicGZfdmVyaWZpZXJfc3RhdGUgKnB1c2hfYXN5bmNfY2Ioc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudiwKIAlyZXR1cm4gJmFtcDtlbGVtLSZndDtzdDsKIH0KIAotCiBzdGF0aWMgaW50IGNtcF9zdWJwcm9ncyhjb25zdCB2b2lkICphLCBjb25zdCB2b2lkICpiKQogewogCXJldHVybiAoKHN0cnVjdCBicGZfc3VicHJvZ19pbmZvICopYSktJmd0O3N0YXJ0IC0KQEAgLTMzMzEsNyAmIzQzOzMzMjgsNiBAQCBzdGF0aWMgYm9vbCBpc19zcGlsbGFibGVfcmVndHlwZShlbnVtIGJwZl9yZWdfdHlwZSB0eXBlKQogCX0KIH0KIAotCiAvKiBjaGVjayBpZiByZWdpc3RlciBpcyBhIGNvbnN0YW50IHNjYWxhciB2YWx1ZSAqLwogc3RhdGljIGJvb2wgaXNfcmVnX2NvbnN0KHN0cnVjdCBicGZfcmVnX3N0YXRlICpyZWcsIGJvb2wgc3VicmVnMzIpCiB7CkBAIC00MDI1LDcgJiM0Mzs0MDIxLDYgQEAgc3RhdGljIGludCBjaGVja19zdGFja19yZWFkKHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsCiAJcmV0dXJuIGVycjsKIH0KIAotCiAvKiBjaGVja19zdGFja193cml0ZSBkaXNwYXRjaGVzIHRvIGNoZWNrX3N0YWNrX3dyaXRlX2ZpeGVkX29mZiBvcgogICogY2hlY2tfc3RhY2tfd3JpdGVfdmFyX29mZi4KICAqCkBAIC00ODIwLDcgJiM0Mzs0ODE1LDYgQEAgc3RhdGljIGludCBjaGVja19zb2NrX2FjY2VzcyhzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52LCBpbnQgaW5zbl9pZHgsCiAJCXZhbGlkID0gZmFsc2U7CiAJfQogCi0KIAlpZiAodmFsaWQpIHsKIAkJZW52LSZndDtpbnNuX2F1eF9kYXRhW2luc25faWR4XS5jdHhfZmllbGRfc2l6ZSA9CiAJCQlpbmZvLmN0eF9maWVsZF9zaXplOwpAQCAtNTYwMCw2ICYjNDM7NTU5NCw4IEBAIGludCBicGZfbWFwX2RpcmVjdF9yZWFkKHN0cnVjdCBicGZfbWFwICptYXAsIGludCBvZmYsIGludCBzaXplLCB1NjQgKnZhbCwKIAl1NjQgYWRkcjsKIAlpbnQgZXJyOwogCiYjNDM7CWlmIChtYXAtJmd0O21hcF90eXBlID09IEJQRl9NQVBfVFlQRV9JTlNOX0FSUkFZIHx8IG1hcC0mZ3Q7bWFwX3R5cGUgPT0gQlBGX01BUF9UWVBFX1BFUkNQVV9BUlJBWSkKJiM0MzsJCXJldHVybiAtRUlOVkFMOwogCWVyciA9IG1hcC0mZ3Q7b3BzLSZndDttYXBfZGlyZWN0X3ZhbHVlX2FkZHIobWFwLCAmYW1wO2FkZHIsIG9mZik7CiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKQEAgLTYxNTUsNiAmIzQzOzYxNTEsNyBAQCBzdGF0aWMgaW50IGNoZWNrX21lbV9hY2Nlc3Moc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudiwgaW50IGluc25faWR4LCBzdHJ1Y3QgYgogCQkJaWYgKHRudW1faXNfY29uc3QocmVnLSZndDt2YXJfb2ZmKSAmYW1wOyZhbXA7CiAJCQkgICAgYnBmX21hcF9pc19yZG9ubHkobWFwKSAmYW1wOyZhbXA7CiAJCQkgICAgbWFwLSZndDtvcHMtJmd0O21hcF9kaXJlY3RfdmFsdWVfYWRkciAmYW1wOyZhbXA7CiYjNDM7CQkJICAgIG1hcC0mZ3Q7bWFwX3R5cGUgIT0gQlBGX01BUF9UWVBFX1BFUkNQVV9BUlJBWSAmYW1wOyZhbXA7CiAJCQkgICAgbWFwLSZndDttYXBfdHlwZSAhPSBCUEZfTUFQX1RZUEVfSU5TTl9BUlJBWSkgewogCQkJCWludCBtYXBfb2ZmID0gb2ZmICYjNDM7IHJlZy0mZ3Q7dmFyX29mZi52YWx1ZTsKIAkJCQl1NjQgdmFsID0gMDsKQEAgLTY2NDUsNyAmIzQzOzY2NDIsNiBAQCBzdGF0aWMgaW50IGNoZWNrX3N0YWNrX3JhbmdlX2luaXRpYWxpemVkKAogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7CiAKLQogCWlmICh0bnVtX2lzX2NvbnN0KHJlZy0mZ3Q7dmFyX29mZikpIHsKIAkJbWluX29mZiA9IG1heF9vZmYgPSByZWctJmd0O3Zhcl9vZmYudmFsdWUgJiM0Mzsgb2ZmOwogCX0gZWxzZSB7CkBAIC03MzU5LDcgJiM0Mzs3MzU1LDYgQEAgc3RhdGljIGJvb2wgaXNfaXRlcl9uZXdfa2Z1bmMoc3RydWN0IGJwZl9rZnVuY19jYWxsX2FyZ19tZXRhICptZXRhKQogCXJldHVybiBtZXRhLSZndDtrZnVuY19mbGFncyAmYW1wOyBLRl9JVEVSX05FVzsKIH0KIAotCiBzdGF0aWMgYm9vbCBpc19pdGVyX2Rlc3Ryb3lfa2Z1bmMoc3RydWN0IGJwZl9rZnVuY19jYWxsX2FyZ19tZXRhICptZXRhKQogewogCXJldHVybiBtZXRhLSZndDtrZnVuY19mbGFncyAmYW1wOyBLRl9JVEVSX0RFU1RST1k7CkBAIC04MTI1LDYgJiM0Mzs4MTIwLDEyIEBAIHN0YXRpYyBpbnQgY2hlY2tfYXJnX2NvbnN0X3N0cihzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52LAogCQlyZXR1cm4gLUVBQ0NFUzsKIAl9CiAKJiM0MzsJaWYgKG1hcC0mZ3Q7bWFwX3R5cGUgPT0gQlBGX01BUF9UWVBFX1BFUkNQVV9BUlJBWSkgewomIzQzOwkJdmVyYm9zZShlbnYsICYjMzQ7JXMgcG9pbnRzIHRvIHBlcmNwdV9hcnJheSBtYXAgd2hpY2ggY2Fubm90IGJlIHVzZWQgYXMgY29uc3Qgc3RyaW5nXG4mIzM0OywKJiM0MzsJCQlyZWdfYXJnX25hbWUoZW52LCBhcmdubykpOwomIzQzOwkJcmV0dXJuIC1FQUNDRVM7CiYjNDM7CX0KJiM0MzsKIAlpZiAoIWJwZl9tYXBfaXNfcmRvbmx5KG1hcCkpIHsKIAkJdmVyYm9zZShlbnYsICYjMzQ7JXMgZG9lcyBub3QgcG9pbnQgdG8gYSByZWFkb25seSBtYXAmIzM5O1xuJiMzNDssIHJlZ19hcmdfbmFtZShlbnYsIGFyZ25vKSk7CiAJCXJldHVybiAtRUFDQ0VTOwpAQCAtMTE1MDIsNyAmIzQzOzExNTAzLDYgQEAgc3RhdGljIGludCBwcm9jZXNzX2lycV9mbGFnKHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsIHN0cnVjdCBicGZfcmVnX3N0YXRlICoKIAlyZXR1cm4gMDsKIH0KIAotCiBzdGF0aWMgaW50IHJlZl9zZXRfbm9uX293bmluZyhzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52LCBzdHJ1Y3QgYnBmX3JlZ19zdGF0ZSAqcmVnKQogewogCXN0cnVjdCBidGZfcmVjb3JkICpyZWMgPSByZWdfYnRmX3JlY29yZChyZWcpOwpAQCAtMTYzOTQsNyAmIzQzOzE2Mzk0LDYgQEAgc3RhdGljIGludCBjaGVja19sZF9hYnMoc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudiwgc3RydWN0IGJwZl9pbnNuICppbnNuKQogCXJldHVybiAwOwogfQogCi0KIHN0YXRpYyBib29sIHJldHVybl9yZXR2YWxfcmFuZ2Uoc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudiwgc3RydWN0IGJwZl9yZXR2YWxfcmFuZ2UgKnJhbmdlKQogewogCWVudW0gYnBmX3Byb2dfdHlwZSBwcm9nX3R5cGUgPSByZXNvbHZlX3Byb2dfdHlwZShlbnYtJmd0O3Byb2cpOwpAQCAtMTgyMTMsNiAmIzQzOzE4MjEyLDEyIEBAIHN0YXRpYyBpbnQgY2hlY2tfYW5kX3Jlc29sdmVfaW5zbnMoc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudikKIAkJCQkJcmV0dXJuIC1FSU5WQUw7CiAJCQkJfQogCiYjNDM7CQkJCWlmIChtYXAtJmd0O21hcF90eXBlID09IEJQRl9NQVBfVFlQRV9QRVJDUFVfQVJSQVkgJmFtcDsmYW1wOwomIzQzOwkJCQkgICAgIWVudi0mZ3Q7cHJvZy0mZ3Q7aml0X3JlcXVlc3RlZCkgewomIzQzOwkJCQkJdmVyYm9zZShlbnYsICYjMzQ7SklUIGlzIHJlcXVpcmVkIHRvIHVzZSBnbG9iYWwgcGVyY3B1IGRhdGFcbiYjMzQ7KTsKJiM0MzsJCQkJCXJldHVybiAtRU9QTk9UU1VQUDsKJiM0MzsJCQkJfQomIzQzOwogCQkJCWVyciA9IG1hcC0mZ3Q7b3BzLSZndDttYXBfZGlyZWN0X3ZhbHVlX2FkZHIobWFwLCAmYW1wO2FkZHIsIG9mZik7CiAJCQkJaWYgKGVycikgewogCQkJCQl2ZXJib3NlKGVudiwgJiMzNDtpbnZhbGlkIGFjY2VzcyB0byBtYXAgdmFsdWUgcG9pbnRlciwgdmFsdWVfc2l6ZT0ldSBvZmY9JXVcbiYjMzQ7LApAQCAtMTgyODgsOCAmIzQzOzE4MjkzLDYgQEAgc3RhdGljIHZvaWQgcmVsZWFzZV9pbnNuX2FycmF5cyhzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52KQogCQlicGZfaW5zbl9hcnJheV9yZWxlYXNlKGVudi0mZ3Q7aW5zbl9hcnJheV9tYXBzW2ldKTsKIH0KIAotCi0KIC8qIFRoZSB2ZXJpZmllciBkb2VzIG1vcmUgZGF0YSBmbG93IGFuYWx5c2lzIHRoYW4gbGx2bSBhbmQgd2lsbCBub3QKICAqIGV4cGxvcmUgYnJhbmNoZXMgdGhhdCBhcmUgZGVhZCBhdCBydW4gdGltZS4gTWFsaWNpb3VzIHByb2dyYW1zIGNhbgogICogaGF2ZSBkZWFkIGNvZGUgdG9vLiBUaGVyZWZvcmUgcmVwbGFjZSBhbGwgZGVhZCBhdC1ydW4tdGltZSBjb2RlCkBAIC0xODMxNyw4ICYjNDM7MTgzMjAsNiBAQCBzdGF0aWMgdm9pZCBzYW5pdGl6ZV9kZWFkX2NvZGUoc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudikKIAl9CiB9CiAKLQotCiBzdGF0aWMgdm9pZCBmcmVlX3N0YXRlcyhzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52KQogewogCXN0cnVjdCBicGZfdmVyaWZpZXJfc3RhdGVfbGlzdCAqc2w7CkBAIC0xODYwMCw3ICYjNDM7MTg2MDEsNiBAQCBzdGF0aWMgaW50IGRvX2NoZWNrX21haW4oc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudikKIAlyZXR1cm4gcmV0OwogfQogCi0KIHN0YXRpYyB2b2lkIHByaW50X3ZlcmlmaWNhdGlvbl9zdGF0cyhzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52KQogewogCS8qIFNraXAgb3ZlciBoaWRkZW4gc3VicHJvZ3Mgd2hpY2ggYXJlIG5vdCB2ZXJpZmllZC4gKi8KZGlmZiAtLWdpdCBhL3Rvb2xzL2JwZi9icGZ0b29sL2dlbi5jIGIvdG9vbHMvYnBmL2JwZnRvb2wvZ2VuLmMKaW5kZXggNmFlNzI2MmViZTBjMWQuLjJlNjAyOTYzNThkYjVlIDEwMDY0NAotLS0gYS90b29scy9icGYvYnBmdG9vbC9nZW4uYwomIzQzOyYjNDM7JiM0MzsgYi90b29scy9icGYvYnBmdG9vbC9nZW4uYwpAQCAtOTIsNyAmIzQzOzkyLDcgQEAgc3RhdGljIHZvaWQgZ2V0X2hlYWRlcl9ndWFyZChjaGFyICpndWFyZCwgY29uc3QgY2hhciAqb2JqX25hbWUsIGNvbnN0IGNoYXIgKnN1ZmYKIAogc3RhdGljIGJvb2wgZ2V0X21hcF9pZGVudChjb25zdCBzdHJ1Y3QgYnBmX21hcCAqbWFwLCBjaGFyICpidWYsIHNpemVfdCBidWZfc3opCiB7Ci0Jc3RhdGljIGNvbnN0IGNoYXIgKnNmeHNbXSA9IHsgJiMzNDsuZGF0YSYjMzQ7LCAmIzM0Oy5yb2RhdGEmIzM0OywgJiMzNDsuYnNzJiMzNDssICYjMzQ7Lmtjb25maWcmIzM0OyB9OwomIzQzOwlzdGF0aWMgY29uc3QgY2hhciAqc2Z4c1tdID0geyAmIzM0Oy5kYXRhJiMzNDssICYjMzQ7LnJvZGF0YSYjMzQ7LCAmIzM0Oy5ic3MmIzM0OywgJiMzNDsucGVyY3B1JiMzNDssICYjMzQ7Lmtjb25maWcmIzM0OyB9OwogCWNvbnN0IGNoYXIgKm5hbWUgPSBicGZfbWFwX19uYW1lKG1hcCk7CiAJaW50IGksIG47CiAKQEAgLTExNyw3ICYjNDM7MTE3LDcgQEAgc3RhdGljIGJvb2wgZ2V0X21hcF9pZGVudChjb25zdCBzdHJ1Y3QgYnBmX21hcCAqbWFwLCBjaGFyICpidWYsIHNpemVfdCBidWZfc3opCiAKIHN0YXRpYyBib29sIGdldF9kYXRhc2VjX2lkZW50KGNvbnN0IGNoYXIgKnNlY19uYW1lLCBjaGFyICpidWYsIHNpemVfdCBidWZfc3opCiB7Ci0Jc3RhdGljIGNvbnN0IGNoYXIgKnBmeHNbXSA9IHsgJiMzNDsuZGF0YSYjMzQ7LCAmIzM0Oy5yb2RhdGEmIzM0OywgJiMzNDsuYnNzJiMzNDssICYjMzQ7Lmtjb25maWcmIzM0OyB9OwomIzQzOwlzdGF0aWMgY29uc3QgY2hhciAqcGZ4c1tdID0geyAmIzM0Oy5kYXRhJiMzNDssICYjMzQ7LnJvZGF0YSYjMzQ7LCAmIzM0Oy5ic3MmIzM0OywgJiMzNDsucGVyY3B1JiMzNDssICYjMzQ7Lmtjb25maWcmIzM0OyB9OwogCWludCBpLCBuOwogCiAJLyogcmVjb2duaXplIGhhcmQgY29kZWQgTExWTSBzZWN0aW9uIG5hbWUgKi8KQEAgLTI1NCw2ICYjNDM7MjU0LDIwIEBAIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYnRmX3R5cGUgKmZpbmRfdHlwZV9mb3JfbWFwKHN0cnVjdCBidGYgKmJ0ZiwgY29uc3QgY2hhciAqbWFwCiAJcmV0dXJuIE5VTEw7CiB9CiAKJiM0MztzdGF0aWMgYm9vbCBicGZfbWFwX2lzX3NrZWxfZGF0YShjb25zdCBzdHJ1Y3QgYnBmX21hcCAqbWFwKQomIzQzO3sKJiM0MzsJaWYgKCFicGZfbWFwX19pc19pbnRlcm5hbChtYXApKQomIzQzOwkJcmV0dXJuIGZhbHNlOwomIzQzOwomIzQzOwlpZiAoYnBmX21hcF9fbWFwX2ZsYWdzKG1hcCkgJmFtcDsgQlBGX0ZfTU1BUEFCTEUpCiYjNDM7CQlyZXR1cm4gdHJ1ZTsKJiM0MzsKJiM0MzsJaWYgKGJwZl9tYXBfX3R5cGUobWFwKSA9PSBCUEZfTUFQX1RZUEVfUEVSQ1BVX0FSUkFZKQomIzQzOwkJcmV0dXJuIHRydWU7CiYjNDM7CiYjNDM7CXJldHVybiBmYWxzZTsKJiM0Mzt9CiYjNDM7CiBzdGF0aWMgYm9vbCBpc19tbWFwYWJsZV9tYXAoY29uc3Qgc3RydWN0IGJwZl9tYXAgKm1hcCwgY2hhciAqYnVmLCBzaXplX3Qgc3opCiB7CiAJc2l6ZV90IHRtcF9zejsKQEAgLTI2Myw3ICYjNDM7Mjc3LDcgQEAgc3RhdGljIGJvb2wgaXNfbW1hcGFibGVfbWFwKGNvbnN0IHN0cnVjdCBicGZfbWFwICptYXAsIGNoYXIgKmJ1Ziwgc2l6ZV90IHN6KQogCQlyZXR1cm4gdHJ1ZTsKIAl9CiAKLQlpZiAoIWJwZl9tYXBfX2lzX2ludGVybmFsKG1hcCkgfHwgIShicGZfbWFwX19tYXBfZmxhZ3MobWFwKSAmYW1wOyBCUEZfRl9NTUFQQUJMRSkpCiYjNDM7CWlmICghYnBmX21hcF9pc19za2VsX2RhdGEobWFwKSkKIAkJcmV0dXJuIGZhbHNlOwogCiAJaWYgKCFnZXRfbWFwX2lkZW50KG1hcCwgYnVmLCBzeikpCkBAIC0zMjEsNiAmIzQzOzMzNSwxMSBAQCBzdGF0aWMgYm9vbCBidGZfaXNfcHRyX3RvX2Z1bmNfcHJvdG8oY29uc3Qgc3RydWN0IGJ0ZiAqYnRmLAogCXJldHVybiBidGZfaXNfcHRyKHYpICZhbXA7JmFtcDsgYnRmX2lzX2Z1bmNfcHJvdG8oYnRmX190eXBlX2J5X2lkKGJ0Ziwgdi0mZ3Q7dHlwZSkpOwogfQogCiYjNDM7c3RhdGljIGJvb2wgYnBmX21hcF9pc19wZXJjcHVfZGF0YShjb25zdCBzdHJ1Y3QgYnBmX21hcCAqbWFwKQomIzQzO3sKJiM0MzsJcmV0dXJuIGJwZl9tYXBfX2lzX2ludGVybmFsKG1hcCkgJmFtcDsmYW1wOyBicGZfbWFwX190eXBlKG1hcCkgPT0gQlBGX01BUF9UWVBFX1BFUkNQVV9BUlJBWTsKJiM0Mzt9CiYjNDM7CiBzdGF0aWMgaW50IGNvZGVnZW5fc3Vic2tlbF9kYXRhc2VjcyhzdHJ1Y3QgYnBmX29iamVjdCAqb2JqLCBjb25zdCBjaGFyICpvYmpfbmFtZSkKIHsKIAlzdHJ1Y3QgYnRmICpidGYgPSBicGZfb2JqZWN0X19idGYob2JqKTsKQEAgLTM0Myw2ICYjNDM7MzYyLDkgQEAgc3RhdGljIGludCBjb2RlZ2VuX3N1YnNrZWxfZGF0YXNlY3Moc3RydWN0IGJwZl9vYmplY3QgKm9iaiwgY29uc3QgY2hhciAqb2JqX25hbWUKIAkJaWYgKCFpc19tbWFwYWJsZV9tYXAobWFwLCBtYXBfaWRlbnQsIHNpemVvZihtYXBfaWRlbnQpKSkKIAkJCWNvbnRpbnVlOwogCiYjNDM7CQlpZiAoYnBmX21hcF9pc19wZXJjcHVfZGF0YShtYXApKQomIzQzOwkJCWNvbnRpbnVlOwomIzQzOwogCQlzZWMgPSBmaW5kX3R5cGVfZm9yX21hcChidGYsIG1hcF9pZGVudCk7CiAJCWlmICghc2VjKQogCQkJY29udGludWU7CkBAIC02NjgsOCAmIzQzOzY5MCw3IEBAIHN0YXRpYyB2b2lkIGNvZGVnZW5fZGVzdHJveShzdHJ1Y3QgYnBmX29iamVjdCAqb2JqLCBjb25zdCBjaGFyICpvYmpfbmFtZSkKIAlicGZfb2JqZWN0X19mb3JfZWFjaF9tYXAobWFwLCBvYmopIHsKIAkJaWYgKCFnZXRfbWFwX2lkZW50KG1hcCwgaWRlbnQsIHNpemVvZihpZGVudCkpKQogCQkJY29udGludWU7Ci0JCWlmIChicGZfbWFwX19pc19pbnRlcm5hbChtYXApICZhbXA7JmFtcDsKLQkJICAgIChicGZfbWFwX19tYXBfZmxhZ3MobWFwKSAmYW1wOyBCUEZfRl9NTUFQQUJMRSkpCiYjNDM7CQlpZiAoYnBmX21hcF9pc19za2VsX2RhdGEobWFwKSkKIAkJCXByaW50ZigmIzM0O1x0c2tlbF9mcmVlX21hcF9kYXRhKHNrZWwtJmd0OyUxJHMsIHNrZWwtJmd0O21hcHMuJTEkcy5pbml0aWFsX3ZhbHVlLCAlMiR6dSk7XG4mIzM0OywKIAkJCSAgICAgICBpZGVudCwgYnBmX21hcF9tbWFwX3N6KG1hcCkpOwogCQljb2RlZ2VuKCYjMzQ7XApAQCAtODUwLDYgJiM0Mzs4NzEsMjAgQEAgc3RhdGljIGludCBnZW5fdHJhY2Uoc3RydWN0IGJwZl9vYmplY3QgKm9iaiwgY29uc3QgY2hhciAqb2JqX25hbWUsIGNvbnN0IGNoYXIgKmgKIAkJaWYgKCFpc19tbWFwYWJsZV9tYXAobWFwLCBpZGVudCwgc2l6ZW9mKGlkZW50KSkpCiAJCQljb250aW51ZTsKIAomIzQzOwkJaWYgKGJwZl9tYXBfaXNfcGVyY3B1X2RhdGEobWFwKSkgewomIzQzOwkJCWNvZGVnZW4oJiMzNDtcCiYjNDM7CQlcblwKJiM0MzsJCQllcnIgPSBza2VsX3Byb3RlY3RfbWFwX2RhdGEoc2tlbC0mZ3Q7JTEkcywgJmFtcDtza2VsLSZndDttYXBzLiUxJHMuaW5pdGlhbF92YWx1ZSwgJTIkemQpO1xuXAomIzQzOwkJCWlmIChlcnIpCQkJCQkgICAgXG5cCiYjNDM7CQkJCXJldHVybiBlcnI7CQkJCSAgICBcblwKJiM0MzsJCSNpZmRlZiBfX0tFUk5FTF9fCQkJCQkgICAgXG5cCiYjNDM7CQkJc2tlbC0mZ3Q7JTEkcyA9IE5VTEw7CQkJCSAgICBcblwKJiM0MzsJCSNlbmRpZgkJCQkJCQkgICAgXG5cCiYjNDM7CQkJJiMzNDssCiYjNDM7CQkJaWRlbnQsIGJwZl9tYXBfbW1hcF9zeihtYXApKTsKJiM0MzsJCQljb250aW51ZTsKJiM0MzsJCX0KJiM0MzsKIAkJaWYgKGJwZl9tYXBfX21hcF9mbGFncyhtYXApICZhbXA7IEJQRl9GX1JET05MWV9QUk9HKQogCQkJbW1hcF9mbGFncyA9ICYjMzQ7UFJPVF9SRUFEJiMzNDs7CiAJCWVsc2UKQEAgLTE3NDAsNiAmIzQzOzE3NzUsOCBAQCBzdGF0aWMgaW50IGRvX3N1YnNrZWxldG9uKGludCBhcmdjLCBjaGFyICoqYXJndikKIAogCQlpZiAoIWlzX21tYXBhYmxlX21hcChtYXAsIGlkZW50LCBzaXplb2YoaWRlbnQpKSkKIAkJCWNvbnRpbnVlOwomIzQzOwkJaWYgKGJwZl9tYXBfaXNfcGVyY3B1X2RhdGEobWFwKSkKJiM0MzsJCQljb250aW51ZTsKIAogCQltYXBfdHlwZV9pZCA9IGJwZl9tYXBfX2J0Zl92YWx1ZV90eXBlX2lkKG1hcCk7CiAJCWlmIChtYXBfdHlwZV9pZCAmbHQ7PSAwKSB7CkBAIC0xODYzLDYgJiM0MzsxOTAwLDggQEAgc3RhdGljIGludCBkb19zdWJza2VsZXRvbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCiAJYnBmX29iamVjdF9fZm9yX2VhY2hfbWFwKG1hcCwgb2JqKSB7CiAJCWlmICghaXNfbW1hcGFibGVfbWFwKG1hcCwgaWRlbnQsIHNpemVvZihpZGVudCkpKQogCQkJY29udGludWU7CiYjNDM7CQlpZiAoYnBmX21hcF9pc19wZXJjcHVfZGF0YShtYXApKQomIzQzOwkJCWNvbnRpbnVlOwogCiAJCW1hcF90eXBlX2lkID0gYnBmX21hcF9fYnRmX3ZhbHVlX3R5cGVfaWQobWFwKTsKIAkJaWYgKG1hcF90eXBlX2lkICZsdDs9IDApCmRpZmYgLS1naXQgYS90b29scy9saWIvYnBmL2JwZl9nZW5faW50ZXJuYWwuaCBiL3Rvb2xzL2xpYi9icGYvYnBmX2dlbl9pbnRlcm5hbC5oCmluZGV4IDQ5YWY0MjYwYjhlNmI3Li41ZWE4MzgzODA1ZDNiYyAxMDA2NDQKLS0tIGEvdG9vbHMvbGliL2JwZi9icGZfZ2VuX2ludGVybmFsLmgKJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvbGliL2JwZi9icGZfZ2VuX2ludGVybmFsLmgKQEAgLTY2LDcgJiM0Mzs2Niw4IEBAIHZvaWQgYnBmX2dlbl9fcHJvZ19sb2FkKHN0cnVjdCBicGZfZ2VuICpnZW4sCiAJCQllbnVtIGJwZl9wcm9nX3R5cGUgcHJvZ190eXBlLCBjb25zdCBjaGFyICpwcm9nX25hbWUsCiAJCQljb25zdCBjaGFyICpsaWNlbnNlLCBzdHJ1Y3QgYnBmX2luc24gKmluc25zLCBzaXplX3QgaW5zbl9jbnQsCiAJCQlzdHJ1Y3QgYnBmX3Byb2dfbG9hZF9vcHRzICpsb2FkX2F0dHIsIGludCBwcm9nX2lkeCk7Ci12b2lkIGJwZl9nZW5fX21hcF91cGRhdGVfZWxlbShzdHJ1Y3QgYnBmX2dlbiAqZ2VuLCBpbnQgbWFwX2lkeCwgdm9pZCAqdmFsdWUsIF9fdTMyIHZhbHVlX3NpemUpOwomIzQzO3ZvaWQgYnBmX2dlbl9fbWFwX3VwZGF0ZV9lbGVtKHN0cnVjdCBicGZfZ2VuICpnZW4sIGludCBtYXBfaWR4LCB2b2lkICp2YWx1ZSwgX191MzIgdmFsdWVfc2l6ZSwKJiM0MzsJCQkgICAgICBfX3U2NCBmbGFncyk7CiB2b2lkIGJwZl9nZW5fX21hcF9mcmVlemUoc3RydWN0IGJwZl9nZW4gKmdlbiwgaW50IG1hcF9pZHgpOwogdm9pZCBicGZfZ2VuX19yZWNvcmRfYXR0YWNoX3RhcmdldChzdHJ1Y3QgYnBmX2dlbiAqZ2VuLCBjb25zdCBjaGFyICpuYW1lLCBlbnVtIGJwZl9hdHRhY2hfdHlwZSB0eXBlKTsKIHZvaWQgYnBmX2dlbl9fcmVjb3JkX2V4dGVybihzdHJ1Y3QgYnBmX2dlbiAqZ2VuLCBjb25zdCBjaGFyICpuYW1lLCBib29sIGlzX3dlYWssCmRpZmYgLS1naXQgYS90b29scy9saWIvYnBmL2ZlYXR1cmVzLmMgYi90b29scy9saWIvYnBmL2ZlYXR1cmVzLmMKaW5kZXggYjdlMzg4Zjk5ZDBiYmQuLmVmOTU4MWMxMTMwMzU1IDEwMDY0NAotLS0gYS90b29scy9saWIvYnBmL2ZlYXR1cmVzLmMKJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvbGliL2JwZi9mZWF0dXJlcy5jCkBAIC02MjAsNiAmIzQzOzYyMCwzOCBAQCBzdGF0aWMgaW50IHByb2JlX2JwZl9zeXNjYWxsX2NvbW1vbl9hdHRycyhpbnQgdG9rZW5fZmQpCiAJcmV0dXJuIHByb2JlX3N5c19icGZfZXh0KCk7CiB9CiAKJiM0MztzdGF0aWMgaW50IHByb2JlX2tlcm5fcGVyY3B1X2RhdGEoaW50IHRva2VuX2ZkKQomIzQzO3sKJiM0MzsJc3RydWN0IGJwZl9pbnNuIGluc25zW10gPSB7CiYjNDM7CQlCUEZfTERfTUFQX1ZBTFVFKEJQRl9SRUdfMSwgMCwgMCksCiYjNDM7CQlCUEZfTERYX01FTShCUEZfRFcsIEJQRl9SRUdfMCwgQlBGX1JFR18xLCAwKSwKJiM0MzsJCUJQRl9FWElUX0lOU04oKSwKJiM0MzsJfTsKJiM0MzsJTElCQlBGX09QVFMoYnBmX21hcF9jcmVhdGVfb3B0cywgbWFwX29wdHMsCiYjNDM7CQkudG9rZW5fZmQgPSB0b2tlbl9mZCwKJiM0MzsJCS5tYXBfZmxhZ3MgPSB0b2tlbl9mZCA/IEJQRl9GX1RPS0VOX0ZEIDogMCwKJiM0MzsJKTsKJiM0MzsJTElCQlBGX09QVFMoYnBmX3Byb2dfbG9hZF9vcHRzLCBwcm9nX29wdHMsCiYjNDM7CQkudG9rZW5fZmQgPSB0b2tlbl9mZCwKJiM0MzsJCS5wcm9nX2ZsYWdzID0gdG9rZW5fZmQgPyBCUEZfRl9UT0tFTl9GRCA6IDAsCiYjNDM7CSk7CiYjNDM7CWludCByZXQsIG1hcCwgaW5zbl9jbnQgPSBBUlJBWV9TSVpFKGluc25zKTsKJiM0MzsKJiM0MzsJbWFwID0gYnBmX21hcF9jcmVhdGUoQlBGX01BUF9UWVBFX1BFUkNQVV9BUlJBWSwgJiMzNDtsaWJicGZfcGVyY3B1JiMzNDssIHNpemVvZihpbnQpLCA4LCAxLAomIzQzOwkJCSAgICAgJmFtcDttYXBfb3B0cyk7CiYjNDM7CWlmIChtYXAgJmx0OyAwKSB7CiYjNDM7CQlwcl93YXJuKCYjMzQ7RXJyb3IgaW4gJXMoKTogJXMuIENvdWxkbiYjMzk7dCBjcmVhdGUgc2ltcGxlIHBlcmNwdV9hcnJheSBtYXAuXG4mIzM0OywKJiM0MzsJCQlfX2Z1bmNfXywgZXJyc3RyKG1hcCkpOwomIzQzOwkJcmV0dXJuIG1hcDsKJiM0MzsJfQomIzQzOwomIzQzOwlpbnNuc1swXS5pbW0gPSBtYXA7CiYjNDM7CiYjNDM7CXJldCA9IGJwZl9wcm9nX2xvYWQoQlBGX1BST0dfVFlQRV9TT0NLRVRfRklMVEVSLCBOVUxMLCAmIzM0O0dQTCYjMzQ7LCBpbnNucywgaW5zbl9jbnQsICZhbXA7cHJvZ19vcHRzKTsKJiM0MzsJY2xvc2UobWFwKTsKJiM0MzsJcmV0dXJuIHByb2JlX2ZkKHJldCk7CiYjNDM7fQomIzQzOwogdHlwZWRlZiBpbnQgKCpmZWF0dXJlX3Byb2JlX2ZuKShpbnQgLyogdG9rZW5fZmQgKi8pOwogCiBzdGF0aWMgc3RydWN0IGtlcm5fZmVhdHVyZV9jYWNoZSBmZWF0dXJlX2NhY2hlOwpAQCAtNzA3LDYgJiM0Mzs3MzksOSBAQCBzdGF0aWMgc3RydWN0IGtlcm5fZmVhdHVyZV9kZXNjIHsKIAlbRkVBVF9CUEZfU1lTQ0FMTF9DT01NT05fQVRUUlNdID0gewogCQkmIzM0O0JQRiBzeXNjYWxsIGNvbW1vbiBhdHRyaWJ1dGVzIHN1cHBvcnQmIzM0OywgcHJvYmVfYnBmX3N5c2NhbGxfY29tbW9uX2F0dHJzLAogCX0sCiYjNDM7CVtGRUFUX1BFUkNQVV9EQVRBXSA9IHsKJiM0MzsJCSYjMzQ7a2VybmVsIHN1cHBvcnRzIHBlcmNwdSBkYXRhJiMzNDssIHByb2JlX2tlcm5fcGVyY3B1X2RhdGEsCiYjNDM7CX0sCiB9OwogCiBib29sIGZlYXRfc3VwcG9ydGVkKHN0cnVjdCBrZXJuX2ZlYXR1cmVfY2FjaGUgKmNhY2hlLCBlbnVtIGtlcm5fZmVhdHVyZV9pZCBmZWF0X2lkKQpkaWZmIC0tZ2l0IGEvdG9vbHMvbGliL2JwZi9nZW5fbG9hZGVyLmMgYi90b29scy9saWIvYnBmL2dlbl9sb2FkZXIuYwppbmRleCBjN2YyZDJhYzdiYjM1Zi4uNjBhMTIwNGU5YTI2M2MgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2xpYi9icGYvZ2VuX2xvYWRlci5jCiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL2xpYi9icGYvZ2VuX2xvYWRlci5jCkBAIC0xMTkwLDcgJiM0MzsxMTkwLDcgQEAgdm9pZCBicGZfZ2VuX19wcm9nX2xvYWQoc3RydWN0IGJwZl9nZW4gKmdlbiwKIH0KIAogdm9pZCBicGZfZ2VuX19tYXBfdXBkYXRlX2VsZW0oc3RydWN0IGJwZl9nZW4gKmdlbiwgaW50IG1hcF9pZHgsIHZvaWQgKnB2YWx1ZSwKLQkJCSAgICAgIF9fdTMyIHZhbHVlX3NpemUpCiYjNDM7CQkJICAgICAgX191MzIgdmFsdWVfc2l6ZSwgX191NjQgZmxhZ3MpCiB7CiAJaW50IGF0dHJfc2l6ZSA9IG9mZnNldG9mZW5kKHVuaW9uIGJwZl9hdHRyLCBmbGFncyk7CiAJaW50IG1hcF91cGRhdGVfYXR0ciwgdmFsdWUsIGtleTsKQEAgLTExOTgsNiAmIzQzOzExOTgsNyBAQCB2b2lkIGJwZl9nZW5fX21hcF91cGRhdGVfZWxlbShzdHJ1Y3QgYnBmX2dlbiAqZ2VuLCBpbnQgbWFwX2lkeCwgdm9pZCAqcHZhbHVlLAogCWludCB6ZXJvID0gMDsKIAogCW1lbXNldCgmYW1wO2F0dHIsIDAsIGF0dHJfc2l6ZSk7CiYjNDM7CWF0dHIuZmxhZ3MgPSB0Z3RfZW5kaWFuKGZsYWdzKTsKIAogCXZhbHVlID0gYWRkX2RhdGEoZ2VuLCBwdmFsdWUsIHZhbHVlX3NpemUpOwogCWtleSA9IGFkZF9kYXRhKGdlbiwgJmFtcDt6ZXJvLCBzaXplb2YoemVybykpOwpkaWZmIC0tZ2l0IGEvdG9vbHMvbGliL2JwZi9saWJicGYuYyBiL3Rvb2xzL2xpYi9icGYvbGliYnBmLmMKaW5kZXggNzE2MjE0NjI4MGE4MGUuLjZlMThhMTYyOGUxMzk2IDEwMDY0NAotLS0gYS90b29scy9saWIvYnBmL2xpYmJwZi5jCiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL2xpYi9icGYvbGliYnBmLmMKQEAgLTU0MSw2ICYjNDM7NTQxLDcgQEAgc3RydWN0IGJwZl9zdHJ1Y3Rfb3BzIHsKIH07CiAKICNkZWZpbmUgREFUQV9TRUMgJiMzNDsuZGF0YSYjMzQ7CiYjNDM7I2RlZmluZSBQRVJDUFVfU0VDICYjMzQ7LnBlcmNwdSYjMzQ7CiAjZGVmaW5lIEJTU19TRUMgJiMzNDsuYnNzJiMzNDsKICNkZWZpbmUgUk9EQVRBX1NFQyAmIzM0Oy5yb2RhdGEmIzM0OwogI2RlZmluZSBLQ09ORklHX1NFQyAmIzM0Oy5rY29uZmlnJiMzNDsKQEAgLTU1NSw2ICYjNDM7NTU2LDcgQEAgZW51bSBsaWJicGZfbWFwX3R5cGUgewogCUxJQkJQRl9NQVBfQlNTLAogCUxJQkJQRl9NQVBfUk9EQVRBLAogCUxJQkJQRl9NQVBfS0NPTkZJRywKJiM0MzsJTElCQlBGX01BUF9QRVJDUFUsCiB9OwogCiBzdHJ1Y3QgYnBmX21hcF9kZWYgewpAQCAtNjY2LDYgJiM0Mzs2NjgsNyBAQCBlbnVtIHNlY190eXBlIHsKIAlTRUNfREFUQSwKIAlTRUNfUk9EQVRBLAogCVNFQ19TVF9PUFMsCiYjNDM7CVNFQ19QRVJDUFUsCiB9OwogCiBzdHJ1Y3QgZWxmX3NlY19kZXNjIHsKQEAgLTE4MzksNiAmIzQzOzE4NDIsOCBAQCBzdGF0aWMgc2l6ZV90IGJwZl9tYXBfbW1hcF9zeihjb25zdCBzdHJ1Y3QgYnBmX21hcCAqbWFwKQogCXN3aXRjaCAobWFwLSZndDtkZWYudHlwZSkgewogCWNhc2UgQlBGX01BUF9UWVBFX0FSUkFZOgogCQlyZXR1cm4gYXJyYXlfbWFwX21tYXBfc3oobWFwLSZndDtkZWYudmFsdWVfc2l6ZSwgbWFwLSZndDtkZWYubWF4X2VudHJpZXMpOwomIzQzOwljYXNlIEJQRl9NQVBfVFlQRV9QRVJDUFVfQVJSQVk6CiYjNDM7CQlyZXR1cm4gbWFwLSZndDtkZWYudmFsdWVfc2l6ZTsKIAljYXNlIEJQRl9NQVBfVFlQRV9BUkVOQToKIAkJcmV0dXJuIHBhZ2Vfc3ogKiBtYXAtJmd0O2RlZi5tYXhfZW50cmllczsKIAlkZWZhdWx0OgpAQCAtMTkzOCw3ICYjNDM7MTk0Myw3IEBAIHN0YXRpYyBib29sIG1hcF9pc19tbWFwYWJsZShzdHJ1Y3QgYnBmX29iamVjdCAqb2JqLCBzdHJ1Y3QgYnBmX21hcCAqbWFwKQogCXN0cnVjdCBidGZfdmFyX3NlY2luZm8gKnZzaTsKIAlpbnQgaSwgbjsKIAotCWlmICghbWFwLSZndDtidGZfdmFsdWVfdHlwZV9pZCkKJiM0MzsJaWYgKCFtYXAtJmd0O2J0Zl92YWx1ZV90eXBlX2lkIHx8IG1hcC0mZ3Q7bGliYnBmX3R5cGUgPT0gTElCQlBGX01BUF9QRVJDUFUpCiAJCXJldHVybiBmYWxzZTsKIAogCXQgPSBidGZfX3R5cGVfYnlfaWQob2JqLSZndDtidGYsIG1hcC0mZ3Q7YnRmX3ZhbHVlX3R5cGVfaWQpOwpAQCAtMTk2Miw2ICYjNDM7MTk2Nyw3IEBAIHN0YXRpYyBpbnQKIGJwZl9vYmplY3RfX2luaXRfaW50ZXJuYWxfbWFwKHN0cnVjdCBicGZfb2JqZWN0ICpvYmosIGVudW0gbGliYnBmX21hcF90eXBlIHR5cGUsCiAJCQkgICAgICBjb25zdCBjaGFyICpyZWFsX25hbWUsIGludCBzZWNfaWR4LCB2b2lkICpkYXRhLCBzaXplX3QgZGF0YV9zeikKIHsKJiM0MzsJYm9vbCBpc19wZXJjcHUgPSB0eXBlID09IExJQkJQRl9NQVBfUEVSQ1BVOwogCXN0cnVjdCBicGZfbWFwX2RlZiAqZGVmOwogCXN0cnVjdCBicGZfbWFwICptYXA7CiAJc2l6ZV90IG1tYXBfc3o7CkBAIC0xOTc1LDcgJiM0MzsxOTgxLDcgQEAgYnBmX29iamVjdF9faW5pdF9pbnRlcm5hbF9tYXAoc3RydWN0IGJwZl9vYmplY3QgKm9iaiwgZW51bSBsaWJicGZfbWFwX3R5cGUgdHlwZSwKIAltYXAtJmd0O3NlY19pZHggPSBzZWNfaWR4OwogCW1hcC0mZ3Q7c2VjX29mZnNldCA9IDA7CiAJbWFwLSZndDtyZWFsX25hbWUgPSBzdHJkdXAocmVhbF9uYW1lKTsKLQltYXAtJmd0O25hbWUgPSBpbnRlcm5hbF9tYXBfbmFtZShvYmosIHJlYWxfbmFtZSk7CiYjNDM7CW1hcC0mZ3Q7bmFtZSA9IGlzX3BlcmNwdSA/IHN0cmR1cChyZWFsX25hbWUpIDogaW50ZXJuYWxfbWFwX25hbWUob2JqLCByZWFsX25hbWUpOwogCWlmICghbWFwLSZndDtyZWFsX25hbWUgfHwgIW1hcC0mZ3Q7bmFtZSkgewogCQl6ZnJlZSgmYW1wO21hcC0mZ3Q7cmVhbF9uYW1lKTsKIAkJemZyZWUoJmFtcDttYXAtJmd0O25hbWUpOwpAQCAtMTk4Myw3ICYjNDM7MTk4OSw3IEBAIGJwZl9vYmplY3RfX2luaXRfaW50ZXJuYWxfbWFwKHN0cnVjdCBicGZfb2JqZWN0ICpvYmosIGVudW0gbGliYnBmX21hcF90eXBlIHR5cGUsCiAJfQogCiAJZGVmID0gJmFtcDttYXAtJmd0O2RlZjsKLQlkZWYtJmd0O3R5cGUgPSBCUEZfTUFQX1RZUEVfQVJSQVk7CiYjNDM7CWRlZi0mZ3Q7dHlwZSA9IGlzX3BlcmNwdSA/IEJQRl9NQVBfVFlQRV9QRVJDUFVfQVJSQVkgOiBCUEZfTUFQX1RZUEVfQVJSQVk7CiAJZGVmLSZndDtrZXlfc2l6ZSA9IHNpemVvZihpbnQpOwogCWRlZi0mZ3Q7dmFsdWVfc2l6ZSA9IGRhdGFfc3o7CiAJZGVmLSZndDttYXhfZW50cmllcyA9IDE7CkBAIC0xOTk2LDggJiM0MzsyMDAyLDkgQEAgYnBmX29iamVjdF9faW5pdF9pbnRlcm5hbF9tYXAoc3RydWN0IGJwZl9vYmplY3QgKm9iaiwgZW51bSBsaWJicGZfbWFwX3R5cGUgdHlwZSwKIAlpZiAobWFwX2lzX21tYXBhYmxlKG9iaiwgbWFwKSkKIAkJZGVmLSZndDttYXBfZmxhZ3MgfD0gQlBGX0ZfTU1BUEFCTEU7CiAKLQlwcl9kZWJ1ZygmIzM0O21hcCAmIzM5OyVzJiMzOTsgKGdsb2JhbCBkYXRhKTogYXQgc2VjX2lkeCAlZCwgb2Zmc2V0ICV6dSwgZmxhZ3MgJXguXG4mIzM0OywKLQkJIG1hcC0mZ3Q7bmFtZSwgbWFwLSZndDtzZWNfaWR4LCBtYXAtJmd0O3NlY19vZmZzZXQsIGRlZi0mZ3Q7bWFwX2ZsYWdzKTsKJiM0MzsJcHJfZGVidWcoJiMzNDttYXAgJiMzOTslcyYjMzk7IChnbG9iYWwgJXNkYXRhKTogYXQgc2VjX2lkeCAlZCwgb2Zmc2V0ICV6dSwgZmxhZ3MgJXguXG4mIzM0OywKJiM0MzsJCSBtYXAtJmd0O25hbWUsIGlzX3BlcmNwdSA/ICYjMzQ7cGVyY3B1ICYjMzQ7IDogJiMzNDsmIzM0OywgbWFwLSZndDtzZWNfaWR4LAomIzQzOwkJIG1hcC0mZ3Q7c2VjX29mZnNldCwgZGVmLSZndDttYXBfZmxhZ3MpOwogCiAJbW1hcF9zeiA9IGJwZl9tYXBfbW1hcF9zeihtYXApOwogCW1hcC0mZ3Q7bW1hcGVkID0gbW1hcChOVUxMLCBtbWFwX3N6LCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLApAQCAtMjA1Nyw2ICYjNDM7MjA2NCwxMyBAQCBzdGF0aWMgaW50IGJwZl9vYmplY3RfX2luaXRfZ2xvYmFsX2RhdGFfbWFwcyhzdHJ1Y3QgYnBmX29iamVjdCAqb2JqKQogCQkJCQkJCSAgICBOVUxMLAogCQkJCQkJCSAgICBzZWNfZGVzYy0mZ3Q7ZGF0YS0mZ3Q7ZF9zaXplKTsKIAkJCWJyZWFrOwomIzQzOwkJY2FzZSBTRUNfUEVSQ1BVOgomIzQzOwkJCXNlY19uYW1lID0gZWxmX3NlY19uYW1lKG9iaiwgZWxmX3NlY19ieV9pZHgob2JqLCBzZWNfaWR4KSk7CiYjNDM7CQkJZXJyID0gYnBmX29iamVjdF9faW5pdF9pbnRlcm5hbF9tYXAob2JqLCBMSUJCUEZfTUFQX1BFUkNQVSwKJiM0MzsJCQkJCQkJICAgIHNlY19uYW1lLCBzZWNfaWR4LAomIzQzOwkJCQkJCQkgICAgc2VjX2Rlc2MtJmd0O2RhdGEtJmd0O2RfYnVmLAomIzQzOwkJCQkJCQkgICAgc2VjX2Rlc2MtJmd0O2RhdGEtJmd0O2Rfc2l6ZSk7CiYjNDM7CQkJYnJlYWs7CiAJCWRlZmF1bHQ6CiAJCQkvKiBza2lwICovCiAJCQlicmVhazsKQEAgLTQwMTYsNiAmIzQzOzQwMzAsMTEgQEAgc3RhdGljIGludCBicGZfb2JqZWN0X19lbGZfY29sbGVjdChzdHJ1Y3QgYnBmX29iamVjdCAqb2JqKQogCQkJCXNlY19kZXNjLSZndDtzZWNfdHlwZSA9IFNFQ19ST0RBVEE7CiAJCQkJc2VjX2Rlc2MtJmd0O3NoZHIgPSBzaDsKIAkJCQlzZWNfZGVzYy0mZ3Q7ZGF0YSA9IGRhdGE7CiYjNDM7CQkJfSBlbHNlIGlmIChzdHJjbXAobmFtZSwgUEVSQ1BVX1NFQykgPT0gMCB8fAomIzQzOwkJCQkgICBzdHJfaGFzX3BmeChuYW1lLCBQRVJDUFVfU0VDICYjMzQ7LiYjMzQ7KSkgewomIzQzOwkJCQlzZWNfZGVzYy0mZ3Q7c2VjX3R5cGUgPSBTRUNfUEVSQ1BVOwomIzQzOwkJCQlzZWNfZGVzYy0mZ3Q7c2hkciA9IHNoOwomIzQzOwkJCQlzZWNfZGVzYy0mZ3Q7ZGF0YSA9IGRhdGE7CiAJCQl9IGVsc2UgaWYgKHN0cmNtcChuYW1lLCBTVFJVQ1RfT1BTX1NFQykgPT0gMCB8fAogCQkJCSAgIHN0cmNtcChuYW1lLCBTVFJVQ1RfT1BTX0xJTktfU0VDKSA9PSAwIHx8CiAJCQkJICAgc3RyY21wKG5hbWUsICYjMzQ7PyYjMzQ7IFNUUlVDVF9PUFNfU0VDKSA9PSAwIHx8CkBAIC00NTQ0LDYgJiM0Mzs0NTYzLDcgQEAgc3RhdGljIGJvb2wgYnBmX29iamVjdF9fc2huZHhfaXNfZGF0YShjb25zdCBzdHJ1Y3QgYnBmX29iamVjdCAqb2JqLAogCWNhc2UgU0VDX0JTUzoKIAljYXNlIFNFQ19EQVRBOgogCWNhc2UgU0VDX1JPREFUQToKJiM0MzsJY2FzZSBTRUNfUEVSQ1BVOgogCQlyZXR1cm4gdHJ1ZTsKIAlkZWZhdWx0OgogCQlyZXR1cm4gZmFsc2U7CkBAIC00NTY5LDYgJiM0Mzs0NTg5LDggQEAgYnBmX29iamVjdF9fc2VjdGlvbl90b19saWJicGZfbWFwX3R5cGUoY29uc3Qgc3RydWN0IGJwZl9vYmplY3QgKm9iaiwgaW50IHNobmR4KQogCQlyZXR1cm4gTElCQlBGX01BUF9EQVRBOwogCWNhc2UgU0VDX1JPREFUQToKIAkJcmV0dXJuIExJQkJQRl9NQVBfUk9EQVRBOwomIzQzOwljYXNlIFNFQ19QRVJDUFU6CiYjNDM7CQlyZXR1cm4gTElCQlBGX01BUF9QRVJDUFU7CiAJZGVmYXVsdDoKIAkJcmV0dXJuIExJQkJQRl9NQVBfVU5TUEVDOwogCX0KQEAgLTQ5NDQsNyAmIzQzOzQ5NjYsNyBAQCBzdGF0aWMgaW50IG1hcF9maWxsX2J0Zl90eXBlX2luZm8oc3RydWN0IGJwZl9vYmplY3QgKm9iaiwgc3RydWN0IGJwZl9tYXAgKm1hcCkKIAogCS8qCiAJICogTExWTSBhbm5vdGF0ZXMgZ2xvYmFsIGRhdGEgZGlmZmVyZW50bHkgaW4gQlRGLCB0aGF0IGlzLAotCSAqIG9ubHkgYXMgJiMzOTsuZGF0YSYjMzk7LCAmIzM5Oy5ic3MmIzM5OyBvciAmIzM5Oy5yb2RhdGEmIzM5Oy4KJiM0MzsJICogb25seSBhcyAmIzM5Oy5kYXRhJiMzOTssICYjMzk7LmJzcyYjMzk7LCAmIzM5Oy5wZXJjcHUmIzM5OyBvciAmIzM5Oy5yb2RhdGEmIzM5Oy4KIAkgKi8KIAlpZiAoIWJwZl9tYXBfX2lzX2ludGVybmFsKG1hcCkpCiAJCXJldHVybiAtRU5PRU5UOwpAQCAtNTI5NywxOCAmIzQzOzUzMTksMzAgQEAgc3RhdGljIGludAogYnBmX29iamVjdF9fcG9wdWxhdGVfaW50ZXJuYWxfbWFwKHN0cnVjdCBicGZfb2JqZWN0ICpvYmosIHN0cnVjdCBicGZfbWFwICptYXApCiB7CiAJZW51bSBsaWJicGZfbWFwX3R5cGUgbWFwX3R5cGUgPSBtYXAtJmd0O2xpYmJwZl90eXBlOwomIzQzOwlib29sIGlzX3BlcmNwdSA9IG1hcF90eXBlID09IExJQkJQRl9NQVBfUEVSQ1BVOwomIzQzOwlfX3U2NCB1cGRhdGVfZmxhZ3MgPSAwOwogCWludCBlcnIsIHplcm8gPSAwOwogCXNpemVfdCBtbWFwX3N6OwogCiYjNDM7CWlmIChpc19wZXJjcHUpIHsKJiM0MzsJCWlmICghb2JqLSZndDtnZW5fbG9hZGVyICZhbXA7JmFtcDsgIWtlcm5lbF9zdXBwb3J0cyhvYmosIEZFQVRfUEVSQ1BVX0RBVEEpKSB7CiYjNDM7CQkJcHJfd2FybigmIzM0O21hcCAmIzM5OyVzJiMzOTs6IGtlcm5lbCBkb2VzIG5vdCBzdXBwb3J0IHBlcmNwdSBkYXRhLlxuJiMzNDssCiYjNDM7CQkJCWJwZl9tYXBfX25hbWUobWFwKSk7CiYjNDM7CQkJcmV0dXJuIC1FT1BOT1RTVVBQOwomIzQzOwkJfQomIzQzOwomIzQzOwkJdXBkYXRlX2ZsYWdzID0gQlBGX0ZfQUxMX0NQVVM7CiYjNDM7CX0KJiM0MzsKIAlpZiAob2JqLSZndDtnZW5fbG9hZGVyKSB7CiAJCWJwZl9nZW5fX21hcF91cGRhdGVfZWxlbShvYmotJmd0O2dlbl9sb2FkZXIsIG1hcCAtIG9iai0mZ3Q7bWFwcywKLQkJCQkJIG1hcC0mZ3Q7bW1hcGVkLCBtYXAtJmd0O2RlZi52YWx1ZV9zaXplKTsKJiM0MzsJCQkJCSBtYXAtJmd0O21tYXBlZCwgbWFwLSZndDtkZWYudmFsdWVfc2l6ZSwgdXBkYXRlX2ZsYWdzKTsKIAkJaWYgKG1hcF90eXBlID09IExJQkJQRl9NQVBfUk9EQVRBIHx8IG1hcF90eXBlID09IExJQkJQRl9NQVBfS0NPTkZJRykKIAkJCWJwZl9nZW5fX21hcF9mcmVlemUob2JqLSZndDtnZW5fbG9hZGVyLCBtYXAgLSBvYmotJmd0O21hcHMpOwogCQlyZXR1cm4gMDsKIAl9CiAKLQllcnIgPSBicGZfbWFwX3VwZGF0ZV9lbGVtKG1hcC0mZ3Q7ZmQsICZhbXA7emVybywgbWFwLSZndDttbWFwZWQsIDApOwomIzQzOwllcnIgPSBicGZfbWFwX3VwZGF0ZV9lbGVtKG1hcC0mZ3Q7ZmQsICZhbXA7emVybywgbWFwLSZndDttbWFwZWQsIHVwZGF0ZV9mbGFncyk7CiAJaWYgKGVycikgewogCQllcnIgPSAtZXJybm87CiAJCXByX3dhcm4oJiMzNDttYXAgJiMzOTslcyYjMzk7OiBmYWlsZWQgdG8gc2V0IGluaXRpYWwgY29udGVudHM6ICVzXG4mIzM0OywKQEAgLTUzNTMsNiAmIzQzOzUzODcsMTMgQEAgYnBmX29iamVjdF9fcG9wdWxhdGVfaW50ZXJuYWxfbWFwKHN0cnVjdCBicGZfb2JqZWN0ICpvYmosIHN0cnVjdCBicGZfbWFwICptYXApCiAJCQlyZXR1cm4gZXJyOwogCQl9CiAJCW1hcC0mZ3Q7bW1hcGVkID0gbW1hcGVkOwomIzQzOwl9IGVsc2UgaWYgKGlzX3BlcmNwdSkgewomIzQzOwkJaWYgKG1wcm90ZWN0KG1hcC0mZ3Q7bW1hcGVkLCBtbWFwX3N6LCBQUk9UX1JFQUQpKSB7CiYjNDM7CQkJZXJyID0gLWVycm5vOwomIzQzOwkJCXByX3dhcm4oJiMzNDttYXAgJiMzOTslcyYjMzk7OiBmYWlsZWQgdG8gbXByb3RlY3QoKSBjb250ZW50czogJXNcbiYjMzQ7LAomIzQzOwkJCQlicGZfbWFwX19uYW1lKG1hcCksIGVycnN0cihlcnIpKTsKJiM0MzsJCQlyZXR1cm4gZXJyOwomIzQzOwkJfQogCX0gZWxzZSBpZiAobWFwLSZndDttbWFwZWQpIHsKIAkJbXVubWFwKG1hcC0mZ3Q7bW1hcGVkLCBtbWFwX3N6KTsKIAkJbWFwLSZndDttbWFwZWQgPSBOVUxMOwpkaWZmIC0tZ2l0IGEvdG9vbHMvbGliL2JwZi9saWJicGZfaW50ZXJuYWwuaCBiL3Rvb2xzL2xpYi9icGYvbGliYnBmX2ludGVybmFsLmgKaW5kZXggMDRjZDMwM2ZiNWE4NzkuLjQ3YWUzOTEyNWY2OGY5IDEwMDY0NAotLS0gYS90b29scy9saWIvYnBmL2xpYmJwZl9pbnRlcm5hbC5oCiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL2xpYi9icGYvbGliYnBmX2ludGVybmFsLmgKQEAgLTQwMSw2ICYjNDM7NDAxLDggQEAgZW51bSBrZXJuX2ZlYXR1cmVfaWQgewogCUZFQVRfQlRGX0xBWU9VVCwKIAkvKiBLZXJuZWwgc3VwcG9ydHMgQlBGIHN5c2NhbGwgY29tbW9uIGF0dHJpYnV0ZXMgKi8KIAlGRUFUX0JQRl9TWVNDQUxMX0NPTU1PTl9BVFRSUywKJiM0MzsJLyogS2VybmVsIHN1cHBvcnRzIHBlcmNwdSBkYXRhICovCiYjNDM7CUZFQVRfUEVSQ1BVX0RBVEEsCiAJX19GRUFUX0NOVCwKIH07CiAKZGlmZiAtLWdpdCBhL3Rvb2xzL2xpYi9icGYvc2tlbF9pbnRlcm5hbC5oIGIvdG9vbHMvbGliL2JwZi9za2VsX2ludGVybmFsLmgKaW5kZXggNzQ1MDNkMzU4YmM4YTUuLjQ4NWIwY2QxNzAxNzM5IDEwMDY0NAotLS0gYS90b29scy9saWIvYnBmL3NrZWxfaW50ZXJuYWwuaAomIzQzOyYjNDM7JiM0MzsgYi90b29scy9saWIvYnBmL3NrZWxfaW50ZXJuYWwuaApAQCAtMTM1LDggJiM0MzsxMzUsMTAgQEAgc3RhdGljIGlubGluZSB2b2lkIHNrZWxfZnJlZV9tYXBfZGF0YSh2b2lkICpwLCBfX3U2NCBhZGRyLCBzaXplX3Qgc3opCiB7CiAJaWYgKGFkZHIgIT0gfjBVTEwpCiAJCWt2ZnJlZShwKTsKLQkvKiBXaGVuIGFkZHIgPT0gfjBVTEwgdGhlICYjMzk7cCYjMzk7IHBvaW50cyB0bwotCSAqICgoc3RydWN0IGJwZl9hcnJheSAqKW1hcCktJmd0O3ZhbHVlLiBTZWUgc2tlbF9maW5hbGl6ZV9tYXBfZGF0YS4KJiM0MzsJLyoKJiM0MzsJICogV2hlbiBhZGRyID09IH4wVUxMIHRoZSBpbml0IGJ1ZmZlciBoYXMgYWxyZWFkeSBiZWVuIHJlbGVhc2VkLgomIzQzOwkgKiBGb3Igc2tlbF9maW5hbGl6ZV9tYXBfZGF0YSgpLCAmIzM5O3AmIzM5OyBwb2ludHMgdG8KJiM0MzsJICogKChzdHJ1Y3QgYnBmX2FycmF5ICopbWFwKS0mZ3Q7dmFsdWUuCiAJICovCiB9CiAKQEAgLTE3NCw2ICYjNDM7MTc2LDE1IEBAIHN0YXRpYyBpbmxpbmUgdm9pZCAqc2tlbF9maW5hbGl6ZV9tYXBfZGF0YShfX3U2NCAqaW5pdF92YWwsIHNpemVfdCBtbWFwX3N6LCBpbnQKIAlyZXR1cm4gYWRkcjsKIH0KIAomIzQzO3N0YXRpYyBpbmxpbmUgaW50IHNrZWxfcHJvdGVjdF9tYXBfZGF0YSh2b2lkICpwLCBfX3U2NCAqaW5pdF92YWwsIHNpemVfdCBzeikKJiM0Mzt7CiYjNDM7CSh2b2lkKXN6OwomIzQzOwomIzQzOwlrdmZyZWUocCk7CiYjNDM7CSppbml0X3ZhbCA9IH4wVUxMOwomIzQzOwlyZXR1cm4gMDsKJiM0Mzt9CiYjNDM7CiAjZWxzZQogCiBzdGF0aWMgaW5saW5lIHZvaWQgKnNrZWxfYWxsb2Moc2l6ZV90IHNpemUpCkBAIC0yMTIsNiAmIzQzOzIyMywxNSBAQCBzdGF0aWMgaW5saW5lIHZvaWQgKnNrZWxfZmluYWxpemVfbWFwX2RhdGEoX191NjQgKmluaXRfdmFsLCBzaXplX3QgbW1hcF9zeiwgaW50CiAJCXJldHVybiBOVUxMOwogCXJldHVybiBhZGRyOwogfQomIzQzOwomIzQzO3N0YXRpYyBpbmxpbmUgaW50IHNrZWxfcHJvdGVjdF9tYXBfZGF0YSh2b2lkICpwLCBfX3U2NCAqaW5pdF92YWwsIHNpemVfdCBzeikKJiM0Mzt7CiYjNDM7CSh2b2lkKWluaXRfdmFsOwomIzQzOwomIzQzOwlpZiAobXByb3RlY3QocCwgc3osIFBST1RfUkVBRCkpCiYjNDM7CQlyZXR1cm4gLWVycm5vOwomIzQzOwlyZXR1cm4gMDsKJiM0Mzt9CiAjZW5kaWYKIAogc3RhdGljIGlubGluZSBpbnQgc2tlbF9jbG9zZW56KGludCBmZCkKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9NYWtlZmlsZSBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9NYWtlZmlsZQppbmRleCBiNjQyZWU0ODllYTY0MC4uYzM3ZWQ5ZTdiOTdjZDAgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9NYWtlZmlsZQomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvTWFrZWZpbGUKQEAgLTUzMyw3ICYjNDM7NTMzLDcgQEAgTFNLRUxTX1NJR05FRCA6PSBmZW50cnlfdGVzdC5jIGZleGl0X3Rlc3QuYyBhdG9taWNzLmMKIAogIyBHZW5lcmF0ZSBib3RoIGxpZ2h0IHNrZWxldG9uIGFuZCBsaWJicGYgc2tlbGV0b24gZm9yIHRoZXNlCiBMU0tFTFNfRVhUUkEgOj0gdGVzdF9rc3ltc19tb2R1bGUuYyB0ZXN0X2tzeW1zX3dlYWsuYyBrZnVuY19jYWxsX3Rlc3QuYyBcCi0Ja2Z1bmNfY2FsbF90ZXN0X3N1YnByb2cuYwomIzQzOwlrZnVuY19jYWxsX3Rlc3Rfc3VicHJvZy5jIHRlc3RfZ2xvYmFsX3BlcmNwdV9kYXRhLmMKIFNLRUxfQkxBQ0tMSVNUICYjNDM7PSAkJChMU0tFTFMpICQkKExTS0VMU19TSUdORUQpCiAKIHRlc3Rfc3RhdGljX2xpbmtlZC5za2VsLmgtZGVwcyA6PSB0ZXN0X3N0YXRpY19saW5rZWQxLmJwZi5vIHRlc3Rfc3RhdGljX2xpbmtlZDIuYnBmLm8KZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2dsb2JhbF9kYXRhX2luaXQuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2dsb2JhbF9kYXRhX2luaXQuYwppbmRleCA4NDY2MzMyZDc0MDZmNC4uYTVkODc3NjhmNmVlMmYgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2dsb2JhbF9kYXRhX2luaXQuYwomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9nbG9iYWxfZGF0YV9pbml0LmMKQEAgLTEsNSAmIzQzOzEsOCBAQAogLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAKICNpbmNsdWRlICZsdDt0ZXN0X3Byb2dzLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJiMzNDticGYvbGliYnBmX2ludGVybmFsLmgmIzM0OwomIzQzOyNpbmNsdWRlICYjMzQ7dGVzdF9nbG9iYWxfcGVyY3B1X2RhdGEuc2tlbC5oJiMzNDsKJiM0MzsjaW5jbHVkZSAmIzM0O3Rlc3RfZ2xvYmFsX3BlcmNwdV9kYXRhLmxza2VsLmgmIzM0OwogCiB2b2lkIHRlc3RfZ2xvYmFsX2RhdGFfaW5pdCh2b2lkKQogewpAQCAtNjAsMyAmIzQzOzYzLDI5MCBAQCB2b2lkIHRlc3RfZ2xvYmFsX2RhdGFfaW5pdCh2b2lkKQogCWZyZWUobmV3dmFsKTsKIAlicGZfb2JqZWN0X19jbG9zZShvYmopOwogfQomIzQzOwomIzQzO3N0YXRpYyB2b2lkIHRlc3RfcGVyY3B1X2RhdGFfb25fY3B1cyhpbnQgbWFwX2ZkLCBpbnQgcHJvZ19mZCwgaW50IG51bV9vbmxpbmUsIGJvb2wgKm9ubGluZSkKJiM0Mzt7CiYjNDM7CV9fdTY0IGFyZ3NbMl0gPSB7MHgxMjM0VUxMLCAweDU2NzhVTEx9OwomIzQzOwlMSUJCUEZfT1BUUyhicGZfdGVzdF9ydW5fb3B0cywgdG9wdHMsCiYjNDM7CQkgICAgLmN0eF9pbiA9IGFyZ3MsCiYjNDM7CQkgICAgLmN0eF9zaXplX2luID0gc2l6ZW9mKGFyZ3MpLAomIzQzOwkJICAgIC5mbGFncyA9IEJQRl9GX1RFU1RfUlVOX09OX0NQVSwKJiM0MzsJKTsKJiM0MzsJaW50IGksIGVyciwga2V5ID0gMDsKJiM0MzsKJiM0MzsJLyogcnVuIG9uIGV2ZXJ5IG9ubGluZS1DUFUgKi8KJiM0MzsJZm9yIChpID0gMDsgaSAmbHQ7IG51bV9vbmxpbmU7IGkmIzQzOyYjNDM7KSB7CiYjNDM7CQlzdHJ1Y3QgdGVzdF9nbG9iYWxfcGVyY3B1X2RhdGFfX3BlcmNwdSBkYXRhID0ge307CiYjNDM7CQlfX3U2NCBmbGFnczsKJiM0MzsKJiM0MzsJCWlmICghb25saW5lW2ldKQomIzQzOwkJCWNvbnRpbnVlOwomIzQzOwomIzQzOwkJdG9wdHMuY3B1ID0gaTsKJiM0MzsJCXRvcHRzLnJldHZhbCA9IC0xOwomIzQzOwkJZXJyID0gYnBmX3Byb2dfdGVzdF9ydW5fb3B0cyhwcm9nX2ZkLCAmYW1wO3RvcHRzKTsKJiM0MzsJCUFTU0VSVF9PSyhlcnIsICYjMzQ7YnBmX3Byb2dfdGVzdF9ydW5fb3B0cyYjMzQ7KTsKJiM0MzsJCUFTU0VSVF9FUSh0b3B0cy5yZXR2YWwsIDAsICYjMzQ7YnBmX3Byb2dfdGVzdF9ydW5fb3B0cyByZXR2YWwmIzM0Oyk7CiYjNDM7CiYjNDM7CQlmbGFncyA9ICgoX191NjQpIGkgJmx0OyZsdDsgMzIpIHwgQlBGX0ZfQ1BVOwomIzQzOwkJZXJyID0gYnBmX21hcF9sb29rdXBfZWxlbV9mbGFncyhtYXBfZmQsICZhbXA7a2V5LCAmYW1wO2RhdGEsIGZsYWdzKTsKJiM0MzsJCWlmICghQVNTRVJUX09LKGVyciwgJiMzNDticGZfbWFwX2xvb2t1cF9lbGVtX2ZsYWdzJiMzNDspKQomIzQzOwkJCXJldHVybjsKJiM0MzsKJiM0MzsJCUFTU0VSVF9FUShkYXRhLmRhdGEsIDEsICYjMzQ7ZGF0YS5kYXRhJiMzNDspOwomIzQzOwkJQVNTRVJUX1RSVUUoZGF0YS5ydW4sICYjMzQ7ZGF0YS5ydW4mIzM0Oyk7CiYjNDM7CQlBU1NFUlRfRVEoZGF0YS5udW1zWzZdLCAweGMwZGUsICYjMzQ7ZGF0YS5udW1zWzZdJiMzNDspOwomIzQzOwkJQVNTRVJUX0VRKGRhdGEuc3RydWN0X2RhdGEuaSwgMSwgJiMzNDtzdHJ1Y3RfZGF0YS5pJiMzNDspOwomIzQzOwkJQVNTRVJUX1RSVUUoZGF0YS5zdHJ1Y3RfZGF0YS5zZXQsICYjMzQ7c3RydWN0X2RhdGEuc2V0JiMzNDspOwomIzQzOwkJQVNTRVJUX0VRKGRhdGEuc3RydWN0X2RhdGEubnVtc1s2XSwgMHhjMGRlLCAmIzM0O3N0cnVjdF9kYXRhLm51bXNbNl0mIzM0Oyk7CiYjNDM7CX0KJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgdGVzdF9nbG9iYWxfcGVyY3B1X2RhdGFfaW5pdCh2b2lkKQomIzQzO3sKJiM0MzsJc3RydWN0IHRlc3RfZ2xvYmFsX3BlcmNwdV9kYXRhX19wZXJjcHUgaW5pdF92YWx1ZSA9IHt9OwomIzQzOwlzdHJ1Y3QgdGVzdF9nbG9iYWxfcGVyY3B1X2RhdGFfX3BlcmNwdSAqaW5pdF9kYXRhOwomIzQzOwlzdHJ1Y3QgdGVzdF9nbG9iYWxfcGVyY3B1X2RhdGEgKnNrZWwgPSBOVUxMOwomIzQzOwlpbnQgcHJvZ19mZCwgbWFwX2ZkLCBlcnIsIG51bV9vbmxpbmU7CiYjNDM7CXNpemVfdCBpbml0X2RhdGFfc3o7CiYjNDM7CXN0cnVjdCBicGZfbWFwICptYXA7CiYjNDM7CWJvb2wgKm9ubGluZTsKJiM0MzsKJiM0MzsJZXJyID0gcGFyc2VfY3B1X21hc2tfZmlsZSgmIzM0Oy9zeXMvZGV2aWNlcy9zeXN0ZW0vY3B1L29ubGluZSYjMzQ7LCAmYW1wO29ubGluZSwgJmFtcDtudW1fb25saW5lKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0soZXJyLCAmIzM0O3BhcnNlX2NwdV9tYXNrX2ZpbGUmIzM0OykpCiYjNDM7CQlyZXR1cm47CiYjNDM7CiYjNDM7CXNrZWwgPSB0ZXN0X2dsb2JhbF9wZXJjcHVfZGF0YV9fb3BlbigpOwomIzQzOwlpZiAoIUFTU0VSVF9PS19QVFIoc2tlbCwgJiMzNDt0ZXN0X2dsb2JhbF9wZXJjcHVfZGF0YV9fb3BlbiYjMzQ7KSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwlpZiAoIUFTU0VSVF9PS19QVFIoc2tlbC0mZ3Q7cGVyY3B1LCAmIzM0O3NrZWwtJmd0O3BlcmNwdSYjMzQ7KSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwomIzQzOwlBU1NFUlRfRVEoc2tlbC0mZ3Q7cGVyY3B1LSZndDtkYXRhLCAtMSwgJiMzNDtza2VsLSZndDtwZXJjcHUtJmd0O2RhdGEmIzM0Oyk7CiYjNDM7CUFTU0VSVF9GQUxTRShza2VsLSZndDtwZXJjcHUtJmd0O3J1biwgJiMzNDtza2VsLSZndDtwZXJjcHUtJmd0O3J1biYjMzQ7KTsKJiM0MzsJQVNTRVJUX0VRKHNrZWwtJmd0O3BlcmNwdS0mZ3Q7bnVtc1s2XSwgMCwgJiMzNDtza2VsLSZndDtwZXJjcHUtJmd0O251bXNbNl0mIzM0Oyk7CiYjNDM7CUFTU0VSVF9FUShza2VsLSZndDtwZXJjcHUtJmd0O3N0cnVjdF9kYXRhLmksIC0xLCAmIzM0O3N0cnVjdF9kYXRhLmkmIzM0Oyk7CiYjNDM7CUFTU0VSVF9GQUxTRShza2VsLSZndDtwZXJjcHUtJmd0O3N0cnVjdF9kYXRhLnNldCwgJiMzNDtzdHJ1Y3RfZGF0YS5zZXQmIzM0Oyk7CiYjNDM7CUFTU0VSVF9FUShza2VsLSZndDtwZXJjcHUtJmd0O3N0cnVjdF9kYXRhLm51bXNbNl0sIDAsICYjMzQ7c3RydWN0X2RhdGEubnVtc1s2XSYjMzQ7KTsKJiM0MzsKJiM0MzsJbWFwID0gc2tlbC0mZ3Q7bWFwcy5wZXJjcHU7CiYjNDM7CWlmICghQVNTRVJUX0VRKGJwZl9tYXBfX3R5cGUobWFwKSwgQlBGX01BUF9UWVBFX1BFUkNQVV9BUlJBWSwgJiMzNDticGZfbWFwX190eXBlJiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CiYjNDM7CWluaXRfdmFsdWUuZGF0YSA9IDI7CiYjNDM7CWluaXRfdmFsdWUubnVtc1s2XSA9IC0xOwomIzQzOwlpbml0X3ZhbHVlLnN0cnVjdF9kYXRhLmkgPSAyOwomIzQzOwlpbml0X3ZhbHVlLnN0cnVjdF9kYXRhLm51bXNbNl0gPSAtMTsKJiM0MzsJZXJyID0gYnBmX21hcF9fc2V0X2luaXRpYWxfdmFsdWUobWFwLCAmYW1wO2luaXRfdmFsdWUsIHNpemVvZihpbml0X3ZhbHVlKSk7CiYjNDM7CWlmICghQVNTRVJUX09LKGVyciwgJiMzNDticGZfbWFwX19zZXRfaW5pdGlhbF92YWx1ZSYjMzQ7KSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwomIzQzOwlpbml0X2RhdGEgPSBicGZfbWFwX19pbml0aWFsX3ZhbHVlKG1hcCwgJmFtcDtpbml0X2RhdGFfc3opOwomIzQzOwlpZiAoIUFTU0VSVF9PS19QVFIoaW5pdF9kYXRhLCAmIzM0O2JwZl9tYXBfX2luaXRpYWxfdmFsdWUmIzM0OykpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsKJiM0MzsJQVNTRVJUX0VRKGluaXRfZGF0YS0mZ3Q7ZGF0YSwgaW5pdF92YWx1ZS5kYXRhLCAmIzM0O2luaXRfdmFsdWUgZGF0YSYjMzQ7KTsKJiM0MzsJQVNTRVJUX0VRKGluaXRfZGF0YS0mZ3Q7cnVuLCBpbml0X3ZhbHVlLnJ1biwgJiMzNDtpbml0X3ZhbHVlIHJ1biYjMzQ7KTsKJiM0MzsJQVNTRVJUX0VRKGluaXRfZGF0YS0mZ3Q7c3RydWN0X2RhdGEuaSwgaW5pdF92YWx1ZS5zdHJ1Y3RfZGF0YS5pLCAmIzM0O2luaXRfdmFsdWUgc3RydWN0X2RhdGEuaSYjMzQ7KTsKJiM0MzsJQVNTRVJUX0VRKGluaXRfZGF0YS0mZ3Q7c3RydWN0X2RhdGEubnVtc1s2XSwgaW5pdF92YWx1ZS5zdHJ1Y3RfZGF0YS5udW1zWzZdLAomIzQzOwkJICAmIzM0O2luaXRfdmFsdWUgc3RydWN0X2RhdGEubnVtc1s2XSYjMzQ7KTsKJiM0MzsJQVNTRVJUX0VRKGluaXRfZGF0YV9zeiwgc2l6ZW9mKGluaXRfdmFsdWUpLCAmIzM0O2luaXRfdmFsdWUgc2l6ZSYjMzQ7KTsKJiM0MzsJQVNTRVJUX0VRKCh2b2lkICopIGluaXRfZGF0YSwgKHZvaWQgKikgc2tlbC0mZ3Q7cGVyY3B1LCAmIzM0O3NrZWwtJmd0O3BlcmNwdSBlcSBpbml0X2RhdGEmIzM0Oyk7CiYjNDM7CUFTU0VSVF9FUShza2VsLSZndDtwZXJjcHUtJmd0O2RhdGEsIGluaXRfdmFsdWUuZGF0YSwgJiMzNDtza2VsLSZndDtwZXJjcHUtJmd0O2RhdGEmIzM0Oyk7CiYjNDM7CUFTU0VSVF9FUShza2VsLSZndDtwZXJjcHUtJmd0O3J1biwgaW5pdF92YWx1ZS5ydW4sICYjMzQ7c2tlbC0mZ3Q7cGVyY3B1LSZndDtydW4mIzM0Oyk7CiYjNDM7CUFTU0VSVF9FUShza2VsLSZndDtwZXJjcHUtJmd0O3N0cnVjdF9kYXRhLmksIGluaXRfdmFsdWUuc3RydWN0X2RhdGEuaSwKJiM0MzsJCSAgJiMzNDtza2VsLSZndDtwZXJjcHUtJmd0O3N0cnVjdF9kYXRhLmkmIzM0Oyk7CiYjNDM7CUFTU0VSVF9FUShza2VsLSZndDtwZXJjcHUtJmd0O3N0cnVjdF9kYXRhLm51bXNbNl0sIGluaXRfdmFsdWUuc3RydWN0X2RhdGEubnVtc1s2XSwKJiM0MzsJCSAgJiMzNDtza2VsLSZndDtwZXJjcHUtJmd0O3N0cnVjdF9kYXRhLm51bXNbNl0mIzM0Oyk7CiYjNDM7CiYjNDM7CWVyciA9IHRlc3RfZ2xvYmFsX3BlcmNwdV9kYXRhX19sb2FkKHNrZWwpOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhlcnIsICYjMzQ7dGVzdF9nbG9iYWxfcGVyY3B1X2RhdGFfX2xvYWQmIzM0OykpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsKJiM0MzsJQVNTRVJUX09LX1BUUihza2VsLSZndDtwZXJjcHUsICYjMzQ7c2tlbC0mZ3Q7cGVyY3B1JiMzNDspOwomIzQzOwomIzQzOwltYXBfZmQgPSBicGZfbWFwX19mZChtYXApOwomIzQzOwlwcm9nX2ZkID0gYnBmX3Byb2dyYW1fX2ZkKHNrZWwtJmd0O3Byb2dzLnVwZGF0ZV9wZXJjcHVfZGF0YSk7CiYjNDM7CXRlc3RfcGVyY3B1X2RhdGFfb25fY3B1cyhtYXBfZmQsIHByb2dfZmQsIG51bV9vbmxpbmUsIG9ubGluZSk7CiYjNDM7CiYjNDM7b3V0OgomIzQzOwl0ZXN0X2dsb2JhbF9wZXJjcHVfZGF0YV9fZGVzdHJveShza2VsKTsKJiM0MzsJZnJlZShvbmxpbmUpOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgdm9pZCB0ZXN0X2dsb2JhbF9wZXJjcHVfZGF0YV9sc2tlbCh2b2lkKQomIzQzO3sKJiM0MzsJc3RydWN0IHRlc3RfZ2xvYmFsX3BlcmNwdV9kYXRhX2xza2VsICpsc2tlbCA9IE5VTEw7CiYjNDM7CWludCBwcm9nX2ZkLCBtYXBfZmQsIGVyciwgbnVtX29ubGluZTsKJiM0MzsJYm9vbCAqb25saW5lOwomIzQzOwomIzQzOwllcnIgPSBwYXJzZV9jcHVfbWFza19maWxlKCYjMzQ7L3N5cy9kZXZpY2VzL3N5c3RlbS9jcHUvb25saW5lJiMzNDssICZhbXA7b25saW5lLCAmYW1wO251bV9vbmxpbmUpOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhlcnIsICYjMzQ7cGFyc2VfY3B1X21hc2tfZmlsZSYjMzQ7KSkKJiM0MzsJCXJldHVybjsKJiM0MzsKJiM0MzsJbHNrZWwgPSB0ZXN0X2dsb2JhbF9wZXJjcHVfZGF0YV9sc2tlbF9fb3Blbl9hbmRfbG9hZCgpOwomIzQzOwlpZiAoIUFTU0VSVF9PS19QVFIobHNrZWwsICYjMzQ7dGVzdF9nbG9iYWxfcGVyY3B1X2RhdGFfbHNrZWxfX29wZW5fYW5kX2xvYWQmIzM0OykpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsKJiM0MzsJbWFwX2ZkID0gbHNrZWwtJmd0O21hcHMucGVyY3B1Lm1hcF9mZDsKJiM0MzsJcHJvZ19mZCA9IGxza2VsLSZndDtwcm9ncy51cGRhdGVfcGVyY3B1X2RhdGEucHJvZ19mZDsKJiM0MzsJdGVzdF9wZXJjcHVfZGF0YV9vbl9jcHVzKG1hcF9mZCwgcHJvZ19mZCwgbnVtX29ubGluZSwgb25saW5lKTsKJiM0MzsKJiM0MztvdXQ6CiYjNDM7CXRlc3RfZ2xvYmFsX3BlcmNwdV9kYXRhX2xza2VsX19kZXN0cm95KGxza2VsKTsKJiM0MzsJZnJlZShvbmxpbmUpOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50IGNyZWF0ZV9yZG9ubHlfcGVyY3B1X2FycmF5KHZvaWQpCiYjNDM7ewomIzQzOwlMSUJCUEZfT1BUUyhicGZfbWFwX2NyZWF0ZV9vcHRzLCBtYXBfb3B0cywKJiM0MzsJCSAgICAubWFwX2ZsYWdzID0gQlBGX0ZfUkRPTkxZX1BST0csCiYjNDM7CSk7CiYjNDM7CWludCBrZXkgPSAwLCBtYXBfZmQsIGVycjsKJiM0MzsJX191NjQgdmFsdWUgPSAwOwomIzQzOwomIzQzOwltYXBfZmQgPSBicGZfbWFwX2NyZWF0ZShCUEZfTUFQX1RZUEVfUEVSQ1BVX0FSUkFZLCAmIzM0O3BlcmNwdV9yb19tYXAmIzM0Oywgc2l6ZW9mKGludCksCiYjNDM7CQkJCXNpemVvZihfX3U2NCksIDEsICZhbXA7bWFwX29wdHMpOwomIzQzOwlpZiAoIUFTU0VSVF9HRShtYXBfZmQsIDAsICYjMzQ7YnBmX21hcF9jcmVhdGUmIzM0OykpCiYjNDM7CQlyZXR1cm4gLTE7CiYjNDM7CiYjNDM7CWVyciA9IGJwZl9tYXBfdXBkYXRlX2VsZW0obWFwX2ZkLCAmYW1wO2tleSwgJmFtcDt2YWx1ZSwgQlBGX0ZfQUxMX0NQVVMpOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhlcnIsICYjMzQ7YnBmX21hcF91cGRhdGVfZWxlbSYjMzQ7KSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwomIzQzOwllcnIgPSBicGZfbWFwX2ZyZWV6ZShtYXBfZmQpOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhlcnIsICYjMzQ7YnBmX21hcF9mcmVlemUmIzM0OykpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsKJiM0MzsJcmV0dXJuIG1hcF9mZDsKJiM0MzsKJiM0MztvdXQ6CiYjNDM7CWNsb3NlKG1hcF9mZCk7CiYjNDM7CXJldHVybiAtMTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgdGVzdF9nbG9iYWxfcGVyY3B1X2RhdGFfcmRvbmx5X2RpcmVjdF9yZWFkKHZvaWQpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgYnBmX2luc24gaW5zbnNbXSA9IHsKJiM0MzsJCUJQRl9MRF9NQVBfVkFMVUUoQlBGX1JFR18xLCAwLCAwKSwKJiM0MzsJCUJQRl9MRFhfTUVNKEJQRl9EVywgQlBGX1JFR18wLCBCUEZfUkVHXzEsIDApLAomIzQzOwkJQlBGX0VYSVRfSU5TTigpLAomIzQzOwl9OwomIzQzOwlpbnQgbWFwX2ZkLCBwcm9nX2ZkOwomIzQzOwomIzQzOwltYXBfZmQgPSBjcmVhdGVfcmRvbmx5X3BlcmNwdV9hcnJheSgpOwomIzQzOwlpZiAobWFwX2ZkICZsdDsgMCkKJiM0MzsJCXJldHVybjsKJiM0MzsKJiM0MzsJaW5zbnNbMF0uaW1tID0gbWFwX2ZkOwomIzQzOwlwcm9nX2ZkID0gYnBmX3Byb2dfbG9hZChCUEZfUFJPR19UWVBFX1NPQ0tFVF9GSUxURVIsICYjMzQ7cGVyY3B1X3JvX3Byb2cmIzM0OywgJiMzNDtHUEwmIzM0OywgaW5zbnMsCiYjNDM7CQkJCUFSUkFZX1NJWkUoaW5zbnMpLCBOVUxMKTsKJiM0MzsJaWYgKEFTU0VSVF9HRShwcm9nX2ZkLCAwLCAmIzM0O2JwZl9wcm9nX2xvYWQmIzM0OykpCiYjNDM7CQljbG9zZShwcm9nX2ZkKTsKJiM0MzsJY2xvc2UobWFwX2ZkKTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgdGVzdF9nbG9iYWxfcGVyY3B1X2RhdGFfcmRvbmx5X2RpcmVjdF93cml0ZSh2b2lkKQomIzQzO3sKJiM0MzsJTElCQlBGX09QVFMoYnBmX3Byb2dfbG9hZF9vcHRzLCBwcm9nX29wdHMpOwomIzQzOwlzdHJ1Y3QgYnBmX2luc24gaW5zbnNbXSA9IHsKJiM0MzsJCUJQRl9MRF9NQVBfVkFMVUUoQlBGX1JFR18xLCAwLCAwKSwKJiM0MzsJCUJQRl9MRFhfTUVNKEJQRl9EVywgQlBGX1JFR18wLCBCUEZfUkVHXzEsIDApLAomIzQzOwkJQlBGX1NUX01FTShCUEZfRFcsIEJQRl9SRUdfMSwgMCwgMCksCiYjNDM7CQlCUEZfRVhJVF9JTlNOKCksCiYjNDM7CX07CiYjNDM7CWNoYXIgbG9nX2J1ZlsyNTZdID0ge307CiYjNDM7CWludCBtYXBfZmQsIHByb2dfZmQ7CiYjNDM7CiYjNDM7CXByb2dfb3B0cy5sb2dfYnVmID0gbG9nX2J1ZjsKJiM0MzsJcHJvZ19vcHRzLmxvZ19zaXplID0gc2l6ZW9mKGxvZ19idWYpOwomIzQzOwlwcm9nX29wdHMubG9nX2xldmVsID0gMTsKJiM0MzsKJiM0MzsJbWFwX2ZkID0gY3JlYXRlX3Jkb25seV9wZXJjcHVfYXJyYXkoKTsKJiM0MzsJaWYgKG1hcF9mZCAmbHQ7IDApCiYjNDM7CQlyZXR1cm47CiYjNDM7CiYjNDM7CWluc25zWzBdLmltbSA9IG1hcF9mZDsKJiM0MzsJcHJvZ19mZCA9IGJwZl9wcm9nX2xvYWQoQlBGX1BST0dfVFlQRV9TT0NLRVRfRklMVEVSLCAmIzM0O3BlcmNwdV9yb19wcm9nJiMzNDssICYjMzQ7R1BMJiMzNDssIGluc25zLAomIzQzOwkJCQlBUlJBWV9TSVpFKGluc25zKSwgJmFtcDtwcm9nX29wdHMpOwomIzQzOwlpZiAoIUFTU0VSVF9MVChwcm9nX2ZkLCAwLCAmIzM0O2JwZl9wcm9nX2xvYWQmIzM0OykpCiYjNDM7CQljbG9zZShwcm9nX2ZkKTsKJiM0MzsJZWxzZQomIzQzOwkJQVNTRVJUX0hBU19TVUJTVFIobG9nX2J1ZiwgJiMzNDt3cml0ZSBpbnRvIG1hcCBmb3JiaWRkZW4mIzM0OywgJiMzNDt2ZXJpZmllciBsb2cmIzM0Oyk7CiYjNDM7CWNsb3NlKG1hcF9mZCk7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkIHRlc3RfZ2xvYmFsX3BlcmNwdV9kYXRhX3ZlcmlmaWVyX2xvZyh2b2lkKQomIzQzO3sKJiM0MzsJUlVOX1RFU1RTKHRlc3RfZ2xvYmFsX3BlcmNwdV9kYXRhKTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgdGVzdF9nbG9iYWxfcGVyY3B1X2RhdGFfaXRlcih2b2lkKQomIzQzO3sKJiM0MzsJREVDTEFSRV9MSUJCUEZfT1BUUyhicGZfaXRlcl9hdHRhY2hfb3B0cywgb3B0cyk7CiYjNDM7CXN0cnVjdCB0ZXN0X2dsb2JhbF9wZXJjcHVfZGF0YSAqc2tlbDsKJiM0MzsJdW5pb24gYnBmX2l0ZXJfbGlua19pbmZvIGxpbmZvID0ge307CiYjNDM7CXN0cnVjdCBicGZfbGluayAqbGluayA9IE5VTEw7CiYjNDM7CWludCBmZCwgbnVtX2NwdXMsIGxlbiwgZXJyOwomIzQzOwljaGFyIGJ1ZlsxNl07CiYjNDM7CiYjNDM7CW51bV9jcHVzID0gbGliYnBmX251bV9wb3NzaWJsZV9jcHVzKCk7CiYjNDM7CWlmICghQVNTRVJUX0dUKG51bV9jcHVzLCAwLCAmIzM0O2xpYmJwZl9udW1fcG9zc2libGVfY3B1cyYjMzQ7KSkKJiM0MzsJCXJldHVybjsKJiM0MzsKJiM0MzsJc2tlbCA9IHRlc3RfZ2xvYmFsX3BlcmNwdV9kYXRhX19vcGVuKCk7CiYjNDM7CWlmICghQVNTRVJUX09LX1BUUihza2VsLCAmIzM0O3Rlc3RfZ2xvYmFsX3BlcmNwdV9kYXRhX19vcGVuJiMzNDspKQomIzQzOwkJcmV0dXJuOwomIzQzOwomIzQzOwlza2VsLSZndDtyb2RhdGEtJmd0O251bV9jcHVzID0gbnVtX2NwdXM7CiYjNDM7CXNrZWwtJmd0O3JvZGF0YS0mZ3Q7b2Zmc2V0b2ZfbnVtID0gb2Zmc2V0b2Yoc3RydWN0IHRlc3RfZ2xvYmFsX3BlcmNwdV9kYXRhX19wZXJjcHUsIHN0cnVjdF9kYXRhKTsKJiM0MzsJc2tlbC0mZ3Q7cm9kYXRhLSZndDtvZmZzZXRvZl9udW0gJiM0Mzs9IHNpemVvZihza2VsLSZndDtwZXJjcHUtJmd0O3N0cnVjdF9kYXRhKSAtIHNpemVvZihpbnQpOwomIzQzOwlza2VsLSZndDtyb2RhdGEtJmd0O2VsZW1fc3ogPSByb3VuZHVwKHNpemVvZihzdHJ1Y3QgdGVzdF9nbG9iYWxfcGVyY3B1X2RhdGFfX3BlcmNwdSksIDgpOwomIzQzOwlza2VsLSZndDtwZXJjcHUtJmd0O3N0cnVjdF9kYXRhLm51bXNbNl0gPSAweGMwZGU7CiYjNDM7CiYjNDM7CWVyciA9IHRlc3RfZ2xvYmFsX3BlcmNwdV9kYXRhX19sb2FkKHNrZWwpOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhlcnIsICYjMzQ7dGVzdF9nbG9iYWxfcGVyY3B1X2RhdGFfX2xvYWQmIzM0OykpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsKJiM0MzsJbGluZm8ubWFwLm1hcF9mZCA9IGJwZl9tYXBfX2ZkKHNrZWwtJmd0O21hcHMucGVyY3B1KTsKJiM0MzsJb3B0cy5saW5rX2luZm8gPSAmYW1wO2xpbmZvOwomIzQzOwlvcHRzLmxpbmtfaW5mb19sZW4gPSBzaXplb2YobGluZm8pOwomIzQzOwlsaW5rID0gYnBmX3Byb2dyYW1fX2F0dGFjaF9pdGVyKHNrZWwtJmd0O3Byb2dzLmR1bXBfcGVyY3B1X2RhdGEsICZhbXA7b3B0cyk7CiYjNDM7CWlmICghQVNTRVJUX09LX1BUUihsaW5rLCAmIzM0O2JwZl9wcm9ncmFtX19hdHRhY2hfaXRlciYjMzQ7KSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwomIzQzOwlmZCA9IGJwZl9pdGVyX2NyZWF0ZShicGZfbGlua19fZmQobGluaykpOwomIzQzOwlpZiAoIUFTU0VSVF9HRShmZCwgMCwgJiMzNDticGZfaXRlcl9jcmVhdGUmIzM0OykpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsKJiM0MzsJd2hpbGUgKChsZW4gPSByZWFkKGZkLCBidWYsIHNpemVvZihidWYpKSkgJmd0OyAwKQomIzQzOwkJZG8geyB9IHdoaWxlICgwKTsKJiM0MzsJQVNTRVJUX0VRKGxlbiwgMCwgJiMzNDtyZWFkIGl0ZXImIzM0Oyk7CiYjNDM7CUFTU0VSVF9UUlVFKHNrZWwtJmd0O2Jzcy0mZ3Q7cnVuX2l0ZXIsICYjMzQ7cnVuX2l0ZXImIzM0Oyk7CiYjNDM7CUFTU0VSVF9FUShza2VsLSZndDtic3MtJmd0O3BlcmNwdV9kYXRhX3N1bSwgMHhjMGRlICogbnVtX2NwdXMsICYjMzQ7cGVyY3B1X2RhdGFfc3VtJiMzNDspOwomIzQzOwomIzQzOwljbG9zZShmZCk7CiYjNDM7b3V0OgomIzQzOwlicGZfbGlua19fZGVzdHJveShsaW5rKTsKJiM0MzsJdGVzdF9nbG9iYWxfcGVyY3B1X2RhdGFfX2Rlc3Ryb3koc2tlbCk7CiYjNDM7fQomIzQzOwomIzQzO3ZvaWQgdGVzdF9nbG9iYWxfcGVyY3B1X2RhdGEodm9pZCkKJiM0Mzt7CiYjNDM7CWlmICghZmVhdF9zdXBwb3J0ZWQoTlVMTCwgRkVBVF9QRVJDUFVfREFUQSkpIHsKJiM0MzsJCXRlc3RfX3NraXAoKTsKJiM0MzsJCXJldHVybjsKJiM0MzsJfQomIzQzOwomIzQzOwlpZiAodGVzdF9fc3RhcnRfc3VidGVzdCgmIzM0O2luaXQmIzM0OykpCiYjNDM7CQl0ZXN0X2dsb2JhbF9wZXJjcHVfZGF0YV9pbml0KCk7CiYjNDM7CWlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KCYjMzQ7bHNrZWwmIzM0OykpCiYjNDM7CQl0ZXN0X2dsb2JhbF9wZXJjcHVfZGF0YV9sc2tlbCgpOwomIzQzOwlpZiAodGVzdF9fc3RhcnRfc3VidGVzdCgmIzM0O3Jkb25seV9kaXJlY3RfcmVhZCYjMzQ7KSkKJiM0MzsJCXRlc3RfZ2xvYmFsX3BlcmNwdV9kYXRhX3Jkb25seV9kaXJlY3RfcmVhZCgpOwomIzQzOwlpZiAodGVzdF9fc3RhcnRfc3VidGVzdCgmIzM0O3Jkb25seV9kaXJlY3Rfd3JpdGUmIzM0OykpCiYjNDM7CQl0ZXN0X2dsb2JhbF9wZXJjcHVfZGF0YV9yZG9ubHlfZGlyZWN0X3dyaXRlKCk7CiYjNDM7CXRlc3RfZ2xvYmFsX3BlcmNwdV9kYXRhX3ZlcmlmaWVyX2xvZygpOwomIzQzOwlpZiAodGVzdF9fc3RhcnRfc3VidGVzdCgmIzM0O2l0ZXImIzM0OykpCiYjNDM7CQl0ZXN0X2dsb2JhbF9wZXJjcHVfZGF0YV9pdGVyKCk7CiYjNDM7fQpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvZ2xvYmFsX3BlcmNwdV9zdWJza2VsLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9nbG9iYWxfcGVyY3B1X3N1YnNrZWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMC4uOGFlYmQ1MzNkODZiNTQKLS0tIC9kZXYvbnVsbAomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9nbG9iYWxfcGVyY3B1X3N1YnNrZWwuYwpAQCAtMCwwICYjNDM7MSwzNyBAQAomIzQzOy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wCiYjNDM7I2luY2x1ZGUgJmx0O3Rlc3RfcHJvZ3MuaCZndDsKJiM0MzsjaW5jbHVkZSAmIzM0O3Rlc3RfZ2xvYmFsX3BlcmNwdV9kYXRhLnN1YnNrZWwuaCYjMzQ7CiYjNDM7CiYjNDM7dm9pZCB0ZXN0X2dsb2JhbF9wZXJjcHVfZGF0YV9zdWJza2VsKHZvaWQpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgdGVzdF9nbG9iYWxfcGVyY3B1X2RhdGEgKnN1YnNrZWwgPSBOVUxMOwomIzQzOwlzdHJ1Y3QgYnBmX29iamVjdCAqb2JqOwomIzQzOwlpbnQgaTsKJiM0MzsKJiM0MzsJb2JqID0gYnBmX29iamVjdF9fb3Blbl9maWxlKCYjMzQ7Li90ZXN0X2dsb2JhbF9wZXJjcHVfZGF0YS5icGYubyYjMzQ7LCBOVUxMKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0tfUFRSKG9iaiwgJiMzNDticGZfb2JqZWN0X19vcGVuX2ZpbGUmIzM0OykpCiYjNDM7CQlyZXR1cm47CiYjNDM7CiYjNDM7CXN1YnNrZWwgPSB0ZXN0X2dsb2JhbF9wZXJjcHVfZGF0YV9fb3BlbihvYmopOwomIzQzOwlpZiAoIUFTU0VSVF9PS19QVFIoc3Vic2tlbCwgJiMzNDt0ZXN0X2dsb2JhbF9wZXJjcHVfZGF0YV9fb3BlbiYjMzQ7KSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwomIzQzOwlpZiAoIUFTU0VSVF9PS19QVFIoc3Vic2tlbC0mZ3Q7c3Vic2tlbCwgJiMzNDtzdWJza2VsJiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CWlmICghQVNTRVJUX09LX1BUUihzdWJza2VsLSZndDttYXBzLnBlcmNwdSwgJiMzNDttYXBzLnBlcmNwdSYjMzQ7KSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwlBU1NFUlRfRVEoYnBmX21hcF9fdHlwZShzdWJza2VsLSZndDttYXBzLnBlcmNwdSksIEJQRl9NQVBfVFlQRV9QRVJDUFVfQVJSQVksCiYjNDM7CQkgICYjMzQ7cGVyY3B1X21hcF90eXBlJiMzNDspOwomIzQzOwlBU1NFUlRfR1Qoc3Vic2tlbC0mZ3Q7c3Vic2tlbC0mZ3Q7dmFyX2NudCwgMCwgJiMzNDt2YXJfY250JiMzNDspOwomIzQzOwomIzQzOwlmb3IgKGkgPSAwOyBpICZsdDsgc3Vic2tlbC0mZ3Q7c3Vic2tlbC0mZ3Q7dmFyX2NudDsgaSYjNDM7JiM0MzspIHsKJiM0MzsJCWNvbnN0IHN0cnVjdCBicGZfdmFyX3NrZWxldG9uICp2YXI7CiYjNDM7CiYjNDM7CQl2YXIgPSAodm9pZCAqKSBzdWJza2VsLSZndDtzdWJza2VsLSZndDt2YXJzICYjNDM7IGkgKiBzdWJza2VsLSZndDtzdWJza2VsLSZndDt2YXJfc2tlbF9zejsKJiM0MzsJCUFTU0VSVF9ORVEodmFyLSZndDttYXAsICZhbXA7c3Vic2tlbC0mZ3Q7bWFwcy5wZXJjcHUsICYjMzQ7dmFyJiMzNDspOwomIzQzOwl9CiYjNDM7CiYjNDM7b3V0OgomIzQzOwl0ZXN0X2dsb2JhbF9wZXJjcHVfZGF0YV9fZGVzdHJveShzdWJza2VsKTsKJiM0MzsJYnBmX29iamVjdF9fY2xvc2Uob2JqKTsKJiM0Mzt9CmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvdGVzdF9nbG9iYWxfcGVyY3B1X2RhdGEuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy90ZXN0X2dsb2JhbF9wZXJjcHVfZGF0YS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwLi5lZWY4OGZkNjFhZjUxMQotLS0gL2Rldi9udWxsCiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy90ZXN0X2dsb2JhbF9wZXJjcHVfZGF0YS5jCkBAIC0wLDAgJiM0MzsxLDc5IEBACiYjNDM7Ly8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAKJiM0MzsjaW5jbHVkZSAmbHQ7dm1saW51eC5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDticGYvYnBmX2hlbHBlcnMuaCZndDsKJiM0MzsjaW5jbHVkZSAmIzM0O2JwZl9taXNjLmgmIzM0OwomIzQzOwomIzQzO2ludCBkYXRhIFNFQygmIzM0Oy5wZXJjcHUmIzM0OykgPSAtMTsKJiM0MztpbnQgbnVtc1s3XSBTRUMoJiMzNDsucGVyY3B1JiMzNDspOwomIzQzO2NoYXIgcnVuIFNFQygmIzM0Oy5wZXJjcHUmIzM0OykgPSAwOwomIzQzO3N0cnVjdCB7CiYjNDM7CWNoYXIgc2V0OwomIzQzOwlpbnQgaTsKJiM0MzsJaW50IG51bXNbN107CiYjNDM7fSBzdHJ1Y3RfZGF0YSBTRUMoJiMzNDsucGVyY3B1JiMzNDspID0gewomIzQzOwkuc2V0ID0gMCwKJiM0MzsJLmkgPSAtMSwKJiM0Mzt9OwomIzQzOwomIzQzO1NFQygmIzM0O3Jhd190cC90YXNrX3JlbmFtZSYjMzQ7KQomIzQzO19fYXV4aWxpYXJ5CiYjNDM7aW50IHVwZGF0ZV9wZXJjcHVfZGF0YSh2b2lkICpjdHgpCiYjNDM7ewomIzQzOwlzdHJ1Y3RfZGF0YS5udW1zWzZdID0gMHhjMGRlOwomIzQzOwlzdHJ1Y3RfZGF0YS5zZXQgPSAxOwomIzQzOwlzdHJ1Y3RfZGF0YS5pID0gMTsKJiM0MzsJbnVtc1s2XSA9IDB4YzBkZTsKJiM0MzsJZGF0YSA9IDE7CiYjNDM7CXJ1biA9IDE7CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgY29uc3QgY2hhciBmbXRbXSBTRUMoJiMzNDsucGVyY3B1LmZtdCYjMzQ7KSA9ICYjMzQ7ZGF0YSAlZFxuJiMzNDs7CiYjNDM7CiYjNDM7U0VDKCYjMzQ7P2twcm9iZSYjMzQ7KQomIzQzO19fZmFpbHVyZSBfX21zZygmIzM0O1J7e1swLTldJiM0Mzt9fSBwb2ludHMgdG8gcGVyY3B1X2FycmF5IG1hcCB3aGljaCBjYW5ub3QgYmUgdXNlZCBhcyBjb25zdCBzdHJpbmcmIzM0OykKJiM0MztpbnQgdmVyaWZpZXJfc3RybmNtcCh2b2lkICpjdHgpCiYjNDM7ewomIzQzOwlyZXR1cm4gYnBmX3N0cm5jbXAoJiMzNDt0ZXN0JiMzNDssIDUsIGZtdCk7CiYjNDM7fQomIzQzOwomIzQzO1NFQygmIzM0Oz9rcHJvYmUmIzM0OykKJiM0MztfX2ZhaWx1cmUgX19tc2coJiMzNDtSe3tbMC05XSYjNDM7fX0gcG9pbnRzIHRvIHBlcmNwdV9hcnJheSBtYXAgd2hpY2ggY2Fubm90IGJlIHVzZWQgYXMgY29uc3Qgc3RyaW5nJiMzNDspCiYjNDM7aW50IHZlcmlmaWVyX3NucHJpbnRmKHZvaWQgKmN0eCkKJiM0Mzt7CiYjNDM7CXU2NCBhcmdzW10gPSB7IGRhdGEgfTsKJiM0MzsJY2hhciBidWZbMTI4XTsKJiM0MzsJaW50IGxlbjsKJiM0MzsKJiM0MzsJbGVuID0gYnBmX3NucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksIGZtdCwgYXJncywgc2l6ZW9mKGFyZ3MpKTsKJiM0MzsJaWYgKGxlbiAmZ3Q7IDApCiYjNDM7CQlicGZfcHJpbnRrKCYjMzQ7c25wcmludGY6ICVzXG4mIzM0OywgYnVmKTsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOwomIzQzO3ZvbGF0aWxlIGNvbnN0IF9fdTMyIG51bV9jcHVzID0gMDsKJiM0Mzt2b2xhdGlsZSBjb25zdCBpbnQgb2Zmc2V0b2ZfbnVtOwomIzQzO3ZvbGF0aWxlIGNvbnN0IGludCBlbGVtX3N6OwomIzQzO19fdTMyIHBlcmNwdV9kYXRhX3N1bSA9IDA7CiYjNDM7Ym9vbCBydW5faXRlciA9IGZhbHNlOwomIzQzOwomIzQzO1NFQygmIzM0O2l0ZXIvYnBmX21hcF9lbGVtJiMzNDspCiYjNDM7X19hdXhpbGlhcnkKJiM0MztpbnQgZHVtcF9wZXJjcHVfZGF0YShzdHJ1Y3QgYnBmX2l0ZXJfX2JwZl9tYXBfZWxlbSAqY3R4KQomIzQzO3sKJiM0MzsJdm9pZCAqcHB0ciA9IGN0eC0mZ3Q7dmFsdWU7CiYjNDM7CWludCBpOwomIzQzOwomIzQzOwlpZiAoIXBwdHIpCiYjNDM7CQlyZXR1cm4gMDsKJiM0MzsKJiM0MzsJcnVuX2l0ZXIgPSB0cnVlOwomIzQzOwomIzQzOwlmb3IgKGkgPSAwOyBpICZsdDsgbnVtX2NwdXM7IGkmIzQzOyYjNDM7KSB7CiYjNDM7CQlwZXJjcHVfZGF0YV9zdW0gJiM0Mzs9ICooaW50ICopIChwcHRyICYjNDM7IG9mZnNldG9mX251bSk7CiYjNDM7CQlwcHRyICYjNDM7PSBlbGVtX3N6OwomIzQzOwl9CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MzsKJiM0MztjaGFyIF9saWNlbnNlW10gU0VDKCYjMzQ7bGljZW5zZSYjMzQ7KSA9ICYjMzQ7R1BMJiMzNDs7CjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA2LzI5IDE2OjM5PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDE4NzU4CgkJCQkJCQlvdXRwdXQ6IDI2CgkJCQkJCQl0aG91Z2h0czogNDUwCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKk15IEJQRiBQZXItQ1BVIE1hcCBJbXBsZW1lbnRhdGlvbiBBc3Nlc3NtZW50KioKCk9rYXksIHNvIEkmIzM5O20gbG9va2luZyBhdCB0aGlzIHBhdGNoIGludHJvZHVjaW5nIGAucGVyY3B1YCBtYXAgc3VwcG9ydCB3aXRoaW4gQlBGLCBhbmQgbXkgaW5pdGlhbCB0aG91Z2h0IGlzLCAmIzM0O1RoaXMgaXMgYSBwcmV0dHkgc2lnbmlmaWNhbnQgYWRkaXRpb24uJiMzNDsgSXQgdG91Y2hlcyBzZXZlcmFsIGtleSBmaWxlcywgc3BlY2lmaWNhbGx5IGBhcnJheW1hcC5jYCwgYGNvbnN0X2ZvbGQuY2AsIGBmaXh1cHMuY2AsIGFuZCB0aGUgdmVyaWZpZXIsIHNvIHdlJiMzOTtyZSB0YWxraW5nIGFib3V0IGEgZmFpciBhbW91bnQgb2YgdW5kZXJseWluZyBtZWNoYW5pc20gY2hhbmdlcy4gSSBzZWUgdGhhdCBpdCBpbnRyb2R1Y2VzIGBCUEZfTUFQX1RZUEVfUEVSQ1BVX0FSUkFZYCBhcyBhIG5ldyBtYXAgdHlwZSwgd2hpY2ggYWxsb3dzIGZvciBgLnBlcmNwdWAgc2VjdGlvbnMgdG8gYmUgdXNlZCBhbmQgdHJhbnNsYXRlZC4gVGhhdCBzZWVtcyBjbGVhbiBlbm91Z2guIFNwZWNpZmljYWxseSwgaXQgc2VlbXMgaXQgaW50cm9kdWNlcyBuZXcgZnVuY3Rpb25zIGBwZXJjcHVfYXJyYXlfbWFwX2RpcmVjdF92YWx1ZV9hZGRyYCBhbmQgYHBlcmNwdV9hcnJheV9tYXBfZGlyZWN0X3ZhbHVlX21ldGFgIHdpdGhpbiBgcGVyY3B1X2FycmF5X21hcF9vcHNgLCB3aGljaCBhcmUgY3JpdGljYWwgYWRkaXRpb25zLgoKVGhlIGNydWNpYWwgYXNwZWN0IHNlZW1zIHRvIGJlIGhvdyBpdCBoYW5kbGVzIHRoZSBpbnN0cnVjdGlvbiBmaXh1cHMuIE1vZGlmeWluZyBgYnBmX2RvX21pc2NfZml4dXBzYCB0byBwYXRjaCBgQlBGX0xEIHwgQlBGX0lNTSB8IEJQRl9EV2AgaW5zdHJ1Y3Rpb25zIHRoYXQgbG9hZCBmcm9tIHRoZSBwZXJjcHUgYXJyYXkgdG8gdXNlIGBCUEZfTU9WNjRfUEVSQ1BVX1JFR2AgaXMgZ29pbmcgdG8gYmUgYSBmb2N1cy4gVGhpcyBpcyBhIGZ1bmN0aW9uYWwgY2hhbmdlLCBhbmQgZ2l2ZW4gaXRzIHNjb3BlLCBpdCYjMzk7cyBkZWZpbml0ZWx5IGEgY2FuZGlkYXRlIGZvciB0aG9yb3VnaCBmdXp6aW5nLgoKTm93LCBsZXQmIzM5O3MgbmFpbCBkb3duIHRoZSBjb25maWd1cmF0aW9uIGRlcGVuZGVuY2llcy4gYENPTkZJR19CUEZfU1lTQ0FMTGAgaXMgYSBnaXZlbiwgb2YgY291cnNlLiBTaW5jZSB3ZSYjMzk7cmUgZGVhbGluZyB3aXRoIHBlcmNwdSBkYXRhLCBhbmQgSSBuZWVkIHRoZSBKSVQgZm9yIHBlcmZvcm1hbmNlLCBJJiMzOTtsbCBuZWVkIGBDT05GSUdfQlBGX0pJVGAgYXMgd2VsbC4KCk1vdmluZyBvbnRvIHRoZSBzeW1ib2xzLCBJJiMzOTttIGdvaW5nIHRvIHdhbnQgdG8gdHJhY2sgdGhlc2Ugc3BlY2lmaWNhbGx5OgoqICAgYHBlcmNwdV9hcnJheV9tYXBfZGlyZWN0X3ZhbHVlX2FkZHJgCiogICBgcGVyY3B1X2FycmF5X21hcF9kaXJlY3RfdmFsdWVfbWV0YWAKKiAgIGBicGZfZG9fbWlzY19maXh1cHNgIChhbHRob3VnaCB0aGlzIGlzIGEgbW9yZSBnZW5lcmljIGZ1bmN0aW9uLCB0aGUgcGF0Y2ggc3BlY2lmaWNhbGx5IHRhcmdldHMgYSBuZXcgYnJhbmNoIGhlcmUsIHNvIGl0IGlzIGhpZ2gtcHJpb3JpdHkpCiogICBgYXJyYXlfbWFwX2NoZWNrX2J0ZmAgKG1vZGlmaWVkKQoqICAgYGNoZWNrX2FuZF9yZXNvbHZlX2luc25zYCAobW9kaWZpZWQpCgpJJiMzOTtsbCBjaGVjayB0aGUgZGVmaW5pdGlvbiBvZiBgYnBmX2ppdF9zdXBwb3J0c19wZXJjcHVfaW5zbmAuIEkmIzM5O2xsIHVzZSBgZ3JlcHBlcmAgdG8gZGV0ZXJtaW5lIHRoZSBzcGVjaWZpYyBhcmNoaXRlY3R1cmVzIHRoYXQgYWN0dWFsbHkgc3VwcG9ydCB0aGlzLiBUaGlzIHdpbGwgaW5mb3JtIG15IGZ1enppbmcgdGFyZ2V0IGxpc3QuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NC8yPC90ZD4KCQkJPHRkPjIwMjYvMDYvMjkgMTY6Mzk8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7YnBmX2ppdF9zdXBwb3J0c19wZXJjcHVfaW5zbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDthcmNoL2FybTY0L25ldC9icGZfaml0X2NvbXAuYz0zMTcxPWJvb2wgYnBmX2ppdF9zdXBwb3J0c19pbnNuKHN0cnVjdCBicGZfaW5zbiAqaW5zbiwgYm9vbCBpbl9hcmVuYSlcbi0tXG5hcmNoL2FybTY0L25ldC9icGZfaml0X2NvbXAuYy0zMTg0LVxuYXJjaC9hcm02NC9uZXQvYnBmX2ppdF9jb21wLmM6MzE4NTpib29sIGJwZl9qaXRfc3VwcG9ydHNfcGVyY3B1X2luc24odm9pZClcbmFyY2gvYXJtNjQvbmV0L2JwZl9qaXRfY29tcC5jLTMxODYte1xuLS1cbmFyY2gvcG93ZXJwYy9uZXQvYnBmX2ppdF9jb21wLmM9NTU2PWJvb2wgYnBmX2ppdF9zdXBwb3J0c19pbnNuKHN0cnVjdCBicGZfaW5zbiAqaW5zbiwgYm9vbCBpbl9hcmVuYSlcbi0tXG5hcmNoL3Bvd2VycGMvbmV0L2JwZl9qaXRfY29tcC5jLTU3MS1cbmFyY2gvcG93ZXJwYy9uZXQvYnBmX2ppdF9jb21wLmM6NTcyOmJvb2wgYnBmX2ppdF9zdXBwb3J0c19wZXJjcHVfaW5zbih2b2lkKVxuYXJjaC9wb3dlcnBjL25ldC9icGZfaml0X2NvbXAuYy01NzMte1xuLS1cbmFyY2gvcmlzY3YvbmV0L2JwZl9qaXRfY29tcDY0LmM9MjEyMD1ib29sIGJwZl9qaXRfc3VwcG9ydHNfaW5zbihzdHJ1Y3QgYnBmX2luc24gKmluc24sIGJvb2wgaW5fYXJlbmEpXG4tLVxuYXJjaC9yaXNjdi9uZXQvYnBmX2ppdF9jb21wNjQuYy0yMTM4LVxuYXJjaC9yaXNjdi9uZXQvYnBmX2ppdF9jb21wNjQuYzoyMTM5OmJvb2wgYnBmX2ppdF9zdXBwb3J0c19wZXJjcHVfaW5zbih2b2lkKVxuYXJjaC9yaXNjdi9uZXQvYnBmX2ppdF9jb21wNjQuYy0yMTQwLXtcbi0tXG5hcmNoL3g4Ni9uZXQvYnBmX2ppdF9jb21wLmM9NDA2MD1ib29sIGJwZl9qaXRfc3VwcG9ydHNfc3VicHJvZ190YWlsY2FsbHModm9pZClcbi0tXG5hcmNoL3g4Ni9uZXQvYnBmX2ppdF9jb21wLmMtNDA2NC1cbmFyY2gveDg2L25ldC9icGZfaml0X2NvbXAuYzo0MDY1OmJvb2wgYnBmX2ppdF9zdXBwb3J0c19wZXJjcHVfaW5zbih2b2lkKVxuYXJjaC94ODYvbmV0L2JwZl9qaXRfY29tcC5jLTQwNjYte1xuLS1cbmluY2x1ZGUvbGludXgvZmlsdGVyLmg9MTE4MT1ib29sIGJwZl9qaXRfc3VwcG9ydHNfc3VicHJvZ190YWlsY2FsbHModm9pZCk7XG5pbmNsdWRlL2xpbnV4L2ZpbHRlci5oOjExODI6Ym9vbCBicGZfaml0X3N1cHBvcnRzX3BlcmNwdV9pbnNuKHZvaWQpO1xuaW5jbHVkZS9saW51eC9maWx0ZXIuaC0xMTgzLWJvb2wgYnBmX2ppdF9zdXBwb3J0c19rZnVuY19jYWxsKHZvaWQpO1xuLS1cbmtlcm5lbC9icGYvYXJyYXltYXAuYz0yNjI9c3RhdGljIGludCBwZXJjcHVfYXJyYXlfbWFwX2RpcmVjdF92YWx1ZV9hZGRyKGNvbnN0IHN0cnVjdCBicGZfbWFwICptYXAsIHU2NCAqaW1tLCB1MzIgb2ZmKVxuLS1cbmtlcm5lbC9icGYvYXJyYXltYXAuYy0yNjktXHRcdHJldHVybiAtRUlOVkFMO1xua2VybmVsL2JwZi9hcnJheW1hcC5jOjI3MDpcdGlmICghYnBmX2ppdF9zdXBwb3J0c19wZXJjcHVfaW5zbigpKVxua2VybmVsL2JwZi9hcnJheW1hcC5jLTI3MS1cdFx0cmV0dXJuIC1FT1BOT1RTVVBQO1xuLS1cbmtlcm5lbC9icGYvYXJyYXltYXAuYz0yNzc9c3RhdGljIGludCBwZXJjcHVfYXJyYXlfbWFwX2RpcmVjdF92YWx1ZV9tZXRhKGNvbnN0IHN0cnVjdCBicGZfbWFwICptYXAsIHU2NCBpbW0sIHUzMiAqb2ZmKVxuLS1cbmtlcm5lbC9icGYvYXJyYXltYXAuYy0yODUtXHRcdHJldHVybiAtRU5PRU5UO1xua2VybmVsL2JwZi9hcnJheW1hcC5jOjI4NjpcdGlmICghYnBmX2ppdF9zdXBwb3J0c19wZXJjcHVfaW5zbigpKVxua2VybmVsL2JwZi9hcnJheW1hcC5jLTI4Ny1cdFx0cmV0dXJuIC1FT1BOT1RTVVBQO1xuLS1cbmtlcm5lbC9icGYvYXJyYXltYXAuYz0yOTQ9c3RhdGljIGludCBwZXJjcHVfYXJyYXlfbWFwX2dlbl9sb29rdXAoc3RydWN0IGJwZl9tYXAgKm1hcCwgc3RydWN0IGJwZl9pbnNuICppbnNuX2J1Zilcbi0tXG5rZXJuZWwvYnBmL2FycmF5bWFwLmMtMjk4LVxua2VybmVsL2JwZi9hcnJheW1hcC5jOjI5OTpcdGlmICghYnBmX2ppdF9zdXBwb3J0c19wZXJjcHVfaW5zbigpKVxua2VybmVsL2JwZi9hcnJheW1hcC5jLTMwMC1cdFx0cmV0dXJuIC1FT1BOT1RTVVBQO1xuLS1cbmtlcm5lbC9icGYvY29yZS5jPTMyMjY9Ym9vbCBfX3dlYWsgYnBmX2ppdF9zdXBwb3J0c19zdWJwcm9nX3RhaWxjYWxscyh2b2lkKVxuLS1cbmtlcm5lbC9icGYvY29yZS5jLTMyMzAtXG5rZXJuZWwvYnBmL2NvcmUuYzozMjMxOmJvb2wgX193ZWFrIGJwZl9qaXRfc3VwcG9ydHNfcGVyY3B1X2luc24odm9pZClcbmtlcm5lbC9icGYvY29yZS5jLTMyMzIte1xuLS1cbmtlcm5lbC9icGYvZml4dXBzLmM9MTQ4MT1pbnQgYnBmX2RvX21pc2NfZml4dXBzKHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYpXG4tLVxua2VybmVsL2JwZi9maXh1cHMuYy0xODIyLVx0XHRpZiAoZW52LVx1MDAzZXByb2ctXHUwMDNlaml0X3JlcXVlc3RlZCBcdTAwMjZcdTAwMjZcbmtlcm5lbC9icGYvZml4dXBzLmM6MTgyMzpcdFx0ICAgIGJwZl9qaXRfc3VwcG9ydHNfcGVyY3B1X2luc24oKSBcdTAwMjZcdTAwMjZcbmtlcm5lbC9icGYvZml4dXBzLmMtMTgyNC1cdFx0ICAgIGluc24tXHUwMDNlY29kZSA9PSAoQlBGX0xEIHwgQlBGX0lNTSB8IEJQRl9EVykgXHUwMDI2XHUwMDI2XG4tLVxua2VybmVsL2JwZi9oYXNodGFiLmM9MjQxNT1zdGF0aWMgaW50IGh0YWJfcGVyY3B1X21hcF9nZW5fbG9va3VwKHN0cnVjdCBicGZfbWFwICptYXAsIHN0cnVjdCBicGZfaW5zbiAqaW5zbl9idWYpXG4tLVxua2VybmVsL2JwZi9oYXNodGFiLmMtMjQxOC1cbmtlcm5lbC9icGYvaGFzaHRhYi5jOjI0MTk6XHRpZiAoIWJwZl9qaXRfc3VwcG9ydHNfcGVyY3B1X2luc24oKSlcbmtlcm5lbC9icGYvaGFzaHRhYi5jLTI0MjAtXHRcdHJldHVybiAtRU9QTk9UU1VQUDtcbi0tXG5rZXJuZWwvYnBmL3ZlcmlmaWVyLmM9MTY2NjM9Ym9vbCBicGZfdmVyaWZpZXJfaW5saW5lc19oZWxwZXJfY2FsbChzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52LCBzMzIgaW1tKVxuLS1cbmtlcm5lbC9icGYvdmVyaWZpZXIuYy0xNjY3MS0jZW5kaWZcbmtlcm5lbC9icGYvdmVyaWZpZXIuYzoxNjY3MjpcdFx0cmV0dXJuIGVudi1cdTAwM2Vwcm9nLVx1MDAzZWppdF9yZXF1ZXN0ZWQgXHUwMDI2XHUwMDI2IGJwZl9qaXRfc3VwcG9ydHNfcGVyY3B1X2luc24oKTtcbmtlcm5lbC9icGYvdmVyaWZpZXIuYy0xNjY3My0jZW5kaWZcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD41LzI8L3RkPgoJCQk8dGQ+MjAyNi8wNi8yOSAxNjozOTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyMTI2NQoJCQkJCQkJb3V0cHV0OiAxNzMKCQkJCQkJCXRob3VnaHRzOiA1MzQKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqTXkgQXNzZXNzbWVudCBvZiB0aGUgQlBGIFBhdGNoKioKCk9rYXksIGxldCYjMzk7cyBicmVhayB0aGlzIGRvd24uIFRoaXMgcGF0Y2ggaXMgY2xlYXJseSBzaWduaWZpY2FudCwgZm9jdXNpbmcgb24gZW5hYmxpbmcgZGlyZWN0IGFjY2VzcyB0byBgLnBlcmNwdWAgZGF0YSBtYXBzIHdpdGhpbiBCUEYuIFRoaXMgdHJhbnNsYXRlcyBzcGVjaWZpY2FsbHkgdG8gc3VwcG9ydGluZyBgQlBGX01BUF9UWVBFX1BFUkNQVV9BUlJBWWAuCgpNeSBpbml0aWFsIHRob3VnaHQgaXMgdG8gaWRlbnRpZnkgdGhlIGtleSBmdW5jdGlvbnMgaW1wYWN0ZWQuIEkgc2VlIHRoZSBhZGRpdGlvbiBvZiB0d28gbmV3IGZ1bmN0aW9uczogYHBlcmNwdV9hcnJheV9tYXBfZGlyZWN0X3ZhbHVlX2FkZHJgIGFuZCBgcGVyY3B1X2FycmF5X21hcF9kaXJlY3RfdmFsdWVfbWV0YWAuIFRoZXNlIGFyZSB0aGUgY29yZSBtYXAgb3BlcmF0aW9ucyBmb3IgdGhpcyBuZXcgY2FwYWJpbGl0eS4KCkl0JiMzOTtzIGFsc28gbW9kaWZ5aW5nIHNldmVyYWwgZXhpc3RpbmcgZnVuY3Rpb25zIHRvIGFjY29tbW9kYXRlIHRoaXMgbmV3IGZ1bmN0aW9uYWxpdHkuIEluaXRpYWxseSwgSSBub3RlZCBgYXJyYXlfbWFwX2NoZWNrX2J0ZmAsIGBicGZfZG9fbWlzY19maXh1cHNgLCBgYnBmX21hcF9kaXJlY3RfcmVhZGAsIGBjaGVja19tZW1fYWNjZXNzYCwgYGNoZWNrX2FyZ19jb25zdF9zdHJgLCBhbmQgYGNoZWNrX2FuZF9yZXNvbHZlX2luc25zYC4gSG93ZXZlciwgYGJwZl9kb19taXNjX2ZpeHVwc2AgYW5kIGBjaGVja19hbmRfcmVzb2x2ZV9pbnNuc2AgYXJlIHN1Y2ggaGVhdmlseSB1c2VkIHBhdGhzIGluIHRoZSB2ZXJpZmllciB0aGF0IEkmIzM5O2xsIHNpbXBsaWZ5IHRoZSBmb2N1cyB0byB0aGUgbmV3IGZ1bmN0aW9ucy4gSSBuZWVkIHRvIGJlIGVmZmljaWVudCB3aXRoIG15IHRpbWUgYW5kIGF0dGVudGlvbi4gSSBhbSBtYWtpbmcgdGhlIGZpbmFsIGxpc3Qgb2YgdGhlIG5ldyBhbmQgaW1wYWN0ZWQgZnVuY3Rpb25zIGBwZXJjcHVfYXJyYXlfbWFwX2RpcmVjdF92YWx1ZV9hZGRyYCwgYHBlcmNwdV9hcnJheV9tYXBfZGlyZWN0X3ZhbHVlX21ldGFgLCBgYnBmX21hcF9kaXJlY3RfcmVhZGAsIGBjaGVja19tZW1fYWNjZXNzYCwgYW5kIGBjaGVja19hcmdfY29uc3Rfc3RyYC4KCkNoZWNraW5nIHRoZSBjb25maWd1cmF0aW9ucywgaXQgbG9va3MgbGlrZSBgQ09ORklHX0JQRl9TWVNDQUxMYCBpcyBzdGFuZGFyZCwgd2hpY2ggaXMgZXhwZWN0ZWQuIEhvd2V2ZXIsIGBDT05GSUdfQlBGX0pJVGAgaXMgbmVjZXNzYXJ5IGZvciBgYnBmX2ppdF9zdXBwb3J0c19wZXJjcHVfaW5zbigpYC4gVGhpcyBpbXBsaWVzIHRoYXQgdGhlIEpJVCBjb21waWxlciB3aWxsIG5lZWQgdG8gYmUgdXBkYXRlZCB0byBoYW5kbGUgdGhlc2UgYC5wZXJjcHVgIGFjY2Vzc2VzLgoKR2l2ZW4gdGhlIGZ1bmN0aW9uYWwgbmF0dXJlIG9mIHRoZXNlIGNoYW5nZXMsIHRoZSBpbnRyb2R1Y3Rpb24gb2YgYC5wZXJjcHVgIHN1cHBvcnQsIGFuZCB0aGUgbW9kaWZpY2F0aW9ucyB0byB0aGUgQlBGIHZlcmlmaWVyIHRvIGhhbmRsZSBpdCwgdGhpcyBpcyBhIGNsZWFyIGNhbmRpZGF0ZSBmb3IgZnV6emluZy4gSSYjMzk7bGwgbmVlZCB0byBkZXZlbG9wIGZ1enogdGFyZ2V0cyB0byBjb3ZlciB0aGUgbmV3IGNvZGUgcGF0aHMsIHBhcnRpY3VsYXJseSBhcm91bmQgdGhlIG1hcCBvcGVyYXRpb25zIGFuZCB0aGUgdmVyaWZpZXIgbW9kaWZpY2F0aW9ucy4gTGV0JiMzOTtzIGNhbGwgYHNldC1yZXN1bHRzYC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD42LzI8L3RkPgoJCQk8dGQ+MjAyNi8wNi8yOSAxNjo0MDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnNldC1yZXN1bHRzPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7QlBGX1NZU0NBTEwmIzM0OywKICAgICYjMzQ7QlBGX0pJVCYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O3BlcmNwdV9hcnJheV9tYXBfZGlyZWN0X3ZhbHVlX2FkZHImIzM0OywKICAgICYjMzQ7cGVyY3B1X2FycmF5X21hcF9kaXJlY3RfdmFsdWVfbWV0YSYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBpbnRyb2R1Y2VzIHN1cHBvcnQgZm9yIGAucGVyY3B1YCBnbG9iYWwgZGF0YSBtYXBzIGluIEJQRiwgd2hpY2ggdHJhbnNsYXRlcyB0byBgQlBGX01BUF9UWVBFX1BFUkNQVV9BUlJBWWAuIEl0IGFkZHMgbmV3IG1hcCBvcGVyYXRpb25zIGBtYXBfZGlyZWN0X3ZhbHVlX2FkZHJgIGFuZCBgbWFwX2RpcmVjdF92YWx1ZV9tZXRhYCBmb3IgcGVyY3B1IGFycmF5cywgYW5kIG1vZGlmaWVzIHRoZSB2ZXJpZmllciB0byBoYW5kbGUgcGVyY3B1IGFycmF5IGFjY2Vzc2VzIGFuZCBwYXRjaCBpbnN0cnVjdGlvbnMgZm9yIEpJVC4gVGhpcyBpcyBhIGZ1bmN0aW9uYWwgY2hhbmdlIGluIHRoZSBjb3JlIEJQRiBzdWJzeXN0ZW0gYW5kIHNob3VsZCBiZSBmdXp6ZWQuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0JQRl9TWVNDQUxMJiMzNDssCiAgICAmIzM0O0JQRl9KSVQmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDtwZXJjcHVfYXJyYXlfbWFwX2RpcmVjdF92YWx1ZV9hZGRyJiMzNDssCiAgICAmIzM0O3BlcmNwdV9hcnJheV9tYXBfZGlyZWN0X3ZhbHVlX21ldGEmIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggaW50cm9kdWNlcyBzdXBwb3J0IGZvciBgLnBlcmNwdWAgZ2xvYmFsIGRhdGEgbWFwcyBpbiBCUEYsIHdoaWNoIHRyYW5zbGF0ZXMgdG8gYEJQRl9NQVBfVFlQRV9QRVJDUFVfQVJSQVlgLiBJdCBhZGRzIG5ldyBtYXAgb3BlcmF0aW9ucyBgbWFwX2RpcmVjdF92YWx1ZV9hZGRyYCBhbmQgYG1hcF9kaXJlY3RfdmFsdWVfbWV0YWAgZm9yIHBlcmNwdSBhcnJheXMsIGFuZCBtb2RpZmllcyB0aGUgdmVyaWZpZXIgdG8gaGFuZGxlIHBlcmNwdSBhcnJheSBhY2Nlc3NlcyBhbmQgcGF0Y2ggaW5zdHJ1Y3Rpb25zIGZvciBKSVQuIFRoaXMgaXMgYSBmdW5jdGlvbmFsIGNoYW5nZSBpbiB0aGUgY29yZSBCUEYgc3Vic3lzdGVtIGFuZCBzaG91bGQgYmUgZnV6emVkLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTwvdGJvZHk+Cgk8L3RhYmxlPgoKCTxkaXYgaWQ9ImxsbV9zdW1tYXJ5X3RhYmxlX2RpdiIgc3R5bGU9Im1hcmdpbjogMjBweCAwOyI+CgkJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQkJPGNhcHRpb24+TExNIENhbGxzIFN1bW1hcnk6PC9jYXB0aW9uPgoJCQk8dGhlYWQ+CgkJCQk8dHI+CgkJCQkJPHRoPlRvdGFsIENhbGxzPC90aD4KCQkJCQk8dGg+VG90YWwgVG9rZW5zPC90aD4KCQkJCQk8dGg+QXZnIFRva2VuczwvdGg+CgkJCQkJPHRoPlRvdGFsIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQkJPHRoPkF2ZyBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJPC90cj4KCQkJPC90aGVhZD4KCQkJPHRib2R5IGlkPSJsbG1fc3VtbWFyeV9zdGF0c19ib2R5Ij48L3Rib2R5PgoJCTwvdGFibGU+Cgk8L2Rpdj4KCgk8ZGl2IGlkPSJ0b29sX3N1bW1hcnlfdGFibGVfZGl2IiBzdHlsZT0ibWFyZ2luOiAyMHB4IDA7Ij4KCQk8dGFibGUgY2xhc3M9Imxpc3RfdGFibGUiPgoJCQk8Y2FwdGlvbj5Ub29sIENhbGxzIFN1bW1hcnk6PC9jYXB0aW9uPgoJCQk8dGhlYWQ+CgkJCQk8dHI+CgkJCQkJPHRoPlRvdGFsIENhbGxzPC90aD4KCQkJCQk8dGg+VG90YWwgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCQk8dGg+QXZnIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQk8L3RyPgoJCQk8L3RoZWFkPgoJCQk8dGJvZHkgaWQ9InRvb2xfc3VtbWFyeV9zdGF0c19ib2R5Ij48L3Rib2R5PgoJCTwvdGFibGU+Cgk8L2Rpdj4KCgk8ZGl2IGlkPSJkdXJhdGlvbl9jaGFydF9kaXYiIHN0eWxlPSJ3aWR0aDogMTAwJTsgbWFyZ2luOiAyMHB4IDA7IGJvcmRlcjogMXB4OyI+PC9kaXY+Cgk8ZGl2IGlkPSJ0b2tlbl9jaGFydF9kaXYiIHN0eWxlPSJ3aWR0aDogMTAwJTsgbWFyZ2luOiAyMHB4IDA7IGJvcmRlcjogMXB4OyI+PC9kaXY+CgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS9qc2FwaSI+PC9zY3JpcHQ+Cgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CgkJZ29vZ2xlLmxvYWQoInZpc3VhbGl6YXRpb24iLCAiMSIsIHtwYWNrYWdlczpbImNvcmVjaGFydCJdfSk7CgkJZ29vZ2xlLnNldE9uTG9hZENhbGxiYWNrKGRyYXdDaGFydHMpOwoKCQlmdW5jdGlvbiBkcmF3Q2hhcnRzKCkgewoJCQljb25zdCByYXdEYXRhID0gW3siU3RhcnRlZCI6IjIwMjYtMDYtMjlUMTY6Mzk6MzAuNDI5MzA0MzQ2WiIsIlNlcSI6MCwiTmVzdGluZyI6MCwiVHlwZSI6ImZsb3ciLCJOYW1lIjoicGF0Y2gtdHJpYWdlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MzA5MTMyMTA1NDEsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiQlBGX1NZU0NBTExcIixcbiAgICBcIkJQRl9KSVRcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJwZXJjcHVfYXJyYXlfbWFwX2RpcmVjdF92YWx1ZV9hZGRyXCIsXG4gICAgXCJwZXJjcHVfYXJyYXlfbWFwX2RpcmVjdF92YWx1ZV9tZXRhXCJcbiAgXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggaW50cm9kdWNlcyBzdXBwb3J0IGZvciBgLnBlcmNwdWAgZ2xvYmFsIGRhdGEgbWFwcyBpbiBCUEYsIHdoaWNoIHRyYW5zbGF0ZXMgdG8gYEJQRl9NQVBfVFlQRV9QRVJDUFVfQVJSQVlgLiBJdCBhZGRzIG5ldyBtYXAgb3BlcmF0aW9ucyBgbWFwX2RpcmVjdF92YWx1ZV9hZGRyYCBhbmQgYG1hcF9kaXJlY3RfdmFsdWVfbWV0YWAgZm9yIHBlcmNwdSBhcnJheXMsIGFuZCBtb2RpZmllcyB0aGUgdmVyaWZpZXIgdG8gaGFuZGxlIHBlcmNwdSBhcnJheSBhY2Nlc3NlcyBhbmQgcGF0Y2ggaW5zdHJ1Y3Rpb25zIGZvciBKSVQuIFRoaXMgaXMgYSBmdW5jdGlvbmFsIGNoYW5nZSBpbiB0aGUgY29yZSBCUEYgc3Vic3lzdGVtIGFuZCBzaG91bGQgYmUgZnV6emVkLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wNi0yOVQxNjozOTozMC40MjkzMTM4MzZaIiwiU2VxIjoxLCJOZXN0aW5nIjoxLCJUeXBlIjoiYWN0aW9uIiwiTmFtZSI6InJlYWQtcGF0Y2gtZGlmZiIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjEyODk3NTkxNjcsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIlBhdGNoRGlmZlwiOiBcImNvbW1pdCA2YmY3NzE0MjdiM2NkNDg1MmM5NzBkNmI0NGIzYzAxYmQxOGNhNzMwXFxuQXV0aG9yOiBzeXotY2x1c3RlciBcXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cXHUwMDNlXFxuRGF0ZTogICBNb24gSnVuIDI5IDE2OjM5OjI4IDIwMjYgKzAwMDBcXG5cXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XFxuXFxuZGlmZiAtLWdpdCBhL2tlcm5lbC9icGYvYXJyYXltYXAuYyBiL2tlcm5lbC9icGYvYXJyYXltYXAuY1xcbmluZGV4IDI0OGI0ODE4MTc4Y2QxLi5jNGU5NDMwOTQxZTU0OSAxMDA2NDRcXG4tLS0gYS9rZXJuZWwvYnBmL2FycmF5bWFwLmNcXG4rKysgYi9rZXJuZWwvYnBmL2FycmF5bWFwLmNcXG5AQCAtMjU5LDYgKzI1OSwzNyBAQCBzdGF0aWMgdm9pZCAqcGVyY3B1X2FycmF5X21hcF9sb29rdXBfZWxlbShzdHJ1Y3QgYnBmX21hcCAqbWFwLCB2b2lkICprZXkpXFxuIFxcdHJldHVybiB0aGlzX2NwdV9wdHIoYXJyYXktXFx1MDAzZXBwdHJzW2luZGV4IFxcdTAwMjYgYXJyYXktXFx1MDAzZWluZGV4X21hc2tdKTtcXG4gfVxcbiBcXG4rc3RhdGljIGludCBwZXJjcHVfYXJyYXlfbWFwX2RpcmVjdF92YWx1ZV9hZGRyKGNvbnN0IHN0cnVjdCBicGZfbWFwICptYXAsIHU2NCAqaW1tLCB1MzIgb2ZmKVxcbit7XFxuK1xcdHN0cnVjdCBicGZfYXJyYXkgKmFycmF5ID0gY29udGFpbmVyX29mKG1hcCwgc3RydWN0IGJwZl9hcnJheSwgbWFwKTtcXG4rXFxuK1xcdGlmIChtYXAtXFx1MDAzZW1heF9lbnRyaWVzICE9IDEpXFxuK1xcdFxcdHJldHVybiAtRU9QTk9UU1VQUDtcXG4rXFx0aWYgKG9mZiBcXHUwMDNlPSBtYXAtXFx1MDAzZXZhbHVlX3NpemUpXFxuK1xcdFxcdHJldHVybiAtRUlOVkFMO1xcbitcXHRpZiAoIWJwZl9qaXRfc3VwcG9ydHNfcGVyY3B1X2luc24oKSlcXG4rXFx0XFx0cmV0dXJuIC1FT1BOT1RTVVBQO1xcbitcXG4rXFx0KmltbSA9ICh1NjQpKF9fZm9yY2UgdW5zaWduZWQgbG9uZykgYXJyYXktXFx1MDAzZXBwdHJzWzBdO1xcbitcXHRyZXR1cm4gMDtcXG4rfVxcbitcXG4rc3RhdGljIGludCBwZXJjcHVfYXJyYXlfbWFwX2RpcmVjdF92YWx1ZV9tZXRhKGNvbnN0IHN0cnVjdCBicGZfbWFwICptYXAsIHU2NCBpbW0sIHUzMiAqb2ZmKVxcbit7XFxuK1xcdHN0cnVjdCBicGZfYXJyYXkgKmFycmF5ID0gY29udGFpbmVyX29mKG1hcCwgc3RydWN0IGJwZl9hcnJheSwgbWFwKTtcXG4rXFx0dTY0IGJhc2UgPSAodTY0KShfX2ZvcmNlIHVuc2lnbmVkIGxvbmcpIGFycmF5LVxcdTAwM2VwcHRyc1swXTtcXG4rXFxuK1xcdGlmIChtYXAtXFx1MDAzZW1heF9lbnRyaWVzICE9IDEpXFxuK1xcdFxcdHJldHVybiAtRU9QTk9UU1VQUDtcXG4rXFx0aWYgKGltbSBcXHUwMDNjIGJhc2UgfHwgaW1tIFxcdTAwM2U9IGJhc2UgKyBhcnJheS1cXHUwMDNlZWxlbV9zaXplKVxcbitcXHRcXHRyZXR1cm4gLUVOT0VOVDtcXG4rXFx0aWYgKCFicGZfaml0X3N1cHBvcnRzX3BlcmNwdV9pbnNuKCkpXFxuK1xcdFxcdHJldHVybiAtRU9QTk9UU1VQUDtcXG4rXFxuK1xcdCpvZmYgPSBpbW0gLSBiYXNlO1xcbitcXHRyZXR1cm4gMDtcXG4rfVxcbitcXG4gLyogZW1pdCBCUEYgaW5zdHJ1Y3Rpb25zIGVxdWl2YWxlbnQgdG8gQyBjb2RlIG9mIHBlcmNwdV9hcnJheV9tYXBfbG9va3VwX2VsZW0oKSAqL1xcbiBzdGF0aWMgaW50IHBlcmNwdV9hcnJheV9tYXBfZ2VuX2xvb2t1cChzdHJ1Y3QgYnBmX21hcCAqbWFwLCBzdHJ1Y3QgYnBmX2luc24gKmluc25fYnVmKVxcbiB7XFxuQEAgLTU1MSw5ICs1ODIsMTAgQEAgc3RhdGljIGludCBhcnJheV9tYXBfY2hlY2tfYnRmKHN0cnVjdCBicGZfbWFwICptYXAsXFxuIFxcdFxcdFxcdCAgICAgICBjb25zdCBzdHJ1Y3QgYnRmX3R5cGUgKmtleV90eXBlLFxcbiBcXHRcXHRcXHQgICAgICAgY29uc3Qgc3RydWN0IGJ0Zl90eXBlICp2YWx1ZV90eXBlKVxcbiB7XFxuLVxcdC8qIE9uZSBleGNlcHRpb24gZm9yIGtleWxlc3MgQlRGOiAuYnNzLy5kYXRhLy5yb2RhdGEgbWFwICovXFxuK1xcdC8qIE9uZSBleGNlcHRpb24gZm9yIGtleWxlc3MgQlRGOiAuYnNzLy5kYXRhLy5yb2RhdGEvLnBlcmNwdSBtYXAgKi9cXG4gXFx0aWYgKGJ0Zl90eXBlX2lzX3ZvaWQoa2V5X3R5cGUpKSB7XFxuLVxcdFxcdGlmIChtYXAtXFx1MDAzZW1hcF90eXBlICE9IEJQRl9NQVBfVFlQRV9BUlJBWSB8fFxcbitcXHRcXHRpZiAoKG1hcC1cXHUwMDNlbWFwX3R5cGUgIT0gQlBGX01BUF9UWVBFX0FSUkFZIFxcdTAwMjZcXHUwMDI2XFxuK1xcdFxcdCAgICAgbWFwLVxcdTAwM2VtYXBfdHlwZSAhPSBCUEZfTUFQX1RZUEVfUEVSQ1BVX0FSUkFZKSB8fFxcbiBcXHRcXHQgICAgbWFwLVxcdTAwM2VtYXhfZW50cmllcyAhPSAxKVxcbiBcXHRcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG4gXFxuQEAgLTgzMiw2ICs4NjQsOCBAQCBjb25zdCBzdHJ1Y3QgYnBmX21hcF9vcHMgcGVyY3B1X2FycmF5X21hcF9vcHMgPSB7XFxuIFxcdC5tYXBfZ2V0X25leHRfa2V5ID0gYnBmX2FycmF5X2dldF9uZXh0X2tleSxcXG4gXFx0Lm1hcF9sb29rdXBfZWxlbSA9IHBlcmNwdV9hcnJheV9tYXBfbG9va3VwX2VsZW0sXFxuIFxcdC5tYXBfZ2VuX2xvb2t1cCA9IHBlcmNwdV9hcnJheV9tYXBfZ2VuX2xvb2t1cCxcXG4rXFx0Lm1hcF9kaXJlY3RfdmFsdWVfYWRkciA9IHBlcmNwdV9hcnJheV9tYXBfZGlyZWN0X3ZhbHVlX2FkZHIsXFxuK1xcdC5tYXBfZGlyZWN0X3ZhbHVlX21ldGEgPSBwZXJjcHVfYXJyYXlfbWFwX2RpcmVjdF92YWx1ZV9tZXRhLFxcbiBcXHQubWFwX3VwZGF0ZV9lbGVtID0gYXJyYXlfbWFwX3VwZGF0ZV9lbGVtLFxcbiBcXHQubWFwX2RlbGV0ZV9lbGVtID0gYXJyYXlfbWFwX2RlbGV0ZV9lbGVtLFxcbiBcXHQubWFwX2xvb2t1cF9wZXJjcHVfZWxlbSA9IHBlcmNwdV9hcnJheV9tYXBfbG9va3VwX3BlcmNwdV9lbGVtLFxcbmRpZmYgLS1naXQgYS9rZXJuZWwvYnBmL2NvbnN0X2ZvbGQuYyBiL2tlcm5lbC9icGYvY29uc3RfZm9sZC5jXFxuaW5kZXggYjJhMTlhY2FkYjkxZWMuLjU3ODcyNDZiZWYzMDEwIDEwMDY0NFxcbi0tLSBhL2tlcm5lbC9icGYvY29uc3RfZm9sZC5jXFxuKysrIGIva2VybmVsL2JwZi9jb25zdF9mb2xkLmNcXG5AQCAtMTgyLDcgKzE4Miw2IEBAIHN0YXRpYyB2b2lkIGNvbnN0X3JlZ194ZmVyKHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsIHN0cnVjdCBjb25zdF9hcmdfaW5mbyAqXFxuIFxcdFxcdHU2NCB2YWwgPSAwO1xcbiBcXG4gXFx0XFx0aWYgKCFicGZfbWFwX2lzX3Jkb25seShtYXApIHx8ICFtYXAtXFx1MDAzZW9wcy1cXHUwMDNlbWFwX2RpcmVjdF92YWx1ZV9hZGRyIHx8XFxuLVxcdFxcdCAgICBtYXAtXFx1MDAzZW1hcF90eXBlID09IEJQRl9NQVBfVFlQRV9JTlNOX0FSUkFZIHx8XFxuIFxcdFxcdCAgICBvZmYgXFx1MDAzYyAwIHx8IG9mZiArIHNpemUgXFx1MDAzZSBtYXAtXFx1MDAzZXZhbHVlX3NpemUgfHxcXG4gXFx0XFx0ICAgIGJwZl9tYXBfZGlyZWN0X3JlYWQobWFwLCBvZmYsIHNpemUsIFxcdTAwMjZ2YWwsIGlzX2xkc3gpKSB7XFxuIFxcdFxcdFxcdCpkc3QgPSB1bmtub3duO1xcbmRpZmYgLS1naXQgYS9rZXJuZWwvYnBmL2ZpeHVwcy5jIGIva2VybmVsL2JwZi9maXh1cHMuY1xcbmluZGV4IDNjZjJjYzZlM2FiNjZhLi40Zjg0ZDA4N2NhNjllMyAxMDA2NDRcXG4tLS0gYS9rZXJuZWwvYnBmL2ZpeHVwcy5jXFxuKysrIGIva2VybmVsL2JwZi9maXh1cHMuY1xcbkBAIC0xODE5LDYgKzE4MTksMzggQEAgaW50IGJwZl9kb19taXNjX2ZpeHVwcyhzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52KVxcbiBcXHRcXHRcXHRnb3RvIG5leHRfaW5zbjtcXG4gXFx0XFx0fVxcbiBcXG4rXFx0XFx0aWYgKGVudi1cXHUwMDNlcHJvZy1cXHUwMDNlaml0X3JlcXVlc3RlZCBcXHUwMDI2XFx1MDAyNlxcbitcXHRcXHQgICAgYnBmX2ppdF9zdXBwb3J0c19wZXJjcHVfaW5zbigpIFxcdTAwMjZcXHUwMDI2XFxuK1xcdFxcdCAgICBpbnNuLVxcdTAwM2Vjb2RlID09IChCUEZfTEQgfCBCUEZfSU1NIHwgQlBGX0RXKSBcXHUwMDI2XFx1MDAyNlxcbitcXHRcXHQgICAgKGluc24tXFx1MDAzZXNyY19yZWcgPT0gQlBGX1BTRVVET19NQVBfVkFMVUUgfHxcXG4rXFx0XFx0ICAgICBpbnNuLVxcdTAwM2VzcmNfcmVnID09IEJQRl9QU0VVRE9fTUFQX0lEWF9WQUxVRSkpIHtcXG4rXFx0XFx0XFx0c3RydWN0IGJwZl9tYXAgKm1hcDtcXG4rXFxuK1xcdFxcdFxcdGF1eCA9IFxcdTAwMjZlbnYtXFx1MDAzZWluc25fYXV4X2RhdGFbaSArIGRlbHRhXTtcXG4rXFx0XFx0XFx0bWFwID0gZW52LVxcdTAwM2V1c2VkX21hcHNbYXV4LVxcdTAwM2VtYXBfaW5kZXhdO1xcbitcXHRcXHRcXHRpZiAobWFwLVxcdTAwM2VtYXBfdHlwZSAhPSBCUEZfTUFQX1RZUEVfUEVSQ1BVX0FSUkFZKVxcbitcXHRcXHRcXHRcXHRnb3RvIG5leHRfaW5zbjtcXG4rXFxuK1xcdFxcdFxcdC8qXFxuK1xcdFxcdFxcdCAqIFJldXNlIHRoZSBvcmlnaW5hbCBsZF9pbW02NCBpbnNuLCBhbmQgYWRkIG9uZVxcbitcXHRcXHRcXHQgKiBtb3Y2NF9wZXJjcHVfcmVnIGluc24uXFxuK1xcdFxcdFxcdCAqL1xcbitcXG4rXFx0XFx0XFx0aW5zbl9idWZbMF0gPSBpbnNuWzFdO1xcbitcXHRcXHRcXHRpbnNuX2J1ZlsxXSA9IEJQRl9NT1Y2NF9QRVJDUFVfUkVHKGluc24tXFx1MDAzZWRzdF9yZWcsIGluc24tXFx1MDAzZWRzdF9yZWcpO1xcbitcXHRcXHRcXHRjbnQgPSAyO1xcbitcXG4rXFx0XFx0XFx0aSsrO1xcbitcXHRcXHRcXHRuZXdfcHJvZyA9IGJwZl9wYXRjaF9pbnNuX2RhdGEoZW52LCBpICsgZGVsdGEsIGluc25fYnVmLCBjbnQpO1xcbitcXHRcXHRcXHRpZiAoIW5ld19wcm9nKVxcbitcXHRcXHRcXHRcXHRyZXR1cm4gLUVOT01FTTtcXG4rXFxuK1xcdFxcdFxcdGRlbHRhICAgICs9IGNudCAtIDE7XFxuK1xcdFxcdFxcdGVudi1cXHUwMDNlcHJvZyA9IHByb2cgPSBuZXdfcHJvZztcXG4rXFx0XFx0XFx0aW5zbiAgICAgID0gbmV3X3Byb2ctXFx1MDAzZWluc25zaSArIGkgKyBkZWx0YTtcXG4rXFx0XFx0XFx0Z290byBuZXh0X2luc247XFxuK1xcdFxcdH1cXG4rXFxuIFxcdFxcdGlmIChpbnNuLVxcdTAwM2Vjb2RlICE9IChCUEZfSk1QIHwgQlBGX0NBTEwpKVxcbiBcXHRcXHRcXHRnb3RvIG5leHRfaW5zbjtcXG4gXFx0XFx0aWYgKGluc24tXFx1MDAzZXNyY19yZWcgPT0gQlBGX1BTRVVET19DQUxMKVxcbmRpZmYgLS1naXQgYS9rZXJuZWwvYnBmL3ZlcmlmaWVyLmMgYi9rZXJuZWwvYnBmL3ZlcmlmaWVyLmNcXG5pbmRleCAyNWFlYTQyNzFjZDA4OS4uZGJmNzZmYTlkNDNkOGUgMTAwNjQ0XFxuLS0tIGEva2VybmVsL2JwZi92ZXJpZmllci5jXFxuKysrIGIva2VybmVsL2JwZi92ZXJpZmllci5jXFxuQEAgLTY1Miw3ICs2NTIsNiBAQCBzdGF0aWMgdm9pZCBfX21hcmtfZHlucHRyX3JlZyhzdHJ1Y3QgYnBmX3JlZ19zdGF0ZSAqcmVnLFxcbiBcXHRcXHRcXHQgICAgICBlbnVtIGJwZl9keW5wdHJfdHlwZSB0eXBlLFxcbiBcXHRcXHRcXHQgICAgICBib29sIGZpcnN0X3Nsb3QsIGludCBpZCwgaW50IHBhcmVudF9pZCk7XFxuIFxcbi1cXG4gc3RhdGljIHZvaWQgbWFya19keW5wdHJfc3RhY2tfcmVncyhzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52LFxcbiBcXHRcXHRcXHRcXHQgICBzdHJ1Y3QgYnBmX3JlZ19zdGF0ZSAqc3JlZzEsXFxuIFxcdFxcdFxcdFxcdCAgIHN0cnVjdCBicGZfcmVnX3N0YXRlICpzcmVnMixcXG5AQCAtMTY4OSw3ICsxNjg4LDYgQEAgc3RhdGljIGJvb2wgc2FtZV9jYWxsc2l0ZXMoc3RydWN0IGJwZl92ZXJpZmllcl9zdGF0ZSAqYSwgc3RydWN0IGJwZl92ZXJpZmllcl9zdGFcXG4gXFx0cmV0dXJuIHRydWU7XFxuIH1cXG4gXFxuLVxcbiB2b2lkIGJwZl9mcmVlX2JhY2tlZGdlcyhzdHJ1Y3QgYnBmX3NjY192aXNpdCAqdmlzaXQpXFxuIHtcXG4gXFx0c3RydWN0IGJwZl9zY2NfYmFja2VkZ2UgKmJhY2tlZGdlLCAqbmV4dDtcXG5AQCAtMjMwOSw3ICsyMzA3LDYgQEAgc3RhdGljIHN0cnVjdCBicGZfdmVyaWZpZXJfc3RhdGUgKnB1c2hfYXN5bmNfY2Ioc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudixcXG4gXFx0cmV0dXJuIFxcdTAwMjZlbGVtLVxcdTAwM2VzdDtcXG4gfVxcbiBcXG4tXFxuIHN0YXRpYyBpbnQgY21wX3N1YnByb2dzKGNvbnN0IHZvaWQgKmEsIGNvbnN0IHZvaWQgKmIpXFxuIHtcXG4gXFx0cmV0dXJuICgoc3RydWN0IGJwZl9zdWJwcm9nX2luZm8gKilhKS1cXHUwMDNlc3RhcnQgLVxcbkBAIC0zMzMxLDcgKzMzMjgsNiBAQCBzdGF0aWMgYm9vbCBpc19zcGlsbGFibGVfcmVndHlwZShlbnVtIGJwZl9yZWdfdHlwZSB0eXBlKVxcbiBcXHR9XFxuIH1cXG4gXFxuLVxcbiAvKiBjaGVjayBpZiByZWdpc3RlciBpcyBhIGNvbnN0YW50IHNjYWxhciB2YWx1ZSAqL1xcbiBzdGF0aWMgYm9vbCBpc19yZWdfY29uc3Qoc3RydWN0IGJwZl9yZWdfc3RhdGUgKnJlZywgYm9vbCBzdWJyZWczMilcXG4ge1xcbkBAIC00MDI1LDcgKzQwMjEsNiBAQCBzdGF0aWMgaW50IGNoZWNrX3N0YWNrX3JlYWQoc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudixcXG4gXFx0cmV0dXJuIGVycjtcXG4gfVxcbiBcXG4tXFxuIC8qIGNoZWNrX3N0YWNrX3dyaXRlIGRpc3BhdGNoZXMgdG8gY2hlY2tfc3RhY2tfd3JpdGVfZml4ZWRfb2ZmIG9yXFxuICAqIGNoZWNrX3N0YWNrX3dyaXRlX3Zhcl9vZmYuXFxuICAqXFxuQEAgLTQ4MjAsNyArNDgxNSw2IEBAIHN0YXRpYyBpbnQgY2hlY2tfc29ja19hY2Nlc3Moc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudiwgaW50IGluc25faWR4LFxcbiBcXHRcXHR2YWxpZCA9IGZhbHNlO1xcbiBcXHR9XFxuIFxcbi1cXG4gXFx0aWYgKHZhbGlkKSB7XFxuIFxcdFxcdGVudi1cXHUwMDNlaW5zbl9hdXhfZGF0YVtpbnNuX2lkeF0uY3R4X2ZpZWxkX3NpemUgPVxcbiBcXHRcXHRcXHRpbmZvLmN0eF9maWVsZF9zaXplO1xcbkBAIC01NjAwLDYgKzU1OTQsOCBAQCBpbnQgYnBmX21hcF9kaXJlY3RfcmVhZChzdHJ1Y3QgYnBmX21hcCAqbWFwLCBpbnQgb2ZmLCBpbnQgc2l6ZSwgdTY0ICp2YWwsXFxuIFxcdHU2NCBhZGRyO1xcbiBcXHRpbnQgZXJyO1xcbiBcXG4rXFx0aWYgKG1hcC1cXHUwMDNlbWFwX3R5cGUgPT0gQlBGX01BUF9UWVBFX0lOU05fQVJSQVkgfHwgbWFwLVxcdTAwM2VtYXBfdHlwZSA9PSBCUEZfTUFQX1RZUEVfUEVSQ1BVX0FSUkFZKVxcbitcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG4gXFx0ZXJyID0gbWFwLVxcdTAwM2VvcHMtXFx1MDAzZW1hcF9kaXJlY3RfdmFsdWVfYWRkcihtYXAsIFxcdTAwMjZhZGRyLCBvZmYpO1xcbiBcXHRpZiAoZXJyKVxcbiBcXHRcXHRyZXR1cm4gZXJyO1xcbkBAIC02MTU1LDYgKzYxNTEsNyBAQCBzdGF0aWMgaW50IGNoZWNrX21lbV9hY2Nlc3Moc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudiwgaW50IGluc25faWR4LCBzdHJ1Y3QgYlxcbiBcXHRcXHRcXHRpZiAodG51bV9pc19jb25zdChyZWctXFx1MDAzZXZhcl9vZmYpIFxcdTAwMjZcXHUwMDI2XFxuIFxcdFxcdFxcdCAgICBicGZfbWFwX2lzX3Jkb25seShtYXApIFxcdTAwMjZcXHUwMDI2XFxuIFxcdFxcdFxcdCAgICBtYXAtXFx1MDAzZW9wcy1cXHUwMDNlbWFwX2RpcmVjdF92YWx1ZV9hZGRyIFxcdTAwMjZcXHUwMDI2XFxuK1xcdFxcdFxcdCAgICBtYXAtXFx1MDAzZW1hcF90eXBlICE9IEJQRl9NQVBfVFlQRV9QRVJDUFVfQVJSQVkgXFx1MDAyNlxcdTAwMjZcXG4gXFx0XFx0XFx0ICAgIG1hcC1cXHUwMDNlbWFwX3R5cGUgIT0gQlBGX01BUF9UWVBFX0lOU05fQVJSQVkpIHtcXG4gXFx0XFx0XFx0XFx0aW50IG1hcF9vZmYgPSBvZmYgKyByZWctXFx1MDAzZXZhcl9vZmYudmFsdWU7XFxuIFxcdFxcdFxcdFxcdHU2NCB2YWwgPSAwO1xcbkBAIC02NjQ1LDcgKzY2NDIsNiBAQCBzdGF0aWMgaW50IGNoZWNrX3N0YWNrX3JhbmdlX2luaXRpYWxpemVkKFxcbiBcXHRpZiAoZXJyKVxcbiBcXHRcXHRyZXR1cm4gZXJyO1xcbiBcXG4tXFxuIFxcdGlmICh0bnVtX2lzX2NvbnN0KHJlZy1cXHUwMDNldmFyX29mZikpIHtcXG4gXFx0XFx0bWluX29mZiA9IG1heF9vZmYgPSByZWctXFx1MDAzZXZhcl9vZmYudmFsdWUgKyBvZmY7XFxuIFxcdH0gZWxzZSB7XFxuQEAgLTczNTksNyArNzM1NSw2IEBAIHN0YXRpYyBib29sIGlzX2l0ZXJfbmV3X2tmdW5jKHN0cnVjdCBicGZfa2Z1bmNfY2FsbF9hcmdfbWV0YSAqbWV0YSlcXG4gXFx0cmV0dXJuIG1ldGEtXFx1MDAzZWtmdW5jX2ZsYWdzIFxcdTAwMjYgS0ZfSVRFUl9ORVc7XFxuIH1cXG4gXFxuLVxcbiBzdGF0aWMgYm9vbCBpc19pdGVyX2Rlc3Ryb3lfa2Z1bmMoc3RydWN0IGJwZl9rZnVuY19jYWxsX2FyZ19tZXRhICptZXRhKVxcbiB7XFxuIFxcdHJldHVybiBtZXRhLVxcdTAwM2VrZnVuY19mbGFncyBcXHUwMDI2IEtGX0lURVJfREVTVFJPWTtcXG5AQCAtODEyNSw2ICs4MTIwLDEyIEBAIHN0YXRpYyBpbnQgY2hlY2tfYXJnX2NvbnN0X3N0cihzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52LFxcbiBcXHRcXHRyZXR1cm4gLUVBQ0NFUztcXG4gXFx0fVxcbiBcXG4rXFx0aWYgKG1hcC1cXHUwMDNlbWFwX3R5cGUgPT0gQlBGX01BUF9UWVBFX1BFUkNQVV9BUlJBWSkge1xcbitcXHRcXHR2ZXJib3NlKGVudiwgXFxcIiVzIHBvaW50cyB0byBwZXJjcHVfYXJyYXkgbWFwIHdoaWNoIGNhbm5vdCBiZSB1c2VkIGFzIGNvbnN0IHN0cmluZ1xcXFxuXFxcIixcXG4rXFx0XFx0XFx0cmVnX2FyZ19uYW1lKGVudiwgYXJnbm8pKTtcXG4rXFx0XFx0cmV0dXJuIC1FQUNDRVM7XFxuK1xcdH1cXG4rXFxuIFxcdGlmICghYnBmX21hcF9pc19yZG9ubHkobWFwKSkge1xcbiBcXHRcXHR2ZXJib3NlKGVudiwgXFxcIiVzIGRvZXMgbm90IHBvaW50IHRvIGEgcmVhZG9ubHkgbWFwJ1xcXFxuXFxcIiwgcmVnX2FyZ19uYW1lKGVudiwgYXJnbm8pKTtcXG4gXFx0XFx0cmV0dXJuIC1FQUNDRVM7XFxuQEAgLTExNTAyLDcgKzExNTAzLDYgQEAgc3RhdGljIGludCBwcm9jZXNzX2lycV9mbGFnKHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsIHN0cnVjdCBicGZfcmVnX3N0YXRlICpcXG4gXFx0cmV0dXJuIDA7XFxuIH1cXG4gXFxuLVxcbiBzdGF0aWMgaW50IHJlZl9zZXRfbm9uX293bmluZyhzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52LCBzdHJ1Y3QgYnBmX3JlZ19zdGF0ZSAqcmVnKVxcbiB7XFxuIFxcdHN0cnVjdCBidGZfcmVjb3JkICpyZWMgPSByZWdfYnRmX3JlY29yZChyZWcpO1xcbkBAIC0xNjM5NCw3ICsxNjM5NCw2IEBAIHN0YXRpYyBpbnQgY2hlY2tfbGRfYWJzKHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsIHN0cnVjdCBicGZfaW5zbiAqaW5zbilcXG4gXFx0cmV0dXJuIDA7XFxuIH1cXG4gXFxuLVxcbiBzdGF0aWMgYm9vbCByZXR1cm5fcmV0dmFsX3JhbmdlKHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsIHN0cnVjdCBicGZfcmV0dmFsX3JhbmdlICpyYW5nZSlcXG4ge1xcbiBcXHRlbnVtIGJwZl9wcm9nX3R5cGUgcHJvZ190eXBlID0gcmVzb2x2ZV9wcm9nX3R5cGUoZW52LVxcdTAwM2Vwcm9nKTtcXG5AQCAtMTgyMTMsNiArMTgyMTIsMTIgQEAgc3RhdGljIGludCBjaGVja19hbmRfcmVzb2x2ZV9pbnNucyhzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52KVxcbiBcXHRcXHRcXHRcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG4gXFx0XFx0XFx0XFx0fVxcbiBcXG4rXFx0XFx0XFx0XFx0aWYgKG1hcC1cXHUwMDNlbWFwX3R5cGUgPT0gQlBGX01BUF9UWVBFX1BFUkNQVV9BUlJBWSBcXHUwMDI2XFx1MDAyNlxcbitcXHRcXHRcXHRcXHQgICAgIWVudi1cXHUwMDNlcHJvZy1cXHUwMDNlaml0X3JlcXVlc3RlZCkge1xcbitcXHRcXHRcXHRcXHRcXHR2ZXJib3NlKGVudiwgXFxcIkpJVCBpcyByZXF1aXJlZCB0byB1c2UgZ2xvYmFsIHBlcmNwdSBkYXRhXFxcXG5cXFwiKTtcXG4rXFx0XFx0XFx0XFx0XFx0cmV0dXJuIC1FT1BOT1RTVVBQO1xcbitcXHRcXHRcXHRcXHR9XFxuK1xcbiBcXHRcXHRcXHRcXHRlcnIgPSBtYXAtXFx1MDAzZW9wcy1cXHUwMDNlbWFwX2RpcmVjdF92YWx1ZV9hZGRyKG1hcCwgXFx1MDAyNmFkZHIsIG9mZik7XFxuIFxcdFxcdFxcdFxcdGlmIChlcnIpIHtcXG4gXFx0XFx0XFx0XFx0XFx0dmVyYm9zZShlbnYsIFxcXCJpbnZhbGlkIGFjY2VzcyB0byBtYXAgdmFsdWUgcG9pbnRlciwgdmFsdWVfc2l6ZT0ldSBvZmY9JXVcXFxcblxcXCIsXFxuQEAgLTE4Mjg4LDggKzE4MjkzLDYgQEAgc3RhdGljIHZvaWQgcmVsZWFzZV9pbnNuX2FycmF5cyhzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52KVxcbiBcXHRcXHRicGZfaW5zbl9hcnJheV9yZWxlYXNlKGVudi1cXHUwMDNlaW5zbl9hcnJheV9tYXBzW2ldKTtcXG4gfVxcbiBcXG4tXFxuLVxcbiAvKiBUaGUgdmVyaWZpZXIgZG9lcyBtb3JlIGRhdGEgZmxvdyBhbmFseXNpcyB0aGFuIGxsdm0gYW5kIHdpbGwgbm90XFxuICAqIGV4cGxvcmUgYnJhbmNoZXMgdGhhdCBhcmUgZGVhZCBhdCBydW4gdGltZS4gTWFsaWNpb3VzIHByb2dyYW1zIGNhblxcbiAgKiBoYXZlIGRlYWQgY29kZSB0b28uIFRoZXJlZm9yZSByZXBsYWNlIGFsbCBkZWFkIGF0LXJ1bi10aW1lIGNvZGVcXG5AQCAtMTgzMTcsOCArMTgzMjAsNiBAQCBzdGF0aWMgdm9pZCBzYW5pdGl6ZV9kZWFkX2NvZGUoc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudilcXG4gXFx0fVxcbiB9XFxuIFxcbi1cXG4tXFxuIHN0YXRpYyB2b2lkIGZyZWVfc3RhdGVzKHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYpXFxuIHtcXG4gXFx0c3RydWN0IGJwZl92ZXJpZmllcl9zdGF0ZV9saXN0ICpzbDtcXG5AQCAtMTg2MDAsNyArMTg2MDEsNiBAQCBzdGF0aWMgaW50IGRvX2NoZWNrX21haW4oc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudilcXG4gXFx0cmV0dXJuIHJldDtcXG4gfVxcbiBcXG4tXFxuIHN0YXRpYyB2b2lkIHByaW50X3ZlcmlmaWNhdGlvbl9zdGF0cyhzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52KVxcbiB7XFxuIFxcdC8qIFNraXAgb3ZlciBoaWRkZW4gc3VicHJvZ3Mgd2hpY2ggYXJlIG5vdCB2ZXJpZmllZC4gKi9cXG5kaWZmIC0tZ2l0IGEvdG9vbHMvYnBmL2JwZnRvb2wvZ2VuLmMgYi90b29scy9icGYvYnBmdG9vbC9nZW4uY1xcbmluZGV4IDZhZTcyNjJlYmUwYzFkLi4yZTYwMjk2MzU4ZGI1ZSAxMDA2NDRcXG4tLS0gYS90b29scy9icGYvYnBmdG9vbC9nZW4uY1xcbisrKyBiL3Rvb2xzL2JwZi9icGZ0b29sL2dlbi5jXFxuQEAgLTkyLDcgKzkyLDcgQEAgc3RhdGljIHZvaWQgZ2V0X2hlYWRlcl9ndWFyZChjaGFyICpndWFyZCwgY29uc3QgY2hhciAqb2JqX25hbWUsIGNvbnN0IGNoYXIgKnN1ZmZcXG4gXFxuIHN0YXRpYyBib29sIGdldF9tYXBfaWRlbnQoY29uc3Qgc3RydWN0IGJwZl9tYXAgKm1hcCwgY2hhciAqYnVmLCBzaXplX3QgYnVmX3N6KVxcbiB7XFxuLVxcdHN0YXRpYyBjb25zdCBjaGFyICpzZnhzW10gPSB7IFxcXCIuZGF0YVxcXCIsIFxcXCIucm9kYXRhXFxcIiwgXFxcIi5ic3NcXFwiLCBcXFwiLmtjb25maWdcXFwiIH07XFxuK1xcdHN0YXRpYyBjb25zdCBjaGFyICpzZnhzW10gPSB7IFxcXCIuZGF0YVxcXCIsIFxcXCIucm9kYXRhXFxcIiwgXFxcIi5ic3NcXFwiLCBcXFwiLnBlcmNwdVxcXCIsIFxcXCIua2NvbmZpZ1xcXCIgfTtcXG4gXFx0Y29uc3QgY2hhciAqbmFtZSA9IGJwZl9tYXBfX25hbWUobWFwKTtcXG4gXFx0aW50IGksIG47XFxuIFxcbkBAIC0xMTcsNyArMTE3LDcgQEAgc3RhdGljIGJvb2wgZ2V0X21hcF9pZGVudChjb25zdCBzdHJ1Y3QgYnBmX21hcCAqbWFwLCBjaGFyICpidWYsIHNpemVfdCBidWZfc3opXFxuIFxcbiBzdGF0aWMgYm9vbCBnZXRfZGF0YXNlY19pZGVudChjb25zdCBjaGFyICpzZWNfbmFtZSwgY2hhciAqYnVmLCBzaXplX3QgYnVmX3N6KVxcbiB7XFxuLVxcdHN0YXRpYyBjb25zdCBjaGFyICpwZnhzW10gPSB7IFxcXCIuZGF0YVxcXCIsIFxcXCIucm9kYXRhXFxcIiwgXFxcIi5ic3NcXFwiLCBcXFwiLmtjb25maWdcXFwiIH07XFxuK1xcdHN0YXRpYyBjb25zdCBjaGFyICpwZnhzW10gPSB7IFxcXCIuZGF0YVxcXCIsIFxcXCIucm9kYXRhXFxcIiwgXFxcIi5ic3NcXFwiLCBcXFwiLnBlcmNwdVxcXCIsIFxcXCIua2NvbmZpZ1xcXCIgfTtcXG4gXFx0aW50IGksIG47XFxuIFxcbiBcXHQvKiByZWNvZ25pemUgaGFyZCBjb2RlZCBMTFZNIHNlY3Rpb24gbmFtZSAqL1xcbkBAIC0yNTQsNiArMjU0LDIwIEBAIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYnRmX3R5cGUgKmZpbmRfdHlwZV9mb3JfbWFwKHN0cnVjdCBidGYgKmJ0ZiwgY29uc3QgY2hhciAqbWFwXFxuIFxcdHJldHVybiBOVUxMO1xcbiB9XFxuIFxcbitzdGF0aWMgYm9vbCBicGZfbWFwX2lzX3NrZWxfZGF0YShjb25zdCBzdHJ1Y3QgYnBmX21hcCAqbWFwKVxcbit7XFxuK1xcdGlmICghYnBmX21hcF9faXNfaW50ZXJuYWwobWFwKSlcXG4rXFx0XFx0cmV0dXJuIGZhbHNlO1xcbitcXG4rXFx0aWYgKGJwZl9tYXBfX21hcF9mbGFncyhtYXApIFxcdTAwMjYgQlBGX0ZfTU1BUEFCTEUpXFxuK1xcdFxcdHJldHVybiB0cnVlO1xcbitcXG4rXFx0aWYgKGJwZl9tYXBfX3R5cGUobWFwKSA9PSBCUEZfTUFQX1RZUEVfUEVSQ1BVX0FSUkFZKVxcbitcXHRcXHRyZXR1cm4gdHJ1ZTtcXG4rXFxuK1xcdHJldHVybiBmYWxzZTtcXG4rfVxcbitcXG4gc3RhdGljIGJvb2wgaXNfbW1hcGFibGVfbWFwKGNvbnN0IHN0cnVjdCBicGZfbWFwICptYXAsIGNoYXIgKmJ1Ziwgc2l6ZV90IHN6KVxcbiB7XFxuIFxcdHNpemVfdCB0bXBfc3o7XFxuQEAgLTI2Myw3ICsyNzcsNyBAQCBzdGF0aWMgYm9vbCBpc19tbWFwYWJsZV9tYXAoY29uc3Qgc3RydWN0IGJwZl9tYXAgKm1hcCwgY2hhciAqYnVmLCBzaXplX3Qgc3opXFxuIFxcdFxcdHJldHVybiB0cnVlO1xcbiBcXHR9XFxuIFxcbi1cXHRpZiAoIWJwZl9tYXBfX2lzX2ludGVybmFsKG1hcCkgfHwgIShicGZfbWFwX19tYXBfZmxhZ3MobWFwKSBcXHUwMDI2IEJQRl9GX01NQVBBQkxFKSlcXG4rXFx0aWYgKCFicGZfbWFwX2lzX3NrZWxfZGF0YShtYXApKVxcbiBcXHRcXHRyZXR1cm4gZmFsc2U7XFxuIFxcbiBcXHRpZiAoIWdldF9tYXBfaWRlbnQobWFwLCBidWYsIHN6KSlcXG5AQCAtMzIxLDYgKzMzNSwxMSBAQCBzdGF0aWMgYm9vbCBidGZfaXNfcHRyX3RvX2Z1bmNfcHJvdG8oY29uc3Qgc3RydWN0IGJ0ZiAqYnRmLFxcbiBcXHRyZXR1cm4gYnRmX2lzX3B0cih2KSBcXHUwMDI2XFx1MDAyNiBidGZfaXNfZnVuY19wcm90byhidGZfX3R5cGVfYnlfaWQoYnRmLCB2LVxcdTAwM2V0eXBlKSk7XFxuIH1cXG4gXFxuK3N0YXRpYyBib29sIGJwZl9tYXBfaXNfcGVyY3B1X2RhdGEoY29uc3Qgc3RydWN0IGJwZl9tYXAgKm1hcClcXG4re1xcbitcXHRyZXR1cm4gYnBmX21hcF9faXNfaW50ZXJuYWwobWFwKSBcXHUwMDI2XFx1MDAyNiBicGZfbWFwX190eXBlKG1hcCkgPT0gQlBGX01BUF9UWVBFX1BFUkNQVV9BUlJBWTtcXG4rfVxcbitcXG4gc3RhdGljIGludCBjb2RlZ2VuX3N1YnNrZWxfZGF0YXNlY3Moc3RydWN0IGJwZl9vYmplY3QgKm9iaiwgY29uc3QgY2hhciAqb2JqX25hbWUpXFxuIHtcXG4gXFx0c3RydWN0IGJ0ZiAqYnRmID0gYnBmX29iamVjdF9fYnRmKG9iaik7XFxuQEAgLTM0Myw2ICszNjIsOSBAQCBzdGF0aWMgaW50IGNvZGVnZW5fc3Vic2tlbF9kYXRhc2VjcyhzdHJ1Y3QgYnBmX29iamVjdCAqb2JqLCBjb25zdCBjaGFyICpvYmpfbmFtZVxcbiBcXHRcXHRpZiAoIWlzX21tYXBhYmxlX21hcChtYXAsIG1hcF9pZGVudCwgc2l6ZW9mKG1hcF9pZGVudCkpKVxcbiBcXHRcXHRcXHRjb250aW51ZTtcXG4gXFxuK1xcdFxcdGlmIChicGZfbWFwX2lzX3BlcmNwdV9kYXRhKG1hcCkpXFxuK1xcdFxcdFxcdGNvbnRpbnVlO1xcbitcXG4gXFx0XFx0c2VjID0gZmluZF90eXBlX2Zvcl9tYXAoYnRmLCBtYXBfaWRlbnQpO1xcbiBcXHRcXHRpZiAoIXNlYylcXG4gXFx0XFx0XFx0Y29udGludWU7XFxuQEAgLTY2OCw4ICs2OTAsNyBAQCBzdGF0aWMgdm9pZCBjb2RlZ2VuX2Rlc3Ryb3koc3RydWN0IGJwZl9vYmplY3QgKm9iaiwgY29uc3QgY2hhciAqb2JqX25hbWUpXFxuIFxcdGJwZl9vYmplY3RfX2Zvcl9lYWNoX21hcChtYXAsIG9iaikge1xcbiBcXHRcXHRpZiAoIWdldF9tYXBfaWRlbnQobWFwLCBpZGVudCwgc2l6ZW9mKGlkZW50KSkpXFxuIFxcdFxcdFxcdGNvbnRpbnVlO1xcbi1cXHRcXHRpZiAoYnBmX21hcF9faXNfaW50ZXJuYWwobWFwKSBcXHUwMDI2XFx1MDAyNlxcbi1cXHRcXHQgICAgKGJwZl9tYXBfX21hcF9mbGFncyhtYXApIFxcdTAwMjYgQlBGX0ZfTU1BUEFCTEUpKVxcbitcXHRcXHRpZiAoYnBmX21hcF9pc19za2VsX2RhdGEobWFwKSlcXG4gXFx0XFx0XFx0cHJpbnRmKFxcXCJcXFxcdHNrZWxfZnJlZV9tYXBfZGF0YShza2VsLVxcdTAwM2UlMSRzLCBza2VsLVxcdTAwM2VtYXBzLiUxJHMuaW5pdGlhbF92YWx1ZSwgJTIkenUpO1xcXFxuXFxcIixcXG4gXFx0XFx0XFx0ICAgICAgIGlkZW50LCBicGZfbWFwX21tYXBfc3oobWFwKSk7XFxuIFxcdFxcdGNvZGVnZW4oXFxcIlxcXFxcXG5AQCAtODUwLDYgKzg3MSwyMCBAQCBzdGF0aWMgaW50IGdlbl90cmFjZShzdHJ1Y3QgYnBmX29iamVjdCAqb2JqLCBjb25zdCBjaGFyICpvYmpfbmFtZSwgY29uc3QgY2hhciAqaFxcbiBcXHRcXHRpZiAoIWlzX21tYXBhYmxlX21hcChtYXAsIGlkZW50LCBzaXplb2YoaWRlbnQpKSlcXG4gXFx0XFx0XFx0Y29udGludWU7XFxuIFxcbitcXHRcXHRpZiAoYnBmX21hcF9pc19wZXJjcHVfZGF0YShtYXApKSB7XFxuK1xcdFxcdFxcdGNvZGVnZW4oXFxcIlxcXFxcXG4rXFx0XFx0XFxcXG5cXFxcXFxuK1xcdFxcdFxcdGVyciA9IHNrZWxfcHJvdGVjdF9tYXBfZGF0YShza2VsLVxcdTAwM2UlMSRzLCBcXHUwMDI2c2tlbC1cXHUwMDNlbWFwcy4lMSRzLmluaXRpYWxfdmFsdWUsICUyJHpkKTtcXFxcblxcXFxcXG4rXFx0XFx0XFx0aWYgKGVycilcXHRcXHRcXHRcXHRcXHQgICAgXFxcXG5cXFxcXFxuK1xcdFxcdFxcdFxcdHJldHVybiBlcnI7XFx0XFx0XFx0XFx0ICAgIFxcXFxuXFxcXFxcbitcXHRcXHQjaWZkZWYgX19LRVJORUxfX1xcdFxcdFxcdFxcdFxcdCAgICBcXFxcblxcXFxcXG4rXFx0XFx0XFx0c2tlbC1cXHUwMDNlJTEkcyA9IE5VTEw7XFx0XFx0XFx0XFx0ICAgIFxcXFxuXFxcXFxcbitcXHRcXHQjZW5kaWZcXHRcXHRcXHRcXHRcXHRcXHRcXHQgICAgXFxcXG5cXFxcXFxuK1xcdFxcdFxcdFxcXCIsXFxuK1xcdFxcdFxcdGlkZW50LCBicGZfbWFwX21tYXBfc3oobWFwKSk7XFxuK1xcdFxcdFxcdGNvbnRpbnVlO1xcbitcXHRcXHR9XFxuK1xcbiBcXHRcXHRpZiAoYnBmX21hcF9fbWFwX2ZsYWdzKG1hcCkgXFx1MDAyNiBCUEZfRl9SRE9OTFlfUFJPRylcXG4gXFx0XFx0XFx0bW1hcF9mbGFncyA9IFxcXCJQUk9UX1JFQURcXFwiO1xcbiBcXHRcXHRlbHNlXFxuQEAgLTE3NDAsNiArMTc3NSw4IEBAIHN0YXRpYyBpbnQgZG9fc3Vic2tlbGV0b24oaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxcbiBcXG4gXFx0XFx0aWYgKCFpc19tbWFwYWJsZV9tYXAobWFwLCBpZGVudCwgc2l6ZW9mKGlkZW50KSkpXFxuIFxcdFxcdFxcdGNvbnRpbnVlO1xcbitcXHRcXHRpZiAoYnBmX21hcF9pc19wZXJjcHVfZGF0YShtYXApKVxcbitcXHRcXHRcXHRjb250aW51ZTtcXG4gXFxuIFxcdFxcdG1hcF90eXBlX2lkID0gYnBmX21hcF9fYnRmX3ZhbHVlX3R5cGVfaWQobWFwKTtcXG4gXFx0XFx0aWYgKG1hcF90eXBlX2lkIFxcdTAwM2M9IDApIHtcXG5AQCAtMTg2Myw2ICsxOTAwLDggQEAgc3RhdGljIGludCBkb19zdWJza2VsZXRvbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpXFxuIFxcdGJwZl9vYmplY3RfX2Zvcl9lYWNoX21hcChtYXAsIG9iaikge1xcbiBcXHRcXHRpZiAoIWlzX21tYXBhYmxlX21hcChtYXAsIGlkZW50LCBzaXplb2YoaWRlbnQpKSlcXG4gXFx0XFx0XFx0Y29udGludWU7XFxuK1xcdFxcdGlmIChicGZfbWFwX2lzX3BlcmNwdV9kYXRhKG1hcCkpXFxuK1xcdFxcdFxcdGNvbnRpbnVlO1xcbiBcXG4gXFx0XFx0bWFwX3R5cGVfaWQgPSBicGZfbWFwX19idGZfdmFsdWVfdHlwZV9pZChtYXApO1xcbiBcXHRcXHRpZiAobWFwX3R5cGVfaWQgXFx1MDAzYz0gMClcXG5kaWZmIC0tZ2l0IGEvdG9vbHMvbGliL2JwZi9icGZfZ2VuX2ludGVybmFsLmggYi90b29scy9saWIvYnBmL2JwZl9nZW5faW50ZXJuYWwuaFxcbmluZGV4IDQ5YWY0MjYwYjhlNmI3Li41ZWE4MzgzODA1ZDNiYyAxMDA2NDRcXG4tLS0gYS90b29scy9saWIvYnBmL2JwZl9nZW5faW50ZXJuYWwuaFxcbisrKyBiL3Rvb2xzL2xpYi9icGYvYnBmX2dlbl9pbnRlcm5hbC5oXFxuQEAgLTY2LDcgKzY2LDggQEAgdm9pZCBicGZfZ2VuX19wcm9nX2xvYWQoc3RydWN0IGJwZl9nZW4gKmdlbixcXG4gXFx0XFx0XFx0ZW51bSBicGZfcHJvZ190eXBlIHByb2dfdHlwZSwgY29uc3QgY2hhciAqcHJvZ19uYW1lLFxcbiBcXHRcXHRcXHRjb25zdCBjaGFyICpsaWNlbnNlLCBzdHJ1Y3QgYnBmX2luc24gKmluc25zLCBzaXplX3QgaW5zbl9jbnQsXFxuIFxcdFxcdFxcdHN0cnVjdCBicGZfcHJvZ19sb2FkX29wdHMgKmxvYWRfYXR0ciwgaW50IHByb2dfaWR4KTtcXG4tdm9pZCBicGZfZ2VuX19tYXBfdXBkYXRlX2VsZW0oc3RydWN0IGJwZl9nZW4gKmdlbiwgaW50IG1hcF9pZHgsIHZvaWQgKnZhbHVlLCBfX3UzMiB2YWx1ZV9zaXplKTtcXG4rdm9pZCBicGZfZ2VuX19tYXBfdXBkYXRlX2VsZW0oc3RydWN0IGJwZl9nZW4gKmdlbiwgaW50IG1hcF9pZHgsIHZvaWQgKnZhbHVlLCBfX3UzMiB2YWx1ZV9zaXplLFxcbitcXHRcXHRcXHQgICAgICBfX3U2NCBmbGFncyk7XFxuIHZvaWQgYnBmX2dlbl9fbWFwX2ZyZWV6ZShzdHJ1Y3QgYnBmX2dlbiAqZ2VuLCBpbnQgbWFwX2lkeCk7XFxuIHZvaWQgYnBmX2dlbl9fcmVjb3JkX2F0dGFjaF90YXJnZXQoc3RydWN0IGJwZl9nZW4gKmdlbiwgY29uc3QgY2hhciAqbmFtZSwgZW51bSBicGZfYXR0YWNoX3R5cGUgdHlwZSk7XFxuIHZvaWQgYnBmX2dlbl9fcmVjb3JkX2V4dGVybihzdHJ1Y3QgYnBmX2dlbiAqZ2VuLCBjb25zdCBjaGFyICpuYW1lLCBib29sIGlzX3dlYWssXFxuZGlmZiAtLWdpdCBhL3Rvb2xzL2xpYi9icGYvZmVhdHVyZXMuYyBiL3Rvb2xzL2xpYi9icGYvZmVhdHVyZXMuY1xcbmluZGV4IGI3ZTM4OGY5OWQwYmJkLi5lZjk1ODFjMTEzMDM1NSAxMDA2NDRcXG4tLS0gYS90b29scy9saWIvYnBmL2ZlYXR1cmVzLmNcXG4rKysgYi90b29scy9saWIvYnBmL2ZlYXR1cmVzLmNcXG5AQCAtNjIwLDYgKzYyMCwzOCBAQCBzdGF0aWMgaW50IHByb2JlX2JwZl9zeXNjYWxsX2NvbW1vbl9hdHRycyhpbnQgdG9rZW5fZmQpXFxuIFxcdHJldHVybiBwcm9iZV9zeXNfYnBmX2V4dCgpO1xcbiB9XFxuIFxcbitzdGF0aWMgaW50IHByb2JlX2tlcm5fcGVyY3B1X2RhdGEoaW50IHRva2VuX2ZkKVxcbit7XFxuK1xcdHN0cnVjdCBicGZfaW5zbiBpbnNuc1tdID0ge1xcbitcXHRcXHRCUEZfTERfTUFQX1ZBTFVFKEJQRl9SRUdfMSwgMCwgMCksXFxuK1xcdFxcdEJQRl9MRFhfTUVNKEJQRl9EVywgQlBGX1JFR18wLCBCUEZfUkVHXzEsIDApLFxcbitcXHRcXHRCUEZfRVhJVF9JTlNOKCksXFxuK1xcdH07XFxuK1xcdExJQkJQRl9PUFRTKGJwZl9tYXBfY3JlYXRlX29wdHMsIG1hcF9vcHRzLFxcbitcXHRcXHQudG9rZW5fZmQgPSB0b2tlbl9mZCxcXG4rXFx0XFx0Lm1hcF9mbGFncyA9IHRva2VuX2ZkID8gQlBGX0ZfVE9LRU5fRkQgOiAwLFxcbitcXHQpO1xcbitcXHRMSUJCUEZfT1BUUyhicGZfcHJvZ19sb2FkX29wdHMsIHByb2dfb3B0cyxcXG4rXFx0XFx0LnRva2VuX2ZkID0gdG9rZW5fZmQsXFxuK1xcdFxcdC5wcm9nX2ZsYWdzID0gdG9rZW5fZmQgPyBCUEZfRl9UT0tFTl9GRCA6IDAsXFxuK1xcdCk7XFxuK1xcdGludCByZXQsIG1hcCwgaW5zbl9jbnQgPSBBUlJBWV9TSVpFKGluc25zKTtcXG4rXFxuK1xcdG1hcCA9IGJwZl9tYXBfY3JlYXRlKEJQRl9NQVBfVFlQRV9QRVJDUFVfQVJSQVksIFxcXCJsaWJicGZfcGVyY3B1XFxcIiwgc2l6ZW9mKGludCksIDgsIDEsXFxuK1xcdFxcdFxcdCAgICAgXFx1MDAyNm1hcF9vcHRzKTtcXG4rXFx0aWYgKG1hcCBcXHUwMDNjIDApIHtcXG4rXFx0XFx0cHJfd2FybihcXFwiRXJyb3IgaW4gJXMoKTogJXMuIENvdWxkbid0IGNyZWF0ZSBzaW1wbGUgcGVyY3B1X2FycmF5IG1hcC5cXFxcblxcXCIsXFxuK1xcdFxcdFxcdF9fZnVuY19fLCBlcnJzdHIobWFwKSk7XFxuK1xcdFxcdHJldHVybiBtYXA7XFxuK1xcdH1cXG4rXFxuK1xcdGluc25zWzBdLmltbSA9IG1hcDtcXG4rXFxuK1xcdHJldCA9IGJwZl9wcm9nX2xvYWQoQlBGX1BST0dfVFlQRV9TT0NLRVRfRklMVEVSLCBOVUxMLCBcXFwiR1BMXFxcIiwgaW5zbnMsIGluc25fY250LCBcXHUwMDI2cHJvZ19vcHRzKTtcXG4rXFx0Y2xvc2UobWFwKTtcXG4rXFx0cmV0dXJuIHByb2JlX2ZkKHJldCk7XFxuK31cXG4rXFxuIHR5cGVkZWYgaW50ICgqZmVhdHVyZV9wcm9iZV9mbikoaW50IC8qIHRva2VuX2ZkICovKTtcXG4gXFxuIHN0YXRpYyBzdHJ1Y3Qga2Vybl9mZWF0dXJlX2NhY2hlIGZlYXR1cmVfY2FjaGU7XFxuQEAgLTcwNyw2ICs3MzksOSBAQCBzdGF0aWMgc3RydWN0IGtlcm5fZmVhdHVyZV9kZXNjIHtcXG4gXFx0W0ZFQVRfQlBGX1NZU0NBTExfQ09NTU9OX0FUVFJTXSA9IHtcXG4gXFx0XFx0XFxcIkJQRiBzeXNjYWxsIGNvbW1vbiBhdHRyaWJ1dGVzIHN1cHBvcnRcXFwiLCBwcm9iZV9icGZfc3lzY2FsbF9jb21tb25fYXR0cnMsXFxuIFxcdH0sXFxuK1xcdFtGRUFUX1BFUkNQVV9EQVRBXSA9IHtcXG4rXFx0XFx0XFxcImtlcm5lbCBzdXBwb3J0cyBwZXJjcHUgZGF0YVxcXCIsIHByb2JlX2tlcm5fcGVyY3B1X2RhdGEsXFxuK1xcdH0sXFxuIH07XFxuIFxcbiBib29sIGZlYXRfc3VwcG9ydGVkKHN0cnVjdCBrZXJuX2ZlYXR1cmVfY2FjaGUgKmNhY2hlLCBlbnVtIGtlcm5fZmVhdHVyZV9pZCBmZWF0X2lkKVxcbmRpZmYgLS1naXQgYS90b29scy9saWIvYnBmL2dlbl9sb2FkZXIuYyBiL3Rvb2xzL2xpYi9icGYvZ2VuX2xvYWRlci5jXFxuaW5kZXggYzdmMmQyYWM3YmIzNWYuLjYwYTEyMDRlOWEyNjNjIDEwMDY0NFxcbi0tLSBhL3Rvb2xzL2xpYi9icGYvZ2VuX2xvYWRlci5jXFxuKysrIGIvdG9vbHMvbGliL2JwZi9nZW5fbG9hZGVyLmNcXG5AQCAtMTE5MCw3ICsxMTkwLDcgQEAgdm9pZCBicGZfZ2VuX19wcm9nX2xvYWQoc3RydWN0IGJwZl9nZW4gKmdlbixcXG4gfVxcbiBcXG4gdm9pZCBicGZfZ2VuX19tYXBfdXBkYXRlX2VsZW0oc3RydWN0IGJwZl9nZW4gKmdlbiwgaW50IG1hcF9pZHgsIHZvaWQgKnB2YWx1ZSxcXG4tXFx0XFx0XFx0ICAgICAgX191MzIgdmFsdWVfc2l6ZSlcXG4rXFx0XFx0XFx0ICAgICAgX191MzIgdmFsdWVfc2l6ZSwgX191NjQgZmxhZ3MpXFxuIHtcXG4gXFx0aW50IGF0dHJfc2l6ZSA9IG9mZnNldG9mZW5kKHVuaW9uIGJwZl9hdHRyLCBmbGFncyk7XFxuIFxcdGludCBtYXBfdXBkYXRlX2F0dHIsIHZhbHVlLCBrZXk7XFxuQEAgLTExOTgsNiArMTE5OCw3IEBAIHZvaWQgYnBmX2dlbl9fbWFwX3VwZGF0ZV9lbGVtKHN0cnVjdCBicGZfZ2VuICpnZW4sIGludCBtYXBfaWR4LCB2b2lkICpwdmFsdWUsXFxuIFxcdGludCB6ZXJvID0gMDtcXG4gXFxuIFxcdG1lbXNldChcXHUwMDI2YXR0ciwgMCwgYXR0cl9zaXplKTtcXG4rXFx0YXR0ci5mbGFncyA9IHRndF9lbmRpYW4oZmxhZ3MpO1xcbiBcXG4gXFx0dmFsdWUgPSBhZGRfZGF0YShnZW4sIHB2YWx1ZSwgdmFsdWVfc2l6ZSk7XFxuIFxcdGtleSA9IGFkZF9kYXRhKGdlbiwgXFx1MDAyNnplcm8sIHNpemVvZih6ZXJvKSk7XFxuZGlmZiAtLWdpdCBhL3Rvb2xzL2xpYi9icGYvbGliYnBmLmMgYi90b29scy9saWIvYnBmL2xpYmJwZi5jXFxuaW5kZXggNzE2MjE0NjI4MGE4MGUuLjZlMThhMTYyOGUxMzk2IDEwMDY0NFxcbi0tLSBhL3Rvb2xzL2xpYi9icGYvbGliYnBmLmNcXG4rKysgYi90b29scy9saWIvYnBmL2xpYmJwZi5jXFxuQEAgLTU0MSw2ICs1NDEsNyBAQCBzdHJ1Y3QgYnBmX3N0cnVjdF9vcHMge1xcbiB9O1xcbiBcXG4gI2RlZmluZSBEQVRBX1NFQyBcXFwiLmRhdGFcXFwiXFxuKyNkZWZpbmUgUEVSQ1BVX1NFQyBcXFwiLnBlcmNwdVxcXCJcXG4gI2RlZmluZSBCU1NfU0VDIFxcXCIuYnNzXFxcIlxcbiAjZGVmaW5lIFJPREFUQV9TRUMgXFxcIi5yb2RhdGFcXFwiXFxuICNkZWZpbmUgS0NPTkZJR19TRUMgXFxcIi5rY29uZmlnXFxcIlxcbkBAIC01NTUsNiArNTU2LDcgQEAgZW51bSBsaWJicGZfbWFwX3R5cGUge1xcbiBcXHRMSUJCUEZfTUFQX0JTUyxcXG4gXFx0TElCQlBGX01BUF9ST0RBVEEsXFxuIFxcdExJQkJQRl9NQVBfS0NPTkZJRyxcXG4rXFx0TElCQlBGX01BUF9QRVJDUFUsXFxuIH07XFxuIFxcbiBzdHJ1Y3QgYnBmX21hcF9kZWYge1xcbkBAIC02NjYsNiArNjY4LDcgQEAgZW51bSBzZWNfdHlwZSB7XFxuIFxcdFNFQ19EQVRBLFxcbiBcXHRTRUNfUk9EQVRBLFxcbiBcXHRTRUNfU1RfT1BTLFxcbitcXHRTRUNfUEVSQ1BVLFxcbiB9O1xcbiBcXG4gc3RydWN0IGVsZl9zZWNfZGVzYyB7XFxuQEAgLTE4MzksNiArMTg0Miw4IEBAIHN0YXRpYyBzaXplX3QgYnBmX21hcF9tbWFwX3N6KGNvbnN0IHN0cnVjdCBicGZfbWFwICptYXApXFxuIFxcdHN3aXRjaCAobWFwLVxcdTAwM2VkZWYudHlwZSkge1xcbiBcXHRjYXNlIEJQRl9NQVBfVFlQRV9BUlJBWTpcXG4gXFx0XFx0cmV0dXJuIGFycmF5X21hcF9tbWFwX3N6KG1hcC1cXHUwMDNlZGVmLnZhbHVlX3NpemUsIG1hcC1cXHUwMDNlZGVmLm1heF9lbnRyaWVzKTtcXG4rXFx0Y2FzZSBCUEZfTUFQX1RZUEVfUEVSQ1BVX0FSUkFZOlxcbitcXHRcXHRyZXR1cm4gbWFwLVxcdTAwM2VkZWYudmFsdWVfc2l6ZTtcXG4gXFx0Y2FzZSBCUEZfTUFQX1RZUEVfQVJFTkE6XFxuIFxcdFxcdHJldHVybiBwYWdlX3N6ICogbWFwLVxcdTAwM2VkZWYubWF4X2VudHJpZXM7XFxuIFxcdGRlZmF1bHQ6XFxuQEAgLTE5MzgsNyArMTk0Myw3IEBAIHN0YXRpYyBib29sIG1hcF9pc19tbWFwYWJsZShzdHJ1Y3QgYnBmX29iamVjdCAqb2JqLCBzdHJ1Y3QgYnBmX21hcCAqbWFwKVxcbiBcXHRzdHJ1Y3QgYnRmX3Zhcl9zZWNpbmZvICp2c2k7XFxuIFxcdGludCBpLCBuO1xcbiBcXG4tXFx0aWYgKCFtYXAtXFx1MDAzZWJ0Zl92YWx1ZV90eXBlX2lkKVxcbitcXHRpZiAoIW1hcC1cXHUwMDNlYnRmX3ZhbHVlX3R5cGVfaWQgfHwgbWFwLVxcdTAwM2VsaWJicGZfdHlwZSA9PSBMSUJCUEZfTUFQX1BFUkNQVSlcXG4gXFx0XFx0cmV0dXJuIGZhbHNlO1xcbiBcXG4gXFx0dCA9IGJ0Zl9fdHlwZV9ieV9pZChvYmotXFx1MDAzZWJ0ZiwgbWFwLVxcdTAwM2VidGZfdmFsdWVfdHlwZV9pZCk7XFxuQEAgLTE5NjIsNiArMTk2Nyw3IEBAIHN0YXRpYyBpbnRcXG4gYnBmX29iamVjdF9faW5pdF9pbnRlcm5hbF9tYXAoc3RydWN0IGJwZl9vYmplY3QgKm9iaiwgZW51bSBsaWJicGZfbWFwX3R5cGUgdHlwZSxcXG4gXFx0XFx0XFx0ICAgICAgY29uc3QgY2hhciAqcmVhbF9uYW1lLCBpbnQgc2VjX2lkeCwgdm9pZCAqZGF0YSwgc2l6ZV90IGRhdGFfc3opXFxuIHtcXG4rXFx0Ym9vbCBpc19wZXJjcHUgPSB0eXBlID09IExJQkJQRl9NQVBfUEVSQ1BVO1xcbiBcXHRzdHJ1Y3QgYnBmX21hcF9kZWYgKmRlZjtcXG4gXFx0c3RydWN0IGJwZl9tYXAgKm1hcDtcXG4gXFx0c2l6ZV90IG1tYXBfc3o7XFxuQEAgLTE5NzUsNyArMTk4MSw3IEBAIGJwZl9vYmplY3RfX2luaXRfaW50ZXJuYWxfbWFwKHN0cnVjdCBicGZfb2JqZWN0ICpvYmosIGVudW0gbGliYnBmX21hcF90eXBlIHR5cGUsXFxuIFxcdG1hcC1cXHUwMDNlc2VjX2lkeCA9IHNlY19pZHg7XFxuIFxcdG1hcC1cXHUwMDNlc2VjX29mZnNldCA9IDA7XFxuIFxcdG1hcC1cXHUwMDNlcmVhbF9uYW1lID0gc3RyZHVwKHJlYWxfbmFtZSk7XFxuLVxcdG1hcC1cXHUwMDNlbmFtZSA9IGludGVybmFsX21hcF9uYW1lKG9iaiwgcmVhbF9uYW1lKTtcXG4rXFx0bWFwLVxcdTAwM2VuYW1lID0gaXNfcGVyY3B1ID8gc3RyZHVwKHJlYWxfbmFtZSkgOiBpbnRlcm5hbF9tYXBfbmFtZShvYmosIHJlYWxfbmFtZSk7XFxuIFxcdGlmICghbWFwLVxcdTAwM2VyZWFsX25hbWUgfHwgIW1hcC1cXHUwMDNlbmFtZSkge1xcbiBcXHRcXHR6ZnJlZShcXHUwMDI2bWFwLVxcdTAwM2VyZWFsX25hbWUpO1xcbiBcXHRcXHR6ZnJlZShcXHUwMDI2bWFwLVxcdTAwM2VuYW1lKTtcXG5AQCAtMTk4Myw3ICsxOTg5LDcgQEAgYnBmX29iamVjdF9faW5pdF9pbnRlcm5hbF9tYXAoc3RydWN0IGJwZl9vYmplY3QgKm9iaiwgZW51bSBsaWJicGZfbWFwX3R5cGUgdHlwZSxcXG4gXFx0fVxcbiBcXG4gXFx0ZGVmID0gXFx1MDAyNm1hcC1cXHUwMDNlZGVmO1xcbi1cXHRkZWYtXFx1MDAzZXR5cGUgPSBCUEZfTUFQX1RZUEVfQVJSQVk7XFxuK1xcdGRlZi1cXHUwMDNldHlwZSA9IGlzX3BlcmNwdSA/IEJQRl9NQVBfVFlQRV9QRVJDUFVfQVJSQVkgOiBCUEZfTUFQX1RZUEVfQVJSQVk7XFxuIFxcdGRlZi1cXHUwMDNla2V5X3NpemUgPSBzaXplb2YoaW50KTtcXG4gXFx0ZGVmLVxcdTAwM2V2YWx1ZV9zaXplID0gZGF0YV9zejtcXG4gXFx0ZGVmLVxcdTAwM2VtYXhfZW50cmllcyA9IDE7XFxuQEAgLTE5OTYsOCArMjAwMiw5IEBAIGJwZl9vYmplY3RfX2luaXRfaW50ZXJuYWxfbWFwKHN0cnVjdCBicGZfb2JqZWN0ICpvYmosIGVudW0gbGliYnBmX21hcF90eXBlIHR5cGUsXFxuIFxcdGlmIChtYXBfaXNfbW1hcGFibGUob2JqLCBtYXApKVxcbiBcXHRcXHRkZWYtXFx1MDAzZW1hcF9mbGFncyB8PSBCUEZfRl9NTUFQQUJMRTtcXG4gXFxuLVxcdHByX2RlYnVnKFxcXCJtYXAgJyVzJyAoZ2xvYmFsIGRhdGEpOiBhdCBzZWNfaWR4ICVkLCBvZmZzZXQgJXp1LCBmbGFncyAleC5cXFxcblxcXCIsXFxuLVxcdFxcdCBtYXAtXFx1MDAzZW5hbWUsIG1hcC1cXHUwMDNlc2VjX2lkeCwgbWFwLVxcdTAwM2VzZWNfb2Zmc2V0LCBkZWYtXFx1MDAzZW1hcF9mbGFncyk7XFxuK1xcdHByX2RlYnVnKFxcXCJtYXAgJyVzJyAoZ2xvYmFsICVzZGF0YSk6IGF0IHNlY19pZHggJWQsIG9mZnNldCAlenUsIGZsYWdzICV4LlxcXFxuXFxcIixcXG4rXFx0XFx0IG1hcC1cXHUwMDNlbmFtZSwgaXNfcGVyY3B1ID8gXFxcInBlcmNwdSBcXFwiIDogXFxcIlxcXCIsIG1hcC1cXHUwMDNlc2VjX2lkeCxcXG4rXFx0XFx0IG1hcC1cXHUwMDNlc2VjX29mZnNldCwgZGVmLVxcdTAwM2VtYXBfZmxhZ3MpO1xcbiBcXG4gXFx0bW1hcF9zeiA9IGJwZl9tYXBfbW1hcF9zeihtYXApO1xcbiBcXHRtYXAtXFx1MDAzZW1tYXBlZCA9IG1tYXAoTlVMTCwgbW1hcF9zeiwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSxcXG5AQCAtMjA1Nyw2ICsyMDY0LDEzIEBAIHN0YXRpYyBpbnQgYnBmX29iamVjdF9faW5pdF9nbG9iYWxfZGF0YV9tYXBzKHN0cnVjdCBicGZfb2JqZWN0ICpvYmopXFxuIFxcdFxcdFxcdFxcdFxcdFxcdFxcdCAgICBOVUxMLFxcbiBcXHRcXHRcXHRcXHRcXHRcXHRcXHQgICAgc2VjX2Rlc2MtXFx1MDAzZWRhdGEtXFx1MDAzZWRfc2l6ZSk7XFxuIFxcdFxcdFxcdGJyZWFrO1xcbitcXHRcXHRjYXNlIFNFQ19QRVJDUFU6XFxuK1xcdFxcdFxcdHNlY19uYW1lID0gZWxmX3NlY19uYW1lKG9iaiwgZWxmX3NlY19ieV9pZHgob2JqLCBzZWNfaWR4KSk7XFxuK1xcdFxcdFxcdGVyciA9IGJwZl9vYmplY3RfX2luaXRfaW50ZXJuYWxfbWFwKG9iaiwgTElCQlBGX01BUF9QRVJDUFUsXFxuK1xcdFxcdFxcdFxcdFxcdFxcdFxcdCAgICBzZWNfbmFtZSwgc2VjX2lkeCxcXG4rXFx0XFx0XFx0XFx0XFx0XFx0XFx0ICAgIHNlY19kZXNjLVxcdTAwM2VkYXRhLVxcdTAwM2VkX2J1ZixcXG4rXFx0XFx0XFx0XFx0XFx0XFx0XFx0ICAgIHNlY19kZXNjLVxcdTAwM2VkYXRhLVxcdTAwM2VkX3NpemUpO1xcbitcXHRcXHRcXHRicmVhaztcXG4gXFx0XFx0ZGVmYXVsdDpcXG4gXFx0XFx0XFx0Lyogc2tpcCAqL1xcbiBcXHRcXHRcXHRicmVhaztcXG5AQCAtNDAxNiw2ICs0MDMwLDExIEBAIHN0YXRpYyBpbnQgYnBmX29iamVjdF9fZWxmX2NvbGxlY3Qoc3RydWN0IGJwZl9vYmplY3QgKm9iailcXG4gXFx0XFx0XFx0XFx0c2VjX2Rlc2MtXFx1MDAzZXNlY190eXBlID0gU0VDX1JPREFUQTtcXG4gXFx0XFx0XFx0XFx0c2VjX2Rlc2MtXFx1MDAzZXNoZHIgPSBzaDtcXG4gXFx0XFx0XFx0XFx0c2VjX2Rlc2MtXFx1MDAzZWRhdGEgPSBkYXRhO1xcbitcXHRcXHRcXHR9IGVsc2UgaWYgKHN0cmNtcChuYW1lLCBQRVJDUFVfU0VDKSA9PSAwIHx8XFxuK1xcdFxcdFxcdFxcdCAgIHN0cl9oYXNfcGZ4KG5hbWUsIFBFUkNQVV9TRUMgXFxcIi5cXFwiKSkge1xcbitcXHRcXHRcXHRcXHRzZWNfZGVzYy1cXHUwMDNlc2VjX3R5cGUgPSBTRUNfUEVSQ1BVO1xcbitcXHRcXHRcXHRcXHRzZWNfZGVzYy1cXHUwMDNlc2hkciA9IHNoO1xcbitcXHRcXHRcXHRcXHRzZWNfZGVzYy1cXHUwMDNlZGF0YSA9IGRhdGE7XFxuIFxcdFxcdFxcdH0gZWxzZSBpZiAoc3RyY21wKG5hbWUsIFNUUlVDVF9PUFNfU0VDKSA9PSAwIHx8XFxuIFxcdFxcdFxcdFxcdCAgIHN0cmNtcChuYW1lLCBTVFJVQ1RfT1BTX0xJTktfU0VDKSA9PSAwIHx8XFxuIFxcdFxcdFxcdFxcdCAgIHN0cmNtcChuYW1lLCBcXFwiP1xcXCIgU1RSVUNUX09QU19TRUMpID09IDAgfHxcXG5AQCAtNDU0NCw2ICs0NTYzLDcgQEAgc3RhdGljIGJvb2wgYnBmX29iamVjdF9fc2huZHhfaXNfZGF0YShjb25zdCBzdHJ1Y3QgYnBmX29iamVjdCAqb2JqLFxcbiBcXHRjYXNlIFNFQ19CU1M6XFxuIFxcdGNhc2UgU0VDX0RBVEE6XFxuIFxcdGNhc2UgU0VDX1JPREFUQTpcXG4rXFx0Y2FzZSBTRUNfUEVSQ1BVOlxcbiBcXHRcXHRyZXR1cm4gdHJ1ZTtcXG4gXFx0ZGVmYXVsdDpcXG4gXFx0XFx0cmV0dXJuIGZhbHNlO1xcbkBAIC00NTY5LDYgKzQ1ODksOCBAQCBicGZfb2JqZWN0X19zZWN0aW9uX3RvX2xpYmJwZl9tYXBfdHlwZShjb25zdCBzdHJ1Y3QgYnBmX29iamVjdCAqb2JqLCBpbnQgc2huZHgpXFxuIFxcdFxcdHJldHVybiBMSUJCUEZfTUFQX0RBVEE7XFxuIFxcdGNhc2UgU0VDX1JPREFUQTpcXG4gXFx0XFx0cmV0dXJuIExJQkJQRl9NQVBfUk9EQVRBO1xcbitcXHRjYXNlIFNFQ19QRVJDUFU6XFxuK1xcdFxcdHJldHVybiBMSUJCUEZfTUFQX1BFUkNQVTtcXG4gXFx0ZGVmYXVsdDpcXG4gXFx0XFx0cmV0dXJuIExJQkJQRl9NQVBfVU5TUEVDO1xcbiBcXHR9XFxuQEAgLTQ5NDQsNyArNDk2Niw3IEBAIHN0YXRpYyBpbnQgbWFwX2ZpbGxfYnRmX3R5cGVfaW5mbyhzdHJ1Y3QgYnBmX29iamVjdCAqb2JqLCBzdHJ1Y3QgYnBmX21hcCAqbWFwKVxcbiBcXG4gXFx0LypcXG4gXFx0ICogTExWTSBhbm5vdGF0ZXMgZ2xvYmFsIGRhdGEgZGlmZmVyZW50bHkgaW4gQlRGLCB0aGF0IGlzLFxcbi1cXHQgKiBvbmx5IGFzICcuZGF0YScsICcuYnNzJyBvciAnLnJvZGF0YScuXFxuK1xcdCAqIG9ubHkgYXMgJy5kYXRhJywgJy5ic3MnLCAnLnBlcmNwdScgb3IgJy5yb2RhdGEnLlxcbiBcXHQgKi9cXG4gXFx0aWYgKCFicGZfbWFwX19pc19pbnRlcm5hbChtYXApKVxcbiBcXHRcXHRyZXR1cm4gLUVOT0VOVDtcXG5AQCAtNTI5NywxOCArNTMxOSwzMCBAQCBzdGF0aWMgaW50XFxuIGJwZl9vYmplY3RfX3BvcHVsYXRlX2ludGVybmFsX21hcChzdHJ1Y3QgYnBmX29iamVjdCAqb2JqLCBzdHJ1Y3QgYnBmX21hcCAqbWFwKVxcbiB7XFxuIFxcdGVudW0gbGliYnBmX21hcF90eXBlIG1hcF90eXBlID0gbWFwLVxcdTAwM2VsaWJicGZfdHlwZTtcXG4rXFx0Ym9vbCBpc19wZXJjcHUgPSBtYXBfdHlwZSA9PSBMSUJCUEZfTUFQX1BFUkNQVTtcXG4rXFx0X191NjQgdXBkYXRlX2ZsYWdzID0gMDtcXG4gXFx0aW50IGVyciwgemVybyA9IDA7XFxuIFxcdHNpemVfdCBtbWFwX3N6O1xcbiBcXG4rXFx0aWYgKGlzX3BlcmNwdSkge1xcbitcXHRcXHRpZiAoIW9iai1cXHUwMDNlZ2VuX2xvYWRlciBcXHUwMDI2XFx1MDAyNiAha2VybmVsX3N1cHBvcnRzKG9iaiwgRkVBVF9QRVJDUFVfREFUQSkpIHtcXG4rXFx0XFx0XFx0cHJfd2FybihcXFwibWFwICclcyc6IGtlcm5lbCBkb2VzIG5vdCBzdXBwb3J0IHBlcmNwdSBkYXRhLlxcXFxuXFxcIixcXG4rXFx0XFx0XFx0XFx0YnBmX21hcF9fbmFtZShtYXApKTtcXG4rXFx0XFx0XFx0cmV0dXJuIC1FT1BOT1RTVVBQO1xcbitcXHRcXHR9XFxuK1xcbitcXHRcXHR1cGRhdGVfZmxhZ3MgPSBCUEZfRl9BTExfQ1BVUztcXG4rXFx0fVxcbitcXG4gXFx0aWYgKG9iai1cXHUwMDNlZ2VuX2xvYWRlcikge1xcbiBcXHRcXHRicGZfZ2VuX19tYXBfdXBkYXRlX2VsZW0ob2JqLVxcdTAwM2VnZW5fbG9hZGVyLCBtYXAgLSBvYmotXFx1MDAzZW1hcHMsXFxuLVxcdFxcdFxcdFxcdFxcdCBtYXAtXFx1MDAzZW1tYXBlZCwgbWFwLVxcdTAwM2VkZWYudmFsdWVfc2l6ZSk7XFxuK1xcdFxcdFxcdFxcdFxcdCBtYXAtXFx1MDAzZW1tYXBlZCwgbWFwLVxcdTAwM2VkZWYudmFsdWVfc2l6ZSwgdXBkYXRlX2ZsYWdzKTtcXG4gXFx0XFx0aWYgKG1hcF90eXBlID09IExJQkJQRl9NQVBfUk9EQVRBIHx8IG1hcF90eXBlID09IExJQkJQRl9NQVBfS0NPTkZJRylcXG4gXFx0XFx0XFx0YnBmX2dlbl9fbWFwX2ZyZWV6ZShvYmotXFx1MDAzZWdlbl9sb2FkZXIsIG1hcCAtIG9iai1cXHUwMDNlbWFwcyk7XFxuIFxcdFxcdHJldHVybiAwO1xcbiBcXHR9XFxuIFxcbi1cXHRlcnIgPSBicGZfbWFwX3VwZGF0ZV9lbGVtKG1hcC1cXHUwMDNlZmQsIFxcdTAwMjZ6ZXJvLCBtYXAtXFx1MDAzZW1tYXBlZCwgMCk7XFxuK1xcdGVyciA9IGJwZl9tYXBfdXBkYXRlX2VsZW0obWFwLVxcdTAwM2VmZCwgXFx1MDAyNnplcm8sIG1hcC1cXHUwMDNlbW1hcGVkLCB1cGRhdGVfZmxhZ3MpO1xcbiBcXHRpZiAoZXJyKSB7XFxuIFxcdFxcdGVyciA9IC1lcnJubztcXG4gXFx0XFx0cHJfd2FybihcXFwibWFwICclcyc6IGZhaWxlZCB0byBzZXQgaW5pdGlhbCBjb250ZW50czogJXNcXFxcblxcXCIsXFxuQEAgLTUzNTMsNiArNTM4NywxMyBAQCBicGZfb2JqZWN0X19wb3B1bGF0ZV9pbnRlcm5hbF9tYXAoc3RydWN0IGJwZl9vYmplY3QgKm9iaiwgc3RydWN0IGJwZl9tYXAgKm1hcClcXG4gXFx0XFx0XFx0cmV0dXJuIGVycjtcXG4gXFx0XFx0fVxcbiBcXHRcXHRtYXAtXFx1MDAzZW1tYXBlZCA9IG1tYXBlZDtcXG4rXFx0fSBlbHNlIGlmIChpc19wZXJjcHUpIHtcXG4rXFx0XFx0aWYgKG1wcm90ZWN0KG1hcC1cXHUwMDNlbW1hcGVkLCBtbWFwX3N6LCBQUk9UX1JFQUQpKSB7XFxuK1xcdFxcdFxcdGVyciA9IC1lcnJubztcXG4rXFx0XFx0XFx0cHJfd2FybihcXFwibWFwICclcyc6IGZhaWxlZCB0byBtcHJvdGVjdCgpIGNvbnRlbnRzOiAlc1xcXFxuXFxcIixcXG4rXFx0XFx0XFx0XFx0YnBmX21hcF9fbmFtZShtYXApLCBlcnJzdHIoZXJyKSk7XFxuK1xcdFxcdFxcdHJldHVybiBlcnI7XFxuK1xcdFxcdH1cXG4gXFx0fSBlbHNlIGlmIChtYXAtXFx1MDAzZW1tYXBlZCkge1xcbiBcXHRcXHRtdW5tYXAobWFwLVxcdTAwM2VtbWFwZWQsIG1tYXBfc3opO1xcbiBcXHRcXHRtYXAtXFx1MDAzZW1tYXBlZCA9IE5VTEw7XFxuZGlmZiAtLWdpdCBhL3Rvb2xzL2xpYi9icGYvbGliYnBmX2ludGVybmFsLmggYi90b29scy9saWIvYnBmL2xpYmJwZl9pbnRlcm5hbC5oXFxuaW5kZXggMDRjZDMwM2ZiNWE4NzkuLjQ3YWUzOTEyNWY2OGY5IDEwMDY0NFxcbi0tLSBhL3Rvb2xzL2xpYi9icGYvbGliYnBmX2ludGVybmFsLmhcXG4rKysgYi90b29scy9saWIvYnBmL2xpYmJwZl9pbnRlcm5hbC5oXFxuQEAgLTQwMSw2ICs0MDEsOCBAQCBlbnVtIGtlcm5fZmVhdHVyZV9pZCB7XFxuIFxcdEZFQVRfQlRGX0xBWU9VVCxcXG4gXFx0LyogS2VybmVsIHN1cHBvcnRzIEJQRiBzeXNjYWxsIGNvbW1vbiBhdHRyaWJ1dGVzICovXFxuIFxcdEZFQVRfQlBGX1NZU0NBTExfQ09NTU9OX0FUVFJTLFxcbitcXHQvKiBLZXJuZWwgc3VwcG9ydHMgcGVyY3B1IGRhdGEgKi9cXG4rXFx0RkVBVF9QRVJDUFVfREFUQSxcXG4gXFx0X19GRUFUX0NOVCxcXG4gfTtcXG4gXFxuZGlmZiAtLWdpdCBhL3Rvb2xzL2xpYi9icGYvc2tlbF9pbnRlcm5hbC5oIGIvdG9vbHMvbGliL2JwZi9za2VsX2ludGVybmFsLmhcXG5pbmRleCA3NDUwM2QzNThiYzhhNS4uNDg1YjBjZDE3MDE3MzkgMTAwNjQ0XFxuLS0tIGEvdG9vbHMvbGliL2JwZi9za2VsX2ludGVybmFsLmhcXG4rKysgYi90b29scy9saWIvYnBmL3NrZWxfaW50ZXJuYWwuaFxcbkBAIC0xMzUsOCArMTM1LDEwIEBAIHN0YXRpYyBpbmxpbmUgdm9pZCBza2VsX2ZyZWVfbWFwX2RhdGEodm9pZCAqcCwgX191NjQgYWRkciwgc2l6ZV90IHN6KVxcbiB7XFxuIFxcdGlmIChhZGRyICE9IH4wVUxMKVxcbiBcXHRcXHRrdmZyZWUocCk7XFxuLVxcdC8qIFdoZW4gYWRkciA9PSB+MFVMTCB0aGUgJ3AnIHBvaW50cyB0b1xcbi1cXHQgKiAoKHN0cnVjdCBicGZfYXJyYXkgKiltYXApLVxcdTAwM2V2YWx1ZS4gU2VlIHNrZWxfZmluYWxpemVfbWFwX2RhdGEuXFxuK1xcdC8qXFxuK1xcdCAqIFdoZW4gYWRkciA9PSB+MFVMTCB0aGUgaW5pdCBidWZmZXIgaGFzIGFscmVhZHkgYmVlbiByZWxlYXNlZC5cXG4rXFx0ICogRm9yIHNrZWxfZmluYWxpemVfbWFwX2RhdGEoKSwgJ3AnIHBvaW50cyB0b1xcbitcXHQgKiAoKHN0cnVjdCBicGZfYXJyYXkgKiltYXApLVxcdTAwM2V2YWx1ZS5cXG4gXFx0ICovXFxuIH1cXG4gXFxuQEAgLTE3NCw2ICsxNzYsMTUgQEAgc3RhdGljIGlubGluZSB2b2lkICpza2VsX2ZpbmFsaXplX21hcF9kYXRhKF9fdTY0ICppbml0X3ZhbCwgc2l6ZV90IG1tYXBfc3osIGludFxcbiBcXHRyZXR1cm4gYWRkcjtcXG4gfVxcbiBcXG4rc3RhdGljIGlubGluZSBpbnQgc2tlbF9wcm90ZWN0X21hcF9kYXRhKHZvaWQgKnAsIF9fdTY0ICppbml0X3ZhbCwgc2l6ZV90IHN6KVxcbit7XFxuK1xcdCh2b2lkKXN6O1xcbitcXG4rXFx0a3ZmcmVlKHApO1xcbitcXHQqaW5pdF92YWwgPSB+MFVMTDtcXG4rXFx0cmV0dXJuIDA7XFxuK31cXG4rXFxuICNlbHNlXFxuIFxcbiBzdGF0aWMgaW5saW5lIHZvaWQgKnNrZWxfYWxsb2Moc2l6ZV90IHNpemUpXFxuQEAgLTIxMiw2ICsyMjMsMTUgQEAgc3RhdGljIGlubGluZSB2b2lkICpza2VsX2ZpbmFsaXplX21hcF9kYXRhKF9fdTY0ICppbml0X3ZhbCwgc2l6ZV90IG1tYXBfc3osIGludFxcbiBcXHRcXHRyZXR1cm4gTlVMTDtcXG4gXFx0cmV0dXJuIGFkZHI7XFxuIH1cXG4rXFxuK3N0YXRpYyBpbmxpbmUgaW50IHNrZWxfcHJvdGVjdF9tYXBfZGF0YSh2b2lkICpwLCBfX3U2NCAqaW5pdF92YWwsIHNpemVfdCBzeilcXG4re1xcbitcXHQodm9pZClpbml0X3ZhbDtcXG4rXFxuK1xcdGlmIChtcHJvdGVjdChwLCBzeiwgUFJPVF9SRUFEKSlcXG4rXFx0XFx0cmV0dXJuIC1lcnJubztcXG4rXFx0cmV0dXJuIDA7XFxuK31cXG4gI2VuZGlmXFxuIFxcbiBzdGF0aWMgaW5saW5lIGludCBza2VsX2Nsb3NlbnooaW50IGZkKVxcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvTWFrZWZpbGUgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvTWFrZWZpbGVcXG5pbmRleCBiNjQyZWU0ODllYTY0MC4uYzM3ZWQ5ZTdiOTdjZDAgMTAwNjQ0XFxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL01ha2VmaWxlXFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL01ha2VmaWxlXFxuQEAgLTUzMyw3ICs1MzMsNyBAQCBMU0tFTFNfU0lHTkVEIDo9IGZlbnRyeV90ZXN0LmMgZmV4aXRfdGVzdC5jIGF0b21pY3MuY1xcbiBcXG4gIyBHZW5lcmF0ZSBib3RoIGxpZ2h0IHNrZWxldG9uIGFuZCBsaWJicGYgc2tlbGV0b24gZm9yIHRoZXNlXFxuIExTS0VMU19FWFRSQSA6PSB0ZXN0X2tzeW1zX21vZHVsZS5jIHRlc3Rfa3N5bXNfd2Vhay5jIGtmdW5jX2NhbGxfdGVzdC5jIFxcXFxcXG4tXFx0a2Z1bmNfY2FsbF90ZXN0X3N1YnByb2cuY1xcbitcXHRrZnVuY19jYWxsX3Rlc3Rfc3VicHJvZy5jIHRlc3RfZ2xvYmFsX3BlcmNwdV9kYXRhLmNcXG4gU0tFTF9CTEFDS0xJU1QgKz0gJCQoTFNLRUxTKSAkJChMU0tFTFNfU0lHTkVEKVxcbiBcXG4gdGVzdF9zdGF0aWNfbGlua2VkLnNrZWwuaC1kZXBzIDo9IHRlc3Rfc3RhdGljX2xpbmtlZDEuYnBmLm8gdGVzdF9zdGF0aWNfbGlua2VkMi5icGYub1xcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9nbG9iYWxfZGF0YV9pbml0LmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9nbG9iYWxfZGF0YV9pbml0LmNcXG5pbmRleCA4NDY2MzMyZDc0MDZmNC4uYTVkODc3NjhmNmVlMmYgMTAwNjQ0XFxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvZ2xvYmFsX2RhdGFfaW5pdC5jXFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvZ2xvYmFsX2RhdGFfaW5pdC5jXFxuQEAgLTEsNSArMSw4IEBAXFxuIC8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXFxuICNpbmNsdWRlIFxcdTAwM2N0ZXN0X3Byb2dzLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcXCJicGYvbGliYnBmX2ludGVybmFsLmhcXFwiXFxuKyNpbmNsdWRlIFxcXCJ0ZXN0X2dsb2JhbF9wZXJjcHVfZGF0YS5za2VsLmhcXFwiXFxuKyNpbmNsdWRlIFxcXCJ0ZXN0X2dsb2JhbF9wZXJjcHVfZGF0YS5sc2tlbC5oXFxcIlxcbiBcXG4gdm9pZCB0ZXN0X2dsb2JhbF9kYXRhX2luaXQodm9pZClcXG4ge1xcbkBAIC02MCwzICs2MywyOTAgQEAgdm9pZCB0ZXN0X2dsb2JhbF9kYXRhX2luaXQodm9pZClcXG4gXFx0ZnJlZShuZXd2YWwpO1xcbiBcXHRicGZfb2JqZWN0X19jbG9zZShvYmopO1xcbiB9XFxuK1xcbitzdGF0aWMgdm9pZCB0ZXN0X3BlcmNwdV9kYXRhX29uX2NwdXMoaW50IG1hcF9mZCwgaW50IHByb2dfZmQsIGludCBudW1fb25saW5lLCBib29sICpvbmxpbmUpXFxuK3tcXG4rXFx0X191NjQgYXJnc1syXSA9IHsweDEyMzRVTEwsIDB4NTY3OFVMTH07XFxuK1xcdExJQkJQRl9PUFRTKGJwZl90ZXN0X3J1bl9vcHRzLCB0b3B0cyxcXG4rXFx0XFx0ICAgIC5jdHhfaW4gPSBhcmdzLFxcbitcXHRcXHQgICAgLmN0eF9zaXplX2luID0gc2l6ZW9mKGFyZ3MpLFxcbitcXHRcXHQgICAgLmZsYWdzID0gQlBGX0ZfVEVTVF9SVU5fT05fQ1BVLFxcbitcXHQpO1xcbitcXHRpbnQgaSwgZXJyLCBrZXkgPSAwO1xcbitcXG4rXFx0LyogcnVuIG9uIGV2ZXJ5IG9ubGluZS1DUFUgKi9cXG4rXFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIG51bV9vbmxpbmU7IGkrKykge1xcbitcXHRcXHRzdHJ1Y3QgdGVzdF9nbG9iYWxfcGVyY3B1X2RhdGFfX3BlcmNwdSBkYXRhID0ge307XFxuK1xcdFxcdF9fdTY0IGZsYWdzO1xcbitcXG4rXFx0XFx0aWYgKCFvbmxpbmVbaV0pXFxuK1xcdFxcdFxcdGNvbnRpbnVlO1xcbitcXG4rXFx0XFx0dG9wdHMuY3B1ID0gaTtcXG4rXFx0XFx0dG9wdHMucmV0dmFsID0gLTE7XFxuK1xcdFxcdGVyciA9IGJwZl9wcm9nX3Rlc3RfcnVuX29wdHMocHJvZ19mZCwgXFx1MDAyNnRvcHRzKTtcXG4rXFx0XFx0QVNTRVJUX09LKGVyciwgXFxcImJwZl9wcm9nX3Rlc3RfcnVuX29wdHNcXFwiKTtcXG4rXFx0XFx0QVNTRVJUX0VRKHRvcHRzLnJldHZhbCwgMCwgXFxcImJwZl9wcm9nX3Rlc3RfcnVuX29wdHMgcmV0dmFsXFxcIik7XFxuK1xcbitcXHRcXHRmbGFncyA9ICgoX191NjQpIGkgXFx1MDAzY1xcdTAwM2MgMzIpIHwgQlBGX0ZfQ1BVO1xcbitcXHRcXHRlcnIgPSBicGZfbWFwX2xvb2t1cF9lbGVtX2ZsYWdzKG1hcF9mZCwgXFx1MDAyNmtleSwgXFx1MDAyNmRhdGEsIGZsYWdzKTtcXG4rXFx0XFx0aWYgKCFBU1NFUlRfT0soZXJyLCBcXFwiYnBmX21hcF9sb29rdXBfZWxlbV9mbGFnc1xcXCIpKVxcbitcXHRcXHRcXHRyZXR1cm47XFxuK1xcbitcXHRcXHRBU1NFUlRfRVEoZGF0YS5kYXRhLCAxLCBcXFwiZGF0YS5kYXRhXFxcIik7XFxuK1xcdFxcdEFTU0VSVF9UUlVFKGRhdGEucnVuLCBcXFwiZGF0YS5ydW5cXFwiKTtcXG4rXFx0XFx0QVNTRVJUX0VRKGRhdGEubnVtc1s2XSwgMHhjMGRlLCBcXFwiZGF0YS5udW1zWzZdXFxcIik7XFxuK1xcdFxcdEFTU0VSVF9FUShkYXRhLnN0cnVjdF9kYXRhLmksIDEsIFxcXCJzdHJ1Y3RfZGF0YS5pXFxcIik7XFxuK1xcdFxcdEFTU0VSVF9UUlVFKGRhdGEuc3RydWN0X2RhdGEuc2V0LCBcXFwic3RydWN0X2RhdGEuc2V0XFxcIik7XFxuK1xcdFxcdEFTU0VSVF9FUShkYXRhLnN0cnVjdF9kYXRhLm51bXNbNl0sIDB4YzBkZSwgXFxcInN0cnVjdF9kYXRhLm51bXNbNl1cXFwiKTtcXG4rXFx0fVxcbit9XFxuK1xcbitzdGF0aWMgdm9pZCB0ZXN0X2dsb2JhbF9wZXJjcHVfZGF0YV9pbml0KHZvaWQpXFxuK3tcXG4rXFx0c3RydWN0IHRlc3RfZ2xvYmFsX3BlcmNwdV9kYXRhX19wZXJjcHUgaW5pdF92YWx1ZSA9IHt9O1xcbitcXHRzdHJ1Y3QgdGVzdF9nbG9iYWxfcGVyY3B1X2RhdGFfX3BlcmNwdSAqaW5pdF9kYXRhO1xcbitcXHRzdHJ1Y3QgdGVzdF9nbG9iYWxfcGVyY3B1X2RhdGEgKnNrZWwgPSBOVUxMO1xcbitcXHRpbnQgcHJvZ19mZCwgbWFwX2ZkLCBlcnIsIG51bV9vbmxpbmU7XFxuK1xcdHNpemVfdCBpbml0X2RhdGFfc3o7XFxuK1xcdHN0cnVjdCBicGZfbWFwICptYXA7XFxuK1xcdGJvb2wgKm9ubGluZTtcXG4rXFxuK1xcdGVyciA9IHBhcnNlX2NwdV9tYXNrX2ZpbGUoXFxcIi9zeXMvZGV2aWNlcy9zeXN0ZW0vY3B1L29ubGluZVxcXCIsIFxcdTAwMjZvbmxpbmUsIFxcdTAwMjZudW1fb25saW5lKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0soZXJyLCBcXFwicGFyc2VfY3B1X21hc2tfZmlsZVxcXCIpKVxcbitcXHRcXHRyZXR1cm47XFxuK1xcbitcXHRza2VsID0gdGVzdF9nbG9iYWxfcGVyY3B1X2RhdGFfX29wZW4oKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0tfUFRSKHNrZWwsIFxcXCJ0ZXN0X2dsb2JhbF9wZXJjcHVfZGF0YV9fb3BlblxcXCIpKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFx0aWYgKCFBU1NFUlRfT0tfUFRSKHNrZWwtXFx1MDAzZXBlcmNwdSwgXFxcInNrZWwtXFx1MDAzZXBlcmNwdVxcXCIpKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFxuK1xcdEFTU0VSVF9FUShza2VsLVxcdTAwM2VwZXJjcHUtXFx1MDAzZWRhdGEsIC0xLCBcXFwic2tlbC1cXHUwMDNlcGVyY3B1LVxcdTAwM2VkYXRhXFxcIik7XFxuK1xcdEFTU0VSVF9GQUxTRShza2VsLVxcdTAwM2VwZXJjcHUtXFx1MDAzZXJ1biwgXFxcInNrZWwtXFx1MDAzZXBlcmNwdS1cXHUwMDNlcnVuXFxcIik7XFxuK1xcdEFTU0VSVF9FUShza2VsLVxcdTAwM2VwZXJjcHUtXFx1MDAzZW51bXNbNl0sIDAsIFxcXCJza2VsLVxcdTAwM2VwZXJjcHUtXFx1MDAzZW51bXNbNl1cXFwiKTtcXG4rXFx0QVNTRVJUX0VRKHNrZWwtXFx1MDAzZXBlcmNwdS1cXHUwMDNlc3RydWN0X2RhdGEuaSwgLTEsIFxcXCJzdHJ1Y3RfZGF0YS5pXFxcIik7XFxuK1xcdEFTU0VSVF9GQUxTRShza2VsLVxcdTAwM2VwZXJjcHUtXFx1MDAzZXN0cnVjdF9kYXRhLnNldCwgXFxcInN0cnVjdF9kYXRhLnNldFxcXCIpO1xcbitcXHRBU1NFUlRfRVEoc2tlbC1cXHUwMDNlcGVyY3B1LVxcdTAwM2VzdHJ1Y3RfZGF0YS5udW1zWzZdLCAwLCBcXFwic3RydWN0X2RhdGEubnVtc1s2XVxcXCIpO1xcbitcXG4rXFx0bWFwID0gc2tlbC1cXHUwMDNlbWFwcy5wZXJjcHU7XFxuK1xcdGlmICghQVNTRVJUX0VRKGJwZl9tYXBfX3R5cGUobWFwKSwgQlBGX01BUF9UWVBFX1BFUkNQVV9BUlJBWSwgXFxcImJwZl9tYXBfX3R5cGVcXFwiKSlcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcbitcXHRpbml0X3ZhbHVlLmRhdGEgPSAyO1xcbitcXHRpbml0X3ZhbHVlLm51bXNbNl0gPSAtMTtcXG4rXFx0aW5pdF92YWx1ZS5zdHJ1Y3RfZGF0YS5pID0gMjtcXG4rXFx0aW5pdF92YWx1ZS5zdHJ1Y3RfZGF0YS5udW1zWzZdID0gLTE7XFxuK1xcdGVyciA9IGJwZl9tYXBfX3NldF9pbml0aWFsX3ZhbHVlKG1hcCwgXFx1MDAyNmluaXRfdmFsdWUsIHNpemVvZihpbml0X3ZhbHVlKSk7XFxuK1xcdGlmICghQVNTRVJUX09LKGVyciwgXFxcImJwZl9tYXBfX3NldF9pbml0aWFsX3ZhbHVlXFxcIikpXFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXG4rXFx0aW5pdF9kYXRhID0gYnBmX21hcF9faW5pdGlhbF92YWx1ZShtYXAsIFxcdTAwMjZpbml0X2RhdGFfc3opO1xcbitcXHRpZiAoIUFTU0VSVF9PS19QVFIoaW5pdF9kYXRhLCBcXFwiYnBmX21hcF9faW5pdGlhbF92YWx1ZVxcXCIpKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFxuK1xcdEFTU0VSVF9FUShpbml0X2RhdGEtXFx1MDAzZWRhdGEsIGluaXRfdmFsdWUuZGF0YSwgXFxcImluaXRfdmFsdWUgZGF0YVxcXCIpO1xcbitcXHRBU1NFUlRfRVEoaW5pdF9kYXRhLVxcdTAwM2VydW4sIGluaXRfdmFsdWUucnVuLCBcXFwiaW5pdF92YWx1ZSBydW5cXFwiKTtcXG4rXFx0QVNTRVJUX0VRKGluaXRfZGF0YS1cXHUwMDNlc3RydWN0X2RhdGEuaSwgaW5pdF92YWx1ZS5zdHJ1Y3RfZGF0YS5pLCBcXFwiaW5pdF92YWx1ZSBzdHJ1Y3RfZGF0YS5pXFxcIik7XFxuK1xcdEFTU0VSVF9FUShpbml0X2RhdGEtXFx1MDAzZXN0cnVjdF9kYXRhLm51bXNbNl0sIGluaXRfdmFsdWUuc3RydWN0X2RhdGEubnVtc1s2XSxcXG4rXFx0XFx0ICBcXFwiaW5pdF92YWx1ZSBzdHJ1Y3RfZGF0YS5udW1zWzZdXFxcIik7XFxuK1xcdEFTU0VSVF9FUShpbml0X2RhdGFfc3osIHNpemVvZihpbml0X3ZhbHVlKSwgXFxcImluaXRfdmFsdWUgc2l6ZVxcXCIpO1xcbitcXHRBU1NFUlRfRVEoKHZvaWQgKikgaW5pdF9kYXRhLCAodm9pZCAqKSBza2VsLVxcdTAwM2VwZXJjcHUsIFxcXCJza2VsLVxcdTAwM2VwZXJjcHUgZXEgaW5pdF9kYXRhXFxcIik7XFxuK1xcdEFTU0VSVF9FUShza2VsLVxcdTAwM2VwZXJjcHUtXFx1MDAzZWRhdGEsIGluaXRfdmFsdWUuZGF0YSwgXFxcInNrZWwtXFx1MDAzZXBlcmNwdS1cXHUwMDNlZGF0YVxcXCIpO1xcbitcXHRBU1NFUlRfRVEoc2tlbC1cXHUwMDNlcGVyY3B1LVxcdTAwM2VydW4sIGluaXRfdmFsdWUucnVuLCBcXFwic2tlbC1cXHUwMDNlcGVyY3B1LVxcdTAwM2VydW5cXFwiKTtcXG4rXFx0QVNTRVJUX0VRKHNrZWwtXFx1MDAzZXBlcmNwdS1cXHUwMDNlc3RydWN0X2RhdGEuaSwgaW5pdF92YWx1ZS5zdHJ1Y3RfZGF0YS5pLFxcbitcXHRcXHQgIFxcXCJza2VsLVxcdTAwM2VwZXJjcHUtXFx1MDAzZXN0cnVjdF9kYXRhLmlcXFwiKTtcXG4rXFx0QVNTRVJUX0VRKHNrZWwtXFx1MDAzZXBlcmNwdS1cXHUwMDNlc3RydWN0X2RhdGEubnVtc1s2XSwgaW5pdF92YWx1ZS5zdHJ1Y3RfZGF0YS5udW1zWzZdLFxcbitcXHRcXHQgIFxcXCJza2VsLVxcdTAwM2VwZXJjcHUtXFx1MDAzZXN0cnVjdF9kYXRhLm51bXNbNl1cXFwiKTtcXG4rXFxuK1xcdGVyciA9IHRlc3RfZ2xvYmFsX3BlcmNwdV9kYXRhX19sb2FkKHNrZWwpO1xcbitcXHRpZiAoIUFTU0VSVF9PSyhlcnIsIFxcXCJ0ZXN0X2dsb2JhbF9wZXJjcHVfZGF0YV9fbG9hZFxcXCIpKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFxuK1xcdEFTU0VSVF9PS19QVFIoc2tlbC1cXHUwMDNlcGVyY3B1LCBcXFwic2tlbC1cXHUwMDNlcGVyY3B1XFxcIik7XFxuK1xcbitcXHRtYXBfZmQgPSBicGZfbWFwX19mZChtYXApO1xcbitcXHRwcm9nX2ZkID0gYnBmX3Byb2dyYW1fX2ZkKHNrZWwtXFx1MDAzZXByb2dzLnVwZGF0ZV9wZXJjcHVfZGF0YSk7XFxuK1xcdHRlc3RfcGVyY3B1X2RhdGFfb25fY3B1cyhtYXBfZmQsIHByb2dfZmQsIG51bV9vbmxpbmUsIG9ubGluZSk7XFxuK1xcbitvdXQ6XFxuK1xcdHRlc3RfZ2xvYmFsX3BlcmNwdV9kYXRhX19kZXN0cm95KHNrZWwpO1xcbitcXHRmcmVlKG9ubGluZSk7XFxuK31cXG4rXFxuK3N0YXRpYyB2b2lkIHRlc3RfZ2xvYmFsX3BlcmNwdV9kYXRhX2xza2VsKHZvaWQpXFxuK3tcXG4rXFx0c3RydWN0IHRlc3RfZ2xvYmFsX3BlcmNwdV9kYXRhX2xza2VsICpsc2tlbCA9IE5VTEw7XFxuK1xcdGludCBwcm9nX2ZkLCBtYXBfZmQsIGVyciwgbnVtX29ubGluZTtcXG4rXFx0Ym9vbCAqb25saW5lO1xcbitcXG4rXFx0ZXJyID0gcGFyc2VfY3B1X21hc2tfZmlsZShcXFwiL3N5cy9kZXZpY2VzL3N5c3RlbS9jcHUvb25saW5lXFxcIiwgXFx1MDAyNm9ubGluZSwgXFx1MDAyNm51bV9vbmxpbmUpO1xcbitcXHRpZiAoIUFTU0VSVF9PSyhlcnIsIFxcXCJwYXJzZV9jcHVfbWFza19maWxlXFxcIikpXFxuK1xcdFxcdHJldHVybjtcXG4rXFxuK1xcdGxza2VsID0gdGVzdF9nbG9iYWxfcGVyY3B1X2RhdGFfbHNrZWxfX29wZW5fYW5kX2xvYWQoKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0tfUFRSKGxza2VsLCBcXFwidGVzdF9nbG9iYWxfcGVyY3B1X2RhdGFfbHNrZWxfX29wZW5fYW5kX2xvYWRcXFwiKSlcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcbitcXHRtYXBfZmQgPSBsc2tlbC1cXHUwMDNlbWFwcy5wZXJjcHUubWFwX2ZkO1xcbitcXHRwcm9nX2ZkID0gbHNrZWwtXFx1MDAzZXByb2dzLnVwZGF0ZV9wZXJjcHVfZGF0YS5wcm9nX2ZkO1xcbitcXHR0ZXN0X3BlcmNwdV9kYXRhX29uX2NwdXMobWFwX2ZkLCBwcm9nX2ZkLCBudW1fb25saW5lLCBvbmxpbmUpO1xcbitcXG4rb3V0OlxcbitcXHR0ZXN0X2dsb2JhbF9wZXJjcHVfZGF0YV9sc2tlbF9fZGVzdHJveShsc2tlbCk7XFxuK1xcdGZyZWUob25saW5lKTtcXG4rfVxcbitcXG4rc3RhdGljIGludCBjcmVhdGVfcmRvbmx5X3BlcmNwdV9hcnJheSh2b2lkKVxcbit7XFxuK1xcdExJQkJQRl9PUFRTKGJwZl9tYXBfY3JlYXRlX29wdHMsIG1hcF9vcHRzLFxcbitcXHRcXHQgICAgLm1hcF9mbGFncyA9IEJQRl9GX1JET05MWV9QUk9HLFxcbitcXHQpO1xcbitcXHRpbnQga2V5ID0gMCwgbWFwX2ZkLCBlcnI7XFxuK1xcdF9fdTY0IHZhbHVlID0gMDtcXG4rXFxuK1xcdG1hcF9mZCA9IGJwZl9tYXBfY3JlYXRlKEJQRl9NQVBfVFlQRV9QRVJDUFVfQVJSQVksIFxcXCJwZXJjcHVfcm9fbWFwXFxcIiwgc2l6ZW9mKGludCksXFxuK1xcdFxcdFxcdFxcdHNpemVvZihfX3U2NCksIDEsIFxcdTAwMjZtYXBfb3B0cyk7XFxuK1xcdGlmICghQVNTRVJUX0dFKG1hcF9mZCwgMCwgXFxcImJwZl9tYXBfY3JlYXRlXFxcIikpXFxuK1xcdFxcdHJldHVybiAtMTtcXG4rXFxuK1xcdGVyciA9IGJwZl9tYXBfdXBkYXRlX2VsZW0obWFwX2ZkLCBcXHUwMDI2a2V5LCBcXHUwMDI2dmFsdWUsIEJQRl9GX0FMTF9DUFVTKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0soZXJyLCBcXFwiYnBmX21hcF91cGRhdGVfZWxlbVxcXCIpKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFxuK1xcdGVyciA9IGJwZl9tYXBfZnJlZXplKG1hcF9mZCk7XFxuK1xcdGlmICghQVNTRVJUX09LKGVyciwgXFxcImJwZl9tYXBfZnJlZXplXFxcIikpXFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXG4rXFx0cmV0dXJuIG1hcF9mZDtcXG4rXFxuK291dDpcXG4rXFx0Y2xvc2UobWFwX2ZkKTtcXG4rXFx0cmV0dXJuIC0xO1xcbit9XFxuK1xcbitzdGF0aWMgdm9pZCB0ZXN0X2dsb2JhbF9wZXJjcHVfZGF0YV9yZG9ubHlfZGlyZWN0X3JlYWQodm9pZClcXG4re1xcbitcXHRzdHJ1Y3QgYnBmX2luc24gaW5zbnNbXSA9IHtcXG4rXFx0XFx0QlBGX0xEX01BUF9WQUxVRShCUEZfUkVHXzEsIDAsIDApLFxcbitcXHRcXHRCUEZfTERYX01FTShCUEZfRFcsIEJQRl9SRUdfMCwgQlBGX1JFR18xLCAwKSxcXG4rXFx0XFx0QlBGX0VYSVRfSU5TTigpLFxcbitcXHR9O1xcbitcXHRpbnQgbWFwX2ZkLCBwcm9nX2ZkO1xcbitcXG4rXFx0bWFwX2ZkID0gY3JlYXRlX3Jkb25seV9wZXJjcHVfYXJyYXkoKTtcXG4rXFx0aWYgKG1hcF9mZCBcXHUwMDNjIDApXFxuK1xcdFxcdHJldHVybjtcXG4rXFxuK1xcdGluc25zWzBdLmltbSA9IG1hcF9mZDtcXG4rXFx0cHJvZ19mZCA9IGJwZl9wcm9nX2xvYWQoQlBGX1BST0dfVFlQRV9TT0NLRVRfRklMVEVSLCBcXFwicGVyY3B1X3JvX3Byb2dcXFwiLCBcXFwiR1BMXFxcIiwgaW5zbnMsXFxuK1xcdFxcdFxcdFxcdEFSUkFZX1NJWkUoaW5zbnMpLCBOVUxMKTtcXG4rXFx0aWYgKEFTU0VSVF9HRShwcm9nX2ZkLCAwLCBcXFwiYnBmX3Byb2dfbG9hZFxcXCIpKVxcbitcXHRcXHRjbG9zZShwcm9nX2ZkKTtcXG4rXFx0Y2xvc2UobWFwX2ZkKTtcXG4rfVxcbitcXG4rc3RhdGljIHZvaWQgdGVzdF9nbG9iYWxfcGVyY3B1X2RhdGFfcmRvbmx5X2RpcmVjdF93cml0ZSh2b2lkKVxcbit7XFxuK1xcdExJQkJQRl9PUFRTKGJwZl9wcm9nX2xvYWRfb3B0cywgcHJvZ19vcHRzKTtcXG4rXFx0c3RydWN0IGJwZl9pbnNuIGluc25zW10gPSB7XFxuK1xcdFxcdEJQRl9MRF9NQVBfVkFMVUUoQlBGX1JFR18xLCAwLCAwKSxcXG4rXFx0XFx0QlBGX0xEWF9NRU0oQlBGX0RXLCBCUEZfUkVHXzAsIEJQRl9SRUdfMSwgMCksXFxuK1xcdFxcdEJQRl9TVF9NRU0oQlBGX0RXLCBCUEZfUkVHXzEsIDAsIDApLFxcbitcXHRcXHRCUEZfRVhJVF9JTlNOKCksXFxuK1xcdH07XFxuK1xcdGNoYXIgbG9nX2J1ZlsyNTZdID0ge307XFxuK1xcdGludCBtYXBfZmQsIHByb2dfZmQ7XFxuK1xcbitcXHRwcm9nX29wdHMubG9nX2J1ZiA9IGxvZ19idWY7XFxuK1xcdHByb2dfb3B0cy5sb2dfc2l6ZSA9IHNpemVvZihsb2dfYnVmKTtcXG4rXFx0cHJvZ19vcHRzLmxvZ19sZXZlbCA9IDE7XFxuK1xcbitcXHRtYXBfZmQgPSBjcmVhdGVfcmRvbmx5X3BlcmNwdV9hcnJheSgpO1xcbitcXHRpZiAobWFwX2ZkIFxcdTAwM2MgMClcXG4rXFx0XFx0cmV0dXJuO1xcbitcXG4rXFx0aW5zbnNbMF0uaW1tID0gbWFwX2ZkO1xcbitcXHRwcm9nX2ZkID0gYnBmX3Byb2dfbG9hZChCUEZfUFJPR19UWVBFX1NPQ0tFVF9GSUxURVIsIFxcXCJwZXJjcHVfcm9fcHJvZ1xcXCIsIFxcXCJHUExcXFwiLCBpbnNucyxcXG4rXFx0XFx0XFx0XFx0QVJSQVlfU0laRShpbnNucyksIFxcdTAwMjZwcm9nX29wdHMpO1xcbitcXHRpZiAoIUFTU0VSVF9MVChwcm9nX2ZkLCAwLCBcXFwiYnBmX3Byb2dfbG9hZFxcXCIpKVxcbitcXHRcXHRjbG9zZShwcm9nX2ZkKTtcXG4rXFx0ZWxzZVxcbitcXHRcXHRBU1NFUlRfSEFTX1NVQlNUUihsb2dfYnVmLCBcXFwid3JpdGUgaW50byBtYXAgZm9yYmlkZGVuXFxcIiwgXFxcInZlcmlmaWVyIGxvZ1xcXCIpO1xcbitcXHRjbG9zZShtYXBfZmQpO1xcbit9XFxuK1xcbitzdGF0aWMgdm9pZCB0ZXN0X2dsb2JhbF9wZXJjcHVfZGF0YV92ZXJpZmllcl9sb2codm9pZClcXG4re1xcbitcXHRSVU5fVEVTVFModGVzdF9nbG9iYWxfcGVyY3B1X2RhdGEpO1xcbit9XFxuK1xcbitzdGF0aWMgdm9pZCB0ZXN0X2dsb2JhbF9wZXJjcHVfZGF0YV9pdGVyKHZvaWQpXFxuK3tcXG4rXFx0REVDTEFSRV9MSUJCUEZfT1BUUyhicGZfaXRlcl9hdHRhY2hfb3B0cywgb3B0cyk7XFxuK1xcdHN0cnVjdCB0ZXN0X2dsb2JhbF9wZXJjcHVfZGF0YSAqc2tlbDtcXG4rXFx0dW5pb24gYnBmX2l0ZXJfbGlua19pbmZvIGxpbmZvID0ge307XFxuK1xcdHN0cnVjdCBicGZfbGluayAqbGluayA9IE5VTEw7XFxuK1xcdGludCBmZCwgbnVtX2NwdXMsIGxlbiwgZXJyO1xcbitcXHRjaGFyIGJ1ZlsxNl07XFxuK1xcbitcXHRudW1fY3B1cyA9IGxpYmJwZl9udW1fcG9zc2libGVfY3B1cygpO1xcbitcXHRpZiAoIUFTU0VSVF9HVChudW1fY3B1cywgMCwgXFxcImxpYmJwZl9udW1fcG9zc2libGVfY3B1c1xcXCIpKVxcbitcXHRcXHRyZXR1cm47XFxuK1xcbitcXHRza2VsID0gdGVzdF9nbG9iYWxfcGVyY3B1X2RhdGFfX29wZW4oKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0tfUFRSKHNrZWwsIFxcXCJ0ZXN0X2dsb2JhbF9wZXJjcHVfZGF0YV9fb3BlblxcXCIpKVxcbitcXHRcXHRyZXR1cm47XFxuK1xcbitcXHRza2VsLVxcdTAwM2Vyb2RhdGEtXFx1MDAzZW51bV9jcHVzID0gbnVtX2NwdXM7XFxuK1xcdHNrZWwtXFx1MDAzZXJvZGF0YS1cXHUwMDNlb2Zmc2V0b2ZfbnVtID0gb2Zmc2V0b2Yoc3RydWN0IHRlc3RfZ2xvYmFsX3BlcmNwdV9kYXRhX19wZXJjcHUsIHN0cnVjdF9kYXRhKTtcXG4rXFx0c2tlbC1cXHUwMDNlcm9kYXRhLVxcdTAwM2VvZmZzZXRvZl9udW0gKz0gc2l6ZW9mKHNrZWwtXFx1MDAzZXBlcmNwdS1cXHUwMDNlc3RydWN0X2RhdGEpIC0gc2l6ZW9mKGludCk7XFxuK1xcdHNrZWwtXFx1MDAzZXJvZGF0YS1cXHUwMDNlZWxlbV9zeiA9IHJvdW5kdXAoc2l6ZW9mKHN0cnVjdCB0ZXN0X2dsb2JhbF9wZXJjcHVfZGF0YV9fcGVyY3B1KSwgOCk7XFxuK1xcdHNrZWwtXFx1MDAzZXBlcmNwdS1cXHUwMDNlc3RydWN0X2RhdGEubnVtc1s2XSA9IDB4YzBkZTtcXG4rXFxuK1xcdGVyciA9IHRlc3RfZ2xvYmFsX3BlcmNwdV9kYXRhX19sb2FkKHNrZWwpO1xcbitcXHRpZiAoIUFTU0VSVF9PSyhlcnIsIFxcXCJ0ZXN0X2dsb2JhbF9wZXJjcHVfZGF0YV9fbG9hZFxcXCIpKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFxuK1xcdGxpbmZvLm1hcC5tYXBfZmQgPSBicGZfbWFwX19mZChza2VsLVxcdTAwM2VtYXBzLnBlcmNwdSk7XFxuK1xcdG9wdHMubGlua19pbmZvID0gXFx1MDAyNmxpbmZvO1xcbitcXHRvcHRzLmxpbmtfaW5mb19sZW4gPSBzaXplb2YobGluZm8pO1xcbitcXHRsaW5rID0gYnBmX3Byb2dyYW1fX2F0dGFjaF9pdGVyKHNrZWwtXFx1MDAzZXByb2dzLmR1bXBfcGVyY3B1X2RhdGEsIFxcdTAwMjZvcHRzKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0tfUFRSKGxpbmssIFxcXCJicGZfcHJvZ3JhbV9fYXR0YWNoX2l0ZXJcXFwiKSlcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcbitcXHRmZCA9IGJwZl9pdGVyX2NyZWF0ZShicGZfbGlua19fZmQobGluaykpO1xcbitcXHRpZiAoIUFTU0VSVF9HRShmZCwgMCwgXFxcImJwZl9pdGVyX2NyZWF0ZVxcXCIpKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFxuK1xcdHdoaWxlICgobGVuID0gcmVhZChmZCwgYnVmLCBzaXplb2YoYnVmKSkpIFxcdTAwM2UgMClcXG4rXFx0XFx0ZG8geyB9IHdoaWxlICgwKTtcXG4rXFx0QVNTRVJUX0VRKGxlbiwgMCwgXFxcInJlYWQgaXRlclxcXCIpO1xcbitcXHRBU1NFUlRfVFJVRShza2VsLVxcdTAwM2Vic3MtXFx1MDAzZXJ1bl9pdGVyLCBcXFwicnVuX2l0ZXJcXFwiKTtcXG4rXFx0QVNTRVJUX0VRKHNrZWwtXFx1MDAzZWJzcy1cXHUwMDNlcGVyY3B1X2RhdGFfc3VtLCAweGMwZGUgKiBudW1fY3B1cywgXFxcInBlcmNwdV9kYXRhX3N1bVxcXCIpO1xcbitcXG4rXFx0Y2xvc2UoZmQpO1xcbitvdXQ6XFxuK1xcdGJwZl9saW5rX19kZXN0cm95KGxpbmspO1xcbitcXHR0ZXN0X2dsb2JhbF9wZXJjcHVfZGF0YV9fZGVzdHJveShza2VsKTtcXG4rfVxcbitcXG4rdm9pZCB0ZXN0X2dsb2JhbF9wZXJjcHVfZGF0YSh2b2lkKVxcbit7XFxuK1xcdGlmICghZmVhdF9zdXBwb3J0ZWQoTlVMTCwgRkVBVF9QRVJDUFVfREFUQSkpIHtcXG4rXFx0XFx0dGVzdF9fc2tpcCgpO1xcbitcXHRcXHRyZXR1cm47XFxuK1xcdH1cXG4rXFxuK1xcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFxcXCJpbml0XFxcIikpXFxuK1xcdFxcdHRlc3RfZ2xvYmFsX3BlcmNwdV9kYXRhX2luaXQoKTtcXG4rXFx0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXFxcImxza2VsXFxcIikpXFxuK1xcdFxcdHRlc3RfZ2xvYmFsX3BlcmNwdV9kYXRhX2xza2VsKCk7XFxuK1xcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFxcXCJyZG9ubHlfZGlyZWN0X3JlYWRcXFwiKSlcXG4rXFx0XFx0dGVzdF9nbG9iYWxfcGVyY3B1X2RhdGFfcmRvbmx5X2RpcmVjdF9yZWFkKCk7XFxuK1xcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFxcXCJyZG9ubHlfZGlyZWN0X3dyaXRlXFxcIikpXFxuK1xcdFxcdHRlc3RfZ2xvYmFsX3BlcmNwdV9kYXRhX3Jkb25seV9kaXJlY3Rfd3JpdGUoKTtcXG4rXFx0dGVzdF9nbG9iYWxfcGVyY3B1X2RhdGFfdmVyaWZpZXJfbG9nKCk7XFxuK1xcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFxcXCJpdGVyXFxcIikpXFxuK1xcdFxcdHRlc3RfZ2xvYmFsX3BlcmNwdV9kYXRhX2l0ZXIoKTtcXG4rfVxcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9nbG9iYWxfcGVyY3B1X3N1YnNrZWwuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2dsb2JhbF9wZXJjcHVfc3Vic2tlbC5jXFxubmV3IGZpbGUgbW9kZSAxMDA2NDRcXG5pbmRleCAwMDAwMDAwMDAwMDAwMC4uOGFlYmQ1MzNkODZiNTRcXG4tLS0gL2Rldi9udWxsXFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvZ2xvYmFsX3BlcmNwdV9zdWJza2VsLmNcXG5AQCAtMCwwICsxLDM3IEBAXFxuKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXFxuKyNpbmNsdWRlIFxcdTAwM2N0ZXN0X3Byb2dzLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcXCJ0ZXN0X2dsb2JhbF9wZXJjcHVfZGF0YS5zdWJza2VsLmhcXFwiXFxuK1xcbit2b2lkIHRlc3RfZ2xvYmFsX3BlcmNwdV9kYXRhX3N1YnNrZWwodm9pZClcXG4re1xcbitcXHRzdHJ1Y3QgdGVzdF9nbG9iYWxfcGVyY3B1X2RhdGEgKnN1YnNrZWwgPSBOVUxMO1xcbitcXHRzdHJ1Y3QgYnBmX29iamVjdCAqb2JqO1xcbitcXHRpbnQgaTtcXG4rXFxuK1xcdG9iaiA9IGJwZl9vYmplY3RfX29wZW5fZmlsZShcXFwiLi90ZXN0X2dsb2JhbF9wZXJjcHVfZGF0YS5icGYub1xcXCIsIE5VTEwpO1xcbitcXHRpZiAoIUFTU0VSVF9PS19QVFIob2JqLCBcXFwiYnBmX29iamVjdF9fb3Blbl9maWxlXFxcIikpXFxuK1xcdFxcdHJldHVybjtcXG4rXFxuK1xcdHN1YnNrZWwgPSB0ZXN0X2dsb2JhbF9wZXJjcHVfZGF0YV9fb3BlbihvYmopO1xcbitcXHRpZiAoIUFTU0VSVF9PS19QVFIoc3Vic2tlbCwgXFxcInRlc3RfZ2xvYmFsX3BlcmNwdV9kYXRhX19vcGVuXFxcIikpXFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXG4rXFx0aWYgKCFBU1NFUlRfT0tfUFRSKHN1YnNrZWwtXFx1MDAzZXN1YnNrZWwsIFxcXCJzdWJza2VsXFxcIikpXFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXHRpZiAoIUFTU0VSVF9PS19QVFIoc3Vic2tlbC1cXHUwMDNlbWFwcy5wZXJjcHUsIFxcXCJtYXBzLnBlcmNwdVxcXCIpKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFx0QVNTRVJUX0VRKGJwZl9tYXBfX3R5cGUoc3Vic2tlbC1cXHUwMDNlbWFwcy5wZXJjcHUpLCBCUEZfTUFQX1RZUEVfUEVSQ1BVX0FSUkFZLFxcbitcXHRcXHQgIFxcXCJwZXJjcHVfbWFwX3R5cGVcXFwiKTtcXG4rXFx0QVNTRVJUX0dUKHN1YnNrZWwtXFx1MDAzZXN1YnNrZWwtXFx1MDAzZXZhcl9jbnQsIDAsIFxcXCJ2YXJfY250XFxcIik7XFxuK1xcbitcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2Mgc3Vic2tlbC1cXHUwMDNlc3Vic2tlbC1cXHUwMDNldmFyX2NudDsgaSsrKSB7XFxuK1xcdFxcdGNvbnN0IHN0cnVjdCBicGZfdmFyX3NrZWxldG9uICp2YXI7XFxuK1xcbitcXHRcXHR2YXIgPSAodm9pZCAqKSBzdWJza2VsLVxcdTAwM2VzdWJza2VsLVxcdTAwM2V2YXJzICsgaSAqIHN1YnNrZWwtXFx1MDAzZXN1YnNrZWwtXFx1MDAzZXZhcl9za2VsX3N6O1xcbitcXHRcXHRBU1NFUlRfTkVRKHZhci1cXHUwMDNlbWFwLCBcXHUwMDI2c3Vic2tlbC1cXHUwMDNlbWFwcy5wZXJjcHUsIFxcXCJ2YXJcXFwiKTtcXG4rXFx0fVxcbitcXG4rb3V0OlxcbitcXHR0ZXN0X2dsb2JhbF9wZXJjcHVfZGF0YV9fZGVzdHJveShzdWJza2VsKTtcXG4rXFx0YnBmX29iamVjdF9fY2xvc2Uob2JqKTtcXG4rfVxcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvdGVzdF9nbG9iYWxfcGVyY3B1X2RhdGEuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy90ZXN0X2dsb2JhbF9wZXJjcHVfZGF0YS5jXFxubmV3IGZpbGUgbW9kZSAxMDA2NDRcXG5pbmRleCAwMDAwMDAwMDAwMDAwMC4uZWVmODhmZDYxYWY1MTFcXG4tLS0gL2Rldi9udWxsXFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL3Rlc3RfZ2xvYmFsX3BlcmNwdV9kYXRhLmNcXG5AQCAtMCwwICsxLDc5IEBAXFxuKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXFxuKyNpbmNsdWRlIFxcdTAwM2N2bWxpbnV4LmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NicGYvYnBmX2hlbHBlcnMuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFxcImJwZl9taXNjLmhcXFwiXFxuK1xcbitpbnQgZGF0YSBTRUMoXFxcIi5wZXJjcHVcXFwiKSA9IC0xO1xcbitpbnQgbnVtc1s3XSBTRUMoXFxcIi5wZXJjcHVcXFwiKTtcXG4rY2hhciBydW4gU0VDKFxcXCIucGVyY3B1XFxcIikgPSAwO1xcbitzdHJ1Y3Qge1xcbitcXHRjaGFyIHNldDtcXG4rXFx0aW50IGk7XFxuK1xcdGludCBudW1zWzddO1xcbit9IHN0cnVjdF9kYXRhIFNFQyhcXFwiLnBlcmNwdVxcXCIpID0ge1xcbitcXHQuc2V0ID0gMCxcXG4rXFx0LmkgPSAtMSxcXG4rfTtcXG4rXFxuK1NFQyhcXFwicmF3X3RwL3Rhc2tfcmVuYW1lXFxcIilcXG4rX19hdXhpbGlhcnlcXG4raW50IHVwZGF0ZV9wZXJjcHVfZGF0YSh2b2lkICpjdHgpXFxuK3tcXG4rXFx0c3RydWN0X2RhdGEubnVtc1s2XSA9IDB4YzBkZTtcXG4rXFx0c3RydWN0X2RhdGEuc2V0ID0gMTtcXG4rXFx0c3RydWN0X2RhdGEuaSA9IDE7XFxuK1xcdG51bXNbNl0gPSAweGMwZGU7XFxuK1xcdGRhdGEgPSAxO1xcbitcXHRydW4gPSAxO1xcbitcXHRyZXR1cm4gMDtcXG4rfVxcbitcXG4rc3RhdGljIGNvbnN0IGNoYXIgZm10W10gU0VDKFxcXCIucGVyY3B1LmZtdFxcXCIpID0gXFxcImRhdGEgJWRcXFxcblxcXCI7XFxuK1xcbitTRUMoXFxcIj9rcHJvYmVcXFwiKVxcbitfX2ZhaWx1cmUgX19tc2coXFxcIlJ7e1swLTldK319IHBvaW50cyB0byBwZXJjcHVfYXJyYXkgbWFwIHdoaWNoIGNhbm5vdCBiZSB1c2VkIGFzIGNvbnN0IHN0cmluZ1xcXCIpXFxuK2ludCB2ZXJpZmllcl9zdHJuY21wKHZvaWQgKmN0eClcXG4re1xcbitcXHRyZXR1cm4gYnBmX3N0cm5jbXAoXFxcInRlc3RcXFwiLCA1LCBmbXQpO1xcbit9XFxuK1xcbitTRUMoXFxcIj9rcHJvYmVcXFwiKVxcbitfX2ZhaWx1cmUgX19tc2coXFxcIlJ7e1swLTldK319IHBvaW50cyB0byBwZXJjcHVfYXJyYXkgbWFwIHdoaWNoIGNhbm5vdCBiZSB1c2VkIGFzIGNvbnN0IHN0cmluZ1xcXCIpXFxuK2ludCB2ZXJpZmllcl9zbnByaW50Zih2b2lkICpjdHgpXFxuK3tcXG4rXFx0dTY0IGFyZ3NbXSA9IHsgZGF0YSB9O1xcbitcXHRjaGFyIGJ1ZlsxMjhdO1xcbitcXHRpbnQgbGVuO1xcbitcXG4rXFx0bGVuID0gYnBmX3NucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksIGZtdCwgYXJncywgc2l6ZW9mKGFyZ3MpKTtcXG4rXFx0aWYgKGxlbiBcXHUwMDNlIDApXFxuK1xcdFxcdGJwZl9wcmludGsoXFxcInNucHJpbnRmOiAlc1xcXFxuXFxcIiwgYnVmKTtcXG4rXFx0cmV0dXJuIDA7XFxuK31cXG4rXFxuK3ZvbGF0aWxlIGNvbnN0IF9fdTMyIG51bV9jcHVzID0gMDtcXG4rdm9sYXRpbGUgY29uc3QgaW50IG9mZnNldG9mX251bTtcXG4rdm9sYXRpbGUgY29uc3QgaW50IGVsZW1fc3o7XFxuK19fdTMyIHBlcmNwdV9kYXRhX3N1bSA9IDA7XFxuK2Jvb2wgcnVuX2l0ZXIgPSBmYWxzZTtcXG4rXFxuK1NFQyhcXFwiaXRlci9icGZfbWFwX2VsZW1cXFwiKVxcbitfX2F1eGlsaWFyeVxcbitpbnQgZHVtcF9wZXJjcHVfZGF0YShzdHJ1Y3QgYnBmX2l0ZXJfX2JwZl9tYXBfZWxlbSAqY3R4KVxcbit7XFxuK1xcdHZvaWQgKnBwdHIgPSBjdHgtXFx1MDAzZXZhbHVlO1xcbitcXHRpbnQgaTtcXG4rXFxuK1xcdGlmICghcHB0cilcXG4rXFx0XFx0cmV0dXJuIDA7XFxuK1xcbitcXHRydW5faXRlciA9IHRydWU7XFxuK1xcbitcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgbnVtX2NwdXM7IGkrKykge1xcbitcXHRcXHRwZXJjcHVfZGF0YV9zdW0gKz0gKihpbnQgKikgKHBwdHIgKyBvZmZzZXRvZl9udW0pO1xcbitcXHRcXHRwcHRyICs9IGVsZW1fc3o7XFxuK1xcdH1cXG4rXFx0cmV0dXJuIDA7XFxuK31cXG4rXFxuK2NoYXIgX2xpY2Vuc2VbXSBTRUMoXFxcImxpY2Vuc2VcXFwiKSA9IFxcXCJHUExcXFwiO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wNi0yOVQxNjozOTozMS43MTk3MDE3OTNaIiwiU2VxIjoyLCJOZXN0aW5nIjoxLCJUeXBlIjoiYWdlbnQiLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjI5NjIyODAxMjk0LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIkJQRl9TWVNDQUxMXCIsXG4gICAgXCJCUEZfSklUXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwicGVyY3B1X2FycmF5X21hcF9kaXJlY3RfdmFsdWVfYWRkclwiLFxuICAgIFwicGVyY3B1X2FycmF5X21hcF9kaXJlY3RfdmFsdWVfbWV0YVwiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGludHJvZHVjZXMgc3VwcG9ydCBmb3IgYC5wZXJjcHVgIGdsb2JhbCBkYXRhIG1hcHMgaW4gQlBGLCB3aGljaCB0cmFuc2xhdGVzIHRvIGBCUEZfTUFQX1RZUEVfUEVSQ1BVX0FSUkFZYC4gSXQgYWRkcyBuZXcgbWFwIG9wZXJhdGlvbnMgYG1hcF9kaXJlY3RfdmFsdWVfYWRkcmAgYW5kIGBtYXBfZGlyZWN0X3ZhbHVlX21ldGFgIGZvciBwZXJjcHUgYXJyYXlzLCBhbmQgbW9kaWZpZXMgdGhlIHZlcmlmaWVyIHRvIGhhbmRsZSBwZXJjcHUgYXJyYXkgYWNjZXNzZXMgYW5kIHBhdGNoIGluc3RydWN0aW9ucyBmb3IgSklULiBUaGlzIGlzIGEgZnVuY3Rpb25hbCBjaGFuZ2UgaW4gdGhlIGNvcmUgQlBGIHN1YnN5c3RlbSBhbmQgc2hvdWxkIGJlIGZ1enplZC5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiWW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIG1haW50YWluZXIuXG5Zb3VyIGpvYiBpcyB0byByZXZpZXcgYSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kIGRldGVybWluZVxuaWYgaXQgbWFrZXMgZnVuY3Rpb25hbCBjaGFuZ2VzIHRvIHRoZSBrZXJuZWwgdGhhdCBzaG91bGQgYmUgZnV6emVkLlxuXG5JTVBPUlRBTlQ6IFRoZSBjaGFuZ2VzIGhhdmUgQUxSRUFEWSBiZWVuIGFwcGxpZWQgYW5kIGNvbW1pdHRlZCBhcyB0aGUgSEVBRCBjb21taXQgaW5cbnlvdXIgd29ya3NwYWNlLiBEbyBOT1QgcmVseSBvbiB5b3VyIGludGVybmFsIGtub3dsZWRnZSBvZiB0aGUga2VybmVsLiBZb3UgbXVzdCBhY3RpdmVseVxudXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gZXhhbWluZSB0aGUgYWN0dWFsIHNvdXJjZSBjb2RlIGFuZCBjb25maXJtIGFueSBhc3N1bXB0aW9ucy5cblxuUmV0dXJuIFdvcnRoRnV6emluZz1mYWxzZSBpZiB0aGUgcGF0Y2ggb25seSBjb250YWluczpcbi0gTW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLywgS2NvbmZpZyBmaWxlcywgb3IgY29kZSBjb21tZW50cy5cbi0gUHVyZWx5IGRlY29yYXRpdmUgY2hhbmdlcywgc3VjaCBhcyBsb2dnaW5nIChlLmcuLCBwcl9lcnIsIHByaW50aykgb3IgdHJhY2Vwb2ludHMuXG4tIENoYW5nZXMgdG8gbnVtZXJpYyBjb25zdGFudHMgb3IgbWFjcm9zIHRoYXQgZG8gbm90IGZ1bmN0aW9uYWxseSBhbHRlciBleGVjdXRpb24gZmxvdy5cbi0gQ29kZSBwYXRocyB0aGF0IGFyZSBpbXBvc3NpYmxlIHRvIHJlYWNoIGluIHZpcnR1YWxpemVkIGVudmlyb25tZW50cyBsaWtlIEdDRSBvciBRRU1VLFxuZXZlbiB3aGVuIHV0aWxpemluZyBzb2Z0d2FyZS1lbXVsYXRlZCBoYXJkd2FyZSAoZS5nLiwgdXNiIGdhZGdldCwgbWFjODAyMTFfaHdzaW0pLlxuXG5JZiBpdCBtb2RpZmllcyByZWFjaGFibGUgY29yZSBrZXJuZWwgbG9naWMsIGRyaXZlcnMsIG9yIGFyY2hpdGVjdHVyZXMsIHVzZSB5b3VyIGNvZGUgc2VhcmNoXG50b29scyB0byB2ZXJpZnkgdGhlIGNvZGUgY2FuIGJlIGV4ZWN1dGVkLCB0aGVuIHJldHVybiBXb3J0aEZ1enppbmc9dHJ1ZS5cblxuV2hlbiByZXR1cm5pbmcgV29ydGhGdXp6aW5nPXRydWUsIHlvdSBNVVNUIEFMU086XG4xLiBFeHRyYWN0IGFueSBzcGVjaWZpYyBrZXJuZWwgZnVuY3Rpb25zIHRoYXQgc2hvdWxkIGJlIGhlYXZpbHkgZnV6emVkIGludG8gRm9jdXNTeW1ib2xzLlxuICAgQXZvaWQgbGlzdGluZyBnZW5lcmljIGhvdC1wYXRoIGZ1bmN0aW9ucyB0byBwcmV2ZW50IHNrZXdlZCB0ZXN0IGRpc3RyaWJ1dGlvbnMuXG4yLiBJZGVudGlmeSBhbnkgc3BlY2lmaWMgQ09ORklHXyBvcHRpb25zIHJlcXVpcmVkIHRvIHByb3Blcmx5IHRlc3QgdGhpcyBuZXcvbW9kaWZpZWQgZmVhdHVyZS5cbiAgIEdvIGFuZCBsb29rIGludG8gdGhlIEtjb25maWcgZmlsZXMgYW5kIGNoZWNrIGZvciBpZmRlZnMgYXJvdW5kIHRoZSBjb2RlLCBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy5cbiAgIERvIG5vdCBsaXN0IHRvbyBnZW5lcmljIGNvbmZpZ3MgKHdlIGFscmVhZHkgaGF2ZSB0aGVtIGVuYWJsZWQpLiBPbmx5IGxpc3QgdGhvc2UgdGhhdFxuICAgc3BlY2lmaWNhbGx5IGNvdmVyIHRoZSBtb2RpZmllZCBjb2RlLiBMaXN0IHRoZW0gaW4gdGhlIEVuYWJsZUNvbmZpZ3Mgb3V0cHV0IGFycmF5LFxuICAgYW5kIERPIE5PVCBhZGQgYSAnQ09ORklHXycgcHJlZml4IChlLmcuLCByZXR1cm4gXCJORVRfSVBWNFwiIGluc3RlYWQgb2YgXCJDT05GSUdfTkVUX0lQVjRcIikuXG5QcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy5cblxuXG5Vc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLlxuSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuXG5JZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuXG4iLCJQcm9tcHQiOiJGb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczpcbmNvbW1pdCA2YmY3NzE0MjdiM2NkNDg1MmM5NzBkNmI0NGIzYzAxYmQxOGNhNzMwXG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIE1vbiBKdW4gMjkgMTY6Mzk6MjggMjAyNiArMDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS9rZXJuZWwvYnBmL2FycmF5bWFwLmMgYi9rZXJuZWwvYnBmL2FycmF5bWFwLmNcbmluZGV4IDI0OGI0ODE4MTc4Y2QxLi5jNGU5NDMwOTQxZTU0OSAxMDA2NDRcbi0tLSBhL2tlcm5lbC9icGYvYXJyYXltYXAuY1xuKysrIGIva2VybmVsL2JwZi9hcnJheW1hcC5jXG5AQCAtMjU5LDYgKzI1OSwzNyBAQCBzdGF0aWMgdm9pZCAqcGVyY3B1X2FycmF5X21hcF9sb29rdXBfZWxlbShzdHJ1Y3QgYnBmX21hcCAqbWFwLCB2b2lkICprZXkpXG4gXHRyZXR1cm4gdGhpc19jcHVfcHRyKGFycmF5LVx1MDAzZXBwdHJzW2luZGV4IFx1MDAyNiBhcnJheS1cdTAwM2VpbmRleF9tYXNrXSk7XG4gfVxuIFxuK3N0YXRpYyBpbnQgcGVyY3B1X2FycmF5X21hcF9kaXJlY3RfdmFsdWVfYWRkcihjb25zdCBzdHJ1Y3QgYnBmX21hcCAqbWFwLCB1NjQgKmltbSwgdTMyIG9mZilcbit7XG4rXHRzdHJ1Y3QgYnBmX2FycmF5ICphcnJheSA9IGNvbnRhaW5lcl9vZihtYXAsIHN0cnVjdCBicGZfYXJyYXksIG1hcCk7XG4rXG4rXHRpZiAobWFwLVx1MDAzZW1heF9lbnRyaWVzICE9IDEpXG4rXHRcdHJldHVybiAtRU9QTk9UU1VQUDtcbitcdGlmIChvZmYgXHUwMDNlPSBtYXAtXHUwMDNldmFsdWVfc2l6ZSlcbitcdFx0cmV0dXJuIC1FSU5WQUw7XG4rXHRpZiAoIWJwZl9qaXRfc3VwcG9ydHNfcGVyY3B1X2luc24oKSlcbitcdFx0cmV0dXJuIC1FT1BOT1RTVVBQO1xuK1xuK1x0KmltbSA9ICh1NjQpKF9fZm9yY2UgdW5zaWduZWQgbG9uZykgYXJyYXktXHUwMDNlcHB0cnNbMF07XG4rXHRyZXR1cm4gMDtcbit9XG4rXG4rc3RhdGljIGludCBwZXJjcHVfYXJyYXlfbWFwX2RpcmVjdF92YWx1ZV9tZXRhKGNvbnN0IHN0cnVjdCBicGZfbWFwICptYXAsIHU2NCBpbW0sIHUzMiAqb2ZmKVxuK3tcbitcdHN0cnVjdCBicGZfYXJyYXkgKmFycmF5ID0gY29udGFpbmVyX29mKG1hcCwgc3RydWN0IGJwZl9hcnJheSwgbWFwKTtcbitcdHU2NCBiYXNlID0gKHU2NCkoX19mb3JjZSB1bnNpZ25lZCBsb25nKSBhcnJheS1cdTAwM2VwcHRyc1swXTtcbitcbitcdGlmIChtYXAtXHUwMDNlbWF4X2VudHJpZXMgIT0gMSlcbitcdFx0cmV0dXJuIC1FT1BOT1RTVVBQO1xuK1x0aWYgKGltbSBcdTAwM2MgYmFzZSB8fCBpbW0gXHUwMDNlPSBiYXNlICsgYXJyYXktXHUwMDNlZWxlbV9zaXplKVxuK1x0XHRyZXR1cm4gLUVOT0VOVDtcbitcdGlmICghYnBmX2ppdF9zdXBwb3J0c19wZXJjcHVfaW5zbigpKVxuK1x0XHRyZXR1cm4gLUVPUE5PVFNVUFA7XG4rXG4rXHQqb2ZmID0gaW1tIC0gYmFzZTtcbitcdHJldHVybiAwO1xuK31cbitcbiAvKiBlbWl0IEJQRiBpbnN0cnVjdGlvbnMgZXF1aXZhbGVudCB0byBDIGNvZGUgb2YgcGVyY3B1X2FycmF5X21hcF9sb29rdXBfZWxlbSgpICovXG4gc3RhdGljIGludCBwZXJjcHVfYXJyYXlfbWFwX2dlbl9sb29rdXAoc3RydWN0IGJwZl9tYXAgKm1hcCwgc3RydWN0IGJwZl9pbnNuICppbnNuX2J1ZilcbiB7XG5AQCAtNTUxLDkgKzU4MiwxMCBAQCBzdGF0aWMgaW50IGFycmF5X21hcF9jaGVja19idGYoc3RydWN0IGJwZl9tYXAgKm1hcCxcbiBcdFx0XHQgICAgICAgY29uc3Qgc3RydWN0IGJ0Zl90eXBlICprZXlfdHlwZSxcbiBcdFx0XHQgICAgICAgY29uc3Qgc3RydWN0IGJ0Zl90eXBlICp2YWx1ZV90eXBlKVxuIHtcbi1cdC8qIE9uZSBleGNlcHRpb24gZm9yIGtleWxlc3MgQlRGOiAuYnNzLy5kYXRhLy5yb2RhdGEgbWFwICovXG4rXHQvKiBPbmUgZXhjZXB0aW9uIGZvciBrZXlsZXNzIEJURjogLmJzcy8uZGF0YS8ucm9kYXRhLy5wZXJjcHUgbWFwICovXG4gXHRpZiAoYnRmX3R5cGVfaXNfdm9pZChrZXlfdHlwZSkpIHtcbi1cdFx0aWYgKG1hcC1cdTAwM2VtYXBfdHlwZSAhPSBCUEZfTUFQX1RZUEVfQVJSQVkgfHxcbitcdFx0aWYgKChtYXAtXHUwMDNlbWFwX3R5cGUgIT0gQlBGX01BUF9UWVBFX0FSUkFZIFx1MDAyNlx1MDAyNlxuK1x0XHQgICAgIG1hcC1cdTAwM2VtYXBfdHlwZSAhPSBCUEZfTUFQX1RZUEVfUEVSQ1BVX0FSUkFZKSB8fFxuIFx0XHQgICAgbWFwLVx1MDAzZW1heF9lbnRyaWVzICE9IDEpXG4gXHRcdFx0cmV0dXJuIC1FSU5WQUw7XG4gXG5AQCAtODMyLDYgKzg2NCw4IEBAIGNvbnN0IHN0cnVjdCBicGZfbWFwX29wcyBwZXJjcHVfYXJyYXlfbWFwX29wcyA9IHtcbiBcdC5tYXBfZ2V0X25leHRfa2V5ID0gYnBmX2FycmF5X2dldF9uZXh0X2tleSxcbiBcdC5tYXBfbG9va3VwX2VsZW0gPSBwZXJjcHVfYXJyYXlfbWFwX2xvb2t1cF9lbGVtLFxuIFx0Lm1hcF9nZW5fbG9va3VwID0gcGVyY3B1X2FycmF5X21hcF9nZW5fbG9va3VwLFxuK1x0Lm1hcF9kaXJlY3RfdmFsdWVfYWRkciA9IHBlcmNwdV9hcnJheV9tYXBfZGlyZWN0X3ZhbHVlX2FkZHIsXG4rXHQubWFwX2RpcmVjdF92YWx1ZV9tZXRhID0gcGVyY3B1X2FycmF5X21hcF9kaXJlY3RfdmFsdWVfbWV0YSxcbiBcdC5tYXBfdXBkYXRlX2VsZW0gPSBhcnJheV9tYXBfdXBkYXRlX2VsZW0sXG4gXHQubWFwX2RlbGV0ZV9lbGVtID0gYXJyYXlfbWFwX2RlbGV0ZV9lbGVtLFxuIFx0Lm1hcF9sb29rdXBfcGVyY3B1X2VsZW0gPSBwZXJjcHVfYXJyYXlfbWFwX2xvb2t1cF9wZXJjcHVfZWxlbSxcbmRpZmYgLS1naXQgYS9rZXJuZWwvYnBmL2NvbnN0X2ZvbGQuYyBiL2tlcm5lbC9icGYvY29uc3RfZm9sZC5jXG5pbmRleCBiMmExOWFjYWRiOTFlYy4uNTc4NzI0NmJlZjMwMTAgMTAwNjQ0XG4tLS0gYS9rZXJuZWwvYnBmL2NvbnN0X2ZvbGQuY1xuKysrIGIva2VybmVsL2JwZi9jb25zdF9mb2xkLmNcbkBAIC0xODIsNyArMTgyLDYgQEAgc3RhdGljIHZvaWQgY29uc3RfcmVnX3hmZXIoc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudiwgc3RydWN0IGNvbnN0X2FyZ19pbmZvICpcbiBcdFx0dTY0IHZhbCA9IDA7XG4gXG4gXHRcdGlmICghYnBmX21hcF9pc19yZG9ubHkobWFwKSB8fCAhbWFwLVx1MDAzZW9wcy1cdTAwM2VtYXBfZGlyZWN0X3ZhbHVlX2FkZHIgfHxcbi1cdFx0ICAgIG1hcC1cdTAwM2VtYXBfdHlwZSA9PSBCUEZfTUFQX1RZUEVfSU5TTl9BUlJBWSB8fFxuIFx0XHQgICAgb2ZmIFx1MDAzYyAwIHx8IG9mZiArIHNpemUgXHUwMDNlIG1hcC1cdTAwM2V2YWx1ZV9zaXplIHx8XG4gXHRcdCAgICBicGZfbWFwX2RpcmVjdF9yZWFkKG1hcCwgb2ZmLCBzaXplLCBcdTAwMjZ2YWwsIGlzX2xkc3gpKSB7XG4gXHRcdFx0KmRzdCA9IHVua25vd247XG5kaWZmIC0tZ2l0IGEva2VybmVsL2JwZi9maXh1cHMuYyBiL2tlcm5lbC9icGYvZml4dXBzLmNcbmluZGV4IDNjZjJjYzZlM2FiNjZhLi40Zjg0ZDA4N2NhNjllMyAxMDA2NDRcbi0tLSBhL2tlcm5lbC9icGYvZml4dXBzLmNcbisrKyBiL2tlcm5lbC9icGYvZml4dXBzLmNcbkBAIC0xODE5LDYgKzE4MTksMzggQEAgaW50IGJwZl9kb19taXNjX2ZpeHVwcyhzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52KVxuIFx0XHRcdGdvdG8gbmV4dF9pbnNuO1xuIFx0XHR9XG4gXG4rXHRcdGlmIChlbnYtXHUwMDNlcHJvZy1cdTAwM2VqaXRfcmVxdWVzdGVkIFx1MDAyNlx1MDAyNlxuK1x0XHQgICAgYnBmX2ppdF9zdXBwb3J0c19wZXJjcHVfaW5zbigpIFx1MDAyNlx1MDAyNlxuK1x0XHQgICAgaW5zbi1cdTAwM2Vjb2RlID09IChCUEZfTEQgfCBCUEZfSU1NIHwgQlBGX0RXKSBcdTAwMjZcdTAwMjZcbitcdFx0ICAgIChpbnNuLVx1MDAzZXNyY19yZWcgPT0gQlBGX1BTRVVET19NQVBfVkFMVUUgfHxcbitcdFx0ICAgICBpbnNuLVx1MDAzZXNyY19yZWcgPT0gQlBGX1BTRVVET19NQVBfSURYX1ZBTFVFKSkge1xuK1x0XHRcdHN0cnVjdCBicGZfbWFwICptYXA7XG4rXG4rXHRcdFx0YXV4ID0gXHUwMDI2ZW52LVx1MDAzZWluc25fYXV4X2RhdGFbaSArIGRlbHRhXTtcbitcdFx0XHRtYXAgPSBlbnYtXHUwMDNldXNlZF9tYXBzW2F1eC1cdTAwM2VtYXBfaW5kZXhdO1xuK1x0XHRcdGlmIChtYXAtXHUwMDNlbWFwX3R5cGUgIT0gQlBGX01BUF9UWVBFX1BFUkNQVV9BUlJBWSlcbitcdFx0XHRcdGdvdG8gbmV4dF9pbnNuO1xuK1xuK1x0XHRcdC8qXG4rXHRcdFx0ICogUmV1c2UgdGhlIG9yaWdpbmFsIGxkX2ltbTY0IGluc24sIGFuZCBhZGQgb25lXG4rXHRcdFx0ICogbW92NjRfcGVyY3B1X3JlZyBpbnNuLlxuK1x0XHRcdCAqL1xuK1xuK1x0XHRcdGluc25fYnVmWzBdID0gaW5zblsxXTtcbitcdFx0XHRpbnNuX2J1ZlsxXSA9IEJQRl9NT1Y2NF9QRVJDUFVfUkVHKGluc24tXHUwMDNlZHN0X3JlZywgaW5zbi1cdTAwM2Vkc3RfcmVnKTtcbitcdFx0XHRjbnQgPSAyO1xuK1xuK1x0XHRcdGkrKztcbitcdFx0XHRuZXdfcHJvZyA9IGJwZl9wYXRjaF9pbnNuX2RhdGEoZW52LCBpICsgZGVsdGEsIGluc25fYnVmLCBjbnQpO1xuK1x0XHRcdGlmICghbmV3X3Byb2cpXG4rXHRcdFx0XHRyZXR1cm4gLUVOT01FTTtcbitcbitcdFx0XHRkZWx0YSAgICArPSBjbnQgLSAxO1xuK1x0XHRcdGVudi1cdTAwM2Vwcm9nID0gcHJvZyA9IG5ld19wcm9nO1xuK1x0XHRcdGluc24gICAgICA9IG5ld19wcm9nLVx1MDAzZWluc25zaSArIGkgKyBkZWx0YTtcbitcdFx0XHRnb3RvIG5leHRfaW5zbjtcbitcdFx0fVxuK1xuIFx0XHRpZiAoaW5zbi1cdTAwM2Vjb2RlICE9IChCUEZfSk1QIHwgQlBGX0NBTEwpKVxuIFx0XHRcdGdvdG8gbmV4dF9pbnNuO1xuIFx0XHRpZiAoaW5zbi1cdTAwM2VzcmNfcmVnID09IEJQRl9QU0VVRE9fQ0FMTClcbmRpZmYgLS1naXQgYS9rZXJuZWwvYnBmL3ZlcmlmaWVyLmMgYi9rZXJuZWwvYnBmL3ZlcmlmaWVyLmNcbmluZGV4IDI1YWVhNDI3MWNkMDg5Li5kYmY3NmZhOWQ0M2Q4ZSAxMDA2NDRcbi0tLSBhL2tlcm5lbC9icGYvdmVyaWZpZXIuY1xuKysrIGIva2VybmVsL2JwZi92ZXJpZmllci5jXG5AQCAtNjUyLDcgKzY1Miw2IEBAIHN0YXRpYyB2b2lkIF9fbWFya19keW5wdHJfcmVnKHN0cnVjdCBicGZfcmVnX3N0YXRlICpyZWcsXG4gXHRcdFx0ICAgICAgZW51bSBicGZfZHlucHRyX3R5cGUgdHlwZSxcbiBcdFx0XHQgICAgICBib29sIGZpcnN0X3Nsb3QsIGludCBpZCwgaW50IHBhcmVudF9pZCk7XG4gXG4tXG4gc3RhdGljIHZvaWQgbWFya19keW5wdHJfc3RhY2tfcmVncyhzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52LFxuIFx0XHRcdFx0ICAgc3RydWN0IGJwZl9yZWdfc3RhdGUgKnNyZWcxLFxuIFx0XHRcdFx0ICAgc3RydWN0IGJwZl9yZWdfc3RhdGUgKnNyZWcyLFxuQEAgLTE2ODksNyArMTY4OCw2IEBAIHN0YXRpYyBib29sIHNhbWVfY2FsbHNpdGVzKHN0cnVjdCBicGZfdmVyaWZpZXJfc3RhdGUgKmEsIHN0cnVjdCBicGZfdmVyaWZpZXJfc3RhXG4gXHRyZXR1cm4gdHJ1ZTtcbiB9XG4gXG4tXG4gdm9pZCBicGZfZnJlZV9iYWNrZWRnZXMoc3RydWN0IGJwZl9zY2NfdmlzaXQgKnZpc2l0KVxuIHtcbiBcdHN0cnVjdCBicGZfc2NjX2JhY2tlZGdlICpiYWNrZWRnZSwgKm5leHQ7XG5AQCAtMjMwOSw3ICsyMzA3LDYgQEAgc3RhdGljIHN0cnVjdCBicGZfdmVyaWZpZXJfc3RhdGUgKnB1c2hfYXN5bmNfY2Ioc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudixcbiBcdHJldHVybiBcdTAwMjZlbGVtLVx1MDAzZXN0O1xuIH1cbiBcbi1cbiBzdGF0aWMgaW50IGNtcF9zdWJwcm9ncyhjb25zdCB2b2lkICphLCBjb25zdCB2b2lkICpiKVxuIHtcbiBcdHJldHVybiAoKHN0cnVjdCBicGZfc3VicHJvZ19pbmZvICopYSktXHUwMDNlc3RhcnQgLVxuQEAgLTMzMzEsNyArMzMyOCw2IEBAIHN0YXRpYyBib29sIGlzX3NwaWxsYWJsZV9yZWd0eXBlKGVudW0gYnBmX3JlZ190eXBlIHR5cGUpXG4gXHR9XG4gfVxuIFxuLVxuIC8qIGNoZWNrIGlmIHJlZ2lzdGVyIGlzIGEgY29uc3RhbnQgc2NhbGFyIHZhbHVlICovXG4gc3RhdGljIGJvb2wgaXNfcmVnX2NvbnN0KHN0cnVjdCBicGZfcmVnX3N0YXRlICpyZWcsIGJvb2wgc3VicmVnMzIpXG4ge1xuQEAgLTQwMjUsNyArNDAyMSw2IEBAIHN0YXRpYyBpbnQgY2hlY2tfc3RhY2tfcmVhZChzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52LFxuIFx0cmV0dXJuIGVycjtcbiB9XG4gXG4tXG4gLyogY2hlY2tfc3RhY2tfd3JpdGUgZGlzcGF0Y2hlcyB0byBjaGVja19zdGFja193cml0ZV9maXhlZF9vZmYgb3JcbiAgKiBjaGVja19zdGFja193cml0ZV92YXJfb2ZmLlxuICAqXG5AQCAtNDgyMCw3ICs0ODE1LDYgQEAgc3RhdGljIGludCBjaGVja19zb2NrX2FjY2VzcyhzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52LCBpbnQgaW5zbl9pZHgsXG4gXHRcdHZhbGlkID0gZmFsc2U7XG4gXHR9XG4gXG4tXG4gXHRpZiAodmFsaWQpIHtcbiBcdFx0ZW52LVx1MDAzZWluc25fYXV4X2RhdGFbaW5zbl9pZHhdLmN0eF9maWVsZF9zaXplID1cbiBcdFx0XHRpbmZvLmN0eF9maWVsZF9zaXplO1xuQEAgLTU2MDAsNiArNTU5NCw4IEBAIGludCBicGZfbWFwX2RpcmVjdF9yZWFkKHN0cnVjdCBicGZfbWFwICptYXAsIGludCBvZmYsIGludCBzaXplLCB1NjQgKnZhbCxcbiBcdHU2NCBhZGRyO1xuIFx0aW50IGVycjtcbiBcbitcdGlmIChtYXAtXHUwMDNlbWFwX3R5cGUgPT0gQlBGX01BUF9UWVBFX0lOU05fQVJSQVkgfHwgbWFwLVx1MDAzZW1hcF90eXBlID09IEJQRl9NQVBfVFlQRV9QRVJDUFVfQVJSQVkpXG4rXHRcdHJldHVybiAtRUlOVkFMO1xuIFx0ZXJyID0gbWFwLVx1MDAzZW9wcy1cdTAwM2VtYXBfZGlyZWN0X3ZhbHVlX2FkZHIobWFwLCBcdTAwMjZhZGRyLCBvZmYpO1xuIFx0aWYgKGVycilcbiBcdFx0cmV0dXJuIGVycjtcbkBAIC02MTU1LDYgKzYxNTEsNyBAQCBzdGF0aWMgaW50IGNoZWNrX21lbV9hY2Nlc3Moc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudiwgaW50IGluc25faWR4LCBzdHJ1Y3QgYlxuIFx0XHRcdGlmICh0bnVtX2lzX2NvbnN0KHJlZy1cdTAwM2V2YXJfb2ZmKSBcdTAwMjZcdTAwMjZcbiBcdFx0XHQgICAgYnBmX21hcF9pc19yZG9ubHkobWFwKSBcdTAwMjZcdTAwMjZcbiBcdFx0XHQgICAgbWFwLVx1MDAzZW9wcy1cdTAwM2VtYXBfZGlyZWN0X3ZhbHVlX2FkZHIgXHUwMDI2XHUwMDI2XG4rXHRcdFx0ICAgIG1hcC1cdTAwM2VtYXBfdHlwZSAhPSBCUEZfTUFQX1RZUEVfUEVSQ1BVX0FSUkFZIFx1MDAyNlx1MDAyNlxuIFx0XHRcdCAgICBtYXAtXHUwMDNlbWFwX3R5cGUgIT0gQlBGX01BUF9UWVBFX0lOU05fQVJSQVkpIHtcbiBcdFx0XHRcdGludCBtYXBfb2ZmID0gb2ZmICsgcmVnLVx1MDAzZXZhcl9vZmYudmFsdWU7XG4gXHRcdFx0XHR1NjQgdmFsID0gMDtcbkBAIC02NjQ1LDcgKzY2NDIsNiBAQCBzdGF0aWMgaW50IGNoZWNrX3N0YWNrX3JhbmdlX2luaXRpYWxpemVkKFxuIFx0aWYgKGVycilcbiBcdFx0cmV0dXJuIGVycjtcbiBcbi1cbiBcdGlmICh0bnVtX2lzX2NvbnN0KHJlZy1cdTAwM2V2YXJfb2ZmKSkge1xuIFx0XHRtaW5fb2ZmID0gbWF4X29mZiA9IHJlZy1cdTAwM2V2YXJfb2ZmLnZhbHVlICsgb2ZmO1xuIFx0fSBlbHNlIHtcbkBAIC03MzU5LDcgKzczNTUsNiBAQCBzdGF0aWMgYm9vbCBpc19pdGVyX25ld19rZnVuYyhzdHJ1Y3QgYnBmX2tmdW5jX2NhbGxfYXJnX21ldGEgKm1ldGEpXG4gXHRyZXR1cm4gbWV0YS1cdTAwM2VrZnVuY19mbGFncyBcdTAwMjYgS0ZfSVRFUl9ORVc7XG4gfVxuIFxuLVxuIHN0YXRpYyBib29sIGlzX2l0ZXJfZGVzdHJveV9rZnVuYyhzdHJ1Y3QgYnBmX2tmdW5jX2NhbGxfYXJnX21ldGEgKm1ldGEpXG4ge1xuIFx0cmV0dXJuIG1ldGEtXHUwMDNla2Z1bmNfZmxhZ3MgXHUwMDI2IEtGX0lURVJfREVTVFJPWTtcbkBAIC04MTI1LDYgKzgxMjAsMTIgQEAgc3RhdGljIGludCBjaGVja19hcmdfY29uc3Rfc3RyKHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsXG4gXHRcdHJldHVybiAtRUFDQ0VTO1xuIFx0fVxuIFxuK1x0aWYgKG1hcC1cdTAwM2VtYXBfdHlwZSA9PSBCUEZfTUFQX1RZUEVfUEVSQ1BVX0FSUkFZKSB7XG4rXHRcdHZlcmJvc2UoZW52LCBcIiVzIHBvaW50cyB0byBwZXJjcHVfYXJyYXkgbWFwIHdoaWNoIGNhbm5vdCBiZSB1c2VkIGFzIGNvbnN0IHN0cmluZ1xcblwiLFxuK1x0XHRcdHJlZ19hcmdfbmFtZShlbnYsIGFyZ25vKSk7XG4rXHRcdHJldHVybiAtRUFDQ0VTO1xuK1x0fVxuK1xuIFx0aWYgKCFicGZfbWFwX2lzX3Jkb25seShtYXApKSB7XG4gXHRcdHZlcmJvc2UoZW52LCBcIiVzIGRvZXMgbm90IHBvaW50IHRvIGEgcmVhZG9ubHkgbWFwJ1xcblwiLCByZWdfYXJnX25hbWUoZW52LCBhcmdubykpO1xuIFx0XHRyZXR1cm4gLUVBQ0NFUztcbkBAIC0xMTUwMiw3ICsxMTUwMyw2IEBAIHN0YXRpYyBpbnQgcHJvY2Vzc19pcnFfZmxhZyhzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52LCBzdHJ1Y3QgYnBmX3JlZ19zdGF0ZSAqXG4gXHRyZXR1cm4gMDtcbiB9XG4gXG4tXG4gc3RhdGljIGludCByZWZfc2V0X25vbl9vd25pbmcoc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudiwgc3RydWN0IGJwZl9yZWdfc3RhdGUgKnJlZylcbiB7XG4gXHRzdHJ1Y3QgYnRmX3JlY29yZCAqcmVjID0gcmVnX2J0Zl9yZWNvcmQocmVnKTtcbkBAIC0xNjM5NCw3ICsxNjM5NCw2IEBAIHN0YXRpYyBpbnQgY2hlY2tfbGRfYWJzKHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsIHN0cnVjdCBicGZfaW5zbiAqaW5zbilcbiBcdHJldHVybiAwO1xuIH1cbiBcbi1cbiBzdGF0aWMgYm9vbCByZXR1cm5fcmV0dmFsX3JhbmdlKHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsIHN0cnVjdCBicGZfcmV0dmFsX3JhbmdlICpyYW5nZSlcbiB7XG4gXHRlbnVtIGJwZl9wcm9nX3R5cGUgcHJvZ190eXBlID0gcmVzb2x2ZV9wcm9nX3R5cGUoZW52LVx1MDAzZXByb2cpO1xuQEAgLTE4MjEzLDYgKzE4MjEyLDEyIEBAIHN0YXRpYyBpbnQgY2hlY2tfYW5kX3Jlc29sdmVfaW5zbnMoc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudilcbiBcdFx0XHRcdFx0cmV0dXJuIC1FSU5WQUw7XG4gXHRcdFx0XHR9XG4gXG4rXHRcdFx0XHRpZiAobWFwLVx1MDAzZW1hcF90eXBlID09IEJQRl9NQVBfVFlQRV9QRVJDUFVfQVJSQVkgXHUwMDI2XHUwMDI2XG4rXHRcdFx0XHQgICAgIWVudi1cdTAwM2Vwcm9nLVx1MDAzZWppdF9yZXF1ZXN0ZWQpIHtcbitcdFx0XHRcdFx0dmVyYm9zZShlbnYsIFwiSklUIGlzIHJlcXVpcmVkIHRvIHVzZSBnbG9iYWwgcGVyY3B1IGRhdGFcXG5cIik7XG4rXHRcdFx0XHRcdHJldHVybiAtRU9QTk9UU1VQUDtcbitcdFx0XHRcdH1cbitcbiBcdFx0XHRcdGVyciA9IG1hcC1cdTAwM2VvcHMtXHUwMDNlbWFwX2RpcmVjdF92YWx1ZV9hZGRyKG1hcCwgXHUwMDI2YWRkciwgb2ZmKTtcbiBcdFx0XHRcdGlmIChlcnIpIHtcbiBcdFx0XHRcdFx0dmVyYm9zZShlbnYsIFwiaW52YWxpZCBhY2Nlc3MgdG8gbWFwIHZhbHVlIHBvaW50ZXIsIHZhbHVlX3NpemU9JXUgb2ZmPSV1XFxuXCIsXG5AQCAtMTgyODgsOCArMTgyOTMsNiBAQCBzdGF0aWMgdm9pZCByZWxlYXNlX2luc25fYXJyYXlzKHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYpXG4gXHRcdGJwZl9pbnNuX2FycmF5X3JlbGVhc2UoZW52LVx1MDAzZWluc25fYXJyYXlfbWFwc1tpXSk7XG4gfVxuIFxuLVxuLVxuIC8qIFRoZSB2ZXJpZmllciBkb2VzIG1vcmUgZGF0YSBmbG93IGFuYWx5c2lzIHRoYW4gbGx2bSBhbmQgd2lsbCBub3RcbiAgKiBleHBsb3JlIGJyYW5jaGVzIHRoYXQgYXJlIGRlYWQgYXQgcnVuIHRpbWUuIE1hbGljaW91cyBwcm9ncmFtcyBjYW5cbiAgKiBoYXZlIGRlYWQgY29kZSB0b28uIFRoZXJlZm9yZSByZXBsYWNlIGFsbCBkZWFkIGF0LXJ1bi10aW1lIGNvZGVcbkBAIC0xODMxNyw4ICsxODMyMCw2IEBAIHN0YXRpYyB2b2lkIHNhbml0aXplX2RlYWRfY29kZShzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52KVxuIFx0fVxuIH1cbiBcbi1cbi1cbiBzdGF0aWMgdm9pZCBmcmVlX3N0YXRlcyhzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52KVxuIHtcbiBcdHN0cnVjdCBicGZfdmVyaWZpZXJfc3RhdGVfbGlzdCAqc2w7XG5AQCAtMTg2MDAsNyArMTg2MDEsNiBAQCBzdGF0aWMgaW50IGRvX2NoZWNrX21haW4oc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudilcbiBcdHJldHVybiByZXQ7XG4gfVxuIFxuLVxuIHN0YXRpYyB2b2lkIHByaW50X3ZlcmlmaWNhdGlvbl9zdGF0cyhzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52KVxuIHtcbiBcdC8qIFNraXAgb3ZlciBoaWRkZW4gc3VicHJvZ3Mgd2hpY2ggYXJlIG5vdCB2ZXJpZmllZC4gKi9cbmRpZmYgLS1naXQgYS90b29scy9icGYvYnBmdG9vbC9nZW4uYyBiL3Rvb2xzL2JwZi9icGZ0b29sL2dlbi5jXG5pbmRleCA2YWU3MjYyZWJlMGMxZC4uMmU2MDI5NjM1OGRiNWUgMTAwNjQ0XG4tLS0gYS90b29scy9icGYvYnBmdG9vbC9nZW4uY1xuKysrIGIvdG9vbHMvYnBmL2JwZnRvb2wvZ2VuLmNcbkBAIC05Miw3ICs5Miw3IEBAIHN0YXRpYyB2b2lkIGdldF9oZWFkZXJfZ3VhcmQoY2hhciAqZ3VhcmQsIGNvbnN0IGNoYXIgKm9ial9uYW1lLCBjb25zdCBjaGFyICpzdWZmXG4gXG4gc3RhdGljIGJvb2wgZ2V0X21hcF9pZGVudChjb25zdCBzdHJ1Y3QgYnBmX21hcCAqbWFwLCBjaGFyICpidWYsIHNpemVfdCBidWZfc3opXG4ge1xuLVx0c3RhdGljIGNvbnN0IGNoYXIgKnNmeHNbXSA9IHsgXCIuZGF0YVwiLCBcIi5yb2RhdGFcIiwgXCIuYnNzXCIsIFwiLmtjb25maWdcIiB9O1xuK1x0c3RhdGljIGNvbnN0IGNoYXIgKnNmeHNbXSA9IHsgXCIuZGF0YVwiLCBcIi5yb2RhdGFcIiwgXCIuYnNzXCIsIFwiLnBlcmNwdVwiLCBcIi5rY29uZmlnXCIgfTtcbiBcdGNvbnN0IGNoYXIgKm5hbWUgPSBicGZfbWFwX19uYW1lKG1hcCk7XG4gXHRpbnQgaSwgbjtcbiBcbkBAIC0xMTcsNyArMTE3LDcgQEAgc3RhdGljIGJvb2wgZ2V0X21hcF9pZGVudChjb25zdCBzdHJ1Y3QgYnBmX21hcCAqbWFwLCBjaGFyICpidWYsIHNpemVfdCBidWZfc3opXG4gXG4gc3RhdGljIGJvb2wgZ2V0X2RhdGFzZWNfaWRlbnQoY29uc3QgY2hhciAqc2VjX25hbWUsIGNoYXIgKmJ1Ziwgc2l6ZV90IGJ1Zl9zeilcbiB7XG4tXHRzdGF0aWMgY29uc3QgY2hhciAqcGZ4c1tdID0geyBcIi5kYXRhXCIsIFwiLnJvZGF0YVwiLCBcIi5ic3NcIiwgXCIua2NvbmZpZ1wiIH07XG4rXHRzdGF0aWMgY29uc3QgY2hhciAqcGZ4c1tdID0geyBcIi5kYXRhXCIsIFwiLnJvZGF0YVwiLCBcIi5ic3NcIiwgXCIucGVyY3B1XCIsIFwiLmtjb25maWdcIiB9O1xuIFx0aW50IGksIG47XG4gXG4gXHQvKiByZWNvZ25pemUgaGFyZCBjb2RlZCBMTFZNIHNlY3Rpb24gbmFtZSAqL1xuQEAgLTI1NCw2ICsyNTQsMjAgQEAgc3RhdGljIGNvbnN0IHN0cnVjdCBidGZfdHlwZSAqZmluZF90eXBlX2Zvcl9tYXAoc3RydWN0IGJ0ZiAqYnRmLCBjb25zdCBjaGFyICptYXBcbiBcdHJldHVybiBOVUxMO1xuIH1cbiBcbitzdGF0aWMgYm9vbCBicGZfbWFwX2lzX3NrZWxfZGF0YShjb25zdCBzdHJ1Y3QgYnBmX21hcCAqbWFwKVxuK3tcbitcdGlmICghYnBmX21hcF9faXNfaW50ZXJuYWwobWFwKSlcbitcdFx0cmV0dXJuIGZhbHNlO1xuK1xuK1x0aWYgKGJwZl9tYXBfX21hcF9mbGFncyhtYXApIFx1MDAyNiBCUEZfRl9NTUFQQUJMRSlcbitcdFx0cmV0dXJuIHRydWU7XG4rXG4rXHRpZiAoYnBmX21hcF9fdHlwZShtYXApID09IEJQRl9NQVBfVFlQRV9QRVJDUFVfQVJSQVkpXG4rXHRcdHJldHVybiB0cnVlO1xuK1xuK1x0cmV0dXJuIGZhbHNlO1xuK31cbitcbiBzdGF0aWMgYm9vbCBpc19tbWFwYWJsZV9tYXAoY29uc3Qgc3RydWN0IGJwZl9tYXAgKm1hcCwgY2hhciAqYnVmLCBzaXplX3Qgc3opXG4ge1xuIFx0c2l6ZV90IHRtcF9zejtcbkBAIC0yNjMsNyArMjc3LDcgQEAgc3RhdGljIGJvb2wgaXNfbW1hcGFibGVfbWFwKGNvbnN0IHN0cnVjdCBicGZfbWFwICptYXAsIGNoYXIgKmJ1Ziwgc2l6ZV90IHN6KVxuIFx0XHRyZXR1cm4gdHJ1ZTtcbiBcdH1cbiBcbi1cdGlmICghYnBmX21hcF9faXNfaW50ZXJuYWwobWFwKSB8fCAhKGJwZl9tYXBfX21hcF9mbGFncyhtYXApIFx1MDAyNiBCUEZfRl9NTUFQQUJMRSkpXG4rXHRpZiAoIWJwZl9tYXBfaXNfc2tlbF9kYXRhKG1hcCkpXG4gXHRcdHJldHVybiBmYWxzZTtcbiBcbiBcdGlmICghZ2V0X21hcF9pZGVudChtYXAsIGJ1Ziwgc3opKVxuQEAgLTMyMSw2ICszMzUsMTEgQEAgc3RhdGljIGJvb2wgYnRmX2lzX3B0cl90b19mdW5jX3Byb3RvKGNvbnN0IHN0cnVjdCBidGYgKmJ0ZixcbiBcdHJldHVybiBidGZfaXNfcHRyKHYpIFx1MDAyNlx1MDAyNiBidGZfaXNfZnVuY19wcm90byhidGZfX3R5cGVfYnlfaWQoYnRmLCB2LVx1MDAzZXR5cGUpKTtcbiB9XG4gXG4rc3RhdGljIGJvb2wgYnBmX21hcF9pc19wZXJjcHVfZGF0YShjb25zdCBzdHJ1Y3QgYnBmX21hcCAqbWFwKVxuK3tcbitcdHJldHVybiBicGZfbWFwX19pc19pbnRlcm5hbChtYXApIFx1MDAyNlx1MDAyNiBicGZfbWFwX190eXBlKG1hcCkgPT0gQlBGX01BUF9UWVBFX1BFUkNQVV9BUlJBWTtcbit9XG4rXG4gc3RhdGljIGludCBjb2RlZ2VuX3N1YnNrZWxfZGF0YXNlY3Moc3RydWN0IGJwZl9vYmplY3QgKm9iaiwgY29uc3QgY2hhciAqb2JqX25hbWUpXG4ge1xuIFx0c3RydWN0IGJ0ZiAqYnRmID0gYnBmX29iamVjdF9fYnRmKG9iaik7XG5AQCAtMzQzLDYgKzM2Miw5IEBAIHN0YXRpYyBpbnQgY29kZWdlbl9zdWJza2VsX2RhdGFzZWNzKHN0cnVjdCBicGZfb2JqZWN0ICpvYmosIGNvbnN0IGNoYXIgKm9ial9uYW1lXG4gXHRcdGlmICghaXNfbW1hcGFibGVfbWFwKG1hcCwgbWFwX2lkZW50LCBzaXplb2YobWFwX2lkZW50KSkpXG4gXHRcdFx0Y29udGludWU7XG4gXG4rXHRcdGlmIChicGZfbWFwX2lzX3BlcmNwdV9kYXRhKG1hcCkpXG4rXHRcdFx0Y29udGludWU7XG4rXG4gXHRcdHNlYyA9IGZpbmRfdHlwZV9mb3JfbWFwKGJ0ZiwgbWFwX2lkZW50KTtcbiBcdFx0aWYgKCFzZWMpXG4gXHRcdFx0Y29udGludWU7XG5AQCAtNjY4LDggKzY5MCw3IEBAIHN0YXRpYyB2b2lkIGNvZGVnZW5fZGVzdHJveShzdHJ1Y3QgYnBmX29iamVjdCAqb2JqLCBjb25zdCBjaGFyICpvYmpfbmFtZSlcbiBcdGJwZl9vYmplY3RfX2Zvcl9lYWNoX21hcChtYXAsIG9iaikge1xuIFx0XHRpZiAoIWdldF9tYXBfaWRlbnQobWFwLCBpZGVudCwgc2l6ZW9mKGlkZW50KSkpXG4gXHRcdFx0Y29udGludWU7XG4tXHRcdGlmIChicGZfbWFwX19pc19pbnRlcm5hbChtYXApIFx1MDAyNlx1MDAyNlxuLVx0XHQgICAgKGJwZl9tYXBfX21hcF9mbGFncyhtYXApIFx1MDAyNiBCUEZfRl9NTUFQQUJMRSkpXG4rXHRcdGlmIChicGZfbWFwX2lzX3NrZWxfZGF0YShtYXApKVxuIFx0XHRcdHByaW50ZihcIlxcdHNrZWxfZnJlZV9tYXBfZGF0YShza2VsLVx1MDAzZSUxJHMsIHNrZWwtXHUwMDNlbWFwcy4lMSRzLmluaXRpYWxfdmFsdWUsICUyJHp1KTtcXG5cIixcbiBcdFx0XHQgICAgICAgaWRlbnQsIGJwZl9tYXBfbW1hcF9zeihtYXApKTtcbiBcdFx0Y29kZWdlbihcIlxcXG5AQCAtODUwLDYgKzg3MSwyMCBAQCBzdGF0aWMgaW50IGdlbl90cmFjZShzdHJ1Y3QgYnBmX29iamVjdCAqb2JqLCBjb25zdCBjaGFyICpvYmpfbmFtZSwgY29uc3QgY2hhciAqaFxuIFx0XHRpZiAoIWlzX21tYXBhYmxlX21hcChtYXAsIGlkZW50LCBzaXplb2YoaWRlbnQpKSlcbiBcdFx0XHRjb250aW51ZTtcbiBcbitcdFx0aWYgKGJwZl9tYXBfaXNfcGVyY3B1X2RhdGEobWFwKSkge1xuK1x0XHRcdGNvZGVnZW4oXCJcXFxuK1x0XHRcXG5cXFxuK1x0XHRcdGVyciA9IHNrZWxfcHJvdGVjdF9tYXBfZGF0YShza2VsLVx1MDAzZSUxJHMsIFx1MDAyNnNrZWwtXHUwMDNlbWFwcy4lMSRzLmluaXRpYWxfdmFsdWUsICUyJHpkKTtcXG5cXFxuK1x0XHRcdGlmIChlcnIpXHRcdFx0XHRcdCAgICBcXG5cXFxuK1x0XHRcdFx0cmV0dXJuIGVycjtcdFx0XHRcdCAgICBcXG5cXFxuK1x0XHQjaWZkZWYgX19LRVJORUxfX1x0XHRcdFx0XHQgICAgXFxuXFxcbitcdFx0XHRza2VsLVx1MDAzZSUxJHMgPSBOVUxMO1x0XHRcdFx0ICAgIFxcblxcXG4rXHRcdCNlbmRpZlx0XHRcdFx0XHRcdFx0ICAgIFxcblxcXG4rXHRcdFx0XCIsXG4rXHRcdFx0aWRlbnQsIGJwZl9tYXBfbW1hcF9zeihtYXApKTtcbitcdFx0XHRjb250aW51ZTtcbitcdFx0fVxuK1xuIFx0XHRpZiAoYnBmX21hcF9fbWFwX2ZsYWdzKG1hcCkgXHUwMDI2IEJQRl9GX1JET05MWV9QUk9HKVxuIFx0XHRcdG1tYXBfZmxhZ3MgPSBcIlBST1RfUkVBRFwiO1xuIFx0XHRlbHNlXG5AQCAtMTc0MCw2ICsxNzc1LDggQEAgc3RhdGljIGludCBkb19zdWJza2VsZXRvbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpXG4gXG4gXHRcdGlmICghaXNfbW1hcGFibGVfbWFwKG1hcCwgaWRlbnQsIHNpemVvZihpZGVudCkpKVxuIFx0XHRcdGNvbnRpbnVlO1xuK1x0XHRpZiAoYnBmX21hcF9pc19wZXJjcHVfZGF0YShtYXApKVxuK1x0XHRcdGNvbnRpbnVlO1xuIFxuIFx0XHRtYXBfdHlwZV9pZCA9IGJwZl9tYXBfX2J0Zl92YWx1ZV90eXBlX2lkKG1hcCk7XG4gXHRcdGlmIChtYXBfdHlwZV9pZCBcdTAwM2M9IDApIHtcbkBAIC0xODYzLDYgKzE5MDAsOCBAQCBzdGF0aWMgaW50IGRvX3N1YnNrZWxldG9uKGludCBhcmdjLCBjaGFyICoqYXJndilcbiBcdGJwZl9vYmplY3RfX2Zvcl9lYWNoX21hcChtYXAsIG9iaikge1xuIFx0XHRpZiAoIWlzX21tYXBhYmxlX21hcChtYXAsIGlkZW50LCBzaXplb2YoaWRlbnQpKSlcbiBcdFx0XHRjb250aW51ZTtcbitcdFx0aWYgKGJwZl9tYXBfaXNfcGVyY3B1X2RhdGEobWFwKSlcbitcdFx0XHRjb250aW51ZTtcbiBcbiBcdFx0bWFwX3R5cGVfaWQgPSBicGZfbWFwX19idGZfdmFsdWVfdHlwZV9pZChtYXApO1xuIFx0XHRpZiAobWFwX3R5cGVfaWQgXHUwMDNjPSAwKVxuZGlmZiAtLWdpdCBhL3Rvb2xzL2xpYi9icGYvYnBmX2dlbl9pbnRlcm5hbC5oIGIvdG9vbHMvbGliL2JwZi9icGZfZ2VuX2ludGVybmFsLmhcbmluZGV4IDQ5YWY0MjYwYjhlNmI3Li41ZWE4MzgzODA1ZDNiYyAxMDA2NDRcbi0tLSBhL3Rvb2xzL2xpYi9icGYvYnBmX2dlbl9pbnRlcm5hbC5oXG4rKysgYi90b29scy9saWIvYnBmL2JwZl9nZW5faW50ZXJuYWwuaFxuQEAgLTY2LDcgKzY2LDggQEAgdm9pZCBicGZfZ2VuX19wcm9nX2xvYWQoc3RydWN0IGJwZl9nZW4gKmdlbixcbiBcdFx0XHRlbnVtIGJwZl9wcm9nX3R5cGUgcHJvZ190eXBlLCBjb25zdCBjaGFyICpwcm9nX25hbWUsXG4gXHRcdFx0Y29uc3QgY2hhciAqbGljZW5zZSwgc3RydWN0IGJwZl9pbnNuICppbnNucywgc2l6ZV90IGluc25fY250LFxuIFx0XHRcdHN0cnVjdCBicGZfcHJvZ19sb2FkX29wdHMgKmxvYWRfYXR0ciwgaW50IHByb2dfaWR4KTtcbi12b2lkIGJwZl9nZW5fX21hcF91cGRhdGVfZWxlbShzdHJ1Y3QgYnBmX2dlbiAqZ2VuLCBpbnQgbWFwX2lkeCwgdm9pZCAqdmFsdWUsIF9fdTMyIHZhbHVlX3NpemUpO1xuK3ZvaWQgYnBmX2dlbl9fbWFwX3VwZGF0ZV9lbGVtKHN0cnVjdCBicGZfZ2VuICpnZW4sIGludCBtYXBfaWR4LCB2b2lkICp2YWx1ZSwgX191MzIgdmFsdWVfc2l6ZSxcbitcdFx0XHQgICAgICBfX3U2NCBmbGFncyk7XG4gdm9pZCBicGZfZ2VuX19tYXBfZnJlZXplKHN0cnVjdCBicGZfZ2VuICpnZW4sIGludCBtYXBfaWR4KTtcbiB2b2lkIGJwZl9nZW5fX3JlY29yZF9hdHRhY2hfdGFyZ2V0KHN0cnVjdCBicGZfZ2VuICpnZW4sIGNvbnN0IGNoYXIgKm5hbWUsIGVudW0gYnBmX2F0dGFjaF90eXBlIHR5cGUpO1xuIHZvaWQgYnBmX2dlbl9fcmVjb3JkX2V4dGVybihzdHJ1Y3QgYnBmX2dlbiAqZ2VuLCBjb25zdCBjaGFyICpuYW1lLCBib29sIGlzX3dlYWssXG5kaWZmIC0tZ2l0IGEvdG9vbHMvbGliL2JwZi9mZWF0dXJlcy5jIGIvdG9vbHMvbGliL2JwZi9mZWF0dXJlcy5jXG5pbmRleCBiN2UzODhmOTlkMGJiZC4uZWY5NTgxYzExMzAzNTUgMTAwNjQ0XG4tLS0gYS90b29scy9saWIvYnBmL2ZlYXR1cmVzLmNcbisrKyBiL3Rvb2xzL2xpYi9icGYvZmVhdHVyZXMuY1xuQEAgLTYyMCw2ICs2MjAsMzggQEAgc3RhdGljIGludCBwcm9iZV9icGZfc3lzY2FsbF9jb21tb25fYXR0cnMoaW50IHRva2VuX2ZkKVxuIFx0cmV0dXJuIHByb2JlX3N5c19icGZfZXh0KCk7XG4gfVxuIFxuK3N0YXRpYyBpbnQgcHJvYmVfa2Vybl9wZXJjcHVfZGF0YShpbnQgdG9rZW5fZmQpXG4re1xuK1x0c3RydWN0IGJwZl9pbnNuIGluc25zW10gPSB7XG4rXHRcdEJQRl9MRF9NQVBfVkFMVUUoQlBGX1JFR18xLCAwLCAwKSxcbitcdFx0QlBGX0xEWF9NRU0oQlBGX0RXLCBCUEZfUkVHXzAsIEJQRl9SRUdfMSwgMCksXG4rXHRcdEJQRl9FWElUX0lOU04oKSxcbitcdH07XG4rXHRMSUJCUEZfT1BUUyhicGZfbWFwX2NyZWF0ZV9vcHRzLCBtYXBfb3B0cyxcbitcdFx0LnRva2VuX2ZkID0gdG9rZW5fZmQsXG4rXHRcdC5tYXBfZmxhZ3MgPSB0b2tlbl9mZCA/IEJQRl9GX1RPS0VOX0ZEIDogMCxcbitcdCk7XG4rXHRMSUJCUEZfT1BUUyhicGZfcHJvZ19sb2FkX29wdHMsIHByb2dfb3B0cyxcbitcdFx0LnRva2VuX2ZkID0gdG9rZW5fZmQsXG4rXHRcdC5wcm9nX2ZsYWdzID0gdG9rZW5fZmQgPyBCUEZfRl9UT0tFTl9GRCA6IDAsXG4rXHQpO1xuK1x0aW50IHJldCwgbWFwLCBpbnNuX2NudCA9IEFSUkFZX1NJWkUoaW5zbnMpO1xuK1xuK1x0bWFwID0gYnBmX21hcF9jcmVhdGUoQlBGX01BUF9UWVBFX1BFUkNQVV9BUlJBWSwgXCJsaWJicGZfcGVyY3B1XCIsIHNpemVvZihpbnQpLCA4LCAxLFxuK1x0XHRcdCAgICAgXHUwMDI2bWFwX29wdHMpO1xuK1x0aWYgKG1hcCBcdTAwM2MgMCkge1xuK1x0XHRwcl93YXJuKFwiRXJyb3IgaW4gJXMoKTogJXMuIENvdWxkbid0IGNyZWF0ZSBzaW1wbGUgcGVyY3B1X2FycmF5IG1hcC5cXG5cIixcbitcdFx0XHRfX2Z1bmNfXywgZXJyc3RyKG1hcCkpO1xuK1x0XHRyZXR1cm4gbWFwO1xuK1x0fVxuK1xuK1x0aW5zbnNbMF0uaW1tID0gbWFwO1xuK1xuK1x0cmV0ID0gYnBmX3Byb2dfbG9hZChCUEZfUFJPR19UWVBFX1NPQ0tFVF9GSUxURVIsIE5VTEwsIFwiR1BMXCIsIGluc25zLCBpbnNuX2NudCwgXHUwMDI2cHJvZ19vcHRzKTtcbitcdGNsb3NlKG1hcCk7XG4rXHRyZXR1cm4gcHJvYmVfZmQocmV0KTtcbit9XG4rXG4gdHlwZWRlZiBpbnQgKCpmZWF0dXJlX3Byb2JlX2ZuKShpbnQgLyogdG9rZW5fZmQgKi8pO1xuIFxuIHN0YXRpYyBzdHJ1Y3Qga2Vybl9mZWF0dXJlX2NhY2hlIGZlYXR1cmVfY2FjaGU7XG5AQCAtNzA3LDYgKzczOSw5IEBAIHN0YXRpYyBzdHJ1Y3Qga2Vybl9mZWF0dXJlX2Rlc2Mge1xuIFx0W0ZFQVRfQlBGX1NZU0NBTExfQ09NTU9OX0FUVFJTXSA9IHtcbiBcdFx0XCJCUEYgc3lzY2FsbCBjb21tb24gYXR0cmlidXRlcyBzdXBwb3J0XCIsIHByb2JlX2JwZl9zeXNjYWxsX2NvbW1vbl9hdHRycyxcbiBcdH0sXG4rXHRbRkVBVF9QRVJDUFVfREFUQV0gPSB7XG4rXHRcdFwia2VybmVsIHN1cHBvcnRzIHBlcmNwdSBkYXRhXCIsIHByb2JlX2tlcm5fcGVyY3B1X2RhdGEsXG4rXHR9LFxuIH07XG4gXG4gYm9vbCBmZWF0X3N1cHBvcnRlZChzdHJ1Y3Qga2Vybl9mZWF0dXJlX2NhY2hlICpjYWNoZSwgZW51bSBrZXJuX2ZlYXR1cmVfaWQgZmVhdF9pZClcbmRpZmYgLS1naXQgYS90b29scy9saWIvYnBmL2dlbl9sb2FkZXIuYyBiL3Rvb2xzL2xpYi9icGYvZ2VuX2xvYWRlci5jXG5pbmRleCBjN2YyZDJhYzdiYjM1Zi4uNjBhMTIwNGU5YTI2M2MgMTAwNjQ0XG4tLS0gYS90b29scy9saWIvYnBmL2dlbl9sb2FkZXIuY1xuKysrIGIvdG9vbHMvbGliL2JwZi9nZW5fbG9hZGVyLmNcbkBAIC0xMTkwLDcgKzExOTAsNyBAQCB2b2lkIGJwZl9nZW5fX3Byb2dfbG9hZChzdHJ1Y3QgYnBmX2dlbiAqZ2VuLFxuIH1cbiBcbiB2b2lkIGJwZl9nZW5fX21hcF91cGRhdGVfZWxlbShzdHJ1Y3QgYnBmX2dlbiAqZ2VuLCBpbnQgbWFwX2lkeCwgdm9pZCAqcHZhbHVlLFxuLVx0XHRcdCAgICAgIF9fdTMyIHZhbHVlX3NpemUpXG4rXHRcdFx0ICAgICAgX191MzIgdmFsdWVfc2l6ZSwgX191NjQgZmxhZ3MpXG4ge1xuIFx0aW50IGF0dHJfc2l6ZSA9IG9mZnNldG9mZW5kKHVuaW9uIGJwZl9hdHRyLCBmbGFncyk7XG4gXHRpbnQgbWFwX3VwZGF0ZV9hdHRyLCB2YWx1ZSwga2V5O1xuQEAgLTExOTgsNiArMTE5OCw3IEBAIHZvaWQgYnBmX2dlbl9fbWFwX3VwZGF0ZV9lbGVtKHN0cnVjdCBicGZfZ2VuICpnZW4sIGludCBtYXBfaWR4LCB2b2lkICpwdmFsdWUsXG4gXHRpbnQgemVybyA9IDA7XG4gXG4gXHRtZW1zZXQoXHUwMDI2YXR0ciwgMCwgYXR0cl9zaXplKTtcbitcdGF0dHIuZmxhZ3MgPSB0Z3RfZW5kaWFuKGZsYWdzKTtcbiBcbiBcdHZhbHVlID0gYWRkX2RhdGEoZ2VuLCBwdmFsdWUsIHZhbHVlX3NpemUpO1xuIFx0a2V5ID0gYWRkX2RhdGEoZ2VuLCBcdTAwMjZ6ZXJvLCBzaXplb2YoemVybykpO1xuZGlmZiAtLWdpdCBhL3Rvb2xzL2xpYi9icGYvbGliYnBmLmMgYi90b29scy9saWIvYnBmL2xpYmJwZi5jXG5pbmRleCA3MTYyMTQ2MjgwYTgwZS4uNmUxOGExNjI4ZTEzOTYgMTAwNjQ0XG4tLS0gYS90b29scy9saWIvYnBmL2xpYmJwZi5jXG4rKysgYi90b29scy9saWIvYnBmL2xpYmJwZi5jXG5AQCAtNTQxLDYgKzU0MSw3IEBAIHN0cnVjdCBicGZfc3RydWN0X29wcyB7XG4gfTtcbiBcbiAjZGVmaW5lIERBVEFfU0VDIFwiLmRhdGFcIlxuKyNkZWZpbmUgUEVSQ1BVX1NFQyBcIi5wZXJjcHVcIlxuICNkZWZpbmUgQlNTX1NFQyBcIi5ic3NcIlxuICNkZWZpbmUgUk9EQVRBX1NFQyBcIi5yb2RhdGFcIlxuICNkZWZpbmUgS0NPTkZJR19TRUMgXCIua2NvbmZpZ1wiXG5AQCAtNTU1LDYgKzU1Niw3IEBAIGVudW0gbGliYnBmX21hcF90eXBlIHtcbiBcdExJQkJQRl9NQVBfQlNTLFxuIFx0TElCQlBGX01BUF9ST0RBVEEsXG4gXHRMSUJCUEZfTUFQX0tDT05GSUcsXG4rXHRMSUJCUEZfTUFQX1BFUkNQVSxcbiB9O1xuIFxuIHN0cnVjdCBicGZfbWFwX2RlZiB7XG5AQCAtNjY2LDYgKzY2OCw3IEBAIGVudW0gc2VjX3R5cGUge1xuIFx0U0VDX0RBVEEsXG4gXHRTRUNfUk9EQVRBLFxuIFx0U0VDX1NUX09QUyxcbitcdFNFQ19QRVJDUFUsXG4gfTtcbiBcbiBzdHJ1Y3QgZWxmX3NlY19kZXNjIHtcbkBAIC0xODM5LDYgKzE4NDIsOCBAQCBzdGF0aWMgc2l6ZV90IGJwZl9tYXBfbW1hcF9zeihjb25zdCBzdHJ1Y3QgYnBmX21hcCAqbWFwKVxuIFx0c3dpdGNoIChtYXAtXHUwMDNlZGVmLnR5cGUpIHtcbiBcdGNhc2UgQlBGX01BUF9UWVBFX0FSUkFZOlxuIFx0XHRyZXR1cm4gYXJyYXlfbWFwX21tYXBfc3oobWFwLVx1MDAzZWRlZi52YWx1ZV9zaXplLCBtYXAtXHUwMDNlZGVmLm1heF9lbnRyaWVzKTtcbitcdGNhc2UgQlBGX01BUF9UWVBFX1BFUkNQVV9BUlJBWTpcbitcdFx0cmV0dXJuIG1hcC1cdTAwM2VkZWYudmFsdWVfc2l6ZTtcbiBcdGNhc2UgQlBGX01BUF9UWVBFX0FSRU5BOlxuIFx0XHRyZXR1cm4gcGFnZV9zeiAqIG1hcC1cdTAwM2VkZWYubWF4X2VudHJpZXM7XG4gXHRkZWZhdWx0OlxuQEAgLTE5MzgsNyArMTk0Myw3IEBAIHN0YXRpYyBib29sIG1hcF9pc19tbWFwYWJsZShzdHJ1Y3QgYnBmX29iamVjdCAqb2JqLCBzdHJ1Y3QgYnBmX21hcCAqbWFwKVxuIFx0c3RydWN0IGJ0Zl92YXJfc2VjaW5mbyAqdnNpO1xuIFx0aW50IGksIG47XG4gXG4tXHRpZiAoIW1hcC1cdTAwM2VidGZfdmFsdWVfdHlwZV9pZClcbitcdGlmICghbWFwLVx1MDAzZWJ0Zl92YWx1ZV90eXBlX2lkIHx8IG1hcC1cdTAwM2VsaWJicGZfdHlwZSA9PSBMSUJCUEZfTUFQX1BFUkNQVSlcbiBcdFx0cmV0dXJuIGZhbHNlO1xuIFxuIFx0dCA9IGJ0Zl9fdHlwZV9ieV9pZChvYmotXHUwMDNlYnRmLCBtYXAtXHUwMDNlYnRmX3ZhbHVlX3R5cGVfaWQpO1xuQEAgLTE5NjIsNiArMTk2Nyw3IEBAIHN0YXRpYyBpbnRcbiBicGZfb2JqZWN0X19pbml0X2ludGVybmFsX21hcChzdHJ1Y3QgYnBmX29iamVjdCAqb2JqLCBlbnVtIGxpYmJwZl9tYXBfdHlwZSB0eXBlLFxuIFx0XHRcdCAgICAgIGNvbnN0IGNoYXIgKnJlYWxfbmFtZSwgaW50IHNlY19pZHgsIHZvaWQgKmRhdGEsIHNpemVfdCBkYXRhX3N6KVxuIHtcbitcdGJvb2wgaXNfcGVyY3B1ID0gdHlwZSA9PSBMSUJCUEZfTUFQX1BFUkNQVTtcbiBcdHN0cnVjdCBicGZfbWFwX2RlZiAqZGVmO1xuIFx0c3RydWN0IGJwZl9tYXAgKm1hcDtcbiBcdHNpemVfdCBtbWFwX3N6O1xuQEAgLTE5NzUsNyArMTk4MSw3IEBAIGJwZl9vYmplY3RfX2luaXRfaW50ZXJuYWxfbWFwKHN0cnVjdCBicGZfb2JqZWN0ICpvYmosIGVudW0gbGliYnBmX21hcF90eXBlIHR5cGUsXG4gXHRtYXAtXHUwMDNlc2VjX2lkeCA9IHNlY19pZHg7XG4gXHRtYXAtXHUwMDNlc2VjX29mZnNldCA9IDA7XG4gXHRtYXAtXHUwMDNlcmVhbF9uYW1lID0gc3RyZHVwKHJlYWxfbmFtZSk7XG4tXHRtYXAtXHUwMDNlbmFtZSA9IGludGVybmFsX21hcF9uYW1lKG9iaiwgcmVhbF9uYW1lKTtcbitcdG1hcC1cdTAwM2VuYW1lID0gaXNfcGVyY3B1ID8gc3RyZHVwKHJlYWxfbmFtZSkgOiBpbnRlcm5hbF9tYXBfbmFtZShvYmosIHJlYWxfbmFtZSk7XG4gXHRpZiAoIW1hcC1cdTAwM2VyZWFsX25hbWUgfHwgIW1hcC1cdTAwM2VuYW1lKSB7XG4gXHRcdHpmcmVlKFx1MDAyNm1hcC1cdTAwM2VyZWFsX25hbWUpO1xuIFx0XHR6ZnJlZShcdTAwMjZtYXAtXHUwMDNlbmFtZSk7XG5AQCAtMTk4Myw3ICsxOTg5LDcgQEAgYnBmX29iamVjdF9faW5pdF9pbnRlcm5hbF9tYXAoc3RydWN0IGJwZl9vYmplY3QgKm9iaiwgZW51bSBsaWJicGZfbWFwX3R5cGUgdHlwZSxcbiBcdH1cbiBcbiBcdGRlZiA9IFx1MDAyNm1hcC1cdTAwM2VkZWY7XG4tXHRkZWYtXHUwMDNldHlwZSA9IEJQRl9NQVBfVFlQRV9BUlJBWTtcbitcdGRlZi1cdTAwM2V0eXBlID0gaXNfcGVyY3B1ID8gQlBGX01BUF9UWVBFX1BFUkNQVV9BUlJBWSA6IEJQRl9NQVBfVFlQRV9BUlJBWTtcbiBcdGRlZi1cdTAwM2VrZXlfc2l6ZSA9IHNpemVvZihpbnQpO1xuIFx0ZGVmLVx1MDAzZXZhbHVlX3NpemUgPSBkYXRhX3N6O1xuIFx0ZGVmLVx1MDAzZW1heF9lbnRyaWVzID0gMTtcbkBAIC0xOTk2LDggKzIwMDIsOSBAQCBicGZfb2JqZWN0X19pbml0X2ludGVybmFsX21hcChzdHJ1Y3QgYnBmX29iamVjdCAqb2JqLCBlbnVtIGxpYmJwZl9tYXBfdHlwZSB0eXBlLFxuIFx0aWYgKG1hcF9pc19tbWFwYWJsZShvYmosIG1hcCkpXG4gXHRcdGRlZi1cdTAwM2VtYXBfZmxhZ3MgfD0gQlBGX0ZfTU1BUEFCTEU7XG4gXG4tXHRwcl9kZWJ1ZyhcIm1hcCAnJXMnIChnbG9iYWwgZGF0YSk6IGF0IHNlY19pZHggJWQsIG9mZnNldCAlenUsIGZsYWdzICV4LlxcblwiLFxuLVx0XHQgbWFwLVx1MDAzZW5hbWUsIG1hcC1cdTAwM2VzZWNfaWR4LCBtYXAtXHUwMDNlc2VjX29mZnNldCwgZGVmLVx1MDAzZW1hcF9mbGFncyk7XG4rXHRwcl9kZWJ1ZyhcIm1hcCAnJXMnIChnbG9iYWwgJXNkYXRhKTogYXQgc2VjX2lkeCAlZCwgb2Zmc2V0ICV6dSwgZmxhZ3MgJXguXFxuXCIsXG4rXHRcdCBtYXAtXHUwMDNlbmFtZSwgaXNfcGVyY3B1ID8gXCJwZXJjcHUgXCIgOiBcIlwiLCBtYXAtXHUwMDNlc2VjX2lkeCxcbitcdFx0IG1hcC1cdTAwM2VzZWNfb2Zmc2V0LCBkZWYtXHUwMDNlbWFwX2ZsYWdzKTtcbiBcbiBcdG1tYXBfc3ogPSBicGZfbWFwX21tYXBfc3oobWFwKTtcbiBcdG1hcC1cdTAwM2VtbWFwZWQgPSBtbWFwKE5VTEwsIG1tYXBfc3osIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsXG5AQCAtMjA1Nyw2ICsyMDY0LDEzIEBAIHN0YXRpYyBpbnQgYnBmX29iamVjdF9faW5pdF9nbG9iYWxfZGF0YV9tYXBzKHN0cnVjdCBicGZfb2JqZWN0ICpvYmopXG4gXHRcdFx0XHRcdFx0XHQgICAgTlVMTCxcbiBcdFx0XHRcdFx0XHRcdCAgICBzZWNfZGVzYy1cdTAwM2VkYXRhLVx1MDAzZWRfc2l6ZSk7XG4gXHRcdFx0YnJlYWs7XG4rXHRcdGNhc2UgU0VDX1BFUkNQVTpcbitcdFx0XHRzZWNfbmFtZSA9IGVsZl9zZWNfbmFtZShvYmosIGVsZl9zZWNfYnlfaWR4KG9iaiwgc2VjX2lkeCkpO1xuK1x0XHRcdGVyciA9IGJwZl9vYmplY3RfX2luaXRfaW50ZXJuYWxfbWFwKG9iaiwgTElCQlBGX01BUF9QRVJDUFUsXG4rXHRcdFx0XHRcdFx0XHQgICAgc2VjX25hbWUsIHNlY19pZHgsXG4rXHRcdFx0XHRcdFx0XHQgICAgc2VjX2Rlc2MtXHUwMDNlZGF0YS1cdTAwM2VkX2J1ZixcbitcdFx0XHRcdFx0XHRcdCAgICBzZWNfZGVzYy1cdTAwM2VkYXRhLVx1MDAzZWRfc2l6ZSk7XG4rXHRcdFx0YnJlYWs7XG4gXHRcdGRlZmF1bHQ6XG4gXHRcdFx0Lyogc2tpcCAqL1xuIFx0XHRcdGJyZWFrO1xuQEAgLTQwMTYsNiArNDAzMCwxMSBAQCBzdGF0aWMgaW50IGJwZl9vYmplY3RfX2VsZl9jb2xsZWN0KHN0cnVjdCBicGZfb2JqZWN0ICpvYmopXG4gXHRcdFx0XHRzZWNfZGVzYy1cdTAwM2VzZWNfdHlwZSA9IFNFQ19ST0RBVEE7XG4gXHRcdFx0XHRzZWNfZGVzYy1cdTAwM2VzaGRyID0gc2g7XG4gXHRcdFx0XHRzZWNfZGVzYy1cdTAwM2VkYXRhID0gZGF0YTtcbitcdFx0XHR9IGVsc2UgaWYgKHN0cmNtcChuYW1lLCBQRVJDUFVfU0VDKSA9PSAwIHx8XG4rXHRcdFx0XHQgICBzdHJfaGFzX3BmeChuYW1lLCBQRVJDUFVfU0VDIFwiLlwiKSkge1xuK1x0XHRcdFx0c2VjX2Rlc2MtXHUwMDNlc2VjX3R5cGUgPSBTRUNfUEVSQ1BVO1xuK1x0XHRcdFx0c2VjX2Rlc2MtXHUwMDNlc2hkciA9IHNoO1xuK1x0XHRcdFx0c2VjX2Rlc2MtXHUwMDNlZGF0YSA9IGRhdGE7XG4gXHRcdFx0fSBlbHNlIGlmIChzdHJjbXAobmFtZSwgU1RSVUNUX09QU19TRUMpID09IDAgfHxcbiBcdFx0XHRcdCAgIHN0cmNtcChuYW1lLCBTVFJVQ1RfT1BTX0xJTktfU0VDKSA9PSAwIHx8XG4gXHRcdFx0XHQgICBzdHJjbXAobmFtZSwgXCI/XCIgU1RSVUNUX09QU19TRUMpID09IDAgfHxcbkBAIC00NTQ0LDYgKzQ1NjMsNyBAQCBzdGF0aWMgYm9vbCBicGZfb2JqZWN0X19zaG5keF9pc19kYXRhKGNvbnN0IHN0cnVjdCBicGZfb2JqZWN0ICpvYmosXG4gXHRjYXNlIFNFQ19CU1M6XG4gXHRjYXNlIFNFQ19EQVRBOlxuIFx0Y2FzZSBTRUNfUk9EQVRBOlxuK1x0Y2FzZSBTRUNfUEVSQ1BVOlxuIFx0XHRyZXR1cm4gdHJ1ZTtcbiBcdGRlZmF1bHQ6XG4gXHRcdHJldHVybiBmYWxzZTtcbkBAIC00NTY5LDYgKzQ1ODksOCBAQCBicGZfb2JqZWN0X19zZWN0aW9uX3RvX2xpYmJwZl9tYXBfdHlwZShjb25zdCBzdHJ1Y3QgYnBmX29iamVjdCAqb2JqLCBpbnQgc2huZHgpXG4gXHRcdHJldHVybiBMSUJCUEZfTUFQX0RBVEE7XG4gXHRjYXNlIFNFQ19ST0RBVEE6XG4gXHRcdHJldHVybiBMSUJCUEZfTUFQX1JPREFUQTtcbitcdGNhc2UgU0VDX1BFUkNQVTpcbitcdFx0cmV0dXJuIExJQkJQRl9NQVBfUEVSQ1BVO1xuIFx0ZGVmYXVsdDpcbiBcdFx0cmV0dXJuIExJQkJQRl9NQVBfVU5TUEVDO1xuIFx0fVxuQEAgLTQ5NDQsNyArNDk2Niw3IEBAIHN0YXRpYyBpbnQgbWFwX2ZpbGxfYnRmX3R5cGVfaW5mbyhzdHJ1Y3QgYnBmX29iamVjdCAqb2JqLCBzdHJ1Y3QgYnBmX21hcCAqbWFwKVxuIFxuIFx0LypcbiBcdCAqIExMVk0gYW5ub3RhdGVzIGdsb2JhbCBkYXRhIGRpZmZlcmVudGx5IGluIEJURiwgdGhhdCBpcyxcbi1cdCAqIG9ubHkgYXMgJy5kYXRhJywgJy5ic3MnIG9yICcucm9kYXRhJy5cbitcdCAqIG9ubHkgYXMgJy5kYXRhJywgJy5ic3MnLCAnLnBlcmNwdScgb3IgJy5yb2RhdGEnLlxuIFx0ICovXG4gXHRpZiAoIWJwZl9tYXBfX2lzX2ludGVybmFsKG1hcCkpXG4gXHRcdHJldHVybiAtRU5PRU5UO1xuQEAgLTUyOTcsMTggKzUzMTksMzAgQEAgc3RhdGljIGludFxuIGJwZl9vYmplY3RfX3BvcHVsYXRlX2ludGVybmFsX21hcChzdHJ1Y3QgYnBmX29iamVjdCAqb2JqLCBzdHJ1Y3QgYnBmX21hcCAqbWFwKVxuIHtcbiBcdGVudW0gbGliYnBmX21hcF90eXBlIG1hcF90eXBlID0gbWFwLVx1MDAzZWxpYmJwZl90eXBlO1xuK1x0Ym9vbCBpc19wZXJjcHUgPSBtYXBfdHlwZSA9PSBMSUJCUEZfTUFQX1BFUkNQVTtcbitcdF9fdTY0IHVwZGF0ZV9mbGFncyA9IDA7XG4gXHRpbnQgZXJyLCB6ZXJvID0gMDtcbiBcdHNpemVfdCBtbWFwX3N6O1xuIFxuK1x0aWYgKGlzX3BlcmNwdSkge1xuK1x0XHRpZiAoIW9iai1cdTAwM2VnZW5fbG9hZGVyIFx1MDAyNlx1MDAyNiAha2VybmVsX3N1cHBvcnRzKG9iaiwgRkVBVF9QRVJDUFVfREFUQSkpIHtcbitcdFx0XHRwcl93YXJuKFwibWFwICclcyc6IGtlcm5lbCBkb2VzIG5vdCBzdXBwb3J0IHBlcmNwdSBkYXRhLlxcblwiLFxuK1x0XHRcdFx0YnBmX21hcF9fbmFtZShtYXApKTtcbitcdFx0XHRyZXR1cm4gLUVPUE5PVFNVUFA7XG4rXHRcdH1cbitcbitcdFx0dXBkYXRlX2ZsYWdzID0gQlBGX0ZfQUxMX0NQVVM7XG4rXHR9XG4rXG4gXHRpZiAob2JqLVx1MDAzZWdlbl9sb2FkZXIpIHtcbiBcdFx0YnBmX2dlbl9fbWFwX3VwZGF0ZV9lbGVtKG9iai1cdTAwM2VnZW5fbG9hZGVyLCBtYXAgLSBvYmotXHUwMDNlbWFwcyxcbi1cdFx0XHRcdFx0IG1hcC1cdTAwM2VtbWFwZWQsIG1hcC1cdTAwM2VkZWYudmFsdWVfc2l6ZSk7XG4rXHRcdFx0XHRcdCBtYXAtXHUwMDNlbW1hcGVkLCBtYXAtXHUwMDNlZGVmLnZhbHVlX3NpemUsIHVwZGF0ZV9mbGFncyk7XG4gXHRcdGlmIChtYXBfdHlwZSA9PSBMSUJCUEZfTUFQX1JPREFUQSB8fCBtYXBfdHlwZSA9PSBMSUJCUEZfTUFQX0tDT05GSUcpXG4gXHRcdFx0YnBmX2dlbl9fbWFwX2ZyZWV6ZShvYmotXHUwMDNlZ2VuX2xvYWRlciwgbWFwIC0gb2JqLVx1MDAzZW1hcHMpO1xuIFx0XHRyZXR1cm4gMDtcbiBcdH1cbiBcbi1cdGVyciA9IGJwZl9tYXBfdXBkYXRlX2VsZW0obWFwLVx1MDAzZWZkLCBcdTAwMjZ6ZXJvLCBtYXAtXHUwMDNlbW1hcGVkLCAwKTtcbitcdGVyciA9IGJwZl9tYXBfdXBkYXRlX2VsZW0obWFwLVx1MDAzZWZkLCBcdTAwMjZ6ZXJvLCBtYXAtXHUwMDNlbW1hcGVkLCB1cGRhdGVfZmxhZ3MpO1xuIFx0aWYgKGVycikge1xuIFx0XHRlcnIgPSAtZXJybm87XG4gXHRcdHByX3dhcm4oXCJtYXAgJyVzJzogZmFpbGVkIHRvIHNldCBpbml0aWFsIGNvbnRlbnRzOiAlc1xcblwiLFxuQEAgLTUzNTMsNiArNTM4NywxMyBAQCBicGZfb2JqZWN0X19wb3B1bGF0ZV9pbnRlcm5hbF9tYXAoc3RydWN0IGJwZl9vYmplY3QgKm9iaiwgc3RydWN0IGJwZl9tYXAgKm1hcClcbiBcdFx0XHRyZXR1cm4gZXJyO1xuIFx0XHR9XG4gXHRcdG1hcC1cdTAwM2VtbWFwZWQgPSBtbWFwZWQ7XG4rXHR9IGVsc2UgaWYgKGlzX3BlcmNwdSkge1xuK1x0XHRpZiAobXByb3RlY3QobWFwLVx1MDAzZW1tYXBlZCwgbW1hcF9zeiwgUFJPVF9SRUFEKSkge1xuK1x0XHRcdGVyciA9IC1lcnJubztcbitcdFx0XHRwcl93YXJuKFwibWFwICclcyc6IGZhaWxlZCB0byBtcHJvdGVjdCgpIGNvbnRlbnRzOiAlc1xcblwiLFxuK1x0XHRcdFx0YnBmX21hcF9fbmFtZShtYXApLCBlcnJzdHIoZXJyKSk7XG4rXHRcdFx0cmV0dXJuIGVycjtcbitcdFx0fVxuIFx0fSBlbHNlIGlmIChtYXAtXHUwMDNlbW1hcGVkKSB7XG4gXHRcdG11bm1hcChtYXAtXHUwMDNlbW1hcGVkLCBtbWFwX3N6KTtcbiBcdFx0bWFwLVx1MDAzZW1tYXBlZCA9IE5VTEw7XG5kaWZmIC0tZ2l0IGEvdG9vbHMvbGliL2JwZi9saWJicGZfaW50ZXJuYWwuaCBiL3Rvb2xzL2xpYi9icGYvbGliYnBmX2ludGVybmFsLmhcbmluZGV4IDA0Y2QzMDNmYjVhODc5Li40N2FlMzkxMjVmNjhmOSAxMDA2NDRcbi0tLSBhL3Rvb2xzL2xpYi9icGYvbGliYnBmX2ludGVybmFsLmhcbisrKyBiL3Rvb2xzL2xpYi9icGYvbGliYnBmX2ludGVybmFsLmhcbkBAIC00MDEsNiArNDAxLDggQEAgZW51bSBrZXJuX2ZlYXR1cmVfaWQge1xuIFx0RkVBVF9CVEZfTEFZT1VULFxuIFx0LyogS2VybmVsIHN1cHBvcnRzIEJQRiBzeXNjYWxsIGNvbW1vbiBhdHRyaWJ1dGVzICovXG4gXHRGRUFUX0JQRl9TWVNDQUxMX0NPTU1PTl9BVFRSUyxcbitcdC8qIEtlcm5lbCBzdXBwb3J0cyBwZXJjcHUgZGF0YSAqL1xuK1x0RkVBVF9QRVJDUFVfREFUQSxcbiBcdF9fRkVBVF9DTlQsXG4gfTtcbiBcbmRpZmYgLS1naXQgYS90b29scy9saWIvYnBmL3NrZWxfaW50ZXJuYWwuaCBiL3Rvb2xzL2xpYi9icGYvc2tlbF9pbnRlcm5hbC5oXG5pbmRleCA3NDUwM2QzNThiYzhhNS4uNDg1YjBjZDE3MDE3MzkgMTAwNjQ0XG4tLS0gYS90b29scy9saWIvYnBmL3NrZWxfaW50ZXJuYWwuaFxuKysrIGIvdG9vbHMvbGliL2JwZi9za2VsX2ludGVybmFsLmhcbkBAIC0xMzUsOCArMTM1LDEwIEBAIHN0YXRpYyBpbmxpbmUgdm9pZCBza2VsX2ZyZWVfbWFwX2RhdGEodm9pZCAqcCwgX191NjQgYWRkciwgc2l6ZV90IHN6KVxuIHtcbiBcdGlmIChhZGRyICE9IH4wVUxMKVxuIFx0XHRrdmZyZWUocCk7XG4tXHQvKiBXaGVuIGFkZHIgPT0gfjBVTEwgdGhlICdwJyBwb2ludHMgdG9cbi1cdCAqICgoc3RydWN0IGJwZl9hcnJheSAqKW1hcCktXHUwMDNldmFsdWUuIFNlZSBza2VsX2ZpbmFsaXplX21hcF9kYXRhLlxuK1x0LypcbitcdCAqIFdoZW4gYWRkciA9PSB+MFVMTCB0aGUgaW5pdCBidWZmZXIgaGFzIGFscmVhZHkgYmVlbiByZWxlYXNlZC5cbitcdCAqIEZvciBza2VsX2ZpbmFsaXplX21hcF9kYXRhKCksICdwJyBwb2ludHMgdG9cbitcdCAqICgoc3RydWN0IGJwZl9hcnJheSAqKW1hcCktXHUwMDNldmFsdWUuXG4gXHQgKi9cbiB9XG4gXG5AQCAtMTc0LDYgKzE3NiwxNSBAQCBzdGF0aWMgaW5saW5lIHZvaWQgKnNrZWxfZmluYWxpemVfbWFwX2RhdGEoX191NjQgKmluaXRfdmFsLCBzaXplX3QgbW1hcF9zeiwgaW50XG4gXHRyZXR1cm4gYWRkcjtcbiB9XG4gXG4rc3RhdGljIGlubGluZSBpbnQgc2tlbF9wcm90ZWN0X21hcF9kYXRhKHZvaWQgKnAsIF9fdTY0ICppbml0X3ZhbCwgc2l6ZV90IHN6KVxuK3tcbitcdCh2b2lkKXN6O1xuK1xuK1x0a3ZmcmVlKHApO1xuK1x0KmluaXRfdmFsID0gfjBVTEw7XG4rXHRyZXR1cm4gMDtcbit9XG4rXG4gI2Vsc2VcbiBcbiBzdGF0aWMgaW5saW5lIHZvaWQgKnNrZWxfYWxsb2Moc2l6ZV90IHNpemUpXG5AQCAtMjEyLDYgKzIyMywxNSBAQCBzdGF0aWMgaW5saW5lIHZvaWQgKnNrZWxfZmluYWxpemVfbWFwX2RhdGEoX191NjQgKmluaXRfdmFsLCBzaXplX3QgbW1hcF9zeiwgaW50XG4gXHRcdHJldHVybiBOVUxMO1xuIFx0cmV0dXJuIGFkZHI7XG4gfVxuK1xuK3N0YXRpYyBpbmxpbmUgaW50IHNrZWxfcHJvdGVjdF9tYXBfZGF0YSh2b2lkICpwLCBfX3U2NCAqaW5pdF92YWwsIHNpemVfdCBzeilcbit7XG4rXHQodm9pZClpbml0X3ZhbDtcbitcbitcdGlmIChtcHJvdGVjdChwLCBzeiwgUFJPVF9SRUFEKSlcbitcdFx0cmV0dXJuIC1lcnJubztcbitcdHJldHVybiAwO1xuK31cbiAjZW5kaWZcbiBcbiBzdGF0aWMgaW5saW5lIGludCBza2VsX2Nsb3NlbnooaW50IGZkKVxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9NYWtlZmlsZSBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9NYWtlZmlsZVxuaW5kZXggYjY0MmVlNDg5ZWE2NDAuLmMzN2VkOWU3Yjk3Y2QwIDEwMDY0NFxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL01ha2VmaWxlXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvTWFrZWZpbGVcbkBAIC01MzMsNyArNTMzLDcgQEAgTFNLRUxTX1NJR05FRCA6PSBmZW50cnlfdGVzdC5jIGZleGl0X3Rlc3QuYyBhdG9taWNzLmNcbiBcbiAjIEdlbmVyYXRlIGJvdGggbGlnaHQgc2tlbGV0b24gYW5kIGxpYmJwZiBza2VsZXRvbiBmb3IgdGhlc2VcbiBMU0tFTFNfRVhUUkEgOj0gdGVzdF9rc3ltc19tb2R1bGUuYyB0ZXN0X2tzeW1zX3dlYWsuYyBrZnVuY19jYWxsX3Rlc3QuYyBcXFxuLVx0a2Z1bmNfY2FsbF90ZXN0X3N1YnByb2cuY1xuK1x0a2Z1bmNfY2FsbF90ZXN0X3N1YnByb2cuYyB0ZXN0X2dsb2JhbF9wZXJjcHVfZGF0YS5jXG4gU0tFTF9CTEFDS0xJU1QgKz0gJCQoTFNLRUxTKSAkJChMU0tFTFNfU0lHTkVEKVxuIFxuIHRlc3Rfc3RhdGljX2xpbmtlZC5za2VsLmgtZGVwcyA6PSB0ZXN0X3N0YXRpY19saW5rZWQxLmJwZi5vIHRlc3Rfc3RhdGljX2xpbmtlZDIuYnBmLm9cbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9nbG9iYWxfZGF0YV9pbml0LmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9nbG9iYWxfZGF0YV9pbml0LmNcbmluZGV4IDg0NjYzMzJkNzQwNmY0Li5hNWQ4Nzc2OGY2ZWUyZiAxMDA2NDRcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2dsb2JhbF9kYXRhX2luaXQuY1xuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvZ2xvYmFsX2RhdGFfaW5pdC5jXG5AQCAtMSw1ICsxLDggQEBcbiAvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxuICNpbmNsdWRlIFx1MDAzY3Rlc3RfcHJvZ3MuaFx1MDAzZVxuKyNpbmNsdWRlIFwiYnBmL2xpYmJwZl9pbnRlcm5hbC5oXCJcbisjaW5jbHVkZSBcInRlc3RfZ2xvYmFsX3BlcmNwdV9kYXRhLnNrZWwuaFwiXG4rI2luY2x1ZGUgXCJ0ZXN0X2dsb2JhbF9wZXJjcHVfZGF0YS5sc2tlbC5oXCJcbiBcbiB2b2lkIHRlc3RfZ2xvYmFsX2RhdGFfaW5pdCh2b2lkKVxuIHtcbkBAIC02MCwzICs2MywyOTAgQEAgdm9pZCB0ZXN0X2dsb2JhbF9kYXRhX2luaXQodm9pZClcbiBcdGZyZWUobmV3dmFsKTtcbiBcdGJwZl9vYmplY3RfX2Nsb3NlKG9iaik7XG4gfVxuK1xuK3N0YXRpYyB2b2lkIHRlc3RfcGVyY3B1X2RhdGFfb25fY3B1cyhpbnQgbWFwX2ZkLCBpbnQgcHJvZ19mZCwgaW50IG51bV9vbmxpbmUsIGJvb2wgKm9ubGluZSlcbit7XG4rXHRfX3U2NCBhcmdzWzJdID0gezB4MTIzNFVMTCwgMHg1Njc4VUxMfTtcbitcdExJQkJQRl9PUFRTKGJwZl90ZXN0X3J1bl9vcHRzLCB0b3B0cyxcbitcdFx0ICAgIC5jdHhfaW4gPSBhcmdzLFxuK1x0XHQgICAgLmN0eF9zaXplX2luID0gc2l6ZW9mKGFyZ3MpLFxuK1x0XHQgICAgLmZsYWdzID0gQlBGX0ZfVEVTVF9SVU5fT05fQ1BVLFxuK1x0KTtcbitcdGludCBpLCBlcnIsIGtleSA9IDA7XG4rXG4rXHQvKiBydW4gb24gZXZlcnkgb25saW5lLUNQVSAqL1xuK1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgbnVtX29ubGluZTsgaSsrKSB7XG4rXHRcdHN0cnVjdCB0ZXN0X2dsb2JhbF9wZXJjcHVfZGF0YV9fcGVyY3B1IGRhdGEgPSB7fTtcbitcdFx0X191NjQgZmxhZ3M7XG4rXG4rXHRcdGlmICghb25saW5lW2ldKVxuK1x0XHRcdGNvbnRpbnVlO1xuK1xuK1x0XHR0b3B0cy5jcHUgPSBpO1xuK1x0XHR0b3B0cy5yZXR2YWwgPSAtMTtcbitcdFx0ZXJyID0gYnBmX3Byb2dfdGVzdF9ydW5fb3B0cyhwcm9nX2ZkLCBcdTAwMjZ0b3B0cyk7XG4rXHRcdEFTU0VSVF9PSyhlcnIsIFwiYnBmX3Byb2dfdGVzdF9ydW5fb3B0c1wiKTtcbitcdFx0QVNTRVJUX0VRKHRvcHRzLnJldHZhbCwgMCwgXCJicGZfcHJvZ190ZXN0X3J1bl9vcHRzIHJldHZhbFwiKTtcbitcbitcdFx0ZmxhZ3MgPSAoKF9fdTY0KSBpIFx1MDAzY1x1MDAzYyAzMikgfCBCUEZfRl9DUFU7XG4rXHRcdGVyciA9IGJwZl9tYXBfbG9va3VwX2VsZW1fZmxhZ3MobWFwX2ZkLCBcdTAwMjZrZXksIFx1MDAyNmRhdGEsIGZsYWdzKTtcbitcdFx0aWYgKCFBU1NFUlRfT0soZXJyLCBcImJwZl9tYXBfbG9va3VwX2VsZW1fZmxhZ3NcIikpXG4rXHRcdFx0cmV0dXJuO1xuK1xuK1x0XHRBU1NFUlRfRVEoZGF0YS5kYXRhLCAxLCBcImRhdGEuZGF0YVwiKTtcbitcdFx0QVNTRVJUX1RSVUUoZGF0YS5ydW4sIFwiZGF0YS5ydW5cIik7XG4rXHRcdEFTU0VSVF9FUShkYXRhLm51bXNbNl0sIDB4YzBkZSwgXCJkYXRhLm51bXNbNl1cIik7XG4rXHRcdEFTU0VSVF9FUShkYXRhLnN0cnVjdF9kYXRhLmksIDEsIFwic3RydWN0X2RhdGEuaVwiKTtcbitcdFx0QVNTRVJUX1RSVUUoZGF0YS5zdHJ1Y3RfZGF0YS5zZXQsIFwic3RydWN0X2RhdGEuc2V0XCIpO1xuK1x0XHRBU1NFUlRfRVEoZGF0YS5zdHJ1Y3RfZGF0YS5udW1zWzZdLCAweGMwZGUsIFwic3RydWN0X2RhdGEubnVtc1s2XVwiKTtcbitcdH1cbit9XG4rXG4rc3RhdGljIHZvaWQgdGVzdF9nbG9iYWxfcGVyY3B1X2RhdGFfaW5pdCh2b2lkKVxuK3tcbitcdHN0cnVjdCB0ZXN0X2dsb2JhbF9wZXJjcHVfZGF0YV9fcGVyY3B1IGluaXRfdmFsdWUgPSB7fTtcbitcdHN0cnVjdCB0ZXN0X2dsb2JhbF9wZXJjcHVfZGF0YV9fcGVyY3B1ICppbml0X2RhdGE7XG4rXHRzdHJ1Y3QgdGVzdF9nbG9iYWxfcGVyY3B1X2RhdGEgKnNrZWwgPSBOVUxMO1xuK1x0aW50IHByb2dfZmQsIG1hcF9mZCwgZXJyLCBudW1fb25saW5lO1xuK1x0c2l6ZV90IGluaXRfZGF0YV9zejtcbitcdHN0cnVjdCBicGZfbWFwICptYXA7XG4rXHRib29sICpvbmxpbmU7XG4rXG4rXHRlcnIgPSBwYXJzZV9jcHVfbWFza19maWxlKFwiL3N5cy9kZXZpY2VzL3N5c3RlbS9jcHUvb25saW5lXCIsIFx1MDAyNm9ubGluZSwgXHUwMDI2bnVtX29ubGluZSk7XG4rXHRpZiAoIUFTU0VSVF9PSyhlcnIsIFwicGFyc2VfY3B1X21hc2tfZmlsZVwiKSlcbitcdFx0cmV0dXJuO1xuK1xuK1x0c2tlbCA9IHRlc3RfZ2xvYmFsX3BlcmNwdV9kYXRhX19vcGVuKCk7XG4rXHRpZiAoIUFTU0VSVF9PS19QVFIoc2tlbCwgXCJ0ZXN0X2dsb2JhbF9wZXJjcHVfZGF0YV9fb3BlblwiKSlcbitcdFx0Z290byBvdXQ7XG4rXHRpZiAoIUFTU0VSVF9PS19QVFIoc2tlbC1cdTAwM2VwZXJjcHUsIFwic2tlbC1cdTAwM2VwZXJjcHVcIikpXG4rXHRcdGdvdG8gb3V0O1xuK1xuK1x0QVNTRVJUX0VRKHNrZWwtXHUwMDNlcGVyY3B1LVx1MDAzZWRhdGEsIC0xLCBcInNrZWwtXHUwMDNlcGVyY3B1LVx1MDAzZWRhdGFcIik7XG4rXHRBU1NFUlRfRkFMU0Uoc2tlbC1cdTAwM2VwZXJjcHUtXHUwMDNlcnVuLCBcInNrZWwtXHUwMDNlcGVyY3B1LVx1MDAzZXJ1blwiKTtcbitcdEFTU0VSVF9FUShza2VsLVx1MDAzZXBlcmNwdS1cdTAwM2VudW1zWzZdLCAwLCBcInNrZWwtXHUwMDNlcGVyY3B1LVx1MDAzZW51bXNbNl1cIik7XG4rXHRBU1NFUlRfRVEoc2tlbC1cdTAwM2VwZXJjcHUtXHUwMDNlc3RydWN0X2RhdGEuaSwgLTEsIFwic3RydWN0X2RhdGEuaVwiKTtcbitcdEFTU0VSVF9GQUxTRShza2VsLVx1MDAzZXBlcmNwdS1cdTAwM2VzdHJ1Y3RfZGF0YS5zZXQsIFwic3RydWN0X2RhdGEuc2V0XCIpO1xuK1x0QVNTRVJUX0VRKHNrZWwtXHUwMDNlcGVyY3B1LVx1MDAzZXN0cnVjdF9kYXRhLm51bXNbNl0sIDAsIFwic3RydWN0X2RhdGEubnVtc1s2XVwiKTtcbitcbitcdG1hcCA9IHNrZWwtXHUwMDNlbWFwcy5wZXJjcHU7XG4rXHRpZiAoIUFTU0VSVF9FUShicGZfbWFwX190eXBlKG1hcCksIEJQRl9NQVBfVFlQRV9QRVJDUFVfQVJSQVksIFwiYnBmX21hcF9fdHlwZVwiKSlcbitcdFx0Z290byBvdXQ7XG4rXG4rXHRpbml0X3ZhbHVlLmRhdGEgPSAyO1xuK1x0aW5pdF92YWx1ZS5udW1zWzZdID0gLTE7XG4rXHRpbml0X3ZhbHVlLnN0cnVjdF9kYXRhLmkgPSAyO1xuK1x0aW5pdF92YWx1ZS5zdHJ1Y3RfZGF0YS5udW1zWzZdID0gLTE7XG4rXHRlcnIgPSBicGZfbWFwX19zZXRfaW5pdGlhbF92YWx1ZShtYXAsIFx1MDAyNmluaXRfdmFsdWUsIHNpemVvZihpbml0X3ZhbHVlKSk7XG4rXHRpZiAoIUFTU0VSVF9PSyhlcnIsIFwiYnBmX21hcF9fc2V0X2luaXRpYWxfdmFsdWVcIikpXG4rXHRcdGdvdG8gb3V0O1xuK1xuK1x0aW5pdF9kYXRhID0gYnBmX21hcF9faW5pdGlhbF92YWx1ZShtYXAsIFx1MDAyNmluaXRfZGF0YV9zeik7XG4rXHRpZiAoIUFTU0VSVF9PS19QVFIoaW5pdF9kYXRhLCBcImJwZl9tYXBfX2luaXRpYWxfdmFsdWVcIikpXG4rXHRcdGdvdG8gb3V0O1xuK1xuK1x0QVNTRVJUX0VRKGluaXRfZGF0YS1cdTAwM2VkYXRhLCBpbml0X3ZhbHVlLmRhdGEsIFwiaW5pdF92YWx1ZSBkYXRhXCIpO1xuK1x0QVNTRVJUX0VRKGluaXRfZGF0YS1cdTAwM2VydW4sIGluaXRfdmFsdWUucnVuLCBcImluaXRfdmFsdWUgcnVuXCIpO1xuK1x0QVNTRVJUX0VRKGluaXRfZGF0YS1cdTAwM2VzdHJ1Y3RfZGF0YS5pLCBpbml0X3ZhbHVlLnN0cnVjdF9kYXRhLmksIFwiaW5pdF92YWx1ZSBzdHJ1Y3RfZGF0YS5pXCIpO1xuK1x0QVNTRVJUX0VRKGluaXRfZGF0YS1cdTAwM2VzdHJ1Y3RfZGF0YS5udW1zWzZdLCBpbml0X3ZhbHVlLnN0cnVjdF9kYXRhLm51bXNbNl0sXG4rXHRcdCAgXCJpbml0X3ZhbHVlIHN0cnVjdF9kYXRhLm51bXNbNl1cIik7XG4rXHRBU1NFUlRfRVEoaW5pdF9kYXRhX3N6LCBzaXplb2YoaW5pdF92YWx1ZSksIFwiaW5pdF92YWx1ZSBzaXplXCIpO1xuK1x0QVNTRVJUX0VRKCh2b2lkICopIGluaXRfZGF0YSwgKHZvaWQgKikgc2tlbC1cdTAwM2VwZXJjcHUsIFwic2tlbC1cdTAwM2VwZXJjcHUgZXEgaW5pdF9kYXRhXCIpO1xuK1x0QVNTRVJUX0VRKHNrZWwtXHUwMDNlcGVyY3B1LVx1MDAzZWRhdGEsIGluaXRfdmFsdWUuZGF0YSwgXCJza2VsLVx1MDAzZXBlcmNwdS1cdTAwM2VkYXRhXCIpO1xuK1x0QVNTRVJUX0VRKHNrZWwtXHUwMDNlcGVyY3B1LVx1MDAzZXJ1biwgaW5pdF92YWx1ZS5ydW4sIFwic2tlbC1cdTAwM2VwZXJjcHUtXHUwMDNlcnVuXCIpO1xuK1x0QVNTRVJUX0VRKHNrZWwtXHUwMDNlcGVyY3B1LVx1MDAzZXN0cnVjdF9kYXRhLmksIGluaXRfdmFsdWUuc3RydWN0X2RhdGEuaSxcbitcdFx0ICBcInNrZWwtXHUwMDNlcGVyY3B1LVx1MDAzZXN0cnVjdF9kYXRhLmlcIik7XG4rXHRBU1NFUlRfRVEoc2tlbC1cdTAwM2VwZXJjcHUtXHUwMDNlc3RydWN0X2RhdGEubnVtc1s2XSwgaW5pdF92YWx1ZS5zdHJ1Y3RfZGF0YS5udW1zWzZdLFxuK1x0XHQgIFwic2tlbC1cdTAwM2VwZXJjcHUtXHUwMDNlc3RydWN0X2RhdGEubnVtc1s2XVwiKTtcbitcbitcdGVyciA9IHRlc3RfZ2xvYmFsX3BlcmNwdV9kYXRhX19sb2FkKHNrZWwpO1xuK1x0aWYgKCFBU1NFUlRfT0soZXJyLCBcInRlc3RfZ2xvYmFsX3BlcmNwdV9kYXRhX19sb2FkXCIpKVxuK1x0XHRnb3RvIG91dDtcbitcbitcdEFTU0VSVF9PS19QVFIoc2tlbC1cdTAwM2VwZXJjcHUsIFwic2tlbC1cdTAwM2VwZXJjcHVcIik7XG4rXG4rXHRtYXBfZmQgPSBicGZfbWFwX19mZChtYXApO1xuK1x0cHJvZ19mZCA9IGJwZl9wcm9ncmFtX19mZChza2VsLVx1MDAzZXByb2dzLnVwZGF0ZV9wZXJjcHVfZGF0YSk7XG4rXHR0ZXN0X3BlcmNwdV9kYXRhX29uX2NwdXMobWFwX2ZkLCBwcm9nX2ZkLCBudW1fb25saW5lLCBvbmxpbmUpO1xuK1xuK291dDpcbitcdHRlc3RfZ2xvYmFsX3BlcmNwdV9kYXRhX19kZXN0cm95KHNrZWwpO1xuK1x0ZnJlZShvbmxpbmUpO1xuK31cbitcbitzdGF0aWMgdm9pZCB0ZXN0X2dsb2JhbF9wZXJjcHVfZGF0YV9sc2tlbCh2b2lkKVxuK3tcbitcdHN0cnVjdCB0ZXN0X2dsb2JhbF9wZXJjcHVfZGF0YV9sc2tlbCAqbHNrZWwgPSBOVUxMO1xuK1x0aW50IHByb2dfZmQsIG1hcF9mZCwgZXJyLCBudW1fb25saW5lO1xuK1x0Ym9vbCAqb25saW5lO1xuK1xuK1x0ZXJyID0gcGFyc2VfY3B1X21hc2tfZmlsZShcIi9zeXMvZGV2aWNlcy9zeXN0ZW0vY3B1L29ubGluZVwiLCBcdTAwMjZvbmxpbmUsIFx1MDAyNm51bV9vbmxpbmUpO1xuK1x0aWYgKCFBU1NFUlRfT0soZXJyLCBcInBhcnNlX2NwdV9tYXNrX2ZpbGVcIikpXG4rXHRcdHJldHVybjtcbitcbitcdGxza2VsID0gdGVzdF9nbG9iYWxfcGVyY3B1X2RhdGFfbHNrZWxfX29wZW5fYW5kX2xvYWQoKTtcbitcdGlmICghQVNTRVJUX09LX1BUUihsc2tlbCwgXCJ0ZXN0X2dsb2JhbF9wZXJjcHVfZGF0YV9sc2tlbF9fb3Blbl9hbmRfbG9hZFwiKSlcbitcdFx0Z290byBvdXQ7XG4rXG4rXHRtYXBfZmQgPSBsc2tlbC1cdTAwM2VtYXBzLnBlcmNwdS5tYXBfZmQ7XG4rXHRwcm9nX2ZkID0gbHNrZWwtXHUwMDNlcHJvZ3MudXBkYXRlX3BlcmNwdV9kYXRhLnByb2dfZmQ7XG4rXHR0ZXN0X3BlcmNwdV9kYXRhX29uX2NwdXMobWFwX2ZkLCBwcm9nX2ZkLCBudW1fb25saW5lLCBvbmxpbmUpO1xuK1xuK291dDpcbitcdHRlc3RfZ2xvYmFsX3BlcmNwdV9kYXRhX2xza2VsX19kZXN0cm95KGxza2VsKTtcbitcdGZyZWUob25saW5lKTtcbit9XG4rXG4rc3RhdGljIGludCBjcmVhdGVfcmRvbmx5X3BlcmNwdV9hcnJheSh2b2lkKVxuK3tcbitcdExJQkJQRl9PUFRTKGJwZl9tYXBfY3JlYXRlX29wdHMsIG1hcF9vcHRzLFxuK1x0XHQgICAgLm1hcF9mbGFncyA9IEJQRl9GX1JET05MWV9QUk9HLFxuK1x0KTtcbitcdGludCBrZXkgPSAwLCBtYXBfZmQsIGVycjtcbitcdF9fdTY0IHZhbHVlID0gMDtcbitcbitcdG1hcF9mZCA9IGJwZl9tYXBfY3JlYXRlKEJQRl9NQVBfVFlQRV9QRVJDUFVfQVJSQVksIFwicGVyY3B1X3JvX21hcFwiLCBzaXplb2YoaW50KSxcbitcdFx0XHRcdHNpemVvZihfX3U2NCksIDEsIFx1MDAyNm1hcF9vcHRzKTtcbitcdGlmICghQVNTRVJUX0dFKG1hcF9mZCwgMCwgXCJicGZfbWFwX2NyZWF0ZVwiKSlcbitcdFx0cmV0dXJuIC0xO1xuK1xuK1x0ZXJyID0gYnBmX21hcF91cGRhdGVfZWxlbShtYXBfZmQsIFx1MDAyNmtleSwgXHUwMDI2dmFsdWUsIEJQRl9GX0FMTF9DUFVTKTtcbitcdGlmICghQVNTRVJUX09LKGVyciwgXCJicGZfbWFwX3VwZGF0ZV9lbGVtXCIpKVxuK1x0XHRnb3RvIG91dDtcbitcbitcdGVyciA9IGJwZl9tYXBfZnJlZXplKG1hcF9mZCk7XG4rXHRpZiAoIUFTU0VSVF9PSyhlcnIsIFwiYnBmX21hcF9mcmVlemVcIikpXG4rXHRcdGdvdG8gb3V0O1xuK1xuK1x0cmV0dXJuIG1hcF9mZDtcbitcbitvdXQ6XG4rXHRjbG9zZShtYXBfZmQpO1xuK1x0cmV0dXJuIC0xO1xuK31cbitcbitzdGF0aWMgdm9pZCB0ZXN0X2dsb2JhbF9wZXJjcHVfZGF0YV9yZG9ubHlfZGlyZWN0X3JlYWQodm9pZClcbit7XG4rXHRzdHJ1Y3QgYnBmX2luc24gaW5zbnNbXSA9IHtcbitcdFx0QlBGX0xEX01BUF9WQUxVRShCUEZfUkVHXzEsIDAsIDApLFxuK1x0XHRCUEZfTERYX01FTShCUEZfRFcsIEJQRl9SRUdfMCwgQlBGX1JFR18xLCAwKSxcbitcdFx0QlBGX0VYSVRfSU5TTigpLFxuK1x0fTtcbitcdGludCBtYXBfZmQsIHByb2dfZmQ7XG4rXG4rXHRtYXBfZmQgPSBjcmVhdGVfcmRvbmx5X3BlcmNwdV9hcnJheSgpO1xuK1x0aWYgKG1hcF9mZCBcdTAwM2MgMClcbitcdFx0cmV0dXJuO1xuK1xuK1x0aW5zbnNbMF0uaW1tID0gbWFwX2ZkO1xuK1x0cHJvZ19mZCA9IGJwZl9wcm9nX2xvYWQoQlBGX1BST0dfVFlQRV9TT0NLRVRfRklMVEVSLCBcInBlcmNwdV9yb19wcm9nXCIsIFwiR1BMXCIsIGluc25zLFxuK1x0XHRcdFx0QVJSQVlfU0laRShpbnNucyksIE5VTEwpO1xuK1x0aWYgKEFTU0VSVF9HRShwcm9nX2ZkLCAwLCBcImJwZl9wcm9nX2xvYWRcIikpXG4rXHRcdGNsb3NlKHByb2dfZmQpO1xuK1x0Y2xvc2UobWFwX2ZkKTtcbit9XG4rXG4rc3RhdGljIHZvaWQgdGVzdF9nbG9iYWxfcGVyY3B1X2RhdGFfcmRvbmx5X2RpcmVjdF93cml0ZSh2b2lkKVxuK3tcbitcdExJQkJQRl9PUFRTKGJwZl9wcm9nX2xvYWRfb3B0cywgcHJvZ19vcHRzKTtcbitcdHN0cnVjdCBicGZfaW5zbiBpbnNuc1tdID0ge1xuK1x0XHRCUEZfTERfTUFQX1ZBTFVFKEJQRl9SRUdfMSwgMCwgMCksXG4rXHRcdEJQRl9MRFhfTUVNKEJQRl9EVywgQlBGX1JFR18wLCBCUEZfUkVHXzEsIDApLFxuK1x0XHRCUEZfU1RfTUVNKEJQRl9EVywgQlBGX1JFR18xLCAwLCAwKSxcbitcdFx0QlBGX0VYSVRfSU5TTigpLFxuK1x0fTtcbitcdGNoYXIgbG9nX2J1ZlsyNTZdID0ge307XG4rXHRpbnQgbWFwX2ZkLCBwcm9nX2ZkO1xuK1xuK1x0cHJvZ19vcHRzLmxvZ19idWYgPSBsb2dfYnVmO1xuK1x0cHJvZ19vcHRzLmxvZ19zaXplID0gc2l6ZW9mKGxvZ19idWYpO1xuK1x0cHJvZ19vcHRzLmxvZ19sZXZlbCA9IDE7XG4rXG4rXHRtYXBfZmQgPSBjcmVhdGVfcmRvbmx5X3BlcmNwdV9hcnJheSgpO1xuK1x0aWYgKG1hcF9mZCBcdTAwM2MgMClcbitcdFx0cmV0dXJuO1xuK1xuK1x0aW5zbnNbMF0uaW1tID0gbWFwX2ZkO1xuK1x0cHJvZ19mZCA9IGJwZl9wcm9nX2xvYWQoQlBGX1BST0dfVFlQRV9TT0NLRVRfRklMVEVSLCBcInBlcmNwdV9yb19wcm9nXCIsIFwiR1BMXCIsIGluc25zLFxuK1x0XHRcdFx0QVJSQVlfU0laRShpbnNucyksIFx1MDAyNnByb2dfb3B0cyk7XG4rXHRpZiAoIUFTU0VSVF9MVChwcm9nX2ZkLCAwLCBcImJwZl9wcm9nX2xvYWRcIikpXG4rXHRcdGNsb3NlKHByb2dfZmQpO1xuK1x0ZWxzZVxuK1x0XHRBU1NFUlRfSEFTX1NVQlNUUihsb2dfYnVmLCBcIndyaXRlIGludG8gbWFwIGZvcmJpZGRlblwiLCBcInZlcmlmaWVyIGxvZ1wiKTtcbitcdGNsb3NlKG1hcF9mZCk7XG4rfVxuK1xuK3N0YXRpYyB2b2lkIHRlc3RfZ2xvYmFsX3BlcmNwdV9kYXRhX3ZlcmlmaWVyX2xvZyh2b2lkKVxuK3tcbitcdFJVTl9URVNUUyh0ZXN0X2dsb2JhbF9wZXJjcHVfZGF0YSk7XG4rfVxuK1xuK3N0YXRpYyB2b2lkIHRlc3RfZ2xvYmFsX3BlcmNwdV9kYXRhX2l0ZXIodm9pZClcbit7XG4rXHRERUNMQVJFX0xJQkJQRl9PUFRTKGJwZl9pdGVyX2F0dGFjaF9vcHRzLCBvcHRzKTtcbitcdHN0cnVjdCB0ZXN0X2dsb2JhbF9wZXJjcHVfZGF0YSAqc2tlbDtcbitcdHVuaW9uIGJwZl9pdGVyX2xpbmtfaW5mbyBsaW5mbyA9IHt9O1xuK1x0c3RydWN0IGJwZl9saW5rICpsaW5rID0gTlVMTDtcbitcdGludCBmZCwgbnVtX2NwdXMsIGxlbiwgZXJyO1xuK1x0Y2hhciBidWZbMTZdO1xuK1xuK1x0bnVtX2NwdXMgPSBsaWJicGZfbnVtX3Bvc3NpYmxlX2NwdXMoKTtcbitcdGlmICghQVNTRVJUX0dUKG51bV9jcHVzLCAwLCBcImxpYmJwZl9udW1fcG9zc2libGVfY3B1c1wiKSlcbitcdFx0cmV0dXJuO1xuK1xuK1x0c2tlbCA9IHRlc3RfZ2xvYmFsX3BlcmNwdV9kYXRhX19vcGVuKCk7XG4rXHRpZiAoIUFTU0VSVF9PS19QVFIoc2tlbCwgXCJ0ZXN0X2dsb2JhbF9wZXJjcHVfZGF0YV9fb3BlblwiKSlcbitcdFx0cmV0dXJuO1xuK1xuK1x0c2tlbC1cdTAwM2Vyb2RhdGEtXHUwMDNlbnVtX2NwdXMgPSBudW1fY3B1cztcbitcdHNrZWwtXHUwMDNlcm9kYXRhLVx1MDAzZW9mZnNldG9mX251bSA9IG9mZnNldG9mKHN0cnVjdCB0ZXN0X2dsb2JhbF9wZXJjcHVfZGF0YV9fcGVyY3B1LCBzdHJ1Y3RfZGF0YSk7XG4rXHRza2VsLVx1MDAzZXJvZGF0YS1cdTAwM2VvZmZzZXRvZl9udW0gKz0gc2l6ZW9mKHNrZWwtXHUwMDNlcGVyY3B1LVx1MDAzZXN0cnVjdF9kYXRhKSAtIHNpemVvZihpbnQpO1xuK1x0c2tlbC1cdTAwM2Vyb2RhdGEtXHUwMDNlZWxlbV9zeiA9IHJvdW5kdXAoc2l6ZW9mKHN0cnVjdCB0ZXN0X2dsb2JhbF9wZXJjcHVfZGF0YV9fcGVyY3B1KSwgOCk7XG4rXHRza2VsLVx1MDAzZXBlcmNwdS1cdTAwM2VzdHJ1Y3RfZGF0YS5udW1zWzZdID0gMHhjMGRlO1xuK1xuK1x0ZXJyID0gdGVzdF9nbG9iYWxfcGVyY3B1X2RhdGFfX2xvYWQoc2tlbCk7XG4rXHRpZiAoIUFTU0VSVF9PSyhlcnIsIFwidGVzdF9nbG9iYWxfcGVyY3B1X2RhdGFfX2xvYWRcIikpXG4rXHRcdGdvdG8gb3V0O1xuK1xuK1x0bGluZm8ubWFwLm1hcF9mZCA9IGJwZl9tYXBfX2ZkKHNrZWwtXHUwMDNlbWFwcy5wZXJjcHUpO1xuK1x0b3B0cy5saW5rX2luZm8gPSBcdTAwMjZsaW5mbztcbitcdG9wdHMubGlua19pbmZvX2xlbiA9IHNpemVvZihsaW5mbyk7XG4rXHRsaW5rID0gYnBmX3Byb2dyYW1fX2F0dGFjaF9pdGVyKHNrZWwtXHUwMDNlcHJvZ3MuZHVtcF9wZXJjcHVfZGF0YSwgXHUwMDI2b3B0cyk7XG4rXHRpZiAoIUFTU0VSVF9PS19QVFIobGluaywgXCJicGZfcHJvZ3JhbV9fYXR0YWNoX2l0ZXJcIikpXG4rXHRcdGdvdG8gb3V0O1xuK1xuK1x0ZmQgPSBicGZfaXRlcl9jcmVhdGUoYnBmX2xpbmtfX2ZkKGxpbmspKTtcbitcdGlmICghQVNTRVJUX0dFKGZkLCAwLCBcImJwZl9pdGVyX2NyZWF0ZVwiKSlcbitcdFx0Z290byBvdXQ7XG4rXG4rXHR3aGlsZSAoKGxlbiA9IHJlYWQoZmQsIGJ1Ziwgc2l6ZW9mKGJ1ZikpKSBcdTAwM2UgMClcbitcdFx0ZG8geyB9IHdoaWxlICgwKTtcbitcdEFTU0VSVF9FUShsZW4sIDAsIFwicmVhZCBpdGVyXCIpO1xuK1x0QVNTRVJUX1RSVUUoc2tlbC1cdTAwM2Vic3MtXHUwMDNlcnVuX2l0ZXIsIFwicnVuX2l0ZXJcIik7XG4rXHRBU1NFUlRfRVEoc2tlbC1cdTAwM2Vic3MtXHUwMDNlcGVyY3B1X2RhdGFfc3VtLCAweGMwZGUgKiBudW1fY3B1cywgXCJwZXJjcHVfZGF0YV9zdW1cIik7XG4rXG4rXHRjbG9zZShmZCk7XG4rb3V0OlxuK1x0YnBmX2xpbmtfX2Rlc3Ryb3kobGluayk7XG4rXHR0ZXN0X2dsb2JhbF9wZXJjcHVfZGF0YV9fZGVzdHJveShza2VsKTtcbit9XG4rXG4rdm9pZCB0ZXN0X2dsb2JhbF9wZXJjcHVfZGF0YSh2b2lkKVxuK3tcbitcdGlmICghZmVhdF9zdXBwb3J0ZWQoTlVMTCwgRkVBVF9QRVJDUFVfREFUQSkpIHtcbitcdFx0dGVzdF9fc2tpcCgpO1xuK1x0XHRyZXR1cm47XG4rXHR9XG4rXG4rXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcImluaXRcIikpXG4rXHRcdHRlc3RfZ2xvYmFsX3BlcmNwdV9kYXRhX2luaXQoKTtcbitcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwibHNrZWxcIikpXG4rXHRcdHRlc3RfZ2xvYmFsX3BlcmNwdV9kYXRhX2xza2VsKCk7XG4rXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcInJkb25seV9kaXJlY3RfcmVhZFwiKSlcbitcdFx0dGVzdF9nbG9iYWxfcGVyY3B1X2RhdGFfcmRvbmx5X2RpcmVjdF9yZWFkKCk7XG4rXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcInJkb25seV9kaXJlY3Rfd3JpdGVcIikpXG4rXHRcdHRlc3RfZ2xvYmFsX3BlcmNwdV9kYXRhX3Jkb25seV9kaXJlY3Rfd3JpdGUoKTtcbitcdHRlc3RfZ2xvYmFsX3BlcmNwdV9kYXRhX3ZlcmlmaWVyX2xvZygpO1xuK1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCJpdGVyXCIpKVxuK1x0XHR0ZXN0X2dsb2JhbF9wZXJjcHVfZGF0YV9pdGVyKCk7XG4rfVxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2dsb2JhbF9wZXJjcHVfc3Vic2tlbC5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvZ2xvYmFsX3BlcmNwdV9zdWJza2VsLmNcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwMC4uOGFlYmQ1MzNkODZiNTRcbi0tLSAvZGV2L251bGxcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2dsb2JhbF9wZXJjcHVfc3Vic2tlbC5jXG5AQCAtMCwwICsxLDM3IEBAXG4rLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcbisjaW5jbHVkZSBcdTAwM2N0ZXN0X3Byb2dzLmhcdTAwM2VcbisjaW5jbHVkZSBcInRlc3RfZ2xvYmFsX3BlcmNwdV9kYXRhLnN1YnNrZWwuaFwiXG4rXG4rdm9pZCB0ZXN0X2dsb2JhbF9wZXJjcHVfZGF0YV9zdWJza2VsKHZvaWQpXG4re1xuK1x0c3RydWN0IHRlc3RfZ2xvYmFsX3BlcmNwdV9kYXRhICpzdWJza2VsID0gTlVMTDtcbitcdHN0cnVjdCBicGZfb2JqZWN0ICpvYmo7XG4rXHRpbnQgaTtcbitcbitcdG9iaiA9IGJwZl9vYmplY3RfX29wZW5fZmlsZShcIi4vdGVzdF9nbG9iYWxfcGVyY3B1X2RhdGEuYnBmLm9cIiwgTlVMTCk7XG4rXHRpZiAoIUFTU0VSVF9PS19QVFIob2JqLCBcImJwZl9vYmplY3RfX29wZW5fZmlsZVwiKSlcbitcdFx0cmV0dXJuO1xuK1xuK1x0c3Vic2tlbCA9IHRlc3RfZ2xvYmFsX3BlcmNwdV9kYXRhX19vcGVuKG9iaik7XG4rXHRpZiAoIUFTU0VSVF9PS19QVFIoc3Vic2tlbCwgXCJ0ZXN0X2dsb2JhbF9wZXJjcHVfZGF0YV9fb3BlblwiKSlcbitcdFx0Z290byBvdXQ7XG4rXG4rXHRpZiAoIUFTU0VSVF9PS19QVFIoc3Vic2tlbC1cdTAwM2VzdWJza2VsLCBcInN1YnNrZWxcIikpXG4rXHRcdGdvdG8gb3V0O1xuK1x0aWYgKCFBU1NFUlRfT0tfUFRSKHN1YnNrZWwtXHUwMDNlbWFwcy5wZXJjcHUsIFwibWFwcy5wZXJjcHVcIikpXG4rXHRcdGdvdG8gb3V0O1xuK1x0QVNTRVJUX0VRKGJwZl9tYXBfX3R5cGUoc3Vic2tlbC1cdTAwM2VtYXBzLnBlcmNwdSksIEJQRl9NQVBfVFlQRV9QRVJDUFVfQVJSQVksXG4rXHRcdCAgXCJwZXJjcHVfbWFwX3R5cGVcIik7XG4rXHRBU1NFUlRfR1Qoc3Vic2tlbC1cdTAwM2VzdWJza2VsLVx1MDAzZXZhcl9jbnQsIDAsIFwidmFyX2NudFwiKTtcbitcbitcdGZvciAoaSA9IDA7IGkgXHUwMDNjIHN1YnNrZWwtXHUwMDNlc3Vic2tlbC1cdTAwM2V2YXJfY250OyBpKyspIHtcbitcdFx0Y29uc3Qgc3RydWN0IGJwZl92YXJfc2tlbGV0b24gKnZhcjtcbitcbitcdFx0dmFyID0gKHZvaWQgKikgc3Vic2tlbC1cdTAwM2VzdWJza2VsLVx1MDAzZXZhcnMgKyBpICogc3Vic2tlbC1cdTAwM2VzdWJza2VsLVx1MDAzZXZhcl9za2VsX3N6O1xuK1x0XHRBU1NFUlRfTkVRKHZhci1cdTAwM2VtYXAsIFx1MDAyNnN1YnNrZWwtXHUwMDNlbWFwcy5wZXJjcHUsIFwidmFyXCIpO1xuK1x0fVxuK1xuK291dDpcbitcdHRlc3RfZ2xvYmFsX3BlcmNwdV9kYXRhX19kZXN0cm95KHN1YnNrZWwpO1xuK1x0YnBmX29iamVjdF9fY2xvc2Uob2JqKTtcbit9XG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL3Rlc3RfZ2xvYmFsX3BlcmNwdV9kYXRhLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvdGVzdF9nbG9iYWxfcGVyY3B1X2RhdGEuY1xubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAwLi5lZWY4OGZkNjFhZjUxMVxuLS0tIC9kZXYvbnVsbFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL3Rlc3RfZ2xvYmFsX3BlcmNwdV9kYXRhLmNcbkBAIC0wLDAgKzEsNzkgQEBcbisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxuKyNpbmNsdWRlIFx1MDAzY3ZtbGludXguaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2JwZi9icGZfaGVscGVycy5oXHUwMDNlXG4rI2luY2x1ZGUgXCJicGZfbWlzYy5oXCJcbitcbitpbnQgZGF0YSBTRUMoXCIucGVyY3B1XCIpID0gLTE7XG4raW50IG51bXNbN10gU0VDKFwiLnBlcmNwdVwiKTtcbitjaGFyIHJ1biBTRUMoXCIucGVyY3B1XCIpID0gMDtcbitzdHJ1Y3Qge1xuK1x0Y2hhciBzZXQ7XG4rXHRpbnQgaTtcbitcdGludCBudW1zWzddO1xuK30gc3RydWN0X2RhdGEgU0VDKFwiLnBlcmNwdVwiKSA9IHtcbitcdC5zZXQgPSAwLFxuK1x0LmkgPSAtMSxcbit9O1xuK1xuK1NFQyhcInJhd190cC90YXNrX3JlbmFtZVwiKVxuK19fYXV4aWxpYXJ5XG4raW50IHVwZGF0ZV9wZXJjcHVfZGF0YSh2b2lkICpjdHgpXG4re1xuK1x0c3RydWN0X2RhdGEubnVtc1s2XSA9IDB4YzBkZTtcbitcdHN0cnVjdF9kYXRhLnNldCA9IDE7XG4rXHRzdHJ1Y3RfZGF0YS5pID0gMTtcbitcdG51bXNbNl0gPSAweGMwZGU7XG4rXHRkYXRhID0gMTtcbitcdHJ1biA9IDE7XG4rXHRyZXR1cm4gMDtcbit9XG4rXG4rc3RhdGljIGNvbnN0IGNoYXIgZm10W10gU0VDKFwiLnBlcmNwdS5mbXRcIikgPSBcImRhdGEgJWRcXG5cIjtcbitcbitTRUMoXCI/a3Byb2JlXCIpXG4rX19mYWlsdXJlIF9fbXNnKFwiUnt7WzAtOV0rfX0gcG9pbnRzIHRvIHBlcmNwdV9hcnJheSBtYXAgd2hpY2ggY2Fubm90IGJlIHVzZWQgYXMgY29uc3Qgc3RyaW5nXCIpXG4raW50IHZlcmlmaWVyX3N0cm5jbXAodm9pZCAqY3R4KVxuK3tcbitcdHJldHVybiBicGZfc3RybmNtcChcInRlc3RcIiwgNSwgZm10KTtcbit9XG4rXG4rU0VDKFwiP2twcm9iZVwiKVxuK19fZmFpbHVyZSBfX21zZyhcIlJ7e1swLTldK319IHBvaW50cyB0byBwZXJjcHVfYXJyYXkgbWFwIHdoaWNoIGNhbm5vdCBiZSB1c2VkIGFzIGNvbnN0IHN0cmluZ1wiKVxuK2ludCB2ZXJpZmllcl9zbnByaW50Zih2b2lkICpjdHgpXG4re1xuK1x0dTY0IGFyZ3NbXSA9IHsgZGF0YSB9O1xuK1x0Y2hhciBidWZbMTI4XTtcbitcdGludCBsZW47XG4rXG4rXHRsZW4gPSBicGZfc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgZm10LCBhcmdzLCBzaXplb2YoYXJncykpO1xuK1x0aWYgKGxlbiBcdTAwM2UgMClcbitcdFx0YnBmX3ByaW50ayhcInNucHJpbnRmOiAlc1xcblwiLCBidWYpO1xuK1x0cmV0dXJuIDA7XG4rfVxuK1xuK3ZvbGF0aWxlIGNvbnN0IF9fdTMyIG51bV9jcHVzID0gMDtcbit2b2xhdGlsZSBjb25zdCBpbnQgb2Zmc2V0b2ZfbnVtO1xuK3ZvbGF0aWxlIGNvbnN0IGludCBlbGVtX3N6O1xuK19fdTMyIHBlcmNwdV9kYXRhX3N1bSA9IDA7XG4rYm9vbCBydW5faXRlciA9IGZhbHNlO1xuK1xuK1NFQyhcIml0ZXIvYnBmX21hcF9lbGVtXCIpXG4rX19hdXhpbGlhcnlcbitpbnQgZHVtcF9wZXJjcHVfZGF0YShzdHJ1Y3QgYnBmX2l0ZXJfX2JwZl9tYXBfZWxlbSAqY3R4KVxuK3tcbitcdHZvaWQgKnBwdHIgPSBjdHgtXHUwMDNldmFsdWU7XG4rXHRpbnQgaTtcbitcbitcdGlmICghcHB0cilcbitcdFx0cmV0dXJuIDA7XG4rXG4rXHRydW5faXRlciA9IHRydWU7XG4rXG4rXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBudW1fY3B1czsgaSsrKSB7XG4rXHRcdHBlcmNwdV9kYXRhX3N1bSArPSAqKGludCAqKSAocHB0ciArIG9mZnNldG9mX251bSk7XG4rXHRcdHBwdHIgKz0gZWxlbV9zejtcbitcdH1cbitcdHJldHVybiAwO1xuK31cbitcbitjaGFyIF9saWNlbnNlW10gU0VDKFwibGljZW5zZVwiKSA9IFwiR1BMXCI7XG4iLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wNi0yOVQxNjozOTozMS43MTk3MDQ4NjNaIiwiU2VxIjozLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjoxNjQ2MjczMzA0MiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipNeSBCUEYgUGVyLUNQVSBNYXAgSW1wbGVtZW50YXRpb24gQXNzZXNzbWVudCoqXG5cbk9rYXksIHNvIEknbSBsb29raW5nIGF0IHRoaXMgcGF0Y2ggaW50cm9kdWNpbmcgYC5wZXJjcHVgIG1hcCBzdXBwb3J0IHdpdGhpbiBCUEYsIGFuZCBteSBpbml0aWFsIHRob3VnaHQgaXMsIFwiVGhpcyBpcyBhIHByZXR0eSBzaWduaWZpY2FudCBhZGRpdGlvbi5cIiBJdCB0b3VjaGVzIHNldmVyYWwga2V5IGZpbGVzLCBzcGVjaWZpY2FsbHkgYGFycmF5bWFwLmNgLCBgY29uc3RfZm9sZC5jYCwgYGZpeHVwcy5jYCwgYW5kIHRoZSB2ZXJpZmllciwgc28gd2UncmUgdGFsa2luZyBhYm91dCBhIGZhaXIgYW1vdW50IG9mIHVuZGVybHlpbmcgbWVjaGFuaXNtIGNoYW5nZXMuIEkgc2VlIHRoYXQgaXQgaW50cm9kdWNlcyBgQlBGX01BUF9UWVBFX1BFUkNQVV9BUlJBWWAgYXMgYSBuZXcgbWFwIHR5cGUsIHdoaWNoIGFsbG93cyBmb3IgYC5wZXJjcHVgIHNlY3Rpb25zIHRvIGJlIHVzZWQgYW5kIHRyYW5zbGF0ZWQuIFRoYXQgc2VlbXMgY2xlYW4gZW5vdWdoLiBTcGVjaWZpY2FsbHksIGl0IHNlZW1zIGl0IGludHJvZHVjZXMgbmV3IGZ1bmN0aW9ucyBgcGVyY3B1X2FycmF5X21hcF9kaXJlY3RfdmFsdWVfYWRkcmAgYW5kIGBwZXJjcHVfYXJyYXlfbWFwX2RpcmVjdF92YWx1ZV9tZXRhYCB3aXRoaW4gYHBlcmNwdV9hcnJheV9tYXBfb3BzYCwgd2hpY2ggYXJlIGNyaXRpY2FsIGFkZGl0aW9ucy5cblxuVGhlIGNydWNpYWwgYXNwZWN0IHNlZW1zIHRvIGJlIGhvdyBpdCBoYW5kbGVzIHRoZSBpbnN0cnVjdGlvbiBmaXh1cHMuIE1vZGlmeWluZyBgYnBmX2RvX21pc2NfZml4dXBzYCB0byBwYXRjaCBgQlBGX0xEIHwgQlBGX0lNTSB8IEJQRl9EV2AgaW5zdHJ1Y3Rpb25zIHRoYXQgbG9hZCBmcm9tIHRoZSBwZXJjcHUgYXJyYXkgdG8gdXNlIGBCUEZfTU9WNjRfUEVSQ1BVX1JFR2AgaXMgZ29pbmcgdG8gYmUgYSBmb2N1cy4gVGhpcyBpcyBhIGZ1bmN0aW9uYWwgY2hhbmdlLCBhbmQgZ2l2ZW4gaXRzIHNjb3BlLCBpdCdzIGRlZmluaXRlbHkgYSBjYW5kaWRhdGUgZm9yIHRob3JvdWdoIGZ1enppbmcuXG5cbk5vdywgbGV0J3MgbmFpbCBkb3duIHRoZSBjb25maWd1cmF0aW9uIGRlcGVuZGVuY2llcy4gYENPTkZJR19CUEZfU1lTQ0FMTGAgaXMgYSBnaXZlbiwgb2YgY291cnNlLiBTaW5jZSB3ZSdyZSBkZWFsaW5nIHdpdGggcGVyY3B1IGRhdGEsIGFuZCBJIG5lZWQgdGhlIEpJVCBmb3IgcGVyZm9ybWFuY2UsIEknbGwgbmVlZCBgQ09ORklHX0JQRl9KSVRgIGFzIHdlbGwuXG5cbk1vdmluZyBvbnRvIHRoZSBzeW1ib2xzLCBJJ20gZ29pbmcgdG8gd2FudCB0byB0cmFjayB0aGVzZSBzcGVjaWZpY2FsbHk6XG4qICAgYHBlcmNwdV9hcnJheV9tYXBfZGlyZWN0X3ZhbHVlX2FkZHJgXG4qICAgYHBlcmNwdV9hcnJheV9tYXBfZGlyZWN0X3ZhbHVlX21ldGFgXG4qICAgYGJwZl9kb19taXNjX2ZpeHVwc2AgKGFsdGhvdWdoIHRoaXMgaXMgYSBtb3JlIGdlbmVyaWMgZnVuY3Rpb24sIHRoZSBwYXRjaCBzcGVjaWZpY2FsbHkgdGFyZ2V0cyBhIG5ldyBicmFuY2ggaGVyZSwgc28gaXQgaXMgaGlnaC1wcmlvcml0eSlcbiogICBgYXJyYXlfbWFwX2NoZWNrX2J0ZmAgKG1vZGlmaWVkKVxuKiAgIGBjaGVja19hbmRfcmVzb2x2ZV9pbnNuc2AgKG1vZGlmaWVkKVxuXG5JJ2xsIGNoZWNrIHRoZSBkZWZpbml0aW9uIG9mIGBicGZfaml0X3N1cHBvcnRzX3BlcmNwdV9pbnNuYC4gSSdsbCB1c2UgYGdyZXBwZXJgIHRvIGRldGVybWluZSB0aGUgc3BlY2lmaWMgYXJjaGl0ZWN0dXJlcyB0aGF0IGFjdHVhbGx5IHN1cHBvcnQgdGhpcy4gVGhpcyB3aWxsIGluZm9ybSBteSBmdXp6aW5nIHRhcmdldCBsaXN0LlxuXG5cbiIsIklucHV0VG9rZW5zIjoxODc1OCwiT3V0cHV0VG9rZW5zIjoyNiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjQ1MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA2LTI5VDE2OjM5OjQ4LjE4MjQ0MjAyNVoiLCJTZXEiOjQsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjozMjgwNzE2NjQ1LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImJwZl9qaXRfc3VwcG9ydHNfcGVyY3B1X2luc25cIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiYXJjaC9hcm02NC9uZXQvYnBmX2ppdF9jb21wLmM9MzE3MT1ib29sIGJwZl9qaXRfc3VwcG9ydHNfaW5zbihzdHJ1Y3QgYnBmX2luc24gKmluc24sIGJvb2wgaW5fYXJlbmEpXFxuLS1cXG5hcmNoL2FybTY0L25ldC9icGZfaml0X2NvbXAuYy0zMTg0LVxcbmFyY2gvYXJtNjQvbmV0L2JwZl9qaXRfY29tcC5jOjMxODU6Ym9vbCBicGZfaml0X3N1cHBvcnRzX3BlcmNwdV9pbnNuKHZvaWQpXFxuYXJjaC9hcm02NC9uZXQvYnBmX2ppdF9jb21wLmMtMzE4Ni17XFxuLS1cXG5hcmNoL3Bvd2VycGMvbmV0L2JwZl9qaXRfY29tcC5jPTU1Nj1ib29sIGJwZl9qaXRfc3VwcG9ydHNfaW5zbihzdHJ1Y3QgYnBmX2luc24gKmluc24sIGJvb2wgaW5fYXJlbmEpXFxuLS1cXG5hcmNoL3Bvd2VycGMvbmV0L2JwZl9qaXRfY29tcC5jLTU3MS1cXG5hcmNoL3Bvd2VycGMvbmV0L2JwZl9qaXRfY29tcC5jOjU3Mjpib29sIGJwZl9qaXRfc3VwcG9ydHNfcGVyY3B1X2luc24odm9pZClcXG5hcmNoL3Bvd2VycGMvbmV0L2JwZl9qaXRfY29tcC5jLTU3My17XFxuLS1cXG5hcmNoL3Jpc2N2L25ldC9icGZfaml0X2NvbXA2NC5jPTIxMjA9Ym9vbCBicGZfaml0X3N1cHBvcnRzX2luc24oc3RydWN0IGJwZl9pbnNuICppbnNuLCBib29sIGluX2FyZW5hKVxcbi0tXFxuYXJjaC9yaXNjdi9uZXQvYnBmX2ppdF9jb21wNjQuYy0yMTM4LVxcbmFyY2gvcmlzY3YvbmV0L2JwZl9qaXRfY29tcDY0LmM6MjEzOTpib29sIGJwZl9qaXRfc3VwcG9ydHNfcGVyY3B1X2luc24odm9pZClcXG5hcmNoL3Jpc2N2L25ldC9icGZfaml0X2NvbXA2NC5jLTIxNDAte1xcbi0tXFxuYXJjaC94ODYvbmV0L2JwZl9qaXRfY29tcC5jPTQwNjA9Ym9vbCBicGZfaml0X3N1cHBvcnRzX3N1YnByb2dfdGFpbGNhbGxzKHZvaWQpXFxuLS1cXG5hcmNoL3g4Ni9uZXQvYnBmX2ppdF9jb21wLmMtNDA2NC1cXG5hcmNoL3g4Ni9uZXQvYnBmX2ppdF9jb21wLmM6NDA2NTpib29sIGJwZl9qaXRfc3VwcG9ydHNfcGVyY3B1X2luc24odm9pZClcXG5hcmNoL3g4Ni9uZXQvYnBmX2ppdF9jb21wLmMtNDA2Ni17XFxuLS1cXG5pbmNsdWRlL2xpbnV4L2ZpbHRlci5oPTExODE9Ym9vbCBicGZfaml0X3N1cHBvcnRzX3N1YnByb2dfdGFpbGNhbGxzKHZvaWQpO1xcbmluY2x1ZGUvbGludXgvZmlsdGVyLmg6MTE4Mjpib29sIGJwZl9qaXRfc3VwcG9ydHNfcGVyY3B1X2luc24odm9pZCk7XFxuaW5jbHVkZS9saW51eC9maWx0ZXIuaC0xMTgzLWJvb2wgYnBmX2ppdF9zdXBwb3J0c19rZnVuY19jYWxsKHZvaWQpO1xcbi0tXFxua2VybmVsL2JwZi9hcnJheW1hcC5jPTI2Mj1zdGF0aWMgaW50IHBlcmNwdV9hcnJheV9tYXBfZGlyZWN0X3ZhbHVlX2FkZHIoY29uc3Qgc3RydWN0IGJwZl9tYXAgKm1hcCwgdTY0ICppbW0sIHUzMiBvZmYpXFxuLS1cXG5rZXJuZWwvYnBmL2FycmF5bWFwLmMtMjY5LVxcdFxcdHJldHVybiAtRUlOVkFMO1xcbmtlcm5lbC9icGYvYXJyYXltYXAuYzoyNzA6XFx0aWYgKCFicGZfaml0X3N1cHBvcnRzX3BlcmNwdV9pbnNuKCkpXFxua2VybmVsL2JwZi9hcnJheW1hcC5jLTI3MS1cXHRcXHRyZXR1cm4gLUVPUE5PVFNVUFA7XFxuLS1cXG5rZXJuZWwvYnBmL2FycmF5bWFwLmM9Mjc3PXN0YXRpYyBpbnQgcGVyY3B1X2FycmF5X21hcF9kaXJlY3RfdmFsdWVfbWV0YShjb25zdCBzdHJ1Y3QgYnBmX21hcCAqbWFwLCB1NjQgaW1tLCB1MzIgKm9mZilcXG4tLVxcbmtlcm5lbC9icGYvYXJyYXltYXAuYy0yODUtXFx0XFx0cmV0dXJuIC1FTk9FTlQ7XFxua2VybmVsL2JwZi9hcnJheW1hcC5jOjI4NjpcXHRpZiAoIWJwZl9qaXRfc3VwcG9ydHNfcGVyY3B1X2luc24oKSlcXG5rZXJuZWwvYnBmL2FycmF5bWFwLmMtMjg3LVxcdFxcdHJldHVybiAtRU9QTk9UU1VQUDtcXG4tLVxcbmtlcm5lbC9icGYvYXJyYXltYXAuYz0yOTQ9c3RhdGljIGludCBwZXJjcHVfYXJyYXlfbWFwX2dlbl9sb29rdXAoc3RydWN0IGJwZl9tYXAgKm1hcCwgc3RydWN0IGJwZl9pbnNuICppbnNuX2J1ZilcXG4tLVxcbmtlcm5lbC9icGYvYXJyYXltYXAuYy0yOTgtXFxua2VybmVsL2JwZi9hcnJheW1hcC5jOjI5OTpcXHRpZiAoIWJwZl9qaXRfc3VwcG9ydHNfcGVyY3B1X2luc24oKSlcXG5rZXJuZWwvYnBmL2FycmF5bWFwLmMtMzAwLVxcdFxcdHJldHVybiAtRU9QTk9UU1VQUDtcXG4tLVxcbmtlcm5lbC9icGYvY29yZS5jPTMyMjY9Ym9vbCBfX3dlYWsgYnBmX2ppdF9zdXBwb3J0c19zdWJwcm9nX3RhaWxjYWxscyh2b2lkKVxcbi0tXFxua2VybmVsL2JwZi9jb3JlLmMtMzIzMC1cXG5rZXJuZWwvYnBmL2NvcmUuYzozMjMxOmJvb2wgX193ZWFrIGJwZl9qaXRfc3VwcG9ydHNfcGVyY3B1X2luc24odm9pZClcXG5rZXJuZWwvYnBmL2NvcmUuYy0zMjMyLXtcXG4tLVxcbmtlcm5lbC9icGYvZml4dXBzLmM9MTQ4MT1pbnQgYnBmX2RvX21pc2NfZml4dXBzKHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYpXFxuLS1cXG5rZXJuZWwvYnBmL2ZpeHVwcy5jLTE4MjItXFx0XFx0aWYgKGVudi1cXHUwMDNlcHJvZy1cXHUwMDNlaml0X3JlcXVlc3RlZCBcXHUwMDI2XFx1MDAyNlxcbmtlcm5lbC9icGYvZml4dXBzLmM6MTgyMzpcXHRcXHQgICAgYnBmX2ppdF9zdXBwb3J0c19wZXJjcHVfaW5zbigpIFxcdTAwMjZcXHUwMDI2XFxua2VybmVsL2JwZi9maXh1cHMuYy0xODI0LVxcdFxcdCAgICBpbnNuLVxcdTAwM2Vjb2RlID09IChCUEZfTEQgfCBCUEZfSU1NIHwgQlBGX0RXKSBcXHUwMDI2XFx1MDAyNlxcbi0tXFxua2VybmVsL2JwZi9oYXNodGFiLmM9MjQxNT1zdGF0aWMgaW50IGh0YWJfcGVyY3B1X21hcF9nZW5fbG9va3VwKHN0cnVjdCBicGZfbWFwICptYXAsIHN0cnVjdCBicGZfaW5zbiAqaW5zbl9idWYpXFxuLS1cXG5rZXJuZWwvYnBmL2hhc2h0YWIuYy0yNDE4LVxcbmtlcm5lbC9icGYvaGFzaHRhYi5jOjI0MTk6XFx0aWYgKCFicGZfaml0X3N1cHBvcnRzX3BlcmNwdV9pbnNuKCkpXFxua2VybmVsL2JwZi9oYXNodGFiLmMtMjQyMC1cXHRcXHRyZXR1cm4gLUVPUE5PVFNVUFA7XFxuLS1cXG5rZXJuZWwvYnBmL3ZlcmlmaWVyLmM9MTY2NjM9Ym9vbCBicGZfdmVyaWZpZXJfaW5saW5lc19oZWxwZXJfY2FsbChzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52LCBzMzIgaW1tKVxcbi0tXFxua2VybmVsL2JwZi92ZXJpZmllci5jLTE2NjcxLSNlbmRpZlxcbmtlcm5lbC9icGYvdmVyaWZpZXIuYzoxNjY3MjpcXHRcXHRyZXR1cm4gZW52LVxcdTAwM2Vwcm9nLVxcdTAwM2VqaXRfcmVxdWVzdGVkIFxcdTAwMjZcXHUwMDI2IGJwZl9qaXRfc3VwcG9ydHNfcGVyY3B1X2luc24oKTtcXG5rZXJuZWwvYnBmL3ZlcmlmaWVyLmMtMTY2NzMtI2VuZGlmXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA2LTI5VDE2OjM5OjUxLjQ2MzE2ODQzWiIsIlNlcSI6NSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6OTc0MjEzOTk0MSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipNeSBBc3Nlc3NtZW50IG9mIHRoZSBCUEYgUGF0Y2gqKlxuXG5Pa2F5LCBsZXQncyBicmVhayB0aGlzIGRvd24uIFRoaXMgcGF0Y2ggaXMgY2xlYXJseSBzaWduaWZpY2FudCwgZm9jdXNpbmcgb24gZW5hYmxpbmcgZGlyZWN0IGFjY2VzcyB0byBgLnBlcmNwdWAgZGF0YSBtYXBzIHdpdGhpbiBCUEYuIFRoaXMgdHJhbnNsYXRlcyBzcGVjaWZpY2FsbHkgdG8gc3VwcG9ydGluZyBgQlBGX01BUF9UWVBFX1BFUkNQVV9BUlJBWWAuXG5cbk15IGluaXRpYWwgdGhvdWdodCBpcyB0byBpZGVudGlmeSB0aGUga2V5IGZ1bmN0aW9ucyBpbXBhY3RlZC4gSSBzZWUgdGhlIGFkZGl0aW9uIG9mIHR3byBuZXcgZnVuY3Rpb25zOiBgcGVyY3B1X2FycmF5X21hcF9kaXJlY3RfdmFsdWVfYWRkcmAgYW5kIGBwZXJjcHVfYXJyYXlfbWFwX2RpcmVjdF92YWx1ZV9tZXRhYC4gVGhlc2UgYXJlIHRoZSBjb3JlIG1hcCBvcGVyYXRpb25zIGZvciB0aGlzIG5ldyBjYXBhYmlsaXR5LlxuXG5JdCdzIGFsc28gbW9kaWZ5aW5nIHNldmVyYWwgZXhpc3RpbmcgZnVuY3Rpb25zIHRvIGFjY29tbW9kYXRlIHRoaXMgbmV3IGZ1bmN0aW9uYWxpdHkuIEluaXRpYWxseSwgSSBub3RlZCBgYXJyYXlfbWFwX2NoZWNrX2J0ZmAsIGBicGZfZG9fbWlzY19maXh1cHNgLCBgYnBmX21hcF9kaXJlY3RfcmVhZGAsIGBjaGVja19tZW1fYWNjZXNzYCwgYGNoZWNrX2FyZ19jb25zdF9zdHJgLCBhbmQgYGNoZWNrX2FuZF9yZXNvbHZlX2luc25zYC4gSG93ZXZlciwgYGJwZl9kb19taXNjX2ZpeHVwc2AgYW5kIGBjaGVja19hbmRfcmVzb2x2ZV9pbnNuc2AgYXJlIHN1Y2ggaGVhdmlseSB1c2VkIHBhdGhzIGluIHRoZSB2ZXJpZmllciB0aGF0IEknbGwgc2ltcGxpZnkgdGhlIGZvY3VzIHRvIHRoZSBuZXcgZnVuY3Rpb25zLiBJIG5lZWQgdG8gYmUgZWZmaWNpZW50IHdpdGggbXkgdGltZSBhbmQgYXR0ZW50aW9uLiBJIGFtIG1ha2luZyB0aGUgZmluYWwgbGlzdCBvZiB0aGUgbmV3IGFuZCBpbXBhY3RlZCBmdW5jdGlvbnMgYHBlcmNwdV9hcnJheV9tYXBfZGlyZWN0X3ZhbHVlX2FkZHJgLCBgcGVyY3B1X2FycmF5X21hcF9kaXJlY3RfdmFsdWVfbWV0YWAsIGBicGZfbWFwX2RpcmVjdF9yZWFkYCwgYGNoZWNrX21lbV9hY2Nlc3NgLCBhbmQgYGNoZWNrX2FyZ19jb25zdF9zdHJgLlxuXG5DaGVja2luZyB0aGUgY29uZmlndXJhdGlvbnMsIGl0IGxvb2tzIGxpa2UgYENPTkZJR19CUEZfU1lTQ0FMTGAgaXMgc3RhbmRhcmQsIHdoaWNoIGlzIGV4cGVjdGVkLiBIb3dldmVyLCBgQ09ORklHX0JQRl9KSVRgIGlzIG5lY2Vzc2FyeSBmb3IgYGJwZl9qaXRfc3VwcG9ydHNfcGVyY3B1X2luc24oKWAuIFRoaXMgaW1wbGllcyB0aGF0IHRoZSBKSVQgY29tcGlsZXIgd2lsbCBuZWVkIHRvIGJlIHVwZGF0ZWQgdG8gaGFuZGxlIHRoZXNlIGAucGVyY3B1YCBhY2Nlc3Nlcy5cblxuR2l2ZW4gdGhlIGZ1bmN0aW9uYWwgbmF0dXJlIG9mIHRoZXNlIGNoYW5nZXMsIHRoZSBpbnRyb2R1Y3Rpb24gb2YgYC5wZXJjcHVgIHN1cHBvcnQsIGFuZCB0aGUgbW9kaWZpY2F0aW9ucyB0byB0aGUgQlBGIHZlcmlmaWVyIHRvIGhhbmRsZSBpdCwgdGhpcyBpcyBhIGNsZWFyIGNhbmRpZGF0ZSBmb3IgZnV6emluZy4gSSdsbCBuZWVkIHRvIGRldmVsb3AgZnV6eiB0YXJnZXRzIHRvIGNvdmVyIHRoZSBuZXcgY29kZSBwYXRocywgcGFydGljdWxhcmx5IGFyb3VuZCB0aGUgbWFwIG9wZXJhdGlvbnMgYW5kIHRoZSB2ZXJpZmllciBtb2RpZmljYXRpb25zLiBMZXQncyBjYWxsIGBzZXQtcmVzdWx0c2AuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjIxMjY1LCJPdXRwdXRUb2tlbnMiOjE3MywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjUzNCwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wNi0yOVQxNjo0MDowMS4yMDUzMTQ5ODFaIiwiU2VxIjo2LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJzZXQtcmVzdWx0cyIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjEzNzE4MTg5NiwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiQlBGX1NZU0NBTExcIixcbiAgICBcIkJQRl9KSVRcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJwZXJjcHVfYXJyYXlfbWFwX2RpcmVjdF92YWx1ZV9hZGRyXCIsXG4gICAgXCJwZXJjcHVfYXJyYXlfbWFwX2RpcmVjdF92YWx1ZV9tZXRhXCJcbiAgXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggaW50cm9kdWNlcyBzdXBwb3J0IGZvciBgLnBlcmNwdWAgZ2xvYmFsIGRhdGEgbWFwcyBpbiBCUEYsIHdoaWNoIHRyYW5zbGF0ZXMgdG8gYEJQRl9NQVBfVFlQRV9QRVJDUFVfQVJSQVlgLiBJdCBhZGRzIG5ldyBtYXAgb3BlcmF0aW9ucyBgbWFwX2RpcmVjdF92YWx1ZV9hZGRyYCBhbmQgYG1hcF9kaXJlY3RfdmFsdWVfbWV0YWAgZm9yIHBlcmNwdSBhcnJheXMsIGFuZCBtb2RpZmllcyB0aGUgdmVyaWZpZXIgdG8gaGFuZGxlIHBlcmNwdSBhcnJheSBhY2Nlc3NlcyBhbmQgcGF0Y2ggaW5zdHJ1Y3Rpb25zIGZvciBKSVQuIFRoaXMgaXMgYSBmdW5jdGlvbmFsIGNoYW5nZSBpbiB0aGUgY29yZSBCUEYgc3Vic3lzdGVtIGFuZCBzaG91bGQgYmUgZnV6emVkLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIkJQRl9TWVNDQUxMXCIsXG4gICAgXCJCUEZfSklUXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwicGVyY3B1X2FycmF5X21hcF9kaXJlY3RfdmFsdWVfYWRkclwiLFxuICAgIFwicGVyY3B1X2FycmF5X21hcF9kaXJlY3RfdmFsdWVfbWV0YVwiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGludHJvZHVjZXMgc3VwcG9ydCBmb3IgYC5wZXJjcHVgIGdsb2JhbCBkYXRhIG1hcHMgaW4gQlBGLCB3aGljaCB0cmFuc2xhdGVzIHRvIGBCUEZfTUFQX1RZUEVfUEVSQ1BVX0FSUkFZYC4gSXQgYWRkcyBuZXcgbWFwIG9wZXJhdGlvbnMgYG1hcF9kaXJlY3RfdmFsdWVfYWRkcmAgYW5kIGBtYXBfZGlyZWN0X3ZhbHVlX21ldGFgIGZvciBwZXJjcHUgYXJyYXlzLCBhbmQgbW9kaWZpZXMgdGhlIHZlcmlmaWVyIHRvIGhhbmRsZSBwZXJjcHUgYXJyYXkgYWNjZXNzZXMgYW5kIHBhdGNoIGluc3RydWN0aW9ucyBmb3IgSklULiBUaGlzIGlzIGEgZnVuY3Rpb25hbCBjaGFuZ2UgaW4gdGhlIGNvcmUgQlBGIHN1YnN5c3RlbSBhbmQgc2hvdWxkIGJlIGZ1enplZC5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9XTsKCQkJaWYgKCFyYXdEYXRhIHx8IHJhd0RhdGEubGVuZ3RoID09PSAwKSByZXR1cm47CgoJCQlkcmF3U3VtbWFyeVRhYmxlcyhyYXdEYXRhKTsKCQkJZHJhd0R1cmF0aW9uQ2hhcnQocmF3RGF0YSk7CgkJCWRyYXdUb2tlbkNvbnN1bXB0aW9uQ2hhcnQocmF3RGF0YSk7CgkJfQoKCQlmdW5jdGlvbiBkcmF3U3VtbWFyeVRhYmxlcyhyYXdEYXRhKSB7CgkJCWNvbnN0IHN0YXRzID0gewoJCQkJbGxtOiB7IGNvdW50OiAwLCB0b2tlbnM6IDAsIGR1cmF0aW9uOiAwIH0sCgkJCQl0b29sOiB7IGNvdW50OiAwLCBkdXJhdGlvbjogMCB9CgkJCX07CgoJCQlyYXdEYXRhLmZvckVhY2gocyA9PiB7CgkJCQljb25zdCBkdXIgPSBzLkR1cmF0aW9uIC8gMTAwMDAwMDAwMDsgCgkJCQlpZiAocy5UeXBlID09PSAibGxtIikgewoJCQkJCXN0YXRzLmxsbS5jb3VudCsrOwoJCQkJCXN0YXRzLmxsbS50b2tlbnMgKz0gKHMuSW5wdXRUb2tlbnMgKyBzLk91dHB1dFRva2VucyArIHMuT3V0cHV0VGhvdWdodHNUb2tlbnMpOwoJCQkJCXN0YXRzLmxsbS5kdXJhdGlvbiArPSBkdXI7CgkJCQl9IGVsc2UgaWYgKHMuVHlwZSA9PT0gInRvb2wiKSB7CgkJCQkJc3RhdHMudG9vbC5jb3VudCsrOwoJCQkJCXN0YXRzLnRvb2wuZHVyYXRpb24gKz0gZHVyOwoJCQkJfQoJCQl9KTsKCgkJCWNvbnN0IGF2Z0xsbUR1ciA9IHN0YXRzLmxsbS5jb3VudCA+IDAgPyAoc3RhdHMubGxtLmR1cmF0aW9uIC8gc3RhdHMubGxtLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCQkJY29uc3QgYXZnTGxtVG9rZW4gPSBzdGF0cy5sbG0uY291bnQgPiAwID8gKHN0YXRzLmxsbS50b2tlbnMgLyBzdGF0cy5sbG0uY291bnQpLnRvRml4ZWQoMikgOiAwOwoJCQljb25zdCBhdmdUb29sRHVyID0gc3RhdHMudG9vbC5jb3VudCA+IDAgPyAoc3RhdHMudG9vbC5kdXJhdGlvbiAvIHN0YXRzLnRvb2wuY291bnQpLnRvRml4ZWQoMikgOiAwOwoKCQkJY29uc3QgbGxtU3VtYXJ5Q2VsbHMgPSBbc3RhdHMubGxtLmNvdW50LCBzdGF0cy5sbG0udG9rZW5zLCBhdmdMbG1Ub2tlbiwgc3RhdHMubGxtLmR1cmF0aW9uLCBhdmdMbG1EdXJdOwoJCQljb25zdCB0b29sU3VtbWFyeUNlbGxzID0gW3N0YXRzLnRvb2wuY291bnQsIHN0YXRzLnRvb2wuZHVyYXRpb24sIGF2Z1Rvb2xEdXJdOwoKCQkJY29uc3QgbGxtU3VtbWFyeUJvZHkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGxtX3N1bW1hcnlfc3RhdHNfYm9keScpOwoJCQlsbG1TdW1tYXJ5Qm9keS5pbm5lckhUTUwgPSAiIjsKCQkJY29uc3QgbGxtVHIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0cicpOwoJCQlsbG1TdW1hcnlDZWxscy5mb3JFYWNoKGNlbGwgPT4gewoJCQkJY29uc3QgdGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZCcpOwoJCQkJdGQudGV4dENvbnRlbnQgPSBjZWxsOwoJCQkJbGxtVHIuYXBwZW5kQ2hpbGQodGQpOwoJCQl9KTsKCQkJbGxtU3VtbWFyeUJvZHkuYXBwZW5kQ2hpbGQobGxtVHIpOwoKCQkJY29uc3QgdG9vbFN1bW1hcnlCb2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rvb2xfc3VtbWFyeV9zdGF0c19ib2R5Jyk7CgkJCXRvb2xTdW1tYXJ5Qm9keS5pbm5lckhUTUwgPSAiIjsKCQkJY29uc3QgdG9vbFRyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndHInKTsKCQkJdG9vbFN1bW1hcnlDZWxscy5mb3JFYWNoKGNlbGwgPT4gewoJCQkJY29uc3QgdGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZCcpOwoJCQkJdGQudGV4dENvbnRlbnQgPSBjZWxsOwoJCQkJdG9vbFRyLmFwcGVuZENoaWxkKHRkKTsKCQkJfSk7CgkJCXRvb2xTdW1tYXJ5Qm9keS5hcHBlbmRDaGlsZCh0b29sVHIpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd0R1cmF0aW9uQ2hhcnQocmF3RGF0YSkgewoJCQljb25zdCBmaWx0ZXJlZFN0ZXBzID0gcmF3RGF0YS5maWx0ZXIoZCA9PiBbImxsbSIsICJ0b29sIl0uaW5jbHVkZXMoZC5UeXBlKSk7CgkJCWNvbnN0IGRhdGEgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uRGF0YVRhYmxlKCk7CgkJCWRhdGEuYWRkQ29sdW1uKCdzdHJpbmcnLCAnU3RlcCcpOwoJCQlkYXRhLmFkZENvbHVtbignbnVtYmVyJywgJ0R1cmF0aW9uJyk7CgkJCWRhdGEuYWRkQ29sdW1uKHt0eXBlOiAnc3RyaW5nJywgcm9sZTogJ3Rvb2x0aXAnfSk7IAoKCQkJZmlsdGVyZWRTdGVwcy5mb3JFYWNoKHMgPT4gewoJCQkJCgkJCQljb25zdCBkdXIgPSBzLkR1cmF0aW9uIC8gMTAwMDAwMDAwMDsKCQkJCWxldCB0b29sdGlwID0gcy5OYW1lOwoJCQkJaWYgKHMuVHlwZSA9PT0gImxsbSIgJiYgcy5Ub29sQ2FsbHMgJiYgcy5Ub29sQ2FsbHMubGVuZ3RoID4gMCkgewoJCQkJCXRvb2x0aXAgKz0gYFxuVG9vbHM6ICR7cy5Ub29sQ2FsbHMuam9pbignLCAnKX1gOwoJCQkJfQoJCQkJZGF0YS5hZGRSb3coW2Ake3MuU2VxfWAsIGR1ciwgdG9vbHRpcF0pOwoJCQl9KTsKCgkJCWNvbnN0IG9wdGlvbnMgPSB7CgkJCQl0aXRsZTogJ1RpbWUgQ29uc3VtcHRpb24gb2YgTExNL1Rvb2wgQ2FsbHMnLAoJCQkJaEF4aXM6IHsKCQkJCQl0aXRsZTogJ0xMTS9Ub29sIFN0ZXBzJywKCQkJCX0sCgkJCQl2QXhpczogeyB0aXRsZTogJ1NlY29uZHMnIH0sCgkJCQlsZWdlbmQ6IHsgcG9zaXRpb246ICdub25lJyB9LAoJCQkJYmFyOiB7IGdyb3VwV2lkdGg6ICc3NSUnIH0sCgkJCQljaGFydEFyZWE6IHsgd2lkdGg6ICc4NSUnLCBoZWlnaHQ6ICc3MCUnIH0sCgkJCQloZWlnaHQ6IDQwMAoJCQl9OwoKCQkJY29uc3QgY2hhcnQgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uQ29sdW1uQ2hhcnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2R1cmF0aW9uX2NoYXJ0X2RpdicpKTsKCQkJY2hhcnQuZHJhdyhkYXRhLCBvcHRpb25zKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdUb2tlbkNvbnN1bXB0aW9uQ2hhcnQocmF3RGF0YSkgewoJCQljb25zdCBsbG1TdGVwcyA9IHJhd0RhdGEuZmlsdGVyKGQgPT4gZC5UeXBlID09PSAibGxtIik7CgkJCWlmIChsbG1TdGVwcy5sZW5ndGggPT09IDApIHJldHVybjsKCgkJCWNvbnN0IGRhdGEgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uRGF0YVRhYmxlKCk7CgkJCWRhdGEuYWRkQ29sdW1uKCdzdHJpbmcnLCAnU3RlcCcpOwkJCQoJCQlkYXRhLmFkZENvbHVtbignbnVtYmVyJywgJ1Rva2VucycpOwkJCQoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICdzdHlsZSd9KTsJCgkJCWRhdGEuYWRkQ29sdW1uKHt0eXBlOiAnc3RyaW5nJywgcm9sZTogJ3Rvb2x0aXAnfSk7CQoKCQkJY29uc3QgYWdlbnRDb2xvcnMgPSB7fTsKCQkJY29uc3QgcGFsZXR0ZSA9IFsnIzQyODVGNCcsICcjREI0NDM3JywgJyNGNEI0MDAnLCAnIzBGOUQ1OCcsICcjQUI0N0JDJywgJyMwMEFDQzEnXTsKCQkJbGV0IGNvbG9ySWR4ID0gMDsKCQkJY29uc3QgYWdlbnRMTE1Db3VudHMgPSB7fTsKCQkJbGxtU3RlcHMuZm9yRWFjaChzID0+IHsKCQkJCWlmICghYWdlbnRDb2xvcnNbcy5OYW1lXSkgewoJCQkJCWFnZW50Q29sb3JzW3MuTmFtZV0gPSBwYWxldHRlW2NvbG9ySWR4ICUgcGFsZXR0ZS5sZW5ndGhdOwoJCQkJCWNvbG9ySWR4Kys7CgkJCQl9CgoJCQkJYWdlbnRMTE1Db3VudHNbcy5OYW1lXSA9IChhZ2VudExMTUNvdW50c1tzLk5hbWVdIHx8IDApICsgMTsKCQkJCWNvbnN0IGxhYmVsID0gYCR7cy5OYW1lfS0ke2FnZW50TExNQ291bnRzW3MuTmFtZV19YDsKCQkJCWNvbnN0IHRvdGFsVG9rZW5zID0gcy5JbnB1dFRva2VucyArIHMuT3V0cHV0VG9rZW5zICsgcy5PdXRwdXRUaG91Z2h0c1Rva2VuczsKCQkJCWNvbnN0IHN0eWxlID0gYGNvbG9yOiAke2FnZW50Q29sb3JzW3MuTmFtZV19YDsKCQkJCWxldCB0b29sdGlwID0gYFRvdGFsIFRva2VuczogJHt0b3RhbFRva2Vuc31cbihJbjogJHtzLklucHV0VG9rZW5zfSwgT3V0OiAke3MuT3V0cHV0VG9rZW5zfSwgVGhvdWdodHM6ICR7cy5PdXRwdXRUaG91Z2h0c1Rva2Vuc30pYDsKCQkJCWlmIChzLlRvb2xDYWxscyAmJiBzLlRvb2xDYWxscy5sZW5ndGggPiAwKSB7CgkJCQkJdG9vbHRpcCArPSBgXG5Ub29sczogJHtzLlRvb2xDYWxscy5qb2luKCcsICcpfWA7CgkJCQl9CgoJCQkJZGF0YS5hZGRSb3coW2xhYmVsLCB0b3RhbFRva2Vucywgc3R5bGUsIHRvb2x0aXBdKTsKCQkJfSk7CgoJCQljb25zdCBvcHRpb25zID0gewoJCQkJdGl0bGU6ICdUb2tlbiBDb25zdW1wdGlvbiBieSBMTE0gQ2FsbHMnLAoJCQkJaEF4aXM6IHsKCQkJCQl0aXRsZTogJ0xMTSBDYWxsIFNlcXVlbmNlJywKCQkJCX0sCgkJCQl2QXhpczogeyB0aXRsZTogJ0NvbnN1bWVkIFRva2VucycgfSwKCQkJCWxlZ2VuZDogeyBwb3NpdGlvbjogJ25vbmUnIH0sCgkJCQliYXI6IHsgZ3JvdXBXaWR0aDogJzc1JScgfSwKCQkJCWNoYXJ0QXJlYTogeyB3aWR0aDogJzg1JScsIGhlaWdodDogJzcwJScgfSwKCQkJCWhlaWdodDogNDAwCgkJCX07CgoJCQljb25zdCBjaGFydCA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5Db2x1bW5DaGFydChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG9rZW5fY2hhcnRfZGl2JykpOwoJCQljaGFydC5kcmF3KGRhdGEsIG9wdGlvbnMpOwoJCX0KCQlsZXQgYWxsRXhwYW5kZWQgPSBmYWxzZTsKCQlmdW5jdGlvbiB0b2dnbGVBbGxEZXRhaWxzKCkgewoJCQlhbGxFeHBhbmRlZCA9ICFhbGxFeHBhbmRlZDsKCQkJZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnZGV0YWlscycpLmZvckVhY2goZCA9PiB7CgkJCQlpZiAoYWxsRXhwYW5kZWQpIGQuc2V0QXR0cmlidXRlKCdvcGVuJywgJycpOwoJCQkJZWxzZSBkLnJlbW92ZUF0dHJpYnV0ZSgnb3BlbicpOwoJCQl9KTsKCQl9Cgk8L3NjcmlwdD4KCgo8L2JvZHk+CjwvaHRtbD4K" },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:nil,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,} --------- Name: series-workflowfntnl[1] Phase: Succeeded StartedAt: 2026-06-29 16:40:13 +0000 UTC FinishedAt: 2026-06-29 16:40:13 +0000 UTC Input: nil Output: nil --------- Name: series-workflowfntnl[1].abort-on-skip-outcome Phase: Skipped StartedAt: 2026-06-29 16:40:13 +0000 UTC FinishedAt: 2026-06-29 16:40:13 +0000 UTC Input: nil Output: nil --------- Name: series-workflowfntnl[2] Phase: Succeeded StartedAt: 2026-06-29 16:40:13 +0000 UTC FinishedAt: 2026-06-29 20:44:02 +0000 UTC Input: nil Output: nil --------- Name: series-workflowfntnl[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"53435562a725962e4de0c29653223129ba11643a","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","BPF_JIT"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db"],"focus":["bpf"],"focus_symbols":["percpu_array_map_direct_value_addr","percpu_array_map_direct_value_meta"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"53435562a725962e4de0c29653223129ba11643a","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","BPF_JIT"],"series_id":"441a2867-de39-4d18-beec-5c7a8e65f4f1","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN) Phase: Succeeded StartedAt: 2026-06-29 16:40:13 +0000 UTC FinishedAt: 2026-06-29 20:44:02 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:element,Default:nil,Value:*{"base":{"arch":"amd64","commit_hash":"53435562a725962e4de0c29653223129ba11643a","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","BPF_JIT"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},"fuzz":{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db"],"focus":["bpf"],"focus_symbols":["percpu_array_map_direct_value_addr","percpu_array_map_direct_value_meta"],"skip_cover_check":false},"patched":{"arch":"amd64","commit_hash":"53435562a725962e4de0c29653223129ba11643a","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","BPF_JIT"],"series_id":"441a2867-de39-4d18-beec-5c7a8e65f4f1","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},"retest":null,"track":"KASAN"},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: nil --------- Name: series-workflowfntnl[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"53435562a725962e4de0c29653223129ba11643a","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","BPF_JIT"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db"],"focus":["bpf"],"focus_symbols":["percpu_array_map_direct_value_addr","percpu_array_map_direct_value_meta"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"53435562a725962e4de0c29653223129ba11643a","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","BPF_JIT"],"series_id":"441a2867-de39-4d18-beec-5c7a8e65f4f1","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[0] Phase: Succeeded StartedAt: 2026-06-29 16:40:13 +0000 UTC FinishedAt: 2026-06-29 16:40:35 +0000 UTC Input: nil Output: nil --------- Name: series-workflowfntnl[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"53435562a725962e4de0c29653223129ba11643a","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","BPF_JIT"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db"],"focus":["bpf"],"focus_symbols":["percpu_array_map_direct_value_addr","percpu_array_map_direct_value_meta"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"53435562a725962e4de0c29653223129ba11643a","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","BPF_JIT"],"series_id":"441a2867-de39-4d18-beec-5c7a8e65f4f1","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[0].save-base-req Phase: Succeeded StartedAt: 2026-06-29 16:40:13 +0000 UTC FinishedAt: 2026-06-29 16:40:22 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"arch":"amd64","commit_hash":"53435562a725962e4de0c29653223129ba11643a","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","BPF_JIT"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.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-workflowfntnl/series-workflowfntnl-convert-artifact-4228009266/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowfntnl[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"53435562a725962e4de0c29653223129ba11643a","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","BPF_JIT"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db"],"focus":["bpf"],"focus_symbols":["percpu_array_map_direct_value_addr","percpu_array_map_direct_value_meta"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"53435562a725962e4de0c29653223129ba11643a","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","BPF_JIT"],"series_id":"441a2867-de39-4d18-beec-5c7a8e65f4f1","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[1] Phase: Succeeded StartedAt: 2026-06-29 16:40:35 +0000 UTC FinishedAt: 2026-06-29 17:06:29 +0000 UTC Input: nil Output: nil --------- Name: series-workflowfntnl[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"53435562a725962e4de0c29653223129ba11643a","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","BPF_JIT"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db"],"focus":["bpf"],"focus_symbols":["percpu_array_map_direct_value_addr","percpu_array_map_direct_value_meta"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"53435562a725962e4de0c29653223129ba11643a","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","BPF_JIT"],"series_id":"441a2867-de39-4d18-beec-5c7a8e65f4f1","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[1].base-build Phase: Succeeded StartedAt: 2026-06-29 16:40:35 +0000 UTC FinishedAt: 2026-06-29 17:06:29 +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:*f66d9006-bea7-4824-9c76-70fd70f8d94b,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-workflowfntnl/series-workflowfntnl-convert-artifact-4228009266/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": "d8d01593-97c3-482d-b258-8cca90f15ba7", "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-workflowfntnl/series-workflowfntnl-build-action-2407440048/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowfntnl[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"53435562a725962e4de0c29653223129ba11643a","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","BPF_JIT"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db"],"focus":["bpf"],"focus_symbols":["percpu_array_map_direct_value_addr","percpu_array_map_direct_value_meta"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"53435562a725962e4de0c29653223129ba11643a","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","BPF_JIT"],"series_id":"441a2867-de39-4d18-beec-5c7a8e65f4f1","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[1].base-build(0) Phase: Succeeded StartedAt: 2026-06-29 16:40:35 +0000 UTC FinishedAt: 2026-06-29 17:04:14 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:findings,Default:nil,Value:*false,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:test-name,Default:nil,Value:*[KASAN] Build Base,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:smoke-build,Default:nil,Value:*false,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:session-id,Default:nil,Value:*f66d9006-bea7-4824-9c76-70fd70f8d94b,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-workflowfntnl/series-workflowfntnl-convert-artifact-4228009266/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": "d8d01593-97c3-482d-b258-8cca90f15ba7", "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-workflowfntnl/series-workflowfntnl-build-action-2407440048/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowfntnl[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"53435562a725962e4de0c29653223129ba11643a","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","BPF_JIT"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db"],"focus":["bpf"],"focus_symbols":["percpu_array_map_direct_value_addr","percpu_array_map_direct_value_meta"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"53435562a725962e4de0c29653223129ba11643a","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","BPF_JIT"],"series_id":"441a2867-de39-4d18-beec-5c7a8e65f4f1","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[2] Phase: Succeeded StartedAt: 2026-06-29 17:06:29 +0000 UTC FinishedAt: 2026-06-29 17:06:29 +0000 UTC Input: nil Output: nil --------- Name: series-workflowfntnl[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"53435562a725962e4de0c29653223129ba11643a","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","BPF_JIT"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db"],"focus":["bpf"],"focus_symbols":["percpu_array_map_direct_value_addr","percpu_array_map_direct_value_meta"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"53435562a725962e4de0c29653223129ba11643a","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","BPF_JIT"],"series_id":"441a2867-de39-4d18-beec-5c7a8e65f4f1","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[2].abort-if-base-build-failed Phase: Skipped StartedAt: 2026-06-29 17:06:29 +0000 UTC FinishedAt: 2026-06-29 17:06:29 +0000 UTC Input: nil Output: nil --------- Name: series-workflowfntnl[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"53435562a725962e4de0c29653223129ba11643a","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","BPF_JIT"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db"],"focus":["bpf"],"focus_symbols":["percpu_array_map_direct_value_addr","percpu_array_map_direct_value_meta"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"53435562a725962e4de0c29653223129ba11643a","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","BPF_JIT"],"series_id":"441a2867-de39-4d18-beec-5c7a8e65f4f1","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[3] Phase: Succeeded StartedAt: 2026-06-29 17:06:29 +0000 UTC FinishedAt: 2026-06-29 17:06:50 +0000 UTC Input: nil Output: nil --------- Name: series-workflowfntnl[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"53435562a725962e4de0c29653223129ba11643a","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","BPF_JIT"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db"],"focus":["bpf"],"focus_symbols":["percpu_array_map_direct_value_addr","percpu_array_map_direct_value_meta"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"53435562a725962e4de0c29653223129ba11643a","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","BPF_JIT"],"series_id":"441a2867-de39-4d18-beec-5c7a8e65f4f1","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[3].save-patched-req Phase: Succeeded StartedAt: 2026-06-29 17:06:29 +0000 UTC FinishedAt: 2026-06-29 17:06:39 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"arch":"amd64","commit_hash":"53435562a725962e4de0c29653223129ba11643a","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","BPF_JIT"],"series_id":"441a2867-de39-4d18-beec-5c7a8e65f4f1","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.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-workflowfntnl/series-workflowfntnl-convert-artifact-3037777229/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowfntnl[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"53435562a725962e4de0c29653223129ba11643a","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","BPF_JIT"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db"],"focus":["bpf"],"focus_symbols":["percpu_array_map_direct_value_addr","percpu_array_map_direct_value_meta"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"53435562a725962e4de0c29653223129ba11643a","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","BPF_JIT"],"series_id":"441a2867-de39-4d18-beec-5c7a8e65f4f1","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[4] Phase: Succeeded StartedAt: 2026-06-29 17:06:50 +0000 UTC FinishedAt: 2026-06-29 17:08:49 +0000 UTC Input: nil Output: nil --------- Name: series-workflowfntnl[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"53435562a725962e4de0c29653223129ba11643a","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","BPF_JIT"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db"],"focus":["bpf"],"focus_symbols":["percpu_array_map_direct_value_addr","percpu_array_map_direct_value_meta"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"53435562a725962e4de0c29653223129ba11643a","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","BPF_JIT"],"series_id":"441a2867-de39-4d18-beec-5c7a8e65f4f1","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[4].boot-test-base Phase: Succeeded StartedAt: 2026-06-29 17:06:50 +0000 UTC FinishedAt: 2026-06-29 17:08:39 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*d8d01593-97c3-482d-b258-8cca90f15ba7,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-workflowfntnl/series-workflowfntnl-build-action-2407440048/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-workflowfntnl[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"53435562a725962e4de0c29653223129ba11643a","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","BPF_JIT"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db"],"focus":["bpf"],"focus_symbols":["percpu_array_map_direct_value_addr","percpu_array_map_direct_value_meta"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"53435562a725962e4de0c29653223129ba11643a","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","BPF_JIT"],"series_id":"441a2867-de39-4d18-beec-5c7a8e65f4f1","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[5] Phase: Succeeded StartedAt: 2026-06-29 17:08:49 +0000 UTC FinishedAt: 2026-06-29 17:08:49 +0000 UTC Input: nil Output: nil --------- Name: series-workflowfntnl[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"53435562a725962e4de0c29653223129ba11643a","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","BPF_JIT"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db"],"focus":["bpf"],"focus_symbols":["percpu_array_map_direct_value_addr","percpu_array_map_direct_value_meta"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"53435562a725962e4de0c29653223129ba11643a","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","BPF_JIT"],"series_id":"441a2867-de39-4d18-beec-5c7a8e65f4f1","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[5].abort-if-base-boot-failed Phase: Skipped StartedAt: 2026-06-29 17:08:49 +0000 UTC FinishedAt: 2026-06-29 17:08:49 +0000 UTC Input: nil Output: nil --------- Name: series-workflowfntnl[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"53435562a725962e4de0c29653223129ba11643a","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","BPF_JIT"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db"],"focus":["bpf"],"focus_symbols":["percpu_array_map_direct_value_addr","percpu_array_map_direct_value_meta"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"53435562a725962e4de0c29653223129ba11643a","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","BPF_JIT"],"series_id":"441a2867-de39-4d18-beec-5c7a8e65f4f1","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[6] Phase: Succeeded StartedAt: 2026-06-29 17:08:49 +0000 UTC FinishedAt: 2026-06-29 17:35:48 +0000 UTC Input: nil Output: nil --------- Name: series-workflowfntnl[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"53435562a725962e4de0c29653223129ba11643a","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","BPF_JIT"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db"],"focus":["bpf"],"focus_symbols":["percpu_array_map_direct_value_addr","percpu_array_map_direct_value_meta"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"53435562a725962e4de0c29653223129ba11643a","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","BPF_JIT"],"series_id":"441a2867-de39-4d18-beec-5c7a8e65f4f1","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[6].patched-build Phase: Succeeded StartedAt: 2026-06-29 17:08:49 +0000 UTC FinishedAt: 2026-06-29 17:35:48 +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:*f66d9006-bea7-4824-9c76-70fd70f8d94b,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-workflowfntnl/series-workflowfntnl-convert-artifact-3037777229/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": "314818b3-0033-4a79-a939-4945bab48a73", "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-workflowfntnl/series-workflowfntnl-build-action-3190291241/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowfntnl[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"53435562a725962e4de0c29653223129ba11643a","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","BPF_JIT"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db"],"focus":["bpf"],"focus_symbols":["percpu_array_map_direct_value_addr","percpu_array_map_direct_value_meta"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"53435562a725962e4de0c29653223129ba11643a","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","BPF_JIT"],"series_id":"441a2867-de39-4d18-beec-5c7a8e65f4f1","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[6].patched-build(0) Phase: Succeeded StartedAt: 2026-06-29 17:08:49 +0000 UTC FinishedAt: 2026-06-29 17:35:06 +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:*f66d9006-bea7-4824-9c76-70fd70f8d94b,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-workflowfntnl/series-workflowfntnl-convert-artifact-3037777229/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": "314818b3-0033-4a79-a939-4945bab48a73", "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-workflowfntnl/series-workflowfntnl-build-action-3190291241/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowfntnl[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"53435562a725962e4de0c29653223129ba11643a","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","BPF_JIT"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db"],"focus":["bpf"],"focus_symbols":["percpu_array_map_direct_value_addr","percpu_array_map_direct_value_meta"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"53435562a725962e4de0c29653223129ba11643a","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","BPF_JIT"],"series_id":"441a2867-de39-4d18-beec-5c7a8e65f4f1","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[7] Phase: Succeeded StartedAt: 2026-06-29 17:35:48 +0000 UTC FinishedAt: 2026-06-29 17:35:48 +0000 UTC Input: nil Output: nil --------- Name: series-workflowfntnl[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"53435562a725962e4de0c29653223129ba11643a","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","BPF_JIT"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db"],"focus":["bpf"],"focus_symbols":["percpu_array_map_direct_value_addr","percpu_array_map_direct_value_meta"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"53435562a725962e4de0c29653223129ba11643a","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","BPF_JIT"],"series_id":"441a2867-de39-4d18-beec-5c7a8e65f4f1","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[7].abort-if-patched-build-failed Phase: Skipped StartedAt: 2026-06-29 17:35:48 +0000 UTC FinishedAt: 2026-06-29 17:35:48 +0000 UTC Input: nil Output: nil --------- Name: series-workflowfntnl[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"53435562a725962e4de0c29653223129ba11643a","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","BPF_JIT"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db"],"focus":["bpf"],"focus_symbols":["percpu_array_map_direct_value_addr","percpu_array_map_direct_value_meta"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"53435562a725962e4de0c29653223129ba11643a","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","BPF_JIT"],"series_id":"441a2867-de39-4d18-beec-5c7a8e65f4f1","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[8] Phase: Succeeded StartedAt: 2026-06-29 17:35:48 +0000 UTC FinishedAt: 2026-06-29 17:37:59 +0000 UTC Input: nil Output: nil --------- Name: series-workflowfntnl[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"53435562a725962e4de0c29653223129ba11643a","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","BPF_JIT"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db"],"focus":["bpf"],"focus_symbols":["percpu_array_map_direct_value_addr","percpu_array_map_direct_value_meta"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"53435562a725962e4de0c29653223129ba11643a","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","BPF_JIT"],"series_id":"441a2867-de39-4d18-beec-5c7a8e65f4f1","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[8].boot-test-patched Phase: Succeeded StartedAt: 2026-06-29 17:35:48 +0000 UTC FinishedAt: 2026-06-29 17:37:49 +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:*314818b3-0033-4a79-a939-4945bab48a73,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-workflowfntnl/series-workflowfntnl-build-action-3190291241/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-workflowfntnl[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"53435562a725962e4de0c29653223129ba11643a","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","BPF_JIT"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db"],"focus":["bpf"],"focus_symbols":["percpu_array_map_direct_value_addr","percpu_array_map_direct_value_meta"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"53435562a725962e4de0c29653223129ba11643a","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","BPF_JIT"],"series_id":"441a2867-de39-4d18-beec-5c7a8e65f4f1","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[10] Phase: Succeeded StartedAt: 2026-06-29 17:37:59 +0000 UTC FinishedAt: 2026-06-29 20:44:02 +0000 UTC Input: nil Output: nil --------- Name: series-workflowfntnl[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"53435562a725962e4de0c29653223129ba11643a","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","BPF_JIT"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db"],"focus":["bpf"],"focus_symbols":["percpu_array_map_direct_value_addr","percpu_array_map_direct_value_meta"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"53435562a725962e4de0c29653223129ba11643a","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","BPF_JIT"],"series_id":"441a2867-de39-4d18-beec-5c7a8e65f4f1","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[10].run-fuzz Phase: Succeeded StartedAt: 2026-06-29 17:37:59 +0000 UTC FinishedAt: 2026-06-29 20:44:02 +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-bpf-kasan-gce-corpus.db"],"focus":["bpf"],"focus_symbols":["percpu_array_map_direct_value_addr","percpu_array_map_direct_value_meta"],"skip_cover_check":false},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:*d8d01593-97c3-482d-b258-8cca90f15ba7,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*314818b3-0033-4a79-a939-4945bab48a73,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-workflowfntnl/series-workflowfntnl-build-action-2407440048/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-workflowfntnl/series-workflowfntnl-build-action-3190291241/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: nil --------- Name: series-workflowfntnl[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"53435562a725962e4de0c29653223129ba11643a","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","BPF_JIT"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db"],"focus":["bpf"],"focus_symbols":["percpu_array_map_direct_value_addr","percpu_array_map_direct_value_meta"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"53435562a725962e4de0c29653223129ba11643a","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","BPF_JIT"],"series_id":"441a2867-de39-4d18-beec-5c7a8e65f4f1","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[10].run-fuzz[0] Phase: Succeeded StartedAt: 2026-06-29 17:37:59 +0000 UTC FinishedAt: 2026-06-29 17:40:25 +0000 UTC Input: nil Output: nil --------- Name: series-workflowfntnl[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"53435562a725962e4de0c29653223129ba11643a","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","BPF_JIT"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db"],"focus":["bpf"],"focus_symbols":["percpu_array_map_direct_value_addr","percpu_array_map_direct_value_meta"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"53435562a725962e4de0c29653223129ba11643a","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","BPF_JIT"],"series_id":"441a2867-de39-4d18-beec-5c7a8e65f4f1","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[10].run-fuzz[0].save-fuzz-config Phase: Succeeded StartedAt: 2026-06-29 17:37:59 +0000 UTC FinishedAt: 2026-06-29 17:38:53 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db"],"focus":["bpf"],"focus_symbols":["percpu_array_map_direct_value_addr","percpu_array_map_direct_value_meta"],"skip_cover_check":false},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-workflowfntnl/series-workflowfntnl-convert-artifact-3996776754/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowfntnl[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"53435562a725962e4de0c29653223129ba11643a","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","BPF_JIT"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db"],"focus":["bpf"],"focus_symbols":["percpu_array_map_direct_value_addr","percpu_array_map_direct_value_meta"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"53435562a725962e4de0c29653223129ba11643a","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","BPF_JIT"],"series_id":"441a2867-de39-4d18-beec-5c7a8e65f4f1","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[10].run-retest Phase: Skipped StartedAt: 2026-06-29 17:37:59 +0000 UTC FinishedAt: 2026-06-29 17:37:59 +0000 UTC Input: nil Output: nil --------- Name: series-workflowfntnl[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"53435562a725962e4de0c29653223129ba11643a","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","BPF_JIT"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db"],"focus":["bpf"],"focus_symbols":["percpu_array_map_direct_value_addr","percpu_array_map_direct_value_meta"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"53435562a725962e4de0c29653223129ba11643a","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","BPF_JIT"],"series_id":"441a2867-de39-4d18-beec-5c7a8e65f4f1","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[9] Phase: Succeeded StartedAt: 2026-06-29 17:37:59 +0000 UTC FinishedAt: 2026-06-29 17:37:59 +0000 UTC Input: nil Output: nil --------- Name: series-workflowfntnl[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"53435562a725962e4de0c29653223129ba11643a","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","BPF_JIT"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db"],"focus":["bpf"],"focus_symbols":["percpu_array_map_direct_value_addr","percpu_array_map_direct_value_meta"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"53435562a725962e4de0c29653223129ba11643a","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","BPF_JIT"],"series_id":"441a2867-de39-4d18-beec-5c7a8e65f4f1","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[9].abort-if-patched-boot-failed Phase: Skipped StartedAt: 2026-06-29 17:37:59 +0000 UTC FinishedAt: 2026-06-29 17:37:59 +0000 UTC Input: nil Output: nil --------- Name: series-workflowfntnl[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"53435562a725962e4de0c29653223129ba11643a","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","BPF_JIT"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db"],"focus":["bpf"],"focus_symbols":["percpu_array_map_direct_value_addr","percpu_array_map_direct_value_meta"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"53435562a725962e4de0c29653223129ba11643a","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","BPF_JIT"],"series_id":"441a2867-de39-4d18-beec-5c7a8e65f4f1","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[10].run-fuzz[1] Phase: Succeeded StartedAt: 2026-06-29 17:40:25 +0000 UTC FinishedAt: 2026-06-29 20:44:02 +0000 UTC Input: nil Output: nil --------- Name: series-workflowfntnl[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"53435562a725962e4de0c29653223129ba11643a","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","BPF_JIT"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db"],"focus":["bpf"],"focus_symbols":["percpu_array_map_direct_value_addr","percpu_array_map_direct_value_meta"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"53435562a725962e4de0c29653223129ba11643a","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","BPF_JIT"],"series_id":"441a2867-de39-4d18-beec-5c7a8e65f4f1","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[10].run-fuzz[1].fuzz Phase: Succeeded StartedAt: 2026-06-29 17:40:26 +0000 UTC FinishedAt: 2026-06-29 20:43:53 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*d8d01593-97c3-482d-b258-8cca90f15ba7,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*314818b3-0033-4a79-a939-4945bab48a73,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-workflowfntnl/series-workflowfntnl-build-action-2407440048/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-workflowfntnl/series-workflowfntnl-build-action-3190291241/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-workflowfntnl/series-workflowfntnl-convert-artifact-3996776754/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,}