Name: series-workflowlcc6l Phase: Succeeded StartedAt: 2026-08-07 08:09:10 +0000 UTC FinishedAt: 2026-08-07 12:28:41 +0000 UTC Input: nil Output: nil --------- Name: series-workflowlcc6l[0] Phase: Succeeded StartedAt: 2026-08-07 08:09:10 +0000 UTC FinishedAt: 2026-08-07 08:51:19 +0000 UTC Input: nil Output: nil --------- Name: series-workflowlcc6l[0].run-triage Phase: Succeeded StartedAt: 2026-08-07 08:09:10 +0000 UTC FinishedAt: 2026-08-07 08:51:19 +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": "8c7f55d60aa3512fd3da7e9cf313723460e487b4", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "MEMCG", "CGROUPS" ], "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": "8c7f55d60aa3512fd3da7e9cf313723460e487b4", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "MEMCG", "CGROUPS" ], "series_id": "ce95f701-5786-4fe2-8f55-ad86a4f88cdd" }, "track": "KASAN", "fuzz": { "focus": [ "bpf", "net" ], "focus_symbols": [ "bpf_thread_wq_init", "bpf_thread_wq_set_callback", "bpf_thread_wq_start", "bpf_try_to_free_mem_cgroup_pages", "cgroup_kthread_attach" ], "corpus_urls": [ "https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db", "https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db", "https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db" ], "skip_cover_check": true, "bug_title_re": "" }, "retest": null } ], "trajectory": "CjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KPGhlYWQ+Cgk8dGl0bGU+QUkgVHJhamVjdG9yeTwvdGl0bGU+Cgk8c3R5bGU+CgkJdGFibGUgewoJCQlib3JkZXI6IDFweCBzb2xpZCAjY2NjOwoJCQltYXJnaW46IDIwcHggNXB4OwoJCQlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwoJCQl3aGl0ZS1zcGFjZTogbm93cmFwOwoJCQl0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKCQkJb3ZlcmZsb3c6IGhpZGRlbjsKCQl9CgoJCXRhYmxlIGNhcHRpb24gewoJCQlmb250LXdlaWdodDogYm9sZDsKCQl9CgoJCXRhYmxlIHRkLCB0YWJsZSB0aCB7CgkJCXZlcnRpY2FsLWFsaWduOiB0b3A7CgkJCXBhZGRpbmc6IDJweCA4cHg7CgkJCXRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwoJCQlvdmVyZmxvdzogaGlkZGVuOwoJCX0KCgkJLmxpc3RfdGFibGUgdGQsIC5saXN0X3RhYmxlIHRoIHsKCQkJYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjY2NjOwoJCX0KCgkJLmxpc3RfdGFibGUgdGggewoJCQliYWNrZ3JvdW5kOiAjRjRGNEY0OwoJCX0KCgkJLmxpc3RfdGFibGUgdHI6bnRoLWNoaWxkKDJuKSB7CgkJCWJhY2tncm91bmQ6ICNGNEY0RjQ7CgkJfQoKCQkubGlzdF90YWJsZSB0cjpob3ZlciB7CgkJCWJhY2tncm91bmQ6ICNmZmZmOTk7CgkJfQoKCQkjYWlfZGV0YWlsc19kaXYgcHJlIHsKCQkJbWFyZ2luOiAxcHg7CgkJCW1heC13aWR0aDogMTIwY2g7CgkJCXdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKCQkJb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKCQl9Cgk8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PgoJPGgxPkFJIFRyYWplY3Rvcnk8L2gxPgoJPGJyPgoKCQoJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQk8Y2FwdGlvbj5UcmFqZWN0b3J5OiAoPGEgaHJlZj0iIyIgb25jbGljaz0idG9nZ2xlQWxsRGV0YWlscygpOyByZXR1cm4gZmFsc2U7Ij5FeHBhbmQvQ29sbGFwc2UgQWxsPC9hPik8L2NhcHRpb24+CgkJPHRoZWFkPjx0cj4KCQkJPHRoPlNlcTwvdGg+CgkJCTx0aD5UaW1lc3RhbXA8L3RoPgoJCQk8dGg+VHlwZTwvdGg+CgkJCTx0aD5OYW1lPC90aD4KCQkJPHRoPkR1cmF0aW9uPC90aD4KCQk8L3RyPjwvdGhlYWQ+CgkJPHRib2R5PgoJCQoJCTx0cj4KCQkJPHRkPjAvMDwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA3IDA4OjUwPC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O01FTUNHJiMzNDssCiAgICAmIzM0O0NHUk9VUFMmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDticGZfdGhyZWFkX3dxX2luaXQmIzM0OywKICAgICYjMzQ7YnBmX3RocmVhZF93cV9zZXRfY2FsbGJhY2smIzM0OywKICAgICYjMzQ7YnBmX3RocmVhZF93cV9zdGFydCYjMzQ7LAogICAgJiMzNDticGZfdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcyYjMzQ7LAogICAgJiMzNDtjZ3JvdXBfa3RocmVhZF9hdHRhY2gmIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggaW50cm9kdWNlcyBhIG5ldyBCUEYgdGhyZWFkIHdvcmtxdWV1ZSBmZWF0dXJlIChgYnBmX3RocmVhZF93cWApIHRoYXQgYWxsb3dzIEJQRiBwcm9ncmFtcyB0byBzY2hlZHVsZSB3b3JrIGluIGEga3RocmVhZCBjb250ZXh0LCBvcHRpb25hbGx5IGF0dGFjaGVkIHRvIGEgY2dyb3VwLiBJdCBhbHNvIGFkZHMgYSBuZXcgQlBGIGtmdW5jIGBicGZfdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlc2AgZm9yIG1lbW9yeSBjZ3JvdXAgcmVjbGFpbS4gVGhlc2UgYXJlIGZ1bmN0aW9uYWwgY2hhbmdlcyB0byB0aGUgY29yZSBCUEYgYW5kIG1lbW9yeSBjb250cm9sIHN1YnN5c3RlbXMsIHJlYWNoYWJsZSBmcm9tIHVzZXJzcGFjZSB2aWEgQlBGIHByb2dyYW1zLCBhbmQgc2hvdWxkIGJlIGZ1enplZC4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xLzE8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNyAwODo1MDwvdGQ+CgkJCTx0ZD5hY3Rpb248L3RkPgoJCQk8dGQ+cmVhZC1wYXRjaC1kaWZmPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7UGF0Y2hEaWZmJiMzNDs6ICYjMzQ7Y29tbWl0IGU3MmUyYzAwOGM5NTFmYTVkMDdhYmFhZDlkMzJlODc3ODc5ZTJlYTdcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgRnJpIEF1ZyA3IDA4OjUwOjQwIDIwMjYgJiM0MzswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYnBmLmggYi9pbmNsdWRlL2xpbnV4L2JwZi5oXG5pbmRleCA3M2JhY2ZjNjQ0NGRmLi5kNjNjZTgzMTk4Njk2IDEwMDY0NFxuLS0tIGEvaW5jbHVkZS9saW51eC9icGYuaFxuJiM0MzsmIzQzOyYjNDM7IGIvaW5jbHVkZS9saW51eC9icGYuaFxuQEAgLTIxMyw2ICYjNDM7MjEzLDcgQEAgZW51bSBidGZfZmllbGRfdHlwZSB7XG4gXHRCUEZfVVBUUiAgICAgICA9ICgxIFx1MDAzY1x1MDAzYyAxMSksXG4gXHRCUEZfUkVTX1NQSU5fTE9DSyA9ICgxIFx1MDAzY1x1MDAzYyAxMiksXG4gXHRCUEZfVEFTS19XT1JLICA9ICgxIFx1MDAzY1x1MDAzYyAxMyksXG4mIzQzO1x0QlBGX1RIUkVBRF9XUSAgPSAoMSBcdTAwM2NcdTAwM2MgMTQpLFxuIH07XG4gXG4gZW51bSBicGZfY2dyb3VwX3N0b3JhZ2VfdHlwZSB7XG5AQCAtMjY3LDYgJiM0MzsyNjgsNyBAQCBzdHJ1Y3QgYnRmX3JlY29yZCB7XG4gXHRpbnQgd3Ffb2ZmO1xuIFx0aW50IHJlZmNvdW50X29mZjtcbiBcdGludCB0YXNrX3dvcmtfb2ZmO1xuJiM0MztcdGludCB0aHJlYWRfd3Ffb2ZmO1xuIFx0c3RydWN0IGJ0Zl9maWVsZCBmaWVsZHNbXTtcbiB9O1xuIFxuQEAgLTM3Miw2ICYjNDM7Mzc0LDggQEAgc3RhdGljIGlubGluZSBjb25zdCBjaGFyICpidGZfZmllbGRfdHlwZV9uYW1lKGVudW0gYnRmX2ZpZWxkX3R5cGUgdHlwZSlcbiBcdFx0cmV0dXJuIFwmIzM0O2JwZl9yZWZjb3VudFwmIzM0OztcbiBcdGNhc2UgQlBGX1RBU0tfV09SSzpcbiBcdFx0cmV0dXJuIFwmIzM0O2JwZl90YXNrX3dvcmtcJiMzNDs7XG4mIzQzO1x0Y2FzZSBCUEZfVEhSRUFEX1dROlxuJiM0MztcdFx0cmV0dXJuIFwmIzM0O2JwZl90aHJlYWRfd3FcJiMzNDs7XG4gXHRkZWZhdWx0OlxuIFx0XHRXQVJOX09OX09OQ0UoMSk7XG4gXHRcdHJldHVybiBcJiMzNDt1bmtub3duXCYjMzQ7O1xuQEAgLTQxMiw2ICYjNDM7NDE2LDggQEAgc3RhdGljIGlubGluZSB1MzIgYnRmX2ZpZWxkX3R5cGVfc2l6ZShlbnVtIGJ0Zl9maWVsZF90eXBlIHR5cGUpXG4gXHRcdHJldHVybiBzaXplb2Yoc3RydWN0IGJwZl9yZWZjb3VudCk7XG4gXHRjYXNlIEJQRl9UQVNLX1dPUks6XG4gXHRcdHJldHVybiBzaXplb2Yoc3RydWN0IGJwZl90YXNrX3dvcmspO1xuJiM0MztcdGNhc2UgQlBGX1RIUkVBRF9XUTpcbiYjNDM7XHRcdHJldHVybiBzaXplb2Yoc3RydWN0IGJwZl90aHJlYWRfd3EpO1xuIFx0ZGVmYXVsdDpcbiBcdFx0V0FSTl9PTl9PTkNFKDEpO1xuIFx0XHRyZXR1cm4gMDtcbkBAIC00NDYsNiAmIzQzOzQ1Miw4IEBAIHN0YXRpYyBpbmxpbmUgdTMyIGJ0Zl9maWVsZF90eXBlX2FsaWduKGVudW0gYnRmX2ZpZWxkX3R5cGUgdHlwZSlcbiBcdFx0cmV0dXJuIF9fYWxpZ25vZl9fKHN0cnVjdCBicGZfcmVmY291bnQpO1xuIFx0Y2FzZSBCUEZfVEFTS19XT1JLOlxuIFx0XHRyZXR1cm4gX19hbGlnbm9mX18oc3RydWN0IGJwZl90YXNrX3dvcmspO1xuJiM0MztcdGNhc2UgQlBGX1RIUkVBRF9XUTpcbiYjNDM7XHRcdHJldHVybiBfX2FsaWdub2ZfXyhzdHJ1Y3QgYnBmX3RocmVhZF93cSk7XG4gXHRkZWZhdWx0OlxuIFx0XHRXQVJOX09OX09OQ0UoMSk7XG4gXHRcdHJldHVybiAwO1xuQEAgLTQ3OCw2ICYjNDM7NDg2LDcgQEAgc3RhdGljIGlubGluZSB2b2lkIGJwZl9vYmpfaW5pdF9maWVsZChjb25zdCBzdHJ1Y3QgYnRmX2ZpZWxkICpmaWVsZCwgdm9pZCAqYWRkcilcbiBcdGNhc2UgQlBGX0tQVFJfUEVSQ1BVOlxuIFx0Y2FzZSBCUEZfVVBUUjpcbiBcdGNhc2UgQlBGX1RBU0tfV09SSzpcbiYjNDM7XHRjYXNlIEJQRl9USFJFQURfV1E6XG4gXHRcdGJyZWFrO1xuIFx0ZGVmYXVsdDpcbiBcdFx0V0FSTl9PTl9PTkNFKDEpO1xuQEAgLTUwMiw2ICYjNDM7NTExLDcgQEAgc3RhdGljIGlubGluZSBib29sIGJ0Zl9maWVsZF9pc19ubWlfc2FmZShlbnVtIGJ0Zl9maWVsZF90eXBlIHR5cGUpXG4gXHRjYXNlIEJQRl9UQVNLX1dPUks6XG4gXHRjYXNlIEJQRl9LUFRSX1VOUkVGOlxuIFx0Y2FzZSBCUEZfUkVGQ09VTlQ6XG4mIzQzO1x0Y2FzZSBCUEZfVEhSRUFEX1dROlxuIFx0XHRyZXR1cm4gdHJ1ZTtcbiBcdGRlZmF1bHQ6XG4gXHRcdHJldHVybiBmYWxzZTtcbkBAIC02NDQsNiAmIzQzOzY1NCw3IEBAIHZvaWQgY29weV9tYXBfdmFsdWVfbG9ja2VkKHN0cnVjdCBicGZfbWFwICptYXAsIHZvaWQgKmRzdCwgdm9pZCAqc3JjLFxuIHZvaWQgYnBmX3RpbWVyX2NhbmNlbF9hbmRfZnJlZSh2b2lkICp0aW1lcik7XG4gdm9pZCBicGZfd3FfY2FuY2VsX2FuZF9mcmVlKHZvaWQgKnRpbWVyKTtcbiB2b2lkIGJwZl90YXNrX3dvcmtfY2FuY2VsX2FuZF9mcmVlKHZvaWQgKnRpbWVyKTtcbiYjNDM7dm9pZCBicGZfdGhyZWFkX3dxX2NhbmNlbF9hbmRfZnJlZSh2b2lkICp2YWwpO1xuIHZvaWQgYnBmX2xpc3RfaGVhZF9mcmVlKGNvbnN0IHN0cnVjdCBidGZfZmllbGQgKmZpZWxkLCB2b2lkICpsaXN0X2hlYWQsXG4gXHRcdFx0c3RydWN0IGJwZl9zcGluX2xvY2sgKnNwaW5fbG9jayk7XG4gdm9pZCBicGZfcmJfcm9vdF9mcmVlKGNvbnN0IHN0cnVjdCBidGZfZmllbGQgKmZpZWxkLCB2b2lkICpyYl9yb290LFxuQEAgLTcwMSw3ICYjNDM7NzEyLDggQEAgYm9vbCBicGZfbWFwX21ldGFfZXF1YWwoY29uc3Qgc3RydWN0IGJwZl9tYXAgKm1ldGEwLFxuIFxuIHN0YXRpYyBpbmxpbmUgYm9vbCBicGZfbWFwX2hhc19pbnRlcm5hbF9zdHJ1Y3RzKHN0cnVjdCBicGZfbWFwICptYXApXG4ge1xuLVx0cmV0dXJuIGJ0Zl9yZWNvcmRfaGFzX2ZpZWxkKG1hcC1cdTAwM2VyZWNvcmQsIEJQRl9USU1FUiB8IEJQRl9XT1JLUVVFVUUgfCBCUEZfVEFTS19XT1JLKTtcbiYjNDM7XHRyZXR1cm4gYnRmX3JlY29yZF9oYXNfZmllbGQobWFwLVx1MDAzZXJlY29yZCwgQlBGX1RJTUVSIHwgQlBGX1dPUktRVUVVRSB8XG4mIzQzO1x0XHRcdFx0XHRcdCBCUEZfVEFTS19XT1JLIHwgQlBGX1RIUkVBRF9XUSk7XG4gfVxuIFxuIHZvaWQgYnBmX21hcF9mcmVlX2ludGVybmFsX3N0cnVjdHMoc3RydWN0IGJwZl9tYXAgKm1hcCwgdm9pZCAqb2JqKTtcbkBAIC0yNzI1LDYgJiM0MzsyNzM3LDcgQEAgYm9vbCBidGZfcmVjb3JkX2VxdWFsKGNvbnN0IHN0cnVjdCBidGZfcmVjb3JkICpyZWNfYSwgY29uc3Qgc3RydWN0IGJ0Zl9yZWNvcmQgKnJcbiB2b2lkIGJwZl9vYmpfZnJlZV90aW1lcihjb25zdCBzdHJ1Y3QgYnRmX3JlY29yZCAqcmVjLCB2b2lkICpvYmopO1xuIHZvaWQgYnBmX29ial9mcmVlX3dvcmtxdWV1ZShjb25zdCBzdHJ1Y3QgYnRmX3JlY29yZCAqcmVjLCB2b2lkICpvYmopO1xuIHZvaWQgYnBmX29ial9mcmVlX3Rhc2tfd29yayhjb25zdCBzdHJ1Y3QgYnRmX3JlY29yZCAqcmVjLCB2b2lkICpvYmopO1xuJiM0Mzt2b2lkIGJwZl9vYmpfZnJlZV90aHJlYWRfd3EoY29uc3Qgc3RydWN0IGJ0Zl9yZWNvcmQgKnJlYywgdm9pZCAqb2JqKTtcbiB2b2lkIGJwZl9vYmpfY2FuY2VsX2ZpZWxkcyhzdHJ1Y3QgYnBmX21hcCAqbWFwLCB2b2lkICpvYmopO1xuIHZvaWQgYnBmX29ial9mcmVlX2ZpZWxkcyhjb25zdCBzdHJ1Y3QgYnRmX3JlY29yZCAqcmVjLCB2b2lkICpvYmopO1xuIHZvaWQgX19icGZfb2JqX2Ryb3BfaW1wbCh2b2lkICpwLCBjb25zdCBzdHJ1Y3QgYnRmX3JlY29yZCAqcmVjLCBib29sIHBlcmNwdSk7XG5kaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9jZ3JvdXAuaCBiL2luY2x1ZGUvbGludXgvY2dyb3VwLmhcbmluZGV4IGYyYWE0NmE0Zjg3MWUuLjliNGE4ZGM3NDhhY2UgMTAwNjQ0XG4tLS0gYS9pbmNsdWRlL2xpbnV4L2Nncm91cC5oXG4mIzQzOyYjNDM7JiM0MzsgYi9pbmNsdWRlL2xpbnV4L2Nncm91cC5oXG5AQCAtOTIzLDQgJiM0Mzs5MjMsNiBAQCBzdHJ1Y3QgY2dyb3VwICp0YXNrX2dldF9jZ3JvdXAxKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLCBpbnQgaGllcmFyY2h5X2lkKTtcbiBcbiBzdHJ1Y3QgY2dyb3VwX29mX3BlYWsgKm9mX3BlYWsoc3RydWN0IGtlcm5mc19vcGVuX2ZpbGUgKm9mKTtcbiBcbiYjNDM7aW50IGNncm91cF9rdGhyZWFkX2F0dGFjaChzdHJ1Y3QgY2dyb3VwICpjZ3JwLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spO1xuJiM0MztcbiAjZW5kaWYgLyogX0xJTlVYX0NHUk9VUF9IICovXG5kaWZmIC0tZ2l0IGEvaW5jbHVkZS91YXBpL2xpbnV4L2JwZi5oIGIvaW5jbHVkZS91YXBpL2xpbnV4L2JwZi5oXG5pbmRleCBmZmQ5NmU4YjkyMGJkLi4wNTU4NTIwZjY3ZmU0IDEwMDY0NFxuLS0tIGEvaW5jbHVkZS91YXBpL2xpbnV4L2JwZi5oXG4mIzQzOyYjNDM7JiM0MzsgYi9pbmNsdWRlL3VhcGkvbGludXgvYnBmLmhcbkBAIC03NTc0LDYgJiM0Mzs3NTc0LDEwIEBAIHN0cnVjdCBicGZfd3Ege1xuIFx0X191NjQgX19vcGFxdWVbMl07XG4gfSBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDgpKSk7XG4gXG4mIzQzO3N0cnVjdCBicGZfdGhyZWFkX3dxIHtcbiYjNDM7XHRfX3U2NCBfX29wYXF1ZVsyXTtcbiYjNDM7fSBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDgpKSk7XG4mIzQzO1xuIHN0cnVjdCBicGZfZHlucHRyIHtcbiBcdF9fdTY0IF9fb3BhcXVlWzJdO1xuIH0gX19hdHRyaWJ1dGVfXygoYWxpZ25lZCg4KSkpO1xuZGlmZiAtLWdpdCBhL2tlcm5lbC9icGYvYnRmLmMgYi9rZXJuZWwvYnBmL2J0Zi5jXG5pbmRleCA0MjQxNDYzM2NmMjYzLi5iZjZmYjVmNTFkMjFhIDEwMDY0NFxuLS0tIGEva2VybmVsL2JwZi9idGYuY1xuJiM0MzsmIzQzOyYjNDM7IGIva2VybmVsL2JwZi9idGYuY1xuQEAgLTM2NjUsNiAmIzQzOzM2NjUsNyBAQCBzdGF0aWMgaW50IGJ0Zl9nZXRfZmllbGRfdHlwZShjb25zdCBzdHJ1Y3QgYnRmICpidGYsIGNvbnN0IHN0cnVjdCBidGZfdHlwZSAqdmFyX1xuIFx0XHR7IEJQRl9USU1FUiwgXCYjMzQ7YnBmX3RpbWVyXCYjMzQ7LCB0cnVlIH0sXG4gXHRcdHsgQlBGX1dPUktRVUVVRSwgXCYjMzQ7YnBmX3dxXCYjMzQ7LCB0cnVlIH0sXG4gXHRcdHsgQlBGX1RBU0tfV09SSywgXCYjMzQ7YnBmX3Rhc2tfd29ya1wmIzM0OywgdHJ1ZSB9LFxuJiM0MztcdFx0eyBCUEZfVEhSRUFEX1dRLCBcJiMzNDticGZfdGhyZWFkX3dxXCYjMzQ7LCB0cnVlIH0sXG4gXHRcdHsgQlBGX0xJU1RfSEVBRCwgXCYjMzQ7YnBmX2xpc3RfaGVhZFwmIzM0OywgZmFsc2UgfSxcbiBcdFx0eyBCUEZfTElTVF9OT0RFLCBcJiMzNDticGZfbGlzdF9ub2RlXCYjMzQ7LCBmYWxzZSB9LFxuIFx0XHR7IEJQRl9SQl9ST09ULCBcJiMzNDticGZfcmJfcm9vdFwmIzM0OywgZmFsc2UgfSxcbkBAIC0zODUwLDYgJiM0MzszODUxLDcgQEAgc3RhdGljIGludCBidGZfZmluZF9maWVsZF9vbmUoY29uc3Qgc3RydWN0IGJ0ZiAqYnRmLFxuIFx0Y2FzZSBCUEZfUkJfTk9ERTpcbiBcdGNhc2UgQlBGX1JFRkNPVU5UOlxuIFx0Y2FzZSBCUEZfVEFTS19XT1JLOlxuJiM0MztcdGNhc2UgQlBGX1RIUkVBRF9XUTpcbiBcdFx0cmV0ID0gYnRmX2ZpbmRfc3RydWN0KGJ0ZiwgdmFyX3R5cGUsIG9mZiwgc3osIGZpZWxkX3R5cGUsXG4gXHRcdFx0XHQgICAgICBpbmZvX2NudCA/IFx1MDAyNmluZm9bMF0gOiBcdTAwMjZ0bXApO1xuIFx0XHRpZiAocmV0IFx1MDAzYyAwKVxuQEAgLTQxNDUsNiAmIzQzOzQxNDcsNyBAQCBzdHJ1Y3QgYnRmX3JlY29yZCAqYnRmX3BhcnNlX2ZpZWxkcyhjb25zdCBzdHJ1Y3QgYnRmICpidGYsIGNvbnN0IHN0cnVjdCBidGZfdHlwZVxuIFx0cmVjLVx1MDAzZXdxX29mZiA9IC1FSU5WQUw7XG4gXHRyZWMtXHUwMDNlcmVmY291bnRfb2ZmID0gLUVJTlZBTDtcbiBcdHJlYy1cdTAwM2V0YXNrX3dvcmtfb2ZmID0gLUVJTlZBTDtcbiYjNDM7XHRyZWMtXHUwMDNldGhyZWFkX3dxX29mZiA9IC1FSU5WQUw7XG4gXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBjbnQ7IGkmIzQzOyYjNDM7KSB7XG4gXHRcdGZpZWxkX3R5cGVfc2l6ZSA9IGJ0Zl9maWVsZF90eXBlX3NpemUoaW5mb19hcnJbaV0udHlwZSk7XG4gXHRcdGlmIChpbmZvX2FycltpXS5vZmYgJiM0MzsgZmllbGRfdHlwZV9zaXplIFx1MDAzZSB2YWx1ZV9zaXplKSB7XG5AQCAtNDE4OCw2ICYjNDM7NDE5MSwxMCBAQCBzdHJ1Y3QgYnRmX3JlY29yZCAqYnRmX3BhcnNlX2ZpZWxkcyhjb25zdCBzdHJ1Y3QgYnRmICpidGYsIGNvbnN0IHN0cnVjdCBidGZfdHlwZVxuIFx0XHRcdFdBUk5fT05fT05DRShyZWMtXHUwMDNldGFza193b3JrX29mZiBcdTAwM2U9IDApO1xuIFx0XHRcdHJlYy1cdTAwM2V0YXNrX3dvcmtfb2ZmID0gcmVjLVx1MDAzZWZpZWxkc1tpXS5vZmZzZXQ7XG4gXHRcdFx0YnJlYWs7XG4mIzQzO1x0XHRjYXNlIEJQRl9USFJFQURfV1E6XG4mIzQzO1x0XHRcdFdBUk5fT05fT05DRShyZWMtXHUwMDNldGhyZWFkX3dxX29mZiBcdTAwM2U9IDApO1xuJiM0MztcdFx0XHRyZWMtXHUwMDNldGhyZWFkX3dxX29mZiA9IHJlYy1cdTAwM2VmaWVsZHNbaV0ub2Zmc2V0O1xuJiM0MztcdFx0XHRicmVhaztcbiBcdFx0Y2FzZSBCUEZfUkVGQ09VTlQ6XG4gXHRcdFx0V0FSTl9PTl9PTkNFKHJlYy1cdTAwM2VyZWZjb3VudF9vZmYgXHUwMDNlPSAwKTtcbiBcdFx0XHQvKiBDYWNoZSBvZmZzZXQgZm9yIGZhc3RlciBsb29rdXAgYXQgcnVudGltZSAqL1xuZGlmZiAtLWdpdCBhL2tlcm5lbC9icGYvaGVscGVycy5jIGIva2VybmVsL2JwZi9oZWxwZXJzLmNcbmluZGV4IDYzODhiNmIyM2U0OTAuLjhlMDFiYWQxYjE2YTAgMTAwNjQ0XG4tLS0gYS9rZXJuZWwvYnBmL2hlbHBlcnMuY1xuJiM0MzsmIzQzOyYjNDM7IGIva2VybmVsL2JwZi9oZWxwZXJzLmNcbkBAIC0yOSw2ICYjNDM7MjksOCBAQFxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L3Rhc2tfd29yay5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvaXJxX3dvcmsuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L2J1aWxkaWQuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9rdGhyZWFkLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjbGludXgvamhhc2guaFx1MDAzZVxuIFxuICNpbmNsdWRlIFwmIzM0Oy4uLy4uL2xpYi9rc3RydG94LmhcJiMzNDtcbiBcbkBAIC0xMTEwLDYgJiM0MzsxMTEyLDE3IEBAIHN0YXRpYyB2b2lkICptYXBfa2V5X2Zyb21fdmFsdWUoc3RydWN0IGJwZl9tYXAgKm1hcCwgdm9pZCAqdmFsdWUsIHUzMiAqYXJyX2lkeClcbiBcdHJldHVybiAodm9pZCAqKXZhbHVlIC0gcm91bmRfdXAobWFwLVx1MDAzZWtleV9zaXplLCA4KTtcbiB9XG4gXG4mIzQzO3N0YXRpYyB1MzIgYnBmX21hcF9lbGVtX2lkX2Zyb21fdmFsdWUoc3RydWN0IGJwZl9tYXAgKm1hcCwgdm9pZCAqdmFsdWUpXG4mIzQzO3tcbiYjNDM7XHR1MzIgYXJyX2lkeDtcbiYjNDM7XHR2b2lkICprZXk7XG4mIzQzO1xuJiM0MztcdGtleSA9IG1hcF9rZXlfZnJvbV92YWx1ZShtYXAsIHZhbHVlLCBcdTAwMjZhcnJfaWR4KTtcbiYjNDM7XHRpZiAobWFwLVx1MDAzZW1hcF90eXBlID09IEJQRl9NQVBfVFlQRV9BUlJBWSlcbiYjNDM7XHRcdHJldHVybiBhcnJfaWR4O1xuJiM0MztcdHJldHVybiBqaGFzaChrZXksIG1hcC1cdTAwM2VrZXlfc2l6ZSwgMCk7XG4mIzQzO31cbiYjNDM7XG4gZW51bSBicGZfYXN5bmNfdHlwZSB7XG4gXHRCUEZfQVNZTkNfVFlQRV9USU1FUiA9IDAsXG4gXHRCUEZfQVNZTkNfVFlQRV9XUSxcbkBAIC00NzY5LDYgJiM0Mzs0NzgyLDM5NyBAQCBfX2JwZl9rZnVuYyBpbnQgYnBmX3RpbWVyX2NhbmNlbF9hc3luYyhzdHJ1Y3QgYnBmX3RpbWVyICp0aW1lcilcbiBcdH1cbiB9XG4gXG4mIzQzOy8qXG4mIzQzOyAqIEJQRiB0aHJlYWQgd29ya3F1ZXVlIChrdGhyZWFkX3dvcmtlciBiYXNlZCkgaW1wbGVtZW50YXRpb25cbiYjNDM7ICpcbiYjNDM7ICogV2h5IGJwZl90aHJlYWRfd3EgZG9lcyBOT1QgdXNlIHRoZSBicGZfYXN5bmMgaW5mcmFzdHJ1Y3R1cmU6XG4mIzQzOyAqXG4mIzQzOyAqIGJwZl90aW1lciBhbmQgYnBmX3dxIHNoYXJlIGEgY29tbW9uIGNsZWFudXAgcGF0aCB2aWEgYnBmX2FzeW5jOlxuJiM0MzsgKlxuJiM0MzsgKiAgIGJwZl9hc3luY19jYW5jZWxfYW5kX2ZyZWUoKVxuJiM0MzsgKiAgICAgLVx1MDAzZSBicGZfYXN5bmNfc2NoZWR1bGVfb3AoKVxuJiM0MzsgKiAgICAgICAtXHUwMDNlIGlycV93b3JrX3F1ZXVlKCkgICAgICAgICAgICAgICAgLy8gc2NoZWR1bGUgZnJvbSBhbnkgY29udGV4dFxuJiM0MzsgKiAgICAgICAgIC1cdTAwM2UgYnBmX2FzeW5jX3Byb2Nlc3Nfb3AoKSAgICAgICAgLy8gcnVucyBpbiBoYXJkaXJxIGNvbnRleHRcbiYjNDM7ICogICAgICAgICAgIC1cdTAwM2UgYnBmX3dxX3dvcmsoKSAvIHRpbWVyIGNiICAgIC8vIGF0b21pYywgbm9uLXNsZWVwYWJsZVxuJiM0MzsgKlxuJiM0MzsgKiBUaGlzIHdvcmtzIGZvciB0aW1lciBhbmQgd29ya3F1ZXVlIGJlY2F1c2UgdGhlaXIgY2FsbGJhY2tzIGFuZFxuJiM0MzsgKiBjYW5jZWxsYXRpb24gKGhydGltZXJfY2FuY2VsIC8gYnBmX3dxX2NhbmNlbF9hbmRfZnJlZSkgY29tcGxldGVcbiYjNDM7ICogc3luY2hyb25vdXNseSBhbmQgbmVlZCBub3Qgc2xlZXAuICBUaGUgaGFyZGlycSBjb250ZXh0IGlzIHN1ZmZpY2llbnQuXG4mIzQzOyAqXG4mIzQzOyAqIGJwZl90aHJlYWRfd3EgaXMgZGlmZmVyZW50OiBjYW5jZWxsYXRpb24gYW5kIGZpbmFsIGNsZWFudXAgbWF5IG5lZWQgdG9cbiYjNDM7ICogc2xlZXA6XG4mIzQzOyAqXG4mIzQzOyAqICAga3RocmVhZF9jYW5jZWxfd29ya19zeW5jKCkgICAgLSB3YWl0cyBmb3IgdGhlIHdvcmsgdG8gZmluaXNoLCBjYW5cbiYjNDM7ICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2hlZHVsZSBvdXQgaWYgdGhlIHdvcmsgaXMgcnVubmluZy5cbiYjNDM7ICogICBrdGhyZWFkX2Rlc3Ryb3lfd29ya2VyKCkgICAgICAtIHN0b3BzIHRoZSBrdGhyZWFkLCBpbnRlcm5hbGx5XG4mIzQzOyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVzIHdpdGgga3RocmVhZCBleGl0LlxuJiM0MzsgKiAgIGNncm91cF9wdXQoKSAoZmluYWwgcHV0KSAgICAgIC0gbWF5IGFjcXVpcmUgY2dyb3VwX211dGV4IGFuZCBvdGhlclxuJiM0MzsgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsZWVwaW5nIGxvY2tzIGR1cmluZyBvZmZsaW5lLlxuJiM0MzsgKlxuJiM0MzsgKiBOb25lIG9mIHRoZXNlIGNhbiBiZSBjYWxsZWQgZnJvbSBoYXJkaXJxIGNvbnRleHQgKGlycV93b3JrKS4gRG9pbmcgc29cbiYjNDM7ICogd291bGQgdHJpZ2dlciBtaWdodF9zbGVlcCgpIHdhcm5pbmdzIG9yIGRlYWRsb2NrLlxuJiM0MzsgKlxuJiM0MzsgKiBUaGVyZWZvcmUgYnBmX3RocmVhZF93cSBpbXBsZW1lbnRzIGl0cyBvd24gUkNVLWJhc2VkIGNsZWFudXA6XG4mIzQzOyAqXG4mIzQzOyAqICAgYnBmX3RocmVhZF93cV9jYW5jZWxfYW5kX2ZyZWUoKSAgICAgICAgLy8gc2xlZXBhYmxlIChjYWxsZWQgZnJvbVxuJiM0MzsgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1hcCBmcmVlIC8gZWxlbSBkZWxldGUpXG4mIzQzOyAqICAgICAtXHUwMDNlIHhjaGcoY3R4LCBOVUxMKSAgICAgICAgICAgICAgICAgICAvLyBkZXRhY2ggYXRvbWljYWxseVxuJiM0MzsgKiAgICAgLVx1MDAzZSBrdGhyZWFkX2NhbmNlbF93b3JrX3N5bmMoKSAgICAgICAgLy8gb2sgdG8gc2xlZXBcbiYjNDM7ICogICAgIC1cdTAwM2UgYnBmX3RocmVhZF93cV9jdHhfcHV0KClcbiYjNDM7ICogICAgICAgLVx1MDAzZSBjYWxsX3JjdV90YXNrc190cmFjZSgpICAgICAgICAgIC8vIHdhaXQgZm9yIEJQRiBjYWxsYmFja3NcbiYjNDM7ICogICAgICAgICAtXHUwMDNlIHNjaGVkdWxlX3dvcmsoKSAgICAgICAgICAgICAgIC8vIHN3aXRjaCB0byBzbGVlcGFibGUgY29udGV4dFxuJiM0MzsgKiAgICAgICAgICAgLVx1MDAzZSBicGZfdGhyZWFkX3dxX2Rlc3Ryb3lfd29ya19mbigpXG4mIzQzOyAqICAgICAgICAgICAgIC1cdTAwM2UgYnBmX3Byb2dfcHV0KClcbiYjNDM7ICogICAgICAgICAgICAgLVx1MDAzZSBjZ3JvdXBfcHV0KClcbiYjNDM7ICogICAgICAgICAgICAgLVx1MDAzZSBrdGhyZWFkX2Rlc3Ryb3lfd29ya2VyKClcbiYjNDM7ICogICAgICAgICAgICAgLVx1MDAzZSBrZnJlZShjdHgpXG4mIzQzOyAqXG4mIzQzOyAqIFRoZSBzYW1lIGRlc2lnbiBjaG9pY2Ugd2FzIG1hZGUgZm9yIGJwZl90YXNrX3dvcmssIHdoaWNoIGFsc28gYXZvaWRzXG4mIzQzOyAqIGJwZl9hc3luYyBiZWNhdXNlIHRhc2tfd29yayBjYW5jZWxsYXRpb24gc3luY2hyb25pemVzIHdpdGggdGhlIHRhc2tcbiYjNDM7ICogYW5kIG1heSBzbGVlcC5cbiYjNDM7ICovXG4mIzQzO1xuJiM0MztzdHJ1Y3QgYnBmX3RocmVhZF93cV9jdHgge1xuJiM0MztcdHN0cnVjdCBrdGhyZWFkX3dvcmtlciAqd29ya2VyO1xuJiM0MztcdHN0cnVjdCBrdGhyZWFkX3dvcmsgd29yaztcbiYjNDM7XHRzdHJ1Y3QgYnBmX3Byb2cgKnByb2c7XG4mIzQzO1x0YnBmX2NhbGxiYWNrX3QgY2FsbGJhY2tfZm47XG4mIzQzO1x0c3RydWN0IGJwZl9tYXAgKm1hcDtcbiYjNDM7XHR2b2lkICp2YWx1ZTtcbiYjNDM7XHRzdHJ1Y3QgY2dyb3VwICpjZ3JwO1xuJiM0MztcdHJlZmNvdW50X3QgcmVmY250O1xuJiM0MztcdHN0cnVjdCByY3VfaGVhZCByY3U7XG4mIzQzO1x0c3RydWN0IHdvcmtfc3RydWN0IGRlc3Ryb3lfd29yaztcbiYjNDM7fTtcbiYjNDM7XG4mIzQzOy8qIEtlcm5lbC1pbnRlcm5hbCByZXByZXNlbnRhdGlvbiB0aGF0IGZpdHMgaW4gc3RydWN0IGJwZl90aHJlYWRfd3EgKi9cbiYjNDM7c3RydWN0IGJwZl90aHJlYWRfd3Ffa2VybiB7XG4mIzQzO1x0c3RydWN0IGJwZl90aHJlYWRfd3FfY3R4ICpjdHg7XG4mIzQzO30gX19hbGlnbmVkKDgpO1xuJiM0MztcbiYjNDM7c3RhdGljIHZvaWQgYnBmX3RocmVhZF93cV9kZXN0cm95X3dvcmtfZm4oc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IGJwZl90aHJlYWRfd3FfY3R4ICpjdHggPSBjb250YWluZXJfb2Yod29yayxcbiYjNDM7XHRcdFx0XHRcdFx0ICAgICBzdHJ1Y3QgYnBmX3RocmVhZF93cV9jdHgsXG4mIzQzO1x0XHRcdFx0XHRcdCAgICAgZGVzdHJveV93b3JrKTtcbiYjNDM7XG4mIzQzO1x0aWYgKGN0eC1cdTAwM2Vwcm9nKVxuJiM0MztcdFx0YnBmX3Byb2dfcHV0KGN0eC1cdTAwM2Vwcm9nKTtcbiYjNDM7XHRpZiAoY3R4LVx1MDAzZWNncnApXG4mIzQzO1x0XHRjZ3JvdXBfcHV0KGN0eC1cdTAwM2VjZ3JwKTtcbiYjNDM7XHRpZiAoY3R4LVx1MDAzZXdvcmtlcilcbiYjNDM7XHRcdGt0aHJlYWRfZGVzdHJveV93b3JrZXIoY3R4LVx1MDAzZXdvcmtlcik7XG4mIzQzO1x0a2ZyZWUoY3R4KTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIHZvaWQgYnBmX3RocmVhZF93cV9jdHhfZnJlZV9yY3Uoc3RydWN0IHJjdV9oZWFkICpyY3UpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgYnBmX3RocmVhZF93cV9jdHggKmN0eCA9IGNvbnRhaW5lcl9vZihyY3UsXG4mIzQzO1x0XHRcdFx0XHRcdCAgICAgc3RydWN0IGJwZl90aHJlYWRfd3FfY3R4LFxuJiM0MztcdFx0XHRcdFx0XHQgICAgIHJjdSk7XG4mIzQzO1xuJiM0MztcdElOSVRfV09SSyhcdTAwMjZjdHgtXHUwMDNlZGVzdHJveV93b3JrLCBicGZfdGhyZWFkX3dxX2Rlc3Ryb3lfd29ya19mbik7XG4mIzQzO1x0c2NoZWR1bGVfd29yayhcdTAwMjZjdHgtXHUwMDNlZGVzdHJveV93b3JrKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIHZvaWQgYnBmX3RocmVhZF93cV9jdHhfcHV0KHN0cnVjdCBicGZfdGhyZWFkX3dxX2N0eCAqY3R4KVxuJiM0Mzt7XG4mIzQzO1x0aWYgKCFyZWZjb3VudF9kZWNfYW5kX3Rlc3QoXHUwMDI2Y3R4LVx1MDAzZXJlZmNudCkpXG4mIzQzO1x0XHRyZXR1cm47XG4mIzQzO1x0Y2FsbF9yY3VfdGFza3NfdHJhY2UoXHUwMDI2Y3R4LVx1MDAzZXJjdSwgYnBmX3RocmVhZF93cV9jdHhfZnJlZV9yY3UpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgdm9pZCBicGZfdGhyZWFkX3dxX3dvcmtfZm4oc3RydWN0IGt0aHJlYWRfd29yayAqd29yaylcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBicGZfdGhyZWFkX3dxX2N0eCAqY3R4ID0gY29udGFpbmVyX29mKHdvcmssXG4mIzQzO1x0XHRcdFx0XHRcdCAgICAgc3RydWN0IGJwZl90aHJlYWRfd3FfY3R4LFxuJiM0MztcdFx0XHRcdFx0XHQgICAgIHdvcmspO1xuJiM0MztcdGJwZl9jYWxsYmFja190IGNhbGxiYWNrX2ZuO1xuJiM0MztcdHZvaWQgKnZhbHVlID0gY3R4LVx1MDAzZXZhbHVlO1xuJiM0MztcdHN0cnVjdCBicGZfbWFwICptYXAgPSBjdHgtXHUwMDNlbWFwO1xuJiM0MztcdHZvaWQgKmtleTtcbiYjNDM7XHR1MzIgaWR4O1xuJiM0MztcbiYjNDM7XHRCVEZfVFlQRV9FTUlUKHN0cnVjdCBicGZfdGhyZWFkX3dxKTtcbiYjNDM7XG4mIzQzO1x0Y2FsbGJhY2tfZm4gPSBSRUFEX09OQ0UoY3R4LVx1MDAzZWNhbGxiYWNrX2ZuKTtcbiYjNDM7XHRpZiAoIWNhbGxiYWNrX2ZuKVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1x0a2V5ID0gbWFwX2tleV9mcm9tX3ZhbHVlKG1hcCwgdmFsdWUsIFx1MDAyNmlkeCk7XG4mIzQzO1xuJiM0MztcdHJjdV9yZWFkX2xvY2tfdHJhY2UoKTtcbiYjNDM7XHRtaWdyYXRlX2Rpc2FibGUoKTtcbiYjNDM7XG4mIzQzO1x0Y2FsbGJhY2tfZm4gPSBSRUFEX09OQ0UoY3R4LVx1MDAzZWNhbGxiYWNrX2ZuKTtcbiYjNDM7XHRpZiAoY2FsbGJhY2tfZm4pXG4mIzQzO1x0XHRjYWxsYmFja19mbigodTY0KShsb25nKW1hcCwgKHU2NCkobG9uZylrZXksICh1NjQpKGxvbmcpdmFsdWUsXG4mIzQzO1x0XHRcdCAgICAwLCAwKTtcbiYjNDM7XG4mIzQzO1x0bWlncmF0ZV9lbmFibGUoKTtcbiYjNDM7XHRyY3VfcmVhZF91bmxvY2tfdHJhY2UoKTtcbiYjNDM7XG4mIzQzO291dDpcbiYjNDM7XHRicGZfdGhyZWFkX3dxX2N0eF9wdXQoY3R4KTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LypcbiYjNDM7ICogYnBmX3RocmVhZF93cV9pbml0KCkgY3JlYXRlcyBhIGt0aHJlYWQgd29ya2VyIGFuZCBtYXkgYXR0YWNoIGl0IHRvIGEgY2dyb3VwLlxuJiM0MzsgKiBUaGUgaGVscGVycyB1c2VkIGhlcmUgY2FuIHNsZWVwIGFuZCBhY3F1aXJlIHNldmVyYWwgbG9ja3MgdGhyb3VnaCBrdGhyZWFkXG4mIzQzOyAqIGNyZWF0aW9uL2Rlc3RydWN0aW9uLCBjZ3JvdXAgbG9va3VwIGFuZCBjZ3JvdXAga3RocmVhZCBhdHRhY2htZW50LiBLZWVwIHRoaXNcbiYjNDM7ICoga2Z1bmMgYXZhaWxhYmxlIG9ubHkgdG8gQlBGX1BST0dfVFlQRV9TWVNDQUxMIHByb2dyYW1zIHNvIGl0IGlzIG5vdCBpbnZva2VkXG4mIzQzOyAqIGZyb20gQlBGIHByb2dyYW0gY29udGV4dHMgdGhhdCBhbHJlYWR5IGhvbGQgbG9ja3Mgd2hpY2ggY291bGQgZGVhZGxvY2sgd2l0aFxuJiM0MzsgKiB0aG9zZSBwYXRocy5cbiYjNDM7ICovXG4mIzQzO19fYnBmX2tmdW5jIGludCBicGZfdGhyZWFkX3dxX2luaXQoc3RydWN0IGJwZl90aHJlYWRfd3EgKnR3cSwgdm9pZCAqcF9fbWFwLFxuJiM0MztcdFx0XHRcdCAgIHU2NCBjZ3JvdXBfaWQsIHVuc2lnbmVkIGludCBmbGFncylcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBicGZfdGhyZWFkX3dxX2tlcm4gKnR3ayA9IChzdHJ1Y3QgYnBmX3RocmVhZF93cV9rZXJuICopdHdxO1xuJiM0MztcdHN0cnVjdCBicGZfbWFwICptYXAgPSBwX19tYXA7XG4mIzQzO1x0c3RydWN0IGJwZl90aHJlYWRfd3FfY3R4ICpjdHgsICpvbGRfY3R4O1xuJiM0MztcdHN0cnVjdCBrdGhyZWFkX3dvcmtlciAqd29ya2VyO1xuJiM0MztcdHN0cnVjdCBjZ3JvdXAgKmNncnAgPSBOVUxMO1xuJiM0MztcdHZvaWQgKnZhbHVlO1xuJiM0MztcdHUzMiBlbGVtX2lkO1xuJiM0MztcdGludCBlcnI7XG4mIzQzO1xuJiM0MztcdEJVSUxEX0JVR19PTihzaXplb2Yoc3RydWN0IGJwZl90aHJlYWRfd3Ffa2VybilcbiYjNDM7XHRcdFx0XHUwMDNlIHNpemVvZihzdHJ1Y3QgYnBmX3RocmVhZF93cSkpO1xuJiM0MztcdEJVSUxEX0JVR19PTihfX2FsaWdub2ZfXyhzdHJ1Y3QgYnBmX3RocmVhZF93cV9rZXJuKVxuJiM0MztcdFx0XHQhPSBfX2FsaWdub2ZfXyhzdHJ1Y3QgYnBmX3RocmVhZF93cSkpO1xuJiM0MztcbiYjNDM7XHRpZiAoZmxhZ3MpXG4mIzQzO1x0XHRyZXR1cm4gLUVJTlZBTDtcbiYjNDM7XG4mIzQzO1x0b2xkX2N0eCA9IFJFQURfT05DRSh0d2stXHUwMDNlY3R4KTtcbiYjNDM7XHRpZiAob2xkX2N0eClcbiYjNDM7XHRcdHJldHVybiAtRUJVU1k7XG4mIzQzO1xuJiM0MztcdHZhbHVlID0gKHZvaWQgKil0d3EgLSBtYXAtXHUwMDNlcmVjb3JkLVx1MDAzZXRocmVhZF93cV9vZmY7XG4mIzQzO1x0ZWxlbV9pZCA9IGJwZl9tYXBfZWxlbV9pZF9mcm9tX3ZhbHVlKG1hcCwgdmFsdWUpO1xuJiM0MztcdHdvcmtlciA9IGt0aHJlYWRfcnVuX3dvcmtlcigwLCBcJiMzNDticGZfdHdxLyVkLyV4XCYjMzQ7LCBtYXAtXHUwMDNlaWQsIGVsZW1faWQpO1xuJiM0MztcdGlmIChJU19FUlIod29ya2VyKSlcbiYjNDM7XHRcdHJldHVybiBQVFJfRVJSKHdvcmtlcik7XG4mIzQzO1xuJiM0MztcdC8qIFNldHVwIGN0eC4gKi9cbiYjNDM7XHRjdHggPSBicGZfbWFwX2ttYWxsb2Nfbm9sb2NrKG1hcCwgc2l6ZW9mKCpjdHgpLCBHRlBfS0VSTkVMLFxuJiM0MztcdFx0XHRcdCAgICAgbWFwLVx1MDAzZW51bWFfbm9kZSk7XG4mIzQzO1x0aWYgKCFjdHgpIHtcbiYjNDM7XHRcdGVyciA9IC1FTk9NRU07XG4mIzQzO1x0XHRnb3RvIGRlc3Ryb3lfd29ya2VyO1xuJiM0MztcdH1cbiYjNDM7XHRtZW1zZXQoY3R4LCAwLCBzaXplb2YoKmN0eCkpO1xuJiM0MztcdGN0eC1cdTAwM2V3b3JrZXIgPSB3b3JrZXI7XG4mIzQzO1x0Y3R4LVx1MDAzZW1hcCA9IG1hcDtcbiYjNDM7XHRjdHgtXHUwMDNldmFsdWUgPSB2YWx1ZTtcbiYjNDM7XHRyZWZjb3VudF9zZXQoXHUwMDI2Y3R4LVx1MDAzZXJlZmNudCwgMSk7XG4mIzQzO1x0a3RocmVhZF9pbml0X3dvcmsoXHUwMDI2Y3R4LVx1MDAzZXdvcmssIGJwZl90aHJlYWRfd3Ffd29ya19mbik7XG4mIzQzO1xuJiM0MztcdGlmIChjZ3JvdXBfaWQpIHtcbiYjNDM7I2lmZGVmIENPTkZJR19DR1JPVVBTXG4mIzQzO1x0XHRjZ3JwID0gY2dyb3VwX2dldF9mcm9tX2lkKGNncm91cF9pZCk7XG4mIzQzO1x0XHRpZiAoSVNfRVJSKGNncnApKSB7XG4mIzQzO1x0XHRcdGVyciA9IFBUUl9FUlIoY2dycCk7XG4mIzQzO1x0XHRcdGdvdG8ga2ZyZWVfY3R4O1xuJiM0MztcdFx0fVxuJiM0MztcdFx0Y3R4LVx1MDAzZWNncnAgPSBjZ3JwO1xuJiM0MztcbiYjNDM7XHRcdC8qXG4mIzQzO1x0XHQgKiBrdGhyZWFkX3J1bl93b3JrZXIoKSB3YWtlcyB0aGUga3RocmVhZCwgYnV0IGl0IG1heSBub3QgaGF2ZVxuJiM0MztcdFx0ICogZXhlY3V0ZWQgY2dyb3VwX2t0aHJlYWRfcmVhZHkoKSB5ZXQsIHdoaWNoIGNsZWFyc1xuJiM0MztcdFx0ICogbm9fY2dyb3VwX21pZ3JhdGlvbi5cbiYjNDM7XHRcdCAqIERvIGEgcXVldWUgd29yayBhbmQgZmx1c2ggdG8gd2FpdCB0aGUga3RocmVhZCBydW4uXG4mIzQzO1x0XHQgKi9cbiYjNDM7XHRcdHJlZmNvdW50X2luYyhcdTAwMjZjdHgtXHUwMDNlcmVmY250KTtcbiYjNDM7XHRcdGlmICgha3RocmVhZF9xdWV1ZV93b3JrKGN0eC1cdTAwM2V3b3JrZXIsIFx1MDAyNmN0eC1cdTAwM2V3b3JrKSkge1xuJiM0MztcdFx0XHRyZWZjb3VudF9kZWMoXHUwMDI2Y3R4LVx1MDAzZXJlZmNudCk7XG4mIzQzO1x0XHRcdGVyciA9IC1FQlVTWTtcbiYjNDM7XHRcdFx0Z290byBjZ3JvdXBfcHV0O1xuJiM0MztcdFx0fVxuJiM0MztcdFx0a3RocmVhZF9mbHVzaF93b3JrKFx1MDAyNmN0eC1cdTAwM2V3b3JrKTtcbiYjNDM7XG4mIzQzO1x0XHRpZiAod29ya2VyLVx1MDAzZXRhc2stXHUwMDNlbm9fY2dyb3VwX21pZ3JhdGlvbikge1xuJiM0MztcdFx0XHRlcnIgPSAtRUFHQUlOO1xuJiM0MztcdFx0XHRnb3RvIGNncm91cF9wdXQ7XG4mIzQzO1x0XHR9XG4mIzQzO1xuJiM0MztcdFx0ZXJyID0gY2dyb3VwX2t0aHJlYWRfYXR0YWNoKGNncnAsIHdvcmtlci1cdTAwM2V0YXNrKTtcbiYjNDM7XHRcdGlmIChlcnIpXG4mIzQzO1x0XHRcdGdvdG8gY2dyb3VwX3B1dDtcbiYjNDM7I2Vsc2VcbiYjNDM7XHRcdGVyciA9IC1FT1BOT1RTVVBQO1xuJiM0MztcdFx0Z290byBrZnJlZV9jdHg7XG4mIzQzOyNlbmRpZlxuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0b2xkX2N0eCA9IGNtcHhjaGcoXHUwMDI2dHdrLVx1MDAzZWN0eCwgTlVMTCwgY3R4KTtcbiYjNDM7XHRpZiAob2xkX2N0eCkge1xuJiM0MztcdFx0ZXJyID0gLUVCVVNZO1xuJiM0MztcdFx0Z290byBjZ3JvdXBfcHV0O1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0LypcbiYjNDM7XHQgKiBQYWlyZWQgd2l0aCB0aGUgbWFwIGRlc3RydWN0aW9uIHBhdGguICBFbnN1cmVzIHRoYXQgY3R4IGlzIGdsb2JhbGx5XG4mIzQzO1x0ICogdmlzaWJsZSBiZWZvcmUgd2UgY2hlY2sgbWFwLVx1MDAzZXVzZXJjbnQuXG4mIzQzO1x0ICogSWYgdXNlcmNudCBoYXMgZHJvcHBlZCB0byB6ZXJvLCB0aGUgZGVzdHJ1Y3Rpb24gcGF0aCB3aWxsIGVpdGhlciBzZWVcbiYjNDM7XHQgKiB0aGUgY3R4IChhbmQgY2FuY2VsIGl0KSBvciB3ZSBzZWUgdXNlcmNudCA9PSAwIGhlcmUgYW5kIGNhbmNlbFxuJiM0MztcdCAqIG91cnNlbHZlcy5cbiYjNDM7XHQgKiBXaXRob3V0IHRoaXMgYmFycmllciwgYSBDUFUgY291bGQgcmVvcmRlciB0aGUgbG9hZCBvZiB1c2VyY250IGJlZm9yZVxuJiM0MztcdCAqIHRoZSBjbXB4Y2hnIHN0b3JlIGJlY29tZXMgdmlzaWJsZSwgYnJlYWtpbmcgdGhlIG11dHVhbCBleGNsdXNpb25cbiYjNDM7XHQgKiBndWFyYW50ZWUuXG4mIzQzO1x0ICovXG4mIzQzO1x0c21wX21iKCk7XG4mIzQzO1xuJiM0MztcdGlmICghYXRvbWljNjRfcmVhZChcdTAwMjZtYXAtXHUwMDNldXNlcmNudCkpIHtcbiYjNDM7XHRcdGJwZl90aHJlYWRfd3FfY2FuY2VsX2FuZF9mcmVlKHR3cSk7XG4mIzQzO1x0XHRyZXR1cm4gLUVQRVJNO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0cmV0dXJuIDA7XG4mIzQzO1xuJiM0MztjZ3JvdXBfcHV0OlxuJiM0MzsjaWZkZWYgQ09ORklHX0NHUk9VUFNcbiYjNDM7XHRpZiAoY2dycClcbiYjNDM7XHRcdGNncm91cF9wdXQoY2dycCk7XG4mIzQzOyNlbmRpZlxuJiM0MztrZnJlZV9jdHg6XG4mIzQzO1x0LypcbiYjNDM7XHQgKiBOb3QgdXNlIGJwZl90aHJlYWRfd3FfY3R4X3B1dCBiZWNhdXNlIGN0eCBoYXMgbm90IHlldCBlbnRlcmVkXG4mIzQzO1x0ICogdGhlIHJ1bm5pbmcgc3RhdGUuXG4mIzQzO1x0ICovXG4mIzQzO1x0a2ZyZWUoY3R4KTtcbiYjNDM7ZGVzdHJveV93b3JrZXI6XG4mIzQzO1x0a3RocmVhZF9kZXN0cm95X3dvcmtlcih3b3JrZXIpO1xuJiM0MztcdHJldHVybiBlcnI7XG4mIzQzO31cbiYjNDM7XG4mIzQzO19fYnBmX2tmdW5jIGludCBicGZfdGhyZWFkX3dxX3NldF9jYWxsYmFjayhzdHJ1Y3QgYnBmX3RocmVhZF93cSAqdHdxLFxuJiM0MztcdFx0XHRcdFx0ICAgaW50IChjYWxsYmFja19mbikodm9pZCAqbWFwLFxuJiM0MztcdFx0XHRcdFx0XHRcdCAgICAgaW50ICprZXksXG4mIzQzO1x0XHRcdFx0XHRcdFx0ICAgICB2b2lkICp2YWx1ZSksXG4mIzQzO1x0XHRcdFx0XHQgICB1bnNpZ25lZCBpbnQgZmxhZ3MsXG4mIzQzO1x0XHRcdFx0XHQgICBzdHJ1Y3QgYnBmX3Byb2dfYXV4ICphdXgpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgYnBmX3RocmVhZF93cV9rZXJuICp0d2sgPSAoc3RydWN0IGJwZl90aHJlYWRfd3Ffa2VybiAqKXR3cTtcbiYjNDM7XHRzdHJ1Y3QgYnBmX3RocmVhZF93cV9jdHggKmN0eDtcbiYjNDM7XHRzdHJ1Y3QgYnBmX3Byb2cgKnByb2c7XG4mIzQzO1xuJiM0MztcdGlmIChmbGFncylcbiYjNDM7XHRcdHJldHVybiAtRUlOVkFMO1xuJiM0MztcbiYjNDM7XHRjdHggPSBSRUFEX09OQ0UodHdrLVx1MDAzZWN0eCk7XG4mIzQzO1x0aWYgKCFjdHgpXG4mIzQzO1x0XHRyZXR1cm4gLUVJTlZBTDtcbiYjNDM7XG4mIzQzO1x0cHJvZyA9IGJwZl9wcm9nX2luY19ub3RfemVybyhhdXgtXHUwMDNlcHJvZyk7XG4mIzQzO1x0aWYgKElTX0VSUihwcm9nKSlcbiYjNDM7XHRcdHJldHVybiBQVFJfRVJSKHByb2cpO1xuJiM0MztcbiYjNDM7XHQvKlxuJiM0MztcdCAqIEFsbG93IHNldF9jYWxsYmFjayBvbmx5IG9uY2UgdG8gcHJldmVudCBVQUY6IGEgY29uY3VycmVudFxuJiM0MztcdCAqIHNldF9jYWxsYmFjayBjb3VsZCBicGZfcHJvZ19wdXQoKSB0aGUgcHJvZyB3aGlsZSB0aGUgd29ya2VyXG4mIzQzO1x0ICoga3RocmVhZCBpcyBzdGlsbCBleGVjdXRpbmcgaXRzIGNhbGxiYWNrLlxuJiM0MztcdCAqL1xuJiM0MztcdGlmIChjbXB4Y2hnKFx1MDAyNmN0eC1cdTAwM2Vwcm9nLCBOVUxMLCBwcm9nKSAhPSBOVUxMKSB7XG4mIzQzO1x0XHRicGZfcHJvZ19wdXQocHJvZyk7XG4mIzQzO1x0XHRyZXR1cm4gLUVCVVNZO1xuJiM0MztcdH1cbiYjNDM7XHQvKlxuJiM0MztcdCAqIFNhZmUgdG8gc2V0IGNhbGxiYWNrX2ZuIGFmdGVyIHByb2c6IGJwZl90aHJlYWRfd3Ffc3RhcnQoKSBhbmRcbiYjNDM7XHQgKiBicGZfdGhyZWFkX3dxX3dvcmtfZm4oKSBib3RoIGNoZWNrIGNhbGxiYWNrX2ZuIHdpdGggUkVBRF9PTkNFKClcbiYjNDM7XHQgKiBhbmQgYmFpbCBvdXQgaWYgaXQgaXMgc3RpbGwgTlVMTC5cbiYjNDM7XHQgKi9cbiYjNDM7XHRXUklURV9PTkNFKGN0eC1cdTAwM2VjYWxsYmFja19mbiwgKHZvaWQgKiljYWxsYmFja19mbik7XG4mIzQzO1xuJiM0MztcdHJldHVybiAwO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztfX2JwZl9rZnVuYyBpbnRcbiYjNDM7YnBmX3RocmVhZF93cV9zdGFydChzdHJ1Y3QgYnBmX3RocmVhZF93cSAqdHdxLCB1bnNpZ25lZCBpbnQgZmxhZ3MpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgYnBmX3RocmVhZF93cV9rZXJuICp0d2sgPSAoc3RydWN0IGJwZl90aHJlYWRfd3Ffa2VybiAqKXR3cTtcbiYjNDM7XHRzdHJ1Y3QgYnBmX3RocmVhZF93cV9jdHggKmN0eDtcbiYjNDM7XHRpbnQgZXJyO1xuJiM0MztcbiYjNDM7XHRpZiAoZmxhZ3MpXG4mIzQzO1x0XHRyZXR1cm4gLUVJTlZBTDtcbiYjNDM7XG4mIzQzO1x0cmN1X3JlYWRfbG9ja190cmFjZSgpO1xuJiM0MztcbiYjNDM7XHRlcnIgPSAwO1xuJiM0MztcbiYjNDM7XHRjdHggPSBSRUFEX09OQ0UodHdrLVx1MDAzZWN0eCk7XG4mIzQzO1x0aWYgKCFjdHggfHwgIVJFQURfT05DRShjdHgtXHUwMDNlY2FsbGJhY2tfZm4pKSB7XG4mIzQzO1x0XHRlcnIgPSAtRUlOVkFMO1xuJiM0MztcdFx0Z290byB1bmxvY2s7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRpZiAoIXJlZmNvdW50X2luY19ub3RfemVybyhcdTAwMjZjdHgtXHUwMDNlcmVmY250KSlcbiYjNDM7XHRcdGVyciA9IC1FTk9FTlQ7XG4mIzQzO1xuJiM0Mzt1bmxvY2s6XG4mIzQzO1x0cmN1X3JlYWRfdW5sb2NrX3RyYWNlKCk7XG4mIzQzO1x0aWYgKGVycilcbiYjNDM7XHRcdHJldHVybiBlcnI7XG4mIzQzO1xuJiM0MztcdGlmICgha3RocmVhZF9xdWV1ZV93b3JrKGN0eC1cdTAwM2V3b3JrZXIsIFx1MDAyNmN0eC1cdTAwM2V3b3JrKSkge1xuJiM0MztcdFx0YnBmX3RocmVhZF93cV9jdHhfcHV0KGN0eCk7XG4mIzQzO1x0XHRyZXR1cm4gLUVCVVNZO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0cmV0dXJuIDA7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3ZvaWQgYnBmX3RocmVhZF93cV9jYW5jZWxfYW5kX2ZyZWUodm9pZCAqdmFsKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IGJwZl90aHJlYWRfd3Ffa2VybiAqdHdrID0gdmFsO1xuJiM0MztcdHN0cnVjdCBicGZfdGhyZWFkX3dxX2N0eCAqY3R4O1xuJiM0MztcbiYjNDM7XHRjdHggPSB4Y2hnKFx1MDAyNnR3ay1cdTAwM2VjdHgsIE5VTEwpO1xuJiM0MztcdGlmICghY3R4KVxuJiM0MztcdFx0cmV0dXJuO1xuJiM0MztcbiYjNDM7XHRtaWdodF9zbGVlcCgpO1xuJiM0MztcbiYjNDM7XHQvKlxuJiM0MztcdCAqIFByZXZlbnQgZnV0dXJlIGNhbGxiYWNrcyBmcm9tIHJ1bm5pbmcgYW5kIHdhaXQgZm9yIGFueVxuJiM0MztcdCAqIGluLXByb2dyZXNzIGV4ZWN1dGlvbiB0byBmaW5pc2guXG4mIzQzO1x0ICovXG4mIzQzO1x0V1JJVEVfT05DRShjdHgtXHUwMDNlY2FsbGJhY2tfZm4sIE5VTEwpO1xuJiM0MztcdC8qXG4mIzQzO1x0ICoga3RocmVhZF9jYW5jZWxfd29ya19zeW5jKCkgcmV0dXJucyB0cnVlIHdoZW4gaXQgZGVxdWV1ZXMgYSBwZW5kaW5nXG4mIzQzO1x0ICogd29yayBpdGVtIGZyb20gdGhlIHdvcmtfbGlzdCB3aXRob3V0IGV4ZWN1dGluZyBpdC4gIEVhY2ggc3VjY2Vzc2Z1bFxuJiM0MztcdCAqIGJwZl90aHJlYWRfd3Ffc3RhcnQoKSBjYWxsIGluY3JlbWVudHMgY3R4LVx1MDAzZXJlZmNudCBhbmQgcmVsaWVzIG9uIHRoZVxuJiM0MztcdCAqIHN1YnNlcXVlbnQgYnBmX3RocmVhZF93cV93b3JrX2ZuKCkgZXhlY3V0aW9uIHRvIHJlbGVhc2UgdGhhdFxuJiM0MztcdCAqIHJlZmVyZW5jZSB2aWEgYnBmX3RocmVhZF93cV9jdHhfcHV0KCkuICBJZiB0aGUgd29yayB3YXMgcGVuZGluZyBhbmRcbiYjNDM7XHQgKiBnb3QgY2FuY2VsbGVkIGhlcmUsIHdvcmtfZm4gd2lsbCBuZXZlciBydW4gZm9yIHRoYXQgcXVldWVkIGluc3RhbmNlLFxuJiM0MztcdCAqIHNvIHdlIG11c3QgZHJvcCB0aGUgcmVmZXJlbmNlIG91cnNlbHZlcyB0byBhdm9pZCBhIHBlcm1hbmVudCByZWZjb3VudFxuJiM0MztcdCAqIGxlYWsuXG4mIzQzO1x0ICpcbiYjNDM7XHQgKiBUaGlzIGNvdmVycyB0d28gc2NlbmFyaW9zIHVuaWZvcm1seTpcbiYjNDM7XHQgKiAgMS4gVGhlIHdvcmsgaXMgcHVyZWx5IHBlbmRpbmcgKG5vdCBjdXJyZW50bHkgZXhlY3V0aW5nKSAtIGUuZy4gYVxuJiM0MztcdCAqICAgICBub3JtYWwgYnBmX3RocmVhZF93cV9zdGFydCgpIGNhbGwgcXVldWVkIGl0IGJ1dCB0aGUgd29ya2VyXG4mIzQzO1x0ICogICAgIHRocmVhZCBoYXNuJiMzOTt0IHBpY2tlZCBpdCB1cCB5ZXQuXG4mIzQzO1x0ICogIDIuIFRoZSB3b3JrIGlzIGN1cnJlbnRseSBpbi1mbGlnaHQgQU5EIHdhcyBzZWxmLXJlc2NoZWR1bGVkIGZyb21cbiYjNDM7XHQgKiAgICAgd2l0aGluIHRoZSBjYWxsYmFjayAtIGt0aHJlYWRfY2FuY2VsX3dvcmtfc3luYygpIGRlcXVldWVzIHRoZVxuJiM0MztcdCAqICAgICByZS1xdWV1ZWQgcGVuZGluZyBub2RlIGFuZCB0aGVuIHdhaXRzIGZvciB0aGUgaW4tZmxpZ2h0XG4mIzQzO1x0ICogICAgIGV4ZWN1dGlvbiB0byBjb21wbGV0ZS5cbiYjNDM7XHQgKiBJbiBib3RoIGNhc2VzIHRoZSByZXR1cm4gdmFsdWUgaXMgdHJ1ZSwgaW5kaWNhdGluZyBvbmUgb3JwaGFuZWRcbiYjNDM7XHQgKiByZWZlcmVuY2UgdGhhdCBuZWVkcyB0byBiZSByZWxlYXNlZCBoZXJlLlxuJiM0MztcdCAqL1xuJiM0MztcdGlmIChrdGhyZWFkX2NhbmNlbF93b3JrX3N5bmMoXHUwMDI2Y3R4LVx1MDAzZXdvcmspKVxuJiM0MztcdFx0YnBmX3RocmVhZF93cV9jdHhfcHV0KGN0eCk7XG4mIzQzO1xuJiM0MztcdC8qXG4mIzQzO1x0ICogRHJvcCBvdXIgb3duIHJlZmVyZW5jZS4gIElmIHRoZSB3b3JrIHdhcyBzdGlsbCBpbi1mbGlnaHQgYWJvdmUsXG4mIzQzO1x0ICogdGhlIHJlZmNvdW50IHdvbiYjMzk7dCBoaXQgemVybyBoZXJlIC0gaXQgd2lsbCByZWFjaCB6ZXJvIHdoZW4gdGhlXG4mIzQzO1x0ICogd29yayBwYXRoIGNhbGxzIGJwZl90aHJlYWRfd3FfY3R4X3B1dCgpIHVwb24gY29tcGxldGlvbi4gIEVpdGhlclxuJiM0MztcdCAqIHdheSwgZmluYWwgY2xlYW51cCAod29ya2VyIGRlc3RydWN0aW9uLCBwcm9nIHB1dCwgY2dyb3VwIHB1dCxcbiYjNDM7XHQgKiBrZnJlZSkgaGFwcGVucyBleGNsdXNpdmVseSBpbiB0aGUgUkNVIGNhbGxiYWNrIHRvIGtlZXAgdGhlXG4mIzQzO1x0ICogdGVhcmRvd24gcGF0aCBzaW5nbGUtdGhyZWFkZWQuXG4mIzQzO1x0ICovXG4mIzQzO1x0YnBmX3RocmVhZF93cV9jdHhfcHV0KGN0eCk7XG4mIzQzO31cbiYjNDM7XG4gX19icGZfa2Z1bmNfZW5kX2RlZnMoKTtcbiBcbiBzdGF0aWMgdm9pZCBicGZfdGFza193b3JrX2NhbmNlbF9zY2hlZHVsZWQoc3RydWN0IGlycV93b3JrICppcnFfd29yaylcbkBAIC00OTE3LDYgJiM0Mzs1MzIxLDggQEAgQlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9tb2RpZnlfcmV0dXJuX3Rlc3RfdHApXG4gQlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl93cV9pbml0KVxuIEJURl9JRF9GTEFHUyhmdW5jLCBicGZfd3Ffc2V0X2NhbGxiYWNrLCBLRl9JTVBMSUNJVF9BUkdTKVxuIEJURl9JRF9GTEFHUyhmdW5jLCBicGZfd3Ffc3RhcnQpXG4mIzQzO0JURl9JRF9GTEFHUyhmdW5jLCBicGZfdGhyZWFkX3dxX3NldF9jYWxsYmFjaywgS0ZfSU1QTElDSVRfQVJHUylcbiYjNDM7QlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl90aHJlYWRfd3Ffc3RhcnQpXG4gQlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9wcmVlbXB0X2Rpc2FibGUpXG4gQlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9wcmVlbXB0X2VuYWJsZSlcbiBCVEZfSURfRkxBR1MoZnVuYywgYnBmX2l0ZXJfYml0c19uZXcsIEtGX0lURVJfTkVXKVxuQEAgLTQ5NzgsNiAmIzQzOzUzODQsMTUgQEAgc3RhdGljIGNvbnN0IHN0cnVjdCBidGZfa2Z1bmNfaWRfc2V0IGNvbW1vbl9rZnVuY19zZXQgPSB7XG4gXHQuc2V0ICAgPSBcdTAwMjZjb21tb25fYnRmX2lkcyxcbiB9O1xuIFxuJiM0MztCVEZfS0ZVTkNTX1NUQVJUKHN5c2NhbGxfYnRmX2lkcylcbiYjNDM7QlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl90aHJlYWRfd3FfaW5pdCwgS0ZfU0xFRVBBQkxFKVxuJiM0MztCVEZfS0ZVTkNTX0VORChzeXNjYWxsX2J0Zl9pZHMpXG4mIzQzO1xuJiM0MztzdGF0aWMgY29uc3Qgc3RydWN0IGJ0Zl9rZnVuY19pZF9zZXQgc3lzY2FsbF9rZnVuY19zZXQgPSB7XG4mIzQzO1x0Lm93bmVyID0gVEhJU19NT0RVTEUsXG4mIzQzO1x0LnNldCAgID0gXHUwMDI2c3lzY2FsbF9idGZfaWRzLFxuJiM0Mzt9O1xuJiM0MztcbiBzdGF0aWMgaW50IF9faW5pdCBrZnVuY19pbml0KHZvaWQpXG4ge1xuIFx0aW50IHJldDtcbkBAIC01MDAwLDYgJiM0Mzs1NDE1LDcgQEAgc3RhdGljIGludCBfX2luaXQga2Z1bmNfaW5pdCh2b2lkKVxuIFx0cmV0ID0gcmV0ID86IHJlZ2lzdGVyX2J0Zl9rZnVuY19pZF9zZXQoQlBGX1BST0dfVFlQRV9TVFJVQ1RfT1BTLCBcdTAwMjZnZW5lcmljX2tmdW5jX3NldCk7XG4gXHRyZXQgPSByZXQgPzogcmVnaXN0ZXJfYnRmX2tmdW5jX2lkX3NldChCUEZfUFJPR19UWVBFX1NZU0NBTEwsIFx1MDAyNmdlbmVyaWNfa2Z1bmNfc2V0KTtcbiBcdHJldCA9IHJldCA/OiByZWdpc3Rlcl9idGZfa2Z1bmNfaWRfc2V0KEJQRl9QUk9HX1RZUEVfQ0dST1VQX1NLQiwgXHUwMDI2Z2VuZXJpY19rZnVuY19zZXQpO1xuJiM0MztcdHJldCA9IHJldCA/OiByZWdpc3Rlcl9idGZfa2Z1bmNfaWRfc2V0KEJQRl9QUk9HX1RZUEVfU1lTQ0FMTCwgXHUwMDI2c3lzY2FsbF9rZnVuY19zZXQpO1xuIFx0cmV0ID0gcmV0ID86IHJlZ2lzdGVyX2J0Zl9pZF9kdG9yX2tmdW5jcyhnZW5lcmljX2R0b3JzLFxuIFx0XHRcdFx0XHRcdCAgQVJSQVlfU0laRShnZW5lcmljX2R0b3JzKSxcbiBcdFx0XHRcdFx0XHQgIFRISVNfTU9EVUxFKTtcbkBAIC01MDM3LDQgJiM0Mzs1NDUzLDYgQEAgdm9pZCBicGZfbWFwX2ZyZWVfaW50ZXJuYWxfc3RydWN0cyhzdHJ1Y3QgYnBmX21hcCAqbWFwLCB2b2lkICp2YWwpXG4gXHRcdGJwZl9vYmpfZnJlZV93b3JrcXVldWUobWFwLVx1MDAzZXJlY29yZCwgdmFsKTtcbiBcdGlmIChidGZfcmVjb3JkX2hhc19maWVsZChtYXAtXHUwMDNlcmVjb3JkLCBCUEZfVEFTS19XT1JLKSlcbiBcdFx0YnBmX29ial9mcmVlX3Rhc2tfd29yayhtYXAtXHUwMDNlcmVjb3JkLCB2YWwpO1xuJiM0MztcdGlmIChidGZfcmVjb3JkX2hhc19maWVsZChtYXAtXHUwMDNlcmVjb3JkLCBCUEZfVEhSRUFEX1dRKSlcbiYjNDM7XHRcdGJwZl9vYmpfZnJlZV90aHJlYWRfd3EobWFwLVx1MDAzZXJlY29yZCwgdmFsKTtcbiB9XG5kaWZmIC0tZ2l0IGEva2VybmVsL2JwZi9zeXNjYWxsLmMgYi9rZXJuZWwvYnBmL3N5c2NhbGwuY1xuaW5kZXggOGQxMTFkYTg4NjU1My4uZGVhMTQ4MjNiYWNkMiAxMDA2NDRcbi0tLSBhL2tlcm5lbC9icGYvc3lzY2FsbC5jXG4mIzQzOyYjNDM7JiM0MzsgYi9rZXJuZWwvYnBmL3N5c2NhbGwuY1xuQEAgLTY4OCw2ICYjNDM7Njg4LDcgQEAgdm9pZCBidGZfcmVjb3JkX2ZyZWUoc3RydWN0IGJ0Zl9yZWNvcmQgKnJlYylcbiBcdFx0Y2FzZSBCUEZfUkVGQ09VTlQ6XG4gXHRcdGNhc2UgQlBGX1dPUktRVUVVRTpcbiBcdFx0Y2FzZSBCUEZfVEFTS19XT1JLOlxuJiM0MztcdFx0Y2FzZSBCUEZfVEhSRUFEX1dROlxuIFx0XHRcdC8qIE5vdGhpbmcgdG8gcmVsZWFzZSAqL1xuIFx0XHRcdGJyZWFrO1xuIFx0XHRkZWZhdWx0OlxuQEAgLTc0Miw2ICYjNDM7NzQzLDcgQEAgc3RydWN0IGJ0Zl9yZWNvcmQgKmJ0Zl9yZWNvcmRfZHVwKGNvbnN0IHN0cnVjdCBidGZfcmVjb3JkICpyZWMpXG4gXHRcdGNhc2UgQlBGX1JFRkNPVU5UOlxuIFx0XHRjYXNlIEJQRl9XT1JLUVVFVUU6XG4gXHRcdGNhc2UgQlBGX1RBU0tfV09SSzpcbiYjNDM7XHRcdGNhc2UgQlBGX1RIUkVBRF9XUTpcbiBcdFx0XHQvKiBOb3RoaW5nIHRvIGFjcXVpcmUgKi9cbiBcdFx0XHRicmVhaztcbiBcdFx0ZGVmYXVsdDpcbkBAIC04MDcsNiAmIzQzOzgwOSwxMyBAQCB2b2lkIGJwZl9vYmpfZnJlZV90YXNrX3dvcmsoY29uc3Qgc3RydWN0IGJ0Zl9yZWNvcmQgKnJlYywgdm9pZCAqb2JqKVxuIFx0YnBmX3Rhc2tfd29ya19jYW5jZWxfYW5kX2ZyZWUob2JqICYjNDM7IHJlYy1cdTAwM2V0YXNrX3dvcmtfb2ZmKTtcbiB9XG4gXG4mIzQzO3ZvaWQgYnBmX29ial9mcmVlX3RocmVhZF93cShjb25zdCBzdHJ1Y3QgYnRmX3JlY29yZCAqcmVjLCB2b2lkICpvYmopXG4mIzQzO3tcbiYjNDM7XHRpZiAoV0FSTl9PTl9PTkNFKCFidGZfcmVjb3JkX2hhc19maWVsZChyZWMsIEJQRl9USFJFQURfV1EpKSlcbiYjNDM7XHRcdHJldHVybjtcbiYjNDM7XHRicGZfdGhyZWFkX3dxX2NhbmNlbF9hbmRfZnJlZShvYmogJiM0MzsgcmVjLVx1MDAzZXRocmVhZF93cV9vZmYpO1xuJiM0Mzt9XG4mIzQzO1xuIHZvaWQgYnBmX29ial9jYW5jZWxfZmllbGRzKHN0cnVjdCBicGZfbWFwICptYXAsIHZvaWQgKm9iailcbiB7XG4gXHRicGZfbWFwX2ZyZWVfaW50ZXJuYWxfc3RydWN0cyhtYXAsIG9iaik7XG5AQCAtODM5LDYgJiM0Mzs4NDgsOSBAQCB2b2lkIGJwZl9vYmpfZnJlZV9maWVsZHMoY29uc3Qgc3RydWN0IGJ0Zl9yZWNvcmQgKnJlYywgdm9pZCAqb2JqKVxuIFx0XHRjYXNlIEJQRl9UQVNLX1dPUks6XG4gXHRcdFx0YnBmX3Rhc2tfd29ya19jYW5jZWxfYW5kX2ZyZWUoZmllbGRfcHRyKTtcbiBcdFx0XHRicmVhaztcbiYjNDM7XHRcdGNhc2UgQlBGX1RIUkVBRF9XUTpcbiYjNDM7XHRcdFx0YnBmX3RocmVhZF93cV9jYW5jZWxfYW5kX2ZyZWUoZmllbGRfcHRyKTtcbiYjNDM7XHRcdFx0YnJlYWs7XG4gXHRcdGNhc2UgQlBGX0tQVFJfVU5SRUY6XG4gXHRcdFx0V1JJVEVfT05DRSgqKHU2NCAqKWZpZWxkX3B0ciwgMCk7XG4gXHRcdFx0YnJlYWs7XG5AQCAtMTI2NSw3ICYjNDM7MTI3Nyw3IEBAIHN0YXRpYyBpbnQgbWFwX2NoZWNrX2J0ZihzdHJ1Y3QgYnBmX21hcCAqbWFwLCBzdHJ1Y3QgYnBmX3Rva2VuICp0b2tlbixcbiBcdG1hcC1cdTAwM2VyZWNvcmQgPSBidGZfcGFyc2VfZmllbGRzKGJ0ZiwgdmFsdWVfdHlwZSxcbiBcdFx0XHRcdCAgICAgICBCUEZfU1BJTl9MT0NLIHwgQlBGX1JFU19TUElOX0xPQ0sgfCBCUEZfVElNRVIgfCBCUEZfS1BUUiB8IEJQRl9MSVNUX0hFQUQgfFxuIFx0XHRcdFx0ICAgICAgIEJQRl9SQl9ST09UIHwgQlBGX1JFRkNPVU5UIHwgQlBGX1dPUktRVUVVRSB8IEJQRl9VUFRSIHxcbi1cdFx0XHRcdCAgICAgICBCUEZfVEFTS19XT1JLLFxuJiM0MztcdFx0XHRcdCAgICAgICBCUEZfVEFTS19XT1JLIHwgQlBGX1RIUkVBRF9XUSxcbiBcdFx0XHRcdCAgICAgICBtYXAtXHUwMDNldmFsdWVfc2l6ZSk7XG4gXHRpZiAoIUlTX0VSUl9PUl9OVUxMKG1hcC1cdTAwM2VyZWNvcmQpKSB7XG4gXHRcdGludCBpO1xuQEAgLTEyOTksNiAmIzQzOzEzMTEsNyBAQCBzdGF0aWMgaW50IG1hcF9jaGVja19idGYoc3RydWN0IGJwZl9tYXAgKm1hcCwgc3RydWN0IGJwZl90b2tlbiAqdG9rZW4sXG4gXHRcdFx0Y2FzZSBCUEZfVElNRVI6XG4gXHRcdFx0Y2FzZSBCUEZfV09SS1FVRVVFOlxuIFx0XHRcdGNhc2UgQlBGX1RBU0tfV09SSzpcbiYjNDM7XHRcdFx0Y2FzZSBCUEZfVEhSRUFEX1dROlxuIFx0XHRcdFx0aWYgKG1hcC1cdTAwM2VtYXBfdHlwZSAhPSBCUEZfTUFQX1RZUEVfSEFTSCBcdTAwMjZcdTAwMjZcbiBcdFx0XHRcdCAgICBtYXAtXHUwMDNlbWFwX3R5cGUgIT0gQlBGX01BUF9UWVBFX1JIQVNIIFx1MDAyNlx1MDAyNlxuIFx0XHRcdFx0ICAgIG1hcC1cdTAwM2VtYXBfdHlwZSAhPSBCUEZfTUFQX1RZUEVfTFJVX0hBU0ggXHUwMDI2XHUwMDI2XG5kaWZmIC0tZ2l0IGEva2VybmVsL2JwZi92ZXJpZmllci5jIGIva2VybmVsL2JwZi92ZXJpZmllci5jXG5pbmRleCBlNjIzM2MwMDgxZDEwLi40NGU3OWZlNDgwYjZiIDEwMDY0NFxuLS0tIGEva2VybmVsL2JwZi92ZXJpZmllci5jXG4mIzQzOyYjNDM7JiM0MzsgYi9rZXJuZWwvYnBmL3ZlcmlmaWVyLmNcbkBAIC00NzcsNiAmIzQzOzQ3Nyw3IEBAIHN0YXRpYyBib29sIGlzX2FzeW5jX2NhbGxiYWNrX2NhbGxpbmdfa2Z1bmModTMyIGJ0Zl9pZCk7XG4gc3RhdGljIGJvb2wgaXNfY2FsbGJhY2tfY2FsbGluZ19rZnVuYyh1MzIgYnRmX2lkKTtcbiBcbiBzdGF0aWMgYm9vbCBpc19icGZfd3Ffc2V0X2NhbGxiYWNrX2tmdW5jKHUzMiBidGZfaWQpO1xuJiM0MztzdGF0aWMgYm9vbCBpc19icGZfdGhyZWFkX3dxX3NldF9jYWxsYmFja19rZnVuYyh1MzIgYnRmX2lkKTtcbiBzdGF0aWMgYm9vbCBpc190YXNrX3dvcmtfYWRkX2tmdW5jKHUzMiBmdW5jX2lkKTtcbiBcbiBzdGF0aWMgYm9vbCBpc19zeW5jX2NhbGxiYWNrX2NhbGxpbmdfZnVuY3Rpb24oZW51bSBicGZfZnVuY19pZCBmdW5jX2lkKVxuQEAgLTUxNiw5ICYjNDM7NTE3LDExIEBAIHN0YXRpYyBib29sIGlzX2FzeW5jX2NiX3NsZWVwYWJsZShzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52LCBzdHJ1Y3QgYnBmX2luc25cbiBcdGlmIChicGZfaGVscGVyX2NhbGwoaW5zbikgXHUwMDI2XHUwMDI2IGluc24tXHUwMDNlaW1tID09IEJQRl9GVU5DX3RpbWVyX3NldF9jYWxsYmFjaylcbiBcdFx0cmV0dXJuIGZhbHNlO1xuIFxuLVx0LyogYnBmX3dxIGFuZCBicGZfdGFza193b3JrIGNhbGxiYWNrcyBhcmUgYWx3YXlzIHNsZWVwYWJsZS4gKi9cbiYjNDM7XHQvKiBicGZfd3EsIGJwZl90aHJlYWRfd3EgYW5kIGJwZl90YXNrX3dvcmsgY2FsbGJhY2tzIGFyZSBhbHdheXMgc2xlZXBhYmxlLiAqL1xuIFx0aWYgKGJwZl9wc2V1ZG9fa2Z1bmNfY2FsbChpbnNuKSBcdTAwMjZcdTAwMjYgaW5zbi1cdTAwM2VvZmYgPT0gMCBcdTAwMjZcdTAwMjZcbi1cdCAgICAoaXNfYnBmX3dxX3NldF9jYWxsYmFja19rZnVuYyhpbnNuLVx1MDAzZWltbSkgfHwgaXNfdGFza193b3JrX2FkZF9rZnVuYyhpbnNuLVx1MDAzZWltbSkpKVxuJiM0MztcdCAgICAoaXNfYnBmX3dxX3NldF9jYWxsYmFja19rZnVuYyhpbnNuLVx1MDAzZWltbSkgfHxcbiYjNDM7XHQgICAgIGlzX2JwZl90aHJlYWRfd3Ffc2V0X2NhbGxiYWNrX2tmdW5jKGluc24tXHUwMDNlaW1tKSB8fFxuJiM0MztcdCAgICAgaXNfdGFza193b3JrX2FkZF9rZnVuYyhpbnNuLVx1MDAzZWltbSkpKVxuIFx0XHRyZXR1cm4gdHJ1ZTtcbiBcbiBcdHZlcmlmaWVyX2J1ZyhlbnYsIFwmIzM0O3VuaGFuZGxlZCBhc3luYyBjYWxsYmFjayBpbiBpc19hc3luY19jYl9zbGVlcGFibGVcJiMzNDspO1xuQEAgLTE4NzEsNyAmIzQzOzE4NzQsMTAgQEAgc3RhdGljIHZvaWQgcmVmaW5lX21hcF9sb29rdXBfdmFsdWUoc3RydWN0IGJwZl9yZWdfc3RhdGUgKnJlZylcbiBcdFx0ICogYXMgVUlEIG9mIHRoZSBpbm5lciBtYXAuXG4gXHRcdCAqL1xuIFx0XHRpZiAoYnRmX3JlY29yZF9oYXNfZmllbGQobWFwLVx1MDAzZWlubmVyX21hcF9tZXRhLVx1MDAzZXJlY29yZCxcbi1cdFx0XHRcdFx0IEJQRl9USU1FUiB8IEJQRl9XT1JLUVVFVUUgfCBCUEZfVEFTS19XT1JLKSlcbiYjNDM7XHRcdFx0XHRcdCBCUEZfVElNRVIgfFxuJiM0MztcdFx0XHRcdFx0IEJQRl9XT1JLUVVFVUUgfFxuJiM0MztcdFx0XHRcdFx0IEJQRl9UQVNLX1dPUksgfFxuJiM0MztcdFx0XHRcdFx0IEJQRl9USFJFQURfV1EpKVxuIFx0XHRcdHJlZy1cdTAwM2VtYXBfdWlkID0gcmVnLVx1MDAzZWlkO1xuIFx0fSBlbHNlIGlmIChtYXAtXHUwMDNlbWFwX3R5cGUgPT0gQlBGX01BUF9UWVBFX1hTS01BUCkge1xuIFx0XHRyZWctXHUwMDNldHlwZSA9IFBUUl9UT19YRFBfU09DSyB8IG1heWJlX251bGw7XG5AQCAtNzI0Myw2ICYjNDM7NzI0OSw5IEBAIHN0YXRpYyBpbnQgY2hlY2tfbWFwX2ZpZWxkX3BvaW50ZXIoc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudiwgc3RydWN0IGJwZl9yZWdfXG4gXHRjYXNlIEJQRl9XT1JLUVVFVUU6XG4gXHRcdGZpZWxkX29mZiA9IG1hcC1cdTAwM2VyZWNvcmQtXHUwMDNld3Ffb2ZmO1xuIFx0XHRicmVhaztcbiYjNDM7XHRjYXNlIEJQRl9USFJFQURfV1E6XG4mIzQzO1x0XHRmaWVsZF9vZmYgPSBtYXAtXHUwMDNlcmVjb3JkLVx1MDAzZXRocmVhZF93cV9vZmY7XG4mIzQzO1x0XHRicmVhaztcbiBcdGRlZmF1bHQ6XG4gXHRcdHZlcmlmaWVyX2J1ZyhlbnYsIFwmIzM0O3Vuc3VwcG9ydGVkIEJURiBmaWVsZCB0eXBlOiAlc1xcblwmIzM0Oywgc3RydWN0X25hbWUpO1xuIFx0XHRyZXR1cm4gLUVJTlZBTDtcbkBAIC0xMDk0MCw2ICYjNDM7MTA5NDksNyBAQCBlbnVtIHtcbiBcdEtGX0FSR19XT1JLUVVFVUVfSUQsXG4gXHRLRl9BUkdfUkVTX1NQSU5fTE9DS19JRCxcbiBcdEtGX0FSR19UQVNLX1dPUktfSUQsXG4mIzQzO1x0S0ZfQVJHX1RIUkVBRF9XUV9JRCxcbiBcdEtGX0FSR19QUk9HX0FVWF9JRCxcbiBcdEtGX0FSR19USU1FUl9JRFxuIH07XG5AQCAtMTA5NTMsNiAmIzQzOzEwOTYzLDcgQEAgQlRGX0lEKHN0cnVjdCwgYnBmX3JiX25vZGUpXG4gQlRGX0lEKHN0cnVjdCwgYnBmX3dxKVxuIEJURl9JRChzdHJ1Y3QsIGJwZl9yZXNfc3Bpbl9sb2NrKVxuIEJURl9JRChzdHJ1Y3QsIGJwZl90YXNrX3dvcmspXG4mIzQzO0JURl9JRChzdHJ1Y3QsIGJwZl90aHJlYWRfd3EpXG4gQlRGX0lEKHN0cnVjdCwgYnBmX3Byb2dfYXV4KVxuIEJURl9JRChzdHJ1Y3QsIGJwZl90aW1lcilcbiBcbkBAIC0xMTAxMyw2ICYjNDM7MTEwMjQsMTEgQEAgc3RhdGljIGJvb2wgaXNfa2Z1bmNfYXJnX3Rhc2tfd29yayhjb25zdCBzdHJ1Y3QgYnRmICpidGYsIGNvbnN0IHN0cnVjdCBidGZfcGFyYW1cbiBcdHJldHVybiBfX2lzX2tmdW5jX3B0cl9hcmdfdHlwZShidGYsIGFyZywgS0ZfQVJHX1RBU0tfV09SS19JRCk7XG4gfVxuIFxuJiM0MztzdGF0aWMgYm9vbCBpc19rZnVuY19hcmdfdGhyZWFkX3dxKGNvbnN0IHN0cnVjdCBidGYgKmJ0ZiwgY29uc3Qgc3RydWN0IGJ0Zl9wYXJhbSAqYXJnKVxuJiM0Mzt7XG4mIzQzO1x0cmV0dXJuIF9faXNfa2Z1bmNfcHRyX2FyZ190eXBlKGJ0ZiwgYXJnLCBLRl9BUkdfVEhSRUFEX1dRX0lEKTtcbiYjNDM7fVxuJiM0MztcbiBzdGF0aWMgYm9vbCBpc19rZnVuY19hcmdfcmVzX3NwaW5fbG9jayhjb25zdCBzdHJ1Y3QgYnRmICpidGYsIGNvbnN0IHN0cnVjdCBidGZfcGFyYW0gKmFyZylcbiB7XG4gXHRyZXR1cm4gX19pc19rZnVuY19wdHJfYXJnX3R5cGUoYnRmLCBhcmcsIEtGX0FSR19SRVNfU1BJTl9MT0NLX0lEKTtcbkBAIC0xMTEzMiw2ICYjNDM7MTExNDgsNyBAQCBlbnVtIGtmdW5jX3B0cl9hcmdfdHlwZSB7XG4gXHRLRl9BUkdfUFRSX1RPX0lSUV9GTEFHLFxuIFx0S0ZfQVJHX1BUUl9UT19SRVNfU1BJTl9MT0NLLFxuIFx0S0ZfQVJHX1BUUl9UT19UQVNLX1dPUkssXG4mIzQzO1x0S0ZfQVJHX1BUUl9UT19USFJFQURfV1EsXG4gfTtcbiBcbiBlbnVtIHNwZWNpYWxfa2Z1bmNfdHlwZSB7XG5AQCAtMTExNzgsNiAmIzQzOzExMTk1LDcgQEAgZW51bSBzcGVjaWFsX2tmdW5jX3R5cGUge1xuIFx0S0ZfYnBmX3BlcmNwdV9vYmpfZHJvcCxcbiBcdEtGX2JwZl90aHJvdyxcbiBcdEtGX2JwZl93cV9zZXRfY2FsbGJhY2ssXG4mIzQzO1x0S0ZfYnBmX3RocmVhZF93cV9zZXRfY2FsbGJhY2ssXG4gXHRLRl9icGZfcHJlZW1wdF9kaXNhYmxlLFxuIFx0S0ZfYnBmX3ByZWVtcHRfZW5hYmxlLFxuIFx0S0ZfYnBmX2l0ZXJfY3NzX3Rhc2tfbmV3LFxuQEAgLTExMjU4LDYgJiM0MzsxMTI3Niw3IEBAIEJURl9JRChmdW5jLCBicGZfcGVyY3B1X29ial9kcm9wX2ltcGwpXG4gQlRGX0lEKGZ1bmMsIGJwZl9wZXJjcHVfb2JqX2Ryb3ApXG4gQlRGX0lEKGZ1bmMsIGJwZl90aHJvdylcbiBCVEZfSUQoZnVuYywgYnBmX3dxX3NldF9jYWxsYmFjaylcbiYjNDM7QlRGX0lEKGZ1bmMsIGJwZl90aHJlYWRfd3Ffc2V0X2NhbGxiYWNrKVxuIEJURl9JRChmdW5jLCBicGZfcHJlZW1wdF9kaXNhYmxlKVxuIEJURl9JRChmdW5jLCBicGZfcHJlZW1wdF9lbmFibGUpXG4gI2lmZGVmIENPTkZJR19DR1JPVVBTXG5AQCAtMTE0NjAsNiAmIzQzOzExNDc5LDggQEAgZ2V0X2tmdW5jX2FyZ190eXBlKHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsIHN0cnVjdCBicGZfY2FsbF9hcmdfbWV0YSAqbWV0YSxcbiBcdFx0YXJnX3R5cGUgPSBLRl9BUkdfUFRSX1RPX1RJTUVSO1xuIFx0ZWxzZSBpZiAoaXNfa2Z1bmNfYXJnX3Rhc2tfd29yayhtZXRhLVx1MDAzZWJ0ZiwgXHUwMDI2YXJnc1thcmddKSlcbiBcdFx0YXJnX3R5cGUgPSBLRl9BUkdfUFRSX1RPX1RBU0tfV09SSztcbiYjNDM7XHRlbHNlIGlmIChpc19rZnVuY19hcmdfdGhyZWFkX3dxKG1ldGEtXHUwMDNlYnRmLCBcdTAwMjZhcmdzW2FyZ10pKVxuJiM0MztcdFx0YXJnX3R5cGUgPSBLRl9BUkdfUFRSX1RPX1RIUkVBRF9XUTtcbiBcdGVsc2UgaWYgKGlzX2tmdW5jX2FyZ19pcnFfZmxhZyhtZXRhLVx1MDAzZWJ0ZiwgXHUwMDI2YXJnc1thcmddKSlcbiBcdFx0YXJnX3R5cGUgPSBLRl9BUkdfUFRSX1RPX0lSUV9GTEFHO1xuIFx0ZWxzZSBpZiAoaXNfa2Z1bmNfYXJnX3Jlc19zcGluX2xvY2sobWV0YS1cdTAwM2VidGYsIFx1MDAyNmFyZ3NbYXJnXSkpXG5AQCAtMTE4MzMsNiAmIzQzOzExODU0LDcgQEAgc3RhdGljIGJvb2wgaXNfc3luY19jYWxsYmFja19jYWxsaW5nX2tmdW5jKHUzMiBidGZfaWQpXG4gc3RhdGljIGJvb2wgaXNfYXN5bmNfY2FsbGJhY2tfY2FsbGluZ19rZnVuYyh1MzIgYnRmX2lkKVxuIHtcbiBcdHJldHVybiBpc19icGZfd3Ffc2V0X2NhbGxiYWNrX2tmdW5jKGJ0Zl9pZCkgfHxcbiYjNDM7XHQgICAgICAgaXNfYnBmX3RocmVhZF93cV9zZXRfY2FsbGJhY2tfa2Z1bmMoYnRmX2lkKSB8fFxuIFx0ICAgICAgIGlzX3Rhc2tfd29ya19hZGRfa2Z1bmMoYnRmX2lkKTtcbiB9XG4gXG5AQCAtMTE4NDcsNiAmIzQzOzExODY5LDExIEBAIHN0YXRpYyBib29sIGlzX2JwZl93cV9zZXRfY2FsbGJhY2tfa2Z1bmModTMyIGJ0Zl9pZClcbiBcdHJldHVybiBidGZfaWQgPT0gc3BlY2lhbF9rZnVuY19saXN0W0tGX2JwZl93cV9zZXRfY2FsbGJhY2tdO1xuIH1cbiBcbiYjNDM7c3RhdGljIGJvb2wgaXNfYnBmX3RocmVhZF93cV9zZXRfY2FsbGJhY2tfa2Z1bmModTMyIGJ0Zl9pZClcbiYjNDM7e1xuJiM0MztcdHJldHVybiBidGZfaWQgPT0gc3BlY2lhbF9rZnVuY19saXN0W0tGX2JwZl90aHJlYWRfd3Ffc2V0X2NhbGxiYWNrXTtcbiYjNDM7fVxuJiM0MztcbiBzdGF0aWMgYm9vbCBpc19jYWxsYmFja19jYWxsaW5nX2tmdW5jKHUzMiBidGZfaWQpXG4ge1xuIFx0cmV0dXJuIGlzX3N5bmNfY2FsbGJhY2tfY2FsbGluZ19rZnVuYyhidGZfaWQpIHx8XG5AQCAtMTIxOTIsNiAmIzQzOzEyMjE5LDcgQEAgc3RhdGljIGludCBjaGVja19rZnVuY19hcmdzKHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsIHN0cnVjdCBicGZfY2FsbF9hcmdfbWVcbiBcdFx0Y2FzZSBLRl9BUkdfUFRSX1RPX1dPUktRVUVVRTpcbiBcdFx0Y2FzZSBLRl9BUkdfUFRSX1RPX1RJTUVSOlxuIFx0XHRjYXNlIEtGX0FSR19QVFJfVE9fVEFTS19XT1JLOlxuJiM0MztcdFx0Y2FzZSBLRl9BUkdfUFRSX1RPX1RIUkVBRF9XUTpcbiBcdFx0Y2FzZSBLRl9BUkdfUFRSX1RPX0lSUV9GTEFHOlxuIFx0XHRjYXNlIEtGX0FSR19QVFJfVE9fUkVTX1NQSU5fTE9DSzpcbiBcdFx0XHRicmVhaztcbkBAIC0xMzEzOSw2ICYjNDM7MTMxNjcsMTYgQEAgc3RhdGljIGludCBjaGVja19rZnVuY19jYWxsKHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsIHN0cnVjdCBicGZfaW5zbiAqaW5zbixcbiBcdFx0fVxuIFx0fVxuIFxuJiM0MztcdGlmIChpc19icGZfdGhyZWFkX3dxX3NldF9jYWxsYmFja19rZnVuYyhtZXRhLmZ1bmNfaWQpKSB7XG4mIzQzO1x0XHRlcnIgPSBwdXNoX2NhbGxiYWNrX2NhbGwoZW52LCBpbnNuLCBpbnNuX2lkeCwgbWV0YS5zdWJwcm9nbm8sXG4mIzQzO1x0XHRcdFx0XHQgc2V0X3RpbWVyX2NhbGxiYWNrX3N0YXRlKTtcbiYjNDM7XHRcdGlmIChlcnIpIHtcbiYjNDM7XHRcdFx0dmVyYm9zZShlbnYsIFwmIzM0O2tmdW5jICVzIyVkIGZhaWxlZCBjYWxsYmFjayB2ZXJpZmljYXRpb25cXG5cJiMzNDssXG4mIzQzO1x0XHRcdFx0ZnVuY19uYW1lLCBtZXRhLmZ1bmNfaWQpO1xuJiM0MztcdFx0XHRyZXR1cm4gZXJyO1xuJiM0MztcdFx0fVxuJiM0MztcdH1cbiYjNDM7XG4gXHRpZiAoaXNfdGFza193b3JrX2FkZF9rZnVuYyhtZXRhLmZ1bmNfaWQpKSB7XG4gXHRcdGVyciA9IHB1c2hfY2FsbGJhY2tfY2FsbChlbnYsIGluc24sIGluc25faWR4LCBtZXRhLnN1YnByb2dubyxcbiBcdFx0XHRcdFx0IHNldF90YXNrX3dvcmtfc2NoZWR1bGVfY2FsbGJhY2tfc3RhdGUpO1xuZGlmZiAtLWdpdCBhL2tlcm5lbC9jZ3JvdXAvY2dyb3VwLmMgYi9rZXJuZWwvY2dyb3VwL2Nncm91cC5jXG5pbmRleCAzOGY4ZDlkZjhmYmM0Li4xNjRlMDY5Yzc1NzYyIDEwMDY0NFxuLS0tIGEva2VybmVsL2Nncm91cC9jZ3JvdXAuY1xuJiM0MzsmIzQzOyYjNDM7IGIva2VybmVsL2Nncm91cC9jZ3JvdXAuY1xuQEAgLTMwNDIsNiAmIzQzOzMwNDIsMTkgQEAgaW50IGNncm91cF9hdHRhY2hfdGFzayhzdHJ1Y3QgY2dyb3VwICpkc3RfY2dycCwgc3RydWN0IHRhc2tfc3RydWN0ICpsZWFkZXIsXG4gXHRyZXR1cm4gcmV0O1xuIH1cbiBcbiYjNDM7aW50IGNncm91cF9rdGhyZWFkX2F0dGFjaChzdHJ1Y3QgY2dyb3VwICpjZ3JwLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spXG4mIzQzO3tcbiYjNDM7XHRpbnQgcmV0O1xuJiM0MztcbiYjNDM7XHRjZ3JvdXBfbG9jaygpO1xuJiM0MztcdGNncm91cF9hdHRhY2hfbG9jayhDR1JQX0FUVEFDSF9MT0NLX0dMT0JBTCwgTlVMTCk7XG4mIzQzO1x0cmV0ID0gY2dyb3VwX2F0dGFjaF90YXNrKGNncnAsIHRhc2ssIGZhbHNlKTtcbiYjNDM7XHRjZ3JvdXBfYXR0YWNoX3VubG9jayhDR1JQX0FUVEFDSF9MT0NLX0dMT0JBTCwgTlVMTCk7XG4mIzQzO1x0Y2dyb3VwX3VubG9jaygpO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gcmV0O1xuJiM0Mzt9XG4mIzQzO1xuIHN0cnVjdCB0YXNrX3N0cnVjdCAqY2dyb3VwX3Byb2NzX3dyaXRlX3N0YXJ0KGNoYXIgKmJ1ZiwgYm9vbCB0aHJlYWRncm91cCxcbiBcdFx0XHRcdFx0ICAgICBlbnVtIGNncm91cF9hdHRhY2hfbG9ja19tb2RlICpsb2NrX21vZGUpXG4ge1xuZGlmZiAtLWdpdCBhL21tL2JwZl9tZW1jb250cm9sLmMgYi9tbS9icGZfbWVtY29udHJvbC5jXG5pbmRleCA3MTZkZjQ5ZDc2NDc3Li4zZjdhNWM5N2UxMzU1IDEwMDY0NFxuLS0tIGEvbW0vYnBmX21lbWNvbnRyb2wuY1xuJiM0MzsmIzQzOyYjNDM7IGIvbW0vYnBmX21lbWNvbnRyb2wuY1xuQEAgLTYsNiAmIzQzOzYsNyBAQFxuICAqL1xuIFxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L21lbWNvbnRyb2wuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9zd2FwLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9icGYuaFx1MDAzZVxuIFxuIF9fYnBmX2tmdW5jX3N0YXJ0X2RlZnMoKTtcbkBAIC0xNTksNiAmIzQzOzE2MCw2MSBAQCBfX2JwZl9rZnVuYyB2b2lkIGJwZl9tZW1fY2dyb3VwX2ZsdXNoX3N0YXRzKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZylcbiBcdG1lbV9jZ3JvdXBfZmx1c2hfc3RhdHMobWVtY2cpO1xuIH1cbiBcbiYjNDM7LyoqXG4mIzQzOyAqIGJwZl90cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzIC0gYXR0ZW1wdCB0byByZWNsYWltIHBhZ2VzIGZyb21cbiYjNDM7ICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhIG1lbW9yeSBjZ3JvdXBcbiYjNDM7ICogQG1lbWNnOiAgICAgICAgICAgdGhlIHRhcmdldCBtZW1vcnkgY2dyb3VwIHRvIHJlY2xhaW0gZnJvbVxuJiM0MzsgKiBAbnJfcGFnZXM6ICAgICAgICB0aGUgbnVtYmVyIG9mIHBhZ2VzIHRvIHJlY2xhaW1cbiYjNDM7ICogQGdmcF9tYXNrOiAgICAgICAgR0ZQIGZsYWdzIGNvbnRyb2xsaW5nIHRoZSByZWNsYWltIGJlaGF2aW9yXG4mIzQzOyAqIEByZWNsYWltX29wdGlvbnM6IGJpdG1hc2sgb2YgTUVNQ0dfUkVDTEFJTV8qIGZsYWdzIHRvIHR1bmVcbiYjNDM7ICogICAgICAgICAgICAgICAgICAgcmVjbGFpbSBzdHJhdGVneVxuJiM0MzsgKiBAc3dhcHBpbmVzczogICAgICBzd2FwcGluZXNzIG92ZXJyaWRlIHZhbHVlLCBvciBhIHNlbnRpbmVsIHRvIHVzZVxuJiM0MzsgKiAgICAgICAgICAgICAgICAgICB0aGUgZGVmYXVsdFxuJiM0MzsgKlxuJiM0MzsgKiBCUEYtZmFjaW5nIHdyYXBwZXIgYXJvdW5kIHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMoKSB0aGF0XG4mIzQzOyAqIHZhbGlkYXRlcyBhbmQgdHJhbnNsYXRlcyB0aGUgQHN3YXBwaW5lc3MgYXJndW1lbnQgYmVmb3JlXG4mIzQzOyAqIGRlbGVnYXRpbmcgdG8gdGhlIGNvcmUgcmVjbGFpbSBwYXRoLlxuJiM0MzsgKlxuJiM0MzsgKiBUaGUgQHN3YXBwaW5lc3MgcGFyYW1ldGVyIGZvbGxvd3MgdGhlc2Ugc2VtYW50aWNzOlxuJiM0MzsgKiAgIC0gVmFsdWVzIGluIFtNSU5fU1dBUFBJTkVTUywgU1dBUFBJTkVTU19BTk9OX09OTFldIGFyZSBwYXNzZWRcbiYjNDM7ICogICAgIHRocm91Z2ggYXMgYW4gZXhwbGljaXQgc3dhcHBpbmVzcyBvdmVycmlkZS5cbiYjNDM7ICogICAtIFZhbHVlcyBiZWxvdyBNSU5fU1dBUFBJTkVTUyBhcmUgdHJlYXRlZCBhcyBcJiMzNDt1c2UgdGhlIHN5c3RlbVxuJiM0MzsgKiAgICAgZGVmYXVsdFwmIzM0OzsgdGhlIG92ZXJyaWRlIHBvaW50ZXIgaXMgc2V0IHRvIE5VTEwgYW5kIHRoZSBjZ3JvdXAmIzM5O3NcbiYjNDM7ICogICAgIG93biBzd2FwcGluZXNzIHNldHRpbmcgdGFrZXMgZWZmZWN0LlxuJiM0MzsgKiAgIC0gVmFsdWVzIGFib3ZlIFNXQVBQSU5FU1NfQU5PTl9PTkxZIGFyZSByZWplY3RlZCBhcyBpbnZhbGlkLlxuJiM0MzsgKiAgIC0gSWYgQHJlY2xhaW1fb3B0aW9ucyBkb2VzIG5vdCBpbmNsdWRlIE1FTUNHX1JFQ0xBSU1fUFJPQUNUSVZFLFxuJiM0MzsgKiAgICAgdGhlIEBzd2FwcGluZXNzIG92ZXJyaWRlIGlzIGlnbm9yZWQgZW50aXJlbHkgYnkgdGhlIGNvcmVcbiYjNDM7ICogICAgIHJlY2xhaW0gcGF0aCBhbmQgdGhlIHN5c3RlbSBkZWZhdWx0IGlzIHVzZWQgcmVnYXJkbGVzcy5cbiYjNDM7ICpcbiYjNDM7ICogU3dhcCB1c2FnZSBkdXJpbmcgcmVjbGFpbSBpcyBnYXRlZCBvbiBAcmVjbGFpbV9vcHRpb25zOiBzd2FwIGlzXG4mIzQzOyAqIGNvbnNpZGVyZWQgb25seSB3aGVuIE1FTUNHX1JFQ0xBSU1fTUFZX1NXQVAgaXMgc2V0LiAgV2l0aG91dCB0aGlzXG4mIzQzOyAqIGZsYWcsIHJlY2xhaW0gaXMgcmVzdHJpY3RlZCB0byBmaWxlLWJhY2tlZCBwYWdlcyByZWdhcmRsZXNzIG9mIHRoZVxuJiM0MzsgKiBAc3dhcHBpbmVzcyB2YWx1ZSBvciB0aGUgY2dyb3VwJiMzOTtzIHN3YXBwaW5lc3Mgc2V0dGluZy5cbiYjNDM7ICpcbiYjNDM7ICogUmV0dXJuOlxuJiM0MzsgKiAgIFRoZSBudW1iZXIgb2YgcGFnZXMgYWN0dWFsbHkgcmVjbGFpbWVkIG9uIHN1Y2Nlc3MsIG9yIDBcbiYjNDM7ICogICBpZiBAc3dhcHBpbmVzcyBleGNlZWRzIFNXQVBQSU5FU1NfQU5PTl9PTkxZLlxuJiM0MzsgKi9cbiYjNDM7X19icGZfa2Z1bmMgdW5zaWduZWQgbG9uZ1xuJiM0MzticGZfdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcyhzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csXG4mIzQzO1x0XHRcdFx0IHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMsXG4mIzQzO1x0XHRcdFx0IGdmcF90IGdmcF9tYXNrLFxuJiM0MztcdFx0XHRcdCB1bnNpZ25lZCBpbnQgcmVjbGFpbV9vcHRpb25zLFxuJiM0MztcdFx0XHRcdCBpbnQgc3dhcHBpbmVzcylcbiYjNDM7e1xuJiM0MztcdGludCAqc3dhcGluZXNzX3B0cjtcbiYjNDM7XG4mIzQzO1x0aWYgKHN3YXBwaW5lc3MgXHUwMDNlIFNXQVBQSU5FU1NfQU5PTl9PTkxZKVxuJiM0MztcdFx0cmV0dXJuIDA7XG4mIzQzO1x0ZWxzZSBpZiAoc3dhcHBpbmVzcyBcdTAwM2MgTUlOX1NXQVBQSU5FU1MpXG4mIzQzO1x0XHRzd2FwaW5lc3NfcHRyID0gTlVMTDtcbiYjNDM7XHRlbHNlXG4mIzQzO1x0XHRzd2FwaW5lc3NfcHRyID0gXHUwMDI2c3dhcHBpbmVzcztcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMobWVtY2csIG5yX3BhZ2VzLCBnZnBfbWFzayxcbiYjNDM7XHRcdFx0XHRcdCAgICByZWNsYWltX29wdGlvbnMsIHN3YXBpbmVzc19wdHIpO1xuJiM0Mzt9XG4mIzQzO1xuIF9fYnBmX2tmdW5jX2VuZF9kZWZzKCk7XG4gXG4gQlRGX0tGVU5DU19TVEFSVChicGZfbWVtY29udHJvbF9rZnVuY3MpXG5AQCAtMTcyLDYgJiM0MzsyMjgsOCBAQCBCVEZfSURfRkxBR1MoZnVuYywgYnBmX21lbV9jZ3JvdXBfdXNhZ2UpXG4gQlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9tZW1fY2dyb3VwX3BhZ2Vfc3RhdGUpXG4gQlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9tZW1fY2dyb3VwX2ZsdXNoX3N0YXRzLCBLRl9TTEVFUEFCTEUpXG4gXG4mIzQzO0JURl9JRF9GTEFHUyhmdW5jLCBicGZfdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcywgS0ZfU0xFRVBBQkxFKVxuJiM0MztcbiBCVEZfS0ZVTkNTX0VORChicGZfbWVtY29udHJvbF9rZnVuY3MpXG4gXG4gc3RhdGljIGNvbnN0IHN0cnVjdCBidGZfa2Z1bmNfaWRfc2V0IGJwZl9tZW1jb250cm9sX2tmdW5jX3NldCA9IHtcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvYnBmX2V4cGVyaW1lbnRhbC5oIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL2JwZl9leHBlcmltZW50YWwuaFxuaW5kZXggZmYzN2FlNWExMTNkYy4uZWE5MDVlYTU2MDNjMiAxMDA2NDRcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9icGZfZXhwZXJpbWVudGFsLmhcbiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9icGZfZXhwZXJpbWVudGFsLmhcbkBAIC0zNTEsNiAmIzQzOzM1MSwxMyBAQCBleHRlcm4gdm9pZCBicGZfaXRlcl9jc3NfZGVzdHJveShzdHJ1Y3QgYnBmX2l0ZXJfY3NzICppdCkgX193ZWFrIF9fa3N5bTtcbiBleHRlcm4gaW50IGJwZl93cV9pbml0KHN0cnVjdCBicGZfd3EgKndxLCB2b2lkICpwX19tYXAsIHVuc2lnbmVkIGludCBmbGFncykgX193ZWFrIF9fa3N5bTtcbiBleHRlcm4gaW50IGJwZl93cV9zdGFydChzdHJ1Y3QgYnBmX3dxICp3cSwgdW5zaWduZWQgaW50IGZsYWdzKSBfX3dlYWsgX19rc3ltO1xuIFxuJiM0MztzdHJ1Y3QgYnBmX3RocmVhZF93cTtcbiYjNDM7ZXh0ZXJuIGludCBicGZfdGhyZWFkX3dxX2luaXQoc3RydWN0IGJwZl90aHJlYWRfd3EgKnR3cSwgdm9pZCAqcF9fbWFwLFxuJiM0MztcdFx0XHQgICAgICBfX3U2NCBjZ3JvdXBfaWQsXG4mIzQzO1x0XHRcdCAgICAgIHVuc2lnbmVkIGludCBmbGFncykgX193ZWFrIF9fa3N5bTtcbiYjNDM7ZXh0ZXJuIGludCBicGZfdGhyZWFkX3dxX3N0YXJ0KHN0cnVjdCBicGZfdGhyZWFkX3dxICp0d3EsXG4mIzQzO1x0XHRcdCAgICAgICB1bnNpZ25lZCBpbnQgZmxhZ3MpIF9fd2VhayBfX2tzeW07XG4mIzQzO1xuIHN0cnVjdCBicGZfaXRlcl9rbWVtX2NhY2hlO1xuIGV4dGVybiBpbnQgYnBmX2l0ZXJfa21lbV9jYWNoZV9uZXcoc3RydWN0IGJwZl9pdGVyX2ttZW1fY2FjaGUgKml0KSBfX3dlYWsgX19rc3ltO1xuIGV4dGVybiBzdHJ1Y3Qga21lbV9jYWNoZSAqYnBmX2l0ZXJfa21lbV9jYWNoZV9uZXh0KHN0cnVjdCBicGZfaXRlcl9rbWVtX2NhY2hlICppdCkgX193ZWFrIF9fa3N5bTtcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9tZW1jZ19hc3luY19yZWNsYWltLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9tZW1jZ19hc3luY19yZWNsYWltLmNcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwLi40MGE1ZmU2MmNiMzg0XG4tLS0gL2Rldi9udWxsXG4mIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9tZW1jZ19hc3luY19yZWNsYWltLmNcbkBAIC0wLDAgJiM0MzsxLDQ3OSBAQFxuJiM0MzsvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxuJiM0MzsvKlxuJiM0MzsgKiBNZW1vcnkgY29udHJvbGxlciBlQlBGIGFzeW5jIHJlY2xhaW0gdGVzdFxuJiM0MzsgKi9cbiYjNDM7XG4mIzQzOyNpbmNsdWRlIFx1MDAzY3Rlc3RfcHJvZ3MuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NzeXMvbW1hbi5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY3N5cy9zdGF0LmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjc3lzL3RpbWUuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NzeXMvdmZzLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjc3lzL3dhaXQuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NmY250bC5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L21hZ2ljLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjdW5pc3RkLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjc3RkaW8uaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NzdGRsaWIuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NzdHJpbmcuaFx1MDAzZVxuJiM0MztcbiYjNDM7I2luY2x1ZGUgXCYjMzQ7Y2dyb3VwX2hlbHBlcnMuaFwmIzM0O1xuJiM0MztcbiYjNDM7c3RydWN0IGJwZl9hcmdzX3Mge1xuJiM0MztcdHU2NCBoaWdoX2Nncm91cF9pZDtcbiYjNDM7XHR1NjQgbG93X2Nncm91cF9pZDtcbiYjNDM7XHR1NjQgZXZlbnRfZGVsdGFfdGhyZXNob2xkO1xuJiM0MztcdHU2NCBjaGVja19ucztcbiYjNDM7fTtcbiYjNDM7XG4mIzQzOyNpbmNsdWRlIFwmIzM0O21lbWNnX2FzeW5jX3JlY2xhaW0uc2tlbC5oXCYjMzQ7XG4mIzQzO1xuJiM0MzsjZGVmaW5lIEZJTEVfU0laRSAoMzIgKiAxMDI0ICogMTAyNHVsKVxuJiM0MzsjZGVmaW5lIEJVRkZFUl9TSVpFICg0MDk2KVxuJiM0MzsjZGVmaW5lIENHX0xJTUlUICgzMiAqIDEwMjQgKiAxMDI0dWwpXG4mIzQzOyNkZWZpbmUgUkVBRF9USU1FUyAxNlxuJiM0MztcbiYjNDM7I2RlZmluZSBDR19ESVIgXCYjMzQ7L21lbWNnX2FzeW5jX3JlY2xhaW1cJiMzNDtcbiYjNDM7I2RlZmluZSBDR19ISUdIX0RJUiBDR19ESVIgXCYjMzQ7L2hpZ2hcJiMzNDtcbiYjNDM7I2RlZmluZSBDR19MT1dfRElSIENHX0RJUiBcJiMzNDsvbG93XCYjMzQ7XG4mIzQzO1xuJiM0MzsjZGVmaW5lIENIRUNLX1BFUklPRF9OUyAoMiAqIDEwMDAgKiAxMDAwdWxsKVxuJiM0MzsjZGVmaW5lIEVWRU5UX0RFTFRBX1RIUkVTSE9MRCAxXG4mIzQzO1xuJiM0MzsvKlxuJiM0MzsgKiBUZXN0IGZpbGVzIG11c3QgcmVzaWRlIG9uIGEgZmlsZXN5c3RlbSB0aGF0IHN1cHBvcnRzIHBhZ2UgcmVjbGFpbSB3aXRob3V0XG4mIzQzOyAqIHN3YXAgKGUuZy4gZXh0NCkuIElmIC90bXAgaXMgb24gdG1wZnMsIHRoZSBmaWxlIHBhZ2VzIGFyZSBzaG1lbS1iYWNrZWRcbiYjNDM7ICogYW5kIGNhbiBvbmx5IGJlIHJlY2xhaW1lZCB0aHJvdWdoIHN3YXAuIEJ1dCB0aGUgdGVzdCBkaXNhYmxlcyBzd2FwXG4mIzQzOyAqIChtZW1vcnkuc3dhcC5tYXg9MCksIG1ha2luZyByZWNsYWltIGltcG9zc2libGUgYW5kIGNhdXNpbmcgT09NLlxuJiM0MzsgKlxuJiM0MzsgKiBQaWNrIGEgZGlyZWN0b3J5IG9uIGEgbm9uLXRtcGZzIGZpbGVzeXN0ZW06IHRyeSAkVE1QRElSIGZpcnN0LCB0aGVuIC90bXAsXG4mIzQzOyAqIGFuZCBmYWxsIGJhY2sgdG8gdGhlIGN1cnJlbnQgZGlyZWN0b3J5IGlmIHRoZSBjaG9zZW4gcGF0aCBpcyBvbiB0bXBmcy5cbiYjNDM7ICovXG4mIzQzO3N0YXRpYyBpbnQgZ2V0X3Rlc3RfZGlyKGNoYXIgKmJ1Ziwgc2l6ZV90IHNpemUpXG4mIzQzO3tcbiYjNDM7XHRzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGNhbmRpZGF0ZXNbXSA9IHsgXCYjMzQ7L3RtcFwmIzM0OywgXCYjMzQ7LlwmIzM0OyB9O1xuJiM0MztcdGNvbnN0IGNoYXIgKnRtcGRpciA9IGdldGVudihcJiMzNDtUTVBESVJcJiMzNDspO1xuJiM0MztcdHN0cnVjdCBzdGF0ZnMgc2ZzO1xuJiM0MztcdHNpemVfdCBpO1xuJiM0MztcbiYjNDM7XHRpZiAodG1wZGlyIFx1MDAyNlx1MDAyNiB0bXBkaXJbMF0gXHUwMDI2XHUwMDI2IHN0YXRmcyh0bXBkaXIsIFx1MDAyNnNmcykgPT0gMCBcdTAwMjZcdTAwMjZcbiYjNDM7XHQgICAgc2ZzLmZfdHlwZSAhPSBUTVBGU19NQUdJQykge1xuJiM0MztcdFx0c25wcmludGYoYnVmLCBzaXplLCBcJiMzNDslc1wmIzM0OywgdG1wZGlyKTtcbiYjNDM7XHRcdHJldHVybiAwO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgQVJSQVlfU0laRShjYW5kaWRhdGVzKTsgaSYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdGlmIChzdGF0ZnMoY2FuZGlkYXRlc1tpXSwgXHUwMDI2c2ZzKSA9PSAwIFx1MDAyNlx1MDAyNlxuJiM0MztcdFx0ICAgIHNmcy5mX3R5cGUgIT0gVE1QRlNfTUFHSUMpIHtcbiYjNDM7XHRcdFx0c25wcmludGYoYnVmLCBzaXplLCBcJiMzNDslc1wmIzM0OywgY2FuZGlkYXRlc1tpXSk7XG4mIzQzO1x0XHRcdHJldHVybiAwO1xuJiM0MztcdFx0fVxuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0cmV0dXJuIC0xO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgaW50IHNldHVwX2hpZ2hfbG93X2Nncm91cHModTY0ICpoaWdoX2Nncm91cF9pZCwgdTY0ICpsb3dfY2dyb3VwX2lkKVxuJiM0Mzt7XG4mIzQzO1x0aW50IHJldDtcbiYjNDM7XHRjaGFyIGxpbWl0X2J1ZlsyMF07XG4mIzQzO1xuJiM0MztcdHJldCA9IHNldHVwX2Nncm91cF9lbnZpcm9ubWVudCgpO1xuJiM0MztcdGlmICghQVNTRVJUX09LKHJldCwgXCYjMzQ7c2V0dXBfY2dyb3VwX2Vudmlyb25tZW50XCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gY2xlYW51cDtcbiYjNDM7XG4mIzQzO1x0cmV0ID0gY3JlYXRlX2FuZF9nZXRfY2dyb3VwKENHX0RJUik7XG4mIzQzO1x0aWYgKCFBU1NFUlRfR0UocmV0LCAwLCBcJiMzNDtjcmVhdGVfYW5kX2dldF9jZ3JvdXAgXCYjMzQ7IENHX0RJUikpXG4mIzQzO1x0XHRnb3RvIGNsZWFudXA7XG4mIzQzO1x0Y2xvc2UocmV0KTtcbiYjNDM7XG4mIzQzO1x0cmV0ID0gZW5hYmxlX2NvbnRyb2xsZXJzKENHX0RJUiwgXCYjMzQ7bWVtb3J5XCYjMzQ7KTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PSyhyZXQsIFwmIzM0O2VuYWJsZV9jb250cm9sbGVyc1wmIzM0OykpXG4mIzQzO1x0XHRnb3RvIGNsZWFudXA7XG4mIzQzO1xuJiM0MztcdHNucHJpbnRmKGxpbWl0X2J1Ziwgc2l6ZW9mKGxpbWl0X2J1ZiksIFwmIzM0OyVsdVwmIzM0OywgQ0dfTElNSVQpO1xuJiM0MztcdHJldCA9IHdyaXRlX2Nncm91cF9maWxlKENHX0RJUiwgXCYjMzQ7bWVtb3J5Lm1heFwmIzM0OywgbGltaXRfYnVmKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PSyhyZXQsIFwmIzM0O3dyaXRlX2Nncm91cF9maWxlIG1lbW9yeS5tYXhcJiMzNDspKVxuJiM0MztcdFx0Z290byBjbGVhbnVwO1xuJiM0MztcbiYjNDM7XHRyZXQgPSB3cml0ZV9jZ3JvdXBfZmlsZShDR19ESVIsIFwmIzM0O21lbW9yeS5zd2FwLm1heFwmIzM0OywgXCYjMzQ7MFwmIzM0Oyk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0socmV0LCBcJiMzNDt3cml0ZV9jZ3JvdXBfZmlsZSBtZW1vcnkuc3dhcC5tYXhcJiMzNDspKVxuJiM0MztcdFx0Z290byBjbGVhbnVwO1xuJiM0MztcbiYjNDM7XHRyZXQgPSBjcmVhdGVfYW5kX2dldF9jZ3JvdXAoQ0dfSElHSF9ESVIpO1xuJiM0MztcdGlmICghQVNTRVJUX0dFKHJldCwgMCwgXCYjMzQ7Y3JlYXRlX2FuZF9nZXRfY2dyb3VwIFwmIzM0OyBDR19ISUdIX0RJUikpXG4mIzQzO1x0XHRnb3RvIGNsZWFudXA7XG4mIzQzO1x0Y2xvc2UocmV0KTtcbiYjNDM7XG4mIzQzO1x0KmhpZ2hfY2dyb3VwX2lkID0gZ2V0X2Nncm91cF9pZChDR19ISUdIX0RJUik7XG4mIzQzO1x0aWYgKCFBU1NFUlRfR1QoKmhpZ2hfY2dyb3VwX2lkLCAwLCBcJiMzNDtnZXRfY2dyb3VwX2lkXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gY2xlYW51cDtcbiYjNDM7XG4mIzQzO1x0cmV0ID0gY3JlYXRlX2FuZF9nZXRfY2dyb3VwKENHX0xPV19ESVIpO1xuJiM0MztcdGlmICghQVNTRVJUX0dFKHJldCwgMCwgXCYjMzQ7Y3JlYXRlX2FuZF9nZXRfY2dyb3VwIFwmIzM0OyBDR19MT1dfRElSKSlcbiYjNDM7XHRcdGdvdG8gY2xlYW51cDtcbiYjNDM7XHRjbG9zZShyZXQpO1xuJiM0MztcbiYjNDM7XHQqbG93X2Nncm91cF9pZCA9IGdldF9jZ3JvdXBfaWQoQ0dfTE9XX0RJUik7XG4mIzQzO1x0aWYgKCFBU1NFUlRfR1QoKmhpZ2hfY2dyb3VwX2lkLCAwLCBcJiMzNDtnZXRfY2dyb3VwX2lkXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gY2xlYW51cDtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIDA7XG4mIzQzO1xuJiM0MztjbGVhbnVwOlxuJiM0MztcdGNsZWFudXBfY2dyb3VwX2Vudmlyb25tZW50KCk7XG4mIzQzO1x0cmV0dXJuIC0xO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgaW50IHdyaXRlX2ZpbGUoY29uc3QgY2hhciAqZmlsZW5hbWUpXG4mIzQzO3tcbiYjNDM7XHRpbnQgcmV0ID0gLTE7XG4mIzQzO1x0c2l6ZV90IHdyaXR0ZW4gPSAwO1xuJiM0MztcdGNoYXIgKmJ1ZmZlcjtcbiYjNDM7XHRGSUxFICpmcDtcbiYjNDM7XG4mIzQzO1x0ZnAgPSBmb3BlbihmaWxlbmFtZSwgXCYjMzQ7d2JcJiMzNDspO1xuJiM0MztcdGlmICghZnApXG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XG4mIzQzO1x0YnVmZmVyID0gbWFsbG9jKEJVRkZFUl9TSVpFKTtcbiYjNDM7XHRpZiAoIWJ1ZmZlcilcbiYjNDM7XHRcdGdvdG8gY2xlYW51cF9mcDtcbiYjNDM7XG4mIzQzO1x0bWVtc2V0KGJ1ZmZlciwgJiMzOTtBJiMzOTssIEJVRkZFUl9TSVpFKTtcbiYjNDM7XG4mIzQzO1x0d2hpbGUgKHdyaXR0ZW4gXHUwMDNjIEZJTEVfU0laRSkge1xuJiM0MztcdFx0c2l6ZV90IHRvX3dyaXRlID0gRklMRV9TSVpFIC0gd3JpdHRlbiBcdTAwM2MgQlVGRkVSX1NJWkUgP1xuJiM0MztcdFx0XHRcdCAgRklMRV9TSVpFIC0gd3JpdHRlbiA6IEJVRkZFUl9TSVpFO1xuJiM0MztcbiYjNDM7XHRcdGlmIChmd3JpdGUoYnVmZmVyLCAxLCB0b193cml0ZSwgZnApICE9IHRvX3dyaXRlKVxuJiM0MztcdFx0XHRnb3RvIGNsZWFudXA7XG4mIzQzO1x0XHR3cml0dGVuICYjNDM7PSB0b193cml0ZTtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdHJldCA9IDA7XG4mIzQzO2NsZWFudXA6XG4mIzQzO1x0ZnJlZShidWZmZXIpO1xuJiM0MztjbGVhbnVwX2ZwOlxuJiM0MztcdGZjbG9zZShmcCk7XG4mIzQzO291dDpcbiYjNDM7XHRyZXR1cm4gcmV0O1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgaW50IHJlYWRfZmlsZShjb25zdCBjaGFyICpmaWxlbmFtZSwgaW50IGl0ZXJhdGlvbnMpXG4mIzQzO3tcbiYjNDM7XHRpbnQgcmV0ID0gLTE7XG4mIzQzO1x0bG9uZyBwYWdlX3NpemUgPSBzeXNjb25mKF9TQ19QQUdFU0laRSk7XG4mIzQzO1x0Y2hhciAqbWFwO1xuJiM0MztcdHNpemVfdCBpO1xuJiM0MztcdGludCBmZDtcbiYjNDM7XHRzdHJ1Y3Qgc3RhdCBzYjtcbiYjNDM7XG4mIzQzO1x0ZmQgPSBvcGVuKGZpbGVuYW1lLCBPX1JET05MWSk7XG4mIzQzO1x0aWYgKGZkID09IC0xKVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1xuJiM0MztcdGlmIChmc3RhdChmZCwgXHUwMDI2c2IpID09IC0xKVxuJiM0MztcdFx0Z290byBjbGVhbnVwX2ZkO1xuJiM0MztcbiYjNDM7XHRpZiAoc2Iuc3Rfc2l6ZSAhPSBGSUxFX1NJWkUpIHtcbiYjNDM7XHRcdGZwcmludGYoc3RkZXJyLCBcJiMzNDtGaWxlIHNpemUgbWlzbWF0Y2g6IGV4cGVjdGVkICVsdSwgZ290ICVsdVxcblwmIzM0OyxcbiYjNDM7XHRcdFx0KHVuc2lnbmVkIGxvbmcpRklMRV9TSVpFLCAodW5zaWduZWQgbG9uZylzYi5zdF9zaXplKTtcbiYjNDM7XHRcdGdvdG8gY2xlYW51cF9mZDtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdG1hcCA9IG1tYXAoTlVMTCwgRklMRV9TSVpFLCBQUk9UX1JFQUQsIE1BUF9QUklWQVRFLCBmZCwgMCk7XG4mIzQzO1x0aWYgKG1hcCA9PSBNQVBfRkFJTEVEKVxuJiM0MztcdFx0Z290byBjbGVhbnVwX2ZkO1xuJiM0MztcbiYjNDM7XHRmb3IgKGludCBpdGVyID0gMDsgaXRlciBcdTAwM2MgaXRlcmF0aW9uczsgaXRlciYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIEZJTEVfU0laRTsgaSAmIzQzOz0gcGFnZV9zaXplKSB7XG4mIzQzO1x0XHRcdC8qIGFjY2VzcyBhIGJ5dGUgdG8gdHJpZ2dlciBwYWdlIGZhdWx0ICovXG4mIzQzO1x0XHRcdGFzbSB2b2xhdGlsZShcJiMzNDtcJiMzNDsgOjogXCYjMzQ7clwmIzM0OyhtYXBbaV0pIDogXCYjMzQ7bWVtb3J5XCYjMzQ7KTtcbiYjNDM7XHRcdH1cbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdGlmIChtdW5tYXAobWFwLCBGSUxFX1NJWkUpID09IC0xKVxuJiM0MztcdFx0Z290byBjbGVhbnVwX2ZkO1xuJiM0MztcbiYjNDM7XHRyZXQgPSAwO1xuJiM0MztcbiYjNDM7Y2xlYW51cF9mZDpcbiYjNDM7XHRjbG9zZShmZCk7XG4mIzQzO291dDpcbiYjNDM7XHRyZXR1cm4gcmV0O1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgaW50IHJlYWxfdGVzdF9jaGlsZF93b3JrKGNvbnN0IGNoYXIgKmNncm91cF9wYXRoLCBjaGFyICpkYXRhX2ZpbGVuYW1lLFxuJiM0MztcdFx0XHRcdGNoYXIgKnRpbWVfZmlsZW5hbWUsIGludCByZWFkX3RpbWVzKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IHRpbWV2YWwgc3RhcnQsIGVuZDtcbiYjNDM7XHRkb3VibGUgZWxhcHNlZDtcbiYjNDM7XHRGSUxFICpmcDtcbiYjNDM7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0soam9pbl9wYXJlbnRfY2dyb3VwKGNncm91cF9wYXRoKSwgXCYjMzQ7am9pbl9wYXJlbnRfY2dyb3VwXCYjMzQ7KSlcbiYjNDM7XHRcdHJldHVybiAtMTtcbiYjNDM7XG4mIzQzO1x0Z2V0dGltZW9mZGF5KFx1MDAyNnN0YXJ0LCBOVUxMKTtcbiYjNDM7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0sod3JpdGVfZmlsZShkYXRhX2ZpbGVuYW1lKSwgXCYjMzQ7d3JpdGVfZmlsZVwmIzM0OykpXG4mIzQzO1x0XHRyZXR1cm4gLTE7XG4mIzQzO1xuJiM0MztcdGlmICghQVNTRVJUX09LKHJlYWRfZmlsZShkYXRhX2ZpbGVuYW1lLCByZWFkX3RpbWVzKSwgXCYjMzQ7cmVhZF9maWxlXCYjMzQ7KSlcbiYjNDM7XHRcdHJldHVybiAtMTtcbiYjNDM7XG4mIzQzO1x0Z2V0dGltZW9mZGF5KFx1MDAyNmVuZCwgTlVMTCk7XG4mIzQzO1xuJiM0MztcdGlmICghdGltZV9maWxlbmFtZSlcbiYjNDM7XHRcdHJldHVybiAwO1xuJiM0MztcbiYjNDM7XHRlbGFwc2VkID0gKGVuZC50dl9zZWMgLSBzdGFydC50dl9zZWMpICYjNDM7XG4mIzQzO1x0XHQgIChlbmQudHZfdXNlYyAtIHN0YXJ0LnR2X3VzZWMpIC8gMTAwMDAwMC4wO1xuJiM0MztcdHByaW50ZihcJiMzNDslLjZmXFxuXCYjMzQ7LCBlbGFwc2VkKTtcbiYjNDM7XG4mIzQzO1x0ZnAgPSBmb3Blbih0aW1lX2ZpbGVuYW1lLCBcJiMzNDt3XCYjMzQ7KTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PS19QVFIoZnAsIFwmIzM0O2ZvcGVuXCYjMzQ7KSlcbiYjNDM7XHRcdHJldHVybiAtMTtcbiYjNDM7XHRmcHJpbnRmKGZwLCBcJiMzNDslLjZmXCYjMzQ7LCBlbGFwc2VkKTtcbiYjNDM7XHRmY2xvc2UoZnApO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGludCBnZXRfdGltZShjaGFyICp0aW1lX2ZpbGVuYW1lLCBkb3VibGUgKnRpbWUpXG4mIzQzO3tcbiYjNDM7XHRpbnQgcmV0ID0gLTE7XG4mIzQzO1x0RklMRSAqZnA7XG4mIzQzO1x0Y2hhciBidWZbNjRdO1xuJiM0MztcbiYjNDM7XHRmcCA9IGZvcGVuKHRpbWVfZmlsZW5hbWUsIFwmIzM0O3JcJiMzNDspO1xuJiM0MztcdGlmICghQVNTRVJUX09LX1BUUihmcCwgXCYjMzQ7Zm9wZW5cJiMzNDspKVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1xuJiM0MztcdGlmICghQVNTRVJUX09LX1BUUihmZ2V0cyhidWYsIHNpemVvZihidWYpLCBmcCksIFwmIzM0O2ZnZXRzXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gY2xlYW51cDtcbiYjNDM7XG4mIzQzO1x0aWYgKHNzY2FuZihidWYsIFwmIzM0OyVsZlwmIzM0OywgdGltZSkgIT0gMSkge1xuJiM0MztcdFx0UFJJTlRfRkFJTChcJiMzNDtzc2NhbmYgJXNcJiMzNDssIGJ1Zik7XG4mIzQzO1x0XHRnb3RvIGNsZWFudXA7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRyZXQgPSAwO1xuJiM0MztjbGVhbnVwOlxuJiM0MztcdGZjbG9zZShmcCk7XG4mIzQzO291dDpcbiYjNDM7XHRyZXR1cm4gcmV0O1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgaW50XG4mIzQzO3J1bl9oaWdoX2xvd193b3JrbG9hZChkb3VibGUgKmhpZ2hfZWxhcHNlZCwgZG91YmxlICpsb3dfZWxhcHNlZCwgaW50IHJlYWRfdGltZXMpXG4mIzQzO3tcbiYjNDM7XHRjaGFyIHRlc3RfZGlyW1BBVEhfTUFYXSwgaGlnaF9kYXRhX2ZpbGVbUEFUSF9NQVhdLCBsb3dfZGF0YV9maWxlW1BBVEhfTUFYXTtcbiYjNDM7XHRjaGFyIGhpZ2hfdGltZV9maWxlW1BBVEhfTUFYXSwgbG93X3RpbWVfZmlsZVtQQVRIX01BWF07XG4mIzQzO1x0aW50IHJldCwgZmQ7XG4mIzQzO1x0cGlkX3QgaGlnaF9waWQsIGxvd19waWQ7XG4mIzQzO1x0aW50IHN0YXR1cztcbiYjNDM7XG4mIzQzO1x0cmV0ID0gZ2V0X3Rlc3RfZGlyKHRlc3RfZGlyLCBzaXplb2YodGVzdF9kaXIpKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PSyhyZXQsIFwmIzM0O2dldF90ZXN0X2Rpcjogbm8gbm9uLXRtcGZzIGRpcmVjdG9yeSBmb3VuZFwmIzM0OykpXG4mIzQzO1x0XHRyZXR1cm4gLTE7XG4mIzQzO1xuJiM0MztcdGZkID0gc25wcmludGYoaGlnaF9kYXRhX2ZpbGUsIHNpemVvZihoaWdoX2RhdGFfZmlsZSksXG4mIzQzO1x0XHQgICAgICBcJiMzNDslcy9tZW1jZ19hc3luY19oaWdoX2RhdGFfWFhYWFhYXCYjMzQ7LCB0ZXN0X2Rpcik7XG4mIzQzO1x0aWYgKCFBU1NFUlRfTFQoZmQsIHNpemVvZihoaWdoX2RhdGFfZmlsZSksIFwmIzM0O2hpZ2hfZGF0YV9maWxlIHBhdGhcJiMzNDspKVxuJiM0MztcdFx0cmV0dXJuIC0xO1xuJiM0MztcbiYjNDM7XHRmZCA9IHNucHJpbnRmKGxvd19kYXRhX2ZpbGUsIHNpemVvZihsb3dfZGF0YV9maWxlKSxcbiYjNDM7XHRcdCAgICAgIFwmIzM0OyVzL21lbWNnX2FzeW5jX2xvd19kYXRhX1hYWFhYWFwmIzM0OywgdGVzdF9kaXIpO1xuJiM0MztcdGlmICghQVNTRVJUX0xUKGZkLCBzaXplb2YobG93X2RhdGFfZmlsZSksIFwmIzM0O2xvd19kYXRhX2ZpbGUgcGF0aFwmIzM0OykpXG4mIzQzO1x0XHRyZXR1cm4gLTE7XG4mIzQzO1xuJiM0MztcdGZkID0gc25wcmludGYoaGlnaF90aW1lX2ZpbGUsIHNpemVvZihoaWdoX3RpbWVfZmlsZSksXG4mIzQzO1x0XHQgICAgICBcJiMzNDslcy9tZW1jZ19hc3luY19oaWdoX3RpbWVfWFhYWFhYXCYjMzQ7LCB0ZXN0X2Rpcik7XG4mIzQzO1x0aWYgKCFBU1NFUlRfTFQoZmQsIHNpemVvZihoaWdoX3RpbWVfZmlsZSksIFwmIzM0O2hpZ2hfdGltZV9maWxlIHBhdGhcJiMzNDspKVxuJiM0MztcdFx0cmV0dXJuIC0xO1xuJiM0MztcbiYjNDM7XHRmZCA9IHNucHJpbnRmKGxvd190aW1lX2ZpbGUsIHNpemVvZihsb3dfdGltZV9maWxlKSxcbiYjNDM7XHRcdCAgICAgIFwmIzM0OyVzL21lbWNnX2FzeW5jX2xvd190aW1lX1hYWFhYWFwmIzM0OywgdGVzdF9kaXIpO1xuJiM0MztcdGlmICghQVNTRVJUX0xUKGZkLCBzaXplb2YobG93X3RpbWVfZmlsZSksIFwmIzM0O2xvd190aW1lX2ZpbGUgcGF0aFwmIzM0OykpXG4mIzQzO1x0XHRyZXR1cm4gLTE7XG4mIzQzO1xuJiM0MztcdGZkID0gbWtzdGVtcChoaWdoX2RhdGFfZmlsZSk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfR0UoZmQsIDAsIFwmIzM0O21rc3RlbXBcJiMzNDspKVxuJiM0MztcdFx0cmV0dXJuIC0xO1xuJiM0MztcdGNsb3NlKGZkKTtcbiYjNDM7XG4mIzQzO1x0ZmQgPSBta3N0ZW1wKGxvd19kYXRhX2ZpbGUpO1xuJiM0MztcdGlmICghQVNTRVJUX0dFKGZkLCAwLCBcJiMzNDtta3N0ZW1wXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gY2xlYW51cF9oaWdoX2RhdGE7XG4mIzQzO1x0Y2xvc2UoZmQpO1xuJiM0MztcbiYjNDM7XHRmZCA9IG1rc3RlbXAoaGlnaF90aW1lX2ZpbGUpO1xuJiM0MztcdGlmICghQVNTRVJUX0dFKGZkLCAwLCBcJiMzNDtta3N0ZW1wXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gY2xlYW51cF9sb3dfZGF0YTtcbiYjNDM7XHRjbG9zZShmZCk7XG4mIzQzO1xuJiM0MztcdGZkID0gbWtzdGVtcChsb3dfdGltZV9maWxlKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9HRShmZCwgMCwgXCYjMzQ7bWtzdGVtcFwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIGNsZWFudXBfaGlnaF90aW1lO1xuJiM0MztcdGNsb3NlKGZkKTtcbiYjNDM7XG4mIzQzO1x0bG93X3BpZCA9IGZvcmsoKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9HRShsb3dfcGlkLCAwLCBcJiMzNDtmb3JrIGxvd1wmIzM0OykpXG4mIzQzO1x0XHRnb3RvIGNsZWFudXBfbG93X3RpbWU7XG4mIzQzO1x0aWYgKGxvd19waWQgPT0gMClcbiYjNDM7XHRcdGV4aXQocmVhbF90ZXN0X2NoaWxkX3dvcmsoQ0dfTE9XX0RJUiwgbG93X2RhdGFfZmlsZSxcbiYjNDM7XHRcdFx0XHRcdCAgbG93X3RpbWVfZmlsZSwgcmVhZF90aW1lcykpO1xuJiM0MztcbiYjNDM7XHRoaWdoX3BpZCA9IGZvcmsoKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9HRShoaWdoX3BpZCwgMCwgXCYjMzQ7Zm9yayBoaWdoXCYjMzQ7KSkge1xuJiM0MztcdFx0KHZvaWQpd2FpdHBpZChsb3dfcGlkLCBOVUxMLCAwKTtcbiYjNDM7XHRcdGdvdG8gY2xlYW51cF9sb3dfdGltZTtcbiYjNDM7XHR9XG4mIzQzO1x0aWYgKGhpZ2hfcGlkID09IDApXG4mIzQzO1x0XHRleGl0KHJlYWxfdGVzdF9jaGlsZF93b3JrKENHX0hJR0hfRElSLCBoaWdoX2RhdGFfZmlsZSxcbiYjNDM7XHRcdFx0XHRcdCAgaGlnaF90aW1lX2ZpbGUsIHJlYWRfdGltZXMpKTtcbiYjNDM7XG4mIzQzO1x0cmV0ID0gd2FpdHBpZChsb3dfcGlkLCBcdTAwMjZzdGF0dXMsIDApO1xuJiM0MztcdGlmICghQVNTRVJUX0dUKHJldCwgMCwgXCYjMzQ7bG93IHdhaXRwaWRcJiMzNDspKVxuJiM0MztcdFx0Z290byBjbGVhbnVwX2xvd190aW1lO1xuJiM0MztcdGlmICghQVNTRVJUX1RSVUUoV0lGRVhJVEVEKHN0YXR1cyksIFwmIzM0O2xvdyBleGl0ZWRcJiMzNDspKVxuJiM0MztcdFx0Z290byBjbGVhbnVwX2xvd190aW1lO1xuJiM0MztcdGlmICghQVNTRVJUX0VRKFdFWElUU1RBVFVTKHN0YXR1cyksIDAsIFwmIzM0O2xvdyBleGl0IHN0YXR1c1wmIzM0OykpXG4mIzQzO1x0XHRnb3RvIGNsZWFudXBfbG93X3RpbWU7XG4mIzQzO1xuJiM0MztcdHJldCA9IHdhaXRwaWQoaGlnaF9waWQsIFx1MDAyNnN0YXR1cywgMCk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfR1QocmV0LCAwLCBcJiMzNDtoaWdoIHdhaXRwaWRcJiMzNDspKVxuJiM0MztcdFx0Z290byBjbGVhbnVwX2xvd190aW1lO1xuJiM0MztcdGlmICghQVNTRVJUX1RSVUUoV0lGRVhJVEVEKHN0YXR1cyksIFwmIzM0O2hpZ2ggZXhpdGVkXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gY2xlYW51cF9sb3dfdGltZTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9FUShXRVhJVFNUQVRVUyhzdGF0dXMpLCAwLCBcJiMzNDtoaWdoIGV4aXQgc3RhdHVzXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gY2xlYW51cF9sb3dfdGltZTtcbiYjNDM7XG4mIzQzO1x0aWYgKGdldF90aW1lKGhpZ2hfdGltZV9maWxlLCBoaWdoX2VsYXBzZWQpKVxuJiM0MztcdFx0Z290byBjbGVhbnVwX2xvd190aW1lO1xuJiM0MztcdGlmIChnZXRfdGltZShsb3dfdGltZV9maWxlLCBsb3dfZWxhcHNlZCkpXG4mIzQzO1x0XHRnb3RvIGNsZWFudXBfbG93X3RpbWU7XG4mIzQzO1xuJiM0MztcdHJldCA9IDA7XG4mIzQzO1xuJiM0MztjbGVhbnVwX2xvd190aW1lOlxuJiM0MztcdHVubGluayhsb3dfdGltZV9maWxlKTtcbiYjNDM7Y2xlYW51cF9oaWdoX3RpbWU6XG4mIzQzO1x0dW5saW5rKGhpZ2hfdGltZV9maWxlKTtcbiYjNDM7Y2xlYW51cF9sb3dfZGF0YTpcbiYjNDM7XHR1bmxpbmsobG93X2RhdGFfZmlsZSk7XG4mIzQzO2NsZWFudXBfaGlnaF9kYXRhOlxuJiM0MztcdHVubGluayhoaWdoX2RhdGFfZmlsZSk7XG4mIzQzO1x0cmV0dXJuIHJldDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGludFxuJiM0MztzZXR1cF9icGYodTY0IGhpZ2hfY2dyb3VwX2lkLCB1NjQgbG93X2Nncm91cF9pZCxcbiYjNDM7XHQgIHN0cnVjdCBtZW1jZ19hc3luY19yZWNsYWltICoqc2tlbF9wdHIsIGJvb2wgdXNlX3RocmVhZF93cSlcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBtZW1jZ19hc3luY19yZWNsYWltICpza2VsO1xuJiM0MztcdHN0cnVjdCBicGZfYXJnc19zIGJwZl9hcmdzID0ge1xuJiM0MztcdFx0LmhpZ2hfY2dyb3VwX2lkID0gaGlnaF9jZ3JvdXBfaWQsXG4mIzQzO1x0XHQubG93X2Nncm91cF9pZCA9IGxvd19jZ3JvdXBfaWQsXG4mIzQzO1x0XHQuZXZlbnRfZGVsdGFfdGhyZXNob2xkID0gRVZFTlRfREVMVEFfVEhSRVNIT0xELFxuJiM0MztcdFx0LmNoZWNrX25zID0gQ0hFQ0tfUEVSSU9EX05TLFxuJiM0MztcdH07XG4mIzQzO1x0TElCQlBGX09QVFMoYnBmX3Rlc3RfcnVuX29wdHMsIHJ1bl9vcHRzLFxuJiM0MztcdFx0LmN0eF9pbiA9IFx1MDAyNmJwZl9hcmdzLFxuJiM0MztcdFx0LmN0eF9zaXplX2luID0gc2l6ZW9mKGJwZl9hcmdzKSk7XG4mIzQzO1x0aW50IHByb2dfaW5pdF9mZCwgZXJyO1xuJiM0MztcbiYjNDM7XHRza2VsID0gbWVtY2dfYXN5bmNfcmVjbGFpbV9fb3Blbl9hbmRfbG9hZCgpO1xuJiM0MztcdGlmICghQVNTRVJUX09LX1BUUihza2VsLCBcJiMzNDttZW1jZ19hc3luY19yZWNsYWltX19vcGVuX2FuZF9sb2FkXCYjMzQ7KSlcbiYjNDM7XHRcdHJldHVybiAtMTtcbiYjNDM7XG4mIzQzO1x0aWYgKHVzZV90aHJlYWRfd3EpXG4mIzQzO1x0XHRwcm9nX2luaXRfZmQgPSBicGZfcHJvZ3JhbV9fZmQoc2tlbC1cdTAwM2Vwcm9ncy50aHJlYWRfd3FfcHJvZ19pbml0KTtcbiYjNDM7XHRlbHNlXG4mIzQzO1x0XHRwcm9nX2luaXRfZmQgPSBicGZfcHJvZ3JhbV9fZmQoc2tlbC1cdTAwM2Vwcm9ncy53cV9wcm9nX2luaXQpO1xuJiM0MztcdGlmICghQVNTRVJUX0dFKHByb2dfaW5pdF9mZCwgMCwgXCYjMzQ7YnBmX3Byb2dyYW1fX2ZkXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gZXJyb3Jfb3V0O1xuJiM0MztcbiYjNDM7XHRlcnIgPSBicGZfcHJvZ190ZXN0X3J1bl9vcHRzKHByb2dfaW5pdF9mZCwgXHUwMDI2cnVuX29wdHMpO1xuJiM0MztcdGlmICghQVNTRVJUX09LKGVyciwgXCYjMzQ7YnBmX3Byb2dfdGVzdF9ydW5fb3B0c1wmIzM0OykpXG4mIzQzO1x0XHRnb3RvIGVycm9yX291dDtcbiYjNDM7XHRpZiAoIUFTU0VSVF9FUShydW5fb3B0cy5yZXR2YWwsIDAsIFwmIzM0O3Byb2dfaW5pdCByZXR2YWxcJiMzNDspKVxuJiM0MztcdFx0Z290byBlcnJvcl9vdXQ7XG4mIzQzO1xuJiM0MztcdCpza2VsX3B0ciA9IHNrZWw7XG4mIzQzO1x0cmV0dXJuIDA7XG4mIzQzO1xuJiM0MztlcnJvcl9vdXQ6XG4mIzQzO1x0bWVtY2dfYXN5bmNfcmVjbGFpbV9fZGVzdHJveShza2VsKTtcbiYjNDM7XHRyZXR1cm4gLTE7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3ZvaWQgdGVzdF9tZW1jZ193cV9hc3luY19yZWNsYWltKHZvaWQpXG4mIzQzO3tcbiYjNDM7XHR1NjQgaGlnaF9jZ3JvdXBfaWQsIGxvd19jZ3JvdXBfaWQ7XG4mIzQzO1x0aW50IGVycjtcbiYjNDM7XHRkb3VibGUgaGlnaF90aW1lID0gMC4wLCBsb3dfdGltZSA9IDAuMDtcbiYjNDM7XHRzdHJ1Y3QgbWVtY2dfYXN5bmNfcmVjbGFpbSAqc2tlbCA9IE5VTEw7XG4mIzQzO1xuJiM0MztcdGVyciA9IHNldHVwX2hpZ2hfbG93X2Nncm91cHMoXHUwMDI2aGlnaF9jZ3JvdXBfaWQsIFx1MDAyNmxvd19jZ3JvdXBfaWQpO1xuJiM0MztcdGlmICghQVNTRVJUX09LKGVyciwgXCYjMzQ7c2V0dXBfaGlnaF9sb3dfY2dyb3VwcyByZWNsYWltXCYjMzQ7KSlcbiYjNDM7XHRcdHJldHVybjtcbiYjNDM7XG4mIzQzO1x0ZXJyID0gc2V0dXBfYnBmKGhpZ2hfY2dyb3VwX2lkLCBsb3dfY2dyb3VwX2lkLCBcdTAwMjZza2VsLCBmYWxzZSk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0soZXJyLCBcJiMzNDtzZXR1cF9icGZcJiMzNDspKVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1xuJiM0MztcdGVyciA9IHJ1bl9oaWdoX2xvd193b3JrbG9hZChcdTAwMjZoaWdoX3RpbWUsIFx1MDAyNmxvd190aW1lLCBSRUFEX1RJTUVTKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PSyhlcnIsIFwmIzM0O3J1bl9oaWdoX2xvd193b3JrbG9hZCByZWNsYWltXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcbiYjNDM7XHRpZiAoaGlnaF90aW1lIFx1MDAzZT0gbG93X3RpbWUpIHtcbiYjNDM7XHRcdFBSSU5UX0ZBSUwoXCYjMzQ7aGlnaCBjZ3JvdXAgbm90IGltcHJvdmVkIHdpdGggYXN5bmMgcmVjbGFpbTogaGlnaF90aW1lPSVmIGxvd190aW1lPSVmXCYjMzQ7LFxuJiM0MztcdFx0XHQgICBoaWdoX3RpbWUsIGxvd190aW1lKTtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztvdXQ6XG4mIzQzO1x0aWYgKHNrZWwpXG4mIzQzO1x0XHRtZW1jZ19hc3luY19yZWNsYWltX19kZXN0cm95KHNrZWwpO1xuJiM0MztcdC8qXG4mIzQzO1x0ICogV2FpdCBmb3IgYnBmX3dxIHRvIHJlbGVhc2UgdGhlIHJlZmVyZW5jZSB0byBjZ3JvdXBcbiYjNDM7XHQgKiB0byBlbnN1cmUgdGhlIHN1Y2Nlc3NmdWwgZGVsZXRpb24gb2YgY2dyb3VwLlxuJiM0MztcdCAqL1xuJiM0MztcdHNsZWVwKDEpO1xuJiM0MztcdGNsZWFudXBfY2dyb3VwX2Vudmlyb25tZW50KCk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3ZvaWQgdGVzdF9tZW1jZ190aHJlYWRfd3FfYXN5bmNfcmVjbGFpbSh2b2lkKVxuJiM0Mzt7XG4mIzQzO1x0dTY0IGhpZ2hfY2dyb3VwX2lkLCBsb3dfY2dyb3VwX2lkO1xuJiM0MztcdGludCBlcnI7XG4mIzQzO1x0ZG91YmxlIGhpZ2hfdGltZSA9IDAuMCwgbG93X3RpbWUgPSAwLjA7XG4mIzQzO1x0c3RydWN0IG1lbWNnX2FzeW5jX3JlY2xhaW0gKnNrZWwgPSBOVUxMO1xuJiM0MztcbiYjNDM7XHRlcnIgPSBzZXR1cF9oaWdoX2xvd19jZ3JvdXBzKFx1MDAyNmhpZ2hfY2dyb3VwX2lkLCBcdTAwMjZsb3dfY2dyb3VwX2lkKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PSyhlcnIsIFwmIzM0O3NldHVwX2hpZ2hfbG93X2Nncm91cHMgcmVjbGFpbVwmIzM0OykpXG4mIzQzO1x0XHRyZXR1cm47XG4mIzQzO1xuJiM0MztcdGVyciA9IHNldHVwX2JwZihoaWdoX2Nncm91cF9pZCwgbG93X2Nncm91cF9pZCwgXHUwMDI2c2tlbCwgdHJ1ZSk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0soZXJyLCBcJiMzNDtzZXR1cF9icGZcJiMzNDspKVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1xuJiM0MztcdGVyciA9IHJ1bl9oaWdoX2xvd193b3JrbG9hZChcdTAwMjZoaWdoX3RpbWUsIFx1MDAyNmxvd190aW1lLCBSRUFEX1RJTUVTKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PSyhlcnIsIFwmIzM0O3J1bl9oaWdoX2xvd193b3JrbG9hZCByZWNsYWltXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcbiYjNDM7XHRpZiAoaGlnaF90aW1lIFx1MDAzZT0gbG93X3RpbWUpIHtcbiYjNDM7XHRcdFBSSU5UX0ZBSUwoXCYjMzQ7aGlnaCBjZ3JvdXAgbm90IGltcHJvdmVkIHdpdGggYXN5bmMgcmVjbGFpbTogaGlnaF90aW1lPSVmIGxvd190aW1lPSVmXCYjMzQ7LFxuJiM0MztcdFx0XHQgICBoaWdoX3RpbWUsIGxvd190aW1lKTtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztvdXQ6XG4mIzQzO1x0aWYgKHNrZWwpXG4mIzQzO1x0XHRtZW1jZ19hc3luY19yZWNsYWltX19kZXN0cm95KHNrZWwpO1xuJiM0MztcdC8qXG4mIzQzO1x0ICogV2FpdCBmb3IgYnBmX3RocmVhZF93cSB0byByZWxlYXNlIHRoZSByZWZlcmVuY2UgdG8gY2dyb3VwXG4mIzQzO1x0ICogdG8gZW5zdXJlIHRoZSBzdWNjZXNzZnVsIGRlbGV0aW9uIG9mIGNncm91cC5cbiYjNDM7XHQgKi9cbiYjNDM7XHRzbGVlcCgxKTtcbiYjNDM7XHRjbGVhbnVwX2Nncm91cF9lbnZpcm9ubWVudCgpO1xuJiM0Mzt9XG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvdGhyZWFkX3dxX2Nncm91cC5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvdGhyZWFkX3dxX2Nncm91cC5jXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uNzUzN2IwM2YxN2UyYVxuLS0tIC9kZXYvbnVsbFxuJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvdGhyZWFkX3dxX2Nncm91cC5jXG5AQCAtMCwwICYjNDM7MSw4NyBAQFxuJiM0MzsvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxuJiM0MzsjaW5jbHVkZSBcdTAwM2N0ZXN0X3Byb2dzLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjdW5pc3RkLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXCYjMzQ7Y2dyb3VwX2hlbHBlcnMuaFwmIzM0O1xuJiM0MzsjaW5jbHVkZSBcJiMzNDt0aHJlYWRfd3FfY2dyb3VwLnNrZWwuaFwmIzM0O1xuJiM0MztcbiYjNDM7I2RlZmluZSBURVNUX0NHUk9VUCBcJiMzNDsvdGhyZWFkX3dxX3Rlc3RcJiMzNDtcbiYjNDM7I2RlZmluZSBXQUlUX1RJTUVPVVRfU0VDUyAzMFxuJiM0MztcbiYjNDM7dm9pZCB0ZXN0X3RocmVhZF93cV9jZ3JvdXAodm9pZClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCB0aHJlYWRfd3FfY2dyb3VwICpza2VsID0gTlVMTDtcbiYjNDM7XHRpbnQgZXJyLCBwcm9nX2ZkLCBjZ19mZCA9IC0xO1xuJiM0MztcdHVuc2lnbmVkIGxvbmcgbG9uZyBjZ19pZDtcbiYjNDM7XHRpbnQgd2FpdGVkX3NlY3M7XG4mIzQzO1xuJiM0MztcdExJQkJQRl9PUFRTKGJwZl90ZXN0X3J1bl9vcHRzLCB0b3B0cyk7XG4mIzQzO1xuJiM0MztcdGVyciA9IHNldHVwX2Nncm91cF9lbnZpcm9ubWVudCgpO1xuJiM0MztcdGlmICghQVNTRVJUX09LKGVyciwgXCYjMzQ7c2V0dXBfY2dyb3VwX2Vudmlyb25tZW50XCYjMzQ7KSlcbiYjNDM7XHRcdHJldHVybjtcbiYjNDM7XHRjZ19mZCA9IGNyZWF0ZV9hbmRfZ2V0X2Nncm91cChURVNUX0NHUk9VUCk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfR0UoY2dfZmQsIDAsIFwmIzM0O2NyZWF0ZV9hbmRfZ2V0X2Nncm91cFwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIGNsZWFudXA7XG4mIzQzO1x0Y2dfaWQgPSBnZXRfY2dyb3VwX2lkKFRFU1RfQ0dST1VQKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9HVChjZ19pZCwgMFVMTCwgXCYjMzQ7Z2V0X2Nncm91cF9pZFwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIGNsZWFudXA7XG4mIzQzO1xuJiM0MztcdHNrZWwgPSB0aHJlYWRfd3FfY2dyb3VwX19vcGVuX2FuZF9sb2FkKCk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0tfUFRSKHNrZWwsIFwmIzM0O29wZW5fYW5kX2xvYWRcJiMzNDspKVxuJiM0MztcdFx0Z290byBjbGVhbnVwO1xuJiM0MztcbiYjNDM7XHRwcm9nX2ZkID0gYnBmX3Byb2dyYW1fX2ZkKHNrZWwtXHUwMDNlcHJvZ3Muc3RhcnRfdGhyZWFkX3dxKTtcbiYjNDM7XG4mIzQzO1x0LyogUnVuIGJwZl90aHJlYWRfd3EgaW4gdGhlIHNwZWNpZmllZCBjZ3JvdXAuICovXG4mIzQzO1x0c2tlbC1cdTAwM2Vic3MtXHUwMDNldGVzdF9rZXkgPSAwO1xuJiM0MztcdHNrZWwtXHUwMDNlYnNzLVx1MDAzZXRhcmdldF9jZ3JvdXBfaWQgPSBjZ19pZDtcbiYjNDM7XHRza2VsLVx1MDAzZWJzcy1cdTAwM2VjYWxsYmFja19jZ3JvdXBfaWQgPSAwO1xuJiM0MztcdHNrZWwtXHUwMDNlYnNzLVx1MDAzZXR3cV9kb25lID0gMDtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PSyhicGZfcHJvZ190ZXN0X3J1bl9vcHRzKHByb2dfZmQsIFx1MDAyNnRvcHRzKSxcbiYjNDM7XHRcdCAgICAgICBcJiMzNDticGZfcHJvZ190ZXN0X3J1bl9vcHRzIGluIGNncm91cFwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIGNsZWFudXA7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0sodG9wdHMucmV0dmFsLCBcJiMzNDtyZXR2YWwgaW4gY2dyb3VwXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gY2xlYW51cDtcbiYjNDM7XHRmb3IgKHdhaXRlZF9zZWNzID0gMDsgd2FpdGVkX3NlY3MgXHUwMDNjIFdBSVRfVElNRU9VVF9TRUNTOyB3YWl0ZWRfc2VjcyYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdGlmIChza2VsLVx1MDAzZWJzcy1cdTAwM2V0d3FfZG9uZSlcbiYjNDM7XHRcdFx0YnJlYWs7XG4mIzQzO1x0XHRzbGVlcCgxKTtcbiYjNDM7XHR9XG4mIzQzO1x0aWYgKCFBU1NFUlRfVFJVRShza2VsLVx1MDAzZWJzcy1cdTAwM2V0d3FfZG9uZSwgXCYjMzQ7dHdxX2RvbmUgaW4gY2dyb3VwXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gY2xlYW51cDtcbiYjNDM7XHRpZiAoIUFTU0VSVF9FUShza2VsLVx1MDAzZWJzcy1cdTAwM2VjYWxsYmFja19jZ3JvdXBfaWQsIGNnX2lkLFxuJiM0MztcdFx0ICAgICAgIFwmIzM0O2NhbGxiYWNrX2Nncm91cF9pZCBpbiBjZ3JvdXBcJiMzNDspKVxuJiM0MztcdFx0Z290byBjbGVhbnVwO1xuJiM0MztcbiYjNDM7XHQvKiBSdW4gYnBmX3RocmVhZF93cSB3aXRob3V0IGNncm91cCBhdHRhY2htZW50IChjZ3JvdXBfaWQgPSAwKS4gKi9cbiYjNDM7XHRMSUJCUEZfT1BUU19SRVNFVCh0b3B0cyk7XG4mIzQzO1x0c2tlbC1cdTAwM2Vic3MtXHUwMDNldGVzdF9rZXkgPSAxO1xuJiM0MztcdHNrZWwtXHUwMDNlYnNzLVx1MDAzZXRhcmdldF9jZ3JvdXBfaWQgPSAwO1xuJiM0MztcdHNrZWwtXHUwMDNlYnNzLVx1MDAzZWNhbGxiYWNrX2Nncm91cF9pZCA9IDA7XG4mIzQzO1x0c2tlbC1cdTAwM2Vic3MtXHUwMDNldHdxX2RvbmUgPSAwO1xuJiM0MztcdGlmICghQVNTRVJUX09LKGJwZl9wcm9nX3Rlc3RfcnVuX29wdHMocHJvZ19mZCwgXHUwMDI2dG9wdHMpLFxuJiM0MztcdFx0ICAgICAgIFwmIzM0O2JwZl9wcm9nX3Rlc3RfcnVuX29wdHMgd2l0aG91dCBjZ3JvdXBcJiMzNDspKVxuJiM0MztcdFx0Z290byBjbGVhbnVwO1xuJiM0MztcdGlmICghQVNTRVJUX09LKHRvcHRzLnJldHZhbCwgXCYjMzQ7cmV0dmFsIHdpdGhvdXQgY2dyb3VwXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gY2xlYW51cDtcbiYjNDM7XHRmb3IgKHdhaXRlZF9zZWNzID0gMDsgd2FpdGVkX3NlY3MgXHUwMDNjIFdBSVRfVElNRU9VVF9TRUNTOyB3YWl0ZWRfc2VjcyYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdGlmIChza2VsLVx1MDAzZWJzcy1cdTAwM2V0d3FfZG9uZSlcbiYjNDM7XHRcdFx0YnJlYWs7XG4mIzQzO1x0XHRzbGVlcCgxKTtcbiYjNDM7XHR9XG4mIzQzO1x0aWYgKCFBU1NFUlRfVFJVRShza2VsLVx1MDAzZWJzcy1cdTAwM2V0d3FfZG9uZSwgXCYjMzQ7dHdxX2RvbmUgd2l0aG91dCBjZ3JvdXBcJiMzNDspKVxuJiM0MztcdFx0Z290byBjbGVhbnVwO1xuJiM0MztcdGlmICghQVNTRVJUX05FUShza2VsLVx1MDAzZWJzcy1cdTAwM2VjYWxsYmFja19jZ3JvdXBfaWQsIGNnX2lkLFxuJiM0MztcdFx0XHRcJiMzNDtjYWxsYmFja19jZ3JvdXBfaWQgd2l0aG91dCBjZ3JvdXBcJiMzNDspKVxuJiM0MztcdFx0Z290byBjbGVhbnVwO1xuJiM0MztcbiYjNDM7Y2xlYW51cDpcbiYjNDM7XHRpZiAoc2tlbCkge1xuJiM0MztcdFx0dGhyZWFkX3dxX2Nncm91cF9fZGVzdHJveShza2VsKTtcbiYjNDM7XHRcdC8qIFdhaXQgdGhyZWFkX3dxIGt0aHJlYWQgcXVpdC4gKi9cbiYjNDM7XHRcdHNsZWVwKDIpO1xuJiM0MztcdH1cbiYjNDM7XHRpZiAoY2dfZmQgXHUwMDNlPSAwKVxuJiM0MztcdFx0Y2xvc2UoY2dfZmQpO1xuJiM0MztcdGNsZWFudXBfY2dyb3VwX2Vudmlyb25tZW50KCk7XG4mIzQzO31cbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvbWVtY2dfYXN5bmNfcmVjbGFpbS5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL21lbWNnX2FzeW5jX3JlY2xhaW0uY1xubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAuLmVhY2NjOGEzNzM4OGJcbi0tLSAvZGV2L251bGxcbiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9tZW1jZ19hc3luY19yZWNsYWltLmNcbkBAIC0wLDAgJiM0MzsxLDI1NSBAQFxuJiM0MzsvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxuJiM0MztcbiYjNDM7I2luY2x1ZGUgXCYjMzQ7dm1saW51eC5oXCYjMzQ7XG4mIzQzOyNpbmNsdWRlIFwmIzM0O2JwZl9leHBlcmltZW50YWwuaFwmIzM0O1xuJiM0MzsjaW5jbHVkZSBcdTAwM2NicGYvYnBmX2hlbHBlcnMuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NicGYvYnBmX3RyYWNpbmcuaFx1MDAzZVxuJiM0MztcbiYjNDM7I2RlZmluZSBCSVQobnIpXHRcdFx0KDFVTCBcdTAwM2NcdTAwM2MgKG5yKSlcbiYjNDM7XG4mIzQzOyNkZWZpbmUgX19fR0ZQX0lPXHRcdEJJVChfX19HRlBfSU9fQklUKVxuJiM0MzsjZGVmaW5lIF9fX0dGUF9GU1x0XHRCSVQoX19fR0ZQX0ZTX0JJVClcbiYjNDM7I2RlZmluZSBfX19HRlBfRElSRUNUX1JFQ0xBSU1cdEJJVChfX19HRlBfRElSRUNUX1JFQ0xBSU1fQklUKVxuJiM0MzsjZGVmaW5lIF9fX0dGUF9LU1dBUERfUkVDTEFJTVx0QklUKF9fX0dGUF9LU1dBUERfUkVDTEFJTV9CSVQpXG4mIzQzO1xuJiM0MzsjZGVmaW5lIF9fR0ZQX0lPXHRcdCgoZ2ZwX3QpX19fR0ZQX0lPKVxuJiM0MzsjZGVmaW5lIF9fR0ZQX0ZTXHRcdCgoZ2ZwX3QpX19fR0ZQX0ZTKVxuJiM0MzsjZGVmaW5lIF9fR0ZQX0RJUkVDVF9SRUNMQUlNXHQoKGdmcF90KV9fX0dGUF9ESVJFQ1RfUkVDTEFJTSlcbiYjNDM7I2RlZmluZSBfX0dGUF9LU1dBUERfUkVDTEFJTVx0KChnZnBfdClfX19HRlBfS1NXQVBEX1JFQ0xBSU0pXG4mIzQzOyNkZWZpbmUgX19HRlBfUkVDTEFJTVx0KChnZnBfdCkoX19fR0ZQX0RJUkVDVF9SRUNMQUlNIHwgX19fR0ZQX0tTV0FQRF9SRUNMQUlNKSlcbiYjNDM7XG4mIzQzOyNkZWZpbmUgR0ZQX0tFUk5FTFx0KF9fR0ZQX1JFQ0xBSU0gfCBfX0dGUF9JTyB8IF9fR0ZQX0ZTKVxuJiM0MzsjZGVmaW5lIENMT0NLX01PTk9UT05JQ19JRFx0MVxuJiM0MzsjZGVmaW5lIFJFQ0xBSU1fUEFHRVNcdFx0MzJcbiYjNDM7I2RlZmluZSBSRUNMQUlNX01BWF9JVEVSXHQzMlxuJiM0MztcbiYjNDM7c3RydWN0IGJwZl9hcmdzX3Mge1xuJiM0MztcdHU2NCBoaWdoX2Nncm91cF9pZDtcbiYjNDM7XHR1NjQgbG93X2Nncm91cF9pZDtcbiYjNDM7XHR1NjQgZXZlbnRfZGVsdGFfdGhyZXNob2xkO1xuJiM0MztcdHU2NCBjaGVja19ucztcbiYjNDM7fTtcbiYjNDM7XG4mIzQzO3N0cnVjdCBjZ3JvdXBfbWVtY2cge1xuJiM0MztcdHN0cnVjdCBjZ3JvdXAgKmNncnA7XG4mIzQzO1x0c3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnO1xuJiM0Mzt9O1xuJiM0MztcbiYjNDM7c3RhdGljIHU2NCB3cV9oaWdoX2Nncm91cF9pZDtcbiYjNDM7c3RhdGljIHU2NCB3cV9sb3dfY2dyb3VwX2lkO1xuJiM0MztcbiYjNDM7c3RhdGljIGludCBnZXRfY2dyb3VwX21lbWNnX2Zyb21faWQodTY0IGNncm91cF9pZCwgc3RydWN0IGNncm91cF9tZW1jZyAqY20pXG4mIzQzO3tcbiYjNDM7XHRjbS1cdTAwM2VjZ3JwID0gYnBmX2Nncm91cF9mcm9tX2lkKGNncm91cF9pZCk7XG4mIzQzO1x0aWYgKCFjbS1cdTAwM2VjZ3JwKVxuJiM0MztcdFx0cmV0dXJuIC0xO1xuJiM0MztcbiYjNDM7XHRjbS1cdTAwM2VtZW1jZyA9IGJwZl9nZXRfbWVtX2Nncm91cChcdTAwMjZjbS1cdTAwM2VjZ3JwLVx1MDAzZXNlbGYpO1xuJiM0MztcdGlmICghY20tXHUwMDNlbWVtY2cpIHtcbiYjNDM7XHRcdGJwZl9jZ3JvdXBfcmVsZWFzZShjbS1cdTAwM2VjZ3JwKTtcbiYjNDM7XHRcdHJldHVybiAtMTtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdHJldHVybiAwO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgdm9pZCBwdXRfY2dyb3VwX21lbWNnKHN0cnVjdCBjZ3JvdXBfbWVtY2cgKmNtKVxuJiM0Mzt7XG4mIzQzO1x0YnBmX3B1dF9tZW1fY2dyb3VwKGNtLVx1MDAzZW1lbWNnKTtcbiYjNDM7XHRicGZfY2dyb3VwX3JlbGVhc2UoY20tXHUwMDNlY2dycCk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBpbnQgZ2V0X2Nncm91cF9ldmVudCh1NjQgY2dyb3VwX2lkLCB1NjQgKnZhbClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBjZ3JvdXBfbWVtY2cgY207XG4mIzQzO1xuJiM0MztcdGlmIChnZXRfY2dyb3VwX21lbWNnX2Zyb21faWQoY2dyb3VwX2lkLCBcdTAwMjZjbSkpXG4mIzQzO1x0XHRyZXR1cm4gLTE7XG4mIzQzO1x0YnBmX21lbV9jZ3JvdXBfZmx1c2hfc3RhdHMoY20ubWVtY2cpO1xuJiM0MztcdCp2YWwgPSBicGZfbWVtX2Nncm91cF9wYWdlX3N0YXRlKGNtLm1lbWNnLCBXT1JLSU5HU0VUX1JFRkFVTFRfRklMRSk7XG4mIzQzO1x0cHV0X2Nncm91cF9tZW1jZyhcdTAwMjZjbSk7XG4mIzQzO1xuJiM0MztcdHJldHVybiAwO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgYm9vbFxuJiM0MztzaG91bGRfcmVjbGFpbV9jZ3JvdXAodTY0IGNncm91cF9pZCwgdTY0ICpwcmV2X2V2ZW50LCB1NjQgZXZlbnRfZGVsdGFfdGhyZXNob2xkKVxuJiM0Mzt7XG4mIzQzO1x0dTY0IGN1ciwgZGVsdGE7XG4mIzQzO1xuJiM0MztcdGlmIChnZXRfY2dyb3VwX2V2ZW50KGNncm91cF9pZCwgXHUwMDI2Y3VyKSlcbiYjNDM7XHRcdHJldHVybiBmYWxzZTtcbiYjNDM7XG4mIzQzO1x0ZGVsdGEgPSBjdXIgLSAqcHJldl9ldmVudDtcbiYjNDM7XHQqcHJldl9ldmVudCA9IGN1cjtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIGRlbHRhIFx1MDAzZT0gZXZlbnRfZGVsdGFfdGhyZXNob2xkO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgaW50IHJlY2xhaW1fY2dyb3VwKHU2NCBjZ3JvdXBfaWQpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgY2dyb3VwX21lbWNnIGNtO1xuJiM0MztcdGludCBpO1xuJiM0MztcbiYjNDM7XHRpZiAoZ2V0X2Nncm91cF9tZW1jZ19mcm9tX2lkKGNncm91cF9pZCwgXHUwMDI2Y20pKVxuJiM0MztcdFx0cmV0dXJuIDA7XG4mIzQzO1xuJiM0MztcdGZvciAoaSA9IDA7IGkgXHUwMDNjIFJFQ0xBSU1fTUFYX0lURVI7IGkmIzQzOyYjNDM7KSB7XG4mIzQzO1x0XHRpZiAoIWJwZl90cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKGNtLm1lbWNnLCBSRUNMQUlNX1BBR0VTLFxuJiM0MztcdFx0XHRcdFx0XHQgICAgICBHRlBfS0VSTkVMLCAwLCAtMSkpXG4mIzQzO1x0XHRcdGJyZWFrO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0cHV0X2Nncm91cF9tZW1jZyhcdTAwMjZjbSk7XG4mIzQzO1xuJiM0MztcdHJldHVybiAwO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdHJ1Y3Qgd3FfZWxlbSB7XG4mIzQzO1x0c3RydWN0IGJwZl90aW1lciB0aW1lcjtcbiYjNDM7XHRzdHJ1Y3QgYnBmX3dxIHdvcms7XG4mIzQzO1x0dTY0IHByZXZfZXZlbnQ7XG4mIzQzO1x0dTY0IGV2ZW50X2RlbHRhX3RocmVzaG9sZDtcbiYjNDM7XHR1NjQgY2hlY2tfbnM7XG4mIzQzO307XG4mIzQzO1xuJiM0MztzdHJ1Y3Qge1xuJiM0MztcdF9fdWludCh0eXBlLCBCUEZfTUFQX1RZUEVfQVJSQVkpO1xuJiM0MztcdF9fdWludChtYXhfZW50cmllcywgMSk7XG4mIzQzO1x0X190eXBlKGtleSwgX191MzIpO1xuJiM0MztcdF9fdHlwZSh2YWx1ZSwgc3RydWN0IHdxX2VsZW0pO1xuJiM0Mzt9IHdxX21hcCBTRUMoXCYjMzQ7Lm1hcHNcJiMzNDspO1xuJiM0MztcbiYjNDM7c3RhdGljIGludCBhc3luY19mcmVlKHZvaWQgKm1hcCwgaW50ICprZXksIHZvaWQgKnZhbHVlKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IHdxX2VsZW0gKmVsZW0gPSB2YWx1ZTtcbiYjNDM7XG4mIzQzO1x0aWYgKHNob3VsZF9yZWNsYWltX2Nncm91cCh3cV9oaWdoX2Nncm91cF9pZCwgXHUwMDI2ZWxlbS1cdTAwM2VwcmV2X2V2ZW50LFxuJiM0MztcdFx0ZWxlbS1cdTAwM2VldmVudF9kZWx0YV90aHJlc2hvbGQpKSB7XG4mIzQzO1x0XHRyZWNsYWltX2Nncm91cCh3cV9sb3dfY2dyb3VwX2lkKTtcbiYjNDM7XHRcdGJwZl93cV9zdGFydChcdTAwMjZlbGVtLVx1MDAzZXdvcmssIDApO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0cmV0dXJuIDA7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBpbnQgd3FfdGltZXJfY2Iodm9pZCAqbWFwLCBpbnQgKmtleSwgc3RydWN0IHdxX2VsZW0gKmVsZW0pXG4mIzQzO3tcbiYjNDM7XHRicGZfd3Ffc3RhcnQoXHUwMDI2ZWxlbS1cdTAwM2V3b3JrLCAwKTtcbiYjNDM7XHRicGZfdGltZXJfc3RhcnQoXHUwMDI2ZWxlbS1cdTAwM2V0aW1lciwgZWxlbS1cdTAwM2VjaGVja19ucywgMCk7XG4mIzQzO1xuJiM0MztcdHJldHVybiAwO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztTRUMoXCYjMzQ7c3lzY2FsbFwmIzM0OylcbiYjNDM7aW50IHdxX3Byb2dfaW5pdChzdHJ1Y3QgYnBmX2FyZ3NfcyAqY3R4KVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IHdxX2VsZW0gKmVsZW07XG4mIzQzO1x0X191MzIga2V5ID0gMDtcbiYjNDM7XHRpbnQgcmV0O1xuJiM0MztcbiYjNDM7XHRlbGVtID0gYnBmX21hcF9sb29rdXBfZWxlbShcdTAwMjZ3cV9tYXAsIFx1MDAyNmtleSk7XG4mIzQzO1x0aWYgKCFlbGVtKVxuJiM0MztcdFx0cmV0dXJuIC0xO1xuJiM0MztcbiYjNDM7XHRyZXQgPSBicGZfd3FfaW5pdChcdTAwMjZlbGVtLVx1MDAzZXdvcmssIFx1MDAyNndxX21hcCwgMCk7XG4mIzQzO1x0aWYgKHJldClcbiYjNDM7XHRcdHJldHVybiByZXQ7XG4mIzQzO1xuJiM0MztcdHJldCA9IGJwZl93cV9zZXRfY2FsbGJhY2soXHUwMDI2ZWxlbS1cdTAwM2V3b3JrLCBhc3luY19mcmVlLCAwKTtcbiYjNDM7XHRpZiAocmV0KVxuJiM0MztcdFx0cmV0dXJuIHJldDtcbiYjNDM7XG4mIzQzO1x0cmV0ID0gYnBmX3RpbWVyX2luaXQoXHUwMDI2ZWxlbS1cdTAwM2V0aW1lciwgXHUwMDI2d3FfbWFwLCBDTE9DS19NT05PVE9OSUNfSUQpO1xuJiM0MztcdGlmIChyZXQpXG4mIzQzO1x0XHRyZXR1cm4gcmV0O1xuJiM0MztcbiYjNDM7XHRyZXQgPSBicGZfdGltZXJfc2V0X2NhbGxiYWNrKFx1MDAyNmVsZW0tXHUwMDNldGltZXIsIHdxX3RpbWVyX2NiKTtcbiYjNDM7XHRpZiAocmV0KVxuJiM0MztcdFx0cmV0dXJuIHJldDtcbiYjNDM7XG4mIzQzO1x0ZWxlbS1cdTAwM2VwcmV2X2V2ZW50ID0gMDtcbiYjNDM7XHRlbGVtLVx1MDAzZWV2ZW50X2RlbHRhX3RocmVzaG9sZCA9IGN0eC1cdTAwM2VldmVudF9kZWx0YV90aHJlc2hvbGQ7XG4mIzQzO1x0ZWxlbS1cdTAwM2VjaGVja19ucyA9IGN0eC1cdTAwM2VjaGVja19ucztcbiYjNDM7XG4mIzQzO1x0d3FfaGlnaF9jZ3JvdXBfaWQgPSBjdHgtXHUwMDNlaGlnaF9jZ3JvdXBfaWQ7XG4mIzQzO1x0d3FfbG93X2Nncm91cF9pZCA9IGN0eC1cdTAwM2Vsb3dfY2dyb3VwX2lkO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gYnBmX3RpbWVyX3N0YXJ0KFx1MDAyNmVsZW0tXHUwMDNldGltZXIsIGVsZW0tXHUwMDNlY2hlY2tfbnMsIDApO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdHJ1Y3QgdGhyZWFkX3dxX2VsZW0ge1xuJiM0MztcdHN0cnVjdCBicGZfdGltZXIgdGltZXI7XG4mIzQzO1x0c3RydWN0IGJwZl90aHJlYWRfd3Egd29yaztcbiYjNDM7XHR1NjQgcHJldl9ldmVudDtcbiYjNDM7XHR1NjQgZXZlbnRfZGVsdGFfdGhyZXNob2xkO1xuJiM0MztcdHU2NCBjaGVja19ucztcbiYjNDM7fTtcbiYjNDM7XG4mIzQzO3N0cnVjdCB7XG4mIzQzO1x0X191aW50KHR5cGUsIEJQRl9NQVBfVFlQRV9BUlJBWSk7XG4mIzQzO1x0X191aW50KG1heF9lbnRyaWVzLCAxKTtcbiYjNDM7XHRfX3R5cGUoa2V5LCBfX3UzMik7XG4mIzQzO1x0X190eXBlKHZhbHVlLCBzdHJ1Y3QgdGhyZWFkX3dxX2VsZW0pO1xuJiM0Mzt9IHRocmVhZF93cV9tYXAgU0VDKFwmIzM0Oy5tYXBzXCYjMzQ7KTtcbiYjNDM7XG4mIzQzO3N0YXRpYyBpbnQgdGhyZWFkX2FzeW5jX2ZyZWUodm9pZCAqbWFwLCBpbnQgKmtleSwgdm9pZCAqdmFsdWUpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgdGhyZWFkX3dxX2VsZW0gKmVsZW0gPSB2YWx1ZTtcbiYjNDM7XG4mIzQzO1x0aWYgKHNob3VsZF9yZWNsYWltX2Nncm91cCh3cV9oaWdoX2Nncm91cF9pZCwgXHUwMDI2ZWxlbS1cdTAwM2VwcmV2X2V2ZW50LFxuJiM0MztcdFx0ZWxlbS1cdTAwM2VldmVudF9kZWx0YV90aHJlc2hvbGQpKSB7XG4mIzQzO1x0XHRyZWNsYWltX2Nncm91cCh3cV9sb3dfY2dyb3VwX2lkKTtcbiYjNDM7XHRcdGJwZl90aHJlYWRfd3Ffc3RhcnQoXHUwMDI2ZWxlbS1cdTAwM2V3b3JrLCAwKTtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdHJldHVybiAwO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgaW50IHRocmVhZF93cV90aW1lcl9jYih2b2lkICptYXAsIGludCAqa2V5LCBzdHJ1Y3QgdGhyZWFkX3dxX2VsZW0gKmVsZW0pXG4mIzQzO3tcbiYjNDM7XHRicGZfdGhyZWFkX3dxX3N0YXJ0KFx1MDAyNmVsZW0tXHUwMDNld29yaywgMCk7XG4mIzQzO1x0YnBmX3RpbWVyX3N0YXJ0KFx1MDAyNmVsZW0tXHUwMDNldGltZXIsIGVsZW0tXHUwMDNlY2hlY2tfbnMsIDApO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7U0VDKFwmIzM0O3N5c2NhbGxcJiMzNDspXG4mIzQzO2ludCB0aHJlYWRfd3FfcHJvZ19pbml0KHN0cnVjdCBicGZfYXJnc19zICpjdHgpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgdGhyZWFkX3dxX2VsZW0gKmVsZW07XG4mIzQzO1x0X191MzIga2V5ID0gMDtcbiYjNDM7XHRpbnQgcmV0O1xuJiM0MztcbiYjNDM7XHRlbGVtID0gYnBmX21hcF9sb29rdXBfZWxlbShcdTAwMjZ0aHJlYWRfd3FfbWFwLCBcdTAwMjZrZXkpO1xuJiM0MztcdGlmICghZWxlbSlcbiYjNDM7XHRcdHJldHVybiAtMTtcbiYjNDM7XG4mIzQzO1x0cmV0ID0gYnBmX3RocmVhZF93cV9pbml0KFx1MDAyNmVsZW0tXHUwMDNld29yaywgXHUwMDI2dGhyZWFkX3dxX21hcCxcbiYjNDM7XHRcdFx0XHQgY3R4LVx1MDAzZWxvd19jZ3JvdXBfaWQsIDApO1xuJiM0MztcdGlmIChyZXQpXG4mIzQzO1x0XHRyZXR1cm4gcmV0O1xuJiM0MztcbiYjNDM7XHRyZXQgPSBicGZfdGhyZWFkX3dxX3NldF9jYWxsYmFjayhcdTAwMjZlbGVtLVx1MDAzZXdvcmssIHRocmVhZF9hc3luY19mcmVlLCAwKTtcbiYjNDM7XHRpZiAocmV0KVxuJiM0MztcdFx0cmV0dXJuIHJldDtcbiYjNDM7XG4mIzQzO1x0cmV0ID0gYnBmX3RpbWVyX2luaXQoXHUwMDI2ZWxlbS1cdTAwM2V0aW1lciwgXHUwMDI2dGhyZWFkX3dxX21hcCwgQ0xPQ0tfTU9OT1RPTklDX0lEKTtcbiYjNDM7XHRpZiAocmV0KVxuJiM0MztcdFx0cmV0dXJuIHJldDtcbiYjNDM7XG4mIzQzO1x0cmV0ID0gYnBmX3RpbWVyX3NldF9jYWxsYmFjayhcdTAwMjZlbGVtLVx1MDAzZXRpbWVyLCB0aHJlYWRfd3FfdGltZXJfY2IpO1xuJiM0MztcdGlmIChyZXQpXG4mIzQzO1x0XHRyZXR1cm4gcmV0O1xuJiM0MztcbiYjNDM7XHRlbGVtLVx1MDAzZXByZXZfZXZlbnQgPSAwO1xuJiM0MztcdGVsZW0tXHUwMDNlZXZlbnRfZGVsdGFfdGhyZXNob2xkID0gY3R4LVx1MDAzZWV2ZW50X2RlbHRhX3RocmVzaG9sZDtcbiYjNDM7XHRlbGVtLVx1MDAzZWNoZWNrX25zID0gY3R4LVx1MDAzZWNoZWNrX25zO1xuJiM0MztcbiYjNDM7XHR3cV9oaWdoX2Nncm91cF9pZCA9IGN0eC1cdTAwM2VoaWdoX2Nncm91cF9pZDtcbiYjNDM7XHR3cV9sb3dfY2dyb3VwX2lkID0gY3R4LVx1MDAzZWxvd19jZ3JvdXBfaWQ7XG4mIzQzO1xuJiM0MztcdHJldHVybiBicGZfdGltZXJfc3RhcnQoXHUwMDI2ZWxlbS1cdTAwM2V0aW1lciwgZWxlbS1cdTAwM2VjaGVja19ucywgMCk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO2NoYXIgTElDRU5TRVtdIFNFQyhcJiMzNDtsaWNlbnNlXCYjMzQ7KSA9IFwmIzM0O0dQTFwmIzM0OztcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvdGhyZWFkX3dxX2Nncm91cC5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL3RocmVhZF93cV9jZ3JvdXAuY1xubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAuLmM3MGEzN2Y1NTM5N2Rcbi0tLSAvZGV2L251bGxcbiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy90aHJlYWRfd3FfY2dyb3VwLmNcbkBAIC0wLDAgJiM0MzsxLDU2IEBAXG4mIzQzOy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXG4mIzQzOy8qIENvcHlyaWdodCAoYykgMjAyNiAqL1xuJiM0MztcbiYjNDM7I2luY2x1ZGUgXCYjMzQ7YnBmX2V4cGVyaW1lbnRhbC5oXCYjMzQ7XG4mIzQzOyNpbmNsdWRlIFx1MDAzY2JwZi9icGZfaGVscGVycy5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFwmIzM0O2JwZl9taXNjLmhcJiMzNDtcbiYjNDM7XG4mIzQzO2NoYXIgX2xpY2Vuc2VbXSBTRUMoXCYjMzQ7bGljZW5zZVwmIzM0OykgPSBcJiMzNDtHUExcJiMzNDs7XG4mIzQzO1xuJiM0MztzdHJ1Y3QgZWxlbSB7XG4mIzQzO1x0c3RydWN0IGJwZl90aHJlYWRfd3EgdHdxO1xuJiM0Mzt9O1xuJiM0MztcbiYjNDM7c3RydWN0IHtcbiYjNDM7XHRfX3VpbnQodHlwZSwgQlBGX01BUF9UWVBFX0FSUkFZKTtcbiYjNDM7XHRfX3VpbnQobWF4X2VudHJpZXMsIDIpO1xuJiM0MztcdF9fdHlwZShrZXksIGludCk7XG4mIzQzO1x0X190eXBlKHZhbHVlLCBzdHJ1Y3QgZWxlbSk7XG4mIzQzO30gbWFwX2FyciBTRUMoXCYjMzQ7Lm1hcHNcJiMzNDspO1xuJiM0MztcbiYjNDM7X191NjQgdGFyZ2V0X2Nncm91cF9pZDtcbiYjNDM7X191NjQgY2FsbGJhY2tfY2dyb3VwX2lkO1xuJiM0MztpbnQgdHdxX2RvbmU7XG4mIzQzO2ludCB0ZXN0X2tleTtcbiYjNDM7XG4mIzQzO3N0YXRpYyBpbnQgdHdxX2NhbGxiYWNrKHZvaWQgKm1hcCwgaW50ICprZXksIHZvaWQgKnZhbHVlKVxuJiM0Mzt7XG4mIzQzO1x0Y2FsbGJhY2tfY2dyb3VwX2lkID0gYnBmX2dldF9jdXJyZW50X2Nncm91cF9pZCgpO1xuJiM0MztcdHR3cV9kb25lID0gMTtcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7U0VDKFwmIzM0O3N5c2NhbGxcJiMzNDspXG4mIzQzO2ludCBzdGFydF90aHJlYWRfd3Eodm9pZCAqY3R4KVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IGVsZW0gKnZhbDtcbiYjNDM7XHRpbnQga2V5ID0gdGVzdF9rZXk7XG4mIzQzO1x0aW50IHJldDtcbiYjNDM7XG4mIzQzO1x0dmFsID0gYnBmX21hcF9sb29rdXBfZWxlbShcdTAwMjZtYXBfYXJyLCBcdTAwMjZrZXkpO1xuJiM0MztcdGlmICghdmFsKVxuJiM0MztcdFx0cmV0dXJuIC0xO1xuJiM0MztcbiYjNDM7XHRyZXQgPSBicGZfdGhyZWFkX3dxX2luaXQoXHUwMDI2dmFsLVx1MDAzZXR3cSwgXHUwMDI2bWFwX2FyciwgdGFyZ2V0X2Nncm91cF9pZCwgMCk7XG4mIzQzO1x0aWYgKHJldClcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcbiYjNDM7XHRyZXQgPSBicGZfdGhyZWFkX3dxX3NldF9jYWxsYmFjayhcdTAwMjZ2YWwtXHUwMDNldHdxLCB0d3FfY2FsbGJhY2ssIDApO1xuJiM0MztcdGlmIChyZXQpXG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XG4mIzQzO1x0cmV0ID0gYnBmX3RocmVhZF93cV9zdGFydChcdTAwMjZ2YWwtXHUwMDNldHdxLCAwKTtcbiYjNDM7XG4mIzQzO291dDpcbiYjNDM7XHRyZXR1cm4gcmV0O1xuJiM0Mzt9XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Mi8xPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDcgMDg6NTA8L3RkPgoJCQk8dGQ+YWdlbnQ8L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+YmVzdC1leHBlbnNpdmU8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O01FTUNHJiMzNDssCiAgICAmIzM0O0NHUk9VUFMmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDticGZfdGhyZWFkX3dxX2luaXQmIzM0OywKICAgICYjMzQ7YnBmX3RocmVhZF93cV9zZXRfY2FsbGJhY2smIzM0OywKICAgICYjMzQ7YnBmX3RocmVhZF93cV9zdGFydCYjMzQ7LAogICAgJiMzNDticGZfdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcyYjMzQ7LAogICAgJiMzNDtjZ3JvdXBfa3RocmVhZF9hdHRhY2gmIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggaW50cm9kdWNlcyBhIG5ldyBCUEYgdGhyZWFkIHdvcmtxdWV1ZSBmZWF0dXJlIChgYnBmX3RocmVhZF93cWApIHRoYXQgYWxsb3dzIEJQRiBwcm9ncmFtcyB0byBzY2hlZHVsZSB3b3JrIGluIGEga3RocmVhZCBjb250ZXh0LCBvcHRpb25hbGx5IGF0dGFjaGVkIHRvIGEgY2dyb3VwLiBJdCBhbHNvIGFkZHMgYSBuZXcgQlBGIGtmdW5jIGBicGZfdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlc2AgZm9yIG1lbW9yeSBjZ3JvdXAgcmVjbGFpbS4gVGhlc2UgYXJlIGZ1bmN0aW9uYWwgY2hhbmdlcyB0byB0aGUgY29yZSBCUEYgYW5kIG1lbW9yeSBjb250cm9sIHN1YnN5c3RlbXMsIHJlYWNoYWJsZSBmcm9tIHVzZXJzcGFjZSB2aWEgQlBGIHByb2dyYW1zLCBhbmQgc2hvdWxkIGJlIGZ1enplZC4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPkluc3RydWN0aW9uOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+WW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIG1haW50YWluZXIuCllvdXIgam9iIGlzIHRvIHJldmlldyBhIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQgZGV0ZXJtaW5lCmlmIGl0IG1ha2VzIGZ1bmN0aW9uYWwgY2hhbmdlcyB0byB0aGUga2VybmVsIHRoYXQgc2hvdWxkIGJlIGZ1enplZC4KCklNUE9SVEFOVDogVGhlIGNoYW5nZXMgaGF2ZSBBTFJFQURZIGJlZW4gYXBwbGllZCBhbmQgY29tbWl0dGVkIGFzIHRoZSBIRUFEIGNvbW1pdCBpbgp5b3VyIHdvcmtzcGFjZS4gRG8gTk9UIHJlbHkgb24geW91ciBpbnRlcm5hbCBrbm93bGVkZ2Ugb2YgdGhlIGtlcm5lbC4gWW91IG11c3QgYWN0aXZlbHkKdXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gZXhhbWluZSB0aGUgYWN0dWFsIHNvdXJjZSBjb2RlIGFuZCBjb25maXJtIGFueSBhc3N1bXB0aW9ucy4KClJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgaWYgdGhlIHBhdGNoIG9ubHkgY29udGFpbnM6Ci0gTW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLywgS2NvbmZpZyBmaWxlcywgb3IgY29kZSBjb21tZW50cy4KLSBQdXJlbHkgZGVjb3JhdGl2ZSBjaGFuZ2VzLCBzdWNoIGFzIGxvZ2dpbmcgKGUuZy4sIHByX2VyciwgcHJpbnRrKSBvciB0cmFjZXBvaW50cy4KLSBDaGFuZ2VzIHRvIG51bWVyaWMgY29uc3RhbnRzIG9yIG1hY3JvcyB0aGF0IGRvIG5vdCBmdW5jdGlvbmFsbHkgYWx0ZXIgZXhlY3V0aW9uIGZsb3cuCi0gQ29kZSBwYXRocyB0aGF0IGFyZSBpbXBvc3NpYmxlIHRvIHJlYWNoIGluIHZpcnR1YWxpemVkIGVudmlyb25tZW50cyBsaWtlIEdDRSBvciBRRU1VLAogIGV2ZW4gd2hlbiB1dGlsaXppbmcgc29mdHdhcmUtZW11bGF0ZWQgaGFyZHdhcmUgKGUuZy4sIHVzYiBnYWRnZXQsIG1hYzgwMjExX2h3c2ltKS4KLSBDb2RlIGluIHZlbmRvci1zcGVjaWZpYyBQQ0llIHN3aXRjaCwgU21hcnROSUMsIG9yIEdQVSBkcml2ZXJzIChlLmcuLCBtbHhzdywgcGRzX2NvcmUsIHFlZCwKICBpb25pYywgYW1kZ3B1KSB0aGF0IHJlcXVpcmUgcGh5c2ljYWwgUENJZSBoYXJkd2FyZSBjYXJkcyBub3QgZW11bGF0ZWQgaW4gc3RhbmRhcmQgUUVNVS4KLSBEcml2ZXIgLnJlbW92ZSwgLnNodXRkb3duLCBvciBwY2lfdW5yZWdpc3Rlcl9kcml2ZXIgdGVhcmRvd24gY2FsbGJhY2tzIChlLmcuLCBpZ2JfcmVtb3ZlKQogIHRoYXQgYXJlIGV4ZWN1dGVkIG9ubHkgZHVyaW5nIFBDSSBob3QtdW5wbHVnIG9yIHN5c2ZzIGRyaXZlciB1bmJpbmQgb3BlcmF0aW9ucy4KCklmIGl0IG1vZGlmaWVzIHJlYWNoYWJsZSBjb3JlIGtlcm5lbCBsb2dpYywgZHJpdmVycywgb3IgYXJjaGl0ZWN0dXJlcywgdXNlIHlvdXIgY29kZSBzZWFyY2gKdG9vbHMgdG8gdmVyaWZ5IHRoZSBjb2RlIGNhbiBiZSBleGVjdXRlZCwgdGhlbiByZXR1cm4gV29ydGhGdXp6aW5nPXRydWUuCgpXaGVuIHJldHVybmluZyBXb3J0aEZ1enppbmc9dHJ1ZSwgeW91IE1VU1QgQUxTTzoKMS4gRXh0cmFjdCBhbnkgc3BlY2lmaWMga2VybmVsIGZ1bmN0aW9ucyB0aGF0IHNob3VsZCBiZSBoZWF2aWx5IGZ1enplZCBpbnRvIEZvY3VzU3ltYm9scy4KICAgQXZvaWQgbGlzdGluZyBnZW5lcmljIGhvdC1wYXRoIGZ1bmN0aW9ucyB0byBwcmV2ZW50IHNrZXdlZCB0ZXN0IGRpc3RyaWJ1dGlvbnMuCiAgIFByZWZlciBub24tc3RhdGljLCBub24taW5saW5lZCBBUEkgZW50cnlwb2ludCBmdW5jdGlvbnMgb3ZlciBpbnRlcm5hbCBzdGF0aWMgaGVscGVyIGZ1bmN0aW9ucwogICAod2hpY2ggYXJlIGlubGluZWQgYnkgdGhlIGNvbXBpbGVyIGFuZCBkbyBub3QgaGF2ZSBkaXN0aW5jdCBzeW1ib2wgYWRkcmVzc2VzKS4KMi4gSWRlbnRpZnkgYW55IHNwZWNpZmljIENPTkZJR18gb3B0aW9ucyByZXF1aXJlZCB0byBwcm9wZXJseSB0ZXN0IHRoaXMgbmV3L21vZGlmaWVkIGZlYXR1cmUuCiAgIEdvIGFuZCBsb29rIGludG8gdGhlIEtjb25maWcgZmlsZXMgYW5kIGNoZWNrIGZvciBpZmRlZnMgYXJvdW5kIHRoZSBjb2RlLCBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy4KICAgQWxzbyBjaGVjayAmIzM0O2RlcGVuZHMgb24mIzM0OyBsaW5lcyBpbiBLY29uZmlnIHRvIGluY2x1ZGUgYW55IG5vbi1zdGFuZGFyZCBwYXJlbnQgc3Vic3lzdGVtIGNvbmZpZ3MKICAgbmVlZGVkIGZvciBLYnVpbGQgdG8gY29tcGlsZSB0aGUgY29kZSBzdGF0aWNhbGx5IGludG8gdm1saW51eC4gTGlzdCB0aGVtIGluIHRoZSBFbmFibGVDb25maWdzCiAgIG91dHB1dCBhcnJheSwgYW5kIERPIE5PVCBhZGQgYSAmIzM5O0NPTkZJR18mIzM5OyBwcmVmaXggKGUuZy4sIHJldHVybiAmIzM0O05FVF9JUFY0JiMzNDsgaW5zdGVhZCBvZiAmIzM0O0NPTkZJR19ORVRfSVBWNCYjMzQ7KS4KUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuCgoKVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy4KSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuCklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC4KPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Qcm9tcHQ6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Gb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczoKY29tbWl0IGU3MmUyYzAwOGM5NTFmYTVkMDdhYmFhZDlkMzJlODc3ODc5ZTJlYTcKQXV0aG9yOiBzeXotY2x1c3RlciAmbHQ7dHJpYWdlQHN5emthbGxlci5jb20mZ3Q7CkRhdGU6ICAgRnJpIEF1ZyA3IDA4OjUwOjQwIDIwMjYgJiM0MzswMDAwCgogICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3CgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9icGYuaCBiL2luY2x1ZGUvbGludXgvYnBmLmgKaW5kZXggNzNiYWNmYzY0NDRkZi4uZDYzY2U4MzE5ODY5NiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9icGYuaAomIzQzOyYjNDM7JiM0MzsgYi9pbmNsdWRlL2xpbnV4L2JwZi5oCkBAIC0yMTMsNiAmIzQzOzIxMyw3IEBAIGVudW0gYnRmX2ZpZWxkX3R5cGUgewogCUJQRl9VUFRSICAgICAgID0gKDEgJmx0OyZsdDsgMTEpLAogCUJQRl9SRVNfU1BJTl9MT0NLID0gKDEgJmx0OyZsdDsgMTIpLAogCUJQRl9UQVNLX1dPUksgID0gKDEgJmx0OyZsdDsgMTMpLAomIzQzOwlCUEZfVEhSRUFEX1dRICA9ICgxICZsdDsmbHQ7IDE0KSwKIH07CiAKIGVudW0gYnBmX2Nncm91cF9zdG9yYWdlX3R5cGUgewpAQCAtMjY3LDYgJiM0MzsyNjgsNyBAQCBzdHJ1Y3QgYnRmX3JlY29yZCB7CiAJaW50IHdxX29mZjsKIAlpbnQgcmVmY291bnRfb2ZmOwogCWludCB0YXNrX3dvcmtfb2ZmOwomIzQzOwlpbnQgdGhyZWFkX3dxX29mZjsKIAlzdHJ1Y3QgYnRmX2ZpZWxkIGZpZWxkc1tdOwogfTsKIApAQCAtMzcyLDYgJiM0MzszNzQsOCBAQCBzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIgKmJ0Zl9maWVsZF90eXBlX25hbWUoZW51bSBidGZfZmllbGRfdHlwZSB0eXBlKQogCQlyZXR1cm4gJiMzNDticGZfcmVmY291bnQmIzM0OzsKIAljYXNlIEJQRl9UQVNLX1dPUks6CiAJCXJldHVybiAmIzM0O2JwZl90YXNrX3dvcmsmIzM0OzsKJiM0MzsJY2FzZSBCUEZfVEhSRUFEX1dROgomIzQzOwkJcmV0dXJuICYjMzQ7YnBmX3RocmVhZF93cSYjMzQ7OwogCWRlZmF1bHQ6CiAJCVdBUk5fT05fT05DRSgxKTsKIAkJcmV0dXJuICYjMzQ7dW5rbm93biYjMzQ7OwpAQCAtNDEyLDYgJiM0Mzs0MTYsOCBAQCBzdGF0aWMgaW5saW5lIHUzMiBidGZfZmllbGRfdHlwZV9zaXplKGVudW0gYnRmX2ZpZWxkX3R5cGUgdHlwZSkKIAkJcmV0dXJuIHNpemVvZihzdHJ1Y3QgYnBmX3JlZmNvdW50KTsKIAljYXNlIEJQRl9UQVNLX1dPUks6CiAJCXJldHVybiBzaXplb2Yoc3RydWN0IGJwZl90YXNrX3dvcmspOwomIzQzOwljYXNlIEJQRl9USFJFQURfV1E6CiYjNDM7CQlyZXR1cm4gc2l6ZW9mKHN0cnVjdCBicGZfdGhyZWFkX3dxKTsKIAlkZWZhdWx0OgogCQlXQVJOX09OX09OQ0UoMSk7CiAJCXJldHVybiAwOwpAQCAtNDQ2LDYgJiM0Mzs0NTIsOCBAQCBzdGF0aWMgaW5saW5lIHUzMiBidGZfZmllbGRfdHlwZV9hbGlnbihlbnVtIGJ0Zl9maWVsZF90eXBlIHR5cGUpCiAJCXJldHVybiBfX2FsaWdub2ZfXyhzdHJ1Y3QgYnBmX3JlZmNvdW50KTsKIAljYXNlIEJQRl9UQVNLX1dPUks6CiAJCXJldHVybiBfX2FsaWdub2ZfXyhzdHJ1Y3QgYnBmX3Rhc2tfd29yayk7CiYjNDM7CWNhc2UgQlBGX1RIUkVBRF9XUToKJiM0MzsJCXJldHVybiBfX2FsaWdub2ZfXyhzdHJ1Y3QgYnBmX3RocmVhZF93cSk7CiAJZGVmYXVsdDoKIAkJV0FSTl9PTl9PTkNFKDEpOwogCQlyZXR1cm4gMDsKQEAgLTQ3OCw2ICYjNDM7NDg2LDcgQEAgc3RhdGljIGlubGluZSB2b2lkIGJwZl9vYmpfaW5pdF9maWVsZChjb25zdCBzdHJ1Y3QgYnRmX2ZpZWxkICpmaWVsZCwgdm9pZCAqYWRkcikKIAljYXNlIEJQRl9LUFRSX1BFUkNQVToKIAljYXNlIEJQRl9VUFRSOgogCWNhc2UgQlBGX1RBU0tfV09SSzoKJiM0MzsJY2FzZSBCUEZfVEhSRUFEX1dROgogCQlicmVhazsKIAlkZWZhdWx0OgogCQlXQVJOX09OX09OQ0UoMSk7CkBAIC01MDIsNiAmIzQzOzUxMSw3IEBAIHN0YXRpYyBpbmxpbmUgYm9vbCBidGZfZmllbGRfaXNfbm1pX3NhZmUoZW51bSBidGZfZmllbGRfdHlwZSB0eXBlKQogCWNhc2UgQlBGX1RBU0tfV09SSzoKIAljYXNlIEJQRl9LUFRSX1VOUkVGOgogCWNhc2UgQlBGX1JFRkNPVU5UOgomIzQzOwljYXNlIEJQRl9USFJFQURfV1E6CiAJCXJldHVybiB0cnVlOwogCWRlZmF1bHQ6CiAJCXJldHVybiBmYWxzZTsKQEAgLTY0NCw2ICYjNDM7NjU0LDcgQEAgdm9pZCBjb3B5X21hcF92YWx1ZV9sb2NrZWQoc3RydWN0IGJwZl9tYXAgKm1hcCwgdm9pZCAqZHN0LCB2b2lkICpzcmMsCiB2b2lkIGJwZl90aW1lcl9jYW5jZWxfYW5kX2ZyZWUodm9pZCAqdGltZXIpOwogdm9pZCBicGZfd3FfY2FuY2VsX2FuZF9mcmVlKHZvaWQgKnRpbWVyKTsKIHZvaWQgYnBmX3Rhc2tfd29ya19jYW5jZWxfYW5kX2ZyZWUodm9pZCAqdGltZXIpOwomIzQzO3ZvaWQgYnBmX3RocmVhZF93cV9jYW5jZWxfYW5kX2ZyZWUodm9pZCAqdmFsKTsKIHZvaWQgYnBmX2xpc3RfaGVhZF9mcmVlKGNvbnN0IHN0cnVjdCBidGZfZmllbGQgKmZpZWxkLCB2b2lkICpsaXN0X2hlYWQsCiAJCQlzdHJ1Y3QgYnBmX3NwaW5fbG9jayAqc3Bpbl9sb2NrKTsKIHZvaWQgYnBmX3JiX3Jvb3RfZnJlZShjb25zdCBzdHJ1Y3QgYnRmX2ZpZWxkICpmaWVsZCwgdm9pZCAqcmJfcm9vdCwKQEAgLTcwMSw3ICYjNDM7NzEyLDggQEAgYm9vbCBicGZfbWFwX21ldGFfZXF1YWwoY29uc3Qgc3RydWN0IGJwZl9tYXAgKm1ldGEwLAogCiBzdGF0aWMgaW5saW5lIGJvb2wgYnBmX21hcF9oYXNfaW50ZXJuYWxfc3RydWN0cyhzdHJ1Y3QgYnBmX21hcCAqbWFwKQogewotCXJldHVybiBidGZfcmVjb3JkX2hhc19maWVsZChtYXAtJmd0O3JlY29yZCwgQlBGX1RJTUVSIHwgQlBGX1dPUktRVUVVRSB8IEJQRl9UQVNLX1dPUkspOwomIzQzOwlyZXR1cm4gYnRmX3JlY29yZF9oYXNfZmllbGQobWFwLSZndDtyZWNvcmQsIEJQRl9USU1FUiB8IEJQRl9XT1JLUVVFVUUgfAomIzQzOwkJCQkJCSBCUEZfVEFTS19XT1JLIHwgQlBGX1RIUkVBRF9XUSk7CiB9CiAKIHZvaWQgYnBmX21hcF9mcmVlX2ludGVybmFsX3N0cnVjdHMoc3RydWN0IGJwZl9tYXAgKm1hcCwgdm9pZCAqb2JqKTsKQEAgLTI3MjUsNiAmIzQzOzI3MzcsNyBAQCBib29sIGJ0Zl9yZWNvcmRfZXF1YWwoY29uc3Qgc3RydWN0IGJ0Zl9yZWNvcmQgKnJlY19hLCBjb25zdCBzdHJ1Y3QgYnRmX3JlY29yZCAqcgogdm9pZCBicGZfb2JqX2ZyZWVfdGltZXIoY29uc3Qgc3RydWN0IGJ0Zl9yZWNvcmQgKnJlYywgdm9pZCAqb2JqKTsKIHZvaWQgYnBmX29ial9mcmVlX3dvcmtxdWV1ZShjb25zdCBzdHJ1Y3QgYnRmX3JlY29yZCAqcmVjLCB2b2lkICpvYmopOwogdm9pZCBicGZfb2JqX2ZyZWVfdGFza193b3JrKGNvbnN0IHN0cnVjdCBidGZfcmVjb3JkICpyZWMsIHZvaWQgKm9iaik7CiYjNDM7dm9pZCBicGZfb2JqX2ZyZWVfdGhyZWFkX3dxKGNvbnN0IHN0cnVjdCBidGZfcmVjb3JkICpyZWMsIHZvaWQgKm9iaik7CiB2b2lkIGJwZl9vYmpfY2FuY2VsX2ZpZWxkcyhzdHJ1Y3QgYnBmX21hcCAqbWFwLCB2b2lkICpvYmopOwogdm9pZCBicGZfb2JqX2ZyZWVfZmllbGRzKGNvbnN0IHN0cnVjdCBidGZfcmVjb3JkICpyZWMsIHZvaWQgKm9iaik7CiB2b2lkIF9fYnBmX29ial9kcm9wX2ltcGwodm9pZCAqcCwgY29uc3Qgc3RydWN0IGJ0Zl9yZWNvcmQgKnJlYywgYm9vbCBwZXJjcHUpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9jZ3JvdXAuaCBiL2luY2x1ZGUvbGludXgvY2dyb3VwLmgKaW5kZXggZjJhYTQ2YTRmODcxZS4uOWI0YThkYzc0OGFjZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9jZ3JvdXAuaAomIzQzOyYjNDM7JiM0MzsgYi9pbmNsdWRlL2xpbnV4L2Nncm91cC5oCkBAIC05MjMsNCAmIzQzOzkyMyw2IEBAIHN0cnVjdCBjZ3JvdXAgKnRhc2tfZ2V0X2Nncm91cDEoc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssIGludCBoaWVyYXJjaHlfaWQpOwogCiBzdHJ1Y3QgY2dyb3VwX29mX3BlYWsgKm9mX3BlYWsoc3RydWN0IGtlcm5mc19vcGVuX2ZpbGUgKm9mKTsKIAomIzQzO2ludCBjZ3JvdXBfa3RocmVhZF9hdHRhY2goc3RydWN0IGNncm91cCAqY2dycCwgc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKTsKJiM0MzsKICNlbmRpZiAvKiBfTElOVVhfQ0dST1VQX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvdWFwaS9saW51eC9icGYuaCBiL2luY2x1ZGUvdWFwaS9saW51eC9icGYuaAppbmRleCBmZmQ5NmU4YjkyMGJkLi4wNTU4NTIwZjY3ZmU0IDEwMDY0NAotLS0gYS9pbmNsdWRlL3VhcGkvbGludXgvYnBmLmgKJiM0MzsmIzQzOyYjNDM7IGIvaW5jbHVkZS91YXBpL2xpbnV4L2JwZi5oCkBAIC03NTc0LDYgJiM0Mzs3NTc0LDEwIEBAIHN0cnVjdCBicGZfd3EgewogCV9fdTY0IF9fb3BhcXVlWzJdOwogfSBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDgpKSk7CiAKJiM0MztzdHJ1Y3QgYnBmX3RocmVhZF93cSB7CiYjNDM7CV9fdTY0IF9fb3BhcXVlWzJdOwomIzQzO30gX19hdHRyaWJ1dGVfXygoYWxpZ25lZCg4KSkpOwomIzQzOwogc3RydWN0IGJwZl9keW5wdHIgewogCV9fdTY0IF9fb3BhcXVlWzJdOwogfSBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDgpKSk7CmRpZmYgLS1naXQgYS9rZXJuZWwvYnBmL2J0Zi5jIGIva2VybmVsL2JwZi9idGYuYwppbmRleCA0MjQxNDYzM2NmMjYzLi5iZjZmYjVmNTFkMjFhIDEwMDY0NAotLS0gYS9rZXJuZWwvYnBmL2J0Zi5jCiYjNDM7JiM0MzsmIzQzOyBiL2tlcm5lbC9icGYvYnRmLmMKQEAgLTM2NjUsNiAmIzQzOzM2NjUsNyBAQCBzdGF0aWMgaW50IGJ0Zl9nZXRfZmllbGRfdHlwZShjb25zdCBzdHJ1Y3QgYnRmICpidGYsIGNvbnN0IHN0cnVjdCBidGZfdHlwZSAqdmFyXwogCQl7IEJQRl9USU1FUiwgJiMzNDticGZfdGltZXImIzM0OywgdHJ1ZSB9LAogCQl7IEJQRl9XT1JLUVVFVUUsICYjMzQ7YnBmX3dxJiMzNDssIHRydWUgfSwKIAkJeyBCUEZfVEFTS19XT1JLLCAmIzM0O2JwZl90YXNrX3dvcmsmIzM0OywgdHJ1ZSB9LAomIzQzOwkJeyBCUEZfVEhSRUFEX1dRLCAmIzM0O2JwZl90aHJlYWRfd3EmIzM0OywgdHJ1ZSB9LAogCQl7IEJQRl9MSVNUX0hFQUQsICYjMzQ7YnBmX2xpc3RfaGVhZCYjMzQ7LCBmYWxzZSB9LAogCQl7IEJQRl9MSVNUX05PREUsICYjMzQ7YnBmX2xpc3Rfbm9kZSYjMzQ7LCBmYWxzZSB9LAogCQl7IEJQRl9SQl9ST09ULCAmIzM0O2JwZl9yYl9yb290JiMzNDssIGZhbHNlIH0sCkBAIC0zODUwLDYgJiM0MzszODUxLDcgQEAgc3RhdGljIGludCBidGZfZmluZF9maWVsZF9vbmUoY29uc3Qgc3RydWN0IGJ0ZiAqYnRmLAogCWNhc2UgQlBGX1JCX05PREU6CiAJY2FzZSBCUEZfUkVGQ09VTlQ6CiAJY2FzZSBCUEZfVEFTS19XT1JLOgomIzQzOwljYXNlIEJQRl9USFJFQURfV1E6CiAJCXJldCA9IGJ0Zl9maW5kX3N0cnVjdChidGYsIHZhcl90eXBlLCBvZmYsIHN6LCBmaWVsZF90eXBlLAogCQkJCSAgICAgIGluZm9fY250ID8gJmFtcDtpbmZvWzBdIDogJmFtcDt0bXApOwogCQlpZiAocmV0ICZsdDsgMCkKQEAgLTQxNDUsNiAmIzQzOzQxNDcsNyBAQCBzdHJ1Y3QgYnRmX3JlY29yZCAqYnRmX3BhcnNlX2ZpZWxkcyhjb25zdCBzdHJ1Y3QgYnRmICpidGYsIGNvbnN0IHN0cnVjdCBidGZfdHlwZQogCXJlYy0mZ3Q7d3Ffb2ZmID0gLUVJTlZBTDsKIAlyZWMtJmd0O3JlZmNvdW50X29mZiA9IC1FSU5WQUw7CiAJcmVjLSZndDt0YXNrX3dvcmtfb2ZmID0gLUVJTlZBTDsKJiM0MzsJcmVjLSZndDt0aHJlYWRfd3Ffb2ZmID0gLUVJTlZBTDsKIAlmb3IgKGkgPSAwOyBpICZsdDsgY250OyBpJiM0MzsmIzQzOykgewogCQlmaWVsZF90eXBlX3NpemUgPSBidGZfZmllbGRfdHlwZV9zaXplKGluZm9fYXJyW2ldLnR5cGUpOwogCQlpZiAoaW5mb19hcnJbaV0ub2ZmICYjNDM7IGZpZWxkX3R5cGVfc2l6ZSAmZ3Q7IHZhbHVlX3NpemUpIHsKQEAgLTQxODgsNiAmIzQzOzQxOTEsMTAgQEAgc3RydWN0IGJ0Zl9yZWNvcmQgKmJ0Zl9wYXJzZV9maWVsZHMoY29uc3Qgc3RydWN0IGJ0ZiAqYnRmLCBjb25zdCBzdHJ1Y3QgYnRmX3R5cGUKIAkJCVdBUk5fT05fT05DRShyZWMtJmd0O3Rhc2tfd29ya19vZmYgJmd0Oz0gMCk7CiAJCQlyZWMtJmd0O3Rhc2tfd29ya19vZmYgPSByZWMtJmd0O2ZpZWxkc1tpXS5vZmZzZXQ7CiAJCQlicmVhazsKJiM0MzsJCWNhc2UgQlBGX1RIUkVBRF9XUToKJiM0MzsJCQlXQVJOX09OX09OQ0UocmVjLSZndDt0aHJlYWRfd3Ffb2ZmICZndDs9IDApOwomIzQzOwkJCXJlYy0mZ3Q7dGhyZWFkX3dxX29mZiA9IHJlYy0mZ3Q7ZmllbGRzW2ldLm9mZnNldDsKJiM0MzsJCQlicmVhazsKIAkJY2FzZSBCUEZfUkVGQ09VTlQ6CiAJCQlXQVJOX09OX09OQ0UocmVjLSZndDtyZWZjb3VudF9vZmYgJmd0Oz0gMCk7CiAJCQkvKiBDYWNoZSBvZmZzZXQgZm9yIGZhc3RlciBsb29rdXAgYXQgcnVudGltZSAqLwpkaWZmIC0tZ2l0IGEva2VybmVsL2JwZi9oZWxwZXJzLmMgYi9rZXJuZWwvYnBmL2hlbHBlcnMuYwppbmRleCA2Mzg4YjZiMjNlNDkwLi44ZTAxYmFkMWIxNmEwIDEwMDY0NAotLS0gYS9rZXJuZWwvYnBmL2hlbHBlcnMuYwomIzQzOyYjNDM7JiM0MzsgYi9rZXJuZWwvYnBmL2hlbHBlcnMuYwpAQCAtMjksNiAmIzQzOzI5LDggQEAKICNpbmNsdWRlICZsdDtsaW51eC90YXNrX3dvcmsuaCZndDsKICNpbmNsdWRlICZsdDtsaW51eC9pcnFfd29yay5oJmd0OwogI2luY2x1ZGUgJmx0O2xpbnV4L2J1aWxkaWQuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgva3RocmVhZC5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9qaGFzaC5oJmd0OwogCiAjaW5jbHVkZSAmIzM0Oy4uLy4uL2xpYi9rc3RydG94LmgmIzM0OwogCkBAIC0xMTEwLDYgJiM0MzsxMTEyLDE3IEBAIHN0YXRpYyB2b2lkICptYXBfa2V5X2Zyb21fdmFsdWUoc3RydWN0IGJwZl9tYXAgKm1hcCwgdm9pZCAqdmFsdWUsIHUzMiAqYXJyX2lkeCkKIAlyZXR1cm4gKHZvaWQgKil2YWx1ZSAtIHJvdW5kX3VwKG1hcC0mZ3Q7a2V5X3NpemUsIDgpOwogfQogCiYjNDM7c3RhdGljIHUzMiBicGZfbWFwX2VsZW1faWRfZnJvbV92YWx1ZShzdHJ1Y3QgYnBmX21hcCAqbWFwLCB2b2lkICp2YWx1ZSkKJiM0Mzt7CiYjNDM7CXUzMiBhcnJfaWR4OwomIzQzOwl2b2lkICprZXk7CiYjNDM7CiYjNDM7CWtleSA9IG1hcF9rZXlfZnJvbV92YWx1ZShtYXAsIHZhbHVlLCAmYW1wO2Fycl9pZHgpOwomIzQzOwlpZiAobWFwLSZndDttYXBfdHlwZSA9PSBCUEZfTUFQX1RZUEVfQVJSQVkpCiYjNDM7CQlyZXR1cm4gYXJyX2lkeDsKJiM0MzsJcmV0dXJuIGpoYXNoKGtleSwgbWFwLSZndDtrZXlfc2l6ZSwgMCk7CiYjNDM7fQomIzQzOwogZW51bSBicGZfYXN5bmNfdHlwZSB7CiAJQlBGX0FTWU5DX1RZUEVfVElNRVIgPSAwLAogCUJQRl9BU1lOQ19UWVBFX1dRLApAQCAtNDc2OSw2ICYjNDM7NDc4MiwzOTcgQEAgX19icGZfa2Z1bmMgaW50IGJwZl90aW1lcl9jYW5jZWxfYXN5bmMoc3RydWN0IGJwZl90aW1lciAqdGltZXIpCiAJfQogfQogCiYjNDM7LyoKJiM0MzsgKiBCUEYgdGhyZWFkIHdvcmtxdWV1ZSAoa3RocmVhZF93b3JrZXIgYmFzZWQpIGltcGxlbWVudGF0aW9uCiYjNDM7ICoKJiM0MzsgKiBXaHkgYnBmX3RocmVhZF93cSBkb2VzIE5PVCB1c2UgdGhlIGJwZl9hc3luYyBpbmZyYXN0cnVjdHVyZToKJiM0MzsgKgomIzQzOyAqIGJwZl90aW1lciBhbmQgYnBmX3dxIHNoYXJlIGEgY29tbW9uIGNsZWFudXAgcGF0aCB2aWEgYnBmX2FzeW5jOgomIzQzOyAqCiYjNDM7ICogICBicGZfYXN5bmNfY2FuY2VsX2FuZF9mcmVlKCkKJiM0MzsgKiAgICAgLSZndDsgYnBmX2FzeW5jX3NjaGVkdWxlX29wKCkKJiM0MzsgKiAgICAgICAtJmd0OyBpcnFfd29ya19xdWV1ZSgpICAgICAgICAgICAgICAgIC8vIHNjaGVkdWxlIGZyb20gYW55IGNvbnRleHQKJiM0MzsgKiAgICAgICAgIC0mZ3Q7IGJwZl9hc3luY19wcm9jZXNzX29wKCkgICAgICAgIC8vIHJ1bnMgaW4gaGFyZGlycSBjb250ZXh0CiYjNDM7ICogICAgICAgICAgIC0mZ3Q7IGJwZl93cV93b3JrKCkgLyB0aW1lciBjYiAgICAvLyBhdG9taWMsIG5vbi1zbGVlcGFibGUKJiM0MzsgKgomIzQzOyAqIFRoaXMgd29ya3MgZm9yIHRpbWVyIGFuZCB3b3JrcXVldWUgYmVjYXVzZSB0aGVpciBjYWxsYmFja3MgYW5kCiYjNDM7ICogY2FuY2VsbGF0aW9uIChocnRpbWVyX2NhbmNlbCAvIGJwZl93cV9jYW5jZWxfYW5kX2ZyZWUpIGNvbXBsZXRlCiYjNDM7ICogc3luY2hyb25vdXNseSBhbmQgbmVlZCBub3Qgc2xlZXAuICBUaGUgaGFyZGlycSBjb250ZXh0IGlzIHN1ZmZpY2llbnQuCiYjNDM7ICoKJiM0MzsgKiBicGZfdGhyZWFkX3dxIGlzIGRpZmZlcmVudDogY2FuY2VsbGF0aW9uIGFuZCBmaW5hbCBjbGVhbnVwIG1heSBuZWVkIHRvCiYjNDM7ICogc2xlZXA6CiYjNDM7ICoKJiM0MzsgKiAgIGt0aHJlYWRfY2FuY2VsX3dvcmtfc3luYygpICAgIC0gd2FpdHMgZm9yIHRoZSB3b3JrIHRvIGZpbmlzaCwgY2FuCiYjNDM7ICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2hlZHVsZSBvdXQgaWYgdGhlIHdvcmsgaXMgcnVubmluZy4KJiM0MzsgKiAgIGt0aHJlYWRfZGVzdHJveV93b3JrZXIoKSAgICAgIC0gc3RvcHMgdGhlIGt0aHJlYWQsIGludGVybmFsbHkKJiM0MzsgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bmNocm9uaXplcyB3aXRoIGt0aHJlYWQgZXhpdC4KJiM0MzsgKiAgIGNncm91cF9wdXQoKSAoZmluYWwgcHV0KSAgICAgIC0gbWF5IGFjcXVpcmUgY2dyb3VwX211dGV4IGFuZCBvdGhlcgomIzQzOyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xlZXBpbmcgbG9ja3MgZHVyaW5nIG9mZmxpbmUuCiYjNDM7ICoKJiM0MzsgKiBOb25lIG9mIHRoZXNlIGNhbiBiZSBjYWxsZWQgZnJvbSBoYXJkaXJxIGNvbnRleHQgKGlycV93b3JrKS4gRG9pbmcgc28KJiM0MzsgKiB3b3VsZCB0cmlnZ2VyIG1pZ2h0X3NsZWVwKCkgd2FybmluZ3Mgb3IgZGVhZGxvY2suCiYjNDM7ICoKJiM0MzsgKiBUaGVyZWZvcmUgYnBmX3RocmVhZF93cSBpbXBsZW1lbnRzIGl0cyBvd24gUkNVLWJhc2VkIGNsZWFudXA6CiYjNDM7ICoKJiM0MzsgKiAgIGJwZl90aHJlYWRfd3FfY2FuY2VsX2FuZF9mcmVlKCkgICAgICAgIC8vIHNsZWVwYWJsZSAoY2FsbGVkIGZyb20KJiM0MzsgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1hcCBmcmVlIC8gZWxlbSBkZWxldGUpCiYjNDM7ICogICAgIC0mZ3Q7IHhjaGcoY3R4LCBOVUxMKSAgICAgICAgICAgICAgICAgICAvLyBkZXRhY2ggYXRvbWljYWxseQomIzQzOyAqICAgICAtJmd0OyBrdGhyZWFkX2NhbmNlbF93b3JrX3N5bmMoKSAgICAgICAgLy8gb2sgdG8gc2xlZXAKJiM0MzsgKiAgICAgLSZndDsgYnBmX3RocmVhZF93cV9jdHhfcHV0KCkKJiM0MzsgKiAgICAgICAtJmd0OyBjYWxsX3JjdV90YXNrc190cmFjZSgpICAgICAgICAgIC8vIHdhaXQgZm9yIEJQRiBjYWxsYmFja3MKJiM0MzsgKiAgICAgICAgIC0mZ3Q7IHNjaGVkdWxlX3dvcmsoKSAgICAgICAgICAgICAgIC8vIHN3aXRjaCB0byBzbGVlcGFibGUgY29udGV4dAomIzQzOyAqICAgICAgICAgICAtJmd0OyBicGZfdGhyZWFkX3dxX2Rlc3Ryb3lfd29ya19mbigpCiYjNDM7ICogICAgICAgICAgICAgLSZndDsgYnBmX3Byb2dfcHV0KCkKJiM0MzsgKiAgICAgICAgICAgICAtJmd0OyBjZ3JvdXBfcHV0KCkKJiM0MzsgKiAgICAgICAgICAgICAtJmd0OyBrdGhyZWFkX2Rlc3Ryb3lfd29ya2VyKCkKJiM0MzsgKiAgICAgICAgICAgICAtJmd0OyBrZnJlZShjdHgpCiYjNDM7ICoKJiM0MzsgKiBUaGUgc2FtZSBkZXNpZ24gY2hvaWNlIHdhcyBtYWRlIGZvciBicGZfdGFza193b3JrLCB3aGljaCBhbHNvIGF2b2lkcwomIzQzOyAqIGJwZl9hc3luYyBiZWNhdXNlIHRhc2tfd29yayBjYW5jZWxsYXRpb24gc3luY2hyb25pemVzIHdpdGggdGhlIHRhc2sKJiM0MzsgKiBhbmQgbWF5IHNsZWVwLgomIzQzOyAqLwomIzQzOwomIzQzO3N0cnVjdCBicGZfdGhyZWFkX3dxX2N0eCB7CiYjNDM7CXN0cnVjdCBrdGhyZWFkX3dvcmtlciAqd29ya2VyOwomIzQzOwlzdHJ1Y3Qga3RocmVhZF93b3JrIHdvcms7CiYjNDM7CXN0cnVjdCBicGZfcHJvZyAqcHJvZzsKJiM0MzsJYnBmX2NhbGxiYWNrX3QgY2FsbGJhY2tfZm47CiYjNDM7CXN0cnVjdCBicGZfbWFwICptYXA7CiYjNDM7CXZvaWQgKnZhbHVlOwomIzQzOwlzdHJ1Y3QgY2dyb3VwICpjZ3JwOwomIzQzOwlyZWZjb3VudF90IHJlZmNudDsKJiM0MzsJc3RydWN0IHJjdV9oZWFkIHJjdTsKJiM0MzsJc3RydWN0IHdvcmtfc3RydWN0IGRlc3Ryb3lfd29yazsKJiM0Mzt9OwomIzQzOwomIzQzOy8qIEtlcm5lbC1pbnRlcm5hbCByZXByZXNlbnRhdGlvbiB0aGF0IGZpdHMgaW4gc3RydWN0IGJwZl90aHJlYWRfd3EgKi8KJiM0MztzdHJ1Y3QgYnBmX3RocmVhZF93cV9rZXJuIHsKJiM0MzsJc3RydWN0IGJwZl90aHJlYWRfd3FfY3R4ICpjdHg7CiYjNDM7fSBfX2FsaWduZWQoOCk7CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgYnBmX3RocmVhZF93cV9kZXN0cm95X3dvcmtfZm4oc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQomIzQzO3sKJiM0MzsJc3RydWN0IGJwZl90aHJlYWRfd3FfY3R4ICpjdHggPSBjb250YWluZXJfb2Yod29yaywKJiM0MzsJCQkJCQkgICAgIHN0cnVjdCBicGZfdGhyZWFkX3dxX2N0eCwKJiM0MzsJCQkJCQkgICAgIGRlc3Ryb3lfd29yayk7CiYjNDM7CiYjNDM7CWlmIChjdHgtJmd0O3Byb2cpCiYjNDM7CQlicGZfcHJvZ19wdXQoY3R4LSZndDtwcm9nKTsKJiM0MzsJaWYgKGN0eC0mZ3Q7Y2dycCkKJiM0MzsJCWNncm91cF9wdXQoY3R4LSZndDtjZ3JwKTsKJiM0MzsJaWYgKGN0eC0mZ3Q7d29ya2VyKQomIzQzOwkJa3RocmVhZF9kZXN0cm95X3dvcmtlcihjdHgtJmd0O3dvcmtlcik7CiYjNDM7CWtmcmVlKGN0eCk7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkIGJwZl90aHJlYWRfd3FfY3R4X2ZyZWVfcmN1KHN0cnVjdCByY3VfaGVhZCAqcmN1KQomIzQzO3sKJiM0MzsJc3RydWN0IGJwZl90aHJlYWRfd3FfY3R4ICpjdHggPSBjb250YWluZXJfb2YocmN1LAomIzQzOwkJCQkJCSAgICAgc3RydWN0IGJwZl90aHJlYWRfd3FfY3R4LAomIzQzOwkJCQkJCSAgICAgcmN1KTsKJiM0MzsKJiM0MzsJSU5JVF9XT1JLKCZhbXA7Y3R4LSZndDtkZXN0cm95X3dvcmssIGJwZl90aHJlYWRfd3FfZGVzdHJveV93b3JrX2ZuKTsKJiM0MzsJc2NoZWR1bGVfd29yaygmYW1wO2N0eC0mZ3Q7ZGVzdHJveV93b3JrKTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgYnBmX3RocmVhZF93cV9jdHhfcHV0KHN0cnVjdCBicGZfdGhyZWFkX3dxX2N0eCAqY3R4KQomIzQzO3sKJiM0MzsJaWYgKCFyZWZjb3VudF9kZWNfYW5kX3Rlc3QoJmFtcDtjdHgtJmd0O3JlZmNudCkpCiYjNDM7CQlyZXR1cm47CiYjNDM7CWNhbGxfcmN1X3Rhc2tzX3RyYWNlKCZhbXA7Y3R4LSZndDtyY3UsIGJwZl90aHJlYWRfd3FfY3R4X2ZyZWVfcmN1KTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgYnBmX3RocmVhZF93cV93b3JrX2ZuKHN0cnVjdCBrdGhyZWFkX3dvcmsgKndvcmspCiYjNDM7ewomIzQzOwlzdHJ1Y3QgYnBmX3RocmVhZF93cV9jdHggKmN0eCA9IGNvbnRhaW5lcl9vZih3b3JrLAomIzQzOwkJCQkJCSAgICAgc3RydWN0IGJwZl90aHJlYWRfd3FfY3R4LAomIzQzOwkJCQkJCSAgICAgd29yayk7CiYjNDM7CWJwZl9jYWxsYmFja190IGNhbGxiYWNrX2ZuOwomIzQzOwl2b2lkICp2YWx1ZSA9IGN0eC0mZ3Q7dmFsdWU7CiYjNDM7CXN0cnVjdCBicGZfbWFwICptYXAgPSBjdHgtJmd0O21hcDsKJiM0MzsJdm9pZCAqa2V5OwomIzQzOwl1MzIgaWR4OwomIzQzOwomIzQzOwlCVEZfVFlQRV9FTUlUKHN0cnVjdCBicGZfdGhyZWFkX3dxKTsKJiM0MzsKJiM0MzsJY2FsbGJhY2tfZm4gPSBSRUFEX09OQ0UoY3R4LSZndDtjYWxsYmFja19mbik7CiYjNDM7CWlmICghY2FsbGJhY2tfZm4pCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJa2V5ID0gbWFwX2tleV9mcm9tX3ZhbHVlKG1hcCwgdmFsdWUsICZhbXA7aWR4KTsKJiM0MzsKJiM0MzsJcmN1X3JlYWRfbG9ja190cmFjZSgpOwomIzQzOwltaWdyYXRlX2Rpc2FibGUoKTsKJiM0MzsKJiM0MzsJY2FsbGJhY2tfZm4gPSBSRUFEX09OQ0UoY3R4LSZndDtjYWxsYmFja19mbik7CiYjNDM7CWlmIChjYWxsYmFja19mbikKJiM0MzsJCWNhbGxiYWNrX2ZuKCh1NjQpKGxvbmcpbWFwLCAodTY0KShsb25nKWtleSwgKHU2NCkobG9uZyl2YWx1ZSwKJiM0MzsJCQkgICAgMCwgMCk7CiYjNDM7CiYjNDM7CW1pZ3JhdGVfZW5hYmxlKCk7CiYjNDM7CXJjdV9yZWFkX3VubG9ja190cmFjZSgpOwomIzQzOwomIzQzO291dDoKJiM0MzsJYnBmX3RocmVhZF93cV9jdHhfcHV0KGN0eCk7CiYjNDM7fQomIzQzOwomIzQzOy8qCiYjNDM7ICogYnBmX3RocmVhZF93cV9pbml0KCkgY3JlYXRlcyBhIGt0aHJlYWQgd29ya2VyIGFuZCBtYXkgYXR0YWNoIGl0IHRvIGEgY2dyb3VwLgomIzQzOyAqIFRoZSBoZWxwZXJzIHVzZWQgaGVyZSBjYW4gc2xlZXAgYW5kIGFjcXVpcmUgc2V2ZXJhbCBsb2NrcyB0aHJvdWdoIGt0aHJlYWQKJiM0MzsgKiBjcmVhdGlvbi9kZXN0cnVjdGlvbiwgY2dyb3VwIGxvb2t1cCBhbmQgY2dyb3VwIGt0aHJlYWQgYXR0YWNobWVudC4gS2VlcCB0aGlzCiYjNDM7ICoga2Z1bmMgYXZhaWxhYmxlIG9ubHkgdG8gQlBGX1BST0dfVFlQRV9TWVNDQUxMIHByb2dyYW1zIHNvIGl0IGlzIG5vdCBpbnZva2VkCiYjNDM7ICogZnJvbSBCUEYgcHJvZ3JhbSBjb250ZXh0cyB0aGF0IGFscmVhZHkgaG9sZCBsb2NrcyB3aGljaCBjb3VsZCBkZWFkbG9jayB3aXRoCiYjNDM7ICogdGhvc2UgcGF0aHMuCiYjNDM7ICovCiYjNDM7X19icGZfa2Z1bmMgaW50IGJwZl90aHJlYWRfd3FfaW5pdChzdHJ1Y3QgYnBmX3RocmVhZF93cSAqdHdxLCB2b2lkICpwX19tYXAsCiYjNDM7CQkJCSAgIHU2NCBjZ3JvdXBfaWQsIHVuc2lnbmVkIGludCBmbGFncykKJiM0Mzt7CiYjNDM7CXN0cnVjdCBicGZfdGhyZWFkX3dxX2tlcm4gKnR3ayA9IChzdHJ1Y3QgYnBmX3RocmVhZF93cV9rZXJuICopdHdxOwomIzQzOwlzdHJ1Y3QgYnBmX21hcCAqbWFwID0gcF9fbWFwOwomIzQzOwlzdHJ1Y3QgYnBmX3RocmVhZF93cV9jdHggKmN0eCwgKm9sZF9jdHg7CiYjNDM7CXN0cnVjdCBrdGhyZWFkX3dvcmtlciAqd29ya2VyOwomIzQzOwlzdHJ1Y3QgY2dyb3VwICpjZ3JwID0gTlVMTDsKJiM0MzsJdm9pZCAqdmFsdWU7CiYjNDM7CXUzMiBlbGVtX2lkOwomIzQzOwlpbnQgZXJyOwomIzQzOwomIzQzOwlCVUlMRF9CVUdfT04oc2l6ZW9mKHN0cnVjdCBicGZfdGhyZWFkX3dxX2tlcm4pCiYjNDM7CQkJJmd0OyBzaXplb2Yoc3RydWN0IGJwZl90aHJlYWRfd3EpKTsKJiM0MzsJQlVJTERfQlVHX09OKF9fYWxpZ25vZl9fKHN0cnVjdCBicGZfdGhyZWFkX3dxX2tlcm4pCiYjNDM7CQkJIT0gX19hbGlnbm9mX18oc3RydWN0IGJwZl90aHJlYWRfd3EpKTsKJiM0MzsKJiM0MzsJaWYgKGZsYWdzKQomIzQzOwkJcmV0dXJuIC1FSU5WQUw7CiYjNDM7CiYjNDM7CW9sZF9jdHggPSBSRUFEX09OQ0UodHdrLSZndDtjdHgpOwomIzQzOwlpZiAob2xkX2N0eCkKJiM0MzsJCXJldHVybiAtRUJVU1k7CiYjNDM7CiYjNDM7CXZhbHVlID0gKHZvaWQgKil0d3EgLSBtYXAtJmd0O3JlY29yZC0mZ3Q7dGhyZWFkX3dxX29mZjsKJiM0MzsJZWxlbV9pZCA9IGJwZl9tYXBfZWxlbV9pZF9mcm9tX3ZhbHVlKG1hcCwgdmFsdWUpOwomIzQzOwl3b3JrZXIgPSBrdGhyZWFkX3J1bl93b3JrZXIoMCwgJiMzNDticGZfdHdxLyVkLyV4JiMzNDssIG1hcC0mZ3Q7aWQsIGVsZW1faWQpOwomIzQzOwlpZiAoSVNfRVJSKHdvcmtlcikpCiYjNDM7CQlyZXR1cm4gUFRSX0VSUih3b3JrZXIpOwomIzQzOwomIzQzOwkvKiBTZXR1cCBjdHguICovCiYjNDM7CWN0eCA9IGJwZl9tYXBfa21hbGxvY19ub2xvY2sobWFwLCBzaXplb2YoKmN0eCksIEdGUF9LRVJORUwsCiYjNDM7CQkJCSAgICAgbWFwLSZndDtudW1hX25vZGUpOwomIzQzOwlpZiAoIWN0eCkgewomIzQzOwkJZXJyID0gLUVOT01FTTsKJiM0MzsJCWdvdG8gZGVzdHJveV93b3JrZXI7CiYjNDM7CX0KJiM0MzsJbWVtc2V0KGN0eCwgMCwgc2l6ZW9mKCpjdHgpKTsKJiM0MzsJY3R4LSZndDt3b3JrZXIgPSB3b3JrZXI7CiYjNDM7CWN0eC0mZ3Q7bWFwID0gbWFwOwomIzQzOwljdHgtJmd0O3ZhbHVlID0gdmFsdWU7CiYjNDM7CXJlZmNvdW50X3NldCgmYW1wO2N0eC0mZ3Q7cmVmY250LCAxKTsKJiM0MzsJa3RocmVhZF9pbml0X3dvcmsoJmFtcDtjdHgtJmd0O3dvcmssIGJwZl90aHJlYWRfd3Ffd29ya19mbik7CiYjNDM7CiYjNDM7CWlmIChjZ3JvdXBfaWQpIHsKJiM0MzsjaWZkZWYgQ09ORklHX0NHUk9VUFMKJiM0MzsJCWNncnAgPSBjZ3JvdXBfZ2V0X2Zyb21faWQoY2dyb3VwX2lkKTsKJiM0MzsJCWlmIChJU19FUlIoY2dycCkpIHsKJiM0MzsJCQllcnIgPSBQVFJfRVJSKGNncnApOwomIzQzOwkJCWdvdG8ga2ZyZWVfY3R4OwomIzQzOwkJfQomIzQzOwkJY3R4LSZndDtjZ3JwID0gY2dycDsKJiM0MzsKJiM0MzsJCS8qCiYjNDM7CQkgKiBrdGhyZWFkX3J1bl93b3JrZXIoKSB3YWtlcyB0aGUga3RocmVhZCwgYnV0IGl0IG1heSBub3QgaGF2ZQomIzQzOwkJICogZXhlY3V0ZWQgY2dyb3VwX2t0aHJlYWRfcmVhZHkoKSB5ZXQsIHdoaWNoIGNsZWFycwomIzQzOwkJICogbm9fY2dyb3VwX21pZ3JhdGlvbi4KJiM0MzsJCSAqIERvIGEgcXVldWUgd29yayBhbmQgZmx1c2ggdG8gd2FpdCB0aGUga3RocmVhZCBydW4uCiYjNDM7CQkgKi8KJiM0MzsJCXJlZmNvdW50X2luYygmYW1wO2N0eC0mZ3Q7cmVmY250KTsKJiM0MzsJCWlmICgha3RocmVhZF9xdWV1ZV93b3JrKGN0eC0mZ3Q7d29ya2VyLCAmYW1wO2N0eC0mZ3Q7d29yaykpIHsKJiM0MzsJCQlyZWZjb3VudF9kZWMoJmFtcDtjdHgtJmd0O3JlZmNudCk7CiYjNDM7CQkJZXJyID0gLUVCVVNZOwomIzQzOwkJCWdvdG8gY2dyb3VwX3B1dDsKJiM0MzsJCX0KJiM0MzsJCWt0aHJlYWRfZmx1c2hfd29yaygmYW1wO2N0eC0mZ3Q7d29yayk7CiYjNDM7CiYjNDM7CQlpZiAod29ya2VyLSZndDt0YXNrLSZndDtub19jZ3JvdXBfbWlncmF0aW9uKSB7CiYjNDM7CQkJZXJyID0gLUVBR0FJTjsKJiM0MzsJCQlnb3RvIGNncm91cF9wdXQ7CiYjNDM7CQl9CiYjNDM7CiYjNDM7CQllcnIgPSBjZ3JvdXBfa3RocmVhZF9hdHRhY2goY2dycCwgd29ya2VyLSZndDt0YXNrKTsKJiM0MzsJCWlmIChlcnIpCiYjNDM7CQkJZ290byBjZ3JvdXBfcHV0OwomIzQzOyNlbHNlCiYjNDM7CQllcnIgPSAtRU9QTk9UU1VQUDsKJiM0MzsJCWdvdG8ga2ZyZWVfY3R4OwomIzQzOyNlbmRpZgomIzQzOwl9CiYjNDM7CiYjNDM7CW9sZF9jdHggPSBjbXB4Y2hnKCZhbXA7dHdrLSZndDtjdHgsIE5VTEwsIGN0eCk7CiYjNDM7CWlmIChvbGRfY3R4KSB7CiYjNDM7CQllcnIgPSAtRUJVU1k7CiYjNDM7CQlnb3RvIGNncm91cF9wdXQ7CiYjNDM7CX0KJiM0MzsKJiM0MzsJLyoKJiM0MzsJICogUGFpcmVkIHdpdGggdGhlIG1hcCBkZXN0cnVjdGlvbiBwYXRoLiAgRW5zdXJlcyB0aGF0IGN0eCBpcyBnbG9iYWxseQomIzQzOwkgKiB2aXNpYmxlIGJlZm9yZSB3ZSBjaGVjayBtYXAtJmd0O3VzZXJjbnQuCiYjNDM7CSAqIElmIHVzZXJjbnQgaGFzIGRyb3BwZWQgdG8gemVybywgdGhlIGRlc3RydWN0aW9uIHBhdGggd2lsbCBlaXRoZXIgc2VlCiYjNDM7CSAqIHRoZSBjdHggKGFuZCBjYW5jZWwgaXQpIG9yIHdlIHNlZSB1c2VyY250ID09IDAgaGVyZSBhbmQgY2FuY2VsCiYjNDM7CSAqIG91cnNlbHZlcy4KJiM0MzsJICogV2l0aG91dCB0aGlzIGJhcnJpZXIsIGEgQ1BVIGNvdWxkIHJlb3JkZXIgdGhlIGxvYWQgb2YgdXNlcmNudCBiZWZvcmUKJiM0MzsJICogdGhlIGNtcHhjaGcgc3RvcmUgYmVjb21lcyB2aXNpYmxlLCBicmVha2luZyB0aGUgbXV0dWFsIGV4Y2x1c2lvbgomIzQzOwkgKiBndWFyYW50ZWUuCiYjNDM7CSAqLwomIzQzOwlzbXBfbWIoKTsKJiM0MzsKJiM0MzsJaWYgKCFhdG9taWM2NF9yZWFkKCZhbXA7bWFwLSZndDt1c2VyY250KSkgewomIzQzOwkJYnBmX3RocmVhZF93cV9jYW5jZWxfYW5kX2ZyZWUodHdxKTsKJiM0MzsJCXJldHVybiAtRVBFUk07CiYjNDM7CX0KJiM0MzsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7CiYjNDM7Y2dyb3VwX3B1dDoKJiM0MzsjaWZkZWYgQ09ORklHX0NHUk9VUFMKJiM0MzsJaWYgKGNncnApCiYjNDM7CQljZ3JvdXBfcHV0KGNncnApOwomIzQzOyNlbmRpZgomIzQzO2tmcmVlX2N0eDoKJiM0MzsJLyoKJiM0MzsJICogTm90IHVzZSBicGZfdGhyZWFkX3dxX2N0eF9wdXQgYmVjYXVzZSBjdHggaGFzIG5vdCB5ZXQgZW50ZXJlZAomIzQzOwkgKiB0aGUgcnVubmluZyBzdGF0ZS4KJiM0MzsJICovCiYjNDM7CWtmcmVlKGN0eCk7CiYjNDM7ZGVzdHJveV93b3JrZXI6CiYjNDM7CWt0aHJlYWRfZGVzdHJveV93b3JrZXIod29ya2VyKTsKJiM0MzsJcmV0dXJuIGVycjsKJiM0Mzt9CiYjNDM7CiYjNDM7X19icGZfa2Z1bmMgaW50IGJwZl90aHJlYWRfd3Ffc2V0X2NhbGxiYWNrKHN0cnVjdCBicGZfdGhyZWFkX3dxICp0d3EsCiYjNDM7CQkJCQkgICBpbnQgKGNhbGxiYWNrX2ZuKSh2b2lkICptYXAsCiYjNDM7CQkJCQkJCSAgICAgaW50ICprZXksCiYjNDM7CQkJCQkJCSAgICAgdm9pZCAqdmFsdWUpLAomIzQzOwkJCQkJICAgdW5zaWduZWQgaW50IGZsYWdzLAomIzQzOwkJCQkJICAgc3RydWN0IGJwZl9wcm9nX2F1eCAqYXV4KQomIzQzO3sKJiM0MzsJc3RydWN0IGJwZl90aHJlYWRfd3Ffa2VybiAqdHdrID0gKHN0cnVjdCBicGZfdGhyZWFkX3dxX2tlcm4gKil0d3E7CiYjNDM7CXN0cnVjdCBicGZfdGhyZWFkX3dxX2N0eCAqY3R4OwomIzQzOwlzdHJ1Y3QgYnBmX3Byb2cgKnByb2c7CiYjNDM7CiYjNDM7CWlmIChmbGFncykKJiM0MzsJCXJldHVybiAtRUlOVkFMOwomIzQzOwomIzQzOwljdHggPSBSRUFEX09OQ0UodHdrLSZndDtjdHgpOwomIzQzOwlpZiAoIWN0eCkKJiM0MzsJCXJldHVybiAtRUlOVkFMOwomIzQzOwomIzQzOwlwcm9nID0gYnBmX3Byb2dfaW5jX25vdF96ZXJvKGF1eC0mZ3Q7cHJvZyk7CiYjNDM7CWlmIChJU19FUlIocHJvZykpCiYjNDM7CQlyZXR1cm4gUFRSX0VSUihwcm9nKTsKJiM0MzsKJiM0MzsJLyoKJiM0MzsJICogQWxsb3cgc2V0X2NhbGxiYWNrIG9ubHkgb25jZSB0byBwcmV2ZW50IFVBRjogYSBjb25jdXJyZW50CiYjNDM7CSAqIHNldF9jYWxsYmFjayBjb3VsZCBicGZfcHJvZ19wdXQoKSB0aGUgcHJvZyB3aGlsZSB0aGUgd29ya2VyCiYjNDM7CSAqIGt0aHJlYWQgaXMgc3RpbGwgZXhlY3V0aW5nIGl0cyBjYWxsYmFjay4KJiM0MzsJICovCiYjNDM7CWlmIChjbXB4Y2hnKCZhbXA7Y3R4LSZndDtwcm9nLCBOVUxMLCBwcm9nKSAhPSBOVUxMKSB7CiYjNDM7CQlicGZfcHJvZ19wdXQocHJvZyk7CiYjNDM7CQlyZXR1cm4gLUVCVVNZOwomIzQzOwl9CiYjNDM7CS8qCiYjNDM7CSAqIFNhZmUgdG8gc2V0IGNhbGxiYWNrX2ZuIGFmdGVyIHByb2c6IGJwZl90aHJlYWRfd3Ffc3RhcnQoKSBhbmQKJiM0MzsJICogYnBmX3RocmVhZF93cV93b3JrX2ZuKCkgYm90aCBjaGVjayBjYWxsYmFja19mbiB3aXRoIFJFQURfT05DRSgpCiYjNDM7CSAqIGFuZCBiYWlsIG91dCBpZiBpdCBpcyBzdGlsbCBOVUxMLgomIzQzOwkgKi8KJiM0MzsJV1JJVEVfT05DRShjdHgtJmd0O2NhbGxiYWNrX2ZuLCAodm9pZCAqKWNhbGxiYWNrX2ZuKTsKJiM0MzsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOwomIzQzO19fYnBmX2tmdW5jIGludAomIzQzO2JwZl90aHJlYWRfd3Ffc3RhcnQoc3RydWN0IGJwZl90aHJlYWRfd3EgKnR3cSwgdW5zaWduZWQgaW50IGZsYWdzKQomIzQzO3sKJiM0MzsJc3RydWN0IGJwZl90aHJlYWRfd3Ffa2VybiAqdHdrID0gKHN0cnVjdCBicGZfdGhyZWFkX3dxX2tlcm4gKil0d3E7CiYjNDM7CXN0cnVjdCBicGZfdGhyZWFkX3dxX2N0eCAqY3R4OwomIzQzOwlpbnQgZXJyOwomIzQzOwomIzQzOwlpZiAoZmxhZ3MpCiYjNDM7CQlyZXR1cm4gLUVJTlZBTDsKJiM0MzsKJiM0MzsJcmN1X3JlYWRfbG9ja190cmFjZSgpOwomIzQzOwomIzQzOwllcnIgPSAwOwomIzQzOwomIzQzOwljdHggPSBSRUFEX09OQ0UodHdrLSZndDtjdHgpOwomIzQzOwlpZiAoIWN0eCB8fCAhUkVBRF9PTkNFKGN0eC0mZ3Q7Y2FsbGJhY2tfZm4pKSB7CiYjNDM7CQllcnIgPSAtRUlOVkFMOwomIzQzOwkJZ290byB1bmxvY2s7CiYjNDM7CX0KJiM0MzsKJiM0MzsJaWYgKCFyZWZjb3VudF9pbmNfbm90X3plcm8oJmFtcDtjdHgtJmd0O3JlZmNudCkpCiYjNDM7CQllcnIgPSAtRU5PRU5UOwomIzQzOwomIzQzO3VubG9jazoKJiM0MzsJcmN1X3JlYWRfdW5sb2NrX3RyYWNlKCk7CiYjNDM7CWlmIChlcnIpCiYjNDM7CQlyZXR1cm4gZXJyOwomIzQzOwomIzQzOwlpZiAoIWt0aHJlYWRfcXVldWVfd29yayhjdHgtJmd0O3dvcmtlciwgJmFtcDtjdHgtJmd0O3dvcmspKSB7CiYjNDM7CQlicGZfdGhyZWFkX3dxX2N0eF9wdXQoY3R4KTsKJiM0MzsJCXJldHVybiAtRUJVU1k7CiYjNDM7CX0KJiM0MzsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOwomIzQzO3ZvaWQgYnBmX3RocmVhZF93cV9jYW5jZWxfYW5kX2ZyZWUodm9pZCAqdmFsKQomIzQzO3sKJiM0MzsJc3RydWN0IGJwZl90aHJlYWRfd3Ffa2VybiAqdHdrID0gdmFsOwomIzQzOwlzdHJ1Y3QgYnBmX3RocmVhZF93cV9jdHggKmN0eDsKJiM0MzsKJiM0MzsJY3R4ID0geGNoZygmYW1wO3R3ay0mZ3Q7Y3R4LCBOVUxMKTsKJiM0MzsJaWYgKCFjdHgpCiYjNDM7CQlyZXR1cm47CiYjNDM7CiYjNDM7CW1pZ2h0X3NsZWVwKCk7CiYjNDM7CiYjNDM7CS8qCiYjNDM7CSAqIFByZXZlbnQgZnV0dXJlIGNhbGxiYWNrcyBmcm9tIHJ1bm5pbmcgYW5kIHdhaXQgZm9yIGFueQomIzQzOwkgKiBpbi1wcm9ncmVzcyBleGVjdXRpb24gdG8gZmluaXNoLgomIzQzOwkgKi8KJiM0MzsJV1JJVEVfT05DRShjdHgtJmd0O2NhbGxiYWNrX2ZuLCBOVUxMKTsKJiM0MzsJLyoKJiM0MzsJICoga3RocmVhZF9jYW5jZWxfd29ya19zeW5jKCkgcmV0dXJucyB0cnVlIHdoZW4gaXQgZGVxdWV1ZXMgYSBwZW5kaW5nCiYjNDM7CSAqIHdvcmsgaXRlbSBmcm9tIHRoZSB3b3JrX2xpc3Qgd2l0aG91dCBleGVjdXRpbmcgaXQuICBFYWNoIHN1Y2Nlc3NmdWwKJiM0MzsJICogYnBmX3RocmVhZF93cV9zdGFydCgpIGNhbGwgaW5jcmVtZW50cyBjdHgtJmd0O3JlZmNudCBhbmQgcmVsaWVzIG9uIHRoZQomIzQzOwkgKiBzdWJzZXF1ZW50IGJwZl90aHJlYWRfd3Ffd29ya19mbigpIGV4ZWN1dGlvbiB0byByZWxlYXNlIHRoYXQKJiM0MzsJICogcmVmZXJlbmNlIHZpYSBicGZfdGhyZWFkX3dxX2N0eF9wdXQoKS4gIElmIHRoZSB3b3JrIHdhcyBwZW5kaW5nIGFuZAomIzQzOwkgKiBnb3QgY2FuY2VsbGVkIGhlcmUsIHdvcmtfZm4gd2lsbCBuZXZlciBydW4gZm9yIHRoYXQgcXVldWVkIGluc3RhbmNlLAomIzQzOwkgKiBzbyB3ZSBtdXN0IGRyb3AgdGhlIHJlZmVyZW5jZSBvdXJzZWx2ZXMgdG8gYXZvaWQgYSBwZXJtYW5lbnQgcmVmY291bnQKJiM0MzsJICogbGVhay4KJiM0MzsJICoKJiM0MzsJICogVGhpcyBjb3ZlcnMgdHdvIHNjZW5hcmlvcyB1bmlmb3JtbHk6CiYjNDM7CSAqICAxLiBUaGUgd29yayBpcyBwdXJlbHkgcGVuZGluZyAobm90IGN1cnJlbnRseSBleGVjdXRpbmcpIC0gZS5nLiBhCiYjNDM7CSAqICAgICBub3JtYWwgYnBmX3RocmVhZF93cV9zdGFydCgpIGNhbGwgcXVldWVkIGl0IGJ1dCB0aGUgd29ya2VyCiYjNDM7CSAqICAgICB0aHJlYWQgaGFzbiYjMzk7dCBwaWNrZWQgaXQgdXAgeWV0LgomIzQzOwkgKiAgMi4gVGhlIHdvcmsgaXMgY3VycmVudGx5IGluLWZsaWdodCBBTkQgd2FzIHNlbGYtcmVzY2hlZHVsZWQgZnJvbQomIzQzOwkgKiAgICAgd2l0aGluIHRoZSBjYWxsYmFjayAtIGt0aHJlYWRfY2FuY2VsX3dvcmtfc3luYygpIGRlcXVldWVzIHRoZQomIzQzOwkgKiAgICAgcmUtcXVldWVkIHBlbmRpbmcgbm9kZSBhbmQgdGhlbiB3YWl0cyBmb3IgdGhlIGluLWZsaWdodAomIzQzOwkgKiAgICAgZXhlY3V0aW9uIHRvIGNvbXBsZXRlLgomIzQzOwkgKiBJbiBib3RoIGNhc2VzIHRoZSByZXR1cm4gdmFsdWUgaXMgdHJ1ZSwgaW5kaWNhdGluZyBvbmUgb3JwaGFuZWQKJiM0MzsJICogcmVmZXJlbmNlIHRoYXQgbmVlZHMgdG8gYmUgcmVsZWFzZWQgaGVyZS4KJiM0MzsJICovCiYjNDM7CWlmIChrdGhyZWFkX2NhbmNlbF93b3JrX3N5bmMoJmFtcDtjdHgtJmd0O3dvcmspKQomIzQzOwkJYnBmX3RocmVhZF93cV9jdHhfcHV0KGN0eCk7CiYjNDM7CiYjNDM7CS8qCiYjNDM7CSAqIERyb3Agb3VyIG93biByZWZlcmVuY2UuICBJZiB0aGUgd29yayB3YXMgc3RpbGwgaW4tZmxpZ2h0IGFib3ZlLAomIzQzOwkgKiB0aGUgcmVmY291bnQgd29uJiMzOTt0IGhpdCB6ZXJvIGhlcmUgLSBpdCB3aWxsIHJlYWNoIHplcm8gd2hlbiB0aGUKJiM0MzsJICogd29yayBwYXRoIGNhbGxzIGJwZl90aHJlYWRfd3FfY3R4X3B1dCgpIHVwb24gY29tcGxldGlvbi4gIEVpdGhlcgomIzQzOwkgKiB3YXksIGZpbmFsIGNsZWFudXAgKHdvcmtlciBkZXN0cnVjdGlvbiwgcHJvZyBwdXQsIGNncm91cCBwdXQsCiYjNDM7CSAqIGtmcmVlKSBoYXBwZW5zIGV4Y2x1c2l2ZWx5IGluIHRoZSBSQ1UgY2FsbGJhY2sgdG8ga2VlcCB0aGUKJiM0MzsJICogdGVhcmRvd24gcGF0aCBzaW5nbGUtdGhyZWFkZWQuCiYjNDM7CSAqLwomIzQzOwlicGZfdGhyZWFkX3dxX2N0eF9wdXQoY3R4KTsKJiM0Mzt9CiYjNDM7CiBfX2JwZl9rZnVuY19lbmRfZGVmcygpOwogCiBzdGF0aWMgdm9pZCBicGZfdGFza193b3JrX2NhbmNlbF9zY2hlZHVsZWQoc3RydWN0IGlycV93b3JrICppcnFfd29yaykKQEAgLTQ5MTcsNiAmIzQzOzUzMjEsOCBAQCBCVEZfSURfRkxBR1MoZnVuYywgYnBmX21vZGlmeV9yZXR1cm5fdGVzdF90cCkKIEJURl9JRF9GTEFHUyhmdW5jLCBicGZfd3FfaW5pdCkKIEJURl9JRF9GTEFHUyhmdW5jLCBicGZfd3Ffc2V0X2NhbGxiYWNrLCBLRl9JTVBMSUNJVF9BUkdTKQogQlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl93cV9zdGFydCkKJiM0MztCVEZfSURfRkxBR1MoZnVuYywgYnBmX3RocmVhZF93cV9zZXRfY2FsbGJhY2ssIEtGX0lNUExJQ0lUX0FSR1MpCiYjNDM7QlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl90aHJlYWRfd3Ffc3RhcnQpCiBCVEZfSURfRkxBR1MoZnVuYywgYnBmX3ByZWVtcHRfZGlzYWJsZSkKIEJURl9JRF9GTEFHUyhmdW5jLCBicGZfcHJlZW1wdF9lbmFibGUpCiBCVEZfSURfRkxBR1MoZnVuYywgYnBmX2l0ZXJfYml0c19uZXcsIEtGX0lURVJfTkVXKQpAQCAtNDk3OCw2ICYjNDM7NTM4NCwxNSBAQCBzdGF0aWMgY29uc3Qgc3RydWN0IGJ0Zl9rZnVuY19pZF9zZXQgY29tbW9uX2tmdW5jX3NldCA9IHsKIAkuc2V0ICAgPSAmYW1wO2NvbW1vbl9idGZfaWRzLAogfTsKIAomIzQzO0JURl9LRlVOQ1NfU1RBUlQoc3lzY2FsbF9idGZfaWRzKQomIzQzO0JURl9JRF9GTEFHUyhmdW5jLCBicGZfdGhyZWFkX3dxX2luaXQsIEtGX1NMRUVQQUJMRSkKJiM0MztCVEZfS0ZVTkNTX0VORChzeXNjYWxsX2J0Zl9pZHMpCiYjNDM7CiYjNDM7c3RhdGljIGNvbnN0IHN0cnVjdCBidGZfa2Z1bmNfaWRfc2V0IHN5c2NhbGxfa2Z1bmNfc2V0ID0gewomIzQzOwkub3duZXIgPSBUSElTX01PRFVMRSwKJiM0MzsJLnNldCAgID0gJmFtcDtzeXNjYWxsX2J0Zl9pZHMsCiYjNDM7fTsKJiM0MzsKIHN0YXRpYyBpbnQgX19pbml0IGtmdW5jX2luaXQodm9pZCkKIHsKIAlpbnQgcmV0OwpAQCAtNTAwMCw2ICYjNDM7NTQxNSw3IEBAIHN0YXRpYyBpbnQgX19pbml0IGtmdW5jX2luaXQodm9pZCkKIAlyZXQgPSByZXQgPzogcmVnaXN0ZXJfYnRmX2tmdW5jX2lkX3NldChCUEZfUFJPR19UWVBFX1NUUlVDVF9PUFMsICZhbXA7Z2VuZXJpY19rZnVuY19zZXQpOwogCXJldCA9IHJldCA/OiByZWdpc3Rlcl9idGZfa2Z1bmNfaWRfc2V0KEJQRl9QUk9HX1RZUEVfU1lTQ0FMTCwgJmFtcDtnZW5lcmljX2tmdW5jX3NldCk7CiAJcmV0ID0gcmV0ID86IHJlZ2lzdGVyX2J0Zl9rZnVuY19pZF9zZXQoQlBGX1BST0dfVFlQRV9DR1JPVVBfU0tCLCAmYW1wO2dlbmVyaWNfa2Z1bmNfc2V0KTsKJiM0MzsJcmV0ID0gcmV0ID86IHJlZ2lzdGVyX2J0Zl9rZnVuY19pZF9zZXQoQlBGX1BST0dfVFlQRV9TWVNDQUxMLCAmYW1wO3N5c2NhbGxfa2Z1bmNfc2V0KTsKIAlyZXQgPSByZXQgPzogcmVnaXN0ZXJfYnRmX2lkX2R0b3Jfa2Z1bmNzKGdlbmVyaWNfZHRvcnMsCiAJCQkJCQkgIEFSUkFZX1NJWkUoZ2VuZXJpY19kdG9ycyksCiAJCQkJCQkgIFRISVNfTU9EVUxFKTsKQEAgLTUwMzcsNCAmIzQzOzU0NTMsNiBAQCB2b2lkIGJwZl9tYXBfZnJlZV9pbnRlcm5hbF9zdHJ1Y3RzKHN0cnVjdCBicGZfbWFwICptYXAsIHZvaWQgKnZhbCkKIAkJYnBmX29ial9mcmVlX3dvcmtxdWV1ZShtYXAtJmd0O3JlY29yZCwgdmFsKTsKIAlpZiAoYnRmX3JlY29yZF9oYXNfZmllbGQobWFwLSZndDtyZWNvcmQsIEJQRl9UQVNLX1dPUkspKQogCQlicGZfb2JqX2ZyZWVfdGFza193b3JrKG1hcC0mZ3Q7cmVjb3JkLCB2YWwpOwomIzQzOwlpZiAoYnRmX3JlY29yZF9oYXNfZmllbGQobWFwLSZndDtyZWNvcmQsIEJQRl9USFJFQURfV1EpKQomIzQzOwkJYnBmX29ial9mcmVlX3RocmVhZF93cShtYXAtJmd0O3JlY29yZCwgdmFsKTsKIH0KZGlmZiAtLWdpdCBhL2tlcm5lbC9icGYvc3lzY2FsbC5jIGIva2VybmVsL2JwZi9zeXNjYWxsLmMKaW5kZXggOGQxMTFkYTg4NjU1My4uZGVhMTQ4MjNiYWNkMiAxMDA2NDQKLS0tIGEva2VybmVsL2JwZi9zeXNjYWxsLmMKJiM0MzsmIzQzOyYjNDM7IGIva2VybmVsL2JwZi9zeXNjYWxsLmMKQEAgLTY4OCw2ICYjNDM7Njg4LDcgQEAgdm9pZCBidGZfcmVjb3JkX2ZyZWUoc3RydWN0IGJ0Zl9yZWNvcmQgKnJlYykKIAkJY2FzZSBCUEZfUkVGQ09VTlQ6CiAJCWNhc2UgQlBGX1dPUktRVUVVRToKIAkJY2FzZSBCUEZfVEFTS19XT1JLOgomIzQzOwkJY2FzZSBCUEZfVEhSRUFEX1dROgogCQkJLyogTm90aGluZyB0byByZWxlYXNlICovCiAJCQlicmVhazsKIAkJZGVmYXVsdDoKQEAgLTc0Miw2ICYjNDM7NzQzLDcgQEAgc3RydWN0IGJ0Zl9yZWNvcmQgKmJ0Zl9yZWNvcmRfZHVwKGNvbnN0IHN0cnVjdCBidGZfcmVjb3JkICpyZWMpCiAJCWNhc2UgQlBGX1JFRkNPVU5UOgogCQljYXNlIEJQRl9XT1JLUVVFVUU6CiAJCWNhc2UgQlBGX1RBU0tfV09SSzoKJiM0MzsJCWNhc2UgQlBGX1RIUkVBRF9XUToKIAkJCS8qIE5vdGhpbmcgdG8gYWNxdWlyZSAqLwogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CkBAIC04MDcsNiAmIzQzOzgwOSwxMyBAQCB2b2lkIGJwZl9vYmpfZnJlZV90YXNrX3dvcmsoY29uc3Qgc3RydWN0IGJ0Zl9yZWNvcmQgKnJlYywgdm9pZCAqb2JqKQogCWJwZl90YXNrX3dvcmtfY2FuY2VsX2FuZF9mcmVlKG9iaiAmIzQzOyByZWMtJmd0O3Rhc2tfd29ya19vZmYpOwogfQogCiYjNDM7dm9pZCBicGZfb2JqX2ZyZWVfdGhyZWFkX3dxKGNvbnN0IHN0cnVjdCBidGZfcmVjb3JkICpyZWMsIHZvaWQgKm9iaikKJiM0Mzt7CiYjNDM7CWlmIChXQVJOX09OX09OQ0UoIWJ0Zl9yZWNvcmRfaGFzX2ZpZWxkKHJlYywgQlBGX1RIUkVBRF9XUSkpKQomIzQzOwkJcmV0dXJuOwomIzQzOwlicGZfdGhyZWFkX3dxX2NhbmNlbF9hbmRfZnJlZShvYmogJiM0MzsgcmVjLSZndDt0aHJlYWRfd3Ffb2ZmKTsKJiM0Mzt9CiYjNDM7CiB2b2lkIGJwZl9vYmpfY2FuY2VsX2ZpZWxkcyhzdHJ1Y3QgYnBmX21hcCAqbWFwLCB2b2lkICpvYmopCiB7CiAJYnBmX21hcF9mcmVlX2ludGVybmFsX3N0cnVjdHMobWFwLCBvYmopOwpAQCAtODM5LDYgJiM0Mzs4NDgsOSBAQCB2b2lkIGJwZl9vYmpfZnJlZV9maWVsZHMoY29uc3Qgc3RydWN0IGJ0Zl9yZWNvcmQgKnJlYywgdm9pZCAqb2JqKQogCQljYXNlIEJQRl9UQVNLX1dPUks6CiAJCQlicGZfdGFza193b3JrX2NhbmNlbF9hbmRfZnJlZShmaWVsZF9wdHIpOwogCQkJYnJlYWs7CiYjNDM7CQljYXNlIEJQRl9USFJFQURfV1E6CiYjNDM7CQkJYnBmX3RocmVhZF93cV9jYW5jZWxfYW5kX2ZyZWUoZmllbGRfcHRyKTsKJiM0MzsJCQlicmVhazsKIAkJY2FzZSBCUEZfS1BUUl9VTlJFRjoKIAkJCVdSSVRFX09OQ0UoKih1NjQgKilmaWVsZF9wdHIsIDApOwogCQkJYnJlYWs7CkBAIC0xMjY1LDcgJiM0MzsxMjc3LDcgQEAgc3RhdGljIGludCBtYXBfY2hlY2tfYnRmKHN0cnVjdCBicGZfbWFwICptYXAsIHN0cnVjdCBicGZfdG9rZW4gKnRva2VuLAogCW1hcC0mZ3Q7cmVjb3JkID0gYnRmX3BhcnNlX2ZpZWxkcyhidGYsIHZhbHVlX3R5cGUsCiAJCQkJICAgICAgIEJQRl9TUElOX0xPQ0sgfCBCUEZfUkVTX1NQSU5fTE9DSyB8IEJQRl9USU1FUiB8IEJQRl9LUFRSIHwgQlBGX0xJU1RfSEVBRCB8CiAJCQkJICAgICAgIEJQRl9SQl9ST09UIHwgQlBGX1JFRkNPVU5UIHwgQlBGX1dPUktRVUVVRSB8IEJQRl9VUFRSIHwKLQkJCQkgICAgICAgQlBGX1RBU0tfV09SSywKJiM0MzsJCQkJICAgICAgIEJQRl9UQVNLX1dPUksgfCBCUEZfVEhSRUFEX1dRLAogCQkJCSAgICAgICBtYXAtJmd0O3ZhbHVlX3NpemUpOwogCWlmICghSVNfRVJSX09SX05VTEwobWFwLSZndDtyZWNvcmQpKSB7CiAJCWludCBpOwpAQCAtMTI5OSw2ICYjNDM7MTMxMSw3IEBAIHN0YXRpYyBpbnQgbWFwX2NoZWNrX2J0ZihzdHJ1Y3QgYnBmX21hcCAqbWFwLCBzdHJ1Y3QgYnBmX3Rva2VuICp0b2tlbiwKIAkJCWNhc2UgQlBGX1RJTUVSOgogCQkJY2FzZSBCUEZfV09SS1FVRVVFOgogCQkJY2FzZSBCUEZfVEFTS19XT1JLOgomIzQzOwkJCWNhc2UgQlBGX1RIUkVBRF9XUToKIAkJCQlpZiAobWFwLSZndDttYXBfdHlwZSAhPSBCUEZfTUFQX1RZUEVfSEFTSCAmYW1wOyZhbXA7CiAJCQkJICAgIG1hcC0mZ3Q7bWFwX3R5cGUgIT0gQlBGX01BUF9UWVBFX1JIQVNIICZhbXA7JmFtcDsKIAkJCQkgICAgbWFwLSZndDttYXBfdHlwZSAhPSBCUEZfTUFQX1RZUEVfTFJVX0hBU0ggJmFtcDsmYW1wOwpkaWZmIC0tZ2l0IGEva2VybmVsL2JwZi92ZXJpZmllci5jIGIva2VybmVsL2JwZi92ZXJpZmllci5jCmluZGV4IGU2MjMzYzAwODFkMTAuLjQ0ZTc5ZmU0ODBiNmIgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9icGYvdmVyaWZpZXIuYwomIzQzOyYjNDM7JiM0MzsgYi9rZXJuZWwvYnBmL3ZlcmlmaWVyLmMKQEAgLTQ3Nyw2ICYjNDM7NDc3LDcgQEAgc3RhdGljIGJvb2wgaXNfYXN5bmNfY2FsbGJhY2tfY2FsbGluZ19rZnVuYyh1MzIgYnRmX2lkKTsKIHN0YXRpYyBib29sIGlzX2NhbGxiYWNrX2NhbGxpbmdfa2Z1bmModTMyIGJ0Zl9pZCk7CiAKIHN0YXRpYyBib29sIGlzX2JwZl93cV9zZXRfY2FsbGJhY2tfa2Z1bmModTMyIGJ0Zl9pZCk7CiYjNDM7c3RhdGljIGJvb2wgaXNfYnBmX3RocmVhZF93cV9zZXRfY2FsbGJhY2tfa2Z1bmModTMyIGJ0Zl9pZCk7CiBzdGF0aWMgYm9vbCBpc190YXNrX3dvcmtfYWRkX2tmdW5jKHUzMiBmdW5jX2lkKTsKIAogc3RhdGljIGJvb2wgaXNfc3luY19jYWxsYmFja19jYWxsaW5nX2Z1bmN0aW9uKGVudW0gYnBmX2Z1bmNfaWQgZnVuY19pZCkKQEAgLTUxNiw5ICYjNDM7NTE3LDExIEBAIHN0YXRpYyBib29sIGlzX2FzeW5jX2NiX3NsZWVwYWJsZShzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52LCBzdHJ1Y3QgYnBmX2luc24KIAlpZiAoYnBmX2hlbHBlcl9jYWxsKGluc24pICZhbXA7JmFtcDsgaW5zbi0mZ3Q7aW1tID09IEJQRl9GVU5DX3RpbWVyX3NldF9jYWxsYmFjaykKIAkJcmV0dXJuIGZhbHNlOwogCi0JLyogYnBmX3dxIGFuZCBicGZfdGFza193b3JrIGNhbGxiYWNrcyBhcmUgYWx3YXlzIHNsZWVwYWJsZS4gKi8KJiM0MzsJLyogYnBmX3dxLCBicGZfdGhyZWFkX3dxIGFuZCBicGZfdGFza193b3JrIGNhbGxiYWNrcyBhcmUgYWx3YXlzIHNsZWVwYWJsZS4gKi8KIAlpZiAoYnBmX3BzZXVkb19rZnVuY19jYWxsKGluc24pICZhbXA7JmFtcDsgaW5zbi0mZ3Q7b2ZmID09IDAgJmFtcDsmYW1wOwotCSAgICAoaXNfYnBmX3dxX3NldF9jYWxsYmFja19rZnVuYyhpbnNuLSZndDtpbW0pIHx8IGlzX3Rhc2tfd29ya19hZGRfa2Z1bmMoaW5zbi0mZ3Q7aW1tKSkpCiYjNDM7CSAgICAoaXNfYnBmX3dxX3NldF9jYWxsYmFja19rZnVuYyhpbnNuLSZndDtpbW0pIHx8CiYjNDM7CSAgICAgaXNfYnBmX3RocmVhZF93cV9zZXRfY2FsbGJhY2tfa2Z1bmMoaW5zbi0mZ3Q7aW1tKSB8fAomIzQzOwkgICAgIGlzX3Rhc2tfd29ya19hZGRfa2Z1bmMoaW5zbi0mZ3Q7aW1tKSkpCiAJCXJldHVybiB0cnVlOwogCiAJdmVyaWZpZXJfYnVnKGVudiwgJiMzNDt1bmhhbmRsZWQgYXN5bmMgY2FsbGJhY2sgaW4gaXNfYXN5bmNfY2Jfc2xlZXBhYmxlJiMzNDspOwpAQCAtMTg3MSw3ICYjNDM7MTg3NCwxMCBAQCBzdGF0aWMgdm9pZCByZWZpbmVfbWFwX2xvb2t1cF92YWx1ZShzdHJ1Y3QgYnBmX3JlZ19zdGF0ZSAqcmVnKQogCQkgKiBhcyBVSUQgb2YgdGhlIGlubmVyIG1hcC4KIAkJICovCiAJCWlmIChidGZfcmVjb3JkX2hhc19maWVsZChtYXAtJmd0O2lubmVyX21hcF9tZXRhLSZndDtyZWNvcmQsCi0JCQkJCSBCUEZfVElNRVIgfCBCUEZfV09SS1FVRVVFIHwgQlBGX1RBU0tfV09SSykpCiYjNDM7CQkJCQkgQlBGX1RJTUVSIHwKJiM0MzsJCQkJCSBCUEZfV09SS1FVRVVFIHwKJiM0MzsJCQkJCSBCUEZfVEFTS19XT1JLIHwKJiM0MzsJCQkJCSBCUEZfVEhSRUFEX1dRKSkKIAkJCXJlZy0mZ3Q7bWFwX3VpZCA9IHJlZy0mZ3Q7aWQ7CiAJfSBlbHNlIGlmIChtYXAtJmd0O21hcF90eXBlID09IEJQRl9NQVBfVFlQRV9YU0tNQVApIHsKIAkJcmVnLSZndDt0eXBlID0gUFRSX1RPX1hEUF9TT0NLIHwgbWF5YmVfbnVsbDsKQEAgLTcyNDMsNiAmIzQzOzcyNDksOSBAQCBzdGF0aWMgaW50IGNoZWNrX21hcF9maWVsZF9wb2ludGVyKHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsIHN0cnVjdCBicGZfcmVnXwogCWNhc2UgQlBGX1dPUktRVUVVRToKIAkJZmllbGRfb2ZmID0gbWFwLSZndDtyZWNvcmQtJmd0O3dxX29mZjsKIAkJYnJlYWs7CiYjNDM7CWNhc2UgQlBGX1RIUkVBRF9XUToKJiM0MzsJCWZpZWxkX29mZiA9IG1hcC0mZ3Q7cmVjb3JkLSZndDt0aHJlYWRfd3Ffb2ZmOwomIzQzOwkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJdmVyaWZpZXJfYnVnKGVudiwgJiMzNDt1bnN1cHBvcnRlZCBCVEYgZmllbGQgdHlwZTogJXNcbiYjMzQ7LCBzdHJ1Y3RfbmFtZSk7CiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMTA5NDAsNiAmIzQzOzEwOTQ5LDcgQEAgZW51bSB7CiAJS0ZfQVJHX1dPUktRVUVVRV9JRCwKIAlLRl9BUkdfUkVTX1NQSU5fTE9DS19JRCwKIAlLRl9BUkdfVEFTS19XT1JLX0lELAomIzQzOwlLRl9BUkdfVEhSRUFEX1dRX0lELAogCUtGX0FSR19QUk9HX0FVWF9JRCwKIAlLRl9BUkdfVElNRVJfSUQKIH07CkBAIC0xMDk1Myw2ICYjNDM7MTA5NjMsNyBAQCBCVEZfSUQoc3RydWN0LCBicGZfcmJfbm9kZSkKIEJURl9JRChzdHJ1Y3QsIGJwZl93cSkKIEJURl9JRChzdHJ1Y3QsIGJwZl9yZXNfc3Bpbl9sb2NrKQogQlRGX0lEKHN0cnVjdCwgYnBmX3Rhc2tfd29yaykKJiM0MztCVEZfSUQoc3RydWN0LCBicGZfdGhyZWFkX3dxKQogQlRGX0lEKHN0cnVjdCwgYnBmX3Byb2dfYXV4KQogQlRGX0lEKHN0cnVjdCwgYnBmX3RpbWVyKQogCkBAIC0xMTAxMyw2ICYjNDM7MTEwMjQsMTEgQEAgc3RhdGljIGJvb2wgaXNfa2Z1bmNfYXJnX3Rhc2tfd29yayhjb25zdCBzdHJ1Y3QgYnRmICpidGYsIGNvbnN0IHN0cnVjdCBidGZfcGFyYW0KIAlyZXR1cm4gX19pc19rZnVuY19wdHJfYXJnX3R5cGUoYnRmLCBhcmcsIEtGX0FSR19UQVNLX1dPUktfSUQpOwogfQogCiYjNDM7c3RhdGljIGJvb2wgaXNfa2Z1bmNfYXJnX3RocmVhZF93cShjb25zdCBzdHJ1Y3QgYnRmICpidGYsIGNvbnN0IHN0cnVjdCBidGZfcGFyYW0gKmFyZykKJiM0Mzt7CiYjNDM7CXJldHVybiBfX2lzX2tmdW5jX3B0cl9hcmdfdHlwZShidGYsIGFyZywgS0ZfQVJHX1RIUkVBRF9XUV9JRCk7CiYjNDM7fQomIzQzOwogc3RhdGljIGJvb2wgaXNfa2Z1bmNfYXJnX3Jlc19zcGluX2xvY2soY29uc3Qgc3RydWN0IGJ0ZiAqYnRmLCBjb25zdCBzdHJ1Y3QgYnRmX3BhcmFtICphcmcpCiB7CiAJcmV0dXJuIF9faXNfa2Z1bmNfcHRyX2FyZ190eXBlKGJ0ZiwgYXJnLCBLRl9BUkdfUkVTX1NQSU5fTE9DS19JRCk7CkBAIC0xMTEzMiw2ICYjNDM7MTExNDgsNyBAQCBlbnVtIGtmdW5jX3B0cl9hcmdfdHlwZSB7CiAJS0ZfQVJHX1BUUl9UT19JUlFfRkxBRywKIAlLRl9BUkdfUFRSX1RPX1JFU19TUElOX0xPQ0ssCiAJS0ZfQVJHX1BUUl9UT19UQVNLX1dPUkssCiYjNDM7CUtGX0FSR19QVFJfVE9fVEhSRUFEX1dRLAogfTsKIAogZW51bSBzcGVjaWFsX2tmdW5jX3R5cGUgewpAQCAtMTExNzgsNiAmIzQzOzExMTk1LDcgQEAgZW51bSBzcGVjaWFsX2tmdW5jX3R5cGUgewogCUtGX2JwZl9wZXJjcHVfb2JqX2Ryb3AsCiAJS0ZfYnBmX3Rocm93LAogCUtGX2JwZl93cV9zZXRfY2FsbGJhY2ssCiYjNDM7CUtGX2JwZl90aHJlYWRfd3Ffc2V0X2NhbGxiYWNrLAogCUtGX2JwZl9wcmVlbXB0X2Rpc2FibGUsCiAJS0ZfYnBmX3ByZWVtcHRfZW5hYmxlLAogCUtGX2JwZl9pdGVyX2Nzc190YXNrX25ldywKQEAgLTExMjU4LDYgJiM0MzsxMTI3Niw3IEBAIEJURl9JRChmdW5jLCBicGZfcGVyY3B1X29ial9kcm9wX2ltcGwpCiBCVEZfSUQoZnVuYywgYnBmX3BlcmNwdV9vYmpfZHJvcCkKIEJURl9JRChmdW5jLCBicGZfdGhyb3cpCiBCVEZfSUQoZnVuYywgYnBmX3dxX3NldF9jYWxsYmFjaykKJiM0MztCVEZfSUQoZnVuYywgYnBmX3RocmVhZF93cV9zZXRfY2FsbGJhY2spCiBCVEZfSUQoZnVuYywgYnBmX3ByZWVtcHRfZGlzYWJsZSkKIEJURl9JRChmdW5jLCBicGZfcHJlZW1wdF9lbmFibGUpCiAjaWZkZWYgQ09ORklHX0NHUk9VUFMKQEAgLTExNDYwLDYgJiM0MzsxMTQ3OSw4IEBAIGdldF9rZnVuY19hcmdfdHlwZShzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52LCBzdHJ1Y3QgYnBmX2NhbGxfYXJnX21ldGEgKm1ldGEsCiAJCWFyZ190eXBlID0gS0ZfQVJHX1BUUl9UT19USU1FUjsKIAllbHNlIGlmIChpc19rZnVuY19hcmdfdGFza193b3JrKG1ldGEtJmd0O2J0ZiwgJmFtcDthcmdzW2FyZ10pKQogCQlhcmdfdHlwZSA9IEtGX0FSR19QVFJfVE9fVEFTS19XT1JLOwomIzQzOwllbHNlIGlmIChpc19rZnVuY19hcmdfdGhyZWFkX3dxKG1ldGEtJmd0O2J0ZiwgJmFtcDthcmdzW2FyZ10pKQomIzQzOwkJYXJnX3R5cGUgPSBLRl9BUkdfUFRSX1RPX1RIUkVBRF9XUTsKIAllbHNlIGlmIChpc19rZnVuY19hcmdfaXJxX2ZsYWcobWV0YS0mZ3Q7YnRmLCAmYW1wO2FyZ3NbYXJnXSkpCiAJCWFyZ190eXBlID0gS0ZfQVJHX1BUUl9UT19JUlFfRkxBRzsKIAllbHNlIGlmIChpc19rZnVuY19hcmdfcmVzX3NwaW5fbG9jayhtZXRhLSZndDtidGYsICZhbXA7YXJnc1thcmddKSkKQEAgLTExODMzLDYgJiM0MzsxMTg1NCw3IEBAIHN0YXRpYyBib29sIGlzX3N5bmNfY2FsbGJhY2tfY2FsbGluZ19rZnVuYyh1MzIgYnRmX2lkKQogc3RhdGljIGJvb2wgaXNfYXN5bmNfY2FsbGJhY2tfY2FsbGluZ19rZnVuYyh1MzIgYnRmX2lkKQogewogCXJldHVybiBpc19icGZfd3Ffc2V0X2NhbGxiYWNrX2tmdW5jKGJ0Zl9pZCkgfHwKJiM0MzsJICAgICAgIGlzX2JwZl90aHJlYWRfd3Ffc2V0X2NhbGxiYWNrX2tmdW5jKGJ0Zl9pZCkgfHwKIAkgICAgICAgaXNfdGFza193b3JrX2FkZF9rZnVuYyhidGZfaWQpOwogfQogCkBAIC0xMTg0Nyw2ICYjNDM7MTE4NjksMTEgQEAgc3RhdGljIGJvb2wgaXNfYnBmX3dxX3NldF9jYWxsYmFja19rZnVuYyh1MzIgYnRmX2lkKQogCXJldHVybiBidGZfaWQgPT0gc3BlY2lhbF9rZnVuY19saXN0W0tGX2JwZl93cV9zZXRfY2FsbGJhY2tdOwogfQogCiYjNDM7c3RhdGljIGJvb2wgaXNfYnBmX3RocmVhZF93cV9zZXRfY2FsbGJhY2tfa2Z1bmModTMyIGJ0Zl9pZCkKJiM0Mzt7CiYjNDM7CXJldHVybiBidGZfaWQgPT0gc3BlY2lhbF9rZnVuY19saXN0W0tGX2JwZl90aHJlYWRfd3Ffc2V0X2NhbGxiYWNrXTsKJiM0Mzt9CiYjNDM7CiBzdGF0aWMgYm9vbCBpc19jYWxsYmFja19jYWxsaW5nX2tmdW5jKHUzMiBidGZfaWQpCiB7CiAJcmV0dXJuIGlzX3N5bmNfY2FsbGJhY2tfY2FsbGluZ19rZnVuYyhidGZfaWQpIHx8CkBAIC0xMjE5Miw2ICYjNDM7MTIyMTksNyBAQCBzdGF0aWMgaW50IGNoZWNrX2tmdW5jX2FyZ3Moc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudiwgc3RydWN0IGJwZl9jYWxsX2FyZ19tZQogCQljYXNlIEtGX0FSR19QVFJfVE9fV09SS1FVRVVFOgogCQljYXNlIEtGX0FSR19QVFJfVE9fVElNRVI6CiAJCWNhc2UgS0ZfQVJHX1BUUl9UT19UQVNLX1dPUks6CiYjNDM7CQljYXNlIEtGX0FSR19QVFJfVE9fVEhSRUFEX1dROgogCQljYXNlIEtGX0FSR19QVFJfVE9fSVJRX0ZMQUc6CiAJCWNhc2UgS0ZfQVJHX1BUUl9UT19SRVNfU1BJTl9MT0NLOgogCQkJYnJlYWs7CkBAIC0xMzEzOSw2ICYjNDM7MTMxNjcsMTYgQEAgc3RhdGljIGludCBjaGVja19rZnVuY19jYWxsKHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsIHN0cnVjdCBicGZfaW5zbiAqaW5zbiwKIAkJfQogCX0KIAomIzQzOwlpZiAoaXNfYnBmX3RocmVhZF93cV9zZXRfY2FsbGJhY2tfa2Z1bmMobWV0YS5mdW5jX2lkKSkgewomIzQzOwkJZXJyID0gcHVzaF9jYWxsYmFja19jYWxsKGVudiwgaW5zbiwgaW5zbl9pZHgsIG1ldGEuc3VicHJvZ25vLAomIzQzOwkJCQkJIHNldF90aW1lcl9jYWxsYmFja19zdGF0ZSk7CiYjNDM7CQlpZiAoZXJyKSB7CiYjNDM7CQkJdmVyYm9zZShlbnYsICYjMzQ7a2Z1bmMgJXMjJWQgZmFpbGVkIGNhbGxiYWNrIHZlcmlmaWNhdGlvblxuJiMzNDssCiYjNDM7CQkJCWZ1bmNfbmFtZSwgbWV0YS5mdW5jX2lkKTsKJiM0MzsJCQlyZXR1cm4gZXJyOwomIzQzOwkJfQomIzQzOwl9CiYjNDM7CiAJaWYgKGlzX3Rhc2tfd29ya19hZGRfa2Z1bmMobWV0YS5mdW5jX2lkKSkgewogCQllcnIgPSBwdXNoX2NhbGxiYWNrX2NhbGwoZW52LCBpbnNuLCBpbnNuX2lkeCwgbWV0YS5zdWJwcm9nbm8sCiAJCQkJCSBzZXRfdGFza193b3JrX3NjaGVkdWxlX2NhbGxiYWNrX3N0YXRlKTsKZGlmZiAtLWdpdCBhL2tlcm5lbC9jZ3JvdXAvY2dyb3VwLmMgYi9rZXJuZWwvY2dyb3VwL2Nncm91cC5jCmluZGV4IDM4ZjhkOWRmOGZiYzQuLjE2NGUwNjljNzU3NjIgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9jZ3JvdXAvY2dyb3VwLmMKJiM0MzsmIzQzOyYjNDM7IGIva2VybmVsL2Nncm91cC9jZ3JvdXAuYwpAQCAtMzA0Miw2ICYjNDM7MzA0MiwxOSBAQCBpbnQgY2dyb3VwX2F0dGFjaF90YXNrKHN0cnVjdCBjZ3JvdXAgKmRzdF9jZ3JwLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKmxlYWRlciwKIAlyZXR1cm4gcmV0OwogfQogCiYjNDM7aW50IGNncm91cF9rdGhyZWFkX2F0dGFjaChzdHJ1Y3QgY2dyb3VwICpjZ3JwLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spCiYjNDM7ewomIzQzOwlpbnQgcmV0OwomIzQzOwomIzQzOwljZ3JvdXBfbG9jaygpOwomIzQzOwljZ3JvdXBfYXR0YWNoX2xvY2soQ0dSUF9BVFRBQ0hfTE9DS19HTE9CQUwsIE5VTEwpOwomIzQzOwlyZXQgPSBjZ3JvdXBfYXR0YWNoX3Rhc2soY2dycCwgdGFzaywgZmFsc2UpOwomIzQzOwljZ3JvdXBfYXR0YWNoX3VubG9jayhDR1JQX0FUVEFDSF9MT0NLX0dMT0JBTCwgTlVMTCk7CiYjNDM7CWNncm91cF91bmxvY2soKTsKJiM0MzsKJiM0MzsJcmV0dXJuIHJldDsKJiM0Mzt9CiYjNDM7CiBzdHJ1Y3QgdGFza19zdHJ1Y3QgKmNncm91cF9wcm9jc193cml0ZV9zdGFydChjaGFyICpidWYsIGJvb2wgdGhyZWFkZ3JvdXAsCiAJCQkJCSAgICAgZW51bSBjZ3JvdXBfYXR0YWNoX2xvY2tfbW9kZSAqbG9ja19tb2RlKQogewpkaWZmIC0tZ2l0IGEvbW0vYnBmX21lbWNvbnRyb2wuYyBiL21tL2JwZl9tZW1jb250cm9sLmMKaW5kZXggNzE2ZGY0OWQ3NjQ3Ny4uM2Y3YTVjOTdlMTM1NSAxMDA2NDQKLS0tIGEvbW0vYnBmX21lbWNvbnRyb2wuYwomIzQzOyYjNDM7JiM0MzsgYi9tbS9icGZfbWVtY29udHJvbC5jCkBAIC02LDYgJiM0Mzs2LDcgQEAKICAqLwogCiAjaW5jbHVkZSAmbHQ7bGludXgvbWVtY29udHJvbC5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9zd2FwLmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7bGludXgvYnBmLmgmZ3Q7CiAKIF9fYnBmX2tmdW5jX3N0YXJ0X2RlZnMoKTsKQEAgLTE1OSw2ICYjNDM7MTYwLDYxIEBAIF9fYnBmX2tmdW5jIHZvaWQgYnBmX21lbV9jZ3JvdXBfZmx1c2hfc3RhdHMoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnKQogCW1lbV9jZ3JvdXBfZmx1c2hfc3RhdHMobWVtY2cpOwogfQogCiYjNDM7LyoqCiYjNDM7ICogYnBmX3RyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMgLSBhdHRlbXB0IHRvIHJlY2xhaW0gcGFnZXMgZnJvbQomIzQzOyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSBtZW1vcnkgY2dyb3VwCiYjNDM7ICogQG1lbWNnOiAgICAgICAgICAgdGhlIHRhcmdldCBtZW1vcnkgY2dyb3VwIHRvIHJlY2xhaW0gZnJvbQomIzQzOyAqIEBucl9wYWdlczogICAgICAgIHRoZSBudW1iZXIgb2YgcGFnZXMgdG8gcmVjbGFpbQomIzQzOyAqIEBnZnBfbWFzazogICAgICAgIEdGUCBmbGFncyBjb250cm9sbGluZyB0aGUgcmVjbGFpbSBiZWhhdmlvcgomIzQzOyAqIEByZWNsYWltX29wdGlvbnM6IGJpdG1hc2sgb2YgTUVNQ0dfUkVDTEFJTV8qIGZsYWdzIHRvIHR1bmUKJiM0MzsgKiAgICAgICAgICAgICAgICAgICByZWNsYWltIHN0cmF0ZWd5CiYjNDM7ICogQHN3YXBwaW5lc3M6ICAgICAgc3dhcHBpbmVzcyBvdmVycmlkZSB2YWx1ZSwgb3IgYSBzZW50aW5lbCB0byB1c2UKJiM0MzsgKiAgICAgICAgICAgICAgICAgICB0aGUgZGVmYXVsdAomIzQzOyAqCiYjNDM7ICogQlBGLWZhY2luZyB3cmFwcGVyIGFyb3VuZCB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKCkgdGhhdAomIzQzOyAqIHZhbGlkYXRlcyBhbmQgdHJhbnNsYXRlcyB0aGUgQHN3YXBwaW5lc3MgYXJndW1lbnQgYmVmb3JlCiYjNDM7ICogZGVsZWdhdGluZyB0byB0aGUgY29yZSByZWNsYWltIHBhdGguCiYjNDM7ICoKJiM0MzsgKiBUaGUgQHN3YXBwaW5lc3MgcGFyYW1ldGVyIGZvbGxvd3MgdGhlc2Ugc2VtYW50aWNzOgomIzQzOyAqICAgLSBWYWx1ZXMgaW4gW01JTl9TV0FQUElORVNTLCBTV0FQUElORVNTX0FOT05fT05MWV0gYXJlIHBhc3NlZAomIzQzOyAqICAgICB0aHJvdWdoIGFzIGFuIGV4cGxpY2l0IHN3YXBwaW5lc3Mgb3ZlcnJpZGUuCiYjNDM7ICogICAtIFZhbHVlcyBiZWxvdyBNSU5fU1dBUFBJTkVTUyBhcmUgdHJlYXRlZCBhcyAmIzM0O3VzZSB0aGUgc3lzdGVtCiYjNDM7ICogICAgIGRlZmF1bHQmIzM0OzsgdGhlIG92ZXJyaWRlIHBvaW50ZXIgaXMgc2V0IHRvIE5VTEwgYW5kIHRoZSBjZ3JvdXAmIzM5O3MKJiM0MzsgKiAgICAgb3duIHN3YXBwaW5lc3Mgc2V0dGluZyB0YWtlcyBlZmZlY3QuCiYjNDM7ICogICAtIFZhbHVlcyBhYm92ZSBTV0FQUElORVNTX0FOT05fT05MWSBhcmUgcmVqZWN0ZWQgYXMgaW52YWxpZC4KJiM0MzsgKiAgIC0gSWYgQHJlY2xhaW1fb3B0aW9ucyBkb2VzIG5vdCBpbmNsdWRlIE1FTUNHX1JFQ0xBSU1fUFJPQUNUSVZFLAomIzQzOyAqICAgICB0aGUgQHN3YXBwaW5lc3Mgb3ZlcnJpZGUgaXMgaWdub3JlZCBlbnRpcmVseSBieSB0aGUgY29yZQomIzQzOyAqICAgICByZWNsYWltIHBhdGggYW5kIHRoZSBzeXN0ZW0gZGVmYXVsdCBpcyB1c2VkIHJlZ2FyZGxlc3MuCiYjNDM7ICoKJiM0MzsgKiBTd2FwIHVzYWdlIGR1cmluZyByZWNsYWltIGlzIGdhdGVkIG9uIEByZWNsYWltX29wdGlvbnM6IHN3YXAgaXMKJiM0MzsgKiBjb25zaWRlcmVkIG9ubHkgd2hlbiBNRU1DR19SRUNMQUlNX01BWV9TV0FQIGlzIHNldC4gIFdpdGhvdXQgdGhpcwomIzQzOyAqIGZsYWcsIHJlY2xhaW0gaXMgcmVzdHJpY3RlZCB0byBmaWxlLWJhY2tlZCBwYWdlcyByZWdhcmRsZXNzIG9mIHRoZQomIzQzOyAqIEBzd2FwcGluZXNzIHZhbHVlIG9yIHRoZSBjZ3JvdXAmIzM5O3Mgc3dhcHBpbmVzcyBzZXR0aW5nLgomIzQzOyAqCiYjNDM7ICogUmV0dXJuOgomIzQzOyAqICAgVGhlIG51bWJlciBvZiBwYWdlcyBhY3R1YWxseSByZWNsYWltZWQgb24gc3VjY2Vzcywgb3IgMAomIzQzOyAqICAgaWYgQHN3YXBwaW5lc3MgZXhjZWVkcyBTV0FQUElORVNTX0FOT05fT05MWS4KJiM0MzsgKi8KJiM0MztfX2JwZl9rZnVuYyB1bnNpZ25lZCBsb25nCiYjNDM7YnBmX3RyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLAomIzQzOwkJCQkgdW5zaWduZWQgbG9uZyBucl9wYWdlcywKJiM0MzsJCQkJIGdmcF90IGdmcF9tYXNrLAomIzQzOwkJCQkgdW5zaWduZWQgaW50IHJlY2xhaW1fb3B0aW9ucywKJiM0MzsJCQkJIGludCBzd2FwcGluZXNzKQomIzQzO3sKJiM0MzsJaW50ICpzd2FwaW5lc3NfcHRyOwomIzQzOwomIzQzOwlpZiAoc3dhcHBpbmVzcyAmZ3Q7IFNXQVBQSU5FU1NfQU5PTl9PTkxZKQomIzQzOwkJcmV0dXJuIDA7CiYjNDM7CWVsc2UgaWYgKHN3YXBwaW5lc3MgJmx0OyBNSU5fU1dBUFBJTkVTUykKJiM0MzsJCXN3YXBpbmVzc19wdHIgPSBOVUxMOwomIzQzOwllbHNlCiYjNDM7CQlzd2FwaW5lc3NfcHRyID0gJmFtcDtzd2FwcGluZXNzOwomIzQzOwomIzQzOwlyZXR1cm4gdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcyhtZW1jZywgbnJfcGFnZXMsIGdmcF9tYXNrLAomIzQzOwkJCQkJICAgIHJlY2xhaW1fb3B0aW9ucywgc3dhcGluZXNzX3B0cik7CiYjNDM7fQomIzQzOwogX19icGZfa2Z1bmNfZW5kX2RlZnMoKTsKIAogQlRGX0tGVU5DU19TVEFSVChicGZfbWVtY29udHJvbF9rZnVuY3MpCkBAIC0xNzIsNiAmIzQzOzIyOCw4IEBAIEJURl9JRF9GTEFHUyhmdW5jLCBicGZfbWVtX2Nncm91cF91c2FnZSkKIEJURl9JRF9GTEFHUyhmdW5jLCBicGZfbWVtX2Nncm91cF9wYWdlX3N0YXRlKQogQlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9tZW1fY2dyb3VwX2ZsdXNoX3N0YXRzLCBLRl9TTEVFUEFCTEUpCiAKJiM0MztCVEZfSURfRkxBR1MoZnVuYywgYnBmX3RyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMsIEtGX1NMRUVQQUJMRSkKJiM0MzsKIEJURl9LRlVOQ1NfRU5EKGJwZl9tZW1jb250cm9sX2tmdW5jcykKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBidGZfa2Z1bmNfaWRfc2V0IGJwZl9tZW1jb250cm9sX2tmdW5jX3NldCA9IHsKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9icGZfZXhwZXJpbWVudGFsLmggYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvYnBmX2V4cGVyaW1lbnRhbC5oCmluZGV4IGZmMzdhZTVhMTEzZGMuLmVhOTA1ZWE1NjAzYzIgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9icGZfZXhwZXJpbWVudGFsLmgKJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL2JwZl9leHBlcmltZW50YWwuaApAQCAtMzUxLDYgJiM0MzszNTEsMTMgQEAgZXh0ZXJuIHZvaWQgYnBmX2l0ZXJfY3NzX2Rlc3Ryb3koc3RydWN0IGJwZl9pdGVyX2NzcyAqaXQpIF9fd2VhayBfX2tzeW07CiBleHRlcm4gaW50IGJwZl93cV9pbml0KHN0cnVjdCBicGZfd3EgKndxLCB2b2lkICpwX19tYXAsIHVuc2lnbmVkIGludCBmbGFncykgX193ZWFrIF9fa3N5bTsKIGV4dGVybiBpbnQgYnBmX3dxX3N0YXJ0KHN0cnVjdCBicGZfd3EgKndxLCB1bnNpZ25lZCBpbnQgZmxhZ3MpIF9fd2VhayBfX2tzeW07CiAKJiM0MztzdHJ1Y3QgYnBmX3RocmVhZF93cTsKJiM0MztleHRlcm4gaW50IGJwZl90aHJlYWRfd3FfaW5pdChzdHJ1Y3QgYnBmX3RocmVhZF93cSAqdHdxLCB2b2lkICpwX19tYXAsCiYjNDM7CQkJICAgICAgX191NjQgY2dyb3VwX2lkLAomIzQzOwkJCSAgICAgIHVuc2lnbmVkIGludCBmbGFncykgX193ZWFrIF9fa3N5bTsKJiM0MztleHRlcm4gaW50IGJwZl90aHJlYWRfd3Ffc3RhcnQoc3RydWN0IGJwZl90aHJlYWRfd3EgKnR3cSwKJiM0MzsJCQkgICAgICAgdW5zaWduZWQgaW50IGZsYWdzKSBfX3dlYWsgX19rc3ltOwomIzQzOwogc3RydWN0IGJwZl9pdGVyX2ttZW1fY2FjaGU7CiBleHRlcm4gaW50IGJwZl9pdGVyX2ttZW1fY2FjaGVfbmV3KHN0cnVjdCBicGZfaXRlcl9rbWVtX2NhY2hlICppdCkgX193ZWFrIF9fa3N5bTsKIGV4dGVybiBzdHJ1Y3Qga21lbV9jYWNoZSAqYnBmX2l0ZXJfa21lbV9jYWNoZV9uZXh0KHN0cnVjdCBicGZfaXRlcl9rbWVtX2NhY2hlICppdCkgX193ZWFrIF9fa3N5bTsKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL21lbWNnX2FzeW5jX3JlY2xhaW0uYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL21lbWNnX2FzeW5jX3JlY2xhaW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwLi40MGE1ZmU2MmNiMzg0Ci0tLSAvZGV2L251bGwKJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvbWVtY2dfYXN5bmNfcmVjbGFpbS5jCkBAIC0wLDAgJiM0MzsxLDQ3OSBAQAomIzQzOy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wCiYjNDM7LyoKJiM0MzsgKiBNZW1vcnkgY29udHJvbGxlciBlQlBGIGFzeW5jIHJlY2xhaW0gdGVzdAomIzQzOyAqLwomIzQzOwomIzQzOyNpbmNsdWRlICZsdDt0ZXN0X3Byb2dzLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N5cy9tbWFuLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N5cy9zdGF0LmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N5cy90aW1lLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N5cy92ZnMuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7c3lzL3dhaXQuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7ZmNudGwuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvbWFnaWMuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7dW5pc3RkLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N0ZGlvLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N0ZGxpYi5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtzdHJpbmcuaCZndDsKJiM0MzsKJiM0MzsjaW5jbHVkZSAmIzM0O2Nncm91cF9oZWxwZXJzLmgmIzM0OwomIzQzOwomIzQzO3N0cnVjdCBicGZfYXJnc19zIHsKJiM0MzsJdTY0IGhpZ2hfY2dyb3VwX2lkOwomIzQzOwl1NjQgbG93X2Nncm91cF9pZDsKJiM0MzsJdTY0IGV2ZW50X2RlbHRhX3RocmVzaG9sZDsKJiM0MzsJdTY0IGNoZWNrX25zOwomIzQzO307CiYjNDM7CiYjNDM7I2luY2x1ZGUgJiMzNDttZW1jZ19hc3luY19yZWNsYWltLnNrZWwuaCYjMzQ7CiYjNDM7CiYjNDM7I2RlZmluZSBGSUxFX1NJWkUgKDMyICogMTAyNCAqIDEwMjR1bCkKJiM0MzsjZGVmaW5lIEJVRkZFUl9TSVpFICg0MDk2KQomIzQzOyNkZWZpbmUgQ0dfTElNSVQgKDMyICogMTAyNCAqIDEwMjR1bCkKJiM0MzsjZGVmaW5lIFJFQURfVElNRVMgMTYKJiM0MzsKJiM0MzsjZGVmaW5lIENHX0RJUiAmIzM0Oy9tZW1jZ19hc3luY19yZWNsYWltJiMzNDsKJiM0MzsjZGVmaW5lIENHX0hJR0hfRElSIENHX0RJUiAmIzM0Oy9oaWdoJiMzNDsKJiM0MzsjZGVmaW5lIENHX0xPV19ESVIgQ0dfRElSICYjMzQ7L2xvdyYjMzQ7CiYjNDM7CiYjNDM7I2RlZmluZSBDSEVDS19QRVJJT0RfTlMgKDIgKiAxMDAwICogMTAwMHVsbCkKJiM0MzsjZGVmaW5lIEVWRU5UX0RFTFRBX1RIUkVTSE9MRCAxCiYjNDM7CiYjNDM7LyoKJiM0MzsgKiBUZXN0IGZpbGVzIG11c3QgcmVzaWRlIG9uIGEgZmlsZXN5c3RlbSB0aGF0IHN1cHBvcnRzIHBhZ2UgcmVjbGFpbSB3aXRob3V0CiYjNDM7ICogc3dhcCAoZS5nLiBleHQ0KS4gSWYgL3RtcCBpcyBvbiB0bXBmcywgdGhlIGZpbGUgcGFnZXMgYXJlIHNobWVtLWJhY2tlZAomIzQzOyAqIGFuZCBjYW4gb25seSBiZSByZWNsYWltZWQgdGhyb3VnaCBzd2FwLiBCdXQgdGhlIHRlc3QgZGlzYWJsZXMgc3dhcAomIzQzOyAqIChtZW1vcnkuc3dhcC5tYXg9MCksIG1ha2luZyByZWNsYWltIGltcG9zc2libGUgYW5kIGNhdXNpbmcgT09NLgomIzQzOyAqCiYjNDM7ICogUGljayBhIGRpcmVjdG9yeSBvbiBhIG5vbi10bXBmcyBmaWxlc3lzdGVtOiB0cnkgJFRNUERJUiBmaXJzdCwgdGhlbiAvdG1wLAomIzQzOyAqIGFuZCBmYWxsIGJhY2sgdG8gdGhlIGN1cnJlbnQgZGlyZWN0b3J5IGlmIHRoZSBjaG9zZW4gcGF0aCBpcyBvbiB0bXBmcy4KJiM0MzsgKi8KJiM0MztzdGF0aWMgaW50IGdldF90ZXN0X2RpcihjaGFyICpidWYsIHNpemVfdCBzaXplKQomIzQzO3sKJiM0MzsJc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBjYW5kaWRhdGVzW10gPSB7ICYjMzQ7L3RtcCYjMzQ7LCAmIzM0Oy4mIzM0OyB9OwomIzQzOwljb25zdCBjaGFyICp0bXBkaXIgPSBnZXRlbnYoJiMzNDtUTVBESVImIzM0Oyk7CiYjNDM7CXN0cnVjdCBzdGF0ZnMgc2ZzOwomIzQzOwlzaXplX3QgaTsKJiM0MzsKJiM0MzsJaWYgKHRtcGRpciAmYW1wOyZhbXA7IHRtcGRpclswXSAmYW1wOyZhbXA7IHN0YXRmcyh0bXBkaXIsICZhbXA7c2ZzKSA9PSAwICZhbXA7JmFtcDsKJiM0MzsJICAgIHNmcy5mX3R5cGUgIT0gVE1QRlNfTUFHSUMpIHsKJiM0MzsJCXNucHJpbnRmKGJ1Ziwgc2l6ZSwgJiMzNDslcyYjMzQ7LCB0bXBkaXIpOwomIzQzOwkJcmV0dXJuIDA7CiYjNDM7CX0KJiM0MzsKJiM0MzsJZm9yIChpID0gMDsgaSAmbHQ7IEFSUkFZX1NJWkUoY2FuZGlkYXRlcyk7IGkmIzQzOyYjNDM7KSB7CiYjNDM7CQlpZiAoc3RhdGZzKGNhbmRpZGF0ZXNbaV0sICZhbXA7c2ZzKSA9PSAwICZhbXA7JmFtcDsKJiM0MzsJCSAgICBzZnMuZl90eXBlICE9IFRNUEZTX01BR0lDKSB7CiYjNDM7CQkJc25wcmludGYoYnVmLCBzaXplLCAmIzM0OyVzJiMzNDssIGNhbmRpZGF0ZXNbaV0pOwomIzQzOwkJCXJldHVybiAwOwomIzQzOwkJfQomIzQzOwl9CiYjNDM7CiYjNDM7CXJldHVybiAtMTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGludCBzZXR1cF9oaWdoX2xvd19jZ3JvdXBzKHU2NCAqaGlnaF9jZ3JvdXBfaWQsIHU2NCAqbG93X2Nncm91cF9pZCkKJiM0Mzt7CiYjNDM7CWludCByZXQ7CiYjNDM7CWNoYXIgbGltaXRfYnVmWzIwXTsKJiM0MzsKJiM0MzsJcmV0ID0gc2V0dXBfY2dyb3VwX2Vudmlyb25tZW50KCk7CiYjNDM7CWlmICghQVNTRVJUX09LKHJldCwgJiMzNDtzZXR1cF9jZ3JvdXBfZW52aXJvbm1lbnQmIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CiYjNDM7CXJldCA9IGNyZWF0ZV9hbmRfZ2V0X2Nncm91cChDR19ESVIpOwomIzQzOwlpZiAoIUFTU0VSVF9HRShyZXQsIDAsICYjMzQ7Y3JlYXRlX2FuZF9nZXRfY2dyb3VwICYjMzQ7IENHX0RJUikpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CWNsb3NlKHJldCk7CiYjNDM7CiYjNDM7CXJldCA9IGVuYWJsZV9jb250cm9sbGVycyhDR19ESVIsICYjMzQ7bWVtb3J5JiMzNDspOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhyZXQsICYjMzQ7ZW5hYmxlX2NvbnRyb2xsZXJzJiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwomIzQzOwlzbnByaW50ZihsaW1pdF9idWYsIHNpemVvZihsaW1pdF9idWYpLCAmIzM0OyVsdSYjMzQ7LCBDR19MSU1JVCk7CiYjNDM7CXJldCA9IHdyaXRlX2Nncm91cF9maWxlKENHX0RJUiwgJiMzNDttZW1vcnkubWF4JiMzNDssIGxpbWl0X2J1Zik7CiYjNDM7CWlmICghQVNTRVJUX09LKHJldCwgJiMzNDt3cml0ZV9jZ3JvdXBfZmlsZSBtZW1vcnkubWF4JiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwomIzQzOwlyZXQgPSB3cml0ZV9jZ3JvdXBfZmlsZShDR19ESVIsICYjMzQ7bWVtb3J5LnN3YXAubWF4JiMzNDssICYjMzQ7MCYjMzQ7KTsKJiM0MzsJaWYgKCFBU1NFUlRfT0socmV0LCAmIzM0O3dyaXRlX2Nncm91cF9maWxlIG1lbW9yeS5zd2FwLm1heCYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsKJiM0MzsJcmV0ID0gY3JlYXRlX2FuZF9nZXRfY2dyb3VwKENHX0hJR0hfRElSKTsKJiM0MzsJaWYgKCFBU1NFUlRfR0UocmV0LCAwLCAmIzM0O2NyZWF0ZV9hbmRfZ2V0X2Nncm91cCAmIzM0OyBDR19ISUdIX0RJUikpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CWNsb3NlKHJldCk7CiYjNDM7CiYjNDM7CSpoaWdoX2Nncm91cF9pZCA9IGdldF9jZ3JvdXBfaWQoQ0dfSElHSF9ESVIpOwomIzQzOwlpZiAoIUFTU0VSVF9HVCgqaGlnaF9jZ3JvdXBfaWQsIDAsICYjMzQ7Z2V0X2Nncm91cF9pZCYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsKJiM0MzsJcmV0ID0gY3JlYXRlX2FuZF9nZXRfY2dyb3VwKENHX0xPV19ESVIpOwomIzQzOwlpZiAoIUFTU0VSVF9HRShyZXQsIDAsICYjMzQ7Y3JlYXRlX2FuZF9nZXRfY2dyb3VwICYjMzQ7IENHX0xPV19ESVIpKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwljbG9zZShyZXQpOwomIzQzOwomIzQzOwkqbG93X2Nncm91cF9pZCA9IGdldF9jZ3JvdXBfaWQoQ0dfTE9XX0RJUik7CiYjNDM7CWlmICghQVNTRVJUX0dUKCpoaWdoX2Nncm91cF9pZCwgMCwgJiMzNDtnZXRfY2dyb3VwX2lkJiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwomIzQzOwlyZXR1cm4gMDsKJiM0MzsKJiM0MztjbGVhbnVwOgomIzQzOwljbGVhbnVwX2Nncm91cF9lbnZpcm9ubWVudCgpOwomIzQzOwlyZXR1cm4gLTE7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbnQgd3JpdGVfZmlsZShjb25zdCBjaGFyICpmaWxlbmFtZSkKJiM0Mzt7CiYjNDM7CWludCByZXQgPSAtMTsKJiM0MzsJc2l6ZV90IHdyaXR0ZW4gPSAwOwomIzQzOwljaGFyICpidWZmZXI7CiYjNDM7CUZJTEUgKmZwOwomIzQzOwomIzQzOwlmcCA9IGZvcGVuKGZpbGVuYW1lLCAmIzM0O3diJiMzNDspOwomIzQzOwlpZiAoIWZwKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CiYjNDM7CWJ1ZmZlciA9IG1hbGxvYyhCVUZGRVJfU0laRSk7CiYjNDM7CWlmICghYnVmZmVyKQomIzQzOwkJZ290byBjbGVhbnVwX2ZwOwomIzQzOwomIzQzOwltZW1zZXQoYnVmZmVyLCAmIzM5O0EmIzM5OywgQlVGRkVSX1NJWkUpOwomIzQzOwomIzQzOwl3aGlsZSAod3JpdHRlbiAmbHQ7IEZJTEVfU0laRSkgewomIzQzOwkJc2l6ZV90IHRvX3dyaXRlID0gRklMRV9TSVpFIC0gd3JpdHRlbiAmbHQ7IEJVRkZFUl9TSVpFID8KJiM0MzsJCQkJICBGSUxFX1NJWkUgLSB3cml0dGVuIDogQlVGRkVSX1NJWkU7CiYjNDM7CiYjNDM7CQlpZiAoZndyaXRlKGJ1ZmZlciwgMSwgdG9fd3JpdGUsIGZwKSAhPSB0b193cml0ZSkKJiM0MzsJCQlnb3RvIGNsZWFudXA7CiYjNDM7CQl3cml0dGVuICYjNDM7PSB0b193cml0ZTsKJiM0MzsJfQomIzQzOwomIzQzOwlyZXQgPSAwOwomIzQzO2NsZWFudXA6CiYjNDM7CWZyZWUoYnVmZmVyKTsKJiM0MztjbGVhbnVwX2ZwOgomIzQzOwlmY2xvc2UoZnApOwomIzQzO291dDoKJiM0MzsJcmV0dXJuIHJldDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGludCByZWFkX2ZpbGUoY29uc3QgY2hhciAqZmlsZW5hbWUsIGludCBpdGVyYXRpb25zKQomIzQzO3sKJiM0MzsJaW50IHJldCA9IC0xOwomIzQzOwlsb25nIHBhZ2Vfc2l6ZSA9IHN5c2NvbmYoX1NDX1BBR0VTSVpFKTsKJiM0MzsJY2hhciAqbWFwOwomIzQzOwlzaXplX3QgaTsKJiM0MzsJaW50IGZkOwomIzQzOwlzdHJ1Y3Qgc3RhdCBzYjsKJiM0MzsKJiM0MzsJZmQgPSBvcGVuKGZpbGVuYW1lLCBPX1JET05MWSk7CiYjNDM7CWlmIChmZCA9PSAtMSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwomIzQzOwlpZiAoZnN0YXQoZmQsICZhbXA7c2IpID09IC0xKQomIzQzOwkJZ290byBjbGVhbnVwX2ZkOwomIzQzOwomIzQzOwlpZiAoc2Iuc3Rfc2l6ZSAhPSBGSUxFX1NJWkUpIHsKJiM0MzsJCWZwcmludGYoc3RkZXJyLCAmIzM0O0ZpbGUgc2l6ZSBtaXNtYXRjaDogZXhwZWN0ZWQgJWx1LCBnb3QgJWx1XG4mIzM0OywKJiM0MzsJCQkodW5zaWduZWQgbG9uZylGSUxFX1NJWkUsICh1bnNpZ25lZCBsb25nKXNiLnN0X3NpemUpOwomIzQzOwkJZ290byBjbGVhbnVwX2ZkOwomIzQzOwl9CiYjNDM7CiYjNDM7CW1hcCA9IG1tYXAoTlVMTCwgRklMRV9TSVpFLCBQUk9UX1JFQUQsIE1BUF9QUklWQVRFLCBmZCwgMCk7CiYjNDM7CWlmIChtYXAgPT0gTUFQX0ZBSUxFRCkKJiM0MzsJCWdvdG8gY2xlYW51cF9mZDsKJiM0MzsKJiM0MzsJZm9yIChpbnQgaXRlciA9IDA7IGl0ZXIgJmx0OyBpdGVyYXRpb25zOyBpdGVyJiM0MzsmIzQzOykgewomIzQzOwkJZm9yIChpID0gMDsgaSAmbHQ7IEZJTEVfU0laRTsgaSAmIzQzOz0gcGFnZV9zaXplKSB7CiYjNDM7CQkJLyogYWNjZXNzIGEgYnl0ZSB0byB0cmlnZ2VyIHBhZ2UgZmF1bHQgKi8KJiM0MzsJCQlhc20gdm9sYXRpbGUoJiMzNDsmIzM0OyA6OiAmIzM0O3ImIzM0OyhtYXBbaV0pIDogJiMzNDttZW1vcnkmIzM0Oyk7CiYjNDM7CQl9CiYjNDM7CX0KJiM0MzsKJiM0MzsJaWYgKG11bm1hcChtYXAsIEZJTEVfU0laRSkgPT0gLTEpCiYjNDM7CQlnb3RvIGNsZWFudXBfZmQ7CiYjNDM7CiYjNDM7CXJldCA9IDA7CiYjNDM7CiYjNDM7Y2xlYW51cF9mZDoKJiM0MzsJY2xvc2UoZmQpOwomIzQzO291dDoKJiM0MzsJcmV0dXJuIHJldDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGludCByZWFsX3Rlc3RfY2hpbGRfd29yayhjb25zdCBjaGFyICpjZ3JvdXBfcGF0aCwgY2hhciAqZGF0YV9maWxlbmFtZSwKJiM0MzsJCQkJY2hhciAqdGltZV9maWxlbmFtZSwgaW50IHJlYWRfdGltZXMpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgdGltZXZhbCBzdGFydCwgZW5kOwomIzQzOwlkb3VibGUgZWxhcHNlZDsKJiM0MzsJRklMRSAqZnA7CiYjNDM7CiYjNDM7CWlmICghQVNTRVJUX09LKGpvaW5fcGFyZW50X2Nncm91cChjZ3JvdXBfcGF0aCksICYjMzQ7am9pbl9wYXJlbnRfY2dyb3VwJiMzNDspKQomIzQzOwkJcmV0dXJuIC0xOwomIzQzOwomIzQzOwlnZXR0aW1lb2ZkYXkoJmFtcDtzdGFydCwgTlVMTCk7CiYjNDM7CiYjNDM7CWlmICghQVNTRVJUX09LKHdyaXRlX2ZpbGUoZGF0YV9maWxlbmFtZSksICYjMzQ7d3JpdGVfZmlsZSYjMzQ7KSkKJiM0MzsJCXJldHVybiAtMTsKJiM0MzsKJiM0MzsJaWYgKCFBU1NFUlRfT0socmVhZF9maWxlKGRhdGFfZmlsZW5hbWUsIHJlYWRfdGltZXMpLCAmIzM0O3JlYWRfZmlsZSYjMzQ7KSkKJiM0MzsJCXJldHVybiAtMTsKJiM0MzsKJiM0MzsJZ2V0dGltZW9mZGF5KCZhbXA7ZW5kLCBOVUxMKTsKJiM0MzsKJiM0MzsJaWYgKCF0aW1lX2ZpbGVuYW1lKQomIzQzOwkJcmV0dXJuIDA7CiYjNDM7CiYjNDM7CWVsYXBzZWQgPSAoZW5kLnR2X3NlYyAtIHN0YXJ0LnR2X3NlYykgJiM0MzsKJiM0MzsJCSAgKGVuZC50dl91c2VjIC0gc3RhcnQudHZfdXNlYykgLyAxMDAwMDAwLjA7CiYjNDM7CXByaW50ZigmIzM0OyUuNmZcbiYjMzQ7LCBlbGFwc2VkKTsKJiM0MzsKJiM0MzsJZnAgPSBmb3Blbih0aW1lX2ZpbGVuYW1lLCAmIzM0O3cmIzM0Oyk7CiYjNDM7CWlmICghQVNTRVJUX09LX1BUUihmcCwgJiMzNDtmb3BlbiYjMzQ7KSkKJiM0MzsJCXJldHVybiAtMTsKJiM0MzsJZnByaW50ZihmcCwgJiMzNDslLjZmJiMzNDssIGVsYXBzZWQpOwomIzQzOwlmY2xvc2UoZnApOwomIzQzOwomIzQzOwlyZXR1cm4gMDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGludCBnZXRfdGltZShjaGFyICp0aW1lX2ZpbGVuYW1lLCBkb3VibGUgKnRpbWUpCiYjNDM7ewomIzQzOwlpbnQgcmV0ID0gLTE7CiYjNDM7CUZJTEUgKmZwOwomIzQzOwljaGFyIGJ1Zls2NF07CiYjNDM7CiYjNDM7CWZwID0gZm9wZW4odGltZV9maWxlbmFtZSwgJiMzNDtyJiMzNDspOwomIzQzOwlpZiAoIUFTU0VSVF9PS19QVFIoZnAsICYjMzQ7Zm9wZW4mIzM0OykpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsKJiM0MzsJaWYgKCFBU1NFUlRfT0tfUFRSKGZnZXRzKGJ1Ziwgc2l6ZW9mKGJ1ZiksIGZwKSwgJiMzNDtmZ2V0cyYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsKJiM0MzsJaWYgKHNzY2FuZihidWYsICYjMzQ7JWxmJiMzNDssIHRpbWUpICE9IDEpIHsKJiM0MzsJCVBSSU5UX0ZBSUwoJiMzNDtzc2NhbmYgJXMmIzM0OywgYnVmKTsKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsJfQomIzQzOwomIzQzOwlyZXQgPSAwOwomIzQzO2NsZWFudXA6CiYjNDM7CWZjbG9zZShmcCk7CiYjNDM7b3V0OgomIzQzOwlyZXR1cm4gcmV0OwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50CiYjNDM7cnVuX2hpZ2hfbG93X3dvcmtsb2FkKGRvdWJsZSAqaGlnaF9lbGFwc2VkLCBkb3VibGUgKmxvd19lbGFwc2VkLCBpbnQgcmVhZF90aW1lcykKJiM0Mzt7CiYjNDM7CWNoYXIgdGVzdF9kaXJbUEFUSF9NQVhdLCBoaWdoX2RhdGFfZmlsZVtQQVRIX01BWF0sIGxvd19kYXRhX2ZpbGVbUEFUSF9NQVhdOwomIzQzOwljaGFyIGhpZ2hfdGltZV9maWxlW1BBVEhfTUFYXSwgbG93X3RpbWVfZmlsZVtQQVRIX01BWF07CiYjNDM7CWludCByZXQsIGZkOwomIzQzOwlwaWRfdCBoaWdoX3BpZCwgbG93X3BpZDsKJiM0MzsJaW50IHN0YXR1czsKJiM0MzsKJiM0MzsJcmV0ID0gZ2V0X3Rlc3RfZGlyKHRlc3RfZGlyLCBzaXplb2YodGVzdF9kaXIpKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0socmV0LCAmIzM0O2dldF90ZXN0X2Rpcjogbm8gbm9uLXRtcGZzIGRpcmVjdG9yeSBmb3VuZCYjMzQ7KSkKJiM0MzsJCXJldHVybiAtMTsKJiM0MzsKJiM0MzsJZmQgPSBzbnByaW50ZihoaWdoX2RhdGFfZmlsZSwgc2l6ZW9mKGhpZ2hfZGF0YV9maWxlKSwKJiM0MzsJCSAgICAgICYjMzQ7JXMvbWVtY2dfYXN5bmNfaGlnaF9kYXRhX1hYWFhYWCYjMzQ7LCB0ZXN0X2Rpcik7CiYjNDM7CWlmICghQVNTRVJUX0xUKGZkLCBzaXplb2YoaGlnaF9kYXRhX2ZpbGUpLCAmIzM0O2hpZ2hfZGF0YV9maWxlIHBhdGgmIzM0OykpCiYjNDM7CQlyZXR1cm4gLTE7CiYjNDM7CiYjNDM7CWZkID0gc25wcmludGYobG93X2RhdGFfZmlsZSwgc2l6ZW9mKGxvd19kYXRhX2ZpbGUpLAomIzQzOwkJICAgICAgJiMzNDslcy9tZW1jZ19hc3luY19sb3dfZGF0YV9YWFhYWFgmIzM0OywgdGVzdF9kaXIpOwomIzQzOwlpZiAoIUFTU0VSVF9MVChmZCwgc2l6ZW9mKGxvd19kYXRhX2ZpbGUpLCAmIzM0O2xvd19kYXRhX2ZpbGUgcGF0aCYjMzQ7KSkKJiM0MzsJCXJldHVybiAtMTsKJiM0MzsKJiM0MzsJZmQgPSBzbnByaW50ZihoaWdoX3RpbWVfZmlsZSwgc2l6ZW9mKGhpZ2hfdGltZV9maWxlKSwKJiM0MzsJCSAgICAgICYjMzQ7JXMvbWVtY2dfYXN5bmNfaGlnaF90aW1lX1hYWFhYWCYjMzQ7LCB0ZXN0X2Rpcik7CiYjNDM7CWlmICghQVNTRVJUX0xUKGZkLCBzaXplb2YoaGlnaF90aW1lX2ZpbGUpLCAmIzM0O2hpZ2hfdGltZV9maWxlIHBhdGgmIzM0OykpCiYjNDM7CQlyZXR1cm4gLTE7CiYjNDM7CiYjNDM7CWZkID0gc25wcmludGYobG93X3RpbWVfZmlsZSwgc2l6ZW9mKGxvd190aW1lX2ZpbGUpLAomIzQzOwkJICAgICAgJiMzNDslcy9tZW1jZ19hc3luY19sb3dfdGltZV9YWFhYWFgmIzM0OywgdGVzdF9kaXIpOwomIzQzOwlpZiAoIUFTU0VSVF9MVChmZCwgc2l6ZW9mKGxvd190aW1lX2ZpbGUpLCAmIzM0O2xvd190aW1lX2ZpbGUgcGF0aCYjMzQ7KSkKJiM0MzsJCXJldHVybiAtMTsKJiM0MzsKJiM0MzsJZmQgPSBta3N0ZW1wKGhpZ2hfZGF0YV9maWxlKTsKJiM0MzsJaWYgKCFBU1NFUlRfR0UoZmQsIDAsICYjMzQ7bWtzdGVtcCYjMzQ7KSkKJiM0MzsJCXJldHVybiAtMTsKJiM0MzsJY2xvc2UoZmQpOwomIzQzOwomIzQzOwlmZCA9IG1rc3RlbXAobG93X2RhdGFfZmlsZSk7CiYjNDM7CWlmICghQVNTRVJUX0dFKGZkLCAwLCAmIzM0O21rc3RlbXAmIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXBfaGlnaF9kYXRhOwomIzQzOwljbG9zZShmZCk7CiYjNDM7CiYjNDM7CWZkID0gbWtzdGVtcChoaWdoX3RpbWVfZmlsZSk7CiYjNDM7CWlmICghQVNTRVJUX0dFKGZkLCAwLCAmIzM0O21rc3RlbXAmIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXBfbG93X2RhdGE7CiYjNDM7CWNsb3NlKGZkKTsKJiM0MzsKJiM0MzsJZmQgPSBta3N0ZW1wKGxvd190aW1lX2ZpbGUpOwomIzQzOwlpZiAoIUFTU0VSVF9HRShmZCwgMCwgJiMzNDtta3N0ZW1wJiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwX2hpZ2hfdGltZTsKJiM0MzsJY2xvc2UoZmQpOwomIzQzOwomIzQzOwlsb3dfcGlkID0gZm9yaygpOwomIzQzOwlpZiAoIUFTU0VSVF9HRShsb3dfcGlkLCAwLCAmIzM0O2ZvcmsgbG93JiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwX2xvd190aW1lOwomIzQzOwlpZiAobG93X3BpZCA9PSAwKQomIzQzOwkJZXhpdChyZWFsX3Rlc3RfY2hpbGRfd29yayhDR19MT1dfRElSLCBsb3dfZGF0YV9maWxlLAomIzQzOwkJCQkJICBsb3dfdGltZV9maWxlLCByZWFkX3RpbWVzKSk7CiYjNDM7CiYjNDM7CWhpZ2hfcGlkID0gZm9yaygpOwomIzQzOwlpZiAoIUFTU0VSVF9HRShoaWdoX3BpZCwgMCwgJiMzNDtmb3JrIGhpZ2gmIzM0OykpIHsKJiM0MzsJCSh2b2lkKXdhaXRwaWQobG93X3BpZCwgTlVMTCwgMCk7CiYjNDM7CQlnb3RvIGNsZWFudXBfbG93X3RpbWU7CiYjNDM7CX0KJiM0MzsJaWYgKGhpZ2hfcGlkID09IDApCiYjNDM7CQlleGl0KHJlYWxfdGVzdF9jaGlsZF93b3JrKENHX0hJR0hfRElSLCBoaWdoX2RhdGFfZmlsZSwKJiM0MzsJCQkJCSAgaGlnaF90aW1lX2ZpbGUsIHJlYWRfdGltZXMpKTsKJiM0MzsKJiM0MzsJcmV0ID0gd2FpdHBpZChsb3dfcGlkLCAmYW1wO3N0YXR1cywgMCk7CiYjNDM7CWlmICghQVNTRVJUX0dUKHJldCwgMCwgJiMzNDtsb3cgd2FpdHBpZCYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cF9sb3dfdGltZTsKJiM0MzsJaWYgKCFBU1NFUlRfVFJVRShXSUZFWElURUQoc3RhdHVzKSwgJiMzNDtsb3cgZXhpdGVkJiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwX2xvd190aW1lOwomIzQzOwlpZiAoIUFTU0VSVF9FUShXRVhJVFNUQVRVUyhzdGF0dXMpLCAwLCAmIzM0O2xvdyBleGl0IHN0YXR1cyYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cF9sb3dfdGltZTsKJiM0MzsKJiM0MzsJcmV0ID0gd2FpdHBpZChoaWdoX3BpZCwgJmFtcDtzdGF0dXMsIDApOwomIzQzOwlpZiAoIUFTU0VSVF9HVChyZXQsIDAsICYjMzQ7aGlnaCB3YWl0cGlkJiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwX2xvd190aW1lOwomIzQzOwlpZiAoIUFTU0VSVF9UUlVFKFdJRkVYSVRFRChzdGF0dXMpLCAmIzM0O2hpZ2ggZXhpdGVkJiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwX2xvd190aW1lOwomIzQzOwlpZiAoIUFTU0VSVF9FUShXRVhJVFNUQVRVUyhzdGF0dXMpLCAwLCAmIzM0O2hpZ2ggZXhpdCBzdGF0dXMmIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXBfbG93X3RpbWU7CiYjNDM7CiYjNDM7CWlmIChnZXRfdGltZShoaWdoX3RpbWVfZmlsZSwgaGlnaF9lbGFwc2VkKSkKJiM0MzsJCWdvdG8gY2xlYW51cF9sb3dfdGltZTsKJiM0MzsJaWYgKGdldF90aW1lKGxvd190aW1lX2ZpbGUsIGxvd19lbGFwc2VkKSkKJiM0MzsJCWdvdG8gY2xlYW51cF9sb3dfdGltZTsKJiM0MzsKJiM0MzsJcmV0ID0gMDsKJiM0MzsKJiM0MztjbGVhbnVwX2xvd190aW1lOgomIzQzOwl1bmxpbmsobG93X3RpbWVfZmlsZSk7CiYjNDM7Y2xlYW51cF9oaWdoX3RpbWU6CiYjNDM7CXVubGluayhoaWdoX3RpbWVfZmlsZSk7CiYjNDM7Y2xlYW51cF9sb3dfZGF0YToKJiM0MzsJdW5saW5rKGxvd19kYXRhX2ZpbGUpOwomIzQzO2NsZWFudXBfaGlnaF9kYXRhOgomIzQzOwl1bmxpbmsoaGlnaF9kYXRhX2ZpbGUpOwomIzQzOwlyZXR1cm4gcmV0OwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50CiYjNDM7c2V0dXBfYnBmKHU2NCBoaWdoX2Nncm91cF9pZCwgdTY0IGxvd19jZ3JvdXBfaWQsCiYjNDM7CSAgc3RydWN0IG1lbWNnX2FzeW5jX3JlY2xhaW0gKipza2VsX3B0ciwgYm9vbCB1c2VfdGhyZWFkX3dxKQomIzQzO3sKJiM0MzsJc3RydWN0IG1lbWNnX2FzeW5jX3JlY2xhaW0gKnNrZWw7CiYjNDM7CXN0cnVjdCBicGZfYXJnc19zIGJwZl9hcmdzID0gewomIzQzOwkJLmhpZ2hfY2dyb3VwX2lkID0gaGlnaF9jZ3JvdXBfaWQsCiYjNDM7CQkubG93X2Nncm91cF9pZCA9IGxvd19jZ3JvdXBfaWQsCiYjNDM7CQkuZXZlbnRfZGVsdGFfdGhyZXNob2xkID0gRVZFTlRfREVMVEFfVEhSRVNIT0xELAomIzQzOwkJLmNoZWNrX25zID0gQ0hFQ0tfUEVSSU9EX05TLAomIzQzOwl9OwomIzQzOwlMSUJCUEZfT1BUUyhicGZfdGVzdF9ydW5fb3B0cywgcnVuX29wdHMsCiYjNDM7CQkuY3R4X2luID0gJmFtcDticGZfYXJncywKJiM0MzsJCS5jdHhfc2l6ZV9pbiA9IHNpemVvZihicGZfYXJncykpOwomIzQzOwlpbnQgcHJvZ19pbml0X2ZkLCBlcnI7CiYjNDM7CiYjNDM7CXNrZWwgPSBtZW1jZ19hc3luY19yZWNsYWltX19vcGVuX2FuZF9sb2FkKCk7CiYjNDM7CWlmICghQVNTRVJUX09LX1BUUihza2VsLCAmIzM0O21lbWNnX2FzeW5jX3JlY2xhaW1fX29wZW5fYW5kX2xvYWQmIzM0OykpCiYjNDM7CQlyZXR1cm4gLTE7CiYjNDM7CiYjNDM7CWlmICh1c2VfdGhyZWFkX3dxKQomIzQzOwkJcHJvZ19pbml0X2ZkID0gYnBmX3Byb2dyYW1fX2ZkKHNrZWwtJmd0O3Byb2dzLnRocmVhZF93cV9wcm9nX2luaXQpOwomIzQzOwllbHNlCiYjNDM7CQlwcm9nX2luaXRfZmQgPSBicGZfcHJvZ3JhbV9fZmQoc2tlbC0mZ3Q7cHJvZ3Mud3FfcHJvZ19pbml0KTsKJiM0MzsJaWYgKCFBU1NFUlRfR0UocHJvZ19pbml0X2ZkLCAwLCAmIzM0O2JwZl9wcm9ncmFtX19mZCYjMzQ7KSkKJiM0MzsJCWdvdG8gZXJyb3Jfb3V0OwomIzQzOwomIzQzOwllcnIgPSBicGZfcHJvZ190ZXN0X3J1bl9vcHRzKHByb2dfaW5pdF9mZCwgJmFtcDtydW5fb3B0cyk7CiYjNDM7CWlmICghQVNTRVJUX09LKGVyciwgJiMzNDticGZfcHJvZ190ZXN0X3J1bl9vcHRzJiMzNDspKQomIzQzOwkJZ290byBlcnJvcl9vdXQ7CiYjNDM7CWlmICghQVNTRVJUX0VRKHJ1bl9vcHRzLnJldHZhbCwgMCwgJiMzNDtwcm9nX2luaXQgcmV0dmFsJiMzNDspKQomIzQzOwkJZ290byBlcnJvcl9vdXQ7CiYjNDM7CiYjNDM7CSpza2VsX3B0ciA9IHNrZWw7CiYjNDM7CXJldHVybiAwOwomIzQzOwomIzQzO2Vycm9yX291dDoKJiM0MzsJbWVtY2dfYXN5bmNfcmVjbGFpbV9fZGVzdHJveShza2VsKTsKJiM0MzsJcmV0dXJuIC0xOwomIzQzO30KJiM0MzsKJiM0Mzt2b2lkIHRlc3RfbWVtY2dfd3FfYXN5bmNfcmVjbGFpbSh2b2lkKQomIzQzO3sKJiM0MzsJdTY0IGhpZ2hfY2dyb3VwX2lkLCBsb3dfY2dyb3VwX2lkOwomIzQzOwlpbnQgZXJyOwomIzQzOwlkb3VibGUgaGlnaF90aW1lID0gMC4wLCBsb3dfdGltZSA9IDAuMDsKJiM0MzsJc3RydWN0IG1lbWNnX2FzeW5jX3JlY2xhaW0gKnNrZWwgPSBOVUxMOwomIzQzOwomIzQzOwllcnIgPSBzZXR1cF9oaWdoX2xvd19jZ3JvdXBzKCZhbXA7aGlnaF9jZ3JvdXBfaWQsICZhbXA7bG93X2Nncm91cF9pZCk7CiYjNDM7CWlmICghQVNTRVJUX09LKGVyciwgJiMzNDtzZXR1cF9oaWdoX2xvd19jZ3JvdXBzIHJlY2xhaW0mIzM0OykpCiYjNDM7CQlyZXR1cm47CiYjNDM7CiYjNDM7CWVyciA9IHNldHVwX2JwZihoaWdoX2Nncm91cF9pZCwgbG93X2Nncm91cF9pZCwgJmFtcDtza2VsLCBmYWxzZSk7CiYjNDM7CWlmICghQVNTRVJUX09LKGVyciwgJiMzNDtzZXR1cF9icGYmIzM0OykpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsKJiM0MzsJZXJyID0gcnVuX2hpZ2hfbG93X3dvcmtsb2FkKCZhbXA7aGlnaF90aW1lLCAmYW1wO2xvd190aW1lLCBSRUFEX1RJTUVTKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0soZXJyLCAmIzM0O3J1bl9oaWdoX2xvd193b3JrbG9hZCByZWNsYWltJiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CiYjNDM7CWlmIChoaWdoX3RpbWUgJmd0Oz0gbG93X3RpbWUpIHsKJiM0MzsJCVBSSU5UX0ZBSUwoJiMzNDtoaWdoIGNncm91cCBub3QgaW1wcm92ZWQgd2l0aCBhc3luYyByZWNsYWltOiBoaWdoX3RpbWU9JWYgbG93X3RpbWU9JWYmIzM0OywKJiM0MzsJCQkgICBoaWdoX3RpbWUsIGxvd190aW1lKTsKJiM0MzsJfQomIzQzOwomIzQzO291dDoKJiM0MzsJaWYgKHNrZWwpCiYjNDM7CQltZW1jZ19hc3luY19yZWNsYWltX19kZXN0cm95KHNrZWwpOwomIzQzOwkvKgomIzQzOwkgKiBXYWl0IGZvciBicGZfd3EgdG8gcmVsZWFzZSB0aGUgcmVmZXJlbmNlIHRvIGNncm91cAomIzQzOwkgKiB0byBlbnN1cmUgdGhlIHN1Y2Nlc3NmdWwgZGVsZXRpb24gb2YgY2dyb3VwLgomIzQzOwkgKi8KJiM0MzsJc2xlZXAoMSk7CiYjNDM7CWNsZWFudXBfY2dyb3VwX2Vudmlyb25tZW50KCk7CiYjNDM7fQomIzQzOwomIzQzO3ZvaWQgdGVzdF9tZW1jZ190aHJlYWRfd3FfYXN5bmNfcmVjbGFpbSh2b2lkKQomIzQzO3sKJiM0MzsJdTY0IGhpZ2hfY2dyb3VwX2lkLCBsb3dfY2dyb3VwX2lkOwomIzQzOwlpbnQgZXJyOwomIzQzOwlkb3VibGUgaGlnaF90aW1lID0gMC4wLCBsb3dfdGltZSA9IDAuMDsKJiM0MzsJc3RydWN0IG1lbWNnX2FzeW5jX3JlY2xhaW0gKnNrZWwgPSBOVUxMOwomIzQzOwomIzQzOwllcnIgPSBzZXR1cF9oaWdoX2xvd19jZ3JvdXBzKCZhbXA7aGlnaF9jZ3JvdXBfaWQsICZhbXA7bG93X2Nncm91cF9pZCk7CiYjNDM7CWlmICghQVNTRVJUX09LKGVyciwgJiMzNDtzZXR1cF9oaWdoX2xvd19jZ3JvdXBzIHJlY2xhaW0mIzM0OykpCiYjNDM7CQlyZXR1cm47CiYjNDM7CiYjNDM7CWVyciA9IHNldHVwX2JwZihoaWdoX2Nncm91cF9pZCwgbG93X2Nncm91cF9pZCwgJmFtcDtza2VsLCB0cnVlKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0soZXJyLCAmIzM0O3NldHVwX2JwZiYjMzQ7KSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwomIzQzOwllcnIgPSBydW5faGlnaF9sb3dfd29ya2xvYWQoJmFtcDtoaWdoX3RpbWUsICZhbXA7bG93X3RpbWUsIFJFQURfVElNRVMpOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhlcnIsICYjMzQ7cnVuX2hpZ2hfbG93X3dvcmtsb2FkIHJlY2xhaW0mIzM0OykpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsKJiM0MzsJaWYgKGhpZ2hfdGltZSAmZ3Q7PSBsb3dfdGltZSkgewomIzQzOwkJUFJJTlRfRkFJTCgmIzM0O2hpZ2ggY2dyb3VwIG5vdCBpbXByb3ZlZCB3aXRoIGFzeW5jIHJlY2xhaW06IGhpZ2hfdGltZT0lZiBsb3dfdGltZT0lZiYjMzQ7LAomIzQzOwkJCSAgIGhpZ2hfdGltZSwgbG93X3RpbWUpOwomIzQzOwl9CiYjNDM7CiYjNDM7b3V0OgomIzQzOwlpZiAoc2tlbCkKJiM0MzsJCW1lbWNnX2FzeW5jX3JlY2xhaW1fX2Rlc3Ryb3koc2tlbCk7CiYjNDM7CS8qCiYjNDM7CSAqIFdhaXQgZm9yIGJwZl90aHJlYWRfd3EgdG8gcmVsZWFzZSB0aGUgcmVmZXJlbmNlIHRvIGNncm91cAomIzQzOwkgKiB0byBlbnN1cmUgdGhlIHN1Y2Nlc3NmdWwgZGVsZXRpb24gb2YgY2dyb3VwLgomIzQzOwkgKi8KJiM0MzsJc2xlZXAoMSk7CiYjNDM7CWNsZWFudXBfY2dyb3VwX2Vudmlyb25tZW50KCk7CiYjNDM7fQpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvdGhyZWFkX3dxX2Nncm91cC5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvdGhyZWFkX3dxX2Nncm91cC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAuLjc1MzdiMDNmMTdlMmEKLS0tIC9kZXYvbnVsbAomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy90aHJlYWRfd3FfY2dyb3VwLmMKQEAgLTAsMCAmIzQzOzEsODcgQEAKJiM0MzsvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMAomIzQzOyNpbmNsdWRlICZsdDt0ZXN0X3Byb2dzLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3VuaXN0ZC5oJmd0OwomIzQzOyNpbmNsdWRlICYjMzQ7Y2dyb3VwX2hlbHBlcnMuaCYjMzQ7CiYjNDM7I2luY2x1ZGUgJiMzNDt0aHJlYWRfd3FfY2dyb3VwLnNrZWwuaCYjMzQ7CiYjNDM7CiYjNDM7I2RlZmluZSBURVNUX0NHUk9VUCAmIzM0Oy90aHJlYWRfd3FfdGVzdCYjMzQ7CiYjNDM7I2RlZmluZSBXQUlUX1RJTUVPVVRfU0VDUyAzMAomIzQzOwomIzQzO3ZvaWQgdGVzdF90aHJlYWRfd3FfY2dyb3VwKHZvaWQpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgdGhyZWFkX3dxX2Nncm91cCAqc2tlbCA9IE5VTEw7CiYjNDM7CWludCBlcnIsIHByb2dfZmQsIGNnX2ZkID0gLTE7CiYjNDM7CXVuc2lnbmVkIGxvbmcgbG9uZyBjZ19pZDsKJiM0MzsJaW50IHdhaXRlZF9zZWNzOwomIzQzOwomIzQzOwlMSUJCUEZfT1BUUyhicGZfdGVzdF9ydW5fb3B0cywgdG9wdHMpOwomIzQzOwomIzQzOwllcnIgPSBzZXR1cF9jZ3JvdXBfZW52aXJvbm1lbnQoKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0soZXJyLCAmIzM0O3NldHVwX2Nncm91cF9lbnZpcm9ubWVudCYjMzQ7KSkKJiM0MzsJCXJldHVybjsKJiM0MzsJY2dfZmQgPSBjcmVhdGVfYW5kX2dldF9jZ3JvdXAoVEVTVF9DR1JPVVApOwomIzQzOwlpZiAoIUFTU0VSVF9HRShjZ19mZCwgMCwgJiMzNDtjcmVhdGVfYW5kX2dldF9jZ3JvdXAmIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CWNnX2lkID0gZ2V0X2Nncm91cF9pZChURVNUX0NHUk9VUCk7CiYjNDM7CWlmICghQVNTRVJUX0dUKGNnX2lkLCAwVUxMLCAmIzM0O2dldF9jZ3JvdXBfaWQmIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CiYjNDM7CXNrZWwgPSB0aHJlYWRfd3FfY2dyb3VwX19vcGVuX2FuZF9sb2FkKCk7CiYjNDM7CWlmICghQVNTRVJUX09LX1BUUihza2VsLCAmIzM0O29wZW5fYW5kX2xvYWQmIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CiYjNDM7CXByb2dfZmQgPSBicGZfcHJvZ3JhbV9fZmQoc2tlbC0mZ3Q7cHJvZ3Muc3RhcnRfdGhyZWFkX3dxKTsKJiM0MzsKJiM0MzsJLyogUnVuIGJwZl90aHJlYWRfd3EgaW4gdGhlIHNwZWNpZmllZCBjZ3JvdXAuICovCiYjNDM7CXNrZWwtJmd0O2Jzcy0mZ3Q7dGVzdF9rZXkgPSAwOwomIzQzOwlza2VsLSZndDtic3MtJmd0O3RhcmdldF9jZ3JvdXBfaWQgPSBjZ19pZDsKJiM0MzsJc2tlbC0mZ3Q7YnNzLSZndDtjYWxsYmFja19jZ3JvdXBfaWQgPSAwOwomIzQzOwlza2VsLSZndDtic3MtJmd0O3R3cV9kb25lID0gMDsKJiM0MzsJaWYgKCFBU1NFUlRfT0soYnBmX3Byb2dfdGVzdF9ydW5fb3B0cyhwcm9nX2ZkLCAmYW1wO3RvcHRzKSwKJiM0MzsJCSAgICAgICAmIzM0O2JwZl9wcm9nX3Rlc3RfcnVuX29wdHMgaW4gY2dyb3VwJiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwlpZiAoIUFTU0VSVF9PSyh0b3B0cy5yZXR2YWwsICYjMzQ7cmV0dmFsIGluIGNncm91cCYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsJZm9yICh3YWl0ZWRfc2VjcyA9IDA7IHdhaXRlZF9zZWNzICZsdDsgV0FJVF9USU1FT1VUX1NFQ1M7IHdhaXRlZF9zZWNzJiM0MzsmIzQzOykgewomIzQzOwkJaWYgKHNrZWwtJmd0O2Jzcy0mZ3Q7dHdxX2RvbmUpCiYjNDM7CQkJYnJlYWs7CiYjNDM7CQlzbGVlcCgxKTsKJiM0MzsJfQomIzQzOwlpZiAoIUFTU0VSVF9UUlVFKHNrZWwtJmd0O2Jzcy0mZ3Q7dHdxX2RvbmUsICYjMzQ7dHdxX2RvbmUgaW4gY2dyb3VwJiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwlpZiAoIUFTU0VSVF9FUShza2VsLSZndDtic3MtJmd0O2NhbGxiYWNrX2Nncm91cF9pZCwgY2dfaWQsCiYjNDM7CQkgICAgICAgJiMzNDtjYWxsYmFja19jZ3JvdXBfaWQgaW4gY2dyb3VwJiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwomIzQzOwkvKiBSdW4gYnBmX3RocmVhZF93cSB3aXRob3V0IGNncm91cCBhdHRhY2htZW50IChjZ3JvdXBfaWQgPSAwKS4gKi8KJiM0MzsJTElCQlBGX09QVFNfUkVTRVQodG9wdHMpOwomIzQzOwlza2VsLSZndDtic3MtJmd0O3Rlc3Rfa2V5ID0gMTsKJiM0MzsJc2tlbC0mZ3Q7YnNzLSZndDt0YXJnZXRfY2dyb3VwX2lkID0gMDsKJiM0MzsJc2tlbC0mZ3Q7YnNzLSZndDtjYWxsYmFja19jZ3JvdXBfaWQgPSAwOwomIzQzOwlza2VsLSZndDtic3MtJmd0O3R3cV9kb25lID0gMDsKJiM0MzsJaWYgKCFBU1NFUlRfT0soYnBmX3Byb2dfdGVzdF9ydW5fb3B0cyhwcm9nX2ZkLCAmYW1wO3RvcHRzKSwKJiM0MzsJCSAgICAgICAmIzM0O2JwZl9wcm9nX3Rlc3RfcnVuX29wdHMgd2l0aG91dCBjZ3JvdXAmIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CWlmICghQVNTRVJUX09LKHRvcHRzLnJldHZhbCwgJiMzNDtyZXR2YWwgd2l0aG91dCBjZ3JvdXAmIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CWZvciAod2FpdGVkX3NlY3MgPSAwOyB3YWl0ZWRfc2VjcyAmbHQ7IFdBSVRfVElNRU9VVF9TRUNTOyB3YWl0ZWRfc2VjcyYjNDM7JiM0MzspIHsKJiM0MzsJCWlmIChza2VsLSZndDtic3MtJmd0O3R3cV9kb25lKQomIzQzOwkJCWJyZWFrOwomIzQzOwkJc2xlZXAoMSk7CiYjNDM7CX0KJiM0MzsJaWYgKCFBU1NFUlRfVFJVRShza2VsLSZndDtic3MtJmd0O3R3cV9kb25lLCAmIzM0O3R3cV9kb25lIHdpdGhvdXQgY2dyb3VwJiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwlpZiAoIUFTU0VSVF9ORVEoc2tlbC0mZ3Q7YnNzLSZndDtjYWxsYmFja19jZ3JvdXBfaWQsIGNnX2lkLAomIzQzOwkJCSYjMzQ7Y2FsbGJhY2tfY2dyb3VwX2lkIHdpdGhvdXQgY2dyb3VwJiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwomIzQzO2NsZWFudXA6CiYjNDM7CWlmIChza2VsKSB7CiYjNDM7CQl0aHJlYWRfd3FfY2dyb3VwX19kZXN0cm95KHNrZWwpOwomIzQzOwkJLyogV2FpdCB0aHJlYWRfd3Ega3RocmVhZCBxdWl0LiAqLwomIzQzOwkJc2xlZXAoMik7CiYjNDM7CX0KJiM0MzsJaWYgKGNnX2ZkICZndDs9IDApCiYjNDM7CQljbG9zZShjZ19mZCk7CiYjNDM7CWNsZWFudXBfY2dyb3VwX2Vudmlyb25tZW50KCk7CiYjNDM7fQpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL21lbWNnX2FzeW5jX3JlY2xhaW0uYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9tZW1jZ19hc3luY19yZWNsYWltLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMC4uZWFjY2M4YTM3Mzg4YgotLS0gL2Rldi9udWxsCiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9tZW1jZ19hc3luY19yZWNsYWltLmMKQEAgLTAsMCAmIzQzOzEsMjU1IEBACiYjNDM7Ly8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAKJiM0MzsKJiM0MzsjaW5jbHVkZSAmIzM0O3ZtbGludXguaCYjMzQ7CiYjNDM7I2luY2x1ZGUgJiMzNDticGZfZXhwZXJpbWVudGFsLmgmIzM0OwomIzQzOyNpbmNsdWRlICZsdDticGYvYnBmX2hlbHBlcnMuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7YnBmL2JwZl90cmFjaW5nLmgmZ3Q7CiYjNDM7CiYjNDM7I2RlZmluZSBCSVQobnIpCQkJKDFVTCAmbHQ7Jmx0OyAobnIpKQomIzQzOwomIzQzOyNkZWZpbmUgX19fR0ZQX0lPCQlCSVQoX19fR0ZQX0lPX0JJVCkKJiM0MzsjZGVmaW5lIF9fX0dGUF9GUwkJQklUKF9fX0dGUF9GU19CSVQpCiYjNDM7I2RlZmluZSBfX19HRlBfRElSRUNUX1JFQ0xBSU0JQklUKF9fX0dGUF9ESVJFQ1RfUkVDTEFJTV9CSVQpCiYjNDM7I2RlZmluZSBfX19HRlBfS1NXQVBEX1JFQ0xBSU0JQklUKF9fX0dGUF9LU1dBUERfUkVDTEFJTV9CSVQpCiYjNDM7CiYjNDM7I2RlZmluZSBfX0dGUF9JTwkJKChnZnBfdClfX19HRlBfSU8pCiYjNDM7I2RlZmluZSBfX0dGUF9GUwkJKChnZnBfdClfX19HRlBfRlMpCiYjNDM7I2RlZmluZSBfX0dGUF9ESVJFQ1RfUkVDTEFJTQkoKGdmcF90KV9fX0dGUF9ESVJFQ1RfUkVDTEFJTSkKJiM0MzsjZGVmaW5lIF9fR0ZQX0tTV0FQRF9SRUNMQUlNCSgoZ2ZwX3QpX19fR0ZQX0tTV0FQRF9SRUNMQUlNKQomIzQzOyNkZWZpbmUgX19HRlBfUkVDTEFJTQkoKGdmcF90KShfX19HRlBfRElSRUNUX1JFQ0xBSU0gfCBfX19HRlBfS1NXQVBEX1JFQ0xBSU0pKQomIzQzOwomIzQzOyNkZWZpbmUgR0ZQX0tFUk5FTAkoX19HRlBfUkVDTEFJTSB8IF9fR0ZQX0lPIHwgX19HRlBfRlMpCiYjNDM7I2RlZmluZSBDTE9DS19NT05PVE9OSUNfSUQJMQomIzQzOyNkZWZpbmUgUkVDTEFJTV9QQUdFUwkJMzIKJiM0MzsjZGVmaW5lIFJFQ0xBSU1fTUFYX0lURVIJMzIKJiM0MzsKJiM0MztzdHJ1Y3QgYnBmX2FyZ3NfcyB7CiYjNDM7CXU2NCBoaWdoX2Nncm91cF9pZDsKJiM0MzsJdTY0IGxvd19jZ3JvdXBfaWQ7CiYjNDM7CXU2NCBldmVudF9kZWx0YV90aHJlc2hvbGQ7CiYjNDM7CXU2NCBjaGVja19uczsKJiM0Mzt9OwomIzQzOwomIzQzO3N0cnVjdCBjZ3JvdXBfbWVtY2cgewomIzQzOwlzdHJ1Y3QgY2dyb3VwICpjZ3JwOwomIzQzOwlzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2c7CiYjNDM7fTsKJiM0MzsKJiM0MztzdGF0aWMgdTY0IHdxX2hpZ2hfY2dyb3VwX2lkOwomIzQzO3N0YXRpYyB1NjQgd3FfbG93X2Nncm91cF9pZDsKJiM0MzsKJiM0MztzdGF0aWMgaW50IGdldF9jZ3JvdXBfbWVtY2dfZnJvbV9pZCh1NjQgY2dyb3VwX2lkLCBzdHJ1Y3QgY2dyb3VwX21lbWNnICpjbSkKJiM0Mzt7CiYjNDM7CWNtLSZndDtjZ3JwID0gYnBmX2Nncm91cF9mcm9tX2lkKGNncm91cF9pZCk7CiYjNDM7CWlmICghY20tJmd0O2NncnApCiYjNDM7CQlyZXR1cm4gLTE7CiYjNDM7CiYjNDM7CWNtLSZndDttZW1jZyA9IGJwZl9nZXRfbWVtX2Nncm91cCgmYW1wO2NtLSZndDtjZ3JwLSZndDtzZWxmKTsKJiM0MzsJaWYgKCFjbS0mZ3Q7bWVtY2cpIHsKJiM0MzsJCWJwZl9jZ3JvdXBfcmVsZWFzZShjbS0mZ3Q7Y2dycCk7CiYjNDM7CQlyZXR1cm4gLTE7CiYjNDM7CX0KJiM0MzsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkIHB1dF9jZ3JvdXBfbWVtY2coc3RydWN0IGNncm91cF9tZW1jZyAqY20pCiYjNDM7ewomIzQzOwlicGZfcHV0X21lbV9jZ3JvdXAoY20tJmd0O21lbWNnKTsKJiM0MzsJYnBmX2Nncm91cF9yZWxlYXNlKGNtLSZndDtjZ3JwKTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGludCBnZXRfY2dyb3VwX2V2ZW50KHU2NCBjZ3JvdXBfaWQsIHU2NCAqdmFsKQomIzQzO3sKJiM0MzsJc3RydWN0IGNncm91cF9tZW1jZyBjbTsKJiM0MzsKJiM0MzsJaWYgKGdldF9jZ3JvdXBfbWVtY2dfZnJvbV9pZChjZ3JvdXBfaWQsICZhbXA7Y20pKQomIzQzOwkJcmV0dXJuIC0xOwomIzQzOwlicGZfbWVtX2Nncm91cF9mbHVzaF9zdGF0cyhjbS5tZW1jZyk7CiYjNDM7CSp2YWwgPSBicGZfbWVtX2Nncm91cF9wYWdlX3N0YXRlKGNtLm1lbWNnLCBXT1JLSU5HU0VUX1JFRkFVTFRfRklMRSk7CiYjNDM7CXB1dF9jZ3JvdXBfbWVtY2coJmFtcDtjbSk7CiYjNDM7CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgYm9vbAomIzQzO3Nob3VsZF9yZWNsYWltX2Nncm91cCh1NjQgY2dyb3VwX2lkLCB1NjQgKnByZXZfZXZlbnQsIHU2NCBldmVudF9kZWx0YV90aHJlc2hvbGQpCiYjNDM7ewomIzQzOwl1NjQgY3VyLCBkZWx0YTsKJiM0MzsKJiM0MzsJaWYgKGdldF9jZ3JvdXBfZXZlbnQoY2dyb3VwX2lkLCAmYW1wO2N1cikpCiYjNDM7CQlyZXR1cm4gZmFsc2U7CiYjNDM7CiYjNDM7CWRlbHRhID0gY3VyIC0gKnByZXZfZXZlbnQ7CiYjNDM7CSpwcmV2X2V2ZW50ID0gY3VyOwomIzQzOwomIzQzOwlyZXR1cm4gZGVsdGEgJmd0Oz0gZXZlbnRfZGVsdGFfdGhyZXNob2xkOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50IHJlY2xhaW1fY2dyb3VwKHU2NCBjZ3JvdXBfaWQpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgY2dyb3VwX21lbWNnIGNtOwomIzQzOwlpbnQgaTsKJiM0MzsKJiM0MzsJaWYgKGdldF9jZ3JvdXBfbWVtY2dfZnJvbV9pZChjZ3JvdXBfaWQsICZhbXA7Y20pKQomIzQzOwkJcmV0dXJuIDA7CiYjNDM7CiYjNDM7CWZvciAoaSA9IDA7IGkgJmx0OyBSRUNMQUlNX01BWF9JVEVSOyBpJiM0MzsmIzQzOykgewomIzQzOwkJaWYgKCFicGZfdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcyhjbS5tZW1jZywgUkVDTEFJTV9QQUdFUywKJiM0MzsJCQkJCQkgICAgICBHRlBfS0VSTkVMLCAwLCAtMSkpCiYjNDM7CQkJYnJlYWs7CiYjNDM7CX0KJiM0MzsKJiM0MzsJcHV0X2Nncm91cF9tZW1jZygmYW1wO2NtKTsKJiM0MzsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOwomIzQzO3N0cnVjdCB3cV9lbGVtIHsKJiM0MzsJc3RydWN0IGJwZl90aW1lciB0aW1lcjsKJiM0MzsJc3RydWN0IGJwZl93cSB3b3JrOwomIzQzOwl1NjQgcHJldl9ldmVudDsKJiM0MzsJdTY0IGV2ZW50X2RlbHRhX3RocmVzaG9sZDsKJiM0MzsJdTY0IGNoZWNrX25zOwomIzQzO307CiYjNDM7CiYjNDM7c3RydWN0IHsKJiM0MzsJX191aW50KHR5cGUsIEJQRl9NQVBfVFlQRV9BUlJBWSk7CiYjNDM7CV9fdWludChtYXhfZW50cmllcywgMSk7CiYjNDM7CV9fdHlwZShrZXksIF9fdTMyKTsKJiM0MzsJX190eXBlKHZhbHVlLCBzdHJ1Y3Qgd3FfZWxlbSk7CiYjNDM7fSB3cV9tYXAgU0VDKCYjMzQ7Lm1hcHMmIzM0Oyk7CiYjNDM7CiYjNDM7c3RhdGljIGludCBhc3luY19mcmVlKHZvaWQgKm1hcCwgaW50ICprZXksIHZvaWQgKnZhbHVlKQomIzQzO3sKJiM0MzsJc3RydWN0IHdxX2VsZW0gKmVsZW0gPSB2YWx1ZTsKJiM0MzsKJiM0MzsJaWYgKHNob3VsZF9yZWNsYWltX2Nncm91cCh3cV9oaWdoX2Nncm91cF9pZCwgJmFtcDtlbGVtLSZndDtwcmV2X2V2ZW50LAomIzQzOwkJZWxlbS0mZ3Q7ZXZlbnRfZGVsdGFfdGhyZXNob2xkKSkgewomIzQzOwkJcmVjbGFpbV9jZ3JvdXAod3FfbG93X2Nncm91cF9pZCk7CiYjNDM7CQlicGZfd3Ffc3RhcnQoJmFtcDtlbGVtLSZndDt3b3JrLCAwKTsKJiM0MzsJfQomIzQzOwomIzQzOwlyZXR1cm4gMDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGludCB3cV90aW1lcl9jYih2b2lkICptYXAsIGludCAqa2V5LCBzdHJ1Y3Qgd3FfZWxlbSAqZWxlbSkKJiM0Mzt7CiYjNDM7CWJwZl93cV9zdGFydCgmYW1wO2VsZW0tJmd0O3dvcmssIDApOwomIzQzOwlicGZfdGltZXJfc3RhcnQoJmFtcDtlbGVtLSZndDt0aW1lciwgZWxlbS0mZ3Q7Y2hlY2tfbnMsIDApOwomIzQzOwomIzQzOwlyZXR1cm4gMDsKJiM0Mzt9CiYjNDM7CiYjNDM7U0VDKCYjMzQ7c3lzY2FsbCYjMzQ7KQomIzQzO2ludCB3cV9wcm9nX2luaXQoc3RydWN0IGJwZl9hcmdzX3MgKmN0eCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCB3cV9lbGVtICplbGVtOwomIzQzOwlfX3UzMiBrZXkgPSAwOwomIzQzOwlpbnQgcmV0OwomIzQzOwomIzQzOwllbGVtID0gYnBmX21hcF9sb29rdXBfZWxlbSgmYW1wO3dxX21hcCwgJmFtcDtrZXkpOwomIzQzOwlpZiAoIWVsZW0pCiYjNDM7CQlyZXR1cm4gLTE7CiYjNDM7CiYjNDM7CXJldCA9IGJwZl93cV9pbml0KCZhbXA7ZWxlbS0mZ3Q7d29yaywgJmFtcDt3cV9tYXAsIDApOwomIzQzOwlpZiAocmV0KQomIzQzOwkJcmV0dXJuIHJldDsKJiM0MzsKJiM0MzsJcmV0ID0gYnBmX3dxX3NldF9jYWxsYmFjaygmYW1wO2VsZW0tJmd0O3dvcmssIGFzeW5jX2ZyZWUsIDApOwomIzQzOwlpZiAocmV0KQomIzQzOwkJcmV0dXJuIHJldDsKJiM0MzsKJiM0MzsJcmV0ID0gYnBmX3RpbWVyX2luaXQoJmFtcDtlbGVtLSZndDt0aW1lciwgJmFtcDt3cV9tYXAsIENMT0NLX01PTk9UT05JQ19JRCk7CiYjNDM7CWlmIChyZXQpCiYjNDM7CQlyZXR1cm4gcmV0OwomIzQzOwomIzQzOwlyZXQgPSBicGZfdGltZXJfc2V0X2NhbGxiYWNrKCZhbXA7ZWxlbS0mZ3Q7dGltZXIsIHdxX3RpbWVyX2NiKTsKJiM0MzsJaWYgKHJldCkKJiM0MzsJCXJldHVybiByZXQ7CiYjNDM7CiYjNDM7CWVsZW0tJmd0O3ByZXZfZXZlbnQgPSAwOwomIzQzOwllbGVtLSZndDtldmVudF9kZWx0YV90aHJlc2hvbGQgPSBjdHgtJmd0O2V2ZW50X2RlbHRhX3RocmVzaG9sZDsKJiM0MzsJZWxlbS0mZ3Q7Y2hlY2tfbnMgPSBjdHgtJmd0O2NoZWNrX25zOwomIzQzOwomIzQzOwl3cV9oaWdoX2Nncm91cF9pZCA9IGN0eC0mZ3Q7aGlnaF9jZ3JvdXBfaWQ7CiYjNDM7CXdxX2xvd19jZ3JvdXBfaWQgPSBjdHgtJmd0O2xvd19jZ3JvdXBfaWQ7CiYjNDM7CiYjNDM7CXJldHVybiBicGZfdGltZXJfc3RhcnQoJmFtcDtlbGVtLSZndDt0aW1lciwgZWxlbS0mZ3Q7Y2hlY2tfbnMsIDApOwomIzQzO30KJiM0MzsKJiM0MztzdHJ1Y3QgdGhyZWFkX3dxX2VsZW0gewomIzQzOwlzdHJ1Y3QgYnBmX3RpbWVyIHRpbWVyOwomIzQzOwlzdHJ1Y3QgYnBmX3RocmVhZF93cSB3b3JrOwomIzQzOwl1NjQgcHJldl9ldmVudDsKJiM0MzsJdTY0IGV2ZW50X2RlbHRhX3RocmVzaG9sZDsKJiM0MzsJdTY0IGNoZWNrX25zOwomIzQzO307CiYjNDM7CiYjNDM7c3RydWN0IHsKJiM0MzsJX191aW50KHR5cGUsIEJQRl9NQVBfVFlQRV9BUlJBWSk7CiYjNDM7CV9fdWludChtYXhfZW50cmllcywgMSk7CiYjNDM7CV9fdHlwZShrZXksIF9fdTMyKTsKJiM0MzsJX190eXBlKHZhbHVlLCBzdHJ1Y3QgdGhyZWFkX3dxX2VsZW0pOwomIzQzO30gdGhyZWFkX3dxX21hcCBTRUMoJiMzNDsubWFwcyYjMzQ7KTsKJiM0MzsKJiM0MztzdGF0aWMgaW50IHRocmVhZF9hc3luY19mcmVlKHZvaWQgKm1hcCwgaW50ICprZXksIHZvaWQgKnZhbHVlKQomIzQzO3sKJiM0MzsJc3RydWN0IHRocmVhZF93cV9lbGVtICplbGVtID0gdmFsdWU7CiYjNDM7CiYjNDM7CWlmIChzaG91bGRfcmVjbGFpbV9jZ3JvdXAod3FfaGlnaF9jZ3JvdXBfaWQsICZhbXA7ZWxlbS0mZ3Q7cHJldl9ldmVudCwKJiM0MzsJCWVsZW0tJmd0O2V2ZW50X2RlbHRhX3RocmVzaG9sZCkpIHsKJiM0MzsJCXJlY2xhaW1fY2dyb3VwKHdxX2xvd19jZ3JvdXBfaWQpOwomIzQzOwkJYnBmX3RocmVhZF93cV9zdGFydCgmYW1wO2VsZW0tJmd0O3dvcmssIDApOwomIzQzOwl9CiYjNDM7CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50IHRocmVhZF93cV90aW1lcl9jYih2b2lkICptYXAsIGludCAqa2V5LCBzdHJ1Y3QgdGhyZWFkX3dxX2VsZW0gKmVsZW0pCiYjNDM7ewomIzQzOwlicGZfdGhyZWFkX3dxX3N0YXJ0KCZhbXA7ZWxlbS0mZ3Q7d29yaywgMCk7CiYjNDM7CWJwZl90aW1lcl9zdGFydCgmYW1wO2VsZW0tJmd0O3RpbWVyLCBlbGVtLSZndDtjaGVja19ucywgMCk7CiYjNDM7CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MzsKJiM0MztTRUMoJiMzNDtzeXNjYWxsJiMzNDspCiYjNDM7aW50IHRocmVhZF93cV9wcm9nX2luaXQoc3RydWN0IGJwZl9hcmdzX3MgKmN0eCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCB0aHJlYWRfd3FfZWxlbSAqZWxlbTsKJiM0MzsJX191MzIga2V5ID0gMDsKJiM0MzsJaW50IHJldDsKJiM0MzsKJiM0MzsJZWxlbSA9IGJwZl9tYXBfbG9va3VwX2VsZW0oJmFtcDt0aHJlYWRfd3FfbWFwLCAmYW1wO2tleSk7CiYjNDM7CWlmICghZWxlbSkKJiM0MzsJCXJldHVybiAtMTsKJiM0MzsKJiM0MzsJcmV0ID0gYnBmX3RocmVhZF93cV9pbml0KCZhbXA7ZWxlbS0mZ3Q7d29yaywgJmFtcDt0aHJlYWRfd3FfbWFwLAomIzQzOwkJCQkgY3R4LSZndDtsb3dfY2dyb3VwX2lkLCAwKTsKJiM0MzsJaWYgKHJldCkKJiM0MzsJCXJldHVybiByZXQ7CiYjNDM7CiYjNDM7CXJldCA9IGJwZl90aHJlYWRfd3Ffc2V0X2NhbGxiYWNrKCZhbXA7ZWxlbS0mZ3Q7d29yaywgdGhyZWFkX2FzeW5jX2ZyZWUsIDApOwomIzQzOwlpZiAocmV0KQomIzQzOwkJcmV0dXJuIHJldDsKJiM0MzsKJiM0MzsJcmV0ID0gYnBmX3RpbWVyX2luaXQoJmFtcDtlbGVtLSZndDt0aW1lciwgJmFtcDt0aHJlYWRfd3FfbWFwLCBDTE9DS19NT05PVE9OSUNfSUQpOwomIzQzOwlpZiAocmV0KQomIzQzOwkJcmV0dXJuIHJldDsKJiM0MzsKJiM0MzsJcmV0ID0gYnBmX3RpbWVyX3NldF9jYWxsYmFjaygmYW1wO2VsZW0tJmd0O3RpbWVyLCB0aHJlYWRfd3FfdGltZXJfY2IpOwomIzQzOwlpZiAocmV0KQomIzQzOwkJcmV0dXJuIHJldDsKJiM0MzsKJiM0MzsJZWxlbS0mZ3Q7cHJldl9ldmVudCA9IDA7CiYjNDM7CWVsZW0tJmd0O2V2ZW50X2RlbHRhX3RocmVzaG9sZCA9IGN0eC0mZ3Q7ZXZlbnRfZGVsdGFfdGhyZXNob2xkOwomIzQzOwllbGVtLSZndDtjaGVja19ucyA9IGN0eC0mZ3Q7Y2hlY2tfbnM7CiYjNDM7CiYjNDM7CXdxX2hpZ2hfY2dyb3VwX2lkID0gY3R4LSZndDtoaWdoX2Nncm91cF9pZDsKJiM0MzsJd3FfbG93X2Nncm91cF9pZCA9IGN0eC0mZ3Q7bG93X2Nncm91cF9pZDsKJiM0MzsKJiM0MzsJcmV0dXJuIGJwZl90aW1lcl9zdGFydCgmYW1wO2VsZW0tJmd0O3RpbWVyLCBlbGVtLSZndDtjaGVja19ucywgMCk7CiYjNDM7fQomIzQzOwomIzQzO2NoYXIgTElDRU5TRVtdIFNFQygmIzM0O2xpY2Vuc2UmIzM0OykgPSAmIzM0O0dQTCYjMzQ7OwpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL3RocmVhZF93cV9jZ3JvdXAuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy90aHJlYWRfd3FfY2dyb3VwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMC4uYzcwYTM3ZjU1Mzk3ZAotLS0gL2Rldi9udWxsCiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy90aHJlYWRfd3FfY2dyb3VwLmMKQEAgLTAsMCAmIzQzOzEsNTYgQEAKJiM0MzsvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMAomIzQzOy8qIENvcHlyaWdodCAoYykgMjAyNiAqLwomIzQzOwomIzQzOyNpbmNsdWRlICYjMzQ7YnBmX2V4cGVyaW1lbnRhbC5oJiMzNDsKJiM0MzsjaW5jbHVkZSAmbHQ7YnBmL2JwZl9oZWxwZXJzLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJiMzNDticGZfbWlzYy5oJiMzNDsKJiM0MzsKJiM0MztjaGFyIF9saWNlbnNlW10gU0VDKCYjMzQ7bGljZW5zZSYjMzQ7KSA9ICYjMzQ7R1BMJiMzNDs7CiYjNDM7CiYjNDM7c3RydWN0IGVsZW0gewomIzQzOwlzdHJ1Y3QgYnBmX3RocmVhZF93cSB0d3E7CiYjNDM7fTsKJiM0MzsKJiM0MztzdHJ1Y3QgewomIzQzOwlfX3VpbnQodHlwZSwgQlBGX01BUF9UWVBFX0FSUkFZKTsKJiM0MzsJX191aW50KG1heF9lbnRyaWVzLCAyKTsKJiM0MzsJX190eXBlKGtleSwgaW50KTsKJiM0MzsJX190eXBlKHZhbHVlLCBzdHJ1Y3QgZWxlbSk7CiYjNDM7fSBtYXBfYXJyIFNFQygmIzM0Oy5tYXBzJiMzNDspOwomIzQzOwomIzQzO19fdTY0IHRhcmdldF9jZ3JvdXBfaWQ7CiYjNDM7X191NjQgY2FsbGJhY2tfY2dyb3VwX2lkOwomIzQzO2ludCB0d3FfZG9uZTsKJiM0MztpbnQgdGVzdF9rZXk7CiYjNDM7CiYjNDM7c3RhdGljIGludCB0d3FfY2FsbGJhY2sodm9pZCAqbWFwLCBpbnQgKmtleSwgdm9pZCAqdmFsdWUpCiYjNDM7ewomIzQzOwljYWxsYmFja19jZ3JvdXBfaWQgPSBicGZfZ2V0X2N1cnJlbnRfY2dyb3VwX2lkKCk7CiYjNDM7CXR3cV9kb25lID0gMTsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOwomIzQzO1NFQygmIzM0O3N5c2NhbGwmIzM0OykKJiM0MztpbnQgc3RhcnRfdGhyZWFkX3dxKHZvaWQgKmN0eCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBlbGVtICp2YWw7CiYjNDM7CWludCBrZXkgPSB0ZXN0X2tleTsKJiM0MzsJaW50IHJldDsKJiM0MzsKJiM0MzsJdmFsID0gYnBmX21hcF9sb29rdXBfZWxlbSgmYW1wO21hcF9hcnIsICZhbXA7a2V5KTsKJiM0MzsJaWYgKCF2YWwpCiYjNDM7CQlyZXR1cm4gLTE7CiYjNDM7CiYjNDM7CXJldCA9IGJwZl90aHJlYWRfd3FfaW5pdCgmYW1wO3ZhbC0mZ3Q7dHdxLCAmYW1wO21hcF9hcnIsIHRhcmdldF9jZ3JvdXBfaWQsIDApOwomIzQzOwlpZiAocmV0KQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CiYjNDM7CXJldCA9IGJwZl90aHJlYWRfd3Ffc2V0X2NhbGxiYWNrKCZhbXA7dmFsLSZndDt0d3EsIHR3cV9jYWxsYmFjaywgMCk7CiYjNDM7CWlmIChyZXQpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsKJiM0MzsJcmV0ID0gYnBmX3RocmVhZF93cV9zdGFydCgmYW1wO3ZhbC0mZ3Q7dHdxLCAwKTsKJiM0MzsKJiM0MztvdXQ6CiYjNDM7CXJldHVybiByZXQ7CiYjNDM7fQo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNyAwODo1MDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyNTU1NAoJCQkJCQkJb3V0cHV0OiAyOQoJCQkJCQkJdGhvdWdodHM6IDM2MQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgdGhlIE5ldyBCUEYgVGhyZWFkIFdvcmtxdWV1ZSBGZWF0dXJlKioKCk9rYXksIHNvIHRoaXMgcGF0Y2ggaXMgaW50cm9kdWNpbmcgc29tZXRoaW5nIGludGVyZXN0aW5nOiBhIG5ldyBCUEYgZmVhdHVyZSBjYWxsZWQgYGJwZl90aHJlYWRfd3FgLiBSaWdodCBvZmYgdGhlIGJhdCwgSSBzZWUgdGhlIGFkZGl0aW9uIG9mIGBCUEZfVEhSRUFEX1dRYCB0byBgZW51bSBidGZfZmllbGRfdHlwZWAsIHdoaWNoIHRlbGxzIG1lIHRoaXMgaXMgYSBwcmV0dHkgZnVuZGFtZW50YWwgY2hhbmdlIHRvIHRoZSBCUEYgbGFuZHNjYXBlLiBXZSYjMzk7cmUgbG9va2luZyBhdCBmb3VyIG5ldyBmdW5jdGlvbnM6IGBicGZfdGhyZWFkX3dxX2luaXRgLCBgYnBmX3RocmVhZF93cV9zZXRfY2FsbGJhY2tgLCBgYnBmX3RocmVhZF93cV9zdGFydGAsIGFuZCBgYnBmX3RocmVhZF93cV9jYW5jZWxfYW5kX2ZyZWVgLiBUaGVuIHRoZXJlJiMzOTtzIGBicGZfdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlc2AgYXMgd2VsbC4gVGhpcyBhbGwgbG9va3MgbGlrZSB0aGUgZnJhbWV3b3JrIHRvIGFsbG93IEJQRiBwcm9ncmFtcyB0byBzY2hlZHVsZSB0YXNrcyBvbiBrdGhyZWFkIHdvcmtlcnMsIGFuZCwgYXMgYW4gb3B0aW9uYWwgZmVhdHVyZSwgYXR0YWNoIHRob3NlIHRhc2tzIHRvIGEgc3BlY2lmaWMgY2dyb3VwLiBEZWZpbml0ZWx5IHNvdW5kcyBsaWtlIGEgY2FuZGlkYXRlIGZvciBzb21lIHNlcmlvdXMgZnV6emluZyDigJMgZ290dGEgc2VlIHdoZXJlIHRoZSBlZGdlIGNhc2VzIGxpZS4KCkxldCYjMzk7cyBuYWlsIGRvd24gdGhlIGtleSBzeW1ib2xzIHdlIG5lZWQgdG8gaW52ZXN0aWdhdGU6IGBicGZfdGhyZWFkX3dxX2luaXRgLCBgYnBmX3RocmVhZF93cV9zZXRfY2FsbGJhY2tgLCBgYnBmX3RocmVhZF93cV9zdGFydGAsIGFuZCBgYnBmX3RyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXNgLiBUaG9zZSBhcmUgdGhlIGVudHJ5IHBvaW50cyBoZXJlLgoKTmV4dCwgSSBuZWVkIHRvIGNoZWNrIGZvciBhbnkgY3JpdGljYWwgYENPTkZJR2Agb3B0aW9ucyB0aGF0IG1pZ2h0IGJlIHJlcXVpcmVkLiBGcm9tIHRoZSBsb29rIG9mIGl0LCBgYnBmX3RocmVhZF93cV9pbml0YCB3aWxsIHVzZSBgQ09ORklHX0NHUk9VUFNgIHRvIGF0dGFjaCB0byBhIGNncm91cCwgYnV0IGl0IGxvb2tzIGxpa2UgaXQgd2lsbCBncmFjZWZ1bGx5IGRlZ3JhZGUgd2l0aCBgLUVPUE5PVFNVUFBgIGlmIGNncm91cHMgYXJlbiYjMzk7dCBlbmFibGVkLiBUaGF0JiMzOTtzIGdvb2QsIGxlc3Mgb2YgYSBoYXJkIGRlcGVuZGVuY3kuIE5vdywgYGJwZl90cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzYCDigJMgdGhhdCYjMzk7cyBsb2NhdGVkIGluIGBtbS9icGZfbWVtY29udHJvbC5jYC4gU2luY2UgdGhhdCBmaWxlIGlzIGRlYWxpbmcgd2l0aCBtZW1vcnkgY29udHJvbCwgaXQgbWFrZXMgc2Vuc2UgdGhhdCBgQ09ORklHX01FTUNHYCBhbmQgYENPTkZJR19CUEZfU1lTQ0FMTGAgYXJlIGxpa2VseSBkZXBlbmRlbmNpZXMsIGJ1dCBJIHNob3VsZCBwcm9iYWJseSBjaGVjayB0aGUgYG1tL01ha2VmaWxlYCB0byBjb25maXJtIHRoZSBkZXRhaWxzLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA3IDA4OjUwPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2JwZl9tZW1jb250cm9sLm8mIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDttbS8mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bW0vTWFrZWZpbGU9MTA2PWlmZGVmIENPTkZJR19CUEZfU1lTQ0FMTFxubW0vTWFrZWZpbGU6MTA3Om9iai0kKENPTkZJR19NRU1DRykgJiM0Mzs9IGJwZl9tZW1jb250cm9sLm9cbm1tL01ha2VmaWxlLTEwOC1lbmRpZlxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjUvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA3IDA4OjUwPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDI2NDY2CgkJCQkJCQlvdXRwdXQ6IDIwNQoJCQkJCQkJdGhvdWdodHM6IDgzMgoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgdGhlIE5ldyBCUEYgVGhyZWFkIFdvcmtxdWV1ZSBGZWF0dXJlKioKCk9rYXksIHNvIEkmIzM5O20gZGlnZ2luZyBpbnRvIHRoaXMgbmV3IEJQRiB0aHJlYWQgd29ya3F1ZXVlIHBhdGNoLiBGaXJzdCB0aGluZ3MgZmlyc3Q6IGl0IGxvb2tzIGxpa2Ugd2UgbmVlZCBgQ09ORklHX01FTUNHYCBmb3IgYGJwZl90cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzYCwgd2hpY2ggbWFrZXMgc2Vuc2UgZm9yIG1lbW9yeSBjb250cm9sLCBhbmQgYENPTkZJR19DR1JPVVBTYCBpcyByZXF1aXJlZCBmb3IgYGJwZl90aHJlYWRfd3FfaW5pdGAgdG8gZnVuY3Rpb24gZnVsbHkgd2l0aCBjZ3JvdXBzLCBhbmQgdGhlbiBvZiBjb3Vyc2UgYENPTkZJR19CUEZfU1lTQ0FMTGAgaXMgc3RhbmRhcmQgZm9yIEJQRiwgc28gbGV0JiMzOTtzIG1hcmsgdGhhdCBhcyB1bmRlcnN0b29kLgoKTGV0IG1lIGNvbmZpcm0gdGhhdCBgYnBmX3RocmVhZF93cV9pbml0YCBpcyBhY3R1YWxseSBhdmFpbGFibGUuIFllcCwgaXQmIzM5O3MgZGVmaW5lZCByaWdodCB0aGVyZSBpbiBga2VybmVsL2JwZi9oZWxwZXJzLmNgLiBHb29kLiBBbHJpZ2h0LCB3aGF0IGVsc2UgaXMgaW4gcGxheT8gSG1tLCBgYnBmX3RocmVhZF93cV9jYW5jZWxfYW5kX2ZyZWVgIGlzIGludGVyZXN0aW5nLCBpdCBpcyBjYWxsZWQgaW50ZXJuYWxseSB3aGVuIG1hcHMgYXJlIGZyZWVkLiBJdCYjMzk7cyBub3QgYSBkaXJlY3Qga2Z1bmMgdXNlZCBieSBCUEYgcHJvZ3JhbXMsIGJ1dCBkZWZpbml0ZWx5IHBhcnQgb2YgdGhlIGxpZmVjeWNsZS4gQW5kIGBicGZfb2JqX2ZyZWVfdGhyZWFkX3dxYCBpcyBhbHNvIGludGVybmFsLgoKT2theSwgc28gdGhlIGtmdW5jcyB3ZSAqZG8qIG5lZWQgdG8gZm9jdXMgb24gYXJlOiBgYnBmX3RocmVhZF93cV9pbml0YCwgYGJwZl90aHJlYWRfd3Ffc2V0X2NhbGxiYWNrYCwgYGJwZl90aHJlYWRfd3Ffc3RhcnRgLCBhbmQgYGJwZl90cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzYC4gTm93LCBsZXQmIzM5O3MgdmVyaWZ5IHRoYXQgdGhlc2Uga2Z1bmNzIGFyZSBhY3R1YWxseSBleHBvc2VkLiBgYnBmX3RocmVhZF93cV9pbml0YCBpcyBhZGRlZCB0byBgc3lzY2FsbF9idGZfaWRzYCB3aGljaCBpcyByZWdpc3RlcmVkIGZvciBgQlBGX1BST0dfVFlQRV9TWVNDQUxMYC4gR29vZC4gYGJwZl90aHJlYWRfd3Ffc2V0X2NhbGxiYWNrYCBhbmQgYGJwZl90aHJlYWRfd3Ffc3RhcnRgIGFyZSBpbiBgZ2VuZXJpY19idGZfaWRzYCwgd2hpY2ggaXMgcmVnaXN0ZXJlZCBmb3IgYSBidW5jaCBvZiBwcm9ncmFtIHR5cGVzLCBzbyB0aGF0JiMzOTtzIGZpbmUuIEFuZCBgYnBmX3RyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXNgIGlzIGluIGBicGZfbWVtY29udHJvbF9rZnVuY3NgLiBDb25maXJtZWQsIGNvbmZpcm1lZCwgY29uZmlybWVkLgoKU28sIHRoZSBrZXkgc3ltYm9scyB0byBrZWVwIGFuIGV5ZSBvbiBhcmU6IGBicGZfdGhyZWFkX3dxX2luaXRgLCBgYnBmX3RocmVhZF93cV9zZXRfY2FsbGJhY2tgLCBgYnBmX3RocmVhZF93cV9zdGFydGAsIGFuZCBgYnBmX3RyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXNgLiBBbmQgdGhlbiB0aGUgcmVsZXZhbnQgY29uZmlnIG9wdGlvbnMgYXJlIGBNRU1DR2AgYW5kIGBDR1JPVVBTYC4KCkp1c3QgZG91YmxlLWNoZWNraW5nLi4uIGBicGZfdGhyZWFkX3dxX2NhbmNlbF9hbmRfZnJlZWAuIE5vLCB0aGF0JiMzOTtzIGp1c3QgYSBnbG9iYWwgZnVuY3Rpb24sIGludGVybmFsIHRvIGBrZXJuZWwvYnBmL2hlbHBlcnMuY2AuIFdhaXQuLi5idXQgYGJwZl9vYmpfZnJlZV90aHJlYWRfd3FgIGFuZCBgYnBmX29ial9mcmVlX2ZpZWxkc2AgY2FsbCBpdC4KCk9oLCBvbmUgbW9yZSB0aGluZyB0byBjb25zaWRlcjogYGNncm91cF9rdGhyZWFkX2F0dGFjaGAsIHdoaWNoIGlzIGFkZGVkIGluIGBrZXJuZWwvY2dyb3VwL2Nncm91cC5jYC4gSXQmIzM5O3MgYSBnbG9iYWwgZnVuY3Rpb24sIGFuZCBhIGhlbHBlciBmb3IgYGJwZl90aHJlYWRfd3FfaW5pdGAuIE9rYXksIEkgdGhpbmsgdGhhdCAqc2hvdWxkKiBiZSBpbmNsdWRlZCBpbiB0aGUgbGlzdCBvZiBmb2N1cyBzeW1ib2xzLCBldmVuIHRob3VnaCBpdCYjMzk7cyB0ZWNobmljYWxseSBhIGhlbHBlciBmdW5jdGlvbi4KCkFscmlnaHQsIGxldCYjMzk7cyByZWNhcCB0aGUgcmVhc29uaW5nOiB0aGlzIHBhdGNoIGludHJvZHVjZXMgYSBuZXcgQlBGIHRocmVhZCB3b3JrcXVldWUsIGxldHRpbmcgQlBGIHByb2dyYW1zIHNjaGVkdWxlIHdvcmsgaW4ga3RocmVhZCBjb250ZXh0LCBvcHRpb25hbGx5IHRpZWQgdG8gYSBjZ3JvdXAsIGFuZCBhbHNvIGFkZHMgYGJwZl90cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzYCBmb3IgbWVtb3J5IGNncm91cCByZWNsYWltLiBUaGVzZSBhcmUgZnVuY3Rpb25hbCBjaGFuZ2VzIHRvIHRoZSBCUEYgY29yZSBhbmQgbWVtb3J5IGNvbnRyb2wsIGFjY2Vzc2libGUgZnJvbSB1c2Vyc3BhY2UgdGhyb3VnaCBCUEYgcHJvZ3JhbXMsIHNvIGRlZmluaXRlbHkgZnV6emFibGUuCgoqKkZpbmFsIEZvY3VzIFN5bWJvbHM6KioKCiogICBgYnBmX3RocmVhZF93cV9pbml0YAoqICAgYGJwZl90aHJlYWRfd3Ffc2V0X2NhbGxiYWNrYAoqICAgYGJwZl90aHJlYWRfd3Ffc3RhcnRgCiogICBgYnBmX3RyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXNgCiogICBgY2dyb3VwX2t0aHJlYWRfYXR0YWNoYAoKKipSZWxldmFudCBDb25maWdzOioqCgoqICAgYE1FTUNHYAoqICAgYENHUk9VUFNgCgpPa2F5LCB0aGF0JiMzOTtzIGV2ZXJ5dGhpbmcuIExldCYjMzk7cyBzZW5kIHRoZXNlIHJlc3VsdHMgb3Zlci4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD42LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNyAwODo1MTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnNldC1yZXN1bHRzPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7TUVNQ0cmIzM0OywKICAgICYjMzQ7Q0dST1VQUyYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O2JwZl90aHJlYWRfd3FfaW5pdCYjMzQ7LAogICAgJiMzNDticGZfdGhyZWFkX3dxX3NldF9jYWxsYmFjayYjMzQ7LAogICAgJiMzNDticGZfdGhyZWFkX3dxX3N0YXJ0JiMzNDssCiAgICAmIzM0O2JwZl90cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzJiMzNDssCiAgICAmIzM0O2Nncm91cF9rdGhyZWFkX2F0dGFjaCYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBpbnRyb2R1Y2VzIGEgbmV3IEJQRiB0aHJlYWQgd29ya3F1ZXVlIGZlYXR1cmUgKGBicGZfdGhyZWFkX3dxYCkgdGhhdCBhbGxvd3MgQlBGIHByb2dyYW1zIHRvIHNjaGVkdWxlIHdvcmsgaW4gYSBrdGhyZWFkIGNvbnRleHQsIG9wdGlvbmFsbHkgYXR0YWNoZWQgdG8gYSBjZ3JvdXAuIEl0IGFsc28gYWRkcyBhIG5ldyBCUEYga2Z1bmMgYGJwZl90cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzYCBmb3IgbWVtb3J5IGNncm91cCByZWNsYWltLiBUaGVzZSBhcmUgZnVuY3Rpb25hbCBjaGFuZ2VzIHRvIHRoZSBjb3JlIEJQRiBhbmQgbWVtb3J5IGNvbnRyb2wgc3Vic3lzdGVtcywgcmVhY2hhYmxlIGZyb20gdXNlcnNwYWNlIHZpYSBCUEYgcHJvZ3JhbXMsIGFuZCBzaG91bGQgYmUgZnV6emVkLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtNRU1DRyYjMzQ7LAogICAgJiMzNDtDR1JPVVBTJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7YnBmX3RocmVhZF93cV9pbml0JiMzNDssCiAgICAmIzM0O2JwZl90aHJlYWRfd3Ffc2V0X2NhbGxiYWNrJiMzNDssCiAgICAmIzM0O2JwZl90aHJlYWRfd3Ffc3RhcnQmIzM0OywKICAgICYjMzQ7YnBmX3RyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMmIzM0OywKICAgICYjMzQ7Y2dyb3VwX2t0aHJlYWRfYXR0YWNoJiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIGludHJvZHVjZXMgYSBuZXcgQlBGIHRocmVhZCB3b3JrcXVldWUgZmVhdHVyZSAoYGJwZl90aHJlYWRfd3FgKSB0aGF0IGFsbG93cyBCUEYgcHJvZ3JhbXMgdG8gc2NoZWR1bGUgd29yayBpbiBhIGt0aHJlYWQgY29udGV4dCwgb3B0aW9uYWxseSBhdHRhY2hlZCB0byBhIGNncm91cC4gSXQgYWxzbyBhZGRzIGEgbmV3IEJQRiBrZnVuYyBgYnBmX3RyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXNgIGZvciBtZW1vcnkgY2dyb3VwIHJlY2xhaW0uIFRoZXNlIGFyZSBmdW5jdGlvbmFsIGNoYW5nZXMgdG8gdGhlIGNvcmUgQlBGIGFuZCBtZW1vcnkgY29udHJvbCBzdWJzeXN0ZW1zLCByZWFjaGFibGUgZnJvbSB1c2Vyc3BhY2UgdmlhIEJQRiBwcm9ncmFtcywgYW5kIHNob3VsZCBiZSBmdXp6ZWQuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPC90Ym9keT4KCTwvdGFibGU+CgoJPGRpdiBpZD0ibGxtX3N1bW1hcnlfdGFibGVfZGl2IiBzdHlsZT0ibWFyZ2luOiAyMHB4IDA7Ij4KCQk8dGFibGUgY2xhc3M9Imxpc3RfdGFibGUiPgoJCQk8Y2FwdGlvbj5MTE0gQ2FsbHMgU3VtbWFyeTo8L2NhcHRpb24+CgkJCTx0aGVhZD4KCQkJCTx0cj4KCQkJCQk8dGg+VG90YWwgQ2FsbHM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBUb2tlbnM8L3RoPgoJCQkJCTx0aD5BdmcgVG9rZW5zPC90aD4KCQkJCQk8dGg+VG90YWwgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCQk8dGg+QXZnIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQk8L3RyPgoJCQk8L3RoZWFkPgoJCQk8dGJvZHkgaWQ9ImxsbV9zdW1tYXJ5X3N0YXRzX2JvZHkiPjwvdGJvZHk+CgkJPC90YWJsZT4KCTwvZGl2PgoKCTxkaXYgaWQ9InRvb2xfc3VtbWFyeV90YWJsZV9kaXYiIHN0eWxlPSJtYXJnaW46IDIwcHggMDsiPgoJCTx0YWJsZSBjbGFzcz0ibGlzdF90YWJsZSI+CgkJCTxjYXB0aW9uPlRvb2wgQ2FsbHMgU3VtbWFyeTo8L2NhcHRpb24+CgkJCTx0aGVhZD4KCQkJCTx0cj4KCQkJCQk8dGg+VG90YWwgQ2FsbHM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJCTx0aD5BdmcgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCTwvdHI+CgkJCTwvdGhlYWQ+CgkJCTx0Ym9keSBpZD0idG9vbF9zdW1tYXJ5X3N0YXRzX2JvZHkiPjwvdGJvZHk+CgkJPC90YWJsZT4KCTwvZGl2PgoKCTxkaXYgaWQ9ImR1cmF0aW9uX2NoYXJ0X2RpdiIgc3R5bGU9IndpZHRoOiAxMDAlOyBtYXJnaW46IDIwcHggMDsgYm9yZGVyOiAxcHg7Ij48L2Rpdj4KCTxkaXYgaWQ9InRva2VuX2NoYXJ0X2RpdiIgc3R5bGU9IndpZHRoOiAxMDAlOyBtYXJnaW46IDIwcHggMDsgYm9yZGVyOiAxcHg7Ij48L2Rpdj4KCgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJodHRwczovL3d3dy5nb29nbGUuY29tL2pzYXBpIj48L3NjcmlwdD4KCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KCQlnb29nbGUubG9hZCgidmlzdWFsaXphdGlvbiIsICIxIiwge3BhY2thZ2VzOlsiY29yZWNoYXJ0Il19KTsKCQlnb29nbGUuc2V0T25Mb2FkQ2FsbGJhY2soZHJhd0NoYXJ0cyk7CgoJCWZ1bmN0aW9uIGRyYXdDaGFydHMoKSB7CgkJCWNvbnN0IHJhd0RhdGEgPSBbeyJTdGFydGVkIjoiMjAyNi0wOC0wN1QwODo1MDo0Mi4zNTQ0NTU3MzRaIiwiU2VxIjowLCJOZXN0aW5nIjowLCJUeXBlIjoiZmxvdyIsIk5hbWUiOiJwYXRjaC10cmlhZ2UiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyNDk0MzkzNjA5MCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJNRU1DR1wiLFxuICAgIFwiQ0dST1VQU1wiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcImJwZl90aHJlYWRfd3FfaW5pdFwiLFxuICAgIFwiYnBmX3RocmVhZF93cV9zZXRfY2FsbGJhY2tcIixcbiAgICBcImJwZl90aHJlYWRfd3Ffc3RhcnRcIixcbiAgICBcImJwZl90cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzXCIsXG4gICAgXCJjZ3JvdXBfa3RocmVhZF9hdHRhY2hcIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBpbnRyb2R1Y2VzIGEgbmV3IEJQRiB0aHJlYWQgd29ya3F1ZXVlIGZlYXR1cmUgKGBicGZfdGhyZWFkX3dxYCkgdGhhdCBhbGxvd3MgQlBGIHByb2dyYW1zIHRvIHNjaGVkdWxlIHdvcmsgaW4gYSBrdGhyZWFkIGNvbnRleHQsIG9wdGlvbmFsbHkgYXR0YWNoZWQgdG8gYSBjZ3JvdXAuIEl0IGFsc28gYWRkcyBhIG5ldyBCUEYga2Z1bmMgYGJwZl90cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzYCBmb3IgbWVtb3J5IGNncm91cCByZWNsYWltLiBUaGVzZSBhcmUgZnVuY3Rpb25hbCBjaGFuZ2VzIHRvIHRoZSBjb3JlIEJQRiBhbmQgbWVtb3J5IGNvbnRyb2wgc3Vic3lzdGVtcywgcmVhY2hhYmxlIGZyb20gdXNlcnNwYWNlIHZpYSBCUEYgcHJvZ3JhbXMsIGFuZCBzaG91bGQgYmUgZnV6emVkLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0wN1QwODo1MDo0Mi4zNTQ0NjM0MzRaIiwiU2VxIjoxLCJOZXN0aW5nIjoxLCJUeXBlIjoiYWN0aW9uIiwiTmFtZSI6InJlYWQtcGF0Y2gtZGlmZiIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjEzNTM4NzM0MDMsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIlBhdGNoRGlmZlwiOiBcImNvbW1pdCBlNzJlMmMwMDhjOTUxZmE1ZDA3YWJhYWQ5ZDMyZTg3Nzg3OWUyZWE3XFxuQXV0aG9yOiBzeXotY2x1c3RlciBcXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cXHUwMDNlXFxuRGF0ZTogICBGcmkgQXVnIDcgMDg6NTA6NDAgMjAyNiArMDAwMFxcblxcbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcXG5cXG5kaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9icGYuaCBiL2luY2x1ZGUvbGludXgvYnBmLmhcXG5pbmRleCA3M2JhY2ZjNjQ0NGRmLi5kNjNjZTgzMTk4Njk2IDEwMDY0NFxcbi0tLSBhL2luY2x1ZGUvbGludXgvYnBmLmhcXG4rKysgYi9pbmNsdWRlL2xpbnV4L2JwZi5oXFxuQEAgLTIxMyw2ICsyMTMsNyBAQCBlbnVtIGJ0Zl9maWVsZF90eXBlIHtcXG4gXFx0QlBGX1VQVFIgICAgICAgPSAoMSBcXHUwMDNjXFx1MDAzYyAxMSksXFxuIFxcdEJQRl9SRVNfU1BJTl9MT0NLID0gKDEgXFx1MDAzY1xcdTAwM2MgMTIpLFxcbiBcXHRCUEZfVEFTS19XT1JLICA9ICgxIFxcdTAwM2NcXHUwMDNjIDEzKSxcXG4rXFx0QlBGX1RIUkVBRF9XUSAgPSAoMSBcXHUwMDNjXFx1MDAzYyAxNCksXFxuIH07XFxuIFxcbiBlbnVtIGJwZl9jZ3JvdXBfc3RvcmFnZV90eXBlIHtcXG5AQCAtMjY3LDYgKzI2OCw3IEBAIHN0cnVjdCBidGZfcmVjb3JkIHtcXG4gXFx0aW50IHdxX29mZjtcXG4gXFx0aW50IHJlZmNvdW50X29mZjtcXG4gXFx0aW50IHRhc2tfd29ya19vZmY7XFxuK1xcdGludCB0aHJlYWRfd3Ffb2ZmO1xcbiBcXHRzdHJ1Y3QgYnRmX2ZpZWxkIGZpZWxkc1tdO1xcbiB9O1xcbiBcXG5AQCAtMzcyLDYgKzM3NCw4IEBAIHN0YXRpYyBpbmxpbmUgY29uc3QgY2hhciAqYnRmX2ZpZWxkX3R5cGVfbmFtZShlbnVtIGJ0Zl9maWVsZF90eXBlIHR5cGUpXFxuIFxcdFxcdHJldHVybiBcXFwiYnBmX3JlZmNvdW50XFxcIjtcXG4gXFx0Y2FzZSBCUEZfVEFTS19XT1JLOlxcbiBcXHRcXHRyZXR1cm4gXFxcImJwZl90YXNrX3dvcmtcXFwiO1xcbitcXHRjYXNlIEJQRl9USFJFQURfV1E6XFxuK1xcdFxcdHJldHVybiBcXFwiYnBmX3RocmVhZF93cVxcXCI7XFxuIFxcdGRlZmF1bHQ6XFxuIFxcdFxcdFdBUk5fT05fT05DRSgxKTtcXG4gXFx0XFx0cmV0dXJuIFxcXCJ1bmtub3duXFxcIjtcXG5AQCAtNDEyLDYgKzQxNiw4IEBAIHN0YXRpYyBpbmxpbmUgdTMyIGJ0Zl9maWVsZF90eXBlX3NpemUoZW51bSBidGZfZmllbGRfdHlwZSB0eXBlKVxcbiBcXHRcXHRyZXR1cm4gc2l6ZW9mKHN0cnVjdCBicGZfcmVmY291bnQpO1xcbiBcXHRjYXNlIEJQRl9UQVNLX1dPUks6XFxuIFxcdFxcdHJldHVybiBzaXplb2Yoc3RydWN0IGJwZl90YXNrX3dvcmspO1xcbitcXHRjYXNlIEJQRl9USFJFQURfV1E6XFxuK1xcdFxcdHJldHVybiBzaXplb2Yoc3RydWN0IGJwZl90aHJlYWRfd3EpO1xcbiBcXHRkZWZhdWx0OlxcbiBcXHRcXHRXQVJOX09OX09OQ0UoMSk7XFxuIFxcdFxcdHJldHVybiAwO1xcbkBAIC00NDYsNiArNDUyLDggQEAgc3RhdGljIGlubGluZSB1MzIgYnRmX2ZpZWxkX3R5cGVfYWxpZ24oZW51bSBidGZfZmllbGRfdHlwZSB0eXBlKVxcbiBcXHRcXHRyZXR1cm4gX19hbGlnbm9mX18oc3RydWN0IGJwZl9yZWZjb3VudCk7XFxuIFxcdGNhc2UgQlBGX1RBU0tfV09SSzpcXG4gXFx0XFx0cmV0dXJuIF9fYWxpZ25vZl9fKHN0cnVjdCBicGZfdGFza193b3JrKTtcXG4rXFx0Y2FzZSBCUEZfVEhSRUFEX1dROlxcbitcXHRcXHRyZXR1cm4gX19hbGlnbm9mX18oc3RydWN0IGJwZl90aHJlYWRfd3EpO1xcbiBcXHRkZWZhdWx0OlxcbiBcXHRcXHRXQVJOX09OX09OQ0UoMSk7XFxuIFxcdFxcdHJldHVybiAwO1xcbkBAIC00NzgsNiArNDg2LDcgQEAgc3RhdGljIGlubGluZSB2b2lkIGJwZl9vYmpfaW5pdF9maWVsZChjb25zdCBzdHJ1Y3QgYnRmX2ZpZWxkICpmaWVsZCwgdm9pZCAqYWRkcilcXG4gXFx0Y2FzZSBCUEZfS1BUUl9QRVJDUFU6XFxuIFxcdGNhc2UgQlBGX1VQVFI6XFxuIFxcdGNhc2UgQlBGX1RBU0tfV09SSzpcXG4rXFx0Y2FzZSBCUEZfVEhSRUFEX1dROlxcbiBcXHRcXHRicmVhaztcXG4gXFx0ZGVmYXVsdDpcXG4gXFx0XFx0V0FSTl9PTl9PTkNFKDEpO1xcbkBAIC01MDIsNiArNTExLDcgQEAgc3RhdGljIGlubGluZSBib29sIGJ0Zl9maWVsZF9pc19ubWlfc2FmZShlbnVtIGJ0Zl9maWVsZF90eXBlIHR5cGUpXFxuIFxcdGNhc2UgQlBGX1RBU0tfV09SSzpcXG4gXFx0Y2FzZSBCUEZfS1BUUl9VTlJFRjpcXG4gXFx0Y2FzZSBCUEZfUkVGQ09VTlQ6XFxuK1xcdGNhc2UgQlBGX1RIUkVBRF9XUTpcXG4gXFx0XFx0cmV0dXJuIHRydWU7XFxuIFxcdGRlZmF1bHQ6XFxuIFxcdFxcdHJldHVybiBmYWxzZTtcXG5AQCAtNjQ0LDYgKzY1NCw3IEBAIHZvaWQgY29weV9tYXBfdmFsdWVfbG9ja2VkKHN0cnVjdCBicGZfbWFwICptYXAsIHZvaWQgKmRzdCwgdm9pZCAqc3JjLFxcbiB2b2lkIGJwZl90aW1lcl9jYW5jZWxfYW5kX2ZyZWUodm9pZCAqdGltZXIpO1xcbiB2b2lkIGJwZl93cV9jYW5jZWxfYW5kX2ZyZWUodm9pZCAqdGltZXIpO1xcbiB2b2lkIGJwZl90YXNrX3dvcmtfY2FuY2VsX2FuZF9mcmVlKHZvaWQgKnRpbWVyKTtcXG4rdm9pZCBicGZfdGhyZWFkX3dxX2NhbmNlbF9hbmRfZnJlZSh2b2lkICp2YWwpO1xcbiB2b2lkIGJwZl9saXN0X2hlYWRfZnJlZShjb25zdCBzdHJ1Y3QgYnRmX2ZpZWxkICpmaWVsZCwgdm9pZCAqbGlzdF9oZWFkLFxcbiBcXHRcXHRcXHRzdHJ1Y3QgYnBmX3NwaW5fbG9jayAqc3Bpbl9sb2NrKTtcXG4gdm9pZCBicGZfcmJfcm9vdF9mcmVlKGNvbnN0IHN0cnVjdCBidGZfZmllbGQgKmZpZWxkLCB2b2lkICpyYl9yb290LFxcbkBAIC03MDEsNyArNzEyLDggQEAgYm9vbCBicGZfbWFwX21ldGFfZXF1YWwoY29uc3Qgc3RydWN0IGJwZl9tYXAgKm1ldGEwLFxcbiBcXG4gc3RhdGljIGlubGluZSBib29sIGJwZl9tYXBfaGFzX2ludGVybmFsX3N0cnVjdHMoc3RydWN0IGJwZl9tYXAgKm1hcClcXG4ge1xcbi1cXHRyZXR1cm4gYnRmX3JlY29yZF9oYXNfZmllbGQobWFwLVxcdTAwM2VyZWNvcmQsIEJQRl9USU1FUiB8IEJQRl9XT1JLUVVFVUUgfCBCUEZfVEFTS19XT1JLKTtcXG4rXFx0cmV0dXJuIGJ0Zl9yZWNvcmRfaGFzX2ZpZWxkKG1hcC1cXHUwMDNlcmVjb3JkLCBCUEZfVElNRVIgfCBCUEZfV09SS1FVRVVFIHxcXG4rXFx0XFx0XFx0XFx0XFx0XFx0IEJQRl9UQVNLX1dPUksgfCBCUEZfVEhSRUFEX1dRKTtcXG4gfVxcbiBcXG4gdm9pZCBicGZfbWFwX2ZyZWVfaW50ZXJuYWxfc3RydWN0cyhzdHJ1Y3QgYnBmX21hcCAqbWFwLCB2b2lkICpvYmopO1xcbkBAIC0yNzI1LDYgKzI3MzcsNyBAQCBib29sIGJ0Zl9yZWNvcmRfZXF1YWwoY29uc3Qgc3RydWN0IGJ0Zl9yZWNvcmQgKnJlY19hLCBjb25zdCBzdHJ1Y3QgYnRmX3JlY29yZCAqclxcbiB2b2lkIGJwZl9vYmpfZnJlZV90aW1lcihjb25zdCBzdHJ1Y3QgYnRmX3JlY29yZCAqcmVjLCB2b2lkICpvYmopO1xcbiB2b2lkIGJwZl9vYmpfZnJlZV93b3JrcXVldWUoY29uc3Qgc3RydWN0IGJ0Zl9yZWNvcmQgKnJlYywgdm9pZCAqb2JqKTtcXG4gdm9pZCBicGZfb2JqX2ZyZWVfdGFza193b3JrKGNvbnN0IHN0cnVjdCBidGZfcmVjb3JkICpyZWMsIHZvaWQgKm9iaik7XFxuK3ZvaWQgYnBmX29ial9mcmVlX3RocmVhZF93cShjb25zdCBzdHJ1Y3QgYnRmX3JlY29yZCAqcmVjLCB2b2lkICpvYmopO1xcbiB2b2lkIGJwZl9vYmpfY2FuY2VsX2ZpZWxkcyhzdHJ1Y3QgYnBmX21hcCAqbWFwLCB2b2lkICpvYmopO1xcbiB2b2lkIGJwZl9vYmpfZnJlZV9maWVsZHMoY29uc3Qgc3RydWN0IGJ0Zl9yZWNvcmQgKnJlYywgdm9pZCAqb2JqKTtcXG4gdm9pZCBfX2JwZl9vYmpfZHJvcF9pbXBsKHZvaWQgKnAsIGNvbnN0IHN0cnVjdCBidGZfcmVjb3JkICpyZWMsIGJvb2wgcGVyY3B1KTtcXG5kaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9jZ3JvdXAuaCBiL2luY2x1ZGUvbGludXgvY2dyb3VwLmhcXG5pbmRleCBmMmFhNDZhNGY4NzFlLi45YjRhOGRjNzQ4YWNlIDEwMDY0NFxcbi0tLSBhL2luY2x1ZGUvbGludXgvY2dyb3VwLmhcXG4rKysgYi9pbmNsdWRlL2xpbnV4L2Nncm91cC5oXFxuQEAgLTkyMyw0ICs5MjMsNiBAQCBzdHJ1Y3QgY2dyb3VwICp0YXNrX2dldF9jZ3JvdXAxKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLCBpbnQgaGllcmFyY2h5X2lkKTtcXG4gXFxuIHN0cnVjdCBjZ3JvdXBfb2ZfcGVhayAqb2ZfcGVhayhzdHJ1Y3Qga2VybmZzX29wZW5fZmlsZSAqb2YpO1xcbiBcXG4raW50IGNncm91cF9rdGhyZWFkX2F0dGFjaChzdHJ1Y3QgY2dyb3VwICpjZ3JwLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spO1xcbitcXG4gI2VuZGlmIC8qIF9MSU5VWF9DR1JPVVBfSCAqL1xcbmRpZmYgLS1naXQgYS9pbmNsdWRlL3VhcGkvbGludXgvYnBmLmggYi9pbmNsdWRlL3VhcGkvbGludXgvYnBmLmhcXG5pbmRleCBmZmQ5NmU4YjkyMGJkLi4wNTU4NTIwZjY3ZmU0IDEwMDY0NFxcbi0tLSBhL2luY2x1ZGUvdWFwaS9saW51eC9icGYuaFxcbisrKyBiL2luY2x1ZGUvdWFwaS9saW51eC9icGYuaFxcbkBAIC03NTc0LDYgKzc1NzQsMTAgQEAgc3RydWN0IGJwZl93cSB7XFxuIFxcdF9fdTY0IF9fb3BhcXVlWzJdO1xcbiB9IF9fYXR0cmlidXRlX18oKGFsaWduZWQoOCkpKTtcXG4gXFxuK3N0cnVjdCBicGZfdGhyZWFkX3dxIHtcXG4rXFx0X191NjQgX19vcGFxdWVbMl07XFxuK30gX19hdHRyaWJ1dGVfXygoYWxpZ25lZCg4KSkpO1xcbitcXG4gc3RydWN0IGJwZl9keW5wdHIge1xcbiBcXHRfX3U2NCBfX29wYXF1ZVsyXTtcXG4gfSBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDgpKSk7XFxuZGlmZiAtLWdpdCBhL2tlcm5lbC9icGYvYnRmLmMgYi9rZXJuZWwvYnBmL2J0Zi5jXFxuaW5kZXggNDI0MTQ2MzNjZjI2My4uYmY2ZmI1ZjUxZDIxYSAxMDA2NDRcXG4tLS0gYS9rZXJuZWwvYnBmL2J0Zi5jXFxuKysrIGIva2VybmVsL2JwZi9idGYuY1xcbkBAIC0zNjY1LDYgKzM2NjUsNyBAQCBzdGF0aWMgaW50IGJ0Zl9nZXRfZmllbGRfdHlwZShjb25zdCBzdHJ1Y3QgYnRmICpidGYsIGNvbnN0IHN0cnVjdCBidGZfdHlwZSAqdmFyX1xcbiBcXHRcXHR7IEJQRl9USU1FUiwgXFxcImJwZl90aW1lclxcXCIsIHRydWUgfSxcXG4gXFx0XFx0eyBCUEZfV09SS1FVRVVFLCBcXFwiYnBmX3dxXFxcIiwgdHJ1ZSB9LFxcbiBcXHRcXHR7IEJQRl9UQVNLX1dPUkssIFxcXCJicGZfdGFza193b3JrXFxcIiwgdHJ1ZSB9LFxcbitcXHRcXHR7IEJQRl9USFJFQURfV1EsIFxcXCJicGZfdGhyZWFkX3dxXFxcIiwgdHJ1ZSB9LFxcbiBcXHRcXHR7IEJQRl9MSVNUX0hFQUQsIFxcXCJicGZfbGlzdF9oZWFkXFxcIiwgZmFsc2UgfSxcXG4gXFx0XFx0eyBCUEZfTElTVF9OT0RFLCBcXFwiYnBmX2xpc3Rfbm9kZVxcXCIsIGZhbHNlIH0sXFxuIFxcdFxcdHsgQlBGX1JCX1JPT1QsIFxcXCJicGZfcmJfcm9vdFxcXCIsIGZhbHNlIH0sXFxuQEAgLTM4NTAsNiArMzg1MSw3IEBAIHN0YXRpYyBpbnQgYnRmX2ZpbmRfZmllbGRfb25lKGNvbnN0IHN0cnVjdCBidGYgKmJ0ZixcXG4gXFx0Y2FzZSBCUEZfUkJfTk9ERTpcXG4gXFx0Y2FzZSBCUEZfUkVGQ09VTlQ6XFxuIFxcdGNhc2UgQlBGX1RBU0tfV09SSzpcXG4rXFx0Y2FzZSBCUEZfVEhSRUFEX1dROlxcbiBcXHRcXHRyZXQgPSBidGZfZmluZF9zdHJ1Y3QoYnRmLCB2YXJfdHlwZSwgb2ZmLCBzeiwgZmllbGRfdHlwZSxcXG4gXFx0XFx0XFx0XFx0ICAgICAgaW5mb19jbnQgPyBcXHUwMDI2aW5mb1swXSA6IFxcdTAwMjZ0bXApO1xcbiBcXHRcXHRpZiAocmV0IFxcdTAwM2MgMClcXG5AQCAtNDE0NSw2ICs0MTQ3LDcgQEAgc3RydWN0IGJ0Zl9yZWNvcmQgKmJ0Zl9wYXJzZV9maWVsZHMoY29uc3Qgc3RydWN0IGJ0ZiAqYnRmLCBjb25zdCBzdHJ1Y3QgYnRmX3R5cGVcXG4gXFx0cmVjLVxcdTAwM2V3cV9vZmYgPSAtRUlOVkFMO1xcbiBcXHRyZWMtXFx1MDAzZXJlZmNvdW50X29mZiA9IC1FSU5WQUw7XFxuIFxcdHJlYy1cXHUwMDNldGFza193b3JrX29mZiA9IC1FSU5WQUw7XFxuK1xcdHJlYy1cXHUwMDNldGhyZWFkX3dxX29mZiA9IC1FSU5WQUw7XFxuIFxcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBjbnQ7IGkrKykge1xcbiBcXHRcXHRmaWVsZF90eXBlX3NpemUgPSBidGZfZmllbGRfdHlwZV9zaXplKGluZm9fYXJyW2ldLnR5cGUpO1xcbiBcXHRcXHRpZiAoaW5mb19hcnJbaV0ub2ZmICsgZmllbGRfdHlwZV9zaXplIFxcdTAwM2UgdmFsdWVfc2l6ZSkge1xcbkBAIC00MTg4LDYgKzQxOTEsMTAgQEAgc3RydWN0IGJ0Zl9yZWNvcmQgKmJ0Zl9wYXJzZV9maWVsZHMoY29uc3Qgc3RydWN0IGJ0ZiAqYnRmLCBjb25zdCBzdHJ1Y3QgYnRmX3R5cGVcXG4gXFx0XFx0XFx0V0FSTl9PTl9PTkNFKHJlYy1cXHUwMDNldGFza193b3JrX29mZiBcXHUwMDNlPSAwKTtcXG4gXFx0XFx0XFx0cmVjLVxcdTAwM2V0YXNrX3dvcmtfb2ZmID0gcmVjLVxcdTAwM2VmaWVsZHNbaV0ub2Zmc2V0O1xcbiBcXHRcXHRcXHRicmVhaztcXG4rXFx0XFx0Y2FzZSBCUEZfVEhSRUFEX1dROlxcbitcXHRcXHRcXHRXQVJOX09OX09OQ0UocmVjLVxcdTAwM2V0aHJlYWRfd3Ffb2ZmIFxcdTAwM2U9IDApO1xcbitcXHRcXHRcXHRyZWMtXFx1MDAzZXRocmVhZF93cV9vZmYgPSByZWMtXFx1MDAzZWZpZWxkc1tpXS5vZmZzZXQ7XFxuK1xcdFxcdFxcdGJyZWFrO1xcbiBcXHRcXHRjYXNlIEJQRl9SRUZDT1VOVDpcXG4gXFx0XFx0XFx0V0FSTl9PTl9PTkNFKHJlYy1cXHUwMDNlcmVmY291bnRfb2ZmIFxcdTAwM2U9IDApO1xcbiBcXHRcXHRcXHQvKiBDYWNoZSBvZmZzZXQgZm9yIGZhc3RlciBsb29rdXAgYXQgcnVudGltZSAqL1xcbmRpZmYgLS1naXQgYS9rZXJuZWwvYnBmL2hlbHBlcnMuYyBiL2tlcm5lbC9icGYvaGVscGVycy5jXFxuaW5kZXggNjM4OGI2YjIzZTQ5MC4uOGUwMWJhZDFiMTZhMCAxMDA2NDRcXG4tLS0gYS9rZXJuZWwvYnBmL2hlbHBlcnMuY1xcbisrKyBiL2tlcm5lbC9icGYvaGVscGVycy5jXFxuQEAgLTI5LDYgKzI5LDggQEBcXG4gI2luY2x1ZGUgXFx1MDAzY2xpbnV4L3Rhc2tfd29yay5oXFx1MDAzZVxcbiAjaW5jbHVkZSBcXHUwMDNjbGludXgvaXJxX3dvcmsuaFxcdTAwM2VcXG4gI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2J1aWxkaWQuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2t0aHJlYWQuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2poYXNoLmhcXHUwMDNlXFxuIFxcbiAjaW5jbHVkZSBcXFwiLi4vLi4vbGliL2tzdHJ0b3guaFxcXCJcXG4gXFxuQEAgLTExMTAsNiArMTExMiwxNyBAQCBzdGF0aWMgdm9pZCAqbWFwX2tleV9mcm9tX3ZhbHVlKHN0cnVjdCBicGZfbWFwICptYXAsIHZvaWQgKnZhbHVlLCB1MzIgKmFycl9pZHgpXFxuIFxcdHJldHVybiAodm9pZCAqKXZhbHVlIC0gcm91bmRfdXAobWFwLVxcdTAwM2VrZXlfc2l6ZSwgOCk7XFxuIH1cXG4gXFxuK3N0YXRpYyB1MzIgYnBmX21hcF9lbGVtX2lkX2Zyb21fdmFsdWUoc3RydWN0IGJwZl9tYXAgKm1hcCwgdm9pZCAqdmFsdWUpXFxuK3tcXG4rXFx0dTMyIGFycl9pZHg7XFxuK1xcdHZvaWQgKmtleTtcXG4rXFxuK1xcdGtleSA9IG1hcF9rZXlfZnJvbV92YWx1ZShtYXAsIHZhbHVlLCBcXHUwMDI2YXJyX2lkeCk7XFxuK1xcdGlmIChtYXAtXFx1MDAzZW1hcF90eXBlID09IEJQRl9NQVBfVFlQRV9BUlJBWSlcXG4rXFx0XFx0cmV0dXJuIGFycl9pZHg7XFxuK1xcdHJldHVybiBqaGFzaChrZXksIG1hcC1cXHUwMDNla2V5X3NpemUsIDApO1xcbit9XFxuK1xcbiBlbnVtIGJwZl9hc3luY190eXBlIHtcXG4gXFx0QlBGX0FTWU5DX1RZUEVfVElNRVIgPSAwLFxcbiBcXHRCUEZfQVNZTkNfVFlQRV9XUSxcXG5AQCAtNDc2OSw2ICs0NzgyLDM5NyBAQCBfX2JwZl9rZnVuYyBpbnQgYnBmX3RpbWVyX2NhbmNlbF9hc3luYyhzdHJ1Y3QgYnBmX3RpbWVyICp0aW1lcilcXG4gXFx0fVxcbiB9XFxuIFxcbisvKlxcbisgKiBCUEYgdGhyZWFkIHdvcmtxdWV1ZSAoa3RocmVhZF93b3JrZXIgYmFzZWQpIGltcGxlbWVudGF0aW9uXFxuKyAqXFxuKyAqIFdoeSBicGZfdGhyZWFkX3dxIGRvZXMgTk9UIHVzZSB0aGUgYnBmX2FzeW5jIGluZnJhc3RydWN0dXJlOlxcbisgKlxcbisgKiBicGZfdGltZXIgYW5kIGJwZl93cSBzaGFyZSBhIGNvbW1vbiBjbGVhbnVwIHBhdGggdmlhIGJwZl9hc3luYzpcXG4rICpcXG4rICogICBicGZfYXN5bmNfY2FuY2VsX2FuZF9mcmVlKClcXG4rICogICAgIC1cXHUwMDNlIGJwZl9hc3luY19zY2hlZHVsZV9vcCgpXFxuKyAqICAgICAgIC1cXHUwMDNlIGlycV93b3JrX3F1ZXVlKCkgICAgICAgICAgICAgICAgLy8gc2NoZWR1bGUgZnJvbSBhbnkgY29udGV4dFxcbisgKiAgICAgICAgIC1cXHUwMDNlIGJwZl9hc3luY19wcm9jZXNzX29wKCkgICAgICAgIC8vIHJ1bnMgaW4gaGFyZGlycSBjb250ZXh0XFxuKyAqICAgICAgICAgICAtXFx1MDAzZSBicGZfd3Ffd29yaygpIC8gdGltZXIgY2IgICAgLy8gYXRvbWljLCBub24tc2xlZXBhYmxlXFxuKyAqXFxuKyAqIFRoaXMgd29ya3MgZm9yIHRpbWVyIGFuZCB3b3JrcXVldWUgYmVjYXVzZSB0aGVpciBjYWxsYmFja3MgYW5kXFxuKyAqIGNhbmNlbGxhdGlvbiAoaHJ0aW1lcl9jYW5jZWwgLyBicGZfd3FfY2FuY2VsX2FuZF9mcmVlKSBjb21wbGV0ZVxcbisgKiBzeW5jaHJvbm91c2x5IGFuZCBuZWVkIG5vdCBzbGVlcC4gIFRoZSBoYXJkaXJxIGNvbnRleHQgaXMgc3VmZmljaWVudC5cXG4rICpcXG4rICogYnBmX3RocmVhZF93cSBpcyBkaWZmZXJlbnQ6IGNhbmNlbGxhdGlvbiBhbmQgZmluYWwgY2xlYW51cCBtYXkgbmVlZCB0b1xcbisgKiBzbGVlcDpcXG4rICpcXG4rICogICBrdGhyZWFkX2NhbmNlbF93b3JrX3N5bmMoKSAgICAtIHdhaXRzIGZvciB0aGUgd29yayB0byBmaW5pc2gsIGNhblxcbisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjaGVkdWxlIG91dCBpZiB0aGUgd29yayBpcyBydW5uaW5nLlxcbisgKiAgIGt0aHJlYWRfZGVzdHJveV93b3JrZXIoKSAgICAgIC0gc3RvcHMgdGhlIGt0aHJlYWQsIGludGVybmFsbHlcXG4rICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZXMgd2l0aCBrdGhyZWFkIGV4aXQuXFxuKyAqICAgY2dyb3VwX3B1dCgpIChmaW5hbCBwdXQpICAgICAgLSBtYXkgYWNxdWlyZSBjZ3JvdXBfbXV0ZXggYW5kIG90aGVyXFxuKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xlZXBpbmcgbG9ja3MgZHVyaW5nIG9mZmxpbmUuXFxuKyAqXFxuKyAqIE5vbmUgb2YgdGhlc2UgY2FuIGJlIGNhbGxlZCBmcm9tIGhhcmRpcnEgY29udGV4dCAoaXJxX3dvcmspLiBEb2luZyBzb1xcbisgKiB3b3VsZCB0cmlnZ2VyIG1pZ2h0X3NsZWVwKCkgd2FybmluZ3Mgb3IgZGVhZGxvY2suXFxuKyAqXFxuKyAqIFRoZXJlZm9yZSBicGZfdGhyZWFkX3dxIGltcGxlbWVudHMgaXRzIG93biBSQ1UtYmFzZWQgY2xlYW51cDpcXG4rICpcXG4rICogICBicGZfdGhyZWFkX3dxX2NhbmNlbF9hbmRfZnJlZSgpICAgICAgICAvLyBzbGVlcGFibGUgKGNhbGxlZCBmcm9tXFxuKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWFwIGZyZWUgLyBlbGVtIGRlbGV0ZSlcXG4rICogICAgIC1cXHUwMDNlIHhjaGcoY3R4LCBOVUxMKSAgICAgICAgICAgICAgICAgICAvLyBkZXRhY2ggYXRvbWljYWxseVxcbisgKiAgICAgLVxcdTAwM2Uga3RocmVhZF9jYW5jZWxfd29ya19zeW5jKCkgICAgICAgIC8vIG9rIHRvIHNsZWVwXFxuKyAqICAgICAtXFx1MDAzZSBicGZfdGhyZWFkX3dxX2N0eF9wdXQoKVxcbisgKiAgICAgICAtXFx1MDAzZSBjYWxsX3JjdV90YXNrc190cmFjZSgpICAgICAgICAgIC8vIHdhaXQgZm9yIEJQRiBjYWxsYmFja3NcXG4rICogICAgICAgICAtXFx1MDAzZSBzY2hlZHVsZV93b3JrKCkgICAgICAgICAgICAgICAvLyBzd2l0Y2ggdG8gc2xlZXBhYmxlIGNvbnRleHRcXG4rICogICAgICAgICAgIC1cXHUwMDNlIGJwZl90aHJlYWRfd3FfZGVzdHJveV93b3JrX2ZuKClcXG4rICogICAgICAgICAgICAgLVxcdTAwM2UgYnBmX3Byb2dfcHV0KClcXG4rICogICAgICAgICAgICAgLVxcdTAwM2UgY2dyb3VwX3B1dCgpXFxuKyAqICAgICAgICAgICAgIC1cXHUwMDNlIGt0aHJlYWRfZGVzdHJveV93b3JrZXIoKVxcbisgKiAgICAgICAgICAgICAtXFx1MDAzZSBrZnJlZShjdHgpXFxuKyAqXFxuKyAqIFRoZSBzYW1lIGRlc2lnbiBjaG9pY2Ugd2FzIG1hZGUgZm9yIGJwZl90YXNrX3dvcmssIHdoaWNoIGFsc28gYXZvaWRzXFxuKyAqIGJwZl9hc3luYyBiZWNhdXNlIHRhc2tfd29yayBjYW5jZWxsYXRpb24gc3luY2hyb25pemVzIHdpdGggdGhlIHRhc2tcXG4rICogYW5kIG1heSBzbGVlcC5cXG4rICovXFxuK1xcbitzdHJ1Y3QgYnBmX3RocmVhZF93cV9jdHgge1xcbitcXHRzdHJ1Y3Qga3RocmVhZF93b3JrZXIgKndvcmtlcjtcXG4rXFx0c3RydWN0IGt0aHJlYWRfd29yayB3b3JrO1xcbitcXHRzdHJ1Y3QgYnBmX3Byb2cgKnByb2c7XFxuK1xcdGJwZl9jYWxsYmFja190IGNhbGxiYWNrX2ZuO1xcbitcXHRzdHJ1Y3QgYnBmX21hcCAqbWFwO1xcbitcXHR2b2lkICp2YWx1ZTtcXG4rXFx0c3RydWN0IGNncm91cCAqY2dycDtcXG4rXFx0cmVmY291bnRfdCByZWZjbnQ7XFxuK1xcdHN0cnVjdCByY3VfaGVhZCByY3U7XFxuK1xcdHN0cnVjdCB3b3JrX3N0cnVjdCBkZXN0cm95X3dvcms7XFxuK307XFxuK1xcbisvKiBLZXJuZWwtaW50ZXJuYWwgcmVwcmVzZW50YXRpb24gdGhhdCBmaXRzIGluIHN0cnVjdCBicGZfdGhyZWFkX3dxICovXFxuK3N0cnVjdCBicGZfdGhyZWFkX3dxX2tlcm4ge1xcbitcXHRzdHJ1Y3QgYnBmX3RocmVhZF93cV9jdHggKmN0eDtcXG4rfSBfX2FsaWduZWQoOCk7XFxuK1xcbitzdGF0aWMgdm9pZCBicGZfdGhyZWFkX3dxX2Rlc3Ryb3lfd29ya19mbihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspXFxuK3tcXG4rXFx0c3RydWN0IGJwZl90aHJlYWRfd3FfY3R4ICpjdHggPSBjb250YWluZXJfb2Yod29yayxcXG4rXFx0XFx0XFx0XFx0XFx0XFx0ICAgICBzdHJ1Y3QgYnBmX3RocmVhZF93cV9jdHgsXFxuK1xcdFxcdFxcdFxcdFxcdFxcdCAgICAgZGVzdHJveV93b3JrKTtcXG4rXFxuK1xcdGlmIChjdHgtXFx1MDAzZXByb2cpXFxuK1xcdFxcdGJwZl9wcm9nX3B1dChjdHgtXFx1MDAzZXByb2cpO1xcbitcXHRpZiAoY3R4LVxcdTAwM2VjZ3JwKVxcbitcXHRcXHRjZ3JvdXBfcHV0KGN0eC1cXHUwMDNlY2dycCk7XFxuK1xcdGlmIChjdHgtXFx1MDAzZXdvcmtlcilcXG4rXFx0XFx0a3RocmVhZF9kZXN0cm95X3dvcmtlcihjdHgtXFx1MDAzZXdvcmtlcik7XFxuK1xcdGtmcmVlKGN0eCk7XFxuK31cXG4rXFxuK3N0YXRpYyB2b2lkIGJwZl90aHJlYWRfd3FfY3R4X2ZyZWVfcmN1KHN0cnVjdCByY3VfaGVhZCAqcmN1KVxcbit7XFxuK1xcdHN0cnVjdCBicGZfdGhyZWFkX3dxX2N0eCAqY3R4ID0gY29udGFpbmVyX29mKHJjdSxcXG4rXFx0XFx0XFx0XFx0XFx0XFx0ICAgICBzdHJ1Y3QgYnBmX3RocmVhZF93cV9jdHgsXFxuK1xcdFxcdFxcdFxcdFxcdFxcdCAgICAgcmN1KTtcXG4rXFxuK1xcdElOSVRfV09SSyhcXHUwMDI2Y3R4LVxcdTAwM2VkZXN0cm95X3dvcmssIGJwZl90aHJlYWRfd3FfZGVzdHJveV93b3JrX2ZuKTtcXG4rXFx0c2NoZWR1bGVfd29yayhcXHUwMDI2Y3R4LVxcdTAwM2VkZXN0cm95X3dvcmspO1xcbit9XFxuK1xcbitzdGF0aWMgdm9pZCBicGZfdGhyZWFkX3dxX2N0eF9wdXQoc3RydWN0IGJwZl90aHJlYWRfd3FfY3R4ICpjdHgpXFxuK3tcXG4rXFx0aWYgKCFyZWZjb3VudF9kZWNfYW5kX3Rlc3QoXFx1MDAyNmN0eC1cXHUwMDNlcmVmY250KSlcXG4rXFx0XFx0cmV0dXJuO1xcbitcXHRjYWxsX3JjdV90YXNrc190cmFjZShcXHUwMDI2Y3R4LVxcdTAwM2VyY3UsIGJwZl90aHJlYWRfd3FfY3R4X2ZyZWVfcmN1KTtcXG4rfVxcbitcXG4rc3RhdGljIHZvaWQgYnBmX3RocmVhZF93cV93b3JrX2ZuKHN0cnVjdCBrdGhyZWFkX3dvcmsgKndvcmspXFxuK3tcXG4rXFx0c3RydWN0IGJwZl90aHJlYWRfd3FfY3R4ICpjdHggPSBjb250YWluZXJfb2Yod29yayxcXG4rXFx0XFx0XFx0XFx0XFx0XFx0ICAgICBzdHJ1Y3QgYnBmX3RocmVhZF93cV9jdHgsXFxuK1xcdFxcdFxcdFxcdFxcdFxcdCAgICAgd29yayk7XFxuK1xcdGJwZl9jYWxsYmFja190IGNhbGxiYWNrX2ZuO1xcbitcXHR2b2lkICp2YWx1ZSA9IGN0eC1cXHUwMDNldmFsdWU7XFxuK1xcdHN0cnVjdCBicGZfbWFwICptYXAgPSBjdHgtXFx1MDAzZW1hcDtcXG4rXFx0dm9pZCAqa2V5O1xcbitcXHR1MzIgaWR4O1xcbitcXG4rXFx0QlRGX1RZUEVfRU1JVChzdHJ1Y3QgYnBmX3RocmVhZF93cSk7XFxuK1xcbitcXHRjYWxsYmFja19mbiA9IFJFQURfT05DRShjdHgtXFx1MDAzZWNhbGxiYWNrX2ZuKTtcXG4rXFx0aWYgKCFjYWxsYmFja19mbilcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcdGtleSA9IG1hcF9rZXlfZnJvbV92YWx1ZShtYXAsIHZhbHVlLCBcXHUwMDI2aWR4KTtcXG4rXFxuK1xcdHJjdV9yZWFkX2xvY2tfdHJhY2UoKTtcXG4rXFx0bWlncmF0ZV9kaXNhYmxlKCk7XFxuK1xcbitcXHRjYWxsYmFja19mbiA9IFJFQURfT05DRShjdHgtXFx1MDAzZWNhbGxiYWNrX2ZuKTtcXG4rXFx0aWYgKGNhbGxiYWNrX2ZuKVxcbitcXHRcXHRjYWxsYmFja19mbigodTY0KShsb25nKW1hcCwgKHU2NCkobG9uZylrZXksICh1NjQpKGxvbmcpdmFsdWUsXFxuK1xcdFxcdFxcdCAgICAwLCAwKTtcXG4rXFxuK1xcdG1pZ3JhdGVfZW5hYmxlKCk7XFxuK1xcdHJjdV9yZWFkX3VubG9ja190cmFjZSgpO1xcbitcXG4rb3V0OlxcbitcXHRicGZfdGhyZWFkX3dxX2N0eF9wdXQoY3R4KTtcXG4rfVxcbitcXG4rLypcXG4rICogYnBmX3RocmVhZF93cV9pbml0KCkgY3JlYXRlcyBhIGt0aHJlYWQgd29ya2VyIGFuZCBtYXkgYXR0YWNoIGl0IHRvIGEgY2dyb3VwLlxcbisgKiBUaGUgaGVscGVycyB1c2VkIGhlcmUgY2FuIHNsZWVwIGFuZCBhY3F1aXJlIHNldmVyYWwgbG9ja3MgdGhyb3VnaCBrdGhyZWFkXFxuKyAqIGNyZWF0aW9uL2Rlc3RydWN0aW9uLCBjZ3JvdXAgbG9va3VwIGFuZCBjZ3JvdXAga3RocmVhZCBhdHRhY2htZW50LiBLZWVwIHRoaXNcXG4rICoga2Z1bmMgYXZhaWxhYmxlIG9ubHkgdG8gQlBGX1BST0dfVFlQRV9TWVNDQUxMIHByb2dyYW1zIHNvIGl0IGlzIG5vdCBpbnZva2VkXFxuKyAqIGZyb20gQlBGIHByb2dyYW0gY29udGV4dHMgdGhhdCBhbHJlYWR5IGhvbGQgbG9ja3Mgd2hpY2ggY291bGQgZGVhZGxvY2sgd2l0aFxcbisgKiB0aG9zZSBwYXRocy5cXG4rICovXFxuK19fYnBmX2tmdW5jIGludCBicGZfdGhyZWFkX3dxX2luaXQoc3RydWN0IGJwZl90aHJlYWRfd3EgKnR3cSwgdm9pZCAqcF9fbWFwLFxcbitcXHRcXHRcXHRcXHQgICB1NjQgY2dyb3VwX2lkLCB1bnNpZ25lZCBpbnQgZmxhZ3MpXFxuK3tcXG4rXFx0c3RydWN0IGJwZl90aHJlYWRfd3Ffa2VybiAqdHdrID0gKHN0cnVjdCBicGZfdGhyZWFkX3dxX2tlcm4gKil0d3E7XFxuK1xcdHN0cnVjdCBicGZfbWFwICptYXAgPSBwX19tYXA7XFxuK1xcdHN0cnVjdCBicGZfdGhyZWFkX3dxX2N0eCAqY3R4LCAqb2xkX2N0eDtcXG4rXFx0c3RydWN0IGt0aHJlYWRfd29ya2VyICp3b3JrZXI7XFxuK1xcdHN0cnVjdCBjZ3JvdXAgKmNncnAgPSBOVUxMO1xcbitcXHR2b2lkICp2YWx1ZTtcXG4rXFx0dTMyIGVsZW1faWQ7XFxuK1xcdGludCBlcnI7XFxuK1xcbitcXHRCVUlMRF9CVUdfT04oc2l6ZW9mKHN0cnVjdCBicGZfdGhyZWFkX3dxX2tlcm4pXFxuK1xcdFxcdFxcdFxcdTAwM2Ugc2l6ZW9mKHN0cnVjdCBicGZfdGhyZWFkX3dxKSk7XFxuK1xcdEJVSUxEX0JVR19PTihfX2FsaWdub2ZfXyhzdHJ1Y3QgYnBmX3RocmVhZF93cV9rZXJuKVxcbitcXHRcXHRcXHQhPSBfX2FsaWdub2ZfXyhzdHJ1Y3QgYnBmX3RocmVhZF93cSkpO1xcbitcXG4rXFx0aWYgKGZsYWdzKVxcbitcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG4rXFxuK1xcdG9sZF9jdHggPSBSRUFEX09OQ0UodHdrLVxcdTAwM2VjdHgpO1xcbitcXHRpZiAob2xkX2N0eClcXG4rXFx0XFx0cmV0dXJuIC1FQlVTWTtcXG4rXFxuK1xcdHZhbHVlID0gKHZvaWQgKil0d3EgLSBtYXAtXFx1MDAzZXJlY29yZC1cXHUwMDNldGhyZWFkX3dxX29mZjtcXG4rXFx0ZWxlbV9pZCA9IGJwZl9tYXBfZWxlbV9pZF9mcm9tX3ZhbHVlKG1hcCwgdmFsdWUpO1xcbitcXHR3b3JrZXIgPSBrdGhyZWFkX3J1bl93b3JrZXIoMCwgXFxcImJwZl90d3EvJWQvJXhcXFwiLCBtYXAtXFx1MDAzZWlkLCBlbGVtX2lkKTtcXG4rXFx0aWYgKElTX0VSUih3b3JrZXIpKVxcbitcXHRcXHRyZXR1cm4gUFRSX0VSUih3b3JrZXIpO1xcbitcXG4rXFx0LyogU2V0dXAgY3R4LiAqL1xcbitcXHRjdHggPSBicGZfbWFwX2ttYWxsb2Nfbm9sb2NrKG1hcCwgc2l6ZW9mKCpjdHgpLCBHRlBfS0VSTkVMLFxcbitcXHRcXHRcXHRcXHQgICAgIG1hcC1cXHUwMDNlbnVtYV9ub2RlKTtcXG4rXFx0aWYgKCFjdHgpIHtcXG4rXFx0XFx0ZXJyID0gLUVOT01FTTtcXG4rXFx0XFx0Z290byBkZXN0cm95X3dvcmtlcjtcXG4rXFx0fVxcbitcXHRtZW1zZXQoY3R4LCAwLCBzaXplb2YoKmN0eCkpO1xcbitcXHRjdHgtXFx1MDAzZXdvcmtlciA9IHdvcmtlcjtcXG4rXFx0Y3R4LVxcdTAwM2VtYXAgPSBtYXA7XFxuK1xcdGN0eC1cXHUwMDNldmFsdWUgPSB2YWx1ZTtcXG4rXFx0cmVmY291bnRfc2V0KFxcdTAwMjZjdHgtXFx1MDAzZXJlZmNudCwgMSk7XFxuK1xcdGt0aHJlYWRfaW5pdF93b3JrKFxcdTAwMjZjdHgtXFx1MDAzZXdvcmssIGJwZl90aHJlYWRfd3Ffd29ya19mbik7XFxuK1xcbitcXHRpZiAoY2dyb3VwX2lkKSB7XFxuKyNpZmRlZiBDT05GSUdfQ0dST1VQU1xcbitcXHRcXHRjZ3JwID0gY2dyb3VwX2dldF9mcm9tX2lkKGNncm91cF9pZCk7XFxuK1xcdFxcdGlmIChJU19FUlIoY2dycCkpIHtcXG4rXFx0XFx0XFx0ZXJyID0gUFRSX0VSUihjZ3JwKTtcXG4rXFx0XFx0XFx0Z290byBrZnJlZV9jdHg7XFxuK1xcdFxcdH1cXG4rXFx0XFx0Y3R4LVxcdTAwM2VjZ3JwID0gY2dycDtcXG4rXFxuK1xcdFxcdC8qXFxuK1xcdFxcdCAqIGt0aHJlYWRfcnVuX3dvcmtlcigpIHdha2VzIHRoZSBrdGhyZWFkLCBidXQgaXQgbWF5IG5vdCBoYXZlXFxuK1xcdFxcdCAqIGV4ZWN1dGVkIGNncm91cF9rdGhyZWFkX3JlYWR5KCkgeWV0LCB3aGljaCBjbGVhcnNcXG4rXFx0XFx0ICogbm9fY2dyb3VwX21pZ3JhdGlvbi5cXG4rXFx0XFx0ICogRG8gYSBxdWV1ZSB3b3JrIGFuZCBmbHVzaCB0byB3YWl0IHRoZSBrdGhyZWFkIHJ1bi5cXG4rXFx0XFx0ICovXFxuK1xcdFxcdHJlZmNvdW50X2luYyhcXHUwMDI2Y3R4LVxcdTAwM2VyZWZjbnQpO1xcbitcXHRcXHRpZiAoIWt0aHJlYWRfcXVldWVfd29yayhjdHgtXFx1MDAzZXdvcmtlciwgXFx1MDAyNmN0eC1cXHUwMDNld29yaykpIHtcXG4rXFx0XFx0XFx0cmVmY291bnRfZGVjKFxcdTAwMjZjdHgtXFx1MDAzZXJlZmNudCk7XFxuK1xcdFxcdFxcdGVyciA9IC1FQlVTWTtcXG4rXFx0XFx0XFx0Z290byBjZ3JvdXBfcHV0O1xcbitcXHRcXHR9XFxuK1xcdFxcdGt0aHJlYWRfZmx1c2hfd29yayhcXHUwMDI2Y3R4LVxcdTAwM2V3b3JrKTtcXG4rXFxuK1xcdFxcdGlmICh3b3JrZXItXFx1MDAzZXRhc2stXFx1MDAzZW5vX2Nncm91cF9taWdyYXRpb24pIHtcXG4rXFx0XFx0XFx0ZXJyID0gLUVBR0FJTjtcXG4rXFx0XFx0XFx0Z290byBjZ3JvdXBfcHV0O1xcbitcXHRcXHR9XFxuK1xcbitcXHRcXHRlcnIgPSBjZ3JvdXBfa3RocmVhZF9hdHRhY2goY2dycCwgd29ya2VyLVxcdTAwM2V0YXNrKTtcXG4rXFx0XFx0aWYgKGVycilcXG4rXFx0XFx0XFx0Z290byBjZ3JvdXBfcHV0O1xcbisjZWxzZVxcbitcXHRcXHRlcnIgPSAtRU9QTk9UU1VQUDtcXG4rXFx0XFx0Z290byBrZnJlZV9jdHg7XFxuKyNlbmRpZlxcbitcXHR9XFxuK1xcbitcXHRvbGRfY3R4ID0gY21weGNoZyhcXHUwMDI2dHdrLVxcdTAwM2VjdHgsIE5VTEwsIGN0eCk7XFxuK1xcdGlmIChvbGRfY3R4KSB7XFxuK1xcdFxcdGVyciA9IC1FQlVTWTtcXG4rXFx0XFx0Z290byBjZ3JvdXBfcHV0O1xcbitcXHR9XFxuK1xcbitcXHQvKlxcbitcXHQgKiBQYWlyZWQgd2l0aCB0aGUgbWFwIGRlc3RydWN0aW9uIHBhdGguICBFbnN1cmVzIHRoYXQgY3R4IGlzIGdsb2JhbGx5XFxuK1xcdCAqIHZpc2libGUgYmVmb3JlIHdlIGNoZWNrIG1hcC1cXHUwMDNldXNlcmNudC5cXG4rXFx0ICogSWYgdXNlcmNudCBoYXMgZHJvcHBlZCB0byB6ZXJvLCB0aGUgZGVzdHJ1Y3Rpb24gcGF0aCB3aWxsIGVpdGhlciBzZWVcXG4rXFx0ICogdGhlIGN0eCAoYW5kIGNhbmNlbCBpdCkgb3Igd2Ugc2VlIHVzZXJjbnQgPT0gMCBoZXJlIGFuZCBjYW5jZWxcXG4rXFx0ICogb3Vyc2VsdmVzLlxcbitcXHQgKiBXaXRob3V0IHRoaXMgYmFycmllciwgYSBDUFUgY291bGQgcmVvcmRlciB0aGUgbG9hZCBvZiB1c2VyY250IGJlZm9yZVxcbitcXHQgKiB0aGUgY21weGNoZyBzdG9yZSBiZWNvbWVzIHZpc2libGUsIGJyZWFraW5nIHRoZSBtdXR1YWwgZXhjbHVzaW9uXFxuK1xcdCAqIGd1YXJhbnRlZS5cXG4rXFx0ICovXFxuK1xcdHNtcF9tYigpO1xcbitcXG4rXFx0aWYgKCFhdG9taWM2NF9yZWFkKFxcdTAwMjZtYXAtXFx1MDAzZXVzZXJjbnQpKSB7XFxuK1xcdFxcdGJwZl90aHJlYWRfd3FfY2FuY2VsX2FuZF9mcmVlKHR3cSk7XFxuK1xcdFxcdHJldHVybiAtRVBFUk07XFxuK1xcdH1cXG4rXFxuK1xcdHJldHVybiAwO1xcbitcXG4rY2dyb3VwX3B1dDpcXG4rI2lmZGVmIENPTkZJR19DR1JPVVBTXFxuK1xcdGlmIChjZ3JwKVxcbitcXHRcXHRjZ3JvdXBfcHV0KGNncnApO1xcbisjZW5kaWZcXG4ra2ZyZWVfY3R4OlxcbitcXHQvKlxcbitcXHQgKiBOb3QgdXNlIGJwZl90aHJlYWRfd3FfY3R4X3B1dCBiZWNhdXNlIGN0eCBoYXMgbm90IHlldCBlbnRlcmVkXFxuK1xcdCAqIHRoZSBydW5uaW5nIHN0YXRlLlxcbitcXHQgKi9cXG4rXFx0a2ZyZWUoY3R4KTtcXG4rZGVzdHJveV93b3JrZXI6XFxuK1xcdGt0aHJlYWRfZGVzdHJveV93b3JrZXIod29ya2VyKTtcXG4rXFx0cmV0dXJuIGVycjtcXG4rfVxcbitcXG4rX19icGZfa2Z1bmMgaW50IGJwZl90aHJlYWRfd3Ffc2V0X2NhbGxiYWNrKHN0cnVjdCBicGZfdGhyZWFkX3dxICp0d3EsXFxuK1xcdFxcdFxcdFxcdFxcdCAgIGludCAoY2FsbGJhY2tfZm4pKHZvaWQgKm1hcCxcXG4rXFx0XFx0XFx0XFx0XFx0XFx0XFx0ICAgICBpbnQgKmtleSxcXG4rXFx0XFx0XFx0XFx0XFx0XFx0XFx0ICAgICB2b2lkICp2YWx1ZSksXFxuK1xcdFxcdFxcdFxcdFxcdCAgIHVuc2lnbmVkIGludCBmbGFncyxcXG4rXFx0XFx0XFx0XFx0XFx0ICAgc3RydWN0IGJwZl9wcm9nX2F1eCAqYXV4KVxcbit7XFxuK1xcdHN0cnVjdCBicGZfdGhyZWFkX3dxX2tlcm4gKnR3ayA9IChzdHJ1Y3QgYnBmX3RocmVhZF93cV9rZXJuICopdHdxO1xcbitcXHRzdHJ1Y3QgYnBmX3RocmVhZF93cV9jdHggKmN0eDtcXG4rXFx0c3RydWN0IGJwZl9wcm9nICpwcm9nO1xcbitcXG4rXFx0aWYgKGZsYWdzKVxcbitcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG4rXFxuK1xcdGN0eCA9IFJFQURfT05DRSh0d2stXFx1MDAzZWN0eCk7XFxuK1xcdGlmICghY3R4KVxcbitcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG4rXFxuK1xcdHByb2cgPSBicGZfcHJvZ19pbmNfbm90X3plcm8oYXV4LVxcdTAwM2Vwcm9nKTtcXG4rXFx0aWYgKElTX0VSUihwcm9nKSlcXG4rXFx0XFx0cmV0dXJuIFBUUl9FUlIocHJvZyk7XFxuK1xcbitcXHQvKlxcbitcXHQgKiBBbGxvdyBzZXRfY2FsbGJhY2sgb25seSBvbmNlIHRvIHByZXZlbnQgVUFGOiBhIGNvbmN1cnJlbnRcXG4rXFx0ICogc2V0X2NhbGxiYWNrIGNvdWxkIGJwZl9wcm9nX3B1dCgpIHRoZSBwcm9nIHdoaWxlIHRoZSB3b3JrZXJcXG4rXFx0ICoga3RocmVhZCBpcyBzdGlsbCBleGVjdXRpbmcgaXRzIGNhbGxiYWNrLlxcbitcXHQgKi9cXG4rXFx0aWYgKGNtcHhjaGcoXFx1MDAyNmN0eC1cXHUwMDNlcHJvZywgTlVMTCwgcHJvZykgIT0gTlVMTCkge1xcbitcXHRcXHRicGZfcHJvZ19wdXQocHJvZyk7XFxuK1xcdFxcdHJldHVybiAtRUJVU1k7XFxuK1xcdH1cXG4rXFx0LypcXG4rXFx0ICogU2FmZSB0byBzZXQgY2FsbGJhY2tfZm4gYWZ0ZXIgcHJvZzogYnBmX3RocmVhZF93cV9zdGFydCgpIGFuZFxcbitcXHQgKiBicGZfdGhyZWFkX3dxX3dvcmtfZm4oKSBib3RoIGNoZWNrIGNhbGxiYWNrX2ZuIHdpdGggUkVBRF9PTkNFKClcXG4rXFx0ICogYW5kIGJhaWwgb3V0IGlmIGl0IGlzIHN0aWxsIE5VTEwuXFxuK1xcdCAqL1xcbitcXHRXUklURV9PTkNFKGN0eC1cXHUwMDNlY2FsbGJhY2tfZm4sICh2b2lkICopY2FsbGJhY2tfZm4pO1xcbitcXG4rXFx0cmV0dXJuIDA7XFxuK31cXG4rXFxuK19fYnBmX2tmdW5jIGludFxcbiticGZfdGhyZWFkX3dxX3N0YXJ0KHN0cnVjdCBicGZfdGhyZWFkX3dxICp0d3EsIHVuc2lnbmVkIGludCBmbGFncylcXG4re1xcbitcXHRzdHJ1Y3QgYnBmX3RocmVhZF93cV9rZXJuICp0d2sgPSAoc3RydWN0IGJwZl90aHJlYWRfd3Ffa2VybiAqKXR3cTtcXG4rXFx0c3RydWN0IGJwZl90aHJlYWRfd3FfY3R4ICpjdHg7XFxuK1xcdGludCBlcnI7XFxuK1xcbitcXHRpZiAoZmxhZ3MpXFxuK1xcdFxcdHJldHVybiAtRUlOVkFMO1xcbitcXG4rXFx0cmN1X3JlYWRfbG9ja190cmFjZSgpO1xcbitcXG4rXFx0ZXJyID0gMDtcXG4rXFxuK1xcdGN0eCA9IFJFQURfT05DRSh0d2stXFx1MDAzZWN0eCk7XFxuK1xcdGlmICghY3R4IHx8ICFSRUFEX09OQ0UoY3R4LVxcdTAwM2VjYWxsYmFja19mbikpIHtcXG4rXFx0XFx0ZXJyID0gLUVJTlZBTDtcXG4rXFx0XFx0Z290byB1bmxvY2s7XFxuK1xcdH1cXG4rXFxuK1xcdGlmICghcmVmY291bnRfaW5jX25vdF96ZXJvKFxcdTAwMjZjdHgtXFx1MDAzZXJlZmNudCkpXFxuK1xcdFxcdGVyciA9IC1FTk9FTlQ7XFxuK1xcbit1bmxvY2s6XFxuK1xcdHJjdV9yZWFkX3VubG9ja190cmFjZSgpO1xcbitcXHRpZiAoZXJyKVxcbitcXHRcXHRyZXR1cm4gZXJyO1xcbitcXG4rXFx0aWYgKCFrdGhyZWFkX3F1ZXVlX3dvcmsoY3R4LVxcdTAwM2V3b3JrZXIsIFxcdTAwMjZjdHgtXFx1MDAzZXdvcmspKSB7XFxuK1xcdFxcdGJwZl90aHJlYWRfd3FfY3R4X3B1dChjdHgpO1xcbitcXHRcXHRyZXR1cm4gLUVCVVNZO1xcbitcXHR9XFxuK1xcbitcXHRyZXR1cm4gMDtcXG4rfVxcbitcXG4rdm9pZCBicGZfdGhyZWFkX3dxX2NhbmNlbF9hbmRfZnJlZSh2b2lkICp2YWwpXFxuK3tcXG4rXFx0c3RydWN0IGJwZl90aHJlYWRfd3Ffa2VybiAqdHdrID0gdmFsO1xcbitcXHRzdHJ1Y3QgYnBmX3RocmVhZF93cV9jdHggKmN0eDtcXG4rXFxuK1xcdGN0eCA9IHhjaGcoXFx1MDAyNnR3ay1cXHUwMDNlY3R4LCBOVUxMKTtcXG4rXFx0aWYgKCFjdHgpXFxuK1xcdFxcdHJldHVybjtcXG4rXFxuK1xcdG1pZ2h0X3NsZWVwKCk7XFxuK1xcbitcXHQvKlxcbitcXHQgKiBQcmV2ZW50IGZ1dHVyZSBjYWxsYmFja3MgZnJvbSBydW5uaW5nIGFuZCB3YWl0IGZvciBhbnlcXG4rXFx0ICogaW4tcHJvZ3Jlc3MgZXhlY3V0aW9uIHRvIGZpbmlzaC5cXG4rXFx0ICovXFxuK1xcdFdSSVRFX09OQ0UoY3R4LVxcdTAwM2VjYWxsYmFja19mbiwgTlVMTCk7XFxuK1xcdC8qXFxuK1xcdCAqIGt0aHJlYWRfY2FuY2VsX3dvcmtfc3luYygpIHJldHVybnMgdHJ1ZSB3aGVuIGl0IGRlcXVldWVzIGEgcGVuZGluZ1xcbitcXHQgKiB3b3JrIGl0ZW0gZnJvbSB0aGUgd29ya19saXN0IHdpdGhvdXQgZXhlY3V0aW5nIGl0LiAgRWFjaCBzdWNjZXNzZnVsXFxuK1xcdCAqIGJwZl90aHJlYWRfd3Ffc3RhcnQoKSBjYWxsIGluY3JlbWVudHMgY3R4LVxcdTAwM2VyZWZjbnQgYW5kIHJlbGllcyBvbiB0aGVcXG4rXFx0ICogc3Vic2VxdWVudCBicGZfdGhyZWFkX3dxX3dvcmtfZm4oKSBleGVjdXRpb24gdG8gcmVsZWFzZSB0aGF0XFxuK1xcdCAqIHJlZmVyZW5jZSB2aWEgYnBmX3RocmVhZF93cV9jdHhfcHV0KCkuICBJZiB0aGUgd29yayB3YXMgcGVuZGluZyBhbmRcXG4rXFx0ICogZ290IGNhbmNlbGxlZCBoZXJlLCB3b3JrX2ZuIHdpbGwgbmV2ZXIgcnVuIGZvciB0aGF0IHF1ZXVlZCBpbnN0YW5jZSxcXG4rXFx0ICogc28gd2UgbXVzdCBkcm9wIHRoZSByZWZlcmVuY2Ugb3Vyc2VsdmVzIHRvIGF2b2lkIGEgcGVybWFuZW50IHJlZmNvdW50XFxuK1xcdCAqIGxlYWsuXFxuK1xcdCAqXFxuK1xcdCAqIFRoaXMgY292ZXJzIHR3byBzY2VuYXJpb3MgdW5pZm9ybWx5OlxcbitcXHQgKiAgMS4gVGhlIHdvcmsgaXMgcHVyZWx5IHBlbmRpbmcgKG5vdCBjdXJyZW50bHkgZXhlY3V0aW5nKSAtIGUuZy4gYVxcbitcXHQgKiAgICAgbm9ybWFsIGJwZl90aHJlYWRfd3Ffc3RhcnQoKSBjYWxsIHF1ZXVlZCBpdCBidXQgdGhlIHdvcmtlclxcbitcXHQgKiAgICAgdGhyZWFkIGhhc24ndCBwaWNrZWQgaXQgdXAgeWV0LlxcbitcXHQgKiAgMi4gVGhlIHdvcmsgaXMgY3VycmVudGx5IGluLWZsaWdodCBBTkQgd2FzIHNlbGYtcmVzY2hlZHVsZWQgZnJvbVxcbitcXHQgKiAgICAgd2l0aGluIHRoZSBjYWxsYmFjayAtIGt0aHJlYWRfY2FuY2VsX3dvcmtfc3luYygpIGRlcXVldWVzIHRoZVxcbitcXHQgKiAgICAgcmUtcXVldWVkIHBlbmRpbmcgbm9kZSBhbmQgdGhlbiB3YWl0cyBmb3IgdGhlIGluLWZsaWdodFxcbitcXHQgKiAgICAgZXhlY3V0aW9uIHRvIGNvbXBsZXRlLlxcbitcXHQgKiBJbiBib3RoIGNhc2VzIHRoZSByZXR1cm4gdmFsdWUgaXMgdHJ1ZSwgaW5kaWNhdGluZyBvbmUgb3JwaGFuZWRcXG4rXFx0ICogcmVmZXJlbmNlIHRoYXQgbmVlZHMgdG8gYmUgcmVsZWFzZWQgaGVyZS5cXG4rXFx0ICovXFxuK1xcdGlmIChrdGhyZWFkX2NhbmNlbF93b3JrX3N5bmMoXFx1MDAyNmN0eC1cXHUwMDNld29yaykpXFxuK1xcdFxcdGJwZl90aHJlYWRfd3FfY3R4X3B1dChjdHgpO1xcbitcXG4rXFx0LypcXG4rXFx0ICogRHJvcCBvdXIgb3duIHJlZmVyZW5jZS4gIElmIHRoZSB3b3JrIHdhcyBzdGlsbCBpbi1mbGlnaHQgYWJvdmUsXFxuK1xcdCAqIHRoZSByZWZjb3VudCB3b24ndCBoaXQgemVybyBoZXJlIC0gaXQgd2lsbCByZWFjaCB6ZXJvIHdoZW4gdGhlXFxuK1xcdCAqIHdvcmsgcGF0aCBjYWxscyBicGZfdGhyZWFkX3dxX2N0eF9wdXQoKSB1cG9uIGNvbXBsZXRpb24uICBFaXRoZXJcXG4rXFx0ICogd2F5LCBmaW5hbCBjbGVhbnVwICh3b3JrZXIgZGVzdHJ1Y3Rpb24sIHByb2cgcHV0LCBjZ3JvdXAgcHV0LFxcbitcXHQgKiBrZnJlZSkgaGFwcGVucyBleGNsdXNpdmVseSBpbiB0aGUgUkNVIGNhbGxiYWNrIHRvIGtlZXAgdGhlXFxuK1xcdCAqIHRlYXJkb3duIHBhdGggc2luZ2xlLXRocmVhZGVkLlxcbitcXHQgKi9cXG4rXFx0YnBmX3RocmVhZF93cV9jdHhfcHV0KGN0eCk7XFxuK31cXG4rXFxuIF9fYnBmX2tmdW5jX2VuZF9kZWZzKCk7XFxuIFxcbiBzdGF0aWMgdm9pZCBicGZfdGFza193b3JrX2NhbmNlbF9zY2hlZHVsZWQoc3RydWN0IGlycV93b3JrICppcnFfd29yaylcXG5AQCAtNDkxNyw2ICs1MzIxLDggQEAgQlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9tb2RpZnlfcmV0dXJuX3Rlc3RfdHApXFxuIEJURl9JRF9GTEFHUyhmdW5jLCBicGZfd3FfaW5pdClcXG4gQlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl93cV9zZXRfY2FsbGJhY2ssIEtGX0lNUExJQ0lUX0FSR1MpXFxuIEJURl9JRF9GTEFHUyhmdW5jLCBicGZfd3Ffc3RhcnQpXFxuK0JURl9JRF9GTEFHUyhmdW5jLCBicGZfdGhyZWFkX3dxX3NldF9jYWxsYmFjaywgS0ZfSU1QTElDSVRfQVJHUylcXG4rQlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl90aHJlYWRfd3Ffc3RhcnQpXFxuIEJURl9JRF9GTEFHUyhmdW5jLCBicGZfcHJlZW1wdF9kaXNhYmxlKVxcbiBCVEZfSURfRkxBR1MoZnVuYywgYnBmX3ByZWVtcHRfZW5hYmxlKVxcbiBCVEZfSURfRkxBR1MoZnVuYywgYnBmX2l0ZXJfYml0c19uZXcsIEtGX0lURVJfTkVXKVxcbkBAIC00OTc4LDYgKzUzODQsMTUgQEAgc3RhdGljIGNvbnN0IHN0cnVjdCBidGZfa2Z1bmNfaWRfc2V0IGNvbW1vbl9rZnVuY19zZXQgPSB7XFxuIFxcdC5zZXQgICA9IFxcdTAwMjZjb21tb25fYnRmX2lkcyxcXG4gfTtcXG4gXFxuK0JURl9LRlVOQ1NfU1RBUlQoc3lzY2FsbF9idGZfaWRzKVxcbitCVEZfSURfRkxBR1MoZnVuYywgYnBmX3RocmVhZF93cV9pbml0LCBLRl9TTEVFUEFCTEUpXFxuK0JURl9LRlVOQ1NfRU5EKHN5c2NhbGxfYnRmX2lkcylcXG4rXFxuK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYnRmX2tmdW5jX2lkX3NldCBzeXNjYWxsX2tmdW5jX3NldCA9IHtcXG4rXFx0Lm93bmVyID0gVEhJU19NT0RVTEUsXFxuK1xcdC5zZXQgICA9IFxcdTAwMjZzeXNjYWxsX2J0Zl9pZHMsXFxuK307XFxuK1xcbiBzdGF0aWMgaW50IF9faW5pdCBrZnVuY19pbml0KHZvaWQpXFxuIHtcXG4gXFx0aW50IHJldDtcXG5AQCAtNTAwMCw2ICs1NDE1LDcgQEAgc3RhdGljIGludCBfX2luaXQga2Z1bmNfaW5pdCh2b2lkKVxcbiBcXHRyZXQgPSByZXQgPzogcmVnaXN0ZXJfYnRmX2tmdW5jX2lkX3NldChCUEZfUFJPR19UWVBFX1NUUlVDVF9PUFMsIFxcdTAwMjZnZW5lcmljX2tmdW5jX3NldCk7XFxuIFxcdHJldCA9IHJldCA/OiByZWdpc3Rlcl9idGZfa2Z1bmNfaWRfc2V0KEJQRl9QUk9HX1RZUEVfU1lTQ0FMTCwgXFx1MDAyNmdlbmVyaWNfa2Z1bmNfc2V0KTtcXG4gXFx0cmV0ID0gcmV0ID86IHJlZ2lzdGVyX2J0Zl9rZnVuY19pZF9zZXQoQlBGX1BST0dfVFlQRV9DR1JPVVBfU0tCLCBcXHUwMDI2Z2VuZXJpY19rZnVuY19zZXQpO1xcbitcXHRyZXQgPSByZXQgPzogcmVnaXN0ZXJfYnRmX2tmdW5jX2lkX3NldChCUEZfUFJPR19UWVBFX1NZU0NBTEwsIFxcdTAwMjZzeXNjYWxsX2tmdW5jX3NldCk7XFxuIFxcdHJldCA9IHJldCA/OiByZWdpc3Rlcl9idGZfaWRfZHRvcl9rZnVuY3MoZ2VuZXJpY19kdG9ycyxcXG4gXFx0XFx0XFx0XFx0XFx0XFx0ICBBUlJBWV9TSVpFKGdlbmVyaWNfZHRvcnMpLFxcbiBcXHRcXHRcXHRcXHRcXHRcXHQgIFRISVNfTU9EVUxFKTtcXG5AQCAtNTAzNyw0ICs1NDUzLDYgQEAgdm9pZCBicGZfbWFwX2ZyZWVfaW50ZXJuYWxfc3RydWN0cyhzdHJ1Y3QgYnBmX21hcCAqbWFwLCB2b2lkICp2YWwpXFxuIFxcdFxcdGJwZl9vYmpfZnJlZV93b3JrcXVldWUobWFwLVxcdTAwM2VyZWNvcmQsIHZhbCk7XFxuIFxcdGlmIChidGZfcmVjb3JkX2hhc19maWVsZChtYXAtXFx1MDAzZXJlY29yZCwgQlBGX1RBU0tfV09SSykpXFxuIFxcdFxcdGJwZl9vYmpfZnJlZV90YXNrX3dvcmsobWFwLVxcdTAwM2VyZWNvcmQsIHZhbCk7XFxuK1xcdGlmIChidGZfcmVjb3JkX2hhc19maWVsZChtYXAtXFx1MDAzZXJlY29yZCwgQlBGX1RIUkVBRF9XUSkpXFxuK1xcdFxcdGJwZl9vYmpfZnJlZV90aHJlYWRfd3EobWFwLVxcdTAwM2VyZWNvcmQsIHZhbCk7XFxuIH1cXG5kaWZmIC0tZ2l0IGEva2VybmVsL2JwZi9zeXNjYWxsLmMgYi9rZXJuZWwvYnBmL3N5c2NhbGwuY1xcbmluZGV4IDhkMTExZGE4ODY1NTMuLmRlYTE0ODIzYmFjZDIgMTAwNjQ0XFxuLS0tIGEva2VybmVsL2JwZi9zeXNjYWxsLmNcXG4rKysgYi9rZXJuZWwvYnBmL3N5c2NhbGwuY1xcbkBAIC02ODgsNiArNjg4LDcgQEAgdm9pZCBidGZfcmVjb3JkX2ZyZWUoc3RydWN0IGJ0Zl9yZWNvcmQgKnJlYylcXG4gXFx0XFx0Y2FzZSBCUEZfUkVGQ09VTlQ6XFxuIFxcdFxcdGNhc2UgQlBGX1dPUktRVUVVRTpcXG4gXFx0XFx0Y2FzZSBCUEZfVEFTS19XT1JLOlxcbitcXHRcXHRjYXNlIEJQRl9USFJFQURfV1E6XFxuIFxcdFxcdFxcdC8qIE5vdGhpbmcgdG8gcmVsZWFzZSAqL1xcbiBcXHRcXHRcXHRicmVhaztcXG4gXFx0XFx0ZGVmYXVsdDpcXG5AQCAtNzQyLDYgKzc0Myw3IEBAIHN0cnVjdCBidGZfcmVjb3JkICpidGZfcmVjb3JkX2R1cChjb25zdCBzdHJ1Y3QgYnRmX3JlY29yZCAqcmVjKVxcbiBcXHRcXHRjYXNlIEJQRl9SRUZDT1VOVDpcXG4gXFx0XFx0Y2FzZSBCUEZfV09SS1FVRVVFOlxcbiBcXHRcXHRjYXNlIEJQRl9UQVNLX1dPUks6XFxuK1xcdFxcdGNhc2UgQlBGX1RIUkVBRF9XUTpcXG4gXFx0XFx0XFx0LyogTm90aGluZyB0byBhY3F1aXJlICovXFxuIFxcdFxcdFxcdGJyZWFrO1xcbiBcXHRcXHRkZWZhdWx0OlxcbkBAIC04MDcsNiArODA5LDEzIEBAIHZvaWQgYnBmX29ial9mcmVlX3Rhc2tfd29yayhjb25zdCBzdHJ1Y3QgYnRmX3JlY29yZCAqcmVjLCB2b2lkICpvYmopXFxuIFxcdGJwZl90YXNrX3dvcmtfY2FuY2VsX2FuZF9mcmVlKG9iaiArIHJlYy1cXHUwMDNldGFza193b3JrX29mZik7XFxuIH1cXG4gXFxuK3ZvaWQgYnBmX29ial9mcmVlX3RocmVhZF93cShjb25zdCBzdHJ1Y3QgYnRmX3JlY29yZCAqcmVjLCB2b2lkICpvYmopXFxuK3tcXG4rXFx0aWYgKFdBUk5fT05fT05DRSghYnRmX3JlY29yZF9oYXNfZmllbGQocmVjLCBCUEZfVEhSRUFEX1dRKSkpXFxuK1xcdFxcdHJldHVybjtcXG4rXFx0YnBmX3RocmVhZF93cV9jYW5jZWxfYW5kX2ZyZWUob2JqICsgcmVjLVxcdTAwM2V0aHJlYWRfd3Ffb2ZmKTtcXG4rfVxcbitcXG4gdm9pZCBicGZfb2JqX2NhbmNlbF9maWVsZHMoc3RydWN0IGJwZl9tYXAgKm1hcCwgdm9pZCAqb2JqKVxcbiB7XFxuIFxcdGJwZl9tYXBfZnJlZV9pbnRlcm5hbF9zdHJ1Y3RzKG1hcCwgb2JqKTtcXG5AQCAtODM5LDYgKzg0OCw5IEBAIHZvaWQgYnBmX29ial9mcmVlX2ZpZWxkcyhjb25zdCBzdHJ1Y3QgYnRmX3JlY29yZCAqcmVjLCB2b2lkICpvYmopXFxuIFxcdFxcdGNhc2UgQlBGX1RBU0tfV09SSzpcXG4gXFx0XFx0XFx0YnBmX3Rhc2tfd29ya19jYW5jZWxfYW5kX2ZyZWUoZmllbGRfcHRyKTtcXG4gXFx0XFx0XFx0YnJlYWs7XFxuK1xcdFxcdGNhc2UgQlBGX1RIUkVBRF9XUTpcXG4rXFx0XFx0XFx0YnBmX3RocmVhZF93cV9jYW5jZWxfYW5kX2ZyZWUoZmllbGRfcHRyKTtcXG4rXFx0XFx0XFx0YnJlYWs7XFxuIFxcdFxcdGNhc2UgQlBGX0tQVFJfVU5SRUY6XFxuIFxcdFxcdFxcdFdSSVRFX09OQ0UoKih1NjQgKilmaWVsZF9wdHIsIDApO1xcbiBcXHRcXHRcXHRicmVhaztcXG5AQCAtMTI2NSw3ICsxMjc3LDcgQEAgc3RhdGljIGludCBtYXBfY2hlY2tfYnRmKHN0cnVjdCBicGZfbWFwICptYXAsIHN0cnVjdCBicGZfdG9rZW4gKnRva2VuLFxcbiBcXHRtYXAtXFx1MDAzZXJlY29yZCA9IGJ0Zl9wYXJzZV9maWVsZHMoYnRmLCB2YWx1ZV90eXBlLFxcbiBcXHRcXHRcXHRcXHQgICAgICAgQlBGX1NQSU5fTE9DSyB8IEJQRl9SRVNfU1BJTl9MT0NLIHwgQlBGX1RJTUVSIHwgQlBGX0tQVFIgfCBCUEZfTElTVF9IRUFEIHxcXG4gXFx0XFx0XFx0XFx0ICAgICAgIEJQRl9SQl9ST09UIHwgQlBGX1JFRkNPVU5UIHwgQlBGX1dPUktRVUVVRSB8IEJQRl9VUFRSIHxcXG4tXFx0XFx0XFx0XFx0ICAgICAgIEJQRl9UQVNLX1dPUkssXFxuK1xcdFxcdFxcdFxcdCAgICAgICBCUEZfVEFTS19XT1JLIHwgQlBGX1RIUkVBRF9XUSxcXG4gXFx0XFx0XFx0XFx0ICAgICAgIG1hcC1cXHUwMDNldmFsdWVfc2l6ZSk7XFxuIFxcdGlmICghSVNfRVJSX09SX05VTEwobWFwLVxcdTAwM2VyZWNvcmQpKSB7XFxuIFxcdFxcdGludCBpO1xcbkBAIC0xMjk5LDYgKzEzMTEsNyBAQCBzdGF0aWMgaW50IG1hcF9jaGVja19idGYoc3RydWN0IGJwZl9tYXAgKm1hcCwgc3RydWN0IGJwZl90b2tlbiAqdG9rZW4sXFxuIFxcdFxcdFxcdGNhc2UgQlBGX1RJTUVSOlxcbiBcXHRcXHRcXHRjYXNlIEJQRl9XT1JLUVVFVUU6XFxuIFxcdFxcdFxcdGNhc2UgQlBGX1RBU0tfV09SSzpcXG4rXFx0XFx0XFx0Y2FzZSBCUEZfVEhSRUFEX1dROlxcbiBcXHRcXHRcXHRcXHRpZiAobWFwLVxcdTAwM2VtYXBfdHlwZSAhPSBCUEZfTUFQX1RZUEVfSEFTSCBcXHUwMDI2XFx1MDAyNlxcbiBcXHRcXHRcXHRcXHQgICAgbWFwLVxcdTAwM2VtYXBfdHlwZSAhPSBCUEZfTUFQX1RZUEVfUkhBU0ggXFx1MDAyNlxcdTAwMjZcXG4gXFx0XFx0XFx0XFx0ICAgIG1hcC1cXHUwMDNlbWFwX3R5cGUgIT0gQlBGX01BUF9UWVBFX0xSVV9IQVNIIFxcdTAwMjZcXHUwMDI2XFxuZGlmZiAtLWdpdCBhL2tlcm5lbC9icGYvdmVyaWZpZXIuYyBiL2tlcm5lbC9icGYvdmVyaWZpZXIuY1xcbmluZGV4IGU2MjMzYzAwODFkMTAuLjQ0ZTc5ZmU0ODBiNmIgMTAwNjQ0XFxuLS0tIGEva2VybmVsL2JwZi92ZXJpZmllci5jXFxuKysrIGIva2VybmVsL2JwZi92ZXJpZmllci5jXFxuQEAgLTQ3Nyw2ICs0NzcsNyBAQCBzdGF0aWMgYm9vbCBpc19hc3luY19jYWxsYmFja19jYWxsaW5nX2tmdW5jKHUzMiBidGZfaWQpO1xcbiBzdGF0aWMgYm9vbCBpc19jYWxsYmFja19jYWxsaW5nX2tmdW5jKHUzMiBidGZfaWQpO1xcbiBcXG4gc3RhdGljIGJvb2wgaXNfYnBmX3dxX3NldF9jYWxsYmFja19rZnVuYyh1MzIgYnRmX2lkKTtcXG4rc3RhdGljIGJvb2wgaXNfYnBmX3RocmVhZF93cV9zZXRfY2FsbGJhY2tfa2Z1bmModTMyIGJ0Zl9pZCk7XFxuIHN0YXRpYyBib29sIGlzX3Rhc2tfd29ya19hZGRfa2Z1bmModTMyIGZ1bmNfaWQpO1xcbiBcXG4gc3RhdGljIGJvb2wgaXNfc3luY19jYWxsYmFja19jYWxsaW5nX2Z1bmN0aW9uKGVudW0gYnBmX2Z1bmNfaWQgZnVuY19pZClcXG5AQCAtNTE2LDkgKzUxNywxMSBAQCBzdGF0aWMgYm9vbCBpc19hc3luY19jYl9zbGVlcGFibGUoc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudiwgc3RydWN0IGJwZl9pbnNuXFxuIFxcdGlmIChicGZfaGVscGVyX2NhbGwoaW5zbikgXFx1MDAyNlxcdTAwMjYgaW5zbi1cXHUwMDNlaW1tID09IEJQRl9GVU5DX3RpbWVyX3NldF9jYWxsYmFjaylcXG4gXFx0XFx0cmV0dXJuIGZhbHNlO1xcbiBcXG4tXFx0LyogYnBmX3dxIGFuZCBicGZfdGFza193b3JrIGNhbGxiYWNrcyBhcmUgYWx3YXlzIHNsZWVwYWJsZS4gKi9cXG4rXFx0LyogYnBmX3dxLCBicGZfdGhyZWFkX3dxIGFuZCBicGZfdGFza193b3JrIGNhbGxiYWNrcyBhcmUgYWx3YXlzIHNsZWVwYWJsZS4gKi9cXG4gXFx0aWYgKGJwZl9wc2V1ZG9fa2Z1bmNfY2FsbChpbnNuKSBcXHUwMDI2XFx1MDAyNiBpbnNuLVxcdTAwM2VvZmYgPT0gMCBcXHUwMDI2XFx1MDAyNlxcbi1cXHQgICAgKGlzX2JwZl93cV9zZXRfY2FsbGJhY2tfa2Z1bmMoaW5zbi1cXHUwMDNlaW1tKSB8fCBpc190YXNrX3dvcmtfYWRkX2tmdW5jKGluc24tXFx1MDAzZWltbSkpKVxcbitcXHQgICAgKGlzX2JwZl93cV9zZXRfY2FsbGJhY2tfa2Z1bmMoaW5zbi1cXHUwMDNlaW1tKSB8fFxcbitcXHQgICAgIGlzX2JwZl90aHJlYWRfd3Ffc2V0X2NhbGxiYWNrX2tmdW5jKGluc24tXFx1MDAzZWltbSkgfHxcXG4rXFx0ICAgICBpc190YXNrX3dvcmtfYWRkX2tmdW5jKGluc24tXFx1MDAzZWltbSkpKVxcbiBcXHRcXHRyZXR1cm4gdHJ1ZTtcXG4gXFxuIFxcdHZlcmlmaWVyX2J1ZyhlbnYsIFxcXCJ1bmhhbmRsZWQgYXN5bmMgY2FsbGJhY2sgaW4gaXNfYXN5bmNfY2Jfc2xlZXBhYmxlXFxcIik7XFxuQEAgLTE4NzEsNyArMTg3NCwxMCBAQCBzdGF0aWMgdm9pZCByZWZpbmVfbWFwX2xvb2t1cF92YWx1ZShzdHJ1Y3QgYnBmX3JlZ19zdGF0ZSAqcmVnKVxcbiBcXHRcXHQgKiBhcyBVSUQgb2YgdGhlIGlubmVyIG1hcC5cXG4gXFx0XFx0ICovXFxuIFxcdFxcdGlmIChidGZfcmVjb3JkX2hhc19maWVsZChtYXAtXFx1MDAzZWlubmVyX21hcF9tZXRhLVxcdTAwM2VyZWNvcmQsXFxuLVxcdFxcdFxcdFxcdFxcdCBCUEZfVElNRVIgfCBCUEZfV09SS1FVRVVFIHwgQlBGX1RBU0tfV09SSykpXFxuK1xcdFxcdFxcdFxcdFxcdCBCUEZfVElNRVIgfFxcbitcXHRcXHRcXHRcXHRcXHQgQlBGX1dPUktRVUVVRSB8XFxuK1xcdFxcdFxcdFxcdFxcdCBCUEZfVEFTS19XT1JLIHxcXG4rXFx0XFx0XFx0XFx0XFx0IEJQRl9USFJFQURfV1EpKVxcbiBcXHRcXHRcXHRyZWctXFx1MDAzZW1hcF91aWQgPSByZWctXFx1MDAzZWlkO1xcbiBcXHR9IGVsc2UgaWYgKG1hcC1cXHUwMDNlbWFwX3R5cGUgPT0gQlBGX01BUF9UWVBFX1hTS01BUCkge1xcbiBcXHRcXHRyZWctXFx1MDAzZXR5cGUgPSBQVFJfVE9fWERQX1NPQ0sgfCBtYXliZV9udWxsO1xcbkBAIC03MjQzLDYgKzcyNDksOSBAQCBzdGF0aWMgaW50IGNoZWNrX21hcF9maWVsZF9wb2ludGVyKHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsIHN0cnVjdCBicGZfcmVnX1xcbiBcXHRjYXNlIEJQRl9XT1JLUVVFVUU6XFxuIFxcdFxcdGZpZWxkX29mZiA9IG1hcC1cXHUwMDNlcmVjb3JkLVxcdTAwM2V3cV9vZmY7XFxuIFxcdFxcdGJyZWFrO1xcbitcXHRjYXNlIEJQRl9USFJFQURfV1E6XFxuK1xcdFxcdGZpZWxkX29mZiA9IG1hcC1cXHUwMDNlcmVjb3JkLVxcdTAwM2V0aHJlYWRfd3Ffb2ZmO1xcbitcXHRcXHRicmVhaztcXG4gXFx0ZGVmYXVsdDpcXG4gXFx0XFx0dmVyaWZpZXJfYnVnKGVudiwgXFxcInVuc3VwcG9ydGVkIEJURiBmaWVsZCB0eXBlOiAlc1xcXFxuXFxcIiwgc3RydWN0X25hbWUpO1xcbiBcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG5AQCAtMTA5NDAsNiArMTA5NDksNyBAQCBlbnVtIHtcXG4gXFx0S0ZfQVJHX1dPUktRVUVVRV9JRCxcXG4gXFx0S0ZfQVJHX1JFU19TUElOX0xPQ0tfSUQsXFxuIFxcdEtGX0FSR19UQVNLX1dPUktfSUQsXFxuK1xcdEtGX0FSR19USFJFQURfV1FfSUQsXFxuIFxcdEtGX0FSR19QUk9HX0FVWF9JRCxcXG4gXFx0S0ZfQVJHX1RJTUVSX0lEXFxuIH07XFxuQEAgLTEwOTUzLDYgKzEwOTYzLDcgQEAgQlRGX0lEKHN0cnVjdCwgYnBmX3JiX25vZGUpXFxuIEJURl9JRChzdHJ1Y3QsIGJwZl93cSlcXG4gQlRGX0lEKHN0cnVjdCwgYnBmX3Jlc19zcGluX2xvY2spXFxuIEJURl9JRChzdHJ1Y3QsIGJwZl90YXNrX3dvcmspXFxuK0JURl9JRChzdHJ1Y3QsIGJwZl90aHJlYWRfd3EpXFxuIEJURl9JRChzdHJ1Y3QsIGJwZl9wcm9nX2F1eClcXG4gQlRGX0lEKHN0cnVjdCwgYnBmX3RpbWVyKVxcbiBcXG5AQCAtMTEwMTMsNiArMTEwMjQsMTEgQEAgc3RhdGljIGJvb2wgaXNfa2Z1bmNfYXJnX3Rhc2tfd29yayhjb25zdCBzdHJ1Y3QgYnRmICpidGYsIGNvbnN0IHN0cnVjdCBidGZfcGFyYW1cXG4gXFx0cmV0dXJuIF9faXNfa2Z1bmNfcHRyX2FyZ190eXBlKGJ0ZiwgYXJnLCBLRl9BUkdfVEFTS19XT1JLX0lEKTtcXG4gfVxcbiBcXG4rc3RhdGljIGJvb2wgaXNfa2Z1bmNfYXJnX3RocmVhZF93cShjb25zdCBzdHJ1Y3QgYnRmICpidGYsIGNvbnN0IHN0cnVjdCBidGZfcGFyYW0gKmFyZylcXG4re1xcbitcXHRyZXR1cm4gX19pc19rZnVuY19wdHJfYXJnX3R5cGUoYnRmLCBhcmcsIEtGX0FSR19USFJFQURfV1FfSUQpO1xcbit9XFxuK1xcbiBzdGF0aWMgYm9vbCBpc19rZnVuY19hcmdfcmVzX3NwaW5fbG9jayhjb25zdCBzdHJ1Y3QgYnRmICpidGYsIGNvbnN0IHN0cnVjdCBidGZfcGFyYW0gKmFyZylcXG4ge1xcbiBcXHRyZXR1cm4gX19pc19rZnVuY19wdHJfYXJnX3R5cGUoYnRmLCBhcmcsIEtGX0FSR19SRVNfU1BJTl9MT0NLX0lEKTtcXG5AQCAtMTExMzIsNiArMTExNDgsNyBAQCBlbnVtIGtmdW5jX3B0cl9hcmdfdHlwZSB7XFxuIFxcdEtGX0FSR19QVFJfVE9fSVJRX0ZMQUcsXFxuIFxcdEtGX0FSR19QVFJfVE9fUkVTX1NQSU5fTE9DSyxcXG4gXFx0S0ZfQVJHX1BUUl9UT19UQVNLX1dPUkssXFxuK1xcdEtGX0FSR19QVFJfVE9fVEhSRUFEX1dRLFxcbiB9O1xcbiBcXG4gZW51bSBzcGVjaWFsX2tmdW5jX3R5cGUge1xcbkBAIC0xMTE3OCw2ICsxMTE5NSw3IEBAIGVudW0gc3BlY2lhbF9rZnVuY190eXBlIHtcXG4gXFx0S0ZfYnBmX3BlcmNwdV9vYmpfZHJvcCxcXG4gXFx0S0ZfYnBmX3Rocm93LFxcbiBcXHRLRl9icGZfd3Ffc2V0X2NhbGxiYWNrLFxcbitcXHRLRl9icGZfdGhyZWFkX3dxX3NldF9jYWxsYmFjayxcXG4gXFx0S0ZfYnBmX3ByZWVtcHRfZGlzYWJsZSxcXG4gXFx0S0ZfYnBmX3ByZWVtcHRfZW5hYmxlLFxcbiBcXHRLRl9icGZfaXRlcl9jc3NfdGFza19uZXcsXFxuQEAgLTExMjU4LDYgKzExMjc2LDcgQEAgQlRGX0lEKGZ1bmMsIGJwZl9wZXJjcHVfb2JqX2Ryb3BfaW1wbClcXG4gQlRGX0lEKGZ1bmMsIGJwZl9wZXJjcHVfb2JqX2Ryb3ApXFxuIEJURl9JRChmdW5jLCBicGZfdGhyb3cpXFxuIEJURl9JRChmdW5jLCBicGZfd3Ffc2V0X2NhbGxiYWNrKVxcbitCVEZfSUQoZnVuYywgYnBmX3RocmVhZF93cV9zZXRfY2FsbGJhY2spXFxuIEJURl9JRChmdW5jLCBicGZfcHJlZW1wdF9kaXNhYmxlKVxcbiBCVEZfSUQoZnVuYywgYnBmX3ByZWVtcHRfZW5hYmxlKVxcbiAjaWZkZWYgQ09ORklHX0NHUk9VUFNcXG5AQCAtMTE0NjAsNiArMTE0NzksOCBAQCBnZXRfa2Z1bmNfYXJnX3R5cGUoc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudiwgc3RydWN0IGJwZl9jYWxsX2FyZ19tZXRhICptZXRhLFxcbiBcXHRcXHRhcmdfdHlwZSA9IEtGX0FSR19QVFJfVE9fVElNRVI7XFxuIFxcdGVsc2UgaWYgKGlzX2tmdW5jX2FyZ190YXNrX3dvcmsobWV0YS1cXHUwMDNlYnRmLCBcXHUwMDI2YXJnc1thcmddKSlcXG4gXFx0XFx0YXJnX3R5cGUgPSBLRl9BUkdfUFRSX1RPX1RBU0tfV09SSztcXG4rXFx0ZWxzZSBpZiAoaXNfa2Z1bmNfYXJnX3RocmVhZF93cShtZXRhLVxcdTAwM2VidGYsIFxcdTAwMjZhcmdzW2FyZ10pKVxcbitcXHRcXHRhcmdfdHlwZSA9IEtGX0FSR19QVFJfVE9fVEhSRUFEX1dRO1xcbiBcXHRlbHNlIGlmIChpc19rZnVuY19hcmdfaXJxX2ZsYWcobWV0YS1cXHUwMDNlYnRmLCBcXHUwMDI2YXJnc1thcmddKSlcXG4gXFx0XFx0YXJnX3R5cGUgPSBLRl9BUkdfUFRSX1RPX0lSUV9GTEFHO1xcbiBcXHRlbHNlIGlmIChpc19rZnVuY19hcmdfcmVzX3NwaW5fbG9jayhtZXRhLVxcdTAwM2VidGYsIFxcdTAwMjZhcmdzW2FyZ10pKVxcbkBAIC0xMTgzMyw2ICsxMTg1NCw3IEBAIHN0YXRpYyBib29sIGlzX3N5bmNfY2FsbGJhY2tfY2FsbGluZ19rZnVuYyh1MzIgYnRmX2lkKVxcbiBzdGF0aWMgYm9vbCBpc19hc3luY19jYWxsYmFja19jYWxsaW5nX2tmdW5jKHUzMiBidGZfaWQpXFxuIHtcXG4gXFx0cmV0dXJuIGlzX2JwZl93cV9zZXRfY2FsbGJhY2tfa2Z1bmMoYnRmX2lkKSB8fFxcbitcXHQgICAgICAgaXNfYnBmX3RocmVhZF93cV9zZXRfY2FsbGJhY2tfa2Z1bmMoYnRmX2lkKSB8fFxcbiBcXHQgICAgICAgaXNfdGFza193b3JrX2FkZF9rZnVuYyhidGZfaWQpO1xcbiB9XFxuIFxcbkBAIC0xMTg0Nyw2ICsxMTg2OSwxMSBAQCBzdGF0aWMgYm9vbCBpc19icGZfd3Ffc2V0X2NhbGxiYWNrX2tmdW5jKHUzMiBidGZfaWQpXFxuIFxcdHJldHVybiBidGZfaWQgPT0gc3BlY2lhbF9rZnVuY19saXN0W0tGX2JwZl93cV9zZXRfY2FsbGJhY2tdO1xcbiB9XFxuIFxcbitzdGF0aWMgYm9vbCBpc19icGZfdGhyZWFkX3dxX3NldF9jYWxsYmFja19rZnVuYyh1MzIgYnRmX2lkKVxcbit7XFxuK1xcdHJldHVybiBidGZfaWQgPT0gc3BlY2lhbF9rZnVuY19saXN0W0tGX2JwZl90aHJlYWRfd3Ffc2V0X2NhbGxiYWNrXTtcXG4rfVxcbitcXG4gc3RhdGljIGJvb2wgaXNfY2FsbGJhY2tfY2FsbGluZ19rZnVuYyh1MzIgYnRmX2lkKVxcbiB7XFxuIFxcdHJldHVybiBpc19zeW5jX2NhbGxiYWNrX2NhbGxpbmdfa2Z1bmMoYnRmX2lkKSB8fFxcbkBAIC0xMjE5Miw2ICsxMjIxOSw3IEBAIHN0YXRpYyBpbnQgY2hlY2tfa2Z1bmNfYXJncyhzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52LCBzdHJ1Y3QgYnBmX2NhbGxfYXJnX21lXFxuIFxcdFxcdGNhc2UgS0ZfQVJHX1BUUl9UT19XT1JLUVVFVUU6XFxuIFxcdFxcdGNhc2UgS0ZfQVJHX1BUUl9UT19USU1FUjpcXG4gXFx0XFx0Y2FzZSBLRl9BUkdfUFRSX1RPX1RBU0tfV09SSzpcXG4rXFx0XFx0Y2FzZSBLRl9BUkdfUFRSX1RPX1RIUkVBRF9XUTpcXG4gXFx0XFx0Y2FzZSBLRl9BUkdfUFRSX1RPX0lSUV9GTEFHOlxcbiBcXHRcXHRjYXNlIEtGX0FSR19QVFJfVE9fUkVTX1NQSU5fTE9DSzpcXG4gXFx0XFx0XFx0YnJlYWs7XFxuQEAgLTEzMTM5LDYgKzEzMTY3LDE2IEBAIHN0YXRpYyBpbnQgY2hlY2tfa2Z1bmNfY2FsbChzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52LCBzdHJ1Y3QgYnBmX2luc24gKmluc24sXFxuIFxcdFxcdH1cXG4gXFx0fVxcbiBcXG4rXFx0aWYgKGlzX2JwZl90aHJlYWRfd3Ffc2V0X2NhbGxiYWNrX2tmdW5jKG1ldGEuZnVuY19pZCkpIHtcXG4rXFx0XFx0ZXJyID0gcHVzaF9jYWxsYmFja19jYWxsKGVudiwgaW5zbiwgaW5zbl9pZHgsIG1ldGEuc3VicHJvZ25vLFxcbitcXHRcXHRcXHRcXHRcXHQgc2V0X3RpbWVyX2NhbGxiYWNrX3N0YXRlKTtcXG4rXFx0XFx0aWYgKGVycikge1xcbitcXHRcXHRcXHR2ZXJib3NlKGVudiwgXFxcImtmdW5jICVzIyVkIGZhaWxlZCBjYWxsYmFjayB2ZXJpZmljYXRpb25cXFxcblxcXCIsXFxuK1xcdFxcdFxcdFxcdGZ1bmNfbmFtZSwgbWV0YS5mdW5jX2lkKTtcXG4rXFx0XFx0XFx0cmV0dXJuIGVycjtcXG4rXFx0XFx0fVxcbitcXHR9XFxuK1xcbiBcXHRpZiAoaXNfdGFza193b3JrX2FkZF9rZnVuYyhtZXRhLmZ1bmNfaWQpKSB7XFxuIFxcdFxcdGVyciA9IHB1c2hfY2FsbGJhY2tfY2FsbChlbnYsIGluc24sIGluc25faWR4LCBtZXRhLnN1YnByb2dubyxcXG4gXFx0XFx0XFx0XFx0XFx0IHNldF90YXNrX3dvcmtfc2NoZWR1bGVfY2FsbGJhY2tfc3RhdGUpO1xcbmRpZmYgLS1naXQgYS9rZXJuZWwvY2dyb3VwL2Nncm91cC5jIGIva2VybmVsL2Nncm91cC9jZ3JvdXAuY1xcbmluZGV4IDM4ZjhkOWRmOGZiYzQuLjE2NGUwNjljNzU3NjIgMTAwNjQ0XFxuLS0tIGEva2VybmVsL2Nncm91cC9jZ3JvdXAuY1xcbisrKyBiL2tlcm5lbC9jZ3JvdXAvY2dyb3VwLmNcXG5AQCAtMzA0Miw2ICszMDQyLDE5IEBAIGludCBjZ3JvdXBfYXR0YWNoX3Rhc2soc3RydWN0IGNncm91cCAqZHN0X2NncnAsIHN0cnVjdCB0YXNrX3N0cnVjdCAqbGVhZGVyLFxcbiBcXHRyZXR1cm4gcmV0O1xcbiB9XFxuIFxcbitpbnQgY2dyb3VwX2t0aHJlYWRfYXR0YWNoKHN0cnVjdCBjZ3JvdXAgKmNncnAsIHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaylcXG4re1xcbitcXHRpbnQgcmV0O1xcbitcXG4rXFx0Y2dyb3VwX2xvY2soKTtcXG4rXFx0Y2dyb3VwX2F0dGFjaF9sb2NrKENHUlBfQVRUQUNIX0xPQ0tfR0xPQkFMLCBOVUxMKTtcXG4rXFx0cmV0ID0gY2dyb3VwX2F0dGFjaF90YXNrKGNncnAsIHRhc2ssIGZhbHNlKTtcXG4rXFx0Y2dyb3VwX2F0dGFjaF91bmxvY2soQ0dSUF9BVFRBQ0hfTE9DS19HTE9CQUwsIE5VTEwpO1xcbitcXHRjZ3JvdXBfdW5sb2NrKCk7XFxuK1xcbitcXHRyZXR1cm4gcmV0O1xcbit9XFxuK1xcbiBzdHJ1Y3QgdGFza19zdHJ1Y3QgKmNncm91cF9wcm9jc193cml0ZV9zdGFydChjaGFyICpidWYsIGJvb2wgdGhyZWFkZ3JvdXAsXFxuIFxcdFxcdFxcdFxcdFxcdCAgICAgZW51bSBjZ3JvdXBfYXR0YWNoX2xvY2tfbW9kZSAqbG9ja19tb2RlKVxcbiB7XFxuZGlmZiAtLWdpdCBhL21tL2JwZl9tZW1jb250cm9sLmMgYi9tbS9icGZfbWVtY29udHJvbC5jXFxuaW5kZXggNzE2ZGY0OWQ3NjQ3Ny4uM2Y3YTVjOTdlMTM1NSAxMDA2NDRcXG4tLS0gYS9tbS9icGZfbWVtY29udHJvbC5jXFxuKysrIGIvbW0vYnBmX21lbWNvbnRyb2wuY1xcbkBAIC02LDYgKzYsNyBAQFxcbiAgKi9cXG4gXFxuICNpbmNsdWRlIFxcdTAwM2NsaW51eC9tZW1jb250cm9sLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9zd2FwLmhcXHUwMDNlXFxuICNpbmNsdWRlIFxcdTAwM2NsaW51eC9icGYuaFxcdTAwM2VcXG4gXFxuIF9fYnBmX2tmdW5jX3N0YXJ0X2RlZnMoKTtcXG5AQCAtMTU5LDYgKzE2MCw2MSBAQCBfX2JwZl9rZnVuYyB2b2lkIGJwZl9tZW1fY2dyb3VwX2ZsdXNoX3N0YXRzKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZylcXG4gXFx0bWVtX2Nncm91cF9mbHVzaF9zdGF0cyhtZW1jZyk7XFxuIH1cXG4gXFxuKy8qKlxcbisgKiBicGZfdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcyAtIGF0dGVtcHQgdG8gcmVjbGFpbSBwYWdlcyBmcm9tXFxuKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSBtZW1vcnkgY2dyb3VwXFxuKyAqIEBtZW1jZzogICAgICAgICAgIHRoZSB0YXJnZXQgbWVtb3J5IGNncm91cCB0byByZWNsYWltIGZyb21cXG4rICogQG5yX3BhZ2VzOiAgICAgICAgdGhlIG51bWJlciBvZiBwYWdlcyB0byByZWNsYWltXFxuKyAqIEBnZnBfbWFzazogICAgICAgIEdGUCBmbGFncyBjb250cm9sbGluZyB0aGUgcmVjbGFpbSBiZWhhdmlvclxcbisgKiBAcmVjbGFpbV9vcHRpb25zOiBiaXRtYXNrIG9mIE1FTUNHX1JFQ0xBSU1fKiBmbGFncyB0byB0dW5lXFxuKyAqICAgICAgICAgICAgICAgICAgIHJlY2xhaW0gc3RyYXRlZ3lcXG4rICogQHN3YXBwaW5lc3M6ICAgICAgc3dhcHBpbmVzcyBvdmVycmlkZSB2YWx1ZSwgb3IgYSBzZW50aW5lbCB0byB1c2VcXG4rICogICAgICAgICAgICAgICAgICAgdGhlIGRlZmF1bHRcXG4rICpcXG4rICogQlBGLWZhY2luZyB3cmFwcGVyIGFyb3VuZCB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKCkgdGhhdFxcbisgKiB2YWxpZGF0ZXMgYW5kIHRyYW5zbGF0ZXMgdGhlIEBzd2FwcGluZXNzIGFyZ3VtZW50IGJlZm9yZVxcbisgKiBkZWxlZ2F0aW5nIHRvIHRoZSBjb3JlIHJlY2xhaW0gcGF0aC5cXG4rICpcXG4rICogVGhlIEBzd2FwcGluZXNzIHBhcmFtZXRlciBmb2xsb3dzIHRoZXNlIHNlbWFudGljczpcXG4rICogICAtIFZhbHVlcyBpbiBbTUlOX1NXQVBQSU5FU1MsIFNXQVBQSU5FU1NfQU5PTl9PTkxZXSBhcmUgcGFzc2VkXFxuKyAqICAgICB0aHJvdWdoIGFzIGFuIGV4cGxpY2l0IHN3YXBwaW5lc3Mgb3ZlcnJpZGUuXFxuKyAqICAgLSBWYWx1ZXMgYmVsb3cgTUlOX1NXQVBQSU5FU1MgYXJlIHRyZWF0ZWQgYXMgXFxcInVzZSB0aGUgc3lzdGVtXFxuKyAqICAgICBkZWZhdWx0XFxcIjsgdGhlIG92ZXJyaWRlIHBvaW50ZXIgaXMgc2V0IHRvIE5VTEwgYW5kIHRoZSBjZ3JvdXAnc1xcbisgKiAgICAgb3duIHN3YXBwaW5lc3Mgc2V0dGluZyB0YWtlcyBlZmZlY3QuXFxuKyAqICAgLSBWYWx1ZXMgYWJvdmUgU1dBUFBJTkVTU19BTk9OX09OTFkgYXJlIHJlamVjdGVkIGFzIGludmFsaWQuXFxuKyAqICAgLSBJZiBAcmVjbGFpbV9vcHRpb25zIGRvZXMgbm90IGluY2x1ZGUgTUVNQ0dfUkVDTEFJTV9QUk9BQ1RJVkUsXFxuKyAqICAgICB0aGUgQHN3YXBwaW5lc3Mgb3ZlcnJpZGUgaXMgaWdub3JlZCBlbnRpcmVseSBieSB0aGUgY29yZVxcbisgKiAgICAgcmVjbGFpbSBwYXRoIGFuZCB0aGUgc3lzdGVtIGRlZmF1bHQgaXMgdXNlZCByZWdhcmRsZXNzLlxcbisgKlxcbisgKiBTd2FwIHVzYWdlIGR1cmluZyByZWNsYWltIGlzIGdhdGVkIG9uIEByZWNsYWltX29wdGlvbnM6IHN3YXAgaXNcXG4rICogY29uc2lkZXJlZCBvbmx5IHdoZW4gTUVNQ0dfUkVDTEFJTV9NQVlfU1dBUCBpcyBzZXQuICBXaXRob3V0IHRoaXNcXG4rICogZmxhZywgcmVjbGFpbSBpcyByZXN0cmljdGVkIHRvIGZpbGUtYmFja2VkIHBhZ2VzIHJlZ2FyZGxlc3Mgb2YgdGhlXFxuKyAqIEBzd2FwcGluZXNzIHZhbHVlIG9yIHRoZSBjZ3JvdXAncyBzd2FwcGluZXNzIHNldHRpbmcuXFxuKyAqXFxuKyAqIFJldHVybjpcXG4rICogICBUaGUgbnVtYmVyIG9mIHBhZ2VzIGFjdHVhbGx5IHJlY2xhaW1lZCBvbiBzdWNjZXNzLCBvciAwXFxuKyAqICAgaWYgQHN3YXBwaW5lc3MgZXhjZWVkcyBTV0FQUElORVNTX0FOT05fT05MWS5cXG4rICovXFxuK19fYnBmX2tmdW5jIHVuc2lnbmVkIGxvbmdcXG4rYnBmX3RyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLFxcbitcXHRcXHRcXHRcXHQgdW5zaWduZWQgbG9uZyBucl9wYWdlcyxcXG4rXFx0XFx0XFx0XFx0IGdmcF90IGdmcF9tYXNrLFxcbitcXHRcXHRcXHRcXHQgdW5zaWduZWQgaW50IHJlY2xhaW1fb3B0aW9ucyxcXG4rXFx0XFx0XFx0XFx0IGludCBzd2FwcGluZXNzKVxcbit7XFxuK1xcdGludCAqc3dhcGluZXNzX3B0cjtcXG4rXFxuK1xcdGlmIChzd2FwcGluZXNzIFxcdTAwM2UgU1dBUFBJTkVTU19BTk9OX09OTFkpXFxuK1xcdFxcdHJldHVybiAwO1xcbitcXHRlbHNlIGlmIChzd2FwcGluZXNzIFxcdTAwM2MgTUlOX1NXQVBQSU5FU1MpXFxuK1xcdFxcdHN3YXBpbmVzc19wdHIgPSBOVUxMO1xcbitcXHRlbHNlXFxuK1xcdFxcdHN3YXBpbmVzc19wdHIgPSBcXHUwMDI2c3dhcHBpbmVzcztcXG4rXFxuK1xcdHJldHVybiB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKG1lbWNnLCBucl9wYWdlcywgZ2ZwX21hc2ssXFxuK1xcdFxcdFxcdFxcdFxcdCAgICByZWNsYWltX29wdGlvbnMsIHN3YXBpbmVzc19wdHIpO1xcbit9XFxuK1xcbiBfX2JwZl9rZnVuY19lbmRfZGVmcygpO1xcbiBcXG4gQlRGX0tGVU5DU19TVEFSVChicGZfbWVtY29udHJvbF9rZnVuY3MpXFxuQEAgLTE3Miw2ICsyMjgsOCBAQCBCVEZfSURfRkxBR1MoZnVuYywgYnBmX21lbV9jZ3JvdXBfdXNhZ2UpXFxuIEJURl9JRF9GTEFHUyhmdW5jLCBicGZfbWVtX2Nncm91cF9wYWdlX3N0YXRlKVxcbiBCVEZfSURfRkxBR1MoZnVuYywgYnBmX21lbV9jZ3JvdXBfZmx1c2hfc3RhdHMsIEtGX1NMRUVQQUJMRSlcXG4gXFxuK0JURl9JRF9GTEFHUyhmdW5jLCBicGZfdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcywgS0ZfU0xFRVBBQkxFKVxcbitcXG4gQlRGX0tGVU5DU19FTkQoYnBmX21lbWNvbnRyb2xfa2Z1bmNzKVxcbiBcXG4gc3RhdGljIGNvbnN0IHN0cnVjdCBidGZfa2Z1bmNfaWRfc2V0IGJwZl9tZW1jb250cm9sX2tmdW5jX3NldCA9IHtcXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL2JwZl9leHBlcmltZW50YWwuaCBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9icGZfZXhwZXJpbWVudGFsLmhcXG5pbmRleCBmZjM3YWU1YTExM2RjLi5lYTkwNWVhNTYwM2MyIDEwMDY0NFxcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9icGZfZXhwZXJpbWVudGFsLmhcXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvYnBmX2V4cGVyaW1lbnRhbC5oXFxuQEAgLTM1MSw2ICszNTEsMTMgQEAgZXh0ZXJuIHZvaWQgYnBmX2l0ZXJfY3NzX2Rlc3Ryb3koc3RydWN0IGJwZl9pdGVyX2NzcyAqaXQpIF9fd2VhayBfX2tzeW07XFxuIGV4dGVybiBpbnQgYnBmX3dxX2luaXQoc3RydWN0IGJwZl93cSAqd3EsIHZvaWQgKnBfX21hcCwgdW5zaWduZWQgaW50IGZsYWdzKSBfX3dlYWsgX19rc3ltO1xcbiBleHRlcm4gaW50IGJwZl93cV9zdGFydChzdHJ1Y3QgYnBmX3dxICp3cSwgdW5zaWduZWQgaW50IGZsYWdzKSBfX3dlYWsgX19rc3ltO1xcbiBcXG4rc3RydWN0IGJwZl90aHJlYWRfd3E7XFxuK2V4dGVybiBpbnQgYnBmX3RocmVhZF93cV9pbml0KHN0cnVjdCBicGZfdGhyZWFkX3dxICp0d3EsIHZvaWQgKnBfX21hcCxcXG4rXFx0XFx0XFx0ICAgICAgX191NjQgY2dyb3VwX2lkLFxcbitcXHRcXHRcXHQgICAgICB1bnNpZ25lZCBpbnQgZmxhZ3MpIF9fd2VhayBfX2tzeW07XFxuK2V4dGVybiBpbnQgYnBmX3RocmVhZF93cV9zdGFydChzdHJ1Y3QgYnBmX3RocmVhZF93cSAqdHdxLFxcbitcXHRcXHRcXHQgICAgICAgdW5zaWduZWQgaW50IGZsYWdzKSBfX3dlYWsgX19rc3ltO1xcbitcXG4gc3RydWN0IGJwZl9pdGVyX2ttZW1fY2FjaGU7XFxuIGV4dGVybiBpbnQgYnBmX2l0ZXJfa21lbV9jYWNoZV9uZXcoc3RydWN0IGJwZl9pdGVyX2ttZW1fY2FjaGUgKml0KSBfX3dlYWsgX19rc3ltO1xcbiBleHRlcm4gc3RydWN0IGttZW1fY2FjaGUgKmJwZl9pdGVyX2ttZW1fY2FjaGVfbmV4dChzdHJ1Y3QgYnBmX2l0ZXJfa21lbV9jYWNoZSAqaXQpIF9fd2VhayBfX2tzeW07XFxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL21lbWNnX2FzeW5jX3JlY2xhaW0uYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL21lbWNnX2FzeW5jX3JlY2xhaW0uY1xcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uNDBhNWZlNjJjYjM4NFxcbi0tLSAvZGV2L251bGxcXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9tZW1jZ19hc3luY19yZWNsYWltLmNcXG5AQCAtMCwwICsxLDQ3OSBAQFxcbisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxcbisvKlxcbisgKiBNZW1vcnkgY29udHJvbGxlciBlQlBGIGFzeW5jIHJlY2xhaW0gdGVzdFxcbisgKi9cXG4rXFxuKyNpbmNsdWRlIFxcdTAwM2N0ZXN0X3Byb2dzLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NzeXMvbW1hbi5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjc3lzL3N0YXQuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY3N5cy90aW1lLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NzeXMvdmZzLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NzeXMvd2FpdC5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjZmNudGwuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L21hZ2ljLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2N1bmlzdGQuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY3N0ZGlvLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NzdGRsaWIuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY3N0cmluZy5oXFx1MDAzZVxcbitcXG4rI2luY2x1ZGUgXFxcImNncm91cF9oZWxwZXJzLmhcXFwiXFxuK1xcbitzdHJ1Y3QgYnBmX2FyZ3NfcyB7XFxuK1xcdHU2NCBoaWdoX2Nncm91cF9pZDtcXG4rXFx0dTY0IGxvd19jZ3JvdXBfaWQ7XFxuK1xcdHU2NCBldmVudF9kZWx0YV90aHJlc2hvbGQ7XFxuK1xcdHU2NCBjaGVja19ucztcXG4rfTtcXG4rXFxuKyNpbmNsdWRlIFxcXCJtZW1jZ19hc3luY19yZWNsYWltLnNrZWwuaFxcXCJcXG4rXFxuKyNkZWZpbmUgRklMRV9TSVpFICgzMiAqIDEwMjQgKiAxMDI0dWwpXFxuKyNkZWZpbmUgQlVGRkVSX1NJWkUgKDQwOTYpXFxuKyNkZWZpbmUgQ0dfTElNSVQgKDMyICogMTAyNCAqIDEwMjR1bClcXG4rI2RlZmluZSBSRUFEX1RJTUVTIDE2XFxuK1xcbisjZGVmaW5lIENHX0RJUiBcXFwiL21lbWNnX2FzeW5jX3JlY2xhaW1cXFwiXFxuKyNkZWZpbmUgQ0dfSElHSF9ESVIgQ0dfRElSIFxcXCIvaGlnaFxcXCJcXG4rI2RlZmluZSBDR19MT1dfRElSIENHX0RJUiBcXFwiL2xvd1xcXCJcXG4rXFxuKyNkZWZpbmUgQ0hFQ0tfUEVSSU9EX05TICgyICogMTAwMCAqIDEwMDB1bGwpXFxuKyNkZWZpbmUgRVZFTlRfREVMVEFfVEhSRVNIT0xEIDFcXG4rXFxuKy8qXFxuKyAqIFRlc3QgZmlsZXMgbXVzdCByZXNpZGUgb24gYSBmaWxlc3lzdGVtIHRoYXQgc3VwcG9ydHMgcGFnZSByZWNsYWltIHdpdGhvdXRcXG4rICogc3dhcCAoZS5nLiBleHQ0KS4gSWYgL3RtcCBpcyBvbiB0bXBmcywgdGhlIGZpbGUgcGFnZXMgYXJlIHNobWVtLWJhY2tlZFxcbisgKiBhbmQgY2FuIG9ubHkgYmUgcmVjbGFpbWVkIHRocm91Z2ggc3dhcC4gQnV0IHRoZSB0ZXN0IGRpc2FibGVzIHN3YXBcXG4rICogKG1lbW9yeS5zd2FwLm1heD0wKSwgbWFraW5nIHJlY2xhaW0gaW1wb3NzaWJsZSBhbmQgY2F1c2luZyBPT00uXFxuKyAqXFxuKyAqIFBpY2sgYSBkaXJlY3Rvcnkgb24gYSBub24tdG1wZnMgZmlsZXN5c3RlbTogdHJ5ICRUTVBESVIgZmlyc3QsIHRoZW4gL3RtcCxcXG4rICogYW5kIGZhbGwgYmFjayB0byB0aGUgY3VycmVudCBkaXJlY3RvcnkgaWYgdGhlIGNob3NlbiBwYXRoIGlzIG9uIHRtcGZzLlxcbisgKi9cXG4rc3RhdGljIGludCBnZXRfdGVzdF9kaXIoY2hhciAqYnVmLCBzaXplX3Qgc2l6ZSlcXG4re1xcbitcXHRzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGNhbmRpZGF0ZXNbXSA9IHsgXFxcIi90bXBcXFwiLCBcXFwiLlxcXCIgfTtcXG4rXFx0Y29uc3QgY2hhciAqdG1wZGlyID0gZ2V0ZW52KFxcXCJUTVBESVJcXFwiKTtcXG4rXFx0c3RydWN0IHN0YXRmcyBzZnM7XFxuK1xcdHNpemVfdCBpO1xcbitcXG4rXFx0aWYgKHRtcGRpciBcXHUwMDI2XFx1MDAyNiB0bXBkaXJbMF0gXFx1MDAyNlxcdTAwMjYgc3RhdGZzKHRtcGRpciwgXFx1MDAyNnNmcykgPT0gMCBcXHUwMDI2XFx1MDAyNlxcbitcXHQgICAgc2ZzLmZfdHlwZSAhPSBUTVBGU19NQUdJQykge1xcbitcXHRcXHRzbnByaW50ZihidWYsIHNpemUsIFxcXCIlc1xcXCIsIHRtcGRpcik7XFxuK1xcdFxcdHJldHVybiAwO1xcbitcXHR9XFxuK1xcbitcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgQVJSQVlfU0laRShjYW5kaWRhdGVzKTsgaSsrKSB7XFxuK1xcdFxcdGlmIChzdGF0ZnMoY2FuZGlkYXRlc1tpXSwgXFx1MDAyNnNmcykgPT0gMCBcXHUwMDI2XFx1MDAyNlxcbitcXHRcXHQgICAgc2ZzLmZfdHlwZSAhPSBUTVBGU19NQUdJQykge1xcbitcXHRcXHRcXHRzbnByaW50ZihidWYsIHNpemUsIFxcXCIlc1xcXCIsIGNhbmRpZGF0ZXNbaV0pO1xcbitcXHRcXHRcXHRyZXR1cm4gMDtcXG4rXFx0XFx0fVxcbitcXHR9XFxuK1xcbitcXHRyZXR1cm4gLTE7XFxuK31cXG4rXFxuK3N0YXRpYyBpbnQgc2V0dXBfaGlnaF9sb3dfY2dyb3Vwcyh1NjQgKmhpZ2hfY2dyb3VwX2lkLCB1NjQgKmxvd19jZ3JvdXBfaWQpXFxuK3tcXG4rXFx0aW50IHJldDtcXG4rXFx0Y2hhciBsaW1pdF9idWZbMjBdO1xcbitcXG4rXFx0cmV0ID0gc2V0dXBfY2dyb3VwX2Vudmlyb25tZW50KCk7XFxuK1xcdGlmICghQVNTRVJUX09LKHJldCwgXFxcInNldHVwX2Nncm91cF9lbnZpcm9ubWVudFxcXCIpKVxcbitcXHRcXHRnb3RvIGNsZWFudXA7XFxuK1xcbitcXHRyZXQgPSBjcmVhdGVfYW5kX2dldF9jZ3JvdXAoQ0dfRElSKTtcXG4rXFx0aWYgKCFBU1NFUlRfR0UocmV0LCAwLCBcXFwiY3JlYXRlX2FuZF9nZXRfY2dyb3VwIFxcXCIgQ0dfRElSKSlcXG4rXFx0XFx0Z290byBjbGVhbnVwO1xcbitcXHRjbG9zZShyZXQpO1xcbitcXG4rXFx0cmV0ID0gZW5hYmxlX2NvbnRyb2xsZXJzKENHX0RJUiwgXFxcIm1lbW9yeVxcXCIpO1xcbitcXHRpZiAoIUFTU0VSVF9PSyhyZXQsIFxcXCJlbmFibGVfY29udHJvbGxlcnNcXFwiKSlcXG4rXFx0XFx0Z290byBjbGVhbnVwO1xcbitcXG4rXFx0c25wcmludGYobGltaXRfYnVmLCBzaXplb2YobGltaXRfYnVmKSwgXFxcIiVsdVxcXCIsIENHX0xJTUlUKTtcXG4rXFx0cmV0ID0gd3JpdGVfY2dyb3VwX2ZpbGUoQ0dfRElSLCBcXFwibWVtb3J5Lm1heFxcXCIsIGxpbWl0X2J1Zik7XFxuK1xcdGlmICghQVNTRVJUX09LKHJldCwgXFxcIndyaXRlX2Nncm91cF9maWxlIG1lbW9yeS5tYXhcXFwiKSlcXG4rXFx0XFx0Z290byBjbGVhbnVwO1xcbitcXG4rXFx0cmV0ID0gd3JpdGVfY2dyb3VwX2ZpbGUoQ0dfRElSLCBcXFwibWVtb3J5LnN3YXAubWF4XFxcIiwgXFxcIjBcXFwiKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0socmV0LCBcXFwid3JpdGVfY2dyb3VwX2ZpbGUgbWVtb3J5LnN3YXAubWF4XFxcIikpXFxuK1xcdFxcdGdvdG8gY2xlYW51cDtcXG4rXFxuK1xcdHJldCA9IGNyZWF0ZV9hbmRfZ2V0X2Nncm91cChDR19ISUdIX0RJUik7XFxuK1xcdGlmICghQVNTRVJUX0dFKHJldCwgMCwgXFxcImNyZWF0ZV9hbmRfZ2V0X2Nncm91cCBcXFwiIENHX0hJR0hfRElSKSlcXG4rXFx0XFx0Z290byBjbGVhbnVwO1xcbitcXHRjbG9zZShyZXQpO1xcbitcXG4rXFx0KmhpZ2hfY2dyb3VwX2lkID0gZ2V0X2Nncm91cF9pZChDR19ISUdIX0RJUik7XFxuK1xcdGlmICghQVNTRVJUX0dUKCpoaWdoX2Nncm91cF9pZCwgMCwgXFxcImdldF9jZ3JvdXBfaWRcXFwiKSlcXG4rXFx0XFx0Z290byBjbGVhbnVwO1xcbitcXG4rXFx0cmV0ID0gY3JlYXRlX2FuZF9nZXRfY2dyb3VwKENHX0xPV19ESVIpO1xcbitcXHRpZiAoIUFTU0VSVF9HRShyZXQsIDAsIFxcXCJjcmVhdGVfYW5kX2dldF9jZ3JvdXAgXFxcIiBDR19MT1dfRElSKSlcXG4rXFx0XFx0Z290byBjbGVhbnVwO1xcbitcXHRjbG9zZShyZXQpO1xcbitcXG4rXFx0Kmxvd19jZ3JvdXBfaWQgPSBnZXRfY2dyb3VwX2lkKENHX0xPV19ESVIpO1xcbitcXHRpZiAoIUFTU0VSVF9HVCgqaGlnaF9jZ3JvdXBfaWQsIDAsIFxcXCJnZXRfY2dyb3VwX2lkXFxcIikpXFxuK1xcdFxcdGdvdG8gY2xlYW51cDtcXG4rXFxuK1xcdHJldHVybiAwO1xcbitcXG4rY2xlYW51cDpcXG4rXFx0Y2xlYW51cF9jZ3JvdXBfZW52aXJvbm1lbnQoKTtcXG4rXFx0cmV0dXJuIC0xO1xcbit9XFxuK1xcbitzdGF0aWMgaW50IHdyaXRlX2ZpbGUoY29uc3QgY2hhciAqZmlsZW5hbWUpXFxuK3tcXG4rXFx0aW50IHJldCA9IC0xO1xcbitcXHRzaXplX3Qgd3JpdHRlbiA9IDA7XFxuK1xcdGNoYXIgKmJ1ZmZlcjtcXG4rXFx0RklMRSAqZnA7XFxuK1xcbitcXHRmcCA9IGZvcGVuKGZpbGVuYW1lLCBcXFwid2JcXFwiKTtcXG4rXFx0aWYgKCFmcClcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcbitcXHRidWZmZXIgPSBtYWxsb2MoQlVGRkVSX1NJWkUpO1xcbitcXHRpZiAoIWJ1ZmZlcilcXG4rXFx0XFx0Z290byBjbGVhbnVwX2ZwO1xcbitcXG4rXFx0bWVtc2V0KGJ1ZmZlciwgJ0EnLCBCVUZGRVJfU0laRSk7XFxuK1xcbitcXHR3aGlsZSAod3JpdHRlbiBcXHUwMDNjIEZJTEVfU0laRSkge1xcbitcXHRcXHRzaXplX3QgdG9fd3JpdGUgPSBGSUxFX1NJWkUgLSB3cml0dGVuIFxcdTAwM2MgQlVGRkVSX1NJWkUgP1xcbitcXHRcXHRcXHRcXHQgIEZJTEVfU0laRSAtIHdyaXR0ZW4gOiBCVUZGRVJfU0laRTtcXG4rXFxuK1xcdFxcdGlmIChmd3JpdGUoYnVmZmVyLCAxLCB0b193cml0ZSwgZnApICE9IHRvX3dyaXRlKVxcbitcXHRcXHRcXHRnb3RvIGNsZWFudXA7XFxuK1xcdFxcdHdyaXR0ZW4gKz0gdG9fd3JpdGU7XFxuK1xcdH1cXG4rXFxuK1xcdHJldCA9IDA7XFxuK2NsZWFudXA6XFxuK1xcdGZyZWUoYnVmZmVyKTtcXG4rY2xlYW51cF9mcDpcXG4rXFx0ZmNsb3NlKGZwKTtcXG4rb3V0OlxcbitcXHRyZXR1cm4gcmV0O1xcbit9XFxuK1xcbitzdGF0aWMgaW50IHJlYWRfZmlsZShjb25zdCBjaGFyICpmaWxlbmFtZSwgaW50IGl0ZXJhdGlvbnMpXFxuK3tcXG4rXFx0aW50IHJldCA9IC0xO1xcbitcXHRsb25nIHBhZ2Vfc2l6ZSA9IHN5c2NvbmYoX1NDX1BBR0VTSVpFKTtcXG4rXFx0Y2hhciAqbWFwO1xcbitcXHRzaXplX3QgaTtcXG4rXFx0aW50IGZkO1xcbitcXHRzdHJ1Y3Qgc3RhdCBzYjtcXG4rXFxuK1xcdGZkID0gb3BlbihmaWxlbmFtZSwgT19SRE9OTFkpO1xcbitcXHRpZiAoZmQgPT0gLTEpXFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXG4rXFx0aWYgKGZzdGF0KGZkLCBcXHUwMDI2c2IpID09IC0xKVxcbitcXHRcXHRnb3RvIGNsZWFudXBfZmQ7XFxuK1xcbitcXHRpZiAoc2Iuc3Rfc2l6ZSAhPSBGSUxFX1NJWkUpIHtcXG4rXFx0XFx0ZnByaW50ZihzdGRlcnIsIFxcXCJGaWxlIHNpemUgbWlzbWF0Y2g6IGV4cGVjdGVkICVsdSwgZ290ICVsdVxcXFxuXFxcIixcXG4rXFx0XFx0XFx0KHVuc2lnbmVkIGxvbmcpRklMRV9TSVpFLCAodW5zaWduZWQgbG9uZylzYi5zdF9zaXplKTtcXG4rXFx0XFx0Z290byBjbGVhbnVwX2ZkO1xcbitcXHR9XFxuK1xcbitcXHRtYXAgPSBtbWFwKE5VTEwsIEZJTEVfU0laRSwgUFJPVF9SRUFELCBNQVBfUFJJVkFURSwgZmQsIDApO1xcbitcXHRpZiAobWFwID09IE1BUF9GQUlMRUQpXFxuK1xcdFxcdGdvdG8gY2xlYW51cF9mZDtcXG4rXFxuK1xcdGZvciAoaW50IGl0ZXIgPSAwOyBpdGVyIFxcdTAwM2MgaXRlcmF0aW9uczsgaXRlcisrKSB7XFxuK1xcdFxcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBGSUxFX1NJWkU7IGkgKz0gcGFnZV9zaXplKSB7XFxuK1xcdFxcdFxcdC8qIGFjY2VzcyBhIGJ5dGUgdG8gdHJpZ2dlciBwYWdlIGZhdWx0ICovXFxuK1xcdFxcdFxcdGFzbSB2b2xhdGlsZShcXFwiXFxcIiA6OiBcXFwiclxcXCIobWFwW2ldKSA6IFxcXCJtZW1vcnlcXFwiKTtcXG4rXFx0XFx0fVxcbitcXHR9XFxuK1xcbitcXHRpZiAobXVubWFwKG1hcCwgRklMRV9TSVpFKSA9PSAtMSlcXG4rXFx0XFx0Z290byBjbGVhbnVwX2ZkO1xcbitcXG4rXFx0cmV0ID0gMDtcXG4rXFxuK2NsZWFudXBfZmQ6XFxuK1xcdGNsb3NlKGZkKTtcXG4rb3V0OlxcbitcXHRyZXR1cm4gcmV0O1xcbit9XFxuK1xcbitzdGF0aWMgaW50IHJlYWxfdGVzdF9jaGlsZF93b3JrKGNvbnN0IGNoYXIgKmNncm91cF9wYXRoLCBjaGFyICpkYXRhX2ZpbGVuYW1lLFxcbitcXHRcXHRcXHRcXHRjaGFyICp0aW1lX2ZpbGVuYW1lLCBpbnQgcmVhZF90aW1lcylcXG4re1xcbitcXHRzdHJ1Y3QgdGltZXZhbCBzdGFydCwgZW5kO1xcbitcXHRkb3VibGUgZWxhcHNlZDtcXG4rXFx0RklMRSAqZnA7XFxuK1xcbitcXHRpZiAoIUFTU0VSVF9PSyhqb2luX3BhcmVudF9jZ3JvdXAoY2dyb3VwX3BhdGgpLCBcXFwiam9pbl9wYXJlbnRfY2dyb3VwXFxcIikpXFxuK1xcdFxcdHJldHVybiAtMTtcXG4rXFxuK1xcdGdldHRpbWVvZmRheShcXHUwMDI2c3RhcnQsIE5VTEwpO1xcbitcXG4rXFx0aWYgKCFBU1NFUlRfT0sod3JpdGVfZmlsZShkYXRhX2ZpbGVuYW1lKSwgXFxcIndyaXRlX2ZpbGVcXFwiKSlcXG4rXFx0XFx0cmV0dXJuIC0xO1xcbitcXG4rXFx0aWYgKCFBU1NFUlRfT0socmVhZF9maWxlKGRhdGFfZmlsZW5hbWUsIHJlYWRfdGltZXMpLCBcXFwicmVhZF9maWxlXFxcIikpXFxuK1xcdFxcdHJldHVybiAtMTtcXG4rXFxuK1xcdGdldHRpbWVvZmRheShcXHUwMDI2ZW5kLCBOVUxMKTtcXG4rXFxuK1xcdGlmICghdGltZV9maWxlbmFtZSlcXG4rXFx0XFx0cmV0dXJuIDA7XFxuK1xcbitcXHRlbGFwc2VkID0gKGVuZC50dl9zZWMgLSBzdGFydC50dl9zZWMpICtcXG4rXFx0XFx0ICAoZW5kLnR2X3VzZWMgLSBzdGFydC50dl91c2VjKSAvIDEwMDAwMDAuMDtcXG4rXFx0cHJpbnRmKFxcXCIlLjZmXFxcXG5cXFwiLCBlbGFwc2VkKTtcXG4rXFxuK1xcdGZwID0gZm9wZW4odGltZV9maWxlbmFtZSwgXFxcIndcXFwiKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0tfUFRSKGZwLCBcXFwiZm9wZW5cXFwiKSlcXG4rXFx0XFx0cmV0dXJuIC0xO1xcbitcXHRmcHJpbnRmKGZwLCBcXFwiJS42ZlxcXCIsIGVsYXBzZWQpO1xcbitcXHRmY2xvc2UoZnApO1xcbitcXG4rXFx0cmV0dXJuIDA7XFxuK31cXG4rXFxuK3N0YXRpYyBpbnQgZ2V0X3RpbWUoY2hhciAqdGltZV9maWxlbmFtZSwgZG91YmxlICp0aW1lKVxcbit7XFxuK1xcdGludCByZXQgPSAtMTtcXG4rXFx0RklMRSAqZnA7XFxuK1xcdGNoYXIgYnVmWzY0XTtcXG4rXFxuK1xcdGZwID0gZm9wZW4odGltZV9maWxlbmFtZSwgXFxcInJcXFwiKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0tfUFRSKGZwLCBcXFwiZm9wZW5cXFwiKSlcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcbitcXHRpZiAoIUFTU0VSVF9PS19QVFIoZmdldHMoYnVmLCBzaXplb2YoYnVmKSwgZnApLCBcXFwiZmdldHNcXFwiKSlcXG4rXFx0XFx0Z290byBjbGVhbnVwO1xcbitcXG4rXFx0aWYgKHNzY2FuZihidWYsIFxcXCIlbGZcXFwiLCB0aW1lKSAhPSAxKSB7XFxuK1xcdFxcdFBSSU5UX0ZBSUwoXFxcInNzY2FuZiAlc1xcXCIsIGJ1Zik7XFxuK1xcdFxcdGdvdG8gY2xlYW51cDtcXG4rXFx0fVxcbitcXG4rXFx0cmV0ID0gMDtcXG4rY2xlYW51cDpcXG4rXFx0ZmNsb3NlKGZwKTtcXG4rb3V0OlxcbitcXHRyZXR1cm4gcmV0O1xcbit9XFxuK1xcbitzdGF0aWMgaW50XFxuK3J1bl9oaWdoX2xvd193b3JrbG9hZChkb3VibGUgKmhpZ2hfZWxhcHNlZCwgZG91YmxlICpsb3dfZWxhcHNlZCwgaW50IHJlYWRfdGltZXMpXFxuK3tcXG4rXFx0Y2hhciB0ZXN0X2RpcltQQVRIX01BWF0sIGhpZ2hfZGF0YV9maWxlW1BBVEhfTUFYXSwgbG93X2RhdGFfZmlsZVtQQVRIX01BWF07XFxuK1xcdGNoYXIgaGlnaF90aW1lX2ZpbGVbUEFUSF9NQVhdLCBsb3dfdGltZV9maWxlW1BBVEhfTUFYXTtcXG4rXFx0aW50IHJldCwgZmQ7XFxuK1xcdHBpZF90IGhpZ2hfcGlkLCBsb3dfcGlkO1xcbitcXHRpbnQgc3RhdHVzO1xcbitcXG4rXFx0cmV0ID0gZ2V0X3Rlc3RfZGlyKHRlc3RfZGlyLCBzaXplb2YodGVzdF9kaXIpKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0socmV0LCBcXFwiZ2V0X3Rlc3RfZGlyOiBubyBub24tdG1wZnMgZGlyZWN0b3J5IGZvdW5kXFxcIikpXFxuK1xcdFxcdHJldHVybiAtMTtcXG4rXFxuK1xcdGZkID0gc25wcmludGYoaGlnaF9kYXRhX2ZpbGUsIHNpemVvZihoaWdoX2RhdGFfZmlsZSksXFxuK1xcdFxcdCAgICAgIFxcXCIlcy9tZW1jZ19hc3luY19oaWdoX2RhdGFfWFhYWFhYXFxcIiwgdGVzdF9kaXIpO1xcbitcXHRpZiAoIUFTU0VSVF9MVChmZCwgc2l6ZW9mKGhpZ2hfZGF0YV9maWxlKSwgXFxcImhpZ2hfZGF0YV9maWxlIHBhdGhcXFwiKSlcXG4rXFx0XFx0cmV0dXJuIC0xO1xcbitcXG4rXFx0ZmQgPSBzbnByaW50Zihsb3dfZGF0YV9maWxlLCBzaXplb2YobG93X2RhdGFfZmlsZSksXFxuK1xcdFxcdCAgICAgIFxcXCIlcy9tZW1jZ19hc3luY19sb3dfZGF0YV9YWFhYWFhcXFwiLCB0ZXN0X2Rpcik7XFxuK1xcdGlmICghQVNTRVJUX0xUKGZkLCBzaXplb2YobG93X2RhdGFfZmlsZSksIFxcXCJsb3dfZGF0YV9maWxlIHBhdGhcXFwiKSlcXG4rXFx0XFx0cmV0dXJuIC0xO1xcbitcXG4rXFx0ZmQgPSBzbnByaW50ZihoaWdoX3RpbWVfZmlsZSwgc2l6ZW9mKGhpZ2hfdGltZV9maWxlKSxcXG4rXFx0XFx0ICAgICAgXFxcIiVzL21lbWNnX2FzeW5jX2hpZ2hfdGltZV9YWFhYWFhcXFwiLCB0ZXN0X2Rpcik7XFxuK1xcdGlmICghQVNTRVJUX0xUKGZkLCBzaXplb2YoaGlnaF90aW1lX2ZpbGUpLCBcXFwiaGlnaF90aW1lX2ZpbGUgcGF0aFxcXCIpKVxcbitcXHRcXHRyZXR1cm4gLTE7XFxuK1xcbitcXHRmZCA9IHNucHJpbnRmKGxvd190aW1lX2ZpbGUsIHNpemVvZihsb3dfdGltZV9maWxlKSxcXG4rXFx0XFx0ICAgICAgXFxcIiVzL21lbWNnX2FzeW5jX2xvd190aW1lX1hYWFhYWFxcXCIsIHRlc3RfZGlyKTtcXG4rXFx0aWYgKCFBU1NFUlRfTFQoZmQsIHNpemVvZihsb3dfdGltZV9maWxlKSwgXFxcImxvd190aW1lX2ZpbGUgcGF0aFxcXCIpKVxcbitcXHRcXHRyZXR1cm4gLTE7XFxuK1xcbitcXHRmZCA9IG1rc3RlbXAoaGlnaF9kYXRhX2ZpbGUpO1xcbitcXHRpZiAoIUFTU0VSVF9HRShmZCwgMCwgXFxcIm1rc3RlbXBcXFwiKSlcXG4rXFx0XFx0cmV0dXJuIC0xO1xcbitcXHRjbG9zZShmZCk7XFxuK1xcbitcXHRmZCA9IG1rc3RlbXAobG93X2RhdGFfZmlsZSk7XFxuK1xcdGlmICghQVNTRVJUX0dFKGZkLCAwLCBcXFwibWtzdGVtcFxcXCIpKVxcbitcXHRcXHRnb3RvIGNsZWFudXBfaGlnaF9kYXRhO1xcbitcXHRjbG9zZShmZCk7XFxuK1xcbitcXHRmZCA9IG1rc3RlbXAoaGlnaF90aW1lX2ZpbGUpO1xcbitcXHRpZiAoIUFTU0VSVF9HRShmZCwgMCwgXFxcIm1rc3RlbXBcXFwiKSlcXG4rXFx0XFx0Z290byBjbGVhbnVwX2xvd19kYXRhO1xcbitcXHRjbG9zZShmZCk7XFxuK1xcbitcXHRmZCA9IG1rc3RlbXAobG93X3RpbWVfZmlsZSk7XFxuK1xcdGlmICghQVNTRVJUX0dFKGZkLCAwLCBcXFwibWtzdGVtcFxcXCIpKVxcbitcXHRcXHRnb3RvIGNsZWFudXBfaGlnaF90aW1lO1xcbitcXHRjbG9zZShmZCk7XFxuK1xcbitcXHRsb3dfcGlkID0gZm9yaygpO1xcbitcXHRpZiAoIUFTU0VSVF9HRShsb3dfcGlkLCAwLCBcXFwiZm9yayBsb3dcXFwiKSlcXG4rXFx0XFx0Z290byBjbGVhbnVwX2xvd190aW1lO1xcbitcXHRpZiAobG93X3BpZCA9PSAwKVxcbitcXHRcXHRleGl0KHJlYWxfdGVzdF9jaGlsZF93b3JrKENHX0xPV19ESVIsIGxvd19kYXRhX2ZpbGUsXFxuK1xcdFxcdFxcdFxcdFxcdCAgbG93X3RpbWVfZmlsZSwgcmVhZF90aW1lcykpO1xcbitcXG4rXFx0aGlnaF9waWQgPSBmb3JrKCk7XFxuK1xcdGlmICghQVNTRVJUX0dFKGhpZ2hfcGlkLCAwLCBcXFwiZm9yayBoaWdoXFxcIikpIHtcXG4rXFx0XFx0KHZvaWQpd2FpdHBpZChsb3dfcGlkLCBOVUxMLCAwKTtcXG4rXFx0XFx0Z290byBjbGVhbnVwX2xvd190aW1lO1xcbitcXHR9XFxuK1xcdGlmIChoaWdoX3BpZCA9PSAwKVxcbitcXHRcXHRleGl0KHJlYWxfdGVzdF9jaGlsZF93b3JrKENHX0hJR0hfRElSLCBoaWdoX2RhdGFfZmlsZSxcXG4rXFx0XFx0XFx0XFx0XFx0ICBoaWdoX3RpbWVfZmlsZSwgcmVhZF90aW1lcykpO1xcbitcXG4rXFx0cmV0ID0gd2FpdHBpZChsb3dfcGlkLCBcXHUwMDI2c3RhdHVzLCAwKTtcXG4rXFx0aWYgKCFBU1NFUlRfR1QocmV0LCAwLCBcXFwibG93IHdhaXRwaWRcXFwiKSlcXG4rXFx0XFx0Z290byBjbGVhbnVwX2xvd190aW1lO1xcbitcXHRpZiAoIUFTU0VSVF9UUlVFKFdJRkVYSVRFRChzdGF0dXMpLCBcXFwibG93IGV4aXRlZFxcXCIpKVxcbitcXHRcXHRnb3RvIGNsZWFudXBfbG93X3RpbWU7XFxuK1xcdGlmICghQVNTRVJUX0VRKFdFWElUU1RBVFVTKHN0YXR1cyksIDAsIFxcXCJsb3cgZXhpdCBzdGF0dXNcXFwiKSlcXG4rXFx0XFx0Z290byBjbGVhbnVwX2xvd190aW1lO1xcbitcXG4rXFx0cmV0ID0gd2FpdHBpZChoaWdoX3BpZCwgXFx1MDAyNnN0YXR1cywgMCk7XFxuK1xcdGlmICghQVNTRVJUX0dUKHJldCwgMCwgXFxcImhpZ2ggd2FpdHBpZFxcXCIpKVxcbitcXHRcXHRnb3RvIGNsZWFudXBfbG93X3RpbWU7XFxuK1xcdGlmICghQVNTRVJUX1RSVUUoV0lGRVhJVEVEKHN0YXR1cyksIFxcXCJoaWdoIGV4aXRlZFxcXCIpKVxcbitcXHRcXHRnb3RvIGNsZWFudXBfbG93X3RpbWU7XFxuK1xcdGlmICghQVNTRVJUX0VRKFdFWElUU1RBVFVTKHN0YXR1cyksIDAsIFxcXCJoaWdoIGV4aXQgc3RhdHVzXFxcIikpXFxuK1xcdFxcdGdvdG8gY2xlYW51cF9sb3dfdGltZTtcXG4rXFxuK1xcdGlmIChnZXRfdGltZShoaWdoX3RpbWVfZmlsZSwgaGlnaF9lbGFwc2VkKSlcXG4rXFx0XFx0Z290byBjbGVhbnVwX2xvd190aW1lO1xcbitcXHRpZiAoZ2V0X3RpbWUobG93X3RpbWVfZmlsZSwgbG93X2VsYXBzZWQpKVxcbitcXHRcXHRnb3RvIGNsZWFudXBfbG93X3RpbWU7XFxuK1xcbitcXHRyZXQgPSAwO1xcbitcXG4rY2xlYW51cF9sb3dfdGltZTpcXG4rXFx0dW5saW5rKGxvd190aW1lX2ZpbGUpO1xcbitjbGVhbnVwX2hpZ2hfdGltZTpcXG4rXFx0dW5saW5rKGhpZ2hfdGltZV9maWxlKTtcXG4rY2xlYW51cF9sb3dfZGF0YTpcXG4rXFx0dW5saW5rKGxvd19kYXRhX2ZpbGUpO1xcbitjbGVhbnVwX2hpZ2hfZGF0YTpcXG4rXFx0dW5saW5rKGhpZ2hfZGF0YV9maWxlKTtcXG4rXFx0cmV0dXJuIHJldDtcXG4rfVxcbitcXG4rc3RhdGljIGludFxcbitzZXR1cF9icGYodTY0IGhpZ2hfY2dyb3VwX2lkLCB1NjQgbG93X2Nncm91cF9pZCxcXG4rXFx0ICBzdHJ1Y3QgbWVtY2dfYXN5bmNfcmVjbGFpbSAqKnNrZWxfcHRyLCBib29sIHVzZV90aHJlYWRfd3EpXFxuK3tcXG4rXFx0c3RydWN0IG1lbWNnX2FzeW5jX3JlY2xhaW0gKnNrZWw7XFxuK1xcdHN0cnVjdCBicGZfYXJnc19zIGJwZl9hcmdzID0ge1xcbitcXHRcXHQuaGlnaF9jZ3JvdXBfaWQgPSBoaWdoX2Nncm91cF9pZCxcXG4rXFx0XFx0Lmxvd19jZ3JvdXBfaWQgPSBsb3dfY2dyb3VwX2lkLFxcbitcXHRcXHQuZXZlbnRfZGVsdGFfdGhyZXNob2xkID0gRVZFTlRfREVMVEFfVEhSRVNIT0xELFxcbitcXHRcXHQuY2hlY2tfbnMgPSBDSEVDS19QRVJJT0RfTlMsXFxuK1xcdH07XFxuK1xcdExJQkJQRl9PUFRTKGJwZl90ZXN0X3J1bl9vcHRzLCBydW5fb3B0cyxcXG4rXFx0XFx0LmN0eF9pbiA9IFxcdTAwMjZicGZfYXJncyxcXG4rXFx0XFx0LmN0eF9zaXplX2luID0gc2l6ZW9mKGJwZl9hcmdzKSk7XFxuK1xcdGludCBwcm9nX2luaXRfZmQsIGVycjtcXG4rXFxuK1xcdHNrZWwgPSBtZW1jZ19hc3luY19yZWNsYWltX19vcGVuX2FuZF9sb2FkKCk7XFxuK1xcdGlmICghQVNTRVJUX09LX1BUUihza2VsLCBcXFwibWVtY2dfYXN5bmNfcmVjbGFpbV9fb3Blbl9hbmRfbG9hZFxcXCIpKVxcbitcXHRcXHRyZXR1cm4gLTE7XFxuK1xcbitcXHRpZiAodXNlX3RocmVhZF93cSlcXG4rXFx0XFx0cHJvZ19pbml0X2ZkID0gYnBmX3Byb2dyYW1fX2ZkKHNrZWwtXFx1MDAzZXByb2dzLnRocmVhZF93cV9wcm9nX2luaXQpO1xcbitcXHRlbHNlXFxuK1xcdFxcdHByb2dfaW5pdF9mZCA9IGJwZl9wcm9ncmFtX19mZChza2VsLVxcdTAwM2Vwcm9ncy53cV9wcm9nX2luaXQpO1xcbitcXHRpZiAoIUFTU0VSVF9HRShwcm9nX2luaXRfZmQsIDAsIFxcXCJicGZfcHJvZ3JhbV9fZmRcXFwiKSlcXG4rXFx0XFx0Z290byBlcnJvcl9vdXQ7XFxuK1xcbitcXHRlcnIgPSBicGZfcHJvZ190ZXN0X3J1bl9vcHRzKHByb2dfaW5pdF9mZCwgXFx1MDAyNnJ1bl9vcHRzKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0soZXJyLCBcXFwiYnBmX3Byb2dfdGVzdF9ydW5fb3B0c1xcXCIpKVxcbitcXHRcXHRnb3RvIGVycm9yX291dDtcXG4rXFx0aWYgKCFBU1NFUlRfRVEocnVuX29wdHMucmV0dmFsLCAwLCBcXFwicHJvZ19pbml0IHJldHZhbFxcXCIpKVxcbitcXHRcXHRnb3RvIGVycm9yX291dDtcXG4rXFxuK1xcdCpza2VsX3B0ciA9IHNrZWw7XFxuK1xcdHJldHVybiAwO1xcbitcXG4rZXJyb3Jfb3V0OlxcbitcXHRtZW1jZ19hc3luY19yZWNsYWltX19kZXN0cm95KHNrZWwpO1xcbitcXHRyZXR1cm4gLTE7XFxuK31cXG4rXFxuK3ZvaWQgdGVzdF9tZW1jZ193cV9hc3luY19yZWNsYWltKHZvaWQpXFxuK3tcXG4rXFx0dTY0IGhpZ2hfY2dyb3VwX2lkLCBsb3dfY2dyb3VwX2lkO1xcbitcXHRpbnQgZXJyO1xcbitcXHRkb3VibGUgaGlnaF90aW1lID0gMC4wLCBsb3dfdGltZSA9IDAuMDtcXG4rXFx0c3RydWN0IG1lbWNnX2FzeW5jX3JlY2xhaW0gKnNrZWwgPSBOVUxMO1xcbitcXG4rXFx0ZXJyID0gc2V0dXBfaGlnaF9sb3dfY2dyb3VwcyhcXHUwMDI2aGlnaF9jZ3JvdXBfaWQsIFxcdTAwMjZsb3dfY2dyb3VwX2lkKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0soZXJyLCBcXFwic2V0dXBfaGlnaF9sb3dfY2dyb3VwcyByZWNsYWltXFxcIikpXFxuK1xcdFxcdHJldHVybjtcXG4rXFxuK1xcdGVyciA9IHNldHVwX2JwZihoaWdoX2Nncm91cF9pZCwgbG93X2Nncm91cF9pZCwgXFx1MDAyNnNrZWwsIGZhbHNlKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0soZXJyLCBcXFwic2V0dXBfYnBmXFxcIikpXFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXG4rXFx0ZXJyID0gcnVuX2hpZ2hfbG93X3dvcmtsb2FkKFxcdTAwMjZoaWdoX3RpbWUsIFxcdTAwMjZsb3dfdGltZSwgUkVBRF9USU1FUyk7XFxuK1xcdGlmICghQVNTRVJUX09LKGVyciwgXFxcInJ1bl9oaWdoX2xvd193b3JrbG9hZCByZWNsYWltXFxcIikpXFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXG4rXFx0aWYgKGhpZ2hfdGltZSBcXHUwMDNlPSBsb3dfdGltZSkge1xcbitcXHRcXHRQUklOVF9GQUlMKFxcXCJoaWdoIGNncm91cCBub3QgaW1wcm92ZWQgd2l0aCBhc3luYyByZWNsYWltOiBoaWdoX3RpbWU9JWYgbG93X3RpbWU9JWZcXFwiLFxcbitcXHRcXHRcXHQgICBoaWdoX3RpbWUsIGxvd190aW1lKTtcXG4rXFx0fVxcbitcXG4rb3V0OlxcbitcXHRpZiAoc2tlbClcXG4rXFx0XFx0bWVtY2dfYXN5bmNfcmVjbGFpbV9fZGVzdHJveShza2VsKTtcXG4rXFx0LypcXG4rXFx0ICogV2FpdCBmb3IgYnBmX3dxIHRvIHJlbGVhc2UgdGhlIHJlZmVyZW5jZSB0byBjZ3JvdXBcXG4rXFx0ICogdG8gZW5zdXJlIHRoZSBzdWNjZXNzZnVsIGRlbGV0aW9uIG9mIGNncm91cC5cXG4rXFx0ICovXFxuK1xcdHNsZWVwKDEpO1xcbitcXHRjbGVhbnVwX2Nncm91cF9lbnZpcm9ubWVudCgpO1xcbit9XFxuK1xcbit2b2lkIHRlc3RfbWVtY2dfdGhyZWFkX3dxX2FzeW5jX3JlY2xhaW0odm9pZClcXG4re1xcbitcXHR1NjQgaGlnaF9jZ3JvdXBfaWQsIGxvd19jZ3JvdXBfaWQ7XFxuK1xcdGludCBlcnI7XFxuK1xcdGRvdWJsZSBoaWdoX3RpbWUgPSAwLjAsIGxvd190aW1lID0gMC4wO1xcbitcXHRzdHJ1Y3QgbWVtY2dfYXN5bmNfcmVjbGFpbSAqc2tlbCA9IE5VTEw7XFxuK1xcbitcXHRlcnIgPSBzZXR1cF9oaWdoX2xvd19jZ3JvdXBzKFxcdTAwMjZoaWdoX2Nncm91cF9pZCwgXFx1MDAyNmxvd19jZ3JvdXBfaWQpO1xcbitcXHRpZiAoIUFTU0VSVF9PSyhlcnIsIFxcXCJzZXR1cF9oaWdoX2xvd19jZ3JvdXBzIHJlY2xhaW1cXFwiKSlcXG4rXFx0XFx0cmV0dXJuO1xcbitcXG4rXFx0ZXJyID0gc2V0dXBfYnBmKGhpZ2hfY2dyb3VwX2lkLCBsb3dfY2dyb3VwX2lkLCBcXHUwMDI2c2tlbCwgdHJ1ZSk7XFxuK1xcdGlmICghQVNTRVJUX09LKGVyciwgXFxcInNldHVwX2JwZlxcXCIpKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFxuK1xcdGVyciA9IHJ1bl9oaWdoX2xvd193b3JrbG9hZChcXHUwMDI2aGlnaF90aW1lLCBcXHUwMDI2bG93X3RpbWUsIFJFQURfVElNRVMpO1xcbitcXHRpZiAoIUFTU0VSVF9PSyhlcnIsIFxcXCJydW5faGlnaF9sb3dfd29ya2xvYWQgcmVjbGFpbVxcXCIpKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFxuK1xcdGlmIChoaWdoX3RpbWUgXFx1MDAzZT0gbG93X3RpbWUpIHtcXG4rXFx0XFx0UFJJTlRfRkFJTChcXFwiaGlnaCBjZ3JvdXAgbm90IGltcHJvdmVkIHdpdGggYXN5bmMgcmVjbGFpbTogaGlnaF90aW1lPSVmIGxvd190aW1lPSVmXFxcIixcXG4rXFx0XFx0XFx0ICAgaGlnaF90aW1lLCBsb3dfdGltZSk7XFxuK1xcdH1cXG4rXFxuK291dDpcXG4rXFx0aWYgKHNrZWwpXFxuK1xcdFxcdG1lbWNnX2FzeW5jX3JlY2xhaW1fX2Rlc3Ryb3koc2tlbCk7XFxuK1xcdC8qXFxuK1xcdCAqIFdhaXQgZm9yIGJwZl90aHJlYWRfd3EgdG8gcmVsZWFzZSB0aGUgcmVmZXJlbmNlIHRvIGNncm91cFxcbitcXHQgKiB0byBlbnN1cmUgdGhlIHN1Y2Nlc3NmdWwgZGVsZXRpb24gb2YgY2dyb3VwLlxcbitcXHQgKi9cXG4rXFx0c2xlZXAoMSk7XFxuK1xcdGNsZWFudXBfY2dyb3VwX2Vudmlyb25tZW50KCk7XFxuK31cXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvdGhyZWFkX3dxX2Nncm91cC5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvdGhyZWFkX3dxX2Nncm91cC5jXFxubmV3IGZpbGUgbW9kZSAxMDA2NDRcXG5pbmRleCAwMDAwMDAwMDAwMDAwLi43NTM3YjAzZjE3ZTJhXFxuLS0tIC9kZXYvbnVsbFxcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL3RocmVhZF93cV9jZ3JvdXAuY1xcbkBAIC0wLDAgKzEsODcgQEBcXG4rLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcXG4rI2luY2x1ZGUgXFx1MDAzY3Rlc3RfcHJvZ3MuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY3VuaXN0ZC5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXFwiY2dyb3VwX2hlbHBlcnMuaFxcXCJcXG4rI2luY2x1ZGUgXFxcInRocmVhZF93cV9jZ3JvdXAuc2tlbC5oXFxcIlxcbitcXG4rI2RlZmluZSBURVNUX0NHUk9VUCBcXFwiL3RocmVhZF93cV90ZXN0XFxcIlxcbisjZGVmaW5lIFdBSVRfVElNRU9VVF9TRUNTIDMwXFxuK1xcbit2b2lkIHRlc3RfdGhyZWFkX3dxX2Nncm91cCh2b2lkKVxcbit7XFxuK1xcdHN0cnVjdCB0aHJlYWRfd3FfY2dyb3VwICpza2VsID0gTlVMTDtcXG4rXFx0aW50IGVyciwgcHJvZ19mZCwgY2dfZmQgPSAtMTtcXG4rXFx0dW5zaWduZWQgbG9uZyBsb25nIGNnX2lkO1xcbitcXHRpbnQgd2FpdGVkX3NlY3M7XFxuK1xcbitcXHRMSUJCUEZfT1BUUyhicGZfdGVzdF9ydW5fb3B0cywgdG9wdHMpO1xcbitcXG4rXFx0ZXJyID0gc2V0dXBfY2dyb3VwX2Vudmlyb25tZW50KCk7XFxuK1xcdGlmICghQVNTRVJUX09LKGVyciwgXFxcInNldHVwX2Nncm91cF9lbnZpcm9ubWVudFxcXCIpKVxcbitcXHRcXHRyZXR1cm47XFxuK1xcdGNnX2ZkID0gY3JlYXRlX2FuZF9nZXRfY2dyb3VwKFRFU1RfQ0dST1VQKTtcXG4rXFx0aWYgKCFBU1NFUlRfR0UoY2dfZmQsIDAsIFxcXCJjcmVhdGVfYW5kX2dldF9jZ3JvdXBcXFwiKSlcXG4rXFx0XFx0Z290byBjbGVhbnVwO1xcbitcXHRjZ19pZCA9IGdldF9jZ3JvdXBfaWQoVEVTVF9DR1JPVVApO1xcbitcXHRpZiAoIUFTU0VSVF9HVChjZ19pZCwgMFVMTCwgXFxcImdldF9jZ3JvdXBfaWRcXFwiKSlcXG4rXFx0XFx0Z290byBjbGVhbnVwO1xcbitcXG4rXFx0c2tlbCA9IHRocmVhZF93cV9jZ3JvdXBfX29wZW5fYW5kX2xvYWQoKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0tfUFRSKHNrZWwsIFxcXCJvcGVuX2FuZF9sb2FkXFxcIikpXFxuK1xcdFxcdGdvdG8gY2xlYW51cDtcXG4rXFxuK1xcdHByb2dfZmQgPSBicGZfcHJvZ3JhbV9fZmQoc2tlbC1cXHUwMDNlcHJvZ3Muc3RhcnRfdGhyZWFkX3dxKTtcXG4rXFxuK1xcdC8qIFJ1biBicGZfdGhyZWFkX3dxIGluIHRoZSBzcGVjaWZpZWQgY2dyb3VwLiAqL1xcbitcXHRza2VsLVxcdTAwM2Vic3MtXFx1MDAzZXRlc3Rfa2V5ID0gMDtcXG4rXFx0c2tlbC1cXHUwMDNlYnNzLVxcdTAwM2V0YXJnZXRfY2dyb3VwX2lkID0gY2dfaWQ7XFxuK1xcdHNrZWwtXFx1MDAzZWJzcy1cXHUwMDNlY2FsbGJhY2tfY2dyb3VwX2lkID0gMDtcXG4rXFx0c2tlbC1cXHUwMDNlYnNzLVxcdTAwM2V0d3FfZG9uZSA9IDA7XFxuK1xcdGlmICghQVNTRVJUX09LKGJwZl9wcm9nX3Rlc3RfcnVuX29wdHMocHJvZ19mZCwgXFx1MDAyNnRvcHRzKSxcXG4rXFx0XFx0ICAgICAgIFxcXCJicGZfcHJvZ190ZXN0X3J1bl9vcHRzIGluIGNncm91cFxcXCIpKVxcbitcXHRcXHRnb3RvIGNsZWFudXA7XFxuK1xcdGlmICghQVNTRVJUX09LKHRvcHRzLnJldHZhbCwgXFxcInJldHZhbCBpbiBjZ3JvdXBcXFwiKSlcXG4rXFx0XFx0Z290byBjbGVhbnVwO1xcbitcXHRmb3IgKHdhaXRlZF9zZWNzID0gMDsgd2FpdGVkX3NlY3MgXFx1MDAzYyBXQUlUX1RJTUVPVVRfU0VDUzsgd2FpdGVkX3NlY3MrKykge1xcbitcXHRcXHRpZiAoc2tlbC1cXHUwMDNlYnNzLVxcdTAwM2V0d3FfZG9uZSlcXG4rXFx0XFx0XFx0YnJlYWs7XFxuK1xcdFxcdHNsZWVwKDEpO1xcbitcXHR9XFxuK1xcdGlmICghQVNTRVJUX1RSVUUoc2tlbC1cXHUwMDNlYnNzLVxcdTAwM2V0d3FfZG9uZSwgXFxcInR3cV9kb25lIGluIGNncm91cFxcXCIpKVxcbitcXHRcXHRnb3RvIGNsZWFudXA7XFxuK1xcdGlmICghQVNTRVJUX0VRKHNrZWwtXFx1MDAzZWJzcy1cXHUwMDNlY2FsbGJhY2tfY2dyb3VwX2lkLCBjZ19pZCxcXG4rXFx0XFx0ICAgICAgIFxcXCJjYWxsYmFja19jZ3JvdXBfaWQgaW4gY2dyb3VwXFxcIikpXFxuK1xcdFxcdGdvdG8gY2xlYW51cDtcXG4rXFxuK1xcdC8qIFJ1biBicGZfdGhyZWFkX3dxIHdpdGhvdXQgY2dyb3VwIGF0dGFjaG1lbnQgKGNncm91cF9pZCA9IDApLiAqL1xcbitcXHRMSUJCUEZfT1BUU19SRVNFVCh0b3B0cyk7XFxuK1xcdHNrZWwtXFx1MDAzZWJzcy1cXHUwMDNldGVzdF9rZXkgPSAxO1xcbitcXHRza2VsLVxcdTAwM2Vic3MtXFx1MDAzZXRhcmdldF9jZ3JvdXBfaWQgPSAwO1xcbitcXHRza2VsLVxcdTAwM2Vic3MtXFx1MDAzZWNhbGxiYWNrX2Nncm91cF9pZCA9IDA7XFxuK1xcdHNrZWwtXFx1MDAzZWJzcy1cXHUwMDNldHdxX2RvbmUgPSAwO1xcbitcXHRpZiAoIUFTU0VSVF9PSyhicGZfcHJvZ190ZXN0X3J1bl9vcHRzKHByb2dfZmQsIFxcdTAwMjZ0b3B0cyksXFxuK1xcdFxcdCAgICAgICBcXFwiYnBmX3Byb2dfdGVzdF9ydW5fb3B0cyB3aXRob3V0IGNncm91cFxcXCIpKVxcbitcXHRcXHRnb3RvIGNsZWFudXA7XFxuK1xcdGlmICghQVNTRVJUX09LKHRvcHRzLnJldHZhbCwgXFxcInJldHZhbCB3aXRob3V0IGNncm91cFxcXCIpKVxcbitcXHRcXHRnb3RvIGNsZWFudXA7XFxuK1xcdGZvciAod2FpdGVkX3NlY3MgPSAwOyB3YWl0ZWRfc2VjcyBcXHUwMDNjIFdBSVRfVElNRU9VVF9TRUNTOyB3YWl0ZWRfc2VjcysrKSB7XFxuK1xcdFxcdGlmIChza2VsLVxcdTAwM2Vic3MtXFx1MDAzZXR3cV9kb25lKVxcbitcXHRcXHRcXHRicmVhaztcXG4rXFx0XFx0c2xlZXAoMSk7XFxuK1xcdH1cXG4rXFx0aWYgKCFBU1NFUlRfVFJVRShza2VsLVxcdTAwM2Vic3MtXFx1MDAzZXR3cV9kb25lLCBcXFwidHdxX2RvbmUgd2l0aG91dCBjZ3JvdXBcXFwiKSlcXG4rXFx0XFx0Z290byBjbGVhbnVwO1xcbitcXHRpZiAoIUFTU0VSVF9ORVEoc2tlbC1cXHUwMDNlYnNzLVxcdTAwM2VjYWxsYmFja19jZ3JvdXBfaWQsIGNnX2lkLFxcbitcXHRcXHRcXHRcXFwiY2FsbGJhY2tfY2dyb3VwX2lkIHdpdGhvdXQgY2dyb3VwXFxcIikpXFxuK1xcdFxcdGdvdG8gY2xlYW51cDtcXG4rXFxuK2NsZWFudXA6XFxuK1xcdGlmIChza2VsKSB7XFxuK1xcdFxcdHRocmVhZF93cV9jZ3JvdXBfX2Rlc3Ryb3koc2tlbCk7XFxuK1xcdFxcdC8qIFdhaXQgdGhyZWFkX3dxIGt0aHJlYWQgcXVpdC4gKi9cXG4rXFx0XFx0c2xlZXAoMik7XFxuK1xcdH1cXG4rXFx0aWYgKGNnX2ZkIFxcdTAwM2U9IDApXFxuK1xcdFxcdGNsb3NlKGNnX2ZkKTtcXG4rXFx0Y2xlYW51cF9jZ3JvdXBfZW52aXJvbm1lbnQoKTtcXG4rfVxcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvbWVtY2dfYXN5bmNfcmVjbGFpbS5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL21lbWNnX2FzeW5jX3JlY2xhaW0uY1xcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uZWFjY2M4YTM3Mzg4Ylxcbi0tLSAvZGV2L251bGxcXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvbWVtY2dfYXN5bmNfcmVjbGFpbS5jXFxuQEAgLTAsMCArMSwyNTUgQEBcXG4rLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcXG4rXFxuKyNpbmNsdWRlIFxcXCJ2bWxpbnV4LmhcXFwiXFxuKyNpbmNsdWRlIFxcXCJicGZfZXhwZXJpbWVudGFsLmhcXFwiXFxuKyNpbmNsdWRlIFxcdTAwM2NicGYvYnBmX2hlbHBlcnMuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2JwZi9icGZfdHJhY2luZy5oXFx1MDAzZVxcbitcXG4rI2RlZmluZSBCSVQobnIpXFx0XFx0XFx0KDFVTCBcXHUwMDNjXFx1MDAzYyAobnIpKVxcbitcXG4rI2RlZmluZSBfX19HRlBfSU9cXHRcXHRCSVQoX19fR0ZQX0lPX0JJVClcXG4rI2RlZmluZSBfX19HRlBfRlNcXHRcXHRCSVQoX19fR0ZQX0ZTX0JJVClcXG4rI2RlZmluZSBfX19HRlBfRElSRUNUX1JFQ0xBSU1cXHRCSVQoX19fR0ZQX0RJUkVDVF9SRUNMQUlNX0JJVClcXG4rI2RlZmluZSBfX19HRlBfS1NXQVBEX1JFQ0xBSU1cXHRCSVQoX19fR0ZQX0tTV0FQRF9SRUNMQUlNX0JJVClcXG4rXFxuKyNkZWZpbmUgX19HRlBfSU9cXHRcXHQoKGdmcF90KV9fX0dGUF9JTylcXG4rI2RlZmluZSBfX0dGUF9GU1xcdFxcdCgoZ2ZwX3QpX19fR0ZQX0ZTKVxcbisjZGVmaW5lIF9fR0ZQX0RJUkVDVF9SRUNMQUlNXFx0KChnZnBfdClfX19HRlBfRElSRUNUX1JFQ0xBSU0pXFxuKyNkZWZpbmUgX19HRlBfS1NXQVBEX1JFQ0xBSU1cXHQoKGdmcF90KV9fX0dGUF9LU1dBUERfUkVDTEFJTSlcXG4rI2RlZmluZSBfX0dGUF9SRUNMQUlNXFx0KChnZnBfdCkoX19fR0ZQX0RJUkVDVF9SRUNMQUlNIHwgX19fR0ZQX0tTV0FQRF9SRUNMQUlNKSlcXG4rXFxuKyNkZWZpbmUgR0ZQX0tFUk5FTFxcdChfX0dGUF9SRUNMQUlNIHwgX19HRlBfSU8gfCBfX0dGUF9GUylcXG4rI2RlZmluZSBDTE9DS19NT05PVE9OSUNfSURcXHQxXFxuKyNkZWZpbmUgUkVDTEFJTV9QQUdFU1xcdFxcdDMyXFxuKyNkZWZpbmUgUkVDTEFJTV9NQVhfSVRFUlxcdDMyXFxuK1xcbitzdHJ1Y3QgYnBmX2FyZ3NfcyB7XFxuK1xcdHU2NCBoaWdoX2Nncm91cF9pZDtcXG4rXFx0dTY0IGxvd19jZ3JvdXBfaWQ7XFxuK1xcdHU2NCBldmVudF9kZWx0YV90aHJlc2hvbGQ7XFxuK1xcdHU2NCBjaGVja19ucztcXG4rfTtcXG4rXFxuK3N0cnVjdCBjZ3JvdXBfbWVtY2cge1xcbitcXHRzdHJ1Y3QgY2dyb3VwICpjZ3JwO1xcbitcXHRzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2c7XFxuK307XFxuK1xcbitzdGF0aWMgdTY0IHdxX2hpZ2hfY2dyb3VwX2lkO1xcbitzdGF0aWMgdTY0IHdxX2xvd19jZ3JvdXBfaWQ7XFxuK1xcbitzdGF0aWMgaW50IGdldF9jZ3JvdXBfbWVtY2dfZnJvbV9pZCh1NjQgY2dyb3VwX2lkLCBzdHJ1Y3QgY2dyb3VwX21lbWNnICpjbSlcXG4re1xcbitcXHRjbS1cXHUwMDNlY2dycCA9IGJwZl9jZ3JvdXBfZnJvbV9pZChjZ3JvdXBfaWQpO1xcbitcXHRpZiAoIWNtLVxcdTAwM2VjZ3JwKVxcbitcXHRcXHRyZXR1cm4gLTE7XFxuK1xcbitcXHRjbS1cXHUwMDNlbWVtY2cgPSBicGZfZ2V0X21lbV9jZ3JvdXAoXFx1MDAyNmNtLVxcdTAwM2VjZ3JwLVxcdTAwM2VzZWxmKTtcXG4rXFx0aWYgKCFjbS1cXHUwMDNlbWVtY2cpIHtcXG4rXFx0XFx0YnBmX2Nncm91cF9yZWxlYXNlKGNtLVxcdTAwM2VjZ3JwKTtcXG4rXFx0XFx0cmV0dXJuIC0xO1xcbitcXHR9XFxuK1xcbitcXHRyZXR1cm4gMDtcXG4rfVxcbitcXG4rc3RhdGljIHZvaWQgcHV0X2Nncm91cF9tZW1jZyhzdHJ1Y3QgY2dyb3VwX21lbWNnICpjbSlcXG4re1xcbitcXHRicGZfcHV0X21lbV9jZ3JvdXAoY20tXFx1MDAzZW1lbWNnKTtcXG4rXFx0YnBmX2Nncm91cF9yZWxlYXNlKGNtLVxcdTAwM2VjZ3JwKTtcXG4rfVxcbitcXG4rc3RhdGljIGludCBnZXRfY2dyb3VwX2V2ZW50KHU2NCBjZ3JvdXBfaWQsIHU2NCAqdmFsKVxcbit7XFxuK1xcdHN0cnVjdCBjZ3JvdXBfbWVtY2cgY207XFxuK1xcbitcXHRpZiAoZ2V0X2Nncm91cF9tZW1jZ19mcm9tX2lkKGNncm91cF9pZCwgXFx1MDAyNmNtKSlcXG4rXFx0XFx0cmV0dXJuIC0xO1xcbitcXHRicGZfbWVtX2Nncm91cF9mbHVzaF9zdGF0cyhjbS5tZW1jZyk7XFxuK1xcdCp2YWwgPSBicGZfbWVtX2Nncm91cF9wYWdlX3N0YXRlKGNtLm1lbWNnLCBXT1JLSU5HU0VUX1JFRkFVTFRfRklMRSk7XFxuK1xcdHB1dF9jZ3JvdXBfbWVtY2coXFx1MDAyNmNtKTtcXG4rXFxuK1xcdHJldHVybiAwO1xcbit9XFxuK1xcbitzdGF0aWMgYm9vbFxcbitzaG91bGRfcmVjbGFpbV9jZ3JvdXAodTY0IGNncm91cF9pZCwgdTY0ICpwcmV2X2V2ZW50LCB1NjQgZXZlbnRfZGVsdGFfdGhyZXNob2xkKVxcbit7XFxuK1xcdHU2NCBjdXIsIGRlbHRhO1xcbitcXG4rXFx0aWYgKGdldF9jZ3JvdXBfZXZlbnQoY2dyb3VwX2lkLCBcXHUwMDI2Y3VyKSlcXG4rXFx0XFx0cmV0dXJuIGZhbHNlO1xcbitcXG4rXFx0ZGVsdGEgPSBjdXIgLSAqcHJldl9ldmVudDtcXG4rXFx0KnByZXZfZXZlbnQgPSBjdXI7XFxuK1xcbitcXHRyZXR1cm4gZGVsdGEgXFx1MDAzZT0gZXZlbnRfZGVsdGFfdGhyZXNob2xkO1xcbit9XFxuK1xcbitzdGF0aWMgaW50IHJlY2xhaW1fY2dyb3VwKHU2NCBjZ3JvdXBfaWQpXFxuK3tcXG4rXFx0c3RydWN0IGNncm91cF9tZW1jZyBjbTtcXG4rXFx0aW50IGk7XFxuK1xcbitcXHRpZiAoZ2V0X2Nncm91cF9tZW1jZ19mcm9tX2lkKGNncm91cF9pZCwgXFx1MDAyNmNtKSlcXG4rXFx0XFx0cmV0dXJuIDA7XFxuK1xcbitcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgUkVDTEFJTV9NQVhfSVRFUjsgaSsrKSB7XFxuK1xcdFxcdGlmICghYnBmX3RyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMoY20ubWVtY2csIFJFQ0xBSU1fUEFHRVMsXFxuK1xcdFxcdFxcdFxcdFxcdFxcdCAgICAgIEdGUF9LRVJORUwsIDAsIC0xKSlcXG4rXFx0XFx0XFx0YnJlYWs7XFxuK1xcdH1cXG4rXFxuK1xcdHB1dF9jZ3JvdXBfbWVtY2coXFx1MDAyNmNtKTtcXG4rXFxuK1xcdHJldHVybiAwO1xcbit9XFxuK1xcbitzdHJ1Y3Qgd3FfZWxlbSB7XFxuK1xcdHN0cnVjdCBicGZfdGltZXIgdGltZXI7XFxuK1xcdHN0cnVjdCBicGZfd3Egd29yaztcXG4rXFx0dTY0IHByZXZfZXZlbnQ7XFxuK1xcdHU2NCBldmVudF9kZWx0YV90aHJlc2hvbGQ7XFxuK1xcdHU2NCBjaGVja19ucztcXG4rfTtcXG4rXFxuK3N0cnVjdCB7XFxuK1xcdF9fdWludCh0eXBlLCBCUEZfTUFQX1RZUEVfQVJSQVkpO1xcbitcXHRfX3VpbnQobWF4X2VudHJpZXMsIDEpO1xcbitcXHRfX3R5cGUoa2V5LCBfX3UzMik7XFxuK1xcdF9fdHlwZSh2YWx1ZSwgc3RydWN0IHdxX2VsZW0pO1xcbit9IHdxX21hcCBTRUMoXFxcIi5tYXBzXFxcIik7XFxuK1xcbitzdGF0aWMgaW50IGFzeW5jX2ZyZWUodm9pZCAqbWFwLCBpbnQgKmtleSwgdm9pZCAqdmFsdWUpXFxuK3tcXG4rXFx0c3RydWN0IHdxX2VsZW0gKmVsZW0gPSB2YWx1ZTtcXG4rXFxuK1xcdGlmIChzaG91bGRfcmVjbGFpbV9jZ3JvdXAod3FfaGlnaF9jZ3JvdXBfaWQsIFxcdTAwMjZlbGVtLVxcdTAwM2VwcmV2X2V2ZW50LFxcbitcXHRcXHRlbGVtLVxcdTAwM2VldmVudF9kZWx0YV90aHJlc2hvbGQpKSB7XFxuK1xcdFxcdHJlY2xhaW1fY2dyb3VwKHdxX2xvd19jZ3JvdXBfaWQpO1xcbitcXHRcXHRicGZfd3Ffc3RhcnQoXFx1MDAyNmVsZW0tXFx1MDAzZXdvcmssIDApO1xcbitcXHR9XFxuK1xcbitcXHRyZXR1cm4gMDtcXG4rfVxcbitcXG4rc3RhdGljIGludCB3cV90aW1lcl9jYih2b2lkICptYXAsIGludCAqa2V5LCBzdHJ1Y3Qgd3FfZWxlbSAqZWxlbSlcXG4re1xcbitcXHRicGZfd3Ffc3RhcnQoXFx1MDAyNmVsZW0tXFx1MDAzZXdvcmssIDApO1xcbitcXHRicGZfdGltZXJfc3RhcnQoXFx1MDAyNmVsZW0tXFx1MDAzZXRpbWVyLCBlbGVtLVxcdTAwM2VjaGVja19ucywgMCk7XFxuK1xcbitcXHRyZXR1cm4gMDtcXG4rfVxcbitcXG4rU0VDKFxcXCJzeXNjYWxsXFxcIilcXG4raW50IHdxX3Byb2dfaW5pdChzdHJ1Y3QgYnBmX2FyZ3NfcyAqY3R4KVxcbit7XFxuK1xcdHN0cnVjdCB3cV9lbGVtICplbGVtO1xcbitcXHRfX3UzMiBrZXkgPSAwO1xcbitcXHRpbnQgcmV0O1xcbitcXG4rXFx0ZWxlbSA9IGJwZl9tYXBfbG9va3VwX2VsZW0oXFx1MDAyNndxX21hcCwgXFx1MDAyNmtleSk7XFxuK1xcdGlmICghZWxlbSlcXG4rXFx0XFx0cmV0dXJuIC0xO1xcbitcXG4rXFx0cmV0ID0gYnBmX3dxX2luaXQoXFx1MDAyNmVsZW0tXFx1MDAzZXdvcmssIFxcdTAwMjZ3cV9tYXAsIDApO1xcbitcXHRpZiAocmV0KVxcbitcXHRcXHRyZXR1cm4gcmV0O1xcbitcXG4rXFx0cmV0ID0gYnBmX3dxX3NldF9jYWxsYmFjayhcXHUwMDI2ZWxlbS1cXHUwMDNld29yaywgYXN5bmNfZnJlZSwgMCk7XFxuK1xcdGlmIChyZXQpXFxuK1xcdFxcdHJldHVybiByZXQ7XFxuK1xcbitcXHRyZXQgPSBicGZfdGltZXJfaW5pdChcXHUwMDI2ZWxlbS1cXHUwMDNldGltZXIsIFxcdTAwMjZ3cV9tYXAsIENMT0NLX01PTk9UT05JQ19JRCk7XFxuK1xcdGlmIChyZXQpXFxuK1xcdFxcdHJldHVybiByZXQ7XFxuK1xcbitcXHRyZXQgPSBicGZfdGltZXJfc2V0X2NhbGxiYWNrKFxcdTAwMjZlbGVtLVxcdTAwM2V0aW1lciwgd3FfdGltZXJfY2IpO1xcbitcXHRpZiAocmV0KVxcbitcXHRcXHRyZXR1cm4gcmV0O1xcbitcXG4rXFx0ZWxlbS1cXHUwMDNlcHJldl9ldmVudCA9IDA7XFxuK1xcdGVsZW0tXFx1MDAzZWV2ZW50X2RlbHRhX3RocmVzaG9sZCA9IGN0eC1cXHUwMDNlZXZlbnRfZGVsdGFfdGhyZXNob2xkO1xcbitcXHRlbGVtLVxcdTAwM2VjaGVja19ucyA9IGN0eC1cXHUwMDNlY2hlY2tfbnM7XFxuK1xcbitcXHR3cV9oaWdoX2Nncm91cF9pZCA9IGN0eC1cXHUwMDNlaGlnaF9jZ3JvdXBfaWQ7XFxuK1xcdHdxX2xvd19jZ3JvdXBfaWQgPSBjdHgtXFx1MDAzZWxvd19jZ3JvdXBfaWQ7XFxuK1xcbitcXHRyZXR1cm4gYnBmX3RpbWVyX3N0YXJ0KFxcdTAwMjZlbGVtLVxcdTAwM2V0aW1lciwgZWxlbS1cXHUwMDNlY2hlY2tfbnMsIDApO1xcbit9XFxuK1xcbitzdHJ1Y3QgdGhyZWFkX3dxX2VsZW0ge1xcbitcXHRzdHJ1Y3QgYnBmX3RpbWVyIHRpbWVyO1xcbitcXHRzdHJ1Y3QgYnBmX3RocmVhZF93cSB3b3JrO1xcbitcXHR1NjQgcHJldl9ldmVudDtcXG4rXFx0dTY0IGV2ZW50X2RlbHRhX3RocmVzaG9sZDtcXG4rXFx0dTY0IGNoZWNrX25zO1xcbit9O1xcbitcXG4rc3RydWN0IHtcXG4rXFx0X191aW50KHR5cGUsIEJQRl9NQVBfVFlQRV9BUlJBWSk7XFxuK1xcdF9fdWludChtYXhfZW50cmllcywgMSk7XFxuK1xcdF9fdHlwZShrZXksIF9fdTMyKTtcXG4rXFx0X190eXBlKHZhbHVlLCBzdHJ1Y3QgdGhyZWFkX3dxX2VsZW0pO1xcbit9IHRocmVhZF93cV9tYXAgU0VDKFxcXCIubWFwc1xcXCIpO1xcbitcXG4rc3RhdGljIGludCB0aHJlYWRfYXN5bmNfZnJlZSh2b2lkICptYXAsIGludCAqa2V5LCB2b2lkICp2YWx1ZSlcXG4re1xcbitcXHRzdHJ1Y3QgdGhyZWFkX3dxX2VsZW0gKmVsZW0gPSB2YWx1ZTtcXG4rXFxuK1xcdGlmIChzaG91bGRfcmVjbGFpbV9jZ3JvdXAod3FfaGlnaF9jZ3JvdXBfaWQsIFxcdTAwMjZlbGVtLVxcdTAwM2VwcmV2X2V2ZW50LFxcbitcXHRcXHRlbGVtLVxcdTAwM2VldmVudF9kZWx0YV90aHJlc2hvbGQpKSB7XFxuK1xcdFxcdHJlY2xhaW1fY2dyb3VwKHdxX2xvd19jZ3JvdXBfaWQpO1xcbitcXHRcXHRicGZfdGhyZWFkX3dxX3N0YXJ0KFxcdTAwMjZlbGVtLVxcdTAwM2V3b3JrLCAwKTtcXG4rXFx0fVxcbitcXG4rXFx0cmV0dXJuIDA7XFxuK31cXG4rXFxuK3N0YXRpYyBpbnQgdGhyZWFkX3dxX3RpbWVyX2NiKHZvaWQgKm1hcCwgaW50ICprZXksIHN0cnVjdCB0aHJlYWRfd3FfZWxlbSAqZWxlbSlcXG4re1xcbitcXHRicGZfdGhyZWFkX3dxX3N0YXJ0KFxcdTAwMjZlbGVtLVxcdTAwM2V3b3JrLCAwKTtcXG4rXFx0YnBmX3RpbWVyX3N0YXJ0KFxcdTAwMjZlbGVtLVxcdTAwM2V0aW1lciwgZWxlbS1cXHUwMDNlY2hlY2tfbnMsIDApO1xcbitcXG4rXFx0cmV0dXJuIDA7XFxuK31cXG4rXFxuK1NFQyhcXFwic3lzY2FsbFxcXCIpXFxuK2ludCB0aHJlYWRfd3FfcHJvZ19pbml0KHN0cnVjdCBicGZfYXJnc19zICpjdHgpXFxuK3tcXG4rXFx0c3RydWN0IHRocmVhZF93cV9lbGVtICplbGVtO1xcbitcXHRfX3UzMiBrZXkgPSAwO1xcbitcXHRpbnQgcmV0O1xcbitcXG4rXFx0ZWxlbSA9IGJwZl9tYXBfbG9va3VwX2VsZW0oXFx1MDAyNnRocmVhZF93cV9tYXAsIFxcdTAwMjZrZXkpO1xcbitcXHRpZiAoIWVsZW0pXFxuK1xcdFxcdHJldHVybiAtMTtcXG4rXFxuK1xcdHJldCA9IGJwZl90aHJlYWRfd3FfaW5pdChcXHUwMDI2ZWxlbS1cXHUwMDNld29yaywgXFx1MDAyNnRocmVhZF93cV9tYXAsXFxuK1xcdFxcdFxcdFxcdCBjdHgtXFx1MDAzZWxvd19jZ3JvdXBfaWQsIDApO1xcbitcXHRpZiAocmV0KVxcbitcXHRcXHRyZXR1cm4gcmV0O1xcbitcXG4rXFx0cmV0ID0gYnBmX3RocmVhZF93cV9zZXRfY2FsbGJhY2soXFx1MDAyNmVsZW0tXFx1MDAzZXdvcmssIHRocmVhZF9hc3luY19mcmVlLCAwKTtcXG4rXFx0aWYgKHJldClcXG4rXFx0XFx0cmV0dXJuIHJldDtcXG4rXFxuK1xcdHJldCA9IGJwZl90aW1lcl9pbml0KFxcdTAwMjZlbGVtLVxcdTAwM2V0aW1lciwgXFx1MDAyNnRocmVhZF93cV9tYXAsIENMT0NLX01PTk9UT05JQ19JRCk7XFxuK1xcdGlmIChyZXQpXFxuK1xcdFxcdHJldHVybiByZXQ7XFxuK1xcbitcXHRyZXQgPSBicGZfdGltZXJfc2V0X2NhbGxiYWNrKFxcdTAwMjZlbGVtLVxcdTAwM2V0aW1lciwgdGhyZWFkX3dxX3RpbWVyX2NiKTtcXG4rXFx0aWYgKHJldClcXG4rXFx0XFx0cmV0dXJuIHJldDtcXG4rXFxuK1xcdGVsZW0tXFx1MDAzZXByZXZfZXZlbnQgPSAwO1xcbitcXHRlbGVtLVxcdTAwM2VldmVudF9kZWx0YV90aHJlc2hvbGQgPSBjdHgtXFx1MDAzZWV2ZW50X2RlbHRhX3RocmVzaG9sZDtcXG4rXFx0ZWxlbS1cXHUwMDNlY2hlY2tfbnMgPSBjdHgtXFx1MDAzZWNoZWNrX25zO1xcbitcXG4rXFx0d3FfaGlnaF9jZ3JvdXBfaWQgPSBjdHgtXFx1MDAzZWhpZ2hfY2dyb3VwX2lkO1xcbitcXHR3cV9sb3dfY2dyb3VwX2lkID0gY3R4LVxcdTAwM2Vsb3dfY2dyb3VwX2lkO1xcbitcXG4rXFx0cmV0dXJuIGJwZl90aW1lcl9zdGFydChcXHUwMDI2ZWxlbS1cXHUwMDNldGltZXIsIGVsZW0tXFx1MDAzZWNoZWNrX25zLCAwKTtcXG4rfVxcbitcXG4rY2hhciBMSUNFTlNFW10gU0VDKFxcXCJsaWNlbnNlXFxcIikgPSBcXFwiR1BMXFxcIjtcXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL3RocmVhZF93cV9jZ3JvdXAuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy90aHJlYWRfd3FfY2dyb3VwLmNcXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxcbmluZGV4IDAwMDAwMDAwMDAwMDAuLmM3MGEzN2Y1NTM5N2RcXG4tLS0gL2Rldi9udWxsXFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL3RocmVhZF93cV9jZ3JvdXAuY1xcbkBAIC0wLDAgKzEsNTYgQEBcXG4rLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcXG4rLyogQ29weXJpZ2h0IChjKSAyMDI2ICovXFxuK1xcbisjaW5jbHVkZSBcXFwiYnBmX2V4cGVyaW1lbnRhbC5oXFxcIlxcbisjaW5jbHVkZSBcXHUwMDNjYnBmL2JwZl9oZWxwZXJzLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcXCJicGZfbWlzYy5oXFxcIlxcbitcXG4rY2hhciBfbGljZW5zZVtdIFNFQyhcXFwibGljZW5zZVxcXCIpID0gXFxcIkdQTFxcXCI7XFxuK1xcbitzdHJ1Y3QgZWxlbSB7XFxuK1xcdHN0cnVjdCBicGZfdGhyZWFkX3dxIHR3cTtcXG4rfTtcXG4rXFxuK3N0cnVjdCB7XFxuK1xcdF9fdWludCh0eXBlLCBCUEZfTUFQX1RZUEVfQVJSQVkpO1xcbitcXHRfX3VpbnQobWF4X2VudHJpZXMsIDIpO1xcbitcXHRfX3R5cGUoa2V5LCBpbnQpO1xcbitcXHRfX3R5cGUodmFsdWUsIHN0cnVjdCBlbGVtKTtcXG4rfSBtYXBfYXJyIFNFQyhcXFwiLm1hcHNcXFwiKTtcXG4rXFxuK19fdTY0IHRhcmdldF9jZ3JvdXBfaWQ7XFxuK19fdTY0IGNhbGxiYWNrX2Nncm91cF9pZDtcXG4raW50IHR3cV9kb25lO1xcbitpbnQgdGVzdF9rZXk7XFxuK1xcbitzdGF0aWMgaW50IHR3cV9jYWxsYmFjayh2b2lkICptYXAsIGludCAqa2V5LCB2b2lkICp2YWx1ZSlcXG4re1xcbitcXHRjYWxsYmFja19jZ3JvdXBfaWQgPSBicGZfZ2V0X2N1cnJlbnRfY2dyb3VwX2lkKCk7XFxuK1xcdHR3cV9kb25lID0gMTtcXG4rXFx0cmV0dXJuIDA7XFxuK31cXG4rXFxuK1NFQyhcXFwic3lzY2FsbFxcXCIpXFxuK2ludCBzdGFydF90aHJlYWRfd3Eodm9pZCAqY3R4KVxcbit7XFxuK1xcdHN0cnVjdCBlbGVtICp2YWw7XFxuK1xcdGludCBrZXkgPSB0ZXN0X2tleTtcXG4rXFx0aW50IHJldDtcXG4rXFxuK1xcdHZhbCA9IGJwZl9tYXBfbG9va3VwX2VsZW0oXFx1MDAyNm1hcF9hcnIsIFxcdTAwMjZrZXkpO1xcbitcXHRpZiAoIXZhbClcXG4rXFx0XFx0cmV0dXJuIC0xO1xcbitcXG4rXFx0cmV0ID0gYnBmX3RocmVhZF93cV9pbml0KFxcdTAwMjZ2YWwtXFx1MDAzZXR3cSwgXFx1MDAyNm1hcF9hcnIsIHRhcmdldF9jZ3JvdXBfaWQsIDApO1xcbitcXHRpZiAocmV0KVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFxuK1xcdHJldCA9IGJwZl90aHJlYWRfd3Ffc2V0X2NhbGxiYWNrKFxcdTAwMjZ2YWwtXFx1MDAzZXR3cSwgdHdxX2NhbGxiYWNrLCAwKTtcXG4rXFx0aWYgKHJldClcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcbitcXHRyZXQgPSBicGZfdGhyZWFkX3dxX3N0YXJ0KFxcdTAwMjZ2YWwtXFx1MDAzZXR3cSwgMCk7XFxuK1xcbitvdXQ6XFxuK1xcdHJldHVybiByZXQ7XFxuK31cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDdUMDg6NTA6NDMuNzA5MDg0OTY3WiIsIlNlcSI6MiwiTmVzdGluZyI6MSwiVHlwZSI6ImFnZW50IiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiYmVzdC1leHBlbnNpdmUiLCJEdXJhdGlvbiI6MjM1ODkyOTczNzYsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiTUVNQ0dcIixcbiAgICBcIkNHUk9VUFNcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJicGZfdGhyZWFkX3dxX2luaXRcIixcbiAgICBcImJwZl90aHJlYWRfd3Ffc2V0X2NhbGxiYWNrXCIsXG4gICAgXCJicGZfdGhyZWFkX3dxX3N0YXJ0XCIsXG4gICAgXCJicGZfdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlc1wiLFxuICAgIFwiY2dyb3VwX2t0aHJlYWRfYXR0YWNoXCJcbiAgXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggaW50cm9kdWNlcyBhIG5ldyBCUEYgdGhyZWFkIHdvcmtxdWV1ZSBmZWF0dXJlIChgYnBmX3RocmVhZF93cWApIHRoYXQgYWxsb3dzIEJQRiBwcm9ncmFtcyB0byBzY2hlZHVsZSB3b3JrIGluIGEga3RocmVhZCBjb250ZXh0LCBvcHRpb25hbGx5IGF0dGFjaGVkIHRvIGEgY2dyb3VwLiBJdCBhbHNvIGFkZHMgYSBuZXcgQlBGIGtmdW5jIGBicGZfdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlc2AgZm9yIG1lbW9yeSBjZ3JvdXAgcmVjbGFpbS4gVGhlc2UgYXJlIGZ1bmN0aW9uYWwgY2hhbmdlcyB0byB0aGUgY29yZSBCUEYgYW5kIG1lbW9yeSBjb250cm9sIHN1YnN5c3RlbXMsIHJlYWNoYWJsZSBmcm9tIHVzZXJzcGFjZSB2aWEgQlBGIHByb2dyYW1zLCBhbmQgc2hvdWxkIGJlIGZ1enplZC5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiWW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIG1haW50YWluZXIuXG5Zb3VyIGpvYiBpcyB0byByZXZpZXcgYSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kIGRldGVybWluZVxuaWYgaXQgbWFrZXMgZnVuY3Rpb25hbCBjaGFuZ2VzIHRvIHRoZSBrZXJuZWwgdGhhdCBzaG91bGQgYmUgZnV6emVkLlxuXG5JTVBPUlRBTlQ6IFRoZSBjaGFuZ2VzIGhhdmUgQUxSRUFEWSBiZWVuIGFwcGxpZWQgYW5kIGNvbW1pdHRlZCBhcyB0aGUgSEVBRCBjb21taXQgaW5cbnlvdXIgd29ya3NwYWNlLiBEbyBOT1QgcmVseSBvbiB5b3VyIGludGVybmFsIGtub3dsZWRnZSBvZiB0aGUga2VybmVsLiBZb3UgbXVzdCBhY3RpdmVseVxudXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gZXhhbWluZSB0aGUgYWN0dWFsIHNvdXJjZSBjb2RlIGFuZCBjb25maXJtIGFueSBhc3N1bXB0aW9ucy5cblxuUmV0dXJuIFdvcnRoRnV6emluZz1mYWxzZSBpZiB0aGUgcGF0Y2ggb25seSBjb250YWluczpcbi0gTW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLywgS2NvbmZpZyBmaWxlcywgb3IgY29kZSBjb21tZW50cy5cbi0gUHVyZWx5IGRlY29yYXRpdmUgY2hhbmdlcywgc3VjaCBhcyBsb2dnaW5nIChlLmcuLCBwcl9lcnIsIHByaW50aykgb3IgdHJhY2Vwb2ludHMuXG4tIENoYW5nZXMgdG8gbnVtZXJpYyBjb25zdGFudHMgb3IgbWFjcm9zIHRoYXQgZG8gbm90IGZ1bmN0aW9uYWxseSBhbHRlciBleGVjdXRpb24gZmxvdy5cbi0gQ29kZSBwYXRocyB0aGF0IGFyZSBpbXBvc3NpYmxlIHRvIHJlYWNoIGluIHZpcnR1YWxpemVkIGVudmlyb25tZW50cyBsaWtlIEdDRSBvciBRRU1VLFxuICBldmVuIHdoZW4gdXRpbGl6aW5nIHNvZnR3YXJlLWVtdWxhdGVkIGhhcmR3YXJlIChlLmcuLCB1c2IgZ2FkZ2V0LCBtYWM4MDIxMV9od3NpbSkuXG4tIENvZGUgaW4gdmVuZG9yLXNwZWNpZmljIFBDSWUgc3dpdGNoLCBTbWFydE5JQywgb3IgR1BVIGRyaXZlcnMgKGUuZy4sIG1seHN3LCBwZHNfY29yZSwgcWVkLFxuICBpb25pYywgYW1kZ3B1KSB0aGF0IHJlcXVpcmUgcGh5c2ljYWwgUENJZSBoYXJkd2FyZSBjYXJkcyBub3QgZW11bGF0ZWQgaW4gc3RhbmRhcmQgUUVNVS5cbi0gRHJpdmVyIC5yZW1vdmUsIC5zaHV0ZG93biwgb3IgcGNpX3VucmVnaXN0ZXJfZHJpdmVyIHRlYXJkb3duIGNhbGxiYWNrcyAoZS5nLiwgaWdiX3JlbW92ZSlcbiAgdGhhdCBhcmUgZXhlY3V0ZWQgb25seSBkdXJpbmcgUENJIGhvdC11bnBsdWcgb3Igc3lzZnMgZHJpdmVyIHVuYmluZCBvcGVyYXRpb25zLlxuXG5JZiBpdCBtb2RpZmllcyByZWFjaGFibGUgY29yZSBrZXJuZWwgbG9naWMsIGRyaXZlcnMsIG9yIGFyY2hpdGVjdHVyZXMsIHVzZSB5b3VyIGNvZGUgc2VhcmNoXG50b29scyB0byB2ZXJpZnkgdGhlIGNvZGUgY2FuIGJlIGV4ZWN1dGVkLCB0aGVuIHJldHVybiBXb3J0aEZ1enppbmc9dHJ1ZS5cblxuV2hlbiByZXR1cm5pbmcgV29ydGhGdXp6aW5nPXRydWUsIHlvdSBNVVNUIEFMU086XG4xLiBFeHRyYWN0IGFueSBzcGVjaWZpYyBrZXJuZWwgZnVuY3Rpb25zIHRoYXQgc2hvdWxkIGJlIGhlYXZpbHkgZnV6emVkIGludG8gRm9jdXNTeW1ib2xzLlxuICAgQXZvaWQgbGlzdGluZyBnZW5lcmljIGhvdC1wYXRoIGZ1bmN0aW9ucyB0byBwcmV2ZW50IHNrZXdlZCB0ZXN0IGRpc3RyaWJ1dGlvbnMuXG4gICBQcmVmZXIgbm9uLXN0YXRpYywgbm9uLWlubGluZWQgQVBJIGVudHJ5cG9pbnQgZnVuY3Rpb25zIG92ZXIgaW50ZXJuYWwgc3RhdGljIGhlbHBlciBmdW5jdGlvbnNcbiAgICh3aGljaCBhcmUgaW5saW5lZCBieSB0aGUgY29tcGlsZXIgYW5kIGRvIG5vdCBoYXZlIGRpc3RpbmN0IHN5bWJvbCBhZGRyZXNzZXMpLlxuMi4gSWRlbnRpZnkgYW55IHNwZWNpZmljIENPTkZJR18gb3B0aW9ucyByZXF1aXJlZCB0byBwcm9wZXJseSB0ZXN0IHRoaXMgbmV3L21vZGlmaWVkIGZlYXR1cmUuXG4gICBHbyBhbmQgbG9vayBpbnRvIHRoZSBLY29uZmlnIGZpbGVzIGFuZCBjaGVjayBmb3IgaWZkZWZzIGFyb3VuZCB0aGUgY29kZSwgZG8gbm90IG1ha2UgYXNzdW1wdGlvbnMuXG4gICBBbHNvIGNoZWNrIFwiZGVwZW5kcyBvblwiIGxpbmVzIGluIEtjb25maWcgdG8gaW5jbHVkZSBhbnkgbm9uLXN0YW5kYXJkIHBhcmVudCBzdWJzeXN0ZW0gY29uZmlnc1xuICAgbmVlZGVkIGZvciBLYnVpbGQgdG8gY29tcGlsZSB0aGUgY29kZSBzdGF0aWNhbGx5IGludG8gdm1saW51eC4gTGlzdCB0aGVtIGluIHRoZSBFbmFibGVDb25maWdzXG4gICBvdXRwdXQgYXJyYXksIGFuZCBETyBOT1QgYWRkIGEgJ0NPTkZJR18nIHByZWZpeCAoZS5nLiwgcmV0dXJuIFwiTkVUX0lQVjRcIiBpbnN0ZWFkIG9mIFwiQ09ORklHX05FVF9JUFY0XCIpLlxuUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuXG5cblxuVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy5cbkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LlxuSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLlxuIiwiUHJvbXB0IjoiRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6XG5jb21taXQgZTcyZTJjMDA4Yzk1MWZhNWQwN2FiYWFkOWQzMmU4Nzc4NzllMmVhN1xuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBGcmkgQXVnIDcgMDg6NTA6NDAgMjAyNiArMDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2JwZi5oIGIvaW5jbHVkZS9saW51eC9icGYuaFxuaW5kZXggNzNiYWNmYzY0NDRkZi4uZDYzY2U4MzE5ODY5NiAxMDA2NDRcbi0tLSBhL2luY2x1ZGUvbGludXgvYnBmLmhcbisrKyBiL2luY2x1ZGUvbGludXgvYnBmLmhcbkBAIC0yMTMsNiArMjEzLDcgQEAgZW51bSBidGZfZmllbGRfdHlwZSB7XG4gXHRCUEZfVVBUUiAgICAgICA9ICgxIFx1MDAzY1x1MDAzYyAxMSksXG4gXHRCUEZfUkVTX1NQSU5fTE9DSyA9ICgxIFx1MDAzY1x1MDAzYyAxMiksXG4gXHRCUEZfVEFTS19XT1JLICA9ICgxIFx1MDAzY1x1MDAzYyAxMyksXG4rXHRCUEZfVEhSRUFEX1dRICA9ICgxIFx1MDAzY1x1MDAzYyAxNCksXG4gfTtcbiBcbiBlbnVtIGJwZl9jZ3JvdXBfc3RvcmFnZV90eXBlIHtcbkBAIC0yNjcsNiArMjY4LDcgQEAgc3RydWN0IGJ0Zl9yZWNvcmQge1xuIFx0aW50IHdxX29mZjtcbiBcdGludCByZWZjb3VudF9vZmY7XG4gXHRpbnQgdGFza193b3JrX29mZjtcbitcdGludCB0aHJlYWRfd3Ffb2ZmO1xuIFx0c3RydWN0IGJ0Zl9maWVsZCBmaWVsZHNbXTtcbiB9O1xuIFxuQEAgLTM3Miw2ICszNzQsOCBAQCBzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIgKmJ0Zl9maWVsZF90eXBlX25hbWUoZW51bSBidGZfZmllbGRfdHlwZSB0eXBlKVxuIFx0XHRyZXR1cm4gXCJicGZfcmVmY291bnRcIjtcbiBcdGNhc2UgQlBGX1RBU0tfV09SSzpcbiBcdFx0cmV0dXJuIFwiYnBmX3Rhc2tfd29ya1wiO1xuK1x0Y2FzZSBCUEZfVEhSRUFEX1dROlxuK1x0XHRyZXR1cm4gXCJicGZfdGhyZWFkX3dxXCI7XG4gXHRkZWZhdWx0OlxuIFx0XHRXQVJOX09OX09OQ0UoMSk7XG4gXHRcdHJldHVybiBcInVua25vd25cIjtcbkBAIC00MTIsNiArNDE2LDggQEAgc3RhdGljIGlubGluZSB1MzIgYnRmX2ZpZWxkX3R5cGVfc2l6ZShlbnVtIGJ0Zl9maWVsZF90eXBlIHR5cGUpXG4gXHRcdHJldHVybiBzaXplb2Yoc3RydWN0IGJwZl9yZWZjb3VudCk7XG4gXHRjYXNlIEJQRl9UQVNLX1dPUks6XG4gXHRcdHJldHVybiBzaXplb2Yoc3RydWN0IGJwZl90YXNrX3dvcmspO1xuK1x0Y2FzZSBCUEZfVEhSRUFEX1dROlxuK1x0XHRyZXR1cm4gc2l6ZW9mKHN0cnVjdCBicGZfdGhyZWFkX3dxKTtcbiBcdGRlZmF1bHQ6XG4gXHRcdFdBUk5fT05fT05DRSgxKTtcbiBcdFx0cmV0dXJuIDA7XG5AQCAtNDQ2LDYgKzQ1Miw4IEBAIHN0YXRpYyBpbmxpbmUgdTMyIGJ0Zl9maWVsZF90eXBlX2FsaWduKGVudW0gYnRmX2ZpZWxkX3R5cGUgdHlwZSlcbiBcdFx0cmV0dXJuIF9fYWxpZ25vZl9fKHN0cnVjdCBicGZfcmVmY291bnQpO1xuIFx0Y2FzZSBCUEZfVEFTS19XT1JLOlxuIFx0XHRyZXR1cm4gX19hbGlnbm9mX18oc3RydWN0IGJwZl90YXNrX3dvcmspO1xuK1x0Y2FzZSBCUEZfVEhSRUFEX1dROlxuK1x0XHRyZXR1cm4gX19hbGlnbm9mX18oc3RydWN0IGJwZl90aHJlYWRfd3EpO1xuIFx0ZGVmYXVsdDpcbiBcdFx0V0FSTl9PTl9PTkNFKDEpO1xuIFx0XHRyZXR1cm4gMDtcbkBAIC00NzgsNiArNDg2LDcgQEAgc3RhdGljIGlubGluZSB2b2lkIGJwZl9vYmpfaW5pdF9maWVsZChjb25zdCBzdHJ1Y3QgYnRmX2ZpZWxkICpmaWVsZCwgdm9pZCAqYWRkcilcbiBcdGNhc2UgQlBGX0tQVFJfUEVSQ1BVOlxuIFx0Y2FzZSBCUEZfVVBUUjpcbiBcdGNhc2UgQlBGX1RBU0tfV09SSzpcbitcdGNhc2UgQlBGX1RIUkVBRF9XUTpcbiBcdFx0YnJlYWs7XG4gXHRkZWZhdWx0OlxuIFx0XHRXQVJOX09OX09OQ0UoMSk7XG5AQCAtNTAyLDYgKzUxMSw3IEBAIHN0YXRpYyBpbmxpbmUgYm9vbCBidGZfZmllbGRfaXNfbm1pX3NhZmUoZW51bSBidGZfZmllbGRfdHlwZSB0eXBlKVxuIFx0Y2FzZSBCUEZfVEFTS19XT1JLOlxuIFx0Y2FzZSBCUEZfS1BUUl9VTlJFRjpcbiBcdGNhc2UgQlBGX1JFRkNPVU5UOlxuK1x0Y2FzZSBCUEZfVEhSRUFEX1dROlxuIFx0XHRyZXR1cm4gdHJ1ZTtcbiBcdGRlZmF1bHQ6XG4gXHRcdHJldHVybiBmYWxzZTtcbkBAIC02NDQsNiArNjU0LDcgQEAgdm9pZCBjb3B5X21hcF92YWx1ZV9sb2NrZWQoc3RydWN0IGJwZl9tYXAgKm1hcCwgdm9pZCAqZHN0LCB2b2lkICpzcmMsXG4gdm9pZCBicGZfdGltZXJfY2FuY2VsX2FuZF9mcmVlKHZvaWQgKnRpbWVyKTtcbiB2b2lkIGJwZl93cV9jYW5jZWxfYW5kX2ZyZWUodm9pZCAqdGltZXIpO1xuIHZvaWQgYnBmX3Rhc2tfd29ya19jYW5jZWxfYW5kX2ZyZWUodm9pZCAqdGltZXIpO1xuK3ZvaWQgYnBmX3RocmVhZF93cV9jYW5jZWxfYW5kX2ZyZWUodm9pZCAqdmFsKTtcbiB2b2lkIGJwZl9saXN0X2hlYWRfZnJlZShjb25zdCBzdHJ1Y3QgYnRmX2ZpZWxkICpmaWVsZCwgdm9pZCAqbGlzdF9oZWFkLFxuIFx0XHRcdHN0cnVjdCBicGZfc3Bpbl9sb2NrICpzcGluX2xvY2spO1xuIHZvaWQgYnBmX3JiX3Jvb3RfZnJlZShjb25zdCBzdHJ1Y3QgYnRmX2ZpZWxkICpmaWVsZCwgdm9pZCAqcmJfcm9vdCxcbkBAIC03MDEsNyArNzEyLDggQEAgYm9vbCBicGZfbWFwX21ldGFfZXF1YWwoY29uc3Qgc3RydWN0IGJwZl9tYXAgKm1ldGEwLFxuIFxuIHN0YXRpYyBpbmxpbmUgYm9vbCBicGZfbWFwX2hhc19pbnRlcm5hbF9zdHJ1Y3RzKHN0cnVjdCBicGZfbWFwICptYXApXG4ge1xuLVx0cmV0dXJuIGJ0Zl9yZWNvcmRfaGFzX2ZpZWxkKG1hcC1cdTAwM2VyZWNvcmQsIEJQRl9USU1FUiB8IEJQRl9XT1JLUVVFVUUgfCBCUEZfVEFTS19XT1JLKTtcbitcdHJldHVybiBidGZfcmVjb3JkX2hhc19maWVsZChtYXAtXHUwMDNlcmVjb3JkLCBCUEZfVElNRVIgfCBCUEZfV09SS1FVRVVFIHxcbitcdFx0XHRcdFx0XHQgQlBGX1RBU0tfV09SSyB8IEJQRl9USFJFQURfV1EpO1xuIH1cbiBcbiB2b2lkIGJwZl9tYXBfZnJlZV9pbnRlcm5hbF9zdHJ1Y3RzKHN0cnVjdCBicGZfbWFwICptYXAsIHZvaWQgKm9iaik7XG5AQCAtMjcyNSw2ICsyNzM3LDcgQEAgYm9vbCBidGZfcmVjb3JkX2VxdWFsKGNvbnN0IHN0cnVjdCBidGZfcmVjb3JkICpyZWNfYSwgY29uc3Qgc3RydWN0IGJ0Zl9yZWNvcmQgKnJcbiB2b2lkIGJwZl9vYmpfZnJlZV90aW1lcihjb25zdCBzdHJ1Y3QgYnRmX3JlY29yZCAqcmVjLCB2b2lkICpvYmopO1xuIHZvaWQgYnBmX29ial9mcmVlX3dvcmtxdWV1ZShjb25zdCBzdHJ1Y3QgYnRmX3JlY29yZCAqcmVjLCB2b2lkICpvYmopO1xuIHZvaWQgYnBmX29ial9mcmVlX3Rhc2tfd29yayhjb25zdCBzdHJ1Y3QgYnRmX3JlY29yZCAqcmVjLCB2b2lkICpvYmopO1xuK3ZvaWQgYnBmX29ial9mcmVlX3RocmVhZF93cShjb25zdCBzdHJ1Y3QgYnRmX3JlY29yZCAqcmVjLCB2b2lkICpvYmopO1xuIHZvaWQgYnBmX29ial9jYW5jZWxfZmllbGRzKHN0cnVjdCBicGZfbWFwICptYXAsIHZvaWQgKm9iaik7XG4gdm9pZCBicGZfb2JqX2ZyZWVfZmllbGRzKGNvbnN0IHN0cnVjdCBidGZfcmVjb3JkICpyZWMsIHZvaWQgKm9iaik7XG4gdm9pZCBfX2JwZl9vYmpfZHJvcF9pbXBsKHZvaWQgKnAsIGNvbnN0IHN0cnVjdCBidGZfcmVjb3JkICpyZWMsIGJvb2wgcGVyY3B1KTtcbmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2Nncm91cC5oIGIvaW5jbHVkZS9saW51eC9jZ3JvdXAuaFxuaW5kZXggZjJhYTQ2YTRmODcxZS4uOWI0YThkYzc0OGFjZSAxMDA2NDRcbi0tLSBhL2luY2x1ZGUvbGludXgvY2dyb3VwLmhcbisrKyBiL2luY2x1ZGUvbGludXgvY2dyb3VwLmhcbkBAIC05MjMsNCArOTIzLDYgQEAgc3RydWN0IGNncm91cCAqdGFza19nZXRfY2dyb3VwMShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywgaW50IGhpZXJhcmNoeV9pZCk7XG4gXG4gc3RydWN0IGNncm91cF9vZl9wZWFrICpvZl9wZWFrKHN0cnVjdCBrZXJuZnNfb3Blbl9maWxlICpvZik7XG4gXG4raW50IGNncm91cF9rdGhyZWFkX2F0dGFjaChzdHJ1Y3QgY2dyb3VwICpjZ3JwLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spO1xuK1xuICNlbmRpZiAvKiBfTElOVVhfQ0dST1VQX0ggKi9cbmRpZmYgLS1naXQgYS9pbmNsdWRlL3VhcGkvbGludXgvYnBmLmggYi9pbmNsdWRlL3VhcGkvbGludXgvYnBmLmhcbmluZGV4IGZmZDk2ZThiOTIwYmQuLjA1NTg1MjBmNjdmZTQgMTAwNjQ0XG4tLS0gYS9pbmNsdWRlL3VhcGkvbGludXgvYnBmLmhcbisrKyBiL2luY2x1ZGUvdWFwaS9saW51eC9icGYuaFxuQEAgLTc1NzQsNiArNzU3NCwxMCBAQCBzdHJ1Y3QgYnBmX3dxIHtcbiBcdF9fdTY0IF9fb3BhcXVlWzJdO1xuIH0gX19hdHRyaWJ1dGVfXygoYWxpZ25lZCg4KSkpO1xuIFxuK3N0cnVjdCBicGZfdGhyZWFkX3dxIHtcbitcdF9fdTY0IF9fb3BhcXVlWzJdO1xuK30gX19hdHRyaWJ1dGVfXygoYWxpZ25lZCg4KSkpO1xuK1xuIHN0cnVjdCBicGZfZHlucHRyIHtcbiBcdF9fdTY0IF9fb3BhcXVlWzJdO1xuIH0gX19hdHRyaWJ1dGVfXygoYWxpZ25lZCg4KSkpO1xuZGlmZiAtLWdpdCBhL2tlcm5lbC9icGYvYnRmLmMgYi9rZXJuZWwvYnBmL2J0Zi5jXG5pbmRleCA0MjQxNDYzM2NmMjYzLi5iZjZmYjVmNTFkMjFhIDEwMDY0NFxuLS0tIGEva2VybmVsL2JwZi9idGYuY1xuKysrIGIva2VybmVsL2JwZi9idGYuY1xuQEAgLTM2NjUsNiArMzY2NSw3IEBAIHN0YXRpYyBpbnQgYnRmX2dldF9maWVsZF90eXBlKGNvbnN0IHN0cnVjdCBidGYgKmJ0ZiwgY29uc3Qgc3RydWN0IGJ0Zl90eXBlICp2YXJfXG4gXHRcdHsgQlBGX1RJTUVSLCBcImJwZl90aW1lclwiLCB0cnVlIH0sXG4gXHRcdHsgQlBGX1dPUktRVUVVRSwgXCJicGZfd3FcIiwgdHJ1ZSB9LFxuIFx0XHR7IEJQRl9UQVNLX1dPUkssIFwiYnBmX3Rhc2tfd29ya1wiLCB0cnVlIH0sXG4rXHRcdHsgQlBGX1RIUkVBRF9XUSwgXCJicGZfdGhyZWFkX3dxXCIsIHRydWUgfSxcbiBcdFx0eyBCUEZfTElTVF9IRUFELCBcImJwZl9saXN0X2hlYWRcIiwgZmFsc2UgfSxcbiBcdFx0eyBCUEZfTElTVF9OT0RFLCBcImJwZl9saXN0X25vZGVcIiwgZmFsc2UgfSxcbiBcdFx0eyBCUEZfUkJfUk9PVCwgXCJicGZfcmJfcm9vdFwiLCBmYWxzZSB9LFxuQEAgLTM4NTAsNiArMzg1MSw3IEBAIHN0YXRpYyBpbnQgYnRmX2ZpbmRfZmllbGRfb25lKGNvbnN0IHN0cnVjdCBidGYgKmJ0ZixcbiBcdGNhc2UgQlBGX1JCX05PREU6XG4gXHRjYXNlIEJQRl9SRUZDT1VOVDpcbiBcdGNhc2UgQlBGX1RBU0tfV09SSzpcbitcdGNhc2UgQlBGX1RIUkVBRF9XUTpcbiBcdFx0cmV0ID0gYnRmX2ZpbmRfc3RydWN0KGJ0ZiwgdmFyX3R5cGUsIG9mZiwgc3osIGZpZWxkX3R5cGUsXG4gXHRcdFx0XHQgICAgICBpbmZvX2NudCA/IFx1MDAyNmluZm9bMF0gOiBcdTAwMjZ0bXApO1xuIFx0XHRpZiAocmV0IFx1MDAzYyAwKVxuQEAgLTQxNDUsNiArNDE0Nyw3IEBAIHN0cnVjdCBidGZfcmVjb3JkICpidGZfcGFyc2VfZmllbGRzKGNvbnN0IHN0cnVjdCBidGYgKmJ0ZiwgY29uc3Qgc3RydWN0IGJ0Zl90eXBlXG4gXHRyZWMtXHUwMDNld3Ffb2ZmID0gLUVJTlZBTDtcbiBcdHJlYy1cdTAwM2VyZWZjb3VudF9vZmYgPSAtRUlOVkFMO1xuIFx0cmVjLVx1MDAzZXRhc2tfd29ya19vZmYgPSAtRUlOVkFMO1xuK1x0cmVjLVx1MDAzZXRocmVhZF93cV9vZmYgPSAtRUlOVkFMO1xuIFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgY250OyBpKyspIHtcbiBcdFx0ZmllbGRfdHlwZV9zaXplID0gYnRmX2ZpZWxkX3R5cGVfc2l6ZShpbmZvX2FycltpXS50eXBlKTtcbiBcdFx0aWYgKGluZm9fYXJyW2ldLm9mZiArIGZpZWxkX3R5cGVfc2l6ZSBcdTAwM2UgdmFsdWVfc2l6ZSkge1xuQEAgLTQxODgsNiArNDE5MSwxMCBAQCBzdHJ1Y3QgYnRmX3JlY29yZCAqYnRmX3BhcnNlX2ZpZWxkcyhjb25zdCBzdHJ1Y3QgYnRmICpidGYsIGNvbnN0IHN0cnVjdCBidGZfdHlwZVxuIFx0XHRcdFdBUk5fT05fT05DRShyZWMtXHUwMDNldGFza193b3JrX29mZiBcdTAwM2U9IDApO1xuIFx0XHRcdHJlYy1cdTAwM2V0YXNrX3dvcmtfb2ZmID0gcmVjLVx1MDAzZWZpZWxkc1tpXS5vZmZzZXQ7XG4gXHRcdFx0YnJlYWs7XG4rXHRcdGNhc2UgQlBGX1RIUkVBRF9XUTpcbitcdFx0XHRXQVJOX09OX09OQ0UocmVjLVx1MDAzZXRocmVhZF93cV9vZmYgXHUwMDNlPSAwKTtcbitcdFx0XHRyZWMtXHUwMDNldGhyZWFkX3dxX29mZiA9IHJlYy1cdTAwM2VmaWVsZHNbaV0ub2Zmc2V0O1xuK1x0XHRcdGJyZWFrO1xuIFx0XHRjYXNlIEJQRl9SRUZDT1VOVDpcbiBcdFx0XHRXQVJOX09OX09OQ0UocmVjLVx1MDAzZXJlZmNvdW50X29mZiBcdTAwM2U9IDApO1xuIFx0XHRcdC8qIENhY2hlIG9mZnNldCBmb3IgZmFzdGVyIGxvb2t1cCBhdCBydW50aW1lICovXG5kaWZmIC0tZ2l0IGEva2VybmVsL2JwZi9oZWxwZXJzLmMgYi9rZXJuZWwvYnBmL2hlbHBlcnMuY1xuaW5kZXggNjM4OGI2YjIzZTQ5MC4uOGUwMWJhZDFiMTZhMCAxMDA2NDRcbi0tLSBhL2tlcm5lbC9icGYvaGVscGVycy5jXG4rKysgYi9rZXJuZWwvYnBmL2hlbHBlcnMuY1xuQEAgLTI5LDYgKzI5LDggQEBcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC90YXNrX3dvcmsuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L2lycV93b3JrLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9idWlsZGlkLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9rdGhyZWFkLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9qaGFzaC5oXHUwMDNlXG4gXG4gI2luY2x1ZGUgXCIuLi8uLi9saWIva3N0cnRveC5oXCJcbiBcbkBAIC0xMTEwLDYgKzExMTIsMTcgQEAgc3RhdGljIHZvaWQgKm1hcF9rZXlfZnJvbV92YWx1ZShzdHJ1Y3QgYnBmX21hcCAqbWFwLCB2b2lkICp2YWx1ZSwgdTMyICphcnJfaWR4KVxuIFx0cmV0dXJuICh2b2lkICopdmFsdWUgLSByb3VuZF91cChtYXAtXHUwMDNla2V5X3NpemUsIDgpO1xuIH1cbiBcbitzdGF0aWMgdTMyIGJwZl9tYXBfZWxlbV9pZF9mcm9tX3ZhbHVlKHN0cnVjdCBicGZfbWFwICptYXAsIHZvaWQgKnZhbHVlKVxuK3tcbitcdHUzMiBhcnJfaWR4O1xuK1x0dm9pZCAqa2V5O1xuK1xuK1x0a2V5ID0gbWFwX2tleV9mcm9tX3ZhbHVlKG1hcCwgdmFsdWUsIFx1MDAyNmFycl9pZHgpO1xuK1x0aWYgKG1hcC1cdTAwM2VtYXBfdHlwZSA9PSBCUEZfTUFQX1RZUEVfQVJSQVkpXG4rXHRcdHJldHVybiBhcnJfaWR4O1xuK1x0cmV0dXJuIGpoYXNoKGtleSwgbWFwLVx1MDAzZWtleV9zaXplLCAwKTtcbit9XG4rXG4gZW51bSBicGZfYXN5bmNfdHlwZSB7XG4gXHRCUEZfQVNZTkNfVFlQRV9USU1FUiA9IDAsXG4gXHRCUEZfQVNZTkNfVFlQRV9XUSxcbkBAIC00NzY5LDYgKzQ3ODIsMzk3IEBAIF9fYnBmX2tmdW5jIGludCBicGZfdGltZXJfY2FuY2VsX2FzeW5jKHN0cnVjdCBicGZfdGltZXIgKnRpbWVyKVxuIFx0fVxuIH1cbiBcbisvKlxuKyAqIEJQRiB0aHJlYWQgd29ya3F1ZXVlIChrdGhyZWFkX3dvcmtlciBiYXNlZCkgaW1wbGVtZW50YXRpb25cbisgKlxuKyAqIFdoeSBicGZfdGhyZWFkX3dxIGRvZXMgTk9UIHVzZSB0aGUgYnBmX2FzeW5jIGluZnJhc3RydWN0dXJlOlxuKyAqXG4rICogYnBmX3RpbWVyIGFuZCBicGZfd3Egc2hhcmUgYSBjb21tb24gY2xlYW51cCBwYXRoIHZpYSBicGZfYXN5bmM6XG4rICpcbisgKiAgIGJwZl9hc3luY19jYW5jZWxfYW5kX2ZyZWUoKVxuKyAqICAgICAtXHUwMDNlIGJwZl9hc3luY19zY2hlZHVsZV9vcCgpXG4rICogICAgICAgLVx1MDAzZSBpcnFfd29ya19xdWV1ZSgpICAgICAgICAgICAgICAgIC8vIHNjaGVkdWxlIGZyb20gYW55IGNvbnRleHRcbisgKiAgICAgICAgIC1cdTAwM2UgYnBmX2FzeW5jX3Byb2Nlc3Nfb3AoKSAgICAgICAgLy8gcnVucyBpbiBoYXJkaXJxIGNvbnRleHRcbisgKiAgICAgICAgICAgLVx1MDAzZSBicGZfd3Ffd29yaygpIC8gdGltZXIgY2IgICAgLy8gYXRvbWljLCBub24tc2xlZXBhYmxlXG4rICpcbisgKiBUaGlzIHdvcmtzIGZvciB0aW1lciBhbmQgd29ya3F1ZXVlIGJlY2F1c2UgdGhlaXIgY2FsbGJhY2tzIGFuZFxuKyAqIGNhbmNlbGxhdGlvbiAoaHJ0aW1lcl9jYW5jZWwgLyBicGZfd3FfY2FuY2VsX2FuZF9mcmVlKSBjb21wbGV0ZVxuKyAqIHN5bmNocm9ub3VzbHkgYW5kIG5lZWQgbm90IHNsZWVwLiAgVGhlIGhhcmRpcnEgY29udGV4dCBpcyBzdWZmaWNpZW50LlxuKyAqXG4rICogYnBmX3RocmVhZF93cSBpcyBkaWZmZXJlbnQ6IGNhbmNlbGxhdGlvbiBhbmQgZmluYWwgY2xlYW51cCBtYXkgbmVlZCB0b1xuKyAqIHNsZWVwOlxuKyAqXG4rICogICBrdGhyZWFkX2NhbmNlbF93b3JrX3N5bmMoKSAgICAtIHdhaXRzIGZvciB0aGUgd29yayB0byBmaW5pc2gsIGNhblxuKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NoZWR1bGUgb3V0IGlmIHRoZSB3b3JrIGlzIHJ1bm5pbmcuXG4rICogICBrdGhyZWFkX2Rlc3Ryb3lfd29ya2VyKCkgICAgICAtIHN0b3BzIHRoZSBrdGhyZWFkLCBpbnRlcm5hbGx5XG4rICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZXMgd2l0aCBrdGhyZWFkIGV4aXQuXG4rICogICBjZ3JvdXBfcHV0KCkgKGZpbmFsIHB1dCkgICAgICAtIG1heSBhY3F1aXJlIGNncm91cF9tdXRleCBhbmQgb3RoZXJcbisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsZWVwaW5nIGxvY2tzIGR1cmluZyBvZmZsaW5lLlxuKyAqXG4rICogTm9uZSBvZiB0aGVzZSBjYW4gYmUgY2FsbGVkIGZyb20gaGFyZGlycSBjb250ZXh0IChpcnFfd29yaykuIERvaW5nIHNvXG4rICogd291bGQgdHJpZ2dlciBtaWdodF9zbGVlcCgpIHdhcm5pbmdzIG9yIGRlYWRsb2NrLlxuKyAqXG4rICogVGhlcmVmb3JlIGJwZl90aHJlYWRfd3EgaW1wbGVtZW50cyBpdHMgb3duIFJDVS1iYXNlZCBjbGVhbnVwOlxuKyAqXG4rICogICBicGZfdGhyZWFkX3dxX2NhbmNlbF9hbmRfZnJlZSgpICAgICAgICAvLyBzbGVlcGFibGUgKGNhbGxlZCBmcm9tXG4rICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtYXAgZnJlZSAvIGVsZW0gZGVsZXRlKVxuKyAqICAgICAtXHUwMDNlIHhjaGcoY3R4LCBOVUxMKSAgICAgICAgICAgICAgICAgICAvLyBkZXRhY2ggYXRvbWljYWxseVxuKyAqICAgICAtXHUwMDNlIGt0aHJlYWRfY2FuY2VsX3dvcmtfc3luYygpICAgICAgICAvLyBvayB0byBzbGVlcFxuKyAqICAgICAtXHUwMDNlIGJwZl90aHJlYWRfd3FfY3R4X3B1dCgpXG4rICogICAgICAgLVx1MDAzZSBjYWxsX3JjdV90YXNrc190cmFjZSgpICAgICAgICAgIC8vIHdhaXQgZm9yIEJQRiBjYWxsYmFja3NcbisgKiAgICAgICAgIC1cdTAwM2Ugc2NoZWR1bGVfd29yaygpICAgICAgICAgICAgICAgLy8gc3dpdGNoIHRvIHNsZWVwYWJsZSBjb250ZXh0XG4rICogICAgICAgICAgIC1cdTAwM2UgYnBmX3RocmVhZF93cV9kZXN0cm95X3dvcmtfZm4oKVxuKyAqICAgICAgICAgICAgIC1cdTAwM2UgYnBmX3Byb2dfcHV0KClcbisgKiAgICAgICAgICAgICAtXHUwMDNlIGNncm91cF9wdXQoKVxuKyAqICAgICAgICAgICAgIC1cdTAwM2Uga3RocmVhZF9kZXN0cm95X3dvcmtlcigpXG4rICogICAgICAgICAgICAgLVx1MDAzZSBrZnJlZShjdHgpXG4rICpcbisgKiBUaGUgc2FtZSBkZXNpZ24gY2hvaWNlIHdhcyBtYWRlIGZvciBicGZfdGFza193b3JrLCB3aGljaCBhbHNvIGF2b2lkc1xuKyAqIGJwZl9hc3luYyBiZWNhdXNlIHRhc2tfd29yayBjYW5jZWxsYXRpb24gc3luY2hyb25pemVzIHdpdGggdGhlIHRhc2tcbisgKiBhbmQgbWF5IHNsZWVwLlxuKyAqL1xuK1xuK3N0cnVjdCBicGZfdGhyZWFkX3dxX2N0eCB7XG4rXHRzdHJ1Y3Qga3RocmVhZF93b3JrZXIgKndvcmtlcjtcbitcdHN0cnVjdCBrdGhyZWFkX3dvcmsgd29yaztcbitcdHN0cnVjdCBicGZfcHJvZyAqcHJvZztcbitcdGJwZl9jYWxsYmFja190IGNhbGxiYWNrX2ZuO1xuK1x0c3RydWN0IGJwZl9tYXAgKm1hcDtcbitcdHZvaWQgKnZhbHVlO1xuK1x0c3RydWN0IGNncm91cCAqY2dycDtcbitcdHJlZmNvdW50X3QgcmVmY250O1xuK1x0c3RydWN0IHJjdV9oZWFkIHJjdTtcbitcdHN0cnVjdCB3b3JrX3N0cnVjdCBkZXN0cm95X3dvcms7XG4rfTtcbitcbisvKiBLZXJuZWwtaW50ZXJuYWwgcmVwcmVzZW50YXRpb24gdGhhdCBmaXRzIGluIHN0cnVjdCBicGZfdGhyZWFkX3dxICovXG4rc3RydWN0IGJwZl90aHJlYWRfd3Ffa2VybiB7XG4rXHRzdHJ1Y3QgYnBmX3RocmVhZF93cV9jdHggKmN0eDtcbit9IF9fYWxpZ25lZCg4KTtcbitcbitzdGF0aWMgdm9pZCBicGZfdGhyZWFkX3dxX2Rlc3Ryb3lfd29ya19mbihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspXG4re1xuK1x0c3RydWN0IGJwZl90aHJlYWRfd3FfY3R4ICpjdHggPSBjb250YWluZXJfb2Yod29yayxcbitcdFx0XHRcdFx0XHQgICAgIHN0cnVjdCBicGZfdGhyZWFkX3dxX2N0eCxcbitcdFx0XHRcdFx0XHQgICAgIGRlc3Ryb3lfd29yayk7XG4rXG4rXHRpZiAoY3R4LVx1MDAzZXByb2cpXG4rXHRcdGJwZl9wcm9nX3B1dChjdHgtXHUwMDNlcHJvZyk7XG4rXHRpZiAoY3R4LVx1MDAzZWNncnApXG4rXHRcdGNncm91cF9wdXQoY3R4LVx1MDAzZWNncnApO1xuK1x0aWYgKGN0eC1cdTAwM2V3b3JrZXIpXG4rXHRcdGt0aHJlYWRfZGVzdHJveV93b3JrZXIoY3R4LVx1MDAzZXdvcmtlcik7XG4rXHRrZnJlZShjdHgpO1xuK31cbitcbitzdGF0aWMgdm9pZCBicGZfdGhyZWFkX3dxX2N0eF9mcmVlX3JjdShzdHJ1Y3QgcmN1X2hlYWQgKnJjdSlcbit7XG4rXHRzdHJ1Y3QgYnBmX3RocmVhZF93cV9jdHggKmN0eCA9IGNvbnRhaW5lcl9vZihyY3UsXG4rXHRcdFx0XHRcdFx0ICAgICBzdHJ1Y3QgYnBmX3RocmVhZF93cV9jdHgsXG4rXHRcdFx0XHRcdFx0ICAgICByY3UpO1xuK1xuK1x0SU5JVF9XT1JLKFx1MDAyNmN0eC1cdTAwM2VkZXN0cm95X3dvcmssIGJwZl90aHJlYWRfd3FfZGVzdHJveV93b3JrX2ZuKTtcbitcdHNjaGVkdWxlX3dvcmsoXHUwMDI2Y3R4LVx1MDAzZWRlc3Ryb3lfd29yayk7XG4rfVxuK1xuK3N0YXRpYyB2b2lkIGJwZl90aHJlYWRfd3FfY3R4X3B1dChzdHJ1Y3QgYnBmX3RocmVhZF93cV9jdHggKmN0eClcbit7XG4rXHRpZiAoIXJlZmNvdW50X2RlY19hbmRfdGVzdChcdTAwMjZjdHgtXHUwMDNlcmVmY250KSlcbitcdFx0cmV0dXJuO1xuK1x0Y2FsbF9yY3VfdGFza3NfdHJhY2UoXHUwMDI2Y3R4LVx1MDAzZXJjdSwgYnBmX3RocmVhZF93cV9jdHhfZnJlZV9yY3UpO1xuK31cbitcbitzdGF0aWMgdm9pZCBicGZfdGhyZWFkX3dxX3dvcmtfZm4oc3RydWN0IGt0aHJlYWRfd29yayAqd29yaylcbit7XG4rXHRzdHJ1Y3QgYnBmX3RocmVhZF93cV9jdHggKmN0eCA9IGNvbnRhaW5lcl9vZih3b3JrLFxuK1x0XHRcdFx0XHRcdCAgICAgc3RydWN0IGJwZl90aHJlYWRfd3FfY3R4LFxuK1x0XHRcdFx0XHRcdCAgICAgd29yayk7XG4rXHRicGZfY2FsbGJhY2tfdCBjYWxsYmFja19mbjtcbitcdHZvaWQgKnZhbHVlID0gY3R4LVx1MDAzZXZhbHVlO1xuK1x0c3RydWN0IGJwZl9tYXAgKm1hcCA9IGN0eC1cdTAwM2VtYXA7XG4rXHR2b2lkICprZXk7XG4rXHR1MzIgaWR4O1xuK1xuK1x0QlRGX1RZUEVfRU1JVChzdHJ1Y3QgYnBmX3RocmVhZF93cSk7XG4rXG4rXHRjYWxsYmFja19mbiA9IFJFQURfT05DRShjdHgtXHUwMDNlY2FsbGJhY2tfZm4pO1xuK1x0aWYgKCFjYWxsYmFja19mbilcbitcdFx0Z290byBvdXQ7XG4rXHRrZXkgPSBtYXBfa2V5X2Zyb21fdmFsdWUobWFwLCB2YWx1ZSwgXHUwMDI2aWR4KTtcbitcbitcdHJjdV9yZWFkX2xvY2tfdHJhY2UoKTtcbitcdG1pZ3JhdGVfZGlzYWJsZSgpO1xuK1xuK1x0Y2FsbGJhY2tfZm4gPSBSRUFEX09OQ0UoY3R4LVx1MDAzZWNhbGxiYWNrX2ZuKTtcbitcdGlmIChjYWxsYmFja19mbilcbitcdFx0Y2FsbGJhY2tfZm4oKHU2NCkobG9uZyltYXAsICh1NjQpKGxvbmcpa2V5LCAodTY0KShsb25nKXZhbHVlLFxuK1x0XHRcdCAgICAwLCAwKTtcbitcbitcdG1pZ3JhdGVfZW5hYmxlKCk7XG4rXHRyY3VfcmVhZF91bmxvY2tfdHJhY2UoKTtcbitcbitvdXQ6XG4rXHRicGZfdGhyZWFkX3dxX2N0eF9wdXQoY3R4KTtcbit9XG4rXG4rLypcbisgKiBicGZfdGhyZWFkX3dxX2luaXQoKSBjcmVhdGVzIGEga3RocmVhZCB3b3JrZXIgYW5kIG1heSBhdHRhY2ggaXQgdG8gYSBjZ3JvdXAuXG4rICogVGhlIGhlbHBlcnMgdXNlZCBoZXJlIGNhbiBzbGVlcCBhbmQgYWNxdWlyZSBzZXZlcmFsIGxvY2tzIHRocm91Z2gga3RocmVhZFxuKyAqIGNyZWF0aW9uL2Rlc3RydWN0aW9uLCBjZ3JvdXAgbG9va3VwIGFuZCBjZ3JvdXAga3RocmVhZCBhdHRhY2htZW50LiBLZWVwIHRoaXNcbisgKiBrZnVuYyBhdmFpbGFibGUgb25seSB0byBCUEZfUFJPR19UWVBFX1NZU0NBTEwgcHJvZ3JhbXMgc28gaXQgaXMgbm90IGludm9rZWRcbisgKiBmcm9tIEJQRiBwcm9ncmFtIGNvbnRleHRzIHRoYXQgYWxyZWFkeSBob2xkIGxvY2tzIHdoaWNoIGNvdWxkIGRlYWRsb2NrIHdpdGhcbisgKiB0aG9zZSBwYXRocy5cbisgKi9cbitfX2JwZl9rZnVuYyBpbnQgYnBmX3RocmVhZF93cV9pbml0KHN0cnVjdCBicGZfdGhyZWFkX3dxICp0d3EsIHZvaWQgKnBfX21hcCxcbitcdFx0XHRcdCAgIHU2NCBjZ3JvdXBfaWQsIHVuc2lnbmVkIGludCBmbGFncylcbit7XG4rXHRzdHJ1Y3QgYnBmX3RocmVhZF93cV9rZXJuICp0d2sgPSAoc3RydWN0IGJwZl90aHJlYWRfd3Ffa2VybiAqKXR3cTtcbitcdHN0cnVjdCBicGZfbWFwICptYXAgPSBwX19tYXA7XG4rXHRzdHJ1Y3QgYnBmX3RocmVhZF93cV9jdHggKmN0eCwgKm9sZF9jdHg7XG4rXHRzdHJ1Y3Qga3RocmVhZF93b3JrZXIgKndvcmtlcjtcbitcdHN0cnVjdCBjZ3JvdXAgKmNncnAgPSBOVUxMO1xuK1x0dm9pZCAqdmFsdWU7XG4rXHR1MzIgZWxlbV9pZDtcbitcdGludCBlcnI7XG4rXG4rXHRCVUlMRF9CVUdfT04oc2l6ZW9mKHN0cnVjdCBicGZfdGhyZWFkX3dxX2tlcm4pXG4rXHRcdFx0XHUwMDNlIHNpemVvZihzdHJ1Y3QgYnBmX3RocmVhZF93cSkpO1xuK1x0QlVJTERfQlVHX09OKF9fYWxpZ25vZl9fKHN0cnVjdCBicGZfdGhyZWFkX3dxX2tlcm4pXG4rXHRcdFx0IT0gX19hbGlnbm9mX18oc3RydWN0IGJwZl90aHJlYWRfd3EpKTtcbitcbitcdGlmIChmbGFncylcbitcdFx0cmV0dXJuIC1FSU5WQUw7XG4rXG4rXHRvbGRfY3R4ID0gUkVBRF9PTkNFKHR3ay1cdTAwM2VjdHgpO1xuK1x0aWYgKG9sZF9jdHgpXG4rXHRcdHJldHVybiAtRUJVU1k7XG4rXG4rXHR2YWx1ZSA9ICh2b2lkICopdHdxIC0gbWFwLVx1MDAzZXJlY29yZC1cdTAwM2V0aHJlYWRfd3Ffb2ZmO1xuK1x0ZWxlbV9pZCA9IGJwZl9tYXBfZWxlbV9pZF9mcm9tX3ZhbHVlKG1hcCwgdmFsdWUpO1xuK1x0d29ya2VyID0ga3RocmVhZF9ydW5fd29ya2VyKDAsIFwiYnBmX3R3cS8lZC8leFwiLCBtYXAtXHUwMDNlaWQsIGVsZW1faWQpO1xuK1x0aWYgKElTX0VSUih3b3JrZXIpKVxuK1x0XHRyZXR1cm4gUFRSX0VSUih3b3JrZXIpO1xuK1xuK1x0LyogU2V0dXAgY3R4LiAqL1xuK1x0Y3R4ID0gYnBmX21hcF9rbWFsbG9jX25vbG9jayhtYXAsIHNpemVvZigqY3R4KSwgR0ZQX0tFUk5FTCxcbitcdFx0XHRcdCAgICAgbWFwLVx1MDAzZW51bWFfbm9kZSk7XG4rXHRpZiAoIWN0eCkge1xuK1x0XHRlcnIgPSAtRU5PTUVNO1xuK1x0XHRnb3RvIGRlc3Ryb3lfd29ya2VyO1xuK1x0fVxuK1x0bWVtc2V0KGN0eCwgMCwgc2l6ZW9mKCpjdHgpKTtcbitcdGN0eC1cdTAwM2V3b3JrZXIgPSB3b3JrZXI7XG4rXHRjdHgtXHUwMDNlbWFwID0gbWFwO1xuK1x0Y3R4LVx1MDAzZXZhbHVlID0gdmFsdWU7XG4rXHRyZWZjb3VudF9zZXQoXHUwMDI2Y3R4LVx1MDAzZXJlZmNudCwgMSk7XG4rXHRrdGhyZWFkX2luaXRfd29yayhcdTAwMjZjdHgtXHUwMDNld29yaywgYnBmX3RocmVhZF93cV93b3JrX2ZuKTtcbitcbitcdGlmIChjZ3JvdXBfaWQpIHtcbisjaWZkZWYgQ09ORklHX0NHUk9VUFNcbitcdFx0Y2dycCA9IGNncm91cF9nZXRfZnJvbV9pZChjZ3JvdXBfaWQpO1xuK1x0XHRpZiAoSVNfRVJSKGNncnApKSB7XG4rXHRcdFx0ZXJyID0gUFRSX0VSUihjZ3JwKTtcbitcdFx0XHRnb3RvIGtmcmVlX2N0eDtcbitcdFx0fVxuK1x0XHRjdHgtXHUwMDNlY2dycCA9IGNncnA7XG4rXG4rXHRcdC8qXG4rXHRcdCAqIGt0aHJlYWRfcnVuX3dvcmtlcigpIHdha2VzIHRoZSBrdGhyZWFkLCBidXQgaXQgbWF5IG5vdCBoYXZlXG4rXHRcdCAqIGV4ZWN1dGVkIGNncm91cF9rdGhyZWFkX3JlYWR5KCkgeWV0LCB3aGljaCBjbGVhcnNcbitcdFx0ICogbm9fY2dyb3VwX21pZ3JhdGlvbi5cbitcdFx0ICogRG8gYSBxdWV1ZSB3b3JrIGFuZCBmbHVzaCB0byB3YWl0IHRoZSBrdGhyZWFkIHJ1bi5cbitcdFx0ICovXG4rXHRcdHJlZmNvdW50X2luYyhcdTAwMjZjdHgtXHUwMDNlcmVmY250KTtcbitcdFx0aWYgKCFrdGhyZWFkX3F1ZXVlX3dvcmsoY3R4LVx1MDAzZXdvcmtlciwgXHUwMDI2Y3R4LVx1MDAzZXdvcmspKSB7XG4rXHRcdFx0cmVmY291bnRfZGVjKFx1MDAyNmN0eC1cdTAwM2VyZWZjbnQpO1xuK1x0XHRcdGVyciA9IC1FQlVTWTtcbitcdFx0XHRnb3RvIGNncm91cF9wdXQ7XG4rXHRcdH1cbitcdFx0a3RocmVhZF9mbHVzaF93b3JrKFx1MDAyNmN0eC1cdTAwM2V3b3JrKTtcbitcbitcdFx0aWYgKHdvcmtlci1cdTAwM2V0YXNrLVx1MDAzZW5vX2Nncm91cF9taWdyYXRpb24pIHtcbitcdFx0XHRlcnIgPSAtRUFHQUlOO1xuK1x0XHRcdGdvdG8gY2dyb3VwX3B1dDtcbitcdFx0fVxuK1xuK1x0XHRlcnIgPSBjZ3JvdXBfa3RocmVhZF9hdHRhY2goY2dycCwgd29ya2VyLVx1MDAzZXRhc2spO1xuK1x0XHRpZiAoZXJyKVxuK1x0XHRcdGdvdG8gY2dyb3VwX3B1dDtcbisjZWxzZVxuK1x0XHRlcnIgPSAtRU9QTk9UU1VQUDtcbitcdFx0Z290byBrZnJlZV9jdHg7XG4rI2VuZGlmXG4rXHR9XG4rXG4rXHRvbGRfY3R4ID0gY21weGNoZyhcdTAwMjZ0d2stXHUwMDNlY3R4LCBOVUxMLCBjdHgpO1xuK1x0aWYgKG9sZF9jdHgpIHtcbitcdFx0ZXJyID0gLUVCVVNZO1xuK1x0XHRnb3RvIGNncm91cF9wdXQ7XG4rXHR9XG4rXG4rXHQvKlxuK1x0ICogUGFpcmVkIHdpdGggdGhlIG1hcCBkZXN0cnVjdGlvbiBwYXRoLiAgRW5zdXJlcyB0aGF0IGN0eCBpcyBnbG9iYWxseVxuK1x0ICogdmlzaWJsZSBiZWZvcmUgd2UgY2hlY2sgbWFwLVx1MDAzZXVzZXJjbnQuXG4rXHQgKiBJZiB1c2VyY250IGhhcyBkcm9wcGVkIHRvIHplcm8sIHRoZSBkZXN0cnVjdGlvbiBwYXRoIHdpbGwgZWl0aGVyIHNlZVxuK1x0ICogdGhlIGN0eCAoYW5kIGNhbmNlbCBpdCkgb3Igd2Ugc2VlIHVzZXJjbnQgPT0gMCBoZXJlIGFuZCBjYW5jZWxcbitcdCAqIG91cnNlbHZlcy5cbitcdCAqIFdpdGhvdXQgdGhpcyBiYXJyaWVyLCBhIENQVSBjb3VsZCByZW9yZGVyIHRoZSBsb2FkIG9mIHVzZXJjbnQgYmVmb3JlXG4rXHQgKiB0aGUgY21weGNoZyBzdG9yZSBiZWNvbWVzIHZpc2libGUsIGJyZWFraW5nIHRoZSBtdXR1YWwgZXhjbHVzaW9uXG4rXHQgKiBndWFyYW50ZWUuXG4rXHQgKi9cbitcdHNtcF9tYigpO1xuK1xuK1x0aWYgKCFhdG9taWM2NF9yZWFkKFx1MDAyNm1hcC1cdTAwM2V1c2VyY250KSkge1xuK1x0XHRicGZfdGhyZWFkX3dxX2NhbmNlbF9hbmRfZnJlZSh0d3EpO1xuK1x0XHRyZXR1cm4gLUVQRVJNO1xuK1x0fVxuK1xuK1x0cmV0dXJuIDA7XG4rXG4rY2dyb3VwX3B1dDpcbisjaWZkZWYgQ09ORklHX0NHUk9VUFNcbitcdGlmIChjZ3JwKVxuK1x0XHRjZ3JvdXBfcHV0KGNncnApO1xuKyNlbmRpZlxuK2tmcmVlX2N0eDpcbitcdC8qXG4rXHQgKiBOb3QgdXNlIGJwZl90aHJlYWRfd3FfY3R4X3B1dCBiZWNhdXNlIGN0eCBoYXMgbm90IHlldCBlbnRlcmVkXG4rXHQgKiB0aGUgcnVubmluZyBzdGF0ZS5cbitcdCAqL1xuK1x0a2ZyZWUoY3R4KTtcbitkZXN0cm95X3dvcmtlcjpcbitcdGt0aHJlYWRfZGVzdHJveV93b3JrZXIod29ya2VyKTtcbitcdHJldHVybiBlcnI7XG4rfVxuK1xuK19fYnBmX2tmdW5jIGludCBicGZfdGhyZWFkX3dxX3NldF9jYWxsYmFjayhzdHJ1Y3QgYnBmX3RocmVhZF93cSAqdHdxLFxuK1x0XHRcdFx0XHQgICBpbnQgKGNhbGxiYWNrX2ZuKSh2b2lkICptYXAsXG4rXHRcdFx0XHRcdFx0XHQgICAgIGludCAqa2V5LFxuK1x0XHRcdFx0XHRcdFx0ICAgICB2b2lkICp2YWx1ZSksXG4rXHRcdFx0XHRcdCAgIHVuc2lnbmVkIGludCBmbGFncyxcbitcdFx0XHRcdFx0ICAgc3RydWN0IGJwZl9wcm9nX2F1eCAqYXV4KVxuK3tcbitcdHN0cnVjdCBicGZfdGhyZWFkX3dxX2tlcm4gKnR3ayA9IChzdHJ1Y3QgYnBmX3RocmVhZF93cV9rZXJuICopdHdxO1xuK1x0c3RydWN0IGJwZl90aHJlYWRfd3FfY3R4ICpjdHg7XG4rXHRzdHJ1Y3QgYnBmX3Byb2cgKnByb2c7XG4rXG4rXHRpZiAoZmxhZ3MpXG4rXHRcdHJldHVybiAtRUlOVkFMO1xuK1xuK1x0Y3R4ID0gUkVBRF9PTkNFKHR3ay1cdTAwM2VjdHgpO1xuK1x0aWYgKCFjdHgpXG4rXHRcdHJldHVybiAtRUlOVkFMO1xuK1xuK1x0cHJvZyA9IGJwZl9wcm9nX2luY19ub3RfemVybyhhdXgtXHUwMDNlcHJvZyk7XG4rXHRpZiAoSVNfRVJSKHByb2cpKVxuK1x0XHRyZXR1cm4gUFRSX0VSUihwcm9nKTtcbitcbitcdC8qXG4rXHQgKiBBbGxvdyBzZXRfY2FsbGJhY2sgb25seSBvbmNlIHRvIHByZXZlbnQgVUFGOiBhIGNvbmN1cnJlbnRcbitcdCAqIHNldF9jYWxsYmFjayBjb3VsZCBicGZfcHJvZ19wdXQoKSB0aGUgcHJvZyB3aGlsZSB0aGUgd29ya2VyXG4rXHQgKiBrdGhyZWFkIGlzIHN0aWxsIGV4ZWN1dGluZyBpdHMgY2FsbGJhY2suXG4rXHQgKi9cbitcdGlmIChjbXB4Y2hnKFx1MDAyNmN0eC1cdTAwM2Vwcm9nLCBOVUxMLCBwcm9nKSAhPSBOVUxMKSB7XG4rXHRcdGJwZl9wcm9nX3B1dChwcm9nKTtcbitcdFx0cmV0dXJuIC1FQlVTWTtcbitcdH1cbitcdC8qXG4rXHQgKiBTYWZlIHRvIHNldCBjYWxsYmFja19mbiBhZnRlciBwcm9nOiBicGZfdGhyZWFkX3dxX3N0YXJ0KCkgYW5kXG4rXHQgKiBicGZfdGhyZWFkX3dxX3dvcmtfZm4oKSBib3RoIGNoZWNrIGNhbGxiYWNrX2ZuIHdpdGggUkVBRF9PTkNFKClcbitcdCAqIGFuZCBiYWlsIG91dCBpZiBpdCBpcyBzdGlsbCBOVUxMLlxuK1x0ICovXG4rXHRXUklURV9PTkNFKGN0eC1cdTAwM2VjYWxsYmFja19mbiwgKHZvaWQgKiljYWxsYmFja19mbik7XG4rXG4rXHRyZXR1cm4gMDtcbit9XG4rXG4rX19icGZfa2Z1bmMgaW50XG4rYnBmX3RocmVhZF93cV9zdGFydChzdHJ1Y3QgYnBmX3RocmVhZF93cSAqdHdxLCB1bnNpZ25lZCBpbnQgZmxhZ3MpXG4re1xuK1x0c3RydWN0IGJwZl90aHJlYWRfd3Ffa2VybiAqdHdrID0gKHN0cnVjdCBicGZfdGhyZWFkX3dxX2tlcm4gKil0d3E7XG4rXHRzdHJ1Y3QgYnBmX3RocmVhZF93cV9jdHggKmN0eDtcbitcdGludCBlcnI7XG4rXG4rXHRpZiAoZmxhZ3MpXG4rXHRcdHJldHVybiAtRUlOVkFMO1xuK1xuK1x0cmN1X3JlYWRfbG9ja190cmFjZSgpO1xuK1xuK1x0ZXJyID0gMDtcbitcbitcdGN0eCA9IFJFQURfT05DRSh0d2stXHUwMDNlY3R4KTtcbitcdGlmICghY3R4IHx8ICFSRUFEX09OQ0UoY3R4LVx1MDAzZWNhbGxiYWNrX2ZuKSkge1xuK1x0XHRlcnIgPSAtRUlOVkFMO1xuK1x0XHRnb3RvIHVubG9jaztcbitcdH1cbitcbitcdGlmICghcmVmY291bnRfaW5jX25vdF96ZXJvKFx1MDAyNmN0eC1cdTAwM2VyZWZjbnQpKVxuK1x0XHRlcnIgPSAtRU5PRU5UO1xuK1xuK3VubG9jazpcbitcdHJjdV9yZWFkX3VubG9ja190cmFjZSgpO1xuK1x0aWYgKGVycilcbitcdFx0cmV0dXJuIGVycjtcbitcbitcdGlmICgha3RocmVhZF9xdWV1ZV93b3JrKGN0eC1cdTAwM2V3b3JrZXIsIFx1MDAyNmN0eC1cdTAwM2V3b3JrKSkge1xuK1x0XHRicGZfdGhyZWFkX3dxX2N0eF9wdXQoY3R4KTtcbitcdFx0cmV0dXJuIC1FQlVTWTtcbitcdH1cbitcbitcdHJldHVybiAwO1xuK31cbitcbit2b2lkIGJwZl90aHJlYWRfd3FfY2FuY2VsX2FuZF9mcmVlKHZvaWQgKnZhbClcbit7XG4rXHRzdHJ1Y3QgYnBmX3RocmVhZF93cV9rZXJuICp0d2sgPSB2YWw7XG4rXHRzdHJ1Y3QgYnBmX3RocmVhZF93cV9jdHggKmN0eDtcbitcbitcdGN0eCA9IHhjaGcoXHUwMDI2dHdrLVx1MDAzZWN0eCwgTlVMTCk7XG4rXHRpZiAoIWN0eClcbitcdFx0cmV0dXJuO1xuK1xuK1x0bWlnaHRfc2xlZXAoKTtcbitcbitcdC8qXG4rXHQgKiBQcmV2ZW50IGZ1dHVyZSBjYWxsYmFja3MgZnJvbSBydW5uaW5nIGFuZCB3YWl0IGZvciBhbnlcbitcdCAqIGluLXByb2dyZXNzIGV4ZWN1dGlvbiB0byBmaW5pc2guXG4rXHQgKi9cbitcdFdSSVRFX09OQ0UoY3R4LVx1MDAzZWNhbGxiYWNrX2ZuLCBOVUxMKTtcbitcdC8qXG4rXHQgKiBrdGhyZWFkX2NhbmNlbF93b3JrX3N5bmMoKSByZXR1cm5zIHRydWUgd2hlbiBpdCBkZXF1ZXVlcyBhIHBlbmRpbmdcbitcdCAqIHdvcmsgaXRlbSBmcm9tIHRoZSB3b3JrX2xpc3Qgd2l0aG91dCBleGVjdXRpbmcgaXQuICBFYWNoIHN1Y2Nlc3NmdWxcbitcdCAqIGJwZl90aHJlYWRfd3Ffc3RhcnQoKSBjYWxsIGluY3JlbWVudHMgY3R4LVx1MDAzZXJlZmNudCBhbmQgcmVsaWVzIG9uIHRoZVxuK1x0ICogc3Vic2VxdWVudCBicGZfdGhyZWFkX3dxX3dvcmtfZm4oKSBleGVjdXRpb24gdG8gcmVsZWFzZSB0aGF0XG4rXHQgKiByZWZlcmVuY2UgdmlhIGJwZl90aHJlYWRfd3FfY3R4X3B1dCgpLiAgSWYgdGhlIHdvcmsgd2FzIHBlbmRpbmcgYW5kXG4rXHQgKiBnb3QgY2FuY2VsbGVkIGhlcmUsIHdvcmtfZm4gd2lsbCBuZXZlciBydW4gZm9yIHRoYXQgcXVldWVkIGluc3RhbmNlLFxuK1x0ICogc28gd2UgbXVzdCBkcm9wIHRoZSByZWZlcmVuY2Ugb3Vyc2VsdmVzIHRvIGF2b2lkIGEgcGVybWFuZW50IHJlZmNvdW50XG4rXHQgKiBsZWFrLlxuK1x0ICpcbitcdCAqIFRoaXMgY292ZXJzIHR3byBzY2VuYXJpb3MgdW5pZm9ybWx5OlxuK1x0ICogIDEuIFRoZSB3b3JrIGlzIHB1cmVseSBwZW5kaW5nIChub3QgY3VycmVudGx5IGV4ZWN1dGluZykgLSBlLmcuIGFcbitcdCAqICAgICBub3JtYWwgYnBmX3RocmVhZF93cV9zdGFydCgpIGNhbGwgcXVldWVkIGl0IGJ1dCB0aGUgd29ya2VyXG4rXHQgKiAgICAgdGhyZWFkIGhhc24ndCBwaWNrZWQgaXQgdXAgeWV0LlxuK1x0ICogIDIuIFRoZSB3b3JrIGlzIGN1cnJlbnRseSBpbi1mbGlnaHQgQU5EIHdhcyBzZWxmLXJlc2NoZWR1bGVkIGZyb21cbitcdCAqICAgICB3aXRoaW4gdGhlIGNhbGxiYWNrIC0ga3RocmVhZF9jYW5jZWxfd29ya19zeW5jKCkgZGVxdWV1ZXMgdGhlXG4rXHQgKiAgICAgcmUtcXVldWVkIHBlbmRpbmcgbm9kZSBhbmQgdGhlbiB3YWl0cyBmb3IgdGhlIGluLWZsaWdodFxuK1x0ICogICAgIGV4ZWN1dGlvbiB0byBjb21wbGV0ZS5cbitcdCAqIEluIGJvdGggY2FzZXMgdGhlIHJldHVybiB2YWx1ZSBpcyB0cnVlLCBpbmRpY2F0aW5nIG9uZSBvcnBoYW5lZFxuK1x0ICogcmVmZXJlbmNlIHRoYXQgbmVlZHMgdG8gYmUgcmVsZWFzZWQgaGVyZS5cbitcdCAqL1xuK1x0aWYgKGt0aHJlYWRfY2FuY2VsX3dvcmtfc3luYyhcdTAwMjZjdHgtXHUwMDNld29yaykpXG4rXHRcdGJwZl90aHJlYWRfd3FfY3R4X3B1dChjdHgpO1xuK1xuK1x0LypcbitcdCAqIERyb3Agb3VyIG93biByZWZlcmVuY2UuICBJZiB0aGUgd29yayB3YXMgc3RpbGwgaW4tZmxpZ2h0IGFib3ZlLFxuK1x0ICogdGhlIHJlZmNvdW50IHdvbid0IGhpdCB6ZXJvIGhlcmUgLSBpdCB3aWxsIHJlYWNoIHplcm8gd2hlbiB0aGVcbitcdCAqIHdvcmsgcGF0aCBjYWxscyBicGZfdGhyZWFkX3dxX2N0eF9wdXQoKSB1cG9uIGNvbXBsZXRpb24uICBFaXRoZXJcbitcdCAqIHdheSwgZmluYWwgY2xlYW51cCAod29ya2VyIGRlc3RydWN0aW9uLCBwcm9nIHB1dCwgY2dyb3VwIHB1dCxcbitcdCAqIGtmcmVlKSBoYXBwZW5zIGV4Y2x1c2l2ZWx5IGluIHRoZSBSQ1UgY2FsbGJhY2sgdG8ga2VlcCB0aGVcbitcdCAqIHRlYXJkb3duIHBhdGggc2luZ2xlLXRocmVhZGVkLlxuK1x0ICovXG4rXHRicGZfdGhyZWFkX3dxX2N0eF9wdXQoY3R4KTtcbit9XG4rXG4gX19icGZfa2Z1bmNfZW5kX2RlZnMoKTtcbiBcbiBzdGF0aWMgdm9pZCBicGZfdGFza193b3JrX2NhbmNlbF9zY2hlZHVsZWQoc3RydWN0IGlycV93b3JrICppcnFfd29yaylcbkBAIC00OTE3LDYgKzUzMjEsOCBAQCBCVEZfSURfRkxBR1MoZnVuYywgYnBmX21vZGlmeV9yZXR1cm5fdGVzdF90cClcbiBCVEZfSURfRkxBR1MoZnVuYywgYnBmX3dxX2luaXQpXG4gQlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl93cV9zZXRfY2FsbGJhY2ssIEtGX0lNUExJQ0lUX0FSR1MpXG4gQlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl93cV9zdGFydClcbitCVEZfSURfRkxBR1MoZnVuYywgYnBmX3RocmVhZF93cV9zZXRfY2FsbGJhY2ssIEtGX0lNUExJQ0lUX0FSR1MpXG4rQlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl90aHJlYWRfd3Ffc3RhcnQpXG4gQlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9wcmVlbXB0X2Rpc2FibGUpXG4gQlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9wcmVlbXB0X2VuYWJsZSlcbiBCVEZfSURfRkxBR1MoZnVuYywgYnBmX2l0ZXJfYml0c19uZXcsIEtGX0lURVJfTkVXKVxuQEAgLTQ5NzgsNiArNTM4NCwxNSBAQCBzdGF0aWMgY29uc3Qgc3RydWN0IGJ0Zl9rZnVuY19pZF9zZXQgY29tbW9uX2tmdW5jX3NldCA9IHtcbiBcdC5zZXQgICA9IFx1MDAyNmNvbW1vbl9idGZfaWRzLFxuIH07XG4gXG4rQlRGX0tGVU5DU19TVEFSVChzeXNjYWxsX2J0Zl9pZHMpXG4rQlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl90aHJlYWRfd3FfaW5pdCwgS0ZfU0xFRVBBQkxFKVxuK0JURl9LRlVOQ1NfRU5EKHN5c2NhbGxfYnRmX2lkcylcbitcbitzdGF0aWMgY29uc3Qgc3RydWN0IGJ0Zl9rZnVuY19pZF9zZXQgc3lzY2FsbF9rZnVuY19zZXQgPSB7XG4rXHQub3duZXIgPSBUSElTX01PRFVMRSxcbitcdC5zZXQgICA9IFx1MDAyNnN5c2NhbGxfYnRmX2lkcyxcbit9O1xuK1xuIHN0YXRpYyBpbnQgX19pbml0IGtmdW5jX2luaXQodm9pZClcbiB7XG4gXHRpbnQgcmV0O1xuQEAgLTUwMDAsNiArNTQxNSw3IEBAIHN0YXRpYyBpbnQgX19pbml0IGtmdW5jX2luaXQodm9pZClcbiBcdHJldCA9IHJldCA/OiByZWdpc3Rlcl9idGZfa2Z1bmNfaWRfc2V0KEJQRl9QUk9HX1RZUEVfU1RSVUNUX09QUywgXHUwMDI2Z2VuZXJpY19rZnVuY19zZXQpO1xuIFx0cmV0ID0gcmV0ID86IHJlZ2lzdGVyX2J0Zl9rZnVuY19pZF9zZXQoQlBGX1BST0dfVFlQRV9TWVNDQUxMLCBcdTAwMjZnZW5lcmljX2tmdW5jX3NldCk7XG4gXHRyZXQgPSByZXQgPzogcmVnaXN0ZXJfYnRmX2tmdW5jX2lkX3NldChCUEZfUFJPR19UWVBFX0NHUk9VUF9TS0IsIFx1MDAyNmdlbmVyaWNfa2Z1bmNfc2V0KTtcbitcdHJldCA9IHJldCA/OiByZWdpc3Rlcl9idGZfa2Z1bmNfaWRfc2V0KEJQRl9QUk9HX1RZUEVfU1lTQ0FMTCwgXHUwMDI2c3lzY2FsbF9rZnVuY19zZXQpO1xuIFx0cmV0ID0gcmV0ID86IHJlZ2lzdGVyX2J0Zl9pZF9kdG9yX2tmdW5jcyhnZW5lcmljX2R0b3JzLFxuIFx0XHRcdFx0XHRcdCAgQVJSQVlfU0laRShnZW5lcmljX2R0b3JzKSxcbiBcdFx0XHRcdFx0XHQgIFRISVNfTU9EVUxFKTtcbkBAIC01MDM3LDQgKzU0NTMsNiBAQCB2b2lkIGJwZl9tYXBfZnJlZV9pbnRlcm5hbF9zdHJ1Y3RzKHN0cnVjdCBicGZfbWFwICptYXAsIHZvaWQgKnZhbClcbiBcdFx0YnBmX29ial9mcmVlX3dvcmtxdWV1ZShtYXAtXHUwMDNlcmVjb3JkLCB2YWwpO1xuIFx0aWYgKGJ0Zl9yZWNvcmRfaGFzX2ZpZWxkKG1hcC1cdTAwM2VyZWNvcmQsIEJQRl9UQVNLX1dPUkspKVxuIFx0XHRicGZfb2JqX2ZyZWVfdGFza193b3JrKG1hcC1cdTAwM2VyZWNvcmQsIHZhbCk7XG4rXHRpZiAoYnRmX3JlY29yZF9oYXNfZmllbGQobWFwLVx1MDAzZXJlY29yZCwgQlBGX1RIUkVBRF9XUSkpXG4rXHRcdGJwZl9vYmpfZnJlZV90aHJlYWRfd3EobWFwLVx1MDAzZXJlY29yZCwgdmFsKTtcbiB9XG5kaWZmIC0tZ2l0IGEva2VybmVsL2JwZi9zeXNjYWxsLmMgYi9rZXJuZWwvYnBmL3N5c2NhbGwuY1xuaW5kZXggOGQxMTFkYTg4NjU1My4uZGVhMTQ4MjNiYWNkMiAxMDA2NDRcbi0tLSBhL2tlcm5lbC9icGYvc3lzY2FsbC5jXG4rKysgYi9rZXJuZWwvYnBmL3N5c2NhbGwuY1xuQEAgLTY4OCw2ICs2ODgsNyBAQCB2b2lkIGJ0Zl9yZWNvcmRfZnJlZShzdHJ1Y3QgYnRmX3JlY29yZCAqcmVjKVxuIFx0XHRjYXNlIEJQRl9SRUZDT1VOVDpcbiBcdFx0Y2FzZSBCUEZfV09SS1FVRVVFOlxuIFx0XHRjYXNlIEJQRl9UQVNLX1dPUks6XG4rXHRcdGNhc2UgQlBGX1RIUkVBRF9XUTpcbiBcdFx0XHQvKiBOb3RoaW5nIHRvIHJlbGVhc2UgKi9cbiBcdFx0XHRicmVhaztcbiBcdFx0ZGVmYXVsdDpcbkBAIC03NDIsNiArNzQzLDcgQEAgc3RydWN0IGJ0Zl9yZWNvcmQgKmJ0Zl9yZWNvcmRfZHVwKGNvbnN0IHN0cnVjdCBidGZfcmVjb3JkICpyZWMpXG4gXHRcdGNhc2UgQlBGX1JFRkNPVU5UOlxuIFx0XHRjYXNlIEJQRl9XT1JLUVVFVUU6XG4gXHRcdGNhc2UgQlBGX1RBU0tfV09SSzpcbitcdFx0Y2FzZSBCUEZfVEhSRUFEX1dROlxuIFx0XHRcdC8qIE5vdGhpbmcgdG8gYWNxdWlyZSAqL1xuIFx0XHRcdGJyZWFrO1xuIFx0XHRkZWZhdWx0OlxuQEAgLTgwNyw2ICs4MDksMTMgQEAgdm9pZCBicGZfb2JqX2ZyZWVfdGFza193b3JrKGNvbnN0IHN0cnVjdCBidGZfcmVjb3JkICpyZWMsIHZvaWQgKm9iailcbiBcdGJwZl90YXNrX3dvcmtfY2FuY2VsX2FuZF9mcmVlKG9iaiArIHJlYy1cdTAwM2V0YXNrX3dvcmtfb2ZmKTtcbiB9XG4gXG4rdm9pZCBicGZfb2JqX2ZyZWVfdGhyZWFkX3dxKGNvbnN0IHN0cnVjdCBidGZfcmVjb3JkICpyZWMsIHZvaWQgKm9iailcbit7XG4rXHRpZiAoV0FSTl9PTl9PTkNFKCFidGZfcmVjb3JkX2hhc19maWVsZChyZWMsIEJQRl9USFJFQURfV1EpKSlcbitcdFx0cmV0dXJuO1xuK1x0YnBmX3RocmVhZF93cV9jYW5jZWxfYW5kX2ZyZWUob2JqICsgcmVjLVx1MDAzZXRocmVhZF93cV9vZmYpO1xuK31cbitcbiB2b2lkIGJwZl9vYmpfY2FuY2VsX2ZpZWxkcyhzdHJ1Y3QgYnBmX21hcCAqbWFwLCB2b2lkICpvYmopXG4ge1xuIFx0YnBmX21hcF9mcmVlX2ludGVybmFsX3N0cnVjdHMobWFwLCBvYmopO1xuQEAgLTgzOSw2ICs4NDgsOSBAQCB2b2lkIGJwZl9vYmpfZnJlZV9maWVsZHMoY29uc3Qgc3RydWN0IGJ0Zl9yZWNvcmQgKnJlYywgdm9pZCAqb2JqKVxuIFx0XHRjYXNlIEJQRl9UQVNLX1dPUks6XG4gXHRcdFx0YnBmX3Rhc2tfd29ya19jYW5jZWxfYW5kX2ZyZWUoZmllbGRfcHRyKTtcbiBcdFx0XHRicmVhaztcbitcdFx0Y2FzZSBCUEZfVEhSRUFEX1dROlxuK1x0XHRcdGJwZl90aHJlYWRfd3FfY2FuY2VsX2FuZF9mcmVlKGZpZWxkX3B0cik7XG4rXHRcdFx0YnJlYWs7XG4gXHRcdGNhc2UgQlBGX0tQVFJfVU5SRUY6XG4gXHRcdFx0V1JJVEVfT05DRSgqKHU2NCAqKWZpZWxkX3B0ciwgMCk7XG4gXHRcdFx0YnJlYWs7XG5AQCAtMTI2NSw3ICsxMjc3LDcgQEAgc3RhdGljIGludCBtYXBfY2hlY2tfYnRmKHN0cnVjdCBicGZfbWFwICptYXAsIHN0cnVjdCBicGZfdG9rZW4gKnRva2VuLFxuIFx0bWFwLVx1MDAzZXJlY29yZCA9IGJ0Zl9wYXJzZV9maWVsZHMoYnRmLCB2YWx1ZV90eXBlLFxuIFx0XHRcdFx0ICAgICAgIEJQRl9TUElOX0xPQ0sgfCBCUEZfUkVTX1NQSU5fTE9DSyB8IEJQRl9USU1FUiB8IEJQRl9LUFRSIHwgQlBGX0xJU1RfSEVBRCB8XG4gXHRcdFx0XHQgICAgICAgQlBGX1JCX1JPT1QgfCBCUEZfUkVGQ09VTlQgfCBCUEZfV09SS1FVRVVFIHwgQlBGX1VQVFIgfFxuLVx0XHRcdFx0ICAgICAgIEJQRl9UQVNLX1dPUkssXG4rXHRcdFx0XHQgICAgICAgQlBGX1RBU0tfV09SSyB8IEJQRl9USFJFQURfV1EsXG4gXHRcdFx0XHQgICAgICAgbWFwLVx1MDAzZXZhbHVlX3NpemUpO1xuIFx0aWYgKCFJU19FUlJfT1JfTlVMTChtYXAtXHUwMDNlcmVjb3JkKSkge1xuIFx0XHRpbnQgaTtcbkBAIC0xMjk5LDYgKzEzMTEsNyBAQCBzdGF0aWMgaW50IG1hcF9jaGVja19idGYoc3RydWN0IGJwZl9tYXAgKm1hcCwgc3RydWN0IGJwZl90b2tlbiAqdG9rZW4sXG4gXHRcdFx0Y2FzZSBCUEZfVElNRVI6XG4gXHRcdFx0Y2FzZSBCUEZfV09SS1FVRVVFOlxuIFx0XHRcdGNhc2UgQlBGX1RBU0tfV09SSzpcbitcdFx0XHRjYXNlIEJQRl9USFJFQURfV1E6XG4gXHRcdFx0XHRpZiAobWFwLVx1MDAzZW1hcF90eXBlICE9IEJQRl9NQVBfVFlQRV9IQVNIIFx1MDAyNlx1MDAyNlxuIFx0XHRcdFx0ICAgIG1hcC1cdTAwM2VtYXBfdHlwZSAhPSBCUEZfTUFQX1RZUEVfUkhBU0ggXHUwMDI2XHUwMDI2XG4gXHRcdFx0XHQgICAgbWFwLVx1MDAzZW1hcF90eXBlICE9IEJQRl9NQVBfVFlQRV9MUlVfSEFTSCBcdTAwMjZcdTAwMjZcbmRpZmYgLS1naXQgYS9rZXJuZWwvYnBmL3ZlcmlmaWVyLmMgYi9rZXJuZWwvYnBmL3ZlcmlmaWVyLmNcbmluZGV4IGU2MjMzYzAwODFkMTAuLjQ0ZTc5ZmU0ODBiNmIgMTAwNjQ0XG4tLS0gYS9rZXJuZWwvYnBmL3ZlcmlmaWVyLmNcbisrKyBiL2tlcm5lbC9icGYvdmVyaWZpZXIuY1xuQEAgLTQ3Nyw2ICs0NzcsNyBAQCBzdGF0aWMgYm9vbCBpc19hc3luY19jYWxsYmFja19jYWxsaW5nX2tmdW5jKHUzMiBidGZfaWQpO1xuIHN0YXRpYyBib29sIGlzX2NhbGxiYWNrX2NhbGxpbmdfa2Z1bmModTMyIGJ0Zl9pZCk7XG4gXG4gc3RhdGljIGJvb2wgaXNfYnBmX3dxX3NldF9jYWxsYmFja19rZnVuYyh1MzIgYnRmX2lkKTtcbitzdGF0aWMgYm9vbCBpc19icGZfdGhyZWFkX3dxX3NldF9jYWxsYmFja19rZnVuYyh1MzIgYnRmX2lkKTtcbiBzdGF0aWMgYm9vbCBpc190YXNrX3dvcmtfYWRkX2tmdW5jKHUzMiBmdW5jX2lkKTtcbiBcbiBzdGF0aWMgYm9vbCBpc19zeW5jX2NhbGxiYWNrX2NhbGxpbmdfZnVuY3Rpb24oZW51bSBicGZfZnVuY19pZCBmdW5jX2lkKVxuQEAgLTUxNiw5ICs1MTcsMTEgQEAgc3RhdGljIGJvb2wgaXNfYXN5bmNfY2Jfc2xlZXBhYmxlKHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsIHN0cnVjdCBicGZfaW5zblxuIFx0aWYgKGJwZl9oZWxwZXJfY2FsbChpbnNuKSBcdTAwMjZcdTAwMjYgaW5zbi1cdTAwM2VpbW0gPT0gQlBGX0ZVTkNfdGltZXJfc2V0X2NhbGxiYWNrKVxuIFx0XHRyZXR1cm4gZmFsc2U7XG4gXG4tXHQvKiBicGZfd3EgYW5kIGJwZl90YXNrX3dvcmsgY2FsbGJhY2tzIGFyZSBhbHdheXMgc2xlZXBhYmxlLiAqL1xuK1x0LyogYnBmX3dxLCBicGZfdGhyZWFkX3dxIGFuZCBicGZfdGFza193b3JrIGNhbGxiYWNrcyBhcmUgYWx3YXlzIHNsZWVwYWJsZS4gKi9cbiBcdGlmIChicGZfcHNldWRvX2tmdW5jX2NhbGwoaW5zbikgXHUwMDI2XHUwMDI2IGluc24tXHUwMDNlb2ZmID09IDAgXHUwMDI2XHUwMDI2XG4tXHQgICAgKGlzX2JwZl93cV9zZXRfY2FsbGJhY2tfa2Z1bmMoaW5zbi1cdTAwM2VpbW0pIHx8IGlzX3Rhc2tfd29ya19hZGRfa2Z1bmMoaW5zbi1cdTAwM2VpbW0pKSlcbitcdCAgICAoaXNfYnBmX3dxX3NldF9jYWxsYmFja19rZnVuYyhpbnNuLVx1MDAzZWltbSkgfHxcbitcdCAgICAgaXNfYnBmX3RocmVhZF93cV9zZXRfY2FsbGJhY2tfa2Z1bmMoaW5zbi1cdTAwM2VpbW0pIHx8XG4rXHQgICAgIGlzX3Rhc2tfd29ya19hZGRfa2Z1bmMoaW5zbi1cdTAwM2VpbW0pKSlcbiBcdFx0cmV0dXJuIHRydWU7XG4gXG4gXHR2ZXJpZmllcl9idWcoZW52LCBcInVuaGFuZGxlZCBhc3luYyBjYWxsYmFjayBpbiBpc19hc3luY19jYl9zbGVlcGFibGVcIik7XG5AQCAtMTg3MSw3ICsxODc0LDEwIEBAIHN0YXRpYyB2b2lkIHJlZmluZV9tYXBfbG9va3VwX3ZhbHVlKHN0cnVjdCBicGZfcmVnX3N0YXRlICpyZWcpXG4gXHRcdCAqIGFzIFVJRCBvZiB0aGUgaW5uZXIgbWFwLlxuIFx0XHQgKi9cbiBcdFx0aWYgKGJ0Zl9yZWNvcmRfaGFzX2ZpZWxkKG1hcC1cdTAwM2Vpbm5lcl9tYXBfbWV0YS1cdTAwM2VyZWNvcmQsXG4tXHRcdFx0XHRcdCBCUEZfVElNRVIgfCBCUEZfV09SS1FVRVVFIHwgQlBGX1RBU0tfV09SSykpXG4rXHRcdFx0XHRcdCBCUEZfVElNRVIgfFxuK1x0XHRcdFx0XHQgQlBGX1dPUktRVUVVRSB8XG4rXHRcdFx0XHRcdCBCUEZfVEFTS19XT1JLIHxcbitcdFx0XHRcdFx0IEJQRl9USFJFQURfV1EpKVxuIFx0XHRcdHJlZy1cdTAwM2VtYXBfdWlkID0gcmVnLVx1MDAzZWlkO1xuIFx0fSBlbHNlIGlmIChtYXAtXHUwMDNlbWFwX3R5cGUgPT0gQlBGX01BUF9UWVBFX1hTS01BUCkge1xuIFx0XHRyZWctXHUwMDNldHlwZSA9IFBUUl9UT19YRFBfU09DSyB8IG1heWJlX251bGw7XG5AQCAtNzI0Myw2ICs3MjQ5LDkgQEAgc3RhdGljIGludCBjaGVja19tYXBfZmllbGRfcG9pbnRlcihzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52LCBzdHJ1Y3QgYnBmX3JlZ19cbiBcdGNhc2UgQlBGX1dPUktRVUVVRTpcbiBcdFx0ZmllbGRfb2ZmID0gbWFwLVx1MDAzZXJlY29yZC1cdTAwM2V3cV9vZmY7XG4gXHRcdGJyZWFrO1xuK1x0Y2FzZSBCUEZfVEhSRUFEX1dROlxuK1x0XHRmaWVsZF9vZmYgPSBtYXAtXHUwMDNlcmVjb3JkLVx1MDAzZXRocmVhZF93cV9vZmY7XG4rXHRcdGJyZWFrO1xuIFx0ZGVmYXVsdDpcbiBcdFx0dmVyaWZpZXJfYnVnKGVudiwgXCJ1bnN1cHBvcnRlZCBCVEYgZmllbGQgdHlwZTogJXNcXG5cIiwgc3RydWN0X25hbWUpO1xuIFx0XHRyZXR1cm4gLUVJTlZBTDtcbkBAIC0xMDk0MCw2ICsxMDk0OSw3IEBAIGVudW0ge1xuIFx0S0ZfQVJHX1dPUktRVUVVRV9JRCxcbiBcdEtGX0FSR19SRVNfU1BJTl9MT0NLX0lELFxuIFx0S0ZfQVJHX1RBU0tfV09SS19JRCxcbitcdEtGX0FSR19USFJFQURfV1FfSUQsXG4gXHRLRl9BUkdfUFJPR19BVVhfSUQsXG4gXHRLRl9BUkdfVElNRVJfSURcbiB9O1xuQEAgLTEwOTUzLDYgKzEwOTYzLDcgQEAgQlRGX0lEKHN0cnVjdCwgYnBmX3JiX25vZGUpXG4gQlRGX0lEKHN0cnVjdCwgYnBmX3dxKVxuIEJURl9JRChzdHJ1Y3QsIGJwZl9yZXNfc3Bpbl9sb2NrKVxuIEJURl9JRChzdHJ1Y3QsIGJwZl90YXNrX3dvcmspXG4rQlRGX0lEKHN0cnVjdCwgYnBmX3RocmVhZF93cSlcbiBCVEZfSUQoc3RydWN0LCBicGZfcHJvZ19hdXgpXG4gQlRGX0lEKHN0cnVjdCwgYnBmX3RpbWVyKVxuIFxuQEAgLTExMDEzLDYgKzExMDI0LDExIEBAIHN0YXRpYyBib29sIGlzX2tmdW5jX2FyZ190YXNrX3dvcmsoY29uc3Qgc3RydWN0IGJ0ZiAqYnRmLCBjb25zdCBzdHJ1Y3QgYnRmX3BhcmFtXG4gXHRyZXR1cm4gX19pc19rZnVuY19wdHJfYXJnX3R5cGUoYnRmLCBhcmcsIEtGX0FSR19UQVNLX1dPUktfSUQpO1xuIH1cbiBcbitzdGF0aWMgYm9vbCBpc19rZnVuY19hcmdfdGhyZWFkX3dxKGNvbnN0IHN0cnVjdCBidGYgKmJ0ZiwgY29uc3Qgc3RydWN0IGJ0Zl9wYXJhbSAqYXJnKVxuK3tcbitcdHJldHVybiBfX2lzX2tmdW5jX3B0cl9hcmdfdHlwZShidGYsIGFyZywgS0ZfQVJHX1RIUkVBRF9XUV9JRCk7XG4rfVxuK1xuIHN0YXRpYyBib29sIGlzX2tmdW5jX2FyZ19yZXNfc3Bpbl9sb2NrKGNvbnN0IHN0cnVjdCBidGYgKmJ0ZiwgY29uc3Qgc3RydWN0IGJ0Zl9wYXJhbSAqYXJnKVxuIHtcbiBcdHJldHVybiBfX2lzX2tmdW5jX3B0cl9hcmdfdHlwZShidGYsIGFyZywgS0ZfQVJHX1JFU19TUElOX0xPQ0tfSUQpO1xuQEAgLTExMTMyLDYgKzExMTQ4LDcgQEAgZW51bSBrZnVuY19wdHJfYXJnX3R5cGUge1xuIFx0S0ZfQVJHX1BUUl9UT19JUlFfRkxBRyxcbiBcdEtGX0FSR19QVFJfVE9fUkVTX1NQSU5fTE9DSyxcbiBcdEtGX0FSR19QVFJfVE9fVEFTS19XT1JLLFxuK1x0S0ZfQVJHX1BUUl9UT19USFJFQURfV1EsXG4gfTtcbiBcbiBlbnVtIHNwZWNpYWxfa2Z1bmNfdHlwZSB7XG5AQCAtMTExNzgsNiArMTExOTUsNyBAQCBlbnVtIHNwZWNpYWxfa2Z1bmNfdHlwZSB7XG4gXHRLRl9icGZfcGVyY3B1X29ial9kcm9wLFxuIFx0S0ZfYnBmX3Rocm93LFxuIFx0S0ZfYnBmX3dxX3NldF9jYWxsYmFjayxcbitcdEtGX2JwZl90aHJlYWRfd3Ffc2V0X2NhbGxiYWNrLFxuIFx0S0ZfYnBmX3ByZWVtcHRfZGlzYWJsZSxcbiBcdEtGX2JwZl9wcmVlbXB0X2VuYWJsZSxcbiBcdEtGX2JwZl9pdGVyX2Nzc190YXNrX25ldyxcbkBAIC0xMTI1OCw2ICsxMTI3Niw3IEBAIEJURl9JRChmdW5jLCBicGZfcGVyY3B1X29ial9kcm9wX2ltcGwpXG4gQlRGX0lEKGZ1bmMsIGJwZl9wZXJjcHVfb2JqX2Ryb3ApXG4gQlRGX0lEKGZ1bmMsIGJwZl90aHJvdylcbiBCVEZfSUQoZnVuYywgYnBmX3dxX3NldF9jYWxsYmFjaylcbitCVEZfSUQoZnVuYywgYnBmX3RocmVhZF93cV9zZXRfY2FsbGJhY2spXG4gQlRGX0lEKGZ1bmMsIGJwZl9wcmVlbXB0X2Rpc2FibGUpXG4gQlRGX0lEKGZ1bmMsIGJwZl9wcmVlbXB0X2VuYWJsZSlcbiAjaWZkZWYgQ09ORklHX0NHUk9VUFNcbkBAIC0xMTQ2MCw2ICsxMTQ3OSw4IEBAIGdldF9rZnVuY19hcmdfdHlwZShzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52LCBzdHJ1Y3QgYnBmX2NhbGxfYXJnX21ldGEgKm1ldGEsXG4gXHRcdGFyZ190eXBlID0gS0ZfQVJHX1BUUl9UT19USU1FUjtcbiBcdGVsc2UgaWYgKGlzX2tmdW5jX2FyZ190YXNrX3dvcmsobWV0YS1cdTAwM2VidGYsIFx1MDAyNmFyZ3NbYXJnXSkpXG4gXHRcdGFyZ190eXBlID0gS0ZfQVJHX1BUUl9UT19UQVNLX1dPUks7XG4rXHRlbHNlIGlmIChpc19rZnVuY19hcmdfdGhyZWFkX3dxKG1ldGEtXHUwMDNlYnRmLCBcdTAwMjZhcmdzW2FyZ10pKVxuK1x0XHRhcmdfdHlwZSA9IEtGX0FSR19QVFJfVE9fVEhSRUFEX1dRO1xuIFx0ZWxzZSBpZiAoaXNfa2Z1bmNfYXJnX2lycV9mbGFnKG1ldGEtXHUwMDNlYnRmLCBcdTAwMjZhcmdzW2FyZ10pKVxuIFx0XHRhcmdfdHlwZSA9IEtGX0FSR19QVFJfVE9fSVJRX0ZMQUc7XG4gXHRlbHNlIGlmIChpc19rZnVuY19hcmdfcmVzX3NwaW5fbG9jayhtZXRhLVx1MDAzZWJ0ZiwgXHUwMDI2YXJnc1thcmddKSlcbkBAIC0xMTgzMyw2ICsxMTg1NCw3IEBAIHN0YXRpYyBib29sIGlzX3N5bmNfY2FsbGJhY2tfY2FsbGluZ19rZnVuYyh1MzIgYnRmX2lkKVxuIHN0YXRpYyBib29sIGlzX2FzeW5jX2NhbGxiYWNrX2NhbGxpbmdfa2Z1bmModTMyIGJ0Zl9pZClcbiB7XG4gXHRyZXR1cm4gaXNfYnBmX3dxX3NldF9jYWxsYmFja19rZnVuYyhidGZfaWQpIHx8XG4rXHQgICAgICAgaXNfYnBmX3RocmVhZF93cV9zZXRfY2FsbGJhY2tfa2Z1bmMoYnRmX2lkKSB8fFxuIFx0ICAgICAgIGlzX3Rhc2tfd29ya19hZGRfa2Z1bmMoYnRmX2lkKTtcbiB9XG4gXG5AQCAtMTE4NDcsNiArMTE4NjksMTEgQEAgc3RhdGljIGJvb2wgaXNfYnBmX3dxX3NldF9jYWxsYmFja19rZnVuYyh1MzIgYnRmX2lkKVxuIFx0cmV0dXJuIGJ0Zl9pZCA9PSBzcGVjaWFsX2tmdW5jX2xpc3RbS0ZfYnBmX3dxX3NldF9jYWxsYmFja107XG4gfVxuIFxuK3N0YXRpYyBib29sIGlzX2JwZl90aHJlYWRfd3Ffc2V0X2NhbGxiYWNrX2tmdW5jKHUzMiBidGZfaWQpXG4re1xuK1x0cmV0dXJuIGJ0Zl9pZCA9PSBzcGVjaWFsX2tmdW5jX2xpc3RbS0ZfYnBmX3RocmVhZF93cV9zZXRfY2FsbGJhY2tdO1xuK31cbitcbiBzdGF0aWMgYm9vbCBpc19jYWxsYmFja19jYWxsaW5nX2tmdW5jKHUzMiBidGZfaWQpXG4ge1xuIFx0cmV0dXJuIGlzX3N5bmNfY2FsbGJhY2tfY2FsbGluZ19rZnVuYyhidGZfaWQpIHx8XG5AQCAtMTIxOTIsNiArMTIyMTksNyBAQCBzdGF0aWMgaW50IGNoZWNrX2tmdW5jX2FyZ3Moc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudiwgc3RydWN0IGJwZl9jYWxsX2FyZ19tZVxuIFx0XHRjYXNlIEtGX0FSR19QVFJfVE9fV09SS1FVRVVFOlxuIFx0XHRjYXNlIEtGX0FSR19QVFJfVE9fVElNRVI6XG4gXHRcdGNhc2UgS0ZfQVJHX1BUUl9UT19UQVNLX1dPUks6XG4rXHRcdGNhc2UgS0ZfQVJHX1BUUl9UT19USFJFQURfV1E6XG4gXHRcdGNhc2UgS0ZfQVJHX1BUUl9UT19JUlFfRkxBRzpcbiBcdFx0Y2FzZSBLRl9BUkdfUFRSX1RPX1JFU19TUElOX0xPQ0s6XG4gXHRcdFx0YnJlYWs7XG5AQCAtMTMxMzksNiArMTMxNjcsMTYgQEAgc3RhdGljIGludCBjaGVja19rZnVuY19jYWxsKHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsIHN0cnVjdCBicGZfaW5zbiAqaW5zbixcbiBcdFx0fVxuIFx0fVxuIFxuK1x0aWYgKGlzX2JwZl90aHJlYWRfd3Ffc2V0X2NhbGxiYWNrX2tmdW5jKG1ldGEuZnVuY19pZCkpIHtcbitcdFx0ZXJyID0gcHVzaF9jYWxsYmFja19jYWxsKGVudiwgaW5zbiwgaW5zbl9pZHgsIG1ldGEuc3VicHJvZ25vLFxuK1x0XHRcdFx0XHQgc2V0X3RpbWVyX2NhbGxiYWNrX3N0YXRlKTtcbitcdFx0aWYgKGVycikge1xuK1x0XHRcdHZlcmJvc2UoZW52LCBcImtmdW5jICVzIyVkIGZhaWxlZCBjYWxsYmFjayB2ZXJpZmljYXRpb25cXG5cIixcbitcdFx0XHRcdGZ1bmNfbmFtZSwgbWV0YS5mdW5jX2lkKTtcbitcdFx0XHRyZXR1cm4gZXJyO1xuK1x0XHR9XG4rXHR9XG4rXG4gXHRpZiAoaXNfdGFza193b3JrX2FkZF9rZnVuYyhtZXRhLmZ1bmNfaWQpKSB7XG4gXHRcdGVyciA9IHB1c2hfY2FsbGJhY2tfY2FsbChlbnYsIGluc24sIGluc25faWR4LCBtZXRhLnN1YnByb2dubyxcbiBcdFx0XHRcdFx0IHNldF90YXNrX3dvcmtfc2NoZWR1bGVfY2FsbGJhY2tfc3RhdGUpO1xuZGlmZiAtLWdpdCBhL2tlcm5lbC9jZ3JvdXAvY2dyb3VwLmMgYi9rZXJuZWwvY2dyb3VwL2Nncm91cC5jXG5pbmRleCAzOGY4ZDlkZjhmYmM0Li4xNjRlMDY5Yzc1NzYyIDEwMDY0NFxuLS0tIGEva2VybmVsL2Nncm91cC9jZ3JvdXAuY1xuKysrIGIva2VybmVsL2Nncm91cC9jZ3JvdXAuY1xuQEAgLTMwNDIsNiArMzA0MiwxOSBAQCBpbnQgY2dyb3VwX2F0dGFjaF90YXNrKHN0cnVjdCBjZ3JvdXAgKmRzdF9jZ3JwLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKmxlYWRlcixcbiBcdHJldHVybiByZXQ7XG4gfVxuIFxuK2ludCBjZ3JvdXBfa3RocmVhZF9hdHRhY2goc3RydWN0IGNncm91cCAqY2dycCwgc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKVxuK3tcbitcdGludCByZXQ7XG4rXG4rXHRjZ3JvdXBfbG9jaygpO1xuK1x0Y2dyb3VwX2F0dGFjaF9sb2NrKENHUlBfQVRUQUNIX0xPQ0tfR0xPQkFMLCBOVUxMKTtcbitcdHJldCA9IGNncm91cF9hdHRhY2hfdGFzayhjZ3JwLCB0YXNrLCBmYWxzZSk7XG4rXHRjZ3JvdXBfYXR0YWNoX3VubG9jayhDR1JQX0FUVEFDSF9MT0NLX0dMT0JBTCwgTlVMTCk7XG4rXHRjZ3JvdXBfdW5sb2NrKCk7XG4rXG4rXHRyZXR1cm4gcmV0O1xuK31cbitcbiBzdHJ1Y3QgdGFza19zdHJ1Y3QgKmNncm91cF9wcm9jc193cml0ZV9zdGFydChjaGFyICpidWYsIGJvb2wgdGhyZWFkZ3JvdXAsXG4gXHRcdFx0XHRcdCAgICAgZW51bSBjZ3JvdXBfYXR0YWNoX2xvY2tfbW9kZSAqbG9ja19tb2RlKVxuIHtcbmRpZmYgLS1naXQgYS9tbS9icGZfbWVtY29udHJvbC5jIGIvbW0vYnBmX21lbWNvbnRyb2wuY1xuaW5kZXggNzE2ZGY0OWQ3NjQ3Ny4uM2Y3YTVjOTdlMTM1NSAxMDA2NDRcbi0tLSBhL21tL2JwZl9tZW1jb250cm9sLmNcbisrKyBiL21tL2JwZl9tZW1jb250cm9sLmNcbkBAIC02LDYgKzYsNyBAQFxuICAqL1xuIFxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L21lbWNvbnRyb2wuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L3N3YXAuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L2JwZi5oXHUwMDNlXG4gXG4gX19icGZfa2Z1bmNfc3RhcnRfZGVmcygpO1xuQEAgLTE1OSw2ICsxNjAsNjEgQEAgX19icGZfa2Z1bmMgdm9pZCBicGZfbWVtX2Nncm91cF9mbHVzaF9zdGF0cyhzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2cpXG4gXHRtZW1fY2dyb3VwX2ZsdXNoX3N0YXRzKG1lbWNnKTtcbiB9XG4gXG4rLyoqXG4rICogYnBmX3RyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMgLSBhdHRlbXB0IHRvIHJlY2xhaW0gcGFnZXMgZnJvbVxuKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSBtZW1vcnkgY2dyb3VwXG4rICogQG1lbWNnOiAgICAgICAgICAgdGhlIHRhcmdldCBtZW1vcnkgY2dyb3VwIHRvIHJlY2xhaW0gZnJvbVxuKyAqIEBucl9wYWdlczogICAgICAgIHRoZSBudW1iZXIgb2YgcGFnZXMgdG8gcmVjbGFpbVxuKyAqIEBnZnBfbWFzazogICAgICAgIEdGUCBmbGFncyBjb250cm9sbGluZyB0aGUgcmVjbGFpbSBiZWhhdmlvclxuKyAqIEByZWNsYWltX29wdGlvbnM6IGJpdG1hc2sgb2YgTUVNQ0dfUkVDTEFJTV8qIGZsYWdzIHRvIHR1bmVcbisgKiAgICAgICAgICAgICAgICAgICByZWNsYWltIHN0cmF0ZWd5XG4rICogQHN3YXBwaW5lc3M6ICAgICAgc3dhcHBpbmVzcyBvdmVycmlkZSB2YWx1ZSwgb3IgYSBzZW50aW5lbCB0byB1c2VcbisgKiAgICAgICAgICAgICAgICAgICB0aGUgZGVmYXVsdFxuKyAqXG4rICogQlBGLWZhY2luZyB3cmFwcGVyIGFyb3VuZCB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKCkgdGhhdFxuKyAqIHZhbGlkYXRlcyBhbmQgdHJhbnNsYXRlcyB0aGUgQHN3YXBwaW5lc3MgYXJndW1lbnQgYmVmb3JlXG4rICogZGVsZWdhdGluZyB0byB0aGUgY29yZSByZWNsYWltIHBhdGguXG4rICpcbisgKiBUaGUgQHN3YXBwaW5lc3MgcGFyYW1ldGVyIGZvbGxvd3MgdGhlc2Ugc2VtYW50aWNzOlxuKyAqICAgLSBWYWx1ZXMgaW4gW01JTl9TV0FQUElORVNTLCBTV0FQUElORVNTX0FOT05fT05MWV0gYXJlIHBhc3NlZFxuKyAqICAgICB0aHJvdWdoIGFzIGFuIGV4cGxpY2l0IHN3YXBwaW5lc3Mgb3ZlcnJpZGUuXG4rICogICAtIFZhbHVlcyBiZWxvdyBNSU5fU1dBUFBJTkVTUyBhcmUgdHJlYXRlZCBhcyBcInVzZSB0aGUgc3lzdGVtXG4rICogICAgIGRlZmF1bHRcIjsgdGhlIG92ZXJyaWRlIHBvaW50ZXIgaXMgc2V0IHRvIE5VTEwgYW5kIHRoZSBjZ3JvdXAnc1xuKyAqICAgICBvd24gc3dhcHBpbmVzcyBzZXR0aW5nIHRha2VzIGVmZmVjdC5cbisgKiAgIC0gVmFsdWVzIGFib3ZlIFNXQVBQSU5FU1NfQU5PTl9PTkxZIGFyZSByZWplY3RlZCBhcyBpbnZhbGlkLlxuKyAqICAgLSBJZiBAcmVjbGFpbV9vcHRpb25zIGRvZXMgbm90IGluY2x1ZGUgTUVNQ0dfUkVDTEFJTV9QUk9BQ1RJVkUsXG4rICogICAgIHRoZSBAc3dhcHBpbmVzcyBvdmVycmlkZSBpcyBpZ25vcmVkIGVudGlyZWx5IGJ5IHRoZSBjb3JlXG4rICogICAgIHJlY2xhaW0gcGF0aCBhbmQgdGhlIHN5c3RlbSBkZWZhdWx0IGlzIHVzZWQgcmVnYXJkbGVzcy5cbisgKlxuKyAqIFN3YXAgdXNhZ2UgZHVyaW5nIHJlY2xhaW0gaXMgZ2F0ZWQgb24gQHJlY2xhaW1fb3B0aW9uczogc3dhcCBpc1xuKyAqIGNvbnNpZGVyZWQgb25seSB3aGVuIE1FTUNHX1JFQ0xBSU1fTUFZX1NXQVAgaXMgc2V0LiAgV2l0aG91dCB0aGlzXG4rICogZmxhZywgcmVjbGFpbSBpcyByZXN0cmljdGVkIHRvIGZpbGUtYmFja2VkIHBhZ2VzIHJlZ2FyZGxlc3Mgb2YgdGhlXG4rICogQHN3YXBwaW5lc3MgdmFsdWUgb3IgdGhlIGNncm91cCdzIHN3YXBwaW5lc3Mgc2V0dGluZy5cbisgKlxuKyAqIFJldHVybjpcbisgKiAgIFRoZSBudW1iZXIgb2YgcGFnZXMgYWN0dWFsbHkgcmVjbGFpbWVkIG9uIHN1Y2Nlc3MsIG9yIDBcbisgKiAgIGlmIEBzd2FwcGluZXNzIGV4Y2VlZHMgU1dBUFBJTkVTU19BTk9OX09OTFkuXG4rICovXG4rX19icGZfa2Z1bmMgdW5zaWduZWQgbG9uZ1xuK2JwZl90cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZyxcbitcdFx0XHRcdCB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzLFxuK1x0XHRcdFx0IGdmcF90IGdmcF9tYXNrLFxuK1x0XHRcdFx0IHVuc2lnbmVkIGludCByZWNsYWltX29wdGlvbnMsXG4rXHRcdFx0XHQgaW50IHN3YXBwaW5lc3MpXG4re1xuK1x0aW50ICpzd2FwaW5lc3NfcHRyO1xuK1xuK1x0aWYgKHN3YXBwaW5lc3MgXHUwMDNlIFNXQVBQSU5FU1NfQU5PTl9PTkxZKVxuK1x0XHRyZXR1cm4gMDtcbitcdGVsc2UgaWYgKHN3YXBwaW5lc3MgXHUwMDNjIE1JTl9TV0FQUElORVNTKVxuK1x0XHRzd2FwaW5lc3NfcHRyID0gTlVMTDtcbitcdGVsc2VcbitcdFx0c3dhcGluZXNzX3B0ciA9IFx1MDAyNnN3YXBwaW5lc3M7XG4rXG4rXHRyZXR1cm4gdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcyhtZW1jZywgbnJfcGFnZXMsIGdmcF9tYXNrLFxuK1x0XHRcdFx0XHQgICAgcmVjbGFpbV9vcHRpb25zLCBzd2FwaW5lc3NfcHRyKTtcbit9XG4rXG4gX19icGZfa2Z1bmNfZW5kX2RlZnMoKTtcbiBcbiBCVEZfS0ZVTkNTX1NUQVJUKGJwZl9tZW1jb250cm9sX2tmdW5jcylcbkBAIC0xNzIsNiArMjI4LDggQEAgQlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9tZW1fY2dyb3VwX3VzYWdlKVxuIEJURl9JRF9GTEFHUyhmdW5jLCBicGZfbWVtX2Nncm91cF9wYWdlX3N0YXRlKVxuIEJURl9JRF9GTEFHUyhmdW5jLCBicGZfbWVtX2Nncm91cF9mbHVzaF9zdGF0cywgS0ZfU0xFRVBBQkxFKVxuIFxuK0JURl9JRF9GTEFHUyhmdW5jLCBicGZfdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcywgS0ZfU0xFRVBBQkxFKVxuK1xuIEJURl9LRlVOQ1NfRU5EKGJwZl9tZW1jb250cm9sX2tmdW5jcylcbiBcbiBzdGF0aWMgY29uc3Qgc3RydWN0IGJ0Zl9rZnVuY19pZF9zZXQgYnBmX21lbWNvbnRyb2xfa2Z1bmNfc2V0ID0ge1xuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9icGZfZXhwZXJpbWVudGFsLmggYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvYnBmX2V4cGVyaW1lbnRhbC5oXG5pbmRleCBmZjM3YWU1YTExM2RjLi5lYTkwNWVhNTYwM2MyIDEwMDY0NFxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL2JwZl9leHBlcmltZW50YWwuaFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL2JwZl9leHBlcmltZW50YWwuaFxuQEAgLTM1MSw2ICszNTEsMTMgQEAgZXh0ZXJuIHZvaWQgYnBmX2l0ZXJfY3NzX2Rlc3Ryb3koc3RydWN0IGJwZl9pdGVyX2NzcyAqaXQpIF9fd2VhayBfX2tzeW07XG4gZXh0ZXJuIGludCBicGZfd3FfaW5pdChzdHJ1Y3QgYnBmX3dxICp3cSwgdm9pZCAqcF9fbWFwLCB1bnNpZ25lZCBpbnQgZmxhZ3MpIF9fd2VhayBfX2tzeW07XG4gZXh0ZXJuIGludCBicGZfd3Ffc3RhcnQoc3RydWN0IGJwZl93cSAqd3EsIHVuc2lnbmVkIGludCBmbGFncykgX193ZWFrIF9fa3N5bTtcbiBcbitzdHJ1Y3QgYnBmX3RocmVhZF93cTtcbitleHRlcm4gaW50IGJwZl90aHJlYWRfd3FfaW5pdChzdHJ1Y3QgYnBmX3RocmVhZF93cSAqdHdxLCB2b2lkICpwX19tYXAsXG4rXHRcdFx0ICAgICAgX191NjQgY2dyb3VwX2lkLFxuK1x0XHRcdCAgICAgIHVuc2lnbmVkIGludCBmbGFncykgX193ZWFrIF9fa3N5bTtcbitleHRlcm4gaW50IGJwZl90aHJlYWRfd3Ffc3RhcnQoc3RydWN0IGJwZl90aHJlYWRfd3EgKnR3cSxcbitcdFx0XHQgICAgICAgdW5zaWduZWQgaW50IGZsYWdzKSBfX3dlYWsgX19rc3ltO1xuK1xuIHN0cnVjdCBicGZfaXRlcl9rbWVtX2NhY2hlO1xuIGV4dGVybiBpbnQgYnBmX2l0ZXJfa21lbV9jYWNoZV9uZXcoc3RydWN0IGJwZl9pdGVyX2ttZW1fY2FjaGUgKml0KSBfX3dlYWsgX19rc3ltO1xuIGV4dGVybiBzdHJ1Y3Qga21lbV9jYWNoZSAqYnBmX2l0ZXJfa21lbV9jYWNoZV9uZXh0KHN0cnVjdCBicGZfaXRlcl9rbWVtX2NhY2hlICppdCkgX193ZWFrIF9fa3N5bTtcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9tZW1jZ19hc3luY19yZWNsYWltLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9tZW1jZ19hc3luY19yZWNsYWltLmNcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwLi40MGE1ZmU2MmNiMzg0XG4tLS0gL2Rldi9udWxsXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9tZW1jZ19hc3luY19yZWNsYWltLmNcbkBAIC0wLDAgKzEsNDc5IEBAXG4rLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcbisvKlxuKyAqIE1lbW9yeSBjb250cm9sbGVyIGVCUEYgYXN5bmMgcmVjbGFpbSB0ZXN0XG4rICovXG4rXG4rI2luY2x1ZGUgXHUwMDNjdGVzdF9wcm9ncy5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3lzL21tYW4uaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3N5cy9zdGF0LmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NzeXMvdGltZS5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3lzL3Zmcy5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3lzL3dhaXQuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2ZjbnRsLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9tYWdpYy5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjdW5pc3RkLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NzdGRpby5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3RkbGliLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NzdHJpbmcuaFx1MDAzZVxuK1xuKyNpbmNsdWRlIFwiY2dyb3VwX2hlbHBlcnMuaFwiXG4rXG4rc3RydWN0IGJwZl9hcmdzX3Mge1xuK1x0dTY0IGhpZ2hfY2dyb3VwX2lkO1xuK1x0dTY0IGxvd19jZ3JvdXBfaWQ7XG4rXHR1NjQgZXZlbnRfZGVsdGFfdGhyZXNob2xkO1xuK1x0dTY0IGNoZWNrX25zO1xuK307XG4rXG4rI2luY2x1ZGUgXCJtZW1jZ19hc3luY19yZWNsYWltLnNrZWwuaFwiXG4rXG4rI2RlZmluZSBGSUxFX1NJWkUgKDMyICogMTAyNCAqIDEwMjR1bClcbisjZGVmaW5lIEJVRkZFUl9TSVpFICg0MDk2KVxuKyNkZWZpbmUgQ0dfTElNSVQgKDMyICogMTAyNCAqIDEwMjR1bClcbisjZGVmaW5lIFJFQURfVElNRVMgMTZcbitcbisjZGVmaW5lIENHX0RJUiBcIi9tZW1jZ19hc3luY19yZWNsYWltXCJcbisjZGVmaW5lIENHX0hJR0hfRElSIENHX0RJUiBcIi9oaWdoXCJcbisjZGVmaW5lIENHX0xPV19ESVIgQ0dfRElSIFwiL2xvd1wiXG4rXG4rI2RlZmluZSBDSEVDS19QRVJJT0RfTlMgKDIgKiAxMDAwICogMTAwMHVsbClcbisjZGVmaW5lIEVWRU5UX0RFTFRBX1RIUkVTSE9MRCAxXG4rXG4rLypcbisgKiBUZXN0IGZpbGVzIG11c3QgcmVzaWRlIG9uIGEgZmlsZXN5c3RlbSB0aGF0IHN1cHBvcnRzIHBhZ2UgcmVjbGFpbSB3aXRob3V0XG4rICogc3dhcCAoZS5nLiBleHQ0KS4gSWYgL3RtcCBpcyBvbiB0bXBmcywgdGhlIGZpbGUgcGFnZXMgYXJlIHNobWVtLWJhY2tlZFxuKyAqIGFuZCBjYW4gb25seSBiZSByZWNsYWltZWQgdGhyb3VnaCBzd2FwLiBCdXQgdGhlIHRlc3QgZGlzYWJsZXMgc3dhcFxuKyAqIChtZW1vcnkuc3dhcC5tYXg9MCksIG1ha2luZyByZWNsYWltIGltcG9zc2libGUgYW5kIGNhdXNpbmcgT09NLlxuKyAqXG4rICogUGljayBhIGRpcmVjdG9yeSBvbiBhIG5vbi10bXBmcyBmaWxlc3lzdGVtOiB0cnkgJFRNUERJUiBmaXJzdCwgdGhlbiAvdG1wLFxuKyAqIGFuZCBmYWxsIGJhY2sgdG8gdGhlIGN1cnJlbnQgZGlyZWN0b3J5IGlmIHRoZSBjaG9zZW4gcGF0aCBpcyBvbiB0bXBmcy5cbisgKi9cbitzdGF0aWMgaW50IGdldF90ZXN0X2RpcihjaGFyICpidWYsIHNpemVfdCBzaXplKVxuK3tcbitcdHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgY2FuZGlkYXRlc1tdID0geyBcIi90bXBcIiwgXCIuXCIgfTtcbitcdGNvbnN0IGNoYXIgKnRtcGRpciA9IGdldGVudihcIlRNUERJUlwiKTtcbitcdHN0cnVjdCBzdGF0ZnMgc2ZzO1xuK1x0c2l6ZV90IGk7XG4rXG4rXHRpZiAodG1wZGlyIFx1MDAyNlx1MDAyNiB0bXBkaXJbMF0gXHUwMDI2XHUwMDI2IHN0YXRmcyh0bXBkaXIsIFx1MDAyNnNmcykgPT0gMCBcdTAwMjZcdTAwMjZcbitcdCAgICBzZnMuZl90eXBlICE9IFRNUEZTX01BR0lDKSB7XG4rXHRcdHNucHJpbnRmKGJ1Ziwgc2l6ZSwgXCIlc1wiLCB0bXBkaXIpO1xuK1x0XHRyZXR1cm4gMDtcbitcdH1cbitcbitcdGZvciAoaSA9IDA7IGkgXHUwMDNjIEFSUkFZX1NJWkUoY2FuZGlkYXRlcyk7IGkrKykge1xuK1x0XHRpZiAoc3RhdGZzKGNhbmRpZGF0ZXNbaV0sIFx1MDAyNnNmcykgPT0gMCBcdTAwMjZcdTAwMjZcbitcdFx0ICAgIHNmcy5mX3R5cGUgIT0gVE1QRlNfTUFHSUMpIHtcbitcdFx0XHRzbnByaW50ZihidWYsIHNpemUsIFwiJXNcIiwgY2FuZGlkYXRlc1tpXSk7XG4rXHRcdFx0cmV0dXJuIDA7XG4rXHRcdH1cbitcdH1cbitcbitcdHJldHVybiAtMTtcbit9XG4rXG4rc3RhdGljIGludCBzZXR1cF9oaWdoX2xvd19jZ3JvdXBzKHU2NCAqaGlnaF9jZ3JvdXBfaWQsIHU2NCAqbG93X2Nncm91cF9pZClcbit7XG4rXHRpbnQgcmV0O1xuK1x0Y2hhciBsaW1pdF9idWZbMjBdO1xuK1xuK1x0cmV0ID0gc2V0dXBfY2dyb3VwX2Vudmlyb25tZW50KCk7XG4rXHRpZiAoIUFTU0VSVF9PSyhyZXQsIFwic2V0dXBfY2dyb3VwX2Vudmlyb25tZW50XCIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXG4rXHRyZXQgPSBjcmVhdGVfYW5kX2dldF9jZ3JvdXAoQ0dfRElSKTtcbitcdGlmICghQVNTRVJUX0dFKHJldCwgMCwgXCJjcmVhdGVfYW5kX2dldF9jZ3JvdXAgXCIgQ0dfRElSKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1x0Y2xvc2UocmV0KTtcbitcbitcdHJldCA9IGVuYWJsZV9jb250cm9sbGVycyhDR19ESVIsIFwibWVtb3J5XCIpO1xuK1x0aWYgKCFBU1NFUlRfT0socmV0LCBcImVuYWJsZV9jb250cm9sbGVyc1wiKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1xuK1x0c25wcmludGYobGltaXRfYnVmLCBzaXplb2YobGltaXRfYnVmKSwgXCIlbHVcIiwgQ0dfTElNSVQpO1xuK1x0cmV0ID0gd3JpdGVfY2dyb3VwX2ZpbGUoQ0dfRElSLCBcIm1lbW9yeS5tYXhcIiwgbGltaXRfYnVmKTtcbitcdGlmICghQVNTRVJUX09LKHJldCwgXCJ3cml0ZV9jZ3JvdXBfZmlsZSBtZW1vcnkubWF4XCIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXG4rXHRyZXQgPSB3cml0ZV9jZ3JvdXBfZmlsZShDR19ESVIsIFwibWVtb3J5LnN3YXAubWF4XCIsIFwiMFwiKTtcbitcdGlmICghQVNTRVJUX09LKHJldCwgXCJ3cml0ZV9jZ3JvdXBfZmlsZSBtZW1vcnkuc3dhcC5tYXhcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcbitcdHJldCA9IGNyZWF0ZV9hbmRfZ2V0X2Nncm91cChDR19ISUdIX0RJUik7XG4rXHRpZiAoIUFTU0VSVF9HRShyZXQsIDAsIFwiY3JlYXRlX2FuZF9nZXRfY2dyb3VwIFwiIENHX0hJR0hfRElSKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1x0Y2xvc2UocmV0KTtcbitcbitcdCpoaWdoX2Nncm91cF9pZCA9IGdldF9jZ3JvdXBfaWQoQ0dfSElHSF9ESVIpO1xuK1x0aWYgKCFBU1NFUlRfR1QoKmhpZ2hfY2dyb3VwX2lkLCAwLCBcImdldF9jZ3JvdXBfaWRcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcbitcdHJldCA9IGNyZWF0ZV9hbmRfZ2V0X2Nncm91cChDR19MT1dfRElSKTtcbitcdGlmICghQVNTRVJUX0dFKHJldCwgMCwgXCJjcmVhdGVfYW5kX2dldF9jZ3JvdXAgXCIgQ0dfTE9XX0RJUikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcdGNsb3NlKHJldCk7XG4rXG4rXHQqbG93X2Nncm91cF9pZCA9IGdldF9jZ3JvdXBfaWQoQ0dfTE9XX0RJUik7XG4rXHRpZiAoIUFTU0VSVF9HVCgqaGlnaF9jZ3JvdXBfaWQsIDAsIFwiZ2V0X2Nncm91cF9pZFwiKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1xuK1x0cmV0dXJuIDA7XG4rXG4rY2xlYW51cDpcbitcdGNsZWFudXBfY2dyb3VwX2Vudmlyb25tZW50KCk7XG4rXHRyZXR1cm4gLTE7XG4rfVxuK1xuK3N0YXRpYyBpbnQgd3JpdGVfZmlsZShjb25zdCBjaGFyICpmaWxlbmFtZSlcbit7XG4rXHRpbnQgcmV0ID0gLTE7XG4rXHRzaXplX3Qgd3JpdHRlbiA9IDA7XG4rXHRjaGFyICpidWZmZXI7XG4rXHRGSUxFICpmcDtcbitcbitcdGZwID0gZm9wZW4oZmlsZW5hbWUsIFwid2JcIik7XG4rXHRpZiAoIWZwKVxuK1x0XHRnb3RvIG91dDtcbitcbitcdGJ1ZmZlciA9IG1hbGxvYyhCVUZGRVJfU0laRSk7XG4rXHRpZiAoIWJ1ZmZlcilcbitcdFx0Z290byBjbGVhbnVwX2ZwO1xuK1xuK1x0bWVtc2V0KGJ1ZmZlciwgJ0EnLCBCVUZGRVJfU0laRSk7XG4rXG4rXHR3aGlsZSAod3JpdHRlbiBcdTAwM2MgRklMRV9TSVpFKSB7XG4rXHRcdHNpemVfdCB0b193cml0ZSA9IEZJTEVfU0laRSAtIHdyaXR0ZW4gXHUwMDNjIEJVRkZFUl9TSVpFID9cbitcdFx0XHRcdCAgRklMRV9TSVpFIC0gd3JpdHRlbiA6IEJVRkZFUl9TSVpFO1xuK1xuK1x0XHRpZiAoZndyaXRlKGJ1ZmZlciwgMSwgdG9fd3JpdGUsIGZwKSAhPSB0b193cml0ZSlcbitcdFx0XHRnb3RvIGNsZWFudXA7XG4rXHRcdHdyaXR0ZW4gKz0gdG9fd3JpdGU7XG4rXHR9XG4rXG4rXHRyZXQgPSAwO1xuK2NsZWFudXA6XG4rXHRmcmVlKGJ1ZmZlcik7XG4rY2xlYW51cF9mcDpcbitcdGZjbG9zZShmcCk7XG4rb3V0OlxuK1x0cmV0dXJuIHJldDtcbit9XG4rXG4rc3RhdGljIGludCByZWFkX2ZpbGUoY29uc3QgY2hhciAqZmlsZW5hbWUsIGludCBpdGVyYXRpb25zKVxuK3tcbitcdGludCByZXQgPSAtMTtcbitcdGxvbmcgcGFnZV9zaXplID0gc3lzY29uZihfU0NfUEFHRVNJWkUpO1xuK1x0Y2hhciAqbWFwO1xuK1x0c2l6ZV90IGk7XG4rXHRpbnQgZmQ7XG4rXHRzdHJ1Y3Qgc3RhdCBzYjtcbitcbitcdGZkID0gb3BlbihmaWxlbmFtZSwgT19SRE9OTFkpO1xuK1x0aWYgKGZkID09IC0xKVxuK1x0XHRnb3RvIG91dDtcbitcbitcdGlmIChmc3RhdChmZCwgXHUwMDI2c2IpID09IC0xKVxuK1x0XHRnb3RvIGNsZWFudXBfZmQ7XG4rXG4rXHRpZiAoc2Iuc3Rfc2l6ZSAhPSBGSUxFX1NJWkUpIHtcbitcdFx0ZnByaW50ZihzdGRlcnIsIFwiRmlsZSBzaXplIG1pc21hdGNoOiBleHBlY3RlZCAlbHUsIGdvdCAlbHVcXG5cIixcbitcdFx0XHQodW5zaWduZWQgbG9uZylGSUxFX1NJWkUsICh1bnNpZ25lZCBsb25nKXNiLnN0X3NpemUpO1xuK1x0XHRnb3RvIGNsZWFudXBfZmQ7XG4rXHR9XG4rXG4rXHRtYXAgPSBtbWFwKE5VTEwsIEZJTEVfU0laRSwgUFJPVF9SRUFELCBNQVBfUFJJVkFURSwgZmQsIDApO1xuK1x0aWYgKG1hcCA9PSBNQVBfRkFJTEVEKVxuK1x0XHRnb3RvIGNsZWFudXBfZmQ7XG4rXG4rXHRmb3IgKGludCBpdGVyID0gMDsgaXRlciBcdTAwM2MgaXRlcmF0aW9uczsgaXRlcisrKSB7XG4rXHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIEZJTEVfU0laRTsgaSArPSBwYWdlX3NpemUpIHtcbitcdFx0XHQvKiBhY2Nlc3MgYSBieXRlIHRvIHRyaWdnZXIgcGFnZSBmYXVsdCAqL1xuK1x0XHRcdGFzbSB2b2xhdGlsZShcIlwiIDo6IFwiclwiKG1hcFtpXSkgOiBcIm1lbW9yeVwiKTtcbitcdFx0fVxuK1x0fVxuK1xuK1x0aWYgKG11bm1hcChtYXAsIEZJTEVfU0laRSkgPT0gLTEpXG4rXHRcdGdvdG8gY2xlYW51cF9mZDtcbitcbitcdHJldCA9IDA7XG4rXG4rY2xlYW51cF9mZDpcbitcdGNsb3NlKGZkKTtcbitvdXQ6XG4rXHRyZXR1cm4gcmV0O1xuK31cbitcbitzdGF0aWMgaW50IHJlYWxfdGVzdF9jaGlsZF93b3JrKGNvbnN0IGNoYXIgKmNncm91cF9wYXRoLCBjaGFyICpkYXRhX2ZpbGVuYW1lLFxuK1x0XHRcdFx0Y2hhciAqdGltZV9maWxlbmFtZSwgaW50IHJlYWRfdGltZXMpXG4re1xuK1x0c3RydWN0IHRpbWV2YWwgc3RhcnQsIGVuZDtcbitcdGRvdWJsZSBlbGFwc2VkO1xuK1x0RklMRSAqZnA7XG4rXG4rXHRpZiAoIUFTU0VSVF9PSyhqb2luX3BhcmVudF9jZ3JvdXAoY2dyb3VwX3BhdGgpLCBcImpvaW5fcGFyZW50X2Nncm91cFwiKSlcbitcdFx0cmV0dXJuIC0xO1xuK1xuK1x0Z2V0dGltZW9mZGF5KFx1MDAyNnN0YXJ0LCBOVUxMKTtcbitcbitcdGlmICghQVNTRVJUX09LKHdyaXRlX2ZpbGUoZGF0YV9maWxlbmFtZSksIFwid3JpdGVfZmlsZVwiKSlcbitcdFx0cmV0dXJuIC0xO1xuK1xuK1x0aWYgKCFBU1NFUlRfT0socmVhZF9maWxlKGRhdGFfZmlsZW5hbWUsIHJlYWRfdGltZXMpLCBcInJlYWRfZmlsZVwiKSlcbitcdFx0cmV0dXJuIC0xO1xuK1xuK1x0Z2V0dGltZW9mZGF5KFx1MDAyNmVuZCwgTlVMTCk7XG4rXG4rXHRpZiAoIXRpbWVfZmlsZW5hbWUpXG4rXHRcdHJldHVybiAwO1xuK1xuK1x0ZWxhcHNlZCA9IChlbmQudHZfc2VjIC0gc3RhcnQudHZfc2VjKSArXG4rXHRcdCAgKGVuZC50dl91c2VjIC0gc3RhcnQudHZfdXNlYykgLyAxMDAwMDAwLjA7XG4rXHRwcmludGYoXCIlLjZmXFxuXCIsIGVsYXBzZWQpO1xuK1xuK1x0ZnAgPSBmb3Blbih0aW1lX2ZpbGVuYW1lLCBcIndcIik7XG4rXHRpZiAoIUFTU0VSVF9PS19QVFIoZnAsIFwiZm9wZW5cIikpXG4rXHRcdHJldHVybiAtMTtcbitcdGZwcmludGYoZnAsIFwiJS42ZlwiLCBlbGFwc2VkKTtcbitcdGZjbG9zZShmcCk7XG4rXG4rXHRyZXR1cm4gMDtcbit9XG4rXG4rc3RhdGljIGludCBnZXRfdGltZShjaGFyICp0aW1lX2ZpbGVuYW1lLCBkb3VibGUgKnRpbWUpXG4re1xuK1x0aW50IHJldCA9IC0xO1xuK1x0RklMRSAqZnA7XG4rXHRjaGFyIGJ1Zls2NF07XG4rXG4rXHRmcCA9IGZvcGVuKHRpbWVfZmlsZW5hbWUsIFwiclwiKTtcbitcdGlmICghQVNTRVJUX09LX1BUUihmcCwgXCJmb3BlblwiKSlcbitcdFx0Z290byBvdXQ7XG4rXG4rXHRpZiAoIUFTU0VSVF9PS19QVFIoZmdldHMoYnVmLCBzaXplb2YoYnVmKSwgZnApLCBcImZnZXRzXCIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXG4rXHRpZiAoc3NjYW5mKGJ1ZiwgXCIlbGZcIiwgdGltZSkgIT0gMSkge1xuK1x0XHRQUklOVF9GQUlMKFwic3NjYW5mICVzXCIsIGJ1Zik7XG4rXHRcdGdvdG8gY2xlYW51cDtcbitcdH1cbitcbitcdHJldCA9IDA7XG4rY2xlYW51cDpcbitcdGZjbG9zZShmcCk7XG4rb3V0OlxuK1x0cmV0dXJuIHJldDtcbit9XG4rXG4rc3RhdGljIGludFxuK3J1bl9oaWdoX2xvd193b3JrbG9hZChkb3VibGUgKmhpZ2hfZWxhcHNlZCwgZG91YmxlICpsb3dfZWxhcHNlZCwgaW50IHJlYWRfdGltZXMpXG4re1xuK1x0Y2hhciB0ZXN0X2RpcltQQVRIX01BWF0sIGhpZ2hfZGF0YV9maWxlW1BBVEhfTUFYXSwgbG93X2RhdGFfZmlsZVtQQVRIX01BWF07XG4rXHRjaGFyIGhpZ2hfdGltZV9maWxlW1BBVEhfTUFYXSwgbG93X3RpbWVfZmlsZVtQQVRIX01BWF07XG4rXHRpbnQgcmV0LCBmZDtcbitcdHBpZF90IGhpZ2hfcGlkLCBsb3dfcGlkO1xuK1x0aW50IHN0YXR1cztcbitcbitcdHJldCA9IGdldF90ZXN0X2Rpcih0ZXN0X2Rpciwgc2l6ZW9mKHRlc3RfZGlyKSk7XG4rXHRpZiAoIUFTU0VSVF9PSyhyZXQsIFwiZ2V0X3Rlc3RfZGlyOiBubyBub24tdG1wZnMgZGlyZWN0b3J5IGZvdW5kXCIpKVxuK1x0XHRyZXR1cm4gLTE7XG4rXG4rXHRmZCA9IHNucHJpbnRmKGhpZ2hfZGF0YV9maWxlLCBzaXplb2YoaGlnaF9kYXRhX2ZpbGUpLFxuK1x0XHQgICAgICBcIiVzL21lbWNnX2FzeW5jX2hpZ2hfZGF0YV9YWFhYWFhcIiwgdGVzdF9kaXIpO1xuK1x0aWYgKCFBU1NFUlRfTFQoZmQsIHNpemVvZihoaWdoX2RhdGFfZmlsZSksIFwiaGlnaF9kYXRhX2ZpbGUgcGF0aFwiKSlcbitcdFx0cmV0dXJuIC0xO1xuK1xuK1x0ZmQgPSBzbnByaW50Zihsb3dfZGF0YV9maWxlLCBzaXplb2YobG93X2RhdGFfZmlsZSksXG4rXHRcdCAgICAgIFwiJXMvbWVtY2dfYXN5bmNfbG93X2RhdGFfWFhYWFhYXCIsIHRlc3RfZGlyKTtcbitcdGlmICghQVNTRVJUX0xUKGZkLCBzaXplb2YobG93X2RhdGFfZmlsZSksIFwibG93X2RhdGFfZmlsZSBwYXRoXCIpKVxuK1x0XHRyZXR1cm4gLTE7XG4rXG4rXHRmZCA9IHNucHJpbnRmKGhpZ2hfdGltZV9maWxlLCBzaXplb2YoaGlnaF90aW1lX2ZpbGUpLFxuK1x0XHQgICAgICBcIiVzL21lbWNnX2FzeW5jX2hpZ2hfdGltZV9YWFhYWFhcIiwgdGVzdF9kaXIpO1xuK1x0aWYgKCFBU1NFUlRfTFQoZmQsIHNpemVvZihoaWdoX3RpbWVfZmlsZSksIFwiaGlnaF90aW1lX2ZpbGUgcGF0aFwiKSlcbitcdFx0cmV0dXJuIC0xO1xuK1xuK1x0ZmQgPSBzbnByaW50Zihsb3dfdGltZV9maWxlLCBzaXplb2YobG93X3RpbWVfZmlsZSksXG4rXHRcdCAgICAgIFwiJXMvbWVtY2dfYXN5bmNfbG93X3RpbWVfWFhYWFhYXCIsIHRlc3RfZGlyKTtcbitcdGlmICghQVNTRVJUX0xUKGZkLCBzaXplb2YobG93X3RpbWVfZmlsZSksIFwibG93X3RpbWVfZmlsZSBwYXRoXCIpKVxuK1x0XHRyZXR1cm4gLTE7XG4rXG4rXHRmZCA9IG1rc3RlbXAoaGlnaF9kYXRhX2ZpbGUpO1xuK1x0aWYgKCFBU1NFUlRfR0UoZmQsIDAsIFwibWtzdGVtcFwiKSlcbitcdFx0cmV0dXJuIC0xO1xuK1x0Y2xvc2UoZmQpO1xuK1xuK1x0ZmQgPSBta3N0ZW1wKGxvd19kYXRhX2ZpbGUpO1xuK1x0aWYgKCFBU1NFUlRfR0UoZmQsIDAsIFwibWtzdGVtcFwiKSlcbitcdFx0Z290byBjbGVhbnVwX2hpZ2hfZGF0YTtcbitcdGNsb3NlKGZkKTtcbitcbitcdGZkID0gbWtzdGVtcChoaWdoX3RpbWVfZmlsZSk7XG4rXHRpZiAoIUFTU0VSVF9HRShmZCwgMCwgXCJta3N0ZW1wXCIpKVxuK1x0XHRnb3RvIGNsZWFudXBfbG93X2RhdGE7XG4rXHRjbG9zZShmZCk7XG4rXG4rXHRmZCA9IG1rc3RlbXAobG93X3RpbWVfZmlsZSk7XG4rXHRpZiAoIUFTU0VSVF9HRShmZCwgMCwgXCJta3N0ZW1wXCIpKVxuK1x0XHRnb3RvIGNsZWFudXBfaGlnaF90aW1lO1xuK1x0Y2xvc2UoZmQpO1xuK1xuK1x0bG93X3BpZCA9IGZvcmsoKTtcbitcdGlmICghQVNTRVJUX0dFKGxvd19waWQsIDAsIFwiZm9yayBsb3dcIikpXG4rXHRcdGdvdG8gY2xlYW51cF9sb3dfdGltZTtcbitcdGlmIChsb3dfcGlkID09IDApXG4rXHRcdGV4aXQocmVhbF90ZXN0X2NoaWxkX3dvcmsoQ0dfTE9XX0RJUiwgbG93X2RhdGFfZmlsZSxcbitcdFx0XHRcdFx0ICBsb3dfdGltZV9maWxlLCByZWFkX3RpbWVzKSk7XG4rXG4rXHRoaWdoX3BpZCA9IGZvcmsoKTtcbitcdGlmICghQVNTRVJUX0dFKGhpZ2hfcGlkLCAwLCBcImZvcmsgaGlnaFwiKSkge1xuK1x0XHQodm9pZCl3YWl0cGlkKGxvd19waWQsIE5VTEwsIDApO1xuK1x0XHRnb3RvIGNsZWFudXBfbG93X3RpbWU7XG4rXHR9XG4rXHRpZiAoaGlnaF9waWQgPT0gMClcbitcdFx0ZXhpdChyZWFsX3Rlc3RfY2hpbGRfd29yayhDR19ISUdIX0RJUiwgaGlnaF9kYXRhX2ZpbGUsXG4rXHRcdFx0XHRcdCAgaGlnaF90aW1lX2ZpbGUsIHJlYWRfdGltZXMpKTtcbitcbitcdHJldCA9IHdhaXRwaWQobG93X3BpZCwgXHUwMDI2c3RhdHVzLCAwKTtcbitcdGlmICghQVNTRVJUX0dUKHJldCwgMCwgXCJsb3cgd2FpdHBpZFwiKSlcbitcdFx0Z290byBjbGVhbnVwX2xvd190aW1lO1xuK1x0aWYgKCFBU1NFUlRfVFJVRShXSUZFWElURUQoc3RhdHVzKSwgXCJsb3cgZXhpdGVkXCIpKVxuK1x0XHRnb3RvIGNsZWFudXBfbG93X3RpbWU7XG4rXHRpZiAoIUFTU0VSVF9FUShXRVhJVFNUQVRVUyhzdGF0dXMpLCAwLCBcImxvdyBleGl0IHN0YXR1c1wiKSlcbitcdFx0Z290byBjbGVhbnVwX2xvd190aW1lO1xuK1xuK1x0cmV0ID0gd2FpdHBpZChoaWdoX3BpZCwgXHUwMDI2c3RhdHVzLCAwKTtcbitcdGlmICghQVNTRVJUX0dUKHJldCwgMCwgXCJoaWdoIHdhaXRwaWRcIikpXG4rXHRcdGdvdG8gY2xlYW51cF9sb3dfdGltZTtcbitcdGlmICghQVNTRVJUX1RSVUUoV0lGRVhJVEVEKHN0YXR1cyksIFwiaGlnaCBleGl0ZWRcIikpXG4rXHRcdGdvdG8gY2xlYW51cF9sb3dfdGltZTtcbitcdGlmICghQVNTRVJUX0VRKFdFWElUU1RBVFVTKHN0YXR1cyksIDAsIFwiaGlnaCBleGl0IHN0YXR1c1wiKSlcbitcdFx0Z290byBjbGVhbnVwX2xvd190aW1lO1xuK1xuK1x0aWYgKGdldF90aW1lKGhpZ2hfdGltZV9maWxlLCBoaWdoX2VsYXBzZWQpKVxuK1x0XHRnb3RvIGNsZWFudXBfbG93X3RpbWU7XG4rXHRpZiAoZ2V0X3RpbWUobG93X3RpbWVfZmlsZSwgbG93X2VsYXBzZWQpKVxuK1x0XHRnb3RvIGNsZWFudXBfbG93X3RpbWU7XG4rXG4rXHRyZXQgPSAwO1xuK1xuK2NsZWFudXBfbG93X3RpbWU6XG4rXHR1bmxpbmsobG93X3RpbWVfZmlsZSk7XG4rY2xlYW51cF9oaWdoX3RpbWU6XG4rXHR1bmxpbmsoaGlnaF90aW1lX2ZpbGUpO1xuK2NsZWFudXBfbG93X2RhdGE6XG4rXHR1bmxpbmsobG93X2RhdGFfZmlsZSk7XG4rY2xlYW51cF9oaWdoX2RhdGE6XG4rXHR1bmxpbmsoaGlnaF9kYXRhX2ZpbGUpO1xuK1x0cmV0dXJuIHJldDtcbit9XG4rXG4rc3RhdGljIGludFxuK3NldHVwX2JwZih1NjQgaGlnaF9jZ3JvdXBfaWQsIHU2NCBsb3dfY2dyb3VwX2lkLFxuK1x0ICBzdHJ1Y3QgbWVtY2dfYXN5bmNfcmVjbGFpbSAqKnNrZWxfcHRyLCBib29sIHVzZV90aHJlYWRfd3EpXG4re1xuK1x0c3RydWN0IG1lbWNnX2FzeW5jX3JlY2xhaW0gKnNrZWw7XG4rXHRzdHJ1Y3QgYnBmX2FyZ3NfcyBicGZfYXJncyA9IHtcbitcdFx0LmhpZ2hfY2dyb3VwX2lkID0gaGlnaF9jZ3JvdXBfaWQsXG4rXHRcdC5sb3dfY2dyb3VwX2lkID0gbG93X2Nncm91cF9pZCxcbitcdFx0LmV2ZW50X2RlbHRhX3RocmVzaG9sZCA9IEVWRU5UX0RFTFRBX1RIUkVTSE9MRCxcbitcdFx0LmNoZWNrX25zID0gQ0hFQ0tfUEVSSU9EX05TLFxuK1x0fTtcbitcdExJQkJQRl9PUFRTKGJwZl90ZXN0X3J1bl9vcHRzLCBydW5fb3B0cyxcbitcdFx0LmN0eF9pbiA9IFx1MDAyNmJwZl9hcmdzLFxuK1x0XHQuY3R4X3NpemVfaW4gPSBzaXplb2YoYnBmX2FyZ3MpKTtcbitcdGludCBwcm9nX2luaXRfZmQsIGVycjtcbitcbitcdHNrZWwgPSBtZW1jZ19hc3luY19yZWNsYWltX19vcGVuX2FuZF9sb2FkKCk7XG4rXHRpZiAoIUFTU0VSVF9PS19QVFIoc2tlbCwgXCJtZW1jZ19hc3luY19yZWNsYWltX19vcGVuX2FuZF9sb2FkXCIpKVxuK1x0XHRyZXR1cm4gLTE7XG4rXG4rXHRpZiAodXNlX3RocmVhZF93cSlcbitcdFx0cHJvZ19pbml0X2ZkID0gYnBmX3Byb2dyYW1fX2ZkKHNrZWwtXHUwMDNlcHJvZ3MudGhyZWFkX3dxX3Byb2dfaW5pdCk7XG4rXHRlbHNlXG4rXHRcdHByb2dfaW5pdF9mZCA9IGJwZl9wcm9ncmFtX19mZChza2VsLVx1MDAzZXByb2dzLndxX3Byb2dfaW5pdCk7XG4rXHRpZiAoIUFTU0VSVF9HRShwcm9nX2luaXRfZmQsIDAsIFwiYnBmX3Byb2dyYW1fX2ZkXCIpKVxuK1x0XHRnb3RvIGVycm9yX291dDtcbitcbitcdGVyciA9IGJwZl9wcm9nX3Rlc3RfcnVuX29wdHMocHJvZ19pbml0X2ZkLCBcdTAwMjZydW5fb3B0cyk7XG4rXHRpZiAoIUFTU0VSVF9PSyhlcnIsIFwiYnBmX3Byb2dfdGVzdF9ydW5fb3B0c1wiKSlcbitcdFx0Z290byBlcnJvcl9vdXQ7XG4rXHRpZiAoIUFTU0VSVF9FUShydW5fb3B0cy5yZXR2YWwsIDAsIFwicHJvZ19pbml0IHJldHZhbFwiKSlcbitcdFx0Z290byBlcnJvcl9vdXQ7XG4rXG4rXHQqc2tlbF9wdHIgPSBza2VsO1xuK1x0cmV0dXJuIDA7XG4rXG4rZXJyb3Jfb3V0OlxuK1x0bWVtY2dfYXN5bmNfcmVjbGFpbV9fZGVzdHJveShza2VsKTtcbitcdHJldHVybiAtMTtcbit9XG4rXG4rdm9pZCB0ZXN0X21lbWNnX3dxX2FzeW5jX3JlY2xhaW0odm9pZClcbit7XG4rXHR1NjQgaGlnaF9jZ3JvdXBfaWQsIGxvd19jZ3JvdXBfaWQ7XG4rXHRpbnQgZXJyO1xuK1x0ZG91YmxlIGhpZ2hfdGltZSA9IDAuMCwgbG93X3RpbWUgPSAwLjA7XG4rXHRzdHJ1Y3QgbWVtY2dfYXN5bmNfcmVjbGFpbSAqc2tlbCA9IE5VTEw7XG4rXG4rXHRlcnIgPSBzZXR1cF9oaWdoX2xvd19jZ3JvdXBzKFx1MDAyNmhpZ2hfY2dyb3VwX2lkLCBcdTAwMjZsb3dfY2dyb3VwX2lkKTtcbitcdGlmICghQVNTRVJUX09LKGVyciwgXCJzZXR1cF9oaWdoX2xvd19jZ3JvdXBzIHJlY2xhaW1cIikpXG4rXHRcdHJldHVybjtcbitcbitcdGVyciA9IHNldHVwX2JwZihoaWdoX2Nncm91cF9pZCwgbG93X2Nncm91cF9pZCwgXHUwMDI2c2tlbCwgZmFsc2UpO1xuK1x0aWYgKCFBU1NFUlRfT0soZXJyLCBcInNldHVwX2JwZlwiKSlcbitcdFx0Z290byBvdXQ7XG4rXG4rXHRlcnIgPSBydW5faGlnaF9sb3dfd29ya2xvYWQoXHUwMDI2aGlnaF90aW1lLCBcdTAwMjZsb3dfdGltZSwgUkVBRF9USU1FUyk7XG4rXHRpZiAoIUFTU0VSVF9PSyhlcnIsIFwicnVuX2hpZ2hfbG93X3dvcmtsb2FkIHJlY2xhaW1cIikpXG4rXHRcdGdvdG8gb3V0O1xuK1xuK1x0aWYgKGhpZ2hfdGltZSBcdTAwM2U9IGxvd190aW1lKSB7XG4rXHRcdFBSSU5UX0ZBSUwoXCJoaWdoIGNncm91cCBub3QgaW1wcm92ZWQgd2l0aCBhc3luYyByZWNsYWltOiBoaWdoX3RpbWU9JWYgbG93X3RpbWU9JWZcIixcbitcdFx0XHQgICBoaWdoX3RpbWUsIGxvd190aW1lKTtcbitcdH1cbitcbitvdXQ6XG4rXHRpZiAoc2tlbClcbitcdFx0bWVtY2dfYXN5bmNfcmVjbGFpbV9fZGVzdHJveShza2VsKTtcbitcdC8qXG4rXHQgKiBXYWl0IGZvciBicGZfd3EgdG8gcmVsZWFzZSB0aGUgcmVmZXJlbmNlIHRvIGNncm91cFxuK1x0ICogdG8gZW5zdXJlIHRoZSBzdWNjZXNzZnVsIGRlbGV0aW9uIG9mIGNncm91cC5cbitcdCAqL1xuK1x0c2xlZXAoMSk7XG4rXHRjbGVhbnVwX2Nncm91cF9lbnZpcm9ubWVudCgpO1xuK31cbitcbit2b2lkIHRlc3RfbWVtY2dfdGhyZWFkX3dxX2FzeW5jX3JlY2xhaW0odm9pZClcbit7XG4rXHR1NjQgaGlnaF9jZ3JvdXBfaWQsIGxvd19jZ3JvdXBfaWQ7XG4rXHRpbnQgZXJyO1xuK1x0ZG91YmxlIGhpZ2hfdGltZSA9IDAuMCwgbG93X3RpbWUgPSAwLjA7XG4rXHRzdHJ1Y3QgbWVtY2dfYXN5bmNfcmVjbGFpbSAqc2tlbCA9IE5VTEw7XG4rXG4rXHRlcnIgPSBzZXR1cF9oaWdoX2xvd19jZ3JvdXBzKFx1MDAyNmhpZ2hfY2dyb3VwX2lkLCBcdTAwMjZsb3dfY2dyb3VwX2lkKTtcbitcdGlmICghQVNTRVJUX09LKGVyciwgXCJzZXR1cF9oaWdoX2xvd19jZ3JvdXBzIHJlY2xhaW1cIikpXG4rXHRcdHJldHVybjtcbitcbitcdGVyciA9IHNldHVwX2JwZihoaWdoX2Nncm91cF9pZCwgbG93X2Nncm91cF9pZCwgXHUwMDI2c2tlbCwgdHJ1ZSk7XG4rXHRpZiAoIUFTU0VSVF9PSyhlcnIsIFwic2V0dXBfYnBmXCIpKVxuK1x0XHRnb3RvIG91dDtcbitcbitcdGVyciA9IHJ1bl9oaWdoX2xvd193b3JrbG9hZChcdTAwMjZoaWdoX3RpbWUsIFx1MDAyNmxvd190aW1lLCBSRUFEX1RJTUVTKTtcbitcdGlmICghQVNTRVJUX09LKGVyciwgXCJydW5faGlnaF9sb3dfd29ya2xvYWQgcmVjbGFpbVwiKSlcbitcdFx0Z290byBvdXQ7XG4rXG4rXHRpZiAoaGlnaF90aW1lIFx1MDAzZT0gbG93X3RpbWUpIHtcbitcdFx0UFJJTlRfRkFJTChcImhpZ2ggY2dyb3VwIG5vdCBpbXByb3ZlZCB3aXRoIGFzeW5jIHJlY2xhaW06IGhpZ2hfdGltZT0lZiBsb3dfdGltZT0lZlwiLFxuK1x0XHRcdCAgIGhpZ2hfdGltZSwgbG93X3RpbWUpO1xuK1x0fVxuK1xuK291dDpcbitcdGlmIChza2VsKVxuK1x0XHRtZW1jZ19hc3luY19yZWNsYWltX19kZXN0cm95KHNrZWwpO1xuK1x0LypcbitcdCAqIFdhaXQgZm9yIGJwZl90aHJlYWRfd3EgdG8gcmVsZWFzZSB0aGUgcmVmZXJlbmNlIHRvIGNncm91cFxuK1x0ICogdG8gZW5zdXJlIHRoZSBzdWNjZXNzZnVsIGRlbGV0aW9uIG9mIGNncm91cC5cbitcdCAqL1xuK1x0c2xlZXAoMSk7XG4rXHRjbGVhbnVwX2Nncm91cF9lbnZpcm9ubWVudCgpO1xuK31cbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy90aHJlYWRfd3FfY2dyb3VwLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy90aHJlYWRfd3FfY2dyb3VwLmNcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwLi43NTM3YjAzZjE3ZTJhXG4tLS0gL2Rldi9udWxsXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy90aHJlYWRfd3FfY2dyb3VwLmNcbkBAIC0wLDAgKzEsODcgQEBcbisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxuKyNpbmNsdWRlIFx1MDAzY3Rlc3RfcHJvZ3MuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3VuaXN0ZC5oXHUwMDNlXG4rI2luY2x1ZGUgXCJjZ3JvdXBfaGVscGVycy5oXCJcbisjaW5jbHVkZSBcInRocmVhZF93cV9jZ3JvdXAuc2tlbC5oXCJcbitcbisjZGVmaW5lIFRFU1RfQ0dST1VQIFwiL3RocmVhZF93cV90ZXN0XCJcbisjZGVmaW5lIFdBSVRfVElNRU9VVF9TRUNTIDMwXG4rXG4rdm9pZCB0ZXN0X3RocmVhZF93cV9jZ3JvdXAodm9pZClcbit7XG4rXHRzdHJ1Y3QgdGhyZWFkX3dxX2Nncm91cCAqc2tlbCA9IE5VTEw7XG4rXHRpbnQgZXJyLCBwcm9nX2ZkLCBjZ19mZCA9IC0xO1xuK1x0dW5zaWduZWQgbG9uZyBsb25nIGNnX2lkO1xuK1x0aW50IHdhaXRlZF9zZWNzO1xuK1xuK1x0TElCQlBGX09QVFMoYnBmX3Rlc3RfcnVuX29wdHMsIHRvcHRzKTtcbitcbitcdGVyciA9IHNldHVwX2Nncm91cF9lbnZpcm9ubWVudCgpO1xuK1x0aWYgKCFBU1NFUlRfT0soZXJyLCBcInNldHVwX2Nncm91cF9lbnZpcm9ubWVudFwiKSlcbitcdFx0cmV0dXJuO1xuK1x0Y2dfZmQgPSBjcmVhdGVfYW5kX2dldF9jZ3JvdXAoVEVTVF9DR1JPVVApO1xuK1x0aWYgKCFBU1NFUlRfR0UoY2dfZmQsIDAsIFwiY3JlYXRlX2FuZF9nZXRfY2dyb3VwXCIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXHRjZ19pZCA9IGdldF9jZ3JvdXBfaWQoVEVTVF9DR1JPVVApO1xuK1x0aWYgKCFBU1NFUlRfR1QoY2dfaWQsIDBVTEwsIFwiZ2V0X2Nncm91cF9pZFwiKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1xuK1x0c2tlbCA9IHRocmVhZF93cV9jZ3JvdXBfX29wZW5fYW5kX2xvYWQoKTtcbitcdGlmICghQVNTRVJUX09LX1BUUihza2VsLCBcIm9wZW5fYW5kX2xvYWRcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcbitcdHByb2dfZmQgPSBicGZfcHJvZ3JhbV9fZmQoc2tlbC1cdTAwM2Vwcm9ncy5zdGFydF90aHJlYWRfd3EpO1xuK1xuK1x0LyogUnVuIGJwZl90aHJlYWRfd3EgaW4gdGhlIHNwZWNpZmllZCBjZ3JvdXAuICovXG4rXHRza2VsLVx1MDAzZWJzcy1cdTAwM2V0ZXN0X2tleSA9IDA7XG4rXHRza2VsLVx1MDAzZWJzcy1cdTAwM2V0YXJnZXRfY2dyb3VwX2lkID0gY2dfaWQ7XG4rXHRza2VsLVx1MDAzZWJzcy1cdTAwM2VjYWxsYmFja19jZ3JvdXBfaWQgPSAwO1xuK1x0c2tlbC1cdTAwM2Vic3MtXHUwMDNldHdxX2RvbmUgPSAwO1xuK1x0aWYgKCFBU1NFUlRfT0soYnBmX3Byb2dfdGVzdF9ydW5fb3B0cyhwcm9nX2ZkLCBcdTAwMjZ0b3B0cyksXG4rXHRcdCAgICAgICBcImJwZl9wcm9nX3Rlc3RfcnVuX29wdHMgaW4gY2dyb3VwXCIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXHRpZiAoIUFTU0VSVF9PSyh0b3B0cy5yZXR2YWwsIFwicmV0dmFsIGluIGNncm91cFwiKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1x0Zm9yICh3YWl0ZWRfc2VjcyA9IDA7IHdhaXRlZF9zZWNzIFx1MDAzYyBXQUlUX1RJTUVPVVRfU0VDUzsgd2FpdGVkX3NlY3MrKykge1xuK1x0XHRpZiAoc2tlbC1cdTAwM2Vic3MtXHUwMDNldHdxX2RvbmUpXG4rXHRcdFx0YnJlYWs7XG4rXHRcdHNsZWVwKDEpO1xuK1x0fVxuK1x0aWYgKCFBU1NFUlRfVFJVRShza2VsLVx1MDAzZWJzcy1cdTAwM2V0d3FfZG9uZSwgXCJ0d3FfZG9uZSBpbiBjZ3JvdXBcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcdGlmICghQVNTRVJUX0VRKHNrZWwtXHUwMDNlYnNzLVx1MDAzZWNhbGxiYWNrX2Nncm91cF9pZCwgY2dfaWQsXG4rXHRcdCAgICAgICBcImNhbGxiYWNrX2Nncm91cF9pZCBpbiBjZ3JvdXBcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcbitcdC8qIFJ1biBicGZfdGhyZWFkX3dxIHdpdGhvdXQgY2dyb3VwIGF0dGFjaG1lbnQgKGNncm91cF9pZCA9IDApLiAqL1xuK1x0TElCQlBGX09QVFNfUkVTRVQodG9wdHMpO1xuK1x0c2tlbC1cdTAwM2Vic3MtXHUwMDNldGVzdF9rZXkgPSAxO1xuK1x0c2tlbC1cdTAwM2Vic3MtXHUwMDNldGFyZ2V0X2Nncm91cF9pZCA9IDA7XG4rXHRza2VsLVx1MDAzZWJzcy1cdTAwM2VjYWxsYmFja19jZ3JvdXBfaWQgPSAwO1xuK1x0c2tlbC1cdTAwM2Vic3MtXHUwMDNldHdxX2RvbmUgPSAwO1xuK1x0aWYgKCFBU1NFUlRfT0soYnBmX3Byb2dfdGVzdF9ydW5fb3B0cyhwcm9nX2ZkLCBcdTAwMjZ0b3B0cyksXG4rXHRcdCAgICAgICBcImJwZl9wcm9nX3Rlc3RfcnVuX29wdHMgd2l0aG91dCBjZ3JvdXBcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcdGlmICghQVNTRVJUX09LKHRvcHRzLnJldHZhbCwgXCJyZXR2YWwgd2l0aG91dCBjZ3JvdXBcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcdGZvciAod2FpdGVkX3NlY3MgPSAwOyB3YWl0ZWRfc2VjcyBcdTAwM2MgV0FJVF9USU1FT1VUX1NFQ1M7IHdhaXRlZF9zZWNzKyspIHtcbitcdFx0aWYgKHNrZWwtXHUwMDNlYnNzLVx1MDAzZXR3cV9kb25lKVxuK1x0XHRcdGJyZWFrO1xuK1x0XHRzbGVlcCgxKTtcbitcdH1cbitcdGlmICghQVNTRVJUX1RSVUUoc2tlbC1cdTAwM2Vic3MtXHUwMDNldHdxX2RvbmUsIFwidHdxX2RvbmUgd2l0aG91dCBjZ3JvdXBcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcdGlmICghQVNTRVJUX05FUShza2VsLVx1MDAzZWJzcy1cdTAwM2VjYWxsYmFja19jZ3JvdXBfaWQsIGNnX2lkLFxuK1x0XHRcdFwiY2FsbGJhY2tfY2dyb3VwX2lkIHdpdGhvdXQgY2dyb3VwXCIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXG4rY2xlYW51cDpcbitcdGlmIChza2VsKSB7XG4rXHRcdHRocmVhZF93cV9jZ3JvdXBfX2Rlc3Ryb3koc2tlbCk7XG4rXHRcdC8qIFdhaXQgdGhyZWFkX3dxIGt0aHJlYWQgcXVpdC4gKi9cbitcdFx0c2xlZXAoMik7XG4rXHR9XG4rXHRpZiAoY2dfZmQgXHUwMDNlPSAwKVxuK1x0XHRjbG9zZShjZ19mZCk7XG4rXHRjbGVhbnVwX2Nncm91cF9lbnZpcm9ubWVudCgpO1xuK31cbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvbWVtY2dfYXN5bmNfcmVjbGFpbS5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL21lbWNnX2FzeW5jX3JlY2xhaW0uY1xubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAuLmVhY2NjOGEzNzM4OGJcbi0tLSAvZGV2L251bGxcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9tZW1jZ19hc3luY19yZWNsYWltLmNcbkBAIC0wLDAgKzEsMjU1IEBAXG4rLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcbitcbisjaW5jbHVkZSBcInZtbGludXguaFwiXG4rI2luY2x1ZGUgXCJicGZfZXhwZXJpbWVudGFsLmhcIlxuKyNpbmNsdWRlIFx1MDAzY2JwZi9icGZfaGVscGVycy5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjYnBmL2JwZl90cmFjaW5nLmhcdTAwM2VcbitcbisjZGVmaW5lIEJJVChucilcdFx0XHQoMVVMIFx1MDAzY1x1MDAzYyAobnIpKVxuK1xuKyNkZWZpbmUgX19fR0ZQX0lPXHRcdEJJVChfX19HRlBfSU9fQklUKVxuKyNkZWZpbmUgX19fR0ZQX0ZTXHRcdEJJVChfX19HRlBfRlNfQklUKVxuKyNkZWZpbmUgX19fR0ZQX0RJUkVDVF9SRUNMQUlNXHRCSVQoX19fR0ZQX0RJUkVDVF9SRUNMQUlNX0JJVClcbisjZGVmaW5lIF9fX0dGUF9LU1dBUERfUkVDTEFJTVx0QklUKF9fX0dGUF9LU1dBUERfUkVDTEFJTV9CSVQpXG4rXG4rI2RlZmluZSBfX0dGUF9JT1x0XHQoKGdmcF90KV9fX0dGUF9JTylcbisjZGVmaW5lIF9fR0ZQX0ZTXHRcdCgoZ2ZwX3QpX19fR0ZQX0ZTKVxuKyNkZWZpbmUgX19HRlBfRElSRUNUX1JFQ0xBSU1cdCgoZ2ZwX3QpX19fR0ZQX0RJUkVDVF9SRUNMQUlNKVxuKyNkZWZpbmUgX19HRlBfS1NXQVBEX1JFQ0xBSU1cdCgoZ2ZwX3QpX19fR0ZQX0tTV0FQRF9SRUNMQUlNKVxuKyNkZWZpbmUgX19HRlBfUkVDTEFJTVx0KChnZnBfdCkoX19fR0ZQX0RJUkVDVF9SRUNMQUlNIHwgX19fR0ZQX0tTV0FQRF9SRUNMQUlNKSlcbitcbisjZGVmaW5lIEdGUF9LRVJORUxcdChfX0dGUF9SRUNMQUlNIHwgX19HRlBfSU8gfCBfX0dGUF9GUylcbisjZGVmaW5lIENMT0NLX01PTk9UT05JQ19JRFx0MVxuKyNkZWZpbmUgUkVDTEFJTV9QQUdFU1x0XHQzMlxuKyNkZWZpbmUgUkVDTEFJTV9NQVhfSVRFUlx0MzJcbitcbitzdHJ1Y3QgYnBmX2FyZ3NfcyB7XG4rXHR1NjQgaGlnaF9jZ3JvdXBfaWQ7XG4rXHR1NjQgbG93X2Nncm91cF9pZDtcbitcdHU2NCBldmVudF9kZWx0YV90aHJlc2hvbGQ7XG4rXHR1NjQgY2hlY2tfbnM7XG4rfTtcbitcbitzdHJ1Y3QgY2dyb3VwX21lbWNnIHtcbitcdHN0cnVjdCBjZ3JvdXAgKmNncnA7XG4rXHRzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2c7XG4rfTtcbitcbitzdGF0aWMgdTY0IHdxX2hpZ2hfY2dyb3VwX2lkO1xuK3N0YXRpYyB1NjQgd3FfbG93X2Nncm91cF9pZDtcbitcbitzdGF0aWMgaW50IGdldF9jZ3JvdXBfbWVtY2dfZnJvbV9pZCh1NjQgY2dyb3VwX2lkLCBzdHJ1Y3QgY2dyb3VwX21lbWNnICpjbSlcbit7XG4rXHRjbS1cdTAwM2VjZ3JwID0gYnBmX2Nncm91cF9mcm9tX2lkKGNncm91cF9pZCk7XG4rXHRpZiAoIWNtLVx1MDAzZWNncnApXG4rXHRcdHJldHVybiAtMTtcbitcbitcdGNtLVx1MDAzZW1lbWNnID0gYnBmX2dldF9tZW1fY2dyb3VwKFx1MDAyNmNtLVx1MDAzZWNncnAtXHUwMDNlc2VsZik7XG4rXHRpZiAoIWNtLVx1MDAzZW1lbWNnKSB7XG4rXHRcdGJwZl9jZ3JvdXBfcmVsZWFzZShjbS1cdTAwM2VjZ3JwKTtcbitcdFx0cmV0dXJuIC0xO1xuK1x0fVxuK1xuK1x0cmV0dXJuIDA7XG4rfVxuK1xuK3N0YXRpYyB2b2lkIHB1dF9jZ3JvdXBfbWVtY2coc3RydWN0IGNncm91cF9tZW1jZyAqY20pXG4re1xuK1x0YnBmX3B1dF9tZW1fY2dyb3VwKGNtLVx1MDAzZW1lbWNnKTtcbitcdGJwZl9jZ3JvdXBfcmVsZWFzZShjbS1cdTAwM2VjZ3JwKTtcbit9XG4rXG4rc3RhdGljIGludCBnZXRfY2dyb3VwX2V2ZW50KHU2NCBjZ3JvdXBfaWQsIHU2NCAqdmFsKVxuK3tcbitcdHN0cnVjdCBjZ3JvdXBfbWVtY2cgY207XG4rXG4rXHRpZiAoZ2V0X2Nncm91cF9tZW1jZ19mcm9tX2lkKGNncm91cF9pZCwgXHUwMDI2Y20pKVxuK1x0XHRyZXR1cm4gLTE7XG4rXHRicGZfbWVtX2Nncm91cF9mbHVzaF9zdGF0cyhjbS5tZW1jZyk7XG4rXHQqdmFsID0gYnBmX21lbV9jZ3JvdXBfcGFnZV9zdGF0ZShjbS5tZW1jZywgV09SS0lOR1NFVF9SRUZBVUxUX0ZJTEUpO1xuK1x0cHV0X2Nncm91cF9tZW1jZyhcdTAwMjZjbSk7XG4rXG4rXHRyZXR1cm4gMDtcbit9XG4rXG4rc3RhdGljIGJvb2xcbitzaG91bGRfcmVjbGFpbV9jZ3JvdXAodTY0IGNncm91cF9pZCwgdTY0ICpwcmV2X2V2ZW50LCB1NjQgZXZlbnRfZGVsdGFfdGhyZXNob2xkKVxuK3tcbitcdHU2NCBjdXIsIGRlbHRhO1xuK1xuK1x0aWYgKGdldF9jZ3JvdXBfZXZlbnQoY2dyb3VwX2lkLCBcdTAwMjZjdXIpKVxuK1x0XHRyZXR1cm4gZmFsc2U7XG4rXG4rXHRkZWx0YSA9IGN1ciAtICpwcmV2X2V2ZW50O1xuK1x0KnByZXZfZXZlbnQgPSBjdXI7XG4rXG4rXHRyZXR1cm4gZGVsdGEgXHUwMDNlPSBldmVudF9kZWx0YV90aHJlc2hvbGQ7XG4rfVxuK1xuK3N0YXRpYyBpbnQgcmVjbGFpbV9jZ3JvdXAodTY0IGNncm91cF9pZClcbit7XG4rXHRzdHJ1Y3QgY2dyb3VwX21lbWNnIGNtO1xuK1x0aW50IGk7XG4rXG4rXHRpZiAoZ2V0X2Nncm91cF9tZW1jZ19mcm9tX2lkKGNncm91cF9pZCwgXHUwMDI2Y20pKVxuK1x0XHRyZXR1cm4gMDtcbitcbitcdGZvciAoaSA9IDA7IGkgXHUwMDNjIFJFQ0xBSU1fTUFYX0lURVI7IGkrKykge1xuK1x0XHRpZiAoIWJwZl90cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKGNtLm1lbWNnLCBSRUNMQUlNX1BBR0VTLFxuK1x0XHRcdFx0XHRcdCAgICAgIEdGUF9LRVJORUwsIDAsIC0xKSlcbitcdFx0XHRicmVhaztcbitcdH1cbitcbitcdHB1dF9jZ3JvdXBfbWVtY2coXHUwMDI2Y20pO1xuK1xuK1x0cmV0dXJuIDA7XG4rfVxuK1xuK3N0cnVjdCB3cV9lbGVtIHtcbitcdHN0cnVjdCBicGZfdGltZXIgdGltZXI7XG4rXHRzdHJ1Y3QgYnBmX3dxIHdvcms7XG4rXHR1NjQgcHJldl9ldmVudDtcbitcdHU2NCBldmVudF9kZWx0YV90aHJlc2hvbGQ7XG4rXHR1NjQgY2hlY2tfbnM7XG4rfTtcbitcbitzdHJ1Y3Qge1xuK1x0X191aW50KHR5cGUsIEJQRl9NQVBfVFlQRV9BUlJBWSk7XG4rXHRfX3VpbnQobWF4X2VudHJpZXMsIDEpO1xuK1x0X190eXBlKGtleSwgX191MzIpO1xuK1x0X190eXBlKHZhbHVlLCBzdHJ1Y3Qgd3FfZWxlbSk7XG4rfSB3cV9tYXAgU0VDKFwiLm1hcHNcIik7XG4rXG4rc3RhdGljIGludCBhc3luY19mcmVlKHZvaWQgKm1hcCwgaW50ICprZXksIHZvaWQgKnZhbHVlKVxuK3tcbitcdHN0cnVjdCB3cV9lbGVtICplbGVtID0gdmFsdWU7XG4rXG4rXHRpZiAoc2hvdWxkX3JlY2xhaW1fY2dyb3VwKHdxX2hpZ2hfY2dyb3VwX2lkLCBcdTAwMjZlbGVtLVx1MDAzZXByZXZfZXZlbnQsXG4rXHRcdGVsZW0tXHUwMDNlZXZlbnRfZGVsdGFfdGhyZXNob2xkKSkge1xuK1x0XHRyZWNsYWltX2Nncm91cCh3cV9sb3dfY2dyb3VwX2lkKTtcbitcdFx0YnBmX3dxX3N0YXJ0KFx1MDAyNmVsZW0tXHUwMDNld29yaywgMCk7XG4rXHR9XG4rXG4rXHRyZXR1cm4gMDtcbit9XG4rXG4rc3RhdGljIGludCB3cV90aW1lcl9jYih2b2lkICptYXAsIGludCAqa2V5LCBzdHJ1Y3Qgd3FfZWxlbSAqZWxlbSlcbit7XG4rXHRicGZfd3Ffc3RhcnQoXHUwMDI2ZWxlbS1cdTAwM2V3b3JrLCAwKTtcbitcdGJwZl90aW1lcl9zdGFydChcdTAwMjZlbGVtLVx1MDAzZXRpbWVyLCBlbGVtLVx1MDAzZWNoZWNrX25zLCAwKTtcbitcbitcdHJldHVybiAwO1xuK31cbitcbitTRUMoXCJzeXNjYWxsXCIpXG4raW50IHdxX3Byb2dfaW5pdChzdHJ1Y3QgYnBmX2FyZ3NfcyAqY3R4KVxuK3tcbitcdHN0cnVjdCB3cV9lbGVtICplbGVtO1xuK1x0X191MzIga2V5ID0gMDtcbitcdGludCByZXQ7XG4rXG4rXHRlbGVtID0gYnBmX21hcF9sb29rdXBfZWxlbShcdTAwMjZ3cV9tYXAsIFx1MDAyNmtleSk7XG4rXHRpZiAoIWVsZW0pXG4rXHRcdHJldHVybiAtMTtcbitcbitcdHJldCA9IGJwZl93cV9pbml0KFx1MDAyNmVsZW0tXHUwMDNld29yaywgXHUwMDI2d3FfbWFwLCAwKTtcbitcdGlmIChyZXQpXG4rXHRcdHJldHVybiByZXQ7XG4rXG4rXHRyZXQgPSBicGZfd3Ffc2V0X2NhbGxiYWNrKFx1MDAyNmVsZW0tXHUwMDNld29yaywgYXN5bmNfZnJlZSwgMCk7XG4rXHRpZiAocmV0KVxuK1x0XHRyZXR1cm4gcmV0O1xuK1xuK1x0cmV0ID0gYnBmX3RpbWVyX2luaXQoXHUwMDI2ZWxlbS1cdTAwM2V0aW1lciwgXHUwMDI2d3FfbWFwLCBDTE9DS19NT05PVE9OSUNfSUQpO1xuK1x0aWYgKHJldClcbitcdFx0cmV0dXJuIHJldDtcbitcbitcdHJldCA9IGJwZl90aW1lcl9zZXRfY2FsbGJhY2soXHUwMDI2ZWxlbS1cdTAwM2V0aW1lciwgd3FfdGltZXJfY2IpO1xuK1x0aWYgKHJldClcbitcdFx0cmV0dXJuIHJldDtcbitcbitcdGVsZW0tXHUwMDNlcHJldl9ldmVudCA9IDA7XG4rXHRlbGVtLVx1MDAzZWV2ZW50X2RlbHRhX3RocmVzaG9sZCA9IGN0eC1cdTAwM2VldmVudF9kZWx0YV90aHJlc2hvbGQ7XG4rXHRlbGVtLVx1MDAzZWNoZWNrX25zID0gY3R4LVx1MDAzZWNoZWNrX25zO1xuK1xuK1x0d3FfaGlnaF9jZ3JvdXBfaWQgPSBjdHgtXHUwMDNlaGlnaF9jZ3JvdXBfaWQ7XG4rXHR3cV9sb3dfY2dyb3VwX2lkID0gY3R4LVx1MDAzZWxvd19jZ3JvdXBfaWQ7XG4rXG4rXHRyZXR1cm4gYnBmX3RpbWVyX3N0YXJ0KFx1MDAyNmVsZW0tXHUwMDNldGltZXIsIGVsZW0tXHUwMDNlY2hlY2tfbnMsIDApO1xuK31cbitcbitzdHJ1Y3QgdGhyZWFkX3dxX2VsZW0ge1xuK1x0c3RydWN0IGJwZl90aW1lciB0aW1lcjtcbitcdHN0cnVjdCBicGZfdGhyZWFkX3dxIHdvcms7XG4rXHR1NjQgcHJldl9ldmVudDtcbitcdHU2NCBldmVudF9kZWx0YV90aHJlc2hvbGQ7XG4rXHR1NjQgY2hlY2tfbnM7XG4rfTtcbitcbitzdHJ1Y3Qge1xuK1x0X191aW50KHR5cGUsIEJQRl9NQVBfVFlQRV9BUlJBWSk7XG4rXHRfX3VpbnQobWF4X2VudHJpZXMsIDEpO1xuK1x0X190eXBlKGtleSwgX191MzIpO1xuK1x0X190eXBlKHZhbHVlLCBzdHJ1Y3QgdGhyZWFkX3dxX2VsZW0pO1xuK30gdGhyZWFkX3dxX21hcCBTRUMoXCIubWFwc1wiKTtcbitcbitzdGF0aWMgaW50IHRocmVhZF9hc3luY19mcmVlKHZvaWQgKm1hcCwgaW50ICprZXksIHZvaWQgKnZhbHVlKVxuK3tcbitcdHN0cnVjdCB0aHJlYWRfd3FfZWxlbSAqZWxlbSA9IHZhbHVlO1xuK1xuK1x0aWYgKHNob3VsZF9yZWNsYWltX2Nncm91cCh3cV9oaWdoX2Nncm91cF9pZCwgXHUwMDI2ZWxlbS1cdTAwM2VwcmV2X2V2ZW50LFxuK1x0XHRlbGVtLVx1MDAzZWV2ZW50X2RlbHRhX3RocmVzaG9sZCkpIHtcbitcdFx0cmVjbGFpbV9jZ3JvdXAod3FfbG93X2Nncm91cF9pZCk7XG4rXHRcdGJwZl90aHJlYWRfd3Ffc3RhcnQoXHUwMDI2ZWxlbS1cdTAwM2V3b3JrLCAwKTtcbitcdH1cbitcbitcdHJldHVybiAwO1xuK31cbitcbitzdGF0aWMgaW50IHRocmVhZF93cV90aW1lcl9jYih2b2lkICptYXAsIGludCAqa2V5LCBzdHJ1Y3QgdGhyZWFkX3dxX2VsZW0gKmVsZW0pXG4re1xuK1x0YnBmX3RocmVhZF93cV9zdGFydChcdTAwMjZlbGVtLVx1MDAzZXdvcmssIDApO1xuK1x0YnBmX3RpbWVyX3N0YXJ0KFx1MDAyNmVsZW0tXHUwMDNldGltZXIsIGVsZW0tXHUwMDNlY2hlY2tfbnMsIDApO1xuK1xuK1x0cmV0dXJuIDA7XG4rfVxuK1xuK1NFQyhcInN5c2NhbGxcIilcbitpbnQgdGhyZWFkX3dxX3Byb2dfaW5pdChzdHJ1Y3QgYnBmX2FyZ3NfcyAqY3R4KVxuK3tcbitcdHN0cnVjdCB0aHJlYWRfd3FfZWxlbSAqZWxlbTtcbitcdF9fdTMyIGtleSA9IDA7XG4rXHRpbnQgcmV0O1xuK1xuK1x0ZWxlbSA9IGJwZl9tYXBfbG9va3VwX2VsZW0oXHUwMDI2dGhyZWFkX3dxX21hcCwgXHUwMDI2a2V5KTtcbitcdGlmICghZWxlbSlcbitcdFx0cmV0dXJuIC0xO1xuK1xuK1x0cmV0ID0gYnBmX3RocmVhZF93cV9pbml0KFx1MDAyNmVsZW0tXHUwMDNld29yaywgXHUwMDI2dGhyZWFkX3dxX21hcCxcbitcdFx0XHRcdCBjdHgtXHUwMDNlbG93X2Nncm91cF9pZCwgMCk7XG4rXHRpZiAocmV0KVxuK1x0XHRyZXR1cm4gcmV0O1xuK1xuK1x0cmV0ID0gYnBmX3RocmVhZF93cV9zZXRfY2FsbGJhY2soXHUwMDI2ZWxlbS1cdTAwM2V3b3JrLCB0aHJlYWRfYXN5bmNfZnJlZSwgMCk7XG4rXHRpZiAocmV0KVxuK1x0XHRyZXR1cm4gcmV0O1xuK1xuK1x0cmV0ID0gYnBmX3RpbWVyX2luaXQoXHUwMDI2ZWxlbS1cdTAwM2V0aW1lciwgXHUwMDI2dGhyZWFkX3dxX21hcCwgQ0xPQ0tfTU9OT1RPTklDX0lEKTtcbitcdGlmIChyZXQpXG4rXHRcdHJldHVybiByZXQ7XG4rXG4rXHRyZXQgPSBicGZfdGltZXJfc2V0X2NhbGxiYWNrKFx1MDAyNmVsZW0tXHUwMDNldGltZXIsIHRocmVhZF93cV90aW1lcl9jYik7XG4rXHRpZiAocmV0KVxuK1x0XHRyZXR1cm4gcmV0O1xuK1xuK1x0ZWxlbS1cdTAwM2VwcmV2X2V2ZW50ID0gMDtcbitcdGVsZW0tXHUwMDNlZXZlbnRfZGVsdGFfdGhyZXNob2xkID0gY3R4LVx1MDAzZWV2ZW50X2RlbHRhX3RocmVzaG9sZDtcbitcdGVsZW0tXHUwMDNlY2hlY2tfbnMgPSBjdHgtXHUwMDNlY2hlY2tfbnM7XG4rXG4rXHR3cV9oaWdoX2Nncm91cF9pZCA9IGN0eC1cdTAwM2VoaWdoX2Nncm91cF9pZDtcbitcdHdxX2xvd19jZ3JvdXBfaWQgPSBjdHgtXHUwMDNlbG93X2Nncm91cF9pZDtcbitcbitcdHJldHVybiBicGZfdGltZXJfc3RhcnQoXHUwMDI2ZWxlbS1cdTAwM2V0aW1lciwgZWxlbS1cdTAwM2VjaGVja19ucywgMCk7XG4rfVxuK1xuK2NoYXIgTElDRU5TRVtdIFNFQyhcImxpY2Vuc2VcIikgPSBcIkdQTFwiO1xuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy90aHJlYWRfd3FfY2dyb3VwLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvdGhyZWFkX3dxX2Nncm91cC5jXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uYzcwYTM3ZjU1Mzk3ZFxuLS0tIC9kZXYvbnVsbFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL3RocmVhZF93cV9jZ3JvdXAuY1xuQEAgLTAsMCArMSw1NiBAQFxuKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXG4rLyogQ29weXJpZ2h0IChjKSAyMDI2ICovXG4rXG4rI2luY2x1ZGUgXCJicGZfZXhwZXJpbWVudGFsLmhcIlxuKyNpbmNsdWRlIFx1MDAzY2JwZi9icGZfaGVscGVycy5oXHUwMDNlXG4rI2luY2x1ZGUgXCJicGZfbWlzYy5oXCJcbitcbitjaGFyIF9saWNlbnNlW10gU0VDKFwibGljZW5zZVwiKSA9IFwiR1BMXCI7XG4rXG4rc3RydWN0IGVsZW0ge1xuK1x0c3RydWN0IGJwZl90aHJlYWRfd3EgdHdxO1xuK307XG4rXG4rc3RydWN0IHtcbitcdF9fdWludCh0eXBlLCBCUEZfTUFQX1RZUEVfQVJSQVkpO1xuK1x0X191aW50KG1heF9lbnRyaWVzLCAyKTtcbitcdF9fdHlwZShrZXksIGludCk7XG4rXHRfX3R5cGUodmFsdWUsIHN0cnVjdCBlbGVtKTtcbit9IG1hcF9hcnIgU0VDKFwiLm1hcHNcIik7XG4rXG4rX191NjQgdGFyZ2V0X2Nncm91cF9pZDtcbitfX3U2NCBjYWxsYmFja19jZ3JvdXBfaWQ7XG4raW50IHR3cV9kb25lO1xuK2ludCB0ZXN0X2tleTtcbitcbitzdGF0aWMgaW50IHR3cV9jYWxsYmFjayh2b2lkICptYXAsIGludCAqa2V5LCB2b2lkICp2YWx1ZSlcbit7XG4rXHRjYWxsYmFja19jZ3JvdXBfaWQgPSBicGZfZ2V0X2N1cnJlbnRfY2dyb3VwX2lkKCk7XG4rXHR0d3FfZG9uZSA9IDE7XG4rXHRyZXR1cm4gMDtcbit9XG4rXG4rU0VDKFwic3lzY2FsbFwiKVxuK2ludCBzdGFydF90aHJlYWRfd3Eodm9pZCAqY3R4KVxuK3tcbitcdHN0cnVjdCBlbGVtICp2YWw7XG4rXHRpbnQga2V5ID0gdGVzdF9rZXk7XG4rXHRpbnQgcmV0O1xuK1xuK1x0dmFsID0gYnBmX21hcF9sb29rdXBfZWxlbShcdTAwMjZtYXBfYXJyLCBcdTAwMjZrZXkpO1xuK1x0aWYgKCF2YWwpXG4rXHRcdHJldHVybiAtMTtcbitcbitcdHJldCA9IGJwZl90aHJlYWRfd3FfaW5pdChcdTAwMjZ2YWwtXHUwMDNldHdxLCBcdTAwMjZtYXBfYXJyLCB0YXJnZXRfY2dyb3VwX2lkLCAwKTtcbitcdGlmIChyZXQpXG4rXHRcdGdvdG8gb3V0O1xuK1xuK1x0cmV0ID0gYnBmX3RocmVhZF93cV9zZXRfY2FsbGJhY2soXHUwMDI2dmFsLVx1MDAzZXR3cSwgdHdxX2NhbGxiYWNrLCAwKTtcbitcdGlmIChyZXQpXG4rXHRcdGdvdG8gb3V0O1xuK1xuK1x0cmV0ID0gYnBmX3RocmVhZF93cV9zdGFydChcdTAwMjZ2YWwtXHUwMDNldHdxLCAwKTtcbitcbitvdXQ6XG4rXHRyZXR1cm4gcmV0O1xuK31cbiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA3VDA4OjUwOjQzLjcwOTA4NjIxN1oiLCJTZXEiOjMsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjc2NzUzMTMzODIsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIHRoZSBOZXcgQlBGIFRocmVhZCBXb3JrcXVldWUgRmVhdHVyZSoqXG5cbk9rYXksIHNvIHRoaXMgcGF0Y2ggaXMgaW50cm9kdWNpbmcgc29tZXRoaW5nIGludGVyZXN0aW5nOiBhIG5ldyBCUEYgZmVhdHVyZSBjYWxsZWQgYGJwZl90aHJlYWRfd3FgLiBSaWdodCBvZmYgdGhlIGJhdCwgSSBzZWUgdGhlIGFkZGl0aW9uIG9mIGBCUEZfVEhSRUFEX1dRYCB0byBgZW51bSBidGZfZmllbGRfdHlwZWAsIHdoaWNoIHRlbGxzIG1lIHRoaXMgaXMgYSBwcmV0dHkgZnVuZGFtZW50YWwgY2hhbmdlIHRvIHRoZSBCUEYgbGFuZHNjYXBlLiBXZSdyZSBsb29raW5nIGF0IGZvdXIgbmV3IGZ1bmN0aW9uczogYGJwZl90aHJlYWRfd3FfaW5pdGAsIGBicGZfdGhyZWFkX3dxX3NldF9jYWxsYmFja2AsIGBicGZfdGhyZWFkX3dxX3N0YXJ0YCwgYW5kIGBicGZfdGhyZWFkX3dxX2NhbmNlbF9hbmRfZnJlZWAuIFRoZW4gdGhlcmUncyBgYnBmX3RyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXNgIGFzIHdlbGwuIFRoaXMgYWxsIGxvb2tzIGxpa2UgdGhlIGZyYW1ld29yayB0byBhbGxvdyBCUEYgcHJvZ3JhbXMgdG8gc2NoZWR1bGUgdGFza3Mgb24ga3RocmVhZCB3b3JrZXJzLCBhbmQsIGFzIGFuIG9wdGlvbmFsIGZlYXR1cmUsIGF0dGFjaCB0aG9zZSB0YXNrcyB0byBhIHNwZWNpZmljIGNncm91cC4gRGVmaW5pdGVseSBzb3VuZHMgbGlrZSBhIGNhbmRpZGF0ZSBmb3Igc29tZSBzZXJpb3VzIGZ1enppbmcg4oCTIGdvdHRhIHNlZSB3aGVyZSB0aGUgZWRnZSBjYXNlcyBsaWUuXG5cbkxldCdzIG5haWwgZG93biB0aGUga2V5IHN5bWJvbHMgd2UgbmVlZCB0byBpbnZlc3RpZ2F0ZTogYGJwZl90aHJlYWRfd3FfaW5pdGAsIGBicGZfdGhyZWFkX3dxX3NldF9jYWxsYmFja2AsIGBicGZfdGhyZWFkX3dxX3N0YXJ0YCwgYW5kIGBicGZfdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlc2AuIFRob3NlIGFyZSB0aGUgZW50cnkgcG9pbnRzIGhlcmUuXG5cbk5leHQsIEkgbmVlZCB0byBjaGVjayBmb3IgYW55IGNyaXRpY2FsIGBDT05GSUdgIG9wdGlvbnMgdGhhdCBtaWdodCBiZSByZXF1aXJlZC4gRnJvbSB0aGUgbG9vayBvZiBpdCwgYGJwZl90aHJlYWRfd3FfaW5pdGAgd2lsbCB1c2UgYENPTkZJR19DR1JPVVBTYCB0byBhdHRhY2ggdG8gYSBjZ3JvdXAsIGJ1dCBpdCBsb29rcyBsaWtlIGl0IHdpbGwgZ3JhY2VmdWxseSBkZWdyYWRlIHdpdGggYC1FT1BOT1RTVVBQYCBpZiBjZ3JvdXBzIGFyZW4ndCBlbmFibGVkLiBUaGF0J3MgZ29vZCwgbGVzcyBvZiBhIGhhcmQgZGVwZW5kZW5jeS4gTm93LCBgYnBmX3RyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXNgIOKAkyB0aGF0J3MgbG9jYXRlZCBpbiBgbW0vYnBmX21lbWNvbnRyb2wuY2AuIFNpbmNlIHRoYXQgZmlsZSBpcyBkZWFsaW5nIHdpdGggbWVtb3J5IGNvbnRyb2wsIGl0IG1ha2VzIHNlbnNlIHRoYXQgYENPTkZJR19NRU1DR2AgYW5kIGBDT05GSUdfQlBGX1NZU0NBTExgIGFyZSBsaWtlbHkgZGVwZW5kZW5jaWVzLCBidXQgSSBzaG91bGQgcHJvYmFibHkgY2hlY2sgdGhlIGBtbS9NYWtlZmlsZWAgdG8gY29uZmlybSB0aGUgZGV0YWlscy5cblxuXG4iLCJJbnB1dFRva2VucyI6MjU1NTQsIk91dHB1dFRva2VucyI6MjksIk91dHB1dFRob3VnaHRzVG9rZW5zIjozNjEsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0wN1QwODo1MDo1MS4zODQ0MDE2WiIsIlNlcSI6NCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjMxMTYzNTEwOCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJicGZfbWVtY29udHJvbC5vXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIm1tL1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJtbS9NYWtlZmlsZT0xMDY9aWZkZWYgQ09ORklHX0JQRl9TWVNDQUxMXFxubW0vTWFrZWZpbGU6MTA3Om9iai0kKENPTkZJR19NRU1DRykgKz0gYnBmX21lbWNvbnRyb2wub1xcbm1tL01ha2VmaWxlLTEwOC1lbmRpZlxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0wN1QwODo1MDo1MS42OTYwNDIwNTdaIiwiU2VxIjo1LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjoxNTQ1MjMwNDc5NywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgdGhlIE5ldyBCUEYgVGhyZWFkIFdvcmtxdWV1ZSBGZWF0dXJlKipcblxuT2theSwgc28gSSdtIGRpZ2dpbmcgaW50byB0aGlzIG5ldyBCUEYgdGhyZWFkIHdvcmtxdWV1ZSBwYXRjaC4gRmlyc3QgdGhpbmdzIGZpcnN0OiBpdCBsb29rcyBsaWtlIHdlIG5lZWQgYENPTkZJR19NRU1DR2AgZm9yIGBicGZfdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlc2AsIHdoaWNoIG1ha2VzIHNlbnNlIGZvciBtZW1vcnkgY29udHJvbCwgYW5kIGBDT05GSUdfQ0dST1VQU2AgaXMgcmVxdWlyZWQgZm9yIGBicGZfdGhyZWFkX3dxX2luaXRgIHRvIGZ1bmN0aW9uIGZ1bGx5IHdpdGggY2dyb3VwcywgYW5kIHRoZW4gb2YgY291cnNlIGBDT05GSUdfQlBGX1NZU0NBTExgIGlzIHN0YW5kYXJkIGZvciBCUEYsIHNvIGxldCdzIG1hcmsgdGhhdCBhcyB1bmRlcnN0b29kLlxuXG5MZXQgbWUgY29uZmlybSB0aGF0IGBicGZfdGhyZWFkX3dxX2luaXRgIGlzIGFjdHVhbGx5IGF2YWlsYWJsZS4gWWVwLCBpdCdzIGRlZmluZWQgcmlnaHQgdGhlcmUgaW4gYGtlcm5lbC9icGYvaGVscGVycy5jYC4gR29vZC4gQWxyaWdodCwgd2hhdCBlbHNlIGlzIGluIHBsYXk/IEhtbSwgYGJwZl90aHJlYWRfd3FfY2FuY2VsX2FuZF9mcmVlYCBpcyBpbnRlcmVzdGluZywgaXQgaXMgY2FsbGVkIGludGVybmFsbHkgd2hlbiBtYXBzIGFyZSBmcmVlZC4gSXQncyBub3QgYSBkaXJlY3Qga2Z1bmMgdXNlZCBieSBCUEYgcHJvZ3JhbXMsIGJ1dCBkZWZpbml0ZWx5IHBhcnQgb2YgdGhlIGxpZmVjeWNsZS4gQW5kIGBicGZfb2JqX2ZyZWVfdGhyZWFkX3dxYCBpcyBhbHNvIGludGVybmFsLlxuXG5Pa2F5LCBzbyB0aGUga2Z1bmNzIHdlICpkbyogbmVlZCB0byBmb2N1cyBvbiBhcmU6IGBicGZfdGhyZWFkX3dxX2luaXRgLCBgYnBmX3RocmVhZF93cV9zZXRfY2FsbGJhY2tgLCBgYnBmX3RocmVhZF93cV9zdGFydGAsIGFuZCBgYnBmX3RyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXNgLiBOb3csIGxldCdzIHZlcmlmeSB0aGF0IHRoZXNlIGtmdW5jcyBhcmUgYWN0dWFsbHkgZXhwb3NlZC4gYGJwZl90aHJlYWRfd3FfaW5pdGAgaXMgYWRkZWQgdG8gYHN5c2NhbGxfYnRmX2lkc2Agd2hpY2ggaXMgcmVnaXN0ZXJlZCBmb3IgYEJQRl9QUk9HX1RZUEVfU1lTQ0FMTGAuIEdvb2QuIGBicGZfdGhyZWFkX3dxX3NldF9jYWxsYmFja2AgYW5kIGBicGZfdGhyZWFkX3dxX3N0YXJ0YCBhcmUgaW4gYGdlbmVyaWNfYnRmX2lkc2AsIHdoaWNoIGlzIHJlZ2lzdGVyZWQgZm9yIGEgYnVuY2ggb2YgcHJvZ3JhbSB0eXBlcywgc28gdGhhdCdzIGZpbmUuIEFuZCBgYnBmX3RyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXNgIGlzIGluIGBicGZfbWVtY29udHJvbF9rZnVuY3NgLiBDb25maXJtZWQsIGNvbmZpcm1lZCwgY29uZmlybWVkLlxuXG5TbywgdGhlIGtleSBzeW1ib2xzIHRvIGtlZXAgYW4gZXllIG9uIGFyZTogYGJwZl90aHJlYWRfd3FfaW5pdGAsIGBicGZfdGhyZWFkX3dxX3NldF9jYWxsYmFja2AsIGBicGZfdGhyZWFkX3dxX3N0YXJ0YCwgYW5kIGBicGZfdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlc2AuIEFuZCB0aGVuIHRoZSByZWxldmFudCBjb25maWcgb3B0aW9ucyBhcmUgYE1FTUNHYCBhbmQgYENHUk9VUFNgLlxuXG5KdXN0IGRvdWJsZS1jaGVja2luZy4uLiBgYnBmX3RocmVhZF93cV9jYW5jZWxfYW5kX2ZyZWVgLiBObywgdGhhdCdzIGp1c3QgYSBnbG9iYWwgZnVuY3Rpb24sIGludGVybmFsIHRvIGBrZXJuZWwvYnBmL2hlbHBlcnMuY2AuIFdhaXQuLi5idXQgYGJwZl9vYmpfZnJlZV90aHJlYWRfd3FgIGFuZCBgYnBmX29ial9mcmVlX2ZpZWxkc2AgY2FsbCBpdC5cblxuT2gsIG9uZSBtb3JlIHRoaW5nIHRvIGNvbnNpZGVyOiBgY2dyb3VwX2t0aHJlYWRfYXR0YWNoYCwgd2hpY2ggaXMgYWRkZWQgaW4gYGtlcm5lbC9jZ3JvdXAvY2dyb3VwLmNgLiBJdCdzIGEgZ2xvYmFsIGZ1bmN0aW9uLCBhbmQgYSBoZWxwZXIgZm9yIGBicGZfdGhyZWFkX3dxX2luaXRgLiBPa2F5LCBJIHRoaW5rIHRoYXQgKnNob3VsZCogYmUgaW5jbHVkZWQgaW4gdGhlIGxpc3Qgb2YgZm9jdXMgc3ltYm9scywgZXZlbiB0aG91Z2ggaXQncyB0ZWNobmljYWxseSBhIGhlbHBlciBmdW5jdGlvbi5cblxuQWxyaWdodCwgbGV0J3MgcmVjYXAgdGhlIHJlYXNvbmluZzogdGhpcyBwYXRjaCBpbnRyb2R1Y2VzIGEgbmV3IEJQRiB0aHJlYWQgd29ya3F1ZXVlLCBsZXR0aW5nIEJQRiBwcm9ncmFtcyBzY2hlZHVsZSB3b3JrIGluIGt0aHJlYWQgY29udGV4dCwgb3B0aW9uYWxseSB0aWVkIHRvIGEgY2dyb3VwLCBhbmQgYWxzbyBhZGRzIGBicGZfdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlc2AgZm9yIG1lbW9yeSBjZ3JvdXAgcmVjbGFpbS4gVGhlc2UgYXJlIGZ1bmN0aW9uYWwgY2hhbmdlcyB0byB0aGUgQlBGIGNvcmUgYW5kIG1lbW9yeSBjb250cm9sLCBhY2Nlc3NpYmxlIGZyb20gdXNlcnNwYWNlIHRocm91Z2ggQlBGIHByb2dyYW1zLCBzbyBkZWZpbml0ZWx5IGZ1enphYmxlLlxuXG4qKkZpbmFsIEZvY3VzIFN5bWJvbHM6KipcblxuKiAgIGBicGZfdGhyZWFkX3dxX2luaXRgXG4qICAgYGJwZl90aHJlYWRfd3Ffc2V0X2NhbGxiYWNrYFxuKiAgIGBicGZfdGhyZWFkX3dxX3N0YXJ0YFxuKiAgIGBicGZfdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlc2BcbiogICBgY2dyb3VwX2t0aHJlYWRfYXR0YWNoYFxuXG4qKlJlbGV2YW50IENvbmZpZ3M6KipcblxuKiAgIGBNRU1DR2BcbiogICBgQ0dST1VQU2BcblxuT2theSwgdGhhdCdzIGV2ZXJ5dGhpbmcuIExldCdzIHNlbmQgdGhlc2UgcmVzdWx0cyBvdmVyLlxuXG5cbiIsIklucHV0VG9rZW5zIjoyNjQ2NiwiT3V0cHV0VG9rZW5zIjoyMDUsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo4MzIsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDdUMDg6NTE6MDcuMTQ4MzQ5NTg0WiIsIlNlcSI6NiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoic2V0LXJlc3VsdHMiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNTAwMjk0MzksIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIk1FTUNHXCIsXG4gICAgXCJDR1JPVVBTXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwiYnBmX3RocmVhZF93cV9pbml0XCIsXG4gICAgXCJicGZfdGhyZWFkX3dxX3NldF9jYWxsYmFja1wiLFxuICAgIFwiYnBmX3RocmVhZF93cV9zdGFydFwiLFxuICAgIFwiYnBmX3RyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXNcIixcbiAgICBcImNncm91cF9rdGhyZWFkX2F0dGFjaFwiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGludHJvZHVjZXMgYSBuZXcgQlBGIHRocmVhZCB3b3JrcXVldWUgZmVhdHVyZSAoYGJwZl90aHJlYWRfd3FgKSB0aGF0IGFsbG93cyBCUEYgcHJvZ3JhbXMgdG8gc2NoZWR1bGUgd29yayBpbiBhIGt0aHJlYWQgY29udGV4dCwgb3B0aW9uYWxseSBhdHRhY2hlZCB0byBhIGNncm91cC4gSXQgYWxzbyBhZGRzIGEgbmV3IEJQRiBrZnVuYyBgYnBmX3RyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXNgIGZvciBtZW1vcnkgY2dyb3VwIHJlY2xhaW0uIFRoZXNlIGFyZSBmdW5jdGlvbmFsIGNoYW5nZXMgdG8gdGhlIGNvcmUgQlBGIGFuZCBtZW1vcnkgY29udHJvbCBzdWJzeXN0ZW1zLCByZWFjaGFibGUgZnJvbSB1c2Vyc3BhY2UgdmlhIEJQRiBwcm9ncmFtcywgYW5kIHNob3VsZCBiZSBmdXp6ZWQuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiTUVNQ0dcIixcbiAgICBcIkNHUk9VUFNcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJicGZfdGhyZWFkX3dxX2luaXRcIixcbiAgICBcImJwZl90aHJlYWRfd3Ffc2V0X2NhbGxiYWNrXCIsXG4gICAgXCJicGZfdGhyZWFkX3dxX3N0YXJ0XCIsXG4gICAgXCJicGZfdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlc1wiLFxuICAgIFwiY2dyb3VwX2t0aHJlYWRfYXR0YWNoXCJcbiAgXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggaW50cm9kdWNlcyBhIG5ldyBCUEYgdGhyZWFkIHdvcmtxdWV1ZSBmZWF0dXJlIChgYnBmX3RocmVhZF93cWApIHRoYXQgYWxsb3dzIEJQRiBwcm9ncmFtcyB0byBzY2hlZHVsZSB3b3JrIGluIGEga3RocmVhZCBjb250ZXh0LCBvcHRpb25hbGx5IGF0dGFjaGVkIHRvIGEgY2dyb3VwLiBJdCBhbHNvIGFkZHMgYSBuZXcgQlBGIGtmdW5jIGBicGZfdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlc2AgZm9yIG1lbW9yeSBjZ3JvdXAgcmVjbGFpbS4gVGhlc2UgYXJlIGZ1bmN0aW9uYWwgY2hhbmdlcyB0byB0aGUgY29yZSBCUEYgYW5kIG1lbW9yeSBjb250cm9sIHN1YnN5c3RlbXMsIHJlYWNoYWJsZSBmcm9tIHVzZXJzcGFjZSB2aWEgQlBGIHByb2dyYW1zLCBhbmQgc2hvdWxkIGJlIGZ1enplZC5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9XTsKCQkJaWYgKCFyYXdEYXRhIHx8IHJhd0RhdGEubGVuZ3RoID09PSAwKSByZXR1cm47CgoJCQlkcmF3U3VtbWFyeVRhYmxlcyhyYXdEYXRhKTsKCQkJZHJhd0R1cmF0aW9uQ2hhcnQocmF3RGF0YSk7CgkJCWRyYXdUb2tlbkNvbnN1bXB0aW9uQ2hhcnQocmF3RGF0YSk7CgkJfQoKCQlmdW5jdGlvbiBkcmF3U3VtbWFyeVRhYmxlcyhyYXdEYXRhKSB7CgkJCWNvbnN0IHN0YXRzID0gewoJCQkJbGxtOiB7IGNvdW50OiAwLCB0b2tlbnM6IDAsIGR1cmF0aW9uOiAwIH0sCgkJCQl0b29sOiB7IGNvdW50OiAwLCBkdXJhdGlvbjogMCB9CgkJCX07CgoJCQlyYXdEYXRhLmZvckVhY2gocyA9PiB7CgkJCQljb25zdCBkdXIgPSBzLkR1cmF0aW9uIC8gMTAwMDAwMDAwMDsgCgkJCQlpZiAocy5UeXBlID09PSAibGxtIikgewoJCQkJCXN0YXRzLmxsbS5jb3VudCsrOwoJCQkJCXN0YXRzLmxsbS50b2tlbnMgKz0gKHMuSW5wdXRUb2tlbnMgKyBzLk91dHB1dFRva2VucyArIHMuT3V0cHV0VGhvdWdodHNUb2tlbnMpOwoJCQkJCXN0YXRzLmxsbS5kdXJhdGlvbiArPSBkdXI7CgkJCQl9IGVsc2UgaWYgKHMuVHlwZSA9PT0gInRvb2wiKSB7CgkJCQkJc3RhdHMudG9vbC5jb3VudCsrOwoJCQkJCXN0YXRzLnRvb2wuZHVyYXRpb24gKz0gZHVyOwoJCQkJfQoJCQl9KTsKCgkJCWNvbnN0IGF2Z0xsbUR1ciA9IHN0YXRzLmxsbS5jb3VudCA+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-workflowlcc6l[0].run-triage(0) Phase: Succeeded StartedAt: 2026-08-07 08:09:10 +0000 UTC FinishedAt: 2026-08-07 08:51:09 +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": "8c7f55d60aa3512fd3da7e9cf313723460e487b4", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "MEMCG", "CGROUPS" ], "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": "8c7f55d60aa3512fd3da7e9cf313723460e487b4", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "MEMCG", "CGROUPS" ], "series_id": "ce95f701-5786-4fe2-8f55-ad86a4f88cdd" }, "track": "KASAN", "fuzz": { "focus": [ "bpf", "net" ], "focus_symbols": [ "bpf_thread_wq_init", "bpf_thread_wq_set_callback", "bpf_thread_wq_start", "bpf_try_to_free_mem_cgroup_pages", "cgroup_kthread_attach" ], "corpus_urls": [ "https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db", "https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db", "https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db" ], "skip_cover_check": true, "bug_title_re": "" }, "retest": null } ], "trajectory": "CjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KPGhlYWQ+Cgk8dGl0bGU+QUkgVHJhamVjdG9yeTwvdGl0bGU+Cgk8c3R5bGU+CgkJdGFibGUgewoJCQlib3JkZXI6IDFweCBzb2xpZCAjY2NjOwoJCQltYXJnaW46IDIwcHggNXB4OwoJCQlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwoJCQl3aGl0ZS1zcGFjZTogbm93cmFwOwoJCQl0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKCQkJb3ZlcmZsb3c6IGhpZGRlbjsKCQl9CgoJCXRhYmxlIGNhcHRpb24gewoJCQlmb250LXdlaWdodDogYm9sZDsKCQl9CgoJCXRhYmxlIHRkLCB0YWJsZSB0aCB7CgkJCXZlcnRpY2FsLWFsaWduOiB0b3A7CgkJCXBhZGRpbmc6IDJweCA4cHg7CgkJCXRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwoJCQlvdmVyZmxvdzogaGlkZGVuOwoJCX0KCgkJLmxpc3RfdGFibGUgdGQsIC5saXN0X3RhYmxlIHRoIHsKCQkJYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjY2NjOwoJCX0KCgkJLmxpc3RfdGFibGUgdGggewoJCQliYWNrZ3JvdW5kOiAjRjRGNEY0OwoJCX0KCgkJLmxpc3RfdGFibGUgdHI6bnRoLWNoaWxkKDJuKSB7CgkJCWJhY2tncm91bmQ6ICNGNEY0RjQ7CgkJfQoKCQkubGlzdF90YWJsZSB0cjpob3ZlciB7CgkJCWJhY2tncm91bmQ6ICNmZmZmOTk7CgkJfQoKCQkjYWlfZGV0YWlsc19kaXYgcHJlIHsKCQkJbWFyZ2luOiAxcHg7CgkJCW1heC13aWR0aDogMTIwY2g7CgkJCXdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKCQkJb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKCQl9Cgk8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PgoJPGgxPkFJIFRyYWplY3Rvcnk8L2gxPgoJPGJyPgoKCQoJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQk8Y2FwdGlvbj5UcmFqZWN0b3J5OiAoPGEgaHJlZj0iIyIgb25jbGljaz0idG9nZ2xlQWxsRGV0YWlscygpOyByZXR1cm4gZmFsc2U7Ij5FeHBhbmQvQ29sbGFwc2UgQWxsPC9hPik8L2NhcHRpb24+CgkJPHRoZWFkPjx0cj4KCQkJPHRoPlNlcTwvdGg+CgkJCTx0aD5UaW1lc3RhbXA8L3RoPgoJCQk8dGg+VHlwZTwvdGg+CgkJCTx0aD5OYW1lPC90aD4KCQkJPHRoPkR1cmF0aW9uPC90aD4KCQk8L3RyPjwvdGhlYWQ+CgkJPHRib2R5PgoJCQoJCTx0cj4KCQkJPHRkPjAvMDwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA3IDA4OjUwPC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O01FTUNHJiMzNDssCiAgICAmIzM0O0NHUk9VUFMmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDticGZfdGhyZWFkX3dxX2luaXQmIzM0OywKICAgICYjMzQ7YnBmX3RocmVhZF93cV9zZXRfY2FsbGJhY2smIzM0OywKICAgICYjMzQ7YnBmX3RocmVhZF93cV9zdGFydCYjMzQ7LAogICAgJiMzNDticGZfdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcyYjMzQ7LAogICAgJiMzNDtjZ3JvdXBfa3RocmVhZF9hdHRhY2gmIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggaW50cm9kdWNlcyBhIG5ldyBCUEYgdGhyZWFkIHdvcmtxdWV1ZSBmZWF0dXJlIChgYnBmX3RocmVhZF93cWApIHRoYXQgYWxsb3dzIEJQRiBwcm9ncmFtcyB0byBzY2hlZHVsZSB3b3JrIGluIGEga3RocmVhZCBjb250ZXh0LCBvcHRpb25hbGx5IGF0dGFjaGVkIHRvIGEgY2dyb3VwLiBJdCBhbHNvIGFkZHMgYSBuZXcgQlBGIGtmdW5jIGBicGZfdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlc2AgZm9yIG1lbW9yeSBjZ3JvdXAgcmVjbGFpbS4gVGhlc2UgYXJlIGZ1bmN0aW9uYWwgY2hhbmdlcyB0byB0aGUgY29yZSBCUEYgYW5kIG1lbW9yeSBjb250cm9sIHN1YnN5c3RlbXMsIHJlYWNoYWJsZSBmcm9tIHVzZXJzcGFjZSB2aWEgQlBGIHByb2dyYW1zLCBhbmQgc2hvdWxkIGJlIGZ1enplZC4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xLzE8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNyAwODo1MDwvdGQ+CgkJCTx0ZD5hY3Rpb248L3RkPgoJCQk8dGQ+cmVhZC1wYXRjaC1kaWZmPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7UGF0Y2hEaWZmJiMzNDs6ICYjMzQ7Y29tbWl0IGU3MmUyYzAwOGM5NTFmYTVkMDdhYmFhZDlkMzJlODc3ODc5ZTJlYTdcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgRnJpIEF1ZyA3IDA4OjUwOjQwIDIwMjYgJiM0MzswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYnBmLmggYi9pbmNsdWRlL2xpbnV4L2JwZi5oXG5pbmRleCA3M2JhY2ZjNjQ0NGRmLi5kNjNjZTgzMTk4Njk2IDEwMDY0NFxuLS0tIGEvaW5jbHVkZS9saW51eC9icGYuaFxuJiM0MzsmIzQzOyYjNDM7IGIvaW5jbHVkZS9saW51eC9icGYuaFxuQEAgLTIxMyw2ICYjNDM7MjEzLDcgQEAgZW51bSBidGZfZmllbGRfdHlwZSB7XG4gXHRCUEZfVVBUUiAgICAgICA9ICgxIFx1MDAzY1x1MDAzYyAxMSksXG4gXHRCUEZfUkVTX1NQSU5fTE9DSyA9ICgxIFx1MDAzY1x1MDAzYyAxMiksXG4gXHRCUEZfVEFTS19XT1JLICA9ICgxIFx1MDAzY1x1MDAzYyAxMyksXG4mIzQzO1x0QlBGX1RIUkVBRF9XUSAgPSAoMSBcdTAwM2NcdTAwM2MgMTQpLFxuIH07XG4gXG4gZW51bSBicGZfY2dyb3VwX3N0b3JhZ2VfdHlwZSB7XG5AQCAtMjY3LDYgJiM0MzsyNjgsNyBAQCBzdHJ1Y3QgYnRmX3JlY29yZCB7XG4gXHRpbnQgd3Ffb2ZmO1xuIFx0aW50IHJlZmNvdW50X29mZjtcbiBcdGludCB0YXNrX3dvcmtfb2ZmO1xuJiM0MztcdGludCB0aHJlYWRfd3Ffb2ZmO1xuIFx0c3RydWN0IGJ0Zl9maWVsZCBmaWVsZHNbXTtcbiB9O1xuIFxuQEAgLTM3Miw2ICYjNDM7Mzc0LDggQEAgc3RhdGljIGlubGluZSBjb25zdCBjaGFyICpidGZfZmllbGRfdHlwZV9uYW1lKGVudW0gYnRmX2ZpZWxkX3R5cGUgdHlwZSlcbiBcdFx0cmV0dXJuIFwmIzM0O2JwZl9yZWZjb3VudFwmIzM0OztcbiBcdGNhc2UgQlBGX1RBU0tfV09SSzpcbiBcdFx0cmV0dXJuIFwmIzM0O2JwZl90YXNrX3dvcmtcJiMzNDs7XG4mIzQzO1x0Y2FzZSBCUEZfVEhSRUFEX1dROlxuJiM0MztcdFx0cmV0dXJuIFwmIzM0O2JwZl90aHJlYWRfd3FcJiMzNDs7XG4gXHRkZWZhdWx0OlxuIFx0XHRXQVJOX09OX09OQ0UoMSk7XG4gXHRcdHJldHVybiBcJiMzNDt1bmtub3duXCYjMzQ7O1xuQEAgLTQxMiw2ICYjNDM7NDE2LDggQEAgc3RhdGljIGlubGluZSB1MzIgYnRmX2ZpZWxkX3R5cGVfc2l6ZShlbnVtIGJ0Zl9maWVsZF90eXBlIHR5cGUpXG4gXHRcdHJldHVybiBzaXplb2Yoc3RydWN0IGJwZl9yZWZjb3VudCk7XG4gXHRjYXNlIEJQRl9UQVNLX1dPUks6XG4gXHRcdHJldHVybiBzaXplb2Yoc3RydWN0IGJwZl90YXNrX3dvcmspO1xuJiM0MztcdGNhc2UgQlBGX1RIUkVBRF9XUTpcbiYjNDM7XHRcdHJldHVybiBzaXplb2Yoc3RydWN0IGJwZl90aHJlYWRfd3EpO1xuIFx0ZGVmYXVsdDpcbiBcdFx0V0FSTl9PTl9PTkNFKDEpO1xuIFx0XHRyZXR1cm4gMDtcbkBAIC00NDYsNiAmIzQzOzQ1Miw4IEBAIHN0YXRpYyBpbmxpbmUgdTMyIGJ0Zl9maWVsZF90eXBlX2FsaWduKGVudW0gYnRmX2ZpZWxkX3R5cGUgdHlwZSlcbiBcdFx0cmV0dXJuIF9fYWxpZ25vZl9fKHN0cnVjdCBicGZfcmVmY291bnQpO1xuIFx0Y2FzZSBCUEZfVEFTS19XT1JLOlxuIFx0XHRyZXR1cm4gX19hbGlnbm9mX18oc3RydWN0IGJwZl90YXNrX3dvcmspO1xuJiM0MztcdGNhc2UgQlBGX1RIUkVBRF9XUTpcbiYjNDM7XHRcdHJldHVybiBfX2FsaWdub2ZfXyhzdHJ1Y3QgYnBmX3RocmVhZF93cSk7XG4gXHRkZWZhdWx0OlxuIFx0XHRXQVJOX09OX09OQ0UoMSk7XG4gXHRcdHJldHVybiAwO1xuQEAgLTQ3OCw2ICYjNDM7NDg2LDcgQEAgc3RhdGljIGlubGluZSB2b2lkIGJwZl9vYmpfaW5pdF9maWVsZChjb25zdCBzdHJ1Y3QgYnRmX2ZpZWxkICpmaWVsZCwgdm9pZCAqYWRkcilcbiBcdGNhc2UgQlBGX0tQVFJfUEVSQ1BVOlxuIFx0Y2FzZSBCUEZfVVBUUjpcbiBcdGNhc2UgQlBGX1RBU0tfV09SSzpcbiYjNDM7XHRjYXNlIEJQRl9USFJFQURfV1E6XG4gXHRcdGJyZWFrO1xuIFx0ZGVmYXVsdDpcbiBcdFx0V0FSTl9PTl9PTkNFKDEpO1xuQEAgLTUwMiw2ICYjNDM7NTExLDcgQEAgc3RhdGljIGlubGluZSBib29sIGJ0Zl9maWVsZF9pc19ubWlfc2FmZShlbnVtIGJ0Zl9maWVsZF90eXBlIHR5cGUpXG4gXHRjYXNlIEJQRl9UQVNLX1dPUks6XG4gXHRjYXNlIEJQRl9LUFRSX1VOUkVGOlxuIFx0Y2FzZSBCUEZfUkVGQ09VTlQ6XG4mIzQzO1x0Y2FzZSBCUEZfVEhSRUFEX1dROlxuIFx0XHRyZXR1cm4gdHJ1ZTtcbiBcdGRlZmF1bHQ6XG4gXHRcdHJldHVybiBmYWxzZTtcbkBAIC02NDQsNiAmIzQzOzY1NCw3IEBAIHZvaWQgY29weV9tYXBfdmFsdWVfbG9ja2VkKHN0cnVjdCBicGZfbWFwICptYXAsIHZvaWQgKmRzdCwgdm9pZCAqc3JjLFxuIHZvaWQgYnBmX3RpbWVyX2NhbmNlbF9hbmRfZnJlZSh2b2lkICp0aW1lcik7XG4gdm9pZCBicGZfd3FfY2FuY2VsX2FuZF9mcmVlKHZvaWQgKnRpbWVyKTtcbiB2b2lkIGJwZl90YXNrX3dvcmtfY2FuY2VsX2FuZF9mcmVlKHZvaWQgKnRpbWVyKTtcbiYjNDM7dm9pZCBicGZfdGhyZWFkX3dxX2NhbmNlbF9hbmRfZnJlZSh2b2lkICp2YWwpO1xuIHZvaWQgYnBmX2xpc3RfaGVhZF9mcmVlKGNvbnN0IHN0cnVjdCBidGZfZmllbGQgKmZpZWxkLCB2b2lkICpsaXN0X2hlYWQsXG4gXHRcdFx0c3RydWN0IGJwZl9zcGluX2xvY2sgKnNwaW5fbG9jayk7XG4gdm9pZCBicGZfcmJfcm9vdF9mcmVlKGNvbnN0IHN0cnVjdCBidGZfZmllbGQgKmZpZWxkLCB2b2lkICpyYl9yb290LFxuQEAgLTcwMSw3ICYjNDM7NzEyLDggQEAgYm9vbCBicGZfbWFwX21ldGFfZXF1YWwoY29uc3Qgc3RydWN0IGJwZl9tYXAgKm1ldGEwLFxuIFxuIHN0YXRpYyBpbmxpbmUgYm9vbCBicGZfbWFwX2hhc19pbnRlcm5hbF9zdHJ1Y3RzKHN0cnVjdCBicGZfbWFwICptYXApXG4ge1xuLVx0cmV0dXJuIGJ0Zl9yZWNvcmRfaGFzX2ZpZWxkKG1hcC1cdTAwM2VyZWNvcmQsIEJQRl9USU1FUiB8IEJQRl9XT1JLUVVFVUUgfCBCUEZfVEFTS19XT1JLKTtcbiYjNDM7XHRyZXR1cm4gYnRmX3JlY29yZF9oYXNfZmllbGQobWFwLVx1MDAzZXJlY29yZCwgQlBGX1RJTUVSIHwgQlBGX1dPUktRVUVVRSB8XG4mIzQzO1x0XHRcdFx0XHRcdCBCUEZfVEFTS19XT1JLIHwgQlBGX1RIUkVBRF9XUSk7XG4gfVxuIFxuIHZvaWQgYnBmX21hcF9mcmVlX2ludGVybmFsX3N0cnVjdHMoc3RydWN0IGJwZl9tYXAgKm1hcCwgdm9pZCAqb2JqKTtcbkBAIC0yNzI1LDYgJiM0MzsyNzM3LDcgQEAgYm9vbCBidGZfcmVjb3JkX2VxdWFsKGNvbnN0IHN0cnVjdCBidGZfcmVjb3JkICpyZWNfYSwgY29uc3Qgc3RydWN0IGJ0Zl9yZWNvcmQgKnJcbiB2b2lkIGJwZl9vYmpfZnJlZV90aW1lcihjb25zdCBzdHJ1Y3QgYnRmX3JlY29yZCAqcmVjLCB2b2lkICpvYmopO1xuIHZvaWQgYnBmX29ial9mcmVlX3dvcmtxdWV1ZShjb25zdCBzdHJ1Y3QgYnRmX3JlY29yZCAqcmVjLCB2b2lkICpvYmopO1xuIHZvaWQgYnBmX29ial9mcmVlX3Rhc2tfd29yayhjb25zdCBzdHJ1Y3QgYnRmX3JlY29yZCAqcmVjLCB2b2lkICpvYmopO1xuJiM0Mzt2b2lkIGJwZl9vYmpfZnJlZV90aHJlYWRfd3EoY29uc3Qgc3RydWN0IGJ0Zl9yZWNvcmQgKnJlYywgdm9pZCAqb2JqKTtcbiB2b2lkIGJwZl9vYmpfY2FuY2VsX2ZpZWxkcyhzdHJ1Y3QgYnBmX21hcCAqbWFwLCB2b2lkICpvYmopO1xuIHZvaWQgYnBmX29ial9mcmVlX2ZpZWxkcyhjb25zdCBzdHJ1Y3QgYnRmX3JlY29yZCAqcmVjLCB2b2lkICpvYmopO1xuIHZvaWQgX19icGZfb2JqX2Ryb3BfaW1wbCh2b2lkICpwLCBjb25zdCBzdHJ1Y3QgYnRmX3JlY29yZCAqcmVjLCBib29sIHBlcmNwdSk7XG5kaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9jZ3JvdXAuaCBiL2luY2x1ZGUvbGludXgvY2dyb3VwLmhcbmluZGV4IGYyYWE0NmE0Zjg3MWUuLjliNGE4ZGM3NDhhY2UgMTAwNjQ0XG4tLS0gYS9pbmNsdWRlL2xpbnV4L2Nncm91cC5oXG4mIzQzOyYjNDM7JiM0MzsgYi9pbmNsdWRlL2xpbnV4L2Nncm91cC5oXG5AQCAtOTIzLDQgJiM0Mzs5MjMsNiBAQCBzdHJ1Y3QgY2dyb3VwICp0YXNrX2dldF9jZ3JvdXAxKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLCBpbnQgaGllcmFyY2h5X2lkKTtcbiBcbiBzdHJ1Y3QgY2dyb3VwX29mX3BlYWsgKm9mX3BlYWsoc3RydWN0IGtlcm5mc19vcGVuX2ZpbGUgKm9mKTtcbiBcbiYjNDM7aW50IGNncm91cF9rdGhyZWFkX2F0dGFjaChzdHJ1Y3QgY2dyb3VwICpjZ3JwLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spO1xuJiM0MztcbiAjZW5kaWYgLyogX0xJTlVYX0NHUk9VUF9IICovXG5kaWZmIC0tZ2l0IGEvaW5jbHVkZS91YXBpL2xpbnV4L2JwZi5oIGIvaW5jbHVkZS91YXBpL2xpbnV4L2JwZi5oXG5pbmRleCBmZmQ5NmU4YjkyMGJkLi4wNTU4NTIwZjY3ZmU0IDEwMDY0NFxuLS0tIGEvaW5jbHVkZS91YXBpL2xpbnV4L2JwZi5oXG4mIzQzOyYjNDM7JiM0MzsgYi9pbmNsdWRlL3VhcGkvbGludXgvYnBmLmhcbkBAIC03NTc0LDYgJiM0Mzs3NTc0LDEwIEBAIHN0cnVjdCBicGZfd3Ege1xuIFx0X191NjQgX19vcGFxdWVbMl07XG4gfSBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDgpKSk7XG4gXG4mIzQzO3N0cnVjdCBicGZfdGhyZWFkX3dxIHtcbiYjNDM7XHRfX3U2NCBfX29wYXF1ZVsyXTtcbiYjNDM7fSBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDgpKSk7XG4mIzQzO1xuIHN0cnVjdCBicGZfZHlucHRyIHtcbiBcdF9fdTY0IF9fb3BhcXVlWzJdO1xuIH0gX19hdHRyaWJ1dGVfXygoYWxpZ25lZCg4KSkpO1xuZGlmZiAtLWdpdCBhL2tlcm5lbC9icGYvYnRmLmMgYi9rZXJuZWwvYnBmL2J0Zi5jXG5pbmRleCA0MjQxNDYzM2NmMjYzLi5iZjZmYjVmNTFkMjFhIDEwMDY0NFxuLS0tIGEva2VybmVsL2JwZi9idGYuY1xuJiM0MzsmIzQzOyYjNDM7IGIva2VybmVsL2JwZi9idGYuY1xuQEAgLTM2NjUsNiAmIzQzOzM2NjUsNyBAQCBzdGF0aWMgaW50IGJ0Zl9nZXRfZmllbGRfdHlwZShjb25zdCBzdHJ1Y3QgYnRmICpidGYsIGNvbnN0IHN0cnVjdCBidGZfdHlwZSAqdmFyX1xuIFx0XHR7IEJQRl9USU1FUiwgXCYjMzQ7YnBmX3RpbWVyXCYjMzQ7LCB0cnVlIH0sXG4gXHRcdHsgQlBGX1dPUktRVUVVRSwgXCYjMzQ7YnBmX3dxXCYjMzQ7LCB0cnVlIH0sXG4gXHRcdHsgQlBGX1RBU0tfV09SSywgXCYjMzQ7YnBmX3Rhc2tfd29ya1wmIzM0OywgdHJ1ZSB9LFxuJiM0MztcdFx0eyBCUEZfVEhSRUFEX1dRLCBcJiMzNDticGZfdGhyZWFkX3dxXCYjMzQ7LCB0cnVlIH0sXG4gXHRcdHsgQlBGX0xJU1RfSEVBRCwgXCYjMzQ7YnBmX2xpc3RfaGVhZFwmIzM0OywgZmFsc2UgfSxcbiBcdFx0eyBCUEZfTElTVF9OT0RFLCBcJiMzNDticGZfbGlzdF9ub2RlXCYjMzQ7LCBmYWxzZSB9LFxuIFx0XHR7IEJQRl9SQl9ST09ULCBcJiMzNDticGZfcmJfcm9vdFwmIzM0OywgZmFsc2UgfSxcbkBAIC0zODUwLDYgJiM0MzszODUxLDcgQEAgc3RhdGljIGludCBidGZfZmluZF9maWVsZF9vbmUoY29uc3Qgc3RydWN0IGJ0ZiAqYnRmLFxuIFx0Y2FzZSBCUEZfUkJfTk9ERTpcbiBcdGNhc2UgQlBGX1JFRkNPVU5UOlxuIFx0Y2FzZSBCUEZfVEFTS19XT1JLOlxuJiM0MztcdGNhc2UgQlBGX1RIUkVBRF9XUTpcbiBcdFx0cmV0ID0gYnRmX2ZpbmRfc3RydWN0KGJ0ZiwgdmFyX3R5cGUsIG9mZiwgc3osIGZpZWxkX3R5cGUsXG4gXHRcdFx0XHQgICAgICBpbmZvX2NudCA/IFx1MDAyNmluZm9bMF0gOiBcdTAwMjZ0bXApO1xuIFx0XHRpZiAocmV0IFx1MDAzYyAwKVxuQEAgLTQxNDUsNiAmIzQzOzQxNDcsNyBAQCBzdHJ1Y3QgYnRmX3JlY29yZCAqYnRmX3BhcnNlX2ZpZWxkcyhjb25zdCBzdHJ1Y3QgYnRmICpidGYsIGNvbnN0IHN0cnVjdCBidGZfdHlwZVxuIFx0cmVjLVx1MDAzZXdxX29mZiA9IC1FSU5WQUw7XG4gXHRyZWMtXHUwMDNlcmVmY291bnRfb2ZmID0gLUVJTlZBTDtcbiBcdHJlYy1cdTAwM2V0YXNrX3dvcmtfb2ZmID0gLUVJTlZBTDtcbiYjNDM7XHRyZWMtXHUwMDNldGhyZWFkX3dxX29mZiA9IC1FSU5WQUw7XG4gXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBjbnQ7IGkmIzQzOyYjNDM7KSB7XG4gXHRcdGZpZWxkX3R5cGVfc2l6ZSA9IGJ0Zl9maWVsZF90eXBlX3NpemUoaW5mb19hcnJbaV0udHlwZSk7XG4gXHRcdGlmIChpbmZvX2FycltpXS5vZmYgJiM0MzsgZmllbGRfdHlwZV9zaXplIFx1MDAzZSB2YWx1ZV9zaXplKSB7XG5AQCAtNDE4OCw2ICYjNDM7NDE5MSwxMCBAQCBzdHJ1Y3QgYnRmX3JlY29yZCAqYnRmX3BhcnNlX2ZpZWxkcyhjb25zdCBzdHJ1Y3QgYnRmICpidGYsIGNvbnN0IHN0cnVjdCBidGZfdHlwZVxuIFx0XHRcdFdBUk5fT05fT05DRShyZWMtXHUwMDNldGFza193b3JrX29mZiBcdTAwM2U9IDApO1xuIFx0XHRcdHJlYy1cdTAwM2V0YXNrX3dvcmtfb2ZmID0gcmVjLVx1MDAzZWZpZWxkc1tpXS5vZmZzZXQ7XG4gXHRcdFx0YnJlYWs7XG4mIzQzO1x0XHRjYXNlIEJQRl9USFJFQURfV1E6XG4mIzQzO1x0XHRcdFdBUk5fT05fT05DRShyZWMtXHUwMDNldGhyZWFkX3dxX29mZiBcdTAwM2U9IDApO1xuJiM0MztcdFx0XHRyZWMtXHUwMDNldGhyZWFkX3dxX29mZiA9IHJlYy1cdTAwM2VmaWVsZHNbaV0ub2Zmc2V0O1xuJiM0MztcdFx0XHRicmVhaztcbiBcdFx0Y2FzZSBCUEZfUkVGQ09VTlQ6XG4gXHRcdFx0V0FSTl9PTl9PTkNFKHJlYy1cdTAwM2VyZWZjb3VudF9vZmYgXHUwMDNlPSAwKTtcbiBcdFx0XHQvKiBDYWNoZSBvZmZzZXQgZm9yIGZhc3RlciBsb29rdXAgYXQgcnVudGltZSAqL1xuZGlmZiAtLWdpdCBhL2tlcm5lbC9icGYvaGVscGVycy5jIGIva2VybmVsL2JwZi9oZWxwZXJzLmNcbmluZGV4IDYzODhiNmIyM2U0OTAuLjhlMDFiYWQxYjE2YTAgMTAwNjQ0XG4tLS0gYS9rZXJuZWwvYnBmL2hlbHBlcnMuY1xuJiM0MzsmIzQzOyYjNDM7IGIva2VybmVsL2JwZi9oZWxwZXJzLmNcbkBAIC0yOSw2ICYjNDM7MjksOCBAQFxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L3Rhc2tfd29yay5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvaXJxX3dvcmsuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L2J1aWxkaWQuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9rdGhyZWFkLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjbGludXgvamhhc2guaFx1MDAzZVxuIFxuICNpbmNsdWRlIFwmIzM0Oy4uLy4uL2xpYi9rc3RydG94LmhcJiMzNDtcbiBcbkBAIC0xMTEwLDYgJiM0MzsxMTEyLDE3IEBAIHN0YXRpYyB2b2lkICptYXBfa2V5X2Zyb21fdmFsdWUoc3RydWN0IGJwZl9tYXAgKm1hcCwgdm9pZCAqdmFsdWUsIHUzMiAqYXJyX2lkeClcbiBcdHJldHVybiAodm9pZCAqKXZhbHVlIC0gcm91bmRfdXAobWFwLVx1MDAzZWtleV9zaXplLCA4KTtcbiB9XG4gXG4mIzQzO3N0YXRpYyB1MzIgYnBmX21hcF9lbGVtX2lkX2Zyb21fdmFsdWUoc3RydWN0IGJwZl9tYXAgKm1hcCwgdm9pZCAqdmFsdWUpXG4mIzQzO3tcbiYjNDM7XHR1MzIgYXJyX2lkeDtcbiYjNDM7XHR2b2lkICprZXk7XG4mIzQzO1xuJiM0MztcdGtleSA9IG1hcF9rZXlfZnJvbV92YWx1ZShtYXAsIHZhbHVlLCBcdTAwMjZhcnJfaWR4KTtcbiYjNDM7XHRpZiAobWFwLVx1MDAzZW1hcF90eXBlID09IEJQRl9NQVBfVFlQRV9BUlJBWSlcbiYjNDM7XHRcdHJldHVybiBhcnJfaWR4O1xuJiM0MztcdHJldHVybiBqaGFzaChrZXksIG1hcC1cdTAwM2VrZXlfc2l6ZSwgMCk7XG4mIzQzO31cbiYjNDM7XG4gZW51bSBicGZfYXN5bmNfdHlwZSB7XG4gXHRCUEZfQVNZTkNfVFlQRV9USU1FUiA9IDAsXG4gXHRCUEZfQVNZTkNfVFlQRV9XUSxcbkBAIC00NzY5LDYgJiM0Mzs0NzgyLDM5NyBAQCBfX2JwZl9rZnVuYyBpbnQgYnBmX3RpbWVyX2NhbmNlbF9hc3luYyhzdHJ1Y3QgYnBmX3RpbWVyICp0aW1lcilcbiBcdH1cbiB9XG4gXG4mIzQzOy8qXG4mIzQzOyAqIEJQRiB0aHJlYWQgd29ya3F1ZXVlIChrdGhyZWFkX3dvcmtlciBiYXNlZCkgaW1wbGVtZW50YXRpb25cbiYjNDM7ICpcbiYjNDM7ICogV2h5IGJwZl90aHJlYWRfd3EgZG9lcyBOT1QgdXNlIHRoZSBicGZfYXN5bmMgaW5mcmFzdHJ1Y3R1cmU6XG4mIzQzOyAqXG4mIzQzOyAqIGJwZl90aW1lciBhbmQgYnBmX3dxIHNoYXJlIGEgY29tbW9uIGNsZWFudXAgcGF0aCB2aWEgYnBmX2FzeW5jOlxuJiM0MzsgKlxuJiM0MzsgKiAgIGJwZl9hc3luY19jYW5jZWxfYW5kX2ZyZWUoKVxuJiM0MzsgKiAgICAgLVx1MDAzZSBicGZfYXN5bmNfc2NoZWR1bGVfb3AoKVxuJiM0MzsgKiAgICAgICAtXHUwMDNlIGlycV93b3JrX3F1ZXVlKCkgICAgICAgICAgICAgICAgLy8gc2NoZWR1bGUgZnJvbSBhbnkgY29udGV4dFxuJiM0MzsgKiAgICAgICAgIC1cdTAwM2UgYnBmX2FzeW5jX3Byb2Nlc3Nfb3AoKSAgICAgICAgLy8gcnVucyBpbiBoYXJkaXJxIGNvbnRleHRcbiYjNDM7ICogICAgICAgICAgIC1cdTAwM2UgYnBmX3dxX3dvcmsoKSAvIHRpbWVyIGNiICAgIC8vIGF0b21pYywgbm9uLXNsZWVwYWJsZVxuJiM0MzsgKlxuJiM0MzsgKiBUaGlzIHdvcmtzIGZvciB0aW1lciBhbmQgd29ya3F1ZXVlIGJlY2F1c2UgdGhlaXIgY2FsbGJhY2tzIGFuZFxuJiM0MzsgKiBjYW5jZWxsYXRpb24gKGhydGltZXJfY2FuY2VsIC8gYnBmX3dxX2NhbmNlbF9hbmRfZnJlZSkgY29tcGxldGVcbiYjNDM7ICogc3luY2hyb25vdXNseSBhbmQgbmVlZCBub3Qgc2xlZXAuICBUaGUgaGFyZGlycSBjb250ZXh0IGlzIHN1ZmZpY2llbnQuXG4mIzQzOyAqXG4mIzQzOyAqIGJwZl90aHJlYWRfd3EgaXMgZGlmZmVyZW50OiBjYW5jZWxsYXRpb24gYW5kIGZpbmFsIGNsZWFudXAgbWF5IG5lZWQgdG9cbiYjNDM7ICogc2xlZXA6XG4mIzQzOyAqXG4mIzQzOyAqICAga3RocmVhZF9jYW5jZWxfd29ya19zeW5jKCkgICAgLSB3YWl0cyBmb3IgdGhlIHdvcmsgdG8gZmluaXNoLCBjYW5cbiYjNDM7ICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2hlZHVsZSBvdXQgaWYgdGhlIHdvcmsgaXMgcnVubmluZy5cbiYjNDM7ICogICBrdGhyZWFkX2Rlc3Ryb3lfd29ya2VyKCkgICAgICAtIHN0b3BzIHRoZSBrdGhyZWFkLCBpbnRlcm5hbGx5XG4mIzQzOyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVzIHdpdGgga3RocmVhZCBleGl0LlxuJiM0MzsgKiAgIGNncm91cF9wdXQoKSAoZmluYWwgcHV0KSAgICAgIC0gbWF5IGFjcXVpcmUgY2dyb3VwX211dGV4IGFuZCBvdGhlclxuJiM0MzsgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsZWVwaW5nIGxvY2tzIGR1cmluZyBvZmZsaW5lLlxuJiM0MzsgKlxuJiM0MzsgKiBOb25lIG9mIHRoZXNlIGNhbiBiZSBjYWxsZWQgZnJvbSBoYXJkaXJxIGNvbnRleHQgKGlycV93b3JrKS4gRG9pbmcgc29cbiYjNDM7ICogd291bGQgdHJpZ2dlciBtaWdodF9zbGVlcCgpIHdhcm5pbmdzIG9yIGRlYWRsb2NrLlxuJiM0MzsgKlxuJiM0MzsgKiBUaGVyZWZvcmUgYnBmX3RocmVhZF93cSBpbXBsZW1lbnRzIGl0cyBvd24gUkNVLWJhc2VkIGNsZWFudXA6XG4mIzQzOyAqXG4mIzQzOyAqICAgYnBmX3RocmVhZF93cV9jYW5jZWxfYW5kX2ZyZWUoKSAgICAgICAgLy8gc2xlZXBhYmxlIChjYWxsZWQgZnJvbVxuJiM0MzsgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1hcCBmcmVlIC8gZWxlbSBkZWxldGUpXG4mIzQzOyAqICAgICAtXHUwMDNlIHhjaGcoY3R4LCBOVUxMKSAgICAgICAgICAgICAgICAgICAvLyBkZXRhY2ggYXRvbWljYWxseVxuJiM0MzsgKiAgICAgLVx1MDAzZSBrdGhyZWFkX2NhbmNlbF93b3JrX3N5bmMoKSAgICAgICAgLy8gb2sgdG8gc2xlZXBcbiYjNDM7ICogICAgIC1cdTAwM2UgYnBmX3RocmVhZF93cV9jdHhfcHV0KClcbiYjNDM7ICogICAgICAgLVx1MDAzZSBjYWxsX3JjdV90YXNrc190cmFjZSgpICAgICAgICAgIC8vIHdhaXQgZm9yIEJQRiBjYWxsYmFja3NcbiYjNDM7ICogICAgICAgICAtXHUwMDNlIHNjaGVkdWxlX3dvcmsoKSAgICAgICAgICAgICAgIC8vIHN3aXRjaCB0byBzbGVlcGFibGUgY29udGV4dFxuJiM0MzsgKiAgICAgICAgICAgLVx1MDAzZSBicGZfdGhyZWFkX3dxX2Rlc3Ryb3lfd29ya19mbigpXG4mIzQzOyAqICAgICAgICAgICAgIC1cdTAwM2UgYnBmX3Byb2dfcHV0KClcbiYjNDM7ICogICAgICAgICAgICAgLVx1MDAzZSBjZ3JvdXBfcHV0KClcbiYjNDM7ICogICAgICAgICAgICAgLVx1MDAzZSBrdGhyZWFkX2Rlc3Ryb3lfd29ya2VyKClcbiYjNDM7ICogICAgICAgICAgICAgLVx1MDAzZSBrZnJlZShjdHgpXG4mIzQzOyAqXG4mIzQzOyAqIFRoZSBzYW1lIGRlc2lnbiBjaG9pY2Ugd2FzIG1hZGUgZm9yIGJwZl90YXNrX3dvcmssIHdoaWNoIGFsc28gYXZvaWRzXG4mIzQzOyAqIGJwZl9hc3luYyBiZWNhdXNlIHRhc2tfd29yayBjYW5jZWxsYXRpb24gc3luY2hyb25pemVzIHdpdGggdGhlIHRhc2tcbiYjNDM7ICogYW5kIG1heSBzbGVlcC5cbiYjNDM7ICovXG4mIzQzO1xuJiM0MztzdHJ1Y3QgYnBmX3RocmVhZF93cV9jdHgge1xuJiM0MztcdHN0cnVjdCBrdGhyZWFkX3dvcmtlciAqd29ya2VyO1xuJiM0MztcdHN0cnVjdCBrdGhyZWFkX3dvcmsgd29yaztcbiYjNDM7XHRzdHJ1Y3QgYnBmX3Byb2cgKnByb2c7XG4mIzQzO1x0YnBmX2NhbGxiYWNrX3QgY2FsbGJhY2tfZm47XG4mIzQzO1x0c3RydWN0IGJwZl9tYXAgKm1hcDtcbiYjNDM7XHR2b2lkICp2YWx1ZTtcbiYjNDM7XHRzdHJ1Y3QgY2dyb3VwICpjZ3JwO1xuJiM0MztcdHJlZmNvdW50X3QgcmVmY250O1xuJiM0MztcdHN0cnVjdCByY3VfaGVhZCByY3U7XG4mIzQzO1x0c3RydWN0IHdvcmtfc3RydWN0IGRlc3Ryb3lfd29yaztcbiYjNDM7fTtcbiYjNDM7XG4mIzQzOy8qIEtlcm5lbC1pbnRlcm5hbCByZXByZXNlbnRhdGlvbiB0aGF0IGZpdHMgaW4gc3RydWN0IGJwZl90aHJlYWRfd3EgKi9cbiYjNDM7c3RydWN0IGJwZl90aHJlYWRfd3Ffa2VybiB7XG4mIzQzO1x0c3RydWN0IGJwZl90aHJlYWRfd3FfY3R4ICpjdHg7XG4mIzQzO30gX19hbGlnbmVkKDgpO1xuJiM0MztcbiYjNDM7c3RhdGljIHZvaWQgYnBmX3RocmVhZF93cV9kZXN0cm95X3dvcmtfZm4oc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IGJwZl90aHJlYWRfd3FfY3R4ICpjdHggPSBjb250YWluZXJfb2Yod29yayxcbiYjNDM7XHRcdFx0XHRcdFx0ICAgICBzdHJ1Y3QgYnBmX3RocmVhZF93cV9jdHgsXG4mIzQzO1x0XHRcdFx0XHRcdCAgICAgZGVzdHJveV93b3JrKTtcbiYjNDM7XG4mIzQzO1x0aWYgKGN0eC1cdTAwM2Vwcm9nKVxuJiM0MztcdFx0YnBmX3Byb2dfcHV0KGN0eC1cdTAwM2Vwcm9nKTtcbiYjNDM7XHRpZiAoY3R4LVx1MDAzZWNncnApXG4mIzQzO1x0XHRjZ3JvdXBfcHV0KGN0eC1cdTAwM2VjZ3JwKTtcbiYjNDM7XHRpZiAoY3R4LVx1MDAzZXdvcmtlcilcbiYjNDM7XHRcdGt0aHJlYWRfZGVzdHJveV93b3JrZXIoY3R4LVx1MDAzZXdvcmtlcik7XG4mIzQzO1x0a2ZyZWUoY3R4KTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIHZvaWQgYnBmX3RocmVhZF93cV9jdHhfZnJlZV9yY3Uoc3RydWN0IHJjdV9oZWFkICpyY3UpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgYnBmX3RocmVhZF93cV9jdHggKmN0eCA9IGNvbnRhaW5lcl9vZihyY3UsXG4mIzQzO1x0XHRcdFx0XHRcdCAgICAgc3RydWN0IGJwZl90aHJlYWRfd3FfY3R4LFxuJiM0MztcdFx0XHRcdFx0XHQgICAgIHJjdSk7XG4mIzQzO1xuJiM0MztcdElOSVRfV09SSyhcdTAwMjZjdHgtXHUwMDNlZGVzdHJveV93b3JrLCBicGZfdGhyZWFkX3dxX2Rlc3Ryb3lfd29ya19mbik7XG4mIzQzO1x0c2NoZWR1bGVfd29yayhcdTAwMjZjdHgtXHUwMDNlZGVzdHJveV93b3JrKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIHZvaWQgYnBmX3RocmVhZF93cV9jdHhfcHV0KHN0cnVjdCBicGZfdGhyZWFkX3dxX2N0eCAqY3R4KVxuJiM0Mzt7XG4mIzQzO1x0aWYgKCFyZWZjb3VudF9kZWNfYW5kX3Rlc3QoXHUwMDI2Y3R4LVx1MDAzZXJlZmNudCkpXG4mIzQzO1x0XHRyZXR1cm47XG4mIzQzO1x0Y2FsbF9yY3VfdGFza3NfdHJhY2UoXHUwMDI2Y3R4LVx1MDAzZXJjdSwgYnBmX3RocmVhZF93cV9jdHhfZnJlZV9yY3UpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgdm9pZCBicGZfdGhyZWFkX3dxX3dvcmtfZm4oc3RydWN0IGt0aHJlYWRfd29yayAqd29yaylcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBicGZfdGhyZWFkX3dxX2N0eCAqY3R4ID0gY29udGFpbmVyX29mKHdvcmssXG4mIzQzO1x0XHRcdFx0XHRcdCAgICAgc3RydWN0IGJwZl90aHJlYWRfd3FfY3R4LFxuJiM0MztcdFx0XHRcdFx0XHQgICAgIHdvcmspO1xuJiM0MztcdGJwZl9jYWxsYmFja190IGNhbGxiYWNrX2ZuO1xuJiM0MztcdHZvaWQgKnZhbHVlID0gY3R4LVx1MDAzZXZhbHVlO1xuJiM0MztcdHN0cnVjdCBicGZfbWFwICptYXAgPSBjdHgtXHUwMDNlbWFwO1xuJiM0MztcdHZvaWQgKmtleTtcbiYjNDM7XHR1MzIgaWR4O1xuJiM0MztcbiYjNDM7XHRCVEZfVFlQRV9FTUlUKHN0cnVjdCBicGZfdGhyZWFkX3dxKTtcbiYjNDM7XG4mIzQzO1x0Y2FsbGJhY2tfZm4gPSBSRUFEX09OQ0UoY3R4LVx1MDAzZWNhbGxiYWNrX2ZuKTtcbiYjNDM7XHRpZiAoIWNhbGxiYWNrX2ZuKVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1x0a2V5ID0gbWFwX2tleV9mcm9tX3ZhbHVlKG1hcCwgdmFsdWUsIFx1MDAyNmlkeCk7XG4mIzQzO1xuJiM0MztcdHJjdV9yZWFkX2xvY2tfdHJhY2UoKTtcbiYjNDM7XHRtaWdyYXRlX2Rpc2FibGUoKTtcbiYjNDM7XG4mIzQzO1x0Y2FsbGJhY2tfZm4gPSBSRUFEX09OQ0UoY3R4LVx1MDAzZWNhbGxiYWNrX2ZuKTtcbiYjNDM7XHRpZiAoY2FsbGJhY2tfZm4pXG4mIzQzO1x0XHRjYWxsYmFja19mbigodTY0KShsb25nKW1hcCwgKHU2NCkobG9uZylrZXksICh1NjQpKGxvbmcpdmFsdWUsXG4mIzQzO1x0XHRcdCAgICAwLCAwKTtcbiYjNDM7XG4mIzQzO1x0bWlncmF0ZV9lbmFibGUoKTtcbiYjNDM7XHRyY3VfcmVhZF91bmxvY2tfdHJhY2UoKTtcbiYjNDM7XG4mIzQzO291dDpcbiYjNDM7XHRicGZfdGhyZWFkX3dxX2N0eF9wdXQoY3R4KTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LypcbiYjNDM7ICogYnBmX3RocmVhZF93cV9pbml0KCkgY3JlYXRlcyBhIGt0aHJlYWQgd29ya2VyIGFuZCBtYXkgYXR0YWNoIGl0IHRvIGEgY2dyb3VwLlxuJiM0MzsgKiBUaGUgaGVscGVycyB1c2VkIGhlcmUgY2FuIHNsZWVwIGFuZCBhY3F1aXJlIHNldmVyYWwgbG9ja3MgdGhyb3VnaCBrdGhyZWFkXG4mIzQzOyAqIGNyZWF0aW9uL2Rlc3RydWN0aW9uLCBjZ3JvdXAgbG9va3VwIGFuZCBjZ3JvdXAga3RocmVhZCBhdHRhY2htZW50LiBLZWVwIHRoaXNcbiYjNDM7ICoga2Z1bmMgYXZhaWxhYmxlIG9ubHkgdG8gQlBGX1BST0dfVFlQRV9TWVNDQUxMIHByb2dyYW1zIHNvIGl0IGlzIG5vdCBpbnZva2VkXG4mIzQzOyAqIGZyb20gQlBGIHByb2dyYW0gY29udGV4dHMgdGhhdCBhbHJlYWR5IGhvbGQgbG9ja3Mgd2hpY2ggY291bGQgZGVhZGxvY2sgd2l0aFxuJiM0MzsgKiB0aG9zZSBwYXRocy5cbiYjNDM7ICovXG4mIzQzO19fYnBmX2tmdW5jIGludCBicGZfdGhyZWFkX3dxX2luaXQoc3RydWN0IGJwZl90aHJlYWRfd3EgKnR3cSwgdm9pZCAqcF9fbWFwLFxuJiM0MztcdFx0XHRcdCAgIHU2NCBjZ3JvdXBfaWQsIHVuc2lnbmVkIGludCBmbGFncylcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBicGZfdGhyZWFkX3dxX2tlcm4gKnR3ayA9IChzdHJ1Y3QgYnBmX3RocmVhZF93cV9rZXJuICopdHdxO1xuJiM0MztcdHN0cnVjdCBicGZfbWFwICptYXAgPSBwX19tYXA7XG4mIzQzO1x0c3RydWN0IGJwZl90aHJlYWRfd3FfY3R4ICpjdHgsICpvbGRfY3R4O1xuJiM0MztcdHN0cnVjdCBrdGhyZWFkX3dvcmtlciAqd29ya2VyO1xuJiM0MztcdHN0cnVjdCBjZ3JvdXAgKmNncnAgPSBOVUxMO1xuJiM0MztcdHZvaWQgKnZhbHVlO1xuJiM0MztcdHUzMiBlbGVtX2lkO1xuJiM0MztcdGludCBlcnI7XG4mIzQzO1xuJiM0MztcdEJVSUxEX0JVR19PTihzaXplb2Yoc3RydWN0IGJwZl90aHJlYWRfd3Ffa2VybilcbiYjNDM7XHRcdFx0XHUwMDNlIHNpemVvZihzdHJ1Y3QgYnBmX3RocmVhZF93cSkpO1xuJiM0MztcdEJVSUxEX0JVR19PTihfX2FsaWdub2ZfXyhzdHJ1Y3QgYnBmX3RocmVhZF93cV9rZXJuKVxuJiM0MztcdFx0XHQhPSBfX2FsaWdub2ZfXyhzdHJ1Y3QgYnBmX3RocmVhZF93cSkpO1xuJiM0MztcbiYjNDM7XHRpZiAoZmxhZ3MpXG4mIzQzO1x0XHRyZXR1cm4gLUVJTlZBTDtcbiYjNDM7XG4mIzQzO1x0b2xkX2N0eCA9IFJFQURfT05DRSh0d2stXHUwMDNlY3R4KTtcbiYjNDM7XHRpZiAob2xkX2N0eClcbiYjNDM7XHRcdHJldHVybiAtRUJVU1k7XG4mIzQzO1xuJiM0MztcdHZhbHVlID0gKHZvaWQgKil0d3EgLSBtYXAtXHUwMDNlcmVjb3JkLVx1MDAzZXRocmVhZF93cV9vZmY7XG4mIzQzO1x0ZWxlbV9pZCA9IGJwZl9tYXBfZWxlbV9pZF9mcm9tX3ZhbHVlKG1hcCwgdmFsdWUpO1xuJiM0MztcdHdvcmtlciA9IGt0aHJlYWRfcnVuX3dvcmtlcigwLCBcJiMzNDticGZfdHdxLyVkLyV4XCYjMzQ7LCBtYXAtXHUwMDNlaWQsIGVsZW1faWQpO1xuJiM0MztcdGlmIChJU19FUlIod29ya2VyKSlcbiYjNDM7XHRcdHJldHVybiBQVFJfRVJSKHdvcmtlcik7XG4mIzQzO1xuJiM0MztcdC8qIFNldHVwIGN0eC4gKi9cbiYjNDM7XHRjdHggPSBicGZfbWFwX2ttYWxsb2Nfbm9sb2NrKG1hcCwgc2l6ZW9mKCpjdHgpLCBHRlBfS0VSTkVMLFxuJiM0MztcdFx0XHRcdCAgICAgbWFwLVx1MDAzZW51bWFfbm9kZSk7XG4mIzQzO1x0aWYgKCFjdHgpIHtcbiYjNDM7XHRcdGVyciA9IC1FTk9NRU07XG4mIzQzO1x0XHRnb3RvIGRlc3Ryb3lfd29ya2VyO1xuJiM0MztcdH1cbiYjNDM7XHRtZW1zZXQoY3R4LCAwLCBzaXplb2YoKmN0eCkpO1xuJiM0MztcdGN0eC1cdTAwM2V3b3JrZXIgPSB3b3JrZXI7XG4mIzQzO1x0Y3R4LVx1MDAzZW1hcCA9IG1hcDtcbiYjNDM7XHRjdHgtXHUwMDNldmFsdWUgPSB2YWx1ZTtcbiYjNDM7XHRyZWZjb3VudF9zZXQoXHUwMDI2Y3R4LVx1MDAzZXJlZmNudCwgMSk7XG4mIzQzO1x0a3RocmVhZF9pbml0X3dvcmsoXHUwMDI2Y3R4LVx1MDAzZXdvcmssIGJwZl90aHJlYWRfd3Ffd29ya19mbik7XG4mIzQzO1xuJiM0MztcdGlmIChjZ3JvdXBfaWQpIHtcbiYjNDM7I2lmZGVmIENPTkZJR19DR1JPVVBTXG4mIzQzO1x0XHRjZ3JwID0gY2dyb3VwX2dldF9mcm9tX2lkKGNncm91cF9pZCk7XG4mIzQzO1x0XHRpZiAoSVNfRVJSKGNncnApKSB7XG4mIzQzO1x0XHRcdGVyciA9IFBUUl9FUlIoY2dycCk7XG4mIzQzO1x0XHRcdGdvdG8ga2ZyZWVfY3R4O1xuJiM0MztcdFx0fVxuJiM0MztcdFx0Y3R4LVx1MDAzZWNncnAgPSBjZ3JwO1xuJiM0MztcbiYjNDM7XHRcdC8qXG4mIzQzO1x0XHQgKiBrdGhyZWFkX3J1bl93b3JrZXIoKSB3YWtlcyB0aGUga3RocmVhZCwgYnV0IGl0IG1heSBub3QgaGF2ZVxuJiM0MztcdFx0ICogZXhlY3V0ZWQgY2dyb3VwX2t0aHJlYWRfcmVhZHkoKSB5ZXQsIHdoaWNoIGNsZWFyc1xuJiM0MztcdFx0ICogbm9fY2dyb3VwX21pZ3JhdGlvbi5cbiYjNDM7XHRcdCAqIERvIGEgcXVldWUgd29yayBhbmQgZmx1c2ggdG8gd2FpdCB0aGUga3RocmVhZCBydW4uXG4mIzQzO1x0XHQgKi9cbiYjNDM7XHRcdHJlZmNvdW50X2luYyhcdTAwMjZjdHgtXHUwMDNlcmVmY250KTtcbiYjNDM7XHRcdGlmICgha3RocmVhZF9xdWV1ZV93b3JrKGN0eC1cdTAwM2V3b3JrZXIsIFx1MDAyNmN0eC1cdTAwM2V3b3JrKSkge1xuJiM0MztcdFx0XHRyZWZjb3VudF9kZWMoXHUwMDI2Y3R4LVx1MDAzZXJlZmNudCk7XG4mIzQzO1x0XHRcdGVyciA9IC1FQlVTWTtcbiYjNDM7XHRcdFx0Z290byBjZ3JvdXBfcHV0O1xuJiM0MztcdFx0fVxuJiM0MztcdFx0a3RocmVhZF9mbHVzaF93b3JrKFx1MDAyNmN0eC1cdTAwM2V3b3JrKTtcbiYjNDM7XG4mIzQzO1x0XHRpZiAod29ya2VyLVx1MDAzZXRhc2stXHUwMDNlbm9fY2dyb3VwX21pZ3JhdGlvbikge1xuJiM0MztcdFx0XHRlcnIgPSAtRUFHQUlOO1xuJiM0MztcdFx0XHRnb3RvIGNncm91cF9wdXQ7XG4mIzQzO1x0XHR9XG4mIzQzO1xuJiM0MztcdFx0ZXJyID0gY2dyb3VwX2t0aHJlYWRfYXR0YWNoKGNncnAsIHdvcmtlci1cdTAwM2V0YXNrKTtcbiYjNDM7XHRcdGlmIChlcnIpXG4mIzQzO1x0XHRcdGdvdG8gY2dyb3VwX3B1dDtcbiYjNDM7I2Vsc2VcbiYjNDM7XHRcdGVyciA9IC1FT1BOT1RTVVBQO1xuJiM0MztcdFx0Z290byBrZnJlZV9jdHg7XG4mIzQzOyNlbmRpZlxuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0b2xkX2N0eCA9IGNtcHhjaGcoXHUwMDI2dHdrLVx1MDAzZWN0eCwgTlVMTCwgY3R4KTtcbiYjNDM7XHRpZiAob2xkX2N0eCkge1xuJiM0MztcdFx0ZXJyID0gLUVCVVNZO1xuJiM0MztcdFx0Z290byBjZ3JvdXBfcHV0O1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0LypcbiYjNDM7XHQgKiBQYWlyZWQgd2l0aCB0aGUgbWFwIGRlc3RydWN0aW9uIHBhdGguICBFbnN1cmVzIHRoYXQgY3R4IGlzIGdsb2JhbGx5XG4mIzQzO1x0ICogdmlzaWJsZSBiZWZvcmUgd2UgY2hlY2sgbWFwLVx1MDAzZXVzZXJjbnQuXG4mIzQzO1x0ICogSWYgdXNlcmNudCBoYXMgZHJvcHBlZCB0byB6ZXJvLCB0aGUgZGVzdHJ1Y3Rpb24gcGF0aCB3aWxsIGVpdGhlciBzZWVcbiYjNDM7XHQgKiB0aGUgY3R4IChhbmQgY2FuY2VsIGl0KSBvciB3ZSBzZWUgdXNlcmNudCA9PSAwIGhlcmUgYW5kIGNhbmNlbFxuJiM0MztcdCAqIG91cnNlbHZlcy5cbiYjNDM7XHQgKiBXaXRob3V0IHRoaXMgYmFycmllciwgYSBDUFUgY291bGQgcmVvcmRlciB0aGUgbG9hZCBvZiB1c2VyY250IGJlZm9yZVxuJiM0MztcdCAqIHRoZSBjbXB4Y2hnIHN0b3JlIGJlY29tZXMgdmlzaWJsZSwgYnJlYWtpbmcgdGhlIG11dHVhbCBleGNsdXNpb25cbiYjNDM7XHQgKiBndWFyYW50ZWUuXG4mIzQzO1x0ICovXG4mIzQzO1x0c21wX21iKCk7XG4mIzQzO1xuJiM0MztcdGlmICghYXRvbWljNjRfcmVhZChcdTAwMjZtYXAtXHUwMDNldXNlcmNudCkpIHtcbiYjNDM7XHRcdGJwZl90aHJlYWRfd3FfY2FuY2VsX2FuZF9mcmVlKHR3cSk7XG4mIzQzO1x0XHRyZXR1cm4gLUVQRVJNO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0cmV0dXJuIDA7XG4mIzQzO1xuJiM0MztjZ3JvdXBfcHV0OlxuJiM0MzsjaWZkZWYgQ09ORklHX0NHUk9VUFNcbiYjNDM7XHRpZiAoY2dycClcbiYjNDM7XHRcdGNncm91cF9wdXQoY2dycCk7XG4mIzQzOyNlbmRpZlxuJiM0MztrZnJlZV9jdHg6XG4mIzQzO1x0LypcbiYjNDM7XHQgKiBOb3QgdXNlIGJwZl90aHJlYWRfd3FfY3R4X3B1dCBiZWNhdXNlIGN0eCBoYXMgbm90IHlldCBlbnRlcmVkXG4mIzQzO1x0ICogdGhlIHJ1bm5pbmcgc3RhdGUuXG4mIzQzO1x0ICovXG4mIzQzO1x0a2ZyZWUoY3R4KTtcbiYjNDM7ZGVzdHJveV93b3JrZXI6XG4mIzQzO1x0a3RocmVhZF9kZXN0cm95X3dvcmtlcih3b3JrZXIpO1xuJiM0MztcdHJldHVybiBlcnI7XG4mIzQzO31cbiYjNDM7XG4mIzQzO19fYnBmX2tmdW5jIGludCBicGZfdGhyZWFkX3dxX3NldF9jYWxsYmFjayhzdHJ1Y3QgYnBmX3RocmVhZF93cSAqdHdxLFxuJiM0MztcdFx0XHRcdFx0ICAgaW50IChjYWxsYmFja19mbikodm9pZCAqbWFwLFxuJiM0MztcdFx0XHRcdFx0XHRcdCAgICAgaW50ICprZXksXG4mIzQzO1x0XHRcdFx0XHRcdFx0ICAgICB2b2lkICp2YWx1ZSksXG4mIzQzO1x0XHRcdFx0XHQgICB1bnNpZ25lZCBpbnQgZmxhZ3MsXG4mIzQzO1x0XHRcdFx0XHQgICBzdHJ1Y3QgYnBmX3Byb2dfYXV4ICphdXgpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgYnBmX3RocmVhZF93cV9rZXJuICp0d2sgPSAoc3RydWN0IGJwZl90aHJlYWRfd3Ffa2VybiAqKXR3cTtcbiYjNDM7XHRzdHJ1Y3QgYnBmX3RocmVhZF93cV9jdHggKmN0eDtcbiYjNDM7XHRzdHJ1Y3QgYnBmX3Byb2cgKnByb2c7XG4mIzQzO1xuJiM0MztcdGlmIChmbGFncylcbiYjNDM7XHRcdHJldHVybiAtRUlOVkFMO1xuJiM0MztcbiYjNDM7XHRjdHggPSBSRUFEX09OQ0UodHdrLVx1MDAzZWN0eCk7XG4mIzQzO1x0aWYgKCFjdHgpXG4mIzQzO1x0XHRyZXR1cm4gLUVJTlZBTDtcbiYjNDM7XG4mIzQzO1x0cHJvZyA9IGJwZl9wcm9nX2luY19ub3RfemVybyhhdXgtXHUwMDNlcHJvZyk7XG4mIzQzO1x0aWYgKElTX0VSUihwcm9nKSlcbiYjNDM7XHRcdHJldHVybiBQVFJfRVJSKHByb2cpO1xuJiM0MztcbiYjNDM7XHQvKlxuJiM0MztcdCAqIEFsbG93IHNldF9jYWxsYmFjayBvbmx5IG9uY2UgdG8gcHJldmVudCBVQUY6IGEgY29uY3VycmVudFxuJiM0MztcdCAqIHNldF9jYWxsYmFjayBjb3VsZCBicGZfcHJvZ19wdXQoKSB0aGUgcHJvZyB3aGlsZSB0aGUgd29ya2VyXG4mIzQzO1x0ICoga3RocmVhZCBpcyBzdGlsbCBleGVjdXRpbmcgaXRzIGNhbGxiYWNrLlxuJiM0MztcdCAqL1xuJiM0MztcdGlmIChjbXB4Y2hnKFx1MDAyNmN0eC1cdTAwM2Vwcm9nLCBOVUxMLCBwcm9nKSAhPSBOVUxMKSB7XG4mIzQzO1x0XHRicGZfcHJvZ19wdXQocHJvZyk7XG4mIzQzO1x0XHRyZXR1cm4gLUVCVVNZO1xuJiM0MztcdH1cbiYjNDM7XHQvKlxuJiM0MztcdCAqIFNhZmUgdG8gc2V0IGNhbGxiYWNrX2ZuIGFmdGVyIHByb2c6IGJwZl90aHJlYWRfd3Ffc3RhcnQoKSBhbmRcbiYjNDM7XHQgKiBicGZfdGhyZWFkX3dxX3dvcmtfZm4oKSBib3RoIGNoZWNrIGNhbGxiYWNrX2ZuIHdpdGggUkVBRF9PTkNFKClcbiYjNDM7XHQgKiBhbmQgYmFpbCBvdXQgaWYgaXQgaXMgc3RpbGwgTlVMTC5cbiYjNDM7XHQgKi9cbiYjNDM7XHRXUklURV9PTkNFKGN0eC1cdTAwM2VjYWxsYmFja19mbiwgKHZvaWQgKiljYWxsYmFja19mbik7XG4mIzQzO1xuJiM0MztcdHJldHVybiAwO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztfX2JwZl9rZnVuYyBpbnRcbiYjNDM7YnBmX3RocmVhZF93cV9zdGFydChzdHJ1Y3QgYnBmX3RocmVhZF93cSAqdHdxLCB1bnNpZ25lZCBpbnQgZmxhZ3MpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgYnBmX3RocmVhZF93cV9rZXJuICp0d2sgPSAoc3RydWN0IGJwZl90aHJlYWRfd3Ffa2VybiAqKXR3cTtcbiYjNDM7XHRzdHJ1Y3QgYnBmX3RocmVhZF93cV9jdHggKmN0eDtcbiYjNDM7XHRpbnQgZXJyO1xuJiM0MztcbiYjNDM7XHRpZiAoZmxhZ3MpXG4mIzQzO1x0XHRyZXR1cm4gLUVJTlZBTDtcbiYjNDM7XG4mIzQzO1x0cmN1X3JlYWRfbG9ja190cmFjZSgpO1xuJiM0MztcbiYjNDM7XHRlcnIgPSAwO1xuJiM0MztcbiYjNDM7XHRjdHggPSBSRUFEX09OQ0UodHdrLVx1MDAzZWN0eCk7XG4mIzQzO1x0aWYgKCFjdHggfHwgIVJFQURfT05DRShjdHgtXHUwMDNlY2FsbGJhY2tfZm4pKSB7XG4mIzQzO1x0XHRlcnIgPSAtRUlOVkFMO1xuJiM0MztcdFx0Z290byB1bmxvY2s7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRpZiAoIXJlZmNvdW50X2luY19ub3RfemVybyhcdTAwMjZjdHgtXHUwMDNlcmVmY250KSlcbiYjNDM7XHRcdGVyciA9IC1FTk9FTlQ7XG4mIzQzO1xuJiM0Mzt1bmxvY2s6XG4mIzQzO1x0cmN1X3JlYWRfdW5sb2NrX3RyYWNlKCk7XG4mIzQzO1x0aWYgKGVycilcbiYjNDM7XHRcdHJldHVybiBlcnI7XG4mIzQzO1xuJiM0MztcdGlmICgha3RocmVhZF9xdWV1ZV93b3JrKGN0eC1cdTAwM2V3b3JrZXIsIFx1MDAyNmN0eC1cdTAwM2V3b3JrKSkge1xuJiM0MztcdFx0YnBmX3RocmVhZF93cV9jdHhfcHV0KGN0eCk7XG4mIzQzO1x0XHRyZXR1cm4gLUVCVVNZO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0cmV0dXJuIDA7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3ZvaWQgYnBmX3RocmVhZF93cV9jYW5jZWxfYW5kX2ZyZWUodm9pZCAqdmFsKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IGJwZl90aHJlYWRfd3Ffa2VybiAqdHdrID0gdmFsO1xuJiM0MztcdHN0cnVjdCBicGZfdGhyZWFkX3dxX2N0eCAqY3R4O1xuJiM0MztcbiYjNDM7XHRjdHggPSB4Y2hnKFx1MDAyNnR3ay1cdTAwM2VjdHgsIE5VTEwpO1xuJiM0MztcdGlmICghY3R4KVxuJiM0MztcdFx0cmV0dXJuO1xuJiM0MztcbiYjNDM7XHRtaWdodF9zbGVlcCgpO1xuJiM0MztcbiYjNDM7XHQvKlxuJiM0MztcdCAqIFByZXZlbnQgZnV0dXJlIGNhbGxiYWNrcyBmcm9tIHJ1bm5pbmcgYW5kIHdhaXQgZm9yIGFueVxuJiM0MztcdCAqIGluLXByb2dyZXNzIGV4ZWN1dGlvbiB0byBmaW5pc2guXG4mIzQzO1x0ICovXG4mIzQzO1x0V1JJVEVfT05DRShjdHgtXHUwMDNlY2FsbGJhY2tfZm4sIE5VTEwpO1xuJiM0MztcdC8qXG4mIzQzO1x0ICoga3RocmVhZF9jYW5jZWxfd29ya19zeW5jKCkgcmV0dXJucyB0cnVlIHdoZW4gaXQgZGVxdWV1ZXMgYSBwZW5kaW5nXG4mIzQzO1x0ICogd29yayBpdGVtIGZyb20gdGhlIHdvcmtfbGlzdCB3aXRob3V0IGV4ZWN1dGluZyBpdC4gIEVhY2ggc3VjY2Vzc2Z1bFxuJiM0MztcdCAqIGJwZl90aHJlYWRfd3Ffc3RhcnQoKSBjYWxsIGluY3JlbWVudHMgY3R4LVx1MDAzZXJlZmNudCBhbmQgcmVsaWVzIG9uIHRoZVxuJiM0MztcdCAqIHN1YnNlcXVlbnQgYnBmX3RocmVhZF93cV93b3JrX2ZuKCkgZXhlY3V0aW9uIHRvIHJlbGVhc2UgdGhhdFxuJiM0MztcdCAqIHJlZmVyZW5jZSB2aWEgYnBmX3RocmVhZF93cV9jdHhfcHV0KCkuICBJZiB0aGUgd29yayB3YXMgcGVuZGluZyBhbmRcbiYjNDM7XHQgKiBnb3QgY2FuY2VsbGVkIGhlcmUsIHdvcmtfZm4gd2lsbCBuZXZlciBydW4gZm9yIHRoYXQgcXVldWVkIGluc3RhbmNlLFxuJiM0MztcdCAqIHNvIHdlIG11c3QgZHJvcCB0aGUgcmVmZXJlbmNlIG91cnNlbHZlcyB0byBhdm9pZCBhIHBlcm1hbmVudCByZWZjb3VudFxuJiM0MztcdCAqIGxlYWsuXG4mIzQzO1x0ICpcbiYjNDM7XHQgKiBUaGlzIGNvdmVycyB0d28gc2NlbmFyaW9zIHVuaWZvcm1seTpcbiYjNDM7XHQgKiAgMS4gVGhlIHdvcmsgaXMgcHVyZWx5IHBlbmRpbmcgKG5vdCBjdXJyZW50bHkgZXhlY3V0aW5nKSAtIGUuZy4gYVxuJiM0MztcdCAqICAgICBub3JtYWwgYnBmX3RocmVhZF93cV9zdGFydCgpIGNhbGwgcXVldWVkIGl0IGJ1dCB0aGUgd29ya2VyXG4mIzQzO1x0ICogICAgIHRocmVhZCBoYXNuJiMzOTt0IHBpY2tlZCBpdCB1cCB5ZXQuXG4mIzQzO1x0ICogIDIuIFRoZSB3b3JrIGlzIGN1cnJlbnRseSBpbi1mbGlnaHQgQU5EIHdhcyBzZWxmLXJlc2NoZWR1bGVkIGZyb21cbiYjNDM7XHQgKiAgICAgd2l0aGluIHRoZSBjYWxsYmFjayAtIGt0aHJlYWRfY2FuY2VsX3dvcmtfc3luYygpIGRlcXVldWVzIHRoZVxuJiM0MztcdCAqICAgICByZS1xdWV1ZWQgcGVuZGluZyBub2RlIGFuZCB0aGVuIHdhaXRzIGZvciB0aGUgaW4tZmxpZ2h0XG4mIzQzO1x0ICogICAgIGV4ZWN1dGlvbiB0byBjb21wbGV0ZS5cbiYjNDM7XHQgKiBJbiBib3RoIGNhc2VzIHRoZSByZXR1cm4gdmFsdWUgaXMgdHJ1ZSwgaW5kaWNhdGluZyBvbmUgb3JwaGFuZWRcbiYjNDM7XHQgKiByZWZlcmVuY2UgdGhhdCBuZWVkcyB0byBiZSByZWxlYXNlZCBoZXJlLlxuJiM0MztcdCAqL1xuJiM0MztcdGlmIChrdGhyZWFkX2NhbmNlbF93b3JrX3N5bmMoXHUwMDI2Y3R4LVx1MDAzZXdvcmspKVxuJiM0MztcdFx0YnBmX3RocmVhZF93cV9jdHhfcHV0KGN0eCk7XG4mIzQzO1xuJiM0MztcdC8qXG4mIzQzO1x0ICogRHJvcCBvdXIgb3duIHJlZmVyZW5jZS4gIElmIHRoZSB3b3JrIHdhcyBzdGlsbCBpbi1mbGlnaHQgYWJvdmUsXG4mIzQzO1x0ICogdGhlIHJlZmNvdW50IHdvbiYjMzk7dCBoaXQgemVybyBoZXJlIC0gaXQgd2lsbCByZWFjaCB6ZXJvIHdoZW4gdGhlXG4mIzQzO1x0ICogd29yayBwYXRoIGNhbGxzIGJwZl90aHJlYWRfd3FfY3R4X3B1dCgpIHVwb24gY29tcGxldGlvbi4gIEVpdGhlclxuJiM0MztcdCAqIHdheSwgZmluYWwgY2xlYW51cCAod29ya2VyIGRlc3RydWN0aW9uLCBwcm9nIHB1dCwgY2dyb3VwIHB1dCxcbiYjNDM7XHQgKiBrZnJlZSkgaGFwcGVucyBleGNsdXNpdmVseSBpbiB0aGUgUkNVIGNhbGxiYWNrIHRvIGtlZXAgdGhlXG4mIzQzO1x0ICogdGVhcmRvd24gcGF0aCBzaW5nbGUtdGhyZWFkZWQuXG4mIzQzO1x0ICovXG4mIzQzO1x0YnBmX3RocmVhZF93cV9jdHhfcHV0KGN0eCk7XG4mIzQzO31cbiYjNDM7XG4gX19icGZfa2Z1bmNfZW5kX2RlZnMoKTtcbiBcbiBzdGF0aWMgdm9pZCBicGZfdGFza193b3JrX2NhbmNlbF9zY2hlZHVsZWQoc3RydWN0IGlycV93b3JrICppcnFfd29yaylcbkBAIC00OTE3LDYgJiM0Mzs1MzIxLDggQEAgQlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9tb2RpZnlfcmV0dXJuX3Rlc3RfdHApXG4gQlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl93cV9pbml0KVxuIEJURl9JRF9GTEFHUyhmdW5jLCBicGZfd3Ffc2V0X2NhbGxiYWNrLCBLRl9JTVBMSUNJVF9BUkdTKVxuIEJURl9JRF9GTEFHUyhmdW5jLCBicGZfd3Ffc3RhcnQpXG4mIzQzO0JURl9JRF9GTEFHUyhmdW5jLCBicGZfdGhyZWFkX3dxX3NldF9jYWxsYmFjaywgS0ZfSU1QTElDSVRfQVJHUylcbiYjNDM7QlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl90aHJlYWRfd3Ffc3RhcnQpXG4gQlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9wcmVlbXB0X2Rpc2FibGUpXG4gQlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9wcmVlbXB0X2VuYWJsZSlcbiBCVEZfSURfRkxBR1MoZnVuYywgYnBmX2l0ZXJfYml0c19uZXcsIEtGX0lURVJfTkVXKVxuQEAgLTQ5NzgsNiAmIzQzOzUzODQsMTUgQEAgc3RhdGljIGNvbnN0IHN0cnVjdCBidGZfa2Z1bmNfaWRfc2V0IGNvbW1vbl9rZnVuY19zZXQgPSB7XG4gXHQuc2V0ICAgPSBcdTAwMjZjb21tb25fYnRmX2lkcyxcbiB9O1xuIFxuJiM0MztCVEZfS0ZVTkNTX1NUQVJUKHN5c2NhbGxfYnRmX2lkcylcbiYjNDM7QlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl90aHJlYWRfd3FfaW5pdCwgS0ZfU0xFRVBBQkxFKVxuJiM0MztCVEZfS0ZVTkNTX0VORChzeXNjYWxsX2J0Zl9pZHMpXG4mIzQzO1xuJiM0MztzdGF0aWMgY29uc3Qgc3RydWN0IGJ0Zl9rZnVuY19pZF9zZXQgc3lzY2FsbF9rZnVuY19zZXQgPSB7XG4mIzQzO1x0Lm93bmVyID0gVEhJU19NT0RVTEUsXG4mIzQzO1x0LnNldCAgID0gXHUwMDI2c3lzY2FsbF9idGZfaWRzLFxuJiM0Mzt9O1xuJiM0MztcbiBzdGF0aWMgaW50IF9faW5pdCBrZnVuY19pbml0KHZvaWQpXG4ge1xuIFx0aW50IHJldDtcbkBAIC01MDAwLDYgJiM0Mzs1NDE1LDcgQEAgc3RhdGljIGludCBfX2luaXQga2Z1bmNfaW5pdCh2b2lkKVxuIFx0cmV0ID0gcmV0ID86IHJlZ2lzdGVyX2J0Zl9rZnVuY19pZF9zZXQoQlBGX1BST0dfVFlQRV9TVFJVQ1RfT1BTLCBcdTAwMjZnZW5lcmljX2tmdW5jX3NldCk7XG4gXHRyZXQgPSByZXQgPzogcmVnaXN0ZXJfYnRmX2tmdW5jX2lkX3NldChCUEZfUFJPR19UWVBFX1NZU0NBTEwsIFx1MDAyNmdlbmVyaWNfa2Z1bmNfc2V0KTtcbiBcdHJldCA9IHJldCA/OiByZWdpc3Rlcl9idGZfa2Z1bmNfaWRfc2V0KEJQRl9QUk9HX1RZUEVfQ0dST1VQX1NLQiwgXHUwMDI2Z2VuZXJpY19rZnVuY19zZXQpO1xuJiM0MztcdHJldCA9IHJldCA/OiByZWdpc3Rlcl9idGZfa2Z1bmNfaWRfc2V0KEJQRl9QUk9HX1RZUEVfU1lTQ0FMTCwgXHUwMDI2c3lzY2FsbF9rZnVuY19zZXQpO1xuIFx0cmV0ID0gcmV0ID86IHJlZ2lzdGVyX2J0Zl9pZF9kdG9yX2tmdW5jcyhnZW5lcmljX2R0b3JzLFxuIFx0XHRcdFx0XHRcdCAgQVJSQVlfU0laRShnZW5lcmljX2R0b3JzKSxcbiBcdFx0XHRcdFx0XHQgIFRISVNfTU9EVUxFKTtcbkBAIC01MDM3LDQgJiM0Mzs1NDUzLDYgQEAgdm9pZCBicGZfbWFwX2ZyZWVfaW50ZXJuYWxfc3RydWN0cyhzdHJ1Y3QgYnBmX21hcCAqbWFwLCB2b2lkICp2YWwpXG4gXHRcdGJwZl9vYmpfZnJlZV93b3JrcXVldWUobWFwLVx1MDAzZXJlY29yZCwgdmFsKTtcbiBcdGlmIChidGZfcmVjb3JkX2hhc19maWVsZChtYXAtXHUwMDNlcmVjb3JkLCBCUEZfVEFTS19XT1JLKSlcbiBcdFx0YnBmX29ial9mcmVlX3Rhc2tfd29yayhtYXAtXHUwMDNlcmVjb3JkLCB2YWwpO1xuJiM0MztcdGlmIChidGZfcmVjb3JkX2hhc19maWVsZChtYXAtXHUwMDNlcmVjb3JkLCBCUEZfVEhSRUFEX1dRKSlcbiYjNDM7XHRcdGJwZl9vYmpfZnJlZV90aHJlYWRfd3EobWFwLVx1MDAzZXJlY29yZCwgdmFsKTtcbiB9XG5kaWZmIC0tZ2l0IGEva2VybmVsL2JwZi9zeXNjYWxsLmMgYi9rZXJuZWwvYnBmL3N5c2NhbGwuY1xuaW5kZXggOGQxMTFkYTg4NjU1My4uZGVhMTQ4MjNiYWNkMiAxMDA2NDRcbi0tLSBhL2tlcm5lbC9icGYvc3lzY2FsbC5jXG4mIzQzOyYjNDM7JiM0MzsgYi9rZXJuZWwvYnBmL3N5c2NhbGwuY1xuQEAgLTY4OCw2ICYjNDM7Njg4LDcgQEAgdm9pZCBidGZfcmVjb3JkX2ZyZWUoc3RydWN0IGJ0Zl9yZWNvcmQgKnJlYylcbiBcdFx0Y2FzZSBCUEZfUkVGQ09VTlQ6XG4gXHRcdGNhc2UgQlBGX1dPUktRVUVVRTpcbiBcdFx0Y2FzZSBCUEZfVEFTS19XT1JLOlxuJiM0MztcdFx0Y2FzZSBCUEZfVEhSRUFEX1dROlxuIFx0XHRcdC8qIE5vdGhpbmcgdG8gcmVsZWFzZSAqL1xuIFx0XHRcdGJyZWFrO1xuIFx0XHRkZWZhdWx0OlxuQEAgLTc0Miw2ICYjNDM7NzQzLDcgQEAgc3RydWN0IGJ0Zl9yZWNvcmQgKmJ0Zl9yZWNvcmRfZHVwKGNvbnN0IHN0cnVjdCBidGZfcmVjb3JkICpyZWMpXG4gXHRcdGNhc2UgQlBGX1JFRkNPVU5UOlxuIFx0XHRjYXNlIEJQRl9XT1JLUVVFVUU6XG4gXHRcdGNhc2UgQlBGX1RBU0tfV09SSzpcbiYjNDM7XHRcdGNhc2UgQlBGX1RIUkVBRF9XUTpcbiBcdFx0XHQvKiBOb3RoaW5nIHRvIGFjcXVpcmUgKi9cbiBcdFx0XHRicmVhaztcbiBcdFx0ZGVmYXVsdDpcbkBAIC04MDcsNiAmIzQzOzgwOSwxMyBAQCB2b2lkIGJwZl9vYmpfZnJlZV90YXNrX3dvcmsoY29uc3Qgc3RydWN0IGJ0Zl9yZWNvcmQgKnJlYywgdm9pZCAqb2JqKVxuIFx0YnBmX3Rhc2tfd29ya19jYW5jZWxfYW5kX2ZyZWUob2JqICYjNDM7IHJlYy1cdTAwM2V0YXNrX3dvcmtfb2ZmKTtcbiB9XG4gXG4mIzQzO3ZvaWQgYnBmX29ial9mcmVlX3RocmVhZF93cShjb25zdCBzdHJ1Y3QgYnRmX3JlY29yZCAqcmVjLCB2b2lkICpvYmopXG4mIzQzO3tcbiYjNDM7XHRpZiAoV0FSTl9PTl9PTkNFKCFidGZfcmVjb3JkX2hhc19maWVsZChyZWMsIEJQRl9USFJFQURfV1EpKSlcbiYjNDM7XHRcdHJldHVybjtcbiYjNDM7XHRicGZfdGhyZWFkX3dxX2NhbmNlbF9hbmRfZnJlZShvYmogJiM0MzsgcmVjLVx1MDAzZXRocmVhZF93cV9vZmYpO1xuJiM0Mzt9XG4mIzQzO1xuIHZvaWQgYnBmX29ial9jYW5jZWxfZmllbGRzKHN0cnVjdCBicGZfbWFwICptYXAsIHZvaWQgKm9iailcbiB7XG4gXHRicGZfbWFwX2ZyZWVfaW50ZXJuYWxfc3RydWN0cyhtYXAsIG9iaik7XG5AQCAtODM5LDYgJiM0Mzs4NDgsOSBAQCB2b2lkIGJwZl9vYmpfZnJlZV9maWVsZHMoY29uc3Qgc3RydWN0IGJ0Zl9yZWNvcmQgKnJlYywgdm9pZCAqb2JqKVxuIFx0XHRjYXNlIEJQRl9UQVNLX1dPUks6XG4gXHRcdFx0YnBmX3Rhc2tfd29ya19jYW5jZWxfYW5kX2ZyZWUoZmllbGRfcHRyKTtcbiBcdFx0XHRicmVhaztcbiYjNDM7XHRcdGNhc2UgQlBGX1RIUkVBRF9XUTpcbiYjNDM7XHRcdFx0YnBmX3RocmVhZF93cV9jYW5jZWxfYW5kX2ZyZWUoZmllbGRfcHRyKTtcbiYjNDM7XHRcdFx0YnJlYWs7XG4gXHRcdGNhc2UgQlBGX0tQVFJfVU5SRUY6XG4gXHRcdFx0V1JJVEVfT05DRSgqKHU2NCAqKWZpZWxkX3B0ciwgMCk7XG4gXHRcdFx0YnJlYWs7XG5AQCAtMTI2NSw3ICYjNDM7MTI3Nyw3IEBAIHN0YXRpYyBpbnQgbWFwX2NoZWNrX2J0ZihzdHJ1Y3QgYnBmX21hcCAqbWFwLCBzdHJ1Y3QgYnBmX3Rva2VuICp0b2tlbixcbiBcdG1hcC1cdTAwM2VyZWNvcmQgPSBidGZfcGFyc2VfZmllbGRzKGJ0ZiwgdmFsdWVfdHlwZSxcbiBcdFx0XHRcdCAgICAgICBCUEZfU1BJTl9MT0NLIHwgQlBGX1JFU19TUElOX0xPQ0sgfCBCUEZfVElNRVIgfCBCUEZfS1BUUiB8IEJQRl9MSVNUX0hFQUQgfFxuIFx0XHRcdFx0ICAgICAgIEJQRl9SQl9ST09UIHwgQlBGX1JFRkNPVU5UIHwgQlBGX1dPUktRVUVVRSB8IEJQRl9VUFRSIHxcbi1cdFx0XHRcdCAgICAgICBCUEZfVEFTS19XT1JLLFxuJiM0MztcdFx0XHRcdCAgICAgICBCUEZfVEFTS19XT1JLIHwgQlBGX1RIUkVBRF9XUSxcbiBcdFx0XHRcdCAgICAgICBtYXAtXHUwMDNldmFsdWVfc2l6ZSk7XG4gXHRpZiAoIUlTX0VSUl9PUl9OVUxMKG1hcC1cdTAwM2VyZWNvcmQpKSB7XG4gXHRcdGludCBpO1xuQEAgLTEyOTksNiAmIzQzOzEzMTEsNyBAQCBzdGF0aWMgaW50IG1hcF9jaGVja19idGYoc3RydWN0IGJwZl9tYXAgKm1hcCwgc3RydWN0IGJwZl90b2tlbiAqdG9rZW4sXG4gXHRcdFx0Y2FzZSBCUEZfVElNRVI6XG4gXHRcdFx0Y2FzZSBCUEZfV09SS1FVRVVFOlxuIFx0XHRcdGNhc2UgQlBGX1RBU0tfV09SSzpcbiYjNDM7XHRcdFx0Y2FzZSBCUEZfVEhSRUFEX1dROlxuIFx0XHRcdFx0aWYgKG1hcC1cdTAwM2VtYXBfdHlwZSAhPSBCUEZfTUFQX1RZUEVfSEFTSCBcdTAwMjZcdTAwMjZcbiBcdFx0XHRcdCAgICBtYXAtXHUwMDNlbWFwX3R5cGUgIT0gQlBGX01BUF9UWVBFX1JIQVNIIFx1MDAyNlx1MDAyNlxuIFx0XHRcdFx0ICAgIG1hcC1cdTAwM2VtYXBfdHlwZSAhPSBCUEZfTUFQX1RZUEVfTFJVX0hBU0ggXHUwMDI2XHUwMDI2XG5kaWZmIC0tZ2l0IGEva2VybmVsL2JwZi92ZXJpZmllci5jIGIva2VybmVsL2JwZi92ZXJpZmllci5jXG5pbmRleCBlNjIzM2MwMDgxZDEwLi40NGU3OWZlNDgwYjZiIDEwMDY0NFxuLS0tIGEva2VybmVsL2JwZi92ZXJpZmllci5jXG4mIzQzOyYjNDM7JiM0MzsgYi9rZXJuZWwvYnBmL3ZlcmlmaWVyLmNcbkBAIC00NzcsNiAmIzQzOzQ3Nyw3IEBAIHN0YXRpYyBib29sIGlzX2FzeW5jX2NhbGxiYWNrX2NhbGxpbmdfa2Z1bmModTMyIGJ0Zl9pZCk7XG4gc3RhdGljIGJvb2wgaXNfY2FsbGJhY2tfY2FsbGluZ19rZnVuYyh1MzIgYnRmX2lkKTtcbiBcbiBzdGF0aWMgYm9vbCBpc19icGZfd3Ffc2V0X2NhbGxiYWNrX2tmdW5jKHUzMiBidGZfaWQpO1xuJiM0MztzdGF0aWMgYm9vbCBpc19icGZfdGhyZWFkX3dxX3NldF9jYWxsYmFja19rZnVuYyh1MzIgYnRmX2lkKTtcbiBzdGF0aWMgYm9vbCBpc190YXNrX3dvcmtfYWRkX2tmdW5jKHUzMiBmdW5jX2lkKTtcbiBcbiBzdGF0aWMgYm9vbCBpc19zeW5jX2NhbGxiYWNrX2NhbGxpbmdfZnVuY3Rpb24oZW51bSBicGZfZnVuY19pZCBmdW5jX2lkKVxuQEAgLTUxNiw5ICYjNDM7NTE3LDExIEBAIHN0YXRpYyBib29sIGlzX2FzeW5jX2NiX3NsZWVwYWJsZShzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52LCBzdHJ1Y3QgYnBmX2luc25cbiBcdGlmIChicGZfaGVscGVyX2NhbGwoaW5zbikgXHUwMDI2XHUwMDI2IGluc24tXHUwMDNlaW1tID09IEJQRl9GVU5DX3RpbWVyX3NldF9jYWxsYmFjaylcbiBcdFx0cmV0dXJuIGZhbHNlO1xuIFxuLVx0LyogYnBmX3dxIGFuZCBicGZfdGFza193b3JrIGNhbGxiYWNrcyBhcmUgYWx3YXlzIHNsZWVwYWJsZS4gKi9cbiYjNDM7XHQvKiBicGZfd3EsIGJwZl90aHJlYWRfd3EgYW5kIGJwZl90YXNrX3dvcmsgY2FsbGJhY2tzIGFyZSBhbHdheXMgc2xlZXBhYmxlLiAqL1xuIFx0aWYgKGJwZl9wc2V1ZG9fa2Z1bmNfY2FsbChpbnNuKSBcdTAwMjZcdTAwMjYgaW5zbi1cdTAwM2VvZmYgPT0gMCBcdTAwMjZcdTAwMjZcbi1cdCAgICAoaXNfYnBmX3dxX3NldF9jYWxsYmFja19rZnVuYyhpbnNuLVx1MDAzZWltbSkgfHwgaXNfdGFza193b3JrX2FkZF9rZnVuYyhpbnNuLVx1MDAzZWltbSkpKVxuJiM0MztcdCAgICAoaXNfYnBmX3dxX3NldF9jYWxsYmFja19rZnVuYyhpbnNuLVx1MDAzZWltbSkgfHxcbiYjNDM7XHQgICAgIGlzX2JwZl90aHJlYWRfd3Ffc2V0X2NhbGxiYWNrX2tmdW5jKGluc24tXHUwMDNlaW1tKSB8fFxuJiM0MztcdCAgICAgaXNfdGFza193b3JrX2FkZF9rZnVuYyhpbnNuLVx1MDAzZWltbSkpKVxuIFx0XHRyZXR1cm4gdHJ1ZTtcbiBcbiBcdHZlcmlmaWVyX2J1ZyhlbnYsIFwmIzM0O3VuaGFuZGxlZCBhc3luYyBjYWxsYmFjayBpbiBpc19hc3luY19jYl9zbGVlcGFibGVcJiMzNDspO1xuQEAgLTE4NzEsNyAmIzQzOzE4NzQsMTAgQEAgc3RhdGljIHZvaWQgcmVmaW5lX21hcF9sb29rdXBfdmFsdWUoc3RydWN0IGJwZl9yZWdfc3RhdGUgKnJlZylcbiBcdFx0ICogYXMgVUlEIG9mIHRoZSBpbm5lciBtYXAuXG4gXHRcdCAqL1xuIFx0XHRpZiAoYnRmX3JlY29yZF9oYXNfZmllbGQobWFwLVx1MDAzZWlubmVyX21hcF9tZXRhLVx1MDAzZXJlY29yZCxcbi1cdFx0XHRcdFx0IEJQRl9USU1FUiB8IEJQRl9XT1JLUVVFVUUgfCBCUEZfVEFTS19XT1JLKSlcbiYjNDM7XHRcdFx0XHRcdCBCUEZfVElNRVIgfFxuJiM0MztcdFx0XHRcdFx0IEJQRl9XT1JLUVVFVUUgfFxuJiM0MztcdFx0XHRcdFx0IEJQRl9UQVNLX1dPUksgfFxuJiM0MztcdFx0XHRcdFx0IEJQRl9USFJFQURfV1EpKVxuIFx0XHRcdHJlZy1cdTAwM2VtYXBfdWlkID0gcmVnLVx1MDAzZWlkO1xuIFx0fSBlbHNlIGlmIChtYXAtXHUwMDNlbWFwX3R5cGUgPT0gQlBGX01BUF9UWVBFX1hTS01BUCkge1xuIFx0XHRyZWctXHUwMDNldHlwZSA9IFBUUl9UT19YRFBfU09DSyB8IG1heWJlX251bGw7XG5AQCAtNzI0Myw2ICYjNDM7NzI0OSw5IEBAIHN0YXRpYyBpbnQgY2hlY2tfbWFwX2ZpZWxkX3BvaW50ZXIoc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudiwgc3RydWN0IGJwZl9yZWdfXG4gXHRjYXNlIEJQRl9XT1JLUVVFVUU6XG4gXHRcdGZpZWxkX29mZiA9IG1hcC1cdTAwM2VyZWNvcmQtXHUwMDNld3Ffb2ZmO1xuIFx0XHRicmVhaztcbiYjNDM7XHRjYXNlIEJQRl9USFJFQURfV1E6XG4mIzQzO1x0XHRmaWVsZF9vZmYgPSBtYXAtXHUwMDNlcmVjb3JkLVx1MDAzZXRocmVhZF93cV9vZmY7XG4mIzQzO1x0XHRicmVhaztcbiBcdGRlZmF1bHQ6XG4gXHRcdHZlcmlmaWVyX2J1ZyhlbnYsIFwmIzM0O3Vuc3VwcG9ydGVkIEJURiBmaWVsZCB0eXBlOiAlc1xcblwmIzM0Oywgc3RydWN0X25hbWUpO1xuIFx0XHRyZXR1cm4gLUVJTlZBTDtcbkBAIC0xMDk0MCw2ICYjNDM7MTA5NDksNyBAQCBlbnVtIHtcbiBcdEtGX0FSR19XT1JLUVVFVUVfSUQsXG4gXHRLRl9BUkdfUkVTX1NQSU5fTE9DS19JRCxcbiBcdEtGX0FSR19UQVNLX1dPUktfSUQsXG4mIzQzO1x0S0ZfQVJHX1RIUkVBRF9XUV9JRCxcbiBcdEtGX0FSR19QUk9HX0FVWF9JRCxcbiBcdEtGX0FSR19USU1FUl9JRFxuIH07XG5AQCAtMTA5NTMsNiAmIzQzOzEwOTYzLDcgQEAgQlRGX0lEKHN0cnVjdCwgYnBmX3JiX25vZGUpXG4gQlRGX0lEKHN0cnVjdCwgYnBmX3dxKVxuIEJURl9JRChzdHJ1Y3QsIGJwZl9yZXNfc3Bpbl9sb2NrKVxuIEJURl9JRChzdHJ1Y3QsIGJwZl90YXNrX3dvcmspXG4mIzQzO0JURl9JRChzdHJ1Y3QsIGJwZl90aHJlYWRfd3EpXG4gQlRGX0lEKHN0cnVjdCwgYnBmX3Byb2dfYXV4KVxuIEJURl9JRChzdHJ1Y3QsIGJwZl90aW1lcilcbiBcbkBAIC0xMTAxMyw2ICYjNDM7MTEwMjQsMTEgQEAgc3RhdGljIGJvb2wgaXNfa2Z1bmNfYXJnX3Rhc2tfd29yayhjb25zdCBzdHJ1Y3QgYnRmICpidGYsIGNvbnN0IHN0cnVjdCBidGZfcGFyYW1cbiBcdHJldHVybiBfX2lzX2tmdW5jX3B0cl9hcmdfdHlwZShidGYsIGFyZywgS0ZfQVJHX1RBU0tfV09SS19JRCk7XG4gfVxuIFxuJiM0MztzdGF0aWMgYm9vbCBpc19rZnVuY19hcmdfdGhyZWFkX3dxKGNvbnN0IHN0cnVjdCBidGYgKmJ0ZiwgY29uc3Qgc3RydWN0IGJ0Zl9wYXJhbSAqYXJnKVxuJiM0Mzt7XG4mIzQzO1x0cmV0dXJuIF9faXNfa2Z1bmNfcHRyX2FyZ190eXBlKGJ0ZiwgYXJnLCBLRl9BUkdfVEhSRUFEX1dRX0lEKTtcbiYjNDM7fVxuJiM0MztcbiBzdGF0aWMgYm9vbCBpc19rZnVuY19hcmdfcmVzX3NwaW5fbG9jayhjb25zdCBzdHJ1Y3QgYnRmICpidGYsIGNvbnN0IHN0cnVjdCBidGZfcGFyYW0gKmFyZylcbiB7XG4gXHRyZXR1cm4gX19pc19rZnVuY19wdHJfYXJnX3R5cGUoYnRmLCBhcmcsIEtGX0FSR19SRVNfU1BJTl9MT0NLX0lEKTtcbkBAIC0xMTEzMiw2ICYjNDM7MTExNDgsNyBAQCBlbnVtIGtmdW5jX3B0cl9hcmdfdHlwZSB7XG4gXHRLRl9BUkdfUFRSX1RPX0lSUV9GTEFHLFxuIFx0S0ZfQVJHX1BUUl9UT19SRVNfU1BJTl9MT0NLLFxuIFx0S0ZfQVJHX1BUUl9UT19UQVNLX1dPUkssXG4mIzQzO1x0S0ZfQVJHX1BUUl9UT19USFJFQURfV1EsXG4gfTtcbiBcbiBlbnVtIHNwZWNpYWxfa2Z1bmNfdHlwZSB7XG5AQCAtMTExNzgsNiAmIzQzOzExMTk1LDcgQEAgZW51bSBzcGVjaWFsX2tmdW5jX3R5cGUge1xuIFx0S0ZfYnBmX3BlcmNwdV9vYmpfZHJvcCxcbiBcdEtGX2JwZl90aHJvdyxcbiBcdEtGX2JwZl93cV9zZXRfY2FsbGJhY2ssXG4mIzQzO1x0S0ZfYnBmX3RocmVhZF93cV9zZXRfY2FsbGJhY2ssXG4gXHRLRl9icGZfcHJlZW1wdF9kaXNhYmxlLFxuIFx0S0ZfYnBmX3ByZWVtcHRfZW5hYmxlLFxuIFx0S0ZfYnBmX2l0ZXJfY3NzX3Rhc2tfbmV3LFxuQEAgLTExMjU4LDYgJiM0MzsxMTI3Niw3IEBAIEJURl9JRChmdW5jLCBicGZfcGVyY3B1X29ial9kcm9wX2ltcGwpXG4gQlRGX0lEKGZ1bmMsIGJwZl9wZXJjcHVfb2JqX2Ryb3ApXG4gQlRGX0lEKGZ1bmMsIGJwZl90aHJvdylcbiBCVEZfSUQoZnVuYywgYnBmX3dxX3NldF9jYWxsYmFjaylcbiYjNDM7QlRGX0lEKGZ1bmMsIGJwZl90aHJlYWRfd3Ffc2V0X2NhbGxiYWNrKVxuIEJURl9JRChmdW5jLCBicGZfcHJlZW1wdF9kaXNhYmxlKVxuIEJURl9JRChmdW5jLCBicGZfcHJlZW1wdF9lbmFibGUpXG4gI2lmZGVmIENPTkZJR19DR1JPVVBTXG5AQCAtMTE0NjAsNiAmIzQzOzExNDc5LDggQEAgZ2V0X2tmdW5jX2FyZ190eXBlKHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsIHN0cnVjdCBicGZfY2FsbF9hcmdfbWV0YSAqbWV0YSxcbiBcdFx0YXJnX3R5cGUgPSBLRl9BUkdfUFRSX1RPX1RJTUVSO1xuIFx0ZWxzZSBpZiAoaXNfa2Z1bmNfYXJnX3Rhc2tfd29yayhtZXRhLVx1MDAzZWJ0ZiwgXHUwMDI2YXJnc1thcmddKSlcbiBcdFx0YXJnX3R5cGUgPSBLRl9BUkdfUFRSX1RPX1RBU0tfV09SSztcbiYjNDM7XHRlbHNlIGlmIChpc19rZnVuY19hcmdfdGhyZWFkX3dxKG1ldGEtXHUwMDNlYnRmLCBcdTAwMjZhcmdzW2FyZ10pKVxuJiM0MztcdFx0YXJnX3R5cGUgPSBLRl9BUkdfUFRSX1RPX1RIUkVBRF9XUTtcbiBcdGVsc2UgaWYgKGlzX2tmdW5jX2FyZ19pcnFfZmxhZyhtZXRhLVx1MDAzZWJ0ZiwgXHUwMDI2YXJnc1thcmddKSlcbiBcdFx0YXJnX3R5cGUgPSBLRl9BUkdfUFRSX1RPX0lSUV9GTEFHO1xuIFx0ZWxzZSBpZiAoaXNfa2Z1bmNfYXJnX3Jlc19zcGluX2xvY2sobWV0YS1cdTAwM2VidGYsIFx1MDAyNmFyZ3NbYXJnXSkpXG5AQCAtMTE4MzMsNiAmIzQzOzExODU0LDcgQEAgc3RhdGljIGJvb2wgaXNfc3luY19jYWxsYmFja19jYWxsaW5nX2tmdW5jKHUzMiBidGZfaWQpXG4gc3RhdGljIGJvb2wgaXNfYXN5bmNfY2FsbGJhY2tfY2FsbGluZ19rZnVuYyh1MzIgYnRmX2lkKVxuIHtcbiBcdHJldHVybiBpc19icGZfd3Ffc2V0X2NhbGxiYWNrX2tmdW5jKGJ0Zl9pZCkgfHxcbiYjNDM7XHQgICAgICAgaXNfYnBmX3RocmVhZF93cV9zZXRfY2FsbGJhY2tfa2Z1bmMoYnRmX2lkKSB8fFxuIFx0ICAgICAgIGlzX3Rhc2tfd29ya19hZGRfa2Z1bmMoYnRmX2lkKTtcbiB9XG4gXG5AQCAtMTE4NDcsNiAmIzQzOzExODY5LDExIEBAIHN0YXRpYyBib29sIGlzX2JwZl93cV9zZXRfY2FsbGJhY2tfa2Z1bmModTMyIGJ0Zl9pZClcbiBcdHJldHVybiBidGZfaWQgPT0gc3BlY2lhbF9rZnVuY19saXN0W0tGX2JwZl93cV9zZXRfY2FsbGJhY2tdO1xuIH1cbiBcbiYjNDM7c3RhdGljIGJvb2wgaXNfYnBmX3RocmVhZF93cV9zZXRfY2FsbGJhY2tfa2Z1bmModTMyIGJ0Zl9pZClcbiYjNDM7e1xuJiM0MztcdHJldHVybiBidGZfaWQgPT0gc3BlY2lhbF9rZnVuY19saXN0W0tGX2JwZl90aHJlYWRfd3Ffc2V0X2NhbGxiYWNrXTtcbiYjNDM7fVxuJiM0MztcbiBzdGF0aWMgYm9vbCBpc19jYWxsYmFja19jYWxsaW5nX2tmdW5jKHUzMiBidGZfaWQpXG4ge1xuIFx0cmV0dXJuIGlzX3N5bmNfY2FsbGJhY2tfY2FsbGluZ19rZnVuYyhidGZfaWQpIHx8XG5AQCAtMTIxOTIsNiAmIzQzOzEyMjE5LDcgQEAgc3RhdGljIGludCBjaGVja19rZnVuY19hcmdzKHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsIHN0cnVjdCBicGZfY2FsbF9hcmdfbWVcbiBcdFx0Y2FzZSBLRl9BUkdfUFRSX1RPX1dPUktRVUVVRTpcbiBcdFx0Y2FzZSBLRl9BUkdfUFRSX1RPX1RJTUVSOlxuIFx0XHRjYXNlIEtGX0FSR19QVFJfVE9fVEFTS19XT1JLOlxuJiM0MztcdFx0Y2FzZSBLRl9BUkdfUFRSX1RPX1RIUkVBRF9XUTpcbiBcdFx0Y2FzZSBLRl9BUkdfUFRSX1RPX0lSUV9GTEFHOlxuIFx0XHRjYXNlIEtGX0FSR19QVFJfVE9fUkVTX1NQSU5fTE9DSzpcbiBcdFx0XHRicmVhaztcbkBAIC0xMzEzOSw2ICYjNDM7MTMxNjcsMTYgQEAgc3RhdGljIGludCBjaGVja19rZnVuY19jYWxsKHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsIHN0cnVjdCBicGZfaW5zbiAqaW5zbixcbiBcdFx0fVxuIFx0fVxuIFxuJiM0MztcdGlmIChpc19icGZfdGhyZWFkX3dxX3NldF9jYWxsYmFja19rZnVuYyhtZXRhLmZ1bmNfaWQpKSB7XG4mIzQzO1x0XHRlcnIgPSBwdXNoX2NhbGxiYWNrX2NhbGwoZW52LCBpbnNuLCBpbnNuX2lkeCwgbWV0YS5zdWJwcm9nbm8sXG4mIzQzO1x0XHRcdFx0XHQgc2V0X3RpbWVyX2NhbGxiYWNrX3N0YXRlKTtcbiYjNDM7XHRcdGlmIChlcnIpIHtcbiYjNDM7XHRcdFx0dmVyYm9zZShlbnYsIFwmIzM0O2tmdW5jICVzIyVkIGZhaWxlZCBjYWxsYmFjayB2ZXJpZmljYXRpb25cXG5cJiMzNDssXG4mIzQzO1x0XHRcdFx0ZnVuY19uYW1lLCBtZXRhLmZ1bmNfaWQpO1xuJiM0MztcdFx0XHRyZXR1cm4gZXJyO1xuJiM0MztcdFx0fVxuJiM0MztcdH1cbiYjNDM7XG4gXHRpZiAoaXNfdGFza193b3JrX2FkZF9rZnVuYyhtZXRhLmZ1bmNfaWQpKSB7XG4gXHRcdGVyciA9IHB1c2hfY2FsbGJhY2tfY2FsbChlbnYsIGluc24sIGluc25faWR4LCBtZXRhLnN1YnByb2dubyxcbiBcdFx0XHRcdFx0IHNldF90YXNrX3dvcmtfc2NoZWR1bGVfY2FsbGJhY2tfc3RhdGUpO1xuZGlmZiAtLWdpdCBhL2tlcm5lbC9jZ3JvdXAvY2dyb3VwLmMgYi9rZXJuZWwvY2dyb3VwL2Nncm91cC5jXG5pbmRleCAzOGY4ZDlkZjhmYmM0Li4xNjRlMDY5Yzc1NzYyIDEwMDY0NFxuLS0tIGEva2VybmVsL2Nncm91cC9jZ3JvdXAuY1xuJiM0MzsmIzQzOyYjNDM7IGIva2VybmVsL2Nncm91cC9jZ3JvdXAuY1xuQEAgLTMwNDIsNiAmIzQzOzMwNDIsMTkgQEAgaW50IGNncm91cF9hdHRhY2hfdGFzayhzdHJ1Y3QgY2dyb3VwICpkc3RfY2dycCwgc3RydWN0IHRhc2tfc3RydWN0ICpsZWFkZXIsXG4gXHRyZXR1cm4gcmV0O1xuIH1cbiBcbiYjNDM7aW50IGNncm91cF9rdGhyZWFkX2F0dGFjaChzdHJ1Y3QgY2dyb3VwICpjZ3JwLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spXG4mIzQzO3tcbiYjNDM7XHRpbnQgcmV0O1xuJiM0MztcbiYjNDM7XHRjZ3JvdXBfbG9jaygpO1xuJiM0MztcdGNncm91cF9hdHRhY2hfbG9jayhDR1JQX0FUVEFDSF9MT0NLX0dMT0JBTCwgTlVMTCk7XG4mIzQzO1x0cmV0ID0gY2dyb3VwX2F0dGFjaF90YXNrKGNncnAsIHRhc2ssIGZhbHNlKTtcbiYjNDM7XHRjZ3JvdXBfYXR0YWNoX3VubG9jayhDR1JQX0FUVEFDSF9MT0NLX0dMT0JBTCwgTlVMTCk7XG4mIzQzO1x0Y2dyb3VwX3VubG9jaygpO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gcmV0O1xuJiM0Mzt9XG4mIzQzO1xuIHN0cnVjdCB0YXNrX3N0cnVjdCAqY2dyb3VwX3Byb2NzX3dyaXRlX3N0YXJ0KGNoYXIgKmJ1ZiwgYm9vbCB0aHJlYWRncm91cCxcbiBcdFx0XHRcdFx0ICAgICBlbnVtIGNncm91cF9hdHRhY2hfbG9ja19tb2RlICpsb2NrX21vZGUpXG4ge1xuZGlmZiAtLWdpdCBhL21tL2JwZl9tZW1jb250cm9sLmMgYi9tbS9icGZfbWVtY29udHJvbC5jXG5pbmRleCA3MTZkZjQ5ZDc2NDc3Li4zZjdhNWM5N2UxMzU1IDEwMDY0NFxuLS0tIGEvbW0vYnBmX21lbWNvbnRyb2wuY1xuJiM0MzsmIzQzOyYjNDM7IGIvbW0vYnBmX21lbWNvbnRyb2wuY1xuQEAgLTYsNiAmIzQzOzYsNyBAQFxuICAqL1xuIFxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L21lbWNvbnRyb2wuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9zd2FwLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9icGYuaFx1MDAzZVxuIFxuIF9fYnBmX2tmdW5jX3N0YXJ0X2RlZnMoKTtcbkBAIC0xNTksNiAmIzQzOzE2MCw2MSBAQCBfX2JwZl9rZnVuYyB2b2lkIGJwZl9tZW1fY2dyb3VwX2ZsdXNoX3N0YXRzKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZylcbiBcdG1lbV9jZ3JvdXBfZmx1c2hfc3RhdHMobWVtY2cpO1xuIH1cbiBcbiYjNDM7LyoqXG4mIzQzOyAqIGJwZl90cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzIC0gYXR0ZW1wdCB0byByZWNsYWltIHBhZ2VzIGZyb21cbiYjNDM7ICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhIG1lbW9yeSBjZ3JvdXBcbiYjNDM7ICogQG1lbWNnOiAgICAgICAgICAgdGhlIHRhcmdldCBtZW1vcnkgY2dyb3VwIHRvIHJlY2xhaW0gZnJvbVxuJiM0MzsgKiBAbnJfcGFnZXM6ICAgICAgICB0aGUgbnVtYmVyIG9mIHBhZ2VzIHRvIHJlY2xhaW1cbiYjNDM7ICogQGdmcF9tYXNrOiAgICAgICAgR0ZQIGZsYWdzIGNvbnRyb2xsaW5nIHRoZSByZWNsYWltIGJlaGF2aW9yXG4mIzQzOyAqIEByZWNsYWltX29wdGlvbnM6IGJpdG1hc2sgb2YgTUVNQ0dfUkVDTEFJTV8qIGZsYWdzIHRvIHR1bmVcbiYjNDM7ICogICAgICAgICAgICAgICAgICAgcmVjbGFpbSBzdHJhdGVneVxuJiM0MzsgKiBAc3dhcHBpbmVzczogICAgICBzd2FwcGluZXNzIG92ZXJyaWRlIHZhbHVlLCBvciBhIHNlbnRpbmVsIHRvIHVzZVxuJiM0MzsgKiAgICAgICAgICAgICAgICAgICB0aGUgZGVmYXVsdFxuJiM0MzsgKlxuJiM0MzsgKiBCUEYtZmFjaW5nIHdyYXBwZXIgYXJvdW5kIHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMoKSB0aGF0XG4mIzQzOyAqIHZhbGlkYXRlcyBhbmQgdHJhbnNsYXRlcyB0aGUgQHN3YXBwaW5lc3MgYXJndW1lbnQgYmVmb3JlXG4mIzQzOyAqIGRlbGVnYXRpbmcgdG8gdGhlIGNvcmUgcmVjbGFpbSBwYXRoLlxuJiM0MzsgKlxuJiM0MzsgKiBUaGUgQHN3YXBwaW5lc3MgcGFyYW1ldGVyIGZvbGxvd3MgdGhlc2Ugc2VtYW50aWNzOlxuJiM0MzsgKiAgIC0gVmFsdWVzIGluIFtNSU5fU1dBUFBJTkVTUywgU1dBUFBJTkVTU19BTk9OX09OTFldIGFyZSBwYXNzZWRcbiYjNDM7ICogICAgIHRocm91Z2ggYXMgYW4gZXhwbGljaXQgc3dhcHBpbmVzcyBvdmVycmlkZS5cbiYjNDM7ICogICAtIFZhbHVlcyBiZWxvdyBNSU5fU1dBUFBJTkVTUyBhcmUgdHJlYXRlZCBhcyBcJiMzNDt1c2UgdGhlIHN5c3RlbVxuJiM0MzsgKiAgICAgZGVmYXVsdFwmIzM0OzsgdGhlIG92ZXJyaWRlIHBvaW50ZXIgaXMgc2V0IHRvIE5VTEwgYW5kIHRoZSBjZ3JvdXAmIzM5O3NcbiYjNDM7ICogICAgIG93biBzd2FwcGluZXNzIHNldHRpbmcgdGFrZXMgZWZmZWN0LlxuJiM0MzsgKiAgIC0gVmFsdWVzIGFib3ZlIFNXQVBQSU5FU1NfQU5PTl9PTkxZIGFyZSByZWplY3RlZCBhcyBpbnZhbGlkLlxuJiM0MzsgKiAgIC0gSWYgQHJlY2xhaW1fb3B0aW9ucyBkb2VzIG5vdCBpbmNsdWRlIE1FTUNHX1JFQ0xBSU1fUFJPQUNUSVZFLFxuJiM0MzsgKiAgICAgdGhlIEBzd2FwcGluZXNzIG92ZXJyaWRlIGlzIGlnbm9yZWQgZW50aXJlbHkgYnkgdGhlIGNvcmVcbiYjNDM7ICogICAgIHJlY2xhaW0gcGF0aCBhbmQgdGhlIHN5c3RlbSBkZWZhdWx0IGlzIHVzZWQgcmVnYXJkbGVzcy5cbiYjNDM7ICpcbiYjNDM7ICogU3dhcCB1c2FnZSBkdXJpbmcgcmVjbGFpbSBpcyBnYXRlZCBvbiBAcmVjbGFpbV9vcHRpb25zOiBzd2FwIGlzXG4mIzQzOyAqIGNvbnNpZGVyZWQgb25seSB3aGVuIE1FTUNHX1JFQ0xBSU1fTUFZX1NXQVAgaXMgc2V0LiAgV2l0aG91dCB0aGlzXG4mIzQzOyAqIGZsYWcsIHJlY2xhaW0gaXMgcmVzdHJpY3RlZCB0byBmaWxlLWJhY2tlZCBwYWdlcyByZWdhcmRsZXNzIG9mIHRoZVxuJiM0MzsgKiBAc3dhcHBpbmVzcyB2YWx1ZSBvciB0aGUgY2dyb3VwJiMzOTtzIHN3YXBwaW5lc3Mgc2V0dGluZy5cbiYjNDM7ICpcbiYjNDM7ICogUmV0dXJuOlxuJiM0MzsgKiAgIFRoZSBudW1iZXIgb2YgcGFnZXMgYWN0dWFsbHkgcmVjbGFpbWVkIG9uIHN1Y2Nlc3MsIG9yIDBcbiYjNDM7ICogICBpZiBAc3dhcHBpbmVzcyBleGNlZWRzIFNXQVBQSU5FU1NfQU5PTl9PTkxZLlxuJiM0MzsgKi9cbiYjNDM7X19icGZfa2Z1bmMgdW5zaWduZWQgbG9uZ1xuJiM0MzticGZfdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcyhzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csXG4mIzQzO1x0XHRcdFx0IHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMsXG4mIzQzO1x0XHRcdFx0IGdmcF90IGdmcF9tYXNrLFxuJiM0MztcdFx0XHRcdCB1bnNpZ25lZCBpbnQgcmVjbGFpbV9vcHRpb25zLFxuJiM0MztcdFx0XHRcdCBpbnQgc3dhcHBpbmVzcylcbiYjNDM7e1xuJiM0MztcdGludCAqc3dhcGluZXNzX3B0cjtcbiYjNDM7XG4mIzQzO1x0aWYgKHN3YXBwaW5lc3MgXHUwMDNlIFNXQVBQSU5FU1NfQU5PTl9PTkxZKVxuJiM0MztcdFx0cmV0dXJuIDA7XG4mIzQzO1x0ZWxzZSBpZiAoc3dhcHBpbmVzcyBcdTAwM2MgTUlOX1NXQVBQSU5FU1MpXG4mIzQzO1x0XHRzd2FwaW5lc3NfcHRyID0gTlVMTDtcbiYjNDM7XHRlbHNlXG4mIzQzO1x0XHRzd2FwaW5lc3NfcHRyID0gXHUwMDI2c3dhcHBpbmVzcztcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMobWVtY2csIG5yX3BhZ2VzLCBnZnBfbWFzayxcbiYjNDM7XHRcdFx0XHRcdCAgICByZWNsYWltX29wdGlvbnMsIHN3YXBpbmVzc19wdHIpO1xuJiM0Mzt9XG4mIzQzO1xuIF9fYnBmX2tmdW5jX2VuZF9kZWZzKCk7XG4gXG4gQlRGX0tGVU5DU19TVEFSVChicGZfbWVtY29udHJvbF9rZnVuY3MpXG5AQCAtMTcyLDYgJiM0MzsyMjgsOCBAQCBCVEZfSURfRkxBR1MoZnVuYywgYnBmX21lbV9jZ3JvdXBfdXNhZ2UpXG4gQlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9tZW1fY2dyb3VwX3BhZ2Vfc3RhdGUpXG4gQlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9tZW1fY2dyb3VwX2ZsdXNoX3N0YXRzLCBLRl9TTEVFUEFCTEUpXG4gXG4mIzQzO0JURl9JRF9GTEFHUyhmdW5jLCBicGZfdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcywgS0ZfU0xFRVBBQkxFKVxuJiM0MztcbiBCVEZfS0ZVTkNTX0VORChicGZfbWVtY29udHJvbF9rZnVuY3MpXG4gXG4gc3RhdGljIGNvbnN0IHN0cnVjdCBidGZfa2Z1bmNfaWRfc2V0IGJwZl9tZW1jb250cm9sX2tmdW5jX3NldCA9IHtcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvYnBmX2V4cGVyaW1lbnRhbC5oIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL2JwZl9leHBlcmltZW50YWwuaFxuaW5kZXggZmYzN2FlNWExMTNkYy4uZWE5MDVlYTU2MDNjMiAxMDA2NDRcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9icGZfZXhwZXJpbWVudGFsLmhcbiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9icGZfZXhwZXJpbWVudGFsLmhcbkBAIC0zNTEsNiAmIzQzOzM1MSwxMyBAQCBleHRlcm4gdm9pZCBicGZfaXRlcl9jc3NfZGVzdHJveShzdHJ1Y3QgYnBmX2l0ZXJfY3NzICppdCkgX193ZWFrIF9fa3N5bTtcbiBleHRlcm4gaW50IGJwZl93cV9pbml0KHN0cnVjdCBicGZfd3EgKndxLCB2b2lkICpwX19tYXAsIHVuc2lnbmVkIGludCBmbGFncykgX193ZWFrIF9fa3N5bTtcbiBleHRlcm4gaW50IGJwZl93cV9zdGFydChzdHJ1Y3QgYnBmX3dxICp3cSwgdW5zaWduZWQgaW50IGZsYWdzKSBfX3dlYWsgX19rc3ltO1xuIFxuJiM0MztzdHJ1Y3QgYnBmX3RocmVhZF93cTtcbiYjNDM7ZXh0ZXJuIGludCBicGZfdGhyZWFkX3dxX2luaXQoc3RydWN0IGJwZl90aHJlYWRfd3EgKnR3cSwgdm9pZCAqcF9fbWFwLFxuJiM0MztcdFx0XHQgICAgICBfX3U2NCBjZ3JvdXBfaWQsXG4mIzQzO1x0XHRcdCAgICAgIHVuc2lnbmVkIGludCBmbGFncykgX193ZWFrIF9fa3N5bTtcbiYjNDM7ZXh0ZXJuIGludCBicGZfdGhyZWFkX3dxX3N0YXJ0KHN0cnVjdCBicGZfdGhyZWFkX3dxICp0d3EsXG4mIzQzO1x0XHRcdCAgICAgICB1bnNpZ25lZCBpbnQgZmxhZ3MpIF9fd2VhayBfX2tzeW07XG4mIzQzO1xuIHN0cnVjdCBicGZfaXRlcl9rbWVtX2NhY2hlO1xuIGV4dGVybiBpbnQgYnBmX2l0ZXJfa21lbV9jYWNoZV9uZXcoc3RydWN0IGJwZl9pdGVyX2ttZW1fY2FjaGUgKml0KSBfX3dlYWsgX19rc3ltO1xuIGV4dGVybiBzdHJ1Y3Qga21lbV9jYWNoZSAqYnBmX2l0ZXJfa21lbV9jYWNoZV9uZXh0KHN0cnVjdCBicGZfaXRlcl9rbWVtX2NhY2hlICppdCkgX193ZWFrIF9fa3N5bTtcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9tZW1jZ19hc3luY19yZWNsYWltLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9tZW1jZ19hc3luY19yZWNsYWltLmNcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwLi40MGE1ZmU2MmNiMzg0XG4tLS0gL2Rldi9udWxsXG4mIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9tZW1jZ19hc3luY19yZWNsYWltLmNcbkBAIC0wLDAgJiM0MzsxLDQ3OSBAQFxuJiM0MzsvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxuJiM0MzsvKlxuJiM0MzsgKiBNZW1vcnkgY29udHJvbGxlciBlQlBGIGFzeW5jIHJlY2xhaW0gdGVzdFxuJiM0MzsgKi9cbiYjNDM7XG4mIzQzOyNpbmNsdWRlIFx1MDAzY3Rlc3RfcHJvZ3MuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NzeXMvbW1hbi5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY3N5cy9zdGF0LmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjc3lzL3RpbWUuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NzeXMvdmZzLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjc3lzL3dhaXQuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NmY250bC5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L21hZ2ljLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjdW5pc3RkLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjc3RkaW8uaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NzdGRsaWIuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NzdHJpbmcuaFx1MDAzZVxuJiM0MztcbiYjNDM7I2luY2x1ZGUgXCYjMzQ7Y2dyb3VwX2hlbHBlcnMuaFwmIzM0O1xuJiM0MztcbiYjNDM7c3RydWN0IGJwZl9hcmdzX3Mge1xuJiM0MztcdHU2NCBoaWdoX2Nncm91cF9pZDtcbiYjNDM7XHR1NjQgbG93X2Nncm91cF9pZDtcbiYjNDM7XHR1NjQgZXZlbnRfZGVsdGFfdGhyZXNob2xkO1xuJiM0MztcdHU2NCBjaGVja19ucztcbiYjNDM7fTtcbiYjNDM7XG4mIzQzOyNpbmNsdWRlIFwmIzM0O21lbWNnX2FzeW5jX3JlY2xhaW0uc2tlbC5oXCYjMzQ7XG4mIzQzO1xuJiM0MzsjZGVmaW5lIEZJTEVfU0laRSAoMzIgKiAxMDI0ICogMTAyNHVsKVxuJiM0MzsjZGVmaW5lIEJVRkZFUl9TSVpFICg0MDk2KVxuJiM0MzsjZGVmaW5lIENHX0xJTUlUICgzMiAqIDEwMjQgKiAxMDI0dWwpXG4mIzQzOyNkZWZpbmUgUkVBRF9USU1FUyAxNlxuJiM0MztcbiYjNDM7I2RlZmluZSBDR19ESVIgXCYjMzQ7L21lbWNnX2FzeW5jX3JlY2xhaW1cJiMzNDtcbiYjNDM7I2RlZmluZSBDR19ISUdIX0RJUiBDR19ESVIgXCYjMzQ7L2hpZ2hcJiMzNDtcbiYjNDM7I2RlZmluZSBDR19MT1dfRElSIENHX0RJUiBcJiMzNDsvbG93XCYjMzQ7XG4mIzQzO1xuJiM0MzsjZGVmaW5lIENIRUNLX1BFUklPRF9OUyAoMiAqIDEwMDAgKiAxMDAwdWxsKVxuJiM0MzsjZGVmaW5lIEVWRU5UX0RFTFRBX1RIUkVTSE9MRCAxXG4mIzQzO1xuJiM0MzsvKlxuJiM0MzsgKiBUZXN0IGZpbGVzIG11c3QgcmVzaWRlIG9uIGEgZmlsZXN5c3RlbSB0aGF0IHN1cHBvcnRzIHBhZ2UgcmVjbGFpbSB3aXRob3V0XG4mIzQzOyAqIHN3YXAgKGUuZy4gZXh0NCkuIElmIC90bXAgaXMgb24gdG1wZnMsIHRoZSBmaWxlIHBhZ2VzIGFyZSBzaG1lbS1iYWNrZWRcbiYjNDM7ICogYW5kIGNhbiBvbmx5IGJlIHJlY2xhaW1lZCB0aHJvdWdoIHN3YXAuIEJ1dCB0aGUgdGVzdCBkaXNhYmxlcyBzd2FwXG4mIzQzOyAqIChtZW1vcnkuc3dhcC5tYXg9MCksIG1ha2luZyByZWNsYWltIGltcG9zc2libGUgYW5kIGNhdXNpbmcgT09NLlxuJiM0MzsgKlxuJiM0MzsgKiBQaWNrIGEgZGlyZWN0b3J5IG9uIGEgbm9uLXRtcGZzIGZpbGVzeXN0ZW06IHRyeSAkVE1QRElSIGZpcnN0LCB0aGVuIC90bXAsXG4mIzQzOyAqIGFuZCBmYWxsIGJhY2sgdG8gdGhlIGN1cnJlbnQgZGlyZWN0b3J5IGlmIHRoZSBjaG9zZW4gcGF0aCBpcyBvbiB0bXBmcy5cbiYjNDM7ICovXG4mIzQzO3N0YXRpYyBpbnQgZ2V0X3Rlc3RfZGlyKGNoYXIgKmJ1Ziwgc2l6ZV90IHNpemUpXG4mIzQzO3tcbiYjNDM7XHRzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGNhbmRpZGF0ZXNbXSA9IHsgXCYjMzQ7L3RtcFwmIzM0OywgXCYjMzQ7LlwmIzM0OyB9O1xuJiM0MztcdGNvbnN0IGNoYXIgKnRtcGRpciA9IGdldGVudihcJiMzNDtUTVBESVJcJiMzNDspO1xuJiM0MztcdHN0cnVjdCBzdGF0ZnMgc2ZzO1xuJiM0MztcdHNpemVfdCBpO1xuJiM0MztcbiYjNDM7XHRpZiAodG1wZGlyIFx1MDAyNlx1MDAyNiB0bXBkaXJbMF0gXHUwMDI2XHUwMDI2IHN0YXRmcyh0bXBkaXIsIFx1MDAyNnNmcykgPT0gMCBcdTAwMjZcdTAwMjZcbiYjNDM7XHQgICAgc2ZzLmZfdHlwZSAhPSBUTVBGU19NQUdJQykge1xuJiM0MztcdFx0c25wcmludGYoYnVmLCBzaXplLCBcJiMzNDslc1wmIzM0OywgdG1wZGlyKTtcbiYjNDM7XHRcdHJldHVybiAwO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgQVJSQVlfU0laRShjYW5kaWRhdGVzKTsgaSYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdGlmIChzdGF0ZnMoY2FuZGlkYXRlc1tpXSwgXHUwMDI2c2ZzKSA9PSAwIFx1MDAyNlx1MDAyNlxuJiM0MztcdFx0ICAgIHNmcy5mX3R5cGUgIT0gVE1QRlNfTUFHSUMpIHtcbiYjNDM7XHRcdFx0c25wcmludGYoYnVmLCBzaXplLCBcJiMzNDslc1wmIzM0OywgY2FuZGlkYXRlc1tpXSk7XG4mIzQzO1x0XHRcdHJldHVybiAwO1xuJiM0MztcdFx0fVxuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0cmV0dXJuIC0xO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgaW50IHNldHVwX2hpZ2hfbG93X2Nncm91cHModTY0ICpoaWdoX2Nncm91cF9pZCwgdTY0ICpsb3dfY2dyb3VwX2lkKVxuJiM0Mzt7XG4mIzQzO1x0aW50IHJldDtcbiYjNDM7XHRjaGFyIGxpbWl0X2J1ZlsyMF07XG4mIzQzO1xuJiM0MztcdHJldCA9IHNldHVwX2Nncm91cF9lbnZpcm9ubWVudCgpO1xuJiM0MztcdGlmICghQVNTRVJUX09LKHJldCwgXCYjMzQ7c2V0dXBfY2dyb3VwX2Vudmlyb25tZW50XCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gY2xlYW51cDtcbiYjNDM7XG4mIzQzO1x0cmV0ID0gY3JlYXRlX2FuZF9nZXRfY2dyb3VwKENHX0RJUik7XG4mIzQzO1x0aWYgKCFBU1NFUlRfR0UocmV0LCAwLCBcJiMzNDtjcmVhdGVfYW5kX2dldF9jZ3JvdXAgXCYjMzQ7IENHX0RJUikpXG4mIzQzO1x0XHRnb3RvIGNsZWFudXA7XG4mIzQzO1x0Y2xvc2UocmV0KTtcbiYjNDM7XG4mIzQzO1x0cmV0ID0gZW5hYmxlX2NvbnRyb2xsZXJzKENHX0RJUiwgXCYjMzQ7bWVtb3J5XCYjMzQ7KTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PSyhyZXQsIFwmIzM0O2VuYWJsZV9jb250cm9sbGVyc1wmIzM0OykpXG4mIzQzO1x0XHRnb3RvIGNsZWFudXA7XG4mIzQzO1xuJiM0MztcdHNucHJpbnRmKGxpbWl0X2J1Ziwgc2l6ZW9mKGxpbWl0X2J1ZiksIFwmIzM0OyVsdVwmIzM0OywgQ0dfTElNSVQpO1xuJiM0MztcdHJldCA9IHdyaXRlX2Nncm91cF9maWxlKENHX0RJUiwgXCYjMzQ7bWVtb3J5Lm1heFwmIzM0OywgbGltaXRfYnVmKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PSyhyZXQsIFwmIzM0O3dyaXRlX2Nncm91cF9maWxlIG1lbW9yeS5tYXhcJiMzNDspKVxuJiM0MztcdFx0Z290byBjbGVhbnVwO1xuJiM0MztcbiYjNDM7XHRyZXQgPSB3cml0ZV9jZ3JvdXBfZmlsZShDR19ESVIsIFwmIzM0O21lbW9yeS5zd2FwLm1heFwmIzM0OywgXCYjMzQ7MFwmIzM0Oyk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0socmV0LCBcJiMzNDt3cml0ZV9jZ3JvdXBfZmlsZSBtZW1vcnkuc3dhcC5tYXhcJiMzNDspKVxuJiM0MztcdFx0Z290byBjbGVhbnVwO1xuJiM0MztcbiYjNDM7XHRyZXQgPSBjcmVhdGVfYW5kX2dldF9jZ3JvdXAoQ0dfSElHSF9ESVIpO1xuJiM0MztcdGlmICghQVNTRVJUX0dFKHJldCwgMCwgXCYjMzQ7Y3JlYXRlX2FuZF9nZXRfY2dyb3VwIFwmIzM0OyBDR19ISUdIX0RJUikpXG4mIzQzO1x0XHRnb3RvIGNsZWFudXA7XG4mIzQzO1x0Y2xvc2UocmV0KTtcbiYjNDM7XG4mIzQzO1x0KmhpZ2hfY2dyb3VwX2lkID0gZ2V0X2Nncm91cF9pZChDR19ISUdIX0RJUik7XG4mIzQzO1x0aWYgKCFBU1NFUlRfR1QoKmhpZ2hfY2dyb3VwX2lkLCAwLCBcJiMzNDtnZXRfY2dyb3VwX2lkXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gY2xlYW51cDtcbiYjNDM7XG4mIzQzO1x0cmV0ID0gY3JlYXRlX2FuZF9nZXRfY2dyb3VwKENHX0xPV19ESVIpO1xuJiM0MztcdGlmICghQVNTRVJUX0dFKHJldCwgMCwgXCYjMzQ7Y3JlYXRlX2FuZF9nZXRfY2dyb3VwIFwmIzM0OyBDR19MT1dfRElSKSlcbiYjNDM7XHRcdGdvdG8gY2xlYW51cDtcbiYjNDM7XHRjbG9zZShyZXQpO1xuJiM0MztcbiYjNDM7XHQqbG93X2Nncm91cF9pZCA9IGdldF9jZ3JvdXBfaWQoQ0dfTE9XX0RJUik7XG4mIzQzO1x0aWYgKCFBU1NFUlRfR1QoKmhpZ2hfY2dyb3VwX2lkLCAwLCBcJiMzNDtnZXRfY2dyb3VwX2lkXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gY2xlYW51cDtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIDA7XG4mIzQzO1xuJiM0MztjbGVhbnVwOlxuJiM0MztcdGNsZWFudXBfY2dyb3VwX2Vudmlyb25tZW50KCk7XG4mIzQzO1x0cmV0dXJuIC0xO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgaW50IHdyaXRlX2ZpbGUoY29uc3QgY2hhciAqZmlsZW5hbWUpXG4mIzQzO3tcbiYjNDM7XHRpbnQgcmV0ID0gLTE7XG4mIzQzO1x0c2l6ZV90IHdyaXR0ZW4gPSAwO1xuJiM0MztcdGNoYXIgKmJ1ZmZlcjtcbiYjNDM7XHRGSUxFICpmcDtcbiYjNDM7XG4mIzQzO1x0ZnAgPSBmb3BlbihmaWxlbmFtZSwgXCYjMzQ7d2JcJiMzNDspO1xuJiM0MztcdGlmICghZnApXG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XG4mIzQzO1x0YnVmZmVyID0gbWFsbG9jKEJVRkZFUl9TSVpFKTtcbiYjNDM7XHRpZiAoIWJ1ZmZlcilcbiYjNDM7XHRcdGdvdG8gY2xlYW51cF9mcDtcbiYjNDM7XG4mIzQzO1x0bWVtc2V0KGJ1ZmZlciwgJiMzOTtBJiMzOTssIEJVRkZFUl9TSVpFKTtcbiYjNDM7XG4mIzQzO1x0d2hpbGUgKHdyaXR0ZW4gXHUwMDNjIEZJTEVfU0laRSkge1xuJiM0MztcdFx0c2l6ZV90IHRvX3dyaXRlID0gRklMRV9TSVpFIC0gd3JpdHRlbiBcdTAwM2MgQlVGRkVSX1NJWkUgP1xuJiM0MztcdFx0XHRcdCAgRklMRV9TSVpFIC0gd3JpdHRlbiA6IEJVRkZFUl9TSVpFO1xuJiM0MztcbiYjNDM7XHRcdGlmIChmd3JpdGUoYnVmZmVyLCAxLCB0b193cml0ZSwgZnApICE9IHRvX3dyaXRlKVxuJiM0MztcdFx0XHRnb3RvIGNsZWFudXA7XG4mIzQzO1x0XHR3cml0dGVuICYjNDM7PSB0b193cml0ZTtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdHJldCA9IDA7XG4mIzQzO2NsZWFudXA6XG4mIzQzO1x0ZnJlZShidWZmZXIpO1xuJiM0MztjbGVhbnVwX2ZwOlxuJiM0MztcdGZjbG9zZShmcCk7XG4mIzQzO291dDpcbiYjNDM7XHRyZXR1cm4gcmV0O1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgaW50IHJlYWRfZmlsZShjb25zdCBjaGFyICpmaWxlbmFtZSwgaW50IGl0ZXJhdGlvbnMpXG4mIzQzO3tcbiYjNDM7XHRpbnQgcmV0ID0gLTE7XG4mIzQzO1x0bG9uZyBwYWdlX3NpemUgPSBzeXNjb25mKF9TQ19QQUdFU0laRSk7XG4mIzQzO1x0Y2hhciAqbWFwO1xuJiM0MztcdHNpemVfdCBpO1xuJiM0MztcdGludCBmZDtcbiYjNDM7XHRzdHJ1Y3Qgc3RhdCBzYjtcbiYjNDM7XG4mIzQzO1x0ZmQgPSBvcGVuKGZpbGVuYW1lLCBPX1JET05MWSk7XG4mIzQzO1x0aWYgKGZkID09IC0xKVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1xuJiM0MztcdGlmIChmc3RhdChmZCwgXHUwMDI2c2IpID09IC0xKVxuJiM0MztcdFx0Z290byBjbGVhbnVwX2ZkO1xuJiM0MztcbiYjNDM7XHRpZiAoc2Iuc3Rfc2l6ZSAhPSBGSUxFX1NJWkUpIHtcbiYjNDM7XHRcdGZwcmludGYoc3RkZXJyLCBcJiMzNDtGaWxlIHNpemUgbWlzbWF0Y2g6IGV4cGVjdGVkICVsdSwgZ290ICVsdVxcblwmIzM0OyxcbiYjNDM7XHRcdFx0KHVuc2lnbmVkIGxvbmcpRklMRV9TSVpFLCAodW5zaWduZWQgbG9uZylzYi5zdF9zaXplKTtcbiYjNDM7XHRcdGdvdG8gY2xlYW51cF9mZDtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdG1hcCA9IG1tYXAoTlVMTCwgRklMRV9TSVpFLCBQUk9UX1JFQUQsIE1BUF9QUklWQVRFLCBmZCwgMCk7XG4mIzQzO1x0aWYgKG1hcCA9PSBNQVBfRkFJTEVEKVxuJiM0MztcdFx0Z290byBjbGVhbnVwX2ZkO1xuJiM0MztcbiYjNDM7XHRmb3IgKGludCBpdGVyID0gMDsgaXRlciBcdTAwM2MgaXRlcmF0aW9uczsgaXRlciYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIEZJTEVfU0laRTsgaSAmIzQzOz0gcGFnZV9zaXplKSB7XG4mIzQzO1x0XHRcdC8qIGFjY2VzcyBhIGJ5dGUgdG8gdHJpZ2dlciBwYWdlIGZhdWx0ICovXG4mIzQzO1x0XHRcdGFzbSB2b2xhdGlsZShcJiMzNDtcJiMzNDsgOjogXCYjMzQ7clwmIzM0OyhtYXBbaV0pIDogXCYjMzQ7bWVtb3J5XCYjMzQ7KTtcbiYjNDM7XHRcdH1cbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdGlmIChtdW5tYXAobWFwLCBGSUxFX1NJWkUpID09IC0xKVxuJiM0MztcdFx0Z290byBjbGVhbnVwX2ZkO1xuJiM0MztcbiYjNDM7XHRyZXQgPSAwO1xuJiM0MztcbiYjNDM7Y2xlYW51cF9mZDpcbiYjNDM7XHRjbG9zZShmZCk7XG4mIzQzO291dDpcbiYjNDM7XHRyZXR1cm4gcmV0O1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgaW50IHJlYWxfdGVzdF9jaGlsZF93b3JrKGNvbnN0IGNoYXIgKmNncm91cF9wYXRoLCBjaGFyICpkYXRhX2ZpbGVuYW1lLFxuJiM0MztcdFx0XHRcdGNoYXIgKnRpbWVfZmlsZW5hbWUsIGludCByZWFkX3RpbWVzKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IHRpbWV2YWwgc3RhcnQsIGVuZDtcbiYjNDM7XHRkb3VibGUgZWxhcHNlZDtcbiYjNDM7XHRGSUxFICpmcDtcbiYjNDM7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0soam9pbl9wYXJlbnRfY2dyb3VwKGNncm91cF9wYXRoKSwgXCYjMzQ7am9pbl9wYXJlbnRfY2dyb3VwXCYjMzQ7KSlcbiYjNDM7XHRcdHJldHVybiAtMTtcbiYjNDM7XG4mIzQzO1x0Z2V0dGltZW9mZGF5KFx1MDAyNnN0YXJ0LCBOVUxMKTtcbiYjNDM7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0sod3JpdGVfZmlsZShkYXRhX2ZpbGVuYW1lKSwgXCYjMzQ7d3JpdGVfZmlsZVwmIzM0OykpXG4mIzQzO1x0XHRyZXR1cm4gLTE7XG4mIzQzO1xuJiM0MztcdGlmICghQVNTRVJUX09LKHJlYWRfZmlsZShkYXRhX2ZpbGVuYW1lLCByZWFkX3RpbWVzKSwgXCYjMzQ7cmVhZF9maWxlXCYjMzQ7KSlcbiYjNDM7XHRcdHJldHVybiAtMTtcbiYjNDM7XG4mIzQzO1x0Z2V0dGltZW9mZGF5KFx1MDAyNmVuZCwgTlVMTCk7XG4mIzQzO1xuJiM0MztcdGlmICghdGltZV9maWxlbmFtZSlcbiYjNDM7XHRcdHJldHVybiAwO1xuJiM0MztcbiYjNDM7XHRlbGFwc2VkID0gKGVuZC50dl9zZWMgLSBzdGFydC50dl9zZWMpICYjNDM7XG4mIzQzO1x0XHQgIChlbmQudHZfdXNlYyAtIHN0YXJ0LnR2X3VzZWMpIC8gMTAwMDAwMC4wO1xuJiM0MztcdHByaW50ZihcJiMzNDslLjZmXFxuXCYjMzQ7LCBlbGFwc2VkKTtcbiYjNDM7XG4mIzQzO1x0ZnAgPSBmb3Blbih0aW1lX2ZpbGVuYW1lLCBcJiMzNDt3XCYjMzQ7KTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PS19QVFIoZnAsIFwmIzM0O2ZvcGVuXCYjMzQ7KSlcbiYjNDM7XHRcdHJldHVybiAtMTtcbiYjNDM7XHRmcHJpbnRmKGZwLCBcJiMzNDslLjZmXCYjMzQ7LCBlbGFwc2VkKTtcbiYjNDM7XHRmY2xvc2UoZnApO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGludCBnZXRfdGltZShjaGFyICp0aW1lX2ZpbGVuYW1lLCBkb3VibGUgKnRpbWUpXG4mIzQzO3tcbiYjNDM7XHRpbnQgcmV0ID0gLTE7XG4mIzQzO1x0RklMRSAqZnA7XG4mIzQzO1x0Y2hhciBidWZbNjRdO1xuJiM0MztcbiYjNDM7XHRmcCA9IGZvcGVuKHRpbWVfZmlsZW5hbWUsIFwmIzM0O3JcJiMzNDspO1xuJiM0MztcdGlmICghQVNTRVJUX09LX1BUUihmcCwgXCYjMzQ7Zm9wZW5cJiMzNDspKVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1xuJiM0MztcdGlmICghQVNTRVJUX09LX1BUUihmZ2V0cyhidWYsIHNpemVvZihidWYpLCBmcCksIFwmIzM0O2ZnZXRzXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gY2xlYW51cDtcbiYjNDM7XG4mIzQzO1x0aWYgKHNzY2FuZihidWYsIFwmIzM0OyVsZlwmIzM0OywgdGltZSkgIT0gMSkge1xuJiM0MztcdFx0UFJJTlRfRkFJTChcJiMzNDtzc2NhbmYgJXNcJiMzNDssIGJ1Zik7XG4mIzQzO1x0XHRnb3RvIGNsZWFudXA7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRyZXQgPSAwO1xuJiM0MztjbGVhbnVwOlxuJiM0MztcdGZjbG9zZShmcCk7XG4mIzQzO291dDpcbiYjNDM7XHRyZXR1cm4gcmV0O1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgaW50XG4mIzQzO3J1bl9oaWdoX2xvd193b3JrbG9hZChkb3VibGUgKmhpZ2hfZWxhcHNlZCwgZG91YmxlICpsb3dfZWxhcHNlZCwgaW50IHJlYWRfdGltZXMpXG4mIzQzO3tcbiYjNDM7XHRjaGFyIHRlc3RfZGlyW1BBVEhfTUFYXSwgaGlnaF9kYXRhX2ZpbGVbUEFUSF9NQVhdLCBsb3dfZGF0YV9maWxlW1BBVEhfTUFYXTtcbiYjNDM7XHRjaGFyIGhpZ2hfdGltZV9maWxlW1BBVEhfTUFYXSwgbG93X3RpbWVfZmlsZVtQQVRIX01BWF07XG4mIzQzO1x0aW50IHJldCwgZmQ7XG4mIzQzO1x0cGlkX3QgaGlnaF9waWQsIGxvd19waWQ7XG4mIzQzO1x0aW50IHN0YXR1cztcbiYjNDM7XG4mIzQzO1x0cmV0ID0gZ2V0X3Rlc3RfZGlyKHRlc3RfZGlyLCBzaXplb2YodGVzdF9kaXIpKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PSyhyZXQsIFwmIzM0O2dldF90ZXN0X2Rpcjogbm8gbm9uLXRtcGZzIGRpcmVjdG9yeSBmb3VuZFwmIzM0OykpXG4mIzQzO1x0XHRyZXR1cm4gLTE7XG4mIzQzO1xuJiM0MztcdGZkID0gc25wcmludGYoaGlnaF9kYXRhX2ZpbGUsIHNpemVvZihoaWdoX2RhdGFfZmlsZSksXG4mIzQzO1x0XHQgICAgICBcJiMzNDslcy9tZW1jZ19hc3luY19oaWdoX2RhdGFfWFhYWFhYXCYjMzQ7LCB0ZXN0X2Rpcik7XG4mIzQzO1x0aWYgKCFBU1NFUlRfTFQoZmQsIHNpemVvZihoaWdoX2RhdGFfZmlsZSksIFwmIzM0O2hpZ2hfZGF0YV9maWxlIHBhdGhcJiMzNDspKVxuJiM0MztcdFx0cmV0dXJuIC0xO1xuJiM0MztcbiYjNDM7XHRmZCA9IHNucHJpbnRmKGxvd19kYXRhX2ZpbGUsIHNpemVvZihsb3dfZGF0YV9maWxlKSxcbiYjNDM7XHRcdCAgICAgIFwmIzM0OyVzL21lbWNnX2FzeW5jX2xvd19kYXRhX1hYWFhYWFwmIzM0OywgdGVzdF9kaXIpO1xuJiM0MztcdGlmICghQVNTRVJUX0xUKGZkLCBzaXplb2YobG93X2RhdGFfZmlsZSksIFwmIzM0O2xvd19kYXRhX2ZpbGUgcGF0aFwmIzM0OykpXG4mIzQzO1x0XHRyZXR1cm4gLTE7XG4mIzQzO1xuJiM0MztcdGZkID0gc25wcmludGYoaGlnaF90aW1lX2ZpbGUsIHNpemVvZihoaWdoX3RpbWVfZmlsZSksXG4mIzQzO1x0XHQgICAgICBcJiMzNDslcy9tZW1jZ19hc3luY19oaWdoX3RpbWVfWFhYWFhYXCYjMzQ7LCB0ZXN0X2Rpcik7XG4mIzQzO1x0aWYgKCFBU1NFUlRfTFQoZmQsIHNpemVvZihoaWdoX3RpbWVfZmlsZSksIFwmIzM0O2hpZ2hfdGltZV9maWxlIHBhdGhcJiMzNDspKVxuJiM0MztcdFx0cmV0dXJuIC0xO1xuJiM0MztcbiYjNDM7XHRmZCA9IHNucHJpbnRmKGxvd190aW1lX2ZpbGUsIHNpemVvZihsb3dfdGltZV9maWxlKSxcbiYjNDM7XHRcdCAgICAgIFwmIzM0OyVzL21lbWNnX2FzeW5jX2xvd190aW1lX1hYWFhYWFwmIzM0OywgdGVzdF9kaXIpO1xuJiM0MztcdGlmICghQVNTRVJUX0xUKGZkLCBzaXplb2YobG93X3RpbWVfZmlsZSksIFwmIzM0O2xvd190aW1lX2ZpbGUgcGF0aFwmIzM0OykpXG4mIzQzO1x0XHRyZXR1cm4gLTE7XG4mIzQzO1xuJiM0MztcdGZkID0gbWtzdGVtcChoaWdoX2RhdGFfZmlsZSk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfR0UoZmQsIDAsIFwmIzM0O21rc3RlbXBcJiMzNDspKVxuJiM0MztcdFx0cmV0dXJuIC0xO1xuJiM0MztcdGNsb3NlKGZkKTtcbiYjNDM7XG4mIzQzO1x0ZmQgPSBta3N0ZW1wKGxvd19kYXRhX2ZpbGUpO1xuJiM0MztcdGlmICghQVNTRVJUX0dFKGZkLCAwLCBcJiMzNDtta3N0ZW1wXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gY2xlYW51cF9oaWdoX2RhdGE7XG4mIzQzO1x0Y2xvc2UoZmQpO1xuJiM0MztcbiYjNDM7XHRmZCA9IG1rc3RlbXAoaGlnaF90aW1lX2ZpbGUpO1xuJiM0MztcdGlmICghQVNTRVJUX0dFKGZkLCAwLCBcJiMzNDtta3N0ZW1wXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gY2xlYW51cF9sb3dfZGF0YTtcbiYjNDM7XHRjbG9zZShmZCk7XG4mIzQzO1xuJiM0MztcdGZkID0gbWtzdGVtcChsb3dfdGltZV9maWxlKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9HRShmZCwgMCwgXCYjMzQ7bWtzdGVtcFwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIGNsZWFudXBfaGlnaF90aW1lO1xuJiM0MztcdGNsb3NlKGZkKTtcbiYjNDM7XG4mIzQzO1x0bG93X3BpZCA9IGZvcmsoKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9HRShsb3dfcGlkLCAwLCBcJiMzNDtmb3JrIGxvd1wmIzM0OykpXG4mIzQzO1x0XHRnb3RvIGNsZWFudXBfbG93X3RpbWU7XG4mIzQzO1x0aWYgKGxvd19waWQgPT0gMClcbiYjNDM7XHRcdGV4aXQocmVhbF90ZXN0X2NoaWxkX3dvcmsoQ0dfTE9XX0RJUiwgbG93X2RhdGFfZmlsZSxcbiYjNDM7XHRcdFx0XHRcdCAgbG93X3RpbWVfZmlsZSwgcmVhZF90aW1lcykpO1xuJiM0MztcbiYjNDM7XHRoaWdoX3BpZCA9IGZvcmsoKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9HRShoaWdoX3BpZCwgMCwgXCYjMzQ7Zm9yayBoaWdoXCYjMzQ7KSkge1xuJiM0MztcdFx0KHZvaWQpd2FpdHBpZChsb3dfcGlkLCBOVUxMLCAwKTtcbiYjNDM7XHRcdGdvdG8gY2xlYW51cF9sb3dfdGltZTtcbiYjNDM7XHR9XG4mIzQzO1x0aWYgKGhpZ2hfcGlkID09IDApXG4mIzQzO1x0XHRleGl0KHJlYWxfdGVzdF9jaGlsZF93b3JrKENHX0hJR0hfRElSLCBoaWdoX2RhdGFfZmlsZSxcbiYjNDM7XHRcdFx0XHRcdCAgaGlnaF90aW1lX2ZpbGUsIHJlYWRfdGltZXMpKTtcbiYjNDM7XG4mIzQzO1x0cmV0ID0gd2FpdHBpZChsb3dfcGlkLCBcdTAwMjZzdGF0dXMsIDApO1xuJiM0MztcdGlmICghQVNTRVJUX0dUKHJldCwgMCwgXCYjMzQ7bG93IHdhaXRwaWRcJiMzNDspKVxuJiM0MztcdFx0Z290byBjbGVhbnVwX2xvd190aW1lO1xuJiM0MztcdGlmICghQVNTRVJUX1RSVUUoV0lGRVhJVEVEKHN0YXR1cyksIFwmIzM0O2xvdyBleGl0ZWRcJiMzNDspKVxuJiM0MztcdFx0Z290byBjbGVhbnVwX2xvd190aW1lO1xuJiM0MztcdGlmICghQVNTRVJUX0VRKFdFWElUU1RBVFVTKHN0YXR1cyksIDAsIFwmIzM0O2xvdyBleGl0IHN0YXR1c1wmIzM0OykpXG4mIzQzO1x0XHRnb3RvIGNsZWFudXBfbG93X3RpbWU7XG4mIzQzO1xuJiM0MztcdHJldCA9IHdhaXRwaWQoaGlnaF9waWQsIFx1MDAyNnN0YXR1cywgMCk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfR1QocmV0LCAwLCBcJiMzNDtoaWdoIHdhaXRwaWRcJiMzNDspKVxuJiM0MztcdFx0Z290byBjbGVhbnVwX2xvd190aW1lO1xuJiM0MztcdGlmICghQVNTRVJUX1RSVUUoV0lGRVhJVEVEKHN0YXR1cyksIFwmIzM0O2hpZ2ggZXhpdGVkXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gY2xlYW51cF9sb3dfdGltZTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9FUShXRVhJVFNUQVRVUyhzdGF0dXMpLCAwLCBcJiMzNDtoaWdoIGV4aXQgc3RhdHVzXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gY2xlYW51cF9sb3dfdGltZTtcbiYjNDM7XG4mIzQzO1x0aWYgKGdldF90aW1lKGhpZ2hfdGltZV9maWxlLCBoaWdoX2VsYXBzZWQpKVxuJiM0MztcdFx0Z290byBjbGVhbnVwX2xvd190aW1lO1xuJiM0MztcdGlmIChnZXRfdGltZShsb3dfdGltZV9maWxlLCBsb3dfZWxhcHNlZCkpXG4mIzQzO1x0XHRnb3RvIGNsZWFudXBfbG93X3RpbWU7XG4mIzQzO1xuJiM0MztcdHJldCA9IDA7XG4mIzQzO1xuJiM0MztjbGVhbnVwX2xvd190aW1lOlxuJiM0MztcdHVubGluayhsb3dfdGltZV9maWxlKTtcbiYjNDM7Y2xlYW51cF9oaWdoX3RpbWU6XG4mIzQzO1x0dW5saW5rKGhpZ2hfdGltZV9maWxlKTtcbiYjNDM7Y2xlYW51cF9sb3dfZGF0YTpcbiYjNDM7XHR1bmxpbmsobG93X2RhdGFfZmlsZSk7XG4mIzQzO2NsZWFudXBfaGlnaF9kYXRhOlxuJiM0MztcdHVubGluayhoaWdoX2RhdGFfZmlsZSk7XG4mIzQzO1x0cmV0dXJuIHJldDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGludFxuJiM0MztzZXR1cF9icGYodTY0IGhpZ2hfY2dyb3VwX2lkLCB1NjQgbG93X2Nncm91cF9pZCxcbiYjNDM7XHQgIHN0cnVjdCBtZW1jZ19hc3luY19yZWNsYWltICoqc2tlbF9wdHIsIGJvb2wgdXNlX3RocmVhZF93cSlcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBtZW1jZ19hc3luY19yZWNsYWltICpza2VsO1xuJiM0MztcdHN0cnVjdCBicGZfYXJnc19zIGJwZl9hcmdzID0ge1xuJiM0MztcdFx0LmhpZ2hfY2dyb3VwX2lkID0gaGlnaF9jZ3JvdXBfaWQsXG4mIzQzO1x0XHQubG93X2Nncm91cF9pZCA9IGxvd19jZ3JvdXBfaWQsXG4mIzQzO1x0XHQuZXZlbnRfZGVsdGFfdGhyZXNob2xkID0gRVZFTlRfREVMVEFfVEhSRVNIT0xELFxuJiM0MztcdFx0LmNoZWNrX25zID0gQ0hFQ0tfUEVSSU9EX05TLFxuJiM0MztcdH07XG4mIzQzO1x0TElCQlBGX09QVFMoYnBmX3Rlc3RfcnVuX29wdHMsIHJ1bl9vcHRzLFxuJiM0MztcdFx0LmN0eF9pbiA9IFx1MDAyNmJwZl9hcmdzLFxuJiM0MztcdFx0LmN0eF9zaXplX2luID0gc2l6ZW9mKGJwZl9hcmdzKSk7XG4mIzQzO1x0aW50IHByb2dfaW5pdF9mZCwgZXJyO1xuJiM0MztcbiYjNDM7XHRza2VsID0gbWVtY2dfYXN5bmNfcmVjbGFpbV9fb3Blbl9hbmRfbG9hZCgpO1xuJiM0MztcdGlmICghQVNTRVJUX09LX1BUUihza2VsLCBcJiMzNDttZW1jZ19hc3luY19yZWNsYWltX19vcGVuX2FuZF9sb2FkXCYjMzQ7KSlcbiYjNDM7XHRcdHJldHVybiAtMTtcbiYjNDM7XG4mIzQzO1x0aWYgKHVzZV90aHJlYWRfd3EpXG4mIzQzO1x0XHRwcm9nX2luaXRfZmQgPSBicGZfcHJvZ3JhbV9fZmQoc2tlbC1cdTAwM2Vwcm9ncy50aHJlYWRfd3FfcHJvZ19pbml0KTtcbiYjNDM7XHRlbHNlXG4mIzQzO1x0XHRwcm9nX2luaXRfZmQgPSBicGZfcHJvZ3JhbV9fZmQoc2tlbC1cdTAwM2Vwcm9ncy53cV9wcm9nX2luaXQpO1xuJiM0MztcdGlmICghQVNTRVJUX0dFKHByb2dfaW5pdF9mZCwgMCwgXCYjMzQ7YnBmX3Byb2dyYW1fX2ZkXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gZXJyb3Jfb3V0O1xuJiM0MztcbiYjNDM7XHRlcnIgPSBicGZfcHJvZ190ZXN0X3J1bl9vcHRzKHByb2dfaW5pdF9mZCwgXHUwMDI2cnVuX29wdHMpO1xuJiM0MztcdGlmICghQVNTRVJUX09LKGVyciwgXCYjMzQ7YnBmX3Byb2dfdGVzdF9ydW5fb3B0c1wmIzM0OykpXG4mIzQzO1x0XHRnb3RvIGVycm9yX291dDtcbiYjNDM7XHRpZiAoIUFTU0VSVF9FUShydW5fb3B0cy5yZXR2YWwsIDAsIFwmIzM0O3Byb2dfaW5pdCByZXR2YWxcJiMzNDspKVxuJiM0MztcdFx0Z290byBlcnJvcl9vdXQ7XG4mIzQzO1xuJiM0MztcdCpza2VsX3B0ciA9IHNrZWw7XG4mIzQzO1x0cmV0dXJuIDA7XG4mIzQzO1xuJiM0MztlcnJvcl9vdXQ6XG4mIzQzO1x0bWVtY2dfYXN5bmNfcmVjbGFpbV9fZGVzdHJveShza2VsKTtcbiYjNDM7XHRyZXR1cm4gLTE7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3ZvaWQgdGVzdF9tZW1jZ193cV9hc3luY19yZWNsYWltKHZvaWQpXG4mIzQzO3tcbiYjNDM7XHR1NjQgaGlnaF9jZ3JvdXBfaWQsIGxvd19jZ3JvdXBfaWQ7XG4mIzQzO1x0aW50IGVycjtcbiYjNDM7XHRkb3VibGUgaGlnaF90aW1lID0gMC4wLCBsb3dfdGltZSA9IDAuMDtcbiYjNDM7XHRzdHJ1Y3QgbWVtY2dfYXN5bmNfcmVjbGFpbSAqc2tlbCA9IE5VTEw7XG4mIzQzO1xuJiM0MztcdGVyciA9IHNldHVwX2hpZ2hfbG93X2Nncm91cHMoXHUwMDI2aGlnaF9jZ3JvdXBfaWQsIFx1MDAyNmxvd19jZ3JvdXBfaWQpO1xuJiM0MztcdGlmICghQVNTRVJUX09LKGVyciwgXCYjMzQ7c2V0dXBfaGlnaF9sb3dfY2dyb3VwcyByZWNsYWltXCYjMzQ7KSlcbiYjNDM7XHRcdHJldHVybjtcbiYjNDM7XG4mIzQzO1x0ZXJyID0gc2V0dXBfYnBmKGhpZ2hfY2dyb3VwX2lkLCBsb3dfY2dyb3VwX2lkLCBcdTAwMjZza2VsLCBmYWxzZSk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0soZXJyLCBcJiMzNDtzZXR1cF9icGZcJiMzNDspKVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1xuJiM0MztcdGVyciA9IHJ1bl9oaWdoX2xvd193b3JrbG9hZChcdTAwMjZoaWdoX3RpbWUsIFx1MDAyNmxvd190aW1lLCBSRUFEX1RJTUVTKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PSyhlcnIsIFwmIzM0O3J1bl9oaWdoX2xvd193b3JrbG9hZCByZWNsYWltXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcbiYjNDM7XHRpZiAoaGlnaF90aW1lIFx1MDAzZT0gbG93X3RpbWUpIHtcbiYjNDM7XHRcdFBSSU5UX0ZBSUwoXCYjMzQ7aGlnaCBjZ3JvdXAgbm90IGltcHJvdmVkIHdpdGggYXN5bmMgcmVjbGFpbTogaGlnaF90aW1lPSVmIGxvd190aW1lPSVmXCYjMzQ7LFxuJiM0MztcdFx0XHQgICBoaWdoX3RpbWUsIGxvd190aW1lKTtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztvdXQ6XG4mIzQzO1x0aWYgKHNrZWwpXG4mIzQzO1x0XHRtZW1jZ19hc3luY19yZWNsYWltX19kZXN0cm95KHNrZWwpO1xuJiM0MztcdC8qXG4mIzQzO1x0ICogV2FpdCBmb3IgYnBmX3dxIHRvIHJlbGVhc2UgdGhlIHJlZmVyZW5jZSB0byBjZ3JvdXBcbiYjNDM7XHQgKiB0byBlbnN1cmUgdGhlIHN1Y2Nlc3NmdWwgZGVsZXRpb24gb2YgY2dyb3VwLlxuJiM0MztcdCAqL1xuJiM0MztcdHNsZWVwKDEpO1xuJiM0MztcdGNsZWFudXBfY2dyb3VwX2Vudmlyb25tZW50KCk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3ZvaWQgdGVzdF9tZW1jZ190aHJlYWRfd3FfYXN5bmNfcmVjbGFpbSh2b2lkKVxuJiM0Mzt7XG4mIzQzO1x0dTY0IGhpZ2hfY2dyb3VwX2lkLCBsb3dfY2dyb3VwX2lkO1xuJiM0MztcdGludCBlcnI7XG4mIzQzO1x0ZG91YmxlIGhpZ2hfdGltZSA9IDAuMCwgbG93X3RpbWUgPSAwLjA7XG4mIzQzO1x0c3RydWN0IG1lbWNnX2FzeW5jX3JlY2xhaW0gKnNrZWwgPSBOVUxMO1xuJiM0MztcbiYjNDM7XHRlcnIgPSBzZXR1cF9oaWdoX2xvd19jZ3JvdXBzKFx1MDAyNmhpZ2hfY2dyb3VwX2lkLCBcdTAwMjZsb3dfY2dyb3VwX2lkKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PSyhlcnIsIFwmIzM0O3NldHVwX2hpZ2hfbG93X2Nncm91cHMgcmVjbGFpbVwmIzM0OykpXG4mIzQzO1x0XHRyZXR1cm47XG4mIzQzO1xuJiM0MztcdGVyciA9IHNldHVwX2JwZihoaWdoX2Nncm91cF9pZCwgbG93X2Nncm91cF9pZCwgXHUwMDI2c2tlbCwgdHJ1ZSk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0soZXJyLCBcJiMzNDtzZXR1cF9icGZcJiMzNDspKVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1xuJiM0MztcdGVyciA9IHJ1bl9oaWdoX2xvd193b3JrbG9hZChcdTAwMjZoaWdoX3RpbWUsIFx1MDAyNmxvd190aW1lLCBSRUFEX1RJTUVTKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PSyhlcnIsIFwmIzM0O3J1bl9oaWdoX2xvd193b3JrbG9hZCByZWNsYWltXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcbiYjNDM7XHRpZiAoaGlnaF90aW1lIFx1MDAzZT0gbG93X3RpbWUpIHtcbiYjNDM7XHRcdFBSSU5UX0ZBSUwoXCYjMzQ7aGlnaCBjZ3JvdXAgbm90IGltcHJvdmVkIHdpdGggYXN5bmMgcmVjbGFpbTogaGlnaF90aW1lPSVmIGxvd190aW1lPSVmXCYjMzQ7LFxuJiM0MztcdFx0XHQgICBoaWdoX3RpbWUsIGxvd190aW1lKTtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztvdXQ6XG4mIzQzO1x0aWYgKHNrZWwpXG4mIzQzO1x0XHRtZW1jZ19hc3luY19yZWNsYWltX19kZXN0cm95KHNrZWwpO1xuJiM0MztcdC8qXG4mIzQzO1x0ICogV2FpdCBmb3IgYnBmX3RocmVhZF93cSB0byByZWxlYXNlIHRoZSByZWZlcmVuY2UgdG8gY2dyb3VwXG4mIzQzO1x0ICogdG8gZW5zdXJlIHRoZSBzdWNjZXNzZnVsIGRlbGV0aW9uIG9mIGNncm91cC5cbiYjNDM7XHQgKi9cbiYjNDM7XHRzbGVlcCgxKTtcbiYjNDM7XHRjbGVhbnVwX2Nncm91cF9lbnZpcm9ubWVudCgpO1xuJiM0Mzt9XG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvdGhyZWFkX3dxX2Nncm91cC5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvdGhyZWFkX3dxX2Nncm91cC5jXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uNzUzN2IwM2YxN2UyYVxuLS0tIC9kZXYvbnVsbFxuJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvdGhyZWFkX3dxX2Nncm91cC5jXG5AQCAtMCwwICYjNDM7MSw4NyBAQFxuJiM0MzsvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxuJiM0MzsjaW5jbHVkZSBcdTAwM2N0ZXN0X3Byb2dzLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjdW5pc3RkLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXCYjMzQ7Y2dyb3VwX2hlbHBlcnMuaFwmIzM0O1xuJiM0MzsjaW5jbHVkZSBcJiMzNDt0aHJlYWRfd3FfY2dyb3VwLnNrZWwuaFwmIzM0O1xuJiM0MztcbiYjNDM7I2RlZmluZSBURVNUX0NHUk9VUCBcJiMzNDsvdGhyZWFkX3dxX3Rlc3RcJiMzNDtcbiYjNDM7I2RlZmluZSBXQUlUX1RJTUVPVVRfU0VDUyAzMFxuJiM0MztcbiYjNDM7dm9pZCB0ZXN0X3RocmVhZF93cV9jZ3JvdXAodm9pZClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCB0aHJlYWRfd3FfY2dyb3VwICpza2VsID0gTlVMTDtcbiYjNDM7XHRpbnQgZXJyLCBwcm9nX2ZkLCBjZ19mZCA9IC0xO1xuJiM0MztcdHVuc2lnbmVkIGxvbmcgbG9uZyBjZ19pZDtcbiYjNDM7XHRpbnQgd2FpdGVkX3NlY3M7XG4mIzQzO1xuJiM0MztcdExJQkJQRl9PUFRTKGJwZl90ZXN0X3J1bl9vcHRzLCB0b3B0cyk7XG4mIzQzO1xuJiM0MztcdGVyciA9IHNldHVwX2Nncm91cF9lbnZpcm9ubWVudCgpO1xuJiM0MztcdGlmICghQVNTRVJUX09LKGVyciwgXCYjMzQ7c2V0dXBfY2dyb3VwX2Vudmlyb25tZW50XCYjMzQ7KSlcbiYjNDM7XHRcdHJldHVybjtcbiYjNDM7XHRjZ19mZCA9IGNyZWF0ZV9hbmRfZ2V0X2Nncm91cChURVNUX0NHUk9VUCk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfR0UoY2dfZmQsIDAsIFwmIzM0O2NyZWF0ZV9hbmRfZ2V0X2Nncm91cFwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIGNsZWFudXA7XG4mIzQzO1x0Y2dfaWQgPSBnZXRfY2dyb3VwX2lkKFRFU1RfQ0dST1VQKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9HVChjZ19pZCwgMFVMTCwgXCYjMzQ7Z2V0X2Nncm91cF9pZFwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIGNsZWFudXA7XG4mIzQzO1xuJiM0MztcdHNrZWwgPSB0aHJlYWRfd3FfY2dyb3VwX19vcGVuX2FuZF9sb2FkKCk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0tfUFRSKHNrZWwsIFwmIzM0O29wZW5fYW5kX2xvYWRcJiMzNDspKVxuJiM0MztcdFx0Z290byBjbGVhbnVwO1xuJiM0MztcbiYjNDM7XHRwcm9nX2ZkID0gYnBmX3Byb2dyYW1fX2ZkKHNrZWwtXHUwMDNlcHJvZ3Muc3RhcnRfdGhyZWFkX3dxKTtcbiYjNDM7XG4mIzQzO1x0LyogUnVuIGJwZl90aHJlYWRfd3EgaW4gdGhlIHNwZWNpZmllZCBjZ3JvdXAuICovXG4mIzQzO1x0c2tlbC1cdTAwM2Vic3MtXHUwMDNldGVzdF9rZXkgPSAwO1xuJiM0MztcdHNrZWwtXHUwMDNlYnNzLVx1MDAzZXRhcmdldF9jZ3JvdXBfaWQgPSBjZ19pZDtcbiYjNDM7XHRza2VsLVx1MDAzZWJzcy1cdTAwM2VjYWxsYmFja19jZ3JvdXBfaWQgPSAwO1xuJiM0MztcdHNrZWwtXHUwMDNlYnNzLVx1MDAzZXR3cV9kb25lID0gMDtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PSyhicGZfcHJvZ190ZXN0X3J1bl9vcHRzKHByb2dfZmQsIFx1MDAyNnRvcHRzKSxcbiYjNDM7XHRcdCAgICAgICBcJiMzNDticGZfcHJvZ190ZXN0X3J1bl9vcHRzIGluIGNncm91cFwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIGNsZWFudXA7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0sodG9wdHMucmV0dmFsLCBcJiMzNDtyZXR2YWwgaW4gY2dyb3VwXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gY2xlYW51cDtcbiYjNDM7XHRmb3IgKHdhaXRlZF9zZWNzID0gMDsgd2FpdGVkX3NlY3MgXHUwMDNjIFdBSVRfVElNRU9VVF9TRUNTOyB3YWl0ZWRfc2VjcyYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdGlmIChza2VsLVx1MDAzZWJzcy1cdTAwM2V0d3FfZG9uZSlcbiYjNDM7XHRcdFx0YnJlYWs7XG4mIzQzO1x0XHRzbGVlcCgxKTtcbiYjNDM7XHR9XG4mIzQzO1x0aWYgKCFBU1NFUlRfVFJVRShza2VsLVx1MDAzZWJzcy1cdTAwM2V0d3FfZG9uZSwgXCYjMzQ7dHdxX2RvbmUgaW4gY2dyb3VwXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gY2xlYW51cDtcbiYjNDM7XHRpZiAoIUFTU0VSVF9FUShza2VsLVx1MDAzZWJzcy1cdTAwM2VjYWxsYmFja19jZ3JvdXBfaWQsIGNnX2lkLFxuJiM0MztcdFx0ICAgICAgIFwmIzM0O2NhbGxiYWNrX2Nncm91cF9pZCBpbiBjZ3JvdXBcJiMzNDspKVxuJiM0MztcdFx0Z290byBjbGVhbnVwO1xuJiM0MztcbiYjNDM7XHQvKiBSdW4gYnBmX3RocmVhZF93cSB3aXRob3V0IGNncm91cCBhdHRhY2htZW50IChjZ3JvdXBfaWQgPSAwKS4gKi9cbiYjNDM7XHRMSUJCUEZfT1BUU19SRVNFVCh0b3B0cyk7XG4mIzQzO1x0c2tlbC1cdTAwM2Vic3MtXHUwMDNldGVzdF9rZXkgPSAxO1xuJiM0MztcdHNrZWwtXHUwMDNlYnNzLVx1MDAzZXRhcmdldF9jZ3JvdXBfaWQgPSAwO1xuJiM0MztcdHNrZWwtXHUwMDNlYnNzLVx1MDAzZWNhbGxiYWNrX2Nncm91cF9pZCA9IDA7XG4mIzQzO1x0c2tlbC1cdTAwM2Vic3MtXHUwMDNldHdxX2RvbmUgPSAwO1xuJiM0MztcdGlmICghQVNTRVJUX09LKGJwZl9wcm9nX3Rlc3RfcnVuX29wdHMocHJvZ19mZCwgXHUwMDI2dG9wdHMpLFxuJiM0MztcdFx0ICAgICAgIFwmIzM0O2JwZl9wcm9nX3Rlc3RfcnVuX29wdHMgd2l0aG91dCBjZ3JvdXBcJiMzNDspKVxuJiM0MztcdFx0Z290byBjbGVhbnVwO1xuJiM0MztcdGlmICghQVNTRVJUX09LKHRvcHRzLnJldHZhbCwgXCYjMzQ7cmV0dmFsIHdpdGhvdXQgY2dyb3VwXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gY2xlYW51cDtcbiYjNDM7XHRmb3IgKHdhaXRlZF9zZWNzID0gMDsgd2FpdGVkX3NlY3MgXHUwMDNjIFdBSVRfVElNRU9VVF9TRUNTOyB3YWl0ZWRfc2VjcyYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdGlmIChza2VsLVx1MDAzZWJzcy1cdTAwM2V0d3FfZG9uZSlcbiYjNDM7XHRcdFx0YnJlYWs7XG4mIzQzO1x0XHRzbGVlcCgxKTtcbiYjNDM7XHR9XG4mIzQzO1x0aWYgKCFBU1NFUlRfVFJVRShza2VsLVx1MDAzZWJzcy1cdTAwM2V0d3FfZG9uZSwgXCYjMzQ7dHdxX2RvbmUgd2l0aG91dCBjZ3JvdXBcJiMzNDspKVxuJiM0MztcdFx0Z290byBjbGVhbnVwO1xuJiM0MztcdGlmICghQVNTRVJUX05FUShza2VsLVx1MDAzZWJzcy1cdTAwM2VjYWxsYmFja19jZ3JvdXBfaWQsIGNnX2lkLFxuJiM0MztcdFx0XHRcJiMzNDtjYWxsYmFja19jZ3JvdXBfaWQgd2l0aG91dCBjZ3JvdXBcJiMzNDspKVxuJiM0MztcdFx0Z290byBjbGVhbnVwO1xuJiM0MztcbiYjNDM7Y2xlYW51cDpcbiYjNDM7XHRpZiAoc2tlbCkge1xuJiM0MztcdFx0dGhyZWFkX3dxX2Nncm91cF9fZGVzdHJveShza2VsKTtcbiYjNDM7XHRcdC8qIFdhaXQgdGhyZWFkX3dxIGt0aHJlYWQgcXVpdC4gKi9cbiYjNDM7XHRcdHNsZWVwKDIpO1xuJiM0MztcdH1cbiYjNDM7XHRpZiAoY2dfZmQgXHUwMDNlPSAwKVxuJiM0MztcdFx0Y2xvc2UoY2dfZmQpO1xuJiM0MztcdGNsZWFudXBfY2dyb3VwX2Vudmlyb25tZW50KCk7XG4mIzQzO31cbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvbWVtY2dfYXN5bmNfcmVjbGFpbS5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL21lbWNnX2FzeW5jX3JlY2xhaW0uY1xubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAuLmVhY2NjOGEzNzM4OGJcbi0tLSAvZGV2L251bGxcbiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9tZW1jZ19hc3luY19yZWNsYWltLmNcbkBAIC0wLDAgJiM0MzsxLDI1NSBAQFxuJiM0MzsvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxuJiM0MztcbiYjNDM7I2luY2x1ZGUgXCYjMzQ7dm1saW51eC5oXCYjMzQ7XG4mIzQzOyNpbmNsdWRlIFwmIzM0O2JwZl9leHBlcmltZW50YWwuaFwmIzM0O1xuJiM0MzsjaW5jbHVkZSBcdTAwM2NicGYvYnBmX2hlbHBlcnMuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NicGYvYnBmX3RyYWNpbmcuaFx1MDAzZVxuJiM0MztcbiYjNDM7I2RlZmluZSBCSVQobnIpXHRcdFx0KDFVTCBcdTAwM2NcdTAwM2MgKG5yKSlcbiYjNDM7XG4mIzQzOyNkZWZpbmUgX19fR0ZQX0lPXHRcdEJJVChfX19HRlBfSU9fQklUKVxuJiM0MzsjZGVmaW5lIF9fX0dGUF9GU1x0XHRCSVQoX19fR0ZQX0ZTX0JJVClcbiYjNDM7I2RlZmluZSBfX19HRlBfRElSRUNUX1JFQ0xBSU1cdEJJVChfX19HRlBfRElSRUNUX1JFQ0xBSU1fQklUKVxuJiM0MzsjZGVmaW5lIF9fX0dGUF9LU1dBUERfUkVDTEFJTVx0QklUKF9fX0dGUF9LU1dBUERfUkVDTEFJTV9CSVQpXG4mIzQzO1xuJiM0MzsjZGVmaW5lIF9fR0ZQX0lPXHRcdCgoZ2ZwX3QpX19fR0ZQX0lPKVxuJiM0MzsjZGVmaW5lIF9fR0ZQX0ZTXHRcdCgoZ2ZwX3QpX19fR0ZQX0ZTKVxuJiM0MzsjZGVmaW5lIF9fR0ZQX0RJUkVDVF9SRUNMQUlNXHQoKGdmcF90KV9fX0dGUF9ESVJFQ1RfUkVDTEFJTSlcbiYjNDM7I2RlZmluZSBfX0dGUF9LU1dBUERfUkVDTEFJTVx0KChnZnBfdClfX19HRlBfS1NXQVBEX1JFQ0xBSU0pXG4mIzQzOyNkZWZpbmUgX19HRlBfUkVDTEFJTVx0KChnZnBfdCkoX19fR0ZQX0RJUkVDVF9SRUNMQUlNIHwgX19fR0ZQX0tTV0FQRF9SRUNMQUlNKSlcbiYjNDM7XG4mIzQzOyNkZWZpbmUgR0ZQX0tFUk5FTFx0KF9fR0ZQX1JFQ0xBSU0gfCBfX0dGUF9JTyB8IF9fR0ZQX0ZTKVxuJiM0MzsjZGVmaW5lIENMT0NLX01PTk9UT05JQ19JRFx0MVxuJiM0MzsjZGVmaW5lIFJFQ0xBSU1fUEFHRVNcdFx0MzJcbiYjNDM7I2RlZmluZSBSRUNMQUlNX01BWF9JVEVSXHQzMlxuJiM0MztcbiYjNDM7c3RydWN0IGJwZl9hcmdzX3Mge1xuJiM0MztcdHU2NCBoaWdoX2Nncm91cF9pZDtcbiYjNDM7XHR1NjQgbG93X2Nncm91cF9pZDtcbiYjNDM7XHR1NjQgZXZlbnRfZGVsdGFfdGhyZXNob2xkO1xuJiM0MztcdHU2NCBjaGVja19ucztcbiYjNDM7fTtcbiYjNDM7XG4mIzQzO3N0cnVjdCBjZ3JvdXBfbWVtY2cge1xuJiM0MztcdHN0cnVjdCBjZ3JvdXAgKmNncnA7XG4mIzQzO1x0c3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnO1xuJiM0Mzt9O1xuJiM0MztcbiYjNDM7c3RhdGljIHU2NCB3cV9oaWdoX2Nncm91cF9pZDtcbiYjNDM7c3RhdGljIHU2NCB3cV9sb3dfY2dyb3VwX2lkO1xuJiM0MztcbiYjNDM7c3RhdGljIGludCBnZXRfY2dyb3VwX21lbWNnX2Zyb21faWQodTY0IGNncm91cF9pZCwgc3RydWN0IGNncm91cF9tZW1jZyAqY20pXG4mIzQzO3tcbiYjNDM7XHRjbS1cdTAwM2VjZ3JwID0gYnBmX2Nncm91cF9mcm9tX2lkKGNncm91cF9pZCk7XG4mIzQzO1x0aWYgKCFjbS1cdTAwM2VjZ3JwKVxuJiM0MztcdFx0cmV0dXJuIC0xO1xuJiM0MztcbiYjNDM7XHRjbS1cdTAwM2VtZW1jZyA9IGJwZl9nZXRfbWVtX2Nncm91cChcdTAwMjZjbS1cdTAwM2VjZ3JwLVx1MDAzZXNlbGYpO1xuJiM0MztcdGlmICghY20tXHUwMDNlbWVtY2cpIHtcbiYjNDM7XHRcdGJwZl9jZ3JvdXBfcmVsZWFzZShjbS1cdTAwM2VjZ3JwKTtcbiYjNDM7XHRcdHJldHVybiAtMTtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdHJldHVybiAwO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgdm9pZCBwdXRfY2dyb3VwX21lbWNnKHN0cnVjdCBjZ3JvdXBfbWVtY2cgKmNtKVxuJiM0Mzt7XG4mIzQzO1x0YnBmX3B1dF9tZW1fY2dyb3VwKGNtLVx1MDAzZW1lbWNnKTtcbiYjNDM7XHRicGZfY2dyb3VwX3JlbGVhc2UoY20tXHUwMDNlY2dycCk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBpbnQgZ2V0X2Nncm91cF9ldmVudCh1NjQgY2dyb3VwX2lkLCB1NjQgKnZhbClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBjZ3JvdXBfbWVtY2cgY207XG4mIzQzO1xuJiM0MztcdGlmIChnZXRfY2dyb3VwX21lbWNnX2Zyb21faWQoY2dyb3VwX2lkLCBcdTAwMjZjbSkpXG4mIzQzO1x0XHRyZXR1cm4gLTE7XG4mIzQzO1x0YnBmX21lbV9jZ3JvdXBfZmx1c2hfc3RhdHMoY20ubWVtY2cpO1xuJiM0MztcdCp2YWwgPSBicGZfbWVtX2Nncm91cF9wYWdlX3N0YXRlKGNtLm1lbWNnLCBXT1JLSU5HU0VUX1JFRkFVTFRfRklMRSk7XG4mIzQzO1x0cHV0X2Nncm91cF9tZW1jZyhcdTAwMjZjbSk7XG4mIzQzO1xuJiM0MztcdHJldHVybiAwO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgYm9vbFxuJiM0MztzaG91bGRfcmVjbGFpbV9jZ3JvdXAodTY0IGNncm91cF9pZCwgdTY0ICpwcmV2X2V2ZW50LCB1NjQgZXZlbnRfZGVsdGFfdGhyZXNob2xkKVxuJiM0Mzt7XG4mIzQzO1x0dTY0IGN1ciwgZGVsdGE7XG4mIzQzO1xuJiM0MztcdGlmIChnZXRfY2dyb3VwX2V2ZW50KGNncm91cF9pZCwgXHUwMDI2Y3VyKSlcbiYjNDM7XHRcdHJldHVybiBmYWxzZTtcbiYjNDM7XG4mIzQzO1x0ZGVsdGEgPSBjdXIgLSAqcHJldl9ldmVudDtcbiYjNDM7XHQqcHJldl9ldmVudCA9IGN1cjtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIGRlbHRhIFx1MDAzZT0gZXZlbnRfZGVsdGFfdGhyZXNob2xkO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgaW50IHJlY2xhaW1fY2dyb3VwKHU2NCBjZ3JvdXBfaWQpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgY2dyb3VwX21lbWNnIGNtO1xuJiM0MztcdGludCBpO1xuJiM0MztcbiYjNDM7XHRpZiAoZ2V0X2Nncm91cF9tZW1jZ19mcm9tX2lkKGNncm91cF9pZCwgXHUwMDI2Y20pKVxuJiM0MztcdFx0cmV0dXJuIDA7XG4mIzQzO1xuJiM0MztcdGZvciAoaSA9IDA7IGkgXHUwMDNjIFJFQ0xBSU1fTUFYX0lURVI7IGkmIzQzOyYjNDM7KSB7XG4mIzQzO1x0XHRpZiAoIWJwZl90cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKGNtLm1lbWNnLCBSRUNMQUlNX1BBR0VTLFxuJiM0MztcdFx0XHRcdFx0XHQgICAgICBHRlBfS0VSTkVMLCAwLCAtMSkpXG4mIzQzO1x0XHRcdGJyZWFrO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0cHV0X2Nncm91cF9tZW1jZyhcdTAwMjZjbSk7XG4mIzQzO1xuJiM0MztcdHJldHVybiAwO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdHJ1Y3Qgd3FfZWxlbSB7XG4mIzQzO1x0c3RydWN0IGJwZl90aW1lciB0aW1lcjtcbiYjNDM7XHRzdHJ1Y3QgYnBmX3dxIHdvcms7XG4mIzQzO1x0dTY0IHByZXZfZXZlbnQ7XG4mIzQzO1x0dTY0IGV2ZW50X2RlbHRhX3RocmVzaG9sZDtcbiYjNDM7XHR1NjQgY2hlY2tfbnM7XG4mIzQzO307XG4mIzQzO1xuJiM0MztzdHJ1Y3Qge1xuJiM0MztcdF9fdWludCh0eXBlLCBCUEZfTUFQX1RZUEVfQVJSQVkpO1xuJiM0MztcdF9fdWludChtYXhfZW50cmllcywgMSk7XG4mIzQzO1x0X190eXBlKGtleSwgX191MzIpO1xuJiM0MztcdF9fdHlwZSh2YWx1ZSwgc3RydWN0IHdxX2VsZW0pO1xuJiM0Mzt9IHdxX21hcCBTRUMoXCYjMzQ7Lm1hcHNcJiMzNDspO1xuJiM0MztcbiYjNDM7c3RhdGljIGludCBhc3luY19mcmVlKHZvaWQgKm1hcCwgaW50ICprZXksIHZvaWQgKnZhbHVlKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IHdxX2VsZW0gKmVsZW0gPSB2YWx1ZTtcbiYjNDM7XG4mIzQzO1x0aWYgKHNob3VsZF9yZWNsYWltX2Nncm91cCh3cV9oaWdoX2Nncm91cF9pZCwgXHUwMDI2ZWxlbS1cdTAwM2VwcmV2X2V2ZW50LFxuJiM0MztcdFx0ZWxlbS1cdTAwM2VldmVudF9kZWx0YV90aHJlc2hvbGQpKSB7XG4mIzQzO1x0XHRyZWNsYWltX2Nncm91cCh3cV9sb3dfY2dyb3VwX2lkKTtcbiYjNDM7XHRcdGJwZl93cV9zdGFydChcdTAwMjZlbGVtLVx1MDAzZXdvcmssIDApO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0cmV0dXJuIDA7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBpbnQgd3FfdGltZXJfY2Iodm9pZCAqbWFwLCBpbnQgKmtleSwgc3RydWN0IHdxX2VsZW0gKmVsZW0pXG4mIzQzO3tcbiYjNDM7XHRicGZfd3Ffc3RhcnQoXHUwMDI2ZWxlbS1cdTAwM2V3b3JrLCAwKTtcbiYjNDM7XHRicGZfdGltZXJfc3RhcnQoXHUwMDI2ZWxlbS1cdTAwM2V0aW1lciwgZWxlbS1cdTAwM2VjaGVja19ucywgMCk7XG4mIzQzO1xuJiM0MztcdHJldHVybiAwO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztTRUMoXCYjMzQ7c3lzY2FsbFwmIzM0OylcbiYjNDM7aW50IHdxX3Byb2dfaW5pdChzdHJ1Y3QgYnBmX2FyZ3NfcyAqY3R4KVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IHdxX2VsZW0gKmVsZW07XG4mIzQzO1x0X191MzIga2V5ID0gMDtcbiYjNDM7XHRpbnQgcmV0O1xuJiM0MztcbiYjNDM7XHRlbGVtID0gYnBmX21hcF9sb29rdXBfZWxlbShcdTAwMjZ3cV9tYXAsIFx1MDAyNmtleSk7XG4mIzQzO1x0aWYgKCFlbGVtKVxuJiM0MztcdFx0cmV0dXJuIC0xO1xuJiM0MztcbiYjNDM7XHRyZXQgPSBicGZfd3FfaW5pdChcdTAwMjZlbGVtLVx1MDAzZXdvcmssIFx1MDAyNndxX21hcCwgMCk7XG4mIzQzO1x0aWYgKHJldClcbiYjNDM7XHRcdHJldHVybiByZXQ7XG4mIzQzO1xuJiM0MztcdHJldCA9IGJwZl93cV9zZXRfY2FsbGJhY2soXHUwMDI2ZWxlbS1cdTAwM2V3b3JrLCBhc3luY19mcmVlLCAwKTtcbiYjNDM7XHRpZiAocmV0KVxuJiM0MztcdFx0cmV0dXJuIHJldDtcbiYjNDM7XG4mIzQzO1x0cmV0ID0gYnBmX3RpbWVyX2luaXQoXHUwMDI2ZWxlbS1cdTAwM2V0aW1lciwgXHUwMDI2d3FfbWFwLCBDTE9DS19NT05PVE9OSUNfSUQpO1xuJiM0MztcdGlmIChyZXQpXG4mIzQzO1x0XHRyZXR1cm4gcmV0O1xuJiM0MztcbiYjNDM7XHRyZXQgPSBicGZfdGltZXJfc2V0X2NhbGxiYWNrKFx1MDAyNmVsZW0tXHUwMDNldGltZXIsIHdxX3RpbWVyX2NiKTtcbiYjNDM7XHRpZiAocmV0KVxuJiM0MztcdFx0cmV0dXJuIHJldDtcbiYjNDM7XG4mIzQzO1x0ZWxlbS1cdTAwM2VwcmV2X2V2ZW50ID0gMDtcbiYjNDM7XHRlbGVtLVx1MDAzZWV2ZW50X2RlbHRhX3RocmVzaG9sZCA9IGN0eC1cdTAwM2VldmVudF9kZWx0YV90aHJlc2hvbGQ7XG4mIzQzO1x0ZWxlbS1cdTAwM2VjaGVja19ucyA9IGN0eC1cdTAwM2VjaGVja19ucztcbiYjNDM7XG4mIzQzO1x0d3FfaGlnaF9jZ3JvdXBfaWQgPSBjdHgtXHUwMDNlaGlnaF9jZ3JvdXBfaWQ7XG4mIzQzO1x0d3FfbG93X2Nncm91cF9pZCA9IGN0eC1cdTAwM2Vsb3dfY2dyb3VwX2lkO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gYnBmX3RpbWVyX3N0YXJ0KFx1MDAyNmVsZW0tXHUwMDNldGltZXIsIGVsZW0tXHUwMDNlY2hlY2tfbnMsIDApO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdHJ1Y3QgdGhyZWFkX3dxX2VsZW0ge1xuJiM0MztcdHN0cnVjdCBicGZfdGltZXIgdGltZXI7XG4mIzQzO1x0c3RydWN0IGJwZl90aHJlYWRfd3Egd29yaztcbiYjNDM7XHR1NjQgcHJldl9ldmVudDtcbiYjNDM7XHR1NjQgZXZlbnRfZGVsdGFfdGhyZXNob2xkO1xuJiM0MztcdHU2NCBjaGVja19ucztcbiYjNDM7fTtcbiYjNDM7XG4mIzQzO3N0cnVjdCB7XG4mIzQzO1x0X191aW50KHR5cGUsIEJQRl9NQVBfVFlQRV9BUlJBWSk7XG4mIzQzO1x0X191aW50KG1heF9lbnRyaWVzLCAxKTtcbiYjNDM7XHRfX3R5cGUoa2V5LCBfX3UzMik7XG4mIzQzO1x0X190eXBlKHZhbHVlLCBzdHJ1Y3QgdGhyZWFkX3dxX2VsZW0pO1xuJiM0Mzt9IHRocmVhZF93cV9tYXAgU0VDKFwmIzM0Oy5tYXBzXCYjMzQ7KTtcbiYjNDM7XG4mIzQzO3N0YXRpYyBpbnQgdGhyZWFkX2FzeW5jX2ZyZWUodm9pZCAqbWFwLCBpbnQgKmtleSwgdm9pZCAqdmFsdWUpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgdGhyZWFkX3dxX2VsZW0gKmVsZW0gPSB2YWx1ZTtcbiYjNDM7XG4mIzQzO1x0aWYgKHNob3VsZF9yZWNsYWltX2Nncm91cCh3cV9oaWdoX2Nncm91cF9pZCwgXHUwMDI2ZWxlbS1cdTAwM2VwcmV2X2V2ZW50LFxuJiM0MztcdFx0ZWxlbS1cdTAwM2VldmVudF9kZWx0YV90aHJlc2hvbGQpKSB7XG4mIzQzO1x0XHRyZWNsYWltX2Nncm91cCh3cV9sb3dfY2dyb3VwX2lkKTtcbiYjNDM7XHRcdGJwZl90aHJlYWRfd3Ffc3RhcnQoXHUwMDI2ZWxlbS1cdTAwM2V3b3JrLCAwKTtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdHJldHVybiAwO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgaW50IHRocmVhZF93cV90aW1lcl9jYih2b2lkICptYXAsIGludCAqa2V5LCBzdHJ1Y3QgdGhyZWFkX3dxX2VsZW0gKmVsZW0pXG4mIzQzO3tcbiYjNDM7XHRicGZfdGhyZWFkX3dxX3N0YXJ0KFx1MDAyNmVsZW0tXHUwMDNld29yaywgMCk7XG4mIzQzO1x0YnBmX3RpbWVyX3N0YXJ0KFx1MDAyNmVsZW0tXHUwMDNldGltZXIsIGVsZW0tXHUwMDNlY2hlY2tfbnMsIDApO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7U0VDKFwmIzM0O3N5c2NhbGxcJiMzNDspXG4mIzQzO2ludCB0aHJlYWRfd3FfcHJvZ19pbml0KHN0cnVjdCBicGZfYXJnc19zICpjdHgpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgdGhyZWFkX3dxX2VsZW0gKmVsZW07XG4mIzQzO1x0X191MzIga2V5ID0gMDtcbiYjNDM7XHRpbnQgcmV0O1xuJiM0MztcbiYjNDM7XHRlbGVtID0gYnBmX21hcF9sb29rdXBfZWxlbShcdTAwMjZ0aHJlYWRfd3FfbWFwLCBcdTAwMjZrZXkpO1xuJiM0MztcdGlmICghZWxlbSlcbiYjNDM7XHRcdHJldHVybiAtMTtcbiYjNDM7XG4mIzQzO1x0cmV0ID0gYnBmX3RocmVhZF93cV9pbml0KFx1MDAyNmVsZW0tXHUwMDNld29yaywgXHUwMDI2dGhyZWFkX3dxX21hcCxcbiYjNDM7XHRcdFx0XHQgY3R4LVx1MDAzZWxvd19jZ3JvdXBfaWQsIDApO1xuJiM0MztcdGlmIChyZXQpXG4mIzQzO1x0XHRyZXR1cm4gcmV0O1xuJiM0MztcbiYjNDM7XHRyZXQgPSBicGZfdGhyZWFkX3dxX3NldF9jYWxsYmFjayhcdTAwMjZlbGVtLVx1MDAzZXdvcmssIHRocmVhZF9hc3luY19mcmVlLCAwKTtcbiYjNDM7XHRpZiAocmV0KVxuJiM0MztcdFx0cmV0dXJuIHJldDtcbiYjNDM7XG4mIzQzO1x0cmV0ID0gYnBmX3RpbWVyX2luaXQoXHUwMDI2ZWxlbS1cdTAwM2V0aW1lciwgXHUwMDI2dGhyZWFkX3dxX21hcCwgQ0xPQ0tfTU9OT1RPTklDX0lEKTtcbiYjNDM7XHRpZiAocmV0KVxuJiM0MztcdFx0cmV0dXJuIHJldDtcbiYjNDM7XG4mIzQzO1x0cmV0ID0gYnBmX3RpbWVyX3NldF9jYWxsYmFjayhcdTAwMjZlbGVtLVx1MDAzZXRpbWVyLCB0aHJlYWRfd3FfdGltZXJfY2IpO1xuJiM0MztcdGlmIChyZXQpXG4mIzQzO1x0XHRyZXR1cm4gcmV0O1xuJiM0MztcbiYjNDM7XHRlbGVtLVx1MDAzZXByZXZfZXZlbnQgPSAwO1xuJiM0MztcdGVsZW0tXHUwMDNlZXZlbnRfZGVsdGFfdGhyZXNob2xkID0gY3R4LVx1MDAzZWV2ZW50X2RlbHRhX3RocmVzaG9sZDtcbiYjNDM7XHRlbGVtLVx1MDAzZWNoZWNrX25zID0gY3R4LVx1MDAzZWNoZWNrX25zO1xuJiM0MztcbiYjNDM7XHR3cV9oaWdoX2Nncm91cF9pZCA9IGN0eC1cdTAwM2VoaWdoX2Nncm91cF9pZDtcbiYjNDM7XHR3cV9sb3dfY2dyb3VwX2lkID0gY3R4LVx1MDAzZWxvd19jZ3JvdXBfaWQ7XG4mIzQzO1xuJiM0MztcdHJldHVybiBicGZfdGltZXJfc3RhcnQoXHUwMDI2ZWxlbS1cdTAwM2V0aW1lciwgZWxlbS1cdTAwM2VjaGVja19ucywgMCk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO2NoYXIgTElDRU5TRVtdIFNFQyhcJiMzNDtsaWNlbnNlXCYjMzQ7KSA9IFwmIzM0O0dQTFwmIzM0OztcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvdGhyZWFkX3dxX2Nncm91cC5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL3RocmVhZF93cV9jZ3JvdXAuY1xubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAuLmM3MGEzN2Y1NTM5N2Rcbi0tLSAvZGV2L251bGxcbiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy90aHJlYWRfd3FfY2dyb3VwLmNcbkBAIC0wLDAgJiM0MzsxLDU2IEBAXG4mIzQzOy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXG4mIzQzOy8qIENvcHlyaWdodCAoYykgMjAyNiAqL1xuJiM0MztcbiYjNDM7I2luY2x1ZGUgXCYjMzQ7YnBmX2V4cGVyaW1lbnRhbC5oXCYjMzQ7XG4mIzQzOyNpbmNsdWRlIFx1MDAzY2JwZi9icGZfaGVscGVycy5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFwmIzM0O2JwZl9taXNjLmhcJiMzNDtcbiYjNDM7XG4mIzQzO2NoYXIgX2xpY2Vuc2VbXSBTRUMoXCYjMzQ7bGljZW5zZVwmIzM0OykgPSBcJiMzNDtHUExcJiMzNDs7XG4mIzQzO1xuJiM0MztzdHJ1Y3QgZWxlbSB7XG4mIzQzO1x0c3RydWN0IGJwZl90aHJlYWRfd3EgdHdxO1xuJiM0Mzt9O1xuJiM0MztcbiYjNDM7c3RydWN0IHtcbiYjNDM7XHRfX3VpbnQodHlwZSwgQlBGX01BUF9UWVBFX0FSUkFZKTtcbiYjNDM7XHRfX3VpbnQobWF4X2VudHJpZXMsIDIpO1xuJiM0MztcdF9fdHlwZShrZXksIGludCk7XG4mIzQzO1x0X190eXBlKHZhbHVlLCBzdHJ1Y3QgZWxlbSk7XG4mIzQzO30gbWFwX2FyciBTRUMoXCYjMzQ7Lm1hcHNcJiMzNDspO1xuJiM0MztcbiYjNDM7X191NjQgdGFyZ2V0X2Nncm91cF9pZDtcbiYjNDM7X191NjQgY2FsbGJhY2tfY2dyb3VwX2lkO1xuJiM0MztpbnQgdHdxX2RvbmU7XG4mIzQzO2ludCB0ZXN0X2tleTtcbiYjNDM7XG4mIzQzO3N0YXRpYyBpbnQgdHdxX2NhbGxiYWNrKHZvaWQgKm1hcCwgaW50ICprZXksIHZvaWQgKnZhbHVlKVxuJiM0Mzt7XG4mIzQzO1x0Y2FsbGJhY2tfY2dyb3VwX2lkID0gYnBmX2dldF9jdXJyZW50X2Nncm91cF9pZCgpO1xuJiM0MztcdHR3cV9kb25lID0gMTtcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7U0VDKFwmIzM0O3N5c2NhbGxcJiMzNDspXG4mIzQzO2ludCBzdGFydF90aHJlYWRfd3Eodm9pZCAqY3R4KVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IGVsZW0gKnZhbDtcbiYjNDM7XHRpbnQga2V5ID0gdGVzdF9rZXk7XG4mIzQzO1x0aW50IHJldDtcbiYjNDM7XG4mIzQzO1x0dmFsID0gYnBmX21hcF9sb29rdXBfZWxlbShcdTAwMjZtYXBfYXJyLCBcdTAwMjZrZXkpO1xuJiM0MztcdGlmICghdmFsKVxuJiM0MztcdFx0cmV0dXJuIC0xO1xuJiM0MztcbiYjNDM7XHRyZXQgPSBicGZfdGhyZWFkX3dxX2luaXQoXHUwMDI2dmFsLVx1MDAzZXR3cSwgXHUwMDI2bWFwX2FyciwgdGFyZ2V0X2Nncm91cF9pZCwgMCk7XG4mIzQzO1x0aWYgKHJldClcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcbiYjNDM7XHRyZXQgPSBicGZfdGhyZWFkX3dxX3NldF9jYWxsYmFjayhcdTAwMjZ2YWwtXHUwMDNldHdxLCB0d3FfY2FsbGJhY2ssIDApO1xuJiM0MztcdGlmIChyZXQpXG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XG4mIzQzO1x0cmV0ID0gYnBmX3RocmVhZF93cV9zdGFydChcdTAwMjZ2YWwtXHUwMDNldHdxLCAwKTtcbiYjNDM7XG4mIzQzO291dDpcbiYjNDM7XHRyZXR1cm4gcmV0O1xuJiM0Mzt9XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Mi8xPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDcgMDg6NTA8L3RkPgoJCQk8dGQ+YWdlbnQ8L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+YmVzdC1leHBlbnNpdmU8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O01FTUNHJiMzNDssCiAgICAmIzM0O0NHUk9VUFMmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDticGZfdGhyZWFkX3dxX2luaXQmIzM0OywKICAgICYjMzQ7YnBmX3RocmVhZF93cV9zZXRfY2FsbGJhY2smIzM0OywKICAgICYjMzQ7YnBmX3RocmVhZF93cV9zdGFydCYjMzQ7LAogICAgJiMzNDticGZfdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcyYjMzQ7LAogICAgJiMzNDtjZ3JvdXBfa3RocmVhZF9hdHRhY2gmIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggaW50cm9kdWNlcyBhIG5ldyBCUEYgdGhyZWFkIHdvcmtxdWV1ZSBmZWF0dXJlIChgYnBmX3RocmVhZF93cWApIHRoYXQgYWxsb3dzIEJQRiBwcm9ncmFtcyB0byBzY2hlZHVsZSB3b3JrIGluIGEga3RocmVhZCBjb250ZXh0LCBvcHRpb25hbGx5IGF0dGFjaGVkIHRvIGEgY2dyb3VwLiBJdCBhbHNvIGFkZHMgYSBuZXcgQlBGIGtmdW5jIGBicGZfdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlc2AgZm9yIG1lbW9yeSBjZ3JvdXAgcmVjbGFpbS4gVGhlc2UgYXJlIGZ1bmN0aW9uYWwgY2hhbmdlcyB0byB0aGUgY29yZSBCUEYgYW5kIG1lbW9yeSBjb250cm9sIHN1YnN5c3RlbXMsIHJlYWNoYWJsZSBmcm9tIHVzZXJzcGFjZSB2aWEgQlBGIHByb2dyYW1zLCBhbmQgc2hvdWxkIGJlIGZ1enplZC4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPkluc3RydWN0aW9uOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+WW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIG1haW50YWluZXIuCllvdXIgam9iIGlzIHRvIHJldmlldyBhIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQgZGV0ZXJtaW5lCmlmIGl0IG1ha2VzIGZ1bmN0aW9uYWwgY2hhbmdlcyB0byB0aGUga2VybmVsIHRoYXQgc2hvdWxkIGJlIGZ1enplZC4KCklNUE9SVEFOVDogVGhlIGNoYW5nZXMgaGF2ZSBBTFJFQURZIGJlZW4gYXBwbGllZCBhbmQgY29tbWl0dGVkIGFzIHRoZSBIRUFEIGNvbW1pdCBpbgp5b3VyIHdvcmtzcGFjZS4gRG8gTk9UIHJlbHkgb24geW91ciBpbnRlcm5hbCBrbm93bGVkZ2Ugb2YgdGhlIGtlcm5lbC4gWW91IG11c3QgYWN0aXZlbHkKdXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gZXhhbWluZSB0aGUgYWN0dWFsIHNvdXJjZSBjb2RlIGFuZCBjb25maXJtIGFueSBhc3N1bXB0aW9ucy4KClJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgaWYgdGhlIHBhdGNoIG9ubHkgY29udGFpbnM6Ci0gTW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLywgS2NvbmZpZyBmaWxlcywgb3IgY29kZSBjb21tZW50cy4KLSBQdXJlbHkgZGVjb3JhdGl2ZSBjaGFuZ2VzLCBzdWNoIGFzIGxvZ2dpbmcgKGUuZy4sIHByX2VyciwgcHJpbnRrKSBvciB0cmFjZXBvaW50cy4KLSBDaGFuZ2VzIHRvIG51bWVyaWMgY29uc3RhbnRzIG9yIG1hY3JvcyB0aGF0IGRvIG5vdCBmdW5jdGlvbmFsbHkgYWx0ZXIgZXhlY3V0aW9uIGZsb3cuCi0gQ29kZSBwYXRocyB0aGF0IGFyZSBpbXBvc3NpYmxlIHRvIHJlYWNoIGluIHZpcnR1YWxpemVkIGVudmlyb25tZW50cyBsaWtlIEdDRSBvciBRRU1VLAogIGV2ZW4gd2hlbiB1dGlsaXppbmcgc29mdHdhcmUtZW11bGF0ZWQgaGFyZHdhcmUgKGUuZy4sIHVzYiBnYWRnZXQsIG1hYzgwMjExX2h3c2ltKS4KLSBDb2RlIGluIHZlbmRvci1zcGVjaWZpYyBQQ0llIHN3aXRjaCwgU21hcnROSUMsIG9yIEdQVSBkcml2ZXJzIChlLmcuLCBtbHhzdywgcGRzX2NvcmUsIHFlZCwKICBpb25pYywgYW1kZ3B1KSB0aGF0IHJlcXVpcmUgcGh5c2ljYWwgUENJZSBoYXJkd2FyZSBjYXJkcyBub3QgZW11bGF0ZWQgaW4gc3RhbmRhcmQgUUVNVS4KLSBEcml2ZXIgLnJlbW92ZSwgLnNodXRkb3duLCBvciBwY2lfdW5yZWdpc3Rlcl9kcml2ZXIgdGVhcmRvd24gY2FsbGJhY2tzIChlLmcuLCBpZ2JfcmVtb3ZlKQogIHRoYXQgYXJlIGV4ZWN1dGVkIG9ubHkgZHVyaW5nIFBDSSBob3QtdW5wbHVnIG9yIHN5c2ZzIGRyaXZlciB1bmJpbmQgb3BlcmF0aW9ucy4KCklmIGl0IG1vZGlmaWVzIHJlYWNoYWJsZSBjb3JlIGtlcm5lbCBsb2dpYywgZHJpdmVycywgb3IgYXJjaGl0ZWN0dXJlcywgdXNlIHlvdXIgY29kZSBzZWFyY2gKdG9vbHMgdG8gdmVyaWZ5IHRoZSBjb2RlIGNhbiBiZSBleGVjdXRlZCwgdGhlbiByZXR1cm4gV29ydGhGdXp6aW5nPXRydWUuCgpXaGVuIHJldHVybmluZyBXb3J0aEZ1enppbmc9dHJ1ZSwgeW91IE1VU1QgQUxTTzoKMS4gRXh0cmFjdCBhbnkgc3BlY2lmaWMga2VybmVsIGZ1bmN0aW9ucyB0aGF0IHNob3VsZCBiZSBoZWF2aWx5IGZ1enplZCBpbnRvIEZvY3VzU3ltYm9scy4KICAgQXZvaWQgbGlzdGluZyBnZW5lcmljIGhvdC1wYXRoIGZ1bmN0aW9ucyB0byBwcmV2ZW50IHNrZXdlZCB0ZXN0IGRpc3RyaWJ1dGlvbnMuCiAgIFByZWZlciBub24tc3RhdGljLCBub24taW5saW5lZCBBUEkgZW50cnlwb2ludCBmdW5jdGlvbnMgb3ZlciBpbnRlcm5hbCBzdGF0aWMgaGVscGVyIGZ1bmN0aW9ucwogICAod2hpY2ggYXJlIGlubGluZWQgYnkgdGhlIGNvbXBpbGVyIGFuZCBkbyBub3QgaGF2ZSBkaXN0aW5jdCBzeW1ib2wgYWRkcmVzc2VzKS4KMi4gSWRlbnRpZnkgYW55IHNwZWNpZmljIENPTkZJR18gb3B0aW9ucyByZXF1aXJlZCB0byBwcm9wZXJseSB0ZXN0IHRoaXMgbmV3L21vZGlmaWVkIGZlYXR1cmUuCiAgIEdvIGFuZCBsb29rIGludG8gdGhlIEtjb25maWcgZmlsZXMgYW5kIGNoZWNrIGZvciBpZmRlZnMgYXJvdW5kIHRoZSBjb2RlLCBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy4KICAgQWxzbyBjaGVjayAmIzM0O2RlcGVuZHMgb24mIzM0OyBsaW5lcyBpbiBLY29uZmlnIHRvIGluY2x1ZGUgYW55IG5vbi1zdGFuZGFyZCBwYXJlbnQgc3Vic3lzdGVtIGNvbmZpZ3MKICAgbmVlZGVkIGZvciBLYnVpbGQgdG8gY29tcGlsZSB0aGUgY29kZSBzdGF0aWNhbGx5IGludG8gdm1saW51eC4gTGlzdCB0aGVtIGluIHRoZSBFbmFibGVDb25maWdzCiAgIG91dHB1dCBhcnJheSwgYW5kIERPIE5PVCBhZGQgYSAmIzM5O0NPTkZJR18mIzM5OyBwcmVmaXggKGUuZy4sIHJldHVybiAmIzM0O05FVF9JUFY0JiMzNDsgaW5zdGVhZCBvZiAmIzM0O0NPTkZJR19ORVRfSVBWNCYjMzQ7KS4KUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuCgoKVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy4KSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuCklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC4KPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Qcm9tcHQ6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Gb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczoKY29tbWl0IGU3MmUyYzAwOGM5NTFmYTVkMDdhYmFhZDlkMzJlODc3ODc5ZTJlYTcKQXV0aG9yOiBzeXotY2x1c3RlciAmbHQ7dHJpYWdlQHN5emthbGxlci5jb20mZ3Q7CkRhdGU6ICAgRnJpIEF1ZyA3IDA4OjUwOjQwIDIwMjYgJiM0MzswMDAwCgogICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3CgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9icGYuaCBiL2luY2x1ZGUvbGludXgvYnBmLmgKaW5kZXggNzNiYWNmYzY0NDRkZi4uZDYzY2U4MzE5ODY5NiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9icGYuaAomIzQzOyYjNDM7JiM0MzsgYi9pbmNsdWRlL2xpbnV4L2JwZi5oCkBAIC0yMTMsNiAmIzQzOzIxMyw3IEBAIGVudW0gYnRmX2ZpZWxkX3R5cGUgewogCUJQRl9VUFRSICAgICAgID0gKDEgJmx0OyZsdDsgMTEpLAogCUJQRl9SRVNfU1BJTl9MT0NLID0gKDEgJmx0OyZsdDsgMTIpLAogCUJQRl9UQVNLX1dPUksgID0gKDEgJmx0OyZsdDsgMTMpLAomIzQzOwlCUEZfVEhSRUFEX1dRICA9ICgxICZsdDsmbHQ7IDE0KSwKIH07CiAKIGVudW0gYnBmX2Nncm91cF9zdG9yYWdlX3R5cGUgewpAQCAtMjY3LDYgJiM0MzsyNjgsNyBAQCBzdHJ1Y3QgYnRmX3JlY29yZCB7CiAJaW50IHdxX29mZjsKIAlpbnQgcmVmY291bnRfb2ZmOwogCWludCB0YXNrX3dvcmtfb2ZmOwomIzQzOwlpbnQgdGhyZWFkX3dxX29mZjsKIAlzdHJ1Y3QgYnRmX2ZpZWxkIGZpZWxkc1tdOwogfTsKIApAQCAtMzcyLDYgJiM0MzszNzQsOCBAQCBzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIgKmJ0Zl9maWVsZF90eXBlX25hbWUoZW51bSBidGZfZmllbGRfdHlwZSB0eXBlKQogCQlyZXR1cm4gJiMzNDticGZfcmVmY291bnQmIzM0OzsKIAljYXNlIEJQRl9UQVNLX1dPUks6CiAJCXJldHVybiAmIzM0O2JwZl90YXNrX3dvcmsmIzM0OzsKJiM0MzsJY2FzZSBCUEZfVEhSRUFEX1dROgomIzQzOwkJcmV0dXJuICYjMzQ7YnBmX3RocmVhZF93cSYjMzQ7OwogCWRlZmF1bHQ6CiAJCVdBUk5fT05fT05DRSgxKTsKIAkJcmV0dXJuICYjMzQ7dW5rbm93biYjMzQ7OwpAQCAtNDEyLDYgJiM0Mzs0MTYsOCBAQCBzdGF0aWMgaW5saW5lIHUzMiBidGZfZmllbGRfdHlwZV9zaXplKGVudW0gYnRmX2ZpZWxkX3R5cGUgdHlwZSkKIAkJcmV0dXJuIHNpemVvZihzdHJ1Y3QgYnBmX3JlZmNvdW50KTsKIAljYXNlIEJQRl9UQVNLX1dPUks6CiAJCXJldHVybiBzaXplb2Yoc3RydWN0IGJwZl90YXNrX3dvcmspOwomIzQzOwljYXNlIEJQRl9USFJFQURfV1E6CiYjNDM7CQlyZXR1cm4gc2l6ZW9mKHN0cnVjdCBicGZfdGhyZWFkX3dxKTsKIAlkZWZhdWx0OgogCQlXQVJOX09OX09OQ0UoMSk7CiAJCXJldHVybiAwOwpAQCAtNDQ2LDYgJiM0Mzs0NTIsOCBAQCBzdGF0aWMgaW5saW5lIHUzMiBidGZfZmllbGRfdHlwZV9hbGlnbihlbnVtIGJ0Zl9maWVsZF90eXBlIHR5cGUpCiAJCXJldHVybiBfX2FsaWdub2ZfXyhzdHJ1Y3QgYnBmX3JlZmNvdW50KTsKIAljYXNlIEJQRl9UQVNLX1dPUks6CiAJCXJldHVybiBfX2FsaWdub2ZfXyhzdHJ1Y3QgYnBmX3Rhc2tfd29yayk7CiYjNDM7CWNhc2UgQlBGX1RIUkVBRF9XUToKJiM0MzsJCXJldHVybiBfX2FsaWdub2ZfXyhzdHJ1Y3QgYnBmX3RocmVhZF93cSk7CiAJZGVmYXVsdDoKIAkJV0FSTl9PTl9PTkNFKDEpOwogCQlyZXR1cm4gMDsKQEAgLTQ3OCw2ICYjNDM7NDg2LDcgQEAgc3RhdGljIGlubGluZSB2b2lkIGJwZl9vYmpfaW5pdF9maWVsZChjb25zdCBzdHJ1Y3QgYnRmX2ZpZWxkICpmaWVsZCwgdm9pZCAqYWRkcikKIAljYXNlIEJQRl9LUFRSX1BFUkNQVToKIAljYXNlIEJQRl9VUFRSOgogCWNhc2UgQlBGX1RBU0tfV09SSzoKJiM0MzsJY2FzZSBCUEZfVEhSRUFEX1dROgogCQlicmVhazsKIAlkZWZhdWx0OgogCQlXQVJOX09OX09OQ0UoMSk7CkBAIC01MDIsNiAmIzQzOzUxMSw3IEBAIHN0YXRpYyBpbmxpbmUgYm9vbCBidGZfZmllbGRfaXNfbm1pX3NhZmUoZW51bSBidGZfZmllbGRfdHlwZSB0eXBlKQogCWNhc2UgQlBGX1RBU0tfV09SSzoKIAljYXNlIEJQRl9LUFRSX1VOUkVGOgogCWNhc2UgQlBGX1JFRkNPVU5UOgomIzQzOwljYXNlIEJQRl9USFJFQURfV1E6CiAJCXJldHVybiB0cnVlOwogCWRlZmF1bHQ6CiAJCXJldHVybiBmYWxzZTsKQEAgLTY0NCw2ICYjNDM7NjU0LDcgQEAgdm9pZCBjb3B5X21hcF92YWx1ZV9sb2NrZWQoc3RydWN0IGJwZl9tYXAgKm1hcCwgdm9pZCAqZHN0LCB2b2lkICpzcmMsCiB2b2lkIGJwZl90aW1lcl9jYW5jZWxfYW5kX2ZyZWUodm9pZCAqdGltZXIpOwogdm9pZCBicGZfd3FfY2FuY2VsX2FuZF9mcmVlKHZvaWQgKnRpbWVyKTsKIHZvaWQgYnBmX3Rhc2tfd29ya19jYW5jZWxfYW5kX2ZyZWUodm9pZCAqdGltZXIpOwomIzQzO3ZvaWQgYnBmX3RocmVhZF93cV9jYW5jZWxfYW5kX2ZyZWUodm9pZCAqdmFsKTsKIHZvaWQgYnBmX2xpc3RfaGVhZF9mcmVlKGNvbnN0IHN0cnVjdCBidGZfZmllbGQgKmZpZWxkLCB2b2lkICpsaXN0X2hlYWQsCiAJCQlzdHJ1Y3QgYnBmX3NwaW5fbG9jayAqc3Bpbl9sb2NrKTsKIHZvaWQgYnBmX3JiX3Jvb3RfZnJlZShjb25zdCBzdHJ1Y3QgYnRmX2ZpZWxkICpmaWVsZCwgdm9pZCAqcmJfcm9vdCwKQEAgLTcwMSw3ICYjNDM7NzEyLDggQEAgYm9vbCBicGZfbWFwX21ldGFfZXF1YWwoY29uc3Qgc3RydWN0IGJwZl9tYXAgKm1ldGEwLAogCiBzdGF0aWMgaW5saW5lIGJvb2wgYnBmX21hcF9oYXNfaW50ZXJuYWxfc3RydWN0cyhzdHJ1Y3QgYnBmX21hcCAqbWFwKQogewotCXJldHVybiBidGZfcmVjb3JkX2hhc19maWVsZChtYXAtJmd0O3JlY29yZCwgQlBGX1RJTUVSIHwgQlBGX1dPUktRVUVVRSB8IEJQRl9UQVNLX1dPUkspOwomIzQzOwlyZXR1cm4gYnRmX3JlY29yZF9oYXNfZmllbGQobWFwLSZndDtyZWNvcmQsIEJQRl9USU1FUiB8IEJQRl9XT1JLUVVFVUUgfAomIzQzOwkJCQkJCSBCUEZfVEFTS19XT1JLIHwgQlBGX1RIUkVBRF9XUSk7CiB9CiAKIHZvaWQgYnBmX21hcF9mcmVlX2ludGVybmFsX3N0cnVjdHMoc3RydWN0IGJwZl9tYXAgKm1hcCwgdm9pZCAqb2JqKTsKQEAgLTI3MjUsNiAmIzQzOzI3MzcsNyBAQCBib29sIGJ0Zl9yZWNvcmRfZXF1YWwoY29uc3Qgc3RydWN0IGJ0Zl9yZWNvcmQgKnJlY19hLCBjb25zdCBzdHJ1Y3QgYnRmX3JlY29yZCAqcgogdm9pZCBicGZfb2JqX2ZyZWVfdGltZXIoY29uc3Qgc3RydWN0IGJ0Zl9yZWNvcmQgKnJlYywgdm9pZCAqb2JqKTsKIHZvaWQgYnBmX29ial9mcmVlX3dvcmtxdWV1ZShjb25zdCBzdHJ1Y3QgYnRmX3JlY29yZCAqcmVjLCB2b2lkICpvYmopOwogdm9pZCBicGZfb2JqX2ZyZWVfdGFza193b3JrKGNvbnN0IHN0cnVjdCBidGZfcmVjb3JkICpyZWMsIHZvaWQgKm9iaik7CiYjNDM7dm9pZCBicGZfb2JqX2ZyZWVfdGhyZWFkX3dxKGNvbnN0IHN0cnVjdCBidGZfcmVjb3JkICpyZWMsIHZvaWQgKm9iaik7CiB2b2lkIGJwZl9vYmpfY2FuY2VsX2ZpZWxkcyhzdHJ1Y3QgYnBmX21hcCAqbWFwLCB2b2lkICpvYmopOwogdm9pZCBicGZfb2JqX2ZyZWVfZmllbGRzKGNvbnN0IHN0cnVjdCBidGZfcmVjb3JkICpyZWMsIHZvaWQgKm9iaik7CiB2b2lkIF9fYnBmX29ial9kcm9wX2ltcGwodm9pZCAqcCwgY29uc3Qgc3RydWN0IGJ0Zl9yZWNvcmQgKnJlYywgYm9vbCBwZXJjcHUpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9jZ3JvdXAuaCBiL2luY2x1ZGUvbGludXgvY2dyb3VwLmgKaW5kZXggZjJhYTQ2YTRmODcxZS4uOWI0YThkYzc0OGFjZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9jZ3JvdXAuaAomIzQzOyYjNDM7JiM0MzsgYi9pbmNsdWRlL2xpbnV4L2Nncm91cC5oCkBAIC05MjMsNCAmIzQzOzkyMyw2IEBAIHN0cnVjdCBjZ3JvdXAgKnRhc2tfZ2V0X2Nncm91cDEoc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssIGludCBoaWVyYXJjaHlfaWQpOwogCiBzdHJ1Y3QgY2dyb3VwX29mX3BlYWsgKm9mX3BlYWsoc3RydWN0IGtlcm5mc19vcGVuX2ZpbGUgKm9mKTsKIAomIzQzO2ludCBjZ3JvdXBfa3RocmVhZF9hdHRhY2goc3RydWN0IGNncm91cCAqY2dycCwgc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKTsKJiM0MzsKICNlbmRpZiAvKiBfTElOVVhfQ0dST1VQX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvdWFwaS9saW51eC9icGYuaCBiL2luY2x1ZGUvdWFwaS9saW51eC9icGYuaAppbmRleCBmZmQ5NmU4YjkyMGJkLi4wNTU4NTIwZjY3ZmU0IDEwMDY0NAotLS0gYS9pbmNsdWRlL3VhcGkvbGludXgvYnBmLmgKJiM0MzsmIzQzOyYjNDM7IGIvaW5jbHVkZS91YXBpL2xpbnV4L2JwZi5oCkBAIC03NTc0LDYgJiM0Mzs3NTc0LDEwIEBAIHN0cnVjdCBicGZfd3EgewogCV9fdTY0IF9fb3BhcXVlWzJdOwogfSBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDgpKSk7CiAKJiM0MztzdHJ1Y3QgYnBmX3RocmVhZF93cSB7CiYjNDM7CV9fdTY0IF9fb3BhcXVlWzJdOwomIzQzO30gX19hdHRyaWJ1dGVfXygoYWxpZ25lZCg4KSkpOwomIzQzOwogc3RydWN0IGJwZl9keW5wdHIgewogCV9fdTY0IF9fb3BhcXVlWzJdOwogfSBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDgpKSk7CmRpZmYgLS1naXQgYS9rZXJuZWwvYnBmL2J0Zi5jIGIva2VybmVsL2JwZi9idGYuYwppbmRleCA0MjQxNDYzM2NmMjYzLi5iZjZmYjVmNTFkMjFhIDEwMDY0NAotLS0gYS9rZXJuZWwvYnBmL2J0Zi5jCiYjNDM7JiM0MzsmIzQzOyBiL2tlcm5lbC9icGYvYnRmLmMKQEAgLTM2NjUsNiAmIzQzOzM2NjUsNyBAQCBzdGF0aWMgaW50IGJ0Zl9nZXRfZmllbGRfdHlwZShjb25zdCBzdHJ1Y3QgYnRmICpidGYsIGNvbnN0IHN0cnVjdCBidGZfdHlwZSAqdmFyXwogCQl7IEJQRl9USU1FUiwgJiMzNDticGZfdGltZXImIzM0OywgdHJ1ZSB9LAogCQl7IEJQRl9XT1JLUVVFVUUsICYjMzQ7YnBmX3dxJiMzNDssIHRydWUgfSwKIAkJeyBCUEZfVEFTS19XT1JLLCAmIzM0O2JwZl90YXNrX3dvcmsmIzM0OywgdHJ1ZSB9LAomIzQzOwkJeyBCUEZfVEhSRUFEX1dRLCAmIzM0O2JwZl90aHJlYWRfd3EmIzM0OywgdHJ1ZSB9LAogCQl7IEJQRl9MSVNUX0hFQUQsICYjMzQ7YnBmX2xpc3RfaGVhZCYjMzQ7LCBmYWxzZSB9LAogCQl7IEJQRl9MSVNUX05PREUsICYjMzQ7YnBmX2xpc3Rfbm9kZSYjMzQ7LCBmYWxzZSB9LAogCQl7IEJQRl9SQl9ST09ULCAmIzM0O2JwZl9yYl9yb290JiMzNDssIGZhbHNlIH0sCkBAIC0zODUwLDYgJiM0MzszODUxLDcgQEAgc3RhdGljIGludCBidGZfZmluZF9maWVsZF9vbmUoY29uc3Qgc3RydWN0IGJ0ZiAqYnRmLAogCWNhc2UgQlBGX1JCX05PREU6CiAJY2FzZSBCUEZfUkVGQ09VTlQ6CiAJY2FzZSBCUEZfVEFTS19XT1JLOgomIzQzOwljYXNlIEJQRl9USFJFQURfV1E6CiAJCXJldCA9IGJ0Zl9maW5kX3N0cnVjdChidGYsIHZhcl90eXBlLCBvZmYsIHN6LCBmaWVsZF90eXBlLAogCQkJCSAgICAgIGluZm9fY250ID8gJmFtcDtpbmZvWzBdIDogJmFtcDt0bXApOwogCQlpZiAocmV0ICZsdDsgMCkKQEAgLTQxNDUsNiAmIzQzOzQxNDcsNyBAQCBzdHJ1Y3QgYnRmX3JlY29yZCAqYnRmX3BhcnNlX2ZpZWxkcyhjb25zdCBzdHJ1Y3QgYnRmICpidGYsIGNvbnN0IHN0cnVjdCBidGZfdHlwZQogCXJlYy0mZ3Q7d3Ffb2ZmID0gLUVJTlZBTDsKIAlyZWMtJmd0O3JlZmNvdW50X29mZiA9IC1FSU5WQUw7CiAJcmVjLSZndDt0YXNrX3dvcmtfb2ZmID0gLUVJTlZBTDsKJiM0MzsJcmVjLSZndDt0aHJlYWRfd3Ffb2ZmID0gLUVJTlZBTDsKIAlmb3IgKGkgPSAwOyBpICZsdDsgY250OyBpJiM0MzsmIzQzOykgewogCQlmaWVsZF90eXBlX3NpemUgPSBidGZfZmllbGRfdHlwZV9zaXplKGluZm9fYXJyW2ldLnR5cGUpOwogCQlpZiAoaW5mb19hcnJbaV0ub2ZmICYjNDM7IGZpZWxkX3R5cGVfc2l6ZSAmZ3Q7IHZhbHVlX3NpemUpIHsKQEAgLTQxODgsNiAmIzQzOzQxOTEsMTAgQEAgc3RydWN0IGJ0Zl9yZWNvcmQgKmJ0Zl9wYXJzZV9maWVsZHMoY29uc3Qgc3RydWN0IGJ0ZiAqYnRmLCBjb25zdCBzdHJ1Y3QgYnRmX3R5cGUKIAkJCVdBUk5fT05fT05DRShyZWMtJmd0O3Rhc2tfd29ya19vZmYgJmd0Oz0gMCk7CiAJCQlyZWMtJmd0O3Rhc2tfd29ya19vZmYgPSByZWMtJmd0O2ZpZWxkc1tpXS5vZmZzZXQ7CiAJCQlicmVhazsKJiM0MzsJCWNhc2UgQlBGX1RIUkVBRF9XUToKJiM0MzsJCQlXQVJOX09OX09OQ0UocmVjLSZndDt0aHJlYWRfd3Ffb2ZmICZndDs9IDApOwomIzQzOwkJCXJlYy0mZ3Q7dGhyZWFkX3dxX29mZiA9IHJlYy0mZ3Q7ZmllbGRzW2ldLm9mZnNldDsKJiM0MzsJCQlicmVhazsKIAkJY2FzZSBCUEZfUkVGQ09VTlQ6CiAJCQlXQVJOX09OX09OQ0UocmVjLSZndDtyZWZjb3VudF9vZmYgJmd0Oz0gMCk7CiAJCQkvKiBDYWNoZSBvZmZzZXQgZm9yIGZhc3RlciBsb29rdXAgYXQgcnVudGltZSAqLwpkaWZmIC0tZ2l0IGEva2VybmVsL2JwZi9oZWxwZXJzLmMgYi9rZXJuZWwvYnBmL2hlbHBlcnMuYwppbmRleCA2Mzg4YjZiMjNlNDkwLi44ZTAxYmFkMWIxNmEwIDEwMDY0NAotLS0gYS9rZXJuZWwvYnBmL2hlbHBlcnMuYwomIzQzOyYjNDM7JiM0MzsgYi9rZXJuZWwvYnBmL2hlbHBlcnMuYwpAQCAtMjksNiAmIzQzOzI5LDggQEAKICNpbmNsdWRlICZsdDtsaW51eC90YXNrX3dvcmsuaCZndDsKICNpbmNsdWRlICZsdDtsaW51eC9pcnFfd29yay5oJmd0OwogI2luY2x1ZGUgJmx0O2xpbnV4L2J1aWxkaWQuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgva3RocmVhZC5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9qaGFzaC5oJmd0OwogCiAjaW5jbHVkZSAmIzM0Oy4uLy4uL2xpYi9rc3RydG94LmgmIzM0OwogCkBAIC0xMTEwLDYgJiM0MzsxMTEyLDE3IEBAIHN0YXRpYyB2b2lkICptYXBfa2V5X2Zyb21fdmFsdWUoc3RydWN0IGJwZl9tYXAgKm1hcCwgdm9pZCAqdmFsdWUsIHUzMiAqYXJyX2lkeCkKIAlyZXR1cm4gKHZvaWQgKil2YWx1ZSAtIHJvdW5kX3VwKG1hcC0mZ3Q7a2V5X3NpemUsIDgpOwogfQogCiYjNDM7c3RhdGljIHUzMiBicGZfbWFwX2VsZW1faWRfZnJvbV92YWx1ZShzdHJ1Y3QgYnBmX21hcCAqbWFwLCB2b2lkICp2YWx1ZSkKJiM0Mzt7CiYjNDM7CXUzMiBhcnJfaWR4OwomIzQzOwl2b2lkICprZXk7CiYjNDM7CiYjNDM7CWtleSA9IG1hcF9rZXlfZnJvbV92YWx1ZShtYXAsIHZhbHVlLCAmYW1wO2Fycl9pZHgpOwomIzQzOwlpZiAobWFwLSZndDttYXBfdHlwZSA9PSBCUEZfTUFQX1RZUEVfQVJSQVkpCiYjNDM7CQlyZXR1cm4gYXJyX2lkeDsKJiM0MzsJcmV0dXJuIGpoYXNoKGtleSwgbWFwLSZndDtrZXlfc2l6ZSwgMCk7CiYjNDM7fQomIzQzOwogZW51bSBicGZfYXN5bmNfdHlwZSB7CiAJQlBGX0FTWU5DX1RZUEVfVElNRVIgPSAwLAogCUJQRl9BU1lOQ19UWVBFX1dRLApAQCAtNDc2OSw2ICYjNDM7NDc4MiwzOTcgQEAgX19icGZfa2Z1bmMgaW50IGJwZl90aW1lcl9jYW5jZWxfYXN5bmMoc3RydWN0IGJwZl90aW1lciAqdGltZXIpCiAJfQogfQogCiYjNDM7LyoKJiM0MzsgKiBCUEYgdGhyZWFkIHdvcmtxdWV1ZSAoa3RocmVhZF93b3JrZXIgYmFzZWQpIGltcGxlbWVudGF0aW9uCiYjNDM7ICoKJiM0MzsgKiBXaHkgYnBmX3RocmVhZF93cSBkb2VzIE5PVCB1c2UgdGhlIGJwZl9hc3luYyBpbmZyYXN0cnVjdHVyZToKJiM0MzsgKgomIzQzOyAqIGJwZl90aW1lciBhbmQgYnBmX3dxIHNoYXJlIGEgY29tbW9uIGNsZWFudXAgcGF0aCB2aWEgYnBmX2FzeW5jOgomIzQzOyAqCiYjNDM7ICogICBicGZfYXN5bmNfY2FuY2VsX2FuZF9mcmVlKCkKJiM0MzsgKiAgICAgLSZndDsgYnBmX2FzeW5jX3NjaGVkdWxlX29wKCkKJiM0MzsgKiAgICAgICAtJmd0OyBpcnFfd29ya19xdWV1ZSgpICAgICAgICAgICAgICAgIC8vIHNjaGVkdWxlIGZyb20gYW55IGNvbnRleHQKJiM0MzsgKiAgICAgICAgIC0mZ3Q7IGJwZl9hc3luY19wcm9jZXNzX29wKCkgICAgICAgIC8vIHJ1bnMgaW4gaGFyZGlycSBjb250ZXh0CiYjNDM7ICogICAgICAgICAgIC0mZ3Q7IGJwZl93cV93b3JrKCkgLyB0aW1lciBjYiAgICAvLyBhdG9taWMsIG5vbi1zbGVlcGFibGUKJiM0MzsgKgomIzQzOyAqIFRoaXMgd29ya3MgZm9yIHRpbWVyIGFuZCB3b3JrcXVldWUgYmVjYXVzZSB0aGVpciBjYWxsYmFja3MgYW5kCiYjNDM7ICogY2FuY2VsbGF0aW9uIChocnRpbWVyX2NhbmNlbCAvIGJwZl93cV9jYW5jZWxfYW5kX2ZyZWUpIGNvbXBsZXRlCiYjNDM7ICogc3luY2hyb25vdXNseSBhbmQgbmVlZCBub3Qgc2xlZXAuICBUaGUgaGFyZGlycSBjb250ZXh0IGlzIHN1ZmZpY2llbnQuCiYjNDM7ICoKJiM0MzsgKiBicGZfdGhyZWFkX3dxIGlzIGRpZmZlcmVudDogY2FuY2VsbGF0aW9uIGFuZCBmaW5hbCBjbGVhbnVwIG1heSBuZWVkIHRvCiYjNDM7ICogc2xlZXA6CiYjNDM7ICoKJiM0MzsgKiAgIGt0aHJlYWRfY2FuY2VsX3dvcmtfc3luYygpICAgIC0gd2FpdHMgZm9yIHRoZSB3b3JrIHRvIGZpbmlzaCwgY2FuCiYjNDM7ICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2hlZHVsZSBvdXQgaWYgdGhlIHdvcmsgaXMgcnVubmluZy4KJiM0MzsgKiAgIGt0aHJlYWRfZGVzdHJveV93b3JrZXIoKSAgICAgIC0gc3RvcHMgdGhlIGt0aHJlYWQsIGludGVybmFsbHkKJiM0MzsgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bmNocm9uaXplcyB3aXRoIGt0aHJlYWQgZXhpdC4KJiM0MzsgKiAgIGNncm91cF9wdXQoKSAoZmluYWwgcHV0KSAgICAgIC0gbWF5IGFjcXVpcmUgY2dyb3VwX211dGV4IGFuZCBvdGhlcgomIzQzOyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xlZXBpbmcgbG9ja3MgZHVyaW5nIG9mZmxpbmUuCiYjNDM7ICoKJiM0MzsgKiBOb25lIG9mIHRoZXNlIGNhbiBiZSBjYWxsZWQgZnJvbSBoYXJkaXJxIGNvbnRleHQgKGlycV93b3JrKS4gRG9pbmcgc28KJiM0MzsgKiB3b3VsZCB0cmlnZ2VyIG1pZ2h0X3NsZWVwKCkgd2FybmluZ3Mgb3IgZGVhZGxvY2suCiYjNDM7ICoKJiM0MzsgKiBUaGVyZWZvcmUgYnBmX3RocmVhZF93cSBpbXBsZW1lbnRzIGl0cyBvd24gUkNVLWJhc2VkIGNsZWFudXA6CiYjNDM7ICoKJiM0MzsgKiAgIGJwZl90aHJlYWRfd3FfY2FuY2VsX2FuZF9mcmVlKCkgICAgICAgIC8vIHNsZWVwYWJsZSAoY2FsbGVkIGZyb20KJiM0MzsgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1hcCBmcmVlIC8gZWxlbSBkZWxldGUpCiYjNDM7ICogICAgIC0mZ3Q7IHhjaGcoY3R4LCBOVUxMKSAgICAgICAgICAgICAgICAgICAvLyBkZXRhY2ggYXRvbWljYWxseQomIzQzOyAqICAgICAtJmd0OyBrdGhyZWFkX2NhbmNlbF93b3JrX3N5bmMoKSAgICAgICAgLy8gb2sgdG8gc2xlZXAKJiM0MzsgKiAgICAgLSZndDsgYnBmX3RocmVhZF93cV9jdHhfcHV0KCkKJiM0MzsgKiAgICAgICAtJmd0OyBjYWxsX3JjdV90YXNrc190cmFjZSgpICAgICAgICAgIC8vIHdhaXQgZm9yIEJQRiBjYWxsYmFja3MKJiM0MzsgKiAgICAgICAgIC0mZ3Q7IHNjaGVkdWxlX3dvcmsoKSAgICAgICAgICAgICAgIC8vIHN3aXRjaCB0byBzbGVlcGFibGUgY29udGV4dAomIzQzOyAqICAgICAgICAgICAtJmd0OyBicGZfdGhyZWFkX3dxX2Rlc3Ryb3lfd29ya19mbigpCiYjNDM7ICogICAgICAgICAgICAgLSZndDsgYnBmX3Byb2dfcHV0KCkKJiM0MzsgKiAgICAgICAgICAgICAtJmd0OyBjZ3JvdXBfcHV0KCkKJiM0MzsgKiAgICAgICAgICAgICAtJmd0OyBrdGhyZWFkX2Rlc3Ryb3lfd29ya2VyKCkKJiM0MzsgKiAgICAgICAgICAgICAtJmd0OyBrZnJlZShjdHgpCiYjNDM7ICoKJiM0MzsgKiBUaGUgc2FtZSBkZXNpZ24gY2hvaWNlIHdhcyBtYWRlIGZvciBicGZfdGFza193b3JrLCB3aGljaCBhbHNvIGF2b2lkcwomIzQzOyAqIGJwZl9hc3luYyBiZWNhdXNlIHRhc2tfd29yayBjYW5jZWxsYXRpb24gc3luY2hyb25pemVzIHdpdGggdGhlIHRhc2sKJiM0MzsgKiBhbmQgbWF5IHNsZWVwLgomIzQzOyAqLwomIzQzOwomIzQzO3N0cnVjdCBicGZfdGhyZWFkX3dxX2N0eCB7CiYjNDM7CXN0cnVjdCBrdGhyZWFkX3dvcmtlciAqd29ya2VyOwomIzQzOwlzdHJ1Y3Qga3RocmVhZF93b3JrIHdvcms7CiYjNDM7CXN0cnVjdCBicGZfcHJvZyAqcHJvZzsKJiM0MzsJYnBmX2NhbGxiYWNrX3QgY2FsbGJhY2tfZm47CiYjNDM7CXN0cnVjdCBicGZfbWFwICptYXA7CiYjNDM7CXZvaWQgKnZhbHVlOwomIzQzOwlzdHJ1Y3QgY2dyb3VwICpjZ3JwOwomIzQzOwlyZWZjb3VudF90IHJlZmNudDsKJiM0MzsJc3RydWN0IHJjdV9oZWFkIHJjdTsKJiM0MzsJc3RydWN0IHdvcmtfc3RydWN0IGRlc3Ryb3lfd29yazsKJiM0Mzt9OwomIzQzOwomIzQzOy8qIEtlcm5lbC1pbnRlcm5hbCByZXByZXNlbnRhdGlvbiB0aGF0IGZpdHMgaW4gc3RydWN0IGJwZl90aHJlYWRfd3EgKi8KJiM0MztzdHJ1Y3QgYnBmX3RocmVhZF93cV9rZXJuIHsKJiM0MzsJc3RydWN0IGJwZl90aHJlYWRfd3FfY3R4ICpjdHg7CiYjNDM7fSBfX2FsaWduZWQoOCk7CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgYnBmX3RocmVhZF93cV9kZXN0cm95X3dvcmtfZm4oc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQomIzQzO3sKJiM0MzsJc3RydWN0IGJwZl90aHJlYWRfd3FfY3R4ICpjdHggPSBjb250YWluZXJfb2Yod29yaywKJiM0MzsJCQkJCQkgICAgIHN0cnVjdCBicGZfdGhyZWFkX3dxX2N0eCwKJiM0MzsJCQkJCQkgICAgIGRlc3Ryb3lfd29yayk7CiYjNDM7CiYjNDM7CWlmIChjdHgtJmd0O3Byb2cpCiYjNDM7CQlicGZfcHJvZ19wdXQoY3R4LSZndDtwcm9nKTsKJiM0MzsJaWYgKGN0eC0mZ3Q7Y2dycCkKJiM0MzsJCWNncm91cF9wdXQoY3R4LSZndDtjZ3JwKTsKJiM0MzsJaWYgKGN0eC0mZ3Q7d29ya2VyKQomIzQzOwkJa3RocmVhZF9kZXN0cm95X3dvcmtlcihjdHgtJmd0O3dvcmtlcik7CiYjNDM7CWtmcmVlKGN0eCk7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkIGJwZl90aHJlYWRfd3FfY3R4X2ZyZWVfcmN1KHN0cnVjdCByY3VfaGVhZCAqcmN1KQomIzQzO3sKJiM0MzsJc3RydWN0IGJwZl90aHJlYWRfd3FfY3R4ICpjdHggPSBjb250YWluZXJfb2YocmN1LAomIzQzOwkJCQkJCSAgICAgc3RydWN0IGJwZl90aHJlYWRfd3FfY3R4LAomIzQzOwkJCQkJCSAgICAgcmN1KTsKJiM0MzsKJiM0MzsJSU5JVF9XT1JLKCZhbXA7Y3R4LSZndDtkZXN0cm95X3dvcmssIGJwZl90aHJlYWRfd3FfZGVzdHJveV93b3JrX2ZuKTsKJiM0MzsJc2NoZWR1bGVfd29yaygmYW1wO2N0eC0mZ3Q7ZGVzdHJveV93b3JrKTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgYnBmX3RocmVhZF93cV9jdHhfcHV0KHN0cnVjdCBicGZfdGhyZWFkX3dxX2N0eCAqY3R4KQomIzQzO3sKJiM0MzsJaWYgKCFyZWZjb3VudF9kZWNfYW5kX3Rlc3QoJmFtcDtjdHgtJmd0O3JlZmNudCkpCiYjNDM7CQlyZXR1cm47CiYjNDM7CWNhbGxfcmN1X3Rhc2tzX3RyYWNlKCZhbXA7Y3R4LSZndDtyY3UsIGJwZl90aHJlYWRfd3FfY3R4X2ZyZWVfcmN1KTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgYnBmX3RocmVhZF93cV93b3JrX2ZuKHN0cnVjdCBrdGhyZWFkX3dvcmsgKndvcmspCiYjNDM7ewomIzQzOwlzdHJ1Y3QgYnBmX3RocmVhZF93cV9jdHggKmN0eCA9IGNvbnRhaW5lcl9vZih3b3JrLAomIzQzOwkJCQkJCSAgICAgc3RydWN0IGJwZl90aHJlYWRfd3FfY3R4LAomIzQzOwkJCQkJCSAgICAgd29yayk7CiYjNDM7CWJwZl9jYWxsYmFja190IGNhbGxiYWNrX2ZuOwomIzQzOwl2b2lkICp2YWx1ZSA9IGN0eC0mZ3Q7dmFsdWU7CiYjNDM7CXN0cnVjdCBicGZfbWFwICptYXAgPSBjdHgtJmd0O21hcDsKJiM0MzsJdm9pZCAqa2V5OwomIzQzOwl1MzIgaWR4OwomIzQzOwomIzQzOwlCVEZfVFlQRV9FTUlUKHN0cnVjdCBicGZfdGhyZWFkX3dxKTsKJiM0MzsKJiM0MzsJY2FsbGJhY2tfZm4gPSBSRUFEX09OQ0UoY3R4LSZndDtjYWxsYmFja19mbik7CiYjNDM7CWlmICghY2FsbGJhY2tfZm4pCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJa2V5ID0gbWFwX2tleV9mcm9tX3ZhbHVlKG1hcCwgdmFsdWUsICZhbXA7aWR4KTsKJiM0MzsKJiM0MzsJcmN1X3JlYWRfbG9ja190cmFjZSgpOwomIzQzOwltaWdyYXRlX2Rpc2FibGUoKTsKJiM0MzsKJiM0MzsJY2FsbGJhY2tfZm4gPSBSRUFEX09OQ0UoY3R4LSZndDtjYWxsYmFja19mbik7CiYjNDM7CWlmIChjYWxsYmFja19mbikKJiM0MzsJCWNhbGxiYWNrX2ZuKCh1NjQpKGxvbmcpbWFwLCAodTY0KShsb25nKWtleSwgKHU2NCkobG9uZyl2YWx1ZSwKJiM0MzsJCQkgICAgMCwgMCk7CiYjNDM7CiYjNDM7CW1pZ3JhdGVfZW5hYmxlKCk7CiYjNDM7CXJjdV9yZWFkX3VubG9ja190cmFjZSgpOwomIzQzOwomIzQzO291dDoKJiM0MzsJYnBmX3RocmVhZF93cV9jdHhfcHV0KGN0eCk7CiYjNDM7fQomIzQzOwomIzQzOy8qCiYjNDM7ICogYnBmX3RocmVhZF93cV9pbml0KCkgY3JlYXRlcyBhIGt0aHJlYWQgd29ya2VyIGFuZCBtYXkgYXR0YWNoIGl0IHRvIGEgY2dyb3VwLgomIzQzOyAqIFRoZSBoZWxwZXJzIHVzZWQgaGVyZSBjYW4gc2xlZXAgYW5kIGFjcXVpcmUgc2V2ZXJhbCBsb2NrcyB0aHJvdWdoIGt0aHJlYWQKJiM0MzsgKiBjcmVhdGlvbi9kZXN0cnVjdGlvbiwgY2dyb3VwIGxvb2t1cCBhbmQgY2dyb3VwIGt0aHJlYWQgYXR0YWNobWVudC4gS2VlcCB0aGlzCiYjNDM7ICoga2Z1bmMgYXZhaWxhYmxlIG9ubHkgdG8gQlBGX1BST0dfVFlQRV9TWVNDQUxMIHByb2dyYW1zIHNvIGl0IGlzIG5vdCBpbnZva2VkCiYjNDM7ICogZnJvbSBCUEYgcHJvZ3JhbSBjb250ZXh0cyB0aGF0IGFscmVhZHkgaG9sZCBsb2NrcyB3aGljaCBjb3VsZCBkZWFkbG9jayB3aXRoCiYjNDM7ICogdGhvc2UgcGF0aHMuCiYjNDM7ICovCiYjNDM7X19icGZfa2Z1bmMgaW50IGJwZl90aHJlYWRfd3FfaW5pdChzdHJ1Y3QgYnBmX3RocmVhZF93cSAqdHdxLCB2b2lkICpwX19tYXAsCiYjNDM7CQkJCSAgIHU2NCBjZ3JvdXBfaWQsIHVuc2lnbmVkIGludCBmbGFncykKJiM0Mzt7CiYjNDM7CXN0cnVjdCBicGZfdGhyZWFkX3dxX2tlcm4gKnR3ayA9IChzdHJ1Y3QgYnBmX3RocmVhZF93cV9rZXJuICopdHdxOwomIzQzOwlzdHJ1Y3QgYnBmX21hcCAqbWFwID0gcF9fbWFwOwomIzQzOwlzdHJ1Y3QgYnBmX3RocmVhZF93cV9jdHggKmN0eCwgKm9sZF9jdHg7CiYjNDM7CXN0cnVjdCBrdGhyZWFkX3dvcmtlciAqd29ya2VyOwomIzQzOwlzdHJ1Y3QgY2dyb3VwICpjZ3JwID0gTlVMTDsKJiM0MzsJdm9pZCAqdmFsdWU7CiYjNDM7CXUzMiBlbGVtX2lkOwomIzQzOwlpbnQgZXJyOwomIzQzOwomIzQzOwlCVUlMRF9CVUdfT04oc2l6ZW9mKHN0cnVjdCBicGZfdGhyZWFkX3dxX2tlcm4pCiYjNDM7CQkJJmd0OyBzaXplb2Yoc3RydWN0IGJwZl90aHJlYWRfd3EpKTsKJiM0MzsJQlVJTERfQlVHX09OKF9fYWxpZ25vZl9fKHN0cnVjdCBicGZfdGhyZWFkX3dxX2tlcm4pCiYjNDM7CQkJIT0gX19hbGlnbm9mX18oc3RydWN0IGJwZl90aHJlYWRfd3EpKTsKJiM0MzsKJiM0MzsJaWYgKGZsYWdzKQomIzQzOwkJcmV0dXJuIC1FSU5WQUw7CiYjNDM7CiYjNDM7CW9sZF9jdHggPSBSRUFEX09OQ0UodHdrLSZndDtjdHgpOwomIzQzOwlpZiAob2xkX2N0eCkKJiM0MzsJCXJldHVybiAtRUJVU1k7CiYjNDM7CiYjNDM7CXZhbHVlID0gKHZvaWQgKil0d3EgLSBtYXAtJmd0O3JlY29yZC0mZ3Q7dGhyZWFkX3dxX29mZjsKJiM0MzsJZWxlbV9pZCA9IGJwZl9tYXBfZWxlbV9pZF9mcm9tX3ZhbHVlKG1hcCwgdmFsdWUpOwomIzQzOwl3b3JrZXIgPSBrdGhyZWFkX3J1bl93b3JrZXIoMCwgJiMzNDticGZfdHdxLyVkLyV4JiMzNDssIG1hcC0mZ3Q7aWQsIGVsZW1faWQpOwomIzQzOwlpZiAoSVNfRVJSKHdvcmtlcikpCiYjNDM7CQlyZXR1cm4gUFRSX0VSUih3b3JrZXIpOwomIzQzOwomIzQzOwkvKiBTZXR1cCBjdHguICovCiYjNDM7CWN0eCA9IGJwZl9tYXBfa21hbGxvY19ub2xvY2sobWFwLCBzaXplb2YoKmN0eCksIEdGUF9LRVJORUwsCiYjNDM7CQkJCSAgICAgbWFwLSZndDtudW1hX25vZGUpOwomIzQzOwlpZiAoIWN0eCkgewomIzQzOwkJZXJyID0gLUVOT01FTTsKJiM0MzsJCWdvdG8gZGVzdHJveV93b3JrZXI7CiYjNDM7CX0KJiM0MzsJbWVtc2V0KGN0eCwgMCwgc2l6ZW9mKCpjdHgpKTsKJiM0MzsJY3R4LSZndDt3b3JrZXIgPSB3b3JrZXI7CiYjNDM7CWN0eC0mZ3Q7bWFwID0gbWFwOwomIzQzOwljdHgtJmd0O3ZhbHVlID0gdmFsdWU7CiYjNDM7CXJlZmNvdW50X3NldCgmYW1wO2N0eC0mZ3Q7cmVmY250LCAxKTsKJiM0MzsJa3RocmVhZF9pbml0X3dvcmsoJmFtcDtjdHgtJmd0O3dvcmssIGJwZl90aHJlYWRfd3Ffd29ya19mbik7CiYjNDM7CiYjNDM7CWlmIChjZ3JvdXBfaWQpIHsKJiM0MzsjaWZkZWYgQ09ORklHX0NHUk9VUFMKJiM0MzsJCWNncnAgPSBjZ3JvdXBfZ2V0X2Zyb21faWQoY2dyb3VwX2lkKTsKJiM0MzsJCWlmIChJU19FUlIoY2dycCkpIHsKJiM0MzsJCQllcnIgPSBQVFJfRVJSKGNncnApOwomIzQzOwkJCWdvdG8ga2ZyZWVfY3R4OwomIzQzOwkJfQomIzQzOwkJY3R4LSZndDtjZ3JwID0gY2dycDsKJiM0MzsKJiM0MzsJCS8qCiYjNDM7CQkgKiBrdGhyZWFkX3J1bl93b3JrZXIoKSB3YWtlcyB0aGUga3RocmVhZCwgYnV0IGl0IG1heSBub3QgaGF2ZQomIzQzOwkJICogZXhlY3V0ZWQgY2dyb3VwX2t0aHJlYWRfcmVhZHkoKSB5ZXQsIHdoaWNoIGNsZWFycwomIzQzOwkJICogbm9fY2dyb3VwX21pZ3JhdGlvbi4KJiM0MzsJCSAqIERvIGEgcXVldWUgd29yayBhbmQgZmx1c2ggdG8gd2FpdCB0aGUga3RocmVhZCBydW4uCiYjNDM7CQkgKi8KJiM0MzsJCXJlZmNvdW50X2luYygmYW1wO2N0eC0mZ3Q7cmVmY250KTsKJiM0MzsJCWlmICgha3RocmVhZF9xdWV1ZV93b3JrKGN0eC0mZ3Q7d29ya2VyLCAmYW1wO2N0eC0mZ3Q7d29yaykpIHsKJiM0MzsJCQlyZWZjb3VudF9kZWMoJmFtcDtjdHgtJmd0O3JlZmNudCk7CiYjNDM7CQkJZXJyID0gLUVCVVNZOwomIzQzOwkJCWdvdG8gY2dyb3VwX3B1dDsKJiM0MzsJCX0KJiM0MzsJCWt0aHJlYWRfZmx1c2hfd29yaygmYW1wO2N0eC0mZ3Q7d29yayk7CiYjNDM7CiYjNDM7CQlpZiAod29ya2VyLSZndDt0YXNrLSZndDtub19jZ3JvdXBfbWlncmF0aW9uKSB7CiYjNDM7CQkJZXJyID0gLUVBR0FJTjsKJiM0MzsJCQlnb3RvIGNncm91cF9wdXQ7CiYjNDM7CQl9CiYjNDM7CiYjNDM7CQllcnIgPSBjZ3JvdXBfa3RocmVhZF9hdHRhY2goY2dycCwgd29ya2VyLSZndDt0YXNrKTsKJiM0MzsJCWlmIChlcnIpCiYjNDM7CQkJZ290byBjZ3JvdXBfcHV0OwomIzQzOyNlbHNlCiYjNDM7CQllcnIgPSAtRU9QTk9UU1VQUDsKJiM0MzsJCWdvdG8ga2ZyZWVfY3R4OwomIzQzOyNlbmRpZgomIzQzOwl9CiYjNDM7CiYjNDM7CW9sZF9jdHggPSBjbXB4Y2hnKCZhbXA7dHdrLSZndDtjdHgsIE5VTEwsIGN0eCk7CiYjNDM7CWlmIChvbGRfY3R4KSB7CiYjNDM7CQllcnIgPSAtRUJVU1k7CiYjNDM7CQlnb3RvIGNncm91cF9wdXQ7CiYjNDM7CX0KJiM0MzsKJiM0MzsJLyoKJiM0MzsJICogUGFpcmVkIHdpdGggdGhlIG1hcCBkZXN0cnVjdGlvbiBwYXRoLiAgRW5zdXJlcyB0aGF0IGN0eCBpcyBnbG9iYWxseQomIzQzOwkgKiB2aXNpYmxlIGJlZm9yZSB3ZSBjaGVjayBtYXAtJmd0O3VzZXJjbnQuCiYjNDM7CSAqIElmIHVzZXJjbnQgaGFzIGRyb3BwZWQgdG8gemVybywgdGhlIGRlc3RydWN0aW9uIHBhdGggd2lsbCBlaXRoZXIgc2VlCiYjNDM7CSAqIHRoZSBjdHggKGFuZCBjYW5jZWwgaXQpIG9yIHdlIHNlZSB1c2VyY250ID09IDAgaGVyZSBhbmQgY2FuY2VsCiYjNDM7CSAqIG91cnNlbHZlcy4KJiM0MzsJICogV2l0aG91dCB0aGlzIGJhcnJpZXIsIGEgQ1BVIGNvdWxkIHJlb3JkZXIgdGhlIGxvYWQgb2YgdXNlcmNudCBiZWZvcmUKJiM0MzsJICogdGhlIGNtcHhjaGcgc3RvcmUgYmVjb21lcyB2aXNpYmxlLCBicmVha2luZyB0aGUgbXV0dWFsIGV4Y2x1c2lvbgomIzQzOwkgKiBndWFyYW50ZWUuCiYjNDM7CSAqLwomIzQzOwlzbXBfbWIoKTsKJiM0MzsKJiM0MzsJaWYgKCFhdG9taWM2NF9yZWFkKCZhbXA7bWFwLSZndDt1c2VyY250KSkgewomIzQzOwkJYnBmX3RocmVhZF93cV9jYW5jZWxfYW5kX2ZyZWUodHdxKTsKJiM0MzsJCXJldHVybiAtRVBFUk07CiYjNDM7CX0KJiM0MzsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7CiYjNDM7Y2dyb3VwX3B1dDoKJiM0MzsjaWZkZWYgQ09ORklHX0NHUk9VUFMKJiM0MzsJaWYgKGNncnApCiYjNDM7CQljZ3JvdXBfcHV0KGNncnApOwomIzQzOyNlbmRpZgomIzQzO2tmcmVlX2N0eDoKJiM0MzsJLyoKJiM0MzsJICogTm90IHVzZSBicGZfdGhyZWFkX3dxX2N0eF9wdXQgYmVjYXVzZSBjdHggaGFzIG5vdCB5ZXQgZW50ZXJlZAomIzQzOwkgKiB0aGUgcnVubmluZyBzdGF0ZS4KJiM0MzsJICovCiYjNDM7CWtmcmVlKGN0eCk7CiYjNDM7ZGVzdHJveV93b3JrZXI6CiYjNDM7CWt0aHJlYWRfZGVzdHJveV93b3JrZXIod29ya2VyKTsKJiM0MzsJcmV0dXJuIGVycjsKJiM0Mzt9CiYjNDM7CiYjNDM7X19icGZfa2Z1bmMgaW50IGJwZl90aHJlYWRfd3Ffc2V0X2NhbGxiYWNrKHN0cnVjdCBicGZfdGhyZWFkX3dxICp0d3EsCiYjNDM7CQkJCQkgICBpbnQgKGNhbGxiYWNrX2ZuKSh2b2lkICptYXAsCiYjNDM7CQkJCQkJCSAgICAgaW50ICprZXksCiYjNDM7CQkJCQkJCSAgICAgdm9pZCAqdmFsdWUpLAomIzQzOwkJCQkJICAgdW5zaWduZWQgaW50IGZsYWdzLAomIzQzOwkJCQkJICAgc3RydWN0IGJwZl9wcm9nX2F1eCAqYXV4KQomIzQzO3sKJiM0MzsJc3RydWN0IGJwZl90aHJlYWRfd3Ffa2VybiAqdHdrID0gKHN0cnVjdCBicGZfdGhyZWFkX3dxX2tlcm4gKil0d3E7CiYjNDM7CXN0cnVjdCBicGZfdGhyZWFkX3dxX2N0eCAqY3R4OwomIzQzOwlzdHJ1Y3QgYnBmX3Byb2cgKnByb2c7CiYjNDM7CiYjNDM7CWlmIChmbGFncykKJiM0MzsJCXJldHVybiAtRUlOVkFMOwomIzQzOwomIzQzOwljdHggPSBSRUFEX09OQ0UodHdrLSZndDtjdHgpOwomIzQzOwlpZiAoIWN0eCkKJiM0MzsJCXJldHVybiAtRUlOVkFMOwomIzQzOwomIzQzOwlwcm9nID0gYnBmX3Byb2dfaW5jX25vdF96ZXJvKGF1eC0mZ3Q7cHJvZyk7CiYjNDM7CWlmIChJU19FUlIocHJvZykpCiYjNDM7CQlyZXR1cm4gUFRSX0VSUihwcm9nKTsKJiM0MzsKJiM0MzsJLyoKJiM0MzsJICogQWxsb3cgc2V0X2NhbGxiYWNrIG9ubHkgb25jZSB0byBwcmV2ZW50IFVBRjogYSBjb25jdXJyZW50CiYjNDM7CSAqIHNldF9jYWxsYmFjayBjb3VsZCBicGZfcHJvZ19wdXQoKSB0aGUgcHJvZyB3aGlsZSB0aGUgd29ya2VyCiYjNDM7CSAqIGt0aHJlYWQgaXMgc3RpbGwgZXhlY3V0aW5nIGl0cyBjYWxsYmFjay4KJiM0MzsJICovCiYjNDM7CWlmIChjbXB4Y2hnKCZhbXA7Y3R4LSZndDtwcm9nLCBOVUxMLCBwcm9nKSAhPSBOVUxMKSB7CiYjNDM7CQlicGZfcHJvZ19wdXQocHJvZyk7CiYjNDM7CQlyZXR1cm4gLUVCVVNZOwomIzQzOwl9CiYjNDM7CS8qCiYjNDM7CSAqIFNhZmUgdG8gc2V0IGNhbGxiYWNrX2ZuIGFmdGVyIHByb2c6IGJwZl90aHJlYWRfd3Ffc3RhcnQoKSBhbmQKJiM0MzsJICogYnBmX3RocmVhZF93cV93b3JrX2ZuKCkgYm90aCBjaGVjayBjYWxsYmFja19mbiB3aXRoIFJFQURfT05DRSgpCiYjNDM7CSAqIGFuZCBiYWlsIG91dCBpZiBpdCBpcyBzdGlsbCBOVUxMLgomIzQzOwkgKi8KJiM0MzsJV1JJVEVfT05DRShjdHgtJmd0O2NhbGxiYWNrX2ZuLCAodm9pZCAqKWNhbGxiYWNrX2ZuKTsKJiM0MzsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOwomIzQzO19fYnBmX2tmdW5jIGludAomIzQzO2JwZl90aHJlYWRfd3Ffc3RhcnQoc3RydWN0IGJwZl90aHJlYWRfd3EgKnR3cSwgdW5zaWduZWQgaW50IGZsYWdzKQomIzQzO3sKJiM0MzsJc3RydWN0IGJwZl90aHJlYWRfd3Ffa2VybiAqdHdrID0gKHN0cnVjdCBicGZfdGhyZWFkX3dxX2tlcm4gKil0d3E7CiYjNDM7CXN0cnVjdCBicGZfdGhyZWFkX3dxX2N0eCAqY3R4OwomIzQzOwlpbnQgZXJyOwomIzQzOwomIzQzOwlpZiAoZmxhZ3MpCiYjNDM7CQlyZXR1cm4gLUVJTlZBTDsKJiM0MzsKJiM0MzsJcmN1X3JlYWRfbG9ja190cmFjZSgpOwomIzQzOwomIzQzOwllcnIgPSAwOwomIzQzOwomIzQzOwljdHggPSBSRUFEX09OQ0UodHdrLSZndDtjdHgpOwomIzQzOwlpZiAoIWN0eCB8fCAhUkVBRF9PTkNFKGN0eC0mZ3Q7Y2FsbGJhY2tfZm4pKSB7CiYjNDM7CQllcnIgPSAtRUlOVkFMOwomIzQzOwkJZ290byB1bmxvY2s7CiYjNDM7CX0KJiM0MzsKJiM0MzsJaWYgKCFyZWZjb3VudF9pbmNfbm90X3plcm8oJmFtcDtjdHgtJmd0O3JlZmNudCkpCiYjNDM7CQllcnIgPSAtRU5PRU5UOwomIzQzOwomIzQzO3VubG9jazoKJiM0MzsJcmN1X3JlYWRfdW5sb2NrX3RyYWNlKCk7CiYjNDM7CWlmIChlcnIpCiYjNDM7CQlyZXR1cm4gZXJyOwomIzQzOwomIzQzOwlpZiAoIWt0aHJlYWRfcXVldWVfd29yayhjdHgtJmd0O3dvcmtlciwgJmFtcDtjdHgtJmd0O3dvcmspKSB7CiYjNDM7CQlicGZfdGhyZWFkX3dxX2N0eF9wdXQoY3R4KTsKJiM0MzsJCXJldHVybiAtRUJVU1k7CiYjNDM7CX0KJiM0MzsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOwomIzQzO3ZvaWQgYnBmX3RocmVhZF93cV9jYW5jZWxfYW5kX2ZyZWUodm9pZCAqdmFsKQomIzQzO3sKJiM0MzsJc3RydWN0IGJwZl90aHJlYWRfd3Ffa2VybiAqdHdrID0gdmFsOwomIzQzOwlzdHJ1Y3QgYnBmX3RocmVhZF93cV9jdHggKmN0eDsKJiM0MzsKJiM0MzsJY3R4ID0geGNoZygmYW1wO3R3ay0mZ3Q7Y3R4LCBOVUxMKTsKJiM0MzsJaWYgKCFjdHgpCiYjNDM7CQlyZXR1cm47CiYjNDM7CiYjNDM7CW1pZ2h0X3NsZWVwKCk7CiYjNDM7CiYjNDM7CS8qCiYjNDM7CSAqIFByZXZlbnQgZnV0dXJlIGNhbGxiYWNrcyBmcm9tIHJ1bm5pbmcgYW5kIHdhaXQgZm9yIGFueQomIzQzOwkgKiBpbi1wcm9ncmVzcyBleGVjdXRpb24gdG8gZmluaXNoLgomIzQzOwkgKi8KJiM0MzsJV1JJVEVfT05DRShjdHgtJmd0O2NhbGxiYWNrX2ZuLCBOVUxMKTsKJiM0MzsJLyoKJiM0MzsJICoga3RocmVhZF9jYW5jZWxfd29ya19zeW5jKCkgcmV0dXJucyB0cnVlIHdoZW4gaXQgZGVxdWV1ZXMgYSBwZW5kaW5nCiYjNDM7CSAqIHdvcmsgaXRlbSBmcm9tIHRoZSB3b3JrX2xpc3Qgd2l0aG91dCBleGVjdXRpbmcgaXQuICBFYWNoIHN1Y2Nlc3NmdWwKJiM0MzsJICogYnBmX3RocmVhZF93cV9zdGFydCgpIGNhbGwgaW5jcmVtZW50cyBjdHgtJmd0O3JlZmNudCBhbmQgcmVsaWVzIG9uIHRoZQomIzQzOwkgKiBzdWJzZXF1ZW50IGJwZl90aHJlYWRfd3Ffd29ya19mbigpIGV4ZWN1dGlvbiB0byByZWxlYXNlIHRoYXQKJiM0MzsJICogcmVmZXJlbmNlIHZpYSBicGZfdGhyZWFkX3dxX2N0eF9wdXQoKS4gIElmIHRoZSB3b3JrIHdhcyBwZW5kaW5nIGFuZAomIzQzOwkgKiBnb3QgY2FuY2VsbGVkIGhlcmUsIHdvcmtfZm4gd2lsbCBuZXZlciBydW4gZm9yIHRoYXQgcXVldWVkIGluc3RhbmNlLAomIzQzOwkgKiBzbyB3ZSBtdXN0IGRyb3AgdGhlIHJlZmVyZW5jZSBvdXJzZWx2ZXMgdG8gYXZvaWQgYSBwZXJtYW5lbnQgcmVmY291bnQKJiM0MzsJICogbGVhay4KJiM0MzsJICoKJiM0MzsJICogVGhpcyBjb3ZlcnMgdHdvIHNjZW5hcmlvcyB1bmlmb3JtbHk6CiYjNDM7CSAqICAxLiBUaGUgd29yayBpcyBwdXJlbHkgcGVuZGluZyAobm90IGN1cnJlbnRseSBleGVjdXRpbmcpIC0gZS5nLiBhCiYjNDM7CSAqICAgICBub3JtYWwgYnBmX3RocmVhZF93cV9zdGFydCgpIGNhbGwgcXVldWVkIGl0IGJ1dCB0aGUgd29ya2VyCiYjNDM7CSAqICAgICB0aHJlYWQgaGFzbiYjMzk7dCBwaWNrZWQgaXQgdXAgeWV0LgomIzQzOwkgKiAgMi4gVGhlIHdvcmsgaXMgY3VycmVudGx5IGluLWZsaWdodCBBTkQgd2FzIHNlbGYtcmVzY2hlZHVsZWQgZnJvbQomIzQzOwkgKiAgICAgd2l0aGluIHRoZSBjYWxsYmFjayAtIGt0aHJlYWRfY2FuY2VsX3dvcmtfc3luYygpIGRlcXVldWVzIHRoZQomIzQzOwkgKiAgICAgcmUtcXVldWVkIHBlbmRpbmcgbm9kZSBhbmQgdGhlbiB3YWl0cyBmb3IgdGhlIGluLWZsaWdodAomIzQzOwkgKiAgICAgZXhlY3V0aW9uIHRvIGNvbXBsZXRlLgomIzQzOwkgKiBJbiBib3RoIGNhc2VzIHRoZSByZXR1cm4gdmFsdWUgaXMgdHJ1ZSwgaW5kaWNhdGluZyBvbmUgb3JwaGFuZWQKJiM0MzsJICogcmVmZXJlbmNlIHRoYXQgbmVlZHMgdG8gYmUgcmVsZWFzZWQgaGVyZS4KJiM0MzsJICovCiYjNDM7CWlmIChrdGhyZWFkX2NhbmNlbF93b3JrX3N5bmMoJmFtcDtjdHgtJmd0O3dvcmspKQomIzQzOwkJYnBmX3RocmVhZF93cV9jdHhfcHV0KGN0eCk7CiYjNDM7CiYjNDM7CS8qCiYjNDM7CSAqIERyb3Agb3VyIG93biByZWZlcmVuY2UuICBJZiB0aGUgd29yayB3YXMgc3RpbGwgaW4tZmxpZ2h0IGFib3ZlLAomIzQzOwkgKiB0aGUgcmVmY291bnQgd29uJiMzOTt0IGhpdCB6ZXJvIGhlcmUgLSBpdCB3aWxsIHJlYWNoIHplcm8gd2hlbiB0aGUKJiM0MzsJICogd29yayBwYXRoIGNhbGxzIGJwZl90aHJlYWRfd3FfY3R4X3B1dCgpIHVwb24gY29tcGxldGlvbi4gIEVpdGhlcgomIzQzOwkgKiB3YXksIGZpbmFsIGNsZWFudXAgKHdvcmtlciBkZXN0cnVjdGlvbiwgcHJvZyBwdXQsIGNncm91cCBwdXQsCiYjNDM7CSAqIGtmcmVlKSBoYXBwZW5zIGV4Y2x1c2l2ZWx5IGluIHRoZSBSQ1UgY2FsbGJhY2sgdG8ga2VlcCB0aGUKJiM0MzsJICogdGVhcmRvd24gcGF0aCBzaW5nbGUtdGhyZWFkZWQuCiYjNDM7CSAqLwomIzQzOwlicGZfdGhyZWFkX3dxX2N0eF9wdXQoY3R4KTsKJiM0Mzt9CiYjNDM7CiBfX2JwZl9rZnVuY19lbmRfZGVmcygpOwogCiBzdGF0aWMgdm9pZCBicGZfdGFza193b3JrX2NhbmNlbF9zY2hlZHVsZWQoc3RydWN0IGlycV93b3JrICppcnFfd29yaykKQEAgLTQ5MTcsNiAmIzQzOzUzMjEsOCBAQCBCVEZfSURfRkxBR1MoZnVuYywgYnBmX21vZGlmeV9yZXR1cm5fdGVzdF90cCkKIEJURl9JRF9GTEFHUyhmdW5jLCBicGZfd3FfaW5pdCkKIEJURl9JRF9GTEFHUyhmdW5jLCBicGZfd3Ffc2V0X2NhbGxiYWNrLCBLRl9JTVBMSUNJVF9BUkdTKQogQlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl93cV9zdGFydCkKJiM0MztCVEZfSURfRkxBR1MoZnVuYywgYnBmX3RocmVhZF93cV9zZXRfY2FsbGJhY2ssIEtGX0lNUExJQ0lUX0FSR1MpCiYjNDM7QlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl90aHJlYWRfd3Ffc3RhcnQpCiBCVEZfSURfRkxBR1MoZnVuYywgYnBmX3ByZWVtcHRfZGlzYWJsZSkKIEJURl9JRF9GTEFHUyhmdW5jLCBicGZfcHJlZW1wdF9lbmFibGUpCiBCVEZfSURfRkxBR1MoZnVuYywgYnBmX2l0ZXJfYml0c19uZXcsIEtGX0lURVJfTkVXKQpAQCAtNDk3OCw2ICYjNDM7NTM4NCwxNSBAQCBzdGF0aWMgY29uc3Qgc3RydWN0IGJ0Zl9rZnVuY19pZF9zZXQgY29tbW9uX2tmdW5jX3NldCA9IHsKIAkuc2V0ICAgPSAmYW1wO2NvbW1vbl9idGZfaWRzLAogfTsKIAomIzQzO0JURl9LRlVOQ1NfU1RBUlQoc3lzY2FsbF9idGZfaWRzKQomIzQzO0JURl9JRF9GTEFHUyhmdW5jLCBicGZfdGhyZWFkX3dxX2luaXQsIEtGX1NMRUVQQUJMRSkKJiM0MztCVEZfS0ZVTkNTX0VORChzeXNjYWxsX2J0Zl9pZHMpCiYjNDM7CiYjNDM7c3RhdGljIGNvbnN0IHN0cnVjdCBidGZfa2Z1bmNfaWRfc2V0IHN5c2NhbGxfa2Z1bmNfc2V0ID0gewomIzQzOwkub3duZXIgPSBUSElTX01PRFVMRSwKJiM0MzsJLnNldCAgID0gJmFtcDtzeXNjYWxsX2J0Zl9pZHMsCiYjNDM7fTsKJiM0MzsKIHN0YXRpYyBpbnQgX19pbml0IGtmdW5jX2luaXQodm9pZCkKIHsKIAlpbnQgcmV0OwpAQCAtNTAwMCw2ICYjNDM7NTQxNSw3IEBAIHN0YXRpYyBpbnQgX19pbml0IGtmdW5jX2luaXQodm9pZCkKIAlyZXQgPSByZXQgPzogcmVnaXN0ZXJfYnRmX2tmdW5jX2lkX3NldChCUEZfUFJPR19UWVBFX1NUUlVDVF9PUFMsICZhbXA7Z2VuZXJpY19rZnVuY19zZXQpOwogCXJldCA9IHJldCA/OiByZWdpc3Rlcl9idGZfa2Z1bmNfaWRfc2V0KEJQRl9QUk9HX1RZUEVfU1lTQ0FMTCwgJmFtcDtnZW5lcmljX2tmdW5jX3NldCk7CiAJcmV0ID0gcmV0ID86IHJlZ2lzdGVyX2J0Zl9rZnVuY19pZF9zZXQoQlBGX1BST0dfVFlQRV9DR1JPVVBfU0tCLCAmYW1wO2dlbmVyaWNfa2Z1bmNfc2V0KTsKJiM0MzsJcmV0ID0gcmV0ID86IHJlZ2lzdGVyX2J0Zl9rZnVuY19pZF9zZXQoQlBGX1BST0dfVFlQRV9TWVNDQUxMLCAmYW1wO3N5c2NhbGxfa2Z1bmNfc2V0KTsKIAlyZXQgPSByZXQgPzogcmVnaXN0ZXJfYnRmX2lkX2R0b3Jfa2Z1bmNzKGdlbmVyaWNfZHRvcnMsCiAJCQkJCQkgIEFSUkFZX1NJWkUoZ2VuZXJpY19kdG9ycyksCiAJCQkJCQkgIFRISVNfTU9EVUxFKTsKQEAgLTUwMzcsNCAmIzQzOzU0NTMsNiBAQCB2b2lkIGJwZl9tYXBfZnJlZV9pbnRlcm5hbF9zdHJ1Y3RzKHN0cnVjdCBicGZfbWFwICptYXAsIHZvaWQgKnZhbCkKIAkJYnBmX29ial9mcmVlX3dvcmtxdWV1ZShtYXAtJmd0O3JlY29yZCwgdmFsKTsKIAlpZiAoYnRmX3JlY29yZF9oYXNfZmllbGQobWFwLSZndDtyZWNvcmQsIEJQRl9UQVNLX1dPUkspKQogCQlicGZfb2JqX2ZyZWVfdGFza193b3JrKG1hcC0mZ3Q7cmVjb3JkLCB2YWwpOwomIzQzOwlpZiAoYnRmX3JlY29yZF9oYXNfZmllbGQobWFwLSZndDtyZWNvcmQsIEJQRl9USFJFQURfV1EpKQomIzQzOwkJYnBmX29ial9mcmVlX3RocmVhZF93cShtYXAtJmd0O3JlY29yZCwgdmFsKTsKIH0KZGlmZiAtLWdpdCBhL2tlcm5lbC9icGYvc3lzY2FsbC5jIGIva2VybmVsL2JwZi9zeXNjYWxsLmMKaW5kZXggOGQxMTFkYTg4NjU1My4uZGVhMTQ4MjNiYWNkMiAxMDA2NDQKLS0tIGEva2VybmVsL2JwZi9zeXNjYWxsLmMKJiM0MzsmIzQzOyYjNDM7IGIva2VybmVsL2JwZi9zeXNjYWxsLmMKQEAgLTY4OCw2ICYjNDM7Njg4LDcgQEAgdm9pZCBidGZfcmVjb3JkX2ZyZWUoc3RydWN0IGJ0Zl9yZWNvcmQgKnJlYykKIAkJY2FzZSBCUEZfUkVGQ09VTlQ6CiAJCWNhc2UgQlBGX1dPUktRVUVVRToKIAkJY2FzZSBCUEZfVEFTS19XT1JLOgomIzQzOwkJY2FzZSBCUEZfVEhSRUFEX1dROgogCQkJLyogTm90aGluZyB0byByZWxlYXNlICovCiAJCQlicmVhazsKIAkJZGVmYXVsdDoKQEAgLTc0Miw2ICYjNDM7NzQzLDcgQEAgc3RydWN0IGJ0Zl9yZWNvcmQgKmJ0Zl9yZWNvcmRfZHVwKGNvbnN0IHN0cnVjdCBidGZfcmVjb3JkICpyZWMpCiAJCWNhc2UgQlBGX1JFRkNPVU5UOgogCQljYXNlIEJQRl9XT1JLUVVFVUU6CiAJCWNhc2UgQlBGX1RBU0tfV09SSzoKJiM0MzsJCWNhc2UgQlBGX1RIUkVBRF9XUToKIAkJCS8qIE5vdGhpbmcgdG8gYWNxdWlyZSAqLwogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CkBAIC04MDcsNiAmIzQzOzgwOSwxMyBAQCB2b2lkIGJwZl9vYmpfZnJlZV90YXNrX3dvcmsoY29uc3Qgc3RydWN0IGJ0Zl9yZWNvcmQgKnJlYywgdm9pZCAqb2JqKQogCWJwZl90YXNrX3dvcmtfY2FuY2VsX2FuZF9mcmVlKG9iaiAmIzQzOyByZWMtJmd0O3Rhc2tfd29ya19vZmYpOwogfQogCiYjNDM7dm9pZCBicGZfb2JqX2ZyZWVfdGhyZWFkX3dxKGNvbnN0IHN0cnVjdCBidGZfcmVjb3JkICpyZWMsIHZvaWQgKm9iaikKJiM0Mzt7CiYjNDM7CWlmIChXQVJOX09OX09OQ0UoIWJ0Zl9yZWNvcmRfaGFzX2ZpZWxkKHJlYywgQlBGX1RIUkVBRF9XUSkpKQomIzQzOwkJcmV0dXJuOwomIzQzOwlicGZfdGhyZWFkX3dxX2NhbmNlbF9hbmRfZnJlZShvYmogJiM0MzsgcmVjLSZndDt0aHJlYWRfd3Ffb2ZmKTsKJiM0Mzt9CiYjNDM7CiB2b2lkIGJwZl9vYmpfY2FuY2VsX2ZpZWxkcyhzdHJ1Y3QgYnBmX21hcCAqbWFwLCB2b2lkICpvYmopCiB7CiAJYnBmX21hcF9mcmVlX2ludGVybmFsX3N0cnVjdHMobWFwLCBvYmopOwpAQCAtODM5LDYgJiM0Mzs4NDgsOSBAQCB2b2lkIGJwZl9vYmpfZnJlZV9maWVsZHMoY29uc3Qgc3RydWN0IGJ0Zl9yZWNvcmQgKnJlYywgdm9pZCAqb2JqKQogCQljYXNlIEJQRl9UQVNLX1dPUks6CiAJCQlicGZfdGFza193b3JrX2NhbmNlbF9hbmRfZnJlZShmaWVsZF9wdHIpOwogCQkJYnJlYWs7CiYjNDM7CQljYXNlIEJQRl9USFJFQURfV1E6CiYjNDM7CQkJYnBmX3RocmVhZF93cV9jYW5jZWxfYW5kX2ZyZWUoZmllbGRfcHRyKTsKJiM0MzsJCQlicmVhazsKIAkJY2FzZSBCUEZfS1BUUl9VTlJFRjoKIAkJCVdSSVRFX09OQ0UoKih1NjQgKilmaWVsZF9wdHIsIDApOwogCQkJYnJlYWs7CkBAIC0xMjY1LDcgJiM0MzsxMjc3LDcgQEAgc3RhdGljIGludCBtYXBfY2hlY2tfYnRmKHN0cnVjdCBicGZfbWFwICptYXAsIHN0cnVjdCBicGZfdG9rZW4gKnRva2VuLAogCW1hcC0mZ3Q7cmVjb3JkID0gYnRmX3BhcnNlX2ZpZWxkcyhidGYsIHZhbHVlX3R5cGUsCiAJCQkJICAgICAgIEJQRl9TUElOX0xPQ0sgfCBCUEZfUkVTX1NQSU5fTE9DSyB8IEJQRl9USU1FUiB8IEJQRl9LUFRSIHwgQlBGX0xJU1RfSEVBRCB8CiAJCQkJICAgICAgIEJQRl9SQl9ST09UIHwgQlBGX1JFRkNPVU5UIHwgQlBGX1dPUktRVUVVRSB8IEJQRl9VUFRSIHwKLQkJCQkgICAgICAgQlBGX1RBU0tfV09SSywKJiM0MzsJCQkJICAgICAgIEJQRl9UQVNLX1dPUksgfCBCUEZfVEhSRUFEX1dRLAogCQkJCSAgICAgICBtYXAtJmd0O3ZhbHVlX3NpemUpOwogCWlmICghSVNfRVJSX09SX05VTEwobWFwLSZndDtyZWNvcmQpKSB7CiAJCWludCBpOwpAQCAtMTI5OSw2ICYjNDM7MTMxMSw3IEBAIHN0YXRpYyBpbnQgbWFwX2NoZWNrX2J0ZihzdHJ1Y3QgYnBmX21hcCAqbWFwLCBzdHJ1Y3QgYnBmX3Rva2VuICp0b2tlbiwKIAkJCWNhc2UgQlBGX1RJTUVSOgogCQkJY2FzZSBCUEZfV09SS1FVRVVFOgogCQkJY2FzZSBCUEZfVEFTS19XT1JLOgomIzQzOwkJCWNhc2UgQlBGX1RIUkVBRF9XUToKIAkJCQlpZiAobWFwLSZndDttYXBfdHlwZSAhPSBCUEZfTUFQX1RZUEVfSEFTSCAmYW1wOyZhbXA7CiAJCQkJICAgIG1hcC0mZ3Q7bWFwX3R5cGUgIT0gQlBGX01BUF9UWVBFX1JIQVNIICZhbXA7JmFtcDsKIAkJCQkgICAgbWFwLSZndDttYXBfdHlwZSAhPSBCUEZfTUFQX1RZUEVfTFJVX0hBU0ggJmFtcDsmYW1wOwpkaWZmIC0tZ2l0IGEva2VybmVsL2JwZi92ZXJpZmllci5jIGIva2VybmVsL2JwZi92ZXJpZmllci5jCmluZGV4IGU2MjMzYzAwODFkMTAuLjQ0ZTc5ZmU0ODBiNmIgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9icGYvdmVyaWZpZXIuYwomIzQzOyYjNDM7JiM0MzsgYi9rZXJuZWwvYnBmL3ZlcmlmaWVyLmMKQEAgLTQ3Nyw2ICYjNDM7NDc3LDcgQEAgc3RhdGljIGJvb2wgaXNfYXN5bmNfY2FsbGJhY2tfY2FsbGluZ19rZnVuYyh1MzIgYnRmX2lkKTsKIHN0YXRpYyBib29sIGlzX2NhbGxiYWNrX2NhbGxpbmdfa2Z1bmModTMyIGJ0Zl9pZCk7CiAKIHN0YXRpYyBib29sIGlzX2JwZl93cV9zZXRfY2FsbGJhY2tfa2Z1bmModTMyIGJ0Zl9pZCk7CiYjNDM7c3RhdGljIGJvb2wgaXNfYnBmX3RocmVhZF93cV9zZXRfY2FsbGJhY2tfa2Z1bmModTMyIGJ0Zl9pZCk7CiBzdGF0aWMgYm9vbCBpc190YXNrX3dvcmtfYWRkX2tmdW5jKHUzMiBmdW5jX2lkKTsKIAogc3RhdGljIGJvb2wgaXNfc3luY19jYWxsYmFja19jYWxsaW5nX2Z1bmN0aW9uKGVudW0gYnBmX2Z1bmNfaWQgZnVuY19pZCkKQEAgLTUxNiw5ICYjNDM7NTE3LDExIEBAIHN0YXRpYyBib29sIGlzX2FzeW5jX2NiX3NsZWVwYWJsZShzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52LCBzdHJ1Y3QgYnBmX2luc24KIAlpZiAoYnBmX2hlbHBlcl9jYWxsKGluc24pICZhbXA7JmFtcDsgaW5zbi0mZ3Q7aW1tID09IEJQRl9GVU5DX3RpbWVyX3NldF9jYWxsYmFjaykKIAkJcmV0dXJuIGZhbHNlOwogCi0JLyogYnBmX3dxIGFuZCBicGZfdGFza193b3JrIGNhbGxiYWNrcyBhcmUgYWx3YXlzIHNsZWVwYWJsZS4gKi8KJiM0MzsJLyogYnBmX3dxLCBicGZfdGhyZWFkX3dxIGFuZCBicGZfdGFza193b3JrIGNhbGxiYWNrcyBhcmUgYWx3YXlzIHNsZWVwYWJsZS4gKi8KIAlpZiAoYnBmX3BzZXVkb19rZnVuY19jYWxsKGluc24pICZhbXA7JmFtcDsgaW5zbi0mZ3Q7b2ZmID09IDAgJmFtcDsmYW1wOwotCSAgICAoaXNfYnBmX3dxX3NldF9jYWxsYmFja19rZnVuYyhpbnNuLSZndDtpbW0pIHx8IGlzX3Rhc2tfd29ya19hZGRfa2Z1bmMoaW5zbi0mZ3Q7aW1tKSkpCiYjNDM7CSAgICAoaXNfYnBmX3dxX3NldF9jYWxsYmFja19rZnVuYyhpbnNuLSZndDtpbW0pIHx8CiYjNDM7CSAgICAgaXNfYnBmX3RocmVhZF93cV9zZXRfY2FsbGJhY2tfa2Z1bmMoaW5zbi0mZ3Q7aW1tKSB8fAomIzQzOwkgICAgIGlzX3Rhc2tfd29ya19hZGRfa2Z1bmMoaW5zbi0mZ3Q7aW1tKSkpCiAJCXJldHVybiB0cnVlOwogCiAJdmVyaWZpZXJfYnVnKGVudiwgJiMzNDt1bmhhbmRsZWQgYXN5bmMgY2FsbGJhY2sgaW4gaXNfYXN5bmNfY2Jfc2xlZXBhYmxlJiMzNDspOwpAQCAtMTg3MSw3ICYjNDM7MTg3NCwxMCBAQCBzdGF0aWMgdm9pZCByZWZpbmVfbWFwX2xvb2t1cF92YWx1ZShzdHJ1Y3QgYnBmX3JlZ19zdGF0ZSAqcmVnKQogCQkgKiBhcyBVSUQgb2YgdGhlIGlubmVyIG1hcC4KIAkJICovCiAJCWlmIChidGZfcmVjb3JkX2hhc19maWVsZChtYXAtJmd0O2lubmVyX21hcF9tZXRhLSZndDtyZWNvcmQsCi0JCQkJCSBCUEZfVElNRVIgfCBCUEZfV09SS1FVRVVFIHwgQlBGX1RBU0tfV09SSykpCiYjNDM7CQkJCQkgQlBGX1RJTUVSIHwKJiM0MzsJCQkJCSBCUEZfV09SS1FVRVVFIHwKJiM0MzsJCQkJCSBCUEZfVEFTS19XT1JLIHwKJiM0MzsJCQkJCSBCUEZfVEhSRUFEX1dRKSkKIAkJCXJlZy0mZ3Q7bWFwX3VpZCA9IHJlZy0mZ3Q7aWQ7CiAJfSBlbHNlIGlmIChtYXAtJmd0O21hcF90eXBlID09IEJQRl9NQVBfVFlQRV9YU0tNQVApIHsKIAkJcmVnLSZndDt0eXBlID0gUFRSX1RPX1hEUF9TT0NLIHwgbWF5YmVfbnVsbDsKQEAgLTcyNDMsNiAmIzQzOzcyNDksOSBAQCBzdGF0aWMgaW50IGNoZWNrX21hcF9maWVsZF9wb2ludGVyKHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsIHN0cnVjdCBicGZfcmVnXwogCWNhc2UgQlBGX1dPUktRVUVVRToKIAkJZmllbGRfb2ZmID0gbWFwLSZndDtyZWNvcmQtJmd0O3dxX29mZjsKIAkJYnJlYWs7CiYjNDM7CWNhc2UgQlBGX1RIUkVBRF9XUToKJiM0MzsJCWZpZWxkX29mZiA9IG1hcC0mZ3Q7cmVjb3JkLSZndDt0aHJlYWRfd3Ffb2ZmOwomIzQzOwkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJdmVyaWZpZXJfYnVnKGVudiwgJiMzNDt1bnN1cHBvcnRlZCBCVEYgZmllbGQgdHlwZTogJXNcbiYjMzQ7LCBzdHJ1Y3RfbmFtZSk7CiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMTA5NDAsNiAmIzQzOzEwOTQ5LDcgQEAgZW51bSB7CiAJS0ZfQVJHX1dPUktRVUVVRV9JRCwKIAlLRl9BUkdfUkVTX1NQSU5fTE9DS19JRCwKIAlLRl9BUkdfVEFTS19XT1JLX0lELAomIzQzOwlLRl9BUkdfVEhSRUFEX1dRX0lELAogCUtGX0FSR19QUk9HX0FVWF9JRCwKIAlLRl9BUkdfVElNRVJfSUQKIH07CkBAIC0xMDk1Myw2ICYjNDM7MTA5NjMsNyBAQCBCVEZfSUQoc3RydWN0LCBicGZfcmJfbm9kZSkKIEJURl9JRChzdHJ1Y3QsIGJwZl93cSkKIEJURl9JRChzdHJ1Y3QsIGJwZl9yZXNfc3Bpbl9sb2NrKQogQlRGX0lEKHN0cnVjdCwgYnBmX3Rhc2tfd29yaykKJiM0MztCVEZfSUQoc3RydWN0LCBicGZfdGhyZWFkX3dxKQogQlRGX0lEKHN0cnVjdCwgYnBmX3Byb2dfYXV4KQogQlRGX0lEKHN0cnVjdCwgYnBmX3RpbWVyKQogCkBAIC0xMTAxMyw2ICYjNDM7MTEwMjQsMTEgQEAgc3RhdGljIGJvb2wgaXNfa2Z1bmNfYXJnX3Rhc2tfd29yayhjb25zdCBzdHJ1Y3QgYnRmICpidGYsIGNvbnN0IHN0cnVjdCBidGZfcGFyYW0KIAlyZXR1cm4gX19pc19rZnVuY19wdHJfYXJnX3R5cGUoYnRmLCBhcmcsIEtGX0FSR19UQVNLX1dPUktfSUQpOwogfQogCiYjNDM7c3RhdGljIGJvb2wgaXNfa2Z1bmNfYXJnX3RocmVhZF93cShjb25zdCBzdHJ1Y3QgYnRmICpidGYsIGNvbnN0IHN0cnVjdCBidGZfcGFyYW0gKmFyZykKJiM0Mzt7CiYjNDM7CXJldHVybiBfX2lzX2tmdW5jX3B0cl9hcmdfdHlwZShidGYsIGFyZywgS0ZfQVJHX1RIUkVBRF9XUV9JRCk7CiYjNDM7fQomIzQzOwogc3RhdGljIGJvb2wgaXNfa2Z1bmNfYXJnX3Jlc19zcGluX2xvY2soY29uc3Qgc3RydWN0IGJ0ZiAqYnRmLCBjb25zdCBzdHJ1Y3QgYnRmX3BhcmFtICphcmcpCiB7CiAJcmV0dXJuIF9faXNfa2Z1bmNfcHRyX2FyZ190eXBlKGJ0ZiwgYXJnLCBLRl9BUkdfUkVTX1NQSU5fTE9DS19JRCk7CkBAIC0xMTEzMiw2ICYjNDM7MTExNDgsNyBAQCBlbnVtIGtmdW5jX3B0cl9hcmdfdHlwZSB7CiAJS0ZfQVJHX1BUUl9UT19JUlFfRkxBRywKIAlLRl9BUkdfUFRSX1RPX1JFU19TUElOX0xPQ0ssCiAJS0ZfQVJHX1BUUl9UT19UQVNLX1dPUkssCiYjNDM7CUtGX0FSR19QVFJfVE9fVEhSRUFEX1dRLAogfTsKIAogZW51bSBzcGVjaWFsX2tmdW5jX3R5cGUgewpAQCAtMTExNzgsNiAmIzQzOzExMTk1LDcgQEAgZW51bSBzcGVjaWFsX2tmdW5jX3R5cGUgewogCUtGX2JwZl9wZXJjcHVfb2JqX2Ryb3AsCiAJS0ZfYnBmX3Rocm93LAogCUtGX2JwZl93cV9zZXRfY2FsbGJhY2ssCiYjNDM7CUtGX2JwZl90aHJlYWRfd3Ffc2V0X2NhbGxiYWNrLAogCUtGX2JwZl9wcmVlbXB0X2Rpc2FibGUsCiAJS0ZfYnBmX3ByZWVtcHRfZW5hYmxlLAogCUtGX2JwZl9pdGVyX2Nzc190YXNrX25ldywKQEAgLTExMjU4LDYgJiM0MzsxMTI3Niw3IEBAIEJURl9JRChmdW5jLCBicGZfcGVyY3B1X29ial9kcm9wX2ltcGwpCiBCVEZfSUQoZnVuYywgYnBmX3BlcmNwdV9vYmpfZHJvcCkKIEJURl9JRChmdW5jLCBicGZfdGhyb3cpCiBCVEZfSUQoZnVuYywgYnBmX3dxX3NldF9jYWxsYmFjaykKJiM0MztCVEZfSUQoZnVuYywgYnBmX3RocmVhZF93cV9zZXRfY2FsbGJhY2spCiBCVEZfSUQoZnVuYywgYnBmX3ByZWVtcHRfZGlzYWJsZSkKIEJURl9JRChmdW5jLCBicGZfcHJlZW1wdF9lbmFibGUpCiAjaWZkZWYgQ09ORklHX0NHUk9VUFMKQEAgLTExNDYwLDYgJiM0MzsxMTQ3OSw4IEBAIGdldF9rZnVuY19hcmdfdHlwZShzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52LCBzdHJ1Y3QgYnBmX2NhbGxfYXJnX21ldGEgKm1ldGEsCiAJCWFyZ190eXBlID0gS0ZfQVJHX1BUUl9UT19USU1FUjsKIAllbHNlIGlmIChpc19rZnVuY19hcmdfdGFza193b3JrKG1ldGEtJmd0O2J0ZiwgJmFtcDthcmdzW2FyZ10pKQogCQlhcmdfdHlwZSA9IEtGX0FSR19QVFJfVE9fVEFTS19XT1JLOwomIzQzOwllbHNlIGlmIChpc19rZnVuY19hcmdfdGhyZWFkX3dxKG1ldGEtJmd0O2J0ZiwgJmFtcDthcmdzW2FyZ10pKQomIzQzOwkJYXJnX3R5cGUgPSBLRl9BUkdfUFRSX1RPX1RIUkVBRF9XUTsKIAllbHNlIGlmIChpc19rZnVuY19hcmdfaXJxX2ZsYWcobWV0YS0mZ3Q7YnRmLCAmYW1wO2FyZ3NbYXJnXSkpCiAJCWFyZ190eXBlID0gS0ZfQVJHX1BUUl9UT19JUlFfRkxBRzsKIAllbHNlIGlmIChpc19rZnVuY19hcmdfcmVzX3NwaW5fbG9jayhtZXRhLSZndDtidGYsICZhbXA7YXJnc1thcmddKSkKQEAgLTExODMzLDYgJiM0MzsxMTg1NCw3IEBAIHN0YXRpYyBib29sIGlzX3N5bmNfY2FsbGJhY2tfY2FsbGluZ19rZnVuYyh1MzIgYnRmX2lkKQogc3RhdGljIGJvb2wgaXNfYXN5bmNfY2FsbGJhY2tfY2FsbGluZ19rZnVuYyh1MzIgYnRmX2lkKQogewogCXJldHVybiBpc19icGZfd3Ffc2V0X2NhbGxiYWNrX2tmdW5jKGJ0Zl9pZCkgfHwKJiM0MzsJICAgICAgIGlzX2JwZl90aHJlYWRfd3Ffc2V0X2NhbGxiYWNrX2tmdW5jKGJ0Zl9pZCkgfHwKIAkgICAgICAgaXNfdGFza193b3JrX2FkZF9rZnVuYyhidGZfaWQpOwogfQogCkBAIC0xMTg0Nyw2ICYjNDM7MTE4NjksMTEgQEAgc3RhdGljIGJvb2wgaXNfYnBmX3dxX3NldF9jYWxsYmFja19rZnVuYyh1MzIgYnRmX2lkKQogCXJldHVybiBidGZfaWQgPT0gc3BlY2lhbF9rZnVuY19saXN0W0tGX2JwZl93cV9zZXRfY2FsbGJhY2tdOwogfQogCiYjNDM7c3RhdGljIGJvb2wgaXNfYnBmX3RocmVhZF93cV9zZXRfY2FsbGJhY2tfa2Z1bmModTMyIGJ0Zl9pZCkKJiM0Mzt7CiYjNDM7CXJldHVybiBidGZfaWQgPT0gc3BlY2lhbF9rZnVuY19saXN0W0tGX2JwZl90aHJlYWRfd3Ffc2V0X2NhbGxiYWNrXTsKJiM0Mzt9CiYjNDM7CiBzdGF0aWMgYm9vbCBpc19jYWxsYmFja19jYWxsaW5nX2tmdW5jKHUzMiBidGZfaWQpCiB7CiAJcmV0dXJuIGlzX3N5bmNfY2FsbGJhY2tfY2FsbGluZ19rZnVuYyhidGZfaWQpIHx8CkBAIC0xMjE5Miw2ICYjNDM7MTIyMTksNyBAQCBzdGF0aWMgaW50IGNoZWNrX2tmdW5jX2FyZ3Moc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudiwgc3RydWN0IGJwZl9jYWxsX2FyZ19tZQogCQljYXNlIEtGX0FSR19QVFJfVE9fV09SS1FVRVVFOgogCQljYXNlIEtGX0FSR19QVFJfVE9fVElNRVI6CiAJCWNhc2UgS0ZfQVJHX1BUUl9UT19UQVNLX1dPUks6CiYjNDM7CQljYXNlIEtGX0FSR19QVFJfVE9fVEhSRUFEX1dROgogCQljYXNlIEtGX0FSR19QVFJfVE9fSVJRX0ZMQUc6CiAJCWNhc2UgS0ZfQVJHX1BUUl9UT19SRVNfU1BJTl9MT0NLOgogCQkJYnJlYWs7CkBAIC0xMzEzOSw2ICYjNDM7MTMxNjcsMTYgQEAgc3RhdGljIGludCBjaGVja19rZnVuY19jYWxsKHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsIHN0cnVjdCBicGZfaW5zbiAqaW5zbiwKIAkJfQogCX0KIAomIzQzOwlpZiAoaXNfYnBmX3RocmVhZF93cV9zZXRfY2FsbGJhY2tfa2Z1bmMobWV0YS5mdW5jX2lkKSkgewomIzQzOwkJZXJyID0gcHVzaF9jYWxsYmFja19jYWxsKGVudiwgaW5zbiwgaW5zbl9pZHgsIG1ldGEuc3VicHJvZ25vLAomIzQzOwkJCQkJIHNldF90aW1lcl9jYWxsYmFja19zdGF0ZSk7CiYjNDM7CQlpZiAoZXJyKSB7CiYjNDM7CQkJdmVyYm9zZShlbnYsICYjMzQ7a2Z1bmMgJXMjJWQgZmFpbGVkIGNhbGxiYWNrIHZlcmlmaWNhdGlvblxuJiMzNDssCiYjNDM7CQkJCWZ1bmNfbmFtZSwgbWV0YS5mdW5jX2lkKTsKJiM0MzsJCQlyZXR1cm4gZXJyOwomIzQzOwkJfQomIzQzOwl9CiYjNDM7CiAJaWYgKGlzX3Rhc2tfd29ya19hZGRfa2Z1bmMobWV0YS5mdW5jX2lkKSkgewogCQllcnIgPSBwdXNoX2NhbGxiYWNrX2NhbGwoZW52LCBpbnNuLCBpbnNuX2lkeCwgbWV0YS5zdWJwcm9nbm8sCiAJCQkJCSBzZXRfdGFza193b3JrX3NjaGVkdWxlX2NhbGxiYWNrX3N0YXRlKTsKZGlmZiAtLWdpdCBhL2tlcm5lbC9jZ3JvdXAvY2dyb3VwLmMgYi9rZXJuZWwvY2dyb3VwL2Nncm91cC5jCmluZGV4IDM4ZjhkOWRmOGZiYzQuLjE2NGUwNjljNzU3NjIgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9jZ3JvdXAvY2dyb3VwLmMKJiM0MzsmIzQzOyYjNDM7IGIva2VybmVsL2Nncm91cC9jZ3JvdXAuYwpAQCAtMzA0Miw2ICYjNDM7MzA0MiwxOSBAQCBpbnQgY2dyb3VwX2F0dGFjaF90YXNrKHN0cnVjdCBjZ3JvdXAgKmRzdF9jZ3JwLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKmxlYWRlciwKIAlyZXR1cm4gcmV0OwogfQogCiYjNDM7aW50IGNncm91cF9rdGhyZWFkX2F0dGFjaChzdHJ1Y3QgY2dyb3VwICpjZ3JwLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spCiYjNDM7ewomIzQzOwlpbnQgcmV0OwomIzQzOwomIzQzOwljZ3JvdXBfbG9jaygpOwomIzQzOwljZ3JvdXBfYXR0YWNoX2xvY2soQ0dSUF9BVFRBQ0hfTE9DS19HTE9CQUwsIE5VTEwpOwomIzQzOwlyZXQgPSBjZ3JvdXBfYXR0YWNoX3Rhc2soY2dycCwgdGFzaywgZmFsc2UpOwomIzQzOwljZ3JvdXBfYXR0YWNoX3VubG9jayhDR1JQX0FUVEFDSF9MT0NLX0dMT0JBTCwgTlVMTCk7CiYjNDM7CWNncm91cF91bmxvY2soKTsKJiM0MzsKJiM0MzsJcmV0dXJuIHJldDsKJiM0Mzt9CiYjNDM7CiBzdHJ1Y3QgdGFza19zdHJ1Y3QgKmNncm91cF9wcm9jc193cml0ZV9zdGFydChjaGFyICpidWYsIGJvb2wgdGhyZWFkZ3JvdXAsCiAJCQkJCSAgICAgZW51bSBjZ3JvdXBfYXR0YWNoX2xvY2tfbW9kZSAqbG9ja19tb2RlKQogewpkaWZmIC0tZ2l0IGEvbW0vYnBmX21lbWNvbnRyb2wuYyBiL21tL2JwZl9tZW1jb250cm9sLmMKaW5kZXggNzE2ZGY0OWQ3NjQ3Ny4uM2Y3YTVjOTdlMTM1NSAxMDA2NDQKLS0tIGEvbW0vYnBmX21lbWNvbnRyb2wuYwomIzQzOyYjNDM7JiM0MzsgYi9tbS9icGZfbWVtY29udHJvbC5jCkBAIC02LDYgJiM0Mzs2LDcgQEAKICAqLwogCiAjaW5jbHVkZSAmbHQ7bGludXgvbWVtY29udHJvbC5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9zd2FwLmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7bGludXgvYnBmLmgmZ3Q7CiAKIF9fYnBmX2tmdW5jX3N0YXJ0X2RlZnMoKTsKQEAgLTE1OSw2ICYjNDM7MTYwLDYxIEBAIF9fYnBmX2tmdW5jIHZvaWQgYnBmX21lbV9jZ3JvdXBfZmx1c2hfc3RhdHMoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnKQogCW1lbV9jZ3JvdXBfZmx1c2hfc3RhdHMobWVtY2cpOwogfQogCiYjNDM7LyoqCiYjNDM7ICogYnBmX3RyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMgLSBhdHRlbXB0IHRvIHJlY2xhaW0gcGFnZXMgZnJvbQomIzQzOyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSBtZW1vcnkgY2dyb3VwCiYjNDM7ICogQG1lbWNnOiAgICAgICAgICAgdGhlIHRhcmdldCBtZW1vcnkgY2dyb3VwIHRvIHJlY2xhaW0gZnJvbQomIzQzOyAqIEBucl9wYWdlczogICAgICAgIHRoZSBudW1iZXIgb2YgcGFnZXMgdG8gcmVjbGFpbQomIzQzOyAqIEBnZnBfbWFzazogICAgICAgIEdGUCBmbGFncyBjb250cm9sbGluZyB0aGUgcmVjbGFpbSBiZWhhdmlvcgomIzQzOyAqIEByZWNsYWltX29wdGlvbnM6IGJpdG1hc2sgb2YgTUVNQ0dfUkVDTEFJTV8qIGZsYWdzIHRvIHR1bmUKJiM0MzsgKiAgICAgICAgICAgICAgICAgICByZWNsYWltIHN0cmF0ZWd5CiYjNDM7ICogQHN3YXBwaW5lc3M6ICAgICAgc3dhcHBpbmVzcyBvdmVycmlkZSB2YWx1ZSwgb3IgYSBzZW50aW5lbCB0byB1c2UKJiM0MzsgKiAgICAgICAgICAgICAgICAgICB0aGUgZGVmYXVsdAomIzQzOyAqCiYjNDM7ICogQlBGLWZhY2luZyB3cmFwcGVyIGFyb3VuZCB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKCkgdGhhdAomIzQzOyAqIHZhbGlkYXRlcyBhbmQgdHJhbnNsYXRlcyB0aGUgQHN3YXBwaW5lc3MgYXJndW1lbnQgYmVmb3JlCiYjNDM7ICogZGVsZWdhdGluZyB0byB0aGUgY29yZSByZWNsYWltIHBhdGguCiYjNDM7ICoKJiM0MzsgKiBUaGUgQHN3YXBwaW5lc3MgcGFyYW1ldGVyIGZvbGxvd3MgdGhlc2Ugc2VtYW50aWNzOgomIzQzOyAqICAgLSBWYWx1ZXMgaW4gW01JTl9TV0FQUElORVNTLCBTV0FQUElORVNTX0FOT05fT05MWV0gYXJlIHBhc3NlZAomIzQzOyAqICAgICB0aHJvdWdoIGFzIGFuIGV4cGxpY2l0IHN3YXBwaW5lc3Mgb3ZlcnJpZGUuCiYjNDM7ICogICAtIFZhbHVlcyBiZWxvdyBNSU5fU1dBUFBJTkVTUyBhcmUgdHJlYXRlZCBhcyAmIzM0O3VzZSB0aGUgc3lzdGVtCiYjNDM7ICogICAgIGRlZmF1bHQmIzM0OzsgdGhlIG92ZXJyaWRlIHBvaW50ZXIgaXMgc2V0IHRvIE5VTEwgYW5kIHRoZSBjZ3JvdXAmIzM5O3MKJiM0MzsgKiAgICAgb3duIHN3YXBwaW5lc3Mgc2V0dGluZyB0YWtlcyBlZmZlY3QuCiYjNDM7ICogICAtIFZhbHVlcyBhYm92ZSBTV0FQUElORVNTX0FOT05fT05MWSBhcmUgcmVqZWN0ZWQgYXMgaW52YWxpZC4KJiM0MzsgKiAgIC0gSWYgQHJlY2xhaW1fb3B0aW9ucyBkb2VzIG5vdCBpbmNsdWRlIE1FTUNHX1JFQ0xBSU1fUFJPQUNUSVZFLAomIzQzOyAqICAgICB0aGUgQHN3YXBwaW5lc3Mgb3ZlcnJpZGUgaXMgaWdub3JlZCBlbnRpcmVseSBieSB0aGUgY29yZQomIzQzOyAqICAgICByZWNsYWltIHBhdGggYW5kIHRoZSBzeXN0ZW0gZGVmYXVsdCBpcyB1c2VkIHJlZ2FyZGxlc3MuCiYjNDM7ICoKJiM0MzsgKiBTd2FwIHVzYWdlIGR1cmluZyByZWNsYWltIGlzIGdhdGVkIG9uIEByZWNsYWltX29wdGlvbnM6IHN3YXAgaXMKJiM0MzsgKiBjb25zaWRlcmVkIG9ubHkgd2hlbiBNRU1DR19SRUNMQUlNX01BWV9TV0FQIGlzIHNldC4gIFdpdGhvdXQgdGhpcwomIzQzOyAqIGZsYWcsIHJlY2xhaW0gaXMgcmVzdHJpY3RlZCB0byBmaWxlLWJhY2tlZCBwYWdlcyByZWdhcmRsZXNzIG9mIHRoZQomIzQzOyAqIEBzd2FwcGluZXNzIHZhbHVlIG9yIHRoZSBjZ3JvdXAmIzM5O3Mgc3dhcHBpbmVzcyBzZXR0aW5nLgomIzQzOyAqCiYjNDM7ICogUmV0dXJuOgomIzQzOyAqICAgVGhlIG51bWJlciBvZiBwYWdlcyBhY3R1YWxseSByZWNsYWltZWQgb24gc3VjY2Vzcywgb3IgMAomIzQzOyAqICAgaWYgQHN3YXBwaW5lc3MgZXhjZWVkcyBTV0FQUElORVNTX0FOT05fT05MWS4KJiM0MzsgKi8KJiM0MztfX2JwZl9rZnVuYyB1bnNpZ25lZCBsb25nCiYjNDM7YnBmX3RyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLAomIzQzOwkJCQkgdW5zaWduZWQgbG9uZyBucl9wYWdlcywKJiM0MzsJCQkJIGdmcF90IGdmcF9tYXNrLAomIzQzOwkJCQkgdW5zaWduZWQgaW50IHJlY2xhaW1fb3B0aW9ucywKJiM0MzsJCQkJIGludCBzd2FwcGluZXNzKQomIzQzO3sKJiM0MzsJaW50ICpzd2FwaW5lc3NfcHRyOwomIzQzOwomIzQzOwlpZiAoc3dhcHBpbmVzcyAmZ3Q7IFNXQVBQSU5FU1NfQU5PTl9PTkxZKQomIzQzOwkJcmV0dXJuIDA7CiYjNDM7CWVsc2UgaWYgKHN3YXBwaW5lc3MgJmx0OyBNSU5fU1dBUFBJTkVTUykKJiM0MzsJCXN3YXBpbmVzc19wdHIgPSBOVUxMOwomIzQzOwllbHNlCiYjNDM7CQlzd2FwaW5lc3NfcHRyID0gJmFtcDtzd2FwcGluZXNzOwomIzQzOwomIzQzOwlyZXR1cm4gdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcyhtZW1jZywgbnJfcGFnZXMsIGdmcF9tYXNrLAomIzQzOwkJCQkJICAgIHJlY2xhaW1fb3B0aW9ucywgc3dhcGluZXNzX3B0cik7CiYjNDM7fQomIzQzOwogX19icGZfa2Z1bmNfZW5kX2RlZnMoKTsKIAogQlRGX0tGVU5DU19TVEFSVChicGZfbWVtY29udHJvbF9rZnVuY3MpCkBAIC0xNzIsNiAmIzQzOzIyOCw4IEBAIEJURl9JRF9GTEFHUyhmdW5jLCBicGZfbWVtX2Nncm91cF91c2FnZSkKIEJURl9JRF9GTEFHUyhmdW5jLCBicGZfbWVtX2Nncm91cF9wYWdlX3N0YXRlKQogQlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9tZW1fY2dyb3VwX2ZsdXNoX3N0YXRzLCBLRl9TTEVFUEFCTEUpCiAKJiM0MztCVEZfSURfRkxBR1MoZnVuYywgYnBmX3RyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMsIEtGX1NMRUVQQUJMRSkKJiM0MzsKIEJURl9LRlVOQ1NfRU5EKGJwZl9tZW1jb250cm9sX2tmdW5jcykKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBidGZfa2Z1bmNfaWRfc2V0IGJwZl9tZW1jb250cm9sX2tmdW5jX3NldCA9IHsKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9icGZfZXhwZXJpbWVudGFsLmggYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvYnBmX2V4cGVyaW1lbnRhbC5oCmluZGV4IGZmMzdhZTVhMTEzZGMuLmVhOTA1ZWE1NjAzYzIgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9icGZfZXhwZXJpbWVudGFsLmgKJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL2JwZl9leHBlcmltZW50YWwuaApAQCAtMzUxLDYgJiM0MzszNTEsMTMgQEAgZXh0ZXJuIHZvaWQgYnBmX2l0ZXJfY3NzX2Rlc3Ryb3koc3RydWN0IGJwZl9pdGVyX2NzcyAqaXQpIF9fd2VhayBfX2tzeW07CiBleHRlcm4gaW50IGJwZl93cV9pbml0KHN0cnVjdCBicGZfd3EgKndxLCB2b2lkICpwX19tYXAsIHVuc2lnbmVkIGludCBmbGFncykgX193ZWFrIF9fa3N5bTsKIGV4dGVybiBpbnQgYnBmX3dxX3N0YXJ0KHN0cnVjdCBicGZfd3EgKndxLCB1bnNpZ25lZCBpbnQgZmxhZ3MpIF9fd2VhayBfX2tzeW07CiAKJiM0MztzdHJ1Y3QgYnBmX3RocmVhZF93cTsKJiM0MztleHRlcm4gaW50IGJwZl90aHJlYWRfd3FfaW5pdChzdHJ1Y3QgYnBmX3RocmVhZF93cSAqdHdxLCB2b2lkICpwX19tYXAsCiYjNDM7CQkJICAgICAgX191NjQgY2dyb3VwX2lkLAomIzQzOwkJCSAgICAgIHVuc2lnbmVkIGludCBmbGFncykgX193ZWFrIF9fa3N5bTsKJiM0MztleHRlcm4gaW50IGJwZl90aHJlYWRfd3Ffc3RhcnQoc3RydWN0IGJwZl90aHJlYWRfd3EgKnR3cSwKJiM0MzsJCQkgICAgICAgdW5zaWduZWQgaW50IGZsYWdzKSBfX3dlYWsgX19rc3ltOwomIzQzOwogc3RydWN0IGJwZl9pdGVyX2ttZW1fY2FjaGU7CiBleHRlcm4gaW50IGJwZl9pdGVyX2ttZW1fY2FjaGVfbmV3KHN0cnVjdCBicGZfaXRlcl9rbWVtX2NhY2hlICppdCkgX193ZWFrIF9fa3N5bTsKIGV4dGVybiBzdHJ1Y3Qga21lbV9jYWNoZSAqYnBmX2l0ZXJfa21lbV9jYWNoZV9uZXh0KHN0cnVjdCBicGZfaXRlcl9rbWVtX2NhY2hlICppdCkgX193ZWFrIF9fa3N5bTsKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL21lbWNnX2FzeW5jX3JlY2xhaW0uYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL21lbWNnX2FzeW5jX3JlY2xhaW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwLi40MGE1ZmU2MmNiMzg0Ci0tLSAvZGV2L251bGwKJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvbWVtY2dfYXN5bmNfcmVjbGFpbS5jCkBAIC0wLDAgJiM0MzsxLDQ3OSBAQAomIzQzOy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wCiYjNDM7LyoKJiM0MzsgKiBNZW1vcnkgY29udHJvbGxlciBlQlBGIGFzeW5jIHJlY2xhaW0gdGVzdAomIzQzOyAqLwomIzQzOwomIzQzOyNpbmNsdWRlICZsdDt0ZXN0X3Byb2dzLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N5cy9tbWFuLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N5cy9zdGF0LmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N5cy90aW1lLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N5cy92ZnMuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7c3lzL3dhaXQuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7ZmNudGwuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvbWFnaWMuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7dW5pc3RkLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N0ZGlvLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N0ZGxpYi5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtzdHJpbmcuaCZndDsKJiM0MzsKJiM0MzsjaW5jbHVkZSAmIzM0O2Nncm91cF9oZWxwZXJzLmgmIzM0OwomIzQzOwomIzQzO3N0cnVjdCBicGZfYXJnc19zIHsKJiM0MzsJdTY0IGhpZ2hfY2dyb3VwX2lkOwomIzQzOwl1NjQgbG93X2Nncm91cF9pZDsKJiM0MzsJdTY0IGV2ZW50X2RlbHRhX3RocmVzaG9sZDsKJiM0MzsJdTY0IGNoZWNrX25zOwomIzQzO307CiYjNDM7CiYjNDM7I2luY2x1ZGUgJiMzNDttZW1jZ19hc3luY19yZWNsYWltLnNrZWwuaCYjMzQ7CiYjNDM7CiYjNDM7I2RlZmluZSBGSUxFX1NJWkUgKDMyICogMTAyNCAqIDEwMjR1bCkKJiM0MzsjZGVmaW5lIEJVRkZFUl9TSVpFICg0MDk2KQomIzQzOyNkZWZpbmUgQ0dfTElNSVQgKDMyICogMTAyNCAqIDEwMjR1bCkKJiM0MzsjZGVmaW5lIFJFQURfVElNRVMgMTYKJiM0MzsKJiM0MzsjZGVmaW5lIENHX0RJUiAmIzM0Oy9tZW1jZ19hc3luY19yZWNsYWltJiMzNDsKJiM0MzsjZGVmaW5lIENHX0hJR0hfRElSIENHX0RJUiAmIzM0Oy9oaWdoJiMzNDsKJiM0MzsjZGVmaW5lIENHX0xPV19ESVIgQ0dfRElSICYjMzQ7L2xvdyYjMzQ7CiYjNDM7CiYjNDM7I2RlZmluZSBDSEVDS19QRVJJT0RfTlMgKDIgKiAxMDAwICogMTAwMHVsbCkKJiM0MzsjZGVmaW5lIEVWRU5UX0RFTFRBX1RIUkVTSE9MRCAxCiYjNDM7CiYjNDM7LyoKJiM0MzsgKiBUZXN0IGZpbGVzIG11c3QgcmVzaWRlIG9uIGEgZmlsZXN5c3RlbSB0aGF0IHN1cHBvcnRzIHBhZ2UgcmVjbGFpbSB3aXRob3V0CiYjNDM7ICogc3dhcCAoZS5nLiBleHQ0KS4gSWYgL3RtcCBpcyBvbiB0bXBmcywgdGhlIGZpbGUgcGFnZXMgYXJlIHNobWVtLWJhY2tlZAomIzQzOyAqIGFuZCBjYW4gb25seSBiZSByZWNsYWltZWQgdGhyb3VnaCBzd2FwLiBCdXQgdGhlIHRlc3QgZGlzYWJsZXMgc3dhcAomIzQzOyAqIChtZW1vcnkuc3dhcC5tYXg9MCksIG1ha2luZyByZWNsYWltIGltcG9zc2libGUgYW5kIGNhdXNpbmcgT09NLgomIzQzOyAqCiYjNDM7ICogUGljayBhIGRpcmVjdG9yeSBvbiBhIG5vbi10bXBmcyBmaWxlc3lzdGVtOiB0cnkgJFRNUERJUiBmaXJzdCwgdGhlbiAvdG1wLAomIzQzOyAqIGFuZCBmYWxsIGJhY2sgdG8gdGhlIGN1cnJlbnQgZGlyZWN0b3J5IGlmIHRoZSBjaG9zZW4gcGF0aCBpcyBvbiB0bXBmcy4KJiM0MzsgKi8KJiM0MztzdGF0aWMgaW50IGdldF90ZXN0X2RpcihjaGFyICpidWYsIHNpemVfdCBzaXplKQomIzQzO3sKJiM0MzsJc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBjYW5kaWRhdGVzW10gPSB7ICYjMzQ7L3RtcCYjMzQ7LCAmIzM0Oy4mIzM0OyB9OwomIzQzOwljb25zdCBjaGFyICp0bXBkaXIgPSBnZXRlbnYoJiMzNDtUTVBESVImIzM0Oyk7CiYjNDM7CXN0cnVjdCBzdGF0ZnMgc2ZzOwomIzQzOwlzaXplX3QgaTsKJiM0MzsKJiM0MzsJaWYgKHRtcGRpciAmYW1wOyZhbXA7IHRtcGRpclswXSAmYW1wOyZhbXA7IHN0YXRmcyh0bXBkaXIsICZhbXA7c2ZzKSA9PSAwICZhbXA7JmFtcDsKJiM0MzsJICAgIHNmcy5mX3R5cGUgIT0gVE1QRlNfTUFHSUMpIHsKJiM0MzsJCXNucHJpbnRmKGJ1Ziwgc2l6ZSwgJiMzNDslcyYjMzQ7LCB0bXBkaXIpOwomIzQzOwkJcmV0dXJuIDA7CiYjNDM7CX0KJiM0MzsKJiM0MzsJZm9yIChpID0gMDsgaSAmbHQ7IEFSUkFZX1NJWkUoY2FuZGlkYXRlcyk7IGkmIzQzOyYjNDM7KSB7CiYjNDM7CQlpZiAoc3RhdGZzKGNhbmRpZGF0ZXNbaV0sICZhbXA7c2ZzKSA9PSAwICZhbXA7JmFtcDsKJiM0MzsJCSAgICBzZnMuZl90eXBlICE9IFRNUEZTX01BR0lDKSB7CiYjNDM7CQkJc25wcmludGYoYnVmLCBzaXplLCAmIzM0OyVzJiMzNDssIGNhbmRpZGF0ZXNbaV0pOwomIzQzOwkJCXJldHVybiAwOwomIzQzOwkJfQomIzQzOwl9CiYjNDM7CiYjNDM7CXJldHVybiAtMTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGludCBzZXR1cF9oaWdoX2xvd19jZ3JvdXBzKHU2NCAqaGlnaF9jZ3JvdXBfaWQsIHU2NCAqbG93X2Nncm91cF9pZCkKJiM0Mzt7CiYjNDM7CWludCByZXQ7CiYjNDM7CWNoYXIgbGltaXRfYnVmWzIwXTsKJiM0MzsKJiM0MzsJcmV0ID0gc2V0dXBfY2dyb3VwX2Vudmlyb25tZW50KCk7CiYjNDM7CWlmICghQVNTRVJUX09LKHJldCwgJiMzNDtzZXR1cF9jZ3JvdXBfZW52aXJvbm1lbnQmIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CiYjNDM7CXJldCA9IGNyZWF0ZV9hbmRfZ2V0X2Nncm91cChDR19ESVIpOwomIzQzOwlpZiAoIUFTU0VSVF9HRShyZXQsIDAsICYjMzQ7Y3JlYXRlX2FuZF9nZXRfY2dyb3VwICYjMzQ7IENHX0RJUikpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CWNsb3NlKHJldCk7CiYjNDM7CiYjNDM7CXJldCA9IGVuYWJsZV9jb250cm9sbGVycyhDR19ESVIsICYjMzQ7bWVtb3J5JiMzNDspOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhyZXQsICYjMzQ7ZW5hYmxlX2NvbnRyb2xsZXJzJiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwomIzQzOwlzbnByaW50ZihsaW1pdF9idWYsIHNpemVvZihsaW1pdF9idWYpLCAmIzM0OyVsdSYjMzQ7LCBDR19MSU1JVCk7CiYjNDM7CXJldCA9IHdyaXRlX2Nncm91cF9maWxlKENHX0RJUiwgJiMzNDttZW1vcnkubWF4JiMzNDssIGxpbWl0X2J1Zik7CiYjNDM7CWlmICghQVNTRVJUX09LKHJldCwgJiMzNDt3cml0ZV9jZ3JvdXBfZmlsZSBtZW1vcnkubWF4JiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwomIzQzOwlyZXQgPSB3cml0ZV9jZ3JvdXBfZmlsZShDR19ESVIsICYjMzQ7bWVtb3J5LnN3YXAubWF4JiMzNDssICYjMzQ7MCYjMzQ7KTsKJiM0MzsJaWYgKCFBU1NFUlRfT0socmV0LCAmIzM0O3dyaXRlX2Nncm91cF9maWxlIG1lbW9yeS5zd2FwLm1heCYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsKJiM0MzsJcmV0ID0gY3JlYXRlX2FuZF9nZXRfY2dyb3VwKENHX0hJR0hfRElSKTsKJiM0MzsJaWYgKCFBU1NFUlRfR0UocmV0LCAwLCAmIzM0O2NyZWF0ZV9hbmRfZ2V0X2Nncm91cCAmIzM0OyBDR19ISUdIX0RJUikpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CWNsb3NlKHJldCk7CiYjNDM7CiYjNDM7CSpoaWdoX2Nncm91cF9pZCA9IGdldF9jZ3JvdXBfaWQoQ0dfSElHSF9ESVIpOwomIzQzOwlpZiAoIUFTU0VSVF9HVCgqaGlnaF9jZ3JvdXBfaWQsIDAsICYjMzQ7Z2V0X2Nncm91cF9pZCYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsKJiM0MzsJcmV0ID0gY3JlYXRlX2FuZF9nZXRfY2dyb3VwKENHX0xPV19ESVIpOwomIzQzOwlpZiAoIUFTU0VSVF9HRShyZXQsIDAsICYjMzQ7Y3JlYXRlX2FuZF9nZXRfY2dyb3VwICYjMzQ7IENHX0xPV19ESVIpKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwljbG9zZShyZXQpOwomIzQzOwomIzQzOwkqbG93X2Nncm91cF9pZCA9IGdldF9jZ3JvdXBfaWQoQ0dfTE9XX0RJUik7CiYjNDM7CWlmICghQVNTRVJUX0dUKCpoaWdoX2Nncm91cF9pZCwgMCwgJiMzNDtnZXRfY2dyb3VwX2lkJiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwomIzQzOwlyZXR1cm4gMDsKJiM0MzsKJiM0MztjbGVhbnVwOgomIzQzOwljbGVhbnVwX2Nncm91cF9lbnZpcm9ubWVudCgpOwomIzQzOwlyZXR1cm4gLTE7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbnQgd3JpdGVfZmlsZShjb25zdCBjaGFyICpmaWxlbmFtZSkKJiM0Mzt7CiYjNDM7CWludCByZXQgPSAtMTsKJiM0MzsJc2l6ZV90IHdyaXR0ZW4gPSAwOwomIzQzOwljaGFyICpidWZmZXI7CiYjNDM7CUZJTEUgKmZwOwomIzQzOwomIzQzOwlmcCA9IGZvcGVuKGZpbGVuYW1lLCAmIzM0O3diJiMzNDspOwomIzQzOwlpZiAoIWZwKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CiYjNDM7CWJ1ZmZlciA9IG1hbGxvYyhCVUZGRVJfU0laRSk7CiYjNDM7CWlmICghYnVmZmVyKQomIzQzOwkJZ290byBjbGVhbnVwX2ZwOwomIzQzOwomIzQzOwltZW1zZXQoYnVmZmVyLCAmIzM5O0EmIzM5OywgQlVGRkVSX1NJWkUpOwomIzQzOwomIzQzOwl3aGlsZSAod3JpdHRlbiAmbHQ7IEZJTEVfU0laRSkgewomIzQzOwkJc2l6ZV90IHRvX3dyaXRlID0gRklMRV9TSVpFIC0gd3JpdHRlbiAmbHQ7IEJVRkZFUl9TSVpFID8KJiM0MzsJCQkJICBGSUxFX1NJWkUgLSB3cml0dGVuIDogQlVGRkVSX1NJWkU7CiYjNDM7CiYjNDM7CQlpZiAoZndyaXRlKGJ1ZmZlciwgMSwgdG9fd3JpdGUsIGZwKSAhPSB0b193cml0ZSkKJiM0MzsJCQlnb3RvIGNsZWFudXA7CiYjNDM7CQl3cml0dGVuICYjNDM7PSB0b193cml0ZTsKJiM0MzsJfQomIzQzOwomIzQzOwlyZXQgPSAwOwomIzQzO2NsZWFudXA6CiYjNDM7CWZyZWUoYnVmZmVyKTsKJiM0MztjbGVhbnVwX2ZwOgomIzQzOwlmY2xvc2UoZnApOwomIzQzO291dDoKJiM0MzsJcmV0dXJuIHJldDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGludCByZWFkX2ZpbGUoY29uc3QgY2hhciAqZmlsZW5hbWUsIGludCBpdGVyYXRpb25zKQomIzQzO3sKJiM0MzsJaW50IHJldCA9IC0xOwomIzQzOwlsb25nIHBhZ2Vfc2l6ZSA9IHN5c2NvbmYoX1NDX1BBR0VTSVpFKTsKJiM0MzsJY2hhciAqbWFwOwomIzQzOwlzaXplX3QgaTsKJiM0MzsJaW50IGZkOwomIzQzOwlzdHJ1Y3Qgc3RhdCBzYjsKJiM0MzsKJiM0MzsJZmQgPSBvcGVuKGZpbGVuYW1lLCBPX1JET05MWSk7CiYjNDM7CWlmIChmZCA9PSAtMSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwomIzQzOwlpZiAoZnN0YXQoZmQsICZhbXA7c2IpID09IC0xKQomIzQzOwkJZ290byBjbGVhbnVwX2ZkOwomIzQzOwomIzQzOwlpZiAoc2Iuc3Rfc2l6ZSAhPSBGSUxFX1NJWkUpIHsKJiM0MzsJCWZwcmludGYoc3RkZXJyLCAmIzM0O0ZpbGUgc2l6ZSBtaXNtYXRjaDogZXhwZWN0ZWQgJWx1LCBnb3QgJWx1XG4mIzM0OywKJiM0MzsJCQkodW5zaWduZWQgbG9uZylGSUxFX1NJWkUsICh1bnNpZ25lZCBsb25nKXNiLnN0X3NpemUpOwomIzQzOwkJZ290byBjbGVhbnVwX2ZkOwomIzQzOwl9CiYjNDM7CiYjNDM7CW1hcCA9IG1tYXAoTlVMTCwgRklMRV9TSVpFLCBQUk9UX1JFQUQsIE1BUF9QUklWQVRFLCBmZCwgMCk7CiYjNDM7CWlmIChtYXAgPT0gTUFQX0ZBSUxFRCkKJiM0MzsJCWdvdG8gY2xlYW51cF9mZDsKJiM0MzsKJiM0MzsJZm9yIChpbnQgaXRlciA9IDA7IGl0ZXIgJmx0OyBpdGVyYXRpb25zOyBpdGVyJiM0MzsmIzQzOykgewomIzQzOwkJZm9yIChpID0gMDsgaSAmbHQ7IEZJTEVfU0laRTsgaSAmIzQzOz0gcGFnZV9zaXplKSB7CiYjNDM7CQkJLyogYWNjZXNzIGEgYnl0ZSB0byB0cmlnZ2VyIHBhZ2UgZmF1bHQgKi8KJiM0MzsJCQlhc20gdm9sYXRpbGUoJiMzNDsmIzM0OyA6OiAmIzM0O3ImIzM0OyhtYXBbaV0pIDogJiMzNDttZW1vcnkmIzM0Oyk7CiYjNDM7CQl9CiYjNDM7CX0KJiM0MzsKJiM0MzsJaWYgKG11bm1hcChtYXAsIEZJTEVfU0laRSkgPT0gLTEpCiYjNDM7CQlnb3RvIGNsZWFudXBfZmQ7CiYjNDM7CiYjNDM7CXJldCA9IDA7CiYjNDM7CiYjNDM7Y2xlYW51cF9mZDoKJiM0MzsJY2xvc2UoZmQpOwomIzQzO291dDoKJiM0MzsJcmV0dXJuIHJldDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGludCByZWFsX3Rlc3RfY2hpbGRfd29yayhjb25zdCBjaGFyICpjZ3JvdXBfcGF0aCwgY2hhciAqZGF0YV9maWxlbmFtZSwKJiM0MzsJCQkJY2hhciAqdGltZV9maWxlbmFtZSwgaW50IHJlYWRfdGltZXMpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgdGltZXZhbCBzdGFydCwgZW5kOwomIzQzOwlkb3VibGUgZWxhcHNlZDsKJiM0MzsJRklMRSAqZnA7CiYjNDM7CiYjNDM7CWlmICghQVNTRVJUX09LKGpvaW5fcGFyZW50X2Nncm91cChjZ3JvdXBfcGF0aCksICYjMzQ7am9pbl9wYXJlbnRfY2dyb3VwJiMzNDspKQomIzQzOwkJcmV0dXJuIC0xOwomIzQzOwomIzQzOwlnZXR0aW1lb2ZkYXkoJmFtcDtzdGFydCwgTlVMTCk7CiYjNDM7CiYjNDM7CWlmICghQVNTRVJUX09LKHdyaXRlX2ZpbGUoZGF0YV9maWxlbmFtZSksICYjMzQ7d3JpdGVfZmlsZSYjMzQ7KSkKJiM0MzsJCXJldHVybiAtMTsKJiM0MzsKJiM0MzsJaWYgKCFBU1NFUlRfT0socmVhZF9maWxlKGRhdGFfZmlsZW5hbWUsIHJlYWRfdGltZXMpLCAmIzM0O3JlYWRfZmlsZSYjMzQ7KSkKJiM0MzsJCXJldHVybiAtMTsKJiM0MzsKJiM0MzsJZ2V0dGltZW9mZGF5KCZhbXA7ZW5kLCBOVUxMKTsKJiM0MzsKJiM0MzsJaWYgKCF0aW1lX2ZpbGVuYW1lKQomIzQzOwkJcmV0dXJuIDA7CiYjNDM7CiYjNDM7CWVsYXBzZWQgPSAoZW5kLnR2X3NlYyAtIHN0YXJ0LnR2X3NlYykgJiM0MzsKJiM0MzsJCSAgKGVuZC50dl91c2VjIC0gc3RhcnQudHZfdXNlYykgLyAxMDAwMDAwLjA7CiYjNDM7CXByaW50ZigmIzM0OyUuNmZcbiYjMzQ7LCBlbGFwc2VkKTsKJiM0MzsKJiM0MzsJZnAgPSBmb3Blbih0aW1lX2ZpbGVuYW1lLCAmIzM0O3cmIzM0Oyk7CiYjNDM7CWlmICghQVNTRVJUX09LX1BUUihmcCwgJiMzNDtmb3BlbiYjMzQ7KSkKJiM0MzsJCXJldHVybiAtMTsKJiM0MzsJZnByaW50ZihmcCwgJiMzNDslLjZmJiMzNDssIGVsYXBzZWQpOwomIzQzOwlmY2xvc2UoZnApOwomIzQzOwomIzQzOwlyZXR1cm4gMDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGludCBnZXRfdGltZShjaGFyICp0aW1lX2ZpbGVuYW1lLCBkb3VibGUgKnRpbWUpCiYjNDM7ewomIzQzOwlpbnQgcmV0ID0gLTE7CiYjNDM7CUZJTEUgKmZwOwomIzQzOwljaGFyIGJ1Zls2NF07CiYjNDM7CiYjNDM7CWZwID0gZm9wZW4odGltZV9maWxlbmFtZSwgJiMzNDtyJiMzNDspOwomIzQzOwlpZiAoIUFTU0VSVF9PS19QVFIoZnAsICYjMzQ7Zm9wZW4mIzM0OykpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsKJiM0MzsJaWYgKCFBU1NFUlRfT0tfUFRSKGZnZXRzKGJ1Ziwgc2l6ZW9mKGJ1ZiksIGZwKSwgJiMzNDtmZ2V0cyYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsKJiM0MzsJaWYgKHNzY2FuZihidWYsICYjMzQ7JWxmJiMzNDssIHRpbWUpICE9IDEpIHsKJiM0MzsJCVBSSU5UX0ZBSUwoJiMzNDtzc2NhbmYgJXMmIzM0OywgYnVmKTsKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsJfQomIzQzOwomIzQzOwlyZXQgPSAwOwomIzQzO2NsZWFudXA6CiYjNDM7CWZjbG9zZShmcCk7CiYjNDM7b3V0OgomIzQzOwlyZXR1cm4gcmV0OwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50CiYjNDM7cnVuX2hpZ2hfbG93X3dvcmtsb2FkKGRvdWJsZSAqaGlnaF9lbGFwc2VkLCBkb3VibGUgKmxvd19lbGFwc2VkLCBpbnQgcmVhZF90aW1lcykKJiM0Mzt7CiYjNDM7CWNoYXIgdGVzdF9kaXJbUEFUSF9NQVhdLCBoaWdoX2RhdGFfZmlsZVtQQVRIX01BWF0sIGxvd19kYXRhX2ZpbGVbUEFUSF9NQVhdOwomIzQzOwljaGFyIGhpZ2hfdGltZV9maWxlW1BBVEhfTUFYXSwgbG93X3RpbWVfZmlsZVtQQVRIX01BWF07CiYjNDM7CWludCByZXQsIGZkOwomIzQzOwlwaWRfdCBoaWdoX3BpZCwgbG93X3BpZDsKJiM0MzsJaW50IHN0YXR1czsKJiM0MzsKJiM0MzsJcmV0ID0gZ2V0X3Rlc3RfZGlyKHRlc3RfZGlyLCBzaXplb2YodGVzdF9kaXIpKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0socmV0LCAmIzM0O2dldF90ZXN0X2Rpcjogbm8gbm9uLXRtcGZzIGRpcmVjdG9yeSBmb3VuZCYjMzQ7KSkKJiM0MzsJCXJldHVybiAtMTsKJiM0MzsKJiM0MzsJZmQgPSBzbnByaW50ZihoaWdoX2RhdGFfZmlsZSwgc2l6ZW9mKGhpZ2hfZGF0YV9maWxlKSwKJiM0MzsJCSAgICAgICYjMzQ7JXMvbWVtY2dfYXN5bmNfaGlnaF9kYXRhX1hYWFhYWCYjMzQ7LCB0ZXN0X2Rpcik7CiYjNDM7CWlmICghQVNTRVJUX0xUKGZkLCBzaXplb2YoaGlnaF9kYXRhX2ZpbGUpLCAmIzM0O2hpZ2hfZGF0YV9maWxlIHBhdGgmIzM0OykpCiYjNDM7CQlyZXR1cm4gLTE7CiYjNDM7CiYjNDM7CWZkID0gc25wcmludGYobG93X2RhdGFfZmlsZSwgc2l6ZW9mKGxvd19kYXRhX2ZpbGUpLAomIzQzOwkJICAgICAgJiMzNDslcy9tZW1jZ19hc3luY19sb3dfZGF0YV9YWFhYWFgmIzM0OywgdGVzdF9kaXIpOwomIzQzOwlpZiAoIUFTU0VSVF9MVChmZCwgc2l6ZW9mKGxvd19kYXRhX2ZpbGUpLCAmIzM0O2xvd19kYXRhX2ZpbGUgcGF0aCYjMzQ7KSkKJiM0MzsJCXJldHVybiAtMTsKJiM0MzsKJiM0MzsJZmQgPSBzbnByaW50ZihoaWdoX3RpbWVfZmlsZSwgc2l6ZW9mKGhpZ2hfdGltZV9maWxlKSwKJiM0MzsJCSAgICAgICYjMzQ7JXMvbWVtY2dfYXN5bmNfaGlnaF90aW1lX1hYWFhYWCYjMzQ7LCB0ZXN0X2Rpcik7CiYjNDM7CWlmICghQVNTRVJUX0xUKGZkLCBzaXplb2YoaGlnaF90aW1lX2ZpbGUpLCAmIzM0O2hpZ2hfdGltZV9maWxlIHBhdGgmIzM0OykpCiYjNDM7CQlyZXR1cm4gLTE7CiYjNDM7CiYjNDM7CWZkID0gc25wcmludGYobG93X3RpbWVfZmlsZSwgc2l6ZW9mKGxvd190aW1lX2ZpbGUpLAomIzQzOwkJICAgICAgJiMzNDslcy9tZW1jZ19hc3luY19sb3dfdGltZV9YWFhYWFgmIzM0OywgdGVzdF9kaXIpOwomIzQzOwlpZiAoIUFTU0VSVF9MVChmZCwgc2l6ZW9mKGxvd190aW1lX2ZpbGUpLCAmIzM0O2xvd190aW1lX2ZpbGUgcGF0aCYjMzQ7KSkKJiM0MzsJCXJldHVybiAtMTsKJiM0MzsKJiM0MzsJZmQgPSBta3N0ZW1wKGhpZ2hfZGF0YV9maWxlKTsKJiM0MzsJaWYgKCFBU1NFUlRfR0UoZmQsIDAsICYjMzQ7bWtzdGVtcCYjMzQ7KSkKJiM0MzsJCXJldHVybiAtMTsKJiM0MzsJY2xvc2UoZmQpOwomIzQzOwomIzQzOwlmZCA9IG1rc3RlbXAobG93X2RhdGFfZmlsZSk7CiYjNDM7CWlmICghQVNTRVJUX0dFKGZkLCAwLCAmIzM0O21rc3RlbXAmIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXBfaGlnaF9kYXRhOwomIzQzOwljbG9zZShmZCk7CiYjNDM7CiYjNDM7CWZkID0gbWtzdGVtcChoaWdoX3RpbWVfZmlsZSk7CiYjNDM7CWlmICghQVNTRVJUX0dFKGZkLCAwLCAmIzM0O21rc3RlbXAmIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXBfbG93X2RhdGE7CiYjNDM7CWNsb3NlKGZkKTsKJiM0MzsKJiM0MzsJZmQgPSBta3N0ZW1wKGxvd190aW1lX2ZpbGUpOwomIzQzOwlpZiAoIUFTU0VSVF9HRShmZCwgMCwgJiMzNDtta3N0ZW1wJiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwX2hpZ2hfdGltZTsKJiM0MzsJY2xvc2UoZmQpOwomIzQzOwomIzQzOwlsb3dfcGlkID0gZm9yaygpOwomIzQzOwlpZiAoIUFTU0VSVF9HRShsb3dfcGlkLCAwLCAmIzM0O2ZvcmsgbG93JiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwX2xvd190aW1lOwomIzQzOwlpZiAobG93X3BpZCA9PSAwKQomIzQzOwkJZXhpdChyZWFsX3Rlc3RfY2hpbGRfd29yayhDR19MT1dfRElSLCBsb3dfZGF0YV9maWxlLAomIzQzOwkJCQkJICBsb3dfdGltZV9maWxlLCByZWFkX3RpbWVzKSk7CiYjNDM7CiYjNDM7CWhpZ2hfcGlkID0gZm9yaygpOwomIzQzOwlpZiAoIUFTU0VSVF9HRShoaWdoX3BpZCwgMCwgJiMzNDtmb3JrIGhpZ2gmIzM0OykpIHsKJiM0MzsJCSh2b2lkKXdhaXRwaWQobG93X3BpZCwgTlVMTCwgMCk7CiYjNDM7CQlnb3RvIGNsZWFudXBfbG93X3RpbWU7CiYjNDM7CX0KJiM0MzsJaWYgKGhpZ2hfcGlkID09IDApCiYjNDM7CQlleGl0KHJlYWxfdGVzdF9jaGlsZF93b3JrKENHX0hJR0hfRElSLCBoaWdoX2RhdGFfZmlsZSwKJiM0MzsJCQkJCSAgaGlnaF90aW1lX2ZpbGUsIHJlYWRfdGltZXMpKTsKJiM0MzsKJiM0MzsJcmV0ID0gd2FpdHBpZChsb3dfcGlkLCAmYW1wO3N0YXR1cywgMCk7CiYjNDM7CWlmICghQVNTRVJUX0dUKHJldCwgMCwgJiMzNDtsb3cgd2FpdHBpZCYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cF9sb3dfdGltZTsKJiM0MzsJaWYgKCFBU1NFUlRfVFJVRShXSUZFWElURUQoc3RhdHVzKSwgJiMzNDtsb3cgZXhpdGVkJiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwX2xvd190aW1lOwomIzQzOwlpZiAoIUFTU0VSVF9FUShXRVhJVFNUQVRVUyhzdGF0dXMpLCAwLCAmIzM0O2xvdyBleGl0IHN0YXR1cyYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cF9sb3dfdGltZTsKJiM0MzsKJiM0MzsJcmV0ID0gd2FpdHBpZChoaWdoX3BpZCwgJmFtcDtzdGF0dXMsIDApOwomIzQzOwlpZiAoIUFTU0VSVF9HVChyZXQsIDAsICYjMzQ7aGlnaCB3YWl0cGlkJiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwX2xvd190aW1lOwomIzQzOwlpZiAoIUFTU0VSVF9UUlVFKFdJRkVYSVRFRChzdGF0dXMpLCAmIzM0O2hpZ2ggZXhpdGVkJiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwX2xvd190aW1lOwomIzQzOwlpZiAoIUFTU0VSVF9FUShXRVhJVFNUQVRVUyhzdGF0dXMpLCAwLCAmIzM0O2hpZ2ggZXhpdCBzdGF0dXMmIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXBfbG93X3RpbWU7CiYjNDM7CiYjNDM7CWlmIChnZXRfdGltZShoaWdoX3RpbWVfZmlsZSwgaGlnaF9lbGFwc2VkKSkKJiM0MzsJCWdvdG8gY2xlYW51cF9sb3dfdGltZTsKJiM0MzsJaWYgKGdldF90aW1lKGxvd190aW1lX2ZpbGUsIGxvd19lbGFwc2VkKSkKJiM0MzsJCWdvdG8gY2xlYW51cF9sb3dfdGltZTsKJiM0MzsKJiM0MzsJcmV0ID0gMDsKJiM0MzsKJiM0MztjbGVhbnVwX2xvd190aW1lOgomIzQzOwl1bmxpbmsobG93X3RpbWVfZmlsZSk7CiYjNDM7Y2xlYW51cF9oaWdoX3RpbWU6CiYjNDM7CXVubGluayhoaWdoX3RpbWVfZmlsZSk7CiYjNDM7Y2xlYW51cF9sb3dfZGF0YToKJiM0MzsJdW5saW5rKGxvd19kYXRhX2ZpbGUpOwomIzQzO2NsZWFudXBfaGlnaF9kYXRhOgomIzQzOwl1bmxpbmsoaGlnaF9kYXRhX2ZpbGUpOwomIzQzOwlyZXR1cm4gcmV0OwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50CiYjNDM7c2V0dXBfYnBmKHU2NCBoaWdoX2Nncm91cF9pZCwgdTY0IGxvd19jZ3JvdXBfaWQsCiYjNDM7CSAgc3RydWN0IG1lbWNnX2FzeW5jX3JlY2xhaW0gKipza2VsX3B0ciwgYm9vbCB1c2VfdGhyZWFkX3dxKQomIzQzO3sKJiM0MzsJc3RydWN0IG1lbWNnX2FzeW5jX3JlY2xhaW0gKnNrZWw7CiYjNDM7CXN0cnVjdCBicGZfYXJnc19zIGJwZl9hcmdzID0gewomIzQzOwkJLmhpZ2hfY2dyb3VwX2lkID0gaGlnaF9jZ3JvdXBfaWQsCiYjNDM7CQkubG93X2Nncm91cF9pZCA9IGxvd19jZ3JvdXBfaWQsCiYjNDM7CQkuZXZlbnRfZGVsdGFfdGhyZXNob2xkID0gRVZFTlRfREVMVEFfVEhSRVNIT0xELAomIzQzOwkJLmNoZWNrX25zID0gQ0hFQ0tfUEVSSU9EX05TLAomIzQzOwl9OwomIzQzOwlMSUJCUEZfT1BUUyhicGZfdGVzdF9ydW5fb3B0cywgcnVuX29wdHMsCiYjNDM7CQkuY3R4X2luID0gJmFtcDticGZfYXJncywKJiM0MzsJCS5jdHhfc2l6ZV9pbiA9IHNpemVvZihicGZfYXJncykpOwomIzQzOwlpbnQgcHJvZ19pbml0X2ZkLCBlcnI7CiYjNDM7CiYjNDM7CXNrZWwgPSBtZW1jZ19hc3luY19yZWNsYWltX19vcGVuX2FuZF9sb2FkKCk7CiYjNDM7CWlmICghQVNTRVJUX09LX1BUUihza2VsLCAmIzM0O21lbWNnX2FzeW5jX3JlY2xhaW1fX29wZW5fYW5kX2xvYWQmIzM0OykpCiYjNDM7CQlyZXR1cm4gLTE7CiYjNDM7CiYjNDM7CWlmICh1c2VfdGhyZWFkX3dxKQomIzQzOwkJcHJvZ19pbml0X2ZkID0gYnBmX3Byb2dyYW1fX2ZkKHNrZWwtJmd0O3Byb2dzLnRocmVhZF93cV9wcm9nX2luaXQpOwomIzQzOwllbHNlCiYjNDM7CQlwcm9nX2luaXRfZmQgPSBicGZfcHJvZ3JhbV9fZmQoc2tlbC0mZ3Q7cHJvZ3Mud3FfcHJvZ19pbml0KTsKJiM0MzsJaWYgKCFBU1NFUlRfR0UocHJvZ19pbml0X2ZkLCAwLCAmIzM0O2JwZl9wcm9ncmFtX19mZCYjMzQ7KSkKJiM0MzsJCWdvdG8gZXJyb3Jfb3V0OwomIzQzOwomIzQzOwllcnIgPSBicGZfcHJvZ190ZXN0X3J1bl9vcHRzKHByb2dfaW5pdF9mZCwgJmFtcDtydW5fb3B0cyk7CiYjNDM7CWlmICghQVNTRVJUX09LKGVyciwgJiMzNDticGZfcHJvZ190ZXN0X3J1bl9vcHRzJiMzNDspKQomIzQzOwkJZ290byBlcnJvcl9vdXQ7CiYjNDM7CWlmICghQVNTRVJUX0VRKHJ1bl9vcHRzLnJldHZhbCwgMCwgJiMzNDtwcm9nX2luaXQgcmV0dmFsJiMzNDspKQomIzQzOwkJZ290byBlcnJvcl9vdXQ7CiYjNDM7CiYjNDM7CSpza2VsX3B0ciA9IHNrZWw7CiYjNDM7CXJldHVybiAwOwomIzQzOwomIzQzO2Vycm9yX291dDoKJiM0MzsJbWVtY2dfYXN5bmNfcmVjbGFpbV9fZGVzdHJveShza2VsKTsKJiM0MzsJcmV0dXJuIC0xOwomIzQzO30KJiM0MzsKJiM0Mzt2b2lkIHRlc3RfbWVtY2dfd3FfYXN5bmNfcmVjbGFpbSh2b2lkKQomIzQzO3sKJiM0MzsJdTY0IGhpZ2hfY2dyb3VwX2lkLCBsb3dfY2dyb3VwX2lkOwomIzQzOwlpbnQgZXJyOwomIzQzOwlkb3VibGUgaGlnaF90aW1lID0gMC4wLCBsb3dfdGltZSA9IDAuMDsKJiM0MzsJc3RydWN0IG1lbWNnX2FzeW5jX3JlY2xhaW0gKnNrZWwgPSBOVUxMOwomIzQzOwomIzQzOwllcnIgPSBzZXR1cF9oaWdoX2xvd19jZ3JvdXBzKCZhbXA7aGlnaF9jZ3JvdXBfaWQsICZhbXA7bG93X2Nncm91cF9pZCk7CiYjNDM7CWlmICghQVNTRVJUX09LKGVyciwgJiMzNDtzZXR1cF9oaWdoX2xvd19jZ3JvdXBzIHJlY2xhaW0mIzM0OykpCiYjNDM7CQlyZXR1cm47CiYjNDM7CiYjNDM7CWVyciA9IHNldHVwX2JwZihoaWdoX2Nncm91cF9pZCwgbG93X2Nncm91cF9pZCwgJmFtcDtza2VsLCBmYWxzZSk7CiYjNDM7CWlmICghQVNTRVJUX09LKGVyciwgJiMzNDtzZXR1cF9icGYmIzM0OykpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsKJiM0MzsJZXJyID0gcnVuX2hpZ2hfbG93X3dvcmtsb2FkKCZhbXA7aGlnaF90aW1lLCAmYW1wO2xvd190aW1lLCBSRUFEX1RJTUVTKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0soZXJyLCAmIzM0O3J1bl9oaWdoX2xvd193b3JrbG9hZCByZWNsYWltJiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CiYjNDM7CWlmIChoaWdoX3RpbWUgJmd0Oz0gbG93X3RpbWUpIHsKJiM0MzsJCVBSSU5UX0ZBSUwoJiMzNDtoaWdoIGNncm91cCBub3QgaW1wcm92ZWQgd2l0aCBhc3luYyByZWNsYWltOiBoaWdoX3RpbWU9JWYgbG93X3RpbWU9JWYmIzM0OywKJiM0MzsJCQkgICBoaWdoX3RpbWUsIGxvd190aW1lKTsKJiM0MzsJfQomIzQzOwomIzQzO291dDoKJiM0MzsJaWYgKHNrZWwpCiYjNDM7CQltZW1jZ19hc3luY19yZWNsYWltX19kZXN0cm95KHNrZWwpOwomIzQzOwkvKgomIzQzOwkgKiBXYWl0IGZvciBicGZfd3EgdG8gcmVsZWFzZSB0aGUgcmVmZXJlbmNlIHRvIGNncm91cAomIzQzOwkgKiB0byBlbnN1cmUgdGhlIHN1Y2Nlc3NmdWwgZGVsZXRpb24gb2YgY2dyb3VwLgomIzQzOwkgKi8KJiM0MzsJc2xlZXAoMSk7CiYjNDM7CWNsZWFudXBfY2dyb3VwX2Vudmlyb25tZW50KCk7CiYjNDM7fQomIzQzOwomIzQzO3ZvaWQgdGVzdF9tZW1jZ190aHJlYWRfd3FfYXN5bmNfcmVjbGFpbSh2b2lkKQomIzQzO3sKJiM0MzsJdTY0IGhpZ2hfY2dyb3VwX2lkLCBsb3dfY2dyb3VwX2lkOwomIzQzOwlpbnQgZXJyOwomIzQzOwlkb3VibGUgaGlnaF90aW1lID0gMC4wLCBsb3dfdGltZSA9IDAuMDsKJiM0MzsJc3RydWN0IG1lbWNnX2FzeW5jX3JlY2xhaW0gKnNrZWwgPSBOVUxMOwomIzQzOwomIzQzOwllcnIgPSBzZXR1cF9oaWdoX2xvd19jZ3JvdXBzKCZhbXA7aGlnaF9jZ3JvdXBfaWQsICZhbXA7bG93X2Nncm91cF9pZCk7CiYjNDM7CWlmICghQVNTRVJUX09LKGVyciwgJiMzNDtzZXR1cF9oaWdoX2xvd19jZ3JvdXBzIHJlY2xhaW0mIzM0OykpCiYjNDM7CQlyZXR1cm47CiYjNDM7CiYjNDM7CWVyciA9IHNldHVwX2JwZihoaWdoX2Nncm91cF9pZCwgbG93X2Nncm91cF9pZCwgJmFtcDtza2VsLCB0cnVlKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0soZXJyLCAmIzM0O3NldHVwX2JwZiYjMzQ7KSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwomIzQzOwllcnIgPSBydW5faGlnaF9sb3dfd29ya2xvYWQoJmFtcDtoaWdoX3RpbWUsICZhbXA7bG93X3RpbWUsIFJFQURfVElNRVMpOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhlcnIsICYjMzQ7cnVuX2hpZ2hfbG93X3dvcmtsb2FkIHJlY2xhaW0mIzM0OykpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsKJiM0MzsJaWYgKGhpZ2hfdGltZSAmZ3Q7PSBsb3dfdGltZSkgewomIzQzOwkJUFJJTlRfRkFJTCgmIzM0O2hpZ2ggY2dyb3VwIG5vdCBpbXByb3ZlZCB3aXRoIGFzeW5jIHJlY2xhaW06IGhpZ2hfdGltZT0lZiBsb3dfdGltZT0lZiYjMzQ7LAomIzQzOwkJCSAgIGhpZ2hfdGltZSwgbG93X3RpbWUpOwomIzQzOwl9CiYjNDM7CiYjNDM7b3V0OgomIzQzOwlpZiAoc2tlbCkKJiM0MzsJCW1lbWNnX2FzeW5jX3JlY2xhaW1fX2Rlc3Ryb3koc2tlbCk7CiYjNDM7CS8qCiYjNDM7CSAqIFdhaXQgZm9yIGJwZl90aHJlYWRfd3EgdG8gcmVsZWFzZSB0aGUgcmVmZXJlbmNlIHRvIGNncm91cAomIzQzOwkgKiB0byBlbnN1cmUgdGhlIHN1Y2Nlc3NmdWwgZGVsZXRpb24gb2YgY2dyb3VwLgomIzQzOwkgKi8KJiM0MzsJc2xlZXAoMSk7CiYjNDM7CWNsZWFudXBfY2dyb3VwX2Vudmlyb25tZW50KCk7CiYjNDM7fQpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvdGhyZWFkX3dxX2Nncm91cC5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvdGhyZWFkX3dxX2Nncm91cC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAuLjc1MzdiMDNmMTdlMmEKLS0tIC9kZXYvbnVsbAomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy90aHJlYWRfd3FfY2dyb3VwLmMKQEAgLTAsMCAmIzQzOzEsODcgQEAKJiM0MzsvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMAomIzQzOyNpbmNsdWRlICZsdDt0ZXN0X3Byb2dzLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3VuaXN0ZC5oJmd0OwomIzQzOyNpbmNsdWRlICYjMzQ7Y2dyb3VwX2hlbHBlcnMuaCYjMzQ7CiYjNDM7I2luY2x1ZGUgJiMzNDt0aHJlYWRfd3FfY2dyb3VwLnNrZWwuaCYjMzQ7CiYjNDM7CiYjNDM7I2RlZmluZSBURVNUX0NHUk9VUCAmIzM0Oy90aHJlYWRfd3FfdGVzdCYjMzQ7CiYjNDM7I2RlZmluZSBXQUlUX1RJTUVPVVRfU0VDUyAzMAomIzQzOwomIzQzO3ZvaWQgdGVzdF90aHJlYWRfd3FfY2dyb3VwKHZvaWQpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgdGhyZWFkX3dxX2Nncm91cCAqc2tlbCA9IE5VTEw7CiYjNDM7CWludCBlcnIsIHByb2dfZmQsIGNnX2ZkID0gLTE7CiYjNDM7CXVuc2lnbmVkIGxvbmcgbG9uZyBjZ19pZDsKJiM0MzsJaW50IHdhaXRlZF9zZWNzOwomIzQzOwomIzQzOwlMSUJCUEZfT1BUUyhicGZfdGVzdF9ydW5fb3B0cywgdG9wdHMpOwomIzQzOwomIzQzOwllcnIgPSBzZXR1cF9jZ3JvdXBfZW52aXJvbm1lbnQoKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0soZXJyLCAmIzM0O3NldHVwX2Nncm91cF9lbnZpcm9ubWVudCYjMzQ7KSkKJiM0MzsJCXJldHVybjsKJiM0MzsJY2dfZmQgPSBjcmVhdGVfYW5kX2dldF9jZ3JvdXAoVEVTVF9DR1JPVVApOwomIzQzOwlpZiAoIUFTU0VSVF9HRShjZ19mZCwgMCwgJiMzNDtjcmVhdGVfYW5kX2dldF9jZ3JvdXAmIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CWNnX2lkID0gZ2V0X2Nncm91cF9pZChURVNUX0NHUk9VUCk7CiYjNDM7CWlmICghQVNTRVJUX0dUKGNnX2lkLCAwVUxMLCAmIzM0O2dldF9jZ3JvdXBfaWQmIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CiYjNDM7CXNrZWwgPSB0aHJlYWRfd3FfY2dyb3VwX19vcGVuX2FuZF9sb2FkKCk7CiYjNDM7CWlmICghQVNTRVJUX09LX1BUUihza2VsLCAmIzM0O29wZW5fYW5kX2xvYWQmIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CiYjNDM7CXByb2dfZmQgPSBicGZfcHJvZ3JhbV9fZmQoc2tlbC0mZ3Q7cHJvZ3Muc3RhcnRfdGhyZWFkX3dxKTsKJiM0MzsKJiM0MzsJLyogUnVuIGJwZl90aHJlYWRfd3EgaW4gdGhlIHNwZWNpZmllZCBjZ3JvdXAuICovCiYjNDM7CXNrZWwtJmd0O2Jzcy0mZ3Q7dGVzdF9rZXkgPSAwOwomIzQzOwlza2VsLSZndDtic3MtJmd0O3RhcmdldF9jZ3JvdXBfaWQgPSBjZ19pZDsKJiM0MzsJc2tlbC0mZ3Q7YnNzLSZndDtjYWxsYmFja19jZ3JvdXBfaWQgPSAwOwomIzQzOwlza2VsLSZndDtic3MtJmd0O3R3cV9kb25lID0gMDsKJiM0MzsJaWYgKCFBU1NFUlRfT0soYnBmX3Byb2dfdGVzdF9ydW5fb3B0cyhwcm9nX2ZkLCAmYW1wO3RvcHRzKSwKJiM0MzsJCSAgICAgICAmIzM0O2JwZl9wcm9nX3Rlc3RfcnVuX29wdHMgaW4gY2dyb3VwJiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwlpZiAoIUFTU0VSVF9PSyh0b3B0cy5yZXR2YWwsICYjMzQ7cmV0dmFsIGluIGNncm91cCYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsJZm9yICh3YWl0ZWRfc2VjcyA9IDA7IHdhaXRlZF9zZWNzICZsdDsgV0FJVF9USU1FT1VUX1NFQ1M7IHdhaXRlZF9zZWNzJiM0MzsmIzQzOykgewomIzQzOwkJaWYgKHNrZWwtJmd0O2Jzcy0mZ3Q7dHdxX2RvbmUpCiYjNDM7CQkJYnJlYWs7CiYjNDM7CQlzbGVlcCgxKTsKJiM0MzsJfQomIzQzOwlpZiAoIUFTU0VSVF9UUlVFKHNrZWwtJmd0O2Jzcy0mZ3Q7dHdxX2RvbmUsICYjMzQ7dHdxX2RvbmUgaW4gY2dyb3VwJiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwlpZiAoIUFTU0VSVF9FUShza2VsLSZndDtic3MtJmd0O2NhbGxiYWNrX2Nncm91cF9pZCwgY2dfaWQsCiYjNDM7CQkgICAgICAgJiMzNDtjYWxsYmFja19jZ3JvdXBfaWQgaW4gY2dyb3VwJiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwomIzQzOwkvKiBSdW4gYnBmX3RocmVhZF93cSB3aXRob3V0IGNncm91cCBhdHRhY2htZW50IChjZ3JvdXBfaWQgPSAwKS4gKi8KJiM0MzsJTElCQlBGX09QVFNfUkVTRVQodG9wdHMpOwomIzQzOwlza2VsLSZndDtic3MtJmd0O3Rlc3Rfa2V5ID0gMTsKJiM0MzsJc2tlbC0mZ3Q7YnNzLSZndDt0YXJnZXRfY2dyb3VwX2lkID0gMDsKJiM0MzsJc2tlbC0mZ3Q7YnNzLSZndDtjYWxsYmFja19jZ3JvdXBfaWQgPSAwOwomIzQzOwlza2VsLSZndDtic3MtJmd0O3R3cV9kb25lID0gMDsKJiM0MzsJaWYgKCFBU1NFUlRfT0soYnBmX3Byb2dfdGVzdF9ydW5fb3B0cyhwcm9nX2ZkLCAmYW1wO3RvcHRzKSwKJiM0MzsJCSAgICAgICAmIzM0O2JwZl9wcm9nX3Rlc3RfcnVuX29wdHMgd2l0aG91dCBjZ3JvdXAmIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CWlmICghQVNTRVJUX09LKHRvcHRzLnJldHZhbCwgJiMzNDtyZXR2YWwgd2l0aG91dCBjZ3JvdXAmIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CWZvciAod2FpdGVkX3NlY3MgPSAwOyB3YWl0ZWRfc2VjcyAmbHQ7IFdBSVRfVElNRU9VVF9TRUNTOyB3YWl0ZWRfc2VjcyYjNDM7JiM0MzspIHsKJiM0MzsJCWlmIChza2VsLSZndDtic3MtJmd0O3R3cV9kb25lKQomIzQzOwkJCWJyZWFrOwomIzQzOwkJc2xlZXAoMSk7CiYjNDM7CX0KJiM0MzsJaWYgKCFBU1NFUlRfVFJVRShza2VsLSZndDtic3MtJmd0O3R3cV9kb25lLCAmIzM0O3R3cV9kb25lIHdpdGhvdXQgY2dyb3VwJiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwlpZiAoIUFTU0VSVF9ORVEoc2tlbC0mZ3Q7YnNzLSZndDtjYWxsYmFja19jZ3JvdXBfaWQsIGNnX2lkLAomIzQzOwkJCSYjMzQ7Y2FsbGJhY2tfY2dyb3VwX2lkIHdpdGhvdXQgY2dyb3VwJiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwomIzQzO2NsZWFudXA6CiYjNDM7CWlmIChza2VsKSB7CiYjNDM7CQl0aHJlYWRfd3FfY2dyb3VwX19kZXN0cm95KHNrZWwpOwomIzQzOwkJLyogV2FpdCB0aHJlYWRfd3Ega3RocmVhZCBxdWl0LiAqLwomIzQzOwkJc2xlZXAoMik7CiYjNDM7CX0KJiM0MzsJaWYgKGNnX2ZkICZndDs9IDApCiYjNDM7CQljbG9zZShjZ19mZCk7CiYjNDM7CWNsZWFudXBfY2dyb3VwX2Vudmlyb25tZW50KCk7CiYjNDM7fQpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL21lbWNnX2FzeW5jX3JlY2xhaW0uYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9tZW1jZ19hc3luY19yZWNsYWltLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMC4uZWFjY2M4YTM3Mzg4YgotLS0gL2Rldi9udWxsCiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9tZW1jZ19hc3luY19yZWNsYWltLmMKQEAgLTAsMCAmIzQzOzEsMjU1IEBACiYjNDM7Ly8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAKJiM0MzsKJiM0MzsjaW5jbHVkZSAmIzM0O3ZtbGludXguaCYjMzQ7CiYjNDM7I2luY2x1ZGUgJiMzNDticGZfZXhwZXJpbWVudGFsLmgmIzM0OwomIzQzOyNpbmNsdWRlICZsdDticGYvYnBmX2hlbHBlcnMuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7YnBmL2JwZl90cmFjaW5nLmgmZ3Q7CiYjNDM7CiYjNDM7I2RlZmluZSBCSVQobnIpCQkJKDFVTCAmbHQ7Jmx0OyAobnIpKQomIzQzOwomIzQzOyNkZWZpbmUgX19fR0ZQX0lPCQlCSVQoX19fR0ZQX0lPX0JJVCkKJiM0MzsjZGVmaW5lIF9fX0dGUF9GUwkJQklUKF9fX0dGUF9GU19CSVQpCiYjNDM7I2RlZmluZSBfX19HRlBfRElSRUNUX1JFQ0xBSU0JQklUKF9fX0dGUF9ESVJFQ1RfUkVDTEFJTV9CSVQpCiYjNDM7I2RlZmluZSBfX19HRlBfS1NXQVBEX1JFQ0xBSU0JQklUKF9fX0dGUF9LU1dBUERfUkVDTEFJTV9CSVQpCiYjNDM7CiYjNDM7I2RlZmluZSBfX0dGUF9JTwkJKChnZnBfdClfX19HRlBfSU8pCiYjNDM7I2RlZmluZSBfX0dGUF9GUwkJKChnZnBfdClfX19HRlBfRlMpCiYjNDM7I2RlZmluZSBfX0dGUF9ESVJFQ1RfUkVDTEFJTQkoKGdmcF90KV9fX0dGUF9ESVJFQ1RfUkVDTEFJTSkKJiM0MzsjZGVmaW5lIF9fR0ZQX0tTV0FQRF9SRUNMQUlNCSgoZ2ZwX3QpX19fR0ZQX0tTV0FQRF9SRUNMQUlNKQomIzQzOyNkZWZpbmUgX19HRlBfUkVDTEFJTQkoKGdmcF90KShfX19HRlBfRElSRUNUX1JFQ0xBSU0gfCBfX19HRlBfS1NXQVBEX1JFQ0xBSU0pKQomIzQzOwomIzQzOyNkZWZpbmUgR0ZQX0tFUk5FTAkoX19HRlBfUkVDTEFJTSB8IF9fR0ZQX0lPIHwgX19HRlBfRlMpCiYjNDM7I2RlZmluZSBDTE9DS19NT05PVE9OSUNfSUQJMQomIzQzOyNkZWZpbmUgUkVDTEFJTV9QQUdFUwkJMzIKJiM0MzsjZGVmaW5lIFJFQ0xBSU1fTUFYX0lURVIJMzIKJiM0MzsKJiM0MztzdHJ1Y3QgYnBmX2FyZ3NfcyB7CiYjNDM7CXU2NCBoaWdoX2Nncm91cF9pZDsKJiM0MzsJdTY0IGxvd19jZ3JvdXBfaWQ7CiYjNDM7CXU2NCBldmVudF9kZWx0YV90aHJlc2hvbGQ7CiYjNDM7CXU2NCBjaGVja19uczsKJiM0Mzt9OwomIzQzOwomIzQzO3N0cnVjdCBjZ3JvdXBfbWVtY2cgewomIzQzOwlzdHJ1Y3QgY2dyb3VwICpjZ3JwOwomIzQzOwlzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2c7CiYjNDM7fTsKJiM0MzsKJiM0MztzdGF0aWMgdTY0IHdxX2hpZ2hfY2dyb3VwX2lkOwomIzQzO3N0YXRpYyB1NjQgd3FfbG93X2Nncm91cF9pZDsKJiM0MzsKJiM0MztzdGF0aWMgaW50IGdldF9jZ3JvdXBfbWVtY2dfZnJvbV9pZCh1NjQgY2dyb3VwX2lkLCBzdHJ1Y3QgY2dyb3VwX21lbWNnICpjbSkKJiM0Mzt7CiYjNDM7CWNtLSZndDtjZ3JwID0gYnBmX2Nncm91cF9mcm9tX2lkKGNncm91cF9pZCk7CiYjNDM7CWlmICghY20tJmd0O2NncnApCiYjNDM7CQlyZXR1cm4gLTE7CiYjNDM7CiYjNDM7CWNtLSZndDttZW1jZyA9IGJwZl9nZXRfbWVtX2Nncm91cCgmYW1wO2NtLSZndDtjZ3JwLSZndDtzZWxmKTsKJiM0MzsJaWYgKCFjbS0mZ3Q7bWVtY2cpIHsKJiM0MzsJCWJwZl9jZ3JvdXBfcmVsZWFzZShjbS0mZ3Q7Y2dycCk7CiYjNDM7CQlyZXR1cm4gLTE7CiYjNDM7CX0KJiM0MzsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkIHB1dF9jZ3JvdXBfbWVtY2coc3RydWN0IGNncm91cF9tZW1jZyAqY20pCiYjNDM7ewomIzQzOwlicGZfcHV0X21lbV9jZ3JvdXAoY20tJmd0O21lbWNnKTsKJiM0MzsJYnBmX2Nncm91cF9yZWxlYXNlKGNtLSZndDtjZ3JwKTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGludCBnZXRfY2dyb3VwX2V2ZW50KHU2NCBjZ3JvdXBfaWQsIHU2NCAqdmFsKQomIzQzO3sKJiM0MzsJc3RydWN0IGNncm91cF9tZW1jZyBjbTsKJiM0MzsKJiM0MzsJaWYgKGdldF9jZ3JvdXBfbWVtY2dfZnJvbV9pZChjZ3JvdXBfaWQsICZhbXA7Y20pKQomIzQzOwkJcmV0dXJuIC0xOwomIzQzOwlicGZfbWVtX2Nncm91cF9mbHVzaF9zdGF0cyhjbS5tZW1jZyk7CiYjNDM7CSp2YWwgPSBicGZfbWVtX2Nncm91cF9wYWdlX3N0YXRlKGNtLm1lbWNnLCBXT1JLSU5HU0VUX1JFRkFVTFRfRklMRSk7CiYjNDM7CXB1dF9jZ3JvdXBfbWVtY2coJmFtcDtjbSk7CiYjNDM7CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgYm9vbAomIzQzO3Nob3VsZF9yZWNsYWltX2Nncm91cCh1NjQgY2dyb3VwX2lkLCB1NjQgKnByZXZfZXZlbnQsIHU2NCBldmVudF9kZWx0YV90aHJlc2hvbGQpCiYjNDM7ewomIzQzOwl1NjQgY3VyLCBkZWx0YTsKJiM0MzsKJiM0MzsJaWYgKGdldF9jZ3JvdXBfZXZlbnQoY2dyb3VwX2lkLCAmYW1wO2N1cikpCiYjNDM7CQlyZXR1cm4gZmFsc2U7CiYjNDM7CiYjNDM7CWRlbHRhID0gY3VyIC0gKnByZXZfZXZlbnQ7CiYjNDM7CSpwcmV2X2V2ZW50ID0gY3VyOwomIzQzOwomIzQzOwlyZXR1cm4gZGVsdGEgJmd0Oz0gZXZlbnRfZGVsdGFfdGhyZXNob2xkOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50IHJlY2xhaW1fY2dyb3VwKHU2NCBjZ3JvdXBfaWQpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgY2dyb3VwX21lbWNnIGNtOwomIzQzOwlpbnQgaTsKJiM0MzsKJiM0MzsJaWYgKGdldF9jZ3JvdXBfbWVtY2dfZnJvbV9pZChjZ3JvdXBfaWQsICZhbXA7Y20pKQomIzQzOwkJcmV0dXJuIDA7CiYjNDM7CiYjNDM7CWZvciAoaSA9IDA7IGkgJmx0OyBSRUNMQUlNX01BWF9JVEVSOyBpJiM0MzsmIzQzOykgewomIzQzOwkJaWYgKCFicGZfdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcyhjbS5tZW1jZywgUkVDTEFJTV9QQUdFUywKJiM0MzsJCQkJCQkgICAgICBHRlBfS0VSTkVMLCAwLCAtMSkpCiYjNDM7CQkJYnJlYWs7CiYjNDM7CX0KJiM0MzsKJiM0MzsJcHV0X2Nncm91cF9tZW1jZygmYW1wO2NtKTsKJiM0MzsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOwomIzQzO3N0cnVjdCB3cV9lbGVtIHsKJiM0MzsJc3RydWN0IGJwZl90aW1lciB0aW1lcjsKJiM0MzsJc3RydWN0IGJwZl93cSB3b3JrOwomIzQzOwl1NjQgcHJldl9ldmVudDsKJiM0MzsJdTY0IGV2ZW50X2RlbHRhX3RocmVzaG9sZDsKJiM0MzsJdTY0IGNoZWNrX25zOwomIzQzO307CiYjNDM7CiYjNDM7c3RydWN0IHsKJiM0MzsJX191aW50KHR5cGUsIEJQRl9NQVBfVFlQRV9BUlJBWSk7CiYjNDM7CV9fdWludChtYXhfZW50cmllcywgMSk7CiYjNDM7CV9fdHlwZShrZXksIF9fdTMyKTsKJiM0MzsJX190eXBlKHZhbHVlLCBzdHJ1Y3Qgd3FfZWxlbSk7CiYjNDM7fSB3cV9tYXAgU0VDKCYjMzQ7Lm1hcHMmIzM0Oyk7CiYjNDM7CiYjNDM7c3RhdGljIGludCBhc3luY19mcmVlKHZvaWQgKm1hcCwgaW50ICprZXksIHZvaWQgKnZhbHVlKQomIzQzO3sKJiM0MzsJc3RydWN0IHdxX2VsZW0gKmVsZW0gPSB2YWx1ZTsKJiM0MzsKJiM0MzsJaWYgKHNob3VsZF9yZWNsYWltX2Nncm91cCh3cV9oaWdoX2Nncm91cF9pZCwgJmFtcDtlbGVtLSZndDtwcmV2X2V2ZW50LAomIzQzOwkJZWxlbS0mZ3Q7ZXZlbnRfZGVsdGFfdGhyZXNob2xkKSkgewomIzQzOwkJcmVjbGFpbV9jZ3JvdXAod3FfbG93X2Nncm91cF9pZCk7CiYjNDM7CQlicGZfd3Ffc3RhcnQoJmFtcDtlbGVtLSZndDt3b3JrLCAwKTsKJiM0MzsJfQomIzQzOwomIzQzOwlyZXR1cm4gMDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGludCB3cV90aW1lcl9jYih2b2lkICptYXAsIGludCAqa2V5LCBzdHJ1Y3Qgd3FfZWxlbSAqZWxlbSkKJiM0Mzt7CiYjNDM7CWJwZl93cV9zdGFydCgmYW1wO2VsZW0tJmd0O3dvcmssIDApOwomIzQzOwlicGZfdGltZXJfc3RhcnQoJmFtcDtlbGVtLSZndDt0aW1lciwgZWxlbS0mZ3Q7Y2hlY2tfbnMsIDApOwomIzQzOwomIzQzOwlyZXR1cm4gMDsKJiM0Mzt9CiYjNDM7CiYjNDM7U0VDKCYjMzQ7c3lzY2FsbCYjMzQ7KQomIzQzO2ludCB3cV9wcm9nX2luaXQoc3RydWN0IGJwZl9hcmdzX3MgKmN0eCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCB3cV9lbGVtICplbGVtOwomIzQzOwlfX3UzMiBrZXkgPSAwOwomIzQzOwlpbnQgcmV0OwomIzQzOwomIzQzOwllbGVtID0gYnBmX21hcF9sb29rdXBfZWxlbSgmYW1wO3dxX21hcCwgJmFtcDtrZXkpOwomIzQzOwlpZiAoIWVsZW0pCiYjNDM7CQlyZXR1cm4gLTE7CiYjNDM7CiYjNDM7CXJldCA9IGJwZl93cV9pbml0KCZhbXA7ZWxlbS0mZ3Q7d29yaywgJmFtcDt3cV9tYXAsIDApOwomIzQzOwlpZiAocmV0KQomIzQzOwkJcmV0dXJuIHJldDsKJiM0MzsKJiM0MzsJcmV0ID0gYnBmX3dxX3NldF9jYWxsYmFjaygmYW1wO2VsZW0tJmd0O3dvcmssIGFzeW5jX2ZyZWUsIDApOwomIzQzOwlpZiAocmV0KQomIzQzOwkJcmV0dXJuIHJldDsKJiM0MzsKJiM0MzsJcmV0ID0gYnBmX3RpbWVyX2luaXQoJmFtcDtlbGVtLSZndDt0aW1lciwgJmFtcDt3cV9tYXAsIENMT0NLX01PTk9UT05JQ19JRCk7CiYjNDM7CWlmIChyZXQpCiYjNDM7CQlyZXR1cm4gcmV0OwomIzQzOwomIzQzOwlyZXQgPSBicGZfdGltZXJfc2V0X2NhbGxiYWNrKCZhbXA7ZWxlbS0mZ3Q7dGltZXIsIHdxX3RpbWVyX2NiKTsKJiM0MzsJaWYgKHJldCkKJiM0MzsJCXJldHVybiByZXQ7CiYjNDM7CiYjNDM7CWVsZW0tJmd0O3ByZXZfZXZlbnQgPSAwOwomIzQzOwllbGVtLSZndDtldmVudF9kZWx0YV90aHJlc2hvbGQgPSBjdHgtJmd0O2V2ZW50X2RlbHRhX3RocmVzaG9sZDsKJiM0MzsJZWxlbS0mZ3Q7Y2hlY2tfbnMgPSBjdHgtJmd0O2NoZWNrX25zOwomIzQzOwomIzQzOwl3cV9oaWdoX2Nncm91cF9pZCA9IGN0eC0mZ3Q7aGlnaF9jZ3JvdXBfaWQ7CiYjNDM7CXdxX2xvd19jZ3JvdXBfaWQgPSBjdHgtJmd0O2xvd19jZ3JvdXBfaWQ7CiYjNDM7CiYjNDM7CXJldHVybiBicGZfdGltZXJfc3RhcnQoJmFtcDtlbGVtLSZndDt0aW1lciwgZWxlbS0mZ3Q7Y2hlY2tfbnMsIDApOwomIzQzO30KJiM0MzsKJiM0MztzdHJ1Y3QgdGhyZWFkX3dxX2VsZW0gewomIzQzOwlzdHJ1Y3QgYnBmX3RpbWVyIHRpbWVyOwomIzQzOwlzdHJ1Y3QgYnBmX3RocmVhZF93cSB3b3JrOwomIzQzOwl1NjQgcHJldl9ldmVudDsKJiM0MzsJdTY0IGV2ZW50X2RlbHRhX3RocmVzaG9sZDsKJiM0MzsJdTY0IGNoZWNrX25zOwomIzQzO307CiYjNDM7CiYjNDM7c3RydWN0IHsKJiM0MzsJX191aW50KHR5cGUsIEJQRl9NQVBfVFlQRV9BUlJBWSk7CiYjNDM7CV9fdWludChtYXhfZW50cmllcywgMSk7CiYjNDM7CV9fdHlwZShrZXksIF9fdTMyKTsKJiM0MzsJX190eXBlKHZhbHVlLCBzdHJ1Y3QgdGhyZWFkX3dxX2VsZW0pOwomIzQzO30gdGhyZWFkX3dxX21hcCBTRUMoJiMzNDsubWFwcyYjMzQ7KTsKJiM0MzsKJiM0MztzdGF0aWMgaW50IHRocmVhZF9hc3luY19mcmVlKHZvaWQgKm1hcCwgaW50ICprZXksIHZvaWQgKnZhbHVlKQomIzQzO3sKJiM0MzsJc3RydWN0IHRocmVhZF93cV9lbGVtICplbGVtID0gdmFsdWU7CiYjNDM7CiYjNDM7CWlmIChzaG91bGRfcmVjbGFpbV9jZ3JvdXAod3FfaGlnaF9jZ3JvdXBfaWQsICZhbXA7ZWxlbS0mZ3Q7cHJldl9ldmVudCwKJiM0MzsJCWVsZW0tJmd0O2V2ZW50X2RlbHRhX3RocmVzaG9sZCkpIHsKJiM0MzsJCXJlY2xhaW1fY2dyb3VwKHdxX2xvd19jZ3JvdXBfaWQpOwomIzQzOwkJYnBmX3RocmVhZF93cV9zdGFydCgmYW1wO2VsZW0tJmd0O3dvcmssIDApOwomIzQzOwl9CiYjNDM7CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50IHRocmVhZF93cV90aW1lcl9jYih2b2lkICptYXAsIGludCAqa2V5LCBzdHJ1Y3QgdGhyZWFkX3dxX2VsZW0gKmVsZW0pCiYjNDM7ewomIzQzOwlicGZfdGhyZWFkX3dxX3N0YXJ0KCZhbXA7ZWxlbS0mZ3Q7d29yaywgMCk7CiYjNDM7CWJwZl90aW1lcl9zdGFydCgmYW1wO2VsZW0tJmd0O3RpbWVyLCBlbGVtLSZndDtjaGVja19ucywgMCk7CiYjNDM7CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MzsKJiM0MztTRUMoJiMzNDtzeXNjYWxsJiMzNDspCiYjNDM7aW50IHRocmVhZF93cV9wcm9nX2luaXQoc3RydWN0IGJwZl9hcmdzX3MgKmN0eCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCB0aHJlYWRfd3FfZWxlbSAqZWxlbTsKJiM0MzsJX191MzIga2V5ID0gMDsKJiM0MzsJaW50IHJldDsKJiM0MzsKJiM0MzsJZWxlbSA9IGJwZl9tYXBfbG9va3VwX2VsZW0oJmFtcDt0aHJlYWRfd3FfbWFwLCAmYW1wO2tleSk7CiYjNDM7CWlmICghZWxlbSkKJiM0MzsJCXJldHVybiAtMTsKJiM0MzsKJiM0MzsJcmV0ID0gYnBmX3RocmVhZF93cV9pbml0KCZhbXA7ZWxlbS0mZ3Q7d29yaywgJmFtcDt0aHJlYWRfd3FfbWFwLAomIzQzOwkJCQkgY3R4LSZndDtsb3dfY2dyb3VwX2lkLCAwKTsKJiM0MzsJaWYgKHJldCkKJiM0MzsJCXJldHVybiByZXQ7CiYjNDM7CiYjNDM7CXJldCA9IGJwZl90aHJlYWRfd3Ffc2V0X2NhbGxiYWNrKCZhbXA7ZWxlbS0mZ3Q7d29yaywgdGhyZWFkX2FzeW5jX2ZyZWUsIDApOwomIzQzOwlpZiAocmV0KQomIzQzOwkJcmV0dXJuIHJldDsKJiM0MzsKJiM0MzsJcmV0ID0gYnBmX3RpbWVyX2luaXQoJmFtcDtlbGVtLSZndDt0aW1lciwgJmFtcDt0aHJlYWRfd3FfbWFwLCBDTE9DS19NT05PVE9OSUNfSUQpOwomIzQzOwlpZiAocmV0KQomIzQzOwkJcmV0dXJuIHJldDsKJiM0MzsKJiM0MzsJcmV0ID0gYnBmX3RpbWVyX3NldF9jYWxsYmFjaygmYW1wO2VsZW0tJmd0O3RpbWVyLCB0aHJlYWRfd3FfdGltZXJfY2IpOwomIzQzOwlpZiAocmV0KQomIzQzOwkJcmV0dXJuIHJldDsKJiM0MzsKJiM0MzsJZWxlbS0mZ3Q7cHJldl9ldmVudCA9IDA7CiYjNDM7CWVsZW0tJmd0O2V2ZW50X2RlbHRhX3RocmVzaG9sZCA9IGN0eC0mZ3Q7ZXZlbnRfZGVsdGFfdGhyZXNob2xkOwomIzQzOwllbGVtLSZndDtjaGVja19ucyA9IGN0eC0mZ3Q7Y2hlY2tfbnM7CiYjNDM7CiYjNDM7CXdxX2hpZ2hfY2dyb3VwX2lkID0gY3R4LSZndDtoaWdoX2Nncm91cF9pZDsKJiM0MzsJd3FfbG93X2Nncm91cF9pZCA9IGN0eC0mZ3Q7bG93X2Nncm91cF9pZDsKJiM0MzsKJiM0MzsJcmV0dXJuIGJwZl90aW1lcl9zdGFydCgmYW1wO2VsZW0tJmd0O3RpbWVyLCBlbGVtLSZndDtjaGVja19ucywgMCk7CiYjNDM7fQomIzQzOwomIzQzO2NoYXIgTElDRU5TRVtdIFNFQygmIzM0O2xpY2Vuc2UmIzM0OykgPSAmIzM0O0dQTCYjMzQ7OwpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL3RocmVhZF93cV9jZ3JvdXAuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy90aHJlYWRfd3FfY2dyb3VwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMC4uYzcwYTM3ZjU1Mzk3ZAotLS0gL2Rldi9udWxsCiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy90aHJlYWRfd3FfY2dyb3VwLmMKQEAgLTAsMCAmIzQzOzEsNTYgQEAKJiM0MzsvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMAomIzQzOy8qIENvcHlyaWdodCAoYykgMjAyNiAqLwomIzQzOwomIzQzOyNpbmNsdWRlICYjMzQ7YnBmX2V4cGVyaW1lbnRhbC5oJiMzNDsKJiM0MzsjaW5jbHVkZSAmbHQ7YnBmL2JwZl9oZWxwZXJzLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJiMzNDticGZfbWlzYy5oJiMzNDsKJiM0MzsKJiM0MztjaGFyIF9saWNlbnNlW10gU0VDKCYjMzQ7bGljZW5zZSYjMzQ7KSA9ICYjMzQ7R1BMJiMzNDs7CiYjNDM7CiYjNDM7c3RydWN0IGVsZW0gewomIzQzOwlzdHJ1Y3QgYnBmX3RocmVhZF93cSB0d3E7CiYjNDM7fTsKJiM0MzsKJiM0MztzdHJ1Y3QgewomIzQzOwlfX3VpbnQodHlwZSwgQlBGX01BUF9UWVBFX0FSUkFZKTsKJiM0MzsJX191aW50KG1heF9lbnRyaWVzLCAyKTsKJiM0MzsJX190eXBlKGtleSwgaW50KTsKJiM0MzsJX190eXBlKHZhbHVlLCBzdHJ1Y3QgZWxlbSk7CiYjNDM7fSBtYXBfYXJyIFNFQygmIzM0Oy5tYXBzJiMzNDspOwomIzQzOwomIzQzO19fdTY0IHRhcmdldF9jZ3JvdXBfaWQ7CiYjNDM7X191NjQgY2FsbGJhY2tfY2dyb3VwX2lkOwomIzQzO2ludCB0d3FfZG9uZTsKJiM0MztpbnQgdGVzdF9rZXk7CiYjNDM7CiYjNDM7c3RhdGljIGludCB0d3FfY2FsbGJhY2sodm9pZCAqbWFwLCBpbnQgKmtleSwgdm9pZCAqdmFsdWUpCiYjNDM7ewomIzQzOwljYWxsYmFja19jZ3JvdXBfaWQgPSBicGZfZ2V0X2N1cnJlbnRfY2dyb3VwX2lkKCk7CiYjNDM7CXR3cV9kb25lID0gMTsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOwomIzQzO1NFQygmIzM0O3N5c2NhbGwmIzM0OykKJiM0MztpbnQgc3RhcnRfdGhyZWFkX3dxKHZvaWQgKmN0eCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBlbGVtICp2YWw7CiYjNDM7CWludCBrZXkgPSB0ZXN0X2tleTsKJiM0MzsJaW50IHJldDsKJiM0MzsKJiM0MzsJdmFsID0gYnBmX21hcF9sb29rdXBfZWxlbSgmYW1wO21hcF9hcnIsICZhbXA7a2V5KTsKJiM0MzsJaWYgKCF2YWwpCiYjNDM7CQlyZXR1cm4gLTE7CiYjNDM7CiYjNDM7CXJldCA9IGJwZl90aHJlYWRfd3FfaW5pdCgmYW1wO3ZhbC0mZ3Q7dHdxLCAmYW1wO21hcF9hcnIsIHRhcmdldF9jZ3JvdXBfaWQsIDApOwomIzQzOwlpZiAocmV0KQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CiYjNDM7CXJldCA9IGJwZl90aHJlYWRfd3Ffc2V0X2NhbGxiYWNrKCZhbXA7dmFsLSZndDt0d3EsIHR3cV9jYWxsYmFjaywgMCk7CiYjNDM7CWlmIChyZXQpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsKJiM0MzsJcmV0ID0gYnBmX3RocmVhZF93cV9zdGFydCgmYW1wO3ZhbC0mZ3Q7dHdxLCAwKTsKJiM0MzsKJiM0MztvdXQ6CiYjNDM7CXJldHVybiByZXQ7CiYjNDM7fQo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNyAwODo1MDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyNTU1NAoJCQkJCQkJb3V0cHV0OiAyOQoJCQkJCQkJdGhvdWdodHM6IDM2MQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgdGhlIE5ldyBCUEYgVGhyZWFkIFdvcmtxdWV1ZSBGZWF0dXJlKioKCk9rYXksIHNvIHRoaXMgcGF0Y2ggaXMgaW50cm9kdWNpbmcgc29tZXRoaW5nIGludGVyZXN0aW5nOiBhIG5ldyBCUEYgZmVhdHVyZSBjYWxsZWQgYGJwZl90aHJlYWRfd3FgLiBSaWdodCBvZmYgdGhlIGJhdCwgSSBzZWUgdGhlIGFkZGl0aW9uIG9mIGBCUEZfVEhSRUFEX1dRYCB0byBgZW51bSBidGZfZmllbGRfdHlwZWAsIHdoaWNoIHRlbGxzIG1lIHRoaXMgaXMgYSBwcmV0dHkgZnVuZGFtZW50YWwgY2hhbmdlIHRvIHRoZSBCUEYgbGFuZHNjYXBlLiBXZSYjMzk7cmUgbG9va2luZyBhdCBmb3VyIG5ldyBmdW5jdGlvbnM6IGBicGZfdGhyZWFkX3dxX2luaXRgLCBgYnBmX3RocmVhZF93cV9zZXRfY2FsbGJhY2tgLCBgYnBmX3RocmVhZF93cV9zdGFydGAsIGFuZCBgYnBmX3RocmVhZF93cV9jYW5jZWxfYW5kX2ZyZWVgLiBUaGVuIHRoZXJlJiMzOTtzIGBicGZfdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlc2AgYXMgd2VsbC4gVGhpcyBhbGwgbG9va3MgbGlrZSB0aGUgZnJhbWV3b3JrIHRvIGFsbG93IEJQRiBwcm9ncmFtcyB0byBzY2hlZHVsZSB0YXNrcyBvbiBrdGhyZWFkIHdvcmtlcnMsIGFuZCwgYXMgYW4gb3B0aW9uYWwgZmVhdHVyZSwgYXR0YWNoIHRob3NlIHRhc2tzIHRvIGEgc3BlY2lmaWMgY2dyb3VwLiBEZWZpbml0ZWx5IHNvdW5kcyBsaWtlIGEgY2FuZGlkYXRlIGZvciBzb21lIHNlcmlvdXMgZnV6emluZyDigJMgZ290dGEgc2VlIHdoZXJlIHRoZSBlZGdlIGNhc2VzIGxpZS4KCkxldCYjMzk7cyBuYWlsIGRvd24gdGhlIGtleSBzeW1ib2xzIHdlIG5lZWQgdG8gaW52ZXN0aWdhdGU6IGBicGZfdGhyZWFkX3dxX2luaXRgLCBgYnBmX3RocmVhZF93cV9zZXRfY2FsbGJhY2tgLCBgYnBmX3RocmVhZF93cV9zdGFydGAsIGFuZCBgYnBmX3RyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXNgLiBUaG9zZSBhcmUgdGhlIGVudHJ5IHBvaW50cyBoZXJlLgoKTmV4dCwgSSBuZWVkIHRvIGNoZWNrIGZvciBhbnkgY3JpdGljYWwgYENPTkZJR2Agb3B0aW9ucyB0aGF0IG1pZ2h0IGJlIHJlcXVpcmVkLiBGcm9tIHRoZSBsb29rIG9mIGl0LCBgYnBmX3RocmVhZF93cV9pbml0YCB3aWxsIHVzZSBgQ09ORklHX0NHUk9VUFNgIHRvIGF0dGFjaCB0byBhIGNncm91cCwgYnV0IGl0IGxvb2tzIGxpa2UgaXQgd2lsbCBncmFjZWZ1bGx5IGRlZ3JhZGUgd2l0aCBgLUVPUE5PVFNVUFBgIGlmIGNncm91cHMgYXJlbiYjMzk7dCBlbmFibGVkLiBUaGF0JiMzOTtzIGdvb2QsIGxlc3Mgb2YgYSBoYXJkIGRlcGVuZGVuY3kuIE5vdywgYGJwZl90cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzYCDigJMgdGhhdCYjMzk7cyBsb2NhdGVkIGluIGBtbS9icGZfbWVtY29udHJvbC5jYC4gU2luY2UgdGhhdCBmaWxlIGlzIGRlYWxpbmcgd2l0aCBtZW1vcnkgY29udHJvbCwgaXQgbWFrZXMgc2Vuc2UgdGhhdCBgQ09ORklHX01FTUNHYCBhbmQgYENPTkZJR19CUEZfU1lTQ0FMTGAgYXJlIGxpa2VseSBkZXBlbmRlbmNpZXMsIGJ1dCBJIHNob3VsZCBwcm9iYWJseSBjaGVjayB0aGUgYG1tL01ha2VmaWxlYCB0byBjb25maXJtIHRoZSBkZXRhaWxzLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA3IDA4OjUwPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2JwZl9tZW1jb250cm9sLm8mIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDttbS8mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bW0vTWFrZWZpbGU9MTA2PWlmZGVmIENPTkZJR19CUEZfU1lTQ0FMTFxubW0vTWFrZWZpbGU6MTA3Om9iai0kKENPTkZJR19NRU1DRykgJiM0Mzs9IGJwZl9tZW1jb250cm9sLm9cbm1tL01ha2VmaWxlLTEwOC1lbmRpZlxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjUvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA3IDA4OjUwPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDI2NDY2CgkJCQkJCQlvdXRwdXQ6IDIwNQoJCQkJCQkJdGhvdWdodHM6IDgzMgoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgdGhlIE5ldyBCUEYgVGhyZWFkIFdvcmtxdWV1ZSBGZWF0dXJlKioKCk9rYXksIHNvIEkmIzM5O20gZGlnZ2luZyBpbnRvIHRoaXMgbmV3IEJQRiB0aHJlYWQgd29ya3F1ZXVlIHBhdGNoLiBGaXJzdCB0aGluZ3MgZmlyc3Q6IGl0IGxvb2tzIGxpa2Ugd2UgbmVlZCBgQ09ORklHX01FTUNHYCBmb3IgYGJwZl90cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzYCwgd2hpY2ggbWFrZXMgc2Vuc2UgZm9yIG1lbW9yeSBjb250cm9sLCBhbmQgYENPTkZJR19DR1JPVVBTYCBpcyByZXF1aXJlZCBmb3IgYGJwZl90aHJlYWRfd3FfaW5pdGAgdG8gZnVuY3Rpb24gZnVsbHkgd2l0aCBjZ3JvdXBzLCBhbmQgdGhlbiBvZiBjb3Vyc2UgYENPTkZJR19CUEZfU1lTQ0FMTGAgaXMgc3RhbmRhcmQgZm9yIEJQRiwgc28gbGV0JiMzOTtzIG1hcmsgdGhhdCBhcyB1bmRlcnN0b29kLgoKTGV0IG1lIGNvbmZpcm0gdGhhdCBgYnBmX3RocmVhZF93cV9pbml0YCBpcyBhY3R1YWxseSBhdmFpbGFibGUuIFllcCwgaXQmIzM5O3MgZGVmaW5lZCByaWdodCB0aGVyZSBpbiBga2VybmVsL2JwZi9oZWxwZXJzLmNgLiBHb29kLiBBbHJpZ2h0LCB3aGF0IGVsc2UgaXMgaW4gcGxheT8gSG1tLCBgYnBmX3RocmVhZF93cV9jYW5jZWxfYW5kX2ZyZWVgIGlzIGludGVyZXN0aW5nLCBpdCBpcyBjYWxsZWQgaW50ZXJuYWxseSB3aGVuIG1hcHMgYXJlIGZyZWVkLiBJdCYjMzk7cyBub3QgYSBkaXJlY3Qga2Z1bmMgdXNlZCBieSBCUEYgcHJvZ3JhbXMsIGJ1dCBkZWZpbml0ZWx5IHBhcnQgb2YgdGhlIGxpZmVjeWNsZS4gQW5kIGBicGZfb2JqX2ZyZWVfdGhyZWFkX3dxYCBpcyBhbHNvIGludGVybmFsLgoKT2theSwgc28gdGhlIGtmdW5jcyB3ZSAqZG8qIG5lZWQgdG8gZm9jdXMgb24gYXJlOiBgYnBmX3RocmVhZF93cV9pbml0YCwgYGJwZl90aHJlYWRfd3Ffc2V0X2NhbGxiYWNrYCwgYGJwZl90aHJlYWRfd3Ffc3RhcnRgLCBhbmQgYGJwZl90cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzYC4gTm93LCBsZXQmIzM5O3MgdmVyaWZ5IHRoYXQgdGhlc2Uga2Z1bmNzIGFyZSBhY3R1YWxseSBleHBvc2VkLiBgYnBmX3RocmVhZF93cV9pbml0YCBpcyBhZGRlZCB0byBgc3lzY2FsbF9idGZfaWRzYCB3aGljaCBpcyByZWdpc3RlcmVkIGZvciBgQlBGX1BST0dfVFlQRV9TWVNDQUxMYC4gR29vZC4gYGJwZl90aHJlYWRfd3Ffc2V0X2NhbGxiYWNrYCBhbmQgYGJwZl90aHJlYWRfd3Ffc3RhcnRgIGFyZSBpbiBgZ2VuZXJpY19idGZfaWRzYCwgd2hpY2ggaXMgcmVnaXN0ZXJlZCBmb3IgYSBidW5jaCBvZiBwcm9ncmFtIHR5cGVzLCBzbyB0aGF0JiMzOTtzIGZpbmUuIEFuZCBgYnBmX3RyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXNgIGlzIGluIGBicGZfbWVtY29udHJvbF9rZnVuY3NgLiBDb25maXJtZWQsIGNvbmZpcm1lZCwgY29uZmlybWVkLgoKU28sIHRoZSBrZXkgc3ltYm9scyB0byBrZWVwIGFuIGV5ZSBvbiBhcmU6IGBicGZfdGhyZWFkX3dxX2luaXRgLCBgYnBmX3RocmVhZF93cV9zZXRfY2FsbGJhY2tgLCBgYnBmX3RocmVhZF93cV9zdGFydGAsIGFuZCBgYnBmX3RyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXNgLiBBbmQgdGhlbiB0aGUgcmVsZXZhbnQgY29uZmlnIG9wdGlvbnMgYXJlIGBNRU1DR2AgYW5kIGBDR1JPVVBTYC4KCkp1c3QgZG91YmxlLWNoZWNraW5nLi4uIGBicGZfdGhyZWFkX3dxX2NhbmNlbF9hbmRfZnJlZWAuIE5vLCB0aGF0JiMzOTtzIGp1c3QgYSBnbG9iYWwgZnVuY3Rpb24sIGludGVybmFsIHRvIGBrZXJuZWwvYnBmL2hlbHBlcnMuY2AuIFdhaXQuLi5idXQgYGJwZl9vYmpfZnJlZV90aHJlYWRfd3FgIGFuZCBgYnBmX29ial9mcmVlX2ZpZWxkc2AgY2FsbCBpdC4KCk9oLCBvbmUgbW9yZSB0aGluZyB0byBjb25zaWRlcjogYGNncm91cF9rdGhyZWFkX2F0dGFjaGAsIHdoaWNoIGlzIGFkZGVkIGluIGBrZXJuZWwvY2dyb3VwL2Nncm91cC5jYC4gSXQmIzM5O3MgYSBnbG9iYWwgZnVuY3Rpb24sIGFuZCBhIGhlbHBlciBmb3IgYGJwZl90aHJlYWRfd3FfaW5pdGAuIE9rYXksIEkgdGhpbmsgdGhhdCAqc2hvdWxkKiBiZSBpbmNsdWRlZCBpbiB0aGUgbGlzdCBvZiBmb2N1cyBzeW1ib2xzLCBldmVuIHRob3VnaCBpdCYjMzk7cyB0ZWNobmljYWxseSBhIGhlbHBlciBmdW5jdGlvbi4KCkFscmlnaHQsIGxldCYjMzk7cyByZWNhcCB0aGUgcmVhc29uaW5nOiB0aGlzIHBhdGNoIGludHJvZHVjZXMgYSBuZXcgQlBGIHRocmVhZCB3b3JrcXVldWUsIGxldHRpbmcgQlBGIHByb2dyYW1zIHNjaGVkdWxlIHdvcmsgaW4ga3RocmVhZCBjb250ZXh0LCBvcHRpb25hbGx5IHRpZWQgdG8gYSBjZ3JvdXAsIGFuZCBhbHNvIGFkZHMgYGJwZl90cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzYCBmb3IgbWVtb3J5IGNncm91cCByZWNsYWltLiBUaGVzZSBhcmUgZnVuY3Rpb25hbCBjaGFuZ2VzIHRvIHRoZSBCUEYgY29yZSBhbmQgbWVtb3J5IGNvbnRyb2wsIGFjY2Vzc2libGUgZnJvbSB1c2Vyc3BhY2UgdGhyb3VnaCBCUEYgcHJvZ3JhbXMsIHNvIGRlZmluaXRlbHkgZnV6emFibGUuCgoqKkZpbmFsIEZvY3VzIFN5bWJvbHM6KioKCiogICBgYnBmX3RocmVhZF93cV9pbml0YAoqICAgYGJwZl90aHJlYWRfd3Ffc2V0X2NhbGxiYWNrYAoqICAgYGJwZl90aHJlYWRfd3Ffc3RhcnRgCiogICBgYnBmX3RyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXNgCiogICBgY2dyb3VwX2t0aHJlYWRfYXR0YWNoYAoKKipSZWxldmFudCBDb25maWdzOioqCgoqICAgYE1FTUNHYAoqICAgYENHUk9VUFNgCgpPa2F5LCB0aGF0JiMzOTtzIGV2ZXJ5dGhpbmcuIExldCYjMzk7cyBzZW5kIHRoZXNlIHJlc3VsdHMgb3Zlci4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD42LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNyAwODo1MTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnNldC1yZXN1bHRzPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7TUVNQ0cmIzM0OywKICAgICYjMzQ7Q0dST1VQUyYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O2JwZl90aHJlYWRfd3FfaW5pdCYjMzQ7LAogICAgJiMzNDticGZfdGhyZWFkX3dxX3NldF9jYWxsYmFjayYjMzQ7LAogICAgJiMzNDticGZfdGhyZWFkX3dxX3N0YXJ0JiMzNDssCiAgICAmIzM0O2JwZl90cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzJiMzNDssCiAgICAmIzM0O2Nncm91cF9rdGhyZWFkX2F0dGFjaCYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBpbnRyb2R1Y2VzIGEgbmV3IEJQRiB0aHJlYWQgd29ya3F1ZXVlIGZlYXR1cmUgKGBicGZfdGhyZWFkX3dxYCkgdGhhdCBhbGxvd3MgQlBGIHByb2dyYW1zIHRvIHNjaGVkdWxlIHdvcmsgaW4gYSBrdGhyZWFkIGNvbnRleHQsIG9wdGlvbmFsbHkgYXR0YWNoZWQgdG8gYSBjZ3JvdXAuIEl0IGFsc28gYWRkcyBhIG5ldyBCUEYga2Z1bmMgYGJwZl90cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzYCBmb3IgbWVtb3J5IGNncm91cCByZWNsYWltLiBUaGVzZSBhcmUgZnVuY3Rpb25hbCBjaGFuZ2VzIHRvIHRoZSBjb3JlIEJQRiBhbmQgbWVtb3J5IGNvbnRyb2wgc3Vic3lzdGVtcywgcmVhY2hhYmxlIGZyb20gdXNlcnNwYWNlIHZpYSBCUEYgcHJvZ3JhbXMsIGFuZCBzaG91bGQgYmUgZnV6emVkLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtNRU1DRyYjMzQ7LAogICAgJiMzNDtDR1JPVVBTJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7YnBmX3RocmVhZF93cV9pbml0JiMzNDssCiAgICAmIzM0O2JwZl90aHJlYWRfd3Ffc2V0X2NhbGxiYWNrJiMzNDssCiAgICAmIzM0O2JwZl90aHJlYWRfd3Ffc3RhcnQmIzM0OywKICAgICYjMzQ7YnBmX3RyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMmIzM0OywKICAgICYjMzQ7Y2dyb3VwX2t0aHJlYWRfYXR0YWNoJiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIGludHJvZHVjZXMgYSBuZXcgQlBGIHRocmVhZCB3b3JrcXVldWUgZmVhdHVyZSAoYGJwZl90aHJlYWRfd3FgKSB0aGF0IGFsbG93cyBCUEYgcHJvZ3JhbXMgdG8gc2NoZWR1bGUgd29yayBpbiBhIGt0aHJlYWQgY29udGV4dCwgb3B0aW9uYWxseSBhdHRhY2hlZCB0byBhIGNncm91cC4gSXQgYWxzbyBhZGRzIGEgbmV3IEJQRiBrZnVuYyBgYnBmX3RyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXNgIGZvciBtZW1vcnkgY2dyb3VwIHJlY2xhaW0uIFRoZXNlIGFyZSBmdW5jdGlvbmFsIGNoYW5nZXMgdG8gdGhlIGNvcmUgQlBGIGFuZCBtZW1vcnkgY29udHJvbCBzdWJzeXN0ZW1zLCByZWFjaGFibGUgZnJvbSB1c2Vyc3BhY2UgdmlhIEJQRiBwcm9ncmFtcywgYW5kIHNob3VsZCBiZSBmdXp6ZWQuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPC90Ym9keT4KCTwvdGFibGU+CgoJPGRpdiBpZD0ibGxtX3N1bW1hcnlfdGFibGVfZGl2IiBzdHlsZT0ibWFyZ2luOiAyMHB4IDA7Ij4KCQk8dGFibGUgY2xhc3M9Imxpc3RfdGFibGUiPgoJCQk8Y2FwdGlvbj5MTE0gQ2FsbHMgU3VtbWFyeTo8L2NhcHRpb24+CgkJCTx0aGVhZD4KCQkJCTx0cj4KCQkJCQk8dGg+VG90YWwgQ2FsbHM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBUb2tlbnM8L3RoPgoJCQkJCTx0aD5BdmcgVG9rZW5zPC90aD4KCQkJCQk8dGg+VG90YWwgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCQk8dGg+QXZnIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQk8L3RyPgoJCQk8L3RoZWFkPgoJCQk8dGJvZHkgaWQ9ImxsbV9zdW1tYXJ5X3N0YXRzX2JvZHkiPjwvdGJvZHk+CgkJPC90YWJsZT4KCTwvZGl2PgoKCTxkaXYgaWQ9InRvb2xfc3VtbWFyeV90YWJsZV9kaXYiIHN0eWxlPSJtYXJnaW46IDIwcHggMDsiPgoJCTx0YWJsZSBjbGFzcz0ibGlzdF90YWJsZSI+CgkJCTxjYXB0aW9uPlRvb2wgQ2FsbHMgU3VtbWFyeTo8L2NhcHRpb24+CgkJCTx0aGVhZD4KCQkJCTx0cj4KCQkJCQk8dGg+VG90YWwgQ2FsbHM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJCTx0aD5BdmcgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCTwvdHI+CgkJCTwvdGhlYWQ+CgkJCTx0Ym9keSBpZD0idG9vbF9zdW1tYXJ5X3N0YXRzX2JvZHkiPjwvdGJvZHk+CgkJPC90YWJsZT4KCTwvZGl2PgoKCTxkaXYgaWQ9ImR1cmF0aW9uX2NoYXJ0X2RpdiIgc3R5bGU9IndpZHRoOiAxMDAlOyBtYXJnaW46IDIwcHggMDsgYm9yZGVyOiAxcHg7Ij48L2Rpdj4KCTxkaXYgaWQ9InRva2VuX2NoYXJ0X2RpdiIgc3R5bGU9IndpZHRoOiAxMDAlOyBtYXJnaW46IDIwcHggMDsgYm9yZGVyOiAxcHg7Ij48L2Rpdj4KCgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJodHRwczovL3d3dy5nb29nbGUuY29tL2pzYXBpIj48L3NjcmlwdD4KCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KCQlnb29nbGUubG9hZCgidmlzdWFsaXphdGlvbiIsICIxIiwge3BhY2thZ2VzOlsiY29yZWNoYXJ0Il19KTsKCQlnb29nbGUuc2V0T25Mb2FkQ2FsbGJhY2soZHJhd0NoYXJ0cyk7CgoJCWZ1bmN0aW9uIGRyYXdDaGFydHMoKSB7CgkJCWNvbnN0IHJhd0RhdGEgPSBbeyJTdGFydGVkIjoiMjAyNi0wOC0wN1QwODo1MDo0Mi4zNTQ0NTU3MzRaIiwiU2VxIjowLCJOZXN0aW5nIjowLCJUeXBlIjoiZmxvdyIsIk5hbWUiOiJwYXRjaC10cmlhZ2UiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyNDk0MzkzNjA5MCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJNRU1DR1wiLFxuICAgIFwiQ0dST1VQU1wiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcImJwZl90aHJlYWRfd3FfaW5pdFwiLFxuICAgIFwiYnBmX3RocmVhZF93cV9zZXRfY2FsbGJhY2tcIixcbiAgICBcImJwZl90aHJlYWRfd3Ffc3RhcnRcIixcbiAgICBcImJwZl90cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzXCIsXG4gICAgXCJjZ3JvdXBfa3RocmVhZF9hdHRhY2hcIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBpbnRyb2R1Y2VzIGEgbmV3IEJQRiB0aHJlYWQgd29ya3F1ZXVlIGZlYXR1cmUgKGBicGZfdGhyZWFkX3dxYCkgdGhhdCBhbGxvd3MgQlBGIHByb2dyYW1zIHRvIHNjaGVkdWxlIHdvcmsgaW4gYSBrdGhyZWFkIGNvbnRleHQsIG9wdGlvbmFsbHkgYXR0YWNoZWQgdG8gYSBjZ3JvdXAuIEl0IGFsc28gYWRkcyBhIG5ldyBCUEYga2Z1bmMgYGJwZl90cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzYCBmb3IgbWVtb3J5IGNncm91cCByZWNsYWltLiBUaGVzZSBhcmUgZnVuY3Rpb25hbCBjaGFuZ2VzIHRvIHRoZSBjb3JlIEJQRiBhbmQgbWVtb3J5IGNvbnRyb2wgc3Vic3lzdGVtcywgcmVhY2hhYmxlIGZyb20gdXNlcnNwYWNlIHZpYSBCUEYgcHJvZ3JhbXMsIGFuZCBzaG91bGQgYmUgZnV6emVkLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0wN1QwODo1MDo0Mi4zNTQ0NjM0MzRaIiwiU2VxIjoxLCJOZXN0aW5nIjoxLCJUeXBlIjoiYWN0aW9uIiwiTmFtZSI6InJlYWQtcGF0Y2gtZGlmZiIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjEzNTM4NzM0MDMsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIlBhdGNoRGlmZlwiOiBcImNvbW1pdCBlNzJlMmMwMDhjOTUxZmE1ZDA3YWJhYWQ5ZDMyZTg3Nzg3OWUyZWE3XFxuQXV0aG9yOiBzeXotY2x1c3RlciBcXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cXHUwMDNlXFxuRGF0ZTogICBGcmkgQXVnIDcgMDg6NTA6NDAgMjAyNiArMDAwMFxcblxcbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcXG5cXG5kaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9icGYuaCBiL2luY2x1ZGUvbGludXgvYnBmLmhcXG5pbmRleCA3M2JhY2ZjNjQ0NGRmLi5kNjNjZTgzMTk4Njk2IDEwMDY0NFxcbi0tLSBhL2luY2x1ZGUvbGludXgvYnBmLmhcXG4rKysgYi9pbmNsdWRlL2xpbnV4L2JwZi5oXFxuQEAgLTIxMyw2ICsyMTMsNyBAQCBlbnVtIGJ0Zl9maWVsZF90eXBlIHtcXG4gXFx0QlBGX1VQVFIgICAgICAgPSAoMSBcXHUwMDNjXFx1MDAzYyAxMSksXFxuIFxcdEJQRl9SRVNfU1BJTl9MT0NLID0gKDEgXFx1MDAzY1xcdTAwM2MgMTIpLFxcbiBcXHRCUEZfVEFTS19XT1JLICA9ICgxIFxcdTAwM2NcXHUwMDNjIDEzKSxcXG4rXFx0QlBGX1RIUkVBRF9XUSAgPSAoMSBcXHUwMDNjXFx1MDAzYyAxNCksXFxuIH07XFxuIFxcbiBlbnVtIGJwZl9jZ3JvdXBfc3RvcmFnZV90eXBlIHtcXG5AQCAtMjY3LDYgKzI2OCw3IEBAIHN0cnVjdCBidGZfcmVjb3JkIHtcXG4gXFx0aW50IHdxX29mZjtcXG4gXFx0aW50IHJlZmNvdW50X29mZjtcXG4gXFx0aW50IHRhc2tfd29ya19vZmY7XFxuK1xcdGludCB0aHJlYWRfd3Ffb2ZmO1xcbiBcXHRzdHJ1Y3QgYnRmX2ZpZWxkIGZpZWxkc1tdO1xcbiB9O1xcbiBcXG5AQCAtMzcyLDYgKzM3NCw4IEBAIHN0YXRpYyBpbmxpbmUgY29uc3QgY2hhciAqYnRmX2ZpZWxkX3R5cGVfbmFtZShlbnVtIGJ0Zl9maWVsZF90eXBlIHR5cGUpXFxuIFxcdFxcdHJldHVybiBcXFwiYnBmX3JlZmNvdW50XFxcIjtcXG4gXFx0Y2FzZSBCUEZfVEFTS19XT1JLOlxcbiBcXHRcXHRyZXR1cm4gXFxcImJwZl90YXNrX3dvcmtcXFwiO1xcbitcXHRjYXNlIEJQRl9USFJFQURfV1E6XFxuK1xcdFxcdHJldHVybiBcXFwiYnBmX3RocmVhZF93cVxcXCI7XFxuIFxcdGRlZmF1bHQ6XFxuIFxcdFxcdFdBUk5fT05fT05DRSgxKTtcXG4gXFx0XFx0cmV0dXJuIFxcXCJ1bmtub3duXFxcIjtcXG5AQCAtNDEyLDYgKzQxNiw4IEBAIHN0YXRpYyBpbmxpbmUgdTMyIGJ0Zl9maWVsZF90eXBlX3NpemUoZW51bSBidGZfZmllbGRfdHlwZSB0eXBlKVxcbiBcXHRcXHRyZXR1cm4gc2l6ZW9mKHN0cnVjdCBicGZfcmVmY291bnQpO1xcbiBcXHRjYXNlIEJQRl9UQVNLX1dPUks6XFxuIFxcdFxcdHJldHVybiBzaXplb2Yoc3RydWN0IGJwZl90YXNrX3dvcmspO1xcbitcXHRjYXNlIEJQRl9USFJFQURfV1E6XFxuK1xcdFxcdHJldHVybiBzaXplb2Yoc3RydWN0IGJwZl90aHJlYWRfd3EpO1xcbiBcXHRkZWZhdWx0OlxcbiBcXHRcXHRXQVJOX09OX09OQ0UoMSk7XFxuIFxcdFxcdHJldHVybiAwO1xcbkBAIC00NDYsNiArNDUyLDggQEAgc3RhdGljIGlubGluZSB1MzIgYnRmX2ZpZWxkX3R5cGVfYWxpZ24oZW51bSBidGZfZmllbGRfdHlwZSB0eXBlKVxcbiBcXHRcXHRyZXR1cm4gX19hbGlnbm9mX18oc3RydWN0IGJwZl9yZWZjb3VudCk7XFxuIFxcdGNhc2UgQlBGX1RBU0tfV09SSzpcXG4gXFx0XFx0cmV0dXJuIF9fYWxpZ25vZl9fKHN0cnVjdCBicGZfdGFza193b3JrKTtcXG4rXFx0Y2FzZSBCUEZfVEhSRUFEX1dROlxcbitcXHRcXHRyZXR1cm4gX19hbGlnbm9mX18oc3RydWN0IGJwZl90aHJlYWRfd3EpO1xcbiBcXHRkZWZhdWx0OlxcbiBcXHRcXHRXQVJOX09OX09OQ0UoMSk7XFxuIFxcdFxcdHJldHVybiAwO1xcbkBAIC00NzgsNiArNDg2LDcgQEAgc3RhdGljIGlubGluZSB2b2lkIGJwZl9vYmpfaW5pdF9maWVsZChjb25zdCBzdHJ1Y3QgYnRmX2ZpZWxkICpmaWVsZCwgdm9pZCAqYWRkcilcXG4gXFx0Y2FzZSBCUEZfS1BUUl9QRVJDUFU6XFxuIFxcdGNhc2UgQlBGX1VQVFI6XFxuIFxcdGNhc2UgQlBGX1RBU0tfV09SSzpcXG4rXFx0Y2FzZSBCUEZfVEhSRUFEX1dROlxcbiBcXHRcXHRicmVhaztcXG4gXFx0ZGVmYXVsdDpcXG4gXFx0XFx0V0FSTl9PTl9PTkNFKDEpO1xcbkBAIC01MDIsNiArNTExLDcgQEAgc3RhdGljIGlubGluZSBib29sIGJ0Zl9maWVsZF9pc19ubWlfc2FmZShlbnVtIGJ0Zl9maWVsZF90eXBlIHR5cGUpXFxuIFxcdGNhc2UgQlBGX1RBU0tfV09SSzpcXG4gXFx0Y2FzZSBCUEZfS1BUUl9VTlJFRjpcXG4gXFx0Y2FzZSBCUEZfUkVGQ09VTlQ6XFxuK1xcdGNhc2UgQlBGX1RIUkVBRF9XUTpcXG4gXFx0XFx0cmV0dXJuIHRydWU7XFxuIFxcdGRlZmF1bHQ6XFxuIFxcdFxcdHJldHVybiBmYWxzZTtcXG5AQCAtNjQ0LDYgKzY1NCw3IEBAIHZvaWQgY29weV9tYXBfdmFsdWVfbG9ja2VkKHN0cnVjdCBicGZfbWFwICptYXAsIHZvaWQgKmRzdCwgdm9pZCAqc3JjLFxcbiB2b2lkIGJwZl90aW1lcl9jYW5jZWxfYW5kX2ZyZWUodm9pZCAqdGltZXIpO1xcbiB2b2lkIGJwZl93cV9jYW5jZWxfYW5kX2ZyZWUodm9pZCAqdGltZXIpO1xcbiB2b2lkIGJwZl90YXNrX3dvcmtfY2FuY2VsX2FuZF9mcmVlKHZvaWQgKnRpbWVyKTtcXG4rdm9pZCBicGZfdGhyZWFkX3dxX2NhbmNlbF9hbmRfZnJlZSh2b2lkICp2YWwpO1xcbiB2b2lkIGJwZl9saXN0X2hlYWRfZnJlZShjb25zdCBzdHJ1Y3QgYnRmX2ZpZWxkICpmaWVsZCwgdm9pZCAqbGlzdF9oZWFkLFxcbiBcXHRcXHRcXHRzdHJ1Y3QgYnBmX3NwaW5fbG9jayAqc3Bpbl9sb2NrKTtcXG4gdm9pZCBicGZfcmJfcm9vdF9mcmVlKGNvbnN0IHN0cnVjdCBidGZfZmllbGQgKmZpZWxkLCB2b2lkICpyYl9yb290LFxcbkBAIC03MDEsNyArNzEyLDggQEAgYm9vbCBicGZfbWFwX21ldGFfZXF1YWwoY29uc3Qgc3RydWN0IGJwZl9tYXAgKm1ldGEwLFxcbiBcXG4gc3RhdGljIGlubGluZSBib29sIGJwZl9tYXBfaGFzX2ludGVybmFsX3N0cnVjdHMoc3RydWN0IGJwZl9tYXAgKm1hcClcXG4ge1xcbi1cXHRyZXR1cm4gYnRmX3JlY29yZF9oYXNfZmllbGQobWFwLVxcdTAwM2VyZWNvcmQsIEJQRl9USU1FUiB8IEJQRl9XT1JLUVVFVUUgfCBCUEZfVEFTS19XT1JLKTtcXG4rXFx0cmV0dXJuIGJ0Zl9yZWNvcmRfaGFzX2ZpZWxkKG1hcC1cXHUwMDNlcmVjb3JkLCBCUEZfVElNRVIgfCBCUEZfV09SS1FVRVVFIHxcXG4rXFx0XFx0XFx0XFx0XFx0XFx0IEJQRl9UQVNLX1dPUksgfCBCUEZfVEhSRUFEX1dRKTtcXG4gfVxcbiBcXG4gdm9pZCBicGZfbWFwX2ZyZWVfaW50ZXJuYWxfc3RydWN0cyhzdHJ1Y3QgYnBmX21hcCAqbWFwLCB2b2lkICpvYmopO1xcbkBAIC0yNzI1LDYgKzI3MzcsNyBAQCBib29sIGJ0Zl9yZWNvcmRfZXF1YWwoY29uc3Qgc3RydWN0IGJ0Zl9yZWNvcmQgKnJlY19hLCBjb25zdCBzdHJ1Y3QgYnRmX3JlY29yZCAqclxcbiB2b2lkIGJwZl9vYmpfZnJlZV90aW1lcihjb25zdCBzdHJ1Y3QgYnRmX3JlY29yZCAqcmVjLCB2b2lkICpvYmopO1xcbiB2b2lkIGJwZl9vYmpfZnJlZV93b3JrcXVldWUoY29uc3Qgc3RydWN0IGJ0Zl9yZWNvcmQgKnJlYywgdm9pZCAqb2JqKTtcXG4gdm9pZCBicGZfb2JqX2ZyZWVfdGFza193b3JrKGNvbnN0IHN0cnVjdCBidGZfcmVjb3JkICpyZWMsIHZvaWQgKm9iaik7XFxuK3ZvaWQgYnBmX29ial9mcmVlX3RocmVhZF93cShjb25zdCBzdHJ1Y3QgYnRmX3JlY29yZCAqcmVjLCB2b2lkICpvYmopO1xcbiB2b2lkIGJwZl9vYmpfY2FuY2VsX2ZpZWxkcyhzdHJ1Y3QgYnBmX21hcCAqbWFwLCB2b2lkICpvYmopO1xcbiB2b2lkIGJwZl9vYmpfZnJlZV9maWVsZHMoY29uc3Qgc3RydWN0IGJ0Zl9yZWNvcmQgKnJlYywgdm9pZCAqb2JqKTtcXG4gdm9pZCBfX2JwZl9vYmpfZHJvcF9pbXBsKHZvaWQgKnAsIGNvbnN0IHN0cnVjdCBidGZfcmVjb3JkICpyZWMsIGJvb2wgcGVyY3B1KTtcXG5kaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9jZ3JvdXAuaCBiL2luY2x1ZGUvbGludXgvY2dyb3VwLmhcXG5pbmRleCBmMmFhNDZhNGY4NzFlLi45YjRhOGRjNzQ4YWNlIDEwMDY0NFxcbi0tLSBhL2luY2x1ZGUvbGludXgvY2dyb3VwLmhcXG4rKysgYi9pbmNsdWRlL2xpbnV4L2Nncm91cC5oXFxuQEAgLTkyMyw0ICs5MjMsNiBAQCBzdHJ1Y3QgY2dyb3VwICp0YXNrX2dldF9jZ3JvdXAxKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLCBpbnQgaGllcmFyY2h5X2lkKTtcXG4gXFxuIHN0cnVjdCBjZ3JvdXBfb2ZfcGVhayAqb2ZfcGVhayhzdHJ1Y3Qga2VybmZzX29wZW5fZmlsZSAqb2YpO1xcbiBcXG4raW50IGNncm91cF9rdGhyZWFkX2F0dGFjaChzdHJ1Y3QgY2dyb3VwICpjZ3JwLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spO1xcbitcXG4gI2VuZGlmIC8qIF9MSU5VWF9DR1JPVVBfSCAqL1xcbmRpZmYgLS1naXQgYS9pbmNsdWRlL3VhcGkvbGludXgvYnBmLmggYi9pbmNsdWRlL3VhcGkvbGludXgvYnBmLmhcXG5pbmRleCBmZmQ5NmU4YjkyMGJkLi4wNTU4NTIwZjY3ZmU0IDEwMDY0NFxcbi0tLSBhL2luY2x1ZGUvdWFwaS9saW51eC9icGYuaFxcbisrKyBiL2luY2x1ZGUvdWFwaS9saW51eC9icGYuaFxcbkBAIC03NTc0LDYgKzc1NzQsMTAgQEAgc3RydWN0IGJwZl93cSB7XFxuIFxcdF9fdTY0IF9fb3BhcXVlWzJdO1xcbiB9IF9fYXR0cmlidXRlX18oKGFsaWduZWQoOCkpKTtcXG4gXFxuK3N0cnVjdCBicGZfdGhyZWFkX3dxIHtcXG4rXFx0X191NjQgX19vcGFxdWVbMl07XFxuK30gX19hdHRyaWJ1dGVfXygoYWxpZ25lZCg4KSkpO1xcbitcXG4gc3RydWN0IGJwZl9keW5wdHIge1xcbiBcXHRfX3U2NCBfX29wYXF1ZVsyXTtcXG4gfSBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDgpKSk7XFxuZGlmZiAtLWdpdCBhL2tlcm5lbC9icGYvYnRmLmMgYi9rZXJuZWwvYnBmL2J0Zi5jXFxuaW5kZXggNDI0MTQ2MzNjZjI2My4uYmY2ZmI1ZjUxZDIxYSAxMDA2NDRcXG4tLS0gYS9rZXJuZWwvYnBmL2J0Zi5jXFxuKysrIGIva2VybmVsL2JwZi9idGYuY1xcbkBAIC0zNjY1LDYgKzM2NjUsNyBAQCBzdGF0aWMgaW50IGJ0Zl9nZXRfZmllbGRfdHlwZShjb25zdCBzdHJ1Y3QgYnRmICpidGYsIGNvbnN0IHN0cnVjdCBidGZfdHlwZSAqdmFyX1xcbiBcXHRcXHR7IEJQRl9USU1FUiwgXFxcImJwZl90aW1lclxcXCIsIHRydWUgfSxcXG4gXFx0XFx0eyBCUEZfV09SS1FVRVVFLCBcXFwiYnBmX3dxXFxcIiwgdHJ1ZSB9LFxcbiBcXHRcXHR7IEJQRl9UQVNLX1dPUkssIFxcXCJicGZfdGFza193b3JrXFxcIiwgdHJ1ZSB9LFxcbitcXHRcXHR7IEJQRl9USFJFQURfV1EsIFxcXCJicGZfdGhyZWFkX3dxXFxcIiwgdHJ1ZSB9LFxcbiBcXHRcXHR7IEJQRl9MSVNUX0hFQUQsIFxcXCJicGZfbGlzdF9oZWFkXFxcIiwgZmFsc2UgfSxcXG4gXFx0XFx0eyBCUEZfTElTVF9OT0RFLCBcXFwiYnBmX2xpc3Rfbm9kZVxcXCIsIGZhbHNlIH0sXFxuIFxcdFxcdHsgQlBGX1JCX1JPT1QsIFxcXCJicGZfcmJfcm9vdFxcXCIsIGZhbHNlIH0sXFxuQEAgLTM4NTAsNiArMzg1MSw3IEBAIHN0YXRpYyBpbnQgYnRmX2ZpbmRfZmllbGRfb25lKGNvbnN0IHN0cnVjdCBidGYgKmJ0ZixcXG4gXFx0Y2FzZSBCUEZfUkJfTk9ERTpcXG4gXFx0Y2FzZSBCUEZfUkVGQ09VTlQ6XFxuIFxcdGNhc2UgQlBGX1RBU0tfV09SSzpcXG4rXFx0Y2FzZSBCUEZfVEhSRUFEX1dROlxcbiBcXHRcXHRyZXQgPSBidGZfZmluZF9zdHJ1Y3QoYnRmLCB2YXJfdHlwZSwgb2ZmLCBzeiwgZmllbGRfdHlwZSxcXG4gXFx0XFx0XFx0XFx0ICAgICAgaW5mb19jbnQgPyBcXHUwMDI2aW5mb1swXSA6IFxcdTAwMjZ0bXApO1xcbiBcXHRcXHRpZiAocmV0IFxcdTAwM2MgMClcXG5AQCAtNDE0NSw2ICs0MTQ3LDcgQEAgc3RydWN0IGJ0Zl9yZWNvcmQgKmJ0Zl9wYXJzZV9maWVsZHMoY29uc3Qgc3RydWN0IGJ0ZiAqYnRmLCBjb25zdCBzdHJ1Y3QgYnRmX3R5cGVcXG4gXFx0cmVjLVxcdTAwM2V3cV9vZmYgPSAtRUlOVkFMO1xcbiBcXHRyZWMtXFx1MDAzZXJlZmNvdW50X29mZiA9IC1FSU5WQUw7XFxuIFxcdHJlYy1cXHUwMDNldGFza193b3JrX29mZiA9IC1FSU5WQUw7XFxuK1xcdHJlYy1cXHUwMDNldGhyZWFkX3dxX29mZiA9IC1FSU5WQUw7XFxuIFxcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBjbnQ7IGkrKykge1xcbiBcXHRcXHRmaWVsZF90eXBlX3NpemUgPSBidGZfZmllbGRfdHlwZV9zaXplKGluZm9fYXJyW2ldLnR5cGUpO1xcbiBcXHRcXHRpZiAoaW5mb19hcnJbaV0ub2ZmICsgZmllbGRfdHlwZV9zaXplIFxcdTAwM2UgdmFsdWVfc2l6ZSkge1xcbkBAIC00MTg4LDYgKzQxOTEsMTAgQEAgc3RydWN0IGJ0Zl9yZWNvcmQgKmJ0Zl9wYXJzZV9maWVsZHMoY29uc3Qgc3RydWN0IGJ0ZiAqYnRmLCBjb25zdCBzdHJ1Y3QgYnRmX3R5cGVcXG4gXFx0XFx0XFx0V0FSTl9PTl9PTkNFKHJlYy1cXHUwMDNldGFza193b3JrX29mZiBcXHUwMDNlPSAwKTtcXG4gXFx0XFx0XFx0cmVjLVxcdTAwM2V0YXNrX3dvcmtfb2ZmID0gcmVjLVxcdTAwM2VmaWVsZHNbaV0ub2Zmc2V0O1xcbiBcXHRcXHRcXHRicmVhaztcXG4rXFx0XFx0Y2FzZSBCUEZfVEhSRUFEX1dROlxcbitcXHRcXHRcXHRXQVJOX09OX09OQ0UocmVjLVxcdTAwM2V0aHJlYWRfd3Ffb2ZmIFxcdTAwM2U9IDApO1xcbitcXHRcXHRcXHRyZWMtXFx1MDAzZXRocmVhZF93cV9vZmYgPSByZWMtXFx1MDAzZWZpZWxkc1tpXS5vZmZzZXQ7XFxuK1xcdFxcdFxcdGJyZWFrO1xcbiBcXHRcXHRjYXNlIEJQRl9SRUZDT1VOVDpcXG4gXFx0XFx0XFx0V0FSTl9PTl9PTkNFKHJlYy1cXHUwMDNlcmVmY291bnRfb2ZmIFxcdTAwM2U9IDApO1xcbiBcXHRcXHRcXHQvKiBDYWNoZSBvZmZzZXQgZm9yIGZhc3RlciBsb29rdXAgYXQgcnVudGltZSAqL1xcbmRpZmYgLS1naXQgYS9rZXJuZWwvYnBmL2hlbHBlcnMuYyBiL2tlcm5lbC9icGYvaGVscGVycy5jXFxuaW5kZXggNjM4OGI2YjIzZTQ5MC4uOGUwMWJhZDFiMTZhMCAxMDA2NDRcXG4tLS0gYS9rZXJuZWwvYnBmL2hlbHBlcnMuY1xcbisrKyBiL2tlcm5lbC9icGYvaGVscGVycy5jXFxuQEAgLTI5LDYgKzI5LDggQEBcXG4gI2luY2x1ZGUgXFx1MDAzY2xpbnV4L3Rhc2tfd29yay5oXFx1MDAzZVxcbiAjaW5jbHVkZSBcXHUwMDNjbGludXgvaXJxX3dvcmsuaFxcdTAwM2VcXG4gI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2J1aWxkaWQuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2t0aHJlYWQuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2poYXNoLmhcXHUwMDNlXFxuIFxcbiAjaW5jbHVkZSBcXFwiLi4vLi4vbGliL2tzdHJ0b3guaFxcXCJcXG4gXFxuQEAgLTExMTAsNiArMTExMiwxNyBAQCBzdGF0aWMgdm9pZCAqbWFwX2tleV9mcm9tX3ZhbHVlKHN0cnVjdCBicGZfbWFwICptYXAsIHZvaWQgKnZhbHVlLCB1MzIgKmFycl9pZHgpXFxuIFxcdHJldHVybiAodm9pZCAqKXZhbHVlIC0gcm91bmRfdXAobWFwLVxcdTAwM2VrZXlfc2l6ZSwgOCk7XFxuIH1cXG4gXFxuK3N0YXRpYyB1MzIgYnBmX21hcF9lbGVtX2lkX2Zyb21fdmFsdWUoc3RydWN0IGJwZl9tYXAgKm1hcCwgdm9pZCAqdmFsdWUpXFxuK3tcXG4rXFx0dTMyIGFycl9pZHg7XFxuK1xcdHZvaWQgKmtleTtcXG4rXFxuK1xcdGtleSA9IG1hcF9rZXlfZnJvbV92YWx1ZShtYXAsIHZhbHVlLCBcXHUwMDI2YXJyX2lkeCk7XFxuK1xcdGlmIChtYXAtXFx1MDAzZW1hcF90eXBlID09IEJQRl9NQVBfVFlQRV9BUlJBWSlcXG4rXFx0XFx0cmV0dXJuIGFycl9pZHg7XFxuK1xcdHJldHVybiBqaGFzaChrZXksIG1hcC1cXHUwMDNla2V5X3NpemUsIDApO1xcbit9XFxuK1xcbiBlbnVtIGJwZl9hc3luY190eXBlIHtcXG4gXFx0QlBGX0FTWU5DX1RZUEVfVElNRVIgPSAwLFxcbiBcXHRCUEZfQVNZTkNfVFlQRV9XUSxcXG5AQCAtNDc2OSw2ICs0NzgyLDM5NyBAQCBfX2JwZl9rZnVuYyBpbnQgYnBmX3RpbWVyX2NhbmNlbF9hc3luYyhzdHJ1Y3QgYnBmX3RpbWVyICp0aW1lcilcXG4gXFx0fVxcbiB9XFxuIFxcbisvKlxcbisgKiBCUEYgdGhyZWFkIHdvcmtxdWV1ZSAoa3RocmVhZF93b3JrZXIgYmFzZWQpIGltcGxlbWVudGF0aW9uXFxuKyAqXFxuKyAqIFdoeSBicGZfdGhyZWFkX3dxIGRvZXMgTk9UIHVzZSB0aGUgYnBmX2FzeW5jIGluZnJhc3RydWN0dXJlOlxcbisgKlxcbisgKiBicGZfdGltZXIgYW5kIGJwZl93cSBzaGFyZSBhIGNvbW1vbiBjbGVhbnVwIHBhdGggdmlhIGJwZl9hc3luYzpcXG4rICpcXG4rICogICBicGZfYXN5bmNfY2FuY2VsX2FuZF9mcmVlKClcXG4rICogICAgIC1cXHUwMDNlIGJwZl9hc3luY19zY2hlZHVsZV9vcCgpXFxuKyAqICAgICAgIC1cXHUwMDNlIGlycV93b3JrX3F1ZXVlKCkgICAgICAgICAgICAgICAgLy8gc2NoZWR1bGUgZnJvbSBhbnkgY29udGV4dFxcbisgKiAgICAgICAgIC1cXHUwMDNlIGJwZl9hc3luY19wcm9jZXNzX29wKCkgICAgICAgIC8vIHJ1bnMgaW4gaGFyZGlycSBjb250ZXh0XFxuKyAqICAgICAgICAgICAtXFx1MDAzZSBicGZfd3Ffd29yaygpIC8gdGltZXIgY2IgICAgLy8gYXRvbWljLCBub24tc2xlZXBhYmxlXFxuKyAqXFxuKyAqIFRoaXMgd29ya3MgZm9yIHRpbWVyIGFuZCB3b3JrcXVldWUgYmVjYXVzZSB0aGVpciBjYWxsYmFja3MgYW5kXFxuKyAqIGNhbmNlbGxhdGlvbiAoaHJ0aW1lcl9jYW5jZWwgLyBicGZfd3FfY2FuY2VsX2FuZF9mcmVlKSBjb21wbGV0ZVxcbisgKiBzeW5jaHJvbm91c2x5IGFuZCBuZWVkIG5vdCBzbGVlcC4gIFRoZSBoYXJkaXJxIGNvbnRleHQgaXMgc3VmZmljaWVudC5cXG4rICpcXG4rICogYnBmX3RocmVhZF93cSBpcyBkaWZmZXJlbnQ6IGNhbmNlbGxhdGlvbiBhbmQgZmluYWwgY2xlYW51cCBtYXkgbmVlZCB0b1xcbisgKiBzbGVlcDpcXG4rICpcXG4rICogICBrdGhyZWFkX2NhbmNlbF93b3JrX3N5bmMoKSAgICAtIHdhaXRzIGZvciB0aGUgd29yayB0byBmaW5pc2gsIGNhblxcbisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjaGVkdWxlIG91dCBpZiB0aGUgd29yayBpcyBydW5uaW5nLlxcbisgKiAgIGt0aHJlYWRfZGVzdHJveV93b3JrZXIoKSAgICAgIC0gc3RvcHMgdGhlIGt0aHJlYWQsIGludGVybmFsbHlcXG4rICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZXMgd2l0aCBrdGhyZWFkIGV4aXQuXFxuKyAqICAgY2dyb3VwX3B1dCgpIChmaW5hbCBwdXQpICAgICAgLSBtYXkgYWNxdWlyZSBjZ3JvdXBfbXV0ZXggYW5kIG90aGVyXFxuKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xlZXBpbmcgbG9ja3MgZHVyaW5nIG9mZmxpbmUuXFxuKyAqXFxuKyAqIE5vbmUgb2YgdGhlc2UgY2FuIGJlIGNhbGxlZCBmcm9tIGhhcmRpcnEgY29udGV4dCAoaXJxX3dvcmspLiBEb2luZyBzb1xcbisgKiB3b3VsZCB0cmlnZ2VyIG1pZ2h0X3NsZWVwKCkgd2FybmluZ3Mgb3IgZGVhZGxvY2suXFxuKyAqXFxuKyAqIFRoZXJlZm9yZSBicGZfdGhyZWFkX3dxIGltcGxlbWVudHMgaXRzIG93biBSQ1UtYmFzZWQgY2xlYW51cDpcXG4rICpcXG4rICogICBicGZfdGhyZWFkX3dxX2NhbmNlbF9hbmRfZnJlZSgpICAgICAgICAvLyBzbGVlcGFibGUgKGNhbGxlZCBmcm9tXFxuKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWFwIGZyZWUgLyBlbGVtIGRlbGV0ZSlcXG4rICogICAgIC1cXHUwMDNlIHhjaGcoY3R4LCBOVUxMKSAgICAgICAgICAgICAgICAgICAvLyBkZXRhY2ggYXRvbWljYWxseVxcbisgKiAgICAgLVxcdTAwM2Uga3RocmVhZF9jYW5jZWxfd29ya19zeW5jKCkgICAgICAgIC8vIG9rIHRvIHNsZWVwXFxuKyAqICAgICAtXFx1MDAzZSBicGZfdGhyZWFkX3dxX2N0eF9wdXQoKVxcbisgKiAgICAgICAtXFx1MDAzZSBjYWxsX3JjdV90YXNrc190cmFjZSgpICAgICAgICAgIC8vIHdhaXQgZm9yIEJQRiBjYWxsYmFja3NcXG4rICogICAgICAgICAtXFx1MDAzZSBzY2hlZHVsZV93b3JrKCkgICAgICAgICAgICAgICAvLyBzd2l0Y2ggdG8gc2xlZXBhYmxlIGNvbnRleHRcXG4rICogICAgICAgICAgIC1cXHUwMDNlIGJwZl90aHJlYWRfd3FfZGVzdHJveV93b3JrX2ZuKClcXG4rICogICAgICAgICAgICAgLVxcdTAwM2UgYnBmX3Byb2dfcHV0KClcXG4rICogICAgICAgICAgICAgLVxcdTAwM2UgY2dyb3VwX3B1dCgpXFxuKyAqICAgICAgICAgICAgIC1cXHUwMDNlIGt0aHJlYWRfZGVzdHJveV93b3JrZXIoKVxcbisgKiAgICAgICAgICAgICAtXFx1MDAzZSBrZnJlZShjdHgpXFxuKyAqXFxuKyAqIFRoZSBzYW1lIGRlc2lnbiBjaG9pY2Ugd2FzIG1hZGUgZm9yIGJwZl90YXNrX3dvcmssIHdoaWNoIGFsc28gYXZvaWRzXFxuKyAqIGJwZl9hc3luYyBiZWNhdXNlIHRhc2tfd29yayBjYW5jZWxsYXRpb24gc3luY2hyb25pemVzIHdpdGggdGhlIHRhc2tcXG4rICogYW5kIG1heSBzbGVlcC5cXG4rICovXFxuK1xcbitzdHJ1Y3QgYnBmX3RocmVhZF93cV9jdHgge1xcbitcXHRzdHJ1Y3Qga3RocmVhZF93b3JrZXIgKndvcmtlcjtcXG4rXFx0c3RydWN0IGt0aHJlYWRfd29yayB3b3JrO1xcbitcXHRzdHJ1Y3QgYnBmX3Byb2cgKnByb2c7XFxuK1xcdGJwZl9jYWxsYmFja190IGNhbGxiYWNrX2ZuO1xcbitcXHRzdHJ1Y3QgYnBmX21hcCAqbWFwO1xcbitcXHR2b2lkICp2YWx1ZTtcXG4rXFx0c3RydWN0IGNncm91cCAqY2dycDtcXG4rXFx0cmVmY291bnRfdCByZWZjbnQ7XFxuK1xcdHN0cnVjdCByY3VfaGVhZCByY3U7XFxuK1xcdHN0cnVjdCB3b3JrX3N0cnVjdCBkZXN0cm95X3dvcms7XFxuK307XFxuK1xcbisvKiBLZXJuZWwtaW50ZXJuYWwgcmVwcmVzZW50YXRpb24gdGhhdCBmaXRzIGluIHN0cnVjdCBicGZfdGhyZWFkX3dxICovXFxuK3N0cnVjdCBicGZfdGhyZWFkX3dxX2tlcm4ge1xcbitcXHRzdHJ1Y3QgYnBmX3RocmVhZF93cV9jdHggKmN0eDtcXG4rfSBfX2FsaWduZWQoOCk7XFxuK1xcbitzdGF0aWMgdm9pZCBicGZfdGhyZWFkX3dxX2Rlc3Ryb3lfd29ya19mbihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspXFxuK3tcXG4rXFx0c3RydWN0IGJwZl90aHJlYWRfd3FfY3R4ICpjdHggPSBjb250YWluZXJfb2Yod29yayxcXG4rXFx0XFx0XFx0XFx0XFx0XFx0ICAgICBzdHJ1Y3QgYnBmX3RocmVhZF93cV9jdHgsXFxuK1xcdFxcdFxcdFxcdFxcdFxcdCAgICAgZGVzdHJveV93b3JrKTtcXG4rXFxuK1xcdGlmIChjdHgtXFx1MDAzZXByb2cpXFxuK1xcdFxcdGJwZl9wcm9nX3B1dChjdHgtXFx1MDAzZXByb2cpO1xcbitcXHRpZiAoY3R4LVxcdTAwM2VjZ3JwKVxcbitcXHRcXHRjZ3JvdXBfcHV0KGN0eC1cXHUwMDNlY2dycCk7XFxuK1xcdGlmIChjdHgtXFx1MDAzZXdvcmtlcilcXG4rXFx0XFx0a3RocmVhZF9kZXN0cm95X3dvcmtlcihjdHgtXFx1MDAzZXdvcmtlcik7XFxuK1xcdGtmcmVlKGN0eCk7XFxuK31cXG4rXFxuK3N0YXRpYyB2b2lkIGJwZl90aHJlYWRfd3FfY3R4X2ZyZWVfcmN1KHN0cnVjdCByY3VfaGVhZCAqcmN1KVxcbit7XFxuK1xcdHN0cnVjdCBicGZfdGhyZWFkX3dxX2N0eCAqY3R4ID0gY29udGFpbmVyX29mKHJjdSxcXG4rXFx0XFx0XFx0XFx0XFx0XFx0ICAgICBzdHJ1Y3QgYnBmX3RocmVhZF93cV9jdHgsXFxuK1xcdFxcdFxcdFxcdFxcdFxcdCAgICAgcmN1KTtcXG4rXFxuK1xcdElOSVRfV09SSyhcXHUwMDI2Y3R4LVxcdTAwM2VkZXN0cm95X3dvcmssIGJwZl90aHJlYWRfd3FfZGVzdHJveV93b3JrX2ZuKTtcXG4rXFx0c2NoZWR1bGVfd29yayhcXHUwMDI2Y3R4LVxcdTAwM2VkZXN0cm95X3dvcmspO1xcbit9XFxuK1xcbitzdGF0aWMgdm9pZCBicGZfdGhyZWFkX3dxX2N0eF9wdXQoc3RydWN0IGJwZl90aHJlYWRfd3FfY3R4ICpjdHgpXFxuK3tcXG4rXFx0aWYgKCFyZWZjb3VudF9kZWNfYW5kX3Rlc3QoXFx1MDAyNmN0eC1cXHUwMDNlcmVmY250KSlcXG4rXFx0XFx0cmV0dXJuO1xcbitcXHRjYWxsX3JjdV90YXNrc190cmFjZShcXHUwMDI2Y3R4LVxcdTAwM2VyY3UsIGJwZl90aHJlYWRfd3FfY3R4X2ZyZWVfcmN1KTtcXG4rfVxcbitcXG4rc3RhdGljIHZvaWQgYnBmX3RocmVhZF93cV93b3JrX2ZuKHN0cnVjdCBrdGhyZWFkX3dvcmsgKndvcmspXFxuK3tcXG4rXFx0c3RydWN0IGJwZl90aHJlYWRfd3FfY3R4ICpjdHggPSBjb250YWluZXJfb2Yod29yayxcXG4rXFx0XFx0XFx0XFx0XFx0XFx0ICAgICBzdHJ1Y3QgYnBmX3RocmVhZF93cV9jdHgsXFxuK1xcdFxcdFxcdFxcdFxcdFxcdCAgICAgd29yayk7XFxuK1xcdGJwZl9jYWxsYmFja190IGNhbGxiYWNrX2ZuO1xcbitcXHR2b2lkICp2YWx1ZSA9IGN0eC1cXHUwMDNldmFsdWU7XFxuK1xcdHN0cnVjdCBicGZfbWFwICptYXAgPSBjdHgtXFx1MDAzZW1hcDtcXG4rXFx0dm9pZCAqa2V5O1xcbitcXHR1MzIgaWR4O1xcbitcXG4rXFx0QlRGX1RZUEVfRU1JVChzdHJ1Y3QgYnBmX3RocmVhZF93cSk7XFxuK1xcbitcXHRjYWxsYmFja19mbiA9IFJFQURfT05DRShjdHgtXFx1MDAzZWNhbGxiYWNrX2ZuKTtcXG4rXFx0aWYgKCFjYWxsYmFja19mbilcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcdGtleSA9IG1hcF9rZXlfZnJvbV92YWx1ZShtYXAsIHZhbHVlLCBcXHUwMDI2aWR4KTtcXG4rXFxuK1xcdHJjdV9yZWFkX2xvY2tfdHJhY2UoKTtcXG4rXFx0bWlncmF0ZV9kaXNhYmxlKCk7XFxuK1xcbitcXHRjYWxsYmFja19mbiA9IFJFQURfT05DRShjdHgtXFx1MDAzZWNhbGxiYWNrX2ZuKTtcXG4rXFx0aWYgKGNhbGxiYWNrX2ZuKVxcbitcXHRcXHRjYWxsYmFja19mbigodTY0KShsb25nKW1hcCwgKHU2NCkobG9uZylrZXksICh1NjQpKGxvbmcpdmFsdWUsXFxuK1xcdFxcdFxcdCAgICAwLCAwKTtcXG4rXFxuK1xcdG1pZ3JhdGVfZW5hYmxlKCk7XFxuK1xcdHJjdV9yZWFkX3VubG9ja190cmFjZSgpO1xcbitcXG4rb3V0OlxcbitcXHRicGZfdGhyZWFkX3dxX2N0eF9wdXQoY3R4KTtcXG4rfVxcbitcXG4rLypcXG4rICogYnBmX3RocmVhZF93cV9pbml0KCkgY3JlYXRlcyBhIGt0aHJlYWQgd29ya2VyIGFuZCBtYXkgYXR0YWNoIGl0IHRvIGEgY2dyb3VwLlxcbisgKiBUaGUgaGVscGVycyB1c2VkIGhlcmUgY2FuIHNsZWVwIGFuZCBhY3F1aXJlIHNldmVyYWwgbG9ja3MgdGhyb3VnaCBrdGhyZWFkXFxuKyAqIGNyZWF0aW9uL2Rlc3RydWN0aW9uLCBjZ3JvdXAgbG9va3VwIGFuZCBjZ3JvdXAga3RocmVhZCBhdHRhY2htZW50LiBLZWVwIHRoaXNcXG4rICoga2Z1bmMgYXZhaWxhYmxlIG9ubHkgdG8gQlBGX1BST0dfVFlQRV9TWVNDQUxMIHByb2dyYW1zIHNvIGl0IGlzIG5vdCBpbnZva2VkXFxuKyAqIGZyb20gQlBGIHByb2dyYW0gY29udGV4dHMgdGhhdCBhbHJlYWR5IGhvbGQgbG9ja3Mgd2hpY2ggY291bGQgZGVhZGxvY2sgd2l0aFxcbisgKiB0aG9zZSBwYXRocy5cXG4rICovXFxuK19fYnBmX2tmdW5jIGludCBicGZfdGhyZWFkX3dxX2luaXQoc3RydWN0IGJwZl90aHJlYWRfd3EgKnR3cSwgdm9pZCAqcF9fbWFwLFxcbitcXHRcXHRcXHRcXHQgICB1NjQgY2dyb3VwX2lkLCB1bnNpZ25lZCBpbnQgZmxhZ3MpXFxuK3tcXG4rXFx0c3RydWN0IGJwZl90aHJlYWRfd3Ffa2VybiAqdHdrID0gKHN0cnVjdCBicGZfdGhyZWFkX3dxX2tlcm4gKil0d3E7XFxuK1xcdHN0cnVjdCBicGZfbWFwICptYXAgPSBwX19tYXA7XFxuK1xcdHN0cnVjdCBicGZfdGhyZWFkX3dxX2N0eCAqY3R4LCAqb2xkX2N0eDtcXG4rXFx0c3RydWN0IGt0aHJlYWRfd29ya2VyICp3b3JrZXI7XFxuK1xcdHN0cnVjdCBjZ3JvdXAgKmNncnAgPSBOVUxMO1xcbitcXHR2b2lkICp2YWx1ZTtcXG4rXFx0dTMyIGVsZW1faWQ7XFxuK1xcdGludCBlcnI7XFxuK1xcbitcXHRCVUlMRF9CVUdfT04oc2l6ZW9mKHN0cnVjdCBicGZfdGhyZWFkX3dxX2tlcm4pXFxuK1xcdFxcdFxcdFxcdTAwM2Ugc2l6ZW9mKHN0cnVjdCBicGZfdGhyZWFkX3dxKSk7XFxuK1xcdEJVSUxEX0JVR19PTihfX2FsaWdub2ZfXyhzdHJ1Y3QgYnBmX3RocmVhZF93cV9rZXJuKVxcbitcXHRcXHRcXHQhPSBfX2FsaWdub2ZfXyhzdHJ1Y3QgYnBmX3RocmVhZF93cSkpO1xcbitcXG4rXFx0aWYgKGZsYWdzKVxcbitcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG4rXFxuK1xcdG9sZF9jdHggPSBSRUFEX09OQ0UodHdrLVxcdTAwM2VjdHgpO1xcbitcXHRpZiAob2xkX2N0eClcXG4rXFx0XFx0cmV0dXJuIC1FQlVTWTtcXG4rXFxuK1xcdHZhbHVlID0gKHZvaWQgKil0d3EgLSBtYXAtXFx1MDAzZXJlY29yZC1cXHUwMDNldGhyZWFkX3dxX29mZjtcXG4rXFx0ZWxlbV9pZCA9IGJwZl9tYXBfZWxlbV9pZF9mcm9tX3ZhbHVlKG1hcCwgdmFsdWUpO1xcbitcXHR3b3JrZXIgPSBrdGhyZWFkX3J1bl93b3JrZXIoMCwgXFxcImJwZl90d3EvJWQvJXhcXFwiLCBtYXAtXFx1MDAzZWlkLCBlbGVtX2lkKTtcXG4rXFx0aWYgKElTX0VSUih3b3JrZXIpKVxcbitcXHRcXHRyZXR1cm4gUFRSX0VSUih3b3JrZXIpO1xcbitcXG4rXFx0LyogU2V0dXAgY3R4LiAqL1xcbitcXHRjdHggPSBicGZfbWFwX2ttYWxsb2Nfbm9sb2NrKG1hcCwgc2l6ZW9mKCpjdHgpLCBHRlBfS0VSTkVMLFxcbitcXHRcXHRcXHRcXHQgICAgIG1hcC1cXHUwMDNlbnVtYV9ub2RlKTtcXG4rXFx0aWYgKCFjdHgpIHtcXG4rXFx0XFx0ZXJyID0gLUVOT01FTTtcXG4rXFx0XFx0Z290byBkZXN0cm95X3dvcmtlcjtcXG4rXFx0fVxcbitcXHRtZW1zZXQoY3R4LCAwLCBzaXplb2YoKmN0eCkpO1xcbitcXHRjdHgtXFx1MDAzZXdvcmtlciA9IHdvcmtlcjtcXG4rXFx0Y3R4LVxcdTAwM2VtYXAgPSBtYXA7XFxuK1xcdGN0eC1cXHUwMDNldmFsdWUgPSB2YWx1ZTtcXG4rXFx0cmVmY291bnRfc2V0KFxcdTAwMjZjdHgtXFx1MDAzZXJlZmNudCwgMSk7XFxuK1xcdGt0aHJlYWRfaW5pdF93b3JrKFxcdTAwMjZjdHgtXFx1MDAzZXdvcmssIGJwZl90aHJlYWRfd3Ffd29ya19mbik7XFxuK1xcbitcXHRpZiAoY2dyb3VwX2lkKSB7XFxuKyNpZmRlZiBDT05GSUdfQ0dST1VQU1xcbitcXHRcXHRjZ3JwID0gY2dyb3VwX2dldF9mcm9tX2lkKGNncm91cF9pZCk7XFxuK1xcdFxcdGlmIChJU19FUlIoY2dycCkpIHtcXG4rXFx0XFx0XFx0ZXJyID0gUFRSX0VSUihjZ3JwKTtcXG4rXFx0XFx0XFx0Z290byBrZnJlZV9jdHg7XFxuK1xcdFxcdH1cXG4rXFx0XFx0Y3R4LVxcdTAwM2VjZ3JwID0gY2dycDtcXG4rXFxuK1xcdFxcdC8qXFxuK1xcdFxcdCAqIGt0aHJlYWRfcnVuX3dvcmtlcigpIHdha2VzIHRoZSBrdGhyZWFkLCBidXQgaXQgbWF5IG5vdCBoYXZlXFxuK1xcdFxcdCAqIGV4ZWN1dGVkIGNncm91cF9rdGhyZWFkX3JlYWR5KCkgeWV0LCB3aGljaCBjbGVhcnNcXG4rXFx0XFx0ICogbm9fY2dyb3VwX21pZ3JhdGlvbi5cXG4rXFx0XFx0ICogRG8gYSBxdWV1ZSB3b3JrIGFuZCBmbHVzaCB0byB3YWl0IHRoZSBrdGhyZWFkIHJ1bi5cXG4rXFx0XFx0ICovXFxuK1xcdFxcdHJlZmNvdW50X2luYyhcXHUwMDI2Y3R4LVxcdTAwM2VyZWZjbnQpO1xcbitcXHRcXHRpZiAoIWt0aHJlYWRfcXVldWVfd29yayhjdHgtXFx1MDAzZXdvcmtlciwgXFx1MDAyNmN0eC1cXHUwMDNld29yaykpIHtcXG4rXFx0XFx0XFx0cmVmY291bnRfZGVjKFxcdTAwMjZjdHgtXFx1MDAzZXJlZmNudCk7XFxuK1xcdFxcdFxcdGVyciA9IC1FQlVTWTtcXG4rXFx0XFx0XFx0Z290byBjZ3JvdXBfcHV0O1xcbitcXHRcXHR9XFxuK1xcdFxcdGt0aHJlYWRfZmx1c2hfd29yayhcXHUwMDI2Y3R4LVxcdTAwM2V3b3JrKTtcXG4rXFxuK1xcdFxcdGlmICh3b3JrZXItXFx1MDAzZXRhc2stXFx1MDAzZW5vX2Nncm91cF9taWdyYXRpb24pIHtcXG4rXFx0XFx0XFx0ZXJyID0gLUVBR0FJTjtcXG4rXFx0XFx0XFx0Z290byBjZ3JvdXBfcHV0O1xcbitcXHRcXHR9XFxuK1xcbitcXHRcXHRlcnIgPSBjZ3JvdXBfa3RocmVhZF9hdHRhY2goY2dycCwgd29ya2VyLVxcdTAwM2V0YXNrKTtcXG4rXFx0XFx0aWYgKGVycilcXG4rXFx0XFx0XFx0Z290byBjZ3JvdXBfcHV0O1xcbisjZWxzZVxcbitcXHRcXHRlcnIgPSAtRU9QTk9UU1VQUDtcXG4rXFx0XFx0Z290byBrZnJlZV9jdHg7XFxuKyNlbmRpZlxcbitcXHR9XFxuK1xcbitcXHRvbGRfY3R4ID0gY21weGNoZyhcXHUwMDI2dHdrLVxcdTAwM2VjdHgsIE5VTEwsIGN0eCk7XFxuK1xcdGlmIChvbGRfY3R4KSB7XFxuK1xcdFxcdGVyciA9IC1FQlVTWTtcXG4rXFx0XFx0Z290byBjZ3JvdXBfcHV0O1xcbitcXHR9XFxuK1xcbitcXHQvKlxcbitcXHQgKiBQYWlyZWQgd2l0aCB0aGUgbWFwIGRlc3RydWN0aW9uIHBhdGguICBFbnN1cmVzIHRoYXQgY3R4IGlzIGdsb2JhbGx5XFxuK1xcdCAqIHZpc2libGUgYmVmb3JlIHdlIGNoZWNrIG1hcC1cXHUwMDNldXNlcmNudC5cXG4rXFx0ICogSWYgdXNlcmNudCBoYXMgZHJvcHBlZCB0byB6ZXJvLCB0aGUgZGVzdHJ1Y3Rpb24gcGF0aCB3aWxsIGVpdGhlciBzZWVcXG4rXFx0ICogdGhlIGN0eCAoYW5kIGNhbmNlbCBpdCkgb3Igd2Ugc2VlIHVzZXJjbnQgPT0gMCBoZXJlIGFuZCBjYW5jZWxcXG4rXFx0ICogb3Vyc2VsdmVzLlxcbitcXHQgKiBXaXRob3V0IHRoaXMgYmFycmllciwgYSBDUFUgY291bGQgcmVvcmRlciB0aGUgbG9hZCBvZiB1c2VyY250IGJlZm9yZVxcbitcXHQgKiB0aGUgY21weGNoZyBzdG9yZSBiZWNvbWVzIHZpc2libGUsIGJyZWFraW5nIHRoZSBtdXR1YWwgZXhjbHVzaW9uXFxuK1xcdCAqIGd1YXJhbnRlZS5cXG4rXFx0ICovXFxuK1xcdHNtcF9tYigpO1xcbitcXG4rXFx0aWYgKCFhdG9taWM2NF9yZWFkKFxcdTAwMjZtYXAtXFx1MDAzZXVzZXJjbnQpKSB7XFxuK1xcdFxcdGJwZl90aHJlYWRfd3FfY2FuY2VsX2FuZF9mcmVlKHR3cSk7XFxuK1xcdFxcdHJldHVybiAtRVBFUk07XFxuK1xcdH1cXG4rXFxuK1xcdHJldHVybiAwO1xcbitcXG4rY2dyb3VwX3B1dDpcXG4rI2lmZGVmIENPTkZJR19DR1JPVVBTXFxuK1xcdGlmIChjZ3JwKVxcbitcXHRcXHRjZ3JvdXBfcHV0KGNncnApO1xcbisjZW5kaWZcXG4ra2ZyZWVfY3R4OlxcbitcXHQvKlxcbitcXHQgKiBOb3QgdXNlIGJwZl90aHJlYWRfd3FfY3R4X3B1dCBiZWNhdXNlIGN0eCBoYXMgbm90IHlldCBlbnRlcmVkXFxuK1xcdCAqIHRoZSBydW5uaW5nIHN0YXRlLlxcbitcXHQgKi9cXG4rXFx0a2ZyZWUoY3R4KTtcXG4rZGVzdHJveV93b3JrZXI6XFxuK1xcdGt0aHJlYWRfZGVzdHJveV93b3JrZXIod29ya2VyKTtcXG4rXFx0cmV0dXJuIGVycjtcXG4rfVxcbitcXG4rX19icGZfa2Z1bmMgaW50IGJwZl90aHJlYWRfd3Ffc2V0X2NhbGxiYWNrKHN0cnVjdCBicGZfdGhyZWFkX3dxICp0d3EsXFxuK1xcdFxcdFxcdFxcdFxcdCAgIGludCAoY2FsbGJhY2tfZm4pKHZvaWQgKm1hcCxcXG4rXFx0XFx0XFx0XFx0XFx0XFx0XFx0ICAgICBpbnQgKmtleSxcXG4rXFx0XFx0XFx0XFx0XFx0XFx0XFx0ICAgICB2b2lkICp2YWx1ZSksXFxuK1xcdFxcdFxcdFxcdFxcdCAgIHVuc2lnbmVkIGludCBmbGFncyxcXG4rXFx0XFx0XFx0XFx0XFx0ICAgc3RydWN0IGJwZl9wcm9nX2F1eCAqYXV4KVxcbit7XFxuK1xcdHN0cnVjdCBicGZfdGhyZWFkX3dxX2tlcm4gKnR3ayA9IChzdHJ1Y3QgYnBmX3RocmVhZF93cV9rZXJuICopdHdxO1xcbitcXHRzdHJ1Y3QgYnBmX3RocmVhZF93cV9jdHggKmN0eDtcXG4rXFx0c3RydWN0IGJwZl9wcm9nICpwcm9nO1xcbitcXG4rXFx0aWYgKGZsYWdzKVxcbitcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG4rXFxuK1xcdGN0eCA9IFJFQURfT05DRSh0d2stXFx1MDAzZWN0eCk7XFxuK1xcdGlmICghY3R4KVxcbitcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG4rXFxuK1xcdHByb2cgPSBicGZfcHJvZ19pbmNfbm90X3plcm8oYXV4LVxcdTAwM2Vwcm9nKTtcXG4rXFx0aWYgKElTX0VSUihwcm9nKSlcXG4rXFx0XFx0cmV0dXJuIFBUUl9FUlIocHJvZyk7XFxuK1xcbitcXHQvKlxcbitcXHQgKiBBbGxvdyBzZXRfY2FsbGJhY2sgb25seSBvbmNlIHRvIHByZXZlbnQgVUFGOiBhIGNvbmN1cnJlbnRcXG4rXFx0ICogc2V0X2NhbGxiYWNrIGNvdWxkIGJwZl9wcm9nX3B1dCgpIHRoZSBwcm9nIHdoaWxlIHRoZSB3b3JrZXJcXG4rXFx0ICoga3RocmVhZCBpcyBzdGlsbCBleGVjdXRpbmcgaXRzIGNhbGxiYWNrLlxcbitcXHQgKi9cXG4rXFx0aWYgKGNtcHhjaGcoXFx1MDAyNmN0eC1cXHUwMDNlcHJvZywgTlVMTCwgcHJvZykgIT0gTlVMTCkge1xcbitcXHRcXHRicGZfcHJvZ19wdXQocHJvZyk7XFxuK1xcdFxcdHJldHVybiAtRUJVU1k7XFxuK1xcdH1cXG4rXFx0LypcXG4rXFx0ICogU2FmZSB0byBzZXQgY2FsbGJhY2tfZm4gYWZ0ZXIgcHJvZzogYnBmX3RocmVhZF93cV9zdGFydCgpIGFuZFxcbitcXHQgKiBicGZfdGhyZWFkX3dxX3dvcmtfZm4oKSBib3RoIGNoZWNrIGNhbGxiYWNrX2ZuIHdpdGggUkVBRF9PTkNFKClcXG4rXFx0ICogYW5kIGJhaWwgb3V0IGlmIGl0IGlzIHN0aWxsIE5VTEwuXFxuK1xcdCAqL1xcbitcXHRXUklURV9PTkNFKGN0eC1cXHUwMDNlY2FsbGJhY2tfZm4sICh2b2lkICopY2FsbGJhY2tfZm4pO1xcbitcXG4rXFx0cmV0dXJuIDA7XFxuK31cXG4rXFxuK19fYnBmX2tmdW5jIGludFxcbiticGZfdGhyZWFkX3dxX3N0YXJ0KHN0cnVjdCBicGZfdGhyZWFkX3dxICp0d3EsIHVuc2lnbmVkIGludCBmbGFncylcXG4re1xcbitcXHRzdHJ1Y3QgYnBmX3RocmVhZF93cV9rZXJuICp0d2sgPSAoc3RydWN0IGJwZl90aHJlYWRfd3Ffa2VybiAqKXR3cTtcXG4rXFx0c3RydWN0IGJwZl90aHJlYWRfd3FfY3R4ICpjdHg7XFxuK1xcdGludCBlcnI7XFxuK1xcbitcXHRpZiAoZmxhZ3MpXFxuK1xcdFxcdHJldHVybiAtRUlOVkFMO1xcbitcXG4rXFx0cmN1X3JlYWRfbG9ja190cmFjZSgpO1xcbitcXG4rXFx0ZXJyID0gMDtcXG4rXFxuK1xcdGN0eCA9IFJFQURfT05DRSh0d2stXFx1MDAzZWN0eCk7XFxuK1xcdGlmICghY3R4IHx8ICFSRUFEX09OQ0UoY3R4LVxcdTAwM2VjYWxsYmFja19mbikpIHtcXG4rXFx0XFx0ZXJyID0gLUVJTlZBTDtcXG4rXFx0XFx0Z290byB1bmxvY2s7XFxuK1xcdH1cXG4rXFxuK1xcdGlmICghcmVmY291bnRfaW5jX25vdF96ZXJvKFxcdTAwMjZjdHgtXFx1MDAzZXJlZmNudCkpXFxuK1xcdFxcdGVyciA9IC1FTk9FTlQ7XFxuK1xcbit1bmxvY2s6XFxuK1xcdHJjdV9yZWFkX3VubG9ja190cmFjZSgpO1xcbitcXHRpZiAoZXJyKVxcbitcXHRcXHRyZXR1cm4gZXJyO1xcbitcXG4rXFx0aWYgKCFrdGhyZWFkX3F1ZXVlX3dvcmsoY3R4LVxcdTAwM2V3b3JrZXIsIFxcdTAwMjZjdHgtXFx1MDAzZXdvcmspKSB7XFxuK1xcdFxcdGJwZl90aHJlYWRfd3FfY3R4X3B1dChjdHgpO1xcbitcXHRcXHRyZXR1cm4gLUVCVVNZO1xcbitcXHR9XFxuK1xcbitcXHRyZXR1cm4gMDtcXG4rfVxcbitcXG4rdm9pZCBicGZfdGhyZWFkX3dxX2NhbmNlbF9hbmRfZnJlZSh2b2lkICp2YWwpXFxuK3tcXG4rXFx0c3RydWN0IGJwZl90aHJlYWRfd3Ffa2VybiAqdHdrID0gdmFsO1xcbitcXHRzdHJ1Y3QgYnBmX3RocmVhZF93cV9jdHggKmN0eDtcXG4rXFxuK1xcdGN0eCA9IHhjaGcoXFx1MDAyNnR3ay1cXHUwMDNlY3R4LCBOVUxMKTtcXG4rXFx0aWYgKCFjdHgpXFxuK1xcdFxcdHJldHVybjtcXG4rXFxuK1xcdG1pZ2h0X3NsZWVwKCk7XFxuK1xcbitcXHQvKlxcbitcXHQgKiBQcmV2ZW50IGZ1dHVyZSBjYWxsYmFja3MgZnJvbSBydW5uaW5nIGFuZCB3YWl0IGZvciBhbnlcXG4rXFx0ICogaW4tcHJvZ3Jlc3MgZXhlY3V0aW9uIHRvIGZpbmlzaC5cXG4rXFx0ICovXFxuK1xcdFdSSVRFX09OQ0UoY3R4LVxcdTAwM2VjYWxsYmFja19mbiwgTlVMTCk7XFxuK1xcdC8qXFxuK1xcdCAqIGt0aHJlYWRfY2FuY2VsX3dvcmtfc3luYygpIHJldHVybnMgdHJ1ZSB3aGVuIGl0IGRlcXVldWVzIGEgcGVuZGluZ1xcbitcXHQgKiB3b3JrIGl0ZW0gZnJvbSB0aGUgd29ya19saXN0IHdpdGhvdXQgZXhlY3V0aW5nIGl0LiAgRWFjaCBzdWNjZXNzZnVsXFxuK1xcdCAqIGJwZl90aHJlYWRfd3Ffc3RhcnQoKSBjYWxsIGluY3JlbWVudHMgY3R4LVxcdTAwM2VyZWZjbnQgYW5kIHJlbGllcyBvbiB0aGVcXG4rXFx0ICogc3Vic2VxdWVudCBicGZfdGhyZWFkX3dxX3dvcmtfZm4oKSBleGVjdXRpb24gdG8gcmVsZWFzZSB0aGF0XFxuK1xcdCAqIHJlZmVyZW5jZSB2aWEgYnBmX3RocmVhZF93cV9jdHhfcHV0KCkuICBJZiB0aGUgd29yayB3YXMgcGVuZGluZyBhbmRcXG4rXFx0ICogZ290IGNhbmNlbGxlZCBoZXJlLCB3b3JrX2ZuIHdpbGwgbmV2ZXIgcnVuIGZvciB0aGF0IHF1ZXVlZCBpbnN0YW5jZSxcXG4rXFx0ICogc28gd2UgbXVzdCBkcm9wIHRoZSByZWZlcmVuY2Ugb3Vyc2VsdmVzIHRvIGF2b2lkIGEgcGVybWFuZW50IHJlZmNvdW50XFxuK1xcdCAqIGxlYWsuXFxuK1xcdCAqXFxuK1xcdCAqIFRoaXMgY292ZXJzIHR3byBzY2VuYXJpb3MgdW5pZm9ybWx5OlxcbitcXHQgKiAgMS4gVGhlIHdvcmsgaXMgcHVyZWx5IHBlbmRpbmcgKG5vdCBjdXJyZW50bHkgZXhlY3V0aW5nKSAtIGUuZy4gYVxcbitcXHQgKiAgICAgbm9ybWFsIGJwZl90aHJlYWRfd3Ffc3RhcnQoKSBjYWxsIHF1ZXVlZCBpdCBidXQgdGhlIHdvcmtlclxcbitcXHQgKiAgICAgdGhyZWFkIGhhc24ndCBwaWNrZWQgaXQgdXAgeWV0LlxcbitcXHQgKiAgMi4gVGhlIHdvcmsgaXMgY3VycmVudGx5IGluLWZsaWdodCBBTkQgd2FzIHNlbGYtcmVzY2hlZHVsZWQgZnJvbVxcbitcXHQgKiAgICAgd2l0aGluIHRoZSBjYWxsYmFjayAtIGt0aHJlYWRfY2FuY2VsX3dvcmtfc3luYygpIGRlcXVldWVzIHRoZVxcbitcXHQgKiAgICAgcmUtcXVldWVkIHBlbmRpbmcgbm9kZSBhbmQgdGhlbiB3YWl0cyBmb3IgdGhlIGluLWZsaWdodFxcbitcXHQgKiAgICAgZXhlY3V0aW9uIHRvIGNvbXBsZXRlLlxcbitcXHQgKiBJbiBib3RoIGNhc2VzIHRoZSByZXR1cm4gdmFsdWUgaXMgdHJ1ZSwgaW5kaWNhdGluZyBvbmUgb3JwaGFuZWRcXG4rXFx0ICogcmVmZXJlbmNlIHRoYXQgbmVlZHMgdG8gYmUgcmVsZWFzZWQgaGVyZS5cXG4rXFx0ICovXFxuK1xcdGlmIChrdGhyZWFkX2NhbmNlbF93b3JrX3N5bmMoXFx1MDAyNmN0eC1cXHUwMDNld29yaykpXFxuK1xcdFxcdGJwZl90aHJlYWRfd3FfY3R4X3B1dChjdHgpO1xcbitcXG4rXFx0LypcXG4rXFx0ICogRHJvcCBvdXIgb3duIHJlZmVyZW5jZS4gIElmIHRoZSB3b3JrIHdhcyBzdGlsbCBpbi1mbGlnaHQgYWJvdmUsXFxuK1xcdCAqIHRoZSByZWZjb3VudCB3b24ndCBoaXQgemVybyBoZXJlIC0gaXQgd2lsbCByZWFjaCB6ZXJvIHdoZW4gdGhlXFxuK1xcdCAqIHdvcmsgcGF0aCBjYWxscyBicGZfdGhyZWFkX3dxX2N0eF9wdXQoKSB1cG9uIGNvbXBsZXRpb24uICBFaXRoZXJcXG4rXFx0ICogd2F5LCBmaW5hbCBjbGVhbnVwICh3b3JrZXIgZGVzdHJ1Y3Rpb24sIHByb2cgcHV0LCBjZ3JvdXAgcHV0LFxcbitcXHQgKiBrZnJlZSkgaGFwcGVucyBleGNsdXNpdmVseSBpbiB0aGUgUkNVIGNhbGxiYWNrIHRvIGtlZXAgdGhlXFxuK1xcdCAqIHRlYXJkb3duIHBhdGggc2luZ2xlLXRocmVhZGVkLlxcbitcXHQgKi9cXG4rXFx0YnBmX3RocmVhZF93cV9jdHhfcHV0KGN0eCk7XFxuK31cXG4rXFxuIF9fYnBmX2tmdW5jX2VuZF9kZWZzKCk7XFxuIFxcbiBzdGF0aWMgdm9pZCBicGZfdGFza193b3JrX2NhbmNlbF9zY2hlZHVsZWQoc3RydWN0IGlycV93b3JrICppcnFfd29yaylcXG5AQCAtNDkxNyw2ICs1MzIxLDggQEAgQlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9tb2RpZnlfcmV0dXJuX3Rlc3RfdHApXFxuIEJURl9JRF9GTEFHUyhmdW5jLCBicGZfd3FfaW5pdClcXG4gQlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl93cV9zZXRfY2FsbGJhY2ssIEtGX0lNUExJQ0lUX0FSR1MpXFxuIEJURl9JRF9GTEFHUyhmdW5jLCBicGZfd3Ffc3RhcnQpXFxuK0JURl9JRF9GTEFHUyhmdW5jLCBicGZfdGhyZWFkX3dxX3NldF9jYWxsYmFjaywgS0ZfSU1QTElDSVRfQVJHUylcXG4rQlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl90aHJlYWRfd3Ffc3RhcnQpXFxuIEJURl9JRF9GTEFHUyhmdW5jLCBicGZfcHJlZW1wdF9kaXNhYmxlKVxcbiBCVEZfSURfRkxBR1MoZnVuYywgYnBmX3ByZWVtcHRfZW5hYmxlKVxcbiBCVEZfSURfRkxBR1MoZnVuYywgYnBmX2l0ZXJfYml0c19uZXcsIEtGX0lURVJfTkVXKVxcbkBAIC00OTc4LDYgKzUzODQsMTUgQEAgc3RhdGljIGNvbnN0IHN0cnVjdCBidGZfa2Z1bmNfaWRfc2V0IGNvbW1vbl9rZnVuY19zZXQgPSB7XFxuIFxcdC5zZXQgICA9IFxcdTAwMjZjb21tb25fYnRmX2lkcyxcXG4gfTtcXG4gXFxuK0JURl9LRlVOQ1NfU1RBUlQoc3lzY2FsbF9idGZfaWRzKVxcbitCVEZfSURfRkxBR1MoZnVuYywgYnBmX3RocmVhZF93cV9pbml0LCBLRl9TTEVFUEFCTEUpXFxuK0JURl9LRlVOQ1NfRU5EKHN5c2NhbGxfYnRmX2lkcylcXG4rXFxuK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYnRmX2tmdW5jX2lkX3NldCBzeXNjYWxsX2tmdW5jX3NldCA9IHtcXG4rXFx0Lm93bmVyID0gVEhJU19NT0RVTEUsXFxuK1xcdC5zZXQgICA9IFxcdTAwMjZzeXNjYWxsX2J0Zl9pZHMsXFxuK307XFxuK1xcbiBzdGF0aWMgaW50IF9faW5pdCBrZnVuY19pbml0KHZvaWQpXFxuIHtcXG4gXFx0aW50IHJldDtcXG5AQCAtNTAwMCw2ICs1NDE1LDcgQEAgc3RhdGljIGludCBfX2luaXQga2Z1bmNfaW5pdCh2b2lkKVxcbiBcXHRyZXQgPSByZXQgPzogcmVnaXN0ZXJfYnRmX2tmdW5jX2lkX3NldChCUEZfUFJPR19UWVBFX1NUUlVDVF9PUFMsIFxcdTAwMjZnZW5lcmljX2tmdW5jX3NldCk7XFxuIFxcdHJldCA9IHJldCA/OiByZWdpc3Rlcl9idGZfa2Z1bmNfaWRfc2V0KEJQRl9QUk9HX1RZUEVfU1lTQ0FMTCwgXFx1MDAyNmdlbmVyaWNfa2Z1bmNfc2V0KTtcXG4gXFx0cmV0ID0gcmV0ID86IHJlZ2lzdGVyX2J0Zl9rZnVuY19pZF9zZXQoQlBGX1BST0dfVFlQRV9DR1JPVVBfU0tCLCBcXHUwMDI2Z2VuZXJpY19rZnVuY19zZXQpO1xcbitcXHRyZXQgPSByZXQgPzogcmVnaXN0ZXJfYnRmX2tmdW5jX2lkX3NldChCUEZfUFJPR19UWVBFX1NZU0NBTEwsIFxcdTAwMjZzeXNjYWxsX2tmdW5jX3NldCk7XFxuIFxcdHJldCA9IHJldCA/OiByZWdpc3Rlcl9idGZfaWRfZHRvcl9rZnVuY3MoZ2VuZXJpY19kdG9ycyxcXG4gXFx0XFx0XFx0XFx0XFx0XFx0ICBBUlJBWV9TSVpFKGdlbmVyaWNfZHRvcnMpLFxcbiBcXHRcXHRcXHRcXHRcXHRcXHQgIFRISVNfTU9EVUxFKTtcXG5AQCAtNTAzNyw0ICs1NDUzLDYgQEAgdm9pZCBicGZfbWFwX2ZyZWVfaW50ZXJuYWxfc3RydWN0cyhzdHJ1Y3QgYnBmX21hcCAqbWFwLCB2b2lkICp2YWwpXFxuIFxcdFxcdGJwZl9vYmpfZnJlZV93b3JrcXVldWUobWFwLVxcdTAwM2VyZWNvcmQsIHZhbCk7XFxuIFxcdGlmIChidGZfcmVjb3JkX2hhc19maWVsZChtYXAtXFx1MDAzZXJlY29yZCwgQlBGX1RBU0tfV09SSykpXFxuIFxcdFxcdGJwZl9vYmpfZnJlZV90YXNrX3dvcmsobWFwLVxcdTAwM2VyZWNvcmQsIHZhbCk7XFxuK1xcdGlmIChidGZfcmVjb3JkX2hhc19maWVsZChtYXAtXFx1MDAzZXJlY29yZCwgQlBGX1RIUkVBRF9XUSkpXFxuK1xcdFxcdGJwZl9vYmpfZnJlZV90aHJlYWRfd3EobWFwLVxcdTAwM2VyZWNvcmQsIHZhbCk7XFxuIH1cXG5kaWZmIC0tZ2l0IGEva2VybmVsL2JwZi9zeXNjYWxsLmMgYi9rZXJuZWwvYnBmL3N5c2NhbGwuY1xcbmluZGV4IDhkMTExZGE4ODY1NTMuLmRlYTE0ODIzYmFjZDIgMTAwNjQ0XFxuLS0tIGEva2VybmVsL2JwZi9zeXNjYWxsLmNcXG4rKysgYi9rZXJuZWwvYnBmL3N5c2NhbGwuY1xcbkBAIC02ODgsNiArNjg4LDcgQEAgdm9pZCBidGZfcmVjb3JkX2ZyZWUoc3RydWN0IGJ0Zl9yZWNvcmQgKnJlYylcXG4gXFx0XFx0Y2FzZSBCUEZfUkVGQ09VTlQ6XFxuIFxcdFxcdGNhc2UgQlBGX1dPUktRVUVVRTpcXG4gXFx0XFx0Y2FzZSBCUEZfVEFTS19XT1JLOlxcbitcXHRcXHRjYXNlIEJQRl9USFJFQURfV1E6XFxuIFxcdFxcdFxcdC8qIE5vdGhpbmcgdG8gcmVsZWFzZSAqL1xcbiBcXHRcXHRcXHRicmVhaztcXG4gXFx0XFx0ZGVmYXVsdDpcXG5AQCAtNzQyLDYgKzc0Myw3IEBAIHN0cnVjdCBidGZfcmVjb3JkICpidGZfcmVjb3JkX2R1cChjb25zdCBzdHJ1Y3QgYnRmX3JlY29yZCAqcmVjKVxcbiBcXHRcXHRjYXNlIEJQRl9SRUZDT1VOVDpcXG4gXFx0XFx0Y2FzZSBCUEZfV09SS1FVRVVFOlxcbiBcXHRcXHRjYXNlIEJQRl9UQVNLX1dPUks6XFxuK1xcdFxcdGNhc2UgQlBGX1RIUkVBRF9XUTpcXG4gXFx0XFx0XFx0LyogTm90aGluZyB0byBhY3F1aXJlICovXFxuIFxcdFxcdFxcdGJyZWFrO1xcbiBcXHRcXHRkZWZhdWx0OlxcbkBAIC04MDcsNiArODA5LDEzIEBAIHZvaWQgYnBmX29ial9mcmVlX3Rhc2tfd29yayhjb25zdCBzdHJ1Y3QgYnRmX3JlY29yZCAqcmVjLCB2b2lkICpvYmopXFxuIFxcdGJwZl90YXNrX3dvcmtfY2FuY2VsX2FuZF9mcmVlKG9iaiArIHJlYy1cXHUwMDNldGFza193b3JrX29mZik7XFxuIH1cXG4gXFxuK3ZvaWQgYnBmX29ial9mcmVlX3RocmVhZF93cShjb25zdCBzdHJ1Y3QgYnRmX3JlY29yZCAqcmVjLCB2b2lkICpvYmopXFxuK3tcXG4rXFx0aWYgKFdBUk5fT05fT05DRSghYnRmX3JlY29yZF9oYXNfZmllbGQocmVjLCBCUEZfVEhSRUFEX1dRKSkpXFxuK1xcdFxcdHJldHVybjtcXG4rXFx0YnBmX3RocmVhZF93cV9jYW5jZWxfYW5kX2ZyZWUob2JqICsgcmVjLVxcdTAwM2V0aHJlYWRfd3Ffb2ZmKTtcXG4rfVxcbitcXG4gdm9pZCBicGZfb2JqX2NhbmNlbF9maWVsZHMoc3RydWN0IGJwZl9tYXAgKm1hcCwgdm9pZCAqb2JqKVxcbiB7XFxuIFxcdGJwZl9tYXBfZnJlZV9pbnRlcm5hbF9zdHJ1Y3RzKG1hcCwgb2JqKTtcXG5AQCAtODM5LDYgKzg0OCw5IEBAIHZvaWQgYnBmX29ial9mcmVlX2ZpZWxkcyhjb25zdCBzdHJ1Y3QgYnRmX3JlY29yZCAqcmVjLCB2b2lkICpvYmopXFxuIFxcdFxcdGNhc2UgQlBGX1RBU0tfV09SSzpcXG4gXFx0XFx0XFx0YnBmX3Rhc2tfd29ya19jYW5jZWxfYW5kX2ZyZWUoZmllbGRfcHRyKTtcXG4gXFx0XFx0XFx0YnJlYWs7XFxuK1xcdFxcdGNhc2UgQlBGX1RIUkVBRF9XUTpcXG4rXFx0XFx0XFx0YnBmX3RocmVhZF93cV9jYW5jZWxfYW5kX2ZyZWUoZmllbGRfcHRyKTtcXG4rXFx0XFx0XFx0YnJlYWs7XFxuIFxcdFxcdGNhc2UgQlBGX0tQVFJfVU5SRUY6XFxuIFxcdFxcdFxcdFdSSVRFX09OQ0UoKih1NjQgKilmaWVsZF9wdHIsIDApO1xcbiBcXHRcXHRcXHRicmVhaztcXG5AQCAtMTI2NSw3ICsxMjc3LDcgQEAgc3RhdGljIGludCBtYXBfY2hlY2tfYnRmKHN0cnVjdCBicGZfbWFwICptYXAsIHN0cnVjdCBicGZfdG9rZW4gKnRva2VuLFxcbiBcXHRtYXAtXFx1MDAzZXJlY29yZCA9IGJ0Zl9wYXJzZV9maWVsZHMoYnRmLCB2YWx1ZV90eXBlLFxcbiBcXHRcXHRcXHRcXHQgICAgICAgQlBGX1NQSU5fTE9DSyB8IEJQRl9SRVNfU1BJTl9MT0NLIHwgQlBGX1RJTUVSIHwgQlBGX0tQVFIgfCBCUEZfTElTVF9IRUFEIHxcXG4gXFx0XFx0XFx0XFx0ICAgICAgIEJQRl9SQl9ST09UIHwgQlBGX1JFRkNPVU5UIHwgQlBGX1dPUktRVUVVRSB8IEJQRl9VUFRSIHxcXG4tXFx0XFx0XFx0XFx0ICAgICAgIEJQRl9UQVNLX1dPUkssXFxuK1xcdFxcdFxcdFxcdCAgICAgICBCUEZfVEFTS19XT1JLIHwgQlBGX1RIUkVBRF9XUSxcXG4gXFx0XFx0XFx0XFx0ICAgICAgIG1hcC1cXHUwMDNldmFsdWVfc2l6ZSk7XFxuIFxcdGlmICghSVNfRVJSX09SX05VTEwobWFwLVxcdTAwM2VyZWNvcmQpKSB7XFxuIFxcdFxcdGludCBpO1xcbkBAIC0xMjk5LDYgKzEzMTEsNyBAQCBzdGF0aWMgaW50IG1hcF9jaGVja19idGYoc3RydWN0IGJwZl9tYXAgKm1hcCwgc3RydWN0IGJwZl90b2tlbiAqdG9rZW4sXFxuIFxcdFxcdFxcdGNhc2UgQlBGX1RJTUVSOlxcbiBcXHRcXHRcXHRjYXNlIEJQRl9XT1JLUVVFVUU6XFxuIFxcdFxcdFxcdGNhc2UgQlBGX1RBU0tfV09SSzpcXG4rXFx0XFx0XFx0Y2FzZSBCUEZfVEhSRUFEX1dROlxcbiBcXHRcXHRcXHRcXHRpZiAobWFwLVxcdTAwM2VtYXBfdHlwZSAhPSBCUEZfTUFQX1RZUEVfSEFTSCBcXHUwMDI2XFx1MDAyNlxcbiBcXHRcXHRcXHRcXHQgICAgbWFwLVxcdTAwM2VtYXBfdHlwZSAhPSBCUEZfTUFQX1RZUEVfUkhBU0ggXFx1MDAyNlxcdTAwMjZcXG4gXFx0XFx0XFx0XFx0ICAgIG1hcC1cXHUwMDNlbWFwX3R5cGUgIT0gQlBGX01BUF9UWVBFX0xSVV9IQVNIIFxcdTAwMjZcXHUwMDI2XFxuZGlmZiAtLWdpdCBhL2tlcm5lbC9icGYvdmVyaWZpZXIuYyBiL2tlcm5lbC9icGYvdmVyaWZpZXIuY1xcbmluZGV4IGU2MjMzYzAwODFkMTAuLjQ0ZTc5ZmU0ODBiNmIgMTAwNjQ0XFxuLS0tIGEva2VybmVsL2JwZi92ZXJpZmllci5jXFxuKysrIGIva2VybmVsL2JwZi92ZXJpZmllci5jXFxuQEAgLTQ3Nyw2ICs0NzcsNyBAQCBzdGF0aWMgYm9vbCBpc19hc3luY19jYWxsYmFja19jYWxsaW5nX2tmdW5jKHUzMiBidGZfaWQpO1xcbiBzdGF0aWMgYm9vbCBpc19jYWxsYmFja19jYWxsaW5nX2tmdW5jKHUzMiBidGZfaWQpO1xcbiBcXG4gc3RhdGljIGJvb2wgaXNfYnBmX3dxX3NldF9jYWxsYmFja19rZnVuYyh1MzIgYnRmX2lkKTtcXG4rc3RhdGljIGJvb2wgaXNfYnBmX3RocmVhZF93cV9zZXRfY2FsbGJhY2tfa2Z1bmModTMyIGJ0Zl9pZCk7XFxuIHN0YXRpYyBib29sIGlzX3Rhc2tfd29ya19hZGRfa2Z1bmModTMyIGZ1bmNfaWQpO1xcbiBcXG4gc3RhdGljIGJvb2wgaXNfc3luY19jYWxsYmFja19jYWxsaW5nX2Z1bmN0aW9uKGVudW0gYnBmX2Z1bmNfaWQgZnVuY19pZClcXG5AQCAtNTE2LDkgKzUxNywxMSBAQCBzdGF0aWMgYm9vbCBpc19hc3luY19jYl9zbGVlcGFibGUoc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudiwgc3RydWN0IGJwZl9pbnNuXFxuIFxcdGlmIChicGZfaGVscGVyX2NhbGwoaW5zbikgXFx1MDAyNlxcdTAwMjYgaW5zbi1cXHUwMDNlaW1tID09IEJQRl9GVU5DX3RpbWVyX3NldF9jYWxsYmFjaylcXG4gXFx0XFx0cmV0dXJuIGZhbHNlO1xcbiBcXG4tXFx0LyogYnBmX3dxIGFuZCBicGZfdGFza193b3JrIGNhbGxiYWNrcyBhcmUgYWx3YXlzIHNsZWVwYWJsZS4gKi9cXG4rXFx0LyogYnBmX3dxLCBicGZfdGhyZWFkX3dxIGFuZCBicGZfdGFza193b3JrIGNhbGxiYWNrcyBhcmUgYWx3YXlzIHNsZWVwYWJsZS4gKi9cXG4gXFx0aWYgKGJwZl9wc2V1ZG9fa2Z1bmNfY2FsbChpbnNuKSBcXHUwMDI2XFx1MDAyNiBpbnNuLVxcdTAwM2VvZmYgPT0gMCBcXHUwMDI2XFx1MDAyNlxcbi1cXHQgICAgKGlzX2JwZl93cV9zZXRfY2FsbGJhY2tfa2Z1bmMoaW5zbi1cXHUwMDNlaW1tKSB8fCBpc190YXNrX3dvcmtfYWRkX2tmdW5jKGluc24tXFx1MDAzZWltbSkpKVxcbitcXHQgICAgKGlzX2JwZl93cV9zZXRfY2FsbGJhY2tfa2Z1bmMoaW5zbi1cXHUwMDNlaW1tKSB8fFxcbitcXHQgICAgIGlzX2JwZl90aHJlYWRfd3Ffc2V0X2NhbGxiYWNrX2tmdW5jKGluc24tXFx1MDAzZWltbSkgfHxcXG4rXFx0ICAgICBpc190YXNrX3dvcmtfYWRkX2tmdW5jKGluc24tXFx1MDAzZWltbSkpKVxcbiBcXHRcXHRyZXR1cm4gdHJ1ZTtcXG4gXFxuIFxcdHZlcmlmaWVyX2J1ZyhlbnYsIFxcXCJ1bmhhbmRsZWQgYXN5bmMgY2FsbGJhY2sgaW4gaXNfYXN5bmNfY2Jfc2xlZXBhYmxlXFxcIik7XFxuQEAgLTE4NzEsNyArMTg3NCwxMCBAQCBzdGF0aWMgdm9pZCByZWZpbmVfbWFwX2xvb2t1cF92YWx1ZShzdHJ1Y3QgYnBmX3JlZ19zdGF0ZSAqcmVnKVxcbiBcXHRcXHQgKiBhcyBVSUQgb2YgdGhlIGlubmVyIG1hcC5cXG4gXFx0XFx0ICovXFxuIFxcdFxcdGlmIChidGZfcmVjb3JkX2hhc19maWVsZChtYXAtXFx1MDAzZWlubmVyX21hcF9tZXRhLVxcdTAwM2VyZWNvcmQsXFxuLVxcdFxcdFxcdFxcdFxcdCBCUEZfVElNRVIgfCBCUEZfV09SS1FVRVVFIHwgQlBGX1RBU0tfV09SSykpXFxuK1xcdFxcdFxcdFxcdFxcdCBCUEZfVElNRVIgfFxcbitcXHRcXHRcXHRcXHRcXHQgQlBGX1dPUktRVUVVRSB8XFxuK1xcdFxcdFxcdFxcdFxcdCBCUEZfVEFTS19XT1JLIHxcXG4rXFx0XFx0XFx0XFx0XFx0IEJQRl9USFJFQURfV1EpKVxcbiBcXHRcXHRcXHRyZWctXFx1MDAzZW1hcF91aWQgPSByZWctXFx1MDAzZWlkO1xcbiBcXHR9IGVsc2UgaWYgKG1hcC1cXHUwMDNlbWFwX3R5cGUgPT0gQlBGX01BUF9UWVBFX1hTS01BUCkge1xcbiBcXHRcXHRyZWctXFx1MDAzZXR5cGUgPSBQVFJfVE9fWERQX1NPQ0sgfCBtYXliZV9udWxsO1xcbkBAIC03MjQzLDYgKzcyNDksOSBAQCBzdGF0aWMgaW50IGNoZWNrX21hcF9maWVsZF9wb2ludGVyKHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsIHN0cnVjdCBicGZfcmVnX1xcbiBcXHRjYXNlIEJQRl9XT1JLUVVFVUU6XFxuIFxcdFxcdGZpZWxkX29mZiA9IG1hcC1cXHUwMDNlcmVjb3JkLVxcdTAwM2V3cV9vZmY7XFxuIFxcdFxcdGJyZWFrO1xcbitcXHRjYXNlIEJQRl9USFJFQURfV1E6XFxuK1xcdFxcdGZpZWxkX29mZiA9IG1hcC1cXHUwMDNlcmVjb3JkLVxcdTAwM2V0aHJlYWRfd3Ffb2ZmO1xcbitcXHRcXHRicmVhaztcXG4gXFx0ZGVmYXVsdDpcXG4gXFx0XFx0dmVyaWZpZXJfYnVnKGVudiwgXFxcInVuc3VwcG9ydGVkIEJURiBmaWVsZCB0eXBlOiAlc1xcXFxuXFxcIiwgc3RydWN0X25hbWUpO1xcbiBcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG5AQCAtMTA5NDAsNiArMTA5NDksNyBAQCBlbnVtIHtcXG4gXFx0S0ZfQVJHX1dPUktRVUVVRV9JRCxcXG4gXFx0S0ZfQVJHX1JFU19TUElOX0xPQ0tfSUQsXFxuIFxcdEtGX0FSR19UQVNLX1dPUktfSUQsXFxuK1xcdEtGX0FSR19USFJFQURfV1FfSUQsXFxuIFxcdEtGX0FSR19QUk9HX0FVWF9JRCxcXG4gXFx0S0ZfQVJHX1RJTUVSX0lEXFxuIH07XFxuQEAgLTEwOTUzLDYgKzEwOTYzLDcgQEAgQlRGX0lEKHN0cnVjdCwgYnBmX3JiX25vZGUpXFxuIEJURl9JRChzdHJ1Y3QsIGJwZl93cSlcXG4gQlRGX0lEKHN0cnVjdCwgYnBmX3Jlc19zcGluX2xvY2spXFxuIEJURl9JRChzdHJ1Y3QsIGJwZl90YXNrX3dvcmspXFxuK0JURl9JRChzdHJ1Y3QsIGJwZl90aHJlYWRfd3EpXFxuIEJURl9JRChzdHJ1Y3QsIGJwZl9wcm9nX2F1eClcXG4gQlRGX0lEKHN0cnVjdCwgYnBmX3RpbWVyKVxcbiBcXG5AQCAtMTEwMTMsNiArMTEwMjQsMTEgQEAgc3RhdGljIGJvb2wgaXNfa2Z1bmNfYXJnX3Rhc2tfd29yayhjb25zdCBzdHJ1Y3QgYnRmICpidGYsIGNvbnN0IHN0cnVjdCBidGZfcGFyYW1cXG4gXFx0cmV0dXJuIF9faXNfa2Z1bmNfcHRyX2FyZ190eXBlKGJ0ZiwgYXJnLCBLRl9BUkdfVEFTS19XT1JLX0lEKTtcXG4gfVxcbiBcXG4rc3RhdGljIGJvb2wgaXNfa2Z1bmNfYXJnX3RocmVhZF93cShjb25zdCBzdHJ1Y3QgYnRmICpidGYsIGNvbnN0IHN0cnVjdCBidGZfcGFyYW0gKmFyZylcXG4re1xcbitcXHRyZXR1cm4gX19pc19rZnVuY19wdHJfYXJnX3R5cGUoYnRmLCBhcmcsIEtGX0FSR19USFJFQURfV1FfSUQpO1xcbit9XFxuK1xcbiBzdGF0aWMgYm9vbCBpc19rZnVuY19hcmdfcmVzX3NwaW5fbG9jayhjb25zdCBzdHJ1Y3QgYnRmICpidGYsIGNvbnN0IHN0cnVjdCBidGZfcGFyYW0gKmFyZylcXG4ge1xcbiBcXHRyZXR1cm4gX19pc19rZnVuY19wdHJfYXJnX3R5cGUoYnRmLCBhcmcsIEtGX0FSR19SRVNfU1BJTl9MT0NLX0lEKTtcXG5AQCAtMTExMzIsNiArMTExNDgsNyBAQCBlbnVtIGtmdW5jX3B0cl9hcmdfdHlwZSB7XFxuIFxcdEtGX0FSR19QVFJfVE9fSVJRX0ZMQUcsXFxuIFxcdEtGX0FSR19QVFJfVE9fUkVTX1NQSU5fTE9DSyxcXG4gXFx0S0ZfQVJHX1BUUl9UT19UQVNLX1dPUkssXFxuK1xcdEtGX0FSR19QVFJfVE9fVEhSRUFEX1dRLFxcbiB9O1xcbiBcXG4gZW51bSBzcGVjaWFsX2tmdW5jX3R5cGUge1xcbkBAIC0xMTE3OCw2ICsxMTE5NSw3IEBAIGVudW0gc3BlY2lhbF9rZnVuY190eXBlIHtcXG4gXFx0S0ZfYnBmX3BlcmNwdV9vYmpfZHJvcCxcXG4gXFx0S0ZfYnBmX3Rocm93LFxcbiBcXHRLRl9icGZfd3Ffc2V0X2NhbGxiYWNrLFxcbitcXHRLRl9icGZfdGhyZWFkX3dxX3NldF9jYWxsYmFjayxcXG4gXFx0S0ZfYnBmX3ByZWVtcHRfZGlzYWJsZSxcXG4gXFx0S0ZfYnBmX3ByZWVtcHRfZW5hYmxlLFxcbiBcXHRLRl9icGZfaXRlcl9jc3NfdGFza19uZXcsXFxuQEAgLTExMjU4LDYgKzExMjc2LDcgQEAgQlRGX0lEKGZ1bmMsIGJwZl9wZXJjcHVfb2JqX2Ryb3BfaW1wbClcXG4gQlRGX0lEKGZ1bmMsIGJwZl9wZXJjcHVfb2JqX2Ryb3ApXFxuIEJURl9JRChmdW5jLCBicGZfdGhyb3cpXFxuIEJURl9JRChmdW5jLCBicGZfd3Ffc2V0X2NhbGxiYWNrKVxcbitCVEZfSUQoZnVuYywgYnBmX3RocmVhZF93cV9zZXRfY2FsbGJhY2spXFxuIEJURl9JRChmdW5jLCBicGZfcHJlZW1wdF9kaXNhYmxlKVxcbiBCVEZfSUQoZnVuYywgYnBmX3ByZWVtcHRfZW5hYmxlKVxcbiAjaWZkZWYgQ09ORklHX0NHUk9VUFNcXG5AQCAtMTE0NjAsNiArMTE0NzksOCBAQCBnZXRfa2Z1bmNfYXJnX3R5cGUoc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudiwgc3RydWN0IGJwZl9jYWxsX2FyZ19tZXRhICptZXRhLFxcbiBcXHRcXHRhcmdfdHlwZSA9IEtGX0FSR19QVFJfVE9fVElNRVI7XFxuIFxcdGVsc2UgaWYgKGlzX2tmdW5jX2FyZ190YXNrX3dvcmsobWV0YS1cXHUwMDNlYnRmLCBcXHUwMDI2YXJnc1thcmddKSlcXG4gXFx0XFx0YXJnX3R5cGUgPSBLRl9BUkdfUFRSX1RPX1RBU0tfV09SSztcXG4rXFx0ZWxzZSBpZiAoaXNfa2Z1bmNfYXJnX3RocmVhZF93cShtZXRhLVxcdTAwM2VidGYsIFxcdTAwMjZhcmdzW2FyZ10pKVxcbitcXHRcXHRhcmdfdHlwZSA9IEtGX0FSR19QVFJfVE9fVEhSRUFEX1dRO1xcbiBcXHRlbHNlIGlmIChpc19rZnVuY19hcmdfaXJxX2ZsYWcobWV0YS1cXHUwMDNlYnRmLCBcXHUwMDI2YXJnc1thcmddKSlcXG4gXFx0XFx0YXJnX3R5cGUgPSBLRl9BUkdfUFRSX1RPX0lSUV9GTEFHO1xcbiBcXHRlbHNlIGlmIChpc19rZnVuY19hcmdfcmVzX3NwaW5fbG9jayhtZXRhLVxcdTAwM2VidGYsIFxcdTAwMjZhcmdzW2FyZ10pKVxcbkBAIC0xMTgzMyw2ICsxMTg1NCw3IEBAIHN0YXRpYyBib29sIGlzX3N5bmNfY2FsbGJhY2tfY2FsbGluZ19rZnVuYyh1MzIgYnRmX2lkKVxcbiBzdGF0aWMgYm9vbCBpc19hc3luY19jYWxsYmFja19jYWxsaW5nX2tmdW5jKHUzMiBidGZfaWQpXFxuIHtcXG4gXFx0cmV0dXJuIGlzX2JwZl93cV9zZXRfY2FsbGJhY2tfa2Z1bmMoYnRmX2lkKSB8fFxcbitcXHQgICAgICAgaXNfYnBmX3RocmVhZF93cV9zZXRfY2FsbGJhY2tfa2Z1bmMoYnRmX2lkKSB8fFxcbiBcXHQgICAgICAgaXNfdGFza193b3JrX2FkZF9rZnVuYyhidGZfaWQpO1xcbiB9XFxuIFxcbkBAIC0xMTg0Nyw2ICsxMTg2OSwxMSBAQCBzdGF0aWMgYm9vbCBpc19icGZfd3Ffc2V0X2NhbGxiYWNrX2tmdW5jKHUzMiBidGZfaWQpXFxuIFxcdHJldHVybiBidGZfaWQgPT0gc3BlY2lhbF9rZnVuY19saXN0W0tGX2JwZl93cV9zZXRfY2FsbGJhY2tdO1xcbiB9XFxuIFxcbitzdGF0aWMgYm9vbCBpc19icGZfdGhyZWFkX3dxX3NldF9jYWxsYmFja19rZnVuYyh1MzIgYnRmX2lkKVxcbit7XFxuK1xcdHJldHVybiBidGZfaWQgPT0gc3BlY2lhbF9rZnVuY19saXN0W0tGX2JwZl90aHJlYWRfd3Ffc2V0X2NhbGxiYWNrXTtcXG4rfVxcbitcXG4gc3RhdGljIGJvb2wgaXNfY2FsbGJhY2tfY2FsbGluZ19rZnVuYyh1MzIgYnRmX2lkKVxcbiB7XFxuIFxcdHJldHVybiBpc19zeW5jX2NhbGxiYWNrX2NhbGxpbmdfa2Z1bmMoYnRmX2lkKSB8fFxcbkBAIC0xMjE5Miw2ICsxMjIxOSw3IEBAIHN0YXRpYyBpbnQgY2hlY2tfa2Z1bmNfYXJncyhzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52LCBzdHJ1Y3QgYnBmX2NhbGxfYXJnX21lXFxuIFxcdFxcdGNhc2UgS0ZfQVJHX1BUUl9UT19XT1JLUVVFVUU6XFxuIFxcdFxcdGNhc2UgS0ZfQVJHX1BUUl9UT19USU1FUjpcXG4gXFx0XFx0Y2FzZSBLRl9BUkdfUFRSX1RPX1RBU0tfV09SSzpcXG4rXFx0XFx0Y2FzZSBLRl9BUkdfUFRSX1RPX1RIUkVBRF9XUTpcXG4gXFx0XFx0Y2FzZSBLRl9BUkdfUFRSX1RPX0lSUV9GTEFHOlxcbiBcXHRcXHRjYXNlIEtGX0FSR19QVFJfVE9fUkVTX1NQSU5fTE9DSzpcXG4gXFx0XFx0XFx0YnJlYWs7XFxuQEAgLTEzMTM5LDYgKzEzMTY3LDE2IEBAIHN0YXRpYyBpbnQgY2hlY2tfa2Z1bmNfY2FsbChzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52LCBzdHJ1Y3QgYnBmX2luc24gKmluc24sXFxuIFxcdFxcdH1cXG4gXFx0fVxcbiBcXG4rXFx0aWYgKGlzX2JwZl90aHJlYWRfd3Ffc2V0X2NhbGxiYWNrX2tmdW5jKG1ldGEuZnVuY19pZCkpIHtcXG4rXFx0XFx0ZXJyID0gcHVzaF9jYWxsYmFja19jYWxsKGVudiwgaW5zbiwgaW5zbl9pZHgsIG1ldGEuc3VicHJvZ25vLFxcbitcXHRcXHRcXHRcXHRcXHQgc2V0X3RpbWVyX2NhbGxiYWNrX3N0YXRlKTtcXG4rXFx0XFx0aWYgKGVycikge1xcbitcXHRcXHRcXHR2ZXJib3NlKGVudiwgXFxcImtmdW5jICVzIyVkIGZhaWxlZCBjYWxsYmFjayB2ZXJpZmljYXRpb25cXFxcblxcXCIsXFxuK1xcdFxcdFxcdFxcdGZ1bmNfbmFtZSwgbWV0YS5mdW5jX2lkKTtcXG4rXFx0XFx0XFx0cmV0dXJuIGVycjtcXG4rXFx0XFx0fVxcbitcXHR9XFxuK1xcbiBcXHRpZiAoaXNfdGFza193b3JrX2FkZF9rZnVuYyhtZXRhLmZ1bmNfaWQpKSB7XFxuIFxcdFxcdGVyciA9IHB1c2hfY2FsbGJhY2tfY2FsbChlbnYsIGluc24sIGluc25faWR4LCBtZXRhLnN1YnByb2dubyxcXG4gXFx0XFx0XFx0XFx0XFx0IHNldF90YXNrX3dvcmtfc2NoZWR1bGVfY2FsbGJhY2tfc3RhdGUpO1xcbmRpZmYgLS1naXQgYS9rZXJuZWwvY2dyb3VwL2Nncm91cC5jIGIva2VybmVsL2Nncm91cC9jZ3JvdXAuY1xcbmluZGV4IDM4ZjhkOWRmOGZiYzQuLjE2NGUwNjljNzU3NjIgMTAwNjQ0XFxuLS0tIGEva2VybmVsL2Nncm91cC9jZ3JvdXAuY1xcbisrKyBiL2tlcm5lbC9jZ3JvdXAvY2dyb3VwLmNcXG5AQCAtMzA0Miw2ICszMDQyLDE5IEBAIGludCBjZ3JvdXBfYXR0YWNoX3Rhc2soc3RydWN0IGNncm91cCAqZHN0X2NncnAsIHN0cnVjdCB0YXNrX3N0cnVjdCAqbGVhZGVyLFxcbiBcXHRyZXR1cm4gcmV0O1xcbiB9XFxuIFxcbitpbnQgY2dyb3VwX2t0aHJlYWRfYXR0YWNoKHN0cnVjdCBjZ3JvdXAgKmNncnAsIHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaylcXG4re1xcbitcXHRpbnQgcmV0O1xcbitcXG4rXFx0Y2dyb3VwX2xvY2soKTtcXG4rXFx0Y2dyb3VwX2F0dGFjaF9sb2NrKENHUlBfQVRUQUNIX0xPQ0tfR0xPQkFMLCBOVUxMKTtcXG4rXFx0cmV0ID0gY2dyb3VwX2F0dGFjaF90YXNrKGNncnAsIHRhc2ssIGZhbHNlKTtcXG4rXFx0Y2dyb3VwX2F0dGFjaF91bmxvY2soQ0dSUF9BVFRBQ0hfTE9DS19HTE9CQUwsIE5VTEwpO1xcbitcXHRjZ3JvdXBfdW5sb2NrKCk7XFxuK1xcbitcXHRyZXR1cm4gcmV0O1xcbit9XFxuK1xcbiBzdHJ1Y3QgdGFza19zdHJ1Y3QgKmNncm91cF9wcm9jc193cml0ZV9zdGFydChjaGFyICpidWYsIGJvb2wgdGhyZWFkZ3JvdXAsXFxuIFxcdFxcdFxcdFxcdFxcdCAgICAgZW51bSBjZ3JvdXBfYXR0YWNoX2xvY2tfbW9kZSAqbG9ja19tb2RlKVxcbiB7XFxuZGlmZiAtLWdpdCBhL21tL2JwZl9tZW1jb250cm9sLmMgYi9tbS9icGZfbWVtY29udHJvbC5jXFxuaW5kZXggNzE2ZGY0OWQ3NjQ3Ny4uM2Y3YTVjOTdlMTM1NSAxMDA2NDRcXG4tLS0gYS9tbS9icGZfbWVtY29udHJvbC5jXFxuKysrIGIvbW0vYnBmX21lbWNvbnRyb2wuY1xcbkBAIC02LDYgKzYsNyBAQFxcbiAgKi9cXG4gXFxuICNpbmNsdWRlIFxcdTAwM2NsaW51eC9tZW1jb250cm9sLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9zd2FwLmhcXHUwMDNlXFxuICNpbmNsdWRlIFxcdTAwM2NsaW51eC9icGYuaFxcdTAwM2VcXG4gXFxuIF9fYnBmX2tmdW5jX3N0YXJ0X2RlZnMoKTtcXG5AQCAtMTU5LDYgKzE2MCw2MSBAQCBfX2JwZl9rZnVuYyB2b2lkIGJwZl9tZW1fY2dyb3VwX2ZsdXNoX3N0YXRzKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZylcXG4gXFx0bWVtX2Nncm91cF9mbHVzaF9zdGF0cyhtZW1jZyk7XFxuIH1cXG4gXFxuKy8qKlxcbisgKiBicGZfdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcyAtIGF0dGVtcHQgdG8gcmVjbGFpbSBwYWdlcyBmcm9tXFxuKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSBtZW1vcnkgY2dyb3VwXFxuKyAqIEBtZW1jZzogICAgICAgICAgIHRoZSB0YXJnZXQgbWVtb3J5IGNncm91cCB0byByZWNsYWltIGZyb21cXG4rICogQG5yX3BhZ2VzOiAgICAgICAgdGhlIG51bWJlciBvZiBwYWdlcyB0byByZWNsYWltXFxuKyAqIEBnZnBfbWFzazogICAgICAgIEdGUCBmbGFncyBjb250cm9sbGluZyB0aGUgcmVjbGFpbSBiZWhhdmlvclxcbisgKiBAcmVjbGFpbV9vcHRpb25zOiBiaXRtYXNrIG9mIE1FTUNHX1JFQ0xBSU1fKiBmbGFncyB0byB0dW5lXFxuKyAqICAgICAgICAgICAgICAgICAgIHJlY2xhaW0gc3RyYXRlZ3lcXG4rICogQHN3YXBwaW5lc3M6ICAgICAgc3dhcHBpbmVzcyBvdmVycmlkZSB2YWx1ZSwgb3IgYSBzZW50aW5lbCB0byB1c2VcXG4rICogICAgICAgICAgICAgICAgICAgdGhlIGRlZmF1bHRcXG4rICpcXG4rICogQlBGLWZhY2luZyB3cmFwcGVyIGFyb3VuZCB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKCkgdGhhdFxcbisgKiB2YWxpZGF0ZXMgYW5kIHRyYW5zbGF0ZXMgdGhlIEBzd2FwcGluZXNzIGFyZ3VtZW50IGJlZm9yZVxcbisgKiBkZWxlZ2F0aW5nIHRvIHRoZSBjb3JlIHJlY2xhaW0gcGF0aC5cXG4rICpcXG4rICogVGhlIEBzd2FwcGluZXNzIHBhcmFtZXRlciBmb2xsb3dzIHRoZXNlIHNlbWFudGljczpcXG4rICogICAtIFZhbHVlcyBpbiBbTUlOX1NXQVBQSU5FU1MsIFNXQVBQSU5FU1NfQU5PTl9PTkxZXSBhcmUgcGFzc2VkXFxuKyAqICAgICB0aHJvdWdoIGFzIGFuIGV4cGxpY2l0IHN3YXBwaW5lc3Mgb3ZlcnJpZGUuXFxuKyAqICAgLSBWYWx1ZXMgYmVsb3cgTUlOX1NXQVBQSU5FU1MgYXJlIHRyZWF0ZWQgYXMgXFxcInVzZSB0aGUgc3lzdGVtXFxuKyAqICAgICBkZWZhdWx0XFxcIjsgdGhlIG92ZXJyaWRlIHBvaW50ZXIgaXMgc2V0IHRvIE5VTEwgYW5kIHRoZSBjZ3JvdXAnc1xcbisgKiAgICAgb3duIHN3YXBwaW5lc3Mgc2V0dGluZyB0YWtlcyBlZmZlY3QuXFxuKyAqICAgLSBWYWx1ZXMgYWJvdmUgU1dBUFBJTkVTU19BTk9OX09OTFkgYXJlIHJlamVjdGVkIGFzIGludmFsaWQuXFxuKyAqICAgLSBJZiBAcmVjbGFpbV9vcHRpb25zIGRvZXMgbm90IGluY2x1ZGUgTUVNQ0dfUkVDTEFJTV9QUk9BQ1RJVkUsXFxuKyAqICAgICB0aGUgQHN3YXBwaW5lc3Mgb3ZlcnJpZGUgaXMgaWdub3JlZCBlbnRpcmVseSBieSB0aGUgY29yZVxcbisgKiAgICAgcmVjbGFpbSBwYXRoIGFuZCB0aGUgc3lzdGVtIGRlZmF1bHQgaXMgdXNlZCByZWdhcmRsZXNzLlxcbisgKlxcbisgKiBTd2FwIHVzYWdlIGR1cmluZyByZWNsYWltIGlzIGdhdGVkIG9uIEByZWNsYWltX29wdGlvbnM6IHN3YXAgaXNcXG4rICogY29uc2lkZXJlZCBvbmx5IHdoZW4gTUVNQ0dfUkVDTEFJTV9NQVlfU1dBUCBpcyBzZXQuICBXaXRob3V0IHRoaXNcXG4rICogZmxhZywgcmVjbGFpbSBpcyByZXN0cmljdGVkIHRvIGZpbGUtYmFja2VkIHBhZ2VzIHJlZ2FyZGxlc3Mgb2YgdGhlXFxuKyAqIEBzd2FwcGluZXNzIHZhbHVlIG9yIHRoZSBjZ3JvdXAncyBzd2FwcGluZXNzIHNldHRpbmcuXFxuKyAqXFxuKyAqIFJldHVybjpcXG4rICogICBUaGUgbnVtYmVyIG9mIHBhZ2VzIGFjdHVhbGx5IHJlY2xhaW1lZCBvbiBzdWNjZXNzLCBvciAwXFxuKyAqICAgaWYgQHN3YXBwaW5lc3MgZXhjZWVkcyBTV0FQUElORVNTX0FOT05fT05MWS5cXG4rICovXFxuK19fYnBmX2tmdW5jIHVuc2lnbmVkIGxvbmdcXG4rYnBmX3RyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLFxcbitcXHRcXHRcXHRcXHQgdW5zaWduZWQgbG9uZyBucl9wYWdlcyxcXG4rXFx0XFx0XFx0XFx0IGdmcF90IGdmcF9tYXNrLFxcbitcXHRcXHRcXHRcXHQgdW5zaWduZWQgaW50IHJlY2xhaW1fb3B0aW9ucyxcXG4rXFx0XFx0XFx0XFx0IGludCBzd2FwcGluZXNzKVxcbit7XFxuK1xcdGludCAqc3dhcGluZXNzX3B0cjtcXG4rXFxuK1xcdGlmIChzd2FwcGluZXNzIFxcdTAwM2UgU1dBUFBJTkVTU19BTk9OX09OTFkpXFxuK1xcdFxcdHJldHVybiAwO1xcbitcXHRlbHNlIGlmIChzd2FwcGluZXNzIFxcdTAwM2MgTUlOX1NXQVBQSU5FU1MpXFxuK1xcdFxcdHN3YXBpbmVzc19wdHIgPSBOVUxMO1xcbitcXHRlbHNlXFxuK1xcdFxcdHN3YXBpbmVzc19wdHIgPSBcXHUwMDI2c3dhcHBpbmVzcztcXG4rXFxuK1xcdHJldHVybiB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKG1lbWNnLCBucl9wYWdlcywgZ2ZwX21hc2ssXFxuK1xcdFxcdFxcdFxcdFxcdCAgICByZWNsYWltX29wdGlvbnMsIHN3YXBpbmVzc19wdHIpO1xcbit9XFxuK1xcbiBfX2JwZl9rZnVuY19lbmRfZGVmcygpO1xcbiBcXG4gQlRGX0tGVU5DU19TVEFSVChicGZfbWVtY29udHJvbF9rZnVuY3MpXFxuQEAgLTE3Miw2ICsyMjgsOCBAQCBCVEZfSURfRkxBR1MoZnVuYywgYnBmX21lbV9jZ3JvdXBfdXNhZ2UpXFxuIEJURl9JRF9GTEFHUyhmdW5jLCBicGZfbWVtX2Nncm91cF9wYWdlX3N0YXRlKVxcbiBCVEZfSURfRkxBR1MoZnVuYywgYnBmX21lbV9jZ3JvdXBfZmx1c2hfc3RhdHMsIEtGX1NMRUVQQUJMRSlcXG4gXFxuK0JURl9JRF9GTEFHUyhmdW5jLCBicGZfdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcywgS0ZfU0xFRVBBQkxFKVxcbitcXG4gQlRGX0tGVU5DU19FTkQoYnBmX21lbWNvbnRyb2xfa2Z1bmNzKVxcbiBcXG4gc3RhdGljIGNvbnN0IHN0cnVjdCBidGZfa2Z1bmNfaWRfc2V0IGJwZl9tZW1jb250cm9sX2tmdW5jX3NldCA9IHtcXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL2JwZl9leHBlcmltZW50YWwuaCBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9icGZfZXhwZXJpbWVudGFsLmhcXG5pbmRleCBmZjM3YWU1YTExM2RjLi5lYTkwNWVhNTYwM2MyIDEwMDY0NFxcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9icGZfZXhwZXJpbWVudGFsLmhcXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvYnBmX2V4cGVyaW1lbnRhbC5oXFxuQEAgLTM1MSw2ICszNTEsMTMgQEAgZXh0ZXJuIHZvaWQgYnBmX2l0ZXJfY3NzX2Rlc3Ryb3koc3RydWN0IGJwZl9pdGVyX2NzcyAqaXQpIF9fd2VhayBfX2tzeW07XFxuIGV4dGVybiBpbnQgYnBmX3dxX2luaXQoc3RydWN0IGJwZl93cSAqd3EsIHZvaWQgKnBfX21hcCwgdW5zaWduZWQgaW50IGZsYWdzKSBfX3dlYWsgX19rc3ltO1xcbiBleHRlcm4gaW50IGJwZl93cV9zdGFydChzdHJ1Y3QgYnBmX3dxICp3cSwgdW5zaWduZWQgaW50IGZsYWdzKSBfX3dlYWsgX19rc3ltO1xcbiBcXG4rc3RydWN0IGJwZl90aHJlYWRfd3E7XFxuK2V4dGVybiBpbnQgYnBmX3RocmVhZF93cV9pbml0KHN0cnVjdCBicGZfdGhyZWFkX3dxICp0d3EsIHZvaWQgKnBfX21hcCxcXG4rXFx0XFx0XFx0ICAgICAgX191NjQgY2dyb3VwX2lkLFxcbitcXHRcXHRcXHQgICAgICB1bnNpZ25lZCBpbnQgZmxhZ3MpIF9fd2VhayBfX2tzeW07XFxuK2V4dGVybiBpbnQgYnBmX3RocmVhZF93cV9zdGFydChzdHJ1Y3QgYnBmX3RocmVhZF93cSAqdHdxLFxcbitcXHRcXHRcXHQgICAgICAgdW5zaWduZWQgaW50IGZsYWdzKSBfX3dlYWsgX19rc3ltO1xcbitcXG4gc3RydWN0IGJwZl9pdGVyX2ttZW1fY2FjaGU7XFxuIGV4dGVybiBpbnQgYnBmX2l0ZXJfa21lbV9jYWNoZV9uZXcoc3RydWN0IGJwZl9pdGVyX2ttZW1fY2FjaGUgKml0KSBfX3dlYWsgX19rc3ltO1xcbiBleHRlcm4gc3RydWN0IGttZW1fY2FjaGUgKmJwZl9pdGVyX2ttZW1fY2FjaGVfbmV4dChzdHJ1Y3QgYnBmX2l0ZXJfa21lbV9jYWNoZSAqaXQpIF9fd2VhayBfX2tzeW07XFxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL21lbWNnX2FzeW5jX3JlY2xhaW0uYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL21lbWNnX2FzeW5jX3JlY2xhaW0uY1xcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uNDBhNWZlNjJjYjM4NFxcbi0tLSAvZGV2L251bGxcXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9tZW1jZ19hc3luY19yZWNsYWltLmNcXG5AQCAtMCwwICsxLDQ3OSBAQFxcbisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxcbisvKlxcbisgKiBNZW1vcnkgY29udHJvbGxlciBlQlBGIGFzeW5jIHJlY2xhaW0gdGVzdFxcbisgKi9cXG4rXFxuKyNpbmNsdWRlIFxcdTAwM2N0ZXN0X3Byb2dzLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NzeXMvbW1hbi5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjc3lzL3N0YXQuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY3N5cy90aW1lLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NzeXMvdmZzLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NzeXMvd2FpdC5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjZmNudGwuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L21hZ2ljLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2N1bmlzdGQuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY3N0ZGlvLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NzdGRsaWIuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY3N0cmluZy5oXFx1MDAzZVxcbitcXG4rI2luY2x1ZGUgXFxcImNncm91cF9oZWxwZXJzLmhcXFwiXFxuK1xcbitzdHJ1Y3QgYnBmX2FyZ3NfcyB7XFxuK1xcdHU2NCBoaWdoX2Nncm91cF9pZDtcXG4rXFx0dTY0IGxvd19jZ3JvdXBfaWQ7XFxuK1xcdHU2NCBldmVudF9kZWx0YV90aHJlc2hvbGQ7XFxuK1xcdHU2NCBjaGVja19ucztcXG4rfTtcXG4rXFxuKyNpbmNsdWRlIFxcXCJtZW1jZ19hc3luY19yZWNsYWltLnNrZWwuaFxcXCJcXG4rXFxuKyNkZWZpbmUgRklMRV9TSVpFICgzMiAqIDEwMjQgKiAxMDI0dWwpXFxuKyNkZWZpbmUgQlVGRkVSX1NJWkUgKDQwOTYpXFxuKyNkZWZpbmUgQ0dfTElNSVQgKDMyICogMTAyNCAqIDEwMjR1bClcXG4rI2RlZmluZSBSRUFEX1RJTUVTIDE2XFxuK1xcbisjZGVmaW5lIENHX0RJUiBcXFwiL21lbWNnX2FzeW5jX3JlY2xhaW1cXFwiXFxuKyNkZWZpbmUgQ0dfSElHSF9ESVIgQ0dfRElSIFxcXCIvaGlnaFxcXCJcXG4rI2RlZmluZSBDR19MT1dfRElSIENHX0RJUiBcXFwiL2xvd1xcXCJcXG4rXFxuKyNkZWZpbmUgQ0hFQ0tfUEVSSU9EX05TICgyICogMTAwMCAqIDEwMDB1bGwpXFxuKyNkZWZpbmUgRVZFTlRfREVMVEFfVEhSRVNIT0xEIDFcXG4rXFxuKy8qXFxuKyAqIFRlc3QgZmlsZXMgbXVzdCByZXNpZGUgb24gYSBmaWxlc3lzdGVtIHRoYXQgc3VwcG9ydHMgcGFnZSByZWNsYWltIHdpdGhvdXRcXG4rICogc3dhcCAoZS5nLiBleHQ0KS4gSWYgL3RtcCBpcyBvbiB0bXBmcywgdGhlIGZpbGUgcGFnZXMgYXJlIHNobWVtLWJhY2tlZFxcbisgKiBhbmQgY2FuIG9ubHkgYmUgcmVjbGFpbWVkIHRocm91Z2ggc3dhcC4gQnV0IHRoZSB0ZXN0IGRpc2FibGVzIHN3YXBcXG4rICogKG1lbW9yeS5zd2FwLm1heD0wKSwgbWFraW5nIHJlY2xhaW0gaW1wb3NzaWJsZSBhbmQgY2F1c2luZyBPT00uXFxuKyAqXFxuKyAqIFBpY2sgYSBkaXJlY3Rvcnkgb24gYSBub24tdG1wZnMgZmlsZXN5c3RlbTogdHJ5ICRUTVBESVIgZmlyc3QsIHRoZW4gL3RtcCxcXG4rICogYW5kIGZhbGwgYmFjayB0byB0aGUgY3VycmVudCBkaXJlY3RvcnkgaWYgdGhlIGNob3NlbiBwYXRoIGlzIG9uIHRtcGZzLlxcbisgKi9cXG4rc3RhdGljIGludCBnZXRfdGVzdF9kaXIoY2hhciAqYnVmLCBzaXplX3Qgc2l6ZSlcXG4re1xcbitcXHRzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGNhbmRpZGF0ZXNbXSA9IHsgXFxcIi90bXBcXFwiLCBcXFwiLlxcXCIgfTtcXG4rXFx0Y29uc3QgY2hhciAqdG1wZGlyID0gZ2V0ZW52KFxcXCJUTVBESVJcXFwiKTtcXG4rXFx0c3RydWN0IHN0YXRmcyBzZnM7XFxuK1xcdHNpemVfdCBpO1xcbitcXG4rXFx0aWYgKHRtcGRpciBcXHUwMDI2XFx1MDAyNiB0bXBkaXJbMF0gXFx1MDAyNlxcdTAwMjYgc3RhdGZzKHRtcGRpciwgXFx1MDAyNnNmcykgPT0gMCBcXHUwMDI2XFx1MDAyNlxcbitcXHQgICAgc2ZzLmZfdHlwZSAhPSBUTVBGU19NQUdJQykge1xcbitcXHRcXHRzbnByaW50ZihidWYsIHNpemUsIFxcXCIlc1xcXCIsIHRtcGRpcik7XFxuK1xcdFxcdHJldHVybiAwO1xcbitcXHR9XFxuK1xcbitcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgQVJSQVlfU0laRShjYW5kaWRhdGVzKTsgaSsrKSB7XFxuK1xcdFxcdGlmIChzdGF0ZnMoY2FuZGlkYXRlc1tpXSwgXFx1MDAyNnNmcykgPT0gMCBcXHUwMDI2XFx1MDAyNlxcbitcXHRcXHQgICAgc2ZzLmZfdHlwZSAhPSBUTVBGU19NQUdJQykge1xcbitcXHRcXHRcXHRzbnByaW50ZihidWYsIHNpemUsIFxcXCIlc1xcXCIsIGNhbmRpZGF0ZXNbaV0pO1xcbitcXHRcXHRcXHRyZXR1cm4gMDtcXG4rXFx0XFx0fVxcbitcXHR9XFxuK1xcbitcXHRyZXR1cm4gLTE7XFxuK31cXG4rXFxuK3N0YXRpYyBpbnQgc2V0dXBfaGlnaF9sb3dfY2dyb3Vwcyh1NjQgKmhpZ2hfY2dyb3VwX2lkLCB1NjQgKmxvd19jZ3JvdXBfaWQpXFxuK3tcXG4rXFx0aW50IHJldDtcXG4rXFx0Y2hhciBsaW1pdF9idWZbMjBdO1xcbitcXG4rXFx0cmV0ID0gc2V0dXBfY2dyb3VwX2Vudmlyb25tZW50KCk7XFxuK1xcdGlmICghQVNTRVJUX09LKHJldCwgXFxcInNldHVwX2Nncm91cF9lbnZpcm9ubWVudFxcXCIpKVxcbitcXHRcXHRnb3RvIGNsZWFudXA7XFxuK1xcbitcXHRyZXQgPSBjcmVhdGVfYW5kX2dldF9jZ3JvdXAoQ0dfRElSKTtcXG4rXFx0aWYgKCFBU1NFUlRfR0UocmV0LCAwLCBcXFwiY3JlYXRlX2FuZF9nZXRfY2dyb3VwIFxcXCIgQ0dfRElSKSlcXG4rXFx0XFx0Z290byBjbGVhbnVwO1xcbitcXHRjbG9zZShyZXQpO1xcbitcXG4rXFx0cmV0ID0gZW5hYmxlX2NvbnRyb2xsZXJzKENHX0RJUiwgXFxcIm1lbW9yeVxcXCIpO1xcbitcXHRpZiAoIUFTU0VSVF9PSyhyZXQsIFxcXCJlbmFibGVfY29udHJvbGxlcnNcXFwiKSlcXG4rXFx0XFx0Z290byBjbGVhbnVwO1xcbitcXG4rXFx0c25wcmludGYobGltaXRfYnVmLCBzaXplb2YobGltaXRfYnVmKSwgXFxcIiVsdVxcXCIsIENHX0xJTUlUKTtcXG4rXFx0cmV0ID0gd3JpdGVfY2dyb3VwX2ZpbGUoQ0dfRElSLCBcXFwibWVtb3J5Lm1heFxcXCIsIGxpbWl0X2J1Zik7XFxuK1xcdGlmICghQVNTRVJUX09LKHJldCwgXFxcIndyaXRlX2Nncm91cF9maWxlIG1lbW9yeS5tYXhcXFwiKSlcXG4rXFx0XFx0Z290byBjbGVhbnVwO1xcbitcXG4rXFx0cmV0ID0gd3JpdGVfY2dyb3VwX2ZpbGUoQ0dfRElSLCBcXFwibWVtb3J5LnN3YXAubWF4XFxcIiwgXFxcIjBcXFwiKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0socmV0LCBcXFwid3JpdGVfY2dyb3VwX2ZpbGUgbWVtb3J5LnN3YXAubWF4XFxcIikpXFxuK1xcdFxcdGdvdG8gY2xlYW51cDtcXG4rXFxuK1xcdHJldCA9IGNyZWF0ZV9hbmRfZ2V0X2Nncm91cChDR19ISUdIX0RJUik7XFxuK1xcdGlmICghQVNTRVJUX0dFKHJldCwgMCwgXFxcImNyZWF0ZV9hbmRfZ2V0X2Nncm91cCBcXFwiIENHX0hJR0hfRElSKSlcXG4rXFx0XFx0Z290byBjbGVhbnVwO1xcbitcXHRjbG9zZShyZXQpO1xcbitcXG4rXFx0KmhpZ2hfY2dyb3VwX2lkID0gZ2V0X2Nncm91cF9pZChDR19ISUdIX0RJUik7XFxuK1xcdGlmICghQVNTRVJUX0dUKCpoaWdoX2Nncm91cF9pZCwgMCwgXFxcImdldF9jZ3JvdXBfaWRcXFwiKSlcXG4rXFx0XFx0Z290byBjbGVhbnVwO1xcbitcXG4rXFx0cmV0ID0gY3JlYXRlX2FuZF9nZXRfY2dyb3VwKENHX0xPV19ESVIpO1xcbitcXHRpZiAoIUFTU0VSVF9HRShyZXQsIDAsIFxcXCJjcmVhdGVfYW5kX2dldF9jZ3JvdXAgXFxcIiBDR19MT1dfRElSKSlcXG4rXFx0XFx0Z290byBjbGVhbnVwO1xcbitcXHRjbG9zZShyZXQpO1xcbitcXG4rXFx0Kmxvd19jZ3JvdXBfaWQgPSBnZXRfY2dyb3VwX2lkKENHX0xPV19ESVIpO1xcbitcXHRpZiAoIUFTU0VSVF9HVCgqaGlnaF9jZ3JvdXBfaWQsIDAsIFxcXCJnZXRfY2dyb3VwX2lkXFxcIikpXFxuK1xcdFxcdGdvdG8gY2xlYW51cDtcXG4rXFxuK1xcdHJldHVybiAwO1xcbitcXG4rY2xlYW51cDpcXG4rXFx0Y2xlYW51cF9jZ3JvdXBfZW52aXJvbm1lbnQoKTtcXG4rXFx0cmV0dXJuIC0xO1xcbit9XFxuK1xcbitzdGF0aWMgaW50IHdyaXRlX2ZpbGUoY29uc3QgY2hhciAqZmlsZW5hbWUpXFxuK3tcXG4rXFx0aW50IHJldCA9IC0xO1xcbitcXHRzaXplX3Qgd3JpdHRlbiA9IDA7XFxuK1xcdGNoYXIgKmJ1ZmZlcjtcXG4rXFx0RklMRSAqZnA7XFxuK1xcbitcXHRmcCA9IGZvcGVuKGZpbGVuYW1lLCBcXFwid2JcXFwiKTtcXG4rXFx0aWYgKCFmcClcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcbitcXHRidWZmZXIgPSBtYWxsb2MoQlVGRkVSX1NJWkUpO1xcbitcXHRpZiAoIWJ1ZmZlcilcXG4rXFx0XFx0Z290byBjbGVhbnVwX2ZwO1xcbitcXG4rXFx0bWVtc2V0KGJ1ZmZlciwgJ0EnLCBCVUZGRVJfU0laRSk7XFxuK1xcbitcXHR3aGlsZSAod3JpdHRlbiBcXHUwMDNjIEZJTEVfU0laRSkge1xcbitcXHRcXHRzaXplX3QgdG9fd3JpdGUgPSBGSUxFX1NJWkUgLSB3cml0dGVuIFxcdTAwM2MgQlVGRkVSX1NJWkUgP1xcbitcXHRcXHRcXHRcXHQgIEZJTEVfU0laRSAtIHdyaXR0ZW4gOiBCVUZGRVJfU0laRTtcXG4rXFxuK1xcdFxcdGlmIChmd3JpdGUoYnVmZmVyLCAxLCB0b193cml0ZSwgZnApICE9IHRvX3dyaXRlKVxcbitcXHRcXHRcXHRnb3RvIGNsZWFudXA7XFxuK1xcdFxcdHdyaXR0ZW4gKz0gdG9fd3JpdGU7XFxuK1xcdH1cXG4rXFxuK1xcdHJldCA9IDA7XFxuK2NsZWFudXA6XFxuK1xcdGZyZWUoYnVmZmVyKTtcXG4rY2xlYW51cF9mcDpcXG4rXFx0ZmNsb3NlKGZwKTtcXG4rb3V0OlxcbitcXHRyZXR1cm4gcmV0O1xcbit9XFxuK1xcbitzdGF0aWMgaW50IHJlYWRfZmlsZShjb25zdCBjaGFyICpmaWxlbmFtZSwgaW50IGl0ZXJhdGlvbnMpXFxuK3tcXG4rXFx0aW50IHJldCA9IC0xO1xcbitcXHRsb25nIHBhZ2Vfc2l6ZSA9IHN5c2NvbmYoX1NDX1BBR0VTSVpFKTtcXG4rXFx0Y2hhciAqbWFwO1xcbitcXHRzaXplX3QgaTtcXG4rXFx0aW50IGZkO1xcbitcXHRzdHJ1Y3Qgc3RhdCBzYjtcXG4rXFxuK1xcdGZkID0gb3BlbihmaWxlbmFtZSwgT19SRE9OTFkpO1xcbitcXHRpZiAoZmQgPT0gLTEpXFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXG4rXFx0aWYgKGZzdGF0KGZkLCBcXHUwMDI2c2IpID09IC0xKVxcbitcXHRcXHRnb3RvIGNsZWFudXBfZmQ7XFxuK1xcbitcXHRpZiAoc2Iuc3Rfc2l6ZSAhPSBGSUxFX1NJWkUpIHtcXG4rXFx0XFx0ZnByaW50ZihzdGRlcnIsIFxcXCJGaWxlIHNpemUgbWlzbWF0Y2g6IGV4cGVjdGVkICVsdSwgZ290ICVsdVxcXFxuXFxcIixcXG4rXFx0XFx0XFx0KHVuc2lnbmVkIGxvbmcpRklMRV9TSVpFLCAodW5zaWduZWQgbG9uZylzYi5zdF9zaXplKTtcXG4rXFx0XFx0Z290byBjbGVhbnVwX2ZkO1xcbitcXHR9XFxuK1xcbitcXHRtYXAgPSBtbWFwKE5VTEwsIEZJTEVfU0laRSwgUFJPVF9SRUFELCBNQVBfUFJJVkFURSwgZmQsIDApO1xcbitcXHRpZiAobWFwID09IE1BUF9GQUlMRUQpXFxuK1xcdFxcdGdvdG8gY2xlYW51cF9mZDtcXG4rXFxuK1xcdGZvciAoaW50IGl0ZXIgPSAwOyBpdGVyIFxcdTAwM2MgaXRlcmF0aW9uczsgaXRlcisrKSB7XFxuK1xcdFxcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBGSUxFX1NJWkU7IGkgKz0gcGFnZV9zaXplKSB7XFxuK1xcdFxcdFxcdC8qIGFjY2VzcyBhIGJ5dGUgdG8gdHJpZ2dlciBwYWdlIGZhdWx0ICovXFxuK1xcdFxcdFxcdGFzbSB2b2xhdGlsZShcXFwiXFxcIiA6OiBcXFwiclxcXCIobWFwW2ldKSA6IFxcXCJtZW1vcnlcXFwiKTtcXG4rXFx0XFx0fVxcbitcXHR9XFxuK1xcbitcXHRpZiAobXVubWFwKG1hcCwgRklMRV9TSVpFKSA9PSAtMSlcXG4rXFx0XFx0Z290byBjbGVhbnVwX2ZkO1xcbitcXG4rXFx0cmV0ID0gMDtcXG4rXFxuK2NsZWFudXBfZmQ6XFxuK1xcdGNsb3NlKGZkKTtcXG4rb3V0OlxcbitcXHRyZXR1cm4gcmV0O1xcbit9XFxuK1xcbitzdGF0aWMgaW50IHJlYWxfdGVzdF9jaGlsZF93b3JrKGNvbnN0IGNoYXIgKmNncm91cF9wYXRoLCBjaGFyICpkYXRhX2ZpbGVuYW1lLFxcbitcXHRcXHRcXHRcXHRjaGFyICp0aW1lX2ZpbGVuYW1lLCBpbnQgcmVhZF90aW1lcylcXG4re1xcbitcXHRzdHJ1Y3QgdGltZXZhbCBzdGFydCwgZW5kO1xcbitcXHRkb3VibGUgZWxhcHNlZDtcXG4rXFx0RklMRSAqZnA7XFxuK1xcbitcXHRpZiAoIUFTU0VSVF9PSyhqb2luX3BhcmVudF9jZ3JvdXAoY2dyb3VwX3BhdGgpLCBcXFwiam9pbl9wYXJlbnRfY2dyb3VwXFxcIikpXFxuK1xcdFxcdHJldHVybiAtMTtcXG4rXFxuK1xcdGdldHRpbWVvZmRheShcXHUwMDI2c3RhcnQsIE5VTEwpO1xcbitcXG4rXFx0aWYgKCFBU1NFUlRfT0sod3JpdGVfZmlsZShkYXRhX2ZpbGVuYW1lKSwgXFxcIndyaXRlX2ZpbGVcXFwiKSlcXG4rXFx0XFx0cmV0dXJuIC0xO1xcbitcXG4rXFx0aWYgKCFBU1NFUlRfT0socmVhZF9maWxlKGRhdGFfZmlsZW5hbWUsIHJlYWRfdGltZXMpLCBcXFwicmVhZF9maWxlXFxcIikpXFxuK1xcdFxcdHJldHVybiAtMTtcXG4rXFxuK1xcdGdldHRpbWVvZmRheShcXHUwMDI2ZW5kLCBOVUxMKTtcXG4rXFxuK1xcdGlmICghdGltZV9maWxlbmFtZSlcXG4rXFx0XFx0cmV0dXJuIDA7XFxuK1xcbitcXHRlbGFwc2VkID0gKGVuZC50dl9zZWMgLSBzdGFydC50dl9zZWMpICtcXG4rXFx0XFx0ICAoZW5kLnR2X3VzZWMgLSBzdGFydC50dl91c2VjKSAvIDEwMDAwMDAuMDtcXG4rXFx0cHJpbnRmKFxcXCIlLjZmXFxcXG5cXFwiLCBlbGFwc2VkKTtcXG4rXFxuK1xcdGZwID0gZm9wZW4odGltZV9maWxlbmFtZSwgXFxcIndcXFwiKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0tfUFRSKGZwLCBcXFwiZm9wZW5cXFwiKSlcXG4rXFx0XFx0cmV0dXJuIC0xO1xcbitcXHRmcHJpbnRmKGZwLCBcXFwiJS42ZlxcXCIsIGVsYXBzZWQpO1xcbitcXHRmY2xvc2UoZnApO1xcbitcXG4rXFx0cmV0dXJuIDA7XFxuK31cXG4rXFxuK3N0YXRpYyBpbnQgZ2V0X3RpbWUoY2hhciAqdGltZV9maWxlbmFtZSwgZG91YmxlICp0aW1lKVxcbit7XFxuK1xcdGludCByZXQgPSAtMTtcXG4rXFx0RklMRSAqZnA7XFxuK1xcdGNoYXIgYnVmWzY0XTtcXG4rXFxuK1xcdGZwID0gZm9wZW4odGltZV9maWxlbmFtZSwgXFxcInJcXFwiKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0tfUFRSKGZwLCBcXFwiZm9wZW5cXFwiKSlcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcbitcXHRpZiAoIUFTU0VSVF9PS19QVFIoZmdldHMoYnVmLCBzaXplb2YoYnVmKSwgZnApLCBcXFwiZmdldHNcXFwiKSlcXG4rXFx0XFx0Z290byBjbGVhbnVwO1xcbitcXG4rXFx0aWYgKHNzY2FuZihidWYsIFxcXCIlbGZcXFwiLCB0aW1lKSAhPSAxKSB7XFxuK1xcdFxcdFBSSU5UX0ZBSUwoXFxcInNzY2FuZiAlc1xcXCIsIGJ1Zik7XFxuK1xcdFxcdGdvdG8gY2xlYW51cDtcXG4rXFx0fVxcbitcXG4rXFx0cmV0ID0gMDtcXG4rY2xlYW51cDpcXG4rXFx0ZmNsb3NlKGZwKTtcXG4rb3V0OlxcbitcXHRyZXR1cm4gcmV0O1xcbit9XFxuK1xcbitzdGF0aWMgaW50XFxuK3J1bl9oaWdoX2xvd193b3JrbG9hZChkb3VibGUgKmhpZ2hfZWxhcHNlZCwgZG91YmxlICpsb3dfZWxhcHNlZCwgaW50IHJlYWRfdGltZXMpXFxuK3tcXG4rXFx0Y2hhciB0ZXN0X2RpcltQQVRIX01BWF0sIGhpZ2hfZGF0YV9maWxlW1BBVEhfTUFYXSwgbG93X2RhdGFfZmlsZVtQQVRIX01BWF07XFxuK1xcdGNoYXIgaGlnaF90aW1lX2ZpbGVbUEFUSF9NQVhdLCBsb3dfdGltZV9maWxlW1BBVEhfTUFYXTtcXG4rXFx0aW50IHJldCwgZmQ7XFxuK1xcdHBpZF90IGhpZ2hfcGlkLCBsb3dfcGlkO1xcbitcXHRpbnQgc3RhdHVzO1xcbitcXG4rXFx0cmV0ID0gZ2V0X3Rlc3RfZGlyKHRlc3RfZGlyLCBzaXplb2YodGVzdF9kaXIpKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0socmV0LCBcXFwiZ2V0X3Rlc3RfZGlyOiBubyBub24tdG1wZnMgZGlyZWN0b3J5IGZvdW5kXFxcIikpXFxuK1xcdFxcdHJldHVybiAtMTtcXG4rXFxuK1xcdGZkID0gc25wcmludGYoaGlnaF9kYXRhX2ZpbGUsIHNpemVvZihoaWdoX2RhdGFfZmlsZSksXFxuK1xcdFxcdCAgICAgIFxcXCIlcy9tZW1jZ19hc3luY19oaWdoX2RhdGFfWFhYWFhYXFxcIiwgdGVzdF9kaXIpO1xcbitcXHRpZiAoIUFTU0VSVF9MVChmZCwgc2l6ZW9mKGhpZ2hfZGF0YV9maWxlKSwgXFxcImhpZ2hfZGF0YV9maWxlIHBhdGhcXFwiKSlcXG4rXFx0XFx0cmV0dXJuIC0xO1xcbitcXG4rXFx0ZmQgPSBzbnByaW50Zihsb3dfZGF0YV9maWxlLCBzaXplb2YobG93X2RhdGFfZmlsZSksXFxuK1xcdFxcdCAgICAgIFxcXCIlcy9tZW1jZ19hc3luY19sb3dfZGF0YV9YWFhYWFhcXFwiLCB0ZXN0X2Rpcik7XFxuK1xcdGlmICghQVNTRVJUX0xUKGZkLCBzaXplb2YobG93X2RhdGFfZmlsZSksIFxcXCJsb3dfZGF0YV9maWxlIHBhdGhcXFwiKSlcXG4rXFx0XFx0cmV0dXJuIC0xO1xcbitcXG4rXFx0ZmQgPSBzbnByaW50ZihoaWdoX3RpbWVfZmlsZSwgc2l6ZW9mKGhpZ2hfdGltZV9maWxlKSxcXG4rXFx0XFx0ICAgICAgXFxcIiVzL21lbWNnX2FzeW5jX2hpZ2hfdGltZV9YWFhYWFhcXFwiLCB0ZXN0X2Rpcik7XFxuK1xcdGlmICghQVNTRVJUX0xUKGZkLCBzaXplb2YoaGlnaF90aW1lX2ZpbGUpLCBcXFwiaGlnaF90aW1lX2ZpbGUgcGF0aFxcXCIpKVxcbitcXHRcXHRyZXR1cm4gLTE7XFxuK1xcbitcXHRmZCA9IHNucHJpbnRmKGxvd190aW1lX2ZpbGUsIHNpemVvZihsb3dfdGltZV9maWxlKSxcXG4rXFx0XFx0ICAgICAgXFxcIiVzL21lbWNnX2FzeW5jX2xvd190aW1lX1hYWFhYWFxcXCIsIHRlc3RfZGlyKTtcXG4rXFx0aWYgKCFBU1NFUlRfTFQoZmQsIHNpemVvZihsb3dfdGltZV9maWxlKSwgXFxcImxvd190aW1lX2ZpbGUgcGF0aFxcXCIpKVxcbitcXHRcXHRyZXR1cm4gLTE7XFxuK1xcbitcXHRmZCA9IG1rc3RlbXAoaGlnaF9kYXRhX2ZpbGUpO1xcbitcXHRpZiAoIUFTU0VSVF9HRShmZCwgMCwgXFxcIm1rc3RlbXBcXFwiKSlcXG4rXFx0XFx0cmV0dXJuIC0xO1xcbitcXHRjbG9zZShmZCk7XFxuK1xcbitcXHRmZCA9IG1rc3RlbXAobG93X2RhdGFfZmlsZSk7XFxuK1xcdGlmICghQVNTRVJUX0dFKGZkLCAwLCBcXFwibWtzdGVtcFxcXCIpKVxcbitcXHRcXHRnb3RvIGNsZWFudXBfaGlnaF9kYXRhO1xcbitcXHRjbG9zZShmZCk7XFxuK1xcbitcXHRmZCA9IG1rc3RlbXAoaGlnaF90aW1lX2ZpbGUpO1xcbitcXHRpZiAoIUFTU0VSVF9HRShmZCwgMCwgXFxcIm1rc3RlbXBcXFwiKSlcXG4rXFx0XFx0Z290byBjbGVhbnVwX2xvd19kYXRhO1xcbitcXHRjbG9zZShmZCk7XFxuK1xcbitcXHRmZCA9IG1rc3RlbXAobG93X3RpbWVfZmlsZSk7XFxuK1xcdGlmICghQVNTRVJUX0dFKGZkLCAwLCBcXFwibWtzdGVtcFxcXCIpKVxcbitcXHRcXHRnb3RvIGNsZWFudXBfaGlnaF90aW1lO1xcbitcXHRjbG9zZShmZCk7XFxuK1xcbitcXHRsb3dfcGlkID0gZm9yaygpO1xcbitcXHRpZiAoIUFTU0VSVF9HRShsb3dfcGlkLCAwLCBcXFwiZm9yayBsb3dcXFwiKSlcXG4rXFx0XFx0Z290byBjbGVhbnVwX2xvd190aW1lO1xcbitcXHRpZiAobG93X3BpZCA9PSAwKVxcbitcXHRcXHRleGl0KHJlYWxfdGVzdF9jaGlsZF93b3JrKENHX0xPV19ESVIsIGxvd19kYXRhX2ZpbGUsXFxuK1xcdFxcdFxcdFxcdFxcdCAgbG93X3RpbWVfZmlsZSwgcmVhZF90aW1lcykpO1xcbitcXG4rXFx0aGlnaF9waWQgPSBmb3JrKCk7XFxuK1xcdGlmICghQVNTRVJUX0dFKGhpZ2hfcGlkLCAwLCBcXFwiZm9yayBoaWdoXFxcIikpIHtcXG4rXFx0XFx0KHZvaWQpd2FpdHBpZChsb3dfcGlkLCBOVUxMLCAwKTtcXG4rXFx0XFx0Z290byBjbGVhbnVwX2xvd190aW1lO1xcbitcXHR9XFxuK1xcdGlmIChoaWdoX3BpZCA9PSAwKVxcbitcXHRcXHRleGl0KHJlYWxfdGVzdF9jaGlsZF93b3JrKENHX0hJR0hfRElSLCBoaWdoX2RhdGFfZmlsZSxcXG4rXFx0XFx0XFx0XFx0XFx0ICBoaWdoX3RpbWVfZmlsZSwgcmVhZF90aW1lcykpO1xcbitcXG4rXFx0cmV0ID0gd2FpdHBpZChsb3dfcGlkLCBcXHUwMDI2c3RhdHVzLCAwKTtcXG4rXFx0aWYgKCFBU1NFUlRfR1QocmV0LCAwLCBcXFwibG93IHdhaXRwaWRcXFwiKSlcXG4rXFx0XFx0Z290byBjbGVhbnVwX2xvd190aW1lO1xcbitcXHRpZiAoIUFTU0VSVF9UUlVFKFdJRkVYSVRFRChzdGF0dXMpLCBcXFwibG93IGV4aXRlZFxcXCIpKVxcbitcXHRcXHRnb3RvIGNsZWFudXBfbG93X3RpbWU7XFxuK1xcdGlmICghQVNTRVJUX0VRKFdFWElUU1RBVFVTKHN0YXR1cyksIDAsIFxcXCJsb3cgZXhpdCBzdGF0dXNcXFwiKSlcXG4rXFx0XFx0Z290byBjbGVhbnVwX2xvd190aW1lO1xcbitcXG4rXFx0cmV0ID0gd2FpdHBpZChoaWdoX3BpZCwgXFx1MDAyNnN0YXR1cywgMCk7XFxuK1xcdGlmICghQVNTRVJUX0dUKHJldCwgMCwgXFxcImhpZ2ggd2FpdHBpZFxcXCIpKVxcbitcXHRcXHRnb3RvIGNsZWFudXBfbG93X3RpbWU7XFxuK1xcdGlmICghQVNTRVJUX1RSVUUoV0lGRVhJVEVEKHN0YXR1cyksIFxcXCJoaWdoIGV4aXRlZFxcXCIpKVxcbitcXHRcXHRnb3RvIGNsZWFudXBfbG93X3RpbWU7XFxuK1xcdGlmICghQVNTRVJUX0VRKFdFWElUU1RBVFVTKHN0YXR1cyksIDAsIFxcXCJoaWdoIGV4aXQgc3RhdHVzXFxcIikpXFxuK1xcdFxcdGdvdG8gY2xlYW51cF9sb3dfdGltZTtcXG4rXFxuK1xcdGlmIChnZXRfdGltZShoaWdoX3RpbWVfZmlsZSwgaGlnaF9lbGFwc2VkKSlcXG4rXFx0XFx0Z290byBjbGVhbnVwX2xvd190aW1lO1xcbitcXHRpZiAoZ2V0X3RpbWUobG93X3RpbWVfZmlsZSwgbG93X2VsYXBzZWQpKVxcbitcXHRcXHRnb3RvIGNsZWFudXBfbG93X3RpbWU7XFxuK1xcbitcXHRyZXQgPSAwO1xcbitcXG4rY2xlYW51cF9sb3dfdGltZTpcXG4rXFx0dW5saW5rKGxvd190aW1lX2ZpbGUpO1xcbitjbGVhbnVwX2hpZ2hfdGltZTpcXG4rXFx0dW5saW5rKGhpZ2hfdGltZV9maWxlKTtcXG4rY2xlYW51cF9sb3dfZGF0YTpcXG4rXFx0dW5saW5rKGxvd19kYXRhX2ZpbGUpO1xcbitjbGVhbnVwX2hpZ2hfZGF0YTpcXG4rXFx0dW5saW5rKGhpZ2hfZGF0YV9maWxlKTtcXG4rXFx0cmV0dXJuIHJldDtcXG4rfVxcbitcXG4rc3RhdGljIGludFxcbitzZXR1cF9icGYodTY0IGhpZ2hfY2dyb3VwX2lkLCB1NjQgbG93X2Nncm91cF9pZCxcXG4rXFx0ICBzdHJ1Y3QgbWVtY2dfYXN5bmNfcmVjbGFpbSAqKnNrZWxfcHRyLCBib29sIHVzZV90aHJlYWRfd3EpXFxuK3tcXG4rXFx0c3RydWN0IG1lbWNnX2FzeW5jX3JlY2xhaW0gKnNrZWw7XFxuK1xcdHN0cnVjdCBicGZfYXJnc19zIGJwZl9hcmdzID0ge1xcbitcXHRcXHQuaGlnaF9jZ3JvdXBfaWQgPSBoaWdoX2Nncm91cF9pZCxcXG4rXFx0XFx0Lmxvd19jZ3JvdXBfaWQgPSBsb3dfY2dyb3VwX2lkLFxcbitcXHRcXHQuZXZlbnRfZGVsdGFfdGhyZXNob2xkID0gRVZFTlRfREVMVEFfVEhSRVNIT0xELFxcbitcXHRcXHQuY2hlY2tfbnMgPSBDSEVDS19QRVJJT0RfTlMsXFxuK1xcdH07XFxuK1xcdExJQkJQRl9PUFRTKGJwZl90ZXN0X3J1bl9vcHRzLCBydW5fb3B0cyxcXG4rXFx0XFx0LmN0eF9pbiA9IFxcdTAwMjZicGZfYXJncyxcXG4rXFx0XFx0LmN0eF9zaXplX2luID0gc2l6ZW9mKGJwZl9hcmdzKSk7XFxuK1xcdGludCBwcm9nX2luaXRfZmQsIGVycjtcXG4rXFxuK1xcdHNrZWwgPSBtZW1jZ19hc3luY19yZWNsYWltX19vcGVuX2FuZF9sb2FkKCk7XFxuK1xcdGlmICghQVNTRVJUX09LX1BUUihza2VsLCBcXFwibWVtY2dfYXN5bmNfcmVjbGFpbV9fb3Blbl9hbmRfbG9hZFxcXCIpKVxcbitcXHRcXHRyZXR1cm4gLTE7XFxuK1xcbitcXHRpZiAodXNlX3RocmVhZF93cSlcXG4rXFx0XFx0cHJvZ19pbml0X2ZkID0gYnBmX3Byb2dyYW1fX2ZkKHNrZWwtXFx1MDAzZXByb2dzLnRocmVhZF93cV9wcm9nX2luaXQpO1xcbitcXHRlbHNlXFxuK1xcdFxcdHByb2dfaW5pdF9mZCA9IGJwZl9wcm9ncmFtX19mZChza2VsLVxcdTAwM2Vwcm9ncy53cV9wcm9nX2luaXQpO1xcbitcXHRpZiAoIUFTU0VSVF9HRShwcm9nX2luaXRfZmQsIDAsIFxcXCJicGZfcHJvZ3JhbV9fZmRcXFwiKSlcXG4rXFx0XFx0Z290byBlcnJvcl9vdXQ7XFxuK1xcbitcXHRlcnIgPSBicGZfcHJvZ190ZXN0X3J1bl9vcHRzKHByb2dfaW5pdF9mZCwgXFx1MDAyNnJ1bl9vcHRzKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0soZXJyLCBcXFwiYnBmX3Byb2dfdGVzdF9ydW5fb3B0c1xcXCIpKVxcbitcXHRcXHRnb3RvIGVycm9yX291dDtcXG4rXFx0aWYgKCFBU1NFUlRfRVEocnVuX29wdHMucmV0dmFsLCAwLCBcXFwicHJvZ19pbml0IHJldHZhbFxcXCIpKVxcbitcXHRcXHRnb3RvIGVycm9yX291dDtcXG4rXFxuK1xcdCpza2VsX3B0ciA9IHNrZWw7XFxuK1xcdHJldHVybiAwO1xcbitcXG4rZXJyb3Jfb3V0OlxcbitcXHRtZW1jZ19hc3luY19yZWNsYWltX19kZXN0cm95KHNrZWwpO1xcbitcXHRyZXR1cm4gLTE7XFxuK31cXG4rXFxuK3ZvaWQgdGVzdF9tZW1jZ193cV9hc3luY19yZWNsYWltKHZvaWQpXFxuK3tcXG4rXFx0dTY0IGhpZ2hfY2dyb3VwX2lkLCBsb3dfY2dyb3VwX2lkO1xcbitcXHRpbnQgZXJyO1xcbitcXHRkb3VibGUgaGlnaF90aW1lID0gMC4wLCBsb3dfdGltZSA9IDAuMDtcXG4rXFx0c3RydWN0IG1lbWNnX2FzeW5jX3JlY2xhaW0gKnNrZWwgPSBOVUxMO1xcbitcXG4rXFx0ZXJyID0gc2V0dXBfaGlnaF9sb3dfY2dyb3VwcyhcXHUwMDI2aGlnaF9jZ3JvdXBfaWQsIFxcdTAwMjZsb3dfY2dyb3VwX2lkKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0soZXJyLCBcXFwic2V0dXBfaGlnaF9sb3dfY2dyb3VwcyByZWNsYWltXFxcIikpXFxuK1xcdFxcdHJldHVybjtcXG4rXFxuK1xcdGVyciA9IHNldHVwX2JwZihoaWdoX2Nncm91cF9pZCwgbG93X2Nncm91cF9pZCwgXFx1MDAyNnNrZWwsIGZhbHNlKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0soZXJyLCBcXFwic2V0dXBfYnBmXFxcIikpXFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXG4rXFx0ZXJyID0gcnVuX2hpZ2hfbG93X3dvcmtsb2FkKFxcdTAwMjZoaWdoX3RpbWUsIFxcdTAwMjZsb3dfdGltZSwgUkVBRF9USU1FUyk7XFxuK1xcdGlmICghQVNTRVJUX09LKGVyciwgXFxcInJ1bl9oaWdoX2xvd193b3JrbG9hZCByZWNsYWltXFxcIikpXFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXG4rXFx0aWYgKGhpZ2hfdGltZSBcXHUwMDNlPSBsb3dfdGltZSkge1xcbitcXHRcXHRQUklOVF9GQUlMKFxcXCJoaWdoIGNncm91cCBub3QgaW1wcm92ZWQgd2l0aCBhc3luYyByZWNsYWltOiBoaWdoX3RpbWU9JWYgbG93X3RpbWU9JWZcXFwiLFxcbitcXHRcXHRcXHQgICBoaWdoX3RpbWUsIGxvd190aW1lKTtcXG4rXFx0fVxcbitcXG4rb3V0OlxcbitcXHRpZiAoc2tlbClcXG4rXFx0XFx0bWVtY2dfYXN5bmNfcmVjbGFpbV9fZGVzdHJveShza2VsKTtcXG4rXFx0LypcXG4rXFx0ICogV2FpdCBmb3IgYnBmX3dxIHRvIHJlbGVhc2UgdGhlIHJlZmVyZW5jZSB0byBjZ3JvdXBcXG4rXFx0ICogdG8gZW5zdXJlIHRoZSBzdWNjZXNzZnVsIGRlbGV0aW9uIG9mIGNncm91cC5cXG4rXFx0ICovXFxuK1xcdHNsZWVwKDEpO1xcbitcXHRjbGVhbnVwX2Nncm91cF9lbnZpcm9ubWVudCgpO1xcbit9XFxuK1xcbit2b2lkIHRlc3RfbWVtY2dfdGhyZWFkX3dxX2FzeW5jX3JlY2xhaW0odm9pZClcXG4re1xcbitcXHR1NjQgaGlnaF9jZ3JvdXBfaWQsIGxvd19jZ3JvdXBfaWQ7XFxuK1xcdGludCBlcnI7XFxuK1xcdGRvdWJsZSBoaWdoX3RpbWUgPSAwLjAsIGxvd190aW1lID0gMC4wO1xcbitcXHRzdHJ1Y3QgbWVtY2dfYXN5bmNfcmVjbGFpbSAqc2tlbCA9IE5VTEw7XFxuK1xcbitcXHRlcnIgPSBzZXR1cF9oaWdoX2xvd19jZ3JvdXBzKFxcdTAwMjZoaWdoX2Nncm91cF9pZCwgXFx1MDAyNmxvd19jZ3JvdXBfaWQpO1xcbitcXHRpZiAoIUFTU0VSVF9PSyhlcnIsIFxcXCJzZXR1cF9oaWdoX2xvd19jZ3JvdXBzIHJlY2xhaW1cXFwiKSlcXG4rXFx0XFx0cmV0dXJuO1xcbitcXG4rXFx0ZXJyID0gc2V0dXBfYnBmKGhpZ2hfY2dyb3VwX2lkLCBsb3dfY2dyb3VwX2lkLCBcXHUwMDI2c2tlbCwgdHJ1ZSk7XFxuK1xcdGlmICghQVNTRVJUX09LKGVyciwgXFxcInNldHVwX2JwZlxcXCIpKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFxuK1xcdGVyciA9IHJ1bl9oaWdoX2xvd193b3JrbG9hZChcXHUwMDI2aGlnaF90aW1lLCBcXHUwMDI2bG93X3RpbWUsIFJFQURfVElNRVMpO1xcbitcXHRpZiAoIUFTU0VSVF9PSyhlcnIsIFxcXCJydW5faGlnaF9sb3dfd29ya2xvYWQgcmVjbGFpbVxcXCIpKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFxuK1xcdGlmIChoaWdoX3RpbWUgXFx1MDAzZT0gbG93X3RpbWUpIHtcXG4rXFx0XFx0UFJJTlRfRkFJTChcXFwiaGlnaCBjZ3JvdXAgbm90IGltcHJvdmVkIHdpdGggYXN5bmMgcmVjbGFpbTogaGlnaF90aW1lPSVmIGxvd190aW1lPSVmXFxcIixcXG4rXFx0XFx0XFx0ICAgaGlnaF90aW1lLCBsb3dfdGltZSk7XFxuK1xcdH1cXG4rXFxuK291dDpcXG4rXFx0aWYgKHNrZWwpXFxuK1xcdFxcdG1lbWNnX2FzeW5jX3JlY2xhaW1fX2Rlc3Ryb3koc2tlbCk7XFxuK1xcdC8qXFxuK1xcdCAqIFdhaXQgZm9yIGJwZl90aHJlYWRfd3EgdG8gcmVsZWFzZSB0aGUgcmVmZXJlbmNlIHRvIGNncm91cFxcbitcXHQgKiB0byBlbnN1cmUgdGhlIHN1Y2Nlc3NmdWwgZGVsZXRpb24gb2YgY2dyb3VwLlxcbitcXHQgKi9cXG4rXFx0c2xlZXAoMSk7XFxuK1xcdGNsZWFudXBfY2dyb3VwX2Vudmlyb25tZW50KCk7XFxuK31cXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvdGhyZWFkX3dxX2Nncm91cC5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvdGhyZWFkX3dxX2Nncm91cC5jXFxubmV3IGZpbGUgbW9kZSAxMDA2NDRcXG5pbmRleCAwMDAwMDAwMDAwMDAwLi43NTM3YjAzZjE3ZTJhXFxuLS0tIC9kZXYvbnVsbFxcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL3RocmVhZF93cV9jZ3JvdXAuY1xcbkBAIC0wLDAgKzEsODcgQEBcXG4rLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcXG4rI2luY2x1ZGUgXFx1MDAzY3Rlc3RfcHJvZ3MuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY3VuaXN0ZC5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXFwiY2dyb3VwX2hlbHBlcnMuaFxcXCJcXG4rI2luY2x1ZGUgXFxcInRocmVhZF93cV9jZ3JvdXAuc2tlbC5oXFxcIlxcbitcXG4rI2RlZmluZSBURVNUX0NHUk9VUCBcXFwiL3RocmVhZF93cV90ZXN0XFxcIlxcbisjZGVmaW5lIFdBSVRfVElNRU9VVF9TRUNTIDMwXFxuK1xcbit2b2lkIHRlc3RfdGhyZWFkX3dxX2Nncm91cCh2b2lkKVxcbit7XFxuK1xcdHN0cnVjdCB0aHJlYWRfd3FfY2dyb3VwICpza2VsID0gTlVMTDtcXG4rXFx0aW50IGVyciwgcHJvZ19mZCwgY2dfZmQgPSAtMTtcXG4rXFx0dW5zaWduZWQgbG9uZyBsb25nIGNnX2lkO1xcbitcXHRpbnQgd2FpdGVkX3NlY3M7XFxuK1xcbitcXHRMSUJCUEZfT1BUUyhicGZfdGVzdF9ydW5fb3B0cywgdG9wdHMpO1xcbitcXG4rXFx0ZXJyID0gc2V0dXBfY2dyb3VwX2Vudmlyb25tZW50KCk7XFxuK1xcdGlmICghQVNTRVJUX09LKGVyciwgXFxcInNldHVwX2Nncm91cF9lbnZpcm9ubWVudFxcXCIpKVxcbitcXHRcXHRyZXR1cm47XFxuK1xcdGNnX2ZkID0gY3JlYXRlX2FuZF9nZXRfY2dyb3VwKFRFU1RfQ0dST1VQKTtcXG4rXFx0aWYgKCFBU1NFUlRfR0UoY2dfZmQsIDAsIFxcXCJjcmVhdGVfYW5kX2dldF9jZ3JvdXBcXFwiKSlcXG4rXFx0XFx0Z290byBjbGVhbnVwO1xcbitcXHRjZ19pZCA9IGdldF9jZ3JvdXBfaWQoVEVTVF9DR1JPVVApO1xcbitcXHRpZiAoIUFTU0VSVF9HVChjZ19pZCwgMFVMTCwgXFxcImdldF9jZ3JvdXBfaWRcXFwiKSlcXG4rXFx0XFx0Z290byBjbGVhbnVwO1xcbitcXG4rXFx0c2tlbCA9IHRocmVhZF93cV9jZ3JvdXBfX29wZW5fYW5kX2xvYWQoKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0tfUFRSKHNrZWwsIFxcXCJvcGVuX2FuZF9sb2FkXFxcIikpXFxuK1xcdFxcdGdvdG8gY2xlYW51cDtcXG4rXFxuK1xcdHByb2dfZmQgPSBicGZfcHJvZ3JhbV9fZmQoc2tlbC1cXHUwMDNlcHJvZ3Muc3RhcnRfdGhyZWFkX3dxKTtcXG4rXFxuK1xcdC8qIFJ1biBicGZfdGhyZWFkX3dxIGluIHRoZSBzcGVjaWZpZWQgY2dyb3VwLiAqL1xcbitcXHRza2VsLVxcdTAwM2Vic3MtXFx1MDAzZXRlc3Rfa2V5ID0gMDtcXG4rXFx0c2tlbC1cXHUwMDNlYnNzLVxcdTAwM2V0YXJnZXRfY2dyb3VwX2lkID0gY2dfaWQ7XFxuK1xcdHNrZWwtXFx1MDAzZWJzcy1cXHUwMDNlY2FsbGJhY2tfY2dyb3VwX2lkID0gMDtcXG4rXFx0c2tlbC1cXHUwMDNlYnNzLVxcdTAwM2V0d3FfZG9uZSA9IDA7XFxuK1xcdGlmICghQVNTRVJUX09LKGJwZl9wcm9nX3Rlc3RfcnVuX29wdHMocHJvZ19mZCwgXFx1MDAyNnRvcHRzKSxcXG4rXFx0XFx0ICAgICAgIFxcXCJicGZfcHJvZ190ZXN0X3J1bl9vcHRzIGluIGNncm91cFxcXCIpKVxcbitcXHRcXHRnb3RvIGNsZWFudXA7XFxuK1xcdGlmICghQVNTRVJUX09LKHRvcHRzLnJldHZhbCwgXFxcInJldHZhbCBpbiBjZ3JvdXBcXFwiKSlcXG4rXFx0XFx0Z290byBjbGVhbnVwO1xcbitcXHRmb3IgKHdhaXRlZF9zZWNzID0gMDsgd2FpdGVkX3NlY3MgXFx1MDAzYyBXQUlUX1RJTUVPVVRfU0VDUzsgd2FpdGVkX3NlY3MrKykge1xcbitcXHRcXHRpZiAoc2tlbC1cXHUwMDNlYnNzLVxcdTAwM2V0d3FfZG9uZSlcXG4rXFx0XFx0XFx0YnJlYWs7XFxuK1xcdFxcdHNsZWVwKDEpO1xcbitcXHR9XFxuK1xcdGlmICghQVNTRVJUX1RSVUUoc2tlbC1cXHUwMDNlYnNzLVxcdTAwM2V0d3FfZG9uZSwgXFxcInR3cV9kb25lIGluIGNncm91cFxcXCIpKVxcbitcXHRcXHRnb3RvIGNsZWFudXA7XFxuK1xcdGlmICghQVNTRVJUX0VRKHNrZWwtXFx1MDAzZWJzcy1cXHUwMDNlY2FsbGJhY2tfY2dyb3VwX2lkLCBjZ19pZCxcXG4rXFx0XFx0ICAgICAgIFxcXCJjYWxsYmFja19jZ3JvdXBfaWQgaW4gY2dyb3VwXFxcIikpXFxuK1xcdFxcdGdvdG8gY2xlYW51cDtcXG4rXFxuK1xcdC8qIFJ1biBicGZfdGhyZWFkX3dxIHdpdGhvdXQgY2dyb3VwIGF0dGFjaG1lbnQgKGNncm91cF9pZCA9IDApLiAqL1xcbitcXHRMSUJCUEZfT1BUU19SRVNFVCh0b3B0cyk7XFxuK1xcdHNrZWwtXFx1MDAzZWJzcy1cXHUwMDNldGVzdF9rZXkgPSAxO1xcbitcXHRza2VsLVxcdTAwM2Vic3MtXFx1MDAzZXRhcmdldF9jZ3JvdXBfaWQgPSAwO1xcbitcXHRza2VsLVxcdTAwM2Vic3MtXFx1MDAzZWNhbGxiYWNrX2Nncm91cF9pZCA9IDA7XFxuK1xcdHNrZWwtXFx1MDAzZWJzcy1cXHUwMDNldHdxX2RvbmUgPSAwO1xcbitcXHRpZiAoIUFTU0VSVF9PSyhicGZfcHJvZ190ZXN0X3J1bl9vcHRzKHByb2dfZmQsIFxcdTAwMjZ0b3B0cyksXFxuK1xcdFxcdCAgICAgICBcXFwiYnBmX3Byb2dfdGVzdF9ydW5fb3B0cyB3aXRob3V0IGNncm91cFxcXCIpKVxcbitcXHRcXHRnb3RvIGNsZWFudXA7XFxuK1xcdGlmICghQVNTRVJUX09LKHRvcHRzLnJldHZhbCwgXFxcInJldHZhbCB3aXRob3V0IGNncm91cFxcXCIpKVxcbitcXHRcXHRnb3RvIGNsZWFudXA7XFxuK1xcdGZvciAod2FpdGVkX3NlY3MgPSAwOyB3YWl0ZWRfc2VjcyBcXHUwMDNjIFdBSVRfVElNRU9VVF9TRUNTOyB3YWl0ZWRfc2VjcysrKSB7XFxuK1xcdFxcdGlmIChza2VsLVxcdTAwM2Vic3MtXFx1MDAzZXR3cV9kb25lKVxcbitcXHRcXHRcXHRicmVhaztcXG4rXFx0XFx0c2xlZXAoMSk7XFxuK1xcdH1cXG4rXFx0aWYgKCFBU1NFUlRfVFJVRShza2VsLVxcdTAwM2Vic3MtXFx1MDAzZXR3cV9kb25lLCBcXFwidHdxX2RvbmUgd2l0aG91dCBjZ3JvdXBcXFwiKSlcXG4rXFx0XFx0Z290byBjbGVhbnVwO1xcbitcXHRpZiAoIUFTU0VSVF9ORVEoc2tlbC1cXHUwMDNlYnNzLVxcdTAwM2VjYWxsYmFja19jZ3JvdXBfaWQsIGNnX2lkLFxcbitcXHRcXHRcXHRcXFwiY2FsbGJhY2tfY2dyb3VwX2lkIHdpdGhvdXQgY2dyb3VwXFxcIikpXFxuK1xcdFxcdGdvdG8gY2xlYW51cDtcXG4rXFxuK2NsZWFudXA6XFxuK1xcdGlmIChza2VsKSB7XFxuK1xcdFxcdHRocmVhZF93cV9jZ3JvdXBfX2Rlc3Ryb3koc2tlbCk7XFxuK1xcdFxcdC8qIFdhaXQgdGhyZWFkX3dxIGt0aHJlYWQgcXVpdC4gKi9cXG4rXFx0XFx0c2xlZXAoMik7XFxuK1xcdH1cXG4rXFx0aWYgKGNnX2ZkIFxcdTAwM2U9IDApXFxuK1xcdFxcdGNsb3NlKGNnX2ZkKTtcXG4rXFx0Y2xlYW51cF9jZ3JvdXBfZW52aXJvbm1lbnQoKTtcXG4rfVxcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvbWVtY2dfYXN5bmNfcmVjbGFpbS5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL21lbWNnX2FzeW5jX3JlY2xhaW0uY1xcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uZWFjY2M4YTM3Mzg4Ylxcbi0tLSAvZGV2L251bGxcXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvbWVtY2dfYXN5bmNfcmVjbGFpbS5jXFxuQEAgLTAsMCArMSwyNTUgQEBcXG4rLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcXG4rXFxuKyNpbmNsdWRlIFxcXCJ2bWxpbnV4LmhcXFwiXFxuKyNpbmNsdWRlIFxcXCJicGZfZXhwZXJpbWVudGFsLmhcXFwiXFxuKyNpbmNsdWRlIFxcdTAwM2NicGYvYnBmX2hlbHBlcnMuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2JwZi9icGZfdHJhY2luZy5oXFx1MDAzZVxcbitcXG4rI2RlZmluZSBCSVQobnIpXFx0XFx0XFx0KDFVTCBcXHUwMDNjXFx1MDAzYyAobnIpKVxcbitcXG4rI2RlZmluZSBfX19HRlBfSU9cXHRcXHRCSVQoX19fR0ZQX0lPX0JJVClcXG4rI2RlZmluZSBfX19HRlBfRlNcXHRcXHRCSVQoX19fR0ZQX0ZTX0JJVClcXG4rI2RlZmluZSBfX19HRlBfRElSRUNUX1JFQ0xBSU1cXHRCSVQoX19fR0ZQX0RJUkVDVF9SRUNMQUlNX0JJVClcXG4rI2RlZmluZSBfX19HRlBfS1NXQVBEX1JFQ0xBSU1cXHRCSVQoX19fR0ZQX0tTV0FQRF9SRUNMQUlNX0JJVClcXG4rXFxuKyNkZWZpbmUgX19HRlBfSU9cXHRcXHQoKGdmcF90KV9fX0dGUF9JTylcXG4rI2RlZmluZSBfX0dGUF9GU1xcdFxcdCgoZ2ZwX3QpX19fR0ZQX0ZTKVxcbisjZGVmaW5lIF9fR0ZQX0RJUkVDVF9SRUNMQUlNXFx0KChnZnBfdClfX19HRlBfRElSRUNUX1JFQ0xBSU0pXFxuKyNkZWZpbmUgX19HRlBfS1NXQVBEX1JFQ0xBSU1cXHQoKGdmcF90KV9fX0dGUF9LU1dBUERfUkVDTEFJTSlcXG4rI2RlZmluZSBfX0dGUF9SRUNMQUlNXFx0KChnZnBfdCkoX19fR0ZQX0RJUkVDVF9SRUNMQUlNIHwgX19fR0ZQX0tTV0FQRF9SRUNMQUlNKSlcXG4rXFxuKyNkZWZpbmUgR0ZQX0tFUk5FTFxcdChfX0dGUF9SRUNMQUlNIHwgX19HRlBfSU8gfCBfX0dGUF9GUylcXG4rI2RlZmluZSBDTE9DS19NT05PVE9OSUNfSURcXHQxXFxuKyNkZWZpbmUgUkVDTEFJTV9QQUdFU1xcdFxcdDMyXFxuKyNkZWZpbmUgUkVDTEFJTV9NQVhfSVRFUlxcdDMyXFxuK1xcbitzdHJ1Y3QgYnBmX2FyZ3NfcyB7XFxuK1xcdHU2NCBoaWdoX2Nncm91cF9pZDtcXG4rXFx0dTY0IGxvd19jZ3JvdXBfaWQ7XFxuK1xcdHU2NCBldmVudF9kZWx0YV90aHJlc2hvbGQ7XFxuK1xcdHU2NCBjaGVja19ucztcXG4rfTtcXG4rXFxuK3N0cnVjdCBjZ3JvdXBfbWVtY2cge1xcbitcXHRzdHJ1Y3QgY2dyb3VwICpjZ3JwO1xcbitcXHRzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2c7XFxuK307XFxuK1xcbitzdGF0aWMgdTY0IHdxX2hpZ2hfY2dyb3VwX2lkO1xcbitzdGF0aWMgdTY0IHdxX2xvd19jZ3JvdXBfaWQ7XFxuK1xcbitzdGF0aWMgaW50IGdldF9jZ3JvdXBfbWVtY2dfZnJvbV9pZCh1NjQgY2dyb3VwX2lkLCBzdHJ1Y3QgY2dyb3VwX21lbWNnICpjbSlcXG4re1xcbitcXHRjbS1cXHUwMDNlY2dycCA9IGJwZl9jZ3JvdXBfZnJvbV9pZChjZ3JvdXBfaWQpO1xcbitcXHRpZiAoIWNtLVxcdTAwM2VjZ3JwKVxcbitcXHRcXHRyZXR1cm4gLTE7XFxuK1xcbitcXHRjbS1cXHUwMDNlbWVtY2cgPSBicGZfZ2V0X21lbV9jZ3JvdXAoXFx1MDAyNmNtLVxcdTAwM2VjZ3JwLVxcdTAwM2VzZWxmKTtcXG4rXFx0aWYgKCFjbS1cXHUwMDNlbWVtY2cpIHtcXG4rXFx0XFx0YnBmX2Nncm91cF9yZWxlYXNlKGNtLVxcdTAwM2VjZ3JwKTtcXG4rXFx0XFx0cmV0dXJuIC0xO1xcbitcXHR9XFxuK1xcbitcXHRyZXR1cm4gMDtcXG4rfVxcbitcXG4rc3RhdGljIHZvaWQgcHV0X2Nncm91cF9tZW1jZyhzdHJ1Y3QgY2dyb3VwX21lbWNnICpjbSlcXG4re1xcbitcXHRicGZfcHV0X21lbV9jZ3JvdXAoY20tXFx1MDAzZW1lbWNnKTtcXG4rXFx0YnBmX2Nncm91cF9yZWxlYXNlKGNtLVxcdTAwM2VjZ3JwKTtcXG4rfVxcbitcXG4rc3RhdGljIGludCBnZXRfY2dyb3VwX2V2ZW50KHU2NCBjZ3JvdXBfaWQsIHU2NCAqdmFsKVxcbit7XFxuK1xcdHN0cnVjdCBjZ3JvdXBfbWVtY2cgY207XFxuK1xcbitcXHRpZiAoZ2V0X2Nncm91cF9tZW1jZ19mcm9tX2lkKGNncm91cF9pZCwgXFx1MDAyNmNtKSlcXG4rXFx0XFx0cmV0dXJuIC0xO1xcbitcXHRicGZfbWVtX2Nncm91cF9mbHVzaF9zdGF0cyhjbS5tZW1jZyk7XFxuK1xcdCp2YWwgPSBicGZfbWVtX2Nncm91cF9wYWdlX3N0YXRlKGNtLm1lbWNnLCBXT1JLSU5HU0VUX1JFRkFVTFRfRklMRSk7XFxuK1xcdHB1dF9jZ3JvdXBfbWVtY2coXFx1MDAyNmNtKTtcXG4rXFxuK1xcdHJldHVybiAwO1xcbit9XFxuK1xcbitzdGF0aWMgYm9vbFxcbitzaG91bGRfcmVjbGFpbV9jZ3JvdXAodTY0IGNncm91cF9pZCwgdTY0ICpwcmV2X2V2ZW50LCB1NjQgZXZlbnRfZGVsdGFfdGhyZXNob2xkKVxcbit7XFxuK1xcdHU2NCBjdXIsIGRlbHRhO1xcbitcXG4rXFx0aWYgKGdldF9jZ3JvdXBfZXZlbnQoY2dyb3VwX2lkLCBcXHUwMDI2Y3VyKSlcXG4rXFx0XFx0cmV0dXJuIGZhbHNlO1xcbitcXG4rXFx0ZGVsdGEgPSBjdXIgLSAqcHJldl9ldmVudDtcXG4rXFx0KnByZXZfZXZlbnQgPSBjdXI7XFxuK1xcbitcXHRyZXR1cm4gZGVsdGEgXFx1MDAzZT0gZXZlbnRfZGVsdGFfdGhyZXNob2xkO1xcbit9XFxuK1xcbitzdGF0aWMgaW50IHJlY2xhaW1fY2dyb3VwKHU2NCBjZ3JvdXBfaWQpXFxuK3tcXG4rXFx0c3RydWN0IGNncm91cF9tZW1jZyBjbTtcXG4rXFx0aW50IGk7XFxuK1xcbitcXHRpZiAoZ2V0X2Nncm91cF9tZW1jZ19mcm9tX2lkKGNncm91cF9pZCwgXFx1MDAyNmNtKSlcXG4rXFx0XFx0cmV0dXJuIDA7XFxuK1xcbitcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgUkVDTEFJTV9NQVhfSVRFUjsgaSsrKSB7XFxuK1xcdFxcdGlmICghYnBmX3RyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMoY20ubWVtY2csIFJFQ0xBSU1fUEFHRVMsXFxuK1xcdFxcdFxcdFxcdFxcdFxcdCAgICAgIEdGUF9LRVJORUwsIDAsIC0xKSlcXG4rXFx0XFx0XFx0YnJlYWs7XFxuK1xcdH1cXG4rXFxuK1xcdHB1dF9jZ3JvdXBfbWVtY2coXFx1MDAyNmNtKTtcXG4rXFxuK1xcdHJldHVybiAwO1xcbit9XFxuK1xcbitzdHJ1Y3Qgd3FfZWxlbSB7XFxuK1xcdHN0cnVjdCBicGZfdGltZXIgdGltZXI7XFxuK1xcdHN0cnVjdCBicGZfd3Egd29yaztcXG4rXFx0dTY0IHByZXZfZXZlbnQ7XFxuK1xcdHU2NCBldmVudF9kZWx0YV90aHJlc2hvbGQ7XFxuK1xcdHU2NCBjaGVja19ucztcXG4rfTtcXG4rXFxuK3N0cnVjdCB7XFxuK1xcdF9fdWludCh0eXBlLCBCUEZfTUFQX1RZUEVfQVJSQVkpO1xcbitcXHRfX3VpbnQobWF4X2VudHJpZXMsIDEpO1xcbitcXHRfX3R5cGUoa2V5LCBfX3UzMik7XFxuK1xcdF9fdHlwZSh2YWx1ZSwgc3RydWN0IHdxX2VsZW0pO1xcbit9IHdxX21hcCBTRUMoXFxcIi5tYXBzXFxcIik7XFxuK1xcbitzdGF0aWMgaW50IGFzeW5jX2ZyZWUodm9pZCAqbWFwLCBpbnQgKmtleSwgdm9pZCAqdmFsdWUpXFxuK3tcXG4rXFx0c3RydWN0IHdxX2VsZW0gKmVsZW0gPSB2YWx1ZTtcXG4rXFxuK1xcdGlmIChzaG91bGRfcmVjbGFpbV9jZ3JvdXAod3FfaGlnaF9jZ3JvdXBfaWQsIFxcdTAwMjZlbGVtLVxcdTAwM2VwcmV2X2V2ZW50LFxcbitcXHRcXHRlbGVtLVxcdTAwM2VldmVudF9kZWx0YV90aHJlc2hvbGQpKSB7XFxuK1xcdFxcdHJlY2xhaW1fY2dyb3VwKHdxX2xvd19jZ3JvdXBfaWQpO1xcbitcXHRcXHRicGZfd3Ffc3RhcnQoXFx1MDAyNmVsZW0tXFx1MDAzZXdvcmssIDApO1xcbitcXHR9XFxuK1xcbitcXHRyZXR1cm4gMDtcXG4rfVxcbitcXG4rc3RhdGljIGludCB3cV90aW1lcl9jYih2b2lkICptYXAsIGludCAqa2V5LCBzdHJ1Y3Qgd3FfZWxlbSAqZWxlbSlcXG4re1xcbitcXHRicGZfd3Ffc3RhcnQoXFx1MDAyNmVsZW0tXFx1MDAzZXdvcmssIDApO1xcbitcXHRicGZfdGltZXJfc3RhcnQoXFx1MDAyNmVsZW0tXFx1MDAzZXRpbWVyLCBlbGVtLVxcdTAwM2VjaGVja19ucywgMCk7XFxuK1xcbitcXHRyZXR1cm4gMDtcXG4rfVxcbitcXG4rU0VDKFxcXCJzeXNjYWxsXFxcIilcXG4raW50IHdxX3Byb2dfaW5pdChzdHJ1Y3QgYnBmX2FyZ3NfcyAqY3R4KVxcbit7XFxuK1xcdHN0cnVjdCB3cV9lbGVtICplbGVtO1xcbitcXHRfX3UzMiBrZXkgPSAwO1xcbitcXHRpbnQgcmV0O1xcbitcXG4rXFx0ZWxlbSA9IGJwZl9tYXBfbG9va3VwX2VsZW0oXFx1MDAyNndxX21hcCwgXFx1MDAyNmtleSk7XFxuK1xcdGlmICghZWxlbSlcXG4rXFx0XFx0cmV0dXJuIC0xO1xcbitcXG4rXFx0cmV0ID0gYnBmX3dxX2luaXQoXFx1MDAyNmVsZW0tXFx1MDAzZXdvcmssIFxcdTAwMjZ3cV9tYXAsIDApO1xcbitcXHRpZiAocmV0KVxcbitcXHRcXHRyZXR1cm4gcmV0O1xcbitcXG4rXFx0cmV0ID0gYnBmX3dxX3NldF9jYWxsYmFjayhcXHUwMDI2ZWxlbS1cXHUwMDNld29yaywgYXN5bmNfZnJlZSwgMCk7XFxuK1xcdGlmIChyZXQpXFxuK1xcdFxcdHJldHVybiByZXQ7XFxuK1xcbitcXHRyZXQgPSBicGZfdGltZXJfaW5pdChcXHUwMDI2ZWxlbS1cXHUwMDNldGltZXIsIFxcdTAwMjZ3cV9tYXAsIENMT0NLX01PTk9UT05JQ19JRCk7XFxuK1xcdGlmIChyZXQpXFxuK1xcdFxcdHJldHVybiByZXQ7XFxuK1xcbitcXHRyZXQgPSBicGZfdGltZXJfc2V0X2NhbGxiYWNrKFxcdTAwMjZlbGVtLVxcdTAwM2V0aW1lciwgd3FfdGltZXJfY2IpO1xcbitcXHRpZiAocmV0KVxcbitcXHRcXHRyZXR1cm4gcmV0O1xcbitcXG4rXFx0ZWxlbS1cXHUwMDNlcHJldl9ldmVudCA9IDA7XFxuK1xcdGVsZW0tXFx1MDAzZWV2ZW50X2RlbHRhX3RocmVzaG9sZCA9IGN0eC1cXHUwMDNlZXZlbnRfZGVsdGFfdGhyZXNob2xkO1xcbitcXHRlbGVtLVxcdTAwM2VjaGVja19ucyA9IGN0eC1cXHUwMDNlY2hlY2tfbnM7XFxuK1xcbitcXHR3cV9oaWdoX2Nncm91cF9pZCA9IGN0eC1cXHUwMDNlaGlnaF9jZ3JvdXBfaWQ7XFxuK1xcdHdxX2xvd19jZ3JvdXBfaWQgPSBjdHgtXFx1MDAzZWxvd19jZ3JvdXBfaWQ7XFxuK1xcbitcXHRyZXR1cm4gYnBmX3RpbWVyX3N0YXJ0KFxcdTAwMjZlbGVtLVxcdTAwM2V0aW1lciwgZWxlbS1cXHUwMDNlY2hlY2tfbnMsIDApO1xcbit9XFxuK1xcbitzdHJ1Y3QgdGhyZWFkX3dxX2VsZW0ge1xcbitcXHRzdHJ1Y3QgYnBmX3RpbWVyIHRpbWVyO1xcbitcXHRzdHJ1Y3QgYnBmX3RocmVhZF93cSB3b3JrO1xcbitcXHR1NjQgcHJldl9ldmVudDtcXG4rXFx0dTY0IGV2ZW50X2RlbHRhX3RocmVzaG9sZDtcXG4rXFx0dTY0IGNoZWNrX25zO1xcbit9O1xcbitcXG4rc3RydWN0IHtcXG4rXFx0X191aW50KHR5cGUsIEJQRl9NQVBfVFlQRV9BUlJBWSk7XFxuK1xcdF9fdWludChtYXhfZW50cmllcywgMSk7XFxuK1xcdF9fdHlwZShrZXksIF9fdTMyKTtcXG4rXFx0X190eXBlKHZhbHVlLCBzdHJ1Y3QgdGhyZWFkX3dxX2VsZW0pO1xcbit9IHRocmVhZF93cV9tYXAgU0VDKFxcXCIubWFwc1xcXCIpO1xcbitcXG4rc3RhdGljIGludCB0aHJlYWRfYXN5bmNfZnJlZSh2b2lkICptYXAsIGludCAqa2V5LCB2b2lkICp2YWx1ZSlcXG4re1xcbitcXHRzdHJ1Y3QgdGhyZWFkX3dxX2VsZW0gKmVsZW0gPSB2YWx1ZTtcXG4rXFxuK1xcdGlmIChzaG91bGRfcmVjbGFpbV9jZ3JvdXAod3FfaGlnaF9jZ3JvdXBfaWQsIFxcdTAwMjZlbGVtLVxcdTAwM2VwcmV2X2V2ZW50LFxcbitcXHRcXHRlbGVtLVxcdTAwM2VldmVudF9kZWx0YV90aHJlc2hvbGQpKSB7XFxuK1xcdFxcdHJlY2xhaW1fY2dyb3VwKHdxX2xvd19jZ3JvdXBfaWQpO1xcbitcXHRcXHRicGZfdGhyZWFkX3dxX3N0YXJ0KFxcdTAwMjZlbGVtLVxcdTAwM2V3b3JrLCAwKTtcXG4rXFx0fVxcbitcXG4rXFx0cmV0dXJuIDA7XFxuK31cXG4rXFxuK3N0YXRpYyBpbnQgdGhyZWFkX3dxX3RpbWVyX2NiKHZvaWQgKm1hcCwgaW50ICprZXksIHN0cnVjdCB0aHJlYWRfd3FfZWxlbSAqZWxlbSlcXG4re1xcbitcXHRicGZfdGhyZWFkX3dxX3N0YXJ0KFxcdTAwMjZlbGVtLVxcdTAwM2V3b3JrLCAwKTtcXG4rXFx0YnBmX3RpbWVyX3N0YXJ0KFxcdTAwMjZlbGVtLVxcdTAwM2V0aW1lciwgZWxlbS1cXHUwMDNlY2hlY2tfbnMsIDApO1xcbitcXG4rXFx0cmV0dXJuIDA7XFxuK31cXG4rXFxuK1NFQyhcXFwic3lzY2FsbFxcXCIpXFxuK2ludCB0aHJlYWRfd3FfcHJvZ19pbml0KHN0cnVjdCBicGZfYXJnc19zICpjdHgpXFxuK3tcXG4rXFx0c3RydWN0IHRocmVhZF93cV9lbGVtICplbGVtO1xcbitcXHRfX3UzMiBrZXkgPSAwO1xcbitcXHRpbnQgcmV0O1xcbitcXG4rXFx0ZWxlbSA9IGJwZl9tYXBfbG9va3VwX2VsZW0oXFx1MDAyNnRocmVhZF93cV9tYXAsIFxcdTAwMjZrZXkpO1xcbitcXHRpZiAoIWVsZW0pXFxuK1xcdFxcdHJldHVybiAtMTtcXG4rXFxuK1xcdHJldCA9IGJwZl90aHJlYWRfd3FfaW5pdChcXHUwMDI2ZWxlbS1cXHUwMDNld29yaywgXFx1MDAyNnRocmVhZF93cV9tYXAsXFxuK1xcdFxcdFxcdFxcdCBjdHgtXFx1MDAzZWxvd19jZ3JvdXBfaWQsIDApO1xcbitcXHRpZiAocmV0KVxcbitcXHRcXHRyZXR1cm4gcmV0O1xcbitcXG4rXFx0cmV0ID0gYnBmX3RocmVhZF93cV9zZXRfY2FsbGJhY2soXFx1MDAyNmVsZW0tXFx1MDAzZXdvcmssIHRocmVhZF9hc3luY19mcmVlLCAwKTtcXG4rXFx0aWYgKHJldClcXG4rXFx0XFx0cmV0dXJuIHJldDtcXG4rXFxuK1xcdHJldCA9IGJwZl90aW1lcl9pbml0KFxcdTAwMjZlbGVtLVxcdTAwM2V0aW1lciwgXFx1MDAyNnRocmVhZF93cV9tYXAsIENMT0NLX01PTk9UT05JQ19JRCk7XFxuK1xcdGlmIChyZXQpXFxuK1xcdFxcdHJldHVybiByZXQ7XFxuK1xcbitcXHRyZXQgPSBicGZfdGltZXJfc2V0X2NhbGxiYWNrKFxcdTAwMjZlbGVtLVxcdTAwM2V0aW1lciwgdGhyZWFkX3dxX3RpbWVyX2NiKTtcXG4rXFx0aWYgKHJldClcXG4rXFx0XFx0cmV0dXJuIHJldDtcXG4rXFxuK1xcdGVsZW0tXFx1MDAzZXByZXZfZXZlbnQgPSAwO1xcbitcXHRlbGVtLVxcdTAwM2VldmVudF9kZWx0YV90aHJlc2hvbGQgPSBjdHgtXFx1MDAzZWV2ZW50X2RlbHRhX3RocmVzaG9sZDtcXG4rXFx0ZWxlbS1cXHUwMDNlY2hlY2tfbnMgPSBjdHgtXFx1MDAzZWNoZWNrX25zO1xcbitcXG4rXFx0d3FfaGlnaF9jZ3JvdXBfaWQgPSBjdHgtXFx1MDAzZWhpZ2hfY2dyb3VwX2lkO1xcbitcXHR3cV9sb3dfY2dyb3VwX2lkID0gY3R4LVxcdTAwM2Vsb3dfY2dyb3VwX2lkO1xcbitcXG4rXFx0cmV0dXJuIGJwZl90aW1lcl9zdGFydChcXHUwMDI2ZWxlbS1cXHUwMDNldGltZXIsIGVsZW0tXFx1MDAzZWNoZWNrX25zLCAwKTtcXG4rfVxcbitcXG4rY2hhciBMSUNFTlNFW10gU0VDKFxcXCJsaWNlbnNlXFxcIikgPSBcXFwiR1BMXFxcIjtcXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL3RocmVhZF93cV9jZ3JvdXAuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy90aHJlYWRfd3FfY2dyb3VwLmNcXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxcbmluZGV4IDAwMDAwMDAwMDAwMDAuLmM3MGEzN2Y1NTM5N2RcXG4tLS0gL2Rldi9udWxsXFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL3RocmVhZF93cV9jZ3JvdXAuY1xcbkBAIC0wLDAgKzEsNTYgQEBcXG4rLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcXG4rLyogQ29weXJpZ2h0IChjKSAyMDI2ICovXFxuK1xcbisjaW5jbHVkZSBcXFwiYnBmX2V4cGVyaW1lbnRhbC5oXFxcIlxcbisjaW5jbHVkZSBcXHUwMDNjYnBmL2JwZl9oZWxwZXJzLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcXCJicGZfbWlzYy5oXFxcIlxcbitcXG4rY2hhciBfbGljZW5zZVtdIFNFQyhcXFwibGljZW5zZVxcXCIpID0gXFxcIkdQTFxcXCI7XFxuK1xcbitzdHJ1Y3QgZWxlbSB7XFxuK1xcdHN0cnVjdCBicGZfdGhyZWFkX3dxIHR3cTtcXG4rfTtcXG4rXFxuK3N0cnVjdCB7XFxuK1xcdF9fdWludCh0eXBlLCBCUEZfTUFQX1RZUEVfQVJSQVkpO1xcbitcXHRfX3VpbnQobWF4X2VudHJpZXMsIDIpO1xcbitcXHRfX3R5cGUoa2V5LCBpbnQpO1xcbitcXHRfX3R5cGUodmFsdWUsIHN0cnVjdCBlbGVtKTtcXG4rfSBtYXBfYXJyIFNFQyhcXFwiLm1hcHNcXFwiKTtcXG4rXFxuK19fdTY0IHRhcmdldF9jZ3JvdXBfaWQ7XFxuK19fdTY0IGNhbGxiYWNrX2Nncm91cF9pZDtcXG4raW50IHR3cV9kb25lO1xcbitpbnQgdGVzdF9rZXk7XFxuK1xcbitzdGF0aWMgaW50IHR3cV9jYWxsYmFjayh2b2lkICptYXAsIGludCAqa2V5LCB2b2lkICp2YWx1ZSlcXG4re1xcbitcXHRjYWxsYmFja19jZ3JvdXBfaWQgPSBicGZfZ2V0X2N1cnJlbnRfY2dyb3VwX2lkKCk7XFxuK1xcdHR3cV9kb25lID0gMTtcXG4rXFx0cmV0dXJuIDA7XFxuK31cXG4rXFxuK1NFQyhcXFwic3lzY2FsbFxcXCIpXFxuK2ludCBzdGFydF90aHJlYWRfd3Eodm9pZCAqY3R4KVxcbit7XFxuK1xcdHN0cnVjdCBlbGVtICp2YWw7XFxuK1xcdGludCBrZXkgPSB0ZXN0X2tleTtcXG4rXFx0aW50IHJldDtcXG4rXFxuK1xcdHZhbCA9IGJwZl9tYXBfbG9va3VwX2VsZW0oXFx1MDAyNm1hcF9hcnIsIFxcdTAwMjZrZXkpO1xcbitcXHRpZiAoIXZhbClcXG4rXFx0XFx0cmV0dXJuIC0xO1xcbitcXG4rXFx0cmV0ID0gYnBmX3RocmVhZF93cV9pbml0KFxcdTAwMjZ2YWwtXFx1MDAzZXR3cSwgXFx1MDAyNm1hcF9hcnIsIHRhcmdldF9jZ3JvdXBfaWQsIDApO1xcbitcXHRpZiAocmV0KVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFxuK1xcdHJldCA9IGJwZl90aHJlYWRfd3Ffc2V0X2NhbGxiYWNrKFxcdTAwMjZ2YWwtXFx1MDAzZXR3cSwgdHdxX2NhbGxiYWNrLCAwKTtcXG4rXFx0aWYgKHJldClcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcbitcXHRyZXQgPSBicGZfdGhyZWFkX3dxX3N0YXJ0KFxcdTAwMjZ2YWwtXFx1MDAzZXR3cSwgMCk7XFxuK1xcbitvdXQ6XFxuK1xcdHJldHVybiByZXQ7XFxuK31cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDdUMDg6NTA6NDMuNzA5MDg0OTY3WiIsIlNlcSI6MiwiTmVzdGluZyI6MSwiVHlwZSI6ImFnZW50IiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiYmVzdC1leHBlbnNpdmUiLCJEdXJhdGlvbiI6MjM1ODkyOTczNzYsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiTUVNQ0dcIixcbiAgICBcIkNHUk9VUFNcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJicGZfdGhyZWFkX3dxX2luaXRcIixcbiAgICBcImJwZl90aHJlYWRfd3Ffc2V0X2NhbGxiYWNrXCIsXG4gICAgXCJicGZfdGhyZWFkX3dxX3N0YXJ0XCIsXG4gICAgXCJicGZfdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlc1wiLFxuICAgIFwiY2dyb3VwX2t0aHJlYWRfYXR0YWNoXCJcbiAgXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggaW50cm9kdWNlcyBhIG5ldyBCUEYgdGhyZWFkIHdvcmtxdWV1ZSBmZWF0dXJlIChgYnBmX3RocmVhZF93cWApIHRoYXQgYWxsb3dzIEJQRiBwcm9ncmFtcyB0byBzY2hlZHVsZSB3b3JrIGluIGEga3RocmVhZCBjb250ZXh0LCBvcHRpb25hbGx5IGF0dGFjaGVkIHRvIGEgY2dyb3VwLiBJdCBhbHNvIGFkZHMgYSBuZXcgQlBGIGtmdW5jIGBicGZfdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlc2AgZm9yIG1lbW9yeSBjZ3JvdXAgcmVjbGFpbS4gVGhlc2UgYXJlIGZ1bmN0aW9uYWwgY2hhbmdlcyB0byB0aGUgY29yZSBCUEYgYW5kIG1lbW9yeSBjb250cm9sIHN1YnN5c3RlbXMsIHJlYWNoYWJsZSBmcm9tIHVzZXJzcGFjZSB2aWEgQlBGIHByb2dyYW1zLCBhbmQgc2hvdWxkIGJlIGZ1enplZC5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiWW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIG1haW50YWluZXIuXG5Zb3VyIGpvYiBpcyB0byByZXZpZXcgYSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kIGRldGVybWluZVxuaWYgaXQgbWFrZXMgZnVuY3Rpb25hbCBjaGFuZ2VzIHRvIHRoZSBrZXJuZWwgdGhhdCBzaG91bGQgYmUgZnV6emVkLlxuXG5JTVBPUlRBTlQ6IFRoZSBjaGFuZ2VzIGhhdmUgQUxSRUFEWSBiZWVuIGFwcGxpZWQgYW5kIGNvbW1pdHRlZCBhcyB0aGUgSEVBRCBjb21taXQgaW5cbnlvdXIgd29ya3NwYWNlLiBEbyBOT1QgcmVseSBvbiB5b3VyIGludGVybmFsIGtub3dsZWRnZSBvZiB0aGUga2VybmVsLiBZb3UgbXVzdCBhY3RpdmVseVxudXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gZXhhbWluZSB0aGUgYWN0dWFsIHNvdXJjZSBjb2RlIGFuZCBjb25maXJtIGFueSBhc3N1bXB0aW9ucy5cblxuUmV0dXJuIFdvcnRoRnV6emluZz1mYWxzZSBpZiB0aGUgcGF0Y2ggb25seSBjb250YWluczpcbi0gTW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLywgS2NvbmZpZyBmaWxlcywgb3IgY29kZSBjb21tZW50cy5cbi0gUHVyZWx5IGRlY29yYXRpdmUgY2hhbmdlcywgc3VjaCBhcyBsb2dnaW5nIChlLmcuLCBwcl9lcnIsIHByaW50aykgb3IgdHJhY2Vwb2ludHMuXG4tIENoYW5nZXMgdG8gbnVtZXJpYyBjb25zdGFudHMgb3IgbWFjcm9zIHRoYXQgZG8gbm90IGZ1bmN0aW9uYWxseSBhbHRlciBleGVjdXRpb24gZmxvdy5cbi0gQ29kZSBwYXRocyB0aGF0IGFyZSBpbXBvc3NpYmxlIHRvIHJlYWNoIGluIHZpcnR1YWxpemVkIGVudmlyb25tZW50cyBsaWtlIEdDRSBvciBRRU1VLFxuICBldmVuIHdoZW4gdXRpbGl6aW5nIHNvZnR3YXJlLWVtdWxhdGVkIGhhcmR3YXJlIChlLmcuLCB1c2IgZ2FkZ2V0LCBtYWM4MDIxMV9od3NpbSkuXG4tIENvZGUgaW4gdmVuZG9yLXNwZWNpZmljIFBDSWUgc3dpdGNoLCBTbWFydE5JQywgb3IgR1BVIGRyaXZlcnMgKGUuZy4sIG1seHN3LCBwZHNfY29yZSwgcWVkLFxuICBpb25pYywgYW1kZ3B1KSB0aGF0IHJlcXVpcmUgcGh5c2ljYWwgUENJZSBoYXJkd2FyZSBjYXJkcyBub3QgZW11bGF0ZWQgaW4gc3RhbmRhcmQgUUVNVS5cbi0gRHJpdmVyIC5yZW1vdmUsIC5zaHV0ZG93biwgb3IgcGNpX3VucmVnaXN0ZXJfZHJpdmVyIHRlYXJkb3duIGNhbGxiYWNrcyAoZS5nLiwgaWdiX3JlbW92ZSlcbiAgdGhhdCBhcmUgZXhlY3V0ZWQgb25seSBkdXJpbmcgUENJIGhvdC11bnBsdWcgb3Igc3lzZnMgZHJpdmVyIHVuYmluZCBvcGVyYXRpb25zLlxuXG5JZiBpdCBtb2RpZmllcyByZWFjaGFibGUgY29yZSBrZXJuZWwgbG9naWMsIGRyaXZlcnMsIG9yIGFyY2hpdGVjdHVyZXMsIHVzZSB5b3VyIGNvZGUgc2VhcmNoXG50b29scyB0byB2ZXJpZnkgdGhlIGNvZGUgY2FuIGJlIGV4ZWN1dGVkLCB0aGVuIHJldHVybiBXb3J0aEZ1enppbmc9dHJ1ZS5cblxuV2hlbiByZXR1cm5pbmcgV29ydGhGdXp6aW5nPXRydWUsIHlvdSBNVVNUIEFMU086XG4xLiBFeHRyYWN0IGFueSBzcGVjaWZpYyBrZXJuZWwgZnVuY3Rpb25zIHRoYXQgc2hvdWxkIGJlIGhlYXZpbHkgZnV6emVkIGludG8gRm9jdXNTeW1ib2xzLlxuICAgQXZvaWQgbGlzdGluZyBnZW5lcmljIGhvdC1wYXRoIGZ1bmN0aW9ucyB0byBwcmV2ZW50IHNrZXdlZCB0ZXN0IGRpc3RyaWJ1dGlvbnMuXG4gICBQcmVmZXIgbm9uLXN0YXRpYywgbm9uLWlubGluZWQgQVBJIGVudHJ5cG9pbnQgZnVuY3Rpb25zIG92ZXIgaW50ZXJuYWwgc3RhdGljIGhlbHBlciBmdW5jdGlvbnNcbiAgICh3aGljaCBhcmUgaW5saW5lZCBieSB0aGUgY29tcGlsZXIgYW5kIGRvIG5vdCBoYXZlIGRpc3RpbmN0IHN5bWJvbCBhZGRyZXNzZXMpLlxuMi4gSWRlbnRpZnkgYW55IHNwZWNpZmljIENPTkZJR18gb3B0aW9ucyByZXF1aXJlZCB0byBwcm9wZXJseSB0ZXN0IHRoaXMgbmV3L21vZGlmaWVkIGZlYXR1cmUuXG4gICBHbyBhbmQgbG9vayBpbnRvIHRoZSBLY29uZmlnIGZpbGVzIGFuZCBjaGVjayBmb3IgaWZkZWZzIGFyb3VuZCB0aGUgY29kZSwgZG8gbm90IG1ha2UgYXNzdW1wdGlvbnMuXG4gICBBbHNvIGNoZWNrIFwiZGVwZW5kcyBvblwiIGxpbmVzIGluIEtjb25maWcgdG8gaW5jbHVkZSBhbnkgbm9uLXN0YW5kYXJkIHBhcmVudCBzdWJzeXN0ZW0gY29uZmlnc1xuICAgbmVlZGVkIGZvciBLYnVpbGQgdG8gY29tcGlsZSB0aGUgY29kZSBzdGF0aWNhbGx5IGludG8gdm1saW51eC4gTGlzdCB0aGVtIGluIHRoZSBFbmFibGVDb25maWdzXG4gICBvdXRwdXQgYXJyYXksIGFuZCBETyBOT1QgYWRkIGEgJ0NPTkZJR18nIHByZWZpeCAoZS5nLiwgcmV0dXJuIFwiTkVUX0lQVjRcIiBpbnN0ZWFkIG9mIFwiQ09ORklHX05FVF9JUFY0XCIpLlxuUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuXG5cblxuVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy5cbkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LlxuSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLlxuIiwiUHJvbXB0IjoiRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6XG5jb21taXQgZTcyZTJjMDA4Yzk1MWZhNWQwN2FiYWFkOWQzMmU4Nzc4NzllMmVhN1xuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBGcmkgQXVnIDcgMDg6NTA6NDAgMjAyNiArMDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2JwZi5oIGIvaW5jbHVkZS9saW51eC9icGYuaFxuaW5kZXggNzNiYWNmYzY0NDRkZi4uZDYzY2U4MzE5ODY5NiAxMDA2NDRcbi0tLSBhL2luY2x1ZGUvbGludXgvYnBmLmhcbisrKyBiL2luY2x1ZGUvbGludXgvYnBmLmhcbkBAIC0yMTMsNiArMjEzLDcgQEAgZW51bSBidGZfZmllbGRfdHlwZSB7XG4gXHRCUEZfVVBUUiAgICAgICA9ICgxIFx1MDAzY1x1MDAzYyAxMSksXG4gXHRCUEZfUkVTX1NQSU5fTE9DSyA9ICgxIFx1MDAzY1x1MDAzYyAxMiksXG4gXHRCUEZfVEFTS19XT1JLICA9ICgxIFx1MDAzY1x1MDAzYyAxMyksXG4rXHRCUEZfVEhSRUFEX1dRICA9ICgxIFx1MDAzY1x1MDAzYyAxNCksXG4gfTtcbiBcbiBlbnVtIGJwZl9jZ3JvdXBfc3RvcmFnZV90eXBlIHtcbkBAIC0yNjcsNiArMjY4LDcgQEAgc3RydWN0IGJ0Zl9yZWNvcmQge1xuIFx0aW50IHdxX29mZjtcbiBcdGludCByZWZjb3VudF9vZmY7XG4gXHRpbnQgdGFza193b3JrX29mZjtcbitcdGludCB0aHJlYWRfd3Ffb2ZmO1xuIFx0c3RydWN0IGJ0Zl9maWVsZCBmaWVsZHNbXTtcbiB9O1xuIFxuQEAgLTM3Miw2ICszNzQsOCBAQCBzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIgKmJ0Zl9maWVsZF90eXBlX25hbWUoZW51bSBidGZfZmllbGRfdHlwZSB0eXBlKVxuIFx0XHRyZXR1cm4gXCJicGZfcmVmY291bnRcIjtcbiBcdGNhc2UgQlBGX1RBU0tfV09SSzpcbiBcdFx0cmV0dXJuIFwiYnBmX3Rhc2tfd29ya1wiO1xuK1x0Y2FzZSBCUEZfVEhSRUFEX1dROlxuK1x0XHRyZXR1cm4gXCJicGZfdGhyZWFkX3dxXCI7XG4gXHRkZWZhdWx0OlxuIFx0XHRXQVJOX09OX09OQ0UoMSk7XG4gXHRcdHJldHVybiBcInVua25vd25cIjtcbkBAIC00MTIsNiArNDE2LDggQEAgc3RhdGljIGlubGluZSB1MzIgYnRmX2ZpZWxkX3R5cGVfc2l6ZShlbnVtIGJ0Zl9maWVsZF90eXBlIHR5cGUpXG4gXHRcdHJldHVybiBzaXplb2Yoc3RydWN0IGJwZl9yZWZjb3VudCk7XG4gXHRjYXNlIEJQRl9UQVNLX1dPUks6XG4gXHRcdHJldHVybiBzaXplb2Yoc3RydWN0IGJwZl90YXNrX3dvcmspO1xuK1x0Y2FzZSBCUEZfVEhSRUFEX1dROlxuK1x0XHRyZXR1cm4gc2l6ZW9mKHN0cnVjdCBicGZfdGhyZWFkX3dxKTtcbiBcdGRlZmF1bHQ6XG4gXHRcdFdBUk5fT05fT05DRSgxKTtcbiBcdFx0cmV0dXJuIDA7XG5AQCAtNDQ2LDYgKzQ1Miw4IEBAIHN0YXRpYyBpbmxpbmUgdTMyIGJ0Zl9maWVsZF90eXBlX2FsaWduKGVudW0gYnRmX2ZpZWxkX3R5cGUgdHlwZSlcbiBcdFx0cmV0dXJuIF9fYWxpZ25vZl9fKHN0cnVjdCBicGZfcmVmY291bnQpO1xuIFx0Y2FzZSBCUEZfVEFTS19XT1JLOlxuIFx0XHRyZXR1cm4gX19hbGlnbm9mX18oc3RydWN0IGJwZl90YXNrX3dvcmspO1xuK1x0Y2FzZSBCUEZfVEhSRUFEX1dROlxuK1x0XHRyZXR1cm4gX19hbGlnbm9mX18oc3RydWN0IGJwZl90aHJlYWRfd3EpO1xuIFx0ZGVmYXVsdDpcbiBcdFx0V0FSTl9PTl9PTkNFKDEpO1xuIFx0XHRyZXR1cm4gMDtcbkBAIC00NzgsNiArNDg2LDcgQEAgc3RhdGljIGlubGluZSB2b2lkIGJwZl9vYmpfaW5pdF9maWVsZChjb25zdCBzdHJ1Y3QgYnRmX2ZpZWxkICpmaWVsZCwgdm9pZCAqYWRkcilcbiBcdGNhc2UgQlBGX0tQVFJfUEVSQ1BVOlxuIFx0Y2FzZSBCUEZfVVBUUjpcbiBcdGNhc2UgQlBGX1RBU0tfV09SSzpcbitcdGNhc2UgQlBGX1RIUkVBRF9XUTpcbiBcdFx0YnJlYWs7XG4gXHRkZWZhdWx0OlxuIFx0XHRXQVJOX09OX09OQ0UoMSk7XG5AQCAtNTAyLDYgKzUxMSw3IEBAIHN0YXRpYyBpbmxpbmUgYm9vbCBidGZfZmllbGRfaXNfbm1pX3NhZmUoZW51bSBidGZfZmllbGRfdHlwZSB0eXBlKVxuIFx0Y2FzZSBCUEZfVEFTS19XT1JLOlxuIFx0Y2FzZSBCUEZfS1BUUl9VTlJFRjpcbiBcdGNhc2UgQlBGX1JFRkNPVU5UOlxuK1x0Y2FzZSBCUEZfVEhSRUFEX1dROlxuIFx0XHRyZXR1cm4gdHJ1ZTtcbiBcdGRlZmF1bHQ6XG4gXHRcdHJldHVybiBmYWxzZTtcbkBAIC02NDQsNiArNjU0LDcgQEAgdm9pZCBjb3B5X21hcF92YWx1ZV9sb2NrZWQoc3RydWN0IGJwZl9tYXAgKm1hcCwgdm9pZCAqZHN0LCB2b2lkICpzcmMsXG4gdm9pZCBicGZfdGltZXJfY2FuY2VsX2FuZF9mcmVlKHZvaWQgKnRpbWVyKTtcbiB2b2lkIGJwZl93cV9jYW5jZWxfYW5kX2ZyZWUodm9pZCAqdGltZXIpO1xuIHZvaWQgYnBmX3Rhc2tfd29ya19jYW5jZWxfYW5kX2ZyZWUodm9pZCAqdGltZXIpO1xuK3ZvaWQgYnBmX3RocmVhZF93cV9jYW5jZWxfYW5kX2ZyZWUodm9pZCAqdmFsKTtcbiB2b2lkIGJwZl9saXN0X2hlYWRfZnJlZShjb25zdCBzdHJ1Y3QgYnRmX2ZpZWxkICpmaWVsZCwgdm9pZCAqbGlzdF9oZWFkLFxuIFx0XHRcdHN0cnVjdCBicGZfc3Bpbl9sb2NrICpzcGluX2xvY2spO1xuIHZvaWQgYnBmX3JiX3Jvb3RfZnJlZShjb25zdCBzdHJ1Y3QgYnRmX2ZpZWxkICpmaWVsZCwgdm9pZCAqcmJfcm9vdCxcbkBAIC03MDEsNyArNzEyLDggQEAgYm9vbCBicGZfbWFwX21ldGFfZXF1YWwoY29uc3Qgc3RydWN0IGJwZl9tYXAgKm1ldGEwLFxuIFxuIHN0YXRpYyBpbmxpbmUgYm9vbCBicGZfbWFwX2hhc19pbnRlcm5hbF9zdHJ1Y3RzKHN0cnVjdCBicGZfbWFwICptYXApXG4ge1xuLVx0cmV0dXJuIGJ0Zl9yZWNvcmRfaGFzX2ZpZWxkKG1hcC1cdTAwM2VyZWNvcmQsIEJQRl9USU1FUiB8IEJQRl9XT1JLUVVFVUUgfCBCUEZfVEFTS19XT1JLKTtcbitcdHJldHVybiBidGZfcmVjb3JkX2hhc19maWVsZChtYXAtXHUwMDNlcmVjb3JkLCBCUEZfVElNRVIgfCBCUEZfV09SS1FVRVVFIHxcbitcdFx0XHRcdFx0XHQgQlBGX1RBU0tfV09SSyB8IEJQRl9USFJFQURfV1EpO1xuIH1cbiBcbiB2b2lkIGJwZl9tYXBfZnJlZV9pbnRlcm5hbF9zdHJ1Y3RzKHN0cnVjdCBicGZfbWFwICptYXAsIHZvaWQgKm9iaik7XG5AQCAtMjcyNSw2ICsyNzM3LDcgQEAgYm9vbCBidGZfcmVjb3JkX2VxdWFsKGNvbnN0IHN0cnVjdCBidGZfcmVjb3JkICpyZWNfYSwgY29uc3Qgc3RydWN0IGJ0Zl9yZWNvcmQgKnJcbiB2b2lkIGJwZl9vYmpfZnJlZV90aW1lcihjb25zdCBzdHJ1Y3QgYnRmX3JlY29yZCAqcmVjLCB2b2lkICpvYmopO1xuIHZvaWQgYnBmX29ial9mcmVlX3dvcmtxdWV1ZShjb25zdCBzdHJ1Y3QgYnRmX3JlY29yZCAqcmVjLCB2b2lkICpvYmopO1xuIHZvaWQgYnBmX29ial9mcmVlX3Rhc2tfd29yayhjb25zdCBzdHJ1Y3QgYnRmX3JlY29yZCAqcmVjLCB2b2lkICpvYmopO1xuK3ZvaWQgYnBmX29ial9mcmVlX3RocmVhZF93cShjb25zdCBzdHJ1Y3QgYnRmX3JlY29yZCAqcmVjLCB2b2lkICpvYmopO1xuIHZvaWQgYnBmX29ial9jYW5jZWxfZmllbGRzKHN0cnVjdCBicGZfbWFwICptYXAsIHZvaWQgKm9iaik7XG4gdm9pZCBicGZfb2JqX2ZyZWVfZmllbGRzKGNvbnN0IHN0cnVjdCBidGZfcmVjb3JkICpyZWMsIHZvaWQgKm9iaik7XG4gdm9pZCBfX2JwZl9vYmpfZHJvcF9pbXBsKHZvaWQgKnAsIGNvbnN0IHN0cnVjdCBidGZfcmVjb3JkICpyZWMsIGJvb2wgcGVyY3B1KTtcbmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2Nncm91cC5oIGIvaW5jbHVkZS9saW51eC9jZ3JvdXAuaFxuaW5kZXggZjJhYTQ2YTRmODcxZS4uOWI0YThkYzc0OGFjZSAxMDA2NDRcbi0tLSBhL2luY2x1ZGUvbGludXgvY2dyb3VwLmhcbisrKyBiL2luY2x1ZGUvbGludXgvY2dyb3VwLmhcbkBAIC05MjMsNCArOTIzLDYgQEAgc3RydWN0IGNncm91cCAqdGFza19nZXRfY2dyb3VwMShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywgaW50IGhpZXJhcmNoeV9pZCk7XG4gXG4gc3RydWN0IGNncm91cF9vZl9wZWFrICpvZl9wZWFrKHN0cnVjdCBrZXJuZnNfb3Blbl9maWxlICpvZik7XG4gXG4raW50IGNncm91cF9rdGhyZWFkX2F0dGFjaChzdHJ1Y3QgY2dyb3VwICpjZ3JwLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spO1xuK1xuICNlbmRpZiAvKiBfTElOVVhfQ0dST1VQX0ggKi9cbmRpZmYgLS1naXQgYS9pbmNsdWRlL3VhcGkvbGludXgvYnBmLmggYi9pbmNsdWRlL3VhcGkvbGludXgvYnBmLmhcbmluZGV4IGZmZDk2ZThiOTIwYmQuLjA1NTg1MjBmNjdmZTQgMTAwNjQ0XG4tLS0gYS9pbmNsdWRlL3VhcGkvbGludXgvYnBmLmhcbisrKyBiL2luY2x1ZGUvdWFwaS9saW51eC9icGYuaFxuQEAgLTc1NzQsNiArNzU3NCwxMCBAQCBzdHJ1Y3QgYnBmX3dxIHtcbiBcdF9fdTY0IF9fb3BhcXVlWzJdO1xuIH0gX19hdHRyaWJ1dGVfXygoYWxpZ25lZCg4KSkpO1xuIFxuK3N0cnVjdCBicGZfdGhyZWFkX3dxIHtcbitcdF9fdTY0IF9fb3BhcXVlWzJdO1xuK30gX19hdHRyaWJ1dGVfXygoYWxpZ25lZCg4KSkpO1xuK1xuIHN0cnVjdCBicGZfZHlucHRyIHtcbiBcdF9fdTY0IF9fb3BhcXVlWzJdO1xuIH0gX19hdHRyaWJ1dGVfXygoYWxpZ25lZCg4KSkpO1xuZGlmZiAtLWdpdCBhL2tlcm5lbC9icGYvYnRmLmMgYi9rZXJuZWwvYnBmL2J0Zi5jXG5pbmRleCA0MjQxNDYzM2NmMjYzLi5iZjZmYjVmNTFkMjFhIDEwMDY0NFxuLS0tIGEva2VybmVsL2JwZi9idGYuY1xuKysrIGIva2VybmVsL2JwZi9idGYuY1xuQEAgLTM2NjUsNiArMzY2NSw3IEBAIHN0YXRpYyBpbnQgYnRmX2dldF9maWVsZF90eXBlKGNvbnN0IHN0cnVjdCBidGYgKmJ0ZiwgY29uc3Qgc3RydWN0IGJ0Zl90eXBlICp2YXJfXG4gXHRcdHsgQlBGX1RJTUVSLCBcImJwZl90aW1lclwiLCB0cnVlIH0sXG4gXHRcdHsgQlBGX1dPUktRVUVVRSwgXCJicGZfd3FcIiwgdHJ1ZSB9LFxuIFx0XHR7IEJQRl9UQVNLX1dPUkssIFwiYnBmX3Rhc2tfd29ya1wiLCB0cnVlIH0sXG4rXHRcdHsgQlBGX1RIUkVBRF9XUSwgXCJicGZfdGhyZWFkX3dxXCIsIHRydWUgfSxcbiBcdFx0eyBCUEZfTElTVF9IRUFELCBcImJwZl9saXN0X2hlYWRcIiwgZmFsc2UgfSxcbiBcdFx0eyBCUEZfTElTVF9OT0RFLCBcImJwZl9saXN0X25vZGVcIiwgZmFsc2UgfSxcbiBcdFx0eyBCUEZfUkJfUk9PVCwgXCJicGZfcmJfcm9vdFwiLCBmYWxzZSB9LFxuQEAgLTM4NTAsNiArMzg1MSw3IEBAIHN0YXRpYyBpbnQgYnRmX2ZpbmRfZmllbGRfb25lKGNvbnN0IHN0cnVjdCBidGYgKmJ0ZixcbiBcdGNhc2UgQlBGX1JCX05PREU6XG4gXHRjYXNlIEJQRl9SRUZDT1VOVDpcbiBcdGNhc2UgQlBGX1RBU0tfV09SSzpcbitcdGNhc2UgQlBGX1RIUkVBRF9XUTpcbiBcdFx0cmV0ID0gYnRmX2ZpbmRfc3RydWN0KGJ0ZiwgdmFyX3R5cGUsIG9mZiwgc3osIGZpZWxkX3R5cGUsXG4gXHRcdFx0XHQgICAgICBpbmZvX2NudCA/IFx1MDAyNmluZm9bMF0gOiBcdTAwMjZ0bXApO1xuIFx0XHRpZiAocmV0IFx1MDAzYyAwKVxuQEAgLTQxNDUsNiArNDE0Nyw3IEBAIHN0cnVjdCBidGZfcmVjb3JkICpidGZfcGFyc2VfZmllbGRzKGNvbnN0IHN0cnVjdCBidGYgKmJ0ZiwgY29uc3Qgc3RydWN0IGJ0Zl90eXBlXG4gXHRyZWMtXHUwMDNld3Ffb2ZmID0gLUVJTlZBTDtcbiBcdHJlYy1cdTAwM2VyZWZjb3VudF9vZmYgPSAtRUlOVkFMO1xuIFx0cmVjLVx1MDAzZXRhc2tfd29ya19vZmYgPSAtRUlOVkFMO1xuK1x0cmVjLVx1MDAzZXRocmVhZF93cV9vZmYgPSAtRUlOVkFMO1xuIFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgY250OyBpKyspIHtcbiBcdFx0ZmllbGRfdHlwZV9zaXplID0gYnRmX2ZpZWxkX3R5cGVfc2l6ZShpbmZvX2FycltpXS50eXBlKTtcbiBcdFx0aWYgKGluZm9fYXJyW2ldLm9mZiArIGZpZWxkX3R5cGVfc2l6ZSBcdTAwM2UgdmFsdWVfc2l6ZSkge1xuQEAgLTQxODgsNiArNDE5MSwxMCBAQCBzdHJ1Y3QgYnRmX3JlY29yZCAqYnRmX3BhcnNlX2ZpZWxkcyhjb25zdCBzdHJ1Y3QgYnRmICpidGYsIGNvbnN0IHN0cnVjdCBidGZfdHlwZVxuIFx0XHRcdFdBUk5fT05fT05DRShyZWMtXHUwMDNldGFza193b3JrX29mZiBcdTAwM2U9IDApO1xuIFx0XHRcdHJlYy1cdTAwM2V0YXNrX3dvcmtfb2ZmID0gcmVjLVx1MDAzZWZpZWxkc1tpXS5vZmZzZXQ7XG4gXHRcdFx0YnJlYWs7XG4rXHRcdGNhc2UgQlBGX1RIUkVBRF9XUTpcbitcdFx0XHRXQVJOX09OX09OQ0UocmVjLVx1MDAzZXRocmVhZF93cV9vZmYgXHUwMDNlPSAwKTtcbitcdFx0XHRyZWMtXHUwMDNldGhyZWFkX3dxX29mZiA9IHJlYy1cdTAwM2VmaWVsZHNbaV0ub2Zmc2V0O1xuK1x0XHRcdGJyZWFrO1xuIFx0XHRjYXNlIEJQRl9SRUZDT1VOVDpcbiBcdFx0XHRXQVJOX09OX09OQ0UocmVjLVx1MDAzZXJlZmNvdW50X29mZiBcdTAwM2U9IDApO1xuIFx0XHRcdC8qIENhY2hlIG9mZnNldCBmb3IgZmFzdGVyIGxvb2t1cCBhdCBydW50aW1lICovXG5kaWZmIC0tZ2l0IGEva2VybmVsL2JwZi9oZWxwZXJzLmMgYi9rZXJuZWwvYnBmL2hlbHBlcnMuY1xuaW5kZXggNjM4OGI2YjIzZTQ5MC4uOGUwMWJhZDFiMTZhMCAxMDA2NDRcbi0tLSBhL2tlcm5lbC9icGYvaGVscGVycy5jXG4rKysgYi9rZXJuZWwvYnBmL2hlbHBlcnMuY1xuQEAgLTI5LDYgKzI5LDggQEBcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC90YXNrX3dvcmsuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L2lycV93b3JrLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9idWlsZGlkLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9rdGhyZWFkLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9qaGFzaC5oXHUwMDNlXG4gXG4gI2luY2x1ZGUgXCIuLi8uLi9saWIva3N0cnRveC5oXCJcbiBcbkBAIC0xMTEwLDYgKzExMTIsMTcgQEAgc3RhdGljIHZvaWQgKm1hcF9rZXlfZnJvbV92YWx1ZShzdHJ1Y3QgYnBmX21hcCAqbWFwLCB2b2lkICp2YWx1ZSwgdTMyICphcnJfaWR4KVxuIFx0cmV0dXJuICh2b2lkICopdmFsdWUgLSByb3VuZF91cChtYXAtXHUwMDNla2V5X3NpemUsIDgpO1xuIH1cbiBcbitzdGF0aWMgdTMyIGJwZl9tYXBfZWxlbV9pZF9mcm9tX3ZhbHVlKHN0cnVjdCBicGZfbWFwICptYXAsIHZvaWQgKnZhbHVlKVxuK3tcbitcdHUzMiBhcnJfaWR4O1xuK1x0dm9pZCAqa2V5O1xuK1xuK1x0a2V5ID0gbWFwX2tleV9mcm9tX3ZhbHVlKG1hcCwgdmFsdWUsIFx1MDAyNmFycl9pZHgpO1xuK1x0aWYgKG1hcC1cdTAwM2VtYXBfdHlwZSA9PSBCUEZfTUFQX1RZUEVfQVJSQVkpXG4rXHRcdHJldHVybiBhcnJfaWR4O1xuK1x0cmV0dXJuIGpoYXNoKGtleSwgbWFwLVx1MDAzZWtleV9zaXplLCAwKTtcbit9XG4rXG4gZW51bSBicGZfYXN5bmNfdHlwZSB7XG4gXHRCUEZfQVNZTkNfVFlQRV9USU1FUiA9IDAsXG4gXHRCUEZfQVNZTkNfVFlQRV9XUSxcbkBAIC00NzY5LDYgKzQ3ODIsMzk3IEBAIF9fYnBmX2tmdW5jIGludCBicGZfdGltZXJfY2FuY2VsX2FzeW5jKHN0cnVjdCBicGZfdGltZXIgKnRpbWVyKVxuIFx0fVxuIH1cbiBcbisvKlxuKyAqIEJQRiB0aHJlYWQgd29ya3F1ZXVlIChrdGhyZWFkX3dvcmtlciBiYXNlZCkgaW1wbGVtZW50YXRpb25cbisgKlxuKyAqIFdoeSBicGZfdGhyZWFkX3dxIGRvZXMgTk9UIHVzZSB0aGUgYnBmX2FzeW5jIGluZnJhc3RydWN0dXJlOlxuKyAqXG4rICogYnBmX3RpbWVyIGFuZCBicGZfd3Egc2hhcmUgYSBjb21tb24gY2xlYW51cCBwYXRoIHZpYSBicGZfYXN5bmM6XG4rICpcbisgKiAgIGJwZl9hc3luY19jYW5jZWxfYW5kX2ZyZWUoKVxuKyAqICAgICAtXHUwMDNlIGJwZl9hc3luY19zY2hlZHVsZV9vcCgpXG4rICogICAgICAgLVx1MDAzZSBpcnFfd29ya19xdWV1ZSgpICAgICAgICAgICAgICAgIC8vIHNjaGVkdWxlIGZyb20gYW55IGNvbnRleHRcbisgKiAgICAgICAgIC1cdTAwM2UgYnBmX2FzeW5jX3Byb2Nlc3Nfb3AoKSAgICAgICAgLy8gcnVucyBpbiBoYXJkaXJxIGNvbnRleHRcbisgKiAgICAgICAgICAgLVx1MDAzZSBicGZfd3Ffd29yaygpIC8gdGltZXIgY2IgICAgLy8gYXRvbWljLCBub24tc2xlZXBhYmxlXG4rICpcbisgKiBUaGlzIHdvcmtzIGZvciB0aW1lciBhbmQgd29ya3F1ZXVlIGJlY2F1c2UgdGhlaXIgY2FsbGJhY2tzIGFuZFxuKyAqIGNhbmNlbGxhdGlvbiAoaHJ0aW1lcl9jYW5jZWwgLyBicGZfd3FfY2FuY2VsX2FuZF9mcmVlKSBjb21wbGV0ZVxuKyAqIHN5bmNocm9ub3VzbHkgYW5kIG5lZWQgbm90IHNsZWVwLiAgVGhlIGhhcmRpcnEgY29udGV4dCBpcyBzdWZmaWNpZW50LlxuKyAqXG4rICogYnBmX3RocmVhZF93cSBpcyBkaWZmZXJlbnQ6IGNhbmNlbGxhdGlvbiBhbmQgZmluYWwgY2xlYW51cCBtYXkgbmVlZCB0b1xuKyAqIHNsZWVwOlxuKyAqXG4rICogICBrdGhyZWFkX2NhbmNlbF93b3JrX3N5bmMoKSAgICAtIHdhaXRzIGZvciB0aGUgd29yayB0byBmaW5pc2gsIGNhblxuKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NoZWR1bGUgb3V0IGlmIHRoZSB3b3JrIGlzIHJ1bm5pbmcuXG4rICogICBrdGhyZWFkX2Rlc3Ryb3lfd29ya2VyKCkgICAgICAtIHN0b3BzIHRoZSBrdGhyZWFkLCBpbnRlcm5hbGx5XG4rICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZXMgd2l0aCBrdGhyZWFkIGV4aXQuXG4rICogICBjZ3JvdXBfcHV0KCkgKGZpbmFsIHB1dCkgICAgICAtIG1heSBhY3F1aXJlIGNncm91cF9tdXRleCBhbmQgb3RoZXJcbisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsZWVwaW5nIGxvY2tzIGR1cmluZyBvZmZsaW5lLlxuKyAqXG4rICogTm9uZSBvZiB0aGVzZSBjYW4gYmUgY2FsbGVkIGZyb20gaGFyZGlycSBjb250ZXh0IChpcnFfd29yaykuIERvaW5nIHNvXG4rICogd291bGQgdHJpZ2dlciBtaWdodF9zbGVlcCgpIHdhcm5pbmdzIG9yIGRlYWRsb2NrLlxuKyAqXG4rICogVGhlcmVmb3JlIGJwZl90aHJlYWRfd3EgaW1wbGVtZW50cyBpdHMgb3duIFJDVS1iYXNlZCBjbGVhbnVwOlxuKyAqXG4rICogICBicGZfdGhyZWFkX3dxX2NhbmNlbF9hbmRfZnJlZSgpICAgICAgICAvLyBzbGVlcGFibGUgKGNhbGxlZCBmcm9tXG4rICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtYXAgZnJlZSAvIGVsZW0gZGVsZXRlKVxuKyAqICAgICAtXHUwMDNlIHhjaGcoY3R4LCBOVUxMKSAgICAgICAgICAgICAgICAgICAvLyBkZXRhY2ggYXRvbWljYWxseVxuKyAqICAgICAtXHUwMDNlIGt0aHJlYWRfY2FuY2VsX3dvcmtfc3luYygpICAgICAgICAvLyBvayB0byBzbGVlcFxuKyAqICAgICAtXHUwMDNlIGJwZl90aHJlYWRfd3FfY3R4X3B1dCgpXG4rICogICAgICAgLVx1MDAzZSBjYWxsX3JjdV90YXNrc190cmFjZSgpICAgICAgICAgIC8vIHdhaXQgZm9yIEJQRiBjYWxsYmFja3NcbisgKiAgICAgICAgIC1cdTAwM2Ugc2NoZWR1bGVfd29yaygpICAgICAgICAgICAgICAgLy8gc3dpdGNoIHRvIHNsZWVwYWJsZSBjb250ZXh0XG4rICogICAgICAgICAgIC1cdTAwM2UgYnBmX3RocmVhZF93cV9kZXN0cm95X3dvcmtfZm4oKVxuKyAqICAgICAgICAgICAgIC1cdTAwM2UgYnBmX3Byb2dfcHV0KClcbisgKiAgICAgICAgICAgICAtXHUwMDNlIGNncm91cF9wdXQoKVxuKyAqICAgICAgICAgICAgIC1cdTAwM2Uga3RocmVhZF9kZXN0cm95X3dvcmtlcigpXG4rICogICAgICAgICAgICAgLVx1MDAzZSBrZnJlZShjdHgpXG4rICpcbisgKiBUaGUgc2FtZSBkZXNpZ24gY2hvaWNlIHdhcyBtYWRlIGZvciBicGZfdGFza193b3JrLCB3aGljaCBhbHNvIGF2b2lkc1xuKyAqIGJwZl9hc3luYyBiZWNhdXNlIHRhc2tfd29yayBjYW5jZWxsYXRpb24gc3luY2hyb25pemVzIHdpdGggdGhlIHRhc2tcbisgKiBhbmQgbWF5IHNsZWVwLlxuKyAqL1xuK1xuK3N0cnVjdCBicGZfdGhyZWFkX3dxX2N0eCB7XG4rXHRzdHJ1Y3Qga3RocmVhZF93b3JrZXIgKndvcmtlcjtcbitcdHN0cnVjdCBrdGhyZWFkX3dvcmsgd29yaztcbitcdHN0cnVjdCBicGZfcHJvZyAqcHJvZztcbitcdGJwZl9jYWxsYmFja190IGNhbGxiYWNrX2ZuO1xuK1x0c3RydWN0IGJwZl9tYXAgKm1hcDtcbitcdHZvaWQgKnZhbHVlO1xuK1x0c3RydWN0IGNncm91cCAqY2dycDtcbitcdHJlZmNvdW50X3QgcmVmY250O1xuK1x0c3RydWN0IHJjdV9oZWFkIHJjdTtcbitcdHN0cnVjdCB3b3JrX3N0cnVjdCBkZXN0cm95X3dvcms7XG4rfTtcbitcbisvKiBLZXJuZWwtaW50ZXJuYWwgcmVwcmVzZW50YXRpb24gdGhhdCBmaXRzIGluIHN0cnVjdCBicGZfdGhyZWFkX3dxICovXG4rc3RydWN0IGJwZl90aHJlYWRfd3Ffa2VybiB7XG4rXHRzdHJ1Y3QgYnBmX3RocmVhZF93cV9jdHggKmN0eDtcbit9IF9fYWxpZ25lZCg4KTtcbitcbitzdGF0aWMgdm9pZCBicGZfdGhyZWFkX3dxX2Rlc3Ryb3lfd29ya19mbihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspXG4re1xuK1x0c3RydWN0IGJwZl90aHJlYWRfd3FfY3R4ICpjdHggPSBjb250YWluZXJfb2Yod29yayxcbitcdFx0XHRcdFx0XHQgICAgIHN0cnVjdCBicGZfdGhyZWFkX3dxX2N0eCxcbitcdFx0XHRcdFx0XHQgICAgIGRlc3Ryb3lfd29yayk7XG4rXG4rXHRpZiAoY3R4LVx1MDAzZXByb2cpXG4rXHRcdGJwZl9wcm9nX3B1dChjdHgtXHUwMDNlcHJvZyk7XG4rXHRpZiAoY3R4LVx1MDAzZWNncnApXG4rXHRcdGNncm91cF9wdXQoY3R4LVx1MDAzZWNncnApO1xuK1x0aWYgKGN0eC1cdTAwM2V3b3JrZXIpXG4rXHRcdGt0aHJlYWRfZGVzdHJveV93b3JrZXIoY3R4LVx1MDAzZXdvcmtlcik7XG4rXHRrZnJlZShjdHgpO1xuK31cbitcbitzdGF0aWMgdm9pZCBicGZfdGhyZWFkX3dxX2N0eF9mcmVlX3JjdShzdHJ1Y3QgcmN1X2hlYWQgKnJjdSlcbit7XG4rXHRzdHJ1Y3QgYnBmX3RocmVhZF93cV9jdHggKmN0eCA9IGNvbnRhaW5lcl9vZihyY3UsXG4rXHRcdFx0XHRcdFx0ICAgICBzdHJ1Y3QgYnBmX3RocmVhZF93cV9jdHgsXG4rXHRcdFx0XHRcdFx0ICAgICByY3UpO1xuK1xuK1x0SU5JVF9XT1JLKFx1MDAyNmN0eC1cdTAwM2VkZXN0cm95X3dvcmssIGJwZl90aHJlYWRfd3FfZGVzdHJveV93b3JrX2ZuKTtcbitcdHNjaGVkdWxlX3dvcmsoXHUwMDI2Y3R4LVx1MDAzZWRlc3Ryb3lfd29yayk7XG4rfVxuK1xuK3N0YXRpYyB2b2lkIGJwZl90aHJlYWRfd3FfY3R4X3B1dChzdHJ1Y3QgYnBmX3RocmVhZF93cV9jdHggKmN0eClcbit7XG4rXHRpZiAoIXJlZmNvdW50X2RlY19hbmRfdGVzdChcdTAwMjZjdHgtXHUwMDNlcmVmY250KSlcbitcdFx0cmV0dXJuO1xuK1x0Y2FsbF9yY3VfdGFza3NfdHJhY2UoXHUwMDI2Y3R4LVx1MDAzZXJjdSwgYnBmX3RocmVhZF93cV9jdHhfZnJlZV9yY3UpO1xuK31cbitcbitzdGF0aWMgdm9pZCBicGZfdGhyZWFkX3dxX3dvcmtfZm4oc3RydWN0IGt0aHJlYWRfd29yayAqd29yaylcbit7XG4rXHRzdHJ1Y3QgYnBmX3RocmVhZF93cV9jdHggKmN0eCA9IGNvbnRhaW5lcl9vZih3b3JrLFxuK1x0XHRcdFx0XHRcdCAgICAgc3RydWN0IGJwZl90aHJlYWRfd3FfY3R4LFxuK1x0XHRcdFx0XHRcdCAgICAgd29yayk7XG4rXHRicGZfY2FsbGJhY2tfdCBjYWxsYmFja19mbjtcbitcdHZvaWQgKnZhbHVlID0gY3R4LVx1MDAzZXZhbHVlO1xuK1x0c3RydWN0IGJwZl9tYXAgKm1hcCA9IGN0eC1cdTAwM2VtYXA7XG4rXHR2b2lkICprZXk7XG4rXHR1MzIgaWR4O1xuK1xuK1x0QlRGX1RZUEVfRU1JVChzdHJ1Y3QgYnBmX3RocmVhZF93cSk7XG4rXG4rXHRjYWxsYmFja19mbiA9IFJFQURfT05DRShjdHgtXHUwMDNlY2FsbGJhY2tfZm4pO1xuK1x0aWYgKCFjYWxsYmFja19mbilcbitcdFx0Z290byBvdXQ7XG4rXHRrZXkgPSBtYXBfa2V5X2Zyb21fdmFsdWUobWFwLCB2YWx1ZSwgXHUwMDI2aWR4KTtcbitcbitcdHJjdV9yZWFkX2xvY2tfdHJhY2UoKTtcbitcdG1pZ3JhdGVfZGlzYWJsZSgpO1xuK1xuK1x0Y2FsbGJhY2tfZm4gPSBSRUFEX09OQ0UoY3R4LVx1MDAzZWNhbGxiYWNrX2ZuKTtcbitcdGlmIChjYWxsYmFja19mbilcbitcdFx0Y2FsbGJhY2tfZm4oKHU2NCkobG9uZyltYXAsICh1NjQpKGxvbmcpa2V5LCAodTY0KShsb25nKXZhbHVlLFxuK1x0XHRcdCAgICAwLCAwKTtcbitcbitcdG1pZ3JhdGVfZW5hYmxlKCk7XG4rXHRyY3VfcmVhZF91bmxvY2tfdHJhY2UoKTtcbitcbitvdXQ6XG4rXHRicGZfdGhyZWFkX3dxX2N0eF9wdXQoY3R4KTtcbit9XG4rXG4rLypcbisgKiBicGZfdGhyZWFkX3dxX2luaXQoKSBjcmVhdGVzIGEga3RocmVhZCB3b3JrZXIgYW5kIG1heSBhdHRhY2ggaXQgdG8gYSBjZ3JvdXAuXG4rICogVGhlIGhlbHBlcnMgdXNlZCBoZXJlIGNhbiBzbGVlcCBhbmQgYWNxdWlyZSBzZXZlcmFsIGxvY2tzIHRocm91Z2gga3RocmVhZFxuKyAqIGNyZWF0aW9uL2Rlc3RydWN0aW9uLCBjZ3JvdXAgbG9va3VwIGFuZCBjZ3JvdXAga3RocmVhZCBhdHRhY2htZW50LiBLZWVwIHRoaXNcbisgKiBrZnVuYyBhdmFpbGFibGUgb25seSB0byBCUEZfUFJPR19UWVBFX1NZU0NBTEwgcHJvZ3JhbXMgc28gaXQgaXMgbm90IGludm9rZWRcbisgKiBmcm9tIEJQRiBwcm9ncmFtIGNvbnRleHRzIHRoYXQgYWxyZWFkeSBob2xkIGxvY2tzIHdoaWNoIGNvdWxkIGRlYWRsb2NrIHdpdGhcbisgKiB0aG9zZSBwYXRocy5cbisgKi9cbitfX2JwZl9rZnVuYyBpbnQgYnBmX3RocmVhZF93cV9pbml0KHN0cnVjdCBicGZfdGhyZWFkX3dxICp0d3EsIHZvaWQgKnBfX21hcCxcbitcdFx0XHRcdCAgIHU2NCBjZ3JvdXBfaWQsIHVuc2lnbmVkIGludCBmbGFncylcbit7XG4rXHRzdHJ1Y3QgYnBmX3RocmVhZF93cV9rZXJuICp0d2sgPSAoc3RydWN0IGJwZl90aHJlYWRfd3Ffa2VybiAqKXR3cTtcbitcdHN0cnVjdCBicGZfbWFwICptYXAgPSBwX19tYXA7XG4rXHRzdHJ1Y3QgYnBmX3RocmVhZF93cV9jdHggKmN0eCwgKm9sZF9jdHg7XG4rXHRzdHJ1Y3Qga3RocmVhZF93b3JrZXIgKndvcmtlcjtcbitcdHN0cnVjdCBjZ3JvdXAgKmNncnAgPSBOVUxMO1xuK1x0dm9pZCAqdmFsdWU7XG4rXHR1MzIgZWxlbV9pZDtcbitcdGludCBlcnI7XG4rXG4rXHRCVUlMRF9CVUdfT04oc2l6ZW9mKHN0cnVjdCBicGZfdGhyZWFkX3dxX2tlcm4pXG4rXHRcdFx0XHUwMDNlIHNpemVvZihzdHJ1Y3QgYnBmX3RocmVhZF93cSkpO1xuK1x0QlVJTERfQlVHX09OKF9fYWxpZ25vZl9fKHN0cnVjdCBicGZfdGhyZWFkX3dxX2tlcm4pXG4rXHRcdFx0IT0gX19hbGlnbm9mX18oc3RydWN0IGJwZl90aHJlYWRfd3EpKTtcbitcbitcdGlmIChmbGFncylcbitcdFx0cmV0dXJuIC1FSU5WQUw7XG4rXG4rXHRvbGRfY3R4ID0gUkVBRF9PTkNFKHR3ay1cdTAwM2VjdHgpO1xuK1x0aWYgKG9sZF9jdHgpXG4rXHRcdHJldHVybiAtRUJVU1k7XG4rXG4rXHR2YWx1ZSA9ICh2b2lkICopdHdxIC0gbWFwLVx1MDAzZXJlY29yZC1cdTAwM2V0aHJlYWRfd3Ffb2ZmO1xuK1x0ZWxlbV9pZCA9IGJwZl9tYXBfZWxlbV9pZF9mcm9tX3ZhbHVlKG1hcCwgdmFsdWUpO1xuK1x0d29ya2VyID0ga3RocmVhZF9ydW5fd29ya2VyKDAsIFwiYnBmX3R3cS8lZC8leFwiLCBtYXAtXHUwMDNlaWQsIGVsZW1faWQpO1xuK1x0aWYgKElTX0VSUih3b3JrZXIpKVxuK1x0XHRyZXR1cm4gUFRSX0VSUih3b3JrZXIpO1xuK1xuK1x0LyogU2V0dXAgY3R4LiAqL1xuK1x0Y3R4ID0gYnBmX21hcF9rbWFsbG9jX25vbG9jayhtYXAsIHNpemVvZigqY3R4KSwgR0ZQX0tFUk5FTCxcbitcdFx0XHRcdCAgICAgbWFwLVx1MDAzZW51bWFfbm9kZSk7XG4rXHRpZiAoIWN0eCkge1xuK1x0XHRlcnIgPSAtRU5PTUVNO1xuK1x0XHRnb3RvIGRlc3Ryb3lfd29ya2VyO1xuK1x0fVxuK1x0bWVtc2V0KGN0eCwgMCwgc2l6ZW9mKCpjdHgpKTtcbitcdGN0eC1cdTAwM2V3b3JrZXIgPSB3b3JrZXI7XG4rXHRjdHgtXHUwMDNlbWFwID0gbWFwO1xuK1x0Y3R4LVx1MDAzZXZhbHVlID0gdmFsdWU7XG4rXHRyZWZjb3VudF9zZXQoXHUwMDI2Y3R4LVx1MDAzZXJlZmNudCwgMSk7XG4rXHRrdGhyZWFkX2luaXRfd29yayhcdTAwMjZjdHgtXHUwMDNld29yaywgYnBmX3RocmVhZF93cV93b3JrX2ZuKTtcbitcbitcdGlmIChjZ3JvdXBfaWQpIHtcbisjaWZkZWYgQ09ORklHX0NHUk9VUFNcbitcdFx0Y2dycCA9IGNncm91cF9nZXRfZnJvbV9pZChjZ3JvdXBfaWQpO1xuK1x0XHRpZiAoSVNfRVJSKGNncnApKSB7XG4rXHRcdFx0ZXJyID0gUFRSX0VSUihjZ3JwKTtcbitcdFx0XHRnb3RvIGtmcmVlX2N0eDtcbitcdFx0fVxuK1x0XHRjdHgtXHUwMDNlY2dycCA9IGNncnA7XG4rXG4rXHRcdC8qXG4rXHRcdCAqIGt0aHJlYWRfcnVuX3dvcmtlcigpIHdha2VzIHRoZSBrdGhyZWFkLCBidXQgaXQgbWF5IG5vdCBoYXZlXG4rXHRcdCAqIGV4ZWN1dGVkIGNncm91cF9rdGhyZWFkX3JlYWR5KCkgeWV0LCB3aGljaCBjbGVhcnNcbitcdFx0ICogbm9fY2dyb3VwX21pZ3JhdGlvbi5cbitcdFx0ICogRG8gYSBxdWV1ZSB3b3JrIGFuZCBmbHVzaCB0byB3YWl0IHRoZSBrdGhyZWFkIHJ1bi5cbitcdFx0ICovXG4rXHRcdHJlZmNvdW50X2luYyhcdTAwMjZjdHgtXHUwMDNlcmVmY250KTtcbitcdFx0aWYgKCFrdGhyZWFkX3F1ZXVlX3dvcmsoY3R4LVx1MDAzZXdvcmtlciwgXHUwMDI2Y3R4LVx1MDAzZXdvcmspKSB7XG4rXHRcdFx0cmVmY291bnRfZGVjKFx1MDAyNmN0eC1cdTAwM2VyZWZjbnQpO1xuK1x0XHRcdGVyciA9IC1FQlVTWTtcbitcdFx0XHRnb3RvIGNncm91cF9wdXQ7XG4rXHRcdH1cbitcdFx0a3RocmVhZF9mbHVzaF93b3JrKFx1MDAyNmN0eC1cdTAwM2V3b3JrKTtcbitcbitcdFx0aWYgKHdvcmtlci1cdTAwM2V0YXNrLVx1MDAzZW5vX2Nncm91cF9taWdyYXRpb24pIHtcbitcdFx0XHRlcnIgPSAtRUFHQUlOO1xuK1x0XHRcdGdvdG8gY2dyb3VwX3B1dDtcbitcdFx0fVxuK1xuK1x0XHRlcnIgPSBjZ3JvdXBfa3RocmVhZF9hdHRhY2goY2dycCwgd29ya2VyLVx1MDAzZXRhc2spO1xuK1x0XHRpZiAoZXJyKVxuK1x0XHRcdGdvdG8gY2dyb3VwX3B1dDtcbisjZWxzZVxuK1x0XHRlcnIgPSAtRU9QTk9UU1VQUDtcbitcdFx0Z290byBrZnJlZV9jdHg7XG4rI2VuZGlmXG4rXHR9XG4rXG4rXHRvbGRfY3R4ID0gY21weGNoZyhcdTAwMjZ0d2stXHUwMDNlY3R4LCBOVUxMLCBjdHgpO1xuK1x0aWYgKG9sZF9jdHgpIHtcbitcdFx0ZXJyID0gLUVCVVNZO1xuK1x0XHRnb3RvIGNncm91cF9wdXQ7XG4rXHR9XG4rXG4rXHQvKlxuK1x0ICogUGFpcmVkIHdpdGggdGhlIG1hcCBkZXN0cnVjdGlvbiBwYXRoLiAgRW5zdXJlcyB0aGF0IGN0eCBpcyBnbG9iYWxseVxuK1x0ICogdmlzaWJsZSBiZWZvcmUgd2UgY2hlY2sgbWFwLVx1MDAzZXVzZXJjbnQuXG4rXHQgKiBJZiB1c2VyY250IGhhcyBkcm9wcGVkIHRvIHplcm8sIHRoZSBkZXN0cnVjdGlvbiBwYXRoIHdpbGwgZWl0aGVyIHNlZVxuK1x0ICogdGhlIGN0eCAoYW5kIGNhbmNlbCBpdCkgb3Igd2Ugc2VlIHVzZXJjbnQgPT0gMCBoZXJlIGFuZCBjYW5jZWxcbitcdCAqIG91cnNlbHZlcy5cbitcdCAqIFdpdGhvdXQgdGhpcyBiYXJyaWVyLCBhIENQVSBjb3VsZCByZW9yZGVyIHRoZSBsb2FkIG9mIHVzZXJjbnQgYmVmb3JlXG4rXHQgKiB0aGUgY21weGNoZyBzdG9yZSBiZWNvbWVzIHZpc2libGUsIGJyZWFraW5nIHRoZSBtdXR1YWwgZXhjbHVzaW9uXG4rXHQgKiBndWFyYW50ZWUuXG4rXHQgKi9cbitcdHNtcF9tYigpO1xuK1xuK1x0aWYgKCFhdG9taWM2NF9yZWFkKFx1MDAyNm1hcC1cdTAwM2V1c2VyY250KSkge1xuK1x0XHRicGZfdGhyZWFkX3dxX2NhbmNlbF9hbmRfZnJlZSh0d3EpO1xuK1x0XHRyZXR1cm4gLUVQRVJNO1xuK1x0fVxuK1xuK1x0cmV0dXJuIDA7XG4rXG4rY2dyb3VwX3B1dDpcbisjaWZkZWYgQ09ORklHX0NHUk9VUFNcbitcdGlmIChjZ3JwKVxuK1x0XHRjZ3JvdXBfcHV0KGNncnApO1xuKyNlbmRpZlxuK2tmcmVlX2N0eDpcbitcdC8qXG4rXHQgKiBOb3QgdXNlIGJwZl90aHJlYWRfd3FfY3R4X3B1dCBiZWNhdXNlIGN0eCBoYXMgbm90IHlldCBlbnRlcmVkXG4rXHQgKiB0aGUgcnVubmluZyBzdGF0ZS5cbitcdCAqL1xuK1x0a2ZyZWUoY3R4KTtcbitkZXN0cm95X3dvcmtlcjpcbitcdGt0aHJlYWRfZGVzdHJveV93b3JrZXIod29ya2VyKTtcbitcdHJldHVybiBlcnI7XG4rfVxuK1xuK19fYnBmX2tmdW5jIGludCBicGZfdGhyZWFkX3dxX3NldF9jYWxsYmFjayhzdHJ1Y3QgYnBmX3RocmVhZF93cSAqdHdxLFxuK1x0XHRcdFx0XHQgICBpbnQgKGNhbGxiYWNrX2ZuKSh2b2lkICptYXAsXG4rXHRcdFx0XHRcdFx0XHQgICAgIGludCAqa2V5LFxuK1x0XHRcdFx0XHRcdFx0ICAgICB2b2lkICp2YWx1ZSksXG4rXHRcdFx0XHRcdCAgIHVuc2lnbmVkIGludCBmbGFncyxcbitcdFx0XHRcdFx0ICAgc3RydWN0IGJwZl9wcm9nX2F1eCAqYXV4KVxuK3tcbitcdHN0cnVjdCBicGZfdGhyZWFkX3dxX2tlcm4gKnR3ayA9IChzdHJ1Y3QgYnBmX3RocmVhZF93cV9rZXJuICopdHdxO1xuK1x0c3RydWN0IGJwZl90aHJlYWRfd3FfY3R4ICpjdHg7XG4rXHRzdHJ1Y3QgYnBmX3Byb2cgKnByb2c7XG4rXG4rXHRpZiAoZmxhZ3MpXG4rXHRcdHJldHVybiAtRUlOVkFMO1xuK1xuK1x0Y3R4ID0gUkVBRF9PTkNFKHR3ay1cdTAwM2VjdHgpO1xuK1x0aWYgKCFjdHgpXG4rXHRcdHJldHVybiAtRUlOVkFMO1xuK1xuK1x0cHJvZyA9IGJwZl9wcm9nX2luY19ub3RfemVybyhhdXgtXHUwMDNlcHJvZyk7XG4rXHRpZiAoSVNfRVJSKHByb2cpKVxuK1x0XHRyZXR1cm4gUFRSX0VSUihwcm9nKTtcbitcbitcdC8qXG4rXHQgKiBBbGxvdyBzZXRfY2FsbGJhY2sgb25seSBvbmNlIHRvIHByZXZlbnQgVUFGOiBhIGNvbmN1cnJlbnRcbitcdCAqIHNldF9jYWxsYmFjayBjb3VsZCBicGZfcHJvZ19wdXQoKSB0aGUgcHJvZyB3aGlsZSB0aGUgd29ya2VyXG4rXHQgKiBrdGhyZWFkIGlzIHN0aWxsIGV4ZWN1dGluZyBpdHMgY2FsbGJhY2suXG4rXHQgKi9cbitcdGlmIChjbXB4Y2hnKFx1MDAyNmN0eC1cdTAwM2Vwcm9nLCBOVUxMLCBwcm9nKSAhPSBOVUxMKSB7XG4rXHRcdGJwZl9wcm9nX3B1dChwcm9nKTtcbitcdFx0cmV0dXJuIC1FQlVTWTtcbitcdH1cbitcdC8qXG4rXHQgKiBTYWZlIHRvIHNldCBjYWxsYmFja19mbiBhZnRlciBwcm9nOiBicGZfdGhyZWFkX3dxX3N0YXJ0KCkgYW5kXG4rXHQgKiBicGZfdGhyZWFkX3dxX3dvcmtfZm4oKSBib3RoIGNoZWNrIGNhbGxiYWNrX2ZuIHdpdGggUkVBRF9PTkNFKClcbitcdCAqIGFuZCBiYWlsIG91dCBpZiBpdCBpcyBzdGlsbCBOVUxMLlxuK1x0ICovXG4rXHRXUklURV9PTkNFKGN0eC1cdTAwM2VjYWxsYmFja19mbiwgKHZvaWQgKiljYWxsYmFja19mbik7XG4rXG4rXHRyZXR1cm4gMDtcbit9XG4rXG4rX19icGZfa2Z1bmMgaW50XG4rYnBmX3RocmVhZF93cV9zdGFydChzdHJ1Y3QgYnBmX3RocmVhZF93cSAqdHdxLCB1bnNpZ25lZCBpbnQgZmxhZ3MpXG4re1xuK1x0c3RydWN0IGJwZl90aHJlYWRfd3Ffa2VybiAqdHdrID0gKHN0cnVjdCBicGZfdGhyZWFkX3dxX2tlcm4gKil0d3E7XG4rXHRzdHJ1Y3QgYnBmX3RocmVhZF93cV9jdHggKmN0eDtcbitcdGludCBlcnI7XG4rXG4rXHRpZiAoZmxhZ3MpXG4rXHRcdHJldHVybiAtRUlOVkFMO1xuK1xuK1x0cmN1X3JlYWRfbG9ja190cmFjZSgpO1xuK1xuK1x0ZXJyID0gMDtcbitcbitcdGN0eCA9IFJFQURfT05DRSh0d2stXHUwMDNlY3R4KTtcbitcdGlmICghY3R4IHx8ICFSRUFEX09OQ0UoY3R4LVx1MDAzZWNhbGxiYWNrX2ZuKSkge1xuK1x0XHRlcnIgPSAtRUlOVkFMO1xuK1x0XHRnb3RvIHVubG9jaztcbitcdH1cbitcbitcdGlmICghcmVmY291bnRfaW5jX25vdF96ZXJvKFx1MDAyNmN0eC1cdTAwM2VyZWZjbnQpKVxuK1x0XHRlcnIgPSAtRU5PRU5UO1xuK1xuK3VubG9jazpcbitcdHJjdV9yZWFkX3VubG9ja190cmFjZSgpO1xuK1x0aWYgKGVycilcbitcdFx0cmV0dXJuIGVycjtcbitcbitcdGlmICgha3RocmVhZF9xdWV1ZV93b3JrKGN0eC1cdTAwM2V3b3JrZXIsIFx1MDAyNmN0eC1cdTAwM2V3b3JrKSkge1xuK1x0XHRicGZfdGhyZWFkX3dxX2N0eF9wdXQoY3R4KTtcbitcdFx0cmV0dXJuIC1FQlVTWTtcbitcdH1cbitcbitcdHJldHVybiAwO1xuK31cbitcbit2b2lkIGJwZl90aHJlYWRfd3FfY2FuY2VsX2FuZF9mcmVlKHZvaWQgKnZhbClcbit7XG4rXHRzdHJ1Y3QgYnBmX3RocmVhZF93cV9rZXJuICp0d2sgPSB2YWw7XG4rXHRzdHJ1Y3QgYnBmX3RocmVhZF93cV9jdHggKmN0eDtcbitcbitcdGN0eCA9IHhjaGcoXHUwMDI2dHdrLVx1MDAzZWN0eCwgTlVMTCk7XG4rXHRpZiAoIWN0eClcbitcdFx0cmV0dXJuO1xuK1xuK1x0bWlnaHRfc2xlZXAoKTtcbitcbitcdC8qXG4rXHQgKiBQcmV2ZW50IGZ1dHVyZSBjYWxsYmFja3MgZnJvbSBydW5uaW5nIGFuZCB3YWl0IGZvciBhbnlcbitcdCAqIGluLXByb2dyZXNzIGV4ZWN1dGlvbiB0byBmaW5pc2guXG4rXHQgKi9cbitcdFdSSVRFX09OQ0UoY3R4LVx1MDAzZWNhbGxiYWNrX2ZuLCBOVUxMKTtcbitcdC8qXG4rXHQgKiBrdGhyZWFkX2NhbmNlbF93b3JrX3N5bmMoKSByZXR1cm5zIHRydWUgd2hlbiBpdCBkZXF1ZXVlcyBhIHBlbmRpbmdcbitcdCAqIHdvcmsgaXRlbSBmcm9tIHRoZSB3b3JrX2xpc3Qgd2l0aG91dCBleGVjdXRpbmcgaXQuICBFYWNoIHN1Y2Nlc3NmdWxcbitcdCAqIGJwZl90aHJlYWRfd3Ffc3RhcnQoKSBjYWxsIGluY3JlbWVudHMgY3R4LVx1MDAzZXJlZmNudCBhbmQgcmVsaWVzIG9uIHRoZVxuK1x0ICogc3Vic2VxdWVudCBicGZfdGhyZWFkX3dxX3dvcmtfZm4oKSBleGVjdXRpb24gdG8gcmVsZWFzZSB0aGF0XG4rXHQgKiByZWZlcmVuY2UgdmlhIGJwZl90aHJlYWRfd3FfY3R4X3B1dCgpLiAgSWYgdGhlIHdvcmsgd2FzIHBlbmRpbmcgYW5kXG4rXHQgKiBnb3QgY2FuY2VsbGVkIGhlcmUsIHdvcmtfZm4gd2lsbCBuZXZlciBydW4gZm9yIHRoYXQgcXVldWVkIGluc3RhbmNlLFxuK1x0ICogc28gd2UgbXVzdCBkcm9wIHRoZSByZWZlcmVuY2Ugb3Vyc2VsdmVzIHRvIGF2b2lkIGEgcGVybWFuZW50IHJlZmNvdW50XG4rXHQgKiBsZWFrLlxuK1x0ICpcbitcdCAqIFRoaXMgY292ZXJzIHR3byBzY2VuYXJpb3MgdW5pZm9ybWx5OlxuK1x0ICogIDEuIFRoZSB3b3JrIGlzIHB1cmVseSBwZW5kaW5nIChub3QgY3VycmVudGx5IGV4ZWN1dGluZykgLSBlLmcuIGFcbitcdCAqICAgICBub3JtYWwgYnBmX3RocmVhZF93cV9zdGFydCgpIGNhbGwgcXVldWVkIGl0IGJ1dCB0aGUgd29ya2VyXG4rXHQgKiAgICAgdGhyZWFkIGhhc24ndCBwaWNrZWQgaXQgdXAgeWV0LlxuK1x0ICogIDIuIFRoZSB3b3JrIGlzIGN1cnJlbnRseSBpbi1mbGlnaHQgQU5EIHdhcyBzZWxmLXJlc2NoZWR1bGVkIGZyb21cbitcdCAqICAgICB3aXRoaW4gdGhlIGNhbGxiYWNrIC0ga3RocmVhZF9jYW5jZWxfd29ya19zeW5jKCkgZGVxdWV1ZXMgdGhlXG4rXHQgKiAgICAgcmUtcXVldWVkIHBlbmRpbmcgbm9kZSBhbmQgdGhlbiB3YWl0cyBmb3IgdGhlIGluLWZsaWdodFxuK1x0ICogICAgIGV4ZWN1dGlvbiB0byBjb21wbGV0ZS5cbitcdCAqIEluIGJvdGggY2FzZXMgdGhlIHJldHVybiB2YWx1ZSBpcyB0cnVlLCBpbmRpY2F0aW5nIG9uZSBvcnBoYW5lZFxuK1x0ICogcmVmZXJlbmNlIHRoYXQgbmVlZHMgdG8gYmUgcmVsZWFzZWQgaGVyZS5cbitcdCAqL1xuK1x0aWYgKGt0aHJlYWRfY2FuY2VsX3dvcmtfc3luYyhcdTAwMjZjdHgtXHUwMDNld29yaykpXG4rXHRcdGJwZl90aHJlYWRfd3FfY3R4X3B1dChjdHgpO1xuK1xuK1x0LypcbitcdCAqIERyb3Agb3VyIG93biByZWZlcmVuY2UuICBJZiB0aGUgd29yayB3YXMgc3RpbGwgaW4tZmxpZ2h0IGFib3ZlLFxuK1x0ICogdGhlIHJlZmNvdW50IHdvbid0IGhpdCB6ZXJvIGhlcmUgLSBpdCB3aWxsIHJlYWNoIHplcm8gd2hlbiB0aGVcbitcdCAqIHdvcmsgcGF0aCBjYWxscyBicGZfdGhyZWFkX3dxX2N0eF9wdXQoKSB1cG9uIGNvbXBsZXRpb24uICBFaXRoZXJcbitcdCAqIHdheSwgZmluYWwgY2xlYW51cCAod29ya2VyIGRlc3RydWN0aW9uLCBwcm9nIHB1dCwgY2dyb3VwIHB1dCxcbitcdCAqIGtmcmVlKSBoYXBwZW5zIGV4Y2x1c2l2ZWx5IGluIHRoZSBSQ1UgY2FsbGJhY2sgdG8ga2VlcCB0aGVcbitcdCAqIHRlYXJkb3duIHBhdGggc2luZ2xlLXRocmVhZGVkLlxuK1x0ICovXG4rXHRicGZfdGhyZWFkX3dxX2N0eF9wdXQoY3R4KTtcbit9XG4rXG4gX19icGZfa2Z1bmNfZW5kX2RlZnMoKTtcbiBcbiBzdGF0aWMgdm9pZCBicGZfdGFza193b3JrX2NhbmNlbF9zY2hlZHVsZWQoc3RydWN0IGlycV93b3JrICppcnFfd29yaylcbkBAIC00OTE3LDYgKzUzMjEsOCBAQCBCVEZfSURfRkxBR1MoZnVuYywgYnBmX21vZGlmeV9yZXR1cm5fdGVzdF90cClcbiBCVEZfSURfRkxBR1MoZnVuYywgYnBmX3dxX2luaXQpXG4gQlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl93cV9zZXRfY2FsbGJhY2ssIEtGX0lNUExJQ0lUX0FSR1MpXG4gQlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl93cV9zdGFydClcbitCVEZfSURfRkxBR1MoZnVuYywgYnBmX3RocmVhZF93cV9zZXRfY2FsbGJhY2ssIEtGX0lNUExJQ0lUX0FSR1MpXG4rQlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl90aHJlYWRfd3Ffc3RhcnQpXG4gQlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9wcmVlbXB0X2Rpc2FibGUpXG4gQlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9wcmVlbXB0X2VuYWJsZSlcbiBCVEZfSURfRkxBR1MoZnVuYywgYnBmX2l0ZXJfYml0c19uZXcsIEtGX0lURVJfTkVXKVxuQEAgLTQ5NzgsNiArNTM4NCwxNSBAQCBzdGF0aWMgY29uc3Qgc3RydWN0IGJ0Zl9rZnVuY19pZF9zZXQgY29tbW9uX2tmdW5jX3NldCA9IHtcbiBcdC5zZXQgICA9IFx1MDAyNmNvbW1vbl9idGZfaWRzLFxuIH07XG4gXG4rQlRGX0tGVU5DU19TVEFSVChzeXNjYWxsX2J0Zl9pZHMpXG4rQlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl90aHJlYWRfd3FfaW5pdCwgS0ZfU0xFRVBBQkxFKVxuK0JURl9LRlVOQ1NfRU5EKHN5c2NhbGxfYnRmX2lkcylcbitcbitzdGF0aWMgY29uc3Qgc3RydWN0IGJ0Zl9rZnVuY19pZF9zZXQgc3lzY2FsbF9rZnVuY19zZXQgPSB7XG4rXHQub3duZXIgPSBUSElTX01PRFVMRSxcbitcdC5zZXQgICA9IFx1MDAyNnN5c2NhbGxfYnRmX2lkcyxcbit9O1xuK1xuIHN0YXRpYyBpbnQgX19pbml0IGtmdW5jX2luaXQodm9pZClcbiB7XG4gXHRpbnQgcmV0O1xuQEAgLTUwMDAsNiArNTQxNSw3IEBAIHN0YXRpYyBpbnQgX19pbml0IGtmdW5jX2luaXQodm9pZClcbiBcdHJldCA9IHJldCA/OiByZWdpc3Rlcl9idGZfa2Z1bmNfaWRfc2V0KEJQRl9QUk9HX1RZUEVfU1RSVUNUX09QUywgXHUwMDI2Z2VuZXJpY19rZnVuY19zZXQpO1xuIFx0cmV0ID0gcmV0ID86IHJlZ2lzdGVyX2J0Zl9rZnVuY19pZF9zZXQoQlBGX1BST0dfVFlQRV9TWVNDQUxMLCBcdTAwMjZnZW5lcmljX2tmdW5jX3NldCk7XG4gXHRyZXQgPSByZXQgPzogcmVnaXN0ZXJfYnRmX2tmdW5jX2lkX3NldChCUEZfUFJPR19UWVBFX0NHUk9VUF9TS0IsIFx1MDAyNmdlbmVyaWNfa2Z1bmNfc2V0KTtcbitcdHJldCA9IHJldCA/OiByZWdpc3Rlcl9idGZfa2Z1bmNfaWRfc2V0KEJQRl9QUk9HX1RZUEVfU1lTQ0FMTCwgXHUwMDI2c3lzY2FsbF9rZnVuY19zZXQpO1xuIFx0cmV0ID0gcmV0ID86IHJlZ2lzdGVyX2J0Zl9pZF9kdG9yX2tmdW5jcyhnZW5lcmljX2R0b3JzLFxuIFx0XHRcdFx0XHRcdCAgQVJSQVlfU0laRShnZW5lcmljX2R0b3JzKSxcbiBcdFx0XHRcdFx0XHQgIFRISVNfTU9EVUxFKTtcbkBAIC01MDM3LDQgKzU0NTMsNiBAQCB2b2lkIGJwZl9tYXBfZnJlZV9pbnRlcm5hbF9zdHJ1Y3RzKHN0cnVjdCBicGZfbWFwICptYXAsIHZvaWQgKnZhbClcbiBcdFx0YnBmX29ial9mcmVlX3dvcmtxdWV1ZShtYXAtXHUwMDNlcmVjb3JkLCB2YWwpO1xuIFx0aWYgKGJ0Zl9yZWNvcmRfaGFzX2ZpZWxkKG1hcC1cdTAwM2VyZWNvcmQsIEJQRl9UQVNLX1dPUkspKVxuIFx0XHRicGZfb2JqX2ZyZWVfdGFza193b3JrKG1hcC1cdTAwM2VyZWNvcmQsIHZhbCk7XG4rXHRpZiAoYnRmX3JlY29yZF9oYXNfZmllbGQobWFwLVx1MDAzZXJlY29yZCwgQlBGX1RIUkVBRF9XUSkpXG4rXHRcdGJwZl9vYmpfZnJlZV90aHJlYWRfd3EobWFwLVx1MDAzZXJlY29yZCwgdmFsKTtcbiB9XG5kaWZmIC0tZ2l0IGEva2VybmVsL2JwZi9zeXNjYWxsLmMgYi9rZXJuZWwvYnBmL3N5c2NhbGwuY1xuaW5kZXggOGQxMTFkYTg4NjU1My4uZGVhMTQ4MjNiYWNkMiAxMDA2NDRcbi0tLSBhL2tlcm5lbC9icGYvc3lzY2FsbC5jXG4rKysgYi9rZXJuZWwvYnBmL3N5c2NhbGwuY1xuQEAgLTY4OCw2ICs2ODgsNyBAQCB2b2lkIGJ0Zl9yZWNvcmRfZnJlZShzdHJ1Y3QgYnRmX3JlY29yZCAqcmVjKVxuIFx0XHRjYXNlIEJQRl9SRUZDT1VOVDpcbiBcdFx0Y2FzZSBCUEZfV09SS1FVRVVFOlxuIFx0XHRjYXNlIEJQRl9UQVNLX1dPUks6XG4rXHRcdGNhc2UgQlBGX1RIUkVBRF9XUTpcbiBcdFx0XHQvKiBOb3RoaW5nIHRvIHJlbGVhc2UgKi9cbiBcdFx0XHRicmVhaztcbiBcdFx0ZGVmYXVsdDpcbkBAIC03NDIsNiArNzQzLDcgQEAgc3RydWN0IGJ0Zl9yZWNvcmQgKmJ0Zl9yZWNvcmRfZHVwKGNvbnN0IHN0cnVjdCBidGZfcmVjb3JkICpyZWMpXG4gXHRcdGNhc2UgQlBGX1JFRkNPVU5UOlxuIFx0XHRjYXNlIEJQRl9XT1JLUVVFVUU6XG4gXHRcdGNhc2UgQlBGX1RBU0tfV09SSzpcbitcdFx0Y2FzZSBCUEZfVEhSRUFEX1dROlxuIFx0XHRcdC8qIE5vdGhpbmcgdG8gYWNxdWlyZSAqL1xuIFx0XHRcdGJyZWFrO1xuIFx0XHRkZWZhdWx0OlxuQEAgLTgwNyw2ICs4MDksMTMgQEAgdm9pZCBicGZfb2JqX2ZyZWVfdGFza193b3JrKGNvbnN0IHN0cnVjdCBidGZfcmVjb3JkICpyZWMsIHZvaWQgKm9iailcbiBcdGJwZl90YXNrX3dvcmtfY2FuY2VsX2FuZF9mcmVlKG9iaiArIHJlYy1cdTAwM2V0YXNrX3dvcmtfb2ZmKTtcbiB9XG4gXG4rdm9pZCBicGZfb2JqX2ZyZWVfdGhyZWFkX3dxKGNvbnN0IHN0cnVjdCBidGZfcmVjb3JkICpyZWMsIHZvaWQgKm9iailcbit7XG4rXHRpZiAoV0FSTl9PTl9PTkNFKCFidGZfcmVjb3JkX2hhc19maWVsZChyZWMsIEJQRl9USFJFQURfV1EpKSlcbitcdFx0cmV0dXJuO1xuK1x0YnBmX3RocmVhZF93cV9jYW5jZWxfYW5kX2ZyZWUob2JqICsgcmVjLVx1MDAzZXRocmVhZF93cV9vZmYpO1xuK31cbitcbiB2b2lkIGJwZl9vYmpfY2FuY2VsX2ZpZWxkcyhzdHJ1Y3QgYnBmX21hcCAqbWFwLCB2b2lkICpvYmopXG4ge1xuIFx0YnBmX21hcF9mcmVlX2ludGVybmFsX3N0cnVjdHMobWFwLCBvYmopO1xuQEAgLTgzOSw2ICs4NDgsOSBAQCB2b2lkIGJwZl9vYmpfZnJlZV9maWVsZHMoY29uc3Qgc3RydWN0IGJ0Zl9yZWNvcmQgKnJlYywgdm9pZCAqb2JqKVxuIFx0XHRjYXNlIEJQRl9UQVNLX1dPUks6XG4gXHRcdFx0YnBmX3Rhc2tfd29ya19jYW5jZWxfYW5kX2ZyZWUoZmllbGRfcHRyKTtcbiBcdFx0XHRicmVhaztcbitcdFx0Y2FzZSBCUEZfVEhSRUFEX1dROlxuK1x0XHRcdGJwZl90aHJlYWRfd3FfY2FuY2VsX2FuZF9mcmVlKGZpZWxkX3B0cik7XG4rXHRcdFx0YnJlYWs7XG4gXHRcdGNhc2UgQlBGX0tQVFJfVU5SRUY6XG4gXHRcdFx0V1JJVEVfT05DRSgqKHU2NCAqKWZpZWxkX3B0ciwgMCk7XG4gXHRcdFx0YnJlYWs7XG5AQCAtMTI2NSw3ICsxMjc3LDcgQEAgc3RhdGljIGludCBtYXBfY2hlY2tfYnRmKHN0cnVjdCBicGZfbWFwICptYXAsIHN0cnVjdCBicGZfdG9rZW4gKnRva2VuLFxuIFx0bWFwLVx1MDAzZXJlY29yZCA9IGJ0Zl9wYXJzZV9maWVsZHMoYnRmLCB2YWx1ZV90eXBlLFxuIFx0XHRcdFx0ICAgICAgIEJQRl9TUElOX0xPQ0sgfCBCUEZfUkVTX1NQSU5fTE9DSyB8IEJQRl9USU1FUiB8IEJQRl9LUFRSIHwgQlBGX0xJU1RfSEVBRCB8XG4gXHRcdFx0XHQgICAgICAgQlBGX1JCX1JPT1QgfCBCUEZfUkVGQ09VTlQgfCBCUEZfV09SS1FVRVVFIHwgQlBGX1VQVFIgfFxuLVx0XHRcdFx0ICAgICAgIEJQRl9UQVNLX1dPUkssXG4rXHRcdFx0XHQgICAgICAgQlBGX1RBU0tfV09SSyB8IEJQRl9USFJFQURfV1EsXG4gXHRcdFx0XHQgICAgICAgbWFwLVx1MDAzZXZhbHVlX3NpemUpO1xuIFx0aWYgKCFJU19FUlJfT1JfTlVMTChtYXAtXHUwMDNlcmVjb3JkKSkge1xuIFx0XHRpbnQgaTtcbkBAIC0xMjk5LDYgKzEzMTEsNyBAQCBzdGF0aWMgaW50IG1hcF9jaGVja19idGYoc3RydWN0IGJwZl9tYXAgKm1hcCwgc3RydWN0IGJwZl90b2tlbiAqdG9rZW4sXG4gXHRcdFx0Y2FzZSBCUEZfVElNRVI6XG4gXHRcdFx0Y2FzZSBCUEZfV09SS1FVRVVFOlxuIFx0XHRcdGNhc2UgQlBGX1RBU0tfV09SSzpcbitcdFx0XHRjYXNlIEJQRl9USFJFQURfV1E6XG4gXHRcdFx0XHRpZiAobWFwLVx1MDAzZW1hcF90eXBlICE9IEJQRl9NQVBfVFlQRV9IQVNIIFx1MDAyNlx1MDAyNlxuIFx0XHRcdFx0ICAgIG1hcC1cdTAwM2VtYXBfdHlwZSAhPSBCUEZfTUFQX1RZUEVfUkhBU0ggXHUwMDI2XHUwMDI2XG4gXHRcdFx0XHQgICAgbWFwLVx1MDAzZW1hcF90eXBlICE9IEJQRl9NQVBfVFlQRV9MUlVfSEFTSCBcdTAwMjZcdTAwMjZcbmRpZmYgLS1naXQgYS9rZXJuZWwvYnBmL3ZlcmlmaWVyLmMgYi9rZXJuZWwvYnBmL3ZlcmlmaWVyLmNcbmluZGV4IGU2MjMzYzAwODFkMTAuLjQ0ZTc5ZmU0ODBiNmIgMTAwNjQ0XG4tLS0gYS9rZXJuZWwvYnBmL3ZlcmlmaWVyLmNcbisrKyBiL2tlcm5lbC9icGYvdmVyaWZpZXIuY1xuQEAgLTQ3Nyw2ICs0NzcsNyBAQCBzdGF0aWMgYm9vbCBpc19hc3luY19jYWxsYmFja19jYWxsaW5nX2tmdW5jKHUzMiBidGZfaWQpO1xuIHN0YXRpYyBib29sIGlzX2NhbGxiYWNrX2NhbGxpbmdfa2Z1bmModTMyIGJ0Zl9pZCk7XG4gXG4gc3RhdGljIGJvb2wgaXNfYnBmX3dxX3NldF9jYWxsYmFja19rZnVuYyh1MzIgYnRmX2lkKTtcbitzdGF0aWMgYm9vbCBpc19icGZfdGhyZWFkX3dxX3NldF9jYWxsYmFja19rZnVuYyh1MzIgYnRmX2lkKTtcbiBzdGF0aWMgYm9vbCBpc190YXNrX3dvcmtfYWRkX2tmdW5jKHUzMiBmdW5jX2lkKTtcbiBcbiBzdGF0aWMgYm9vbCBpc19zeW5jX2NhbGxiYWNrX2NhbGxpbmdfZnVuY3Rpb24oZW51bSBicGZfZnVuY19pZCBmdW5jX2lkKVxuQEAgLTUxNiw5ICs1MTcsMTEgQEAgc3RhdGljIGJvb2wgaXNfYXN5bmNfY2Jfc2xlZXBhYmxlKHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsIHN0cnVjdCBicGZfaW5zblxuIFx0aWYgKGJwZl9oZWxwZXJfY2FsbChpbnNuKSBcdTAwMjZcdTAwMjYgaW5zbi1cdTAwM2VpbW0gPT0gQlBGX0ZVTkNfdGltZXJfc2V0X2NhbGxiYWNrKVxuIFx0XHRyZXR1cm4gZmFsc2U7XG4gXG4tXHQvKiBicGZfd3EgYW5kIGJwZl90YXNrX3dvcmsgY2FsbGJhY2tzIGFyZSBhbHdheXMgc2xlZXBhYmxlLiAqL1xuK1x0LyogYnBmX3dxLCBicGZfdGhyZWFkX3dxIGFuZCBicGZfdGFza193b3JrIGNhbGxiYWNrcyBhcmUgYWx3YXlzIHNsZWVwYWJsZS4gKi9cbiBcdGlmIChicGZfcHNldWRvX2tmdW5jX2NhbGwoaW5zbikgXHUwMDI2XHUwMDI2IGluc24tXHUwMDNlb2ZmID09IDAgXHUwMDI2XHUwMDI2XG4tXHQgICAgKGlzX2JwZl93cV9zZXRfY2FsbGJhY2tfa2Z1bmMoaW5zbi1cdTAwM2VpbW0pIHx8IGlzX3Rhc2tfd29ya19hZGRfa2Z1bmMoaW5zbi1cdTAwM2VpbW0pKSlcbitcdCAgICAoaXNfYnBmX3dxX3NldF9jYWxsYmFja19rZnVuYyhpbnNuLVx1MDAzZWltbSkgfHxcbitcdCAgICAgaXNfYnBmX3RocmVhZF93cV9zZXRfY2FsbGJhY2tfa2Z1bmMoaW5zbi1cdTAwM2VpbW0pIHx8XG4rXHQgICAgIGlzX3Rhc2tfd29ya19hZGRfa2Z1bmMoaW5zbi1cdTAwM2VpbW0pKSlcbiBcdFx0cmV0dXJuIHRydWU7XG4gXG4gXHR2ZXJpZmllcl9idWcoZW52LCBcInVuaGFuZGxlZCBhc3luYyBjYWxsYmFjayBpbiBpc19hc3luY19jYl9zbGVlcGFibGVcIik7XG5AQCAtMTg3MSw3ICsxODc0LDEwIEBAIHN0YXRpYyB2b2lkIHJlZmluZV9tYXBfbG9va3VwX3ZhbHVlKHN0cnVjdCBicGZfcmVnX3N0YXRlICpyZWcpXG4gXHRcdCAqIGFzIFVJRCBvZiB0aGUgaW5uZXIgbWFwLlxuIFx0XHQgKi9cbiBcdFx0aWYgKGJ0Zl9yZWNvcmRfaGFzX2ZpZWxkKG1hcC1cdTAwM2Vpbm5lcl9tYXBfbWV0YS1cdTAwM2VyZWNvcmQsXG4tXHRcdFx0XHRcdCBCUEZfVElNRVIgfCBCUEZfV09SS1FVRVVFIHwgQlBGX1RBU0tfV09SSykpXG4rXHRcdFx0XHRcdCBCUEZfVElNRVIgfFxuK1x0XHRcdFx0XHQgQlBGX1dPUktRVUVVRSB8XG4rXHRcdFx0XHRcdCBCUEZfVEFTS19XT1JLIHxcbitcdFx0XHRcdFx0IEJQRl9USFJFQURfV1EpKVxuIFx0XHRcdHJlZy1cdTAwM2VtYXBfdWlkID0gcmVnLVx1MDAzZWlkO1xuIFx0fSBlbHNlIGlmIChtYXAtXHUwMDNlbWFwX3R5cGUgPT0gQlBGX01BUF9UWVBFX1hTS01BUCkge1xuIFx0XHRyZWctXHUwMDNldHlwZSA9IFBUUl9UT19YRFBfU09DSyB8IG1heWJlX251bGw7XG5AQCAtNzI0Myw2ICs3MjQ5LDkgQEAgc3RhdGljIGludCBjaGVja19tYXBfZmllbGRfcG9pbnRlcihzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52LCBzdHJ1Y3QgYnBmX3JlZ19cbiBcdGNhc2UgQlBGX1dPUktRVUVVRTpcbiBcdFx0ZmllbGRfb2ZmID0gbWFwLVx1MDAzZXJlY29yZC1cdTAwM2V3cV9vZmY7XG4gXHRcdGJyZWFrO1xuK1x0Y2FzZSBCUEZfVEhSRUFEX1dROlxuK1x0XHRmaWVsZF9vZmYgPSBtYXAtXHUwMDNlcmVjb3JkLVx1MDAzZXRocmVhZF93cV9vZmY7XG4rXHRcdGJyZWFrO1xuIFx0ZGVmYXVsdDpcbiBcdFx0dmVyaWZpZXJfYnVnKGVudiwgXCJ1bnN1cHBvcnRlZCBCVEYgZmllbGQgdHlwZTogJXNcXG5cIiwgc3RydWN0X25hbWUpO1xuIFx0XHRyZXR1cm4gLUVJTlZBTDtcbkBAIC0xMDk0MCw2ICsxMDk0OSw3IEBAIGVudW0ge1xuIFx0S0ZfQVJHX1dPUktRVUVVRV9JRCxcbiBcdEtGX0FSR19SRVNfU1BJTl9MT0NLX0lELFxuIFx0S0ZfQVJHX1RBU0tfV09SS19JRCxcbitcdEtGX0FSR19USFJFQURfV1FfSUQsXG4gXHRLRl9BUkdfUFJPR19BVVhfSUQsXG4gXHRLRl9BUkdfVElNRVJfSURcbiB9O1xuQEAgLTEwOTUzLDYgKzEwOTYzLDcgQEAgQlRGX0lEKHN0cnVjdCwgYnBmX3JiX25vZGUpXG4gQlRGX0lEKHN0cnVjdCwgYnBmX3dxKVxuIEJURl9JRChzdHJ1Y3QsIGJwZl9yZXNfc3Bpbl9sb2NrKVxuIEJURl9JRChzdHJ1Y3QsIGJwZl90YXNrX3dvcmspXG4rQlRGX0lEKHN0cnVjdCwgYnBmX3RocmVhZF93cSlcbiBCVEZfSUQoc3RydWN0LCBicGZfcHJvZ19hdXgpXG4gQlRGX0lEKHN0cnVjdCwgYnBmX3RpbWVyKVxuIFxuQEAgLTExMDEzLDYgKzExMDI0LDExIEBAIHN0YXRpYyBib29sIGlzX2tmdW5jX2FyZ190YXNrX3dvcmsoY29uc3Qgc3RydWN0IGJ0ZiAqYnRmLCBjb25zdCBzdHJ1Y3QgYnRmX3BhcmFtXG4gXHRyZXR1cm4gX19pc19rZnVuY19wdHJfYXJnX3R5cGUoYnRmLCBhcmcsIEtGX0FSR19UQVNLX1dPUktfSUQpO1xuIH1cbiBcbitzdGF0aWMgYm9vbCBpc19rZnVuY19hcmdfdGhyZWFkX3dxKGNvbnN0IHN0cnVjdCBidGYgKmJ0ZiwgY29uc3Qgc3RydWN0IGJ0Zl9wYXJhbSAqYXJnKVxuK3tcbitcdHJldHVybiBfX2lzX2tmdW5jX3B0cl9hcmdfdHlwZShidGYsIGFyZywgS0ZfQVJHX1RIUkVBRF9XUV9JRCk7XG4rfVxuK1xuIHN0YXRpYyBib29sIGlzX2tmdW5jX2FyZ19yZXNfc3Bpbl9sb2NrKGNvbnN0IHN0cnVjdCBidGYgKmJ0ZiwgY29uc3Qgc3RydWN0IGJ0Zl9wYXJhbSAqYXJnKVxuIHtcbiBcdHJldHVybiBfX2lzX2tmdW5jX3B0cl9hcmdfdHlwZShidGYsIGFyZywgS0ZfQVJHX1JFU19TUElOX0xPQ0tfSUQpO1xuQEAgLTExMTMyLDYgKzExMTQ4LDcgQEAgZW51bSBrZnVuY19wdHJfYXJnX3R5cGUge1xuIFx0S0ZfQVJHX1BUUl9UT19JUlFfRkxBRyxcbiBcdEtGX0FSR19QVFJfVE9fUkVTX1NQSU5fTE9DSyxcbiBcdEtGX0FSR19QVFJfVE9fVEFTS19XT1JLLFxuK1x0S0ZfQVJHX1BUUl9UT19USFJFQURfV1EsXG4gfTtcbiBcbiBlbnVtIHNwZWNpYWxfa2Z1bmNfdHlwZSB7XG5AQCAtMTExNzgsNiArMTExOTUsNyBAQCBlbnVtIHNwZWNpYWxfa2Z1bmNfdHlwZSB7XG4gXHRLRl9icGZfcGVyY3B1X29ial9kcm9wLFxuIFx0S0ZfYnBmX3Rocm93LFxuIFx0S0ZfYnBmX3dxX3NldF9jYWxsYmFjayxcbitcdEtGX2JwZl90aHJlYWRfd3Ffc2V0X2NhbGxiYWNrLFxuIFx0S0ZfYnBmX3ByZWVtcHRfZGlzYWJsZSxcbiBcdEtGX2JwZl9wcmVlbXB0X2VuYWJsZSxcbiBcdEtGX2JwZl9pdGVyX2Nzc190YXNrX25ldyxcbkBAIC0xMTI1OCw2ICsxMTI3Niw3IEBAIEJURl9JRChmdW5jLCBicGZfcGVyY3B1X29ial9kcm9wX2ltcGwpXG4gQlRGX0lEKGZ1bmMsIGJwZl9wZXJjcHVfb2JqX2Ryb3ApXG4gQlRGX0lEKGZ1bmMsIGJwZl90aHJvdylcbiBCVEZfSUQoZnVuYywgYnBmX3dxX3NldF9jYWxsYmFjaylcbitCVEZfSUQoZnVuYywgYnBmX3RocmVhZF93cV9zZXRfY2FsbGJhY2spXG4gQlRGX0lEKGZ1bmMsIGJwZl9wcmVlbXB0X2Rpc2FibGUpXG4gQlRGX0lEKGZ1bmMsIGJwZl9wcmVlbXB0X2VuYWJsZSlcbiAjaWZkZWYgQ09ORklHX0NHUk9VUFNcbkBAIC0xMTQ2MCw2ICsxMTQ3OSw4IEBAIGdldF9rZnVuY19hcmdfdHlwZShzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52LCBzdHJ1Y3QgYnBmX2NhbGxfYXJnX21ldGEgKm1ldGEsXG4gXHRcdGFyZ190eXBlID0gS0ZfQVJHX1BUUl9UT19USU1FUjtcbiBcdGVsc2UgaWYgKGlzX2tmdW5jX2FyZ190YXNrX3dvcmsobWV0YS1cdTAwM2VidGYsIFx1MDAyNmFyZ3NbYXJnXSkpXG4gXHRcdGFyZ190eXBlID0gS0ZfQVJHX1BUUl9UT19UQVNLX1dPUks7XG4rXHRlbHNlIGlmIChpc19rZnVuY19hcmdfdGhyZWFkX3dxKG1ldGEtXHUwMDNlYnRmLCBcdTAwMjZhcmdzW2FyZ10pKVxuK1x0XHRhcmdfdHlwZSA9IEtGX0FSR19QVFJfVE9fVEhSRUFEX1dRO1xuIFx0ZWxzZSBpZiAoaXNfa2Z1bmNfYXJnX2lycV9mbGFnKG1ldGEtXHUwMDNlYnRmLCBcdTAwMjZhcmdzW2FyZ10pKVxuIFx0XHRhcmdfdHlwZSA9IEtGX0FSR19QVFJfVE9fSVJRX0ZMQUc7XG4gXHRlbHNlIGlmIChpc19rZnVuY19hcmdfcmVzX3NwaW5fbG9jayhtZXRhLVx1MDAzZWJ0ZiwgXHUwMDI2YXJnc1thcmddKSlcbkBAIC0xMTgzMyw2ICsxMTg1NCw3IEBAIHN0YXRpYyBib29sIGlzX3N5bmNfY2FsbGJhY2tfY2FsbGluZ19rZnVuYyh1MzIgYnRmX2lkKVxuIHN0YXRpYyBib29sIGlzX2FzeW5jX2NhbGxiYWNrX2NhbGxpbmdfa2Z1bmModTMyIGJ0Zl9pZClcbiB7XG4gXHRyZXR1cm4gaXNfYnBmX3dxX3NldF9jYWxsYmFja19rZnVuYyhidGZfaWQpIHx8XG4rXHQgICAgICAgaXNfYnBmX3RocmVhZF93cV9zZXRfY2FsbGJhY2tfa2Z1bmMoYnRmX2lkKSB8fFxuIFx0ICAgICAgIGlzX3Rhc2tfd29ya19hZGRfa2Z1bmMoYnRmX2lkKTtcbiB9XG4gXG5AQCAtMTE4NDcsNiArMTE4NjksMTEgQEAgc3RhdGljIGJvb2wgaXNfYnBmX3dxX3NldF9jYWxsYmFja19rZnVuYyh1MzIgYnRmX2lkKVxuIFx0cmV0dXJuIGJ0Zl9pZCA9PSBzcGVjaWFsX2tmdW5jX2xpc3RbS0ZfYnBmX3dxX3NldF9jYWxsYmFja107XG4gfVxuIFxuK3N0YXRpYyBib29sIGlzX2JwZl90aHJlYWRfd3Ffc2V0X2NhbGxiYWNrX2tmdW5jKHUzMiBidGZfaWQpXG4re1xuK1x0cmV0dXJuIGJ0Zl9pZCA9PSBzcGVjaWFsX2tmdW5jX2xpc3RbS0ZfYnBmX3RocmVhZF93cV9zZXRfY2FsbGJhY2tdO1xuK31cbitcbiBzdGF0aWMgYm9vbCBpc19jYWxsYmFja19jYWxsaW5nX2tmdW5jKHUzMiBidGZfaWQpXG4ge1xuIFx0cmV0dXJuIGlzX3N5bmNfY2FsbGJhY2tfY2FsbGluZ19rZnVuYyhidGZfaWQpIHx8XG5AQCAtMTIxOTIsNiArMTIyMTksNyBAQCBzdGF0aWMgaW50IGNoZWNrX2tmdW5jX2FyZ3Moc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudiwgc3RydWN0IGJwZl9jYWxsX2FyZ19tZVxuIFx0XHRjYXNlIEtGX0FSR19QVFJfVE9fV09SS1FVRVVFOlxuIFx0XHRjYXNlIEtGX0FSR19QVFJfVE9fVElNRVI6XG4gXHRcdGNhc2UgS0ZfQVJHX1BUUl9UT19UQVNLX1dPUks6XG4rXHRcdGNhc2UgS0ZfQVJHX1BUUl9UT19USFJFQURfV1E6XG4gXHRcdGNhc2UgS0ZfQVJHX1BUUl9UT19JUlFfRkxBRzpcbiBcdFx0Y2FzZSBLRl9BUkdfUFRSX1RPX1JFU19TUElOX0xPQ0s6XG4gXHRcdFx0YnJlYWs7XG5AQCAtMTMxMzksNiArMTMxNjcsMTYgQEAgc3RhdGljIGludCBjaGVja19rZnVuY19jYWxsKHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsIHN0cnVjdCBicGZfaW5zbiAqaW5zbixcbiBcdFx0fVxuIFx0fVxuIFxuK1x0aWYgKGlzX2JwZl90aHJlYWRfd3Ffc2V0X2NhbGxiYWNrX2tmdW5jKG1ldGEuZnVuY19pZCkpIHtcbitcdFx0ZXJyID0gcHVzaF9jYWxsYmFja19jYWxsKGVudiwgaW5zbiwgaW5zbl9pZHgsIG1ldGEuc3VicHJvZ25vLFxuK1x0XHRcdFx0XHQgc2V0X3RpbWVyX2NhbGxiYWNrX3N0YXRlKTtcbitcdFx0aWYgKGVycikge1xuK1x0XHRcdHZlcmJvc2UoZW52LCBcImtmdW5jICVzIyVkIGZhaWxlZCBjYWxsYmFjayB2ZXJpZmljYXRpb25cXG5cIixcbitcdFx0XHRcdGZ1bmNfbmFtZSwgbWV0YS5mdW5jX2lkKTtcbitcdFx0XHRyZXR1cm4gZXJyO1xuK1x0XHR9XG4rXHR9XG4rXG4gXHRpZiAoaXNfdGFza193b3JrX2FkZF9rZnVuYyhtZXRhLmZ1bmNfaWQpKSB7XG4gXHRcdGVyciA9IHB1c2hfY2FsbGJhY2tfY2FsbChlbnYsIGluc24sIGluc25faWR4LCBtZXRhLnN1YnByb2dubyxcbiBcdFx0XHRcdFx0IHNldF90YXNrX3dvcmtfc2NoZWR1bGVfY2FsbGJhY2tfc3RhdGUpO1xuZGlmZiAtLWdpdCBhL2tlcm5lbC9jZ3JvdXAvY2dyb3VwLmMgYi9rZXJuZWwvY2dyb3VwL2Nncm91cC5jXG5pbmRleCAzOGY4ZDlkZjhmYmM0Li4xNjRlMDY5Yzc1NzYyIDEwMDY0NFxuLS0tIGEva2VybmVsL2Nncm91cC9jZ3JvdXAuY1xuKysrIGIva2VybmVsL2Nncm91cC9jZ3JvdXAuY1xuQEAgLTMwNDIsNiArMzA0MiwxOSBAQCBpbnQgY2dyb3VwX2F0dGFjaF90YXNrKHN0cnVjdCBjZ3JvdXAgKmRzdF9jZ3JwLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKmxlYWRlcixcbiBcdHJldHVybiByZXQ7XG4gfVxuIFxuK2ludCBjZ3JvdXBfa3RocmVhZF9hdHRhY2goc3RydWN0IGNncm91cCAqY2dycCwgc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKVxuK3tcbitcdGludCByZXQ7XG4rXG4rXHRjZ3JvdXBfbG9jaygpO1xuK1x0Y2dyb3VwX2F0dGFjaF9sb2NrKENHUlBfQVRUQUNIX0xPQ0tfR0xPQkFMLCBOVUxMKTtcbitcdHJldCA9IGNncm91cF9hdHRhY2hfdGFzayhjZ3JwLCB0YXNrLCBmYWxzZSk7XG4rXHRjZ3JvdXBfYXR0YWNoX3VubG9jayhDR1JQX0FUVEFDSF9MT0NLX0dMT0JBTCwgTlVMTCk7XG4rXHRjZ3JvdXBfdW5sb2NrKCk7XG4rXG4rXHRyZXR1cm4gcmV0O1xuK31cbitcbiBzdHJ1Y3QgdGFza19zdHJ1Y3QgKmNncm91cF9wcm9jc193cml0ZV9zdGFydChjaGFyICpidWYsIGJvb2wgdGhyZWFkZ3JvdXAsXG4gXHRcdFx0XHRcdCAgICAgZW51bSBjZ3JvdXBfYXR0YWNoX2xvY2tfbW9kZSAqbG9ja19tb2RlKVxuIHtcbmRpZmYgLS1naXQgYS9tbS9icGZfbWVtY29udHJvbC5jIGIvbW0vYnBmX21lbWNvbnRyb2wuY1xuaW5kZXggNzE2ZGY0OWQ3NjQ3Ny4uM2Y3YTVjOTdlMTM1NSAxMDA2NDRcbi0tLSBhL21tL2JwZl9tZW1jb250cm9sLmNcbisrKyBiL21tL2JwZl9tZW1jb250cm9sLmNcbkBAIC02LDYgKzYsNyBAQFxuICAqL1xuIFxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L21lbWNvbnRyb2wuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L3N3YXAuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L2JwZi5oXHUwMDNlXG4gXG4gX19icGZfa2Z1bmNfc3RhcnRfZGVmcygpO1xuQEAgLTE1OSw2ICsxNjAsNjEgQEAgX19icGZfa2Z1bmMgdm9pZCBicGZfbWVtX2Nncm91cF9mbHVzaF9zdGF0cyhzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2cpXG4gXHRtZW1fY2dyb3VwX2ZsdXNoX3N0YXRzKG1lbWNnKTtcbiB9XG4gXG4rLyoqXG4rICogYnBmX3RyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMgLSBhdHRlbXB0IHRvIHJlY2xhaW0gcGFnZXMgZnJvbVxuKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSBtZW1vcnkgY2dyb3VwXG4rICogQG1lbWNnOiAgICAgICAgICAgdGhlIHRhcmdldCBtZW1vcnkgY2dyb3VwIHRvIHJlY2xhaW0gZnJvbVxuKyAqIEBucl9wYWdlczogICAgICAgIHRoZSBudW1iZXIgb2YgcGFnZXMgdG8gcmVjbGFpbVxuKyAqIEBnZnBfbWFzazogICAgICAgIEdGUCBmbGFncyBjb250cm9sbGluZyB0aGUgcmVjbGFpbSBiZWhhdmlvclxuKyAqIEByZWNsYWltX29wdGlvbnM6IGJpdG1hc2sgb2YgTUVNQ0dfUkVDTEFJTV8qIGZsYWdzIHRvIHR1bmVcbisgKiAgICAgICAgICAgICAgICAgICByZWNsYWltIHN0cmF0ZWd5XG4rICogQHN3YXBwaW5lc3M6ICAgICAgc3dhcHBpbmVzcyBvdmVycmlkZSB2YWx1ZSwgb3IgYSBzZW50aW5lbCB0byB1c2VcbisgKiAgICAgICAgICAgICAgICAgICB0aGUgZGVmYXVsdFxuKyAqXG4rICogQlBGLWZhY2luZyB3cmFwcGVyIGFyb3VuZCB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKCkgdGhhdFxuKyAqIHZhbGlkYXRlcyBhbmQgdHJhbnNsYXRlcyB0aGUgQHN3YXBwaW5lc3MgYXJndW1lbnQgYmVmb3JlXG4rICogZGVsZWdhdGluZyB0byB0aGUgY29yZSByZWNsYWltIHBhdGguXG4rICpcbisgKiBUaGUgQHN3YXBwaW5lc3MgcGFyYW1ldGVyIGZvbGxvd3MgdGhlc2Ugc2VtYW50aWNzOlxuKyAqICAgLSBWYWx1ZXMgaW4gW01JTl9TV0FQUElORVNTLCBTV0FQUElORVNTX0FOT05fT05MWV0gYXJlIHBhc3NlZFxuKyAqICAgICB0aHJvdWdoIGFzIGFuIGV4cGxpY2l0IHN3YXBwaW5lc3Mgb3ZlcnJpZGUuXG4rICogICAtIFZhbHVlcyBiZWxvdyBNSU5fU1dBUFBJTkVTUyBhcmUgdHJlYXRlZCBhcyBcInVzZSB0aGUgc3lzdGVtXG4rICogICAgIGRlZmF1bHRcIjsgdGhlIG92ZXJyaWRlIHBvaW50ZXIgaXMgc2V0IHRvIE5VTEwgYW5kIHRoZSBjZ3JvdXAnc1xuKyAqICAgICBvd24gc3dhcHBpbmVzcyBzZXR0aW5nIHRha2VzIGVmZmVjdC5cbisgKiAgIC0gVmFsdWVzIGFib3ZlIFNXQVBQSU5FU1NfQU5PTl9PTkxZIGFyZSByZWplY3RlZCBhcyBpbnZhbGlkLlxuKyAqICAgLSBJZiBAcmVjbGFpbV9vcHRpb25zIGRvZXMgbm90IGluY2x1ZGUgTUVNQ0dfUkVDTEFJTV9QUk9BQ1RJVkUsXG4rICogICAgIHRoZSBAc3dhcHBpbmVzcyBvdmVycmlkZSBpcyBpZ25vcmVkIGVudGlyZWx5IGJ5IHRoZSBjb3JlXG4rICogICAgIHJlY2xhaW0gcGF0aCBhbmQgdGhlIHN5c3RlbSBkZWZhdWx0IGlzIHVzZWQgcmVnYXJkbGVzcy5cbisgKlxuKyAqIFN3YXAgdXNhZ2UgZHVyaW5nIHJlY2xhaW0gaXMgZ2F0ZWQgb24gQHJlY2xhaW1fb3B0aW9uczogc3dhcCBpc1xuKyAqIGNvbnNpZGVyZWQgb25seSB3aGVuIE1FTUNHX1JFQ0xBSU1fTUFZX1NXQVAgaXMgc2V0LiAgV2l0aG91dCB0aGlzXG4rICogZmxhZywgcmVjbGFpbSBpcyByZXN0cmljdGVkIHRvIGZpbGUtYmFja2VkIHBhZ2VzIHJlZ2FyZGxlc3Mgb2YgdGhlXG4rICogQHN3YXBwaW5lc3MgdmFsdWUgb3IgdGhlIGNncm91cCdzIHN3YXBwaW5lc3Mgc2V0dGluZy5cbisgKlxuKyAqIFJldHVybjpcbisgKiAgIFRoZSBudW1iZXIgb2YgcGFnZXMgYWN0dWFsbHkgcmVjbGFpbWVkIG9uIHN1Y2Nlc3MsIG9yIDBcbisgKiAgIGlmIEBzd2FwcGluZXNzIGV4Y2VlZHMgU1dBUFBJTkVTU19BTk9OX09OTFkuXG4rICovXG4rX19icGZfa2Z1bmMgdW5zaWduZWQgbG9uZ1xuK2JwZl90cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZyxcbitcdFx0XHRcdCB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzLFxuK1x0XHRcdFx0IGdmcF90IGdmcF9tYXNrLFxuK1x0XHRcdFx0IHVuc2lnbmVkIGludCByZWNsYWltX29wdGlvbnMsXG4rXHRcdFx0XHQgaW50IHN3YXBwaW5lc3MpXG4re1xuK1x0aW50ICpzd2FwaW5lc3NfcHRyO1xuK1xuK1x0aWYgKHN3YXBwaW5lc3MgXHUwMDNlIFNXQVBQSU5FU1NfQU5PTl9PTkxZKVxuK1x0XHRyZXR1cm4gMDtcbitcdGVsc2UgaWYgKHN3YXBwaW5lc3MgXHUwMDNjIE1JTl9TV0FQUElORVNTKVxuK1x0XHRzd2FwaW5lc3NfcHRyID0gTlVMTDtcbitcdGVsc2VcbitcdFx0c3dhcGluZXNzX3B0ciA9IFx1MDAyNnN3YXBwaW5lc3M7XG4rXG4rXHRyZXR1cm4gdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcyhtZW1jZywgbnJfcGFnZXMsIGdmcF9tYXNrLFxuK1x0XHRcdFx0XHQgICAgcmVjbGFpbV9vcHRpb25zLCBzd2FwaW5lc3NfcHRyKTtcbit9XG4rXG4gX19icGZfa2Z1bmNfZW5kX2RlZnMoKTtcbiBcbiBCVEZfS0ZVTkNTX1NUQVJUKGJwZl9tZW1jb250cm9sX2tmdW5jcylcbkBAIC0xNzIsNiArMjI4LDggQEAgQlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9tZW1fY2dyb3VwX3VzYWdlKVxuIEJURl9JRF9GTEFHUyhmdW5jLCBicGZfbWVtX2Nncm91cF9wYWdlX3N0YXRlKVxuIEJURl9JRF9GTEFHUyhmdW5jLCBicGZfbWVtX2Nncm91cF9mbHVzaF9zdGF0cywgS0ZfU0xFRVBBQkxFKVxuIFxuK0JURl9JRF9GTEFHUyhmdW5jLCBicGZfdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcywgS0ZfU0xFRVBBQkxFKVxuK1xuIEJURl9LRlVOQ1NfRU5EKGJwZl9tZW1jb250cm9sX2tmdW5jcylcbiBcbiBzdGF0aWMgY29uc3Qgc3RydWN0IGJ0Zl9rZnVuY19pZF9zZXQgYnBmX21lbWNvbnRyb2xfa2Z1bmNfc2V0ID0ge1xuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9icGZfZXhwZXJpbWVudGFsLmggYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvYnBmX2V4cGVyaW1lbnRhbC5oXG5pbmRleCBmZjM3YWU1YTExM2RjLi5lYTkwNWVhNTYwM2MyIDEwMDY0NFxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL2JwZl9leHBlcmltZW50YWwuaFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL2JwZl9leHBlcmltZW50YWwuaFxuQEAgLTM1MSw2ICszNTEsMTMgQEAgZXh0ZXJuIHZvaWQgYnBmX2l0ZXJfY3NzX2Rlc3Ryb3koc3RydWN0IGJwZl9pdGVyX2NzcyAqaXQpIF9fd2VhayBfX2tzeW07XG4gZXh0ZXJuIGludCBicGZfd3FfaW5pdChzdHJ1Y3QgYnBmX3dxICp3cSwgdm9pZCAqcF9fbWFwLCB1bnNpZ25lZCBpbnQgZmxhZ3MpIF9fd2VhayBfX2tzeW07XG4gZXh0ZXJuIGludCBicGZfd3Ffc3RhcnQoc3RydWN0IGJwZl93cSAqd3EsIHVuc2lnbmVkIGludCBmbGFncykgX193ZWFrIF9fa3N5bTtcbiBcbitzdHJ1Y3QgYnBmX3RocmVhZF93cTtcbitleHRlcm4gaW50IGJwZl90aHJlYWRfd3FfaW5pdChzdHJ1Y3QgYnBmX3RocmVhZF93cSAqdHdxLCB2b2lkICpwX19tYXAsXG4rXHRcdFx0ICAgICAgX191NjQgY2dyb3VwX2lkLFxuK1x0XHRcdCAgICAgIHVuc2lnbmVkIGludCBmbGFncykgX193ZWFrIF9fa3N5bTtcbitleHRlcm4gaW50IGJwZl90aHJlYWRfd3Ffc3RhcnQoc3RydWN0IGJwZl90aHJlYWRfd3EgKnR3cSxcbitcdFx0XHQgICAgICAgdW5zaWduZWQgaW50IGZsYWdzKSBfX3dlYWsgX19rc3ltO1xuK1xuIHN0cnVjdCBicGZfaXRlcl9rbWVtX2NhY2hlO1xuIGV4dGVybiBpbnQgYnBmX2l0ZXJfa21lbV9jYWNoZV9uZXcoc3RydWN0IGJwZl9pdGVyX2ttZW1fY2FjaGUgKml0KSBfX3dlYWsgX19rc3ltO1xuIGV4dGVybiBzdHJ1Y3Qga21lbV9jYWNoZSAqYnBmX2l0ZXJfa21lbV9jYWNoZV9uZXh0KHN0cnVjdCBicGZfaXRlcl9rbWVtX2NhY2hlICppdCkgX193ZWFrIF9fa3N5bTtcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9tZW1jZ19hc3luY19yZWNsYWltLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9tZW1jZ19hc3luY19yZWNsYWltLmNcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwLi40MGE1ZmU2MmNiMzg0XG4tLS0gL2Rldi9udWxsXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9tZW1jZ19hc3luY19yZWNsYWltLmNcbkBAIC0wLDAgKzEsNDc5IEBAXG4rLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcbisvKlxuKyAqIE1lbW9yeSBjb250cm9sbGVyIGVCUEYgYXN5bmMgcmVjbGFpbSB0ZXN0XG4rICovXG4rXG4rI2luY2x1ZGUgXHUwMDNjdGVzdF9wcm9ncy5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3lzL21tYW4uaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3N5cy9zdGF0LmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NzeXMvdGltZS5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3lzL3Zmcy5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3lzL3dhaXQuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2ZjbnRsLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9tYWdpYy5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjdW5pc3RkLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NzdGRpby5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3RkbGliLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NzdHJpbmcuaFx1MDAzZVxuK1xuKyNpbmNsdWRlIFwiY2dyb3VwX2hlbHBlcnMuaFwiXG4rXG4rc3RydWN0IGJwZl9hcmdzX3Mge1xuK1x0dTY0IGhpZ2hfY2dyb3VwX2lkO1xuK1x0dTY0IGxvd19jZ3JvdXBfaWQ7XG4rXHR1NjQgZXZlbnRfZGVsdGFfdGhyZXNob2xkO1xuK1x0dTY0IGNoZWNrX25zO1xuK307XG4rXG4rI2luY2x1ZGUgXCJtZW1jZ19hc3luY19yZWNsYWltLnNrZWwuaFwiXG4rXG4rI2RlZmluZSBGSUxFX1NJWkUgKDMyICogMTAyNCAqIDEwMjR1bClcbisjZGVmaW5lIEJVRkZFUl9TSVpFICg0MDk2KVxuKyNkZWZpbmUgQ0dfTElNSVQgKDMyICogMTAyNCAqIDEwMjR1bClcbisjZGVmaW5lIFJFQURfVElNRVMgMTZcbitcbisjZGVmaW5lIENHX0RJUiBcIi9tZW1jZ19hc3luY19yZWNsYWltXCJcbisjZGVmaW5lIENHX0hJR0hfRElSIENHX0RJUiBcIi9oaWdoXCJcbisjZGVmaW5lIENHX0xPV19ESVIgQ0dfRElSIFwiL2xvd1wiXG4rXG4rI2RlZmluZSBDSEVDS19QRVJJT0RfTlMgKDIgKiAxMDAwICogMTAwMHVsbClcbisjZGVmaW5lIEVWRU5UX0RFTFRBX1RIUkVTSE9MRCAxXG4rXG4rLypcbisgKiBUZXN0IGZpbGVzIG11c3QgcmVzaWRlIG9uIGEgZmlsZXN5c3RlbSB0aGF0IHN1cHBvcnRzIHBhZ2UgcmVjbGFpbSB3aXRob3V0XG4rICogc3dhcCAoZS5nLiBleHQ0KS4gSWYgL3RtcCBpcyBvbiB0bXBmcywgdGhlIGZpbGUgcGFnZXMgYXJlIHNobWVtLWJhY2tlZFxuKyAqIGFuZCBjYW4gb25seSBiZSByZWNsYWltZWQgdGhyb3VnaCBzd2FwLiBCdXQgdGhlIHRlc3QgZGlzYWJsZXMgc3dhcFxuKyAqIChtZW1vcnkuc3dhcC5tYXg9MCksIG1ha2luZyByZWNsYWltIGltcG9zc2libGUgYW5kIGNhdXNpbmcgT09NLlxuKyAqXG4rICogUGljayBhIGRpcmVjdG9yeSBvbiBhIG5vbi10bXBmcyBmaWxlc3lzdGVtOiB0cnkgJFRNUERJUiBmaXJzdCwgdGhlbiAvdG1wLFxuKyAqIGFuZCBmYWxsIGJhY2sgdG8gdGhlIGN1cnJlbnQgZGlyZWN0b3J5IGlmIHRoZSBjaG9zZW4gcGF0aCBpcyBvbiB0bXBmcy5cbisgKi9cbitzdGF0aWMgaW50IGdldF90ZXN0X2RpcihjaGFyICpidWYsIHNpemVfdCBzaXplKVxuK3tcbitcdHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgY2FuZGlkYXRlc1tdID0geyBcIi90bXBcIiwgXCIuXCIgfTtcbitcdGNvbnN0IGNoYXIgKnRtcGRpciA9IGdldGVudihcIlRNUERJUlwiKTtcbitcdHN0cnVjdCBzdGF0ZnMgc2ZzO1xuK1x0c2l6ZV90IGk7XG4rXG4rXHRpZiAodG1wZGlyIFx1MDAyNlx1MDAyNiB0bXBkaXJbMF0gXHUwMDI2XHUwMDI2IHN0YXRmcyh0bXBkaXIsIFx1MDAyNnNmcykgPT0gMCBcdTAwMjZcdTAwMjZcbitcdCAgICBzZnMuZl90eXBlICE9IFRNUEZTX01BR0lDKSB7XG4rXHRcdHNucHJpbnRmKGJ1Ziwgc2l6ZSwgXCIlc1wiLCB0bXBkaXIpO1xuK1x0XHRyZXR1cm4gMDtcbitcdH1cbitcbitcdGZvciAoaSA9IDA7IGkgXHUwMDNjIEFSUkFZX1NJWkUoY2FuZGlkYXRlcyk7IGkrKykge1xuK1x0XHRpZiAoc3RhdGZzKGNhbmRpZGF0ZXNbaV0sIFx1MDAyNnNmcykgPT0gMCBcdTAwMjZcdTAwMjZcbitcdFx0ICAgIHNmcy5mX3R5cGUgIT0gVE1QRlNfTUFHSUMpIHtcbitcdFx0XHRzbnByaW50ZihidWYsIHNpemUsIFwiJXNcIiwgY2FuZGlkYXRlc1tpXSk7XG4rXHRcdFx0cmV0dXJuIDA7XG4rXHRcdH1cbitcdH1cbitcbitcdHJldHVybiAtMTtcbit9XG4rXG4rc3RhdGljIGludCBzZXR1cF9oaWdoX2xvd19jZ3JvdXBzKHU2NCAqaGlnaF9jZ3JvdXBfaWQsIHU2NCAqbG93X2Nncm91cF9pZClcbit7XG4rXHRpbnQgcmV0O1xuK1x0Y2hhciBsaW1pdF9idWZbMjBdO1xuK1xuK1x0cmV0ID0gc2V0dXBfY2dyb3VwX2Vudmlyb25tZW50KCk7XG4rXHRpZiAoIUFTU0VSVF9PSyhyZXQsIFwic2V0dXBfY2dyb3VwX2Vudmlyb25tZW50XCIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXG4rXHRyZXQgPSBjcmVhdGVfYW5kX2dldF9jZ3JvdXAoQ0dfRElSKTtcbitcdGlmICghQVNTRVJUX0dFKHJldCwgMCwgXCJjcmVhdGVfYW5kX2dldF9jZ3JvdXAgXCIgQ0dfRElSKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1x0Y2xvc2UocmV0KTtcbitcbitcdHJldCA9IGVuYWJsZV9jb250cm9sbGVycyhDR19ESVIsIFwibWVtb3J5XCIpO1xuK1x0aWYgKCFBU1NFUlRfT0socmV0LCBcImVuYWJsZV9jb250cm9sbGVyc1wiKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1xuK1x0c25wcmludGYobGltaXRfYnVmLCBzaXplb2YobGltaXRfYnVmKSwgXCIlbHVcIiwgQ0dfTElNSVQpO1xuK1x0cmV0ID0gd3JpdGVfY2dyb3VwX2ZpbGUoQ0dfRElSLCBcIm1lbW9yeS5tYXhcIiwgbGltaXRfYnVmKTtcbitcdGlmICghQVNTRVJUX09LKHJldCwgXCJ3cml0ZV9jZ3JvdXBfZmlsZSBtZW1vcnkubWF4XCIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXG4rXHRyZXQgPSB3cml0ZV9jZ3JvdXBfZmlsZShDR19ESVIsIFwibWVtb3J5LnN3YXAubWF4XCIsIFwiMFwiKTtcbitcdGlmICghQVNTRVJUX09LKHJldCwgXCJ3cml0ZV9jZ3JvdXBfZmlsZSBtZW1vcnkuc3dhcC5tYXhcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcbitcdHJldCA9IGNyZWF0ZV9hbmRfZ2V0X2Nncm91cChDR19ISUdIX0RJUik7XG4rXHRpZiAoIUFTU0VSVF9HRShyZXQsIDAsIFwiY3JlYXRlX2FuZF9nZXRfY2dyb3VwIFwiIENHX0hJR0hfRElSKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1x0Y2xvc2UocmV0KTtcbitcbitcdCpoaWdoX2Nncm91cF9pZCA9IGdldF9jZ3JvdXBfaWQoQ0dfSElHSF9ESVIpO1xuK1x0aWYgKCFBU1NFUlRfR1QoKmhpZ2hfY2dyb3VwX2lkLCAwLCBcImdldF9jZ3JvdXBfaWRcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcbitcdHJldCA9IGNyZWF0ZV9hbmRfZ2V0X2Nncm91cChDR19MT1dfRElSKTtcbitcdGlmICghQVNTRVJUX0dFKHJldCwgMCwgXCJjcmVhdGVfYW5kX2dldF9jZ3JvdXAgXCIgQ0dfTE9XX0RJUikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcdGNsb3NlKHJldCk7XG4rXG4rXHQqbG93X2Nncm91cF9pZCA9IGdldF9jZ3JvdXBfaWQoQ0dfTE9XX0RJUik7XG4rXHRpZiAoIUFTU0VSVF9HVCgqaGlnaF9jZ3JvdXBfaWQsIDAsIFwiZ2V0X2Nncm91cF9pZFwiKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1xuK1x0cmV0dXJuIDA7XG4rXG4rY2xlYW51cDpcbitcdGNsZWFudXBfY2dyb3VwX2Vudmlyb25tZW50KCk7XG4rXHRyZXR1cm4gLTE7XG4rfVxuK1xuK3N0YXRpYyBpbnQgd3JpdGVfZmlsZShjb25zdCBjaGFyICpmaWxlbmFtZSlcbit7XG4rXHRpbnQgcmV0ID0gLTE7XG4rXHRzaXplX3Qgd3JpdHRlbiA9IDA7XG4rXHRjaGFyICpidWZmZXI7XG4rXHRGSUxFICpmcDtcbitcbitcdGZwID0gZm9wZW4oZmlsZW5hbWUsIFwid2JcIik7XG4rXHRpZiAoIWZwKVxuK1x0XHRnb3RvIG91dDtcbitcbitcdGJ1ZmZlciA9IG1hbGxvYyhCVUZGRVJfU0laRSk7XG4rXHRpZiAoIWJ1ZmZlcilcbitcdFx0Z290byBjbGVhbnVwX2ZwO1xuK1xuK1x0bWVtc2V0KGJ1ZmZlciwgJ0EnLCBCVUZGRVJfU0laRSk7XG4rXG4rXHR3aGlsZSAod3JpdHRlbiBcdTAwM2MgRklMRV9TSVpFKSB7XG4rXHRcdHNpemVfdCB0b193cml0ZSA9IEZJTEVfU0laRSAtIHdyaXR0ZW4gXHUwMDNjIEJVRkZFUl9TSVpFID9cbitcdFx0XHRcdCAgRklMRV9TSVpFIC0gd3JpdHRlbiA6IEJVRkZFUl9TSVpFO1xuK1xuK1x0XHRpZiAoZndyaXRlKGJ1ZmZlciwgMSwgdG9fd3JpdGUsIGZwKSAhPSB0b193cml0ZSlcbitcdFx0XHRnb3RvIGNsZWFudXA7XG4rXHRcdHdyaXR0ZW4gKz0gdG9fd3JpdGU7XG4rXHR9XG4rXG4rXHRyZXQgPSAwO1xuK2NsZWFudXA6XG4rXHRmcmVlKGJ1ZmZlcik7XG4rY2xlYW51cF9mcDpcbitcdGZjbG9zZShmcCk7XG4rb3V0OlxuK1x0cmV0dXJuIHJldDtcbit9XG4rXG4rc3RhdGljIGludCByZWFkX2ZpbGUoY29uc3QgY2hhciAqZmlsZW5hbWUsIGludCBpdGVyYXRpb25zKVxuK3tcbitcdGludCByZXQgPSAtMTtcbitcdGxvbmcgcGFnZV9zaXplID0gc3lzY29uZihfU0NfUEFHRVNJWkUpO1xuK1x0Y2hhciAqbWFwO1xuK1x0c2l6ZV90IGk7XG4rXHRpbnQgZmQ7XG4rXHRzdHJ1Y3Qgc3RhdCBzYjtcbitcbitcdGZkID0gb3BlbihmaWxlbmFtZSwgT19SRE9OTFkpO1xuK1x0aWYgKGZkID09IC0xKVxuK1x0XHRnb3RvIG91dDtcbitcbitcdGlmIChmc3RhdChmZCwgXHUwMDI2c2IpID09IC0xKVxuK1x0XHRnb3RvIGNsZWFudXBfZmQ7XG4rXG4rXHRpZiAoc2Iuc3Rfc2l6ZSAhPSBGSUxFX1NJWkUpIHtcbitcdFx0ZnByaW50ZihzdGRlcnIsIFwiRmlsZSBzaXplIG1pc21hdGNoOiBleHBlY3RlZCAlbHUsIGdvdCAlbHVcXG5cIixcbitcdFx0XHQodW5zaWduZWQgbG9uZylGSUxFX1NJWkUsICh1bnNpZ25lZCBsb25nKXNiLnN0X3NpemUpO1xuK1x0XHRnb3RvIGNsZWFudXBfZmQ7XG4rXHR9XG4rXG4rXHRtYXAgPSBtbWFwKE5VTEwsIEZJTEVfU0laRSwgUFJPVF9SRUFELCBNQVBfUFJJVkFURSwgZmQsIDApO1xuK1x0aWYgKG1hcCA9PSBNQVBfRkFJTEVEKVxuK1x0XHRnb3RvIGNsZWFudXBfZmQ7XG4rXG4rXHRmb3IgKGludCBpdGVyID0gMDsgaXRlciBcdTAwM2MgaXRlcmF0aW9uczsgaXRlcisrKSB7XG4rXHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIEZJTEVfU0laRTsgaSArPSBwYWdlX3NpemUpIHtcbitcdFx0XHQvKiBhY2Nlc3MgYSBieXRlIHRvIHRyaWdnZXIgcGFnZSBmYXVsdCAqL1xuK1x0XHRcdGFzbSB2b2xhdGlsZShcIlwiIDo6IFwiclwiKG1hcFtpXSkgOiBcIm1lbW9yeVwiKTtcbitcdFx0fVxuK1x0fVxuK1xuK1x0aWYgKG11bm1hcChtYXAsIEZJTEVfU0laRSkgPT0gLTEpXG4rXHRcdGdvdG8gY2xlYW51cF9mZDtcbitcbitcdHJldCA9IDA7XG4rXG4rY2xlYW51cF9mZDpcbitcdGNsb3NlKGZkKTtcbitvdXQ6XG4rXHRyZXR1cm4gcmV0O1xuK31cbitcbitzdGF0aWMgaW50IHJlYWxfdGVzdF9jaGlsZF93b3JrKGNvbnN0IGNoYXIgKmNncm91cF9wYXRoLCBjaGFyICpkYXRhX2ZpbGVuYW1lLFxuK1x0XHRcdFx0Y2hhciAqdGltZV9maWxlbmFtZSwgaW50IHJlYWRfdGltZXMpXG4re1xuK1x0c3RydWN0IHRpbWV2YWwgc3RhcnQsIGVuZDtcbitcdGRvdWJsZSBlbGFwc2VkO1xuK1x0RklMRSAqZnA7XG4rXG4rXHRpZiAoIUFTU0VSVF9PSyhqb2luX3BhcmVudF9jZ3JvdXAoY2dyb3VwX3BhdGgpLCBcImpvaW5fcGFyZW50X2Nncm91cFwiKSlcbitcdFx0cmV0dXJuIC0xO1xuK1xuK1x0Z2V0dGltZW9mZGF5KFx1MDAyNnN0YXJ0LCBOVUxMKTtcbitcbitcdGlmICghQVNTRVJUX09LKHdyaXRlX2ZpbGUoZGF0YV9maWxlbmFtZSksIFwid3JpdGVfZmlsZVwiKSlcbitcdFx0cmV0dXJuIC0xO1xuK1xuK1x0aWYgKCFBU1NFUlRfT0socmVhZF9maWxlKGRhdGFfZmlsZW5hbWUsIHJlYWRfdGltZXMpLCBcInJlYWRfZmlsZVwiKSlcbitcdFx0cmV0dXJuIC0xO1xuK1xuK1x0Z2V0dGltZW9mZGF5KFx1MDAyNmVuZCwgTlVMTCk7XG4rXG4rXHRpZiAoIXRpbWVfZmlsZW5hbWUpXG4rXHRcdHJldHVybiAwO1xuK1xuK1x0ZWxhcHNlZCA9IChlbmQudHZfc2VjIC0gc3RhcnQudHZfc2VjKSArXG4rXHRcdCAgKGVuZC50dl91c2VjIC0gc3RhcnQudHZfdXNlYykgLyAxMDAwMDAwLjA7XG4rXHRwcmludGYoXCIlLjZmXFxuXCIsIGVsYXBzZWQpO1xuK1xuK1x0ZnAgPSBmb3Blbih0aW1lX2ZpbGVuYW1lLCBcIndcIik7XG4rXHRpZiAoIUFTU0VSVF9PS19QVFIoZnAsIFwiZm9wZW5cIikpXG4rXHRcdHJldHVybiAtMTtcbitcdGZwcmludGYoZnAsIFwiJS42ZlwiLCBlbGFwc2VkKTtcbitcdGZjbG9zZShmcCk7XG4rXG4rXHRyZXR1cm4gMDtcbit9XG4rXG4rc3RhdGljIGludCBnZXRfdGltZShjaGFyICp0aW1lX2ZpbGVuYW1lLCBkb3VibGUgKnRpbWUpXG4re1xuK1x0aW50IHJldCA9IC0xO1xuK1x0RklMRSAqZnA7XG4rXHRjaGFyIGJ1Zls2NF07XG4rXG4rXHRmcCA9IGZvcGVuKHRpbWVfZmlsZW5hbWUsIFwiclwiKTtcbitcdGlmICghQVNTRVJUX09LX1BUUihmcCwgXCJmb3BlblwiKSlcbitcdFx0Z290byBvdXQ7XG4rXG4rXHRpZiAoIUFTU0VSVF9PS19QVFIoZmdldHMoYnVmLCBzaXplb2YoYnVmKSwgZnApLCBcImZnZXRzXCIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXG4rXHRpZiAoc3NjYW5mKGJ1ZiwgXCIlbGZcIiwgdGltZSkgIT0gMSkge1xuK1x0XHRQUklOVF9GQUlMKFwic3NjYW5mICVzXCIsIGJ1Zik7XG4rXHRcdGdvdG8gY2xlYW51cDtcbitcdH1cbitcbitcdHJldCA9IDA7XG4rY2xlYW51cDpcbitcdGZjbG9zZShmcCk7XG4rb3V0OlxuK1x0cmV0dXJuIHJldDtcbit9XG4rXG4rc3RhdGljIGludFxuK3J1bl9oaWdoX2xvd193b3JrbG9hZChkb3VibGUgKmhpZ2hfZWxhcHNlZCwgZG91YmxlICpsb3dfZWxhcHNlZCwgaW50IHJlYWRfdGltZXMpXG4re1xuK1x0Y2hhciB0ZXN0X2RpcltQQVRIX01BWF0sIGhpZ2hfZGF0YV9maWxlW1BBVEhfTUFYXSwgbG93X2RhdGFfZmlsZVtQQVRIX01BWF07XG4rXHRjaGFyIGhpZ2hfdGltZV9maWxlW1BBVEhfTUFYXSwgbG93X3RpbWVfZmlsZVtQQVRIX01BWF07XG4rXHRpbnQgcmV0LCBmZDtcbitcdHBpZF90IGhpZ2hfcGlkLCBsb3dfcGlkO1xuK1x0aW50IHN0YXR1cztcbitcbitcdHJldCA9IGdldF90ZXN0X2Rpcih0ZXN0X2Rpciwgc2l6ZW9mKHRlc3RfZGlyKSk7XG4rXHRpZiAoIUFTU0VSVF9PSyhyZXQsIFwiZ2V0X3Rlc3RfZGlyOiBubyBub24tdG1wZnMgZGlyZWN0b3J5IGZvdW5kXCIpKVxuK1x0XHRyZXR1cm4gLTE7XG4rXG4rXHRmZCA9IHNucHJpbnRmKGhpZ2hfZGF0YV9maWxlLCBzaXplb2YoaGlnaF9kYXRhX2ZpbGUpLFxuK1x0XHQgICAgICBcIiVzL21lbWNnX2FzeW5jX2hpZ2hfZGF0YV9YWFhYWFhcIiwgdGVzdF9kaXIpO1xuK1x0aWYgKCFBU1NFUlRfTFQoZmQsIHNpemVvZihoaWdoX2RhdGFfZmlsZSksIFwiaGlnaF9kYXRhX2ZpbGUgcGF0aFwiKSlcbitcdFx0cmV0dXJuIC0xO1xuK1xuK1x0ZmQgPSBzbnByaW50Zihsb3dfZGF0YV9maWxlLCBzaXplb2YobG93X2RhdGFfZmlsZSksXG4rXHRcdCAgICAgIFwiJXMvbWVtY2dfYXN5bmNfbG93X2RhdGFfWFhYWFhYXCIsIHRlc3RfZGlyKTtcbitcdGlmICghQVNTRVJUX0xUKGZkLCBzaXplb2YobG93X2RhdGFfZmlsZSksIFwibG93X2RhdGFfZmlsZSBwYXRoXCIpKVxuK1x0XHRyZXR1cm4gLTE7XG4rXG4rXHRmZCA9IHNucHJpbnRmKGhpZ2hfdGltZV9maWxlLCBzaXplb2YoaGlnaF90aW1lX2ZpbGUpLFxuK1x0XHQgICAgICBcIiVzL21lbWNnX2FzeW5jX2hpZ2hfdGltZV9YWFhYWFhcIiwgdGVzdF9kaXIpO1xuK1x0aWYgKCFBU1NFUlRfTFQoZmQsIHNpemVvZihoaWdoX3RpbWVfZmlsZSksIFwiaGlnaF90aW1lX2ZpbGUgcGF0aFwiKSlcbitcdFx0cmV0dXJuIC0xO1xuK1xuK1x0ZmQgPSBzbnByaW50Zihsb3dfdGltZV9maWxlLCBzaXplb2YobG93X3RpbWVfZmlsZSksXG4rXHRcdCAgICAgIFwiJXMvbWVtY2dfYXN5bmNfbG93X3RpbWVfWFhYWFhYXCIsIHRlc3RfZGlyKTtcbitcdGlmICghQVNTRVJUX0xUKGZkLCBzaXplb2YobG93X3RpbWVfZmlsZSksIFwibG93X3RpbWVfZmlsZSBwYXRoXCIpKVxuK1x0XHRyZXR1cm4gLTE7XG4rXG4rXHRmZCA9IG1rc3RlbXAoaGlnaF9kYXRhX2ZpbGUpO1xuK1x0aWYgKCFBU1NFUlRfR0UoZmQsIDAsIFwibWtzdGVtcFwiKSlcbitcdFx0cmV0dXJuIC0xO1xuK1x0Y2xvc2UoZmQpO1xuK1xuK1x0ZmQgPSBta3N0ZW1wKGxvd19kYXRhX2ZpbGUpO1xuK1x0aWYgKCFBU1NFUlRfR0UoZmQsIDAsIFwibWtzdGVtcFwiKSlcbitcdFx0Z290byBjbGVhbnVwX2hpZ2hfZGF0YTtcbitcdGNsb3NlKGZkKTtcbitcbitcdGZkID0gbWtzdGVtcChoaWdoX3RpbWVfZmlsZSk7XG4rXHRpZiAoIUFTU0VSVF9HRShmZCwgMCwgXCJta3N0ZW1wXCIpKVxuK1x0XHRnb3RvIGNsZWFudXBfbG93X2RhdGE7XG4rXHRjbG9zZShmZCk7XG4rXG4rXHRmZCA9IG1rc3RlbXAobG93X3RpbWVfZmlsZSk7XG4rXHRpZiAoIUFTU0VSVF9HRShmZCwgMCwgXCJta3N0ZW1wXCIpKVxuK1x0XHRnb3RvIGNsZWFudXBfaGlnaF90aW1lO1xuK1x0Y2xvc2UoZmQpO1xuK1xuK1x0bG93X3BpZCA9IGZvcmsoKTtcbitcdGlmICghQVNTRVJUX0dFKGxvd19waWQsIDAsIFwiZm9yayBsb3dcIikpXG4rXHRcdGdvdG8gY2xlYW51cF9sb3dfdGltZTtcbitcdGlmIChsb3dfcGlkID09IDApXG4rXHRcdGV4aXQocmVhbF90ZXN0X2NoaWxkX3dvcmsoQ0dfTE9XX0RJUiwgbG93X2RhdGFfZmlsZSxcbitcdFx0XHRcdFx0ICBsb3dfdGltZV9maWxlLCByZWFkX3RpbWVzKSk7XG4rXG4rXHRoaWdoX3BpZCA9IGZvcmsoKTtcbitcdGlmICghQVNTRVJUX0dFKGhpZ2hfcGlkLCAwLCBcImZvcmsgaGlnaFwiKSkge1xuK1x0XHQodm9pZCl3YWl0cGlkKGxvd19waWQsIE5VTEwsIDApO1xuK1x0XHRnb3RvIGNsZWFudXBfbG93X3RpbWU7XG4rXHR9XG4rXHRpZiAoaGlnaF9waWQgPT0gMClcbitcdFx0ZXhpdChyZWFsX3Rlc3RfY2hpbGRfd29yayhDR19ISUdIX0RJUiwgaGlnaF9kYXRhX2ZpbGUsXG4rXHRcdFx0XHRcdCAgaGlnaF90aW1lX2ZpbGUsIHJlYWRfdGltZXMpKTtcbitcbitcdHJldCA9IHdhaXRwaWQobG93X3BpZCwgXHUwMDI2c3RhdHVzLCAwKTtcbitcdGlmICghQVNTRVJUX0dUKHJldCwgMCwgXCJsb3cgd2FpdHBpZFwiKSlcbitcdFx0Z290byBjbGVhbnVwX2xvd190aW1lO1xuK1x0aWYgKCFBU1NFUlRfVFJVRShXSUZFWElURUQoc3RhdHVzKSwgXCJsb3cgZXhpdGVkXCIpKVxuK1x0XHRnb3RvIGNsZWFudXBfbG93X3RpbWU7XG4rXHRpZiAoIUFTU0VSVF9FUShXRVhJVFNUQVRVUyhzdGF0dXMpLCAwLCBcImxvdyBleGl0IHN0YXR1c1wiKSlcbitcdFx0Z290byBjbGVhbnVwX2xvd190aW1lO1xuK1xuK1x0cmV0ID0gd2FpdHBpZChoaWdoX3BpZCwgXHUwMDI2c3RhdHVzLCAwKTtcbitcdGlmICghQVNTRVJUX0dUKHJldCwgMCwgXCJoaWdoIHdhaXRwaWRcIikpXG4rXHRcdGdvdG8gY2xlYW51cF9sb3dfdGltZTtcbitcdGlmICghQVNTRVJUX1RSVUUoV0lGRVhJVEVEKHN0YXR1cyksIFwiaGlnaCBleGl0ZWRcIikpXG4rXHRcdGdvdG8gY2xlYW51cF9sb3dfdGltZTtcbitcdGlmICghQVNTRVJUX0VRKFdFWElUU1RBVFVTKHN0YXR1cyksIDAsIFwiaGlnaCBleGl0IHN0YXR1c1wiKSlcbitcdFx0Z290byBjbGVhbnVwX2xvd190aW1lO1xuK1xuK1x0aWYgKGdldF90aW1lKGhpZ2hfdGltZV9maWxlLCBoaWdoX2VsYXBzZWQpKVxuK1x0XHRnb3RvIGNsZWFudXBfbG93X3RpbWU7XG4rXHRpZiAoZ2V0X3RpbWUobG93X3RpbWVfZmlsZSwgbG93X2VsYXBzZWQpKVxuK1x0XHRnb3RvIGNsZWFudXBfbG93X3RpbWU7XG4rXG4rXHRyZXQgPSAwO1xuK1xuK2NsZWFudXBfbG93X3RpbWU6XG4rXHR1bmxpbmsobG93X3RpbWVfZmlsZSk7XG4rY2xlYW51cF9oaWdoX3RpbWU6XG4rXHR1bmxpbmsoaGlnaF90aW1lX2ZpbGUpO1xuK2NsZWFudXBfbG93X2RhdGE6XG4rXHR1bmxpbmsobG93X2RhdGFfZmlsZSk7XG4rY2xlYW51cF9oaWdoX2RhdGE6XG4rXHR1bmxpbmsoaGlnaF9kYXRhX2ZpbGUpO1xuK1x0cmV0dXJuIHJldDtcbit9XG4rXG4rc3RhdGljIGludFxuK3NldHVwX2JwZih1NjQgaGlnaF9jZ3JvdXBfaWQsIHU2NCBsb3dfY2dyb3VwX2lkLFxuK1x0ICBzdHJ1Y3QgbWVtY2dfYXN5bmNfcmVjbGFpbSAqKnNrZWxfcHRyLCBib29sIHVzZV90aHJlYWRfd3EpXG4re1xuK1x0c3RydWN0IG1lbWNnX2FzeW5jX3JlY2xhaW0gKnNrZWw7XG4rXHRzdHJ1Y3QgYnBmX2FyZ3NfcyBicGZfYXJncyA9IHtcbitcdFx0LmhpZ2hfY2dyb3VwX2lkID0gaGlnaF9jZ3JvdXBfaWQsXG4rXHRcdC5sb3dfY2dyb3VwX2lkID0gbG93X2Nncm91cF9pZCxcbitcdFx0LmV2ZW50X2RlbHRhX3RocmVzaG9sZCA9IEVWRU5UX0RFTFRBX1RIUkVTSE9MRCxcbitcdFx0LmNoZWNrX25zID0gQ0hFQ0tfUEVSSU9EX05TLFxuK1x0fTtcbitcdExJQkJQRl9PUFRTKGJwZl90ZXN0X3J1bl9vcHRzLCBydW5fb3B0cyxcbitcdFx0LmN0eF9pbiA9IFx1MDAyNmJwZl9hcmdzLFxuK1x0XHQuY3R4X3NpemVfaW4gPSBzaXplb2YoYnBmX2FyZ3MpKTtcbitcdGludCBwcm9nX2luaXRfZmQsIGVycjtcbitcbitcdHNrZWwgPSBtZW1jZ19hc3luY19yZWNsYWltX19vcGVuX2FuZF9sb2FkKCk7XG4rXHRpZiAoIUFTU0VSVF9PS19QVFIoc2tlbCwgXCJtZW1jZ19hc3luY19yZWNsYWltX19vcGVuX2FuZF9sb2FkXCIpKVxuK1x0XHRyZXR1cm4gLTE7XG4rXG4rXHRpZiAodXNlX3RocmVhZF93cSlcbitcdFx0cHJvZ19pbml0X2ZkID0gYnBmX3Byb2dyYW1fX2ZkKHNrZWwtXHUwMDNlcHJvZ3MudGhyZWFkX3dxX3Byb2dfaW5pdCk7XG4rXHRlbHNlXG4rXHRcdHByb2dfaW5pdF9mZCA9IGJwZl9wcm9ncmFtX19mZChza2VsLVx1MDAzZXByb2dzLndxX3Byb2dfaW5pdCk7XG4rXHRpZiAoIUFTU0VSVF9HRShwcm9nX2luaXRfZmQsIDAsIFwiYnBmX3Byb2dyYW1fX2ZkXCIpKVxuK1x0XHRnb3RvIGVycm9yX291dDtcbitcbitcdGVyciA9IGJwZl9wcm9nX3Rlc3RfcnVuX29wdHMocHJvZ19pbml0X2ZkLCBcdTAwMjZydW5fb3B0cyk7XG4rXHRpZiAoIUFTU0VSVF9PSyhlcnIsIFwiYnBmX3Byb2dfdGVzdF9ydW5fb3B0c1wiKSlcbitcdFx0Z290byBlcnJvcl9vdXQ7XG4rXHRpZiAoIUFTU0VSVF9FUShydW5fb3B0cy5yZXR2YWwsIDAsIFwicHJvZ19pbml0IHJldHZhbFwiKSlcbitcdFx0Z290byBlcnJvcl9vdXQ7XG4rXG4rXHQqc2tlbF9wdHIgPSBza2VsO1xuK1x0cmV0dXJuIDA7XG4rXG4rZXJyb3Jfb3V0OlxuK1x0bWVtY2dfYXN5bmNfcmVjbGFpbV9fZGVzdHJveShza2VsKTtcbitcdHJldHVybiAtMTtcbit9XG4rXG4rdm9pZCB0ZXN0X21lbWNnX3dxX2FzeW5jX3JlY2xhaW0odm9pZClcbit7XG4rXHR1NjQgaGlnaF9jZ3JvdXBfaWQsIGxvd19jZ3JvdXBfaWQ7XG4rXHRpbnQgZXJyO1xuK1x0ZG91YmxlIGhpZ2hfdGltZSA9IDAuMCwgbG93X3RpbWUgPSAwLjA7XG4rXHRzdHJ1Y3QgbWVtY2dfYXN5bmNfcmVjbGFpbSAqc2tlbCA9IE5VTEw7XG4rXG4rXHRlcnIgPSBzZXR1cF9oaWdoX2xvd19jZ3JvdXBzKFx1MDAyNmhpZ2hfY2dyb3VwX2lkLCBcdTAwMjZsb3dfY2dyb3VwX2lkKTtcbitcdGlmICghQVNTRVJUX09LKGVyciwgXCJzZXR1cF9oaWdoX2xvd19jZ3JvdXBzIHJlY2xhaW1cIikpXG4rXHRcdHJldHVybjtcbitcbitcdGVyciA9IHNldHVwX2JwZihoaWdoX2Nncm91cF9pZCwgbG93X2Nncm91cF9pZCwgXHUwMDI2c2tlbCwgZmFsc2UpO1xuK1x0aWYgKCFBU1NFUlRfT0soZXJyLCBcInNldHVwX2JwZlwiKSlcbitcdFx0Z290byBvdXQ7XG4rXG4rXHRlcnIgPSBydW5faGlnaF9sb3dfd29ya2xvYWQoXHUwMDI2aGlnaF90aW1lLCBcdTAwMjZsb3dfdGltZSwgUkVBRF9USU1FUyk7XG4rXHRpZiAoIUFTU0VSVF9PSyhlcnIsIFwicnVuX2hpZ2hfbG93X3dvcmtsb2FkIHJlY2xhaW1cIikpXG4rXHRcdGdvdG8gb3V0O1xuK1xuK1x0aWYgKGhpZ2hfdGltZSBcdTAwM2U9IGxvd190aW1lKSB7XG4rXHRcdFBSSU5UX0ZBSUwoXCJoaWdoIGNncm91cCBub3QgaW1wcm92ZWQgd2l0aCBhc3luYyByZWNsYWltOiBoaWdoX3RpbWU9JWYgbG93X3RpbWU9JWZcIixcbitcdFx0XHQgICBoaWdoX3RpbWUsIGxvd190aW1lKTtcbitcdH1cbitcbitvdXQ6XG4rXHRpZiAoc2tlbClcbitcdFx0bWVtY2dfYXN5bmNfcmVjbGFpbV9fZGVzdHJveShza2VsKTtcbitcdC8qXG4rXHQgKiBXYWl0IGZvciBicGZfd3EgdG8gcmVsZWFzZSB0aGUgcmVmZXJlbmNlIHRvIGNncm91cFxuK1x0ICogdG8gZW5zdXJlIHRoZSBzdWNjZXNzZnVsIGRlbGV0aW9uIG9mIGNncm91cC5cbitcdCAqL1xuK1x0c2xlZXAoMSk7XG4rXHRjbGVhbnVwX2Nncm91cF9lbnZpcm9ubWVudCgpO1xuK31cbitcbit2b2lkIHRlc3RfbWVtY2dfdGhyZWFkX3dxX2FzeW5jX3JlY2xhaW0odm9pZClcbit7XG4rXHR1NjQgaGlnaF9jZ3JvdXBfaWQsIGxvd19jZ3JvdXBfaWQ7XG4rXHRpbnQgZXJyO1xuK1x0ZG91YmxlIGhpZ2hfdGltZSA9IDAuMCwgbG93X3RpbWUgPSAwLjA7XG4rXHRzdHJ1Y3QgbWVtY2dfYXN5bmNfcmVjbGFpbSAqc2tlbCA9IE5VTEw7XG4rXG4rXHRlcnIgPSBzZXR1cF9oaWdoX2xvd19jZ3JvdXBzKFx1MDAyNmhpZ2hfY2dyb3VwX2lkLCBcdTAwMjZsb3dfY2dyb3VwX2lkKTtcbitcdGlmICghQVNTRVJUX09LKGVyciwgXCJzZXR1cF9oaWdoX2xvd19jZ3JvdXBzIHJlY2xhaW1cIikpXG4rXHRcdHJldHVybjtcbitcbitcdGVyciA9IHNldHVwX2JwZihoaWdoX2Nncm91cF9pZCwgbG93X2Nncm91cF9pZCwgXHUwMDI2c2tlbCwgdHJ1ZSk7XG4rXHRpZiAoIUFTU0VSVF9PSyhlcnIsIFwic2V0dXBfYnBmXCIpKVxuK1x0XHRnb3RvIG91dDtcbitcbitcdGVyciA9IHJ1bl9oaWdoX2xvd193b3JrbG9hZChcdTAwMjZoaWdoX3RpbWUsIFx1MDAyNmxvd190aW1lLCBSRUFEX1RJTUVTKTtcbitcdGlmICghQVNTRVJUX09LKGVyciwgXCJydW5faGlnaF9sb3dfd29ya2xvYWQgcmVjbGFpbVwiKSlcbitcdFx0Z290byBvdXQ7XG4rXG4rXHRpZiAoaGlnaF90aW1lIFx1MDAzZT0gbG93X3RpbWUpIHtcbitcdFx0UFJJTlRfRkFJTChcImhpZ2ggY2dyb3VwIG5vdCBpbXByb3ZlZCB3aXRoIGFzeW5jIHJlY2xhaW06IGhpZ2hfdGltZT0lZiBsb3dfdGltZT0lZlwiLFxuK1x0XHRcdCAgIGhpZ2hfdGltZSwgbG93X3RpbWUpO1xuK1x0fVxuK1xuK291dDpcbitcdGlmIChza2VsKVxuK1x0XHRtZW1jZ19hc3luY19yZWNsYWltX19kZXN0cm95KHNrZWwpO1xuK1x0LypcbitcdCAqIFdhaXQgZm9yIGJwZl90aHJlYWRfd3EgdG8gcmVsZWFzZSB0aGUgcmVmZXJlbmNlIHRvIGNncm91cFxuK1x0ICogdG8gZW5zdXJlIHRoZSBzdWNjZXNzZnVsIGRlbGV0aW9uIG9mIGNncm91cC5cbitcdCAqL1xuK1x0c2xlZXAoMSk7XG4rXHRjbGVhbnVwX2Nncm91cF9lbnZpcm9ubWVudCgpO1xuK31cbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy90aHJlYWRfd3FfY2dyb3VwLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy90aHJlYWRfd3FfY2dyb3VwLmNcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwLi43NTM3YjAzZjE3ZTJhXG4tLS0gL2Rldi9udWxsXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy90aHJlYWRfd3FfY2dyb3VwLmNcbkBAIC0wLDAgKzEsODcgQEBcbisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxuKyNpbmNsdWRlIFx1MDAzY3Rlc3RfcHJvZ3MuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3VuaXN0ZC5oXHUwMDNlXG4rI2luY2x1ZGUgXCJjZ3JvdXBfaGVscGVycy5oXCJcbisjaW5jbHVkZSBcInRocmVhZF93cV9jZ3JvdXAuc2tlbC5oXCJcbitcbisjZGVmaW5lIFRFU1RfQ0dST1VQIFwiL3RocmVhZF93cV90ZXN0XCJcbisjZGVmaW5lIFdBSVRfVElNRU9VVF9TRUNTIDMwXG4rXG4rdm9pZCB0ZXN0X3RocmVhZF93cV9jZ3JvdXAodm9pZClcbit7XG4rXHRzdHJ1Y3QgdGhyZWFkX3dxX2Nncm91cCAqc2tlbCA9IE5VTEw7XG4rXHRpbnQgZXJyLCBwcm9nX2ZkLCBjZ19mZCA9IC0xO1xuK1x0dW5zaWduZWQgbG9uZyBsb25nIGNnX2lkO1xuK1x0aW50IHdhaXRlZF9zZWNzO1xuK1xuK1x0TElCQlBGX09QVFMoYnBmX3Rlc3RfcnVuX29wdHMsIHRvcHRzKTtcbitcbitcdGVyciA9IHNldHVwX2Nncm91cF9lbnZpcm9ubWVudCgpO1xuK1x0aWYgKCFBU1NFUlRfT0soZXJyLCBcInNldHVwX2Nncm91cF9lbnZpcm9ubWVudFwiKSlcbitcdFx0cmV0dXJuO1xuK1x0Y2dfZmQgPSBjcmVhdGVfYW5kX2dldF9jZ3JvdXAoVEVTVF9DR1JPVVApO1xuK1x0aWYgKCFBU1NFUlRfR0UoY2dfZmQsIDAsIFwiY3JlYXRlX2FuZF9nZXRfY2dyb3VwXCIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXHRjZ19pZCA9IGdldF9jZ3JvdXBfaWQoVEVTVF9DR1JPVVApO1xuK1x0aWYgKCFBU1NFUlRfR1QoY2dfaWQsIDBVTEwsIFwiZ2V0X2Nncm91cF9pZFwiKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1xuK1x0c2tlbCA9IHRocmVhZF93cV9jZ3JvdXBfX29wZW5fYW5kX2xvYWQoKTtcbitcdGlmICghQVNTRVJUX09LX1BUUihza2VsLCBcIm9wZW5fYW5kX2xvYWRcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcbitcdHByb2dfZmQgPSBicGZfcHJvZ3JhbV9fZmQoc2tlbC1cdTAwM2Vwcm9ncy5zdGFydF90aHJlYWRfd3EpO1xuK1xuK1x0LyogUnVuIGJwZl90aHJlYWRfd3EgaW4gdGhlIHNwZWNpZmllZCBjZ3JvdXAuICovXG4rXHRza2VsLVx1MDAzZWJzcy1cdTAwM2V0ZXN0X2tleSA9IDA7XG4rXHRza2VsLVx1MDAzZWJzcy1cdTAwM2V0YXJnZXRfY2dyb3VwX2lkID0gY2dfaWQ7XG4rXHRza2VsLVx1MDAzZWJzcy1cdTAwM2VjYWxsYmFja19jZ3JvdXBfaWQgPSAwO1xuK1x0c2tlbC1cdTAwM2Vic3MtXHUwMDNldHdxX2RvbmUgPSAwO1xuK1x0aWYgKCFBU1NFUlRfT0soYnBmX3Byb2dfdGVzdF9ydW5fb3B0cyhwcm9nX2ZkLCBcdTAwMjZ0b3B0cyksXG4rXHRcdCAgICAgICBcImJwZl9wcm9nX3Rlc3RfcnVuX29wdHMgaW4gY2dyb3VwXCIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXHRpZiAoIUFTU0VSVF9PSyh0b3B0cy5yZXR2YWwsIFwicmV0dmFsIGluIGNncm91cFwiKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1x0Zm9yICh3YWl0ZWRfc2VjcyA9IDA7IHdhaXRlZF9zZWNzIFx1MDAzYyBXQUlUX1RJTUVPVVRfU0VDUzsgd2FpdGVkX3NlY3MrKykge1xuK1x0XHRpZiAoc2tlbC1cdTAwM2Vic3MtXHUwMDNldHdxX2RvbmUpXG4rXHRcdFx0YnJlYWs7XG4rXHRcdHNsZWVwKDEpO1xuK1x0fVxuK1x0aWYgKCFBU1NFUlRfVFJVRShza2VsLVx1MDAzZWJzcy1cdTAwM2V0d3FfZG9uZSwgXCJ0d3FfZG9uZSBpbiBjZ3JvdXBcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcdGlmICghQVNTRVJUX0VRKHNrZWwtXHUwMDNlYnNzLVx1MDAzZWNhbGxiYWNrX2Nncm91cF9pZCwgY2dfaWQsXG4rXHRcdCAgICAgICBcImNhbGxiYWNrX2Nncm91cF9pZCBpbiBjZ3JvdXBcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcbitcdC8qIFJ1biBicGZfdGhyZWFkX3dxIHdpdGhvdXQgY2dyb3VwIGF0dGFjaG1lbnQgKGNncm91cF9pZCA9IDApLiAqL1xuK1x0TElCQlBGX09QVFNfUkVTRVQodG9wdHMpO1xuK1x0c2tlbC1cdTAwM2Vic3MtXHUwMDNldGVzdF9rZXkgPSAxO1xuK1x0c2tlbC1cdTAwM2Vic3MtXHUwMDNldGFyZ2V0X2Nncm91cF9pZCA9IDA7XG4rXHRza2VsLVx1MDAzZWJzcy1cdTAwM2VjYWxsYmFja19jZ3JvdXBfaWQgPSAwO1xuK1x0c2tlbC1cdTAwM2Vic3MtXHUwMDNldHdxX2RvbmUgPSAwO1xuK1x0aWYgKCFBU1NFUlRfT0soYnBmX3Byb2dfdGVzdF9ydW5fb3B0cyhwcm9nX2ZkLCBcdTAwMjZ0b3B0cyksXG4rXHRcdCAgICAgICBcImJwZl9wcm9nX3Rlc3RfcnVuX29wdHMgd2l0aG91dCBjZ3JvdXBcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcdGlmICghQVNTRVJUX09LKHRvcHRzLnJldHZhbCwgXCJyZXR2YWwgd2l0aG91dCBjZ3JvdXBcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcdGZvciAod2FpdGVkX3NlY3MgPSAwOyB3YWl0ZWRfc2VjcyBcdTAwM2MgV0FJVF9USU1FT1VUX1NFQ1M7IHdhaXRlZF9zZWNzKyspIHtcbitcdFx0aWYgKHNrZWwtXHUwMDNlYnNzLVx1MDAzZXR3cV9kb25lKVxuK1x0XHRcdGJyZWFrO1xuK1x0XHRzbGVlcCgxKTtcbitcdH1cbitcdGlmICghQVNTRVJUX1RSVUUoc2tlbC1cdTAwM2Vic3MtXHUwMDNldHdxX2RvbmUsIFwidHdxX2RvbmUgd2l0aG91dCBjZ3JvdXBcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcdGlmICghQVNTRVJUX05FUShza2VsLVx1MDAzZWJzcy1cdTAwM2VjYWxsYmFja19jZ3JvdXBfaWQsIGNnX2lkLFxuK1x0XHRcdFwiY2FsbGJhY2tfY2dyb3VwX2lkIHdpdGhvdXQgY2dyb3VwXCIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXG4rY2xlYW51cDpcbitcdGlmIChza2VsKSB7XG4rXHRcdHRocmVhZF93cV9jZ3JvdXBfX2Rlc3Ryb3koc2tlbCk7XG4rXHRcdC8qIFdhaXQgdGhyZWFkX3dxIGt0aHJlYWQgcXVpdC4gKi9cbitcdFx0c2xlZXAoMik7XG4rXHR9XG4rXHRpZiAoY2dfZmQgXHUwMDNlPSAwKVxuK1x0XHRjbG9zZShjZ19mZCk7XG4rXHRjbGVhbnVwX2Nncm91cF9lbnZpcm9ubWVudCgpO1xuK31cbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvbWVtY2dfYXN5bmNfcmVjbGFpbS5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL21lbWNnX2FzeW5jX3JlY2xhaW0uY1xubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAuLmVhY2NjOGEzNzM4OGJcbi0tLSAvZGV2L251bGxcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9tZW1jZ19hc3luY19yZWNsYWltLmNcbkBAIC0wLDAgKzEsMjU1IEBAXG4rLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcbitcbisjaW5jbHVkZSBcInZtbGludXguaFwiXG4rI2luY2x1ZGUgXCJicGZfZXhwZXJpbWVudGFsLmhcIlxuKyNpbmNsdWRlIFx1MDAzY2JwZi9icGZfaGVscGVycy5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjYnBmL2JwZl90cmFjaW5nLmhcdTAwM2VcbitcbisjZGVmaW5lIEJJVChucilcdFx0XHQoMVVMIFx1MDAzY1x1MDAzYyAobnIpKVxuK1xuKyNkZWZpbmUgX19fR0ZQX0lPXHRcdEJJVChfX19HRlBfSU9fQklUKVxuKyNkZWZpbmUgX19fR0ZQX0ZTXHRcdEJJVChfX19HRlBfRlNfQklUKVxuKyNkZWZpbmUgX19fR0ZQX0RJUkVDVF9SRUNMQUlNXHRCSVQoX19fR0ZQX0RJUkVDVF9SRUNMQUlNX0JJVClcbisjZGVmaW5lIF9fX0dGUF9LU1dBUERfUkVDTEFJTVx0QklUKF9fX0dGUF9LU1dBUERfUkVDTEFJTV9CSVQpXG4rXG4rI2RlZmluZSBfX0dGUF9JT1x0XHQoKGdmcF90KV9fX0dGUF9JTylcbisjZGVmaW5lIF9fR0ZQX0ZTXHRcdCgoZ2ZwX3QpX19fR0ZQX0ZTKVxuKyNkZWZpbmUgX19HRlBfRElSRUNUX1JFQ0xBSU1cdCgoZ2ZwX3QpX19fR0ZQX0RJUkVDVF9SRUNMQUlNKVxuKyNkZWZpbmUgX19HRlBfS1NXQVBEX1JFQ0xBSU1cdCgoZ2ZwX3QpX19fR0ZQX0tTV0FQRF9SRUNMQUlNKVxuKyNkZWZpbmUgX19HRlBfUkVDTEFJTVx0KChnZnBfdCkoX19fR0ZQX0RJUkVDVF9SRUNMQUlNIHwgX19fR0ZQX0tTV0FQRF9SRUNMQUlNKSlcbitcbisjZGVmaW5lIEdGUF9LRVJORUxcdChfX0dGUF9SRUNMQUlNIHwgX19HRlBfSU8gfCBfX0dGUF9GUylcbisjZGVmaW5lIENMT0NLX01PTk9UT05JQ19JRFx0MVxuKyNkZWZpbmUgUkVDTEFJTV9QQUdFU1x0XHQzMlxuKyNkZWZpbmUgUkVDTEFJTV9NQVhfSVRFUlx0MzJcbitcbitzdHJ1Y3QgYnBmX2FyZ3NfcyB7XG4rXHR1NjQgaGlnaF9jZ3JvdXBfaWQ7XG4rXHR1NjQgbG93X2Nncm91cF9pZDtcbitcdHU2NCBldmVudF9kZWx0YV90aHJlc2hvbGQ7XG4rXHR1NjQgY2hlY2tfbnM7XG4rfTtcbitcbitzdHJ1Y3QgY2dyb3VwX21lbWNnIHtcbitcdHN0cnVjdCBjZ3JvdXAgKmNncnA7XG4rXHRzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2c7XG4rfTtcbitcbitzdGF0aWMgdTY0IHdxX2hpZ2hfY2dyb3VwX2lkO1xuK3N0YXRpYyB1NjQgd3FfbG93X2Nncm91cF9pZDtcbitcbitzdGF0aWMgaW50IGdldF9jZ3JvdXBfbWVtY2dfZnJvbV9pZCh1NjQgY2dyb3VwX2lkLCBzdHJ1Y3QgY2dyb3VwX21lbWNnICpjbSlcbit7XG4rXHRjbS1cdTAwM2VjZ3JwID0gYnBmX2Nncm91cF9mcm9tX2lkKGNncm91cF9pZCk7XG4rXHRpZiAoIWNtLVx1MDAzZWNncnApXG4rXHRcdHJldHVybiAtMTtcbitcbitcdGNtLVx1MDAzZW1lbWNnID0gYnBmX2dldF9tZW1fY2dyb3VwKFx1MDAyNmNtLVx1MDAzZWNncnAtXHUwMDNlc2VsZik7XG4rXHRpZiAoIWNtLVx1MDAzZW1lbWNnKSB7XG4rXHRcdGJwZl9jZ3JvdXBfcmVsZWFzZShjbS1cdTAwM2VjZ3JwKTtcbitcdFx0cmV0dXJuIC0xO1xuK1x0fVxuK1xuK1x0cmV0dXJuIDA7XG4rfVxuK1xuK3N0YXRpYyB2b2lkIHB1dF9jZ3JvdXBfbWVtY2coc3RydWN0IGNncm91cF9tZW1jZyAqY20pXG4re1xuK1x0YnBmX3B1dF9tZW1fY2dyb3VwKGNtLVx1MDAzZW1lbWNnKTtcbitcdGJwZl9jZ3JvdXBfcmVsZWFzZShjbS1cdTAwM2VjZ3JwKTtcbit9XG4rXG4rc3RhdGljIGludCBnZXRfY2dyb3VwX2V2ZW50KHU2NCBjZ3JvdXBfaWQsIHU2NCAqdmFsKVxuK3tcbitcdHN0cnVjdCBjZ3JvdXBfbWVtY2cgY207XG4rXG4rXHRpZiAoZ2V0X2Nncm91cF9tZW1jZ19mcm9tX2lkKGNncm91cF9pZCwgXHUwMDI2Y20pKVxuK1x0XHRyZXR1cm4gLTE7XG4rXHRicGZfbWVtX2Nncm91cF9mbHVzaF9zdGF0cyhjbS5tZW1jZyk7XG4rXHQqdmFsID0gYnBmX21lbV9jZ3JvdXBfcGFnZV9zdGF0ZShjbS5tZW1jZywgV09SS0lOR1NFVF9SRUZBVUxUX0ZJTEUpO1xuK1x0cHV0X2Nncm91cF9tZW1jZyhcdTAwMjZjbSk7XG4rXG4rXHRyZXR1cm4gMDtcbit9XG4rXG4rc3RhdGljIGJvb2xcbitzaG91bGRfcmVjbGFpbV9jZ3JvdXAodTY0IGNncm91cF9pZCwgdTY0ICpwcmV2X2V2ZW50LCB1NjQgZXZlbnRfZGVsdGFfdGhyZXNob2xkKVxuK3tcbitcdHU2NCBjdXIsIGRlbHRhO1xuK1xuK1x0aWYgKGdldF9jZ3JvdXBfZXZlbnQoY2dyb3VwX2lkLCBcdTAwMjZjdXIpKVxuK1x0XHRyZXR1cm4gZmFsc2U7XG4rXG4rXHRkZWx0YSA9IGN1ciAtICpwcmV2X2V2ZW50O1xuK1x0KnByZXZfZXZlbnQgPSBjdXI7XG4rXG4rXHRyZXR1cm4gZGVsdGEgXHUwMDNlPSBldmVudF9kZWx0YV90aHJlc2hvbGQ7XG4rfVxuK1xuK3N0YXRpYyBpbnQgcmVjbGFpbV9jZ3JvdXAodTY0IGNncm91cF9pZClcbit7XG4rXHRzdHJ1Y3QgY2dyb3VwX21lbWNnIGNtO1xuK1x0aW50IGk7XG4rXG4rXHRpZiAoZ2V0X2Nncm91cF9tZW1jZ19mcm9tX2lkKGNncm91cF9pZCwgXHUwMDI2Y20pKVxuK1x0XHRyZXR1cm4gMDtcbitcbitcdGZvciAoaSA9IDA7IGkgXHUwMDNjIFJFQ0xBSU1fTUFYX0lURVI7IGkrKykge1xuK1x0XHRpZiAoIWJwZl90cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKGNtLm1lbWNnLCBSRUNMQUlNX1BBR0VTLFxuK1x0XHRcdFx0XHRcdCAgICAgIEdGUF9LRVJORUwsIDAsIC0xKSlcbitcdFx0XHRicmVhaztcbitcdH1cbitcbitcdHB1dF9jZ3JvdXBfbWVtY2coXHUwMDI2Y20pO1xuK1xuK1x0cmV0dXJuIDA7XG4rfVxuK1xuK3N0cnVjdCB3cV9lbGVtIHtcbitcdHN0cnVjdCBicGZfdGltZXIgdGltZXI7XG4rXHRzdHJ1Y3QgYnBmX3dxIHdvcms7XG4rXHR1NjQgcHJldl9ldmVudDtcbitcdHU2NCBldmVudF9kZWx0YV90aHJlc2hvbGQ7XG4rXHR1NjQgY2hlY2tfbnM7XG4rfTtcbitcbitzdHJ1Y3Qge1xuK1x0X191aW50KHR5cGUsIEJQRl9NQVBfVFlQRV9BUlJBWSk7XG4rXHRfX3VpbnQobWF4X2VudHJpZXMsIDEpO1xuK1x0X190eXBlKGtleSwgX191MzIpO1xuK1x0X190eXBlKHZhbHVlLCBzdHJ1Y3Qgd3FfZWxlbSk7XG4rfSB3cV9tYXAgU0VDKFwiLm1hcHNcIik7XG4rXG4rc3RhdGljIGludCBhc3luY19mcmVlKHZvaWQgKm1hcCwgaW50ICprZXksIHZvaWQgKnZhbHVlKVxuK3tcbitcdHN0cnVjdCB3cV9lbGVtICplbGVtID0gdmFsdWU7XG4rXG4rXHRpZiAoc2hvdWxkX3JlY2xhaW1fY2dyb3VwKHdxX2hpZ2hfY2dyb3VwX2lkLCBcdTAwMjZlbGVtLVx1MDAzZXByZXZfZXZlbnQsXG4rXHRcdGVsZW0tXHUwMDNlZXZlbnRfZGVsdGFfdGhyZXNob2xkKSkge1xuK1x0XHRyZWNsYWltX2Nncm91cCh3cV9sb3dfY2dyb3VwX2lkKTtcbitcdFx0YnBmX3dxX3N0YXJ0KFx1MDAyNmVsZW0tXHUwMDNld29yaywgMCk7XG4rXHR9XG4rXG4rXHRyZXR1cm4gMDtcbit9XG4rXG4rc3RhdGljIGludCB3cV90aW1lcl9jYih2b2lkICptYXAsIGludCAqa2V5LCBzdHJ1Y3Qgd3FfZWxlbSAqZWxlbSlcbit7XG4rXHRicGZfd3Ffc3RhcnQoXHUwMDI2ZWxlbS1cdTAwM2V3b3JrLCAwKTtcbitcdGJwZl90aW1lcl9zdGFydChcdTAwMjZlbGVtLVx1MDAzZXRpbWVyLCBlbGVtLVx1MDAzZWNoZWNrX25zLCAwKTtcbitcbitcdHJldHVybiAwO1xuK31cbitcbitTRUMoXCJzeXNjYWxsXCIpXG4raW50IHdxX3Byb2dfaW5pdChzdHJ1Y3QgYnBmX2FyZ3NfcyAqY3R4KVxuK3tcbitcdHN0cnVjdCB3cV9lbGVtICplbGVtO1xuK1x0X191MzIga2V5ID0gMDtcbitcdGludCByZXQ7XG4rXG4rXHRlbGVtID0gYnBmX21hcF9sb29rdXBfZWxlbShcdTAwMjZ3cV9tYXAsIFx1MDAyNmtleSk7XG4rXHRpZiAoIWVsZW0pXG4rXHRcdHJldHVybiAtMTtcbitcbitcdHJldCA9IGJwZl93cV9pbml0KFx1MDAyNmVsZW0tXHUwMDNld29yaywgXHUwMDI2d3FfbWFwLCAwKTtcbitcdGlmIChyZXQpXG4rXHRcdHJldHVybiByZXQ7XG4rXG4rXHRyZXQgPSBicGZfd3Ffc2V0X2NhbGxiYWNrKFx1MDAyNmVsZW0tXHUwMDNld29yaywgYXN5bmNfZnJlZSwgMCk7XG4rXHRpZiAocmV0KVxuK1x0XHRyZXR1cm4gcmV0O1xuK1xuK1x0cmV0ID0gYnBmX3RpbWVyX2luaXQoXHUwMDI2ZWxlbS1cdTAwM2V0aW1lciwgXHUwMDI2d3FfbWFwLCBDTE9DS19NT05PVE9OSUNfSUQpO1xuK1x0aWYgKHJldClcbitcdFx0cmV0dXJuIHJldDtcbitcbitcdHJldCA9IGJwZl90aW1lcl9zZXRfY2FsbGJhY2soXHUwMDI2ZWxlbS1cdTAwM2V0aW1lciwgd3FfdGltZXJfY2IpO1xuK1x0aWYgKHJldClcbitcdFx0cmV0dXJuIHJldDtcbitcbitcdGVsZW0tXHUwMDNlcHJldl9ldmVudCA9IDA7XG4rXHRlbGVtLVx1MDAzZWV2ZW50X2RlbHRhX3RocmVzaG9sZCA9IGN0eC1cdTAwM2VldmVudF9kZWx0YV90aHJlc2hvbGQ7XG4rXHRlbGVtLVx1MDAzZWNoZWNrX25zID0gY3R4LVx1MDAzZWNoZWNrX25zO1xuK1xuK1x0d3FfaGlnaF9jZ3JvdXBfaWQgPSBjdHgtXHUwMDNlaGlnaF9jZ3JvdXBfaWQ7XG4rXHR3cV9sb3dfY2dyb3VwX2lkID0gY3R4LVx1MDAzZWxvd19jZ3JvdXBfaWQ7XG4rXG4rXHRyZXR1cm4gYnBmX3RpbWVyX3N0YXJ0KFx1MDAyNmVsZW0tXHUwMDNldGltZXIsIGVsZW0tXHUwMDNlY2hlY2tfbnMsIDApO1xuK31cbitcbitzdHJ1Y3QgdGhyZWFkX3dxX2VsZW0ge1xuK1x0c3RydWN0IGJwZl90aW1lciB0aW1lcjtcbitcdHN0cnVjdCBicGZfdGhyZWFkX3dxIHdvcms7XG4rXHR1NjQgcHJldl9ldmVudDtcbitcdHU2NCBldmVudF9kZWx0YV90aHJlc2hvbGQ7XG4rXHR1NjQgY2hlY2tfbnM7XG4rfTtcbitcbitzdHJ1Y3Qge1xuK1x0X191aW50KHR5cGUsIEJQRl9NQVBfVFlQRV9BUlJBWSk7XG4rXHRfX3VpbnQobWF4X2VudHJpZXMsIDEpO1xuK1x0X190eXBlKGtleSwgX191MzIpO1xuK1x0X190eXBlKHZhbHVlLCBzdHJ1Y3QgdGhyZWFkX3dxX2VsZW0pO1xuK30gdGhyZWFkX3dxX21hcCBTRUMoXCIubWFwc1wiKTtcbitcbitzdGF0aWMgaW50IHRocmVhZF9hc3luY19mcmVlKHZvaWQgKm1hcCwgaW50ICprZXksIHZvaWQgKnZhbHVlKVxuK3tcbitcdHN0cnVjdCB0aHJlYWRfd3FfZWxlbSAqZWxlbSA9IHZhbHVlO1xuK1xuK1x0aWYgKHNob3VsZF9yZWNsYWltX2Nncm91cCh3cV9oaWdoX2Nncm91cF9pZCwgXHUwMDI2ZWxlbS1cdTAwM2VwcmV2X2V2ZW50LFxuK1x0XHRlbGVtLVx1MDAzZWV2ZW50X2RlbHRhX3RocmVzaG9sZCkpIHtcbitcdFx0cmVjbGFpbV9jZ3JvdXAod3FfbG93X2Nncm91cF9pZCk7XG4rXHRcdGJwZl90aHJlYWRfd3Ffc3RhcnQoXHUwMDI2ZWxlbS1cdTAwM2V3b3JrLCAwKTtcbitcdH1cbitcbitcdHJldHVybiAwO1xuK31cbitcbitzdGF0aWMgaW50IHRocmVhZF93cV90aW1lcl9jYih2b2lkICptYXAsIGludCAqa2V5LCBzdHJ1Y3QgdGhyZWFkX3dxX2VsZW0gKmVsZW0pXG4re1xuK1x0YnBmX3RocmVhZF93cV9zdGFydChcdTAwMjZlbGVtLVx1MDAzZXdvcmssIDApO1xuK1x0YnBmX3RpbWVyX3N0YXJ0KFx1MDAyNmVsZW0tXHUwMDNldGltZXIsIGVsZW0tXHUwMDNlY2hlY2tfbnMsIDApO1xuK1xuK1x0cmV0dXJuIDA7XG4rfVxuK1xuK1NFQyhcInN5c2NhbGxcIilcbitpbnQgdGhyZWFkX3dxX3Byb2dfaW5pdChzdHJ1Y3QgYnBmX2FyZ3NfcyAqY3R4KVxuK3tcbitcdHN0cnVjdCB0aHJlYWRfd3FfZWxlbSAqZWxlbTtcbitcdF9fdTMyIGtleSA9IDA7XG4rXHRpbnQgcmV0O1xuK1xuK1x0ZWxlbSA9IGJwZl9tYXBfbG9va3VwX2VsZW0oXHUwMDI2dGhyZWFkX3dxX21hcCwgXHUwMDI2a2V5KTtcbitcdGlmICghZWxlbSlcbitcdFx0cmV0dXJuIC0xO1xuK1xuK1x0cmV0ID0gYnBmX3RocmVhZF93cV9pbml0KFx1MDAyNmVsZW0tXHUwMDNld29yaywgXHUwMDI2dGhyZWFkX3dxX21hcCxcbitcdFx0XHRcdCBjdHgtXHUwMDNlbG93X2Nncm91cF9pZCwgMCk7XG4rXHRpZiAocmV0KVxuK1x0XHRyZXR1cm4gcmV0O1xuK1xuK1x0cmV0ID0gYnBmX3RocmVhZF93cV9zZXRfY2FsbGJhY2soXHUwMDI2ZWxlbS1cdTAwM2V3b3JrLCB0aHJlYWRfYXN5bmNfZnJlZSwgMCk7XG4rXHRpZiAocmV0KVxuK1x0XHRyZXR1cm4gcmV0O1xuK1xuK1x0cmV0ID0gYnBmX3RpbWVyX2luaXQoXHUwMDI2ZWxlbS1cdTAwM2V0aW1lciwgXHUwMDI2dGhyZWFkX3dxX21hcCwgQ0xPQ0tfTU9OT1RPTklDX0lEKTtcbitcdGlmIChyZXQpXG4rXHRcdHJldHVybiByZXQ7XG4rXG4rXHRyZXQgPSBicGZfdGltZXJfc2V0X2NhbGxiYWNrKFx1MDAyNmVsZW0tXHUwMDNldGltZXIsIHRocmVhZF93cV90aW1lcl9jYik7XG4rXHRpZiAocmV0KVxuK1x0XHRyZXR1cm4gcmV0O1xuK1xuK1x0ZWxlbS1cdTAwM2VwcmV2X2V2ZW50ID0gMDtcbitcdGVsZW0tXHUwMDNlZXZlbnRfZGVsdGFfdGhyZXNob2xkID0gY3R4LVx1MDAzZWV2ZW50X2RlbHRhX3RocmVzaG9sZDtcbitcdGVsZW0tXHUwMDNlY2hlY2tfbnMgPSBjdHgtXHUwMDNlY2hlY2tfbnM7XG4rXG4rXHR3cV9oaWdoX2Nncm91cF9pZCA9IGN0eC1cdTAwM2VoaWdoX2Nncm91cF9pZDtcbitcdHdxX2xvd19jZ3JvdXBfaWQgPSBjdHgtXHUwMDNlbG93X2Nncm91cF9pZDtcbitcbitcdHJldHVybiBicGZfdGltZXJfc3RhcnQoXHUwMDI2ZWxlbS1cdTAwM2V0aW1lciwgZWxlbS1cdTAwM2VjaGVja19ucywgMCk7XG4rfVxuK1xuK2NoYXIgTElDRU5TRVtdIFNFQyhcImxpY2Vuc2VcIikgPSBcIkdQTFwiO1xuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy90aHJlYWRfd3FfY2dyb3VwLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvdGhyZWFkX3dxX2Nncm91cC5jXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uYzcwYTM3ZjU1Mzk3ZFxuLS0tIC9kZXYvbnVsbFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL3RocmVhZF93cV9jZ3JvdXAuY1xuQEAgLTAsMCArMSw1NiBAQFxuKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXG4rLyogQ29weXJpZ2h0IChjKSAyMDI2ICovXG4rXG4rI2luY2x1ZGUgXCJicGZfZXhwZXJpbWVudGFsLmhcIlxuKyNpbmNsdWRlIFx1MDAzY2JwZi9icGZfaGVscGVycy5oXHUwMDNlXG4rI2luY2x1ZGUgXCJicGZfbWlzYy5oXCJcbitcbitjaGFyIF9saWNlbnNlW10gU0VDKFwibGljZW5zZVwiKSA9IFwiR1BMXCI7XG4rXG4rc3RydWN0IGVsZW0ge1xuK1x0c3RydWN0IGJwZl90aHJlYWRfd3EgdHdxO1xuK307XG4rXG4rc3RydWN0IHtcbitcdF9fdWludCh0eXBlLCBCUEZfTUFQX1RZUEVfQVJSQVkpO1xuK1x0X191aW50KG1heF9lbnRyaWVzLCAyKTtcbitcdF9fdHlwZShrZXksIGludCk7XG4rXHRfX3R5cGUodmFsdWUsIHN0cnVjdCBlbGVtKTtcbit9IG1hcF9hcnIgU0VDKFwiLm1hcHNcIik7XG4rXG4rX191NjQgdGFyZ2V0X2Nncm91cF9pZDtcbitfX3U2NCBjYWxsYmFja19jZ3JvdXBfaWQ7XG4raW50IHR3cV9kb25lO1xuK2ludCB0ZXN0X2tleTtcbitcbitzdGF0aWMgaW50IHR3cV9jYWxsYmFjayh2b2lkICptYXAsIGludCAqa2V5LCB2b2lkICp2YWx1ZSlcbit7XG4rXHRjYWxsYmFja19jZ3JvdXBfaWQgPSBicGZfZ2V0X2N1cnJlbnRfY2dyb3VwX2lkKCk7XG4rXHR0d3FfZG9uZSA9IDE7XG4rXHRyZXR1cm4gMDtcbit9XG4rXG4rU0VDKFwic3lzY2FsbFwiKVxuK2ludCBzdGFydF90aHJlYWRfd3Eodm9pZCAqY3R4KVxuK3tcbitcdHN0cnVjdCBlbGVtICp2YWw7XG4rXHRpbnQga2V5ID0gdGVzdF9rZXk7XG4rXHRpbnQgcmV0O1xuK1xuK1x0dmFsID0gYnBmX21hcF9sb29rdXBfZWxlbShcdTAwMjZtYXBfYXJyLCBcdTAwMjZrZXkpO1xuK1x0aWYgKCF2YWwpXG4rXHRcdHJldHVybiAtMTtcbitcbitcdHJldCA9IGJwZl90aHJlYWRfd3FfaW5pdChcdTAwMjZ2YWwtXHUwMDNldHdxLCBcdTAwMjZtYXBfYXJyLCB0YXJnZXRfY2dyb3VwX2lkLCAwKTtcbitcdGlmIChyZXQpXG4rXHRcdGdvdG8gb3V0O1xuK1xuK1x0cmV0ID0gYnBmX3RocmVhZF93cV9zZXRfY2FsbGJhY2soXHUwMDI2dmFsLVx1MDAzZXR3cSwgdHdxX2NhbGxiYWNrLCAwKTtcbitcdGlmIChyZXQpXG4rXHRcdGdvdG8gb3V0O1xuK1xuK1x0cmV0ID0gYnBmX3RocmVhZF93cV9zdGFydChcdTAwMjZ2YWwtXHUwMDNldHdxLCAwKTtcbitcbitvdXQ6XG4rXHRyZXR1cm4gcmV0O1xuK31cbiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA3VDA4OjUwOjQzLjcwOTA4NjIxN1oiLCJTZXEiOjMsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjc2NzUzMTMzODIsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIHRoZSBOZXcgQlBGIFRocmVhZCBXb3JrcXVldWUgRmVhdHVyZSoqXG5cbk9rYXksIHNvIHRoaXMgcGF0Y2ggaXMgaW50cm9kdWNpbmcgc29tZXRoaW5nIGludGVyZXN0aW5nOiBhIG5ldyBCUEYgZmVhdHVyZSBjYWxsZWQgYGJwZl90aHJlYWRfd3FgLiBSaWdodCBvZmYgdGhlIGJhdCwgSSBzZWUgdGhlIGFkZGl0aW9uIG9mIGBCUEZfVEhSRUFEX1dRYCB0byBgZW51bSBidGZfZmllbGRfdHlwZWAsIHdoaWNoIHRlbGxzIG1lIHRoaXMgaXMgYSBwcmV0dHkgZnVuZGFtZW50YWwgY2hhbmdlIHRvIHRoZSBCUEYgbGFuZHNjYXBlLiBXZSdyZSBsb29raW5nIGF0IGZvdXIgbmV3IGZ1bmN0aW9uczogYGJwZl90aHJlYWRfd3FfaW5pdGAsIGBicGZfdGhyZWFkX3dxX3NldF9jYWxsYmFja2AsIGBicGZfdGhyZWFkX3dxX3N0YXJ0YCwgYW5kIGBicGZfdGhyZWFkX3dxX2NhbmNlbF9hbmRfZnJlZWAuIFRoZW4gdGhlcmUncyBgYnBmX3RyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXNgIGFzIHdlbGwuIFRoaXMgYWxsIGxvb2tzIGxpa2UgdGhlIGZyYW1ld29yayB0byBhbGxvdyBCUEYgcHJvZ3JhbXMgdG8gc2NoZWR1bGUgdGFza3Mgb24ga3RocmVhZCB3b3JrZXJzLCBhbmQsIGFzIGFuIG9wdGlvbmFsIGZlYXR1cmUsIGF0dGFjaCB0aG9zZSB0YXNrcyB0byBhIHNwZWNpZmljIGNncm91cC4gRGVmaW5pdGVseSBzb3VuZHMgbGlrZSBhIGNhbmRpZGF0ZSBmb3Igc29tZSBzZXJpb3VzIGZ1enppbmcg4oCTIGdvdHRhIHNlZSB3aGVyZSB0aGUgZWRnZSBjYXNlcyBsaWUuXG5cbkxldCdzIG5haWwgZG93biB0aGUga2V5IHN5bWJvbHMgd2UgbmVlZCB0byBpbnZlc3RpZ2F0ZTogYGJwZl90aHJlYWRfd3FfaW5pdGAsIGBicGZfdGhyZWFkX3dxX3NldF9jYWxsYmFja2AsIGBicGZfdGhyZWFkX3dxX3N0YXJ0YCwgYW5kIGBicGZfdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlc2AuIFRob3NlIGFyZSB0aGUgZW50cnkgcG9pbnRzIGhlcmUuXG5cbk5leHQsIEkgbmVlZCB0byBjaGVjayBmb3IgYW55IGNyaXRpY2FsIGBDT05GSUdgIG9wdGlvbnMgdGhhdCBtaWdodCBiZSByZXF1aXJlZC4gRnJvbSB0aGUgbG9vayBvZiBpdCwgYGJwZl90aHJlYWRfd3FfaW5pdGAgd2lsbCB1c2UgYENPTkZJR19DR1JPVVBTYCB0byBhdHRhY2ggdG8gYSBjZ3JvdXAsIGJ1dCBpdCBsb29rcyBsaWtlIGl0IHdpbGwgZ3JhY2VmdWxseSBkZWdyYWRlIHdpdGggYC1FT1BOT1RTVVBQYCBpZiBjZ3JvdXBzIGFyZW4ndCBlbmFibGVkLiBUaGF0J3MgZ29vZCwgbGVzcyBvZiBhIGhhcmQgZGVwZW5kZW5jeS4gTm93LCBgYnBmX3RyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXNgIOKAkyB0aGF0J3MgbG9jYXRlZCBpbiBgbW0vYnBmX21lbWNvbnRyb2wuY2AuIFNpbmNlIHRoYXQgZmlsZSBpcyBkZWFsaW5nIHdpdGggbWVtb3J5IGNvbnRyb2wsIGl0IG1ha2VzIHNlbnNlIHRoYXQgYENPTkZJR19NRU1DR2AgYW5kIGBDT05GSUdfQlBGX1NZU0NBTExgIGFyZSBsaWtlbHkgZGVwZW5kZW5jaWVzLCBidXQgSSBzaG91bGQgcHJvYmFibHkgY2hlY2sgdGhlIGBtbS9NYWtlZmlsZWAgdG8gY29uZmlybSB0aGUgZGV0YWlscy5cblxuXG4iLCJJbnB1dFRva2VucyI6MjU1NTQsIk91dHB1dFRva2VucyI6MjksIk91dHB1dFRob3VnaHRzVG9rZW5zIjozNjEsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0wN1QwODo1MDo1MS4zODQ0MDE2WiIsIlNlcSI6NCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjMxMTYzNTEwOCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJicGZfbWVtY29udHJvbC5vXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIm1tL1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJtbS9NYWtlZmlsZT0xMDY9aWZkZWYgQ09ORklHX0JQRl9TWVNDQUxMXFxubW0vTWFrZWZpbGU6MTA3Om9iai0kKENPTkZJR19NRU1DRykgKz0gYnBmX21lbWNvbnRyb2wub1xcbm1tL01ha2VmaWxlLTEwOC1lbmRpZlxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0wN1QwODo1MDo1MS42OTYwNDIwNTdaIiwiU2VxIjo1LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjoxNTQ1MjMwNDc5NywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgdGhlIE5ldyBCUEYgVGhyZWFkIFdvcmtxdWV1ZSBGZWF0dXJlKipcblxuT2theSwgc28gSSdtIGRpZ2dpbmcgaW50byB0aGlzIG5ldyBCUEYgdGhyZWFkIHdvcmtxdWV1ZSBwYXRjaC4gRmlyc3QgdGhpbmdzIGZpcnN0OiBpdCBsb29rcyBsaWtlIHdlIG5lZWQgYENPTkZJR19NRU1DR2AgZm9yIGBicGZfdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlc2AsIHdoaWNoIG1ha2VzIHNlbnNlIGZvciBtZW1vcnkgY29udHJvbCwgYW5kIGBDT05GSUdfQ0dST1VQU2AgaXMgcmVxdWlyZWQgZm9yIGBicGZfdGhyZWFkX3dxX2luaXRgIHRvIGZ1bmN0aW9uIGZ1bGx5IHdpdGggY2dyb3VwcywgYW5kIHRoZW4gb2YgY291cnNlIGBDT05GSUdfQlBGX1NZU0NBTExgIGlzIHN0YW5kYXJkIGZvciBCUEYsIHNvIGxldCdzIG1hcmsgdGhhdCBhcyB1bmRlcnN0b29kLlxuXG5MZXQgbWUgY29uZmlybSB0aGF0IGBicGZfdGhyZWFkX3dxX2luaXRgIGlzIGFjdHVhbGx5IGF2YWlsYWJsZS4gWWVwLCBpdCdzIGRlZmluZWQgcmlnaHQgdGhlcmUgaW4gYGtlcm5lbC9icGYvaGVscGVycy5jYC4gR29vZC4gQWxyaWdodCwgd2hhdCBlbHNlIGlzIGluIHBsYXk/IEhtbSwgYGJwZl90aHJlYWRfd3FfY2FuY2VsX2FuZF9mcmVlYCBpcyBpbnRlcmVzdGluZywgaXQgaXMgY2FsbGVkIGludGVybmFsbHkgd2hlbiBtYXBzIGFyZSBmcmVlZC4gSXQncyBub3QgYSBkaXJlY3Qga2Z1bmMgdXNlZCBieSBCUEYgcHJvZ3JhbXMsIGJ1dCBkZWZpbml0ZWx5IHBhcnQgb2YgdGhlIGxpZmVjeWNsZS4gQW5kIGBicGZfb2JqX2ZyZWVfdGhyZWFkX3dxYCBpcyBhbHNvIGludGVybmFsLlxuXG5Pa2F5LCBzbyB0aGUga2Z1bmNzIHdlICpkbyogbmVlZCB0byBmb2N1cyBvbiBhcmU6IGBicGZfdGhyZWFkX3dxX2luaXRgLCBgYnBmX3RocmVhZF93cV9zZXRfY2FsbGJhY2tgLCBgYnBmX3RocmVhZF93cV9zdGFydGAsIGFuZCBgYnBmX3RyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXNgLiBOb3csIGxldCdzIHZlcmlmeSB0aGF0IHRoZXNlIGtmdW5jcyBhcmUgYWN0dWFsbHkgZXhwb3NlZC4gYGJwZl90aHJlYWRfd3FfaW5pdGAgaXMgYWRkZWQgdG8gYHN5c2NhbGxfYnRmX2lkc2Agd2hpY2ggaXMgcmVnaXN0ZXJlZCBmb3IgYEJQRl9QUk9HX1RZUEVfU1lTQ0FMTGAuIEdvb2QuIGBicGZfdGhyZWFkX3dxX3NldF9jYWxsYmFja2AgYW5kIGBicGZfdGhyZWFkX3dxX3N0YXJ0YCBhcmUgaW4gYGdlbmVyaWNfYnRmX2lkc2AsIHdoaWNoIGlzIHJlZ2lzdGVyZWQgZm9yIGEgYnVuY2ggb2YgcHJvZ3JhbSB0eXBlcywgc28gdGhhdCdzIGZpbmUuIEFuZCBgYnBmX3RyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXNgIGlzIGluIGBicGZfbWVtY29udHJvbF9rZnVuY3NgLiBDb25maXJtZWQsIGNvbmZpcm1lZCwgY29uZmlybWVkLlxuXG5TbywgdGhlIGtleSBzeW1ib2xzIHRvIGtlZXAgYW4gZXllIG9uIGFyZTogYGJwZl90aHJlYWRfd3FfaW5pdGAsIGBicGZfdGhyZWFkX3dxX3NldF9jYWxsYmFja2AsIGBicGZfdGhyZWFkX3dxX3N0YXJ0YCwgYW5kIGBicGZfdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlc2AuIEFuZCB0aGVuIHRoZSByZWxldmFudCBjb25maWcgb3B0aW9ucyBhcmUgYE1FTUNHYCBhbmQgYENHUk9VUFNgLlxuXG5KdXN0IGRvdWJsZS1jaGVja2luZy4uLiBgYnBmX3RocmVhZF93cV9jYW5jZWxfYW5kX2ZyZWVgLiBObywgdGhhdCdzIGp1c3QgYSBnbG9iYWwgZnVuY3Rpb24sIGludGVybmFsIHRvIGBrZXJuZWwvYnBmL2hlbHBlcnMuY2AuIFdhaXQuLi5idXQgYGJwZl9vYmpfZnJlZV90aHJlYWRfd3FgIGFuZCBgYnBmX29ial9mcmVlX2ZpZWxkc2AgY2FsbCBpdC5cblxuT2gsIG9uZSBtb3JlIHRoaW5nIHRvIGNvbnNpZGVyOiBgY2dyb3VwX2t0aHJlYWRfYXR0YWNoYCwgd2hpY2ggaXMgYWRkZWQgaW4gYGtlcm5lbC9jZ3JvdXAvY2dyb3VwLmNgLiBJdCdzIGEgZ2xvYmFsIGZ1bmN0aW9uLCBhbmQgYSBoZWxwZXIgZm9yIGBicGZfdGhyZWFkX3dxX2luaXRgLiBPa2F5LCBJIHRoaW5rIHRoYXQgKnNob3VsZCogYmUgaW5jbHVkZWQgaW4gdGhlIGxpc3Qgb2YgZm9jdXMgc3ltYm9scywgZXZlbiB0aG91Z2ggaXQncyB0ZWNobmljYWxseSBhIGhlbHBlciBmdW5jdGlvbi5cblxuQWxyaWdodCwgbGV0J3MgcmVjYXAgdGhlIHJlYXNvbmluZzogdGhpcyBwYXRjaCBpbnRyb2R1Y2VzIGEgbmV3IEJQRiB0aHJlYWQgd29ya3F1ZXVlLCBsZXR0aW5nIEJQRiBwcm9ncmFtcyBzY2hlZHVsZSB3b3JrIGluIGt0aHJlYWQgY29udGV4dCwgb3B0aW9uYWxseSB0aWVkIHRvIGEgY2dyb3VwLCBhbmQgYWxzbyBhZGRzIGBicGZfdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlc2AgZm9yIG1lbW9yeSBjZ3JvdXAgcmVjbGFpbS4gVGhlc2UgYXJlIGZ1bmN0aW9uYWwgY2hhbmdlcyB0byB0aGUgQlBGIGNvcmUgYW5kIG1lbW9yeSBjb250cm9sLCBhY2Nlc3NpYmxlIGZyb20gdXNlcnNwYWNlIHRocm91Z2ggQlBGIHByb2dyYW1zLCBzbyBkZWZpbml0ZWx5IGZ1enphYmxlLlxuXG4qKkZpbmFsIEZvY3VzIFN5bWJvbHM6KipcblxuKiAgIGBicGZfdGhyZWFkX3dxX2luaXRgXG4qICAgYGJwZl90aHJlYWRfd3Ffc2V0X2NhbGxiYWNrYFxuKiAgIGBicGZfdGhyZWFkX3dxX3N0YXJ0YFxuKiAgIGBicGZfdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlc2BcbiogICBgY2dyb3VwX2t0aHJlYWRfYXR0YWNoYFxuXG4qKlJlbGV2YW50IENvbmZpZ3M6KipcblxuKiAgIGBNRU1DR2BcbiogICBgQ0dST1VQU2BcblxuT2theSwgdGhhdCdzIGV2ZXJ5dGhpbmcuIExldCdzIHNlbmQgdGhlc2UgcmVzdWx0cyBvdmVyLlxuXG5cbiIsIklucHV0VG9rZW5zIjoyNjQ2NiwiT3V0cHV0VG9rZW5zIjoyMDUsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo4MzIsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDdUMDg6NTE6MDcuMTQ4MzQ5NTg0WiIsIlNlcSI6NiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoic2V0LXJlc3VsdHMiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNTAwMjk0MzksIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIk1FTUNHXCIsXG4gICAgXCJDR1JPVVBTXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwiYnBmX3RocmVhZF93cV9pbml0XCIsXG4gICAgXCJicGZfdGhyZWFkX3dxX3NldF9jYWxsYmFja1wiLFxuICAgIFwiYnBmX3RocmVhZF93cV9zdGFydFwiLFxuICAgIFwiYnBmX3RyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXNcIixcbiAgICBcImNncm91cF9rdGhyZWFkX2F0dGFjaFwiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGludHJvZHVjZXMgYSBuZXcgQlBGIHRocmVhZCB3b3JrcXVldWUgZmVhdHVyZSAoYGJwZl90aHJlYWRfd3FgKSB0aGF0IGFsbG93cyBCUEYgcHJvZ3JhbXMgdG8gc2NoZWR1bGUgd29yayBpbiBhIGt0aHJlYWQgY29udGV4dCwgb3B0aW9uYWxseSBhdHRhY2hlZCB0byBhIGNncm91cC4gSXQgYWxzbyBhZGRzIGEgbmV3IEJQRiBrZnVuYyBgYnBmX3RyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXNgIGZvciBtZW1vcnkgY2dyb3VwIHJlY2xhaW0uIFRoZXNlIGFyZSBmdW5jdGlvbmFsIGNoYW5nZXMgdG8gdGhlIGNvcmUgQlBGIGFuZCBtZW1vcnkgY29udHJvbCBzdWJzeXN0ZW1zLCByZWFjaGFibGUgZnJvbSB1c2Vyc3BhY2UgdmlhIEJQRiBwcm9ncmFtcywgYW5kIHNob3VsZCBiZSBmdXp6ZWQuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiTUVNQ0dcIixcbiAgICBcIkNHUk9VUFNcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJicGZfdGhyZWFkX3dxX2luaXRcIixcbiAgICBcImJwZl90aHJlYWRfd3Ffc2V0X2NhbGxiYWNrXCIsXG4gICAgXCJicGZfdGhyZWFkX3dxX3N0YXJ0XCIsXG4gICAgXCJicGZfdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlc1wiLFxuICAgIFwiY2dyb3VwX2t0aHJlYWRfYXR0YWNoXCJcbiAgXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggaW50cm9kdWNlcyBhIG5ldyBCUEYgdGhyZWFkIHdvcmtxdWV1ZSBmZWF0dXJlIChgYnBmX3RocmVhZF93cWApIHRoYXQgYWxsb3dzIEJQRiBwcm9ncmFtcyB0byBzY2hlZHVsZSB3b3JrIGluIGEga3RocmVhZCBjb250ZXh0LCBvcHRpb25hbGx5IGF0dGFjaGVkIHRvIGEgY2dyb3VwLiBJdCBhbHNvIGFkZHMgYSBuZXcgQlBGIGtmdW5jIGBicGZfdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlc2AgZm9yIG1lbW9yeSBjZ3JvdXAgcmVjbGFpbS4gVGhlc2UgYXJlIGZ1bmN0aW9uYWwgY2hhbmdlcyB0byB0aGUgY29yZSBCUEYgYW5kIG1lbW9yeSBjb250cm9sIHN1YnN5c3RlbXMsIHJlYWNoYWJsZSBmcm9tIHVzZXJzcGFjZSB2aWEgQlBGIHByb2dyYW1zLCBhbmQgc2hvdWxkIGJlIGZ1enplZC5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9XTsKCQkJaWYgKCFyYXdEYXRhIHx8IHJhd0RhdGEubGVuZ3RoID09PSAwKSByZXR1cm47CgoJCQlkcmF3U3VtbWFyeVRhYmxlcyhyYXdEYXRhKTsKCQkJZHJhd0R1cmF0aW9uQ2hhcnQocmF3RGF0YSk7CgkJCWRyYXdUb2tlbkNvbnN1bXB0aW9uQ2hhcnQocmF3RGF0YSk7CgkJfQoKCQlmdW5jdGlvbiBkcmF3U3VtbWFyeVRhYmxlcyhyYXdEYXRhKSB7CgkJCWNvbnN0IHN0YXRzID0gewoJCQkJbGxtOiB7IGNvdW50OiAwLCB0b2tlbnM6IDAsIGR1cmF0aW9uOiAwIH0sCgkJCQl0b29sOiB7IGNvdW50OiAwLCBkdXJhdGlvbjogMCB9CgkJCX07CgoJCQlyYXdEYXRhLmZvckVhY2gocyA9PiB7CgkJCQljb25zdCBkdXIgPSBzLkR1cmF0aW9uIC8gMTAwMDAwMDAwMDsgCgkJCQlpZiAocy5UeXBlID09PSAibGxtIikgewoJCQkJCXN0YXRzLmxsbS5jb3VudCsrOwoJCQkJCXN0YXRzLmxsbS50b2tlbnMgKz0gKHMuSW5wdXRUb2tlbnMgKyBzLk91dHB1dFRva2VucyArIHMuT3V0cHV0VGhvdWdodHNUb2tlbnMpOwoJCQkJCXN0YXRzLmxsbS5kdXJhdGlvbiArPSBkdXI7CgkJCQl9IGVsc2UgaWYgKHMuVHlwZSA9PT0gInRvb2wiKSB7CgkJCQkJc3RhdHMudG9vbC5jb3VudCsrOwoJCQkJCXN0YXRzLnRvb2wuZHVyYXRpb24gKz0gZHVyOwoJCQkJfQoJCQl9KTsKCgkJCWNvbnN0IGF2Z0xsbUR1ciA9IHN0YXRzLmxsbS5jb3VudCA+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-workflowlcc6l[1] Phase: Succeeded StartedAt: 2026-08-07 08:51:19 +0000 UTC FinishedAt: 2026-08-07 08:51:19 +0000 UTC Input: nil Output: nil --------- Name: series-workflowlcc6l[1].abort-on-skip-outcome Phase: Skipped StartedAt: 2026-08-07 08:51:19 +0000 UTC FinishedAt: 2026-08-07 08:51:19 +0000 UTC Input: nil Output: nil --------- Name: series-workflowlcc6l[2] Phase: Succeeded StartedAt: 2026-08-07 08:51:19 +0000 UTC FinishedAt: 2026-08-07 12:28:41 +0000 UTC Input: nil Output: nil --------- Name: series-workflowlcc6l[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"8c7f55d60aa3512fd3da7e9cf313723460e487b4","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","CGROUPS"],"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","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["bpf","net"],"focus_symbols":["bpf_thread_wq_init","bpf_thread_wq_set_callback","bpf_thread_wq_start","bpf_try_to_free_mem_cgroup_pages","cgroup_kthread_attach"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"8c7f55d60aa3512fd3da7e9cf313723460e487b4","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","CGROUPS"],"series_id":"ce95f701-5786-4fe2-8f55-ad86a4f88cdd","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-08-07 08:51:19 +0000 UTC FinishedAt: 2026-08-07 12:28:41 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:element,Default:nil,Value:*{"base":{"arch":"amd64","commit_hash":"8c7f55d60aa3512fd3da7e9cf313723460e487b4","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","CGROUPS"],"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","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["bpf","net"],"focus_symbols":["bpf_thread_wq_init","bpf_thread_wq_set_callback","bpf_thread_wq_start","bpf_try_to_free_mem_cgroup_pages","cgroup_kthread_attach"],"skip_cover_check":true},"patched":{"arch":"amd64","commit_hash":"8c7f55d60aa3512fd3da7e9cf313723460e487b4","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","CGROUPS"],"series_id":"ce95f701-5786-4fe2-8f55-ad86a4f88cdd","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-workflowlcc6l[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"8c7f55d60aa3512fd3da7e9cf313723460e487b4","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","CGROUPS"],"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","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["bpf","net"],"focus_symbols":["bpf_thread_wq_init","bpf_thread_wq_set_callback","bpf_thread_wq_start","bpf_try_to_free_mem_cgroup_pages","cgroup_kthread_attach"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"8c7f55d60aa3512fd3da7e9cf313723460e487b4","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","CGROUPS"],"series_id":"ce95f701-5786-4fe2-8f55-ad86a4f88cdd","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-08-07 08:51:19 +0000 UTC FinishedAt: 2026-08-07 08:51:29 +0000 UTC Input: nil Output: nil --------- Name: series-workflowlcc6l[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"8c7f55d60aa3512fd3da7e9cf313723460e487b4","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","CGROUPS"],"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","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["bpf","net"],"focus_symbols":["bpf_thread_wq_init","bpf_thread_wq_set_callback","bpf_thread_wq_start","bpf_try_to_free_mem_cgroup_pages","cgroup_kthread_attach"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"8c7f55d60aa3512fd3da7e9cf313723460e487b4","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","CGROUPS"],"series_id":"ce95f701-5786-4fe2-8f55-ad86a4f88cdd","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-08-07 08:51:19 +0000 UTC FinishedAt: 2026-08-07 08:51:24 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"arch":"amd64","commit_hash":"8c7f55d60aa3512fd3da7e9cf313723460e487b4","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","CGROUPS"],"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-workflowlcc6l/series-workflowlcc6l-convert-artifact-1779131068/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowlcc6l[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"8c7f55d60aa3512fd3da7e9cf313723460e487b4","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","CGROUPS"],"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","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["bpf","net"],"focus_symbols":["bpf_thread_wq_init","bpf_thread_wq_set_callback","bpf_thread_wq_start","bpf_try_to_free_mem_cgroup_pages","cgroup_kthread_attach"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"8c7f55d60aa3512fd3da7e9cf313723460e487b4","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","CGROUPS"],"series_id":"ce95f701-5786-4fe2-8f55-ad86a4f88cdd","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-08-07 08:51:29 +0000 UTC FinishedAt: 2026-08-07 09:07:21 +0000 UTC Input: nil Output: nil --------- Name: series-workflowlcc6l[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"8c7f55d60aa3512fd3da7e9cf313723460e487b4","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","CGROUPS"],"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","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["bpf","net"],"focus_symbols":["bpf_thread_wq_init","bpf_thread_wq_set_callback","bpf_thread_wq_start","bpf_try_to_free_mem_cgroup_pages","cgroup_kthread_attach"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"8c7f55d60aa3512fd3da7e9cf313723460e487b4","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","CGROUPS"],"series_id":"ce95f701-5786-4fe2-8f55-ad86a4f88cdd","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-08-07 08:51:29 +0000 UTC FinishedAt: 2026-08-07 09:07:21 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:findings,Default:nil,Value:*false,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:test-name,Default:nil,Value:*[KASAN] Build Base,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:smoke-build,Default:nil,Value:*false,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:session-id,Default:nil,Value:*92edfd10-988c-49ac-a295-d5bdb0330d64,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-workflowlcc6l/series-workflowlcc6l-convert-artifact-1779131068/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": "a6123c18-e0da-457a-b5bc-75332c8880a1", "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-workflowlcc6l/series-workflowlcc6l-build-action-4124046314/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowlcc6l[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"8c7f55d60aa3512fd3da7e9cf313723460e487b4","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","CGROUPS"],"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","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["bpf","net"],"focus_symbols":["bpf_thread_wq_init","bpf_thread_wq_set_callback","bpf_thread_wq_start","bpf_try_to_free_mem_cgroup_pages","cgroup_kthread_attach"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"8c7f55d60aa3512fd3da7e9cf313723460e487b4","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","CGROUPS"],"series_id":"ce95f701-5786-4fe2-8f55-ad86a4f88cdd","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-08-07 08:51:29 +0000 UTC FinishedAt: 2026-08-07 09:07:11 +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:*92edfd10-988c-49ac-a295-d5bdb0330d64,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-workflowlcc6l/series-workflowlcc6l-convert-artifact-1779131068/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": "a6123c18-e0da-457a-b5bc-75332c8880a1", "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-workflowlcc6l/series-workflowlcc6l-build-action-4124046314/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowlcc6l[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"8c7f55d60aa3512fd3da7e9cf313723460e487b4","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","CGROUPS"],"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","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["bpf","net"],"focus_symbols":["bpf_thread_wq_init","bpf_thread_wq_set_callback","bpf_thread_wq_start","bpf_try_to_free_mem_cgroup_pages","cgroup_kthread_attach"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"8c7f55d60aa3512fd3da7e9cf313723460e487b4","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","CGROUPS"],"series_id":"ce95f701-5786-4fe2-8f55-ad86a4f88cdd","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-08-07 09:07:21 +0000 UTC FinishedAt: 2026-08-07 09:07:21 +0000 UTC Input: nil Output: nil --------- Name: series-workflowlcc6l[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"8c7f55d60aa3512fd3da7e9cf313723460e487b4","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","CGROUPS"],"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","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["bpf","net"],"focus_symbols":["bpf_thread_wq_init","bpf_thread_wq_set_callback","bpf_thread_wq_start","bpf_try_to_free_mem_cgroup_pages","cgroup_kthread_attach"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"8c7f55d60aa3512fd3da7e9cf313723460e487b4","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","CGROUPS"],"series_id":"ce95f701-5786-4fe2-8f55-ad86a4f88cdd","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-08-07 09:07:21 +0000 UTC FinishedAt: 2026-08-07 09:07:21 +0000 UTC Input: nil Output: nil --------- Name: series-workflowlcc6l[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"8c7f55d60aa3512fd3da7e9cf313723460e487b4","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","CGROUPS"],"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","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["bpf","net"],"focus_symbols":["bpf_thread_wq_init","bpf_thread_wq_set_callback","bpf_thread_wq_start","bpf_try_to_free_mem_cgroup_pages","cgroup_kthread_attach"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"8c7f55d60aa3512fd3da7e9cf313723460e487b4","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","CGROUPS"],"series_id":"ce95f701-5786-4fe2-8f55-ad86a4f88cdd","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-08-07 09:07:21 +0000 UTC FinishedAt: 2026-08-07 09:07:31 +0000 UTC Input: nil Output: nil --------- Name: series-workflowlcc6l[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"8c7f55d60aa3512fd3da7e9cf313723460e487b4","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","CGROUPS"],"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","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["bpf","net"],"focus_symbols":["bpf_thread_wq_init","bpf_thread_wq_set_callback","bpf_thread_wq_start","bpf_try_to_free_mem_cgroup_pages","cgroup_kthread_attach"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"8c7f55d60aa3512fd3da7e9cf313723460e487b4","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","CGROUPS"],"series_id":"ce95f701-5786-4fe2-8f55-ad86a4f88cdd","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-08-07 09:07:21 +0000 UTC FinishedAt: 2026-08-07 09:07:25 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"arch":"amd64","commit_hash":"8c7f55d60aa3512fd3da7e9cf313723460e487b4","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","CGROUPS"],"series_id":"ce95f701-5786-4fe2-8f55-ad86a4f88cdd","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-workflowlcc6l/series-workflowlcc6l-convert-artifact-752365051/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowlcc6l[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"8c7f55d60aa3512fd3da7e9cf313723460e487b4","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","CGROUPS"],"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","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["bpf","net"],"focus_symbols":["bpf_thread_wq_init","bpf_thread_wq_set_callback","bpf_thread_wq_start","bpf_try_to_free_mem_cgroup_pages","cgroup_kthread_attach"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"8c7f55d60aa3512fd3da7e9cf313723460e487b4","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","CGROUPS"],"series_id":"ce95f701-5786-4fe2-8f55-ad86a4f88cdd","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-08-07 09:07:31 +0000 UTC FinishedAt: 2026-08-07 09:09:22 +0000 UTC Input: nil Output: nil --------- Name: series-workflowlcc6l[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"8c7f55d60aa3512fd3da7e9cf313723460e487b4","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","CGROUPS"],"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","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["bpf","net"],"focus_symbols":["bpf_thread_wq_init","bpf_thread_wq_set_callback","bpf_thread_wq_start","bpf_try_to_free_mem_cgroup_pages","cgroup_kthread_attach"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"8c7f55d60aa3512fd3da7e9cf313723460e487b4","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","CGROUPS"],"series_id":"ce95f701-5786-4fe2-8f55-ad86a4f88cdd","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-08-07 09:07:31 +0000 UTC FinishedAt: 2026-08-07 09:09:12 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*a6123c18-e0da-457a-b5bc-75332c8880a1,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-workflowlcc6l/series-workflowlcc6l-build-action-4124046314/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-workflowlcc6l[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"8c7f55d60aa3512fd3da7e9cf313723460e487b4","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","CGROUPS"],"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","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["bpf","net"],"focus_symbols":["bpf_thread_wq_init","bpf_thread_wq_set_callback","bpf_thread_wq_start","bpf_try_to_free_mem_cgroup_pages","cgroup_kthread_attach"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"8c7f55d60aa3512fd3da7e9cf313723460e487b4","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","CGROUPS"],"series_id":"ce95f701-5786-4fe2-8f55-ad86a4f88cdd","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-08-07 09:09:22 +0000 UTC FinishedAt: 2026-08-07 09:09:22 +0000 UTC Input: nil Output: nil --------- Name: series-workflowlcc6l[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"8c7f55d60aa3512fd3da7e9cf313723460e487b4","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","CGROUPS"],"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","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["bpf","net"],"focus_symbols":["bpf_thread_wq_init","bpf_thread_wq_set_callback","bpf_thread_wq_start","bpf_try_to_free_mem_cgroup_pages","cgroup_kthread_attach"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"8c7f55d60aa3512fd3da7e9cf313723460e487b4","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","CGROUPS"],"series_id":"ce95f701-5786-4fe2-8f55-ad86a4f88cdd","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-08-07 09:09:22 +0000 UTC FinishedAt: 2026-08-07 09:09:22 +0000 UTC Input: nil Output: nil --------- Name: series-workflowlcc6l[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"8c7f55d60aa3512fd3da7e9cf313723460e487b4","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","CGROUPS"],"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","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["bpf","net"],"focus_symbols":["bpf_thread_wq_init","bpf_thread_wq_set_callback","bpf_thread_wq_start","bpf_try_to_free_mem_cgroup_pages","cgroup_kthread_attach"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"8c7f55d60aa3512fd3da7e9cf313723460e487b4","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","CGROUPS"],"series_id":"ce95f701-5786-4fe2-8f55-ad86a4f88cdd","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-08-07 09:09:22 +0000 UTC FinishedAt: 2026-08-07 09:25:23 +0000 UTC Input: nil Output: nil --------- Name: series-workflowlcc6l[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"8c7f55d60aa3512fd3da7e9cf313723460e487b4","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","CGROUPS"],"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","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["bpf","net"],"focus_symbols":["bpf_thread_wq_init","bpf_thread_wq_set_callback","bpf_thread_wq_start","bpf_try_to_free_mem_cgroup_pages","cgroup_kthread_attach"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"8c7f55d60aa3512fd3da7e9cf313723460e487b4","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","CGROUPS"],"series_id":"ce95f701-5786-4fe2-8f55-ad86a4f88cdd","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-08-07 09:09:22 +0000 UTC FinishedAt: 2026-08-07 09:25:23 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:findings,Default:nil,Value:*true,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:test-name,Default:nil,Value:*[KASAN] Build Patched,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:smoke-build,Default:nil,Value:*false,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:session-id,Default:nil,Value:*92edfd10-988c-49ac-a295-d5bdb0330d64,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-workflowlcc6l/series-workflowlcc6l-convert-artifact-752365051/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": "3034c3f4-d7c8-4410-b3c7-46f131cb02ce", "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-workflowlcc6l/series-workflowlcc6l-build-action-2534842911/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowlcc6l[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"8c7f55d60aa3512fd3da7e9cf313723460e487b4","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","CGROUPS"],"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","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["bpf","net"],"focus_symbols":["bpf_thread_wq_init","bpf_thread_wq_set_callback","bpf_thread_wq_start","bpf_try_to_free_mem_cgroup_pages","cgroup_kthread_attach"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"8c7f55d60aa3512fd3da7e9cf313723460e487b4","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","CGROUPS"],"series_id":"ce95f701-5786-4fe2-8f55-ad86a4f88cdd","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-08-07 09:09:22 +0000 UTC FinishedAt: 2026-08-07 09:25:13 +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:*92edfd10-988c-49ac-a295-d5bdb0330d64,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-workflowlcc6l/series-workflowlcc6l-convert-artifact-752365051/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": "3034c3f4-d7c8-4410-b3c7-46f131cb02ce", "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-workflowlcc6l/series-workflowlcc6l-build-action-2534842911/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowlcc6l[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"8c7f55d60aa3512fd3da7e9cf313723460e487b4","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","CGROUPS"],"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","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["bpf","net"],"focus_symbols":["bpf_thread_wq_init","bpf_thread_wq_set_callback","bpf_thread_wq_start","bpf_try_to_free_mem_cgroup_pages","cgroup_kthread_attach"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"8c7f55d60aa3512fd3da7e9cf313723460e487b4","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","CGROUPS"],"series_id":"ce95f701-5786-4fe2-8f55-ad86a4f88cdd","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-08-07 09:25:23 +0000 UTC FinishedAt: 2026-08-07 09:25:23 +0000 UTC Input: nil Output: nil --------- Name: series-workflowlcc6l[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"8c7f55d60aa3512fd3da7e9cf313723460e487b4","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","CGROUPS"],"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","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["bpf","net"],"focus_symbols":["bpf_thread_wq_init","bpf_thread_wq_set_callback","bpf_thread_wq_start","bpf_try_to_free_mem_cgroup_pages","cgroup_kthread_attach"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"8c7f55d60aa3512fd3da7e9cf313723460e487b4","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","CGROUPS"],"series_id":"ce95f701-5786-4fe2-8f55-ad86a4f88cdd","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-08-07 09:25:23 +0000 UTC FinishedAt: 2026-08-07 09:25:23 +0000 UTC Input: nil Output: nil --------- Name: series-workflowlcc6l[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"8c7f55d60aa3512fd3da7e9cf313723460e487b4","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","CGROUPS"],"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","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["bpf","net"],"focus_symbols":["bpf_thread_wq_init","bpf_thread_wq_set_callback","bpf_thread_wq_start","bpf_try_to_free_mem_cgroup_pages","cgroup_kthread_attach"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"8c7f55d60aa3512fd3da7e9cf313723460e487b4","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","CGROUPS"],"series_id":"ce95f701-5786-4fe2-8f55-ad86a4f88cdd","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-08-07 09:25:23 +0000 UTC FinishedAt: 2026-08-07 09:27:13 +0000 UTC Input: nil Output: nil --------- Name: series-workflowlcc6l[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"8c7f55d60aa3512fd3da7e9cf313723460e487b4","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","CGROUPS"],"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","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["bpf","net"],"focus_symbols":["bpf_thread_wq_init","bpf_thread_wq_set_callback","bpf_thread_wq_start","bpf_try_to_free_mem_cgroup_pages","cgroup_kthread_attach"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"8c7f55d60aa3512fd3da7e9cf313723460e487b4","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","CGROUPS"],"series_id":"ce95f701-5786-4fe2-8f55-ad86a4f88cdd","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-08-07 09:25:23 +0000 UTC FinishedAt: 2026-08-07 09:27:03 +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:*3034c3f4-d7c8-4410-b3c7-46f131cb02ce,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-workflowlcc6l/series-workflowlcc6l-build-action-2534842911/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-workflowlcc6l[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"8c7f55d60aa3512fd3da7e9cf313723460e487b4","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","CGROUPS"],"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","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["bpf","net"],"focus_symbols":["bpf_thread_wq_init","bpf_thread_wq_set_callback","bpf_thread_wq_start","bpf_try_to_free_mem_cgroup_pages","cgroup_kthread_attach"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"8c7f55d60aa3512fd3da7e9cf313723460e487b4","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","CGROUPS"],"series_id":"ce95f701-5786-4fe2-8f55-ad86a4f88cdd","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-08-07 09:27:13 +0000 UTC FinishedAt: 2026-08-07 12:28:41 +0000 UTC Input: nil Output: nil --------- Name: series-workflowlcc6l[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"8c7f55d60aa3512fd3da7e9cf313723460e487b4","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","CGROUPS"],"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","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["bpf","net"],"focus_symbols":["bpf_thread_wq_init","bpf_thread_wq_set_callback","bpf_thread_wq_start","bpf_try_to_free_mem_cgroup_pages","cgroup_kthread_attach"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"8c7f55d60aa3512fd3da7e9cf313723460e487b4","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","CGROUPS"],"series_id":"ce95f701-5786-4fe2-8f55-ad86a4f88cdd","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-08-07 09:27:13 +0000 UTC FinishedAt: 2026-08-07 12:28:41 +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","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["bpf","net"],"focus_symbols":["bpf_thread_wq_init","bpf_thread_wq_set_callback","bpf_thread_wq_start","bpf_try_to_free_mem_cgroup_pages","cgroup_kthread_attach"],"skip_cover_check":true},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:track,Default:nil,Value:*KASAN,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:base-build-id,Default:nil,Value:*a6123c18-e0da-457a-b5bc-75332c8880a1,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*3034c3f4-d7c8-4410-b3c7-46f131cb02ce,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-workflowlcc6l/series-workflowlcc6l-build-action-4124046314/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-workflowlcc6l/series-workflowlcc6l-build-action-2534842911/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: nil --------- Name: series-workflowlcc6l[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"8c7f55d60aa3512fd3da7e9cf313723460e487b4","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","CGROUPS"],"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","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["bpf","net"],"focus_symbols":["bpf_thread_wq_init","bpf_thread_wq_set_callback","bpf_thread_wq_start","bpf_try_to_free_mem_cgroup_pages","cgroup_kthread_attach"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"8c7f55d60aa3512fd3da7e9cf313723460e487b4","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","CGROUPS"],"series_id":"ce95f701-5786-4fe2-8f55-ad86a4f88cdd","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-08-07 09:27:13 +0000 UTC FinishedAt: 2026-08-07 09:27:23 +0000 UTC Input: nil Output: nil --------- Name: series-workflowlcc6l[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"8c7f55d60aa3512fd3da7e9cf313723460e487b4","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","CGROUPS"],"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","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["bpf","net"],"focus_symbols":["bpf_thread_wq_init","bpf_thread_wq_set_callback","bpf_thread_wq_start","bpf_try_to_free_mem_cgroup_pages","cgroup_kthread_attach"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"8c7f55d60aa3512fd3da7e9cf313723460e487b4","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","CGROUPS"],"series_id":"ce95f701-5786-4fe2-8f55-ad86a4f88cdd","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-08-07 09:27:13 +0000 UTC FinishedAt: 2026-08-07 09:27:18 +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","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["bpf","net"],"focus_symbols":["bpf_thread_wq_init","bpf_thread_wq_set_callback","bpf_thread_wq_start","bpf_try_to_free_mem_cgroup_pages","cgroup_kthread_attach"],"skip_cover_check":true},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: &Outputs{Parameters:[]Parameter{},Artifacts:[]Artifact{Artifact{Name:artifact,Path:/tmp/artifact,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowlcc6l/series-workflowlcc6l-convert-artifact-3933540084/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowlcc6l[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"8c7f55d60aa3512fd3da7e9cf313723460e487b4","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","CGROUPS"],"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","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["bpf","net"],"focus_symbols":["bpf_thread_wq_init","bpf_thread_wq_set_callback","bpf_thread_wq_start","bpf_try_to_free_mem_cgroup_pages","cgroup_kthread_attach"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"8c7f55d60aa3512fd3da7e9cf313723460e487b4","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","CGROUPS"],"series_id":"ce95f701-5786-4fe2-8f55-ad86a4f88cdd","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-08-07 09:27:13 +0000 UTC FinishedAt: 2026-08-07 09:27:13 +0000 UTC Input: nil Output: nil --------- Name: series-workflowlcc6l[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"8c7f55d60aa3512fd3da7e9cf313723460e487b4","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","CGROUPS"],"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","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["bpf","net"],"focus_symbols":["bpf_thread_wq_init","bpf_thread_wq_set_callback","bpf_thread_wq_start","bpf_try_to_free_mem_cgroup_pages","cgroup_kthread_attach"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"8c7f55d60aa3512fd3da7e9cf313723460e487b4","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","CGROUPS"],"series_id":"ce95f701-5786-4fe2-8f55-ad86a4f88cdd","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-08-07 09:27:13 +0000 UTC FinishedAt: 2026-08-07 09:27:13 +0000 UTC Input: nil Output: nil --------- Name: series-workflowlcc6l[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"8c7f55d60aa3512fd3da7e9cf313723460e487b4","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","CGROUPS"],"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","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["bpf","net"],"focus_symbols":["bpf_thread_wq_init","bpf_thread_wq_set_callback","bpf_thread_wq_start","bpf_try_to_free_mem_cgroup_pages","cgroup_kthread_attach"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"8c7f55d60aa3512fd3da7e9cf313723460e487b4","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","CGROUPS"],"series_id":"ce95f701-5786-4fe2-8f55-ad86a4f88cdd","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-08-07 09:27:13 +0000 UTC FinishedAt: 2026-08-07 09:27:13 +0000 UTC Input: nil Output: nil --------- Name: series-workflowlcc6l[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"8c7f55d60aa3512fd3da7e9cf313723460e487b4","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","CGROUPS"],"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","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["bpf","net"],"focus_symbols":["bpf_thread_wq_init","bpf_thread_wq_set_callback","bpf_thread_wq_start","bpf_try_to_free_mem_cgroup_pages","cgroup_kthread_attach"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"8c7f55d60aa3512fd3da7e9cf313723460e487b4","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","CGROUPS"],"series_id":"ce95f701-5786-4fe2-8f55-ad86a4f88cdd","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-08-07 09:27:23 +0000 UTC FinishedAt: 2026-08-07 12:28:41 +0000 UTC Input: nil Output: nil --------- Name: series-workflowlcc6l[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"8c7f55d60aa3512fd3da7e9cf313723460e487b4","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","CGROUPS"],"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","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["bpf","net"],"focus_symbols":["bpf_thread_wq_init","bpf_thread_wq_set_callback","bpf_thread_wq_start","bpf_try_to_free_mem_cgroup_pages","cgroup_kthread_attach"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"8c7f55d60aa3512fd3da7e9cf313723460e487b4","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMCG","CGROUPS"],"series_id":"ce95f701-5786-4fe2-8f55-ad86a4f88cdd","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-08-07 09:27:23 +0000 UTC FinishedAt: 2026-08-07 12:28:31 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*a6123c18-e0da-457a-b5bc-75332c8880a1,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*3034c3f4-d7c8-4410-b3c7-46f131cb02ce,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-workflowlcc6l/series-workflowlcc6l-build-action-4124046314/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-workflowlcc6l/series-workflowlcc6l-build-action-2534842911/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-workflowlcc6l/series-workflowlcc6l-convert-artifact-3933540084/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,}