Name: series-workflow5g9lk Phase: Succeeded StartedAt: 2026-09-14 13:46:03 +0000 UTC FinishedAt: 2026-09-14 19:18:31 +0000 UTC Input: nil Output: nil --------- Name: series-workflow5g9lk[0] Phase: Succeeded StartedAt: 2026-09-14 13:46:03 +0000 UTC FinishedAt: 2026-09-14 14:47:28 +0000 UTC Input: nil Output: nil --------- Name: series-workflow5g9lk[0].run-triage Phase: Succeeded StartedAt: 2026-09-14 13:46:03 +0000 UTC FinishedAt: 2026-09-14 14:47:28 +0000 UTC Input: nil Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "skip_reason": "", "targets": [ { "base": { "arch": "amd64", "tree_name": "linux-next", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next", "commit_hash": "68142f986ff04b2b70b31db00f719bf690f64a9a", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "EXT4_FS" ], "series_id": "" }, "patched": { "arch": "amd64", "tree_name": "linux-next", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next", "commit_hash": "68142f986ff04b2b70b31db00f719bf690f64a9a", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "EXT4_FS" ], "series_id": "473faa75-ef75-448c-ba20-22fab9b37077" }, "track": "KASAN", "fuzz": { "focus": [ "fs" ], "focus_symbols": [ "ext4_ext_clear_bb", "ext4_fc_replay_inode", "ext4_fc_replay" ], "corpus_urls": [ "https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db" ], "skip_cover_check": false, "bug_title_re": "", "base_commit": "68142f986ff04b2b70b31db00f719bf690f64a9a", "base_tree": "linux-next" }, "retest": null } ], "trajectory": "CjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KPGhlYWQ+Cgk8dGl0bGU+QUkgVHJhamVjdG9yeTwvdGl0bGU+Cgk8c3R5bGU+CgkJdGFibGUgewoJCQlib3JkZXI6IDFweCBzb2xpZCAjY2NjOwoJCQltYXJnaW46IDIwcHggNXB4OwoJCQlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwoJCQl3aGl0ZS1zcGFjZTogbm93cmFwOwoJCQl0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKCQkJb3ZlcmZsb3c6IGhpZGRlbjsKCQl9CgoJCXRhYmxlIGNhcHRpb24gewoJCQlmb250LXdlaWdodDogYm9sZDsKCQl9CgoJCXRhYmxlIHRkLCB0YWJsZSB0aCB7CgkJCXZlcnRpY2FsLWFsaWduOiB0b3A7CgkJCXBhZGRpbmc6IDJweCA4cHg7CgkJCXRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwoJCQlvdmVyZmxvdzogaGlkZGVuOwoJCX0KCgkJLmxpc3RfdGFibGUgdGQsIC5saXN0X3RhYmxlIHRoIHsKCQkJYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjY2NjOwoJCX0KCgkJLmxpc3RfdGFibGUgdGggewoJCQliYWNrZ3JvdW5kOiAjRjRGNEY0OwoJCX0KCgkJLmxpc3RfdGFibGUgdHI6bnRoLWNoaWxkKDJuKSB7CgkJCWJhY2tncm91bmQ6ICNGNEY0RjQ7CgkJfQoKCQkubGlzdF90YWJsZSB0cjpob3ZlciB7CgkJCWJhY2tncm91bmQ6ICNmZmZmOTk7CgkJfQoKCQkjYWlfZGV0YWlsc19kaXYgcHJlIHsKCQkJbWFyZ2luOiAxcHg7CgkJCW1heC13aWR0aDogMTIwY2g7CgkJCXdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKCQkJb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKCQl9Cgk8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PgoJPGgxPkFJIFRyYWplY3Rvcnk8L2gxPgoJPGJyPgoKCQoJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQk8Y2FwdGlvbj5UcmFqZWN0b3J5OiAoPGEgaHJlZj0iIyIgb25jbGljaz0idG9nZ2xlQWxsRGV0YWlscygpOyByZXR1cm4gZmFsc2U7Ij5FeHBhbmQvQ29sbGFwc2UgQWxsPC9hPik8L2NhcHRpb24+CgkJPHRoZWFkPjx0cj4KCQkJPHRoPlNlcTwvdGg+CgkJCTx0aD5UaW1lc3RhbXA8L3RoPgoJCQk8dGg+VHlwZTwvdGg+CgkJCTx0aD5OYW1lPC90aD4KCQkJPHRoPkR1cmF0aW9uPC90aD4KCQk8L3RyPjwvdGhlYWQ+CgkJPHRib2R5PgoJCQoJCTx0cj4KCQkJPHRkPjAvMDwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE0IDE0OjM2PC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MTFtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtFWFQ0X0ZTJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7ZXh0NF9leHRfY2xlYXJfYmImIzM0OywKICAgICYjMzQ7ZXh0NF9mY19yZXBsYXlfaW5vZGUmIzM0OywKICAgICYjMzQ7ZXh0NF9mY19yZXBsYXkmIzM0OwogIF0sCiAgJiMzNDtLTVNBTlJlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBpbXByb3ZlcyBlcnJvciBoYW5kbGluZyBpbiBleHQ0IGZhc3QgY29tbWl0IHJlcGxheSBjb2RlIChmcy9leHQ0L2V4dGVudHMuYyBhbmQgZnMvZXh0NC9mYXN0X2NvbW1pdC5jKS4gU3BlY2lmaWNhbGx5LCBleHQ0X2V4dF9jbGVhcl9iYigpIG5vdyBwcm9wZXJseSBwcm9wYWdhdGVzIGVycm9yIHJldHVybiBjb2RlcyBmcm9tIGV4dDRfbWFwX2Jsb2NrcygpLCBleHQ0X2ZpbmRfZXh0ZW50KCksIGFuZCBleHQ0X2ZjX3JlY29yZF9yZWdpb25zKCksIHJhdGhlciB0aGFuIGlnbm9yaW5nIGVycm9ycyBhbmQgdW5jb25kaXRpb25hbGx5IHJldHVybmluZyAwLiBBZGRpdGlvbmFsbHksIGV4dDRfZmNfcmVwbGF5X2lub2RlKCkgbm93IGNoZWNrcyB0aGUgcmV0dXJuIHZhbHVlIG9mIGV4dDRfZXh0X2NsZWFyX2JiKCkgYW5kIGFib3J0cyBvbiBlcnJvci5cblxuVGhlcmUgYXJlIG5vIHVuaW5pdGlhbGl6ZWQgdmFyaWFibGVzIG9yIHN0cnVjdCBmaWVsZHMgaW50cm9kdWNlZCBvciBtb2RpZmllZCwgbm8gY29waWVzIHRvIHVzZXIgc3BhY2Ugb3IgcG90ZW50aWFsIGluZm8tbGVha3MsIGFuZCBubyBicmFuY2hpbmcgb24gdW5pbml0aWFsaXplZCBtZW1vcnkuIEFsbCB2YXJpYWJsZXMgaW52b2x2ZWQgKGUuZy4gcmV0LCBwYXRoKSBhcmUgcHJvcGVybHkgaW5pdGlhbGl6ZWQgYmVmb3JlIHVzZS4gQ29uc2VxdWVudGx5LCB0aGlzIGNoYW5nZSBkb2VzIG5vdCBleHBvc2UgYW55IHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJpc2tzIGRldGVjdGFibGUgYnkgS01TQU4uIFN0YW5kYXJkIEtBU0FOIGZ1enppbmcgYW5kIHRlc3Qgc3VpdGVzIGFyZSBmdWxseSBhZGVxdWF0ZS4mIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UsCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggbW9kaWZpZXMgZXJyb3IgaGFuZGxpbmcgYW5kIGNvbnRyb2wgZmxvdyBpbiBleHQ0IGZhc3QgY29tbWl0IHJlcGxheSBsb2dpYy4gSW4gZXh0NF9leHRfY2xlYXJfYmIoKSwgZXJyb3JzIGZyb20gZXh0NF9tYXBfYmxvY2tzKCksIGV4dDRfZmluZF9leHRlbnQoKSwgYW5kIGV4dDRfZmNfcmVjb3JkX3JlZ2lvbnMoKSBhcmUgbm93IHByb3Blcmx5IGNhcHR1cmVkIGFuZCByZXR1cm5lZCBpbnN0ZWFkIG9mIGJlaW5nIGlnbm9yZWQuIEFkZGl0aW9uYWxseSwgZXh0NF9mY19yZXBsYXlfaW5vZGUoKSBub3cgY2hlY2tzIHRoZSByZXR1cm4gdmFsdWUgb2YgZXh0NF9leHRfY2xlYXJfYmIoKSBhbmQgYWJvcnRzIHJlcGxheSBvbiBlcnJvci4gVGhpcyByZWFjaGFibGUgZmlsZXN5c3RlbSByZWNvdmVyeSBwYXRoIHNob3VsZCBiZSBmdXp6ZWQgdG8gdmVyaWZ5IHRoYXQgZXJyb3IgY29uZGl0aW9ucyBhbmQgcGF0aCBjbGVhbnVwIGJlaGF2ZSBjb3JyZWN0bHkgd2l0aG91dCBsZWFrcyBvciB1bmV4cGVjdGVkIHBhbmljcy4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xLzE8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xNCAxNDozNjwvdGQ+CgkJCTx0ZD5hY3Rpb248L3RkPgoJCQk8dGQ+cmVhZC1wYXRjaC1kaWZmPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7UGF0Y2hEaWZmJiMzNDs6ICYjMzQ7Y29tbWl0IDMxM2Y1NTIzZjM3MGRkYzk2NGE0NTA1M2YwMDYwYzRmNGY4ZmNmMjhcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgTW9uIFNlcCAxNCAxNDozNjowNCAyMDI2ICYjNDM7MDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS9mcy9leHQ0L2V4dGVudHMuYyBiL2ZzL2V4dDQvZXh0ZW50cy5jXG5pbmRleCA3NjAzOGI2YzM2NTUyLi5mNjVkMjU0YzBkNWVlIDEwMDY0NFxuLS0tIGEvZnMvZXh0NC9leHRlbnRzLmNcbiYjNDM7JiM0MzsmIzQzOyBiL2ZzL2V4dDQvZXh0ZW50cy5jXG5AQCAtNjM2MywyOSAmIzQzOzYzNjMsMzQgQEAgaW50IGV4dDRfZXh0X2NsZWFyX2JiKHN0cnVjdCBpbm9kZSAqaW5vZGUpXG4gXHRcdG1hcC5tX2xlbiA9IGVuZCAtIGN1cjtcbiBcdFx0cmV0ID0gZXh0NF9tYXBfYmxvY2tzKE5VTEwsIGlub2RlLCBcdTAwMjZtYXAsIDApO1xuIFx0XHRpZiAocmV0IFx1MDAzYyAwKVxuLVx0XHRcdGJyZWFrO1xuJiM0MztcdFx0XHRnb3RvIG91dDtcbiBcdFx0aWYgKHJldCBcdTAwM2UgMCkge1xuIFx0XHRcdHBhdGggPSBleHQ0X2ZpbmRfZXh0ZW50KGlub2RlLCBtYXAubV9sYmxrLCBwYXRoLCAwKTtcbi1cdFx0XHRpZiAoIUlTX0VSUihwYXRoKSkge1xuLVx0XHRcdFx0Zm9yIChqID0gMDsgaiBcdTAwM2MgcGF0aC1cdTAwM2VwX2RlcHRoOyBqJiM0MzsmIzQzOykge1xuLVx0XHRcdFx0XHRleHQ0X21iX21hcmtfYmIoaW5vZGUtXHUwMDNlaV9zYixcbi1cdFx0XHRcdFx0XHRcdHBhdGhbal0ucF9ibG9jaywgMSwgZmFsc2UpO1xuLVx0XHRcdFx0XHRleHQ0X2ZjX3JlY29yZF9yZWdpb25zKGlub2RlLVx1MDAzZWlfc2IsIGlub2RlLVx1MDAzZWlfaW5vLFxuLVx0XHRcdFx0XHRcdFx0MCwgcGF0aFtqXS5wX2Jsb2NrLCAxLCAxKTtcbi1cdFx0XHRcdH1cbi1cdFx0XHR9IGVsc2Uge1xuLVx0XHRcdFx0cGF0aCA9IE5VTEw7XG4mIzQzO1x0XHRcdGlmIChJU19FUlIocGF0aCkpIHtcbiYjNDM7XHRcdFx0XHRyZXQgPSBQVFJfRVJSKHBhdGgpO1xuJiM0MztcdFx0XHRcdGdvdG8gb3V0O1xuJiM0MztcdFx0XHR9XG4mIzQzO1x0XHRcdGZvciAoaiA9IDA7IGogXHUwMDNjIHBhdGgtXHUwMDNlcF9kZXB0aDsgaiYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdFx0XHRleHQ0X21iX21hcmtfYmIoaW5vZGUtXHUwMDNlaV9zYixcbiYjNDM7XHRcdFx0XHRcdFx0cGF0aFtqXS5wX2Jsb2NrLCAxLCBmYWxzZSk7XG4mIzQzO1x0XHRcdFx0cmV0ID0gZXh0NF9mY19yZWNvcmRfcmVnaW9ucyhpbm9kZS1cdTAwM2VpX3NiLFxuJiM0MztcdFx0XHRcdFx0XHRcdCAgICAgaW5vZGUtXHUwMDNlaV9pbm8sIDAsXG4mIzQzO1x0XHRcdFx0XHRcdFx0ICAgICBwYXRoW2pdLnBfYmxvY2ssIDEsIDEpO1xuJiM0MztcdFx0XHRcdGlmIChyZXQpXG4mIzQzO1x0XHRcdFx0XHRnb3RvIG91dDtcbiBcdFx0XHR9XG4gXHRcdFx0ZXh0NF9tYl9tYXJrX2JiKGlub2RlLVx1MDAzZWlfc2IsIG1hcC5tX3BibGssIG1hcC5tX2xlbiwgZmFsc2UpO1xuLVx0XHRcdGV4dDRfZmNfcmVjb3JkX3JlZ2lvbnMoaW5vZGUtXHUwMDNlaV9zYiwgaW5vZGUtXHUwMDNlaV9pbm8sXG4tXHRcdFx0XHRcdG1hcC5tX2xibGssIG1hcC5tX3BibGssIG1hcC5tX2xlbiwgMSk7XG4mIzQzO1x0XHRcdHJldCA9IGV4dDRfZmNfcmVjb3JkX3JlZ2lvbnMoaW5vZGUtXHUwMDNlaV9zYiwgaW5vZGUtXHUwMDNlaV9pbm8sXG4mIzQzO1x0XHRcdFx0XHRcdCAgICAgbWFwLm1fbGJsaywgbWFwLm1fcGJsaywgbWFwLm1fbGVuLCAxKTtcbiYjNDM7XHRcdFx0aWYgKHJldClcbiYjNDM7XHRcdFx0XHRnb3RvIG91dDtcbiBcdFx0fVxuIFx0XHRjdXIgPSBjdXIgJiM0MzsgbWFwLm1fbGVuO1xuIFx0fVxuIFxuIG91dDpcbiBcdGV4dDRfZnJlZV9leHRfcGF0aChwYXRoKTtcbi1cdHJldHVybiAwO1xuJiM0MztcdHJldHVybiByZXQgXHUwMDNjIDAgPyByZXQgOiAwO1xuIH1cbiBcbiAjaWYgSVNfRU5BQkxFRChDT05GSUdfRVhUNF9LVU5JVF9URVNUUylcbmRpZmYgLS1naXQgYS9mcy9leHQ0L2Zhc3RfY29tbWl0LmMgYi9mcy9leHQ0L2Zhc3RfY29tbWl0LmNcbmluZGV4IDBjYWM4OTBjZjM3MDIuLmFiNzI2M2I0ZjllNDYgMTAwNjQ0XG4tLS0gYS9mcy9leHQ0L2Zhc3RfY29tbWl0LmNcbiYjNDM7JiM0MzsmIzQzOyBiL2ZzL2V4dDQvZmFzdF9jb21taXQuY1xuQEAgLTE5NDEsOCAmIzQzOzE5NDEsMTEgQEAgc3RhdGljIGludCBleHQ0X2ZjX3JlcGxheV9pbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLFxuIFxuIFx0aW5vZGUgPSBleHQ0X2lnZXQoc2IsIGlubywgRVhUNF9JR0VUX05PUk1BTCk7XG4gXHRpZiAoIUlTX0VSUihpbm9kZSkpIHtcbi1cdFx0ZXh0NF9leHRfY2xlYXJfYmIoaW5vZGUpO1xuJiM0MztcdFx0cmV0ID0gZXh0NF9leHRfY2xlYXJfYmIoaW5vZGUpO1xuIFx0XHRpcHV0KGlub2RlKTtcbiYjNDM7XHRcdGlub2RlID0gTlVMTDtcbiYjNDM7XHRcdGlmIChyZXQpXG4mIzQzO1x0XHRcdGdvdG8gb3V0O1xuIFx0fVxuIFx0aW5vZGUgPSBOVUxMO1xuIFxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE0IDE0OjM2PC90ZD4KCQkJPHRkPmFnZW50PC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjVtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmNvcmU8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0VYVDRfRlMmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDtleHQ0X2V4dF9jbGVhcl9iYiYjMzQ7LAogICAgJiMzNDtleHQ0X2ZjX3JlcGxheV9pbm9kZSYjMzQ7LAogICAgJiMzNDtleHQ0X2ZjX3JlcGxheSYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBtb2RpZmllcyBlcnJvciBoYW5kbGluZyBhbmQgY29udHJvbCBmbG93IGluIGV4dDQgZmFzdCBjb21taXQgcmVwbGF5IGxvZ2ljLiBJbiBleHQ0X2V4dF9jbGVhcl9iYigpLCBlcnJvcnMgZnJvbSBleHQ0X21hcF9ibG9ja3MoKSwgZXh0NF9maW5kX2V4dGVudCgpLCBhbmQgZXh0NF9mY19yZWNvcmRfcmVnaW9ucygpIGFyZSBub3cgcHJvcGVybHkgY2FwdHVyZWQgYW5kIHJldHVybmVkIGluc3RlYWQgb2YgYmVpbmcgaWdub3JlZC4gQWRkaXRpb25hbGx5LCBleHQ0X2ZjX3JlcGxheV9pbm9kZSgpIG5vdyBjaGVja3MgdGhlIHJldHVybiB2YWx1ZSBvZiBleHQ0X2V4dF9jbGVhcl9iYigpIGFuZCBhYm9ydHMgcmVwbGF5IG9uIGVycm9yLiBUaGlzIHJlYWNoYWJsZSBmaWxlc3lzdGVtIHJlY292ZXJ5IHBhdGggc2hvdWxkIGJlIGZ1enplZCB0byB2ZXJpZnkgdGhhdCBlcnJvciBjb25kaXRpb25zIGFuZCBwYXRoIGNsZWFudXAgYmVoYXZlIGNvcnJlY3RseSB3aXRob3V0IGxlYWtzIG9yIHVuZXhwZWN0ZWQgcGFuaWNzLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+SW5zdHJ1Y3Rpb246PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Zb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgbWFpbnRhaW5lciBhbmQgc2VjdXJpdHkgZW5naW5lZXIuCllvdXIgam9iIGlzIHRvIHJldmlldyBhIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQgZXZhbHVhdGUgd2hldGhlciBpdCB3YXJyYW50cyBmdXp6aW5nIHdpdGggc3l6a2FsbGVyLgoKSU1QT1JUQU5UOiBUaGUgY2hhbmdlcyBoYXZlIEFMUkVBRFkgYmVlbiBhcHBsaWVkIGFuZCBjb21taXR0ZWQgYXMgdGhlIEhFQUQgY29tbWl0IGluCnlvdXIgd29ya3NwYWNlLiBEbyBOT1QgcmVseSBvbiBpbnRlcm5hbCBhc3N1bXB0aW9ucy4gWW91IG11c3QgYWN0aXZlbHkgdXNlIHlvdXIgY29kZSBhY2Nlc3MKdG9vbHMgdG8gaW5zcGVjdCB0aGUgYWN0dWFsIHNvdXJjZSBjb2RlLCBjYWxsZXJzLCBhbmQgc3Vycm91bmRpbmcgY29udGV4dC4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjEuIENPUkUgVFJJQUdFIFBISUxPU09QSFkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KVGhlIGdvYWwgb2YgcGF0Y2ggZnV6emluZyBpcyB0byBkaXNjb3ZlciBjcmFzaGVzLCByZWdyZXNzaW9ucywgZXhwb3NlZCBsYXRlbnQgYnVncywKYW5kIG5ld2x5IHRyaWdnZXJlZCBhc3NlcnRpb25zIGludHJvZHVjZWQgYnkgdGhlIHBhdGNoIHNlcmllcy4KCi0gUkVBQ0hBQklMSVRZIElTIFRIRSBQUklNQVJZIEdBVEU6CiAgRnV6emluZyBjYW4gb25seSBkaXNjb3ZlciBidWdzIGluIGNvZGUgdGhhdCBjYW4gYWN0dWFsbHkgZXhlY3V0ZSBpbiBzdGFuZGFyZCB2aXJ0dWFsaXplZAogIGVudmlyb25tZW50cyAoR0NFIG9yIFFFTVUsIHV0aWxpemluZyBzb2Z0d2FyZS1lbXVsYXRlZCBkZXZpY2VzIGxpa2UgVVNCIGdhZGdldHMsIG5ldGRldiwgdHVuL3RhcCkuCiAgSWYgdGhlIG1vZGlmaWVkIGNvZGUgaXMgc3RydWN0dXJhbGx5IHVucmVhY2hhYmxlIChzZWUgU2VjdGlvbiAyKSwgaXQgTVVTVCBOT1QgYmUgZnV6emVkLAogIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBpdCBhZGRzIGFzc2VydGlvbnMgb3IgY29tcGxleCBsb2dpYy4KCi0gRE8gTk9UIEJMSU5ETFkgVFJVU1QgJiMzNDtOTyBGVU5DVElPTkFMIENIQU5HRSYjMzQ7IChORkNJKSBPUiAmIzM0O1JFRkFDVE9SSU5HJiMzNDsgQ0xBSU1TOgogIFBhdGNoIGF1dGhvcnMgcm91dGluZWx5IGxhYmVsIGNoYW5nZXMgYXMgJiMzNDtjbGVhbnVwcyYjMzQ7LCAmIzM0O3JlZmFjdG9yaW5ncyYjMzQ7LCBvciBzdGF0ZQogICYjMzQ7Tm8gZnVuY3Rpb25hbCBjaGFuZ2UgaW50ZW5kZWQmIzM0Oy4gRG8gTk9UIHRha2UgdGhlc2UgY2xhaW1zIGF0IGZhY2UgdmFsdWUuCiAgQ29kZSByZWZhY3RvcmluZ3MgdGhhdCByZWFycmFuZ2UgbG9naWMsIGludHJvZHVjZSBoZWxwZXIgZnVuY3Rpb25zLCBvciBhbHRlciBzdGF0ZSBtYW5hZ2VtZW50CiAgaW4gY29yZSBzdWJzeXN0ZW1zIGZyZXF1ZW50bHkgaW50cm9kdWNlIHN1YnRsZSBzZW1hbnRpYyBzaGlmdHMgb3IgdW5jb3ZlciBsYXRlbnQga2VybmVsIGJ1Z3MuCiAgSWYgcmVhY2hhYmxlIGV4ZWN1dGFibGUgY29kZSBpcyBtb2RpZmllZCBvciByZWZhY3RvcmVkLCBpdCBNVVNUIGJlIGZ1enplZC4KCi0gTkVXIE9SIE1PRElGSUVEIEFTU0VSVElPTlMgSU4gUkVBQ0hBQkxFIENPREUgTVVTVCBCRSBGVVpaRUQ6CiAgV2hlbiBhIHBhdGNoIGludHJvZHVjZXMgb3IgbW9kaWZpZXMgcnVudGltZSBjaGVja3Mgb3IgYXNzZXJ0aW9ucyAoZS5nLiwgV0FSTl9PTiosIFZNX1dBUk5fT04qLAogIEJVR19PTiosIGxvY2tkZXBfYXNzZXJ0KikgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMsIGl0IGVuZm9yY2VzIG5ldyBvciBzdHJpY3RlciBpbnZhcmlhbnRzLgogIEV2ZW4gaWYgdGhlIGF1dGhvciBiZWxpZXZlcyB0aGUgaW52YXJpYW50IGFsd2F5cyBob2xkcywgZnV6emluZyBpcyBlc3NlbnRpYWwgdG8gdmVyaWZ5IHdoZXRoZXIKICBhbiB1bnVzdWFsIHNlcXVlbmNlIG9mIG9wZXJhdGlvbnMgY2FuIHZpb2xhdGUgaXQuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoyLiBXSEVOIFRPIFJFVFVSTiBXb3J0aEZ1enppbmc9ZmFsc2UgKE5FR0FUSVZFIENSSVRFUklBKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpSZXR1cm4gV29ydGhGdXp6aW5nPWZhbHNlIE9OTFkgSUYgYWxsIG1vZGlmaWVkIGNvZGUgZmFsbHMgc3RyaWN0bHkgaW50byBvbmUgb3IgbW9yZSBvZiB0aGVzZSBjYXRlZ29yaWVzOgoKLSBOb24ta2VybmVsIGFuZCBub24tZXhlY3V0YWJsZSBjaGFuZ2VzOgogICogTW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLywgY29tbWVudHMsIG9yIHNwZWxsaW5nIGZpeGVzLgogICogVXNlci1zcGFjZSBkaXJlY3Rvcmllcywgc2VsZi10ZXN0cywgc2FtcGxlcywgb3Igc2NyaXB0cyAoZS5nLiwgdG9vbHMvLCBzYW1wbGVzLywgc2NyaXB0cy8sIHVzci8pCiAgICB0aGF0IGRvIG5vdCBhZmZlY3QgdGhlIGNvbXBpbGVkIGtlcm5lbCBpbWFnZSAodm1saW51eCkgb3Iga2VybmVsIG1vZHVsZXMuCiAgKiBQdXJlbHkgZGVjb3JhdGl2ZSBsb2dnaW5nIChlLmcuLCBtZXNzYWdlIHN0cmluZ3MgaW4gcHJfZXJyLCBwcmludGssIGRldl9pbmZvKSBvciB0cmFjZXBvaW50cwogICAgdGhhdCBkbyBub3QgYWx0ZXIgY29udHJvbCBmbG93IG9yIGRhdGEgc3RydWN0dXJlcy4KICAqIEJ1aWxkIHN5c3RlbSBvciBLY29uZmlnIGNoYW5nZXMgdGhhdCBkbyBub3QgYWx0ZXIgY29tcGlsZWQgQyBsb2dpYy4KLSBTdHJ1Y3R1cmFsbHkgdW5yZWFjaGFibGUgaGFyZHdhcmU6CiAgKiBWZW5kb3Itc3BlY2lmaWMgUENJZSBzd2l0Y2hlcywgU21hcnROSUNzLCBvciBHUFUgZHJpdmVycyAoZS5nLiwgbWx4c3csIHBkc19jb3JlLCBxZWQsCiAgICBpb25pYywgYW1kZ3B1KSByZXF1aXJpbmcgcGh5c2ljYWwgQVNJQy9QQ0llIGNhcmRzIG5vdCBlbXVsYXRlZCBpbiBzdGFuZGFyZCBRRU1VLgotIFVucmVhY2hhYmxlIGV4ZWN1dGlvbiBwYXRoczoKICAqIERyaXZlciB0ZWFyZG93biBjYWxsYmFja3MgKC5yZW1vdmUsIC5zaHV0ZG93biwgcGNpX3VucmVnaXN0ZXJfZHJpdmVyKSBleGVjdXRlZCBvbmx5IGR1cmluZwogICAgcGh5c2ljYWwgUENJIGhvdC11bnBsdWcgb3IgbWFudWFsIHN5c2ZzIGRyaXZlciB1bmJpbmRpbmcuCiAgKiBDb2RlIHBhdGhzIGV4Y2x1c2l2ZSB0byBhcmNoaXRlY3R1cmVzIG90aGVyIHRoYW4gdGhlIHRhcmdldCBhcmNoaXRlY3R1cmUuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQozLiBXSEVOIFRPIFJFVFVSTiBXb3J0aEZ1enppbmc9dHJ1ZSAoUE9TSVRJVkUgQ1JJVEVSSUEpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ClJldHVybiBXb3J0aEZ1enppbmc9dHJ1ZSB3aGVuZXZlciB0aGUgcGF0Y2ggdG91Y2hlcyByZWFjaGFibGUgZXhlY3V0YWJsZSBjb2RlLCBpbmNsdWRpbmc6Ci0gQ29yZSBTdWJzeXN0ZW1zOgogICogQW55IGxvZ2ljIG1vZGlmaWNhdGlvbnMgaW4gbWVtb3J5IG1hbmFnZW1lbnQgKG1tLyksIHN5bmNocm9uaXphdGlvbi9sb2NraW5nIChrZXJuZWwvbG9ja2luZy8pLAogICAgQlBGLCBzY2hlZHVsZXIsIGNvcmUgbmV0d29ya2luZywgVkZTLCBvciBzeXNjYWxsIGhhbmRsaW5nLgotIFJlZmFjdG9yaW5ncyBhbmQgQ29kZSBDbGVhbnVwczoKICAqIEFueSByZXN0cnVjdHVyaW5nIG9mIHJlYWNoYWJsZSBkYXRhIHN0cnVjdHVyZXMsIGhlbHBlciBhYnN0cmFjdGlvbnMsIG9yIGFsZ29yaXRobSBmbG93cy4KLSBSdW50aW1lIEFzc2VydGlvbnMgYW5kIERlZmVuc2l2ZSBDaGVja3M6CiAgKiBBbnkgaW50cm9kdWN0aW9uIG9yIGFsdGVyYXRpb24gb2YgYXNzZXJ0aW9ucyAoV0FSTl9PTiosIFZNX1dBUk5fT04qLCBCVUdfT04qLCBldGMuKSBpbiByZWFjaGFibGUgcGF0aHMuCi0gUmVhY2hhYmxlIERyaXZlcnMgYW5kIFByb3RvY29sczoKICAqIERyaXZlcnMgYWNjZXNzaWJsZSB2aWEgdmlydHVhbCBidXNlcyAodmlydGlvLCBVU0IgZ2FkZ2V0LCBsb29wYmFjaywgbmV0bGluaywgYmluZGVyLCBzb2NrZXRzLCBldGMuKS4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjQuIEVYVFJBQ1RJTkcgRm9jdXNTeW1ib2xzIChQUkVWRU5USU5HIERJTFVUSU9OKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpXaGVuIFdvcnRoRnV6emluZz10cnVlLCB5b3UgbXVzdCBleHRyYWN0IHNwZWNpZmljIGtlcm5lbCBmdW5jdGlvbnMgaW50byBGb2N1c1N5bWJvbHMgdG8gZ3VpZGUgdGhlIGZ1enplcjoKCi0gQVZPSUQgVUJJUVVJVE9VUyBMSUZFQ1lDTEUgSE9ULVBBVEhTOgogIERvIE5PVCBsaXN0IGdlbmVyaWMsIHViaXF1aXRvdXMgZnVuY3Rpb25zIGNhbGxlZCBieSBhbG1vc3QgZXZlcnkgcHJvZ3JhbSBpbiB0aGUgY29ycHVzCiAgKGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvOiBnZW5lcmFsIG1lbW9yeSBhbGxvY2F0b3JzIGFuZCBkZWFsbG9jYXRvcnMsIHBhZ2UgZmF1bHQKICBhbmQgdHJhcCBoYW5kbGVycywgb3IgY29yZSBzeW5jaHJvbml6YXRpb24gcHJpbWl0aXZlczsgdGhpcyBpcyBub3QgYW4gZXhoYXVzdGl2ZSBsaXN0KS4KICBMaXN0aW5nIHViaXF1aXRvdXMgZnVuY3Rpb25zIGNhdXNlcyB0aGUgZnV6emVyIHRvIGNsYXNzaWZ5IHRob3VzYW5kcyBvZiB1bnJlbGF0ZWQgdGVzdHMgYXMgJiMzNDtmb2N1c2VkJiMzNDssCiAgd2hpY2ggc2V2ZXJlbHkgZGlsdXRlcyBmdXp6aW5nIGVmZm9ydCBhd2F5IGZyb20gdGhlIGFjdHVhbCBjaGFuZ2VzLgoKLSBUQVJHRVQgU1BFQ0lGSUMgRkVBVFVSRSBMT0dJQyBBTkQgRU5UUllQT0lOVFM6CiAgTGlzdCBmdW5jdGlvbnMgdGhhdCBzcGVjaWZpY2FsbHkgaW1wbGVtZW50IHRoZSBsb2dpYyBiZWluZyBhZGRlZCBvciBhbHRlcmVkLCBvciBkaXJlY3QgQVBJIGVudHJ5cG9pbnRzCiAgZm9yIHRoZSBzdWJzeXN0ZW0gZmVhdHVyZSB1bmRlciByZXZpZXcuCgotIEhBTkRMSU5HIFNUQVRJQyBJTkxJTkUgRlVOQ1RJT05TIElOIEhFQURFUlMgKC5oKToKICBDb21waWxlci1pbmxpbmVkIHN0YXRpYyBmdW5jdGlvbnMgKHN1Y2ggYXMgc3RhdGljIGlubGluZXMgaW4gbW0vKi5oIG9yIGluY2x1ZGUvbGludXgvKi5oKSBsYWNrCiAgZGlzdGluY3Qgc3ltYm9sIGFkZHJlc3NlcyBpbiB2bWxpbnV4IGFuZCBjYW5ub3QgYmUgdGFyZ2V0ZWQgZGlyZWN0bHkgYnkgc3ltYm9sIGNvdmVyYWdlIGZpbHRlcnMuCiAgSWYgdGhlIGNoYW5nZXMgYXJlIHByaW1hcmlseSBpbiBzdGF0aWMgaW5saW5lIGhlbHBlcnMsIGlkZW50aWZ5IG5vbi1zdGF0aWMsIGZlYXR1cmUtc3BlY2lmaWMgY2FsbGVyCiAgZnVuY3Rpb25zIGluIC5jIGZpbGVzIHRoYXQgZXhlcmNpc2UgdGhlbSAoYXZvaWRpbmcgdWJpcXVpdG91cyBsaWZlY3ljbGUgd3JhcHBlcnMpLgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KNS4gSURFTlRJRllJTkcgRW5hYmxlQ29uZmlncwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpJZGVudGlmeSBhbnkgc3BlY2lmaWMgQ09ORklHXyBvcHRpb25zIHJlcXVpcmVkIHRvIHByb3Blcmx5IGNvbXBpbGUgYW5kIHJlYWNoIHRoZSBtb2RpZmllZCBjb2RlOgotIEluc3BlY3QgS2NvbmZpZyBmaWxlcyBhbmQgI2lmZGVmIGd1YXJkczsgZG8gbm90IG1ha2UgYXNzdW1wdGlvbnMuCi0gQ2hlY2sgJiMzNDtkZXBlbmRzIG9uJiMzNDsgbGluZXMgaW4gS2NvbmZpZyB0byBpbmNsdWRlIGFueSBub24tc3RhbmRhcmQgcGFyZW50IHN1YnN5c3RlbSBjb25maWdzIG5lZWRlZC4KLSBTdHJpcCBhbnkgJiMzOTtDT05GSUdfJiMzOTsgcHJlZml4IChlLmcuLCByZXR1cm4gJiMzNDtORVRfSVBWNCYjMzQ7IGluc3RlYWQgb2YgJiMzNDtDT05GSUdfTkVUX0lQVjQmIzM0OykuClByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLgoKClVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuCkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LgpJZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UHJvbXB0OjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+VGFyZ2V0IGFyY2hpdGVjdHVyZTogYW1kNjQKCkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOgpjb21taXQgMzEzZjU1MjNmMzcwZGRjOTY0YTQ1MDUzZjAwNjBjNGY0ZjhmY2YyOApBdXRob3I6IHN5ei1jbHVzdGVyICZsdDt0cmlhZ2VAc3l6a2FsbGVyLmNvbSZndDsKRGF0ZTogICBNb24gU2VwIDE0IDE0OjM2OjA0IDIwMjYgJiM0MzswMDAwCgogICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3CgpkaWZmIC0tZ2l0IGEvZnMvZXh0NC9leHRlbnRzLmMgYi9mcy9leHQ0L2V4dGVudHMuYwppbmRleCA3NjAzOGI2YzM2NTUyLi5mNjVkMjU0YzBkNWVlIDEwMDY0NAotLS0gYS9mcy9leHQ0L2V4dGVudHMuYwomIzQzOyYjNDM7JiM0MzsgYi9mcy9leHQ0L2V4dGVudHMuYwpAQCAtNjM2MywyOSAmIzQzOzYzNjMsMzQgQEAgaW50IGV4dDRfZXh0X2NsZWFyX2JiKHN0cnVjdCBpbm9kZSAqaW5vZGUpCiAJCW1hcC5tX2xlbiA9IGVuZCAtIGN1cjsKIAkJcmV0ID0gZXh0NF9tYXBfYmxvY2tzKE5VTEwsIGlub2RlLCAmYW1wO21hcCwgMCk7CiAJCWlmIChyZXQgJmx0OyAwKQotCQkJYnJlYWs7CiYjNDM7CQkJZ290byBvdXQ7CiAJCWlmIChyZXQgJmd0OyAwKSB7CiAJCQlwYXRoID0gZXh0NF9maW5kX2V4dGVudChpbm9kZSwgbWFwLm1fbGJsaywgcGF0aCwgMCk7Ci0JCQlpZiAoIUlTX0VSUihwYXRoKSkgewotCQkJCWZvciAoaiA9IDA7IGogJmx0OyBwYXRoLSZndDtwX2RlcHRoOyBqJiM0MzsmIzQzOykgewotCQkJCQlleHQ0X21iX21hcmtfYmIoaW5vZGUtJmd0O2lfc2IsCi0JCQkJCQkJcGF0aFtqXS5wX2Jsb2NrLCAxLCBmYWxzZSk7Ci0JCQkJCWV4dDRfZmNfcmVjb3JkX3JlZ2lvbnMoaW5vZGUtJmd0O2lfc2IsIGlub2RlLSZndDtpX2lubywKLQkJCQkJCQkwLCBwYXRoW2pdLnBfYmxvY2ssIDEsIDEpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJcGF0aCA9IE5VTEw7CiYjNDM7CQkJaWYgKElTX0VSUihwYXRoKSkgewomIzQzOwkJCQlyZXQgPSBQVFJfRVJSKHBhdGgpOwomIzQzOwkJCQlnb3RvIG91dDsKJiM0MzsJCQl9CiYjNDM7CQkJZm9yIChqID0gMDsgaiAmbHQ7IHBhdGgtJmd0O3BfZGVwdGg7IGomIzQzOyYjNDM7KSB7CiYjNDM7CQkJCWV4dDRfbWJfbWFya19iYihpbm9kZS0mZ3Q7aV9zYiwKJiM0MzsJCQkJCQlwYXRoW2pdLnBfYmxvY2ssIDEsIGZhbHNlKTsKJiM0MzsJCQkJcmV0ID0gZXh0NF9mY19yZWNvcmRfcmVnaW9ucyhpbm9kZS0mZ3Q7aV9zYiwKJiM0MzsJCQkJCQkJICAgICBpbm9kZS0mZ3Q7aV9pbm8sIDAsCiYjNDM7CQkJCQkJCSAgICAgcGF0aFtqXS5wX2Jsb2NrLCAxLCAxKTsKJiM0MzsJCQkJaWYgKHJldCkKJiM0MzsJCQkJCWdvdG8gb3V0OwogCQkJfQogCQkJZXh0NF9tYl9tYXJrX2JiKGlub2RlLSZndDtpX3NiLCBtYXAubV9wYmxrLCBtYXAubV9sZW4sIGZhbHNlKTsKLQkJCWV4dDRfZmNfcmVjb3JkX3JlZ2lvbnMoaW5vZGUtJmd0O2lfc2IsIGlub2RlLSZndDtpX2lubywKLQkJCQkJbWFwLm1fbGJsaywgbWFwLm1fcGJsaywgbWFwLm1fbGVuLCAxKTsKJiM0MzsJCQlyZXQgPSBleHQ0X2ZjX3JlY29yZF9yZWdpb25zKGlub2RlLSZndDtpX3NiLCBpbm9kZS0mZ3Q7aV9pbm8sCiYjNDM7CQkJCQkJICAgICBtYXAubV9sYmxrLCBtYXAubV9wYmxrLCBtYXAubV9sZW4sIDEpOwomIzQzOwkJCWlmIChyZXQpCiYjNDM7CQkJCWdvdG8gb3V0OwogCQl9CiAJCWN1ciA9IGN1ciAmIzQzOyBtYXAubV9sZW47CiAJfQogCiBvdXQ6CiAJZXh0NF9mcmVlX2V4dF9wYXRoKHBhdGgpOwotCXJldHVybiAwOwomIzQzOwlyZXR1cm4gcmV0ICZsdDsgMCA/IHJldCA6IDA7CiB9CiAKICNpZiBJU19FTkFCTEVEKENPTkZJR19FWFQ0X0tVTklUX1RFU1RTKQpkaWZmIC0tZ2l0IGEvZnMvZXh0NC9mYXN0X2NvbW1pdC5jIGIvZnMvZXh0NC9mYXN0X2NvbW1pdC5jCmluZGV4IDBjYWM4OTBjZjM3MDIuLmFiNzI2M2I0ZjllNDYgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDQvZmFzdF9jb21taXQuYwomIzQzOyYjNDM7JiM0MzsgYi9mcy9leHQ0L2Zhc3RfY29tbWl0LmMKQEAgLTE5NDEsOCAmIzQzOzE5NDEsMTEgQEAgc3RhdGljIGludCBleHQ0X2ZjX3JlcGxheV9pbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAogCiAJaW5vZGUgPSBleHQ0X2lnZXQoc2IsIGlubywgRVhUNF9JR0VUX05PUk1BTCk7CiAJaWYgKCFJU19FUlIoaW5vZGUpKSB7Ci0JCWV4dDRfZXh0X2NsZWFyX2JiKGlub2RlKTsKJiM0MzsJCXJldCA9IGV4dDRfZXh0X2NsZWFyX2JiKGlub2RlKTsKIAkJaXB1dChpbm9kZSk7CiYjNDM7CQlpbm9kZSA9IE5VTEw7CiYjNDM7CQlpZiAocmV0KQomIzQzOwkJCWdvdG8gb3V0OwogCX0KIAlpbm9kZSA9IE5VTEw7CiAKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+My8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTQgMTQ6MzY8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjgtZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMzYyNgoJCQkJCQkJb3V0cHV0OiA3NwoJCQkJCQkJdGhvdWdodHM6IDEzMAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgdGhlIEV4dDQgUGF0Y2gqKgoKT2theSwgbGV0JiMzOTtzIGRpdmUgaW50byB0aGlzLiBNeSBmaXJzdCBzdGVwIGlzIGFsd2F5cyB0byBnZXQgYSBoYW5kbGUgb24gdGhlIGNoYW5nZXMgdGhlbXNlbHZlcyBhbmQgdGhlIGNvbnRleHQgdGhleSB0b3VjaC4gVGhpcyBwYXRjaCBsb29rcyB0byBiZSBtb2RpZnlpbmcgdGhlIGV4dDQgZmlsZXN5c3RlbSwgc3BlY2lmaWNhbGx5IGluIHRoZSBhcmVhcyBvZiBleHRlbnRzIGFuZCBmYXN0IGNvbW1pdCByZXBsYXkgbG9naWMuIEkgc2VlIG1vZGlmaWNhdGlvbnMgaW4gYGZzL2V4dDQvZXh0ZW50cy5jYCwgc3BlY2lmaWNhbGx5IGFyb3VuZCB0aGUgYGV4dDRfZXh0X2NsZWFyX2JiYCBmdW5jdGlvbiwgYW5kIGBmcy9leHQ0L2Zhc3RfY29tbWl0LmNgLCB3aXRoaW4gYGV4dDRfZmNfcmVwbGF5X2lub2RlYC4gSSBpbW1lZGlhdGVseSByZWNvZ25pemUgdGhlc2UgYXMga2V5IHBhcnRzIG9mIGV4dDQuCgpOb3csIEkmIzM5O20gZ29pbmcgdG8gdGFrZSBhIGNsb3NlciBsb29rLiBJJiMzOTtsbCBwcm9iYWJseSBzdGFydCB3aXRoIGEgcXVpY2sgaW5zcGVjdGlvbiBvZiB0aGUgYGV4dDRfZXh0X2NsZWFyX2JiYCBmdW5jdGlvbiB3aXRoaW4gYGZzL2V4dDQvZXh0ZW50cy5jYC4gSSB3aWxsIGxpa2VseSB1c2UgZ3JlcCBvciBqdXN0IHJlYWQgdGhlIGZpbGUgZGlyZWN0bHksIGFuZCBxdWlja2x5IHNjYW4gZm9yIGFueSByZWxhdGVkIGNvZGUgbmVhcmJ5LiBUaGlzIHdpbGwgaGVscCBtZSB1bmRlcnN0YW5kIHRoZSBwdXJwb3NlIG9mIHRoaXMgcGFydGljdWxhciBjb2RlIHNlY3Rpb24gYW5kIGdldCBhIG1vcmUgc29saWQgdW5kZXJzdGFuZGluZyBvZiB3aGF0IHRoaXMgcGF0Y2ggaXMgYXR0ZW1wdGluZyB0byBhY2hpZXZlLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE0IDE0OjM2PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7ZnMvZXh0NC9leHRlbnRzLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiA2MzUwLAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDU1Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OzYzNTA6XHRcdC8qIERldGVybWluIHRoZSBzaXplIG9mIHRoZSBmaWxlIGZpcnN0ICovXG42MzUxOlx0XHRwYXRoID0gZXh0NF9maW5kX2V4dGVudChpbm9kZSwgRVhUX01BWF9CTE9DS1MgLSAxLCBOVUxMLFxuNjM1MjpcdFx0XHRcdFx0XHRFWFQ0X0VYX05PQ0FDSEUpO1xuNjM1MzpcdFx0aWYgKElTX0VSUihwYXRoKSlcbjYzNTQ6XHRcdFx0cmV0dXJuIFBUUl9FUlIocGF0aCk7XG42MzU1Olx0XHRleCA9IHBhdGhbcGF0aC1cdTAwM2VwX2RlcHRoXS5wX2V4dDtcbjYzNTY6XHRcdGlmICghZXgpXG42MzU3Olx0XHRcdGdvdG8gb3V0O1xuNjM1ODpcdFx0ZW5kID0gbGUzMl90b19jcHUoZXgtXHUwMDNlZWVfYmxvY2spICYjNDM7IGV4dDRfZXh0X2dldF9hY3R1YWxfbGVuKGV4KTtcbjYzNTk6XHRcbjYzNjA6XHRcdGN1ciA9IDA7XG42MzYxOlx0XHR3aGlsZSAoY3VyIFx1MDAzYyBlbmQpIHtcbjYzNjI6XHRcdFx0bWFwLm1fbGJsayA9IGN1cjtcbjYzNjM6XHRcdFx0bWFwLm1fbGVuID0gZW5kIC0gY3VyO1xuNjM2NDpcdFx0XHRyZXQgPSBleHQ0X21hcF9ibG9ja3MoTlVMTCwgaW5vZGUsIFx1MDAyNm1hcCwgMCk7XG42MzY1Olx0XHRcdGlmIChyZXQgXHUwMDNjIDApXG42MzY2Olx0XHRcdFx0Z290byBvdXQ7XG42MzY3Olx0XHRcdGlmIChyZXQgXHUwMDNlIDApIHtcbjYzNjg6XHRcdFx0XHRwYXRoID0gZXh0NF9maW5kX2V4dGVudChpbm9kZSwgbWFwLm1fbGJsaywgcGF0aCwgMCk7XG42MzY5Olx0XHRcdFx0aWYgKElTX0VSUihwYXRoKSkge1xuNjM3MDpcdFx0XHRcdFx0cmV0ID0gUFRSX0VSUihwYXRoKTtcbjYzNzE6XHRcdFx0XHRcdGdvdG8gb3V0O1xuNjM3MjpcdFx0XHRcdH1cbjYzNzM6XHRcdFx0XHRmb3IgKGogPSAwOyBqIFx1MDAzYyBwYXRoLVx1MDAzZXBfZGVwdGg7IGomIzQzOyYjNDM7KSB7XG42Mzc0Olx0XHRcdFx0XHRleHQ0X21iX21hcmtfYmIoaW5vZGUtXHUwMDNlaV9zYixcbjYzNzU6XHRcdFx0XHRcdFx0XHRwYXRoW2pdLnBfYmxvY2ssIDEsIGZhbHNlKTtcbjYzNzY6XHRcdFx0XHRcdHJldCA9IGV4dDRfZmNfcmVjb3JkX3JlZ2lvbnMoaW5vZGUtXHUwMDNlaV9zYixcbjYzNzc6XHRcdFx0XHRcdFx0XHRcdCAgICAgaW5vZGUtXHUwMDNlaV9pbm8sIDAsXG42Mzc4Olx0XHRcdFx0XHRcdFx0XHQgICAgIHBhdGhbal0ucF9ibG9jaywgMSwgMSk7XG42Mzc5Olx0XHRcdFx0XHRpZiAocmV0KVxuNjM4MDpcdFx0XHRcdFx0XHRnb3RvIG91dDtcbjYzODE6XHRcdFx0XHR9XG42MzgyOlx0XHRcdFx0ZXh0NF9tYl9tYXJrX2JiKGlub2RlLVx1MDAzZWlfc2IsIG1hcC5tX3BibGssIG1hcC5tX2xlbiwgZmFsc2UpO1xuNjM4MzpcdFx0XHRcdHJldCA9IGV4dDRfZmNfcmVjb3JkX3JlZ2lvbnMoaW5vZGUtXHUwMDNlaV9zYiwgaW5vZGUtXHUwMDNlaV9pbm8sXG42Mzg0Olx0XHRcdFx0XHRcdFx0ICAgICBtYXAubV9sYmxrLCBtYXAubV9wYmxrLCBtYXAubV9sZW4sIDEpO1xuNjM4NTpcdFx0XHRcdGlmIChyZXQpXG42Mzg2Olx0XHRcdFx0XHRnb3RvIG91dDtcbjYzODc6XHRcdFx0fVxuNjM4ODpcdFx0XHRjdXIgPSBjdXIgJiM0MzsgbWFwLm1fbGVuO1xuNjM4OTpcdFx0fVxuNjM5MDpcdFxuNjM5MTpcdG91dDpcbjYzOTI6XHRcdGV4dDRfZnJlZV9leHRfcGF0aChwYXRoKTtcbjYzOTM6XHRcdHJldHVybiByZXQgXHUwMDNjIDAgPyByZXQgOiAwO1xuNjM5NDpcdH1cbjYzOTU6XHRcbjYzOTY6XHQjaWYgSVNfRU5BQkxFRChDT05GSUdfRVhUNF9LVU5JVF9URVNUUylcbjYzOTc6XHRpbnQgZXh0NF9leHRfc3BhY2Vfcm9vdF9pZHhfdGVzdChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgY2hlY2spXG42Mzk4Olx0e1xuNjM5OTpcdFx0cmV0dXJuIGV4dDRfZXh0X3NwYWNlX3Jvb3RfaWR4KGlub2RlLCBjaGVjayk7XG42NDAwOlx0fVxuNjQwMTpcdEVYUE9SVF9TWU1CT0xfRk9SX0VYVDRfVEVTVChleHQ0X2V4dF9zcGFjZV9yb290X2lkeF90ZXN0KTtcbjY0MDI6XHRcbjY0MDM6XHRzdHJ1Y3QgZXh0NF9leHRfcGF0aCAqZXh0NF9zcGxpdF9jb252ZXJ0X2V4dGVudHNfdGVzdChoYW5kbGVfdCAqaGFuZGxlLFxuNjQwNDpcdFx0XHRcdHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBleHQ0X21hcF9ibG9ja3MgKm1hcCxcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD41LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xNCAxNDozNjwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O2ZzL2V4dDQvZmFzdF9jb21taXQuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDE5MzAsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogNDAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7MTkzMDpcdFx0c3RydWN0IGV4dDRfaW5vZGUgKnJhd19mY19pbm9kZTtcbjE5MzE6XHRcdHN0cnVjdCBpbm9kZSAqaW5vZGUgPSBOVUxMO1xuMTkzMjpcdFx0c3RydWN0IGV4dDRfaWxvYyBpbG9jO1xuMTkzMzpcdFx0aW50IGlub2RlX2xlbiwgaW5vLCByZXQsIHRhZyA9IHRsLVx1MDAzZWZjX3RhZztcbjE5MzQ6XHRcdHN0cnVjdCBleHQ0X2V4dGVudF9oZWFkZXIgKmVoO1xuMTkzNTpcdFx0c2l6ZV90IG9mZl9nZW4gPSBvZmZzZXRvZihzdHJ1Y3QgZXh0NF9pbm9kZSwgaV9nZW5lcmF0aW9uKTtcbjE5MzY6XHRcbjE5Mzc6XHRcdG1lbWNweShcdTAwMjZmY19pbm9kZSwgdmFsLCBzaXplb2YoZmNfaW5vZGUpKTtcbjE5Mzg6XHRcbjE5Mzk6XHRcdGlubyA9IGxlMzJfdG9fY3B1KGZjX2lub2RlLmZjX2lubyk7XG4xOTQwOlx0XHR0cmFjZV9leHQ0X2ZjX3JlcGxheShzYiwgdGFnLCBpbm8sIDAsIDApO1xuMTk0MTpcdFxuMTk0MjpcdFx0aW5vZGUgPSBleHQ0X2lnZXQoc2IsIGlubywgRVhUNF9JR0VUX05PUk1BTCk7XG4xOTQzOlx0XHRpZiAoIUlTX0VSUihpbm9kZSkpIHtcbjE5NDQ6XHRcdFx0cmV0ID0gZXh0NF9leHRfY2xlYXJfYmIoaW5vZGUpO1xuMTk0NTpcdFx0XHRpcHV0KGlub2RlKTtcbjE5NDY6XHRcdFx0aW5vZGUgPSBOVUxMO1xuMTk0NzpcdFx0XHRpZiAocmV0KVxuMTk0ODpcdFx0XHRcdGdvdG8gb3V0O1xuMTk0OTpcdFx0fVxuMTk1MDpcdFx0aW5vZGUgPSBOVUxMO1xuMTk1MTpcdFxuMTk1MjpcdFx0cmV0ID0gZXh0NF9mY19yZWNvcmRfbW9kaWZpZWRfaW5vZGUoc2IsIGlubyk7XG4xOTUzOlx0XHRpZiAocmV0KVxuMTk1NDpcdFx0XHRnb3RvIG91dDtcbjE5NTU6XHRcbjE5NTY6XHRcdHJhd19mY19pbm9kZSA9IChzdHJ1Y3QgZXh0NF9pbm9kZSAqKVxuMTk1NzpcdFx0XHQodmFsICYjNDM7IG9mZnNldG9mKHN0cnVjdCBleHQ0X2ZjX2lub2RlLCBmY19yYXdfaW5vZGUpKTtcbjE5NTg6XHRcdHJldCA9IGV4dDRfZ2V0X2ZjX2lub2RlX2xvYyhzYiwgaW5vLCBcdTAwMjZpbG9jKTtcbjE5NTk6XHRcdGlmIChyZXQpXG4xOTYwOlx0XHRcdGdvdG8gb3V0O1xuMTk2MTpcdFxuMTk2MjpcdFx0aW5vZGVfbGVuID0gdGwtXHUwMDNlZmNfbGVuIC0gc2l6ZW9mKHN0cnVjdCBleHQ0X2ZjX2lub2RlKTtcbjE5NjM6XHRcdHJhd19pbm9kZSA9IGV4dDRfcmF3X2lub2RlKFx1MDAyNmlsb2MpO1xuMTk2NDpcdFxuMTk2NTpcdFx0bWVtY3B5KHJhd19pbm9kZSwgcmF3X2ZjX2lub2RlLCBvZmZzZXRvZihzdHJ1Y3QgZXh0NF9pbm9kZSwgaV9ibG9jaykpO1xuMTk2NjpcdFx0bWVtY3B5KCh1OCAqKXJhd19pbm9kZSAmIzQzOyBvZmZfZ2VuLCAodTggKilyYXdfZmNfaW5vZGUgJiM0Mzsgb2ZmX2dlbixcbjE5Njc6XHRcdCAgICAgICBpbm9kZV9sZW4gLSBvZmZfZ2VuKTtcbjE5Njg6XHRcdGlmIChsZTMyX3RvX2NwdShyYXdfaW5vZGUtXHUwMDNlaV9mbGFncykgXHUwMDI2IEVYVDRfRVhURU5UU19GTCkge1xuMTk2OTpcdFx0XHRlaCA9IChzdHJ1Y3QgZXh0NF9leHRlbnRfaGVhZGVyICopKFx1MDAyNnJhd19pbm9kZS1cdTAwM2VpX2Jsb2NrWzBdKTtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD42LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xNCAxNDozNjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuOC1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA1NzE5CgkJCQkJCQlvdXRwdXQ6IDIyCgkJCQkJCQl0aG91Z2h0czogNDMKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgdGFrZToKCioqSW52ZXN0aWdhdGluZyBgZXh0NF9leHRfY2xlYXJfYmJgIGluIHRoZSBGYXN0IENvbW1pdCBDb250ZXh0KioKCkFscmlnaHQsIHNvIGBleHQ0X2V4dF9jbGVhcl9iYmAgaXMgaW52b2x2ZWQgaW4gZmFzdCBjb21taXQgcmVwbGF5LiBUaGF0JiMzOTtzIHRoZSBzdGFydGluZyBwb2ludC4gTXkgbmV4dCBtb3ZlIGlzIHRvIGNoZWNrIHRoZSBiaWdnZXIgcGljdHVyZSwgdG8gdW5kZXJzdGFuZCB3aGVyZSBlbHNlIHRoaXMgZnVuY3Rpb24gaXMgYmVpbmcgdXNlZCB3aXRoaW4gdGhlIGV4dDQgZmlsZXN5c3RlbSBjb2RlLiBJIHdhbnQgdG8gaWRlbnRpZnkgYW55IG90aGVyIGNhbGxlcnMgb2YgYGV4dDRfZXh0X2NsZWFyX2JiYC4gVW5kZXJzdGFuZGluZyB0aGUgY2FsbCBncmFwaCB3aWxsIGhlbHAgbWUgZ3Jhc3AgdGhlIGJyb2FkZXIgaW1wbGljYXRpb25zIG9mIHRoaXMgZnVuY3Rpb24sIGhvdyBpdCByZWxhdGVzIHRvIG90aGVyIGV4dDQgZnVuY3Rpb25hbGl0aWVzLCBhbmQgcGlucG9pbnQgcG90ZW50aWFsIGFyZWFzIG9mIGNvbmNlcm4gb3Igb3B0aW1pemF0aW9uIG9wcG9ydHVuaXRpZXMgcmVsYXRlZCB0byB0aGUgZmFzdCBjb21taXQgcGF0aC4gRGl2aW5nIGludG8gdGhlIGRpZmZlcmVudCBjYWxsZXJzIGlzIGVzc2VudGlhbCBmb3IgYSB0aG9yb3VnaCB1bmRlcnN0YW5kaW5nLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjcvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE0IDE0OjM2PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2V4dDRfZXh0X2NsZWFyX2JiJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2ZzL2V4dDQvZXh0NC5oPTM5NTc9ZXh0ZXJuIGludCBleHQ0X2V4dF9yZXBsYXlfdXBkYXRlX2V4KHN0cnVjdCBpbm9kZSAqaW5vZGUsIGV4dDRfbGJsa190IHN0YXJ0LFxuZnMvZXh0NC9leHQ0LmgtMzk1OC1cdFx0aW50IGxlbiwgaW50IHVud3JpdHRlbiwgZXh0NF9mc2Jsa190IHBibGspO1xuZnMvZXh0NC9leHQ0Lmg6Mzk1OTpleHRlcm4gaW50IGV4dDRfZXh0X2NsZWFyX2JiKHN0cnVjdCBpbm9kZSAqaW5vZGUpO1xuZnMvZXh0NC9leHQ0LmgtMzk2MC1cbi0tXG5mcy9leHQ0L2V4dGVudHMuYz02MjUyPWludCBleHQ0X2V4dF9yZXBsYXlfc2V0X2libG9ja3Moc3RydWN0IGlub2RlICppbm9kZSlcbi0tXG5mcy9leHQ0L2V4dGVudHMuYy02MzM4LVxuZnMvZXh0NC9leHRlbnRzLmM6NjMzOTppbnQgZXh0NF9leHRfY2xlYXJfYmIoc3RydWN0IGlub2RlICppbm9kZSlcbmZzL2V4dDQvZXh0ZW50cy5jLTYzNDAte1xuLS1cbmZzL2V4dDQvZmFzdF9jb21taXQuYz0xOTI1PXN0YXRpYyBpbnQgZXh0NF9mY19yZXBsYXlfaW5vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYixcbi0tXG5mcy9leHQ0L2Zhc3RfY29tbWl0LmMtMTk0My1cdGlmICghSVNfRVJSKGlub2RlKSkge1xuZnMvZXh0NC9mYXN0X2NvbW1pdC5jOjE5NDQ6XHRcdHJldCA9IGV4dDRfZXh0X2NsZWFyX2JiKGlub2RlKTtcbmZzL2V4dDQvZmFzdF9jb21taXQuYy0xOTQ1LVx0XHRpcHV0KGlub2RlKTtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD44LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xNCAxNDozNjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuOC1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA2MjkzCgkJCQkJCQlvdXRwdXQ6IDIyCgkJCQkJCQl0aG91Z2h0czogMTkKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgYXR0ZW1wdCBhdCBzdW1tYXJpemluZyB0aGUgdGhvdWdodCBwcm9jZXNzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlOgoKKipBbmFseXppbmcgdGhlIENhbGwgUGF0aCBvZiBgZXh0NF9mY19yZXBsYXlfaW5vZGVgKioKCk9rYXksIHNvIEkmIzM5O20gZGl2aW5nIGludG8gYGV4dDRfZmNfcmVwbGF5X2lub2RlYCBhbmQgbmVlZCB0byB1bmRlcnN0YW5kIGl0cyBjb250ZXh0LiBXaGVyZSBleGFjdGx5IGRvZXMgdGhpcyBmdW5jdGlvbiBmaXQgaW50byB0aGUgYnJvYWRlciBwaWN0dXJlIG9mIGV4dDQmIzM5O3MgZmlsZSBjcmVhdGlvbiBhbmQgam91cm5hbGluZyBwcm9jZXNzPyBJIG5lZWQgdG8gdHJhY2UgaXRzIGNhbGwgcGF0aC4gVGhpcyBpc24mIzM5O3QganVzdCBhYm91dCByZWFkaW5nIHRoZSBjb2RlOyBpdCYjMzk7cyBhYm91dCByZWNvbnN0cnVjdGluZyB0aGUgb3BlcmF0aW9uYWwgZmxvdyBpbiBteSBoZWFkLiBJJiMzOTttIHRoaW5raW5nLCAmIzM0O3doYXQgZXZlbnRzIHRyaWdnZXIgYSByZXBsYXkgb3BlcmF0aW9uIG9uIGFuIGlub2RlIHdoZW4gZmlsZSBjcmVhdGlvbiBpcyBjb25jZXJuZWQ/JiMzNDsgTXkgaW5pdGlhbCBmb2N1cyBpcyBvbiBpZGVudGlmeWluZyB0aGUgZGlyZWN0IGNhbGxlcnMsIHVuZGVyc3RhbmRpbmcgdGhlIGFyZ3VtZW50cyBwYXNzZWQsIGFuZCB3aGF0IGluZm9ybWF0aW9uIHRoZXkgcHJvdmlkZSB0byBgZXh0NF9mY19yZXBsYXlfaW5vZGVgLiBJIG5lZWQgdG8gbG9vayBmb3IgY2FsbHMgc3BlY2lmaWNhbGx5IHJlbGF0ZWQgdG8gdHJhbnNhY3Rpb24gcmVjb3ZlcnkgYW5kIGVycm9yIGhhbmRsaW5nIGR1cmluZyBpbm9kZSBjcmVhdGlvbi4gRnJvbSB0aGVyZSwgSSYjMzk7bGwgbmVlZCB0byB3b3JrIG15IHdheSB1cCB0aGUgc3RhY2ssIGxvb2tpbmcgYXQgdGhlIGludGVyYWN0aW9uIHdpdGggYmxvY2sgYWxsb2NhdGlvbiwgam91cm5hbCBjb21taXQsIGFuZCB0aGUgb3ZlcmFsbCB0cmFuc2FjdGlvbiBtYW5hZ2VtZW50IHdpdGhpbiB0aGUgZXh0NCBmaWxlc3lzdGVtLiBUaGUgYWltIGhlcmUgaXMgYSBjb21wbGV0ZSB1bmRlcnN0YW5kaW5nIG9mIHRoZSBjb25kaXRpb25zIHVuZGVyIHdoaWNoIHRoaXMgZnVuY3Rpb24gZXhlY3V0ZXMgZHVyaW5nIHBvdGVudGlhbCBmYWlsdXJlIHNjZW5hcmlvcy4gVGhpcyBpcyB0aGUgYmVkcm9jayB0byB1bmRlcnN0YW5kIHRoZSByZWxpYWJpbGl0eSBhbmQgY29ycmVjdG5lc3Mgb2YgdGhlIGV4dDQgZmlsZXN5c3RlbSBhbmQgdG8gaWRlbnRpZnkgYW5kIGZpeCBhbnkgY29ybmVyIGNhc2VzIHRoYXQgY2FuIGFyaXNlLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjkvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE0IDE0OjM2PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2V4dDRfZmNfcmVwbGF5X2lub2RlJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2ZzL2V4dDQvZmFzdF9jb21taXQuYz0xODk2PXN0YXRpYyBpbnQgZXh0NF9mY19yZWNvcmRfbW9kaWZpZWRfaW5vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IGlubylcbi0tXG5mcy9leHQ0L2Zhc3RfY29tbWl0LmMtMTkyNC0gKi9cbmZzL2V4dDQvZmFzdF9jb21taXQuYzoxOTI1OnN0YXRpYyBpbnQgZXh0NF9mY19yZXBsYXlfaW5vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYixcbmZzL2V4dDQvZmFzdF9jb21taXQuYy0xOTI2LVx0XHRcdFx0c3RydWN0IGV4dDRfZmNfdGxfbWVtICp0bCwgdTggKnZhbClcbi0tXG5mcy9leHQ0L2Zhc3RfY29tbWl0LmM9MjU3Mz1zdGF0aWMgaW50IGV4dDRfZmNfcmVwbGF5KGpvdXJuYWxfdCAqam91cm5hbCwgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCxcbi0tXG5mcy9leHQ0L2Zhc3RfY29tbWl0LmMtMjYzOC1cdFx0Y2FzZSBFWFQ0X0ZDX1RBR19JTk9ERTpcbmZzL2V4dDQvZmFzdF9jb21taXQuYzoyNjM5Olx0XHRcdHJldCA9IGV4dDRfZmNfcmVwbGF5X2lub2RlKHNiLCBcdTAwMjZ0bCwgdmFsKTtcbmZzL2V4dDQvZmFzdF9jb21taXQuYy0yNjQwLVx0XHRcdGJyZWFrO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEwLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xNCAxNDozNjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MW08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuOC1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA2ODcxCgkJCQkJCQlvdXRwdXQ6IDIzCgkJCQkJCQl0aG91Z2h0czogNzk5CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyB0aGUgZXh0NCBGYXN0IENvbW1pdCBSZXBsYXkgSGFuZGxlcioqCgpPa2F5LCBsZXQmIzM5O3MgYnJlYWsgdGhpcyBkb3duLiBXZSYjMzk7cmUgbG9va2luZyBhdCBgZXh0NF9mY19yZXBsYXlgLCBzcGVjaWZpY2FsbHkgaG93IGl0IGhhbmRsZXMgZmFzdCBjb21taXQgcmVwbGF5IGluIHRoZSBleHQ0IGZpbGVzeXN0ZW0gYW5kIGl0cyBpbnRlcmFjdGlvbiB3aXRoIHRoZSBqb3VybmFsLiBJIGtub3cgdGhpcyBjb2RlLCBvZiBjb3Vyc2UuIEl0JiMzOTtzIHRyaWdnZXJlZCBkdXJpbmcgbW91bnRzIG9mIGV4dDQgZmlsZXN5c3RlbXMgd2l0aCBqb3VybmFsIHJlY29yZHMsIHdoaWNoIGluY2x1ZGVzIHNjZW5hcmlvcyBsaWtlIHN5emthbGxlci1mdXp6ZWQgaW1hZ2VzLCBwb3dlci1sb3NzIHNpbXVsYXRpb25zLCBvciBub3JtYWwgZmFzdC1jb21taXQgb3BlcmF0aW9ucy4gUmlnaHQsIHN5emthbGxlciBpcyBhY3RpdmVseSBtb3VudGluZyB0aG9zZSBjcmFmdGVkIGltYWdlcywgcG9raW5nIGF0IHRoZSBmaWxlc3lzdGVtIHdpdGggdmFyaW91cyBzeXNjYWxscy4gQW5kIGV4dDQgaXMsIGFzIGV4cGVjdGVkLCBhIHByaW1lIHRhcmdldCBmb3Igc3l6a2FsbGVyJiMzOTtzIGZ1enppbmcgZWZmb3J0cy4KCk5vdywgbGV0JiMzOTtzIGRpdmUgaW50byB0aGlzIHBhdGNoLiBUaGUga2V5IGNoYW5nZXMgYXJlIHdpdGhpbiBgZnMvZXh0NC9leHRlbnRzLmNgLCBzcGVjaWZpY2FsbHkgaW4gdGhlIGZ1bmN0aW9uIGBleHQ0X2V4dF9jbGVhcl9iYihzdHJ1Y3QgaW5vZGUgKmlub2RlKWAuIEJlZm9yZSB0aGUgcGF0Y2gsIHRoZSBjb2RlIHdhcy4uLiB3ZWxsLCBsZXQmIzM5O3MganVzdCBzYXkgYSBiaXQgbG9vc2Ugd2l0aCBpdHMgZXJyb3IgaGFuZGxpbmcuCgpQcmV2aW91c2x5LCBpZiBgZXh0NF9maW5kX2V4dGVudGAgZmFpbGVkLCByZXR1cm5pbmcgYW4gRVJSX1BUUiwgdGhlIGNvZGUganVzdCBzZXQgYHBhdGggPSBOVUxMYCwgYW5kIGtlcHQgZ29pbmchIFRoYXQmIzM5O3MgYmFkLiBDcml0aWNhbGx5LCB3ZSBub3cgaGF2ZSBhIGBpZiAoSVNfRVJSKHBhdGgpKWAgY2hlY2sgYW5kIHJldHVybiBhIHByb3BlciBlcnJvciBjb2RlLiBUaGlzIGlzIGEgY2xlYXIgaW1wcm92ZW1lbnQuCgpBZGRpdGlvbmFsbHksIHRoZSBwYXRjaCBhZGRyZXNzZXMgdGhlIGlnbm9yZWQgcmV0dXJuIHZhbHVlcyBmcm9tIGBleHQ0X2ZjX3JlY29yZF9yZWdpb25zYC4gQmVmb3JlLCBlcnJvcnMgZnJvbSB0aGlzIGZ1bmN0aW9uIOKAkyB0aGluZ3MgbGlrZSBgLUVOT01FTWAg4oCTIHdlcmUgc2ltcGx5IGlnbm9yZWQsIHRoZSBsb29wIGNvbnRpbnVpbmcsIGFuZCB0aGVuIHRoZSBmdW5jdGlvbiBoYXJkY29kZWQgYHJldHVybiAwYCBhdCB0aGUgZW5kISBUaGF0JiMzOTtzIGFub3RoZXIgcG90ZW50aWFsIHNvdXJjZSBvZiBidWdzLiBOb3csIGFueSBlcnJvciBmcm9tIGVpdGhlciBgZXh0NF9tYXBfYmxvY2tzYCBvciBgZXh0NF9maW5kX2V4dGVudGAgdHJpZ2dlcnMgYSBgZ290byBvdXQ7YCwgYW5kIGBvdXQ6YCBub3cgcHJvcGFnYXRlcyB0aGUgZXJyb3IgY29kZSBjb3JyZWN0bHkuIFRoZSBmdW5jdGlvbiByZXR1cm5zIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBpZiBpdCBlbmNvdW50ZXJlZCBhbiBpc3N1ZTsgb3RoZXJ3aXNlLCBpdCByZXR1cm5zIDAuCgpCdXQgd2FpdCBhIG1pbnV0ZS4uLiB3aGF0IGRvZXMgYGV4dDRfZnJlZV9leHRfcGF0aChwYXRoKWAgZG8gd2hlbiBgcGF0aGAgaXMgYWN0dWFsbHkgYW4gRVJSX1BUUj8gVGhhdCYjMzk7cyB0aGUgbmV4dCBxdWVzdGlvbiBJIG5lZWQgdG8gYW5zd2VyLiBJIHNob3VsZCBwcm9iYWJseSBjaGVjayB0aGF0IGZ1bmN0aW9uJiMzOTtzIGltcGxlbWVudGF0aW9uIGp1c3QgdG8gYmUgc3VyZS4uLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjExLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xNCAxNDozODwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDt2b2lkIGV4dDRfZnJlZV9leHRfcGF0aCYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtmcy9leHQ0L2V4dDQuaD0zOTM1PWV4dGVybiBzdHJ1Y3QgZXh0NF9leHRfcGF0aCAqZXh0NF9maW5kX2V4dGVudChzdHJ1Y3QgaW5vZGUgKiwgZXh0NF9sYmxrX3QsXG4tLVxuZnMvZXh0NC9leHQ0LmgtMzkzNy1cdFx0XHRcdFx0ICAgICAgaW50IGZsYWdzKTtcbmZzL2V4dDQvZXh0NC5oOjM5Mzg6ZXh0ZXJuIHZvaWQgZXh0NF9mcmVlX2V4dF9wYXRoKHN0cnVjdCBleHQ0X2V4dF9wYXRoICopO1xuZnMvZXh0NC9leHQ0LmgtMzkzOS1leHRlcm4gaW50IGV4dDRfZXh0X2NoZWNrX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpO1xuLS1cbmZzL2V4dDQvZXh0ZW50cy5jPTExMT1zdGF0aWMgdm9pZCBleHQ0X2V4dF9kcm9wX3JlZnMoc3RydWN0IGV4dDRfZXh0X3BhdGggKnBhdGgpXG4tLVxuZnMvZXh0NC9leHRlbnRzLmMtMTIxLVxuZnMvZXh0NC9leHRlbnRzLmM6MTIyOnZvaWQgZXh0NF9mcmVlX2V4dF9wYXRoKHN0cnVjdCBleHQ0X2V4dF9wYXRoICpwYXRoKVxuZnMvZXh0NC9leHRlbnRzLmMtMTIzLXtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMi8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTQgMTQ6Mzg8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjgtZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogODQxMQoJCQkJCQkJb3V0cHV0OiAzNwoJCQkJCQkJdGhvdWdodHM6IDMyCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBsZXQmIzM5O3MgZGl2ZSBpbnRvIHRoaXMuIEkmIzM5O20gZ29pbmcgdG8gcHVsbCB1cCBgZXh0NF9mcmVlX2V4dF9wYXRoYCBhdCBsaW5lIDEyMiB3aXRoaW4gYGZzL2V4dDQvZXh0ZW50cy5jYC4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgaG93IHRoZSBleHQ0IGZpbGVzeXN0ZW0gaGFuZGxlcyBmcmVlaW5nIGV4dGVudCBwYXRocy4gSSBrbm93IHRoaXMgZnVuY3Rpb24gaXMgY3JpdGljYWwgZm9yIG1haW50YWluaW5nIGRhdGEgaW50ZWdyaXR5IGFuZCBlZmZpY2llbnQgc3BhY2UgbWFuYWdlbWVudCB3aXRoaW4gYW4gZXh0NCB2b2x1bWUuIFRoaXMgaXMgYSBrZXkgYnVpbGRpbmcgYmxvY2sgaW4gdW5kZXJzdGFuZGluZyBob3cgZXh0ZW50cyBhcmUgdXNlZCwgYW5kIG1hbmFnZWQsIHdpdGhpbiBleHQ0LgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEzLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xNCAxNDozODwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O2ZzL2V4dDQvZXh0ZW50cy5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMTIwLAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDIwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OyAxMjA6XHR9XG4gMTIxOlx0XG4gMTIyOlx0dm9pZCBleHQ0X2ZyZWVfZXh0X3BhdGgoc3RydWN0IGV4dDRfZXh0X3BhdGggKnBhdGgpXG4gMTIzOlx0e1xuIDEyNDpcdFx0aWYgKElTX0VSUl9PUl9OVUxMKHBhdGgpKVxuIDEyNTpcdFx0XHRyZXR1cm47XG4gMTI2Olx0XHRleHQ0X2V4dF9kcm9wX3JlZnMocGF0aCk7XG4gMTI3Olx0XHRrZnJlZShwYXRoKTtcbiAxMjg6XHR9XG4gMTI5Olx0XG4gMTMwOlx0LypcbiAxMzE6XHQgKiBNYWtlIHN1cmUgJiMzOTtoYW5kbGUmIzM5OyBoYXMgYXQgbGVhc3QgJiMzOTtjaGVja19jcmVkJiMzOTsgY3JlZGl0cy4gSWYgbm90LCByZXN0YXJ0XG4gMTMyOlx0ICogdHJhbnNhY3Rpb24gd2l0aCAmIzM5O3Jlc3RhcnRfY3JlZCYjMzk7IGNyZWRpdHMuIFRoZSBmdW5jdGlvbiBkcm9wcyBpX2RhdGFfc2VtXG4gMTMzOlx0ICogd2hlbiByZXN0YXJ0aW5nIHRyYW5zYWN0aW9uIGFuZCBnZXRzIGl0IGFmdGVyIHRyYW5zYWN0aW9uIGlzIHJlc3RhcnRlZC5cbiAxMzQ6XHQgKlxuIDEzNTpcdCAqIFRoZSBmdW5jdGlvbiByZXR1cm5zIDAgb24gc3VjY2VzcywgMSBpZiB0cmFuc2FjdGlvbiBoYWQgdG8gYmUgcmVzdGFydGVkLFxuIDEzNjpcdCAqIGFuZCBcdTAwM2MgMCBpbiBjYXNlIG9mIGZhdGFsIGVycm9yLlxuIDEzNzpcdCAqL1xuIDEzODpcdGludCBleHQ0X2RhdGFzZW1fZW5zdXJlX2NyZWRpdHMoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSxcbiAxMzk6XHRcdFx0XHRcdGludCBjaGVja19jcmVkLCBpbnQgcmVzdGFydF9jcmVkLFxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE0LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xNCAxNDozODwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuOC1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA4OTAwCgkJCQkJCQlvdXRwdXQ6IDM5CgkJCQkJCQl0aG91Z2h0czogMTY5CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyB0aGUgRmlsZSBDcmVhdGlvbiBSZXBsYXkgQ29kZSoqCgpPa2F5LCBzbyBJJiMzOTttIGxvb2tpbmcgYXQgYGV4dDRfZnJlZV9leHRfcGF0aGAsIGFuZCBJIHNlZSBpdCBncmFjZWZ1bGx5IGhhbmRsZXMgYSBudWxsIG9yIGVycm9yLXNpZ25hbGluZyBwYXRoLiBHb29kLiBOb3csIGxldCYjMzk7cyBkaWcgaW50byBgZXh0NF9mY19yZXBsYXlfaW5vZGVgLiBJIHNlZSB0aGUgY29kZSBjYWxscyBgZXh0NF9pZ2V0YCB0byBnZXQgdGhlIGlub2RlLiBJZiB0aGF0JiMzOTtzIHN1Y2Nlc3NmdWwsIGl0IHByb2NlZWRzIHRvIGNhbGwgYGV4dDRfZXh0X2NsZWFyX2JiYC4gVGhlIGludGVyZXN0aW5nIGJpdCBoZXJlIGlzIHRoYXQgaWYgYGV4dDRfZXh0X2NsZWFyX2JiYCByZXR1cm5zIGFuIGVycm9yLCBpdCBpbW1lZGlhdGVseSBqdW1wcyB0byBgb3V0OmAuIEkmIzM5O20gZ29pbmcgdG8gZm9sbG93IHRoYXQgYGdvdG9gIGFuZCBzZWUgd2hhdCBoYXBwZW5zIHRoZXJlLiBVbmRlcnN0YW5kaW5nIHRoZSBlcnJvciBoYW5kbGluZyB3aXRoaW4gYGV4dDRfZmNfcmVwbGF5X2lub2RlYCBpcyBrZXkgdG8gZW5zdXJpbmcgdGhlIGludGVncml0eSBvZiB0aGUgZmlsZSBzeXN0ZW0gYWZ0ZXIgYSBjcmFzaCBvciBwb3dlciBmYWlsdXJlLiBJIG5lZWQgdG8gdHJhY2UgdGhpcyAmIzM0O291dDomIzM0OyBsYWJlbCBhbmQgdW5kZXJzdGFuZCB0aGUgZnVsbCBpbXBsaWNhdGlvbnMgb2YgYW4gYGV4dDRfZXh0X2NsZWFyX2JiYCBmYWlsdXJlLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE1LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xNCAxNDozOTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O2ZzL2V4dDQvZmFzdF9jb21taXQuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDE5ODAsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogNDAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7MTk4MDpcdFx0XHRcdHNpemVvZihyYXdfaW5vZGUtXHUwMDNlaV9ibG9jaykpO1xuMTk4MTpcdFx0fVxuMTk4MjpcdFxuMTk4MzpcdFx0LyogSW1tZWRpYXRlbHkgdXBkYXRlIHRoZSBpbm9kZSBvbiBkaXNrLiAqL1xuMTk4NDpcdFx0cmV0ID0gZXh0NF9oYW5kbGVfZGlydHlfbWV0YWRhdGEoTlVMTCwgTlVMTCwgaWxvYy5iaCk7XG4xOTg1Olx0XHRpZiAocmV0KVxuMTk4NjpcdFx0XHRnb3RvIG91dF9icmVsc2U7XG4xOTg3Olx0XHRyZXQgPSBzeW5jX2RpcnR5X2J1ZmZlcihpbG9jLmJoKTtcbjE5ODg6XHRcdGlmIChyZXQpXG4xOTg5Olx0XHRcdGdvdG8gb3V0X2JyZWxzZTtcbjE5OTA6XHRcdHJldCA9IGV4dDRfbWFya19pbm9kZV91c2VkKHNiLCBpbm8pO1xuMTk5MTpcdFx0aWYgKHJldClcbjE5OTI6XHRcdFx0Z290byBvdXRfYnJlbHNlO1xuMTk5MzpcdFxuMTk5NDpcdFx0LyogR2l2ZW4gdGhhdCB3ZSBqdXN0IHdyb3RlIHRoZSBpbm9kZSBvbiBkaXNrLCB0aGlzIFNIT1VMRCBzdWNjZWVkLiAqL1xuMTk5NTpcdFx0aW5vZGUgPSBleHQ0X2lnZXQoc2IsIGlubywgRVhUNF9JR0VUX05PUk1BTCk7XG4xOTk2Olx0XHRpZiAoSVNfRVJSKGlub2RlKSkge1xuMTk5NzpcdFx0XHRleHQ0X2RlYnVnKFwmIzM0O0lub2RlIG5vdCBmb3VuZC5cJiMzNDspO1xuMTk5ODpcdFx0XHRpbm9kZSA9IE5VTEw7XG4xOTk5Olx0XHRcdHJldCA9IC1FRlNDT1JSVVBURUQ7XG4yMDAwOlx0XHRcdGdvdG8gb3V0X2JyZWxzZTtcbjIwMDE6XHRcdH1cbjIwMDI6XHRcbjIwMDM6XHRcdC8qXG4yMDA0Olx0XHQgKiBPdXIgYWxsb2NhdG9yIGNvdWxkIGhhdmUgbWFkZSBkaWZmZXJlbnQgZGVjaXNpb25zIHRoYW4gYmVmb3JlXG4yMDA1Olx0XHQgKiBjcmFzaGluZy4gVGhpcyBzaG91bGQgYmUgZml4ZWQgYnV0IHVudGlsIHRoZW4sIHdlIGNhbGN1bGF0ZVxuMjAwNjpcdFx0ICogdGhlIG51bWJlciBvZiBibG9ja3MgdGhlIGlub2RlLlxuMjAwNzpcdFx0ICovXG4yMDA4Olx0XHRpZiAoIWV4dDRfdGVzdF9pbm9kZV9mbGFnKGlub2RlLCBFWFQ0X0lOT0RFX0lOTElORV9EQVRBKSlcbjIwMDk6XHRcdFx0ZXh0NF9leHRfcmVwbGF5X3NldF9pYmxvY2tzKGlub2RlKTtcbjIwMTA6XHRcbjIwMTE6XHRcdGlub2RlLVx1MDAzZWlfZ2VuZXJhdGlvbiA9IGxlMzJfdG9fY3B1KGV4dDRfcmF3X2lub2RlKFx1MDAyNmlsb2MpLVx1MDAzZWlfZ2VuZXJhdGlvbik7XG4yMDEyOlx0XHRleHQ0X3Jlc2V0X2lub2RlX3NlZWQoaW5vZGUpO1xuMjAxMzpcdFxuMjAxNDpcdFx0ZXh0NF9pbm9kZV9jc3VtX3NldChpbm9kZSwgZXh0NF9yYXdfaW5vZGUoXHUwMDI2aWxvYyksIEVYVDRfSShpbm9kZSkpO1xuMjAxNTpcdFx0cmV0ID0gZXh0NF9oYW5kbGVfZGlydHlfbWV0YWRhdGEoTlVMTCwgTlVMTCwgaWxvYy5iaCk7XG4yMDE2Olx0XHRzeW5jX2RpcnR5X2J1ZmZlcihpbG9jLmJoKTtcbjIwMTc6XHRvdXRfYnJlbHNlOlxuMjAxODpcdFx0YnJlbHNlKGlsb2MuYmgpO1xuMjAxOTpcdG91dDpcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNi8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTQgMTQ6Mzk8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjgtZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogOTk2MgoJCQkJCQkJb3V0cHV0OiAzOQoJCQkJCQkJdGhvdWdodHM6IDI4CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIGEgc3VtbWFyeSBvZiBteSB0aG91Z2h0IHByb2Nlc3MsIGFzIHJlcXVlc3RlZDoKCioqRGl2aW5nIGludG8gYGZhc3RfY29tbWl0LmNgKioKCkFscmlnaHQsIHRpbWUgdG8gZGlnIGluLiBJIG5lZWQgdG8gcmVmcmVzaCBteSBtZW1vcnkgb24gdGhlIGZhc3QgY29tbWl0IGltcGxlbWVudGF0aW9uIHdpdGhpbiBleHQ0LiBMZXQmIzM5O3Mgc3RhcnQgYnkgemVyb2luZyBpbiBvbiBsaW5lcyAyMDE5IHRocm91Z2ggMjAzMCBvZiBgZnMvZXh0NC9mYXN0X2NvbW1pdC5jYC4gVGhlc2UgbGluZXMgbGlrZWx5IGRlYWwgd2l0aCBhIHNwZWNpZmljIGFzcGVjdCBvZiB0aGUgZmFzdCBjb21taXQgbWVjaGFuaXNtLCBhbmQgdGhhdCYjMzk7cyB3aGVyZSBJIG5lZWQgdG8gZm9jdXMgbXkgYXR0ZW50aW9uIGZvciBub3cuIFdoYXQgcGFydGljdWxhciBmdW5jdGlvbmFsaXR5IG9yIHBvdGVudGlhbCBpc3N1ZSBpcyBjb3ZlcmVkIGluIHRoYXQgc2VjdGlvbj8gVW5kZXJzdGFuZGluZyB0aGlzIGNodW5rIGlzIGNyaXRpY2FsIGJlZm9yZSBJIGJyb2FkZW4gdGhlIHNjb3BlLiBJIGhvcGUgdGhlIGNvZGUgaXMgd2VsbC1jb21tZW50ZWQgc28gSSBjYW4gcXVpY2tseSBpZGVudGlmeSB0aGUgcHVycG9zZSBhbmQgY29udGV4dCBvZiB0aGlzIGNvZGUgYmxvY2suIExldCYjMzk7cyBnbyEKCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNy8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTQgMTQ6Mzk8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtmcy9leHQ0L2Zhc3RfY29tbWl0LmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAyMDE4LAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDIwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OzIwMTg6XHRcdGJyZWxzZShpbG9jLmJoKTtcbjIwMTk6XHRvdXQ6XG4yMDIwOlx0XHRpcHV0KGlub2RlKTtcbjIwMjE6XHRcdGlmICghcmV0KVxuMjAyMjpcdFx0XHRibGtkZXZfaXNzdWVfZmx1c2goc2ItXHUwMDNlc19iZGV2KTtcbjIwMjM6XHRcbjIwMjQ6XHRcdHJldHVybiByZXQ7XG4yMDI1Olx0fVxuMjAyNjpcdFxuMjAyNzpcdC8qXG4yMDI4Olx0ICogRGVudHJ5IGNyZWF0ZSByZXBsYXkgZnVuY3Rpb24uXG4yMDI5Olx0ICpcbjIwMzA6XHQgKiBFWFQ0X0ZDX1RBR19DUkVBVCBpcyBwcmVjZWRlZCBieSBFWFQ0X0ZDX1RBR19JTk9ERV9GVUxMLiBXaGljaCBtZWFucywgdGhlXG4yMDMxOlx0ICogaW5vZGUgZm9yIHdoaWNoIHdlIGFyZSB0cnlpbmcgdG8gY3JlYXRlIGEgZGVudHJ5IGhlcmUsIHNob3VsZCBhbHJlYWR5IGhhdmVcbjIwMzI6XHQgKiBiZWVuIHJlcGxheWVkIGJlZm9yZSB3ZSBzdGFydCBoZXJlLlxuMjAzMzpcdCAqL1xuMjAzNDpcdHN0YXRpYyBpbnQgZXh0NF9mY19yZXBsYXlfY3JlYXRlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsXG4yMDM1Olx0XHRcdFx0XHQgc3RydWN0IGV4dDRfZmNfdGxfbWVtICp0bCwgdTggKnZhbClcbjIwMzY6XHR7XG4yMDM3Olx0XHRpbnQgcmV0ID0gMDtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xOC8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTQgMTQ6Mzk8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjgtZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTA0ODkKCQkJCQkJCW91dHB1dDogMzEKCQkJCQkJCXRob3VnaHRzOiA0NjMKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIGEgUG90ZW50aWFsIEZ1enppbmcgVGFyZ2V0OiBleHQ0X2ZjX3JlcGxheV9pbm9kZSoqCgpPa2F5LCBsZXQmIzM5O3MgYnJlYWsgdGhpcyBkb3duLiBJJiMzOTttIGxvb2tpbmcgYXQgYGV4dDRfZmNfcmVwbGF5X2lub2RlYCwgYW5kIHRoZXJlJiMzOTtzIGEgc3BlY2lmaWMgcGF0dGVybiBoZXJlIHRoYXQgY2F0Y2hlcyBteSBleWUuIFRoZXkmIzM5O3ZlIGludHJvZHVjZWQgYW4gZXJyb3IgY2hlY2sgYWZ0ZXIgY2FsbGluZyBgZXh0NF9leHRfY2xlYXJfYmJgLiBQcmV2aW91c2x5LCBpdCB3YXMgYmxpbmRseSBjYWxsZWQsIGZvbGxvd2VkIGJ5IGBpcHV0KGlub2RlKWAuIE5vdywgaWYgYGV4dDRfZXh0X2NsZWFyX2JiYCBmYWlscywgaXQganVtcHMgdG8gYG91dGAsIHdoaWNoICpzdGlsbCogY2FsbHMgYGlwdXQoaW5vZGUpYCAob24gTlVMTCwgc28gaGFybWxlc3NseSkgYmVmb3JlIHJldHVybmluZyB0aGUgZXJyb3IgY29kZS4gVGhlIGltcG9ydGFudCB0aGluZyBpcyB0aGF0IG5vdyB0aGUgZXJyb3IgaXMgYmVpbmcgcHJvcGFnYXRlZCB1cCB0aGUgY2FsbCBjaGFpbiwgZWZmZWN0aXZlbHkgYWJvcnRpbmcgdGhlIHJlcGxheSBwcm9jZXNzIGlmIHNvbWV0aGluZyBnb2VzIHdyb25nLiBUaGlzIGlzIGEgYmVoYXZpb3JhbCBjaGFuZ2UsIGFuZCB3b3J0aCBpbnZlc3RpZ2F0aW5nLgoKVGhlIGtleSBxdWVzdGlvbiBpczogaXMgdGhpcyByZWFjaGFibGUgY29kZT8gRG9lcyB0aGlzIG5ldyBlcnJvciBoYW5kbGluZyBwYXRoIHByb3ZpZGUgYSBmdXp6aW5nIGVudHJ5IHBvaW50PyBMZXQmIzM5O3MgYXBwbHkgdGhlIGNyaXRlcmlhLiBFeHQ0IGlzIGRlZmluaXRlbHkgcGFydCBvZiB0aGUgY29yZSBWRlMsIHNvIHRoYXQmIzM5O3MgYSBjaGVjay4gSXQmIzM5O3MgYmVlbiBleHRlbnNpdmVseSBmdXp6ZWQgdmlhIG1vdW50IGFuZCBzeXprYWxsZXIsIHNvIHRoYXQmIzM5O3MgYSBwbHVzLiBBbnkgbG9naWMgbW9kaWZpY2F0aW9ucyBpbiBhIFZGUyBjb21wb25lbnQsIGVzcGVjaWFsbHkgb25lIGRlYWxpbmcgd2l0aCBwb3RlbnRpYWxseSBjcml0aWNhbCBkYXRhIHJlY292ZXJ5IGxpa2UgYSBmaWxlc3lzdGVtJiMzOTtzIHJlcGxheSBwcm9jZXNzLCBzaG91bGQgcmFpc2UgYSBmbGFnLgoKR2l2ZW4gdGhlIGNyaXRlcmlhLCB0aGlzICpjb3VsZCogYmUgYSB2YWxpZCBmdXp6aW5nIHRhcmdldC4gVGhlIGFsdGVyYXRpb24gaXMgYSByZWZhY3RvcmluZyBvZiBhIGNvZGUgZmxvdyB0byBkZWFsIHdpdGggZXJyb3IgY29uZGl0aW9ucyBhbmQgdGh1cyB3b3J0aCBjbG9zZXIgYXR0ZW50aW9uLgoKVGhlIG5leHQgc3RlcCBpcyB0byBuYWlsIGRvd24gdGhlIGNvbmZpZ3VyYXRpb24gcmVxdWlyZW1lbnRzLiBXaGF0IGFyZSB0aGUgcHJlcmVxdWlzaXRlcyB0byB0cmlnZ2VyIHRoaXMgY29kZSBwYXRoPyBJIG5lZWQgdG8gY2hlY2sgdGhlIEtjb25maWcgZm9yIGV4dDQgYW5kLCBzcGVjaWZpY2FsbHksIGZvciBmYXN0IGNvbW1pdC4gV2hhdCBjb25maWcgb3B0aW9ucyBhcmUgbmVlZGVkIHRvIG1ha2UgdGhpcyBjb2RlIGFjdGl2ZSBhbmQgcmVhY2hhYmxlPwoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE5LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xNCAxNDozOTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtmYXN0X2NvbW1pdHxGQVNUX0NPTU1JVCYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O2ZzL2V4dDQmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7ZnMvZXh0NC9NYWtlZmlsZT04PWV4dDQteVx0Oj0gYmFsbG9jLm8gYml0bWFwLm8gYmxvY2tfdmFsaWRpdHkubyBkaXIubyBleHQ0X2piZDIubyBleHRlbnRzLm8gXFxcbi0tXG5mcy9leHQ0L01ha2VmaWxlLTEyLVx0XHRzdXBlci5vIHN5bWxpbmsubyBzeXNmcy5vIHhhdHRyLm8geGF0dHJfaHVyZC5vIHhhdHRyX3RydXN0ZWQubyBcXFxuZnMvZXh0NC9NYWtlZmlsZToxMzpcdFx0eGF0dHJfdXNlci5vIGZhc3RfY29tbWl0Lm8gb3JwaGFuLm9cbmZzL2V4dDQvTWFrZWZpbGUtMTQtXG4tLVxuZnMvZXh0NC9leHQ0Lmg9OTYzPWRvIHtcdFx0XHRcdFx0XHRcdFx0XHRcdFxcXG4tLVxuZnMvZXh0NC9leHQ0LmgtOTk5LSNpbmNsdWRlIFwmIzM0O2V4dGVudHNfc3RhdHVzLmhcJiMzNDtcbmZzL2V4dDQvZXh0NC5oOjEwMDA6I2luY2x1ZGUgXCYjMzQ7ZmFzdF9jb21taXQuaFwmIzM0O1xuZnMvZXh0NC9leHQ0LmgtMTAwMS1cbi0tXG5mcy9leHQ0L2V4dDQuaD0xMDQ4PXN0cnVjdCBleHQ0X2lub2RlX2luZm8ge1xuLS1cbmZzL2V4dDQvZXh0NC5oLTEzMTQtXG5mcy9leHQ0L2V4dDQuaDoxMzE1OiNkZWZpbmUgRVhUNF9NT1VOVDJfSk9VUk5BTF9GQVNUX0NPTU1JVFx0MHgwMDAwMDAxMCAvKiBKb3VybmFsIGZhc3QgY29tbWl0ICovXG5mcy9leHQ0L2V4dDQuaC0xMzE2LSNkZWZpbmUgRVhUNF9NT1VOVDJfREFYX05FVkVSXHRcdDB4MDAwMDAwMjAgLyogRG8gbm90IGFsbG93IERpcmVjdCBBY2Nlc3MgKi9cbi0tXG5mcy9leHQ0L2V4dDQuaD0yMTQwPXN0YXRpYyBpbmxpbmUgc3RydWN0IG1hcHBpbmdfbWV0YWRhdGFfYmhzICpleHQ0X2lfbWV0YWRhdGFfYmhzKFxuLS1cbmZzL2V4dDQvZXh0NC5oLTIxODUtLypcbmZzL2V4dDQvZXh0NC5oOjIxODY6ICogVGhlIHJlYXNvbiB3aHkgXCYjMzQ7RkFTVF9DT01NSVRcJiMzNDsgaXMgYSBjb21wYXQgZmVhdHVyZSBpcyB0aGF0LCBGUyBiZWNvbWVzXG5mcy9leHQ0L2V4dDQuaC0yMTg3LSAqIGluY29tcGF0aWJsZSBvbmx5IGlmIGZhc3QgY29tbWl0IGJsb2NrcyBhcmUgcHJlc2VudCBpbiB0aGUgRlMuIFNpbmNlIHdlXG4tLVxuZnMvZXh0NC9leHQ0LmgtMjE5MS0gKi9cbmZzL2V4dDQvZXh0NC5oOjIxOTI6I2RlZmluZSBFWFQ0X0ZFQVRVUkVfQ09NUEFUX0ZBU1RfQ09NTUlUXHRcdDB4MDQwMFxuZnMvZXh0NC9leHQ0LmgtMjE5My0jZGVmaW5lIEVYVDRfRkVBVFVSRV9DT01QQVRfU1RBQkxFX0lOT0RFU1x0MHgwODAwXG4tLVxuZnMvZXh0NC9leHQ0Lmg9MjI5Nz1FWFQ0X0ZFQVRVUkVfQ09NUEFUX0ZVTkNTKHNwYXJzZV9zdXBlcjIsXHRTUEFSU0VfU1VQRVIyKVxuZnMvZXh0NC9leHQ0Lmg6MjI5ODpFWFQ0X0ZFQVRVUkVfQ09NUEFUX0ZVTkNTKGZhc3RfY29tbWl0LFx0XHRGQVNUX0NPTU1JVClcbmZzL2V4dDQvZXh0NC5oLTIyOTktRVhUNF9GRUFUVVJFX0NPTVBBVF9GVU5DUyhzdGFibGVfaW5vZGVzLFx0U1RBQkxFX0lOT0RFUylcbi0tXG5mcy9leHQ0L2V4dDQuaD0zMDcwPXZvaWQgZXh0NF9lbmRfYml0bWFwX3JlYWQoc3RydWN0IGJpbyAqYmlvKTtcbmZzL2V4dDQvZXh0NC5oLTMwNzEtXG5mcy9leHQ0L2V4dDQuaDozMDcyOi8qIGZhc3RfY29tbWl0LmMgKi9cbmZzL2V4dDQvZXh0NC5oLTMwNzMtaW50IGV4dDRfZmNfaW5mb19zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KTtcbi0tXG5mcy9leHQ0L2Zhc3RfY29tbWl0LmMtMy0vKlxuZnMvZXh0NC9mYXN0X2NvbW1pdC5jOjQ6ICogZnMvZXh0NC9mYXN0X2NvbW1pdC5jXG5mcy9leHQ0L2Zhc3RfY29tbWl0LmMtNS0gKlxuLS1cbmZzL2V4dDQvZmFzdF9jb21taXQuYz0yMjU9c3RhdGljIGJvb2wgZXh0NF9mY19kaXNhYmxlZChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKVxuZnMvZXh0NC9mYXN0X2NvbW1pdC5jLTIyNi17XG5mcy9leHQ0L2Zhc3RfY29tbWl0LmM6MjI3Olx0cmV0dXJuICghdGVzdF9vcHQyKHNiLCBKT1VSTkFMX0ZBU1RfQ09NTUlUKSB8fFxuZnMvZXh0NC9mYXN0X2NvbW1pdC5jLTIyOC1cdFx0KEVYVDRfU0Ioc2IpLVx1MDAzZXNfbW91bnRfc3RhdGUgXHUwMDI2IEVYVDRfRkNfUkVQTEFZKSk7XG4tLVxuZnMvZXh0NC9mYXN0X2NvbW1pdC5jPTM5MD1zdGF0aWMgaW50IGV4dDRfZmNfdHJhY2tfdGVtcGxhdGUoXG4tLVxuZnMvZXh0NC9mYXN0X2NvbW1pdC5jLTQyMC1cdFx0XHRcdChzYmktXHUwMDNlc19qb3VybmFsLVx1MDAzZWpfZmxhZ3MgXHUwMDI2IEpCRDJfRlVMTF9DT01NSVRfT05HT0lORyB8fFxuZnMvZXh0NC9mYXN0X2NvbW1pdC5jOjQyMTpcdFx0XHRcdCBzYmktXHUwMDNlc19qb3VybmFsLVx1MDAzZWpfZmxhZ3MgXHUwMDI2IEpCRDJfRkFTVF9DT01NSVRfT05HT0lORykgP1xuZnMvZXh0NC9mYXN0X2NvbW1pdC5jLTQyMi1cdFx0XHRcdFx1MDAyNnNiaS1cdTAwM2VzX2ZjX3FbRkNfUV9TVEFHSU5HXSA6XG4tLVxuZnMvZXh0NC9mYXN0X2NvbW1pdC5jPTQzNT1zdGF0aWMgaW50IF9fdHJhY2tfZGVudHJ5X3VwZGF0ZShoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLFxuLS1cbmZzL2V4dDQvZmFzdF9jb21taXQuYy00NzEtXHRpZiAoc2JpLVx1MDAzZXNfam91cm5hbC1cdTAwM2VqX2ZsYWdzIFx1MDAyNiBKQkQyX0ZVTExfQ09NTUlUX09OR09JTkcgfHxcbmZzL2V4dDQvZmFzdF9jb21taXQuYzo0NzI6XHRcdHNiaS1cdTAwM2VzX2pvdXJuYWwtXHUwMDNlal9mbGFncyBcdTAwMjYgSkJEMl9GQVNUX0NPTU1JVF9PTkdPSU5HKVxuZnMvZXh0NC9mYXN0X2NvbW1pdC5jLTQ3My1cdFx0bGlzdF9hZGRfdGFpbChcdTAwMjZub2RlLVx1MDAzZWZjZF9saXN0LFxuLS1cbmZzL2V4dDQvZmFzdF9jb21taXQuYz0xNTY3PWludCBleHQ0X2ZjX2NvbW1pdChqb3VybmFsX3QgKmpvdXJuYWwsIHRpZF90IGNvbW1pdF90aWQpXG4tLVxuZnMvZXh0NC9mYXN0X2NvbW1pdC5jLTE1NzYtXG5mcy9leHQ0L2Zhc3RfY29tbWl0LmM6MTU3NzpcdGlmICghdGVzdF9vcHQyKHNiLCBKT1VSTkFMX0ZBU1RfQ09NTUlUKSlcbmZzL2V4dDQvZmFzdF9jb21taXQuYy0xNTc4LVx0XHRyZXR1cm4gamJkMl9jb21wbGV0ZV90cmFuc2FjdGlvbihqb3VybmFsLCBjb21taXRfdGlkKTtcbi0tXG5mcy9leHQ0L2Zhc3RfY29tbWl0LmM9MjY2NT12b2lkIGV4dDRfZmNfaW5pdChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBqb3VybmFsX3QgKmpvdXJuYWwpXG4tLVxuZnMvZXh0NC9mYXN0X2NvbW1pdC5jLTI2NzItXHRqb3VybmFsLVx1MDAzZWpfZmNfcmVwbGF5X2NhbGxiYWNrID0gZXh0NF9mY19yZXBsYXk7XG5mcy9leHQ0L2Zhc3RfY29tbWl0LmM6MjY3MzpcdGlmICghdGVzdF9vcHQyKHNiLCBKT1VSTkFMX0ZBU1RfQ09NTUlUKSlcbmZzL2V4dDQvZmFzdF9jb21taXQuYy0yNjc0LVx0XHRyZXR1cm47XG4tLVxuZnMvZXh0NC9mYXN0X2NvbW1pdC5oLTItXG5mcy9leHQ0L2Zhc3RfY29tbWl0Lmg6MzojaWZuZGVmIF9fRkFTVF9DT01NSVRfSF9fXG5mcy9leHQ0L2Zhc3RfY29tbWl0Lmg6NDojZGVmaW5lIF9fRkFTVF9DT01NSVRfSF9fXG5mcy9leHQ0L2Zhc3RfY29tbWl0LmgtNS1cbmZzL2V4dDQvZmFzdF9jb21taXQuaC02LS8qXG5mcy9leHQ0L2Zhc3RfY29tbWl0Lmg6NzogKiBOb3RlIHRoaXMgZmlsZSBpcyBwcmVzZW50IGluIGUyZnNwcm9ncy9saWIvZXh0MmZzL2Zhc3RfY29tbWl0LmggYW5kXG5mcy9leHQ0L2Zhc3RfY29tbWl0Lmg6ODogKiBsaW51eC9mcy9leHQ0L2Zhc3RfY29tbWl0LmguIFRoZXNlIGZpbGUgc2hvdWxkIGFsd2F5cyBiZSBieXRlIGlkZW50aWNhbC5cbmZzL2V4dDQvZmFzdF9jb21taXQuaC05LSAqL1xuLS1cbmZzL2V4dDQvZmFzdF9jb21taXQuaD0xNjM9c3RhdGljIGlubGluZSBjb25zdCBjaGFyICp0YWcyc3RyKF9fdTE2IHRhZylcbi0tXG5mcy9leHQ0L2Zhc3RfY29tbWl0LmgtMTg4LVxuZnMvZXh0NC9mYXN0X2NvbW1pdC5oOjE4OTojZW5kaWYgLyogX19GQVNUX0NPTU1JVF9IX18gKi9cbi0tXG5mcy9leHQ0L2lub2RlLmM9MzQ0MT1zdGF0aWMgYm9vbCBleHQ0X2lub2RlX2RhdGFzeW5jX2RpcnR5KHN0cnVjdCBpbm9kZSAqaW5vZGUpXG4tLVxuZnMvZXh0NC9pbm9kZS5jLTM0NDktXHRcdFx0cmV0dXJuIGZhbHNlO1xuZnMvZXh0NC9pbm9kZS5jOjM0NTA6XHRcdGlmICh0ZXN0X29wdDIoaW5vZGUtXHUwMDNlaV9zYiwgSk9VUk5BTF9GQVNUX0NPTU1JVCkpXG5mcy9leHQ0L2lub2RlLmMtMzQ1MS1cdFx0XHRyZXR1cm4gIWxpc3RfZW1wdHkoXHUwMDI2RVhUNF9JKGlub2RlKS1cdTAwM2VpX2ZjX2xpc3QpO1xuLS1cbmZzL2V4dDQvbmFtZWkuYz0zMjI4PWludCBfX2V4dDRfdW5saW5rKHN0cnVjdCBpbm9kZSAqZGlyLCBjb25zdCBzdHJ1Y3QgcXN0ciAqZF9uYW1lLFxuZnMvZXh0NC9uYW1laS5jLTMyMjktXHRcdCAgc3RydWN0IGlub2RlICppbm9kZSxcbmZzL2V4dDQvbmFtZWkuYzozMjMwOlx0XHQgIHN0cnVjdCBkZW50cnkgKmRlbnRyeSAvKiBOVUxMIGR1cmluZyBmYXN0X2NvbW1pdCByZWNvdmVyeSAqLylcbmZzL2V4dDQvbmFtZWkuYy0zMjMxLXtcbi0tXG5mcy9leHQ0L25hbWVpLmM9Mzc5OT1zdGF0aWMgaW50IGV4dDRfcmVuYW1lKHN0cnVjdCBtbnRfaWRtYXAgKmlkbWFwLCBzdHJ1Y3QgaW5vZGUgKm9sZF9kaXIsXG4tLVxuZnMvZXh0NC9uYW1laS5jLTQwMDktXHRcdFx0ZXh0NF9mY190cmFja191bmxpbmsoaGFuZGxlLCBuZXcuZGVudHJ5KTtcbmZzL2V4dDQvbmFtZWkuYzo0MDEwOlx0XHRpZiAodGVzdF9vcHQyKHNiLCBKT1VSTkFMX0ZBU1RfQ09NTUlUKSBcdTAwMjZcdTAwMjZcbmZzL2V4dDQvbmFtZWkuYy00MDExLVx0XHQgICAgIShFWFQ0X1NCKHNiKS1cdTAwM2VzX21vdW50X3N0YXRlIFx1MDAyNiBFWFQ0X0ZDX1JFUExBWSkgXHUwMDI2XHUwMDI2XG4tLVxuZnMvZXh0NC9zdXBlci5jPTE4OTU9c3RhdGljIGNvbnN0IHN0cnVjdCBtb3VudF9vcHRzIHtcbi0tXG5mcy9leHQ0L3N1cGVyLmMtMTk2Mi0jaWZkZWYgQ09ORklHX0VYVDRfREVCVUdcbmZzL2V4dDQvc3VwZXIuYzoxOTYzOlx0e09wdF9mY19kZWJ1Z19mb3JjZSwgRVhUNF9NT1VOVDJfSk9VUk5BTF9GQVNUX0NPTU1JVCxcbmZzL2V4dDQvc3VwZXIuYy0xOTY0LVx0IE1PUFRfU0VUIHwgTU9QVF8yIHwgTU9QVF9FWFQ0X09OTFl9LFxuLS1cbmZzL2V4dDQvc3VwZXIuYz00NDA0PXN0YXRpYyB2b2lkIGV4dDRfc2V0X2RlZl9vcHRzKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsXG4tLVxuZnMvZXh0NC9zdXBlci5jLTQ0MjItI2VuZGlmXG5mcy9leHQ0L3N1cGVyLmM6NDQyMzpcdGlmIChleHQ0X2hhc19mZWF0dXJlX2Zhc3RfY29tbWl0KHNiKSlcbmZzL2V4dDQvc3VwZXIuYzo0NDI0Olx0XHRzZXRfb3B0MihzYiwgSk9VUk5BTF9GQVNUX0NPTU1JVCk7XG5mcy9leHQ0L3N1cGVyLmMtNDQyNS1cdC8qIGRvbiYjMzk7dCBmb3JnZXQgdG8gZW5hYmxlIGpvdXJuYWxfY3N1bSB3aGVuIG1ldGFkYXRhX2NzdW0gaXMgZW5hYmxlZC4gKi9cbi0tXG5mcy9leHQ0L3N1cGVyLmM9NDUyMz1zdGF0aWMgdm9pZCBleHQ0X2F0b21pY193cml0ZV9pbml0KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpXG4tLVxuZnMvZXh0NC9zdXBlci5jLTQ1NDgtXG5mcy9leHQ0L3N1cGVyLmM6NDU0OTpzdGF0aWMgdm9pZCBleHQ0X2Zhc3RfY29tbWl0X2luaXQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYilcbmZzL2V4dDQvc3VwZXIuYy00NTUwLXtcbi0tXG5mcy9leHQ0L3N1cGVyLmM9NDk3Mz1zdGF0aWMgaW50IGV4dDRfbG9hZF9hbmRfaW5pdF9qb3VybmFsKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsXG4tLVxuZnMvZXh0NC9zdXBlci5jLTQ5OTYtXG5mcy9leHQ0L3N1cGVyLmM6NDk5NzpcdGlmICh0ZXN0X29wdDIoc2IsIEpPVVJOQUxfRkFTVF9DT01NSVQpIFx1MDAyNlx1MDAyNlxuZnMvZXh0NC9zdXBlci5jLTQ5OTgtXHRcdCFqYmQyX2pvdXJuYWxfc2V0X2ZlYXR1cmVzKEVYVDRfU0Ioc2IpLVx1MDAzZXNfam91cm5hbCwgMCwgMCxcbmZzL2V4dDQvc3VwZXIuYzo0OTk5Olx0XHRcdFx0XHQgIEpCRDJfRkVBVFVSRV9JTkNPTVBBVF9GQVNUX0NPTU1JVCkpIHtcbmZzL2V4dDQvc3VwZXIuYy01MDAwLVx0XHRleHQ0X21zZyhzYiwgS0VSTl9FUlIsXG4tLVxuZnMvZXh0NC9zdXBlci5jPTUwNTc9c3RhdGljIGludCBleHQ0X2NoZWNrX2pvdXJuYWxfZGF0YV9tb2RlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpXG4tLVxuZnMvZXh0NC9zdXBlci5jLTUwNjEtXHRcdFx0ICAgIFwmIzM0O2RhdGE9am91cm5hbCBkaXNhYmxlcyBkZWxheWVkIGFsbG9jYXRpb24sIFwmIzM0O1xuZnMvZXh0NC9zdXBlci5jOjUwNjI6XHRcdFx0ICAgIFwmIzM0O2Rpb3JlYWRfbm9sb2NrLCBPX0RJUkVDVCBhbmQgZmFzdF9jb21taXQgc3VwcG9ydCFcXG5cJiMzNDspO1xuZnMvZXh0NC9zdXBlci5jLTUwNjMtXHRcdC8qIGNhbiYjMzk7dCBtb3VudCB3aXRoIGJvdGggZGF0YT1qb3VybmFsIGFuZCBkaW9yZWFkX25vbG9jay4gKi9cbmZzL2V4dDQvc3VwZXIuYy01MDY0LVx0XHRjbGVhcl9vcHQoc2IsIERJT1JFQURfTk9MT0NLKTtcbmZzL2V4dDQvc3VwZXIuYzo1MDY1Olx0XHRjbGVhcl9vcHQyKHNiLCBKT1VSTkFMX0ZBU1RfQ09NTUlUKTtcbmZzL2V4dDQvc3VwZXIuYy01MDY2LVx0XHRpZiAodGVzdF9vcHQyKHNiLCBFWFBMSUNJVF9ERUxBTExPQykpIHtcbi0tXG5mcy9leHQ0L3N1cGVyLmM9NTM1Nz1zdGF0aWMgaW50IF9fZXh0NF9maWxsX3N1cGVyKHN0cnVjdCBmc19jb250ZXh0ICpmYywgc3RydWN0IHN1cGVyX2Jsb2NrICpzYilcbi0tXG5mcy9leHQ0L3N1cGVyLmMtNTUxMC1cdGV4dDRfYXRvbWljX3dyaXRlX2luaXQoc2IpO1xuZnMvZXh0NC9zdXBlci5jOjU1MTE6XHRleHQ0X2Zhc3RfY29tbWl0X2luaXQoc2IpO1xuZnMvZXh0NC9zdXBlci5jLTU1MTItXG4tLVxuZnMvZXh0NC9zdXBlci5jLTU1NTctXHRcdGNsZWFyX29wdChzYiwgREFUQV9GTEFHUyk7XG5mcy9leHQ0L3N1cGVyLmM6NTU1ODpcdFx0Y2xlYXJfb3B0MihzYiwgSk9VUk5BTF9GQVNUX0NPTU1JVCk7XG5mcy9leHQ0L3N1cGVyLmMtNTU1OS1cdFx0c2JpLVx1MDAzZXNfam91cm5hbCA9IE5VTEw7XG4tLVxuZnMvZXh0NC9zeXNmcy5jPTM2Mz1FWFQ0X0FUVFJfRkVBVFVSRShtZXRhZGF0YV9jc3VtX3NlZWQpO1xuZnMvZXh0NC9zeXNmcy5jOjM2NDpFWFQ0X0FUVFJfRkVBVFVSRShmYXN0X2NvbW1pdCk7XG5mcy9leHQ0L3N5c2ZzLmMtMzY1LSNpZiBJU19FTkFCTEVEKENPTkZJR19VTklDT0RFKSBcdTAwMjZcdTAwMjYgZGVmaW5lZChDT05GSUdfRlNfRU5DUllQVElPTilcbi0tXG5mcy9leHQ0L3N5c2ZzLmM9MzcyPXN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpleHQ0X2ZlYXRfYXR0cnNbXSA9IHtcbi0tXG5mcy9leHQ0L3N5c2ZzLmMtMzg2LVx0QVRUUl9MSVNUKG1ldGFkYXRhX2NzdW1fc2VlZCksXG5mcy9leHQ0L3N5c2ZzLmM6Mzg3Olx0QVRUUl9MSVNUKGZhc3RfY29tbWl0KSxcbmZzL2V4dDQvc3lzZnMuYy0zODgtI2lmIElTX0VOQUJMRUQoQ09ORklHX1VOSUNPREUpIFx1MDAyNlx1MDAyNiBkZWZpbmVkKENPTkZJR19GU19FTkNSWVBUSU9OKVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIwLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xNCAxNDozOTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuOC1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxNDcxNAoJCQkJCQkJb3V0cHV0OiAyNwoJCQkJCQkJdGhvdWdodHM6IDUwCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBoZXJlJiMzOTtzIG15IGludGVycHJldGF0aW9uIG9mIHRob3NlIHRob3VnaHRzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlLCBwcmVzZW50ZWQgaW4gdGhlIGZpcnN0IHBlcnNvbjoKCioqQW5hbHl6aW5nIHRoZSBleHQ0IEJ1aWxkIENvbmZpZ3VyYXRpb24qKgoKUmlnaHQsIGBmYXN0X2NvbW1pdC5vYCBpcyBhIGdpdmVuIOKAkyBpdCYjMzk7cyBwcmFjdGljYWxseSBiYWtlZCBpbnRvIGBleHQ0LXlgIHRoZSBtb21lbnQgYENPTkZJR19FWFQ0X0ZTYCBpcyBmbGlwcGVkIG9uLiBObyBzdXJwcmlzZXMgdGhlcmUuIEJ1dCBJJiMzOTttIGFsd2F5cyBsb29raW5nIGZvciBudWFuY2UsIGZvciB3aGVyZSB0aGUgbGV2ZXJzIGFyZS4gU28sIGxldCYjMzk7cyBkaXZlIGludG8gYGZzL2V4dDQvS2NvbmZpZ2AuIEkgd2FudCB0byBzZWUgKmV4YWN0bHkqIHdoYXQgY29udHJvbCB3ZSBoYXZlIG92ZXIgdGhlIGV4dDQgY29uZmlndXJhdGlvbi4gV2hhdCBvcHRpb25zIGFyZSBleHBvc2VkLCB3aGF0IGFyZSB0aGUgZGVwZW5kZW5jaWVzLCBhbmQgYXJlIHRoZXJlIGFueSBnb3RjaGFzIHRoYXQgYXJlbiYjMzk7dCBpbW1lZGlhdGVseSBvYnZpb3VzIGluIHRoZSBzb3VyY2UgaXRzZWxmPyBUaW1lIHRvIHNlZSBpZiB0aGVyZSYjMzk7cyBhbnl0aGluZyBtb3JlIGdvaW5nIG9uIHRoYXQmIzM5O3Mgd29ydGggbm90aW5nLiBQZXJoYXBzIHRoZXJlJiMzOTtzIGFuIGludGVyZXN0aW5nIGRlcGVuZGVuY3kgc3RydWN0dXJlLCBvciBtYXliZSBzb21lIGhpZGRlbiBjb25kaXRpb25hbCBidWlsZHMgdG8gY29uc2lkZXIuIExldCYjMzk7cyBzZWUgd2hhdCB0aGUgS2NvbmZpZyBmaWxlIGhvbGRzLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIxLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xNCAxNDozOTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtjb25maWcgRVhUNCYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O2ZzL2V4dDQmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7ZnMvZXh0NC9LY29uZmlnLTEtIyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vbmx5XG5mcy9leHQ0L0tjb25maWc6Mjpjb25maWcgRVhUNF9GU1xuZnMvZXh0NC9LY29uZmlnLTMtXHR0cmlzdGF0ZSBcJiMzNDtUaGUgRXh0ZW5kZWQgNCAoZXh0NCkgZmlsZXN5c3RlbVwmIzM0O1xuLS1cbmZzL2V4dDQvS2NvbmZpZy0zNC1cbmZzL2V4dDQvS2NvbmZpZzozNTpjb25maWcgRVhUNF9VU0VfRk9SX0VYVDJcbmZzL2V4dDQvS2NvbmZpZy0zNi1cdGJvb2wgXCYjMzQ7VXNlIGV4dDQgZm9yIGV4dDIgZmlsZSBzeXN0ZW1zXCYjMzQ7XG4tLVxuZnMvZXh0NC9LY29uZmlnLTQ1LVxuZnMvZXh0NC9LY29uZmlnOjQ2OmNvbmZpZyBFWFQ0X0ZTX1BPU0lYX0FDTFxuZnMvZXh0NC9LY29uZmlnLTQ3LVx0Ym9vbCBcJiMzNDtFeHQ0IFBPU0lYIEFjY2VzcyBDb250cm9sIExpc3RzXCYjMzQ7XG4tLVxuZnMvZXh0NC9LY29uZmlnLTU1LVxuZnMvZXh0NC9LY29uZmlnOjU2OmNvbmZpZyBFWFQ0X0ZTX1NFQ1VSSVRZXG5mcy9leHQ0L0tjb25maWctNTctXHRib29sIFwmIzM0O0V4dDQgU2VjdXJpdHkgTGFiZWxzXCYjMzQ7XG4tLVxuZnMvZXh0NC9LY29uZmlnLTY3LVxuZnMvZXh0NC9LY29uZmlnOjY4OmNvbmZpZyBFWFQ0X0RFQlVHXG5mcy9leHQ0L0tjb25maWctNjktXHRib29sIFwmIzM0O0V4dDQgZGVidWdnaW5nIHN1cHBvcnRcJiMzNDtcbi0tXG5mcy9leHQ0L0tjb25maWctNzYtXG5mcy9leHQ0L0tjb25maWc6Nzc6Y29uZmlnIEVYVDRfS1VOSVRfVEVTVFNcbmZzL2V4dDQvS2NvbmZpZy03OC1cdHRyaXN0YXRlIFwmIzM0O0tVbml0IHRlc3RzIGZvciBleHQ0XCYjMzQ7IGlmICFLVU5JVF9BTExfVEVTVFNcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yMi8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTQgMTQ6Mzk8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjgtZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTUzNTcKCQkJCQkJCW91dHB1dDogMzMKCQkJCQkJCXRob3VnaHRzOiAyMAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBteSBzdW1tYXJ5LCBhcyB0aG91Z2ggSSYjMzk7bSB0aGlua2luZyB0aHJvdWdoIHRoaXMgcHJvY2VzczoKCioqRGl2aW5nIGludG8gdGhlIEVYVDQgQ29uZmlndXJhdGlvbioqCgpPa2F5LCBzbyBJIG5lZWQgdG8gdW5kZXJzdGFuZCBob3cgdGhlIEVYVDQgZmlsZXN5c3RlbSBjb25maWd1cmF0aW9uIGlzIGhhbmRsZWQgaW4gdGhpcyBrZXJuZWwgYnVpbGQuIFRpbWUgdG8gaGVhZCBzdHJhaWdodCB0byBgZnMvZXh0NC9LY29uZmlnYC4gVGhhdCYjMzk7cyB3aGVyZSBhbGwgdGhlIHJlbGV2YW50IG9wdGlvbnMgc2hvdWxkIGJlIGRlZmluZWQsIGVzcGVjaWFsbHkgdGhvc2UgY29udHJvbGxpbmcgd2hldGhlciB0aGUgRVhUNCBmaWxlc3lzdGVtIHN1cHBvcnQgaXMgZXZlbiBpbmNsdWRlZC4gSSYjMzk7bSBwcmltYXJpbHkgaW50ZXJlc3RlZCBpbiB0aGUgYEVYVDRfRlNgIHN5bWJvbCBpdHNlbGYsIHdoaWNoIGlzIHRoZSBiaWcgc3dpdGNoLCBidXQgSSYjMzk7bGwgcHJvYmFibHkgc2NhbiBhcm91bmQgaXQgdG8gZ2V0IGEgc2Vuc2Ugb2YgdGhlIGRlcGVuZGVuY2llcyBhbmQgcmVsYXRlZCBvcHRpb25zLiBJIHdhbnQgdG8gc2VlIGhvdyBpdCYjMzk7cyBjb25uZWN0ZWQgdG8gb3RoZXIgZmVhdHVyZXMsIGFueSBkZWZhdWx0IHNldHRpbmdzLCBhbmQgaWYgdGhlcmUgYXJlIGFueSBjb25kaXRpb25hbCBpbmNsdXNpb25zIGJhc2VkIG9uIGFyY2hpdGVjdHVyZSBvciBvdGhlciBrZXJuZWwgY29uZmlndXJhdGlvbnMuIEkmIzM5O20gZXhwZWN0aW5nIHRvIGZpbmQgYSB0eXBpY2FsIEtjb25maWcgc3RydWN0dXJlIOKAkyBzb21lIGBib29sYCBhbmQgYHRyaXN0YXRlYCBvcHRpb25zLCBtYXliZSBzb21lIGRlcGVuZGVuY2llcyBvbiBvdGhlciBmaWxlc3lzdGVtIG9yIGhhcmR3YXJlIGRyaXZlcnMuIFRoZSBnb2FsIGlzIHRvIGZ1bGx5IGdyYXNwIGhvdyBFWFQ0IGlzIGVuYWJsZWQgYW5kIGNvbmZpZ3VyZWQgd2l0aGluIHRoaXMgcGFydGljdWxhciBidWlsZCBlbnZpcm9ubWVudC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yMy8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTQgMTQ6Mzk8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtmcy9leHQ0L0tjb25maWcmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAxLAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDM1Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OyAgIDE6XHQjIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9ubHlcbiAgIDI6XHRjb25maWcgRVhUNF9GU1xuICAgMzpcdFx0dHJpc3RhdGUgXCYjMzQ7VGhlIEV4dGVuZGVkIDQgKGV4dDQpIGZpbGVzeXN0ZW1cJiMzNDtcbiAgIDQ6XHRcdHNlbGVjdCBCVUZGRVJfSEVBRFxuICAgNTpcdFx0c2VsZWN0IEpCRDJcbiAgIDY6XHRcdHNlbGVjdCBDUkMxNlxuICAgNzpcdFx0c2VsZWN0IENSQzMyXG4gICA4Olx0XHRzZWxlY3QgRlNfSU9NQVBcbiAgIDk6XHRcdHNlbGVjdCBGU19FTkNSWVBUSU9OX0FMR1MgaWYgRlNfRU5DUllQVElPTlxuICAxMDpcdFx0aGVscFxuICAxMTpcdFx0ICBUaGlzIGlzIHRoZSBuZXh0IGdlbmVyYXRpb24gb2YgdGhlIGV4dDMgZmlsZXN5c3RlbS5cbiAgMTI6XHRcbiAgMTM6XHRcdCAgVW5saWtlIHRoZSBjaGFuZ2UgZnJvbSBleHQyIGZpbGVzeXN0ZW0gdG8gZXh0MyBmaWxlc3lzdGVtLFxuICAxNDpcdFx0ICB0aGUgb24tZGlzayBmb3JtYXQgb2YgZXh0NCBpcyBub3QgZm9yd2FyZHMgY29tcGF0aWJsZSB3aXRoXG4gIDE1Olx0XHQgIGV4dDM7IGl0IGlzIGJhc2VkIG9uIGV4dGVudCBtYXBzIGFuZCBpdCBzdXBwb3J0cyA0OC1iaXRcbiAgMTY6XHRcdCAgcGh5c2ljYWwgYmxvY2sgbnVtYmVycy4gIFRoZSBleHQ0IGZpbGVzeXN0ZW0gYWxzbyBzdXBwb3J0cyBkZWxheWVkXG4gIDE3Olx0XHQgIGFsbG9jYXRpb24sIHBlcnNpc3RlbnQgcHJlYWxsb2NhdGlvbiwgaGlnaCByZXNvbHV0aW9uIHRpbWUgc3RhbXBzLFxuICAxODpcdFx0ICBhbmQgYSBudW1iZXIgb2Ygb3RoZXIgZmVhdHVyZXMgdG8gaW1wcm92ZSBwZXJmb3JtYW5jZSBhbmQgc3BlZWRcbiAgMTk6XHRcdCAgdXAgZnNjayB0aW1lLiAgRm9yIG1vcmUgaW5mb3JtYXRpb24sIHBsZWFzZSBzZWUgdGhlIHdlYiBwYWdlcyBhdFxuICAyMDpcdFx0ICBodHRwOi8vZXh0NC53aWtpLmtlcm5lbC5vcmcuXG4gIDIxOlx0XG4gIDIyOlx0XHQgIFRoZSBleHQ0IGZpbGVzeXN0ZW0gc3VwcG9ydHMgbW91bnRpbmcgYW4gZXh0MyBmaWxlc3lzdGVtOyB3aGlsZSB0aGVyZVxuICAyMzpcdFx0ICBhcmUgc29tZSBwZXJmb3JtYW5jZSBnYWlucyBmcm9tIHRoZSBkZWxheWVkIGFsbG9jYXRpb24gYW5kIGlub2RlXG4gIDI0Olx0XHQgIHRhYmxlIHJlYWRhaGVhZCwgdGhlIGJlc3QgcGVyZm9ybWFuY2UgZ2FpbnMgcmVxdWlyZSBlbmFibGluZyBleHQ0XG4gIDI1Olx0XHQgIGZlYXR1cmVzIGluIHRoZSBmaWxlc3lzdGVtIHVzaW5nIHR1bmUyZnMsIG9yIGZvcm1hdHRpbmcgYSBuZXdcbiAgMjY6XHRcdCAgZmlsZXN5c3RlbSBhcyBhbiBleHQ0IGZpbGVzeXN0ZW0gaW5pdGlhbGx5LiBXaXRob3V0IGV4cGxpY2l0IGVuYWJsaW5nXG4gIDI3Olx0XHQgIG9mIGV4dDQgZmVhdHVyZXMsIHRoZSBvbiBkaXNrIGZpbGVzeXN0ZW0gZm9ybWF0IHN0YXlzIGZ1bGx5IGJhY2t3YXJkXG4gIDI4Olx0XHQgIGNvbXBhdGlibGUuXG4gIDI5Olx0XG4gIDMwOlx0XHQgIFRvIGNvbXBpbGUgdGhpcyBmaWxlIHN5c3RlbSBzdXBwb3J0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiBUaGVcbiAgMzE6XHRcdCAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGV4dDQuXG4gIDMyOlx0XG4gIDMzOlx0XHQgIElmIHVuc3VyZSwgc2F5IE4uXG4gIDM0Olx0XG4gIDM1Olx0Y29uZmlnIEVYVDRfVVNFX0ZPUl9FWFQyXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjQvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE0IDE0OjM5PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy44LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDE2MTU0CgkJCQkJCQlvdXRwdXQ6IDM4CgkJCQkJCQl0aG91Z2h0czogMzIKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgdGhpbmtpbmcgcHJvY2VzczoKCioqRGl2aW5nIGludG8gdGhlIGV4dDQgQ29kZWJhc2UqKgoKT2theSwgc28gSSBzZWUgYENPTkZJR19FWFQ0X0ZTYCwgdGhhdCYjMzk7cyB0aGUga2VybmVsIGNvbmZpZ3VyYXRpb24gb3B0aW9uLiBNeSBpbW1lZGlhdGUgaW5zdGluY3QgaXMgdG8gZGlnIGludG8gdGhlIGNvbnRleHQgb2YgYGV4dDRfZXh0X2NsZWFyX2JiYC4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgaXRzIHJvbGUgd2l0aGluIHRoZSBsYXJnZXIgZXh0NCBmaWxlc3lzdGVtIGltcGxlbWVudGF0aW9uLiBJIHdhbnQgdG8gc2VlIGhvdyB0aGlzIGZ1bmN0aW9uIGlzIHVzZWQsIGhvdyBpdCBpbnRlcmFjdHMgd2l0aCBvdGhlciBwYXJ0cyBvZiB0aGUgZXh0NCBjb2RlLCBhbmQgd2hhdCBpdHMgc3BlY2lmaWMgcHVycG9zZSBpcyB3aXRoaW4gdGhlIGxhcmdlciBhcmNoaXRlY3R1cmUuIEkgbmVlZCB0aGUgZnVsbCBwaWN0dXJlIHRvIHVuZGVyc3RhbmQgaXRzIHNpZ25pZmljYW5jZS4gTGV0JiMzOTtzIGdldCBjcmFja2luZy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yNS8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTQgMTQ6NDA8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtmcy9leHQ0L2V4dGVudHMuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDYzMzUsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogNjUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7NjMzNTpcdFx0ZXh0NF9mcmVlX2V4dF9wYXRoKHBhdGgyKTtcbjYzMzY6XHRcdHJldHVybiAwO1xuNjMzNzpcdH1cbjYzMzg6XHRcbjYzMzk6XHRpbnQgZXh0NF9leHRfY2xlYXJfYmIoc3RydWN0IGlub2RlICppbm9kZSlcbjYzNDA6XHR7XG42MzQxOlx0XHRzdHJ1Y3QgZXh0NF9leHRfcGF0aCAqcGF0aCA9IE5VTEw7XG42MzQyOlx0XHRzdHJ1Y3QgZXh0NF9leHRlbnQgKmV4O1xuNjM0MzpcdFx0ZXh0NF9sYmxrX3QgY3VyID0gMCwgZW5kO1xuNjM0NDpcdFx0aW50IGosIHJldCA9IDA7XG42MzQ1Olx0XHRzdHJ1Y3QgZXh0NF9tYXBfYmxvY2tzIG1hcDtcbjYzNDY6XHRcbjYzNDc6XHRcdGlmIChleHQ0X3Rlc3RfaW5vZGVfZmxhZyhpbm9kZSwgRVhUNF9JTk9ERV9JTkxJTkVfREFUQSkpXG42MzQ4Olx0XHRcdHJldHVybiAwO1xuNjM0OTpcdFxuNjM1MDpcdFx0LyogRGV0ZXJtaW4gdGhlIHNpemUgb2YgdGhlIGZpbGUgZmlyc3QgKi9cbjYzNTE6XHRcdHBhdGggPSBleHQ0X2ZpbmRfZXh0ZW50KGlub2RlLCBFWFRfTUFYX0JMT0NLUyAtIDEsIE5VTEwsXG42MzUyOlx0XHRcdFx0XHRcdEVYVDRfRVhfTk9DQUNIRSk7XG42MzUzOlx0XHRpZiAoSVNfRVJSKHBhdGgpKVxuNjM1NDpcdFx0XHRyZXR1cm4gUFRSX0VSUihwYXRoKTtcbjYzNTU6XHRcdGV4ID0gcGF0aFtwYXRoLVx1MDAzZXBfZGVwdGhdLnBfZXh0O1xuNjM1NjpcdFx0aWYgKCFleClcbjYzNTc6XHRcdFx0Z290byBvdXQ7XG42MzU4Olx0XHRlbmQgPSBsZTMyX3RvX2NwdShleC1cdTAwM2VlZV9ibG9jaykgJiM0MzsgZXh0NF9leHRfZ2V0X2FjdHVhbF9sZW4oZXgpO1xuNjM1OTpcdFxuNjM2MDpcdFx0Y3VyID0gMDtcbjYzNjE6XHRcdHdoaWxlIChjdXIgXHUwMDNjIGVuZCkge1xuNjM2MjpcdFx0XHRtYXAubV9sYmxrID0gY3VyO1xuNjM2MzpcdFx0XHRtYXAubV9sZW4gPSBlbmQgLSBjdXI7XG42MzY0Olx0XHRcdHJldCA9IGV4dDRfbWFwX2Jsb2NrcyhOVUxMLCBpbm9kZSwgXHUwMDI2bWFwLCAwKTtcbjYzNjU6XHRcdFx0aWYgKHJldCBcdTAwM2MgMClcbjYzNjY6XHRcdFx0XHRnb3RvIG91dDtcbjYzNjc6XHRcdFx0aWYgKHJldCBcdTAwM2UgMCkge1xuNjM2ODpcdFx0XHRcdHBhdGggPSBleHQ0X2ZpbmRfZXh0ZW50KGlub2RlLCBtYXAubV9sYmxrLCBwYXRoLCAwKTtcbjYzNjk6XHRcdFx0XHRpZiAoSVNfRVJSKHBhdGgpKSB7XG42MzcwOlx0XHRcdFx0XHRyZXQgPSBQVFJfRVJSKHBhdGgpO1xuNjM3MTpcdFx0XHRcdFx0Z290byBvdXQ7XG42MzcyOlx0XHRcdFx0fVxuNjM3MzpcdFx0XHRcdGZvciAoaiA9IDA7IGogXHUwMDNjIHBhdGgtXHUwMDNlcF9kZXB0aDsgaiYjNDM7JiM0MzspIHtcbjYzNzQ6XHRcdFx0XHRcdGV4dDRfbWJfbWFya19iYihpbm9kZS1cdTAwM2VpX3NiLFxuNjM3NTpcdFx0XHRcdFx0XHRcdHBhdGhbal0ucF9ibG9jaywgMSwgZmFsc2UpO1xuNjM3NjpcdFx0XHRcdFx0cmV0ID0gZXh0NF9mY19yZWNvcmRfcmVnaW9ucyhpbm9kZS1cdTAwM2VpX3NiLFxuNjM3NzpcdFx0XHRcdFx0XHRcdFx0ICAgICBpbm9kZS1cdTAwM2VpX2lubywgMCxcbjYzNzg6XHRcdFx0XHRcdFx0XHRcdCAgICAgcGF0aFtqXS5wX2Jsb2NrLCAxLCAxKTtcbjYzNzk6XHRcdFx0XHRcdGlmIChyZXQpXG42MzgwOlx0XHRcdFx0XHRcdGdvdG8gb3V0O1xuNjM4MTpcdFx0XHRcdH1cbjYzODI6XHRcdFx0XHRleHQ0X21iX21hcmtfYmIoaW5vZGUtXHUwMDNlaV9zYiwgbWFwLm1fcGJsaywgbWFwLm1fbGVuLCBmYWxzZSk7XG42MzgzOlx0XHRcdFx0cmV0ID0gZXh0NF9mY19yZWNvcmRfcmVnaW9ucyhpbm9kZS1cdTAwM2VpX3NiLCBpbm9kZS1cdTAwM2VpX2lubyxcbjYzODQ6XHRcdFx0XHRcdFx0XHQgICAgIG1hcC5tX2xibGssIG1hcC5tX3BibGssIG1hcC5tX2xlbiwgMSk7XG42Mzg1Olx0XHRcdFx0aWYgKHJldClcbjYzODY6XHRcdFx0XHRcdGdvdG8gb3V0O1xuNjM4NzpcdFx0XHR9XG42Mzg4Olx0XHRcdGN1ciA9IGN1ciAmIzQzOyBtYXAubV9sZW47XG42Mzg5Olx0XHR9XG42MzkwOlx0XG42MzkxOlx0b3V0OlxuNjM5MjpcdFx0ZXh0NF9mcmVlX2V4dF9wYXRoKHBhdGgpO1xuNjM5MzpcdFx0cmV0dXJuIHJldCBcdTAwM2MgMCA/IHJldCA6IDA7XG42Mzk0Olx0fVxuNjM5NTpcdFxuNjM5NjpcdCNpZiBJU19FTkFCTEVEKENPTkZJR19FWFQ0X0tVTklUX1RFU1RTKVxuNjM5NzpcdGludCBleHQ0X2V4dF9zcGFjZV9yb290X2lkeF90ZXN0KHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBjaGVjaylcbjYzOTg6XHR7XG42Mzk5Olx0XHRyZXR1cm4gZXh0NF9leHRfc3BhY2Vfcm9vdF9pZHgoaW5vZGUsIGNoZWNrKTtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yNi8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTQgMTQ6NDA8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjgtZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTc0MjEKCQkJCQkJCW91dHB1dDogMzIKCQkJCQkJCXRob3VnaHRzOiAzNzkKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIHRoZSBFeHQ0IEJsb2NrIENsZWFyaW5nIExvZ2ljKioKCk9rYXksIGxldCYjMzk7cyBicmVhayB0aGlzIGRvd24uIEkmIzM5O20gbG9va2luZyBhdCB0aGUgYGV4dDRfZXh0X2NsZWFyX2JiYCBmdW5jdGlvbiwgc3BlY2lmaWNhbGx5IGhvdyBpdCBoYW5kbGVzIHBvdGVudGlhbCBlcnJvcnMuIFRoZSBjb3JlIGxvZ2ljIGl0ZXJhdGVzIHRocm91Z2ggZXh0ZW50cywgYW5kIHRoZSBjcnVjaWFsIHRoaW5nIGlzIGhvdyBpdCBoYW5kbGVzIHRoZSByZXR1cm4gdmFsdWVzLiBJZiBpdCBmaW5kcyBhICYjMzk7aG9sZSYjMzk7IChgcmV0ID09IDBgKSwgaXQgY29ycmVjdGx5IGluY3JlbWVudHMgYGN1cmAgYnkgdGhlIG1hcCBsZW5ndGguIElmIGl0IGZpbmRzIGJsb2NrcyAoYHJldCAmZ3Q7IDBgKSwgdGhhdCYjMzk7cyBnb29kLiBCdXQgaGVyZSYjMzk7cyB0aGUga2lja2VyOiBhbiBlcnJvciAoYHJldCAmbHQ7IDBgKSBub3cganVtcHMgZGlyZWN0bHkgdG8gYG91dGAgaW5zdGVhZCBvZiBhIGZsYXdlZCBlYXJsaWVyIGFwcHJvYWNoLgoKVGhlIG9yaWdpbmFsIGNvZGUmIzM5O3MgZXJyb3IgaGFuZGxpbmcgc2VlbWVkIHN1c3BlY3QuIElmIGBleHQ0X2ZpbmRfZXh0ZW50YCByZXR1cm5lZCBhbiBlcnJvciwgdGhlIGNvZGUgKnByZXZpb3VzbHkqIHdvdWxkIHRyeSB0byBjb250aW51ZSB1c2luZyBwb3RlbnRpYWxseSBpbnZhbGlkIGRhdGEgaW4gYG1hcGAgLSBhbmQgdGhlbiBjYWxsIGBleHQ0X2ZpbmRfZXh0ZW50YCBhZ2FpbiB3aXRoIGEgbnVsbCBwYXRoLiBUaGF04oCZcyBhIHJlY2lwZSBmb3IgZGlzYXN0ZXIhIFRoZSAqZml4KiBpcyBub3cgdG8gcHJvcGVybHkgcmV0dXJuIHRoZSBlcnJvciwgYW5kIGp1bXAgb3V0LgoKVGhlIGNvZGUgbm93IGFsc28gZXhwbGljaXRseSBjaGVja3MgZm9yIGVycm9ycyBmcm9tIGBleHQ0X2ZjX3JlY29yZF9yZWdpb25zYCwganVtcGluZyB0byBgb3V0YCBpZiBpdCBmYWlscy4gVGhlIGBvdXRgIGxhYmVsIHByb3Blcmx5IGZyZWVzIHRoZSBgcGF0aGAg4oCTIGl0IGhhbmRsZXMgY2FzZXMgd2hlcmUgYHBhdGhgIGlzIGFuIGVycm9yIG9yIG51bGwgd2l0aCBgZXh0NF9mcmVlX2V4dF9wYXRoYCwgYW5kIHRoZSByZXR1cm4gdmFsdWUgaXMgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIGlmIHRoZXJlIHdhcyBvbmUsIG90aGVyd2lzZSBpdCByZXR1cm5zIDAuCgpUaGUgY2FsbCB0byBgZXh0NF9leHRfY2xlYXJfYmJgIGluIGBleHQ0X2ZjX3JlcGxheV9pbm9kZWAgaXMgY2xlYW4g4oCTIGl0IGNvcnJlY3RseSBjaGVja3MgdGhlIHJldHVybiB2YWx1ZSBhbmQgZXhpdHMgb24gZXJyb3IsIGZyZWVpbmcgdGhlIGlub2RlLiBUaGUgaW50ZW50IGlzIGNsZWFyLgoKVG8gZ2V0IHRoZSBmdWxsIHBpY3R1cmUsIEkgbmVlZCB0byBjaGVjayB0aGUgZ2l0IGxvZyB0byB1bmRlcnN0YW5kIHRoZSBjb250ZXh0IG9mIHRoaXMgY2hhbmdlLiBJIG5lZWQgdG8ga25vdyAqd2hhdCogcHJvYmxlbSB0aGlzIGNvbW1pdCBzcGVjaWZpY2FsbHkgYWRkcmVzc2VzLCB3aGF0IHRoZSBvcmlnaW5hbCBidWcgd2FzLCBhbmQgd2hhdCBlZGdlIGNhc2VzIHRoZSBuZXcgbG9naWMgY29ycmVjdHMuIEkgbmVlZCB0byB1bmRlcnN0YW5kIHdoeSB0aGlzIHdhcyBjaGFuZ2VkLCBhbmQgaG93IHRoZSBjaGFuZ2VzIGltcHJvdmUgcmVsaWFiaWxpdHkgYW5kIGNvcnJlY3RuZXNzLCBhbmQgaG93IHRoaXMgcmVsYXRlcyB0byBGYXN0IENvbW1pdC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yNy8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTQgMTQ6NDA8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7ZXh0NF9leHRfY2xlYXJfYmImIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtmcy9leHQ0JiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2ZzL2V4dDQvZXh0NC5oPTM5NTc9ZXh0ZXJuIGludCBleHQ0X2V4dF9yZXBsYXlfdXBkYXRlX2V4KHN0cnVjdCBpbm9kZSAqaW5vZGUsIGV4dDRfbGJsa190IHN0YXJ0LFxuZnMvZXh0NC9leHQ0LmgtMzk1OC1cdFx0aW50IGxlbiwgaW50IHVud3JpdHRlbiwgZXh0NF9mc2Jsa190IHBibGspO1xuZnMvZXh0NC9leHQ0Lmg6Mzk1OTpleHRlcm4gaW50IGV4dDRfZXh0X2NsZWFyX2JiKHN0cnVjdCBpbm9kZSAqaW5vZGUpO1xuZnMvZXh0NC9leHQ0LmgtMzk2MC1cbi0tXG5mcy9leHQ0L2V4dGVudHMuYz02MjUyPWludCBleHQ0X2V4dF9yZXBsYXlfc2V0X2libG9ja3Moc3RydWN0IGlub2RlICppbm9kZSlcbi0tXG5mcy9leHQ0L2V4dGVudHMuYy02MzM4LVxuZnMvZXh0NC9leHRlbnRzLmM6NjMzOTppbnQgZXh0NF9leHRfY2xlYXJfYmIoc3RydWN0IGlub2RlICppbm9kZSlcbmZzL2V4dDQvZXh0ZW50cy5jLTYzNDAte1xuLS1cbmZzL2V4dDQvZmFzdF9jb21taXQuYz0xOTI1PXN0YXRpYyBpbnQgZXh0NF9mY19yZXBsYXlfaW5vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYixcbi0tXG5mcy9leHQ0L2Zhc3RfY29tbWl0LmMtMTk0My1cdGlmICghSVNfRVJSKGlub2RlKSkge1xuZnMvZXh0NC9mYXN0X2NvbW1pdC5jOjE5NDQ6XHRcdHJldCA9IGV4dDRfZXh0X2NsZWFyX2JiKGlub2RlKTtcbmZzL2V4dDQvZmFzdF9jb21taXQuYy0xOTQ1LVx0XHRpcHV0KGlub2RlKTtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yOC8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTQgMTQ6NDA8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjgtZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTg2MTQKCQkJCQkJCW91dHB1dDogMzkKCQkJCQkJCXRob3VnaHRzOiAzMDkKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqRnV6emluZyBFeHQ0OiBXb3J0aCBJdCBhbmQgSG93IHRvIEFwcHJvYWNoIEl0KioKCk9rYXksIHNvIHRoZSBxdWVzdGlvbiBpcywgY2FuIHdlIGFjdHVhbGx5IGhpdCB0aGlzIGNvZGUgd2l0aCBhIGZ1enplciBsaWtlIHN5emthbGxlciBpbiBhIHN0YW5kYXJkIHNldHVwPyBUaGUgYW5zd2VyJiMzOTtzIGEgcmVzb3VuZGluZyB5ZXMhIEV4dDQgaXMgYSBiZWRyb2NrIGZpbGVzeXN0ZW0gaW4gTGludXgsIHNvIGl0JiMzOTtzIGEgcHJpbWUgdGFyZ2V0LiBTcGVjaWZpY2FsbHksIGlmIHdlIG1vdW50IGFuIGV4dDQgaW1hZ2UgYW5kIHRyaWdnZXIgYSBmYXN0IGNvbW1pdCBsb2cgcmVwbGF5ICh3aGljaCBzeXprYWxsZXIgZG9lcyB3aXRoIHJhdyBmaWxlc3lzdGVtIGZ1enppbmcpLCB3ZSBjYW4gZ2V0IHJpZ2h0IGludG8gYGV4dDRfZmNfcmVwbGF5YCAtJmd0OyBgZXh0NF9mY19yZXBsYXlfaW5vZGVgIC0mZ3Q7IGBleHQ0X2V4dF9jbGVhcl9iYmAuIEZhc3QgY29tbWl0IG9wZXJhdGlvbnMgY2FuIGFsc28gcG9wIHVwIGR1cmluZyByb3V0aW5lIGZpbGVzeXN0ZW0gb3BlcmF0aW9ucywgbGlrZSB3aGVuIGBmc3luY2AgaXMgY2FsbGVkLgoKVGhlIGtleSBoZXJlIGlzIHRoYXQgdGhpcyBpcyBjb3JlIGZpbGVzeXN0ZW0gY29kZSwgc2l0dGluZyByaWdodCBpbiBgZnMvZXh0NC9gLiBUaGlzIG1lYW5zIHdlJiMzOTtyZSB0YWxraW5nIGFib3V0IGZ1bmRhbWVudGFsIHN0dWZmIOKAkyBlcnJvciBoYW5kbGluZywgY29udHJvbCBmbG93LCBhbmQgcmVzb3VyY2UgY2xlYW51cCB3aXRoaW4gYGV4dDRfZXh0X2NsZWFyX2JiYCBhbmQgYGV4dDRfZmNfcmVwbGF5X2lub2RlYC4gVGhhdCBtYWtlcyBpdCBpbmhlcmVudGx5IGludGVyZXN0aW5nIGZyb20gYSBmdXp6aW5nIHBlcnNwZWN0aXZlLCBhbmQgdGhlIHBvdGVudGlhbCBmb3IgdW5jb3ZlcmluZyBidWdzIHNlZW1zIGhpZ2guIFRoZXJlZm9yZSwgV29ydGhGdXp6aW5nIGlzIFRSVUUuCgpOb3csIHdoaWNoIHN5bWJvbHMgc2hvdWxkIHdlIHByaW9yaXRpemU/IExldCYjMzk7cyB6b29tIGluIG9uIHRoZSBmdW5jdGlvbnMgZGlyZWN0bHkgbW9kaWZpZWQgb3IgZGlyZWN0bHkgY29ubmVjdGVkIHRvIHRoaXMgcG90ZW50aWFsIHZ1bG5lcmFiaWxpdHkuIFRoZSBtb2RpZmllZCBmdW5jdGlvbnMgYXJlOiBgZXh0NF9leHRfY2xlYXJfYmJgIChpbiBgZnMvZXh0NC9leHRlbnRzLmNgKSBhbmQgYGV4dDRfZmNfcmVwbGF5X2lub2RlYCAoaW4gYGZzL2V4dDQvZmFzdF9jb21taXQuY2ApLiBCdXQsIGFyZSB0aGVyZSBhbnkgb3RoZXIgZnVuY3Rpb25zIGludm9sdmVkPyBUaGUgY2FsbGVyIG9mIGBleHQ0X2ZjX3JlcGxheV9pbm9kZWAgaXMgYGV4dDRfZmNfcmVwbGF5YCwgd2hpY2ggaXMgYWxzbyBpbiBgZmFzdF9jb21taXQuY2AuIFNvIGxldCYjMzk7cyBhZGQgYGV4dDRfZmNfcmVwbGF5YCB0byBvdXIgbGlzdCB0byBleGFtaW5lLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI5LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xNCAxNDo0MDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O2ZzL2V4dDQvZmFzdF9jb21taXQuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDI1NzAsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogNDAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7MjU3MDpcdCAqIE1haW4gcmVjb3ZlcnkgcGF0aCBlbnRyeSBwb2ludC5cbjI1NzE6XHQgKiBUaGUgbWVhbmluZyBvZiByZXR1cm4gY29kZXMgaXMgc2ltaWxhciBhcyBhYm92ZS5cbjI1NzI6XHQgKi9cbjI1NzM6XHRzdGF0aWMgaW50IGV4dDRfZmNfcmVwbGF5KGpvdXJuYWxfdCAqam91cm5hbCwgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCxcbjI1NzQ6XHRcdFx0XHRcdGVudW0gcGFzc3R5cGUgcGFzcywgaW50IG9mZiwgdGlkX3QgZXhwZWN0ZWRfdGlkKVxuMjU3NTpcdHtcbjI1NzY6XHRcdHN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBqb3VybmFsLVx1MDAzZWpfcHJpdmF0ZTtcbjI1Nzc6XHRcdHN0cnVjdCBleHQ0X3NiX2luZm8gKnNiaSA9IEVYVDRfU0Ioc2IpO1xuMjU3ODpcdFx0c3RydWN0IGV4dDRfZmNfdGxfbWVtIHRsO1xuMjU3OTpcdFx0X191OCAqc3RhcnQsICplbmQsICpjdXIsICp2YWw7XG4yNTgwOlx0XHRpbnQgcmV0ID0gSkJEMl9GQ19SRVBMQVlfQ09OVElOVUU7XG4yNTgxOlx0XHRzdHJ1Y3QgZXh0NF9mY19yZXBsYXlfc3RhdGUgKnN0YXRlID0gXHUwMDI2c2JpLVx1MDAzZXNfZmNfcmVwbGF5X3N0YXRlO1xuMjU4MjpcdFx0c3RydWN0IGV4dDRfZmNfdGFpbCB0YWlsO1xuMjU4MzpcdFxuMjU4NDpcdFx0aWYgKHBhc3MgPT0gUEFTU19TQ0FOKSB7XG4yNTg1Olx0XHRcdHN0YXRlLVx1MDAzZWZjX2N1cnJlbnRfcGFzcyA9IFBBU1NfU0NBTjtcbjI1ODY6XHRcdFx0cmV0dXJuIGV4dDRfZmNfcmVwbGF5X3NjYW4oam91cm5hbCwgYmgsIG9mZiwgZXhwZWN0ZWRfdGlkKTtcbjI1ODc6XHRcdH1cbjI1ODg6XHRcbjI1ODk6XHRcdGlmIChzdGF0ZS1cdTAwM2VmY19jdXJyZW50X3Bhc3MgIT0gcGFzcykge1xuMjU5MDpcdFx0XHRzdGF0ZS1cdTAwM2VmY19jdXJyZW50X3Bhc3MgPSBwYXNzO1xuMjU5MTpcdFx0XHRzYmktXHUwMDNlc19tb3VudF9zdGF0ZSB8PSBFWFQ0X0ZDX1JFUExBWTtcbjI1OTI6XHRcdH1cbjI1OTM6XHRcdGlmICghc2JpLVx1MDAzZXNfZmNfcmVwbGF5X3N0YXRlLmZjX3JlcGxheV9udW1fdGFncykge1xuMjU5NDpcdFx0XHRleHQ0X2RlYnVnKFwmIzM0O1JlcGxheSBzdG9wc1xcblwmIzM0Oyk7XG4yNTk1Olx0XHRcdGV4dDRfZmNfc2V0X2JpdG1hcHNfYW5kX2NvdW50ZXJzKHNiKTtcbjI1OTY6XHRcdFx0cmV0dXJuIDA7XG4yNTk3Olx0XHR9XG4yNTk4Olx0XG4yNTk5Olx0I2lmZGVmIENPTkZJR19FWFQ0X0RFQlVHXG4yNjAwOlx0XHRpZiAoc2JpLVx1MDAzZXNfZmNfZGVidWdfbWF4X3JlcGxheSBcdTAwMjZcdTAwMjYgb2ZmIFx1MDAzZT0gc2JpLVx1MDAzZXNfZmNfZGVidWdfbWF4X3JlcGxheSkge1xuMjYwMTpcdFx0XHRwcl93YXJuKFwmIzM0O0Ryb3BwaW5nIGZjIGJsb2NrICVkIGJlY2F1c2UgbWF4X3JlcGxheSBzZXRcXG5cJiMzNDssIG9mZik7XG4yNjAyOlx0XHRcdHJldHVybiBKQkQyX0ZDX1JFUExBWV9TVE9QO1xuMjYwMzpcdFx0fVxuMjYwNDpcdCNlbmRpZlxuMjYwNTpcdFxuMjYwNjpcdFx0c3RhcnQgPSAodTggKiliaC1cdTAwM2ViX2RhdGE7XG4yNjA3Olx0XHRlbmQgPSBzdGFydCAmIzQzOyBqb3VybmFsLVx1MDAzZWpfYmxvY2tzaXplO1xuMjYwODpcdFxuMjYwOTpcdFx0Zm9yIChjdXIgPSBzdGFydDsgY3VyIFx1MDAzYz0gZW5kIC0gRVhUNF9GQ19UQUdfQkFTRV9MRU47XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzAvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE0IDE0OjQwPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4xbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy44LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDIwMDU4CgkJCQkJCQlvdXRwdXQ6IDE5MAoJCQkJCQkJdGhvdWdodHM6IDk3NgoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgZXh0NCBGYXN0IENvbW1pdCBSZXBsYXkgZm9yIEZ1enppbmcqKgoKQWxyaWdodCwgbGV0JiMzOTtzIGJyZWFrIGRvd24gdGhpcyBmYXN0IGNvbW1pdCByZXBsYXkgbG9naWMgaW4gZXh0NC4gRmlyc3QsIEkgbmVlZCB0byBjb25maXJtIHdoZXRoZXIgYGV4dDRfZmNfcmVwbGF5YCBpcyBzdGF0aWMgb3Igbm90LiBPa2F5LCBpdCYjMzk7cyBkZWZpbmVkIGFzIGBzdGF0aWMgaW50IGV4dDRfZmNfcmVwbGF5YC4gU28sIGluIHRoZSB2bWxpbnV4IGNvbnRleHQsIHN0YXRpYyBmdW5jdGlvbnMgKnNob3VsZCogaGF2ZSBzeW1ib2xzIHVubGVzcyB0aGV5IGdldCBpbmxpbmVkLiBHb29kIHRvIGtub3cuCgpOb3csIGBleHQ0X2V4dF9jbGVhcl9iYmAgaXMgbm9uLXN0YXRpYyAoYGludCBleHQ0X2V4dF9jbGVhcl9iYihzdHJ1Y3QgaW5vZGUgKmlub2RlKWApLCBhbmQgdGhhdCYjMzk7cyBpbXBvcnRhbnQuIFRoZW4gd2UgaGF2ZSBgZXh0NF9mY19yZXBsYXlfaW5vZGVgIHdoaWNoIGlzIGBzdGF0aWMgaW50IGV4dDRfZmNfcmVwbGF5X2lub2RlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBleHQ0X2ZjX3RsX21lbSAqdGwsIHU4ICp2YWwpYC4gSSBuZWVkIHRvIGZpZ3VyZSBvdXQgaWYgZWl0aGVyIGBleHQ0X2ZjX3JlcGxheWAgb3IgYGV4dDRfZmNfcmVwbGF5X2lub2RlYCBhcmUgbGlrZWx5IHRvIGJlIGlubGluZWQsIG9yIGlmIHRoZXkmIzM5O3JlIGNvbXBsZXggZW5vdWdoIHRvIHByZXNlcnZlIHRoZWlyIHN5bWJvbHMuCgpgZXh0NF9mY19yZXBsYXlfaW5vZGVgIGlzIGFyb3VuZCAxMDAgbGluZXMgbG9uZywgc28gaXQmIzM5O3MgcHJvYmFibHkgbm90IGdldHRpbmcgaW5saW5lZC4gSG93ZXZlciwgYGV4dDRfZXh0X2NsZWFyX2JiYCBpcyBleHBvcnRlZCBpbiBleHQ0LmggYW5kIGlzIG5vbi1zdGF0aWMsIHNvIGl0cyBzeW1ib2wgKm11c3QqIGJlIHByZXNlbnQuIE5vdywgSSBoYXZlIHRvIGNoZWNrIGBleHQ0X2ZjX3JlcGxheWAsIHRoYXQmIzM5O3MgYW4gaW1wb3J0YW50IG9uZS4gVGhlIGNvcmUgZnVuY3Rpb25zIEkmIzM5O20gaW50ZXJlc3RlZCBpbiBmb3IgZnV6emluZyBhcmUsIGluIGVzc2VuY2U6IGBleHQ0X2V4dF9jbGVhcl9iYmAsIGBleHQ0X2ZjX3JlcGxheV9pbm9kZWAsIGFuZCBgZXh0NF9mY19yZXBsYXlgLiBUaGVzZSB0aHJlZSBzZWVtIHRvIGJlIHRoZSBtb3N0IHNwZWNpZmljIHRvIHRoaXMgZmFzdCBjb21taXQgcmVwbGF5IGxvZ2ljLgoKTm93LCBsZXQmIzM5O3MgY2hlY2sgd2hhdCBjb25maWd1cmF0aW9uIG9wdGlvbnMgYXJlIHJlcXVpcmVkIHRvIGVuYWJsZSB0aGVzZS4gYGV4dDRfZXh0X2NsZWFyX2JiYCBhbmQgYGV4dDRfZmNfcmVwbGF5X2lub2RlYCBhcmUgcGFydCBvZiBleHQ0LiAgT2YgY291cnNlLCBgQ09ORklHX0VYVDRfRlNgIGlzIGEgaGFyZCByZXF1aXJlbWVudC4gQXJlIHRoZXJlIGFueSBvdGhlciBzcGVjaWZpYyBjb25maWdzIG5lZWRlZD8gTGV0JiMzOTtzIGNoZWNrIHRoZSBgZnMvZXh0NC9NYWtlZmlsZWAuCgpPa2F5LCBzbzoKYGBgbWFrZQpvYmotJChDT05GSUdfRVhUNF9GUykgJiM0Mzs9IGV4dDQubwpleHQ0LXkJOj0gYmFsbG9jLm8gYml0bWFwLm8gYmxvY2tfdmFsaWRpdHkubyBkaXIubyBleHQ0X2piZDIubyBleHRlbnRzLm8gXAoJCWV4dGVudHNfc3RhdHVzLm8gZmlsZS5vIGZzbWFwLm8gZnN5bmMubyBoYXNoLm8gaWFsbG9jLm8gXAoJCWluZGlyZWN0Lm8gaW5saW5lLm8gaW5vZGUubyBpb2N0bC5vIG1iYWxsb2MubyBtaWdyYXRlLm8gXAoJCW1tcC5vIG1vdmVfZXh0ZW50Lm8gbmFtZWkubyBwYWdlLWlvLm8gcmVhZHBhZ2UubyByZXNpemUubyBcCgkJc3VwZXIubyBzeW1saW5rLm8gc3lzZnMubyB4YXR0ci5vIHhhdHRyX2h1cmQubyB4YXR0cl90cnVzdGVkLm8gXAoJCXhhdHRyX3VzZXIubyBmYXN0X2NvbW1pdC5vIG9ycGhhbi5vCmBgYAoKQm90aCBgZXh0ZW50cy5vYCBhbmQgYGZhc3RfY29tbWl0Lm9gIGFyZSBpbmNsdWRlZCBpbiBgZXh0NC15YCB3aGVuIGBDT05GSUdfRVhUNF9GU2AgaXMgZW5hYmxlZC4gTGV0JiMzOTtzIG1ha2Ugc3VyZSBuZWl0aGVyIGBleHQ0X2V4dF9jbGVhcl9iYmAgbm9yIGBleHQ0X2ZjX3JlcGxheV9pbm9kZWAgaGF2ZSBhbnkgY29uZGl0aW9uYWwgY29tcGlsYXRpb24gZGlyZWN0aXZlcyAoYCNpZmRlZmApIGFyb3VuZCB0aGVtLgoKQ2hlY2tpbmcgYGZzL2V4dDQvZXh0ZW50cy5jYCBmb3IgYGV4dDRfZXh0X2NsZWFyX2JiYDogTGluZSA2MzM5OiBgaW50IGV4dDRfZXh0X2NsZWFyX2JiKHN0cnVjdCBpbm9kZSAqaW5vZGUpYCAtIG5vIGAjaWZkZWZgIGRpcmVjdGl2ZXMgYXJvdW5kIGl0LiBHb29kLgoKTm93LCBpbiBgZnMvZXh0NC9mYXN0X2NvbW1pdC5jYCBmb3IgYGV4dDRfZmNfcmVwbGF5X2lub2RlYDogTGluZSAxOTI1OiBgc3RhdGljIGludCBleHQ0X2ZjX3JlcGxheV9pbm9kZWAgLSBhZ2Fpbiwgbm8gYCNpZmRlZmAgYXJvdW5kIGl0LiBMb29rcyBsaWtlIGBFWFQ0X0ZTYCBpcyB0aGUgb25seSByZXF1aXJlbWVudCwgdGhhbmtmdWxseS4KCk9rYXksIGxldCYjMzk7cyBkb3VibGUtY2hlY2sgZXZlcnl0aGluZyBmb3IgY2xhcml0eToKCjEuICAqKldvcnRoRnV6emluZzogVHJ1ZSoqLiBUaGUgcGF0Y2ggZml4ZXMgZXJyb3IgaGFuZGxpbmcgaW4gZmFzdCBjb21taXQgbG9nIHJlcGxheS4gUHJldmlvdXNseSwgaW4gYGV4dDRfZXh0X2NsZWFyX2JiKClgLCBjZXJ0YWluIGVycm9ycyB3ZXJlIGJlaW5nIGlnbm9yZWQsIHBvdGVudGlhbGx5IGxlYWRpbmcgdG8gYW4gaW52YWxpZCBzdGF0ZS4gTm93LCBlcnJvcnMgYXJlIHByb3BhZ2F0ZWQsIGFuZCBgZXh0NF9mY19yZXBsYXlfaW5vZGUoKWAgY2hlY2tzIHRoZSByZXR1cm4gY29kZSBvZiBgZXh0NF9leHRfY2xlYXJfYmIoKWAgYW5kIGFib3J0cyByZXBsYXkgaWYgYW4gZXJyb3IgaXMgZGV0ZWN0ZWQuIFRoaXMgY29kZSBwYXRoIGlzIHVzZWQgZHVyaW5nIGpvdXJuYWwgcmVjb3ZlcnkvcmVwbGF5IG9uIGV4dDQgbW91bnRzLCB3aGljaCBpcyBleGVyY2lzZWQgaW4gZmlsZXN5c3RlbSBmdXp6aW5nIHNjZW5hcmlvcy4KCjIuICAqKkZvY3VzU3ltYm9sczoqKiBJIG5lZWQgdG8gdGFyZ2V0OgogICAgKiAgIGBleHQ0X2V4dF9jbGVhcl9iYmAKICAgICogICBgZXh0NF9mY19yZXBsYXlfaW5vZGVgCiAgICAqICAgYAoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzEvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE0IDE0OjQyPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+c2V0LXJlc3VsdHM8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtFWFQ0X0ZTJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7ZXh0NF9leHRfY2xlYXJfYmImIzM0OywKICAgICYjMzQ7ZXh0NF9mY19yZXBsYXlfaW5vZGUmIzM0OywKICAgICYjMzQ7ZXh0NF9mY19yZXBsYXkmIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggbW9kaWZpZXMgZXJyb3IgaGFuZGxpbmcgYW5kIGNvbnRyb2wgZmxvdyBpbiBleHQ0IGZhc3QgY29tbWl0IHJlcGxheSBsb2dpYy4gSW4gZXh0NF9leHRfY2xlYXJfYmIoKSwgZXJyb3JzIGZyb20gZXh0NF9tYXBfYmxvY2tzKCksIGV4dDRfZmluZF9leHRlbnQoKSwgYW5kIGV4dDRfZmNfcmVjb3JkX3JlZ2lvbnMoKSBhcmUgbm93IHByb3Blcmx5IGNhcHR1cmVkIGFuZCByZXR1cm5lZCBpbnN0ZWFkIG9mIGJlaW5nIGlnbm9yZWQuIEFkZGl0aW9uYWxseSwgZXh0NF9mY19yZXBsYXlfaW5vZGUoKSBub3cgY2hlY2tzIHRoZSByZXR1cm4gdmFsdWUgb2YgZXh0NF9leHRfY2xlYXJfYmIoKSBhbmQgYWJvcnRzIHJlcGxheSBvbiBlcnJvci4gVGhpcyByZWFjaGFibGUgZmlsZXN5c3RlbSByZWNvdmVyeSBwYXRoIHNob3VsZCBiZSBmdXp6ZWQgdG8gdmVyaWZ5IHRoYXQgZXJyb3IgY29uZGl0aW9ucyBhbmQgcGF0aCBjbGVhbnVwIGJlaGF2ZSBjb3JyZWN0bHkgd2l0aG91dCBsZWFrcyBvciB1bmV4cGVjdGVkIHBhbmljcy4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7RVhUNF9GUyYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O2V4dDRfZXh0X2NsZWFyX2JiJiMzNDssCiAgICAmIzM0O2V4dDRfZmNfcmVwbGF5X2lub2RlJiMzNDssCiAgICAmIzM0O2V4dDRfZmNfcmVwbGF5JiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIG1vZGlmaWVzIGVycm9yIGhhbmRsaW5nIGFuZCBjb250cm9sIGZsb3cgaW4gZXh0NCBmYXN0IGNvbW1pdCByZXBsYXkgbG9naWMuIEluIGV4dDRfZXh0X2NsZWFyX2JiKCksIGVycm9ycyBmcm9tIGV4dDRfbWFwX2Jsb2NrcygpLCBleHQ0X2ZpbmRfZXh0ZW50KCksIGFuZCBleHQ0X2ZjX3JlY29yZF9yZWdpb25zKCkgYXJlIG5vdyBwcm9wZXJseSBjYXB0dXJlZCBhbmQgcmV0dXJuZWQgaW5zdGVhZCBvZiBiZWluZyBpZ25vcmVkLiBBZGRpdGlvbmFsbHksIGV4dDRfZmNfcmVwbGF5X2lub2RlKCkgbm93IGNoZWNrcyB0aGUgcmV0dXJuIHZhbHVlIG9mIGV4dDRfZXh0X2NsZWFyX2JiKCkgYW5kIGFib3J0cyByZXBsYXkgb24gZXJyb3IuIFRoaXMgcmVhY2hhYmxlIGZpbGVzeXN0ZW0gcmVjb3ZlcnkgcGF0aCBzaG91bGQgYmUgZnV6emVkIHRvIHZlcmlmeSB0aGF0IGVycm9yIGNvbmRpdGlvbnMgYW5kIHBhdGggY2xlYW51cCBiZWhhdmUgY29ycmVjdGx5IHdpdGhvdXQgbGVha3Mgb3IgdW5leHBlY3RlZCBwYW5pY3MuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzIvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE0IDE0OjQyPC90ZD4KCQkJPHRkPmFjdGlvbjwvdGQ+CgkJCTx0ZD5JZjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjVtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zMy8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTQgMTQ6NDI8L3RkPgoJCQk8dGQ+YWdlbnQ8L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+NW08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Y29yZTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtLTVNBTlJlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBpbXByb3ZlcyBlcnJvciBoYW5kbGluZyBpbiBleHQ0IGZhc3QgY29tbWl0IHJlcGxheSBjb2RlIChmcy9leHQ0L2V4dGVudHMuYyBhbmQgZnMvZXh0NC9mYXN0X2NvbW1pdC5jKS4gU3BlY2lmaWNhbGx5LCBleHQ0X2V4dF9jbGVhcl9iYigpIG5vdyBwcm9wZXJseSBwcm9wYWdhdGVzIGVycm9yIHJldHVybiBjb2RlcyBmcm9tIGV4dDRfbWFwX2Jsb2NrcygpLCBleHQ0X2ZpbmRfZXh0ZW50KCksIGFuZCBleHQ0X2ZjX3JlY29yZF9yZWdpb25zKCksIHJhdGhlciB0aGFuIGlnbm9yaW5nIGVycm9ycyBhbmQgdW5jb25kaXRpb25hbGx5IHJldHVybmluZyAwLiBBZGRpdGlvbmFsbHksIGV4dDRfZmNfcmVwbGF5X2lub2RlKCkgbm93IGNoZWNrcyB0aGUgcmV0dXJuIHZhbHVlIG9mIGV4dDRfZXh0X2NsZWFyX2JiKCkgYW5kIGFib3J0cyBvbiBlcnJvci5cblxuVGhlcmUgYXJlIG5vIHVuaW5pdGlhbGl6ZWQgdmFyaWFibGVzIG9yIHN0cnVjdCBmaWVsZHMgaW50cm9kdWNlZCBvciBtb2RpZmllZCwgbm8gY29waWVzIHRvIHVzZXIgc3BhY2Ugb3IgcG90ZW50aWFsIGluZm8tbGVha3MsIGFuZCBubyBicmFuY2hpbmcgb24gdW5pbml0aWFsaXplZCBtZW1vcnkuIEFsbCB2YXJpYWJsZXMgaW52b2x2ZWQgKGUuZy4gcmV0LCBwYXRoKSBhcmUgcHJvcGVybHkgaW5pdGlhbGl6ZWQgYmVmb3JlIHVzZS4gQ29uc2VxdWVudGx5LCB0aGlzIGNoYW5nZSBkb2VzIG5vdCBleHBvc2UgYW55IHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJpc2tzIGRldGVjdGFibGUgYnkgS01TQU4uIFN0YW5kYXJkIEtBU0FOIGZ1enppbmcgYW5kIHRlc3Qgc3VpdGVzIGFyZSBmdWxseSBhZGVxdWF0ZS4mIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+SW5zdHJ1Y3Rpb246PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Zb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgc2VjdXJpdHkgZW5naW5lZXIgc3BlY2lhbGl6aW5nIGluIGtlcm5lbCBtZW1vcnkKZXJyb3IgZGV0ZWN0b3JzIChLQVNBTiBhbmQgS01TQU4pLiBZb3VyIGpvYiBpcyB0byByZXZpZXcgdGhlIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQKZGV0ZXJtaW5lIGlmIHRoZSBjb2RlIGNoYW5nZXMganVzdGlmeSBzcGF3bmluZyBhIGRlZGljYXRlZCBLTVNBTiAoS2VybmVsTWVtb3J5U2FuaXRpemVyKQpmdXp6aW5nIHNlc3Npb24gaW4gYWRkaXRpb24gdG8gc3RhbmRhcmQgS0FTQU4gZnV6emluZy4KCkNSSVRJQ0FMIERJU1RJTkNUSU9OIEJFVFdFRU4gS0FTQU4gQU5EIEtNU0FOOgotIFN0YW5kYXJkIEtBU0FOIGtlcm5lbCBidWlsZHMgKHVwc3RyZWFtLWFwcGFybW9yLWthc2FuLmNvbmZpZykgYWxyZWFkeSBlbmFibGUKICBhIGNvbXByZWhlbnNpdmUgc3VpdGUgb2YgZGVidWdnaW5nIHRvb2xzIGFuZCBzYW5pdGl6ZXJzLCBpbmNsdWRpbmcgS0FTQU4KICAob3V0LW9mLWJvdW5kcyBhY2Nlc3NlcywgdXNlLWFmdGVyLWZyZWUsIGRvdWJsZSBmcmVlLCBpbnZhbGlkIGZyZWUpLCBMT0NLREVQCiAgKGxvY2tpbmcgYnVncyBhbmQgZGVhZGxvY2tzKSwgVUItc2FuaXRpemVycywgYW5kIG1lbW9yeSBjb3JydXB0aW9uIGNoZWNrcy4KLSBLTVNBTiAoS2VybmVsTWVtb3J5U2FuaXRpemVyKSBkZXRlY3RzIHJlYWRzIG9mIFVOSU5JVElBTElaRUQgbWVtb3J5IChzdGFjaywgaGVhcCwKICBvciBwYWdlIGFsbG9jYXRpb25zKSBhbmQga2VybmVsLXRvLXVzZXIgbWVtb3J5IGluZm8tbGVha3MuCgpSdWxlOiBUSEVSRSBJUyBOTyBTRU5TRSBJTiBSVU5OSU5HIEEgS01TQU4gU0VTU0lPTiBJRiBBIEJVRyBDQU4gQkUgQ0FVR0hUIEJZIEtBU0FOLApMT0NLREVQLCBPUiBPVEhFUiBTVEFOREFSRCBCVUcgREVURUNUT1JTLgpBIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaW5jdXJzIHNpZ25pZmljYW50IHJlc291cmNlIGNvc3RzLiBZb3UgbXVzdCBPTkxZCnNldCBOZWVkc0tNU0FOPXRydWUgaWYgdGhlIGNvZGUgY2hhbmdlcyBpbnRyb2R1Y2Ugb3IgZXhwb3NlIFVOSU5JVElBTElaRUQgTUVNT1JZIHJpc2tzCnRoYXQgYXJlIGRldGVjdGVkIE9OTFkgYnkgS01TQU4uCgpMb29rIGhvbGlzdGljYWxseSBhdCB0aGUgcGF0Y2ggc2VyaWVzIGFuZCBzdXJyb3VuZGluZyBjb2RlLiBFdmVuIGlmIG5vIGRpcmVjdAp1bmluaXRpYWxpemVkIGZpZWxkIGFjY2Vzc2VzIG9yIG5ldyBidWZmZXIgYWxsb2NhdGlvbnMgYXJlIGFkZGVkIGluIHRoZSBkaWZmIGl0c2VsZiwKYSBwYXRjaCBtYXkgYWx0ZXIgY29udHJvbCBmbG93LCBib3VuZHMgY2hlY2tpbmcsIG9yIGRhdGEgbGVuZ3RoIGNhbGN1bGF0aW9ucyBpbiB3YXlzCnRoYXQgY2hhbmdlIGhvdyB0aGUgcmVzdCBvZiB0aGUgY29kZSBvcGVyYXRlcyBvbiBleGlzdGluZyBidWZmZXJzIChlLmcuIGFsbG93aW5nCnVuaW5pdGlhbGl6ZWQgc3RhY2svaGVhcCBtZW1vcnkgdG8gYmUgcmVhZCwgY29waWVkIHRvIHVzZXIgc3BhY2UsIG9yIHVzZWQgaW4gY29udHJvbApmbG93KS4gRG8gbm90IGhlc2l0YXRlIHRvIHVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUsCmNhbGxlZCBmdW5jdGlvbnMsIGFuZCBjYWxsZXJzLgoKU2V0IE5lZWRzS01TQU49dHJ1ZSBPTkxZIElGIHRoZSBwYXRjaCBpbnRyb2R1Y2VzIG9yIG1vZGlmaWVzOgoxLiBLZXJuZWwgc3RydWN0dXJlcyBzZW50IHRvIHVzZXIgc3BhY2UgKHZpYSBjb3B5X3RvX3VzZXIsIHB1dF91c2VyLCBuZXRsaW5rIHNrYgogICBhdHRyaWJ1dGVzLCBpb2N0bCBvdXRwdXQgYXJndW1lbnRzLCBzb2NrZXQgb3B0aW9ucywgb3IgQlBGIGJ1ZmZlcnMpIHdoZXJlIGZpZWxkcwogICBvciBzdHJ1Y3R1cmUgcGFkZGluZyBtaWdodCBub3QgYmUgZnVsbHkgaW5pdGlhbGl6ZWQvemVyb2VkLgoyLiBDb25kaXRpb25hbCBsb2dpYyBvciBicmFuY2hpbmcgdGhhdCBkZXBlbmRzIG9uIHBvdGVudGlhbGx5IHVuaW5pdGlhbGl6ZWQgdmFyaWFibGVzCiAgIG9yIHN0cnVjdCBmaWVsZHMuCjMuIEFsbG9jYXRpb24gb3IgaW5pdGlhbGl6YXRpb24gb2YgY29tcGxleCBkYXRhIHN0cnVjdHVyZXMgd2hlcmUgdW5pbml0aWFsaXplZCBmaWVsZHMKICAgY291bGQgYmUgcmVhZCBsYXRlciBpbiByZWFjaGFibGUgY29kZSBwYXRocy4KNC4gQm91bmRzIGNoZWNrcywgbGVuZ3Rocywgb3IgbG9naWMgaW4gYSB3YXkgdGhhdCBhbGxvd3Mgc3Vycm91bmRpbmcgY29kZSB0byBhY2Nlc3MKICAgdW5pbml0aWFsaXplZCBieXRlcyBvZiBleGlzdGluZyBidWZmZXJzLgoKU2V0IE5lZWRzS01TQU49ZmFsc2UgSUY6Ci0gVGhlIGNvZGUgY2hhbmdlcyBwcmltYXJpbHkgcmlzayBvdXQtb2YtYm91bmRzIGFjY2VzcywgYXJyYXkgb3ZlcmZsb3dzLCBOVUxMIHBvaW50ZXIKICBkZXJlZmVyZW5jZXMsIGxvY2tpbmcgZGVhZGxvY2tzLCBvciB1c2UtYWZ0ZXItZnJlZSBidWdzICh0aGVzZSBhcmUgYWxyZWFkeSBjYXVnaHQKICBieSBLQVNBTiwgTE9DS0RFUCwgb3Igc3RhbmRhcmQgYnVnIGRldGVjdG9ycykuCi0gQWxsIHN0YWNrL2hlYXAgc3RydWN0dXJlcyB0b3VjaGVkIG9yIGludHJvZHVjZWQgYnkgdGhlIHBhdGNoIGFyZSBmdWxseSB6ZXJvZWQKICBvciBpbml0aWFsaXplZCAoZS5nLiB1c2luZyA9IHswfSwgbWVtc2V0LCBremFsbG9jKSBiZWZvcmUgYmVpbmcgcmVhZCBvciBjb3BpZWQuCi0gVGhlIHBhdGNoIGRvZXMgbm90IGludHJvZHVjZSBhbnkgcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSB1c2FnZSBvciBpbmZvLWxlYWtzLgoKVXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gaW5zcGVjdCB0aGUgc3Vycm91bmRpbmcgY29kZSBpZiBuZWNlc3NhcnksIHRoZW4gcHJvdmlkZQpkZXRhaWxlZCBLTVNBTlJlYXNvbmluZyBjb250cmFzdGluZyBLQVNBTiB2cyBLTVNBTiBhcHBsaWNhYmlsaXR5IGZvciB0aGlzIHBhdGNoLgpQcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy4KCgpVc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLgpJdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS4KSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlByb21wdDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPlRhcmdldCBhcmNoaXRlY3R1cmU6IGFtZDY0CgpGb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczoKY29tbWl0IDMxM2Y1NTIzZjM3MGRkYzk2NGE0NTA1M2YwMDYwYzRmNGY4ZmNmMjgKQXV0aG9yOiBzeXotY2x1c3RlciAmbHQ7dHJpYWdlQHN5emthbGxlci5jb20mZ3Q7CkRhdGU6ICAgTW9uIFNlcCAxNCAxNDozNjowNCAyMDI2ICYjNDM7MDAwMAoKICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlldwoKZGlmZiAtLWdpdCBhL2ZzL2V4dDQvZXh0ZW50cy5jIGIvZnMvZXh0NC9leHRlbnRzLmMKaW5kZXggNzYwMzhiNmMzNjU1Mi4uZjY1ZDI1NGMwZDVlZSAxMDA2NDQKLS0tIGEvZnMvZXh0NC9leHRlbnRzLmMKJiM0MzsmIzQzOyYjNDM7IGIvZnMvZXh0NC9leHRlbnRzLmMKQEAgLTYzNjMsMjkgJiM0Mzs2MzYzLDM0IEBAIGludCBleHQ0X2V4dF9jbGVhcl9iYihzdHJ1Y3QgaW5vZGUgKmlub2RlKQogCQltYXAubV9sZW4gPSBlbmQgLSBjdXI7CiAJCXJldCA9IGV4dDRfbWFwX2Jsb2NrcyhOVUxMLCBpbm9kZSwgJmFtcDttYXAsIDApOwogCQlpZiAocmV0ICZsdDsgMCkKLQkJCWJyZWFrOwomIzQzOwkJCWdvdG8gb3V0OwogCQlpZiAocmV0ICZndDsgMCkgewogCQkJcGF0aCA9IGV4dDRfZmluZF9leHRlbnQoaW5vZGUsIG1hcC5tX2xibGssIHBhdGgsIDApOwotCQkJaWYgKCFJU19FUlIocGF0aCkpIHsKLQkJCQlmb3IgKGogPSAwOyBqICZsdDsgcGF0aC0mZ3Q7cF9kZXB0aDsgaiYjNDM7JiM0MzspIHsKLQkJCQkJZXh0NF9tYl9tYXJrX2JiKGlub2RlLSZndDtpX3NiLAotCQkJCQkJCXBhdGhbal0ucF9ibG9jaywgMSwgZmFsc2UpOwotCQkJCQlleHQ0X2ZjX3JlY29yZF9yZWdpb25zKGlub2RlLSZndDtpX3NiLCBpbm9kZS0mZ3Q7aV9pbm8sCi0JCQkJCQkJMCwgcGF0aFtqXS5wX2Jsb2NrLCAxLCAxKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCXBhdGggPSBOVUxMOwomIzQzOwkJCWlmIChJU19FUlIocGF0aCkpIHsKJiM0MzsJCQkJcmV0ID0gUFRSX0VSUihwYXRoKTsKJiM0MzsJCQkJZ290byBvdXQ7CiYjNDM7CQkJfQomIzQzOwkJCWZvciAoaiA9IDA7IGogJmx0OyBwYXRoLSZndDtwX2RlcHRoOyBqJiM0MzsmIzQzOykgewomIzQzOwkJCQlleHQ0X21iX21hcmtfYmIoaW5vZGUtJmd0O2lfc2IsCiYjNDM7CQkJCQkJcGF0aFtqXS5wX2Jsb2NrLCAxLCBmYWxzZSk7CiYjNDM7CQkJCXJldCA9IGV4dDRfZmNfcmVjb3JkX3JlZ2lvbnMoaW5vZGUtJmd0O2lfc2IsCiYjNDM7CQkJCQkJCSAgICAgaW5vZGUtJmd0O2lfaW5vLCAwLAomIzQzOwkJCQkJCQkgICAgIHBhdGhbal0ucF9ibG9jaywgMSwgMSk7CiYjNDM7CQkJCWlmIChyZXQpCiYjNDM7CQkJCQlnb3RvIG91dDsKIAkJCX0KIAkJCWV4dDRfbWJfbWFya19iYihpbm9kZS0mZ3Q7aV9zYiwgbWFwLm1fcGJsaywgbWFwLm1fbGVuLCBmYWxzZSk7Ci0JCQlleHQ0X2ZjX3JlY29yZF9yZWdpb25zKGlub2RlLSZndDtpX3NiLCBpbm9kZS0mZ3Q7aV9pbm8sCi0JCQkJCW1hcC5tX2xibGssIG1hcC5tX3BibGssIG1hcC5tX2xlbiwgMSk7CiYjNDM7CQkJcmV0ID0gZXh0NF9mY19yZWNvcmRfcmVnaW9ucyhpbm9kZS0mZ3Q7aV9zYiwgaW5vZGUtJmd0O2lfaW5vLAomIzQzOwkJCQkJCSAgICAgbWFwLm1fbGJsaywgbWFwLm1fcGJsaywgbWFwLm1fbGVuLCAxKTsKJiM0MzsJCQlpZiAocmV0KQomIzQzOwkJCQlnb3RvIG91dDsKIAkJfQogCQljdXIgPSBjdXIgJiM0MzsgbWFwLm1fbGVuOwogCX0KIAogb3V0OgogCWV4dDRfZnJlZV9leHRfcGF0aChwYXRoKTsKLQlyZXR1cm4gMDsKJiM0MzsJcmV0dXJuIHJldCAmbHQ7IDAgPyByZXQgOiAwOwogfQogCiAjaWYgSVNfRU5BQkxFRChDT05GSUdfRVhUNF9LVU5JVF9URVNUUykKZGlmZiAtLWdpdCBhL2ZzL2V4dDQvZmFzdF9jb21taXQuYyBiL2ZzL2V4dDQvZmFzdF9jb21taXQuYwppbmRleCAwY2FjODkwY2YzNzAyLi5hYjcyNjNiNGY5ZTQ2IDEwMDY0NAotLS0gYS9mcy9leHQ0L2Zhc3RfY29tbWl0LmMKJiM0MzsmIzQzOyYjNDM7IGIvZnMvZXh0NC9mYXN0X2NvbW1pdC5jCkBAIC0xOTQxLDggJiM0MzsxOTQxLDExIEBAIHN0YXRpYyBpbnQgZXh0NF9mY19yZXBsYXlfaW5vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKIAogCWlub2RlID0gZXh0NF9pZ2V0KHNiLCBpbm8sIEVYVDRfSUdFVF9OT1JNQUwpOwogCWlmICghSVNfRVJSKGlub2RlKSkgewotCQlleHQ0X2V4dF9jbGVhcl9iYihpbm9kZSk7CiYjNDM7CQlyZXQgPSBleHQ0X2V4dF9jbGVhcl9iYihpbm9kZSk7CiAJCWlwdXQoaW5vZGUpOwomIzQzOwkJaW5vZGUgPSBOVUxMOwomIzQzOwkJaWYgKHJldCkKJiM0MzsJCQlnb3RvIG91dDsKIAl9CiAJaW5vZGUgPSBOVUxMOwogCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjM0LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xNCAxNDo0MjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MW08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuOC1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyODM4CgkJCQkJCQlvdXRwdXQ6IDM4CgkJCQkJCQl0aG91Z2h0czogMTIzCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyB0aGUgQ29kZSBDaGFuZ2VzKioKCk9rYXksIGxldCYjMzk7cyBkaXZlIGludG8gdGhpcy4gRmlyc3QsIEkgbmVlZCB0byB1bmRlcnN0YW5kIHdoYXQgdGhpcyBkaWZmIGlzIGFjdHVhbGx5IGRvaW5nLiBJdCBsb29rcyBsaWtlIHRoZSBjb3JlIG9mIHRoZSBjaGFuZ2VzIGFyZSBjZW50ZXJlZCBhcm91bmQgYGZzL2V4dDQvZXh0ZW50cy5jYCwgc3BlY2lmaWNhbGx5IGBleHQ0X2V4dF9jbGVhcl9iYmAsIGFuZCBhbHNvIHRvdWNoZXMgYGZzL2V4dDQvZmFzdF9jb21taXQuY2Agd2l0aCB0aGUgYGV4dDRfZmNfcmVwbGF5X2lub2RlYCBmdW5jdGlvbi4gSW50ZXJlc3RpbmcsIHNvIHdlJiMzOTtyZSBsb29raW5nIGF0IGV4dGVudCBoYW5kbGluZyBhbmQgcG90ZW50aWFsbHkgZmFzdCBjb21taXQgZnVuY3Rpb25hbGl0eS4KCk5vdywgSSYjMzk7bGwgdXNlIHRoZSBgcmVhZC1maWxlYCBjb21tYW5kIHRvIHB1bGwgdXAgdGhlIHJlbGV2YW50IHBhcnRzIG9mIHRoZSBgZXh0ZW50cy5jYCBmaWxlIGFuZCBzcGVjaWZpY2FsbHkgZm9jdXMgb24gdGhlIGFyZWEgYXJvdW5kIGBleHQ0X2V4dF9jbGVhcl9iYmAuIFVuZGVyc3RhbmRpbmcgdGhlIGNvbnRleHQgb2YgdGhhdCBmdW5jdGlvbiBpcyBrZXksIGFzIGlzIHRoZSByb2xlIG9mIGBleHQ0X2ZjX3JlcGxheV9pbm9kZWAgaW4gYGZhc3RfY29tbWl0LmNgLiBDb250ZXh0IGlzIGV2ZXJ5dGhpbmcsIHNvIHNlZWluZyB0aGUgc3Vycm91bmRpbmcgY29kZSB3aWxsIGxpa2VseSBiZSBjcnVjaWFsIHRvIGRldGVybWluZSB0aGUgbmF0dXJlIG9mIHRoaXMgcGF0Y2ggYW5kIGl0cyBwb3RlbnRpYWwgaW1wbGljYXRpb25zLiBJIG5lZWQgdG8gcXVpY2tseSBncmFzcCB0aGUgaW50ZXJhY3Rpb24gYmV0d2VlbiB0aGVzZSB0d28gZnVuY3Rpb25zIGFuZCB3aGF0IHRoaXMgY2hhbmdlIGlzIHRyeWluZyB0byBhY2hpZXZlLiBMZXQmIzM5O3MgZ2V0IHJlYWRpbmcuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzUvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE0IDE0OjQzPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7ZnMvZXh0NC9leHRlbnRzLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiA2MzQwLAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDcwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OzYzNDA6XHR7XG42MzQxOlx0XHRzdHJ1Y3QgZXh0NF9leHRfcGF0aCAqcGF0aCA9IE5VTEw7XG42MzQyOlx0XHRzdHJ1Y3QgZXh0NF9leHRlbnQgKmV4O1xuNjM0MzpcdFx0ZXh0NF9sYmxrX3QgY3VyID0gMCwgZW5kO1xuNjM0NDpcdFx0aW50IGosIHJldCA9IDA7XG42MzQ1Olx0XHRzdHJ1Y3QgZXh0NF9tYXBfYmxvY2tzIG1hcDtcbjYzNDY6XHRcbjYzNDc6XHRcdGlmIChleHQ0X3Rlc3RfaW5vZGVfZmxhZyhpbm9kZSwgRVhUNF9JTk9ERV9JTkxJTkVfREFUQSkpXG42MzQ4Olx0XHRcdHJldHVybiAwO1xuNjM0OTpcdFxuNjM1MDpcdFx0LyogRGV0ZXJtaW4gdGhlIHNpemUgb2YgdGhlIGZpbGUgZmlyc3QgKi9cbjYzNTE6XHRcdHBhdGggPSBleHQ0X2ZpbmRfZXh0ZW50KGlub2RlLCBFWFRfTUFYX0JMT0NLUyAtIDEsIE5VTEwsXG42MzUyOlx0XHRcdFx0XHRcdEVYVDRfRVhfTk9DQUNIRSk7XG42MzUzOlx0XHRpZiAoSVNfRVJSKHBhdGgpKVxuNjM1NDpcdFx0XHRyZXR1cm4gUFRSX0VSUihwYXRoKTtcbjYzNTU6XHRcdGV4ID0gcGF0aFtwYXRoLVx1MDAzZXBfZGVwdGhdLnBfZXh0O1xuNjM1NjpcdFx0aWYgKCFleClcbjYzNTc6XHRcdFx0Z290byBvdXQ7XG42MzU4Olx0XHRlbmQgPSBsZTMyX3RvX2NwdShleC1cdTAwM2VlZV9ibG9jaykgJiM0MzsgZXh0NF9leHRfZ2V0X2FjdHVhbF9sZW4oZXgpO1xuNjM1OTpcdFxuNjM2MDpcdFx0Y3VyID0gMDtcbjYzNjE6XHRcdHdoaWxlIChjdXIgXHUwMDNjIGVuZCkge1xuNjM2MjpcdFx0XHRtYXAubV9sYmxrID0gY3VyO1xuNjM2MzpcdFx0XHRtYXAubV9sZW4gPSBlbmQgLSBjdXI7XG42MzY0Olx0XHRcdHJldCA9IGV4dDRfbWFwX2Jsb2NrcyhOVUxMLCBpbm9kZSwgXHUwMDI2bWFwLCAwKTtcbjYzNjU6XHRcdFx0aWYgKHJldCBcdTAwM2MgMClcbjYzNjY6XHRcdFx0XHRnb3RvIG91dDtcbjYzNjc6XHRcdFx0aWYgKHJldCBcdTAwM2UgMCkge1xuNjM2ODpcdFx0XHRcdHBhdGggPSBleHQ0X2ZpbmRfZXh0ZW50KGlub2RlLCBtYXAubV9sYmxrLCBwYXRoLCAwKTtcbjYzNjk6XHRcdFx0XHRpZiAoSVNfRVJSKHBhdGgpKSB7XG42MzcwOlx0XHRcdFx0XHRyZXQgPSBQVFJfRVJSKHBhdGgpO1xuNjM3MTpcdFx0XHRcdFx0Z290byBvdXQ7XG42MzcyOlx0XHRcdFx0fVxuNjM3MzpcdFx0XHRcdGZvciAoaiA9IDA7IGogXHUwMDNjIHBhdGgtXHUwMDNlcF9kZXB0aDsgaiYjNDM7JiM0MzspIHtcbjYzNzQ6XHRcdFx0XHRcdGV4dDRfbWJfbWFya19iYihpbm9kZS1cdTAwM2VpX3NiLFxuNjM3NTpcdFx0XHRcdFx0XHRcdHBhdGhbal0ucF9ibG9jaywgMSwgZmFsc2UpO1xuNjM3NjpcdFx0XHRcdFx0cmV0ID0gZXh0NF9mY19yZWNvcmRfcmVnaW9ucyhpbm9kZS1cdTAwM2VpX3NiLFxuNjM3NzpcdFx0XHRcdFx0XHRcdFx0ICAgICBpbm9kZS1cdTAwM2VpX2lubywgMCxcbjYzNzg6XHRcdFx0XHRcdFx0XHRcdCAgICAgcGF0aFtqXS5wX2Jsb2NrLCAxLCAxKTtcbjYzNzk6XHRcdFx0XHRcdGlmIChyZXQpXG42MzgwOlx0XHRcdFx0XHRcdGdvdG8gb3V0O1xuNjM4MTpcdFx0XHRcdH1cbjYzODI6XHRcdFx0XHRleHQ0X21iX21hcmtfYmIoaW5vZGUtXHUwMDNlaV9zYiwgbWFwLm1fcGJsaywgbWFwLm1fbGVuLCBmYWxzZSk7XG42MzgzOlx0XHRcdFx0cmV0ID0gZXh0NF9mY19yZWNvcmRfcmVnaW9ucyhpbm9kZS1cdTAwM2VpX3NiLCBpbm9kZS1cdTAwM2VpX2lubyxcbjYzODQ6XHRcdFx0XHRcdFx0XHQgICAgIG1hcC5tX2xibGssIG1hcC5tX3BibGssIG1hcC5tX2xlbiwgMSk7XG42Mzg1Olx0XHRcdFx0aWYgKHJldClcbjYzODY6XHRcdFx0XHRcdGdvdG8gb3V0O1xuNjM4NzpcdFx0XHR9XG42Mzg4Olx0XHRcdGN1ciA9IGN1ciAmIzQzOyBtYXAubV9sZW47XG42Mzg5Olx0XHR9XG42MzkwOlx0XG42MzkxOlx0b3V0OlxuNjM5MjpcdFx0ZXh0NF9mcmVlX2V4dF9wYXRoKHBhdGgpO1xuNjM5MzpcdFx0cmV0dXJuIHJldCBcdTAwM2MgMCA/IHJldCA6IDA7XG42Mzk0Olx0fVxuNjM5NTpcdFxuNjM5NjpcdCNpZiBJU19FTkFCTEVEKENPTkZJR19FWFQ0X0tVTklUX1RFU1RTKVxuNjM5NzpcdGludCBleHQ0X2V4dF9zcGFjZV9yb290X2lkeF90ZXN0KHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBjaGVjaylcbjYzOTg6XHR7XG42Mzk5Olx0XHRyZXR1cm4gZXh0NF9leHRfc3BhY2Vfcm9vdF9pZHgoaW5vZGUsIGNoZWNrKTtcbjY0MDA6XHR9XG42NDAxOlx0RVhQT1JUX1NZTUJPTF9GT1JfRVhUNF9URVNUKGV4dDRfZXh0X3NwYWNlX3Jvb3RfaWR4X3Rlc3QpO1xuNjQwMjpcdFxuNjQwMzpcdHN0cnVjdCBleHQ0X2V4dF9wYXRoICpleHQ0X3NwbGl0X2NvbnZlcnRfZXh0ZW50c190ZXN0KGhhbmRsZV90ICpoYW5kbGUsXG42NDA0Olx0XHRcdFx0c3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGV4dDRfbWFwX2Jsb2NrcyAqbWFwLFxuNjQwNTpcdFx0XHRcdHN0cnVjdCBleHQ0X2V4dF9wYXRoICpwYXRoLCBpbnQgZmxhZ3MsXG42NDA2Olx0XHRcdFx0dW5zaWduZWQgaW50ICphbGxvY2F0ZWQpXG42NDA3Olx0e1xuNjQwODpcdFx0cmV0dXJuIGV4dDRfc3BsaXRfY29udmVydF9leHRlbnRzKGhhbmRsZSwgaW5vZGUsIG1hcCwgcGF0aCxcbjY0MDk6XHRcdFx0XHRcdFx0ICBmbGFncywgYWxsb2NhdGVkKTtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zNi8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTQgMTQ6NDM8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjgtZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNDQyMQoJCQkJCQkJb3V0cHV0OiAzOQoJCQkJCQkJdGhvdWdodHM6IDI1CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IHN1bW1hcnksIGFzIGlmIEkgd2VyZSB0aGlua2luZyB0aGVzZSB0aG91Z2h0czoKCioqRXhhbWluaW5nIGBmcy9leHQ0L2Zhc3RfY29tbWl0LmNgIGZvciBDbHVlcyoqCgpPa2F5LCBJJiMzOTttIGRpdmluZyBpbnRvIHRoaXMgaXNzdWUsIGFuZCBhIGNydWNpYWwgYXJlYSB0byBpbnZlc3RpZ2F0ZSBmdXJ0aGVyIGlzIGxpa2VseSBgZnMvZXh0NC9mYXN0X2NvbW1pdC5jYC4gU3BlY2lmaWNhbGx5LCBsaW5lIDE5NDEgYW5kIGFyb3VuZCB0aGVyZSBzZWVtcyBsaWtlIGEgcG90ZW50aWFsIGhvdHNwb3QuIEdpdmVuIHRoZSBuYXR1cmUgb2YgdGhlIHByb2JsZW0sIEkgc3VzcGVjdCB0aGUgZmFzdCBjb21taXQgbG9naWMgbWlnaHQgYmUgaW52b2x2ZWQuIE15IGh5cG90aGVzaXMgaXMgdGhhdCBzb21ldGhpbmcgd2l0aGluIHRoYXQgcGFydGljdWxhciBzZWN0aW9uIGNvdWxkIGJlIGNvbnRyaWJ1dGluZyB0byB0aGUgb2JzZXJ2ZWQgYmVoYXZpb3IsIHNvIGxldCYjMzk7cyBjYXJlZnVsbHkgcmV2aWV3IHRoZSBzdXJyb3VuZGluZyBjb2RlIGZvciBjbHVlcy4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhlIGludGVyYWN0aW9ucyBhcm91bmQgdGhhdCBwb2ludCB0byBzZWUgaWYgdGhlcmUmIzM5O3MgYSBjb25jdXJyZW5jeSBpc3N1ZSwgYSByYWNlIGNvbmRpdGlvbiwgb3IgYSBzdWJ0bGUgYnVnIHJlbGF0ZWQgdG8gZGF0YSBzeW5jaHJvbml6YXRpb24uCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzcvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE0IDE0OjQ0PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7ZnMvZXh0NC9mYXN0X2NvbW1pdC5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMTkzMCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiA0MAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsxOTMwOlx0XHRzdHJ1Y3QgZXh0NF9pbm9kZSAqcmF3X2ZjX2lub2RlO1xuMTkzMTpcdFx0c3RydWN0IGlub2RlICppbm9kZSA9IE5VTEw7XG4xOTMyOlx0XHRzdHJ1Y3QgZXh0NF9pbG9jIGlsb2M7XG4xOTMzOlx0XHRpbnQgaW5vZGVfbGVuLCBpbm8sIHJldCwgdGFnID0gdGwtXHUwMDNlZmNfdGFnO1xuMTkzNDpcdFx0c3RydWN0IGV4dDRfZXh0ZW50X2hlYWRlciAqZWg7XG4xOTM1Olx0XHRzaXplX3Qgb2ZmX2dlbiA9IG9mZnNldG9mKHN0cnVjdCBleHQ0X2lub2RlLCBpX2dlbmVyYXRpb24pO1xuMTkzNjpcdFxuMTkzNzpcdFx0bWVtY3B5KFx1MDAyNmZjX2lub2RlLCB2YWwsIHNpemVvZihmY19pbm9kZSkpO1xuMTkzODpcdFxuMTkzOTpcdFx0aW5vID0gbGUzMl90b19jcHUoZmNfaW5vZGUuZmNfaW5vKTtcbjE5NDA6XHRcdHRyYWNlX2V4dDRfZmNfcmVwbGF5KHNiLCB0YWcsIGlubywgMCwgMCk7XG4xOTQxOlx0XG4xOTQyOlx0XHRpbm9kZSA9IGV4dDRfaWdldChzYiwgaW5vLCBFWFQ0X0lHRVRfTk9STUFMKTtcbjE5NDM6XHRcdGlmICghSVNfRVJSKGlub2RlKSkge1xuMTk0NDpcdFx0XHRyZXQgPSBleHQ0X2V4dF9jbGVhcl9iYihpbm9kZSk7XG4xOTQ1Olx0XHRcdGlwdXQoaW5vZGUpO1xuMTk0NjpcdFx0XHRpbm9kZSA9IE5VTEw7XG4xOTQ3Olx0XHRcdGlmIChyZXQpXG4xOTQ4Olx0XHRcdFx0Z290byBvdXQ7XG4xOTQ5Olx0XHR9XG4xOTUwOlx0XHRpbm9kZSA9IE5VTEw7XG4xOTUxOlx0XG4xOTUyOlx0XHRyZXQgPSBleHQ0X2ZjX3JlY29yZF9tb2RpZmllZF9pbm9kZShzYiwgaW5vKTtcbjE5NTM6XHRcdGlmIChyZXQpXG4xOTU0Olx0XHRcdGdvdG8gb3V0O1xuMTk1NTpcdFxuMTk1NjpcdFx0cmF3X2ZjX2lub2RlID0gKHN0cnVjdCBleHQ0X2lub2RlICopXG4xOTU3Olx0XHRcdCh2YWwgJiM0Mzsgb2Zmc2V0b2Yoc3RydWN0IGV4dDRfZmNfaW5vZGUsIGZjX3Jhd19pbm9kZSkpO1xuMTk1ODpcdFx0cmV0ID0gZXh0NF9nZXRfZmNfaW5vZGVfbG9jKHNiLCBpbm8sIFx1MDAyNmlsb2MpO1xuMTk1OTpcdFx0aWYgKHJldClcbjE5NjA6XHRcdFx0Z290byBvdXQ7XG4xOTYxOlx0XG4xOTYyOlx0XHRpbm9kZV9sZW4gPSB0bC1cdTAwM2VmY19sZW4gLSBzaXplb2Yoc3RydWN0IGV4dDRfZmNfaW5vZGUpO1xuMTk2MzpcdFx0cmF3X2lub2RlID0gZXh0NF9yYXdfaW5vZGUoXHUwMDI2aWxvYyk7XG4xOTY0Olx0XG4xOTY1Olx0XHRtZW1jcHkocmF3X2lub2RlLCByYXdfZmNfaW5vZGUsIG9mZnNldG9mKHN0cnVjdCBleHQ0X2lub2RlLCBpX2Jsb2NrKSk7XG4xOTY2Olx0XHRtZW1jcHkoKHU4ICopcmF3X2lub2RlICYjNDM7IG9mZl9nZW4sICh1OCAqKXJhd19mY19pbm9kZSAmIzQzOyBvZmZfZ2VuLFxuMTk2NzpcdFx0ICAgICAgIGlub2RlX2xlbiAtIG9mZl9nZW4pO1xuMTk2ODpcdFx0aWYgKGxlMzJfdG9fY3B1KHJhd19pbm9kZS1cdTAwM2VpX2ZsYWdzKSBcdTAwMjYgRVhUNF9FWFRFTlRTX0ZMKSB7XG4xOTY5Olx0XHRcdGVoID0gKHN0cnVjdCBleHQ0X2V4dGVudF9oZWFkZXIgKikoXHUwMDI2cmF3X2lub2RlLVx1MDAzZWlfYmxvY2tbMF0pO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjM4LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xNCAxNDo0NDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuOC1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA1MzU3CgkJCQkJCQlvdXRwdXQ6IDM5CgkJCQkJCQl0aG91Z2h0czogMTQzNQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgdGhlIEZpeCBmb3IgUG90ZW50aWFsIFVuaW5pdGlhbGl6ZWQgTWVtb3J5IElzc3VlcyoqCgpPa2F5LCBsZXQmIzM5O3MgYnJlYWsgdGhpcyBkb3duLiBGaXJzdCwgSSBuZWVkIHRvIHVuZGVyc3RhbmQgd2hhdCB0aGUgb3JpZ2luYWwgcHJvYmxlbSB3YXMgYW5kIGhvdyB0aGUgcGF0Y2ggYWRkcmVzc2VzIGl0LiBUaGUgb3JpZ2luYWwgY29kZSBpbiBgZXh0NF9leHRfY2xlYXJfYmJgIGhhZCBhIGZldyBmbGF3cy4gVGhlIGBleHQ0X2ZpbmRfZXh0ZW50YCBmdW5jdGlvbiBjb3VsZCBmYWlsLCByZXR1cm5pbmcgYW4gZXJyb3IgKGBJU19FUlIocGF0aClgKSwgYnV0IHRoZSBjb2RlIHdvdWxkIHRoZW4gYmxpdGhlbHkgY29udGludWUsIHBvdGVudGlhbGx5IGxlYWRpbmcgdG8gaW5jb3JyZWN0IGJsb2NrIG1hcmtpbmcgYW5kIHJlcG9ydGluZy4gQ3J1Y2lhbGx5LCBlcnJvcnMgZnJvbSBgZXh0NF9mY19yZWNvcmRfcmVnaW9uc2Agd2VyZSBhbHNvIGlnbm9yZWQsIGFuZCB0aGUgZnVuY3Rpb24gYWx3YXlzIHJldHVybmVkIDAsIGV2ZW4gd2hlbiBzZXJpb3VzIGZhaWx1cmVzIG9jY3VycmVkIGVhcmxpZXIuIFRoZSBsaW5lIGBpZiAoSVNfRVJSKHBhdGgpKSByZXR1cm4gUFRSX0VSUihwYXRoKTtgIHNlZW1lZCB0byB0cnkgdG8gcmV0dXJuIGFuIGVycm9yLCBidXQgaXQgd2FzIGZvbGxvd2VkIGJ5IGEgYHJldHVybiAwO2AsIHRodXMgYmVpbmcgdXNlbGVzcy4gVGhlIGNhbGxpbmcgZnVuY3Rpb24sIGBleHQ0X2ZjX3JlcGxheV9pbm9kZWAsIGNvbXBvdW5kZWQgdGhlIGlzc3VlIGJ5IGlnbm9yaW5nIHRoZSByZXR1cm4gdmFsdWUgb2YgYGV4dDRfZXh0X2NsZWFyX2JiYC4KCk5vdywgdGhlIHBhdGNoIGFpbXMgdG8gZml4IHRoZXNlIHByb2JsZW1zIGJ5IGludHJvZHVjaW5nIHByb3BlciBlcnJvciBoYW5kbGluZy4gSWYgYGV4dDRfbWFwX2Jsb2Nrc2AgZmFpbHMsIGl0IGBnb3RvIG91dDtgLiBJZiBgZXh0NF9maW5kX2V4dGVudGAgZmFpbHMsIHRoZSBwYXRjaCBzZXRzIGByZXRgIGFuZCBgZ290byBvdXQ7YCwgYW5kIGltcG9ydGFudGx5LCB0aGUgcGF0Y2ggYWRkcyBjaGVja3MgYWZ0ZXIgYGV4dDRfZmNfcmVjb3JkX3JlZ2lvbnNgLiBGaW5hbGx5LCB0aGUgcGF0Y2ggY2hlY2tzIHRoZSByZXR1cm4gdmFsdWUgYW5kIHJldHVybnMgdGhlIG5lZ2F0aXZlIGVycm9yLiBUaGUgY2hhbmdlIGluIGBleHQ0X2ZjX3JlcGxheV9pbm9kZWAgbm93IGNvcnJlY3RseSBjaGVja3MgdGhlIHJldHVybiB2YWx1ZSBvZiBgZXh0NF9leHRfY2xlYXJfYmJgIGFuZCBleGl0cyBpZiBpdCYjMzk7cyBub24temVyby4KClRoZSBjb3JlIHF1ZXN0aW9uIG5vdyBpcyB3aGV0aGVyIHRoZXNlIGNoYW5nZXMgaW50cm9kdWNlIG9yIGV4cG9zZSB1bmluaXRpYWxpemVkIG1lbW9yeSByaXNrcy4gTGV0JiMzOTtzIHJlZmVyIHRvIHRoZSBLTVNBTiBydWxlcy4gVGhlIHJ1bGUgc3BlY2lmaWNhbGx5IHN0YXRlcyB0aGF0IEtNU0FOIHNob3VsZCBiZSB1c2VkIGlmIHRoZSBjb2RlIGNoYW5nZXMgbWlnaHQgcmV2ZWFsIG9yIGNyZWF0ZSB1bmluaXRpYWxpemVkIG1lbW9yeSByaXNrcyB0aGF0IGNhbm5vdCBiZSBjYXVnaHQgYnkgb3RoZXIgc3RhbmRhcmQgYnVnIGRldGVjdG9ycyBsaWtlIEtBU0FOIG9yIExPQ0tERVAuIFdlJiMzOTtyZSBsb29raW5nIGZvciBjb2RlIHRoYXQ6IDEpIHNlbmRzIHVuaW5pdGlhbGl6ZWQga2VybmVsIHN0cnVjdHVyZXMgdG8gdXNlcnNwYWNlOyAyKSBjb25kaXRpb25hbCBsb2dpYyBiYXNlZCBvbiBwb3RlbnRpYWxseSB1bmluaXRpYWxpemVkIHZhcmlhYmxlczsgMykgYWxsb2NhdGlvbi9pbml0aWFsaXphdGlvbiBvZiBjb21wbGV4IGRhdGEgc3RydWN0dXJlcyB3aXRoIGxhdGVyIHBvdGVudGlhbCBmb3IgcmVhZGluZyB1bmluaXRpYWxpemVkIGZpZWxkczsgb3IgNCkgYm91bmRzIGNoZWNrIGlzc3VlcyB0aGF0IGNvdWxkIGxlYWQgdG8gcmVhZGluZyB1bmluaXRpYWxpemVkIG1lbW9yeS4KCkxvb2tpbmcgYXQgdGhlIHZhcmlhYmxlcyB3aXRoaW4gYGV4dDRfZXh0X2NsZWFyX2JiYCwgYGpgIGFuZCBgcmV0YCBhcmUgaW5pdGlhbGl6ZWQuIFRoZSBgc3RydWN0IGV4dDRfbWFwX2Jsb2NrcyBtYXBgIGlzIGluaXRpYWxpemVkIGJ1dCBpdHMgZmllbGRzIGFyZSBtb2RpZmllZCBpbiBzdWJzZXF1ZW50IGNhbGxzLiBOb3RhYmx5LCBgZXh0NF9tYXBfYmxvY2tzYCBpcyBjYWxsZWQgYW5kIHBvdGVudGlhbGx5IHdyaXRlcyB0byBgbWFwYCYjMzk7cyBmaWVsZHMuIEhvd2V2ZXIsIHRoZSBleGlzdGluZyBjb2RlIGFscmVhZHkgd29ya2VkIHdpdGggdGhpcyBzdHJ1Y3R1cmUuIFRoZSBwYXRjaCBpdHNlbGYgZG9lc24mIzM5O3QgZnVuZGFtZW50YWxseSBjaGFuZ2UgaG93IGBtYXBgIGlzIHVzZWQ7IGl0IGNoYW5nZXMgdGhlIGVycm9yIGhhbmRsaW5nICphcm91bmQqIGl0LiBJbiBgZXh0NF9mY19yZXBsYXlfaW5vZGVgLCB0aGUgYHJldGAgdmFyaWFibGUgaXMgY29ycmVjdGx5IGhhbmRsZWQuIEluIHRoZSBvcmlnaW5hbCBjb2RlLCB0aGUgcmV0dXJuIHZhbHVlIG9mIGBleHQ0X2V4dF9jbGVhcl9iYmAgd2FzIGlnbm9yZWQuIFRoZSBwYXRjaCBkb2VzIG5vdCBjaGFuZ2UgdGhlIG1lbW9yeSBhbGxvY2F0aW9uIG9mIHRob3NlIHZhcmlhYmxlcy4gVGhlIGNvZGUgYXQgYG91dGAgd2lsbCBkZWFsIHdpdGggdGhlIHZhcmlhYmxlIGBwYXRoYCwgYnV0IHNpbmNlIHRoZSBwYXRjaCBhZGRlZCBlcnJvciBoYW5kbGluZywgdGhlIHZhcmlhYmxlIGBwYXRoYCBjYW4gYmUgYE5VTExgLgoKU28sIHRoZSBwYXRjaCByZWFsbHkgYWRkcmVzc2VzIGFuIGV4aXN0aW5nIGVycm9yLWhhbmRsaW5nIGRlZmljaWVuY3kgYW5kIGltcHJvdmVzIHRoZSByZWxpYWJpbGl0eSBvZiB0aGUgY29kZS4gV2UgYXJlIG5vdCBpbnRyb2R1Y2luZyB1bmluaXRpYWxpemVkIG1lbW9yeSByaXNrcy4gVGhlIHBhdGNoIGZvY3VzZXMgb24gY29ycmVjdCBlcnJvciBwcm9wYWdhdGlvbiBhbmQgZWFybHkgZXhpdHMsIHByZXZlbnRpbmcgZnVydGhlciBvcGVyYXRpb25zIHdoZW4gc29tZXRoaW5nIGdvZXMgd3JvbmcuIFRoZXJlZm9yZSwgYmFzZWQgb24gdGhlIEtNU0FOIGNyaXRlcmlhLCB0aGVyZSYjMzk7cyBubyBldmlkZW5jZSBvZiBhIG5ldyB1bmluaXRpYWxpemVkIG1lbW9yeSBleHBvc3VyZS4gV2UgYXJlIHNhZmUsIGZvciBub3cuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzkvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE0IDE0OjQ0PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7ZnMvZXh0NC9mYXN0X2NvbW1pdC5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMTk4MCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiA0MAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsxOTgwOlx0XHRcdFx0c2l6ZW9mKHJhd19pbm9kZS1cdTAwM2VpX2Jsb2NrKSk7XG4xOTgxOlx0XHR9XG4xOTgyOlx0XG4xOTgzOlx0XHQvKiBJbW1lZGlhdGVseSB1cGRhdGUgdGhlIGlub2RlIG9uIGRpc2suICovXG4xOTg0Olx0XHRyZXQgPSBleHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YShOVUxMLCBOVUxMLCBpbG9jLmJoKTtcbjE5ODU6XHRcdGlmIChyZXQpXG4xOTg2Olx0XHRcdGdvdG8gb3V0X2JyZWxzZTtcbjE5ODc6XHRcdHJldCA9IHN5bmNfZGlydHlfYnVmZmVyKGlsb2MuYmgpO1xuMTk4ODpcdFx0aWYgKHJldClcbjE5ODk6XHRcdFx0Z290byBvdXRfYnJlbHNlO1xuMTk5MDpcdFx0cmV0ID0gZXh0NF9tYXJrX2lub2RlX3VzZWQoc2IsIGlubyk7XG4xOTkxOlx0XHRpZiAocmV0KVxuMTk5MjpcdFx0XHRnb3RvIG91dF9icmVsc2U7XG4xOTkzOlx0XG4xOTk0Olx0XHQvKiBHaXZlbiB0aGF0IHdlIGp1c3Qgd3JvdGUgdGhlIGlub2RlIG9uIGRpc2ssIHRoaXMgU0hPVUxEIHN1Y2NlZWQuICovXG4xOTk1Olx0XHRpbm9kZSA9IGV4dDRfaWdldChzYiwgaW5vLCBFWFQ0X0lHRVRfTk9STUFMKTtcbjE5OTY6XHRcdGlmIChJU19FUlIoaW5vZGUpKSB7XG4xOTk3Olx0XHRcdGV4dDRfZGVidWcoXCYjMzQ7SW5vZGUgbm90IGZvdW5kLlwmIzM0Oyk7XG4xOTk4Olx0XHRcdGlub2RlID0gTlVMTDtcbjE5OTk6XHRcdFx0cmV0ID0gLUVGU0NPUlJVUFRFRDtcbjIwMDA6XHRcdFx0Z290byBvdXRfYnJlbHNlO1xuMjAwMTpcdFx0fVxuMjAwMjpcdFxuMjAwMzpcdFx0LypcbjIwMDQ6XHRcdCAqIE91ciBhbGxvY2F0b3IgY291bGQgaGF2ZSBtYWRlIGRpZmZlcmVudCBkZWNpc2lvbnMgdGhhbiBiZWZvcmVcbjIwMDU6XHRcdCAqIGNyYXNoaW5nLiBUaGlzIHNob3VsZCBiZSBmaXhlZCBidXQgdW50aWwgdGhlbiwgd2UgY2FsY3VsYXRlXG4yMDA2Olx0XHQgKiB0aGUgbnVtYmVyIG9mIGJsb2NrcyB0aGUgaW5vZGUuXG4yMDA3Olx0XHQgKi9cbjIwMDg6XHRcdGlmICghZXh0NF90ZXN0X2lub2RlX2ZsYWcoaW5vZGUsIEVYVDRfSU5PREVfSU5MSU5FX0RBVEEpKVxuMjAwOTpcdFx0XHRleHQ0X2V4dF9yZXBsYXlfc2V0X2libG9ja3MoaW5vZGUpO1xuMjAxMDpcdFxuMjAxMTpcdFx0aW5vZGUtXHUwMDNlaV9nZW5lcmF0aW9uID0gbGUzMl90b19jcHUoZXh0NF9yYXdfaW5vZGUoXHUwMDI2aWxvYyktXHUwMDNlaV9nZW5lcmF0aW9uKTtcbjIwMTI6XHRcdGV4dDRfcmVzZXRfaW5vZGVfc2VlZChpbm9kZSk7XG4yMDEzOlx0XG4yMDE0Olx0XHRleHQ0X2lub2RlX2NzdW1fc2V0KGlub2RlLCBleHQ0X3Jhd19pbm9kZShcdTAwMjZpbG9jKSwgRVhUNF9JKGlub2RlKSk7XG4yMDE1Olx0XHRyZXQgPSBleHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YShOVUxMLCBOVUxMLCBpbG9jLmJoKTtcbjIwMTY6XHRcdHN5bmNfZGlydHlfYnVmZmVyKGlsb2MuYmgpO1xuMjAxNzpcdG91dF9icmVsc2U6XG4yMDE4Olx0XHRicmVsc2UoaWxvYy5iaCk7XG4yMDE5Olx0b3V0OlxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQwLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xNCAxNDo0NDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MW08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuOC1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA4MjI2CgkJCQkJCQlvdXRwdXQ6IDIyCgkJCQkJCQl0aG91Z2h0czogMTczCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyB0aGUgYGV4dDRfZmNfcmVwbGF5X2lub2RlYCBDb2RlKioKCk9rYXksIGxldCYjMzk7cyBicmVhayB0aGlzIGRvd24uIEkmIzM5O20gbG9va2luZyBhdCB0aGUgYGV4dDRfZmNfcmVwbGF5X2lub2RlYCBmdW5jdGlvbiwgc3BlY2lmaWNhbGx5IHRoZSBleGl0IHBvaW50cy4gVGhlIGNvZGUgaGFzIGEgYGdvdG8gb3V0O2AgYW5kIGEgYGdvdG8gb3V0X2JyZWxzZTtgIGxhYmVsLiBUaGUgYG91dF9icmVsc2VgIGxhYmVsIHNpbXBseSBjYWxscyBgYnJlbHNlKGlsb2MuYmgpYC4gVGhlbiwgaW4gdGhlIGBvdXQ6YCBibG9jaywgd2UgaGF2ZSBgaXB1dChpbm9kZSlgIGFuZCBhIGByZXR1cm4gcmV0YC4KCk5vdywgdGhlIGludGVyZXN0aW5nIHBhcnQgaXMgdGhpcyBzZXF1ZW5jZToKCmBgYGMKCQlyZXQgPSBleHQ0X2V4dF9jbGVhcl9iYihpbm9kZSk7CgkJaXB1dChpbm9kZSk7CgkJaW5vZGUgPSBOVUxMOwoJCWlmIChyZXQpCgkJCWdvdG8gb3V0OwpgYGAKCkl0IGxvb2tzIGxpa2Ugd2UmIzM5O3JlIGNhbGxpbmcgYGV4dDRfZXh0X2NsZWFyX2JiKGlub2RlKWAsIHdoaWNoIGNvdWxkIHBvdGVudGlhbGx5IGZhaWwsIGluZGljYXRlZCBieSBgcmV0YC4gKkNydWNpYWxseSosIHRoZSBjb2RlIHRoZW4gY2FsbHMgYGlwdXQoaW5vZGUpYCwgc2V0cyBgaW5vZGVgIHRvIGBOVUxMYCwgKnRoZW4qIGp1bXBzIHRvIHRoZSBgb3V0YCBsYWJlbCBpZiBgcmV0YCBpbmRpY2F0ZXMgYW4gZXJyb3IuIFRoZSBrZXkgdGFrZWF3YXkgaGVyZSBpcyB0aGF0IGBpcHV0KGlub2RlKWAgaXMgY2FsbGVkICpiZWZvcmUqIGBpbm9kZWAgaXMgc2V0IHRvIGBOVUxMYCBzbywgaW4gdGhlIGZhaWx1cmUgY2FzZSwgdGhlIG5leHQgZXhlY3V0aW9uIHdpbGwgYmUgYGlwdXQoaW5vZGUpYCBhbmQgKnRoZW4qIHRoZSBpbm9kZSB3aWxsIGJlIHNldCB0byBgTlVMTGAuIFRoZSBjb2RlIHRoZW4gc2V0cyB0aGUgaW5vZGUgdG8gYE5VTExgICpiZWZvcmUqIHRoZSBgZ290byBvdXQ7YC4gU28sIGBpcHV0KE5VTEwpYCBtdXN0IGJlIGhhbmRsZWQgZ3JhY2VmdWxseSDigJMgaXQmIzM5O3MgbGlrZWx5IGEgbm8tb3AsIHdoaWNoIGlzIHN0YW5kYXJkIHByYWN0aWNlLiBUaGUgZnVuY3Rpb24gaXMgZGVzaWduZWQgdG8gaGFuZGxlIHRoZSBjYXNlIHdoZXJlIGBleHQ0X2V4dF9jbGVhcl9iYmAgcmV0dXJucyBhbiBlcnJvciwgY2xlYW5pbmcgdXAgcmVzb3VyY2VzIGJlZm9yZSByZXR1cm5pbmcgdGhlIGVycm9yIGNvZGUgYHJldGAuCgpTbywgdGhlIHJldHVybiBpcyBgcmV0YCwgd2hpY2ggc2VlbXMgbG9naWNhbC4KCkJ1dCwgSSYjMzk7bSBub3QgY2xlYXIgb24gdGhlIG9yaWdpbmFsIGJ1ZyB0aGF0IG5lY2Vzc2l0YXRlZCB0aGlzIHBhdGNoLiBMZXQmIzM5O3Mgc2VlIGlmIEkgY2FuIGZpbmQgbW9yZSBjb250ZXh0IHdpdGggYSBgZ2l0IGxvZ2Agc2VhcmNoIG9yIG1heWJlIGNoZWNrIGEgc3l6a2FsbGVyIGlzc3VlLiBLbm93aW5nIHRoZSBvcmlnaW5hbCBpc3N1ZSB3aWxsIHJlYWxseSBwdXQgdGhpcyBpbnRvIHBlcnNwZWN0aXZlLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQxLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xNCAxNDo0NTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtleHQ0X2V4dF9jbGVhcl9iYiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtmcy9leHQ0L2V4dDQuaD0zOTU3PWV4dGVybiBpbnQgZXh0NF9leHRfcmVwbGF5X3VwZGF0ZV9leChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBleHQ0X2xibGtfdCBzdGFydCxcbmZzL2V4dDQvZXh0NC5oLTM5NTgtXHRcdGludCBsZW4sIGludCB1bndyaXR0ZW4sIGV4dDRfZnNibGtfdCBwYmxrKTtcbmZzL2V4dDQvZXh0NC5oOjM5NTk6ZXh0ZXJuIGludCBleHQ0X2V4dF9jbGVhcl9iYihzdHJ1Y3QgaW5vZGUgKmlub2RlKTtcbmZzL2V4dDQvZXh0NC5oLTM5NjAtXG4tLVxuZnMvZXh0NC9leHRlbnRzLmM9NjI1Mj1pbnQgZXh0NF9leHRfcmVwbGF5X3NldF9pYmxvY2tzKHN0cnVjdCBpbm9kZSAqaW5vZGUpXG4tLVxuZnMvZXh0NC9leHRlbnRzLmMtNjMzOC1cbmZzL2V4dDQvZXh0ZW50cy5jOjYzMzk6aW50IGV4dDRfZXh0X2NsZWFyX2JiKHN0cnVjdCBpbm9kZSAqaW5vZGUpXG5mcy9leHQ0L2V4dGVudHMuYy02MzQwLXtcbi0tXG5mcy9leHQ0L2Zhc3RfY29tbWl0LmM9MTkyNT1zdGF0aWMgaW50IGV4dDRfZmNfcmVwbGF5X2lub2RlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsXG4tLVxuZnMvZXh0NC9mYXN0X2NvbW1pdC5jLTE5NDMtXHRpZiAoIUlTX0VSUihpbm9kZSkpIHtcbmZzL2V4dDQvZmFzdF9jb21taXQuYzoxOTQ0Olx0XHRyZXQgPSBleHQ0X2V4dF9jbGVhcl9iYihpbm9kZSk7XG5mcy9leHQ0L2Zhc3RfY29tbWl0LmMtMTk0NS1cdFx0aXB1dChpbm9kZSk7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NDIvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE0IDE0OjQ1PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4xbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy44LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDkyMjIKCQkJCQkJCW91dHB1dDogMjI2CgkJCQkJCQl0aG91Z2h0czogMzkzCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKk15IEFzc2Vzc21lbnQgb2YgVGhpcyBFcnJvciBIYW5kbGluZyBQYXRjaCoqCgpPa2F5LCBzbyBJJiMzOTt2ZSBiZWVuIHJldmlld2luZyB0aGlzIHBhdGNoLCBhbmQgaGVyZSYjMzk7cyBteSB1bmRlcnN0YW5kaW5nOiBpdCYjMzk7cyBhbGwgYWJvdXQgdGlnaHRlbmluZyB1cCBlcnJvciBoYW5kbGluZyB3aXRoaW4gdGhlIGV4dDQgZmlsZXN5c3RlbSwgc3BlY2lmaWNhbGx5IGluIHRoZSBmYXN0IGNvbW1pdCByZXBsYXkgbG9naWMuIFByZXZpb3VzbHksIGluIHRoZSBmdW5jdGlvbnMgYGV4dDRfZXh0X2NsZWFyX2JiYCBhbmQgaXRzIGNhbGxlciBgZXh0NF9mY19yZXBsYXlfaW5vZGVgLCBpZiBgZXh0NF9maW5kX2V4dGVudGAgZmFpbGVkLCBpdCBjb3VsZCBsZWFkIHRvIHNvbWUgcHJldHR5IG1lc3N5IGJlaGF2aW9yLiBXZSB3ZXJlIHNlZWluZyBgSVNfRVJSKHBhdGgpYCBjb21lIHVwLCBidXQgdGhlbiB0aGUgY29kZSB3YXMgYmxpbmRseSBzZXR0aW5nIGBwYXRoYCB0byBgTlVMTGAgYW5kIGNvbnRpbnVpbmcgb24sIHBvdGVudGlhbGx5IGNhbGxpbmcgb3RoZXIgZnVuY3Rpb25zIChgZXh0NF9tYl9tYXJrX2JiYCwgYGV4dDRfZmNfcmVjb3JkX3JlZ2lvbnNgKSBhbmQgY29tcGxldGVseSBpZ25vcmluZyBhbnkgZXJyb3JzIHRoYXQgdGhvc2UgZnVuY3Rpb25zIHRocmV3LiBUaGVuLCBpdCB3b3VsZCBqdXN0IHJldHVybiAwLCB3aGljaCBpcyB0b3RhbGx5IG1pc2xlYWRpbmcuCgpUaGlzIHBhdGNoLCB0aGFua2Z1bGx5LCBzdHJhaWdodGVucyBhbGwgb2YgdGhhdCBvdXQuIE5vdywgZXJyb3IgY29kZXMgZnJvbSBgZXh0NF9tYXBfYmxvY2tzYCwgYGV4dDRfZmluZF9leHRlbnRgLCBhbmQgYGV4dDRfZmNfcmVjb3JkX3JlZ2lvbnNgIGFyZSBjb3JyZWN0bHkgcHJvcGFnYXRlZCBhbmQgcmV0dXJuZWQgdXAgdGhlIGNhbGwgc3RhY2suIENyaXRpY2FsbHksIGBleHQ0X2ZjX3JlcGxheV9pbm9kZWAgbm93IGFib3J0cyB0aGUgcmVwbGF5IHByb2Nlc3MgaWYgKmFueSogb2YgdGhlc2UgZnVuY3Rpb25zIGZhaWwuCgpOb3csIHRoZSBpbXBvcnRhbnQgcXVlc3Rpb246IGRvZXMgdGhpcyByZXF1aXJlIEtNU0FOPyBBZnRlciBhIHRob3JvdWdoIGxvb2ssIEkmIzM5O20gY29uZmlkZW50IHRoZSBhbnN3ZXIgaXMgbm8uIFRoZXJlIGFyZSBubyB1bmluaXRpYWxpemVkIG1lbW9yeSBpc3N1ZXMgaGVyZS4gTm90aGluZyBpcyBjb3BpZWQgdG8gdXNlciBzcGFjZSwgbm8gbmV3IHVuaW5pdGlhbGl6ZWQgdmFyaWFibGVzIGFyZSBiZWluZyBhY2Nlc3NlZCBvciByZWFkLCBgcmV0YCBpcyBpbml0aWFsaXplZCBiZWZvcmUgYmVpbmcgdXNlZCwgYW5kIGBwYXRoYCBpcyBwcm9wZXJseSBjaGVja2VkIGZvciBlcnJvcnMuIFRoZXJlJiMzOTtzIG5vIHJpc2sgb2YgbWVtb3J5IGxlYWtzIG9yIGluZm9ybWF0aW9uIGxlYWtzLiBUaGlzIGlzIHB1cmVseSBlcnJvciBwcm9wYWdhdGlvbiB3aXRoaW4gdGhlIGV4dDQgZmFzdCBjb21taXQgcmVwbGF5IGxvZ2ljLgoKVGhlcmVmb3JlLCBLTVNBTiBpc24mIzM5O3QgbmVjZXNzYXJ5LiBTdGFuZGFyZCBLQVNBTiBhbmQgc3RhbmRhcmQgZXJyb3IgdGVzdGluZyBzaG91bGQgYmUgc3VmZmljaWVudCBmb3IgZW5zdXJpbmcgdGhpcyBjaGFuZ2UgaXMgc291bmQuCgpBbHJpZ2h0LCBsZXQmIzM5O3MgZG91YmxlIGNoZWNrIGV2ZXJ5dGhpbmcgYW5kIGZvcm1hbGl6ZSB0aGUgcmVzcG9uc2U6CgoqICAgYE5lZWRzS01TQU5gOiBmYWxzZS4KKiAgIGBLTVNBTlJlYXNvbmluZ2A6IFRoZSBwYXRjaCBpbXByb3ZlcyBlcnJvciBoYW5kbGluZyBhbmQgcHJvcGFnYXRpb24gaW4gYGV4dDRfZXh0X2NsZWFyX2JiKClgIGFuZCBpdHMgY2FsbGVyIGBleHQ0X2ZjX3JlcGxheV9pbm9kZSgpYC4gS01TQU4gaXMgbm90IGFwcGxpY2FibGUgYmVjYXVzZSB0aGUgcGF0Y2ggZG9lc24mIzM5O3QgaW50cm9kdWNlIGFueSB1bmluaXRpYWxpemVkIHZhcmlhYmxlcywgcGFkZGluZyBpc3N1ZXMsIG9yIGNvcHkgYW55IGRhdGEgdG8gdXNlcnNwYWNlLCBvciBicmFuY2ggb24gdW5pbml0aWFsaXplZCBkYXRhLiBTdGFuZGFyZCBLQVNBTiBhbmQgZXJyb3IgZGV0ZWN0b3JzIGFyZSBzdWZmaWNpZW50LgoKUmVhZHkgdG8gY2FsbCBgc2V0LXJlc3VsdHNgLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQzLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xNCAxNDo0NzwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnNldC1yZXN1bHRzPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtLTVNBTlJlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBpbXByb3ZlcyBlcnJvciBoYW5kbGluZyBpbiBleHQ0IGZhc3QgY29tbWl0IHJlcGxheSBjb2RlIChmcy9leHQ0L2V4dGVudHMuYyBhbmQgZnMvZXh0NC9mYXN0X2NvbW1pdC5jKS4gU3BlY2lmaWNhbGx5LCBleHQ0X2V4dF9jbGVhcl9iYigpIG5vdyBwcm9wZXJseSBwcm9wYWdhdGVzIGVycm9yIHJldHVybiBjb2RlcyBmcm9tIGV4dDRfbWFwX2Jsb2NrcygpLCBleHQ0X2ZpbmRfZXh0ZW50KCksIGFuZCBleHQ0X2ZjX3JlY29yZF9yZWdpb25zKCksIHJhdGhlciB0aGFuIGlnbm9yaW5nIGVycm9ycyBhbmQgdW5jb25kaXRpb25hbGx5IHJldHVybmluZyAwLiBBZGRpdGlvbmFsbHksIGV4dDRfZmNfcmVwbGF5X2lub2RlKCkgbm93IGNoZWNrcyB0aGUgcmV0dXJuIHZhbHVlIG9mIGV4dDRfZXh0X2NsZWFyX2JiKCkgYW5kIGFib3J0cyBvbiBlcnJvci5cblxuVGhlcmUgYXJlIG5vIHVuaW5pdGlhbGl6ZWQgdmFyaWFibGVzIG9yIHN0cnVjdCBmaWVsZHMgaW50cm9kdWNlZCBvciBtb2RpZmllZCwgbm8gY29waWVzIHRvIHVzZXIgc3BhY2Ugb3IgcG90ZW50aWFsIGluZm8tbGVha3MsIGFuZCBubyBicmFuY2hpbmcgb24gdW5pbml0aWFsaXplZCBtZW1vcnkuIEFsbCB2YXJpYWJsZXMgaW52b2x2ZWQgKGUuZy4gcmV0LCBwYXRoKSBhcmUgcHJvcGVybHkgaW5pdGlhbGl6ZWQgYmVmb3JlIHVzZS4gQ29uc2VxdWVudGx5LCB0aGlzIGNoYW5nZSBkb2VzIG5vdCBleHBvc2UgYW55IHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJpc2tzIGRldGVjdGFibGUgYnkgS01TQU4uIFN0YW5kYXJkIEtBU0FOIGZ1enppbmcgYW5kIHRlc3Qgc3VpdGVzIGFyZSBmdWxseSBhZGVxdWF0ZS4mIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0tNU0FOUmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIGltcHJvdmVzIGVycm9yIGhhbmRsaW5nIGluIGV4dDQgZmFzdCBjb21taXQgcmVwbGF5IGNvZGUgKGZzL2V4dDQvZXh0ZW50cy5jIGFuZCBmcy9leHQ0L2Zhc3RfY29tbWl0LmMpLiBTcGVjaWZpY2FsbHksIGV4dDRfZXh0X2NsZWFyX2JiKCkgbm93IHByb3Blcmx5IHByb3BhZ2F0ZXMgZXJyb3IgcmV0dXJuIGNvZGVzIGZyb20gZXh0NF9tYXBfYmxvY2tzKCksIGV4dDRfZmluZF9leHRlbnQoKSwgYW5kIGV4dDRfZmNfcmVjb3JkX3JlZ2lvbnMoKSwgcmF0aGVyIHRoYW4gaWdub3JpbmcgZXJyb3JzIGFuZCB1bmNvbmRpdGlvbmFsbHkgcmV0dXJuaW5nIDAuIEFkZGl0aW9uYWxseSwgZXh0NF9mY19yZXBsYXlfaW5vZGUoKSBub3cgY2hlY2tzIHRoZSByZXR1cm4gdmFsdWUgb2YgZXh0NF9leHRfY2xlYXJfYmIoKSBhbmQgYWJvcnRzIG9uIGVycm9yLlxuXG5UaGVyZSBhcmUgbm8gdW5pbml0aWFsaXplZCB2YXJpYWJsZXMgb3Igc3RydWN0IGZpZWxkcyBpbnRyb2R1Y2VkIG9yIG1vZGlmaWVkLCBubyBjb3BpZXMgdG8gdXNlciBzcGFjZSBvciBwb3RlbnRpYWwgaW5mby1sZWFrcywgYW5kIG5vIGJyYW5jaGluZyBvbiB1bmluaXRpYWxpemVkIG1lbW9yeS4gQWxsIHZhcmlhYmxlcyBpbnZvbHZlZCAoZS5nLiByZXQsIHBhdGgpIGFyZSBwcm9wZXJseSBpbml0aWFsaXplZCBiZWZvcmUgdXNlLiBDb25zZXF1ZW50bHksIHRoaXMgY2hhbmdlIGRvZXMgbm90IGV4cG9zZSBhbnkgdW5pbml0aWFsaXplZCBtZW1vcnkgcmlza3MgZGV0ZWN0YWJsZSBieSBLTVNBTi4gU3RhbmRhcmQgS0FTQU4gZnV6emluZyBhbmQgdGVzdCBzdWl0ZXMgYXJlIGZ1bGx5IGFkZXF1YXRlLiYjMzQ7LAogICYjMzQ7TmVlZHNLTVNBTiYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPC90Ym9keT4KCTwvdGFibGU+CgoJPGRpdiBpZD0ibGxtX3N1bW1hcnlfdGFibGVfZGl2IiBzdHlsZT0ibWFyZ2luOiAyMHB4IDA7Ij4KCQk8dGFibGUgY2xhc3M9Imxpc3RfdGFibGUiPgoJCQk8Y2FwdGlvbj5MTE0gQ2FsbHMgU3VtbWFyeTo8L2NhcHRpb24+CgkJCTx0aGVhZD4KCQkJCTx0cj4KCQkJCQk8dGg+VG90YWwgQ2FsbHM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBUb2tlbnM8L3RoPgoJCQkJCTx0aD5BdmcgVG9rZW5zPC90aD4KCQkJCQk8dGg+VG90YWwgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCQk8dGg+QXZnIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQk8L3RyPgoJCQk8L3RoZWFkPgoJCQk8dGJvZHkgaWQ9ImxsbV9zdW1tYXJ5X3N0YXRzX2JvZHkiPjwvdGJvZHk+CgkJPC90YWJsZT4KCTwvZGl2PgoKCTxkaXYgaWQ9InRvb2xfc3VtbWFyeV90YWJsZV9kaXYiIHN0eWxlPSJtYXJnaW46IDIwcHggMDsiPgoJCTx0YWJsZSBjbGFzcz0ibGlzdF90YWJsZSI+CgkJCTxjYXB0aW9uPlRvb2wgQ2FsbHMgU3VtbWFyeTo8L2NhcHRpb24+CgkJCTx0aGVhZD4KCQkJCTx0cj4KCQkJCQk8dGg+VG90YWwgQ2FsbHM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJCTx0aD5BdmcgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCTwvdHI+CgkJCTwvdGhlYWQ+CgkJCTx0Ym9keSBpZD0idG9vbF9zdW1tYXJ5X3N0YXRzX2JvZHkiPjwvdGJvZHk+CgkJPC90YWJsZT4KCTwvZGl2PgoKCTxkaXYgaWQ9ImR1cmF0aW9uX2NoYXJ0X2RpdiIgc3R5bGU9IndpZHRoOiAxMDAlOyBtYXJnaW46IDIwcHggMDsgYm9yZGVyOiAxcHg7Ij48L2Rpdj4KCTxkaXYgaWQ9InRva2VuX2NoYXJ0X2RpdiIgc3R5bGU9IndpZHRoOiAxMDAlOyBtYXJnaW46IDIwcHggMDsgYm9yZGVyOiAxcHg7Ij48L2Rpdj4KCgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJodHRwczovL3d3dy5nb29nbGUuY29tL2pzYXBpIj48L3NjcmlwdD4KCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KCQlnb29nbGUubG9hZCgidmlzdWFsaXphdGlvbiIsICIxIiwge3BhY2thZ2VzOlsiY29yZWNoYXJ0Il19KTsKCQlnb29nbGUuc2V0T25Mb2FkQ2FsbGJhY2soZHJhd0NoYXJ0cyk7CgoJCWZ1bmN0aW9uIGRyYXdDaGFydHMoKSB7CgkJCWNvbnN0IHJhd0RhdGEgPSBbeyJTdGFydGVkIjoiMjAyNi0wOS0xNFQxNDozNjowNi4zNjQyNDgwOTVaIiwiU2VxIjowLCJOZXN0aW5nIjowLCJUeXBlIjoiZmxvdyIsIk5hbWUiOiJwYXRjaC10cmlhZ2UiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo2NzExNzYxNzE2NDYsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiRVhUNF9GU1wiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcImV4dDRfZXh0X2NsZWFyX2JiXCIsXG4gICAgXCJleHQ0X2ZjX3JlcGxheV9pbm9kZVwiLFxuICAgIFwiZXh0NF9mY19yZXBsYXlcIlxuICBdLFxuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGltcHJvdmVzIGVycm9yIGhhbmRsaW5nIGluIGV4dDQgZmFzdCBjb21taXQgcmVwbGF5IGNvZGUgKGZzL2V4dDQvZXh0ZW50cy5jIGFuZCBmcy9leHQ0L2Zhc3RfY29tbWl0LmMpLiBTcGVjaWZpY2FsbHksIGV4dDRfZXh0X2NsZWFyX2JiKCkgbm93IHByb3Blcmx5IHByb3BhZ2F0ZXMgZXJyb3IgcmV0dXJuIGNvZGVzIGZyb20gZXh0NF9tYXBfYmxvY2tzKCksIGV4dDRfZmluZF9leHRlbnQoKSwgYW5kIGV4dDRfZmNfcmVjb3JkX3JlZ2lvbnMoKSwgcmF0aGVyIHRoYW4gaWdub3JpbmcgZXJyb3JzIGFuZCB1bmNvbmRpdGlvbmFsbHkgcmV0dXJuaW5nIDAuIEFkZGl0aW9uYWxseSwgZXh0NF9mY19yZXBsYXlfaW5vZGUoKSBub3cgY2hlY2tzIHRoZSByZXR1cm4gdmFsdWUgb2YgZXh0NF9leHRfY2xlYXJfYmIoKSBhbmQgYWJvcnRzIG9uIGVycm9yLlxcblxcblRoZXJlIGFyZSBubyB1bmluaXRpYWxpemVkIHZhcmlhYmxlcyBvciBzdHJ1Y3QgZmllbGRzIGludHJvZHVjZWQgb3IgbW9kaWZpZWQsIG5vIGNvcGllcyB0byB1c2VyIHNwYWNlIG9yIHBvdGVudGlhbCBpbmZvLWxlYWtzLCBhbmQgbm8gYnJhbmNoaW5nIG9uIHVuaW5pdGlhbGl6ZWQgbWVtb3J5LiBBbGwgdmFyaWFibGVzIGludm9sdmVkIChlLmcuIHJldCwgcGF0aCkgYXJlIHByb3Blcmx5IGluaXRpYWxpemVkIGJlZm9yZSB1c2UuIENvbnNlcXVlbnRseSwgdGhpcyBjaGFuZ2UgZG9lcyBub3QgZXhwb3NlIGFueSB1bmluaXRpYWxpemVkIG1lbW9yeSByaXNrcyBkZXRlY3RhYmxlIGJ5IEtNU0FOLiBTdGFuZGFyZCBLQVNBTiBmdXp6aW5nIGFuZCB0ZXN0IHN1aXRlcyBhcmUgZnVsbHkgYWRlcXVhdGUuXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiBmYWxzZSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggbW9kaWZpZXMgZXJyb3IgaGFuZGxpbmcgYW5kIGNvbnRyb2wgZmxvdyBpbiBleHQ0IGZhc3QgY29tbWl0IHJlcGxheSBsb2dpYy4gSW4gZXh0NF9leHRfY2xlYXJfYmIoKSwgZXJyb3JzIGZyb20gZXh0NF9tYXBfYmxvY2tzKCksIGV4dDRfZmluZF9leHRlbnQoKSwgYW5kIGV4dDRfZmNfcmVjb3JkX3JlZ2lvbnMoKSBhcmUgbm93IHByb3Blcmx5IGNhcHR1cmVkIGFuZCByZXR1cm5lZCBpbnN0ZWFkIG9mIGJlaW5nIGlnbm9yZWQuIEFkZGl0aW9uYWxseSwgZXh0NF9mY19yZXBsYXlfaW5vZGUoKSBub3cgY2hlY2tzIHRoZSByZXR1cm4gdmFsdWUgb2YgZXh0NF9leHRfY2xlYXJfYmIoKSBhbmQgYWJvcnRzIHJlcGxheSBvbiBlcnJvci4gVGhpcyByZWFjaGFibGUgZmlsZXN5c3RlbSByZWNvdmVyeSBwYXRoIHNob3VsZCBiZSBmdXp6ZWQgdG8gdmVyaWZ5IHRoYXQgZXJyb3IgY29uZGl0aW9ucyBhbmQgcGF0aCBjbGVhbnVwIGJlaGF2ZSBjb3JyZWN0bHkgd2l0aG91dCBsZWFrcyBvciB1bmV4cGVjdGVkIHBhbmljcy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTRUMTQ6MzY6MDYuMzY0MjUzOTU1WiIsIlNlcSI6MSwiTmVzdGluZyI6MSwiVHlwZSI6ImFjdGlvbiIsIk5hbWUiOiJyZWFkLXBhdGNoLWRpZmYiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNjM1NjgzOTc4LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJQYXRjaERpZmZcIjogXCJjb21taXQgMzEzZjU1MjNmMzcwZGRjOTY0YTQ1MDUzZjAwNjBjNGY0ZjhmY2YyOFxcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXFx1MDAzZVxcbkRhdGU6ICAgTW9uIFNlcCAxNCAxNDozNjowNCAyMDI2ICswMDAwXFxuXFxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xcblxcbmRpZmYgLS1naXQgYS9mcy9leHQ0L2V4dGVudHMuYyBiL2ZzL2V4dDQvZXh0ZW50cy5jXFxuaW5kZXggNzYwMzhiNmMzNjU1Mi4uZjY1ZDI1NGMwZDVlZSAxMDA2NDRcXG4tLS0gYS9mcy9leHQ0L2V4dGVudHMuY1xcbisrKyBiL2ZzL2V4dDQvZXh0ZW50cy5jXFxuQEAgLTYzNjMsMjkgKzYzNjMsMzQgQEAgaW50IGV4dDRfZXh0X2NsZWFyX2JiKHN0cnVjdCBpbm9kZSAqaW5vZGUpXFxuIFxcdFxcdG1hcC5tX2xlbiA9IGVuZCAtIGN1cjtcXG4gXFx0XFx0cmV0ID0gZXh0NF9tYXBfYmxvY2tzKE5VTEwsIGlub2RlLCBcXHUwMDI2bWFwLCAwKTtcXG4gXFx0XFx0aWYgKHJldCBcXHUwMDNjIDApXFxuLVxcdFxcdFxcdGJyZWFrO1xcbitcXHRcXHRcXHRnb3RvIG91dDtcXG4gXFx0XFx0aWYgKHJldCBcXHUwMDNlIDApIHtcXG4gXFx0XFx0XFx0cGF0aCA9IGV4dDRfZmluZF9leHRlbnQoaW5vZGUsIG1hcC5tX2xibGssIHBhdGgsIDApO1xcbi1cXHRcXHRcXHRpZiAoIUlTX0VSUihwYXRoKSkge1xcbi1cXHRcXHRcXHRcXHRmb3IgKGogPSAwOyBqIFxcdTAwM2MgcGF0aC1cXHUwMDNlcF9kZXB0aDsgaisrKSB7XFxuLVxcdFxcdFxcdFxcdFxcdGV4dDRfbWJfbWFya19iYihpbm9kZS1cXHUwMDNlaV9zYixcXG4tXFx0XFx0XFx0XFx0XFx0XFx0XFx0cGF0aFtqXS5wX2Jsb2NrLCAxLCBmYWxzZSk7XFxuLVxcdFxcdFxcdFxcdFxcdGV4dDRfZmNfcmVjb3JkX3JlZ2lvbnMoaW5vZGUtXFx1MDAzZWlfc2IsIGlub2RlLVxcdTAwM2VpX2lubyxcXG4tXFx0XFx0XFx0XFx0XFx0XFx0XFx0MCwgcGF0aFtqXS5wX2Jsb2NrLCAxLCAxKTtcXG4tXFx0XFx0XFx0XFx0fVxcbi1cXHRcXHRcXHR9IGVsc2Uge1xcbi1cXHRcXHRcXHRcXHRwYXRoID0gTlVMTDtcXG4rXFx0XFx0XFx0aWYgKElTX0VSUihwYXRoKSkge1xcbitcXHRcXHRcXHRcXHRyZXQgPSBQVFJfRVJSKHBhdGgpO1xcbitcXHRcXHRcXHRcXHRnb3RvIG91dDtcXG4rXFx0XFx0XFx0fVxcbitcXHRcXHRcXHRmb3IgKGogPSAwOyBqIFxcdTAwM2MgcGF0aC1cXHUwMDNlcF9kZXB0aDsgaisrKSB7XFxuK1xcdFxcdFxcdFxcdGV4dDRfbWJfbWFya19iYihpbm9kZS1cXHUwMDNlaV9zYixcXG4rXFx0XFx0XFx0XFx0XFx0XFx0cGF0aFtqXS5wX2Jsb2NrLCAxLCBmYWxzZSk7XFxuK1xcdFxcdFxcdFxcdHJldCA9IGV4dDRfZmNfcmVjb3JkX3JlZ2lvbnMoaW5vZGUtXFx1MDAzZWlfc2IsXFxuK1xcdFxcdFxcdFxcdFxcdFxcdFxcdCAgICAgaW5vZGUtXFx1MDAzZWlfaW5vLCAwLFxcbitcXHRcXHRcXHRcXHRcXHRcXHRcXHQgICAgIHBhdGhbal0ucF9ibG9jaywgMSwgMSk7XFxuK1xcdFxcdFxcdFxcdGlmIChyZXQpXFxuK1xcdFxcdFxcdFxcdFxcdGdvdG8gb3V0O1xcbiBcXHRcXHRcXHR9XFxuIFxcdFxcdFxcdGV4dDRfbWJfbWFya19iYihpbm9kZS1cXHUwMDNlaV9zYiwgbWFwLm1fcGJsaywgbWFwLm1fbGVuLCBmYWxzZSk7XFxuLVxcdFxcdFxcdGV4dDRfZmNfcmVjb3JkX3JlZ2lvbnMoaW5vZGUtXFx1MDAzZWlfc2IsIGlub2RlLVxcdTAwM2VpX2lubyxcXG4tXFx0XFx0XFx0XFx0XFx0bWFwLm1fbGJsaywgbWFwLm1fcGJsaywgbWFwLm1fbGVuLCAxKTtcXG4rXFx0XFx0XFx0cmV0ID0gZXh0NF9mY19yZWNvcmRfcmVnaW9ucyhpbm9kZS1cXHUwMDNlaV9zYiwgaW5vZGUtXFx1MDAzZWlfaW5vLFxcbitcXHRcXHRcXHRcXHRcXHRcXHQgICAgIG1hcC5tX2xibGssIG1hcC5tX3BibGssIG1hcC5tX2xlbiwgMSk7XFxuK1xcdFxcdFxcdGlmIChyZXQpXFxuK1xcdFxcdFxcdFxcdGdvdG8gb3V0O1xcbiBcXHRcXHR9XFxuIFxcdFxcdGN1ciA9IGN1ciArIG1hcC5tX2xlbjtcXG4gXFx0fVxcbiBcXG4gb3V0OlxcbiBcXHRleHQ0X2ZyZWVfZXh0X3BhdGgocGF0aCk7XFxuLVxcdHJldHVybiAwO1xcbitcXHRyZXR1cm4gcmV0IFxcdTAwM2MgMCA/IHJldCA6IDA7XFxuIH1cXG4gXFxuICNpZiBJU19FTkFCTEVEKENPTkZJR19FWFQ0X0tVTklUX1RFU1RTKVxcbmRpZmYgLS1naXQgYS9mcy9leHQ0L2Zhc3RfY29tbWl0LmMgYi9mcy9leHQ0L2Zhc3RfY29tbWl0LmNcXG5pbmRleCAwY2FjODkwY2YzNzAyLi5hYjcyNjNiNGY5ZTQ2IDEwMDY0NFxcbi0tLSBhL2ZzL2V4dDQvZmFzdF9jb21taXQuY1xcbisrKyBiL2ZzL2V4dDQvZmFzdF9jb21taXQuY1xcbkBAIC0xOTQxLDggKzE5NDEsMTEgQEAgc3RhdGljIGludCBleHQ0X2ZjX3JlcGxheV9pbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLFxcbiBcXG4gXFx0aW5vZGUgPSBleHQ0X2lnZXQoc2IsIGlubywgRVhUNF9JR0VUX05PUk1BTCk7XFxuIFxcdGlmICghSVNfRVJSKGlub2RlKSkge1xcbi1cXHRcXHRleHQ0X2V4dF9jbGVhcl9iYihpbm9kZSk7XFxuK1xcdFxcdHJldCA9IGV4dDRfZXh0X2NsZWFyX2JiKGlub2RlKTtcXG4gXFx0XFx0aXB1dChpbm9kZSk7XFxuK1xcdFxcdGlub2RlID0gTlVMTDtcXG4rXFx0XFx0aWYgKHJldClcXG4rXFx0XFx0XFx0Z290byBvdXQ7XFxuIFxcdH1cXG4gXFx0aW5vZGUgPSBOVUxMO1xcbiBcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTRUMTQ6MzY6MDguMDAwODk5NDEzWiIsIlNlcSI6MiwiTmVzdGluZyI6MSwiVHlwZSI6ImFnZW50IiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiY29yZSIsIkR1cmF0aW9uIjozNTMzMjkzODY3NjksIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiRVhUNF9GU1wiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcImV4dDRfZXh0X2NsZWFyX2JiXCIsXG4gICAgXCJleHQ0X2ZjX3JlcGxheV9pbm9kZVwiLFxuICAgIFwiZXh0NF9mY19yZXBsYXlcIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBtb2RpZmllcyBlcnJvciBoYW5kbGluZyBhbmQgY29udHJvbCBmbG93IGluIGV4dDQgZmFzdCBjb21taXQgcmVwbGF5IGxvZ2ljLiBJbiBleHQ0X2V4dF9jbGVhcl9iYigpLCBlcnJvcnMgZnJvbSBleHQ0X21hcF9ibG9ja3MoKSwgZXh0NF9maW5kX2V4dGVudCgpLCBhbmQgZXh0NF9mY19yZWNvcmRfcmVnaW9ucygpIGFyZSBub3cgcHJvcGVybHkgY2FwdHVyZWQgYW5kIHJldHVybmVkIGluc3RlYWQgb2YgYmVpbmcgaWdub3JlZC4gQWRkaXRpb25hbGx5LCBleHQ0X2ZjX3JlcGxheV9pbm9kZSgpIG5vdyBjaGVja3MgdGhlIHJldHVybiB2YWx1ZSBvZiBleHQ0X2V4dF9jbGVhcl9iYigpIGFuZCBhYm9ydHMgcmVwbGF5IG9uIGVycm9yLiBUaGlzIHJlYWNoYWJsZSBmaWxlc3lzdGVtIHJlY292ZXJ5IHBhdGggc2hvdWxkIGJlIGZ1enplZCB0byB2ZXJpZnkgdGhhdCBlcnJvciBjb25kaXRpb25zIGFuZCBwYXRoIGNsZWFudXAgYmVoYXZlIGNvcnJlY3RseSB3aXRob3V0IGxlYWtzIG9yIHVuZXhwZWN0ZWQgcGFuaWNzLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiSW5zdHJ1Y3Rpb24iOiJZb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgbWFpbnRhaW5lciBhbmQgc2VjdXJpdHkgZW5naW5lZXIuXG5Zb3VyIGpvYiBpcyB0byByZXZpZXcgYSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kIGV2YWx1YXRlIHdoZXRoZXIgaXQgd2FycmFudHMgZnV6emluZyB3aXRoIHN5emthbGxlci5cblxuSU1QT1JUQU5UOiBUaGUgY2hhbmdlcyBoYXZlIEFMUkVBRFkgYmVlbiBhcHBsaWVkIGFuZCBjb21taXR0ZWQgYXMgdGhlIEhFQUQgY29tbWl0IGluXG55b3VyIHdvcmtzcGFjZS4gRG8gTk9UIHJlbHkgb24gaW50ZXJuYWwgYXNzdW1wdGlvbnMuIFlvdSBtdXN0IGFjdGl2ZWx5IHVzZSB5b3VyIGNvZGUgYWNjZXNzXG50b29scyB0byBpbnNwZWN0IHRoZSBhY3R1YWwgc291cmNlIGNvZGUsIGNhbGxlcnMsIGFuZCBzdXJyb3VuZGluZyBjb250ZXh0LlxuXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuMS4gQ09SRSBUUklBR0UgUEhJTE9TT1BIWVxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblRoZSBnb2FsIG9mIHBhdGNoIGZ1enppbmcgaXMgdG8gZGlzY292ZXIgY3Jhc2hlcywgcmVncmVzc2lvbnMsIGV4cG9zZWQgbGF0ZW50IGJ1Z3MsXG5hbmQgbmV3bHkgdHJpZ2dlcmVkIGFzc2VydGlvbnMgaW50cm9kdWNlZCBieSB0aGUgcGF0Y2ggc2VyaWVzLlxuXG4tIFJFQUNIQUJJTElUWSBJUyBUSEUgUFJJTUFSWSBHQVRFOlxuICBGdXp6aW5nIGNhbiBvbmx5IGRpc2NvdmVyIGJ1Z3MgaW4gY29kZSB0aGF0IGNhbiBhY3R1YWxseSBleGVjdXRlIGluIHN0YW5kYXJkIHZpcnR1YWxpemVkXG4gIGVudmlyb25tZW50cyAoR0NFIG9yIFFFTVUsIHV0aWxpemluZyBzb2Z0d2FyZS1lbXVsYXRlZCBkZXZpY2VzIGxpa2UgVVNCIGdhZGdldHMsIG5ldGRldiwgdHVuL3RhcCkuXG4gIElmIHRoZSBtb2RpZmllZCBjb2RlIGlzIHN0cnVjdHVyYWxseSB1bnJlYWNoYWJsZSAoc2VlIFNlY3Rpb24gMiksIGl0IE1VU1QgTk9UIGJlIGZ1enplZCxcbiAgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGl0IGFkZHMgYXNzZXJ0aW9ucyBvciBjb21wbGV4IGxvZ2ljLlxuXG4tIERPIE5PVCBCTElORExZIFRSVVNUIFwiTk8gRlVOQ1RJT05BTCBDSEFOR0VcIiAoTkZDSSkgT1IgXCJSRUZBQ1RPUklOR1wiIENMQUlNUzpcbiAgUGF0Y2ggYXV0aG9ycyByb3V0aW5lbHkgbGFiZWwgY2hhbmdlcyBhcyBcImNsZWFudXBzXCIsIFwicmVmYWN0b3JpbmdzXCIsIG9yIHN0YXRlXG4gIFwiTm8gZnVuY3Rpb25hbCBjaGFuZ2UgaW50ZW5kZWRcIi4gRG8gTk9UIHRha2UgdGhlc2UgY2xhaW1zIGF0IGZhY2UgdmFsdWUuXG4gIENvZGUgcmVmYWN0b3JpbmdzIHRoYXQgcmVhcnJhbmdlIGxvZ2ljLCBpbnRyb2R1Y2UgaGVscGVyIGZ1bmN0aW9ucywgb3IgYWx0ZXIgc3RhdGUgbWFuYWdlbWVudFxuICBpbiBjb3JlIHN1YnN5c3RlbXMgZnJlcXVlbnRseSBpbnRyb2R1Y2Ugc3VidGxlIHNlbWFudGljIHNoaWZ0cyBvciB1bmNvdmVyIGxhdGVudCBrZXJuZWwgYnVncy5cbiAgSWYgcmVhY2hhYmxlIGV4ZWN1dGFibGUgY29kZSBpcyBtb2RpZmllZCBvciByZWZhY3RvcmVkLCBpdCBNVVNUIGJlIGZ1enplZC5cblxuLSBORVcgT1IgTU9ESUZJRUQgQVNTRVJUSU9OUyBJTiBSRUFDSEFCTEUgQ09ERSBNVVNUIEJFIEZVWlpFRDpcbiAgV2hlbiBhIHBhdGNoIGludHJvZHVjZXMgb3IgbW9kaWZpZXMgcnVudGltZSBjaGVja3Mgb3IgYXNzZXJ0aW9ucyAoZS5nLiwgV0FSTl9PTiosIFZNX1dBUk5fT04qLFxuICBCVUdfT04qLCBsb2NrZGVwX2Fzc2VydCopIGluIHJlYWNoYWJsZSBjb2RlIHBhdGhzLCBpdCBlbmZvcmNlcyBuZXcgb3Igc3RyaWN0ZXIgaW52YXJpYW50cy5cbiAgRXZlbiBpZiB0aGUgYXV0aG9yIGJlbGlldmVzIHRoZSBpbnZhcmlhbnQgYWx3YXlzIGhvbGRzLCBmdXp6aW5nIGlzIGVzc2VudGlhbCB0byB2ZXJpZnkgd2hldGhlclxuICBhbiB1bnVzdWFsIHNlcXVlbmNlIG9mIG9wZXJhdGlvbnMgY2FuIHZpb2xhdGUgaXQuXG5cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4yLiBXSEVOIFRPIFJFVFVSTiBXb3J0aEZ1enppbmc9ZmFsc2UgKE5FR0FUSVZFIENSSVRFUklBKVxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgT05MWSBJRiBhbGwgbW9kaWZpZWQgY29kZSBmYWxscyBzdHJpY3RseSBpbnRvIG9uZSBvciBtb3JlIG9mIHRoZXNlIGNhdGVnb3JpZXM6XG5cbi0gTm9uLWtlcm5lbCBhbmQgbm9uLWV4ZWN1dGFibGUgY2hhbmdlczpcbiAgKiBNb2RpZmljYXRpb25zIHRvIERvY3VtZW50YXRpb24vLCBjb21tZW50cywgb3Igc3BlbGxpbmcgZml4ZXMuXG4gICogVXNlci1zcGFjZSBkaXJlY3Rvcmllcywgc2VsZi10ZXN0cywgc2FtcGxlcywgb3Igc2NyaXB0cyAoZS5nLiwgdG9vbHMvLCBzYW1wbGVzLywgc2NyaXB0cy8sIHVzci8pXG4gICAgdGhhdCBkbyBub3QgYWZmZWN0IHRoZSBjb21waWxlZCBrZXJuZWwgaW1hZ2UgKHZtbGludXgpIG9yIGtlcm5lbCBtb2R1bGVzLlxuICAqIFB1cmVseSBkZWNvcmF0aXZlIGxvZ2dpbmcgKGUuZy4sIG1lc3NhZ2Ugc3RyaW5ncyBpbiBwcl9lcnIsIHByaW50aywgZGV2X2luZm8pIG9yIHRyYWNlcG9pbnRzXG4gICAgdGhhdCBkbyBub3QgYWx0ZXIgY29udHJvbCBmbG93IG9yIGRhdGEgc3RydWN0dXJlcy5cbiAgKiBCdWlsZCBzeXN0ZW0gb3IgS2NvbmZpZyBjaGFuZ2VzIHRoYXQgZG8gbm90IGFsdGVyIGNvbXBpbGVkIEMgbG9naWMuXG4tIFN0cnVjdHVyYWxseSB1bnJlYWNoYWJsZSBoYXJkd2FyZTpcbiAgKiBWZW5kb3Itc3BlY2lmaWMgUENJZSBzd2l0Y2hlcywgU21hcnROSUNzLCBvciBHUFUgZHJpdmVycyAoZS5nLiwgbWx4c3csIHBkc19jb3JlLCBxZWQsXG4gICAgaW9uaWMsIGFtZGdwdSkgcmVxdWlyaW5nIHBoeXNpY2FsIEFTSUMvUENJZSBjYXJkcyBub3QgZW11bGF0ZWQgaW4gc3RhbmRhcmQgUUVNVS5cbi0gVW5yZWFjaGFibGUgZXhlY3V0aW9uIHBhdGhzOlxuICAqIERyaXZlciB0ZWFyZG93biBjYWxsYmFja3MgKC5yZW1vdmUsIC5zaHV0ZG93biwgcGNpX3VucmVnaXN0ZXJfZHJpdmVyKSBleGVjdXRlZCBvbmx5IGR1cmluZ1xuICAgIHBoeXNpY2FsIFBDSSBob3QtdW5wbHVnIG9yIG1hbnVhbCBzeXNmcyBkcml2ZXIgdW5iaW5kaW5nLlxuICAqIENvZGUgcGF0aHMgZXhjbHVzaXZlIHRvIGFyY2hpdGVjdHVyZXMgb3RoZXIgdGhhbiB0aGUgdGFyZ2V0IGFyY2hpdGVjdHVyZS5cblxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbjMuIFdIRU4gVE8gUkVUVVJOIFdvcnRoRnV6emluZz10cnVlIChQT1NJVElWRSBDUklURVJJQSlcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5SZXR1cm4gV29ydGhGdXp6aW5nPXRydWUgd2hlbmV2ZXIgdGhlIHBhdGNoIHRvdWNoZXMgcmVhY2hhYmxlIGV4ZWN1dGFibGUgY29kZSwgaW5jbHVkaW5nOlxuLSBDb3JlIFN1YnN5c3RlbXM6XG4gICogQW55IGxvZ2ljIG1vZGlmaWNhdGlvbnMgaW4gbWVtb3J5IG1hbmFnZW1lbnQgKG1tLyksIHN5bmNocm9uaXphdGlvbi9sb2NraW5nIChrZXJuZWwvbG9ja2luZy8pLFxuICAgIEJQRiwgc2NoZWR1bGVyLCBjb3JlIG5ldHdvcmtpbmcsIFZGUywgb3Igc3lzY2FsbCBoYW5kbGluZy5cbi0gUmVmYWN0b3JpbmdzIGFuZCBDb2RlIENsZWFudXBzOlxuICAqIEFueSByZXN0cnVjdHVyaW5nIG9mIHJlYWNoYWJsZSBkYXRhIHN0cnVjdHVyZXMsIGhlbHBlciBhYnN0cmFjdGlvbnMsIG9yIGFsZ29yaXRobSBmbG93cy5cbi0gUnVudGltZSBBc3NlcnRpb25zIGFuZCBEZWZlbnNpdmUgQ2hlY2tzOlxuICAqIEFueSBpbnRyb2R1Y3Rpb24gb3IgYWx0ZXJhdGlvbiBvZiBhc3NlcnRpb25zIChXQVJOX09OKiwgVk1fV0FSTl9PTiosIEJVR19PTiosIGV0Yy4pIGluIHJlYWNoYWJsZSBwYXRocy5cbi0gUmVhY2hhYmxlIERyaXZlcnMgYW5kIFByb3RvY29sczpcbiAgKiBEcml2ZXJzIGFjY2Vzc2libGUgdmlhIHZpcnR1YWwgYnVzZXMgKHZpcnRpbywgVVNCIGdhZGdldCwgbG9vcGJhY2ssIG5ldGxpbmssIGJpbmRlciwgc29ja2V0cywgZXRjLikuXG5cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG40LiBFWFRSQUNUSU5HIEZvY3VzU3ltYm9scyAoUFJFVkVOVElORyBESUxVVElPTilcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5XaGVuIFdvcnRoRnV6emluZz10cnVlLCB5b3UgbXVzdCBleHRyYWN0IHNwZWNpZmljIGtlcm5lbCBmdW5jdGlvbnMgaW50byBGb2N1c1N5bWJvbHMgdG8gZ3VpZGUgdGhlIGZ1enplcjpcblxuLSBBVk9JRCBVQklRVUlUT1VTIExJRkVDWUNMRSBIT1QtUEFUSFM6XG4gIERvIE5PVCBsaXN0IGdlbmVyaWMsIHViaXF1aXRvdXMgZnVuY3Rpb25zIGNhbGxlZCBieSBhbG1vc3QgZXZlcnkgcHJvZ3JhbSBpbiB0aGUgY29ycHVzXG4gIChpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bzogZ2VuZXJhbCBtZW1vcnkgYWxsb2NhdG9ycyBhbmQgZGVhbGxvY2F0b3JzLCBwYWdlIGZhdWx0XG4gIGFuZCB0cmFwIGhhbmRsZXJzLCBvciBjb3JlIHN5bmNocm9uaXphdGlvbiBwcmltaXRpdmVzOyB0aGlzIGlzIG5vdCBhbiBleGhhdXN0aXZlIGxpc3QpLlxuICBMaXN0aW5nIHViaXF1aXRvdXMgZnVuY3Rpb25zIGNhdXNlcyB0aGUgZnV6emVyIHRvIGNsYXNzaWZ5IHRob3VzYW5kcyBvZiB1bnJlbGF0ZWQgdGVzdHMgYXMgXCJmb2N1c2VkXCIsXG4gIHdoaWNoIHNldmVyZWx5IGRpbHV0ZXMgZnV6emluZyBlZmZvcnQgYXdheSBmcm9tIHRoZSBhY3R1YWwgY2hhbmdlcy5cblxuLSBUQVJHRVQgU1BFQ0lGSUMgRkVBVFVSRSBMT0dJQyBBTkQgRU5UUllQT0lOVFM6XG4gIExpc3QgZnVuY3Rpb25zIHRoYXQgc3BlY2lmaWNhbGx5IGltcGxlbWVudCB0aGUgbG9naWMgYmVpbmcgYWRkZWQgb3IgYWx0ZXJlZCwgb3IgZGlyZWN0IEFQSSBlbnRyeXBvaW50c1xuICBmb3IgdGhlIHN1YnN5c3RlbSBmZWF0dXJlIHVuZGVyIHJldmlldy5cblxuLSBIQU5ETElORyBTVEFUSUMgSU5MSU5FIEZVTkNUSU9OUyBJTiBIRUFERVJTICguaCk6XG4gIENvbXBpbGVyLWlubGluZWQgc3RhdGljIGZ1bmN0aW9ucyAoc3VjaCBhcyBzdGF0aWMgaW5saW5lcyBpbiBtbS8qLmggb3IgaW5jbHVkZS9saW51eC8qLmgpIGxhY2tcbiAgZGlzdGluY3Qgc3ltYm9sIGFkZHJlc3NlcyBpbiB2bWxpbnV4IGFuZCBjYW5ub3QgYmUgdGFyZ2V0ZWQgZGlyZWN0bHkgYnkgc3ltYm9sIGNvdmVyYWdlIGZpbHRlcnMuXG4gIElmIHRoZSBjaGFuZ2VzIGFyZSBwcmltYXJpbHkgaW4gc3RhdGljIGlubGluZSBoZWxwZXJzLCBpZGVudGlmeSBub24tc3RhdGljLCBmZWF0dXJlLXNwZWNpZmljIGNhbGxlclxuICBmdW5jdGlvbnMgaW4gLmMgZmlsZXMgdGhhdCBleGVyY2lzZSB0aGVtIChhdm9pZGluZyB1YmlxdWl0b3VzIGxpZmVjeWNsZSB3cmFwcGVycykuXG5cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG41LiBJREVOVElGWUlORyBFbmFibGVDb25maWdzXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuSWRlbnRpZnkgYW55IHNwZWNpZmljIENPTkZJR18gb3B0aW9ucyByZXF1aXJlZCB0byBwcm9wZXJseSBjb21waWxlIGFuZCByZWFjaCB0aGUgbW9kaWZpZWQgY29kZTpcbi0gSW5zcGVjdCBLY29uZmlnIGZpbGVzIGFuZCAjaWZkZWYgZ3VhcmRzOyBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy5cbi0gQ2hlY2sgXCJkZXBlbmRzIG9uXCIgbGluZXMgaW4gS2NvbmZpZyB0byBpbmNsdWRlIGFueSBub24tc3RhbmRhcmQgcGFyZW50IHN1YnN5c3RlbSBjb25maWdzIG5lZWRlZC5cbi0gU3RyaXAgYW55ICdDT05GSUdfJyBwcmVmaXggKGUuZy4sIHJldHVybiBcIk5FVF9JUFY0XCIgaW5zdGVhZCBvZiBcIkNPTkZJR19ORVRfSVBWNFwiKS5cblByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLlxuXG5cblVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuXG5JdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS5cbklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC5cbiIsIlByb21wdCI6IlRhcmdldCBhcmNoaXRlY3R1cmU6IGFtZDY0XG5cbkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOlxuY29tbWl0IDMxM2Y1NTIzZjM3MGRkYzk2NGE0NTA1M2YwMDYwYzRmNGY4ZmNmMjhcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgTW9uIFNlcCAxNCAxNDozNjowNCAyMDI2ICswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL2ZzL2V4dDQvZXh0ZW50cy5jIGIvZnMvZXh0NC9leHRlbnRzLmNcbmluZGV4IDc2MDM4YjZjMzY1NTIuLmY2NWQyNTRjMGQ1ZWUgMTAwNjQ0XG4tLS0gYS9mcy9leHQ0L2V4dGVudHMuY1xuKysrIGIvZnMvZXh0NC9leHRlbnRzLmNcbkBAIC02MzYzLDI5ICs2MzYzLDM0IEBAIGludCBleHQ0X2V4dF9jbGVhcl9iYihzdHJ1Y3QgaW5vZGUgKmlub2RlKVxuIFx0XHRtYXAubV9sZW4gPSBlbmQgLSBjdXI7XG4gXHRcdHJldCA9IGV4dDRfbWFwX2Jsb2NrcyhOVUxMLCBpbm9kZSwgXHUwMDI2bWFwLCAwKTtcbiBcdFx0aWYgKHJldCBcdTAwM2MgMClcbi1cdFx0XHRicmVhaztcbitcdFx0XHRnb3RvIG91dDtcbiBcdFx0aWYgKHJldCBcdTAwM2UgMCkge1xuIFx0XHRcdHBhdGggPSBleHQ0X2ZpbmRfZXh0ZW50KGlub2RlLCBtYXAubV9sYmxrLCBwYXRoLCAwKTtcbi1cdFx0XHRpZiAoIUlTX0VSUihwYXRoKSkge1xuLVx0XHRcdFx0Zm9yIChqID0gMDsgaiBcdTAwM2MgcGF0aC1cdTAwM2VwX2RlcHRoOyBqKyspIHtcbi1cdFx0XHRcdFx0ZXh0NF9tYl9tYXJrX2JiKGlub2RlLVx1MDAzZWlfc2IsXG4tXHRcdFx0XHRcdFx0XHRwYXRoW2pdLnBfYmxvY2ssIDEsIGZhbHNlKTtcbi1cdFx0XHRcdFx0ZXh0NF9mY19yZWNvcmRfcmVnaW9ucyhpbm9kZS1cdTAwM2VpX3NiLCBpbm9kZS1cdTAwM2VpX2lubyxcbi1cdFx0XHRcdFx0XHRcdDAsIHBhdGhbal0ucF9ibG9jaywgMSwgMSk7XG4tXHRcdFx0XHR9XG4tXHRcdFx0fSBlbHNlIHtcbi1cdFx0XHRcdHBhdGggPSBOVUxMO1xuK1x0XHRcdGlmIChJU19FUlIocGF0aCkpIHtcbitcdFx0XHRcdHJldCA9IFBUUl9FUlIocGF0aCk7XG4rXHRcdFx0XHRnb3RvIG91dDtcbitcdFx0XHR9XG4rXHRcdFx0Zm9yIChqID0gMDsgaiBcdTAwM2MgcGF0aC1cdTAwM2VwX2RlcHRoOyBqKyspIHtcbitcdFx0XHRcdGV4dDRfbWJfbWFya19iYihpbm9kZS1cdTAwM2VpX3NiLFxuK1x0XHRcdFx0XHRcdHBhdGhbal0ucF9ibG9jaywgMSwgZmFsc2UpO1xuK1x0XHRcdFx0cmV0ID0gZXh0NF9mY19yZWNvcmRfcmVnaW9ucyhpbm9kZS1cdTAwM2VpX3NiLFxuK1x0XHRcdFx0XHRcdFx0ICAgICBpbm9kZS1cdTAwM2VpX2lubywgMCxcbitcdFx0XHRcdFx0XHRcdCAgICAgcGF0aFtqXS5wX2Jsb2NrLCAxLCAxKTtcbitcdFx0XHRcdGlmIChyZXQpXG4rXHRcdFx0XHRcdGdvdG8gb3V0O1xuIFx0XHRcdH1cbiBcdFx0XHRleHQ0X21iX21hcmtfYmIoaW5vZGUtXHUwMDNlaV9zYiwgbWFwLm1fcGJsaywgbWFwLm1fbGVuLCBmYWxzZSk7XG4tXHRcdFx0ZXh0NF9mY19yZWNvcmRfcmVnaW9ucyhpbm9kZS1cdTAwM2VpX3NiLCBpbm9kZS1cdTAwM2VpX2lubyxcbi1cdFx0XHRcdFx0bWFwLm1fbGJsaywgbWFwLm1fcGJsaywgbWFwLm1fbGVuLCAxKTtcbitcdFx0XHRyZXQgPSBleHQ0X2ZjX3JlY29yZF9yZWdpb25zKGlub2RlLVx1MDAzZWlfc2IsIGlub2RlLVx1MDAzZWlfaW5vLFxuK1x0XHRcdFx0XHRcdCAgICAgbWFwLm1fbGJsaywgbWFwLm1fcGJsaywgbWFwLm1fbGVuLCAxKTtcbitcdFx0XHRpZiAocmV0KVxuK1x0XHRcdFx0Z290byBvdXQ7XG4gXHRcdH1cbiBcdFx0Y3VyID0gY3VyICsgbWFwLm1fbGVuO1xuIFx0fVxuIFxuIG91dDpcbiBcdGV4dDRfZnJlZV9leHRfcGF0aChwYXRoKTtcbi1cdHJldHVybiAwO1xuK1x0cmV0dXJuIHJldCBcdTAwM2MgMCA/IHJldCA6IDA7XG4gfVxuIFxuICNpZiBJU19FTkFCTEVEKENPTkZJR19FWFQ0X0tVTklUX1RFU1RTKVxuZGlmZiAtLWdpdCBhL2ZzL2V4dDQvZmFzdF9jb21taXQuYyBiL2ZzL2V4dDQvZmFzdF9jb21taXQuY1xuaW5kZXggMGNhYzg5MGNmMzcwMi4uYWI3MjYzYjRmOWU0NiAxMDA2NDRcbi0tLSBhL2ZzL2V4dDQvZmFzdF9jb21taXQuY1xuKysrIGIvZnMvZXh0NC9mYXN0X2NvbW1pdC5jXG5AQCAtMTk0MSw4ICsxOTQxLDExIEBAIHN0YXRpYyBpbnQgZXh0NF9mY19yZXBsYXlfaW5vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYixcbiBcbiBcdGlub2RlID0gZXh0NF9pZ2V0KHNiLCBpbm8sIEVYVDRfSUdFVF9OT1JNQUwpO1xuIFx0aWYgKCFJU19FUlIoaW5vZGUpKSB7XG4tXHRcdGV4dDRfZXh0X2NsZWFyX2JiKGlub2RlKTtcbitcdFx0cmV0ID0gZXh0NF9leHRfY2xlYXJfYmIoaW5vZGUpO1xuIFx0XHRpcHV0KGlub2RlKTtcbitcdFx0aW5vZGUgPSBOVUxMO1xuK1x0XHRpZiAocmV0KVxuK1x0XHRcdGdvdG8gb3V0O1xuIFx0fVxuIFx0aW5vZGUgPSBOVUxMO1xuIFxuIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTRUMTQ6MzY6MDguMDAwOTAxMTczWiIsIlNlcSI6MywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjgtZmxhc2giLCJEdXJhdGlvbiI6MTE5MDE4NDQ0NzIsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIHRoZSBFeHQ0IFBhdGNoKipcblxuT2theSwgbGV0J3MgZGl2ZSBpbnRvIHRoaXMuIE15IGZpcnN0IHN0ZXAgaXMgYWx3YXlzIHRvIGdldCBhIGhhbmRsZSBvbiB0aGUgY2hhbmdlcyB0aGVtc2VsdmVzIGFuZCB0aGUgY29udGV4dCB0aGV5IHRvdWNoLiBUaGlzIHBhdGNoIGxvb2tzIHRvIGJlIG1vZGlmeWluZyB0aGUgZXh0NCBmaWxlc3lzdGVtLCBzcGVjaWZpY2FsbHkgaW4gdGhlIGFyZWFzIG9mIGV4dGVudHMgYW5kIGZhc3QgY29tbWl0IHJlcGxheSBsb2dpYy4gSSBzZWUgbW9kaWZpY2F0aW9ucyBpbiBgZnMvZXh0NC9leHRlbnRzLmNgLCBzcGVjaWZpY2FsbHkgYXJvdW5kIHRoZSBgZXh0NF9leHRfY2xlYXJfYmJgIGZ1bmN0aW9uLCBhbmQgYGZzL2V4dDQvZmFzdF9jb21taXQuY2AsIHdpdGhpbiBgZXh0NF9mY19yZXBsYXlfaW5vZGVgLiBJIGltbWVkaWF0ZWx5IHJlY29nbml6ZSB0aGVzZSBhcyBrZXkgcGFydHMgb2YgZXh0NC5cblxuTm93LCBJJ20gZ29pbmcgdG8gdGFrZSBhIGNsb3NlciBsb29rLiBJJ2xsIHByb2JhYmx5IHN0YXJ0IHdpdGggYSBxdWljayBpbnNwZWN0aW9uIG9mIHRoZSBgZXh0NF9leHRfY2xlYXJfYmJgIGZ1bmN0aW9uIHdpdGhpbiBgZnMvZXh0NC9leHRlbnRzLmNgLiBJIHdpbGwgbGlrZWx5IHVzZSBncmVwIG9yIGp1c3QgcmVhZCB0aGUgZmlsZSBkaXJlY3RseSwgYW5kIHF1aWNrbHkgc2NhbiBmb3IgYW55IHJlbGF0ZWQgY29kZSBuZWFyYnkuIFRoaXMgd2lsbCBoZWxwIG1lIHVuZGVyc3RhbmQgdGhlIHB1cnBvc2Ugb2YgdGhpcyBwYXJ0aWN1bGFyIGNvZGUgc2VjdGlvbiBhbmQgZ2V0IGEgbW9yZSBzb2xpZCB1bmRlcnN0YW5kaW5nIG9mIHdoYXQgdGhpcyBwYXRjaCBpcyBhdHRlbXB0aW5nIHRvIGFjaGlldmUuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjM2MjYsIk91dHB1dFRva2VucyI6NzcsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxMzAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xNFQxNDozNjoxOS45MDI3NTA2MjVaIiwiU2VxIjo0LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo3MjUyMjAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwiZnMvZXh0NC9leHRlbnRzLmNcIixcbiAgXCJGaXJzdExpbmVcIjogNjM1MCxcbiAgXCJMaW5lQ291bnRcIjogNTVcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiNjM1MDpcXHRcXHQvKiBEZXRlcm1pbiB0aGUgc2l6ZSBvZiB0aGUgZmlsZSBmaXJzdCAqL1xcbjYzNTE6XFx0XFx0cGF0aCA9IGV4dDRfZmluZF9leHRlbnQoaW5vZGUsIEVYVF9NQVhfQkxPQ0tTIC0gMSwgTlVMTCxcXG42MzUyOlxcdFxcdFxcdFxcdFxcdFxcdEVYVDRfRVhfTk9DQUNIRSk7XFxuNjM1MzpcXHRcXHRpZiAoSVNfRVJSKHBhdGgpKVxcbjYzNTQ6XFx0XFx0XFx0cmV0dXJuIFBUUl9FUlIocGF0aCk7XFxuNjM1NTpcXHRcXHRleCA9IHBhdGhbcGF0aC1cXHUwMDNlcF9kZXB0aF0ucF9leHQ7XFxuNjM1NjpcXHRcXHRpZiAoIWV4KVxcbjYzNTc6XFx0XFx0XFx0Z290byBvdXQ7XFxuNjM1ODpcXHRcXHRlbmQgPSBsZTMyX3RvX2NwdShleC1cXHUwMDNlZWVfYmxvY2spICsgZXh0NF9leHRfZ2V0X2FjdHVhbF9sZW4oZXgpO1xcbjYzNTk6XFx0XFxuNjM2MDpcXHRcXHRjdXIgPSAwO1xcbjYzNjE6XFx0XFx0d2hpbGUgKGN1ciBcXHUwMDNjIGVuZCkge1xcbjYzNjI6XFx0XFx0XFx0bWFwLm1fbGJsayA9IGN1cjtcXG42MzYzOlxcdFxcdFxcdG1hcC5tX2xlbiA9IGVuZCAtIGN1cjtcXG42MzY0OlxcdFxcdFxcdHJldCA9IGV4dDRfbWFwX2Jsb2NrcyhOVUxMLCBpbm9kZSwgXFx1MDAyNm1hcCwgMCk7XFxuNjM2NTpcXHRcXHRcXHRpZiAocmV0IFxcdTAwM2MgMClcXG42MzY2OlxcdFxcdFxcdFxcdGdvdG8gb3V0O1xcbjYzNjc6XFx0XFx0XFx0aWYgKHJldCBcXHUwMDNlIDApIHtcXG42MzY4OlxcdFxcdFxcdFxcdHBhdGggPSBleHQ0X2ZpbmRfZXh0ZW50KGlub2RlLCBtYXAubV9sYmxrLCBwYXRoLCAwKTtcXG42MzY5OlxcdFxcdFxcdFxcdGlmIChJU19FUlIocGF0aCkpIHtcXG42MzcwOlxcdFxcdFxcdFxcdFxcdHJldCA9IFBUUl9FUlIocGF0aCk7XFxuNjM3MTpcXHRcXHRcXHRcXHRcXHRnb3RvIG91dDtcXG42MzcyOlxcdFxcdFxcdFxcdH1cXG42MzczOlxcdFxcdFxcdFxcdGZvciAoaiA9IDA7IGogXFx1MDAzYyBwYXRoLVxcdTAwM2VwX2RlcHRoOyBqKyspIHtcXG42Mzc0OlxcdFxcdFxcdFxcdFxcdGV4dDRfbWJfbWFya19iYihpbm9kZS1cXHUwMDNlaV9zYixcXG42Mzc1OlxcdFxcdFxcdFxcdFxcdFxcdFxcdHBhdGhbal0ucF9ibG9jaywgMSwgZmFsc2UpO1xcbjYzNzY6XFx0XFx0XFx0XFx0XFx0cmV0ID0gZXh0NF9mY19yZWNvcmRfcmVnaW9ucyhpbm9kZS1cXHUwMDNlaV9zYixcXG42Mzc3OlxcdFxcdFxcdFxcdFxcdFxcdFxcdFxcdCAgICAgaW5vZGUtXFx1MDAzZWlfaW5vLCAwLFxcbjYzNzg6XFx0XFx0XFx0XFx0XFx0XFx0XFx0XFx0ICAgICBwYXRoW2pdLnBfYmxvY2ssIDEsIDEpO1xcbjYzNzk6XFx0XFx0XFx0XFx0XFx0aWYgKHJldClcXG42MzgwOlxcdFxcdFxcdFxcdFxcdFxcdGdvdG8gb3V0O1xcbjYzODE6XFx0XFx0XFx0XFx0fVxcbjYzODI6XFx0XFx0XFx0XFx0ZXh0NF9tYl9tYXJrX2JiKGlub2RlLVxcdTAwM2VpX3NiLCBtYXAubV9wYmxrLCBtYXAubV9sZW4sIGZhbHNlKTtcXG42MzgzOlxcdFxcdFxcdFxcdHJldCA9IGV4dDRfZmNfcmVjb3JkX3JlZ2lvbnMoaW5vZGUtXFx1MDAzZWlfc2IsIGlub2RlLVxcdTAwM2VpX2lubyxcXG42Mzg0OlxcdFxcdFxcdFxcdFxcdFxcdFxcdCAgICAgbWFwLm1fbGJsaywgbWFwLm1fcGJsaywgbWFwLm1fbGVuLCAxKTtcXG42Mzg1OlxcdFxcdFxcdFxcdGlmIChyZXQpXFxuNjM4NjpcXHRcXHRcXHRcXHRcXHRnb3RvIG91dDtcXG42Mzg3OlxcdFxcdFxcdH1cXG42Mzg4OlxcdFxcdFxcdGN1ciA9IGN1ciArIG1hcC5tX2xlbjtcXG42Mzg5OlxcdFxcdH1cXG42MzkwOlxcdFxcbjYzOTE6XFx0b3V0OlxcbjYzOTI6XFx0XFx0ZXh0NF9mcmVlX2V4dF9wYXRoKHBhdGgpO1xcbjYzOTM6XFx0XFx0cmV0dXJuIHJldCBcXHUwMDNjIDAgPyByZXQgOiAwO1xcbjYzOTQ6XFx0fVxcbjYzOTU6XFx0XFxuNjM5NjpcXHQjaWYgSVNfRU5BQkxFRChDT05GSUdfRVhUNF9LVU5JVF9URVNUUylcXG42Mzk3OlxcdGludCBleHQ0X2V4dF9zcGFjZV9yb290X2lkeF90ZXN0KHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBjaGVjaylcXG42Mzk4OlxcdHtcXG42Mzk5OlxcdFxcdHJldHVybiBleHQ0X2V4dF9zcGFjZV9yb290X2lkeChpbm9kZSwgY2hlY2spO1xcbjY0MDA6XFx0fVxcbjY0MDE6XFx0RVhQT1JUX1NZTUJPTF9GT1JfRVhUNF9URVNUKGV4dDRfZXh0X3NwYWNlX3Jvb3RfaWR4X3Rlc3QpO1xcbjY0MDI6XFx0XFxuNjQwMzpcXHRzdHJ1Y3QgZXh0NF9leHRfcGF0aCAqZXh0NF9zcGxpdF9jb252ZXJ0X2V4dGVudHNfdGVzdChoYW5kbGVfdCAqaGFuZGxlLFxcbjY0MDQ6XFx0XFx0XFx0XFx0c3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGV4dDRfbWFwX2Jsb2NrcyAqbWFwLFxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xNFQxNDozNjoxOS45MDM0Nzg2MDVaIiwiU2VxIjo1LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo3ODk2MDAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwiZnMvZXh0NC9mYXN0X2NvbW1pdC5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDE5MzAsXG4gIFwiTGluZUNvdW50XCI6IDQwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIjE5MzA6XFx0XFx0c3RydWN0IGV4dDRfaW5vZGUgKnJhd19mY19pbm9kZTtcXG4xOTMxOlxcdFxcdHN0cnVjdCBpbm9kZSAqaW5vZGUgPSBOVUxMO1xcbjE5MzI6XFx0XFx0c3RydWN0IGV4dDRfaWxvYyBpbG9jO1xcbjE5MzM6XFx0XFx0aW50IGlub2RlX2xlbiwgaW5vLCByZXQsIHRhZyA9IHRsLVxcdTAwM2VmY190YWc7XFxuMTkzNDpcXHRcXHRzdHJ1Y3QgZXh0NF9leHRlbnRfaGVhZGVyICplaDtcXG4xOTM1OlxcdFxcdHNpemVfdCBvZmZfZ2VuID0gb2Zmc2V0b2Yoc3RydWN0IGV4dDRfaW5vZGUsIGlfZ2VuZXJhdGlvbik7XFxuMTkzNjpcXHRcXG4xOTM3OlxcdFxcdG1lbWNweShcXHUwMDI2ZmNfaW5vZGUsIHZhbCwgc2l6ZW9mKGZjX2lub2RlKSk7XFxuMTkzODpcXHRcXG4xOTM5OlxcdFxcdGlubyA9IGxlMzJfdG9fY3B1KGZjX2lub2RlLmZjX2lubyk7XFxuMTk0MDpcXHRcXHR0cmFjZV9leHQ0X2ZjX3JlcGxheShzYiwgdGFnLCBpbm8sIDAsIDApO1xcbjE5NDE6XFx0XFxuMTk0MjpcXHRcXHRpbm9kZSA9IGV4dDRfaWdldChzYiwgaW5vLCBFWFQ0X0lHRVRfTk9STUFMKTtcXG4xOTQzOlxcdFxcdGlmICghSVNfRVJSKGlub2RlKSkge1xcbjE5NDQ6XFx0XFx0XFx0cmV0ID0gZXh0NF9leHRfY2xlYXJfYmIoaW5vZGUpO1xcbjE5NDU6XFx0XFx0XFx0aXB1dChpbm9kZSk7XFxuMTk0NjpcXHRcXHRcXHRpbm9kZSA9IE5VTEw7XFxuMTk0NzpcXHRcXHRcXHRpZiAocmV0KVxcbjE5NDg6XFx0XFx0XFx0XFx0Z290byBvdXQ7XFxuMTk0OTpcXHRcXHR9XFxuMTk1MDpcXHRcXHRpbm9kZSA9IE5VTEw7XFxuMTk1MTpcXHRcXG4xOTUyOlxcdFxcdHJldCA9IGV4dDRfZmNfcmVjb3JkX21vZGlmaWVkX2lub2RlKHNiLCBpbm8pO1xcbjE5NTM6XFx0XFx0aWYgKHJldClcXG4xOTU0OlxcdFxcdFxcdGdvdG8gb3V0O1xcbjE5NTU6XFx0XFxuMTk1NjpcXHRcXHRyYXdfZmNfaW5vZGUgPSAoc3RydWN0IGV4dDRfaW5vZGUgKilcXG4xOTU3OlxcdFxcdFxcdCh2YWwgKyBvZmZzZXRvZihzdHJ1Y3QgZXh0NF9mY19pbm9kZSwgZmNfcmF3X2lub2RlKSk7XFxuMTk1ODpcXHRcXHRyZXQgPSBleHQ0X2dldF9mY19pbm9kZV9sb2Moc2IsIGlubywgXFx1MDAyNmlsb2MpO1xcbjE5NTk6XFx0XFx0aWYgKHJldClcXG4xOTYwOlxcdFxcdFxcdGdvdG8gb3V0O1xcbjE5NjE6XFx0XFxuMTk2MjpcXHRcXHRpbm9kZV9sZW4gPSB0bC1cXHUwMDNlZmNfbGVuIC0gc2l6ZW9mKHN0cnVjdCBleHQ0X2ZjX2lub2RlKTtcXG4xOTYzOlxcdFxcdHJhd19pbm9kZSA9IGV4dDRfcmF3X2lub2RlKFxcdTAwMjZpbG9jKTtcXG4xOTY0OlxcdFxcbjE5NjU6XFx0XFx0bWVtY3B5KHJhd19pbm9kZSwgcmF3X2ZjX2lub2RlLCBvZmZzZXRvZihzdHJ1Y3QgZXh0NF9pbm9kZSwgaV9ibG9jaykpO1xcbjE5NjY6XFx0XFx0bWVtY3B5KCh1OCAqKXJhd19pbm9kZSArIG9mZl9nZW4sICh1OCAqKXJhd19mY19pbm9kZSArIG9mZl9nZW4sXFxuMTk2NzpcXHRcXHQgICAgICAgaW5vZGVfbGVuIC0gb2ZmX2dlbik7XFxuMTk2ODpcXHRcXHRpZiAobGUzMl90b19jcHUocmF3X2lub2RlLVxcdTAwM2VpX2ZsYWdzKSBcXHUwMDI2IEVYVDRfRVhURU5UU19GTCkge1xcbjE5Njk6XFx0XFx0XFx0ZWggPSAoc3RydWN0IGV4dDRfZXh0ZW50X2hlYWRlciAqKShcXHUwMDI2cmF3X2lub2RlLVxcdTAwM2VpX2Jsb2NrWzBdKTtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTRUMTQ6MzY6MTkuOTA0MjczMjE1WiIsIlNlcSI6NiwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjgtZmxhc2giLCJEdXJhdGlvbiI6MjIwMTY5NDM0NzEsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSB0YWtlOlxuXG4qKkludmVzdGlnYXRpbmcgYGV4dDRfZXh0X2NsZWFyX2JiYCBpbiB0aGUgRmFzdCBDb21taXQgQ29udGV4dCoqXG5cbkFscmlnaHQsIHNvIGBleHQ0X2V4dF9jbGVhcl9iYmAgaXMgaW52b2x2ZWQgaW4gZmFzdCBjb21taXQgcmVwbGF5LiBUaGF0J3MgdGhlIHN0YXJ0aW5nIHBvaW50LiBNeSBuZXh0IG1vdmUgaXMgdG8gY2hlY2sgdGhlIGJpZ2dlciBwaWN0dXJlLCB0byB1bmRlcnN0YW5kIHdoZXJlIGVsc2UgdGhpcyBmdW5jdGlvbiBpcyBiZWluZyB1c2VkIHdpdGhpbiB0aGUgZXh0NCBmaWxlc3lzdGVtIGNvZGUuIEkgd2FudCB0byBpZGVudGlmeSBhbnkgb3RoZXIgY2FsbGVycyBvZiBgZXh0NF9leHRfY2xlYXJfYmJgLiBVbmRlcnN0YW5kaW5nIHRoZSBjYWxsIGdyYXBoIHdpbGwgaGVscCBtZSBncmFzcCB0aGUgYnJvYWRlciBpbXBsaWNhdGlvbnMgb2YgdGhpcyBmdW5jdGlvbiwgaG93IGl0IHJlbGF0ZXMgdG8gb3RoZXIgZXh0NCBmdW5jdGlvbmFsaXRpZXMsIGFuZCBwaW5wb2ludCBwb3RlbnRpYWwgYXJlYXMgb2YgY29uY2VybiBvciBvcHRpbWl6YXRpb24gb3Bwb3J0dW5pdGllcyByZWxhdGVkIHRvIHRoZSBmYXN0IGNvbW1pdCBwYXRoLiBEaXZpbmcgaW50byB0aGUgZGlmZmVyZW50IGNhbGxlcnMgaXMgZXNzZW50aWFsIGZvciBhIHRob3JvdWdoIHVuZGVyc3RhbmRpbmcuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjU3MTksIk91dHB1dFRva2VucyI6MjIsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo0MywiVG9vbENhbGxzIjpbInJlYWQtZmlsZSIsInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTE0VDE0OjM2OjQxLjkyMTIyMDQ2NloiLCJTZXEiOjcsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyMzQ4MDQ5NDU0LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImV4dDRfZXh0X2NsZWFyX2JiXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImZzL2V4dDQvZXh0NC5oPTM5NTc9ZXh0ZXJuIGludCBleHQ0X2V4dF9yZXBsYXlfdXBkYXRlX2V4KHN0cnVjdCBpbm9kZSAqaW5vZGUsIGV4dDRfbGJsa190IHN0YXJ0LFxcbmZzL2V4dDQvZXh0NC5oLTM5NTgtXFx0XFx0aW50IGxlbiwgaW50IHVud3JpdHRlbiwgZXh0NF9mc2Jsa190IHBibGspO1xcbmZzL2V4dDQvZXh0NC5oOjM5NTk6ZXh0ZXJuIGludCBleHQ0X2V4dF9jbGVhcl9iYihzdHJ1Y3QgaW5vZGUgKmlub2RlKTtcXG5mcy9leHQ0L2V4dDQuaC0zOTYwLVxcbi0tXFxuZnMvZXh0NC9leHRlbnRzLmM9NjI1Mj1pbnQgZXh0NF9leHRfcmVwbGF5X3NldF9pYmxvY2tzKHN0cnVjdCBpbm9kZSAqaW5vZGUpXFxuLS1cXG5mcy9leHQ0L2V4dGVudHMuYy02MzM4LVxcbmZzL2V4dDQvZXh0ZW50cy5jOjYzMzk6aW50IGV4dDRfZXh0X2NsZWFyX2JiKHN0cnVjdCBpbm9kZSAqaW5vZGUpXFxuZnMvZXh0NC9leHRlbnRzLmMtNjM0MC17XFxuLS1cXG5mcy9leHQ0L2Zhc3RfY29tbWl0LmM9MTkyNT1zdGF0aWMgaW50IGV4dDRfZmNfcmVwbGF5X2lub2RlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsXFxuLS1cXG5mcy9leHQ0L2Zhc3RfY29tbWl0LmMtMTk0My1cXHRpZiAoIUlTX0VSUihpbm9kZSkpIHtcXG5mcy9leHQ0L2Zhc3RfY29tbWl0LmM6MTk0NDpcXHRcXHRyZXQgPSBleHQ0X2V4dF9jbGVhcl9iYihpbm9kZSk7XFxuZnMvZXh0NC9mYXN0X2NvbW1pdC5jLTE5NDUtXFx0XFx0aXB1dChpbm9kZSk7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTE0VDE0OjM2OjQ0LjI2OTI3NzMyWiIsIlNlcSI6OCwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjgtZmxhc2giLCJEdXJhdGlvbiI6ODM4NTI5MzA4NiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IGF0dGVtcHQgYXQgc3VtbWFyaXppbmcgdGhlIHRob3VnaHQgcHJvY2VzcywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZTpcblxuKipBbmFseXppbmcgdGhlIENhbGwgUGF0aCBvZiBgZXh0NF9mY19yZXBsYXlfaW5vZGVgKipcblxuT2theSwgc28gSSdtIGRpdmluZyBpbnRvIGBleHQ0X2ZjX3JlcGxheV9pbm9kZWAgYW5kIG5lZWQgdG8gdW5kZXJzdGFuZCBpdHMgY29udGV4dC4gV2hlcmUgZXhhY3RseSBkb2VzIHRoaXMgZnVuY3Rpb24gZml0IGludG8gdGhlIGJyb2FkZXIgcGljdHVyZSBvZiBleHQ0J3MgZmlsZSBjcmVhdGlvbiBhbmQgam91cm5hbGluZyBwcm9jZXNzPyBJIG5lZWQgdG8gdHJhY2UgaXRzIGNhbGwgcGF0aC4gVGhpcyBpc24ndCBqdXN0IGFib3V0IHJlYWRpbmcgdGhlIGNvZGU7IGl0J3MgYWJvdXQgcmVjb25zdHJ1Y3RpbmcgdGhlIG9wZXJhdGlvbmFsIGZsb3cgaW4gbXkgaGVhZC4gSSdtIHRoaW5raW5nLCBcIndoYXQgZXZlbnRzIHRyaWdnZXIgYSByZXBsYXkgb3BlcmF0aW9uIG9uIGFuIGlub2RlIHdoZW4gZmlsZSBjcmVhdGlvbiBpcyBjb25jZXJuZWQ/XCIgTXkgaW5pdGlhbCBmb2N1cyBpcyBvbiBpZGVudGlmeWluZyB0aGUgZGlyZWN0IGNhbGxlcnMsIHVuZGVyc3RhbmRpbmcgdGhlIGFyZ3VtZW50cyBwYXNzZWQsIGFuZCB3aGF0IGluZm9ybWF0aW9uIHRoZXkgcHJvdmlkZSB0byBgZXh0NF9mY19yZXBsYXlfaW5vZGVgLiBJIG5lZWQgdG8gbG9vayBmb3IgY2FsbHMgc3BlY2lmaWNhbGx5IHJlbGF0ZWQgdG8gdHJhbnNhY3Rpb24gcmVjb3ZlcnkgYW5kIGVycm9yIGhhbmRsaW5nIGR1cmluZyBpbm9kZSBjcmVhdGlvbi4gRnJvbSB0aGVyZSwgSSdsbCBuZWVkIHRvIHdvcmsgbXkgd2F5IHVwIHRoZSBzdGFjaywgbG9va2luZyBhdCB0aGUgaW50ZXJhY3Rpb24gd2l0aCBibG9jayBhbGxvY2F0aW9uLCBqb3VybmFsIGNvbW1pdCwgYW5kIHRoZSBvdmVyYWxsIHRyYW5zYWN0aW9uIG1hbmFnZW1lbnQgd2l0aGluIHRoZSBleHQ0IGZpbGVzeXN0ZW0uIFRoZSBhaW0gaGVyZSBpcyBhIGNvbXBsZXRlIHVuZGVyc3RhbmRpbmcgb2YgdGhlIGNvbmRpdGlvbnMgdW5kZXIgd2hpY2ggdGhpcyBmdW5jdGlvbiBleGVjdXRlcyBkdXJpbmcgcG90ZW50aWFsIGZhaWx1cmUgc2NlbmFyaW9zLiBUaGlzIGlzIHRoZSBiZWRyb2NrIHRvIHVuZGVyc3RhbmQgdGhlIHJlbGlhYmlsaXR5IGFuZCBjb3JyZWN0bmVzcyBvZiB0aGUgZXh0NCBmaWxlc3lzdGVtIGFuZCB0byBpZGVudGlmeSBhbmQgZml4IGFueSBjb3JuZXIgY2FzZXMgdGhhdCBjYW4gYXJpc2UuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjYyOTMsIk91dHB1dFRva2VucyI6MjIsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxOSwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0xNFQxNDozNjo1Mi42NTQ1NzMxOTZaIiwiU2VxIjo5LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MjMwMTk2NjY5MSwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJleHQ0X2ZjX3JlcGxheV9pbm9kZVwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJmcy9leHQ0L2Zhc3RfY29tbWl0LmM9MTg5Nj1zdGF0aWMgaW50IGV4dDRfZmNfcmVjb3JkX21vZGlmaWVkX2lub2RlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCBpbm8pXFxuLS1cXG5mcy9leHQ0L2Zhc3RfY29tbWl0LmMtMTkyNC0gKi9cXG5mcy9leHQ0L2Zhc3RfY29tbWl0LmM6MTkyNTpzdGF0aWMgaW50IGV4dDRfZmNfcmVwbGF5X2lub2RlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsXFxuZnMvZXh0NC9mYXN0X2NvbW1pdC5jLTE5MjYtXFx0XFx0XFx0XFx0c3RydWN0IGV4dDRfZmNfdGxfbWVtICp0bCwgdTggKnZhbClcXG4tLVxcbmZzL2V4dDQvZmFzdF9jb21taXQuYz0yNTczPXN0YXRpYyBpbnQgZXh0NF9mY19yZXBsYXkoam91cm5hbF90ICpqb3VybmFsLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLFxcbi0tXFxuZnMvZXh0NC9mYXN0X2NvbW1pdC5jLTI2MzgtXFx0XFx0Y2FzZSBFWFQ0X0ZDX1RBR19JTk9ERTpcXG5mcy9leHQ0L2Zhc3RfY29tbWl0LmM6MjYzOTpcXHRcXHRcXHRyZXQgPSBleHQ0X2ZjX3JlcGxheV9pbm9kZShzYiwgXFx1MDAyNnRsLCB2YWwpO1xcbmZzL2V4dDQvZmFzdF9jb21taXQuYy0yNjQwLVxcdFxcdFxcdGJyZWFrO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xNFQxNDozNjo1NC45NTY1NDUxODdaIiwiU2VxIjoxMCwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjgtZmxhc2giLCJEdXJhdGlvbiI6OTc4MjY5Njk2NTEsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIHRoZSBleHQ0IEZhc3QgQ29tbWl0IFJlcGxheSBIYW5kbGVyKipcblxuT2theSwgbGV0J3MgYnJlYWsgdGhpcyBkb3duLiBXZSdyZSBsb29raW5nIGF0IGBleHQ0X2ZjX3JlcGxheWAsIHNwZWNpZmljYWxseSBob3cgaXQgaGFuZGxlcyBmYXN0IGNvbW1pdCByZXBsYXkgaW4gdGhlIGV4dDQgZmlsZXN5c3RlbSBhbmQgaXRzIGludGVyYWN0aW9uIHdpdGggdGhlIGpvdXJuYWwuIEkga25vdyB0aGlzIGNvZGUsIG9mIGNvdXJzZS4gSXQncyB0cmlnZ2VyZWQgZHVyaW5nIG1vdW50cyBvZiBleHQ0IGZpbGVzeXN0ZW1zIHdpdGggam91cm5hbCByZWNvcmRzLCB3aGljaCBpbmNsdWRlcyBzY2VuYXJpb3MgbGlrZSBzeXprYWxsZXItZnV6emVkIGltYWdlcywgcG93ZXItbG9zcyBzaW11bGF0aW9ucywgb3Igbm9ybWFsIGZhc3QtY29tbWl0IG9wZXJhdGlvbnMuIFJpZ2h0LCBzeXprYWxsZXIgaXMgYWN0aXZlbHkgbW91bnRpbmcgdGhvc2UgY3JhZnRlZCBpbWFnZXMsIHBva2luZyBhdCB0aGUgZmlsZXN5c3RlbSB3aXRoIHZhcmlvdXMgc3lzY2FsbHMuIEFuZCBleHQ0IGlzLCBhcyBleHBlY3RlZCwgYSBwcmltZSB0YXJnZXQgZm9yIHN5emthbGxlcidzIGZ1enppbmcgZWZmb3J0cy5cblxuTm93LCBsZXQncyBkaXZlIGludG8gdGhpcyBwYXRjaC4gVGhlIGtleSBjaGFuZ2VzIGFyZSB3aXRoaW4gYGZzL2V4dDQvZXh0ZW50cy5jYCwgc3BlY2lmaWNhbGx5IGluIHRoZSBmdW5jdGlvbiBgZXh0NF9leHRfY2xlYXJfYmIoc3RydWN0IGlub2RlICppbm9kZSlgLiBCZWZvcmUgdGhlIHBhdGNoLCB0aGUgY29kZSB3YXMuLi4gd2VsbCwgbGV0J3MganVzdCBzYXkgYSBiaXQgbG9vc2Ugd2l0aCBpdHMgZXJyb3IgaGFuZGxpbmcuXG5cblByZXZpb3VzbHksIGlmIGBleHQ0X2ZpbmRfZXh0ZW50YCBmYWlsZWQsIHJldHVybmluZyBhbiBFUlJfUFRSLCB0aGUgY29kZSBqdXN0IHNldCBgcGF0aCA9IE5VTExgLCBhbmQga2VwdCBnb2luZyEgVGhhdCdzIGJhZC4gQ3JpdGljYWxseSwgd2Ugbm93IGhhdmUgYSBgaWYgKElTX0VSUihwYXRoKSlgIGNoZWNrIGFuZCByZXR1cm4gYSBwcm9wZXIgZXJyb3IgY29kZS4gVGhpcyBpcyBhIGNsZWFyIGltcHJvdmVtZW50LlxuXG5BZGRpdGlvbmFsbHksIHRoZSBwYXRjaCBhZGRyZXNzZXMgdGhlIGlnbm9yZWQgcmV0dXJuIHZhbHVlcyBmcm9tIGBleHQ0X2ZjX3JlY29yZF9yZWdpb25zYC4gQmVmb3JlLCBlcnJvcnMgZnJvbSB0aGlzIGZ1bmN0aW9uIOKAkyB0aGluZ3MgbGlrZSBgLUVOT01FTWAg4oCTIHdlcmUgc2ltcGx5IGlnbm9yZWQsIHRoZSBsb29wIGNvbnRpbnVpbmcsIGFuZCB0aGVuIHRoZSBmdW5jdGlvbiBoYXJkY29kZWQgYHJldHVybiAwYCBhdCB0aGUgZW5kISBUaGF0J3MgYW5vdGhlciBwb3RlbnRpYWwgc291cmNlIG9mIGJ1Z3MuIE5vdywgYW55IGVycm9yIGZyb20gZWl0aGVyIGBleHQ0X21hcF9ibG9ja3NgIG9yIGBleHQ0X2ZpbmRfZXh0ZW50YCB0cmlnZ2VycyBhIGBnb3RvIG91dDtgLCBhbmQgYG91dDpgIG5vdyBwcm9wYWdhdGVzIHRoZSBlcnJvciBjb2RlIGNvcnJlY3RseS4gVGhlIGZ1bmN0aW9uIHJldHVybnMgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIGlmIGl0IGVuY291bnRlcmVkIGFuIGlzc3VlOyBvdGhlcndpc2UsIGl0IHJldHVybnMgMC5cblxuQnV0IHdhaXQgYSBtaW51dGUuLi4gd2hhdCBkb2VzIGBleHQ0X2ZyZWVfZXh0X3BhdGgocGF0aClgIGRvIHdoZW4gYHBhdGhgIGlzIGFjdHVhbGx5IGFuIEVSUl9QVFI/IFRoYXQncyB0aGUgbmV4dCBxdWVzdGlvbiBJIG5lZWQgdG8gYW5zd2VyLiBJIHNob3VsZCBwcm9iYWJseSBjaGVjayB0aGF0IGZ1bmN0aW9uJ3MgaW1wbGVtZW50YXRpb24ganVzdCB0byBiZSBzdXJlLi4uXG5cblxuIiwiSW5wdXRUb2tlbnMiOjY4NzEsIk91dHB1dFRva2VucyI6MjMsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo3OTksIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMTRUMTQ6Mzg6MzIuNzgzNTE4Mjk4WiIsIlNlcSI6MTEsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyNDUxNzA3Mzc3LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcInZvaWQgZXh0NF9mcmVlX2V4dF9wYXRoXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImZzL2V4dDQvZXh0NC5oPTM5MzU9ZXh0ZXJuIHN0cnVjdCBleHQ0X2V4dF9wYXRoICpleHQ0X2ZpbmRfZXh0ZW50KHN0cnVjdCBpbm9kZSAqLCBleHQ0X2xibGtfdCxcXG4tLVxcbmZzL2V4dDQvZXh0NC5oLTM5MzctXFx0XFx0XFx0XFx0XFx0ICAgICAgaW50IGZsYWdzKTtcXG5mcy9leHQ0L2V4dDQuaDozOTM4OmV4dGVybiB2b2lkIGV4dDRfZnJlZV9leHRfcGF0aChzdHJ1Y3QgZXh0NF9leHRfcGF0aCAqKTtcXG5mcy9leHQ0L2V4dDQuaC0zOTM5LWV4dGVybiBpbnQgZXh0NF9leHRfY2hlY2tfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSk7XFxuLS1cXG5mcy9leHQ0L2V4dGVudHMuYz0xMTE9c3RhdGljIHZvaWQgZXh0NF9leHRfZHJvcF9yZWZzKHN0cnVjdCBleHQ0X2V4dF9wYXRoICpwYXRoKVxcbi0tXFxuZnMvZXh0NC9leHRlbnRzLmMtMTIxLVxcbmZzL2V4dDQvZXh0ZW50cy5jOjEyMjp2b2lkIGV4dDRfZnJlZV9leHRfcGF0aChzdHJ1Y3QgZXh0NF9leHRfcGF0aCAqcGF0aClcXG5mcy9leHQ0L2V4dGVudHMuYy0xMjMte1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xNFQxNDozODozNS4yMzUyMzMxMTVaIiwiU2VxIjoxMiwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjgtZmxhc2giLCJEdXJhdGlvbiI6NzA4NzUxNDE0NCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgbGV0J3MgZGl2ZSBpbnRvIHRoaXMuIEknbSBnb2luZyB0byBwdWxsIHVwIGBleHQ0X2ZyZWVfZXh0X3BhdGhgIGF0IGxpbmUgMTIyIHdpdGhpbiBgZnMvZXh0NC9leHRlbnRzLmNgLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCBob3cgdGhlIGV4dDQgZmlsZXN5c3RlbSBoYW5kbGVzIGZyZWVpbmcgZXh0ZW50IHBhdGhzLiBJIGtub3cgdGhpcyBmdW5jdGlvbiBpcyBjcml0aWNhbCBmb3IgbWFpbnRhaW5pbmcgZGF0YSBpbnRlZ3JpdHkgYW5kIGVmZmljaWVudCBzcGFjZSBtYW5hZ2VtZW50IHdpdGhpbiBhbiBleHQ0IHZvbHVtZS4gVGhpcyBpcyBhIGtleSBidWlsZGluZyBibG9jayBpbiB1bmRlcnN0YW5kaW5nIGhvdyBleHRlbnRzIGFyZSB1c2VkLCBhbmQgbWFuYWdlZCwgd2l0aGluIGV4dDQuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjg0MTEsIk91dHB1dFRva2VucyI6MzcsIk91dHB1dFRob3VnaHRzVG9rZW5zIjozMiwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0xNFQxNDozODo0Mi4zMjI3NTAxMDlaIiwiU2VxIjoxMywiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MzExMDAwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcImZzL2V4dDQvZXh0ZW50cy5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDEyMCxcbiAgXCJMaW5lQ291bnRcIjogMjBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiIDEyMDpcXHR9XFxuIDEyMTpcXHRcXG4gMTIyOlxcdHZvaWQgZXh0NF9mcmVlX2V4dF9wYXRoKHN0cnVjdCBleHQ0X2V4dF9wYXRoICpwYXRoKVxcbiAxMjM6XFx0e1xcbiAxMjQ6XFx0XFx0aWYgKElTX0VSUl9PUl9OVUxMKHBhdGgpKVxcbiAxMjU6XFx0XFx0XFx0cmV0dXJuO1xcbiAxMjY6XFx0XFx0ZXh0NF9leHRfZHJvcF9yZWZzKHBhdGgpO1xcbiAxMjc6XFx0XFx0a2ZyZWUocGF0aCk7XFxuIDEyODpcXHR9XFxuIDEyOTpcXHRcXG4gMTMwOlxcdC8qXFxuIDEzMTpcXHQgKiBNYWtlIHN1cmUgJ2hhbmRsZScgaGFzIGF0IGxlYXN0ICdjaGVja19jcmVkJyBjcmVkaXRzLiBJZiBub3QsIHJlc3RhcnRcXG4gMTMyOlxcdCAqIHRyYW5zYWN0aW9uIHdpdGggJ3Jlc3RhcnRfY3JlZCcgY3JlZGl0cy4gVGhlIGZ1bmN0aW9uIGRyb3BzIGlfZGF0YV9zZW1cXG4gMTMzOlxcdCAqIHdoZW4gcmVzdGFydGluZyB0cmFuc2FjdGlvbiBhbmQgZ2V0cyBpdCBhZnRlciB0cmFuc2FjdGlvbiBpcyByZXN0YXJ0ZWQuXFxuIDEzNDpcXHQgKlxcbiAxMzU6XFx0ICogVGhlIGZ1bmN0aW9uIHJldHVybnMgMCBvbiBzdWNjZXNzLCAxIGlmIHRyYW5zYWN0aW9uIGhhZCB0byBiZSByZXN0YXJ0ZWQsXFxuIDEzNjpcXHQgKiBhbmQgXFx1MDAzYyAwIGluIGNhc2Ugb2YgZmF0YWwgZXJyb3IuXFxuIDEzNzpcXHQgKi9cXG4gMTM4OlxcdGludCBleHQ0X2RhdGFzZW1fZW5zdXJlX2NyZWRpdHMoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSxcXG4gMTM5OlxcdFxcdFxcdFxcdFxcdGludCBjaGVja19jcmVkLCBpbnQgcmVzdGFydF9jcmVkLFxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xNFQxNDozODo0Mi4zMjMwNjM3NjlaIiwiU2VxIjoxNCwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjgtZmxhc2giLCJEdXJhdGlvbiI6MjEwNzI5NTUyMTIsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIHRoZSBGaWxlIENyZWF0aW9uIFJlcGxheSBDb2RlKipcblxuT2theSwgc28gSSdtIGxvb2tpbmcgYXQgYGV4dDRfZnJlZV9leHRfcGF0aGAsIGFuZCBJIHNlZSBpdCBncmFjZWZ1bGx5IGhhbmRsZXMgYSBudWxsIG9yIGVycm9yLXNpZ25hbGluZyBwYXRoLiBHb29kLiBOb3csIGxldCdzIGRpZyBpbnRvIGBleHQ0X2ZjX3JlcGxheV9pbm9kZWAuIEkgc2VlIHRoZSBjb2RlIGNhbGxzIGBleHQ0X2lnZXRgIHRvIGdldCB0aGUgaW5vZGUuIElmIHRoYXQncyBzdWNjZXNzZnVsLCBpdCBwcm9jZWVkcyB0byBjYWxsIGBleHQ0X2V4dF9jbGVhcl9iYmAuIFRoZSBpbnRlcmVzdGluZyBiaXQgaGVyZSBpcyB0aGF0IGlmIGBleHQ0X2V4dF9jbGVhcl9iYmAgcmV0dXJucyBhbiBlcnJvciwgaXQgaW1tZWRpYXRlbHkganVtcHMgdG8gYG91dDpgLiBJJ20gZ29pbmcgdG8gZm9sbG93IHRoYXQgYGdvdG9gIGFuZCBzZWUgd2hhdCBoYXBwZW5zIHRoZXJlLiBVbmRlcnN0YW5kaW5nIHRoZSBlcnJvciBoYW5kbGluZyB3aXRoaW4gYGV4dDRfZmNfcmVwbGF5X2lub2RlYCBpcyBrZXkgdG8gZW5zdXJpbmcgdGhlIGludGVncml0eSBvZiB0aGUgZmlsZSBzeXN0ZW0gYWZ0ZXIgYSBjcmFzaCBvciBwb3dlciBmYWlsdXJlLiBJIG5lZWQgdG8gdHJhY2UgdGhpcyBcIm91dDpcIiBsYWJlbCBhbmQgdW5kZXJzdGFuZCB0aGUgZnVsbCBpbXBsaWNhdGlvbnMgb2YgYW4gYGV4dDRfZXh0X2NsZWFyX2JiYCBmYWlsdXJlLlxuXG5cbiIsIklucHV0VG9rZW5zIjo4OTAwLCJPdXRwdXRUb2tlbnMiOjM5LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTY5LCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMTRUMTQ6Mzk6MDMuMzk2MDIzMDAxWiIsIlNlcSI6MTUsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjIzMTQzOTAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwiZnMvZXh0NC9mYXN0X2NvbW1pdC5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDE5ODAsXG4gIFwiTGluZUNvdW50XCI6IDQwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIjE5ODA6XFx0XFx0XFx0XFx0c2l6ZW9mKHJhd19pbm9kZS1cXHUwMDNlaV9ibG9jaykpO1xcbjE5ODE6XFx0XFx0fVxcbjE5ODI6XFx0XFxuMTk4MzpcXHRcXHQvKiBJbW1lZGlhdGVseSB1cGRhdGUgdGhlIGlub2RlIG9uIGRpc2suICovXFxuMTk4NDpcXHRcXHRyZXQgPSBleHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YShOVUxMLCBOVUxMLCBpbG9jLmJoKTtcXG4xOTg1OlxcdFxcdGlmIChyZXQpXFxuMTk4NjpcXHRcXHRcXHRnb3RvIG91dF9icmVsc2U7XFxuMTk4NzpcXHRcXHRyZXQgPSBzeW5jX2RpcnR5X2J1ZmZlcihpbG9jLmJoKTtcXG4xOTg4OlxcdFxcdGlmIChyZXQpXFxuMTk4OTpcXHRcXHRcXHRnb3RvIG91dF9icmVsc2U7XFxuMTk5MDpcXHRcXHRyZXQgPSBleHQ0X21hcmtfaW5vZGVfdXNlZChzYiwgaW5vKTtcXG4xOTkxOlxcdFxcdGlmIChyZXQpXFxuMTk5MjpcXHRcXHRcXHRnb3RvIG91dF9icmVsc2U7XFxuMTk5MzpcXHRcXG4xOTk0OlxcdFxcdC8qIEdpdmVuIHRoYXQgd2UganVzdCB3cm90ZSB0aGUgaW5vZGUgb24gZGlzaywgdGhpcyBTSE9VTEQgc3VjY2VlZC4gKi9cXG4xOTk1OlxcdFxcdGlub2RlID0gZXh0NF9pZ2V0KHNiLCBpbm8sIEVYVDRfSUdFVF9OT1JNQUwpO1xcbjE5OTY6XFx0XFx0aWYgKElTX0VSUihpbm9kZSkpIHtcXG4xOTk3OlxcdFxcdFxcdGV4dDRfZGVidWcoXFxcIklub2RlIG5vdCBmb3VuZC5cXFwiKTtcXG4xOTk4OlxcdFxcdFxcdGlub2RlID0gTlVMTDtcXG4xOTk5OlxcdFxcdFxcdHJldCA9IC1FRlNDT1JSVVBURUQ7XFxuMjAwMDpcXHRcXHRcXHRnb3RvIG91dF9icmVsc2U7XFxuMjAwMTpcXHRcXHR9XFxuMjAwMjpcXHRcXG4yMDAzOlxcdFxcdC8qXFxuMjAwNDpcXHRcXHQgKiBPdXIgYWxsb2NhdG9yIGNvdWxkIGhhdmUgbWFkZSBkaWZmZXJlbnQgZGVjaXNpb25zIHRoYW4gYmVmb3JlXFxuMjAwNTpcXHRcXHQgKiBjcmFzaGluZy4gVGhpcyBzaG91bGQgYmUgZml4ZWQgYnV0IHVudGlsIHRoZW4sIHdlIGNhbGN1bGF0ZVxcbjIwMDY6XFx0XFx0ICogdGhlIG51bWJlciBvZiBibG9ja3MgdGhlIGlub2RlLlxcbjIwMDc6XFx0XFx0ICovXFxuMjAwODpcXHRcXHRpZiAoIWV4dDRfdGVzdF9pbm9kZV9mbGFnKGlub2RlLCBFWFQ0X0lOT0RFX0lOTElORV9EQVRBKSlcXG4yMDA5OlxcdFxcdFxcdGV4dDRfZXh0X3JlcGxheV9zZXRfaWJsb2Nrcyhpbm9kZSk7XFxuMjAxMDpcXHRcXG4yMDExOlxcdFxcdGlub2RlLVxcdTAwM2VpX2dlbmVyYXRpb24gPSBsZTMyX3RvX2NwdShleHQ0X3Jhd19pbm9kZShcXHUwMDI2aWxvYyktXFx1MDAzZWlfZ2VuZXJhdGlvbik7XFxuMjAxMjpcXHRcXHRleHQ0X3Jlc2V0X2lub2RlX3NlZWQoaW5vZGUpO1xcbjIwMTM6XFx0XFxuMjAxNDpcXHRcXHRleHQ0X2lub2RlX2NzdW1fc2V0KGlub2RlLCBleHQ0X3Jhd19pbm9kZShcXHUwMDI2aWxvYyksIEVYVDRfSShpbm9kZSkpO1xcbjIwMTU6XFx0XFx0cmV0ID0gZXh0NF9oYW5kbGVfZGlydHlfbWV0YWRhdGEoTlVMTCwgTlVMTCwgaWxvYy5iaCk7XFxuMjAxNjpcXHRcXHRzeW5jX2RpcnR5X2J1ZmZlcihpbG9jLmJoKTtcXG4yMDE3OlxcdG91dF9icmVsc2U6XFxuMjAxODpcXHRcXHRicmVsc2UoaWxvYy5iaCk7XFxuMjAxOTpcXHRvdXQ6XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTE0VDE0OjM5OjAzLjM5ODM0MzEzMVoiLCJTZXEiOjE2LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuOC1mbGFzaCIsIkR1cmF0aW9uIjoxMjIxNjIyODgzMiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIGEgc3VtbWFyeSBvZiBteSB0aG91Z2h0IHByb2Nlc3MsIGFzIHJlcXVlc3RlZDpcblxuKipEaXZpbmcgaW50byBgZmFzdF9jb21taXQuY2AqKlxuXG5BbHJpZ2h0LCB0aW1lIHRvIGRpZyBpbi4gSSBuZWVkIHRvIHJlZnJlc2ggbXkgbWVtb3J5IG9uIHRoZSBmYXN0IGNvbW1pdCBpbXBsZW1lbnRhdGlvbiB3aXRoaW4gZXh0NC4gTGV0J3Mgc3RhcnQgYnkgemVyb2luZyBpbiBvbiBsaW5lcyAyMDE5IHRocm91Z2ggMjAzMCBvZiBgZnMvZXh0NC9mYXN0X2NvbW1pdC5jYC4gVGhlc2UgbGluZXMgbGlrZWx5IGRlYWwgd2l0aCBhIHNwZWNpZmljIGFzcGVjdCBvZiB0aGUgZmFzdCBjb21taXQgbWVjaGFuaXNtLCBhbmQgdGhhdCdzIHdoZXJlIEkgbmVlZCB0byBmb2N1cyBteSBhdHRlbnRpb24gZm9yIG5vdy4gV2hhdCBwYXJ0aWN1bGFyIGZ1bmN0aW9uYWxpdHkgb3IgcG90ZW50aWFsIGlzc3VlIGlzIGNvdmVyZWQgaW4gdGhhdCBzZWN0aW9uPyBVbmRlcnN0YW5kaW5nIHRoaXMgY2h1bmsgaXMgY3JpdGljYWwgYmVmb3JlIEkgYnJvYWRlbiB0aGUgc2NvcGUuIEkgaG9wZSB0aGUgY29kZSBpcyB3ZWxsLWNvbW1lbnRlZCBzbyBJIGNhbiBxdWlja2x5IGlkZW50aWZ5IHRoZSBwdXJwb3NlIGFuZCBjb250ZXh0IG9mIHRoaXMgY29kZSBibG9jay4gTGV0J3MgZ28hXG5cblxuIiwiSW5wdXRUb2tlbnMiOjk5NjIsIk91dHB1dFRva2VucyI6MzksIk91dHB1dFRob3VnaHRzVG9rZW5zIjoyOCwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTE0VDE0OjM5OjE1LjYxNDU3NDgyM1oiLCJTZXEiOjE3LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyNzkyNzAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwiZnMvZXh0NC9mYXN0X2NvbW1pdC5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDIwMTgsXG4gIFwiTGluZUNvdW50XCI6IDIwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIjIwMTg6XFx0XFx0YnJlbHNlKGlsb2MuYmgpO1xcbjIwMTk6XFx0b3V0OlxcbjIwMjA6XFx0XFx0aXB1dChpbm9kZSk7XFxuMjAyMTpcXHRcXHRpZiAoIXJldClcXG4yMDIyOlxcdFxcdFxcdGJsa2Rldl9pc3N1ZV9mbHVzaChzYi1cXHUwMDNlc19iZGV2KTtcXG4yMDIzOlxcdFxcbjIwMjQ6XFx0XFx0cmV0dXJuIHJldDtcXG4yMDI1OlxcdH1cXG4yMDI2OlxcdFxcbjIwMjc6XFx0LypcXG4yMDI4OlxcdCAqIERlbnRyeSBjcmVhdGUgcmVwbGF5IGZ1bmN0aW9uLlxcbjIwMjk6XFx0ICpcXG4yMDMwOlxcdCAqIEVYVDRfRkNfVEFHX0NSRUFUIGlzIHByZWNlZGVkIGJ5IEVYVDRfRkNfVEFHX0lOT0RFX0ZVTEwuIFdoaWNoIG1lYW5zLCB0aGVcXG4yMDMxOlxcdCAqIGlub2RlIGZvciB3aGljaCB3ZSBhcmUgdHJ5aW5nIHRvIGNyZWF0ZSBhIGRlbnRyeSBoZXJlLCBzaG91bGQgYWxyZWFkeSBoYXZlXFxuMjAzMjpcXHQgKiBiZWVuIHJlcGxheWVkIGJlZm9yZSB3ZSBzdGFydCBoZXJlLlxcbjIwMzM6XFx0ICovXFxuMjAzNDpcXHRzdGF0aWMgaW50IGV4dDRfZmNfcmVwbGF5X2NyZWF0ZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLFxcbjIwMzU6XFx0XFx0XFx0XFx0XFx0IHN0cnVjdCBleHQ0X2ZjX3RsX21lbSAqdGwsIHU4ICp2YWwpXFxuMjAzNjpcXHR7XFxuMjAzNzpcXHRcXHRpbnQgcmV0ID0gMDtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTRUMTQ6Mzk6MTUuNjE0ODU2NjEzWiIsIlNlcSI6MTgsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy44LWZsYXNoIiwiRHVyYXRpb24iOjE2MzM3OTY5NzEyLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyBhIFBvdGVudGlhbCBGdXp6aW5nIFRhcmdldDogZXh0NF9mY19yZXBsYXlfaW5vZGUqKlxuXG5Pa2F5LCBsZXQncyBicmVhayB0aGlzIGRvd24uIEknbSBsb29raW5nIGF0IGBleHQ0X2ZjX3JlcGxheV9pbm9kZWAsIGFuZCB0aGVyZSdzIGEgc3BlY2lmaWMgcGF0dGVybiBoZXJlIHRoYXQgY2F0Y2hlcyBteSBleWUuIFRoZXkndmUgaW50cm9kdWNlZCBhbiBlcnJvciBjaGVjayBhZnRlciBjYWxsaW5nIGBleHQ0X2V4dF9jbGVhcl9iYmAuIFByZXZpb3VzbHksIGl0IHdhcyBibGluZGx5IGNhbGxlZCwgZm9sbG93ZWQgYnkgYGlwdXQoaW5vZGUpYC4gTm93LCBpZiBgZXh0NF9leHRfY2xlYXJfYmJgIGZhaWxzLCBpdCBqdW1wcyB0byBgb3V0YCwgd2hpY2ggKnN0aWxsKiBjYWxscyBgaXB1dChpbm9kZSlgIChvbiBOVUxMLCBzbyBoYXJtbGVzc2x5KSBiZWZvcmUgcmV0dXJuaW5nIHRoZSBlcnJvciBjb2RlLiBUaGUgaW1wb3J0YW50IHRoaW5nIGlzIHRoYXQgbm93IHRoZSBlcnJvciBpcyBiZWluZyBwcm9wYWdhdGVkIHVwIHRoZSBjYWxsIGNoYWluLCBlZmZlY3RpdmVseSBhYm9ydGluZyB0aGUgcmVwbGF5IHByb2Nlc3MgaWYgc29tZXRoaW5nIGdvZXMgd3JvbmcuIFRoaXMgaXMgYSBiZWhhdmlvcmFsIGNoYW5nZSwgYW5kIHdvcnRoIGludmVzdGlnYXRpbmcuXG5cblRoZSBrZXkgcXVlc3Rpb24gaXM6IGlzIHRoaXMgcmVhY2hhYmxlIGNvZGU/IERvZXMgdGhpcyBuZXcgZXJyb3IgaGFuZGxpbmcgcGF0aCBwcm92aWRlIGEgZnV6emluZyBlbnRyeSBwb2ludD8gTGV0J3MgYXBwbHkgdGhlIGNyaXRlcmlhLiBFeHQ0IGlzIGRlZmluaXRlbHkgcGFydCBvZiB0aGUgY29yZSBWRlMsIHNvIHRoYXQncyBhIGNoZWNrLiBJdCdzIGJlZW4gZXh0ZW5zaXZlbHkgZnV6emVkIHZpYSBtb3VudCBhbmQgc3l6a2FsbGVyLCBzbyB0aGF0J3MgYSBwbHVzLiBBbnkgbG9naWMgbW9kaWZpY2F0aW9ucyBpbiBhIFZGUyBjb21wb25lbnQsIGVzcGVjaWFsbHkgb25lIGRlYWxpbmcgd2l0aCBwb3RlbnRpYWxseSBjcml0aWNhbCBkYXRhIHJlY292ZXJ5IGxpa2UgYSBmaWxlc3lzdGVtJ3MgcmVwbGF5IHByb2Nlc3MsIHNob3VsZCByYWlzZSBhIGZsYWcuXG5cbkdpdmVuIHRoZSBjcml0ZXJpYSwgdGhpcyAqY291bGQqIGJlIGEgdmFsaWQgZnV6emluZyB0YXJnZXQuIFRoZSBhbHRlcmF0aW9uIGlzIGEgcmVmYWN0b3Jpbmcgb2YgYSBjb2RlIGZsb3cgdG8gZGVhbCB3aXRoIGVycm9yIGNvbmRpdGlvbnMgYW5kIHRodXMgd29ydGggY2xvc2VyIGF0dGVudGlvbi5cblxuVGhlIG5leHQgc3RlcCBpcyB0byBuYWlsIGRvd24gdGhlIGNvbmZpZ3VyYXRpb24gcmVxdWlyZW1lbnRzLiBXaGF0IGFyZSB0aGUgcHJlcmVxdWlzaXRlcyB0byB0cmlnZ2VyIHRoaXMgY29kZSBwYXRoPyBJIG5lZWQgdG8gY2hlY2sgdGhlIEtjb25maWcgZm9yIGV4dDQgYW5kLCBzcGVjaWZpY2FsbHksIGZvciBmYXN0IGNvbW1pdC4gV2hhdCBjb25maWcgb3B0aW9ucyBhcmUgbmVlZGVkIHRvIG1ha2UgdGhpcyBjb2RlIGFjdGl2ZSBhbmQgcmVhY2hhYmxlP1xuXG5cbiIsIklucHV0VG9rZW5zIjoxMDQ4OSwiT3V0cHV0VG9rZW5zIjozMSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjQ2MywiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTE0VDE0OjM5OjMxLjk1MjgyOTU0NFoiLCJTZXEiOjE5LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6OTI5ODAwODYsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiZmFzdF9jb21taXR8RkFTVF9DT01NSVRcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwiZnMvZXh0NFwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJmcy9leHQ0L01ha2VmaWxlPTg9ZXh0NC15XFx0Oj0gYmFsbG9jLm8gYml0bWFwLm8gYmxvY2tfdmFsaWRpdHkubyBkaXIubyBleHQ0X2piZDIubyBleHRlbnRzLm8gXFxcXFxcbi0tXFxuZnMvZXh0NC9NYWtlZmlsZS0xMi1cXHRcXHRzdXBlci5vIHN5bWxpbmsubyBzeXNmcy5vIHhhdHRyLm8geGF0dHJfaHVyZC5vIHhhdHRyX3RydXN0ZWQubyBcXFxcXFxuZnMvZXh0NC9NYWtlZmlsZToxMzpcXHRcXHR4YXR0cl91c2VyLm8gZmFzdF9jb21taXQubyBvcnBoYW4ub1xcbmZzL2V4dDQvTWFrZWZpbGUtMTQtXFxuLS1cXG5mcy9leHQ0L2V4dDQuaD05NjM9ZG8ge1xcdFxcdFxcdFxcdFxcdFxcdFxcdFxcdFxcdFxcdFxcXFxcXG4tLVxcbmZzL2V4dDQvZXh0NC5oLTk5OS0jaW5jbHVkZSBcXFwiZXh0ZW50c19zdGF0dXMuaFxcXCJcXG5mcy9leHQ0L2V4dDQuaDoxMDAwOiNpbmNsdWRlIFxcXCJmYXN0X2NvbW1pdC5oXFxcIlxcbmZzL2V4dDQvZXh0NC5oLTEwMDEtXFxuLS1cXG5mcy9leHQ0L2V4dDQuaD0xMDQ4PXN0cnVjdCBleHQ0X2lub2RlX2luZm8ge1xcbi0tXFxuZnMvZXh0NC9leHQ0LmgtMTMxNC1cXG5mcy9leHQ0L2V4dDQuaDoxMzE1OiNkZWZpbmUgRVhUNF9NT1VOVDJfSk9VUk5BTF9GQVNUX0NPTU1JVFxcdDB4MDAwMDAwMTAgLyogSm91cm5hbCBmYXN0IGNvbW1pdCAqL1xcbmZzL2V4dDQvZXh0NC5oLTEzMTYtI2RlZmluZSBFWFQ0X01PVU5UMl9EQVhfTkVWRVJcXHRcXHQweDAwMDAwMDIwIC8qIERvIG5vdCBhbGxvdyBEaXJlY3QgQWNjZXNzICovXFxuLS1cXG5mcy9leHQ0L2V4dDQuaD0yMTQwPXN0YXRpYyBpbmxpbmUgc3RydWN0IG1hcHBpbmdfbWV0YWRhdGFfYmhzICpleHQ0X2lfbWV0YWRhdGFfYmhzKFxcbi0tXFxuZnMvZXh0NC9leHQ0LmgtMjE4NS0vKlxcbmZzL2V4dDQvZXh0NC5oOjIxODY6ICogVGhlIHJlYXNvbiB3aHkgXFxcIkZBU1RfQ09NTUlUXFxcIiBpcyBhIGNvbXBhdCBmZWF0dXJlIGlzIHRoYXQsIEZTIGJlY29tZXNcXG5mcy9leHQ0L2V4dDQuaC0yMTg3LSAqIGluY29tcGF0aWJsZSBvbmx5IGlmIGZhc3QgY29tbWl0IGJsb2NrcyBhcmUgcHJlc2VudCBpbiB0aGUgRlMuIFNpbmNlIHdlXFxuLS1cXG5mcy9leHQ0L2V4dDQuaC0yMTkxLSAqL1xcbmZzL2V4dDQvZXh0NC5oOjIxOTI6I2RlZmluZSBFWFQ0X0ZFQVRVUkVfQ09NUEFUX0ZBU1RfQ09NTUlUXFx0XFx0MHgwNDAwXFxuZnMvZXh0NC9leHQ0LmgtMjE5My0jZGVmaW5lIEVYVDRfRkVBVFVSRV9DT01QQVRfU1RBQkxFX0lOT0RFU1xcdDB4MDgwMFxcbi0tXFxuZnMvZXh0NC9leHQ0Lmg9MjI5Nz1FWFQ0X0ZFQVRVUkVfQ09NUEFUX0ZVTkNTKHNwYXJzZV9zdXBlcjIsXFx0U1BBUlNFX1NVUEVSMilcXG5mcy9leHQ0L2V4dDQuaDoyMjk4OkVYVDRfRkVBVFVSRV9DT01QQVRfRlVOQ1MoZmFzdF9jb21taXQsXFx0XFx0RkFTVF9DT01NSVQpXFxuZnMvZXh0NC9leHQ0LmgtMjI5OS1FWFQ0X0ZFQVRVUkVfQ09NUEFUX0ZVTkNTKHN0YWJsZV9pbm9kZXMsXFx0U1RBQkxFX0lOT0RFUylcXG4tLVxcbmZzL2V4dDQvZXh0NC5oPTMwNzA9dm9pZCBleHQ0X2VuZF9iaXRtYXBfcmVhZChzdHJ1Y3QgYmlvICpiaW8pO1xcbmZzL2V4dDQvZXh0NC5oLTMwNzEtXFxuZnMvZXh0NC9leHQ0Lmg6MzA3MjovKiBmYXN0X2NvbW1pdC5jICovXFxuZnMvZXh0NC9leHQ0LmgtMzA3My1pbnQgZXh0NF9mY19pbmZvX3Nob3coc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpO1xcbi0tXFxuZnMvZXh0NC9mYXN0X2NvbW1pdC5jLTMtLypcXG5mcy9leHQ0L2Zhc3RfY29tbWl0LmM6NDogKiBmcy9leHQ0L2Zhc3RfY29tbWl0LmNcXG5mcy9leHQ0L2Zhc3RfY29tbWl0LmMtNS0gKlxcbi0tXFxuZnMvZXh0NC9mYXN0X2NvbW1pdC5jPTIyNT1zdGF0aWMgYm9vbCBleHQ0X2ZjX2Rpc2FibGVkKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpXFxuZnMvZXh0NC9mYXN0X2NvbW1pdC5jLTIyNi17XFxuZnMvZXh0NC9mYXN0X2NvbW1pdC5jOjIyNzpcXHRyZXR1cm4gKCF0ZXN0X29wdDIoc2IsIEpPVVJOQUxfRkFTVF9DT01NSVQpIHx8XFxuZnMvZXh0NC9mYXN0X2NvbW1pdC5jLTIyOC1cXHRcXHQoRVhUNF9TQihzYiktXFx1MDAzZXNfbW91bnRfc3RhdGUgXFx1MDAyNiBFWFQ0X0ZDX1JFUExBWSkpO1xcbi0tXFxuZnMvZXh0NC9mYXN0X2NvbW1pdC5jPTM5MD1zdGF0aWMgaW50IGV4dDRfZmNfdHJhY2tfdGVtcGxhdGUoXFxuLS1cXG5mcy9leHQ0L2Zhc3RfY29tbWl0LmMtNDIwLVxcdFxcdFxcdFxcdChzYmktXFx1MDAzZXNfam91cm5hbC1cXHUwMDNlal9mbGFncyBcXHUwMDI2IEpCRDJfRlVMTF9DT01NSVRfT05HT0lORyB8fFxcbmZzL2V4dDQvZmFzdF9jb21taXQuYzo0MjE6XFx0XFx0XFx0XFx0IHNiaS1cXHUwMDNlc19qb3VybmFsLVxcdTAwM2VqX2ZsYWdzIFxcdTAwMjYgSkJEMl9GQVNUX0NPTU1JVF9PTkdPSU5HKSA/XFxuZnMvZXh0NC9mYXN0X2NvbW1pdC5jLTQyMi1cXHRcXHRcXHRcXHRcXHUwMDI2c2JpLVxcdTAwM2VzX2ZjX3FbRkNfUV9TVEFHSU5HXSA6XFxuLS1cXG5mcy9leHQ0L2Zhc3RfY29tbWl0LmM9NDM1PXN0YXRpYyBpbnQgX190cmFja19kZW50cnlfdXBkYXRlKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsXFxuLS1cXG5mcy9leHQ0L2Zhc3RfY29tbWl0LmMtNDcxLVxcdGlmIChzYmktXFx1MDAzZXNfam91cm5hbC1cXHUwMDNlal9mbGFncyBcXHUwMDI2IEpCRDJfRlVMTF9DT01NSVRfT05HT0lORyB8fFxcbmZzL2V4dDQvZmFzdF9jb21taXQuYzo0NzI6XFx0XFx0c2JpLVxcdTAwM2VzX2pvdXJuYWwtXFx1MDAzZWpfZmxhZ3MgXFx1MDAyNiBKQkQyX0ZBU1RfQ09NTUlUX09OR09JTkcpXFxuZnMvZXh0NC9mYXN0X2NvbW1pdC5jLTQ3My1cXHRcXHRsaXN0X2FkZF90YWlsKFxcdTAwMjZub2RlLVxcdTAwM2VmY2RfbGlzdCxcXG4tLVxcbmZzL2V4dDQvZmFzdF9jb21taXQuYz0xNTY3PWludCBleHQ0X2ZjX2NvbW1pdChqb3VybmFsX3QgKmpvdXJuYWwsIHRpZF90IGNvbW1pdF90aWQpXFxuLS1cXG5mcy9leHQ0L2Zhc3RfY29tbWl0LmMtMTU3Ni1cXG5mcy9leHQ0L2Zhc3RfY29tbWl0LmM6MTU3NzpcXHRpZiAoIXRlc3Rfb3B0MihzYiwgSk9VUk5BTF9GQVNUX0NPTU1JVCkpXFxuZnMvZXh0NC9mYXN0X2NvbW1pdC5jLTE1NzgtXFx0XFx0cmV0dXJuIGpiZDJfY29tcGxldGVfdHJhbnNhY3Rpb24oam91cm5hbCwgY29tbWl0X3RpZCk7XFxuLS1cXG5mcy9leHQ0L2Zhc3RfY29tbWl0LmM9MjY2NT12b2lkIGV4dDRfZmNfaW5pdChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBqb3VybmFsX3QgKmpvdXJuYWwpXFxuLS1cXG5mcy9leHQ0L2Zhc3RfY29tbWl0LmMtMjY3Mi1cXHRqb3VybmFsLVxcdTAwM2VqX2ZjX3JlcGxheV9jYWxsYmFjayA9IGV4dDRfZmNfcmVwbGF5O1xcbmZzL2V4dDQvZmFzdF9jb21taXQuYzoyNjczOlxcdGlmICghdGVzdF9vcHQyKHNiLCBKT1VSTkFMX0ZBU1RfQ09NTUlUKSlcXG5mcy9leHQ0L2Zhc3RfY29tbWl0LmMtMjY3NC1cXHRcXHRyZXR1cm47XFxuLS1cXG5mcy9leHQ0L2Zhc3RfY29tbWl0LmgtMi1cXG5mcy9leHQ0L2Zhc3RfY29tbWl0Lmg6MzojaWZuZGVmIF9fRkFTVF9DT01NSVRfSF9fXFxuZnMvZXh0NC9mYXN0X2NvbW1pdC5oOjQ6I2RlZmluZSBfX0ZBU1RfQ09NTUlUX0hfX1xcbmZzL2V4dDQvZmFzdF9jb21taXQuaC01LVxcbmZzL2V4dDQvZmFzdF9jb21taXQuaC02LS8qXFxuZnMvZXh0NC9mYXN0X2NvbW1pdC5oOjc6ICogTm90ZSB0aGlzIGZpbGUgaXMgcHJlc2VudCBpbiBlMmZzcHJvZ3MvbGliL2V4dDJmcy9mYXN0X2NvbW1pdC5oIGFuZFxcbmZzL2V4dDQvZmFzdF9jb21taXQuaDo4OiAqIGxpbnV4L2ZzL2V4dDQvZmFzdF9jb21taXQuaC4gVGhlc2UgZmlsZSBzaG91bGQgYWx3YXlzIGJlIGJ5dGUgaWRlbnRpY2FsLlxcbmZzL2V4dDQvZmFzdF9jb21taXQuaC05LSAqL1xcbi0tXFxuZnMvZXh0NC9mYXN0X2NvbW1pdC5oPTE2Mz1zdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIgKnRhZzJzdHIoX191MTYgdGFnKVxcbi0tXFxuZnMvZXh0NC9mYXN0X2NvbW1pdC5oLTE4OC1cXG5mcy9leHQ0L2Zhc3RfY29tbWl0Lmg6MTg5OiNlbmRpZiAvKiBfX0ZBU1RfQ09NTUlUX0hfXyAqL1xcbi0tXFxuZnMvZXh0NC9pbm9kZS5jPTM0NDE9c3RhdGljIGJvb2wgZXh0NF9pbm9kZV9kYXRhc3luY19kaXJ0eShzdHJ1Y3QgaW5vZGUgKmlub2RlKVxcbi0tXFxuZnMvZXh0NC9pbm9kZS5jLTM0NDktXFx0XFx0XFx0cmV0dXJuIGZhbHNlO1xcbmZzL2V4dDQvaW5vZGUuYzozNDUwOlxcdFxcdGlmICh0ZXN0X29wdDIoaW5vZGUtXFx1MDAzZWlfc2IsIEpPVVJOQUxfRkFTVF9DT01NSVQpKVxcbmZzL2V4dDQvaW5vZGUuYy0zNDUxLVxcdFxcdFxcdHJldHVybiAhbGlzdF9lbXB0eShcXHUwMDI2RVhUNF9JKGlub2RlKS1cXHUwMDNlaV9mY19saXN0KTtcXG4tLVxcbmZzL2V4dDQvbmFtZWkuYz0zMjI4PWludCBfX2V4dDRfdW5saW5rKHN0cnVjdCBpbm9kZSAqZGlyLCBjb25zdCBzdHJ1Y3QgcXN0ciAqZF9uYW1lLFxcbmZzL2V4dDQvbmFtZWkuYy0zMjI5LVxcdFxcdCAgc3RydWN0IGlub2RlICppbm9kZSxcXG5mcy9leHQ0L25hbWVpLmM6MzIzMDpcXHRcXHQgIHN0cnVjdCBkZW50cnkgKmRlbnRyeSAvKiBOVUxMIGR1cmluZyBmYXN0X2NvbW1pdCByZWNvdmVyeSAqLylcXG5mcy9leHQ0L25hbWVpLmMtMzIzMS17XFxuLS1cXG5mcy9leHQ0L25hbWVpLmM9Mzc5OT1zdGF0aWMgaW50IGV4dDRfcmVuYW1lKHN0cnVjdCBtbnRfaWRtYXAgKmlkbWFwLCBzdHJ1Y3QgaW5vZGUgKm9sZF9kaXIsXFxuLS1cXG5mcy9leHQ0L25hbWVpLmMtNDAwOS1cXHRcXHRcXHRleHQ0X2ZjX3RyYWNrX3VubGluayhoYW5kbGUsIG5ldy5kZW50cnkpO1xcbmZzL2V4dDQvbmFtZWkuYzo0MDEwOlxcdFxcdGlmICh0ZXN0X29wdDIoc2IsIEpPVVJOQUxfRkFTVF9DT01NSVQpIFxcdTAwMjZcXHUwMDI2XFxuZnMvZXh0NC9uYW1laS5jLTQwMTEtXFx0XFx0ICAgICEoRVhUNF9TQihzYiktXFx1MDAzZXNfbW91bnRfc3RhdGUgXFx1MDAyNiBFWFQ0X0ZDX1JFUExBWSkgXFx1MDAyNlxcdTAwMjZcXG4tLVxcbmZzL2V4dDQvc3VwZXIuYz0xODk1PXN0YXRpYyBjb25zdCBzdHJ1Y3QgbW91bnRfb3B0cyB7XFxuLS1cXG5mcy9leHQ0L3N1cGVyLmMtMTk2Mi0jaWZkZWYgQ09ORklHX0VYVDRfREVCVUdcXG5mcy9leHQ0L3N1cGVyLmM6MTk2MzpcXHR7T3B0X2ZjX2RlYnVnX2ZvcmNlLCBFWFQ0X01PVU5UMl9KT1VSTkFMX0ZBU1RfQ09NTUlULFxcbmZzL2V4dDQvc3VwZXIuYy0xOTY0LVxcdCBNT1BUX1NFVCB8IE1PUFRfMiB8IE1PUFRfRVhUNF9PTkxZfSxcXG4tLVxcbmZzL2V4dDQvc3VwZXIuYz00NDA0PXN0YXRpYyB2b2lkIGV4dDRfc2V0X2RlZl9vcHRzKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsXFxuLS1cXG5mcy9leHQ0L3N1cGVyLmMtNDQyMi0jZW5kaWZcXG5mcy9leHQ0L3N1cGVyLmM6NDQyMzpcXHRpZiAoZXh0NF9oYXNfZmVhdHVyZV9mYXN0X2NvbW1pdChzYikpXFxuZnMvZXh0NC9zdXBlci5jOjQ0MjQ6XFx0XFx0c2V0X29wdDIoc2IsIEpPVVJOQUxfRkFTVF9DT01NSVQpO1xcbmZzL2V4dDQvc3VwZXIuYy00NDI1LVxcdC8qIGRvbid0IGZvcmdldCB0byBlbmFibGUgam91cm5hbF9jc3VtIHdoZW4gbWV0YWRhdGFfY3N1bSBpcyBlbmFibGVkLiAqL1xcbi0tXFxuZnMvZXh0NC9zdXBlci5jPTQ1MjM9c3RhdGljIHZvaWQgZXh0NF9hdG9taWNfd3JpdGVfaW5pdChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKVxcbi0tXFxuZnMvZXh0NC9zdXBlci5jLTQ1NDgtXFxuZnMvZXh0NC9zdXBlci5jOjQ1NDk6c3RhdGljIHZvaWQgZXh0NF9mYXN0X2NvbW1pdF9pbml0KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpXFxuZnMvZXh0NC9zdXBlci5jLTQ1NTAte1xcbi0tXFxuZnMvZXh0NC9zdXBlci5jPTQ5NzM9c3RhdGljIGludCBleHQ0X2xvYWRfYW5kX2luaXRfam91cm5hbChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLFxcbi0tXFxuZnMvZXh0NC9zdXBlci5jLTQ5OTYtXFxuZnMvZXh0NC9zdXBlci5jOjQ5OTc6XFx0aWYgKHRlc3Rfb3B0MihzYiwgSk9VUk5BTF9GQVNUX0NPTU1JVCkgXFx1MDAyNlxcdTAwMjZcXG5mcy9leHQ0L3N1cGVyLmMtNDk5OC1cXHRcXHQhamJkMl9qb3VybmFsX3NldF9mZWF0dXJlcyhFWFQ0X1NCKHNiKS1cXHUwMDNlc19qb3VybmFsLCAwLCAwLFxcbmZzL2V4dDQvc3VwZXIuYzo0OTk5OlxcdFxcdFxcdFxcdFxcdCAgSkJEMl9GRUFUVVJFX0lOQ09NUEFUX0ZBU1RfQ09NTUlUKSkge1xcbmZzL2V4dDQvc3VwZXIuYy01MDAwLVxcdFxcdGV4dDRfbXNnKHNiLCBLRVJOX0VSUixcXG4tLVxcbmZzL2V4dDQvc3VwZXIuYz01MDU3PXN0YXRpYyBpbnQgZXh0NF9jaGVja19qb3VybmFsX2RhdGFfbW9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKVxcbi0tXFxuZnMvZXh0NC9zdXBlci5jLTUwNjEtXFx0XFx0XFx0ICAgIFxcXCJkYXRhPWpvdXJuYWwgZGlzYWJsZXMgZGVsYXllZCBhbGxvY2F0aW9uLCBcXFwiXFxuZnMvZXh0NC9zdXBlci5jOjUwNjI6XFx0XFx0XFx0ICAgIFxcXCJkaW9yZWFkX25vbG9jaywgT19ESVJFQ1QgYW5kIGZhc3RfY29tbWl0IHN1cHBvcnQhXFxcXG5cXFwiKTtcXG5mcy9leHQ0L3N1cGVyLmMtNTA2My1cXHRcXHQvKiBjYW4ndCBtb3VudCB3aXRoIGJvdGggZGF0YT1qb3VybmFsIGFuZCBkaW9yZWFkX25vbG9jay4gKi9cXG5mcy9leHQ0L3N1cGVyLmMtNTA2NC1cXHRcXHRjbGVhcl9vcHQoc2IsIERJT1JFQURfTk9MT0NLKTtcXG5mcy9leHQ0L3N1cGVyLmM6NTA2NTpcXHRcXHRjbGVhcl9vcHQyKHNiLCBKT1VSTkFMX0ZBU1RfQ09NTUlUKTtcXG5mcy9leHQ0L3N1cGVyLmMtNTA2Ni1cXHRcXHRpZiAodGVzdF9vcHQyKHNiLCBFWFBMSUNJVF9ERUxBTExPQykpIHtcXG4tLVxcbmZzL2V4dDQvc3VwZXIuYz01MzU3PXN0YXRpYyBpbnQgX19leHQ0X2ZpbGxfc3VwZXIoc3RydWN0IGZzX2NvbnRleHQgKmZjLCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKVxcbi0tXFxuZnMvZXh0NC9zdXBlci5jLTU1MTAtXFx0ZXh0NF9hdG9taWNfd3JpdGVfaW5pdChzYik7XFxuZnMvZXh0NC9zdXBlci5jOjU1MTE6XFx0ZXh0NF9mYXN0X2NvbW1pdF9pbml0KHNiKTtcXG5mcy9leHQ0L3N1cGVyLmMtNTUxMi1cXG4tLVxcbmZzL2V4dDQvc3VwZXIuYy01NTU3LVxcdFxcdGNsZWFyX29wdChzYiwgREFUQV9GTEFHUyk7XFxuZnMvZXh0NC9zdXBlci5jOjU1NTg6XFx0XFx0Y2xlYXJfb3B0MihzYiwgSk9VUk5BTF9GQVNUX0NPTU1JVCk7XFxuZnMvZXh0NC9zdXBlci5jLTU1NTktXFx0XFx0c2JpLVxcdTAwM2VzX2pvdXJuYWwgPSBOVUxMO1xcbi0tXFxuZnMvZXh0NC9zeXNmcy5jPTM2Mz1FWFQ0X0FUVFJfRkVBVFVSRShtZXRhZGF0YV9jc3VtX3NlZWQpO1xcbmZzL2V4dDQvc3lzZnMuYzozNjQ6RVhUNF9BVFRSX0ZFQVRVUkUoZmFzdF9jb21taXQpO1xcbmZzL2V4dDQvc3lzZnMuYy0zNjUtI2lmIElTX0VOQUJMRUQoQ09ORklHX1VOSUNPREUpIFxcdTAwMjZcXHUwMDI2IGRlZmluZWQoQ09ORklHX0ZTX0VOQ1JZUFRJT04pXFxuLS1cXG5mcy9leHQ0L3N5c2ZzLmM9MzcyPXN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpleHQ0X2ZlYXRfYXR0cnNbXSA9IHtcXG4tLVxcbmZzL2V4dDQvc3lzZnMuYy0zODYtXFx0QVRUUl9MSVNUKG1ldGFkYXRhX2NzdW1fc2VlZCksXFxuZnMvZXh0NC9zeXNmcy5jOjM4NzpcXHRBVFRSX0xJU1QoZmFzdF9jb21taXQpLFxcbmZzL2V4dDQvc3lzZnMuYy0zODgtI2lmIElTX0VOQUJMRUQoQ09ORklHX1VOSUNPREUpIFxcdTAwMjZcXHUwMDI2IGRlZmluZWQoQ09ORklHX0ZTX0VOQ1JZUFRJT04pXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTE0VDE0OjM5OjMyLjA0NTgxNTgzWiIsIlNlcSI6MjAsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy44LWZsYXNoIiwiRHVyYXRpb24iOjEyMDY0OTQ2NDU2LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBoZXJlJ3MgbXkgaW50ZXJwcmV0YXRpb24gb2YgdGhvc2UgdGhvdWdodHMsIHRhaWxvcmVkIGZvciBhbiBleHBlcnQgYXVkaWVuY2UsIHByZXNlbnRlZCBpbiB0aGUgZmlyc3QgcGVyc29uOlxuXG4qKkFuYWx5emluZyB0aGUgZXh0NCBCdWlsZCBDb25maWd1cmF0aW9uKipcblxuUmlnaHQsIGBmYXN0X2NvbW1pdC5vYCBpcyBhIGdpdmVuIOKAkyBpdCdzIHByYWN0aWNhbGx5IGJha2VkIGludG8gYGV4dDQteWAgdGhlIG1vbWVudCBgQ09ORklHX0VYVDRfRlNgIGlzIGZsaXBwZWQgb24uIE5vIHN1cnByaXNlcyB0aGVyZS4gQnV0IEknbSBhbHdheXMgbG9va2luZyBmb3IgbnVhbmNlLCBmb3Igd2hlcmUgdGhlIGxldmVycyBhcmUuIFNvLCBsZXQncyBkaXZlIGludG8gYGZzL2V4dDQvS2NvbmZpZ2AuIEkgd2FudCB0byBzZWUgKmV4YWN0bHkqIHdoYXQgY29udHJvbCB3ZSBoYXZlIG92ZXIgdGhlIGV4dDQgY29uZmlndXJhdGlvbi4gV2hhdCBvcHRpb25zIGFyZSBleHBvc2VkLCB3aGF0IGFyZSB0aGUgZGVwZW5kZW5jaWVzLCBhbmQgYXJlIHRoZXJlIGFueSBnb3RjaGFzIHRoYXQgYXJlbid0IGltbWVkaWF0ZWx5IG9idmlvdXMgaW4gdGhlIHNvdXJjZSBpdHNlbGY/IFRpbWUgdG8gc2VlIGlmIHRoZXJlJ3MgYW55dGhpbmcgbW9yZSBnb2luZyBvbiB0aGF0J3Mgd29ydGggbm90aW5nLiBQZXJoYXBzIHRoZXJlJ3MgYW4gaW50ZXJlc3RpbmcgZGVwZW5kZW5jeSBzdHJ1Y3R1cmUsIG9yIG1heWJlIHNvbWUgaGlkZGVuIGNvbmRpdGlvbmFsIGJ1aWxkcyB0byBjb25zaWRlci4gTGV0J3Mgc2VlIHdoYXQgdGhlIEtjb25maWcgZmlsZSBob2xkcy5cblxuXG4iLCJJbnB1dFRva2VucyI6MTQ3MTQsIk91dHB1dFRva2VucyI6MjcsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo1MCwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0xNFQxNDozOTo0NC4xMTA3NjU0MDZaIiwiU2VxIjoyMSwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjYyMzg1OTYwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImNvbmZpZyBFWFQ0XCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcImZzL2V4dDRcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiZnMvZXh0NC9LY29uZmlnLTEtIyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vbmx5XFxuZnMvZXh0NC9LY29uZmlnOjI6Y29uZmlnIEVYVDRfRlNcXG5mcy9leHQ0L0tjb25maWctMy1cXHR0cmlzdGF0ZSBcXFwiVGhlIEV4dGVuZGVkIDQgKGV4dDQpIGZpbGVzeXN0ZW1cXFwiXFxuLS1cXG5mcy9leHQ0L0tjb25maWctMzQtXFxuZnMvZXh0NC9LY29uZmlnOjM1OmNvbmZpZyBFWFQ0X1VTRV9GT1JfRVhUMlxcbmZzL2V4dDQvS2NvbmZpZy0zNi1cXHRib29sIFxcXCJVc2UgZXh0NCBmb3IgZXh0MiBmaWxlIHN5c3RlbXNcXFwiXFxuLS1cXG5mcy9leHQ0L0tjb25maWctNDUtXFxuZnMvZXh0NC9LY29uZmlnOjQ2OmNvbmZpZyBFWFQ0X0ZTX1BPU0lYX0FDTFxcbmZzL2V4dDQvS2NvbmZpZy00Ny1cXHRib29sIFxcXCJFeHQ0IFBPU0lYIEFjY2VzcyBDb250cm9sIExpc3RzXFxcIlxcbi0tXFxuZnMvZXh0NC9LY29uZmlnLTU1LVxcbmZzL2V4dDQvS2NvbmZpZzo1Njpjb25maWcgRVhUNF9GU19TRUNVUklUWVxcbmZzL2V4dDQvS2NvbmZpZy01Ny1cXHRib29sIFxcXCJFeHQ0IFNlY3VyaXR5IExhYmVsc1xcXCJcXG4tLVxcbmZzL2V4dDQvS2NvbmZpZy02Ny1cXG5mcy9leHQ0L0tjb25maWc6Njg6Y29uZmlnIEVYVDRfREVCVUdcXG5mcy9leHQ0L0tjb25maWctNjktXFx0Ym9vbCBcXFwiRXh0NCBkZWJ1Z2dpbmcgc3VwcG9ydFxcXCJcXG4tLVxcbmZzL2V4dDQvS2NvbmZpZy03Ni1cXG5mcy9leHQ0L0tjb25maWc6Nzc6Y29uZmlnIEVYVDRfS1VOSVRfVEVTVFNcXG5mcy9leHQ0L0tjb25maWctNzgtXFx0dHJpc3RhdGUgXFxcIktVbml0IHRlc3RzIGZvciBleHQ0XFxcIiBpZiAhS1VOSVRfQUxMX1RFU1RTXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTE0VDE0OjM5OjQ0LjE3MzE1Nzk0NloiLCJTZXEiOjIyLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuOC1mbGFzaCIsIkR1cmF0aW9uIjoxNDY3MzE4Mzc1OCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IHN1bW1hcnksIGFzIHRob3VnaCBJJ20gdGhpbmtpbmcgdGhyb3VnaCB0aGlzIHByb2Nlc3M6XG5cbioqRGl2aW5nIGludG8gdGhlIEVYVDQgQ29uZmlndXJhdGlvbioqXG5cbk9rYXksIHNvIEkgbmVlZCB0byB1bmRlcnN0YW5kIGhvdyB0aGUgRVhUNCBmaWxlc3lzdGVtIGNvbmZpZ3VyYXRpb24gaXMgaGFuZGxlZCBpbiB0aGlzIGtlcm5lbCBidWlsZC4gVGltZSB0byBoZWFkIHN0cmFpZ2h0IHRvIGBmcy9leHQ0L0tjb25maWdgLiBUaGF0J3Mgd2hlcmUgYWxsIHRoZSByZWxldmFudCBvcHRpb25zIHNob3VsZCBiZSBkZWZpbmVkLCBlc3BlY2lhbGx5IHRob3NlIGNvbnRyb2xsaW5nIHdoZXRoZXIgdGhlIEVYVDQgZmlsZXN5c3RlbSBzdXBwb3J0IGlzIGV2ZW4gaW5jbHVkZWQuIEknbSBwcmltYXJpbHkgaW50ZXJlc3RlZCBpbiB0aGUgYEVYVDRfRlNgIHN5bWJvbCBpdHNlbGYsIHdoaWNoIGlzIHRoZSBiaWcgc3dpdGNoLCBidXQgSSdsbCBwcm9iYWJseSBzY2FuIGFyb3VuZCBpdCB0byBnZXQgYSBzZW5zZSBvZiB0aGUgZGVwZW5kZW5jaWVzIGFuZCByZWxhdGVkIG9wdGlvbnMuIEkgd2FudCB0byBzZWUgaG93IGl0J3MgY29ubmVjdGVkIHRvIG90aGVyIGZlYXR1cmVzLCBhbnkgZGVmYXVsdCBzZXR0aW5ncywgYW5kIGlmIHRoZXJlIGFyZSBhbnkgY29uZGl0aW9uYWwgaW5jbHVzaW9ucyBiYXNlZCBvbiBhcmNoaXRlY3R1cmUgb3Igb3RoZXIga2VybmVsIGNvbmZpZ3VyYXRpb25zLiBJJ20gZXhwZWN0aW5nIHRvIGZpbmQgYSB0eXBpY2FsIEtjb25maWcgc3RydWN0dXJlIOKAkyBzb21lIGBib29sYCBhbmQgYHRyaXN0YXRlYCBvcHRpb25zLCBtYXliZSBzb21lIGRlcGVuZGVuY2llcyBvbiBvdGhlciBmaWxlc3lzdGVtIG9yIGhhcmR3YXJlIGRyaXZlcnMuIFRoZSBnb2FsIGlzIHRvIGZ1bGx5IGdyYXNwIGhvdyBFWFQ0IGlzIGVuYWJsZWQgYW5kIGNvbmZpZ3VyZWQgd2l0aGluIHRoaXMgcGFydGljdWxhciBidWlsZCBlbnZpcm9ubWVudC5cblxuXG4iLCJJbnB1dFRva2VucyI6MTUzNTcsIk91dHB1dFRva2VucyI6MzMsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoyMCwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0xNFQxNDozOTo1OC44NDYzNDQyOTRaIiwiU2VxIjoyMywiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6OTY5MDAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwiZnMvZXh0NC9LY29uZmlnXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDEsXG4gIFwiTGluZUNvdW50XCI6IDM1XG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIiAgIDE6XFx0IyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vbmx5XFxuICAgMjpcXHRjb25maWcgRVhUNF9GU1xcbiAgIDM6XFx0XFx0dHJpc3RhdGUgXFxcIlRoZSBFeHRlbmRlZCA0IChleHQ0KSBmaWxlc3lzdGVtXFxcIlxcbiAgIDQ6XFx0XFx0c2VsZWN0IEJVRkZFUl9IRUFEXFxuICAgNTpcXHRcXHRzZWxlY3QgSkJEMlxcbiAgIDY6XFx0XFx0c2VsZWN0IENSQzE2XFxuICAgNzpcXHRcXHRzZWxlY3QgQ1JDMzJcXG4gICA4OlxcdFxcdHNlbGVjdCBGU19JT01BUFxcbiAgIDk6XFx0XFx0c2VsZWN0IEZTX0VOQ1JZUFRJT05fQUxHUyBpZiBGU19FTkNSWVBUSU9OXFxuICAxMDpcXHRcXHRoZWxwXFxuICAxMTpcXHRcXHQgIFRoaXMgaXMgdGhlIG5leHQgZ2VuZXJhdGlvbiBvZiB0aGUgZXh0MyBmaWxlc3lzdGVtLlxcbiAgMTI6XFx0XFxuICAxMzpcXHRcXHQgIFVubGlrZSB0aGUgY2hhbmdlIGZyb20gZXh0MiBmaWxlc3lzdGVtIHRvIGV4dDMgZmlsZXN5c3RlbSxcXG4gIDE0OlxcdFxcdCAgdGhlIG9uLWRpc2sgZm9ybWF0IG9mIGV4dDQgaXMgbm90IGZvcndhcmRzIGNvbXBhdGlibGUgd2l0aFxcbiAgMTU6XFx0XFx0ICBleHQzOyBpdCBpcyBiYXNlZCBvbiBleHRlbnQgbWFwcyBhbmQgaXQgc3VwcG9ydHMgNDgtYml0XFxuICAxNjpcXHRcXHQgIHBoeXNpY2FsIGJsb2NrIG51bWJlcnMuICBUaGUgZXh0NCBmaWxlc3lzdGVtIGFsc28gc3VwcG9ydHMgZGVsYXllZFxcbiAgMTc6XFx0XFx0ICBhbGxvY2F0aW9uLCBwZXJzaXN0ZW50IHByZWFsbG9jYXRpb24sIGhpZ2ggcmVzb2x1dGlvbiB0aW1lIHN0YW1wcyxcXG4gIDE4OlxcdFxcdCAgYW5kIGEgbnVtYmVyIG9mIG90aGVyIGZlYXR1cmVzIHRvIGltcHJvdmUgcGVyZm9ybWFuY2UgYW5kIHNwZWVkXFxuICAxOTpcXHRcXHQgIHVwIGZzY2sgdGltZS4gIEZvciBtb3JlIGluZm9ybWF0aW9uLCBwbGVhc2Ugc2VlIHRoZSB3ZWIgcGFnZXMgYXRcXG4gIDIwOlxcdFxcdCAgaHR0cDovL2V4dDQud2lraS5rZXJuZWwub3JnLlxcbiAgMjE6XFx0XFxuICAyMjpcXHRcXHQgIFRoZSBleHQ0IGZpbGVzeXN0ZW0gc3VwcG9ydHMgbW91bnRpbmcgYW4gZXh0MyBmaWxlc3lzdGVtOyB3aGlsZSB0aGVyZVxcbiAgMjM6XFx0XFx0ICBhcmUgc29tZSBwZXJmb3JtYW5jZSBnYWlucyBmcm9tIHRoZSBkZWxheWVkIGFsbG9jYXRpb24gYW5kIGlub2RlXFxuICAyNDpcXHRcXHQgIHRhYmxlIHJlYWRhaGVhZCwgdGhlIGJlc3QgcGVyZm9ybWFuY2UgZ2FpbnMgcmVxdWlyZSBlbmFibGluZyBleHQ0XFxuICAyNTpcXHRcXHQgIGZlYXR1cmVzIGluIHRoZSBmaWxlc3lzdGVtIHVzaW5nIHR1bmUyZnMsIG9yIGZvcm1hdHRpbmcgYSBuZXdcXG4gIDI2OlxcdFxcdCAgZmlsZXN5c3RlbSBhcyBhbiBleHQ0IGZpbGVzeXN0ZW0gaW5pdGlhbGx5LiBXaXRob3V0IGV4cGxpY2l0IGVuYWJsaW5nXFxuICAyNzpcXHRcXHQgIG9mIGV4dDQgZmVhdHVyZXMsIHRoZSBvbiBkaXNrIGZpbGVzeXN0ZW0gZm9ybWF0IHN0YXlzIGZ1bGx5IGJhY2t3YXJkXFxuICAyODpcXHRcXHQgIGNvbXBhdGlibGUuXFxuICAyOTpcXHRcXG4gIDMwOlxcdFxcdCAgVG8gY29tcGlsZSB0aGlzIGZpbGUgc3lzdGVtIHN1cHBvcnQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuIFRoZVxcbiAgMzE6XFx0XFx0ICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgZXh0NC5cXG4gIDMyOlxcdFxcbiAgMzM6XFx0XFx0ICBJZiB1bnN1cmUsIHNheSBOLlxcbiAgMzQ6XFx0XFxuICAzNTpcXHRjb25maWcgRVhUNF9VU0VfRk9SX0VYVDJcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTRUMTQ6Mzk6NTguODQ2NDQzMzk0WiIsIlNlcSI6MjQsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy44LWZsYXNoIiwiRHVyYXRpb24iOjk4MDI0NjU1ODksIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSB0aGlua2luZyBwcm9jZXNzOlxuXG4qKkRpdmluZyBpbnRvIHRoZSBleHQ0IENvZGViYXNlKipcblxuT2theSwgc28gSSBzZWUgYENPTkZJR19FWFQ0X0ZTYCwgdGhhdCdzIHRoZSBrZXJuZWwgY29uZmlndXJhdGlvbiBvcHRpb24uIE15IGltbWVkaWF0ZSBpbnN0aW5jdCBpcyB0byBkaWcgaW50byB0aGUgY29udGV4dCBvZiBgZXh0NF9leHRfY2xlYXJfYmJgLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCBpdHMgcm9sZSB3aXRoaW4gdGhlIGxhcmdlciBleHQ0IGZpbGVzeXN0ZW0gaW1wbGVtZW50YXRpb24uIEkgd2FudCB0byBzZWUgaG93IHRoaXMgZnVuY3Rpb24gaXMgdXNlZCwgaG93IGl0IGludGVyYWN0cyB3aXRoIG90aGVyIHBhcnRzIG9mIHRoZSBleHQ0IGNvZGUsIGFuZCB3aGF0IGl0cyBzcGVjaWZpYyBwdXJwb3NlIGlzIHdpdGhpbiB0aGUgbGFyZ2VyIGFyY2hpdGVjdHVyZS4gSSBuZWVkIHRoZSBmdWxsIHBpY3R1cmUgdG8gdW5kZXJzdGFuZCBpdHMgc2lnbmlmaWNhbmNlLiBMZXQncyBnZXQgY3JhY2tpbmcuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjE2MTU0LCJPdXRwdXRUb2tlbnMiOjM4LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MzIsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0xNFQxNDo0MDowOC42NDg5MTIxODNaIiwiU2VxIjoyNSwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MjI2MDIwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcImZzL2V4dDQvZXh0ZW50cy5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDYzMzUsXG4gIFwiTGluZUNvdW50XCI6IDY1XG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIjYzMzU6XFx0XFx0ZXh0NF9mcmVlX2V4dF9wYXRoKHBhdGgyKTtcXG42MzM2OlxcdFxcdHJldHVybiAwO1xcbjYzMzc6XFx0fVxcbjYzMzg6XFx0XFxuNjMzOTpcXHRpbnQgZXh0NF9leHRfY2xlYXJfYmIoc3RydWN0IGlub2RlICppbm9kZSlcXG42MzQwOlxcdHtcXG42MzQxOlxcdFxcdHN0cnVjdCBleHQ0X2V4dF9wYXRoICpwYXRoID0gTlVMTDtcXG42MzQyOlxcdFxcdHN0cnVjdCBleHQ0X2V4dGVudCAqZXg7XFxuNjM0MzpcXHRcXHRleHQ0X2xibGtfdCBjdXIgPSAwLCBlbmQ7XFxuNjM0NDpcXHRcXHRpbnQgaiwgcmV0ID0gMDtcXG42MzQ1OlxcdFxcdHN0cnVjdCBleHQ0X21hcF9ibG9ja3MgbWFwO1xcbjYzNDY6XFx0XFxuNjM0NzpcXHRcXHRpZiAoZXh0NF90ZXN0X2lub2RlX2ZsYWcoaW5vZGUsIEVYVDRfSU5PREVfSU5MSU5FX0RBVEEpKVxcbjYzNDg6XFx0XFx0XFx0cmV0dXJuIDA7XFxuNjM0OTpcXHRcXG42MzUwOlxcdFxcdC8qIERldGVybWluIHRoZSBzaXplIG9mIHRoZSBmaWxlIGZpcnN0ICovXFxuNjM1MTpcXHRcXHRwYXRoID0gZXh0NF9maW5kX2V4dGVudChpbm9kZSwgRVhUX01BWF9CTE9DS1MgLSAxLCBOVUxMLFxcbjYzNTI6XFx0XFx0XFx0XFx0XFx0XFx0RVhUNF9FWF9OT0NBQ0hFKTtcXG42MzUzOlxcdFxcdGlmIChJU19FUlIocGF0aCkpXFxuNjM1NDpcXHRcXHRcXHRyZXR1cm4gUFRSX0VSUihwYXRoKTtcXG42MzU1OlxcdFxcdGV4ID0gcGF0aFtwYXRoLVxcdTAwM2VwX2RlcHRoXS5wX2V4dDtcXG42MzU2OlxcdFxcdGlmICghZXgpXFxuNjM1NzpcXHRcXHRcXHRnb3RvIG91dDtcXG42MzU4OlxcdFxcdGVuZCA9IGxlMzJfdG9fY3B1KGV4LVxcdTAwM2VlZV9ibG9jaykgKyBleHQ0X2V4dF9nZXRfYWN0dWFsX2xlbihleCk7XFxuNjM1OTpcXHRcXG42MzYwOlxcdFxcdGN1ciA9IDA7XFxuNjM2MTpcXHRcXHR3aGlsZSAoY3VyIFxcdTAwM2MgZW5kKSB7XFxuNjM2MjpcXHRcXHRcXHRtYXAubV9sYmxrID0gY3VyO1xcbjYzNjM6XFx0XFx0XFx0bWFwLm1fbGVuID0gZW5kIC0gY3VyO1xcbjYzNjQ6XFx0XFx0XFx0cmV0ID0gZXh0NF9tYXBfYmxvY2tzKE5VTEwsIGlub2RlLCBcXHUwMDI2bWFwLCAwKTtcXG42MzY1OlxcdFxcdFxcdGlmIChyZXQgXFx1MDAzYyAwKVxcbjYzNjY6XFx0XFx0XFx0XFx0Z290byBvdXQ7XFxuNjM2NzpcXHRcXHRcXHRpZiAocmV0IFxcdTAwM2UgMCkge1xcbjYzNjg6XFx0XFx0XFx0XFx0cGF0aCA9IGV4dDRfZmluZF9leHRlbnQoaW5vZGUsIG1hcC5tX2xibGssIHBhdGgsIDApO1xcbjYzNjk6XFx0XFx0XFx0XFx0aWYgKElTX0VSUihwYXRoKSkge1xcbjYzNzA6XFx0XFx0XFx0XFx0XFx0cmV0ID0gUFRSX0VSUihwYXRoKTtcXG42MzcxOlxcdFxcdFxcdFxcdFxcdGdvdG8gb3V0O1xcbjYzNzI6XFx0XFx0XFx0XFx0fVxcbjYzNzM6XFx0XFx0XFx0XFx0Zm9yIChqID0gMDsgaiBcXHUwMDNjIHBhdGgtXFx1MDAzZXBfZGVwdGg7IGorKykge1xcbjYzNzQ6XFx0XFx0XFx0XFx0XFx0ZXh0NF9tYl9tYXJrX2JiKGlub2RlLVxcdTAwM2VpX3NiLFxcbjYzNzU6XFx0XFx0XFx0XFx0XFx0XFx0XFx0cGF0aFtqXS5wX2Jsb2NrLCAxLCBmYWxzZSk7XFxuNjM3NjpcXHRcXHRcXHRcXHRcXHRyZXQgPSBleHQ0X2ZjX3JlY29yZF9yZWdpb25zKGlub2RlLVxcdTAwM2VpX3NiLFxcbjYzNzc6XFx0XFx0XFx0XFx0XFx0XFx0XFx0XFx0ICAgICBpbm9kZS1cXHUwMDNlaV9pbm8sIDAsXFxuNjM3ODpcXHRcXHRcXHRcXHRcXHRcXHRcXHRcXHQgICAgIHBhdGhbal0ucF9ibG9jaywgMSwgMSk7XFxuNjM3OTpcXHRcXHRcXHRcXHRcXHRpZiAocmV0KVxcbjYzODA6XFx0XFx0XFx0XFx0XFx0XFx0Z290byBvdXQ7XFxuNjM4MTpcXHRcXHRcXHRcXHR9XFxuNjM4MjpcXHRcXHRcXHRcXHRleHQ0X21iX21hcmtfYmIoaW5vZGUtXFx1MDAzZWlfc2IsIG1hcC5tX3BibGssIG1hcC5tX2xlbiwgZmFsc2UpO1xcbjYzODM6XFx0XFx0XFx0XFx0cmV0ID0gZXh0NF9mY19yZWNvcmRfcmVnaW9ucyhpbm9kZS1cXHUwMDNlaV9zYiwgaW5vZGUtXFx1MDAzZWlfaW5vLFxcbjYzODQ6XFx0XFx0XFx0XFx0XFx0XFx0XFx0ICAgICBtYXAubV9sYmxrLCBtYXAubV9wYmxrLCBtYXAubV9sZW4sIDEpO1xcbjYzODU6XFx0XFx0XFx0XFx0aWYgKHJldClcXG42Mzg2OlxcdFxcdFxcdFxcdFxcdGdvdG8gb3V0O1xcbjYzODc6XFx0XFx0XFx0fVxcbjYzODg6XFx0XFx0XFx0Y3VyID0gY3VyICsgbWFwLm1fbGVuO1xcbjYzODk6XFx0XFx0fVxcbjYzOTA6XFx0XFxuNjM5MTpcXHRvdXQ6XFxuNjM5MjpcXHRcXHRleHQ0X2ZyZWVfZXh0X3BhdGgocGF0aCk7XFxuNjM5MzpcXHRcXHRyZXR1cm4gcmV0IFxcdTAwM2MgMCA/IHJldCA6IDA7XFxuNjM5NDpcXHR9XFxuNjM5NTpcXHRcXG42Mzk2OlxcdCNpZiBJU19FTkFCTEVEKENPTkZJR19FWFQ0X0tVTklUX1RFU1RTKVxcbjYzOTc6XFx0aW50IGV4dDRfZXh0X3NwYWNlX3Jvb3RfaWR4X3Rlc3Qoc3RydWN0IGlub2RlICppbm9kZSwgaW50IGNoZWNrKVxcbjYzOTg6XFx0e1xcbjYzOTk6XFx0XFx0cmV0dXJuIGV4dDRfZXh0X3NwYWNlX3Jvb3RfaWR4KGlub2RlLCBjaGVjayk7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTE0VDE0OjQwOjA4LjY0OTE0MDIxM1oiLCJTZXEiOjI2LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuOC1mbGFzaCIsIkR1cmF0aW9uIjo0MjE1OTk1NzIwMywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgdGhlIEV4dDQgQmxvY2sgQ2xlYXJpbmcgTG9naWMqKlxuXG5Pa2F5LCBsZXQncyBicmVhayB0aGlzIGRvd24uIEknbSBsb29raW5nIGF0IHRoZSBgZXh0NF9leHRfY2xlYXJfYmJgIGZ1bmN0aW9uLCBzcGVjaWZpY2FsbHkgaG93IGl0IGhhbmRsZXMgcG90ZW50aWFsIGVycm9ycy4gVGhlIGNvcmUgbG9naWMgaXRlcmF0ZXMgdGhyb3VnaCBleHRlbnRzLCBhbmQgdGhlIGNydWNpYWwgdGhpbmcgaXMgaG93IGl0IGhhbmRsZXMgdGhlIHJldHVybiB2YWx1ZXMuIElmIGl0IGZpbmRzIGEgJ2hvbGUnIChgcmV0ID09IDBgKSwgaXQgY29ycmVjdGx5IGluY3JlbWVudHMgYGN1cmAgYnkgdGhlIG1hcCBsZW5ndGguIElmIGl0IGZpbmRzIGJsb2NrcyAoYHJldCBcdTAwM2UgMGApLCB0aGF0J3MgZ29vZC4gQnV0IGhlcmUncyB0aGUga2lja2VyOiBhbiBlcnJvciAoYHJldCBcdTAwM2MgMGApIG5vdyBqdW1wcyBkaXJlY3RseSB0byBgb3V0YCBpbnN0ZWFkIG9mIGEgZmxhd2VkIGVhcmxpZXIgYXBwcm9hY2guXG5cblRoZSBvcmlnaW5hbCBjb2RlJ3MgZXJyb3IgaGFuZGxpbmcgc2VlbWVkIHN1c3BlY3QuIElmIGBleHQ0X2ZpbmRfZXh0ZW50YCByZXR1cm5lZCBhbiBlcnJvciwgdGhlIGNvZGUgKnByZXZpb3VzbHkqIHdvdWxkIHRyeSB0byBjb250aW51ZSB1c2luZyBwb3RlbnRpYWxseSBpbnZhbGlkIGRhdGEgaW4gYG1hcGAgLSBhbmQgdGhlbiBjYWxsIGBleHQ0X2ZpbmRfZXh0ZW50YCBhZ2FpbiB3aXRoIGEgbnVsbCBwYXRoLiBUaGF04oCZcyBhIHJlY2lwZSBmb3IgZGlzYXN0ZXIhIFRoZSAqZml4KiBpcyBub3cgdG8gcHJvcGVybHkgcmV0dXJuIHRoZSBlcnJvciwgYW5kIGp1bXAgb3V0LlxuXG5UaGUgY29kZSBub3cgYWxzbyBleHBsaWNpdGx5IGNoZWNrcyBmb3IgZXJyb3JzIGZyb20gYGV4dDRfZmNfcmVjb3JkX3JlZ2lvbnNgLCBqdW1waW5nIHRvIGBvdXRgIGlmIGl0IGZhaWxzLiBUaGUgYG91dGAgbGFiZWwgcHJvcGVybHkgZnJlZXMgdGhlIGBwYXRoYCDigJMgaXQgaGFuZGxlcyBjYXNlcyB3aGVyZSBgcGF0aGAgaXMgYW4gZXJyb3Igb3IgbnVsbCB3aXRoIGBleHQ0X2ZyZWVfZXh0X3BhdGhgLCBhbmQgdGhlIHJldHVybiB2YWx1ZSBpcyBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgaWYgdGhlcmUgd2FzIG9uZSwgb3RoZXJ3aXNlIGl0IHJldHVybnMgMC5cblxuVGhlIGNhbGwgdG8gYGV4dDRfZXh0X2NsZWFyX2JiYCBpbiBgZXh0NF9mY19yZXBsYXlfaW5vZGVgIGlzIGNsZWFuIOKAkyBpdCBjb3JyZWN0bHkgY2hlY2tzIHRoZSByZXR1cm4gdmFsdWUgYW5kIGV4aXRzIG9uIGVycm9yLCBmcmVlaW5nIHRoZSBpbm9kZS4gVGhlIGludGVudCBpcyBjbGVhci5cblxuVG8gZ2V0IHRoZSBmdWxsIHBpY3R1cmUsIEkgbmVlZCB0byBjaGVjayB0aGUgZ2l0IGxvZyB0byB1bmRlcnN0YW5kIHRoZSBjb250ZXh0IG9mIHRoaXMgY2hhbmdlLiBJIG5lZWQgdG8ga25vdyAqd2hhdCogcHJvYmxlbSB0aGlzIGNvbW1pdCBzcGVjaWZpY2FsbHkgYWRkcmVzc2VzLCB3aGF0IHRoZSBvcmlnaW5hbCBidWcgd2FzLCBhbmQgd2hhdCBlZGdlIGNhc2VzIHRoZSBuZXcgbG9naWMgY29ycmVjdHMuIEkgbmVlZCB0byB1bmRlcnN0YW5kIHdoeSB0aGlzIHdhcyBjaGFuZ2VkLCBhbmQgaG93IHRoZSBjaGFuZ2VzIGltcHJvdmUgcmVsaWFiaWxpdHkgYW5kIGNvcnJlY3RuZXNzLCBhbmQgaG93IHRoaXMgcmVsYXRlcyB0byBGYXN0IENvbW1pdC5cblxuXG4iLCJJbnB1dFRva2VucyI6MTc0MjEsIk91dHB1dFRva2VucyI6MzIsIk91dHB1dFRob3VnaHRzVG9rZW5zIjozNzksIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0xNFQxNDo0MDo1MC44MDkxMDA0MzZaIiwiU2VxIjoyNywiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjk3NzIxODY1LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImV4dDRfZXh0X2NsZWFyX2JiXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcImZzL2V4dDRcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiZnMvZXh0NC9leHQ0Lmg9Mzk1Nz1leHRlcm4gaW50IGV4dDRfZXh0X3JlcGxheV91cGRhdGVfZXgoc3RydWN0IGlub2RlICppbm9kZSwgZXh0NF9sYmxrX3Qgc3RhcnQsXFxuZnMvZXh0NC9leHQ0LmgtMzk1OC1cXHRcXHRpbnQgbGVuLCBpbnQgdW53cml0dGVuLCBleHQ0X2ZzYmxrX3QgcGJsayk7XFxuZnMvZXh0NC9leHQ0Lmg6Mzk1OTpleHRlcm4gaW50IGV4dDRfZXh0X2NsZWFyX2JiKHN0cnVjdCBpbm9kZSAqaW5vZGUpO1xcbmZzL2V4dDQvZXh0NC5oLTM5NjAtXFxuLS1cXG5mcy9leHQ0L2V4dGVudHMuYz02MjUyPWludCBleHQ0X2V4dF9yZXBsYXlfc2V0X2libG9ja3Moc3RydWN0IGlub2RlICppbm9kZSlcXG4tLVxcbmZzL2V4dDQvZXh0ZW50cy5jLTYzMzgtXFxuZnMvZXh0NC9leHRlbnRzLmM6NjMzOTppbnQgZXh0NF9leHRfY2xlYXJfYmIoc3RydWN0IGlub2RlICppbm9kZSlcXG5mcy9leHQ0L2V4dGVudHMuYy02MzQwLXtcXG4tLVxcbmZzL2V4dDQvZmFzdF9jb21taXQuYz0xOTI1PXN0YXRpYyBpbnQgZXh0NF9mY19yZXBsYXlfaW5vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYixcXG4tLVxcbmZzL2V4dDQvZmFzdF9jb21taXQuYy0xOTQzLVxcdGlmICghSVNfRVJSKGlub2RlKSkge1xcbmZzL2V4dDQvZmFzdF9jb21taXQuYzoxOTQ0OlxcdFxcdHJldCA9IGV4dDRfZXh0X2NsZWFyX2JiKGlub2RlKTtcXG5mcy9leHQ0L2Zhc3RfY29tbWl0LmMtMTk0NS1cXHRcXHRpcHV0KGlub2RlKTtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTRUMTQ6NDA6NTAuOTA2ODI5ODdaIiwiU2VxIjoyOCwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjgtZmxhc2giLCJEdXJhdGlvbiI6NTE4MDAyODE5MCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipGdXp6aW5nIEV4dDQ6IFdvcnRoIEl0IGFuZCBIb3cgdG8gQXBwcm9hY2ggSXQqKlxuXG5Pa2F5LCBzbyB0aGUgcXVlc3Rpb24gaXMsIGNhbiB3ZSBhY3R1YWxseSBoaXQgdGhpcyBjb2RlIHdpdGggYSBmdXp6ZXIgbGlrZSBzeXprYWxsZXIgaW4gYSBzdGFuZGFyZCBzZXR1cD8gVGhlIGFuc3dlcidzIGEgcmVzb3VuZGluZyB5ZXMhIEV4dDQgaXMgYSBiZWRyb2NrIGZpbGVzeXN0ZW0gaW4gTGludXgsIHNvIGl0J3MgYSBwcmltZSB0YXJnZXQuIFNwZWNpZmljYWxseSwgaWYgd2UgbW91bnQgYW4gZXh0NCBpbWFnZSBhbmQgdHJpZ2dlciBhIGZhc3QgY29tbWl0IGxvZyByZXBsYXkgKHdoaWNoIHN5emthbGxlciBkb2VzIHdpdGggcmF3IGZpbGVzeXN0ZW0gZnV6emluZyksIHdlIGNhbiBnZXQgcmlnaHQgaW50byBgZXh0NF9mY19yZXBsYXlgIC1cdTAwM2UgYGV4dDRfZmNfcmVwbGF5X2lub2RlYCAtXHUwMDNlIGBleHQ0X2V4dF9jbGVhcl9iYmAuIEZhc3QgY29tbWl0IG9wZXJhdGlvbnMgY2FuIGFsc28gcG9wIHVwIGR1cmluZyByb3V0aW5lIGZpbGVzeXN0ZW0gb3BlcmF0aW9ucywgbGlrZSB3aGVuIGBmc3luY2AgaXMgY2FsbGVkLlxuXG5UaGUga2V5IGhlcmUgaXMgdGhhdCB0aGlzIGlzIGNvcmUgZmlsZXN5c3RlbSBjb2RlLCBzaXR0aW5nIHJpZ2h0IGluIGBmcy9leHQ0L2AuIFRoaXMgbWVhbnMgd2UncmUgdGFsa2luZyBhYm91dCBmdW5kYW1lbnRhbCBzdHVmZiDigJMgZXJyb3IgaGFuZGxpbmcsIGNvbnRyb2wgZmxvdywgYW5kIHJlc291cmNlIGNsZWFudXAgd2l0aGluIGBleHQ0X2V4dF9jbGVhcl9iYmAgYW5kIGBleHQ0X2ZjX3JlcGxheV9pbm9kZWAuIFRoYXQgbWFrZXMgaXQgaW5oZXJlbnRseSBpbnRlcmVzdGluZyBmcm9tIGEgZnV6emluZyBwZXJzcGVjdGl2ZSwgYW5kIHRoZSBwb3RlbnRpYWwgZm9yIHVuY292ZXJpbmcgYnVncyBzZWVtcyBoaWdoLiBUaGVyZWZvcmUsIFdvcnRoRnV6emluZyBpcyBUUlVFLlxuXG5Ob3csIHdoaWNoIHN5bWJvbHMgc2hvdWxkIHdlIHByaW9yaXRpemU/IExldCdzIHpvb20gaW4gb24gdGhlIGZ1bmN0aW9ucyBkaXJlY3RseSBtb2RpZmllZCBvciBkaXJlY3RseSBjb25uZWN0ZWQgdG8gdGhpcyBwb3RlbnRpYWwgdnVsbmVyYWJpbGl0eS4gVGhlIG1vZGlmaWVkIGZ1bmN0aW9ucyBhcmU6IGBleHQ0X2V4dF9jbGVhcl9iYmAgKGluIGBmcy9leHQ0L2V4dGVudHMuY2ApIGFuZCBgZXh0NF9mY19yZXBsYXlfaW5vZGVgIChpbiBgZnMvZXh0NC9mYXN0X2NvbW1pdC5jYCkuIEJ1dCwgYXJlIHRoZXJlIGFueSBvdGhlciBmdW5jdGlvbnMgaW52b2x2ZWQ/IFRoZSBjYWxsZXIgb2YgYGV4dDRfZmNfcmVwbGF5X2lub2RlYCBpcyBgZXh0NF9mY19yZXBsYXlgLCB3aGljaCBpcyBhbHNvIGluIGBmYXN0X2NvbW1pdC5jYC4gU28gbGV0J3MgYWRkIGBleHQ0X2ZjX3JlcGxheWAgdG8gb3VyIGxpc3QgdG8gZXhhbWluZS5cblxuXG4iLCJJbnB1dFRva2VucyI6MTg2MTQsIk91dHB1dFRva2VucyI6MzksIk91dHB1dFRob3VnaHRzVG9rZW5zIjozMDksIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMTRUMTQ6NDA6NTYuMDg2ODYwNDlaIiwiU2VxIjoyOSwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MjM2OTgwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcImZzL2V4dDQvZmFzdF9jb21taXQuY1wiLFxuICBcIkZpcnN0TGluZVwiOiAyNTcwLFxuICBcIkxpbmVDb3VudFwiOiA0MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIyNTcwOlxcdCAqIE1haW4gcmVjb3ZlcnkgcGF0aCBlbnRyeSBwb2ludC5cXG4yNTcxOlxcdCAqIFRoZSBtZWFuaW5nIG9mIHJldHVybiBjb2RlcyBpcyBzaW1pbGFyIGFzIGFib3ZlLlxcbjI1NzI6XFx0ICovXFxuMjU3MzpcXHRzdGF0aWMgaW50IGV4dDRfZmNfcmVwbGF5KGpvdXJuYWxfdCAqam91cm5hbCwgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCxcXG4yNTc0OlxcdFxcdFxcdFxcdFxcdGVudW0gcGFzc3R5cGUgcGFzcywgaW50IG9mZiwgdGlkX3QgZXhwZWN0ZWRfdGlkKVxcbjI1NzU6XFx0e1xcbjI1NzY6XFx0XFx0c3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGpvdXJuYWwtXFx1MDAzZWpfcHJpdmF0ZTtcXG4yNTc3OlxcdFxcdHN0cnVjdCBleHQ0X3NiX2luZm8gKnNiaSA9IEVYVDRfU0Ioc2IpO1xcbjI1Nzg6XFx0XFx0c3RydWN0IGV4dDRfZmNfdGxfbWVtIHRsO1xcbjI1Nzk6XFx0XFx0X191OCAqc3RhcnQsICplbmQsICpjdXIsICp2YWw7XFxuMjU4MDpcXHRcXHRpbnQgcmV0ID0gSkJEMl9GQ19SRVBMQVlfQ09OVElOVUU7XFxuMjU4MTpcXHRcXHRzdHJ1Y3QgZXh0NF9mY19yZXBsYXlfc3RhdGUgKnN0YXRlID0gXFx1MDAyNnNiaS1cXHUwMDNlc19mY19yZXBsYXlfc3RhdGU7XFxuMjU4MjpcXHRcXHRzdHJ1Y3QgZXh0NF9mY190YWlsIHRhaWw7XFxuMjU4MzpcXHRcXG4yNTg0OlxcdFxcdGlmIChwYXNzID09IFBBU1NfU0NBTikge1xcbjI1ODU6XFx0XFx0XFx0c3RhdGUtXFx1MDAzZWZjX2N1cnJlbnRfcGFzcyA9IFBBU1NfU0NBTjtcXG4yNTg2OlxcdFxcdFxcdHJldHVybiBleHQ0X2ZjX3JlcGxheV9zY2FuKGpvdXJuYWwsIGJoLCBvZmYsIGV4cGVjdGVkX3RpZCk7XFxuMjU4NzpcXHRcXHR9XFxuMjU4ODpcXHRcXG4yNTg5OlxcdFxcdGlmIChzdGF0ZS1cXHUwMDNlZmNfY3VycmVudF9wYXNzICE9IHBhc3MpIHtcXG4yNTkwOlxcdFxcdFxcdHN0YXRlLVxcdTAwM2VmY19jdXJyZW50X3Bhc3MgPSBwYXNzO1xcbjI1OTE6XFx0XFx0XFx0c2JpLVxcdTAwM2VzX21vdW50X3N0YXRlIHw9IEVYVDRfRkNfUkVQTEFZO1xcbjI1OTI6XFx0XFx0fVxcbjI1OTM6XFx0XFx0aWYgKCFzYmktXFx1MDAzZXNfZmNfcmVwbGF5X3N0YXRlLmZjX3JlcGxheV9udW1fdGFncykge1xcbjI1OTQ6XFx0XFx0XFx0ZXh0NF9kZWJ1ZyhcXFwiUmVwbGF5IHN0b3BzXFxcXG5cXFwiKTtcXG4yNTk1OlxcdFxcdFxcdGV4dDRfZmNfc2V0X2JpdG1hcHNfYW5kX2NvdW50ZXJzKHNiKTtcXG4yNTk2OlxcdFxcdFxcdHJldHVybiAwO1xcbjI1OTc6XFx0XFx0fVxcbjI1OTg6XFx0XFxuMjU5OTpcXHQjaWZkZWYgQ09ORklHX0VYVDRfREVCVUdcXG4yNjAwOlxcdFxcdGlmIChzYmktXFx1MDAzZXNfZmNfZGVidWdfbWF4X3JlcGxheSBcXHUwMDI2XFx1MDAyNiBvZmYgXFx1MDAzZT0gc2JpLVxcdTAwM2VzX2ZjX2RlYnVnX21heF9yZXBsYXkpIHtcXG4yNjAxOlxcdFxcdFxcdHByX3dhcm4oXFxcIkRyb3BwaW5nIGZjIGJsb2NrICVkIGJlY2F1c2UgbWF4X3JlcGxheSBzZXRcXFxcblxcXCIsIG9mZik7XFxuMjYwMjpcXHRcXHRcXHRyZXR1cm4gSkJEMl9GQ19SRVBMQVlfU1RPUDtcXG4yNjAzOlxcdFxcdH1cXG4yNjA0OlxcdCNlbmRpZlxcbjI2MDU6XFx0XFxuMjYwNjpcXHRcXHRzdGFydCA9ICh1OCAqKWJoLVxcdTAwM2ViX2RhdGE7XFxuMjYwNzpcXHRcXHRlbmQgPSBzdGFydCArIGpvdXJuYWwtXFx1MDAzZWpfYmxvY2tzaXplO1xcbjI2MDg6XFx0XFxuMjYwOTpcXHRcXHRmb3IgKGN1ciA9IHN0YXJ0OyBjdXIgXFx1MDAzYz0gZW5kIC0gRVhUNF9GQ19UQUdfQkFTRV9MRU47XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTE0VDE0OjQwOjU2LjA4NzEwMDUyWiIsIlNlcSI6MzAsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy44LWZsYXNoIiwiRHVyYXRpb24iOjY1MTIwNjIxOTAyLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyBleHQ0IEZhc3QgQ29tbWl0IFJlcGxheSBmb3IgRnV6emluZyoqXG5cbkFscmlnaHQsIGxldCdzIGJyZWFrIGRvd24gdGhpcyBmYXN0IGNvbW1pdCByZXBsYXkgbG9naWMgaW4gZXh0NC4gRmlyc3QsIEkgbmVlZCB0byBjb25maXJtIHdoZXRoZXIgYGV4dDRfZmNfcmVwbGF5YCBpcyBzdGF0aWMgb3Igbm90LiBPa2F5LCBpdCdzIGRlZmluZWQgYXMgYHN0YXRpYyBpbnQgZXh0NF9mY19yZXBsYXlgLiBTbywgaW4gdGhlIHZtbGludXggY29udGV4dCwgc3RhdGljIGZ1bmN0aW9ucyAqc2hvdWxkKiBoYXZlIHN5bWJvbHMgdW5sZXNzIHRoZXkgZ2V0IGlubGluZWQuIEdvb2QgdG8ga25vdy5cblxuTm93LCBgZXh0NF9leHRfY2xlYXJfYmJgIGlzIG5vbi1zdGF0aWMgKGBpbnQgZXh0NF9leHRfY2xlYXJfYmIoc3RydWN0IGlub2RlICppbm9kZSlgKSwgYW5kIHRoYXQncyBpbXBvcnRhbnQuIFRoZW4gd2UgaGF2ZSBgZXh0NF9mY19yZXBsYXlfaW5vZGVgIHdoaWNoIGlzIGBzdGF0aWMgaW50IGV4dDRfZmNfcmVwbGF5X2lub2RlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBleHQ0X2ZjX3RsX21lbSAqdGwsIHU4ICp2YWwpYC4gSSBuZWVkIHRvIGZpZ3VyZSBvdXQgaWYgZWl0aGVyIGBleHQ0X2ZjX3JlcGxheWAgb3IgYGV4dDRfZmNfcmVwbGF5X2lub2RlYCBhcmUgbGlrZWx5IHRvIGJlIGlubGluZWQsIG9yIGlmIHRoZXkncmUgY29tcGxleCBlbm91Z2ggdG8gcHJlc2VydmUgdGhlaXIgc3ltYm9scy5cblxuYGV4dDRfZmNfcmVwbGF5X2lub2RlYCBpcyBhcm91bmQgMTAwIGxpbmVzIGxvbmcsIHNvIGl0J3MgcHJvYmFibHkgbm90IGdldHRpbmcgaW5saW5lZC4gSG93ZXZlciwgYGV4dDRfZXh0X2NsZWFyX2JiYCBpcyBleHBvcnRlZCBpbiBleHQ0LmggYW5kIGlzIG5vbi1zdGF0aWMsIHNvIGl0cyBzeW1ib2wgKm11c3QqIGJlIHByZXNlbnQuIE5vdywgSSBoYXZlIHRvIGNoZWNrIGBleHQ0X2ZjX3JlcGxheWAsIHRoYXQncyBhbiBpbXBvcnRhbnQgb25lLiBUaGUgY29yZSBmdW5jdGlvbnMgSSdtIGludGVyZXN0ZWQgaW4gZm9yIGZ1enppbmcgYXJlLCBpbiBlc3NlbmNlOiBgZXh0NF9leHRfY2xlYXJfYmJgLCBgZXh0NF9mY19yZXBsYXlfaW5vZGVgLCBhbmQgYGV4dDRfZmNfcmVwbGF5YC4gVGhlc2UgdGhyZWUgc2VlbSB0byBiZSB0aGUgbW9zdCBzcGVjaWZpYyB0byB0aGlzIGZhc3QgY29tbWl0IHJlcGxheSBsb2dpYy5cblxuTm93LCBsZXQncyBjaGVjayB3aGF0IGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBhcmUgcmVxdWlyZWQgdG8gZW5hYmxlIHRoZXNlLiBgZXh0NF9leHRfY2xlYXJfYmJgIGFuZCBgZXh0NF9mY19yZXBsYXlfaW5vZGVgIGFyZSBwYXJ0IG9mIGV4dDQuICBPZiBjb3Vyc2UsIGBDT05GSUdfRVhUNF9GU2AgaXMgYSBoYXJkIHJlcXVpcmVtZW50LiBBcmUgdGhlcmUgYW55IG90aGVyIHNwZWNpZmljIGNvbmZpZ3MgbmVlZGVkPyBMZXQncyBjaGVjayB0aGUgYGZzL2V4dDQvTWFrZWZpbGVgLlxuXG5Pa2F5LCBzbzpcbmBgYG1ha2Vcbm9iai0kKENPTkZJR19FWFQ0X0ZTKSArPSBleHQ0Lm9cbmV4dDQteVx0Oj0gYmFsbG9jLm8gYml0bWFwLm8gYmxvY2tfdmFsaWRpdHkubyBkaXIubyBleHQ0X2piZDIubyBleHRlbnRzLm8gXFxcblx0XHRleHRlbnRzX3N0YXR1cy5vIGZpbGUubyBmc21hcC5vIGZzeW5jLm8gaGFzaC5vIGlhbGxvYy5vIFxcXG5cdFx0aW5kaXJlY3QubyBpbmxpbmUubyBpbm9kZS5vIGlvY3RsLm8gbWJhbGxvYy5vIG1pZ3JhdGUubyBcXFxuXHRcdG1tcC5vIG1vdmVfZXh0ZW50Lm8gbmFtZWkubyBwYWdlLWlvLm8gcmVhZHBhZ2UubyByZXNpemUubyBcXFxuXHRcdHN1cGVyLm8gc3ltbGluay5vIHN5c2ZzLm8geGF0dHIubyB4YXR0cl9odXJkLm8geGF0dHJfdHJ1c3RlZC5vIFxcXG5cdFx0eGF0dHJfdXNlci5vIGZhc3RfY29tbWl0Lm8gb3JwaGFuLm9cbmBgYFxuXG5Cb3RoIGBleHRlbnRzLm9gIGFuZCBgZmFzdF9jb21taXQub2AgYXJlIGluY2x1ZGVkIGluIGBleHQ0LXlgIHdoZW4gYENPTkZJR19FWFQ0X0ZTYCBpcyBlbmFibGVkLiBMZXQncyBtYWtlIHN1cmUgbmVpdGhlciBgZXh0NF9leHRfY2xlYXJfYmJgIG5vciBgZXh0NF9mY19yZXBsYXlfaW5vZGVgIGhhdmUgYW55IGNvbmRpdGlvbmFsIGNvbXBpbGF0aW9uIGRpcmVjdGl2ZXMgKGAjaWZkZWZgKSBhcm91bmQgdGhlbS5cblxuQ2hlY2tpbmcgYGZzL2V4dDQvZXh0ZW50cy5jYCBmb3IgYGV4dDRfZXh0X2NsZWFyX2JiYDogTGluZSA2MzM5OiBgaW50IGV4dDRfZXh0X2NsZWFyX2JiKHN0cnVjdCBpbm9kZSAqaW5vZGUpYCAtIG5vIGAjaWZkZWZgIGRpcmVjdGl2ZXMgYXJvdW5kIGl0LiBHb29kLlxuXG5Ob3csIGluIGBmcy9leHQ0L2Zhc3RfY29tbWl0LmNgIGZvciBgZXh0NF9mY19yZXBsYXlfaW5vZGVgOiBMaW5lIDE5MjU6IGBzdGF0aWMgaW50IGV4dDRfZmNfcmVwbGF5X2lub2RlYCAtIGFnYWluLCBubyBgI2lmZGVmYCBhcm91bmQgaXQuIExvb2tzIGxpa2UgYEVYVDRfRlNgIGlzIHRoZSBvbmx5IHJlcXVpcmVtZW50LCB0aGFua2Z1bGx5LlxuXG5Pa2F5LCBsZXQncyBkb3VibGUtY2hlY2sgZXZlcnl0aGluZyBmb3IgY2xhcml0eTpcblxuMS4gICoqV29ydGhGdXp6aW5nOiBUcnVlKiouIFRoZSBwYXRjaCBmaXhlcyBlcnJvciBoYW5kbGluZyBpbiBmYXN0IGNvbW1pdCBsb2cgcmVwbGF5LiBQcmV2aW91c2x5LCBpbiBgZXh0NF9leHRfY2xlYXJfYmIoKWAsIGNlcnRhaW4gZXJyb3JzIHdlcmUgYmVpbmcgaWdub3JlZCwgcG90ZW50aWFsbHkgbGVhZGluZyB0byBhbiBpbnZhbGlkIHN0YXRlLiBOb3csIGVycm9ycyBhcmUgcHJvcGFnYXRlZCwgYW5kIGBleHQ0X2ZjX3JlcGxheV9pbm9kZSgpYCBjaGVja3MgdGhlIHJldHVybiBjb2RlIG9mIGBleHQ0X2V4dF9jbGVhcl9iYigpYCBhbmQgYWJvcnRzIHJlcGxheSBpZiBhbiBlcnJvciBpcyBkZXRlY3RlZC4gVGhpcyBjb2RlIHBhdGggaXMgdXNlZCBkdXJpbmcgam91cm5hbCByZWNvdmVyeS9yZXBsYXkgb24gZXh0NCBtb3VudHMsIHdoaWNoIGlzIGV4ZXJjaXNlZCBpbiBmaWxlc3lzdGVtIGZ1enppbmcgc2NlbmFyaW9zLlxuXG4yLiAgKipGb2N1c1N5bWJvbHM6KiogSSBuZWVkIHRvIHRhcmdldDpcbiAgICAqICAgYGV4dDRfZXh0X2NsZWFyX2JiYFxuICAgICogICBgZXh0NF9mY19yZXBsYXlfaW5vZGVgXG4gICAgKiAgIGBcblxuIiwiSW5wdXRUb2tlbnMiOjIwMDU4LCJPdXRwdXRUb2tlbnMiOjE5MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjk3NiwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTE0VDE0OjQyOjAxLjIwNzcyNjQ2MloiLCJTZXEiOjMxLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJzZXQtcmVzdWx0cyIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjEyMjU1NTc5MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiRVhUNF9GU1wiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcImV4dDRfZXh0X2NsZWFyX2JiXCIsXG4gICAgXCJleHQ0X2ZjX3JlcGxheV9pbm9kZVwiLFxuICAgIFwiZXh0NF9mY19yZXBsYXlcIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBtb2RpZmllcyBlcnJvciBoYW5kbGluZyBhbmQgY29udHJvbCBmbG93IGluIGV4dDQgZmFzdCBjb21taXQgcmVwbGF5IGxvZ2ljLiBJbiBleHQ0X2V4dF9jbGVhcl9iYigpLCBlcnJvcnMgZnJvbSBleHQ0X21hcF9ibG9ja3MoKSwgZXh0NF9maW5kX2V4dGVudCgpLCBhbmQgZXh0NF9mY19yZWNvcmRfcmVnaW9ucygpIGFyZSBub3cgcHJvcGVybHkgY2FwdHVyZWQgYW5kIHJldHVybmVkIGluc3RlYWQgb2YgYmVpbmcgaWdub3JlZC4gQWRkaXRpb25hbGx5LCBleHQ0X2ZjX3JlcGxheV9pbm9kZSgpIG5vdyBjaGVja3MgdGhlIHJldHVybiB2YWx1ZSBvZiBleHQ0X2V4dF9jbGVhcl9iYigpIGFuZCBhYm9ydHMgcmVwbGF5IG9uIGVycm9yLiBUaGlzIHJlYWNoYWJsZSBmaWxlc3lzdGVtIHJlY292ZXJ5IHBhdGggc2hvdWxkIGJlIGZ1enplZCB0byB2ZXJpZnkgdGhhdCBlcnJvciBjb25kaXRpb25zIGFuZCBwYXRoIGNsZWFudXAgYmVoYXZlIGNvcnJlY3RseSB3aXRob3V0IGxlYWtzIG9yIHVuZXhwZWN0ZWQgcGFuaWNzLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIkVYVDRfRlNcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJleHQ0X2V4dF9jbGVhcl9iYlwiLFxuICAgIFwiZXh0NF9mY19yZXBsYXlfaW5vZGVcIixcbiAgICBcImV4dDRfZmNfcmVwbGF5XCJcbiAgXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggbW9kaWZpZXMgZXJyb3IgaGFuZGxpbmcgYW5kIGNvbnRyb2wgZmxvdyBpbiBleHQ0IGZhc3QgY29tbWl0IHJlcGxheSBsb2dpYy4gSW4gZXh0NF9leHRfY2xlYXJfYmIoKSwgZXJyb3JzIGZyb20gZXh0NF9tYXBfYmxvY2tzKCksIGV4dDRfZmluZF9leHRlbnQoKSwgYW5kIGV4dDRfZmNfcmVjb3JkX3JlZ2lvbnMoKSBhcmUgbm93IHByb3Blcmx5IGNhcHR1cmVkIGFuZCByZXR1cm5lZCBpbnN0ZWFkIG9mIGJlaW5nIGlnbm9yZWQuIEFkZGl0aW9uYWxseSwgZXh0NF9mY19yZXBsYXlfaW5vZGUoKSBub3cgY2hlY2tzIHRoZSByZXR1cm4gdmFsdWUgb2YgZXh0NF9leHRfY2xlYXJfYmIoKSBhbmQgYWJvcnRzIHJlcGxheSBvbiBlcnJvci4gVGhpcyByZWFjaGFibGUgZmlsZXN5c3RlbSByZWNvdmVyeSBwYXRoIHNob3VsZCBiZSBmdXp6ZWQgdG8gdmVyaWZ5IHRoYXQgZXJyb3IgY29uZGl0aW9ucyBhbmQgcGF0aCBjbGVhbnVwIGJlaGF2ZSBjb3JyZWN0bHkgd2l0aG91dCBsZWFrcyBvciB1bmV4cGVjdGVkIHBhbmljcy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTRUMTQ6NDI6MDEuMzMwMjkwMzEyWiIsIlNlcSI6MzIsIk5lc3RpbmciOjEsIlR5cGUiOiJhY3Rpb24iLCJOYW1lIjoiSWYiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjozMTYyMTAxMTk4MjksIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xNFQxNDo0MjowMS4zMzA4NjQ4MTJaIiwiU2VxIjozMywiTmVzdGluZyI6MiwiVHlwZSI6ImFnZW50IiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiY29yZSIsIkR1cmF0aW9uIjozMTYyMDk1NDIxNjksIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGltcHJvdmVzIGVycm9yIGhhbmRsaW5nIGluIGV4dDQgZmFzdCBjb21taXQgcmVwbGF5IGNvZGUgKGZzL2V4dDQvZXh0ZW50cy5jIGFuZCBmcy9leHQ0L2Zhc3RfY29tbWl0LmMpLiBTcGVjaWZpY2FsbHksIGV4dDRfZXh0X2NsZWFyX2JiKCkgbm93IHByb3Blcmx5IHByb3BhZ2F0ZXMgZXJyb3IgcmV0dXJuIGNvZGVzIGZyb20gZXh0NF9tYXBfYmxvY2tzKCksIGV4dDRfZmluZF9leHRlbnQoKSwgYW5kIGV4dDRfZmNfcmVjb3JkX3JlZ2lvbnMoKSwgcmF0aGVyIHRoYW4gaWdub3JpbmcgZXJyb3JzIGFuZCB1bmNvbmRpdGlvbmFsbHkgcmV0dXJuaW5nIDAuIEFkZGl0aW9uYWxseSwgZXh0NF9mY19yZXBsYXlfaW5vZGUoKSBub3cgY2hlY2tzIHRoZSByZXR1cm4gdmFsdWUgb2YgZXh0NF9leHRfY2xlYXJfYmIoKSBhbmQgYWJvcnRzIG9uIGVycm9yLlxcblxcblRoZXJlIGFyZSBubyB1bmluaXRpYWxpemVkIHZhcmlhYmxlcyBvciBzdHJ1Y3QgZmllbGRzIGludHJvZHVjZWQgb3IgbW9kaWZpZWQsIG5vIGNvcGllcyB0byB1c2VyIHNwYWNlIG9yIHBvdGVudGlhbCBpbmZvLWxlYWtzLCBhbmQgbm8gYnJhbmNoaW5nIG9uIHVuaW5pdGlhbGl6ZWQgbWVtb3J5LiBBbGwgdmFyaWFibGVzIGludm9sdmVkIChlLmcuIHJldCwgcGF0aCkgYXJlIHByb3Blcmx5IGluaXRpYWxpemVkIGJlZm9yZSB1c2UuIENvbnNlcXVlbnRseSwgdGhpcyBjaGFuZ2UgZG9lcyBub3QgZXhwb3NlIGFueSB1bmluaXRpYWxpemVkIG1lbW9yeSByaXNrcyBkZXRlY3RhYmxlIGJ5IEtNU0FOLiBTdGFuZGFyZCBLQVNBTiBmdXp6aW5nIGFuZCB0ZXN0IHN1aXRlcyBhcmUgZnVsbHkgYWRlcXVhdGUuXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiBmYWxzZVxufSIsIkluc3RydWN0aW9uIjoiWW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIHNlY3VyaXR5IGVuZ2luZWVyIHNwZWNpYWxpemluZyBpbiBrZXJuZWwgbWVtb3J5XG5lcnJvciBkZXRlY3RvcnMgKEtBU0FOIGFuZCBLTVNBTikuIFlvdXIgam9iIGlzIHRvIHJldmlldyB0aGUgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZFxuZGV0ZXJtaW5lIGlmIHRoZSBjb2RlIGNoYW5nZXMganVzdGlmeSBzcGF3bmluZyBhIGRlZGljYXRlZCBLTVNBTiAoS2VybmVsTWVtb3J5U2FuaXRpemVyKVxuZnV6emluZyBzZXNzaW9uIGluIGFkZGl0aW9uIHRvIHN0YW5kYXJkIEtBU0FOIGZ1enppbmcuXG5cbkNSSVRJQ0FMIERJU1RJTkNUSU9OIEJFVFdFRU4gS0FTQU4gQU5EIEtNU0FOOlxuLSBTdGFuZGFyZCBLQVNBTiBrZXJuZWwgYnVpbGRzICh1cHN0cmVhbS1hcHBhcm1vci1rYXNhbi5jb25maWcpIGFscmVhZHkgZW5hYmxlXG4gIGEgY29tcHJlaGVuc2l2ZSBzdWl0ZSBvZiBkZWJ1Z2dpbmcgdG9vbHMgYW5kIHNhbml0aXplcnMsIGluY2x1ZGluZyBLQVNBTlxuICAob3V0LW9mLWJvdW5kcyBhY2Nlc3NlcywgdXNlLWFmdGVyLWZyZWUsIGRvdWJsZSBmcmVlLCBpbnZhbGlkIGZyZWUpLCBMT0NLREVQXG4gIChsb2NraW5nIGJ1Z3MgYW5kIGRlYWRsb2NrcyksIFVCLXNhbml0aXplcnMsIGFuZCBtZW1vcnkgY29ycnVwdGlvbiBjaGVja3MuXG4tIEtNU0FOIChLZXJuZWxNZW1vcnlTYW5pdGl6ZXIpIGRldGVjdHMgcmVhZHMgb2YgVU5JTklUSUFMSVpFRCBtZW1vcnkgKHN0YWNrLCBoZWFwLFxuICBvciBwYWdlIGFsbG9jYXRpb25zKSBhbmQga2VybmVsLXRvLXVzZXIgbWVtb3J5IGluZm8tbGVha3MuXG5cblJ1bGU6IFRIRVJFIElTIE5PIFNFTlNFIElOIFJVTk5JTkcgQSBLTVNBTiBTRVNTSU9OIElGIEEgQlVHIENBTiBCRSBDQVVHSFQgQlkgS0FTQU4sXG5MT0NLREVQLCBPUiBPVEhFUiBTVEFOREFSRCBCVUcgREVURUNUT1JTLlxuQSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGluY3VycyBzaWduaWZpY2FudCByZXNvdXJjZSBjb3N0cy4gWW91IG11c3QgT05MWVxuc2V0IE5lZWRzS01TQU49dHJ1ZSBpZiB0aGUgY29kZSBjaGFuZ2VzIGludHJvZHVjZSBvciBleHBvc2UgVU5JTklUSUFMSVpFRCBNRU1PUlkgcmlza3NcbnRoYXQgYXJlIGRldGVjdGVkIE9OTFkgYnkgS01TQU4uXG5cbkxvb2sgaG9saXN0aWNhbGx5IGF0IHRoZSBwYXRjaCBzZXJpZXMgYW5kIHN1cnJvdW5kaW5nIGNvZGUuIEV2ZW4gaWYgbm8gZGlyZWN0XG51bmluaXRpYWxpemVkIGZpZWxkIGFjY2Vzc2VzIG9yIG5ldyBidWZmZXIgYWxsb2NhdGlvbnMgYXJlIGFkZGVkIGluIHRoZSBkaWZmIGl0c2VsZixcbmEgcGF0Y2ggbWF5IGFsdGVyIGNvbnRyb2wgZmxvdywgYm91bmRzIGNoZWNraW5nLCBvciBkYXRhIGxlbmd0aCBjYWxjdWxhdGlvbnMgaW4gd2F5c1xudGhhdCBjaGFuZ2UgaG93IHRoZSByZXN0IG9mIHRoZSBjb2RlIG9wZXJhdGVzIG9uIGV4aXN0aW5nIGJ1ZmZlcnMgKGUuZy4gYWxsb3dpbmdcbnVuaW5pdGlhbGl6ZWQgc3RhY2svaGVhcCBtZW1vcnkgdG8gYmUgcmVhZCwgY29waWVkIHRvIHVzZXIgc3BhY2UsIG9yIHVzZWQgaW4gY29udHJvbFxuZmxvdykuIERvIG5vdCBoZXNpdGF0ZSB0byB1c2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBpbnNwZWN0IHRoZSBzdXJyb3VuZGluZyBjb2RlLFxuY2FsbGVkIGZ1bmN0aW9ucywgYW5kIGNhbGxlcnMuXG5cblNldCBOZWVkc0tNU0FOPXRydWUgT05MWSBJRiB0aGUgcGF0Y2ggaW50cm9kdWNlcyBvciBtb2RpZmllczpcbjEuIEtlcm5lbCBzdHJ1Y3R1cmVzIHNlbnQgdG8gdXNlciBzcGFjZSAodmlhIGNvcHlfdG9fdXNlciwgcHV0X3VzZXIsIG5ldGxpbmsgc2tiXG4gICBhdHRyaWJ1dGVzLCBpb2N0bCBvdXRwdXQgYXJndW1lbnRzLCBzb2NrZXQgb3B0aW9ucywgb3IgQlBGIGJ1ZmZlcnMpIHdoZXJlIGZpZWxkc1xuICAgb3Igc3RydWN0dXJlIHBhZGRpbmcgbWlnaHQgbm90IGJlIGZ1bGx5IGluaXRpYWxpemVkL3plcm9lZC5cbjIuIENvbmRpdGlvbmFsIGxvZ2ljIG9yIGJyYW5jaGluZyB0aGF0IGRlcGVuZHMgb24gcG90ZW50aWFsbHkgdW5pbml0aWFsaXplZCB2YXJpYWJsZXNcbiAgIG9yIHN0cnVjdCBmaWVsZHMuXG4zLiBBbGxvY2F0aW9uIG9yIGluaXRpYWxpemF0aW9uIG9mIGNvbXBsZXggZGF0YSBzdHJ1Y3R1cmVzIHdoZXJlIHVuaW5pdGlhbGl6ZWQgZmllbGRzXG4gICBjb3VsZCBiZSByZWFkIGxhdGVyIGluIHJlYWNoYWJsZSBjb2RlIHBhdGhzLlxuNC4gQm91bmRzIGNoZWNrcywgbGVuZ3Rocywgb3IgbG9naWMgaW4gYSB3YXkgdGhhdCBhbGxvd3Mgc3Vycm91bmRpbmcgY29kZSB0byBhY2Nlc3NcbiAgIHVuaW5pdGlhbGl6ZWQgYnl0ZXMgb2YgZXhpc3RpbmcgYnVmZmVycy5cblxuU2V0IE5lZWRzS01TQU49ZmFsc2UgSUY6XG4tIFRoZSBjb2RlIGNoYW5nZXMgcHJpbWFyaWx5IHJpc2sgb3V0LW9mLWJvdW5kcyBhY2Nlc3MsIGFycmF5IG92ZXJmbG93cywgTlVMTCBwb2ludGVyXG4gIGRlcmVmZXJlbmNlcywgbG9ja2luZyBkZWFkbG9ja3MsIG9yIHVzZS1hZnRlci1mcmVlIGJ1Z3MgKHRoZXNlIGFyZSBhbHJlYWR5IGNhdWdodFxuICBieSBLQVNBTiwgTE9DS0RFUCwgb3Igc3RhbmRhcmQgYnVnIGRldGVjdG9ycykuXG4tIEFsbCBzdGFjay9oZWFwIHN0cnVjdHVyZXMgdG91Y2hlZCBvciBpbnRyb2R1Y2VkIGJ5IHRoZSBwYXRjaCBhcmUgZnVsbHkgemVyb2VkXG4gIG9yIGluaXRpYWxpemVkIChlLmcuIHVzaW5nID0gezB9LCBtZW1zZXQsIGt6YWxsb2MpIGJlZm9yZSBiZWluZyByZWFkIG9yIGNvcGllZC5cbi0gVGhlIHBhdGNoIGRvZXMgbm90IGludHJvZHVjZSBhbnkgcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSB1c2FnZSBvciBpbmZvLWxlYWtzLlxuXG5Vc2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBpbnNwZWN0IHRoZSBzdXJyb3VuZGluZyBjb2RlIGlmIG5lY2Vzc2FyeSwgdGhlbiBwcm92aWRlXG5kZXRhaWxlZCBLTVNBTlJlYXNvbmluZyBjb250cmFzdGluZyBLQVNBTiB2cyBLTVNBTiBhcHBsaWNhYmlsaXR5IGZvciB0aGlzIHBhdGNoLlxuUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuXG5cblxuVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy5cbkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LlxuSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLlxuIiwiUHJvbXB0IjoiVGFyZ2V0IGFyY2hpdGVjdHVyZTogYW1kNjRcblxuRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6XG5jb21taXQgMzEzZjU1MjNmMzcwZGRjOTY0YTQ1MDUzZjAwNjBjNGY0ZjhmY2YyOFxuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBNb24gU2VwIDE0IDE0OjM2OjA0IDIwMjYgKzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvZnMvZXh0NC9leHRlbnRzLmMgYi9mcy9leHQ0L2V4dGVudHMuY1xuaW5kZXggNzYwMzhiNmMzNjU1Mi4uZjY1ZDI1NGMwZDVlZSAxMDA2NDRcbi0tLSBhL2ZzL2V4dDQvZXh0ZW50cy5jXG4rKysgYi9mcy9leHQ0L2V4dGVudHMuY1xuQEAgLTYzNjMsMjkgKzYzNjMsMzQgQEAgaW50IGV4dDRfZXh0X2NsZWFyX2JiKHN0cnVjdCBpbm9kZSAqaW5vZGUpXG4gXHRcdG1hcC5tX2xlbiA9IGVuZCAtIGN1cjtcbiBcdFx0cmV0ID0gZXh0NF9tYXBfYmxvY2tzKE5VTEwsIGlub2RlLCBcdTAwMjZtYXAsIDApO1xuIFx0XHRpZiAocmV0IFx1MDAzYyAwKVxuLVx0XHRcdGJyZWFrO1xuK1x0XHRcdGdvdG8gb3V0O1xuIFx0XHRpZiAocmV0IFx1MDAzZSAwKSB7XG4gXHRcdFx0cGF0aCA9IGV4dDRfZmluZF9leHRlbnQoaW5vZGUsIG1hcC5tX2xibGssIHBhdGgsIDApO1xuLVx0XHRcdGlmICghSVNfRVJSKHBhdGgpKSB7XG4tXHRcdFx0XHRmb3IgKGogPSAwOyBqIFx1MDAzYyBwYXRoLVx1MDAzZXBfZGVwdGg7IGorKykge1xuLVx0XHRcdFx0XHRleHQ0X21iX21hcmtfYmIoaW5vZGUtXHUwMDNlaV9zYixcbi1cdFx0XHRcdFx0XHRcdHBhdGhbal0ucF9ibG9jaywgMSwgZmFsc2UpO1xuLVx0XHRcdFx0XHRleHQ0X2ZjX3JlY29yZF9yZWdpb25zKGlub2RlLVx1MDAzZWlfc2IsIGlub2RlLVx1MDAzZWlfaW5vLFxuLVx0XHRcdFx0XHRcdFx0MCwgcGF0aFtqXS5wX2Jsb2NrLCAxLCAxKTtcbi1cdFx0XHRcdH1cbi1cdFx0XHR9IGVsc2Uge1xuLVx0XHRcdFx0cGF0aCA9IE5VTEw7XG4rXHRcdFx0aWYgKElTX0VSUihwYXRoKSkge1xuK1x0XHRcdFx0cmV0ID0gUFRSX0VSUihwYXRoKTtcbitcdFx0XHRcdGdvdG8gb3V0O1xuK1x0XHRcdH1cbitcdFx0XHRmb3IgKGogPSAwOyBqIFx1MDAzYyBwYXRoLVx1MDAzZXBfZGVwdGg7IGorKykge1xuK1x0XHRcdFx0ZXh0NF9tYl9tYXJrX2JiKGlub2RlLVx1MDAzZWlfc2IsXG4rXHRcdFx0XHRcdFx0cGF0aFtqXS5wX2Jsb2NrLCAxLCBmYWxzZSk7XG4rXHRcdFx0XHRyZXQgPSBleHQ0X2ZjX3JlY29yZF9yZWdpb25zKGlub2RlLVx1MDAzZWlfc2IsXG4rXHRcdFx0XHRcdFx0XHQgICAgIGlub2RlLVx1MDAzZWlfaW5vLCAwLFxuK1x0XHRcdFx0XHRcdFx0ICAgICBwYXRoW2pdLnBfYmxvY2ssIDEsIDEpO1xuK1x0XHRcdFx0aWYgKHJldClcbitcdFx0XHRcdFx0Z290byBvdXQ7XG4gXHRcdFx0fVxuIFx0XHRcdGV4dDRfbWJfbWFya19iYihpbm9kZS1cdTAwM2VpX3NiLCBtYXAubV9wYmxrLCBtYXAubV9sZW4sIGZhbHNlKTtcbi1cdFx0XHRleHQ0X2ZjX3JlY29yZF9yZWdpb25zKGlub2RlLVx1MDAzZWlfc2IsIGlub2RlLVx1MDAzZWlfaW5vLFxuLVx0XHRcdFx0XHRtYXAubV9sYmxrLCBtYXAubV9wYmxrLCBtYXAubV9sZW4sIDEpO1xuK1x0XHRcdHJldCA9IGV4dDRfZmNfcmVjb3JkX3JlZ2lvbnMoaW5vZGUtXHUwMDNlaV9zYiwgaW5vZGUtXHUwMDNlaV9pbm8sXG4rXHRcdFx0XHRcdFx0ICAgICBtYXAubV9sYmxrLCBtYXAubV9wYmxrLCBtYXAubV9sZW4sIDEpO1xuK1x0XHRcdGlmIChyZXQpXG4rXHRcdFx0XHRnb3RvIG91dDtcbiBcdFx0fVxuIFx0XHRjdXIgPSBjdXIgKyBtYXAubV9sZW47XG4gXHR9XG4gXG4gb3V0OlxuIFx0ZXh0NF9mcmVlX2V4dF9wYXRoKHBhdGgpO1xuLVx0cmV0dXJuIDA7XG4rXHRyZXR1cm4gcmV0IFx1MDAzYyAwID8gcmV0IDogMDtcbiB9XG4gXG4gI2lmIElTX0VOQUJMRUQoQ09ORklHX0VYVDRfS1VOSVRfVEVTVFMpXG5kaWZmIC0tZ2l0IGEvZnMvZXh0NC9mYXN0X2NvbW1pdC5jIGIvZnMvZXh0NC9mYXN0X2NvbW1pdC5jXG5pbmRleCAwY2FjODkwY2YzNzAyLi5hYjcyNjNiNGY5ZTQ2IDEwMDY0NFxuLS0tIGEvZnMvZXh0NC9mYXN0X2NvbW1pdC5jXG4rKysgYi9mcy9leHQ0L2Zhc3RfY29tbWl0LmNcbkBAIC0xOTQxLDggKzE5NDEsMTEgQEAgc3RhdGljIGludCBleHQ0X2ZjX3JlcGxheV9pbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLFxuIFxuIFx0aW5vZGUgPSBleHQ0X2lnZXQoc2IsIGlubywgRVhUNF9JR0VUX05PUk1BTCk7XG4gXHRpZiAoIUlTX0VSUihpbm9kZSkpIHtcbi1cdFx0ZXh0NF9leHRfY2xlYXJfYmIoaW5vZGUpO1xuK1x0XHRyZXQgPSBleHQ0X2V4dF9jbGVhcl9iYihpbm9kZSk7XG4gXHRcdGlwdXQoaW5vZGUpO1xuK1x0XHRpbm9kZSA9IE5VTEw7XG4rXHRcdGlmIChyZXQpXG4rXHRcdFx0Z290byBvdXQ7XG4gXHR9XG4gXHRpbm9kZSA9IE5VTEw7XG4gXG4iLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xNFQxNDo0MjowMS4zMzA4NjU5NjJaIiwiU2VxIjozNCwiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjgtZmxhc2giLCJEdXJhdGlvbiI6MTA0NTQ1MzM3OTQ0LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyB0aGUgQ29kZSBDaGFuZ2VzKipcblxuT2theSwgbGV0J3MgZGl2ZSBpbnRvIHRoaXMuIEZpcnN0LCBJIG5lZWQgdG8gdW5kZXJzdGFuZCB3aGF0IHRoaXMgZGlmZiBpcyBhY3R1YWxseSBkb2luZy4gSXQgbG9va3MgbGlrZSB0aGUgY29yZSBvZiB0aGUgY2hhbmdlcyBhcmUgY2VudGVyZWQgYXJvdW5kIGBmcy9leHQ0L2V4dGVudHMuY2AsIHNwZWNpZmljYWxseSBgZXh0NF9leHRfY2xlYXJfYmJgLCBhbmQgYWxzbyB0b3VjaGVzIGBmcy9leHQ0L2Zhc3RfY29tbWl0LmNgIHdpdGggdGhlIGBleHQ0X2ZjX3JlcGxheV9pbm9kZWAgZnVuY3Rpb24uIEludGVyZXN0aW5nLCBzbyB3ZSdyZSBsb29raW5nIGF0IGV4dGVudCBoYW5kbGluZyBhbmQgcG90ZW50aWFsbHkgZmFzdCBjb21taXQgZnVuY3Rpb25hbGl0eS5cblxuTm93LCBJJ2xsIHVzZSB0aGUgYHJlYWQtZmlsZWAgY29tbWFuZCB0byBwdWxsIHVwIHRoZSByZWxldmFudCBwYXJ0cyBvZiB0aGUgYGV4dGVudHMuY2AgZmlsZSBhbmQgc3BlY2lmaWNhbGx5IGZvY3VzIG9uIHRoZSBhcmVhIGFyb3VuZCBgZXh0NF9leHRfY2xlYXJfYmJgLiBVbmRlcnN0YW5kaW5nIHRoZSBjb250ZXh0IG9mIHRoYXQgZnVuY3Rpb24gaXMga2V5LCBhcyBpcyB0aGUgcm9sZSBvZiBgZXh0NF9mY19yZXBsYXlfaW5vZGVgIGluIGBmYXN0X2NvbW1pdC5jYC4gQ29udGV4dCBpcyBldmVyeXRoaW5nLCBzbyBzZWVpbmcgdGhlIHN1cnJvdW5kaW5nIGNvZGUgd2lsbCBsaWtlbHkgYmUgY3J1Y2lhbCB0byBkZXRlcm1pbmUgdGhlIG5hdHVyZSBvZiB0aGlzIHBhdGNoIGFuZCBpdHMgcG90ZW50aWFsIGltcGxpY2F0aW9ucy4gSSBuZWVkIHRvIHF1aWNrbHkgZ3Jhc3AgdGhlIGludGVyYWN0aW9uIGJldHdlZW4gdGhlc2UgdHdvIGZ1bmN0aW9ucyBhbmQgd2hhdCB0aGlzIGNoYW5nZSBpcyB0cnlpbmcgdG8gYWNoaWV2ZS4gTGV0J3MgZ2V0IHJlYWRpbmcuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjI4MzgsIk91dHB1dFRva2VucyI6MzgsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxMjMsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xNFQxNDo0Mzo0NS44NzYyMDc5NDZaIiwiU2VxIjozNSwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MzUzNjUwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcImZzL2V4dDQvZXh0ZW50cy5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDYzNDAsXG4gIFwiTGluZUNvdW50XCI6IDcwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIjYzNDA6XFx0e1xcbjYzNDE6XFx0XFx0c3RydWN0IGV4dDRfZXh0X3BhdGggKnBhdGggPSBOVUxMO1xcbjYzNDI6XFx0XFx0c3RydWN0IGV4dDRfZXh0ZW50ICpleDtcXG42MzQzOlxcdFxcdGV4dDRfbGJsa190IGN1ciA9IDAsIGVuZDtcXG42MzQ0OlxcdFxcdGludCBqLCByZXQgPSAwO1xcbjYzNDU6XFx0XFx0c3RydWN0IGV4dDRfbWFwX2Jsb2NrcyBtYXA7XFxuNjM0NjpcXHRcXG42MzQ3OlxcdFxcdGlmIChleHQ0X3Rlc3RfaW5vZGVfZmxhZyhpbm9kZSwgRVhUNF9JTk9ERV9JTkxJTkVfREFUQSkpXFxuNjM0ODpcXHRcXHRcXHRyZXR1cm4gMDtcXG42MzQ5OlxcdFxcbjYzNTA6XFx0XFx0LyogRGV0ZXJtaW4gdGhlIHNpemUgb2YgdGhlIGZpbGUgZmlyc3QgKi9cXG42MzUxOlxcdFxcdHBhdGggPSBleHQ0X2ZpbmRfZXh0ZW50KGlub2RlLCBFWFRfTUFYX0JMT0NLUyAtIDEsIE5VTEwsXFxuNjM1MjpcXHRcXHRcXHRcXHRcXHRcXHRFWFQ0X0VYX05PQ0FDSEUpO1xcbjYzNTM6XFx0XFx0aWYgKElTX0VSUihwYXRoKSlcXG42MzU0OlxcdFxcdFxcdHJldHVybiBQVFJfRVJSKHBhdGgpO1xcbjYzNTU6XFx0XFx0ZXggPSBwYXRoW3BhdGgtXFx1MDAzZXBfZGVwdGhdLnBfZXh0O1xcbjYzNTY6XFx0XFx0aWYgKCFleClcXG42MzU3OlxcdFxcdFxcdGdvdG8gb3V0O1xcbjYzNTg6XFx0XFx0ZW5kID0gbGUzMl90b19jcHUoZXgtXFx1MDAzZWVlX2Jsb2NrKSArIGV4dDRfZXh0X2dldF9hY3R1YWxfbGVuKGV4KTtcXG42MzU5OlxcdFxcbjYzNjA6XFx0XFx0Y3VyID0gMDtcXG42MzYxOlxcdFxcdHdoaWxlIChjdXIgXFx1MDAzYyBlbmQpIHtcXG42MzYyOlxcdFxcdFxcdG1hcC5tX2xibGsgPSBjdXI7XFxuNjM2MzpcXHRcXHRcXHRtYXAubV9sZW4gPSBlbmQgLSBjdXI7XFxuNjM2NDpcXHRcXHRcXHRyZXQgPSBleHQ0X21hcF9ibG9ja3MoTlVMTCwgaW5vZGUsIFxcdTAwMjZtYXAsIDApO1xcbjYzNjU6XFx0XFx0XFx0aWYgKHJldCBcXHUwMDNjIDApXFxuNjM2NjpcXHRcXHRcXHRcXHRnb3RvIG91dDtcXG42MzY3OlxcdFxcdFxcdGlmIChyZXQgXFx1MDAzZSAwKSB7XFxuNjM2ODpcXHRcXHRcXHRcXHRwYXRoID0gZXh0NF9maW5kX2V4dGVudChpbm9kZSwgbWFwLm1fbGJsaywgcGF0aCwgMCk7XFxuNjM2OTpcXHRcXHRcXHRcXHRpZiAoSVNfRVJSKHBhdGgpKSB7XFxuNjM3MDpcXHRcXHRcXHRcXHRcXHRyZXQgPSBQVFJfRVJSKHBhdGgpO1xcbjYzNzE6XFx0XFx0XFx0XFx0XFx0Z290byBvdXQ7XFxuNjM3MjpcXHRcXHRcXHRcXHR9XFxuNjM3MzpcXHRcXHRcXHRcXHRmb3IgKGogPSAwOyBqIFxcdTAwM2MgcGF0aC1cXHUwMDNlcF9kZXB0aDsgaisrKSB7XFxuNjM3NDpcXHRcXHRcXHRcXHRcXHRleHQ0X21iX21hcmtfYmIoaW5vZGUtXFx1MDAzZWlfc2IsXFxuNjM3NTpcXHRcXHRcXHRcXHRcXHRcXHRcXHRwYXRoW2pdLnBfYmxvY2ssIDEsIGZhbHNlKTtcXG42Mzc2OlxcdFxcdFxcdFxcdFxcdHJldCA9IGV4dDRfZmNfcmVjb3JkX3JlZ2lvbnMoaW5vZGUtXFx1MDAzZWlfc2IsXFxuNjM3NzpcXHRcXHRcXHRcXHRcXHRcXHRcXHRcXHQgICAgIGlub2RlLVxcdTAwM2VpX2lubywgMCxcXG42Mzc4OlxcdFxcdFxcdFxcdFxcdFxcdFxcdFxcdCAgICAgcGF0aFtqXS5wX2Jsb2NrLCAxLCAxKTtcXG42Mzc5OlxcdFxcdFxcdFxcdFxcdGlmIChyZXQpXFxuNjM4MDpcXHRcXHRcXHRcXHRcXHRcXHRnb3RvIG91dDtcXG42MzgxOlxcdFxcdFxcdFxcdH1cXG42MzgyOlxcdFxcdFxcdFxcdGV4dDRfbWJfbWFya19iYihpbm9kZS1cXHUwMDNlaV9zYiwgbWFwLm1fcGJsaywgbWFwLm1fbGVuLCBmYWxzZSk7XFxuNjM4MzpcXHRcXHRcXHRcXHRyZXQgPSBleHQ0X2ZjX3JlY29yZF9yZWdpb25zKGlub2RlLVxcdTAwM2VpX3NiLCBpbm9kZS1cXHUwMDNlaV9pbm8sXFxuNjM4NDpcXHRcXHRcXHRcXHRcXHRcXHRcXHQgICAgIG1hcC5tX2xibGssIG1hcC5tX3BibGssIG1hcC5tX2xlbiwgMSk7XFxuNjM4NTpcXHRcXHRcXHRcXHRpZiAocmV0KVxcbjYzODY6XFx0XFx0XFx0XFx0XFx0Z290byBvdXQ7XFxuNjM4NzpcXHRcXHRcXHR9XFxuNjM4ODpcXHRcXHRcXHRjdXIgPSBjdXIgKyBtYXAubV9sZW47XFxuNjM4OTpcXHRcXHR9XFxuNjM5MDpcXHRcXG42MzkxOlxcdG91dDpcXG42MzkyOlxcdFxcdGV4dDRfZnJlZV9leHRfcGF0aChwYXRoKTtcXG42MzkzOlxcdFxcdHJldHVybiByZXQgXFx1MDAzYyAwID8gcmV0IDogMDtcXG42Mzk0OlxcdH1cXG42Mzk1OlxcdFxcbjYzOTY6XFx0I2lmIElTX0VOQUJMRUQoQ09ORklHX0VYVDRfS1VOSVRfVEVTVFMpXFxuNjM5NzpcXHRpbnQgZXh0NF9leHRfc3BhY2Vfcm9vdF9pZHhfdGVzdChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgY2hlY2spXFxuNjM5ODpcXHR7XFxuNjM5OTpcXHRcXHRyZXR1cm4gZXh0NF9leHRfc3BhY2Vfcm9vdF9pZHgoaW5vZGUsIGNoZWNrKTtcXG42NDAwOlxcdH1cXG42NDAxOlxcdEVYUE9SVF9TWU1CT0xfRk9SX0VYVDRfVEVTVChleHQ0X2V4dF9zcGFjZV9yb290X2lkeF90ZXN0KTtcXG42NDAyOlxcdFxcbjY0MDM6XFx0c3RydWN0IGV4dDRfZXh0X3BhdGggKmV4dDRfc3BsaXRfY29udmVydF9leHRlbnRzX3Rlc3QoaGFuZGxlX3QgKmhhbmRsZSxcXG42NDA0OlxcdFxcdFxcdFxcdHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBleHQ0X21hcF9ibG9ja3MgKm1hcCxcXG42NDA1OlxcdFxcdFxcdFxcdHN0cnVjdCBleHQ0X2V4dF9wYXRoICpwYXRoLCBpbnQgZmxhZ3MsXFxuNjQwNjpcXHRcXHRcXHRcXHR1bnNpZ25lZCBpbnQgKmFsbG9jYXRlZClcXG42NDA3OlxcdHtcXG42NDA4OlxcdFxcdHJldHVybiBleHQ0X3NwbGl0X2NvbnZlcnRfZXh0ZW50cyhoYW5kbGUsIGlub2RlLCBtYXAsIHBhdGgsXFxuNjQwOTpcXHRcXHRcXHRcXHRcXHRcXHQgIGZsYWdzLCBhbGxvY2F0ZWQpO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xNFQxNDo0Mzo0NS44NzY1NjgyODZaIiwiU2VxIjozNiwiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjgtZmxhc2giLCJEdXJhdGlvbiI6MzU2Nzk1OTAzMDEsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSBzdW1tYXJ5LCBhcyBpZiBJIHdlcmUgdGhpbmtpbmcgdGhlc2UgdGhvdWdodHM6XG5cbioqRXhhbWluaW5nIGBmcy9leHQ0L2Zhc3RfY29tbWl0LmNgIGZvciBDbHVlcyoqXG5cbk9rYXksIEknbSBkaXZpbmcgaW50byB0aGlzIGlzc3VlLCBhbmQgYSBjcnVjaWFsIGFyZWEgdG8gaW52ZXN0aWdhdGUgZnVydGhlciBpcyBsaWtlbHkgYGZzL2V4dDQvZmFzdF9jb21taXQuY2AuIFNwZWNpZmljYWxseSwgbGluZSAxOTQxIGFuZCBhcm91bmQgdGhlcmUgc2VlbXMgbGlrZSBhIHBvdGVudGlhbCBob3RzcG90LiBHaXZlbiB0aGUgbmF0dXJlIG9mIHRoZSBwcm9ibGVtLCBJIHN1c3BlY3QgdGhlIGZhc3QgY29tbWl0IGxvZ2ljIG1pZ2h0IGJlIGludm9sdmVkLiBNeSBoeXBvdGhlc2lzIGlzIHRoYXQgc29tZXRoaW5nIHdpdGhpbiB0aGF0IHBhcnRpY3VsYXIgc2VjdGlvbiBjb3VsZCBiZSBjb250cmlidXRpbmcgdG8gdGhlIG9ic2VydmVkIGJlaGF2aW9yLCBzbyBsZXQncyBjYXJlZnVsbHkgcmV2aWV3IHRoZSBzdXJyb3VuZGluZyBjb2RlIGZvciBjbHVlcy4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhlIGludGVyYWN0aW9ucyBhcm91bmQgdGhhdCBwb2ludCB0byBzZWUgaWYgdGhlcmUncyBhIGNvbmN1cnJlbmN5IGlzc3VlLCBhIHJhY2UgY29uZGl0aW9uLCBvciBhIHN1YnRsZSBidWcgcmVsYXRlZCB0byBkYXRhIHN5bmNocm9uaXphdGlvbi5cblxuXG4iLCJJbnB1dFRva2VucyI6NDQyMSwiT3V0cHV0VG9rZW5zIjozOSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjI1LCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMTRUMTQ6NDQ6MjEuNTU2MTYxOTA3WiIsIlNlcSI6MzcsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjEyNzg3MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJmcy9leHQ0L2Zhc3RfY29tbWl0LmNcIixcbiAgXCJGaXJzdExpbmVcIjogMTkzMCxcbiAgXCJMaW5lQ291bnRcIjogNDBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiMTkzMDpcXHRcXHRzdHJ1Y3QgZXh0NF9pbm9kZSAqcmF3X2ZjX2lub2RlO1xcbjE5MzE6XFx0XFx0c3RydWN0IGlub2RlICppbm9kZSA9IE5VTEw7XFxuMTkzMjpcXHRcXHRzdHJ1Y3QgZXh0NF9pbG9jIGlsb2M7XFxuMTkzMzpcXHRcXHRpbnQgaW5vZGVfbGVuLCBpbm8sIHJldCwgdGFnID0gdGwtXFx1MDAzZWZjX3RhZztcXG4xOTM0OlxcdFxcdHN0cnVjdCBleHQ0X2V4dGVudF9oZWFkZXIgKmVoO1xcbjE5MzU6XFx0XFx0c2l6ZV90IG9mZl9nZW4gPSBvZmZzZXRvZihzdHJ1Y3QgZXh0NF9pbm9kZSwgaV9nZW5lcmF0aW9uKTtcXG4xOTM2OlxcdFxcbjE5Mzc6XFx0XFx0bWVtY3B5KFxcdTAwMjZmY19pbm9kZSwgdmFsLCBzaXplb2YoZmNfaW5vZGUpKTtcXG4xOTM4OlxcdFxcbjE5Mzk6XFx0XFx0aW5vID0gbGUzMl90b19jcHUoZmNfaW5vZGUuZmNfaW5vKTtcXG4xOTQwOlxcdFxcdHRyYWNlX2V4dDRfZmNfcmVwbGF5KHNiLCB0YWcsIGlubywgMCwgMCk7XFxuMTk0MTpcXHRcXG4xOTQyOlxcdFxcdGlub2RlID0gZXh0NF9pZ2V0KHNiLCBpbm8sIEVYVDRfSUdFVF9OT1JNQUwpO1xcbjE5NDM6XFx0XFx0aWYgKCFJU19FUlIoaW5vZGUpKSB7XFxuMTk0NDpcXHRcXHRcXHRyZXQgPSBleHQ0X2V4dF9jbGVhcl9iYihpbm9kZSk7XFxuMTk0NTpcXHRcXHRcXHRpcHV0KGlub2RlKTtcXG4xOTQ2OlxcdFxcdFxcdGlub2RlID0gTlVMTDtcXG4xOTQ3OlxcdFxcdFxcdGlmIChyZXQpXFxuMTk0ODpcXHRcXHRcXHRcXHRnb3RvIG91dDtcXG4xOTQ5OlxcdFxcdH1cXG4xOTUwOlxcdFxcdGlub2RlID0gTlVMTDtcXG4xOTUxOlxcdFxcbjE5NTI6XFx0XFx0cmV0ID0gZXh0NF9mY19yZWNvcmRfbW9kaWZpZWRfaW5vZGUoc2IsIGlubyk7XFxuMTk1MzpcXHRcXHRpZiAocmV0KVxcbjE5NTQ6XFx0XFx0XFx0Z290byBvdXQ7XFxuMTk1NTpcXHRcXG4xOTU2OlxcdFxcdHJhd19mY19pbm9kZSA9IChzdHJ1Y3QgZXh0NF9pbm9kZSAqKVxcbjE5NTc6XFx0XFx0XFx0KHZhbCArIG9mZnNldG9mKHN0cnVjdCBleHQ0X2ZjX2lub2RlLCBmY19yYXdfaW5vZGUpKTtcXG4xOTU4OlxcdFxcdHJldCA9IGV4dDRfZ2V0X2ZjX2lub2RlX2xvYyhzYiwgaW5vLCBcXHUwMDI2aWxvYyk7XFxuMTk1OTpcXHRcXHRpZiAocmV0KVxcbjE5NjA6XFx0XFx0XFx0Z290byBvdXQ7XFxuMTk2MTpcXHRcXG4xOTYyOlxcdFxcdGlub2RlX2xlbiA9IHRsLVxcdTAwM2VmY19sZW4gLSBzaXplb2Yoc3RydWN0IGV4dDRfZmNfaW5vZGUpO1xcbjE5NjM6XFx0XFx0cmF3X2lub2RlID0gZXh0NF9yYXdfaW5vZGUoXFx1MDAyNmlsb2MpO1xcbjE5NjQ6XFx0XFxuMTk2NTpcXHRcXHRtZW1jcHkocmF3X2lub2RlLCByYXdfZmNfaW5vZGUsIG9mZnNldG9mKHN0cnVjdCBleHQ0X2lub2RlLCBpX2Jsb2NrKSk7XFxuMTk2NjpcXHRcXHRtZW1jcHkoKHU4ICopcmF3X2lub2RlICsgb2ZmX2dlbiwgKHU4ICopcmF3X2ZjX2lub2RlICsgb2ZmX2dlbixcXG4xOTY3OlxcdFxcdCAgICAgICBpbm9kZV9sZW4gLSBvZmZfZ2VuKTtcXG4xOTY4OlxcdFxcdGlmIChsZTMyX3RvX2NwdShyYXdfaW5vZGUtXFx1MDAzZWlfZmxhZ3MpIFxcdTAwMjYgRVhUNF9FWFRFTlRTX0ZMKSB7XFxuMTk2OTpcXHRcXHRcXHRlaCA9IChzdHJ1Y3QgZXh0NF9leHRlbnRfaGVhZGVyICopKFxcdTAwMjZyYXdfaW5vZGUtXFx1MDAzZWlfYmxvY2tbMF0pO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xNFQxNDo0NDoyMS41NTYyOTE5MTdaIiwiU2VxIjozOCwiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjgtZmxhc2giLCJEdXJhdGlvbiI6NzY1MzQwNzk2MywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgdGhlIEZpeCBmb3IgUG90ZW50aWFsIFVuaW5pdGlhbGl6ZWQgTWVtb3J5IElzc3VlcyoqXG5cbk9rYXksIGxldCdzIGJyZWFrIHRoaXMgZG93bi4gRmlyc3QsIEkgbmVlZCB0byB1bmRlcnN0YW5kIHdoYXQgdGhlIG9yaWdpbmFsIHByb2JsZW0gd2FzIGFuZCBob3cgdGhlIHBhdGNoIGFkZHJlc3NlcyBpdC4gVGhlIG9yaWdpbmFsIGNvZGUgaW4gYGV4dDRfZXh0X2NsZWFyX2JiYCBoYWQgYSBmZXcgZmxhd3MuIFRoZSBgZXh0NF9maW5kX2V4dGVudGAgZnVuY3Rpb24gY291bGQgZmFpbCwgcmV0dXJuaW5nIGFuIGVycm9yIChgSVNfRVJSKHBhdGgpYCksIGJ1dCB0aGUgY29kZSB3b3VsZCB0aGVuIGJsaXRoZWx5IGNvbnRpbnVlLCBwb3RlbnRpYWxseSBsZWFkaW5nIHRvIGluY29ycmVjdCBibG9jayBtYXJraW5nIGFuZCByZXBvcnRpbmcuIENydWNpYWxseSwgZXJyb3JzIGZyb20gYGV4dDRfZmNfcmVjb3JkX3JlZ2lvbnNgIHdlcmUgYWxzbyBpZ25vcmVkLCBhbmQgdGhlIGZ1bmN0aW9uIGFsd2F5cyByZXR1cm5lZCAwLCBldmVuIHdoZW4gc2VyaW91cyBmYWlsdXJlcyBvY2N1cnJlZCBlYXJsaWVyLiBUaGUgbGluZSBgaWYgKElTX0VSUihwYXRoKSkgcmV0dXJuIFBUUl9FUlIocGF0aCk7YCBzZWVtZWQgdG8gdHJ5IHRvIHJldHVybiBhbiBlcnJvciwgYnV0IGl0IHdhcyBmb2xsb3dlZCBieSBhIGByZXR1cm4gMDtgLCB0aHVzIGJlaW5nIHVzZWxlc3MuIFRoZSBjYWxsaW5nIGZ1bmN0aW9uLCBgZXh0NF9mY19yZXBsYXlfaW5vZGVgLCBjb21wb3VuZGVkIHRoZSBpc3N1ZSBieSBpZ25vcmluZyB0aGUgcmV0dXJuIHZhbHVlIG9mIGBleHQ0X2V4dF9jbGVhcl9iYmAuXG5cbk5vdywgdGhlIHBhdGNoIGFpbXMgdG8gZml4IHRoZXNlIHByb2JsZW1zIGJ5IGludHJvZHVjaW5nIHByb3BlciBlcnJvciBoYW5kbGluZy4gSWYgYGV4dDRfbWFwX2Jsb2Nrc2AgZmFpbHMsIGl0IGBnb3RvIG91dDtgLiBJZiBgZXh0NF9maW5kX2V4dGVudGAgZmFpbHMsIHRoZSBwYXRjaCBzZXRzIGByZXRgIGFuZCBgZ290byBvdXQ7YCwgYW5kIGltcG9ydGFudGx5LCB0aGUgcGF0Y2ggYWRkcyBjaGVja3MgYWZ0ZXIgYGV4dDRfZmNfcmVjb3JkX3JlZ2lvbnNgLiBGaW5hbGx5LCB0aGUgcGF0Y2ggY2hlY2tzIHRoZSByZXR1cm4gdmFsdWUgYW5kIHJldHVybnMgdGhlIG5lZ2F0aXZlIGVycm9yLiBUaGUgY2hhbmdlIGluIGBleHQ0X2ZjX3JlcGxheV9pbm9kZWAgbm93IGNvcnJlY3RseSBjaGVja3MgdGhlIHJldHVybiB2YWx1ZSBvZiBgZXh0NF9leHRfY2xlYXJfYmJgIGFuZCBleGl0cyBpZiBpdCdzIG5vbi16ZXJvLlxuXG5UaGUgY29yZSBxdWVzdGlvbiBub3cgaXMgd2hldGhlciB0aGVzZSBjaGFuZ2VzIGludHJvZHVjZSBvciBleHBvc2UgdW5pbml0aWFsaXplZCBtZW1vcnkgcmlza3MuIExldCdzIHJlZmVyIHRvIHRoZSBLTVNBTiBydWxlcy4gVGhlIHJ1bGUgc3BlY2lmaWNhbGx5IHN0YXRlcyB0aGF0IEtNU0FOIHNob3VsZCBiZSB1c2VkIGlmIHRoZSBjb2RlIGNoYW5nZXMgbWlnaHQgcmV2ZWFsIG9yIGNyZWF0ZSB1bmluaXRpYWxpemVkIG1lbW9yeSByaXNrcyB0aGF0IGNhbm5vdCBiZSBjYXVnaHQgYnkgb3RoZXIgc3RhbmRhcmQgYnVnIGRldGVjdG9ycyBsaWtlIEtBU0FOIG9yIExPQ0tERVAuIFdlJ3JlIGxvb2tpbmcgZm9yIGNvZGUgdGhhdDogMSkgc2VuZHMgdW5pbml0aWFsaXplZCBrZXJuZWwgc3RydWN0dXJlcyB0byB1c2Vyc3BhY2U7IDIpIGNvbmRpdGlvbmFsIGxvZ2ljIGJhc2VkIG9uIHBvdGVudGlhbGx5IHVuaW5pdGlhbGl6ZWQgdmFyaWFibGVzOyAzKSBhbGxvY2F0aW9uL2luaXRpYWxpemF0aW9uIG9mIGNvbXBsZXggZGF0YSBzdHJ1Y3R1cmVzIHdpdGggbGF0ZXIgcG90ZW50aWFsIGZvciByZWFkaW5nIHVuaW5pdGlhbGl6ZWQgZmllbGRzOyBvciA0KSBib3VuZHMgY2hlY2sgaXNzdWVzIHRoYXQgY291bGQgbGVhZCB0byByZWFkaW5nIHVuaW5pdGlhbGl6ZWQgbWVtb3J5LlxuXG5Mb29raW5nIGF0IHRoZSB2YXJpYWJsZXMgd2l0aGluIGBleHQ0X2V4dF9jbGVhcl9iYmAsIGBqYCBhbmQgYHJldGAgYXJlIGluaXRpYWxpemVkLiBUaGUgYHN0cnVjdCBleHQ0X21hcF9ibG9ja3MgbWFwYCBpcyBpbml0aWFsaXplZCBidXQgaXRzIGZpZWxkcyBhcmUgbW9kaWZpZWQgaW4gc3Vic2VxdWVudCBjYWxscy4gTm90YWJseSwgYGV4dDRfbWFwX2Jsb2Nrc2AgaXMgY2FsbGVkIGFuZCBwb3RlbnRpYWxseSB3cml0ZXMgdG8gYG1hcGAncyBmaWVsZHMuIEhvd2V2ZXIsIHRoZSBleGlzdGluZyBjb2RlIGFscmVhZHkgd29ya2VkIHdpdGggdGhpcyBzdHJ1Y3R1cmUuIFRoZSBwYXRjaCBpdHNlbGYgZG9lc24ndCBmdW5kYW1lbnRhbGx5IGNoYW5nZSBob3cgYG1hcGAgaXMgdXNlZDsgaXQgY2hhbmdlcyB0aGUgZXJyb3IgaGFuZGxpbmcgKmFyb3VuZCogaXQuIEluIGBleHQ0X2ZjX3JlcGxheV9pbm9kZWAsIHRoZSBgcmV0YCB2YXJpYWJsZSBpcyBjb3JyZWN0bHkgaGFuZGxlZC4gSW4gdGhlIG9yaWdpbmFsIGNvZGUsIHRoZSByZXR1cm4gdmFsdWUgb2YgYGV4dDRfZXh0X2NsZWFyX2JiYCB3YXMgaWdub3JlZC4gVGhlIHBhdGNoIGRvZXMgbm90IGNoYW5nZSB0aGUgbWVtb3J5IGFsbG9jYXRpb24gb2YgdGhvc2UgdmFyaWFibGVzLiBUaGUgY29kZSBhdCBgb3V0YCB3aWxsIGRlYWwgd2l0aCB0aGUgdmFyaWFibGUgYHBhdGhgLCBidXQgc2luY2UgdGhlIHBhdGNoIGFkZGVkIGVycm9yIGhhbmRsaW5nLCB0aGUgdmFyaWFibGUgYHBhdGhgIGNhbiBiZSBgTlVMTGAuXG5cblNvLCB0aGUgcGF0Y2ggcmVhbGx5IGFkZHJlc3NlcyBhbiBleGlzdGluZyBlcnJvci1oYW5kbGluZyBkZWZpY2llbmN5IGFuZCBpbXByb3ZlcyB0aGUgcmVsaWFiaWxpdHkgb2YgdGhlIGNvZGUuIFdlIGFyZSBub3QgaW50cm9kdWNpbmcgdW5pbml0aWFsaXplZCBtZW1vcnkgcmlza3MuIFRoZSBwYXRjaCBmb2N1c2VzIG9uIGNvcnJlY3QgZXJyb3IgcHJvcGFnYXRpb24gYW5kIGVhcmx5IGV4aXRzLCBwcmV2ZW50aW5nIGZ1cnRoZXIgb3BlcmF0aW9ucyB3aGVuIHNvbWV0aGluZyBnb2VzIHdyb25nLiBUaGVyZWZvcmUsIGJhc2VkIG9uIHRoZSBLTVNBTiBjcml0ZXJpYSwgdGhlcmUncyBubyBldmlkZW5jZSBvZiBhIG5ldyB1bmluaXRpYWxpemVkIG1lbW9yeSBleHBvc3VyZS4gV2UgYXJlIHNhZmUsIGZvciBub3cuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjUzNTcsIk91dHB1dFRva2VucyI6MzksIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxNDM1LCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMTRUMTQ6NDQ6MjkuMjA5NzAyNDJaIiwiU2VxIjozOSwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTM3MDkwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcImZzL2V4dDQvZmFzdF9jb21taXQuY1wiLFxuICBcIkZpcnN0TGluZVwiOiAxOTgwLFxuICBcIkxpbmVDb3VudFwiOiA0MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIxOTgwOlxcdFxcdFxcdFxcdHNpemVvZihyYXdfaW5vZGUtXFx1MDAzZWlfYmxvY2spKTtcXG4xOTgxOlxcdFxcdH1cXG4xOTgyOlxcdFxcbjE5ODM6XFx0XFx0LyogSW1tZWRpYXRlbHkgdXBkYXRlIHRoZSBpbm9kZSBvbiBkaXNrLiAqL1xcbjE5ODQ6XFx0XFx0cmV0ID0gZXh0NF9oYW5kbGVfZGlydHlfbWV0YWRhdGEoTlVMTCwgTlVMTCwgaWxvYy5iaCk7XFxuMTk4NTpcXHRcXHRpZiAocmV0KVxcbjE5ODY6XFx0XFx0XFx0Z290byBvdXRfYnJlbHNlO1xcbjE5ODc6XFx0XFx0cmV0ID0gc3luY19kaXJ0eV9idWZmZXIoaWxvYy5iaCk7XFxuMTk4ODpcXHRcXHRpZiAocmV0KVxcbjE5ODk6XFx0XFx0XFx0Z290byBvdXRfYnJlbHNlO1xcbjE5OTA6XFx0XFx0cmV0ID0gZXh0NF9tYXJrX2lub2RlX3VzZWQoc2IsIGlubyk7XFxuMTk5MTpcXHRcXHRpZiAocmV0KVxcbjE5OTI6XFx0XFx0XFx0Z290byBvdXRfYnJlbHNlO1xcbjE5OTM6XFx0XFxuMTk5NDpcXHRcXHQvKiBHaXZlbiB0aGF0IHdlIGp1c3Qgd3JvdGUgdGhlIGlub2RlIG9uIGRpc2ssIHRoaXMgU0hPVUxEIHN1Y2NlZWQuICovXFxuMTk5NTpcXHRcXHRpbm9kZSA9IGV4dDRfaWdldChzYiwgaW5vLCBFWFQ0X0lHRVRfTk9STUFMKTtcXG4xOTk2OlxcdFxcdGlmIChJU19FUlIoaW5vZGUpKSB7XFxuMTk5NzpcXHRcXHRcXHRleHQ0X2RlYnVnKFxcXCJJbm9kZSBub3QgZm91bmQuXFxcIik7XFxuMTk5ODpcXHRcXHRcXHRpbm9kZSA9IE5VTEw7XFxuMTk5OTpcXHRcXHRcXHRyZXQgPSAtRUZTQ09SUlVQVEVEO1xcbjIwMDA6XFx0XFx0XFx0Z290byBvdXRfYnJlbHNlO1xcbjIwMDE6XFx0XFx0fVxcbjIwMDI6XFx0XFxuMjAwMzpcXHRcXHQvKlxcbjIwMDQ6XFx0XFx0ICogT3VyIGFsbG9jYXRvciBjb3VsZCBoYXZlIG1hZGUgZGlmZmVyZW50IGRlY2lzaW9ucyB0aGFuIGJlZm9yZVxcbjIwMDU6XFx0XFx0ICogY3Jhc2hpbmcuIFRoaXMgc2hvdWxkIGJlIGZpeGVkIGJ1dCB1bnRpbCB0aGVuLCB3ZSBjYWxjdWxhdGVcXG4yMDA2OlxcdFxcdCAqIHRoZSBudW1iZXIgb2YgYmxvY2tzIHRoZSBpbm9kZS5cXG4yMDA3OlxcdFxcdCAqL1xcbjIwMDg6XFx0XFx0aWYgKCFleHQ0X3Rlc3RfaW5vZGVfZmxhZyhpbm9kZSwgRVhUNF9JTk9ERV9JTkxJTkVfREFUQSkpXFxuMjAwOTpcXHRcXHRcXHRleHQ0X2V4dF9yZXBsYXlfc2V0X2libG9ja3MoaW5vZGUpO1xcbjIwMTA6XFx0XFxuMjAxMTpcXHRcXHRpbm9kZS1cXHUwMDNlaV9nZW5lcmF0aW9uID0gbGUzMl90b19jcHUoZXh0NF9yYXdfaW5vZGUoXFx1MDAyNmlsb2MpLVxcdTAwM2VpX2dlbmVyYXRpb24pO1xcbjIwMTI6XFx0XFx0ZXh0NF9yZXNldF9pbm9kZV9zZWVkKGlub2RlKTtcXG4yMDEzOlxcdFxcbjIwMTQ6XFx0XFx0ZXh0NF9pbm9kZV9jc3VtX3NldChpbm9kZSwgZXh0NF9yYXdfaW5vZGUoXFx1MDAyNmlsb2MpLCBFWFQ0X0koaW5vZGUpKTtcXG4yMDE1OlxcdFxcdHJldCA9IGV4dDRfaGFuZGxlX2RpcnR5X21ldGFkYXRhKE5VTEwsIE5VTEwsIGlsb2MuYmgpO1xcbjIwMTY6XFx0XFx0c3luY19kaXJ0eV9idWZmZXIoaWxvYy5iaCk7XFxuMjAxNzpcXHRvdXRfYnJlbHNlOlxcbjIwMTg6XFx0XFx0YnJlbHNlKGlsb2MuYmgpO1xcbjIwMTk6XFx0b3V0OlxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xNFQxNDo0NDoyOS4yMDk4NDE5OVoiLCJTZXEiOjQwLCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuOC1mbGFzaCIsIkR1cmF0aW9uIjo3MTgwMzY3MDY5MSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgdGhlIGBleHQ0X2ZjX3JlcGxheV9pbm9kZWAgQ29kZSoqXG5cbk9rYXksIGxldCdzIGJyZWFrIHRoaXMgZG93bi4gSSdtIGxvb2tpbmcgYXQgdGhlIGBleHQ0X2ZjX3JlcGxheV9pbm9kZWAgZnVuY3Rpb24sIHNwZWNpZmljYWxseSB0aGUgZXhpdCBwb2ludHMuIFRoZSBjb2RlIGhhcyBhIGBnb3RvIG91dDtgIGFuZCBhIGBnb3RvIG91dF9icmVsc2U7YCBsYWJlbC4gVGhlIGBvdXRfYnJlbHNlYCBsYWJlbCBzaW1wbHkgY2FsbHMgYGJyZWxzZShpbG9jLmJoKWAuIFRoZW4sIGluIHRoZSBgb3V0OmAgYmxvY2ssIHdlIGhhdmUgYGlwdXQoaW5vZGUpYCBhbmQgYSBgcmV0dXJuIHJldGAuXG5cbk5vdywgdGhlIGludGVyZXN0aW5nIHBhcnQgaXMgdGhpcyBzZXF1ZW5jZTpcblxuYGBgY1xuXHRcdHJldCA9IGV4dDRfZXh0X2NsZWFyX2JiKGlub2RlKTtcblx0XHRpcHV0KGlub2RlKTtcblx0XHRpbm9kZSA9IE5VTEw7XG5cdFx0aWYgKHJldClcblx0XHRcdGdvdG8gb3V0O1xuYGBgXG5cbkl0IGxvb2tzIGxpa2Ugd2UncmUgY2FsbGluZyBgZXh0NF9leHRfY2xlYXJfYmIoaW5vZGUpYCwgd2hpY2ggY291bGQgcG90ZW50aWFsbHkgZmFpbCwgaW5kaWNhdGVkIGJ5IGByZXRgLiAqQ3J1Y2lhbGx5KiwgdGhlIGNvZGUgdGhlbiBjYWxscyBgaXB1dChpbm9kZSlgLCBzZXRzIGBpbm9kZWAgdG8gYE5VTExgLCAqdGhlbioganVtcHMgdG8gdGhlIGBvdXRgIGxhYmVsIGlmIGByZXRgIGluZGljYXRlcyBhbiBlcnJvci4gVGhlIGtleSB0YWtlYXdheSBoZXJlIGlzIHRoYXQgYGlwdXQoaW5vZGUpYCBpcyBjYWxsZWQgKmJlZm9yZSogYGlub2RlYCBpcyBzZXQgdG8gYE5VTExgIHNvLCBpbiB0aGUgZmFpbHVyZSBjYXNlLCB0aGUgbmV4dCBleGVjdXRpb24gd2lsbCBiZSBgaXB1dChpbm9kZSlgIGFuZCAqdGhlbiogdGhlIGlub2RlIHdpbGwgYmUgc2V0IHRvIGBOVUxMYC4gVGhlIGNvZGUgdGhlbiBzZXRzIHRoZSBpbm9kZSB0byBgTlVMTGAgKmJlZm9yZSogdGhlIGBnb3RvIG91dDtgLiBTbywgYGlwdXQoTlVMTClgIG11c3QgYmUgaGFuZGxlZCBncmFjZWZ1bGx5IOKAkyBpdCdzIGxpa2VseSBhIG5vLW9wLCB3aGljaCBpcyBzdGFuZGFyZCBwcmFjdGljZS4gVGhlIGZ1bmN0aW9uIGlzIGRlc2lnbmVkIHRvIGhhbmRsZSB0aGUgY2FzZSB3aGVyZSBgZXh0NF9leHRfY2xlYXJfYmJgIHJldHVybnMgYW4gZXJyb3IsIGNsZWFuaW5nIHVwIHJlc291cmNlcyBiZWZvcmUgcmV0dXJuaW5nIHRoZSBlcnJvciBjb2RlIGByZXRgLlxuXG5TbywgdGhlIHJldHVybiBpcyBgcmV0YCwgd2hpY2ggc2VlbXMgbG9naWNhbC5cblxuQnV0LCBJJ20gbm90IGNsZWFyIG9uIHRoZSBvcmlnaW5hbCBidWcgdGhhdCBuZWNlc3NpdGF0ZWQgdGhpcyBwYXRjaC4gTGV0J3Mgc2VlIGlmIEkgY2FuIGZpbmQgbW9yZSBjb250ZXh0IHdpdGggYSBgZ2l0IGxvZ2Agc2VhcmNoIG9yIG1heWJlIGNoZWNrIGEgc3l6a2FsbGVyIGlzc3VlLiBLbm93aW5nIHRoZSBvcmlnaW5hbCBpc3N1ZSB3aWxsIHJlYWxseSBwdXQgdGhpcyBpbnRvIHBlcnNwZWN0aXZlLlxuXG5cbiIsIklucHV0VG9rZW5zIjo4MjI2LCJPdXRwdXRUb2tlbnMiOjIyLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTczLCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMTRUMTQ6NDU6NDEuMDEzNTE2MDUxWiIsIlNlcSI6NDEsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNzY3Mzk1NDg3LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImV4dDRfZXh0X2NsZWFyX2JiXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImZzL2V4dDQvZXh0NC5oPTM5NTc9ZXh0ZXJuIGludCBleHQ0X2V4dF9yZXBsYXlfdXBkYXRlX2V4KHN0cnVjdCBpbm9kZSAqaW5vZGUsIGV4dDRfbGJsa190IHN0YXJ0LFxcbmZzL2V4dDQvZXh0NC5oLTM5NTgtXFx0XFx0aW50IGxlbiwgaW50IHVud3JpdHRlbiwgZXh0NF9mc2Jsa190IHBibGspO1xcbmZzL2V4dDQvZXh0NC5oOjM5NTk6ZXh0ZXJuIGludCBleHQ0X2V4dF9jbGVhcl9iYihzdHJ1Y3QgaW5vZGUgKmlub2RlKTtcXG5mcy9leHQ0L2V4dDQuaC0zOTYwLVxcbi0tXFxuZnMvZXh0NC9leHRlbnRzLmM9NjI1Mj1pbnQgZXh0NF9leHRfcmVwbGF5X3NldF9pYmxvY2tzKHN0cnVjdCBpbm9kZSAqaW5vZGUpXFxuLS1cXG5mcy9leHQ0L2V4dGVudHMuYy02MzM4LVxcbmZzL2V4dDQvZXh0ZW50cy5jOjYzMzk6aW50IGV4dDRfZXh0X2NsZWFyX2JiKHN0cnVjdCBpbm9kZSAqaW5vZGUpXFxuZnMvZXh0NC9leHRlbnRzLmMtNjM0MC17XFxuLS1cXG5mcy9leHQ0L2Zhc3RfY29tbWl0LmM9MTkyNT1zdGF0aWMgaW50IGV4dDRfZmNfcmVwbGF5X2lub2RlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsXFxuLS1cXG5mcy9leHQ0L2Zhc3RfY29tbWl0LmMtMTk0My1cXHRpZiAoIUlTX0VSUihpbm9kZSkpIHtcXG5mcy9leHQ0L2Zhc3RfY29tbWl0LmM6MTk0NDpcXHRcXHRyZXQgPSBleHQ0X2V4dF9jbGVhcl9iYihpbm9kZSk7XFxuZnMvZXh0NC9mYXN0X2NvbW1pdC5jLTE5NDUtXFx0XFx0aXB1dChpbm9kZSk7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTE0VDE0OjQ1OjQyLjc4MDkxOTQ2OFoiLCJTZXEiOjQyLCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuOC1mbGFzaCIsIkR1cmF0aW9uIjo5NDc1OTQ2NzA0MywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipNeSBBc3Nlc3NtZW50IG9mIFRoaXMgRXJyb3IgSGFuZGxpbmcgUGF0Y2gqKlxuXG5Pa2F5LCBzbyBJJ3ZlIGJlZW4gcmV2aWV3aW5nIHRoaXMgcGF0Y2gsIGFuZCBoZXJlJ3MgbXkgdW5kZXJzdGFuZGluZzogaXQncyBhbGwgYWJvdXQgdGlnaHRlbmluZyB1cCBlcnJvciBoYW5kbGluZyB3aXRoaW4gdGhlIGV4dDQgZmlsZXN5c3RlbSwgc3BlY2lmaWNhbGx5IGluIHRoZSBmYXN0IGNvbW1pdCByZXBsYXkgbG9naWMuIFByZXZpb3VzbHksIGluIHRoZSBmdW5jdGlvbnMgYGV4dDRfZXh0X2NsZWFyX2JiYCBhbmQgaXRzIGNhbGxlciBgZXh0NF9mY19yZXBsYXlfaW5vZGVgLCBpZiBgZXh0NF9maW5kX2V4dGVudGAgZmFpbGVkLCBpdCBjb3VsZCBsZWFkIHRvIHNvbWUgcHJldHR5IG1lc3N5IGJlaGF2aW9yLiBXZSB3ZXJlIHNlZWluZyBgSVNfRVJSKHBhdGgpYCBjb21lIHVwLCBidXQgdGhlbiB0aGUgY29kZSB3YXMgYmxpbmRseSBzZXR0aW5nIGBwYXRoYCB0byBgTlVMTGAgYW5kIGNvbnRpbnVpbmcgb24sIHBvdGVudGlhbGx5IGNhbGxpbmcgb3RoZXIgZnVuY3Rpb25zIChgZXh0NF9tYl9tYXJrX2JiYCwgYGV4dDRfZmNfcmVjb3JkX3JlZ2lvbnNgKSBhbmQgY29tcGxldGVseSBpZ25vcmluZyBhbnkgZXJyb3JzIHRoYXQgdGhvc2UgZnVuY3Rpb25zIHRocmV3LiBUaGVuLCBpdCB3b3VsZCBqdXN0IHJldHVybiAwLCB3aGljaCBpcyB0b3RhbGx5IG1pc2xlYWRpbmcuXG5cblRoaXMgcGF0Y2gsIHRoYW5rZnVsbHksIHN0cmFpZ2h0ZW5zIGFsbCBvZiB0aGF0IG91dC4gTm93LCBlcnJvciBjb2RlcyBmcm9tIGBleHQ0X21hcF9ibG9ja3NgLCBgZXh0NF9maW5kX2V4dGVudGAsIGFuZCBgZXh0NF9mY19yZWNvcmRfcmVnaW9uc2AgYXJlIGNvcnJlY3RseSBwcm9wYWdhdGVkIGFuZCByZXR1cm5lZCB1cCB0aGUgY2FsbCBzdGFjay4gQ3JpdGljYWxseSwgYGV4dDRfZmNfcmVwbGF5X2lub2RlYCBub3cgYWJvcnRzIHRoZSByZXBsYXkgcHJvY2VzcyBpZiAqYW55KiBvZiB0aGVzZSBmdW5jdGlvbnMgZmFpbC5cblxuTm93LCB0aGUgaW1wb3J0YW50IHF1ZXN0aW9uOiBkb2VzIHRoaXMgcmVxdWlyZSBLTVNBTj8gQWZ0ZXIgYSB0aG9yb3VnaCBsb29rLCBJJ20gY29uZmlkZW50IHRoZSBhbnN3ZXIgaXMgbm8uIFRoZXJlIGFyZSBubyB1bmluaXRpYWxpemVkIG1lbW9yeSBpc3N1ZXMgaGVyZS4gTm90aGluZyBpcyBjb3BpZWQgdG8gdXNlciBzcGFjZSwgbm8gbmV3IHVuaW5pdGlhbGl6ZWQgdmFyaWFibGVzIGFyZSBiZWluZyBhY2Nlc3NlZCBvciByZWFkLCBgcmV0YCBpcyBpbml0aWFsaXplZCBiZWZvcmUgYmVpbmcgdXNlZCwgYW5kIGBwYXRoYCBpcyBwcm9wZXJseSBjaGVja2VkIGZvciBlcnJvcnMuIFRoZXJlJ3Mgbm8gcmlzayBvZiBtZW1vcnkgbGVha3Mgb3IgaW5mb3JtYXRpb24gbGVha3MuIFRoaXMgaXMgcHVyZWx5IGVycm9yIHByb3BhZ2F0aW9uIHdpdGhpbiB0aGUgZXh0NCBmYXN0IGNvbW1pdCByZXBsYXkgbG9naWMuXG5cblRoZXJlZm9yZSwgS01TQU4gaXNuJ3QgbmVjZXNzYXJ5LiBTdGFuZGFyZCBLQVNBTiBhbmQgc3RhbmRhcmQgZXJyb3IgdGVzdGluZyBzaG91bGQgYmUgc3VmZmljaWVudCBmb3IgZW5zdXJpbmcgdGhpcyBjaGFuZ2UgaXMgc291bmQuXG5cbkFscmlnaHQsIGxldCdzIGRvdWJsZSBjaGVjayBldmVyeXRoaW5nIGFuZCBmb3JtYWxpemUgdGhlIHJlc3BvbnNlOlxuXG4qICAgYE5lZWRzS01TQU5gOiBmYWxzZS5cbiogICBgS01TQU5SZWFzb25pbmdgOiBUaGUgcGF0Y2ggaW1wcm92ZXMgZXJyb3IgaGFuZGxpbmcgYW5kIHByb3BhZ2F0aW9uIGluIGBleHQ0X2V4dF9jbGVhcl9iYigpYCBhbmQgaXRzIGNhbGxlciBgZXh0NF9mY19yZXBsYXlfaW5vZGUoKWAuIEtNU0FOIGlzIG5vdCBhcHBsaWNhYmxlIGJlY2F1c2UgdGhlIHBhdGNoIGRvZXNuJ3QgaW50cm9kdWNlIGFueSB1bmluaXRpYWxpemVkIHZhcmlhYmxlcywgcGFkZGluZyBpc3N1ZXMsIG9yIGNvcHkgYW55IGRhdGEgdG8gdXNlcnNwYWNlLCBvciBicmFuY2ggb24gdW5pbml0aWFsaXplZCBkYXRhLiBTdGFuZGFyZCBLQVNBTiBhbmQgZXJyb3IgZGV0ZWN0b3JzIGFyZSBzdWZmaWNpZW50LlxuXG5SZWFkeSB0byBjYWxsIGBzZXQtcmVzdWx0c2AuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjkyMjIsIk91dHB1dFRva2VucyI6MjI2LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MzkzLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTE0VDE0OjQ3OjE3LjU0MDM4OTM2MVoiLCJTZXEiOjQzLCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJzZXQtcmVzdWx0cyIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE1NjIwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggaW1wcm92ZXMgZXJyb3IgaGFuZGxpbmcgaW4gZXh0NCBmYXN0IGNvbW1pdCByZXBsYXkgY29kZSAoZnMvZXh0NC9leHRlbnRzLmMgYW5kIGZzL2V4dDQvZmFzdF9jb21taXQuYykuIFNwZWNpZmljYWxseSwgZXh0NF9leHRfY2xlYXJfYmIoKSBub3cgcHJvcGVybHkgcHJvcGFnYXRlcyBlcnJvciByZXR1cm4gY29kZXMgZnJvbSBleHQ0X21hcF9ibG9ja3MoKSwgZXh0NF9maW5kX2V4dGVudCgpLCBhbmQgZXh0NF9mY19yZWNvcmRfcmVnaW9ucygpLCByYXRoZXIgdGhhbiBpZ25vcmluZyBlcnJvcnMgYW5kIHVuY29uZGl0aW9uYWxseSByZXR1cm5pbmcgMC4gQWRkaXRpb25hbGx5LCBleHQ0X2ZjX3JlcGxheV9pbm9kZSgpIG5vdyBjaGVja3MgdGhlIHJldHVybiB2YWx1ZSBvZiBleHQ0X2V4dF9jbGVhcl9iYigpIGFuZCBhYm9ydHMgb24gZXJyb3IuXFxuXFxuVGhlcmUgYXJlIG5vIHVuaW5pdGlhbGl6ZWQgdmFyaWFibGVzIG9yIHN0cnVjdCBmaWVsZHMgaW50cm9kdWNlZCBvciBtb2RpZmllZCwgbm8gY29waWVzIHRvIHVzZXIgc3BhY2Ugb3IgcG90ZW50aWFsIGluZm8tbGVha3MsIGFuZCBubyBicmFuY2hpbmcgb24gdW5pbml0aWFsaXplZCBtZW1vcnkuIEFsbCB2YXJpYWJsZXMgaW52b2x2ZWQgKGUuZy4gcmV0LCBwYXRoKSBhcmUgcHJvcGVybHkgaW5pdGlhbGl6ZWQgYmVmb3JlIHVzZS4gQ29uc2VxdWVudGx5LCB0aGlzIGNoYW5nZSBkb2VzIG5vdCBleHBvc2UgYW55IHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJpc2tzIGRldGVjdGFibGUgYnkgS01TQU4uIFN0YW5kYXJkIEtBU0FOIGZ1enppbmcgYW5kIHRlc3Qgc3VpdGVzIGFyZSBmdWxseSBhZGVxdWF0ZS5cIixcbiAgXCJOZWVkc0tNU0FOXCI6IGZhbHNlXG59IiwiUmVzdWx0cyI6IntcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBpbXByb3ZlcyBlcnJvciBoYW5kbGluZyBpbiBleHQ0IGZhc3QgY29tbWl0IHJlcGxheSBjb2RlIChmcy9leHQ0L2V4dGVudHMuYyBhbmQgZnMvZXh0NC9mYXN0X2NvbW1pdC5jKS4gU3BlY2lmaWNhbGx5LCBleHQ0X2V4dF9jbGVhcl9iYigpIG5vdyBwcm9wZXJseSBwcm9wYWdhdGVzIGVycm9yIHJldHVybiBjb2RlcyBmcm9tIGV4dDRfbWFwX2Jsb2NrcygpLCBleHQ0X2ZpbmRfZXh0ZW50KCksIGFuZCBleHQ0X2ZjX3JlY29yZF9yZWdpb25zKCksIHJhdGhlciB0aGFuIGlnbm9yaW5nIGVycm9ycyBhbmQgdW5jb25kaXRpb25hbGx5IHJldHVybmluZyAwLiBBZGRpdGlvbmFsbHksIGV4dDRfZmNfcmVwbGF5X2lub2RlKCkgbm93IGNoZWNrcyB0aGUgcmV0dXJuIHZhbHVlIG9mIGV4dDRfZXh0X2NsZWFyX2JiKCkgYW5kIGFib3J0cyBvbiBlcnJvci5cXG5cXG5UaGVyZSBhcmUgbm8gdW5pbml0aWFsaXplZCB2YXJpYWJsZXMgb3Igc3RydWN0IGZpZWxkcyBpbnRyb2R1Y2VkIG9yIG1vZGlmaWVkLCBubyBjb3BpZXMgdG8gdXNlciBzcGFjZSBvciBwb3RlbnRpYWwgaW5mby1sZWFrcywgYW5kIG5vIGJyYW5jaGluZyBvbiB1bmluaXRpYWxpemVkIG1lbW9yeS4gQWxsIHZhcmlhYmxlcyBpbnZvbHZlZCAoZS5nLiByZXQsIHBhdGgpIGFyZSBwcm9wZXJseSBpbml0aWFsaXplZCBiZWZvcmUgdXNlLiBDb25zZXF1ZW50bHksIHRoaXMgY2hhbmdlIGRvZXMgbm90IGV4cG9zZSBhbnkgdW5pbml0aWFsaXplZCBtZW1vcnkgcmlza3MgZGV0ZWN0YWJsZSBieSBLTVNBTi4gU3RhbmRhcmQgS0FTQU4gZnV6emluZyBhbmQgdGVzdCBzdWl0ZXMgYXJlIGZ1bGx5IGFkZXF1YXRlLlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2Vcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfV07CgkJCWlmICghcmF3RGF0YSB8fCByYXdEYXRhLmxlbmd0aCA9PT0gMCkgcmV0dXJuOwoKCQkJZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSk7CgkJCWRyYXdEdXJhdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCQlkcmF3VG9rZW5Db25zdW1wdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSkgewoJCQljb25zdCBzdGF0cyA9IHsKCQkJCWxsbTogeyBjb3VudDogMCwgdG9rZW5zOiAwLCBkdXJhdGlvbjogMCB9LAoJCQkJdG9vbDogeyBjb3VudDogMCwgZHVyYXRpb246IDAgfQoJCQl9OwoKCQkJcmF3RGF0YS5mb3JFYWNoKHMgPT4gewoJCQkJY29uc3QgZHVyID0gcy5EdXJhdGlvbiAvIDEwMDAwMDAwMDA7IAoJCQkJaWYgKHMuVHlwZSA9PT0gImxsbSIpIHsKCQkJCQlzdGF0cy5sbG0uY291bnQrKzsKCQkJCQlzdGF0cy5sbG0udG9rZW5zICs9IChzLklucHV0VG9rZW5zICsgcy5PdXRwdXRUb2tlbnMgKyBzLk91dHB1dFRob3VnaHRzVG9rZW5zKTsKCQkJCQlzdGF0cy5sbG0uZHVyYXRpb24gKz0gZHVyOwoJCQkJfSBlbHNlIGlmIChzLlR5cGUgPT09ICJ0b29sIikgewoJCQkJCXN0YXRzLnRvb2wuY291bnQrKzsKCQkJCQlzdGF0cy50b29sLmR1cmF0aW9uICs9IGR1cjsKCQkJCX0KCQkJfSk7CgoJCQljb25zdCBhdmdMbG1EdXIgPSBzdGF0cy5sbG0uY291bnQgPiAwID8gKHN0YXRzLmxsbS5kdXJhdGlvbiAvIHN0YXRzLmxsbS5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgkJCWNvbnN0IGF2Z0xsbVRva2VuID0gc3RhdHMubGxtLmNvdW50ID4gMCA/IChzdGF0cy5sbG0udG9rZW5zIC8gc3RhdHMubGxtLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCQkJY29uc3QgYXZnVG9vbER1ciA9IHN0YXRzLnRvb2wuY291bnQgPiAwID8gKHN0YXRzLnRvb2wuZHVyYXRpb24gLyBzdGF0cy50b29sLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCgkJCWNvbnN0IGxsbVN1bWFyeUNlbGxzID0gW3N0YXRzLmxsbS5jb3VudCwgc3RhdHMubGxtLnRva2VucywgYXZnTGxtVG9rZW4sIHN0YXRzLmxsbS5kdXJhdGlvbiwgYXZnTGxtRHVyXTsKCQkJY29uc3QgdG9vbFN1bW1hcnlDZWxscyA9IFtzdGF0cy50b29sLmNvdW50LCBzdGF0cy50b29sLmR1cmF0aW9uLCBhdmdUb29sRHVyXTsKCgkJCWNvbnN0IGxsbVN1bW1hcnlCb2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xsbV9zdW1tYXJ5X3N0YXRzX2JvZHknKTsKCQkJbGxtU3VtbWFyeUJvZHkuaW5uZXJIVE1MID0gIiI7CgkJCWNvbnN0IGxsbVRyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndHInKTsKCQkJbGxtU3VtYXJ5Q2VsbHMuZm9yRWFjaChjZWxsID0+IHsKCQkJCWNvbnN0IHRkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTsKCQkJCXRkLnRleHRDb250ZW50ID0gY2VsbDsKCQkJCWxsbVRyLmFwcGVuZENoaWxkKHRkKTsKCQkJfSk7CgkJCWxsbVN1bW1hcnlCb2R5LmFwcGVuZENoaWxkKGxsbVRyKTsKCgkJCWNvbnN0IHRvb2xTdW1tYXJ5Qm9keSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b29sX3N1bW1hcnlfc3RhdHNfYm9keScpOwoJCQl0b29sU3VtbWFyeUJvZHkuaW5uZXJIVE1MID0gIiI7CgkJCWNvbnN0IHRvb2xUciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RyJyk7CgkJCXRvb2xTdW1tYXJ5Q2VsbHMuZm9yRWFjaChjZWxsID0+IHsKCQkJCWNvbnN0IHRkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTsKCQkJCXRkLnRleHRDb250ZW50ID0gY2VsbDsKCQkJCXRvb2xUci5hcHBlbmRDaGlsZCh0ZCk7CgkJCX0pOwoJCQl0b29sU3VtbWFyeUJvZHkuYXBwZW5kQ2hpbGQodG9vbFRyKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdEdXJhdGlvbkNoYXJ0KHJhd0RhdGEpIHsKCQkJY29uc3QgZmlsdGVyZWRTdGVwcyA9IHJhd0RhdGEuZmlsdGVyKGQgPT4gWyJsbG0iLCAidG9vbCJdLmluY2x1ZGVzKGQuVHlwZSkpOwoJCQljb25zdCBkYXRhID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkRhdGFUYWJsZSgpOwoJCQlkYXRhLmFkZENvbHVtbignc3RyaW5nJywgJ1N0ZXAnKTsKCQkJZGF0YS5hZGRDb2x1bW4oJ251bWJlcicsICdEdXJhdGlvbicpOwoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICd0b29sdGlwJ30pOyAKCgkJCWZpbHRlcmVkU3RlcHMuZm9yRWFjaChzID0+IHsKCQkJCQoJCQkJY29uc3QgZHVyID0gcy5EdXJhdGlvbiAvIDEwMDAwMDAwMDA7CgkJCQlsZXQgdG9vbHRpcCA9IHMuTmFtZTsKCQkJCWlmIChzLlR5cGUgPT09ICJsbG0iICYmIHMuVG9vbENhbGxzICYmIHMuVG9vbENhbGxzLmxlbmd0aCA+IDApIHsKCQkJCQl0b29sdGlwICs9IGBcblRvb2xzOiAke3MuVG9vbENhbGxzLmpvaW4oJywgJyl9YDsKCQkJCX0KCQkJCWRhdGEuYWRkUm93KFtgJHtzLlNlcX1gLCBkdXIsIHRvb2x0aXBdKTsKCQkJfSk7CgoJCQljb25zdCBvcHRpb25zID0gewoJCQkJdGl0bGU6ICdUaW1lIENvbnN1bXB0aW9uIG9mIExMTS9Ub29sIENhbGxzJywKCQkJCWhBeGlzOiB7CgkJCQkJdGl0bGU6ICdMTE0vVG9vbCBTdGVwcycsCgkJCQl9LAoJCQkJdkF4aXM6IHsgdGl0bGU6ICdTZWNvbmRzJyB9LAoJCQkJbGVnZW5kOiB7IHBvc2l0aW9uOiAnbm9uZScgfSwKCQkJCWJhcjogeyBncm91cFdpZHRoOiAnNzUlJyB9LAoJCQkJY2hhcnRBcmVhOiB7IHdpZHRoOiAnODUlJywgaGVpZ2h0OiAnNzAlJyB9LAoJCQkJaGVpZ2h0OiA0MDAKCQkJfTsKCgkJCWNvbnN0IGNoYXJ0ID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkNvbHVtbkNoYXJ0KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkdXJhdGlvbl9jaGFydF9kaXYnKSk7CgkJCWNoYXJ0LmRyYXcoZGF0YSwgb3B0aW9ucyk7CgkJfQoKCQlmdW5jdGlvbiBkcmF3VG9rZW5Db25zdW1wdGlvbkNoYXJ0KHJhd0RhdGEpIHsKCQkJY29uc3QgbGxtU3RlcHMgPSByYXdEYXRhLmZpbHRlcihkID0+IGQuVHlwZSA9PT0gImxsbSIpOwoJCQlpZiAobGxtU3RlcHMubGVuZ3RoID09PSAwKSByZXR1cm47CgoJCQljb25zdCBkYXRhID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkRhdGFUYWJsZSgpOwoJCQlkYXRhLmFkZENvbHVtbignc3RyaW5nJywgJ1N0ZXAnKTsJCQkKCQkJZGF0YS5hZGRDb2x1bW4oJ251bWJlcicsICdUb2tlbnMnKTsJCQkKCQkJZGF0YS5hZGRDb2x1bW4oe3R5cGU6ICdzdHJpbmcnLCByb2xlOiAnc3R5bGUnfSk7CQoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICd0b29sdGlwJ30pOwkKCgkJCWNvbnN0IGFnZW50Q29sb3JzID0ge307CgkJCWNvbnN0IHBhbGV0dGUgPSBbJyM0Mjg1RjQnLCAnI0RCNDQzNycsICcjRjRCNDAwJywgJyMwRjlENTgnLCAnI0FCNDdCQycsICcjMDBBQ0MxJ107CgkJCWxldCBjb2xvcklkeCA9IDA7CgkJCWNvbnN0IGFnZW50TExNQ291bnRzID0ge307CgkJCWxsbVN0ZXBzLmZvckVhY2gocyA9PiB7CgkJCQlpZiAoIWFnZW50Q29sb3JzW3MuTmFtZV0pIHsKCQkJCQlhZ2VudENvbG9yc1tzLk5hbWVdID0gcGFsZXR0ZVtjb2xvcklkeCAlIHBhbGV0dGUubGVuZ3RoXTsKCQkJCQljb2xvcklkeCsrOwoJCQkJfQoKCQkJCWFnZW50TExNQ291bnRzW3MuTmFtZV0gPSAoYWdlbnRMTE1Db3VudHNbcy5OYW1lXSB8fCAwKSArIDE7CgkJCQljb25zdCBsYWJlbCA9IGAke3MuTmFtZX0tJHthZ2VudExMTUNvdW50c1tzLk5hbWVdfWA7CgkJCQljb25zdCB0b3RhbFRva2VucyA9IHMuSW5wdXRUb2tlbnMgKyBzLk91dHB1dFRva2VucyArIHMuT3V0cHV0VGhvdWdodHNUb2tlbnM7CgkJCQljb25zdCBzdHlsZSA9IGBjb2xvcjogJHthZ2VudENvbG9yc1tzLk5hbWVdfWA7CgkJCQlsZXQgdG9vbHRpcCA9IGBUb3RhbCBUb2tlbnM6ICR7dG90YWxUb2tlbnN9XG4oSW46ICR7cy5JbnB1dFRva2Vuc30sIE91dDogJHtzLk91dHB1dFRva2Vuc30sIFRob3VnaHRzOiAke3MuT3V0cHV0VGhvdWdodHNUb2tlbnN9KWA7CgkJCQlpZiAocy5Ub29sQ2FsbHMgJiYgcy5Ub29sQ2FsbHMubGVuZ3RoID4gMCkgewoJCQkJCXRvb2x0aXAgKz0gYFxuVG9vbHM6ICR7cy5Ub29sQ2FsbHMuam9pbignLCAnKX1gOwoJCQkJfQoKCQkJCWRhdGEuYWRkUm93KFtsYWJlbCwgdG90YWxUb2tlbnMsIHN0eWxlLCB0b29sdGlwXSk7CgkJCX0pOwoKCQkJY29uc3Qgb3B0aW9ucyA9IHsKCQkJCXRpdGxlOiAnVG9rZW4gQ29uc3VtcHRpb24gYnkgTExNIENhbGxzJywKCQkJCWhBeGlzOiB7CgkJCQkJdGl0bGU6ICdMTE0gQ2FsbCBTZXF1ZW5jZScsCgkJCQl9LAoJCQkJdkF4aXM6IHsgdGl0bGU6ICdDb25zdW1lZCBUb2tlbnMnIH0sCgkJCQlsZWdlbmQ6IHsgcG9zaXRpb246ICdub25lJyB9LAoJCQkJYmFyOiB7IGdyb3VwV2lkdGg6ICc3NSUnIH0sCgkJCQljaGFydEFyZWE6IHsgd2lkdGg6ICc4NSUnLCBoZWlnaHQ6ICc3MCUnIH0sCgkJCQloZWlnaHQ6IDQwMAoJCQl9OwoKCQkJY29uc3QgY2hhcnQgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uQ29sdW1uQ2hhcnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rva2VuX2NoYXJ0X2RpdicpKTsKCQkJY2hhcnQuZHJhdyhkYXRhLCBvcHRpb25zKTsKCQl9CgkJbGV0IGFsbEV4cGFuZGVkID0gZmFsc2U7CgkJZnVuY3Rpb24gdG9nZ2xlQWxsRGV0YWlscygpIHsKCQkJYWxsRXhwYW5kZWQgPSAhYWxsRXhwYW5kZWQ7CgkJCWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2RldGFpbHMnKS5mb3JFYWNoKGQgPT4gewoJCQkJaWYgKGFsbEV4cGFuZGVkKSBkLnNldEF0dHJpYnV0ZSgnb3BlbicsICcnKTsKCQkJCWVsc2UgZC5yZW1vdmVBdHRyaWJ1dGUoJ29wZW4nKTsKCQkJfSk7CgkJfQoJPC9zY3JpcHQ+CgoKPC9ib2R5Pgo8L2h0bWw+Cg==" },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:nil,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,} --------- Name: series-workflow5g9lk[0].run-triage(0) Phase: Succeeded StartedAt: 2026-09-14 13:46:03 +0000 UTC FinishedAt: 2026-09-14 14:47:18 +0000 UTC Input: nil Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "skip_reason": "", "targets": [ { "base": { "arch": "amd64", "tree_name": "linux-next", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next", "commit_hash": "68142f986ff04b2b70b31db00f719bf690f64a9a", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "EXT4_FS" ], "series_id": "" }, "patched": { "arch": "amd64", "tree_name": "linux-next", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next", "commit_hash": "68142f986ff04b2b70b31db00f719bf690f64a9a", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "EXT4_FS" ], "series_id": "473faa75-ef75-448c-ba20-22fab9b37077" }, "track": "KASAN", "fuzz": { "focus": [ "fs" ], "focus_symbols": [ "ext4_ext_clear_bb", "ext4_fc_replay_inode", "ext4_fc_replay" ], "corpus_urls": [ "https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db" ], "skip_cover_check": false, "bug_title_re": "", "base_commit": "68142f986ff04b2b70b31db00f719bf690f64a9a", "base_tree": "linux-next" }, "retest": null } ], "trajectory": "CjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KPGhlYWQ+Cgk8dGl0bGU+QUkgVHJhamVjdG9yeTwvdGl0bGU+Cgk8c3R5bGU+CgkJdGFibGUgewoJCQlib3JkZXI6IDFweCBzb2xpZCAjY2NjOwoJCQltYXJnaW46IDIwcHggNXB4OwoJCQlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwoJCQl3aGl0ZS1zcGFjZTogbm93cmFwOwoJCQl0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKCQkJb3ZlcmZsb3c6IGhpZGRlbjsKCQl9CgoJCXRhYmxlIGNhcHRpb24gewoJCQlmb250LXdlaWdodDogYm9sZDsKCQl9CgoJCXRhYmxlIHRkLCB0YWJsZSB0aCB7CgkJCXZlcnRpY2FsLWFsaWduOiB0b3A7CgkJCXBhZGRpbmc6IDJweCA4cHg7CgkJCXRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwoJCQlvdmVyZmxvdzogaGlkZGVuOwoJCX0KCgkJLmxpc3RfdGFibGUgdGQsIC5saXN0X3RhYmxlIHRoIHsKCQkJYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjY2NjOwoJCX0KCgkJLmxpc3RfdGFibGUgdGggewoJCQliYWNrZ3JvdW5kOiAjRjRGNEY0OwoJCX0KCgkJLmxpc3RfdGFibGUgdHI6bnRoLWNoaWxkKDJuKSB7CgkJCWJhY2tncm91bmQ6ICNGNEY0RjQ7CgkJfQoKCQkubGlzdF90YWJsZSB0cjpob3ZlciB7CgkJCWJhY2tncm91bmQ6ICNmZmZmOTk7CgkJfQoKCQkjYWlfZGV0YWlsc19kaXYgcHJlIHsKCQkJbWFyZ2luOiAxcHg7CgkJCW1heC13aWR0aDogMTIwY2g7CgkJCXdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKCQkJb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKCQl9Cgk8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PgoJPGgxPkFJIFRyYWplY3Rvcnk8L2gxPgoJPGJyPgoKCQoJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQk8Y2FwdGlvbj5UcmFqZWN0b3J5OiAoPGEgaHJlZj0iIyIgb25jbGljaz0idG9nZ2xlQWxsRGV0YWlscygpOyByZXR1cm4gZmFsc2U7Ij5FeHBhbmQvQ29sbGFwc2UgQWxsPC9hPik8L2NhcHRpb24+CgkJPHRoZWFkPjx0cj4KCQkJPHRoPlNlcTwvdGg+CgkJCTx0aD5UaW1lc3RhbXA8L3RoPgoJCQk8dGg+VHlwZTwvdGg+CgkJCTx0aD5OYW1lPC90aD4KCQkJPHRoPkR1cmF0aW9uPC90aD4KCQk8L3RyPjwvdGhlYWQ+CgkJPHRib2R5PgoJCQoJCTx0cj4KCQkJPHRkPjAvMDwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE0IDE0OjM2PC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MTFtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtFWFQ0X0ZTJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7ZXh0NF9leHRfY2xlYXJfYmImIzM0OywKICAgICYjMzQ7ZXh0NF9mY19yZXBsYXlfaW5vZGUmIzM0OywKICAgICYjMzQ7ZXh0NF9mY19yZXBsYXkmIzM0OwogIF0sCiAgJiMzNDtLTVNBTlJlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBpbXByb3ZlcyBlcnJvciBoYW5kbGluZyBpbiBleHQ0IGZhc3QgY29tbWl0IHJlcGxheSBjb2RlIChmcy9leHQ0L2V4dGVudHMuYyBhbmQgZnMvZXh0NC9mYXN0X2NvbW1pdC5jKS4gU3BlY2lmaWNhbGx5LCBleHQ0X2V4dF9jbGVhcl9iYigpIG5vdyBwcm9wZXJseSBwcm9wYWdhdGVzIGVycm9yIHJldHVybiBjb2RlcyBmcm9tIGV4dDRfbWFwX2Jsb2NrcygpLCBleHQ0X2ZpbmRfZXh0ZW50KCksIGFuZCBleHQ0X2ZjX3JlY29yZF9yZWdpb25zKCksIHJhdGhlciB0aGFuIGlnbm9yaW5nIGVycm9ycyBhbmQgdW5jb25kaXRpb25hbGx5IHJldHVybmluZyAwLiBBZGRpdGlvbmFsbHksIGV4dDRfZmNfcmVwbGF5X2lub2RlKCkgbm93IGNoZWNrcyB0aGUgcmV0dXJuIHZhbHVlIG9mIGV4dDRfZXh0X2NsZWFyX2JiKCkgYW5kIGFib3J0cyBvbiBlcnJvci5cblxuVGhlcmUgYXJlIG5vIHVuaW5pdGlhbGl6ZWQgdmFyaWFibGVzIG9yIHN0cnVjdCBmaWVsZHMgaW50cm9kdWNlZCBvciBtb2RpZmllZCwgbm8gY29waWVzIHRvIHVzZXIgc3BhY2Ugb3IgcG90ZW50aWFsIGluZm8tbGVha3MsIGFuZCBubyBicmFuY2hpbmcgb24gdW5pbml0aWFsaXplZCBtZW1vcnkuIEFsbCB2YXJpYWJsZXMgaW52b2x2ZWQgKGUuZy4gcmV0LCBwYXRoKSBhcmUgcHJvcGVybHkgaW5pdGlhbGl6ZWQgYmVmb3JlIHVzZS4gQ29uc2VxdWVudGx5LCB0aGlzIGNoYW5nZSBkb2VzIG5vdCBleHBvc2UgYW55IHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJpc2tzIGRldGVjdGFibGUgYnkgS01TQU4uIFN0YW5kYXJkIEtBU0FOIGZ1enppbmcgYW5kIHRlc3Qgc3VpdGVzIGFyZSBmdWxseSBhZGVxdWF0ZS4mIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UsCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggbW9kaWZpZXMgZXJyb3IgaGFuZGxpbmcgYW5kIGNvbnRyb2wgZmxvdyBpbiBleHQ0IGZhc3QgY29tbWl0IHJlcGxheSBsb2dpYy4gSW4gZXh0NF9leHRfY2xlYXJfYmIoKSwgZXJyb3JzIGZyb20gZXh0NF9tYXBfYmxvY2tzKCksIGV4dDRfZmluZF9leHRlbnQoKSwgYW5kIGV4dDRfZmNfcmVjb3JkX3JlZ2lvbnMoKSBhcmUgbm93IHByb3Blcmx5IGNhcHR1cmVkIGFuZCByZXR1cm5lZCBpbnN0ZWFkIG9mIGJlaW5nIGlnbm9yZWQuIEFkZGl0aW9uYWxseSwgZXh0NF9mY19yZXBsYXlfaW5vZGUoKSBub3cgY2hlY2tzIHRoZSByZXR1cm4gdmFsdWUgb2YgZXh0NF9leHRfY2xlYXJfYmIoKSBhbmQgYWJvcnRzIHJlcGxheSBvbiBlcnJvci4gVGhpcyByZWFjaGFibGUgZmlsZXN5c3RlbSByZWNvdmVyeSBwYXRoIHNob3VsZCBiZSBmdXp6ZWQgdG8gdmVyaWZ5IHRoYXQgZXJyb3IgY29uZGl0aW9ucyBhbmQgcGF0aCBjbGVhbnVwIGJlaGF2ZSBjb3JyZWN0bHkgd2l0aG91dCBsZWFrcyBvciB1bmV4cGVjdGVkIHBhbmljcy4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xLzE8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xNCAxNDozNjwvdGQ+CgkJCTx0ZD5hY3Rpb248L3RkPgoJCQk8dGQ+cmVhZC1wYXRjaC1kaWZmPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7UGF0Y2hEaWZmJiMzNDs6ICYjMzQ7Y29tbWl0IDMxM2Y1NTIzZjM3MGRkYzk2NGE0NTA1M2YwMDYwYzRmNGY4ZmNmMjhcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgTW9uIFNlcCAxNCAxNDozNjowNCAyMDI2ICYjNDM7MDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS9mcy9leHQ0L2V4dGVudHMuYyBiL2ZzL2V4dDQvZXh0ZW50cy5jXG5pbmRleCA3NjAzOGI2YzM2NTUyLi5mNjVkMjU0YzBkNWVlIDEwMDY0NFxuLS0tIGEvZnMvZXh0NC9leHRlbnRzLmNcbiYjNDM7JiM0MzsmIzQzOyBiL2ZzL2V4dDQvZXh0ZW50cy5jXG5AQCAtNjM2MywyOSAmIzQzOzYzNjMsMzQgQEAgaW50IGV4dDRfZXh0X2NsZWFyX2JiKHN0cnVjdCBpbm9kZSAqaW5vZGUpXG4gXHRcdG1hcC5tX2xlbiA9IGVuZCAtIGN1cjtcbiBcdFx0cmV0ID0gZXh0NF9tYXBfYmxvY2tzKE5VTEwsIGlub2RlLCBcdTAwMjZtYXAsIDApO1xuIFx0XHRpZiAocmV0IFx1MDAzYyAwKVxuLVx0XHRcdGJyZWFrO1xuJiM0MztcdFx0XHRnb3RvIG91dDtcbiBcdFx0aWYgKHJldCBcdTAwM2UgMCkge1xuIFx0XHRcdHBhdGggPSBleHQ0X2ZpbmRfZXh0ZW50KGlub2RlLCBtYXAubV9sYmxrLCBwYXRoLCAwKTtcbi1cdFx0XHRpZiAoIUlTX0VSUihwYXRoKSkge1xuLVx0XHRcdFx0Zm9yIChqID0gMDsgaiBcdTAwM2MgcGF0aC1cdTAwM2VwX2RlcHRoOyBqJiM0MzsmIzQzOykge1xuLVx0XHRcdFx0XHRleHQ0X21iX21hcmtfYmIoaW5vZGUtXHUwMDNlaV9zYixcbi1cdFx0XHRcdFx0XHRcdHBhdGhbal0ucF9ibG9jaywgMSwgZmFsc2UpO1xuLVx0XHRcdFx0XHRleHQ0X2ZjX3JlY29yZF9yZWdpb25zKGlub2RlLVx1MDAzZWlfc2IsIGlub2RlLVx1MDAzZWlfaW5vLFxuLVx0XHRcdFx0XHRcdFx0MCwgcGF0aFtqXS5wX2Jsb2NrLCAxLCAxKTtcbi1cdFx0XHRcdH1cbi1cdFx0XHR9IGVsc2Uge1xuLVx0XHRcdFx0cGF0aCA9IE5VTEw7XG4mIzQzO1x0XHRcdGlmIChJU19FUlIocGF0aCkpIHtcbiYjNDM7XHRcdFx0XHRyZXQgPSBQVFJfRVJSKHBhdGgpO1xuJiM0MztcdFx0XHRcdGdvdG8gb3V0O1xuJiM0MztcdFx0XHR9XG4mIzQzO1x0XHRcdGZvciAoaiA9IDA7IGogXHUwMDNjIHBhdGgtXHUwMDNlcF9kZXB0aDsgaiYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdFx0XHRleHQ0X21iX21hcmtfYmIoaW5vZGUtXHUwMDNlaV9zYixcbiYjNDM7XHRcdFx0XHRcdFx0cGF0aFtqXS5wX2Jsb2NrLCAxLCBmYWxzZSk7XG4mIzQzO1x0XHRcdFx0cmV0ID0gZXh0NF9mY19yZWNvcmRfcmVnaW9ucyhpbm9kZS1cdTAwM2VpX3NiLFxuJiM0MztcdFx0XHRcdFx0XHRcdCAgICAgaW5vZGUtXHUwMDNlaV9pbm8sIDAsXG4mIzQzO1x0XHRcdFx0XHRcdFx0ICAgICBwYXRoW2pdLnBfYmxvY2ssIDEsIDEpO1xuJiM0MztcdFx0XHRcdGlmIChyZXQpXG4mIzQzO1x0XHRcdFx0XHRnb3RvIG91dDtcbiBcdFx0XHR9XG4gXHRcdFx0ZXh0NF9tYl9tYXJrX2JiKGlub2RlLVx1MDAzZWlfc2IsIG1hcC5tX3BibGssIG1hcC5tX2xlbiwgZmFsc2UpO1xuLVx0XHRcdGV4dDRfZmNfcmVjb3JkX3JlZ2lvbnMoaW5vZGUtXHUwMDNlaV9zYiwgaW5vZGUtXHUwMDNlaV9pbm8sXG4tXHRcdFx0XHRcdG1hcC5tX2xibGssIG1hcC5tX3BibGssIG1hcC5tX2xlbiwgMSk7XG4mIzQzO1x0XHRcdHJldCA9IGV4dDRfZmNfcmVjb3JkX3JlZ2lvbnMoaW5vZGUtXHUwMDNlaV9zYiwgaW5vZGUtXHUwMDNlaV9pbm8sXG4mIzQzO1x0XHRcdFx0XHRcdCAgICAgbWFwLm1fbGJsaywgbWFwLm1fcGJsaywgbWFwLm1fbGVuLCAxKTtcbiYjNDM7XHRcdFx0aWYgKHJldClcbiYjNDM7XHRcdFx0XHRnb3RvIG91dDtcbiBcdFx0fVxuIFx0XHRjdXIgPSBjdXIgJiM0MzsgbWFwLm1fbGVuO1xuIFx0fVxuIFxuIG91dDpcbiBcdGV4dDRfZnJlZV9leHRfcGF0aChwYXRoKTtcbi1cdHJldHVybiAwO1xuJiM0MztcdHJldHVybiByZXQgXHUwMDNjIDAgPyByZXQgOiAwO1xuIH1cbiBcbiAjaWYgSVNfRU5BQkxFRChDT05GSUdfRVhUNF9LVU5JVF9URVNUUylcbmRpZmYgLS1naXQgYS9mcy9leHQ0L2Zhc3RfY29tbWl0LmMgYi9mcy9leHQ0L2Zhc3RfY29tbWl0LmNcbmluZGV4IDBjYWM4OTBjZjM3MDIuLmFiNzI2M2I0ZjllNDYgMTAwNjQ0XG4tLS0gYS9mcy9leHQ0L2Zhc3RfY29tbWl0LmNcbiYjNDM7JiM0MzsmIzQzOyBiL2ZzL2V4dDQvZmFzdF9jb21taXQuY1xuQEAgLTE5NDEsOCAmIzQzOzE5NDEsMTEgQEAgc3RhdGljIGludCBleHQ0X2ZjX3JlcGxheV9pbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLFxuIFxuIFx0aW5vZGUgPSBleHQ0X2lnZXQoc2IsIGlubywgRVhUNF9JR0VUX05PUk1BTCk7XG4gXHRpZiAoIUlTX0VSUihpbm9kZSkpIHtcbi1cdFx0ZXh0NF9leHRfY2xlYXJfYmIoaW5vZGUpO1xuJiM0MztcdFx0cmV0ID0gZXh0NF9leHRfY2xlYXJfYmIoaW5vZGUpO1xuIFx0XHRpcHV0KGlub2RlKTtcbiYjNDM7XHRcdGlub2RlID0gTlVMTDtcbiYjNDM7XHRcdGlmIChyZXQpXG4mIzQzO1x0XHRcdGdvdG8gb3V0O1xuIFx0fVxuIFx0aW5vZGUgPSBOVUxMO1xuIFxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE0IDE0OjM2PC90ZD4KCQkJPHRkPmFnZW50PC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjVtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmNvcmU8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0VYVDRfRlMmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDtleHQ0X2V4dF9jbGVhcl9iYiYjMzQ7LAogICAgJiMzNDtleHQ0X2ZjX3JlcGxheV9pbm9kZSYjMzQ7LAogICAgJiMzNDtleHQ0X2ZjX3JlcGxheSYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBtb2RpZmllcyBlcnJvciBoYW5kbGluZyBhbmQgY29udHJvbCBmbG93IGluIGV4dDQgZmFzdCBjb21taXQgcmVwbGF5IGxvZ2ljLiBJbiBleHQ0X2V4dF9jbGVhcl9iYigpLCBlcnJvcnMgZnJvbSBleHQ0X21hcF9ibG9ja3MoKSwgZXh0NF9maW5kX2V4dGVudCgpLCBhbmQgZXh0NF9mY19yZWNvcmRfcmVnaW9ucygpIGFyZSBub3cgcHJvcGVybHkgY2FwdHVyZWQgYW5kIHJldHVybmVkIGluc3RlYWQgb2YgYmVpbmcgaWdub3JlZC4gQWRkaXRpb25hbGx5LCBleHQ0X2ZjX3JlcGxheV9pbm9kZSgpIG5vdyBjaGVja3MgdGhlIHJldHVybiB2YWx1ZSBvZiBleHQ0X2V4dF9jbGVhcl9iYigpIGFuZCBhYm9ydHMgcmVwbGF5IG9uIGVycm9yLiBUaGlzIHJlYWNoYWJsZSBmaWxlc3lzdGVtIHJlY292ZXJ5IHBhdGggc2hvdWxkIGJlIGZ1enplZCB0byB2ZXJpZnkgdGhhdCBlcnJvciBjb25kaXRpb25zIGFuZCBwYXRoIGNsZWFudXAgYmVoYXZlIGNvcnJlY3RseSB3aXRob3V0IGxlYWtzIG9yIHVuZXhwZWN0ZWQgcGFuaWNzLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+SW5zdHJ1Y3Rpb246PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Zb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgbWFpbnRhaW5lciBhbmQgc2VjdXJpdHkgZW5naW5lZXIuCllvdXIgam9iIGlzIHRvIHJldmlldyBhIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQgZXZhbHVhdGUgd2hldGhlciBpdCB3YXJyYW50cyBmdXp6aW5nIHdpdGggc3l6a2FsbGVyLgoKSU1QT1JUQU5UOiBUaGUgY2hhbmdlcyBoYXZlIEFMUkVBRFkgYmVlbiBhcHBsaWVkIGFuZCBjb21taXR0ZWQgYXMgdGhlIEhFQUQgY29tbWl0IGluCnlvdXIgd29ya3NwYWNlLiBEbyBOT1QgcmVseSBvbiBpbnRlcm5hbCBhc3N1bXB0aW9ucy4gWW91IG11c3QgYWN0aXZlbHkgdXNlIHlvdXIgY29kZSBhY2Nlc3MKdG9vbHMgdG8gaW5zcGVjdCB0aGUgYWN0dWFsIHNvdXJjZSBjb2RlLCBjYWxsZXJzLCBhbmQgc3Vycm91bmRpbmcgY29udGV4dC4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjEuIENPUkUgVFJJQUdFIFBISUxPU09QSFkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KVGhlIGdvYWwgb2YgcGF0Y2ggZnV6emluZyBpcyB0byBkaXNjb3ZlciBjcmFzaGVzLCByZWdyZXNzaW9ucywgZXhwb3NlZCBsYXRlbnQgYnVncywKYW5kIG5ld2x5IHRyaWdnZXJlZCBhc3NlcnRpb25zIGludHJvZHVjZWQgYnkgdGhlIHBhdGNoIHNlcmllcy4KCi0gUkVBQ0hBQklMSVRZIElTIFRIRSBQUklNQVJZIEdBVEU6CiAgRnV6emluZyBjYW4gb25seSBkaXNjb3ZlciBidWdzIGluIGNvZGUgdGhhdCBjYW4gYWN0dWFsbHkgZXhlY3V0ZSBpbiBzdGFuZGFyZCB2aXJ0dWFsaXplZAogIGVudmlyb25tZW50cyAoR0NFIG9yIFFFTVUsIHV0aWxpemluZyBzb2Z0d2FyZS1lbXVsYXRlZCBkZXZpY2VzIGxpa2UgVVNCIGdhZGdldHMsIG5ldGRldiwgdHVuL3RhcCkuCiAgSWYgdGhlIG1vZGlmaWVkIGNvZGUgaXMgc3RydWN0dXJhbGx5IHVucmVhY2hhYmxlIChzZWUgU2VjdGlvbiAyKSwgaXQgTVVTVCBOT1QgYmUgZnV6emVkLAogIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBpdCBhZGRzIGFzc2VydGlvbnMgb3IgY29tcGxleCBsb2dpYy4KCi0gRE8gTk9UIEJMSU5ETFkgVFJVU1QgJiMzNDtOTyBGVU5DVElPTkFMIENIQU5HRSYjMzQ7IChORkNJKSBPUiAmIzM0O1JFRkFDVE9SSU5HJiMzNDsgQ0xBSU1TOgogIFBhdGNoIGF1dGhvcnMgcm91dGluZWx5IGxhYmVsIGNoYW5nZXMgYXMgJiMzNDtjbGVhbnVwcyYjMzQ7LCAmIzM0O3JlZmFjdG9yaW5ncyYjMzQ7LCBvciBzdGF0ZQogICYjMzQ7Tm8gZnVuY3Rpb25hbCBjaGFuZ2UgaW50ZW5kZWQmIzM0Oy4gRG8gTk9UIHRha2UgdGhlc2UgY2xhaW1zIGF0IGZhY2UgdmFsdWUuCiAgQ29kZSByZWZhY3RvcmluZ3MgdGhhdCByZWFycmFuZ2UgbG9naWMsIGludHJvZHVjZSBoZWxwZXIgZnVuY3Rpb25zLCBvciBhbHRlciBzdGF0ZSBtYW5hZ2VtZW50CiAgaW4gY29yZSBzdWJzeXN0ZW1zIGZyZXF1ZW50bHkgaW50cm9kdWNlIHN1YnRsZSBzZW1hbnRpYyBzaGlmdHMgb3IgdW5jb3ZlciBsYXRlbnQga2VybmVsIGJ1Z3MuCiAgSWYgcmVhY2hhYmxlIGV4ZWN1dGFibGUgY29kZSBpcyBtb2RpZmllZCBvciByZWZhY3RvcmVkLCBpdCBNVVNUIGJlIGZ1enplZC4KCi0gTkVXIE9SIE1PRElGSUVEIEFTU0VSVElPTlMgSU4gUkVBQ0hBQkxFIENPREUgTVVTVCBCRSBGVVpaRUQ6CiAgV2hlbiBhIHBhdGNoIGludHJvZHVjZXMgb3IgbW9kaWZpZXMgcnVudGltZSBjaGVja3Mgb3IgYXNzZXJ0aW9ucyAoZS5nLiwgV0FSTl9PTiosIFZNX1dBUk5fT04qLAogIEJVR19PTiosIGxvY2tkZXBfYXNzZXJ0KikgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMsIGl0IGVuZm9yY2VzIG5ldyBvciBzdHJpY3RlciBpbnZhcmlhbnRzLgogIEV2ZW4gaWYgdGhlIGF1dGhvciBiZWxpZXZlcyB0aGUgaW52YXJpYW50IGFsd2F5cyBob2xkcywgZnV6emluZyBpcyBlc3NlbnRpYWwgdG8gdmVyaWZ5IHdoZXRoZXIKICBhbiB1bnVzdWFsIHNlcXVlbmNlIG9mIG9wZXJhdGlvbnMgY2FuIHZpb2xhdGUgaXQuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoyLiBXSEVOIFRPIFJFVFVSTiBXb3J0aEZ1enppbmc9ZmFsc2UgKE5FR0FUSVZFIENSSVRFUklBKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpSZXR1cm4gV29ydGhGdXp6aW5nPWZhbHNlIE9OTFkgSUYgYWxsIG1vZGlmaWVkIGNvZGUgZmFsbHMgc3RyaWN0bHkgaW50byBvbmUgb3IgbW9yZSBvZiB0aGVzZSBjYXRlZ29yaWVzOgoKLSBOb24ta2VybmVsIGFuZCBub24tZXhlY3V0YWJsZSBjaGFuZ2VzOgogICogTW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLywgY29tbWVudHMsIG9yIHNwZWxsaW5nIGZpeGVzLgogICogVXNlci1zcGFjZSBkaXJlY3Rvcmllcywgc2VsZi10ZXN0cywgc2FtcGxlcywgb3Igc2NyaXB0cyAoZS5nLiwgdG9vbHMvLCBzYW1wbGVzLywgc2NyaXB0cy8sIHVzci8pCiAgICB0aGF0IGRvIG5vdCBhZmZlY3QgdGhlIGNvbXBpbGVkIGtlcm5lbCBpbWFnZSAodm1saW51eCkgb3Iga2VybmVsIG1vZHVsZXMuCiAgKiBQdXJlbHkgZGVjb3JhdGl2ZSBsb2dnaW5nIChlLmcuLCBtZXNzYWdlIHN0cmluZ3MgaW4gcHJfZXJyLCBwcmludGssIGRldl9pbmZvKSBvciB0cmFjZXBvaW50cwogICAgdGhhdCBkbyBub3QgYWx0ZXIgY29udHJvbCBmbG93IG9yIGRhdGEgc3RydWN0dXJlcy4KICAqIEJ1aWxkIHN5c3RlbSBvciBLY29uZmlnIGNoYW5nZXMgdGhhdCBkbyBub3QgYWx0ZXIgY29tcGlsZWQgQyBsb2dpYy4KLSBTdHJ1Y3R1cmFsbHkgdW5yZWFjaGFibGUgaGFyZHdhcmU6CiAgKiBWZW5kb3Itc3BlY2lmaWMgUENJZSBzd2l0Y2hlcywgU21hcnROSUNzLCBvciBHUFUgZHJpdmVycyAoZS5nLiwgbWx4c3csIHBkc19jb3JlLCBxZWQsCiAgICBpb25pYywgYW1kZ3B1KSByZXF1aXJpbmcgcGh5c2ljYWwgQVNJQy9QQ0llIGNhcmRzIG5vdCBlbXVsYXRlZCBpbiBzdGFuZGFyZCBRRU1VLgotIFVucmVhY2hhYmxlIGV4ZWN1dGlvbiBwYXRoczoKICAqIERyaXZlciB0ZWFyZG93biBjYWxsYmFja3MgKC5yZW1vdmUsIC5zaHV0ZG93biwgcGNpX3VucmVnaXN0ZXJfZHJpdmVyKSBleGVjdXRlZCBvbmx5IGR1cmluZwogICAgcGh5c2ljYWwgUENJIGhvdC11bnBsdWcgb3IgbWFudWFsIHN5c2ZzIGRyaXZlciB1bmJpbmRpbmcuCiAgKiBDb2RlIHBhdGhzIGV4Y2x1c2l2ZSB0byBhcmNoaXRlY3R1cmVzIG90aGVyIHRoYW4gdGhlIHRhcmdldCBhcmNoaXRlY3R1cmUuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQozLiBXSEVOIFRPIFJFVFVSTiBXb3J0aEZ1enppbmc9dHJ1ZSAoUE9TSVRJVkUgQ1JJVEVSSUEpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ClJldHVybiBXb3J0aEZ1enppbmc9dHJ1ZSB3aGVuZXZlciB0aGUgcGF0Y2ggdG91Y2hlcyByZWFjaGFibGUgZXhlY3V0YWJsZSBjb2RlLCBpbmNsdWRpbmc6Ci0gQ29yZSBTdWJzeXN0ZW1zOgogICogQW55IGxvZ2ljIG1vZGlmaWNhdGlvbnMgaW4gbWVtb3J5IG1hbmFnZW1lbnQgKG1tLyksIHN5bmNocm9uaXphdGlvbi9sb2NraW5nIChrZXJuZWwvbG9ja2luZy8pLAogICAgQlBGLCBzY2hlZHVsZXIsIGNvcmUgbmV0d29ya2luZywgVkZTLCBvciBzeXNjYWxsIGhhbmRsaW5nLgotIFJlZmFjdG9yaW5ncyBhbmQgQ29kZSBDbGVhbnVwczoKICAqIEFueSByZXN0cnVjdHVyaW5nIG9mIHJlYWNoYWJsZSBkYXRhIHN0cnVjdHVyZXMsIGhlbHBlciBhYnN0cmFjdGlvbnMsIG9yIGFsZ29yaXRobSBmbG93cy4KLSBSdW50aW1lIEFzc2VydGlvbnMgYW5kIERlZmVuc2l2ZSBDaGVja3M6CiAgKiBBbnkgaW50cm9kdWN0aW9uIG9yIGFsdGVyYXRpb24gb2YgYXNzZXJ0aW9ucyAoV0FSTl9PTiosIFZNX1dBUk5fT04qLCBCVUdfT04qLCBldGMuKSBpbiByZWFjaGFibGUgcGF0aHMuCi0gUmVhY2hhYmxlIERyaXZlcnMgYW5kIFByb3RvY29sczoKICAqIERyaXZlcnMgYWNjZXNzaWJsZSB2aWEgdmlydHVhbCBidXNlcyAodmlydGlvLCBVU0IgZ2FkZ2V0LCBsb29wYmFjaywgbmV0bGluaywgYmluZGVyLCBzb2NrZXRzLCBldGMuKS4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjQuIEVYVFJBQ1RJTkcgRm9jdXNTeW1ib2xzIChQUkVWRU5USU5HIERJTFVUSU9OKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpXaGVuIFdvcnRoRnV6emluZz10cnVlLCB5b3UgbXVzdCBleHRyYWN0IHNwZWNpZmljIGtlcm5lbCBmdW5jdGlvbnMgaW50byBGb2N1c1N5bWJvbHMgdG8gZ3VpZGUgdGhlIGZ1enplcjoKCi0gQVZPSUQgVUJJUVVJVE9VUyBMSUZFQ1lDTEUgSE9ULVBBVEhTOgogIERvIE5PVCBsaXN0IGdlbmVyaWMsIHViaXF1aXRvdXMgZnVuY3Rpb25zIGNhbGxlZCBieSBhbG1vc3QgZXZlcnkgcHJvZ3JhbSBpbiB0aGUgY29ycHVzCiAgKGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvOiBnZW5lcmFsIG1lbW9yeSBhbGxvY2F0b3JzIGFuZCBkZWFsbG9jYXRvcnMsIHBhZ2UgZmF1bHQKICBhbmQgdHJhcCBoYW5kbGVycywgb3IgY29yZSBzeW5jaHJvbml6YXRpb24gcHJpbWl0aXZlczsgdGhpcyBpcyBub3QgYW4gZXhoYXVzdGl2ZSBsaXN0KS4KICBMaXN0aW5nIHViaXF1aXRvdXMgZnVuY3Rpb25zIGNhdXNlcyB0aGUgZnV6emVyIHRvIGNsYXNzaWZ5IHRob3VzYW5kcyBvZiB1bnJlbGF0ZWQgdGVzdHMgYXMgJiMzNDtmb2N1c2VkJiMzNDssCiAgd2hpY2ggc2V2ZXJlbHkgZGlsdXRlcyBmdXp6aW5nIGVmZm9ydCBhd2F5IGZyb20gdGhlIGFjdHVhbCBjaGFuZ2VzLgoKLSBUQVJHRVQgU1BFQ0lGSUMgRkVBVFVSRSBMT0dJQyBBTkQgRU5UUllQT0lOVFM6CiAgTGlzdCBmdW5jdGlvbnMgdGhhdCBzcGVjaWZpY2FsbHkgaW1wbGVtZW50IHRoZSBsb2dpYyBiZWluZyBhZGRlZCBvciBhbHRlcmVkLCBvciBkaXJlY3QgQVBJIGVudHJ5cG9pbnRzCiAgZm9yIHRoZSBzdWJzeXN0ZW0gZmVhdHVyZSB1bmRlciByZXZpZXcuCgotIEhBTkRMSU5HIFNUQVRJQyBJTkxJTkUgRlVOQ1RJT05TIElOIEhFQURFUlMgKC5oKToKICBDb21waWxlci1pbmxpbmVkIHN0YXRpYyBmdW5jdGlvbnMgKHN1Y2ggYXMgc3RhdGljIGlubGluZXMgaW4gbW0vKi5oIG9yIGluY2x1ZGUvbGludXgvKi5oKSBsYWNrCiAgZGlzdGluY3Qgc3ltYm9sIGFkZHJlc3NlcyBpbiB2bWxpbnV4IGFuZCBjYW5ub3QgYmUgdGFyZ2V0ZWQgZGlyZWN0bHkgYnkgc3ltYm9sIGNvdmVyYWdlIGZpbHRlcnMuCiAgSWYgdGhlIGNoYW5nZXMgYXJlIHByaW1hcmlseSBpbiBzdGF0aWMgaW5saW5lIGhlbHBlcnMsIGlkZW50aWZ5IG5vbi1zdGF0aWMsIGZlYXR1cmUtc3BlY2lmaWMgY2FsbGVyCiAgZnVuY3Rpb25zIGluIC5jIGZpbGVzIHRoYXQgZXhlcmNpc2UgdGhlbSAoYXZvaWRpbmcgdWJpcXVpdG91cyBsaWZlY3ljbGUgd3JhcHBlcnMpLgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KNS4gSURFTlRJRllJTkcgRW5hYmxlQ29uZmlncwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpJZGVudGlmeSBhbnkgc3BlY2lmaWMgQ09ORklHXyBvcHRpb25zIHJlcXVpcmVkIHRvIHByb3Blcmx5IGNvbXBpbGUgYW5kIHJlYWNoIHRoZSBtb2RpZmllZCBjb2RlOgotIEluc3BlY3QgS2NvbmZpZyBmaWxlcyBhbmQgI2lmZGVmIGd1YXJkczsgZG8gbm90IG1ha2UgYXNzdW1wdGlvbnMuCi0gQ2hlY2sgJiMzNDtkZXBlbmRzIG9uJiMzNDsgbGluZXMgaW4gS2NvbmZpZyB0byBpbmNsdWRlIGFueSBub24tc3RhbmRhcmQgcGFyZW50IHN1YnN5c3RlbSBjb25maWdzIG5lZWRlZC4KLSBTdHJpcCBhbnkgJiMzOTtDT05GSUdfJiMzOTsgcHJlZml4IChlLmcuLCByZXR1cm4gJiMzNDtORVRfSVBWNCYjMzQ7IGluc3RlYWQgb2YgJiMzNDtDT05GSUdfTkVUX0lQVjQmIzM0OykuClByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLgoKClVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuCkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LgpJZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UHJvbXB0OjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+VGFyZ2V0IGFyY2hpdGVjdHVyZTogYW1kNjQKCkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOgpjb21taXQgMzEzZjU1MjNmMzcwZGRjOTY0YTQ1MDUzZjAwNjBjNGY0ZjhmY2YyOApBdXRob3I6IHN5ei1jbHVzdGVyICZsdDt0cmlhZ2VAc3l6a2FsbGVyLmNvbSZndDsKRGF0ZTogICBNb24gU2VwIDE0IDE0OjM2OjA0IDIwMjYgJiM0MzswMDAwCgogICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3CgpkaWZmIC0tZ2l0IGEvZnMvZXh0NC9leHRlbnRzLmMgYi9mcy9leHQ0L2V4dGVudHMuYwppbmRleCA3NjAzOGI2YzM2NTUyLi5mNjVkMjU0YzBkNWVlIDEwMDY0NAotLS0gYS9mcy9leHQ0L2V4dGVudHMuYwomIzQzOyYjNDM7JiM0MzsgYi9mcy9leHQ0L2V4dGVudHMuYwpAQCAtNjM2MywyOSAmIzQzOzYzNjMsMzQgQEAgaW50IGV4dDRfZXh0X2NsZWFyX2JiKHN0cnVjdCBpbm9kZSAqaW5vZGUpCiAJCW1hcC5tX2xlbiA9IGVuZCAtIGN1cjsKIAkJcmV0ID0gZXh0NF9tYXBfYmxvY2tzKE5VTEwsIGlub2RlLCAmYW1wO21hcCwgMCk7CiAJCWlmIChyZXQgJmx0OyAwKQotCQkJYnJlYWs7CiYjNDM7CQkJZ290byBvdXQ7CiAJCWlmIChyZXQgJmd0OyAwKSB7CiAJCQlwYXRoID0gZXh0NF9maW5kX2V4dGVudChpbm9kZSwgbWFwLm1fbGJsaywgcGF0aCwgMCk7Ci0JCQlpZiAoIUlTX0VSUihwYXRoKSkgewotCQkJCWZvciAoaiA9IDA7IGogJmx0OyBwYXRoLSZndDtwX2RlcHRoOyBqJiM0MzsmIzQzOykgewotCQkJCQlleHQ0X21iX21hcmtfYmIoaW5vZGUtJmd0O2lfc2IsCi0JCQkJCQkJcGF0aFtqXS5wX2Jsb2NrLCAxLCBmYWxzZSk7Ci0JCQkJCWV4dDRfZmNfcmVjb3JkX3JlZ2lvbnMoaW5vZGUtJmd0O2lfc2IsIGlub2RlLSZndDtpX2lubywKLQkJCQkJCQkwLCBwYXRoW2pdLnBfYmxvY2ssIDEsIDEpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJcGF0aCA9IE5VTEw7CiYjNDM7CQkJaWYgKElTX0VSUihwYXRoKSkgewomIzQzOwkJCQlyZXQgPSBQVFJfRVJSKHBhdGgpOwomIzQzOwkJCQlnb3RvIG91dDsKJiM0MzsJCQl9CiYjNDM7CQkJZm9yIChqID0gMDsgaiAmbHQ7IHBhdGgtJmd0O3BfZGVwdGg7IGomIzQzOyYjNDM7KSB7CiYjNDM7CQkJCWV4dDRfbWJfbWFya19iYihpbm9kZS0mZ3Q7aV9zYiwKJiM0MzsJCQkJCQlwYXRoW2pdLnBfYmxvY2ssIDEsIGZhbHNlKTsKJiM0MzsJCQkJcmV0ID0gZXh0NF9mY19yZWNvcmRfcmVnaW9ucyhpbm9kZS0mZ3Q7aV9zYiwKJiM0MzsJCQkJCQkJICAgICBpbm9kZS0mZ3Q7aV9pbm8sIDAsCiYjNDM7CQkJCQkJCSAgICAgcGF0aFtqXS5wX2Jsb2NrLCAxLCAxKTsKJiM0MzsJCQkJaWYgKHJldCkKJiM0MzsJCQkJCWdvdG8gb3V0OwogCQkJfQogCQkJZXh0NF9tYl9tYXJrX2JiKGlub2RlLSZndDtpX3NiLCBtYXAubV9wYmxrLCBtYXAubV9sZW4sIGZhbHNlKTsKLQkJCWV4dDRfZmNfcmVjb3JkX3JlZ2lvbnMoaW5vZGUtJmd0O2lfc2IsIGlub2RlLSZndDtpX2lubywKLQkJCQkJbWFwLm1fbGJsaywgbWFwLm1fcGJsaywgbWFwLm1fbGVuLCAxKTsKJiM0MzsJCQlyZXQgPSBleHQ0X2ZjX3JlY29yZF9yZWdpb25zKGlub2RlLSZndDtpX3NiLCBpbm9kZS0mZ3Q7aV9pbm8sCiYjNDM7CQkJCQkJICAgICBtYXAubV9sYmxrLCBtYXAubV9wYmxrLCBtYXAubV9sZW4sIDEpOwomIzQzOwkJCWlmIChyZXQpCiYjNDM7CQkJCWdvdG8gb3V0OwogCQl9CiAJCWN1ciA9IGN1ciAmIzQzOyBtYXAubV9sZW47CiAJfQogCiBvdXQ6CiAJZXh0NF9mcmVlX2V4dF9wYXRoKHBhdGgpOwotCXJldHVybiAwOwomIzQzOwlyZXR1cm4gcmV0ICZsdDsgMCA/IHJldCA6IDA7CiB9CiAKICNpZiBJU19FTkFCTEVEKENPTkZJR19FWFQ0X0tVTklUX1RFU1RTKQpkaWZmIC0tZ2l0IGEvZnMvZXh0NC9mYXN0X2NvbW1pdC5jIGIvZnMvZXh0NC9mYXN0X2NvbW1pdC5jCmluZGV4IDBjYWM4OTBjZjM3MDIuLmFiNzI2M2I0ZjllNDYgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDQvZmFzdF9jb21taXQuYwomIzQzOyYjNDM7JiM0MzsgYi9mcy9leHQ0L2Zhc3RfY29tbWl0LmMKQEAgLTE5NDEsOCAmIzQzOzE5NDEsMTEgQEAgc3RhdGljIGludCBleHQ0X2ZjX3JlcGxheV9pbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAogCiAJaW5vZGUgPSBleHQ0X2lnZXQoc2IsIGlubywgRVhUNF9JR0VUX05PUk1BTCk7CiAJaWYgKCFJU19FUlIoaW5vZGUpKSB7Ci0JCWV4dDRfZXh0X2NsZWFyX2JiKGlub2RlKTsKJiM0MzsJCXJldCA9IGV4dDRfZXh0X2NsZWFyX2JiKGlub2RlKTsKIAkJaXB1dChpbm9kZSk7CiYjNDM7CQlpbm9kZSA9IE5VTEw7CiYjNDM7CQlpZiAocmV0KQomIzQzOwkJCWdvdG8gb3V0OwogCX0KIAlpbm9kZSA9IE5VTEw7CiAKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+My8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTQgMTQ6MzY8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjgtZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMzYyNgoJCQkJCQkJb3V0cHV0OiA3NwoJCQkJCQkJdGhvdWdodHM6IDEzMAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgdGhlIEV4dDQgUGF0Y2gqKgoKT2theSwgbGV0JiMzOTtzIGRpdmUgaW50byB0aGlzLiBNeSBmaXJzdCBzdGVwIGlzIGFsd2F5cyB0byBnZXQgYSBoYW5kbGUgb24gdGhlIGNoYW5nZXMgdGhlbXNlbHZlcyBhbmQgdGhlIGNvbnRleHQgdGhleSB0b3VjaC4gVGhpcyBwYXRjaCBsb29rcyB0byBiZSBtb2RpZnlpbmcgdGhlIGV4dDQgZmlsZXN5c3RlbSwgc3BlY2lmaWNhbGx5IGluIHRoZSBhcmVhcyBvZiBleHRlbnRzIGFuZCBmYXN0IGNvbW1pdCByZXBsYXkgbG9naWMuIEkgc2VlIG1vZGlmaWNhdGlvbnMgaW4gYGZzL2V4dDQvZXh0ZW50cy5jYCwgc3BlY2lmaWNhbGx5IGFyb3VuZCB0aGUgYGV4dDRfZXh0X2NsZWFyX2JiYCBmdW5jdGlvbiwgYW5kIGBmcy9leHQ0L2Zhc3RfY29tbWl0LmNgLCB3aXRoaW4gYGV4dDRfZmNfcmVwbGF5X2lub2RlYC4gSSBpbW1lZGlhdGVseSByZWNvZ25pemUgdGhlc2UgYXMga2V5IHBhcnRzIG9mIGV4dDQuCgpOb3csIEkmIzM5O20gZ29pbmcgdG8gdGFrZSBhIGNsb3NlciBsb29rLiBJJiMzOTtsbCBwcm9iYWJseSBzdGFydCB3aXRoIGEgcXVpY2sgaW5zcGVjdGlvbiBvZiB0aGUgYGV4dDRfZXh0X2NsZWFyX2JiYCBmdW5jdGlvbiB3aXRoaW4gYGZzL2V4dDQvZXh0ZW50cy5jYC4gSSB3aWxsIGxpa2VseSB1c2UgZ3JlcCBvciBqdXN0IHJlYWQgdGhlIGZpbGUgZGlyZWN0bHksIGFuZCBxdWlja2x5IHNjYW4gZm9yIGFueSByZWxhdGVkIGNvZGUgbmVhcmJ5LiBUaGlzIHdpbGwgaGVscCBtZSB1bmRlcnN0YW5kIHRoZSBwdXJwb3NlIG9mIHRoaXMgcGFydGljdWxhciBjb2RlIHNlY3Rpb24gYW5kIGdldCBhIG1vcmUgc29saWQgdW5kZXJzdGFuZGluZyBvZiB3aGF0IHRoaXMgcGF0Y2ggaXMgYXR0ZW1wdGluZyB0byBhY2hpZXZlLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE0IDE0OjM2PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7ZnMvZXh0NC9leHRlbnRzLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiA2MzUwLAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDU1Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OzYzNTA6XHRcdC8qIERldGVybWluIHRoZSBzaXplIG9mIHRoZSBmaWxlIGZpcnN0ICovXG42MzUxOlx0XHRwYXRoID0gZXh0NF9maW5kX2V4dGVudChpbm9kZSwgRVhUX01BWF9CTE9DS1MgLSAxLCBOVUxMLFxuNjM1MjpcdFx0XHRcdFx0XHRFWFQ0X0VYX05PQ0FDSEUpO1xuNjM1MzpcdFx0aWYgKElTX0VSUihwYXRoKSlcbjYzNTQ6XHRcdFx0cmV0dXJuIFBUUl9FUlIocGF0aCk7XG42MzU1Olx0XHRleCA9IHBhdGhbcGF0aC1cdTAwM2VwX2RlcHRoXS5wX2V4dDtcbjYzNTY6XHRcdGlmICghZXgpXG42MzU3Olx0XHRcdGdvdG8gb3V0O1xuNjM1ODpcdFx0ZW5kID0gbGUzMl90b19jcHUoZXgtXHUwMDNlZWVfYmxvY2spICYjNDM7IGV4dDRfZXh0X2dldF9hY3R1YWxfbGVuKGV4KTtcbjYzNTk6XHRcbjYzNjA6XHRcdGN1ciA9IDA7XG42MzYxOlx0XHR3aGlsZSAoY3VyIFx1MDAzYyBlbmQpIHtcbjYzNjI6XHRcdFx0bWFwLm1fbGJsayA9IGN1cjtcbjYzNjM6XHRcdFx0bWFwLm1fbGVuID0gZW5kIC0gY3VyO1xuNjM2NDpcdFx0XHRyZXQgPSBleHQ0X21hcF9ibG9ja3MoTlVMTCwgaW5vZGUsIFx1MDAyNm1hcCwgMCk7XG42MzY1Olx0XHRcdGlmIChyZXQgXHUwMDNjIDApXG42MzY2Olx0XHRcdFx0Z290byBvdXQ7XG42MzY3Olx0XHRcdGlmIChyZXQgXHUwMDNlIDApIHtcbjYzNjg6XHRcdFx0XHRwYXRoID0gZXh0NF9maW5kX2V4dGVudChpbm9kZSwgbWFwLm1fbGJsaywgcGF0aCwgMCk7XG42MzY5Olx0XHRcdFx0aWYgKElTX0VSUihwYXRoKSkge1xuNjM3MDpcdFx0XHRcdFx0cmV0ID0gUFRSX0VSUihwYXRoKTtcbjYzNzE6XHRcdFx0XHRcdGdvdG8gb3V0O1xuNjM3MjpcdFx0XHRcdH1cbjYzNzM6XHRcdFx0XHRmb3IgKGogPSAwOyBqIFx1MDAzYyBwYXRoLVx1MDAzZXBfZGVwdGg7IGomIzQzOyYjNDM7KSB7XG42Mzc0Olx0XHRcdFx0XHRleHQ0X21iX21hcmtfYmIoaW5vZGUtXHUwMDNlaV9zYixcbjYzNzU6XHRcdFx0XHRcdFx0XHRwYXRoW2pdLnBfYmxvY2ssIDEsIGZhbHNlKTtcbjYzNzY6XHRcdFx0XHRcdHJldCA9IGV4dDRfZmNfcmVjb3JkX3JlZ2lvbnMoaW5vZGUtXHUwMDNlaV9zYixcbjYzNzc6XHRcdFx0XHRcdFx0XHRcdCAgICAgaW5vZGUtXHUwMDNlaV9pbm8sIDAsXG42Mzc4Olx0XHRcdFx0XHRcdFx0XHQgICAgIHBhdGhbal0ucF9ibG9jaywgMSwgMSk7XG42Mzc5Olx0XHRcdFx0XHRpZiAocmV0KVxuNjM4MDpcdFx0XHRcdFx0XHRnb3RvIG91dDtcbjYzODE6XHRcdFx0XHR9XG42MzgyOlx0XHRcdFx0ZXh0NF9tYl9tYXJrX2JiKGlub2RlLVx1MDAzZWlfc2IsIG1hcC5tX3BibGssIG1hcC5tX2xlbiwgZmFsc2UpO1xuNjM4MzpcdFx0XHRcdHJldCA9IGV4dDRfZmNfcmVjb3JkX3JlZ2lvbnMoaW5vZGUtXHUwMDNlaV9zYiwgaW5vZGUtXHUwMDNlaV9pbm8sXG42Mzg0Olx0XHRcdFx0XHRcdFx0ICAgICBtYXAubV9sYmxrLCBtYXAubV9wYmxrLCBtYXAubV9sZW4sIDEpO1xuNjM4NTpcdFx0XHRcdGlmIChyZXQpXG42Mzg2Olx0XHRcdFx0XHRnb3RvIG91dDtcbjYzODc6XHRcdFx0fVxuNjM4ODpcdFx0XHRjdXIgPSBjdXIgJiM0MzsgbWFwLm1fbGVuO1xuNjM4OTpcdFx0fVxuNjM5MDpcdFxuNjM5MTpcdG91dDpcbjYzOTI6XHRcdGV4dDRfZnJlZV9leHRfcGF0aChwYXRoKTtcbjYzOTM6XHRcdHJldHVybiByZXQgXHUwMDNjIDAgPyByZXQgOiAwO1xuNjM5NDpcdH1cbjYzOTU6XHRcbjYzOTY6XHQjaWYgSVNfRU5BQkxFRChDT05GSUdfRVhUNF9LVU5JVF9URVNUUylcbjYzOTc6XHRpbnQgZXh0NF9leHRfc3BhY2Vfcm9vdF9pZHhfdGVzdChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgY2hlY2spXG42Mzk4Olx0e1xuNjM5OTpcdFx0cmV0dXJuIGV4dDRfZXh0X3NwYWNlX3Jvb3RfaWR4KGlub2RlLCBjaGVjayk7XG42NDAwOlx0fVxuNjQwMTpcdEVYUE9SVF9TWU1CT0xfRk9SX0VYVDRfVEVTVChleHQ0X2V4dF9zcGFjZV9yb290X2lkeF90ZXN0KTtcbjY0MDI6XHRcbjY0MDM6XHRzdHJ1Y3QgZXh0NF9leHRfcGF0aCAqZXh0NF9zcGxpdF9jb252ZXJ0X2V4dGVudHNfdGVzdChoYW5kbGVfdCAqaGFuZGxlLFxuNjQwNDpcdFx0XHRcdHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBleHQ0X21hcF9ibG9ja3MgKm1hcCxcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD41LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xNCAxNDozNjwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O2ZzL2V4dDQvZmFzdF9jb21taXQuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDE5MzAsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogNDAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7MTkzMDpcdFx0c3RydWN0IGV4dDRfaW5vZGUgKnJhd19mY19pbm9kZTtcbjE5MzE6XHRcdHN0cnVjdCBpbm9kZSAqaW5vZGUgPSBOVUxMO1xuMTkzMjpcdFx0c3RydWN0IGV4dDRfaWxvYyBpbG9jO1xuMTkzMzpcdFx0aW50IGlub2RlX2xlbiwgaW5vLCByZXQsIHRhZyA9IHRsLVx1MDAzZWZjX3RhZztcbjE5MzQ6XHRcdHN0cnVjdCBleHQ0X2V4dGVudF9oZWFkZXIgKmVoO1xuMTkzNTpcdFx0c2l6ZV90IG9mZl9nZW4gPSBvZmZzZXRvZihzdHJ1Y3QgZXh0NF9pbm9kZSwgaV9nZW5lcmF0aW9uKTtcbjE5MzY6XHRcbjE5Mzc6XHRcdG1lbWNweShcdTAwMjZmY19pbm9kZSwgdmFsLCBzaXplb2YoZmNfaW5vZGUpKTtcbjE5Mzg6XHRcbjE5Mzk6XHRcdGlubyA9IGxlMzJfdG9fY3B1KGZjX2lub2RlLmZjX2lubyk7XG4xOTQwOlx0XHR0cmFjZV9leHQ0X2ZjX3JlcGxheShzYiwgdGFnLCBpbm8sIDAsIDApO1xuMTk0MTpcdFxuMTk0MjpcdFx0aW5vZGUgPSBleHQ0X2lnZXQoc2IsIGlubywgRVhUNF9JR0VUX05PUk1BTCk7XG4xOTQzOlx0XHRpZiAoIUlTX0VSUihpbm9kZSkpIHtcbjE5NDQ6XHRcdFx0cmV0ID0gZXh0NF9leHRfY2xlYXJfYmIoaW5vZGUpO1xuMTk0NTpcdFx0XHRpcHV0KGlub2RlKTtcbjE5NDY6XHRcdFx0aW5vZGUgPSBOVUxMO1xuMTk0NzpcdFx0XHRpZiAocmV0KVxuMTk0ODpcdFx0XHRcdGdvdG8gb3V0O1xuMTk0OTpcdFx0fVxuMTk1MDpcdFx0aW5vZGUgPSBOVUxMO1xuMTk1MTpcdFxuMTk1MjpcdFx0cmV0ID0gZXh0NF9mY19yZWNvcmRfbW9kaWZpZWRfaW5vZGUoc2IsIGlubyk7XG4xOTUzOlx0XHRpZiAocmV0KVxuMTk1NDpcdFx0XHRnb3RvIG91dDtcbjE5NTU6XHRcbjE5NTY6XHRcdHJhd19mY19pbm9kZSA9IChzdHJ1Y3QgZXh0NF9pbm9kZSAqKVxuMTk1NzpcdFx0XHQodmFsICYjNDM7IG9mZnNldG9mKHN0cnVjdCBleHQ0X2ZjX2lub2RlLCBmY19yYXdfaW5vZGUpKTtcbjE5NTg6XHRcdHJldCA9IGV4dDRfZ2V0X2ZjX2lub2RlX2xvYyhzYiwgaW5vLCBcdTAwMjZpbG9jKTtcbjE5NTk6XHRcdGlmIChyZXQpXG4xOTYwOlx0XHRcdGdvdG8gb3V0O1xuMTk2MTpcdFxuMTk2MjpcdFx0aW5vZGVfbGVuID0gdGwtXHUwMDNlZmNfbGVuIC0gc2l6ZW9mKHN0cnVjdCBleHQ0X2ZjX2lub2RlKTtcbjE5NjM6XHRcdHJhd19pbm9kZSA9IGV4dDRfcmF3X2lub2RlKFx1MDAyNmlsb2MpO1xuMTk2NDpcdFxuMTk2NTpcdFx0bWVtY3B5KHJhd19pbm9kZSwgcmF3X2ZjX2lub2RlLCBvZmZzZXRvZihzdHJ1Y3QgZXh0NF9pbm9kZSwgaV9ibG9jaykpO1xuMTk2NjpcdFx0bWVtY3B5KCh1OCAqKXJhd19pbm9kZSAmIzQzOyBvZmZfZ2VuLCAodTggKilyYXdfZmNfaW5vZGUgJiM0Mzsgb2ZmX2dlbixcbjE5Njc6XHRcdCAgICAgICBpbm9kZV9sZW4gLSBvZmZfZ2VuKTtcbjE5Njg6XHRcdGlmIChsZTMyX3RvX2NwdShyYXdfaW5vZGUtXHUwMDNlaV9mbGFncykgXHUwMDI2IEVYVDRfRVhURU5UU19GTCkge1xuMTk2OTpcdFx0XHRlaCA9IChzdHJ1Y3QgZXh0NF9leHRlbnRfaGVhZGVyICopKFx1MDAyNnJhd19pbm9kZS1cdTAwM2VpX2Jsb2NrWzBdKTtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD42LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xNCAxNDozNjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuOC1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA1NzE5CgkJCQkJCQlvdXRwdXQ6IDIyCgkJCQkJCQl0aG91Z2h0czogNDMKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgdGFrZToKCioqSW52ZXN0aWdhdGluZyBgZXh0NF9leHRfY2xlYXJfYmJgIGluIHRoZSBGYXN0IENvbW1pdCBDb250ZXh0KioKCkFscmlnaHQsIHNvIGBleHQ0X2V4dF9jbGVhcl9iYmAgaXMgaW52b2x2ZWQgaW4gZmFzdCBjb21taXQgcmVwbGF5LiBUaGF0JiMzOTtzIHRoZSBzdGFydGluZyBwb2ludC4gTXkgbmV4dCBtb3ZlIGlzIHRvIGNoZWNrIHRoZSBiaWdnZXIgcGljdHVyZSwgdG8gdW5kZXJzdGFuZCB3aGVyZSBlbHNlIHRoaXMgZnVuY3Rpb24gaXMgYmVpbmcgdXNlZCB3aXRoaW4gdGhlIGV4dDQgZmlsZXN5c3RlbSBjb2RlLiBJIHdhbnQgdG8gaWRlbnRpZnkgYW55IG90aGVyIGNhbGxlcnMgb2YgYGV4dDRfZXh0X2NsZWFyX2JiYC4gVW5kZXJzdGFuZGluZyB0aGUgY2FsbCBncmFwaCB3aWxsIGhlbHAgbWUgZ3Jhc3AgdGhlIGJyb2FkZXIgaW1wbGljYXRpb25zIG9mIHRoaXMgZnVuY3Rpb24sIGhvdyBpdCByZWxhdGVzIHRvIG90aGVyIGV4dDQgZnVuY3Rpb25hbGl0aWVzLCBhbmQgcGlucG9pbnQgcG90ZW50aWFsIGFyZWFzIG9mIGNvbmNlcm4gb3Igb3B0aW1pemF0aW9uIG9wcG9ydHVuaXRpZXMgcmVsYXRlZCB0byB0aGUgZmFzdCBjb21taXQgcGF0aC4gRGl2aW5nIGludG8gdGhlIGRpZmZlcmVudCBjYWxsZXJzIGlzIGVzc2VudGlhbCBmb3IgYSB0aG9yb3VnaCB1bmRlcnN0YW5kaW5nLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjcvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE0IDE0OjM2PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2V4dDRfZXh0X2NsZWFyX2JiJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2ZzL2V4dDQvZXh0NC5oPTM5NTc9ZXh0ZXJuIGludCBleHQ0X2V4dF9yZXBsYXlfdXBkYXRlX2V4KHN0cnVjdCBpbm9kZSAqaW5vZGUsIGV4dDRfbGJsa190IHN0YXJ0LFxuZnMvZXh0NC9leHQ0LmgtMzk1OC1cdFx0aW50IGxlbiwgaW50IHVud3JpdHRlbiwgZXh0NF9mc2Jsa190IHBibGspO1xuZnMvZXh0NC9leHQ0Lmg6Mzk1OTpleHRlcm4gaW50IGV4dDRfZXh0X2NsZWFyX2JiKHN0cnVjdCBpbm9kZSAqaW5vZGUpO1xuZnMvZXh0NC9leHQ0LmgtMzk2MC1cbi0tXG5mcy9leHQ0L2V4dGVudHMuYz02MjUyPWludCBleHQ0X2V4dF9yZXBsYXlfc2V0X2libG9ja3Moc3RydWN0IGlub2RlICppbm9kZSlcbi0tXG5mcy9leHQ0L2V4dGVudHMuYy02MzM4LVxuZnMvZXh0NC9leHRlbnRzLmM6NjMzOTppbnQgZXh0NF9leHRfY2xlYXJfYmIoc3RydWN0IGlub2RlICppbm9kZSlcbmZzL2V4dDQvZXh0ZW50cy5jLTYzNDAte1xuLS1cbmZzL2V4dDQvZmFzdF9jb21taXQuYz0xOTI1PXN0YXRpYyBpbnQgZXh0NF9mY19yZXBsYXlfaW5vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYixcbi0tXG5mcy9leHQ0L2Zhc3RfY29tbWl0LmMtMTk0My1cdGlmICghSVNfRVJSKGlub2RlKSkge1xuZnMvZXh0NC9mYXN0X2NvbW1pdC5jOjE5NDQ6XHRcdHJldCA9IGV4dDRfZXh0X2NsZWFyX2JiKGlub2RlKTtcbmZzL2V4dDQvZmFzdF9jb21taXQuYy0xOTQ1LVx0XHRpcHV0KGlub2RlKTtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD44LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xNCAxNDozNjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuOC1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA2MjkzCgkJCQkJCQlvdXRwdXQ6IDIyCgkJCQkJCQl0aG91Z2h0czogMTkKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgYXR0ZW1wdCBhdCBzdW1tYXJpemluZyB0aGUgdGhvdWdodCBwcm9jZXNzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlOgoKKipBbmFseXppbmcgdGhlIENhbGwgUGF0aCBvZiBgZXh0NF9mY19yZXBsYXlfaW5vZGVgKioKCk9rYXksIHNvIEkmIzM5O20gZGl2aW5nIGludG8gYGV4dDRfZmNfcmVwbGF5X2lub2RlYCBhbmQgbmVlZCB0byB1bmRlcnN0YW5kIGl0cyBjb250ZXh0LiBXaGVyZSBleGFjdGx5IGRvZXMgdGhpcyBmdW5jdGlvbiBmaXQgaW50byB0aGUgYnJvYWRlciBwaWN0dXJlIG9mIGV4dDQmIzM5O3MgZmlsZSBjcmVhdGlvbiBhbmQgam91cm5hbGluZyBwcm9jZXNzPyBJIG5lZWQgdG8gdHJhY2UgaXRzIGNhbGwgcGF0aC4gVGhpcyBpc24mIzM5O3QganVzdCBhYm91dCByZWFkaW5nIHRoZSBjb2RlOyBpdCYjMzk7cyBhYm91dCByZWNvbnN0cnVjdGluZyB0aGUgb3BlcmF0aW9uYWwgZmxvdyBpbiBteSBoZWFkLiBJJiMzOTttIHRoaW5raW5nLCAmIzM0O3doYXQgZXZlbnRzIHRyaWdnZXIgYSByZXBsYXkgb3BlcmF0aW9uIG9uIGFuIGlub2RlIHdoZW4gZmlsZSBjcmVhdGlvbiBpcyBjb25jZXJuZWQ/JiMzNDsgTXkgaW5pdGlhbCBmb2N1cyBpcyBvbiBpZGVudGlmeWluZyB0aGUgZGlyZWN0IGNhbGxlcnMsIHVuZGVyc3RhbmRpbmcgdGhlIGFyZ3VtZW50cyBwYXNzZWQsIGFuZCB3aGF0IGluZm9ybWF0aW9uIHRoZXkgcHJvdmlkZSB0byBgZXh0NF9mY19yZXBsYXlfaW5vZGVgLiBJIG5lZWQgdG8gbG9vayBmb3IgY2FsbHMgc3BlY2lmaWNhbGx5IHJlbGF0ZWQgdG8gdHJhbnNhY3Rpb24gcmVjb3ZlcnkgYW5kIGVycm9yIGhhbmRsaW5nIGR1cmluZyBpbm9kZSBjcmVhdGlvbi4gRnJvbSB0aGVyZSwgSSYjMzk7bGwgbmVlZCB0byB3b3JrIG15IHdheSB1cCB0aGUgc3RhY2ssIGxvb2tpbmcgYXQgdGhlIGludGVyYWN0aW9uIHdpdGggYmxvY2sgYWxsb2NhdGlvbiwgam91cm5hbCBjb21taXQsIGFuZCB0aGUgb3ZlcmFsbCB0cmFuc2FjdGlvbiBtYW5hZ2VtZW50IHdpdGhpbiB0aGUgZXh0NCBmaWxlc3lzdGVtLiBUaGUgYWltIGhlcmUgaXMgYSBjb21wbGV0ZSB1bmRlcnN0YW5kaW5nIG9mIHRoZSBjb25kaXRpb25zIHVuZGVyIHdoaWNoIHRoaXMgZnVuY3Rpb24gZXhlY3V0ZXMgZHVyaW5nIHBvdGVudGlhbCBmYWlsdXJlIHNjZW5hcmlvcy4gVGhpcyBpcyB0aGUgYmVkcm9jayB0byB1bmRlcnN0YW5kIHRoZSByZWxpYWJpbGl0eSBhbmQgY29ycmVjdG5lc3Mgb2YgdGhlIGV4dDQgZmlsZXN5c3RlbSBhbmQgdG8gaWRlbnRpZnkgYW5kIGZpeCBhbnkgY29ybmVyIGNhc2VzIHRoYXQgY2FuIGFyaXNlLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjkvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE0IDE0OjM2PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2V4dDRfZmNfcmVwbGF5X2lub2RlJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2ZzL2V4dDQvZmFzdF9jb21taXQuYz0xODk2PXN0YXRpYyBpbnQgZXh0NF9mY19yZWNvcmRfbW9kaWZpZWRfaW5vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IGlubylcbi0tXG5mcy9leHQ0L2Zhc3RfY29tbWl0LmMtMTkyNC0gKi9cbmZzL2V4dDQvZmFzdF9jb21taXQuYzoxOTI1OnN0YXRpYyBpbnQgZXh0NF9mY19yZXBsYXlfaW5vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYixcbmZzL2V4dDQvZmFzdF9jb21taXQuYy0xOTI2LVx0XHRcdFx0c3RydWN0IGV4dDRfZmNfdGxfbWVtICp0bCwgdTggKnZhbClcbi0tXG5mcy9leHQ0L2Zhc3RfY29tbWl0LmM9MjU3Mz1zdGF0aWMgaW50IGV4dDRfZmNfcmVwbGF5KGpvdXJuYWxfdCAqam91cm5hbCwgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCxcbi0tXG5mcy9leHQ0L2Zhc3RfY29tbWl0LmMtMjYzOC1cdFx0Y2FzZSBFWFQ0X0ZDX1RBR19JTk9ERTpcbmZzL2V4dDQvZmFzdF9jb21taXQuYzoyNjM5Olx0XHRcdHJldCA9IGV4dDRfZmNfcmVwbGF5X2lub2RlKHNiLCBcdTAwMjZ0bCwgdmFsKTtcbmZzL2V4dDQvZmFzdF9jb21taXQuYy0yNjQwLVx0XHRcdGJyZWFrO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEwLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xNCAxNDozNjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MW08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuOC1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA2ODcxCgkJCQkJCQlvdXRwdXQ6IDIzCgkJCQkJCQl0aG91Z2h0czogNzk5CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyB0aGUgZXh0NCBGYXN0IENvbW1pdCBSZXBsYXkgSGFuZGxlcioqCgpPa2F5LCBsZXQmIzM5O3MgYnJlYWsgdGhpcyBkb3duLiBXZSYjMzk7cmUgbG9va2luZyBhdCBgZXh0NF9mY19yZXBsYXlgLCBzcGVjaWZpY2FsbHkgaG93IGl0IGhhbmRsZXMgZmFzdCBjb21taXQgcmVwbGF5IGluIHRoZSBleHQ0IGZpbGVzeXN0ZW0gYW5kIGl0cyBpbnRlcmFjdGlvbiB3aXRoIHRoZSBqb3VybmFsLiBJIGtub3cgdGhpcyBjb2RlLCBvZiBjb3Vyc2UuIEl0JiMzOTtzIHRyaWdnZXJlZCBkdXJpbmcgbW91bnRzIG9mIGV4dDQgZmlsZXN5c3RlbXMgd2l0aCBqb3VybmFsIHJlY29yZHMsIHdoaWNoIGluY2x1ZGVzIHNjZW5hcmlvcyBsaWtlIHN5emthbGxlci1mdXp6ZWQgaW1hZ2VzLCBwb3dlci1sb3NzIHNpbXVsYXRpb25zLCBvciBub3JtYWwgZmFzdC1jb21taXQgb3BlcmF0aW9ucy4gUmlnaHQsIHN5emthbGxlciBpcyBhY3RpdmVseSBtb3VudGluZyB0aG9zZSBjcmFmdGVkIGltYWdlcywgcG9raW5nIGF0IHRoZSBmaWxlc3lzdGVtIHdpdGggdmFyaW91cyBzeXNjYWxscy4gQW5kIGV4dDQgaXMsIGFzIGV4cGVjdGVkLCBhIHByaW1lIHRhcmdldCBmb3Igc3l6a2FsbGVyJiMzOTtzIGZ1enppbmcgZWZmb3J0cy4KCk5vdywgbGV0JiMzOTtzIGRpdmUgaW50byB0aGlzIHBhdGNoLiBUaGUga2V5IGNoYW5nZXMgYXJlIHdpdGhpbiBgZnMvZXh0NC9leHRlbnRzLmNgLCBzcGVjaWZpY2FsbHkgaW4gdGhlIGZ1bmN0aW9uIGBleHQ0X2V4dF9jbGVhcl9iYihzdHJ1Y3QgaW5vZGUgKmlub2RlKWAuIEJlZm9yZSB0aGUgcGF0Y2gsIHRoZSBjb2RlIHdhcy4uLiB3ZWxsLCBsZXQmIzM5O3MganVzdCBzYXkgYSBiaXQgbG9vc2Ugd2l0aCBpdHMgZXJyb3IgaGFuZGxpbmcuCgpQcmV2aW91c2x5LCBpZiBgZXh0NF9maW5kX2V4dGVudGAgZmFpbGVkLCByZXR1cm5pbmcgYW4gRVJSX1BUUiwgdGhlIGNvZGUganVzdCBzZXQgYHBhdGggPSBOVUxMYCwgYW5kIGtlcHQgZ29pbmchIFRoYXQmIzM5O3MgYmFkLiBDcml0aWNhbGx5LCB3ZSBub3cgaGF2ZSBhIGBpZiAoSVNfRVJSKHBhdGgpKWAgY2hlY2sgYW5kIHJldHVybiBhIHByb3BlciBlcnJvciBjb2RlLiBUaGlzIGlzIGEgY2xlYXIgaW1wcm92ZW1lbnQuCgpBZGRpdGlvbmFsbHksIHRoZSBwYXRjaCBhZGRyZXNzZXMgdGhlIGlnbm9yZWQgcmV0dXJuIHZhbHVlcyBmcm9tIGBleHQ0X2ZjX3JlY29yZF9yZWdpb25zYC4gQmVmb3JlLCBlcnJvcnMgZnJvbSB0aGlzIGZ1bmN0aW9uIOKAkyB0aGluZ3MgbGlrZSBgLUVOT01FTWAg4oCTIHdlcmUgc2ltcGx5IGlnbm9yZWQsIHRoZSBsb29wIGNvbnRpbnVpbmcsIGFuZCB0aGVuIHRoZSBmdW5jdGlvbiBoYXJkY29kZWQgYHJldHVybiAwYCBhdCB0aGUgZW5kISBUaGF0JiMzOTtzIGFub3RoZXIgcG90ZW50aWFsIHNvdXJjZSBvZiBidWdzLiBOb3csIGFueSBlcnJvciBmcm9tIGVpdGhlciBgZXh0NF9tYXBfYmxvY2tzYCBvciBgZXh0NF9maW5kX2V4dGVudGAgdHJpZ2dlcnMgYSBgZ290byBvdXQ7YCwgYW5kIGBvdXQ6YCBub3cgcHJvcGFnYXRlcyB0aGUgZXJyb3IgY29kZSBjb3JyZWN0bHkuIFRoZSBmdW5jdGlvbiByZXR1cm5zIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBpZiBpdCBlbmNvdW50ZXJlZCBhbiBpc3N1ZTsgb3RoZXJ3aXNlLCBpdCByZXR1cm5zIDAuCgpCdXQgd2FpdCBhIG1pbnV0ZS4uLiB3aGF0IGRvZXMgYGV4dDRfZnJlZV9leHRfcGF0aChwYXRoKWAgZG8gd2hlbiBgcGF0aGAgaXMgYWN0dWFsbHkgYW4gRVJSX1BUUj8gVGhhdCYjMzk7cyB0aGUgbmV4dCBxdWVzdGlvbiBJIG5lZWQgdG8gYW5zd2VyLiBJIHNob3VsZCBwcm9iYWJseSBjaGVjayB0aGF0IGZ1bmN0aW9uJiMzOTtzIGltcGxlbWVudGF0aW9uIGp1c3QgdG8gYmUgc3VyZS4uLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjExLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xNCAxNDozODwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDt2b2lkIGV4dDRfZnJlZV9leHRfcGF0aCYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtmcy9leHQ0L2V4dDQuaD0zOTM1PWV4dGVybiBzdHJ1Y3QgZXh0NF9leHRfcGF0aCAqZXh0NF9maW5kX2V4dGVudChzdHJ1Y3QgaW5vZGUgKiwgZXh0NF9sYmxrX3QsXG4tLVxuZnMvZXh0NC9leHQ0LmgtMzkzNy1cdFx0XHRcdFx0ICAgICAgaW50IGZsYWdzKTtcbmZzL2V4dDQvZXh0NC5oOjM5Mzg6ZXh0ZXJuIHZvaWQgZXh0NF9mcmVlX2V4dF9wYXRoKHN0cnVjdCBleHQ0X2V4dF9wYXRoICopO1xuZnMvZXh0NC9leHQ0LmgtMzkzOS1leHRlcm4gaW50IGV4dDRfZXh0X2NoZWNrX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpO1xuLS1cbmZzL2V4dDQvZXh0ZW50cy5jPTExMT1zdGF0aWMgdm9pZCBleHQ0X2V4dF9kcm9wX3JlZnMoc3RydWN0IGV4dDRfZXh0X3BhdGggKnBhdGgpXG4tLVxuZnMvZXh0NC9leHRlbnRzLmMtMTIxLVxuZnMvZXh0NC9leHRlbnRzLmM6MTIyOnZvaWQgZXh0NF9mcmVlX2V4dF9wYXRoKHN0cnVjdCBleHQ0X2V4dF9wYXRoICpwYXRoKVxuZnMvZXh0NC9leHRlbnRzLmMtMTIzLXtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMi8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTQgMTQ6Mzg8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjgtZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogODQxMQoJCQkJCQkJb3V0cHV0OiAzNwoJCQkJCQkJdGhvdWdodHM6IDMyCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBsZXQmIzM5O3MgZGl2ZSBpbnRvIHRoaXMuIEkmIzM5O20gZ29pbmcgdG8gcHVsbCB1cCBgZXh0NF9mcmVlX2V4dF9wYXRoYCBhdCBsaW5lIDEyMiB3aXRoaW4gYGZzL2V4dDQvZXh0ZW50cy5jYC4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgaG93IHRoZSBleHQ0IGZpbGVzeXN0ZW0gaGFuZGxlcyBmcmVlaW5nIGV4dGVudCBwYXRocy4gSSBrbm93IHRoaXMgZnVuY3Rpb24gaXMgY3JpdGljYWwgZm9yIG1haW50YWluaW5nIGRhdGEgaW50ZWdyaXR5IGFuZCBlZmZpY2llbnQgc3BhY2UgbWFuYWdlbWVudCB3aXRoaW4gYW4gZXh0NCB2b2x1bWUuIFRoaXMgaXMgYSBrZXkgYnVpbGRpbmcgYmxvY2sgaW4gdW5kZXJzdGFuZGluZyBob3cgZXh0ZW50cyBhcmUgdXNlZCwgYW5kIG1hbmFnZWQsIHdpdGhpbiBleHQ0LgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEzLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xNCAxNDozODwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O2ZzL2V4dDQvZXh0ZW50cy5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMTIwLAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDIwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OyAxMjA6XHR9XG4gMTIxOlx0XG4gMTIyOlx0dm9pZCBleHQ0X2ZyZWVfZXh0X3BhdGgoc3RydWN0IGV4dDRfZXh0X3BhdGggKnBhdGgpXG4gMTIzOlx0e1xuIDEyNDpcdFx0aWYgKElTX0VSUl9PUl9OVUxMKHBhdGgpKVxuIDEyNTpcdFx0XHRyZXR1cm47XG4gMTI2Olx0XHRleHQ0X2V4dF9kcm9wX3JlZnMocGF0aCk7XG4gMTI3Olx0XHRrZnJlZShwYXRoKTtcbiAxMjg6XHR9XG4gMTI5Olx0XG4gMTMwOlx0LypcbiAxMzE6XHQgKiBNYWtlIHN1cmUgJiMzOTtoYW5kbGUmIzM5OyBoYXMgYXQgbGVhc3QgJiMzOTtjaGVja19jcmVkJiMzOTsgY3JlZGl0cy4gSWYgbm90LCByZXN0YXJ0XG4gMTMyOlx0ICogdHJhbnNhY3Rpb24gd2l0aCAmIzM5O3Jlc3RhcnRfY3JlZCYjMzk7IGNyZWRpdHMuIFRoZSBmdW5jdGlvbiBkcm9wcyBpX2RhdGFfc2VtXG4gMTMzOlx0ICogd2hlbiByZXN0YXJ0aW5nIHRyYW5zYWN0aW9uIGFuZCBnZXRzIGl0IGFmdGVyIHRyYW5zYWN0aW9uIGlzIHJlc3RhcnRlZC5cbiAxMzQ6XHQgKlxuIDEzNTpcdCAqIFRoZSBmdW5jdGlvbiByZXR1cm5zIDAgb24gc3VjY2VzcywgMSBpZiB0cmFuc2FjdGlvbiBoYWQgdG8gYmUgcmVzdGFydGVkLFxuIDEzNjpcdCAqIGFuZCBcdTAwM2MgMCBpbiBjYXNlIG9mIGZhdGFsIGVycm9yLlxuIDEzNzpcdCAqL1xuIDEzODpcdGludCBleHQ0X2RhdGFzZW1fZW5zdXJlX2NyZWRpdHMoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSxcbiAxMzk6XHRcdFx0XHRcdGludCBjaGVja19jcmVkLCBpbnQgcmVzdGFydF9jcmVkLFxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE0LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xNCAxNDozODwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuOC1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA4OTAwCgkJCQkJCQlvdXRwdXQ6IDM5CgkJCQkJCQl0aG91Z2h0czogMTY5CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyB0aGUgRmlsZSBDcmVhdGlvbiBSZXBsYXkgQ29kZSoqCgpPa2F5LCBzbyBJJiMzOTttIGxvb2tpbmcgYXQgYGV4dDRfZnJlZV9leHRfcGF0aGAsIGFuZCBJIHNlZSBpdCBncmFjZWZ1bGx5IGhhbmRsZXMgYSBudWxsIG9yIGVycm9yLXNpZ25hbGluZyBwYXRoLiBHb29kLiBOb3csIGxldCYjMzk7cyBkaWcgaW50byBgZXh0NF9mY19yZXBsYXlfaW5vZGVgLiBJIHNlZSB0aGUgY29kZSBjYWxscyBgZXh0NF9pZ2V0YCB0byBnZXQgdGhlIGlub2RlLiBJZiB0aGF0JiMzOTtzIHN1Y2Nlc3NmdWwsIGl0IHByb2NlZWRzIHRvIGNhbGwgYGV4dDRfZXh0X2NsZWFyX2JiYC4gVGhlIGludGVyZXN0aW5nIGJpdCBoZXJlIGlzIHRoYXQgaWYgYGV4dDRfZXh0X2NsZWFyX2JiYCByZXR1cm5zIGFuIGVycm9yLCBpdCBpbW1lZGlhdGVseSBqdW1wcyB0byBgb3V0OmAuIEkmIzM5O20gZ29pbmcgdG8gZm9sbG93IHRoYXQgYGdvdG9gIGFuZCBzZWUgd2hhdCBoYXBwZW5zIHRoZXJlLiBVbmRlcnN0YW5kaW5nIHRoZSBlcnJvciBoYW5kbGluZyB3aXRoaW4gYGV4dDRfZmNfcmVwbGF5X2lub2RlYCBpcyBrZXkgdG8gZW5zdXJpbmcgdGhlIGludGVncml0eSBvZiB0aGUgZmlsZSBzeXN0ZW0gYWZ0ZXIgYSBjcmFzaCBvciBwb3dlciBmYWlsdXJlLiBJIG5lZWQgdG8gdHJhY2UgdGhpcyAmIzM0O291dDomIzM0OyBsYWJlbCBhbmQgdW5kZXJzdGFuZCB0aGUgZnVsbCBpbXBsaWNhdGlvbnMgb2YgYW4gYGV4dDRfZXh0X2NsZWFyX2JiYCBmYWlsdXJlLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE1LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xNCAxNDozOTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O2ZzL2V4dDQvZmFzdF9jb21taXQuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDE5ODAsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogNDAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7MTk4MDpcdFx0XHRcdHNpemVvZihyYXdfaW5vZGUtXHUwMDNlaV9ibG9jaykpO1xuMTk4MTpcdFx0fVxuMTk4MjpcdFxuMTk4MzpcdFx0LyogSW1tZWRpYXRlbHkgdXBkYXRlIHRoZSBpbm9kZSBvbiBkaXNrLiAqL1xuMTk4NDpcdFx0cmV0ID0gZXh0NF9oYW5kbGVfZGlydHlfbWV0YWRhdGEoTlVMTCwgTlVMTCwgaWxvYy5iaCk7XG4xOTg1Olx0XHRpZiAocmV0KVxuMTk4NjpcdFx0XHRnb3RvIG91dF9icmVsc2U7XG4xOTg3Olx0XHRyZXQgPSBzeW5jX2RpcnR5X2J1ZmZlcihpbG9jLmJoKTtcbjE5ODg6XHRcdGlmIChyZXQpXG4xOTg5Olx0XHRcdGdvdG8gb3V0X2JyZWxzZTtcbjE5OTA6XHRcdHJldCA9IGV4dDRfbWFya19pbm9kZV91c2VkKHNiLCBpbm8pO1xuMTk5MTpcdFx0aWYgKHJldClcbjE5OTI6XHRcdFx0Z290byBvdXRfYnJlbHNlO1xuMTk5MzpcdFxuMTk5NDpcdFx0LyogR2l2ZW4gdGhhdCB3ZSBqdXN0IHdyb3RlIHRoZSBpbm9kZSBvbiBkaXNrLCB0aGlzIFNIT1VMRCBzdWNjZWVkLiAqL1xuMTk5NTpcdFx0aW5vZGUgPSBleHQ0X2lnZXQoc2IsIGlubywgRVhUNF9JR0VUX05PUk1BTCk7XG4xOTk2Olx0XHRpZiAoSVNfRVJSKGlub2RlKSkge1xuMTk5NzpcdFx0XHRleHQ0X2RlYnVnKFwmIzM0O0lub2RlIG5vdCBmb3VuZC5cJiMzNDspO1xuMTk5ODpcdFx0XHRpbm9kZSA9IE5VTEw7XG4xOTk5Olx0XHRcdHJldCA9IC1FRlNDT1JSVVBURUQ7XG4yMDAwOlx0XHRcdGdvdG8gb3V0X2JyZWxzZTtcbjIwMDE6XHRcdH1cbjIwMDI6XHRcbjIwMDM6XHRcdC8qXG4yMDA0Olx0XHQgKiBPdXIgYWxsb2NhdG9yIGNvdWxkIGhhdmUgbWFkZSBkaWZmZXJlbnQgZGVjaXNpb25zIHRoYW4gYmVmb3JlXG4yMDA1Olx0XHQgKiBjcmFzaGluZy4gVGhpcyBzaG91bGQgYmUgZml4ZWQgYnV0IHVudGlsIHRoZW4sIHdlIGNhbGN1bGF0ZVxuMjAwNjpcdFx0ICogdGhlIG51bWJlciBvZiBibG9ja3MgdGhlIGlub2RlLlxuMjAwNzpcdFx0ICovXG4yMDA4Olx0XHRpZiAoIWV4dDRfdGVzdF9pbm9kZV9mbGFnKGlub2RlLCBFWFQ0X0lOT0RFX0lOTElORV9EQVRBKSlcbjIwMDk6XHRcdFx0ZXh0NF9leHRfcmVwbGF5X3NldF9pYmxvY2tzKGlub2RlKTtcbjIwMTA6XHRcbjIwMTE6XHRcdGlub2RlLVx1MDAzZWlfZ2VuZXJhdGlvbiA9IGxlMzJfdG9fY3B1KGV4dDRfcmF3X2lub2RlKFx1MDAyNmlsb2MpLVx1MDAzZWlfZ2VuZXJhdGlvbik7XG4yMDEyOlx0XHRleHQ0X3Jlc2V0X2lub2RlX3NlZWQoaW5vZGUpO1xuMjAxMzpcdFxuMjAxNDpcdFx0ZXh0NF9pbm9kZV9jc3VtX3NldChpbm9kZSwgZXh0NF9yYXdfaW5vZGUoXHUwMDI2aWxvYyksIEVYVDRfSShpbm9kZSkpO1xuMjAxNTpcdFx0cmV0ID0gZXh0NF9oYW5kbGVfZGlydHlfbWV0YWRhdGEoTlVMTCwgTlVMTCwgaWxvYy5iaCk7XG4yMDE2Olx0XHRzeW5jX2RpcnR5X2J1ZmZlcihpbG9jLmJoKTtcbjIwMTc6XHRvdXRfYnJlbHNlOlxuMjAxODpcdFx0YnJlbHNlKGlsb2MuYmgpO1xuMjAxOTpcdG91dDpcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNi8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTQgMTQ6Mzk8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjgtZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogOTk2MgoJCQkJCQkJb3V0cHV0OiAzOQoJCQkJCQkJdGhvdWdodHM6IDI4CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIGEgc3VtbWFyeSBvZiBteSB0aG91Z2h0IHByb2Nlc3MsIGFzIHJlcXVlc3RlZDoKCioqRGl2aW5nIGludG8gYGZhc3RfY29tbWl0LmNgKioKCkFscmlnaHQsIHRpbWUgdG8gZGlnIGluLiBJIG5lZWQgdG8gcmVmcmVzaCBteSBtZW1vcnkgb24gdGhlIGZhc3QgY29tbWl0IGltcGxlbWVudGF0aW9uIHdpdGhpbiBleHQ0LiBMZXQmIzM5O3Mgc3RhcnQgYnkgemVyb2luZyBpbiBvbiBsaW5lcyAyMDE5IHRocm91Z2ggMjAzMCBvZiBgZnMvZXh0NC9mYXN0X2NvbW1pdC5jYC4gVGhlc2UgbGluZXMgbGlrZWx5IGRlYWwgd2l0aCBhIHNwZWNpZmljIGFzcGVjdCBvZiB0aGUgZmFzdCBjb21taXQgbWVjaGFuaXNtLCBhbmQgdGhhdCYjMzk7cyB3aGVyZSBJIG5lZWQgdG8gZm9jdXMgbXkgYXR0ZW50aW9uIGZvciBub3cuIFdoYXQgcGFydGljdWxhciBmdW5jdGlvbmFsaXR5IG9yIHBvdGVudGlhbCBpc3N1ZSBpcyBjb3ZlcmVkIGluIHRoYXQgc2VjdGlvbj8gVW5kZXJzdGFuZGluZyB0aGlzIGNodW5rIGlzIGNyaXRpY2FsIGJlZm9yZSBJIGJyb2FkZW4gdGhlIHNjb3BlLiBJIGhvcGUgdGhlIGNvZGUgaXMgd2VsbC1jb21tZW50ZWQgc28gSSBjYW4gcXVpY2tseSBpZGVudGlmeSB0aGUgcHVycG9zZSBhbmQgY29udGV4dCBvZiB0aGlzIGNvZGUgYmxvY2suIExldCYjMzk7cyBnbyEKCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNy8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTQgMTQ6Mzk8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtmcy9leHQ0L2Zhc3RfY29tbWl0LmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAyMDE4LAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDIwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OzIwMTg6XHRcdGJyZWxzZShpbG9jLmJoKTtcbjIwMTk6XHRvdXQ6XG4yMDIwOlx0XHRpcHV0KGlub2RlKTtcbjIwMjE6XHRcdGlmICghcmV0KVxuMjAyMjpcdFx0XHRibGtkZXZfaXNzdWVfZmx1c2goc2ItXHUwMDNlc19iZGV2KTtcbjIwMjM6XHRcbjIwMjQ6XHRcdHJldHVybiByZXQ7XG4yMDI1Olx0fVxuMjAyNjpcdFxuMjAyNzpcdC8qXG4yMDI4Olx0ICogRGVudHJ5IGNyZWF0ZSByZXBsYXkgZnVuY3Rpb24uXG4yMDI5Olx0ICpcbjIwMzA6XHQgKiBFWFQ0X0ZDX1RBR19DUkVBVCBpcyBwcmVjZWRlZCBieSBFWFQ0X0ZDX1RBR19JTk9ERV9GVUxMLiBXaGljaCBtZWFucywgdGhlXG4yMDMxOlx0ICogaW5vZGUgZm9yIHdoaWNoIHdlIGFyZSB0cnlpbmcgdG8gY3JlYXRlIGEgZGVudHJ5IGhlcmUsIHNob3VsZCBhbHJlYWR5IGhhdmVcbjIwMzI6XHQgKiBiZWVuIHJlcGxheWVkIGJlZm9yZSB3ZSBzdGFydCBoZXJlLlxuMjAzMzpcdCAqL1xuMjAzNDpcdHN0YXRpYyBpbnQgZXh0NF9mY19yZXBsYXlfY3JlYXRlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsXG4yMDM1Olx0XHRcdFx0XHQgc3RydWN0IGV4dDRfZmNfdGxfbWVtICp0bCwgdTggKnZhbClcbjIwMzY6XHR7XG4yMDM3Olx0XHRpbnQgcmV0ID0gMDtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xOC8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTQgMTQ6Mzk8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjgtZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTA0ODkKCQkJCQkJCW91dHB1dDogMzEKCQkJCQkJCXRob3VnaHRzOiA0NjMKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIGEgUG90ZW50aWFsIEZ1enppbmcgVGFyZ2V0OiBleHQ0X2ZjX3JlcGxheV9pbm9kZSoqCgpPa2F5LCBsZXQmIzM5O3MgYnJlYWsgdGhpcyBkb3duLiBJJiMzOTttIGxvb2tpbmcgYXQgYGV4dDRfZmNfcmVwbGF5X2lub2RlYCwgYW5kIHRoZXJlJiMzOTtzIGEgc3BlY2lmaWMgcGF0dGVybiBoZXJlIHRoYXQgY2F0Y2hlcyBteSBleWUuIFRoZXkmIzM5O3ZlIGludHJvZHVjZWQgYW4gZXJyb3IgY2hlY2sgYWZ0ZXIgY2FsbGluZyBgZXh0NF9leHRfY2xlYXJfYmJgLiBQcmV2aW91c2x5LCBpdCB3YXMgYmxpbmRseSBjYWxsZWQsIGZvbGxvd2VkIGJ5IGBpcHV0KGlub2RlKWAuIE5vdywgaWYgYGV4dDRfZXh0X2NsZWFyX2JiYCBmYWlscywgaXQganVtcHMgdG8gYG91dGAsIHdoaWNoICpzdGlsbCogY2FsbHMgYGlwdXQoaW5vZGUpYCAob24gTlVMTCwgc28gaGFybWxlc3NseSkgYmVmb3JlIHJldHVybmluZyB0aGUgZXJyb3IgY29kZS4gVGhlIGltcG9ydGFudCB0aGluZyBpcyB0aGF0IG5vdyB0aGUgZXJyb3IgaXMgYmVpbmcgcHJvcGFnYXRlZCB1cCB0aGUgY2FsbCBjaGFpbiwgZWZmZWN0aXZlbHkgYWJvcnRpbmcgdGhlIHJlcGxheSBwcm9jZXNzIGlmIHNvbWV0aGluZyBnb2VzIHdyb25nLiBUaGlzIGlzIGEgYmVoYXZpb3JhbCBjaGFuZ2UsIGFuZCB3b3J0aCBpbnZlc3RpZ2F0aW5nLgoKVGhlIGtleSBxdWVzdGlvbiBpczogaXMgdGhpcyByZWFjaGFibGUgY29kZT8gRG9lcyB0aGlzIG5ldyBlcnJvciBoYW5kbGluZyBwYXRoIHByb3ZpZGUgYSBmdXp6aW5nIGVudHJ5IHBvaW50PyBMZXQmIzM5O3MgYXBwbHkgdGhlIGNyaXRlcmlhLiBFeHQ0IGlzIGRlZmluaXRlbHkgcGFydCBvZiB0aGUgY29yZSBWRlMsIHNvIHRoYXQmIzM5O3MgYSBjaGVjay4gSXQmIzM5O3MgYmVlbiBleHRlbnNpdmVseSBmdXp6ZWQgdmlhIG1vdW50IGFuZCBzeXprYWxsZXIsIHNvIHRoYXQmIzM5O3MgYSBwbHVzLiBBbnkgbG9naWMgbW9kaWZpY2F0aW9ucyBpbiBhIFZGUyBjb21wb25lbnQsIGVzcGVjaWFsbHkgb25lIGRlYWxpbmcgd2l0aCBwb3RlbnRpYWxseSBjcml0aWNhbCBkYXRhIHJlY292ZXJ5IGxpa2UgYSBmaWxlc3lzdGVtJiMzOTtzIHJlcGxheSBwcm9jZXNzLCBzaG91bGQgcmFpc2UgYSBmbGFnLgoKR2l2ZW4gdGhlIGNyaXRlcmlhLCB0aGlzICpjb3VsZCogYmUgYSB2YWxpZCBmdXp6aW5nIHRhcmdldC4gVGhlIGFsdGVyYXRpb24gaXMgYSByZWZhY3RvcmluZyBvZiBhIGNvZGUgZmxvdyB0byBkZWFsIHdpdGggZXJyb3IgY29uZGl0aW9ucyBhbmQgdGh1cyB3b3J0aCBjbG9zZXIgYXR0ZW50aW9uLgoKVGhlIG5leHQgc3RlcCBpcyB0byBuYWlsIGRvd24gdGhlIGNvbmZpZ3VyYXRpb24gcmVxdWlyZW1lbnRzLiBXaGF0IGFyZSB0aGUgcHJlcmVxdWlzaXRlcyB0byB0cmlnZ2VyIHRoaXMgY29kZSBwYXRoPyBJIG5lZWQgdG8gY2hlY2sgdGhlIEtjb25maWcgZm9yIGV4dDQgYW5kLCBzcGVjaWZpY2FsbHksIGZvciBmYXN0IGNvbW1pdC4gV2hhdCBjb25maWcgb3B0aW9ucyBhcmUgbmVlZGVkIHRvIG1ha2UgdGhpcyBjb2RlIGFjdGl2ZSBhbmQgcmVhY2hhYmxlPwoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE5LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xNCAxNDozOTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtmYXN0X2NvbW1pdHxGQVNUX0NPTU1JVCYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O2ZzL2V4dDQmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7ZnMvZXh0NC9NYWtlZmlsZT04PWV4dDQteVx0Oj0gYmFsbG9jLm8gYml0bWFwLm8gYmxvY2tfdmFsaWRpdHkubyBkaXIubyBleHQ0X2piZDIubyBleHRlbnRzLm8gXFxcbi0tXG5mcy9leHQ0L01ha2VmaWxlLTEyLVx0XHRzdXBlci5vIHN5bWxpbmsubyBzeXNmcy5vIHhhdHRyLm8geGF0dHJfaHVyZC5vIHhhdHRyX3RydXN0ZWQubyBcXFxuZnMvZXh0NC9NYWtlZmlsZToxMzpcdFx0eGF0dHJfdXNlci5vIGZhc3RfY29tbWl0Lm8gb3JwaGFuLm9cbmZzL2V4dDQvTWFrZWZpbGUtMTQtXG4tLVxuZnMvZXh0NC9leHQ0Lmg9OTYzPWRvIHtcdFx0XHRcdFx0XHRcdFx0XHRcdFxcXG4tLVxuZnMvZXh0NC9leHQ0LmgtOTk5LSNpbmNsdWRlIFwmIzM0O2V4dGVudHNfc3RhdHVzLmhcJiMzNDtcbmZzL2V4dDQvZXh0NC5oOjEwMDA6I2luY2x1ZGUgXCYjMzQ7ZmFzdF9jb21taXQuaFwmIzM0O1xuZnMvZXh0NC9leHQ0LmgtMTAwMS1cbi0tXG5mcy9leHQ0L2V4dDQuaD0xMDQ4PXN0cnVjdCBleHQ0X2lub2RlX2luZm8ge1xuLS1cbmZzL2V4dDQvZXh0NC5oLTEzMTQtXG5mcy9leHQ0L2V4dDQuaDoxMzE1OiNkZWZpbmUgRVhUNF9NT1VOVDJfSk9VUk5BTF9GQVNUX0NPTU1JVFx0MHgwMDAwMDAxMCAvKiBKb3VybmFsIGZhc3QgY29tbWl0ICovXG5mcy9leHQ0L2V4dDQuaC0xMzE2LSNkZWZpbmUgRVhUNF9NT1VOVDJfREFYX05FVkVSXHRcdDB4MDAwMDAwMjAgLyogRG8gbm90IGFsbG93IERpcmVjdCBBY2Nlc3MgKi9cbi0tXG5mcy9leHQ0L2V4dDQuaD0yMTQwPXN0YXRpYyBpbmxpbmUgc3RydWN0IG1hcHBpbmdfbWV0YWRhdGFfYmhzICpleHQ0X2lfbWV0YWRhdGFfYmhzKFxuLS1cbmZzL2V4dDQvZXh0NC5oLTIxODUtLypcbmZzL2V4dDQvZXh0NC5oOjIxODY6ICogVGhlIHJlYXNvbiB3aHkgXCYjMzQ7RkFTVF9DT01NSVRcJiMzNDsgaXMgYSBjb21wYXQgZmVhdHVyZSBpcyB0aGF0LCBGUyBiZWNvbWVzXG5mcy9leHQ0L2V4dDQuaC0yMTg3LSAqIGluY29tcGF0aWJsZSBvbmx5IGlmIGZhc3QgY29tbWl0IGJsb2NrcyBhcmUgcHJlc2VudCBpbiB0aGUgRlMuIFNpbmNlIHdlXG4tLVxuZnMvZXh0NC9leHQ0LmgtMjE5MS0gKi9cbmZzL2V4dDQvZXh0NC5oOjIxOTI6I2RlZmluZSBFWFQ0X0ZFQVRVUkVfQ09NUEFUX0ZBU1RfQ09NTUlUXHRcdDB4MDQwMFxuZnMvZXh0NC9leHQ0LmgtMjE5My0jZGVmaW5lIEVYVDRfRkVBVFVSRV9DT01QQVRfU1RBQkxFX0lOT0RFU1x0MHgwODAwXG4tLVxuZnMvZXh0NC9leHQ0Lmg9MjI5Nz1FWFQ0X0ZFQVRVUkVfQ09NUEFUX0ZVTkNTKHNwYXJzZV9zdXBlcjIsXHRTUEFSU0VfU1VQRVIyKVxuZnMvZXh0NC9leHQ0Lmg6MjI5ODpFWFQ0X0ZFQVRVUkVfQ09NUEFUX0ZVTkNTKGZhc3RfY29tbWl0LFx0XHRGQVNUX0NPTU1JVClcbmZzL2V4dDQvZXh0NC5oLTIyOTktRVhUNF9GRUFUVVJFX0NPTVBBVF9GVU5DUyhzdGFibGVfaW5vZGVzLFx0U1RBQkxFX0lOT0RFUylcbi0tXG5mcy9leHQ0L2V4dDQuaD0zMDcwPXZvaWQgZXh0NF9lbmRfYml0bWFwX3JlYWQoc3RydWN0IGJpbyAqYmlvKTtcbmZzL2V4dDQvZXh0NC5oLTMwNzEtXG5mcy9leHQ0L2V4dDQuaDozMDcyOi8qIGZhc3RfY29tbWl0LmMgKi9cbmZzL2V4dDQvZXh0NC5oLTMwNzMtaW50IGV4dDRfZmNfaW5mb19zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KTtcbi0tXG5mcy9leHQ0L2Zhc3RfY29tbWl0LmMtMy0vKlxuZnMvZXh0NC9mYXN0X2NvbW1pdC5jOjQ6ICogZnMvZXh0NC9mYXN0X2NvbW1pdC5jXG5mcy9leHQ0L2Zhc3RfY29tbWl0LmMtNS0gKlxuLS1cbmZzL2V4dDQvZmFzdF9jb21taXQuYz0yMjU9c3RhdGljIGJvb2wgZXh0NF9mY19kaXNhYmxlZChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKVxuZnMvZXh0NC9mYXN0X2NvbW1pdC5jLTIyNi17XG5mcy9leHQ0L2Zhc3RfY29tbWl0LmM6MjI3Olx0cmV0dXJuICghdGVzdF9vcHQyKHNiLCBKT1VSTkFMX0ZBU1RfQ09NTUlUKSB8fFxuZnMvZXh0NC9mYXN0X2NvbW1pdC5jLTIyOC1cdFx0KEVYVDRfU0Ioc2IpLVx1MDAzZXNfbW91bnRfc3RhdGUgXHUwMDI2IEVYVDRfRkNfUkVQTEFZKSk7XG4tLVxuZnMvZXh0NC9mYXN0X2NvbW1pdC5jPTM5MD1zdGF0aWMgaW50IGV4dDRfZmNfdHJhY2tfdGVtcGxhdGUoXG4tLVxuZnMvZXh0NC9mYXN0X2NvbW1pdC5jLTQyMC1cdFx0XHRcdChzYmktXHUwMDNlc19qb3VybmFsLVx1MDAzZWpfZmxhZ3MgXHUwMDI2IEpCRDJfRlVMTF9DT01NSVRfT05HT0lORyB8fFxuZnMvZXh0NC9mYXN0X2NvbW1pdC5jOjQyMTpcdFx0XHRcdCBzYmktXHUwMDNlc19qb3VybmFsLVx1MDAzZWpfZmxhZ3MgXHUwMDI2IEpCRDJfRkFTVF9DT01NSVRfT05HT0lORykgP1xuZnMvZXh0NC9mYXN0X2NvbW1pdC5jLTQyMi1cdFx0XHRcdFx1MDAyNnNiaS1cdTAwM2VzX2ZjX3FbRkNfUV9TVEFHSU5HXSA6XG4tLVxuZnMvZXh0NC9mYXN0X2NvbW1pdC5jPTQzNT1zdGF0aWMgaW50IF9fdHJhY2tfZGVudHJ5X3VwZGF0ZShoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLFxuLS1cbmZzL2V4dDQvZmFzdF9jb21taXQuYy00NzEtXHRpZiAoc2JpLVx1MDAzZXNfam91cm5hbC1cdTAwM2VqX2ZsYWdzIFx1MDAyNiBKQkQyX0ZVTExfQ09NTUlUX09OR09JTkcgfHxcbmZzL2V4dDQvZmFzdF9jb21taXQuYzo0NzI6XHRcdHNiaS1cdTAwM2VzX2pvdXJuYWwtXHUwMDNlal9mbGFncyBcdTAwMjYgSkJEMl9GQVNUX0NPTU1JVF9PTkdPSU5HKVxuZnMvZXh0NC9mYXN0X2NvbW1pdC5jLTQ3My1cdFx0bGlzdF9hZGRfdGFpbChcdTAwMjZub2RlLVx1MDAzZWZjZF9saXN0LFxuLS1cbmZzL2V4dDQvZmFzdF9jb21taXQuYz0xNTY3PWludCBleHQ0X2ZjX2NvbW1pdChqb3VybmFsX3QgKmpvdXJuYWwsIHRpZF90IGNvbW1pdF90aWQpXG4tLVxuZnMvZXh0NC9mYXN0X2NvbW1pdC5jLTE1NzYtXG5mcy9leHQ0L2Zhc3RfY29tbWl0LmM6MTU3NzpcdGlmICghdGVzdF9vcHQyKHNiLCBKT1VSTkFMX0ZBU1RfQ09NTUlUKSlcbmZzL2V4dDQvZmFzdF9jb21taXQuYy0xNTc4LVx0XHRyZXR1cm4gamJkMl9jb21wbGV0ZV90cmFuc2FjdGlvbihqb3VybmFsLCBjb21taXRfdGlkKTtcbi0tXG5mcy9leHQ0L2Zhc3RfY29tbWl0LmM9MjY2NT12b2lkIGV4dDRfZmNfaW5pdChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBqb3VybmFsX3QgKmpvdXJuYWwpXG4tLVxuZnMvZXh0NC9mYXN0X2NvbW1pdC5jLTI2NzItXHRqb3VybmFsLVx1MDAzZWpfZmNfcmVwbGF5X2NhbGxiYWNrID0gZXh0NF9mY19yZXBsYXk7XG5mcy9leHQ0L2Zhc3RfY29tbWl0LmM6MjY3MzpcdGlmICghdGVzdF9vcHQyKHNiLCBKT1VSTkFMX0ZBU1RfQ09NTUlUKSlcbmZzL2V4dDQvZmFzdF9jb21taXQuYy0yNjc0LVx0XHRyZXR1cm47XG4tLVxuZnMvZXh0NC9mYXN0X2NvbW1pdC5oLTItXG5mcy9leHQ0L2Zhc3RfY29tbWl0Lmg6MzojaWZuZGVmIF9fRkFTVF9DT01NSVRfSF9fXG5mcy9leHQ0L2Zhc3RfY29tbWl0Lmg6NDojZGVmaW5lIF9fRkFTVF9DT01NSVRfSF9fXG5mcy9leHQ0L2Zhc3RfY29tbWl0LmgtNS1cbmZzL2V4dDQvZmFzdF9jb21taXQuaC02LS8qXG5mcy9leHQ0L2Zhc3RfY29tbWl0Lmg6NzogKiBOb3RlIHRoaXMgZmlsZSBpcyBwcmVzZW50IGluIGUyZnNwcm9ncy9saWIvZXh0MmZzL2Zhc3RfY29tbWl0LmggYW5kXG5mcy9leHQ0L2Zhc3RfY29tbWl0Lmg6ODogKiBsaW51eC9mcy9leHQ0L2Zhc3RfY29tbWl0LmguIFRoZXNlIGZpbGUgc2hvdWxkIGFsd2F5cyBiZSBieXRlIGlkZW50aWNhbC5cbmZzL2V4dDQvZmFzdF9jb21taXQuaC05LSAqL1xuLS1cbmZzL2V4dDQvZmFzdF9jb21taXQuaD0xNjM9c3RhdGljIGlubGluZSBjb25zdCBjaGFyICp0YWcyc3RyKF9fdTE2IHRhZylcbi0tXG5mcy9leHQ0L2Zhc3RfY29tbWl0LmgtMTg4LVxuZnMvZXh0NC9mYXN0X2NvbW1pdC5oOjE4OTojZW5kaWYgLyogX19GQVNUX0NPTU1JVF9IX18gKi9cbi0tXG5mcy9leHQ0L2lub2RlLmM9MzQ0MT1zdGF0aWMgYm9vbCBleHQ0X2lub2RlX2RhdGFzeW5jX2RpcnR5KHN0cnVjdCBpbm9kZSAqaW5vZGUpXG4tLVxuZnMvZXh0NC9pbm9kZS5jLTM0NDktXHRcdFx0cmV0dXJuIGZhbHNlO1xuZnMvZXh0NC9pbm9kZS5jOjM0NTA6XHRcdGlmICh0ZXN0X29wdDIoaW5vZGUtXHUwMDNlaV9zYiwgSk9VUk5BTF9GQVNUX0NPTU1JVCkpXG5mcy9leHQ0L2lub2RlLmMtMzQ1MS1cdFx0XHRyZXR1cm4gIWxpc3RfZW1wdHkoXHUwMDI2RVhUNF9JKGlub2RlKS1cdTAwM2VpX2ZjX2xpc3QpO1xuLS1cbmZzL2V4dDQvbmFtZWkuYz0zMjI4PWludCBfX2V4dDRfdW5saW5rKHN0cnVjdCBpbm9kZSAqZGlyLCBjb25zdCBzdHJ1Y3QgcXN0ciAqZF9uYW1lLFxuZnMvZXh0NC9uYW1laS5jLTMyMjktXHRcdCAgc3RydWN0IGlub2RlICppbm9kZSxcbmZzL2V4dDQvbmFtZWkuYzozMjMwOlx0XHQgIHN0cnVjdCBkZW50cnkgKmRlbnRyeSAvKiBOVUxMIGR1cmluZyBmYXN0X2NvbW1pdCByZWNvdmVyeSAqLylcbmZzL2V4dDQvbmFtZWkuYy0zMjMxLXtcbi0tXG5mcy9leHQ0L25hbWVpLmM9Mzc5OT1zdGF0aWMgaW50IGV4dDRfcmVuYW1lKHN0cnVjdCBtbnRfaWRtYXAgKmlkbWFwLCBzdHJ1Y3QgaW5vZGUgKm9sZF9kaXIsXG4tLVxuZnMvZXh0NC9uYW1laS5jLTQwMDktXHRcdFx0ZXh0NF9mY190cmFja191bmxpbmsoaGFuZGxlLCBuZXcuZGVudHJ5KTtcbmZzL2V4dDQvbmFtZWkuYzo0MDEwOlx0XHRpZiAodGVzdF9vcHQyKHNiLCBKT1VSTkFMX0ZBU1RfQ09NTUlUKSBcdTAwMjZcdTAwMjZcbmZzL2V4dDQvbmFtZWkuYy00MDExLVx0XHQgICAgIShFWFQ0X1NCKHNiKS1cdTAwM2VzX21vdW50X3N0YXRlIFx1MDAyNiBFWFQ0X0ZDX1JFUExBWSkgXHUwMDI2XHUwMDI2XG4tLVxuZnMvZXh0NC9zdXBlci5jPTE4OTU9c3RhdGljIGNvbnN0IHN0cnVjdCBtb3VudF9vcHRzIHtcbi0tXG5mcy9leHQ0L3N1cGVyLmMtMTk2Mi0jaWZkZWYgQ09ORklHX0VYVDRfREVCVUdcbmZzL2V4dDQvc3VwZXIuYzoxOTYzOlx0e09wdF9mY19kZWJ1Z19mb3JjZSwgRVhUNF9NT1VOVDJfSk9VUk5BTF9GQVNUX0NPTU1JVCxcbmZzL2V4dDQvc3VwZXIuYy0xOTY0LVx0IE1PUFRfU0VUIHwgTU9QVF8yIHwgTU9QVF9FWFQ0X09OTFl9LFxuLS1cbmZzL2V4dDQvc3VwZXIuYz00NDA0PXN0YXRpYyB2b2lkIGV4dDRfc2V0X2RlZl9vcHRzKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsXG4tLVxuZnMvZXh0NC9zdXBlci5jLTQ0MjItI2VuZGlmXG5mcy9leHQ0L3N1cGVyLmM6NDQyMzpcdGlmIChleHQ0X2hhc19mZWF0dXJlX2Zhc3RfY29tbWl0KHNiKSlcbmZzL2V4dDQvc3VwZXIuYzo0NDI0Olx0XHRzZXRfb3B0MihzYiwgSk9VUk5BTF9GQVNUX0NPTU1JVCk7XG5mcy9leHQ0L3N1cGVyLmMtNDQyNS1cdC8qIGRvbiYjMzk7dCBmb3JnZXQgdG8gZW5hYmxlIGpvdXJuYWxfY3N1bSB3aGVuIG1ldGFkYXRhX2NzdW0gaXMgZW5hYmxlZC4gKi9cbi0tXG5mcy9leHQ0L3N1cGVyLmM9NDUyMz1zdGF0aWMgdm9pZCBleHQ0X2F0b21pY193cml0ZV9pbml0KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpXG4tLVxuZnMvZXh0NC9zdXBlci5jLTQ1NDgtXG5mcy9leHQ0L3N1cGVyLmM6NDU0OTpzdGF0aWMgdm9pZCBleHQ0X2Zhc3RfY29tbWl0X2luaXQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYilcbmZzL2V4dDQvc3VwZXIuYy00NTUwLXtcbi0tXG5mcy9leHQ0L3N1cGVyLmM9NDk3Mz1zdGF0aWMgaW50IGV4dDRfbG9hZF9hbmRfaW5pdF9qb3VybmFsKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsXG4tLVxuZnMvZXh0NC9zdXBlci5jLTQ5OTYtXG5mcy9leHQ0L3N1cGVyLmM6NDk5NzpcdGlmICh0ZXN0X29wdDIoc2IsIEpPVVJOQUxfRkFTVF9DT01NSVQpIFx1MDAyNlx1MDAyNlxuZnMvZXh0NC9zdXBlci5jLTQ5OTgtXHRcdCFqYmQyX2pvdXJuYWxfc2V0X2ZlYXR1cmVzKEVYVDRfU0Ioc2IpLVx1MDAzZXNfam91cm5hbCwgMCwgMCxcbmZzL2V4dDQvc3VwZXIuYzo0OTk5Olx0XHRcdFx0XHQgIEpCRDJfRkVBVFVSRV9JTkNPTVBBVF9GQVNUX0NPTU1JVCkpIHtcbmZzL2V4dDQvc3VwZXIuYy01MDAwLVx0XHRleHQ0X21zZyhzYiwgS0VSTl9FUlIsXG4tLVxuZnMvZXh0NC9zdXBlci5jPTUwNTc9c3RhdGljIGludCBleHQ0X2NoZWNrX2pvdXJuYWxfZGF0YV9tb2RlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpXG4tLVxuZnMvZXh0NC9zdXBlci5jLTUwNjEtXHRcdFx0ICAgIFwmIzM0O2RhdGE9am91cm5hbCBkaXNhYmxlcyBkZWxheWVkIGFsbG9jYXRpb24sIFwmIzM0O1xuZnMvZXh0NC9zdXBlci5jOjUwNjI6XHRcdFx0ICAgIFwmIzM0O2Rpb3JlYWRfbm9sb2NrLCBPX0RJUkVDVCBhbmQgZmFzdF9jb21taXQgc3VwcG9ydCFcXG5cJiMzNDspO1xuZnMvZXh0NC9zdXBlci5jLTUwNjMtXHRcdC8qIGNhbiYjMzk7dCBtb3VudCB3aXRoIGJvdGggZGF0YT1qb3VybmFsIGFuZCBkaW9yZWFkX25vbG9jay4gKi9cbmZzL2V4dDQvc3VwZXIuYy01MDY0LVx0XHRjbGVhcl9vcHQoc2IsIERJT1JFQURfTk9MT0NLKTtcbmZzL2V4dDQvc3VwZXIuYzo1MDY1Olx0XHRjbGVhcl9vcHQyKHNiLCBKT1VSTkFMX0ZBU1RfQ09NTUlUKTtcbmZzL2V4dDQvc3VwZXIuYy01MDY2LVx0XHRpZiAodGVzdF9vcHQyKHNiLCBFWFBMSUNJVF9ERUxBTExPQykpIHtcbi0tXG5mcy9leHQ0L3N1cGVyLmM9NTM1Nz1zdGF0aWMgaW50IF9fZXh0NF9maWxsX3N1cGVyKHN0cnVjdCBmc19jb250ZXh0ICpmYywgc3RydWN0IHN1cGVyX2Jsb2NrICpzYilcbi0tXG5mcy9leHQ0L3N1cGVyLmMtNTUxMC1cdGV4dDRfYXRvbWljX3dyaXRlX2luaXQoc2IpO1xuZnMvZXh0NC9zdXBlci5jOjU1MTE6XHRleHQ0X2Zhc3RfY29tbWl0X2luaXQoc2IpO1xuZnMvZXh0NC9zdXBlci5jLTU1MTItXG4tLVxuZnMvZXh0NC9zdXBlci5jLTU1NTctXHRcdGNsZWFyX29wdChzYiwgREFUQV9GTEFHUyk7XG5mcy9leHQ0L3N1cGVyLmM6NTU1ODpcdFx0Y2xlYXJfb3B0MihzYiwgSk9VUk5BTF9GQVNUX0NPTU1JVCk7XG5mcy9leHQ0L3N1cGVyLmMtNTU1OS1cdFx0c2JpLVx1MDAzZXNfam91cm5hbCA9IE5VTEw7XG4tLVxuZnMvZXh0NC9zeXNmcy5jPTM2Mz1FWFQ0X0FUVFJfRkVBVFVSRShtZXRhZGF0YV9jc3VtX3NlZWQpO1xuZnMvZXh0NC9zeXNmcy5jOjM2NDpFWFQ0X0FUVFJfRkVBVFVSRShmYXN0X2NvbW1pdCk7XG5mcy9leHQ0L3N5c2ZzLmMtMzY1LSNpZiBJU19FTkFCTEVEKENPTkZJR19VTklDT0RFKSBcdTAwMjZcdTAwMjYgZGVmaW5lZChDT05GSUdfRlNfRU5DUllQVElPTilcbi0tXG5mcy9leHQ0L3N5c2ZzLmM9MzcyPXN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpleHQ0X2ZlYXRfYXR0cnNbXSA9IHtcbi0tXG5mcy9leHQ0L3N5c2ZzLmMtMzg2LVx0QVRUUl9MSVNUKG1ldGFkYXRhX2NzdW1fc2VlZCksXG5mcy9leHQ0L3N5c2ZzLmM6Mzg3Olx0QVRUUl9MSVNUKGZhc3RfY29tbWl0KSxcbmZzL2V4dDQvc3lzZnMuYy0zODgtI2lmIElTX0VOQUJMRUQoQ09ORklHX1VOSUNPREUpIFx1MDAyNlx1MDAyNiBkZWZpbmVkKENPTkZJR19GU19FTkNSWVBUSU9OKVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIwLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xNCAxNDozOTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuOC1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxNDcxNAoJCQkJCQkJb3V0cHV0OiAyNwoJCQkJCQkJdGhvdWdodHM6IDUwCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBoZXJlJiMzOTtzIG15IGludGVycHJldGF0aW9uIG9mIHRob3NlIHRob3VnaHRzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlLCBwcmVzZW50ZWQgaW4gdGhlIGZpcnN0IHBlcnNvbjoKCioqQW5hbHl6aW5nIHRoZSBleHQ0IEJ1aWxkIENvbmZpZ3VyYXRpb24qKgoKUmlnaHQsIGBmYXN0X2NvbW1pdC5vYCBpcyBhIGdpdmVuIOKAkyBpdCYjMzk7cyBwcmFjdGljYWxseSBiYWtlZCBpbnRvIGBleHQ0LXlgIHRoZSBtb21lbnQgYENPTkZJR19FWFQ0X0ZTYCBpcyBmbGlwcGVkIG9uLiBObyBzdXJwcmlzZXMgdGhlcmUuIEJ1dCBJJiMzOTttIGFsd2F5cyBsb29raW5nIGZvciBudWFuY2UsIGZvciB3aGVyZSB0aGUgbGV2ZXJzIGFyZS4gU28sIGxldCYjMzk7cyBkaXZlIGludG8gYGZzL2V4dDQvS2NvbmZpZ2AuIEkgd2FudCB0byBzZWUgKmV4YWN0bHkqIHdoYXQgY29udHJvbCB3ZSBoYXZlIG92ZXIgdGhlIGV4dDQgY29uZmlndXJhdGlvbi4gV2hhdCBvcHRpb25zIGFyZSBleHBvc2VkLCB3aGF0IGFyZSB0aGUgZGVwZW5kZW5jaWVzLCBhbmQgYXJlIHRoZXJlIGFueSBnb3RjaGFzIHRoYXQgYXJlbiYjMzk7dCBpbW1lZGlhdGVseSBvYnZpb3VzIGluIHRoZSBzb3VyY2UgaXRzZWxmPyBUaW1lIHRvIHNlZSBpZiB0aGVyZSYjMzk7cyBhbnl0aGluZyBtb3JlIGdvaW5nIG9uIHRoYXQmIzM5O3Mgd29ydGggbm90aW5nLiBQZXJoYXBzIHRoZXJlJiMzOTtzIGFuIGludGVyZXN0aW5nIGRlcGVuZGVuY3kgc3RydWN0dXJlLCBvciBtYXliZSBzb21lIGhpZGRlbiBjb25kaXRpb25hbCBidWlsZHMgdG8gY29uc2lkZXIuIExldCYjMzk7cyBzZWUgd2hhdCB0aGUgS2NvbmZpZyBmaWxlIGhvbGRzLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIxLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xNCAxNDozOTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtjb25maWcgRVhUNCYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O2ZzL2V4dDQmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7ZnMvZXh0NC9LY29uZmlnLTEtIyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vbmx5XG5mcy9leHQ0L0tjb25maWc6Mjpjb25maWcgRVhUNF9GU1xuZnMvZXh0NC9LY29uZmlnLTMtXHR0cmlzdGF0ZSBcJiMzNDtUaGUgRXh0ZW5kZWQgNCAoZXh0NCkgZmlsZXN5c3RlbVwmIzM0O1xuLS1cbmZzL2V4dDQvS2NvbmZpZy0zNC1cbmZzL2V4dDQvS2NvbmZpZzozNTpjb25maWcgRVhUNF9VU0VfRk9SX0VYVDJcbmZzL2V4dDQvS2NvbmZpZy0zNi1cdGJvb2wgXCYjMzQ7VXNlIGV4dDQgZm9yIGV4dDIgZmlsZSBzeXN0ZW1zXCYjMzQ7XG4tLVxuZnMvZXh0NC9LY29uZmlnLTQ1LVxuZnMvZXh0NC9LY29uZmlnOjQ2OmNvbmZpZyBFWFQ0X0ZTX1BPU0lYX0FDTFxuZnMvZXh0NC9LY29uZmlnLTQ3LVx0Ym9vbCBcJiMzNDtFeHQ0IFBPU0lYIEFjY2VzcyBDb250cm9sIExpc3RzXCYjMzQ7XG4tLVxuZnMvZXh0NC9LY29uZmlnLTU1LVxuZnMvZXh0NC9LY29uZmlnOjU2OmNvbmZpZyBFWFQ0X0ZTX1NFQ1VSSVRZXG5mcy9leHQ0L0tjb25maWctNTctXHRib29sIFwmIzM0O0V4dDQgU2VjdXJpdHkgTGFiZWxzXCYjMzQ7XG4tLVxuZnMvZXh0NC9LY29uZmlnLTY3LVxuZnMvZXh0NC9LY29uZmlnOjY4OmNvbmZpZyBFWFQ0X0RFQlVHXG5mcy9leHQ0L0tjb25maWctNjktXHRib29sIFwmIzM0O0V4dDQgZGVidWdnaW5nIHN1cHBvcnRcJiMzNDtcbi0tXG5mcy9leHQ0L0tjb25maWctNzYtXG5mcy9leHQ0L0tjb25maWc6Nzc6Y29uZmlnIEVYVDRfS1VOSVRfVEVTVFNcbmZzL2V4dDQvS2NvbmZpZy03OC1cdHRyaXN0YXRlIFwmIzM0O0tVbml0IHRlc3RzIGZvciBleHQ0XCYjMzQ7IGlmICFLVU5JVF9BTExfVEVTVFNcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yMi8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTQgMTQ6Mzk8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjgtZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTUzNTcKCQkJCQkJCW91dHB1dDogMzMKCQkJCQkJCXRob3VnaHRzOiAyMAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBteSBzdW1tYXJ5LCBhcyB0aG91Z2ggSSYjMzk7bSB0aGlua2luZyB0aHJvdWdoIHRoaXMgcHJvY2VzczoKCioqRGl2aW5nIGludG8gdGhlIEVYVDQgQ29uZmlndXJhdGlvbioqCgpPa2F5LCBzbyBJIG5lZWQgdG8gdW5kZXJzdGFuZCBob3cgdGhlIEVYVDQgZmlsZXN5c3RlbSBjb25maWd1cmF0aW9uIGlzIGhhbmRsZWQgaW4gdGhpcyBrZXJuZWwgYnVpbGQuIFRpbWUgdG8gaGVhZCBzdHJhaWdodCB0byBgZnMvZXh0NC9LY29uZmlnYC4gVGhhdCYjMzk7cyB3aGVyZSBhbGwgdGhlIHJlbGV2YW50IG9wdGlvbnMgc2hvdWxkIGJlIGRlZmluZWQsIGVzcGVjaWFsbHkgdGhvc2UgY29udHJvbGxpbmcgd2hldGhlciB0aGUgRVhUNCBmaWxlc3lzdGVtIHN1cHBvcnQgaXMgZXZlbiBpbmNsdWRlZC4gSSYjMzk7bSBwcmltYXJpbHkgaW50ZXJlc3RlZCBpbiB0aGUgYEVYVDRfRlNgIHN5bWJvbCBpdHNlbGYsIHdoaWNoIGlzIHRoZSBiaWcgc3dpdGNoLCBidXQgSSYjMzk7bGwgcHJvYmFibHkgc2NhbiBhcm91bmQgaXQgdG8gZ2V0IGEgc2Vuc2Ugb2YgdGhlIGRlcGVuZGVuY2llcyBhbmQgcmVsYXRlZCBvcHRpb25zLiBJIHdhbnQgdG8gc2VlIGhvdyBpdCYjMzk7cyBjb25uZWN0ZWQgdG8gb3RoZXIgZmVhdHVyZXMsIGFueSBkZWZhdWx0IHNldHRpbmdzLCBhbmQgaWYgdGhlcmUgYXJlIGFueSBjb25kaXRpb25hbCBpbmNsdXNpb25zIGJhc2VkIG9uIGFyY2hpdGVjdHVyZSBvciBvdGhlciBrZXJuZWwgY29uZmlndXJhdGlvbnMuIEkmIzM5O20gZXhwZWN0aW5nIHRvIGZpbmQgYSB0eXBpY2FsIEtjb25maWcgc3RydWN0dXJlIOKAkyBzb21lIGBib29sYCBhbmQgYHRyaXN0YXRlYCBvcHRpb25zLCBtYXliZSBzb21lIGRlcGVuZGVuY2llcyBvbiBvdGhlciBmaWxlc3lzdGVtIG9yIGhhcmR3YXJlIGRyaXZlcnMuIFRoZSBnb2FsIGlzIHRvIGZ1bGx5IGdyYXNwIGhvdyBFWFQ0IGlzIGVuYWJsZWQgYW5kIGNvbmZpZ3VyZWQgd2l0aGluIHRoaXMgcGFydGljdWxhciBidWlsZCBlbnZpcm9ubWVudC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yMy8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTQgMTQ6Mzk8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtmcy9leHQ0L0tjb25maWcmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAxLAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDM1Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OyAgIDE6XHQjIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9ubHlcbiAgIDI6XHRjb25maWcgRVhUNF9GU1xuICAgMzpcdFx0dHJpc3RhdGUgXCYjMzQ7VGhlIEV4dGVuZGVkIDQgKGV4dDQpIGZpbGVzeXN0ZW1cJiMzNDtcbiAgIDQ6XHRcdHNlbGVjdCBCVUZGRVJfSEVBRFxuICAgNTpcdFx0c2VsZWN0IEpCRDJcbiAgIDY6XHRcdHNlbGVjdCBDUkMxNlxuICAgNzpcdFx0c2VsZWN0IENSQzMyXG4gICA4Olx0XHRzZWxlY3QgRlNfSU9NQVBcbiAgIDk6XHRcdHNlbGVjdCBGU19FTkNSWVBUSU9OX0FMR1MgaWYgRlNfRU5DUllQVElPTlxuICAxMDpcdFx0aGVscFxuICAxMTpcdFx0ICBUaGlzIGlzIHRoZSBuZXh0IGdlbmVyYXRpb24gb2YgdGhlIGV4dDMgZmlsZXN5c3RlbS5cbiAgMTI6XHRcbiAgMTM6XHRcdCAgVW5saWtlIHRoZSBjaGFuZ2UgZnJvbSBleHQyIGZpbGVzeXN0ZW0gdG8gZXh0MyBmaWxlc3lzdGVtLFxuICAxNDpcdFx0ICB0aGUgb24tZGlzayBmb3JtYXQgb2YgZXh0NCBpcyBub3QgZm9yd2FyZHMgY29tcGF0aWJsZSB3aXRoXG4gIDE1Olx0XHQgIGV4dDM7IGl0IGlzIGJhc2VkIG9uIGV4dGVudCBtYXBzIGFuZCBpdCBzdXBwb3J0cyA0OC1iaXRcbiAgMTY6XHRcdCAgcGh5c2ljYWwgYmxvY2sgbnVtYmVycy4gIFRoZSBleHQ0IGZpbGVzeXN0ZW0gYWxzbyBzdXBwb3J0cyBkZWxheWVkXG4gIDE3Olx0XHQgIGFsbG9jYXRpb24sIHBlcnNpc3RlbnQgcHJlYWxsb2NhdGlvbiwgaGlnaCByZXNvbHV0aW9uIHRpbWUgc3RhbXBzLFxuICAxODpcdFx0ICBhbmQgYSBudW1iZXIgb2Ygb3RoZXIgZmVhdHVyZXMgdG8gaW1wcm92ZSBwZXJmb3JtYW5jZSBhbmQgc3BlZWRcbiAgMTk6XHRcdCAgdXAgZnNjayB0aW1lLiAgRm9yIG1vcmUgaW5mb3JtYXRpb24sIHBsZWFzZSBzZWUgdGhlIHdlYiBwYWdlcyBhdFxuICAyMDpcdFx0ICBodHRwOi8vZXh0NC53aWtpLmtlcm5lbC5vcmcuXG4gIDIxOlx0XG4gIDIyOlx0XHQgIFRoZSBleHQ0IGZpbGVzeXN0ZW0gc3VwcG9ydHMgbW91bnRpbmcgYW4gZXh0MyBmaWxlc3lzdGVtOyB3aGlsZSB0aGVyZVxuICAyMzpcdFx0ICBhcmUgc29tZSBwZXJmb3JtYW5jZSBnYWlucyBmcm9tIHRoZSBkZWxheWVkIGFsbG9jYXRpb24gYW5kIGlub2RlXG4gIDI0Olx0XHQgIHRhYmxlIHJlYWRhaGVhZCwgdGhlIGJlc3QgcGVyZm9ybWFuY2UgZ2FpbnMgcmVxdWlyZSBlbmFibGluZyBleHQ0XG4gIDI1Olx0XHQgIGZlYXR1cmVzIGluIHRoZSBmaWxlc3lzdGVtIHVzaW5nIHR1bmUyZnMsIG9yIGZvcm1hdHRpbmcgYSBuZXdcbiAgMjY6XHRcdCAgZmlsZXN5c3RlbSBhcyBhbiBleHQ0IGZpbGVzeXN0ZW0gaW5pdGlhbGx5LiBXaXRob3V0IGV4cGxpY2l0IGVuYWJsaW5nXG4gIDI3Olx0XHQgIG9mIGV4dDQgZmVhdHVyZXMsIHRoZSBvbiBkaXNrIGZpbGVzeXN0ZW0gZm9ybWF0IHN0YXlzIGZ1bGx5IGJhY2t3YXJkXG4gIDI4Olx0XHQgIGNvbXBhdGlibGUuXG4gIDI5Olx0XG4gIDMwOlx0XHQgIFRvIGNvbXBpbGUgdGhpcyBmaWxlIHN5c3RlbSBzdXBwb3J0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiBUaGVcbiAgMzE6XHRcdCAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGV4dDQuXG4gIDMyOlx0XG4gIDMzOlx0XHQgIElmIHVuc3VyZSwgc2F5IE4uXG4gIDM0Olx0XG4gIDM1Olx0Y29uZmlnIEVYVDRfVVNFX0ZPUl9FWFQyXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjQvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE0IDE0OjM5PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy44LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDE2MTU0CgkJCQkJCQlvdXRwdXQ6IDM4CgkJCQkJCQl0aG91Z2h0czogMzIKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgdGhpbmtpbmcgcHJvY2VzczoKCioqRGl2aW5nIGludG8gdGhlIGV4dDQgQ29kZWJhc2UqKgoKT2theSwgc28gSSBzZWUgYENPTkZJR19FWFQ0X0ZTYCwgdGhhdCYjMzk7cyB0aGUga2VybmVsIGNvbmZpZ3VyYXRpb24gb3B0aW9uLiBNeSBpbW1lZGlhdGUgaW5zdGluY3QgaXMgdG8gZGlnIGludG8gdGhlIGNvbnRleHQgb2YgYGV4dDRfZXh0X2NsZWFyX2JiYC4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgaXRzIHJvbGUgd2l0aGluIHRoZSBsYXJnZXIgZXh0NCBmaWxlc3lzdGVtIGltcGxlbWVudGF0aW9uLiBJIHdhbnQgdG8gc2VlIGhvdyB0aGlzIGZ1bmN0aW9uIGlzIHVzZWQsIGhvdyBpdCBpbnRlcmFjdHMgd2l0aCBvdGhlciBwYXJ0cyBvZiB0aGUgZXh0NCBjb2RlLCBhbmQgd2hhdCBpdHMgc3BlY2lmaWMgcHVycG9zZSBpcyB3aXRoaW4gdGhlIGxhcmdlciBhcmNoaXRlY3R1cmUuIEkgbmVlZCB0aGUgZnVsbCBwaWN0dXJlIHRvIHVuZGVyc3RhbmQgaXRzIHNpZ25pZmljYW5jZS4gTGV0JiMzOTtzIGdldCBjcmFja2luZy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yNS8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTQgMTQ6NDA8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtmcy9leHQ0L2V4dGVudHMuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDYzMzUsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogNjUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7NjMzNTpcdFx0ZXh0NF9mcmVlX2V4dF9wYXRoKHBhdGgyKTtcbjYzMzY6XHRcdHJldHVybiAwO1xuNjMzNzpcdH1cbjYzMzg6XHRcbjYzMzk6XHRpbnQgZXh0NF9leHRfY2xlYXJfYmIoc3RydWN0IGlub2RlICppbm9kZSlcbjYzNDA6XHR7XG42MzQxOlx0XHRzdHJ1Y3QgZXh0NF9leHRfcGF0aCAqcGF0aCA9IE5VTEw7XG42MzQyOlx0XHRzdHJ1Y3QgZXh0NF9leHRlbnQgKmV4O1xuNjM0MzpcdFx0ZXh0NF9sYmxrX3QgY3VyID0gMCwgZW5kO1xuNjM0NDpcdFx0aW50IGosIHJldCA9IDA7XG42MzQ1Olx0XHRzdHJ1Y3QgZXh0NF9tYXBfYmxvY2tzIG1hcDtcbjYzNDY6XHRcbjYzNDc6XHRcdGlmIChleHQ0X3Rlc3RfaW5vZGVfZmxhZyhpbm9kZSwgRVhUNF9JTk9ERV9JTkxJTkVfREFUQSkpXG42MzQ4Olx0XHRcdHJldHVybiAwO1xuNjM0OTpcdFxuNjM1MDpcdFx0LyogRGV0ZXJtaW4gdGhlIHNpemUgb2YgdGhlIGZpbGUgZmlyc3QgKi9cbjYzNTE6XHRcdHBhdGggPSBleHQ0X2ZpbmRfZXh0ZW50KGlub2RlLCBFWFRfTUFYX0JMT0NLUyAtIDEsIE5VTEwsXG42MzUyOlx0XHRcdFx0XHRcdEVYVDRfRVhfTk9DQUNIRSk7XG42MzUzOlx0XHRpZiAoSVNfRVJSKHBhdGgpKVxuNjM1NDpcdFx0XHRyZXR1cm4gUFRSX0VSUihwYXRoKTtcbjYzNTU6XHRcdGV4ID0gcGF0aFtwYXRoLVx1MDAzZXBfZGVwdGhdLnBfZXh0O1xuNjM1NjpcdFx0aWYgKCFleClcbjYzNTc6XHRcdFx0Z290byBvdXQ7XG42MzU4Olx0XHRlbmQgPSBsZTMyX3RvX2NwdShleC1cdTAwM2VlZV9ibG9jaykgJiM0MzsgZXh0NF9leHRfZ2V0X2FjdHVhbF9sZW4oZXgpO1xuNjM1OTpcdFxuNjM2MDpcdFx0Y3VyID0gMDtcbjYzNjE6XHRcdHdoaWxlIChjdXIgXHUwMDNjIGVuZCkge1xuNjM2MjpcdFx0XHRtYXAubV9sYmxrID0gY3VyO1xuNjM2MzpcdFx0XHRtYXAubV9sZW4gPSBlbmQgLSBjdXI7XG42MzY0Olx0XHRcdHJldCA9IGV4dDRfbWFwX2Jsb2NrcyhOVUxMLCBpbm9kZSwgXHUwMDI2bWFwLCAwKTtcbjYzNjU6XHRcdFx0aWYgKHJldCBcdTAwM2MgMClcbjYzNjY6XHRcdFx0XHRnb3RvIG91dDtcbjYzNjc6XHRcdFx0aWYgKHJldCBcdTAwM2UgMCkge1xuNjM2ODpcdFx0XHRcdHBhdGggPSBleHQ0X2ZpbmRfZXh0ZW50KGlub2RlLCBtYXAubV9sYmxrLCBwYXRoLCAwKTtcbjYzNjk6XHRcdFx0XHRpZiAoSVNfRVJSKHBhdGgpKSB7XG42MzcwOlx0XHRcdFx0XHRyZXQgPSBQVFJfRVJSKHBhdGgpO1xuNjM3MTpcdFx0XHRcdFx0Z290byBvdXQ7XG42MzcyOlx0XHRcdFx0fVxuNjM3MzpcdFx0XHRcdGZvciAoaiA9IDA7IGogXHUwMDNjIHBhdGgtXHUwMDNlcF9kZXB0aDsgaiYjNDM7JiM0MzspIHtcbjYzNzQ6XHRcdFx0XHRcdGV4dDRfbWJfbWFya19iYihpbm9kZS1cdTAwM2VpX3NiLFxuNjM3NTpcdFx0XHRcdFx0XHRcdHBhdGhbal0ucF9ibG9jaywgMSwgZmFsc2UpO1xuNjM3NjpcdFx0XHRcdFx0cmV0ID0gZXh0NF9mY19yZWNvcmRfcmVnaW9ucyhpbm9kZS1cdTAwM2VpX3NiLFxuNjM3NzpcdFx0XHRcdFx0XHRcdFx0ICAgICBpbm9kZS1cdTAwM2VpX2lubywgMCxcbjYzNzg6XHRcdFx0XHRcdFx0XHRcdCAgICAgcGF0aFtqXS5wX2Jsb2NrLCAxLCAxKTtcbjYzNzk6XHRcdFx0XHRcdGlmIChyZXQpXG42MzgwOlx0XHRcdFx0XHRcdGdvdG8gb3V0O1xuNjM4MTpcdFx0XHRcdH1cbjYzODI6XHRcdFx0XHRleHQ0X21iX21hcmtfYmIoaW5vZGUtXHUwMDNlaV9zYiwgbWFwLm1fcGJsaywgbWFwLm1fbGVuLCBmYWxzZSk7XG42MzgzOlx0XHRcdFx0cmV0ID0gZXh0NF9mY19yZWNvcmRfcmVnaW9ucyhpbm9kZS1cdTAwM2VpX3NiLCBpbm9kZS1cdTAwM2VpX2lubyxcbjYzODQ6XHRcdFx0XHRcdFx0XHQgICAgIG1hcC5tX2xibGssIG1hcC5tX3BibGssIG1hcC5tX2xlbiwgMSk7XG42Mzg1Olx0XHRcdFx0aWYgKHJldClcbjYzODY6XHRcdFx0XHRcdGdvdG8gb3V0O1xuNjM4NzpcdFx0XHR9XG42Mzg4Olx0XHRcdGN1ciA9IGN1ciAmIzQzOyBtYXAubV9sZW47XG42Mzg5Olx0XHR9XG42MzkwOlx0XG42MzkxOlx0b3V0OlxuNjM5MjpcdFx0ZXh0NF9mcmVlX2V4dF9wYXRoKHBhdGgpO1xuNjM5MzpcdFx0cmV0dXJuIHJldCBcdTAwM2MgMCA/IHJldCA6IDA7XG42Mzk0Olx0fVxuNjM5NTpcdFxuNjM5NjpcdCNpZiBJU19FTkFCTEVEKENPTkZJR19FWFQ0X0tVTklUX1RFU1RTKVxuNjM5NzpcdGludCBleHQ0X2V4dF9zcGFjZV9yb290X2lkeF90ZXN0KHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBjaGVjaylcbjYzOTg6XHR7XG42Mzk5Olx0XHRyZXR1cm4gZXh0NF9leHRfc3BhY2Vfcm9vdF9pZHgoaW5vZGUsIGNoZWNrKTtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yNi8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTQgMTQ6NDA8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjgtZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTc0MjEKCQkJCQkJCW91dHB1dDogMzIKCQkJCQkJCXRob3VnaHRzOiAzNzkKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIHRoZSBFeHQ0IEJsb2NrIENsZWFyaW5nIExvZ2ljKioKCk9rYXksIGxldCYjMzk7cyBicmVhayB0aGlzIGRvd24uIEkmIzM5O20gbG9va2luZyBhdCB0aGUgYGV4dDRfZXh0X2NsZWFyX2JiYCBmdW5jdGlvbiwgc3BlY2lmaWNhbGx5IGhvdyBpdCBoYW5kbGVzIHBvdGVudGlhbCBlcnJvcnMuIFRoZSBjb3JlIGxvZ2ljIGl0ZXJhdGVzIHRocm91Z2ggZXh0ZW50cywgYW5kIHRoZSBjcnVjaWFsIHRoaW5nIGlzIGhvdyBpdCBoYW5kbGVzIHRoZSByZXR1cm4gdmFsdWVzLiBJZiBpdCBmaW5kcyBhICYjMzk7aG9sZSYjMzk7IChgcmV0ID09IDBgKSwgaXQgY29ycmVjdGx5IGluY3JlbWVudHMgYGN1cmAgYnkgdGhlIG1hcCBsZW5ndGguIElmIGl0IGZpbmRzIGJsb2NrcyAoYHJldCAmZ3Q7IDBgKSwgdGhhdCYjMzk7cyBnb29kLiBCdXQgaGVyZSYjMzk7cyB0aGUga2lja2VyOiBhbiBlcnJvciAoYHJldCAmbHQ7IDBgKSBub3cganVtcHMgZGlyZWN0bHkgdG8gYG91dGAgaW5zdGVhZCBvZiBhIGZsYXdlZCBlYXJsaWVyIGFwcHJvYWNoLgoKVGhlIG9yaWdpbmFsIGNvZGUmIzM5O3MgZXJyb3IgaGFuZGxpbmcgc2VlbWVkIHN1c3BlY3QuIElmIGBleHQ0X2ZpbmRfZXh0ZW50YCByZXR1cm5lZCBhbiBlcnJvciwgdGhlIGNvZGUgKnByZXZpb3VzbHkqIHdvdWxkIHRyeSB0byBjb250aW51ZSB1c2luZyBwb3RlbnRpYWxseSBpbnZhbGlkIGRhdGEgaW4gYG1hcGAgLSBhbmQgdGhlbiBjYWxsIGBleHQ0X2ZpbmRfZXh0ZW50YCBhZ2FpbiB3aXRoIGEgbnVsbCBwYXRoLiBUaGF04oCZcyBhIHJlY2lwZSBmb3IgZGlzYXN0ZXIhIFRoZSAqZml4KiBpcyBub3cgdG8gcHJvcGVybHkgcmV0dXJuIHRoZSBlcnJvciwgYW5kIGp1bXAgb3V0LgoKVGhlIGNvZGUgbm93IGFsc28gZXhwbGljaXRseSBjaGVja3MgZm9yIGVycm9ycyBmcm9tIGBleHQ0X2ZjX3JlY29yZF9yZWdpb25zYCwganVtcGluZyB0byBgb3V0YCBpZiBpdCBmYWlscy4gVGhlIGBvdXRgIGxhYmVsIHByb3Blcmx5IGZyZWVzIHRoZSBgcGF0aGAg4oCTIGl0IGhhbmRsZXMgY2FzZXMgd2hlcmUgYHBhdGhgIGlzIGFuIGVycm9yIG9yIG51bGwgd2l0aCBgZXh0NF9mcmVlX2V4dF9wYXRoYCwgYW5kIHRoZSByZXR1cm4gdmFsdWUgaXMgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIGlmIHRoZXJlIHdhcyBvbmUsIG90aGVyd2lzZSBpdCByZXR1cm5zIDAuCgpUaGUgY2FsbCB0byBgZXh0NF9leHRfY2xlYXJfYmJgIGluIGBleHQ0X2ZjX3JlcGxheV9pbm9kZWAgaXMgY2xlYW4g4oCTIGl0IGNvcnJlY3RseSBjaGVja3MgdGhlIHJldHVybiB2YWx1ZSBhbmQgZXhpdHMgb24gZXJyb3IsIGZyZWVpbmcgdGhlIGlub2RlLiBUaGUgaW50ZW50IGlzIGNsZWFyLgoKVG8gZ2V0IHRoZSBmdWxsIHBpY3R1cmUsIEkgbmVlZCB0byBjaGVjayB0aGUgZ2l0IGxvZyB0byB1bmRlcnN0YW5kIHRoZSBjb250ZXh0IG9mIHRoaXMgY2hhbmdlLiBJIG5lZWQgdG8ga25vdyAqd2hhdCogcHJvYmxlbSB0aGlzIGNvbW1pdCBzcGVjaWZpY2FsbHkgYWRkcmVzc2VzLCB3aGF0IHRoZSBvcmlnaW5hbCBidWcgd2FzLCBhbmQgd2hhdCBlZGdlIGNhc2VzIHRoZSBuZXcgbG9naWMgY29ycmVjdHMuIEkgbmVlZCB0byB1bmRlcnN0YW5kIHdoeSB0aGlzIHdhcyBjaGFuZ2VkLCBhbmQgaG93IHRoZSBjaGFuZ2VzIGltcHJvdmUgcmVsaWFiaWxpdHkgYW5kIGNvcnJlY3RuZXNzLCBhbmQgaG93IHRoaXMgcmVsYXRlcyB0byBGYXN0IENvbW1pdC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yNy8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTQgMTQ6NDA8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7ZXh0NF9leHRfY2xlYXJfYmImIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtmcy9leHQ0JiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2ZzL2V4dDQvZXh0NC5oPTM5NTc9ZXh0ZXJuIGludCBleHQ0X2V4dF9yZXBsYXlfdXBkYXRlX2V4KHN0cnVjdCBpbm9kZSAqaW5vZGUsIGV4dDRfbGJsa190IHN0YXJ0LFxuZnMvZXh0NC9leHQ0LmgtMzk1OC1cdFx0aW50IGxlbiwgaW50IHVud3JpdHRlbiwgZXh0NF9mc2Jsa190IHBibGspO1xuZnMvZXh0NC9leHQ0Lmg6Mzk1OTpleHRlcm4gaW50IGV4dDRfZXh0X2NsZWFyX2JiKHN0cnVjdCBpbm9kZSAqaW5vZGUpO1xuZnMvZXh0NC9leHQ0LmgtMzk2MC1cbi0tXG5mcy9leHQ0L2V4dGVudHMuYz02MjUyPWludCBleHQ0X2V4dF9yZXBsYXlfc2V0X2libG9ja3Moc3RydWN0IGlub2RlICppbm9kZSlcbi0tXG5mcy9leHQ0L2V4dGVudHMuYy02MzM4LVxuZnMvZXh0NC9leHRlbnRzLmM6NjMzOTppbnQgZXh0NF9leHRfY2xlYXJfYmIoc3RydWN0IGlub2RlICppbm9kZSlcbmZzL2V4dDQvZXh0ZW50cy5jLTYzNDAte1xuLS1cbmZzL2V4dDQvZmFzdF9jb21taXQuYz0xOTI1PXN0YXRpYyBpbnQgZXh0NF9mY19yZXBsYXlfaW5vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYixcbi0tXG5mcy9leHQ0L2Zhc3RfY29tbWl0LmMtMTk0My1cdGlmICghSVNfRVJSKGlub2RlKSkge1xuZnMvZXh0NC9mYXN0X2NvbW1pdC5jOjE5NDQ6XHRcdHJldCA9IGV4dDRfZXh0X2NsZWFyX2JiKGlub2RlKTtcbmZzL2V4dDQvZmFzdF9jb21taXQuYy0xOTQ1LVx0XHRpcHV0KGlub2RlKTtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yOC8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTQgMTQ6NDA8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjgtZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTg2MTQKCQkJCQkJCW91dHB1dDogMzkKCQkJCQkJCXRob3VnaHRzOiAzMDkKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqRnV6emluZyBFeHQ0OiBXb3J0aCBJdCBhbmQgSG93IHRvIEFwcHJvYWNoIEl0KioKCk9rYXksIHNvIHRoZSBxdWVzdGlvbiBpcywgY2FuIHdlIGFjdHVhbGx5IGhpdCB0aGlzIGNvZGUgd2l0aCBhIGZ1enplciBsaWtlIHN5emthbGxlciBpbiBhIHN0YW5kYXJkIHNldHVwPyBUaGUgYW5zd2VyJiMzOTtzIGEgcmVzb3VuZGluZyB5ZXMhIEV4dDQgaXMgYSBiZWRyb2NrIGZpbGVzeXN0ZW0gaW4gTGludXgsIHNvIGl0JiMzOTtzIGEgcHJpbWUgdGFyZ2V0LiBTcGVjaWZpY2FsbHksIGlmIHdlIG1vdW50IGFuIGV4dDQgaW1hZ2UgYW5kIHRyaWdnZXIgYSBmYXN0IGNvbW1pdCBsb2cgcmVwbGF5ICh3aGljaCBzeXprYWxsZXIgZG9lcyB3aXRoIHJhdyBmaWxlc3lzdGVtIGZ1enppbmcpLCB3ZSBjYW4gZ2V0IHJpZ2h0IGludG8gYGV4dDRfZmNfcmVwbGF5YCAtJmd0OyBgZXh0NF9mY19yZXBsYXlfaW5vZGVgIC0mZ3Q7IGBleHQ0X2V4dF9jbGVhcl9iYmAuIEZhc3QgY29tbWl0IG9wZXJhdGlvbnMgY2FuIGFsc28gcG9wIHVwIGR1cmluZyByb3V0aW5lIGZpbGVzeXN0ZW0gb3BlcmF0aW9ucywgbGlrZSB3aGVuIGBmc3luY2AgaXMgY2FsbGVkLgoKVGhlIGtleSBoZXJlIGlzIHRoYXQgdGhpcyBpcyBjb3JlIGZpbGVzeXN0ZW0gY29kZSwgc2l0dGluZyByaWdodCBpbiBgZnMvZXh0NC9gLiBUaGlzIG1lYW5zIHdlJiMzOTtyZSB0YWxraW5nIGFib3V0IGZ1bmRhbWVudGFsIHN0dWZmIOKAkyBlcnJvciBoYW5kbGluZywgY29udHJvbCBmbG93LCBhbmQgcmVzb3VyY2UgY2xlYW51cCB3aXRoaW4gYGV4dDRfZXh0X2NsZWFyX2JiYCBhbmQgYGV4dDRfZmNfcmVwbGF5X2lub2RlYC4gVGhhdCBtYWtlcyBpdCBpbmhlcmVudGx5IGludGVyZXN0aW5nIGZyb20gYSBmdXp6aW5nIHBlcnNwZWN0aXZlLCBhbmQgdGhlIHBvdGVudGlhbCBmb3IgdW5jb3ZlcmluZyBidWdzIHNlZW1zIGhpZ2guIFRoZXJlZm9yZSwgV29ydGhGdXp6aW5nIGlzIFRSVUUuCgpOb3csIHdoaWNoIHN5bWJvbHMgc2hvdWxkIHdlIHByaW9yaXRpemU/IExldCYjMzk7cyB6b29tIGluIG9uIHRoZSBmdW5jdGlvbnMgZGlyZWN0bHkgbW9kaWZpZWQgb3IgZGlyZWN0bHkgY29ubmVjdGVkIHRvIHRoaXMgcG90ZW50aWFsIHZ1bG5lcmFiaWxpdHkuIFRoZSBtb2RpZmllZCBmdW5jdGlvbnMgYXJlOiBgZXh0NF9leHRfY2xlYXJfYmJgIChpbiBgZnMvZXh0NC9leHRlbnRzLmNgKSBhbmQgYGV4dDRfZmNfcmVwbGF5X2lub2RlYCAoaW4gYGZzL2V4dDQvZmFzdF9jb21taXQuY2ApLiBCdXQsIGFyZSB0aGVyZSBhbnkgb3RoZXIgZnVuY3Rpb25zIGludm9sdmVkPyBUaGUgY2FsbGVyIG9mIGBleHQ0X2ZjX3JlcGxheV9pbm9kZWAgaXMgYGV4dDRfZmNfcmVwbGF5YCwgd2hpY2ggaXMgYWxzbyBpbiBgZmFzdF9jb21taXQuY2AuIFNvIGxldCYjMzk7cyBhZGQgYGV4dDRfZmNfcmVwbGF5YCB0byBvdXIgbGlzdCB0byBleGFtaW5lLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI5LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xNCAxNDo0MDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O2ZzL2V4dDQvZmFzdF9jb21taXQuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDI1NzAsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogNDAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7MjU3MDpcdCAqIE1haW4gcmVjb3ZlcnkgcGF0aCBlbnRyeSBwb2ludC5cbjI1NzE6XHQgKiBUaGUgbWVhbmluZyBvZiByZXR1cm4gY29kZXMgaXMgc2ltaWxhciBhcyBhYm92ZS5cbjI1NzI6XHQgKi9cbjI1NzM6XHRzdGF0aWMgaW50IGV4dDRfZmNfcmVwbGF5KGpvdXJuYWxfdCAqam91cm5hbCwgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCxcbjI1NzQ6XHRcdFx0XHRcdGVudW0gcGFzc3R5cGUgcGFzcywgaW50IG9mZiwgdGlkX3QgZXhwZWN0ZWRfdGlkKVxuMjU3NTpcdHtcbjI1NzY6XHRcdHN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBqb3VybmFsLVx1MDAzZWpfcHJpdmF0ZTtcbjI1Nzc6XHRcdHN0cnVjdCBleHQ0X3NiX2luZm8gKnNiaSA9IEVYVDRfU0Ioc2IpO1xuMjU3ODpcdFx0c3RydWN0IGV4dDRfZmNfdGxfbWVtIHRsO1xuMjU3OTpcdFx0X191OCAqc3RhcnQsICplbmQsICpjdXIsICp2YWw7XG4yNTgwOlx0XHRpbnQgcmV0ID0gSkJEMl9GQ19SRVBMQVlfQ09OVElOVUU7XG4yNTgxOlx0XHRzdHJ1Y3QgZXh0NF9mY19yZXBsYXlfc3RhdGUgKnN0YXRlID0gXHUwMDI2c2JpLVx1MDAzZXNfZmNfcmVwbGF5X3N0YXRlO1xuMjU4MjpcdFx0c3RydWN0IGV4dDRfZmNfdGFpbCB0YWlsO1xuMjU4MzpcdFxuMjU4NDpcdFx0aWYgKHBhc3MgPT0gUEFTU19TQ0FOKSB7XG4yNTg1Olx0XHRcdHN0YXRlLVx1MDAzZWZjX2N1cnJlbnRfcGFzcyA9IFBBU1NfU0NBTjtcbjI1ODY6XHRcdFx0cmV0dXJuIGV4dDRfZmNfcmVwbGF5X3NjYW4oam91cm5hbCwgYmgsIG9mZiwgZXhwZWN0ZWRfdGlkKTtcbjI1ODc6XHRcdH1cbjI1ODg6XHRcbjI1ODk6XHRcdGlmIChzdGF0ZS1cdTAwM2VmY19jdXJyZW50X3Bhc3MgIT0gcGFzcykge1xuMjU5MDpcdFx0XHRzdGF0ZS1cdTAwM2VmY19jdXJyZW50X3Bhc3MgPSBwYXNzO1xuMjU5MTpcdFx0XHRzYmktXHUwMDNlc19tb3VudF9zdGF0ZSB8PSBFWFQ0X0ZDX1JFUExBWTtcbjI1OTI6XHRcdH1cbjI1OTM6XHRcdGlmICghc2JpLVx1MDAzZXNfZmNfcmVwbGF5X3N0YXRlLmZjX3JlcGxheV9udW1fdGFncykge1xuMjU5NDpcdFx0XHRleHQ0X2RlYnVnKFwmIzM0O1JlcGxheSBzdG9wc1xcblwmIzM0Oyk7XG4yNTk1Olx0XHRcdGV4dDRfZmNfc2V0X2JpdG1hcHNfYW5kX2NvdW50ZXJzKHNiKTtcbjI1OTY6XHRcdFx0cmV0dXJuIDA7XG4yNTk3Olx0XHR9XG4yNTk4Olx0XG4yNTk5Olx0I2lmZGVmIENPTkZJR19FWFQ0X0RFQlVHXG4yNjAwOlx0XHRpZiAoc2JpLVx1MDAzZXNfZmNfZGVidWdfbWF4X3JlcGxheSBcdTAwMjZcdTAwMjYgb2ZmIFx1MDAzZT0gc2JpLVx1MDAzZXNfZmNfZGVidWdfbWF4X3JlcGxheSkge1xuMjYwMTpcdFx0XHRwcl93YXJuKFwmIzM0O0Ryb3BwaW5nIGZjIGJsb2NrICVkIGJlY2F1c2UgbWF4X3JlcGxheSBzZXRcXG5cJiMzNDssIG9mZik7XG4yNjAyOlx0XHRcdHJldHVybiBKQkQyX0ZDX1JFUExBWV9TVE9QO1xuMjYwMzpcdFx0fVxuMjYwNDpcdCNlbmRpZlxuMjYwNTpcdFxuMjYwNjpcdFx0c3RhcnQgPSAodTggKiliaC1cdTAwM2ViX2RhdGE7XG4yNjA3Olx0XHRlbmQgPSBzdGFydCAmIzQzOyBqb3VybmFsLVx1MDAzZWpfYmxvY2tzaXplO1xuMjYwODpcdFxuMjYwOTpcdFx0Zm9yIChjdXIgPSBzdGFydDsgY3VyIFx1MDAzYz0gZW5kIC0gRVhUNF9GQ19UQUdfQkFTRV9MRU47XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzAvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE0IDE0OjQwPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4xbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy44LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDIwMDU4CgkJCQkJCQlvdXRwdXQ6IDE5MAoJCQkJCQkJdGhvdWdodHM6IDk3NgoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgZXh0NCBGYXN0IENvbW1pdCBSZXBsYXkgZm9yIEZ1enppbmcqKgoKQWxyaWdodCwgbGV0JiMzOTtzIGJyZWFrIGRvd24gdGhpcyBmYXN0IGNvbW1pdCByZXBsYXkgbG9naWMgaW4gZXh0NC4gRmlyc3QsIEkgbmVlZCB0byBjb25maXJtIHdoZXRoZXIgYGV4dDRfZmNfcmVwbGF5YCBpcyBzdGF0aWMgb3Igbm90LiBPa2F5LCBpdCYjMzk7cyBkZWZpbmVkIGFzIGBzdGF0aWMgaW50IGV4dDRfZmNfcmVwbGF5YC4gU28sIGluIHRoZSB2bWxpbnV4IGNvbnRleHQsIHN0YXRpYyBmdW5jdGlvbnMgKnNob3VsZCogaGF2ZSBzeW1ib2xzIHVubGVzcyB0aGV5IGdldCBpbmxpbmVkLiBHb29kIHRvIGtub3cuCgpOb3csIGBleHQ0X2V4dF9jbGVhcl9iYmAgaXMgbm9uLXN0YXRpYyAoYGludCBleHQ0X2V4dF9jbGVhcl9iYihzdHJ1Y3QgaW5vZGUgKmlub2RlKWApLCBhbmQgdGhhdCYjMzk7cyBpbXBvcnRhbnQuIFRoZW4gd2UgaGF2ZSBgZXh0NF9mY19yZXBsYXlfaW5vZGVgIHdoaWNoIGlzIGBzdGF0aWMgaW50IGV4dDRfZmNfcmVwbGF5X2lub2RlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBleHQ0X2ZjX3RsX21lbSAqdGwsIHU4ICp2YWwpYC4gSSBuZWVkIHRvIGZpZ3VyZSBvdXQgaWYgZWl0aGVyIGBleHQ0X2ZjX3JlcGxheWAgb3IgYGV4dDRfZmNfcmVwbGF5X2lub2RlYCBhcmUgbGlrZWx5IHRvIGJlIGlubGluZWQsIG9yIGlmIHRoZXkmIzM5O3JlIGNvbXBsZXggZW5vdWdoIHRvIHByZXNlcnZlIHRoZWlyIHN5bWJvbHMuCgpgZXh0NF9mY19yZXBsYXlfaW5vZGVgIGlzIGFyb3VuZCAxMDAgbGluZXMgbG9uZywgc28gaXQmIzM5O3MgcHJvYmFibHkgbm90IGdldHRpbmcgaW5saW5lZC4gSG93ZXZlciwgYGV4dDRfZXh0X2NsZWFyX2JiYCBpcyBleHBvcnRlZCBpbiBleHQ0LmggYW5kIGlzIG5vbi1zdGF0aWMsIHNvIGl0cyBzeW1ib2wgKm11c3QqIGJlIHByZXNlbnQuIE5vdywgSSBoYXZlIHRvIGNoZWNrIGBleHQ0X2ZjX3JlcGxheWAsIHRoYXQmIzM5O3MgYW4gaW1wb3J0YW50IG9uZS4gVGhlIGNvcmUgZnVuY3Rpb25zIEkmIzM5O20gaW50ZXJlc3RlZCBpbiBmb3IgZnV6emluZyBhcmUsIGluIGVzc2VuY2U6IGBleHQ0X2V4dF9jbGVhcl9iYmAsIGBleHQ0X2ZjX3JlcGxheV9pbm9kZWAsIGFuZCBgZXh0NF9mY19yZXBsYXlgLiBUaGVzZSB0aHJlZSBzZWVtIHRvIGJlIHRoZSBtb3N0IHNwZWNpZmljIHRvIHRoaXMgZmFzdCBjb21taXQgcmVwbGF5IGxvZ2ljLgoKTm93LCBsZXQmIzM5O3MgY2hlY2sgd2hhdCBjb25maWd1cmF0aW9uIG9wdGlvbnMgYXJlIHJlcXVpcmVkIHRvIGVuYWJsZSB0aGVzZS4gYGV4dDRfZXh0X2NsZWFyX2JiYCBhbmQgYGV4dDRfZmNfcmVwbGF5X2lub2RlYCBhcmUgcGFydCBvZiBleHQ0LiAgT2YgY291cnNlLCBgQ09ORklHX0VYVDRfRlNgIGlzIGEgaGFyZCByZXF1aXJlbWVudC4gQXJlIHRoZXJlIGFueSBvdGhlciBzcGVjaWZpYyBjb25maWdzIG5lZWRlZD8gTGV0JiMzOTtzIGNoZWNrIHRoZSBgZnMvZXh0NC9NYWtlZmlsZWAuCgpPa2F5LCBzbzoKYGBgbWFrZQpvYmotJChDT05GSUdfRVhUNF9GUykgJiM0Mzs9IGV4dDQubwpleHQ0LXkJOj0gYmFsbG9jLm8gYml0bWFwLm8gYmxvY2tfdmFsaWRpdHkubyBkaXIubyBleHQ0X2piZDIubyBleHRlbnRzLm8gXAoJCWV4dGVudHNfc3RhdHVzLm8gZmlsZS5vIGZzbWFwLm8gZnN5bmMubyBoYXNoLm8gaWFsbG9jLm8gXAoJCWluZGlyZWN0Lm8gaW5saW5lLm8gaW5vZGUubyBpb2N0bC5vIG1iYWxsb2MubyBtaWdyYXRlLm8gXAoJCW1tcC5vIG1vdmVfZXh0ZW50Lm8gbmFtZWkubyBwYWdlLWlvLm8gcmVhZHBhZ2UubyByZXNpemUubyBcCgkJc3VwZXIubyBzeW1saW5rLm8gc3lzZnMubyB4YXR0ci5vIHhhdHRyX2h1cmQubyB4YXR0cl90cnVzdGVkLm8gXAoJCXhhdHRyX3VzZXIubyBmYXN0X2NvbW1pdC5vIG9ycGhhbi5vCmBgYAoKQm90aCBgZXh0ZW50cy5vYCBhbmQgYGZhc3RfY29tbWl0Lm9gIGFyZSBpbmNsdWRlZCBpbiBgZXh0NC15YCB3aGVuIGBDT05GSUdfRVhUNF9GU2AgaXMgZW5hYmxlZC4gTGV0JiMzOTtzIG1ha2Ugc3VyZSBuZWl0aGVyIGBleHQ0X2V4dF9jbGVhcl9iYmAgbm9yIGBleHQ0X2ZjX3JlcGxheV9pbm9kZWAgaGF2ZSBhbnkgY29uZGl0aW9uYWwgY29tcGlsYXRpb24gZGlyZWN0aXZlcyAoYCNpZmRlZmApIGFyb3VuZCB0aGVtLgoKQ2hlY2tpbmcgYGZzL2V4dDQvZXh0ZW50cy5jYCBmb3IgYGV4dDRfZXh0X2NsZWFyX2JiYDogTGluZSA2MzM5OiBgaW50IGV4dDRfZXh0X2NsZWFyX2JiKHN0cnVjdCBpbm9kZSAqaW5vZGUpYCAtIG5vIGAjaWZkZWZgIGRpcmVjdGl2ZXMgYXJvdW5kIGl0LiBHb29kLgoKTm93LCBpbiBgZnMvZXh0NC9mYXN0X2NvbW1pdC5jYCBmb3IgYGV4dDRfZmNfcmVwbGF5X2lub2RlYDogTGluZSAxOTI1OiBgc3RhdGljIGludCBleHQ0X2ZjX3JlcGxheV9pbm9kZWAgLSBhZ2Fpbiwgbm8gYCNpZmRlZmAgYXJvdW5kIGl0LiBMb29rcyBsaWtlIGBFWFQ0X0ZTYCBpcyB0aGUgb25seSByZXF1aXJlbWVudCwgdGhhbmtmdWxseS4KCk9rYXksIGxldCYjMzk7cyBkb3VibGUtY2hlY2sgZXZlcnl0aGluZyBmb3IgY2xhcml0eToKCjEuICAqKldvcnRoRnV6emluZzogVHJ1ZSoqLiBUaGUgcGF0Y2ggZml4ZXMgZXJyb3IgaGFuZGxpbmcgaW4gZmFzdCBjb21taXQgbG9nIHJlcGxheS4gUHJldmlvdXNseSwgaW4gYGV4dDRfZXh0X2NsZWFyX2JiKClgLCBjZXJ0YWluIGVycm9ycyB3ZXJlIGJlaW5nIGlnbm9yZWQsIHBvdGVudGlhbGx5IGxlYWRpbmcgdG8gYW4gaW52YWxpZCBzdGF0ZS4gTm93LCBlcnJvcnMgYXJlIHByb3BhZ2F0ZWQsIGFuZCBgZXh0NF9mY19yZXBsYXlfaW5vZGUoKWAgY2hlY2tzIHRoZSByZXR1cm4gY29kZSBvZiBgZXh0NF9leHRfY2xlYXJfYmIoKWAgYW5kIGFib3J0cyByZXBsYXkgaWYgYW4gZXJyb3IgaXMgZGV0ZWN0ZWQuIFRoaXMgY29kZSBwYXRoIGlzIHVzZWQgZHVyaW5nIGpvdXJuYWwgcmVjb3ZlcnkvcmVwbGF5IG9uIGV4dDQgbW91bnRzLCB3aGljaCBpcyBleGVyY2lzZWQgaW4gZmlsZXN5c3RlbSBmdXp6aW5nIHNjZW5hcmlvcy4KCjIuICAqKkZvY3VzU3ltYm9sczoqKiBJIG5lZWQgdG8gdGFyZ2V0OgogICAgKiAgIGBleHQ0X2V4dF9jbGVhcl9iYmAKICAgICogICBgZXh0NF9mY19yZXBsYXlfaW5vZGVgCiAgICAqICAgYAoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzEvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE0IDE0OjQyPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+c2V0LXJlc3VsdHM8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtFWFQ0X0ZTJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7ZXh0NF9leHRfY2xlYXJfYmImIzM0OywKICAgICYjMzQ7ZXh0NF9mY19yZXBsYXlfaW5vZGUmIzM0OywKICAgICYjMzQ7ZXh0NF9mY19yZXBsYXkmIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggbW9kaWZpZXMgZXJyb3IgaGFuZGxpbmcgYW5kIGNvbnRyb2wgZmxvdyBpbiBleHQ0IGZhc3QgY29tbWl0IHJlcGxheSBsb2dpYy4gSW4gZXh0NF9leHRfY2xlYXJfYmIoKSwgZXJyb3JzIGZyb20gZXh0NF9tYXBfYmxvY2tzKCksIGV4dDRfZmluZF9leHRlbnQoKSwgYW5kIGV4dDRfZmNfcmVjb3JkX3JlZ2lvbnMoKSBhcmUgbm93IHByb3Blcmx5IGNhcHR1cmVkIGFuZCByZXR1cm5lZCBpbnN0ZWFkIG9mIGJlaW5nIGlnbm9yZWQuIEFkZGl0aW9uYWxseSwgZXh0NF9mY19yZXBsYXlfaW5vZGUoKSBub3cgY2hlY2tzIHRoZSByZXR1cm4gdmFsdWUgb2YgZXh0NF9leHRfY2xlYXJfYmIoKSBhbmQgYWJvcnRzIHJlcGxheSBvbiBlcnJvci4gVGhpcyByZWFjaGFibGUgZmlsZXN5c3RlbSByZWNvdmVyeSBwYXRoIHNob3VsZCBiZSBmdXp6ZWQgdG8gdmVyaWZ5IHRoYXQgZXJyb3IgY29uZGl0aW9ucyBhbmQgcGF0aCBjbGVhbnVwIGJlaGF2ZSBjb3JyZWN0bHkgd2l0aG91dCBsZWFrcyBvciB1bmV4cGVjdGVkIHBhbmljcy4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7RVhUNF9GUyYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O2V4dDRfZXh0X2NsZWFyX2JiJiMzNDssCiAgICAmIzM0O2V4dDRfZmNfcmVwbGF5X2lub2RlJiMzNDssCiAgICAmIzM0O2V4dDRfZmNfcmVwbGF5JiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIG1vZGlmaWVzIGVycm9yIGhhbmRsaW5nIGFuZCBjb250cm9sIGZsb3cgaW4gZXh0NCBmYXN0IGNvbW1pdCByZXBsYXkgbG9naWMuIEluIGV4dDRfZXh0X2NsZWFyX2JiKCksIGVycm9ycyBmcm9tIGV4dDRfbWFwX2Jsb2NrcygpLCBleHQ0X2ZpbmRfZXh0ZW50KCksIGFuZCBleHQ0X2ZjX3JlY29yZF9yZWdpb25zKCkgYXJlIG5vdyBwcm9wZXJseSBjYXB0dXJlZCBhbmQgcmV0dXJuZWQgaW5zdGVhZCBvZiBiZWluZyBpZ25vcmVkLiBBZGRpdGlvbmFsbHksIGV4dDRfZmNfcmVwbGF5X2lub2RlKCkgbm93IGNoZWNrcyB0aGUgcmV0dXJuIHZhbHVlIG9mIGV4dDRfZXh0X2NsZWFyX2JiKCkgYW5kIGFib3J0cyByZXBsYXkgb24gZXJyb3IuIFRoaXMgcmVhY2hhYmxlIGZpbGVzeXN0ZW0gcmVjb3ZlcnkgcGF0aCBzaG91bGQgYmUgZnV6emVkIHRvIHZlcmlmeSB0aGF0IGVycm9yIGNvbmRpdGlvbnMgYW5kIHBhdGggY2xlYW51cCBiZWhhdmUgY29ycmVjdGx5IHdpdGhvdXQgbGVha3Mgb3IgdW5leHBlY3RlZCBwYW5pY3MuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzIvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE0IDE0OjQyPC90ZD4KCQkJPHRkPmFjdGlvbjwvdGQ+CgkJCTx0ZD5JZjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjVtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zMy8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTQgMTQ6NDI8L3RkPgoJCQk8dGQ+YWdlbnQ8L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+NW08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Y29yZTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtLTVNBTlJlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBpbXByb3ZlcyBlcnJvciBoYW5kbGluZyBpbiBleHQ0IGZhc3QgY29tbWl0IHJlcGxheSBjb2RlIChmcy9leHQ0L2V4dGVudHMuYyBhbmQgZnMvZXh0NC9mYXN0X2NvbW1pdC5jKS4gU3BlY2lmaWNhbGx5LCBleHQ0X2V4dF9jbGVhcl9iYigpIG5vdyBwcm9wZXJseSBwcm9wYWdhdGVzIGVycm9yIHJldHVybiBjb2RlcyBmcm9tIGV4dDRfbWFwX2Jsb2NrcygpLCBleHQ0X2ZpbmRfZXh0ZW50KCksIGFuZCBleHQ0X2ZjX3JlY29yZF9yZWdpb25zKCksIHJhdGhlciB0aGFuIGlnbm9yaW5nIGVycm9ycyBhbmQgdW5jb25kaXRpb25hbGx5IHJldHVybmluZyAwLiBBZGRpdGlvbmFsbHksIGV4dDRfZmNfcmVwbGF5X2lub2RlKCkgbm93IGNoZWNrcyB0aGUgcmV0dXJuIHZhbHVlIG9mIGV4dDRfZXh0X2NsZWFyX2JiKCkgYW5kIGFib3J0cyBvbiBlcnJvci5cblxuVGhlcmUgYXJlIG5vIHVuaW5pdGlhbGl6ZWQgdmFyaWFibGVzIG9yIHN0cnVjdCBmaWVsZHMgaW50cm9kdWNlZCBvciBtb2RpZmllZCwgbm8gY29waWVzIHRvIHVzZXIgc3BhY2Ugb3IgcG90ZW50aWFsIGluZm8tbGVha3MsIGFuZCBubyBicmFuY2hpbmcgb24gdW5pbml0aWFsaXplZCBtZW1vcnkuIEFsbCB2YXJpYWJsZXMgaW52b2x2ZWQgKGUuZy4gcmV0LCBwYXRoKSBhcmUgcHJvcGVybHkgaW5pdGlhbGl6ZWQgYmVmb3JlIHVzZS4gQ29uc2VxdWVudGx5LCB0aGlzIGNoYW5nZSBkb2VzIG5vdCBleHBvc2UgYW55IHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJpc2tzIGRldGVjdGFibGUgYnkgS01TQU4uIFN0YW5kYXJkIEtBU0FOIGZ1enppbmcgYW5kIHRlc3Qgc3VpdGVzIGFyZSBmdWxseSBhZGVxdWF0ZS4mIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+SW5zdHJ1Y3Rpb246PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Zb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgc2VjdXJpdHkgZW5naW5lZXIgc3BlY2lhbGl6aW5nIGluIGtlcm5lbCBtZW1vcnkKZXJyb3IgZGV0ZWN0b3JzIChLQVNBTiBhbmQgS01TQU4pLiBZb3VyIGpvYiBpcyB0byByZXZpZXcgdGhlIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQKZGV0ZXJtaW5lIGlmIHRoZSBjb2RlIGNoYW5nZXMganVzdGlmeSBzcGF3bmluZyBhIGRlZGljYXRlZCBLTVNBTiAoS2VybmVsTWVtb3J5U2FuaXRpemVyKQpmdXp6aW5nIHNlc3Npb24gaW4gYWRkaXRpb24gdG8gc3RhbmRhcmQgS0FTQU4gZnV6emluZy4KCkNSSVRJQ0FMIERJU1RJTkNUSU9OIEJFVFdFRU4gS0FTQU4gQU5EIEtNU0FOOgotIFN0YW5kYXJkIEtBU0FOIGtlcm5lbCBidWlsZHMgKHVwc3RyZWFtLWFwcGFybW9yLWthc2FuLmNvbmZpZykgYWxyZWFkeSBlbmFibGUKICBhIGNvbXByZWhlbnNpdmUgc3VpdGUgb2YgZGVidWdnaW5nIHRvb2xzIGFuZCBzYW5pdGl6ZXJzLCBpbmNsdWRpbmcgS0FTQU4KICAob3V0LW9mLWJvdW5kcyBhY2Nlc3NlcywgdXNlLWFmdGVyLWZyZWUsIGRvdWJsZSBmcmVlLCBpbnZhbGlkIGZyZWUpLCBMT0NLREVQCiAgKGxvY2tpbmcgYnVncyBhbmQgZGVhZGxvY2tzKSwgVUItc2FuaXRpemVycywgYW5kIG1lbW9yeSBjb3JydXB0aW9uIGNoZWNrcy4KLSBLTVNBTiAoS2VybmVsTWVtb3J5U2FuaXRpemVyKSBkZXRlY3RzIHJlYWRzIG9mIFVOSU5JVElBTElaRUQgbWVtb3J5IChzdGFjaywgaGVhcCwKICBvciBwYWdlIGFsbG9jYXRpb25zKSBhbmQga2VybmVsLXRvLXVzZXIgbWVtb3J5IGluZm8tbGVha3MuCgpSdWxlOiBUSEVSRSBJUyBOTyBTRU5TRSBJTiBSVU5OSU5HIEEgS01TQU4gU0VTU0lPTiBJRiBBIEJVRyBDQU4gQkUgQ0FVR0hUIEJZIEtBU0FOLApMT0NLREVQLCBPUiBPVEhFUiBTVEFOREFSRCBCVUcgREVURUNUT1JTLgpBIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaW5jdXJzIHNpZ25pZmljYW50IHJlc291cmNlIGNvc3RzLiBZb3UgbXVzdCBPTkxZCnNldCBOZWVkc0tNU0FOPXRydWUgaWYgdGhlIGNvZGUgY2hhbmdlcyBpbnRyb2R1Y2Ugb3IgZXhwb3NlIFVOSU5JVElBTElaRUQgTUVNT1JZIHJpc2tzCnRoYXQgYXJlIGRldGVjdGVkIE9OTFkgYnkgS01TQU4uCgpMb29rIGhvbGlzdGljYWxseSBhdCB0aGUgcGF0Y2ggc2VyaWVzIGFuZCBzdXJyb3VuZGluZyBjb2RlLiBFdmVuIGlmIG5vIGRpcmVjdAp1bmluaXRpYWxpemVkIGZpZWxkIGFjY2Vzc2VzIG9yIG5ldyBidWZmZXIgYWxsb2NhdGlvbnMgYXJlIGFkZGVkIGluIHRoZSBkaWZmIGl0c2VsZiwKYSBwYXRjaCBtYXkgYWx0ZXIgY29udHJvbCBmbG93LCBib3VuZHMgY2hlY2tpbmcsIG9yIGRhdGEgbGVuZ3RoIGNhbGN1bGF0aW9ucyBpbiB3YXlzCnRoYXQgY2hhbmdlIGhvdyB0aGUgcmVzdCBvZiB0aGUgY29kZSBvcGVyYXRlcyBvbiBleGlzdGluZyBidWZmZXJzIChlLmcuIGFsbG93aW5nCnVuaW5pdGlhbGl6ZWQgc3RhY2svaGVhcCBtZW1vcnkgdG8gYmUgcmVhZCwgY29waWVkIHRvIHVzZXIgc3BhY2UsIG9yIHVzZWQgaW4gY29udHJvbApmbG93KS4gRG8gbm90IGhlc2l0YXRlIHRvIHVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUsCmNhbGxlZCBmdW5jdGlvbnMsIGFuZCBjYWxsZXJzLgoKU2V0IE5lZWRzS01TQU49dHJ1ZSBPTkxZIElGIHRoZSBwYXRjaCBpbnRyb2R1Y2VzIG9yIG1vZGlmaWVzOgoxLiBLZXJuZWwgc3RydWN0dXJlcyBzZW50IHRvIHVzZXIgc3BhY2UgKHZpYSBjb3B5X3RvX3VzZXIsIHB1dF91c2VyLCBuZXRsaW5rIHNrYgogICBhdHRyaWJ1dGVzLCBpb2N0bCBvdXRwdXQgYXJndW1lbnRzLCBzb2NrZXQgb3B0aW9ucywgb3IgQlBGIGJ1ZmZlcnMpIHdoZXJlIGZpZWxkcwogICBvciBzdHJ1Y3R1cmUgcGFkZGluZyBtaWdodCBub3QgYmUgZnVsbHkgaW5pdGlhbGl6ZWQvemVyb2VkLgoyLiBDb25kaXRpb25hbCBsb2dpYyBvciBicmFuY2hpbmcgdGhhdCBkZXBlbmRzIG9uIHBvdGVudGlhbGx5IHVuaW5pdGlhbGl6ZWQgdmFyaWFibGVzCiAgIG9yIHN0cnVjdCBmaWVsZHMuCjMuIEFsbG9jYXRpb24gb3IgaW5pdGlhbGl6YXRpb24gb2YgY29tcGxleCBkYXRhIHN0cnVjdHVyZXMgd2hlcmUgdW5pbml0aWFsaXplZCBmaWVsZHMKICAgY291bGQgYmUgcmVhZCBsYXRlciBpbiByZWFjaGFibGUgY29kZSBwYXRocy4KNC4gQm91bmRzIGNoZWNrcywgbGVuZ3Rocywgb3IgbG9naWMgaW4gYSB3YXkgdGhhdCBhbGxvd3Mgc3Vycm91bmRpbmcgY29kZSB0byBhY2Nlc3MKICAgdW5pbml0aWFsaXplZCBieXRlcyBvZiBleGlzdGluZyBidWZmZXJzLgoKU2V0IE5lZWRzS01TQU49ZmFsc2UgSUY6Ci0gVGhlIGNvZGUgY2hhbmdlcyBwcmltYXJpbHkgcmlzayBvdXQtb2YtYm91bmRzIGFjY2VzcywgYXJyYXkgb3ZlcmZsb3dzLCBOVUxMIHBvaW50ZXIKICBkZXJlZmVyZW5jZXMsIGxvY2tpbmcgZGVhZGxvY2tzLCBvciB1c2UtYWZ0ZXItZnJlZSBidWdzICh0aGVzZSBhcmUgYWxyZWFkeSBjYXVnaHQKICBieSBLQVNBTiwgTE9DS0RFUCwgb3Igc3RhbmRhcmQgYnVnIGRldGVjdG9ycykuCi0gQWxsIHN0YWNrL2hlYXAgc3RydWN0dXJlcyB0b3VjaGVkIG9yIGludHJvZHVjZWQgYnkgdGhlIHBhdGNoIGFyZSBmdWxseSB6ZXJvZWQKICBvciBpbml0aWFsaXplZCAoZS5nLiB1c2luZyA9IHswfSwgbWVtc2V0LCBremFsbG9jKSBiZWZvcmUgYmVpbmcgcmVhZCBvciBjb3BpZWQuCi0gVGhlIHBhdGNoIGRvZXMgbm90IGludHJvZHVjZSBhbnkgcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSB1c2FnZSBvciBpbmZvLWxlYWtzLgoKVXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gaW5zcGVjdCB0aGUgc3Vycm91bmRpbmcgY29kZSBpZiBuZWNlc3NhcnksIHRoZW4gcHJvdmlkZQpkZXRhaWxlZCBLTVNBTlJlYXNvbmluZyBjb250cmFzdGluZyBLQVNBTiB2cyBLTVNBTiBhcHBsaWNhYmlsaXR5IGZvciB0aGlzIHBhdGNoLgpQcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy4KCgpVc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLgpJdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS4KSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlByb21wdDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPlRhcmdldCBhcmNoaXRlY3R1cmU6IGFtZDY0CgpGb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczoKY29tbWl0IDMxM2Y1NTIzZjM3MGRkYzk2NGE0NTA1M2YwMDYwYzRmNGY4ZmNmMjgKQXV0aG9yOiBzeXotY2x1c3RlciAmbHQ7dHJpYWdlQHN5emthbGxlci5jb20mZ3Q7CkRhdGU6ICAgTW9uIFNlcCAxNCAxNDozNjowNCAyMDI2ICYjNDM7MDAwMAoKICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlldwoKZGlmZiAtLWdpdCBhL2ZzL2V4dDQvZXh0ZW50cy5jIGIvZnMvZXh0NC9leHRlbnRzLmMKaW5kZXggNzYwMzhiNmMzNjU1Mi4uZjY1ZDI1NGMwZDVlZSAxMDA2NDQKLS0tIGEvZnMvZXh0NC9leHRlbnRzLmMKJiM0MzsmIzQzOyYjNDM7IGIvZnMvZXh0NC9leHRlbnRzLmMKQEAgLTYzNjMsMjkgJiM0Mzs2MzYzLDM0IEBAIGludCBleHQ0X2V4dF9jbGVhcl9iYihzdHJ1Y3QgaW5vZGUgKmlub2RlKQogCQltYXAubV9sZW4gPSBlbmQgLSBjdXI7CiAJCXJldCA9IGV4dDRfbWFwX2Jsb2NrcyhOVUxMLCBpbm9kZSwgJmFtcDttYXAsIDApOwogCQlpZiAocmV0ICZsdDsgMCkKLQkJCWJyZWFrOwomIzQzOwkJCWdvdG8gb3V0OwogCQlpZiAocmV0ICZndDsgMCkgewogCQkJcGF0aCA9IGV4dDRfZmluZF9leHRlbnQoaW5vZGUsIG1hcC5tX2xibGssIHBhdGgsIDApOwotCQkJaWYgKCFJU19FUlIocGF0aCkpIHsKLQkJCQlmb3IgKGogPSAwOyBqICZsdDsgcGF0aC0mZ3Q7cF9kZXB0aDsgaiYjNDM7JiM0MzspIHsKLQkJCQkJZXh0NF9tYl9tYXJrX2JiKGlub2RlLSZndDtpX3NiLAotCQkJCQkJCXBhdGhbal0ucF9ibG9jaywgMSwgZmFsc2UpOwotCQkJCQlleHQ0X2ZjX3JlY29yZF9yZWdpb25zKGlub2RlLSZndDtpX3NiLCBpbm9kZS0mZ3Q7aV9pbm8sCi0JCQkJCQkJMCwgcGF0aFtqXS5wX2Jsb2NrLCAxLCAxKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCXBhdGggPSBOVUxMOwomIzQzOwkJCWlmIChJU19FUlIocGF0aCkpIHsKJiM0MzsJCQkJcmV0ID0gUFRSX0VSUihwYXRoKTsKJiM0MzsJCQkJZ290byBvdXQ7CiYjNDM7CQkJfQomIzQzOwkJCWZvciAoaiA9IDA7IGogJmx0OyBwYXRoLSZndDtwX2RlcHRoOyBqJiM0MzsmIzQzOykgewomIzQzOwkJCQlleHQ0X21iX21hcmtfYmIoaW5vZGUtJmd0O2lfc2IsCiYjNDM7CQkJCQkJcGF0aFtqXS5wX2Jsb2NrLCAxLCBmYWxzZSk7CiYjNDM7CQkJCXJldCA9IGV4dDRfZmNfcmVjb3JkX3JlZ2lvbnMoaW5vZGUtJmd0O2lfc2IsCiYjNDM7CQkJCQkJCSAgICAgaW5vZGUtJmd0O2lfaW5vLCAwLAomIzQzOwkJCQkJCQkgICAgIHBhdGhbal0ucF9ibG9jaywgMSwgMSk7CiYjNDM7CQkJCWlmIChyZXQpCiYjNDM7CQkJCQlnb3RvIG91dDsKIAkJCX0KIAkJCWV4dDRfbWJfbWFya19iYihpbm9kZS0mZ3Q7aV9zYiwgbWFwLm1fcGJsaywgbWFwLm1fbGVuLCBmYWxzZSk7Ci0JCQlleHQ0X2ZjX3JlY29yZF9yZWdpb25zKGlub2RlLSZndDtpX3NiLCBpbm9kZS0mZ3Q7aV9pbm8sCi0JCQkJCW1hcC5tX2xibGssIG1hcC5tX3BibGssIG1hcC5tX2xlbiwgMSk7CiYjNDM7CQkJcmV0ID0gZXh0NF9mY19yZWNvcmRfcmVnaW9ucyhpbm9kZS0mZ3Q7aV9zYiwgaW5vZGUtJmd0O2lfaW5vLAomIzQzOwkJCQkJCSAgICAgbWFwLm1fbGJsaywgbWFwLm1fcGJsaywgbWFwLm1fbGVuLCAxKTsKJiM0MzsJCQlpZiAocmV0KQomIzQzOwkJCQlnb3RvIG91dDsKIAkJfQogCQljdXIgPSBjdXIgJiM0MzsgbWFwLm1fbGVuOwogCX0KIAogb3V0OgogCWV4dDRfZnJlZV9leHRfcGF0aChwYXRoKTsKLQlyZXR1cm4gMDsKJiM0MzsJcmV0dXJuIHJldCAmbHQ7IDAgPyByZXQgOiAwOwogfQogCiAjaWYgSVNfRU5BQkxFRChDT05GSUdfRVhUNF9LVU5JVF9URVNUUykKZGlmZiAtLWdpdCBhL2ZzL2V4dDQvZmFzdF9jb21taXQuYyBiL2ZzL2V4dDQvZmFzdF9jb21taXQuYwppbmRleCAwY2FjODkwY2YzNzAyLi5hYjcyNjNiNGY5ZTQ2IDEwMDY0NAotLS0gYS9mcy9leHQ0L2Zhc3RfY29tbWl0LmMKJiM0MzsmIzQzOyYjNDM7IGIvZnMvZXh0NC9mYXN0X2NvbW1pdC5jCkBAIC0xOTQxLDggJiM0MzsxOTQxLDExIEBAIHN0YXRpYyBpbnQgZXh0NF9mY19yZXBsYXlfaW5vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKIAogCWlub2RlID0gZXh0NF9pZ2V0KHNiLCBpbm8sIEVYVDRfSUdFVF9OT1JNQUwpOwogCWlmICghSVNfRVJSKGlub2RlKSkgewotCQlleHQ0X2V4dF9jbGVhcl9iYihpbm9kZSk7CiYjNDM7CQlyZXQgPSBleHQ0X2V4dF9jbGVhcl9iYihpbm9kZSk7CiAJCWlwdXQoaW5vZGUpOwomIzQzOwkJaW5vZGUgPSBOVUxMOwomIzQzOwkJaWYgKHJldCkKJiM0MzsJCQlnb3RvIG91dDsKIAl9CiAJaW5vZGUgPSBOVUxMOwogCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjM0LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xNCAxNDo0MjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MW08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuOC1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyODM4CgkJCQkJCQlvdXRwdXQ6IDM4CgkJCQkJCQl0aG91Z2h0czogMTIzCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyB0aGUgQ29kZSBDaGFuZ2VzKioKCk9rYXksIGxldCYjMzk7cyBkaXZlIGludG8gdGhpcy4gRmlyc3QsIEkgbmVlZCB0byB1bmRlcnN0YW5kIHdoYXQgdGhpcyBkaWZmIGlzIGFjdHVhbGx5IGRvaW5nLiBJdCBsb29rcyBsaWtlIHRoZSBjb3JlIG9mIHRoZSBjaGFuZ2VzIGFyZSBjZW50ZXJlZCBhcm91bmQgYGZzL2V4dDQvZXh0ZW50cy5jYCwgc3BlY2lmaWNhbGx5IGBleHQ0X2V4dF9jbGVhcl9iYmAsIGFuZCBhbHNvIHRvdWNoZXMgYGZzL2V4dDQvZmFzdF9jb21taXQuY2Agd2l0aCB0aGUgYGV4dDRfZmNfcmVwbGF5X2lub2RlYCBmdW5jdGlvbi4gSW50ZXJlc3RpbmcsIHNvIHdlJiMzOTtyZSBsb29raW5nIGF0IGV4dGVudCBoYW5kbGluZyBhbmQgcG90ZW50aWFsbHkgZmFzdCBjb21taXQgZnVuY3Rpb25hbGl0eS4KCk5vdywgSSYjMzk7bGwgdXNlIHRoZSBgcmVhZC1maWxlYCBjb21tYW5kIHRvIHB1bGwgdXAgdGhlIHJlbGV2YW50IHBhcnRzIG9mIHRoZSBgZXh0ZW50cy5jYCBmaWxlIGFuZCBzcGVjaWZpY2FsbHkgZm9jdXMgb24gdGhlIGFyZWEgYXJvdW5kIGBleHQ0X2V4dF9jbGVhcl9iYmAuIFVuZGVyc3RhbmRpbmcgdGhlIGNvbnRleHQgb2YgdGhhdCBmdW5jdGlvbiBpcyBrZXksIGFzIGlzIHRoZSByb2xlIG9mIGBleHQ0X2ZjX3JlcGxheV9pbm9kZWAgaW4gYGZhc3RfY29tbWl0LmNgLiBDb250ZXh0IGlzIGV2ZXJ5dGhpbmcsIHNvIHNlZWluZyB0aGUgc3Vycm91bmRpbmcgY29kZSB3aWxsIGxpa2VseSBiZSBjcnVjaWFsIHRvIGRldGVybWluZSB0aGUgbmF0dXJlIG9mIHRoaXMgcGF0Y2ggYW5kIGl0cyBwb3RlbnRpYWwgaW1wbGljYXRpb25zLiBJIG5lZWQgdG8gcXVpY2tseSBncmFzcCB0aGUgaW50ZXJhY3Rpb24gYmV0d2VlbiB0aGVzZSB0d28gZnVuY3Rpb25zIGFuZCB3aGF0IHRoaXMgY2hhbmdlIGlzIHRyeWluZyB0byBhY2hpZXZlLiBMZXQmIzM5O3MgZ2V0IHJlYWRpbmcuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzUvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE0IDE0OjQzPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7ZnMvZXh0NC9leHRlbnRzLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiA2MzQwLAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDcwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OzYzNDA6XHR7XG42MzQxOlx0XHRzdHJ1Y3QgZXh0NF9leHRfcGF0aCAqcGF0aCA9IE5VTEw7XG42MzQyOlx0XHRzdHJ1Y3QgZXh0NF9leHRlbnQgKmV4O1xuNjM0MzpcdFx0ZXh0NF9sYmxrX3QgY3VyID0gMCwgZW5kO1xuNjM0NDpcdFx0aW50IGosIHJldCA9IDA7XG42MzQ1Olx0XHRzdHJ1Y3QgZXh0NF9tYXBfYmxvY2tzIG1hcDtcbjYzNDY6XHRcbjYzNDc6XHRcdGlmIChleHQ0X3Rlc3RfaW5vZGVfZmxhZyhpbm9kZSwgRVhUNF9JTk9ERV9JTkxJTkVfREFUQSkpXG42MzQ4Olx0XHRcdHJldHVybiAwO1xuNjM0OTpcdFxuNjM1MDpcdFx0LyogRGV0ZXJtaW4gdGhlIHNpemUgb2YgdGhlIGZpbGUgZmlyc3QgKi9cbjYzNTE6XHRcdHBhdGggPSBleHQ0X2ZpbmRfZXh0ZW50KGlub2RlLCBFWFRfTUFYX0JMT0NLUyAtIDEsIE5VTEwsXG42MzUyOlx0XHRcdFx0XHRcdEVYVDRfRVhfTk9DQUNIRSk7XG42MzUzOlx0XHRpZiAoSVNfRVJSKHBhdGgpKVxuNjM1NDpcdFx0XHRyZXR1cm4gUFRSX0VSUihwYXRoKTtcbjYzNTU6XHRcdGV4ID0gcGF0aFtwYXRoLVx1MDAzZXBfZGVwdGhdLnBfZXh0O1xuNjM1NjpcdFx0aWYgKCFleClcbjYzNTc6XHRcdFx0Z290byBvdXQ7XG42MzU4Olx0XHRlbmQgPSBsZTMyX3RvX2NwdShleC1cdTAwM2VlZV9ibG9jaykgJiM0MzsgZXh0NF9leHRfZ2V0X2FjdHVhbF9sZW4oZXgpO1xuNjM1OTpcdFxuNjM2MDpcdFx0Y3VyID0gMDtcbjYzNjE6XHRcdHdoaWxlIChjdXIgXHUwMDNjIGVuZCkge1xuNjM2MjpcdFx0XHRtYXAubV9sYmxrID0gY3VyO1xuNjM2MzpcdFx0XHRtYXAubV9sZW4gPSBlbmQgLSBjdXI7XG42MzY0Olx0XHRcdHJldCA9IGV4dDRfbWFwX2Jsb2NrcyhOVUxMLCBpbm9kZSwgXHUwMDI2bWFwLCAwKTtcbjYzNjU6XHRcdFx0aWYgKHJldCBcdTAwM2MgMClcbjYzNjY6XHRcdFx0XHRnb3RvIG91dDtcbjYzNjc6XHRcdFx0aWYgKHJldCBcdTAwM2UgMCkge1xuNjM2ODpcdFx0XHRcdHBhdGggPSBleHQ0X2ZpbmRfZXh0ZW50KGlub2RlLCBtYXAubV9sYmxrLCBwYXRoLCAwKTtcbjYzNjk6XHRcdFx0XHRpZiAoSVNfRVJSKHBhdGgpKSB7XG42MzcwOlx0XHRcdFx0XHRyZXQgPSBQVFJfRVJSKHBhdGgpO1xuNjM3MTpcdFx0XHRcdFx0Z290byBvdXQ7XG42MzcyOlx0XHRcdFx0fVxuNjM3MzpcdFx0XHRcdGZvciAoaiA9IDA7IGogXHUwMDNjIHBhdGgtXHUwMDNlcF9kZXB0aDsgaiYjNDM7JiM0MzspIHtcbjYzNzQ6XHRcdFx0XHRcdGV4dDRfbWJfbWFya19iYihpbm9kZS1cdTAwM2VpX3NiLFxuNjM3NTpcdFx0XHRcdFx0XHRcdHBhdGhbal0ucF9ibG9jaywgMSwgZmFsc2UpO1xuNjM3NjpcdFx0XHRcdFx0cmV0ID0gZXh0NF9mY19yZWNvcmRfcmVnaW9ucyhpbm9kZS1cdTAwM2VpX3NiLFxuNjM3NzpcdFx0XHRcdFx0XHRcdFx0ICAgICBpbm9kZS1cdTAwM2VpX2lubywgMCxcbjYzNzg6XHRcdFx0XHRcdFx0XHRcdCAgICAgcGF0aFtqXS5wX2Jsb2NrLCAxLCAxKTtcbjYzNzk6XHRcdFx0XHRcdGlmIChyZXQpXG42MzgwOlx0XHRcdFx0XHRcdGdvdG8gb3V0O1xuNjM4MTpcdFx0XHRcdH1cbjYzODI6XHRcdFx0XHRleHQ0X21iX21hcmtfYmIoaW5vZGUtXHUwMDNlaV9zYiwgbWFwLm1fcGJsaywgbWFwLm1fbGVuLCBmYWxzZSk7XG42MzgzOlx0XHRcdFx0cmV0ID0gZXh0NF9mY19yZWNvcmRfcmVnaW9ucyhpbm9kZS1cdTAwM2VpX3NiLCBpbm9kZS1cdTAwM2VpX2lubyxcbjYzODQ6XHRcdFx0XHRcdFx0XHQgICAgIG1hcC5tX2xibGssIG1hcC5tX3BibGssIG1hcC5tX2xlbiwgMSk7XG42Mzg1Olx0XHRcdFx0aWYgKHJldClcbjYzODY6XHRcdFx0XHRcdGdvdG8gb3V0O1xuNjM4NzpcdFx0XHR9XG42Mzg4Olx0XHRcdGN1ciA9IGN1ciAmIzQzOyBtYXAubV9sZW47XG42Mzg5Olx0XHR9XG42MzkwOlx0XG42MzkxOlx0b3V0OlxuNjM5MjpcdFx0ZXh0NF9mcmVlX2V4dF9wYXRoKHBhdGgpO1xuNjM5MzpcdFx0cmV0dXJuIHJldCBcdTAwM2MgMCA/IHJldCA6IDA7XG42Mzk0Olx0fVxuNjM5NTpcdFxuNjM5NjpcdCNpZiBJU19FTkFCTEVEKENPTkZJR19FWFQ0X0tVTklUX1RFU1RTKVxuNjM5NzpcdGludCBleHQ0X2V4dF9zcGFjZV9yb290X2lkeF90ZXN0KHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBjaGVjaylcbjYzOTg6XHR7XG42Mzk5Olx0XHRyZXR1cm4gZXh0NF9leHRfc3BhY2Vfcm9vdF9pZHgoaW5vZGUsIGNoZWNrKTtcbjY0MDA6XHR9XG42NDAxOlx0RVhQT1JUX1NZTUJPTF9GT1JfRVhUNF9URVNUKGV4dDRfZXh0X3NwYWNlX3Jvb3RfaWR4X3Rlc3QpO1xuNjQwMjpcdFxuNjQwMzpcdHN0cnVjdCBleHQ0X2V4dF9wYXRoICpleHQ0X3NwbGl0X2NvbnZlcnRfZXh0ZW50c190ZXN0KGhhbmRsZV90ICpoYW5kbGUsXG42NDA0Olx0XHRcdFx0c3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGV4dDRfbWFwX2Jsb2NrcyAqbWFwLFxuNjQwNTpcdFx0XHRcdHN0cnVjdCBleHQ0X2V4dF9wYXRoICpwYXRoLCBpbnQgZmxhZ3MsXG42NDA2Olx0XHRcdFx0dW5zaWduZWQgaW50ICphbGxvY2F0ZWQpXG42NDA3Olx0e1xuNjQwODpcdFx0cmV0dXJuIGV4dDRfc3BsaXRfY29udmVydF9leHRlbnRzKGhhbmRsZSwgaW5vZGUsIG1hcCwgcGF0aCxcbjY0MDk6XHRcdFx0XHRcdFx0ICBmbGFncywgYWxsb2NhdGVkKTtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zNi8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTQgMTQ6NDM8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjgtZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNDQyMQoJCQkJCQkJb3V0cHV0OiAzOQoJCQkJCQkJdGhvdWdodHM6IDI1CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IHN1bW1hcnksIGFzIGlmIEkgd2VyZSB0aGlua2luZyB0aGVzZSB0aG91Z2h0czoKCioqRXhhbWluaW5nIGBmcy9leHQ0L2Zhc3RfY29tbWl0LmNgIGZvciBDbHVlcyoqCgpPa2F5LCBJJiMzOTttIGRpdmluZyBpbnRvIHRoaXMgaXNzdWUsIGFuZCBhIGNydWNpYWwgYXJlYSB0byBpbnZlc3RpZ2F0ZSBmdXJ0aGVyIGlzIGxpa2VseSBgZnMvZXh0NC9mYXN0X2NvbW1pdC5jYC4gU3BlY2lmaWNhbGx5LCBsaW5lIDE5NDEgYW5kIGFyb3VuZCB0aGVyZSBzZWVtcyBsaWtlIGEgcG90ZW50aWFsIGhvdHNwb3QuIEdpdmVuIHRoZSBuYXR1cmUgb2YgdGhlIHByb2JsZW0sIEkgc3VzcGVjdCB0aGUgZmFzdCBjb21taXQgbG9naWMgbWlnaHQgYmUgaW52b2x2ZWQuIE15IGh5cG90aGVzaXMgaXMgdGhhdCBzb21ldGhpbmcgd2l0aGluIHRoYXQgcGFydGljdWxhciBzZWN0aW9uIGNvdWxkIGJlIGNvbnRyaWJ1dGluZyB0byB0aGUgb2JzZXJ2ZWQgYmVoYXZpb3IsIHNvIGxldCYjMzk7cyBjYXJlZnVsbHkgcmV2aWV3IHRoZSBzdXJyb3VuZGluZyBjb2RlIGZvciBjbHVlcy4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhlIGludGVyYWN0aW9ucyBhcm91bmQgdGhhdCBwb2ludCB0byBzZWUgaWYgdGhlcmUmIzM5O3MgYSBjb25jdXJyZW5jeSBpc3N1ZSwgYSByYWNlIGNvbmRpdGlvbiwgb3IgYSBzdWJ0bGUgYnVnIHJlbGF0ZWQgdG8gZGF0YSBzeW5jaHJvbml6YXRpb24uCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzcvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE0IDE0OjQ0PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7ZnMvZXh0NC9mYXN0X2NvbW1pdC5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMTkzMCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiA0MAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsxOTMwOlx0XHRzdHJ1Y3QgZXh0NF9pbm9kZSAqcmF3X2ZjX2lub2RlO1xuMTkzMTpcdFx0c3RydWN0IGlub2RlICppbm9kZSA9IE5VTEw7XG4xOTMyOlx0XHRzdHJ1Y3QgZXh0NF9pbG9jIGlsb2M7XG4xOTMzOlx0XHRpbnQgaW5vZGVfbGVuLCBpbm8sIHJldCwgdGFnID0gdGwtXHUwMDNlZmNfdGFnO1xuMTkzNDpcdFx0c3RydWN0IGV4dDRfZXh0ZW50X2hlYWRlciAqZWg7XG4xOTM1Olx0XHRzaXplX3Qgb2ZmX2dlbiA9IG9mZnNldG9mKHN0cnVjdCBleHQ0X2lub2RlLCBpX2dlbmVyYXRpb24pO1xuMTkzNjpcdFxuMTkzNzpcdFx0bWVtY3B5KFx1MDAyNmZjX2lub2RlLCB2YWwsIHNpemVvZihmY19pbm9kZSkpO1xuMTkzODpcdFxuMTkzOTpcdFx0aW5vID0gbGUzMl90b19jcHUoZmNfaW5vZGUuZmNfaW5vKTtcbjE5NDA6XHRcdHRyYWNlX2V4dDRfZmNfcmVwbGF5KHNiLCB0YWcsIGlubywgMCwgMCk7XG4xOTQxOlx0XG4xOTQyOlx0XHRpbm9kZSA9IGV4dDRfaWdldChzYiwgaW5vLCBFWFQ0X0lHRVRfTk9STUFMKTtcbjE5NDM6XHRcdGlmICghSVNfRVJSKGlub2RlKSkge1xuMTk0NDpcdFx0XHRyZXQgPSBleHQ0X2V4dF9jbGVhcl9iYihpbm9kZSk7XG4xOTQ1Olx0XHRcdGlwdXQoaW5vZGUpO1xuMTk0NjpcdFx0XHRpbm9kZSA9IE5VTEw7XG4xOTQ3Olx0XHRcdGlmIChyZXQpXG4xOTQ4Olx0XHRcdFx0Z290byBvdXQ7XG4xOTQ5Olx0XHR9XG4xOTUwOlx0XHRpbm9kZSA9IE5VTEw7XG4xOTUxOlx0XG4xOTUyOlx0XHRyZXQgPSBleHQ0X2ZjX3JlY29yZF9tb2RpZmllZF9pbm9kZShzYiwgaW5vKTtcbjE5NTM6XHRcdGlmIChyZXQpXG4xOTU0Olx0XHRcdGdvdG8gb3V0O1xuMTk1NTpcdFxuMTk1NjpcdFx0cmF3X2ZjX2lub2RlID0gKHN0cnVjdCBleHQ0X2lub2RlICopXG4xOTU3Olx0XHRcdCh2YWwgJiM0Mzsgb2Zmc2V0b2Yoc3RydWN0IGV4dDRfZmNfaW5vZGUsIGZjX3Jhd19pbm9kZSkpO1xuMTk1ODpcdFx0cmV0ID0gZXh0NF9nZXRfZmNfaW5vZGVfbG9jKHNiLCBpbm8sIFx1MDAyNmlsb2MpO1xuMTk1OTpcdFx0aWYgKHJldClcbjE5NjA6XHRcdFx0Z290byBvdXQ7XG4xOTYxOlx0XG4xOTYyOlx0XHRpbm9kZV9sZW4gPSB0bC1cdTAwM2VmY19sZW4gLSBzaXplb2Yoc3RydWN0IGV4dDRfZmNfaW5vZGUpO1xuMTk2MzpcdFx0cmF3X2lub2RlID0gZXh0NF9yYXdfaW5vZGUoXHUwMDI2aWxvYyk7XG4xOTY0Olx0XG4xOTY1Olx0XHRtZW1jcHkocmF3X2lub2RlLCByYXdfZmNfaW5vZGUsIG9mZnNldG9mKHN0cnVjdCBleHQ0X2lub2RlLCBpX2Jsb2NrKSk7XG4xOTY2Olx0XHRtZW1jcHkoKHU4ICopcmF3X2lub2RlICYjNDM7IG9mZl9nZW4sICh1OCAqKXJhd19mY19pbm9kZSAmIzQzOyBvZmZfZ2VuLFxuMTk2NzpcdFx0ICAgICAgIGlub2RlX2xlbiAtIG9mZl9nZW4pO1xuMTk2ODpcdFx0aWYgKGxlMzJfdG9fY3B1KHJhd19pbm9kZS1cdTAwM2VpX2ZsYWdzKSBcdTAwMjYgRVhUNF9FWFRFTlRTX0ZMKSB7XG4xOTY5Olx0XHRcdGVoID0gKHN0cnVjdCBleHQ0X2V4dGVudF9oZWFkZXIgKikoXHUwMDI2cmF3X2lub2RlLVx1MDAzZWlfYmxvY2tbMF0pO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjM4LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xNCAxNDo0NDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuOC1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA1MzU3CgkJCQkJCQlvdXRwdXQ6IDM5CgkJCQkJCQl0aG91Z2h0czogMTQzNQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgdGhlIEZpeCBmb3IgUG90ZW50aWFsIFVuaW5pdGlhbGl6ZWQgTWVtb3J5IElzc3VlcyoqCgpPa2F5LCBsZXQmIzM5O3MgYnJlYWsgdGhpcyBkb3duLiBGaXJzdCwgSSBuZWVkIHRvIHVuZGVyc3RhbmQgd2hhdCB0aGUgb3JpZ2luYWwgcHJvYmxlbSB3YXMgYW5kIGhvdyB0aGUgcGF0Y2ggYWRkcmVzc2VzIGl0LiBUaGUgb3JpZ2luYWwgY29kZSBpbiBgZXh0NF9leHRfY2xlYXJfYmJgIGhhZCBhIGZldyBmbGF3cy4gVGhlIGBleHQ0X2ZpbmRfZXh0ZW50YCBmdW5jdGlvbiBjb3VsZCBmYWlsLCByZXR1cm5pbmcgYW4gZXJyb3IgKGBJU19FUlIocGF0aClgKSwgYnV0IHRoZSBjb2RlIHdvdWxkIHRoZW4gYmxpdGhlbHkgY29udGludWUsIHBvdGVudGlhbGx5IGxlYWRpbmcgdG8gaW5jb3JyZWN0IGJsb2NrIG1hcmtpbmcgYW5kIHJlcG9ydGluZy4gQ3J1Y2lhbGx5LCBlcnJvcnMgZnJvbSBgZXh0NF9mY19yZWNvcmRfcmVnaW9uc2Agd2VyZSBhbHNvIGlnbm9yZWQsIGFuZCB0aGUgZnVuY3Rpb24gYWx3YXlzIHJldHVybmVkIDAsIGV2ZW4gd2hlbiBzZXJpb3VzIGZhaWx1cmVzIG9jY3VycmVkIGVhcmxpZXIuIFRoZSBsaW5lIGBpZiAoSVNfRVJSKHBhdGgpKSByZXR1cm4gUFRSX0VSUihwYXRoKTtgIHNlZW1lZCB0byB0cnkgdG8gcmV0dXJuIGFuIGVycm9yLCBidXQgaXQgd2FzIGZvbGxvd2VkIGJ5IGEgYHJldHVybiAwO2AsIHRodXMgYmVpbmcgdXNlbGVzcy4gVGhlIGNhbGxpbmcgZnVuY3Rpb24sIGBleHQ0X2ZjX3JlcGxheV9pbm9kZWAsIGNvbXBvdW5kZWQgdGhlIGlzc3VlIGJ5IGlnbm9yaW5nIHRoZSByZXR1cm4gdmFsdWUgb2YgYGV4dDRfZXh0X2NsZWFyX2JiYC4KCk5vdywgdGhlIHBhdGNoIGFpbXMgdG8gZml4IHRoZXNlIHByb2JsZW1zIGJ5IGludHJvZHVjaW5nIHByb3BlciBlcnJvciBoYW5kbGluZy4gSWYgYGV4dDRfbWFwX2Jsb2Nrc2AgZmFpbHMsIGl0IGBnb3RvIG91dDtgLiBJZiBgZXh0NF9maW5kX2V4dGVudGAgZmFpbHMsIHRoZSBwYXRjaCBzZXRzIGByZXRgIGFuZCBgZ290byBvdXQ7YCwgYW5kIGltcG9ydGFudGx5LCB0aGUgcGF0Y2ggYWRkcyBjaGVja3MgYWZ0ZXIgYGV4dDRfZmNfcmVjb3JkX3JlZ2lvbnNgLiBGaW5hbGx5LCB0aGUgcGF0Y2ggY2hlY2tzIHRoZSByZXR1cm4gdmFsdWUgYW5kIHJldHVybnMgdGhlIG5lZ2F0aXZlIGVycm9yLiBUaGUgY2hhbmdlIGluIGBleHQ0X2ZjX3JlcGxheV9pbm9kZWAgbm93IGNvcnJlY3RseSBjaGVja3MgdGhlIHJldHVybiB2YWx1ZSBvZiBgZXh0NF9leHRfY2xlYXJfYmJgIGFuZCBleGl0cyBpZiBpdCYjMzk7cyBub24temVyby4KClRoZSBjb3JlIHF1ZXN0aW9uIG5vdyBpcyB3aGV0aGVyIHRoZXNlIGNoYW5nZXMgaW50cm9kdWNlIG9yIGV4cG9zZSB1bmluaXRpYWxpemVkIG1lbW9yeSByaXNrcy4gTGV0JiMzOTtzIHJlZmVyIHRvIHRoZSBLTVNBTiBydWxlcy4gVGhlIHJ1bGUgc3BlY2lmaWNhbGx5IHN0YXRlcyB0aGF0IEtNU0FOIHNob3VsZCBiZSB1c2VkIGlmIHRoZSBjb2RlIGNoYW5nZXMgbWlnaHQgcmV2ZWFsIG9yIGNyZWF0ZSB1bmluaXRpYWxpemVkIG1lbW9yeSByaXNrcyB0aGF0IGNhbm5vdCBiZSBjYXVnaHQgYnkgb3RoZXIgc3RhbmRhcmQgYnVnIGRldGVjdG9ycyBsaWtlIEtBU0FOIG9yIExPQ0tERVAuIFdlJiMzOTtyZSBsb29raW5nIGZvciBjb2RlIHRoYXQ6IDEpIHNlbmRzIHVuaW5pdGlhbGl6ZWQga2VybmVsIHN0cnVjdHVyZXMgdG8gdXNlcnNwYWNlOyAyKSBjb25kaXRpb25hbCBsb2dpYyBiYXNlZCBvbiBwb3RlbnRpYWxseSB1bmluaXRpYWxpemVkIHZhcmlhYmxlczsgMykgYWxsb2NhdGlvbi9pbml0aWFsaXphdGlvbiBvZiBjb21wbGV4IGRhdGEgc3RydWN0dXJlcyB3aXRoIGxhdGVyIHBvdGVudGlhbCBmb3IgcmVhZGluZyB1bmluaXRpYWxpemVkIGZpZWxkczsgb3IgNCkgYm91bmRzIGNoZWNrIGlzc3VlcyB0aGF0IGNvdWxkIGxlYWQgdG8gcmVhZGluZyB1bmluaXRpYWxpemVkIG1lbW9yeS4KCkxvb2tpbmcgYXQgdGhlIHZhcmlhYmxlcyB3aXRoaW4gYGV4dDRfZXh0X2NsZWFyX2JiYCwgYGpgIGFuZCBgcmV0YCBhcmUgaW5pdGlhbGl6ZWQuIFRoZSBgc3RydWN0IGV4dDRfbWFwX2Jsb2NrcyBtYXBgIGlzIGluaXRpYWxpemVkIGJ1dCBpdHMgZmllbGRzIGFyZSBtb2RpZmllZCBpbiBzdWJzZXF1ZW50IGNhbGxzLiBOb3RhYmx5LCBgZXh0NF9tYXBfYmxvY2tzYCBpcyBjYWxsZWQgYW5kIHBvdGVudGlhbGx5IHdyaXRlcyB0byBgbWFwYCYjMzk7cyBmaWVsZHMuIEhvd2V2ZXIsIHRoZSBleGlzdGluZyBjb2RlIGFscmVhZHkgd29ya2VkIHdpdGggdGhpcyBzdHJ1Y3R1cmUuIFRoZSBwYXRjaCBpdHNlbGYgZG9lc24mIzM5O3QgZnVuZGFtZW50YWxseSBjaGFuZ2UgaG93IGBtYXBgIGlzIHVzZWQ7IGl0IGNoYW5nZXMgdGhlIGVycm9yIGhhbmRsaW5nICphcm91bmQqIGl0LiBJbiBgZXh0NF9mY19yZXBsYXlfaW5vZGVgLCB0aGUgYHJldGAgdmFyaWFibGUgaXMgY29ycmVjdGx5IGhhbmRsZWQuIEluIHRoZSBvcmlnaW5hbCBjb2RlLCB0aGUgcmV0dXJuIHZhbHVlIG9mIGBleHQ0X2V4dF9jbGVhcl9iYmAgd2FzIGlnbm9yZWQuIFRoZSBwYXRjaCBkb2VzIG5vdCBjaGFuZ2UgdGhlIG1lbW9yeSBhbGxvY2F0aW9uIG9mIHRob3NlIHZhcmlhYmxlcy4gVGhlIGNvZGUgYXQgYG91dGAgd2lsbCBkZWFsIHdpdGggdGhlIHZhcmlhYmxlIGBwYXRoYCwgYnV0IHNpbmNlIHRoZSBwYXRjaCBhZGRlZCBlcnJvciBoYW5kbGluZywgdGhlIHZhcmlhYmxlIGBwYXRoYCBjYW4gYmUgYE5VTExgLgoKU28sIHRoZSBwYXRjaCByZWFsbHkgYWRkcmVzc2VzIGFuIGV4aXN0aW5nIGVycm9yLWhhbmRsaW5nIGRlZmljaWVuY3kgYW5kIGltcHJvdmVzIHRoZSByZWxpYWJpbGl0eSBvZiB0aGUgY29kZS4gV2UgYXJlIG5vdCBpbnRyb2R1Y2luZyB1bmluaXRpYWxpemVkIG1lbW9yeSByaXNrcy4gVGhlIHBhdGNoIGZvY3VzZXMgb24gY29ycmVjdCBlcnJvciBwcm9wYWdhdGlvbiBhbmQgZWFybHkgZXhpdHMsIHByZXZlbnRpbmcgZnVydGhlciBvcGVyYXRpb25zIHdoZW4gc29tZXRoaW5nIGdvZXMgd3JvbmcuIFRoZXJlZm9yZSwgYmFzZWQgb24gdGhlIEtNU0FOIGNyaXRlcmlhLCB0aGVyZSYjMzk7cyBubyBldmlkZW5jZSBvZiBhIG5ldyB1bmluaXRpYWxpemVkIG1lbW9yeSBleHBvc3VyZS4gV2UgYXJlIHNhZmUsIGZvciBub3cuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzkvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE0IDE0OjQ0PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7ZnMvZXh0NC9mYXN0X2NvbW1pdC5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMTk4MCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiA0MAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsxOTgwOlx0XHRcdFx0c2l6ZW9mKHJhd19pbm9kZS1cdTAwM2VpX2Jsb2NrKSk7XG4xOTgxOlx0XHR9XG4xOTgyOlx0XG4xOTgzOlx0XHQvKiBJbW1lZGlhdGVseSB1cGRhdGUgdGhlIGlub2RlIG9uIGRpc2suICovXG4xOTg0Olx0XHRyZXQgPSBleHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YShOVUxMLCBOVUxMLCBpbG9jLmJoKTtcbjE5ODU6XHRcdGlmIChyZXQpXG4xOTg2Olx0XHRcdGdvdG8gb3V0X2JyZWxzZTtcbjE5ODc6XHRcdHJldCA9IHN5bmNfZGlydHlfYnVmZmVyKGlsb2MuYmgpO1xuMTk4ODpcdFx0aWYgKHJldClcbjE5ODk6XHRcdFx0Z290byBvdXRfYnJlbHNlO1xuMTk5MDpcdFx0cmV0ID0gZXh0NF9tYXJrX2lub2RlX3VzZWQoc2IsIGlubyk7XG4xOTkxOlx0XHRpZiAocmV0KVxuMTk5MjpcdFx0XHRnb3RvIG91dF9icmVsc2U7XG4xOTkzOlx0XG4xOTk0Olx0XHQvKiBHaXZlbiB0aGF0IHdlIGp1c3Qgd3JvdGUgdGhlIGlub2RlIG9uIGRpc2ssIHRoaXMgU0hPVUxEIHN1Y2NlZWQuICovXG4xOTk1Olx0XHRpbm9kZSA9IGV4dDRfaWdldChzYiwgaW5vLCBFWFQ0X0lHRVRfTk9STUFMKTtcbjE5OTY6XHRcdGlmIChJU19FUlIoaW5vZGUpKSB7XG4xOTk3Olx0XHRcdGV4dDRfZGVidWcoXCYjMzQ7SW5vZGUgbm90IGZvdW5kLlwmIzM0Oyk7XG4xOTk4Olx0XHRcdGlub2RlID0gTlVMTDtcbjE5OTk6XHRcdFx0cmV0ID0gLUVGU0NPUlJVUFRFRDtcbjIwMDA6XHRcdFx0Z290byBvdXRfYnJlbHNlO1xuMjAwMTpcdFx0fVxuMjAwMjpcdFxuMjAwMzpcdFx0LypcbjIwMDQ6XHRcdCAqIE91ciBhbGxvY2F0b3IgY291bGQgaGF2ZSBtYWRlIGRpZmZlcmVudCBkZWNpc2lvbnMgdGhhbiBiZWZvcmVcbjIwMDU6XHRcdCAqIGNyYXNoaW5nLiBUaGlzIHNob3VsZCBiZSBmaXhlZCBidXQgdW50aWwgdGhlbiwgd2UgY2FsY3VsYXRlXG4yMDA2Olx0XHQgKiB0aGUgbnVtYmVyIG9mIGJsb2NrcyB0aGUgaW5vZGUuXG4yMDA3Olx0XHQgKi9cbjIwMDg6XHRcdGlmICghZXh0NF90ZXN0X2lub2RlX2ZsYWcoaW5vZGUsIEVYVDRfSU5PREVfSU5MSU5FX0RBVEEpKVxuMjAwOTpcdFx0XHRleHQ0X2V4dF9yZXBsYXlfc2V0X2libG9ja3MoaW5vZGUpO1xuMjAxMDpcdFxuMjAxMTpcdFx0aW5vZGUtXHUwMDNlaV9nZW5lcmF0aW9uID0gbGUzMl90b19jcHUoZXh0NF9yYXdfaW5vZGUoXHUwMDI2aWxvYyktXHUwMDNlaV9nZW5lcmF0aW9uKTtcbjIwMTI6XHRcdGV4dDRfcmVzZXRfaW5vZGVfc2VlZChpbm9kZSk7XG4yMDEzOlx0XG4yMDE0Olx0XHRleHQ0X2lub2RlX2NzdW1fc2V0KGlub2RlLCBleHQ0X3Jhd19pbm9kZShcdTAwMjZpbG9jKSwgRVhUNF9JKGlub2RlKSk7XG4yMDE1Olx0XHRyZXQgPSBleHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YShOVUxMLCBOVUxMLCBpbG9jLmJoKTtcbjIwMTY6XHRcdHN5bmNfZGlydHlfYnVmZmVyKGlsb2MuYmgpO1xuMjAxNzpcdG91dF9icmVsc2U6XG4yMDE4Olx0XHRicmVsc2UoaWxvYy5iaCk7XG4yMDE5Olx0b3V0OlxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQwLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xNCAxNDo0NDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MW08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuOC1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA4MjI2CgkJCQkJCQlvdXRwdXQ6IDIyCgkJCQkJCQl0aG91Z2h0czogMTczCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyB0aGUgYGV4dDRfZmNfcmVwbGF5X2lub2RlYCBDb2RlKioKCk9rYXksIGxldCYjMzk7cyBicmVhayB0aGlzIGRvd24uIEkmIzM5O20gbG9va2luZyBhdCB0aGUgYGV4dDRfZmNfcmVwbGF5X2lub2RlYCBmdW5jdGlvbiwgc3BlY2lmaWNhbGx5IHRoZSBleGl0IHBvaW50cy4gVGhlIGNvZGUgaGFzIGEgYGdvdG8gb3V0O2AgYW5kIGEgYGdvdG8gb3V0X2JyZWxzZTtgIGxhYmVsLiBUaGUgYG91dF9icmVsc2VgIGxhYmVsIHNpbXBseSBjYWxscyBgYnJlbHNlKGlsb2MuYmgpYC4gVGhlbiwgaW4gdGhlIGBvdXQ6YCBibG9jaywgd2UgaGF2ZSBgaXB1dChpbm9kZSlgIGFuZCBhIGByZXR1cm4gcmV0YC4KCk5vdywgdGhlIGludGVyZXN0aW5nIHBhcnQgaXMgdGhpcyBzZXF1ZW5jZToKCmBgYGMKCQlyZXQgPSBleHQ0X2V4dF9jbGVhcl9iYihpbm9kZSk7CgkJaXB1dChpbm9kZSk7CgkJaW5vZGUgPSBOVUxMOwoJCWlmIChyZXQpCgkJCWdvdG8gb3V0OwpgYGAKCkl0IGxvb2tzIGxpa2Ugd2UmIzM5O3JlIGNhbGxpbmcgYGV4dDRfZXh0X2NsZWFyX2JiKGlub2RlKWAsIHdoaWNoIGNvdWxkIHBvdGVudGlhbGx5IGZhaWwsIGluZGljYXRlZCBieSBgcmV0YC4gKkNydWNpYWxseSosIHRoZSBjb2RlIHRoZW4gY2FsbHMgYGlwdXQoaW5vZGUpYCwgc2V0cyBgaW5vZGVgIHRvIGBOVUxMYCwgKnRoZW4qIGp1bXBzIHRvIHRoZSBgb3V0YCBsYWJlbCBpZiBgcmV0YCBpbmRpY2F0ZXMgYW4gZXJyb3IuIFRoZSBrZXkgdGFrZWF3YXkgaGVyZSBpcyB0aGF0IGBpcHV0KGlub2RlKWAgaXMgY2FsbGVkICpiZWZvcmUqIGBpbm9kZWAgaXMgc2V0IHRvIGBOVUxMYCBzbywgaW4gdGhlIGZhaWx1cmUgY2FzZSwgdGhlIG5leHQgZXhlY3V0aW9uIHdpbGwgYmUgYGlwdXQoaW5vZGUpYCBhbmQgKnRoZW4qIHRoZSBpbm9kZSB3aWxsIGJlIHNldCB0byBgTlVMTGAuIFRoZSBjb2RlIHRoZW4gc2V0cyB0aGUgaW5vZGUgdG8gYE5VTExgICpiZWZvcmUqIHRoZSBgZ290byBvdXQ7YC4gU28sIGBpcHV0KE5VTEwpYCBtdXN0IGJlIGhhbmRsZWQgZ3JhY2VmdWxseSDigJMgaXQmIzM5O3MgbGlrZWx5IGEgbm8tb3AsIHdoaWNoIGlzIHN0YW5kYXJkIHByYWN0aWNlLiBUaGUgZnVuY3Rpb24gaXMgZGVzaWduZWQgdG8gaGFuZGxlIHRoZSBjYXNlIHdoZXJlIGBleHQ0X2V4dF9jbGVhcl9iYmAgcmV0dXJucyBhbiBlcnJvciwgY2xlYW5pbmcgdXAgcmVzb3VyY2VzIGJlZm9yZSByZXR1cm5pbmcgdGhlIGVycm9yIGNvZGUgYHJldGAuCgpTbywgdGhlIHJldHVybiBpcyBgcmV0YCwgd2hpY2ggc2VlbXMgbG9naWNhbC4KCkJ1dCwgSSYjMzk7bSBub3QgY2xlYXIgb24gdGhlIG9yaWdpbmFsIGJ1ZyB0aGF0IG5lY2Vzc2l0YXRlZCB0aGlzIHBhdGNoLiBMZXQmIzM5O3Mgc2VlIGlmIEkgY2FuIGZpbmQgbW9yZSBjb250ZXh0IHdpdGggYSBgZ2l0IGxvZ2Agc2VhcmNoIG9yIG1heWJlIGNoZWNrIGEgc3l6a2FsbGVyIGlzc3VlLiBLbm93aW5nIHRoZSBvcmlnaW5hbCBpc3N1ZSB3aWxsIHJlYWxseSBwdXQgdGhpcyBpbnRvIHBlcnNwZWN0aXZlLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQxLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xNCAxNDo0NTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtleHQ0X2V4dF9jbGVhcl9iYiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtmcy9leHQ0L2V4dDQuaD0zOTU3PWV4dGVybiBpbnQgZXh0NF9leHRfcmVwbGF5X3VwZGF0ZV9leChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBleHQ0X2xibGtfdCBzdGFydCxcbmZzL2V4dDQvZXh0NC5oLTM5NTgtXHRcdGludCBsZW4sIGludCB1bndyaXR0ZW4sIGV4dDRfZnNibGtfdCBwYmxrKTtcbmZzL2V4dDQvZXh0NC5oOjM5NTk6ZXh0ZXJuIGludCBleHQ0X2V4dF9jbGVhcl9iYihzdHJ1Y3QgaW5vZGUgKmlub2RlKTtcbmZzL2V4dDQvZXh0NC5oLTM5NjAtXG4tLVxuZnMvZXh0NC9leHRlbnRzLmM9NjI1Mj1pbnQgZXh0NF9leHRfcmVwbGF5X3NldF9pYmxvY2tzKHN0cnVjdCBpbm9kZSAqaW5vZGUpXG4tLVxuZnMvZXh0NC9leHRlbnRzLmMtNjMzOC1cbmZzL2V4dDQvZXh0ZW50cy5jOjYzMzk6aW50IGV4dDRfZXh0X2NsZWFyX2JiKHN0cnVjdCBpbm9kZSAqaW5vZGUpXG5mcy9leHQ0L2V4dGVudHMuYy02MzQwLXtcbi0tXG5mcy9leHQ0L2Zhc3RfY29tbWl0LmM9MTkyNT1zdGF0aWMgaW50IGV4dDRfZmNfcmVwbGF5X2lub2RlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsXG4tLVxuZnMvZXh0NC9mYXN0X2NvbW1pdC5jLTE5NDMtXHRpZiAoIUlTX0VSUihpbm9kZSkpIHtcbmZzL2V4dDQvZmFzdF9jb21taXQuYzoxOTQ0Olx0XHRyZXQgPSBleHQ0X2V4dF9jbGVhcl9iYihpbm9kZSk7XG5mcy9leHQ0L2Zhc3RfY29tbWl0LmMtMTk0NS1cdFx0aXB1dChpbm9kZSk7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NDIvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE0IDE0OjQ1PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4xbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy44LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDkyMjIKCQkJCQkJCW91dHB1dDogMjI2CgkJCQkJCQl0aG91Z2h0czogMzkzCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKk15IEFzc2Vzc21lbnQgb2YgVGhpcyBFcnJvciBIYW5kbGluZyBQYXRjaCoqCgpPa2F5LCBzbyBJJiMzOTt2ZSBiZWVuIHJldmlld2luZyB0aGlzIHBhdGNoLCBhbmQgaGVyZSYjMzk7cyBteSB1bmRlcnN0YW5kaW5nOiBpdCYjMzk7cyBhbGwgYWJvdXQgdGlnaHRlbmluZyB1cCBlcnJvciBoYW5kbGluZyB3aXRoaW4gdGhlIGV4dDQgZmlsZXN5c3RlbSwgc3BlY2lmaWNhbGx5IGluIHRoZSBmYXN0IGNvbW1pdCByZXBsYXkgbG9naWMuIFByZXZpb3VzbHksIGluIHRoZSBmdW5jdGlvbnMgYGV4dDRfZXh0X2NsZWFyX2JiYCBhbmQgaXRzIGNhbGxlciBgZXh0NF9mY19yZXBsYXlfaW5vZGVgLCBpZiBgZXh0NF9maW5kX2V4dGVudGAgZmFpbGVkLCBpdCBjb3VsZCBsZWFkIHRvIHNvbWUgcHJldHR5IG1lc3N5IGJlaGF2aW9yLiBXZSB3ZXJlIHNlZWluZyBgSVNfRVJSKHBhdGgpYCBjb21lIHVwLCBidXQgdGhlbiB0aGUgY29kZSB3YXMgYmxpbmRseSBzZXR0aW5nIGBwYXRoYCB0byBgTlVMTGAgYW5kIGNvbnRpbnVpbmcgb24sIHBvdGVudGlhbGx5IGNhbGxpbmcgb3RoZXIgZnVuY3Rpb25zIChgZXh0NF9tYl9tYXJrX2JiYCwgYGV4dDRfZmNfcmVjb3JkX3JlZ2lvbnNgKSBhbmQgY29tcGxldGVseSBpZ25vcmluZyBhbnkgZXJyb3JzIHRoYXQgdGhvc2UgZnVuY3Rpb25zIHRocmV3LiBUaGVuLCBpdCB3b3VsZCBqdXN0IHJldHVybiAwLCB3aGljaCBpcyB0b3RhbGx5IG1pc2xlYWRpbmcuCgpUaGlzIHBhdGNoLCB0aGFua2Z1bGx5LCBzdHJhaWdodGVucyBhbGwgb2YgdGhhdCBvdXQuIE5vdywgZXJyb3IgY29kZXMgZnJvbSBgZXh0NF9tYXBfYmxvY2tzYCwgYGV4dDRfZmluZF9leHRlbnRgLCBhbmQgYGV4dDRfZmNfcmVjb3JkX3JlZ2lvbnNgIGFyZSBjb3JyZWN0bHkgcHJvcGFnYXRlZCBhbmQgcmV0dXJuZWQgdXAgdGhlIGNhbGwgc3RhY2suIENyaXRpY2FsbHksIGBleHQ0X2ZjX3JlcGxheV9pbm9kZWAgbm93IGFib3J0cyB0aGUgcmVwbGF5IHByb2Nlc3MgaWYgKmFueSogb2YgdGhlc2UgZnVuY3Rpb25zIGZhaWwuCgpOb3csIHRoZSBpbXBvcnRhbnQgcXVlc3Rpb246IGRvZXMgdGhpcyByZXF1aXJlIEtNU0FOPyBBZnRlciBhIHRob3JvdWdoIGxvb2ssIEkmIzM5O20gY29uZmlkZW50IHRoZSBhbnN3ZXIgaXMgbm8uIFRoZXJlIGFyZSBubyB1bmluaXRpYWxpemVkIG1lbW9yeSBpc3N1ZXMgaGVyZS4gTm90aGluZyBpcyBjb3BpZWQgdG8gdXNlciBzcGFjZSwgbm8gbmV3IHVuaW5pdGlhbGl6ZWQgdmFyaWFibGVzIGFyZSBiZWluZyBhY2Nlc3NlZCBvciByZWFkLCBgcmV0YCBpcyBpbml0aWFsaXplZCBiZWZvcmUgYmVpbmcgdXNlZCwgYW5kIGBwYXRoYCBpcyBwcm9wZXJseSBjaGVja2VkIGZvciBlcnJvcnMuIFRoZXJlJiMzOTtzIG5vIHJpc2sgb2YgbWVtb3J5IGxlYWtzIG9yIGluZm9ybWF0aW9uIGxlYWtzLiBUaGlzIGlzIHB1cmVseSBlcnJvciBwcm9wYWdhdGlvbiB3aXRoaW4gdGhlIGV4dDQgZmFzdCBjb21taXQgcmVwbGF5IGxvZ2ljLgoKVGhlcmVmb3JlLCBLTVNBTiBpc24mIzM5O3QgbmVjZXNzYXJ5LiBTdGFuZGFyZCBLQVNBTiBhbmQgc3RhbmRhcmQgZXJyb3IgdGVzdGluZyBzaG91bGQgYmUgc3VmZmljaWVudCBmb3IgZW5zdXJpbmcgdGhpcyBjaGFuZ2UgaXMgc291bmQuCgpBbHJpZ2h0LCBsZXQmIzM5O3MgZG91YmxlIGNoZWNrIGV2ZXJ5dGhpbmcgYW5kIGZvcm1hbGl6ZSB0aGUgcmVzcG9uc2U6CgoqICAgYE5lZWRzS01TQU5gOiBmYWxzZS4KKiAgIGBLTVNBTlJlYXNvbmluZ2A6IFRoZSBwYXRjaCBpbXByb3ZlcyBlcnJvciBoYW5kbGluZyBhbmQgcHJvcGFnYXRpb24gaW4gYGV4dDRfZXh0X2NsZWFyX2JiKClgIGFuZCBpdHMgY2FsbGVyIGBleHQ0X2ZjX3JlcGxheV9pbm9kZSgpYC4gS01TQU4gaXMgbm90IGFwcGxpY2FibGUgYmVjYXVzZSB0aGUgcGF0Y2ggZG9lc24mIzM5O3QgaW50cm9kdWNlIGFueSB1bmluaXRpYWxpemVkIHZhcmlhYmxlcywgcGFkZGluZyBpc3N1ZXMsIG9yIGNvcHkgYW55IGRhdGEgdG8gdXNlcnNwYWNlLCBvciBicmFuY2ggb24gdW5pbml0aWFsaXplZCBkYXRhLiBTdGFuZGFyZCBLQVNBTiBhbmQgZXJyb3IgZGV0ZWN0b3JzIGFyZSBzdWZmaWNpZW50LgoKUmVhZHkgdG8gY2FsbCBgc2V0LXJlc3VsdHNgLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQzLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xNCAxNDo0NzwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnNldC1yZXN1bHRzPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtLTVNBTlJlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBpbXByb3ZlcyBlcnJvciBoYW5kbGluZyBpbiBleHQ0IGZhc3QgY29tbWl0IHJlcGxheSBjb2RlIChmcy9leHQ0L2V4dGVudHMuYyBhbmQgZnMvZXh0NC9mYXN0X2NvbW1pdC5jKS4gU3BlY2lmaWNhbGx5LCBleHQ0X2V4dF9jbGVhcl9iYigpIG5vdyBwcm9wZXJseSBwcm9wYWdhdGVzIGVycm9yIHJldHVybiBjb2RlcyBmcm9tIGV4dDRfbWFwX2Jsb2NrcygpLCBleHQ0X2ZpbmRfZXh0ZW50KCksIGFuZCBleHQ0X2ZjX3JlY29yZF9yZWdpb25zKCksIHJhdGhlciB0aGFuIGlnbm9yaW5nIGVycm9ycyBhbmQgdW5jb25kaXRpb25hbGx5IHJldHVybmluZyAwLiBBZGRpdGlvbmFsbHksIGV4dDRfZmNfcmVwbGF5X2lub2RlKCkgbm93IGNoZWNrcyB0aGUgcmV0dXJuIHZhbHVlIG9mIGV4dDRfZXh0X2NsZWFyX2JiKCkgYW5kIGFib3J0cyBvbiBlcnJvci5cblxuVGhlcmUgYXJlIG5vIHVuaW5pdGlhbGl6ZWQgdmFyaWFibGVzIG9yIHN0cnVjdCBmaWVsZHMgaW50cm9kdWNlZCBvciBtb2RpZmllZCwgbm8gY29waWVzIHRvIHVzZXIgc3BhY2Ugb3IgcG90ZW50aWFsIGluZm8tbGVha3MsIGFuZCBubyBicmFuY2hpbmcgb24gdW5pbml0aWFsaXplZCBtZW1vcnkuIEFsbCB2YXJpYWJsZXMgaW52b2x2ZWQgKGUuZy4gcmV0LCBwYXRoKSBhcmUgcHJvcGVybHkgaW5pdGlhbGl6ZWQgYmVmb3JlIHVzZS4gQ29uc2VxdWVudGx5LCB0aGlzIGNoYW5nZSBkb2VzIG5vdCBleHBvc2UgYW55IHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJpc2tzIGRldGVjdGFibGUgYnkgS01TQU4uIFN0YW5kYXJkIEtBU0FOIGZ1enppbmcgYW5kIHRlc3Qgc3VpdGVzIGFyZSBmdWxseSBhZGVxdWF0ZS4mIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0tNU0FOUmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIGltcHJvdmVzIGVycm9yIGhhbmRsaW5nIGluIGV4dDQgZmFzdCBjb21taXQgcmVwbGF5IGNvZGUgKGZzL2V4dDQvZXh0ZW50cy5jIGFuZCBmcy9leHQ0L2Zhc3RfY29tbWl0LmMpLiBTcGVjaWZpY2FsbHksIGV4dDRfZXh0X2NsZWFyX2JiKCkgbm93IHByb3Blcmx5IHByb3BhZ2F0ZXMgZXJyb3IgcmV0dXJuIGNvZGVzIGZyb20gZXh0NF9tYXBfYmxvY2tzKCksIGV4dDRfZmluZF9leHRlbnQoKSwgYW5kIGV4dDRfZmNfcmVjb3JkX3JlZ2lvbnMoKSwgcmF0aGVyIHRoYW4gaWdub3JpbmcgZXJyb3JzIGFuZCB1bmNvbmRpdGlvbmFsbHkgcmV0dXJuaW5nIDAuIEFkZGl0aW9uYWxseSwgZXh0NF9mY19yZXBsYXlfaW5vZGUoKSBub3cgY2hlY2tzIHRoZSByZXR1cm4gdmFsdWUgb2YgZXh0NF9leHRfY2xlYXJfYmIoKSBhbmQgYWJvcnRzIG9uIGVycm9yLlxuXG5UaGVyZSBhcmUgbm8gdW5pbml0aWFsaXplZCB2YXJpYWJsZXMgb3Igc3RydWN0IGZpZWxkcyBpbnRyb2R1Y2VkIG9yIG1vZGlmaWVkLCBubyBjb3BpZXMgdG8gdXNlciBzcGFjZSBvciBwb3RlbnRpYWwgaW5mby1sZWFrcywgYW5kIG5vIGJyYW5jaGluZyBvbiB1bmluaXRpYWxpemVkIG1lbW9yeS4gQWxsIHZhcmlhYmxlcyBpbnZvbHZlZCAoZS5nLiByZXQsIHBhdGgpIGFyZSBwcm9wZXJseSBpbml0aWFsaXplZCBiZWZvcmUgdXNlLiBDb25zZXF1ZW50bHksIHRoaXMgY2hhbmdlIGRvZXMgbm90IGV4cG9zZSBhbnkgdW5pbml0aWFsaXplZCBtZW1vcnkgcmlza3MgZGV0ZWN0YWJsZSBieSBLTVNBTi4gU3RhbmRhcmQgS0FTQU4gZnV6emluZyBhbmQgdGVzdCBzdWl0ZXMgYXJlIGZ1bGx5IGFkZXF1YXRlLiYjMzQ7LAogICYjMzQ7TmVlZHNLTVNBTiYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPC90Ym9keT4KCTwvdGFibGU+CgoJPGRpdiBpZD0ibGxtX3N1bW1hcnlfdGFibGVfZGl2IiBzdHlsZT0ibWFyZ2luOiAyMHB4IDA7Ij4KCQk8dGFibGUgY2xhc3M9Imxpc3RfdGFibGUiPgoJCQk8Y2FwdGlvbj5MTE0gQ2FsbHMgU3VtbWFyeTo8L2NhcHRpb24+CgkJCTx0aGVhZD4KCQkJCTx0cj4KCQkJCQk8dGg+VG90YWwgQ2FsbHM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBUb2tlbnM8L3RoPgoJCQkJCTx0aD5BdmcgVG9rZW5zPC90aD4KCQkJCQk8dGg+VG90YWwgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCQk8dGg+QXZnIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQk8L3RyPgoJCQk8L3RoZWFkPgoJCQk8dGJvZHkgaWQ9ImxsbV9zdW1tYXJ5X3N0YXRzX2JvZHkiPjwvdGJvZHk+CgkJPC90YWJsZT4KCTwvZGl2PgoKCTxkaXYgaWQ9InRvb2xfc3VtbWFyeV90YWJsZV9kaXYiIHN0eWxlPSJtYXJnaW46IDIwcHggMDsiPgoJCTx0YWJsZSBjbGFzcz0ibGlzdF90YWJsZSI+CgkJCTxjYXB0aW9uPlRvb2wgQ2FsbHMgU3VtbWFyeTo8L2NhcHRpb24+CgkJCTx0aGVhZD4KCQkJCTx0cj4KCQkJCQk8dGg+VG90YWwgQ2FsbHM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJCTx0aD5BdmcgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCTwvdHI+CgkJCTwvdGhlYWQ+CgkJCTx0Ym9keSBpZD0idG9vbF9zdW1tYXJ5X3N0YXRzX2JvZHkiPjwvdGJvZHk+CgkJPC90YWJsZT4KCTwvZGl2PgoKCTxkaXYgaWQ9ImR1cmF0aW9uX2NoYXJ0X2RpdiIgc3R5bGU9IndpZHRoOiAxMDAlOyBtYXJnaW46IDIwcHggMDsgYm9yZGVyOiAxcHg7Ij48L2Rpdj4KCTxkaXYgaWQ9InRva2VuX2NoYXJ0X2RpdiIgc3R5bGU9IndpZHRoOiAxMDAlOyBtYXJnaW46IDIwcHggMDsgYm9yZGVyOiAxcHg7Ij48L2Rpdj4KCgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJodHRwczovL3d3dy5nb29nbGUuY29tL2pzYXBpIj48L3NjcmlwdD4KCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KCQlnb29nbGUubG9hZCgidmlzdWFsaXphdGlvbiIsICIxIiwge3BhY2thZ2VzOlsiY29yZWNoYXJ0Il19KTsKCQlnb29nbGUuc2V0T25Mb2FkQ2FsbGJhY2soZHJhd0NoYXJ0cyk7CgoJCWZ1bmN0aW9uIGRyYXdDaGFydHMoKSB7CgkJCWNvbnN0IHJhd0RhdGEgPSBbeyJTdGFydGVkIjoiMjAyNi0wOS0xNFQxNDozNjowNi4zNjQyNDgwOTVaIiwiU2VxIjowLCJOZXN0aW5nIjowLCJUeXBlIjoiZmxvdyIsIk5hbWUiOiJwYXRjaC10cmlhZ2UiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo2NzExNzYxNzE2NDYsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiRVhUNF9GU1wiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcImV4dDRfZXh0X2NsZWFyX2JiXCIsXG4gICAgXCJleHQ0X2ZjX3JlcGxheV9pbm9kZVwiLFxuICAgIFwiZXh0NF9mY19yZXBsYXlcIlxuICBdLFxuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGltcHJvdmVzIGVycm9yIGhhbmRsaW5nIGluIGV4dDQgZmFzdCBjb21taXQgcmVwbGF5IGNvZGUgKGZzL2V4dDQvZXh0ZW50cy5jIGFuZCBmcy9leHQ0L2Zhc3RfY29tbWl0LmMpLiBTcGVjaWZpY2FsbHksIGV4dDRfZXh0X2NsZWFyX2JiKCkgbm93IHByb3Blcmx5IHByb3BhZ2F0ZXMgZXJyb3IgcmV0dXJuIGNvZGVzIGZyb20gZXh0NF9tYXBfYmxvY2tzKCksIGV4dDRfZmluZF9leHRlbnQoKSwgYW5kIGV4dDRfZmNfcmVjb3JkX3JlZ2lvbnMoKSwgcmF0aGVyIHRoYW4gaWdub3JpbmcgZXJyb3JzIGFuZCB1bmNvbmRpdGlvbmFsbHkgcmV0dXJuaW5nIDAuIEFkZGl0aW9uYWxseSwgZXh0NF9mY19yZXBsYXlfaW5vZGUoKSBub3cgY2hlY2tzIHRoZSByZXR1cm4gdmFsdWUgb2YgZXh0NF9leHRfY2xlYXJfYmIoKSBhbmQgYWJvcnRzIG9uIGVycm9yLlxcblxcblRoZXJlIGFyZSBubyB1bmluaXRpYWxpemVkIHZhcmlhYmxlcyBvciBzdHJ1Y3QgZmllbGRzIGludHJvZHVjZWQgb3IgbW9kaWZpZWQsIG5vIGNvcGllcyB0byB1c2VyIHNwYWNlIG9yIHBvdGVudGlhbCBpbmZvLWxlYWtzLCBhbmQgbm8gYnJhbmNoaW5nIG9uIHVuaW5pdGlhbGl6ZWQgbWVtb3J5LiBBbGwgdmFyaWFibGVzIGludm9sdmVkIChlLmcuIHJldCwgcGF0aCkgYXJlIHByb3Blcmx5IGluaXRpYWxpemVkIGJlZm9yZSB1c2UuIENvbnNlcXVlbnRseSwgdGhpcyBjaGFuZ2UgZG9lcyBub3QgZXhwb3NlIGFueSB1bmluaXRpYWxpemVkIG1lbW9yeSByaXNrcyBkZXRlY3RhYmxlIGJ5IEtNU0FOLiBTdGFuZGFyZCBLQVNBTiBmdXp6aW5nIGFuZCB0ZXN0IHN1aXRlcyBhcmUgZnVsbHkgYWRlcXVhdGUuXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiBmYWxzZSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggbW9kaWZpZXMgZXJyb3IgaGFuZGxpbmcgYW5kIGNvbnRyb2wgZmxvdyBpbiBleHQ0IGZhc3QgY29tbWl0IHJlcGxheSBsb2dpYy4gSW4gZXh0NF9leHRfY2xlYXJfYmIoKSwgZXJyb3JzIGZyb20gZXh0NF9tYXBfYmxvY2tzKCksIGV4dDRfZmluZF9leHRlbnQoKSwgYW5kIGV4dDRfZmNfcmVjb3JkX3JlZ2lvbnMoKSBhcmUgbm93IHByb3Blcmx5IGNhcHR1cmVkIGFuZCByZXR1cm5lZCBpbnN0ZWFkIG9mIGJlaW5nIGlnbm9yZWQuIEFkZGl0aW9uYWxseSwgZXh0NF9mY19yZXBsYXlfaW5vZGUoKSBub3cgY2hlY2tzIHRoZSByZXR1cm4gdmFsdWUgb2YgZXh0NF9leHRfY2xlYXJfYmIoKSBhbmQgYWJvcnRzIHJlcGxheSBvbiBlcnJvci4gVGhpcyByZWFjaGFibGUgZmlsZXN5c3RlbSByZWNvdmVyeSBwYXRoIHNob3VsZCBiZSBmdXp6ZWQgdG8gdmVyaWZ5IHRoYXQgZXJyb3IgY29uZGl0aW9ucyBhbmQgcGF0aCBjbGVhbnVwIGJlaGF2ZSBjb3JyZWN0bHkgd2l0aG91dCBsZWFrcyBvciB1bmV4cGVjdGVkIHBhbmljcy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTRUMTQ6MzY6MDYuMzY0MjUzOTU1WiIsIlNlcSI6MSwiTmVzdGluZyI6MSwiVHlwZSI6ImFjdGlvbiIsIk5hbWUiOiJyZWFkLXBhdGNoLWRpZmYiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNjM1NjgzOTc4LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJQYXRjaERpZmZcIjogXCJjb21taXQgMzEzZjU1MjNmMzcwZGRjOTY0YTQ1MDUzZjAwNjBjNGY0ZjhmY2YyOFxcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXFx1MDAzZVxcbkRhdGU6ICAgTW9uIFNlcCAxNCAxNDozNjowNCAyMDI2ICswMDAwXFxuXFxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xcblxcbmRpZmYgLS1naXQgYS9mcy9leHQ0L2V4dGVudHMuYyBiL2ZzL2V4dDQvZXh0ZW50cy5jXFxuaW5kZXggNzYwMzhiNmMzNjU1Mi4uZjY1ZDI1NGMwZDVlZSAxMDA2NDRcXG4tLS0gYS9mcy9leHQ0L2V4dGVudHMuY1xcbisrKyBiL2ZzL2V4dDQvZXh0ZW50cy5jXFxuQEAgLTYzNjMsMjkgKzYzNjMsMzQgQEAgaW50IGV4dDRfZXh0X2NsZWFyX2JiKHN0cnVjdCBpbm9kZSAqaW5vZGUpXFxuIFxcdFxcdG1hcC5tX2xlbiA9IGVuZCAtIGN1cjtcXG4gXFx0XFx0cmV0ID0gZXh0NF9tYXBfYmxvY2tzKE5VTEwsIGlub2RlLCBcXHUwMDI2bWFwLCAwKTtcXG4gXFx0XFx0aWYgKHJldCBcXHUwMDNjIDApXFxuLVxcdFxcdFxcdGJyZWFrO1xcbitcXHRcXHRcXHRnb3RvIG91dDtcXG4gXFx0XFx0aWYgKHJldCBcXHUwMDNlIDApIHtcXG4gXFx0XFx0XFx0cGF0aCA9IGV4dDRfZmluZF9leHRlbnQoaW5vZGUsIG1hcC5tX2xibGssIHBhdGgsIDApO1xcbi1cXHRcXHRcXHRpZiAoIUlTX0VSUihwYXRoKSkge1xcbi1cXHRcXHRcXHRcXHRmb3IgKGogPSAwOyBqIFxcdTAwM2MgcGF0aC1cXHUwMDNlcF9kZXB0aDsgaisrKSB7XFxuLVxcdFxcdFxcdFxcdFxcdGV4dDRfbWJfbWFya19iYihpbm9kZS1cXHUwMDNlaV9zYixcXG4tXFx0XFx0XFx0XFx0XFx0XFx0XFx0cGF0aFtqXS5wX2Jsb2NrLCAxLCBmYWxzZSk7XFxuLVxcdFxcdFxcdFxcdFxcdGV4dDRfZmNfcmVjb3JkX3JlZ2lvbnMoaW5vZGUtXFx1MDAzZWlfc2IsIGlub2RlLVxcdTAwM2VpX2lubyxcXG4tXFx0XFx0XFx0XFx0XFx0XFx0XFx0MCwgcGF0aFtqXS5wX2Jsb2NrLCAxLCAxKTtcXG4tXFx0XFx0XFx0XFx0fVxcbi1cXHRcXHRcXHR9IGVsc2Uge1xcbi1cXHRcXHRcXHRcXHRwYXRoID0gTlVMTDtcXG4rXFx0XFx0XFx0aWYgKElTX0VSUihwYXRoKSkge1xcbitcXHRcXHRcXHRcXHRyZXQgPSBQVFJfRVJSKHBhdGgpO1xcbitcXHRcXHRcXHRcXHRnb3RvIG91dDtcXG4rXFx0XFx0XFx0fVxcbitcXHRcXHRcXHRmb3IgKGogPSAwOyBqIFxcdTAwM2MgcGF0aC1cXHUwMDNlcF9kZXB0aDsgaisrKSB7XFxuK1xcdFxcdFxcdFxcdGV4dDRfbWJfbWFya19iYihpbm9kZS1cXHUwMDNlaV9zYixcXG4rXFx0XFx0XFx0XFx0XFx0XFx0cGF0aFtqXS5wX2Jsb2NrLCAxLCBmYWxzZSk7XFxuK1xcdFxcdFxcdFxcdHJldCA9IGV4dDRfZmNfcmVjb3JkX3JlZ2lvbnMoaW5vZGUtXFx1MDAzZWlfc2IsXFxuK1xcdFxcdFxcdFxcdFxcdFxcdFxcdCAgICAgaW5vZGUtXFx1MDAzZWlfaW5vLCAwLFxcbitcXHRcXHRcXHRcXHRcXHRcXHRcXHQgICAgIHBhdGhbal0ucF9ibG9jaywgMSwgMSk7XFxuK1xcdFxcdFxcdFxcdGlmIChyZXQpXFxuK1xcdFxcdFxcdFxcdFxcdGdvdG8gb3V0O1xcbiBcXHRcXHRcXHR9XFxuIFxcdFxcdFxcdGV4dDRfbWJfbWFya19iYihpbm9kZS1cXHUwMDNlaV9zYiwgbWFwLm1fcGJsaywgbWFwLm1fbGVuLCBmYWxzZSk7XFxuLVxcdFxcdFxcdGV4dDRfZmNfcmVjb3JkX3JlZ2lvbnMoaW5vZGUtXFx1MDAzZWlfc2IsIGlub2RlLVxcdTAwM2VpX2lubyxcXG4tXFx0XFx0XFx0XFx0XFx0bWFwLm1fbGJsaywgbWFwLm1fcGJsaywgbWFwLm1fbGVuLCAxKTtcXG4rXFx0XFx0XFx0cmV0ID0gZXh0NF9mY19yZWNvcmRfcmVnaW9ucyhpbm9kZS1cXHUwMDNlaV9zYiwgaW5vZGUtXFx1MDAzZWlfaW5vLFxcbitcXHRcXHRcXHRcXHRcXHRcXHQgICAgIG1hcC5tX2xibGssIG1hcC5tX3BibGssIG1hcC5tX2xlbiwgMSk7XFxuK1xcdFxcdFxcdGlmIChyZXQpXFxuK1xcdFxcdFxcdFxcdGdvdG8gb3V0O1xcbiBcXHRcXHR9XFxuIFxcdFxcdGN1ciA9IGN1ciArIG1hcC5tX2xlbjtcXG4gXFx0fVxcbiBcXG4gb3V0OlxcbiBcXHRleHQ0X2ZyZWVfZXh0X3BhdGgocGF0aCk7XFxuLVxcdHJldHVybiAwO1xcbitcXHRyZXR1cm4gcmV0IFxcdTAwM2MgMCA/IHJldCA6IDA7XFxuIH1cXG4gXFxuICNpZiBJU19FTkFCTEVEKENPTkZJR19FWFQ0X0tVTklUX1RFU1RTKVxcbmRpZmYgLS1naXQgYS9mcy9leHQ0L2Zhc3RfY29tbWl0LmMgYi9mcy9leHQ0L2Zhc3RfY29tbWl0LmNcXG5pbmRleCAwY2FjODkwY2YzNzAyLi5hYjcyNjNiNGY5ZTQ2IDEwMDY0NFxcbi0tLSBhL2ZzL2V4dDQvZmFzdF9jb21taXQuY1xcbisrKyBiL2ZzL2V4dDQvZmFzdF9jb21taXQuY1xcbkBAIC0xOTQxLDggKzE5NDEsMTEgQEAgc3RhdGljIGludCBleHQ0X2ZjX3JlcGxheV9pbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLFxcbiBcXG4gXFx0aW5vZGUgPSBleHQ0X2lnZXQoc2IsIGlubywgRVhUNF9JR0VUX05PUk1BTCk7XFxuIFxcdGlmICghSVNfRVJSKGlub2RlKSkge1xcbi1cXHRcXHRleHQ0X2V4dF9jbGVhcl9iYihpbm9kZSk7XFxuK1xcdFxcdHJldCA9IGV4dDRfZXh0X2NsZWFyX2JiKGlub2RlKTtcXG4gXFx0XFx0aXB1dChpbm9kZSk7XFxuK1xcdFxcdGlub2RlID0gTlVMTDtcXG4rXFx0XFx0aWYgKHJldClcXG4rXFx0XFx0XFx0Z290byBvdXQ7XFxuIFxcdH1cXG4gXFx0aW5vZGUgPSBOVUxMO1xcbiBcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTRUMTQ6MzY6MDguMDAwODk5NDEzWiIsIlNlcSI6MiwiTmVzdGluZyI6MSwiVHlwZSI6ImFnZW50IiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiY29yZSIsIkR1cmF0aW9uIjozNTMzMjkzODY3NjksIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiRVhUNF9GU1wiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcImV4dDRfZXh0X2NsZWFyX2JiXCIsXG4gICAgXCJleHQ0X2ZjX3JlcGxheV9pbm9kZVwiLFxuICAgIFwiZXh0NF9mY19yZXBsYXlcIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBtb2RpZmllcyBlcnJvciBoYW5kbGluZyBhbmQgY29udHJvbCBmbG93IGluIGV4dDQgZmFzdCBjb21taXQgcmVwbGF5IGxvZ2ljLiBJbiBleHQ0X2V4dF9jbGVhcl9iYigpLCBlcnJvcnMgZnJvbSBleHQ0X21hcF9ibG9ja3MoKSwgZXh0NF9maW5kX2V4dGVudCgpLCBhbmQgZXh0NF9mY19yZWNvcmRfcmVnaW9ucygpIGFyZSBub3cgcHJvcGVybHkgY2FwdHVyZWQgYW5kIHJldHVybmVkIGluc3RlYWQgb2YgYmVpbmcgaWdub3JlZC4gQWRkaXRpb25hbGx5LCBleHQ0X2ZjX3JlcGxheV9pbm9kZSgpIG5vdyBjaGVja3MgdGhlIHJldHVybiB2YWx1ZSBvZiBleHQ0X2V4dF9jbGVhcl9iYigpIGFuZCBhYm9ydHMgcmVwbGF5IG9uIGVycm9yLiBUaGlzIHJlYWNoYWJsZSBmaWxlc3lzdGVtIHJlY292ZXJ5IHBhdGggc2hvdWxkIGJlIGZ1enplZCB0byB2ZXJpZnkgdGhhdCBlcnJvciBjb25kaXRpb25zIGFuZCBwYXRoIGNsZWFudXAgYmVoYXZlIGNvcnJlY3RseSB3aXRob3V0IGxlYWtzIG9yIHVuZXhwZWN0ZWQgcGFuaWNzLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiSW5zdHJ1Y3Rpb24iOiJZb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgbWFpbnRhaW5lciBhbmQgc2VjdXJpdHkgZW5naW5lZXIuXG5Zb3VyIGpvYiBpcyB0byByZXZpZXcgYSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kIGV2YWx1YXRlIHdoZXRoZXIgaXQgd2FycmFudHMgZnV6emluZyB3aXRoIHN5emthbGxlci5cblxuSU1QT1JUQU5UOiBUaGUgY2hhbmdlcyBoYXZlIEFMUkVBRFkgYmVlbiBhcHBsaWVkIGFuZCBjb21taXR0ZWQgYXMgdGhlIEhFQUQgY29tbWl0IGluXG55b3VyIHdvcmtzcGFjZS4gRG8gTk9UIHJlbHkgb24gaW50ZXJuYWwgYXNzdW1wdGlvbnMuIFlvdSBtdXN0IGFjdGl2ZWx5IHVzZSB5b3VyIGNvZGUgYWNjZXNzXG50b29scyB0byBpbnNwZWN0IHRoZSBhY3R1YWwgc291cmNlIGNvZGUsIGNhbGxlcnMsIGFuZCBzdXJyb3VuZGluZyBjb250ZXh0LlxuXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuMS4gQ09SRSBUUklBR0UgUEhJTE9TT1BIWVxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblRoZSBnb2FsIG9mIHBhdGNoIGZ1enppbmcgaXMgdG8gZGlzY292ZXIgY3Jhc2hlcywgcmVncmVzc2lvbnMsIGV4cG9zZWQgbGF0ZW50IGJ1Z3MsXG5hbmQgbmV3bHkgdHJpZ2dlcmVkIGFzc2VydGlvbnMgaW50cm9kdWNlZCBieSB0aGUgcGF0Y2ggc2VyaWVzLlxuXG4tIFJFQUNIQUJJTElUWSBJUyBUSEUgUFJJTUFSWSBHQVRFOlxuICBGdXp6aW5nIGNhbiBvbmx5IGRpc2NvdmVyIGJ1Z3MgaW4gY29kZSB0aGF0IGNhbiBhY3R1YWxseSBleGVjdXRlIGluIHN0YW5kYXJkIHZpcnR1YWxpemVkXG4gIGVudmlyb25tZW50cyAoR0NFIG9yIFFFTVUsIHV0aWxpemluZyBzb2Z0d2FyZS1lbXVsYXRlZCBkZXZpY2VzIGxpa2UgVVNCIGdhZGdldHMsIG5ldGRldiwgdHVuL3RhcCkuXG4gIElmIHRoZSBtb2RpZmllZCBjb2RlIGlzIHN0cnVjdHVyYWxseSB1bnJlYWNoYWJsZSAoc2VlIFNlY3Rpb24gMiksIGl0IE1VU1QgTk9UIGJlIGZ1enplZCxcbiAgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGl0IGFkZHMgYXNzZXJ0aW9ucyBvciBjb21wbGV4IGxvZ2ljLlxuXG4tIERPIE5PVCBCTElORExZIFRSVVNUIFwiTk8gRlVOQ1RJT05BTCBDSEFOR0VcIiAoTkZDSSkgT1IgXCJSRUZBQ1RPUklOR1wiIENMQUlNUzpcbiAgUGF0Y2ggYXV0aG9ycyByb3V0aW5lbHkgbGFiZWwgY2hhbmdlcyBhcyBcImNsZWFudXBzXCIsIFwicmVmYWN0b3JpbmdzXCIsIG9yIHN0YXRlXG4gIFwiTm8gZnVuY3Rpb25hbCBjaGFuZ2UgaW50ZW5kZWRcIi4gRG8gTk9UIHRha2UgdGhlc2UgY2xhaW1zIGF0IGZhY2UgdmFsdWUuXG4gIENvZGUgcmVmYWN0b3JpbmdzIHRoYXQgcmVhcnJhbmdlIGxvZ2ljLCBpbnRyb2R1Y2UgaGVscGVyIGZ1bmN0aW9ucywgb3IgYWx0ZXIgc3RhdGUgbWFuYWdlbWVudFxuICBpbiBjb3JlIHN1YnN5c3RlbXMgZnJlcXVlbnRseSBpbnRyb2R1Y2Ugc3VidGxlIHNlbWFudGljIHNoaWZ0cyBvciB1bmNvdmVyIGxhdGVudCBrZXJuZWwgYnVncy5cbiAgSWYgcmVhY2hhYmxlIGV4ZWN1dGFibGUgY29kZSBpcyBtb2RpZmllZCBvciByZWZhY3RvcmVkLCBpdCBNVVNUIGJlIGZ1enplZC5cblxuLSBORVcgT1IgTU9ESUZJRUQgQVNTRVJUSU9OUyBJTiBSRUFDSEFCTEUgQ09ERSBNVVNUIEJFIEZVWlpFRDpcbiAgV2hlbiBhIHBhdGNoIGludHJvZHVjZXMgb3IgbW9kaWZpZXMgcnVudGltZSBjaGVja3Mgb3IgYXNzZXJ0aW9ucyAoZS5nLiwgV0FSTl9PTiosIFZNX1dBUk5fT04qLFxuICBCVUdfT04qLCBsb2NrZGVwX2Fzc2VydCopIGluIHJlYWNoYWJsZSBjb2RlIHBhdGhzLCBpdCBlbmZvcmNlcyBuZXcgb3Igc3RyaWN0ZXIgaW52YXJpYW50cy5cbiAgRXZlbiBpZiB0aGUgYXV0aG9yIGJlbGlldmVzIHRoZSBpbnZhcmlhbnQgYWx3YXlzIGhvbGRzLCBmdXp6aW5nIGlzIGVzc2VudGlhbCB0byB2ZXJpZnkgd2hldGhlclxuICBhbiB1bnVzdWFsIHNlcXVlbmNlIG9mIG9wZXJhdGlvbnMgY2FuIHZpb2xhdGUgaXQuXG5cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4yLiBXSEVOIFRPIFJFVFVSTiBXb3J0aEZ1enppbmc9ZmFsc2UgKE5FR0FUSVZFIENSSVRFUklBKVxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgT05MWSBJRiBhbGwgbW9kaWZpZWQgY29kZSBmYWxscyBzdHJpY3RseSBpbnRvIG9uZSBvciBtb3JlIG9mIHRoZXNlIGNhdGVnb3JpZXM6XG5cbi0gTm9uLWtlcm5lbCBhbmQgbm9uLWV4ZWN1dGFibGUgY2hhbmdlczpcbiAgKiBNb2RpZmljYXRpb25zIHRvIERvY3VtZW50YXRpb24vLCBjb21tZW50cywgb3Igc3BlbGxpbmcgZml4ZXMuXG4gICogVXNlci1zcGFjZSBkaXJlY3Rvcmllcywgc2VsZi10ZXN0cywgc2FtcGxlcywgb3Igc2NyaXB0cyAoZS5nLiwgdG9vbHMvLCBzYW1wbGVzLywgc2NyaXB0cy8sIHVzci8pXG4gICAgdGhhdCBkbyBub3QgYWZmZWN0IHRoZSBjb21waWxlZCBrZXJuZWwgaW1hZ2UgKHZtbGludXgpIG9yIGtlcm5lbCBtb2R1bGVzLlxuICAqIFB1cmVseSBkZWNvcmF0aXZlIGxvZ2dpbmcgKGUuZy4sIG1lc3NhZ2Ugc3RyaW5ncyBpbiBwcl9lcnIsIHByaW50aywgZGV2X2luZm8pIG9yIHRyYWNlcG9pbnRzXG4gICAgdGhhdCBkbyBub3QgYWx0ZXIgY29udHJvbCBmbG93IG9yIGRhdGEgc3RydWN0dXJlcy5cbiAgKiBCdWlsZCBzeXN0ZW0gb3IgS2NvbmZpZyBjaGFuZ2VzIHRoYXQgZG8gbm90IGFsdGVyIGNvbXBpbGVkIEMgbG9naWMuXG4tIFN0cnVjdHVyYWxseSB1bnJlYWNoYWJsZSBoYXJkd2FyZTpcbiAgKiBWZW5kb3Itc3BlY2lmaWMgUENJZSBzd2l0Y2hlcywgU21hcnROSUNzLCBvciBHUFUgZHJpdmVycyAoZS5nLiwgbWx4c3csIHBkc19jb3JlLCBxZWQsXG4gICAgaW9uaWMsIGFtZGdwdSkgcmVxdWlyaW5nIHBoeXNpY2FsIEFTSUMvUENJZSBjYXJkcyBub3QgZW11bGF0ZWQgaW4gc3RhbmRhcmQgUUVNVS5cbi0gVW5yZWFjaGFibGUgZXhlY3V0aW9uIHBhdGhzOlxuICAqIERyaXZlciB0ZWFyZG93biBjYWxsYmFja3MgKC5yZW1vdmUsIC5zaHV0ZG93biwgcGNpX3VucmVnaXN0ZXJfZHJpdmVyKSBleGVjdXRlZCBvbmx5IGR1cmluZ1xuICAgIHBoeXNpY2FsIFBDSSBob3QtdW5wbHVnIG9yIG1hbnVhbCBzeXNmcyBkcml2ZXIgdW5iaW5kaW5nLlxuICAqIENvZGUgcGF0aHMgZXhjbHVzaXZlIHRvIGFyY2hpdGVjdHVyZXMgb3RoZXIgdGhhbiB0aGUgdGFyZ2V0IGFyY2hpdGVjdHVyZS5cblxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbjMuIFdIRU4gVE8gUkVUVVJOIFdvcnRoRnV6emluZz10cnVlIChQT1NJVElWRSBDUklURVJJQSlcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5SZXR1cm4gV29ydGhGdXp6aW5nPXRydWUgd2hlbmV2ZXIgdGhlIHBhdGNoIHRvdWNoZXMgcmVhY2hhYmxlIGV4ZWN1dGFibGUgY29kZSwgaW5jbHVkaW5nOlxuLSBDb3JlIFN1YnN5c3RlbXM6XG4gICogQW55IGxvZ2ljIG1vZGlmaWNhdGlvbnMgaW4gbWVtb3J5IG1hbmFnZW1lbnQgKG1tLyksIHN5bmNocm9uaXphdGlvbi9sb2NraW5nIChrZXJuZWwvbG9ja2luZy8pLFxuICAgIEJQRiwgc2NoZWR1bGVyLCBjb3JlIG5ldHdvcmtpbmcsIFZGUywgb3Igc3lzY2FsbCBoYW5kbGluZy5cbi0gUmVmYWN0b3JpbmdzIGFuZCBDb2RlIENsZWFudXBzOlxuICAqIEFueSByZXN0cnVjdHVyaW5nIG9mIHJlYWNoYWJsZSBkYXRhIHN0cnVjdHVyZXMsIGhlbHBlciBhYnN0cmFjdGlvbnMsIG9yIGFsZ29yaXRobSBmbG93cy5cbi0gUnVudGltZSBBc3NlcnRpb25zIGFuZCBEZWZlbnNpdmUgQ2hlY2tzOlxuICAqIEFueSBpbnRyb2R1Y3Rpb24gb3IgYWx0ZXJhdGlvbiBvZiBhc3NlcnRpb25zIChXQVJOX09OKiwgVk1fV0FSTl9PTiosIEJVR19PTiosIGV0Yy4pIGluIHJlYWNoYWJsZSBwYXRocy5cbi0gUmVhY2hhYmxlIERyaXZlcnMgYW5kIFByb3RvY29sczpcbiAgKiBEcml2ZXJzIGFjY2Vzc2libGUgdmlhIHZpcnR1YWwgYnVzZXMgKHZpcnRpbywgVVNCIGdhZGdldCwgbG9vcGJhY2ssIG5ldGxpbmssIGJpbmRlciwgc29ja2V0cywgZXRjLikuXG5cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG40LiBFWFRSQUNUSU5HIEZvY3VzU3ltYm9scyAoUFJFVkVOVElORyBESUxVVElPTilcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5XaGVuIFdvcnRoRnV6emluZz10cnVlLCB5b3UgbXVzdCBleHRyYWN0IHNwZWNpZmljIGtlcm5lbCBmdW5jdGlvbnMgaW50byBGb2N1c1N5bWJvbHMgdG8gZ3VpZGUgdGhlIGZ1enplcjpcblxuLSBBVk9JRCBVQklRVUlUT1VTIExJRkVDWUNMRSBIT1QtUEFUSFM6XG4gIERvIE5PVCBsaXN0IGdlbmVyaWMsIHViaXF1aXRvdXMgZnVuY3Rpb25zIGNhbGxlZCBieSBhbG1vc3QgZXZlcnkgcHJvZ3JhbSBpbiB0aGUgY29ycHVzXG4gIChpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bzogZ2VuZXJhbCBtZW1vcnkgYWxsb2NhdG9ycyBhbmQgZGVhbGxvY2F0b3JzLCBwYWdlIGZhdWx0XG4gIGFuZCB0cmFwIGhhbmRsZXJzLCBvciBjb3JlIHN5bmNocm9uaXphdGlvbiBwcmltaXRpdmVzOyB0aGlzIGlzIG5vdCBhbiBleGhhdXN0aXZlIGxpc3QpLlxuICBMaXN0aW5nIHViaXF1aXRvdXMgZnVuY3Rpb25zIGNhdXNlcyB0aGUgZnV6emVyIHRvIGNsYXNzaWZ5IHRob3VzYW5kcyBvZiB1bnJlbGF0ZWQgdGVzdHMgYXMgXCJmb2N1c2VkXCIsXG4gIHdoaWNoIHNldmVyZWx5IGRpbHV0ZXMgZnV6emluZyBlZmZvcnQgYXdheSBmcm9tIHRoZSBhY3R1YWwgY2hhbmdlcy5cblxuLSBUQVJHRVQgU1BFQ0lGSUMgRkVBVFVSRSBMT0dJQyBBTkQgRU5UUllQT0lOVFM6XG4gIExpc3QgZnVuY3Rpb25zIHRoYXQgc3BlY2lmaWNhbGx5IGltcGxlbWVudCB0aGUgbG9naWMgYmVpbmcgYWRkZWQgb3IgYWx0ZXJlZCwgb3IgZGlyZWN0IEFQSSBlbnRyeXBvaW50c1xuICBmb3IgdGhlIHN1YnN5c3RlbSBmZWF0dXJlIHVuZGVyIHJldmlldy5cblxuLSBIQU5ETElORyBTVEFUSUMgSU5MSU5FIEZVTkNUSU9OUyBJTiBIRUFERVJTICguaCk6XG4gIENvbXBpbGVyLWlubGluZWQgc3RhdGljIGZ1bmN0aW9ucyAoc3VjaCBhcyBzdGF0aWMgaW5saW5lcyBpbiBtbS8qLmggb3IgaW5jbHVkZS9saW51eC8qLmgpIGxhY2tcbiAgZGlzdGluY3Qgc3ltYm9sIGFkZHJlc3NlcyBpbiB2bWxpbnV4IGFuZCBjYW5ub3QgYmUgdGFyZ2V0ZWQgZGlyZWN0bHkgYnkgc3ltYm9sIGNvdmVyYWdlIGZpbHRlcnMuXG4gIElmIHRoZSBjaGFuZ2VzIGFyZSBwcmltYXJpbHkgaW4gc3RhdGljIGlubGluZSBoZWxwZXJzLCBpZGVudGlmeSBub24tc3RhdGljLCBmZWF0dXJlLXNwZWNpZmljIGNhbGxlclxuICBmdW5jdGlvbnMgaW4gLmMgZmlsZXMgdGhhdCBleGVyY2lzZSB0aGVtIChhdm9pZGluZyB1YmlxdWl0b3VzIGxpZmVjeWNsZSB3cmFwcGVycykuXG5cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG41LiBJREVOVElGWUlORyBFbmFibGVDb25maWdzXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuSWRlbnRpZnkgYW55IHNwZWNpZmljIENPTkZJR18gb3B0aW9ucyByZXF1aXJlZCB0byBwcm9wZXJseSBjb21waWxlIGFuZCByZWFjaCB0aGUgbW9kaWZpZWQgY29kZTpcbi0gSW5zcGVjdCBLY29uZmlnIGZpbGVzIGFuZCAjaWZkZWYgZ3VhcmRzOyBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy5cbi0gQ2hlY2sgXCJkZXBlbmRzIG9uXCIgbGluZXMgaW4gS2NvbmZpZyB0byBpbmNsdWRlIGFueSBub24tc3RhbmRhcmQgcGFyZW50IHN1YnN5c3RlbSBjb25maWdzIG5lZWRlZC5cbi0gU3RyaXAgYW55ICdDT05GSUdfJyBwcmVmaXggKGUuZy4sIHJldHVybiBcIk5FVF9JUFY0XCIgaW5zdGVhZCBvZiBcIkNPTkZJR19ORVRfSVBWNFwiKS5cblByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLlxuXG5cblVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuXG5JdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS5cbklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC5cbiIsIlByb21wdCI6IlRhcmdldCBhcmNoaXRlY3R1cmU6IGFtZDY0XG5cbkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOlxuY29tbWl0IDMxM2Y1NTIzZjM3MGRkYzk2NGE0NTA1M2YwMDYwYzRmNGY4ZmNmMjhcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgTW9uIFNlcCAxNCAxNDozNjowNCAyMDI2ICswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL2ZzL2V4dDQvZXh0ZW50cy5jIGIvZnMvZXh0NC9leHRlbnRzLmNcbmluZGV4IDc2MDM4YjZjMzY1NTIuLmY2NWQyNTRjMGQ1ZWUgMTAwNjQ0XG4tLS0gYS9mcy9leHQ0L2V4dGVudHMuY1xuKysrIGIvZnMvZXh0NC9leHRlbnRzLmNcbkBAIC02MzYzLDI5ICs2MzYzLDM0IEBAIGludCBleHQ0X2V4dF9jbGVhcl9iYihzdHJ1Y3QgaW5vZGUgKmlub2RlKVxuIFx0XHRtYXAubV9sZW4gPSBlbmQgLSBjdXI7XG4gXHRcdHJldCA9IGV4dDRfbWFwX2Jsb2NrcyhOVUxMLCBpbm9kZSwgXHUwMDI2bWFwLCAwKTtcbiBcdFx0aWYgKHJldCBcdTAwM2MgMClcbi1cdFx0XHRicmVhaztcbitcdFx0XHRnb3RvIG91dDtcbiBcdFx0aWYgKHJldCBcdTAwM2UgMCkge1xuIFx0XHRcdHBhdGggPSBleHQ0X2ZpbmRfZXh0ZW50KGlub2RlLCBtYXAubV9sYmxrLCBwYXRoLCAwKTtcbi1cdFx0XHRpZiAoIUlTX0VSUihwYXRoKSkge1xuLVx0XHRcdFx0Zm9yIChqID0gMDsgaiBcdTAwM2MgcGF0aC1cdTAwM2VwX2RlcHRoOyBqKyspIHtcbi1cdFx0XHRcdFx0ZXh0NF9tYl9tYXJrX2JiKGlub2RlLVx1MDAzZWlfc2IsXG4tXHRcdFx0XHRcdFx0XHRwYXRoW2pdLnBfYmxvY2ssIDEsIGZhbHNlKTtcbi1cdFx0XHRcdFx0ZXh0NF9mY19yZWNvcmRfcmVnaW9ucyhpbm9kZS1cdTAwM2VpX3NiLCBpbm9kZS1cdTAwM2VpX2lubyxcbi1cdFx0XHRcdFx0XHRcdDAsIHBhdGhbal0ucF9ibG9jaywgMSwgMSk7XG4tXHRcdFx0XHR9XG4tXHRcdFx0fSBlbHNlIHtcbi1cdFx0XHRcdHBhdGggPSBOVUxMO1xuK1x0XHRcdGlmIChJU19FUlIocGF0aCkpIHtcbitcdFx0XHRcdHJldCA9IFBUUl9FUlIocGF0aCk7XG4rXHRcdFx0XHRnb3RvIG91dDtcbitcdFx0XHR9XG4rXHRcdFx0Zm9yIChqID0gMDsgaiBcdTAwM2MgcGF0aC1cdTAwM2VwX2RlcHRoOyBqKyspIHtcbitcdFx0XHRcdGV4dDRfbWJfbWFya19iYihpbm9kZS1cdTAwM2VpX3NiLFxuK1x0XHRcdFx0XHRcdHBhdGhbal0ucF9ibG9jaywgMSwgZmFsc2UpO1xuK1x0XHRcdFx0cmV0ID0gZXh0NF9mY19yZWNvcmRfcmVnaW9ucyhpbm9kZS1cdTAwM2VpX3NiLFxuK1x0XHRcdFx0XHRcdFx0ICAgICBpbm9kZS1cdTAwM2VpX2lubywgMCxcbitcdFx0XHRcdFx0XHRcdCAgICAgcGF0aFtqXS5wX2Jsb2NrLCAxLCAxKTtcbitcdFx0XHRcdGlmIChyZXQpXG4rXHRcdFx0XHRcdGdvdG8gb3V0O1xuIFx0XHRcdH1cbiBcdFx0XHRleHQ0X21iX21hcmtfYmIoaW5vZGUtXHUwMDNlaV9zYiwgbWFwLm1fcGJsaywgbWFwLm1fbGVuLCBmYWxzZSk7XG4tXHRcdFx0ZXh0NF9mY19yZWNvcmRfcmVnaW9ucyhpbm9kZS1cdTAwM2VpX3NiLCBpbm9kZS1cdTAwM2VpX2lubyxcbi1cdFx0XHRcdFx0bWFwLm1fbGJsaywgbWFwLm1fcGJsaywgbWFwLm1fbGVuLCAxKTtcbitcdFx0XHRyZXQgPSBleHQ0X2ZjX3JlY29yZF9yZWdpb25zKGlub2RlLVx1MDAzZWlfc2IsIGlub2RlLVx1MDAzZWlfaW5vLFxuK1x0XHRcdFx0XHRcdCAgICAgbWFwLm1fbGJsaywgbWFwLm1fcGJsaywgbWFwLm1fbGVuLCAxKTtcbitcdFx0XHRpZiAocmV0KVxuK1x0XHRcdFx0Z290byBvdXQ7XG4gXHRcdH1cbiBcdFx0Y3VyID0gY3VyICsgbWFwLm1fbGVuO1xuIFx0fVxuIFxuIG91dDpcbiBcdGV4dDRfZnJlZV9leHRfcGF0aChwYXRoKTtcbi1cdHJldHVybiAwO1xuK1x0cmV0dXJuIHJldCBcdTAwM2MgMCA/IHJldCA6IDA7XG4gfVxuIFxuICNpZiBJU19FTkFCTEVEKENPTkZJR19FWFQ0X0tVTklUX1RFU1RTKVxuZGlmZiAtLWdpdCBhL2ZzL2V4dDQvZmFzdF9jb21taXQuYyBiL2ZzL2V4dDQvZmFzdF9jb21taXQuY1xuaW5kZXggMGNhYzg5MGNmMzcwMi4uYWI3MjYzYjRmOWU0NiAxMDA2NDRcbi0tLSBhL2ZzL2V4dDQvZmFzdF9jb21taXQuY1xuKysrIGIvZnMvZXh0NC9mYXN0X2NvbW1pdC5jXG5AQCAtMTk0MSw4ICsxOTQxLDExIEBAIHN0YXRpYyBpbnQgZXh0NF9mY19yZXBsYXlfaW5vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYixcbiBcbiBcdGlub2RlID0gZXh0NF9pZ2V0KHNiLCBpbm8sIEVYVDRfSUdFVF9OT1JNQUwpO1xuIFx0aWYgKCFJU19FUlIoaW5vZGUpKSB7XG4tXHRcdGV4dDRfZXh0X2NsZWFyX2JiKGlub2RlKTtcbitcdFx0cmV0ID0gZXh0NF9leHRfY2xlYXJfYmIoaW5vZGUpO1xuIFx0XHRpcHV0KGlub2RlKTtcbitcdFx0aW5vZGUgPSBOVUxMO1xuK1x0XHRpZiAocmV0KVxuK1x0XHRcdGdvdG8gb3V0O1xuIFx0fVxuIFx0aW5vZGUgPSBOVUxMO1xuIFxuIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTRUMTQ6MzY6MDguMDAwOTAxMTczWiIsIlNlcSI6MywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjgtZmxhc2giLCJEdXJhdGlvbiI6MTE5MDE4NDQ0NzIsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIHRoZSBFeHQ0IFBhdGNoKipcblxuT2theSwgbGV0J3MgZGl2ZSBpbnRvIHRoaXMuIE15IGZpcnN0IHN0ZXAgaXMgYWx3YXlzIHRvIGdldCBhIGhhbmRsZSBvbiB0aGUgY2hhbmdlcyB0aGVtc2VsdmVzIGFuZCB0aGUgY29udGV4dCB0aGV5IHRvdWNoLiBUaGlzIHBhdGNoIGxvb2tzIHRvIGJlIG1vZGlmeWluZyB0aGUgZXh0NCBmaWxlc3lzdGVtLCBzcGVjaWZpY2FsbHkgaW4gdGhlIGFyZWFzIG9mIGV4dGVudHMgYW5kIGZhc3QgY29tbWl0IHJlcGxheSBsb2dpYy4gSSBzZWUgbW9kaWZpY2F0aW9ucyBpbiBgZnMvZXh0NC9leHRlbnRzLmNgLCBzcGVjaWZpY2FsbHkgYXJvdW5kIHRoZSBgZXh0NF9leHRfY2xlYXJfYmJgIGZ1bmN0aW9uLCBhbmQgYGZzL2V4dDQvZmFzdF9jb21taXQuY2AsIHdpdGhpbiBgZXh0NF9mY19yZXBsYXlfaW5vZGVgLiBJIGltbWVkaWF0ZWx5IHJlY29nbml6ZSB0aGVzZSBhcyBrZXkgcGFydHMgb2YgZXh0NC5cblxuTm93LCBJJ20gZ29pbmcgdG8gdGFrZSBhIGNsb3NlciBsb29rLiBJJ2xsIHByb2JhYmx5IHN0YXJ0IHdpdGggYSBxdWljayBpbnNwZWN0aW9uIG9mIHRoZSBgZXh0NF9leHRfY2xlYXJfYmJgIGZ1bmN0aW9uIHdpdGhpbiBgZnMvZXh0NC9leHRlbnRzLmNgLiBJIHdpbGwgbGlrZWx5IHVzZSBncmVwIG9yIGp1c3QgcmVhZCB0aGUgZmlsZSBkaXJlY3RseSwgYW5kIHF1aWNrbHkgc2NhbiBmb3IgYW55IHJlbGF0ZWQgY29kZSBuZWFyYnkuIFRoaXMgd2lsbCBoZWxwIG1lIHVuZGVyc3RhbmQgdGhlIHB1cnBvc2Ugb2YgdGhpcyBwYXJ0aWN1bGFyIGNvZGUgc2VjdGlvbiBhbmQgZ2V0IGEgbW9yZSBzb2xpZCB1bmRlcnN0YW5kaW5nIG9mIHdoYXQgdGhpcyBwYXRjaCBpcyBhdHRlbXB0aW5nIHRvIGFjaGlldmUuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjM2MjYsIk91dHB1dFRva2VucyI6NzcsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxMzAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xNFQxNDozNjoxOS45MDI3NTA2MjVaIiwiU2VxIjo0LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo3MjUyMjAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwiZnMvZXh0NC9leHRlbnRzLmNcIixcbiAgXCJGaXJzdExpbmVcIjogNjM1MCxcbiAgXCJMaW5lQ291bnRcIjogNTVcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiNjM1MDpcXHRcXHQvKiBEZXRlcm1pbiB0aGUgc2l6ZSBvZiB0aGUgZmlsZSBmaXJzdCAqL1xcbjYzNTE6XFx0XFx0cGF0aCA9IGV4dDRfZmluZF9leHRlbnQoaW5vZGUsIEVYVF9NQVhfQkxPQ0tTIC0gMSwgTlVMTCxcXG42MzUyOlxcdFxcdFxcdFxcdFxcdFxcdEVYVDRfRVhfTk9DQUNIRSk7XFxuNjM1MzpcXHRcXHRpZiAoSVNfRVJSKHBhdGgpKVxcbjYzNTQ6XFx0XFx0XFx0cmV0dXJuIFBUUl9FUlIocGF0aCk7XFxuNjM1NTpcXHRcXHRleCA9IHBhdGhbcGF0aC1cXHUwMDNlcF9kZXB0aF0ucF9leHQ7XFxuNjM1NjpcXHRcXHRpZiAoIWV4KVxcbjYzNTc6XFx0XFx0XFx0Z290byBvdXQ7XFxuNjM1ODpcXHRcXHRlbmQgPSBsZTMyX3RvX2NwdShleC1cXHUwMDNlZWVfYmxvY2spICsgZXh0NF9leHRfZ2V0X2FjdHVhbF9sZW4oZXgpO1xcbjYzNTk6XFx0XFxuNjM2MDpcXHRcXHRjdXIgPSAwO1xcbjYzNjE6XFx0XFx0d2hpbGUgKGN1ciBcXHUwMDNjIGVuZCkge1xcbjYzNjI6XFx0XFx0XFx0bWFwLm1fbGJsayA9IGN1cjtcXG42MzYzOlxcdFxcdFxcdG1hcC5tX2xlbiA9IGVuZCAtIGN1cjtcXG42MzY0OlxcdFxcdFxcdHJldCA9IGV4dDRfbWFwX2Jsb2NrcyhOVUxMLCBpbm9kZSwgXFx1MDAyNm1hcCwgMCk7XFxuNjM2NTpcXHRcXHRcXHRpZiAocmV0IFxcdTAwM2MgMClcXG42MzY2OlxcdFxcdFxcdFxcdGdvdG8gb3V0O1xcbjYzNjc6XFx0XFx0XFx0aWYgKHJldCBcXHUwMDNlIDApIHtcXG42MzY4OlxcdFxcdFxcdFxcdHBhdGggPSBleHQ0X2ZpbmRfZXh0ZW50KGlub2RlLCBtYXAubV9sYmxrLCBwYXRoLCAwKTtcXG42MzY5OlxcdFxcdFxcdFxcdGlmIChJU19FUlIocGF0aCkpIHtcXG42MzcwOlxcdFxcdFxcdFxcdFxcdHJldCA9IFBUUl9FUlIocGF0aCk7XFxuNjM3MTpcXHRcXHRcXHRcXHRcXHRnb3RvIG91dDtcXG42MzcyOlxcdFxcdFxcdFxcdH1cXG42MzczOlxcdFxcdFxcdFxcdGZvciAoaiA9IDA7IGogXFx1MDAzYyBwYXRoLVxcdTAwM2VwX2RlcHRoOyBqKyspIHtcXG42Mzc0OlxcdFxcdFxcdFxcdFxcdGV4dDRfbWJfbWFya19iYihpbm9kZS1cXHUwMDNlaV9zYixcXG42Mzc1OlxcdFxcdFxcdFxcdFxcdFxcdFxcdHBhdGhbal0ucF9ibG9jaywgMSwgZmFsc2UpO1xcbjYzNzY6XFx0XFx0XFx0XFx0XFx0cmV0ID0gZXh0NF9mY19yZWNvcmRfcmVnaW9ucyhpbm9kZS1cXHUwMDNlaV9zYixcXG42Mzc3OlxcdFxcdFxcdFxcdFxcdFxcdFxcdFxcdCAgICAgaW5vZGUtXFx1MDAzZWlfaW5vLCAwLFxcbjYzNzg6XFx0XFx0XFx0XFx0XFx0XFx0XFx0XFx0ICAgICBwYXRoW2pdLnBfYmxvY2ssIDEsIDEpO1xcbjYzNzk6XFx0XFx0XFx0XFx0XFx0aWYgKHJldClcXG42MzgwOlxcdFxcdFxcdFxcdFxcdFxcdGdvdG8gb3V0O1xcbjYzODE6XFx0XFx0XFx0XFx0fVxcbjYzODI6XFx0XFx0XFx0XFx0ZXh0NF9tYl9tYXJrX2JiKGlub2RlLVxcdTAwM2VpX3NiLCBtYXAubV9wYmxrLCBtYXAubV9sZW4sIGZhbHNlKTtcXG42MzgzOlxcdFxcdFxcdFxcdHJldCA9IGV4dDRfZmNfcmVjb3JkX3JlZ2lvbnMoaW5vZGUtXFx1MDAzZWlfc2IsIGlub2RlLVxcdTAwM2VpX2lubyxcXG42Mzg0OlxcdFxcdFxcdFxcdFxcdFxcdFxcdCAgICAgbWFwLm1fbGJsaywgbWFwLm1fcGJsaywgbWFwLm1fbGVuLCAxKTtcXG42Mzg1OlxcdFxcdFxcdFxcdGlmIChyZXQpXFxuNjM4NjpcXHRcXHRcXHRcXHRcXHRnb3RvIG91dDtcXG42Mzg3OlxcdFxcdFxcdH1cXG42Mzg4OlxcdFxcdFxcdGN1ciA9IGN1ciArIG1hcC5tX2xlbjtcXG42Mzg5OlxcdFxcdH1cXG42MzkwOlxcdFxcbjYzOTE6XFx0b3V0OlxcbjYzOTI6XFx0XFx0ZXh0NF9mcmVlX2V4dF9wYXRoKHBhdGgpO1xcbjYzOTM6XFx0XFx0cmV0dXJuIHJldCBcXHUwMDNjIDAgPyByZXQgOiAwO1xcbjYzOTQ6XFx0fVxcbjYzOTU6XFx0XFxuNjM5NjpcXHQjaWYgSVNfRU5BQkxFRChDT05GSUdfRVhUNF9LVU5JVF9URVNUUylcXG42Mzk3OlxcdGludCBleHQ0X2V4dF9zcGFjZV9yb290X2lkeF90ZXN0KHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBjaGVjaylcXG42Mzk4OlxcdHtcXG42Mzk5OlxcdFxcdHJldHVybiBleHQ0X2V4dF9zcGFjZV9yb290X2lkeChpbm9kZSwgY2hlY2spO1xcbjY0MDA6XFx0fVxcbjY0MDE6XFx0RVhQT1JUX1NZTUJPTF9GT1JfRVhUNF9URVNUKGV4dDRfZXh0X3NwYWNlX3Jvb3RfaWR4X3Rlc3QpO1xcbjY0MDI6XFx0XFxuNjQwMzpcXHRzdHJ1Y3QgZXh0NF9leHRfcGF0aCAqZXh0NF9zcGxpdF9jb252ZXJ0X2V4dGVudHNfdGVzdChoYW5kbGVfdCAqaGFuZGxlLFxcbjY0MDQ6XFx0XFx0XFx0XFx0c3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGV4dDRfbWFwX2Jsb2NrcyAqbWFwLFxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xNFQxNDozNjoxOS45MDM0Nzg2MDVaIiwiU2VxIjo1LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo3ODk2MDAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwiZnMvZXh0NC9mYXN0X2NvbW1pdC5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDE5MzAsXG4gIFwiTGluZUNvdW50XCI6IDQwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIjE5MzA6XFx0XFx0c3RydWN0IGV4dDRfaW5vZGUgKnJhd19mY19pbm9kZTtcXG4xOTMxOlxcdFxcdHN0cnVjdCBpbm9kZSAqaW5vZGUgPSBOVUxMO1xcbjE5MzI6XFx0XFx0c3RydWN0IGV4dDRfaWxvYyBpbG9jO1xcbjE5MzM6XFx0XFx0aW50IGlub2RlX2xlbiwgaW5vLCByZXQsIHRhZyA9IHRsLVxcdTAwM2VmY190YWc7XFxuMTkzNDpcXHRcXHRzdHJ1Y3QgZXh0NF9leHRlbnRfaGVhZGVyICplaDtcXG4xOTM1OlxcdFxcdHNpemVfdCBvZmZfZ2VuID0gb2Zmc2V0b2Yoc3RydWN0IGV4dDRfaW5vZGUsIGlfZ2VuZXJhdGlvbik7XFxuMTkzNjpcXHRcXG4xOTM3OlxcdFxcdG1lbWNweShcXHUwMDI2ZmNfaW5vZGUsIHZhbCwgc2l6ZW9mKGZjX2lub2RlKSk7XFxuMTkzODpcXHRcXG4xOTM5OlxcdFxcdGlubyA9IGxlMzJfdG9fY3B1KGZjX2lub2RlLmZjX2lubyk7XFxuMTk0MDpcXHRcXHR0cmFjZV9leHQ0X2ZjX3JlcGxheShzYiwgdGFnLCBpbm8sIDAsIDApO1xcbjE5NDE6XFx0XFxuMTk0MjpcXHRcXHRpbm9kZSA9IGV4dDRfaWdldChzYiwgaW5vLCBFWFQ0X0lHRVRfTk9STUFMKTtcXG4xOTQzOlxcdFxcdGlmICghSVNfRVJSKGlub2RlKSkge1xcbjE5NDQ6XFx0XFx0XFx0cmV0ID0gZXh0NF9leHRfY2xlYXJfYmIoaW5vZGUpO1xcbjE5NDU6XFx0XFx0XFx0aXB1dChpbm9kZSk7XFxuMTk0NjpcXHRcXHRcXHRpbm9kZSA9IE5VTEw7XFxuMTk0NzpcXHRcXHRcXHRpZiAocmV0KVxcbjE5NDg6XFx0XFx0XFx0XFx0Z290byBvdXQ7XFxuMTk0OTpcXHRcXHR9XFxuMTk1MDpcXHRcXHRpbm9kZSA9IE5VTEw7XFxuMTk1MTpcXHRcXG4xOTUyOlxcdFxcdHJldCA9IGV4dDRfZmNfcmVjb3JkX21vZGlmaWVkX2lub2RlKHNiLCBpbm8pO1xcbjE5NTM6XFx0XFx0aWYgKHJldClcXG4xOTU0OlxcdFxcdFxcdGdvdG8gb3V0O1xcbjE5NTU6XFx0XFxuMTk1NjpcXHRcXHRyYXdfZmNfaW5vZGUgPSAoc3RydWN0IGV4dDRfaW5vZGUgKilcXG4xOTU3OlxcdFxcdFxcdCh2YWwgKyBvZmZzZXRvZihzdHJ1Y3QgZXh0NF9mY19pbm9kZSwgZmNfcmF3X2lub2RlKSk7XFxuMTk1ODpcXHRcXHRyZXQgPSBleHQ0X2dldF9mY19pbm9kZV9sb2Moc2IsIGlubywgXFx1MDAyNmlsb2MpO1xcbjE5NTk6XFx0XFx0aWYgKHJldClcXG4xOTYwOlxcdFxcdFxcdGdvdG8gb3V0O1xcbjE5NjE6XFx0XFxuMTk2MjpcXHRcXHRpbm9kZV9sZW4gPSB0bC1cXHUwMDNlZmNfbGVuIC0gc2l6ZW9mKHN0cnVjdCBleHQ0X2ZjX2lub2RlKTtcXG4xOTYzOlxcdFxcdHJhd19pbm9kZSA9IGV4dDRfcmF3X2lub2RlKFxcdTAwMjZpbG9jKTtcXG4xOTY0OlxcdFxcbjE5NjU6XFx0XFx0bWVtY3B5KHJhd19pbm9kZSwgcmF3X2ZjX2lub2RlLCBvZmZzZXRvZihzdHJ1Y3QgZXh0NF9pbm9kZSwgaV9ibG9jaykpO1xcbjE5NjY6XFx0XFx0bWVtY3B5KCh1OCAqKXJhd19pbm9kZSArIG9mZl9nZW4sICh1OCAqKXJhd19mY19pbm9kZSArIG9mZl9nZW4sXFxuMTk2NzpcXHRcXHQgICAgICAgaW5vZGVfbGVuIC0gb2ZmX2dlbik7XFxuMTk2ODpcXHRcXHRpZiAobGUzMl90b19jcHUocmF3X2lub2RlLVxcdTAwM2VpX2ZsYWdzKSBcXHUwMDI2IEVYVDRfRVhURU5UU19GTCkge1xcbjE5Njk6XFx0XFx0XFx0ZWggPSAoc3RydWN0IGV4dDRfZXh0ZW50X2hlYWRlciAqKShcXHUwMDI2cmF3X2lub2RlLVxcdTAwM2VpX2Jsb2NrWzBdKTtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTRUMTQ6MzY6MTkuOTA0MjczMjE1WiIsIlNlcSI6NiwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjgtZmxhc2giLCJEdXJhdGlvbiI6MjIwMTY5NDM0NzEsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSB0YWtlOlxuXG4qKkludmVzdGlnYXRpbmcgYGV4dDRfZXh0X2NsZWFyX2JiYCBpbiB0aGUgRmFzdCBDb21taXQgQ29udGV4dCoqXG5cbkFscmlnaHQsIHNvIGBleHQ0X2V4dF9jbGVhcl9iYmAgaXMgaW52b2x2ZWQgaW4gZmFzdCBjb21taXQgcmVwbGF5LiBUaGF0J3MgdGhlIHN0YXJ0aW5nIHBvaW50LiBNeSBuZXh0IG1vdmUgaXMgdG8gY2hlY2sgdGhlIGJpZ2dlciBwaWN0dXJlLCB0byB1bmRlcnN0YW5kIHdoZXJlIGVsc2UgdGhpcyBmdW5jdGlvbiBpcyBiZWluZyB1c2VkIHdpdGhpbiB0aGUgZXh0NCBmaWxlc3lzdGVtIGNvZGUuIEkgd2FudCB0byBpZGVudGlmeSBhbnkgb3RoZXIgY2FsbGVycyBvZiBgZXh0NF9leHRfY2xlYXJfYmJgLiBVbmRlcnN0YW5kaW5nIHRoZSBjYWxsIGdyYXBoIHdpbGwgaGVscCBtZSBncmFzcCB0aGUgYnJvYWRlciBpbXBsaWNhdGlvbnMgb2YgdGhpcyBmdW5jdGlvbiwgaG93IGl0IHJlbGF0ZXMgdG8gb3RoZXIgZXh0NCBmdW5jdGlvbmFsaXRpZXMsIGFuZCBwaW5wb2ludCBwb3RlbnRpYWwgYXJlYXMgb2YgY29uY2VybiBvciBvcHRpbWl6YXRpb24gb3Bwb3J0dW5pdGllcyByZWxhdGVkIHRvIHRoZSBmYXN0IGNvbW1pdCBwYXRoLiBEaXZpbmcgaW50byB0aGUgZGlmZmVyZW50IGNhbGxlcnMgaXMgZXNzZW50aWFsIGZvciBhIHRob3JvdWdoIHVuZGVyc3RhbmRpbmcuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjU3MTksIk91dHB1dFRva2VucyI6MjIsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo0MywiVG9vbENhbGxzIjpbInJlYWQtZmlsZSIsInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTE0VDE0OjM2OjQxLjkyMTIyMDQ2NloiLCJTZXEiOjcsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyMzQ4MDQ5NDU0LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImV4dDRfZXh0X2NsZWFyX2JiXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImZzL2V4dDQvZXh0NC5oPTM5NTc9ZXh0ZXJuIGludCBleHQ0X2V4dF9yZXBsYXlfdXBkYXRlX2V4KHN0cnVjdCBpbm9kZSAqaW5vZGUsIGV4dDRfbGJsa190IHN0YXJ0LFxcbmZzL2V4dDQvZXh0NC5oLTM5NTgtXFx0XFx0aW50IGxlbiwgaW50IHVud3JpdHRlbiwgZXh0NF9mc2Jsa190IHBibGspO1xcbmZzL2V4dDQvZXh0NC5oOjM5NTk6ZXh0ZXJuIGludCBleHQ0X2V4dF9jbGVhcl9iYihzdHJ1Y3QgaW5vZGUgKmlub2RlKTtcXG5mcy9leHQ0L2V4dDQuaC0zOTYwLVxcbi0tXFxuZnMvZXh0NC9leHRlbnRzLmM9NjI1Mj1pbnQgZXh0NF9leHRfcmVwbGF5X3NldF9pYmxvY2tzKHN0cnVjdCBpbm9kZSAqaW5vZGUpXFxuLS1cXG5mcy9leHQ0L2V4dGVudHMuYy02MzM4LVxcbmZzL2V4dDQvZXh0ZW50cy5jOjYzMzk6aW50IGV4dDRfZXh0X2NsZWFyX2JiKHN0cnVjdCBpbm9kZSAqaW5vZGUpXFxuZnMvZXh0NC9leHRlbnRzLmMtNjM0MC17XFxuLS1cXG5mcy9leHQ0L2Zhc3RfY29tbWl0LmM9MTkyNT1zdGF0aWMgaW50IGV4dDRfZmNfcmVwbGF5X2lub2RlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsXFxuLS1cXG5mcy9leHQ0L2Zhc3RfY29tbWl0LmMtMTk0My1cXHRpZiAoIUlTX0VSUihpbm9kZSkpIHtcXG5mcy9leHQ0L2Zhc3RfY29tbWl0LmM6MTk0NDpcXHRcXHRyZXQgPSBleHQ0X2V4dF9jbGVhcl9iYihpbm9kZSk7XFxuZnMvZXh0NC9mYXN0X2NvbW1pdC5jLTE5NDUtXFx0XFx0aXB1dChpbm9kZSk7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTE0VDE0OjM2OjQ0LjI2OTI3NzMyWiIsIlNlcSI6OCwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjgtZmxhc2giLCJEdXJhdGlvbiI6ODM4NTI5MzA4NiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IGF0dGVtcHQgYXQgc3VtbWFyaXppbmcgdGhlIHRob3VnaHQgcHJvY2VzcywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZTpcblxuKipBbmFseXppbmcgdGhlIENhbGwgUGF0aCBvZiBgZXh0NF9mY19yZXBsYXlfaW5vZGVgKipcblxuT2theSwgc28gSSdtIGRpdmluZyBpbnRvIGBleHQ0X2ZjX3JlcGxheV9pbm9kZWAgYW5kIG5lZWQgdG8gdW5kZXJzdGFuZCBpdHMgY29udGV4dC4gV2hlcmUgZXhhY3RseSBkb2VzIHRoaXMgZnVuY3Rpb24gZml0IGludG8gdGhlIGJyb2FkZXIgcGljdHVyZSBvZiBleHQ0J3MgZmlsZSBjcmVhdGlvbiBhbmQgam91cm5hbGluZyBwcm9jZXNzPyBJIG5lZWQgdG8gdHJhY2UgaXRzIGNhbGwgcGF0aC4gVGhpcyBpc24ndCBqdXN0IGFib3V0IHJlYWRpbmcgdGhlIGNvZGU7IGl0J3MgYWJvdXQgcmVjb25zdHJ1Y3RpbmcgdGhlIG9wZXJhdGlvbmFsIGZsb3cgaW4gbXkgaGVhZC4gSSdtIHRoaW5raW5nLCBcIndoYXQgZXZlbnRzIHRyaWdnZXIgYSByZXBsYXkgb3BlcmF0aW9uIG9uIGFuIGlub2RlIHdoZW4gZmlsZSBjcmVhdGlvbiBpcyBjb25jZXJuZWQ/XCIgTXkgaW5pdGlhbCBmb2N1cyBpcyBvbiBpZGVudGlmeWluZyB0aGUgZGlyZWN0IGNhbGxlcnMsIHVuZGVyc3RhbmRpbmcgdGhlIGFyZ3VtZW50cyBwYXNzZWQsIGFuZCB3aGF0IGluZm9ybWF0aW9uIHRoZXkgcHJvdmlkZSB0byBgZXh0NF9mY19yZXBsYXlfaW5vZGVgLiBJIG5lZWQgdG8gbG9vayBmb3IgY2FsbHMgc3BlY2lmaWNhbGx5IHJlbGF0ZWQgdG8gdHJhbnNhY3Rpb24gcmVjb3ZlcnkgYW5kIGVycm9yIGhhbmRsaW5nIGR1cmluZyBpbm9kZSBjcmVhdGlvbi4gRnJvbSB0aGVyZSwgSSdsbCBuZWVkIHRvIHdvcmsgbXkgd2F5IHVwIHRoZSBzdGFjaywgbG9va2luZyBhdCB0aGUgaW50ZXJhY3Rpb24gd2l0aCBibG9jayBhbGxvY2F0aW9uLCBqb3VybmFsIGNvbW1pdCwgYW5kIHRoZSBvdmVyYWxsIHRyYW5zYWN0aW9uIG1hbmFnZW1lbnQgd2l0aGluIHRoZSBleHQ0IGZpbGVzeXN0ZW0uIFRoZSBhaW0gaGVyZSBpcyBhIGNvbXBsZXRlIHVuZGVyc3RhbmRpbmcgb2YgdGhlIGNvbmRpdGlvbnMgdW5kZXIgd2hpY2ggdGhpcyBmdW5jdGlvbiBleGVjdXRlcyBkdXJpbmcgcG90ZW50aWFsIGZhaWx1cmUgc2NlbmFyaW9zLiBUaGlzIGlzIHRoZSBiZWRyb2NrIHRvIHVuZGVyc3RhbmQgdGhlIHJlbGlhYmlsaXR5IGFuZCBjb3JyZWN0bmVzcyBvZiB0aGUgZXh0NCBmaWxlc3lzdGVtIGFuZCB0byBpZGVudGlmeSBhbmQgZml4IGFueSBjb3JuZXIgY2FzZXMgdGhhdCBjYW4gYXJpc2UuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjYyOTMsIk91dHB1dFRva2VucyI6MjIsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxOSwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0xNFQxNDozNjo1Mi42NTQ1NzMxOTZaIiwiU2VxIjo5LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MjMwMTk2NjY5MSwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJleHQ0X2ZjX3JlcGxheV9pbm9kZVwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJmcy9leHQ0L2Zhc3RfY29tbWl0LmM9MTg5Nj1zdGF0aWMgaW50IGV4dDRfZmNfcmVjb3JkX21vZGlmaWVkX2lub2RlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCBpbm8pXFxuLS1cXG5mcy9leHQ0L2Zhc3RfY29tbWl0LmMtMTkyNC0gKi9cXG5mcy9leHQ0L2Zhc3RfY29tbWl0LmM6MTkyNTpzdGF0aWMgaW50IGV4dDRfZmNfcmVwbGF5X2lub2RlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsXFxuZnMvZXh0NC9mYXN0X2NvbW1pdC5jLTE5MjYtXFx0XFx0XFx0XFx0c3RydWN0IGV4dDRfZmNfdGxfbWVtICp0bCwgdTggKnZhbClcXG4tLVxcbmZzL2V4dDQvZmFzdF9jb21taXQuYz0yNTczPXN0YXRpYyBpbnQgZXh0NF9mY19yZXBsYXkoam91cm5hbF90ICpqb3VybmFsLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLFxcbi0tXFxuZnMvZXh0NC9mYXN0X2NvbW1pdC5jLTI2MzgtXFx0XFx0Y2FzZSBFWFQ0X0ZDX1RBR19JTk9ERTpcXG5mcy9leHQ0L2Zhc3RfY29tbWl0LmM6MjYzOTpcXHRcXHRcXHRyZXQgPSBleHQ0X2ZjX3JlcGxheV9pbm9kZShzYiwgXFx1MDAyNnRsLCB2YWwpO1xcbmZzL2V4dDQvZmFzdF9jb21taXQuYy0yNjQwLVxcdFxcdFxcdGJyZWFrO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xNFQxNDozNjo1NC45NTY1NDUxODdaIiwiU2VxIjoxMCwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjgtZmxhc2giLCJEdXJhdGlvbiI6OTc4MjY5Njk2NTEsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIHRoZSBleHQ0IEZhc3QgQ29tbWl0IFJlcGxheSBIYW5kbGVyKipcblxuT2theSwgbGV0J3MgYnJlYWsgdGhpcyBkb3duLiBXZSdyZSBsb29raW5nIGF0IGBleHQ0X2ZjX3JlcGxheWAsIHNwZWNpZmljYWxseSBob3cgaXQgaGFuZGxlcyBmYXN0IGNvbW1pdCByZXBsYXkgaW4gdGhlIGV4dDQgZmlsZXN5c3RlbSBhbmQgaXRzIGludGVyYWN0aW9uIHdpdGggdGhlIGpvdXJuYWwuIEkga25vdyB0aGlzIGNvZGUsIG9mIGNvdXJzZS4gSXQncyB0cmlnZ2VyZWQgZHVyaW5nIG1vdW50cyBvZiBleHQ0IGZpbGVzeXN0ZW1zIHdpdGggam91cm5hbCByZWNvcmRzLCB3aGljaCBpbmNsdWRlcyBzY2VuYXJpb3MgbGlrZSBzeXprYWxsZXItZnV6emVkIGltYWdlcywgcG93ZXItbG9zcyBzaW11bGF0aW9ucywgb3Igbm9ybWFsIGZhc3QtY29tbWl0IG9wZXJhdGlvbnMuIFJpZ2h0LCBzeXprYWxsZXIgaXMgYWN0aXZlbHkgbW91bnRpbmcgdGhvc2UgY3JhZnRlZCBpbWFnZXMsIHBva2luZyBhdCB0aGUgZmlsZXN5c3RlbSB3aXRoIHZhcmlvdXMgc3lzY2FsbHMuIEFuZCBleHQ0IGlzLCBhcyBleHBlY3RlZCwgYSBwcmltZSB0YXJnZXQgZm9yIHN5emthbGxlcidzIGZ1enppbmcgZWZmb3J0cy5cblxuTm93LCBsZXQncyBkaXZlIGludG8gdGhpcyBwYXRjaC4gVGhlIGtleSBjaGFuZ2VzIGFyZSB3aXRoaW4gYGZzL2V4dDQvZXh0ZW50cy5jYCwgc3BlY2lmaWNhbGx5IGluIHRoZSBmdW5jdGlvbiBgZXh0NF9leHRfY2xlYXJfYmIoc3RydWN0IGlub2RlICppbm9kZSlgLiBCZWZvcmUgdGhlIHBhdGNoLCB0aGUgY29kZSB3YXMuLi4gd2VsbCwgbGV0J3MganVzdCBzYXkgYSBiaXQgbG9vc2Ugd2l0aCBpdHMgZXJyb3IgaGFuZGxpbmcuXG5cblByZXZpb3VzbHksIGlmIGBleHQ0X2ZpbmRfZXh0ZW50YCBmYWlsZWQsIHJldHVybmluZyBhbiBFUlJfUFRSLCB0aGUgY29kZSBqdXN0IHNldCBgcGF0aCA9IE5VTExgLCBhbmQga2VwdCBnb2luZyEgVGhhdCdzIGJhZC4gQ3JpdGljYWxseSwgd2Ugbm93IGhhdmUgYSBgaWYgKElTX0VSUihwYXRoKSlgIGNoZWNrIGFuZCByZXR1cm4gYSBwcm9wZXIgZXJyb3IgY29kZS4gVGhpcyBpcyBhIGNsZWFyIGltcHJvdmVtZW50LlxuXG5BZGRpdGlvbmFsbHksIHRoZSBwYXRjaCBhZGRyZXNzZXMgdGhlIGlnbm9yZWQgcmV0dXJuIHZhbHVlcyBmcm9tIGBleHQ0X2ZjX3JlY29yZF9yZWdpb25zYC4gQmVmb3JlLCBlcnJvcnMgZnJvbSB0aGlzIGZ1bmN0aW9uIOKAkyB0aGluZ3MgbGlrZSBgLUVOT01FTWAg4oCTIHdlcmUgc2ltcGx5IGlnbm9yZWQsIHRoZSBsb29wIGNvbnRpbnVpbmcsIGFuZCB0aGVuIHRoZSBmdW5jdGlvbiBoYXJkY29kZWQgYHJldHVybiAwYCBhdCB0aGUgZW5kISBUaGF0J3MgYW5vdGhlciBwb3RlbnRpYWwgc291cmNlIG9mIGJ1Z3MuIE5vdywgYW55IGVycm9yIGZyb20gZWl0aGVyIGBleHQ0X21hcF9ibG9ja3NgIG9yIGBleHQ0X2ZpbmRfZXh0ZW50YCB0cmlnZ2VycyBhIGBnb3RvIG91dDtgLCBhbmQgYG91dDpgIG5vdyBwcm9wYWdhdGVzIHRoZSBlcnJvciBjb2RlIGNvcnJlY3RseS4gVGhlIGZ1bmN0aW9uIHJldHVybnMgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIGlmIGl0IGVuY291bnRlcmVkIGFuIGlzc3VlOyBvdGhlcndpc2UsIGl0IHJldHVybnMgMC5cblxuQnV0IHdhaXQgYSBtaW51dGUuLi4gd2hhdCBkb2VzIGBleHQ0X2ZyZWVfZXh0X3BhdGgocGF0aClgIGRvIHdoZW4gYHBhdGhgIGlzIGFjdHVhbGx5IGFuIEVSUl9QVFI/IFRoYXQncyB0aGUgbmV4dCBxdWVzdGlvbiBJIG5lZWQgdG8gYW5zd2VyLiBJIHNob3VsZCBwcm9iYWJseSBjaGVjayB0aGF0IGZ1bmN0aW9uJ3MgaW1wbGVtZW50YXRpb24ganVzdCB0byBiZSBzdXJlLi4uXG5cblxuIiwiSW5wdXRUb2tlbnMiOjY4NzEsIk91dHB1dFRva2VucyI6MjMsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo3OTksIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMTRUMTQ6Mzg6MzIuNzgzNTE4Mjk4WiIsIlNlcSI6MTEsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyNDUxNzA3Mzc3LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcInZvaWQgZXh0NF9mcmVlX2V4dF9wYXRoXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImZzL2V4dDQvZXh0NC5oPTM5MzU9ZXh0ZXJuIHN0cnVjdCBleHQ0X2V4dF9wYXRoICpleHQ0X2ZpbmRfZXh0ZW50KHN0cnVjdCBpbm9kZSAqLCBleHQ0X2xibGtfdCxcXG4tLVxcbmZzL2V4dDQvZXh0NC5oLTM5MzctXFx0XFx0XFx0XFx0XFx0ICAgICAgaW50IGZsYWdzKTtcXG5mcy9leHQ0L2V4dDQuaDozOTM4OmV4dGVybiB2b2lkIGV4dDRfZnJlZV9leHRfcGF0aChzdHJ1Y3QgZXh0NF9leHRfcGF0aCAqKTtcXG5mcy9leHQ0L2V4dDQuaC0zOTM5LWV4dGVybiBpbnQgZXh0NF9leHRfY2hlY2tfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSk7XFxuLS1cXG5mcy9leHQ0L2V4dGVudHMuYz0xMTE9c3RhdGljIHZvaWQgZXh0NF9leHRfZHJvcF9yZWZzKHN0cnVjdCBleHQ0X2V4dF9wYXRoICpwYXRoKVxcbi0tXFxuZnMvZXh0NC9leHRlbnRzLmMtMTIxLVxcbmZzL2V4dDQvZXh0ZW50cy5jOjEyMjp2b2lkIGV4dDRfZnJlZV9leHRfcGF0aChzdHJ1Y3QgZXh0NF9leHRfcGF0aCAqcGF0aClcXG5mcy9leHQ0L2V4dGVudHMuYy0xMjMte1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xNFQxNDozODozNS4yMzUyMzMxMTVaIiwiU2VxIjoxMiwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjgtZmxhc2giLCJEdXJhdGlvbiI6NzA4NzUxNDE0NCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgbGV0J3MgZGl2ZSBpbnRvIHRoaXMuIEknbSBnb2luZyB0byBwdWxsIHVwIGBleHQ0X2ZyZWVfZXh0X3BhdGhgIGF0IGxpbmUgMTIyIHdpdGhpbiBgZnMvZXh0NC9leHRlbnRzLmNgLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCBob3cgdGhlIGV4dDQgZmlsZXN5c3RlbSBoYW5kbGVzIGZyZWVpbmcgZXh0ZW50IHBhdGhzLiBJIGtub3cgdGhpcyBmdW5jdGlvbiBpcyBjcml0aWNhbCBmb3IgbWFpbnRhaW5pbmcgZGF0YSBpbnRlZ3JpdHkgYW5kIGVmZmljaWVudCBzcGFjZSBtYW5hZ2VtZW50IHdpdGhpbiBhbiBleHQ0IHZvbHVtZS4gVGhpcyBpcyBhIGtleSBidWlsZGluZyBibG9jayBpbiB1bmRlcnN0YW5kaW5nIGhvdyBleHRlbnRzIGFyZSB1c2VkLCBhbmQgbWFuYWdlZCwgd2l0aGluIGV4dDQuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjg0MTEsIk91dHB1dFRva2VucyI6MzcsIk91dHB1dFRob3VnaHRzVG9rZW5zIjozMiwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0xNFQxNDozODo0Mi4zMjI3NTAxMDlaIiwiU2VxIjoxMywiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MzExMDAwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcImZzL2V4dDQvZXh0ZW50cy5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDEyMCxcbiAgXCJMaW5lQ291bnRcIjogMjBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiIDEyMDpcXHR9XFxuIDEyMTpcXHRcXG4gMTIyOlxcdHZvaWQgZXh0NF9mcmVlX2V4dF9wYXRoKHN0cnVjdCBleHQ0X2V4dF9wYXRoICpwYXRoKVxcbiAxMjM6XFx0e1xcbiAxMjQ6XFx0XFx0aWYgKElTX0VSUl9PUl9OVUxMKHBhdGgpKVxcbiAxMjU6XFx0XFx0XFx0cmV0dXJuO1xcbiAxMjY6XFx0XFx0ZXh0NF9leHRfZHJvcF9yZWZzKHBhdGgpO1xcbiAxMjc6XFx0XFx0a2ZyZWUocGF0aCk7XFxuIDEyODpcXHR9XFxuIDEyOTpcXHRcXG4gMTMwOlxcdC8qXFxuIDEzMTpcXHQgKiBNYWtlIHN1cmUgJ2hhbmRsZScgaGFzIGF0IGxlYXN0ICdjaGVja19jcmVkJyBjcmVkaXRzLiBJZiBub3QsIHJlc3RhcnRcXG4gMTMyOlxcdCAqIHRyYW5zYWN0aW9uIHdpdGggJ3Jlc3RhcnRfY3JlZCcgY3JlZGl0cy4gVGhlIGZ1bmN0aW9uIGRyb3BzIGlfZGF0YV9zZW1cXG4gMTMzOlxcdCAqIHdoZW4gcmVzdGFydGluZyB0cmFuc2FjdGlvbiBhbmQgZ2V0cyBpdCBhZnRlciB0cmFuc2FjdGlvbiBpcyByZXN0YXJ0ZWQuXFxuIDEzNDpcXHQgKlxcbiAxMzU6XFx0ICogVGhlIGZ1bmN0aW9uIHJldHVybnMgMCBvbiBzdWNjZXNzLCAxIGlmIHRyYW5zYWN0aW9uIGhhZCB0byBiZSByZXN0YXJ0ZWQsXFxuIDEzNjpcXHQgKiBhbmQgXFx1MDAzYyAwIGluIGNhc2Ugb2YgZmF0YWwgZXJyb3IuXFxuIDEzNzpcXHQgKi9cXG4gMTM4OlxcdGludCBleHQ0X2RhdGFzZW1fZW5zdXJlX2NyZWRpdHMoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSxcXG4gMTM5OlxcdFxcdFxcdFxcdFxcdGludCBjaGVja19jcmVkLCBpbnQgcmVzdGFydF9jcmVkLFxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xNFQxNDozODo0Mi4zMjMwNjM3NjlaIiwiU2VxIjoxNCwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjgtZmxhc2giLCJEdXJhdGlvbiI6MjEwNzI5NTUyMTIsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIHRoZSBGaWxlIENyZWF0aW9uIFJlcGxheSBDb2RlKipcblxuT2theSwgc28gSSdtIGxvb2tpbmcgYXQgYGV4dDRfZnJlZV9leHRfcGF0aGAsIGFuZCBJIHNlZSBpdCBncmFjZWZ1bGx5IGhhbmRsZXMgYSBudWxsIG9yIGVycm9yLXNpZ25hbGluZyBwYXRoLiBHb29kLiBOb3csIGxldCdzIGRpZyBpbnRvIGBleHQ0X2ZjX3JlcGxheV9pbm9kZWAuIEkgc2VlIHRoZSBjb2RlIGNhbGxzIGBleHQ0X2lnZXRgIHRvIGdldCB0aGUgaW5vZGUuIElmIHRoYXQncyBzdWNjZXNzZnVsLCBpdCBwcm9jZWVkcyB0byBjYWxsIGBleHQ0X2V4dF9jbGVhcl9iYmAuIFRoZSBpbnRlcmVzdGluZyBiaXQgaGVyZSBpcyB0aGF0IGlmIGBleHQ0X2V4dF9jbGVhcl9iYmAgcmV0dXJucyBhbiBlcnJvciwgaXQgaW1tZWRpYXRlbHkganVtcHMgdG8gYG91dDpgLiBJJ20gZ29pbmcgdG8gZm9sbG93IHRoYXQgYGdvdG9gIGFuZCBzZWUgd2hhdCBoYXBwZW5zIHRoZXJlLiBVbmRlcnN0YW5kaW5nIHRoZSBlcnJvciBoYW5kbGluZyB3aXRoaW4gYGV4dDRfZmNfcmVwbGF5X2lub2RlYCBpcyBrZXkgdG8gZW5zdXJpbmcgdGhlIGludGVncml0eSBvZiB0aGUgZmlsZSBzeXN0ZW0gYWZ0ZXIgYSBjcmFzaCBvciBwb3dlciBmYWlsdXJlLiBJIG5lZWQgdG8gdHJhY2UgdGhpcyBcIm91dDpcIiBsYWJlbCBhbmQgdW5kZXJzdGFuZCB0aGUgZnVsbCBpbXBsaWNhdGlvbnMgb2YgYW4gYGV4dDRfZXh0X2NsZWFyX2JiYCBmYWlsdXJlLlxuXG5cbiIsIklucHV0VG9rZW5zIjo4OTAwLCJPdXRwdXRUb2tlbnMiOjM5LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTY5LCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMTRUMTQ6Mzk6MDMuMzk2MDIzMDAxWiIsIlNlcSI6MTUsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjIzMTQzOTAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwiZnMvZXh0NC9mYXN0X2NvbW1pdC5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDE5ODAsXG4gIFwiTGluZUNvdW50XCI6IDQwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIjE5ODA6XFx0XFx0XFx0XFx0c2l6ZW9mKHJhd19pbm9kZS1cXHUwMDNlaV9ibG9jaykpO1xcbjE5ODE6XFx0XFx0fVxcbjE5ODI6XFx0XFxuMTk4MzpcXHRcXHQvKiBJbW1lZGlhdGVseSB1cGRhdGUgdGhlIGlub2RlIG9uIGRpc2suICovXFxuMTk4NDpcXHRcXHRyZXQgPSBleHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YShOVUxMLCBOVUxMLCBpbG9jLmJoKTtcXG4xOTg1OlxcdFxcdGlmIChyZXQpXFxuMTk4NjpcXHRcXHRcXHRnb3RvIG91dF9icmVsc2U7XFxuMTk4NzpcXHRcXHRyZXQgPSBzeW5jX2RpcnR5X2J1ZmZlcihpbG9jLmJoKTtcXG4xOTg4OlxcdFxcdGlmIChyZXQpXFxuMTk4OTpcXHRcXHRcXHRnb3RvIG91dF9icmVsc2U7XFxuMTk5MDpcXHRcXHRyZXQgPSBleHQ0X21hcmtfaW5vZGVfdXNlZChzYiwgaW5vKTtcXG4xOTkxOlxcdFxcdGlmIChyZXQpXFxuMTk5MjpcXHRcXHRcXHRnb3RvIG91dF9icmVsc2U7XFxuMTk5MzpcXHRcXG4xOTk0OlxcdFxcdC8qIEdpdmVuIHRoYXQgd2UganVzdCB3cm90ZSB0aGUgaW5vZGUgb24gZGlzaywgdGhpcyBTSE9VTEQgc3VjY2VlZC4gKi9cXG4xOTk1OlxcdFxcdGlub2RlID0gZXh0NF9pZ2V0KHNiLCBpbm8sIEVYVDRfSUdFVF9OT1JNQUwpO1xcbjE5OTY6XFx0XFx0aWYgKElTX0VSUihpbm9kZSkpIHtcXG4xOTk3OlxcdFxcdFxcdGV4dDRfZGVidWcoXFxcIklub2RlIG5vdCBmb3VuZC5cXFwiKTtcXG4xOTk4OlxcdFxcdFxcdGlub2RlID0gTlVMTDtcXG4xOTk5OlxcdFxcdFxcdHJldCA9IC1FRlNDT1JSVVBURUQ7XFxuMjAwMDpcXHRcXHRcXHRnb3RvIG91dF9icmVsc2U7XFxuMjAwMTpcXHRcXHR9XFxuMjAwMjpcXHRcXG4yMDAzOlxcdFxcdC8qXFxuMjAwNDpcXHRcXHQgKiBPdXIgYWxsb2NhdG9yIGNvdWxkIGhhdmUgbWFkZSBkaWZmZXJlbnQgZGVjaXNpb25zIHRoYW4gYmVmb3JlXFxuMjAwNTpcXHRcXHQgKiBjcmFzaGluZy4gVGhpcyBzaG91bGQgYmUgZml4ZWQgYnV0IHVudGlsIHRoZW4sIHdlIGNhbGN1bGF0ZVxcbjIwMDY6XFx0XFx0ICogdGhlIG51bWJlciBvZiBibG9ja3MgdGhlIGlub2RlLlxcbjIwMDc6XFx0XFx0ICovXFxuMjAwODpcXHRcXHRpZiAoIWV4dDRfdGVzdF9pbm9kZV9mbGFnKGlub2RlLCBFWFQ0X0lOT0RFX0lOTElORV9EQVRBKSlcXG4yMDA5OlxcdFxcdFxcdGV4dDRfZXh0X3JlcGxheV9zZXRfaWJsb2Nrcyhpbm9kZSk7XFxuMjAxMDpcXHRcXG4yMDExOlxcdFxcdGlub2RlLVxcdTAwM2VpX2dlbmVyYXRpb24gPSBsZTMyX3RvX2NwdShleHQ0X3Jhd19pbm9kZShcXHUwMDI2aWxvYyktXFx1MDAzZWlfZ2VuZXJhdGlvbik7XFxuMjAxMjpcXHRcXHRleHQ0X3Jlc2V0X2lub2RlX3NlZWQoaW5vZGUpO1xcbjIwMTM6XFx0XFxuMjAxNDpcXHRcXHRleHQ0X2lub2RlX2NzdW1fc2V0KGlub2RlLCBleHQ0X3Jhd19pbm9kZShcXHUwMDI2aWxvYyksIEVYVDRfSShpbm9kZSkpO1xcbjIwMTU6XFx0XFx0cmV0ID0gZXh0NF9oYW5kbGVfZGlydHlfbWV0YWRhdGEoTlVMTCwgTlVMTCwgaWxvYy5iaCk7XFxuMjAxNjpcXHRcXHRzeW5jX2RpcnR5X2J1ZmZlcihpbG9jLmJoKTtcXG4yMDE3OlxcdG91dF9icmVsc2U6XFxuMjAxODpcXHRcXHRicmVsc2UoaWxvYy5iaCk7XFxuMjAxOTpcXHRvdXQ6XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTE0VDE0OjM5OjAzLjM5ODM0MzEzMVoiLCJTZXEiOjE2LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuOC1mbGFzaCIsIkR1cmF0aW9uIjoxMjIxNjIyODgzMiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIGEgc3VtbWFyeSBvZiBteSB0aG91Z2h0IHByb2Nlc3MsIGFzIHJlcXVlc3RlZDpcblxuKipEaXZpbmcgaW50byBgZmFzdF9jb21taXQuY2AqKlxuXG5BbHJpZ2h0LCB0aW1lIHRvIGRpZyBpbi4gSSBuZWVkIHRvIHJlZnJlc2ggbXkgbWVtb3J5IG9uIHRoZSBmYXN0IGNvbW1pdCBpbXBsZW1lbnRhdGlvbiB3aXRoaW4gZXh0NC4gTGV0J3Mgc3RhcnQgYnkgemVyb2luZyBpbiBvbiBsaW5lcyAyMDE5IHRocm91Z2ggMjAzMCBvZiBgZnMvZXh0NC9mYXN0X2NvbW1pdC5jYC4gVGhlc2UgbGluZXMgbGlrZWx5IGRlYWwgd2l0aCBhIHNwZWNpZmljIGFzcGVjdCBvZiB0aGUgZmFzdCBjb21taXQgbWVjaGFuaXNtLCBhbmQgdGhhdCdzIHdoZXJlIEkgbmVlZCB0byBmb2N1cyBteSBhdHRlbnRpb24gZm9yIG5vdy4gV2hhdCBwYXJ0aWN1bGFyIGZ1bmN0aW9uYWxpdHkgb3IgcG90ZW50aWFsIGlzc3VlIGlzIGNvdmVyZWQgaW4gdGhhdCBzZWN0aW9uPyBVbmRlcnN0YW5kaW5nIHRoaXMgY2h1bmsgaXMgY3JpdGljYWwgYmVmb3JlIEkgYnJvYWRlbiB0aGUgc2NvcGUuIEkgaG9wZSB0aGUgY29kZSBpcyB3ZWxsLWNvbW1lbnRlZCBzbyBJIGNhbiBxdWlja2x5IGlkZW50aWZ5IHRoZSBwdXJwb3NlIGFuZCBjb250ZXh0IG9mIHRoaXMgY29kZSBibG9jay4gTGV0J3MgZ28hXG5cblxuIiwiSW5wdXRUb2tlbnMiOjk5NjIsIk91dHB1dFRva2VucyI6MzksIk91dHB1dFRob3VnaHRzVG9rZW5zIjoyOCwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTE0VDE0OjM5OjE1LjYxNDU3NDgyM1oiLCJTZXEiOjE3LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyNzkyNzAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwiZnMvZXh0NC9mYXN0X2NvbW1pdC5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDIwMTgsXG4gIFwiTGluZUNvdW50XCI6IDIwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIjIwMTg6XFx0XFx0YnJlbHNlKGlsb2MuYmgpO1xcbjIwMTk6XFx0b3V0OlxcbjIwMjA6XFx0XFx0aXB1dChpbm9kZSk7XFxuMjAyMTpcXHRcXHRpZiAoIXJldClcXG4yMDIyOlxcdFxcdFxcdGJsa2Rldl9pc3N1ZV9mbHVzaChzYi1cXHUwMDNlc19iZGV2KTtcXG4yMDIzOlxcdFxcbjIwMjQ6XFx0XFx0cmV0dXJuIHJldDtcXG4yMDI1OlxcdH1cXG4yMDI2OlxcdFxcbjIwMjc6XFx0LypcXG4yMDI4OlxcdCAqIERlbnRyeSBjcmVhdGUgcmVwbGF5IGZ1bmN0aW9uLlxcbjIwMjk6XFx0ICpcXG4yMDMwOlxcdCAqIEVYVDRfRkNfVEFHX0NSRUFUIGlzIHByZWNlZGVkIGJ5IEVYVDRfRkNfVEFHX0lOT0RFX0ZVTEwuIFdoaWNoIG1lYW5zLCB0aGVcXG4yMDMxOlxcdCAqIGlub2RlIGZvciB3aGljaCB3ZSBhcmUgdHJ5aW5nIHRvIGNyZWF0ZSBhIGRlbnRyeSBoZXJlLCBzaG91bGQgYWxyZWFkeSBoYXZlXFxuMjAzMjpcXHQgKiBiZWVuIHJlcGxheWVkIGJlZm9yZSB3ZSBzdGFydCBoZXJlLlxcbjIwMzM6XFx0ICovXFxuMjAzNDpcXHRzdGF0aWMgaW50IGV4dDRfZmNfcmVwbGF5X2NyZWF0ZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLFxcbjIwMzU6XFx0XFx0XFx0XFx0XFx0IHN0cnVjdCBleHQ0X2ZjX3RsX21lbSAqdGwsIHU4ICp2YWwpXFxuMjAzNjpcXHR7XFxuMjAzNzpcXHRcXHRpbnQgcmV0ID0gMDtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTRUMTQ6Mzk6MTUuNjE0ODU2NjEzWiIsIlNlcSI6MTgsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy44LWZsYXNoIiwiRHVyYXRpb24iOjE2MzM3OTY5NzEyLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyBhIFBvdGVudGlhbCBGdXp6aW5nIFRhcmdldDogZXh0NF9mY19yZXBsYXlfaW5vZGUqKlxuXG5Pa2F5LCBsZXQncyBicmVhayB0aGlzIGRvd24uIEknbSBsb29raW5nIGF0IGBleHQ0X2ZjX3JlcGxheV9pbm9kZWAsIGFuZCB0aGVyZSdzIGEgc3BlY2lmaWMgcGF0dGVybiBoZXJlIHRoYXQgY2F0Y2hlcyBteSBleWUuIFRoZXkndmUgaW50cm9kdWNlZCBhbiBlcnJvciBjaGVjayBhZnRlciBjYWxsaW5nIGBleHQ0X2V4dF9jbGVhcl9iYmAuIFByZXZpb3VzbHksIGl0IHdhcyBibGluZGx5IGNhbGxlZCwgZm9sbG93ZWQgYnkgYGlwdXQoaW5vZGUpYC4gTm93LCBpZiBgZXh0NF9leHRfY2xlYXJfYmJgIGZhaWxzLCBpdCBqdW1wcyB0byBgb3V0YCwgd2hpY2ggKnN0aWxsKiBjYWxscyBgaXB1dChpbm9kZSlgIChvbiBOVUxMLCBzbyBoYXJtbGVzc2x5KSBiZWZvcmUgcmV0dXJuaW5nIHRoZSBlcnJvciBjb2RlLiBUaGUgaW1wb3J0YW50IHRoaW5nIGlzIHRoYXQgbm93IHRoZSBlcnJvciBpcyBiZWluZyBwcm9wYWdhdGVkIHVwIHRoZSBjYWxsIGNoYWluLCBlZmZlY3RpdmVseSBhYm9ydGluZyB0aGUgcmVwbGF5IHByb2Nlc3MgaWYgc29tZXRoaW5nIGdvZXMgd3JvbmcuIFRoaXMgaXMgYSBiZWhhdmlvcmFsIGNoYW5nZSwgYW5kIHdvcnRoIGludmVzdGlnYXRpbmcuXG5cblRoZSBrZXkgcXVlc3Rpb24gaXM6IGlzIHRoaXMgcmVhY2hhYmxlIGNvZGU/IERvZXMgdGhpcyBuZXcgZXJyb3IgaGFuZGxpbmcgcGF0aCBwcm92aWRlIGEgZnV6emluZyBlbnRyeSBwb2ludD8gTGV0J3MgYXBwbHkgdGhlIGNyaXRlcmlhLiBFeHQ0IGlzIGRlZmluaXRlbHkgcGFydCBvZiB0aGUgY29yZSBWRlMsIHNvIHRoYXQncyBhIGNoZWNrLiBJdCdzIGJlZW4gZXh0ZW5zaXZlbHkgZnV6emVkIHZpYSBtb3VudCBhbmQgc3l6a2FsbGVyLCBzbyB0aGF0J3MgYSBwbHVzLiBBbnkgbG9naWMgbW9kaWZpY2F0aW9ucyBpbiBhIFZGUyBjb21wb25lbnQsIGVzcGVjaWFsbHkgb25lIGRlYWxpbmcgd2l0aCBwb3RlbnRpYWxseSBjcml0aWNhbCBkYXRhIHJlY292ZXJ5IGxpa2UgYSBmaWxlc3lzdGVtJ3MgcmVwbGF5IHByb2Nlc3MsIHNob3VsZCByYWlzZSBhIGZsYWcuXG5cbkdpdmVuIHRoZSBjcml0ZXJpYSwgdGhpcyAqY291bGQqIGJlIGEgdmFsaWQgZnV6emluZyB0YXJnZXQuIFRoZSBhbHRlcmF0aW9uIGlzIGEgcmVmYWN0b3Jpbmcgb2YgYSBjb2RlIGZsb3cgdG8gZGVhbCB3aXRoIGVycm9yIGNvbmRpdGlvbnMgYW5kIHRodXMgd29ydGggY2xvc2VyIGF0dGVudGlvbi5cblxuVGhlIG5leHQgc3RlcCBpcyB0byBuYWlsIGRvd24gdGhlIGNvbmZpZ3VyYXRpb24gcmVxdWlyZW1lbnRzLiBXaGF0IGFyZSB0aGUgcHJlcmVxdWlzaXRlcyB0byB0cmlnZ2VyIHRoaXMgY29kZSBwYXRoPyBJIG5lZWQgdG8gY2hlY2sgdGhlIEtjb25maWcgZm9yIGV4dDQgYW5kLCBzcGVjaWZpY2FsbHksIGZvciBmYXN0IGNvbW1pdC4gV2hhdCBjb25maWcgb3B0aW9ucyBhcmUgbmVlZGVkIHRvIG1ha2UgdGhpcyBjb2RlIGFjdGl2ZSBhbmQgcmVhY2hhYmxlP1xuXG5cbiIsIklucHV0VG9rZW5zIjoxMDQ4OSwiT3V0cHV0VG9rZW5zIjozMSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjQ2MywiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTE0VDE0OjM5OjMxLjk1MjgyOTU0NFoiLCJTZXEiOjE5LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6OTI5ODAwODYsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiZmFzdF9jb21taXR8RkFTVF9DT01NSVRcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwiZnMvZXh0NFwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJmcy9leHQ0L01ha2VmaWxlPTg9ZXh0NC15XFx0Oj0gYmFsbG9jLm8gYml0bWFwLm8gYmxvY2tfdmFsaWRpdHkubyBkaXIubyBleHQ0X2piZDIubyBleHRlbnRzLm8gXFxcXFxcbi0tXFxuZnMvZXh0NC9NYWtlZmlsZS0xMi1cXHRcXHRzdXBlci5vIHN5bWxpbmsubyBzeXNmcy5vIHhhdHRyLm8geGF0dHJfaHVyZC5vIHhhdHRyX3RydXN0ZWQubyBcXFxcXFxuZnMvZXh0NC9NYWtlZmlsZToxMzpcXHRcXHR4YXR0cl91c2VyLm8gZmFzdF9jb21taXQubyBvcnBoYW4ub1xcbmZzL2V4dDQvTWFrZWZpbGUtMTQtXFxuLS1cXG5mcy9leHQ0L2V4dDQuaD05NjM9ZG8ge1xcdFxcdFxcdFxcdFxcdFxcdFxcdFxcdFxcdFxcdFxcXFxcXG4tLVxcbmZzL2V4dDQvZXh0NC5oLTk5OS0jaW5jbHVkZSBcXFwiZXh0ZW50c19zdGF0dXMuaFxcXCJcXG5mcy9leHQ0L2V4dDQuaDoxMDAwOiNpbmNsdWRlIFxcXCJmYXN0X2NvbW1pdC5oXFxcIlxcbmZzL2V4dDQvZXh0NC5oLTEwMDEtXFxuLS1cXG5mcy9leHQ0L2V4dDQuaD0xMDQ4PXN0cnVjdCBleHQ0X2lub2RlX2luZm8ge1xcbi0tXFxuZnMvZXh0NC9leHQ0LmgtMTMxNC1cXG5mcy9leHQ0L2V4dDQuaDoxMzE1OiNkZWZpbmUgRVhUNF9NT1VOVDJfSk9VUk5BTF9GQVNUX0NPTU1JVFxcdDB4MDAwMDAwMTAgLyogSm91cm5hbCBmYXN0IGNvbW1pdCAqL1xcbmZzL2V4dDQvZXh0NC5oLTEzMTYtI2RlZmluZSBFWFQ0X01PVU5UMl9EQVhfTkVWRVJcXHRcXHQweDAwMDAwMDIwIC8qIERvIG5vdCBhbGxvdyBEaXJlY3QgQWNjZXNzICovXFxuLS1cXG5mcy9leHQ0L2V4dDQuaD0yMTQwPXN0YXRpYyBpbmxpbmUgc3RydWN0IG1hcHBpbmdfbWV0YWRhdGFfYmhzICpleHQ0X2lfbWV0YWRhdGFfYmhzKFxcbi0tXFxuZnMvZXh0NC9leHQ0LmgtMjE4NS0vKlxcbmZzL2V4dDQvZXh0NC5oOjIxODY6ICogVGhlIHJlYXNvbiB3aHkgXFxcIkZBU1RfQ09NTUlUXFxcIiBpcyBhIGNvbXBhdCBmZWF0dXJlIGlzIHRoYXQsIEZTIGJlY29tZXNcXG5mcy9leHQ0L2V4dDQuaC0yMTg3LSAqIGluY29tcGF0aWJsZSBvbmx5IGlmIGZhc3QgY29tbWl0IGJsb2NrcyBhcmUgcHJlc2VudCBpbiB0aGUgRlMuIFNpbmNlIHdlXFxuLS1cXG5mcy9leHQ0L2V4dDQuaC0yMTkxLSAqL1xcbmZzL2V4dDQvZXh0NC5oOjIxOTI6I2RlZmluZSBFWFQ0X0ZFQVRVUkVfQ09NUEFUX0ZBU1RfQ09NTUlUXFx0XFx0MHgwNDAwXFxuZnMvZXh0NC9leHQ0LmgtMjE5My0jZGVmaW5lIEVYVDRfRkVBVFVSRV9DT01QQVRfU1RBQkxFX0lOT0RFU1xcdDB4MDgwMFxcbi0tXFxuZnMvZXh0NC9leHQ0Lmg9MjI5Nz1FWFQ0X0ZFQVRVUkVfQ09NUEFUX0ZVTkNTKHNwYXJzZV9zdXBlcjIsXFx0U1BBUlNFX1NVUEVSMilcXG5mcy9leHQ0L2V4dDQuaDoyMjk4OkVYVDRfRkVBVFVSRV9DT01QQVRfRlVOQ1MoZmFzdF9jb21taXQsXFx0XFx0RkFTVF9DT01NSVQpXFxuZnMvZXh0NC9leHQ0LmgtMjI5OS1FWFQ0X0ZFQVRVUkVfQ09NUEFUX0ZVTkNTKHN0YWJsZV9pbm9kZXMsXFx0U1RBQkxFX0lOT0RFUylcXG4tLVxcbmZzL2V4dDQvZXh0NC5oPTMwNzA9dm9pZCBleHQ0X2VuZF9iaXRtYXBfcmVhZChzdHJ1Y3QgYmlvICpiaW8pO1xcbmZzL2V4dDQvZXh0NC5oLTMwNzEtXFxuZnMvZXh0NC9leHQ0Lmg6MzA3MjovKiBmYXN0X2NvbW1pdC5jICovXFxuZnMvZXh0NC9leHQ0LmgtMzA3My1pbnQgZXh0NF9mY19pbmZvX3Nob3coc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpO1xcbi0tXFxuZnMvZXh0NC9mYXN0X2NvbW1pdC5jLTMtLypcXG5mcy9leHQ0L2Zhc3RfY29tbWl0LmM6NDogKiBmcy9leHQ0L2Zhc3RfY29tbWl0LmNcXG5mcy9leHQ0L2Zhc3RfY29tbWl0LmMtNS0gKlxcbi0tXFxuZnMvZXh0NC9mYXN0X2NvbW1pdC5jPTIyNT1zdGF0aWMgYm9vbCBleHQ0X2ZjX2Rpc2FibGVkKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpXFxuZnMvZXh0NC9mYXN0X2NvbW1pdC5jLTIyNi17XFxuZnMvZXh0NC9mYXN0X2NvbW1pdC5jOjIyNzpcXHRyZXR1cm4gKCF0ZXN0X29wdDIoc2IsIEpPVVJOQUxfRkFTVF9DT01NSVQpIHx8XFxuZnMvZXh0NC9mYXN0X2NvbW1pdC5jLTIyOC1cXHRcXHQoRVhUNF9TQihzYiktXFx1MDAzZXNfbW91bnRfc3RhdGUgXFx1MDAyNiBFWFQ0X0ZDX1JFUExBWSkpO1xcbi0tXFxuZnMvZXh0NC9mYXN0X2NvbW1pdC5jPTM5MD1zdGF0aWMgaW50IGV4dDRfZmNfdHJhY2tfdGVtcGxhdGUoXFxuLS1cXG5mcy9leHQ0L2Zhc3RfY29tbWl0LmMtNDIwLVxcdFxcdFxcdFxcdChzYmktXFx1MDAzZXNfam91cm5hbC1cXHUwMDNlal9mbGFncyBcXHUwMDI2IEpCRDJfRlVMTF9DT01NSVRfT05HT0lORyB8fFxcbmZzL2V4dDQvZmFzdF9jb21taXQuYzo0MjE6XFx0XFx0XFx0XFx0IHNiaS1cXHUwMDNlc19qb3VybmFsLVxcdTAwM2VqX2ZsYWdzIFxcdTAwMjYgSkJEMl9GQVNUX0NPTU1JVF9PTkdPSU5HKSA/XFxuZnMvZXh0NC9mYXN0X2NvbW1pdC5jLTQyMi1cXHRcXHRcXHRcXHRcXHUwMDI2c2JpLVxcdTAwM2VzX2ZjX3FbRkNfUV9TVEFHSU5HXSA6XFxuLS1cXG5mcy9leHQ0L2Zhc3RfY29tbWl0LmM9NDM1PXN0YXRpYyBpbnQgX190cmFja19kZW50cnlfdXBkYXRlKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsXFxuLS1cXG5mcy9leHQ0L2Zhc3RfY29tbWl0LmMtNDcxLVxcdGlmIChzYmktXFx1MDAzZXNfam91cm5hbC1cXHUwMDNlal9mbGFncyBcXHUwMDI2IEpCRDJfRlVMTF9DT01NSVRfT05HT0lORyB8fFxcbmZzL2V4dDQvZmFzdF9jb21taXQuYzo0NzI6XFx0XFx0c2JpLVxcdTAwM2VzX2pvdXJuYWwtXFx1MDAzZWpfZmxhZ3MgXFx1MDAyNiBKQkQyX0ZBU1RfQ09NTUlUX09OR09JTkcpXFxuZnMvZXh0NC9mYXN0X2NvbW1pdC5jLTQ3My1cXHRcXHRsaXN0X2FkZF90YWlsKFxcdTAwMjZub2RlLVxcdTAwM2VmY2RfbGlzdCxcXG4tLVxcbmZzL2V4dDQvZmFzdF9jb21taXQuYz0xNTY3PWludCBleHQ0X2ZjX2NvbW1pdChqb3VybmFsX3QgKmpvdXJuYWwsIHRpZF90IGNvbW1pdF90aWQpXFxuLS1cXG5mcy9leHQ0L2Zhc3RfY29tbWl0LmMtMTU3Ni1cXG5mcy9leHQ0L2Zhc3RfY29tbWl0LmM6MTU3NzpcXHRpZiAoIXRlc3Rfb3B0MihzYiwgSk9VUk5BTF9GQVNUX0NPTU1JVCkpXFxuZnMvZXh0NC9mYXN0X2NvbW1pdC5jLTE1NzgtXFx0XFx0cmV0dXJuIGpiZDJfY29tcGxldGVfdHJhbnNhY3Rpb24oam91cm5hbCwgY29tbWl0X3RpZCk7XFxuLS1cXG5mcy9leHQ0L2Zhc3RfY29tbWl0LmM9MjY2NT12b2lkIGV4dDRfZmNfaW5pdChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBqb3VybmFsX3QgKmpvdXJuYWwpXFxuLS1cXG5mcy9leHQ0L2Zhc3RfY29tbWl0LmMtMjY3Mi1cXHRqb3VybmFsLVxcdTAwM2VqX2ZjX3JlcGxheV9jYWxsYmFjayA9IGV4dDRfZmNfcmVwbGF5O1xcbmZzL2V4dDQvZmFzdF9jb21taXQuYzoyNjczOlxcdGlmICghdGVzdF9vcHQyKHNiLCBKT1VSTkFMX0ZBU1RfQ09NTUlUKSlcXG5mcy9leHQ0L2Zhc3RfY29tbWl0LmMtMjY3NC1cXHRcXHRyZXR1cm47XFxuLS1cXG5mcy9leHQ0L2Zhc3RfY29tbWl0LmgtMi1cXG5mcy9leHQ0L2Zhc3RfY29tbWl0Lmg6MzojaWZuZGVmIF9fRkFTVF9DT01NSVRfSF9fXFxuZnMvZXh0NC9mYXN0X2NvbW1pdC5oOjQ6I2RlZmluZSBfX0ZBU1RfQ09NTUlUX0hfX1xcbmZzL2V4dDQvZmFzdF9jb21taXQuaC01LVxcbmZzL2V4dDQvZmFzdF9jb21taXQuaC02LS8qXFxuZnMvZXh0NC9mYXN0X2NvbW1pdC5oOjc6ICogTm90ZSB0aGlzIGZpbGUgaXMgcHJlc2VudCBpbiBlMmZzcHJvZ3MvbGliL2V4dDJmcy9mYXN0X2NvbW1pdC5oIGFuZFxcbmZzL2V4dDQvZmFzdF9jb21taXQuaDo4OiAqIGxpbnV4L2ZzL2V4dDQvZmFzdF9jb21taXQuaC4gVGhlc2UgZmlsZSBzaG91bGQgYWx3YXlzIGJlIGJ5dGUgaWRlbnRpY2FsLlxcbmZzL2V4dDQvZmFzdF9jb21taXQuaC05LSAqL1xcbi0tXFxuZnMvZXh0NC9mYXN0X2NvbW1pdC5oPTE2Mz1zdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIgKnRhZzJzdHIoX191MTYgdGFnKVxcbi0tXFxuZnMvZXh0NC9mYXN0X2NvbW1pdC5oLTE4OC1cXG5mcy9leHQ0L2Zhc3RfY29tbWl0Lmg6MTg5OiNlbmRpZiAvKiBfX0ZBU1RfQ09NTUlUX0hfXyAqL1xcbi0tXFxuZnMvZXh0NC9pbm9kZS5jPTM0NDE9c3RhdGljIGJvb2wgZXh0NF9pbm9kZV9kYXRhc3luY19kaXJ0eShzdHJ1Y3QgaW5vZGUgKmlub2RlKVxcbi0tXFxuZnMvZXh0NC9pbm9kZS5jLTM0NDktXFx0XFx0XFx0cmV0dXJuIGZhbHNlO1xcbmZzL2V4dDQvaW5vZGUuYzozNDUwOlxcdFxcdGlmICh0ZXN0X29wdDIoaW5vZGUtXFx1MDAzZWlfc2IsIEpPVVJOQUxfRkFTVF9DT01NSVQpKVxcbmZzL2V4dDQvaW5vZGUuYy0zNDUxLVxcdFxcdFxcdHJldHVybiAhbGlzdF9lbXB0eShcXHUwMDI2RVhUNF9JKGlub2RlKS1cXHUwMDNlaV9mY19saXN0KTtcXG4tLVxcbmZzL2V4dDQvbmFtZWkuYz0zMjI4PWludCBfX2V4dDRfdW5saW5rKHN0cnVjdCBpbm9kZSAqZGlyLCBjb25zdCBzdHJ1Y3QgcXN0ciAqZF9uYW1lLFxcbmZzL2V4dDQvbmFtZWkuYy0zMjI5LVxcdFxcdCAgc3RydWN0IGlub2RlICppbm9kZSxcXG5mcy9leHQ0L25hbWVpLmM6MzIzMDpcXHRcXHQgIHN0cnVjdCBkZW50cnkgKmRlbnRyeSAvKiBOVUxMIGR1cmluZyBmYXN0X2NvbW1pdCByZWNvdmVyeSAqLylcXG5mcy9leHQ0L25hbWVpLmMtMzIzMS17XFxuLS1cXG5mcy9leHQ0L25hbWVpLmM9Mzc5OT1zdGF0aWMgaW50IGV4dDRfcmVuYW1lKHN0cnVjdCBtbnRfaWRtYXAgKmlkbWFwLCBzdHJ1Y3QgaW5vZGUgKm9sZF9kaXIsXFxuLS1cXG5mcy9leHQ0L25hbWVpLmMtNDAwOS1cXHRcXHRcXHRleHQ0X2ZjX3RyYWNrX3VubGluayhoYW5kbGUsIG5ldy5kZW50cnkpO1xcbmZzL2V4dDQvbmFtZWkuYzo0MDEwOlxcdFxcdGlmICh0ZXN0X29wdDIoc2IsIEpPVVJOQUxfRkFTVF9DT01NSVQpIFxcdTAwMjZcXHUwMDI2XFxuZnMvZXh0NC9uYW1laS5jLTQwMTEtXFx0XFx0ICAgICEoRVhUNF9TQihzYiktXFx1MDAzZXNfbW91bnRfc3RhdGUgXFx1MDAyNiBFWFQ0X0ZDX1JFUExBWSkgXFx1MDAyNlxcdTAwMjZcXG4tLVxcbmZzL2V4dDQvc3VwZXIuYz0xODk1PXN0YXRpYyBjb25zdCBzdHJ1Y3QgbW91bnRfb3B0cyB7XFxuLS1cXG5mcy9leHQ0L3N1cGVyLmMtMTk2Mi0jaWZkZWYgQ09ORklHX0VYVDRfREVCVUdcXG5mcy9leHQ0L3N1cGVyLmM6MTk2MzpcXHR7T3B0X2ZjX2RlYnVnX2ZvcmNlLCBFWFQ0X01PVU5UMl9KT1VSTkFMX0ZBU1RfQ09NTUlULFxcbmZzL2V4dDQvc3VwZXIuYy0xOTY0LVxcdCBNT1BUX1NFVCB8IE1PUFRfMiB8IE1PUFRfRVhUNF9PTkxZfSxcXG4tLVxcbmZzL2V4dDQvc3VwZXIuYz00NDA0PXN0YXRpYyB2b2lkIGV4dDRfc2V0X2RlZl9vcHRzKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsXFxuLS1cXG5mcy9leHQ0L3N1cGVyLmMtNDQyMi0jZW5kaWZcXG5mcy9leHQ0L3N1cGVyLmM6NDQyMzpcXHRpZiAoZXh0NF9oYXNfZmVhdHVyZV9mYXN0X2NvbW1pdChzYikpXFxuZnMvZXh0NC9zdXBlci5jOjQ0MjQ6XFx0XFx0c2V0X29wdDIoc2IsIEpPVVJOQUxfRkFTVF9DT01NSVQpO1xcbmZzL2V4dDQvc3VwZXIuYy00NDI1LVxcdC8qIGRvbid0IGZvcmdldCB0byBlbmFibGUgam91cm5hbF9jc3VtIHdoZW4gbWV0YWRhdGFfY3N1bSBpcyBlbmFibGVkLiAqL1xcbi0tXFxuZnMvZXh0NC9zdXBlci5jPTQ1MjM9c3RhdGljIHZvaWQgZXh0NF9hdG9taWNfd3JpdGVfaW5pdChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKVxcbi0tXFxuZnMvZXh0NC9zdXBlci5jLTQ1NDgtXFxuZnMvZXh0NC9zdXBlci5jOjQ1NDk6c3RhdGljIHZvaWQgZXh0NF9mYXN0X2NvbW1pdF9pbml0KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpXFxuZnMvZXh0NC9zdXBlci5jLTQ1NTAte1xcbi0tXFxuZnMvZXh0NC9zdXBlci5jPTQ5NzM9c3RhdGljIGludCBleHQ0X2xvYWRfYW5kX2luaXRfam91cm5hbChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLFxcbi0tXFxuZnMvZXh0NC9zdXBlci5jLTQ5OTYtXFxuZnMvZXh0NC9zdXBlci5jOjQ5OTc6XFx0aWYgKHRlc3Rfb3B0MihzYiwgSk9VUk5BTF9GQVNUX0NPTU1JVCkgXFx1MDAyNlxcdTAwMjZcXG5mcy9leHQ0L3N1cGVyLmMtNDk5OC1cXHRcXHQhamJkMl9qb3VybmFsX3NldF9mZWF0dXJlcyhFWFQ0X1NCKHNiKS1cXHUwMDNlc19qb3VybmFsLCAwLCAwLFxcbmZzL2V4dDQvc3VwZXIuYzo0OTk5OlxcdFxcdFxcdFxcdFxcdCAgSkJEMl9GRUFUVVJFX0lOQ09NUEFUX0ZBU1RfQ09NTUlUKSkge1xcbmZzL2V4dDQvc3VwZXIuYy01MDAwLVxcdFxcdGV4dDRfbXNnKHNiLCBLRVJOX0VSUixcXG4tLVxcbmZzL2V4dDQvc3VwZXIuYz01MDU3PXN0YXRpYyBpbnQgZXh0NF9jaGVja19qb3VybmFsX2RhdGFfbW9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKVxcbi0tXFxuZnMvZXh0NC9zdXBlci5jLTUwNjEtXFx0XFx0XFx0ICAgIFxcXCJkYXRhPWpvdXJuYWwgZGlzYWJsZXMgZGVsYXllZCBhbGxvY2F0aW9uLCBcXFwiXFxuZnMvZXh0NC9zdXBlci5jOjUwNjI6XFx0XFx0XFx0ICAgIFxcXCJkaW9yZWFkX25vbG9jaywgT19ESVJFQ1QgYW5kIGZhc3RfY29tbWl0IHN1cHBvcnQhXFxcXG5cXFwiKTtcXG5mcy9leHQ0L3N1cGVyLmMtNTA2My1cXHRcXHQvKiBjYW4ndCBtb3VudCB3aXRoIGJvdGggZGF0YT1qb3VybmFsIGFuZCBkaW9yZWFkX25vbG9jay4gKi9cXG5mcy9leHQ0L3N1cGVyLmMtNTA2NC1cXHRcXHRjbGVhcl9vcHQoc2IsIERJT1JFQURfTk9MT0NLKTtcXG5mcy9leHQ0L3N1cGVyLmM6NTA2NTpcXHRcXHRjbGVhcl9vcHQyKHNiLCBKT1VSTkFMX0ZBU1RfQ09NTUlUKTtcXG5mcy9leHQ0L3N1cGVyLmMtNTA2Ni1cXHRcXHRpZiAodGVzdF9vcHQyKHNiLCBFWFBMSUNJVF9ERUxBTExPQykpIHtcXG4tLVxcbmZzL2V4dDQvc3VwZXIuYz01MzU3PXN0YXRpYyBpbnQgX19leHQ0X2ZpbGxfc3VwZXIoc3RydWN0IGZzX2NvbnRleHQgKmZjLCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKVxcbi0tXFxuZnMvZXh0NC9zdXBlci5jLTU1MTAtXFx0ZXh0NF9hdG9taWNfd3JpdGVfaW5pdChzYik7XFxuZnMvZXh0NC9zdXBlci5jOjU1MTE6XFx0ZXh0NF9mYXN0X2NvbW1pdF9pbml0KHNiKTtcXG5mcy9leHQ0L3N1cGVyLmMtNTUxMi1cXG4tLVxcbmZzL2V4dDQvc3VwZXIuYy01NTU3LVxcdFxcdGNsZWFyX29wdChzYiwgREFUQV9GTEFHUyk7XFxuZnMvZXh0NC9zdXBlci5jOjU1NTg6XFx0XFx0Y2xlYXJfb3B0MihzYiwgSk9VUk5BTF9GQVNUX0NPTU1JVCk7XFxuZnMvZXh0NC9zdXBlci5jLTU1NTktXFx0XFx0c2JpLVxcdTAwM2VzX2pvdXJuYWwgPSBOVUxMO1xcbi0tXFxuZnMvZXh0NC9zeXNmcy5jPTM2Mz1FWFQ0X0FUVFJfRkVBVFVSRShtZXRhZGF0YV9jc3VtX3NlZWQpO1xcbmZzL2V4dDQvc3lzZnMuYzozNjQ6RVhUNF9BVFRSX0ZFQVRVUkUoZmFzdF9jb21taXQpO1xcbmZzL2V4dDQvc3lzZnMuYy0zNjUtI2lmIElTX0VOQUJMRUQoQ09ORklHX1VOSUNPREUpIFxcdTAwMjZcXHUwMDI2IGRlZmluZWQoQ09ORklHX0ZTX0VOQ1JZUFRJT04pXFxuLS1cXG5mcy9leHQ0L3N5c2ZzLmM9MzcyPXN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpleHQ0X2ZlYXRfYXR0cnNbXSA9IHtcXG4tLVxcbmZzL2V4dDQvc3lzZnMuYy0zODYtXFx0QVRUUl9MSVNUKG1ldGFkYXRhX2NzdW1fc2VlZCksXFxuZnMvZXh0NC9zeXNmcy5jOjM4NzpcXHRBVFRSX0xJU1QoZmFzdF9jb21taXQpLFxcbmZzL2V4dDQvc3lzZnMuYy0zODgtI2lmIElTX0VOQUJMRUQoQ09ORklHX1VOSUNPREUpIFxcdTAwMjZcXHUwMDI2IGRlZmluZWQoQ09ORklHX0ZTX0VOQ1JZUFRJT04pXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTE0VDE0OjM5OjMyLjA0NTgxNTgzWiIsIlNlcSI6MjAsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy44LWZsYXNoIiwiRHVyYXRpb24iOjEyMDY0OTQ2NDU2LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBoZXJlJ3MgbXkgaW50ZXJwcmV0YXRpb24gb2YgdGhvc2UgdGhvdWdodHMsIHRhaWxvcmVkIGZvciBhbiBleHBlcnQgYXVkaWVuY2UsIHByZXNlbnRlZCBpbiB0aGUgZmlyc3QgcGVyc29uOlxuXG4qKkFuYWx5emluZyB0aGUgZXh0NCBCdWlsZCBDb25maWd1cmF0aW9uKipcblxuUmlnaHQsIGBmYXN0X2NvbW1pdC5vYCBpcyBhIGdpdmVuIOKAkyBpdCdzIHByYWN0aWNhbGx5IGJha2VkIGludG8gYGV4dDQteWAgdGhlIG1vbWVudCBgQ09ORklHX0VYVDRfRlNgIGlzIGZsaXBwZWQgb24uIE5vIHN1cnByaXNlcyB0aGVyZS4gQnV0IEknbSBhbHdheXMgbG9va2luZyBmb3IgbnVhbmNlLCBmb3Igd2hlcmUgdGhlIGxldmVycyBhcmUuIFNvLCBsZXQncyBkaXZlIGludG8gYGZzL2V4dDQvS2NvbmZpZ2AuIEkgd2FudCB0byBzZWUgKmV4YWN0bHkqIHdoYXQgY29udHJvbCB3ZSBoYXZlIG92ZXIgdGhlIGV4dDQgY29uZmlndXJhdGlvbi4gV2hhdCBvcHRpb25zIGFyZSBleHBvc2VkLCB3aGF0IGFyZSB0aGUgZGVwZW5kZW5jaWVzLCBhbmQgYXJlIHRoZXJlIGFueSBnb3RjaGFzIHRoYXQgYXJlbid0IGltbWVkaWF0ZWx5IG9idmlvdXMgaW4gdGhlIHNvdXJjZSBpdHNlbGY/IFRpbWUgdG8gc2VlIGlmIHRoZXJlJ3MgYW55dGhpbmcgbW9yZSBnb2luZyBvbiB0aGF0J3Mgd29ydGggbm90aW5nLiBQZXJoYXBzIHRoZXJlJ3MgYW4gaW50ZXJlc3RpbmcgZGVwZW5kZW5jeSBzdHJ1Y3R1cmUsIG9yIG1heWJlIHNvbWUgaGlkZGVuIGNvbmRpdGlvbmFsIGJ1aWxkcyB0byBjb25zaWRlci4gTGV0J3Mgc2VlIHdoYXQgdGhlIEtjb25maWcgZmlsZSBob2xkcy5cblxuXG4iLCJJbnB1dFRva2VucyI6MTQ3MTQsIk91dHB1dFRva2VucyI6MjcsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo1MCwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0xNFQxNDozOTo0NC4xMTA3NjU0MDZaIiwiU2VxIjoyMSwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjYyMzg1OTYwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImNvbmZpZyBFWFQ0XCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcImZzL2V4dDRcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiZnMvZXh0NC9LY29uZmlnLTEtIyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vbmx5XFxuZnMvZXh0NC9LY29uZmlnOjI6Y29uZmlnIEVYVDRfRlNcXG5mcy9leHQ0L0tjb25maWctMy1cXHR0cmlzdGF0ZSBcXFwiVGhlIEV4dGVuZGVkIDQgKGV4dDQpIGZpbGVzeXN0ZW1cXFwiXFxuLS1cXG5mcy9leHQ0L0tjb25maWctMzQtXFxuZnMvZXh0NC9LY29uZmlnOjM1OmNvbmZpZyBFWFQ0X1VTRV9GT1JfRVhUMlxcbmZzL2V4dDQvS2NvbmZpZy0zNi1cXHRib29sIFxcXCJVc2UgZXh0NCBmb3IgZXh0MiBmaWxlIHN5c3RlbXNcXFwiXFxuLS1cXG5mcy9leHQ0L0tjb25maWctNDUtXFxuZnMvZXh0NC9LY29uZmlnOjQ2OmNvbmZpZyBFWFQ0X0ZTX1BPU0lYX0FDTFxcbmZzL2V4dDQvS2NvbmZpZy00Ny1cXHRib29sIFxcXCJFeHQ0IFBPU0lYIEFjY2VzcyBDb250cm9sIExpc3RzXFxcIlxcbi0tXFxuZnMvZXh0NC9LY29uZmlnLTU1LVxcbmZzL2V4dDQvS2NvbmZpZzo1Njpjb25maWcgRVhUNF9GU19TRUNVUklUWVxcbmZzL2V4dDQvS2NvbmZpZy01Ny1cXHRib29sIFxcXCJFeHQ0IFNlY3VyaXR5IExhYmVsc1xcXCJcXG4tLVxcbmZzL2V4dDQvS2NvbmZpZy02Ny1cXG5mcy9leHQ0L0tjb25maWc6Njg6Y29uZmlnIEVYVDRfREVCVUdcXG5mcy9leHQ0L0tjb25maWctNjktXFx0Ym9vbCBcXFwiRXh0NCBkZWJ1Z2dpbmcgc3VwcG9ydFxcXCJcXG4tLVxcbmZzL2V4dDQvS2NvbmZpZy03Ni1cXG5mcy9leHQ0L0tjb25maWc6Nzc6Y29uZmlnIEVYVDRfS1VOSVRfVEVTVFNcXG5mcy9leHQ0L0tjb25maWctNzgtXFx0dHJpc3RhdGUgXFxcIktVbml0IHRlc3RzIGZvciBleHQ0XFxcIiBpZiAhS1VOSVRfQUxMX1RFU1RTXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTE0VDE0OjM5OjQ0LjE3MzE1Nzk0NloiLCJTZXEiOjIyLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuOC1mbGFzaCIsIkR1cmF0aW9uIjoxNDY3MzE4Mzc1OCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IHN1bW1hcnksIGFzIHRob3VnaCBJJ20gdGhpbmtpbmcgdGhyb3VnaCB0aGlzIHByb2Nlc3M6XG5cbioqRGl2aW5nIGludG8gdGhlIEVYVDQgQ29uZmlndXJhdGlvbioqXG5cbk9rYXksIHNvIEkgbmVlZCB0byB1bmRlcnN0YW5kIGhvdyB0aGUgRVhUNCBmaWxlc3lzdGVtIGNvbmZpZ3VyYXRpb24gaXMgaGFuZGxlZCBpbiB0aGlzIGtlcm5lbCBidWlsZC4gVGltZSB0byBoZWFkIHN0cmFpZ2h0IHRvIGBmcy9leHQ0L0tjb25maWdgLiBUaGF0J3Mgd2hlcmUgYWxsIHRoZSByZWxldmFudCBvcHRpb25zIHNob3VsZCBiZSBkZWZpbmVkLCBlc3BlY2lhbGx5IHRob3NlIGNvbnRyb2xsaW5nIHdoZXRoZXIgdGhlIEVYVDQgZmlsZXN5c3RlbSBzdXBwb3J0IGlzIGV2ZW4gaW5jbHVkZWQuIEknbSBwcmltYXJpbHkgaW50ZXJlc3RlZCBpbiB0aGUgYEVYVDRfRlNgIHN5bWJvbCBpdHNlbGYsIHdoaWNoIGlzIHRoZSBiaWcgc3dpdGNoLCBidXQgSSdsbCBwcm9iYWJseSBzY2FuIGFyb3VuZCBpdCB0byBnZXQgYSBzZW5zZSBvZiB0aGUgZGVwZW5kZW5jaWVzIGFuZCByZWxhdGVkIG9wdGlvbnMuIEkgd2FudCB0byBzZWUgaG93IGl0J3MgY29ubmVjdGVkIHRvIG90aGVyIGZlYXR1cmVzLCBhbnkgZGVmYXVsdCBzZXR0aW5ncywgYW5kIGlmIHRoZXJlIGFyZSBhbnkgY29uZGl0aW9uYWwgaW5jbHVzaW9ucyBiYXNlZCBvbiBhcmNoaXRlY3R1cmUgb3Igb3RoZXIga2VybmVsIGNvbmZpZ3VyYXRpb25zLiBJJ20gZXhwZWN0aW5nIHRvIGZpbmQgYSB0eXBpY2FsIEtjb25maWcgc3RydWN0dXJlIOKAkyBzb21lIGBib29sYCBhbmQgYHRyaXN0YXRlYCBvcHRpb25zLCBtYXliZSBzb21lIGRlcGVuZGVuY2llcyBvbiBvdGhlciBmaWxlc3lzdGVtIG9yIGhhcmR3YXJlIGRyaXZlcnMuIFRoZSBnb2FsIGlzIHRvIGZ1bGx5IGdyYXNwIGhvdyBFWFQ0IGlzIGVuYWJsZWQgYW5kIGNvbmZpZ3VyZWQgd2l0aGluIHRoaXMgcGFydGljdWxhciBidWlsZCBlbnZpcm9ubWVudC5cblxuXG4iLCJJbnB1dFRva2VucyI6MTUzNTcsIk91dHB1dFRva2VucyI6MzMsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoyMCwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0xNFQxNDozOTo1OC44NDYzNDQyOTRaIiwiU2VxIjoyMywiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6OTY5MDAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwiZnMvZXh0NC9LY29uZmlnXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDEsXG4gIFwiTGluZUNvdW50XCI6IDM1XG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIiAgIDE6XFx0IyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vbmx5XFxuICAgMjpcXHRjb25maWcgRVhUNF9GU1xcbiAgIDM6XFx0XFx0dHJpc3RhdGUgXFxcIlRoZSBFeHRlbmRlZCA0IChleHQ0KSBmaWxlc3lzdGVtXFxcIlxcbiAgIDQ6XFx0XFx0c2VsZWN0IEJVRkZFUl9IRUFEXFxuICAgNTpcXHRcXHRzZWxlY3QgSkJEMlxcbiAgIDY6XFx0XFx0c2VsZWN0IENSQzE2XFxuICAgNzpcXHRcXHRzZWxlY3QgQ1JDMzJcXG4gICA4OlxcdFxcdHNlbGVjdCBGU19JT01BUFxcbiAgIDk6XFx0XFx0c2VsZWN0IEZTX0VOQ1JZUFRJT05fQUxHUyBpZiBGU19FTkNSWVBUSU9OXFxuICAxMDpcXHRcXHRoZWxwXFxuICAxMTpcXHRcXHQgIFRoaXMgaXMgdGhlIG5leHQgZ2VuZXJhdGlvbiBvZiB0aGUgZXh0MyBmaWxlc3lzdGVtLlxcbiAgMTI6XFx0XFxuICAxMzpcXHRcXHQgIFVubGlrZSB0aGUgY2hhbmdlIGZyb20gZXh0MiBmaWxlc3lzdGVtIHRvIGV4dDMgZmlsZXN5c3RlbSxcXG4gIDE0OlxcdFxcdCAgdGhlIG9uLWRpc2sgZm9ybWF0IG9mIGV4dDQgaXMgbm90IGZvcndhcmRzIGNvbXBhdGlibGUgd2l0aFxcbiAgMTU6XFx0XFx0ICBleHQzOyBpdCBpcyBiYXNlZCBvbiBleHRlbnQgbWFwcyBhbmQgaXQgc3VwcG9ydHMgNDgtYml0XFxuICAxNjpcXHRcXHQgIHBoeXNpY2FsIGJsb2NrIG51bWJlcnMuICBUaGUgZXh0NCBmaWxlc3lzdGVtIGFsc28gc3VwcG9ydHMgZGVsYXllZFxcbiAgMTc6XFx0XFx0ICBhbGxvY2F0aW9uLCBwZXJzaXN0ZW50IHByZWFsbG9jYXRpb24sIGhpZ2ggcmVzb2x1dGlvbiB0aW1lIHN0YW1wcyxcXG4gIDE4OlxcdFxcdCAgYW5kIGEgbnVtYmVyIG9mIG90aGVyIGZlYXR1cmVzIHRvIGltcHJvdmUgcGVyZm9ybWFuY2UgYW5kIHNwZWVkXFxuICAxOTpcXHRcXHQgIHVwIGZzY2sgdGltZS4gIEZvciBtb3JlIGluZm9ybWF0aW9uLCBwbGVhc2Ugc2VlIHRoZSB3ZWIgcGFnZXMgYXRcXG4gIDIwOlxcdFxcdCAgaHR0cDovL2V4dDQud2lraS5rZXJuZWwub3JnLlxcbiAgMjE6XFx0XFxuICAyMjpcXHRcXHQgIFRoZSBleHQ0IGZpbGVzeXN0ZW0gc3VwcG9ydHMgbW91bnRpbmcgYW4gZXh0MyBmaWxlc3lzdGVtOyB3aGlsZSB0aGVyZVxcbiAgMjM6XFx0XFx0ICBhcmUgc29tZSBwZXJmb3JtYW5jZSBnYWlucyBmcm9tIHRoZSBkZWxheWVkIGFsbG9jYXRpb24gYW5kIGlub2RlXFxuICAyNDpcXHRcXHQgIHRhYmxlIHJlYWRhaGVhZCwgdGhlIGJlc3QgcGVyZm9ybWFuY2UgZ2FpbnMgcmVxdWlyZSBlbmFibGluZyBleHQ0XFxuICAyNTpcXHRcXHQgIGZlYXR1cmVzIGluIHRoZSBmaWxlc3lzdGVtIHVzaW5nIHR1bmUyZnMsIG9yIGZvcm1hdHRpbmcgYSBuZXdcXG4gIDI2OlxcdFxcdCAgZmlsZXN5c3RlbSBhcyBhbiBleHQ0IGZpbGVzeXN0ZW0gaW5pdGlhbGx5LiBXaXRob3V0IGV4cGxpY2l0IGVuYWJsaW5nXFxuICAyNzpcXHRcXHQgIG9mIGV4dDQgZmVhdHVyZXMsIHRoZSBvbiBkaXNrIGZpbGVzeXN0ZW0gZm9ybWF0IHN0YXlzIGZ1bGx5IGJhY2t3YXJkXFxuICAyODpcXHRcXHQgIGNvbXBhdGlibGUuXFxuICAyOTpcXHRcXG4gIDMwOlxcdFxcdCAgVG8gY29tcGlsZSB0aGlzIGZpbGUgc3lzdGVtIHN1cHBvcnQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuIFRoZVxcbiAgMzE6XFx0XFx0ICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgZXh0NC5cXG4gIDMyOlxcdFxcbiAgMzM6XFx0XFx0ICBJZiB1bnN1cmUsIHNheSBOLlxcbiAgMzQ6XFx0XFxuICAzNTpcXHRjb25maWcgRVhUNF9VU0VfRk9SX0VYVDJcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTRUMTQ6Mzk6NTguODQ2NDQzMzk0WiIsIlNlcSI6MjQsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy44LWZsYXNoIiwiRHVyYXRpb24iOjk4MDI0NjU1ODksIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSB0aGlua2luZyBwcm9jZXNzOlxuXG4qKkRpdmluZyBpbnRvIHRoZSBleHQ0IENvZGViYXNlKipcblxuT2theSwgc28gSSBzZWUgYENPTkZJR19FWFQ0X0ZTYCwgdGhhdCdzIHRoZSBrZXJuZWwgY29uZmlndXJhdGlvbiBvcHRpb24uIE15IGltbWVkaWF0ZSBpbnN0aW5jdCBpcyB0byBkaWcgaW50byB0aGUgY29udGV4dCBvZiBgZXh0NF9leHRfY2xlYXJfYmJgLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCBpdHMgcm9sZSB3aXRoaW4gdGhlIGxhcmdlciBleHQ0IGZpbGVzeXN0ZW0gaW1wbGVtZW50YXRpb24uIEkgd2FudCB0byBzZWUgaG93IHRoaXMgZnVuY3Rpb24gaXMgdXNlZCwgaG93IGl0IGludGVyYWN0cyB3aXRoIG90aGVyIHBhcnRzIG9mIHRoZSBleHQ0IGNvZGUsIGFuZCB3aGF0IGl0cyBzcGVjaWZpYyBwdXJwb3NlIGlzIHdpdGhpbiB0aGUgbGFyZ2VyIGFyY2hpdGVjdHVyZS4gSSBuZWVkIHRoZSBmdWxsIHBpY3R1cmUgdG8gdW5kZXJzdGFuZCBpdHMgc2lnbmlmaWNhbmNlLiBMZXQncyBnZXQgY3JhY2tpbmcuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjE2MTU0LCJPdXRwdXRUb2tlbnMiOjM4LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MzIsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0xNFQxNDo0MDowOC42NDg5MTIxODNaIiwiU2VxIjoyNSwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MjI2MDIwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcImZzL2V4dDQvZXh0ZW50cy5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDYzMzUsXG4gIFwiTGluZUNvdW50XCI6IDY1XG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIjYzMzU6XFx0XFx0ZXh0NF9mcmVlX2V4dF9wYXRoKHBhdGgyKTtcXG42MzM2OlxcdFxcdHJldHVybiAwO1xcbjYzMzc6XFx0fVxcbjYzMzg6XFx0XFxuNjMzOTpcXHRpbnQgZXh0NF9leHRfY2xlYXJfYmIoc3RydWN0IGlub2RlICppbm9kZSlcXG42MzQwOlxcdHtcXG42MzQxOlxcdFxcdHN0cnVjdCBleHQ0X2V4dF9wYXRoICpwYXRoID0gTlVMTDtcXG42MzQyOlxcdFxcdHN0cnVjdCBleHQ0X2V4dGVudCAqZXg7XFxuNjM0MzpcXHRcXHRleHQ0X2xibGtfdCBjdXIgPSAwLCBlbmQ7XFxuNjM0NDpcXHRcXHRpbnQgaiwgcmV0ID0gMDtcXG42MzQ1OlxcdFxcdHN0cnVjdCBleHQ0X21hcF9ibG9ja3MgbWFwO1xcbjYzNDY6XFx0XFxuNjM0NzpcXHRcXHRpZiAoZXh0NF90ZXN0X2lub2RlX2ZsYWcoaW5vZGUsIEVYVDRfSU5PREVfSU5MSU5FX0RBVEEpKVxcbjYzNDg6XFx0XFx0XFx0cmV0dXJuIDA7XFxuNjM0OTpcXHRcXG42MzUwOlxcdFxcdC8qIERldGVybWluIHRoZSBzaXplIG9mIHRoZSBmaWxlIGZpcnN0ICovXFxuNjM1MTpcXHRcXHRwYXRoID0gZXh0NF9maW5kX2V4dGVudChpbm9kZSwgRVhUX01BWF9CTE9DS1MgLSAxLCBOVUxMLFxcbjYzNTI6XFx0XFx0XFx0XFx0XFx0XFx0RVhUNF9FWF9OT0NBQ0hFKTtcXG42MzUzOlxcdFxcdGlmIChJU19FUlIocGF0aCkpXFxuNjM1NDpcXHRcXHRcXHRyZXR1cm4gUFRSX0VSUihwYXRoKTtcXG42MzU1OlxcdFxcdGV4ID0gcGF0aFtwYXRoLVxcdTAwM2VwX2RlcHRoXS5wX2V4dDtcXG42MzU2OlxcdFxcdGlmICghZXgpXFxuNjM1NzpcXHRcXHRcXHRnb3RvIG91dDtcXG42MzU4OlxcdFxcdGVuZCA9IGxlMzJfdG9fY3B1KGV4LVxcdTAwM2VlZV9ibG9jaykgKyBleHQ0X2V4dF9nZXRfYWN0dWFsX2xlbihleCk7XFxuNjM1OTpcXHRcXG42MzYwOlxcdFxcdGN1ciA9IDA7XFxuNjM2MTpcXHRcXHR3aGlsZSAoY3VyIFxcdTAwM2MgZW5kKSB7XFxuNjM2MjpcXHRcXHRcXHRtYXAubV9sYmxrID0gY3VyO1xcbjYzNjM6XFx0XFx0XFx0bWFwLm1fbGVuID0gZW5kIC0gY3VyO1xcbjYzNjQ6XFx0XFx0XFx0cmV0ID0gZXh0NF9tYXBfYmxvY2tzKE5VTEwsIGlub2RlLCBcXHUwMDI2bWFwLCAwKTtcXG42MzY1OlxcdFxcdFxcdGlmIChyZXQgXFx1MDAzYyAwKVxcbjYzNjY6XFx0XFx0XFx0XFx0Z290byBvdXQ7XFxuNjM2NzpcXHRcXHRcXHRpZiAocmV0IFxcdTAwM2UgMCkge1xcbjYzNjg6XFx0XFx0XFx0XFx0cGF0aCA9IGV4dDRfZmluZF9leHRlbnQoaW5vZGUsIG1hcC5tX2xibGssIHBhdGgsIDApO1xcbjYzNjk6XFx0XFx0XFx0XFx0aWYgKElTX0VSUihwYXRoKSkge1xcbjYzNzA6XFx0XFx0XFx0XFx0XFx0cmV0ID0gUFRSX0VSUihwYXRoKTtcXG42MzcxOlxcdFxcdFxcdFxcdFxcdGdvdG8gb3V0O1xcbjYzNzI6XFx0XFx0XFx0XFx0fVxcbjYzNzM6XFx0XFx0XFx0XFx0Zm9yIChqID0gMDsgaiBcXHUwMDNjIHBhdGgtXFx1MDAzZXBfZGVwdGg7IGorKykge1xcbjYzNzQ6XFx0XFx0XFx0XFx0XFx0ZXh0NF9tYl9tYXJrX2JiKGlub2RlLVxcdTAwM2VpX3NiLFxcbjYzNzU6XFx0XFx0XFx0XFx0XFx0XFx0XFx0cGF0aFtqXS5wX2Jsb2NrLCAxLCBmYWxzZSk7XFxuNjM3NjpcXHRcXHRcXHRcXHRcXHRyZXQgPSBleHQ0X2ZjX3JlY29yZF9yZWdpb25zKGlub2RlLVxcdTAwM2VpX3NiLFxcbjYzNzc6XFx0XFx0XFx0XFx0XFx0XFx0XFx0XFx0ICAgICBpbm9kZS1cXHUwMDNlaV9pbm8sIDAsXFxuNjM3ODpcXHRcXHRcXHRcXHRcXHRcXHRcXHRcXHQgICAgIHBhdGhbal0ucF9ibG9jaywgMSwgMSk7XFxuNjM3OTpcXHRcXHRcXHRcXHRcXHRpZiAocmV0KVxcbjYzODA6XFx0XFx0XFx0XFx0XFx0XFx0Z290byBvdXQ7XFxuNjM4MTpcXHRcXHRcXHRcXHR9XFxuNjM4MjpcXHRcXHRcXHRcXHRleHQ0X21iX21hcmtfYmIoaW5vZGUtXFx1MDAzZWlfc2IsIG1hcC5tX3BibGssIG1hcC5tX2xlbiwgZmFsc2UpO1xcbjYzODM6XFx0XFx0XFx0XFx0cmV0ID0gZXh0NF9mY19yZWNvcmRfcmVnaW9ucyhpbm9kZS1cXHUwMDNlaV9zYiwgaW5vZGUtXFx1MDAzZWlfaW5vLFxcbjYzODQ6XFx0XFx0XFx0XFx0XFx0XFx0XFx0ICAgICBtYXAubV9sYmxrLCBtYXAubV9wYmxrLCBtYXAubV9sZW4sIDEpO1xcbjYzODU6XFx0XFx0XFx0XFx0aWYgKHJldClcXG42Mzg2OlxcdFxcdFxcdFxcdFxcdGdvdG8gb3V0O1xcbjYzODc6XFx0XFx0XFx0fVxcbjYzODg6XFx0XFx0XFx0Y3VyID0gY3VyICsgbWFwLm1fbGVuO1xcbjYzODk6XFx0XFx0fVxcbjYzOTA6XFx0XFxuNjM5MTpcXHRvdXQ6XFxuNjM5MjpcXHRcXHRleHQ0X2ZyZWVfZXh0X3BhdGgocGF0aCk7XFxuNjM5MzpcXHRcXHRyZXR1cm4gcmV0IFxcdTAwM2MgMCA/IHJldCA6IDA7XFxuNjM5NDpcXHR9XFxuNjM5NTpcXHRcXG42Mzk2OlxcdCNpZiBJU19FTkFCTEVEKENPTkZJR19FWFQ0X0tVTklUX1RFU1RTKVxcbjYzOTc6XFx0aW50IGV4dDRfZXh0X3NwYWNlX3Jvb3RfaWR4X3Rlc3Qoc3RydWN0IGlub2RlICppbm9kZSwgaW50IGNoZWNrKVxcbjYzOTg6XFx0e1xcbjYzOTk6XFx0XFx0cmV0dXJuIGV4dDRfZXh0X3NwYWNlX3Jvb3RfaWR4KGlub2RlLCBjaGVjayk7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTE0VDE0OjQwOjA4LjY0OTE0MDIxM1oiLCJTZXEiOjI2LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuOC1mbGFzaCIsIkR1cmF0aW9uIjo0MjE1OTk1NzIwMywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgdGhlIEV4dDQgQmxvY2sgQ2xlYXJpbmcgTG9naWMqKlxuXG5Pa2F5LCBsZXQncyBicmVhayB0aGlzIGRvd24uIEknbSBsb29raW5nIGF0IHRoZSBgZXh0NF9leHRfY2xlYXJfYmJgIGZ1bmN0aW9uLCBzcGVjaWZpY2FsbHkgaG93IGl0IGhhbmRsZXMgcG90ZW50aWFsIGVycm9ycy4gVGhlIGNvcmUgbG9naWMgaXRlcmF0ZXMgdGhyb3VnaCBleHRlbnRzLCBhbmQgdGhlIGNydWNpYWwgdGhpbmcgaXMgaG93IGl0IGhhbmRsZXMgdGhlIHJldHVybiB2YWx1ZXMuIElmIGl0IGZpbmRzIGEgJ2hvbGUnIChgcmV0ID09IDBgKSwgaXQgY29ycmVjdGx5IGluY3JlbWVudHMgYGN1cmAgYnkgdGhlIG1hcCBsZW5ndGguIElmIGl0IGZpbmRzIGJsb2NrcyAoYHJldCBcdTAwM2UgMGApLCB0aGF0J3MgZ29vZC4gQnV0IGhlcmUncyB0aGUga2lja2VyOiBhbiBlcnJvciAoYHJldCBcdTAwM2MgMGApIG5vdyBqdW1wcyBkaXJlY3RseSB0byBgb3V0YCBpbnN0ZWFkIG9mIGEgZmxhd2VkIGVhcmxpZXIgYXBwcm9hY2guXG5cblRoZSBvcmlnaW5hbCBjb2RlJ3MgZXJyb3IgaGFuZGxpbmcgc2VlbWVkIHN1c3BlY3QuIElmIGBleHQ0X2ZpbmRfZXh0ZW50YCByZXR1cm5lZCBhbiBlcnJvciwgdGhlIGNvZGUgKnByZXZpb3VzbHkqIHdvdWxkIHRyeSB0byBjb250aW51ZSB1c2luZyBwb3RlbnRpYWxseSBpbnZhbGlkIGRhdGEgaW4gYG1hcGAgLSBhbmQgdGhlbiBjYWxsIGBleHQ0X2ZpbmRfZXh0ZW50YCBhZ2FpbiB3aXRoIGEgbnVsbCBwYXRoLiBUaGF04oCZcyBhIHJlY2lwZSBmb3IgZGlzYXN0ZXIhIFRoZSAqZml4KiBpcyBub3cgdG8gcHJvcGVybHkgcmV0dXJuIHRoZSBlcnJvciwgYW5kIGp1bXAgb3V0LlxuXG5UaGUgY29kZSBub3cgYWxzbyBleHBsaWNpdGx5IGNoZWNrcyBmb3IgZXJyb3JzIGZyb20gYGV4dDRfZmNfcmVjb3JkX3JlZ2lvbnNgLCBqdW1waW5nIHRvIGBvdXRgIGlmIGl0IGZhaWxzLiBUaGUgYG91dGAgbGFiZWwgcHJvcGVybHkgZnJlZXMgdGhlIGBwYXRoYCDigJMgaXQgaGFuZGxlcyBjYXNlcyB3aGVyZSBgcGF0aGAgaXMgYW4gZXJyb3Igb3IgbnVsbCB3aXRoIGBleHQ0X2ZyZWVfZXh0X3BhdGhgLCBhbmQgdGhlIHJldHVybiB2YWx1ZSBpcyBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgaWYgdGhlcmUgd2FzIG9uZSwgb3RoZXJ3aXNlIGl0IHJldHVybnMgMC5cblxuVGhlIGNhbGwgdG8gYGV4dDRfZXh0X2NsZWFyX2JiYCBpbiBgZXh0NF9mY19yZXBsYXlfaW5vZGVgIGlzIGNsZWFuIOKAkyBpdCBjb3JyZWN0bHkgY2hlY2tzIHRoZSByZXR1cm4gdmFsdWUgYW5kIGV4aXRzIG9uIGVycm9yLCBmcmVlaW5nIHRoZSBpbm9kZS4gVGhlIGludGVudCBpcyBjbGVhci5cblxuVG8gZ2V0IHRoZSBmdWxsIHBpY3R1cmUsIEkgbmVlZCB0byBjaGVjayB0aGUgZ2l0IGxvZyB0byB1bmRlcnN0YW5kIHRoZSBjb250ZXh0IG9mIHRoaXMgY2hhbmdlLiBJIG5lZWQgdG8ga25vdyAqd2hhdCogcHJvYmxlbSB0aGlzIGNvbW1pdCBzcGVjaWZpY2FsbHkgYWRkcmVzc2VzLCB3aGF0IHRoZSBvcmlnaW5hbCBidWcgd2FzLCBhbmQgd2hhdCBlZGdlIGNhc2VzIHRoZSBuZXcgbG9naWMgY29ycmVjdHMuIEkgbmVlZCB0byB1bmRlcnN0YW5kIHdoeSB0aGlzIHdhcyBjaGFuZ2VkLCBhbmQgaG93IHRoZSBjaGFuZ2VzIGltcHJvdmUgcmVsaWFiaWxpdHkgYW5kIGNvcnJlY3RuZXNzLCBhbmQgaG93IHRoaXMgcmVsYXRlcyB0byBGYXN0IENvbW1pdC5cblxuXG4iLCJJbnB1dFRva2VucyI6MTc0MjEsIk91dHB1dFRva2VucyI6MzIsIk91dHB1dFRob3VnaHRzVG9rZW5zIjozNzksIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0xNFQxNDo0MDo1MC44MDkxMDA0MzZaIiwiU2VxIjoyNywiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjk3NzIxODY1LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImV4dDRfZXh0X2NsZWFyX2JiXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcImZzL2V4dDRcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiZnMvZXh0NC9leHQ0Lmg9Mzk1Nz1leHRlcm4gaW50IGV4dDRfZXh0X3JlcGxheV91cGRhdGVfZXgoc3RydWN0IGlub2RlICppbm9kZSwgZXh0NF9sYmxrX3Qgc3RhcnQsXFxuZnMvZXh0NC9leHQ0LmgtMzk1OC1cXHRcXHRpbnQgbGVuLCBpbnQgdW53cml0dGVuLCBleHQ0X2ZzYmxrX3QgcGJsayk7XFxuZnMvZXh0NC9leHQ0Lmg6Mzk1OTpleHRlcm4gaW50IGV4dDRfZXh0X2NsZWFyX2JiKHN0cnVjdCBpbm9kZSAqaW5vZGUpO1xcbmZzL2V4dDQvZXh0NC5oLTM5NjAtXFxuLS1cXG5mcy9leHQ0L2V4dGVudHMuYz02MjUyPWludCBleHQ0X2V4dF9yZXBsYXlfc2V0X2libG9ja3Moc3RydWN0IGlub2RlICppbm9kZSlcXG4tLVxcbmZzL2V4dDQvZXh0ZW50cy5jLTYzMzgtXFxuZnMvZXh0NC9leHRlbnRzLmM6NjMzOTppbnQgZXh0NF9leHRfY2xlYXJfYmIoc3RydWN0IGlub2RlICppbm9kZSlcXG5mcy9leHQ0L2V4dGVudHMuYy02MzQwLXtcXG4tLVxcbmZzL2V4dDQvZmFzdF9jb21taXQuYz0xOTI1PXN0YXRpYyBpbnQgZXh0NF9mY19yZXBsYXlfaW5vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYixcXG4tLVxcbmZzL2V4dDQvZmFzdF9jb21taXQuYy0xOTQzLVxcdGlmICghSVNfRVJSKGlub2RlKSkge1xcbmZzL2V4dDQvZmFzdF9jb21taXQuYzoxOTQ0OlxcdFxcdHJldCA9IGV4dDRfZXh0X2NsZWFyX2JiKGlub2RlKTtcXG5mcy9leHQ0L2Zhc3RfY29tbWl0LmMtMTk0NS1cXHRcXHRpcHV0KGlub2RlKTtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTRUMTQ6NDA6NTAuOTA2ODI5ODdaIiwiU2VxIjoyOCwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjgtZmxhc2giLCJEdXJhdGlvbiI6NTE4MDAyODE5MCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipGdXp6aW5nIEV4dDQ6IFdvcnRoIEl0IGFuZCBIb3cgdG8gQXBwcm9hY2ggSXQqKlxuXG5Pa2F5LCBzbyB0aGUgcXVlc3Rpb24gaXMsIGNhbiB3ZSBhY3R1YWxseSBoaXQgdGhpcyBjb2RlIHdpdGggYSBmdXp6ZXIgbGlrZSBzeXprYWxsZXIgaW4gYSBzdGFuZGFyZCBzZXR1cD8gVGhlIGFuc3dlcidzIGEgcmVzb3VuZGluZyB5ZXMhIEV4dDQgaXMgYSBiZWRyb2NrIGZpbGVzeXN0ZW0gaW4gTGludXgsIHNvIGl0J3MgYSBwcmltZSB0YXJnZXQuIFNwZWNpZmljYWxseSwgaWYgd2UgbW91bnQgYW4gZXh0NCBpbWFnZSBhbmQgdHJpZ2dlciBhIGZhc3QgY29tbWl0IGxvZyByZXBsYXkgKHdoaWNoIHN5emthbGxlciBkb2VzIHdpdGggcmF3IGZpbGVzeXN0ZW0gZnV6emluZyksIHdlIGNhbiBnZXQgcmlnaHQgaW50byBgZXh0NF9mY19yZXBsYXlgIC1cdTAwM2UgYGV4dDRfZmNfcmVwbGF5X2lub2RlYCAtXHUwMDNlIGBleHQ0X2V4dF9jbGVhcl9iYmAuIEZhc3QgY29tbWl0IG9wZXJhdGlvbnMgY2FuIGFsc28gcG9wIHVwIGR1cmluZyByb3V0aW5lIGZpbGVzeXN0ZW0gb3BlcmF0aW9ucywgbGlrZSB3aGVuIGBmc3luY2AgaXMgY2FsbGVkLlxuXG5UaGUga2V5IGhlcmUgaXMgdGhhdCB0aGlzIGlzIGNvcmUgZmlsZXN5c3RlbSBjb2RlLCBzaXR0aW5nIHJpZ2h0IGluIGBmcy9leHQ0L2AuIFRoaXMgbWVhbnMgd2UncmUgdGFsa2luZyBhYm91dCBmdW5kYW1lbnRhbCBzdHVmZiDigJMgZXJyb3IgaGFuZGxpbmcsIGNvbnRyb2wgZmxvdywgYW5kIHJlc291cmNlIGNsZWFudXAgd2l0aGluIGBleHQ0X2V4dF9jbGVhcl9iYmAgYW5kIGBleHQ0X2ZjX3JlcGxheV9pbm9kZWAuIFRoYXQgbWFrZXMgaXQgaW5oZXJlbnRseSBpbnRlcmVzdGluZyBmcm9tIGEgZnV6emluZyBwZXJzcGVjdGl2ZSwgYW5kIHRoZSBwb3RlbnRpYWwgZm9yIHVuY292ZXJpbmcgYnVncyBzZWVtcyBoaWdoLiBUaGVyZWZvcmUsIFdvcnRoRnV6emluZyBpcyBUUlVFLlxuXG5Ob3csIHdoaWNoIHN5bWJvbHMgc2hvdWxkIHdlIHByaW9yaXRpemU/IExldCdzIHpvb20gaW4gb24gdGhlIGZ1bmN0aW9ucyBkaXJlY3RseSBtb2RpZmllZCBvciBkaXJlY3RseSBjb25uZWN0ZWQgdG8gdGhpcyBwb3RlbnRpYWwgdnVsbmVyYWJpbGl0eS4gVGhlIG1vZGlmaWVkIGZ1bmN0aW9ucyBhcmU6IGBleHQ0X2V4dF9jbGVhcl9iYmAgKGluIGBmcy9leHQ0L2V4dGVudHMuY2ApIGFuZCBgZXh0NF9mY19yZXBsYXlfaW5vZGVgIChpbiBgZnMvZXh0NC9mYXN0X2NvbW1pdC5jYCkuIEJ1dCwgYXJlIHRoZXJlIGFueSBvdGhlciBmdW5jdGlvbnMgaW52b2x2ZWQ/IFRoZSBjYWxsZXIgb2YgYGV4dDRfZmNfcmVwbGF5X2lub2RlYCBpcyBgZXh0NF9mY19yZXBsYXlgLCB3aGljaCBpcyBhbHNvIGluIGBmYXN0X2NvbW1pdC5jYC4gU28gbGV0J3MgYWRkIGBleHQ0X2ZjX3JlcGxheWAgdG8gb3VyIGxpc3QgdG8gZXhhbWluZS5cblxuXG4iLCJJbnB1dFRva2VucyI6MTg2MTQsIk91dHB1dFRva2VucyI6MzksIk91dHB1dFRob3VnaHRzVG9rZW5zIjozMDksIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMTRUMTQ6NDA6NTYuMDg2ODYwNDlaIiwiU2VxIjoyOSwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MjM2OTgwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcImZzL2V4dDQvZmFzdF9jb21taXQuY1wiLFxuICBcIkZpcnN0TGluZVwiOiAyNTcwLFxuICBcIkxpbmVDb3VudFwiOiA0MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIyNTcwOlxcdCAqIE1haW4gcmVjb3ZlcnkgcGF0aCBlbnRyeSBwb2ludC5cXG4yNTcxOlxcdCAqIFRoZSBtZWFuaW5nIG9mIHJldHVybiBjb2RlcyBpcyBzaW1pbGFyIGFzIGFib3ZlLlxcbjI1NzI6XFx0ICovXFxuMjU3MzpcXHRzdGF0aWMgaW50IGV4dDRfZmNfcmVwbGF5KGpvdXJuYWxfdCAqam91cm5hbCwgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCxcXG4yNTc0OlxcdFxcdFxcdFxcdFxcdGVudW0gcGFzc3R5cGUgcGFzcywgaW50IG9mZiwgdGlkX3QgZXhwZWN0ZWRfdGlkKVxcbjI1NzU6XFx0e1xcbjI1NzY6XFx0XFx0c3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGpvdXJuYWwtXFx1MDAzZWpfcHJpdmF0ZTtcXG4yNTc3OlxcdFxcdHN0cnVjdCBleHQ0X3NiX2luZm8gKnNiaSA9IEVYVDRfU0Ioc2IpO1xcbjI1Nzg6XFx0XFx0c3RydWN0IGV4dDRfZmNfdGxfbWVtIHRsO1xcbjI1Nzk6XFx0XFx0X191OCAqc3RhcnQsICplbmQsICpjdXIsICp2YWw7XFxuMjU4MDpcXHRcXHRpbnQgcmV0ID0gSkJEMl9GQ19SRVBMQVlfQ09OVElOVUU7XFxuMjU4MTpcXHRcXHRzdHJ1Y3QgZXh0NF9mY19yZXBsYXlfc3RhdGUgKnN0YXRlID0gXFx1MDAyNnNiaS1cXHUwMDNlc19mY19yZXBsYXlfc3RhdGU7XFxuMjU4MjpcXHRcXHRzdHJ1Y3QgZXh0NF9mY190YWlsIHRhaWw7XFxuMjU4MzpcXHRcXG4yNTg0OlxcdFxcdGlmIChwYXNzID09IFBBU1NfU0NBTikge1xcbjI1ODU6XFx0XFx0XFx0c3RhdGUtXFx1MDAzZWZjX2N1cnJlbnRfcGFzcyA9IFBBU1NfU0NBTjtcXG4yNTg2OlxcdFxcdFxcdHJldHVybiBleHQ0X2ZjX3JlcGxheV9zY2FuKGpvdXJuYWwsIGJoLCBvZmYsIGV4cGVjdGVkX3RpZCk7XFxuMjU4NzpcXHRcXHR9XFxuMjU4ODpcXHRcXG4yNTg5OlxcdFxcdGlmIChzdGF0ZS1cXHUwMDNlZmNfY3VycmVudF9wYXNzICE9IHBhc3MpIHtcXG4yNTkwOlxcdFxcdFxcdHN0YXRlLVxcdTAwM2VmY19jdXJyZW50X3Bhc3MgPSBwYXNzO1xcbjI1OTE6XFx0XFx0XFx0c2JpLVxcdTAwM2VzX21vdW50X3N0YXRlIHw9IEVYVDRfRkNfUkVQTEFZO1xcbjI1OTI6XFx0XFx0fVxcbjI1OTM6XFx0XFx0aWYgKCFzYmktXFx1MDAzZXNfZmNfcmVwbGF5X3N0YXRlLmZjX3JlcGxheV9udW1fdGFncykge1xcbjI1OTQ6XFx0XFx0XFx0ZXh0NF9kZWJ1ZyhcXFwiUmVwbGF5IHN0b3BzXFxcXG5cXFwiKTtcXG4yNTk1OlxcdFxcdFxcdGV4dDRfZmNfc2V0X2JpdG1hcHNfYW5kX2NvdW50ZXJzKHNiKTtcXG4yNTk2OlxcdFxcdFxcdHJldHVybiAwO1xcbjI1OTc6XFx0XFx0fVxcbjI1OTg6XFx0XFxuMjU5OTpcXHQjaWZkZWYgQ09ORklHX0VYVDRfREVCVUdcXG4yNjAwOlxcdFxcdGlmIChzYmktXFx1MDAzZXNfZmNfZGVidWdfbWF4X3JlcGxheSBcXHUwMDI2XFx1MDAyNiBvZmYgXFx1MDAzZT0gc2JpLVxcdTAwM2VzX2ZjX2RlYnVnX21heF9yZXBsYXkpIHtcXG4yNjAxOlxcdFxcdFxcdHByX3dhcm4oXFxcIkRyb3BwaW5nIGZjIGJsb2NrICVkIGJlY2F1c2UgbWF4X3JlcGxheSBzZXRcXFxcblxcXCIsIG9mZik7XFxuMjYwMjpcXHRcXHRcXHRyZXR1cm4gSkJEMl9GQ19SRVBMQVlfU1RPUDtcXG4yNjAzOlxcdFxcdH1cXG4yNjA0OlxcdCNlbmRpZlxcbjI2MDU6XFx0XFxuMjYwNjpcXHRcXHRzdGFydCA9ICh1OCAqKWJoLVxcdTAwM2ViX2RhdGE7XFxuMjYwNzpcXHRcXHRlbmQgPSBzdGFydCArIGpvdXJuYWwtXFx1MDAzZWpfYmxvY2tzaXplO1xcbjI2MDg6XFx0XFxuMjYwOTpcXHRcXHRmb3IgKGN1ciA9IHN0YXJ0OyBjdXIgXFx1MDAzYz0gZW5kIC0gRVhUNF9GQ19UQUdfQkFTRV9MRU47XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTE0VDE0OjQwOjU2LjA4NzEwMDUyWiIsIlNlcSI6MzAsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy44LWZsYXNoIiwiRHVyYXRpb24iOjY1MTIwNjIxOTAyLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyBleHQ0IEZhc3QgQ29tbWl0IFJlcGxheSBmb3IgRnV6emluZyoqXG5cbkFscmlnaHQsIGxldCdzIGJyZWFrIGRvd24gdGhpcyBmYXN0IGNvbW1pdCByZXBsYXkgbG9naWMgaW4gZXh0NC4gRmlyc3QsIEkgbmVlZCB0byBjb25maXJtIHdoZXRoZXIgYGV4dDRfZmNfcmVwbGF5YCBpcyBzdGF0aWMgb3Igbm90LiBPa2F5LCBpdCdzIGRlZmluZWQgYXMgYHN0YXRpYyBpbnQgZXh0NF9mY19yZXBsYXlgLiBTbywgaW4gdGhlIHZtbGludXggY29udGV4dCwgc3RhdGljIGZ1bmN0aW9ucyAqc2hvdWxkKiBoYXZlIHN5bWJvbHMgdW5sZXNzIHRoZXkgZ2V0IGlubGluZWQuIEdvb2QgdG8ga25vdy5cblxuTm93LCBgZXh0NF9leHRfY2xlYXJfYmJgIGlzIG5vbi1zdGF0aWMgKGBpbnQgZXh0NF9leHRfY2xlYXJfYmIoc3RydWN0IGlub2RlICppbm9kZSlgKSwgYW5kIHRoYXQncyBpbXBvcnRhbnQuIFRoZW4gd2UgaGF2ZSBgZXh0NF9mY19yZXBsYXlfaW5vZGVgIHdoaWNoIGlzIGBzdGF0aWMgaW50IGV4dDRfZmNfcmVwbGF5X2lub2RlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBleHQ0X2ZjX3RsX21lbSAqdGwsIHU4ICp2YWwpYC4gSSBuZWVkIHRvIGZpZ3VyZSBvdXQgaWYgZWl0aGVyIGBleHQ0X2ZjX3JlcGxheWAgb3IgYGV4dDRfZmNfcmVwbGF5X2lub2RlYCBhcmUgbGlrZWx5IHRvIGJlIGlubGluZWQsIG9yIGlmIHRoZXkncmUgY29tcGxleCBlbm91Z2ggdG8gcHJlc2VydmUgdGhlaXIgc3ltYm9scy5cblxuYGV4dDRfZmNfcmVwbGF5X2lub2RlYCBpcyBhcm91bmQgMTAwIGxpbmVzIGxvbmcsIHNvIGl0J3MgcHJvYmFibHkgbm90IGdldHRpbmcgaW5saW5lZC4gSG93ZXZlciwgYGV4dDRfZXh0X2NsZWFyX2JiYCBpcyBleHBvcnRlZCBpbiBleHQ0LmggYW5kIGlzIG5vbi1zdGF0aWMsIHNvIGl0cyBzeW1ib2wgKm11c3QqIGJlIHByZXNlbnQuIE5vdywgSSBoYXZlIHRvIGNoZWNrIGBleHQ0X2ZjX3JlcGxheWAsIHRoYXQncyBhbiBpbXBvcnRhbnQgb25lLiBUaGUgY29yZSBmdW5jdGlvbnMgSSdtIGludGVyZXN0ZWQgaW4gZm9yIGZ1enppbmcgYXJlLCBpbiBlc3NlbmNlOiBgZXh0NF9leHRfY2xlYXJfYmJgLCBgZXh0NF9mY19yZXBsYXlfaW5vZGVgLCBhbmQgYGV4dDRfZmNfcmVwbGF5YC4gVGhlc2UgdGhyZWUgc2VlbSB0byBiZSB0aGUgbW9zdCBzcGVjaWZpYyB0byB0aGlzIGZhc3QgY29tbWl0IHJlcGxheSBsb2dpYy5cblxuTm93LCBsZXQncyBjaGVjayB3aGF0IGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBhcmUgcmVxdWlyZWQgdG8gZW5hYmxlIHRoZXNlLiBgZXh0NF9leHRfY2xlYXJfYmJgIGFuZCBgZXh0NF9mY19yZXBsYXlfaW5vZGVgIGFyZSBwYXJ0IG9mIGV4dDQuICBPZiBjb3Vyc2UsIGBDT05GSUdfRVhUNF9GU2AgaXMgYSBoYXJkIHJlcXVpcmVtZW50LiBBcmUgdGhlcmUgYW55IG90aGVyIHNwZWNpZmljIGNvbmZpZ3MgbmVlZGVkPyBMZXQncyBjaGVjayB0aGUgYGZzL2V4dDQvTWFrZWZpbGVgLlxuXG5Pa2F5LCBzbzpcbmBgYG1ha2Vcbm9iai0kKENPTkZJR19FWFQ0X0ZTKSArPSBleHQ0Lm9cbmV4dDQteVx0Oj0gYmFsbG9jLm8gYml0bWFwLm8gYmxvY2tfdmFsaWRpdHkubyBkaXIubyBleHQ0X2piZDIubyBleHRlbnRzLm8gXFxcblx0XHRleHRlbnRzX3N0YXR1cy5vIGZpbGUubyBmc21hcC5vIGZzeW5jLm8gaGFzaC5vIGlhbGxvYy5vIFxcXG5cdFx0aW5kaXJlY3QubyBpbmxpbmUubyBpbm9kZS5vIGlvY3RsLm8gbWJhbGxvYy5vIG1pZ3JhdGUubyBcXFxuXHRcdG1tcC5vIG1vdmVfZXh0ZW50Lm8gbmFtZWkubyBwYWdlLWlvLm8gcmVhZHBhZ2UubyByZXNpemUubyBcXFxuXHRcdHN1cGVyLm8gc3ltbGluay5vIHN5c2ZzLm8geGF0dHIubyB4YXR0cl9odXJkLm8geGF0dHJfdHJ1c3RlZC5vIFxcXG5cdFx0eGF0dHJfdXNlci5vIGZhc3RfY29tbWl0Lm8gb3JwaGFuLm9cbmBgYFxuXG5Cb3RoIGBleHRlbnRzLm9gIGFuZCBgZmFzdF9jb21taXQub2AgYXJlIGluY2x1ZGVkIGluIGBleHQ0LXlgIHdoZW4gYENPTkZJR19FWFQ0X0ZTYCBpcyBlbmFibGVkLiBMZXQncyBtYWtlIHN1cmUgbmVpdGhlciBgZXh0NF9leHRfY2xlYXJfYmJgIG5vciBgZXh0NF9mY19yZXBsYXlfaW5vZGVgIGhhdmUgYW55IGNvbmRpdGlvbmFsIGNvbXBpbGF0aW9uIGRpcmVjdGl2ZXMgKGAjaWZkZWZgKSBhcm91bmQgdGhlbS5cblxuQ2hlY2tpbmcgYGZzL2V4dDQvZXh0ZW50cy5jYCBmb3IgYGV4dDRfZXh0X2NsZWFyX2JiYDogTGluZSA2MzM5OiBgaW50IGV4dDRfZXh0X2NsZWFyX2JiKHN0cnVjdCBpbm9kZSAqaW5vZGUpYCAtIG5vIGAjaWZkZWZgIGRpcmVjdGl2ZXMgYXJvdW5kIGl0LiBHb29kLlxuXG5Ob3csIGluIGBmcy9leHQ0L2Zhc3RfY29tbWl0LmNgIGZvciBgZXh0NF9mY19yZXBsYXlfaW5vZGVgOiBMaW5lIDE5MjU6IGBzdGF0aWMgaW50IGV4dDRfZmNfcmVwbGF5X2lub2RlYCAtIGFnYWluLCBubyBgI2lmZGVmYCBhcm91bmQgaXQuIExvb2tzIGxpa2UgYEVYVDRfRlNgIGlzIHRoZSBvbmx5IHJlcXVpcmVtZW50LCB0aGFua2Z1bGx5LlxuXG5Pa2F5LCBsZXQncyBkb3VibGUtY2hlY2sgZXZlcnl0aGluZyBmb3IgY2xhcml0eTpcblxuMS4gICoqV29ydGhGdXp6aW5nOiBUcnVlKiouIFRoZSBwYXRjaCBmaXhlcyBlcnJvciBoYW5kbGluZyBpbiBmYXN0IGNvbW1pdCBsb2cgcmVwbGF5LiBQcmV2aW91c2x5LCBpbiBgZXh0NF9leHRfY2xlYXJfYmIoKWAsIGNlcnRhaW4gZXJyb3JzIHdlcmUgYmVpbmcgaWdub3JlZCwgcG90ZW50aWFsbHkgbGVhZGluZyB0byBhbiBpbnZhbGlkIHN0YXRlLiBOb3csIGVycm9ycyBhcmUgcHJvcGFnYXRlZCwgYW5kIGBleHQ0X2ZjX3JlcGxheV9pbm9kZSgpYCBjaGVja3MgdGhlIHJldHVybiBjb2RlIG9mIGBleHQ0X2V4dF9jbGVhcl9iYigpYCBhbmQgYWJvcnRzIHJlcGxheSBpZiBhbiBlcnJvciBpcyBkZXRlY3RlZC4gVGhpcyBjb2RlIHBhdGggaXMgdXNlZCBkdXJpbmcgam91cm5hbCByZWNvdmVyeS9yZXBsYXkgb24gZXh0NCBtb3VudHMsIHdoaWNoIGlzIGV4ZXJjaXNlZCBpbiBmaWxlc3lzdGVtIGZ1enppbmcgc2NlbmFyaW9zLlxuXG4yLiAgKipGb2N1c1N5bWJvbHM6KiogSSBuZWVkIHRvIHRhcmdldDpcbiAgICAqICAgYGV4dDRfZXh0X2NsZWFyX2JiYFxuICAgICogICBgZXh0NF9mY19yZXBsYXlfaW5vZGVgXG4gICAgKiAgIGBcblxuIiwiSW5wdXRUb2tlbnMiOjIwMDU4LCJPdXRwdXRUb2tlbnMiOjE5MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjk3NiwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTE0VDE0OjQyOjAxLjIwNzcyNjQ2MloiLCJTZXEiOjMxLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJzZXQtcmVzdWx0cyIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjEyMjU1NTc5MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiRVhUNF9GU1wiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcImV4dDRfZXh0X2NsZWFyX2JiXCIsXG4gICAgXCJleHQ0X2ZjX3JlcGxheV9pbm9kZVwiLFxuICAgIFwiZXh0NF9mY19yZXBsYXlcIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBtb2RpZmllcyBlcnJvciBoYW5kbGluZyBhbmQgY29udHJvbCBmbG93IGluIGV4dDQgZmFzdCBjb21taXQgcmVwbGF5IGxvZ2ljLiBJbiBleHQ0X2V4dF9jbGVhcl9iYigpLCBlcnJvcnMgZnJvbSBleHQ0X21hcF9ibG9ja3MoKSwgZXh0NF9maW5kX2V4dGVudCgpLCBhbmQgZXh0NF9mY19yZWNvcmRfcmVnaW9ucygpIGFyZSBub3cgcHJvcGVybHkgY2FwdHVyZWQgYW5kIHJldHVybmVkIGluc3RlYWQgb2YgYmVpbmcgaWdub3JlZC4gQWRkaXRpb25hbGx5LCBleHQ0X2ZjX3JlcGxheV9pbm9kZSgpIG5vdyBjaGVja3MgdGhlIHJldHVybiB2YWx1ZSBvZiBleHQ0X2V4dF9jbGVhcl9iYigpIGFuZCBhYm9ydHMgcmVwbGF5IG9uIGVycm9yLiBUaGlzIHJlYWNoYWJsZSBmaWxlc3lzdGVtIHJlY292ZXJ5IHBhdGggc2hvdWxkIGJlIGZ1enplZCB0byB2ZXJpZnkgdGhhdCBlcnJvciBjb25kaXRpb25zIGFuZCBwYXRoIGNsZWFudXAgYmVoYXZlIGNvcnJlY3RseSB3aXRob3V0IGxlYWtzIG9yIHVuZXhwZWN0ZWQgcGFuaWNzLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIkVYVDRfRlNcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJleHQ0X2V4dF9jbGVhcl9iYlwiLFxuICAgIFwiZXh0NF9mY19yZXBsYXlfaW5vZGVcIixcbiAgICBcImV4dDRfZmNfcmVwbGF5XCJcbiAgXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggbW9kaWZpZXMgZXJyb3IgaGFuZGxpbmcgYW5kIGNvbnRyb2wgZmxvdyBpbiBleHQ0IGZhc3QgY29tbWl0IHJlcGxheSBsb2dpYy4gSW4gZXh0NF9leHRfY2xlYXJfYmIoKSwgZXJyb3JzIGZyb20gZXh0NF9tYXBfYmxvY2tzKCksIGV4dDRfZmluZF9leHRlbnQoKSwgYW5kIGV4dDRfZmNfcmVjb3JkX3JlZ2lvbnMoKSBhcmUgbm93IHByb3Blcmx5IGNhcHR1cmVkIGFuZCByZXR1cm5lZCBpbnN0ZWFkIG9mIGJlaW5nIGlnbm9yZWQuIEFkZGl0aW9uYWxseSwgZXh0NF9mY19yZXBsYXlfaW5vZGUoKSBub3cgY2hlY2tzIHRoZSByZXR1cm4gdmFsdWUgb2YgZXh0NF9leHRfY2xlYXJfYmIoKSBhbmQgYWJvcnRzIHJlcGxheSBvbiBlcnJvci4gVGhpcyByZWFjaGFibGUgZmlsZXN5c3RlbSByZWNvdmVyeSBwYXRoIHNob3VsZCBiZSBmdXp6ZWQgdG8gdmVyaWZ5IHRoYXQgZXJyb3IgY29uZGl0aW9ucyBhbmQgcGF0aCBjbGVhbnVwIGJlaGF2ZSBjb3JyZWN0bHkgd2l0aG91dCBsZWFrcyBvciB1bmV4cGVjdGVkIHBhbmljcy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTRUMTQ6NDI6MDEuMzMwMjkwMzEyWiIsIlNlcSI6MzIsIk5lc3RpbmciOjEsIlR5cGUiOiJhY3Rpb24iLCJOYW1lIjoiSWYiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjozMTYyMTAxMTk4MjksIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xNFQxNDo0MjowMS4zMzA4NjQ4MTJaIiwiU2VxIjozMywiTmVzdGluZyI6MiwiVHlwZSI6ImFnZW50IiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiY29yZSIsIkR1cmF0aW9uIjozMTYyMDk1NDIxNjksIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGltcHJvdmVzIGVycm9yIGhhbmRsaW5nIGluIGV4dDQgZmFzdCBjb21taXQgcmVwbGF5IGNvZGUgKGZzL2V4dDQvZXh0ZW50cy5jIGFuZCBmcy9leHQ0L2Zhc3RfY29tbWl0LmMpLiBTcGVjaWZpY2FsbHksIGV4dDRfZXh0X2NsZWFyX2JiKCkgbm93IHByb3Blcmx5IHByb3BhZ2F0ZXMgZXJyb3IgcmV0dXJuIGNvZGVzIGZyb20gZXh0NF9tYXBfYmxvY2tzKCksIGV4dDRfZmluZF9leHRlbnQoKSwgYW5kIGV4dDRfZmNfcmVjb3JkX3JlZ2lvbnMoKSwgcmF0aGVyIHRoYW4gaWdub3JpbmcgZXJyb3JzIGFuZCB1bmNvbmRpdGlvbmFsbHkgcmV0dXJuaW5nIDAuIEFkZGl0aW9uYWxseSwgZXh0NF9mY19yZXBsYXlfaW5vZGUoKSBub3cgY2hlY2tzIHRoZSByZXR1cm4gdmFsdWUgb2YgZXh0NF9leHRfY2xlYXJfYmIoKSBhbmQgYWJvcnRzIG9uIGVycm9yLlxcblxcblRoZXJlIGFyZSBubyB1bmluaXRpYWxpemVkIHZhcmlhYmxlcyBvciBzdHJ1Y3QgZmllbGRzIGludHJvZHVjZWQgb3IgbW9kaWZpZWQsIG5vIGNvcGllcyB0byB1c2VyIHNwYWNlIG9yIHBvdGVudGlhbCBpbmZvLWxlYWtzLCBhbmQgbm8gYnJhbmNoaW5nIG9uIHVuaW5pdGlhbGl6ZWQgbWVtb3J5LiBBbGwgdmFyaWFibGVzIGludm9sdmVkIChlLmcuIHJldCwgcGF0aCkgYXJlIHByb3Blcmx5IGluaXRpYWxpemVkIGJlZm9yZSB1c2UuIENvbnNlcXVlbnRseSwgdGhpcyBjaGFuZ2UgZG9lcyBub3QgZXhwb3NlIGFueSB1bmluaXRpYWxpemVkIG1lbW9yeSByaXNrcyBkZXRlY3RhYmxlIGJ5IEtNU0FOLiBTdGFuZGFyZCBLQVNBTiBmdXp6aW5nIGFuZCB0ZXN0IHN1aXRlcyBhcmUgZnVsbHkgYWRlcXVhdGUuXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiBmYWxzZVxufSIsIkluc3RydWN0aW9uIjoiWW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIHNlY3VyaXR5IGVuZ2luZWVyIHNwZWNpYWxpemluZyBpbiBrZXJuZWwgbWVtb3J5XG5lcnJvciBkZXRlY3RvcnMgKEtBU0FOIGFuZCBLTVNBTikuIFlvdXIgam9iIGlzIHRvIHJldmlldyB0aGUgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZFxuZGV0ZXJtaW5lIGlmIHRoZSBjb2RlIGNoYW5nZXMganVzdGlmeSBzcGF3bmluZyBhIGRlZGljYXRlZCBLTVNBTiAoS2VybmVsTWVtb3J5U2FuaXRpemVyKVxuZnV6emluZyBzZXNzaW9uIGluIGFkZGl0aW9uIHRvIHN0YW5kYXJkIEtBU0FOIGZ1enppbmcuXG5cbkNSSVRJQ0FMIERJU1RJTkNUSU9OIEJFVFdFRU4gS0FTQU4gQU5EIEtNU0FOOlxuLSBTdGFuZGFyZCBLQVNBTiBrZXJuZWwgYnVpbGRzICh1cHN0cmVhbS1hcHBhcm1vci1rYXNhbi5jb25maWcpIGFscmVhZHkgZW5hYmxlXG4gIGEgY29tcHJlaGVuc2l2ZSBzdWl0ZSBvZiBkZWJ1Z2dpbmcgdG9vbHMgYW5kIHNhbml0aXplcnMsIGluY2x1ZGluZyBLQVNBTlxuICAob3V0LW9mLWJvdW5kcyBhY2Nlc3NlcywgdXNlLWFmdGVyLWZyZWUsIGRvdWJsZSBmcmVlLCBpbnZhbGlkIGZyZWUpLCBMT0NLREVQXG4gIChsb2NraW5nIGJ1Z3MgYW5kIGRlYWRsb2NrcyksIFVCLXNhbml0aXplcnMsIGFuZCBtZW1vcnkgY29ycnVwdGlvbiBjaGVja3MuXG4tIEtNU0FOIChLZXJuZWxNZW1vcnlTYW5pdGl6ZXIpIGRldGVjdHMgcmVhZHMgb2YgVU5JTklUSUFMSVpFRCBtZW1vcnkgKHN0YWNrLCBoZWFwLFxuICBvciBwYWdlIGFsbG9jYXRpb25zKSBhbmQga2VybmVsLXRvLXVzZXIgbWVtb3J5IGluZm8tbGVha3MuXG5cblJ1bGU6IFRIRVJFIElTIE5PIFNFTlNFIElOIFJVTk5JTkcgQSBLTVNBTiBTRVNTSU9OIElGIEEgQlVHIENBTiBCRSBDQVVHSFQgQlkgS0FTQU4sXG5MT0NLREVQLCBPUiBPVEhFUiBTVEFOREFSRCBCVUcgREVURUNUT1JTLlxuQSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGluY3VycyBzaWduaWZpY2FudCByZXNvdXJjZSBjb3N0cy4gWW91IG11c3QgT05MWVxuc2V0IE5lZWRzS01TQU49dHJ1ZSBpZiB0aGUgY29kZSBjaGFuZ2VzIGludHJvZHVjZSBvciBleHBvc2UgVU5JTklUSUFMSVpFRCBNRU1PUlkgcmlza3NcbnRoYXQgYXJlIGRldGVjdGVkIE9OTFkgYnkgS01TQU4uXG5cbkxvb2sgaG9saXN0aWNhbGx5IGF0IHRoZSBwYXRjaCBzZXJpZXMgYW5kIHN1cnJvdW5kaW5nIGNvZGUuIEV2ZW4gaWYgbm8gZGlyZWN0XG51bmluaXRpYWxpemVkIGZpZWxkIGFjY2Vzc2VzIG9yIG5ldyBidWZmZXIgYWxsb2NhdGlvbnMgYXJlIGFkZGVkIGluIHRoZSBkaWZmIGl0c2VsZixcbmEgcGF0Y2ggbWF5IGFsdGVyIGNvbnRyb2wgZmxvdywgYm91bmRzIGNoZWNraW5nLCBvciBkYXRhIGxlbmd0aCBjYWxjdWxhdGlvbnMgaW4gd2F5c1xudGhhdCBjaGFuZ2UgaG93IHRoZSByZXN0IG9mIHRoZSBjb2RlIG9wZXJhdGVzIG9uIGV4aXN0aW5nIGJ1ZmZlcnMgKGUuZy4gYWxsb3dpbmdcbnVuaW5pdGlhbGl6ZWQgc3RhY2svaGVhcCBtZW1vcnkgdG8gYmUgcmVhZCwgY29waWVkIHRvIHVzZXIgc3BhY2UsIG9yIHVzZWQgaW4gY29udHJvbFxuZmxvdykuIERvIG5vdCBoZXNpdGF0ZSB0byB1c2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBpbnNwZWN0IHRoZSBzdXJyb3VuZGluZyBjb2RlLFxuY2FsbGVkIGZ1bmN0aW9ucywgYW5kIGNhbGxlcnMuXG5cblNldCBOZWVkc0tNU0FOPXRydWUgT05MWSBJRiB0aGUgcGF0Y2ggaW50cm9kdWNlcyBvciBtb2RpZmllczpcbjEuIEtlcm5lbCBzdHJ1Y3R1cmVzIHNlbnQgdG8gdXNlciBzcGFjZSAodmlhIGNvcHlfdG9fdXNlciwgcHV0X3VzZXIsIG5ldGxpbmsgc2tiXG4gICBhdHRyaWJ1dGVzLCBpb2N0bCBvdXRwdXQgYXJndW1lbnRzLCBzb2NrZXQgb3B0aW9ucywgb3IgQlBGIGJ1ZmZlcnMpIHdoZXJlIGZpZWxkc1xuICAgb3Igc3RydWN0dXJlIHBhZGRpbmcgbWlnaHQgbm90IGJlIGZ1bGx5IGluaXRpYWxpemVkL3plcm9lZC5cbjIuIENvbmRpdGlvbmFsIGxvZ2ljIG9yIGJyYW5jaGluZyB0aGF0IGRlcGVuZHMgb24gcG90ZW50aWFsbHkgdW5pbml0aWFsaXplZCB2YXJpYWJsZXNcbiAgIG9yIHN0cnVjdCBmaWVsZHMuXG4zLiBBbGxvY2F0aW9uIG9yIGluaXRpYWxpemF0aW9uIG9mIGNvbXBsZXggZGF0YSBzdHJ1Y3R1cmVzIHdoZXJlIHVuaW5pdGlhbGl6ZWQgZmllbGRzXG4gICBjb3VsZCBiZSByZWFkIGxhdGVyIGluIHJlYWNoYWJsZSBjb2RlIHBhdGhzLlxuNC4gQm91bmRzIGNoZWNrcywgbGVuZ3Rocywgb3IgbG9naWMgaW4gYSB3YXkgdGhhdCBhbGxvd3Mgc3Vycm91bmRpbmcgY29kZSB0byBhY2Nlc3NcbiAgIHVuaW5pdGlhbGl6ZWQgYnl0ZXMgb2YgZXhpc3RpbmcgYnVmZmVycy5cblxuU2V0IE5lZWRzS01TQU49ZmFsc2UgSUY6XG4tIFRoZSBjb2RlIGNoYW5nZXMgcHJpbWFyaWx5IHJpc2sgb3V0LW9mLWJvdW5kcyBhY2Nlc3MsIGFycmF5IG92ZXJmbG93cywgTlVMTCBwb2ludGVyXG4gIGRlcmVmZXJlbmNlcywgbG9ja2luZyBkZWFkbG9ja3MsIG9yIHVzZS1hZnRlci1mcmVlIGJ1Z3MgKHRoZXNlIGFyZSBhbHJlYWR5IGNhdWdodFxuICBieSBLQVNBTiwgTE9DS0RFUCwgb3Igc3RhbmRhcmQgYnVnIGRldGVjdG9ycykuXG4tIEFsbCBzdGFjay9oZWFwIHN0cnVjdHVyZXMgdG91Y2hlZCBvciBpbnRyb2R1Y2VkIGJ5IHRoZSBwYXRjaCBhcmUgZnVsbHkgemVyb2VkXG4gIG9yIGluaXRpYWxpemVkIChlLmcuIHVzaW5nID0gezB9LCBtZW1zZXQsIGt6YWxsb2MpIGJlZm9yZSBiZWluZyByZWFkIG9yIGNvcGllZC5cbi0gVGhlIHBhdGNoIGRvZXMgbm90IGludHJvZHVjZSBhbnkgcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSB1c2FnZSBvciBpbmZvLWxlYWtzLlxuXG5Vc2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBpbnNwZWN0IHRoZSBzdXJyb3VuZGluZyBjb2RlIGlmIG5lY2Vzc2FyeSwgdGhlbiBwcm92aWRlXG5kZXRhaWxlZCBLTVNBTlJlYXNvbmluZyBjb250cmFzdGluZyBLQVNBTiB2cyBLTVNBTiBhcHBsaWNhYmlsaXR5IGZvciB0aGlzIHBhdGNoLlxuUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuXG5cblxuVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy5cbkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LlxuSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLlxuIiwiUHJvbXB0IjoiVGFyZ2V0IGFyY2hpdGVjdHVyZTogYW1kNjRcblxuRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6XG5jb21taXQgMzEzZjU1MjNmMzcwZGRjOTY0YTQ1MDUzZjAwNjBjNGY0ZjhmY2YyOFxuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBNb24gU2VwIDE0IDE0OjM2OjA0IDIwMjYgKzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvZnMvZXh0NC9leHRlbnRzLmMgYi9mcy9leHQ0L2V4dGVudHMuY1xuaW5kZXggNzYwMzhiNmMzNjU1Mi4uZjY1ZDI1NGMwZDVlZSAxMDA2NDRcbi0tLSBhL2ZzL2V4dDQvZXh0ZW50cy5jXG4rKysgYi9mcy9leHQ0L2V4dGVudHMuY1xuQEAgLTYzNjMsMjkgKzYzNjMsMzQgQEAgaW50IGV4dDRfZXh0X2NsZWFyX2JiKHN0cnVjdCBpbm9kZSAqaW5vZGUpXG4gXHRcdG1hcC5tX2xlbiA9IGVuZCAtIGN1cjtcbiBcdFx0cmV0ID0gZXh0NF9tYXBfYmxvY2tzKE5VTEwsIGlub2RlLCBcdTAwMjZtYXAsIDApO1xuIFx0XHRpZiAocmV0IFx1MDAzYyAwKVxuLVx0XHRcdGJyZWFrO1xuK1x0XHRcdGdvdG8gb3V0O1xuIFx0XHRpZiAocmV0IFx1MDAzZSAwKSB7XG4gXHRcdFx0cGF0aCA9IGV4dDRfZmluZF9leHRlbnQoaW5vZGUsIG1hcC5tX2xibGssIHBhdGgsIDApO1xuLVx0XHRcdGlmICghSVNfRVJSKHBhdGgpKSB7XG4tXHRcdFx0XHRmb3IgKGogPSAwOyBqIFx1MDAzYyBwYXRoLVx1MDAzZXBfZGVwdGg7IGorKykge1xuLVx0XHRcdFx0XHRleHQ0X21iX21hcmtfYmIoaW5vZGUtXHUwMDNlaV9zYixcbi1cdFx0XHRcdFx0XHRcdHBhdGhbal0ucF9ibG9jaywgMSwgZmFsc2UpO1xuLVx0XHRcdFx0XHRleHQ0X2ZjX3JlY29yZF9yZWdpb25zKGlub2RlLVx1MDAzZWlfc2IsIGlub2RlLVx1MDAzZWlfaW5vLFxuLVx0XHRcdFx0XHRcdFx0MCwgcGF0aFtqXS5wX2Jsb2NrLCAxLCAxKTtcbi1cdFx0XHRcdH1cbi1cdFx0XHR9IGVsc2Uge1xuLVx0XHRcdFx0cGF0aCA9IE5VTEw7XG4rXHRcdFx0aWYgKElTX0VSUihwYXRoKSkge1xuK1x0XHRcdFx0cmV0ID0gUFRSX0VSUihwYXRoKTtcbitcdFx0XHRcdGdvdG8gb3V0O1xuK1x0XHRcdH1cbitcdFx0XHRmb3IgKGogPSAwOyBqIFx1MDAzYyBwYXRoLVx1MDAzZXBfZGVwdGg7IGorKykge1xuK1x0XHRcdFx0ZXh0NF9tYl9tYXJrX2JiKGlub2RlLVx1MDAzZWlfc2IsXG4rXHRcdFx0XHRcdFx0cGF0aFtqXS5wX2Jsb2NrLCAxLCBmYWxzZSk7XG4rXHRcdFx0XHRyZXQgPSBleHQ0X2ZjX3JlY29yZF9yZWdpb25zKGlub2RlLVx1MDAzZWlfc2IsXG4rXHRcdFx0XHRcdFx0XHQgICAgIGlub2RlLVx1MDAzZWlfaW5vLCAwLFxuK1x0XHRcdFx0XHRcdFx0ICAgICBwYXRoW2pdLnBfYmxvY2ssIDEsIDEpO1xuK1x0XHRcdFx0aWYgKHJldClcbitcdFx0XHRcdFx0Z290byBvdXQ7XG4gXHRcdFx0fVxuIFx0XHRcdGV4dDRfbWJfbWFya19iYihpbm9kZS1cdTAwM2VpX3NiLCBtYXAubV9wYmxrLCBtYXAubV9sZW4sIGZhbHNlKTtcbi1cdFx0XHRleHQ0X2ZjX3JlY29yZF9yZWdpb25zKGlub2RlLVx1MDAzZWlfc2IsIGlub2RlLVx1MDAzZWlfaW5vLFxuLVx0XHRcdFx0XHRtYXAubV9sYmxrLCBtYXAubV9wYmxrLCBtYXAubV9sZW4sIDEpO1xuK1x0XHRcdHJldCA9IGV4dDRfZmNfcmVjb3JkX3JlZ2lvbnMoaW5vZGUtXHUwMDNlaV9zYiwgaW5vZGUtXHUwMDNlaV9pbm8sXG4rXHRcdFx0XHRcdFx0ICAgICBtYXAubV9sYmxrLCBtYXAubV9wYmxrLCBtYXAubV9sZW4sIDEpO1xuK1x0XHRcdGlmIChyZXQpXG4rXHRcdFx0XHRnb3RvIG91dDtcbiBcdFx0fVxuIFx0XHRjdXIgPSBjdXIgKyBtYXAubV9sZW47XG4gXHR9XG4gXG4gb3V0OlxuIFx0ZXh0NF9mcmVlX2V4dF9wYXRoKHBhdGgpO1xuLVx0cmV0dXJuIDA7XG4rXHRyZXR1cm4gcmV0IFx1MDAzYyAwID8gcmV0IDogMDtcbiB9XG4gXG4gI2lmIElTX0VOQUJMRUQoQ09ORklHX0VYVDRfS1VOSVRfVEVTVFMpXG5kaWZmIC0tZ2l0IGEvZnMvZXh0NC9mYXN0X2NvbW1pdC5jIGIvZnMvZXh0NC9mYXN0X2NvbW1pdC5jXG5pbmRleCAwY2FjODkwY2YzNzAyLi5hYjcyNjNiNGY5ZTQ2IDEwMDY0NFxuLS0tIGEvZnMvZXh0NC9mYXN0X2NvbW1pdC5jXG4rKysgYi9mcy9leHQ0L2Zhc3RfY29tbWl0LmNcbkBAIC0xOTQxLDggKzE5NDEsMTEgQEAgc3RhdGljIGludCBleHQ0X2ZjX3JlcGxheV9pbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLFxuIFxuIFx0aW5vZGUgPSBleHQ0X2lnZXQoc2IsIGlubywgRVhUNF9JR0VUX05PUk1BTCk7XG4gXHRpZiAoIUlTX0VSUihpbm9kZSkpIHtcbi1cdFx0ZXh0NF9leHRfY2xlYXJfYmIoaW5vZGUpO1xuK1x0XHRyZXQgPSBleHQ0X2V4dF9jbGVhcl9iYihpbm9kZSk7XG4gXHRcdGlwdXQoaW5vZGUpO1xuK1x0XHRpbm9kZSA9IE5VTEw7XG4rXHRcdGlmIChyZXQpXG4rXHRcdFx0Z290byBvdXQ7XG4gXHR9XG4gXHRpbm9kZSA9IE5VTEw7XG4gXG4iLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xNFQxNDo0MjowMS4zMzA4NjU5NjJaIiwiU2VxIjozNCwiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjgtZmxhc2giLCJEdXJhdGlvbiI6MTA0NTQ1MzM3OTQ0LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyB0aGUgQ29kZSBDaGFuZ2VzKipcblxuT2theSwgbGV0J3MgZGl2ZSBpbnRvIHRoaXMuIEZpcnN0LCBJIG5lZWQgdG8gdW5kZXJzdGFuZCB3aGF0IHRoaXMgZGlmZiBpcyBhY3R1YWxseSBkb2luZy4gSXQgbG9va3MgbGlrZSB0aGUgY29yZSBvZiB0aGUgY2hhbmdlcyBhcmUgY2VudGVyZWQgYXJvdW5kIGBmcy9leHQ0L2V4dGVudHMuY2AsIHNwZWNpZmljYWxseSBgZXh0NF9leHRfY2xlYXJfYmJgLCBhbmQgYWxzbyB0b3VjaGVzIGBmcy9leHQ0L2Zhc3RfY29tbWl0LmNgIHdpdGggdGhlIGBleHQ0X2ZjX3JlcGxheV9pbm9kZWAgZnVuY3Rpb24uIEludGVyZXN0aW5nLCBzbyB3ZSdyZSBsb29raW5nIGF0IGV4dGVudCBoYW5kbGluZyBhbmQgcG90ZW50aWFsbHkgZmFzdCBjb21taXQgZnVuY3Rpb25hbGl0eS5cblxuTm93LCBJJ2xsIHVzZSB0aGUgYHJlYWQtZmlsZWAgY29tbWFuZCB0byBwdWxsIHVwIHRoZSByZWxldmFudCBwYXJ0cyBvZiB0aGUgYGV4dGVudHMuY2AgZmlsZSBhbmQgc3BlY2lmaWNhbGx5IGZvY3VzIG9uIHRoZSBhcmVhIGFyb3VuZCBgZXh0NF9leHRfY2xlYXJfYmJgLiBVbmRlcnN0YW5kaW5nIHRoZSBjb250ZXh0IG9mIHRoYXQgZnVuY3Rpb24gaXMga2V5LCBhcyBpcyB0aGUgcm9sZSBvZiBgZXh0NF9mY19yZXBsYXlfaW5vZGVgIGluIGBmYXN0X2NvbW1pdC5jYC4gQ29udGV4dCBpcyBldmVyeXRoaW5nLCBzbyBzZWVpbmcgdGhlIHN1cnJvdW5kaW5nIGNvZGUgd2lsbCBsaWtlbHkgYmUgY3J1Y2lhbCB0byBkZXRlcm1pbmUgdGhlIG5hdHVyZSBvZiB0aGlzIHBhdGNoIGFuZCBpdHMgcG90ZW50aWFsIGltcGxpY2F0aW9ucy4gSSBuZWVkIHRvIHF1aWNrbHkgZ3Jhc3AgdGhlIGludGVyYWN0aW9uIGJldHdlZW4gdGhlc2UgdHdvIGZ1bmN0aW9ucyBhbmQgd2hhdCB0aGlzIGNoYW5nZSBpcyB0cnlpbmcgdG8gYWNoaWV2ZS4gTGV0J3MgZ2V0IHJlYWRpbmcuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjI4MzgsIk91dHB1dFRva2VucyI6MzgsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxMjMsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xNFQxNDo0Mzo0NS44NzYyMDc5NDZaIiwiU2VxIjozNSwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MzUzNjUwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcImZzL2V4dDQvZXh0ZW50cy5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDYzNDAsXG4gIFwiTGluZUNvdW50XCI6IDcwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIjYzNDA6XFx0e1xcbjYzNDE6XFx0XFx0c3RydWN0IGV4dDRfZXh0X3BhdGggKnBhdGggPSBOVUxMO1xcbjYzNDI6XFx0XFx0c3RydWN0IGV4dDRfZXh0ZW50ICpleDtcXG42MzQzOlxcdFxcdGV4dDRfbGJsa190IGN1ciA9IDAsIGVuZDtcXG42MzQ0OlxcdFxcdGludCBqLCByZXQgPSAwO1xcbjYzNDU6XFx0XFx0c3RydWN0IGV4dDRfbWFwX2Jsb2NrcyBtYXA7XFxuNjM0NjpcXHRcXG42MzQ3OlxcdFxcdGlmIChleHQ0X3Rlc3RfaW5vZGVfZmxhZyhpbm9kZSwgRVhUNF9JTk9ERV9JTkxJTkVfREFUQSkpXFxuNjM0ODpcXHRcXHRcXHRyZXR1cm4gMDtcXG42MzQ5OlxcdFxcbjYzNTA6XFx0XFx0LyogRGV0ZXJtaW4gdGhlIHNpemUgb2YgdGhlIGZpbGUgZmlyc3QgKi9cXG42MzUxOlxcdFxcdHBhdGggPSBleHQ0X2ZpbmRfZXh0ZW50KGlub2RlLCBFWFRfTUFYX0JMT0NLUyAtIDEsIE5VTEwsXFxuNjM1MjpcXHRcXHRcXHRcXHRcXHRcXHRFWFQ0X0VYX05PQ0FDSEUpO1xcbjYzNTM6XFx0XFx0aWYgKElTX0VSUihwYXRoKSlcXG42MzU0OlxcdFxcdFxcdHJldHVybiBQVFJfRVJSKHBhdGgpO1xcbjYzNTU6XFx0XFx0ZXggPSBwYXRoW3BhdGgtXFx1MDAzZXBfZGVwdGhdLnBfZXh0O1xcbjYzNTY6XFx0XFx0aWYgKCFleClcXG42MzU3OlxcdFxcdFxcdGdvdG8gb3V0O1xcbjYzNTg6XFx0XFx0ZW5kID0gbGUzMl90b19jcHUoZXgtXFx1MDAzZWVlX2Jsb2NrKSArIGV4dDRfZXh0X2dldF9hY3R1YWxfbGVuKGV4KTtcXG42MzU5OlxcdFxcbjYzNjA6XFx0XFx0Y3VyID0gMDtcXG42MzYxOlxcdFxcdHdoaWxlIChjdXIgXFx1MDAzYyBlbmQpIHtcXG42MzYyOlxcdFxcdFxcdG1hcC5tX2xibGsgPSBjdXI7XFxuNjM2MzpcXHRcXHRcXHRtYXAubV9sZW4gPSBlbmQgLSBjdXI7XFxuNjM2NDpcXHRcXHRcXHRyZXQgPSBleHQ0X21hcF9ibG9ja3MoTlVMTCwgaW5vZGUsIFxcdTAwMjZtYXAsIDApO1xcbjYzNjU6XFx0XFx0XFx0aWYgKHJldCBcXHUwMDNjIDApXFxuNjM2NjpcXHRcXHRcXHRcXHRnb3RvIG91dDtcXG42MzY3OlxcdFxcdFxcdGlmIChyZXQgXFx1MDAzZSAwKSB7XFxuNjM2ODpcXHRcXHRcXHRcXHRwYXRoID0gZXh0NF9maW5kX2V4dGVudChpbm9kZSwgbWFwLm1fbGJsaywgcGF0aCwgMCk7XFxuNjM2OTpcXHRcXHRcXHRcXHRpZiAoSVNfRVJSKHBhdGgpKSB7XFxuNjM3MDpcXHRcXHRcXHRcXHRcXHRyZXQgPSBQVFJfRVJSKHBhdGgpO1xcbjYzNzE6XFx0XFx0XFx0XFx0XFx0Z290byBvdXQ7XFxuNjM3MjpcXHRcXHRcXHRcXHR9XFxuNjM3MzpcXHRcXHRcXHRcXHRmb3IgKGogPSAwOyBqIFxcdTAwM2MgcGF0aC1cXHUwMDNlcF9kZXB0aDsgaisrKSB7XFxuNjM3NDpcXHRcXHRcXHRcXHRcXHRleHQ0X21iX21hcmtfYmIoaW5vZGUtXFx1MDAzZWlfc2IsXFxuNjM3NTpcXHRcXHRcXHRcXHRcXHRcXHRcXHRwYXRoW2pdLnBfYmxvY2ssIDEsIGZhbHNlKTtcXG42Mzc2OlxcdFxcdFxcdFxcdFxcdHJldCA9IGV4dDRfZmNfcmVjb3JkX3JlZ2lvbnMoaW5vZGUtXFx1MDAzZWlfc2IsXFxuNjM3NzpcXHRcXHRcXHRcXHRcXHRcXHRcXHRcXHQgICAgIGlub2RlLVxcdTAwM2VpX2lubywgMCxcXG42Mzc4OlxcdFxcdFxcdFxcdFxcdFxcdFxcdFxcdCAgICAgcGF0aFtqXS5wX2Jsb2NrLCAxLCAxKTtcXG42Mzc5OlxcdFxcdFxcdFxcdFxcdGlmIChyZXQpXFxuNjM4MDpcXHRcXHRcXHRcXHRcXHRcXHRnb3RvIG91dDtcXG42MzgxOlxcdFxcdFxcdFxcdH1cXG42MzgyOlxcdFxcdFxcdFxcdGV4dDRfbWJfbWFya19iYihpbm9kZS1cXHUwMDNlaV9zYiwgbWFwLm1fcGJsaywgbWFwLm1fbGVuLCBmYWxzZSk7XFxuNjM4MzpcXHRcXHRcXHRcXHRyZXQgPSBleHQ0X2ZjX3JlY29yZF9yZWdpb25zKGlub2RlLVxcdTAwM2VpX3NiLCBpbm9kZS1cXHUwMDNlaV9pbm8sXFxuNjM4NDpcXHRcXHRcXHRcXHRcXHRcXHRcXHQgICAgIG1hcC5tX2xibGssIG1hcC5tX3BibGssIG1hcC5tX2xlbiwgMSk7XFxuNjM4NTpcXHRcXHRcXHRcXHRpZiAocmV0KVxcbjYzODY6XFx0XFx0XFx0XFx0XFx0Z290byBvdXQ7XFxuNjM4NzpcXHRcXHRcXHR9XFxuNjM4ODpcXHRcXHRcXHRjdXIgPSBjdXIgKyBtYXAubV9sZW47XFxuNjM4OTpcXHRcXHR9XFxuNjM5MDpcXHRcXG42MzkxOlxcdG91dDpcXG42MzkyOlxcdFxcdGV4dDRfZnJlZV9leHRfcGF0aChwYXRoKTtcXG42MzkzOlxcdFxcdHJldHVybiByZXQgXFx1MDAzYyAwID8gcmV0IDogMDtcXG42Mzk0OlxcdH1cXG42Mzk1OlxcdFxcbjYzOTY6XFx0I2lmIElTX0VOQUJMRUQoQ09ORklHX0VYVDRfS1VOSVRfVEVTVFMpXFxuNjM5NzpcXHRpbnQgZXh0NF9leHRfc3BhY2Vfcm9vdF9pZHhfdGVzdChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgY2hlY2spXFxuNjM5ODpcXHR7XFxuNjM5OTpcXHRcXHRyZXR1cm4gZXh0NF9leHRfc3BhY2Vfcm9vdF9pZHgoaW5vZGUsIGNoZWNrKTtcXG42NDAwOlxcdH1cXG42NDAxOlxcdEVYUE9SVF9TWU1CT0xfRk9SX0VYVDRfVEVTVChleHQ0X2V4dF9zcGFjZV9yb290X2lkeF90ZXN0KTtcXG42NDAyOlxcdFxcbjY0MDM6XFx0c3RydWN0IGV4dDRfZXh0X3BhdGggKmV4dDRfc3BsaXRfY29udmVydF9leHRlbnRzX3Rlc3QoaGFuZGxlX3QgKmhhbmRsZSxcXG42NDA0OlxcdFxcdFxcdFxcdHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBleHQ0X21hcF9ibG9ja3MgKm1hcCxcXG42NDA1OlxcdFxcdFxcdFxcdHN0cnVjdCBleHQ0X2V4dF9wYXRoICpwYXRoLCBpbnQgZmxhZ3MsXFxuNjQwNjpcXHRcXHRcXHRcXHR1bnNpZ25lZCBpbnQgKmFsbG9jYXRlZClcXG42NDA3OlxcdHtcXG42NDA4OlxcdFxcdHJldHVybiBleHQ0X3NwbGl0X2NvbnZlcnRfZXh0ZW50cyhoYW5kbGUsIGlub2RlLCBtYXAsIHBhdGgsXFxuNjQwOTpcXHRcXHRcXHRcXHRcXHRcXHQgIGZsYWdzLCBhbGxvY2F0ZWQpO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xNFQxNDo0Mzo0NS44NzY1NjgyODZaIiwiU2VxIjozNiwiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjgtZmxhc2giLCJEdXJhdGlvbiI6MzU2Nzk1OTAzMDEsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSBzdW1tYXJ5LCBhcyBpZiBJIHdlcmUgdGhpbmtpbmcgdGhlc2UgdGhvdWdodHM6XG5cbioqRXhhbWluaW5nIGBmcy9leHQ0L2Zhc3RfY29tbWl0LmNgIGZvciBDbHVlcyoqXG5cbk9rYXksIEknbSBkaXZpbmcgaW50byB0aGlzIGlzc3VlLCBhbmQgYSBjcnVjaWFsIGFyZWEgdG8gaW52ZXN0aWdhdGUgZnVydGhlciBpcyBsaWtlbHkgYGZzL2V4dDQvZmFzdF9jb21taXQuY2AuIFNwZWNpZmljYWxseSwgbGluZSAxOTQxIGFuZCBhcm91bmQgdGhlcmUgc2VlbXMgbGlrZSBhIHBvdGVudGlhbCBob3RzcG90LiBHaXZlbiB0aGUgbmF0dXJlIG9mIHRoZSBwcm9ibGVtLCBJIHN1c3BlY3QgdGhlIGZhc3QgY29tbWl0IGxvZ2ljIG1pZ2h0IGJlIGludm9sdmVkLiBNeSBoeXBvdGhlc2lzIGlzIHRoYXQgc29tZXRoaW5nIHdpdGhpbiB0aGF0IHBhcnRpY3VsYXIgc2VjdGlvbiBjb3VsZCBiZSBjb250cmlidXRpbmcgdG8gdGhlIG9ic2VydmVkIGJlaGF2aW9yLCBzbyBsZXQncyBjYXJlZnVsbHkgcmV2aWV3IHRoZSBzdXJyb3VuZGluZyBjb2RlIGZvciBjbHVlcy4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhlIGludGVyYWN0aW9ucyBhcm91bmQgdGhhdCBwb2ludCB0byBzZWUgaWYgdGhlcmUncyBhIGNvbmN1cnJlbmN5IGlzc3VlLCBhIHJhY2UgY29uZGl0aW9uLCBvciBhIHN1YnRsZSBidWcgcmVsYXRlZCB0byBkYXRhIHN5bmNocm9uaXphdGlvbi5cblxuXG4iLCJJbnB1dFRva2VucyI6NDQyMSwiT3V0cHV0VG9rZW5zIjozOSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjI1LCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMTRUMTQ6NDQ6MjEuNTU2MTYxOTA3WiIsIlNlcSI6MzcsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjEyNzg3MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJmcy9leHQ0L2Zhc3RfY29tbWl0LmNcIixcbiAgXCJGaXJzdExpbmVcIjogMTkzMCxcbiAgXCJMaW5lQ291bnRcIjogNDBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiMTkzMDpcXHRcXHRzdHJ1Y3QgZXh0NF9pbm9kZSAqcmF3X2ZjX2lub2RlO1xcbjE5MzE6XFx0XFx0c3RydWN0IGlub2RlICppbm9kZSA9IE5VTEw7XFxuMTkzMjpcXHRcXHRzdHJ1Y3QgZXh0NF9pbG9jIGlsb2M7XFxuMTkzMzpcXHRcXHRpbnQgaW5vZGVfbGVuLCBpbm8sIHJldCwgdGFnID0gdGwtXFx1MDAzZWZjX3RhZztcXG4xOTM0OlxcdFxcdHN0cnVjdCBleHQ0X2V4dGVudF9oZWFkZXIgKmVoO1xcbjE5MzU6XFx0XFx0c2l6ZV90IG9mZl9nZW4gPSBvZmZzZXRvZihzdHJ1Y3QgZXh0NF9pbm9kZSwgaV9nZW5lcmF0aW9uKTtcXG4xOTM2OlxcdFxcbjE5Mzc6XFx0XFx0bWVtY3B5KFxcdTAwMjZmY19pbm9kZSwgdmFsLCBzaXplb2YoZmNfaW5vZGUpKTtcXG4xOTM4OlxcdFxcbjE5Mzk6XFx0XFx0aW5vID0gbGUzMl90b19jcHUoZmNfaW5vZGUuZmNfaW5vKTtcXG4xOTQwOlxcdFxcdHRyYWNlX2V4dDRfZmNfcmVwbGF5KHNiLCB0YWcsIGlubywgMCwgMCk7XFxuMTk0MTpcXHRcXG4xOTQyOlxcdFxcdGlub2RlID0gZXh0NF9pZ2V0KHNiLCBpbm8sIEVYVDRfSUdFVF9OT1JNQUwpO1xcbjE5NDM6XFx0XFx0aWYgKCFJU19FUlIoaW5vZGUpKSB7XFxuMTk0NDpcXHRcXHRcXHRyZXQgPSBleHQ0X2V4dF9jbGVhcl9iYihpbm9kZSk7XFxuMTk0NTpcXHRcXHRcXHRpcHV0KGlub2RlKTtcXG4xOTQ2OlxcdFxcdFxcdGlub2RlID0gTlVMTDtcXG4xOTQ3OlxcdFxcdFxcdGlmIChyZXQpXFxuMTk0ODpcXHRcXHRcXHRcXHRnb3RvIG91dDtcXG4xOTQ5OlxcdFxcdH1cXG4xOTUwOlxcdFxcdGlub2RlID0gTlVMTDtcXG4xOTUxOlxcdFxcbjE5NTI6XFx0XFx0cmV0ID0gZXh0NF9mY19yZWNvcmRfbW9kaWZpZWRfaW5vZGUoc2IsIGlubyk7XFxuMTk1MzpcXHRcXHRpZiAocmV0KVxcbjE5NTQ6XFx0XFx0XFx0Z290byBvdXQ7XFxuMTk1NTpcXHRcXG4xOTU2OlxcdFxcdHJhd19mY19pbm9kZSA9IChzdHJ1Y3QgZXh0NF9pbm9kZSAqKVxcbjE5NTc6XFx0XFx0XFx0KHZhbCArIG9mZnNldG9mKHN0cnVjdCBleHQ0X2ZjX2lub2RlLCBmY19yYXdfaW5vZGUpKTtcXG4xOTU4OlxcdFxcdHJldCA9IGV4dDRfZ2V0X2ZjX2lub2RlX2xvYyhzYiwgaW5vLCBcXHUwMDI2aWxvYyk7XFxuMTk1OTpcXHRcXHRpZiAocmV0KVxcbjE5NjA6XFx0XFx0XFx0Z290byBvdXQ7XFxuMTk2MTpcXHRcXG4xOTYyOlxcdFxcdGlub2RlX2xlbiA9IHRsLVxcdTAwM2VmY19sZW4gLSBzaXplb2Yoc3RydWN0IGV4dDRfZmNfaW5vZGUpO1xcbjE5NjM6XFx0XFx0cmF3X2lub2RlID0gZXh0NF9yYXdfaW5vZGUoXFx1MDAyNmlsb2MpO1xcbjE5NjQ6XFx0XFxuMTk2NTpcXHRcXHRtZW1jcHkocmF3X2lub2RlLCByYXdfZmNfaW5vZGUsIG9mZnNldG9mKHN0cnVjdCBleHQ0X2lub2RlLCBpX2Jsb2NrKSk7XFxuMTk2NjpcXHRcXHRtZW1jcHkoKHU4ICopcmF3X2lub2RlICsgb2ZmX2dlbiwgKHU4ICopcmF3X2ZjX2lub2RlICsgb2ZmX2dlbixcXG4xOTY3OlxcdFxcdCAgICAgICBpbm9kZV9sZW4gLSBvZmZfZ2VuKTtcXG4xOTY4OlxcdFxcdGlmIChsZTMyX3RvX2NwdShyYXdfaW5vZGUtXFx1MDAzZWlfZmxhZ3MpIFxcdTAwMjYgRVhUNF9FWFRFTlRTX0ZMKSB7XFxuMTk2OTpcXHRcXHRcXHRlaCA9IChzdHJ1Y3QgZXh0NF9leHRlbnRfaGVhZGVyICopKFxcdTAwMjZyYXdfaW5vZGUtXFx1MDAzZWlfYmxvY2tbMF0pO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xNFQxNDo0NDoyMS41NTYyOTE5MTdaIiwiU2VxIjozOCwiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjgtZmxhc2giLCJEdXJhdGlvbiI6NzY1MzQwNzk2MywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgdGhlIEZpeCBmb3IgUG90ZW50aWFsIFVuaW5pdGlhbGl6ZWQgTWVtb3J5IElzc3VlcyoqXG5cbk9rYXksIGxldCdzIGJyZWFrIHRoaXMgZG93bi4gRmlyc3QsIEkgbmVlZCB0byB1bmRlcnN0YW5kIHdoYXQgdGhlIG9yaWdpbmFsIHByb2JsZW0gd2FzIGFuZCBob3cgdGhlIHBhdGNoIGFkZHJlc3NlcyBpdC4gVGhlIG9yaWdpbmFsIGNvZGUgaW4gYGV4dDRfZXh0X2NsZWFyX2JiYCBoYWQgYSBmZXcgZmxhd3MuIFRoZSBgZXh0NF9maW5kX2V4dGVudGAgZnVuY3Rpb24gY291bGQgZmFpbCwgcmV0dXJuaW5nIGFuIGVycm9yIChgSVNfRVJSKHBhdGgpYCksIGJ1dCB0aGUgY29kZSB3b3VsZCB0aGVuIGJsaXRoZWx5IGNvbnRpbnVlLCBwb3RlbnRpYWxseSBsZWFkaW5nIHRvIGluY29ycmVjdCBibG9jayBtYXJraW5nIGFuZCByZXBvcnRpbmcuIENydWNpYWxseSwgZXJyb3JzIGZyb20gYGV4dDRfZmNfcmVjb3JkX3JlZ2lvbnNgIHdlcmUgYWxzbyBpZ25vcmVkLCBhbmQgdGhlIGZ1bmN0aW9uIGFsd2F5cyByZXR1cm5lZCAwLCBldmVuIHdoZW4gc2VyaW91cyBmYWlsdXJlcyBvY2N1cnJlZCBlYXJsaWVyLiBUaGUgbGluZSBgaWYgKElTX0VSUihwYXRoKSkgcmV0dXJuIFBUUl9FUlIocGF0aCk7YCBzZWVtZWQgdG8gdHJ5IHRvIHJldHVybiBhbiBlcnJvciwgYnV0IGl0IHdhcyBmb2xsb3dlZCBieSBhIGByZXR1cm4gMDtgLCB0aHVzIGJlaW5nIHVzZWxlc3MuIFRoZSBjYWxsaW5nIGZ1bmN0aW9uLCBgZXh0NF9mY19yZXBsYXlfaW5vZGVgLCBjb21wb3VuZGVkIHRoZSBpc3N1ZSBieSBpZ25vcmluZyB0aGUgcmV0dXJuIHZhbHVlIG9mIGBleHQ0X2V4dF9jbGVhcl9iYmAuXG5cbk5vdywgdGhlIHBhdGNoIGFpbXMgdG8gZml4IHRoZXNlIHByb2JsZW1zIGJ5IGludHJvZHVjaW5nIHByb3BlciBlcnJvciBoYW5kbGluZy4gSWYgYGV4dDRfbWFwX2Jsb2Nrc2AgZmFpbHMsIGl0IGBnb3RvIG91dDtgLiBJZiBgZXh0NF9maW5kX2V4dGVudGAgZmFpbHMsIHRoZSBwYXRjaCBzZXRzIGByZXRgIGFuZCBgZ290byBvdXQ7YCwgYW5kIGltcG9ydGFudGx5LCB0aGUgcGF0Y2ggYWRkcyBjaGVja3MgYWZ0ZXIgYGV4dDRfZmNfcmVjb3JkX3JlZ2lvbnNgLiBGaW5hbGx5LCB0aGUgcGF0Y2ggY2hlY2tzIHRoZSByZXR1cm4gdmFsdWUgYW5kIHJldHVybnMgdGhlIG5lZ2F0aXZlIGVycm9yLiBUaGUgY2hhbmdlIGluIGBleHQ0X2ZjX3JlcGxheV9pbm9kZWAgbm93IGNvcnJlY3RseSBjaGVja3MgdGhlIHJldHVybiB2YWx1ZSBvZiBgZXh0NF9leHRfY2xlYXJfYmJgIGFuZCBleGl0cyBpZiBpdCdzIG5vbi16ZXJvLlxuXG5UaGUgY29yZSBxdWVzdGlvbiBub3cgaXMgd2hldGhlciB0aGVzZSBjaGFuZ2VzIGludHJvZHVjZSBvciBleHBvc2UgdW5pbml0aWFsaXplZCBtZW1vcnkgcmlza3MuIExldCdzIHJlZmVyIHRvIHRoZSBLTVNBTiBydWxlcy4gVGhlIHJ1bGUgc3BlY2lmaWNhbGx5IHN0YXRlcyB0aGF0IEtNU0FOIHNob3VsZCBiZSB1c2VkIGlmIHRoZSBjb2RlIGNoYW5nZXMgbWlnaHQgcmV2ZWFsIG9yIGNyZWF0ZSB1bmluaXRpYWxpemVkIG1lbW9yeSByaXNrcyB0aGF0IGNhbm5vdCBiZSBjYXVnaHQgYnkgb3RoZXIgc3RhbmRhcmQgYnVnIGRldGVjdG9ycyBsaWtlIEtBU0FOIG9yIExPQ0tERVAuIFdlJ3JlIGxvb2tpbmcgZm9yIGNvZGUgdGhhdDogMSkgc2VuZHMgdW5pbml0aWFsaXplZCBrZXJuZWwgc3RydWN0dXJlcyB0byB1c2Vyc3BhY2U7IDIpIGNvbmRpdGlvbmFsIGxvZ2ljIGJhc2VkIG9uIHBvdGVudGlhbGx5IHVuaW5pdGlhbGl6ZWQgdmFyaWFibGVzOyAzKSBhbGxvY2F0aW9uL2luaXRpYWxpemF0aW9uIG9mIGNvbXBsZXggZGF0YSBzdHJ1Y3R1cmVzIHdpdGggbGF0ZXIgcG90ZW50aWFsIGZvciByZWFkaW5nIHVuaW5pdGlhbGl6ZWQgZmllbGRzOyBvciA0KSBib3VuZHMgY2hlY2sgaXNzdWVzIHRoYXQgY291bGQgbGVhZCB0byByZWFkaW5nIHVuaW5pdGlhbGl6ZWQgbWVtb3J5LlxuXG5Mb29raW5nIGF0IHRoZSB2YXJpYWJsZXMgd2l0aGluIGBleHQ0X2V4dF9jbGVhcl9iYmAsIGBqYCBhbmQgYHJldGAgYXJlIGluaXRpYWxpemVkLiBUaGUgYHN0cnVjdCBleHQ0X21hcF9ibG9ja3MgbWFwYCBpcyBpbml0aWFsaXplZCBidXQgaXRzIGZpZWxkcyBhcmUgbW9kaWZpZWQgaW4gc3Vic2VxdWVudCBjYWxscy4gTm90YWJseSwgYGV4dDRfbWFwX2Jsb2Nrc2AgaXMgY2FsbGVkIGFuZCBwb3RlbnRpYWxseSB3cml0ZXMgdG8gYG1hcGAncyBmaWVsZHMuIEhvd2V2ZXIsIHRoZSBleGlzdGluZyBjb2RlIGFscmVhZHkgd29ya2VkIHdpdGggdGhpcyBzdHJ1Y3R1cmUuIFRoZSBwYXRjaCBpdHNlbGYgZG9lc24ndCBmdW5kYW1lbnRhbGx5IGNoYW5nZSBob3cgYG1hcGAgaXMgdXNlZDsgaXQgY2hhbmdlcyB0aGUgZXJyb3IgaGFuZGxpbmcgKmFyb3VuZCogaXQuIEluIGBleHQ0X2ZjX3JlcGxheV9pbm9kZWAsIHRoZSBgcmV0YCB2YXJpYWJsZSBpcyBjb3JyZWN0bHkgaGFuZGxlZC4gSW4gdGhlIG9yaWdpbmFsIGNvZGUsIHRoZSByZXR1cm4gdmFsdWUgb2YgYGV4dDRfZXh0X2NsZWFyX2JiYCB3YXMgaWdub3JlZC4gVGhlIHBhdGNoIGRvZXMgbm90IGNoYW5nZSB0aGUgbWVtb3J5IGFsbG9jYXRpb24gb2YgdGhvc2UgdmFyaWFibGVzLiBUaGUgY29kZSBhdCBgb3V0YCB3aWxsIGRlYWwgd2l0aCB0aGUgdmFyaWFibGUgYHBhdGhgLCBidXQgc2luY2UgdGhlIHBhdGNoIGFkZGVkIGVycm9yIGhhbmRsaW5nLCB0aGUgdmFyaWFibGUgYHBhdGhgIGNhbiBiZSBgTlVMTGAuXG5cblNvLCB0aGUgcGF0Y2ggcmVhbGx5IGFkZHJlc3NlcyBhbiBleGlzdGluZyBlcnJvci1oYW5kbGluZyBkZWZpY2llbmN5IGFuZCBpbXByb3ZlcyB0aGUgcmVsaWFiaWxpdHkgb2YgdGhlIGNvZGUuIFdlIGFyZSBub3QgaW50cm9kdWNpbmcgdW5pbml0aWFsaXplZCBtZW1vcnkgcmlza3MuIFRoZSBwYXRjaCBmb2N1c2VzIG9uIGNvcnJlY3QgZXJyb3IgcHJvcGFnYXRpb24gYW5kIGVhcmx5IGV4aXRzLCBwcmV2ZW50aW5nIGZ1cnRoZXIgb3BlcmF0aW9ucyB3aGVuIHNvbWV0aGluZyBnb2VzIHdyb25nLiBUaGVyZWZvcmUsIGJhc2VkIG9uIHRoZSBLTVNBTiBjcml0ZXJpYSwgdGhlcmUncyBubyBldmlkZW5jZSBvZiBhIG5ldyB1bmluaXRpYWxpemVkIG1lbW9yeSBleHBvc3VyZS4gV2UgYXJlIHNhZmUsIGZvciBub3cuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjUzNTcsIk91dHB1dFRva2VucyI6MzksIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxNDM1LCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMTRUMTQ6NDQ6MjkuMjA5NzAyNDJaIiwiU2VxIjozOSwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTM3MDkwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcImZzL2V4dDQvZmFzdF9jb21taXQuY1wiLFxuICBcIkZpcnN0TGluZVwiOiAxOTgwLFxuICBcIkxpbmVDb3VudFwiOiA0MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIxOTgwOlxcdFxcdFxcdFxcdHNpemVvZihyYXdfaW5vZGUtXFx1MDAzZWlfYmxvY2spKTtcXG4xOTgxOlxcdFxcdH1cXG4xOTgyOlxcdFxcbjE5ODM6XFx0XFx0LyogSW1tZWRpYXRlbHkgdXBkYXRlIHRoZSBpbm9kZSBvbiBkaXNrLiAqL1xcbjE5ODQ6XFx0XFx0cmV0ID0gZXh0NF9oYW5kbGVfZGlydHlfbWV0YWRhdGEoTlVMTCwgTlVMTCwgaWxvYy5iaCk7XFxuMTk4NTpcXHRcXHRpZiAocmV0KVxcbjE5ODY6XFx0XFx0XFx0Z290byBvdXRfYnJlbHNlO1xcbjE5ODc6XFx0XFx0cmV0ID0gc3luY19kaXJ0eV9idWZmZXIoaWxvYy5iaCk7XFxuMTk4ODpcXHRcXHRpZiAocmV0KVxcbjE5ODk6XFx0XFx0XFx0Z290byBvdXRfYnJlbHNlO1xcbjE5OTA6XFx0XFx0cmV0ID0gZXh0NF9tYXJrX2lub2RlX3VzZWQoc2IsIGlubyk7XFxuMTk5MTpcXHRcXHRpZiAocmV0KVxcbjE5OTI6XFx0XFx0XFx0Z290byBvdXRfYnJlbHNlO1xcbjE5OTM6XFx0XFxuMTk5NDpcXHRcXHQvKiBHaXZlbiB0aGF0IHdlIGp1c3Qgd3JvdGUgdGhlIGlub2RlIG9uIGRpc2ssIHRoaXMgU0hPVUxEIHN1Y2NlZWQuICovXFxuMTk5NTpcXHRcXHRpbm9kZSA9IGV4dDRfaWdldChzYiwgaW5vLCBFWFQ0X0lHRVRfTk9STUFMKTtcXG4xOTk2OlxcdFxcdGlmIChJU19FUlIoaW5vZGUpKSB7XFxuMTk5NzpcXHRcXHRcXHRleHQ0X2RlYnVnKFxcXCJJbm9kZSBub3QgZm91bmQuXFxcIik7XFxuMTk5ODpcXHRcXHRcXHRpbm9kZSA9IE5VTEw7XFxuMTk5OTpcXHRcXHRcXHRyZXQgPSAtRUZTQ09SUlVQVEVEO1xcbjIwMDA6XFx0XFx0XFx0Z290byBvdXRfYnJlbHNlO1xcbjIwMDE6XFx0XFx0fVxcbjIwMDI6XFx0XFxuMjAwMzpcXHRcXHQvKlxcbjIwMDQ6XFx0XFx0ICogT3VyIGFsbG9jYXRvciBjb3VsZCBoYXZlIG1hZGUgZGlmZmVyZW50IGRlY2lzaW9ucyB0aGFuIGJlZm9yZVxcbjIwMDU6XFx0XFx0ICogY3Jhc2hpbmcuIFRoaXMgc2hvdWxkIGJlIGZpeGVkIGJ1dCB1bnRpbCB0aGVuLCB3ZSBjYWxjdWxhdGVcXG4yMDA2OlxcdFxcdCAqIHRoZSBudW1iZXIgb2YgYmxvY2tzIHRoZSBpbm9kZS5cXG4yMDA3OlxcdFxcdCAqL1xcbjIwMDg6XFx0XFx0aWYgKCFleHQ0X3Rlc3RfaW5vZGVfZmxhZyhpbm9kZSwgRVhUNF9JTk9ERV9JTkxJTkVfREFUQSkpXFxuMjAwOTpcXHRcXHRcXHRleHQ0X2V4dF9yZXBsYXlfc2V0X2libG9ja3MoaW5vZGUpO1xcbjIwMTA6XFx0XFxuMjAxMTpcXHRcXHRpbm9kZS1cXHUwMDNlaV9nZW5lcmF0aW9uID0gbGUzMl90b19jcHUoZXh0NF9yYXdfaW5vZGUoXFx1MDAyNmlsb2MpLVxcdTAwM2VpX2dlbmVyYXRpb24pO1xcbjIwMTI6XFx0XFx0ZXh0NF9yZXNldF9pbm9kZV9zZWVkKGlub2RlKTtcXG4yMDEzOlxcdFxcbjIwMTQ6XFx0XFx0ZXh0NF9pbm9kZV9jc3VtX3NldChpbm9kZSwgZXh0NF9yYXdfaW5vZGUoXFx1MDAyNmlsb2MpLCBFWFQ0X0koaW5vZGUpKTtcXG4yMDE1OlxcdFxcdHJldCA9IGV4dDRfaGFuZGxlX2RpcnR5X21ldGFkYXRhKE5VTEwsIE5VTEwsIGlsb2MuYmgpO1xcbjIwMTY6XFx0XFx0c3luY19kaXJ0eV9idWZmZXIoaWxvYy5iaCk7XFxuMjAxNzpcXHRvdXRfYnJlbHNlOlxcbjIwMTg6XFx0XFx0YnJlbHNlKGlsb2MuYmgpO1xcbjIwMTk6XFx0b3V0OlxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xNFQxNDo0NDoyOS4yMDk4NDE5OVoiLCJTZXEiOjQwLCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuOC1mbGFzaCIsIkR1cmF0aW9uIjo3MTgwMzY3MDY5MSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgdGhlIGBleHQ0X2ZjX3JlcGxheV9pbm9kZWAgQ29kZSoqXG5cbk9rYXksIGxldCdzIGJyZWFrIHRoaXMgZG93bi4gSSdtIGxvb2tpbmcgYXQgdGhlIGBleHQ0X2ZjX3JlcGxheV9pbm9kZWAgZnVuY3Rpb24sIHNwZWNpZmljYWxseSB0aGUgZXhpdCBwb2ludHMuIFRoZSBjb2RlIGhhcyBhIGBnb3RvIG91dDtgIGFuZCBhIGBnb3RvIG91dF9icmVsc2U7YCBsYWJlbC4gVGhlIGBvdXRfYnJlbHNlYCBsYWJlbCBzaW1wbHkgY2FsbHMgYGJyZWxzZShpbG9jLmJoKWAuIFRoZW4sIGluIHRoZSBgb3V0OmAgYmxvY2ssIHdlIGhhdmUgYGlwdXQoaW5vZGUpYCBhbmQgYSBgcmV0dXJuIHJldGAuXG5cbk5vdywgdGhlIGludGVyZXN0aW5nIHBhcnQgaXMgdGhpcyBzZXF1ZW5jZTpcblxuYGBgY1xuXHRcdHJldCA9IGV4dDRfZXh0X2NsZWFyX2JiKGlub2RlKTtcblx0XHRpcHV0KGlub2RlKTtcblx0XHRpbm9kZSA9IE5VTEw7XG5cdFx0aWYgKHJldClcblx0XHRcdGdvdG8gb3V0O1xuYGBgXG5cbkl0IGxvb2tzIGxpa2Ugd2UncmUgY2FsbGluZyBgZXh0NF9leHRfY2xlYXJfYmIoaW5vZGUpYCwgd2hpY2ggY291bGQgcG90ZW50aWFsbHkgZmFpbCwgaW5kaWNhdGVkIGJ5IGByZXRgLiAqQ3J1Y2lhbGx5KiwgdGhlIGNvZGUgdGhlbiBjYWxscyBgaXB1dChpbm9kZSlgLCBzZXRzIGBpbm9kZWAgdG8gYE5VTExgLCAqdGhlbioganVtcHMgdG8gdGhlIGBvdXRgIGxhYmVsIGlmIGByZXRgIGluZGljYXRlcyBhbiBlcnJvci4gVGhlIGtleSB0YWtlYXdheSBoZXJlIGlzIHRoYXQgYGlwdXQoaW5vZGUpYCBpcyBjYWxsZWQgKmJlZm9yZSogYGlub2RlYCBpcyBzZXQgdG8gYE5VTExgIHNvLCBpbiB0aGUgZmFpbHVyZSBjYXNlLCB0aGUgbmV4dCBleGVjdXRpb24gd2lsbCBiZSBgaXB1dChpbm9kZSlgIGFuZCAqdGhlbiogdGhlIGlub2RlIHdpbGwgYmUgc2V0IHRvIGBOVUxMYC4gVGhlIGNvZGUgdGhlbiBzZXRzIHRoZSBpbm9kZSB0byBgTlVMTGAgKmJlZm9yZSogdGhlIGBnb3RvIG91dDtgLiBTbywgYGlwdXQoTlVMTClgIG11c3QgYmUgaGFuZGxlZCBncmFjZWZ1bGx5IOKAkyBpdCdzIGxpa2VseSBhIG5vLW9wLCB3aGljaCBpcyBzdGFuZGFyZCBwcmFjdGljZS4gVGhlIGZ1bmN0aW9uIGlzIGRlc2lnbmVkIHRvIGhhbmRsZSB0aGUgY2FzZSB3aGVyZSBgZXh0NF9leHRfY2xlYXJfYmJgIHJldHVybnMgYW4gZXJyb3IsIGNsZWFuaW5nIHVwIHJlc291cmNlcyBiZWZvcmUgcmV0dXJuaW5nIHRoZSBlcnJvciBjb2RlIGByZXRgLlxuXG5TbywgdGhlIHJldHVybiBpcyBgcmV0YCwgd2hpY2ggc2VlbXMgbG9naWNhbC5cblxuQnV0LCBJJ20gbm90IGNsZWFyIG9uIHRoZSBvcmlnaW5hbCBidWcgdGhhdCBuZWNlc3NpdGF0ZWQgdGhpcyBwYXRjaC4gTGV0J3Mgc2VlIGlmIEkgY2FuIGZpbmQgbW9yZSBjb250ZXh0IHdpdGggYSBgZ2l0IGxvZ2Agc2VhcmNoIG9yIG1heWJlIGNoZWNrIGEgc3l6a2FsbGVyIGlzc3VlLiBLbm93aW5nIHRoZSBvcmlnaW5hbCBpc3N1ZSB3aWxsIHJlYWxseSBwdXQgdGhpcyBpbnRvIHBlcnNwZWN0aXZlLlxuXG5cbiIsIklucHV0VG9rZW5zIjo4MjI2LCJPdXRwdXRUb2tlbnMiOjIyLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTczLCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMTRUMTQ6NDU6NDEuMDEzNTE2MDUxWiIsIlNlcSI6NDEsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNzY3Mzk1NDg3LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImV4dDRfZXh0X2NsZWFyX2JiXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImZzL2V4dDQvZXh0NC5oPTM5NTc9ZXh0ZXJuIGludCBleHQ0X2V4dF9yZXBsYXlfdXBkYXRlX2V4KHN0cnVjdCBpbm9kZSAqaW5vZGUsIGV4dDRfbGJsa190IHN0YXJ0LFxcbmZzL2V4dDQvZXh0NC5oLTM5NTgtXFx0XFx0aW50IGxlbiwgaW50IHVud3JpdHRlbiwgZXh0NF9mc2Jsa190IHBibGspO1xcbmZzL2V4dDQvZXh0NC5oOjM5NTk6ZXh0ZXJuIGludCBleHQ0X2V4dF9jbGVhcl9iYihzdHJ1Y3QgaW5vZGUgKmlub2RlKTtcXG5mcy9leHQ0L2V4dDQuaC0zOTYwLVxcbi0tXFxuZnMvZXh0NC9leHRlbnRzLmM9NjI1Mj1pbnQgZXh0NF9leHRfcmVwbGF5X3NldF9pYmxvY2tzKHN0cnVjdCBpbm9kZSAqaW5vZGUpXFxuLS1cXG5mcy9leHQ0L2V4dGVudHMuYy02MzM4LVxcbmZzL2V4dDQvZXh0ZW50cy5jOjYzMzk6aW50IGV4dDRfZXh0X2NsZWFyX2JiKHN0cnVjdCBpbm9kZSAqaW5vZGUpXFxuZnMvZXh0NC9leHRlbnRzLmMtNjM0MC17XFxuLS1cXG5mcy9leHQ0L2Zhc3RfY29tbWl0LmM9MTkyNT1zdGF0aWMgaW50IGV4dDRfZmNfcmVwbGF5X2lub2RlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsXFxuLS1cXG5mcy9leHQ0L2Zhc3RfY29tbWl0LmMtMTk0My1cXHRpZiAoIUlTX0VSUihpbm9kZSkpIHtcXG5mcy9leHQ0L2Zhc3RfY29tbWl0LmM6MTk0NDpcXHRcXHRyZXQgPSBleHQ0X2V4dF9jbGVhcl9iYihpbm9kZSk7XFxuZnMvZXh0NC9mYXN0X2NvbW1pdC5jLTE5NDUtXFx0XFx0aXB1dChpbm9kZSk7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTE0VDE0OjQ1OjQyLjc4MDkxOTQ2OFoiLCJTZXEiOjQyLCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuOC1mbGFzaCIsIkR1cmF0aW9uIjo5NDc1OTQ2NzA0MywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipNeSBBc3Nlc3NtZW50IG9mIFRoaXMgRXJyb3IgSGFuZGxpbmcgUGF0Y2gqKlxuXG5Pa2F5LCBzbyBJJ3ZlIGJlZW4gcmV2aWV3aW5nIHRoaXMgcGF0Y2gsIGFuZCBoZXJlJ3MgbXkgdW5kZXJzdGFuZGluZzogaXQncyBhbGwgYWJvdXQgdGlnaHRlbmluZyB1cCBlcnJvciBoYW5kbGluZyB3aXRoaW4gdGhlIGV4dDQgZmlsZXN5c3RlbSwgc3BlY2lmaWNhbGx5IGluIHRoZSBmYXN0IGNvbW1pdCByZXBsYXkgbG9naWMuIFByZXZpb3VzbHksIGluIHRoZSBmdW5jdGlvbnMgYGV4dDRfZXh0X2NsZWFyX2JiYCBhbmQgaXRzIGNhbGxlciBgZXh0NF9mY19yZXBsYXlfaW5vZGVgLCBpZiBgZXh0NF9maW5kX2V4dGVudGAgZmFpbGVkLCBpdCBjb3VsZCBsZWFkIHRvIHNvbWUgcHJldHR5IG1lc3N5IGJlaGF2aW9yLiBXZSB3ZXJlIHNlZWluZyBgSVNfRVJSKHBhdGgpYCBjb21lIHVwLCBidXQgdGhlbiB0aGUgY29kZSB3YXMgYmxpbmRseSBzZXR0aW5nIGBwYXRoYCB0byBgTlVMTGAgYW5kIGNvbnRpbnVpbmcgb24sIHBvdGVudGlhbGx5IGNhbGxpbmcgb3RoZXIgZnVuY3Rpb25zIChgZXh0NF9tYl9tYXJrX2JiYCwgYGV4dDRfZmNfcmVjb3JkX3JlZ2lvbnNgKSBhbmQgY29tcGxldGVseSBpZ25vcmluZyBhbnkgZXJyb3JzIHRoYXQgdGhvc2UgZnVuY3Rpb25zIHRocmV3LiBUaGVuLCBpdCB3b3VsZCBqdXN0IHJldHVybiAwLCB3aGljaCBpcyB0b3RhbGx5IG1pc2xlYWRpbmcuXG5cblRoaXMgcGF0Y2gsIHRoYW5rZnVsbHksIHN0cmFpZ2h0ZW5zIGFsbCBvZiB0aGF0IG91dC4gTm93LCBlcnJvciBjb2RlcyBmcm9tIGBleHQ0X21hcF9ibG9ja3NgLCBgZXh0NF9maW5kX2V4dGVudGAsIGFuZCBgZXh0NF9mY19yZWNvcmRfcmVnaW9uc2AgYXJlIGNvcnJlY3RseSBwcm9wYWdhdGVkIGFuZCByZXR1cm5lZCB1cCB0aGUgY2FsbCBzdGFjay4gQ3JpdGljYWxseSwgYGV4dDRfZmNfcmVwbGF5X2lub2RlYCBub3cgYWJvcnRzIHRoZSByZXBsYXkgcHJvY2VzcyBpZiAqYW55KiBvZiB0aGVzZSBmdW5jdGlvbnMgZmFpbC5cblxuTm93LCB0aGUgaW1wb3J0YW50IHF1ZXN0aW9uOiBkb2VzIHRoaXMgcmVxdWlyZSBLTVNBTj8gQWZ0ZXIgYSB0aG9yb3VnaCBsb29rLCBJJ20gY29uZmlkZW50IHRoZSBhbnN3ZXIgaXMgbm8uIFRoZXJlIGFyZSBubyB1bmluaXRpYWxpemVkIG1lbW9yeSBpc3N1ZXMgaGVyZS4gTm90aGluZyBpcyBjb3BpZWQgdG8gdXNlciBzcGFjZSwgbm8gbmV3IHVuaW5pdGlhbGl6ZWQgdmFyaWFibGVzIGFyZSBiZWluZyBhY2Nlc3NlZCBvciByZWFkLCBgcmV0YCBpcyBpbml0aWFsaXplZCBiZWZvcmUgYmVpbmcgdXNlZCwgYW5kIGBwYXRoYCBpcyBwcm9wZXJseSBjaGVja2VkIGZvciBlcnJvcnMuIFRoZXJlJ3Mgbm8gcmlzayBvZiBtZW1vcnkgbGVha3Mgb3IgaW5mb3JtYXRpb24gbGVha3MuIFRoaXMgaXMgcHVyZWx5IGVycm9yIHByb3BhZ2F0aW9uIHdpdGhpbiB0aGUgZXh0NCBmYXN0IGNvbW1pdCByZXBsYXkgbG9naWMuXG5cblRoZXJlZm9yZSwgS01TQU4gaXNuJ3QgbmVjZXNzYXJ5LiBTdGFuZGFyZCBLQVNBTiBhbmQgc3RhbmRhcmQgZXJyb3IgdGVzdGluZyBzaG91bGQgYmUgc3VmZmljaWVudCBmb3IgZW5zdXJpbmcgdGhpcyBjaGFuZ2UgaXMgc291bmQuXG5cbkFscmlnaHQsIGxldCdzIGRvdWJsZSBjaGVjayBldmVyeXRoaW5nIGFuZCBmb3JtYWxpemUgdGhlIHJlc3BvbnNlOlxuXG4qICAgYE5lZWRzS01TQU5gOiBmYWxzZS5cbiogICBgS01TQU5SZWFzb25pbmdgOiBUaGUgcGF0Y2ggaW1wcm92ZXMgZXJyb3IgaGFuZGxpbmcgYW5kIHByb3BhZ2F0aW9uIGluIGBleHQ0X2V4dF9jbGVhcl9iYigpYCBhbmQgaXRzIGNhbGxlciBgZXh0NF9mY19yZXBsYXlfaW5vZGUoKWAuIEtNU0FOIGlzIG5vdCBhcHBsaWNhYmxlIGJlY2F1c2UgdGhlIHBhdGNoIGRvZXNuJ3QgaW50cm9kdWNlIGFueSB1bmluaXRpYWxpemVkIHZhcmlhYmxlcywgcGFkZGluZyBpc3N1ZXMsIG9yIGNvcHkgYW55IGRhdGEgdG8gdXNlcnNwYWNlLCBvciBicmFuY2ggb24gdW5pbml0aWFsaXplZCBkYXRhLiBTdGFuZGFyZCBLQVNBTiBhbmQgZXJyb3IgZGV0ZWN0b3JzIGFyZSBzdWZmaWNpZW50LlxuXG5SZWFkeSB0byBjYWxsIGBzZXQtcmVzdWx0c2AuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjkyMjIsIk91dHB1dFRva2VucyI6MjI2LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MzkzLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTE0VDE0OjQ3OjE3LjU0MDM4OTM2MVoiLCJTZXEiOjQzLCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJzZXQtcmVzdWx0cyIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE1NjIwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggaW1wcm92ZXMgZXJyb3IgaGFuZGxpbmcgaW4gZXh0NCBmYXN0IGNvbW1pdCByZXBsYXkgY29kZSAoZnMvZXh0NC9leHRlbnRzLmMgYW5kIGZzL2V4dDQvZmFzdF9jb21taXQuYykuIFNwZWNpZmljYWxseSwgZXh0NF9leHRfY2xlYXJfYmIoKSBub3cgcHJvcGVybHkgcHJvcGFnYXRlcyBlcnJvciByZXR1cm4gY29kZXMgZnJvbSBleHQ0X21hcF9ibG9ja3MoKSwgZXh0NF9maW5kX2V4dGVudCgpLCBhbmQgZXh0NF9mY19yZWNvcmRfcmVnaW9ucygpLCByYXRoZXIgdGhhbiBpZ25vcmluZyBlcnJvcnMgYW5kIHVuY29uZGl0aW9uYWxseSByZXR1cm5pbmcgMC4gQWRkaXRpb25hbGx5LCBleHQ0X2ZjX3JlcGxheV9pbm9kZSgpIG5vdyBjaGVja3MgdGhlIHJldHVybiB2YWx1ZSBvZiBleHQ0X2V4dF9jbGVhcl9iYigpIGFuZCBhYm9ydHMgb24gZXJyb3IuXFxuXFxuVGhlcmUgYXJlIG5vIHVuaW5pdGlhbGl6ZWQgdmFyaWFibGVzIG9yIHN0cnVjdCBmaWVsZHMgaW50cm9kdWNlZCBvciBtb2RpZmllZCwgbm8gY29waWVzIHRvIHVzZXIgc3BhY2Ugb3IgcG90ZW50aWFsIGluZm8tbGVha3MsIGFuZCBubyBicmFuY2hpbmcgb24gdW5pbml0aWFsaXplZCBtZW1vcnkuIEFsbCB2YXJpYWJsZXMgaW52b2x2ZWQgKGUuZy4gcmV0LCBwYXRoKSBhcmUgcHJvcGVybHkgaW5pdGlhbGl6ZWQgYmVmb3JlIHVzZS4gQ29uc2VxdWVudGx5LCB0aGlzIGNoYW5nZSBkb2VzIG5vdCBleHBvc2UgYW55IHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJpc2tzIGRldGVjdGFibGUgYnkgS01TQU4uIFN0YW5kYXJkIEtBU0FOIGZ1enppbmcgYW5kIHRlc3Qgc3VpdGVzIGFyZSBmdWxseSBhZGVxdWF0ZS5cIixcbiAgXCJOZWVkc0tNU0FOXCI6IGZhbHNlXG59IiwiUmVzdWx0cyI6IntcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBpbXByb3ZlcyBlcnJvciBoYW5kbGluZyBpbiBleHQ0IGZhc3QgY29tbWl0IHJlcGxheSBjb2RlIChmcy9leHQ0L2V4dGVudHMuYyBhbmQgZnMvZXh0NC9mYXN0X2NvbW1pdC5jKS4gU3BlY2lmaWNhbGx5LCBleHQ0X2V4dF9jbGVhcl9iYigpIG5vdyBwcm9wZXJseSBwcm9wYWdhdGVzIGVycm9yIHJldHVybiBjb2RlcyBmcm9tIGV4dDRfbWFwX2Jsb2NrcygpLCBleHQ0X2ZpbmRfZXh0ZW50KCksIGFuZCBleHQ0X2ZjX3JlY29yZF9yZWdpb25zKCksIHJhdGhlciB0aGFuIGlnbm9yaW5nIGVycm9ycyBhbmQgdW5jb25kaXRpb25hbGx5IHJldHVybmluZyAwLiBBZGRpdGlvbmFsbHksIGV4dDRfZmNfcmVwbGF5X2lub2RlKCkgbm93IGNoZWNrcyB0aGUgcmV0dXJuIHZhbHVlIG9mIGV4dDRfZXh0X2NsZWFyX2JiKCkgYW5kIGFib3J0cyBvbiBlcnJvci5cXG5cXG5UaGVyZSBhcmUgbm8gdW5pbml0aWFsaXplZCB2YXJpYWJsZXMgb3Igc3RydWN0IGZpZWxkcyBpbnRyb2R1Y2VkIG9yIG1vZGlmaWVkLCBubyBjb3BpZXMgdG8gdXNlciBzcGFjZSBvciBwb3RlbnRpYWwgaW5mby1sZWFrcywgYW5kIG5vIGJyYW5jaGluZyBvbiB1bmluaXRpYWxpemVkIG1lbW9yeS4gQWxsIHZhcmlhYmxlcyBpbnZvbHZlZCAoZS5nLiByZXQsIHBhdGgpIGFyZSBwcm9wZXJseSBpbml0aWFsaXplZCBiZWZvcmUgdXNlLiBDb25zZXF1ZW50bHksIHRoaXMgY2hhbmdlIGRvZXMgbm90IGV4cG9zZSBhbnkgdW5pbml0aWFsaXplZCBtZW1vcnkgcmlza3MgZGV0ZWN0YWJsZSBieSBLTVNBTi4gU3RhbmRhcmQgS0FTQU4gZnV6emluZyBhbmQgdGVzdCBzdWl0ZXMgYXJlIGZ1bGx5IGFkZXF1YXRlLlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2Vcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfV07CgkJCWlmICghcmF3RGF0YSB8fCByYXdEYXRhLmxlbmd0aCA9PT0gMCkgcmV0dXJuOwoKCQkJZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSk7CgkJCWRyYXdEdXJhdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCQlkcmF3VG9rZW5Db25zdW1wdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSkgewoJCQljb25zdCBzdGF0cyA9IHsKCQkJCWxsbTogeyBjb3VudDogMCwgdG9rZW5zOiAwLCBkdXJhdGlvbjogMCB9LAoJCQkJdG9vbDogeyBjb3VudDogMCwgZHVyYXRpb246IDAgfQoJCQl9OwoKCQkJcmF3RGF0YS5mb3JFYWNoKHMgPT4gewoJCQkJY29uc3QgZHVyID0gcy5EdXJhdGlvbiAvIDEwMDAwMDAwMDA7IAoJCQkJaWYgKHMuVHlwZSA9PT0gImxsbSIpIHsKCQkJCQlzdGF0cy5sbG0uY291bnQrKzsKCQkJCQlzdGF0cy5sbG0udG9rZW5zICs9IChzLklucHV0VG9rZW5zICsgcy5PdXRwdXRUb2tlbnMgKyBzLk91dHB1dFRob3VnaHRzVG9rZW5zKTsKCQkJCQlzdGF0cy5sbG0uZHVyYXRpb24gKz0gZHVyOwoJCQkJfSBlbHNlIGlmIChzLlR5cGUgPT09ICJ0b29sIikgewoJCQkJCXN0YXRzLnRvb2wuY291bnQrKzsKCQkJCQlzdGF0cy50b29sLmR1cmF0aW9uICs9IGR1cjsKCQkJCX0KCQkJfSk7CgoJCQljb25zdCBhdmdMbG1EdXIgPSBzdGF0cy5sbG0uY291bnQgPiAwID8gKHN0YXRzLmxsbS5kdXJhdGlvbiAvIHN0YXRzLmxsbS5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgkJCWNvbnN0IGF2Z0xsbVRva2VuID0gc3RhdHMubGxtLmNvdW50ID4gMCA/IChzdGF0cy5sbG0udG9rZW5zIC8gc3RhdHMubGxtLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCQkJY29uc3QgYXZnVG9vbER1ciA9IHN0YXRzLnRvb2wuY291bnQgPiAwID8gKHN0YXRzLnRvb2wuZHVyYXRpb24gLyBzdGF0cy50b29sLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCgkJCWNvbnN0IGxsbVN1bWFyeUNlbGxzID0gW3N0YXRzLmxsbS5jb3VudCwgc3RhdHMubGxtLnRva2VucywgYXZnTGxtVG9rZW4sIHN0YXRzLmxsbS5kdXJhdGlvbiwgYXZnTGxtRHVyXTsKCQkJY29uc3QgdG9vbFN1bW1hcnlDZWxscyA9IFtzdGF0cy50b29sLmNvdW50LCBzdGF0cy50b29sLmR1cmF0aW9uLCBhdmdUb29sRHVyXTsKCgkJCWNvbnN0IGxsbVN1bW1hcnlCb2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xsbV9zdW1tYXJ5X3N0YXRzX2JvZHknKTsKCQkJbGxtU3VtbWFyeUJvZHkuaW5uZXJIVE1MID0gIiI7CgkJCWNvbnN0IGxsbVRyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndHInKTsKCQkJbGxtU3VtYXJ5Q2VsbHMuZm9yRWFjaChjZWxsID0+IHsKCQkJCWNvbnN0IHRkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTsKCQkJCXRkLnRleHRDb250ZW50ID0gY2VsbDsKCQkJCWxsbVRyLmFwcGVuZENoaWxkKHRkKTsKCQkJfSk7CgkJCWxsbVN1bW1hcnlCb2R5LmFwcGVuZENoaWxkKGxsbVRyKTsKCgkJCWNvbnN0IHRvb2xTdW1tYXJ5Qm9keSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b29sX3N1bW1hcnlfc3RhdHNfYm9keScpOwoJCQl0b29sU3VtbWFyeUJvZHkuaW5uZXJIVE1MID0gIiI7CgkJCWNvbnN0IHRvb2xUciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RyJyk7CgkJCXRvb2xTdW1tYXJ5Q2VsbHMuZm9yRWFjaChjZWxsID0+IHsKCQkJCWNvbnN0IHRkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTsKCQkJCXRkLnRleHRDb250ZW50ID0gY2VsbDsKCQkJCXRvb2xUci5hcHBlbmRDaGlsZCh0ZCk7CgkJCX0pOwoJCQl0b29sU3VtbWFyeUJvZHkuYXBwZW5kQ2hpbGQodG9vbFRyKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdEdXJhdGlvbkNoYXJ0KHJhd0RhdGEpIHsKCQkJY29uc3QgZmlsdGVyZWRTdGVwcyA9IHJhd0RhdGEuZmlsdGVyKGQgPT4gWyJsbG0iLCAidG9vbCJdLmluY2x1ZGVzKGQuVHlwZSkpOwoJCQljb25zdCBkYXRhID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkRhdGFUYWJsZSgpOwoJCQlkYXRhLmFkZENvbHVtbignc3RyaW5nJywgJ1N0ZXAnKTsKCQkJZGF0YS5hZGRDb2x1bW4oJ251bWJlcicsICdEdXJhdGlvbicpOwoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICd0b29sdGlwJ30pOyAKCgkJCWZpbHRlcmVkU3RlcHMuZm9yRWFjaChzID0+IHsKCQkJCQoJCQkJY29uc3QgZHVyID0gcy5EdXJhdGlvbiAvIDEwMDAwMDAwMDA7CgkJCQlsZXQgdG9vbHRpcCA9IHMuTmFtZTsKCQkJCWlmIChzLlR5cGUgPT09ICJsbG0iICYmIHMuVG9vbENhbGxzICYmIHMuVG9vbENhbGxzLmxlbmd0aCA+IDApIHsKCQkJCQl0b29sdGlwICs9IGBcblRvb2xzOiAke3MuVG9vbENhbGxzLmpvaW4oJywgJyl9YDsKCQkJCX0KCQkJCWRhdGEuYWRkUm93KFtgJHtzLlNlcX1gLCBkdXIsIHRvb2x0aXBdKTsKCQkJfSk7CgoJCQljb25zdCBvcHRpb25zID0gewoJCQkJdGl0bGU6ICdUaW1lIENvbnN1bXB0aW9uIG9mIExMTS9Ub29sIENhbGxzJywKCQkJCWhBeGlzOiB7CgkJCQkJdGl0bGU6ICdMTE0vVG9vbCBTdGVwcycsCgkJCQl9LAoJCQkJdkF4aXM6IHsgdGl0bGU6ICdTZWNvbmRzJyB9LAoJCQkJbGVnZW5kOiB7IHBvc2l0aW9uOiAnbm9uZScgfSwKCQkJCWJhcjogeyBncm91cFdpZHRoOiAnNzUlJyB9LAoJCQkJY2hhcnRBcmVhOiB7IHdpZHRoOiAnODUlJywgaGVpZ2h0OiAnNzAlJyB9LAoJCQkJaGVpZ2h0OiA0MDAKCQkJfTsKCgkJCWNvbnN0IGNoYXJ0ID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkNvbHVtbkNoYXJ0KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkdXJhdGlvbl9jaGFydF9kaXYnKSk7CgkJCWNoYXJ0LmRyYXcoZGF0YSwgb3B0aW9ucyk7CgkJfQoKCQlmdW5jdGlvbiBkcmF3VG9rZW5Db25zdW1wdGlvbkNoYXJ0KHJhd0RhdGEpIHsKCQkJY29uc3QgbGxtU3RlcHMgPSByYXdEYXRhLmZpbHRlcihkID0+IGQuVHlwZSA9PT0gImxsbSIpOwoJCQlpZiAobGxtU3RlcHMubGVuZ3RoID09PSAwKSByZXR1cm47CgoJCQljb25zdCBkYXRhID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkRhdGFUYWJsZSgpOwoJCQlkYXRhLmFkZENvbHVtbignc3RyaW5nJywgJ1N0ZXAnKTsJCQkKCQkJZGF0YS5hZGRDb2x1bW4oJ251bWJlcicsICdUb2tlbnMnKTsJCQkKCQkJZGF0YS5hZGRDb2x1bW4oe3R5cGU6ICdzdHJpbmcnLCByb2xlOiAnc3R5bGUnfSk7CQoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICd0b29sdGlwJ30pOwkKCgkJCWNvbnN0IGFnZW50Q29sb3JzID0ge307CgkJCWNvbnN0IHBhbGV0dGUgPSBbJyM0Mjg1RjQnLCAnI0RCNDQzNycsICcjRjRCNDAwJywgJyMwRjlENTgnLCAnI0FCNDdCQycsICcjMDBBQ0MxJ107CgkJCWxldCBjb2xvcklkeCA9IDA7CgkJCWNvbnN0IGFnZW50TExNQ291bnRzID0ge307CgkJCWxsbVN0ZXBzLmZvckVhY2gocyA9PiB7CgkJCQlpZiAoIWFnZW50Q29sb3JzW3MuTmFtZV0pIHsKCQkJCQlhZ2VudENvbG9yc1tzLk5hbWVdID0gcGFsZXR0ZVtjb2xvcklkeCAlIHBhbGV0dGUubGVuZ3RoXTsKCQkJCQljb2xvcklkeCsrOwoJCQkJfQoKCQkJCWFnZW50TExNQ291bnRzW3MuTmFtZV0gPSAoYWdlbnRMTE1Db3VudHNbcy5OYW1lXSB8fCAwKSArIDE7CgkJCQljb25zdCBsYWJlbCA9IGAke3MuTmFtZX0tJHthZ2VudExMTUNvdW50c1tzLk5hbWVdfWA7CgkJCQljb25zdCB0b3RhbFRva2VucyA9IHMuSW5wdXRUb2tlbnMgKyBzLk91dHB1dFRva2VucyArIHMuT3V0cHV0VGhvdWdodHNUb2tlbnM7CgkJCQljb25zdCBzdHlsZSA9IGBjb2xvcjogJHthZ2VudENvbG9yc1tzLk5hbWVdfWA7CgkJCQlsZXQgdG9vbHRpcCA9IGBUb3RhbCBUb2tlbnM6ICR7dG90YWxUb2tlbnN9XG4oSW46ICR7cy5JbnB1dFRva2Vuc30sIE91dDogJHtzLk91dHB1dFRva2Vuc30sIFRob3VnaHRzOiAke3MuT3V0cHV0VGhvdWdodHNUb2tlbnN9KWA7CgkJCQlpZiAocy5Ub29sQ2FsbHMgJiYgcy5Ub29sQ2FsbHMubGVuZ3RoID4gMCkgewoJCQkJCXRvb2x0aXAgKz0gYFxuVG9vbHM6ICR7cy5Ub29sQ2FsbHMuam9pbignLCAnKX1gOwoJCQkJfQoKCQkJCWRhdGEuYWRkUm93KFtsYWJlbCwgdG90YWxUb2tlbnMsIHN0eWxlLCB0b29sdGlwXSk7CgkJCX0pOwoKCQkJY29uc3Qgb3B0aW9ucyA9IHsKCQkJCXRpdGxlOiAnVG9rZW4gQ29uc3VtcHRpb24gYnkgTExNIENhbGxzJywKCQkJCWhBeGlzOiB7CgkJCQkJdGl0bGU6ICdMTE0gQ2FsbCBTZXF1ZW5jZScsCgkJCQl9LAoJCQkJdkF4aXM6IHsgdGl0bGU6ICdDb25zdW1lZCBUb2tlbnMnIH0sCgkJCQlsZWdlbmQ6IHsgcG9zaXRpb246ICdub25lJyB9LAoJCQkJYmFyOiB7IGdyb3VwV2lkdGg6ICc3NSUnIH0sCgkJCQljaGFydEFyZWE6IHsgd2lkdGg6ICc4NSUnLCBoZWlnaHQ6ICc3MCUnIH0sCgkJCQloZWlnaHQ6IDQwMAoJCQl9OwoKCQkJY29uc3QgY2hhcnQgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uQ29sdW1uQ2hhcnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rva2VuX2NoYXJ0X2RpdicpKTsKCQkJY2hhcnQuZHJhdyhkYXRhLCBvcHRpb25zKTsKCQl9CgkJbGV0IGFsbEV4cGFuZGVkID0gZmFsc2U7CgkJZnVuY3Rpb24gdG9nZ2xlQWxsRGV0YWlscygpIHsKCQkJYWxsRXhwYW5kZWQgPSAhYWxsRXhwYW5kZWQ7CgkJCWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2RldGFpbHMnKS5mb3JFYWNoKGQgPT4gewoJCQkJaWYgKGFsbEV4cGFuZGVkKSBkLnNldEF0dHJpYnV0ZSgnb3BlbicsICcnKTsKCQkJCWVsc2UgZC5yZW1vdmVBdHRyaWJ1dGUoJ29wZW4nKTsKCQkJfSk7CgkJfQoJPC9zY3JpcHQ+CgoKPC9ib2R5Pgo8L2h0bWw+Cg==" },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:nil,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,} --------- Name: series-workflow5g9lk[1] Phase: Succeeded StartedAt: 2026-09-14 14:47:28 +0000 UTC FinishedAt: 2026-09-14 14:47:28 +0000 UTC Input: nil Output: nil --------- Name: series-workflow5g9lk[1].abort-on-skip-outcome Phase: Skipped StartedAt: 2026-09-14 14:47:28 +0000 UTC FinishedAt: 2026-09-14 14:47:28 +0000 UTC Input: nil Output: nil --------- Name: series-workflow5g9lk[2] Phase: Succeeded StartedAt: 2026-09-14 14:47:28 +0000 UTC FinishedAt: 2026-09-14 19:18:31 +0000 UTC Input: nil Output: nil --------- Name: series-workflow5g9lk[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"68142f986ff04b2b70b31db00f719bf690f64a9a","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"base_commit":"68142f986ff04b2b70b31db00f719bf690f64a9a","base_tree":"linux-next","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["ext4_ext_clear_bb","ext4_fc_replay_inode","ext4_fc_replay"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"68142f986ff04b2b70b31db00f719bf690f64a9a","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"473faa75-ef75-448c-ba20-22fab9b37077","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN) Phase: Succeeded StartedAt: 2026-09-14 14:47:28 +0000 UTC FinishedAt: 2026-09-14 19:18:31 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:element,Default:nil,Value:*{"base":{"arch":"amd64","commit_hash":"68142f986ff04b2b70b31db00f719bf690f64a9a","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},"fuzz":{"base_commit":"68142f986ff04b2b70b31db00f719bf690f64a9a","base_tree":"linux-next","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["ext4_ext_clear_bb","ext4_fc_replay_inode","ext4_fc_replay"],"skip_cover_check":false},"patched":{"arch":"amd64","commit_hash":"68142f986ff04b2b70b31db00f719bf690f64a9a","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"473faa75-ef75-448c-ba20-22fab9b37077","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},"retest":null,"track":"KASAN"},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: nil --------- Name: series-workflow5g9lk[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"68142f986ff04b2b70b31db00f719bf690f64a9a","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"base_commit":"68142f986ff04b2b70b31db00f719bf690f64a9a","base_tree":"linux-next","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["ext4_ext_clear_bb","ext4_fc_replay_inode","ext4_fc_replay"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"68142f986ff04b2b70b31db00f719bf690f64a9a","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"473faa75-ef75-448c-ba20-22fab9b37077","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[0] Phase: Succeeded StartedAt: 2026-09-14 14:47:28 +0000 UTC FinishedAt: 2026-09-14 14:47:38 +0000 UTC Input: nil Output: nil --------- Name: series-workflow5g9lk[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"68142f986ff04b2b70b31db00f719bf690f64a9a","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"base_commit":"68142f986ff04b2b70b31db00f719bf690f64a9a","base_tree":"linux-next","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["ext4_ext_clear_bb","ext4_fc_replay_inode","ext4_fc_replay"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"68142f986ff04b2b70b31db00f719bf690f64a9a","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"473faa75-ef75-448c-ba20-22fab9b37077","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[0].save-base-req Phase: Succeeded StartedAt: 2026-09-14 14:47:28 +0000 UTC FinishedAt: 2026-09-14 14:47:32 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"arch":"amd64","commit_hash":"68142f986ff04b2b70b31db00f719bf690f64a9a","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: &Outputs{Parameters:[]Parameter{},Artifacts:[]Artifact{Artifact{Name:artifact,Path:/tmp/artifact,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflow5g9lk/series-workflow5g9lk-convert-artifact-1797782360/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflow5g9lk[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"68142f986ff04b2b70b31db00f719bf690f64a9a","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"base_commit":"68142f986ff04b2b70b31db00f719bf690f64a9a","base_tree":"linux-next","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["ext4_ext_clear_bb","ext4_fc_replay_inode","ext4_fc_replay"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"68142f986ff04b2b70b31db00f719bf690f64a9a","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"473faa75-ef75-448c-ba20-22fab9b37077","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[1] Phase: Succeeded StartedAt: 2026-09-14 14:47:38 +0000 UTC FinishedAt: 2026-09-14 15:03:45 +0000 UTC Input: nil Output: nil --------- Name: series-workflow5g9lk[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"68142f986ff04b2b70b31db00f719bf690f64a9a","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"base_commit":"68142f986ff04b2b70b31db00f719bf690f64a9a","base_tree":"linux-next","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["ext4_ext_clear_bb","ext4_fc_replay_inode","ext4_fc_replay"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"68142f986ff04b2b70b31db00f719bf690f64a9a","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"473faa75-ef75-448c-ba20-22fab9b37077","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[1].base-build Phase: Succeeded StartedAt: 2026-09-14 14:47:38 +0000 UTC FinishedAt: 2026-09-14 15:03:45 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:findings,Default:nil,Value:*false,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:test-name,Default:nil,Value:*[KASAN] Build Base,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:smoke-build,Default:nil,Value:*false,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:session-id,Default:nil,Value:*f7c935ac-1fe1-440f-b16f-321fa103e47c,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-workflow5g9lk/series-workflow5g9lk-convert-artifact-1797782360/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": "8913bebb-a2e8-435a-bc1d-579936cf8825", "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-workflow5g9lk/series-workflow5g9lk-build-action-722768782/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflow5g9lk[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"68142f986ff04b2b70b31db00f719bf690f64a9a","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"base_commit":"68142f986ff04b2b70b31db00f719bf690f64a9a","base_tree":"linux-next","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["ext4_ext_clear_bb","ext4_fc_replay_inode","ext4_fc_replay"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"68142f986ff04b2b70b31db00f719bf690f64a9a","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"473faa75-ef75-448c-ba20-22fab9b37077","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[1].base-build(0) Phase: Succeeded StartedAt: 2026-09-14 14:47:38 +0000 UTC FinishedAt: 2026-09-14 15:03:35 +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:*f7c935ac-1fe1-440f-b16f-321fa103e47c,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-workflow5g9lk/series-workflow5g9lk-convert-artifact-1797782360/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": "8913bebb-a2e8-435a-bc1d-579936cf8825", "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-workflow5g9lk/series-workflow5g9lk-build-action-722768782/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflow5g9lk[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"68142f986ff04b2b70b31db00f719bf690f64a9a","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"base_commit":"68142f986ff04b2b70b31db00f719bf690f64a9a","base_tree":"linux-next","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["ext4_ext_clear_bb","ext4_fc_replay_inode","ext4_fc_replay"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"68142f986ff04b2b70b31db00f719bf690f64a9a","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"473faa75-ef75-448c-ba20-22fab9b37077","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[2] Phase: Succeeded StartedAt: 2026-09-14 15:03:45 +0000 UTC FinishedAt: 2026-09-14 15:03:45 +0000 UTC Input: nil Output: nil --------- Name: series-workflow5g9lk[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"68142f986ff04b2b70b31db00f719bf690f64a9a","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"base_commit":"68142f986ff04b2b70b31db00f719bf690f64a9a","base_tree":"linux-next","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["ext4_ext_clear_bb","ext4_fc_replay_inode","ext4_fc_replay"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"68142f986ff04b2b70b31db00f719bf690f64a9a","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"473faa75-ef75-448c-ba20-22fab9b37077","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[2].abort-if-base-build-failed Phase: Skipped StartedAt: 2026-09-14 15:03:45 +0000 UTC FinishedAt: 2026-09-14 15:03:45 +0000 UTC Input: nil Output: nil --------- Name: series-workflow5g9lk[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"68142f986ff04b2b70b31db00f719bf690f64a9a","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"base_commit":"68142f986ff04b2b70b31db00f719bf690f64a9a","base_tree":"linux-next","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["ext4_ext_clear_bb","ext4_fc_replay_inode","ext4_fc_replay"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"68142f986ff04b2b70b31db00f719bf690f64a9a","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"473faa75-ef75-448c-ba20-22fab9b37077","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[3] Phase: Succeeded StartedAt: 2026-09-14 15:03:45 +0000 UTC FinishedAt: 2026-09-14 15:03:56 +0000 UTC Input: nil Output: nil --------- Name: series-workflow5g9lk[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"68142f986ff04b2b70b31db00f719bf690f64a9a","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"base_commit":"68142f986ff04b2b70b31db00f719bf690f64a9a","base_tree":"linux-next","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["ext4_ext_clear_bb","ext4_fc_replay_inode","ext4_fc_replay"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"68142f986ff04b2b70b31db00f719bf690f64a9a","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"473faa75-ef75-448c-ba20-22fab9b37077","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[3].save-patched-req Phase: Succeeded StartedAt: 2026-09-14 15:03:45 +0000 UTC FinishedAt: 2026-09-14 15:03:50 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"arch":"amd64","commit_hash":"68142f986ff04b2b70b31db00f719bf690f64a9a","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"473faa75-ef75-448c-ba20-22fab9b37077","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: &Outputs{Parameters:[]Parameter{},Artifacts:[]Artifact{Artifact{Name:artifact,Path:/tmp/artifact,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflow5g9lk/series-workflow5g9lk-convert-artifact-51101375/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflow5g9lk[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"68142f986ff04b2b70b31db00f719bf690f64a9a","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"base_commit":"68142f986ff04b2b70b31db00f719bf690f64a9a","base_tree":"linux-next","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["ext4_ext_clear_bb","ext4_fc_replay_inode","ext4_fc_replay"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"68142f986ff04b2b70b31db00f719bf690f64a9a","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"473faa75-ef75-448c-ba20-22fab9b37077","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[4] Phase: Succeeded StartedAt: 2026-09-14 15:03:56 +0000 UTC FinishedAt: 2026-09-14 15:05:49 +0000 UTC Input: nil Output: nil --------- Name: series-workflow5g9lk[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"68142f986ff04b2b70b31db00f719bf690f64a9a","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"base_commit":"68142f986ff04b2b70b31db00f719bf690f64a9a","base_tree":"linux-next","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["ext4_ext_clear_bb","ext4_fc_replay_inode","ext4_fc_replay"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"68142f986ff04b2b70b31db00f719bf690f64a9a","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"473faa75-ef75-448c-ba20-22fab9b37077","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[4].boot-test-base Phase: Succeeded StartedAt: 2026-09-14 15:03:56 +0000 UTC FinishedAt: 2026-09-14 15:05:39 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*8913bebb-a2e8-435a-bc1d-579936cf8825,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-workflow5g9lk/series-workflow5g9lk-build-action-722768782/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-workflow5g9lk[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"68142f986ff04b2b70b31db00f719bf690f64a9a","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"base_commit":"68142f986ff04b2b70b31db00f719bf690f64a9a","base_tree":"linux-next","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["ext4_ext_clear_bb","ext4_fc_replay_inode","ext4_fc_replay"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"68142f986ff04b2b70b31db00f719bf690f64a9a","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"473faa75-ef75-448c-ba20-22fab9b37077","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[5] Phase: Succeeded StartedAt: 2026-09-14 15:05:49 +0000 UTC FinishedAt: 2026-09-14 15:05:49 +0000 UTC Input: nil Output: nil --------- Name: series-workflow5g9lk[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"68142f986ff04b2b70b31db00f719bf690f64a9a","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"base_commit":"68142f986ff04b2b70b31db00f719bf690f64a9a","base_tree":"linux-next","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["ext4_ext_clear_bb","ext4_fc_replay_inode","ext4_fc_replay"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"68142f986ff04b2b70b31db00f719bf690f64a9a","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"473faa75-ef75-448c-ba20-22fab9b37077","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[5].abort-if-base-boot-failed Phase: Skipped StartedAt: 2026-09-14 15:05:49 +0000 UTC FinishedAt: 2026-09-14 15:05:49 +0000 UTC Input: nil Output: nil --------- Name: series-workflow5g9lk[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"68142f986ff04b2b70b31db00f719bf690f64a9a","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"base_commit":"68142f986ff04b2b70b31db00f719bf690f64a9a","base_tree":"linux-next","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["ext4_ext_clear_bb","ext4_fc_replay_inode","ext4_fc_replay"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"68142f986ff04b2b70b31db00f719bf690f64a9a","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"473faa75-ef75-448c-ba20-22fab9b37077","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[6] Phase: Succeeded StartedAt: 2026-09-14 15:05:49 +0000 UTC FinishedAt: 2026-09-14 15:22:32 +0000 UTC Input: nil Output: nil --------- Name: series-workflow5g9lk[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"68142f986ff04b2b70b31db00f719bf690f64a9a","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"base_commit":"68142f986ff04b2b70b31db00f719bf690f64a9a","base_tree":"linux-next","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["ext4_ext_clear_bb","ext4_fc_replay_inode","ext4_fc_replay"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"68142f986ff04b2b70b31db00f719bf690f64a9a","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"473faa75-ef75-448c-ba20-22fab9b37077","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[6].patched-build Phase: Succeeded StartedAt: 2026-09-14 15:05:49 +0000 UTC FinishedAt: 2026-09-14 15:22:32 +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:*f7c935ac-1fe1-440f-b16f-321fa103e47c,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-workflow5g9lk/series-workflow5g9lk-convert-artifact-51101375/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": "29c499a3-5922-400d-a8b8-f2f6606bb5e9", "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-workflow5g9lk/series-workflow5g9lk-build-action-906085075/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflow5g9lk[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"68142f986ff04b2b70b31db00f719bf690f64a9a","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"base_commit":"68142f986ff04b2b70b31db00f719bf690f64a9a","base_tree":"linux-next","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["ext4_ext_clear_bb","ext4_fc_replay_inode","ext4_fc_replay"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"68142f986ff04b2b70b31db00f719bf690f64a9a","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"473faa75-ef75-448c-ba20-22fab9b37077","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[6].patched-build(0) Phase: Succeeded StartedAt: 2026-09-14 15:05:49 +0000 UTC FinishedAt: 2026-09-14 15:22:22 +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:*f7c935ac-1fe1-440f-b16f-321fa103e47c,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-workflow5g9lk/series-workflow5g9lk-convert-artifact-51101375/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": "29c499a3-5922-400d-a8b8-f2f6606bb5e9", "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-workflow5g9lk/series-workflow5g9lk-build-action-906085075/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflow5g9lk[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"68142f986ff04b2b70b31db00f719bf690f64a9a","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"base_commit":"68142f986ff04b2b70b31db00f719bf690f64a9a","base_tree":"linux-next","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["ext4_ext_clear_bb","ext4_fc_replay_inode","ext4_fc_replay"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"68142f986ff04b2b70b31db00f719bf690f64a9a","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"473faa75-ef75-448c-ba20-22fab9b37077","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[7] Phase: Succeeded StartedAt: 2026-09-14 15:22:32 +0000 UTC FinishedAt: 2026-09-14 15:22:32 +0000 UTC Input: nil Output: nil --------- Name: series-workflow5g9lk[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"68142f986ff04b2b70b31db00f719bf690f64a9a","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"base_commit":"68142f986ff04b2b70b31db00f719bf690f64a9a","base_tree":"linux-next","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["ext4_ext_clear_bb","ext4_fc_replay_inode","ext4_fc_replay"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"68142f986ff04b2b70b31db00f719bf690f64a9a","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"473faa75-ef75-448c-ba20-22fab9b37077","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[7].abort-if-patched-build-failed Phase: Skipped StartedAt: 2026-09-14 15:22:32 +0000 UTC FinishedAt: 2026-09-14 15:22:32 +0000 UTC Input: nil Output: nil --------- Name: series-workflow5g9lk[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"68142f986ff04b2b70b31db00f719bf690f64a9a","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"base_commit":"68142f986ff04b2b70b31db00f719bf690f64a9a","base_tree":"linux-next","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["ext4_ext_clear_bb","ext4_fc_replay_inode","ext4_fc_replay"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"68142f986ff04b2b70b31db00f719bf690f64a9a","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"473faa75-ef75-448c-ba20-22fab9b37077","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[8] Phase: Succeeded StartedAt: 2026-09-14 15:22:32 +0000 UTC FinishedAt: 2026-09-14 15:24:34 +0000 UTC Input: nil Output: nil --------- Name: series-workflow5g9lk[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"68142f986ff04b2b70b31db00f719bf690f64a9a","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"base_commit":"68142f986ff04b2b70b31db00f719bf690f64a9a","base_tree":"linux-next","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["ext4_ext_clear_bb","ext4_fc_replay_inode","ext4_fc_replay"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"68142f986ff04b2b70b31db00f719bf690f64a9a","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"473faa75-ef75-448c-ba20-22fab9b37077","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[8].boot-test-patched Phase: Succeeded StartedAt: 2026-09-14 15:22:32 +0000 UTC FinishedAt: 2026-09-14 15:24:24 +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:*29c499a3-5922-400d-a8b8-f2f6606bb5e9,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-workflow5g9lk/series-workflow5g9lk-build-action-906085075/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-workflow5g9lk[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"68142f986ff04b2b70b31db00f719bf690f64a9a","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"base_commit":"68142f986ff04b2b70b31db00f719bf690f64a9a","base_tree":"linux-next","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["ext4_ext_clear_bb","ext4_fc_replay_inode","ext4_fc_replay"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"68142f986ff04b2b70b31db00f719bf690f64a9a","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"473faa75-ef75-448c-ba20-22fab9b37077","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[10] Phase: Succeeded StartedAt: 2026-09-14 15:24:34 +0000 UTC FinishedAt: 2026-09-14 19:18:31 +0000 UTC Input: nil Output: nil --------- Name: series-workflow5g9lk[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"68142f986ff04b2b70b31db00f719bf690f64a9a","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"base_commit":"68142f986ff04b2b70b31db00f719bf690f64a9a","base_tree":"linux-next","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["ext4_ext_clear_bb","ext4_fc_replay_inode","ext4_fc_replay"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"68142f986ff04b2b70b31db00f719bf690f64a9a","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"473faa75-ef75-448c-ba20-22fab9b37077","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[10].run-fuzz Phase: Succeeded StartedAt: 2026-09-14 15:24:34 +0000 UTC FinishedAt: 2026-09-14 19:18:31 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:config,Default:nil,Value:*{"base_commit":"68142f986ff04b2b70b31db00f719bf690f64a9a","base_tree":"linux-next","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["ext4_ext_clear_bb","ext4_fc_replay_inode","ext4_fc_replay"],"skip_cover_check":false},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:track,Default:nil,Value:*KASAN,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:base-build-id,Default:nil,Value:*8913bebb-a2e8-435a-bc1d-579936cf8825,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*29c499a3-5922-400d-a8b8-f2f6606bb5e9,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-workflow5g9lk/series-workflow5g9lk-build-action-722768782/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-workflow5g9lk/series-workflow5g9lk-build-action-906085075/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: nil --------- Name: series-workflow5g9lk[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"68142f986ff04b2b70b31db00f719bf690f64a9a","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"base_commit":"68142f986ff04b2b70b31db00f719bf690f64a9a","base_tree":"linux-next","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["ext4_ext_clear_bb","ext4_fc_replay_inode","ext4_fc_replay"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"68142f986ff04b2b70b31db00f719bf690f64a9a","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"473faa75-ef75-448c-ba20-22fab9b37077","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[10].run-fuzz[0] Phase: Succeeded StartedAt: 2026-09-14 15:24:34 +0000 UTC FinishedAt: 2026-09-14 15:24:45 +0000 UTC Input: nil Output: nil --------- Name: series-workflow5g9lk[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"68142f986ff04b2b70b31db00f719bf690f64a9a","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"base_commit":"68142f986ff04b2b70b31db00f719bf690f64a9a","base_tree":"linux-next","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["ext4_ext_clear_bb","ext4_fc_replay_inode","ext4_fc_replay"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"68142f986ff04b2b70b31db00f719bf690f64a9a","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"473faa75-ef75-448c-ba20-22fab9b37077","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[10].run-fuzz[0].save-fuzz-config Phase: Succeeded StartedAt: 2026-09-14 15:24:34 +0000 UTC FinishedAt: 2026-09-14 15:24:39 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"base_commit":"68142f986ff04b2b70b31db00f719bf690f64a9a","base_tree":"linux-next","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["ext4_ext_clear_bb","ext4_fc_replay_inode","ext4_fc_replay"],"skip_cover_check":false},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: &Outputs{Parameters:[]Parameter{},Artifacts:[]Artifact{Artifact{Name:artifact,Path:/tmp/artifact,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflow5g9lk/series-workflow5g9lk-convert-artifact-3302471768/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflow5g9lk[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"68142f986ff04b2b70b31db00f719bf690f64a9a","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"base_commit":"68142f986ff04b2b70b31db00f719bf690f64a9a","base_tree":"linux-next","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["ext4_ext_clear_bb","ext4_fc_replay_inode","ext4_fc_replay"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"68142f986ff04b2b70b31db00f719bf690f64a9a","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"473faa75-ef75-448c-ba20-22fab9b37077","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[9] Phase: Succeeded StartedAt: 2026-09-14 15:24:34 +0000 UTC FinishedAt: 2026-09-14 15:24:34 +0000 UTC Input: nil Output: nil --------- Name: series-workflow5g9lk[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"68142f986ff04b2b70b31db00f719bf690f64a9a","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"base_commit":"68142f986ff04b2b70b31db00f719bf690f64a9a","base_tree":"linux-next","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["ext4_ext_clear_bb","ext4_fc_replay_inode","ext4_fc_replay"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"68142f986ff04b2b70b31db00f719bf690f64a9a","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"473faa75-ef75-448c-ba20-22fab9b37077","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[9].abort-if-patched-boot-failed Phase: Skipped StartedAt: 2026-09-14 15:24:34 +0000 UTC FinishedAt: 2026-09-14 15:24:34 +0000 UTC Input: nil Output: nil --------- Name: series-workflow5g9lk[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"68142f986ff04b2b70b31db00f719bf690f64a9a","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"base_commit":"68142f986ff04b2b70b31db00f719bf690f64a9a","base_tree":"linux-next","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["ext4_ext_clear_bb","ext4_fc_replay_inode","ext4_fc_replay"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"68142f986ff04b2b70b31db00f719bf690f64a9a","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"473faa75-ef75-448c-ba20-22fab9b37077","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[10].run-retest Phase: Skipped StartedAt: 2026-09-14 15:24:35 +0000 UTC FinishedAt: 2026-09-14 15:24:35 +0000 UTC Input: nil Output: nil --------- Name: series-workflow5g9lk[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"68142f986ff04b2b70b31db00f719bf690f64a9a","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"base_commit":"68142f986ff04b2b70b31db00f719bf690f64a9a","base_tree":"linux-next","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["ext4_ext_clear_bb","ext4_fc_replay_inode","ext4_fc_replay"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"68142f986ff04b2b70b31db00f719bf690f64a9a","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"473faa75-ef75-448c-ba20-22fab9b37077","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[10].run-fuzz[1] Phase: Succeeded StartedAt: 2026-09-14 15:24:45 +0000 UTC FinishedAt: 2026-09-14 19:18:31 +0000 UTC Input: nil Output: nil --------- Name: series-workflow5g9lk[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"68142f986ff04b2b70b31db00f719bf690f64a9a","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"base_commit":"68142f986ff04b2b70b31db00f719bf690f64a9a","base_tree":"linux-next","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["ext4_ext_clear_bb","ext4_fc_replay_inode","ext4_fc_replay"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"68142f986ff04b2b70b31db00f719bf690f64a9a","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"473faa75-ef75-448c-ba20-22fab9b37077","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[10].run-fuzz[1].fuzz Phase: Succeeded StartedAt: 2026-09-14 15:24:45 +0000 UTC FinishedAt: 2026-09-14 19:18:22 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*8913bebb-a2e8-435a-bc1d-579936cf8825,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*29c499a3-5922-400d-a8b8-f2f6606bb5e9,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-workflow5g9lk/series-workflow5g9lk-build-action-722768782/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-workflow5g9lk/series-workflow5g9lk-build-action-906085075/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-workflow5g9lk/series-workflow5g9lk-convert-artifact-3302471768/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,}