Name: series-workflowmqfq4 Phase: Succeeded StartedAt: 2026-08-17 21:57:38 +0000 UTC FinishedAt: 2026-08-18 02:17:30 +0000 UTC Input: nil Output: nil --------- Name: series-workflowmqfq4[0] Phase: Succeeded StartedAt: 2026-08-17 21:57:38 +0000 UTC FinishedAt: 2026-08-17 22:36:13 +0000 UTC Input: nil Output: nil --------- Name: series-workflowmqfq4[0].run-triage Phase: Succeeded StartedAt: 2026-08-17 21:57:38 +0000 UTC FinishedAt: 2026-08-17 22:36:13 +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": "2780860eddecba9ffe210bb9436eee3cf22bfcdd", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "BLK_CGROUP", "BPF_SYSCALL", "CGROUPS", "BLOCK" ], "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": "2780860eddecba9ffe210bb9436eee3cf22bfcdd", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "BLK_CGROUP", "BPF_SYSCALL", "CGROUPS", "BLOCK" ], "series_id": "e1f69090-9b52-43f2-9c8a-7b018cef8515" }, "track": "KASAN", "fuzz": { "focus": [ "bpf", "fs" ], "focus_symbols": [ "bpf_blkcg_flush_stats", "bpf_iter_blkg_new", "bpf_iter_blkg_next", "bpf_iter_blkg_destroy", "blkcg_fill_root_iostats" ], "corpus_urls": [ "https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db", "https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db" ], "skip_cover_check": false, "bug_title_re": "" }, "retest": null } ], "trajectory": "CjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KPGhlYWQ+Cgk8dGl0bGU+QUkgVHJhamVjdG9yeTwvdGl0bGU+Cgk8c3R5bGU+CgkJdGFibGUgewoJCQlib3JkZXI6IDFweCBzb2xpZCAjY2NjOwoJCQltYXJnaW46IDIwcHggNXB4OwoJCQlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwoJCQl3aGl0ZS1zcGFjZTogbm93cmFwOwoJCQl0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKCQkJb3ZlcmZsb3c6IGhpZGRlbjsKCQl9CgoJCXRhYmxlIGNhcHRpb24gewoJCQlmb250LXdlaWdodDogYm9sZDsKCQl9CgoJCXRhYmxlIHRkLCB0YWJsZSB0aCB7CgkJCXZlcnRpY2FsLWFsaWduOiB0b3A7CgkJCXBhZGRpbmc6IDJweCA4cHg7CgkJCXRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwoJCQlvdmVyZmxvdzogaGlkZGVuOwoJCX0KCgkJLmxpc3RfdGFibGUgdGQsIC5saXN0X3RhYmxlIHRoIHsKCQkJYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjY2NjOwoJCX0KCgkJLmxpc3RfdGFibGUgdGggewoJCQliYWNrZ3JvdW5kOiAjRjRGNEY0OwoJCX0KCgkJLmxpc3RfdGFibGUgdHI6bnRoLWNoaWxkKDJuKSB7CgkJCWJhY2tncm91bmQ6ICNGNEY0RjQ7CgkJfQoKCQkubGlzdF90YWJsZSB0cjpob3ZlciB7CgkJCWJhY2tncm91bmQ6ICNmZmZmOTk7CgkJfQoKCQkjYWlfZGV0YWlsc19kaXYgcHJlIHsKCQkJbWFyZ2luOiAxcHg7CgkJCW1heC13aWR0aDogMTIwY2g7CgkJCXdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKCQkJb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKCQl9Cgk8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PgoJPGgxPkFJIFRyYWplY3Rvcnk8L2gxPgoJPGJyPgoKCQoJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQk8Y2FwdGlvbj5UcmFqZWN0b3J5OiAoPGEgaHJlZj0iIyIgb25jbGljaz0idG9nZ2xlQWxsRGV0YWlscygpOyByZXR1cm4gZmFsc2U7Ij5FeHBhbmQvQ29sbGFwc2UgQWxsPC9hPik8L2NhcHRpb24+CgkJPHRoZWFkPjx0cj4KCQkJPHRoPlNlcTwvdGg+CgkJCTx0aD5UaW1lc3RhbXA8L3RoPgoJCQk8dGg+VHlwZTwvdGg+CgkJCTx0aD5OYW1lPC90aD4KCQkJPHRoPkR1cmF0aW9uPC90aD4KCQk8L3RyPjwvdGhlYWQ+CgkJPHRib2R5PgoJCQoJCTx0cj4KCQkJPHRkPjAvMDwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE3IDIyOjM0PC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MW08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0JMS19DR1JPVVAmIzM0OywKICAgICYjMzQ7QlBGX1NZU0NBTEwmIzM0OywKICAgICYjMzQ7Q0dST1VQUyYjMzQ7LAogICAgJiMzNDtCTE9DSyYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O2JwZl9ibGtjZ19mbHVzaF9zdGF0cyYjMzQ7LAogICAgJiMzNDticGZfaXRlcl9ibGtnX25ldyYjMzQ7LAogICAgJiMzNDticGZfaXRlcl9ibGtnX25leHQmIzM0OywKICAgICYjMzQ7YnBmX2l0ZXJfYmxrZ19kZXN0cm95JiMzNDssCiAgICAmIzM0O2Jsa2NnX2ZpbGxfcm9vdF9pb3N0YXRzJiMzNDsKICBdLAogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggc2VyaWVzIGludHJvZHVjZXMgQlBGIGtmdW5jcyBmb3IgYmxvY2sgY2dyb3VwIChibGtjZykgaXRlcmF0aW9uIGFuZCBzdGF0aXN0aWNzIGZsdXNoaW5nIChgYnBmX2Jsa2NnX2ZsdXNoX3N0YXRzYCwgYGJwZl9pdGVyX2Jsa2dfbmV3YCwgYGJwZl9pdGVyX2Jsa2dfbmV4dGAsIGBicGZfaXRlcl9ibGtnX2Rlc3Ryb3lgKS4gVGhlIGl0ZXJhdG9yIHN0YXRlIChgc3RydWN0IGJwZl9pdGVyX2Jsa2dfa2VybmApIGlzIGZ1bGx5IGluaXRpYWxpemVkIGluIGBicGZfaXRlcl9ibGtnX25ld2AgYmVmb3JlIGJlaW5nIHVzZWQgaW4gc3Vic2VxdWVudCBjYWxscy4gVGhlcmUgYXJlIG5vIG5ldyBrZXJuZWwgc3RydWN0dXJlcyBjb3BpZWQgdG8gdXNlciBzcGFjZSAoZS5nLiwgdmlhIGBjb3B5X3RvX3VzZXJgIG9yIG5ldGxpbmspLCBub3IgYXJlIHRoZXJlIGFueSBjb21wbGV4IGFsbG9jYXRpb25zIHdoZXJlIHVuaW5pdGlhbGl6ZWQgZmllbGRzIGNvdWxkIGJlIGxlYWtlZCBvciB1c2VkIGluIGNvbnRyb2wgZmxvdy4gVGhlIGNoYW5nZXMgcHJpbWFyaWx5IGludm9sdmUgcG9pbnRlciB0cmF2ZXJzYWwgYW5kIEJQRi1hY2Nlc3NpYmxlIHJlYWRzIG9mIGV4aXN0aW5nIGluaXRpYWxpemVkIGNncm91cCBzdHJ1Y3R1cmVzLiBBbnkgcG90ZW50aWFsIG1lbW9yeSBzYWZldHkgaXNzdWVzLCBzdWNoIGFzIG91dC1vZi1ib3VuZHMgYWNjZXNzZXMgb3IgdXNlLWFmdGVyLWZyZWUgYnVncyBkdXJpbmcgaXRlcmF0aW9uLCB3b3VsZCBiZSBlZmZlY3RpdmVseSBjYXVnaHQgYnkgS0FTQU4gYW5kIHRoZSBCUEYgdmVyaWZpZXIuIFRoZXJlZm9yZSwgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGlzIG5vdCByZXF1aXJlZC4mIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UsCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggaW50cm9kdWNlcyBuZXcgQlBGIGtmdW5jcyBmb3IgYmxvY2sgY2dyb3VwIEkvTyBzdGF0aXN0aWNzLCB3aGljaCBhcmUgcmVhY2hhYmxlIGZyb20gQlBGIHByb2dyYW1zLiBUaGVzZSBmdW5jdGlvbnMgYWxsb3cgQlBGIHByb2dyYW1zIHRvIGZsdXNoIGJsb2NrIGNncm91cCBzdGF0cyBhbmQgaXRlcmF0ZSBvdmVyIHBlci1kZXZpY2UgYmxrZ3MuIFRoZSBjaGFuZ2VzIGFyZSBmdW5jdGlvbmFsbHkgc2lnbmlmaWNhbnQgYW5kIHNob3VsZCBiZSBmdXp6ZWQuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MS8xPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTcgMjI6MzQ8L3RkPgoJCQk8dGQ+YWN0aW9uPC90ZD4KCQkJPHRkPnJlYWQtcGF0Y2gtZGlmZjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O1BhdGNoRGlmZiYjMzQ7OiAmIzM0O2NvbW1pdCA3NzMwMDM2M2ZlOWM1YjBhZmMzNmQ5Zjc0ZWFkYjQxYmE2ZGQ1M2E1XG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIE1vbiBBdWcgMTcgMjI6MzQ6MzIgMjAyNiAmIzQzOzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvTUFJTlRBSU5FUlMgYi9NQUlOVEFJTkVSU1xuaW5kZXggMmY5NDcyYzFhMDkwNy4uODdjNTZlOTU1NTc3MSAxMDA2NDRcbi0tLSBhL01BSU5UQUlORVJTXG4mIzQzOyYjNDM7JiM0MzsgYi9NQUlOVEFJTkVSU1xuQEAgLTY2MTcsNiAmIzQzOzY2MTcsNyBAQCBGOlx0YmxvY2svYmxrLWNncm91cC5jXG4gRjpcdGJsb2NrL2Jsay1pb2Nvc3QuY1xuIEY6XHRibG9jay9ibGstaW9sYXRlbmN5LmNcbiBGOlx0YmxvY2svYmxrLXRocm90dGxlLmNcbiYjNDM7RjpcdGJsb2NrL2JwZl9ibGtjZy5jXG4gRjpcdGluY2x1ZGUvbGludXgvYmxrLWNncm91cC5oXG4gXG4gQ09OVFJPTCBHUk9VUCAtIENQVVNFVFxuZGlmZiAtLWdpdCBhL2Jsb2NrL01ha2VmaWxlIGIvYmxvY2svTWFrZWZpbGVcbmluZGV4IGU3YmQzMjBlM2Q2OTcuLjU3MmU0OTk4OGM4ZWUgMTAwNjQ0XG4tLS0gYS9ibG9jay9NYWtlZmlsZVxuJiM0MzsmIzQzOyYjNDM7IGIvYmxvY2svTWFrZWZpbGVcbkBAIC0xNyw2ICYjNDM7MTcsOSBAQCBvYmotJChDT05GSUdfQkxLX0VSUk9SX0lOSkVDVElPTikgJiM0Mzs9IGVycm9yLWluamVjdGlvbi5vXG4gb2JqLSQoQ09ORklHX0JMS19ERVZfQlNHX0NPTU1PTikgJiM0Mzs9IGJzZy5vXG4gb2JqLSQoQ09ORklHX0JMS19ERVZfQlNHTElCKVx0JiM0Mzs9IGJzZy1saWIub1xuIG9iai0kKENPTkZJR19CTEtfQ0dST1VQKVx0JiM0Mzs9IGJsay1jZ3JvdXAub1xuJiM0MztpZmRlZiBDT05GSUdfQlBGX1NZU0NBTExcbiYjNDM7b2JqLSQoQ09ORklHX0JMS19DR1JPVVApXHQmIzQzOz0gYnBmX2Jsa2NnLm9cbiYjNDM7ZW5kaWZcbiBvYmotJChDT05GSUdfQkxLX0NHUk9VUF9SV1NUQVQpXHQmIzQzOz0gYmxrLWNncm91cC1yd3N0YXQub1xuIG9iai0kKENPTkZJR19CTEtfQ0dST1VQX0ZDX0FQUElEKSAmIzQzOz0gYmxrLWNncm91cC1mYy1hcHBpZC5vXG4gb2JqLSQoQ09ORklHX0JMS19ERVZfVEhST1RUTElORylcdCYjNDM7PSBibGstdGhyb3R0bGUub1xuZGlmZiAtLWdpdCBhL2Jsb2NrL2Jsay1jZ3JvdXAuYyBiL2Jsb2NrL2Jsay1jZ3JvdXAuY1xuaW5kZXggZDk2NzYxMjZjNWI1ZC4uOGQ1MzhhZDRlODYxYyAxMDA2NDRcbi0tLSBhL2Jsb2NrL2Jsay1jZ3JvdXAuY1xuJiM0MzsmIzQzOyYjNDM7IGIvYmxvY2svYmxrLWNncm91cC5jXG5AQCAtMTA4Niw3ICYjNDM7MTA4Niw3IEBAIHN0YXRpYyB2b2lkIGJsa2NnX3JzdGF0X2ZsdXNoKHN0cnVjdCBjZ3JvdXBfc3Vic3lzX3N0YXRlICpjc3MsIGludCBjcHUpXG4gICogZmx1c2hpbmcgdGhlIHJvb3QgY2dyb3VwJiMzOTtzIHN0YXRzIGJ5IGV4cGxpY2l0bHkgZmlsbGluZyBpbiB0aGUgaW9zdGF0XG4gICogd2l0aCBkaXNrIGxldmVsIHN0YXRpc3RpY3MuXG4gICovXG4tc3RhdGljIHZvaWQgYmxrY2dfZmlsbF9yb290X2lvc3RhdHModm9pZClcbiYjNDM7dm9pZCBibGtjZ19maWxsX3Jvb3RfaW9zdGF0cyh2b2lkKVxuIHtcbiBcdHN0cnVjdCBjbGFzc19kZXZfaXRlciBpdGVyO1xuIFx0c3RydWN0IGRldmljZSAqZGV2O1xuZGlmZiAtLWdpdCBhL2Jsb2NrL2Jsay1jZ3JvdXAuaCBiL2Jsb2NrL2Jsay1jZ3JvdXAuaFxuaW5kZXggNjE1MzkwZjc1MWFhMi4uOGM5YzJhMWFkZmFhNCAxMDA2NDRcbi0tLSBhL2Jsb2NrL2Jsay1jZ3JvdXAuaFxuJiM0MzsmIzQzOyYjNDM7IGIvYmxvY2svYmxrLWNncm91cC5oXG5AQCAtMjA1LDYgJiM0MzsyMDUsNyBAQCB2b2lkIGJsa2NnX2RlYWN0aXZhdGVfcG9saWN5KHN0cnVjdCBnZW5kaXNrICpkaXNrLFxuIFx0XHRcdCAgICAgY29uc3Qgc3RydWN0IGJsa2NnX3BvbGljeSAqcG9sKTtcbiBcbiBjb25zdCBjaGFyICpibGtnX2Rldl9uYW1lKHN0cnVjdCBibGtjZ19ncSAqYmxrZyk7XG4mIzQzO3ZvaWQgYmxrY2dfZmlsbF9yb290X2lvc3RhdHModm9pZCk7XG4gdm9pZCBibGtjZ19wcmludF9ibGtncyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNmLCBzdHJ1Y3QgYmxrY2cgKmJsa2NnLFxuIFx0XHQgICAgICAgdTY0ICgqcHJmaWxsKShzdHJ1Y3Qgc2VxX2ZpbGUgKixcbiBcdFx0XHRcdCAgICAgc3RydWN0IGJsa2dfcG9saWN5X2RhdGEgKiwgaW50KSxcbmRpZmYgLS1naXQgYS9ibG9jay9icGZfYmxrY2cuYyBiL2Jsb2NrL2JwZl9ibGtjZy5jXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uMjVjODA5ZjUwOTFjMlxuLS0tIC9kZXYvbnVsbFxuJiM0MzsmIzQzOyYjNDM7IGIvYmxvY2svYnBmX2Jsa2NnLmNcbkBAIC0wLDAgJiM0MzsxLDE1NCBAQFxuJiM0MzsvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vci1sYXRlclxuJiM0MzsvKlxuJiM0MzsgKiBCbG9jayBJL08gQ29udHJvbGxlci1yZWxhdGVkIEJQRiBrZnVuY3MgYW5kIGF1eGlsaWFyeSBjb2RlXG4mIzQzOyAqL1xuJiM0MztcbiYjNDM7I2luY2x1ZGUgXCYjMzQ7YmxrLWNncm91cC5oXCYjMzQ7XG4mIzQzO1xuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9icGYuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9idGZfaWRzLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjbGludXgvcmN1bGlzdC5oXHUwMDNlXG4mIzQzO1xuJiM0MztfX2JwZl9rZnVuY19zdGFydF9kZWZzKCk7XG4mIzQzO1xuJiM0MzsvKipcbiYjNDM7ICogYnBmX2Jsa2NnX2ZsdXNoX3N0YXRzIC0gRmx1c2ggYSBibG9jayBjZ3JvdXAmIzM5O3MgaW8gc3RhdGlzdGljc1xuJiM0MzsgKiBAY2dycDogY2dyb3VwIHRvIGZsdXNoXG4mIzQzOyAqXG4mIzQzOyAqIFByb3BhZ2F0ZSBJL08gc3RhdGlzdGljcyB1cCB0aGUgY2dyb3VwIHRyZWUuIFJvb3Qgc3RhdGlzdGljcyBjb21lIGZyb21cbiYjNDM7ICogYmxvY2sgZGV2aWNlcyBhbmQgaW5jbHVkZSBhbGwgY2dyb3VwcyYjMzk7IEkvTy5cbiYjNDM7ICovXG4mIzQzO19fYnBmX2tmdW5jIHZvaWQgYnBmX2Jsa2NnX2ZsdXNoX3N0YXRzKHN0cnVjdCBjZ3JvdXAgKmNncnApXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgY2dyb3VwX3N1YnN5c19zdGF0ZSAqY3NzO1xuJiM0MztcbiYjNDM7XHQvKiBQaW4gdGhlIGNzcyBmb3IgdGhlIHNsZWVwYWJsZSBmbHVzaC4gKi9cbiYjNDM7XHRyY3VfcmVhZF9sb2NrKCk7XG4mIzQzO1x0Y3NzID0gY2dyb3VwX2NzcyhjZ3JwLCBcdTAwMjZpb19jZ3JwX3N1YnN5cyk7XG4mIzQzO1x0aWYgKGNzcyBcdTAwMjZcdTAwMjYgIWNzc190cnlnZXQoY3NzKSlcbiYjNDM7XHRcdGNzcyA9IE5VTEw7XG4mIzQzO1x0cmN1X3JlYWRfdW5sb2NrKCk7XG4mIzQzO1xuJiM0MztcdGlmICghY3NzKVxuJiM0MztcdFx0cmV0dXJuO1xuJiM0MztcbiYjNDM7XHRpZiAoIWNzcy1cdTAwM2VwYXJlbnQpXG4mIzQzO1x0XHRibGtjZ19maWxsX3Jvb3RfaW9zdGF0cygpO1xuJiM0MztcdGVsc2VcbiYjNDM7XHRcdGNzc19yc3RhdF9mbHVzaChjc3MpO1xuJiM0MztcbiYjNDM7XHRjc3NfcHV0KGNzcyk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0cnVjdCBicGZfaXRlcl9ibGtnIHtcbiYjNDM7XHRfX3U2NCBfX29wYXF1ZVsyXTtcbiYjNDM7fSBfX2FsaWduZWQoOCk7XG4mIzQzO1xuJiM0MztzdHJ1Y3QgYnBmX2l0ZXJfYmxrZ19rZXJuIHtcbiYjNDM7XHRzdHJ1Y3QgYmxrY2cgKmJsa2NnO1xuJiM0MztcdHN0cnVjdCBibGtjZ19ncSAqcG9zO1xuJiM0Mzt9IF9fYWxpZ25lZCg4KTtcbiYjNDM7XG4mIzQzOy8qKlxuJiM0MzsgKiBicGZfaXRlcl9ibGtnX25ldyAtIFN0YXJ0IGl0ZXJhdGluZyBhIGJsb2NrIGNncm91cCYjMzk7cyBwZXItZGV2aWNlIGJsa2dzXG4mIzQzOyAqIEBpdDogaXRlcmF0b3IgdG8gaW5pdGlhbGl6ZVxuJiM0MzsgKiBAY3NzOiB0aGUgaW8gY29udHJvbGxlciYjMzk7cyBjc3NcbiYjNDM7ICpcbiYjNDM7ICogRWFjaCBibGtnIGhvbGRzIG9uZSBkZXZpY2UmIzM5O3MgaW8uc3RhdCBjb3VudGVycy4gT2ZmbGluZSBibGtncyBhcmUgc2tpcHBlZC5cbiYjNDM7ICogQSBibGtnIHdpdGhvdXQgYSBkaXNrIGNhbiBiZSByZXR1cm5lZC4gTXVzdCBydW4gdW5kZXIgUkNVLlxuJiM0MzsgKlxuJiM0MzsgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgLUVJTlZBTCBpZiBAY3NzIGlzIG5vdCB0aGUgaW8gY29udHJvbGxlciYjMzk7cy5cbiYjNDM7ICovXG4mIzQzO19fYnBmX2tmdW5jIGludCBicGZfaXRlcl9ibGtnX25ldyhzdHJ1Y3QgYnBmX2l0ZXJfYmxrZyAqaXQsXG4mIzQzO1x0XHRcdFx0ICBzdHJ1Y3QgY2dyb3VwX3N1YnN5c19zdGF0ZSAqY3NzKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IGJwZl9pdGVyX2Jsa2dfa2VybiAqa2l0ID0gKHZvaWQgKilpdDtcbiYjNDM7XG4mIzQzO1x0QlVJTERfQlVHX09OKHNpemVvZihzdHJ1Y3QgYnBmX2l0ZXJfYmxrZ19rZXJuKSBcdTAwM2Ugc2l6ZW9mKHN0cnVjdCBicGZfaXRlcl9ibGtnKSk7XG4mIzQzO1x0QlVJTERfQlVHX09OKF9fYWxpZ25vZl9fKHN0cnVjdCBicGZfaXRlcl9ibGtnX2tlcm4pICE9XG4mIzQzO1x0XHQgICAgIF9fYWxpZ25vZl9fKHN0cnVjdCBicGZfaXRlcl9ibGtnKSk7XG4mIzQzO1xuJiM0MztcdGtpdC1cdTAwM2Vwb3MgPSBOVUxMO1xuJiM0MztcbiYjNDM7XHRpZiAoY3NzLVx1MDAzZXNzICE9IFx1MDAyNmlvX2NncnBfc3Vic3lzKSB7XG4mIzQzO1x0XHRraXQtXHUwMDNlYmxrY2cgPSBOVUxMO1xuJiM0MztcdFx0cmV0dXJuIC1FSU5WQUw7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRraXQtXHUwMDNlYmxrY2cgPSBjc3NfdG9fYmxrY2coY3NzKTtcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LyoqXG4mIzQzOyAqIGJwZl9pdGVyX2Jsa2dfbmV4dCAtIFJldHVybiB0aGUgbmV4dCBvbmxpbmUgYmxrZyBvZiB0aGUgaXRlcmF0ZWQgYmxvY2sgY2dyb3VwXG4mIzQzOyAqIEBpdDogaXRlcmF0b3JcbiYjNDM7ICpcbiYjNDM7ICogUmV0dXJuOiB0aGUgbmV4dCBvbmxpbmUgYmxrZywgb3IgTlVMTCB3aGVuIHRoZSB3YWxrIGlzIGRvbmUuXG4mIzQzOyAqL1xuJiM0MztfX2JwZl9rZnVuYyBzdHJ1Y3QgYmxrY2dfZ3EgKmJwZl9pdGVyX2Jsa2dfbmV4dChzdHJ1Y3QgYnBmX2l0ZXJfYmxrZyAqaXQpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgYnBmX2l0ZXJfYmxrZ19rZXJuICpraXQgPSAodm9pZCAqKWl0O1xuJiM0MztcdHN0cnVjdCBibGtjZ19ncSAqYmxrZyA9IGtpdC1cdTAwM2Vwb3M7XG4mIzQzO1x0c3RydWN0IGhsaXN0X25vZGUgKm5vZGU7XG4mIzQzO1xuJiM0MztcdGlmICgha2l0LVx1MDAzZWJsa2NnKVxuJiM0MztcdFx0cmV0dXJuIE5VTEw7XG4mIzQzO1xuJiM0MztcdGlmICghYmxrZylcbiYjNDM7XHRcdG5vZGUgPSByY3VfZGVyZWZlcmVuY2UoaGxpc3RfZmlyc3RfcmN1KFx1MDAyNmtpdC1cdTAwM2VibGtjZy1cdTAwM2VibGtnX2xpc3QpKTtcbiYjNDM7XHRlbHNlXG4mIzQzO1x0XHRub2RlID0gcmN1X2RlcmVmZXJlbmNlKGhsaXN0X25leHRfcmN1KFx1MDAyNmJsa2ctXHUwMDNlYmxrY2dfbm9kZSkpO1xuJiM0MztcbiYjNDM7XHQvKiBTa2lwIG9mZmxpbmUgYmxrZ3MsIG1hdGNoaW5nIGlvLnN0YXQuICovXG4mIzQzO1x0d2hpbGUgKG5vZGUpIHtcbiYjNDM7XHRcdGJsa2cgPSBobGlzdF9lbnRyeShub2RlLCBzdHJ1Y3QgYmxrY2dfZ3EsIGJsa2NnX25vZGUpO1xuJiM0MztcdFx0LyogQSByYWNlIG9ubHkgY2hhbmdlcyB3aGV0aGVyIHRoaXMgYmxrZyBpcyByZXR1cm5lZC4gKi9cbiYjNDM7XHRcdGlmIChkYXRhX3JhY2UoYmxrZy1cdTAwM2VvbmxpbmUpKSB7XG4mIzQzO1x0XHRcdGtpdC1cdTAwM2Vwb3MgPSBibGtnO1xuJiM0MztcdFx0XHRyZXR1cm4gYmxrZztcbiYjNDM7XHRcdH1cbiYjNDM7XHRcdG5vZGUgPSByY3VfZGVyZWZlcmVuY2UoaGxpc3RfbmV4dF9yY3UoXHUwMDI2YmxrZy1cdTAwM2VibGtjZ19ub2RlKSk7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHQvKiBUaGUgaXRlcmF0b3IgbXVzdCBrZWVwIHJldHVybmluZyBOVUxMIGFmdGVyIGNvbXBsZXRpb24uICovXG4mIzQzO1x0a2l0LVx1MDAzZXBvcyA9IE5VTEw7XG4mIzQzO1x0a2l0LVx1MDAzZWJsa2NnID0gTlVMTDtcbiYjNDM7XHRyZXR1cm4gTlVMTDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LyoqXG4mIzQzOyAqIGJwZl9pdGVyX2Jsa2dfZGVzdHJveSAtIFRlYXIgZG93biBhIGJsa2cgaXRlcmF0b3JcbiYjNDM7ICogQGl0OiBpdGVyYXRvclxuJiM0MzsgKi9cbiYjNDM7X19icGZfa2Z1bmMgdm9pZCBicGZfaXRlcl9ibGtnX2Rlc3Ryb3koc3RydWN0IGJwZl9pdGVyX2Jsa2cgKml0KVxuJiM0Mzt7XG4mIzQzO31cbiYjNDM7XG4mIzQzO19fYnBmX2tmdW5jX2VuZF9kZWZzKCk7XG4mIzQzO1xuJiM0MztCVEZfS0ZVTkNTX1NUQVJUKGJwZl9ibGtjZ19rZnVuY3MpXG4mIzQzO0JURl9JRF9GTEFHUyhmdW5jLCBicGZfYmxrY2dfZmx1c2hfc3RhdHMsIEtGX1NMRUVQQUJMRSlcbiYjNDM7XG4mIzQzO0JURl9JRF9GTEFHUyhmdW5jLCBicGZfaXRlcl9ibGtnX25ldyxcbiYjNDM7XHQgICAgIEtGX0lURVJfTkVXIHwgS0ZfUkNVIHwgS0ZfUkNVX1BST1RFQ1RFRClcbiYjNDM7QlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9pdGVyX2Jsa2dfbmV4dCwgS0ZfSVRFUl9ORVhUIHwgS0ZfUkVUX05VTEwpXG4mIzQzO0JURl9JRF9GTEFHUyhmdW5jLCBicGZfaXRlcl9ibGtnX2Rlc3Ryb3ksIEtGX0lURVJfREVTVFJPWSlcbiYjNDM7QlRGX0tGVU5DU19FTkQoYnBmX2Jsa2NnX2tmdW5jcylcbiYjNDM7XG4mIzQzO3N0YXRpYyBjb25zdCBzdHJ1Y3QgYnRmX2tmdW5jX2lkX3NldCBicGZfYmxrY2dfa2Z1bmNfc2V0ID0ge1xuJiM0MztcdC5vd25lclx0XHQ9IFRISVNfTU9EVUxFLFxuJiM0MztcdC5zZXRcdFx0PSBcdTAwMjZicGZfYmxrY2dfa2Z1bmNzLFxuJiM0Mzt9O1xuJiM0MztcbiYjNDM7c3RhdGljIGludCBfX2luaXQgYnBmX2Jsa2NnX2luaXQodm9pZClcbiYjNDM7e1xuJiM0MztcdGludCBlcnI7XG4mIzQzO1xuJiM0MztcdGVyciA9IHJlZ2lzdGVyX2J0Zl9rZnVuY19pZF9zZXQoQlBGX1BST0dfVFlQRV9VTlNQRUMsXG4mIzQzO1x0XHRcdFx0XHRcdTAwMjZicGZfYmxrY2dfa2Z1bmNfc2V0KTtcbiYjNDM7XHRpZiAoZXJyKVxuJiM0MztcdFx0cHJfd2FybihcJiMzNDtlcnJvciB3aGlsZSByZWdpc3RlcmluZyBicGYgYmxrY2cga2Z1bmNzOiAlZFxcblwmIzM0OywgZXJyKTtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIGVycjtcbiYjNDM7fVxuJiM0MztsYXRlX2luaXRjYWxsKGJwZl9ibGtjZ19pbml0KTtcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvY2dyb3VwX2l0ZXJfaW8uaCBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9jZ3JvdXBfaXRlcl9pby5oXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uZjRiYmFhY2NkZjcxNlxuLS0tIC9kZXYvbnVsbFxuJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL2Nncm91cF9pdGVyX2lvLmhcbkBAIC0wLDAgJiM0MzsxLDE3IEBAXG4mIzQzOy8qIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wICovXG4mIzQzOy8qIENvcHlyaWdodCAoYykgMjAyNSBNZXRhIFBsYXRmb3JtcywgSW5jLiBhbmQgYWZmaWxpYXRlcy4gKi9cbiYjNDM7I2lmbmRlZiBfX0NHUk9VUF9JVEVSX0lPX0hcbiYjNDM7I2RlZmluZSBfX0NHUk9VUF9JVEVSX0lPX0hcbiYjNDM7XG4mIzQzO3N0cnVjdCBpb19xdWVyeSB7XG4mIzQzO1x0Lyogb25lIGRldmljZSYjMzk7cyBpby5zdGF0IGNvdW50ZXJzICovXG4mIzQzO1x0X191NjQgcmJ5dGVzO1xuJiM0MztcdF9fdTY0IHdieXRlcztcbiYjNDM7XHRfX3U2NCByaW9zO1xuJiM0MztcdF9fdTY0IHdpb3M7XG4mIzQzO1x0X191NjQgZGJ5dGVzO1xuJiM0MztcdF9fdTY0IGRpb3M7XG4mIzQzO1x0X191NjQgZGV2O1x0LyogZGV2X3Qgb2YgdGhlIGRldmljZSB0aGUgY291bnRlcnMgYmVsb25nIHRvICovXG4mIzQzO307XG4mIzQzO1xuJiM0MzsjZW5kaWYgLyogX19DR1JPVVBfSVRFUl9JT19IICovXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL2NvbmZpZyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9jb25maWdcbmluZGV4IGVhNzA0NGYzMGFkYzMuLjI3MGU2YmY5MTk0ZDIgMTAwNjQ0XG4tLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvY29uZmlnXG4mIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvY29uZmlnXG5AQCAtMSwzICYjNDM7MSw0IEBAXG4mIzQzO0NPTkZJR19CTEtfQ0dST1VQPXlcbiBDT05GSUdfQkxLX0RFVl9MT09QPXlcbiBDT05GSUdfQk9PVFBBUkFNX0hBUkRMT0NLVVBfUEFOSUM9eVxuIENPTkZJR19CT09UUEFSQU1fU09GVExPQ0tVUF9QQU5JQz0xXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvY2dyb3VwX2l0ZXJfaW8uYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2Nncm91cF9pdGVyX2lvLmNcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwLi41ZDI3ZTVkMjgzNzk1XG4tLS0gL2Rldi9udWxsXG4mIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9jZ3JvdXBfaXRlcl9pby5jXG5AQCAtMCwwICYjNDM7MSwyNzcgQEBcbiYjNDM7Ly8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcbiYjNDM7LyogQ29weXJpZ2h0IChjKSAyMDI1IE1ldGEgUGxhdGZvcm1zLCBJbmMuIGFuZCBhZmZpbGlhdGVzLiAqL1xuJiM0MzsjZGVmaW5lIF9HTlVfU09VUkNFXG4mIzQzOyNpbmNsdWRlIFx1MDAzY3Rlc3RfcHJvZ3MuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NicGYvbGliYnBmLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjZmNudGwuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9sb29wLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjc3RkbGliLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjc3RyaW5nLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjc3lzL2lvY3RsLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjc3lzL3N0YXQuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NzeXMvc3lzbWFjcm9zLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjdW5pc3RkLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXCYjMzQ7Y2dyb3VwX2hlbHBlcnMuaFwmIzM0O1xuJiM0MzsjaW5jbHVkZSBcJiMzNDtjZ3JvdXBfaXRlcl9pby5oXCYjMzQ7XG4mIzQzOyNpbmNsdWRlIFwmIzM0O2Nncm91cF9pdGVyX2lvLnNrZWwuaFwmIzM0O1xuJiM0MztcbiYjNDM7I2RlZmluZSBJT19TSVpFICg0ICogMTAyNCAqIDEwMjQpXG4mIzQzO1xuJiM0MztzdGF0aWMgaW50IHJlYWRfc3RhdHMoc3RydWN0IGJwZl9saW5rICpsaW5rKVxuJiM0Mzt7XG4mIzQzO1x0aW50IGZkLCByZXQgPSAwO1xuJiM0MztcdHNzaXplX3QgYnl0ZXM7XG4mIzQzO1xuJiM0MztcdGZkID0gYnBmX2l0ZXJfY3JlYXRlKGJwZl9saW5rX19mZChsaW5rKSk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0tfRkQoZmQsIFwmIzM0O2JwZl9pdGVyX2NyZWF0ZVwmIzM0OykpXG4mIzQzO1x0XHRyZXR1cm4gMTtcbiYjNDM7XG4mIzQzO1x0LyogUmVzdWx0cyBsYW5kIGluIHNrZWwtXHUwMDNlZGF0YV9xdWVyeTsgdGhlIHJlYWQgaXRzZWxmIHJldHVybnMgbm8gZGF0YS4gKi9cbiYjNDM7XHRieXRlcyA9IHJlYWQoZmQsIE5VTEwsIDApO1xuJiM0MztcdGlmICghQVNTRVJUX0VRKGJ5dGVzLCAwLCBcJiMzNDtyZWFkIGZkXCYjMzQ7KSlcbiYjNDM7XHRcdHJldCA9IDE7XG4mIzQzO1xuJiM0MztcdGNsb3NlKGZkKTtcbiYjNDM7XHRyZXR1cm4gcmV0O1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKiBTZXQgdXAgYSBsb29wIGRldmljZSBmb3IgY2dyb3VwLWNoYXJnZWQgSS9PLiAqL1xuJiM0MztzdGF0aWMgaW50IGxvb3Bfc2V0dXAoY2hhciAqbG9vcF9wYXRoLCBzaXplX3Qgc3osIGludCAqY3RsX2ZkLCBpbnQgKmxvb3BfZmQsXG4mIzQzO1x0XHQgICAgICBpbnQgKmJhY2tfZmQpXG4mIzQzO3tcbiYjNDM7XHRjaGFyIGJhY2tfcGF0aFtdID0gXCYjMzQ7L3RtcC9jZ3JvdXBfaXRlcl9pby5YWFhYWFhcJiMzNDs7XG4mIzQzO1x0aW50IG5yO1xuJiM0MztcbiYjNDM7XHQqY3RsX2ZkID0gKmxvb3BfZmQgPSAqYmFja19mZCA9IC0xO1xuJiM0MztcbiYjNDM7XHQqY3RsX2ZkID0gb3BlbihcJiMzNDsvZGV2L2xvb3AtY29udHJvbFwmIzM0OywgT19SRFdSIHwgT19DTE9FWEVDKTtcbiYjNDM7XHRpZiAoKmN0bF9mZCBcdTAwM2MgMClcbiYjNDM7XHRcdHJldHVybiAtMTtcbiYjNDM7XG4mIzQzO1x0bnIgPSBpb2N0bCgqY3RsX2ZkLCBMT09QX0NUTF9HRVRfRlJFRSk7XG4mIzQzO1x0aWYgKG5yIFx1MDAzYyAwKVxuJiM0MztcdFx0Z290byBlcnI7XG4mIzQzO1x0c25wcmludGYobG9vcF9wYXRoLCBzeiwgXCYjMzQ7L2Rldi9sb29wJWRcJiMzNDssIG5yKTtcbiYjNDM7XG4mIzQzO1x0KmJhY2tfZmQgPSBta3N0ZW1wKGJhY2tfcGF0aCk7XG4mIzQzO1x0aWYgKCpiYWNrX2ZkIFx1MDAzYyAwKVxuJiM0MztcdFx0Z290byBlcnI7XG4mIzQzO1x0dW5saW5rKGJhY2tfcGF0aCk7XG4mIzQzO1x0aWYgKGZ0cnVuY2F0ZSgqYmFja19mZCwgKG9mZl90KUlPX1NJWkUgKiA0KSlcbiYjNDM7XHRcdGdvdG8gZXJyO1xuJiM0MztcbiYjNDM7XHQqbG9vcF9mZCA9IG9wZW4obG9vcF9wYXRoLCBPX1JEV1IgfCBPX0NMT0VYRUMpO1xuJiM0MztcdGlmICgqbG9vcF9mZCBcdTAwM2MgMClcbiYjNDM7XHRcdGdvdG8gZXJyO1xuJiM0MztcdGlmIChpb2N0bCgqbG9vcF9mZCwgTE9PUF9TRVRfRkQsICpiYWNrX2ZkKSlcbiYjNDM7XHRcdGdvdG8gZXJyO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7ZXJyOlxuJiM0MztcdGlmICgqbG9vcF9mZCBcdTAwM2U9IDApXG4mIzQzO1x0XHRjbG9zZSgqbG9vcF9mZCk7XG4mIzQzO1x0aWYgKCpiYWNrX2ZkIFx1MDAzZT0gMClcbiYjNDM7XHRcdGNsb3NlKCpiYWNrX2ZkKTtcbiYjNDM7XHRjbG9zZSgqY3RsX2ZkKTtcbiYjNDM7XHQqY3RsX2ZkID0gKmxvb3BfZmQgPSAqYmFja19mZCA9IC0xO1xuJiM0MztcdHJldHVybiAtMTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIHZvaWQgbG9vcF90ZWFyZG93bihjb25zdCBjaGFyICpsb29wX3BhdGgsIGludCBjdGxfZmQsIGludCBsb29wX2ZkLFxuJiM0MztcdFx0XHQgIGludCBiYWNrX2ZkKVxuJiM0Mzt7XG4mIzQzO1x0aW50IG5yID0gLTE7XG4mIzQzO1xuJiM0MztcdGlmIChsb29wX2ZkIFx1MDAzZT0gMCkge1xuJiM0MztcdFx0aW9jdGwobG9vcF9mZCwgTE9PUF9DTFJfRkQsIDApO1xuJiM0MztcdFx0Y2xvc2UobG9vcF9mZCk7XG4mIzQzO1x0fVxuJiM0MztcdGlmIChiYWNrX2ZkIFx1MDAzZT0gMClcbiYjNDM7XHRcdGNsb3NlKGJhY2tfZmQpO1xuJiM0MztcdGlmIChjdGxfZmQgXHUwMDNlPSAwKSB7XG4mIzQzO1x0XHRpZiAoc3NjYW5mKGxvb3BfcGF0aCwgXCYjMzQ7L2Rldi9sb29wJWRcJiMzNDssIFx1MDAyNm5yKSA9PSAxIFx1MDAyNlx1MDAyNiBuciBcdTAwM2U9IDApXG4mIzQzO1x0XHRcdGlvY3RsKGN0bF9mZCwgTE9PUF9DVExfUkVNT1ZFLCBucik7XG4mIzQzO1x0XHRjbG9zZShjdGxfZmQpO1xuJiM0MztcdH1cbiYjNDM7fVxuJiM0MztcbiYjNDM7LyogT19ESVJFQ1Qga2VlcHMgSS9PIGNoYXJnZWQgdG8gdGhlIGN1cnJlbnQgY2dyb3VwLiAqL1xuJiM0MztzdGF0aWMgaW50IGRvX2RpcmVjdF9pbyhjb25zdCBjaGFyICpsb29wX3BhdGgpXG4mIzQzO3tcbiYjNDM7XHR2b2lkICpidWY7XG4mIzQzO1x0aW50IGZkLCByZXQgPSAtMTtcbiYjNDM7XG4mIzQzO1x0ZmQgPSBvcGVuKGxvb3BfcGF0aCwgT19SRFdSIHwgT19ESVJFQ1QgfCBPX0NMT0VYRUMpO1xuJiM0MztcdGlmIChmZCBcdTAwM2MgMClcbiYjNDM7XHRcdHJldHVybiAtMTtcbiYjNDM7XHRpZiAocG9zaXhfbWVtYWxpZ24oXHUwMDI2YnVmLCA0MDk2LCBJT19TSVpFKSlcbiYjNDM7XHRcdGdvdG8gb3V0X2ZkO1xuJiM0MztcdG1lbXNldChidWYsIDB4YWIsIElPX1NJWkUpO1xuJiM0MztcbiYjNDM7XHRpZiAocHdyaXRlKGZkLCBidWYsIElPX1NJWkUsIDApICE9IElPX1NJWkUpXG4mIzQzO1x0XHRnb3RvIG91dF9idWY7XG4mIzQzO1x0ZnN5bmMoZmQpO1xuJiM0MztcdGlmIChwcmVhZChmZCwgYnVmLCBJT19TSVpFLCAwKSAhPSBJT19TSVpFKVxuJiM0MztcdFx0Z290byBvdXRfYnVmO1xuJiM0MztcdHJldCA9IDA7XG4mIzQzO291dF9idWY6XG4mIzQzO1x0ZnJlZShidWYpO1xuJiM0MztvdXRfZmQ6XG4mIzQzO1x0Y2xvc2UoZmQpO1xuJiM0MztcdHJldHVybiByZXQ7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qIFJlYWQgQGRldiYjMzk7cyBpby5zdGF0IGNvdW50ZXJzLiBAZGV2IHVzZXMga2VybmVsIGRldl90IGVuY29kaW5nLiAqL1xuJiM0MztzdGF0aWMgaW50IHBhcnNlX2lvX3N0YXQoaW50IGNncm91cF9mZCwgX191NjQgZGV2LCBzdHJ1Y3QgaW9fcXVlcnkgKm91dClcbiYjNDM7e1xuJiM0MztcdHVuc2lnbmVkIGludCB3YW50X21haiA9IGRldiBcdTAwM2VcdTAwM2UgMjAsIHdhbnRfbWluID0gZGV2IFx1MDAyNiAoKDFVIFx1MDAzY1x1MDAzYyAyMCkgLSAxKTtcbiYjNDM7XHRjaGFyIGJ1Zls0MDk2XSwgKmxpbmUsICpzYXZlcHRyO1xuJiM0MztcdGludCBmZCwgbiwgcmV0ID0gLTE7XG4mIzQzO1xuJiM0MztcdGZkID0gb3BlbmF0KGNncm91cF9mZCwgXCYjMzQ7aW8uc3RhdFwmIzM0OywgT19SRE9OTFkpO1xuJiM0MztcdGlmIChmZCBcdTAwM2MgMClcbiYjNDM7XHRcdHJldHVybiAtMTtcbiYjNDM7XHRuID0gcmVhZChmZCwgYnVmLCBzaXplb2YoYnVmKSAtIDEpO1xuJiM0MztcdGNsb3NlKGZkKTtcbiYjNDM7XHRpZiAobiBcdTAwM2M9IDApXG4mIzQzO1x0XHRyZXR1cm4gLTE7XG4mIzQzO1x0YnVmW25dID0gJiMzOTtcXDAmIzM5OztcbiYjNDM7XG4mIzQzO1x0Zm9yIChsaW5lID0gc3RydG9rX3IoYnVmLCBcJiMzNDtcXG5cJiMzNDssIFx1MDAyNnNhdmVwdHIpOyBsaW5lO1xuJiM0MztcdCAgICAgbGluZSA9IHN0cnRva19yKE5VTEwsIFwmIzM0O1xcblwmIzM0OywgXHUwMDI2c2F2ZXB0cikpIHtcbiYjNDM7XHRcdHVuc2lnbmVkIGxvbmcgbG9uZyByYiA9IDAsIHdiID0gMCwgcmkgPSAwLCB3aSA9IDAsIGRiID0gMCwgZGkgPSAwO1xuJiM0MztcdFx0dW5zaWduZWQgaW50IG1haiwgbWluO1xuJiM0MztcbiYjNDM7XHRcdC8qIE9ubHkgdGhlIGRldmljZSBpZCBpcyByZXF1aXJlZDsgbWlzc2luZyBjb3VudGVycyBzdGF5IHplcm8uICovXG4mIzQzO1x0XHRpZiAoc3NjYW5mKGxpbmUsXG4mIzQzO1x0XHRcdCAgIFwmIzM0OyV1OiV1IHJieXRlcz0lbGx1IHdieXRlcz0lbGx1IHJpb3M9JWxsdSB3aW9zPSVsbHUgZGJ5dGVzPSVsbHUgZGlvcz0lbGx1XCYjMzQ7LFxuJiM0MztcdFx0XHQgICBcdTAwMjZtYWosIFx1MDAyNm1pbiwgXHUwMDI2cmIsIFx1MDAyNndiLCBcdTAwMjZyaSwgXHUwMDI2d2ksIFx1MDAyNmRiLCBcdTAwMjZkaSkgXHUwMDNjIDIpXG4mIzQzO1x0XHRcdGNvbnRpbnVlO1xuJiM0MztcdFx0aWYgKG1haiAhPSB3YW50X21haiB8fCBtaW4gIT0gd2FudF9taW4pXG4mIzQzO1x0XHRcdGNvbnRpbnVlO1xuJiM0MztcbiYjNDM7XHRcdG91dC1cdTAwM2VyYnl0ZXMgPSByYjtcbiYjNDM7XHRcdG91dC1cdTAwM2V3Ynl0ZXMgPSB3YjtcbiYjNDM7XHRcdG91dC1cdTAwM2VyaW9zID0gcmk7XG4mIzQzO1x0XHRvdXQtXHUwMDNld2lvcyA9IHdpO1xuJiM0MztcdFx0b3V0LVx1MDAzZWRieXRlcyA9IGRiO1xuJiM0MztcdFx0b3V0LVx1MDAzZWRpb3MgPSBkaTtcbiYjNDM7XHRcdHJldCA9IDA7XG4mIzQzO1x0XHRicmVhaztcbiYjNDM7XHR9XG4mIzQzO1x0cmV0dXJuIHJldDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7dm9pZCB0ZXN0X2Nncm91cF9pdGVyX2lvKHZvaWQpXG4mIzQzO3tcbiYjNDM7XHRjaGFyICpjZ3JvdXBfcmVsX3BhdGggPSBcJiMzNDsvY2dyb3VwX2l0ZXJfaW9fdGVzdFwmIzM0OztcbiYjNDM7XHRpbnQgY3RsX2ZkID0gLTEsIGxvb3BfZmQgPSAtMSwgYmFja19mZCA9IC0xO1xuJiM0MztcdHN0cnVjdCBjZ3JvdXBfaXRlcl9pbyAqc2tlbCA9IE5VTEw7XG4mIzQzO1x0c3RydWN0IGJwZl9saW5rICpsaW5rID0gTlVMTDtcbiYjNDM7XHRjaGFyIGxvb3BfcGF0aFs2NF07XG4mIzQzO1x0c3RydWN0IGlvX3F1ZXJ5ICpxO1xuJiM0MztcdGludCBjZ3JvdXBfZmQ7XG4mIzQzO1xuJiM0MztcdGNncm91cF9mZCA9IGNncm91cF9zZXR1cF9hbmRfam9pbihjZ3JvdXBfcmVsX3BhdGgpO1xuJiM0MztcdGlmICghQVNTRVJUX09LX0ZEKGNncm91cF9mZCwgXCYjMzQ7Y2dyb3VwX3NldHVwX2FuZF9qb2luXCYjMzQ7KSlcbiYjNDM7XHRcdHJldHVybjtcbiYjNDM7XG4mIzQzO1x0aWYgKGxvb3Bfc2V0dXAobG9vcF9wYXRoLCBzaXplb2YobG9vcF9wYXRoKSwgXHUwMDI2Y3RsX2ZkLCBcdTAwMjZsb29wX2ZkLCBcdTAwMjZiYWNrX2ZkKSkge1xuJiM0MztcdFx0dGVzdF9fc2tpcCgpO1x0LyogbmVlZHMgcm9vdCAmIzQzOyBDT05GSUdfQkxLX0RFVl9MT09QICovXG4mIzQzO1x0XHRnb3RvIGNsZWFudXBfY2dyb3VwX2ZkO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0c2tlbCA9IGNncm91cF9pdGVyX2lvX19vcGVuX2FuZF9sb2FkKCk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0tfUFRSKHNrZWwsIFwmIzM0O2Nncm91cF9pdGVyX2lvX19vcGVuX2FuZF9sb2FkXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gY2xlYW51cF9sb29wO1xuJiM0MztcbiYjNDM7XHQvKiBDb252ZXJ0IGdsaWJjIHN0X3JkZXYgdG8ga2VybmVsIGRldl90IGZvcm1hdC4gKi9cbiYjNDM7XHR7XG4mIzQzO1x0XHRzdHJ1Y3Qgc3RhdCBsc3Q7XG4mIzQzO1xuJiM0MztcdFx0aWYgKCFBU1NFUlRfT0soZnN0YXQobG9vcF9mZCwgXHUwMDI2bHN0KSwgXCYjMzQ7ZnN0YXQgbG9vcFwmIzM0OykpXG4mIzQzO1x0XHRcdGdvdG8gY2xlYW51cF9za2VsO1xuJiM0MztcdFx0c2tlbC1cdTAwM2VkYXRhX3F1ZXJ5LVx1MDAzZXRhcmdldF9kZXYgPVxuJiM0MztcdFx0XHQoKF9fdTY0KW1ham9yKGxzdC5zdF9yZGV2KSBcdTAwM2NcdTAwM2MgMjApIHwgbWlub3IobHN0LnN0X3JkZXYpO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0REVDTEFSRV9MSUJCUEZfT1BUUyhicGZfaXRlcl9hdHRhY2hfb3B0cywgb3B0cyk7XG4mIzQzO1x0dW5pb24gYnBmX2l0ZXJfbGlua19pbmZvIGxpbmZvID0ge1xuJiM0MztcdFx0LmNncm91cC5jZ3JvdXBfZmQgPSBjZ3JvdXBfZmQsXG4mIzQzO1x0XHQuY2dyb3VwLm9yZGVyID0gQlBGX0NHUk9VUF9JVEVSX1NFTEZfT05MWSxcbiYjNDM7XHR9O1xuJiM0MztcdG9wdHMubGlua19pbmZvID0gXHUwMDI2bGluZm87XG4mIzQzO1x0b3B0cy5saW5rX2luZm9fbGVuID0gc2l6ZW9mKGxpbmZvKTtcbiYjNDM7XG4mIzQzO1x0bGluayA9IGJwZl9wcm9ncmFtX19hdHRhY2hfaXRlcihza2VsLVx1MDAzZXByb2dzLmNncm91cF9pb19xdWVyeSwgXHUwMDI2b3B0cyk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0tfUFRSKGxpbmssIFwmIzM0O2JwZl9wcm9ncmFtX19hdHRhY2hfaXRlclwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIGNsZWFudXBfc2tlbDtcbiYjNDM7XG4mIzQzO1x0LyogVGhpcyBwcm9jZXNzIGlzIGluIHRoZSB0ZXN0IGNncm91cCwgc28gdGhlIGxvb3AgSS9PIGlzIGNoYXJnZWQgaGVyZS4gKi9cbiYjNDM7XHRpZiAoIUFTU0VSVF9PSyhkb19kaXJlY3RfaW8obG9vcF9wYXRoKSwgXCYjMzQ7ZG9fZGlyZWN0X2lvXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gY2xlYW51cF9saW5rO1xuJiM0MztcbiYjNDM7XHRpZiAoIUFTU0VSVF9PSyhyZWFkX3N0YXRzKGxpbmspLCBcJiMzNDtyZWFkIHN0YXRzXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gY2xlYW51cF9saW5rO1xuJiM0MztcbiYjNDM7XHRxID0gXHUwMDI2c2tlbC1cdTAwM2VkYXRhX3F1ZXJ5LVx1MDAzZWlvX3F1ZXJ5O1xuJiM0MztcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwmIzM0O2Nncm91cF9pdGVyX2lvX193cml0ZVwmIzM0OykpIHtcbiYjNDM7XHRcdEFTU0VSVF9HVChxLVx1MDAzZXdieXRlcywgMCwgXCYjMzQ7d2J5dGVzXCYjMzQ7KTtcbiYjNDM7XHRcdEFTU0VSVF9HVChxLVx1MDAzZXdpb3MsIDAsIFwmIzM0O3dpb3NcJiMzNDspO1xuJiM0MztcdH1cbiYjNDM7XHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcJiMzNDtjZ3JvdXBfaXRlcl9pb19fcmVhZFwmIzM0OykpIHtcbiYjNDM7XHRcdEFTU0VSVF9HVChxLVx1MDAzZXJieXRlcywgMCwgXCYjMzQ7cmJ5dGVzXCYjMzQ7KTtcbiYjNDM7XHRcdEFTU0VSVF9HVChxLVx1MDAzZXJpb3MsIDAsIFwmIzM0O3Jpb3NcJiMzNDspO1xuJiM0MztcdH1cbiYjNDM7XHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcJiMzNDtjZ3JvdXBfaXRlcl9pb19fZGV2XCYjMzQ7KSlcbiYjNDM7XHRcdEFTU0VSVF9HVChxLVx1MDAzZWRldiwgMCwgXCYjMzQ7ZGV2XCYjMzQ7KTtcbiYjNDM7XG4mIzQzO1x0LyogQ29tcGFyZSB3aXRoIGlvLnN0YXQgd2l0aG91dCBJL08gYmV0d2VlbiB0aGUgcmVhZHMuICovXG4mIzQzO1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCYjMzQ7Y2dyb3VwX2l0ZXJfaW9fX21hdGNoXCYjMzQ7KSkge1xuJiM0MztcdFx0c3RydWN0IGlvX3F1ZXJ5IGZpbGV2ID0ge307XG4mIzQzO1xuJiM0MztcdFx0aWYgKEFTU0VSVF9PSyhyZWFkX3N0YXRzKGxpbmspLCBcJiMzNDtyZWFkIHN0YXRzXCYjMzQ7KSBcdTAwMjZcdTAwMjZcbiYjNDM7XHRcdCAgICBBU1NFUlRfT0socGFyc2VfaW9fc3RhdChjZ3JvdXBfZmQsIHEtXHUwMDNlZGV2LCBcdTAwMjZmaWxldiksXG4mIzQzO1x0XHRcdCAgICAgIFwmIzM0O3BhcnNlIGlvLnN0YXRcJiMzNDspKSB7XG4mIzQzO1x0XHRcdEFTU0VSVF9FUShxLVx1MDAzZXJieXRlcywgZmlsZXYucmJ5dGVzLCBcJiMzNDtyYnl0ZXNcJiMzNDspO1xuJiM0MztcdFx0XHRBU1NFUlRfRVEocS1cdTAwM2V3Ynl0ZXMsIGZpbGV2LndieXRlcywgXCYjMzQ7d2J5dGVzXCYjMzQ7KTtcbiYjNDM7XHRcdFx0QVNTRVJUX0VRKHEtXHUwMDNlcmlvcywgZmlsZXYucmlvcywgXCYjMzQ7cmlvc1wmIzM0Oyk7XG4mIzQzO1x0XHRcdEFTU0VSVF9FUShxLVx1MDAzZXdpb3MsIGZpbGV2Lndpb3MsIFwmIzM0O3dpb3NcJiMzNDspO1xuJiM0MztcdFx0XHRBU1NFUlRfRVEocS1cdTAwM2VkYnl0ZXMsIGZpbGV2LmRieXRlcywgXCYjMzQ7ZGJ5dGVzXCYjMzQ7KTtcbiYjNDM7XHRcdFx0QVNTRVJUX0VRKHEtXHUwMDNlZGlvcywgZmlsZXYuZGlvcywgXCYjMzQ7ZGlvc1wmIzM0Oyk7XG4mIzQzO1x0XHR9XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHQvKiBSb290IHN0YXRpc3RpY3MgaW5jbHVkZSB0aGlzIGNncm91cCYjMzk7cyBJL08uICovXG4mIzQzO1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCYjMzQ7Y2dyb3VwX2l0ZXJfaW9fX3Jvb3RcJiMzNDspKSB7XG4mIzQzO1x0XHRzdHJ1Y3QgYnBmX2xpbmsgKnJvb3RfbGluaztcbiYjNDM7XHRcdHN0cnVjdCBpb19xdWVyeSAqcjtcbiYjNDM7XG4mIzQzO1x0XHRza2VsLVx1MDAzZWRhdGFfcXVlcnktXHUwMDNlZ290X3Jvb3RfY3NzID0gMDtcbiYjNDM7XHRcdHJvb3RfbGluayA9IGJwZl9wcm9ncmFtX19hdHRhY2hfaXRlcihza2VsLVx1MDAzZXByb2dzLmNncm91cF9yb290X2lvX3F1ZXJ5LFxuJiM0MztcdFx0XHRcdFx0XHQgICAgIFx1MDAyNm9wdHMpO1xuJiM0MztcdFx0aWYgKEFTU0VSVF9PS19QVFIocm9vdF9saW5rLCBcJiMzNDthdHRhY2ggcm9vdCBpdGVyXCYjMzQ7KSkge1xuJiM0MztcdFx0XHRpZiAoQVNTRVJUX09LKHJlYWRfc3RhdHMocm9vdF9saW5rKSwgXCYjMzQ7cmVhZCByb290IHN0YXRzXCYjMzQ7KSkge1xuJiM0MztcdFx0XHRcdHIgPSBcdTAwMjZza2VsLVx1MDAzZWRhdGFfcXVlcnktXHUwMDNlcm9vdF9xdWVyeTtcbiYjNDM7XHRcdFx0XHRBU1NFUlRfRVEoc2tlbC1cdTAwM2VkYXRhX3F1ZXJ5LVx1MDAzZWdvdF9yb290X2NzcywgMSxcbiYjNDM7XHRcdFx0XHRcdCAgXCYjMzQ7Z290X3Jvb3RfY3NzXCYjMzQ7KTtcbiYjNDM7XHRcdFx0XHRBU1NFUlRfRVEoci1cdTAwM2VkZXYsIHEtXHUwMDNlZGV2LCBcJiMzNDtyb290IGRldlwmIzM0Oyk7XG4mIzQzO1x0XHRcdFx0QVNTRVJUX0dFKHItXHUwMDNld2J5dGVzLCBxLVx1MDAzZXdieXRlcywgXCYjMzQ7cm9vdCB3Ynl0ZXNcJiMzNDspO1xuJiM0MztcdFx0XHRcdEFTU0VSVF9HRShyLVx1MDAzZXdpb3MsIHEtXHUwMDNld2lvcywgXCYjMzQ7cm9vdCB3aW9zXCYjMzQ7KTtcbiYjNDM7XHRcdFx0XHRBU1NFUlRfR0Uoci1cdTAwM2VyYnl0ZXMsIHEtXHUwMDNlcmJ5dGVzLCBcJiMzNDtyb290IHJieXRlc1wmIzM0Oyk7XG4mIzQzO1x0XHRcdFx0QVNTRVJUX0dFKHItXHUwMDNlcmlvcywgcS1cdTAwM2VyaW9zLCBcJiMzNDtyb290IHJpb3NcJiMzNDspO1xuJiM0MztcdFx0XHR9XG4mIzQzO1x0XHRcdGJwZl9saW5rX19kZXN0cm95KHJvb3RfbGluayk7XG4mIzQzO1x0XHR9XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7Y2xlYW51cF9saW5rOlxuJiM0MztcdGJwZl9saW5rX19kZXN0cm95KGxpbmspO1xuJiM0MztjbGVhbnVwX3NrZWw6XG4mIzQzO1x0Y2dyb3VwX2l0ZXJfaW9fX2Rlc3Ryb3koc2tlbCk7XG4mIzQzO2NsZWFudXBfbG9vcDpcbiYjNDM7XHRsb29wX3RlYXJkb3duKGxvb3BfcGF0aCwgY3RsX2ZkLCBsb29wX2ZkLCBiYWNrX2ZkKTtcbiYjNDM7Y2xlYW51cF9jZ3JvdXBfZmQ6XG4mIzQzO1x0Y2xvc2UoY2dyb3VwX2ZkKTtcbiYjNDM7XHRjbGVhbnVwX2Nncm91cF9lbnZpcm9ubWVudCgpO1xuJiM0Mzt9XG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL2Nncm91cF9pdGVyX2lvLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvY2dyb3VwX2l0ZXJfaW8uY1xubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAuLjJjZDUzODA2ODk4N2Fcbi0tLSAvZGV2L251bGxcbiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9jZ3JvdXBfaXRlcl9pby5jXG5AQCAtMCwwICYjNDM7MSw5OSBAQFxuJiM0MzsvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxuJiM0MzsvKiBDb3B5cmlnaHQgKGMpIDIwMjUgTWV0YSBQbGF0Zm9ybXMsIEluYy4gYW5kIGFmZmlsaWF0ZXMuICovXG4mIzQzOyNpbmNsdWRlIFx1MDAzY3ZtbGludXguaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NicGYvYnBmX2hlbHBlcnMuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NicGYvYnBmX2NvcmVfcmVhZC5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFwmIzM0O2JwZl9leHBlcmltZW50YWwuaFwmIzM0O1xuJiM0MzsjaW5jbHVkZSBcJiMzNDtjZ3JvdXBfaXRlcl9pby5oXCYjMzQ7XG4mIzQzO1xuJiM0MztjaGFyIF9saWNlbnNlW10gU0VDKFwmIzM0O2xpY2Vuc2VcJiMzNDspID0gXCYjMzQ7R1BMXCYjMzQ7O1xuJiM0MztcbiYjNDM7c3RydWN0IGlvX3F1ZXJ5IGlvX3F1ZXJ5IFNFQyhcJiMzNDsuZGF0YS5xdWVyeVwmIzM0Oyk7XG4mIzQzO1xuJiM0MztzdHJ1Y3QgaW9fcXVlcnkgcm9vdF9xdWVyeSBTRUMoXCYjMzQ7LmRhdGEucXVlcnlcJiMzNDspO1xuJiM0MztcbiYjNDM7X191NjQgZ290X3Jvb3RfY3NzIFNFQyhcJiMzNDsuZGF0YS5xdWVyeVwmIzM0Oyk7XG4mIzQzO1xuJiM0MzsvKiBEZXZpY2Ugc2VsZWN0ZWQgYnkgdXNlcnNwYWNlIGluIGtlcm5lbCBkZXZfdCBmb3JtYXQuICovXG4mIzQzO19fdTY0IHRhcmdldF9kZXYgU0VDKFwmIzM0Oy5kYXRhLnF1ZXJ5XCYjMzQ7KTtcbiYjNDM7XG4mIzQzOy8qIEtlZXAgaW5saW5lOiBSQ1UgYW5kIG9wZW4tY29kZWQgaXRlcmF0b3JzIGNhbm5vdCBjcm9zcyBhIEJQRiBjYWxsLiAqL1xuJiM0MztzdGF0aWMgX19hbHdheXNfaW5saW5lIGludCByZWFkX3RhcmdldF9kZXYoc3RydWN0IGNncm91cCAqY2dycCxcbiYjNDM7XHRcdFx0XHRcdCAgIHN0cnVjdCBpb19xdWVyeSAqb3V0KVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IGNncm91cF9zdWJzeXNfc3RhdGUgKmNzcztcbiYjNDM7XHRzdHJ1Y3QgYmxrY2dfZ3EgKnBvcztcbiYjNDM7XHRfX3U2NCBkZXY7XG4mIzQzO1x0aW50IHNzaWQ7XG4mIzQzO1xuJiM0MztcdC8qIFRoZSBmbHVzaCBjYW4gc2xlZXAsIHNvIHJ1biBpdCBiZWZvcmUgdGhlIFJDVSBzZWN0aW9uLiAqL1xuJiM0MztcdGJwZl9ibGtjZ19mbHVzaF9zdGF0cyhjZ3JwKTtcbiYjNDM7XG4mIzQzO1x0YnBmX3JjdV9yZWFkX2xvY2soKTtcbiYjNDM7XHRzc2lkID0gYnBmX2NvcmVfZW51bV92YWx1ZShlbnVtIGNncm91cF9zdWJzeXNfaWQsIGlvX2NncnBfaWQpO1xuJiM0MztcbiYjNDM7XHQvKlxuJiM0MztcdCAqIHN1YnN5c1tdIGlzIF9fcmN1LCBzbyB0aGlzIHJlYWQgZ2l2ZXMgYW4gUkNVIHBvaW50ZXIgdGhlIGl0ZXJhdG9yXG4mIzQzO1x0ICogYWNjZXB0cy4gQlBGX0NPUkVfUkVBRCgpIHdvdWxkIHJldHVybiBhIHBsYWluIHZhbHVlIGluc3RlYWQuXG4mIzQzO1x0ICovXG4mIzQzO1x0Y3NzID0gY2dycC1cdTAwM2VzdWJzeXNbc3NpZF07XG4mIzQzO1x0aWYgKCFjc3MpIHtcbiYjNDM7XHRcdGJwZl9yY3VfcmVhZF91bmxvY2soKTtcbiYjNDM7XHRcdHJldHVybiAwO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0YnBmX2Zvcl9lYWNoKGJsa2csIHBvcywgY3NzKSB7XG4mIzQzO1x0XHRkZXYgPSBCUEZfQ09SRV9SRUFEKHBvcywgcSwgZGlzaywgcGFydDAsIGJkX2Rldik7XG4mIzQzO1x0XHRpZiAoZGV2ICE9IHRhcmdldF9kZXYpXG4mIzQzO1x0XHRcdGNvbnRpbnVlO1xuJiM0MztcbiYjNDM7XHRcdG91dC1cdTAwM2VkZXYgPSBkZXY7XG4mIzQzO1x0XHRvdXQtXHUwMDNlcmJ5dGVzID0gQlBGX0NPUkVfUkVBRChwb3MsIGlvc3RhdC5jdXIuYnl0ZXNbQkxLR19JT1NUQVRfUkVBRF0pO1xuJiM0MztcdFx0b3V0LVx1MDAzZXdieXRlcyA9IEJQRl9DT1JFX1JFQUQocG9zLCBpb3N0YXQuY3VyLmJ5dGVzW0JMS0dfSU9TVEFUX1dSSVRFXSk7XG4mIzQzO1x0XHRvdXQtXHUwMDNlcmlvcyA9IEJQRl9DT1JFX1JFQUQocG9zLCBpb3N0YXQuY3VyLmlvc1tCTEtHX0lPU1RBVF9SRUFEXSk7XG4mIzQzO1x0XHRvdXQtXHUwMDNld2lvcyA9IEJQRl9DT1JFX1JFQUQocG9zLCBpb3N0YXQuY3VyLmlvc1tCTEtHX0lPU1RBVF9XUklURV0pO1xuJiM0MztcdFx0b3V0LVx1MDAzZWRieXRlcyA9IEJQRl9DT1JFX1JFQUQocG9zLCBpb3N0YXQuY3VyLmJ5dGVzW0JMS0dfSU9TVEFUX0RJU0NBUkRdKTtcbiYjNDM7XHRcdG91dC1cdTAwM2VkaW9zID0gQlBGX0NPUkVfUkVBRChwb3MsIGlvc3RhdC5jdXIuaW9zW0JMS0dfSU9TVEFUX0RJU0NBUkRdKTtcbiYjNDM7XHRcdGJyZWFrO1xuJiM0MztcdH1cbiYjNDM7XHRicGZfcmN1X3JlYWRfdW5sb2NrKCk7XG4mIzQzO1x0cmV0dXJuIDE7XG4mIzQzO31cbiYjNDM7XG4mIzQzO1NFQyhcJiMzNDtpdGVyLnMvY2dyb3VwXCYjMzQ7KVxuJiM0MztpbnQgY2dyb3VwX2lvX3F1ZXJ5KHN0cnVjdCBicGZfaXRlcl9fY2dyb3VwICpjdHgpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgY2dyb3VwICpjZ3JwID0gY3R4LVx1MDAzZWNncm91cDtcbiYjNDM7XG4mIzQzO1x0aWYgKCFjZ3JwKVxuJiM0MztcdFx0cmV0dXJuIDE7XG4mIzQzO1xuJiM0MztcdC8qIFN0YXJ0IGZyZXNoIHNvIGEgZGV2aWNlIHRoYXQgaXMgbm90IGZvdW5kIHN0YXlzIGFsbC16ZXJvLiAqL1xuJiM0MztcdF9fYnVpbHRpbl9tZW1zZXQoXHUwMDI2aW9fcXVlcnksIDAsIHNpemVvZihpb19xdWVyeSkpO1xuJiM0MztcbiYjNDM7XHRyZWFkX3RhcmdldF9kZXYoY2dycCwgXHUwMDI2aW9fcXVlcnkpO1xuJiM0MztcdHJldHVybiAwO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztTRUMoXCYjMzQ7aXRlci5zL2Nncm91cFwmIzM0OylcbiYjNDM7aW50IGNncm91cF9yb290X2lvX3F1ZXJ5KHN0cnVjdCBicGZfaXRlcl9fY2dyb3VwICpjdHgpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgY2dyb3VwICpyb290O1xuJiM0MztcbiYjNDM7XHRpZiAoIWN0eC1cdTAwM2VjZ3JvdXApXG4mIzQzO1x0XHRyZXR1cm4gMTtcbiYjNDM7XG4mIzQzO1x0X19idWlsdGluX21lbXNldChcdTAwMjZyb290X3F1ZXJ5LCAwLCBzaXplb2Yocm9vdF9xdWVyeSkpO1xuJiM0MztcbiYjNDM7XHQvKiBUaGUgcm9vdCBjZ3JvdXAgYWx3YXlzIGhhcyBpZCAxLiAqL1xuJiM0MztcdHJvb3QgPSBicGZfY2dyb3VwX2Zyb21faWQoMSk7XG4mIzQzO1x0aWYgKCFyb290KVxuJiM0MztcdFx0cmV0dXJuIDA7XG4mIzQzO1xuJiM0MztcdC8qIFJvb3QgY291bnRlcnMgaW5jbHVkZSBhbGwgY2dyb3VwcyYjMzk7IEkvTy4gKi9cbiYjNDM7XHRpZiAocmVhZF90YXJnZXRfZGV2KHJvb3QsIFx1MDAyNnJvb3RfcXVlcnkpKVxuJiM0MztcdFx0Z290X3Jvb3RfY3NzID0gMTtcbiYjNDM7XG4mIzQzO1x0YnBmX2Nncm91cF9yZWxlYXNlKHJvb3QpO1xuJiM0MztcdHJldHVybiAwO1xuJiM0Mzt9XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Mi8xPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTcgMjI6MzQ8L3RkPgoJCQk8dGQ+YWdlbnQ8L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+YmVzdC1leHBlbnNpdmU8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0JMS19DR1JPVVAmIzM0OywKICAgICYjMzQ7QlBGX1NZU0NBTEwmIzM0OywKICAgICYjMzQ7Q0dST1VQUyYjMzQ7LAogICAgJiMzNDtCTE9DSyYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O2JwZl9ibGtjZ19mbHVzaF9zdGF0cyYjMzQ7LAogICAgJiMzNDticGZfaXRlcl9ibGtnX25ldyYjMzQ7LAogICAgJiMzNDticGZfaXRlcl9ibGtnX25leHQmIzM0OywKICAgICYjMzQ7YnBmX2l0ZXJfYmxrZ19kZXN0cm95JiMzNDssCiAgICAmIzM0O2Jsa2NnX2ZpbGxfcm9vdF9pb3N0YXRzJiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIGludHJvZHVjZXMgbmV3IEJQRiBrZnVuY3MgZm9yIGJsb2NrIGNncm91cCBJL08gc3RhdGlzdGljcywgd2hpY2ggYXJlIHJlYWNoYWJsZSBmcm9tIEJQRiBwcm9ncmFtcy4gVGhlc2UgZnVuY3Rpb25zIGFsbG93IEJQRiBwcm9ncmFtcyB0byBmbHVzaCBibG9jayBjZ3JvdXAgc3RhdHMgYW5kIGl0ZXJhdGUgb3ZlciBwZXItZGV2aWNlIGJsa2dzLiBUaGUgY2hhbmdlcyBhcmUgZnVuY3Rpb25hbGx5IHNpZ25pZmljYW50IGFuZCBzaG91bGQgYmUgZnV6emVkLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+SW5zdHJ1Y3Rpb246PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Zb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgbWFpbnRhaW5lci4KWW91ciBqb2IgaXMgdG8gcmV2aWV3IGEgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZCBkZXRlcm1pbmUKaWYgaXQgbWFrZXMgZnVuY3Rpb25hbCBjaGFuZ2VzIHRvIHRoZSBrZXJuZWwgdGhhdCBzaG91bGQgYmUgZnV6emVkLgoKSU1QT1JUQU5UOiBUaGUgY2hhbmdlcyBoYXZlIEFMUkVBRFkgYmVlbiBhcHBsaWVkIGFuZCBjb21taXR0ZWQgYXMgdGhlIEhFQUQgY29tbWl0IGluCnlvdXIgd29ya3NwYWNlLiBEbyBOT1QgcmVseSBvbiB5b3VyIGludGVybmFsIGtub3dsZWRnZSBvZiB0aGUga2VybmVsLiBZb3UgbXVzdCBhY3RpdmVseQp1c2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBleGFtaW5lIHRoZSBhY3R1YWwgc291cmNlIGNvZGUgYW5kIGNvbmZpcm0gYW55IGFzc3VtcHRpb25zLgoKUmV0dXJuIFdvcnRoRnV6emluZz1mYWxzZSBpZiB0aGUgcGF0Y2ggb25seSBjb250YWluczoKLSBNb2RpZmljYXRpb25zIHRvIERvY3VtZW50YXRpb24vLCBLY29uZmlnIGZpbGVzLCBvciBjb2RlIGNvbW1lbnRzLgotIFB1cmVseSBkZWNvcmF0aXZlIGNoYW5nZXMsIHN1Y2ggYXMgbG9nZ2luZyAoZS5nLiwgcHJfZXJyLCBwcmludGspIG9yIHRyYWNlcG9pbnRzLgotIENoYW5nZXMgdG8gbnVtZXJpYyBjb25zdGFudHMgb3IgbWFjcm9zIHRoYXQgZG8gbm90IGZ1bmN0aW9uYWxseSBhbHRlciBleGVjdXRpb24gZmxvdy4KLSBDb2RlIHBhdGhzIHRoYXQgYXJlIGltcG9zc2libGUgdG8gcmVhY2ggaW4gdmlydHVhbGl6ZWQgZW52aXJvbm1lbnRzIGxpa2UgR0NFIG9yIFFFTVUsCiAgZXZlbiB3aGVuIHV0aWxpemluZyBzb2Z0d2FyZS1lbXVsYXRlZCBoYXJkd2FyZSAoZS5nLiwgdXNiIGdhZGdldCwgbWFjODAyMTFfaHdzaW0pLgotIENvZGUgaW4gdmVuZG9yLXNwZWNpZmljIFBDSWUgc3dpdGNoLCBTbWFydE5JQywgb3IgR1BVIGRyaXZlcnMgKGUuZy4sIG1seHN3LCBwZHNfY29yZSwgcWVkLAogIGlvbmljLCBhbWRncHUpIHRoYXQgcmVxdWlyZSBwaHlzaWNhbCBQQ0llIGhhcmR3YXJlIGNhcmRzIG5vdCBlbXVsYXRlZCBpbiBzdGFuZGFyZCBRRU1VLgotIERyaXZlciAucmVtb3ZlLCAuc2h1dGRvd24sIG9yIHBjaV91bnJlZ2lzdGVyX2RyaXZlciB0ZWFyZG93biBjYWxsYmFja3MgKGUuZy4sIGlnYl9yZW1vdmUpCiAgdGhhdCBhcmUgZXhlY3V0ZWQgb25seSBkdXJpbmcgUENJIGhvdC11bnBsdWcgb3Igc3lzZnMgZHJpdmVyIHVuYmluZCBvcGVyYXRpb25zLgoKSWYgaXQgbW9kaWZpZXMgcmVhY2hhYmxlIGNvcmUga2VybmVsIGxvZ2ljLCBkcml2ZXJzLCBvciBhcmNoaXRlY3R1cmVzLCB1c2UgeW91ciBjb2RlIHNlYXJjaAp0b29scyB0byB2ZXJpZnkgdGhlIGNvZGUgY2FuIGJlIGV4ZWN1dGVkLCB0aGVuIHJldHVybiBXb3J0aEZ1enppbmc9dHJ1ZS4KCldoZW4gcmV0dXJuaW5nIFdvcnRoRnV6emluZz10cnVlLCB5b3UgTVVTVCBBTFNPOgoxLiBFeHRyYWN0IGFueSBzcGVjaWZpYyBrZXJuZWwgZnVuY3Rpb25zIHRoYXQgc2hvdWxkIGJlIGhlYXZpbHkgZnV6emVkIGludG8gRm9jdXNTeW1ib2xzLgogICBBdm9pZCBsaXN0aW5nIGdlbmVyaWMgaG90LXBhdGggZnVuY3Rpb25zIHRvIHByZXZlbnQgc2tld2VkIHRlc3QgZGlzdHJpYnV0aW9ucy4KICAgUHJlZmVyIG5vbi1zdGF0aWMsIG5vbi1pbmxpbmVkIEFQSSBlbnRyeXBvaW50IGZ1bmN0aW9ucyBvdmVyIGludGVybmFsIHN0YXRpYyBoZWxwZXIgZnVuY3Rpb25zCiAgICh3aGljaCBhcmUgaW5saW5lZCBieSB0aGUgY29tcGlsZXIgYW5kIGRvIG5vdCBoYXZlIGRpc3RpbmN0IHN5bWJvbCBhZGRyZXNzZXMpLgoyLiBJZGVudGlmeSBhbnkgc3BlY2lmaWMgQ09ORklHXyBvcHRpb25zIHJlcXVpcmVkIHRvIHByb3Blcmx5IHRlc3QgdGhpcyBuZXcvbW9kaWZpZWQgZmVhdHVyZS4KICAgR28gYW5kIGxvb2sgaW50byB0aGUgS2NvbmZpZyBmaWxlcyBhbmQgY2hlY2sgZm9yIGlmZGVmcyBhcm91bmQgdGhlIGNvZGUsIGRvIG5vdCBtYWtlIGFzc3VtcHRpb25zLgogICBBbHNvIGNoZWNrICYjMzQ7ZGVwZW5kcyBvbiYjMzQ7IGxpbmVzIGluIEtjb25maWcgdG8gaW5jbHVkZSBhbnkgbm9uLXN0YW5kYXJkIHBhcmVudCBzdWJzeXN0ZW0gY29uZmlncwogICBuZWVkZWQgZm9yIEtidWlsZCB0byBjb21waWxlIHRoZSBjb2RlIHN0YXRpY2FsbHkgaW50byB2bWxpbnV4LiBMaXN0IHRoZW0gaW4gdGhlIEVuYWJsZUNvbmZpZ3MKICAgb3V0cHV0IGFycmF5LCBhbmQgRE8gTk9UIGFkZCBhICYjMzk7Q09ORklHXyYjMzk7IHByZWZpeCAoZS5nLiwgcmV0dXJuICYjMzQ7TkVUX0lQVjQmIzM0OyBpbnN0ZWFkIG9mICYjMzQ7Q09ORklHX05FVF9JUFY0JiMzNDspLgpQcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy4KCgpVc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLgpJdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS4KSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlByb21wdDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOgpjb21taXQgNzczMDAzNjNmZTljNWIwYWZjMzZkOWY3NGVhZGI0MWJhNmRkNTNhNQpBdXRob3I6IHN5ei1jbHVzdGVyICZsdDt0cmlhZ2VAc3l6a2FsbGVyLmNvbSZndDsKRGF0ZTogICBNb24gQXVnIDE3IDIyOjM0OjMyIDIwMjYgJiM0MzswMDAwCgogICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3CgpkaWZmIC0tZ2l0IGEvTUFJTlRBSU5FUlMgYi9NQUlOVEFJTkVSUwppbmRleCAyZjk0NzJjMWEwOTA3Li44N2M1NmU5NTU1NzcxIDEwMDY0NAotLS0gYS9NQUlOVEFJTkVSUwomIzQzOyYjNDM7JiM0MzsgYi9NQUlOVEFJTkVSUwpAQCAtNjYxNyw2ICYjNDM7NjYxNyw3IEBAIEY6CWJsb2NrL2Jsay1jZ3JvdXAuYwogRjoJYmxvY2svYmxrLWlvY29zdC5jCiBGOglibG9jay9ibGstaW9sYXRlbmN5LmMKIEY6CWJsb2NrL2Jsay10aHJvdHRsZS5jCiYjNDM7RjoJYmxvY2svYnBmX2Jsa2NnLmMKIEY6CWluY2x1ZGUvbGludXgvYmxrLWNncm91cC5oCiAKIENPTlRST0wgR1JPVVAgLSBDUFVTRVQKZGlmZiAtLWdpdCBhL2Jsb2NrL01ha2VmaWxlIGIvYmxvY2svTWFrZWZpbGUKaW5kZXggZTdiZDMyMGUzZDY5Ny4uNTcyZTQ5OTg4YzhlZSAxMDA2NDQKLS0tIGEvYmxvY2svTWFrZWZpbGUKJiM0MzsmIzQzOyYjNDM7IGIvYmxvY2svTWFrZWZpbGUKQEAgLTE3LDYgJiM0MzsxNyw5IEBAIG9iai0kKENPTkZJR19CTEtfRVJST1JfSU5KRUNUSU9OKSAmIzQzOz0gZXJyb3ItaW5qZWN0aW9uLm8KIG9iai0kKENPTkZJR19CTEtfREVWX0JTR19DT01NT04pICYjNDM7PSBic2cubwogb2JqLSQoQ09ORklHX0JMS19ERVZfQlNHTElCKQkmIzQzOz0gYnNnLWxpYi5vCiBvYmotJChDT05GSUdfQkxLX0NHUk9VUCkJJiM0Mzs9IGJsay1jZ3JvdXAubwomIzQzO2lmZGVmIENPTkZJR19CUEZfU1lTQ0FMTAomIzQzO29iai0kKENPTkZJR19CTEtfQ0dST1VQKQkmIzQzOz0gYnBmX2Jsa2NnLm8KJiM0MztlbmRpZgogb2JqLSQoQ09ORklHX0JMS19DR1JPVVBfUldTVEFUKQkmIzQzOz0gYmxrLWNncm91cC1yd3N0YXQubwogb2JqLSQoQ09ORklHX0JMS19DR1JPVVBfRkNfQVBQSUQpICYjNDM7PSBibGstY2dyb3VwLWZjLWFwcGlkLm8KIG9iai0kKENPTkZJR19CTEtfREVWX1RIUk9UVExJTkcpCSYjNDM7PSBibGstdGhyb3R0bGUubwpkaWZmIC0tZ2l0IGEvYmxvY2svYmxrLWNncm91cC5jIGIvYmxvY2svYmxrLWNncm91cC5jCmluZGV4IGQ5Njc2MTI2YzViNWQuLjhkNTM4YWQ0ZTg2MWMgMTAwNjQ0Ci0tLSBhL2Jsb2NrL2Jsay1jZ3JvdXAuYwomIzQzOyYjNDM7JiM0MzsgYi9ibG9jay9ibGstY2dyb3VwLmMKQEAgLTEwODYsNyAmIzQzOzEwODYsNyBAQCBzdGF0aWMgdm9pZCBibGtjZ19yc3RhdF9mbHVzaChzdHJ1Y3QgY2dyb3VwX3N1YnN5c19zdGF0ZSAqY3NzLCBpbnQgY3B1KQogICogZmx1c2hpbmcgdGhlIHJvb3QgY2dyb3VwJiMzOTtzIHN0YXRzIGJ5IGV4cGxpY2l0bHkgZmlsbGluZyBpbiB0aGUgaW9zdGF0CiAgKiB3aXRoIGRpc2sgbGV2ZWwgc3RhdGlzdGljcy4KICAqLwotc3RhdGljIHZvaWQgYmxrY2dfZmlsbF9yb290X2lvc3RhdHModm9pZCkKJiM0Mzt2b2lkIGJsa2NnX2ZpbGxfcm9vdF9pb3N0YXRzKHZvaWQpCiB7CiAJc3RydWN0IGNsYXNzX2Rldl9pdGVyIGl0ZXI7CiAJc3RydWN0IGRldmljZSAqZGV2OwpkaWZmIC0tZ2l0IGEvYmxvY2svYmxrLWNncm91cC5oIGIvYmxvY2svYmxrLWNncm91cC5oCmluZGV4IDYxNTM5MGY3NTFhYTIuLjhjOWMyYTFhZGZhYTQgMTAwNjQ0Ci0tLSBhL2Jsb2NrL2Jsay1jZ3JvdXAuaAomIzQzOyYjNDM7JiM0MzsgYi9ibG9jay9ibGstY2dyb3VwLmgKQEAgLTIwNSw2ICYjNDM7MjA1LDcgQEAgdm9pZCBibGtjZ19kZWFjdGl2YXRlX3BvbGljeShzdHJ1Y3QgZ2VuZGlzayAqZGlzaywKIAkJCSAgICAgY29uc3Qgc3RydWN0IGJsa2NnX3BvbGljeSAqcG9sKTsKIAogY29uc3QgY2hhciAqYmxrZ19kZXZfbmFtZShzdHJ1Y3QgYmxrY2dfZ3EgKmJsa2cpOwomIzQzO3ZvaWQgYmxrY2dfZmlsbF9yb290X2lvc3RhdHModm9pZCk7CiB2b2lkIGJsa2NnX3ByaW50X2Jsa2dzKHN0cnVjdCBzZXFfZmlsZSAqc2YsIHN0cnVjdCBibGtjZyAqYmxrY2csCiAJCSAgICAgICB1NjQgKCpwcmZpbGwpKHN0cnVjdCBzZXFfZmlsZSAqLAogCQkJCSAgICAgc3RydWN0IGJsa2dfcG9saWN5X2RhdGEgKiwgaW50KSwKZGlmZiAtLWdpdCBhL2Jsb2NrL2JwZl9ibGtjZy5jIGIvYmxvY2svYnBmX2Jsa2NnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMC4uMjVjODA5ZjUwOTFjMgotLS0gL2Rldi9udWxsCiYjNDM7JiM0MzsmIzQzOyBiL2Jsb2NrL2JwZl9ibGtjZy5jCkBAIC0wLDAgJiM0MzsxLDE1NCBAQAomIzQzOy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9yLWxhdGVyCiYjNDM7LyoKJiM0MzsgKiBCbG9jayBJL08gQ29udHJvbGxlci1yZWxhdGVkIEJQRiBrZnVuY3MgYW5kIGF1eGlsaWFyeSBjb2RlCiYjNDM7ICovCiYjNDM7CiYjNDM7I2luY2x1ZGUgJiMzNDtibGstY2dyb3VwLmgmIzM0OwomIzQzOwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9icGYuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvYnRmX2lkcy5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9yY3VsaXN0LmgmZ3Q7CiYjNDM7CiYjNDM7X19icGZfa2Z1bmNfc3RhcnRfZGVmcygpOwomIzQzOwomIzQzOy8qKgomIzQzOyAqIGJwZl9ibGtjZ19mbHVzaF9zdGF0cyAtIEZsdXNoIGEgYmxvY2sgY2dyb3VwJiMzOTtzIGlvIHN0YXRpc3RpY3MKJiM0MzsgKiBAY2dycDogY2dyb3VwIHRvIGZsdXNoCiYjNDM7ICoKJiM0MzsgKiBQcm9wYWdhdGUgSS9PIHN0YXRpc3RpY3MgdXAgdGhlIGNncm91cCB0cmVlLiBSb290IHN0YXRpc3RpY3MgY29tZSBmcm9tCiYjNDM7ICogYmxvY2sgZGV2aWNlcyBhbmQgaW5jbHVkZSBhbGwgY2dyb3VwcyYjMzk7IEkvTy4KJiM0MzsgKi8KJiM0MztfX2JwZl9rZnVuYyB2b2lkIGJwZl9ibGtjZ19mbHVzaF9zdGF0cyhzdHJ1Y3QgY2dyb3VwICpjZ3JwKQomIzQzO3sKJiM0MzsJc3RydWN0IGNncm91cF9zdWJzeXNfc3RhdGUgKmNzczsKJiM0MzsKJiM0MzsJLyogUGluIHRoZSBjc3MgZm9yIHRoZSBzbGVlcGFibGUgZmx1c2guICovCiYjNDM7CXJjdV9yZWFkX2xvY2soKTsKJiM0MzsJY3NzID0gY2dyb3VwX2NzcyhjZ3JwLCAmYW1wO2lvX2NncnBfc3Vic3lzKTsKJiM0MzsJaWYgKGNzcyAmYW1wOyZhbXA7ICFjc3NfdHJ5Z2V0KGNzcykpCiYjNDM7CQljc3MgPSBOVUxMOwomIzQzOwlyY3VfcmVhZF91bmxvY2soKTsKJiM0MzsKJiM0MzsJaWYgKCFjc3MpCiYjNDM7CQlyZXR1cm47CiYjNDM7CiYjNDM7CWlmICghY3NzLSZndDtwYXJlbnQpCiYjNDM7CQlibGtjZ19maWxsX3Jvb3RfaW9zdGF0cygpOwomIzQzOwllbHNlCiYjNDM7CQljc3NfcnN0YXRfZmx1c2goY3NzKTsKJiM0MzsKJiM0MzsJY3NzX3B1dChjc3MpOwomIzQzO30KJiM0MzsKJiM0MztzdHJ1Y3QgYnBmX2l0ZXJfYmxrZyB7CiYjNDM7CV9fdTY0IF9fb3BhcXVlWzJdOwomIzQzO30gX19hbGlnbmVkKDgpOwomIzQzOwomIzQzO3N0cnVjdCBicGZfaXRlcl9ibGtnX2tlcm4gewomIzQzOwlzdHJ1Y3QgYmxrY2cgKmJsa2NnOwomIzQzOwlzdHJ1Y3QgYmxrY2dfZ3EgKnBvczsKJiM0Mzt9IF9fYWxpZ25lZCg4KTsKJiM0MzsKJiM0MzsvKioKJiM0MzsgKiBicGZfaXRlcl9ibGtnX25ldyAtIFN0YXJ0IGl0ZXJhdGluZyBhIGJsb2NrIGNncm91cCYjMzk7cyBwZXItZGV2aWNlIGJsa2dzCiYjNDM7ICogQGl0OiBpdGVyYXRvciB0byBpbml0aWFsaXplCiYjNDM7ICogQGNzczogdGhlIGlvIGNvbnRyb2xsZXImIzM5O3MgY3NzCiYjNDM7ICoKJiM0MzsgKiBFYWNoIGJsa2cgaG9sZHMgb25lIGRldmljZSYjMzk7cyBpby5zdGF0IGNvdW50ZXJzLiBPZmZsaW5lIGJsa2dzIGFyZSBza2lwcGVkLgomIzQzOyAqIEEgYmxrZyB3aXRob3V0IGEgZGlzayBjYW4gYmUgcmV0dXJuZWQuIE11c3QgcnVuIHVuZGVyIFJDVS4KJiM0MzsgKgomIzQzOyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCAtRUlOVkFMIGlmIEBjc3MgaXMgbm90IHRoZSBpbyBjb250cm9sbGVyJiMzOTtzLgomIzQzOyAqLwomIzQzO19fYnBmX2tmdW5jIGludCBicGZfaXRlcl9ibGtnX25ldyhzdHJ1Y3QgYnBmX2l0ZXJfYmxrZyAqaXQsCiYjNDM7CQkJCSAgc3RydWN0IGNncm91cF9zdWJzeXNfc3RhdGUgKmNzcykKJiM0Mzt7CiYjNDM7CXN0cnVjdCBicGZfaXRlcl9ibGtnX2tlcm4gKmtpdCA9ICh2b2lkICopaXQ7CiYjNDM7CiYjNDM7CUJVSUxEX0JVR19PTihzaXplb2Yoc3RydWN0IGJwZl9pdGVyX2Jsa2dfa2VybikgJmd0OyBzaXplb2Yoc3RydWN0IGJwZl9pdGVyX2Jsa2cpKTsKJiM0MzsJQlVJTERfQlVHX09OKF9fYWxpZ25vZl9fKHN0cnVjdCBicGZfaXRlcl9ibGtnX2tlcm4pICE9CiYjNDM7CQkgICAgIF9fYWxpZ25vZl9fKHN0cnVjdCBicGZfaXRlcl9ibGtnKSk7CiYjNDM7CiYjNDM7CWtpdC0mZ3Q7cG9zID0gTlVMTDsKJiM0MzsKJiM0MzsJaWYgKGNzcy0mZ3Q7c3MgIT0gJmFtcDtpb19jZ3JwX3N1YnN5cykgewomIzQzOwkJa2l0LSZndDtibGtjZyA9IE5VTEw7CiYjNDM7CQlyZXR1cm4gLUVJTlZBTDsKJiM0MzsJfQomIzQzOwomIzQzOwlraXQtJmd0O2Jsa2NnID0gY3NzX3RvX2Jsa2NnKGNzcyk7CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MzsKJiM0MzsvKioKJiM0MzsgKiBicGZfaXRlcl9ibGtnX25leHQgLSBSZXR1cm4gdGhlIG5leHQgb25saW5lIGJsa2cgb2YgdGhlIGl0ZXJhdGVkIGJsb2NrIGNncm91cAomIzQzOyAqIEBpdDogaXRlcmF0b3IKJiM0MzsgKgomIzQzOyAqIFJldHVybjogdGhlIG5leHQgb25saW5lIGJsa2csIG9yIE5VTEwgd2hlbiB0aGUgd2FsayBpcyBkb25lLgomIzQzOyAqLwomIzQzO19fYnBmX2tmdW5jIHN0cnVjdCBibGtjZ19ncSAqYnBmX2l0ZXJfYmxrZ19uZXh0KHN0cnVjdCBicGZfaXRlcl9ibGtnICppdCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBicGZfaXRlcl9ibGtnX2tlcm4gKmtpdCA9ICh2b2lkICopaXQ7CiYjNDM7CXN0cnVjdCBibGtjZ19ncSAqYmxrZyA9IGtpdC0mZ3Q7cG9zOwomIzQzOwlzdHJ1Y3QgaGxpc3Rfbm9kZSAqbm9kZTsKJiM0MzsKJiM0MzsJaWYgKCFraXQtJmd0O2Jsa2NnKQomIzQzOwkJcmV0dXJuIE5VTEw7CiYjNDM7CiYjNDM7CWlmICghYmxrZykKJiM0MzsJCW5vZGUgPSByY3VfZGVyZWZlcmVuY2UoaGxpc3RfZmlyc3RfcmN1KCZhbXA7a2l0LSZndDtibGtjZy0mZ3Q7YmxrZ19saXN0KSk7CiYjNDM7CWVsc2UKJiM0MzsJCW5vZGUgPSByY3VfZGVyZWZlcmVuY2UoaGxpc3RfbmV4dF9yY3UoJmFtcDtibGtnLSZndDtibGtjZ19ub2RlKSk7CiYjNDM7CiYjNDM7CS8qIFNraXAgb2ZmbGluZSBibGtncywgbWF0Y2hpbmcgaW8uc3RhdC4gKi8KJiM0MzsJd2hpbGUgKG5vZGUpIHsKJiM0MzsJCWJsa2cgPSBobGlzdF9lbnRyeShub2RlLCBzdHJ1Y3QgYmxrY2dfZ3EsIGJsa2NnX25vZGUpOwomIzQzOwkJLyogQSByYWNlIG9ubHkgY2hhbmdlcyB3aGV0aGVyIHRoaXMgYmxrZyBpcyByZXR1cm5lZC4gKi8KJiM0MzsJCWlmIChkYXRhX3JhY2UoYmxrZy0mZ3Q7b25saW5lKSkgewomIzQzOwkJCWtpdC0mZ3Q7cG9zID0gYmxrZzsKJiM0MzsJCQlyZXR1cm4gYmxrZzsKJiM0MzsJCX0KJiM0MzsJCW5vZGUgPSByY3VfZGVyZWZlcmVuY2UoaGxpc3RfbmV4dF9yY3UoJmFtcDtibGtnLSZndDtibGtjZ19ub2RlKSk7CiYjNDM7CX0KJiM0MzsKJiM0MzsJLyogVGhlIGl0ZXJhdG9yIG11c3Qga2VlcCByZXR1cm5pbmcgTlVMTCBhZnRlciBjb21wbGV0aW9uLiAqLwomIzQzOwlraXQtJmd0O3BvcyA9IE5VTEw7CiYjNDM7CWtpdC0mZ3Q7YmxrY2cgPSBOVUxMOwomIzQzOwlyZXR1cm4gTlVMTDsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoqCiYjNDM7ICogYnBmX2l0ZXJfYmxrZ19kZXN0cm95IC0gVGVhciBkb3duIGEgYmxrZyBpdGVyYXRvcgomIzQzOyAqIEBpdDogaXRlcmF0b3IKJiM0MzsgKi8KJiM0MztfX2JwZl9rZnVuYyB2b2lkIGJwZl9pdGVyX2Jsa2dfZGVzdHJveShzdHJ1Y3QgYnBmX2l0ZXJfYmxrZyAqaXQpCiYjNDM7ewomIzQzO30KJiM0MzsKJiM0MztfX2JwZl9rZnVuY19lbmRfZGVmcygpOwomIzQzOwomIzQzO0JURl9LRlVOQ1NfU1RBUlQoYnBmX2Jsa2NnX2tmdW5jcykKJiM0MztCVEZfSURfRkxBR1MoZnVuYywgYnBmX2Jsa2NnX2ZsdXNoX3N0YXRzLCBLRl9TTEVFUEFCTEUpCiYjNDM7CiYjNDM7QlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9pdGVyX2Jsa2dfbmV3LAomIzQzOwkgICAgIEtGX0lURVJfTkVXIHwgS0ZfUkNVIHwgS0ZfUkNVX1BST1RFQ1RFRCkKJiM0MztCVEZfSURfRkxBR1MoZnVuYywgYnBmX2l0ZXJfYmxrZ19uZXh0LCBLRl9JVEVSX05FWFQgfCBLRl9SRVRfTlVMTCkKJiM0MztCVEZfSURfRkxBR1MoZnVuYywgYnBmX2l0ZXJfYmxrZ19kZXN0cm95LCBLRl9JVEVSX0RFU1RST1kpCiYjNDM7QlRGX0tGVU5DU19FTkQoYnBmX2Jsa2NnX2tmdW5jcykKJiM0MzsKJiM0MztzdGF0aWMgY29uc3Qgc3RydWN0IGJ0Zl9rZnVuY19pZF9zZXQgYnBmX2Jsa2NnX2tmdW5jX3NldCA9IHsKJiM0MzsJLm93bmVyCQk9IFRISVNfTU9EVUxFLAomIzQzOwkuc2V0CQk9ICZhbXA7YnBmX2Jsa2NnX2tmdW5jcywKJiM0Mzt9OwomIzQzOwomIzQzO3N0YXRpYyBpbnQgX19pbml0IGJwZl9ibGtjZ19pbml0KHZvaWQpCiYjNDM7ewomIzQzOwlpbnQgZXJyOwomIzQzOwomIzQzOwllcnIgPSByZWdpc3Rlcl9idGZfa2Z1bmNfaWRfc2V0KEJQRl9QUk9HX1RZUEVfVU5TUEVDLAomIzQzOwkJCQkJJmFtcDticGZfYmxrY2dfa2Z1bmNfc2V0KTsKJiM0MzsJaWYgKGVycikKJiM0MzsJCXByX3dhcm4oJiMzNDtlcnJvciB3aGlsZSByZWdpc3RlcmluZyBicGYgYmxrY2cga2Z1bmNzOiAlZFxuJiMzNDssIGVycik7CiYjNDM7CiYjNDM7CXJldHVybiBlcnI7CiYjNDM7fQomIzQzO2xhdGVfaW5pdGNhbGwoYnBmX2Jsa2NnX2luaXQpOwpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL2Nncm91cF9pdGVyX2lvLmggYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvY2dyb3VwX2l0ZXJfaW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwLi5mNGJiYWFjY2RmNzE2Ci0tLSAvZGV2L251bGwKJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL2Nncm91cF9pdGVyX2lvLmgKQEAgLTAsMCAmIzQzOzEsMTcgQEAKJiM0MzsvKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMCAqLwomIzQzOy8qIENvcHlyaWdodCAoYykgMjAyNSBNZXRhIFBsYXRmb3JtcywgSW5jLiBhbmQgYWZmaWxpYXRlcy4gKi8KJiM0MzsjaWZuZGVmIF9fQ0dST1VQX0lURVJfSU9fSAomIzQzOyNkZWZpbmUgX19DR1JPVVBfSVRFUl9JT19ICiYjNDM7CiYjNDM7c3RydWN0IGlvX3F1ZXJ5IHsKJiM0MzsJLyogb25lIGRldmljZSYjMzk7cyBpby5zdGF0IGNvdW50ZXJzICovCiYjNDM7CV9fdTY0IHJieXRlczsKJiM0MzsJX191NjQgd2J5dGVzOwomIzQzOwlfX3U2NCByaW9zOwomIzQzOwlfX3U2NCB3aW9zOwomIzQzOwlfX3U2NCBkYnl0ZXM7CiYjNDM7CV9fdTY0IGRpb3M7CiYjNDM7CV9fdTY0IGRldjsJLyogZGV2X3Qgb2YgdGhlIGRldmljZSB0aGUgY291bnRlcnMgYmVsb25nIHRvICovCiYjNDM7fTsKJiM0MzsKJiM0MzsjZW5kaWYgLyogX19DR1JPVVBfSVRFUl9JT19IICovCmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvY29uZmlnIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL2NvbmZpZwppbmRleCBlYTcwNDRmMzBhZGMzLi4yNzBlNmJmOTE5NGQyIDEwMDY0NAotLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvY29uZmlnCiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9jb25maWcKQEAgLTEsMyAmIzQzOzEsNCBAQAomIzQzO0NPTkZJR19CTEtfQ0dST1VQPXkKIENPTkZJR19CTEtfREVWX0xPT1A9eQogQ09ORklHX0JPT1RQQVJBTV9IQVJETE9DS1VQX1BBTklDPXkKIENPTkZJR19CT09UUEFSQU1fU09GVExPQ0tVUF9QQU5JQz0xCmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9jZ3JvdXBfaXRlcl9pby5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvY2dyb3VwX2l0ZXJfaW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwLi41ZDI3ZTVkMjgzNzk1Ci0tLSAvZGV2L251bGwKJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvY2dyb3VwX2l0ZXJfaW8uYwpAQCAtMCwwICYjNDM7MSwyNzcgQEAKJiM0MzsvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMAomIzQzOy8qIENvcHlyaWdodCAoYykgMjAyNSBNZXRhIFBsYXRmb3JtcywgSW5jLiBhbmQgYWZmaWxpYXRlcy4gKi8KJiM0MzsjZGVmaW5lIF9HTlVfU09VUkNFCiYjNDM7I2luY2x1ZGUgJmx0O3Rlc3RfcHJvZ3MuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7YnBmL2xpYmJwZi5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtmY250bC5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9sb29wLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N0ZGxpYi5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtzdHJpbmcuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7c3lzL2lvY3RsLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N5cy9zdGF0LmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N5cy9zeXNtYWNyb3MuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7dW5pc3RkLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJiMzNDtjZ3JvdXBfaGVscGVycy5oJiMzNDsKJiM0MzsjaW5jbHVkZSAmIzM0O2Nncm91cF9pdGVyX2lvLmgmIzM0OwomIzQzOyNpbmNsdWRlICYjMzQ7Y2dyb3VwX2l0ZXJfaW8uc2tlbC5oJiMzNDsKJiM0MzsKJiM0MzsjZGVmaW5lIElPX1NJWkUgKDQgKiAxMDI0ICogMTAyNCkKJiM0MzsKJiM0MztzdGF0aWMgaW50IHJlYWRfc3RhdHMoc3RydWN0IGJwZl9saW5rICpsaW5rKQomIzQzO3sKJiM0MzsJaW50IGZkLCByZXQgPSAwOwomIzQzOwlzc2l6ZV90IGJ5dGVzOwomIzQzOwomIzQzOwlmZCA9IGJwZl9pdGVyX2NyZWF0ZShicGZfbGlua19fZmQobGluaykpOwomIzQzOwlpZiAoIUFTU0VSVF9PS19GRChmZCwgJiMzNDticGZfaXRlcl9jcmVhdGUmIzM0OykpCiYjNDM7CQlyZXR1cm4gMTsKJiM0MzsKJiM0MzsJLyogUmVzdWx0cyBsYW5kIGluIHNrZWwtJmd0O2RhdGFfcXVlcnk7IHRoZSByZWFkIGl0c2VsZiByZXR1cm5zIG5vIGRhdGEuICovCiYjNDM7CWJ5dGVzID0gcmVhZChmZCwgTlVMTCwgMCk7CiYjNDM7CWlmICghQVNTRVJUX0VRKGJ5dGVzLCAwLCAmIzM0O3JlYWQgZmQmIzM0OykpCiYjNDM7CQlyZXQgPSAxOwomIzQzOwomIzQzOwljbG9zZShmZCk7CiYjNDM7CXJldHVybiByZXQ7CiYjNDM7fQomIzQzOwomIzQzOy8qIFNldCB1cCBhIGxvb3AgZGV2aWNlIGZvciBjZ3JvdXAtY2hhcmdlZCBJL08uICovCiYjNDM7c3RhdGljIGludCBsb29wX3NldHVwKGNoYXIgKmxvb3BfcGF0aCwgc2l6ZV90IHN6LCBpbnQgKmN0bF9mZCwgaW50ICpsb29wX2ZkLAomIzQzOwkJICAgICAgaW50ICpiYWNrX2ZkKQomIzQzO3sKJiM0MzsJY2hhciBiYWNrX3BhdGhbXSA9ICYjMzQ7L3RtcC9jZ3JvdXBfaXRlcl9pby5YWFhYWFgmIzM0OzsKJiM0MzsJaW50IG5yOwomIzQzOwomIzQzOwkqY3RsX2ZkID0gKmxvb3BfZmQgPSAqYmFja19mZCA9IC0xOwomIzQzOwomIzQzOwkqY3RsX2ZkID0gb3BlbigmIzM0Oy9kZXYvbG9vcC1jb250cm9sJiMzNDssIE9fUkRXUiB8IE9fQ0xPRVhFQyk7CiYjNDM7CWlmICgqY3RsX2ZkICZsdDsgMCkKJiM0MzsJCXJldHVybiAtMTsKJiM0MzsKJiM0MzsJbnIgPSBpb2N0bCgqY3RsX2ZkLCBMT09QX0NUTF9HRVRfRlJFRSk7CiYjNDM7CWlmIChuciAmbHQ7IDApCiYjNDM7CQlnb3RvIGVycjsKJiM0MzsJc25wcmludGYobG9vcF9wYXRoLCBzeiwgJiMzNDsvZGV2L2xvb3AlZCYjMzQ7LCBucik7CiYjNDM7CiYjNDM7CSpiYWNrX2ZkID0gbWtzdGVtcChiYWNrX3BhdGgpOwomIzQzOwlpZiAoKmJhY2tfZmQgJmx0OyAwKQomIzQzOwkJZ290byBlcnI7CiYjNDM7CXVubGluayhiYWNrX3BhdGgpOwomIzQzOwlpZiAoZnRydW5jYXRlKCpiYWNrX2ZkLCAob2ZmX3QpSU9fU0laRSAqIDQpKQomIzQzOwkJZ290byBlcnI7CiYjNDM7CiYjNDM7CSpsb29wX2ZkID0gb3Blbihsb29wX3BhdGgsIE9fUkRXUiB8IE9fQ0xPRVhFQyk7CiYjNDM7CWlmICgqbG9vcF9mZCAmbHQ7IDApCiYjNDM7CQlnb3RvIGVycjsKJiM0MzsJaWYgKGlvY3RsKCpsb29wX2ZkLCBMT09QX1NFVF9GRCwgKmJhY2tfZmQpKQomIzQzOwkJZ290byBlcnI7CiYjNDM7CiYjNDM7CXJldHVybiAwOwomIzQzO2VycjoKJiM0MzsJaWYgKCpsb29wX2ZkICZndDs9IDApCiYjNDM7CQljbG9zZSgqbG9vcF9mZCk7CiYjNDM7CWlmICgqYmFja19mZCAmZ3Q7PSAwKQomIzQzOwkJY2xvc2UoKmJhY2tfZmQpOwomIzQzOwljbG9zZSgqY3RsX2ZkKTsKJiM0MzsJKmN0bF9mZCA9ICpsb29wX2ZkID0gKmJhY2tfZmQgPSAtMTsKJiM0MzsJcmV0dXJuIC0xOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgdm9pZCBsb29wX3RlYXJkb3duKGNvbnN0IGNoYXIgKmxvb3BfcGF0aCwgaW50IGN0bF9mZCwgaW50IGxvb3BfZmQsCiYjNDM7CQkJICBpbnQgYmFja19mZCkKJiM0Mzt7CiYjNDM7CWludCBuciA9IC0xOwomIzQzOwomIzQzOwlpZiAobG9vcF9mZCAmZ3Q7PSAwKSB7CiYjNDM7CQlpb2N0bChsb29wX2ZkLCBMT09QX0NMUl9GRCwgMCk7CiYjNDM7CQljbG9zZShsb29wX2ZkKTsKJiM0MzsJfQomIzQzOwlpZiAoYmFja19mZCAmZ3Q7PSAwKQomIzQzOwkJY2xvc2UoYmFja19mZCk7CiYjNDM7CWlmIChjdGxfZmQgJmd0Oz0gMCkgewomIzQzOwkJaWYgKHNzY2FuZihsb29wX3BhdGgsICYjMzQ7L2Rldi9sb29wJWQmIzM0OywgJmFtcDtucikgPT0gMSAmYW1wOyZhbXA7IG5yICZndDs9IDApCiYjNDM7CQkJaW9jdGwoY3RsX2ZkLCBMT09QX0NUTF9SRU1PVkUsIG5yKTsKJiM0MzsJCWNsb3NlKGN0bF9mZCk7CiYjNDM7CX0KJiM0Mzt9CiYjNDM7CiYjNDM7LyogT19ESVJFQ1Qga2VlcHMgSS9PIGNoYXJnZWQgdG8gdGhlIGN1cnJlbnQgY2dyb3VwLiAqLwomIzQzO3N0YXRpYyBpbnQgZG9fZGlyZWN0X2lvKGNvbnN0IGNoYXIgKmxvb3BfcGF0aCkKJiM0Mzt7CiYjNDM7CXZvaWQgKmJ1ZjsKJiM0MzsJaW50IGZkLCByZXQgPSAtMTsKJiM0MzsKJiM0MzsJZmQgPSBvcGVuKGxvb3BfcGF0aCwgT19SRFdSIHwgT19ESVJFQ1QgfCBPX0NMT0VYRUMpOwomIzQzOwlpZiAoZmQgJmx0OyAwKQomIzQzOwkJcmV0dXJuIC0xOwomIzQzOwlpZiAocG9zaXhfbWVtYWxpZ24oJmFtcDtidWYsIDQwOTYsIElPX1NJWkUpKQomIzQzOwkJZ290byBvdXRfZmQ7CiYjNDM7CW1lbXNldChidWYsIDB4YWIsIElPX1NJWkUpOwomIzQzOwomIzQzOwlpZiAocHdyaXRlKGZkLCBidWYsIElPX1NJWkUsIDApICE9IElPX1NJWkUpCiYjNDM7CQlnb3RvIG91dF9idWY7CiYjNDM7CWZzeW5jKGZkKTsKJiM0MzsJaWYgKHByZWFkKGZkLCBidWYsIElPX1NJWkUsIDApICE9IElPX1NJWkUpCiYjNDM7CQlnb3RvIG91dF9idWY7CiYjNDM7CXJldCA9IDA7CiYjNDM7b3V0X2J1ZjoKJiM0MzsJZnJlZShidWYpOwomIzQzO291dF9mZDoKJiM0MzsJY2xvc2UoZmQpOwomIzQzOwlyZXR1cm4gcmV0OwomIzQzO30KJiM0MzsKJiM0MzsvKiBSZWFkIEBkZXYmIzM5O3MgaW8uc3RhdCBjb3VudGVycy4gQGRldiB1c2VzIGtlcm5lbCBkZXZfdCBlbmNvZGluZy4gKi8KJiM0MztzdGF0aWMgaW50IHBhcnNlX2lvX3N0YXQoaW50IGNncm91cF9mZCwgX191NjQgZGV2LCBzdHJ1Y3QgaW9fcXVlcnkgKm91dCkKJiM0Mzt7CiYjNDM7CXVuc2lnbmVkIGludCB3YW50X21haiA9IGRldiAmZ3Q7Jmd0OyAyMCwgd2FudF9taW4gPSBkZXYgJmFtcDsgKCgxVSAmbHQ7Jmx0OyAyMCkgLSAxKTsKJiM0MzsJY2hhciBidWZbNDA5Nl0sICpsaW5lLCAqc2F2ZXB0cjsKJiM0MzsJaW50IGZkLCBuLCByZXQgPSAtMTsKJiM0MzsKJiM0MzsJZmQgPSBvcGVuYXQoY2dyb3VwX2ZkLCAmIzM0O2lvLnN0YXQmIzM0OywgT19SRE9OTFkpOwomIzQzOwlpZiAoZmQgJmx0OyAwKQomIzQzOwkJcmV0dXJuIC0xOwomIzQzOwluID0gcmVhZChmZCwgYnVmLCBzaXplb2YoYnVmKSAtIDEpOwomIzQzOwljbG9zZShmZCk7CiYjNDM7CWlmIChuICZsdDs9IDApCiYjNDM7CQlyZXR1cm4gLTE7CiYjNDM7CWJ1ZltuXSA9ICYjMzk7XDAmIzM5OzsKJiM0MzsKJiM0MzsJZm9yIChsaW5lID0gc3RydG9rX3IoYnVmLCAmIzM0O1xuJiMzNDssICZhbXA7c2F2ZXB0cik7IGxpbmU7CiYjNDM7CSAgICAgbGluZSA9IHN0cnRva19yKE5VTEwsICYjMzQ7XG4mIzM0OywgJmFtcDtzYXZlcHRyKSkgewomIzQzOwkJdW5zaWduZWQgbG9uZyBsb25nIHJiID0gMCwgd2IgPSAwLCByaSA9IDAsIHdpID0gMCwgZGIgPSAwLCBkaSA9IDA7CiYjNDM7CQl1bnNpZ25lZCBpbnQgbWFqLCBtaW47CiYjNDM7CiYjNDM7CQkvKiBPbmx5IHRoZSBkZXZpY2UgaWQgaXMgcmVxdWlyZWQ7IG1pc3NpbmcgY291bnRlcnMgc3RheSB6ZXJvLiAqLwomIzQzOwkJaWYgKHNzY2FuZihsaW5lLAomIzQzOwkJCSAgICYjMzQ7JXU6JXUgcmJ5dGVzPSVsbHUgd2J5dGVzPSVsbHUgcmlvcz0lbGx1IHdpb3M9JWxsdSBkYnl0ZXM9JWxsdSBkaW9zPSVsbHUmIzM0OywKJiM0MzsJCQkgICAmYW1wO21haiwgJmFtcDttaW4sICZhbXA7cmIsICZhbXA7d2IsICZhbXA7cmksICZhbXA7d2ksICZhbXA7ZGIsICZhbXA7ZGkpICZsdDsgMikKJiM0MzsJCQljb250aW51ZTsKJiM0MzsJCWlmIChtYWogIT0gd2FudF9tYWogfHwgbWluICE9IHdhbnRfbWluKQomIzQzOwkJCWNvbnRpbnVlOwomIzQzOwomIzQzOwkJb3V0LSZndDtyYnl0ZXMgPSByYjsKJiM0MzsJCW91dC0mZ3Q7d2J5dGVzID0gd2I7CiYjNDM7CQlvdXQtJmd0O3Jpb3MgPSByaTsKJiM0MzsJCW91dC0mZ3Q7d2lvcyA9IHdpOwomIzQzOwkJb3V0LSZndDtkYnl0ZXMgPSBkYjsKJiM0MzsJCW91dC0mZ3Q7ZGlvcyA9IGRpOwomIzQzOwkJcmV0ID0gMDsKJiM0MzsJCWJyZWFrOwomIzQzOwl9CiYjNDM7CXJldHVybiByZXQ7CiYjNDM7fQomIzQzOwomIzQzO3ZvaWQgdGVzdF9jZ3JvdXBfaXRlcl9pbyh2b2lkKQomIzQzO3sKJiM0MzsJY2hhciAqY2dyb3VwX3JlbF9wYXRoID0gJiMzNDsvY2dyb3VwX2l0ZXJfaW9fdGVzdCYjMzQ7OwomIzQzOwlpbnQgY3RsX2ZkID0gLTEsIGxvb3BfZmQgPSAtMSwgYmFja19mZCA9IC0xOwomIzQzOwlzdHJ1Y3QgY2dyb3VwX2l0ZXJfaW8gKnNrZWwgPSBOVUxMOwomIzQzOwlzdHJ1Y3QgYnBmX2xpbmsgKmxpbmsgPSBOVUxMOwomIzQzOwljaGFyIGxvb3BfcGF0aFs2NF07CiYjNDM7CXN0cnVjdCBpb19xdWVyeSAqcTsKJiM0MzsJaW50IGNncm91cF9mZDsKJiM0MzsKJiM0MzsJY2dyb3VwX2ZkID0gY2dyb3VwX3NldHVwX2FuZF9qb2luKGNncm91cF9yZWxfcGF0aCk7CiYjNDM7CWlmICghQVNTRVJUX09LX0ZEKGNncm91cF9mZCwgJiMzNDtjZ3JvdXBfc2V0dXBfYW5kX2pvaW4mIzM0OykpCiYjNDM7CQlyZXR1cm47CiYjNDM7CiYjNDM7CWlmIChsb29wX3NldHVwKGxvb3BfcGF0aCwgc2l6ZW9mKGxvb3BfcGF0aCksICZhbXA7Y3RsX2ZkLCAmYW1wO2xvb3BfZmQsICZhbXA7YmFja19mZCkpIHsKJiM0MzsJCXRlc3RfX3NraXAoKTsJLyogbmVlZHMgcm9vdCAmIzQzOyBDT05GSUdfQkxLX0RFVl9MT09QICovCiYjNDM7CQlnb3RvIGNsZWFudXBfY2dyb3VwX2ZkOwomIzQzOwl9CiYjNDM7CiYjNDM7CXNrZWwgPSBjZ3JvdXBfaXRlcl9pb19fb3Blbl9hbmRfbG9hZCgpOwomIzQzOwlpZiAoIUFTU0VSVF9PS19QVFIoc2tlbCwgJiMzNDtjZ3JvdXBfaXRlcl9pb19fb3Blbl9hbmRfbG9hZCYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cF9sb29wOwomIzQzOwomIzQzOwkvKiBDb252ZXJ0IGdsaWJjIHN0X3JkZXYgdG8ga2VybmVsIGRldl90IGZvcm1hdC4gKi8KJiM0MzsJewomIzQzOwkJc3RydWN0IHN0YXQgbHN0OwomIzQzOwomIzQzOwkJaWYgKCFBU1NFUlRfT0soZnN0YXQobG9vcF9mZCwgJmFtcDtsc3QpLCAmIzM0O2ZzdGF0IGxvb3AmIzM0OykpCiYjNDM7CQkJZ290byBjbGVhbnVwX3NrZWw7CiYjNDM7CQlza2VsLSZndDtkYXRhX3F1ZXJ5LSZndDt0YXJnZXRfZGV2ID0KJiM0MzsJCQkoKF9fdTY0KW1ham9yKGxzdC5zdF9yZGV2KSAmbHQ7Jmx0OyAyMCkgfCBtaW5vcihsc3Quc3RfcmRldik7CiYjNDM7CX0KJiM0MzsKJiM0MzsJREVDTEFSRV9MSUJCUEZfT1BUUyhicGZfaXRlcl9hdHRhY2hfb3B0cywgb3B0cyk7CiYjNDM7CXVuaW9uIGJwZl9pdGVyX2xpbmtfaW5mbyBsaW5mbyA9IHsKJiM0MzsJCS5jZ3JvdXAuY2dyb3VwX2ZkID0gY2dyb3VwX2ZkLAomIzQzOwkJLmNncm91cC5vcmRlciA9IEJQRl9DR1JPVVBfSVRFUl9TRUxGX09OTFksCiYjNDM7CX07CiYjNDM7CW9wdHMubGlua19pbmZvID0gJmFtcDtsaW5mbzsKJiM0MzsJb3B0cy5saW5rX2luZm9fbGVuID0gc2l6ZW9mKGxpbmZvKTsKJiM0MzsKJiM0MzsJbGluayA9IGJwZl9wcm9ncmFtX19hdHRhY2hfaXRlcihza2VsLSZndDtwcm9ncy5jZ3JvdXBfaW9fcXVlcnksICZhbXA7b3B0cyk7CiYjNDM7CWlmICghQVNTRVJUX09LX1BUUihsaW5rLCAmIzM0O2JwZl9wcm9ncmFtX19hdHRhY2hfaXRlciYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cF9za2VsOwomIzQzOwomIzQzOwkvKiBUaGlzIHByb2Nlc3MgaXMgaW4gdGhlIHRlc3QgY2dyb3VwLCBzbyB0aGUgbG9vcCBJL08gaXMgY2hhcmdlZCBoZXJlLiAqLwomIzQzOwlpZiAoIUFTU0VSVF9PSyhkb19kaXJlY3RfaW8obG9vcF9wYXRoKSwgJiMzNDtkb19kaXJlY3RfaW8mIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXBfbGluazsKJiM0MzsKJiM0MzsJaWYgKCFBU1NFUlRfT0socmVhZF9zdGF0cyhsaW5rKSwgJiMzNDtyZWFkIHN0YXRzJiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwX2xpbms7CiYjNDM7CiYjNDM7CXEgPSAmYW1wO3NrZWwtJmd0O2RhdGFfcXVlcnktJmd0O2lvX3F1ZXJ5OwomIzQzOwlpZiAodGVzdF9fc3RhcnRfc3VidGVzdCgmIzM0O2Nncm91cF9pdGVyX2lvX193cml0ZSYjMzQ7KSkgewomIzQzOwkJQVNTRVJUX0dUKHEtJmd0O3dieXRlcywgMCwgJiMzNDt3Ynl0ZXMmIzM0Oyk7CiYjNDM7CQlBU1NFUlRfR1QocS0mZ3Q7d2lvcywgMCwgJiMzNDt3aW9zJiMzNDspOwomIzQzOwl9CiYjNDM7CWlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KCYjMzQ7Y2dyb3VwX2l0ZXJfaW9fX3JlYWQmIzM0OykpIHsKJiM0MzsJCUFTU0VSVF9HVChxLSZndDtyYnl0ZXMsIDAsICYjMzQ7cmJ5dGVzJiMzNDspOwomIzQzOwkJQVNTRVJUX0dUKHEtJmd0O3Jpb3MsIDAsICYjMzQ7cmlvcyYjMzQ7KTsKJiM0MzsJfQomIzQzOwlpZiAodGVzdF9fc3RhcnRfc3VidGVzdCgmIzM0O2Nncm91cF9pdGVyX2lvX19kZXYmIzM0OykpCiYjNDM7CQlBU1NFUlRfR1QocS0mZ3Q7ZGV2LCAwLCAmIzM0O2RldiYjMzQ7KTsKJiM0MzsKJiM0MzsJLyogQ29tcGFyZSB3aXRoIGlvLnN0YXQgd2l0aG91dCBJL08gYmV0d2VlbiB0aGUgcmVhZHMuICovCiYjNDM7CWlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KCYjMzQ7Y2dyb3VwX2l0ZXJfaW9fX21hdGNoJiMzNDspKSB7CiYjNDM7CQlzdHJ1Y3QgaW9fcXVlcnkgZmlsZXYgPSB7fTsKJiM0MzsKJiM0MzsJCWlmIChBU1NFUlRfT0socmVhZF9zdGF0cyhsaW5rKSwgJiMzNDtyZWFkIHN0YXRzJiMzNDspICZhbXA7JmFtcDsKJiM0MzsJCSAgICBBU1NFUlRfT0socGFyc2VfaW9fc3RhdChjZ3JvdXBfZmQsIHEtJmd0O2RldiwgJmFtcDtmaWxldiksCiYjNDM7CQkJICAgICAgJiMzNDtwYXJzZSBpby5zdGF0JiMzNDspKSB7CiYjNDM7CQkJQVNTRVJUX0VRKHEtJmd0O3JieXRlcywgZmlsZXYucmJ5dGVzLCAmIzM0O3JieXRlcyYjMzQ7KTsKJiM0MzsJCQlBU1NFUlRfRVEocS0mZ3Q7d2J5dGVzLCBmaWxldi53Ynl0ZXMsICYjMzQ7d2J5dGVzJiMzNDspOwomIzQzOwkJCUFTU0VSVF9FUShxLSZndDtyaW9zLCBmaWxldi5yaW9zLCAmIzM0O3Jpb3MmIzM0Oyk7CiYjNDM7CQkJQVNTRVJUX0VRKHEtJmd0O3dpb3MsIGZpbGV2Lndpb3MsICYjMzQ7d2lvcyYjMzQ7KTsKJiM0MzsJCQlBU1NFUlRfRVEocS0mZ3Q7ZGJ5dGVzLCBmaWxldi5kYnl0ZXMsICYjMzQ7ZGJ5dGVzJiMzNDspOwomIzQzOwkJCUFTU0VSVF9FUShxLSZndDtkaW9zLCBmaWxldi5kaW9zLCAmIzM0O2Rpb3MmIzM0Oyk7CiYjNDM7CQl9CiYjNDM7CX0KJiM0MzsKJiM0MzsJLyogUm9vdCBzdGF0aXN0aWNzIGluY2x1ZGUgdGhpcyBjZ3JvdXAmIzM5O3MgSS9PLiAqLwomIzQzOwlpZiAodGVzdF9fc3RhcnRfc3VidGVzdCgmIzM0O2Nncm91cF9pdGVyX2lvX19yb290JiMzNDspKSB7CiYjNDM7CQlzdHJ1Y3QgYnBmX2xpbmsgKnJvb3RfbGluazsKJiM0MzsJCXN0cnVjdCBpb19xdWVyeSAqcjsKJiM0MzsKJiM0MzsJCXNrZWwtJmd0O2RhdGFfcXVlcnktJmd0O2dvdF9yb290X2NzcyA9IDA7CiYjNDM7CQlyb290X2xpbmsgPSBicGZfcHJvZ3JhbV9fYXR0YWNoX2l0ZXIoc2tlbC0mZ3Q7cHJvZ3MuY2dyb3VwX3Jvb3RfaW9fcXVlcnksCiYjNDM7CQkJCQkJICAgICAmYW1wO29wdHMpOwomIzQzOwkJaWYgKEFTU0VSVF9PS19QVFIocm9vdF9saW5rLCAmIzM0O2F0dGFjaCByb290IGl0ZXImIzM0OykpIHsKJiM0MzsJCQlpZiAoQVNTRVJUX09LKHJlYWRfc3RhdHMocm9vdF9saW5rKSwgJiMzNDtyZWFkIHJvb3Qgc3RhdHMmIzM0OykpIHsKJiM0MzsJCQkJciA9ICZhbXA7c2tlbC0mZ3Q7ZGF0YV9xdWVyeS0mZ3Q7cm9vdF9xdWVyeTsKJiM0MzsJCQkJQVNTRVJUX0VRKHNrZWwtJmd0O2RhdGFfcXVlcnktJmd0O2dvdF9yb290X2NzcywgMSwKJiM0MzsJCQkJCSAgJiMzNDtnb3Rfcm9vdF9jc3MmIzM0Oyk7CiYjNDM7CQkJCUFTU0VSVF9FUShyLSZndDtkZXYsIHEtJmd0O2RldiwgJiMzNDtyb290IGRldiYjMzQ7KTsKJiM0MzsJCQkJQVNTRVJUX0dFKHItJmd0O3dieXRlcywgcS0mZ3Q7d2J5dGVzLCAmIzM0O3Jvb3Qgd2J5dGVzJiMzNDspOwomIzQzOwkJCQlBU1NFUlRfR0Uoci0mZ3Q7d2lvcywgcS0mZ3Q7d2lvcywgJiMzNDtyb290IHdpb3MmIzM0Oyk7CiYjNDM7CQkJCUFTU0VSVF9HRShyLSZndDtyYnl0ZXMsIHEtJmd0O3JieXRlcywgJiMzNDtyb290IHJieXRlcyYjMzQ7KTsKJiM0MzsJCQkJQVNTRVJUX0dFKHItJmd0O3Jpb3MsIHEtJmd0O3Jpb3MsICYjMzQ7cm9vdCByaW9zJiMzNDspOwomIzQzOwkJCX0KJiM0MzsJCQlicGZfbGlua19fZGVzdHJveShyb290X2xpbmspOwomIzQzOwkJfQomIzQzOwl9CiYjNDM7CiYjNDM7Y2xlYW51cF9saW5rOgomIzQzOwlicGZfbGlua19fZGVzdHJveShsaW5rKTsKJiM0MztjbGVhbnVwX3NrZWw6CiYjNDM7CWNncm91cF9pdGVyX2lvX19kZXN0cm95KHNrZWwpOwomIzQzO2NsZWFudXBfbG9vcDoKJiM0MzsJbG9vcF90ZWFyZG93bihsb29wX3BhdGgsIGN0bF9mZCwgbG9vcF9mZCwgYmFja19mZCk7CiYjNDM7Y2xlYW51cF9jZ3JvdXBfZmQ6CiYjNDM7CWNsb3NlKGNncm91cF9mZCk7CiYjNDM7CWNsZWFudXBfY2dyb3VwX2Vudmlyb25tZW50KCk7CiYjNDM7fQpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL2Nncm91cF9pdGVyX2lvLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvY2dyb3VwX2l0ZXJfaW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwLi4yY2Q1MzgwNjg5ODdhCi0tLSAvZGV2L251bGwKJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL2Nncm91cF9pdGVyX2lvLmMKQEAgLTAsMCAmIzQzOzEsOTkgQEAKJiM0MzsvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMAomIzQzOy8qIENvcHlyaWdodCAoYykgMjAyNSBNZXRhIFBsYXRmb3JtcywgSW5jLiBhbmQgYWZmaWxpYXRlcy4gKi8KJiM0MzsjaW5jbHVkZSAmbHQ7dm1saW51eC5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDticGYvYnBmX2hlbHBlcnMuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7YnBmL2JwZl9jb3JlX3JlYWQuaCZndDsKJiM0MzsjaW5jbHVkZSAmIzM0O2JwZl9leHBlcmltZW50YWwuaCYjMzQ7CiYjNDM7I2luY2x1ZGUgJiMzNDtjZ3JvdXBfaXRlcl9pby5oJiMzNDsKJiM0MzsKJiM0MztjaGFyIF9saWNlbnNlW10gU0VDKCYjMzQ7bGljZW5zZSYjMzQ7KSA9ICYjMzQ7R1BMJiMzNDs7CiYjNDM7CiYjNDM7c3RydWN0IGlvX3F1ZXJ5IGlvX3F1ZXJ5IFNFQygmIzM0Oy5kYXRhLnF1ZXJ5JiMzNDspOwomIzQzOwomIzQzO3N0cnVjdCBpb19xdWVyeSByb290X3F1ZXJ5IFNFQygmIzM0Oy5kYXRhLnF1ZXJ5JiMzNDspOwomIzQzOwomIzQzO19fdTY0IGdvdF9yb290X2NzcyBTRUMoJiMzNDsuZGF0YS5xdWVyeSYjMzQ7KTsKJiM0MzsKJiM0MzsvKiBEZXZpY2Ugc2VsZWN0ZWQgYnkgdXNlcnNwYWNlIGluIGtlcm5lbCBkZXZfdCBmb3JtYXQuICovCiYjNDM7X191NjQgdGFyZ2V0X2RldiBTRUMoJiMzNDsuZGF0YS5xdWVyeSYjMzQ7KTsKJiM0MzsKJiM0MzsvKiBLZWVwIGlubGluZTogUkNVIGFuZCBvcGVuLWNvZGVkIGl0ZXJhdG9ycyBjYW5ub3QgY3Jvc3MgYSBCUEYgY2FsbC4gKi8KJiM0MztzdGF0aWMgX19hbHdheXNfaW5saW5lIGludCByZWFkX3RhcmdldF9kZXYoc3RydWN0IGNncm91cCAqY2dycCwKJiM0MzsJCQkJCSAgIHN0cnVjdCBpb19xdWVyeSAqb3V0KQomIzQzO3sKJiM0MzsJc3RydWN0IGNncm91cF9zdWJzeXNfc3RhdGUgKmNzczsKJiM0MzsJc3RydWN0IGJsa2NnX2dxICpwb3M7CiYjNDM7CV9fdTY0IGRldjsKJiM0MzsJaW50IHNzaWQ7CiYjNDM7CiYjNDM7CS8qIFRoZSBmbHVzaCBjYW4gc2xlZXAsIHNvIHJ1biBpdCBiZWZvcmUgdGhlIFJDVSBzZWN0aW9uLiAqLwomIzQzOwlicGZfYmxrY2dfZmx1c2hfc3RhdHMoY2dycCk7CiYjNDM7CiYjNDM7CWJwZl9yY3VfcmVhZF9sb2NrKCk7CiYjNDM7CXNzaWQgPSBicGZfY29yZV9lbnVtX3ZhbHVlKGVudW0gY2dyb3VwX3N1YnN5c19pZCwgaW9fY2dycF9pZCk7CiYjNDM7CiYjNDM7CS8qCiYjNDM7CSAqIHN1YnN5c1tdIGlzIF9fcmN1LCBzbyB0aGlzIHJlYWQgZ2l2ZXMgYW4gUkNVIHBvaW50ZXIgdGhlIGl0ZXJhdG9yCiYjNDM7CSAqIGFjY2VwdHMuIEJQRl9DT1JFX1JFQUQoKSB3b3VsZCByZXR1cm4gYSBwbGFpbiB2YWx1ZSBpbnN0ZWFkLgomIzQzOwkgKi8KJiM0MzsJY3NzID0gY2dycC0mZ3Q7c3Vic3lzW3NzaWRdOwomIzQzOwlpZiAoIWNzcykgewomIzQzOwkJYnBmX3JjdV9yZWFkX3VubG9jaygpOwomIzQzOwkJcmV0dXJuIDA7CiYjNDM7CX0KJiM0MzsKJiM0MzsJYnBmX2Zvcl9lYWNoKGJsa2csIHBvcywgY3NzKSB7CiYjNDM7CQlkZXYgPSBCUEZfQ09SRV9SRUFEKHBvcywgcSwgZGlzaywgcGFydDAsIGJkX2Rldik7CiYjNDM7CQlpZiAoZGV2ICE9IHRhcmdldF9kZXYpCiYjNDM7CQkJY29udGludWU7CiYjNDM7CiYjNDM7CQlvdXQtJmd0O2RldiA9IGRldjsKJiM0MzsJCW91dC0mZ3Q7cmJ5dGVzID0gQlBGX0NPUkVfUkVBRChwb3MsIGlvc3RhdC5jdXIuYnl0ZXNbQkxLR19JT1NUQVRfUkVBRF0pOwomIzQzOwkJb3V0LSZndDt3Ynl0ZXMgPSBCUEZfQ09SRV9SRUFEKHBvcywgaW9zdGF0LmN1ci5ieXRlc1tCTEtHX0lPU1RBVF9XUklURV0pOwomIzQzOwkJb3V0LSZndDtyaW9zID0gQlBGX0NPUkVfUkVBRChwb3MsIGlvc3RhdC5jdXIuaW9zW0JMS0dfSU9TVEFUX1JFQURdKTsKJiM0MzsJCW91dC0mZ3Q7d2lvcyA9IEJQRl9DT1JFX1JFQUQocG9zLCBpb3N0YXQuY3VyLmlvc1tCTEtHX0lPU1RBVF9XUklURV0pOwomIzQzOwkJb3V0LSZndDtkYnl0ZXMgPSBCUEZfQ09SRV9SRUFEKHBvcywgaW9zdGF0LmN1ci5ieXRlc1tCTEtHX0lPU1RBVF9ESVNDQVJEXSk7CiYjNDM7CQlvdXQtJmd0O2Rpb3MgPSBCUEZfQ09SRV9SRUFEKHBvcywgaW9zdGF0LmN1ci5pb3NbQkxLR19JT1NUQVRfRElTQ0FSRF0pOwomIzQzOwkJYnJlYWs7CiYjNDM7CX0KJiM0MzsJYnBmX3JjdV9yZWFkX3VubG9jaygpOwomIzQzOwlyZXR1cm4gMTsKJiM0Mzt9CiYjNDM7CiYjNDM7U0VDKCYjMzQ7aXRlci5zL2Nncm91cCYjMzQ7KQomIzQzO2ludCBjZ3JvdXBfaW9fcXVlcnkoc3RydWN0IGJwZl9pdGVyX19jZ3JvdXAgKmN0eCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBjZ3JvdXAgKmNncnAgPSBjdHgtJmd0O2Nncm91cDsKJiM0MzsKJiM0MzsJaWYgKCFjZ3JwKQomIzQzOwkJcmV0dXJuIDE7CiYjNDM7CiYjNDM7CS8qIFN0YXJ0IGZyZXNoIHNvIGEgZGV2aWNlIHRoYXQgaXMgbm90IGZvdW5kIHN0YXlzIGFsbC16ZXJvLiAqLwomIzQzOwlfX2J1aWx0aW5fbWVtc2V0KCZhbXA7aW9fcXVlcnksIDAsIHNpemVvZihpb19xdWVyeSkpOwomIzQzOwomIzQzOwlyZWFkX3RhcmdldF9kZXYoY2dycCwgJmFtcDtpb19xdWVyeSk7CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MzsKJiM0MztTRUMoJiMzNDtpdGVyLnMvY2dyb3VwJiMzNDspCiYjNDM7aW50IGNncm91cF9yb290X2lvX3F1ZXJ5KHN0cnVjdCBicGZfaXRlcl9fY2dyb3VwICpjdHgpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgY2dyb3VwICpyb290OwomIzQzOwomIzQzOwlpZiAoIWN0eC0mZ3Q7Y2dyb3VwKQomIzQzOwkJcmV0dXJuIDE7CiYjNDM7CiYjNDM7CV9fYnVpbHRpbl9tZW1zZXQoJmFtcDtyb290X3F1ZXJ5LCAwLCBzaXplb2Yocm9vdF9xdWVyeSkpOwomIzQzOwomIzQzOwkvKiBUaGUgcm9vdCBjZ3JvdXAgYWx3YXlzIGhhcyBpZCAxLiAqLwomIzQzOwlyb290ID0gYnBmX2Nncm91cF9mcm9tX2lkKDEpOwomIzQzOwlpZiAoIXJvb3QpCiYjNDM7CQlyZXR1cm4gMDsKJiM0MzsKJiM0MzsJLyogUm9vdCBjb3VudGVycyBpbmNsdWRlIGFsbCBjZ3JvdXBzJiMzOTsgSS9PLiAqLwomIzQzOwlpZiAocmVhZF90YXJnZXRfZGV2KHJvb3QsICZhbXA7cm9vdF9xdWVyeSkpCiYjNDM7CQlnb3Rfcm9vdF9jc3MgPSAxOwomIzQzOwomIzQzOwlicGZfY2dyb3VwX3JlbGVhc2Uocm9vdCk7CiYjNDM7CXJldHVybiAwOwomIzQzO30KPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+My8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTcgMjI6MzQ8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogOTY3NQoJCQkJCQkJb3V0cHV0OiAyMQoJCQkJCQkJdGhvdWdodHM6IDYwOAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipGdXp6aW5nIE5ldyBCUEYgS2Z1bmNzIGZvciBCbG9jayBDZ3JvdXAgSS9PIFN0YXRpc3RpY3MqKgoKT2theSwgc28gdGhlcmUmIzM5O3MgYSBwYXRjaCBpbnRyb2R1Y2luZyBCUEYga2Z1bmNzIGZvciBibG9jayBjZ3JvdXAgSS9PIHN0YXRpc3RpY3MuIE15IGluaXRpYWwgdGhvdWdodCBpcywgJiMzNDtJcyB0aGlzIGZ1enphYmxlPyYjMzQ7IFRoZSBhbnN3ZXIgaXMgYSBjbGVhciB5ZXMsIGJlY2F1c2Ugd2UmIzM5O3JlIHRhbGtpbmcgYWJvdXQgKm5ldyogQlBGIGtmdW5jcyB0aGF0IGFyZSBub3cgYWNjZXNzaWJsZSBmcm9tIEJQRiBwcm9ncmFtcy4gVGhpcyBvcGVucyB1cCBhIG5ldyBhdHRhY2sgc3VyZmFjZSwgYW5kIHRoYXTigJlzIHByZWNpc2VseSB3aGF0IEkmIzM5O20gaW50ZXJlc3RlZCBpbiBmb3IgZnV6emluZy4KClRoZXNlIG5ldyBrZnVuY3MgYXJlOiBgYnBmX2Jsa2NnX2ZsdXNoX3N0YXRzYCwgYGJwZl9pdGVyX2Jsa2dfbmV3YCwgYGJwZl9pdGVyX2Jsa2dfbmV4dGAsIGFuZCBgYnBmX2l0ZXJfYmxrZ19kZXN0cm95YC4gTGV0JiMzOTtzIHRha2UgYSBxdWljayBsb29rIGluc2lkZSBgYmxvY2svYnBmX2Jsa2NnLmNgIGp1c3QgdG8gbWFrZSBzdXJlIHdlIGhhdmVuJiMzOTt0IG1pc3NlZCBhbnl0aGluZyBlbHNlIGluIHRoZXJlLiBOb3BlLCB0aG9zZSBhcmUgdGhlIG9ubHkgZm91ciBmdW5jdGlvbnMuIEhvbGQgb24sIGBicGZfaXRlcl9ibGtnX2Rlc3Ryb3lgIGlzICplbXB0eSouIEl0JiMzOTtzIHN0aWxsIHdvcnRoIGFkZGluZywgYnV0IHRoZSBvdGhlciB0aHJlZSBhcmUgZ29pbmcgdG8gYmUgbW9yZSBpbnRlcmVzdGluZyBmb3IgZnV6emluZy4KCk15IG5leHQgc3RlcCBpcyB0byBuYWlsIGRvd24gdGhlIGNvbmZpZ3VyYXRpb24gcHJlcmVxdWlzaXRlcy4gV2UgbmVlZCBgQ09ORklHX0JQRl9TWVNDQUxMYCBhbmQgYENPTkZJR19CTEtfQ0dST1VQYCB0byBhY3R1YWxseSBoYXZlIGBicGZfYmxrY2cub2AgYnVpbHQuIE5vdywganVzdCB0byBtYWtlIHN1cmUsIGxldCBtZSBkb3VibGUtY2hlY2sgdGhlIGBLY29uZmlnYCBmb3IgYEJMS19DR1JPVVBgLiBBbHJpZ2h0LCBpdCBsb29rcyBsaWtlIGBCTEtfQ0dST1VQYCBkZXBlbmRzIG9uIGJvdGggYENHUk9VUFNgIGFuZCBgQkxPQ0tgLiBUaW1lIHRvIGZpcmUgdXAgYGdyZXBwZXJgIGFuZCBzZWUgd2hhdCBlbHNlIHdlIGNhbiB1bmNvdmVyIQoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE3IDIyOjM0PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2NvbmZpZyBCTEtfQ0dST1VQJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2Jsb2NrL0tjb25maWc9Mzk9Y29uZmlnIEJMS19SUV9BTExPQ19USU1FXG4tLVxuYmxvY2svS2NvbmZpZy00MS1cbmJsb2NrL0tjb25maWc6NDI6Y29uZmlnIEJMS19DR1JPVVBfUldTVEFUXG5ibG9jay9LY29uZmlnLTQzLVx0Ym9vbFxuYmxvY2svS2NvbmZpZy00NC1cbmJsb2NrL0tjb25maWc6NDU6Y29uZmlnIEJMS19DR1JPVVBfUFVOVF9CSU9cbmJsb2NrL0tjb25maWctNDYtXHRib29sXG4tLVxuYmxvY2svS2NvbmZpZz0xMjc9Y29uZmlnIEJMS19XQlRfTVFcbi0tXG5ibG9jay9LY29uZmlnLTEzMy1cbmJsb2NrL0tjb25maWc6MTM0OmNvbmZpZyBCTEtfQ0dST1VQX0lPTEFURU5DWVxuYmxvY2svS2NvbmZpZy0xMzUtXHRib29sIFwmIzM0O0VuYWJsZSBzdXBwb3J0IGZvciBsYXRlbmN5IGJhc2VkIGNncm91cCBJTyBwcm90ZWN0aW9uXCYjMzQ7XG4tLVxuYmxvY2svS2NvbmZpZy0xNDQtXG5ibG9jay9LY29uZmlnOjE0NTpjb25maWcgQkxLX0NHUk9VUF9GQ19BUFBJRFxuYmxvY2svS2NvbmZpZy0xNDYtXHRib29sIFwmIzM0O0VuYWJsZSBzdXBwb3J0IHRvIHRyYWNrIEZDIEkvTyBUcmFmZmljIGFjcm9zcyBjZ3JvdXAgYXBwbGljYXRpb25zXCYjMzQ7XG4tLVxuYmxvY2svS2NvbmZpZy0xNTMtXG5ibG9jay9LY29uZmlnOjE1NDpjb25maWcgQkxLX0NHUk9VUF9JT0NPU1RcbmJsb2NrL0tjb25maWctMTU1LVx0Ym9vbCBcJiMzNDtFbmFibGUgc3VwcG9ydCBmb3IgY29zdCBtb2RlbCBiYXNlZCBjZ3JvdXAgSU8gY29udHJvbGxlclwmIzM0O1xuLS1cbmJsb2NrL0tjb25maWctMTYzLVxuYmxvY2svS2NvbmZpZzoxNjQ6Y29uZmlnIEJMS19DR1JPVVBfSU9QUklPXG5ibG9jay9LY29uZmlnLTE2NS1cdGJvb2wgXCYjMzQ7Q2dyb3VwIEkvTyBjb250cm9sbGVyIGZvciBhc3NpZ25pbmcgYW4gSS9PIHByaW9yaXR5IGNsYXNzXCYjMzQ7XG4tLVxuaW5pdC9LY29uZmlnPTEwOTk9Y29uZmlnIE1FTUNHX1YxXG4tLVxuaW5pdC9LY29uZmlnLTExMTUtXG5pbml0L0tjb25maWc6MTExNjpjb25maWcgQkxLX0NHUk9VUFxuaW5pdC9LY29uZmlnLTExMTctXHRib29sIFwmIzM0O0lPIGNvbnRyb2xsZXJcJiMzNDtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD41LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xNyAyMjozNDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMTA4OQoJCQkJCQkJb3V0cHV0OiAzMwoJCQkJCQkJdGhvdWdodHM6IDE4CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIGEgc3VtbWFyeSBvZiBteSB0aG91Z2h0IHByb2Nlc3MsIGFzIHJlcXVlc3RlZDoKCioqQ2hlY2tpbmcgQkxLX0NHUk9VUCBDb25maWd1cmF0aW9uKioKCk9rYXksIHNvIEkgbmVlZCB0byBxdWlja2x5IGFzY2VydGFpbiB0aGUgc3RhdHVzIG9mIGBCTEtfQ0dST1VQYCB3aXRoaW4gdGhlIGtlcm5lbCBjb25maWd1cmF0aW9uLiBNeSBpbW1lZGlhdGUgaW5zdGluY3QgaXMgdG8gY2hlY2sgYGluaXQvS2NvbmZpZ2AuIFRoYXQmIzM5O3MgdGhlIG1vc3QgbG9naWNhbCBwbGFjZSB0byBzdGFydCBkaWdnaW5nIGZvciBkZWZpbml0aW9ucyByZWxhdGVkIHRvIGJsb2NrIGxheWVyIGNvbnRyb2wgZ3JvdXBzLCBlc3BlY2lhbGx5IHNpbmNlIGl0JiMzOTtzIGEgY29yZSBjb25maWd1cmF0aW9uIGZpbGUuIExldCYjMzk7cyBzZWUgaWYgaXQmIzM5O3MgZGVmaW5lZCB0aGVyZSwgYW5kIGlmIHNvLCB3aGF0IHRoZSBkZXBlbmRlbmNpZXMgYW5kIGRlZmF1bHQgdmFsdWUgYXJlLiBUaGlzIHNob3VsZCBnaXZlIG1lIGEgZ29vZCBpbml0aWFsIG92ZXJ2aWV3IG9mIGhvdyBgQkxLX0NHUk9VUGAgaXMgaGFuZGxlZCB3aXRoaW4gdGhlIGJ1aWxkIHN5c3RlbSBhbmQgaWYgaXQgaXMgZW5hYmxlZCBvciBkaXNhYmxlZCBieSBkZWZhdWx0LiBVbmRlcnN0YW5kaW5nIHRoZSBjb25maWd1cmF0aW9uIGlzIGNyaXRpY2FsIHRvIG1vdmluZyBmb3J3YXJkLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjYvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE3IDIyOjM0PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7aW5pdC9LY29uZmlnJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMTExMCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiAyMAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsxMTEwOlx0XHQgIFBsZWFzZSBub3RlIHRoYXQgZmVhdHVyZSBzZXQgb2YgdGhlIGxlZ2FjeSBtZW1vcnkgY29udHJvbGxlciBpcyBsaWtlbHlcbjExMTE6XHRcdCAgZ29pbmcgdG8gc2hyaW5rIGR1ZSB0byBkZXByZWNhdGlvbiBwcm9jZXNzLiBOZXcgZGVwbG95bWVudHMgd2l0aCB2MVxuMTExMjpcdFx0ICBjb250cm9sbGVyIGFyZSBoaWdobHkgZGlzY291cmFnZWQuXG4xMTEzOlx0XG4xMTE0Olx0XHQgIFNheSBOIGlmIHVuc3VyZS5cbjExMTU6XHRcbjExMTY6XHRjb25maWcgQkxLX0NHUk9VUFxuMTExNzpcdFx0Ym9vbCBcJiMzNDtJTyBjb250cm9sbGVyXCYjMzQ7XG4xMTE4Olx0XHRkZXBlbmRzIG9uIEJMT0NLXG4xMTE5Olx0XHRkZWZhdWx0IG5cbjExMjA6XHRcdGhlbHBcbjExMjE6XHRcdEdlbmVyaWMgYmxvY2sgSU8gY29udHJvbGxlciBjZ3JvdXAgaW50ZXJmYWNlLiBUaGlzIGlzIHRoZSBjb21tb25cbjExMjI6XHRcdGNncm91cCBpbnRlcmZhY2Ugd2hpY2ggc2hvdWxkIGJlIHVzZWQgYnkgdmFyaW91cyBJTyBjb250cm9sbGluZ1xuMTEyMzpcdFx0cG9saWNpZXMuXG4xMTI0Olx0XG4xMTI1Olx0XHRDdXJyZW50bHksIENGUSBJTyBzY2hlZHVsZXIgdXNlcyBpdCB0byByZWNvZ25pemUgdGFzayBncm91cHMgYW5kXG4xMTI2Olx0XHRjb250cm9sIGRpc2sgYmFuZHdpZHRoIGFsbG9jYXRpb24gKHByb3BvcnRpb25hbCB0aW1lIHNsaWNlIGFsbG9jYXRpb24pXG4xMTI3Olx0XHR0byBzdWNoIHRhc2sgZ3JvdXBzLiBJdCBpcyBhbHNvIHVzZWQgYnkgYmlvIHRocm90dGxpbmcgbG9naWMgaW5cbjExMjg6XHRcdGJsb2NrIGxheWVyIHRvIGltcGxlbWVudCB1cHBlciBsaW1pdCBpbiBJTyByYXRlcyBvbiBhIGRldmljZS5cbjExMjk6XHRcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD43LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xNyAyMjozNDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMTU4MgoJCQkJCQkJb3V0cHV0OiAzNgoJCQkJCQkJdGhvdWdodHM6IDQyCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBoZXJlJiMzOTtzIG15IHRha2Ugb24gdGhvc2UgdGhvdWdodHMsIGZyYW1lZCBhcyBteSBvd246CgoqKkRlcGVuZGVuY2llcyBhbmQgdGhlIGJwZl9ibGtjZy5jIENoZWNrKioKCkFscmlnaHQsIGxldCYjMzk7cyBzZWUsIGl0IGxvb2tzIGxpa2UgYEJMS19DR1JPVVBgIGlzIGZ1bmRhbWVudGFsbHkgcmVsaWFudCBvbiBgQkxPQ0tgLiBUaGF0IG1ha2VzIHNlbnNlOyB3ZSYjMzk7cmUgdGFsa2luZyBhYm91dCBibG9jayBJL08gY29udHJvbCB3aXRoaW4gY2dyb3Vwcywgc28gdGhlIGJhc2ljIGJsb2NrIGRldmljZSBpbmZyYXN0cnVjdHVyZSBuZWVkcyB0byBiZSB0aGVyZS4gQW5kLCBJIHJlY2FsbCBub3csIGBCUEZfU1lTQ0FMTGAgaXMgYWxzbyBkZWZpbml0ZWx5IGdvaW5nIHRvIGJlIGluIHRoZSBtaXguIENvbnNpZGVyaW5nIHRoaXMgaXMgQlBGLXJlbGF0ZWQgY29kZSwgdGhhdOKAmXMgbm90IGEgc3VycHJpc2UuIEkgbmVlZCB0byBiZSBhYmxlIHRvIHRyYWNlIGNlcnRhaW4gY2FsbHMgaW4gdGhlIGtlcm5lbC4KClJpZ2h0LCBzbyB0byBtYWtlIHN1cmUgSSB1bmRlcnN0YW5kIHRoZSBjb2RlIGNvcnJlY3RseSwgSSB0aGluayBJIHdpbGwgcmVyZWFkIGBicGZfYmxrY2cuY2AuIExldCYjMzk7cyBzZWUgd2hhdCYjMzk7cyBhY3R1YWxseSBnb2luZyBvbi4gSSBuZWVkIHRvIG1ha2UgY2VydGFpbiBJIGZ1bGx5IHVuZGVyc3RhbmQgaG93IHRoZSBCUEYgcHJvZ3JhbXMgaG9vayBpbnRvIHRoZSBibG9jayBJL08gcGF0aC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD44LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xNyAyMjozNDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O2Jsb2NrL2JwZl9ibGtjZy5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMSwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiAxMDAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7ICAgMTpcdC8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9yLWxhdGVyXG4gICAyOlx0LypcbiAgIDM6XHQgKiBCbG9jayBJL08gQ29udHJvbGxlci1yZWxhdGVkIEJQRiBrZnVuY3MgYW5kIGF1eGlsaWFyeSBjb2RlXG4gICA0Olx0ICovXG4gICA1Olx0XG4gICA2Olx0I2luY2x1ZGUgXCYjMzQ7YmxrLWNncm91cC5oXCYjMzQ7XG4gICA3Olx0XG4gICA4Olx0I2luY2x1ZGUgXHUwMDNjbGludXgvYnBmLmhcdTAwM2VcbiAgIDk6XHQjaW5jbHVkZSBcdTAwM2NsaW51eC9idGZfaWRzLmhcdTAwM2VcbiAgMTA6XHQjaW5jbHVkZSBcdTAwM2NsaW51eC9yY3VsaXN0LmhcdTAwM2VcbiAgMTE6XHRcbiAgMTI6XHRfX2JwZl9rZnVuY19zdGFydF9kZWZzKCk7XG4gIDEzOlx0XG4gIDE0Olx0LyoqXG4gIDE1Olx0ICogYnBmX2Jsa2NnX2ZsdXNoX3N0YXRzIC0gRmx1c2ggYSBibG9jayBjZ3JvdXAmIzM5O3MgaW8gc3RhdGlzdGljc1xuICAxNjpcdCAqIEBjZ3JwOiBjZ3JvdXAgdG8gZmx1c2hcbiAgMTc6XHQgKlxuICAxODpcdCAqIFByb3BhZ2F0ZSBJL08gc3RhdGlzdGljcyB1cCB0aGUgY2dyb3VwIHRyZWUuIFJvb3Qgc3RhdGlzdGljcyBjb21lIGZyb21cbiAgMTk6XHQgKiBibG9jayBkZXZpY2VzIGFuZCBpbmNsdWRlIGFsbCBjZ3JvdXBzJiMzOTsgSS9PLlxuICAyMDpcdCAqL1xuICAyMTpcdF9fYnBmX2tmdW5jIHZvaWQgYnBmX2Jsa2NnX2ZsdXNoX3N0YXRzKHN0cnVjdCBjZ3JvdXAgKmNncnApXG4gIDIyOlx0e1xuICAyMzpcdFx0c3RydWN0IGNncm91cF9zdWJzeXNfc3RhdGUgKmNzcztcbiAgMjQ6XHRcbiAgMjU6XHRcdC8qIFBpbiB0aGUgY3NzIGZvciB0aGUgc2xlZXBhYmxlIGZsdXNoLiAqL1xuICAyNjpcdFx0cmN1X3JlYWRfbG9jaygpO1xuICAyNzpcdFx0Y3NzID0gY2dyb3VwX2NzcyhjZ3JwLCBcdTAwMjZpb19jZ3JwX3N1YnN5cyk7XG4gIDI4Olx0XHRpZiAoY3NzIFx1MDAyNlx1MDAyNiAhY3NzX3RyeWdldChjc3MpKVxuICAyOTpcdFx0XHRjc3MgPSBOVUxMO1xuICAzMDpcdFx0cmN1X3JlYWRfdW5sb2NrKCk7XG4gIDMxOlx0XG4gIDMyOlx0XHRpZiAoIWNzcylcbiAgMzM6XHRcdFx0cmV0dXJuO1xuICAzNDpcdFxuICAzNTpcdFx0aWYgKCFjc3MtXHUwMDNlcGFyZW50KVxuICAzNjpcdFx0XHRibGtjZ19maWxsX3Jvb3RfaW9zdGF0cygpO1xuICAzNzpcdFx0ZWxzZVxuICAzODpcdFx0XHRjc3NfcnN0YXRfZmx1c2goY3NzKTtcbiAgMzk6XHRcbiAgNDA6XHRcdGNzc19wdXQoY3NzKTtcbiAgNDE6XHR9XG4gIDQyOlx0XG4gIDQzOlx0c3RydWN0IGJwZl9pdGVyX2Jsa2cge1xuICA0NDpcdFx0X191NjQgX19vcGFxdWVbMl07XG4gIDQ1Olx0fSBfX2FsaWduZWQoOCk7XG4gIDQ2Olx0XG4gIDQ3Olx0c3RydWN0IGJwZl9pdGVyX2Jsa2dfa2VybiB7XG4gIDQ4Olx0XHRzdHJ1Y3QgYmxrY2cgKmJsa2NnO1xuICA0OTpcdFx0c3RydWN0IGJsa2NnX2dxICpwb3M7XG4gIDUwOlx0fSBfX2FsaWduZWQoOCk7XG4gIDUxOlx0XG4gIDUyOlx0LyoqXG4gIDUzOlx0ICogYnBmX2l0ZXJfYmxrZ19uZXcgLSBTdGFydCBpdGVyYXRpbmcgYSBibG9jayBjZ3JvdXAmIzM5O3MgcGVyLWRldmljZSBibGtnc1xuICA1NDpcdCAqIEBpdDogaXRlcmF0b3IgdG8gaW5pdGlhbGl6ZVxuICA1NTpcdCAqIEBjc3M6IHRoZSBpbyBjb250cm9sbGVyJiMzOTtzIGNzc1xuICA1NjpcdCAqXG4gIDU3Olx0ICogRWFjaCBibGtnIGhvbGRzIG9uZSBkZXZpY2UmIzM5O3MgaW8uc3RhdCBjb3VudGVycy4gT2ZmbGluZSBibGtncyBhcmUgc2tpcHBlZC5cbiAgNTg6XHQgKiBBIGJsa2cgd2l0aG91dCBhIGRpc2sgY2FuIGJlIHJldHVybmVkLiBNdXN0IHJ1biB1bmRlciBSQ1UuXG4gIDU5Olx0ICpcbiAgNjA6XHQgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgLUVJTlZBTCBpZiBAY3NzIGlzIG5vdCB0aGUgaW8gY29udHJvbGxlciYjMzk7cy5cbiAgNjE6XHQgKi9cbiAgNjI6XHRfX2JwZl9rZnVuYyBpbnQgYnBmX2l0ZXJfYmxrZ19uZXcoc3RydWN0IGJwZl9pdGVyX2Jsa2cgKml0LFxuICA2MzpcdFx0XHRcdFx0ICBzdHJ1Y3QgY2dyb3VwX3N1YnN5c19zdGF0ZSAqY3NzKVxuICA2NDpcdHtcbiAgNjU6XHRcdHN0cnVjdCBicGZfaXRlcl9ibGtnX2tlcm4gKmtpdCA9ICh2b2lkICopaXQ7XG4gIDY2Olx0XG4gIDY3Olx0XHRCVUlMRF9CVUdfT04oc2l6ZW9mKHN0cnVjdCBicGZfaXRlcl9ibGtnX2tlcm4pIFx1MDAzZSBzaXplb2Yoc3RydWN0IGJwZl9pdGVyX2Jsa2cpKTtcbiAgNjg6XHRcdEJVSUxEX0JVR19PTihfX2FsaWdub2ZfXyhzdHJ1Y3QgYnBmX2l0ZXJfYmxrZ19rZXJuKSAhPVxuICA2OTpcdFx0XHQgICAgIF9fYWxpZ25vZl9fKHN0cnVjdCBicGZfaXRlcl9ibGtnKSk7XG4gIDcwOlx0XG4gIDcxOlx0XHRraXQtXHUwMDNlcG9zID0gTlVMTDtcbiAgNzI6XHRcbiAgNzM6XHRcdGlmIChjc3MtXHUwMDNlc3MgIT0gXHUwMDI2aW9fY2dycF9zdWJzeXMpIHtcbiAgNzQ6XHRcdFx0a2l0LVx1MDAzZWJsa2NnID0gTlVMTDtcbiAgNzU6XHRcdFx0cmV0dXJuIC1FSU5WQUw7XG4gIDc2Olx0XHR9XG4gIDc3Olx0XG4gIDc4Olx0XHRraXQtXHUwMDNlYmxrY2cgPSBjc3NfdG9fYmxrY2coY3NzKTtcbiAgNzk6XHRcdHJldHVybiAwO1xuICA4MDpcdH1cbiAgODE6XHRcbiAgODI6XHQvKipcbiAgODM6XHQgKiBicGZfaXRlcl9ibGtnX25leHQgLSBSZXR1cm4gdGhlIG5leHQgb25saW5lIGJsa2cgb2YgdGhlIGl0ZXJhdGVkIGJsb2NrIGNncm91cFxuICA4NDpcdCAqIEBpdDogaXRlcmF0b3JcbiAgODU6XHQgKlxuICA4NjpcdCAqIFJldHVybjogdGhlIG5leHQgb25saW5lIGJsa2csIG9yIE5VTEwgd2hlbiB0aGUgd2FsayBpcyBkb25lLlxuICA4NzpcdCAqL1xuICA4ODpcdF9fYnBmX2tmdW5jIHN0cnVjdCBibGtjZ19ncSAqYnBmX2l0ZXJfYmxrZ19uZXh0KHN0cnVjdCBicGZfaXRlcl9ibGtnICppdClcbiAgODk6XHR7XG4gIDkwOlx0XHRzdHJ1Y3QgYnBmX2l0ZXJfYmxrZ19rZXJuICpraXQgPSAodm9pZCAqKWl0O1xuICA5MTpcdFx0c3RydWN0IGJsa2NnX2dxICpibGtnID0ga2l0LVx1MDAzZXBvcztcbiAgOTI6XHRcdHN0cnVjdCBobGlzdF9ub2RlICpub2RlO1xuICA5MzpcdFxuICA5NDpcdFx0aWYgKCFraXQtXHUwMDNlYmxrY2cpXG4gIDk1Olx0XHRcdHJldHVybiBOVUxMO1xuICA5NjpcdFxuICA5NzpcdFx0aWYgKCFibGtnKVxuICA5ODpcdFx0XHRub2RlID0gcmN1X2RlcmVmZXJlbmNlKGhsaXN0X2ZpcnN0X3JjdShcdTAwMjZraXQtXHUwMDNlYmxrY2ctXHUwMDNlYmxrZ19saXN0KSk7XG4gIDk5Olx0XHRlbHNlXG4gMTAwOlx0XHRcdG5vZGUgPSByY3VfZGVyZWZlcmVuY2UoaGxpc3RfbmV4dF9yY3UoXHUwMDI2YmxrZy1cdTAwM2VibGtjZ19ub2RlKSk7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+OS8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTcgMjI6MzQ8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTMyODEKCQkJCQkJCW91dHB1dDogMTkKCQkJCQkJCXRob3VnaHRzOiAyNjMKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqTXkgQW5hbHlzaXMgb2YgQlBGIEZ1bmN0aW9uIFJlYWNoYWJpbGl0eSoqCgpPa2F5LCBzbyBJJiMzOTttIGxvb2tpbmcgYXQgdGhlc2UgdGhyZWUgQlBGLXJlbGF0ZWQgZnVuY3Rpb25zOiBgYnBmX2Jsa2NnX2ZsdXNoX3N0YXRzYCwgYGJwZl9pdGVyX2Jsa2dfbmV3YCwgYW5kIGBicGZfaXRlcl9ibGtnX25leHRgLiBUaGUga2V5IHBvaW50IGlzIHRoYXQgdGhleSYjMzk7cmUgY2FsbGFibGUgZnJvbSBCUEYgcHJvZ3JhbXMuIFRoYXQgbWVhbnMgdGhleSBuZWVkIHRvIGJlIGluY2x1ZGVkIGluIGBGb2N1c1N5bWJvbHNgLiBQcmV0dHkgc3RyYWlnaHRmb3J3YXJkLgoKTm93LCB3aGljaCBjb25maWdzIGFyZSBuZWVkZWQgZm9yIHRoZXNlPyBNeSBpbml0aWFsIHRob3VnaHRzIGFyZSBgQkxLX0NHUk9VUGAgYW5kIGBCUEZfU1lTQ0FMTGAuIExldCYjMzk7cyBqdXN0IHF1aWNrbHkgZG91YmxlLWNoZWNrIHRoYXQgYEJQRl9TWVNDQUxMYCBpcyBpbmRlZWQgdGhlIHJpZ2h0IG9uZS4gQWgsIGhlcmUmIzM5O3MgYGJsb2NrL01ha2VmaWxlYDoKCmBgYG1ha2VmaWxlCmlmZGVmIENPTkZJR19CUEZfU1lTQ0FMTApvYmotJChDT05GSUdfQkxLX0NHUk9VUCkJJiM0Mzs9IGJwZl9ibGtjZy5vCmVuZGlmCmBgYAoKWWVwLCB0aGF0IGNvbmZpcm1zIGl0LiBgQlBGX1NZU0NBTExgICphbmQqIGBCTEtfQ0dST1VQYC4gR29vZC4KClRoZSBuZXh0IHRoaW5nIHRoYXQgSSBzaG91bGQgYmUgY2hlY2tpbmcgaXMgd2hldGhlciBgQ0dST1VQU2AgaXMgbmVlZGVkLiBgQkxLX0NHUk9VUGAgZGVwZW5kcyBvbiBgQkxPQ0tgIGFuZCBgQ0dST1VQU2A/IAoKV2FpdCwgaG9sZCBvbiwgbGV0JiMzOTtzIGxvb2sgYXQgYGluaXQvS2NvbmZpZ2A6CgpgYGBrY29uZmlnCmNvbmZpZyBCTEtfQ0dST1VQCglib29sICYjMzQ7SU8gY29udHJvbGxlciYjMzQ7CglkZXBlbmRzIG9uIEJMT0NLCmBgYAoKT2theSwgaXQgc2VlbXMgYXMgaWYgYEJMS19DR1JPVVBgIGlzIGluc2lkZSBgbWVudWNvbmZpZyBDR1JPVVBTYC4KTGV0IG1lIGRvIGEgcXVpY2sgY3Jvc3MtY2hlY2suLi4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTcgMjI6MzQ8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7bWVudWNvbmZpZyBDR1JPVVBTJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2luaXQvS2NvbmZpZz0xMDQ0PWNvbmZpZyBTTEFCX09CSl9FWFRcbi0tXG5pbml0L0tjb25maWctMTA0Ni1cbmluaXQvS2NvbmZpZzoxMDQ3Om1lbnVjb25maWcgQ0dST1VQU1xuaW5pdC9LY29uZmlnLTEwNDgtXHRib29sIFwmIzM0O0NvbnRyb2wgR3JvdXAgc3VwcG9ydFwmIzM0O1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjExLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xNyAyMjozNDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMzk3NAoJCQkJCQkJb3V0cHV0OiAzMwoJCQkJCQkJdGhvdWdodHM6IDM3CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBoZXJlJiMzOTtzIG15IHRha2Ugb24gdGhvc2UgdGhvdWdodHMsIGZyYW1lZCBhcyBhbiBleHBlcnQmIzM5O3MgaW50ZXJuYWwgbW9ub2xvZ3VlOgoKKipDaGVja2luZyB0aGUgQ0dST1VQIENvbmZpZ3VyYXRpb24qKgoKQWxyaWdodCwgc28gYEJMS19DR1JPVVBgIGlzIGluZGVlZCBuZXN0ZWQgd2l0aGluIHRoZSBgQ0dST1VQU2Agb3B0aW9uIGluIGBtZW51Y29uZmlnYC4gVGhhdCYjMzk7cyB0aGUgc3RhcnRpbmcgcG9pbnQuIE5vdywgdG8gYmUgc3VyZSwgYW5kIHRvIHVuZGVyc3RhbmQgdGhlIGJyb2FkZXIgY29udGV4dCwgSSBuZWVkIHRvIGxvb2sgYXQgYGluaXQvS2NvbmZpZ2AgdG8gc2VlIHRoZSBkZXBlbmRlbmNpZXMgYW5kIHdoYXQgZWxzZSBtaWdodCBiZSB0aWVkIHRvIGl0LiBTcGVjaWZpY2FsbHksIEkmIzM5O2xsIGp1bXAgdG8gYXJvdW5kIGxpbmUgMTA0NywgYXMgdGhhdCBzZWVtcyB0byBiZSB3aGVyZSB0aGUgcmVsZXZhbnQgc2VjdGlvbiBzaG91bGQgYmUuIEhvcGVmdWxseSwgdGhhdCBnaXZlcyBtZSBhIGJldHRlciBwaWN0dXJlLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEyLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xNyAyMjozNTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O2luaXQvS2NvbmZpZyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDEwNDAsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogMjAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7MTA0MDpcdFx0aGVscFxuMTA0MTpcdFx0ICBJZiBzZXQsIGF1dG9tYXRpYyBOVU1BIGJhbGFuY2luZyB3aWxsIGJlIGVuYWJsZWQgaWYgcnVubmluZyBvbiBhIE5VTUFcbjEwNDI6XHRcdCAgbWFjaGluZS5cbjEwNDM6XHRcbjEwNDQ6XHRjb25maWcgU0xBQl9PQkpfRVhUXG4xMDQ1Olx0XHRib29sXG4xMDQ2Olx0XG4xMDQ3Olx0bWVudWNvbmZpZyBDR1JPVVBTXG4xMDQ4Olx0XHRib29sIFwmIzM0O0NvbnRyb2wgR3JvdXAgc3VwcG9ydFwmIzM0O1xuMTA0OTpcdFx0c2VsZWN0IEtFUk5GU1xuMTA1MDpcdFx0aGVscFxuMTA1MTpcdFx0ICBUaGlzIG9wdGlvbiBhZGRzIHN1cHBvcnQgZm9yIGdyb3VwaW5nIHNldHMgb2YgcHJvY2Vzc2VzIHRvZ2V0aGVyLCBmb3JcbjEwNTI6XHRcdCAgdXNlIHdpdGggcHJvY2VzcyBjb250cm9sIHN1YnN5c3RlbXMgc3VjaCBhcyBDcHVzZXRzLCBDRlMsIG1lbW9yeVxuMTA1MzpcdFx0ICBjb250cm9scyBvciBkZXZpY2UgaXNvbGF0aW9uLlxuMTA1NDpcdFx0ICBTZWVcbjEwNTU6XHRcdFx0LSBEb2N1bWVudGF0aW9uL3NjaGVkdWxlci9zY2hlZC1kZXNpZ24tQ0ZTLnJzdFx0KENGUylcbjEwNTY6XHRcdFx0LSBEb2N1bWVudGF0aW9uL2FkbWluLWd1aWRlL2Nncm91cC12MS8gKGZlYXR1cmVzIGZvciBncm91cGluZywgaXNvbGF0aW9uXG4xMDU3Olx0XHRcdFx0XHRcdCAgYW5kIHJlc291cmNlIGNvbnRyb2wpXG4xMDU4Olx0XG4xMDU5Olx0XHQgIFNheSBOIGlmIHVuc3VyZS5cbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMy8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTcgMjI6MzU8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTQ0NjMKCQkJCQkJCW91dHB1dDogMzMKCQkJCQkJCXRob3VnaHRzOiAzMwoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgaGVyZSYjMzk7cyBteSBpbnRlcnByZXRhdGlvbiBvZiB0aG9zZSB0aG91Z2h0cywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZSwgcHJlc2VudGVkIGluIHRoZSBmaXJzdCBwZXJzb246CgoqKktlcm5lbCBTdWJzeXN0ZW0gRGVwZW5kZW5jaWVzOiBBIFF1aWNrIE1lbnRhbCBBdWRpdCoqCgpSaWdodCwgc28gYENHUk9VUFNgIGlzIGRlZmluaXRlbHkgYSBjb3JlIHJlcXVpcmVtZW50IGhlcmUuIEJ1dCBob2xkIG9uLCBJIHNlZW0gdG8gcmVtZW1iZXIgYEJMS19DR1JPVVBgIGJlaW5nIGNvbmRpdGlvbmFsbHkgY29tcGlsZWQuLi4gYnVyaWVkIHdpdGhpbiBhbiBgaWYgQ0dST1VQU2AgYmxvY2ssIHJpZ2h0PyBOZWVkIHRvIGNvbmZpcm0gdGhhdCBxdWlja2x5LiBHb3R0YSBrZWVwIHRoZSBkZXBlbmRlbmN5IGNoYWluIHN0cmFpZ2h0IGluIG15IGhlYWQuIExldCBtZSBqdXN0IGRvdWJsZSBjaGVjayB0aGUgcmVsZXZhbnQgY29uZmlnIG9wdGlvbnMgdG8gYmUgYWJzb2x1dGVseSBzdXJlIHRoYXQgYEJMS19DR1JPVVBgIGlzIG9ubHkgZW5hYmxlZCB3aGVuIGBDR1JPVVBTYCBpcy4gV291bGRuJiMzOTt0IHdhbnQgYW55IHN1cnByaXNlcyB3aGVuIGJ1aWxkaW5nLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE0LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xNyAyMjozNTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O2luaXQvS2NvbmZpZyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDEwNjAsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogMjAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7MTA2MDpcdFxuMTA2MTpcdGlmIENHUk9VUFNcbjEwNjI6XHRcbjEwNjM6XHRjb25maWcgUEFHRV9DT1VOVEVSXG4xMDY0Olx0XHRib29sXG4xMDY1Olx0XG4xMDY2Olx0Y29uZmlnIENHUk9VUF9GQVZPUl9EWU5NT0RTXG4xMDY3Olx0XHRib29sIFwmIzM0O0Zhdm9yIGR5bmFtaWMgbW9kaWZpY2F0aW9uIGxhdGVuY3kgcmVkdWN0aW9uIGJ5IGRlZmF1bHRcJiMzNDtcbjEwNjg6XHRcdGhlbHBcbjEwNjk6XHRcdCAgVGhpcyBvcHRpb24gZW5hYmxlcyB0aGUgXCYjMzQ7ZmF2b3JkeW5tb2RzXCYjMzQ7IG1vdW50IG9wdGlvbiBieSBkZWZhdWx0XG4xMDcwOlx0XHQgIHdoaWNoIHJlZHVjZXMgdGhlIGxhdGVuY2llcyBvZiBkeW5hbWljIGNncm91cCBtb2RpZmljYXRpb25zIHN1Y2hcbjEwNzE6XHRcdCAgYXMgdGFzayBtaWdyYXRpb25zIGFuZCBjb250cm9sbGVyIG9uL29mZnMgYXQgdGhlIGNvc3Qgb2YgbWFraW5nXG4xMDcyOlx0XHQgIGhvdCBwYXRoIG9wZXJhdGlvbnMgc3VjaCBhcyBmb3JrcyBhbmQgZXhpdHMgbW9yZSBleHBlbnNpdmUuXG4xMDczOlx0XG4xMDc0Olx0XHQgIFNheSBOIGlmIHVuc3VyZS5cbjEwNzU6XHRcbjEwNzY6XHRjb25maWcgTUVNQ0dcbjEwNzc6XHRcdGJvb2wgXCYjMzQ7TWVtb3J5IGNvbnRyb2xsZXJcJiMzNDtcbjEwNzg6XHRcdHNlbGVjdCBQQUdFX0NPVU5URVJcbjEwNzk6XHRcdHNlbGVjdCBFVkVOVEZEXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTUvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE3IDIyOjM1PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDE0OTI5CgkJCQkJCQlvdXRwdXQ6IDIxCgkJCQkJCQl0aG91Z2h0czogNzIKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGhlcmUmIzM5O3MgbXkgdGFrZSBvbiB0aG9zZSB0aG91Z2h0cywgZnJhbWVkIGFzIG15IG93biBtZW50YWwgcHJvY2Vzc2luZzoKCioqRGVwZW5kZW5jaWVzIGFuZCBDb25kaXRpb25hbHMqKgoKQWxyaWdodCwgbGV0JiMzOTtzIG5haWwgdGhpcyBkb3duLiBJJiMzOTt2ZSBnb3QgdG8gZW5zdXJlIHRoYXQgbXkgdW5kZXJzdGFuZGluZyBvZiB0aGlzIHN5c3RlbSBpcyBjb3JyZWN0LCBlc3BlY2lhbGx5IHdoZW4gaXQgY29tZXMgdG8gdGhvc2UgZmVhdHVyZSBmbGFncyBhbmQgY29uZGl0aW9uYWxzLiBTbywgYEJMS19DR1JPVVBgLCBubyBkb3VidCwgdGhhdCBzaXRzIHNxdWFyZWx5IHdpdGhpbiB0aGUgYGlmIENHUk9VUFNgIGJsb2NrLiBNYWtlcyBwZXJmZWN0IHNlbnNlLiBUaGVyZWZvcmUsIHRoYXQgbWVhbnMgYENHUk9VUFNgIGlzIGRlZmluaXRlbHkgYSBwcmVyZXF1aXNpdGUuIEFuZCwgbmF0dXJhbGx5LCBgQkxPQ0tgIGlzIHJlcXVpcmVkIHRvbywgSSYjMzk7ZCBleHBlY3QgaXQgdG8gYmUsIGJ1dCBpdCYjMzk7cyBnb29kIHRvIGNvbmZpcm0uIFRoYXQmIzM5O3MgYSBmdW5kYW1lbnRhbC4gQW5kIGhleSwgbGV0JiMzOTtzIGtlZXAgZ29pbmcuCgpOb3csIHRoYXQgYEJQRl9TWVNDQUxMYC4uLiBJIG5lZWQgdG8gZG91YmxlLWNoZWNrIHRoYXQgdGhpcyBpcyBjb250YWluZWQgd2l0aGluLCBzYXksIGFuIGBpZiBCUEZgIGNvbmRpdGlvbmFsLiBJdCYjMzk7cyBjcnVjaWFsIHRvIGtub3cgdGhhdCBpdCBpcyBjb250YWluZWQuIEkgbmVlZCB0byBrbm93IHdoZXJlIGl0IHN0YW5kcy4gT3RoZXJ3aXNlLCBJIHdpbGwgbm90IGJlIGFibGUgdG8gcHJvY2VlZC4gSSBoYXZlIHRoZSBmZWVsaW5nIHRoYXQgSSYjMzk7bSBtaXNzaW5nIHNvbWV0aGluZywgdGhvdWdoLiBMZXQmIzM5O3MgZGlnIGluIGEgYml0LgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE2LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xNyAyMjozNTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtjb25maWcgQlBGX1NZU0NBTEwmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7a2VybmVsL2JwZi9LY29uZmlnPTI1PW1lbnUgXCYjMzQ7QlBGIHN1YnN5c3RlbVwmIzM0O1xua2VybmVsL2JwZi9LY29uZmlnLTI2LVxua2VybmVsL2JwZi9LY29uZmlnOjI3OmNvbmZpZyBCUEZfU1lTQ0FMTFxua2VybmVsL2JwZi9LY29uZmlnLTI4LVx0Ym9vbCBcJiMzNDtFbmFibGUgYnBmKCkgc3lzdGVtIGNhbGxcJiMzNDtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNy8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTcgMjI6MzU8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTUzMzcKCQkJCQkJCW91dHB1dDogMzQKCQkJCQkJCXRob3VnaHRzOiAxMwoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBhIHN1bW1hcnkgb2YgbXkgdGhvdWdodCBwcm9jZXNzLCBhcyByZXF1ZXN0ZWQ6CgoqKk5hdmlnYXRpbmcgdGhlIEtlcm5lbCYjMzk7cyBCUEYgQ29uZmlndXJhdGlvbioqCgpPa2F5LCB0aW1lIHRvIGRpdmUgaW4uIE15IGltbWVkaWF0ZSB0aG91Z2h0IGlzIHRvIHN0YXJ0IHdpdGggdGhlIGNvbmZpZ3VyYXRpb24gZmlsZSBmb3IgdGhlIEJlcmtlbGV5IFBhY2tldCBGaWx0ZXIgKEJQRikgc3Vic3lzdGVtLiBJIG5lZWQgdG8gZ2V0IGEgaGFuZGxlIG9uIHRoZSBhdmFpbGFibGUgb3B0aW9ucyBhbmQgZGVwZW5kZW5jaWVzIGJlZm9yZSBJIGdvIGRlZXBlci4gVGhhdCBtZWFucyBJIG5lZWQgdG8gbG9vayBhdCBga2VybmVsL2JwZi9LY29uZmlnYC4gVGhpcyBLY29uZmlnIGZpbGUgd2lsbCBiZSB0aGUgY2VudHJhbCBwb2ludCB0byB1bmRlcnN0YW5kIGhvdyBCUEYgaXMgaW50ZWdyYXRlZCBpbnRvIHRoZSBrZXJuZWwmIzM5O3MgYnVpbGQgc3lzdGVtIGFuZCB3aGF0IGZlYXR1cmVzIGNhbiBiZSBlbmFibGVkIG9yIGRpc2FibGVkLiBUaGlzIGlzIHdoZXJlIHRoZSBjb3JlIEJQRiBjb250cm9scyBhcmUgZGVmaW5lZCwgYW5kIHdoZXJlIEkgY2FuIHN0YXJ0IHVudGFuZ2xpbmcgdGhlIHJlbGF0aW9uc2hpcHMgYmV0d2VlbiBkaWZmZXJlbnQgQlBGIGZlYXR1cmVzLiBUaGlzIGlzIHRoZSBsb2dpY2FsIGZpcnN0IHN0ZXAgZm9yIG1lIHRvIHVuZGVyc3RhbmQgaG93IEJQRiBmaXRzIGludG8gdGhlIGtlcm5lbCBjb25maWd1cmF0aW9uLiBMZXQmIzM5O3Mgc2VlIHdoYXQmIzM5O3MgaW4gdGhlcmUuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTgvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE3IDIyOjM1PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7a2VybmVsL2JwZi9LY29uZmlnJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMjAsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogMjAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7ICAyMDpcdCMgVXNlZCBieSBhcmNocyB0byB0ZWxsIHRoYXQgdGhleSB3YW50IHRoZSBCUEYgSklUIGNvbXBpbGVyIGVuYWJsZWQgYnlcbiAgMjE6XHQjIGRlZmF1bHQgZm9yIGtlcm5lbHMgdGhhdCB3ZXJlIGNvbXBpbGVkIHdpdGggQlBGIEpJVCBzdXBwb3J0LlxuICAyMjpcdGNvbmZpZyBBUkNIX1dBTlRfREVGQVVMVF9CUEZfSklUXG4gIDIzOlx0XHRib29sXG4gIDI0Olx0XG4gIDI1Olx0bWVudSBcJiMzNDtCUEYgc3Vic3lzdGVtXCYjMzQ7XG4gIDI2Olx0XG4gIDI3Olx0Y29uZmlnIEJQRl9TWVNDQUxMXG4gIDI4Olx0XHRib29sIFwmIzM0O0VuYWJsZSBicGYoKSBzeXN0ZW0gY2FsbFwmIzM0O1xuICAyOTpcdFx0c2VsZWN0IEJQRlxuICAzMDpcdFx0c2VsZWN0IElSUV9XT1JLXG4gIDMxOlx0XHRzZWxlY3QgTkVFRF9UQVNLU19SQ1VcbiAgMzI6XHRcdHNlbGVjdCBUQVNLU19UUkFDRV9SQ1VcbiAgMzM6XHRcdHNlbGVjdCBCSU5BUllfUFJJTlRGXG4gIDM0Olx0XHRzZWxlY3QgTkVUX1NPQ0tfTVNHIGlmIE5FVFxuICAzNTpcdFx0c2VsZWN0IE5FVF9YR1JFU1MgaWYgTkVUXG4gIDM2Olx0XHRzZWxlY3QgUEFHRV9QT09MIGlmIE5FVFxuICAzNzpcdFx0ZGVmYXVsdCBuXG4gIDM4Olx0XHRoZWxwXG4gIDM5Olx0XHQgIEVuYWJsZSB0aGUgYnBmKCkgc3lzdGVtIGNhbGwgdGhhdCBhbGxvd3MgdG8gbWFuaXB1bGF0ZSBCUEYgcHJvZ3JhbXNcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xOS8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTcgMjI6MzU8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTU4MjkKCQkJCQkJCW91dHB1dDogMTc1CgkJCQkJCQl0aG91Z2h0czogNDkyCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKk15IEFuYWx5c2lzIG9mIEJsb2NrIEkvTyBDR1JPVVAgQlBGIFN1cHBvcnQqKgoKT2theSwgc28gSSYjMzk7bSBwdXR0aW5nIHRvZ2V0aGVyIHRoZSBwaWVjZXMgZm9yIEJQRiBzeXNjYWxsIHN1cHBvcnQgcmVsYXRlZCB0byBibG9jayBJL08gY2dyb3Vwcy4gVGhlIGNvcmUgaXMgZGVmaW5pdGVseSBnb2luZyB0byByZWx5IG9uIGBCUEZfU1lTQ0FMTGAsIHRoYXQmIzM5O3MgYSBnaXZlbi4gTm93LCBsZXQmIzM5O3MgdGFsayBhYm91dCB0aGUgc3BlY2lmaWMgY29uZmlncyBhbmQgc3ltYm9scy4KCkkgc2VlIHRoYXQgSSBuZWVkIHRvIGVuYWJsZSBhIGZldyBrZXJuZWwgY29uZmlncyB0byBnZXQgdGhpcyByaWdodC4gVGhlIHJlcXVpcmVkIGNvbmZpZ3VyYXRpb25zIGFyZSBwcmV0dHkgY2xlYXItY3V0OiBgQkxLX0NHUk9VUGAsIGBCUEZfU1lTQ0FMTGAsIGBDR1JPVVBTYCwgYW5kIG9mIGNvdXJzZSwgYEJMT0NLYC4gVGhlIGRlcGVuZGVuY2llcyBzZWVtIHNvdW5kLCBib3RoIGBDR1JPVVBTYCBhbmQgYEJMT0NLYCBhcmUgZnVuZGFtZW50YWwgZm9yIHRoaXMgZnVuY3Rpb25hbGl0eS4KCk5vdywgdG8gdGhlIHN5bWJvbHMgSSYjMzk7bGwgbmVlZCB0byBmb2N1cyBvbi4gSSYjMzk7dmUgaWRlbnRpZmllZCBgYnBmX2Jsa2NnX2ZsdXNoX3N0YXRzYCwgYGJwZl9pdGVyX2Jsa2dfbmV3YCwgYW5kIGBicGZfaXRlcl9ibGtnX25leHRgLiBJIGluaXRpYWxseSBzcG90dGVkIHRoYXQgYGJwZl9pdGVyX2Jsa2dfZGVzdHJveWAgaXMgYW4gZW1wdHkga2Z1bmMuIEEga2Z1bmMsIGV2ZW4gYW4gZW1wdHkgb25lLCBoYXMgc29tZSBpbXBvcnRhbmNlIHNvIEkgd2lsbCBpbmNsdWRlIGl0LgoKVGhlbiwgSSBzdHVtYmxlZCB1cG9uIGBibGtjZ19maWxsX3Jvb3RfaW9zdGF0c2AuIEkgbm90aWNlZCBpdCB3YXMgbWFkZSBub24tc3RhdGljLCBzbyBpdCYjMzk7cyBwcm9iYWJseSBpbXBvcnRhbnQuIEl0JiMzOTtzIGNhbGxlZCBmcm9tIGBicGZfYmxrY2dfZmx1c2hfc3RhdHNgIHNvIEkgc2hvdWxkIGluY29ycG9yYXRlIGl0IGludG8gYEZvY3VzU3ltYm9sc2AuIEl0IHJlc2lkZXMgaW4gYGJsb2NrL2Jsay1jZ3JvdXAuY2AgYW5kIGl0ZXJhdGVzIGJsb2NrIGRldmljZXMuIFdoaWxlIGl0JiMzOTtzIG5vdCBhIHBlcmZvcm1hbmNlLWNyaXRpY2FsIHBhdGgsIGl0JiMzOTtzIGludm9sdmVkIGluIHN0YXRzIGZsdXNoaW5nLCBzbyBJIHRoaW5rIGl0JiMzOTtzIHJlbGV2YW50IHRvIGluY2x1ZGUuCgpTbyB0aGUgZmluYWwgc2V0IG9mIHN5bWJvbHMgSSYjMzk7bSBmb2N1c2luZyBvbiBhcmU6IGBicGZfYmxrY2dfZmx1c2hfc3RhdHNgLCBgYnBmX2l0ZXJfYmxrZ19uZXdgLCBgYnBmX2l0ZXJfYmxrZ19uZXh0YCwgYGJwZl9pdGVyX2Jsa2dfZGVzdHJveWAsIGFuZCBgYmxrY2dfZmlsbF9yb290X2lvc3RhdHNgLgoKSSYjMzk7bSBjb25maWRlbnQgaW4gdGhlc2Ugc2VsZWN0aW9ucy4gTm93IEkgc2hvdWxkIGNhbGwgYHNldC1yZXN1bHRzYC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yMC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTcgMjI6MzU8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5zZXQtcmVzdWx0czwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0JMS19DR1JPVVAmIzM0OywKICAgICYjMzQ7QlBGX1NZU0NBTEwmIzM0OywKICAgICYjMzQ7Q0dST1VQUyYjMzQ7LAogICAgJiMzNDtCTE9DSyYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O2JwZl9ibGtjZ19mbHVzaF9zdGF0cyYjMzQ7LAogICAgJiMzNDticGZfaXRlcl9ibGtnX25ldyYjMzQ7LAogICAgJiMzNDticGZfaXRlcl9ibGtnX25leHQmIzM0OywKICAgICYjMzQ7YnBmX2l0ZXJfYmxrZ19kZXN0cm95JiMzNDssCiAgICAmIzM0O2Jsa2NnX2ZpbGxfcm9vdF9pb3N0YXRzJiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIGludHJvZHVjZXMgbmV3IEJQRiBrZnVuY3MgZm9yIGJsb2NrIGNncm91cCBJL08gc3RhdGlzdGljcywgd2hpY2ggYXJlIHJlYWNoYWJsZSBmcm9tIEJQRiBwcm9ncmFtcy4gVGhlc2UgZnVuY3Rpb25zIGFsbG93IEJQRiBwcm9ncmFtcyB0byBmbHVzaCBibG9jayBjZ3JvdXAgc3RhdHMgYW5kIGl0ZXJhdGUgb3ZlciBwZXItZGV2aWNlIGJsa2dzLiBUaGUgY2hhbmdlcyBhcmUgZnVuY3Rpb25hbGx5IHNpZ25pZmljYW50IGFuZCBzaG91bGQgYmUgZnV6emVkLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtCTEtfQ0dST1VQJiMzNDssCiAgICAmIzM0O0JQRl9TWVNDQUxMJiMzNDssCiAgICAmIzM0O0NHUk9VUFMmIzM0OywKICAgICYjMzQ7QkxPQ0smIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDticGZfYmxrY2dfZmx1c2hfc3RhdHMmIzM0OywKICAgICYjMzQ7YnBmX2l0ZXJfYmxrZ19uZXcmIzM0OywKICAgICYjMzQ7YnBmX2l0ZXJfYmxrZ19uZXh0JiMzNDssCiAgICAmIzM0O2JwZl9pdGVyX2Jsa2dfZGVzdHJveSYjMzQ7LAogICAgJiMzNDtibGtjZ19maWxsX3Jvb3RfaW9zdGF0cyYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBpbnRyb2R1Y2VzIG5ldyBCUEYga2Z1bmNzIGZvciBibG9jayBjZ3JvdXAgSS9PIHN0YXRpc3RpY3MsIHdoaWNoIGFyZSByZWFjaGFibGUgZnJvbSBCUEYgcHJvZ3JhbXMuIFRoZXNlIGZ1bmN0aW9ucyBhbGxvdyBCUEYgcHJvZ3JhbXMgdG8gZmx1c2ggYmxvY2sgY2dyb3VwIHN0YXRzIGFuZCBpdGVyYXRlIG92ZXIgcGVyLWRldmljZSBibGtncy4gVGhlIGNoYW5nZXMgYXJlIGZ1bmN0aW9uYWxseSBzaWduaWZpY2FudCBhbmQgc2hvdWxkIGJlIGZ1enplZC4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yMS8xPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTcgMjI6MzU8L3RkPgoJCQk8dGQ+YWN0aW9uPC90ZD4KCQkJPHRkPklmPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIyLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xNyAyMjozNTwvdGQ+CgkJCTx0ZD5hZ2VudDwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5iZXN0LWV4cGVuc2l2ZTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtLTVNBTlJlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBzZXJpZXMgaW50cm9kdWNlcyBCUEYga2Z1bmNzIGZvciBibG9jayBjZ3JvdXAgKGJsa2NnKSBpdGVyYXRpb24gYW5kIHN0YXRpc3RpY3MgZmx1c2hpbmcgKGBicGZfYmxrY2dfZmx1c2hfc3RhdHNgLCBgYnBmX2l0ZXJfYmxrZ19uZXdgLCBgYnBmX2l0ZXJfYmxrZ19uZXh0YCwgYGJwZl9pdGVyX2Jsa2dfZGVzdHJveWApLiBUaGUgaXRlcmF0b3Igc3RhdGUgKGBzdHJ1Y3QgYnBmX2l0ZXJfYmxrZ19rZXJuYCkgaXMgZnVsbHkgaW5pdGlhbGl6ZWQgaW4gYGJwZl9pdGVyX2Jsa2dfbmV3YCBiZWZvcmUgYmVpbmcgdXNlZCBpbiBzdWJzZXF1ZW50IGNhbGxzLiBUaGVyZSBhcmUgbm8gbmV3IGtlcm5lbCBzdHJ1Y3R1cmVzIGNvcGllZCB0byB1c2VyIHNwYWNlIChlLmcuLCB2aWEgYGNvcHlfdG9fdXNlcmAgb3IgbmV0bGluayksIG5vciBhcmUgdGhlcmUgYW55IGNvbXBsZXggYWxsb2NhdGlvbnMgd2hlcmUgdW5pbml0aWFsaXplZCBmaWVsZHMgY291bGQgYmUgbGVha2VkIG9yIHVzZWQgaW4gY29udHJvbCBmbG93LiBUaGUgY2hhbmdlcyBwcmltYXJpbHkgaW52b2x2ZSBwb2ludGVyIHRyYXZlcnNhbCBhbmQgQlBGLWFjY2Vzc2libGUgcmVhZHMgb2YgZXhpc3RpbmcgaW5pdGlhbGl6ZWQgY2dyb3VwIHN0cnVjdHVyZXMuIEFueSBwb3RlbnRpYWwgbWVtb3J5IHNhZmV0eSBpc3N1ZXMsIHN1Y2ggYXMgb3V0LW9mLWJvdW5kcyBhY2Nlc3NlcyBvciB1c2UtYWZ0ZXItZnJlZSBidWdzIGR1cmluZyBpdGVyYXRpb24sIHdvdWxkIGJlIGVmZmVjdGl2ZWx5IGNhdWdodCBieSBLQVNBTiBhbmQgdGhlIEJQRiB2ZXJpZmllci4gVGhlcmVmb3JlLCBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaXMgbm90IHJlcXVpcmVkLiYjMzQ7LAogICYjMzQ7TmVlZHNLTVNBTiYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5JbnN0cnVjdGlvbjo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBzZWN1cml0eSBlbmdpbmVlciBzcGVjaWFsaXppbmcgaW4ga2VybmVsIG1lbW9yeQplcnJvciBkZXRlY3RvcnMgKEtBU0FOIGFuZCBLTVNBTikuIFlvdXIgam9iIGlzIHRvIHJldmlldyB0aGUgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZApkZXRlcm1pbmUgaWYgdGhlIGNvZGUgY2hhbmdlcyBqdXN0aWZ5IHNwYXduaW5nIGEgZGVkaWNhdGVkIEtNU0FOIChLZXJuZWxNZW1vcnlTYW5pdGl6ZXIpCmZ1enppbmcgc2Vzc2lvbiBpbiBhZGRpdGlvbiB0byBzdGFuZGFyZCBLQVNBTiBmdXp6aW5nLgoKQ1JJVElDQUwgRElTVElOQ1RJT04gQkVUV0VFTiBLQVNBTiBBTkQgS01TQU46Ci0gU3RhbmRhcmQgS0FTQU4ga2VybmVsIGJ1aWxkcyAodXBzdHJlYW0tYXBwYXJtb3Ita2FzYW4uY29uZmlnKSBhbHJlYWR5IGVuYWJsZQogIGEgY29tcHJlaGVuc2l2ZSBzdWl0ZSBvZiBkZWJ1Z2dpbmcgdG9vbHMgYW5kIHNhbml0aXplcnMsIGluY2x1ZGluZyBLQVNBTgogIChvdXQtb2YtYm91bmRzIGFjY2Vzc2VzLCB1c2UtYWZ0ZXItZnJlZSwgZG91YmxlIGZyZWUsIGludmFsaWQgZnJlZSksIExPQ0tERVAKICAobG9ja2luZyBidWdzIGFuZCBkZWFkbG9ja3MpLCBVQi1zYW5pdGl6ZXJzLCBhbmQgbWVtb3J5IGNvcnJ1cHRpb24gY2hlY2tzLgotIEtNU0FOIChLZXJuZWxNZW1vcnlTYW5pdGl6ZXIpIGRldGVjdHMgcmVhZHMgb2YgVU5JTklUSUFMSVpFRCBtZW1vcnkgKHN0YWNrLCBoZWFwLAogIG9yIHBhZ2UgYWxsb2NhdGlvbnMpIGFuZCBrZXJuZWwtdG8tdXNlciBtZW1vcnkgaW5mby1sZWFrcy4KClJ1bGU6IFRIRVJFIElTIE5PIFNFTlNFIElOIFJVTk5JTkcgQSBLTVNBTiBTRVNTSU9OIElGIEEgQlVHIENBTiBCRSBDQVVHSFQgQlkgS0FTQU4sCkxPQ0tERVAsIE9SIE9USEVSIFNUQU5EQVJEIEJVRyBERVRFQ1RPUlMuCkEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpbmN1cnMgc2lnbmlmaWNhbnQgcmVzb3VyY2UgY29zdHMuIFlvdSBtdXN0IE9OTFkKc2V0IE5lZWRzS01TQU49dHJ1ZSBpZiB0aGUgY29kZSBjaGFuZ2VzIGludHJvZHVjZSBvciBleHBvc2UgVU5JTklUSUFMSVpFRCBNRU1PUlkgcmlza3MKdGhhdCBhcmUgZGV0ZWN0ZWQgT05MWSBieSBLTVNBTi4KCkxvb2sgaG9saXN0aWNhbGx5IGF0IHRoZSBwYXRjaCBzZXJpZXMgYW5kIHN1cnJvdW5kaW5nIGNvZGUuIEV2ZW4gaWYgbm8gZGlyZWN0CnVuaW5pdGlhbGl6ZWQgZmllbGQgYWNjZXNzZXMgb3IgbmV3IGJ1ZmZlciBhbGxvY2F0aW9ucyBhcmUgYWRkZWQgaW4gdGhlIGRpZmYgaXRzZWxmLAphIHBhdGNoIG1heSBhbHRlciBjb250cm9sIGZsb3csIGJvdW5kcyBjaGVja2luZywgb3IgZGF0YSBsZW5ndGggY2FsY3VsYXRpb25zIGluIHdheXMKdGhhdCBjaGFuZ2UgaG93IHRoZSByZXN0IG9mIHRoZSBjb2RlIG9wZXJhdGVzIG9uIGV4aXN0aW5nIGJ1ZmZlcnMgKGUuZy4gYWxsb3dpbmcKdW5pbml0aWFsaXplZCBzdGFjay9oZWFwIG1lbW9yeSB0byBiZSByZWFkLCBjb3BpZWQgdG8gdXNlciBzcGFjZSwgb3IgdXNlZCBpbiBjb250cm9sCmZsb3cpLiBEbyBub3QgaGVzaXRhdGUgdG8gdXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gaW5zcGVjdCB0aGUgc3Vycm91bmRpbmcgY29kZSwKY2FsbGVkIGZ1bmN0aW9ucywgYW5kIGNhbGxlcnMuCgpTZXQgTmVlZHNLTVNBTj10cnVlIE9OTFkgSUYgdGhlIHBhdGNoIGludHJvZHVjZXMgb3IgbW9kaWZpZXM6CjEuIEtlcm5lbCBzdHJ1Y3R1cmVzIHNlbnQgdG8gdXNlciBzcGFjZSAodmlhIGNvcHlfdG9fdXNlciwgcHV0X3VzZXIsIG5ldGxpbmsgc2tiCiAgIGF0dHJpYnV0ZXMsIGlvY3RsIG91dHB1dCBhcmd1bWVudHMsIHNvY2tldCBvcHRpb25zLCBvciBCUEYgYnVmZmVycykgd2hlcmUgZmllbGRzCiAgIG9yIHN0cnVjdHVyZSBwYWRkaW5nIG1pZ2h0IG5vdCBiZSBmdWxseSBpbml0aWFsaXplZC96ZXJvZWQuCjIuIENvbmRpdGlvbmFsIGxvZ2ljIG9yIGJyYW5jaGluZyB0aGF0IGRlcGVuZHMgb24gcG90ZW50aWFsbHkgdW5pbml0aWFsaXplZCB2YXJpYWJsZXMKICAgb3Igc3RydWN0IGZpZWxkcy4KMy4gQWxsb2NhdGlvbiBvciBpbml0aWFsaXphdGlvbiBvZiBjb21wbGV4IGRhdGEgc3RydWN0dXJlcyB3aGVyZSB1bmluaXRpYWxpemVkIGZpZWxkcwogICBjb3VsZCBiZSByZWFkIGxhdGVyIGluIHJlYWNoYWJsZSBjb2RlIHBhdGhzLgo0LiBCb3VuZHMgY2hlY2tzLCBsZW5ndGhzLCBvciBsb2dpYyBpbiBhIHdheSB0aGF0IGFsbG93cyBzdXJyb3VuZGluZyBjb2RlIHRvIGFjY2VzcwogICB1bmluaXRpYWxpemVkIGJ5dGVzIG9mIGV4aXN0aW5nIGJ1ZmZlcnMuCgpTZXQgTmVlZHNLTVNBTj1mYWxzZSBJRjoKLSBUaGUgY29kZSBjaGFuZ2VzIHByaW1hcmlseSByaXNrIG91dC1vZi1ib3VuZHMgYWNjZXNzLCBhcnJheSBvdmVyZmxvd3MsIE5VTEwgcG9pbnRlcgogIGRlcmVmZXJlbmNlcywgbG9ja2luZyBkZWFkbG9ja3MsIG9yIHVzZS1hZnRlci1mcmVlIGJ1Z3MgKHRoZXNlIGFyZSBhbHJlYWR5IGNhdWdodAogIGJ5IEtBU0FOLCBMT0NLREVQLCBvciBzdGFuZGFyZCBidWcgZGV0ZWN0b3JzKS4KLSBBbGwgc3RhY2svaGVhcCBzdHJ1Y3R1cmVzIHRvdWNoZWQgb3IgaW50cm9kdWNlZCBieSB0aGUgcGF0Y2ggYXJlIGZ1bGx5IHplcm9lZAogIG9yIGluaXRpYWxpemVkIChlLmcuIHVzaW5nID0gezB9LCBtZW1zZXQsIGt6YWxsb2MpIGJlZm9yZSBiZWluZyByZWFkIG9yIGNvcGllZC4KLSBUaGUgcGF0Y2ggZG9lcyBub3QgaW50cm9kdWNlIGFueSByaXNrIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHVzYWdlIG9yIGluZm8tbGVha3MuCgpVc2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBpbnNwZWN0IHRoZSBzdXJyb3VuZGluZyBjb2RlIGlmIG5lY2Vzc2FyeSwgdGhlbiBwcm92aWRlCmRldGFpbGVkIEtNU0FOUmVhc29uaW5nIGNvbnRyYXN0aW5nIEtBU0FOIHZzIEtNU0FOIGFwcGxpY2FiaWxpdHkgZm9yIHRoaXMgcGF0Y2guClByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLgoKClVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuCkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LgpJZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UHJvbXB0OjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Rm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6CmNvbW1pdCA3NzMwMDM2M2ZlOWM1YjBhZmMzNmQ5Zjc0ZWFkYjQxYmE2ZGQ1M2E1CkF1dGhvcjogc3l6LWNsdXN0ZXIgJmx0O3RyaWFnZUBzeXprYWxsZXIuY29tJmd0OwpEYXRlOiAgIE1vbiBBdWcgMTcgMjI6MzQ6MzIgMjAyNiAmIzQzOzAwMDAKCiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXcKCmRpZmYgLS1naXQgYS9NQUlOVEFJTkVSUyBiL01BSU5UQUlORVJTCmluZGV4IDJmOTQ3MmMxYTA5MDcuLjg3YzU2ZTk1NTU3NzEgMTAwNjQ0Ci0tLSBhL01BSU5UQUlORVJTCiYjNDM7JiM0MzsmIzQzOyBiL01BSU5UQUlORVJTCkBAIC02NjE3LDYgJiM0Mzs2NjE3LDcgQEAgRjoJYmxvY2svYmxrLWNncm91cC5jCiBGOglibG9jay9ibGstaW9jb3N0LmMKIEY6CWJsb2NrL2Jsay1pb2xhdGVuY3kuYwogRjoJYmxvY2svYmxrLXRocm90dGxlLmMKJiM0MztGOglibG9jay9icGZfYmxrY2cuYwogRjoJaW5jbHVkZS9saW51eC9ibGstY2dyb3VwLmgKIAogQ09OVFJPTCBHUk9VUCAtIENQVVNFVApkaWZmIC0tZ2l0IGEvYmxvY2svTWFrZWZpbGUgYi9ibG9jay9NYWtlZmlsZQppbmRleCBlN2JkMzIwZTNkNjk3Li41NzJlNDk5ODhjOGVlIDEwMDY0NAotLS0gYS9ibG9jay9NYWtlZmlsZQomIzQzOyYjNDM7JiM0MzsgYi9ibG9jay9NYWtlZmlsZQpAQCAtMTcsNiAmIzQzOzE3LDkgQEAgb2JqLSQoQ09ORklHX0JMS19FUlJPUl9JTkpFQ1RJT04pICYjNDM7PSBlcnJvci1pbmplY3Rpb24ubwogb2JqLSQoQ09ORklHX0JMS19ERVZfQlNHX0NPTU1PTikgJiM0Mzs9IGJzZy5vCiBvYmotJChDT05GSUdfQkxLX0RFVl9CU0dMSUIpCSYjNDM7PSBic2ctbGliLm8KIG9iai0kKENPTkZJR19CTEtfQ0dST1VQKQkmIzQzOz0gYmxrLWNncm91cC5vCiYjNDM7aWZkZWYgQ09ORklHX0JQRl9TWVNDQUxMCiYjNDM7b2JqLSQoQ09ORklHX0JMS19DR1JPVVApCSYjNDM7PSBicGZfYmxrY2cubwomIzQzO2VuZGlmCiBvYmotJChDT05GSUdfQkxLX0NHUk9VUF9SV1NUQVQpCSYjNDM7PSBibGstY2dyb3VwLXJ3c3RhdC5vCiBvYmotJChDT05GSUdfQkxLX0NHUk9VUF9GQ19BUFBJRCkgJiM0Mzs9IGJsay1jZ3JvdXAtZmMtYXBwaWQubwogb2JqLSQoQ09ORklHX0JMS19ERVZfVEhST1RUTElORykJJiM0Mzs9IGJsay10aHJvdHRsZS5vCmRpZmYgLS1naXQgYS9ibG9jay9ibGstY2dyb3VwLmMgYi9ibG9jay9ibGstY2dyb3VwLmMKaW5kZXggZDk2NzYxMjZjNWI1ZC4uOGQ1MzhhZDRlODYxYyAxMDA2NDQKLS0tIGEvYmxvY2svYmxrLWNncm91cC5jCiYjNDM7JiM0MzsmIzQzOyBiL2Jsb2NrL2Jsay1jZ3JvdXAuYwpAQCAtMTA4Niw3ICYjNDM7MTA4Niw3IEBAIHN0YXRpYyB2b2lkIGJsa2NnX3JzdGF0X2ZsdXNoKHN0cnVjdCBjZ3JvdXBfc3Vic3lzX3N0YXRlICpjc3MsIGludCBjcHUpCiAgKiBmbHVzaGluZyB0aGUgcm9vdCBjZ3JvdXAmIzM5O3Mgc3RhdHMgYnkgZXhwbGljaXRseSBmaWxsaW5nIGluIHRoZSBpb3N0YXQKICAqIHdpdGggZGlzayBsZXZlbCBzdGF0aXN0aWNzLgogICovCi1zdGF0aWMgdm9pZCBibGtjZ19maWxsX3Jvb3RfaW9zdGF0cyh2b2lkKQomIzQzO3ZvaWQgYmxrY2dfZmlsbF9yb290X2lvc3RhdHModm9pZCkKIHsKIAlzdHJ1Y3QgY2xhc3NfZGV2X2l0ZXIgaXRlcjsKIAlzdHJ1Y3QgZGV2aWNlICpkZXY7CmRpZmYgLS1naXQgYS9ibG9jay9ibGstY2dyb3VwLmggYi9ibG9jay9ibGstY2dyb3VwLmgKaW5kZXggNjE1MzkwZjc1MWFhMi4uOGM5YzJhMWFkZmFhNCAxMDA2NDQKLS0tIGEvYmxvY2svYmxrLWNncm91cC5oCiYjNDM7JiM0MzsmIzQzOyBiL2Jsb2NrL2Jsay1jZ3JvdXAuaApAQCAtMjA1LDYgJiM0MzsyMDUsNyBAQCB2b2lkIGJsa2NnX2RlYWN0aXZhdGVfcG9saWN5KHN0cnVjdCBnZW5kaXNrICpkaXNrLAogCQkJICAgICBjb25zdCBzdHJ1Y3QgYmxrY2dfcG9saWN5ICpwb2wpOwogCiBjb25zdCBjaGFyICpibGtnX2Rldl9uYW1lKHN0cnVjdCBibGtjZ19ncSAqYmxrZyk7CiYjNDM7dm9pZCBibGtjZ19maWxsX3Jvb3RfaW9zdGF0cyh2b2lkKTsKIHZvaWQgYmxrY2dfcHJpbnRfYmxrZ3Moc3RydWN0IHNlcV9maWxlICpzZiwgc3RydWN0IGJsa2NnICpibGtjZywKIAkJICAgICAgIHU2NCAoKnByZmlsbCkoc3RydWN0IHNlcV9maWxlICosCiAJCQkJICAgICBzdHJ1Y3QgYmxrZ19wb2xpY3lfZGF0YSAqLCBpbnQpLApkaWZmIC0tZ2l0IGEvYmxvY2svYnBmX2Jsa2NnLmMgYi9ibG9jay9icGZfYmxrY2cuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwLi4yNWM4MDlmNTA5MWMyCi0tLSAvZGV2L251bGwKJiM0MzsmIzQzOyYjNDM7IGIvYmxvY2svYnBmX2Jsa2NnLmMKQEAgLTAsMCAmIzQzOzEsMTU0IEBACiYjNDM7Ly8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb3ItbGF0ZXIKJiM0MzsvKgomIzQzOyAqIEJsb2NrIEkvTyBDb250cm9sbGVyLXJlbGF0ZWQgQlBGIGtmdW5jcyBhbmQgYXV4aWxpYXJ5IGNvZGUKJiM0MzsgKi8KJiM0MzsKJiM0MzsjaW5jbHVkZSAmIzM0O2Jsay1jZ3JvdXAuaCYjMzQ7CiYjNDM7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L2JwZi5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9idGZfaWRzLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L3JjdWxpc3QuaCZndDsKJiM0MzsKJiM0MztfX2JwZl9rZnVuY19zdGFydF9kZWZzKCk7CiYjNDM7CiYjNDM7LyoqCiYjNDM7ICogYnBmX2Jsa2NnX2ZsdXNoX3N0YXRzIC0gRmx1c2ggYSBibG9jayBjZ3JvdXAmIzM5O3MgaW8gc3RhdGlzdGljcwomIzQzOyAqIEBjZ3JwOiBjZ3JvdXAgdG8gZmx1c2gKJiM0MzsgKgomIzQzOyAqIFByb3BhZ2F0ZSBJL08gc3RhdGlzdGljcyB1cCB0aGUgY2dyb3VwIHRyZWUuIFJvb3Qgc3RhdGlzdGljcyBjb21lIGZyb20KJiM0MzsgKiBibG9jayBkZXZpY2VzIGFuZCBpbmNsdWRlIGFsbCBjZ3JvdXBzJiMzOTsgSS9PLgomIzQzOyAqLwomIzQzO19fYnBmX2tmdW5jIHZvaWQgYnBmX2Jsa2NnX2ZsdXNoX3N0YXRzKHN0cnVjdCBjZ3JvdXAgKmNncnApCiYjNDM7ewomIzQzOwlzdHJ1Y3QgY2dyb3VwX3N1YnN5c19zdGF0ZSAqY3NzOwomIzQzOwomIzQzOwkvKiBQaW4gdGhlIGNzcyBmb3IgdGhlIHNsZWVwYWJsZSBmbHVzaC4gKi8KJiM0MzsJcmN1X3JlYWRfbG9jaygpOwomIzQzOwljc3MgPSBjZ3JvdXBfY3NzKGNncnAsICZhbXA7aW9fY2dycF9zdWJzeXMpOwomIzQzOwlpZiAoY3NzICZhbXA7JmFtcDsgIWNzc190cnlnZXQoY3NzKSkKJiM0MzsJCWNzcyA9IE5VTEw7CiYjNDM7CXJjdV9yZWFkX3VubG9jaygpOwomIzQzOwomIzQzOwlpZiAoIWNzcykKJiM0MzsJCXJldHVybjsKJiM0MzsKJiM0MzsJaWYgKCFjc3MtJmd0O3BhcmVudCkKJiM0MzsJCWJsa2NnX2ZpbGxfcm9vdF9pb3N0YXRzKCk7CiYjNDM7CWVsc2UKJiM0MzsJCWNzc19yc3RhdF9mbHVzaChjc3MpOwomIzQzOwomIzQzOwljc3NfcHV0KGNzcyk7CiYjNDM7fQomIzQzOwomIzQzO3N0cnVjdCBicGZfaXRlcl9ibGtnIHsKJiM0MzsJX191NjQgX19vcGFxdWVbMl07CiYjNDM7fSBfX2FsaWduZWQoOCk7CiYjNDM7CiYjNDM7c3RydWN0IGJwZl9pdGVyX2Jsa2dfa2VybiB7CiYjNDM7CXN0cnVjdCBibGtjZyAqYmxrY2c7CiYjNDM7CXN0cnVjdCBibGtjZ19ncSAqcG9zOwomIzQzO30gX19hbGlnbmVkKDgpOwomIzQzOwomIzQzOy8qKgomIzQzOyAqIGJwZl9pdGVyX2Jsa2dfbmV3IC0gU3RhcnQgaXRlcmF0aW5nIGEgYmxvY2sgY2dyb3VwJiMzOTtzIHBlci1kZXZpY2UgYmxrZ3MKJiM0MzsgKiBAaXQ6IGl0ZXJhdG9yIHRvIGluaXRpYWxpemUKJiM0MzsgKiBAY3NzOiB0aGUgaW8gY29udHJvbGxlciYjMzk7cyBjc3MKJiM0MzsgKgomIzQzOyAqIEVhY2ggYmxrZyBob2xkcyBvbmUgZGV2aWNlJiMzOTtzIGlvLnN0YXQgY291bnRlcnMuIE9mZmxpbmUgYmxrZ3MgYXJlIHNraXBwZWQuCiYjNDM7ICogQSBibGtnIHdpdGhvdXQgYSBkaXNrIGNhbiBiZSByZXR1cm5lZC4gTXVzdCBydW4gdW5kZXIgUkNVLgomIzQzOyAqCiYjNDM7ICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIC1FSU5WQUwgaWYgQGNzcyBpcyBub3QgdGhlIGlvIGNvbnRyb2xsZXImIzM5O3MuCiYjNDM7ICovCiYjNDM7X19icGZfa2Z1bmMgaW50IGJwZl9pdGVyX2Jsa2dfbmV3KHN0cnVjdCBicGZfaXRlcl9ibGtnICppdCwKJiM0MzsJCQkJICBzdHJ1Y3QgY2dyb3VwX3N1YnN5c19zdGF0ZSAqY3NzKQomIzQzO3sKJiM0MzsJc3RydWN0IGJwZl9pdGVyX2Jsa2dfa2VybiAqa2l0ID0gKHZvaWQgKilpdDsKJiM0MzsKJiM0MzsJQlVJTERfQlVHX09OKHNpemVvZihzdHJ1Y3QgYnBmX2l0ZXJfYmxrZ19rZXJuKSAmZ3Q7IHNpemVvZihzdHJ1Y3QgYnBmX2l0ZXJfYmxrZykpOwomIzQzOwlCVUlMRF9CVUdfT04oX19hbGlnbm9mX18oc3RydWN0IGJwZl9pdGVyX2Jsa2dfa2VybikgIT0KJiM0MzsJCSAgICAgX19hbGlnbm9mX18oc3RydWN0IGJwZl9pdGVyX2Jsa2cpKTsKJiM0MzsKJiM0MzsJa2l0LSZndDtwb3MgPSBOVUxMOwomIzQzOwomIzQzOwlpZiAoY3NzLSZndDtzcyAhPSAmYW1wO2lvX2NncnBfc3Vic3lzKSB7CiYjNDM7CQlraXQtJmd0O2Jsa2NnID0gTlVMTDsKJiM0MzsJCXJldHVybiAtRUlOVkFMOwomIzQzOwl9CiYjNDM7CiYjNDM7CWtpdC0mZ3Q7YmxrY2cgPSBjc3NfdG9fYmxrY2coY3NzKTsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOwomIzQzOy8qKgomIzQzOyAqIGJwZl9pdGVyX2Jsa2dfbmV4dCAtIFJldHVybiB0aGUgbmV4dCBvbmxpbmUgYmxrZyBvZiB0aGUgaXRlcmF0ZWQgYmxvY2sgY2dyb3VwCiYjNDM7ICogQGl0OiBpdGVyYXRvcgomIzQzOyAqCiYjNDM7ICogUmV0dXJuOiB0aGUgbmV4dCBvbmxpbmUgYmxrZywgb3IgTlVMTCB3aGVuIHRoZSB3YWxrIGlzIGRvbmUuCiYjNDM7ICovCiYjNDM7X19icGZfa2Z1bmMgc3RydWN0IGJsa2NnX2dxICpicGZfaXRlcl9ibGtnX25leHQoc3RydWN0IGJwZl9pdGVyX2Jsa2cgKml0KQomIzQzO3sKJiM0MzsJc3RydWN0IGJwZl9pdGVyX2Jsa2dfa2VybiAqa2l0ID0gKHZvaWQgKilpdDsKJiM0MzsJc3RydWN0IGJsa2NnX2dxICpibGtnID0ga2l0LSZndDtwb3M7CiYjNDM7CXN0cnVjdCBobGlzdF9ub2RlICpub2RlOwomIzQzOwomIzQzOwlpZiAoIWtpdC0mZ3Q7YmxrY2cpCiYjNDM7CQlyZXR1cm4gTlVMTDsKJiM0MzsKJiM0MzsJaWYgKCFibGtnKQomIzQzOwkJbm9kZSA9IHJjdV9kZXJlZmVyZW5jZShobGlzdF9maXJzdF9yY3UoJmFtcDtraXQtJmd0O2Jsa2NnLSZndDtibGtnX2xpc3QpKTsKJiM0MzsJZWxzZQomIzQzOwkJbm9kZSA9IHJjdV9kZXJlZmVyZW5jZShobGlzdF9uZXh0X3JjdSgmYW1wO2Jsa2ctJmd0O2Jsa2NnX25vZGUpKTsKJiM0MzsKJiM0MzsJLyogU2tpcCBvZmZsaW5lIGJsa2dzLCBtYXRjaGluZyBpby5zdGF0LiAqLwomIzQzOwl3aGlsZSAobm9kZSkgewomIzQzOwkJYmxrZyA9IGhsaXN0X2VudHJ5KG5vZGUsIHN0cnVjdCBibGtjZ19ncSwgYmxrY2dfbm9kZSk7CiYjNDM7CQkvKiBBIHJhY2Ugb25seSBjaGFuZ2VzIHdoZXRoZXIgdGhpcyBibGtnIGlzIHJldHVybmVkLiAqLwomIzQzOwkJaWYgKGRhdGFfcmFjZShibGtnLSZndDtvbmxpbmUpKSB7CiYjNDM7CQkJa2l0LSZndDtwb3MgPSBibGtnOwomIzQzOwkJCXJldHVybiBibGtnOwomIzQzOwkJfQomIzQzOwkJbm9kZSA9IHJjdV9kZXJlZmVyZW5jZShobGlzdF9uZXh0X3JjdSgmYW1wO2Jsa2ctJmd0O2Jsa2NnX25vZGUpKTsKJiM0MzsJfQomIzQzOwomIzQzOwkvKiBUaGUgaXRlcmF0b3IgbXVzdCBrZWVwIHJldHVybmluZyBOVUxMIGFmdGVyIGNvbXBsZXRpb24uICovCiYjNDM7CWtpdC0mZ3Q7cG9zID0gTlVMTDsKJiM0MzsJa2l0LSZndDtibGtjZyA9IE5VTEw7CiYjNDM7CXJldHVybiBOVUxMOwomIzQzO30KJiM0MzsKJiM0MzsvKioKJiM0MzsgKiBicGZfaXRlcl9ibGtnX2Rlc3Ryb3kgLSBUZWFyIGRvd24gYSBibGtnIGl0ZXJhdG9yCiYjNDM7ICogQGl0OiBpdGVyYXRvcgomIzQzOyAqLwomIzQzO19fYnBmX2tmdW5jIHZvaWQgYnBmX2l0ZXJfYmxrZ19kZXN0cm95KHN0cnVjdCBicGZfaXRlcl9ibGtnICppdCkKJiM0Mzt7CiYjNDM7fQomIzQzOwomIzQzO19fYnBmX2tmdW5jX2VuZF9kZWZzKCk7CiYjNDM7CiYjNDM7QlRGX0tGVU5DU19TVEFSVChicGZfYmxrY2dfa2Z1bmNzKQomIzQzO0JURl9JRF9GTEFHUyhmdW5jLCBicGZfYmxrY2dfZmx1c2hfc3RhdHMsIEtGX1NMRUVQQUJMRSkKJiM0MzsKJiM0MztCVEZfSURfRkxBR1MoZnVuYywgYnBmX2l0ZXJfYmxrZ19uZXcsCiYjNDM7CSAgICAgS0ZfSVRFUl9ORVcgfCBLRl9SQ1UgfCBLRl9SQ1VfUFJPVEVDVEVEKQomIzQzO0JURl9JRF9GTEFHUyhmdW5jLCBicGZfaXRlcl9ibGtnX25leHQsIEtGX0lURVJfTkVYVCB8IEtGX1JFVF9OVUxMKQomIzQzO0JURl9JRF9GTEFHUyhmdW5jLCBicGZfaXRlcl9ibGtnX2Rlc3Ryb3ksIEtGX0lURVJfREVTVFJPWSkKJiM0MztCVEZfS0ZVTkNTX0VORChicGZfYmxrY2dfa2Z1bmNzKQomIzQzOwomIzQzO3N0YXRpYyBjb25zdCBzdHJ1Y3QgYnRmX2tmdW5jX2lkX3NldCBicGZfYmxrY2dfa2Z1bmNfc2V0ID0gewomIzQzOwkub3duZXIJCT0gVEhJU19NT0RVTEUsCiYjNDM7CS5zZXQJCT0gJmFtcDticGZfYmxrY2dfa2Z1bmNzLAomIzQzO307CiYjNDM7CiYjNDM7c3RhdGljIGludCBfX2luaXQgYnBmX2Jsa2NnX2luaXQodm9pZCkKJiM0Mzt7CiYjNDM7CWludCBlcnI7CiYjNDM7CiYjNDM7CWVyciA9IHJlZ2lzdGVyX2J0Zl9rZnVuY19pZF9zZXQoQlBGX1BST0dfVFlQRV9VTlNQRUMsCiYjNDM7CQkJCQkmYW1wO2JwZl9ibGtjZ19rZnVuY19zZXQpOwomIzQzOwlpZiAoZXJyKQomIzQzOwkJcHJfd2FybigmIzM0O2Vycm9yIHdoaWxlIHJlZ2lzdGVyaW5nIGJwZiBibGtjZyBrZnVuY3M6ICVkXG4mIzM0OywgZXJyKTsKJiM0MzsKJiM0MzsJcmV0dXJuIGVycjsKJiM0Mzt9CiYjNDM7bGF0ZV9pbml0Y2FsbChicGZfYmxrY2dfaW5pdCk7CmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvY2dyb3VwX2l0ZXJfaW8uaCBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9jZ3JvdXBfaXRlcl9pby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAuLmY0YmJhYWNjZGY3MTYKLS0tIC9kZXYvbnVsbAomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvY2dyb3VwX2l0ZXJfaW8uaApAQCAtMCwwICYjNDM7MSwxNyBAQAomIzQzOy8qIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wICovCiYjNDM7LyogQ29weXJpZ2h0IChjKSAyMDI1IE1ldGEgUGxhdGZvcm1zLCBJbmMuIGFuZCBhZmZpbGlhdGVzLiAqLwomIzQzOyNpZm5kZWYgX19DR1JPVVBfSVRFUl9JT19ICiYjNDM7I2RlZmluZSBfX0NHUk9VUF9JVEVSX0lPX0gKJiM0MzsKJiM0MztzdHJ1Y3QgaW9fcXVlcnkgewomIzQzOwkvKiBvbmUgZGV2aWNlJiMzOTtzIGlvLnN0YXQgY291bnRlcnMgKi8KJiM0MzsJX191NjQgcmJ5dGVzOwomIzQzOwlfX3U2NCB3Ynl0ZXM7CiYjNDM7CV9fdTY0IHJpb3M7CiYjNDM7CV9fdTY0IHdpb3M7CiYjNDM7CV9fdTY0IGRieXRlczsKJiM0MzsJX191NjQgZGlvczsKJiM0MzsJX191NjQgZGV2OwkvKiBkZXZfdCBvZiB0aGUgZGV2aWNlIHRoZSBjb3VudGVycyBiZWxvbmcgdG8gKi8KJiM0Mzt9OwomIzQzOwomIzQzOyNlbmRpZiAvKiBfX0NHUk9VUF9JVEVSX0lPX0ggKi8KZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9jb25maWcgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvY29uZmlnCmluZGV4IGVhNzA0NGYzMGFkYzMuLjI3MGU2YmY5MTk0ZDIgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9jb25maWcKJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL2NvbmZpZwpAQCAtMSwzICYjNDM7MSw0IEBACiYjNDM7Q09ORklHX0JMS19DR1JPVVA9eQogQ09ORklHX0JMS19ERVZfTE9PUD15CiBDT05GSUdfQk9PVFBBUkFNX0hBUkRMT0NLVVBfUEFOSUM9eQogQ09ORklHX0JPT1RQQVJBTV9TT0ZUTE9DS1VQX1BBTklDPTEKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2Nncm91cF9pdGVyX2lvLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9jZ3JvdXBfaXRlcl9pby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAuLjVkMjdlNWQyODM3OTUKLS0tIC9kZXYvbnVsbAomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9jZ3JvdXBfaXRlcl9pby5jCkBAIC0wLDAgJiM0MzsxLDI3NyBAQAomIzQzOy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wCiYjNDM7LyogQ29weXJpZ2h0IChjKSAyMDI1IE1ldGEgUGxhdGZvcm1zLCBJbmMuIGFuZCBhZmZpbGlhdGVzLiAqLwomIzQzOyNkZWZpbmUgX0dOVV9TT1VSQ0UKJiM0MzsjaW5jbHVkZSAmbHQ7dGVzdF9wcm9ncy5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDticGYvbGliYnBmLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2ZjbnRsLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L2xvb3AuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7c3RkbGliLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N0cmluZy5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtzeXMvaW9jdGwuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7c3lzL3N0YXQuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7c3lzL3N5c21hY3Jvcy5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDt1bmlzdGQuaCZndDsKJiM0MzsjaW5jbHVkZSAmIzM0O2Nncm91cF9oZWxwZXJzLmgmIzM0OwomIzQzOyNpbmNsdWRlICYjMzQ7Y2dyb3VwX2l0ZXJfaW8uaCYjMzQ7CiYjNDM7I2luY2x1ZGUgJiMzNDtjZ3JvdXBfaXRlcl9pby5za2VsLmgmIzM0OwomIzQzOwomIzQzOyNkZWZpbmUgSU9fU0laRSAoNCAqIDEwMjQgKiAxMDI0KQomIzQzOwomIzQzO3N0YXRpYyBpbnQgcmVhZF9zdGF0cyhzdHJ1Y3QgYnBmX2xpbmsgKmxpbmspCiYjNDM7ewomIzQzOwlpbnQgZmQsIHJldCA9IDA7CiYjNDM7CXNzaXplX3QgYnl0ZXM7CiYjNDM7CiYjNDM7CWZkID0gYnBmX2l0ZXJfY3JlYXRlKGJwZl9saW5rX19mZChsaW5rKSk7CiYjNDM7CWlmICghQVNTRVJUX09LX0ZEKGZkLCAmIzM0O2JwZl9pdGVyX2NyZWF0ZSYjMzQ7KSkKJiM0MzsJCXJldHVybiAxOwomIzQzOwomIzQzOwkvKiBSZXN1bHRzIGxhbmQgaW4gc2tlbC0mZ3Q7ZGF0YV9xdWVyeTsgdGhlIHJlYWQgaXRzZWxmIHJldHVybnMgbm8gZGF0YS4gKi8KJiM0MzsJYnl0ZXMgPSByZWFkKGZkLCBOVUxMLCAwKTsKJiM0MzsJaWYgKCFBU1NFUlRfRVEoYnl0ZXMsIDAsICYjMzQ7cmVhZCBmZCYjMzQ7KSkKJiM0MzsJCXJldCA9IDE7CiYjNDM7CiYjNDM7CWNsb3NlKGZkKTsKJiM0MzsJcmV0dXJuIHJldDsKJiM0Mzt9CiYjNDM7CiYjNDM7LyogU2V0IHVwIGEgbG9vcCBkZXZpY2UgZm9yIGNncm91cC1jaGFyZ2VkIEkvTy4gKi8KJiM0MztzdGF0aWMgaW50IGxvb3Bfc2V0dXAoY2hhciAqbG9vcF9wYXRoLCBzaXplX3Qgc3osIGludCAqY3RsX2ZkLCBpbnQgKmxvb3BfZmQsCiYjNDM7CQkgICAgICBpbnQgKmJhY2tfZmQpCiYjNDM7ewomIzQzOwljaGFyIGJhY2tfcGF0aFtdID0gJiMzNDsvdG1wL2Nncm91cF9pdGVyX2lvLlhYWFhYWCYjMzQ7OwomIzQzOwlpbnQgbnI7CiYjNDM7CiYjNDM7CSpjdGxfZmQgPSAqbG9vcF9mZCA9ICpiYWNrX2ZkID0gLTE7CiYjNDM7CiYjNDM7CSpjdGxfZmQgPSBvcGVuKCYjMzQ7L2Rldi9sb29wLWNvbnRyb2wmIzM0OywgT19SRFdSIHwgT19DTE9FWEVDKTsKJiM0MzsJaWYgKCpjdGxfZmQgJmx0OyAwKQomIzQzOwkJcmV0dXJuIC0xOwomIzQzOwomIzQzOwluciA9IGlvY3RsKCpjdGxfZmQsIExPT1BfQ1RMX0dFVF9GUkVFKTsKJiM0MzsJaWYgKG5yICZsdDsgMCkKJiM0MzsJCWdvdG8gZXJyOwomIzQzOwlzbnByaW50Zihsb29wX3BhdGgsIHN6LCAmIzM0Oy9kZXYvbG9vcCVkJiMzNDssIG5yKTsKJiM0MzsKJiM0MzsJKmJhY2tfZmQgPSBta3N0ZW1wKGJhY2tfcGF0aCk7CiYjNDM7CWlmICgqYmFja19mZCAmbHQ7IDApCiYjNDM7CQlnb3RvIGVycjsKJiM0MzsJdW5saW5rKGJhY2tfcGF0aCk7CiYjNDM7CWlmIChmdHJ1bmNhdGUoKmJhY2tfZmQsIChvZmZfdClJT19TSVpFICogNCkpCiYjNDM7CQlnb3RvIGVycjsKJiM0MzsKJiM0MzsJKmxvb3BfZmQgPSBvcGVuKGxvb3BfcGF0aCwgT19SRFdSIHwgT19DTE9FWEVDKTsKJiM0MzsJaWYgKCpsb29wX2ZkICZsdDsgMCkKJiM0MzsJCWdvdG8gZXJyOwomIzQzOwlpZiAoaW9jdGwoKmxvb3BfZmQsIExPT1BfU0VUX0ZELCAqYmFja19mZCkpCiYjNDM7CQlnb3RvIGVycjsKJiM0MzsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7ZXJyOgomIzQzOwlpZiAoKmxvb3BfZmQgJmd0Oz0gMCkKJiM0MzsJCWNsb3NlKCpsb29wX2ZkKTsKJiM0MzsJaWYgKCpiYWNrX2ZkICZndDs9IDApCiYjNDM7CQljbG9zZSgqYmFja19mZCk7CiYjNDM7CWNsb3NlKCpjdGxfZmQpOwomIzQzOwkqY3RsX2ZkID0gKmxvb3BfZmQgPSAqYmFja19mZCA9IC0xOwomIzQzOwlyZXR1cm4gLTE7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkIGxvb3BfdGVhcmRvd24oY29uc3QgY2hhciAqbG9vcF9wYXRoLCBpbnQgY3RsX2ZkLCBpbnQgbG9vcF9mZCwKJiM0MzsJCQkgIGludCBiYWNrX2ZkKQomIzQzO3sKJiM0MzsJaW50IG5yID0gLTE7CiYjNDM7CiYjNDM7CWlmIChsb29wX2ZkICZndDs9IDApIHsKJiM0MzsJCWlvY3RsKGxvb3BfZmQsIExPT1BfQ0xSX0ZELCAwKTsKJiM0MzsJCWNsb3NlKGxvb3BfZmQpOwomIzQzOwl9CiYjNDM7CWlmIChiYWNrX2ZkICZndDs9IDApCiYjNDM7CQljbG9zZShiYWNrX2ZkKTsKJiM0MzsJaWYgKGN0bF9mZCAmZ3Q7PSAwKSB7CiYjNDM7CQlpZiAoc3NjYW5mKGxvb3BfcGF0aCwgJiMzNDsvZGV2L2xvb3AlZCYjMzQ7LCAmYW1wO25yKSA9PSAxICZhbXA7JmFtcDsgbnIgJmd0Oz0gMCkKJiM0MzsJCQlpb2N0bChjdGxfZmQsIExPT1BfQ1RMX1JFTU9WRSwgbnIpOwomIzQzOwkJY2xvc2UoY3RsX2ZkKTsKJiM0MzsJfQomIzQzO30KJiM0MzsKJiM0MzsvKiBPX0RJUkVDVCBrZWVwcyBJL08gY2hhcmdlZCB0byB0aGUgY3VycmVudCBjZ3JvdXAuICovCiYjNDM7c3RhdGljIGludCBkb19kaXJlY3RfaW8oY29uc3QgY2hhciAqbG9vcF9wYXRoKQomIzQzO3sKJiM0MzsJdm9pZCAqYnVmOwomIzQzOwlpbnQgZmQsIHJldCA9IC0xOwomIzQzOwomIzQzOwlmZCA9IG9wZW4obG9vcF9wYXRoLCBPX1JEV1IgfCBPX0RJUkVDVCB8IE9fQ0xPRVhFQyk7CiYjNDM7CWlmIChmZCAmbHQ7IDApCiYjNDM7CQlyZXR1cm4gLTE7CiYjNDM7CWlmIChwb3NpeF9tZW1hbGlnbigmYW1wO2J1ZiwgNDA5NiwgSU9fU0laRSkpCiYjNDM7CQlnb3RvIG91dF9mZDsKJiM0MzsJbWVtc2V0KGJ1ZiwgMHhhYiwgSU9fU0laRSk7CiYjNDM7CiYjNDM7CWlmIChwd3JpdGUoZmQsIGJ1ZiwgSU9fU0laRSwgMCkgIT0gSU9fU0laRSkKJiM0MzsJCWdvdG8gb3V0X2J1ZjsKJiM0MzsJZnN5bmMoZmQpOwomIzQzOwlpZiAocHJlYWQoZmQsIGJ1ZiwgSU9fU0laRSwgMCkgIT0gSU9fU0laRSkKJiM0MzsJCWdvdG8gb3V0X2J1ZjsKJiM0MzsJcmV0ID0gMDsKJiM0MztvdXRfYnVmOgomIzQzOwlmcmVlKGJ1Zik7CiYjNDM7b3V0X2ZkOgomIzQzOwljbG9zZShmZCk7CiYjNDM7CXJldHVybiByZXQ7CiYjNDM7fQomIzQzOwomIzQzOy8qIFJlYWQgQGRldiYjMzk7cyBpby5zdGF0IGNvdW50ZXJzLiBAZGV2IHVzZXMga2VybmVsIGRldl90IGVuY29kaW5nLiAqLwomIzQzO3N0YXRpYyBpbnQgcGFyc2VfaW9fc3RhdChpbnQgY2dyb3VwX2ZkLCBfX3U2NCBkZXYsIHN0cnVjdCBpb19xdWVyeSAqb3V0KQomIzQzO3sKJiM0MzsJdW5zaWduZWQgaW50IHdhbnRfbWFqID0gZGV2ICZndDsmZ3Q7IDIwLCB3YW50X21pbiA9IGRldiAmYW1wOyAoKDFVICZsdDsmbHQ7IDIwKSAtIDEpOwomIzQzOwljaGFyIGJ1Zls0MDk2XSwgKmxpbmUsICpzYXZlcHRyOwomIzQzOwlpbnQgZmQsIG4sIHJldCA9IC0xOwomIzQzOwomIzQzOwlmZCA9IG9wZW5hdChjZ3JvdXBfZmQsICYjMzQ7aW8uc3RhdCYjMzQ7LCBPX1JET05MWSk7CiYjNDM7CWlmIChmZCAmbHQ7IDApCiYjNDM7CQlyZXR1cm4gLTE7CiYjNDM7CW4gPSByZWFkKGZkLCBidWYsIHNpemVvZihidWYpIC0gMSk7CiYjNDM7CWNsb3NlKGZkKTsKJiM0MzsJaWYgKG4gJmx0Oz0gMCkKJiM0MzsJCXJldHVybiAtMTsKJiM0MzsJYnVmW25dID0gJiMzOTtcMCYjMzk7OwomIzQzOwomIzQzOwlmb3IgKGxpbmUgPSBzdHJ0b2tfcihidWYsICYjMzQ7XG4mIzM0OywgJmFtcDtzYXZlcHRyKTsgbGluZTsKJiM0MzsJICAgICBsaW5lID0gc3RydG9rX3IoTlVMTCwgJiMzNDtcbiYjMzQ7LCAmYW1wO3NhdmVwdHIpKSB7CiYjNDM7CQl1bnNpZ25lZCBsb25nIGxvbmcgcmIgPSAwLCB3YiA9IDAsIHJpID0gMCwgd2kgPSAwLCBkYiA9IDAsIGRpID0gMDsKJiM0MzsJCXVuc2lnbmVkIGludCBtYWosIG1pbjsKJiM0MzsKJiM0MzsJCS8qIE9ubHkgdGhlIGRldmljZSBpZCBpcyByZXF1aXJlZDsgbWlzc2luZyBjb3VudGVycyBzdGF5IHplcm8uICovCiYjNDM7CQlpZiAoc3NjYW5mKGxpbmUsCiYjNDM7CQkJICAgJiMzNDsldToldSByYnl0ZXM9JWxsdSB3Ynl0ZXM9JWxsdSByaW9zPSVsbHUgd2lvcz0lbGx1IGRieXRlcz0lbGx1IGRpb3M9JWxsdSYjMzQ7LAomIzQzOwkJCSAgICZhbXA7bWFqLCAmYW1wO21pbiwgJmFtcDtyYiwgJmFtcDt3YiwgJmFtcDtyaSwgJmFtcDt3aSwgJmFtcDtkYiwgJmFtcDtkaSkgJmx0OyAyKQomIzQzOwkJCWNvbnRpbnVlOwomIzQzOwkJaWYgKG1haiAhPSB3YW50X21haiB8fCBtaW4gIT0gd2FudF9taW4pCiYjNDM7CQkJY29udGludWU7CiYjNDM7CiYjNDM7CQlvdXQtJmd0O3JieXRlcyA9IHJiOwomIzQzOwkJb3V0LSZndDt3Ynl0ZXMgPSB3YjsKJiM0MzsJCW91dC0mZ3Q7cmlvcyA9IHJpOwomIzQzOwkJb3V0LSZndDt3aW9zID0gd2k7CiYjNDM7CQlvdXQtJmd0O2RieXRlcyA9IGRiOwomIzQzOwkJb3V0LSZndDtkaW9zID0gZGk7CiYjNDM7CQlyZXQgPSAwOwomIzQzOwkJYnJlYWs7CiYjNDM7CX0KJiM0MzsJcmV0dXJuIHJldDsKJiM0Mzt9CiYjNDM7CiYjNDM7dm9pZCB0ZXN0X2Nncm91cF9pdGVyX2lvKHZvaWQpCiYjNDM7ewomIzQzOwljaGFyICpjZ3JvdXBfcmVsX3BhdGggPSAmIzM0Oy9jZ3JvdXBfaXRlcl9pb190ZXN0JiMzNDs7CiYjNDM7CWludCBjdGxfZmQgPSAtMSwgbG9vcF9mZCA9IC0xLCBiYWNrX2ZkID0gLTE7CiYjNDM7CXN0cnVjdCBjZ3JvdXBfaXRlcl9pbyAqc2tlbCA9IE5VTEw7CiYjNDM7CXN0cnVjdCBicGZfbGluayAqbGluayA9IE5VTEw7CiYjNDM7CWNoYXIgbG9vcF9wYXRoWzY0XTsKJiM0MzsJc3RydWN0IGlvX3F1ZXJ5ICpxOwomIzQzOwlpbnQgY2dyb3VwX2ZkOwomIzQzOwomIzQzOwljZ3JvdXBfZmQgPSBjZ3JvdXBfc2V0dXBfYW5kX2pvaW4oY2dyb3VwX3JlbF9wYXRoKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0tfRkQoY2dyb3VwX2ZkLCAmIzM0O2Nncm91cF9zZXR1cF9hbmRfam9pbiYjMzQ7KSkKJiM0MzsJCXJldHVybjsKJiM0MzsKJiM0MzsJaWYgKGxvb3Bfc2V0dXAobG9vcF9wYXRoLCBzaXplb2YobG9vcF9wYXRoKSwgJmFtcDtjdGxfZmQsICZhbXA7bG9vcF9mZCwgJmFtcDtiYWNrX2ZkKSkgewomIzQzOwkJdGVzdF9fc2tpcCgpOwkvKiBuZWVkcyByb290ICYjNDM7IENPTkZJR19CTEtfREVWX0xPT1AgKi8KJiM0MzsJCWdvdG8gY2xlYW51cF9jZ3JvdXBfZmQ7CiYjNDM7CX0KJiM0MzsKJiM0MzsJc2tlbCA9IGNncm91cF9pdGVyX2lvX19vcGVuX2FuZF9sb2FkKCk7CiYjNDM7CWlmICghQVNTRVJUX09LX1BUUihza2VsLCAmIzM0O2Nncm91cF9pdGVyX2lvX19vcGVuX2FuZF9sb2FkJiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwX2xvb3A7CiYjNDM7CiYjNDM7CS8qIENvbnZlcnQgZ2xpYmMgc3RfcmRldiB0byBrZXJuZWwgZGV2X3QgZm9ybWF0LiAqLwomIzQzOwl7CiYjNDM7CQlzdHJ1Y3Qgc3RhdCBsc3Q7CiYjNDM7CiYjNDM7CQlpZiAoIUFTU0VSVF9PSyhmc3RhdChsb29wX2ZkLCAmYW1wO2xzdCksICYjMzQ7ZnN0YXQgbG9vcCYjMzQ7KSkKJiM0MzsJCQlnb3RvIGNsZWFudXBfc2tlbDsKJiM0MzsJCXNrZWwtJmd0O2RhdGFfcXVlcnktJmd0O3RhcmdldF9kZXYgPQomIzQzOwkJCSgoX191NjQpbWFqb3IobHN0LnN0X3JkZXYpICZsdDsmbHQ7IDIwKSB8IG1pbm9yKGxzdC5zdF9yZGV2KTsKJiM0MzsJfQomIzQzOwomIzQzOwlERUNMQVJFX0xJQkJQRl9PUFRTKGJwZl9pdGVyX2F0dGFjaF9vcHRzLCBvcHRzKTsKJiM0MzsJdW5pb24gYnBmX2l0ZXJfbGlua19pbmZvIGxpbmZvID0gewomIzQzOwkJLmNncm91cC5jZ3JvdXBfZmQgPSBjZ3JvdXBfZmQsCiYjNDM7CQkuY2dyb3VwLm9yZGVyID0gQlBGX0NHUk9VUF9JVEVSX1NFTEZfT05MWSwKJiM0MzsJfTsKJiM0MzsJb3B0cy5saW5rX2luZm8gPSAmYW1wO2xpbmZvOwomIzQzOwlvcHRzLmxpbmtfaW5mb19sZW4gPSBzaXplb2YobGluZm8pOwomIzQzOwomIzQzOwlsaW5rID0gYnBmX3Byb2dyYW1fX2F0dGFjaF9pdGVyKHNrZWwtJmd0O3Byb2dzLmNncm91cF9pb19xdWVyeSwgJmFtcDtvcHRzKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0tfUFRSKGxpbmssICYjMzQ7YnBmX3Byb2dyYW1fX2F0dGFjaF9pdGVyJiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwX3NrZWw7CiYjNDM7CiYjNDM7CS8qIFRoaXMgcHJvY2VzcyBpcyBpbiB0aGUgdGVzdCBjZ3JvdXAsIHNvIHRoZSBsb29wIEkvTyBpcyBjaGFyZ2VkIGhlcmUuICovCiYjNDM7CWlmICghQVNTRVJUX09LKGRvX2RpcmVjdF9pbyhsb29wX3BhdGgpLCAmIzM0O2RvX2RpcmVjdF9pbyYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cF9saW5rOwomIzQzOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhyZWFkX3N0YXRzKGxpbmspLCAmIzM0O3JlYWQgc3RhdHMmIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXBfbGluazsKJiM0MzsKJiM0MzsJcSA9ICZhbXA7c2tlbC0mZ3Q7ZGF0YV9xdWVyeS0mZ3Q7aW9fcXVlcnk7CiYjNDM7CWlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KCYjMzQ7Y2dyb3VwX2l0ZXJfaW9fX3dyaXRlJiMzNDspKSB7CiYjNDM7CQlBU1NFUlRfR1QocS0mZ3Q7d2J5dGVzLCAwLCAmIzM0O3dieXRlcyYjMzQ7KTsKJiM0MzsJCUFTU0VSVF9HVChxLSZndDt3aW9zLCAwLCAmIzM0O3dpb3MmIzM0Oyk7CiYjNDM7CX0KJiM0MzsJaWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoJiMzNDtjZ3JvdXBfaXRlcl9pb19fcmVhZCYjMzQ7KSkgewomIzQzOwkJQVNTRVJUX0dUKHEtJmd0O3JieXRlcywgMCwgJiMzNDtyYnl0ZXMmIzM0Oyk7CiYjNDM7CQlBU1NFUlRfR1QocS0mZ3Q7cmlvcywgMCwgJiMzNDtyaW9zJiMzNDspOwomIzQzOwl9CiYjNDM7CWlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KCYjMzQ7Y2dyb3VwX2l0ZXJfaW9fX2RldiYjMzQ7KSkKJiM0MzsJCUFTU0VSVF9HVChxLSZndDtkZXYsIDAsICYjMzQ7ZGV2JiMzNDspOwomIzQzOwomIzQzOwkvKiBDb21wYXJlIHdpdGggaW8uc3RhdCB3aXRob3V0IEkvTyBiZXR3ZWVuIHRoZSByZWFkcy4gKi8KJiM0MzsJaWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoJiMzNDtjZ3JvdXBfaXRlcl9pb19fbWF0Y2gmIzM0OykpIHsKJiM0MzsJCXN0cnVjdCBpb19xdWVyeSBmaWxldiA9IHt9OwomIzQzOwomIzQzOwkJaWYgKEFTU0VSVF9PSyhyZWFkX3N0YXRzKGxpbmspLCAmIzM0O3JlYWQgc3RhdHMmIzM0OykgJmFtcDsmYW1wOwomIzQzOwkJICAgIEFTU0VSVF9PSyhwYXJzZV9pb19zdGF0KGNncm91cF9mZCwgcS0mZ3Q7ZGV2LCAmYW1wO2ZpbGV2KSwKJiM0MzsJCQkgICAgICAmIzM0O3BhcnNlIGlvLnN0YXQmIzM0OykpIHsKJiM0MzsJCQlBU1NFUlRfRVEocS0mZ3Q7cmJ5dGVzLCBmaWxldi5yYnl0ZXMsICYjMzQ7cmJ5dGVzJiMzNDspOwomIzQzOwkJCUFTU0VSVF9FUShxLSZndDt3Ynl0ZXMsIGZpbGV2LndieXRlcywgJiMzNDt3Ynl0ZXMmIzM0Oyk7CiYjNDM7CQkJQVNTRVJUX0VRKHEtJmd0O3Jpb3MsIGZpbGV2LnJpb3MsICYjMzQ7cmlvcyYjMzQ7KTsKJiM0MzsJCQlBU1NFUlRfRVEocS0mZ3Q7d2lvcywgZmlsZXYud2lvcywgJiMzNDt3aW9zJiMzNDspOwomIzQzOwkJCUFTU0VSVF9FUShxLSZndDtkYnl0ZXMsIGZpbGV2LmRieXRlcywgJiMzNDtkYnl0ZXMmIzM0Oyk7CiYjNDM7CQkJQVNTRVJUX0VRKHEtJmd0O2Rpb3MsIGZpbGV2LmRpb3MsICYjMzQ7ZGlvcyYjMzQ7KTsKJiM0MzsJCX0KJiM0MzsJfQomIzQzOwomIzQzOwkvKiBSb290IHN0YXRpc3RpY3MgaW5jbHVkZSB0aGlzIGNncm91cCYjMzk7cyBJL08uICovCiYjNDM7CWlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KCYjMzQ7Y2dyb3VwX2l0ZXJfaW9fX3Jvb3QmIzM0OykpIHsKJiM0MzsJCXN0cnVjdCBicGZfbGluayAqcm9vdF9saW5rOwomIzQzOwkJc3RydWN0IGlvX3F1ZXJ5ICpyOwomIzQzOwomIzQzOwkJc2tlbC0mZ3Q7ZGF0YV9xdWVyeS0mZ3Q7Z290X3Jvb3RfY3NzID0gMDsKJiM0MzsJCXJvb3RfbGluayA9IGJwZl9wcm9ncmFtX19hdHRhY2hfaXRlcihza2VsLSZndDtwcm9ncy5jZ3JvdXBfcm9vdF9pb19xdWVyeSwKJiM0MzsJCQkJCQkgICAgICZhbXA7b3B0cyk7CiYjNDM7CQlpZiAoQVNTRVJUX09LX1BUUihyb290X2xpbmssICYjMzQ7YXR0YWNoIHJvb3QgaXRlciYjMzQ7KSkgewomIzQzOwkJCWlmIChBU1NFUlRfT0socmVhZF9zdGF0cyhyb290X2xpbmspLCAmIzM0O3JlYWQgcm9vdCBzdGF0cyYjMzQ7KSkgewomIzQzOwkJCQlyID0gJmFtcDtza2VsLSZndDtkYXRhX3F1ZXJ5LSZndDtyb290X3F1ZXJ5OwomIzQzOwkJCQlBU1NFUlRfRVEoc2tlbC0mZ3Q7ZGF0YV9xdWVyeS0mZ3Q7Z290X3Jvb3RfY3NzLCAxLAomIzQzOwkJCQkJICAmIzM0O2dvdF9yb290X2NzcyYjMzQ7KTsKJiM0MzsJCQkJQVNTRVJUX0VRKHItJmd0O2RldiwgcS0mZ3Q7ZGV2LCAmIzM0O3Jvb3QgZGV2JiMzNDspOwomIzQzOwkJCQlBU1NFUlRfR0Uoci0mZ3Q7d2J5dGVzLCBxLSZndDt3Ynl0ZXMsICYjMzQ7cm9vdCB3Ynl0ZXMmIzM0Oyk7CiYjNDM7CQkJCUFTU0VSVF9HRShyLSZndDt3aW9zLCBxLSZndDt3aW9zLCAmIzM0O3Jvb3Qgd2lvcyYjMzQ7KTsKJiM0MzsJCQkJQVNTRVJUX0dFKHItJmd0O3JieXRlcywgcS0mZ3Q7cmJ5dGVzLCAmIzM0O3Jvb3QgcmJ5dGVzJiMzNDspOwomIzQzOwkJCQlBU1NFUlRfR0Uoci0mZ3Q7cmlvcywgcS0mZ3Q7cmlvcywgJiMzNDtyb290IHJpb3MmIzM0Oyk7CiYjNDM7CQkJfQomIzQzOwkJCWJwZl9saW5rX19kZXN0cm95KHJvb3RfbGluayk7CiYjNDM7CQl9CiYjNDM7CX0KJiM0MzsKJiM0MztjbGVhbnVwX2xpbms6CiYjNDM7CWJwZl9saW5rX19kZXN0cm95KGxpbmspOwomIzQzO2NsZWFudXBfc2tlbDoKJiM0MzsJY2dyb3VwX2l0ZXJfaW9fX2Rlc3Ryb3koc2tlbCk7CiYjNDM7Y2xlYW51cF9sb29wOgomIzQzOwlsb29wX3RlYXJkb3duKGxvb3BfcGF0aCwgY3RsX2ZkLCBsb29wX2ZkLCBiYWNrX2ZkKTsKJiM0MztjbGVhbnVwX2Nncm91cF9mZDoKJiM0MzsJY2xvc2UoY2dyb3VwX2ZkKTsKJiM0MzsJY2xlYW51cF9jZ3JvdXBfZW52aXJvbm1lbnQoKTsKJiM0Mzt9CmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvY2dyb3VwX2l0ZXJfaW8uYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9jZ3JvdXBfaXRlcl9pby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAuLjJjZDUzODA2ODk4N2EKLS0tIC9kZXYvbnVsbAomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvY2dyb3VwX2l0ZXJfaW8uYwpAQCAtMCwwICYjNDM7MSw5OSBAQAomIzQzOy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wCiYjNDM7LyogQ29weXJpZ2h0IChjKSAyMDI1IE1ldGEgUGxhdGZvcm1zLCBJbmMuIGFuZCBhZmZpbGlhdGVzLiAqLwomIzQzOyNpbmNsdWRlICZsdDt2bWxpbnV4LmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2JwZi9icGZfaGVscGVycy5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDticGYvYnBmX2NvcmVfcmVhZC5oJmd0OwomIzQzOyNpbmNsdWRlICYjMzQ7YnBmX2V4cGVyaW1lbnRhbC5oJiMzNDsKJiM0MzsjaW5jbHVkZSAmIzM0O2Nncm91cF9pdGVyX2lvLmgmIzM0OwomIzQzOwomIzQzO2NoYXIgX2xpY2Vuc2VbXSBTRUMoJiMzNDtsaWNlbnNlJiMzNDspID0gJiMzNDtHUEwmIzM0OzsKJiM0MzsKJiM0MztzdHJ1Y3QgaW9fcXVlcnkgaW9fcXVlcnkgU0VDKCYjMzQ7LmRhdGEucXVlcnkmIzM0Oyk7CiYjNDM7CiYjNDM7c3RydWN0IGlvX3F1ZXJ5IHJvb3RfcXVlcnkgU0VDKCYjMzQ7LmRhdGEucXVlcnkmIzM0Oyk7CiYjNDM7CiYjNDM7X191NjQgZ290X3Jvb3RfY3NzIFNFQygmIzM0Oy5kYXRhLnF1ZXJ5JiMzNDspOwomIzQzOwomIzQzOy8qIERldmljZSBzZWxlY3RlZCBieSB1c2Vyc3BhY2UgaW4ga2VybmVsIGRldl90IGZvcm1hdC4gKi8KJiM0MztfX3U2NCB0YXJnZXRfZGV2IFNFQygmIzM0Oy5kYXRhLnF1ZXJ5JiMzNDspOwomIzQzOwomIzQzOy8qIEtlZXAgaW5saW5lOiBSQ1UgYW5kIG9wZW4tY29kZWQgaXRlcmF0b3JzIGNhbm5vdCBjcm9zcyBhIEJQRiBjYWxsLiAqLwomIzQzO3N0YXRpYyBfX2Fsd2F5c19pbmxpbmUgaW50IHJlYWRfdGFyZ2V0X2RldihzdHJ1Y3QgY2dyb3VwICpjZ3JwLAomIzQzOwkJCQkJICAgc3RydWN0IGlvX3F1ZXJ5ICpvdXQpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgY2dyb3VwX3N1YnN5c19zdGF0ZSAqY3NzOwomIzQzOwlzdHJ1Y3QgYmxrY2dfZ3EgKnBvczsKJiM0MzsJX191NjQgZGV2OwomIzQzOwlpbnQgc3NpZDsKJiM0MzsKJiM0MzsJLyogVGhlIGZsdXNoIGNhbiBzbGVlcCwgc28gcnVuIGl0IGJlZm9yZSB0aGUgUkNVIHNlY3Rpb24uICovCiYjNDM7CWJwZl9ibGtjZ19mbHVzaF9zdGF0cyhjZ3JwKTsKJiM0MzsKJiM0MzsJYnBmX3JjdV9yZWFkX2xvY2soKTsKJiM0MzsJc3NpZCA9IGJwZl9jb3JlX2VudW1fdmFsdWUoZW51bSBjZ3JvdXBfc3Vic3lzX2lkLCBpb19jZ3JwX2lkKTsKJiM0MzsKJiM0MzsJLyoKJiM0MzsJICogc3Vic3lzW10gaXMgX19yY3UsIHNvIHRoaXMgcmVhZCBnaXZlcyBhbiBSQ1UgcG9pbnRlciB0aGUgaXRlcmF0b3IKJiM0MzsJICogYWNjZXB0cy4gQlBGX0NPUkVfUkVBRCgpIHdvdWxkIHJldHVybiBhIHBsYWluIHZhbHVlIGluc3RlYWQuCiYjNDM7CSAqLwomIzQzOwljc3MgPSBjZ3JwLSZndDtzdWJzeXNbc3NpZF07CiYjNDM7CWlmICghY3NzKSB7CiYjNDM7CQlicGZfcmN1X3JlYWRfdW5sb2NrKCk7CiYjNDM7CQlyZXR1cm4gMDsKJiM0MzsJfQomIzQzOwomIzQzOwlicGZfZm9yX2VhY2goYmxrZywgcG9zLCBjc3MpIHsKJiM0MzsJCWRldiA9IEJQRl9DT1JFX1JFQUQocG9zLCBxLCBkaXNrLCBwYXJ0MCwgYmRfZGV2KTsKJiM0MzsJCWlmIChkZXYgIT0gdGFyZ2V0X2RldikKJiM0MzsJCQljb250aW51ZTsKJiM0MzsKJiM0MzsJCW91dC0mZ3Q7ZGV2ID0gZGV2OwomIzQzOwkJb3V0LSZndDtyYnl0ZXMgPSBCUEZfQ09SRV9SRUFEKHBvcywgaW9zdGF0LmN1ci5ieXRlc1tCTEtHX0lPU1RBVF9SRUFEXSk7CiYjNDM7CQlvdXQtJmd0O3dieXRlcyA9IEJQRl9DT1JFX1JFQUQocG9zLCBpb3N0YXQuY3VyLmJ5dGVzW0JMS0dfSU9TVEFUX1dSSVRFXSk7CiYjNDM7CQlvdXQtJmd0O3Jpb3MgPSBCUEZfQ09SRV9SRUFEKHBvcywgaW9zdGF0LmN1ci5pb3NbQkxLR19JT1NUQVRfUkVBRF0pOwomIzQzOwkJb3V0LSZndDt3aW9zID0gQlBGX0NPUkVfUkVBRChwb3MsIGlvc3RhdC5jdXIuaW9zW0JMS0dfSU9TVEFUX1dSSVRFXSk7CiYjNDM7CQlvdXQtJmd0O2RieXRlcyA9IEJQRl9DT1JFX1JFQUQocG9zLCBpb3N0YXQuY3VyLmJ5dGVzW0JMS0dfSU9TVEFUX0RJU0NBUkRdKTsKJiM0MzsJCW91dC0mZ3Q7ZGlvcyA9IEJQRl9DT1JFX1JFQUQocG9zLCBpb3N0YXQuY3VyLmlvc1tCTEtHX0lPU1RBVF9ESVNDQVJEXSk7CiYjNDM7CQlicmVhazsKJiM0MzsJfQomIzQzOwlicGZfcmN1X3JlYWRfdW5sb2NrKCk7CiYjNDM7CXJldHVybiAxOwomIzQzO30KJiM0MzsKJiM0MztTRUMoJiMzNDtpdGVyLnMvY2dyb3VwJiMzNDspCiYjNDM7aW50IGNncm91cF9pb19xdWVyeShzdHJ1Y3QgYnBmX2l0ZXJfX2Nncm91cCAqY3R4KQomIzQzO3sKJiM0MzsJc3RydWN0IGNncm91cCAqY2dycCA9IGN0eC0mZ3Q7Y2dyb3VwOwomIzQzOwomIzQzOwlpZiAoIWNncnApCiYjNDM7CQlyZXR1cm4gMTsKJiM0MzsKJiM0MzsJLyogU3RhcnQgZnJlc2ggc28gYSBkZXZpY2UgdGhhdCBpcyBub3QgZm91bmQgc3RheXMgYWxsLXplcm8uICovCiYjNDM7CV9fYnVpbHRpbl9tZW1zZXQoJmFtcDtpb19xdWVyeSwgMCwgc2l6ZW9mKGlvX3F1ZXJ5KSk7CiYjNDM7CiYjNDM7CXJlYWRfdGFyZ2V0X2RldihjZ3JwLCAmYW1wO2lvX3F1ZXJ5KTsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOwomIzQzO1NFQygmIzM0O2l0ZXIucy9jZ3JvdXAmIzM0OykKJiM0MztpbnQgY2dyb3VwX3Jvb3RfaW9fcXVlcnkoc3RydWN0IGJwZl9pdGVyX19jZ3JvdXAgKmN0eCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBjZ3JvdXAgKnJvb3Q7CiYjNDM7CiYjNDM7CWlmICghY3R4LSZndDtjZ3JvdXApCiYjNDM7CQlyZXR1cm4gMTsKJiM0MzsKJiM0MzsJX19idWlsdGluX21lbXNldCgmYW1wO3Jvb3RfcXVlcnksIDAsIHNpemVvZihyb290X3F1ZXJ5KSk7CiYjNDM7CiYjNDM7CS8qIFRoZSByb290IGNncm91cCBhbHdheXMgaGFzIGlkIDEuICovCiYjNDM7CXJvb3QgPSBicGZfY2dyb3VwX2Zyb21faWQoMSk7CiYjNDM7CWlmICghcm9vdCkKJiM0MzsJCXJldHVybiAwOwomIzQzOwomIzQzOwkvKiBSb290IGNvdW50ZXJzIGluY2x1ZGUgYWxsIGNncm91cHMmIzM5OyBJL08uICovCiYjNDM7CWlmIChyZWFkX3RhcmdldF9kZXYocm9vdCwgJmFtcDtyb290X3F1ZXJ5KSkKJiM0MzsJCWdvdF9yb290X2NzcyA9IDE7CiYjNDM7CiYjNDM7CWJwZl9jZ3JvdXBfcmVsZWFzZShyb290KTsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yMy8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTcgMjI6MzU8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogOTY3MgoJCQkJCQkJb3V0cHV0OiAyNDQKCQkJCQkJCXRob3VnaHRzOiAxMzY5CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyB0aGUgQmxvY2sgQ2dyb3VwIEJQRiBLZnVuYyBQYXRjaCBmb3IgTWVtb3J5IFNhZmV0eSoqCgpPa2F5LCBzbyBJJiMzOTttIGxvb2tpbmcgYXQgdGhpcyBwYXRjaCBzZXJpZXMgdGhhdCBpbnRyb2R1Y2VzIEJQRiBrZnVuY3MgdG8gaXRlcmF0ZSBibG9jayBjZ3JvdXBzIChibGtjZykgYW5kIGZsdXNoIHRoZWlyIHN0YXRpc3RpY3MuIFRoZSBjb2RlIGludHJvZHVjZXMgZnVuY3Rpb25zIGxpa2UgYGJwZl9ibGtjZ19mbHVzaF9zdGF0c2AsIGBicGZfaXRlcl9ibGtnX25ld2AsIGBicGZfaXRlcl9ibGtnX25leHRgLCBhbmQgYGJwZl9pdGVyX2Jsa2dfZGVzdHJveWAuIE15IHByaW1hcnkgY29uY2VybiwgYXMgYWx3YXlzLCBpcyBtZW1vcnkgc2FmZXR5LCBzcGVjaWZpY2FsbHkgd2hldGhlciB0aGlzIHBhdGNoIGNvdWxkIGludHJvZHVjZSBhbnkgdW5pbml0aWFsaXplZCBtZW1vcnkgcmVhZHMgdGhhdCBLTVNBTiAoS2VybmVsIE1lbW9yeSBTYW5pdGl6ZXIpIG1pZ2h0IGZsYWcsIGJ1dCBLQVNBTiAoS2VybmVsIEFkZHJlc3MgU0FOaXRpemVyKSB3b3VsZG4mIzM5O3QuCgpMZXQmIzM5O3MgZGl2ZSBpbnRvIHRoZSBgYnBmX2l0ZXJfYmxrZ19uZXdgIGltcGxlbWVudGF0aW9uLiBUaGUgaXRlcmF0b3Igc3RhdGUgYGl0YCBjb21lcyBmcm9tIHRoZSBCUEYgaW5mcmFzdHJ1Y3R1cmUsIGFsbG9jYXRlZCBvbiB0aGUgQlBGIHN0YWNrLCBhbmQgaXMgaW5pdGlhbGl6ZWQgZWl0aGVyIGJ5IHRoZSB2ZXJpZmllci9CUEYgcnVudGltZSBvciB0aGlzIGBfbmV3YCBmdW5jdGlvbi4gSSBzZWUgYGtpdC0mZ3Q7cG9zYCBhbmQgYGtpdC0mZ3Q7YmxrY2dgIGFyZSBiZWluZyBpbml0aWFsaXplZCB3aXRoaW4gdGhpcyBmdW5jdGlvbi4gVGhlIHN0cnVjdCBgYnBmX2l0ZXJfYmxrZ2AgYW5kIGBicGZfaXRlcl9ibGtnX2tlcm5gIGFyZSBwcm9wZXJseSBzaXplZCwgYW5kIGBjc3NgIGlzIGNoZWNrZWQuIElmIGl0IGlzbiYjMzk7dCBhbiBpbyBjZ3JvdXAsIHRoZSBibGtjZyBpcyBOVUxMLiBPdGhlcndpc2UsIGBibGtjZ2AgaXMgc2V0LiBTbywgYm90aCBwb2ludGVycyBhcmUgYWx3YXlzIGluaXRpYWxpemVkIGVpdGhlciB0byBhIHZhbGlkIHZhbHVlIG9yIE5VTEwuCgpUaGUgYGJwZl9ibGtjZ19mbHVzaF9zdGF0c2AgZnVuY3Rpb24gc2VlbXMgdG8gYmUgY2FsbGluZyBgYmxrY2dfZmlsbF9yb290X2lvc3RhdHMoKWAgb3IgYGNzc19yc3RhdF9mbHVzaChjc3MpYC4gTmVpdGhlciBvZiB0aGVzZSBmdW5jdGlvbnMgYXJlIGRpcmVjdGx5IHNlbmRpbmcgbmV3IGRhdGEgc3RydWN0dXJlcyB0byB1c2VyIHNwYWNlIGluIGEgbWFubmVyIHRoYXQgY291bGQgbGVhayB1bmluaXRpYWxpemVkIG1lbW9yeS4gVGhlIHRlc3RzIGFyZSByZWFkaW5nIHJlc3VsdHMgdGhyb3VnaCBCUEYgbWFwcyBhbmQgZGF0YSBzZWN0aW9ucyB3aGljaCBpcyB0aGUgc3RhbmRhcmQgQlBGIHdheS4gVGhpcyBpcyBnb29kOyBub3RoaW5nIGlzIGJlaW5nIGV4cG9zZWQgZGlyZWN0bHkuCgpJJiMzOTttIGRvdWJsZS1jaGVja2luZyB0aGUgaW5pdGlhbGl6YXRpb24gaW4gYGJwZl9pdGVyX2Jsa2dfbmV3YC4gSWYgYGNzcy0mZ3Q7c3MgIT0gJmFtcDtpb19jZ3JwX3N1YnN5c2AsIGBraXQtJmd0O2Jsa2NnYCBpcyBzZXQgdG8gTlVMTCwgYW5kIGBraXQtJmd0O3Bvc2AgaXMgYWxyZWFkeSBOVUxMLiBPdGhlcndpc2UsIGlmIGl0ICppcyogYW4gaW8gY2dyb3VwLCBga2l0LSZndDtibGtjZ2AgaXMgc2V0LiBTbywgYm90aCBmaWVsZHMgYXJlIGluaXRpYWxpemVkIGluIGFsbCBzY2VuYXJpb3MuCgpJIGFsc28gc2VlIHRoYXQgYGJsa2NnX2ZpbGxfcm9vdF9pb3N0YXRzYCBpcyBub3cgbm9uLXN0YXRpYywgYW5kIGBicGZfYmxrY2dfZmx1c2hfc3RhdHNgIHVzZXMgYHJjdV9yZWFkX2xvY2tgIGFuZCBgY2dyb3VwX2Nzc2AsIHdoaWNoIGlzIG5vcm1hbCBmb3IgdGhpcyBraW5kIG9mIGNvZGUuCgpPa2F5LCBsZXQmIzM5O3MgbG9vayBhdCBgYnBmX2l0ZXJfYmxrZ19uZXh0YC4gSXQmIzM5O3Mgc3RyYWlnaHRmb3J3YXJkLiBJdCBkZXJlZmVyZW5jZXMgYGtpdC0mZ3Q7cG9zYCBhbmQgbW92ZXMgaXQgYWxvbmcgdGhlIGxpc3QsIGhhbmRsaW5nIG9mZmxpbmUgYmxrZ3MgZ3JhY2VmdWxseS4gVGhlIGl0ZXJhdG9yIGlzIGRlc2lnbmVkIHRvIHJldHVybiBOVUxMIGFmdGVyIGNvbXBsZXRpb24uIEl0IGFwcGVhcnMgdGhhdCB0aGVyZSBhcmUgbm8gdW5pbml0aWFsaXplZCB2YXJpYWJsZXMgYXQgYWxsIGFuZCBubyBtZW1vcnkgbGVha3MuCgpUaGVyZWZvcmUsIGdpdmVuIHRoZSBuYXR1cmUgb2YgdGhlIHBhdGNoLCBhbmQgZXNwZWNpYWxseSB0aGUgY29tcGxldGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIEJQRiBpdGVyYXRvciBzdGF0ZSwgSSYjMzk7bSBjb25jbHVkaW5nIHRoYXQgdGhpcyBwYXRjaCBkb2VzbiYjMzk7dCBpbnRyb2R1Y2UgYW55IHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJpc2tzIHRoYXQgS01TQU4gd291bGQgY2F0Y2ggYnV0IEtBU0FOIHdvdWxkbiYjMzk7dC4gVGhlIEJQRiBwcm9ncmFtIHJlYWRzIHRoZSBkYXRhIHVzaW5nIGBCUEZfQ09SRV9SRUFEYCwgYW5kIHRoZXJlIGFyZSBubyBuZXcgc3RydWN0dXJlcyBjb3BpZWQgdG8gdXNlcnNwYWNlIHVzaW5nIGBjb3B5X3RvX3VzZXJgLiBJJiMzOTttIGNvbmZpZGVudCB0aGF0IHN0YW5kYXJkIEtBU0FOIGFuZCB0aGUgQlBGIHZlcmlmaWVyIGFyZSBlbm91Z2ggdG8gY2F0Y2ggYW55IGJ1Z3MgaW4gdGhpcyBwYXRjaC4gVGhlcmVmb3JlLCBJJiMzOTttIHNldHRpbmcgYE5lZWRzS01TQU49ZmFsc2VgLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI0LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xNyAyMjozNTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnNldC1yZXN1bHRzPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtLTVNBTlJlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBzZXJpZXMgaW50cm9kdWNlcyBCUEYga2Z1bmNzIGZvciBibG9jayBjZ3JvdXAgKGJsa2NnKSBpdGVyYXRpb24gYW5kIHN0YXRpc3RpY3MgZmx1c2hpbmcgKGBicGZfYmxrY2dfZmx1c2hfc3RhdHNgLCBgYnBmX2l0ZXJfYmxrZ19uZXdgLCBgYnBmX2l0ZXJfYmxrZ19uZXh0YCwgYGJwZl9pdGVyX2Jsa2dfZGVzdHJveWApLiBUaGUgaXRlcmF0b3Igc3RhdGUgKGBzdHJ1Y3QgYnBmX2l0ZXJfYmxrZ19rZXJuYCkgaXMgZnVsbHkgaW5pdGlhbGl6ZWQgaW4gYGJwZl9pdGVyX2Jsa2dfbmV3YCBiZWZvcmUgYmVpbmcgdXNlZCBpbiBzdWJzZXF1ZW50IGNhbGxzLiBUaGVyZSBhcmUgbm8gbmV3IGtlcm5lbCBzdHJ1Y3R1cmVzIGNvcGllZCB0byB1c2VyIHNwYWNlIChlLmcuLCB2aWEgYGNvcHlfdG9fdXNlcmAgb3IgbmV0bGluayksIG5vciBhcmUgdGhlcmUgYW55IGNvbXBsZXggYWxsb2NhdGlvbnMgd2hlcmUgdW5pbml0aWFsaXplZCBmaWVsZHMgY291bGQgYmUgbGVha2VkIG9yIHVzZWQgaW4gY29udHJvbCBmbG93LiBUaGUgY2hhbmdlcyBwcmltYXJpbHkgaW52b2x2ZSBwb2ludGVyIHRyYXZlcnNhbCBhbmQgQlBGLWFjY2Vzc2libGUgcmVhZHMgb2YgZXhpc3RpbmcgaW5pdGlhbGl6ZWQgY2dyb3VwIHN0cnVjdHVyZXMuIEFueSBwb3RlbnRpYWwgbWVtb3J5IHNhZmV0eSBpc3N1ZXMsIHN1Y2ggYXMgb3V0LW9mLWJvdW5kcyBhY2Nlc3NlcyBvciB1c2UtYWZ0ZXItZnJlZSBidWdzIGR1cmluZyBpdGVyYXRpb24sIHdvdWxkIGJlIGVmZmVjdGl2ZWx5IGNhdWdodCBieSBLQVNBTiBhbmQgdGhlIEJQRiB2ZXJpZmllci4gVGhlcmVmb3JlLCBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaXMgbm90IHJlcXVpcmVkLiYjMzQ7LAogICYjMzQ7TmVlZHNLTVNBTiYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggc2VyaWVzIGludHJvZHVjZXMgQlBGIGtmdW5jcyBmb3IgYmxvY2sgY2dyb3VwIChibGtjZykgaXRlcmF0aW9uIGFuZCBzdGF0aXN0aWNzIGZsdXNoaW5nIChgYnBmX2Jsa2NnX2ZsdXNoX3N0YXRzYCwgYGJwZl9pdGVyX2Jsa2dfbmV3YCwgYGJwZl9pdGVyX2Jsa2dfbmV4dGAsIGBicGZfaXRlcl9ibGtnX2Rlc3Ryb3lgKS4gVGhlIGl0ZXJhdG9yIHN0YXRlIChgc3RydWN0IGJwZl9pdGVyX2Jsa2dfa2VybmApIGlzIGZ1bGx5IGluaXRpYWxpemVkIGluIGBicGZfaXRlcl9ibGtnX25ld2AgYmVmb3JlIGJlaW5nIHVzZWQgaW4gc3Vic2VxdWVudCBjYWxscy4gVGhlcmUgYXJlIG5vIG5ldyBrZXJuZWwgc3RydWN0dXJlcyBjb3BpZWQgdG8gdXNlciBzcGFjZSAoZS5nLiwgdmlhIGBjb3B5X3RvX3VzZXJgIG9yIG5ldGxpbmspLCBub3IgYXJlIHRoZXJlIGFueSBjb21wbGV4IGFsbG9jYXRpb25zIHdoZXJlIHVuaW5pdGlhbGl6ZWQgZmllbGRzIGNvdWxkIGJlIGxlYWtlZCBvciB1c2VkIGluIGNvbnRyb2wgZmxvdy4gVGhlIGNoYW5nZXMgcHJpbWFyaWx5IGludm9sdmUgcG9pbnRlciB0cmF2ZXJzYWwgYW5kIEJQRi1hY2Nlc3NpYmxlIHJlYWRzIG9mIGV4aXN0aW5nIGluaXRpYWxpemVkIGNncm91cCBzdHJ1Y3R1cmVzLiBBbnkgcG90ZW50aWFsIG1lbW9yeSBzYWZldHkgaXNzdWVzLCBzdWNoIGFzIG91dC1vZi1ib3VuZHMgYWNjZXNzZXMgb3IgdXNlLWFmdGVyLWZyZWUgYnVncyBkdXJpbmcgaXRlcmF0aW9uLCB3b3VsZCBiZSBlZmZlY3RpdmVseSBjYXVnaHQgYnkgS0FTQU4gYW5kIHRoZSBCUEYgdmVyaWZpZXIuIFRoZXJlZm9yZSwgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGlzIG5vdCByZXF1aXJlZC4mIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTwvdGJvZHk+Cgk8L3RhYmxlPgoKCTxkaXYgaWQ9ImxsbV9zdW1tYXJ5X3RhYmxlX2RpdiIgc3R5bGU9Im1hcmdpbjogMjBweCAwOyI+CgkJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQkJPGNhcHRpb24+TExNIENhbGxzIFN1bW1hcnk6PC9jYXB0aW9uPgoJCQk8dGhlYWQ+CgkJCQk8dHI+CgkJCQkJPHRoPlRvdGFsIENhbGxzPC90aD4KCQkJCQk8dGg+VG90YWwgVG9rZW5zPC90aD4KCQkJCQk8dGg+QXZnIFRva2VuczwvdGg+CgkJCQkJPHRoPlRvdGFsIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQkJPHRoPkF2ZyBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJPC90cj4KCQkJPC90aGVhZD4KCQkJPHRib2R5IGlkPSJsbG1fc3VtbWFyeV9zdGF0c19ib2R5Ij48L3Rib2R5PgoJCTwvdGFibGU+Cgk8L2Rpdj4KCgk8ZGl2IGlkPSJ0b29sX3N1bW1hcnlfdGFibGVfZGl2IiBzdHlsZT0ibWFyZ2luOiAyMHB4IDA7Ij4KCQk8dGFibGUgY2xhc3M9Imxpc3RfdGFibGUiPgoJCQk8Y2FwdGlvbj5Ub29sIENhbGxzIFN1bW1hcnk6PC9jYXB0aW9uPgoJCQk8dGhlYWQ+CgkJCQk8dHI+CgkJCQkJPHRoPlRvdGFsIENhbGxzPC90aD4KCQkJCQk8dGg+VG90YWwgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCQk8dGg+QXZnIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQk8L3RyPgoJCQk8L3RoZWFkPgoJCQk8dGJvZHkgaWQ9InRvb2xfc3VtbWFyeV9zdGF0c19ib2R5Ij48L3Rib2R5PgoJCTwvdGFibGU+Cgk8L2Rpdj4KCgk8ZGl2IGlkPSJkdXJhdGlvbl9jaGFydF9kaXYiIHN0eWxlPSJ3aWR0aDogMTAwJTsgbWFyZ2luOiAyMHB4IDA7IGJvcmRlcjogMXB4OyI+PC9kaXY+Cgk8ZGl2IGlkPSJ0b2tlbl9jaGFydF9kaXYiIHN0eWxlPSJ3aWR0aDogMTAwJTsgbWFyZ2luOiAyMHB4IDA7IGJvcmRlcjogMXB4OyI+PC9kaXY+CgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS9qc2FwaSI+PC9zY3JpcHQ+Cgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CgkJZ29vZ2xlLmxvYWQoInZpc3VhbGl6YXRpb24iLCAiMSIsIHtwYWNrYWdlczpbImNvcmVjaGFydCJdfSk7CgkJZ29vZ2xlLnNldE9uTG9hZENhbGxiYWNrKGRyYXdDaGFydHMpOwoKCQlmdW5jdGlvbiBkcmF3Q2hhcnRzKCkgewoJCQljb25zdCByYXdEYXRhID0gW3siU3RhcnRlZCI6IjIwMjYtMDgtMTdUMjI6MzQ6MzQuNDM4ODQzODk3WiIsIlNlcSI6MCwiTmVzdGluZyI6MCwiVHlwZSI6ImZsb3ciLCJOYW1lIjoicGF0Y2gtdHJpYWdlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NjU5NzI1MDMwNDYsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiQkxLX0NHUk9VUFwiLFxuICAgIFwiQlBGX1NZU0NBTExcIixcbiAgICBcIkNHUk9VUFNcIixcbiAgICBcIkJMT0NLXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwiYnBmX2Jsa2NnX2ZsdXNoX3N0YXRzXCIsXG4gICAgXCJicGZfaXRlcl9ibGtnX25ld1wiLFxuICAgIFwiYnBmX2l0ZXJfYmxrZ19uZXh0XCIsXG4gICAgXCJicGZfaXRlcl9ibGtnX2Rlc3Ryb3lcIixcbiAgICBcImJsa2NnX2ZpbGxfcm9vdF9pb3N0YXRzXCJcbiAgXSxcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBzZXJpZXMgaW50cm9kdWNlcyBCUEYga2Z1bmNzIGZvciBibG9jayBjZ3JvdXAgKGJsa2NnKSBpdGVyYXRpb24gYW5kIHN0YXRpc3RpY3MgZmx1c2hpbmcgKGBicGZfYmxrY2dfZmx1c2hfc3RhdHNgLCBgYnBmX2l0ZXJfYmxrZ19uZXdgLCBgYnBmX2l0ZXJfYmxrZ19uZXh0YCwgYGJwZl9pdGVyX2Jsa2dfZGVzdHJveWApLiBUaGUgaXRlcmF0b3Igc3RhdGUgKGBzdHJ1Y3QgYnBmX2l0ZXJfYmxrZ19rZXJuYCkgaXMgZnVsbHkgaW5pdGlhbGl6ZWQgaW4gYGJwZl9pdGVyX2Jsa2dfbmV3YCBiZWZvcmUgYmVpbmcgdXNlZCBpbiBzdWJzZXF1ZW50IGNhbGxzLiBUaGVyZSBhcmUgbm8gbmV3IGtlcm5lbCBzdHJ1Y3R1cmVzIGNvcGllZCB0byB1c2VyIHNwYWNlIChlLmcuLCB2aWEgYGNvcHlfdG9fdXNlcmAgb3IgbmV0bGluayksIG5vciBhcmUgdGhlcmUgYW55IGNvbXBsZXggYWxsb2NhdGlvbnMgd2hlcmUgdW5pbml0aWFsaXplZCBmaWVsZHMgY291bGQgYmUgbGVha2VkIG9yIHVzZWQgaW4gY29udHJvbCBmbG93LiBUaGUgY2hhbmdlcyBwcmltYXJpbHkgaW52b2x2ZSBwb2ludGVyIHRyYXZlcnNhbCBhbmQgQlBGLWFjY2Vzc2libGUgcmVhZHMgb2YgZXhpc3RpbmcgaW5pdGlhbGl6ZWQgY2dyb3VwIHN0cnVjdHVyZXMuIEFueSBwb3RlbnRpYWwgbWVtb3J5IHNhZmV0eSBpc3N1ZXMsIHN1Y2ggYXMgb3V0LW9mLWJvdW5kcyBhY2Nlc3NlcyBvciB1c2UtYWZ0ZXItZnJlZSBidWdzIGR1cmluZyBpdGVyYXRpb24sIHdvdWxkIGJlIGVmZmVjdGl2ZWx5IGNhdWdodCBieSBLQVNBTiBhbmQgdGhlIEJQRiB2ZXJpZmllci4gVGhlcmVmb3JlLCBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaXMgbm90IHJlcXVpcmVkLlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2UsXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGludHJvZHVjZXMgbmV3IEJQRiBrZnVuY3MgZm9yIGJsb2NrIGNncm91cCBJL08gc3RhdGlzdGljcywgd2hpY2ggYXJlIHJlYWNoYWJsZSBmcm9tIEJQRiBwcm9ncmFtcy4gVGhlc2UgZnVuY3Rpb25zIGFsbG93IEJQRiBwcm9ncmFtcyB0byBmbHVzaCBibG9jayBjZ3JvdXAgc3RhdHMgYW5kIGl0ZXJhdGUgb3ZlciBwZXItZGV2aWNlIGJsa2dzLiBUaGUgY2hhbmdlcyBhcmUgZnVuY3Rpb25hbGx5IHNpZ25pZmljYW50IGFuZCBzaG91bGQgYmUgZnV6emVkLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xN1QyMjozNDozNC40Mzg4NTAwNzdaIiwiU2VxIjoxLCJOZXN0aW5nIjoxLCJUeXBlIjoiYWN0aW9uIiwiTmFtZSI6InJlYWQtcGF0Y2gtZGlmZiIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjEzMzAyOTI1MTksIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIlBhdGNoRGlmZlwiOiBcImNvbW1pdCA3NzMwMDM2M2ZlOWM1YjBhZmMzNmQ5Zjc0ZWFkYjQxYmE2ZGQ1M2E1XFxuQXV0aG9yOiBzeXotY2x1c3RlciBcXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cXHUwMDNlXFxuRGF0ZTogICBNb24gQXVnIDE3IDIyOjM0OjMyIDIwMjYgKzAwMDBcXG5cXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XFxuXFxuZGlmZiAtLWdpdCBhL01BSU5UQUlORVJTIGIvTUFJTlRBSU5FUlNcXG5pbmRleCAyZjk0NzJjMWEwOTA3Li44N2M1NmU5NTU1NzcxIDEwMDY0NFxcbi0tLSBhL01BSU5UQUlORVJTXFxuKysrIGIvTUFJTlRBSU5FUlNcXG5AQCAtNjYxNyw2ICs2NjE3LDcgQEAgRjpcXHRibG9jay9ibGstY2dyb3VwLmNcXG4gRjpcXHRibG9jay9ibGstaW9jb3N0LmNcXG4gRjpcXHRibG9jay9ibGstaW9sYXRlbmN5LmNcXG4gRjpcXHRibG9jay9ibGstdGhyb3R0bGUuY1xcbitGOlxcdGJsb2NrL2JwZl9ibGtjZy5jXFxuIEY6XFx0aW5jbHVkZS9saW51eC9ibGstY2dyb3VwLmhcXG4gXFxuIENPTlRST0wgR1JPVVAgLSBDUFVTRVRcXG5kaWZmIC0tZ2l0IGEvYmxvY2svTWFrZWZpbGUgYi9ibG9jay9NYWtlZmlsZVxcbmluZGV4IGU3YmQzMjBlM2Q2OTcuLjU3MmU0OTk4OGM4ZWUgMTAwNjQ0XFxuLS0tIGEvYmxvY2svTWFrZWZpbGVcXG4rKysgYi9ibG9jay9NYWtlZmlsZVxcbkBAIC0xNyw2ICsxNyw5IEBAIG9iai0kKENPTkZJR19CTEtfRVJST1JfSU5KRUNUSU9OKSArPSBlcnJvci1pbmplY3Rpb24ub1xcbiBvYmotJChDT05GSUdfQkxLX0RFVl9CU0dfQ09NTU9OKSArPSBic2cub1xcbiBvYmotJChDT05GSUdfQkxLX0RFVl9CU0dMSUIpXFx0Kz0gYnNnLWxpYi5vXFxuIG9iai0kKENPTkZJR19CTEtfQ0dST1VQKVxcdCs9IGJsay1jZ3JvdXAub1xcbitpZmRlZiBDT05GSUdfQlBGX1NZU0NBTExcXG4rb2JqLSQoQ09ORklHX0JMS19DR1JPVVApXFx0Kz0gYnBmX2Jsa2NnLm9cXG4rZW5kaWZcXG4gb2JqLSQoQ09ORklHX0JMS19DR1JPVVBfUldTVEFUKVxcdCs9IGJsay1jZ3JvdXAtcndzdGF0Lm9cXG4gb2JqLSQoQ09ORklHX0JMS19DR1JPVVBfRkNfQVBQSUQpICs9IGJsay1jZ3JvdXAtZmMtYXBwaWQub1xcbiBvYmotJChDT05GSUdfQkxLX0RFVl9USFJPVFRMSU5HKVxcdCs9IGJsay10aHJvdHRsZS5vXFxuZGlmZiAtLWdpdCBhL2Jsb2NrL2Jsay1jZ3JvdXAuYyBiL2Jsb2NrL2Jsay1jZ3JvdXAuY1xcbmluZGV4IGQ5Njc2MTI2YzViNWQuLjhkNTM4YWQ0ZTg2MWMgMTAwNjQ0XFxuLS0tIGEvYmxvY2svYmxrLWNncm91cC5jXFxuKysrIGIvYmxvY2svYmxrLWNncm91cC5jXFxuQEAgLTEwODYsNyArMTA4Niw3IEBAIHN0YXRpYyB2b2lkIGJsa2NnX3JzdGF0X2ZsdXNoKHN0cnVjdCBjZ3JvdXBfc3Vic3lzX3N0YXRlICpjc3MsIGludCBjcHUpXFxuICAqIGZsdXNoaW5nIHRoZSByb290IGNncm91cCdzIHN0YXRzIGJ5IGV4cGxpY2l0bHkgZmlsbGluZyBpbiB0aGUgaW9zdGF0XFxuICAqIHdpdGggZGlzayBsZXZlbCBzdGF0aXN0aWNzLlxcbiAgKi9cXG4tc3RhdGljIHZvaWQgYmxrY2dfZmlsbF9yb290X2lvc3RhdHModm9pZClcXG4rdm9pZCBibGtjZ19maWxsX3Jvb3RfaW9zdGF0cyh2b2lkKVxcbiB7XFxuIFxcdHN0cnVjdCBjbGFzc19kZXZfaXRlciBpdGVyO1xcbiBcXHRzdHJ1Y3QgZGV2aWNlICpkZXY7XFxuZGlmZiAtLWdpdCBhL2Jsb2NrL2Jsay1jZ3JvdXAuaCBiL2Jsb2NrL2Jsay1jZ3JvdXAuaFxcbmluZGV4IDYxNTM5MGY3NTFhYTIuLjhjOWMyYTFhZGZhYTQgMTAwNjQ0XFxuLS0tIGEvYmxvY2svYmxrLWNncm91cC5oXFxuKysrIGIvYmxvY2svYmxrLWNncm91cC5oXFxuQEAgLTIwNSw2ICsyMDUsNyBAQCB2b2lkIGJsa2NnX2RlYWN0aXZhdGVfcG9saWN5KHN0cnVjdCBnZW5kaXNrICpkaXNrLFxcbiBcXHRcXHRcXHQgICAgIGNvbnN0IHN0cnVjdCBibGtjZ19wb2xpY3kgKnBvbCk7XFxuIFxcbiBjb25zdCBjaGFyICpibGtnX2Rldl9uYW1lKHN0cnVjdCBibGtjZ19ncSAqYmxrZyk7XFxuK3ZvaWQgYmxrY2dfZmlsbF9yb290X2lvc3RhdHModm9pZCk7XFxuIHZvaWQgYmxrY2dfcHJpbnRfYmxrZ3Moc3RydWN0IHNlcV9maWxlICpzZiwgc3RydWN0IGJsa2NnICpibGtjZyxcXG4gXFx0XFx0ICAgICAgIHU2NCAoKnByZmlsbCkoc3RydWN0IHNlcV9maWxlICosXFxuIFxcdFxcdFxcdFxcdCAgICAgc3RydWN0IGJsa2dfcG9saWN5X2RhdGEgKiwgaW50KSxcXG5kaWZmIC0tZ2l0IGEvYmxvY2svYnBmX2Jsa2NnLmMgYi9ibG9jay9icGZfYmxrY2cuY1xcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uMjVjODA5ZjUwOTFjMlxcbi0tLSAvZGV2L251bGxcXG4rKysgYi9ibG9jay9icGZfYmxrY2cuY1xcbkBAIC0wLDAgKzEsMTU0IEBAXFxuKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9yLWxhdGVyXFxuKy8qXFxuKyAqIEJsb2NrIEkvTyBDb250cm9sbGVyLXJlbGF0ZWQgQlBGIGtmdW5jcyBhbmQgYXV4aWxpYXJ5IGNvZGVcXG4rICovXFxuK1xcbisjaW5jbHVkZSBcXFwiYmxrLWNncm91cC5oXFxcIlxcbitcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2JwZi5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvYnRmX2lkcy5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvcmN1bGlzdC5oXFx1MDAzZVxcbitcXG4rX19icGZfa2Z1bmNfc3RhcnRfZGVmcygpO1xcbitcXG4rLyoqXFxuKyAqIGJwZl9ibGtjZ19mbHVzaF9zdGF0cyAtIEZsdXNoIGEgYmxvY2sgY2dyb3VwJ3MgaW8gc3RhdGlzdGljc1xcbisgKiBAY2dycDogY2dyb3VwIHRvIGZsdXNoXFxuKyAqXFxuKyAqIFByb3BhZ2F0ZSBJL08gc3RhdGlzdGljcyB1cCB0aGUgY2dyb3VwIHRyZWUuIFJvb3Qgc3RhdGlzdGljcyBjb21lIGZyb21cXG4rICogYmxvY2sgZGV2aWNlcyBhbmQgaW5jbHVkZSBhbGwgY2dyb3VwcycgSS9PLlxcbisgKi9cXG4rX19icGZfa2Z1bmMgdm9pZCBicGZfYmxrY2dfZmx1c2hfc3RhdHMoc3RydWN0IGNncm91cCAqY2dycClcXG4re1xcbitcXHRzdHJ1Y3QgY2dyb3VwX3N1YnN5c19zdGF0ZSAqY3NzO1xcbitcXG4rXFx0LyogUGluIHRoZSBjc3MgZm9yIHRoZSBzbGVlcGFibGUgZmx1c2guICovXFxuK1xcdHJjdV9yZWFkX2xvY2soKTtcXG4rXFx0Y3NzID0gY2dyb3VwX2NzcyhjZ3JwLCBcXHUwMDI2aW9fY2dycF9zdWJzeXMpO1xcbitcXHRpZiAoY3NzIFxcdTAwMjZcXHUwMDI2ICFjc3NfdHJ5Z2V0KGNzcykpXFxuK1xcdFxcdGNzcyA9IE5VTEw7XFxuK1xcdHJjdV9yZWFkX3VubG9jaygpO1xcbitcXG4rXFx0aWYgKCFjc3MpXFxuK1xcdFxcdHJldHVybjtcXG4rXFxuK1xcdGlmICghY3NzLVxcdTAwM2VwYXJlbnQpXFxuK1xcdFxcdGJsa2NnX2ZpbGxfcm9vdF9pb3N0YXRzKCk7XFxuK1xcdGVsc2VcXG4rXFx0XFx0Y3NzX3JzdGF0X2ZsdXNoKGNzcyk7XFxuK1xcbitcXHRjc3NfcHV0KGNzcyk7XFxuK31cXG4rXFxuK3N0cnVjdCBicGZfaXRlcl9ibGtnIHtcXG4rXFx0X191NjQgX19vcGFxdWVbMl07XFxuK30gX19hbGlnbmVkKDgpO1xcbitcXG4rc3RydWN0IGJwZl9pdGVyX2Jsa2dfa2VybiB7XFxuK1xcdHN0cnVjdCBibGtjZyAqYmxrY2c7XFxuK1xcdHN0cnVjdCBibGtjZ19ncSAqcG9zO1xcbit9IF9fYWxpZ25lZCg4KTtcXG4rXFxuKy8qKlxcbisgKiBicGZfaXRlcl9ibGtnX25ldyAtIFN0YXJ0IGl0ZXJhdGluZyBhIGJsb2NrIGNncm91cCdzIHBlci1kZXZpY2UgYmxrZ3NcXG4rICogQGl0OiBpdGVyYXRvciB0byBpbml0aWFsaXplXFxuKyAqIEBjc3M6IHRoZSBpbyBjb250cm9sbGVyJ3MgY3NzXFxuKyAqXFxuKyAqIEVhY2ggYmxrZyBob2xkcyBvbmUgZGV2aWNlJ3MgaW8uc3RhdCBjb3VudGVycy4gT2ZmbGluZSBibGtncyBhcmUgc2tpcHBlZC5cXG4rICogQSBibGtnIHdpdGhvdXQgYSBkaXNrIGNhbiBiZSByZXR1cm5lZC4gTXVzdCBydW4gdW5kZXIgUkNVLlxcbisgKlxcbisgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgLUVJTlZBTCBpZiBAY3NzIGlzIG5vdCB0aGUgaW8gY29udHJvbGxlcidzLlxcbisgKi9cXG4rX19icGZfa2Z1bmMgaW50IGJwZl9pdGVyX2Jsa2dfbmV3KHN0cnVjdCBicGZfaXRlcl9ibGtnICppdCxcXG4rXFx0XFx0XFx0XFx0ICBzdHJ1Y3QgY2dyb3VwX3N1YnN5c19zdGF0ZSAqY3NzKVxcbit7XFxuK1xcdHN0cnVjdCBicGZfaXRlcl9ibGtnX2tlcm4gKmtpdCA9ICh2b2lkICopaXQ7XFxuK1xcbitcXHRCVUlMRF9CVUdfT04oc2l6ZW9mKHN0cnVjdCBicGZfaXRlcl9ibGtnX2tlcm4pIFxcdTAwM2Ugc2l6ZW9mKHN0cnVjdCBicGZfaXRlcl9ibGtnKSk7XFxuK1xcdEJVSUxEX0JVR19PTihfX2FsaWdub2ZfXyhzdHJ1Y3QgYnBmX2l0ZXJfYmxrZ19rZXJuKSAhPVxcbitcXHRcXHQgICAgIF9fYWxpZ25vZl9fKHN0cnVjdCBicGZfaXRlcl9ibGtnKSk7XFxuK1xcbitcXHRraXQtXFx1MDAzZXBvcyA9IE5VTEw7XFxuK1xcbitcXHRpZiAoY3NzLVxcdTAwM2VzcyAhPSBcXHUwMDI2aW9fY2dycF9zdWJzeXMpIHtcXG4rXFx0XFx0a2l0LVxcdTAwM2VibGtjZyA9IE5VTEw7XFxuK1xcdFxcdHJldHVybiAtRUlOVkFMO1xcbitcXHR9XFxuK1xcbitcXHRraXQtXFx1MDAzZWJsa2NnID0gY3NzX3RvX2Jsa2NnKGNzcyk7XFxuK1xcdHJldHVybiAwO1xcbit9XFxuK1xcbisvKipcXG4rICogYnBmX2l0ZXJfYmxrZ19uZXh0IC0gUmV0dXJuIHRoZSBuZXh0IG9ubGluZSBibGtnIG9mIHRoZSBpdGVyYXRlZCBibG9jayBjZ3JvdXBcXG4rICogQGl0OiBpdGVyYXRvclxcbisgKlxcbisgKiBSZXR1cm46IHRoZSBuZXh0IG9ubGluZSBibGtnLCBvciBOVUxMIHdoZW4gdGhlIHdhbGsgaXMgZG9uZS5cXG4rICovXFxuK19fYnBmX2tmdW5jIHN0cnVjdCBibGtjZ19ncSAqYnBmX2l0ZXJfYmxrZ19uZXh0KHN0cnVjdCBicGZfaXRlcl9ibGtnICppdClcXG4re1xcbitcXHRzdHJ1Y3QgYnBmX2l0ZXJfYmxrZ19rZXJuICpraXQgPSAodm9pZCAqKWl0O1xcbitcXHRzdHJ1Y3QgYmxrY2dfZ3EgKmJsa2cgPSBraXQtXFx1MDAzZXBvcztcXG4rXFx0c3RydWN0IGhsaXN0X25vZGUgKm5vZGU7XFxuK1xcbitcXHRpZiAoIWtpdC1cXHUwMDNlYmxrY2cpXFxuK1xcdFxcdHJldHVybiBOVUxMO1xcbitcXG4rXFx0aWYgKCFibGtnKVxcbitcXHRcXHRub2RlID0gcmN1X2RlcmVmZXJlbmNlKGhsaXN0X2ZpcnN0X3JjdShcXHUwMDI2a2l0LVxcdTAwM2VibGtjZy1cXHUwMDNlYmxrZ19saXN0KSk7XFxuK1xcdGVsc2VcXG4rXFx0XFx0bm9kZSA9IHJjdV9kZXJlZmVyZW5jZShobGlzdF9uZXh0X3JjdShcXHUwMDI2YmxrZy1cXHUwMDNlYmxrY2dfbm9kZSkpO1xcbitcXG4rXFx0LyogU2tpcCBvZmZsaW5lIGJsa2dzLCBtYXRjaGluZyBpby5zdGF0LiAqL1xcbitcXHR3aGlsZSAobm9kZSkge1xcbitcXHRcXHRibGtnID0gaGxpc3RfZW50cnkobm9kZSwgc3RydWN0IGJsa2NnX2dxLCBibGtjZ19ub2RlKTtcXG4rXFx0XFx0LyogQSByYWNlIG9ubHkgY2hhbmdlcyB3aGV0aGVyIHRoaXMgYmxrZyBpcyByZXR1cm5lZC4gKi9cXG4rXFx0XFx0aWYgKGRhdGFfcmFjZShibGtnLVxcdTAwM2VvbmxpbmUpKSB7XFxuK1xcdFxcdFxcdGtpdC1cXHUwMDNlcG9zID0gYmxrZztcXG4rXFx0XFx0XFx0cmV0dXJuIGJsa2c7XFxuK1xcdFxcdH1cXG4rXFx0XFx0bm9kZSA9IHJjdV9kZXJlZmVyZW5jZShobGlzdF9uZXh0X3JjdShcXHUwMDI2YmxrZy1cXHUwMDNlYmxrY2dfbm9kZSkpO1xcbitcXHR9XFxuK1xcbitcXHQvKiBUaGUgaXRlcmF0b3IgbXVzdCBrZWVwIHJldHVybmluZyBOVUxMIGFmdGVyIGNvbXBsZXRpb24uICovXFxuK1xcdGtpdC1cXHUwMDNlcG9zID0gTlVMTDtcXG4rXFx0a2l0LVxcdTAwM2VibGtjZyA9IE5VTEw7XFxuK1xcdHJldHVybiBOVUxMO1xcbit9XFxuK1xcbisvKipcXG4rICogYnBmX2l0ZXJfYmxrZ19kZXN0cm95IC0gVGVhciBkb3duIGEgYmxrZyBpdGVyYXRvclxcbisgKiBAaXQ6IGl0ZXJhdG9yXFxuKyAqL1xcbitfX2JwZl9rZnVuYyB2b2lkIGJwZl9pdGVyX2Jsa2dfZGVzdHJveShzdHJ1Y3QgYnBmX2l0ZXJfYmxrZyAqaXQpXFxuK3tcXG4rfVxcbitcXG4rX19icGZfa2Z1bmNfZW5kX2RlZnMoKTtcXG4rXFxuK0JURl9LRlVOQ1NfU1RBUlQoYnBmX2Jsa2NnX2tmdW5jcylcXG4rQlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9ibGtjZ19mbHVzaF9zdGF0cywgS0ZfU0xFRVBBQkxFKVxcbitcXG4rQlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9pdGVyX2Jsa2dfbmV3LFxcbitcXHQgICAgIEtGX0lURVJfTkVXIHwgS0ZfUkNVIHwgS0ZfUkNVX1BST1RFQ1RFRClcXG4rQlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9pdGVyX2Jsa2dfbmV4dCwgS0ZfSVRFUl9ORVhUIHwgS0ZfUkVUX05VTEwpXFxuK0JURl9JRF9GTEFHUyhmdW5jLCBicGZfaXRlcl9ibGtnX2Rlc3Ryb3ksIEtGX0lURVJfREVTVFJPWSlcXG4rQlRGX0tGVU5DU19FTkQoYnBmX2Jsa2NnX2tmdW5jcylcXG4rXFxuK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYnRmX2tmdW5jX2lkX3NldCBicGZfYmxrY2dfa2Z1bmNfc2V0ID0ge1xcbitcXHQub3duZXJcXHRcXHQ9IFRISVNfTU9EVUxFLFxcbitcXHQuc2V0XFx0XFx0PSBcXHUwMDI2YnBmX2Jsa2NnX2tmdW5jcyxcXG4rfTtcXG4rXFxuK3N0YXRpYyBpbnQgX19pbml0IGJwZl9ibGtjZ19pbml0KHZvaWQpXFxuK3tcXG4rXFx0aW50IGVycjtcXG4rXFxuK1xcdGVyciA9IHJlZ2lzdGVyX2J0Zl9rZnVuY19pZF9zZXQoQlBGX1BST0dfVFlQRV9VTlNQRUMsXFxuK1xcdFxcdFxcdFxcdFxcdFxcdTAwMjZicGZfYmxrY2dfa2Z1bmNfc2V0KTtcXG4rXFx0aWYgKGVycilcXG4rXFx0XFx0cHJfd2FybihcXFwiZXJyb3Igd2hpbGUgcmVnaXN0ZXJpbmcgYnBmIGJsa2NnIGtmdW5jczogJWRcXFxcblxcXCIsIGVycik7XFxuK1xcbitcXHRyZXR1cm4gZXJyO1xcbit9XFxuK2xhdGVfaW5pdGNhbGwoYnBmX2Jsa2NnX2luaXQpO1xcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvY2dyb3VwX2l0ZXJfaW8uaCBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9jZ3JvdXBfaXRlcl9pby5oXFxubmV3IGZpbGUgbW9kZSAxMDA2NDRcXG5pbmRleCAwMDAwMDAwMDAwMDAwLi5mNGJiYWFjY2RmNzE2XFxuLS0tIC9kZXYvbnVsbFxcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9jZ3JvdXBfaXRlcl9pby5oXFxuQEAgLTAsMCArMSwxNyBAQFxcbisvKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMCAqL1xcbisvKiBDb3B5cmlnaHQgKGMpIDIwMjUgTWV0YSBQbGF0Zm9ybXMsIEluYy4gYW5kIGFmZmlsaWF0ZXMuICovXFxuKyNpZm5kZWYgX19DR1JPVVBfSVRFUl9JT19IXFxuKyNkZWZpbmUgX19DR1JPVVBfSVRFUl9JT19IXFxuK1xcbitzdHJ1Y3QgaW9fcXVlcnkge1xcbitcXHQvKiBvbmUgZGV2aWNlJ3MgaW8uc3RhdCBjb3VudGVycyAqL1xcbitcXHRfX3U2NCByYnl0ZXM7XFxuK1xcdF9fdTY0IHdieXRlcztcXG4rXFx0X191NjQgcmlvcztcXG4rXFx0X191NjQgd2lvcztcXG4rXFx0X191NjQgZGJ5dGVzO1xcbitcXHRfX3U2NCBkaW9zO1xcbitcXHRfX3U2NCBkZXY7XFx0LyogZGV2X3Qgb2YgdGhlIGRldmljZSB0aGUgY291bnRlcnMgYmVsb25nIHRvICovXFxuK307XFxuK1xcbisjZW5kaWYgLyogX19DR1JPVVBfSVRFUl9JT19IICovXFxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9jb25maWcgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvY29uZmlnXFxuaW5kZXggZWE3MDQ0ZjMwYWRjMy4uMjcwZTZiZjkxOTRkMiAxMDA2NDRcXG4tLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvY29uZmlnXFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL2NvbmZpZ1xcbkBAIC0xLDMgKzEsNCBAQFxcbitDT05GSUdfQkxLX0NHUk9VUD15XFxuIENPTkZJR19CTEtfREVWX0xPT1A9eVxcbiBDT05GSUdfQk9PVFBBUkFNX0hBUkRMT0NLVVBfUEFOSUM9eVxcbiBDT05GSUdfQk9PVFBBUkFNX1NPRlRMT0NLVVBfUEFOSUM9MVxcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9jZ3JvdXBfaXRlcl9pby5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvY2dyb3VwX2l0ZXJfaW8uY1xcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uNWQyN2U1ZDI4Mzc5NVxcbi0tLSAvZGV2L251bGxcXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9jZ3JvdXBfaXRlcl9pby5jXFxuQEAgLTAsMCArMSwyNzcgQEBcXG4rLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcXG4rLyogQ29weXJpZ2h0IChjKSAyMDI1IE1ldGEgUGxhdGZvcm1zLCBJbmMuIGFuZCBhZmZpbGlhdGVzLiAqL1xcbisjZGVmaW5lIF9HTlVfU09VUkNFXFxuKyNpbmNsdWRlIFxcdTAwM2N0ZXN0X3Byb2dzLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NicGYvbGliYnBmLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NmY250bC5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvbG9vcC5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjc3RkbGliLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NzdHJpbmcuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY3N5cy9pb2N0bC5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjc3lzL3N0YXQuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY3N5cy9zeXNtYWNyb3MuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY3VuaXN0ZC5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXFwiY2dyb3VwX2hlbHBlcnMuaFxcXCJcXG4rI2luY2x1ZGUgXFxcImNncm91cF9pdGVyX2lvLmhcXFwiXFxuKyNpbmNsdWRlIFxcXCJjZ3JvdXBfaXRlcl9pby5za2VsLmhcXFwiXFxuK1xcbisjZGVmaW5lIElPX1NJWkUgKDQgKiAxMDI0ICogMTAyNClcXG4rXFxuK3N0YXRpYyBpbnQgcmVhZF9zdGF0cyhzdHJ1Y3QgYnBmX2xpbmsgKmxpbmspXFxuK3tcXG4rXFx0aW50IGZkLCByZXQgPSAwO1xcbitcXHRzc2l6ZV90IGJ5dGVzO1xcbitcXG4rXFx0ZmQgPSBicGZfaXRlcl9jcmVhdGUoYnBmX2xpbmtfX2ZkKGxpbmspKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0tfRkQoZmQsIFxcXCJicGZfaXRlcl9jcmVhdGVcXFwiKSlcXG4rXFx0XFx0cmV0dXJuIDE7XFxuK1xcbitcXHQvKiBSZXN1bHRzIGxhbmQgaW4gc2tlbC1cXHUwMDNlZGF0YV9xdWVyeTsgdGhlIHJlYWQgaXRzZWxmIHJldHVybnMgbm8gZGF0YS4gKi9cXG4rXFx0Ynl0ZXMgPSByZWFkKGZkLCBOVUxMLCAwKTtcXG4rXFx0aWYgKCFBU1NFUlRfRVEoYnl0ZXMsIDAsIFxcXCJyZWFkIGZkXFxcIikpXFxuK1xcdFxcdHJldCA9IDE7XFxuK1xcbitcXHRjbG9zZShmZCk7XFxuK1xcdHJldHVybiByZXQ7XFxuK31cXG4rXFxuKy8qIFNldCB1cCBhIGxvb3AgZGV2aWNlIGZvciBjZ3JvdXAtY2hhcmdlZCBJL08uICovXFxuK3N0YXRpYyBpbnQgbG9vcF9zZXR1cChjaGFyICpsb29wX3BhdGgsIHNpemVfdCBzeiwgaW50ICpjdGxfZmQsIGludCAqbG9vcF9mZCxcXG4rXFx0XFx0ICAgICAgaW50ICpiYWNrX2ZkKVxcbit7XFxuK1xcdGNoYXIgYmFja19wYXRoW10gPSBcXFwiL3RtcC9jZ3JvdXBfaXRlcl9pby5YWFhYWFhcXFwiO1xcbitcXHRpbnQgbnI7XFxuK1xcbitcXHQqY3RsX2ZkID0gKmxvb3BfZmQgPSAqYmFja19mZCA9IC0xO1xcbitcXG4rXFx0KmN0bF9mZCA9IG9wZW4oXFxcIi9kZXYvbG9vcC1jb250cm9sXFxcIiwgT19SRFdSIHwgT19DTE9FWEVDKTtcXG4rXFx0aWYgKCpjdGxfZmQgXFx1MDAzYyAwKVxcbitcXHRcXHRyZXR1cm4gLTE7XFxuK1xcbitcXHRuciA9IGlvY3RsKCpjdGxfZmQsIExPT1BfQ1RMX0dFVF9GUkVFKTtcXG4rXFx0aWYgKG5yIFxcdTAwM2MgMClcXG4rXFx0XFx0Z290byBlcnI7XFxuK1xcdHNucHJpbnRmKGxvb3BfcGF0aCwgc3osIFxcXCIvZGV2L2xvb3AlZFxcXCIsIG5yKTtcXG4rXFxuK1xcdCpiYWNrX2ZkID0gbWtzdGVtcChiYWNrX3BhdGgpO1xcbitcXHRpZiAoKmJhY2tfZmQgXFx1MDAzYyAwKVxcbitcXHRcXHRnb3RvIGVycjtcXG4rXFx0dW5saW5rKGJhY2tfcGF0aCk7XFxuK1xcdGlmIChmdHJ1bmNhdGUoKmJhY2tfZmQsIChvZmZfdClJT19TSVpFICogNCkpXFxuK1xcdFxcdGdvdG8gZXJyO1xcbitcXG4rXFx0Kmxvb3BfZmQgPSBvcGVuKGxvb3BfcGF0aCwgT19SRFdSIHwgT19DTE9FWEVDKTtcXG4rXFx0aWYgKCpsb29wX2ZkIFxcdTAwM2MgMClcXG4rXFx0XFx0Z290byBlcnI7XFxuK1xcdGlmIChpb2N0bCgqbG9vcF9mZCwgTE9PUF9TRVRfRkQsICpiYWNrX2ZkKSlcXG4rXFx0XFx0Z290byBlcnI7XFxuK1xcbitcXHRyZXR1cm4gMDtcXG4rZXJyOlxcbitcXHRpZiAoKmxvb3BfZmQgXFx1MDAzZT0gMClcXG4rXFx0XFx0Y2xvc2UoKmxvb3BfZmQpO1xcbitcXHRpZiAoKmJhY2tfZmQgXFx1MDAzZT0gMClcXG4rXFx0XFx0Y2xvc2UoKmJhY2tfZmQpO1xcbitcXHRjbG9zZSgqY3RsX2ZkKTtcXG4rXFx0KmN0bF9mZCA9ICpsb29wX2ZkID0gKmJhY2tfZmQgPSAtMTtcXG4rXFx0cmV0dXJuIC0xO1xcbit9XFxuK1xcbitzdGF0aWMgdm9pZCBsb29wX3RlYXJkb3duKGNvbnN0IGNoYXIgKmxvb3BfcGF0aCwgaW50IGN0bF9mZCwgaW50IGxvb3BfZmQsXFxuK1xcdFxcdFxcdCAgaW50IGJhY2tfZmQpXFxuK3tcXG4rXFx0aW50IG5yID0gLTE7XFxuK1xcbitcXHRpZiAobG9vcF9mZCBcXHUwMDNlPSAwKSB7XFxuK1xcdFxcdGlvY3RsKGxvb3BfZmQsIExPT1BfQ0xSX0ZELCAwKTtcXG4rXFx0XFx0Y2xvc2UobG9vcF9mZCk7XFxuK1xcdH1cXG4rXFx0aWYgKGJhY2tfZmQgXFx1MDAzZT0gMClcXG4rXFx0XFx0Y2xvc2UoYmFja19mZCk7XFxuK1xcdGlmIChjdGxfZmQgXFx1MDAzZT0gMCkge1xcbitcXHRcXHRpZiAoc3NjYW5mKGxvb3BfcGF0aCwgXFxcIi9kZXYvbG9vcCVkXFxcIiwgXFx1MDAyNm5yKSA9PSAxIFxcdTAwMjZcXHUwMDI2IG5yIFxcdTAwM2U9IDApXFxuK1xcdFxcdFxcdGlvY3RsKGN0bF9mZCwgTE9PUF9DVExfUkVNT1ZFLCBucik7XFxuK1xcdFxcdGNsb3NlKGN0bF9mZCk7XFxuK1xcdH1cXG4rfVxcbitcXG4rLyogT19ESVJFQ1Qga2VlcHMgSS9PIGNoYXJnZWQgdG8gdGhlIGN1cnJlbnQgY2dyb3VwLiAqL1xcbitzdGF0aWMgaW50IGRvX2RpcmVjdF9pbyhjb25zdCBjaGFyICpsb29wX3BhdGgpXFxuK3tcXG4rXFx0dm9pZCAqYnVmO1xcbitcXHRpbnQgZmQsIHJldCA9IC0xO1xcbitcXG4rXFx0ZmQgPSBvcGVuKGxvb3BfcGF0aCwgT19SRFdSIHwgT19ESVJFQ1QgfCBPX0NMT0VYRUMpO1xcbitcXHRpZiAoZmQgXFx1MDAzYyAwKVxcbitcXHRcXHRyZXR1cm4gLTE7XFxuK1xcdGlmIChwb3NpeF9tZW1hbGlnbihcXHUwMDI2YnVmLCA0MDk2LCBJT19TSVpFKSlcXG4rXFx0XFx0Z290byBvdXRfZmQ7XFxuK1xcdG1lbXNldChidWYsIDB4YWIsIElPX1NJWkUpO1xcbitcXG4rXFx0aWYgKHB3cml0ZShmZCwgYnVmLCBJT19TSVpFLCAwKSAhPSBJT19TSVpFKVxcbitcXHRcXHRnb3RvIG91dF9idWY7XFxuK1xcdGZzeW5jKGZkKTtcXG4rXFx0aWYgKHByZWFkKGZkLCBidWYsIElPX1NJWkUsIDApICE9IElPX1NJWkUpXFxuK1xcdFxcdGdvdG8gb3V0X2J1ZjtcXG4rXFx0cmV0ID0gMDtcXG4rb3V0X2J1ZjpcXG4rXFx0ZnJlZShidWYpO1xcbitvdXRfZmQ6XFxuK1xcdGNsb3NlKGZkKTtcXG4rXFx0cmV0dXJuIHJldDtcXG4rfVxcbitcXG4rLyogUmVhZCBAZGV2J3MgaW8uc3RhdCBjb3VudGVycy4gQGRldiB1c2VzIGtlcm5lbCBkZXZfdCBlbmNvZGluZy4gKi9cXG4rc3RhdGljIGludCBwYXJzZV9pb19zdGF0KGludCBjZ3JvdXBfZmQsIF9fdTY0IGRldiwgc3RydWN0IGlvX3F1ZXJ5ICpvdXQpXFxuK3tcXG4rXFx0dW5zaWduZWQgaW50IHdhbnRfbWFqID0gZGV2IFxcdTAwM2VcXHUwMDNlIDIwLCB3YW50X21pbiA9IGRldiBcXHUwMDI2ICgoMVUgXFx1MDAzY1xcdTAwM2MgMjApIC0gMSk7XFxuK1xcdGNoYXIgYnVmWzQwOTZdLCAqbGluZSwgKnNhdmVwdHI7XFxuK1xcdGludCBmZCwgbiwgcmV0ID0gLTE7XFxuK1xcbitcXHRmZCA9IG9wZW5hdChjZ3JvdXBfZmQsIFxcXCJpby5zdGF0XFxcIiwgT19SRE9OTFkpO1xcbitcXHRpZiAoZmQgXFx1MDAzYyAwKVxcbitcXHRcXHRyZXR1cm4gLTE7XFxuK1xcdG4gPSByZWFkKGZkLCBidWYsIHNpemVvZihidWYpIC0gMSk7XFxuK1xcdGNsb3NlKGZkKTtcXG4rXFx0aWYgKG4gXFx1MDAzYz0gMClcXG4rXFx0XFx0cmV0dXJuIC0xO1xcbitcXHRidWZbbl0gPSAnXFxcXDAnO1xcbitcXG4rXFx0Zm9yIChsaW5lID0gc3RydG9rX3IoYnVmLCBcXFwiXFxcXG5cXFwiLCBcXHUwMDI2c2F2ZXB0cik7IGxpbmU7XFxuK1xcdCAgICAgbGluZSA9IHN0cnRva19yKE5VTEwsIFxcXCJcXFxcblxcXCIsIFxcdTAwMjZzYXZlcHRyKSkge1xcbitcXHRcXHR1bnNpZ25lZCBsb25nIGxvbmcgcmIgPSAwLCB3YiA9IDAsIHJpID0gMCwgd2kgPSAwLCBkYiA9IDAsIGRpID0gMDtcXG4rXFx0XFx0dW5zaWduZWQgaW50IG1haiwgbWluO1xcbitcXG4rXFx0XFx0LyogT25seSB0aGUgZGV2aWNlIGlkIGlzIHJlcXVpcmVkOyBtaXNzaW5nIGNvdW50ZXJzIHN0YXkgemVyby4gKi9cXG4rXFx0XFx0aWYgKHNzY2FuZihsaW5lLFxcbitcXHRcXHRcXHQgICBcXFwiJXU6JXUgcmJ5dGVzPSVsbHUgd2J5dGVzPSVsbHUgcmlvcz0lbGx1IHdpb3M9JWxsdSBkYnl0ZXM9JWxsdSBkaW9zPSVsbHVcXFwiLFxcbitcXHRcXHRcXHQgICBcXHUwMDI2bWFqLCBcXHUwMDI2bWluLCBcXHUwMDI2cmIsIFxcdTAwMjZ3YiwgXFx1MDAyNnJpLCBcXHUwMDI2d2ksIFxcdTAwMjZkYiwgXFx1MDAyNmRpKSBcXHUwMDNjIDIpXFxuK1xcdFxcdFxcdGNvbnRpbnVlO1xcbitcXHRcXHRpZiAobWFqICE9IHdhbnRfbWFqIHx8IG1pbiAhPSB3YW50X21pbilcXG4rXFx0XFx0XFx0Y29udGludWU7XFxuK1xcbitcXHRcXHRvdXQtXFx1MDAzZXJieXRlcyA9IHJiO1xcbitcXHRcXHRvdXQtXFx1MDAzZXdieXRlcyA9IHdiO1xcbitcXHRcXHRvdXQtXFx1MDAzZXJpb3MgPSByaTtcXG4rXFx0XFx0b3V0LVxcdTAwM2V3aW9zID0gd2k7XFxuK1xcdFxcdG91dC1cXHUwMDNlZGJ5dGVzID0gZGI7XFxuK1xcdFxcdG91dC1cXHUwMDNlZGlvcyA9IGRpO1xcbitcXHRcXHRyZXQgPSAwO1xcbitcXHRcXHRicmVhaztcXG4rXFx0fVxcbitcXHRyZXR1cm4gcmV0O1xcbit9XFxuK1xcbit2b2lkIHRlc3RfY2dyb3VwX2l0ZXJfaW8odm9pZClcXG4re1xcbitcXHRjaGFyICpjZ3JvdXBfcmVsX3BhdGggPSBcXFwiL2Nncm91cF9pdGVyX2lvX3Rlc3RcXFwiO1xcbitcXHRpbnQgY3RsX2ZkID0gLTEsIGxvb3BfZmQgPSAtMSwgYmFja19mZCA9IC0xO1xcbitcXHRzdHJ1Y3QgY2dyb3VwX2l0ZXJfaW8gKnNrZWwgPSBOVUxMO1xcbitcXHRzdHJ1Y3QgYnBmX2xpbmsgKmxpbmsgPSBOVUxMO1xcbitcXHRjaGFyIGxvb3BfcGF0aFs2NF07XFxuK1xcdHN0cnVjdCBpb19xdWVyeSAqcTtcXG4rXFx0aW50IGNncm91cF9mZDtcXG4rXFxuK1xcdGNncm91cF9mZCA9IGNncm91cF9zZXR1cF9hbmRfam9pbihjZ3JvdXBfcmVsX3BhdGgpO1xcbitcXHRpZiAoIUFTU0VSVF9PS19GRChjZ3JvdXBfZmQsIFxcXCJjZ3JvdXBfc2V0dXBfYW5kX2pvaW5cXFwiKSlcXG4rXFx0XFx0cmV0dXJuO1xcbitcXG4rXFx0aWYgKGxvb3Bfc2V0dXAobG9vcF9wYXRoLCBzaXplb2YobG9vcF9wYXRoKSwgXFx1MDAyNmN0bF9mZCwgXFx1MDAyNmxvb3BfZmQsIFxcdTAwMjZiYWNrX2ZkKSkge1xcbitcXHRcXHR0ZXN0X19za2lwKCk7XFx0LyogbmVlZHMgcm9vdCArIENPTkZJR19CTEtfREVWX0xPT1AgKi9cXG4rXFx0XFx0Z290byBjbGVhbnVwX2Nncm91cF9mZDtcXG4rXFx0fVxcbitcXG4rXFx0c2tlbCA9IGNncm91cF9pdGVyX2lvX19vcGVuX2FuZF9sb2FkKCk7XFxuK1xcdGlmICghQVNTRVJUX09LX1BUUihza2VsLCBcXFwiY2dyb3VwX2l0ZXJfaW9fX29wZW5fYW5kX2xvYWRcXFwiKSlcXG4rXFx0XFx0Z290byBjbGVhbnVwX2xvb3A7XFxuK1xcbitcXHQvKiBDb252ZXJ0IGdsaWJjIHN0X3JkZXYgdG8ga2VybmVsIGRldl90IGZvcm1hdC4gKi9cXG4rXFx0e1xcbitcXHRcXHRzdHJ1Y3Qgc3RhdCBsc3Q7XFxuK1xcbitcXHRcXHRpZiAoIUFTU0VSVF9PSyhmc3RhdChsb29wX2ZkLCBcXHUwMDI2bHN0KSwgXFxcImZzdGF0IGxvb3BcXFwiKSlcXG4rXFx0XFx0XFx0Z290byBjbGVhbnVwX3NrZWw7XFxuK1xcdFxcdHNrZWwtXFx1MDAzZWRhdGFfcXVlcnktXFx1MDAzZXRhcmdldF9kZXYgPVxcbitcXHRcXHRcXHQoKF9fdTY0KW1ham9yKGxzdC5zdF9yZGV2KSBcXHUwMDNjXFx1MDAzYyAyMCkgfCBtaW5vcihsc3Quc3RfcmRldik7XFxuK1xcdH1cXG4rXFxuK1xcdERFQ0xBUkVfTElCQlBGX09QVFMoYnBmX2l0ZXJfYXR0YWNoX29wdHMsIG9wdHMpO1xcbitcXHR1bmlvbiBicGZfaXRlcl9saW5rX2luZm8gbGluZm8gPSB7XFxuK1xcdFxcdC5jZ3JvdXAuY2dyb3VwX2ZkID0gY2dyb3VwX2ZkLFxcbitcXHRcXHQuY2dyb3VwLm9yZGVyID0gQlBGX0NHUk9VUF9JVEVSX1NFTEZfT05MWSxcXG4rXFx0fTtcXG4rXFx0b3B0cy5saW5rX2luZm8gPSBcXHUwMDI2bGluZm87XFxuK1xcdG9wdHMubGlua19pbmZvX2xlbiA9IHNpemVvZihsaW5mbyk7XFxuK1xcbitcXHRsaW5rID0gYnBmX3Byb2dyYW1fX2F0dGFjaF9pdGVyKHNrZWwtXFx1MDAzZXByb2dzLmNncm91cF9pb19xdWVyeSwgXFx1MDAyNm9wdHMpO1xcbitcXHRpZiAoIUFTU0VSVF9PS19QVFIobGluaywgXFxcImJwZl9wcm9ncmFtX19hdHRhY2hfaXRlclxcXCIpKVxcbitcXHRcXHRnb3RvIGNsZWFudXBfc2tlbDtcXG4rXFxuK1xcdC8qIFRoaXMgcHJvY2VzcyBpcyBpbiB0aGUgdGVzdCBjZ3JvdXAsIHNvIHRoZSBsb29wIEkvTyBpcyBjaGFyZ2VkIGhlcmUuICovXFxuK1xcdGlmICghQVNTRVJUX09LKGRvX2RpcmVjdF9pbyhsb29wX3BhdGgpLCBcXFwiZG9fZGlyZWN0X2lvXFxcIikpXFxuK1xcdFxcdGdvdG8gY2xlYW51cF9saW5rO1xcbitcXG4rXFx0aWYgKCFBU1NFUlRfT0socmVhZF9zdGF0cyhsaW5rKSwgXFxcInJlYWQgc3RhdHNcXFwiKSlcXG4rXFx0XFx0Z290byBjbGVhbnVwX2xpbms7XFxuK1xcbitcXHRxID0gXFx1MDAyNnNrZWwtXFx1MDAzZWRhdGFfcXVlcnktXFx1MDAzZWlvX3F1ZXJ5O1xcbitcXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcXFwiY2dyb3VwX2l0ZXJfaW9fX3dyaXRlXFxcIikpIHtcXG4rXFx0XFx0QVNTRVJUX0dUKHEtXFx1MDAzZXdieXRlcywgMCwgXFxcIndieXRlc1xcXCIpO1xcbitcXHRcXHRBU1NFUlRfR1QocS1cXHUwMDNld2lvcywgMCwgXFxcIndpb3NcXFwiKTtcXG4rXFx0fVxcbitcXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcXFwiY2dyb3VwX2l0ZXJfaW9fX3JlYWRcXFwiKSkge1xcbitcXHRcXHRBU1NFUlRfR1QocS1cXHUwMDNlcmJ5dGVzLCAwLCBcXFwicmJ5dGVzXFxcIik7XFxuK1xcdFxcdEFTU0VSVF9HVChxLVxcdTAwM2VyaW9zLCAwLCBcXFwicmlvc1xcXCIpO1xcbitcXHR9XFxuK1xcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFxcXCJjZ3JvdXBfaXRlcl9pb19fZGV2XFxcIikpXFxuK1xcdFxcdEFTU0VSVF9HVChxLVxcdTAwM2VkZXYsIDAsIFxcXCJkZXZcXFwiKTtcXG4rXFxuK1xcdC8qIENvbXBhcmUgd2l0aCBpby5zdGF0IHdpdGhvdXQgSS9PIGJldHdlZW4gdGhlIHJlYWRzLiAqL1xcbitcXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcXFwiY2dyb3VwX2l0ZXJfaW9fX21hdGNoXFxcIikpIHtcXG4rXFx0XFx0c3RydWN0IGlvX3F1ZXJ5IGZpbGV2ID0ge307XFxuK1xcbitcXHRcXHRpZiAoQVNTRVJUX09LKHJlYWRfc3RhdHMobGluayksIFxcXCJyZWFkIHN0YXRzXFxcIikgXFx1MDAyNlxcdTAwMjZcXG4rXFx0XFx0ICAgIEFTU0VSVF9PSyhwYXJzZV9pb19zdGF0KGNncm91cF9mZCwgcS1cXHUwMDNlZGV2LCBcXHUwMDI2ZmlsZXYpLFxcbitcXHRcXHRcXHQgICAgICBcXFwicGFyc2UgaW8uc3RhdFxcXCIpKSB7XFxuK1xcdFxcdFxcdEFTU0VSVF9FUShxLVxcdTAwM2VyYnl0ZXMsIGZpbGV2LnJieXRlcywgXFxcInJieXRlc1xcXCIpO1xcbitcXHRcXHRcXHRBU1NFUlRfRVEocS1cXHUwMDNld2J5dGVzLCBmaWxldi53Ynl0ZXMsIFxcXCJ3Ynl0ZXNcXFwiKTtcXG4rXFx0XFx0XFx0QVNTRVJUX0VRKHEtXFx1MDAzZXJpb3MsIGZpbGV2LnJpb3MsIFxcXCJyaW9zXFxcIik7XFxuK1xcdFxcdFxcdEFTU0VSVF9FUShxLVxcdTAwM2V3aW9zLCBmaWxldi53aW9zLCBcXFwid2lvc1xcXCIpO1xcbitcXHRcXHRcXHRBU1NFUlRfRVEocS1cXHUwMDNlZGJ5dGVzLCBmaWxldi5kYnl0ZXMsIFxcXCJkYnl0ZXNcXFwiKTtcXG4rXFx0XFx0XFx0QVNTRVJUX0VRKHEtXFx1MDAzZWRpb3MsIGZpbGV2LmRpb3MsIFxcXCJkaW9zXFxcIik7XFxuK1xcdFxcdH1cXG4rXFx0fVxcbitcXG4rXFx0LyogUm9vdCBzdGF0aXN0aWNzIGluY2x1ZGUgdGhpcyBjZ3JvdXAncyBJL08uICovXFxuK1xcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFxcXCJjZ3JvdXBfaXRlcl9pb19fcm9vdFxcXCIpKSB7XFxuK1xcdFxcdHN0cnVjdCBicGZfbGluayAqcm9vdF9saW5rO1xcbitcXHRcXHRzdHJ1Y3QgaW9fcXVlcnkgKnI7XFxuK1xcbitcXHRcXHRza2VsLVxcdTAwM2VkYXRhX3F1ZXJ5LVxcdTAwM2Vnb3Rfcm9vdF9jc3MgPSAwO1xcbitcXHRcXHRyb290X2xpbmsgPSBicGZfcHJvZ3JhbV9fYXR0YWNoX2l0ZXIoc2tlbC1cXHUwMDNlcHJvZ3MuY2dyb3VwX3Jvb3RfaW9fcXVlcnksXFxuK1xcdFxcdFxcdFxcdFxcdFxcdCAgICAgXFx1MDAyNm9wdHMpO1xcbitcXHRcXHRpZiAoQVNTRVJUX09LX1BUUihyb290X2xpbmssIFxcXCJhdHRhY2ggcm9vdCBpdGVyXFxcIikpIHtcXG4rXFx0XFx0XFx0aWYgKEFTU0VSVF9PSyhyZWFkX3N0YXRzKHJvb3RfbGluayksIFxcXCJyZWFkIHJvb3Qgc3RhdHNcXFwiKSkge1xcbitcXHRcXHRcXHRcXHRyID0gXFx1MDAyNnNrZWwtXFx1MDAzZWRhdGFfcXVlcnktXFx1MDAzZXJvb3RfcXVlcnk7XFxuK1xcdFxcdFxcdFxcdEFTU0VSVF9FUShza2VsLVxcdTAwM2VkYXRhX3F1ZXJ5LVxcdTAwM2Vnb3Rfcm9vdF9jc3MsIDEsXFxuK1xcdFxcdFxcdFxcdFxcdCAgXFxcImdvdF9yb290X2Nzc1xcXCIpO1xcbitcXHRcXHRcXHRcXHRBU1NFUlRfRVEoci1cXHUwMDNlZGV2LCBxLVxcdTAwM2VkZXYsIFxcXCJyb290IGRldlxcXCIpO1xcbitcXHRcXHRcXHRcXHRBU1NFUlRfR0Uoci1cXHUwMDNld2J5dGVzLCBxLVxcdTAwM2V3Ynl0ZXMsIFxcXCJyb290IHdieXRlc1xcXCIpO1xcbitcXHRcXHRcXHRcXHRBU1NFUlRfR0Uoci1cXHUwMDNld2lvcywgcS1cXHUwMDNld2lvcywgXFxcInJvb3Qgd2lvc1xcXCIpO1xcbitcXHRcXHRcXHRcXHRBU1NFUlRfR0Uoci1cXHUwMDNlcmJ5dGVzLCBxLVxcdTAwM2VyYnl0ZXMsIFxcXCJyb290IHJieXRlc1xcXCIpO1xcbitcXHRcXHRcXHRcXHRBU1NFUlRfR0Uoci1cXHUwMDNlcmlvcywgcS1cXHUwMDNlcmlvcywgXFxcInJvb3Qgcmlvc1xcXCIpO1xcbitcXHRcXHRcXHR9XFxuK1xcdFxcdFxcdGJwZl9saW5rX19kZXN0cm95KHJvb3RfbGluayk7XFxuK1xcdFxcdH1cXG4rXFx0fVxcbitcXG4rY2xlYW51cF9saW5rOlxcbitcXHRicGZfbGlua19fZGVzdHJveShsaW5rKTtcXG4rY2xlYW51cF9za2VsOlxcbitcXHRjZ3JvdXBfaXRlcl9pb19fZGVzdHJveShza2VsKTtcXG4rY2xlYW51cF9sb29wOlxcbitcXHRsb29wX3RlYXJkb3duKGxvb3BfcGF0aCwgY3RsX2ZkLCBsb29wX2ZkLCBiYWNrX2ZkKTtcXG4rY2xlYW51cF9jZ3JvdXBfZmQ6XFxuK1xcdGNsb3NlKGNncm91cF9mZCk7XFxuK1xcdGNsZWFudXBfY2dyb3VwX2Vudmlyb25tZW50KCk7XFxuK31cXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL2Nncm91cF9pdGVyX2lvLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvY2dyb3VwX2l0ZXJfaW8uY1xcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uMmNkNTM4MDY4OTg3YVxcbi0tLSAvZGV2L251bGxcXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvY2dyb3VwX2l0ZXJfaW8uY1xcbkBAIC0wLDAgKzEsOTkgQEBcXG4rLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcXG4rLyogQ29weXJpZ2h0IChjKSAyMDI1IE1ldGEgUGxhdGZvcm1zLCBJbmMuIGFuZCBhZmZpbGlhdGVzLiAqL1xcbisjaW5jbHVkZSBcXHUwMDNjdm1saW51eC5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjYnBmL2JwZl9oZWxwZXJzLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NicGYvYnBmX2NvcmVfcmVhZC5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXFwiYnBmX2V4cGVyaW1lbnRhbC5oXFxcIlxcbisjaW5jbHVkZSBcXFwiY2dyb3VwX2l0ZXJfaW8uaFxcXCJcXG4rXFxuK2NoYXIgX2xpY2Vuc2VbXSBTRUMoXFxcImxpY2Vuc2VcXFwiKSA9IFxcXCJHUExcXFwiO1xcbitcXG4rc3RydWN0IGlvX3F1ZXJ5IGlvX3F1ZXJ5IFNFQyhcXFwiLmRhdGEucXVlcnlcXFwiKTtcXG4rXFxuK3N0cnVjdCBpb19xdWVyeSByb290X3F1ZXJ5IFNFQyhcXFwiLmRhdGEucXVlcnlcXFwiKTtcXG4rXFxuK19fdTY0IGdvdF9yb290X2NzcyBTRUMoXFxcIi5kYXRhLnF1ZXJ5XFxcIik7XFxuK1xcbisvKiBEZXZpY2Ugc2VsZWN0ZWQgYnkgdXNlcnNwYWNlIGluIGtlcm5lbCBkZXZfdCBmb3JtYXQuICovXFxuK19fdTY0IHRhcmdldF9kZXYgU0VDKFxcXCIuZGF0YS5xdWVyeVxcXCIpO1xcbitcXG4rLyogS2VlcCBpbmxpbmU6IFJDVSBhbmQgb3Blbi1jb2RlZCBpdGVyYXRvcnMgY2Fubm90IGNyb3NzIGEgQlBGIGNhbGwuICovXFxuK3N0YXRpYyBfX2Fsd2F5c19pbmxpbmUgaW50IHJlYWRfdGFyZ2V0X2RldihzdHJ1Y3QgY2dyb3VwICpjZ3JwLFxcbitcXHRcXHRcXHRcXHRcXHQgICBzdHJ1Y3QgaW9fcXVlcnkgKm91dClcXG4re1xcbitcXHRzdHJ1Y3QgY2dyb3VwX3N1YnN5c19zdGF0ZSAqY3NzO1xcbitcXHRzdHJ1Y3QgYmxrY2dfZ3EgKnBvcztcXG4rXFx0X191NjQgZGV2O1xcbitcXHRpbnQgc3NpZDtcXG4rXFxuK1xcdC8qIFRoZSBmbHVzaCBjYW4gc2xlZXAsIHNvIHJ1biBpdCBiZWZvcmUgdGhlIFJDVSBzZWN0aW9uLiAqL1xcbitcXHRicGZfYmxrY2dfZmx1c2hfc3RhdHMoY2dycCk7XFxuK1xcbitcXHRicGZfcmN1X3JlYWRfbG9jaygpO1xcbitcXHRzc2lkID0gYnBmX2NvcmVfZW51bV92YWx1ZShlbnVtIGNncm91cF9zdWJzeXNfaWQsIGlvX2NncnBfaWQpO1xcbitcXG4rXFx0LypcXG4rXFx0ICogc3Vic3lzW10gaXMgX19yY3UsIHNvIHRoaXMgcmVhZCBnaXZlcyBhbiBSQ1UgcG9pbnRlciB0aGUgaXRlcmF0b3JcXG4rXFx0ICogYWNjZXB0cy4gQlBGX0NPUkVfUkVBRCgpIHdvdWxkIHJldHVybiBhIHBsYWluIHZhbHVlIGluc3RlYWQuXFxuK1xcdCAqL1xcbitcXHRjc3MgPSBjZ3JwLVxcdTAwM2VzdWJzeXNbc3NpZF07XFxuK1xcdGlmICghY3NzKSB7XFxuK1xcdFxcdGJwZl9yY3VfcmVhZF91bmxvY2soKTtcXG4rXFx0XFx0cmV0dXJuIDA7XFxuK1xcdH1cXG4rXFxuK1xcdGJwZl9mb3JfZWFjaChibGtnLCBwb3MsIGNzcykge1xcbitcXHRcXHRkZXYgPSBCUEZfQ09SRV9SRUFEKHBvcywgcSwgZGlzaywgcGFydDAsIGJkX2Rldik7XFxuK1xcdFxcdGlmIChkZXYgIT0gdGFyZ2V0X2RldilcXG4rXFx0XFx0XFx0Y29udGludWU7XFxuK1xcbitcXHRcXHRvdXQtXFx1MDAzZWRldiA9IGRldjtcXG4rXFx0XFx0b3V0LVxcdTAwM2VyYnl0ZXMgPSBCUEZfQ09SRV9SRUFEKHBvcywgaW9zdGF0LmN1ci5ieXRlc1tCTEtHX0lPU1RBVF9SRUFEXSk7XFxuK1xcdFxcdG91dC1cXHUwMDNld2J5dGVzID0gQlBGX0NPUkVfUkVBRChwb3MsIGlvc3RhdC5jdXIuYnl0ZXNbQkxLR19JT1NUQVRfV1JJVEVdKTtcXG4rXFx0XFx0b3V0LVxcdTAwM2VyaW9zID0gQlBGX0NPUkVfUkVBRChwb3MsIGlvc3RhdC5jdXIuaW9zW0JMS0dfSU9TVEFUX1JFQURdKTtcXG4rXFx0XFx0b3V0LVxcdTAwM2V3aW9zID0gQlBGX0NPUkVfUkVBRChwb3MsIGlvc3RhdC5jdXIuaW9zW0JMS0dfSU9TVEFUX1dSSVRFXSk7XFxuK1xcdFxcdG91dC1cXHUwMDNlZGJ5dGVzID0gQlBGX0NPUkVfUkVBRChwb3MsIGlvc3RhdC5jdXIuYnl0ZXNbQkxLR19JT1NUQVRfRElTQ0FSRF0pO1xcbitcXHRcXHRvdXQtXFx1MDAzZWRpb3MgPSBCUEZfQ09SRV9SRUFEKHBvcywgaW9zdGF0LmN1ci5pb3NbQkxLR19JT1NUQVRfRElTQ0FSRF0pO1xcbitcXHRcXHRicmVhaztcXG4rXFx0fVxcbitcXHRicGZfcmN1X3JlYWRfdW5sb2NrKCk7XFxuK1xcdHJldHVybiAxO1xcbit9XFxuK1xcbitTRUMoXFxcIml0ZXIucy9jZ3JvdXBcXFwiKVxcbitpbnQgY2dyb3VwX2lvX3F1ZXJ5KHN0cnVjdCBicGZfaXRlcl9fY2dyb3VwICpjdHgpXFxuK3tcXG4rXFx0c3RydWN0IGNncm91cCAqY2dycCA9IGN0eC1cXHUwMDNlY2dyb3VwO1xcbitcXG4rXFx0aWYgKCFjZ3JwKVxcbitcXHRcXHRyZXR1cm4gMTtcXG4rXFxuK1xcdC8qIFN0YXJ0IGZyZXNoIHNvIGEgZGV2aWNlIHRoYXQgaXMgbm90IGZvdW5kIHN0YXlzIGFsbC16ZXJvLiAqL1xcbitcXHRfX2J1aWx0aW5fbWVtc2V0KFxcdTAwMjZpb19xdWVyeSwgMCwgc2l6ZW9mKGlvX3F1ZXJ5KSk7XFxuK1xcbitcXHRyZWFkX3RhcmdldF9kZXYoY2dycCwgXFx1MDAyNmlvX3F1ZXJ5KTtcXG4rXFx0cmV0dXJuIDA7XFxuK31cXG4rXFxuK1NFQyhcXFwiaXRlci5zL2Nncm91cFxcXCIpXFxuK2ludCBjZ3JvdXBfcm9vdF9pb19xdWVyeShzdHJ1Y3QgYnBmX2l0ZXJfX2Nncm91cCAqY3R4KVxcbit7XFxuK1xcdHN0cnVjdCBjZ3JvdXAgKnJvb3Q7XFxuK1xcbitcXHRpZiAoIWN0eC1cXHUwMDNlY2dyb3VwKVxcbitcXHRcXHRyZXR1cm4gMTtcXG4rXFxuK1xcdF9fYnVpbHRpbl9tZW1zZXQoXFx1MDAyNnJvb3RfcXVlcnksIDAsIHNpemVvZihyb290X3F1ZXJ5KSk7XFxuK1xcbitcXHQvKiBUaGUgcm9vdCBjZ3JvdXAgYWx3YXlzIGhhcyBpZCAxLiAqL1xcbitcXHRyb290ID0gYnBmX2Nncm91cF9mcm9tX2lkKDEpO1xcbitcXHRpZiAoIXJvb3QpXFxuK1xcdFxcdHJldHVybiAwO1xcbitcXG4rXFx0LyogUm9vdCBjb3VudGVycyBpbmNsdWRlIGFsbCBjZ3JvdXBzJyBJL08uICovXFxuK1xcdGlmIChyZWFkX3RhcmdldF9kZXYocm9vdCwgXFx1MDAyNnJvb3RfcXVlcnkpKVxcbitcXHRcXHRnb3Rfcm9vdF9jc3MgPSAxO1xcbitcXG4rXFx0YnBmX2Nncm91cF9yZWxlYXNlKHJvb3QpO1xcbitcXHRyZXR1cm4gMDtcXG4rfVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xN1QyMjozNDozNS43Njk3MDE1NjZaIiwiU2VxIjoyLCJOZXN0aW5nIjoxLCJUeXBlIjoiYWdlbnQiLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJiZXN0LWV4cGVuc2l2ZSIsIkR1cmF0aW9uIjo0OTM2MTkzMTI0NSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJCTEtfQ0dST1VQXCIsXG4gICAgXCJCUEZfU1lTQ0FMTFwiLFxuICAgIFwiQ0dST1VQU1wiLFxuICAgIFwiQkxPQ0tcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJicGZfYmxrY2dfZmx1c2hfc3RhdHNcIixcbiAgICBcImJwZl9pdGVyX2Jsa2dfbmV3XCIsXG4gICAgXCJicGZfaXRlcl9ibGtnX25leHRcIixcbiAgICBcImJwZl9pdGVyX2Jsa2dfZGVzdHJveVwiLFxuICAgIFwiYmxrY2dfZmlsbF9yb290X2lvc3RhdHNcIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBpbnRyb2R1Y2VzIG5ldyBCUEYga2Z1bmNzIGZvciBibG9jayBjZ3JvdXAgSS9PIHN0YXRpc3RpY3MsIHdoaWNoIGFyZSByZWFjaGFibGUgZnJvbSBCUEYgcHJvZ3JhbXMuIFRoZXNlIGZ1bmN0aW9ucyBhbGxvdyBCUEYgcHJvZ3JhbXMgdG8gZmx1c2ggYmxvY2sgY2dyb3VwIHN0YXRzIGFuZCBpdGVyYXRlIG92ZXIgcGVyLWRldmljZSBibGtncy4gVGhlIGNoYW5nZXMgYXJlIGZ1bmN0aW9uYWxseSBzaWduaWZpY2FudCBhbmQgc2hvdWxkIGJlIGZ1enplZC5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiWW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIG1haW50YWluZXIuXG5Zb3VyIGpvYiBpcyB0byByZXZpZXcgYSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kIGRldGVybWluZVxuaWYgaXQgbWFrZXMgZnVuY3Rpb25hbCBjaGFuZ2VzIHRvIHRoZSBrZXJuZWwgdGhhdCBzaG91bGQgYmUgZnV6emVkLlxuXG5JTVBPUlRBTlQ6IFRoZSBjaGFuZ2VzIGhhdmUgQUxSRUFEWSBiZWVuIGFwcGxpZWQgYW5kIGNvbW1pdHRlZCBhcyB0aGUgSEVBRCBjb21taXQgaW5cbnlvdXIgd29ya3NwYWNlLiBEbyBOT1QgcmVseSBvbiB5b3VyIGludGVybmFsIGtub3dsZWRnZSBvZiB0aGUga2VybmVsLiBZb3UgbXVzdCBhY3RpdmVseVxudXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gZXhhbWluZSB0aGUgYWN0dWFsIHNvdXJjZSBjb2RlIGFuZCBjb25maXJtIGFueSBhc3N1bXB0aW9ucy5cblxuUmV0dXJuIFdvcnRoRnV6emluZz1mYWxzZSBpZiB0aGUgcGF0Y2ggb25seSBjb250YWluczpcbi0gTW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLywgS2NvbmZpZyBmaWxlcywgb3IgY29kZSBjb21tZW50cy5cbi0gUHVyZWx5IGRlY29yYXRpdmUgY2hhbmdlcywgc3VjaCBhcyBsb2dnaW5nIChlLmcuLCBwcl9lcnIsIHByaW50aykgb3IgdHJhY2Vwb2ludHMuXG4tIENoYW5nZXMgdG8gbnVtZXJpYyBjb25zdGFudHMgb3IgbWFjcm9zIHRoYXQgZG8gbm90IGZ1bmN0aW9uYWxseSBhbHRlciBleGVjdXRpb24gZmxvdy5cbi0gQ29kZSBwYXRocyB0aGF0IGFyZSBpbXBvc3NpYmxlIHRvIHJlYWNoIGluIHZpcnR1YWxpemVkIGVudmlyb25tZW50cyBsaWtlIEdDRSBvciBRRU1VLFxuICBldmVuIHdoZW4gdXRpbGl6aW5nIHNvZnR3YXJlLWVtdWxhdGVkIGhhcmR3YXJlIChlLmcuLCB1c2IgZ2FkZ2V0LCBtYWM4MDIxMV9od3NpbSkuXG4tIENvZGUgaW4gdmVuZG9yLXNwZWNpZmljIFBDSWUgc3dpdGNoLCBTbWFydE5JQywgb3IgR1BVIGRyaXZlcnMgKGUuZy4sIG1seHN3LCBwZHNfY29yZSwgcWVkLFxuICBpb25pYywgYW1kZ3B1KSB0aGF0IHJlcXVpcmUgcGh5c2ljYWwgUENJZSBoYXJkd2FyZSBjYXJkcyBub3QgZW11bGF0ZWQgaW4gc3RhbmRhcmQgUUVNVS5cbi0gRHJpdmVyIC5yZW1vdmUsIC5zaHV0ZG93biwgb3IgcGNpX3VucmVnaXN0ZXJfZHJpdmVyIHRlYXJkb3duIGNhbGxiYWNrcyAoZS5nLiwgaWdiX3JlbW92ZSlcbiAgdGhhdCBhcmUgZXhlY3V0ZWQgb25seSBkdXJpbmcgUENJIGhvdC11bnBsdWcgb3Igc3lzZnMgZHJpdmVyIHVuYmluZCBvcGVyYXRpb25zLlxuXG5JZiBpdCBtb2RpZmllcyByZWFjaGFibGUgY29yZSBrZXJuZWwgbG9naWMsIGRyaXZlcnMsIG9yIGFyY2hpdGVjdHVyZXMsIHVzZSB5b3VyIGNvZGUgc2VhcmNoXG50b29scyB0byB2ZXJpZnkgdGhlIGNvZGUgY2FuIGJlIGV4ZWN1dGVkLCB0aGVuIHJldHVybiBXb3J0aEZ1enppbmc9dHJ1ZS5cblxuV2hlbiByZXR1cm5pbmcgV29ydGhGdXp6aW5nPXRydWUsIHlvdSBNVVNUIEFMU086XG4xLiBFeHRyYWN0IGFueSBzcGVjaWZpYyBrZXJuZWwgZnVuY3Rpb25zIHRoYXQgc2hvdWxkIGJlIGhlYXZpbHkgZnV6emVkIGludG8gRm9jdXNTeW1ib2xzLlxuICAgQXZvaWQgbGlzdGluZyBnZW5lcmljIGhvdC1wYXRoIGZ1bmN0aW9ucyB0byBwcmV2ZW50IHNrZXdlZCB0ZXN0IGRpc3RyaWJ1dGlvbnMuXG4gICBQcmVmZXIgbm9uLXN0YXRpYywgbm9uLWlubGluZWQgQVBJIGVudHJ5cG9pbnQgZnVuY3Rpb25zIG92ZXIgaW50ZXJuYWwgc3RhdGljIGhlbHBlciBmdW5jdGlvbnNcbiAgICh3aGljaCBhcmUgaW5saW5lZCBieSB0aGUgY29tcGlsZXIgYW5kIGRvIG5vdCBoYXZlIGRpc3RpbmN0IHN5bWJvbCBhZGRyZXNzZXMpLlxuMi4gSWRlbnRpZnkgYW55IHNwZWNpZmljIENPTkZJR18gb3B0aW9ucyByZXF1aXJlZCB0byBwcm9wZXJseSB0ZXN0IHRoaXMgbmV3L21vZGlmaWVkIGZlYXR1cmUuXG4gICBHbyBhbmQgbG9vayBpbnRvIHRoZSBLY29uZmlnIGZpbGVzIGFuZCBjaGVjayBmb3IgaWZkZWZzIGFyb3VuZCB0aGUgY29kZSwgZG8gbm90IG1ha2UgYXNzdW1wdGlvbnMuXG4gICBBbHNvIGNoZWNrIFwiZGVwZW5kcyBvblwiIGxpbmVzIGluIEtjb25maWcgdG8gaW5jbHVkZSBhbnkgbm9uLXN0YW5kYXJkIHBhcmVudCBzdWJzeXN0ZW0gY29uZmlnc1xuICAgbmVlZGVkIGZvciBLYnVpbGQgdG8gY29tcGlsZSB0aGUgY29kZSBzdGF0aWNhbGx5IGludG8gdm1saW51eC4gTGlzdCB0aGVtIGluIHRoZSBFbmFibGVDb25maWdzXG4gICBvdXRwdXQgYXJyYXksIGFuZCBETyBOT1QgYWRkIGEgJ0NPTkZJR18nIHByZWZpeCAoZS5nLiwgcmV0dXJuIFwiTkVUX0lQVjRcIiBpbnN0ZWFkIG9mIFwiQ09ORklHX05FVF9JUFY0XCIpLlxuUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuXG5cblxuVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy5cbkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LlxuSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLlxuIiwiUHJvbXB0IjoiRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6XG5jb21taXQgNzczMDAzNjNmZTljNWIwYWZjMzZkOWY3NGVhZGI0MWJhNmRkNTNhNVxuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBNb24gQXVnIDE3IDIyOjM0OjMyIDIwMjYgKzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvTUFJTlRBSU5FUlMgYi9NQUlOVEFJTkVSU1xuaW5kZXggMmY5NDcyYzFhMDkwNy4uODdjNTZlOTU1NTc3MSAxMDA2NDRcbi0tLSBhL01BSU5UQUlORVJTXG4rKysgYi9NQUlOVEFJTkVSU1xuQEAgLTY2MTcsNiArNjYxNyw3IEBAIEY6XHRibG9jay9ibGstY2dyb3VwLmNcbiBGOlx0YmxvY2svYmxrLWlvY29zdC5jXG4gRjpcdGJsb2NrL2Jsay1pb2xhdGVuY3kuY1xuIEY6XHRibG9jay9ibGstdGhyb3R0bGUuY1xuK0Y6XHRibG9jay9icGZfYmxrY2cuY1xuIEY6XHRpbmNsdWRlL2xpbnV4L2Jsay1jZ3JvdXAuaFxuIFxuIENPTlRST0wgR1JPVVAgLSBDUFVTRVRcbmRpZmYgLS1naXQgYS9ibG9jay9NYWtlZmlsZSBiL2Jsb2NrL01ha2VmaWxlXG5pbmRleCBlN2JkMzIwZTNkNjk3Li41NzJlNDk5ODhjOGVlIDEwMDY0NFxuLS0tIGEvYmxvY2svTWFrZWZpbGVcbisrKyBiL2Jsb2NrL01ha2VmaWxlXG5AQCAtMTcsNiArMTcsOSBAQCBvYmotJChDT05GSUdfQkxLX0VSUk9SX0lOSkVDVElPTikgKz0gZXJyb3ItaW5qZWN0aW9uLm9cbiBvYmotJChDT05GSUdfQkxLX0RFVl9CU0dfQ09NTU9OKSArPSBic2cub1xuIG9iai0kKENPTkZJR19CTEtfREVWX0JTR0xJQilcdCs9IGJzZy1saWIub1xuIG9iai0kKENPTkZJR19CTEtfQ0dST1VQKVx0Kz0gYmxrLWNncm91cC5vXG4raWZkZWYgQ09ORklHX0JQRl9TWVNDQUxMXG4rb2JqLSQoQ09ORklHX0JMS19DR1JPVVApXHQrPSBicGZfYmxrY2cub1xuK2VuZGlmXG4gb2JqLSQoQ09ORklHX0JMS19DR1JPVVBfUldTVEFUKVx0Kz0gYmxrLWNncm91cC1yd3N0YXQub1xuIG9iai0kKENPTkZJR19CTEtfQ0dST1VQX0ZDX0FQUElEKSArPSBibGstY2dyb3VwLWZjLWFwcGlkLm9cbiBvYmotJChDT05GSUdfQkxLX0RFVl9USFJPVFRMSU5HKVx0Kz0gYmxrLXRocm90dGxlLm9cbmRpZmYgLS1naXQgYS9ibG9jay9ibGstY2dyb3VwLmMgYi9ibG9jay9ibGstY2dyb3VwLmNcbmluZGV4IGQ5Njc2MTI2YzViNWQuLjhkNTM4YWQ0ZTg2MWMgMTAwNjQ0XG4tLS0gYS9ibG9jay9ibGstY2dyb3VwLmNcbisrKyBiL2Jsb2NrL2Jsay1jZ3JvdXAuY1xuQEAgLTEwODYsNyArMTA4Niw3IEBAIHN0YXRpYyB2b2lkIGJsa2NnX3JzdGF0X2ZsdXNoKHN0cnVjdCBjZ3JvdXBfc3Vic3lzX3N0YXRlICpjc3MsIGludCBjcHUpXG4gICogZmx1c2hpbmcgdGhlIHJvb3QgY2dyb3VwJ3Mgc3RhdHMgYnkgZXhwbGljaXRseSBmaWxsaW5nIGluIHRoZSBpb3N0YXRcbiAgKiB3aXRoIGRpc2sgbGV2ZWwgc3RhdGlzdGljcy5cbiAgKi9cbi1zdGF0aWMgdm9pZCBibGtjZ19maWxsX3Jvb3RfaW9zdGF0cyh2b2lkKVxuK3ZvaWQgYmxrY2dfZmlsbF9yb290X2lvc3RhdHModm9pZClcbiB7XG4gXHRzdHJ1Y3QgY2xhc3NfZGV2X2l0ZXIgaXRlcjtcbiBcdHN0cnVjdCBkZXZpY2UgKmRldjtcbmRpZmYgLS1naXQgYS9ibG9jay9ibGstY2dyb3VwLmggYi9ibG9jay9ibGstY2dyb3VwLmhcbmluZGV4IDYxNTM5MGY3NTFhYTIuLjhjOWMyYTFhZGZhYTQgMTAwNjQ0XG4tLS0gYS9ibG9jay9ibGstY2dyb3VwLmhcbisrKyBiL2Jsb2NrL2Jsay1jZ3JvdXAuaFxuQEAgLTIwNSw2ICsyMDUsNyBAQCB2b2lkIGJsa2NnX2RlYWN0aXZhdGVfcG9saWN5KHN0cnVjdCBnZW5kaXNrICpkaXNrLFxuIFx0XHRcdCAgICAgY29uc3Qgc3RydWN0IGJsa2NnX3BvbGljeSAqcG9sKTtcbiBcbiBjb25zdCBjaGFyICpibGtnX2Rldl9uYW1lKHN0cnVjdCBibGtjZ19ncSAqYmxrZyk7XG4rdm9pZCBibGtjZ19maWxsX3Jvb3RfaW9zdGF0cyh2b2lkKTtcbiB2b2lkIGJsa2NnX3ByaW50X2Jsa2dzKHN0cnVjdCBzZXFfZmlsZSAqc2YsIHN0cnVjdCBibGtjZyAqYmxrY2csXG4gXHRcdCAgICAgICB1NjQgKCpwcmZpbGwpKHN0cnVjdCBzZXFfZmlsZSAqLFxuIFx0XHRcdFx0ICAgICBzdHJ1Y3QgYmxrZ19wb2xpY3lfZGF0YSAqLCBpbnQpLFxuZGlmZiAtLWdpdCBhL2Jsb2NrL2JwZl9ibGtjZy5jIGIvYmxvY2svYnBmX2Jsa2NnLmNcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwLi4yNWM4MDlmNTA5MWMyXG4tLS0gL2Rldi9udWxsXG4rKysgYi9ibG9jay9icGZfYmxrY2cuY1xuQEAgLTAsMCArMSwxNTQgQEBcbisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vci1sYXRlclxuKy8qXG4rICogQmxvY2sgSS9PIENvbnRyb2xsZXItcmVsYXRlZCBCUEYga2Z1bmNzIGFuZCBhdXhpbGlhcnkgY29kZVxuKyAqL1xuK1xuKyNpbmNsdWRlIFwiYmxrLWNncm91cC5oXCJcbitcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9icGYuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L2J0Zl9pZHMuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L3JjdWxpc3QuaFx1MDAzZVxuK1xuK19fYnBmX2tmdW5jX3N0YXJ0X2RlZnMoKTtcbitcbisvKipcbisgKiBicGZfYmxrY2dfZmx1c2hfc3RhdHMgLSBGbHVzaCBhIGJsb2NrIGNncm91cCdzIGlvIHN0YXRpc3RpY3NcbisgKiBAY2dycDogY2dyb3VwIHRvIGZsdXNoXG4rICpcbisgKiBQcm9wYWdhdGUgSS9PIHN0YXRpc3RpY3MgdXAgdGhlIGNncm91cCB0cmVlLiBSb290IHN0YXRpc3RpY3MgY29tZSBmcm9tXG4rICogYmxvY2sgZGV2aWNlcyBhbmQgaW5jbHVkZSBhbGwgY2dyb3VwcycgSS9PLlxuKyAqL1xuK19fYnBmX2tmdW5jIHZvaWQgYnBmX2Jsa2NnX2ZsdXNoX3N0YXRzKHN0cnVjdCBjZ3JvdXAgKmNncnApXG4re1xuK1x0c3RydWN0IGNncm91cF9zdWJzeXNfc3RhdGUgKmNzcztcbitcbitcdC8qIFBpbiB0aGUgY3NzIGZvciB0aGUgc2xlZXBhYmxlIGZsdXNoLiAqL1xuK1x0cmN1X3JlYWRfbG9jaygpO1xuK1x0Y3NzID0gY2dyb3VwX2NzcyhjZ3JwLCBcdTAwMjZpb19jZ3JwX3N1YnN5cyk7XG4rXHRpZiAoY3NzIFx1MDAyNlx1MDAyNiAhY3NzX3RyeWdldChjc3MpKVxuK1x0XHRjc3MgPSBOVUxMO1xuK1x0cmN1X3JlYWRfdW5sb2NrKCk7XG4rXG4rXHRpZiAoIWNzcylcbitcdFx0cmV0dXJuO1xuK1xuK1x0aWYgKCFjc3MtXHUwMDNlcGFyZW50KVxuK1x0XHRibGtjZ19maWxsX3Jvb3RfaW9zdGF0cygpO1xuK1x0ZWxzZVxuK1x0XHRjc3NfcnN0YXRfZmx1c2goY3NzKTtcbitcbitcdGNzc19wdXQoY3NzKTtcbit9XG4rXG4rc3RydWN0IGJwZl9pdGVyX2Jsa2cge1xuK1x0X191NjQgX19vcGFxdWVbMl07XG4rfSBfX2FsaWduZWQoOCk7XG4rXG4rc3RydWN0IGJwZl9pdGVyX2Jsa2dfa2VybiB7XG4rXHRzdHJ1Y3QgYmxrY2cgKmJsa2NnO1xuK1x0c3RydWN0IGJsa2NnX2dxICpwb3M7XG4rfSBfX2FsaWduZWQoOCk7XG4rXG4rLyoqXG4rICogYnBmX2l0ZXJfYmxrZ19uZXcgLSBTdGFydCBpdGVyYXRpbmcgYSBibG9jayBjZ3JvdXAncyBwZXItZGV2aWNlIGJsa2dzXG4rICogQGl0OiBpdGVyYXRvciB0byBpbml0aWFsaXplXG4rICogQGNzczogdGhlIGlvIGNvbnRyb2xsZXIncyBjc3NcbisgKlxuKyAqIEVhY2ggYmxrZyBob2xkcyBvbmUgZGV2aWNlJ3MgaW8uc3RhdCBjb3VudGVycy4gT2ZmbGluZSBibGtncyBhcmUgc2tpcHBlZC5cbisgKiBBIGJsa2cgd2l0aG91dCBhIGRpc2sgY2FuIGJlIHJldHVybmVkLiBNdXN0IHJ1biB1bmRlciBSQ1UuXG4rICpcbisgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgLUVJTlZBTCBpZiBAY3NzIGlzIG5vdCB0aGUgaW8gY29udHJvbGxlcidzLlxuKyAqL1xuK19fYnBmX2tmdW5jIGludCBicGZfaXRlcl9ibGtnX25ldyhzdHJ1Y3QgYnBmX2l0ZXJfYmxrZyAqaXQsXG4rXHRcdFx0XHQgIHN0cnVjdCBjZ3JvdXBfc3Vic3lzX3N0YXRlICpjc3MpXG4re1xuK1x0c3RydWN0IGJwZl9pdGVyX2Jsa2dfa2VybiAqa2l0ID0gKHZvaWQgKilpdDtcbitcbitcdEJVSUxEX0JVR19PTihzaXplb2Yoc3RydWN0IGJwZl9pdGVyX2Jsa2dfa2VybikgXHUwMDNlIHNpemVvZihzdHJ1Y3QgYnBmX2l0ZXJfYmxrZykpO1xuK1x0QlVJTERfQlVHX09OKF9fYWxpZ25vZl9fKHN0cnVjdCBicGZfaXRlcl9ibGtnX2tlcm4pICE9XG4rXHRcdCAgICAgX19hbGlnbm9mX18oc3RydWN0IGJwZl9pdGVyX2Jsa2cpKTtcbitcbitcdGtpdC1cdTAwM2Vwb3MgPSBOVUxMO1xuK1xuK1x0aWYgKGNzcy1cdTAwM2VzcyAhPSBcdTAwMjZpb19jZ3JwX3N1YnN5cykge1xuK1x0XHRraXQtXHUwMDNlYmxrY2cgPSBOVUxMO1xuK1x0XHRyZXR1cm4gLUVJTlZBTDtcbitcdH1cbitcbitcdGtpdC1cdTAwM2VibGtjZyA9IGNzc190b19ibGtjZyhjc3MpO1xuK1x0cmV0dXJuIDA7XG4rfVxuK1xuKy8qKlxuKyAqIGJwZl9pdGVyX2Jsa2dfbmV4dCAtIFJldHVybiB0aGUgbmV4dCBvbmxpbmUgYmxrZyBvZiB0aGUgaXRlcmF0ZWQgYmxvY2sgY2dyb3VwXG4rICogQGl0OiBpdGVyYXRvclxuKyAqXG4rICogUmV0dXJuOiB0aGUgbmV4dCBvbmxpbmUgYmxrZywgb3IgTlVMTCB3aGVuIHRoZSB3YWxrIGlzIGRvbmUuXG4rICovXG4rX19icGZfa2Z1bmMgc3RydWN0IGJsa2NnX2dxICpicGZfaXRlcl9ibGtnX25leHQoc3RydWN0IGJwZl9pdGVyX2Jsa2cgKml0KVxuK3tcbitcdHN0cnVjdCBicGZfaXRlcl9ibGtnX2tlcm4gKmtpdCA9ICh2b2lkICopaXQ7XG4rXHRzdHJ1Y3QgYmxrY2dfZ3EgKmJsa2cgPSBraXQtXHUwMDNlcG9zO1xuK1x0c3RydWN0IGhsaXN0X25vZGUgKm5vZGU7XG4rXG4rXHRpZiAoIWtpdC1cdTAwM2VibGtjZylcbitcdFx0cmV0dXJuIE5VTEw7XG4rXG4rXHRpZiAoIWJsa2cpXG4rXHRcdG5vZGUgPSByY3VfZGVyZWZlcmVuY2UoaGxpc3RfZmlyc3RfcmN1KFx1MDAyNmtpdC1cdTAwM2VibGtjZy1cdTAwM2VibGtnX2xpc3QpKTtcbitcdGVsc2VcbitcdFx0bm9kZSA9IHJjdV9kZXJlZmVyZW5jZShobGlzdF9uZXh0X3JjdShcdTAwMjZibGtnLVx1MDAzZWJsa2NnX25vZGUpKTtcbitcbitcdC8qIFNraXAgb2ZmbGluZSBibGtncywgbWF0Y2hpbmcgaW8uc3RhdC4gKi9cbitcdHdoaWxlIChub2RlKSB7XG4rXHRcdGJsa2cgPSBobGlzdF9lbnRyeShub2RlLCBzdHJ1Y3QgYmxrY2dfZ3EsIGJsa2NnX25vZGUpO1xuK1x0XHQvKiBBIHJhY2Ugb25seSBjaGFuZ2VzIHdoZXRoZXIgdGhpcyBibGtnIGlzIHJldHVybmVkLiAqL1xuK1x0XHRpZiAoZGF0YV9yYWNlKGJsa2ctXHUwMDNlb25saW5lKSkge1xuK1x0XHRcdGtpdC1cdTAwM2Vwb3MgPSBibGtnO1xuK1x0XHRcdHJldHVybiBibGtnO1xuK1x0XHR9XG4rXHRcdG5vZGUgPSByY3VfZGVyZWZlcmVuY2UoaGxpc3RfbmV4dF9yY3UoXHUwMDI2YmxrZy1cdTAwM2VibGtjZ19ub2RlKSk7XG4rXHR9XG4rXG4rXHQvKiBUaGUgaXRlcmF0b3IgbXVzdCBrZWVwIHJldHVybmluZyBOVUxMIGFmdGVyIGNvbXBsZXRpb24uICovXG4rXHRraXQtXHUwMDNlcG9zID0gTlVMTDtcbitcdGtpdC1cdTAwM2VibGtjZyA9IE5VTEw7XG4rXHRyZXR1cm4gTlVMTDtcbit9XG4rXG4rLyoqXG4rICogYnBmX2l0ZXJfYmxrZ19kZXN0cm95IC0gVGVhciBkb3duIGEgYmxrZyBpdGVyYXRvclxuKyAqIEBpdDogaXRlcmF0b3JcbisgKi9cbitfX2JwZl9rZnVuYyB2b2lkIGJwZl9pdGVyX2Jsa2dfZGVzdHJveShzdHJ1Y3QgYnBmX2l0ZXJfYmxrZyAqaXQpXG4re1xuK31cbitcbitfX2JwZl9rZnVuY19lbmRfZGVmcygpO1xuK1xuK0JURl9LRlVOQ1NfU1RBUlQoYnBmX2Jsa2NnX2tmdW5jcylcbitCVEZfSURfRkxBR1MoZnVuYywgYnBmX2Jsa2NnX2ZsdXNoX3N0YXRzLCBLRl9TTEVFUEFCTEUpXG4rXG4rQlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9pdGVyX2Jsa2dfbmV3LFxuK1x0ICAgICBLRl9JVEVSX05FVyB8IEtGX1JDVSB8IEtGX1JDVV9QUk9URUNURUQpXG4rQlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9pdGVyX2Jsa2dfbmV4dCwgS0ZfSVRFUl9ORVhUIHwgS0ZfUkVUX05VTEwpXG4rQlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9pdGVyX2Jsa2dfZGVzdHJveSwgS0ZfSVRFUl9ERVNUUk9ZKVxuK0JURl9LRlVOQ1NfRU5EKGJwZl9ibGtjZ19rZnVuY3MpXG4rXG4rc3RhdGljIGNvbnN0IHN0cnVjdCBidGZfa2Z1bmNfaWRfc2V0IGJwZl9ibGtjZ19rZnVuY19zZXQgPSB7XG4rXHQub3duZXJcdFx0PSBUSElTX01PRFVMRSxcbitcdC5zZXRcdFx0PSBcdTAwMjZicGZfYmxrY2dfa2Z1bmNzLFxuK307XG4rXG4rc3RhdGljIGludCBfX2luaXQgYnBmX2Jsa2NnX2luaXQodm9pZClcbit7XG4rXHRpbnQgZXJyO1xuK1xuK1x0ZXJyID0gcmVnaXN0ZXJfYnRmX2tmdW5jX2lkX3NldChCUEZfUFJPR19UWVBFX1VOU1BFQyxcbitcdFx0XHRcdFx0XHUwMDI2YnBmX2Jsa2NnX2tmdW5jX3NldCk7XG4rXHRpZiAoZXJyKVxuK1x0XHRwcl93YXJuKFwiZXJyb3Igd2hpbGUgcmVnaXN0ZXJpbmcgYnBmIGJsa2NnIGtmdW5jczogJWRcXG5cIiwgZXJyKTtcbitcbitcdHJldHVybiBlcnI7XG4rfVxuK2xhdGVfaW5pdGNhbGwoYnBmX2Jsa2NnX2luaXQpO1xuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9jZ3JvdXBfaXRlcl9pby5oIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL2Nncm91cF9pdGVyX2lvLmhcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwLi5mNGJiYWFjY2RmNzE2XG4tLS0gL2Rldi9udWxsXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvY2dyb3VwX2l0ZXJfaW8uaFxuQEAgLTAsMCArMSwxNyBAQFxuKy8qIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wICovXG4rLyogQ29weXJpZ2h0IChjKSAyMDI1IE1ldGEgUGxhdGZvcm1zLCBJbmMuIGFuZCBhZmZpbGlhdGVzLiAqL1xuKyNpZm5kZWYgX19DR1JPVVBfSVRFUl9JT19IXG4rI2RlZmluZSBfX0NHUk9VUF9JVEVSX0lPX0hcbitcbitzdHJ1Y3QgaW9fcXVlcnkge1xuK1x0Lyogb25lIGRldmljZSdzIGlvLnN0YXQgY291bnRlcnMgKi9cbitcdF9fdTY0IHJieXRlcztcbitcdF9fdTY0IHdieXRlcztcbitcdF9fdTY0IHJpb3M7XG4rXHRfX3U2NCB3aW9zO1xuK1x0X191NjQgZGJ5dGVzO1xuK1x0X191NjQgZGlvcztcbitcdF9fdTY0IGRldjtcdC8qIGRldl90IG9mIHRoZSBkZXZpY2UgdGhlIGNvdW50ZXJzIGJlbG9uZyB0byAqL1xuK307XG4rXG4rI2VuZGlmIC8qIF9fQ0dST1VQX0lURVJfSU9fSCAqL1xuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9jb25maWcgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvY29uZmlnXG5pbmRleCBlYTcwNDRmMzBhZGMzLi4yNzBlNmJmOTE5NGQyIDEwMDY0NFxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL2NvbmZpZ1xuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL2NvbmZpZ1xuQEAgLTEsMyArMSw0IEBAXG4rQ09ORklHX0JMS19DR1JPVVA9eVxuIENPTkZJR19CTEtfREVWX0xPT1A9eVxuIENPTkZJR19CT09UUEFSQU1fSEFSRExPQ0tVUF9QQU5JQz15XG4gQ09ORklHX0JPT1RQQVJBTV9TT0ZUTE9DS1VQX1BBTklDPTFcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9jZ3JvdXBfaXRlcl9pby5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvY2dyb3VwX2l0ZXJfaW8uY1xubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAuLjVkMjdlNWQyODM3OTVcbi0tLSAvZGV2L251bGxcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2Nncm91cF9pdGVyX2lvLmNcbkBAIC0wLDAgKzEsMjc3IEBAXG4rLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcbisvKiBDb3B5cmlnaHQgKGMpIDIwMjUgTWV0YSBQbGF0Zm9ybXMsIEluYy4gYW5kIGFmZmlsaWF0ZXMuICovXG4rI2RlZmluZSBfR05VX1NPVVJDRVxuKyNpbmNsdWRlIFx1MDAzY3Rlc3RfcHJvZ3MuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2JwZi9saWJicGYuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2ZjbnRsLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9sb29wLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NzdGRsaWIuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3N0cmluZy5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3lzL2lvY3RsLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NzeXMvc3RhdC5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3lzL3N5c21hY3Jvcy5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjdW5pc3RkLmhcdTAwM2VcbisjaW5jbHVkZSBcImNncm91cF9oZWxwZXJzLmhcIlxuKyNpbmNsdWRlIFwiY2dyb3VwX2l0ZXJfaW8uaFwiXG4rI2luY2x1ZGUgXCJjZ3JvdXBfaXRlcl9pby5za2VsLmhcIlxuK1xuKyNkZWZpbmUgSU9fU0laRSAoNCAqIDEwMjQgKiAxMDI0KVxuK1xuK3N0YXRpYyBpbnQgcmVhZF9zdGF0cyhzdHJ1Y3QgYnBmX2xpbmsgKmxpbmspXG4re1xuK1x0aW50IGZkLCByZXQgPSAwO1xuK1x0c3NpemVfdCBieXRlcztcbitcbitcdGZkID0gYnBmX2l0ZXJfY3JlYXRlKGJwZl9saW5rX19mZChsaW5rKSk7XG4rXHRpZiAoIUFTU0VSVF9PS19GRChmZCwgXCJicGZfaXRlcl9jcmVhdGVcIikpXG4rXHRcdHJldHVybiAxO1xuK1xuK1x0LyogUmVzdWx0cyBsYW5kIGluIHNrZWwtXHUwMDNlZGF0YV9xdWVyeTsgdGhlIHJlYWQgaXRzZWxmIHJldHVybnMgbm8gZGF0YS4gKi9cbitcdGJ5dGVzID0gcmVhZChmZCwgTlVMTCwgMCk7XG4rXHRpZiAoIUFTU0VSVF9FUShieXRlcywgMCwgXCJyZWFkIGZkXCIpKVxuK1x0XHRyZXQgPSAxO1xuK1xuK1x0Y2xvc2UoZmQpO1xuK1x0cmV0dXJuIHJldDtcbit9XG4rXG4rLyogU2V0IHVwIGEgbG9vcCBkZXZpY2UgZm9yIGNncm91cC1jaGFyZ2VkIEkvTy4gKi9cbitzdGF0aWMgaW50IGxvb3Bfc2V0dXAoY2hhciAqbG9vcF9wYXRoLCBzaXplX3Qgc3osIGludCAqY3RsX2ZkLCBpbnQgKmxvb3BfZmQsXG4rXHRcdCAgICAgIGludCAqYmFja19mZClcbit7XG4rXHRjaGFyIGJhY2tfcGF0aFtdID0gXCIvdG1wL2Nncm91cF9pdGVyX2lvLlhYWFhYWFwiO1xuK1x0aW50IG5yO1xuK1xuK1x0KmN0bF9mZCA9ICpsb29wX2ZkID0gKmJhY2tfZmQgPSAtMTtcbitcbitcdCpjdGxfZmQgPSBvcGVuKFwiL2Rldi9sb29wLWNvbnRyb2xcIiwgT19SRFdSIHwgT19DTE9FWEVDKTtcbitcdGlmICgqY3RsX2ZkIFx1MDAzYyAwKVxuK1x0XHRyZXR1cm4gLTE7XG4rXG4rXHRuciA9IGlvY3RsKCpjdGxfZmQsIExPT1BfQ1RMX0dFVF9GUkVFKTtcbitcdGlmIChuciBcdTAwM2MgMClcbitcdFx0Z290byBlcnI7XG4rXHRzbnByaW50Zihsb29wX3BhdGgsIHN6LCBcIi9kZXYvbG9vcCVkXCIsIG5yKTtcbitcbitcdCpiYWNrX2ZkID0gbWtzdGVtcChiYWNrX3BhdGgpO1xuK1x0aWYgKCpiYWNrX2ZkIFx1MDAzYyAwKVxuK1x0XHRnb3RvIGVycjtcbitcdHVubGluayhiYWNrX3BhdGgpO1xuK1x0aWYgKGZ0cnVuY2F0ZSgqYmFja19mZCwgKG9mZl90KUlPX1NJWkUgKiA0KSlcbitcdFx0Z290byBlcnI7XG4rXG4rXHQqbG9vcF9mZCA9IG9wZW4obG9vcF9wYXRoLCBPX1JEV1IgfCBPX0NMT0VYRUMpO1xuK1x0aWYgKCpsb29wX2ZkIFx1MDAzYyAwKVxuK1x0XHRnb3RvIGVycjtcbitcdGlmIChpb2N0bCgqbG9vcF9mZCwgTE9PUF9TRVRfRkQsICpiYWNrX2ZkKSlcbitcdFx0Z290byBlcnI7XG4rXG4rXHRyZXR1cm4gMDtcbitlcnI6XG4rXHRpZiAoKmxvb3BfZmQgXHUwMDNlPSAwKVxuK1x0XHRjbG9zZSgqbG9vcF9mZCk7XG4rXHRpZiAoKmJhY2tfZmQgXHUwMDNlPSAwKVxuK1x0XHRjbG9zZSgqYmFja19mZCk7XG4rXHRjbG9zZSgqY3RsX2ZkKTtcbitcdCpjdGxfZmQgPSAqbG9vcF9mZCA9ICpiYWNrX2ZkID0gLTE7XG4rXHRyZXR1cm4gLTE7XG4rfVxuK1xuK3N0YXRpYyB2b2lkIGxvb3BfdGVhcmRvd24oY29uc3QgY2hhciAqbG9vcF9wYXRoLCBpbnQgY3RsX2ZkLCBpbnQgbG9vcF9mZCxcbitcdFx0XHQgIGludCBiYWNrX2ZkKVxuK3tcbitcdGludCBuciA9IC0xO1xuK1xuK1x0aWYgKGxvb3BfZmQgXHUwMDNlPSAwKSB7XG4rXHRcdGlvY3RsKGxvb3BfZmQsIExPT1BfQ0xSX0ZELCAwKTtcbitcdFx0Y2xvc2UobG9vcF9mZCk7XG4rXHR9XG4rXHRpZiAoYmFja19mZCBcdTAwM2U9IDApXG4rXHRcdGNsb3NlKGJhY2tfZmQpO1xuK1x0aWYgKGN0bF9mZCBcdTAwM2U9IDApIHtcbitcdFx0aWYgKHNzY2FuZihsb29wX3BhdGgsIFwiL2Rldi9sb29wJWRcIiwgXHUwMDI2bnIpID09IDEgXHUwMDI2XHUwMDI2IG5yIFx1MDAzZT0gMClcbitcdFx0XHRpb2N0bChjdGxfZmQsIExPT1BfQ1RMX1JFTU9WRSwgbnIpO1xuK1x0XHRjbG9zZShjdGxfZmQpO1xuK1x0fVxuK31cbitcbisvKiBPX0RJUkVDVCBrZWVwcyBJL08gY2hhcmdlZCB0byB0aGUgY3VycmVudCBjZ3JvdXAuICovXG4rc3RhdGljIGludCBkb19kaXJlY3RfaW8oY29uc3QgY2hhciAqbG9vcF9wYXRoKVxuK3tcbitcdHZvaWQgKmJ1ZjtcbitcdGludCBmZCwgcmV0ID0gLTE7XG4rXG4rXHRmZCA9IG9wZW4obG9vcF9wYXRoLCBPX1JEV1IgfCBPX0RJUkVDVCB8IE9fQ0xPRVhFQyk7XG4rXHRpZiAoZmQgXHUwMDNjIDApXG4rXHRcdHJldHVybiAtMTtcbitcdGlmIChwb3NpeF9tZW1hbGlnbihcdTAwMjZidWYsIDQwOTYsIElPX1NJWkUpKVxuK1x0XHRnb3RvIG91dF9mZDtcbitcdG1lbXNldChidWYsIDB4YWIsIElPX1NJWkUpO1xuK1xuK1x0aWYgKHB3cml0ZShmZCwgYnVmLCBJT19TSVpFLCAwKSAhPSBJT19TSVpFKVxuK1x0XHRnb3RvIG91dF9idWY7XG4rXHRmc3luYyhmZCk7XG4rXHRpZiAocHJlYWQoZmQsIGJ1ZiwgSU9fU0laRSwgMCkgIT0gSU9fU0laRSlcbitcdFx0Z290byBvdXRfYnVmO1xuK1x0cmV0ID0gMDtcbitvdXRfYnVmOlxuK1x0ZnJlZShidWYpO1xuK291dF9mZDpcbitcdGNsb3NlKGZkKTtcbitcdHJldHVybiByZXQ7XG4rfVxuK1xuKy8qIFJlYWQgQGRldidzIGlvLnN0YXQgY291bnRlcnMuIEBkZXYgdXNlcyBrZXJuZWwgZGV2X3QgZW5jb2RpbmcuICovXG4rc3RhdGljIGludCBwYXJzZV9pb19zdGF0KGludCBjZ3JvdXBfZmQsIF9fdTY0IGRldiwgc3RydWN0IGlvX3F1ZXJ5ICpvdXQpXG4re1xuK1x0dW5zaWduZWQgaW50IHdhbnRfbWFqID0gZGV2IFx1MDAzZVx1MDAzZSAyMCwgd2FudF9taW4gPSBkZXYgXHUwMDI2ICgoMVUgXHUwMDNjXHUwMDNjIDIwKSAtIDEpO1xuK1x0Y2hhciBidWZbNDA5Nl0sICpsaW5lLCAqc2F2ZXB0cjtcbitcdGludCBmZCwgbiwgcmV0ID0gLTE7XG4rXG4rXHRmZCA9IG9wZW5hdChjZ3JvdXBfZmQsIFwiaW8uc3RhdFwiLCBPX1JET05MWSk7XG4rXHRpZiAoZmQgXHUwMDNjIDApXG4rXHRcdHJldHVybiAtMTtcbitcdG4gPSByZWFkKGZkLCBidWYsIHNpemVvZihidWYpIC0gMSk7XG4rXHRjbG9zZShmZCk7XG4rXHRpZiAobiBcdTAwM2M9IDApXG4rXHRcdHJldHVybiAtMTtcbitcdGJ1ZltuXSA9ICdcXDAnO1xuK1xuK1x0Zm9yIChsaW5lID0gc3RydG9rX3IoYnVmLCBcIlxcblwiLCBcdTAwMjZzYXZlcHRyKTsgbGluZTtcbitcdCAgICAgbGluZSA9IHN0cnRva19yKE5VTEwsIFwiXFxuXCIsIFx1MDAyNnNhdmVwdHIpKSB7XG4rXHRcdHVuc2lnbmVkIGxvbmcgbG9uZyByYiA9IDAsIHdiID0gMCwgcmkgPSAwLCB3aSA9IDAsIGRiID0gMCwgZGkgPSAwO1xuK1x0XHR1bnNpZ25lZCBpbnQgbWFqLCBtaW47XG4rXG4rXHRcdC8qIE9ubHkgdGhlIGRldmljZSBpZCBpcyByZXF1aXJlZDsgbWlzc2luZyBjb3VudGVycyBzdGF5IHplcm8uICovXG4rXHRcdGlmIChzc2NhbmYobGluZSxcbitcdFx0XHQgICBcIiV1OiV1IHJieXRlcz0lbGx1IHdieXRlcz0lbGx1IHJpb3M9JWxsdSB3aW9zPSVsbHUgZGJ5dGVzPSVsbHUgZGlvcz0lbGx1XCIsXG4rXHRcdFx0ICAgXHUwMDI2bWFqLCBcdTAwMjZtaW4sIFx1MDAyNnJiLCBcdTAwMjZ3YiwgXHUwMDI2cmksIFx1MDAyNndpLCBcdTAwMjZkYiwgXHUwMDI2ZGkpIFx1MDAzYyAyKVxuK1x0XHRcdGNvbnRpbnVlO1xuK1x0XHRpZiAobWFqICE9IHdhbnRfbWFqIHx8IG1pbiAhPSB3YW50X21pbilcbitcdFx0XHRjb250aW51ZTtcbitcbitcdFx0b3V0LVx1MDAzZXJieXRlcyA9IHJiO1xuK1x0XHRvdXQtXHUwMDNld2J5dGVzID0gd2I7XG4rXHRcdG91dC1cdTAwM2VyaW9zID0gcmk7XG4rXHRcdG91dC1cdTAwM2V3aW9zID0gd2k7XG4rXHRcdG91dC1cdTAwM2VkYnl0ZXMgPSBkYjtcbitcdFx0b3V0LVx1MDAzZWRpb3MgPSBkaTtcbitcdFx0cmV0ID0gMDtcbitcdFx0YnJlYWs7XG4rXHR9XG4rXHRyZXR1cm4gcmV0O1xuK31cbitcbit2b2lkIHRlc3RfY2dyb3VwX2l0ZXJfaW8odm9pZClcbit7XG4rXHRjaGFyICpjZ3JvdXBfcmVsX3BhdGggPSBcIi9jZ3JvdXBfaXRlcl9pb190ZXN0XCI7XG4rXHRpbnQgY3RsX2ZkID0gLTEsIGxvb3BfZmQgPSAtMSwgYmFja19mZCA9IC0xO1xuK1x0c3RydWN0IGNncm91cF9pdGVyX2lvICpza2VsID0gTlVMTDtcbitcdHN0cnVjdCBicGZfbGluayAqbGluayA9IE5VTEw7XG4rXHRjaGFyIGxvb3BfcGF0aFs2NF07XG4rXHRzdHJ1Y3QgaW9fcXVlcnkgKnE7XG4rXHRpbnQgY2dyb3VwX2ZkO1xuK1xuK1x0Y2dyb3VwX2ZkID0gY2dyb3VwX3NldHVwX2FuZF9qb2luKGNncm91cF9yZWxfcGF0aCk7XG4rXHRpZiAoIUFTU0VSVF9PS19GRChjZ3JvdXBfZmQsIFwiY2dyb3VwX3NldHVwX2FuZF9qb2luXCIpKVxuK1x0XHRyZXR1cm47XG4rXG4rXHRpZiAobG9vcF9zZXR1cChsb29wX3BhdGgsIHNpemVvZihsb29wX3BhdGgpLCBcdTAwMjZjdGxfZmQsIFx1MDAyNmxvb3BfZmQsIFx1MDAyNmJhY2tfZmQpKSB7XG4rXHRcdHRlc3RfX3NraXAoKTtcdC8qIG5lZWRzIHJvb3QgKyBDT05GSUdfQkxLX0RFVl9MT09QICovXG4rXHRcdGdvdG8gY2xlYW51cF9jZ3JvdXBfZmQ7XG4rXHR9XG4rXG4rXHRza2VsID0gY2dyb3VwX2l0ZXJfaW9fX29wZW5fYW5kX2xvYWQoKTtcbitcdGlmICghQVNTRVJUX09LX1BUUihza2VsLCBcImNncm91cF9pdGVyX2lvX19vcGVuX2FuZF9sb2FkXCIpKVxuK1x0XHRnb3RvIGNsZWFudXBfbG9vcDtcbitcbitcdC8qIENvbnZlcnQgZ2xpYmMgc3RfcmRldiB0byBrZXJuZWwgZGV2X3QgZm9ybWF0LiAqL1xuK1x0e1xuK1x0XHRzdHJ1Y3Qgc3RhdCBsc3Q7XG4rXG4rXHRcdGlmICghQVNTRVJUX09LKGZzdGF0KGxvb3BfZmQsIFx1MDAyNmxzdCksIFwiZnN0YXQgbG9vcFwiKSlcbitcdFx0XHRnb3RvIGNsZWFudXBfc2tlbDtcbitcdFx0c2tlbC1cdTAwM2VkYXRhX3F1ZXJ5LVx1MDAzZXRhcmdldF9kZXYgPVxuK1x0XHRcdCgoX191NjQpbWFqb3IobHN0LnN0X3JkZXYpIFx1MDAzY1x1MDAzYyAyMCkgfCBtaW5vcihsc3Quc3RfcmRldik7XG4rXHR9XG4rXG4rXHRERUNMQVJFX0xJQkJQRl9PUFRTKGJwZl9pdGVyX2F0dGFjaF9vcHRzLCBvcHRzKTtcbitcdHVuaW9uIGJwZl9pdGVyX2xpbmtfaW5mbyBsaW5mbyA9IHtcbitcdFx0LmNncm91cC5jZ3JvdXBfZmQgPSBjZ3JvdXBfZmQsXG4rXHRcdC5jZ3JvdXAub3JkZXIgPSBCUEZfQ0dST1VQX0lURVJfU0VMRl9PTkxZLFxuK1x0fTtcbitcdG9wdHMubGlua19pbmZvID0gXHUwMDI2bGluZm87XG4rXHRvcHRzLmxpbmtfaW5mb19sZW4gPSBzaXplb2YobGluZm8pO1xuK1xuK1x0bGluayA9IGJwZl9wcm9ncmFtX19hdHRhY2hfaXRlcihza2VsLVx1MDAzZXByb2dzLmNncm91cF9pb19xdWVyeSwgXHUwMDI2b3B0cyk7XG4rXHRpZiAoIUFTU0VSVF9PS19QVFIobGluaywgXCJicGZfcHJvZ3JhbV9fYXR0YWNoX2l0ZXJcIikpXG4rXHRcdGdvdG8gY2xlYW51cF9za2VsO1xuK1xuK1x0LyogVGhpcyBwcm9jZXNzIGlzIGluIHRoZSB0ZXN0IGNncm91cCwgc28gdGhlIGxvb3AgSS9PIGlzIGNoYXJnZWQgaGVyZS4gKi9cbitcdGlmICghQVNTRVJUX09LKGRvX2RpcmVjdF9pbyhsb29wX3BhdGgpLCBcImRvX2RpcmVjdF9pb1wiKSlcbitcdFx0Z290byBjbGVhbnVwX2xpbms7XG4rXG4rXHRpZiAoIUFTU0VSVF9PSyhyZWFkX3N0YXRzKGxpbmspLCBcInJlYWQgc3RhdHNcIikpXG4rXHRcdGdvdG8gY2xlYW51cF9saW5rO1xuK1xuK1x0cSA9IFx1MDAyNnNrZWwtXHUwMDNlZGF0YV9xdWVyeS1cdTAwM2Vpb19xdWVyeTtcbitcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwiY2dyb3VwX2l0ZXJfaW9fX3dyaXRlXCIpKSB7XG4rXHRcdEFTU0VSVF9HVChxLVx1MDAzZXdieXRlcywgMCwgXCJ3Ynl0ZXNcIik7XG4rXHRcdEFTU0VSVF9HVChxLVx1MDAzZXdpb3MsIDAsIFwid2lvc1wiKTtcbitcdH1cbitcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwiY2dyb3VwX2l0ZXJfaW9fX3JlYWRcIikpIHtcbitcdFx0QVNTRVJUX0dUKHEtXHUwMDNlcmJ5dGVzLCAwLCBcInJieXRlc1wiKTtcbitcdFx0QVNTRVJUX0dUKHEtXHUwMDNlcmlvcywgMCwgXCJyaW9zXCIpO1xuK1x0fVxuK1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCJjZ3JvdXBfaXRlcl9pb19fZGV2XCIpKVxuK1x0XHRBU1NFUlRfR1QocS1cdTAwM2VkZXYsIDAsIFwiZGV2XCIpO1xuK1xuK1x0LyogQ29tcGFyZSB3aXRoIGlvLnN0YXQgd2l0aG91dCBJL08gYmV0d2VlbiB0aGUgcmVhZHMuICovXG4rXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcImNncm91cF9pdGVyX2lvX19tYXRjaFwiKSkge1xuK1x0XHRzdHJ1Y3QgaW9fcXVlcnkgZmlsZXYgPSB7fTtcbitcbitcdFx0aWYgKEFTU0VSVF9PSyhyZWFkX3N0YXRzKGxpbmspLCBcInJlYWQgc3RhdHNcIikgXHUwMDI2XHUwMDI2XG4rXHRcdCAgICBBU1NFUlRfT0socGFyc2VfaW9fc3RhdChjZ3JvdXBfZmQsIHEtXHUwMDNlZGV2LCBcdTAwMjZmaWxldiksXG4rXHRcdFx0ICAgICAgXCJwYXJzZSBpby5zdGF0XCIpKSB7XG4rXHRcdFx0QVNTRVJUX0VRKHEtXHUwMDNlcmJ5dGVzLCBmaWxldi5yYnl0ZXMsIFwicmJ5dGVzXCIpO1xuK1x0XHRcdEFTU0VSVF9FUShxLVx1MDAzZXdieXRlcywgZmlsZXYud2J5dGVzLCBcIndieXRlc1wiKTtcbitcdFx0XHRBU1NFUlRfRVEocS1cdTAwM2VyaW9zLCBmaWxldi5yaW9zLCBcInJpb3NcIik7XG4rXHRcdFx0QVNTRVJUX0VRKHEtXHUwMDNld2lvcywgZmlsZXYud2lvcywgXCJ3aW9zXCIpO1xuK1x0XHRcdEFTU0VSVF9FUShxLVx1MDAzZWRieXRlcywgZmlsZXYuZGJ5dGVzLCBcImRieXRlc1wiKTtcbitcdFx0XHRBU1NFUlRfRVEocS1cdTAwM2VkaW9zLCBmaWxldi5kaW9zLCBcImRpb3NcIik7XG4rXHRcdH1cbitcdH1cbitcbitcdC8qIFJvb3Qgc3RhdGlzdGljcyBpbmNsdWRlIHRoaXMgY2dyb3VwJ3MgSS9PLiAqL1xuK1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCJjZ3JvdXBfaXRlcl9pb19fcm9vdFwiKSkge1xuK1x0XHRzdHJ1Y3QgYnBmX2xpbmsgKnJvb3RfbGluaztcbitcdFx0c3RydWN0IGlvX3F1ZXJ5ICpyO1xuK1xuK1x0XHRza2VsLVx1MDAzZWRhdGFfcXVlcnktXHUwMDNlZ290X3Jvb3RfY3NzID0gMDtcbitcdFx0cm9vdF9saW5rID0gYnBmX3Byb2dyYW1fX2F0dGFjaF9pdGVyKHNrZWwtXHUwMDNlcHJvZ3MuY2dyb3VwX3Jvb3RfaW9fcXVlcnksXG4rXHRcdFx0XHRcdFx0ICAgICBcdTAwMjZvcHRzKTtcbitcdFx0aWYgKEFTU0VSVF9PS19QVFIocm9vdF9saW5rLCBcImF0dGFjaCByb290IGl0ZXJcIikpIHtcbitcdFx0XHRpZiAoQVNTRVJUX09LKHJlYWRfc3RhdHMocm9vdF9saW5rKSwgXCJyZWFkIHJvb3Qgc3RhdHNcIikpIHtcbitcdFx0XHRcdHIgPSBcdTAwMjZza2VsLVx1MDAzZWRhdGFfcXVlcnktXHUwMDNlcm9vdF9xdWVyeTtcbitcdFx0XHRcdEFTU0VSVF9FUShza2VsLVx1MDAzZWRhdGFfcXVlcnktXHUwMDNlZ290X3Jvb3RfY3NzLCAxLFxuK1x0XHRcdFx0XHQgIFwiZ290X3Jvb3RfY3NzXCIpO1xuK1x0XHRcdFx0QVNTRVJUX0VRKHItXHUwMDNlZGV2LCBxLVx1MDAzZWRldiwgXCJyb290IGRldlwiKTtcbitcdFx0XHRcdEFTU0VSVF9HRShyLVx1MDAzZXdieXRlcywgcS1cdTAwM2V3Ynl0ZXMsIFwicm9vdCB3Ynl0ZXNcIik7XG4rXHRcdFx0XHRBU1NFUlRfR0Uoci1cdTAwM2V3aW9zLCBxLVx1MDAzZXdpb3MsIFwicm9vdCB3aW9zXCIpO1xuK1x0XHRcdFx0QVNTRVJUX0dFKHItXHUwMDNlcmJ5dGVzLCBxLVx1MDAzZXJieXRlcywgXCJyb290IHJieXRlc1wiKTtcbitcdFx0XHRcdEFTU0VSVF9HRShyLVx1MDAzZXJpb3MsIHEtXHUwMDNlcmlvcywgXCJyb290IHJpb3NcIik7XG4rXHRcdFx0fVxuK1x0XHRcdGJwZl9saW5rX19kZXN0cm95KHJvb3RfbGluayk7XG4rXHRcdH1cbitcdH1cbitcbitjbGVhbnVwX2xpbms6XG4rXHRicGZfbGlua19fZGVzdHJveShsaW5rKTtcbitjbGVhbnVwX3NrZWw6XG4rXHRjZ3JvdXBfaXRlcl9pb19fZGVzdHJveShza2VsKTtcbitjbGVhbnVwX2xvb3A6XG4rXHRsb29wX3RlYXJkb3duKGxvb3BfcGF0aCwgY3RsX2ZkLCBsb29wX2ZkLCBiYWNrX2ZkKTtcbitjbGVhbnVwX2Nncm91cF9mZDpcbitcdGNsb3NlKGNncm91cF9mZCk7XG4rXHRjbGVhbnVwX2Nncm91cF9lbnZpcm9ubWVudCgpO1xuK31cbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvY2dyb3VwX2l0ZXJfaW8uYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9jZ3JvdXBfaXRlcl9pby5jXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uMmNkNTM4MDY4OTg3YVxuLS0tIC9kZXYvbnVsbFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL2Nncm91cF9pdGVyX2lvLmNcbkBAIC0wLDAgKzEsOTkgQEBcbisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxuKy8qIENvcHlyaWdodCAoYykgMjAyNSBNZXRhIFBsYXRmb3JtcywgSW5jLiBhbmQgYWZmaWxpYXRlcy4gKi9cbisjaW5jbHVkZSBcdTAwM2N2bWxpbnV4LmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NicGYvYnBmX2hlbHBlcnMuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2JwZi9icGZfY29yZV9yZWFkLmhcdTAwM2VcbisjaW5jbHVkZSBcImJwZl9leHBlcmltZW50YWwuaFwiXG4rI2luY2x1ZGUgXCJjZ3JvdXBfaXRlcl9pby5oXCJcbitcbitjaGFyIF9saWNlbnNlW10gU0VDKFwibGljZW5zZVwiKSA9IFwiR1BMXCI7XG4rXG4rc3RydWN0IGlvX3F1ZXJ5IGlvX3F1ZXJ5IFNFQyhcIi5kYXRhLnF1ZXJ5XCIpO1xuK1xuK3N0cnVjdCBpb19xdWVyeSByb290X3F1ZXJ5IFNFQyhcIi5kYXRhLnF1ZXJ5XCIpO1xuK1xuK19fdTY0IGdvdF9yb290X2NzcyBTRUMoXCIuZGF0YS5xdWVyeVwiKTtcbitcbisvKiBEZXZpY2Ugc2VsZWN0ZWQgYnkgdXNlcnNwYWNlIGluIGtlcm5lbCBkZXZfdCBmb3JtYXQuICovXG4rX191NjQgdGFyZ2V0X2RldiBTRUMoXCIuZGF0YS5xdWVyeVwiKTtcbitcbisvKiBLZWVwIGlubGluZTogUkNVIGFuZCBvcGVuLWNvZGVkIGl0ZXJhdG9ycyBjYW5ub3QgY3Jvc3MgYSBCUEYgY2FsbC4gKi9cbitzdGF0aWMgX19hbHdheXNfaW5saW5lIGludCByZWFkX3RhcmdldF9kZXYoc3RydWN0IGNncm91cCAqY2dycCxcbitcdFx0XHRcdFx0ICAgc3RydWN0IGlvX3F1ZXJ5ICpvdXQpXG4re1xuK1x0c3RydWN0IGNncm91cF9zdWJzeXNfc3RhdGUgKmNzcztcbitcdHN0cnVjdCBibGtjZ19ncSAqcG9zO1xuK1x0X191NjQgZGV2O1xuK1x0aW50IHNzaWQ7XG4rXG4rXHQvKiBUaGUgZmx1c2ggY2FuIHNsZWVwLCBzbyBydW4gaXQgYmVmb3JlIHRoZSBSQ1Ugc2VjdGlvbi4gKi9cbitcdGJwZl9ibGtjZ19mbHVzaF9zdGF0cyhjZ3JwKTtcbitcbitcdGJwZl9yY3VfcmVhZF9sb2NrKCk7XG4rXHRzc2lkID0gYnBmX2NvcmVfZW51bV92YWx1ZShlbnVtIGNncm91cF9zdWJzeXNfaWQsIGlvX2NncnBfaWQpO1xuK1xuK1x0LypcbitcdCAqIHN1YnN5c1tdIGlzIF9fcmN1LCBzbyB0aGlzIHJlYWQgZ2l2ZXMgYW4gUkNVIHBvaW50ZXIgdGhlIGl0ZXJhdG9yXG4rXHQgKiBhY2NlcHRzLiBCUEZfQ09SRV9SRUFEKCkgd291bGQgcmV0dXJuIGEgcGxhaW4gdmFsdWUgaW5zdGVhZC5cbitcdCAqL1xuK1x0Y3NzID0gY2dycC1cdTAwM2VzdWJzeXNbc3NpZF07XG4rXHRpZiAoIWNzcykge1xuK1x0XHRicGZfcmN1X3JlYWRfdW5sb2NrKCk7XG4rXHRcdHJldHVybiAwO1xuK1x0fVxuK1xuK1x0YnBmX2Zvcl9lYWNoKGJsa2csIHBvcywgY3NzKSB7XG4rXHRcdGRldiA9IEJQRl9DT1JFX1JFQUQocG9zLCBxLCBkaXNrLCBwYXJ0MCwgYmRfZGV2KTtcbitcdFx0aWYgKGRldiAhPSB0YXJnZXRfZGV2KVxuK1x0XHRcdGNvbnRpbnVlO1xuK1xuK1x0XHRvdXQtXHUwMDNlZGV2ID0gZGV2O1xuK1x0XHRvdXQtXHUwMDNlcmJ5dGVzID0gQlBGX0NPUkVfUkVBRChwb3MsIGlvc3RhdC5jdXIuYnl0ZXNbQkxLR19JT1NUQVRfUkVBRF0pO1xuK1x0XHRvdXQtXHUwMDNld2J5dGVzID0gQlBGX0NPUkVfUkVBRChwb3MsIGlvc3RhdC5jdXIuYnl0ZXNbQkxLR19JT1NUQVRfV1JJVEVdKTtcbitcdFx0b3V0LVx1MDAzZXJpb3MgPSBCUEZfQ09SRV9SRUFEKHBvcywgaW9zdGF0LmN1ci5pb3NbQkxLR19JT1NUQVRfUkVBRF0pO1xuK1x0XHRvdXQtXHUwMDNld2lvcyA9IEJQRl9DT1JFX1JFQUQocG9zLCBpb3N0YXQuY3VyLmlvc1tCTEtHX0lPU1RBVF9XUklURV0pO1xuK1x0XHRvdXQtXHUwMDNlZGJ5dGVzID0gQlBGX0NPUkVfUkVBRChwb3MsIGlvc3RhdC5jdXIuYnl0ZXNbQkxLR19JT1NUQVRfRElTQ0FSRF0pO1xuK1x0XHRvdXQtXHUwMDNlZGlvcyA9IEJQRl9DT1JFX1JFQUQocG9zLCBpb3N0YXQuY3VyLmlvc1tCTEtHX0lPU1RBVF9ESVNDQVJEXSk7XG4rXHRcdGJyZWFrO1xuK1x0fVxuK1x0YnBmX3JjdV9yZWFkX3VubG9jaygpO1xuK1x0cmV0dXJuIDE7XG4rfVxuK1xuK1NFQyhcIml0ZXIucy9jZ3JvdXBcIilcbitpbnQgY2dyb3VwX2lvX3F1ZXJ5KHN0cnVjdCBicGZfaXRlcl9fY2dyb3VwICpjdHgpXG4re1xuK1x0c3RydWN0IGNncm91cCAqY2dycCA9IGN0eC1cdTAwM2VjZ3JvdXA7XG4rXG4rXHRpZiAoIWNncnApXG4rXHRcdHJldHVybiAxO1xuK1xuK1x0LyogU3RhcnQgZnJlc2ggc28gYSBkZXZpY2UgdGhhdCBpcyBub3QgZm91bmQgc3RheXMgYWxsLXplcm8uICovXG4rXHRfX2J1aWx0aW5fbWVtc2V0KFx1MDAyNmlvX3F1ZXJ5LCAwLCBzaXplb2YoaW9fcXVlcnkpKTtcbitcbitcdHJlYWRfdGFyZ2V0X2RldihjZ3JwLCBcdTAwMjZpb19xdWVyeSk7XG4rXHRyZXR1cm4gMDtcbit9XG4rXG4rU0VDKFwiaXRlci5zL2Nncm91cFwiKVxuK2ludCBjZ3JvdXBfcm9vdF9pb19xdWVyeShzdHJ1Y3QgYnBmX2l0ZXJfX2Nncm91cCAqY3R4KVxuK3tcbitcdHN0cnVjdCBjZ3JvdXAgKnJvb3Q7XG4rXG4rXHRpZiAoIWN0eC1cdTAwM2VjZ3JvdXApXG4rXHRcdHJldHVybiAxO1xuK1xuK1x0X19idWlsdGluX21lbXNldChcdTAwMjZyb290X3F1ZXJ5LCAwLCBzaXplb2Yocm9vdF9xdWVyeSkpO1xuK1xuK1x0LyogVGhlIHJvb3QgY2dyb3VwIGFsd2F5cyBoYXMgaWQgMS4gKi9cbitcdHJvb3QgPSBicGZfY2dyb3VwX2Zyb21faWQoMSk7XG4rXHRpZiAoIXJvb3QpXG4rXHRcdHJldHVybiAwO1xuK1xuK1x0LyogUm9vdCBjb3VudGVycyBpbmNsdWRlIGFsbCBjZ3JvdXBzJyBJL08uICovXG4rXHRpZiAocmVhZF90YXJnZXRfZGV2KHJvb3QsIFx1MDAyNnJvb3RfcXVlcnkpKVxuK1x0XHRnb3Rfcm9vdF9jc3MgPSAxO1xuK1xuK1x0YnBmX2Nncm91cF9yZWxlYXNlKHJvb3QpO1xuK1x0cmV0dXJuIDA7XG4rfVxuIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTdUMjI6MzQ6MzUuNzY5NzAyODI2WiIsIlNlcSI6MywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NjkwNTUxMjkzNywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipGdXp6aW5nIE5ldyBCUEYgS2Z1bmNzIGZvciBCbG9jayBDZ3JvdXAgSS9PIFN0YXRpc3RpY3MqKlxuXG5Pa2F5LCBzbyB0aGVyZSdzIGEgcGF0Y2ggaW50cm9kdWNpbmcgQlBGIGtmdW5jcyBmb3IgYmxvY2sgY2dyb3VwIEkvTyBzdGF0aXN0aWNzLiBNeSBpbml0aWFsIHRob3VnaHQgaXMsIFwiSXMgdGhpcyBmdXp6YWJsZT9cIiBUaGUgYW5zd2VyIGlzIGEgY2xlYXIgeWVzLCBiZWNhdXNlIHdlJ3JlIHRhbGtpbmcgYWJvdXQgKm5ldyogQlBGIGtmdW5jcyB0aGF0IGFyZSBub3cgYWNjZXNzaWJsZSBmcm9tIEJQRiBwcm9ncmFtcy4gVGhpcyBvcGVucyB1cCBhIG5ldyBhdHRhY2sgc3VyZmFjZSwgYW5kIHRoYXTigJlzIHByZWNpc2VseSB3aGF0IEknbSBpbnRlcmVzdGVkIGluIGZvciBmdXp6aW5nLlxuXG5UaGVzZSBuZXcga2Z1bmNzIGFyZTogYGJwZl9ibGtjZ19mbHVzaF9zdGF0c2AsIGBicGZfaXRlcl9ibGtnX25ld2AsIGBicGZfaXRlcl9ibGtnX25leHRgLCBhbmQgYGJwZl9pdGVyX2Jsa2dfZGVzdHJveWAuIExldCdzIHRha2UgYSBxdWljayBsb29rIGluc2lkZSBgYmxvY2svYnBmX2Jsa2NnLmNgIGp1c3QgdG8gbWFrZSBzdXJlIHdlIGhhdmVuJ3QgbWlzc2VkIGFueXRoaW5nIGVsc2UgaW4gdGhlcmUuIE5vcGUsIHRob3NlIGFyZSB0aGUgb25seSBmb3VyIGZ1bmN0aW9ucy4gSG9sZCBvbiwgYGJwZl9pdGVyX2Jsa2dfZGVzdHJveWAgaXMgKmVtcHR5Ki4gSXQncyBzdGlsbCB3b3J0aCBhZGRpbmcsIGJ1dCB0aGUgb3RoZXIgdGhyZWUgYXJlIGdvaW5nIHRvIGJlIG1vcmUgaW50ZXJlc3RpbmcgZm9yIGZ1enppbmcuXG5cbk15IG5leHQgc3RlcCBpcyB0byBuYWlsIGRvd24gdGhlIGNvbmZpZ3VyYXRpb24gcHJlcmVxdWlzaXRlcy4gV2UgbmVlZCBgQ09ORklHX0JQRl9TWVNDQUxMYCBhbmQgYENPTkZJR19CTEtfQ0dST1VQYCB0byBhY3R1YWxseSBoYXZlIGBicGZfYmxrY2cub2AgYnVpbHQuIE5vdywganVzdCB0byBtYWtlIHN1cmUsIGxldCBtZSBkb3VibGUtY2hlY2sgdGhlIGBLY29uZmlnYCBmb3IgYEJMS19DR1JPVVBgLiBBbHJpZ2h0LCBpdCBsb29rcyBsaWtlIGBCTEtfQ0dST1VQYCBkZXBlbmRzIG9uIGJvdGggYENHUk9VUFNgIGFuZCBgQkxPQ0tgLiBUaW1lIHRvIGZpcmUgdXAgYGdyZXBwZXJgIGFuZCBzZWUgd2hhdCBlbHNlIHdlIGNhbiB1bmNvdmVyIVxuXG5cbiIsIklucHV0VG9rZW5zIjo5Njc1LCJPdXRwdXRUb2tlbnMiOjIxLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NjA4LCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTdUMjI6MzQ6NDIuNjc1MjE5MjYzWiIsIlNlcSI6NCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE1MTQ3MzY1MDQsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiY29uZmlnIEJMS19DR1JPVVBcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiYmxvY2svS2NvbmZpZz0zOT1jb25maWcgQkxLX1JRX0FMTE9DX1RJTUVcXG4tLVxcbmJsb2NrL0tjb25maWctNDEtXFxuYmxvY2svS2NvbmZpZzo0Mjpjb25maWcgQkxLX0NHUk9VUF9SV1NUQVRcXG5ibG9jay9LY29uZmlnLTQzLVxcdGJvb2xcXG5ibG9jay9LY29uZmlnLTQ0LVxcbmJsb2NrL0tjb25maWc6NDU6Y29uZmlnIEJMS19DR1JPVVBfUFVOVF9CSU9cXG5ibG9jay9LY29uZmlnLTQ2LVxcdGJvb2xcXG4tLVxcbmJsb2NrL0tjb25maWc9MTI3PWNvbmZpZyBCTEtfV0JUX01RXFxuLS1cXG5ibG9jay9LY29uZmlnLTEzMy1cXG5ibG9jay9LY29uZmlnOjEzNDpjb25maWcgQkxLX0NHUk9VUF9JT0xBVEVOQ1lcXG5ibG9jay9LY29uZmlnLTEzNS1cXHRib29sIFxcXCJFbmFibGUgc3VwcG9ydCBmb3IgbGF0ZW5jeSBiYXNlZCBjZ3JvdXAgSU8gcHJvdGVjdGlvblxcXCJcXG4tLVxcbmJsb2NrL0tjb25maWctMTQ0LVxcbmJsb2NrL0tjb25maWc6MTQ1OmNvbmZpZyBCTEtfQ0dST1VQX0ZDX0FQUElEXFxuYmxvY2svS2NvbmZpZy0xNDYtXFx0Ym9vbCBcXFwiRW5hYmxlIHN1cHBvcnQgdG8gdHJhY2sgRkMgSS9PIFRyYWZmaWMgYWNyb3NzIGNncm91cCBhcHBsaWNhdGlvbnNcXFwiXFxuLS1cXG5ibG9jay9LY29uZmlnLTE1My1cXG5ibG9jay9LY29uZmlnOjE1NDpjb25maWcgQkxLX0NHUk9VUF9JT0NPU1RcXG5ibG9jay9LY29uZmlnLTE1NS1cXHRib29sIFxcXCJFbmFibGUgc3VwcG9ydCBmb3IgY29zdCBtb2RlbCBiYXNlZCBjZ3JvdXAgSU8gY29udHJvbGxlclxcXCJcXG4tLVxcbmJsb2NrL0tjb25maWctMTYzLVxcbmJsb2NrL0tjb25maWc6MTY0OmNvbmZpZyBCTEtfQ0dST1VQX0lPUFJJT1xcbmJsb2NrL0tjb25maWctMTY1LVxcdGJvb2wgXFxcIkNncm91cCBJL08gY29udHJvbGxlciBmb3IgYXNzaWduaW5nIGFuIEkvTyBwcmlvcml0eSBjbGFzc1xcXCJcXG4tLVxcbmluaXQvS2NvbmZpZz0xMDk5PWNvbmZpZyBNRU1DR19WMVxcbi0tXFxuaW5pdC9LY29uZmlnLTExMTUtXFxuaW5pdC9LY29uZmlnOjExMTY6Y29uZmlnIEJMS19DR1JPVVBcXG5pbml0L0tjb25maWctMTExNy1cXHRib29sIFxcXCJJTyBjb250cm9sbGVyXFxcIlxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xN1QyMjozNDo0NC4xODk5NjEwMTdaIiwiU2VxIjo1LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjozMzIyMjI3OTMwLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgYSBzdW1tYXJ5IG9mIG15IHRob3VnaHQgcHJvY2VzcywgYXMgcmVxdWVzdGVkOlxuXG4qKkNoZWNraW5nIEJMS19DR1JPVVAgQ29uZmlndXJhdGlvbioqXG5cbk9rYXksIHNvIEkgbmVlZCB0byBxdWlja2x5IGFzY2VydGFpbiB0aGUgc3RhdHVzIG9mIGBCTEtfQ0dST1VQYCB3aXRoaW4gdGhlIGtlcm5lbCBjb25maWd1cmF0aW9uLiBNeSBpbW1lZGlhdGUgaW5zdGluY3QgaXMgdG8gY2hlY2sgYGluaXQvS2NvbmZpZ2AuIFRoYXQncyB0aGUgbW9zdCBsb2dpY2FsIHBsYWNlIHRvIHN0YXJ0IGRpZ2dpbmcgZm9yIGRlZmluaXRpb25zIHJlbGF0ZWQgdG8gYmxvY2sgbGF5ZXIgY29udHJvbCBncm91cHMsIGVzcGVjaWFsbHkgc2luY2UgaXQncyBhIGNvcmUgY29uZmlndXJhdGlvbiBmaWxlLiBMZXQncyBzZWUgaWYgaXQncyBkZWZpbmVkIHRoZXJlLCBhbmQgaWYgc28sIHdoYXQgdGhlIGRlcGVuZGVuY2llcyBhbmQgZGVmYXVsdCB2YWx1ZSBhcmUuIFRoaXMgc2hvdWxkIGdpdmUgbWUgYSBnb29kIGluaXRpYWwgb3ZlcnZpZXcgb2YgaG93IGBCTEtfQ0dST1VQYCBpcyBoYW5kbGVkIHdpdGhpbiB0aGUgYnVpbGQgc3lzdGVtIGFuZCBpZiBpdCBpcyBlbmFibGVkIG9yIGRpc2FibGVkIGJ5IGRlZmF1bHQuIFVuZGVyc3RhbmRpbmcgdGhlIGNvbmZpZ3VyYXRpb24gaXMgY3JpdGljYWwgdG8gbW92aW5nIGZvcndhcmQuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjExMDg5LCJPdXRwdXRUb2tlbnMiOjMzLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTgsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTdUMjI6MzQ6NDcuNTEyMTkwNzk3WiIsIlNlcSI6NiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTAxNzEwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcImluaXQvS2NvbmZpZ1wiLFxuICBcIkZpcnN0TGluZVwiOiAxMTEwLFxuICBcIkxpbmVDb3VudFwiOiAyMFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIxMTEwOlxcdFxcdCAgUGxlYXNlIG5vdGUgdGhhdCBmZWF0dXJlIHNldCBvZiB0aGUgbGVnYWN5IG1lbW9yeSBjb250cm9sbGVyIGlzIGxpa2VseVxcbjExMTE6XFx0XFx0ICBnb2luZyB0byBzaHJpbmsgZHVlIHRvIGRlcHJlY2F0aW9uIHByb2Nlc3MuIE5ldyBkZXBsb3ltZW50cyB3aXRoIHYxXFxuMTExMjpcXHRcXHQgIGNvbnRyb2xsZXIgYXJlIGhpZ2hseSBkaXNjb3VyYWdlZC5cXG4xMTEzOlxcdFxcbjExMTQ6XFx0XFx0ICBTYXkgTiBpZiB1bnN1cmUuXFxuMTExNTpcXHRcXG4xMTE2OlxcdGNvbmZpZyBCTEtfQ0dST1VQXFxuMTExNzpcXHRcXHRib29sIFxcXCJJTyBjb250cm9sbGVyXFxcIlxcbjExMTg6XFx0XFx0ZGVwZW5kcyBvbiBCTE9DS1xcbjExMTk6XFx0XFx0ZGVmYXVsdCBuXFxuMTEyMDpcXHRcXHRoZWxwXFxuMTEyMTpcXHRcXHRHZW5lcmljIGJsb2NrIElPIGNvbnRyb2xsZXIgY2dyb3VwIGludGVyZmFjZS4gVGhpcyBpcyB0aGUgY29tbW9uXFxuMTEyMjpcXHRcXHRjZ3JvdXAgaW50ZXJmYWNlIHdoaWNoIHNob3VsZCBiZSB1c2VkIGJ5IHZhcmlvdXMgSU8gY29udHJvbGxpbmdcXG4xMTIzOlxcdFxcdHBvbGljaWVzLlxcbjExMjQ6XFx0XFxuMTEyNTpcXHRcXHRDdXJyZW50bHksIENGUSBJTyBzY2hlZHVsZXIgdXNlcyBpdCB0byByZWNvZ25pemUgdGFzayBncm91cHMgYW5kXFxuMTEyNjpcXHRcXHRjb250cm9sIGRpc2sgYmFuZHdpZHRoIGFsbG9jYXRpb24gKHByb3BvcnRpb25hbCB0aW1lIHNsaWNlIGFsbG9jYXRpb24pXFxuMTEyNzpcXHRcXHR0byBzdWNoIHRhc2sgZ3JvdXBzLiBJdCBpcyBhbHNvIHVzZWQgYnkgYmlvIHRocm90dGxpbmcgbG9naWMgaW5cXG4xMTI4OlxcdFxcdGJsb2NrIGxheWVyIHRvIGltcGxlbWVudCB1cHBlciBsaW1pdCBpbiBJTyByYXRlcyBvbiBhIGRldmljZS5cXG4xMTI5OlxcdFxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xN1QyMjozNDo0Ny41MTIyOTQzMjdaIiwiU2VxIjo3LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjozODg5NDIyMTIxLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBoZXJlJ3MgbXkgdGFrZSBvbiB0aG9zZSB0aG91Z2h0cywgZnJhbWVkIGFzIG15IG93bjpcblxuKipEZXBlbmRlbmNpZXMgYW5kIHRoZSBicGZfYmxrY2cuYyBDaGVjayoqXG5cbkFscmlnaHQsIGxldCdzIHNlZSwgaXQgbG9va3MgbGlrZSBgQkxLX0NHUk9VUGAgaXMgZnVuZGFtZW50YWxseSByZWxpYW50IG9uIGBCTE9DS2AuIFRoYXQgbWFrZXMgc2Vuc2U7IHdlJ3JlIHRhbGtpbmcgYWJvdXQgYmxvY2sgSS9PIGNvbnRyb2wgd2l0aGluIGNncm91cHMsIHNvIHRoZSBiYXNpYyBibG9jayBkZXZpY2UgaW5mcmFzdHJ1Y3R1cmUgbmVlZHMgdG8gYmUgdGhlcmUuIEFuZCwgSSByZWNhbGwgbm93LCBgQlBGX1NZU0NBTExgIGlzIGFsc28gZGVmaW5pdGVseSBnb2luZyB0byBiZSBpbiB0aGUgbWl4LiBDb25zaWRlcmluZyB0aGlzIGlzIEJQRi1yZWxhdGVkIGNvZGUsIHRoYXTigJlzIG5vdCBhIHN1cnByaXNlLiBJIG5lZWQgdG8gYmUgYWJsZSB0byB0cmFjZSBjZXJ0YWluIGNhbGxzIGluIHRoZSBrZXJuZWwuXG5cblJpZ2h0LCBzbyB0byBtYWtlIHN1cmUgSSB1bmRlcnN0YW5kIHRoZSBjb2RlIGNvcnJlY3RseSwgSSB0aGluayBJIHdpbGwgcmVyZWFkIGBicGZfYmxrY2cuY2AuIExldCdzIHNlZSB3aGF0J3MgYWN0dWFsbHkgZ29pbmcgb24uIEkgbmVlZCB0byBtYWtlIGNlcnRhaW4gSSBmdWxseSB1bmRlcnN0YW5kIGhvdyB0aGUgQlBGIHByb2dyYW1zIGhvb2sgaW50byB0aGUgYmxvY2sgSS9PIHBhdGguXG5cblxuIiwiSW5wdXRUb2tlbnMiOjExNTgyLCJPdXRwdXRUb2tlbnMiOjM2LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NDIsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0xN1QyMjozNDo1MS40MDE3MTkwNThaIiwiU2VxIjo4LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo4NDk2MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJibG9jay9icGZfYmxrY2cuY1wiLFxuICBcIkZpcnN0TGluZVwiOiAxLFxuICBcIkxpbmVDb3VudFwiOiAxMDBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiICAgMTpcXHQvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vci1sYXRlclxcbiAgIDI6XFx0LypcXG4gICAzOlxcdCAqIEJsb2NrIEkvTyBDb250cm9sbGVyLXJlbGF0ZWQgQlBGIGtmdW5jcyBhbmQgYXV4aWxpYXJ5IGNvZGVcXG4gICA0OlxcdCAqL1xcbiAgIDU6XFx0XFxuICAgNjpcXHQjaW5jbHVkZSBcXFwiYmxrLWNncm91cC5oXFxcIlxcbiAgIDc6XFx0XFxuICAgODpcXHQjaW5jbHVkZSBcXHUwMDNjbGludXgvYnBmLmhcXHUwMDNlXFxuICAgOTpcXHQjaW5jbHVkZSBcXHUwMDNjbGludXgvYnRmX2lkcy5oXFx1MDAzZVxcbiAgMTA6XFx0I2luY2x1ZGUgXFx1MDAzY2xpbnV4L3JjdWxpc3QuaFxcdTAwM2VcXG4gIDExOlxcdFxcbiAgMTI6XFx0X19icGZfa2Z1bmNfc3RhcnRfZGVmcygpO1xcbiAgMTM6XFx0XFxuICAxNDpcXHQvKipcXG4gIDE1OlxcdCAqIGJwZl9ibGtjZ19mbHVzaF9zdGF0cyAtIEZsdXNoIGEgYmxvY2sgY2dyb3VwJ3MgaW8gc3RhdGlzdGljc1xcbiAgMTY6XFx0ICogQGNncnA6IGNncm91cCB0byBmbHVzaFxcbiAgMTc6XFx0ICpcXG4gIDE4OlxcdCAqIFByb3BhZ2F0ZSBJL08gc3RhdGlzdGljcyB1cCB0aGUgY2dyb3VwIHRyZWUuIFJvb3Qgc3RhdGlzdGljcyBjb21lIGZyb21cXG4gIDE5OlxcdCAqIGJsb2NrIGRldmljZXMgYW5kIGluY2x1ZGUgYWxsIGNncm91cHMnIEkvTy5cXG4gIDIwOlxcdCAqL1xcbiAgMjE6XFx0X19icGZfa2Z1bmMgdm9pZCBicGZfYmxrY2dfZmx1c2hfc3RhdHMoc3RydWN0IGNncm91cCAqY2dycClcXG4gIDIyOlxcdHtcXG4gIDIzOlxcdFxcdHN0cnVjdCBjZ3JvdXBfc3Vic3lzX3N0YXRlICpjc3M7XFxuICAyNDpcXHRcXG4gIDI1OlxcdFxcdC8qIFBpbiB0aGUgY3NzIGZvciB0aGUgc2xlZXBhYmxlIGZsdXNoLiAqL1xcbiAgMjY6XFx0XFx0cmN1X3JlYWRfbG9jaygpO1xcbiAgMjc6XFx0XFx0Y3NzID0gY2dyb3VwX2NzcyhjZ3JwLCBcXHUwMDI2aW9fY2dycF9zdWJzeXMpO1xcbiAgMjg6XFx0XFx0aWYgKGNzcyBcXHUwMDI2XFx1MDAyNiAhY3NzX3RyeWdldChjc3MpKVxcbiAgMjk6XFx0XFx0XFx0Y3NzID0gTlVMTDtcXG4gIDMwOlxcdFxcdHJjdV9yZWFkX3VubG9jaygpO1xcbiAgMzE6XFx0XFxuICAzMjpcXHRcXHRpZiAoIWNzcylcXG4gIDMzOlxcdFxcdFxcdHJldHVybjtcXG4gIDM0OlxcdFxcbiAgMzU6XFx0XFx0aWYgKCFjc3MtXFx1MDAzZXBhcmVudClcXG4gIDM2OlxcdFxcdFxcdGJsa2NnX2ZpbGxfcm9vdF9pb3N0YXRzKCk7XFxuICAzNzpcXHRcXHRlbHNlXFxuICAzODpcXHRcXHRcXHRjc3NfcnN0YXRfZmx1c2goY3NzKTtcXG4gIDM5OlxcdFxcbiAgNDA6XFx0XFx0Y3NzX3B1dChjc3MpO1xcbiAgNDE6XFx0fVxcbiAgNDI6XFx0XFxuICA0MzpcXHRzdHJ1Y3QgYnBmX2l0ZXJfYmxrZyB7XFxuICA0NDpcXHRcXHRfX3U2NCBfX29wYXF1ZVsyXTtcXG4gIDQ1OlxcdH0gX19hbGlnbmVkKDgpO1xcbiAgNDY6XFx0XFxuICA0NzpcXHRzdHJ1Y3QgYnBmX2l0ZXJfYmxrZ19rZXJuIHtcXG4gIDQ4OlxcdFxcdHN0cnVjdCBibGtjZyAqYmxrY2c7XFxuICA0OTpcXHRcXHRzdHJ1Y3QgYmxrY2dfZ3EgKnBvcztcXG4gIDUwOlxcdH0gX19hbGlnbmVkKDgpO1xcbiAgNTE6XFx0XFxuICA1MjpcXHQvKipcXG4gIDUzOlxcdCAqIGJwZl9pdGVyX2Jsa2dfbmV3IC0gU3RhcnQgaXRlcmF0aW5nIGEgYmxvY2sgY2dyb3VwJ3MgcGVyLWRldmljZSBibGtnc1xcbiAgNTQ6XFx0ICogQGl0OiBpdGVyYXRvciB0byBpbml0aWFsaXplXFxuICA1NTpcXHQgKiBAY3NzOiB0aGUgaW8gY29udHJvbGxlcidzIGNzc1xcbiAgNTY6XFx0ICpcXG4gIDU3OlxcdCAqIEVhY2ggYmxrZyBob2xkcyBvbmUgZGV2aWNlJ3MgaW8uc3RhdCBjb3VudGVycy4gT2ZmbGluZSBibGtncyBhcmUgc2tpcHBlZC5cXG4gIDU4OlxcdCAqIEEgYmxrZyB3aXRob3V0IGEgZGlzayBjYW4gYmUgcmV0dXJuZWQuIE11c3QgcnVuIHVuZGVyIFJDVS5cXG4gIDU5OlxcdCAqXFxuICA2MDpcXHQgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgLUVJTlZBTCBpZiBAY3NzIGlzIG5vdCB0aGUgaW8gY29udHJvbGxlcidzLlxcbiAgNjE6XFx0ICovXFxuICA2MjpcXHRfX2JwZl9rZnVuYyBpbnQgYnBmX2l0ZXJfYmxrZ19uZXcoc3RydWN0IGJwZl9pdGVyX2Jsa2cgKml0LFxcbiAgNjM6XFx0XFx0XFx0XFx0XFx0ICBzdHJ1Y3QgY2dyb3VwX3N1YnN5c19zdGF0ZSAqY3NzKVxcbiAgNjQ6XFx0e1xcbiAgNjU6XFx0XFx0c3RydWN0IGJwZl9pdGVyX2Jsa2dfa2VybiAqa2l0ID0gKHZvaWQgKilpdDtcXG4gIDY2OlxcdFxcbiAgNjc6XFx0XFx0QlVJTERfQlVHX09OKHNpemVvZihzdHJ1Y3QgYnBmX2l0ZXJfYmxrZ19rZXJuKSBcXHUwMDNlIHNpemVvZihzdHJ1Y3QgYnBmX2l0ZXJfYmxrZykpO1xcbiAgNjg6XFx0XFx0QlVJTERfQlVHX09OKF9fYWxpZ25vZl9fKHN0cnVjdCBicGZfaXRlcl9ibGtnX2tlcm4pICE9XFxuICA2OTpcXHRcXHRcXHQgICAgIF9fYWxpZ25vZl9fKHN0cnVjdCBicGZfaXRlcl9ibGtnKSk7XFxuICA3MDpcXHRcXG4gIDcxOlxcdFxcdGtpdC1cXHUwMDNlcG9zID0gTlVMTDtcXG4gIDcyOlxcdFxcbiAgNzM6XFx0XFx0aWYgKGNzcy1cXHUwMDNlc3MgIT0gXFx1MDAyNmlvX2NncnBfc3Vic3lzKSB7XFxuICA3NDpcXHRcXHRcXHRraXQtXFx1MDAzZWJsa2NnID0gTlVMTDtcXG4gIDc1OlxcdFxcdFxcdHJldHVybiAtRUlOVkFMO1xcbiAgNzY6XFx0XFx0fVxcbiAgNzc6XFx0XFxuICA3ODpcXHRcXHRraXQtXFx1MDAzZWJsa2NnID0gY3NzX3RvX2Jsa2NnKGNzcyk7XFxuICA3OTpcXHRcXHRyZXR1cm4gMDtcXG4gIDgwOlxcdH1cXG4gIDgxOlxcdFxcbiAgODI6XFx0LyoqXFxuICA4MzpcXHQgKiBicGZfaXRlcl9ibGtnX25leHQgLSBSZXR1cm4gdGhlIG5leHQgb25saW5lIGJsa2cgb2YgdGhlIGl0ZXJhdGVkIGJsb2NrIGNncm91cFxcbiAgODQ6XFx0ICogQGl0OiBpdGVyYXRvclxcbiAgODU6XFx0ICpcXG4gIDg2OlxcdCAqIFJldHVybjogdGhlIG5leHQgb25saW5lIGJsa2csIG9yIE5VTEwgd2hlbiB0aGUgd2FsayBpcyBkb25lLlxcbiAgODc6XFx0ICovXFxuICA4ODpcXHRfX2JwZl9rZnVuYyBzdHJ1Y3QgYmxrY2dfZ3EgKmJwZl9pdGVyX2Jsa2dfbmV4dChzdHJ1Y3QgYnBmX2l0ZXJfYmxrZyAqaXQpXFxuICA4OTpcXHR7XFxuICA5MDpcXHRcXHRzdHJ1Y3QgYnBmX2l0ZXJfYmxrZ19rZXJuICpraXQgPSAodm9pZCAqKWl0O1xcbiAgOTE6XFx0XFx0c3RydWN0IGJsa2NnX2dxICpibGtnID0ga2l0LVxcdTAwM2Vwb3M7XFxuICA5MjpcXHRcXHRzdHJ1Y3QgaGxpc3Rfbm9kZSAqbm9kZTtcXG4gIDkzOlxcdFxcbiAgOTQ6XFx0XFx0aWYgKCFraXQtXFx1MDAzZWJsa2NnKVxcbiAgOTU6XFx0XFx0XFx0cmV0dXJuIE5VTEw7XFxuICA5NjpcXHRcXG4gIDk3OlxcdFxcdGlmICghYmxrZylcXG4gIDk4OlxcdFxcdFxcdG5vZGUgPSByY3VfZGVyZWZlcmVuY2UoaGxpc3RfZmlyc3RfcmN1KFxcdTAwMjZraXQtXFx1MDAzZWJsa2NnLVxcdTAwM2VibGtnX2xpc3QpKTtcXG4gIDk5OlxcdFxcdGVsc2VcXG4gMTAwOlxcdFxcdFxcdG5vZGUgPSByY3VfZGVyZWZlcmVuY2UoaGxpc3RfbmV4dF9yY3UoXFx1MDAyNmJsa2ctXFx1MDAzZWJsa2NnX25vZGUpKTtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTdUMjI6MzQ6NTEuNDAxODA1Mzg4WiIsIlNlcSI6OSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NTU2Njc2OTU0OCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipNeSBBbmFseXNpcyBvZiBCUEYgRnVuY3Rpb24gUmVhY2hhYmlsaXR5KipcblxuT2theSwgc28gSSdtIGxvb2tpbmcgYXQgdGhlc2UgdGhyZWUgQlBGLXJlbGF0ZWQgZnVuY3Rpb25zOiBgYnBmX2Jsa2NnX2ZsdXNoX3N0YXRzYCwgYGJwZl9pdGVyX2Jsa2dfbmV3YCwgYW5kIGBicGZfaXRlcl9ibGtnX25leHRgLiBUaGUga2V5IHBvaW50IGlzIHRoYXQgdGhleSdyZSBjYWxsYWJsZSBmcm9tIEJQRiBwcm9ncmFtcy4gVGhhdCBtZWFucyB0aGV5IG5lZWQgdG8gYmUgaW5jbHVkZWQgaW4gYEZvY3VzU3ltYm9sc2AuIFByZXR0eSBzdHJhaWdodGZvcndhcmQuXG5cbk5vdywgd2hpY2ggY29uZmlncyBhcmUgbmVlZGVkIGZvciB0aGVzZT8gTXkgaW5pdGlhbCB0aG91Z2h0cyBhcmUgYEJMS19DR1JPVVBgIGFuZCBgQlBGX1NZU0NBTExgLiBMZXQncyBqdXN0IHF1aWNrbHkgZG91YmxlLWNoZWNrIHRoYXQgYEJQRl9TWVNDQUxMYCBpcyBpbmRlZWQgdGhlIHJpZ2h0IG9uZS4gQWgsIGhlcmUncyBgYmxvY2svTWFrZWZpbGVgOlxuXG5gYGBtYWtlZmlsZVxuaWZkZWYgQ09ORklHX0JQRl9TWVNDQUxMXG5vYmotJChDT05GSUdfQkxLX0NHUk9VUClcdCs9IGJwZl9ibGtjZy5vXG5lbmRpZlxuYGBgXG5cblllcCwgdGhhdCBjb25maXJtcyBpdC4gYEJQRl9TWVNDQUxMYCAqYW5kKiBgQkxLX0NHUk9VUGAuIEdvb2QuXG5cblRoZSBuZXh0IHRoaW5nIHRoYXQgSSBzaG91bGQgYmUgY2hlY2tpbmcgaXMgd2hldGhlciBgQ0dST1VQU2AgaXMgbmVlZGVkLiBgQkxLX0NHUk9VUGAgZGVwZW5kcyBvbiBgQkxPQ0tgIGFuZCBgQ0dST1VQU2A/IFxuXG5XYWl0LCBob2xkIG9uLCBsZXQncyBsb29rIGF0IGBpbml0L0tjb25maWdgOlxuXG5gYGBrY29uZmlnXG5jb25maWcgQkxLX0NHUk9VUFxuXHRib29sIFwiSU8gY29udHJvbGxlclwiXG5cdGRlcGVuZHMgb24gQkxPQ0tcbmBgYFxuXG5Pa2F5LCBpdCBzZWVtcyBhcyBpZiBgQkxLX0NHUk9VUGAgaXMgaW5zaWRlIGBtZW51Y29uZmlnIENHUk9VUFNgLlxuTGV0IG1lIGRvIGEgcXVpY2sgY3Jvc3MtY2hlY2suLi5cblxuXG4iLCJJbnB1dFRva2VucyI6MTMyODEsIk91dHB1dFRva2VucyI6MTksIk91dHB1dFRob3VnaHRzVG9rZW5zIjoyNjMsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0xN1QyMjozNDo1Ni45Njg1NzY5NTVaIiwiU2VxIjoxMCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE2MjA0MjEwNzksIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwibWVudWNvbmZpZyBDR1JPVVBTXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImluaXQvS2NvbmZpZz0xMDQ0PWNvbmZpZyBTTEFCX09CSl9FWFRcXG4tLVxcbmluaXQvS2NvbmZpZy0xMDQ2LVxcbmluaXQvS2NvbmZpZzoxMDQ3Om1lbnVjb25maWcgQ0dST1VQU1xcbmluaXQvS2NvbmZpZy0xMDQ4LVxcdGJvb2wgXFxcIkNvbnRyb2wgR3JvdXAgc3VwcG9ydFxcXCJcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTdUMjI6MzQ6NTguNTg5MDA2Mzg1WiIsIlNlcSI6MTEsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjQzNDY1NDYxMjUsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGhlcmUncyBteSB0YWtlIG9uIHRob3NlIHRob3VnaHRzLCBmcmFtZWQgYXMgYW4gZXhwZXJ0J3MgaW50ZXJuYWwgbW9ub2xvZ3VlOlxuXG4qKkNoZWNraW5nIHRoZSBDR1JPVVAgQ29uZmlndXJhdGlvbioqXG5cbkFscmlnaHQsIHNvIGBCTEtfQ0dST1VQYCBpcyBpbmRlZWQgbmVzdGVkIHdpdGhpbiB0aGUgYENHUk9VUFNgIG9wdGlvbiBpbiBgbWVudWNvbmZpZ2AuIFRoYXQncyB0aGUgc3RhcnRpbmcgcG9pbnQuIE5vdywgdG8gYmUgc3VyZSwgYW5kIHRvIHVuZGVyc3RhbmQgdGhlIGJyb2FkZXIgY29udGV4dCwgSSBuZWVkIHRvIGxvb2sgYXQgYGluaXQvS2NvbmZpZ2AgdG8gc2VlIHRoZSBkZXBlbmRlbmNpZXMgYW5kIHdoYXQgZWxzZSBtaWdodCBiZSB0aWVkIHRvIGl0LiBTcGVjaWZpY2FsbHksIEknbGwganVtcCB0byBhcm91bmQgbGluZSAxMDQ3LCBhcyB0aGF0IHNlZW1zIHRvIGJlIHdoZXJlIHRoZSByZWxldmFudCBzZWN0aW9uIHNob3VsZCBiZS4gSG9wZWZ1bGx5LCB0aGF0IGdpdmVzIG1lIGEgYmV0dGVyIHBpY3R1cmUuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjEzOTc0LCJPdXRwdXRUb2tlbnMiOjMzLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MzcsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTdUMjI6MzU6MDIuOTM1NTU1NDRaIiwiU2VxIjoxMiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTE4NjAwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcImluaXQvS2NvbmZpZ1wiLFxuICBcIkZpcnN0TGluZVwiOiAxMDQwLFxuICBcIkxpbmVDb3VudFwiOiAyMFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIxMDQwOlxcdFxcdGhlbHBcXG4xMDQxOlxcdFxcdCAgSWYgc2V0LCBhdXRvbWF0aWMgTlVNQSBiYWxhbmNpbmcgd2lsbCBiZSBlbmFibGVkIGlmIHJ1bm5pbmcgb24gYSBOVU1BXFxuMTA0MjpcXHRcXHQgIG1hY2hpbmUuXFxuMTA0MzpcXHRcXG4xMDQ0OlxcdGNvbmZpZyBTTEFCX09CSl9FWFRcXG4xMDQ1OlxcdFxcdGJvb2xcXG4xMDQ2OlxcdFxcbjEwNDc6XFx0bWVudWNvbmZpZyBDR1JPVVBTXFxuMTA0ODpcXHRcXHRib29sIFxcXCJDb250cm9sIEdyb3VwIHN1cHBvcnRcXFwiXFxuMTA0OTpcXHRcXHRzZWxlY3QgS0VSTkZTXFxuMTA1MDpcXHRcXHRoZWxwXFxuMTA1MTpcXHRcXHQgIFRoaXMgb3B0aW9uIGFkZHMgc3VwcG9ydCBmb3IgZ3JvdXBpbmcgc2V0cyBvZiBwcm9jZXNzZXMgdG9nZXRoZXIsIGZvclxcbjEwNTI6XFx0XFx0ICB1c2Ugd2l0aCBwcm9jZXNzIGNvbnRyb2wgc3Vic3lzdGVtcyBzdWNoIGFzIENwdXNldHMsIENGUywgbWVtb3J5XFxuMTA1MzpcXHRcXHQgIGNvbnRyb2xzIG9yIGRldmljZSBpc29sYXRpb24uXFxuMTA1NDpcXHRcXHQgIFNlZVxcbjEwNTU6XFx0XFx0XFx0LSBEb2N1bWVudGF0aW9uL3NjaGVkdWxlci9zY2hlZC1kZXNpZ24tQ0ZTLnJzdFxcdChDRlMpXFxuMTA1NjpcXHRcXHRcXHQtIERvY3VtZW50YXRpb24vYWRtaW4tZ3VpZGUvY2dyb3VwLXYxLyAoZmVhdHVyZXMgZm9yIGdyb3VwaW5nLCBpc29sYXRpb25cXG4xMDU3OlxcdFxcdFxcdFxcdFxcdFxcdCAgYW5kIHJlc291cmNlIGNvbnRyb2wpXFxuMTA1ODpcXHRcXG4xMDU5OlxcdFxcdCAgU2F5IE4gaWYgdW5zdXJlLlxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xN1QyMjozNTowMi45MzU2NzU1OFoiLCJTZXEiOjEzLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo0MjQ5ODI0ODkxLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBoZXJlJ3MgbXkgaW50ZXJwcmV0YXRpb24gb2YgdGhvc2UgdGhvdWdodHMsIHRhaWxvcmVkIGZvciBhbiBleHBlcnQgYXVkaWVuY2UsIHByZXNlbnRlZCBpbiB0aGUgZmlyc3QgcGVyc29uOlxuXG4qKktlcm5lbCBTdWJzeXN0ZW0gRGVwZW5kZW5jaWVzOiBBIFF1aWNrIE1lbnRhbCBBdWRpdCoqXG5cblJpZ2h0LCBzbyBgQ0dST1VQU2AgaXMgZGVmaW5pdGVseSBhIGNvcmUgcmVxdWlyZW1lbnQgaGVyZS4gQnV0IGhvbGQgb24sIEkgc2VlbSB0byByZW1lbWJlciBgQkxLX0NHUk9VUGAgYmVpbmcgY29uZGl0aW9uYWxseSBjb21waWxlZC4uLiBidXJpZWQgd2l0aGluIGFuIGBpZiBDR1JPVVBTYCBibG9jaywgcmlnaHQ/IE5lZWQgdG8gY29uZmlybSB0aGF0IHF1aWNrbHkuIEdvdHRhIGtlZXAgdGhlIGRlcGVuZGVuY3kgY2hhaW4gc3RyYWlnaHQgaW4gbXkgaGVhZC4gTGV0IG1lIGp1c3QgZG91YmxlIGNoZWNrIHRoZSByZWxldmFudCBjb25maWcgb3B0aW9ucyB0byBiZSBhYnNvbHV0ZWx5IHN1cmUgdGhhdCBgQkxLX0NHUk9VUGAgaXMgb25seSBlbmFibGVkIHdoZW4gYENHUk9VUFNgIGlzLiBXb3VsZG4ndCB3YW50IGFueSBzdXJwcmlzZXMgd2hlbiBidWlsZGluZy5cblxuXG4iLCJJbnB1dFRva2VucyI6MTQ0NjMsIk91dHB1dFRva2VucyI6MzMsIk91dHB1dFRob3VnaHRzVG9rZW5zIjozMywiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE3VDIyOjM1OjA3LjE4NTUwMjkzMVoiLCJTZXEiOjE0LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMTM1MDAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwiaW5pdC9LY29uZmlnXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDEwNjAsXG4gIFwiTGluZUNvdW50XCI6IDIwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIjEwNjA6XFx0XFxuMTA2MTpcXHRpZiBDR1JPVVBTXFxuMTA2MjpcXHRcXG4xMDYzOlxcdGNvbmZpZyBQQUdFX0NPVU5URVJcXG4xMDY0OlxcdFxcdGJvb2xcXG4xMDY1OlxcdFxcbjEwNjY6XFx0Y29uZmlnIENHUk9VUF9GQVZPUl9EWU5NT0RTXFxuMTA2NzpcXHRcXHRib29sIFxcXCJGYXZvciBkeW5hbWljIG1vZGlmaWNhdGlvbiBsYXRlbmN5IHJlZHVjdGlvbiBieSBkZWZhdWx0XFxcIlxcbjEwNjg6XFx0XFx0aGVscFxcbjEwNjk6XFx0XFx0ICBUaGlzIG9wdGlvbiBlbmFibGVzIHRoZSBcXFwiZmF2b3JkeW5tb2RzXFxcIiBtb3VudCBvcHRpb24gYnkgZGVmYXVsdFxcbjEwNzA6XFx0XFx0ICB3aGljaCByZWR1Y2VzIHRoZSBsYXRlbmNpZXMgb2YgZHluYW1pYyBjZ3JvdXAgbW9kaWZpY2F0aW9ucyBzdWNoXFxuMTA3MTpcXHRcXHQgIGFzIHRhc2sgbWlncmF0aW9ucyBhbmQgY29udHJvbGxlciBvbi9vZmZzIGF0IHRoZSBjb3N0IG9mIG1ha2luZ1xcbjEwNzI6XFx0XFx0ICBob3QgcGF0aCBvcGVyYXRpb25zIHN1Y2ggYXMgZm9ya3MgYW5kIGV4aXRzIG1vcmUgZXhwZW5zaXZlLlxcbjEwNzM6XFx0XFxuMTA3NDpcXHRcXHQgIFNheSBOIGlmIHVuc3VyZS5cXG4xMDc1OlxcdFxcbjEwNzY6XFx0Y29uZmlnIE1FTUNHXFxuMTA3NzpcXHRcXHRib29sIFxcXCJNZW1vcnkgY29udHJvbGxlclxcXCJcXG4xMDc4OlxcdFxcdHNlbGVjdCBQQUdFX0NPVU5URVJcXG4xMDc5OlxcdFxcdHNlbGVjdCBFVkVOVEZEXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE3VDIyOjM1OjA3LjE4NTYxNzUzMVoiLCJTZXEiOjE1LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjozOTgzNDc5NjA0LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBoZXJlJ3MgbXkgdGFrZSBvbiB0aG9zZSB0aG91Z2h0cywgZnJhbWVkIGFzIG15IG93biBtZW50YWwgcHJvY2Vzc2luZzpcblxuKipEZXBlbmRlbmNpZXMgYW5kIENvbmRpdGlvbmFscyoqXG5cbkFscmlnaHQsIGxldCdzIG5haWwgdGhpcyBkb3duLiBJJ3ZlIGdvdCB0byBlbnN1cmUgdGhhdCBteSB1bmRlcnN0YW5kaW5nIG9mIHRoaXMgc3lzdGVtIGlzIGNvcnJlY3QsIGVzcGVjaWFsbHkgd2hlbiBpdCBjb21lcyB0byB0aG9zZSBmZWF0dXJlIGZsYWdzIGFuZCBjb25kaXRpb25hbHMuIFNvLCBgQkxLX0NHUk9VUGAsIG5vIGRvdWJ0LCB0aGF0IHNpdHMgc3F1YXJlbHkgd2l0aGluIHRoZSBgaWYgQ0dST1VQU2AgYmxvY2suIE1ha2VzIHBlcmZlY3Qgc2Vuc2UuIFRoZXJlZm9yZSwgdGhhdCBtZWFucyBgQ0dST1VQU2AgaXMgZGVmaW5pdGVseSBhIHByZXJlcXVpc2l0ZS4gQW5kLCBuYXR1cmFsbHksIGBCTE9DS2AgaXMgcmVxdWlyZWQgdG9vLCBJJ2QgZXhwZWN0IGl0IHRvIGJlLCBidXQgaXQncyBnb29kIHRvIGNvbmZpcm0uIFRoYXQncyBhIGZ1bmRhbWVudGFsLiBBbmQgaGV5LCBsZXQncyBrZWVwIGdvaW5nLlxuXG5Ob3csIHRoYXQgYEJQRl9TWVNDQUxMYC4uLiBJIG5lZWQgdG8gZG91YmxlLWNoZWNrIHRoYXQgdGhpcyBpcyBjb250YWluZWQgd2l0aGluLCBzYXksIGFuIGBpZiBCUEZgIGNvbmRpdGlvbmFsLiBJdCdzIGNydWNpYWwgdG8ga25vdyB0aGF0IGl0IGlzIGNvbnRhaW5lZC4gSSBuZWVkIHRvIGtub3cgd2hlcmUgaXQgc3RhbmRzLiBPdGhlcndpc2UsIEkgd2lsbCBub3QgYmUgYWJsZSB0byBwcm9jZWVkLiBJIGhhdmUgdGhlIGZlZWxpbmcgdGhhdCBJJ20gbWlzc2luZyBzb21ldGhpbmcsIHRob3VnaC4gTGV0J3MgZGlnIGluIGEgYml0LlxuXG5cbiIsIklucHV0VG9rZW5zIjoxNDkyOSwiT3V0cHV0VG9rZW5zIjoyMSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjcyLCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTdUMjI6MzU6MTEuMTY5MDk5Njg1WiIsIlNlcSI6MTYsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNDM2NDk0MTAzLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImNvbmZpZyBCUEZfU1lTQ0FMTFwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJrZXJuZWwvYnBmL0tjb25maWc9MjU9bWVudSBcXFwiQlBGIHN1YnN5c3RlbVxcXCJcXG5rZXJuZWwvYnBmL0tjb25maWctMjYtXFxua2VybmVsL2JwZi9LY29uZmlnOjI3OmNvbmZpZyBCUEZfU1lTQ0FMTFxcbmtlcm5lbC9icGYvS2NvbmZpZy0yOC1cXHRib29sIFxcXCJFbmFibGUgYnBmKCkgc3lzdGVtIGNhbGxcXFwiXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE3VDIyOjM1OjEyLjYwNTU5ODQyOFoiLCJTZXEiOjE3LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo0MDYxMTI2MzM1LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgYSBzdW1tYXJ5IG9mIG15IHRob3VnaHQgcHJvY2VzcywgYXMgcmVxdWVzdGVkOlxuXG4qKk5hdmlnYXRpbmcgdGhlIEtlcm5lbCdzIEJQRiBDb25maWd1cmF0aW9uKipcblxuT2theSwgdGltZSB0byBkaXZlIGluLiBNeSBpbW1lZGlhdGUgdGhvdWdodCBpcyB0byBzdGFydCB3aXRoIHRoZSBjb25maWd1cmF0aW9uIGZpbGUgZm9yIHRoZSBCZXJrZWxleSBQYWNrZXQgRmlsdGVyIChCUEYpIHN1YnN5c3RlbS4gSSBuZWVkIHRvIGdldCBhIGhhbmRsZSBvbiB0aGUgYXZhaWxhYmxlIG9wdGlvbnMgYW5kIGRlcGVuZGVuY2llcyBiZWZvcmUgSSBnbyBkZWVwZXIuIFRoYXQgbWVhbnMgSSBuZWVkIHRvIGxvb2sgYXQgYGtlcm5lbC9icGYvS2NvbmZpZ2AuIFRoaXMgS2NvbmZpZyBmaWxlIHdpbGwgYmUgdGhlIGNlbnRyYWwgcG9pbnQgdG8gdW5kZXJzdGFuZCBob3cgQlBGIGlzIGludGVncmF0ZWQgaW50byB0aGUga2VybmVsJ3MgYnVpbGQgc3lzdGVtIGFuZCB3aGF0IGZlYXR1cmVzIGNhbiBiZSBlbmFibGVkIG9yIGRpc2FibGVkLiBUaGlzIGlzIHdoZXJlIHRoZSBjb3JlIEJQRiBjb250cm9scyBhcmUgZGVmaW5lZCwgYW5kIHdoZXJlIEkgY2FuIHN0YXJ0IHVudGFuZ2xpbmcgdGhlIHJlbGF0aW9uc2hpcHMgYmV0d2VlbiBkaWZmZXJlbnQgQlBGIGZlYXR1cmVzLiBUaGlzIGlzIHRoZSBsb2dpY2FsIGZpcnN0IHN0ZXAgZm9yIG1lIHRvIHVuZGVyc3RhbmQgaG93IEJQRiBmaXRzIGludG8gdGhlIGtlcm5lbCBjb25maWd1cmF0aW9uLiBMZXQncyBzZWUgd2hhdCdzIGluIHRoZXJlLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxNTMzNywiT3V0cHV0VG9rZW5zIjozNCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjEzLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE3VDIyOjM1OjE2LjY2NjcyNjcxM1oiLCJTZXEiOjE4LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo1NDk3MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJrZXJuZWwvYnBmL0tjb25maWdcIixcbiAgXCJGaXJzdExpbmVcIjogMjAsXG4gIFwiTGluZUNvdW50XCI6IDIwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIiAgMjA6XFx0IyBVc2VkIGJ5IGFyY2hzIHRvIHRlbGwgdGhhdCB0aGV5IHdhbnQgdGhlIEJQRiBKSVQgY29tcGlsZXIgZW5hYmxlZCBieVxcbiAgMjE6XFx0IyBkZWZhdWx0IGZvciBrZXJuZWxzIHRoYXQgd2VyZSBjb21waWxlZCB3aXRoIEJQRiBKSVQgc3VwcG9ydC5cXG4gIDIyOlxcdGNvbmZpZyBBUkNIX1dBTlRfREVGQVVMVF9CUEZfSklUXFxuICAyMzpcXHRcXHRib29sXFxuICAyNDpcXHRcXG4gIDI1OlxcdG1lbnUgXFxcIkJQRiBzdWJzeXN0ZW1cXFwiXFxuICAyNjpcXHRcXG4gIDI3OlxcdGNvbmZpZyBCUEZfU1lTQ0FMTFxcbiAgMjg6XFx0XFx0Ym9vbCBcXFwiRW5hYmxlIGJwZigpIHN5c3RlbSBjYWxsXFxcIlxcbiAgMjk6XFx0XFx0c2VsZWN0IEJQRlxcbiAgMzA6XFx0XFx0c2VsZWN0IElSUV9XT1JLXFxuICAzMTpcXHRcXHRzZWxlY3QgTkVFRF9UQVNLU19SQ1VcXG4gIDMyOlxcdFxcdHNlbGVjdCBUQVNLU19UUkFDRV9SQ1VcXG4gIDMzOlxcdFxcdHNlbGVjdCBCSU5BUllfUFJJTlRGXFxuICAzNDpcXHRcXHRzZWxlY3QgTkVUX1NPQ0tfTVNHIGlmIE5FVFxcbiAgMzU6XFx0XFx0c2VsZWN0IE5FVF9YR1JFU1MgaWYgTkVUXFxuICAzNjpcXHRcXHRzZWxlY3QgUEFHRV9QT09MIGlmIE5FVFxcbiAgMzc6XFx0XFx0ZGVmYXVsdCBuXFxuICAzODpcXHRcXHRoZWxwXFxuICAzOTpcXHRcXHQgIEVuYWJsZSB0aGUgYnBmKCkgc3lzdGVtIGNhbGwgdGhhdCBhbGxvd3MgdG8gbWFuaXB1bGF0ZSBCUEYgcHJvZ3JhbXNcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTdUMjI6MzU6MTYuNjY2NzgzNDYzWiIsIlNlcSI6MTksIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjgzODc4NDc0NTcsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqTXkgQW5hbHlzaXMgb2YgQmxvY2sgSS9PIENHUk9VUCBCUEYgU3VwcG9ydCoqXG5cbk9rYXksIHNvIEknbSBwdXR0aW5nIHRvZ2V0aGVyIHRoZSBwaWVjZXMgZm9yIEJQRiBzeXNjYWxsIHN1cHBvcnQgcmVsYXRlZCB0byBibG9jayBJL08gY2dyb3Vwcy4gVGhlIGNvcmUgaXMgZGVmaW5pdGVseSBnb2luZyB0byByZWx5IG9uIGBCUEZfU1lTQ0FMTGAsIHRoYXQncyBhIGdpdmVuLiBOb3csIGxldCdzIHRhbGsgYWJvdXQgdGhlIHNwZWNpZmljIGNvbmZpZ3MgYW5kIHN5bWJvbHMuXG5cbkkgc2VlIHRoYXQgSSBuZWVkIHRvIGVuYWJsZSBhIGZldyBrZXJuZWwgY29uZmlncyB0byBnZXQgdGhpcyByaWdodC4gVGhlIHJlcXVpcmVkIGNvbmZpZ3VyYXRpb25zIGFyZSBwcmV0dHkgY2xlYXItY3V0OiBgQkxLX0NHUk9VUGAsIGBCUEZfU1lTQ0FMTGAsIGBDR1JPVVBTYCwgYW5kIG9mIGNvdXJzZSwgYEJMT0NLYC4gVGhlIGRlcGVuZGVuY2llcyBzZWVtIHNvdW5kLCBib3RoIGBDR1JPVVBTYCBhbmQgYEJMT0NLYCBhcmUgZnVuZGFtZW50YWwgZm9yIHRoaXMgZnVuY3Rpb25hbGl0eS5cblxuTm93LCB0byB0aGUgc3ltYm9scyBJJ2xsIG5lZWQgdG8gZm9jdXMgb24uIEkndmUgaWRlbnRpZmllZCBgYnBmX2Jsa2NnX2ZsdXNoX3N0YXRzYCwgYGJwZl9pdGVyX2Jsa2dfbmV3YCwgYW5kIGBicGZfaXRlcl9ibGtnX25leHRgLiBJIGluaXRpYWxseSBzcG90dGVkIHRoYXQgYGJwZl9pdGVyX2Jsa2dfZGVzdHJveWAgaXMgYW4gZW1wdHkga2Z1bmMuIEEga2Z1bmMsIGV2ZW4gYW4gZW1wdHkgb25lLCBoYXMgc29tZSBpbXBvcnRhbmNlIHNvIEkgd2lsbCBpbmNsdWRlIGl0LlxuXG5UaGVuLCBJIHN0dW1ibGVkIHVwb24gYGJsa2NnX2ZpbGxfcm9vdF9pb3N0YXRzYC4gSSBub3RpY2VkIGl0IHdhcyBtYWRlIG5vbi1zdGF0aWMsIHNvIGl0J3MgcHJvYmFibHkgaW1wb3J0YW50LiBJdCdzIGNhbGxlZCBmcm9tIGBicGZfYmxrY2dfZmx1c2hfc3RhdHNgIHNvIEkgc2hvdWxkIGluY29ycG9yYXRlIGl0IGludG8gYEZvY3VzU3ltYm9sc2AuIEl0IHJlc2lkZXMgaW4gYGJsb2NrL2Jsay1jZ3JvdXAuY2AgYW5kIGl0ZXJhdGVzIGJsb2NrIGRldmljZXMuIFdoaWxlIGl0J3Mgbm90IGEgcGVyZm9ybWFuY2UtY3JpdGljYWwgcGF0aCwgaXQncyBpbnZvbHZlZCBpbiBzdGF0cyBmbHVzaGluZywgc28gSSB0aGluayBpdCdzIHJlbGV2YW50IHRvIGluY2x1ZGUuXG5cblNvIHRoZSBmaW5hbCBzZXQgb2Ygc3ltYm9scyBJJ20gZm9jdXNpbmcgb24gYXJlOiBgYnBmX2Jsa2NnX2ZsdXNoX3N0YXRzYCwgYGJwZl9pdGVyX2Jsa2dfbmV3YCwgYGJwZl9pdGVyX2Jsa2dfbmV4dGAsIGBicGZfaXRlcl9ibGtnX2Rlc3Ryb3lgLCBhbmQgYGJsa2NnX2ZpbGxfcm9vdF9pb3N0YXRzYC5cblxuSSdtIGNvbmZpZGVudCBpbiB0aGVzZSBzZWxlY3Rpb25zLiBOb3cgSSBzaG91bGQgY2FsbCBgc2V0LXJlc3VsdHNgLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxNTgyOSwiT3V0cHV0VG9rZW5zIjoxNzUsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo0OTIsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0xN1QyMjozNToyNS4wNTQ2MzMzMloiLCJTZXEiOjIwLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJzZXQtcmVzdWx0cyIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjc2OTk2ODgxLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJCTEtfQ0dST1VQXCIsXG4gICAgXCJCUEZfU1lTQ0FMTFwiLFxuICAgIFwiQ0dST1VQU1wiLFxuICAgIFwiQkxPQ0tcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJicGZfYmxrY2dfZmx1c2hfc3RhdHNcIixcbiAgICBcImJwZl9pdGVyX2Jsa2dfbmV3XCIsXG4gICAgXCJicGZfaXRlcl9ibGtnX25leHRcIixcbiAgICBcImJwZl9pdGVyX2Jsa2dfZGVzdHJveVwiLFxuICAgIFwiYmxrY2dfZmlsbF9yb290X2lvc3RhdHNcIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBpbnRyb2R1Y2VzIG5ldyBCUEYga2Z1bmNzIGZvciBibG9jayBjZ3JvdXAgSS9PIHN0YXRpc3RpY3MsIHdoaWNoIGFyZSByZWFjaGFibGUgZnJvbSBCUEYgcHJvZ3JhbXMuIFRoZXNlIGZ1bmN0aW9ucyBhbGxvdyBCUEYgcHJvZ3JhbXMgdG8gZmx1c2ggYmxvY2sgY2dyb3VwIHN0YXRzIGFuZCBpdGVyYXRlIG92ZXIgcGVyLWRldmljZSBibGtncy4gVGhlIGNoYW5nZXMgYXJlIGZ1bmN0aW9uYWxseSBzaWduaWZpY2FudCBhbmQgc2hvdWxkIGJlIGZ1enplZC5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJCTEtfQ0dST1VQXCIsXG4gICAgXCJCUEZfU1lTQ0FMTFwiLFxuICAgIFwiQ0dST1VQU1wiLFxuICAgIFwiQkxPQ0tcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJicGZfYmxrY2dfZmx1c2hfc3RhdHNcIixcbiAgICBcImJwZl9pdGVyX2Jsa2dfbmV3XCIsXG4gICAgXCJicGZfaXRlcl9ibGtnX25leHRcIixcbiAgICBcImJwZl9pdGVyX2Jsa2dfZGVzdHJveVwiLFxuICAgIFwiYmxrY2dfZmlsbF9yb290X2lvc3RhdHNcIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBpbnRyb2R1Y2VzIG5ldyBCUEYga2Z1bmNzIGZvciBibG9jayBjZ3JvdXAgSS9PIHN0YXRpc3RpY3MsIHdoaWNoIGFyZSByZWFjaGFibGUgZnJvbSBCUEYgcHJvZ3JhbXMuIFRoZXNlIGZ1bmN0aW9ucyBhbGxvdyBCUEYgcHJvZ3JhbXMgdG8gZmx1c2ggYmxvY2sgY2dyb3VwIHN0YXRzIGFuZCBpdGVyYXRlIG92ZXIgcGVyLWRldmljZSBibGtncy4gVGhlIGNoYW5nZXMgYXJlIGZ1bmN0aW9uYWxseSBzaWduaWZpY2FudCBhbmQgc2hvdWxkIGJlIGZ1enplZC5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTdUMjI6MzU6MjUuMTMxNjM2NjkxWiIsIlNlcSI6MjEsIk5lc3RpbmciOjEsIlR5cGUiOiJhY3Rpb24iLCJOYW1lIjoiSWYiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNTI3OTcwMDg5MiwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE3VDIyOjM1OjI1LjEzMjA3MjM1MVoiLCJTZXEiOjIyLCJOZXN0aW5nIjoyLCJUeXBlIjoiYWdlbnQiLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJiZXN0LWV4cGVuc2l2ZSIsIkR1cmF0aW9uIjoxNTI3OTI2MDk4MiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggc2VyaWVzIGludHJvZHVjZXMgQlBGIGtmdW5jcyBmb3IgYmxvY2sgY2dyb3VwIChibGtjZykgaXRlcmF0aW9uIGFuZCBzdGF0aXN0aWNzIGZsdXNoaW5nIChgYnBmX2Jsa2NnX2ZsdXNoX3N0YXRzYCwgYGJwZl9pdGVyX2Jsa2dfbmV3YCwgYGJwZl9pdGVyX2Jsa2dfbmV4dGAsIGBicGZfaXRlcl9ibGtnX2Rlc3Ryb3lgKS4gVGhlIGl0ZXJhdG9yIHN0YXRlIChgc3RydWN0IGJwZl9pdGVyX2Jsa2dfa2VybmApIGlzIGZ1bGx5IGluaXRpYWxpemVkIGluIGBicGZfaXRlcl9ibGtnX25ld2AgYmVmb3JlIGJlaW5nIHVzZWQgaW4gc3Vic2VxdWVudCBjYWxscy4gVGhlcmUgYXJlIG5vIG5ldyBrZXJuZWwgc3RydWN0dXJlcyBjb3BpZWQgdG8gdXNlciBzcGFjZSAoZS5nLiwgdmlhIGBjb3B5X3RvX3VzZXJgIG9yIG5ldGxpbmspLCBub3IgYXJlIHRoZXJlIGFueSBjb21wbGV4IGFsbG9jYXRpb25zIHdoZXJlIHVuaW5pdGlhbGl6ZWQgZmllbGRzIGNvdWxkIGJlIGxlYWtlZCBvciB1c2VkIGluIGNvbnRyb2wgZmxvdy4gVGhlIGNoYW5nZXMgcHJpbWFyaWx5IGludm9sdmUgcG9pbnRlciB0cmF2ZXJzYWwgYW5kIEJQRi1hY2Nlc3NpYmxlIHJlYWRzIG9mIGV4aXN0aW5nIGluaXRpYWxpemVkIGNncm91cCBzdHJ1Y3R1cmVzLiBBbnkgcG90ZW50aWFsIG1lbW9yeSBzYWZldHkgaXNzdWVzLCBzdWNoIGFzIG91dC1vZi1ib3VuZHMgYWNjZXNzZXMgb3IgdXNlLWFmdGVyLWZyZWUgYnVncyBkdXJpbmcgaXRlcmF0aW9uLCB3b3VsZCBiZSBlZmZlY3RpdmVseSBjYXVnaHQgYnkgS0FTQU4gYW5kIHRoZSBCUEYgdmVyaWZpZXIuIFRoZXJlZm9yZSwgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGlzIG5vdCByZXF1aXJlZC5cIixcbiAgXCJOZWVkc0tNU0FOXCI6IGZhbHNlXG59IiwiSW5zdHJ1Y3Rpb24iOiJZb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgc2VjdXJpdHkgZW5naW5lZXIgc3BlY2lhbGl6aW5nIGluIGtlcm5lbCBtZW1vcnlcbmVycm9yIGRldGVjdG9ycyAoS0FTQU4gYW5kIEtNU0FOKS4gWW91ciBqb2IgaXMgdG8gcmV2aWV3IHRoZSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kXG5kZXRlcm1pbmUgaWYgdGhlIGNvZGUgY2hhbmdlcyBqdXN0aWZ5IHNwYXduaW5nIGEgZGVkaWNhdGVkIEtNU0FOIChLZXJuZWxNZW1vcnlTYW5pdGl6ZXIpXG5mdXp6aW5nIHNlc3Npb24gaW4gYWRkaXRpb24gdG8gc3RhbmRhcmQgS0FTQU4gZnV6emluZy5cblxuQ1JJVElDQUwgRElTVElOQ1RJT04gQkVUV0VFTiBLQVNBTiBBTkQgS01TQU46XG4tIFN0YW5kYXJkIEtBU0FOIGtlcm5lbCBidWlsZHMgKHVwc3RyZWFtLWFwcGFybW9yLWthc2FuLmNvbmZpZykgYWxyZWFkeSBlbmFibGVcbiAgYSBjb21wcmVoZW5zaXZlIHN1aXRlIG9mIGRlYnVnZ2luZyB0b29scyBhbmQgc2FuaXRpemVycywgaW5jbHVkaW5nIEtBU0FOXG4gIChvdXQtb2YtYm91bmRzIGFjY2Vzc2VzLCB1c2UtYWZ0ZXItZnJlZSwgZG91YmxlIGZyZWUsIGludmFsaWQgZnJlZSksIExPQ0tERVBcbiAgKGxvY2tpbmcgYnVncyBhbmQgZGVhZGxvY2tzKSwgVUItc2FuaXRpemVycywgYW5kIG1lbW9yeSBjb3JydXB0aW9uIGNoZWNrcy5cbi0gS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcikgZGV0ZWN0cyByZWFkcyBvZiBVTklOSVRJQUxJWkVEIG1lbW9yeSAoc3RhY2ssIGhlYXAsXG4gIG9yIHBhZ2UgYWxsb2NhdGlvbnMpIGFuZCBrZXJuZWwtdG8tdXNlciBtZW1vcnkgaW5mby1sZWFrcy5cblxuUnVsZTogVEhFUkUgSVMgTk8gU0VOU0UgSU4gUlVOTklORyBBIEtNU0FOIFNFU1NJT04gSUYgQSBCVUcgQ0FOIEJFIENBVUdIVCBCWSBLQVNBTixcbkxPQ0tERVAsIE9SIE9USEVSIFNUQU5EQVJEIEJVRyBERVRFQ1RPUlMuXG5BIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaW5jdXJzIHNpZ25pZmljYW50IHJlc291cmNlIGNvc3RzLiBZb3UgbXVzdCBPTkxZXG5zZXQgTmVlZHNLTVNBTj10cnVlIGlmIHRoZSBjb2RlIGNoYW5nZXMgaW50cm9kdWNlIG9yIGV4cG9zZSBVTklOSVRJQUxJWkVEIE1FTU9SWSByaXNrc1xudGhhdCBhcmUgZGV0ZWN0ZWQgT05MWSBieSBLTVNBTi5cblxuTG9vayBob2xpc3RpY2FsbHkgYXQgdGhlIHBhdGNoIHNlcmllcyBhbmQgc3Vycm91bmRpbmcgY29kZS4gRXZlbiBpZiBubyBkaXJlY3RcbnVuaW5pdGlhbGl6ZWQgZmllbGQgYWNjZXNzZXMgb3IgbmV3IGJ1ZmZlciBhbGxvY2F0aW9ucyBhcmUgYWRkZWQgaW4gdGhlIGRpZmYgaXRzZWxmLFxuYSBwYXRjaCBtYXkgYWx0ZXIgY29udHJvbCBmbG93LCBib3VuZHMgY2hlY2tpbmcsIG9yIGRhdGEgbGVuZ3RoIGNhbGN1bGF0aW9ucyBpbiB3YXlzXG50aGF0IGNoYW5nZSBob3cgdGhlIHJlc3Qgb2YgdGhlIGNvZGUgb3BlcmF0ZXMgb24gZXhpc3RpbmcgYnVmZmVycyAoZS5nLiBhbGxvd2luZ1xudW5pbml0aWFsaXplZCBzdGFjay9oZWFwIG1lbW9yeSB0byBiZSByZWFkLCBjb3BpZWQgdG8gdXNlciBzcGFjZSwgb3IgdXNlZCBpbiBjb250cm9sXG5mbG93KS4gRG8gbm90IGhlc2l0YXRlIHRvIHVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUsXG5jYWxsZWQgZnVuY3Rpb25zLCBhbmQgY2FsbGVycy5cblxuU2V0IE5lZWRzS01TQU49dHJ1ZSBPTkxZIElGIHRoZSBwYXRjaCBpbnRyb2R1Y2VzIG9yIG1vZGlmaWVzOlxuMS4gS2VybmVsIHN0cnVjdHVyZXMgc2VudCB0byB1c2VyIHNwYWNlICh2aWEgY29weV90b191c2VyLCBwdXRfdXNlciwgbmV0bGluayBza2JcbiAgIGF0dHJpYnV0ZXMsIGlvY3RsIG91dHB1dCBhcmd1bWVudHMsIHNvY2tldCBvcHRpb25zLCBvciBCUEYgYnVmZmVycykgd2hlcmUgZmllbGRzXG4gICBvciBzdHJ1Y3R1cmUgcGFkZGluZyBtaWdodCBub3QgYmUgZnVsbHkgaW5pdGlhbGl6ZWQvemVyb2VkLlxuMi4gQ29uZGl0aW9uYWwgbG9naWMgb3IgYnJhbmNoaW5nIHRoYXQgZGVwZW5kcyBvbiBwb3RlbnRpYWxseSB1bmluaXRpYWxpemVkIHZhcmlhYmxlc1xuICAgb3Igc3RydWN0IGZpZWxkcy5cbjMuIEFsbG9jYXRpb24gb3IgaW5pdGlhbGl6YXRpb24gb2YgY29tcGxleCBkYXRhIHN0cnVjdHVyZXMgd2hlcmUgdW5pbml0aWFsaXplZCBmaWVsZHNcbiAgIGNvdWxkIGJlIHJlYWQgbGF0ZXIgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMuXG40LiBCb3VuZHMgY2hlY2tzLCBsZW5ndGhzLCBvciBsb2dpYyBpbiBhIHdheSB0aGF0IGFsbG93cyBzdXJyb3VuZGluZyBjb2RlIHRvIGFjY2Vzc1xuICAgdW5pbml0aWFsaXplZCBieXRlcyBvZiBleGlzdGluZyBidWZmZXJzLlxuXG5TZXQgTmVlZHNLTVNBTj1mYWxzZSBJRjpcbi0gVGhlIGNvZGUgY2hhbmdlcyBwcmltYXJpbHkgcmlzayBvdXQtb2YtYm91bmRzIGFjY2VzcywgYXJyYXkgb3ZlcmZsb3dzLCBOVUxMIHBvaW50ZXJcbiAgZGVyZWZlcmVuY2VzLCBsb2NraW5nIGRlYWRsb2Nrcywgb3IgdXNlLWFmdGVyLWZyZWUgYnVncyAodGhlc2UgYXJlIGFscmVhZHkgY2F1Z2h0XG4gIGJ5IEtBU0FOLCBMT0NLREVQLCBvciBzdGFuZGFyZCBidWcgZGV0ZWN0b3JzKS5cbi0gQWxsIHN0YWNrL2hlYXAgc3RydWN0dXJlcyB0b3VjaGVkIG9yIGludHJvZHVjZWQgYnkgdGhlIHBhdGNoIGFyZSBmdWxseSB6ZXJvZWRcbiAgb3IgaW5pdGlhbGl6ZWQgKGUuZy4gdXNpbmcgPSB7MH0sIG1lbXNldCwga3phbGxvYykgYmVmb3JlIGJlaW5nIHJlYWQgb3IgY29waWVkLlxuLSBUaGUgcGF0Y2ggZG9lcyBub3QgaW50cm9kdWNlIGFueSByaXNrIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHVzYWdlIG9yIGluZm8tbGVha3MuXG5cblVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUgaWYgbmVjZXNzYXJ5LCB0aGVuIHByb3ZpZGVcbmRldGFpbGVkIEtNU0FOUmVhc29uaW5nIGNvbnRyYXN0aW5nIEtBU0FOIHZzIEtNU0FOIGFwcGxpY2FiaWxpdHkgZm9yIHRoaXMgcGF0Y2guXG5QcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy5cblxuXG5Vc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLlxuSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuXG5JZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuXG4iLCJQcm9tcHQiOiJGb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczpcbmNvbW1pdCA3NzMwMDM2M2ZlOWM1YjBhZmMzNmQ5Zjc0ZWFkYjQxYmE2ZGQ1M2E1XG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIE1vbiBBdWcgMTcgMjI6MzQ6MzIgMjAyNiArMDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS9NQUlOVEFJTkVSUyBiL01BSU5UQUlORVJTXG5pbmRleCAyZjk0NzJjMWEwOTA3Li44N2M1NmU5NTU1NzcxIDEwMDY0NFxuLS0tIGEvTUFJTlRBSU5FUlNcbisrKyBiL01BSU5UQUlORVJTXG5AQCAtNjYxNyw2ICs2NjE3LDcgQEAgRjpcdGJsb2NrL2Jsay1jZ3JvdXAuY1xuIEY6XHRibG9jay9ibGstaW9jb3N0LmNcbiBGOlx0YmxvY2svYmxrLWlvbGF0ZW5jeS5jXG4gRjpcdGJsb2NrL2Jsay10aHJvdHRsZS5jXG4rRjpcdGJsb2NrL2JwZl9ibGtjZy5jXG4gRjpcdGluY2x1ZGUvbGludXgvYmxrLWNncm91cC5oXG4gXG4gQ09OVFJPTCBHUk9VUCAtIENQVVNFVFxuZGlmZiAtLWdpdCBhL2Jsb2NrL01ha2VmaWxlIGIvYmxvY2svTWFrZWZpbGVcbmluZGV4IGU3YmQzMjBlM2Q2OTcuLjU3MmU0OTk4OGM4ZWUgMTAwNjQ0XG4tLS0gYS9ibG9jay9NYWtlZmlsZVxuKysrIGIvYmxvY2svTWFrZWZpbGVcbkBAIC0xNyw2ICsxNyw5IEBAIG9iai0kKENPTkZJR19CTEtfRVJST1JfSU5KRUNUSU9OKSArPSBlcnJvci1pbmplY3Rpb24ub1xuIG9iai0kKENPTkZJR19CTEtfREVWX0JTR19DT01NT04pICs9IGJzZy5vXG4gb2JqLSQoQ09ORklHX0JMS19ERVZfQlNHTElCKVx0Kz0gYnNnLWxpYi5vXG4gb2JqLSQoQ09ORklHX0JMS19DR1JPVVApXHQrPSBibGstY2dyb3VwLm9cbitpZmRlZiBDT05GSUdfQlBGX1NZU0NBTExcbitvYmotJChDT05GSUdfQkxLX0NHUk9VUClcdCs9IGJwZl9ibGtjZy5vXG4rZW5kaWZcbiBvYmotJChDT05GSUdfQkxLX0NHUk9VUF9SV1NUQVQpXHQrPSBibGstY2dyb3VwLXJ3c3RhdC5vXG4gb2JqLSQoQ09ORklHX0JMS19DR1JPVVBfRkNfQVBQSUQpICs9IGJsay1jZ3JvdXAtZmMtYXBwaWQub1xuIG9iai0kKENPTkZJR19CTEtfREVWX1RIUk9UVExJTkcpXHQrPSBibGstdGhyb3R0bGUub1xuZGlmZiAtLWdpdCBhL2Jsb2NrL2Jsay1jZ3JvdXAuYyBiL2Jsb2NrL2Jsay1jZ3JvdXAuY1xuaW5kZXggZDk2NzYxMjZjNWI1ZC4uOGQ1MzhhZDRlODYxYyAxMDA2NDRcbi0tLSBhL2Jsb2NrL2Jsay1jZ3JvdXAuY1xuKysrIGIvYmxvY2svYmxrLWNncm91cC5jXG5AQCAtMTA4Niw3ICsxMDg2LDcgQEAgc3RhdGljIHZvaWQgYmxrY2dfcnN0YXRfZmx1c2goc3RydWN0IGNncm91cF9zdWJzeXNfc3RhdGUgKmNzcywgaW50IGNwdSlcbiAgKiBmbHVzaGluZyB0aGUgcm9vdCBjZ3JvdXAncyBzdGF0cyBieSBleHBsaWNpdGx5IGZpbGxpbmcgaW4gdGhlIGlvc3RhdFxuICAqIHdpdGggZGlzayBsZXZlbCBzdGF0aXN0aWNzLlxuICAqL1xuLXN0YXRpYyB2b2lkIGJsa2NnX2ZpbGxfcm9vdF9pb3N0YXRzKHZvaWQpXG4rdm9pZCBibGtjZ19maWxsX3Jvb3RfaW9zdGF0cyh2b2lkKVxuIHtcbiBcdHN0cnVjdCBjbGFzc19kZXZfaXRlciBpdGVyO1xuIFx0c3RydWN0IGRldmljZSAqZGV2O1xuZGlmZiAtLWdpdCBhL2Jsb2NrL2Jsay1jZ3JvdXAuaCBiL2Jsb2NrL2Jsay1jZ3JvdXAuaFxuaW5kZXggNjE1MzkwZjc1MWFhMi4uOGM5YzJhMWFkZmFhNCAxMDA2NDRcbi0tLSBhL2Jsb2NrL2Jsay1jZ3JvdXAuaFxuKysrIGIvYmxvY2svYmxrLWNncm91cC5oXG5AQCAtMjA1LDYgKzIwNSw3IEBAIHZvaWQgYmxrY2dfZGVhY3RpdmF0ZV9wb2xpY3koc3RydWN0IGdlbmRpc2sgKmRpc2ssXG4gXHRcdFx0ICAgICBjb25zdCBzdHJ1Y3QgYmxrY2dfcG9saWN5ICpwb2wpO1xuIFxuIGNvbnN0IGNoYXIgKmJsa2dfZGV2X25hbWUoc3RydWN0IGJsa2NnX2dxICpibGtnKTtcbit2b2lkIGJsa2NnX2ZpbGxfcm9vdF9pb3N0YXRzKHZvaWQpO1xuIHZvaWQgYmxrY2dfcHJpbnRfYmxrZ3Moc3RydWN0IHNlcV9maWxlICpzZiwgc3RydWN0IGJsa2NnICpibGtjZyxcbiBcdFx0ICAgICAgIHU2NCAoKnByZmlsbCkoc3RydWN0IHNlcV9maWxlICosXG4gXHRcdFx0XHQgICAgIHN0cnVjdCBibGtnX3BvbGljeV9kYXRhICosIGludCksXG5kaWZmIC0tZ2l0IGEvYmxvY2svYnBmX2Jsa2NnLmMgYi9ibG9jay9icGZfYmxrY2cuY1xubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAuLjI1YzgwOWY1MDkxYzJcbi0tLSAvZGV2L251bGxcbisrKyBiL2Jsb2NrL2JwZl9ibGtjZy5jXG5AQCAtMCwwICsxLDE1NCBAQFxuKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9yLWxhdGVyXG4rLypcbisgKiBCbG9jayBJL08gQ29udHJvbGxlci1yZWxhdGVkIEJQRiBrZnVuY3MgYW5kIGF1eGlsaWFyeSBjb2RlXG4rICovXG4rXG4rI2luY2x1ZGUgXCJibGstY2dyb3VwLmhcIlxuK1xuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L2JwZi5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvYnRmX2lkcy5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvcmN1bGlzdC5oXHUwMDNlXG4rXG4rX19icGZfa2Z1bmNfc3RhcnRfZGVmcygpO1xuK1xuKy8qKlxuKyAqIGJwZl9ibGtjZ19mbHVzaF9zdGF0cyAtIEZsdXNoIGEgYmxvY2sgY2dyb3VwJ3MgaW8gc3RhdGlzdGljc1xuKyAqIEBjZ3JwOiBjZ3JvdXAgdG8gZmx1c2hcbisgKlxuKyAqIFByb3BhZ2F0ZSBJL08gc3RhdGlzdGljcyB1cCB0aGUgY2dyb3VwIHRyZWUuIFJvb3Qgc3RhdGlzdGljcyBjb21lIGZyb21cbisgKiBibG9jayBkZXZpY2VzIGFuZCBpbmNsdWRlIGFsbCBjZ3JvdXBzJyBJL08uXG4rICovXG4rX19icGZfa2Z1bmMgdm9pZCBicGZfYmxrY2dfZmx1c2hfc3RhdHMoc3RydWN0IGNncm91cCAqY2dycClcbit7XG4rXHRzdHJ1Y3QgY2dyb3VwX3N1YnN5c19zdGF0ZSAqY3NzO1xuK1xuK1x0LyogUGluIHRoZSBjc3MgZm9yIHRoZSBzbGVlcGFibGUgZmx1c2guICovXG4rXHRyY3VfcmVhZF9sb2NrKCk7XG4rXHRjc3MgPSBjZ3JvdXBfY3NzKGNncnAsIFx1MDAyNmlvX2NncnBfc3Vic3lzKTtcbitcdGlmIChjc3MgXHUwMDI2XHUwMDI2ICFjc3NfdHJ5Z2V0KGNzcykpXG4rXHRcdGNzcyA9IE5VTEw7XG4rXHRyY3VfcmVhZF91bmxvY2soKTtcbitcbitcdGlmICghY3NzKVxuK1x0XHRyZXR1cm47XG4rXG4rXHRpZiAoIWNzcy1cdTAwM2VwYXJlbnQpXG4rXHRcdGJsa2NnX2ZpbGxfcm9vdF9pb3N0YXRzKCk7XG4rXHRlbHNlXG4rXHRcdGNzc19yc3RhdF9mbHVzaChjc3MpO1xuK1xuK1x0Y3NzX3B1dChjc3MpO1xuK31cbitcbitzdHJ1Y3QgYnBmX2l0ZXJfYmxrZyB7XG4rXHRfX3U2NCBfX29wYXF1ZVsyXTtcbit9IF9fYWxpZ25lZCg4KTtcbitcbitzdHJ1Y3QgYnBmX2l0ZXJfYmxrZ19rZXJuIHtcbitcdHN0cnVjdCBibGtjZyAqYmxrY2c7XG4rXHRzdHJ1Y3QgYmxrY2dfZ3EgKnBvcztcbit9IF9fYWxpZ25lZCg4KTtcbitcbisvKipcbisgKiBicGZfaXRlcl9ibGtnX25ldyAtIFN0YXJ0IGl0ZXJhdGluZyBhIGJsb2NrIGNncm91cCdzIHBlci1kZXZpY2UgYmxrZ3NcbisgKiBAaXQ6IGl0ZXJhdG9yIHRvIGluaXRpYWxpemVcbisgKiBAY3NzOiB0aGUgaW8gY29udHJvbGxlcidzIGNzc1xuKyAqXG4rICogRWFjaCBibGtnIGhvbGRzIG9uZSBkZXZpY2UncyBpby5zdGF0IGNvdW50ZXJzLiBPZmZsaW5lIGJsa2dzIGFyZSBza2lwcGVkLlxuKyAqIEEgYmxrZyB3aXRob3V0IGEgZGlzayBjYW4gYmUgcmV0dXJuZWQuIE11c3QgcnVuIHVuZGVyIFJDVS5cbisgKlxuKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCAtRUlOVkFMIGlmIEBjc3MgaXMgbm90IHRoZSBpbyBjb250cm9sbGVyJ3MuXG4rICovXG4rX19icGZfa2Z1bmMgaW50IGJwZl9pdGVyX2Jsa2dfbmV3KHN0cnVjdCBicGZfaXRlcl9ibGtnICppdCxcbitcdFx0XHRcdCAgc3RydWN0IGNncm91cF9zdWJzeXNfc3RhdGUgKmNzcylcbit7XG4rXHRzdHJ1Y3QgYnBmX2l0ZXJfYmxrZ19rZXJuICpraXQgPSAodm9pZCAqKWl0O1xuK1xuK1x0QlVJTERfQlVHX09OKHNpemVvZihzdHJ1Y3QgYnBmX2l0ZXJfYmxrZ19rZXJuKSBcdTAwM2Ugc2l6ZW9mKHN0cnVjdCBicGZfaXRlcl9ibGtnKSk7XG4rXHRCVUlMRF9CVUdfT04oX19hbGlnbm9mX18oc3RydWN0IGJwZl9pdGVyX2Jsa2dfa2VybikgIT1cbitcdFx0ICAgICBfX2FsaWdub2ZfXyhzdHJ1Y3QgYnBmX2l0ZXJfYmxrZykpO1xuK1xuK1x0a2l0LVx1MDAzZXBvcyA9IE5VTEw7XG4rXG4rXHRpZiAoY3NzLVx1MDAzZXNzICE9IFx1MDAyNmlvX2NncnBfc3Vic3lzKSB7XG4rXHRcdGtpdC1cdTAwM2VibGtjZyA9IE5VTEw7XG4rXHRcdHJldHVybiAtRUlOVkFMO1xuK1x0fVxuK1xuK1x0a2l0LVx1MDAzZWJsa2NnID0gY3NzX3RvX2Jsa2NnKGNzcyk7XG4rXHRyZXR1cm4gMDtcbit9XG4rXG4rLyoqXG4rICogYnBmX2l0ZXJfYmxrZ19uZXh0IC0gUmV0dXJuIHRoZSBuZXh0IG9ubGluZSBibGtnIG9mIHRoZSBpdGVyYXRlZCBibG9jayBjZ3JvdXBcbisgKiBAaXQ6IGl0ZXJhdG9yXG4rICpcbisgKiBSZXR1cm46IHRoZSBuZXh0IG9ubGluZSBibGtnLCBvciBOVUxMIHdoZW4gdGhlIHdhbGsgaXMgZG9uZS5cbisgKi9cbitfX2JwZl9rZnVuYyBzdHJ1Y3QgYmxrY2dfZ3EgKmJwZl9pdGVyX2Jsa2dfbmV4dChzdHJ1Y3QgYnBmX2l0ZXJfYmxrZyAqaXQpXG4re1xuK1x0c3RydWN0IGJwZl9pdGVyX2Jsa2dfa2VybiAqa2l0ID0gKHZvaWQgKilpdDtcbitcdHN0cnVjdCBibGtjZ19ncSAqYmxrZyA9IGtpdC1cdTAwM2Vwb3M7XG4rXHRzdHJ1Y3QgaGxpc3Rfbm9kZSAqbm9kZTtcbitcbitcdGlmICgha2l0LVx1MDAzZWJsa2NnKVxuK1x0XHRyZXR1cm4gTlVMTDtcbitcbitcdGlmICghYmxrZylcbitcdFx0bm9kZSA9IHJjdV9kZXJlZmVyZW5jZShobGlzdF9maXJzdF9yY3UoXHUwMDI2a2l0LVx1MDAzZWJsa2NnLVx1MDAzZWJsa2dfbGlzdCkpO1xuK1x0ZWxzZVxuK1x0XHRub2RlID0gcmN1X2RlcmVmZXJlbmNlKGhsaXN0X25leHRfcmN1KFx1MDAyNmJsa2ctXHUwMDNlYmxrY2dfbm9kZSkpO1xuK1xuK1x0LyogU2tpcCBvZmZsaW5lIGJsa2dzLCBtYXRjaGluZyBpby5zdGF0LiAqL1xuK1x0d2hpbGUgKG5vZGUpIHtcbitcdFx0YmxrZyA9IGhsaXN0X2VudHJ5KG5vZGUsIHN0cnVjdCBibGtjZ19ncSwgYmxrY2dfbm9kZSk7XG4rXHRcdC8qIEEgcmFjZSBvbmx5IGNoYW5nZXMgd2hldGhlciB0aGlzIGJsa2cgaXMgcmV0dXJuZWQuICovXG4rXHRcdGlmIChkYXRhX3JhY2UoYmxrZy1cdTAwM2VvbmxpbmUpKSB7XG4rXHRcdFx0a2l0LVx1MDAzZXBvcyA9IGJsa2c7XG4rXHRcdFx0cmV0dXJuIGJsa2c7XG4rXHRcdH1cbitcdFx0bm9kZSA9IHJjdV9kZXJlZmVyZW5jZShobGlzdF9uZXh0X3JjdShcdTAwMjZibGtnLVx1MDAzZWJsa2NnX25vZGUpKTtcbitcdH1cbitcbitcdC8qIFRoZSBpdGVyYXRvciBtdXN0IGtlZXAgcmV0dXJuaW5nIE5VTEwgYWZ0ZXIgY29tcGxldGlvbi4gKi9cbitcdGtpdC1cdTAwM2Vwb3MgPSBOVUxMO1xuK1x0a2l0LVx1MDAzZWJsa2NnID0gTlVMTDtcbitcdHJldHVybiBOVUxMO1xuK31cbitcbisvKipcbisgKiBicGZfaXRlcl9ibGtnX2Rlc3Ryb3kgLSBUZWFyIGRvd24gYSBibGtnIGl0ZXJhdG9yXG4rICogQGl0OiBpdGVyYXRvclxuKyAqL1xuK19fYnBmX2tmdW5jIHZvaWQgYnBmX2l0ZXJfYmxrZ19kZXN0cm95KHN0cnVjdCBicGZfaXRlcl9ibGtnICppdClcbit7XG4rfVxuK1xuK19fYnBmX2tmdW5jX2VuZF9kZWZzKCk7XG4rXG4rQlRGX0tGVU5DU19TVEFSVChicGZfYmxrY2dfa2Z1bmNzKVxuK0JURl9JRF9GTEFHUyhmdW5jLCBicGZfYmxrY2dfZmx1c2hfc3RhdHMsIEtGX1NMRUVQQUJMRSlcbitcbitCVEZfSURfRkxBR1MoZnVuYywgYnBmX2l0ZXJfYmxrZ19uZXcsXG4rXHQgICAgIEtGX0lURVJfTkVXIHwgS0ZfUkNVIHwgS0ZfUkNVX1BST1RFQ1RFRClcbitCVEZfSURfRkxBR1MoZnVuYywgYnBmX2l0ZXJfYmxrZ19uZXh0LCBLRl9JVEVSX05FWFQgfCBLRl9SRVRfTlVMTClcbitCVEZfSURfRkxBR1MoZnVuYywgYnBmX2l0ZXJfYmxrZ19kZXN0cm95LCBLRl9JVEVSX0RFU1RST1kpXG4rQlRGX0tGVU5DU19FTkQoYnBmX2Jsa2NnX2tmdW5jcylcbitcbitzdGF0aWMgY29uc3Qgc3RydWN0IGJ0Zl9rZnVuY19pZF9zZXQgYnBmX2Jsa2NnX2tmdW5jX3NldCA9IHtcbitcdC5vd25lclx0XHQ9IFRISVNfTU9EVUxFLFxuK1x0LnNldFx0XHQ9IFx1MDAyNmJwZl9ibGtjZ19rZnVuY3MsXG4rfTtcbitcbitzdGF0aWMgaW50IF9faW5pdCBicGZfYmxrY2dfaW5pdCh2b2lkKVxuK3tcbitcdGludCBlcnI7XG4rXG4rXHRlcnIgPSByZWdpc3Rlcl9idGZfa2Z1bmNfaWRfc2V0KEJQRl9QUk9HX1RZUEVfVU5TUEVDLFxuK1x0XHRcdFx0XHRcdTAwMjZicGZfYmxrY2dfa2Z1bmNfc2V0KTtcbitcdGlmIChlcnIpXG4rXHRcdHByX3dhcm4oXCJlcnJvciB3aGlsZSByZWdpc3RlcmluZyBicGYgYmxrY2cga2Z1bmNzOiAlZFxcblwiLCBlcnIpO1xuK1xuK1x0cmV0dXJuIGVycjtcbit9XG4rbGF0ZV9pbml0Y2FsbChicGZfYmxrY2dfaW5pdCk7XG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL2Nncm91cF9pdGVyX2lvLmggYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvY2dyb3VwX2l0ZXJfaW8uaFxubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAuLmY0YmJhYWNjZGY3MTZcbi0tLSAvZGV2L251bGxcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9jZ3JvdXBfaXRlcl9pby5oXG5AQCAtMCwwICsxLDE3IEBAXG4rLyogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAgKi9cbisvKiBDb3B5cmlnaHQgKGMpIDIwMjUgTWV0YSBQbGF0Zm9ybXMsIEluYy4gYW5kIGFmZmlsaWF0ZXMuICovXG4rI2lmbmRlZiBfX0NHUk9VUF9JVEVSX0lPX0hcbisjZGVmaW5lIF9fQ0dST1VQX0lURVJfSU9fSFxuK1xuK3N0cnVjdCBpb19xdWVyeSB7XG4rXHQvKiBvbmUgZGV2aWNlJ3MgaW8uc3RhdCBjb3VudGVycyAqL1xuK1x0X191NjQgcmJ5dGVzO1xuK1x0X191NjQgd2J5dGVzO1xuK1x0X191NjQgcmlvcztcbitcdF9fdTY0IHdpb3M7XG4rXHRfX3U2NCBkYnl0ZXM7XG4rXHRfX3U2NCBkaW9zO1xuK1x0X191NjQgZGV2O1x0LyogZGV2X3Qgb2YgdGhlIGRldmljZSB0aGUgY291bnRlcnMgYmVsb25nIHRvICovXG4rfTtcbitcbisjZW5kaWYgLyogX19DR1JPVVBfSVRFUl9JT19IICovXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL2NvbmZpZyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9jb25maWdcbmluZGV4IGVhNzA0NGYzMGFkYzMuLjI3MGU2YmY5MTk0ZDIgMTAwNjQ0XG4tLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvY29uZmlnXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvY29uZmlnXG5AQCAtMSwzICsxLDQgQEBcbitDT05GSUdfQkxLX0NHUk9VUD15XG4gQ09ORklHX0JMS19ERVZfTE9PUD15XG4gQ09ORklHX0JPT1RQQVJBTV9IQVJETE9DS1VQX1BBTklDPXlcbiBDT05GSUdfQk9PVFBBUkFNX1NPRlRMT0NLVVBfUEFOSUM9MVxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2Nncm91cF9pdGVyX2lvLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9jZ3JvdXBfaXRlcl9pby5jXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uNWQyN2U1ZDI4Mzc5NVxuLS0tIC9kZXYvbnVsbFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvY2dyb3VwX2l0ZXJfaW8uY1xuQEAgLTAsMCArMSwyNzcgQEBcbisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxuKy8qIENvcHlyaWdodCAoYykgMjAyNSBNZXRhIFBsYXRmb3JtcywgSW5jLiBhbmQgYWZmaWxpYXRlcy4gKi9cbisjZGVmaW5lIF9HTlVfU09VUkNFXG4rI2luY2x1ZGUgXHUwMDNjdGVzdF9wcm9ncy5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjYnBmL2xpYmJwZi5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjZmNudGwuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L2xvb3AuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3N0ZGxpYi5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3RyaW5nLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NzeXMvaW9jdGwuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3N5cy9zdGF0LmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NzeXMvc3lzbWFjcm9zLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2N1bmlzdGQuaFx1MDAzZVxuKyNpbmNsdWRlIFwiY2dyb3VwX2hlbHBlcnMuaFwiXG4rI2luY2x1ZGUgXCJjZ3JvdXBfaXRlcl9pby5oXCJcbisjaW5jbHVkZSBcImNncm91cF9pdGVyX2lvLnNrZWwuaFwiXG4rXG4rI2RlZmluZSBJT19TSVpFICg0ICogMTAyNCAqIDEwMjQpXG4rXG4rc3RhdGljIGludCByZWFkX3N0YXRzKHN0cnVjdCBicGZfbGluayAqbGluaylcbit7XG4rXHRpbnQgZmQsIHJldCA9IDA7XG4rXHRzc2l6ZV90IGJ5dGVzO1xuK1xuK1x0ZmQgPSBicGZfaXRlcl9jcmVhdGUoYnBmX2xpbmtfX2ZkKGxpbmspKTtcbitcdGlmICghQVNTRVJUX09LX0ZEKGZkLCBcImJwZl9pdGVyX2NyZWF0ZVwiKSlcbitcdFx0cmV0dXJuIDE7XG4rXG4rXHQvKiBSZXN1bHRzIGxhbmQgaW4gc2tlbC1cdTAwM2VkYXRhX3F1ZXJ5OyB0aGUgcmVhZCBpdHNlbGYgcmV0dXJucyBubyBkYXRhLiAqL1xuK1x0Ynl0ZXMgPSByZWFkKGZkLCBOVUxMLCAwKTtcbitcdGlmICghQVNTRVJUX0VRKGJ5dGVzLCAwLCBcInJlYWQgZmRcIikpXG4rXHRcdHJldCA9IDE7XG4rXG4rXHRjbG9zZShmZCk7XG4rXHRyZXR1cm4gcmV0O1xuK31cbitcbisvKiBTZXQgdXAgYSBsb29wIGRldmljZSBmb3IgY2dyb3VwLWNoYXJnZWQgSS9PLiAqL1xuK3N0YXRpYyBpbnQgbG9vcF9zZXR1cChjaGFyICpsb29wX3BhdGgsIHNpemVfdCBzeiwgaW50ICpjdGxfZmQsIGludCAqbG9vcF9mZCxcbitcdFx0ICAgICAgaW50ICpiYWNrX2ZkKVxuK3tcbitcdGNoYXIgYmFja19wYXRoW10gPSBcIi90bXAvY2dyb3VwX2l0ZXJfaW8uWFhYWFhYXCI7XG4rXHRpbnQgbnI7XG4rXG4rXHQqY3RsX2ZkID0gKmxvb3BfZmQgPSAqYmFja19mZCA9IC0xO1xuK1xuK1x0KmN0bF9mZCA9IG9wZW4oXCIvZGV2L2xvb3AtY29udHJvbFwiLCBPX1JEV1IgfCBPX0NMT0VYRUMpO1xuK1x0aWYgKCpjdGxfZmQgXHUwMDNjIDApXG4rXHRcdHJldHVybiAtMTtcbitcbitcdG5yID0gaW9jdGwoKmN0bF9mZCwgTE9PUF9DVExfR0VUX0ZSRUUpO1xuK1x0aWYgKG5yIFx1MDAzYyAwKVxuK1x0XHRnb3RvIGVycjtcbitcdHNucHJpbnRmKGxvb3BfcGF0aCwgc3osIFwiL2Rldi9sb29wJWRcIiwgbnIpO1xuK1xuK1x0KmJhY2tfZmQgPSBta3N0ZW1wKGJhY2tfcGF0aCk7XG4rXHRpZiAoKmJhY2tfZmQgXHUwMDNjIDApXG4rXHRcdGdvdG8gZXJyO1xuK1x0dW5saW5rKGJhY2tfcGF0aCk7XG4rXHRpZiAoZnRydW5jYXRlKCpiYWNrX2ZkLCAob2ZmX3QpSU9fU0laRSAqIDQpKVxuK1x0XHRnb3RvIGVycjtcbitcbitcdCpsb29wX2ZkID0gb3Blbihsb29wX3BhdGgsIE9fUkRXUiB8IE9fQ0xPRVhFQyk7XG4rXHRpZiAoKmxvb3BfZmQgXHUwMDNjIDApXG4rXHRcdGdvdG8gZXJyO1xuK1x0aWYgKGlvY3RsKCpsb29wX2ZkLCBMT09QX1NFVF9GRCwgKmJhY2tfZmQpKVxuK1x0XHRnb3RvIGVycjtcbitcbitcdHJldHVybiAwO1xuK2VycjpcbitcdGlmICgqbG9vcF9mZCBcdTAwM2U9IDApXG4rXHRcdGNsb3NlKCpsb29wX2ZkKTtcbitcdGlmICgqYmFja19mZCBcdTAwM2U9IDApXG4rXHRcdGNsb3NlKCpiYWNrX2ZkKTtcbitcdGNsb3NlKCpjdGxfZmQpO1xuK1x0KmN0bF9mZCA9ICpsb29wX2ZkID0gKmJhY2tfZmQgPSAtMTtcbitcdHJldHVybiAtMTtcbit9XG4rXG4rc3RhdGljIHZvaWQgbG9vcF90ZWFyZG93bihjb25zdCBjaGFyICpsb29wX3BhdGgsIGludCBjdGxfZmQsIGludCBsb29wX2ZkLFxuK1x0XHRcdCAgaW50IGJhY2tfZmQpXG4re1xuK1x0aW50IG5yID0gLTE7XG4rXG4rXHRpZiAobG9vcF9mZCBcdTAwM2U9IDApIHtcbitcdFx0aW9jdGwobG9vcF9mZCwgTE9PUF9DTFJfRkQsIDApO1xuK1x0XHRjbG9zZShsb29wX2ZkKTtcbitcdH1cbitcdGlmIChiYWNrX2ZkIFx1MDAzZT0gMClcbitcdFx0Y2xvc2UoYmFja19mZCk7XG4rXHRpZiAoY3RsX2ZkIFx1MDAzZT0gMCkge1xuK1x0XHRpZiAoc3NjYW5mKGxvb3BfcGF0aCwgXCIvZGV2L2xvb3AlZFwiLCBcdTAwMjZucikgPT0gMSBcdTAwMjZcdTAwMjYgbnIgXHUwMDNlPSAwKVxuK1x0XHRcdGlvY3RsKGN0bF9mZCwgTE9PUF9DVExfUkVNT1ZFLCBucik7XG4rXHRcdGNsb3NlKGN0bF9mZCk7XG4rXHR9XG4rfVxuK1xuKy8qIE9fRElSRUNUIGtlZXBzIEkvTyBjaGFyZ2VkIHRvIHRoZSBjdXJyZW50IGNncm91cC4gKi9cbitzdGF0aWMgaW50IGRvX2RpcmVjdF9pbyhjb25zdCBjaGFyICpsb29wX3BhdGgpXG4re1xuK1x0dm9pZCAqYnVmO1xuK1x0aW50IGZkLCByZXQgPSAtMTtcbitcbitcdGZkID0gb3Blbihsb29wX3BhdGgsIE9fUkRXUiB8IE9fRElSRUNUIHwgT19DTE9FWEVDKTtcbitcdGlmIChmZCBcdTAwM2MgMClcbitcdFx0cmV0dXJuIC0xO1xuK1x0aWYgKHBvc2l4X21lbWFsaWduKFx1MDAyNmJ1ZiwgNDA5NiwgSU9fU0laRSkpXG4rXHRcdGdvdG8gb3V0X2ZkO1xuK1x0bWVtc2V0KGJ1ZiwgMHhhYiwgSU9fU0laRSk7XG4rXG4rXHRpZiAocHdyaXRlKGZkLCBidWYsIElPX1NJWkUsIDApICE9IElPX1NJWkUpXG4rXHRcdGdvdG8gb3V0X2J1ZjtcbitcdGZzeW5jKGZkKTtcbitcdGlmIChwcmVhZChmZCwgYnVmLCBJT19TSVpFLCAwKSAhPSBJT19TSVpFKVxuK1x0XHRnb3RvIG91dF9idWY7XG4rXHRyZXQgPSAwO1xuK291dF9idWY6XG4rXHRmcmVlKGJ1Zik7XG4rb3V0X2ZkOlxuK1x0Y2xvc2UoZmQpO1xuK1x0cmV0dXJuIHJldDtcbit9XG4rXG4rLyogUmVhZCBAZGV2J3MgaW8uc3RhdCBjb3VudGVycy4gQGRldiB1c2VzIGtlcm5lbCBkZXZfdCBlbmNvZGluZy4gKi9cbitzdGF0aWMgaW50IHBhcnNlX2lvX3N0YXQoaW50IGNncm91cF9mZCwgX191NjQgZGV2LCBzdHJ1Y3QgaW9fcXVlcnkgKm91dClcbit7XG4rXHR1bnNpZ25lZCBpbnQgd2FudF9tYWogPSBkZXYgXHUwMDNlXHUwMDNlIDIwLCB3YW50X21pbiA9IGRldiBcdTAwMjYgKCgxVSBcdTAwM2NcdTAwM2MgMjApIC0gMSk7XG4rXHRjaGFyIGJ1Zls0MDk2XSwgKmxpbmUsICpzYXZlcHRyO1xuK1x0aW50IGZkLCBuLCByZXQgPSAtMTtcbitcbitcdGZkID0gb3BlbmF0KGNncm91cF9mZCwgXCJpby5zdGF0XCIsIE9fUkRPTkxZKTtcbitcdGlmIChmZCBcdTAwM2MgMClcbitcdFx0cmV0dXJuIC0xO1xuK1x0biA9IHJlYWQoZmQsIGJ1Ziwgc2l6ZW9mKGJ1ZikgLSAxKTtcbitcdGNsb3NlKGZkKTtcbitcdGlmIChuIFx1MDAzYz0gMClcbitcdFx0cmV0dXJuIC0xO1xuK1x0YnVmW25dID0gJ1xcMCc7XG4rXG4rXHRmb3IgKGxpbmUgPSBzdHJ0b2tfcihidWYsIFwiXFxuXCIsIFx1MDAyNnNhdmVwdHIpOyBsaW5lO1xuK1x0ICAgICBsaW5lID0gc3RydG9rX3IoTlVMTCwgXCJcXG5cIiwgXHUwMDI2c2F2ZXB0cikpIHtcbitcdFx0dW5zaWduZWQgbG9uZyBsb25nIHJiID0gMCwgd2IgPSAwLCByaSA9IDAsIHdpID0gMCwgZGIgPSAwLCBkaSA9IDA7XG4rXHRcdHVuc2lnbmVkIGludCBtYWosIG1pbjtcbitcbitcdFx0LyogT25seSB0aGUgZGV2aWNlIGlkIGlzIHJlcXVpcmVkOyBtaXNzaW5nIGNvdW50ZXJzIHN0YXkgemVyby4gKi9cbitcdFx0aWYgKHNzY2FuZihsaW5lLFxuK1x0XHRcdCAgIFwiJXU6JXUgcmJ5dGVzPSVsbHUgd2J5dGVzPSVsbHUgcmlvcz0lbGx1IHdpb3M9JWxsdSBkYnl0ZXM9JWxsdSBkaW9zPSVsbHVcIixcbitcdFx0XHQgICBcdTAwMjZtYWosIFx1MDAyNm1pbiwgXHUwMDI2cmIsIFx1MDAyNndiLCBcdTAwMjZyaSwgXHUwMDI2d2ksIFx1MDAyNmRiLCBcdTAwMjZkaSkgXHUwMDNjIDIpXG4rXHRcdFx0Y29udGludWU7XG4rXHRcdGlmIChtYWogIT0gd2FudF9tYWogfHwgbWluICE9IHdhbnRfbWluKVxuK1x0XHRcdGNvbnRpbnVlO1xuK1xuK1x0XHRvdXQtXHUwMDNlcmJ5dGVzID0gcmI7XG4rXHRcdG91dC1cdTAwM2V3Ynl0ZXMgPSB3YjtcbitcdFx0b3V0LVx1MDAzZXJpb3MgPSByaTtcbitcdFx0b3V0LVx1MDAzZXdpb3MgPSB3aTtcbitcdFx0b3V0LVx1MDAzZWRieXRlcyA9IGRiO1xuK1x0XHRvdXQtXHUwMDNlZGlvcyA9IGRpO1xuK1x0XHRyZXQgPSAwO1xuK1x0XHRicmVhaztcbitcdH1cbitcdHJldHVybiByZXQ7XG4rfVxuK1xuK3ZvaWQgdGVzdF9jZ3JvdXBfaXRlcl9pbyh2b2lkKVxuK3tcbitcdGNoYXIgKmNncm91cF9yZWxfcGF0aCA9IFwiL2Nncm91cF9pdGVyX2lvX3Rlc3RcIjtcbitcdGludCBjdGxfZmQgPSAtMSwgbG9vcF9mZCA9IC0xLCBiYWNrX2ZkID0gLTE7XG4rXHRzdHJ1Y3QgY2dyb3VwX2l0ZXJfaW8gKnNrZWwgPSBOVUxMO1xuK1x0c3RydWN0IGJwZl9saW5rICpsaW5rID0gTlVMTDtcbitcdGNoYXIgbG9vcF9wYXRoWzY0XTtcbitcdHN0cnVjdCBpb19xdWVyeSAqcTtcbitcdGludCBjZ3JvdXBfZmQ7XG4rXG4rXHRjZ3JvdXBfZmQgPSBjZ3JvdXBfc2V0dXBfYW5kX2pvaW4oY2dyb3VwX3JlbF9wYXRoKTtcbitcdGlmICghQVNTRVJUX09LX0ZEKGNncm91cF9mZCwgXCJjZ3JvdXBfc2V0dXBfYW5kX2pvaW5cIikpXG4rXHRcdHJldHVybjtcbitcbitcdGlmIChsb29wX3NldHVwKGxvb3BfcGF0aCwgc2l6ZW9mKGxvb3BfcGF0aCksIFx1MDAyNmN0bF9mZCwgXHUwMDI2bG9vcF9mZCwgXHUwMDI2YmFja19mZCkpIHtcbitcdFx0dGVzdF9fc2tpcCgpO1x0LyogbmVlZHMgcm9vdCArIENPTkZJR19CTEtfREVWX0xPT1AgKi9cbitcdFx0Z290byBjbGVhbnVwX2Nncm91cF9mZDtcbitcdH1cbitcbitcdHNrZWwgPSBjZ3JvdXBfaXRlcl9pb19fb3Blbl9hbmRfbG9hZCgpO1xuK1x0aWYgKCFBU1NFUlRfT0tfUFRSKHNrZWwsIFwiY2dyb3VwX2l0ZXJfaW9fX29wZW5fYW5kX2xvYWRcIikpXG4rXHRcdGdvdG8gY2xlYW51cF9sb29wO1xuK1xuK1x0LyogQ29udmVydCBnbGliYyBzdF9yZGV2IHRvIGtlcm5lbCBkZXZfdCBmb3JtYXQuICovXG4rXHR7XG4rXHRcdHN0cnVjdCBzdGF0IGxzdDtcbitcbitcdFx0aWYgKCFBU1NFUlRfT0soZnN0YXQobG9vcF9mZCwgXHUwMDI2bHN0KSwgXCJmc3RhdCBsb29wXCIpKVxuK1x0XHRcdGdvdG8gY2xlYW51cF9za2VsO1xuK1x0XHRza2VsLVx1MDAzZWRhdGFfcXVlcnktXHUwMDNldGFyZ2V0X2RldiA9XG4rXHRcdFx0KChfX3U2NCltYWpvcihsc3Quc3RfcmRldikgXHUwMDNjXHUwMDNjIDIwKSB8IG1pbm9yKGxzdC5zdF9yZGV2KTtcbitcdH1cbitcbitcdERFQ0xBUkVfTElCQlBGX09QVFMoYnBmX2l0ZXJfYXR0YWNoX29wdHMsIG9wdHMpO1xuK1x0dW5pb24gYnBmX2l0ZXJfbGlua19pbmZvIGxpbmZvID0ge1xuK1x0XHQuY2dyb3VwLmNncm91cF9mZCA9IGNncm91cF9mZCxcbitcdFx0LmNncm91cC5vcmRlciA9IEJQRl9DR1JPVVBfSVRFUl9TRUxGX09OTFksXG4rXHR9O1xuK1x0b3B0cy5saW5rX2luZm8gPSBcdTAwMjZsaW5mbztcbitcdG9wdHMubGlua19pbmZvX2xlbiA9IHNpemVvZihsaW5mbyk7XG4rXG4rXHRsaW5rID0gYnBmX3Byb2dyYW1fX2F0dGFjaF9pdGVyKHNrZWwtXHUwMDNlcHJvZ3MuY2dyb3VwX2lvX3F1ZXJ5LCBcdTAwMjZvcHRzKTtcbitcdGlmICghQVNTRVJUX09LX1BUUihsaW5rLCBcImJwZl9wcm9ncmFtX19hdHRhY2hfaXRlclwiKSlcbitcdFx0Z290byBjbGVhbnVwX3NrZWw7XG4rXG4rXHQvKiBUaGlzIHByb2Nlc3MgaXMgaW4gdGhlIHRlc3QgY2dyb3VwLCBzbyB0aGUgbG9vcCBJL08gaXMgY2hhcmdlZCBoZXJlLiAqL1xuK1x0aWYgKCFBU1NFUlRfT0soZG9fZGlyZWN0X2lvKGxvb3BfcGF0aCksIFwiZG9fZGlyZWN0X2lvXCIpKVxuK1x0XHRnb3RvIGNsZWFudXBfbGluaztcbitcbitcdGlmICghQVNTRVJUX09LKHJlYWRfc3RhdHMobGluayksIFwicmVhZCBzdGF0c1wiKSlcbitcdFx0Z290byBjbGVhbnVwX2xpbms7XG4rXG4rXHRxID0gXHUwMDI2c2tlbC1cdTAwM2VkYXRhX3F1ZXJ5LVx1MDAzZWlvX3F1ZXJ5O1xuK1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCJjZ3JvdXBfaXRlcl9pb19fd3JpdGVcIikpIHtcbitcdFx0QVNTRVJUX0dUKHEtXHUwMDNld2J5dGVzLCAwLCBcIndieXRlc1wiKTtcbitcdFx0QVNTRVJUX0dUKHEtXHUwMDNld2lvcywgMCwgXCJ3aW9zXCIpO1xuK1x0fVxuK1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCJjZ3JvdXBfaXRlcl9pb19fcmVhZFwiKSkge1xuK1x0XHRBU1NFUlRfR1QocS1cdTAwM2VyYnl0ZXMsIDAsIFwicmJ5dGVzXCIpO1xuK1x0XHRBU1NFUlRfR1QocS1cdTAwM2VyaW9zLCAwLCBcInJpb3NcIik7XG4rXHR9XG4rXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcImNncm91cF9pdGVyX2lvX19kZXZcIikpXG4rXHRcdEFTU0VSVF9HVChxLVx1MDAzZWRldiwgMCwgXCJkZXZcIik7XG4rXG4rXHQvKiBDb21wYXJlIHdpdGggaW8uc3RhdCB3aXRob3V0IEkvTyBiZXR3ZWVuIHRoZSByZWFkcy4gKi9cbitcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwiY2dyb3VwX2l0ZXJfaW9fX21hdGNoXCIpKSB7XG4rXHRcdHN0cnVjdCBpb19xdWVyeSBmaWxldiA9IHt9O1xuK1xuK1x0XHRpZiAoQVNTRVJUX09LKHJlYWRfc3RhdHMobGluayksIFwicmVhZCBzdGF0c1wiKSBcdTAwMjZcdTAwMjZcbitcdFx0ICAgIEFTU0VSVF9PSyhwYXJzZV9pb19zdGF0KGNncm91cF9mZCwgcS1cdTAwM2VkZXYsIFx1MDAyNmZpbGV2KSxcbitcdFx0XHQgICAgICBcInBhcnNlIGlvLnN0YXRcIikpIHtcbitcdFx0XHRBU1NFUlRfRVEocS1cdTAwM2VyYnl0ZXMsIGZpbGV2LnJieXRlcywgXCJyYnl0ZXNcIik7XG4rXHRcdFx0QVNTRVJUX0VRKHEtXHUwMDNld2J5dGVzLCBmaWxldi53Ynl0ZXMsIFwid2J5dGVzXCIpO1xuK1x0XHRcdEFTU0VSVF9FUShxLVx1MDAzZXJpb3MsIGZpbGV2LnJpb3MsIFwicmlvc1wiKTtcbitcdFx0XHRBU1NFUlRfRVEocS1cdTAwM2V3aW9zLCBmaWxldi53aW9zLCBcIndpb3NcIik7XG4rXHRcdFx0QVNTRVJUX0VRKHEtXHUwMDNlZGJ5dGVzLCBmaWxldi5kYnl0ZXMsIFwiZGJ5dGVzXCIpO1xuK1x0XHRcdEFTU0VSVF9FUShxLVx1MDAzZWRpb3MsIGZpbGV2LmRpb3MsIFwiZGlvc1wiKTtcbitcdFx0fVxuK1x0fVxuK1xuK1x0LyogUm9vdCBzdGF0aXN0aWNzIGluY2x1ZGUgdGhpcyBjZ3JvdXAncyBJL08uICovXG4rXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcImNncm91cF9pdGVyX2lvX19yb290XCIpKSB7XG4rXHRcdHN0cnVjdCBicGZfbGluayAqcm9vdF9saW5rO1xuK1x0XHRzdHJ1Y3QgaW9fcXVlcnkgKnI7XG4rXG4rXHRcdHNrZWwtXHUwMDNlZGF0YV9xdWVyeS1cdTAwM2Vnb3Rfcm9vdF9jc3MgPSAwO1xuK1x0XHRyb290X2xpbmsgPSBicGZfcHJvZ3JhbV9fYXR0YWNoX2l0ZXIoc2tlbC1cdTAwM2Vwcm9ncy5jZ3JvdXBfcm9vdF9pb19xdWVyeSxcbitcdFx0XHRcdFx0XHQgICAgIFx1MDAyNm9wdHMpO1xuK1x0XHRpZiAoQVNTRVJUX09LX1BUUihyb290X2xpbmssIFwiYXR0YWNoIHJvb3QgaXRlclwiKSkge1xuK1x0XHRcdGlmIChBU1NFUlRfT0socmVhZF9zdGF0cyhyb290X2xpbmspLCBcInJlYWQgcm9vdCBzdGF0c1wiKSkge1xuK1x0XHRcdFx0ciA9IFx1MDAyNnNrZWwtXHUwMDNlZGF0YV9xdWVyeS1cdTAwM2Vyb290X3F1ZXJ5O1xuK1x0XHRcdFx0QVNTRVJUX0VRKHNrZWwtXHUwMDNlZGF0YV9xdWVyeS1cdTAwM2Vnb3Rfcm9vdF9jc3MsIDEsXG4rXHRcdFx0XHRcdCAgXCJnb3Rfcm9vdF9jc3NcIik7XG4rXHRcdFx0XHRBU1NFUlRfRVEoci1cdTAwM2VkZXYsIHEtXHUwMDNlZGV2LCBcInJvb3QgZGV2XCIpO1xuK1x0XHRcdFx0QVNTRVJUX0dFKHItXHUwMDNld2J5dGVzLCBxLVx1MDAzZXdieXRlcywgXCJyb290IHdieXRlc1wiKTtcbitcdFx0XHRcdEFTU0VSVF9HRShyLVx1MDAzZXdpb3MsIHEtXHUwMDNld2lvcywgXCJyb290IHdpb3NcIik7XG4rXHRcdFx0XHRBU1NFUlRfR0Uoci1cdTAwM2VyYnl0ZXMsIHEtXHUwMDNlcmJ5dGVzLCBcInJvb3QgcmJ5dGVzXCIpO1xuK1x0XHRcdFx0QVNTRVJUX0dFKHItXHUwMDNlcmlvcywgcS1cdTAwM2VyaW9zLCBcInJvb3Qgcmlvc1wiKTtcbitcdFx0XHR9XG4rXHRcdFx0YnBmX2xpbmtfX2Rlc3Ryb3kocm9vdF9saW5rKTtcbitcdFx0fVxuK1x0fVxuK1xuK2NsZWFudXBfbGluazpcbitcdGJwZl9saW5rX19kZXN0cm95KGxpbmspO1xuK2NsZWFudXBfc2tlbDpcbitcdGNncm91cF9pdGVyX2lvX19kZXN0cm95KHNrZWwpO1xuK2NsZWFudXBfbG9vcDpcbitcdGxvb3BfdGVhcmRvd24obG9vcF9wYXRoLCBjdGxfZmQsIGxvb3BfZmQsIGJhY2tfZmQpO1xuK2NsZWFudXBfY2dyb3VwX2ZkOlxuK1x0Y2xvc2UoY2dyb3VwX2ZkKTtcbitcdGNsZWFudXBfY2dyb3VwX2Vudmlyb25tZW50KCk7XG4rfVxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9jZ3JvdXBfaXRlcl9pby5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL2Nncm91cF9pdGVyX2lvLmNcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwLi4yY2Q1MzgwNjg5ODdhXG4tLS0gL2Rldi9udWxsXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvY2dyb3VwX2l0ZXJfaW8uY1xuQEAgLTAsMCArMSw5OSBAQFxuKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXG4rLyogQ29weXJpZ2h0IChjKSAyMDI1IE1ldGEgUGxhdGZvcm1zLCBJbmMuIGFuZCBhZmZpbGlhdGVzLiAqL1xuKyNpbmNsdWRlIFx1MDAzY3ZtbGludXguaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2JwZi9icGZfaGVscGVycy5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjYnBmL2JwZl9jb3JlX3JlYWQuaFx1MDAzZVxuKyNpbmNsdWRlIFwiYnBmX2V4cGVyaW1lbnRhbC5oXCJcbisjaW5jbHVkZSBcImNncm91cF9pdGVyX2lvLmhcIlxuK1xuK2NoYXIgX2xpY2Vuc2VbXSBTRUMoXCJsaWNlbnNlXCIpID0gXCJHUExcIjtcbitcbitzdHJ1Y3QgaW9fcXVlcnkgaW9fcXVlcnkgU0VDKFwiLmRhdGEucXVlcnlcIik7XG4rXG4rc3RydWN0IGlvX3F1ZXJ5IHJvb3RfcXVlcnkgU0VDKFwiLmRhdGEucXVlcnlcIik7XG4rXG4rX191NjQgZ290X3Jvb3RfY3NzIFNFQyhcIi5kYXRhLnF1ZXJ5XCIpO1xuK1xuKy8qIERldmljZSBzZWxlY3RlZCBieSB1c2Vyc3BhY2UgaW4ga2VybmVsIGRldl90IGZvcm1hdC4gKi9cbitfX3U2NCB0YXJnZXRfZGV2IFNFQyhcIi5kYXRhLnF1ZXJ5XCIpO1xuK1xuKy8qIEtlZXAgaW5saW5lOiBSQ1UgYW5kIG9wZW4tY29kZWQgaXRlcmF0b3JzIGNhbm5vdCBjcm9zcyBhIEJQRiBjYWxsLiAqL1xuK3N0YXRpYyBfX2Fsd2F5c19pbmxpbmUgaW50IHJlYWRfdGFyZ2V0X2RldihzdHJ1Y3QgY2dyb3VwICpjZ3JwLFxuK1x0XHRcdFx0XHQgICBzdHJ1Y3QgaW9fcXVlcnkgKm91dClcbit7XG4rXHRzdHJ1Y3QgY2dyb3VwX3N1YnN5c19zdGF0ZSAqY3NzO1xuK1x0c3RydWN0IGJsa2NnX2dxICpwb3M7XG4rXHRfX3U2NCBkZXY7XG4rXHRpbnQgc3NpZDtcbitcbitcdC8qIFRoZSBmbHVzaCBjYW4gc2xlZXAsIHNvIHJ1biBpdCBiZWZvcmUgdGhlIFJDVSBzZWN0aW9uLiAqL1xuK1x0YnBmX2Jsa2NnX2ZsdXNoX3N0YXRzKGNncnApO1xuK1xuK1x0YnBmX3JjdV9yZWFkX2xvY2soKTtcbitcdHNzaWQgPSBicGZfY29yZV9lbnVtX3ZhbHVlKGVudW0gY2dyb3VwX3N1YnN5c19pZCwgaW9fY2dycF9pZCk7XG4rXG4rXHQvKlxuK1x0ICogc3Vic3lzW10gaXMgX19yY3UsIHNvIHRoaXMgcmVhZCBnaXZlcyBhbiBSQ1UgcG9pbnRlciB0aGUgaXRlcmF0b3JcbitcdCAqIGFjY2VwdHMuIEJQRl9DT1JFX1JFQUQoKSB3b3VsZCByZXR1cm4gYSBwbGFpbiB2YWx1ZSBpbnN0ZWFkLlxuK1x0ICovXG4rXHRjc3MgPSBjZ3JwLVx1MDAzZXN1YnN5c1tzc2lkXTtcbitcdGlmICghY3NzKSB7XG4rXHRcdGJwZl9yY3VfcmVhZF91bmxvY2soKTtcbitcdFx0cmV0dXJuIDA7XG4rXHR9XG4rXG4rXHRicGZfZm9yX2VhY2goYmxrZywgcG9zLCBjc3MpIHtcbitcdFx0ZGV2ID0gQlBGX0NPUkVfUkVBRChwb3MsIHEsIGRpc2ssIHBhcnQwLCBiZF9kZXYpO1xuK1x0XHRpZiAoZGV2ICE9IHRhcmdldF9kZXYpXG4rXHRcdFx0Y29udGludWU7XG4rXG4rXHRcdG91dC1cdTAwM2VkZXYgPSBkZXY7XG4rXHRcdG91dC1cdTAwM2VyYnl0ZXMgPSBCUEZfQ09SRV9SRUFEKHBvcywgaW9zdGF0LmN1ci5ieXRlc1tCTEtHX0lPU1RBVF9SRUFEXSk7XG4rXHRcdG91dC1cdTAwM2V3Ynl0ZXMgPSBCUEZfQ09SRV9SRUFEKHBvcywgaW9zdGF0LmN1ci5ieXRlc1tCTEtHX0lPU1RBVF9XUklURV0pO1xuK1x0XHRvdXQtXHUwMDNlcmlvcyA9IEJQRl9DT1JFX1JFQUQocG9zLCBpb3N0YXQuY3VyLmlvc1tCTEtHX0lPU1RBVF9SRUFEXSk7XG4rXHRcdG91dC1cdTAwM2V3aW9zID0gQlBGX0NPUkVfUkVBRChwb3MsIGlvc3RhdC5jdXIuaW9zW0JMS0dfSU9TVEFUX1dSSVRFXSk7XG4rXHRcdG91dC1cdTAwM2VkYnl0ZXMgPSBCUEZfQ09SRV9SRUFEKHBvcywgaW9zdGF0LmN1ci5ieXRlc1tCTEtHX0lPU1RBVF9ESVNDQVJEXSk7XG4rXHRcdG91dC1cdTAwM2VkaW9zID0gQlBGX0NPUkVfUkVBRChwb3MsIGlvc3RhdC5jdXIuaW9zW0JMS0dfSU9TVEFUX0RJU0NBUkRdKTtcbitcdFx0YnJlYWs7XG4rXHR9XG4rXHRicGZfcmN1X3JlYWRfdW5sb2NrKCk7XG4rXHRyZXR1cm4gMTtcbit9XG4rXG4rU0VDKFwiaXRlci5zL2Nncm91cFwiKVxuK2ludCBjZ3JvdXBfaW9fcXVlcnkoc3RydWN0IGJwZl9pdGVyX19jZ3JvdXAgKmN0eClcbit7XG4rXHRzdHJ1Y3QgY2dyb3VwICpjZ3JwID0gY3R4LVx1MDAzZWNncm91cDtcbitcbitcdGlmICghY2dycClcbitcdFx0cmV0dXJuIDE7XG4rXG4rXHQvKiBTdGFydCBmcmVzaCBzbyBhIGRldmljZSB0aGF0IGlzIG5vdCBmb3VuZCBzdGF5cyBhbGwtemVyby4gKi9cbitcdF9fYnVpbHRpbl9tZW1zZXQoXHUwMDI2aW9fcXVlcnksIDAsIHNpemVvZihpb19xdWVyeSkpO1xuK1xuK1x0cmVhZF90YXJnZXRfZGV2KGNncnAsIFx1MDAyNmlvX3F1ZXJ5KTtcbitcdHJldHVybiAwO1xuK31cbitcbitTRUMoXCJpdGVyLnMvY2dyb3VwXCIpXG4raW50IGNncm91cF9yb290X2lvX3F1ZXJ5KHN0cnVjdCBicGZfaXRlcl9fY2dyb3VwICpjdHgpXG4re1xuK1x0c3RydWN0IGNncm91cCAqcm9vdDtcbitcbitcdGlmICghY3R4LVx1MDAzZWNncm91cClcbitcdFx0cmV0dXJuIDE7XG4rXG4rXHRfX2J1aWx0aW5fbWVtc2V0KFx1MDAyNnJvb3RfcXVlcnksIDAsIHNpemVvZihyb290X3F1ZXJ5KSk7XG4rXG4rXHQvKiBUaGUgcm9vdCBjZ3JvdXAgYWx3YXlzIGhhcyBpZCAxLiAqL1xuK1x0cm9vdCA9IGJwZl9jZ3JvdXBfZnJvbV9pZCgxKTtcbitcdGlmICghcm9vdClcbitcdFx0cmV0dXJuIDA7XG4rXG4rXHQvKiBSb290IGNvdW50ZXJzIGluY2x1ZGUgYWxsIGNncm91cHMnIEkvTy4gKi9cbitcdGlmIChyZWFkX3RhcmdldF9kZXYocm9vdCwgXHUwMDI2cm9vdF9xdWVyeSkpXG4rXHRcdGdvdF9yb290X2NzcyA9IDE7XG4rXG4rXHRicGZfY2dyb3VwX3JlbGVhc2Uocm9vdCk7XG4rXHRyZXR1cm4gMDtcbit9XG4iLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xN1QyMjozNToyNS4xMzIwNzM0MDFaIiwiU2VxIjoyMywiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MTUyNzkyNDA4NzIsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIHRoZSBCbG9jayBDZ3JvdXAgQlBGIEtmdW5jIFBhdGNoIGZvciBNZW1vcnkgU2FmZXR5KipcblxuT2theSwgc28gSSdtIGxvb2tpbmcgYXQgdGhpcyBwYXRjaCBzZXJpZXMgdGhhdCBpbnRyb2R1Y2VzIEJQRiBrZnVuY3MgdG8gaXRlcmF0ZSBibG9jayBjZ3JvdXBzIChibGtjZykgYW5kIGZsdXNoIHRoZWlyIHN0YXRpc3RpY3MuIFRoZSBjb2RlIGludHJvZHVjZXMgZnVuY3Rpb25zIGxpa2UgYGJwZl9ibGtjZ19mbHVzaF9zdGF0c2AsIGBicGZfaXRlcl9ibGtnX25ld2AsIGBicGZfaXRlcl9ibGtnX25leHRgLCBhbmQgYGJwZl9pdGVyX2Jsa2dfZGVzdHJveWAuIE15IHByaW1hcnkgY29uY2VybiwgYXMgYWx3YXlzLCBpcyBtZW1vcnkgc2FmZXR5LCBzcGVjaWZpY2FsbHkgd2hldGhlciB0aGlzIHBhdGNoIGNvdWxkIGludHJvZHVjZSBhbnkgdW5pbml0aWFsaXplZCBtZW1vcnkgcmVhZHMgdGhhdCBLTVNBTiAoS2VybmVsIE1lbW9yeSBTYW5pdGl6ZXIpIG1pZ2h0IGZsYWcsIGJ1dCBLQVNBTiAoS2VybmVsIEFkZHJlc3MgU0FOaXRpemVyKSB3b3VsZG4ndC5cblxuTGV0J3MgZGl2ZSBpbnRvIHRoZSBgYnBmX2l0ZXJfYmxrZ19uZXdgIGltcGxlbWVudGF0aW9uLiBUaGUgaXRlcmF0b3Igc3RhdGUgYGl0YCBjb21lcyBmcm9tIHRoZSBCUEYgaW5mcmFzdHJ1Y3R1cmUsIGFsbG9jYXRlZCBvbiB0aGUgQlBGIHN0YWNrLCBhbmQgaXMgaW5pdGlhbGl6ZWQgZWl0aGVyIGJ5IHRoZSB2ZXJpZmllci9CUEYgcnVudGltZSBvciB0aGlzIGBfbmV3YCBmdW5jdGlvbi4gSSBzZWUgYGtpdC1cdTAwM2Vwb3NgIGFuZCBga2l0LVx1MDAzZWJsa2NnYCBhcmUgYmVpbmcgaW5pdGlhbGl6ZWQgd2l0aGluIHRoaXMgZnVuY3Rpb24uIFRoZSBzdHJ1Y3QgYGJwZl9pdGVyX2Jsa2dgIGFuZCBgYnBmX2l0ZXJfYmxrZ19rZXJuYCBhcmUgcHJvcGVybHkgc2l6ZWQsIGFuZCBgY3NzYCBpcyBjaGVja2VkLiBJZiBpdCBpc24ndCBhbiBpbyBjZ3JvdXAsIHRoZSBibGtjZyBpcyBOVUxMLiBPdGhlcndpc2UsIGBibGtjZ2AgaXMgc2V0LiBTbywgYm90aCBwb2ludGVycyBhcmUgYWx3YXlzIGluaXRpYWxpemVkIGVpdGhlciB0byBhIHZhbGlkIHZhbHVlIG9yIE5VTEwuXG5cblRoZSBgYnBmX2Jsa2NnX2ZsdXNoX3N0YXRzYCBmdW5jdGlvbiBzZWVtcyB0byBiZSBjYWxsaW5nIGBibGtjZ19maWxsX3Jvb3RfaW9zdGF0cygpYCBvciBgY3NzX3JzdGF0X2ZsdXNoKGNzcylgLiBOZWl0aGVyIG9mIHRoZXNlIGZ1bmN0aW9ucyBhcmUgZGlyZWN0bHkgc2VuZGluZyBuZXcgZGF0YSBzdHJ1Y3R1cmVzIHRvIHVzZXIgc3BhY2UgaW4gYSBtYW5uZXIgdGhhdCBjb3VsZCBsZWFrIHVuaW5pdGlhbGl6ZWQgbWVtb3J5LiBUaGUgdGVzdHMgYXJlIHJlYWRpbmcgcmVzdWx0cyB0aHJvdWdoIEJQRiBtYXBzIGFuZCBkYXRhIHNlY3Rpb25zIHdoaWNoIGlzIHRoZSBzdGFuZGFyZCBCUEYgd2F5LiBUaGlzIGlzIGdvb2Q7IG5vdGhpbmcgaXMgYmVpbmcgZXhwb3NlZCBkaXJlY3RseS5cblxuSSdtIGRvdWJsZS1jaGVja2luZyB0aGUgaW5pdGlhbGl6YXRpb24gaW4gYGJwZl9pdGVyX2Jsa2dfbmV3YC4gSWYgYGNzcy1cdTAwM2VzcyAhPSBcdTAwMjZpb19jZ3JwX3N1YnN5c2AsIGBraXQtXHUwMDNlYmxrY2dgIGlzIHNldCB0byBOVUxMLCBhbmQgYGtpdC1cdTAwM2Vwb3NgIGlzIGFscmVhZHkgTlVMTC4gT3RoZXJ3aXNlLCBpZiBpdCAqaXMqIGFuIGlvIGNncm91cCwgYGtpdC1cdTAwM2VibGtjZ2AgaXMgc2V0LiBTbywgYm90aCBmaWVsZHMgYXJlIGluaXRpYWxpemVkIGluIGFsbCBzY2VuYXJpb3MuXG5cbkkgYWxzbyBzZWUgdGhhdCBgYmxrY2dfZmlsbF9yb290X2lvc3RhdHNgIGlzIG5vdyBub24tc3RhdGljLCBhbmQgYGJwZl9ibGtjZ19mbHVzaF9zdGF0c2AgdXNlcyBgcmN1X3JlYWRfbG9ja2AgYW5kIGBjZ3JvdXBfY3NzYCwgd2hpY2ggaXMgbm9ybWFsIGZvciB0aGlzIGtpbmQgb2YgY29kZS5cblxuT2theSwgbGV0J3MgbG9vayBhdCBgYnBmX2l0ZXJfYmxrZ19uZXh0YC4gSXQncyBzdHJhaWdodGZvcndhcmQuIEl0IGRlcmVmZXJlbmNlcyBga2l0LVx1MDAzZXBvc2AgYW5kIG1vdmVzIGl0IGFsb25nIHRoZSBsaXN0LCBoYW5kbGluZyBvZmZsaW5lIGJsa2dzIGdyYWNlZnVsbHkuIFRoZSBpdGVyYXRvciBpcyBkZXNpZ25lZCB0byByZXR1cm4gTlVMTCBhZnRlciBjb21wbGV0aW9uLiBJdCBhcHBlYXJzIHRoYXQgdGhlcmUgYXJlIG5vIHVuaW5pdGlhbGl6ZWQgdmFyaWFibGVzIGF0IGFsbCBhbmQgbm8gbWVtb3J5IGxlYWtzLlxuXG5UaGVyZWZvcmUsIGdpdmVuIHRoZSBuYXR1cmUgb2YgdGhlIHBhdGNoLCBhbmQgZXNwZWNpYWxseSB0aGUgY29tcGxldGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIEJQRiBpdGVyYXRvciBzdGF0ZSwgSSdtIGNvbmNsdWRpbmcgdGhhdCB0aGlzIHBhdGNoIGRvZXNuJ3QgaW50cm9kdWNlIGFueSB1bmluaXRpYWxpemVkIG1lbW9yeSByaXNrcyB0aGF0IEtNU0FOIHdvdWxkIGNhdGNoIGJ1dCBLQVNBTiB3b3VsZG4ndC4gVGhlIEJQRiBwcm9ncmFtIHJlYWRzIHRoZSBkYXRhIHVzaW5nIGBCUEZfQ09SRV9SRUFEYCwgYW5kIHRoZXJlIGFyZSBubyBuZXcgc3RydWN0dXJlcyBjb3BpZWQgdG8gdXNlcnNwYWNlIHVzaW5nIGBjb3B5X3RvX3VzZXJgLiBJJ20gY29uZmlkZW50IHRoYXQgc3RhbmRhcmQgS0FTQU4gYW5kIHRoZSBCUEYgdmVyaWZpZXIgYXJlIGVub3VnaCB0byBjYXRjaCBhbnkgYnVncyBpbiB0aGlzIHBhdGNoLiBUaGVyZWZvcmUsIEknbSBzZXR0aW5nIGBOZWVkc0tNU0FOPWZhbHNlYC5cblxuXG4iLCJJbnB1dFRva2VucyI6OTY3MiwiT3V0cHV0VG9rZW5zIjoyNDQsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxMzY5LCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTdUMjI6MzU6NDAuNDExMzE3NjAzWiIsIlNlcSI6MjQsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InNldC1yZXN1bHRzIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTQzNzAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBzZXJpZXMgaW50cm9kdWNlcyBCUEYga2Z1bmNzIGZvciBibG9jayBjZ3JvdXAgKGJsa2NnKSBpdGVyYXRpb24gYW5kIHN0YXRpc3RpY3MgZmx1c2hpbmcgKGBicGZfYmxrY2dfZmx1c2hfc3RhdHNgLCBgYnBmX2l0ZXJfYmxrZ19uZXdgLCBgYnBmX2l0ZXJfYmxrZ19uZXh0YCwgYGJwZl9pdGVyX2Jsa2dfZGVzdHJveWApLiBUaGUgaXRlcmF0b3Igc3RhdGUgKGBzdHJ1Y3QgYnBmX2l0ZXJfYmxrZ19rZXJuYCkgaXMgZnVsbHkgaW5pdGlhbGl6ZWQgaW4gYGJwZl9pdGVyX2Jsa2dfbmV3YCBiZWZvcmUgYmVpbmcgdXNlZCBpbiBzdWJzZXF1ZW50IGNhbGxzLiBUaGVyZSBhcmUgbm8gbmV3IGtlcm5lbCBzdHJ1Y3R1cmVzIGNvcGllZCB0byB1c2VyIHNwYWNlIChlLmcuLCB2aWEgYGNvcHlfdG9fdXNlcmAgb3IgbmV0bGluayksIG5vciBhcmUgdGhlcmUgYW55IGNvbXBsZXggYWxsb2NhdGlvbnMgd2hlcmUgdW5pbml0aWFsaXplZCBmaWVsZHMgY291bGQgYmUgbGVha2VkIG9yIHVzZWQgaW4gY29udHJvbCBmbG93LiBUaGUgY2hhbmdlcyBwcmltYXJpbHkgaW52b2x2ZSBwb2ludGVyIHRyYXZlcnNhbCBhbmQgQlBGLWFjY2Vzc2libGUgcmVhZHMgb2YgZXhpc3RpbmcgaW5pdGlhbGl6ZWQgY2dyb3VwIHN0cnVjdHVyZXMuIEFueSBwb3RlbnRpYWwgbWVtb3J5IHNhZmV0eSBpc3N1ZXMsIHN1Y2ggYXMgb3V0LW9mLWJvdW5kcyBhY2Nlc3NlcyBvciB1c2UtYWZ0ZXItZnJlZSBidWdzIGR1cmluZyBpdGVyYXRpb24sIHdvdWxkIGJlIGVmZmVjdGl2ZWx5IGNhdWdodCBieSBLQVNBTiBhbmQgdGhlIEJQRiB2ZXJpZmllci4gVGhlcmVmb3JlLCBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaXMgbm90IHJlcXVpcmVkLlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2Vcbn0iLCJSZXN1bHRzIjoie1xuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIHNlcmllcyBpbnRyb2R1Y2VzIEJQRiBrZnVuY3MgZm9yIGJsb2NrIGNncm91cCAoYmxrY2cpIGl0ZXJhdGlvbiBhbmQgc3RhdGlzdGljcyBmbHVzaGluZyAoYGJwZl9ibGtjZ19mbHVzaF9zdGF0c2AsIGBicGZfaXRlcl9ibGtnX25ld2AsIGBicGZfaXRlcl9ibGtnX25leHRgLCBgYnBmX2l0ZXJfYmxrZ19kZXN0cm95YCkuIFRoZSBpdGVyYXRvciBzdGF0ZSAoYHN0cnVjdCBicGZfaXRlcl9ibGtnX2tlcm5gKSBpcyBmdWxseSBpbml0aWFsaXplZCBpbiBgYnBmX2l0ZXJfYmxrZ19uZXdgIGJlZm9yZSBiZWluZyB1c2VkIGluIHN1YnNlcXVlbnQgY2FsbHMuIFRoZXJlIGFyZSBubyBuZXcga2VybmVsIHN0cnVjdHVyZXMgY29waWVkIHRvIHVzZXIgc3BhY2UgKGUuZy4sIHZpYSBgY29weV90b191c2VyYCBvciBuZXRsaW5rKSwgbm9yIGFyZSB0aGVyZSBhbnkgY29tcGxleCBhbGxvY2F0aW9ucyB3aGVyZSB1bmluaXRpYWxpemVkIGZpZWxkcyBjb3VsZCBiZSBsZWFrZWQgb3IgdXNlZCBpbiBjb250cm9sIGZsb3cuIFRoZSBjaGFuZ2VzIHByaW1hcmlseSBpbnZvbHZlIHBvaW50ZXIgdHJhdmVyc2FsIGFuZCBCUEYtYWNjZXNzaWJsZSByZWFkcyBvZiBleGlzdGluZyBpbml0aWFsaXplZCBjZ3JvdXAgc3RydWN0dXJlcy4gQW55IHBvdGVudGlhbCBtZW1vcnkgc2FmZXR5IGlzc3Vlcywgc3VjaCBhcyBvdXQtb2YtYm91bmRzIGFjY2Vzc2VzIG9yIHVzZS1hZnRlci1mcmVlIGJ1Z3MgZHVyaW5nIGl0ZXJhdGlvbiwgd291bGQgYmUgZWZmZWN0aXZlbHkgY2F1Z2h0IGJ5IEtBU0FOIGFuZCB0aGUgQlBGIHZlcmlmaWVyLiBUaGVyZWZvcmUsIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpcyBub3QgcmVxdWlyZWQuXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiBmYWxzZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9XTsKCQkJaWYgKCFyYXdEYXRhIHx8IHJhd0RhdGEubGVuZ3RoID09PSAwKSByZXR1cm47CgoJCQlkcmF3U3VtbWFyeVRhYmxlcyhyYXdEYXRhKTsKCQkJZHJhd0R1cmF0aW9uQ2hhcnQocmF3RGF0YSk7CgkJCWRyYXdUb2tlbkNvbnN1bXB0aW9uQ2hhcnQocmF3RGF0YSk7CgkJfQoKCQlmdW5jdGlvbiBkcmF3U3VtbWFyeVRhYmxlcyhyYXdEYXRhKSB7CgkJCWNvbnN0IHN0YXRzID0gewoJCQkJbGxtOiB7IGNvdW50OiAwLCB0b2tlbnM6IDAsIGR1cmF0aW9uOiAwIH0sCgkJCQl0b29sOiB7IGNvdW50OiAwLCBkdXJhdGlvbjogMCB9CgkJCX07CgoJCQlyYXdEYXRhLmZvckVhY2gocyA9PiB7CgkJCQljb25zdCBkdXIgPSBzLkR1cmF0aW9uIC8gMTAwMDAwMDAwMDsgCgkJCQlpZiAocy5UeXBlID09PSAibGxtIikgewoJCQkJCXN0YXRzLmxsbS5jb3VudCsrOwoJCQkJCXN0YXRzLmxsbS50b2tlbnMgKz0gKHMuSW5wdXRUb2tlbnMgKyBzLk91dHB1dFRva2VucyArIHMuT3V0cHV0VGhvdWdodHNUb2tlbnMpOwoJCQkJCXN0YXRzLmxsbS5kdXJhdGlvbiArPSBkdXI7CgkJCQl9IGVsc2UgaWYgKHMuVHlwZSA9PT0gInRvb2wiKSB7CgkJCQkJc3RhdHMudG9vbC5jb3VudCsrOwoJCQkJCXN0YXRzLnRvb2wuZHVyYXRpb24gKz0gZHVyOwoJCQkJfQoJCQl9KTsKCgkJCWNvbnN0IGF2Z0xsbUR1ciA9IHN0YXRzLmxsbS5jb3VudCA+IDAgPyAoc3RhdHMubGxtLmR1cmF0aW9uIC8gc3RhdHMubGxtLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCQkJY29uc3QgYXZnTGxtVG9rZW4gPSBzdGF0cy5sbG0uY291bnQgPiAwID8gKHN0YXRzLmxsbS50b2tlbnMgLyBzdGF0cy5sbG0uY291bnQpLnRvRml4ZWQoMikgOiAwOwoJCQljb25zdCBhdmdUb29sRHVyID0gc3RhdHMudG9vbC5jb3VudCA+IDAgPyAoc3RhdHMudG9vbC5kdXJhdGlvbiAvIHN0YXRzLnRvb2wuY291bnQpLnRvRml4ZWQoMikgOiAwOwoKCQkJY29uc3QgbGxtU3VtYXJ5Q2VsbHMgPSBbc3RhdHMubGxtLmNvdW50LCBzdGF0cy5sbG0udG9rZW5zLCBhdmdMbG1Ub2tlbiwgc3RhdHMubGxtLmR1cmF0aW9uLCBhdmdMbG1EdXJdOwoJCQljb25zdCB0b29sU3VtbWFyeUNlbGxzID0gW3N0YXRzLnRvb2wuY291bnQsIHN0YXRzLnRvb2wuZHVyYXRpb24sIGF2Z1Rvb2xEdXJdOwoKCQkJY29uc3QgbGxtU3VtbWFyeUJvZHkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGxtX3N1bW1hcnlfc3RhdHNfYm9keScpOwoJCQlsbG1TdW1tYXJ5Qm9keS5pbm5lckhUTUwgPSAiIjsKCQkJY29uc3QgbGxtVHIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0cicpOwoJCQlsbG1TdW1hcnlDZWxscy5mb3JFYWNoKGNlbGwgPT4gewoJCQkJY29uc3QgdGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZCcpOwoJCQkJdGQudGV4dENvbnRlbnQgPSBjZWxsOwoJCQkJbGxtVHIuYXBwZW5kQ2hpbGQodGQpOwoJCQl9KTsKCQkJbGxtU3VtbWFyeUJvZHkuYXBwZW5kQ2hpbGQobGxtVHIpOwoKCQkJY29uc3QgdG9vbFN1bW1hcnlCb2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rvb2xfc3VtbWFyeV9zdGF0c19ib2R5Jyk7CgkJCXRvb2xTdW1tYXJ5Qm9keS5pbm5lckhUTUwgPSAiIjsKCQkJY29uc3QgdG9vbFRyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndHInKTsKCQkJdG9vbFN1bW1hcnlDZWxscy5mb3JFYWNoKGNlbGwgPT4gewoJCQkJY29uc3QgdGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZCcpOwoJCQkJdGQudGV4dENvbnRlbnQgPSBjZWxsOwoJCQkJdG9vbFRyLmFwcGVuZENoaWxkKHRkKTsKCQkJfSk7CgkJCXRvb2xTdW1tYXJ5Qm9keS5hcHBlbmRDaGlsZCh0b29sVHIpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd0R1cmF0aW9uQ2hhcnQocmF3RGF0YSkgewoJCQljb25zdCBmaWx0ZXJlZFN0ZXBzID0gcmF3RGF0YS5maWx0ZXIoZCA9PiBbImxsbSIsICJ0b29sIl0uaW5jbHVkZXMoZC5UeXBlKSk7CgkJCWNvbnN0IGRhdGEgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uRGF0YVRhYmxlKCk7CgkJCWRhdGEuYWRkQ29sdW1uKCdzdHJpbmcnLCAnU3RlcCcpOwoJCQlkYXRhLmFkZENvbHVtbignbnVtYmVyJywgJ0R1cmF0aW9uJyk7CgkJCWRhdGEuYWRkQ29sdW1uKHt0eXBlOiAnc3RyaW5nJywgcm9sZTogJ3Rvb2x0aXAnfSk7IAoKCQkJZmlsdGVyZWRTdGVwcy5mb3JFYWNoKHMgPT4gewoJCQkJCgkJCQljb25zdCBkdXIgPSBzLkR1cmF0aW9uIC8gMTAwMDAwMDAwMDsKCQkJCWxldCB0b29sdGlwID0gcy5OYW1lOwoJCQkJaWYgKHMuVHlwZSA9PT0gImxsbSIgJiYgcy5Ub29sQ2FsbHMgJiYgcy5Ub29sQ2FsbHMubGVuZ3RoID4gMCkgewoJCQkJCXRvb2x0aXAgKz0gYFxuVG9vbHM6ICR7cy5Ub29sQ2FsbHMuam9pbignLCAnKX1gOwoJCQkJfQoJCQkJZGF0YS5hZGRSb3coW2Ake3MuU2VxfWAsIGR1ciwgdG9vbHRpcF0pOwoJCQl9KTsKCgkJCWNvbnN0IG9wdGlvbnMgPSB7CgkJCQl0aXRsZTogJ1RpbWUgQ29uc3VtcHRpb24gb2YgTExNL1Rvb2wgQ2FsbHMnLAoJCQkJaEF4aXM6IHsKCQkJCQl0aXRsZTogJ0xMTS9Ub29sIFN0ZXBzJywKCQkJCX0sCgkJCQl2QXhpczogeyB0aXRsZTogJ1NlY29uZHMnIH0sCgkJCQlsZWdlbmQ6IHsgcG9zaXRpb246ICdub25lJyB9LAoJCQkJYmFyOiB7IGdyb3VwV2lkdGg6ICc3NSUnIH0sCgkJCQljaGFydEFyZWE6IHsgd2lkdGg6ICc4NSUnLCBoZWlnaHQ6ICc3MCUnIH0sCgkJCQloZWlnaHQ6IDQwMAoJCQl9OwoKCQkJY29uc3QgY2hhcnQgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uQ29sdW1uQ2hhcnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2R1cmF0aW9uX2NoYXJ0X2RpdicpKTsKCQkJY2hhcnQuZHJhdyhkYXRhLCBvcHRpb25zKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdUb2tlbkNvbnN1bXB0aW9uQ2hhcnQocmF3RGF0YSkgewoJCQljb25zdCBsbG1TdGVwcyA9IHJhd0RhdGEuZmlsdGVyKGQgPT4gZC5UeXBlID09PSAibGxtIik7CgkJCWlmIChsbG1TdGVwcy5sZW5ndGggPT09IDApIHJldHVybjsKCgkJCWNvbnN0IGRhdGEgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uRGF0YVRhYmxlKCk7CgkJCWRhdGEuYWRkQ29sdW1uKCdzdHJpbmcnLCAnU3RlcCcpOwkJCQoJCQlkYXRhLmFkZENvbHVtbignbnVtYmVyJywgJ1Rva2VucycpOwkJCQoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICdzdHlsZSd9KTsJCgkJCWRhdGEuYWRkQ29sdW1uKHt0eXBlOiAnc3RyaW5nJywgcm9sZTogJ3Rvb2x0aXAnfSk7CQoKCQkJY29uc3QgYWdlbnRDb2xvcnMgPSB7fTsKCQkJY29uc3QgcGFsZXR0ZSA9IFsnIzQyODVGNCcsICcjREI0NDM3JywgJyNGNEI0MDAnLCAnIzBGOUQ1OCcsICcjQUI0N0JDJywgJyMwMEFDQzEnXTsKCQkJbGV0IGNvbG9ySWR4ID0gMDsKCQkJY29uc3QgYWdlbnRMTE1Db3VudHMgPSB7fTsKCQkJbGxtU3RlcHMuZm9yRWFjaChzID0+IHsKCQkJCWlmICghYWdlbnRDb2xvcnNbcy5OYW1lXSkgewoJCQkJCWFnZW50Q29sb3JzW3MuTmFtZV0gPSBwYWxldHRlW2NvbG9ySWR4ICUgcGFsZXR0ZS5sZW5ndGhdOwoJCQkJCWNvbG9ySWR4Kys7CgkJCQl9CgoJCQkJYWdlbnRMTE1Db3VudHNbcy5OYW1lXSA9IChhZ2VudExMTUNvdW50c1tzLk5hbWVdIHx8IDApICsgMTsKCQkJCWNvbnN0IGxhYmVsID0gYCR7cy5OYW1lfS0ke2FnZW50TExNQ291bnRzW3MuTmFtZV19YDsKCQkJCWNvbnN0IHRvdGFsVG9rZW5zID0gcy5JbnB1dFRva2VucyArIHMuT3V0cHV0VG9rZW5zICsgcy5PdXRwdXRUaG91Z2h0c1Rva2VuczsKCQkJCWNvbnN0IHN0eWxlID0gYGNvbG9yOiAke2FnZW50Q29sb3JzW3MuTmFtZV19YDsKCQkJCWxldCB0b29sdGlwID0gYFRvdGFsIFRva2VuczogJHt0b3RhbFRva2Vuc31cbihJbjogJHtzLklucHV0VG9rZW5zfSwgT3V0OiAke3MuT3V0cHV0VG9rZW5zfSwgVGhvdWdodHM6ICR7cy5PdXRwdXRUaG91Z2h0c1Rva2Vuc30pYDsKCQkJCWlmIChzLlRvb2xDYWxscyAmJiBzLlRvb2xDYWxscy5sZW5ndGggPiAwKSB7CgkJCQkJdG9vbHRpcCArPSBgXG5Ub29sczogJHtzLlRvb2xDYWxscy5qb2luKCcsICcpfWA7CgkJCQl9CgoJCQkJZGF0YS5hZGRSb3coW2xhYmVsLCB0b3RhbFRva2Vucywgc3R5bGUsIHRvb2x0aXBdKTsKCQkJfSk7CgoJCQljb25zdCBvcHRpb25zID0gewoJCQkJdGl0bGU6ICdUb2tlbiBDb25zdW1wdGlvbiBieSBMTE0gQ2FsbHMnLAoJCQkJaEF4aXM6IHsKCQkJCQl0aXRsZTogJ0xMTSBDYWxsIFNlcXVlbmNlJywKCQkJCX0sCgkJCQl2QXhpczogeyB0aXRsZTogJ0NvbnN1bWVkIFRva2VucycgfSwKCQkJCWxlZ2VuZDogeyBwb3NpdGlvbjogJ25vbmUnIH0sCgkJCQliYXI6IHsgZ3JvdXBXaWR0aDogJzc1JScgfSwKCQkJCWNoYXJ0QXJlYTogeyB3aWR0aDogJzg1JScsIGhlaWdodDogJzcwJScgfSwKCQkJCWhlaWdodDogNDAwCgkJCX07CgoJCQljb25zdCBjaGFydCA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5Db2x1bW5DaGFydChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG9rZW5fY2hhcnRfZGl2JykpOwoJCQljaGFydC5kcmF3KGRhdGEsIG9wdGlvbnMpOwoJCX0KCQlsZXQgYWxsRXhwYW5kZWQgPSBmYWxzZTsKCQlmdW5jdGlvbiB0b2dnbGVBbGxEZXRhaWxzKCkgewoJCQlhbGxFeHBhbmRlZCA9ICFhbGxFeHBhbmRlZDsKCQkJZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnZGV0YWlscycpLmZvckVhY2goZCA9PiB7CgkJCQlpZiAoYWxsRXhwYW5kZWQpIGQuc2V0QXR0cmlidXRlKCdvcGVuJywgJycpOwoJCQkJZWxzZSBkLnJlbW92ZUF0dHJpYnV0ZSgnb3BlbicpOwoJCQl9KTsKCQl9Cgk8L3NjcmlwdD4KCgo8L2JvZHk+CjwvaHRtbD4K" },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:nil,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,} --------- Name: series-workflowmqfq4[0].run-triage(0) Phase: Succeeded StartedAt: 2026-08-17 21:57:38 +0000 UTC FinishedAt: 2026-08-17 22:35:42 +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": "2780860eddecba9ffe210bb9436eee3cf22bfcdd", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "BLK_CGROUP", "BPF_SYSCALL", "CGROUPS", "BLOCK" ], "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": "2780860eddecba9ffe210bb9436eee3cf22bfcdd", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "BLK_CGROUP", "BPF_SYSCALL", "CGROUPS", "BLOCK" ], "series_id": "e1f69090-9b52-43f2-9c8a-7b018cef8515" }, "track": "KASAN", "fuzz": { "focus": [ "bpf", "fs" ], "focus_symbols": [ "bpf_blkcg_flush_stats", "bpf_iter_blkg_new", "bpf_iter_blkg_next", "bpf_iter_blkg_destroy", "blkcg_fill_root_iostats" ], "corpus_urls": [ "https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db", "https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db" ], "skip_cover_check": false, "bug_title_re": "" }, "retest": null } ], "trajectory": "CjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KPGhlYWQ+Cgk8dGl0bGU+QUkgVHJhamVjdG9yeTwvdGl0bGU+Cgk8c3R5bGU+CgkJdGFibGUgewoJCQlib3JkZXI6IDFweCBzb2xpZCAjY2NjOwoJCQltYXJnaW46IDIwcHggNXB4OwoJCQlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwoJCQl3aGl0ZS1zcGFjZTogbm93cmFwOwoJCQl0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKCQkJb3ZlcmZsb3c6IGhpZGRlbjsKCQl9CgoJCXRhYmxlIGNhcHRpb24gewoJCQlmb250LXdlaWdodDogYm9sZDsKCQl9CgoJCXRhYmxlIHRkLCB0YWJsZSB0aCB7CgkJCXZlcnRpY2FsLWFsaWduOiB0b3A7CgkJCXBhZGRpbmc6IDJweCA4cHg7CgkJCXRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwoJCQlvdmVyZmxvdzogaGlkZGVuOwoJCX0KCgkJLmxpc3RfdGFibGUgdGQsIC5saXN0X3RhYmxlIHRoIHsKCQkJYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjY2NjOwoJCX0KCgkJLmxpc3RfdGFibGUgdGggewoJCQliYWNrZ3JvdW5kOiAjRjRGNEY0OwoJCX0KCgkJLmxpc3RfdGFibGUgdHI6bnRoLWNoaWxkKDJuKSB7CgkJCWJhY2tncm91bmQ6ICNGNEY0RjQ7CgkJfQoKCQkubGlzdF90YWJsZSB0cjpob3ZlciB7CgkJCWJhY2tncm91bmQ6ICNmZmZmOTk7CgkJfQoKCQkjYWlfZGV0YWlsc19kaXYgcHJlIHsKCQkJbWFyZ2luOiAxcHg7CgkJCW1heC13aWR0aDogMTIwY2g7CgkJCXdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKCQkJb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKCQl9Cgk8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PgoJPGgxPkFJIFRyYWplY3Rvcnk8L2gxPgoJPGJyPgoKCQoJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQk8Y2FwdGlvbj5UcmFqZWN0b3J5OiAoPGEgaHJlZj0iIyIgb25jbGljaz0idG9nZ2xlQWxsRGV0YWlscygpOyByZXR1cm4gZmFsc2U7Ij5FeHBhbmQvQ29sbGFwc2UgQWxsPC9hPik8L2NhcHRpb24+CgkJPHRoZWFkPjx0cj4KCQkJPHRoPlNlcTwvdGg+CgkJCTx0aD5UaW1lc3RhbXA8L3RoPgoJCQk8dGg+VHlwZTwvdGg+CgkJCTx0aD5OYW1lPC90aD4KCQkJPHRoPkR1cmF0aW9uPC90aD4KCQk8L3RyPjwvdGhlYWQ+CgkJPHRib2R5PgoJCQoJCTx0cj4KCQkJPHRkPjAvMDwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE3IDIyOjM0PC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MW08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0JMS19DR1JPVVAmIzM0OywKICAgICYjMzQ7QlBGX1NZU0NBTEwmIzM0OywKICAgICYjMzQ7Q0dST1VQUyYjMzQ7LAogICAgJiMzNDtCTE9DSyYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O2JwZl9ibGtjZ19mbHVzaF9zdGF0cyYjMzQ7LAogICAgJiMzNDticGZfaXRlcl9ibGtnX25ldyYjMzQ7LAogICAgJiMzNDticGZfaXRlcl9ibGtnX25leHQmIzM0OywKICAgICYjMzQ7YnBmX2l0ZXJfYmxrZ19kZXN0cm95JiMzNDssCiAgICAmIzM0O2Jsa2NnX2ZpbGxfcm9vdF9pb3N0YXRzJiMzNDsKICBdLAogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggc2VyaWVzIGludHJvZHVjZXMgQlBGIGtmdW5jcyBmb3IgYmxvY2sgY2dyb3VwIChibGtjZykgaXRlcmF0aW9uIGFuZCBzdGF0aXN0aWNzIGZsdXNoaW5nIChgYnBmX2Jsa2NnX2ZsdXNoX3N0YXRzYCwgYGJwZl9pdGVyX2Jsa2dfbmV3YCwgYGJwZl9pdGVyX2Jsa2dfbmV4dGAsIGBicGZfaXRlcl9ibGtnX2Rlc3Ryb3lgKS4gVGhlIGl0ZXJhdG9yIHN0YXRlIChgc3RydWN0IGJwZl9pdGVyX2Jsa2dfa2VybmApIGlzIGZ1bGx5IGluaXRpYWxpemVkIGluIGBicGZfaXRlcl9ibGtnX25ld2AgYmVmb3JlIGJlaW5nIHVzZWQgaW4gc3Vic2VxdWVudCBjYWxscy4gVGhlcmUgYXJlIG5vIG5ldyBrZXJuZWwgc3RydWN0dXJlcyBjb3BpZWQgdG8gdXNlciBzcGFjZSAoZS5nLiwgdmlhIGBjb3B5X3RvX3VzZXJgIG9yIG5ldGxpbmspLCBub3IgYXJlIHRoZXJlIGFueSBjb21wbGV4IGFsbG9jYXRpb25zIHdoZXJlIHVuaW5pdGlhbGl6ZWQgZmllbGRzIGNvdWxkIGJlIGxlYWtlZCBvciB1c2VkIGluIGNvbnRyb2wgZmxvdy4gVGhlIGNoYW5nZXMgcHJpbWFyaWx5IGludm9sdmUgcG9pbnRlciB0cmF2ZXJzYWwgYW5kIEJQRi1hY2Nlc3NpYmxlIHJlYWRzIG9mIGV4aXN0aW5nIGluaXRpYWxpemVkIGNncm91cCBzdHJ1Y3R1cmVzLiBBbnkgcG90ZW50aWFsIG1lbW9yeSBzYWZldHkgaXNzdWVzLCBzdWNoIGFzIG91dC1vZi1ib3VuZHMgYWNjZXNzZXMgb3IgdXNlLWFmdGVyLWZyZWUgYnVncyBkdXJpbmcgaXRlcmF0aW9uLCB3b3VsZCBiZSBlZmZlY3RpdmVseSBjYXVnaHQgYnkgS0FTQU4gYW5kIHRoZSBCUEYgdmVyaWZpZXIuIFRoZXJlZm9yZSwgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGlzIG5vdCByZXF1aXJlZC4mIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UsCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggaW50cm9kdWNlcyBuZXcgQlBGIGtmdW5jcyBmb3IgYmxvY2sgY2dyb3VwIEkvTyBzdGF0aXN0aWNzLCB3aGljaCBhcmUgcmVhY2hhYmxlIGZyb20gQlBGIHByb2dyYW1zLiBUaGVzZSBmdW5jdGlvbnMgYWxsb3cgQlBGIHByb2dyYW1zIHRvIGZsdXNoIGJsb2NrIGNncm91cCBzdGF0cyBhbmQgaXRlcmF0ZSBvdmVyIHBlci1kZXZpY2UgYmxrZ3MuIFRoZSBjaGFuZ2VzIGFyZSBmdW5jdGlvbmFsbHkgc2lnbmlmaWNhbnQgYW5kIHNob3VsZCBiZSBmdXp6ZWQuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MS8xPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTcgMjI6MzQ8L3RkPgoJCQk8dGQ+YWN0aW9uPC90ZD4KCQkJPHRkPnJlYWQtcGF0Y2gtZGlmZjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O1BhdGNoRGlmZiYjMzQ7OiAmIzM0O2NvbW1pdCA3NzMwMDM2M2ZlOWM1YjBhZmMzNmQ5Zjc0ZWFkYjQxYmE2ZGQ1M2E1XG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIE1vbiBBdWcgMTcgMjI6MzQ6MzIgMjAyNiAmIzQzOzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvTUFJTlRBSU5FUlMgYi9NQUlOVEFJTkVSU1xuaW5kZXggMmY5NDcyYzFhMDkwNy4uODdjNTZlOTU1NTc3MSAxMDA2NDRcbi0tLSBhL01BSU5UQUlORVJTXG4mIzQzOyYjNDM7JiM0MzsgYi9NQUlOVEFJTkVSU1xuQEAgLTY2MTcsNiAmIzQzOzY2MTcsNyBAQCBGOlx0YmxvY2svYmxrLWNncm91cC5jXG4gRjpcdGJsb2NrL2Jsay1pb2Nvc3QuY1xuIEY6XHRibG9jay9ibGstaW9sYXRlbmN5LmNcbiBGOlx0YmxvY2svYmxrLXRocm90dGxlLmNcbiYjNDM7RjpcdGJsb2NrL2JwZl9ibGtjZy5jXG4gRjpcdGluY2x1ZGUvbGludXgvYmxrLWNncm91cC5oXG4gXG4gQ09OVFJPTCBHUk9VUCAtIENQVVNFVFxuZGlmZiAtLWdpdCBhL2Jsb2NrL01ha2VmaWxlIGIvYmxvY2svTWFrZWZpbGVcbmluZGV4IGU3YmQzMjBlM2Q2OTcuLjU3MmU0OTk4OGM4ZWUgMTAwNjQ0XG4tLS0gYS9ibG9jay9NYWtlZmlsZVxuJiM0MzsmIzQzOyYjNDM7IGIvYmxvY2svTWFrZWZpbGVcbkBAIC0xNyw2ICYjNDM7MTcsOSBAQCBvYmotJChDT05GSUdfQkxLX0VSUk9SX0lOSkVDVElPTikgJiM0Mzs9IGVycm9yLWluamVjdGlvbi5vXG4gb2JqLSQoQ09ORklHX0JMS19ERVZfQlNHX0NPTU1PTikgJiM0Mzs9IGJzZy5vXG4gb2JqLSQoQ09ORklHX0JMS19ERVZfQlNHTElCKVx0JiM0Mzs9IGJzZy1saWIub1xuIG9iai0kKENPTkZJR19CTEtfQ0dST1VQKVx0JiM0Mzs9IGJsay1jZ3JvdXAub1xuJiM0MztpZmRlZiBDT05GSUdfQlBGX1NZU0NBTExcbiYjNDM7b2JqLSQoQ09ORklHX0JMS19DR1JPVVApXHQmIzQzOz0gYnBmX2Jsa2NnLm9cbiYjNDM7ZW5kaWZcbiBvYmotJChDT05GSUdfQkxLX0NHUk9VUF9SV1NUQVQpXHQmIzQzOz0gYmxrLWNncm91cC1yd3N0YXQub1xuIG9iai0kKENPTkZJR19CTEtfQ0dST1VQX0ZDX0FQUElEKSAmIzQzOz0gYmxrLWNncm91cC1mYy1hcHBpZC5vXG4gb2JqLSQoQ09ORklHX0JMS19ERVZfVEhST1RUTElORylcdCYjNDM7PSBibGstdGhyb3R0bGUub1xuZGlmZiAtLWdpdCBhL2Jsb2NrL2Jsay1jZ3JvdXAuYyBiL2Jsb2NrL2Jsay1jZ3JvdXAuY1xuaW5kZXggZDk2NzYxMjZjNWI1ZC4uOGQ1MzhhZDRlODYxYyAxMDA2NDRcbi0tLSBhL2Jsb2NrL2Jsay1jZ3JvdXAuY1xuJiM0MzsmIzQzOyYjNDM7IGIvYmxvY2svYmxrLWNncm91cC5jXG5AQCAtMTA4Niw3ICYjNDM7MTA4Niw3IEBAIHN0YXRpYyB2b2lkIGJsa2NnX3JzdGF0X2ZsdXNoKHN0cnVjdCBjZ3JvdXBfc3Vic3lzX3N0YXRlICpjc3MsIGludCBjcHUpXG4gICogZmx1c2hpbmcgdGhlIHJvb3QgY2dyb3VwJiMzOTtzIHN0YXRzIGJ5IGV4cGxpY2l0bHkgZmlsbGluZyBpbiB0aGUgaW9zdGF0XG4gICogd2l0aCBkaXNrIGxldmVsIHN0YXRpc3RpY3MuXG4gICovXG4tc3RhdGljIHZvaWQgYmxrY2dfZmlsbF9yb290X2lvc3RhdHModm9pZClcbiYjNDM7dm9pZCBibGtjZ19maWxsX3Jvb3RfaW9zdGF0cyh2b2lkKVxuIHtcbiBcdHN0cnVjdCBjbGFzc19kZXZfaXRlciBpdGVyO1xuIFx0c3RydWN0IGRldmljZSAqZGV2O1xuZGlmZiAtLWdpdCBhL2Jsb2NrL2Jsay1jZ3JvdXAuaCBiL2Jsb2NrL2Jsay1jZ3JvdXAuaFxuaW5kZXggNjE1MzkwZjc1MWFhMi4uOGM5YzJhMWFkZmFhNCAxMDA2NDRcbi0tLSBhL2Jsb2NrL2Jsay1jZ3JvdXAuaFxuJiM0MzsmIzQzOyYjNDM7IGIvYmxvY2svYmxrLWNncm91cC5oXG5AQCAtMjA1LDYgJiM0MzsyMDUsNyBAQCB2b2lkIGJsa2NnX2RlYWN0aXZhdGVfcG9saWN5KHN0cnVjdCBnZW5kaXNrICpkaXNrLFxuIFx0XHRcdCAgICAgY29uc3Qgc3RydWN0IGJsa2NnX3BvbGljeSAqcG9sKTtcbiBcbiBjb25zdCBjaGFyICpibGtnX2Rldl9uYW1lKHN0cnVjdCBibGtjZ19ncSAqYmxrZyk7XG4mIzQzO3ZvaWQgYmxrY2dfZmlsbF9yb290X2lvc3RhdHModm9pZCk7XG4gdm9pZCBibGtjZ19wcmludF9ibGtncyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNmLCBzdHJ1Y3QgYmxrY2cgKmJsa2NnLFxuIFx0XHQgICAgICAgdTY0ICgqcHJmaWxsKShzdHJ1Y3Qgc2VxX2ZpbGUgKixcbiBcdFx0XHRcdCAgICAgc3RydWN0IGJsa2dfcG9saWN5X2RhdGEgKiwgaW50KSxcbmRpZmYgLS1naXQgYS9ibG9jay9icGZfYmxrY2cuYyBiL2Jsb2NrL2JwZl9ibGtjZy5jXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uMjVjODA5ZjUwOTFjMlxuLS0tIC9kZXYvbnVsbFxuJiM0MzsmIzQzOyYjNDM7IGIvYmxvY2svYnBmX2Jsa2NnLmNcbkBAIC0wLDAgJiM0MzsxLDE1NCBAQFxuJiM0MzsvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vci1sYXRlclxuJiM0MzsvKlxuJiM0MzsgKiBCbG9jayBJL08gQ29udHJvbGxlci1yZWxhdGVkIEJQRiBrZnVuY3MgYW5kIGF1eGlsaWFyeSBjb2RlXG4mIzQzOyAqL1xuJiM0MztcbiYjNDM7I2luY2x1ZGUgXCYjMzQ7YmxrLWNncm91cC5oXCYjMzQ7XG4mIzQzO1xuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9icGYuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9idGZfaWRzLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjbGludXgvcmN1bGlzdC5oXHUwMDNlXG4mIzQzO1xuJiM0MztfX2JwZl9rZnVuY19zdGFydF9kZWZzKCk7XG4mIzQzO1xuJiM0MzsvKipcbiYjNDM7ICogYnBmX2Jsa2NnX2ZsdXNoX3N0YXRzIC0gRmx1c2ggYSBibG9jayBjZ3JvdXAmIzM5O3MgaW8gc3RhdGlzdGljc1xuJiM0MzsgKiBAY2dycDogY2dyb3VwIHRvIGZsdXNoXG4mIzQzOyAqXG4mIzQzOyAqIFByb3BhZ2F0ZSBJL08gc3RhdGlzdGljcyB1cCB0aGUgY2dyb3VwIHRyZWUuIFJvb3Qgc3RhdGlzdGljcyBjb21lIGZyb21cbiYjNDM7ICogYmxvY2sgZGV2aWNlcyBhbmQgaW5jbHVkZSBhbGwgY2dyb3VwcyYjMzk7IEkvTy5cbiYjNDM7ICovXG4mIzQzO19fYnBmX2tmdW5jIHZvaWQgYnBmX2Jsa2NnX2ZsdXNoX3N0YXRzKHN0cnVjdCBjZ3JvdXAgKmNncnApXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgY2dyb3VwX3N1YnN5c19zdGF0ZSAqY3NzO1xuJiM0MztcbiYjNDM7XHQvKiBQaW4gdGhlIGNzcyBmb3IgdGhlIHNsZWVwYWJsZSBmbHVzaC4gKi9cbiYjNDM7XHRyY3VfcmVhZF9sb2NrKCk7XG4mIzQzO1x0Y3NzID0gY2dyb3VwX2NzcyhjZ3JwLCBcdTAwMjZpb19jZ3JwX3N1YnN5cyk7XG4mIzQzO1x0aWYgKGNzcyBcdTAwMjZcdTAwMjYgIWNzc190cnlnZXQoY3NzKSlcbiYjNDM7XHRcdGNzcyA9IE5VTEw7XG4mIzQzO1x0cmN1X3JlYWRfdW5sb2NrKCk7XG4mIzQzO1xuJiM0MztcdGlmICghY3NzKVxuJiM0MztcdFx0cmV0dXJuO1xuJiM0MztcbiYjNDM7XHRpZiAoIWNzcy1cdTAwM2VwYXJlbnQpXG4mIzQzO1x0XHRibGtjZ19maWxsX3Jvb3RfaW9zdGF0cygpO1xuJiM0MztcdGVsc2VcbiYjNDM7XHRcdGNzc19yc3RhdF9mbHVzaChjc3MpO1xuJiM0MztcbiYjNDM7XHRjc3NfcHV0KGNzcyk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0cnVjdCBicGZfaXRlcl9ibGtnIHtcbiYjNDM7XHRfX3U2NCBfX29wYXF1ZVsyXTtcbiYjNDM7fSBfX2FsaWduZWQoOCk7XG4mIzQzO1xuJiM0MztzdHJ1Y3QgYnBmX2l0ZXJfYmxrZ19rZXJuIHtcbiYjNDM7XHRzdHJ1Y3QgYmxrY2cgKmJsa2NnO1xuJiM0MztcdHN0cnVjdCBibGtjZ19ncSAqcG9zO1xuJiM0Mzt9IF9fYWxpZ25lZCg4KTtcbiYjNDM7XG4mIzQzOy8qKlxuJiM0MzsgKiBicGZfaXRlcl9ibGtnX25ldyAtIFN0YXJ0IGl0ZXJhdGluZyBhIGJsb2NrIGNncm91cCYjMzk7cyBwZXItZGV2aWNlIGJsa2dzXG4mIzQzOyAqIEBpdDogaXRlcmF0b3IgdG8gaW5pdGlhbGl6ZVxuJiM0MzsgKiBAY3NzOiB0aGUgaW8gY29udHJvbGxlciYjMzk7cyBjc3NcbiYjNDM7ICpcbiYjNDM7ICogRWFjaCBibGtnIGhvbGRzIG9uZSBkZXZpY2UmIzM5O3MgaW8uc3RhdCBjb3VudGVycy4gT2ZmbGluZSBibGtncyBhcmUgc2tpcHBlZC5cbiYjNDM7ICogQSBibGtnIHdpdGhvdXQgYSBkaXNrIGNhbiBiZSByZXR1cm5lZC4gTXVzdCBydW4gdW5kZXIgUkNVLlxuJiM0MzsgKlxuJiM0MzsgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgLUVJTlZBTCBpZiBAY3NzIGlzIG5vdCB0aGUgaW8gY29udHJvbGxlciYjMzk7cy5cbiYjNDM7ICovXG4mIzQzO19fYnBmX2tmdW5jIGludCBicGZfaXRlcl9ibGtnX25ldyhzdHJ1Y3QgYnBmX2l0ZXJfYmxrZyAqaXQsXG4mIzQzO1x0XHRcdFx0ICBzdHJ1Y3QgY2dyb3VwX3N1YnN5c19zdGF0ZSAqY3NzKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IGJwZl9pdGVyX2Jsa2dfa2VybiAqa2l0ID0gKHZvaWQgKilpdDtcbiYjNDM7XG4mIzQzO1x0QlVJTERfQlVHX09OKHNpemVvZihzdHJ1Y3QgYnBmX2l0ZXJfYmxrZ19rZXJuKSBcdTAwM2Ugc2l6ZW9mKHN0cnVjdCBicGZfaXRlcl9ibGtnKSk7XG4mIzQzO1x0QlVJTERfQlVHX09OKF9fYWxpZ25vZl9fKHN0cnVjdCBicGZfaXRlcl9ibGtnX2tlcm4pICE9XG4mIzQzO1x0XHQgICAgIF9fYWxpZ25vZl9fKHN0cnVjdCBicGZfaXRlcl9ibGtnKSk7XG4mIzQzO1xuJiM0MztcdGtpdC1cdTAwM2Vwb3MgPSBOVUxMO1xuJiM0MztcbiYjNDM7XHRpZiAoY3NzLVx1MDAzZXNzICE9IFx1MDAyNmlvX2NncnBfc3Vic3lzKSB7XG4mIzQzO1x0XHRraXQtXHUwMDNlYmxrY2cgPSBOVUxMO1xuJiM0MztcdFx0cmV0dXJuIC1FSU5WQUw7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRraXQtXHUwMDNlYmxrY2cgPSBjc3NfdG9fYmxrY2coY3NzKTtcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LyoqXG4mIzQzOyAqIGJwZl9pdGVyX2Jsa2dfbmV4dCAtIFJldHVybiB0aGUgbmV4dCBvbmxpbmUgYmxrZyBvZiB0aGUgaXRlcmF0ZWQgYmxvY2sgY2dyb3VwXG4mIzQzOyAqIEBpdDogaXRlcmF0b3JcbiYjNDM7ICpcbiYjNDM7ICogUmV0dXJuOiB0aGUgbmV4dCBvbmxpbmUgYmxrZywgb3IgTlVMTCB3aGVuIHRoZSB3YWxrIGlzIGRvbmUuXG4mIzQzOyAqL1xuJiM0MztfX2JwZl9rZnVuYyBzdHJ1Y3QgYmxrY2dfZ3EgKmJwZl9pdGVyX2Jsa2dfbmV4dChzdHJ1Y3QgYnBmX2l0ZXJfYmxrZyAqaXQpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgYnBmX2l0ZXJfYmxrZ19rZXJuICpraXQgPSAodm9pZCAqKWl0O1xuJiM0MztcdHN0cnVjdCBibGtjZ19ncSAqYmxrZyA9IGtpdC1cdTAwM2Vwb3M7XG4mIzQzO1x0c3RydWN0IGhsaXN0X25vZGUgKm5vZGU7XG4mIzQzO1xuJiM0MztcdGlmICgha2l0LVx1MDAzZWJsa2NnKVxuJiM0MztcdFx0cmV0dXJuIE5VTEw7XG4mIzQzO1xuJiM0MztcdGlmICghYmxrZylcbiYjNDM7XHRcdG5vZGUgPSByY3VfZGVyZWZlcmVuY2UoaGxpc3RfZmlyc3RfcmN1KFx1MDAyNmtpdC1cdTAwM2VibGtjZy1cdTAwM2VibGtnX2xpc3QpKTtcbiYjNDM7XHRlbHNlXG4mIzQzO1x0XHRub2RlID0gcmN1X2RlcmVmZXJlbmNlKGhsaXN0X25leHRfcmN1KFx1MDAyNmJsa2ctXHUwMDNlYmxrY2dfbm9kZSkpO1xuJiM0MztcbiYjNDM7XHQvKiBTa2lwIG9mZmxpbmUgYmxrZ3MsIG1hdGNoaW5nIGlvLnN0YXQuICovXG4mIzQzO1x0d2hpbGUgKG5vZGUpIHtcbiYjNDM7XHRcdGJsa2cgPSBobGlzdF9lbnRyeShub2RlLCBzdHJ1Y3QgYmxrY2dfZ3EsIGJsa2NnX25vZGUpO1xuJiM0MztcdFx0LyogQSByYWNlIG9ubHkgY2hhbmdlcyB3aGV0aGVyIHRoaXMgYmxrZyBpcyByZXR1cm5lZC4gKi9cbiYjNDM7XHRcdGlmIChkYXRhX3JhY2UoYmxrZy1cdTAwM2VvbmxpbmUpKSB7XG4mIzQzO1x0XHRcdGtpdC1cdTAwM2Vwb3MgPSBibGtnO1xuJiM0MztcdFx0XHRyZXR1cm4gYmxrZztcbiYjNDM7XHRcdH1cbiYjNDM7XHRcdG5vZGUgPSByY3VfZGVyZWZlcmVuY2UoaGxpc3RfbmV4dF9yY3UoXHUwMDI2YmxrZy1cdTAwM2VibGtjZ19ub2RlKSk7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHQvKiBUaGUgaXRlcmF0b3IgbXVzdCBrZWVwIHJldHVybmluZyBOVUxMIGFmdGVyIGNvbXBsZXRpb24uICovXG4mIzQzO1x0a2l0LVx1MDAzZXBvcyA9IE5VTEw7XG4mIzQzO1x0a2l0LVx1MDAzZWJsa2NnID0gTlVMTDtcbiYjNDM7XHRyZXR1cm4gTlVMTDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LyoqXG4mIzQzOyAqIGJwZl9pdGVyX2Jsa2dfZGVzdHJveSAtIFRlYXIgZG93biBhIGJsa2cgaXRlcmF0b3JcbiYjNDM7ICogQGl0OiBpdGVyYXRvclxuJiM0MzsgKi9cbiYjNDM7X19icGZfa2Z1bmMgdm9pZCBicGZfaXRlcl9ibGtnX2Rlc3Ryb3koc3RydWN0IGJwZl9pdGVyX2Jsa2cgKml0KVxuJiM0Mzt7XG4mIzQzO31cbiYjNDM7XG4mIzQzO19fYnBmX2tmdW5jX2VuZF9kZWZzKCk7XG4mIzQzO1xuJiM0MztCVEZfS0ZVTkNTX1NUQVJUKGJwZl9ibGtjZ19rZnVuY3MpXG4mIzQzO0JURl9JRF9GTEFHUyhmdW5jLCBicGZfYmxrY2dfZmx1c2hfc3RhdHMsIEtGX1NMRUVQQUJMRSlcbiYjNDM7XG4mIzQzO0JURl9JRF9GTEFHUyhmdW5jLCBicGZfaXRlcl9ibGtnX25ldyxcbiYjNDM7XHQgICAgIEtGX0lURVJfTkVXIHwgS0ZfUkNVIHwgS0ZfUkNVX1BST1RFQ1RFRClcbiYjNDM7QlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9pdGVyX2Jsa2dfbmV4dCwgS0ZfSVRFUl9ORVhUIHwgS0ZfUkVUX05VTEwpXG4mIzQzO0JURl9JRF9GTEFHUyhmdW5jLCBicGZfaXRlcl9ibGtnX2Rlc3Ryb3ksIEtGX0lURVJfREVTVFJPWSlcbiYjNDM7QlRGX0tGVU5DU19FTkQoYnBmX2Jsa2NnX2tmdW5jcylcbiYjNDM7XG4mIzQzO3N0YXRpYyBjb25zdCBzdHJ1Y3QgYnRmX2tmdW5jX2lkX3NldCBicGZfYmxrY2dfa2Z1bmNfc2V0ID0ge1xuJiM0MztcdC5vd25lclx0XHQ9IFRISVNfTU9EVUxFLFxuJiM0MztcdC5zZXRcdFx0PSBcdTAwMjZicGZfYmxrY2dfa2Z1bmNzLFxuJiM0Mzt9O1xuJiM0MztcbiYjNDM7c3RhdGljIGludCBfX2luaXQgYnBmX2Jsa2NnX2luaXQodm9pZClcbiYjNDM7e1xuJiM0MztcdGludCBlcnI7XG4mIzQzO1xuJiM0MztcdGVyciA9IHJlZ2lzdGVyX2J0Zl9rZnVuY19pZF9zZXQoQlBGX1BST0dfVFlQRV9VTlNQRUMsXG4mIzQzO1x0XHRcdFx0XHRcdTAwMjZicGZfYmxrY2dfa2Z1bmNfc2V0KTtcbiYjNDM7XHRpZiAoZXJyKVxuJiM0MztcdFx0cHJfd2FybihcJiMzNDtlcnJvciB3aGlsZSByZWdpc3RlcmluZyBicGYgYmxrY2cga2Z1bmNzOiAlZFxcblwmIzM0OywgZXJyKTtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIGVycjtcbiYjNDM7fVxuJiM0MztsYXRlX2luaXRjYWxsKGJwZl9ibGtjZ19pbml0KTtcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvY2dyb3VwX2l0ZXJfaW8uaCBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9jZ3JvdXBfaXRlcl9pby5oXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uZjRiYmFhY2NkZjcxNlxuLS0tIC9kZXYvbnVsbFxuJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL2Nncm91cF9pdGVyX2lvLmhcbkBAIC0wLDAgJiM0MzsxLDE3IEBAXG4mIzQzOy8qIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wICovXG4mIzQzOy8qIENvcHlyaWdodCAoYykgMjAyNSBNZXRhIFBsYXRmb3JtcywgSW5jLiBhbmQgYWZmaWxpYXRlcy4gKi9cbiYjNDM7I2lmbmRlZiBfX0NHUk9VUF9JVEVSX0lPX0hcbiYjNDM7I2RlZmluZSBfX0NHUk9VUF9JVEVSX0lPX0hcbiYjNDM7XG4mIzQzO3N0cnVjdCBpb19xdWVyeSB7XG4mIzQzO1x0Lyogb25lIGRldmljZSYjMzk7cyBpby5zdGF0IGNvdW50ZXJzICovXG4mIzQzO1x0X191NjQgcmJ5dGVzO1xuJiM0MztcdF9fdTY0IHdieXRlcztcbiYjNDM7XHRfX3U2NCByaW9zO1xuJiM0MztcdF9fdTY0IHdpb3M7XG4mIzQzO1x0X191NjQgZGJ5dGVzO1xuJiM0MztcdF9fdTY0IGRpb3M7XG4mIzQzO1x0X191NjQgZGV2O1x0LyogZGV2X3Qgb2YgdGhlIGRldmljZSB0aGUgY291bnRlcnMgYmVsb25nIHRvICovXG4mIzQzO307XG4mIzQzO1xuJiM0MzsjZW5kaWYgLyogX19DR1JPVVBfSVRFUl9JT19IICovXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL2NvbmZpZyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9jb25maWdcbmluZGV4IGVhNzA0NGYzMGFkYzMuLjI3MGU2YmY5MTk0ZDIgMTAwNjQ0XG4tLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvY29uZmlnXG4mIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvY29uZmlnXG5AQCAtMSwzICYjNDM7MSw0IEBAXG4mIzQzO0NPTkZJR19CTEtfQ0dST1VQPXlcbiBDT05GSUdfQkxLX0RFVl9MT09QPXlcbiBDT05GSUdfQk9PVFBBUkFNX0hBUkRMT0NLVVBfUEFOSUM9eVxuIENPTkZJR19CT09UUEFSQU1fU09GVExPQ0tVUF9QQU5JQz0xXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvY2dyb3VwX2l0ZXJfaW8uYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2Nncm91cF9pdGVyX2lvLmNcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwLi41ZDI3ZTVkMjgzNzk1XG4tLS0gL2Rldi9udWxsXG4mIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9jZ3JvdXBfaXRlcl9pby5jXG5AQCAtMCwwICYjNDM7MSwyNzcgQEBcbiYjNDM7Ly8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcbiYjNDM7LyogQ29weXJpZ2h0IChjKSAyMDI1IE1ldGEgUGxhdGZvcm1zLCBJbmMuIGFuZCBhZmZpbGlhdGVzLiAqL1xuJiM0MzsjZGVmaW5lIF9HTlVfU09VUkNFXG4mIzQzOyNpbmNsdWRlIFx1MDAzY3Rlc3RfcHJvZ3MuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NicGYvbGliYnBmLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjZmNudGwuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9sb29wLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjc3RkbGliLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjc3RyaW5nLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjc3lzL2lvY3RsLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjc3lzL3N0YXQuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NzeXMvc3lzbWFjcm9zLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjdW5pc3RkLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXCYjMzQ7Y2dyb3VwX2hlbHBlcnMuaFwmIzM0O1xuJiM0MzsjaW5jbHVkZSBcJiMzNDtjZ3JvdXBfaXRlcl9pby5oXCYjMzQ7XG4mIzQzOyNpbmNsdWRlIFwmIzM0O2Nncm91cF9pdGVyX2lvLnNrZWwuaFwmIzM0O1xuJiM0MztcbiYjNDM7I2RlZmluZSBJT19TSVpFICg0ICogMTAyNCAqIDEwMjQpXG4mIzQzO1xuJiM0MztzdGF0aWMgaW50IHJlYWRfc3RhdHMoc3RydWN0IGJwZl9saW5rICpsaW5rKVxuJiM0Mzt7XG4mIzQzO1x0aW50IGZkLCByZXQgPSAwO1xuJiM0MztcdHNzaXplX3QgYnl0ZXM7XG4mIzQzO1xuJiM0MztcdGZkID0gYnBmX2l0ZXJfY3JlYXRlKGJwZl9saW5rX19mZChsaW5rKSk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0tfRkQoZmQsIFwmIzM0O2JwZl9pdGVyX2NyZWF0ZVwmIzM0OykpXG4mIzQzO1x0XHRyZXR1cm4gMTtcbiYjNDM7XG4mIzQzO1x0LyogUmVzdWx0cyBsYW5kIGluIHNrZWwtXHUwMDNlZGF0YV9xdWVyeTsgdGhlIHJlYWQgaXRzZWxmIHJldHVybnMgbm8gZGF0YS4gKi9cbiYjNDM7XHRieXRlcyA9IHJlYWQoZmQsIE5VTEwsIDApO1xuJiM0MztcdGlmICghQVNTRVJUX0VRKGJ5dGVzLCAwLCBcJiMzNDtyZWFkIGZkXCYjMzQ7KSlcbiYjNDM7XHRcdHJldCA9IDE7XG4mIzQzO1xuJiM0MztcdGNsb3NlKGZkKTtcbiYjNDM7XHRyZXR1cm4gcmV0O1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKiBTZXQgdXAgYSBsb29wIGRldmljZSBmb3IgY2dyb3VwLWNoYXJnZWQgSS9PLiAqL1xuJiM0MztzdGF0aWMgaW50IGxvb3Bfc2V0dXAoY2hhciAqbG9vcF9wYXRoLCBzaXplX3Qgc3osIGludCAqY3RsX2ZkLCBpbnQgKmxvb3BfZmQsXG4mIzQzO1x0XHQgICAgICBpbnQgKmJhY2tfZmQpXG4mIzQzO3tcbiYjNDM7XHRjaGFyIGJhY2tfcGF0aFtdID0gXCYjMzQ7L3RtcC9jZ3JvdXBfaXRlcl9pby5YWFhYWFhcJiMzNDs7XG4mIzQzO1x0aW50IG5yO1xuJiM0MztcbiYjNDM7XHQqY3RsX2ZkID0gKmxvb3BfZmQgPSAqYmFja19mZCA9IC0xO1xuJiM0MztcbiYjNDM7XHQqY3RsX2ZkID0gb3BlbihcJiMzNDsvZGV2L2xvb3AtY29udHJvbFwmIzM0OywgT19SRFdSIHwgT19DTE9FWEVDKTtcbiYjNDM7XHRpZiAoKmN0bF9mZCBcdTAwM2MgMClcbiYjNDM7XHRcdHJldHVybiAtMTtcbiYjNDM7XG4mIzQzO1x0bnIgPSBpb2N0bCgqY3RsX2ZkLCBMT09QX0NUTF9HRVRfRlJFRSk7XG4mIzQzO1x0aWYgKG5yIFx1MDAzYyAwKVxuJiM0MztcdFx0Z290byBlcnI7XG4mIzQzO1x0c25wcmludGYobG9vcF9wYXRoLCBzeiwgXCYjMzQ7L2Rldi9sb29wJWRcJiMzNDssIG5yKTtcbiYjNDM7XG4mIzQzO1x0KmJhY2tfZmQgPSBta3N0ZW1wKGJhY2tfcGF0aCk7XG4mIzQzO1x0aWYgKCpiYWNrX2ZkIFx1MDAzYyAwKVxuJiM0MztcdFx0Z290byBlcnI7XG4mIzQzO1x0dW5saW5rKGJhY2tfcGF0aCk7XG4mIzQzO1x0aWYgKGZ0cnVuY2F0ZSgqYmFja19mZCwgKG9mZl90KUlPX1NJWkUgKiA0KSlcbiYjNDM7XHRcdGdvdG8gZXJyO1xuJiM0MztcbiYjNDM7XHQqbG9vcF9mZCA9IG9wZW4obG9vcF9wYXRoLCBPX1JEV1IgfCBPX0NMT0VYRUMpO1xuJiM0MztcdGlmICgqbG9vcF9mZCBcdTAwM2MgMClcbiYjNDM7XHRcdGdvdG8gZXJyO1xuJiM0MztcdGlmIChpb2N0bCgqbG9vcF9mZCwgTE9PUF9TRVRfRkQsICpiYWNrX2ZkKSlcbiYjNDM7XHRcdGdvdG8gZXJyO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7ZXJyOlxuJiM0MztcdGlmICgqbG9vcF9mZCBcdTAwM2U9IDApXG4mIzQzO1x0XHRjbG9zZSgqbG9vcF9mZCk7XG4mIzQzO1x0aWYgKCpiYWNrX2ZkIFx1MDAzZT0gMClcbiYjNDM7XHRcdGNsb3NlKCpiYWNrX2ZkKTtcbiYjNDM7XHRjbG9zZSgqY3RsX2ZkKTtcbiYjNDM7XHQqY3RsX2ZkID0gKmxvb3BfZmQgPSAqYmFja19mZCA9IC0xO1xuJiM0MztcdHJldHVybiAtMTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIHZvaWQgbG9vcF90ZWFyZG93bihjb25zdCBjaGFyICpsb29wX3BhdGgsIGludCBjdGxfZmQsIGludCBsb29wX2ZkLFxuJiM0MztcdFx0XHQgIGludCBiYWNrX2ZkKVxuJiM0Mzt7XG4mIzQzO1x0aW50IG5yID0gLTE7XG4mIzQzO1xuJiM0MztcdGlmIChsb29wX2ZkIFx1MDAzZT0gMCkge1xuJiM0MztcdFx0aW9jdGwobG9vcF9mZCwgTE9PUF9DTFJfRkQsIDApO1xuJiM0MztcdFx0Y2xvc2UobG9vcF9mZCk7XG4mIzQzO1x0fVxuJiM0MztcdGlmIChiYWNrX2ZkIFx1MDAzZT0gMClcbiYjNDM7XHRcdGNsb3NlKGJhY2tfZmQpO1xuJiM0MztcdGlmIChjdGxfZmQgXHUwMDNlPSAwKSB7XG4mIzQzO1x0XHRpZiAoc3NjYW5mKGxvb3BfcGF0aCwgXCYjMzQ7L2Rldi9sb29wJWRcJiMzNDssIFx1MDAyNm5yKSA9PSAxIFx1MDAyNlx1MDAyNiBuciBcdTAwM2U9IDApXG4mIzQzO1x0XHRcdGlvY3RsKGN0bF9mZCwgTE9PUF9DVExfUkVNT1ZFLCBucik7XG4mIzQzO1x0XHRjbG9zZShjdGxfZmQpO1xuJiM0MztcdH1cbiYjNDM7fVxuJiM0MztcbiYjNDM7LyogT19ESVJFQ1Qga2VlcHMgSS9PIGNoYXJnZWQgdG8gdGhlIGN1cnJlbnQgY2dyb3VwLiAqL1xuJiM0MztzdGF0aWMgaW50IGRvX2RpcmVjdF9pbyhjb25zdCBjaGFyICpsb29wX3BhdGgpXG4mIzQzO3tcbiYjNDM7XHR2b2lkICpidWY7XG4mIzQzO1x0aW50IGZkLCByZXQgPSAtMTtcbiYjNDM7XG4mIzQzO1x0ZmQgPSBvcGVuKGxvb3BfcGF0aCwgT19SRFdSIHwgT19ESVJFQ1QgfCBPX0NMT0VYRUMpO1xuJiM0MztcdGlmIChmZCBcdTAwM2MgMClcbiYjNDM7XHRcdHJldHVybiAtMTtcbiYjNDM7XHRpZiAocG9zaXhfbWVtYWxpZ24oXHUwMDI2YnVmLCA0MDk2LCBJT19TSVpFKSlcbiYjNDM7XHRcdGdvdG8gb3V0X2ZkO1xuJiM0MztcdG1lbXNldChidWYsIDB4YWIsIElPX1NJWkUpO1xuJiM0MztcbiYjNDM7XHRpZiAocHdyaXRlKGZkLCBidWYsIElPX1NJWkUsIDApICE9IElPX1NJWkUpXG4mIzQzO1x0XHRnb3RvIG91dF9idWY7XG4mIzQzO1x0ZnN5bmMoZmQpO1xuJiM0MztcdGlmIChwcmVhZChmZCwgYnVmLCBJT19TSVpFLCAwKSAhPSBJT19TSVpFKVxuJiM0MztcdFx0Z290byBvdXRfYnVmO1xuJiM0MztcdHJldCA9IDA7XG4mIzQzO291dF9idWY6XG4mIzQzO1x0ZnJlZShidWYpO1xuJiM0MztvdXRfZmQ6XG4mIzQzO1x0Y2xvc2UoZmQpO1xuJiM0MztcdHJldHVybiByZXQ7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qIFJlYWQgQGRldiYjMzk7cyBpby5zdGF0IGNvdW50ZXJzLiBAZGV2IHVzZXMga2VybmVsIGRldl90IGVuY29kaW5nLiAqL1xuJiM0MztzdGF0aWMgaW50IHBhcnNlX2lvX3N0YXQoaW50IGNncm91cF9mZCwgX191NjQgZGV2LCBzdHJ1Y3QgaW9fcXVlcnkgKm91dClcbiYjNDM7e1xuJiM0MztcdHVuc2lnbmVkIGludCB3YW50X21haiA9IGRldiBcdTAwM2VcdTAwM2UgMjAsIHdhbnRfbWluID0gZGV2IFx1MDAyNiAoKDFVIFx1MDAzY1x1MDAzYyAyMCkgLSAxKTtcbiYjNDM7XHRjaGFyIGJ1Zls0MDk2XSwgKmxpbmUsICpzYXZlcHRyO1xuJiM0MztcdGludCBmZCwgbiwgcmV0ID0gLTE7XG4mIzQzO1xuJiM0MztcdGZkID0gb3BlbmF0KGNncm91cF9mZCwgXCYjMzQ7aW8uc3RhdFwmIzM0OywgT19SRE9OTFkpO1xuJiM0MztcdGlmIChmZCBcdTAwM2MgMClcbiYjNDM7XHRcdHJldHVybiAtMTtcbiYjNDM7XHRuID0gcmVhZChmZCwgYnVmLCBzaXplb2YoYnVmKSAtIDEpO1xuJiM0MztcdGNsb3NlKGZkKTtcbiYjNDM7XHRpZiAobiBcdTAwM2M9IDApXG4mIzQzO1x0XHRyZXR1cm4gLTE7XG4mIzQzO1x0YnVmW25dID0gJiMzOTtcXDAmIzM5OztcbiYjNDM7XG4mIzQzO1x0Zm9yIChsaW5lID0gc3RydG9rX3IoYnVmLCBcJiMzNDtcXG5cJiMzNDssIFx1MDAyNnNhdmVwdHIpOyBsaW5lO1xuJiM0MztcdCAgICAgbGluZSA9IHN0cnRva19yKE5VTEwsIFwmIzM0O1xcblwmIzM0OywgXHUwMDI2c2F2ZXB0cikpIHtcbiYjNDM7XHRcdHVuc2lnbmVkIGxvbmcgbG9uZyByYiA9IDAsIHdiID0gMCwgcmkgPSAwLCB3aSA9IDAsIGRiID0gMCwgZGkgPSAwO1xuJiM0MztcdFx0dW5zaWduZWQgaW50IG1haiwgbWluO1xuJiM0MztcbiYjNDM7XHRcdC8qIE9ubHkgdGhlIGRldmljZSBpZCBpcyByZXF1aXJlZDsgbWlzc2luZyBjb3VudGVycyBzdGF5IHplcm8uICovXG4mIzQzO1x0XHRpZiAoc3NjYW5mKGxpbmUsXG4mIzQzO1x0XHRcdCAgIFwmIzM0OyV1OiV1IHJieXRlcz0lbGx1IHdieXRlcz0lbGx1IHJpb3M9JWxsdSB3aW9zPSVsbHUgZGJ5dGVzPSVsbHUgZGlvcz0lbGx1XCYjMzQ7LFxuJiM0MztcdFx0XHQgICBcdTAwMjZtYWosIFx1MDAyNm1pbiwgXHUwMDI2cmIsIFx1MDAyNndiLCBcdTAwMjZyaSwgXHUwMDI2d2ksIFx1MDAyNmRiLCBcdTAwMjZkaSkgXHUwMDNjIDIpXG4mIzQzO1x0XHRcdGNvbnRpbnVlO1xuJiM0MztcdFx0aWYgKG1haiAhPSB3YW50X21haiB8fCBtaW4gIT0gd2FudF9taW4pXG4mIzQzO1x0XHRcdGNvbnRpbnVlO1xuJiM0MztcbiYjNDM7XHRcdG91dC1cdTAwM2VyYnl0ZXMgPSByYjtcbiYjNDM7XHRcdG91dC1cdTAwM2V3Ynl0ZXMgPSB3YjtcbiYjNDM7XHRcdG91dC1cdTAwM2VyaW9zID0gcmk7XG4mIzQzO1x0XHRvdXQtXHUwMDNld2lvcyA9IHdpO1xuJiM0MztcdFx0b3V0LVx1MDAzZWRieXRlcyA9IGRiO1xuJiM0MztcdFx0b3V0LVx1MDAzZWRpb3MgPSBkaTtcbiYjNDM7XHRcdHJldCA9IDA7XG4mIzQzO1x0XHRicmVhaztcbiYjNDM7XHR9XG4mIzQzO1x0cmV0dXJuIHJldDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7dm9pZCB0ZXN0X2Nncm91cF9pdGVyX2lvKHZvaWQpXG4mIzQzO3tcbiYjNDM7XHRjaGFyICpjZ3JvdXBfcmVsX3BhdGggPSBcJiMzNDsvY2dyb3VwX2l0ZXJfaW9fdGVzdFwmIzM0OztcbiYjNDM7XHRpbnQgY3RsX2ZkID0gLTEsIGxvb3BfZmQgPSAtMSwgYmFja19mZCA9IC0xO1xuJiM0MztcdHN0cnVjdCBjZ3JvdXBfaXRlcl9pbyAqc2tlbCA9IE5VTEw7XG4mIzQzO1x0c3RydWN0IGJwZl9saW5rICpsaW5rID0gTlVMTDtcbiYjNDM7XHRjaGFyIGxvb3BfcGF0aFs2NF07XG4mIzQzO1x0c3RydWN0IGlvX3F1ZXJ5ICpxO1xuJiM0MztcdGludCBjZ3JvdXBfZmQ7XG4mIzQzO1xuJiM0MztcdGNncm91cF9mZCA9IGNncm91cF9zZXR1cF9hbmRfam9pbihjZ3JvdXBfcmVsX3BhdGgpO1xuJiM0MztcdGlmICghQVNTRVJUX09LX0ZEKGNncm91cF9mZCwgXCYjMzQ7Y2dyb3VwX3NldHVwX2FuZF9qb2luXCYjMzQ7KSlcbiYjNDM7XHRcdHJldHVybjtcbiYjNDM7XG4mIzQzO1x0aWYgKGxvb3Bfc2V0dXAobG9vcF9wYXRoLCBzaXplb2YobG9vcF9wYXRoKSwgXHUwMDI2Y3RsX2ZkLCBcdTAwMjZsb29wX2ZkLCBcdTAwMjZiYWNrX2ZkKSkge1xuJiM0MztcdFx0dGVzdF9fc2tpcCgpO1x0LyogbmVlZHMgcm9vdCAmIzQzOyBDT05GSUdfQkxLX0RFVl9MT09QICovXG4mIzQzO1x0XHRnb3RvIGNsZWFudXBfY2dyb3VwX2ZkO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0c2tlbCA9IGNncm91cF9pdGVyX2lvX19vcGVuX2FuZF9sb2FkKCk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0tfUFRSKHNrZWwsIFwmIzM0O2Nncm91cF9pdGVyX2lvX19vcGVuX2FuZF9sb2FkXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gY2xlYW51cF9sb29wO1xuJiM0MztcbiYjNDM7XHQvKiBDb252ZXJ0IGdsaWJjIHN0X3JkZXYgdG8ga2VybmVsIGRldl90IGZvcm1hdC4gKi9cbiYjNDM7XHR7XG4mIzQzO1x0XHRzdHJ1Y3Qgc3RhdCBsc3Q7XG4mIzQzO1xuJiM0MztcdFx0aWYgKCFBU1NFUlRfT0soZnN0YXQobG9vcF9mZCwgXHUwMDI2bHN0KSwgXCYjMzQ7ZnN0YXQgbG9vcFwmIzM0OykpXG4mIzQzO1x0XHRcdGdvdG8gY2xlYW51cF9za2VsO1xuJiM0MztcdFx0c2tlbC1cdTAwM2VkYXRhX3F1ZXJ5LVx1MDAzZXRhcmdldF9kZXYgPVxuJiM0MztcdFx0XHQoKF9fdTY0KW1ham9yKGxzdC5zdF9yZGV2KSBcdTAwM2NcdTAwM2MgMjApIHwgbWlub3IobHN0LnN0X3JkZXYpO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0REVDTEFSRV9MSUJCUEZfT1BUUyhicGZfaXRlcl9hdHRhY2hfb3B0cywgb3B0cyk7XG4mIzQzO1x0dW5pb24gYnBmX2l0ZXJfbGlua19pbmZvIGxpbmZvID0ge1xuJiM0MztcdFx0LmNncm91cC5jZ3JvdXBfZmQgPSBjZ3JvdXBfZmQsXG4mIzQzO1x0XHQuY2dyb3VwLm9yZGVyID0gQlBGX0NHUk9VUF9JVEVSX1NFTEZfT05MWSxcbiYjNDM7XHR9O1xuJiM0MztcdG9wdHMubGlua19pbmZvID0gXHUwMDI2bGluZm87XG4mIzQzO1x0b3B0cy5saW5rX2luZm9fbGVuID0gc2l6ZW9mKGxpbmZvKTtcbiYjNDM7XG4mIzQzO1x0bGluayA9IGJwZl9wcm9ncmFtX19hdHRhY2hfaXRlcihza2VsLVx1MDAzZXByb2dzLmNncm91cF9pb19xdWVyeSwgXHUwMDI2b3B0cyk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0tfUFRSKGxpbmssIFwmIzM0O2JwZl9wcm9ncmFtX19hdHRhY2hfaXRlclwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIGNsZWFudXBfc2tlbDtcbiYjNDM7XG4mIzQzO1x0LyogVGhpcyBwcm9jZXNzIGlzIGluIHRoZSB0ZXN0IGNncm91cCwgc28gdGhlIGxvb3AgSS9PIGlzIGNoYXJnZWQgaGVyZS4gKi9cbiYjNDM7XHRpZiAoIUFTU0VSVF9PSyhkb19kaXJlY3RfaW8obG9vcF9wYXRoKSwgXCYjMzQ7ZG9fZGlyZWN0X2lvXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gY2xlYW51cF9saW5rO1xuJiM0MztcbiYjNDM7XHRpZiAoIUFTU0VSVF9PSyhyZWFkX3N0YXRzKGxpbmspLCBcJiMzNDtyZWFkIHN0YXRzXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gY2xlYW51cF9saW5rO1xuJiM0MztcbiYjNDM7XHRxID0gXHUwMDI2c2tlbC1cdTAwM2VkYXRhX3F1ZXJ5LVx1MDAzZWlvX3F1ZXJ5O1xuJiM0MztcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwmIzM0O2Nncm91cF9pdGVyX2lvX193cml0ZVwmIzM0OykpIHtcbiYjNDM7XHRcdEFTU0VSVF9HVChxLVx1MDAzZXdieXRlcywgMCwgXCYjMzQ7d2J5dGVzXCYjMzQ7KTtcbiYjNDM7XHRcdEFTU0VSVF9HVChxLVx1MDAzZXdpb3MsIDAsIFwmIzM0O3dpb3NcJiMzNDspO1xuJiM0MztcdH1cbiYjNDM7XHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcJiMzNDtjZ3JvdXBfaXRlcl9pb19fcmVhZFwmIzM0OykpIHtcbiYjNDM7XHRcdEFTU0VSVF9HVChxLVx1MDAzZXJieXRlcywgMCwgXCYjMzQ7cmJ5dGVzXCYjMzQ7KTtcbiYjNDM7XHRcdEFTU0VSVF9HVChxLVx1MDAzZXJpb3MsIDAsIFwmIzM0O3Jpb3NcJiMzNDspO1xuJiM0MztcdH1cbiYjNDM7XHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcJiMzNDtjZ3JvdXBfaXRlcl9pb19fZGV2XCYjMzQ7KSlcbiYjNDM7XHRcdEFTU0VSVF9HVChxLVx1MDAzZWRldiwgMCwgXCYjMzQ7ZGV2XCYjMzQ7KTtcbiYjNDM7XG4mIzQzO1x0LyogQ29tcGFyZSB3aXRoIGlvLnN0YXQgd2l0aG91dCBJL08gYmV0d2VlbiB0aGUgcmVhZHMuICovXG4mIzQzO1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCYjMzQ7Y2dyb3VwX2l0ZXJfaW9fX21hdGNoXCYjMzQ7KSkge1xuJiM0MztcdFx0c3RydWN0IGlvX3F1ZXJ5IGZpbGV2ID0ge307XG4mIzQzO1xuJiM0MztcdFx0aWYgKEFTU0VSVF9PSyhyZWFkX3N0YXRzKGxpbmspLCBcJiMzNDtyZWFkIHN0YXRzXCYjMzQ7KSBcdTAwMjZcdTAwMjZcbiYjNDM7XHRcdCAgICBBU1NFUlRfT0socGFyc2VfaW9fc3RhdChjZ3JvdXBfZmQsIHEtXHUwMDNlZGV2LCBcdTAwMjZmaWxldiksXG4mIzQzO1x0XHRcdCAgICAgIFwmIzM0O3BhcnNlIGlvLnN0YXRcJiMzNDspKSB7XG4mIzQzO1x0XHRcdEFTU0VSVF9FUShxLVx1MDAzZXJieXRlcywgZmlsZXYucmJ5dGVzLCBcJiMzNDtyYnl0ZXNcJiMzNDspO1xuJiM0MztcdFx0XHRBU1NFUlRfRVEocS1cdTAwM2V3Ynl0ZXMsIGZpbGV2LndieXRlcywgXCYjMzQ7d2J5dGVzXCYjMzQ7KTtcbiYjNDM7XHRcdFx0QVNTRVJUX0VRKHEtXHUwMDNlcmlvcywgZmlsZXYucmlvcywgXCYjMzQ7cmlvc1wmIzM0Oyk7XG4mIzQzO1x0XHRcdEFTU0VSVF9FUShxLVx1MDAzZXdpb3MsIGZpbGV2Lndpb3MsIFwmIzM0O3dpb3NcJiMzNDspO1xuJiM0MztcdFx0XHRBU1NFUlRfRVEocS1cdTAwM2VkYnl0ZXMsIGZpbGV2LmRieXRlcywgXCYjMzQ7ZGJ5dGVzXCYjMzQ7KTtcbiYjNDM7XHRcdFx0QVNTRVJUX0VRKHEtXHUwMDNlZGlvcywgZmlsZXYuZGlvcywgXCYjMzQ7ZGlvc1wmIzM0Oyk7XG4mIzQzO1x0XHR9XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHQvKiBSb290IHN0YXRpc3RpY3MgaW5jbHVkZSB0aGlzIGNncm91cCYjMzk7cyBJL08uICovXG4mIzQzO1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCYjMzQ7Y2dyb3VwX2l0ZXJfaW9fX3Jvb3RcJiMzNDspKSB7XG4mIzQzO1x0XHRzdHJ1Y3QgYnBmX2xpbmsgKnJvb3RfbGluaztcbiYjNDM7XHRcdHN0cnVjdCBpb19xdWVyeSAqcjtcbiYjNDM7XG4mIzQzO1x0XHRza2VsLVx1MDAzZWRhdGFfcXVlcnktXHUwMDNlZ290X3Jvb3RfY3NzID0gMDtcbiYjNDM7XHRcdHJvb3RfbGluayA9IGJwZl9wcm9ncmFtX19hdHRhY2hfaXRlcihza2VsLVx1MDAzZXByb2dzLmNncm91cF9yb290X2lvX3F1ZXJ5LFxuJiM0MztcdFx0XHRcdFx0XHQgICAgIFx1MDAyNm9wdHMpO1xuJiM0MztcdFx0aWYgKEFTU0VSVF9PS19QVFIocm9vdF9saW5rLCBcJiMzNDthdHRhY2ggcm9vdCBpdGVyXCYjMzQ7KSkge1xuJiM0MztcdFx0XHRpZiAoQVNTRVJUX09LKHJlYWRfc3RhdHMocm9vdF9saW5rKSwgXCYjMzQ7cmVhZCByb290IHN0YXRzXCYjMzQ7KSkge1xuJiM0MztcdFx0XHRcdHIgPSBcdTAwMjZza2VsLVx1MDAzZWRhdGFfcXVlcnktXHUwMDNlcm9vdF9xdWVyeTtcbiYjNDM7XHRcdFx0XHRBU1NFUlRfRVEoc2tlbC1cdTAwM2VkYXRhX3F1ZXJ5LVx1MDAzZWdvdF9yb290X2NzcywgMSxcbiYjNDM7XHRcdFx0XHRcdCAgXCYjMzQ7Z290X3Jvb3RfY3NzXCYjMzQ7KTtcbiYjNDM7XHRcdFx0XHRBU1NFUlRfRVEoci1cdTAwM2VkZXYsIHEtXHUwMDNlZGV2LCBcJiMzNDtyb290IGRldlwmIzM0Oyk7XG4mIzQzO1x0XHRcdFx0QVNTRVJUX0dFKHItXHUwMDNld2J5dGVzLCBxLVx1MDAzZXdieXRlcywgXCYjMzQ7cm9vdCB3Ynl0ZXNcJiMzNDspO1xuJiM0MztcdFx0XHRcdEFTU0VSVF9HRShyLVx1MDAzZXdpb3MsIHEtXHUwMDNld2lvcywgXCYjMzQ7cm9vdCB3aW9zXCYjMzQ7KTtcbiYjNDM7XHRcdFx0XHRBU1NFUlRfR0Uoci1cdTAwM2VyYnl0ZXMsIHEtXHUwMDNlcmJ5dGVzLCBcJiMzNDtyb290IHJieXRlc1wmIzM0Oyk7XG4mIzQzO1x0XHRcdFx0QVNTRVJUX0dFKHItXHUwMDNlcmlvcywgcS1cdTAwM2VyaW9zLCBcJiMzNDtyb290IHJpb3NcJiMzNDspO1xuJiM0MztcdFx0XHR9XG4mIzQzO1x0XHRcdGJwZl9saW5rX19kZXN0cm95KHJvb3RfbGluayk7XG4mIzQzO1x0XHR9XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7Y2xlYW51cF9saW5rOlxuJiM0MztcdGJwZl9saW5rX19kZXN0cm95KGxpbmspO1xuJiM0MztjbGVhbnVwX3NrZWw6XG4mIzQzO1x0Y2dyb3VwX2l0ZXJfaW9fX2Rlc3Ryb3koc2tlbCk7XG4mIzQzO2NsZWFudXBfbG9vcDpcbiYjNDM7XHRsb29wX3RlYXJkb3duKGxvb3BfcGF0aCwgY3RsX2ZkLCBsb29wX2ZkLCBiYWNrX2ZkKTtcbiYjNDM7Y2xlYW51cF9jZ3JvdXBfZmQ6XG4mIzQzO1x0Y2xvc2UoY2dyb3VwX2ZkKTtcbiYjNDM7XHRjbGVhbnVwX2Nncm91cF9lbnZpcm9ubWVudCgpO1xuJiM0Mzt9XG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL2Nncm91cF9pdGVyX2lvLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvY2dyb3VwX2l0ZXJfaW8uY1xubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAuLjJjZDUzODA2ODk4N2Fcbi0tLSAvZGV2L251bGxcbiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9jZ3JvdXBfaXRlcl9pby5jXG5AQCAtMCwwICYjNDM7MSw5OSBAQFxuJiM0MzsvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxuJiM0MzsvKiBDb3B5cmlnaHQgKGMpIDIwMjUgTWV0YSBQbGF0Zm9ybXMsIEluYy4gYW5kIGFmZmlsaWF0ZXMuICovXG4mIzQzOyNpbmNsdWRlIFx1MDAzY3ZtbGludXguaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NicGYvYnBmX2hlbHBlcnMuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NicGYvYnBmX2NvcmVfcmVhZC5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFwmIzM0O2JwZl9leHBlcmltZW50YWwuaFwmIzM0O1xuJiM0MzsjaW5jbHVkZSBcJiMzNDtjZ3JvdXBfaXRlcl9pby5oXCYjMzQ7XG4mIzQzO1xuJiM0MztjaGFyIF9saWNlbnNlW10gU0VDKFwmIzM0O2xpY2Vuc2VcJiMzNDspID0gXCYjMzQ7R1BMXCYjMzQ7O1xuJiM0MztcbiYjNDM7c3RydWN0IGlvX3F1ZXJ5IGlvX3F1ZXJ5IFNFQyhcJiMzNDsuZGF0YS5xdWVyeVwmIzM0Oyk7XG4mIzQzO1xuJiM0MztzdHJ1Y3QgaW9fcXVlcnkgcm9vdF9xdWVyeSBTRUMoXCYjMzQ7LmRhdGEucXVlcnlcJiMzNDspO1xuJiM0MztcbiYjNDM7X191NjQgZ290X3Jvb3RfY3NzIFNFQyhcJiMzNDsuZGF0YS5xdWVyeVwmIzM0Oyk7XG4mIzQzO1xuJiM0MzsvKiBEZXZpY2Ugc2VsZWN0ZWQgYnkgdXNlcnNwYWNlIGluIGtlcm5lbCBkZXZfdCBmb3JtYXQuICovXG4mIzQzO19fdTY0IHRhcmdldF9kZXYgU0VDKFwmIzM0Oy5kYXRhLnF1ZXJ5XCYjMzQ7KTtcbiYjNDM7XG4mIzQzOy8qIEtlZXAgaW5saW5lOiBSQ1UgYW5kIG9wZW4tY29kZWQgaXRlcmF0b3JzIGNhbm5vdCBjcm9zcyBhIEJQRiBjYWxsLiAqL1xuJiM0MztzdGF0aWMgX19hbHdheXNfaW5saW5lIGludCByZWFkX3RhcmdldF9kZXYoc3RydWN0IGNncm91cCAqY2dycCxcbiYjNDM7XHRcdFx0XHRcdCAgIHN0cnVjdCBpb19xdWVyeSAqb3V0KVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IGNncm91cF9zdWJzeXNfc3RhdGUgKmNzcztcbiYjNDM7XHRzdHJ1Y3QgYmxrY2dfZ3EgKnBvcztcbiYjNDM7XHRfX3U2NCBkZXY7XG4mIzQzO1x0aW50IHNzaWQ7XG4mIzQzO1xuJiM0MztcdC8qIFRoZSBmbHVzaCBjYW4gc2xlZXAsIHNvIHJ1biBpdCBiZWZvcmUgdGhlIFJDVSBzZWN0aW9uLiAqL1xuJiM0MztcdGJwZl9ibGtjZ19mbHVzaF9zdGF0cyhjZ3JwKTtcbiYjNDM7XG4mIzQzO1x0YnBmX3JjdV9yZWFkX2xvY2soKTtcbiYjNDM7XHRzc2lkID0gYnBmX2NvcmVfZW51bV92YWx1ZShlbnVtIGNncm91cF9zdWJzeXNfaWQsIGlvX2NncnBfaWQpO1xuJiM0MztcbiYjNDM7XHQvKlxuJiM0MztcdCAqIHN1YnN5c1tdIGlzIF9fcmN1LCBzbyB0aGlzIHJlYWQgZ2l2ZXMgYW4gUkNVIHBvaW50ZXIgdGhlIGl0ZXJhdG9yXG4mIzQzO1x0ICogYWNjZXB0cy4gQlBGX0NPUkVfUkVBRCgpIHdvdWxkIHJldHVybiBhIHBsYWluIHZhbHVlIGluc3RlYWQuXG4mIzQzO1x0ICovXG4mIzQzO1x0Y3NzID0gY2dycC1cdTAwM2VzdWJzeXNbc3NpZF07XG4mIzQzO1x0aWYgKCFjc3MpIHtcbiYjNDM7XHRcdGJwZl9yY3VfcmVhZF91bmxvY2soKTtcbiYjNDM7XHRcdHJldHVybiAwO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0YnBmX2Zvcl9lYWNoKGJsa2csIHBvcywgY3NzKSB7XG4mIzQzO1x0XHRkZXYgPSBCUEZfQ09SRV9SRUFEKHBvcywgcSwgZGlzaywgcGFydDAsIGJkX2Rldik7XG4mIzQzO1x0XHRpZiAoZGV2ICE9IHRhcmdldF9kZXYpXG4mIzQzO1x0XHRcdGNvbnRpbnVlO1xuJiM0MztcbiYjNDM7XHRcdG91dC1cdTAwM2VkZXYgPSBkZXY7XG4mIzQzO1x0XHRvdXQtXHUwMDNlcmJ5dGVzID0gQlBGX0NPUkVfUkVBRChwb3MsIGlvc3RhdC5jdXIuYnl0ZXNbQkxLR19JT1NUQVRfUkVBRF0pO1xuJiM0MztcdFx0b3V0LVx1MDAzZXdieXRlcyA9IEJQRl9DT1JFX1JFQUQocG9zLCBpb3N0YXQuY3VyLmJ5dGVzW0JMS0dfSU9TVEFUX1dSSVRFXSk7XG4mIzQzO1x0XHRvdXQtXHUwMDNlcmlvcyA9IEJQRl9DT1JFX1JFQUQocG9zLCBpb3N0YXQuY3VyLmlvc1tCTEtHX0lPU1RBVF9SRUFEXSk7XG4mIzQzO1x0XHRvdXQtXHUwMDNld2lvcyA9IEJQRl9DT1JFX1JFQUQocG9zLCBpb3N0YXQuY3VyLmlvc1tCTEtHX0lPU1RBVF9XUklURV0pO1xuJiM0MztcdFx0b3V0LVx1MDAzZWRieXRlcyA9IEJQRl9DT1JFX1JFQUQocG9zLCBpb3N0YXQuY3VyLmJ5dGVzW0JMS0dfSU9TVEFUX0RJU0NBUkRdKTtcbiYjNDM7XHRcdG91dC1cdTAwM2VkaW9zID0gQlBGX0NPUkVfUkVBRChwb3MsIGlvc3RhdC5jdXIuaW9zW0JMS0dfSU9TVEFUX0RJU0NBUkRdKTtcbiYjNDM7XHRcdGJyZWFrO1xuJiM0MztcdH1cbiYjNDM7XHRicGZfcmN1X3JlYWRfdW5sb2NrKCk7XG4mIzQzO1x0cmV0dXJuIDE7XG4mIzQzO31cbiYjNDM7XG4mIzQzO1NFQyhcJiMzNDtpdGVyLnMvY2dyb3VwXCYjMzQ7KVxuJiM0MztpbnQgY2dyb3VwX2lvX3F1ZXJ5KHN0cnVjdCBicGZfaXRlcl9fY2dyb3VwICpjdHgpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgY2dyb3VwICpjZ3JwID0gY3R4LVx1MDAzZWNncm91cDtcbiYjNDM7XG4mIzQzO1x0aWYgKCFjZ3JwKVxuJiM0MztcdFx0cmV0dXJuIDE7XG4mIzQzO1xuJiM0MztcdC8qIFN0YXJ0IGZyZXNoIHNvIGEgZGV2aWNlIHRoYXQgaXMgbm90IGZvdW5kIHN0YXlzIGFsbC16ZXJvLiAqL1xuJiM0MztcdF9fYnVpbHRpbl9tZW1zZXQoXHUwMDI2aW9fcXVlcnksIDAsIHNpemVvZihpb19xdWVyeSkpO1xuJiM0MztcbiYjNDM7XHRyZWFkX3RhcmdldF9kZXYoY2dycCwgXHUwMDI2aW9fcXVlcnkpO1xuJiM0MztcdHJldHVybiAwO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztTRUMoXCYjMzQ7aXRlci5zL2Nncm91cFwmIzM0OylcbiYjNDM7aW50IGNncm91cF9yb290X2lvX3F1ZXJ5KHN0cnVjdCBicGZfaXRlcl9fY2dyb3VwICpjdHgpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgY2dyb3VwICpyb290O1xuJiM0MztcbiYjNDM7XHRpZiAoIWN0eC1cdTAwM2VjZ3JvdXApXG4mIzQzO1x0XHRyZXR1cm4gMTtcbiYjNDM7XG4mIzQzO1x0X19idWlsdGluX21lbXNldChcdTAwMjZyb290X3F1ZXJ5LCAwLCBzaXplb2Yocm9vdF9xdWVyeSkpO1xuJiM0MztcbiYjNDM7XHQvKiBUaGUgcm9vdCBjZ3JvdXAgYWx3YXlzIGhhcyBpZCAxLiAqL1xuJiM0MztcdHJvb3QgPSBicGZfY2dyb3VwX2Zyb21faWQoMSk7XG4mIzQzO1x0aWYgKCFyb290KVxuJiM0MztcdFx0cmV0dXJuIDA7XG4mIzQzO1xuJiM0MztcdC8qIFJvb3QgY291bnRlcnMgaW5jbHVkZSBhbGwgY2dyb3VwcyYjMzk7IEkvTy4gKi9cbiYjNDM7XHRpZiAocmVhZF90YXJnZXRfZGV2KHJvb3QsIFx1MDAyNnJvb3RfcXVlcnkpKVxuJiM0MztcdFx0Z290X3Jvb3RfY3NzID0gMTtcbiYjNDM7XG4mIzQzO1x0YnBmX2Nncm91cF9yZWxlYXNlKHJvb3QpO1xuJiM0MztcdHJldHVybiAwO1xuJiM0Mzt9XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Mi8xPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTcgMjI6MzQ8L3RkPgoJCQk8dGQ+YWdlbnQ8L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+YmVzdC1leHBlbnNpdmU8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0JMS19DR1JPVVAmIzM0OywKICAgICYjMzQ7QlBGX1NZU0NBTEwmIzM0OywKICAgICYjMzQ7Q0dST1VQUyYjMzQ7LAogICAgJiMzNDtCTE9DSyYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O2JwZl9ibGtjZ19mbHVzaF9zdGF0cyYjMzQ7LAogICAgJiMzNDticGZfaXRlcl9ibGtnX25ldyYjMzQ7LAogICAgJiMzNDticGZfaXRlcl9ibGtnX25leHQmIzM0OywKICAgICYjMzQ7YnBmX2l0ZXJfYmxrZ19kZXN0cm95JiMzNDssCiAgICAmIzM0O2Jsa2NnX2ZpbGxfcm9vdF9pb3N0YXRzJiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIGludHJvZHVjZXMgbmV3IEJQRiBrZnVuY3MgZm9yIGJsb2NrIGNncm91cCBJL08gc3RhdGlzdGljcywgd2hpY2ggYXJlIHJlYWNoYWJsZSBmcm9tIEJQRiBwcm9ncmFtcy4gVGhlc2UgZnVuY3Rpb25zIGFsbG93IEJQRiBwcm9ncmFtcyB0byBmbHVzaCBibG9jayBjZ3JvdXAgc3RhdHMgYW5kIGl0ZXJhdGUgb3ZlciBwZXItZGV2aWNlIGJsa2dzLiBUaGUgY2hhbmdlcyBhcmUgZnVuY3Rpb25hbGx5IHNpZ25pZmljYW50IGFuZCBzaG91bGQgYmUgZnV6emVkLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+SW5zdHJ1Y3Rpb246PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Zb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgbWFpbnRhaW5lci4KWW91ciBqb2IgaXMgdG8gcmV2aWV3IGEgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZCBkZXRlcm1pbmUKaWYgaXQgbWFrZXMgZnVuY3Rpb25hbCBjaGFuZ2VzIHRvIHRoZSBrZXJuZWwgdGhhdCBzaG91bGQgYmUgZnV6emVkLgoKSU1QT1JUQU5UOiBUaGUgY2hhbmdlcyBoYXZlIEFMUkVBRFkgYmVlbiBhcHBsaWVkIGFuZCBjb21taXR0ZWQgYXMgdGhlIEhFQUQgY29tbWl0IGluCnlvdXIgd29ya3NwYWNlLiBEbyBOT1QgcmVseSBvbiB5b3VyIGludGVybmFsIGtub3dsZWRnZSBvZiB0aGUga2VybmVsLiBZb3UgbXVzdCBhY3RpdmVseQp1c2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBleGFtaW5lIHRoZSBhY3R1YWwgc291cmNlIGNvZGUgYW5kIGNvbmZpcm0gYW55IGFzc3VtcHRpb25zLgoKUmV0dXJuIFdvcnRoRnV6emluZz1mYWxzZSBpZiB0aGUgcGF0Y2ggb25seSBjb250YWluczoKLSBNb2RpZmljYXRpb25zIHRvIERvY3VtZW50YXRpb24vLCBLY29uZmlnIGZpbGVzLCBvciBjb2RlIGNvbW1lbnRzLgotIFB1cmVseSBkZWNvcmF0aXZlIGNoYW5nZXMsIHN1Y2ggYXMgbG9nZ2luZyAoZS5nLiwgcHJfZXJyLCBwcmludGspIG9yIHRyYWNlcG9pbnRzLgotIENoYW5nZXMgdG8gbnVtZXJpYyBjb25zdGFudHMgb3IgbWFjcm9zIHRoYXQgZG8gbm90IGZ1bmN0aW9uYWxseSBhbHRlciBleGVjdXRpb24gZmxvdy4KLSBDb2RlIHBhdGhzIHRoYXQgYXJlIGltcG9zc2libGUgdG8gcmVhY2ggaW4gdmlydHVhbGl6ZWQgZW52aXJvbm1lbnRzIGxpa2UgR0NFIG9yIFFFTVUsCiAgZXZlbiB3aGVuIHV0aWxpemluZyBzb2Z0d2FyZS1lbXVsYXRlZCBoYXJkd2FyZSAoZS5nLiwgdXNiIGdhZGdldCwgbWFjODAyMTFfaHdzaW0pLgotIENvZGUgaW4gdmVuZG9yLXNwZWNpZmljIFBDSWUgc3dpdGNoLCBTbWFydE5JQywgb3IgR1BVIGRyaXZlcnMgKGUuZy4sIG1seHN3LCBwZHNfY29yZSwgcWVkLAogIGlvbmljLCBhbWRncHUpIHRoYXQgcmVxdWlyZSBwaHlzaWNhbCBQQ0llIGhhcmR3YXJlIGNhcmRzIG5vdCBlbXVsYXRlZCBpbiBzdGFuZGFyZCBRRU1VLgotIERyaXZlciAucmVtb3ZlLCAuc2h1dGRvd24sIG9yIHBjaV91bnJlZ2lzdGVyX2RyaXZlciB0ZWFyZG93biBjYWxsYmFja3MgKGUuZy4sIGlnYl9yZW1vdmUpCiAgdGhhdCBhcmUgZXhlY3V0ZWQgb25seSBkdXJpbmcgUENJIGhvdC11bnBsdWcgb3Igc3lzZnMgZHJpdmVyIHVuYmluZCBvcGVyYXRpb25zLgoKSWYgaXQgbW9kaWZpZXMgcmVhY2hhYmxlIGNvcmUga2VybmVsIGxvZ2ljLCBkcml2ZXJzLCBvciBhcmNoaXRlY3R1cmVzLCB1c2UgeW91ciBjb2RlIHNlYXJjaAp0b29scyB0byB2ZXJpZnkgdGhlIGNvZGUgY2FuIGJlIGV4ZWN1dGVkLCB0aGVuIHJldHVybiBXb3J0aEZ1enppbmc9dHJ1ZS4KCldoZW4gcmV0dXJuaW5nIFdvcnRoRnV6emluZz10cnVlLCB5b3UgTVVTVCBBTFNPOgoxLiBFeHRyYWN0IGFueSBzcGVjaWZpYyBrZXJuZWwgZnVuY3Rpb25zIHRoYXQgc2hvdWxkIGJlIGhlYXZpbHkgZnV6emVkIGludG8gRm9jdXNTeW1ib2xzLgogICBBdm9pZCBsaXN0aW5nIGdlbmVyaWMgaG90LXBhdGggZnVuY3Rpb25zIHRvIHByZXZlbnQgc2tld2VkIHRlc3QgZGlzdHJpYnV0aW9ucy4KICAgUHJlZmVyIG5vbi1zdGF0aWMsIG5vbi1pbmxpbmVkIEFQSSBlbnRyeXBvaW50IGZ1bmN0aW9ucyBvdmVyIGludGVybmFsIHN0YXRpYyBoZWxwZXIgZnVuY3Rpb25zCiAgICh3aGljaCBhcmUgaW5saW5lZCBieSB0aGUgY29tcGlsZXIgYW5kIGRvIG5vdCBoYXZlIGRpc3RpbmN0IHN5bWJvbCBhZGRyZXNzZXMpLgoyLiBJZGVudGlmeSBhbnkgc3BlY2lmaWMgQ09ORklHXyBvcHRpb25zIHJlcXVpcmVkIHRvIHByb3Blcmx5IHRlc3QgdGhpcyBuZXcvbW9kaWZpZWQgZmVhdHVyZS4KICAgR28gYW5kIGxvb2sgaW50byB0aGUgS2NvbmZpZyBmaWxlcyBhbmQgY2hlY2sgZm9yIGlmZGVmcyBhcm91bmQgdGhlIGNvZGUsIGRvIG5vdCBtYWtlIGFzc3VtcHRpb25zLgogICBBbHNvIGNoZWNrICYjMzQ7ZGVwZW5kcyBvbiYjMzQ7IGxpbmVzIGluIEtjb25maWcgdG8gaW5jbHVkZSBhbnkgbm9uLXN0YW5kYXJkIHBhcmVudCBzdWJzeXN0ZW0gY29uZmlncwogICBuZWVkZWQgZm9yIEtidWlsZCB0byBjb21waWxlIHRoZSBjb2RlIHN0YXRpY2FsbHkgaW50byB2bWxpbnV4LiBMaXN0IHRoZW0gaW4gdGhlIEVuYWJsZUNvbmZpZ3MKICAgb3V0cHV0IGFycmF5LCBhbmQgRE8gTk9UIGFkZCBhICYjMzk7Q09ORklHXyYjMzk7IHByZWZpeCAoZS5nLiwgcmV0dXJuICYjMzQ7TkVUX0lQVjQmIzM0OyBpbnN0ZWFkIG9mICYjMzQ7Q09ORklHX05FVF9JUFY0JiMzNDspLgpQcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy4KCgpVc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLgpJdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS4KSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlByb21wdDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOgpjb21taXQgNzczMDAzNjNmZTljNWIwYWZjMzZkOWY3NGVhZGI0MWJhNmRkNTNhNQpBdXRob3I6IHN5ei1jbHVzdGVyICZsdDt0cmlhZ2VAc3l6a2FsbGVyLmNvbSZndDsKRGF0ZTogICBNb24gQXVnIDE3IDIyOjM0OjMyIDIwMjYgJiM0MzswMDAwCgogICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3CgpkaWZmIC0tZ2l0IGEvTUFJTlRBSU5FUlMgYi9NQUlOVEFJTkVSUwppbmRleCAyZjk0NzJjMWEwOTA3Li44N2M1NmU5NTU1NzcxIDEwMDY0NAotLS0gYS9NQUlOVEFJTkVSUwomIzQzOyYjNDM7JiM0MzsgYi9NQUlOVEFJTkVSUwpAQCAtNjYxNyw2ICYjNDM7NjYxNyw3IEBAIEY6CWJsb2NrL2Jsay1jZ3JvdXAuYwogRjoJYmxvY2svYmxrLWlvY29zdC5jCiBGOglibG9jay9ibGstaW9sYXRlbmN5LmMKIEY6CWJsb2NrL2Jsay10aHJvdHRsZS5jCiYjNDM7RjoJYmxvY2svYnBmX2Jsa2NnLmMKIEY6CWluY2x1ZGUvbGludXgvYmxrLWNncm91cC5oCiAKIENPTlRST0wgR1JPVVAgLSBDUFVTRVQKZGlmZiAtLWdpdCBhL2Jsb2NrL01ha2VmaWxlIGIvYmxvY2svTWFrZWZpbGUKaW5kZXggZTdiZDMyMGUzZDY5Ny4uNTcyZTQ5OTg4YzhlZSAxMDA2NDQKLS0tIGEvYmxvY2svTWFrZWZpbGUKJiM0MzsmIzQzOyYjNDM7IGIvYmxvY2svTWFrZWZpbGUKQEAgLTE3LDYgJiM0MzsxNyw5IEBAIG9iai0kKENPTkZJR19CTEtfRVJST1JfSU5KRUNUSU9OKSAmIzQzOz0gZXJyb3ItaW5qZWN0aW9uLm8KIG9iai0kKENPTkZJR19CTEtfREVWX0JTR19DT01NT04pICYjNDM7PSBic2cubwogb2JqLSQoQ09ORklHX0JMS19ERVZfQlNHTElCKQkmIzQzOz0gYnNnLWxpYi5vCiBvYmotJChDT05GSUdfQkxLX0NHUk9VUCkJJiM0Mzs9IGJsay1jZ3JvdXAubwomIzQzO2lmZGVmIENPTkZJR19CUEZfU1lTQ0FMTAomIzQzO29iai0kKENPTkZJR19CTEtfQ0dST1VQKQkmIzQzOz0gYnBmX2Jsa2NnLm8KJiM0MztlbmRpZgogb2JqLSQoQ09ORklHX0JMS19DR1JPVVBfUldTVEFUKQkmIzQzOz0gYmxrLWNncm91cC1yd3N0YXQubwogb2JqLSQoQ09ORklHX0JMS19DR1JPVVBfRkNfQVBQSUQpICYjNDM7PSBibGstY2dyb3VwLWZjLWFwcGlkLm8KIG9iai0kKENPTkZJR19CTEtfREVWX1RIUk9UVExJTkcpCSYjNDM7PSBibGstdGhyb3R0bGUubwpkaWZmIC0tZ2l0IGEvYmxvY2svYmxrLWNncm91cC5jIGIvYmxvY2svYmxrLWNncm91cC5jCmluZGV4IGQ5Njc2MTI2YzViNWQuLjhkNTM4YWQ0ZTg2MWMgMTAwNjQ0Ci0tLSBhL2Jsb2NrL2Jsay1jZ3JvdXAuYwomIzQzOyYjNDM7JiM0MzsgYi9ibG9jay9ibGstY2dyb3VwLmMKQEAgLTEwODYsNyAmIzQzOzEwODYsNyBAQCBzdGF0aWMgdm9pZCBibGtjZ19yc3RhdF9mbHVzaChzdHJ1Y3QgY2dyb3VwX3N1YnN5c19zdGF0ZSAqY3NzLCBpbnQgY3B1KQogICogZmx1c2hpbmcgdGhlIHJvb3QgY2dyb3VwJiMzOTtzIHN0YXRzIGJ5IGV4cGxpY2l0bHkgZmlsbGluZyBpbiB0aGUgaW9zdGF0CiAgKiB3aXRoIGRpc2sgbGV2ZWwgc3RhdGlzdGljcy4KICAqLwotc3RhdGljIHZvaWQgYmxrY2dfZmlsbF9yb290X2lvc3RhdHModm9pZCkKJiM0Mzt2b2lkIGJsa2NnX2ZpbGxfcm9vdF9pb3N0YXRzKHZvaWQpCiB7CiAJc3RydWN0IGNsYXNzX2Rldl9pdGVyIGl0ZXI7CiAJc3RydWN0IGRldmljZSAqZGV2OwpkaWZmIC0tZ2l0IGEvYmxvY2svYmxrLWNncm91cC5oIGIvYmxvY2svYmxrLWNncm91cC5oCmluZGV4IDYxNTM5MGY3NTFhYTIuLjhjOWMyYTFhZGZhYTQgMTAwNjQ0Ci0tLSBhL2Jsb2NrL2Jsay1jZ3JvdXAuaAomIzQzOyYjNDM7JiM0MzsgYi9ibG9jay9ibGstY2dyb3VwLmgKQEAgLTIwNSw2ICYjNDM7MjA1LDcgQEAgdm9pZCBibGtjZ19kZWFjdGl2YXRlX3BvbGljeShzdHJ1Y3QgZ2VuZGlzayAqZGlzaywKIAkJCSAgICAgY29uc3Qgc3RydWN0IGJsa2NnX3BvbGljeSAqcG9sKTsKIAogY29uc3QgY2hhciAqYmxrZ19kZXZfbmFtZShzdHJ1Y3QgYmxrY2dfZ3EgKmJsa2cpOwomIzQzO3ZvaWQgYmxrY2dfZmlsbF9yb290X2lvc3RhdHModm9pZCk7CiB2b2lkIGJsa2NnX3ByaW50X2Jsa2dzKHN0cnVjdCBzZXFfZmlsZSAqc2YsIHN0cnVjdCBibGtjZyAqYmxrY2csCiAJCSAgICAgICB1NjQgKCpwcmZpbGwpKHN0cnVjdCBzZXFfZmlsZSAqLAogCQkJCSAgICAgc3RydWN0IGJsa2dfcG9saWN5X2RhdGEgKiwgaW50KSwKZGlmZiAtLWdpdCBhL2Jsb2NrL2JwZl9ibGtjZy5jIGIvYmxvY2svYnBmX2Jsa2NnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMC4uMjVjODA5ZjUwOTFjMgotLS0gL2Rldi9udWxsCiYjNDM7JiM0MzsmIzQzOyBiL2Jsb2NrL2JwZl9ibGtjZy5jCkBAIC0wLDAgJiM0MzsxLDE1NCBAQAomIzQzOy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9yLWxhdGVyCiYjNDM7LyoKJiM0MzsgKiBCbG9jayBJL08gQ29udHJvbGxlci1yZWxhdGVkIEJQRiBrZnVuY3MgYW5kIGF1eGlsaWFyeSBjb2RlCiYjNDM7ICovCiYjNDM7CiYjNDM7I2luY2x1ZGUgJiMzNDtibGstY2dyb3VwLmgmIzM0OwomIzQzOwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9icGYuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvYnRmX2lkcy5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9yY3VsaXN0LmgmZ3Q7CiYjNDM7CiYjNDM7X19icGZfa2Z1bmNfc3RhcnRfZGVmcygpOwomIzQzOwomIzQzOy8qKgomIzQzOyAqIGJwZl9ibGtjZ19mbHVzaF9zdGF0cyAtIEZsdXNoIGEgYmxvY2sgY2dyb3VwJiMzOTtzIGlvIHN0YXRpc3RpY3MKJiM0MzsgKiBAY2dycDogY2dyb3VwIHRvIGZsdXNoCiYjNDM7ICoKJiM0MzsgKiBQcm9wYWdhdGUgSS9PIHN0YXRpc3RpY3MgdXAgdGhlIGNncm91cCB0cmVlLiBSb290IHN0YXRpc3RpY3MgY29tZSBmcm9tCiYjNDM7ICogYmxvY2sgZGV2aWNlcyBhbmQgaW5jbHVkZSBhbGwgY2dyb3VwcyYjMzk7IEkvTy4KJiM0MzsgKi8KJiM0MztfX2JwZl9rZnVuYyB2b2lkIGJwZl9ibGtjZ19mbHVzaF9zdGF0cyhzdHJ1Y3QgY2dyb3VwICpjZ3JwKQomIzQzO3sKJiM0MzsJc3RydWN0IGNncm91cF9zdWJzeXNfc3RhdGUgKmNzczsKJiM0MzsKJiM0MzsJLyogUGluIHRoZSBjc3MgZm9yIHRoZSBzbGVlcGFibGUgZmx1c2guICovCiYjNDM7CXJjdV9yZWFkX2xvY2soKTsKJiM0MzsJY3NzID0gY2dyb3VwX2NzcyhjZ3JwLCAmYW1wO2lvX2NncnBfc3Vic3lzKTsKJiM0MzsJaWYgKGNzcyAmYW1wOyZhbXA7ICFjc3NfdHJ5Z2V0KGNzcykpCiYjNDM7CQljc3MgPSBOVUxMOwomIzQzOwlyY3VfcmVhZF91bmxvY2soKTsKJiM0MzsKJiM0MzsJaWYgKCFjc3MpCiYjNDM7CQlyZXR1cm47CiYjNDM7CiYjNDM7CWlmICghY3NzLSZndDtwYXJlbnQpCiYjNDM7CQlibGtjZ19maWxsX3Jvb3RfaW9zdGF0cygpOwomIzQzOwllbHNlCiYjNDM7CQljc3NfcnN0YXRfZmx1c2goY3NzKTsKJiM0MzsKJiM0MzsJY3NzX3B1dChjc3MpOwomIzQzO30KJiM0MzsKJiM0MztzdHJ1Y3QgYnBmX2l0ZXJfYmxrZyB7CiYjNDM7CV9fdTY0IF9fb3BhcXVlWzJdOwomIzQzO30gX19hbGlnbmVkKDgpOwomIzQzOwomIzQzO3N0cnVjdCBicGZfaXRlcl9ibGtnX2tlcm4gewomIzQzOwlzdHJ1Y3QgYmxrY2cgKmJsa2NnOwomIzQzOwlzdHJ1Y3QgYmxrY2dfZ3EgKnBvczsKJiM0Mzt9IF9fYWxpZ25lZCg4KTsKJiM0MzsKJiM0MzsvKioKJiM0MzsgKiBicGZfaXRlcl9ibGtnX25ldyAtIFN0YXJ0IGl0ZXJhdGluZyBhIGJsb2NrIGNncm91cCYjMzk7cyBwZXItZGV2aWNlIGJsa2dzCiYjNDM7ICogQGl0OiBpdGVyYXRvciB0byBpbml0aWFsaXplCiYjNDM7ICogQGNzczogdGhlIGlvIGNvbnRyb2xsZXImIzM5O3MgY3NzCiYjNDM7ICoKJiM0MzsgKiBFYWNoIGJsa2cgaG9sZHMgb25lIGRldmljZSYjMzk7cyBpby5zdGF0IGNvdW50ZXJzLiBPZmZsaW5lIGJsa2dzIGFyZSBza2lwcGVkLgomIzQzOyAqIEEgYmxrZyB3aXRob3V0IGEgZGlzayBjYW4gYmUgcmV0dXJuZWQuIE11c3QgcnVuIHVuZGVyIFJDVS4KJiM0MzsgKgomIzQzOyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCAtRUlOVkFMIGlmIEBjc3MgaXMgbm90IHRoZSBpbyBjb250cm9sbGVyJiMzOTtzLgomIzQzOyAqLwomIzQzO19fYnBmX2tmdW5jIGludCBicGZfaXRlcl9ibGtnX25ldyhzdHJ1Y3QgYnBmX2l0ZXJfYmxrZyAqaXQsCiYjNDM7CQkJCSAgc3RydWN0IGNncm91cF9zdWJzeXNfc3RhdGUgKmNzcykKJiM0Mzt7CiYjNDM7CXN0cnVjdCBicGZfaXRlcl9ibGtnX2tlcm4gKmtpdCA9ICh2b2lkICopaXQ7CiYjNDM7CiYjNDM7CUJVSUxEX0JVR19PTihzaXplb2Yoc3RydWN0IGJwZl9pdGVyX2Jsa2dfa2VybikgJmd0OyBzaXplb2Yoc3RydWN0IGJwZl9pdGVyX2Jsa2cpKTsKJiM0MzsJQlVJTERfQlVHX09OKF9fYWxpZ25vZl9fKHN0cnVjdCBicGZfaXRlcl9ibGtnX2tlcm4pICE9CiYjNDM7CQkgICAgIF9fYWxpZ25vZl9fKHN0cnVjdCBicGZfaXRlcl9ibGtnKSk7CiYjNDM7CiYjNDM7CWtpdC0mZ3Q7cG9zID0gTlVMTDsKJiM0MzsKJiM0MzsJaWYgKGNzcy0mZ3Q7c3MgIT0gJmFtcDtpb19jZ3JwX3N1YnN5cykgewomIzQzOwkJa2l0LSZndDtibGtjZyA9IE5VTEw7CiYjNDM7CQlyZXR1cm4gLUVJTlZBTDsKJiM0MzsJfQomIzQzOwomIzQzOwlraXQtJmd0O2Jsa2NnID0gY3NzX3RvX2Jsa2NnKGNzcyk7CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MzsKJiM0MzsvKioKJiM0MzsgKiBicGZfaXRlcl9ibGtnX25leHQgLSBSZXR1cm4gdGhlIG5leHQgb25saW5lIGJsa2cgb2YgdGhlIGl0ZXJhdGVkIGJsb2NrIGNncm91cAomIzQzOyAqIEBpdDogaXRlcmF0b3IKJiM0MzsgKgomIzQzOyAqIFJldHVybjogdGhlIG5leHQgb25saW5lIGJsa2csIG9yIE5VTEwgd2hlbiB0aGUgd2FsayBpcyBkb25lLgomIzQzOyAqLwomIzQzO19fYnBmX2tmdW5jIHN0cnVjdCBibGtjZ19ncSAqYnBmX2l0ZXJfYmxrZ19uZXh0KHN0cnVjdCBicGZfaXRlcl9ibGtnICppdCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBicGZfaXRlcl9ibGtnX2tlcm4gKmtpdCA9ICh2b2lkICopaXQ7CiYjNDM7CXN0cnVjdCBibGtjZ19ncSAqYmxrZyA9IGtpdC0mZ3Q7cG9zOwomIzQzOwlzdHJ1Y3QgaGxpc3Rfbm9kZSAqbm9kZTsKJiM0MzsKJiM0MzsJaWYgKCFraXQtJmd0O2Jsa2NnKQomIzQzOwkJcmV0dXJuIE5VTEw7CiYjNDM7CiYjNDM7CWlmICghYmxrZykKJiM0MzsJCW5vZGUgPSByY3VfZGVyZWZlcmVuY2UoaGxpc3RfZmlyc3RfcmN1KCZhbXA7a2l0LSZndDtibGtjZy0mZ3Q7YmxrZ19saXN0KSk7CiYjNDM7CWVsc2UKJiM0MzsJCW5vZGUgPSByY3VfZGVyZWZlcmVuY2UoaGxpc3RfbmV4dF9yY3UoJmFtcDtibGtnLSZndDtibGtjZ19ub2RlKSk7CiYjNDM7CiYjNDM7CS8qIFNraXAgb2ZmbGluZSBibGtncywgbWF0Y2hpbmcgaW8uc3RhdC4gKi8KJiM0MzsJd2hpbGUgKG5vZGUpIHsKJiM0MzsJCWJsa2cgPSBobGlzdF9lbnRyeShub2RlLCBzdHJ1Y3QgYmxrY2dfZ3EsIGJsa2NnX25vZGUpOwomIzQzOwkJLyogQSByYWNlIG9ubHkgY2hhbmdlcyB3aGV0aGVyIHRoaXMgYmxrZyBpcyByZXR1cm5lZC4gKi8KJiM0MzsJCWlmIChkYXRhX3JhY2UoYmxrZy0mZ3Q7b25saW5lKSkgewomIzQzOwkJCWtpdC0mZ3Q7cG9zID0gYmxrZzsKJiM0MzsJCQlyZXR1cm4gYmxrZzsKJiM0MzsJCX0KJiM0MzsJCW5vZGUgPSByY3VfZGVyZWZlcmVuY2UoaGxpc3RfbmV4dF9yY3UoJmFtcDtibGtnLSZndDtibGtjZ19ub2RlKSk7CiYjNDM7CX0KJiM0MzsKJiM0MzsJLyogVGhlIGl0ZXJhdG9yIG11c3Qga2VlcCByZXR1cm5pbmcgTlVMTCBhZnRlciBjb21wbGV0aW9uLiAqLwomIzQzOwlraXQtJmd0O3BvcyA9IE5VTEw7CiYjNDM7CWtpdC0mZ3Q7YmxrY2cgPSBOVUxMOwomIzQzOwlyZXR1cm4gTlVMTDsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoqCiYjNDM7ICogYnBmX2l0ZXJfYmxrZ19kZXN0cm95IC0gVGVhciBkb3duIGEgYmxrZyBpdGVyYXRvcgomIzQzOyAqIEBpdDogaXRlcmF0b3IKJiM0MzsgKi8KJiM0MztfX2JwZl9rZnVuYyB2b2lkIGJwZl9pdGVyX2Jsa2dfZGVzdHJveShzdHJ1Y3QgYnBmX2l0ZXJfYmxrZyAqaXQpCiYjNDM7ewomIzQzO30KJiM0MzsKJiM0MztfX2JwZl9rZnVuY19lbmRfZGVmcygpOwomIzQzOwomIzQzO0JURl9LRlVOQ1NfU1RBUlQoYnBmX2Jsa2NnX2tmdW5jcykKJiM0MztCVEZfSURfRkxBR1MoZnVuYywgYnBmX2Jsa2NnX2ZsdXNoX3N0YXRzLCBLRl9TTEVFUEFCTEUpCiYjNDM7CiYjNDM7QlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9pdGVyX2Jsa2dfbmV3LAomIzQzOwkgICAgIEtGX0lURVJfTkVXIHwgS0ZfUkNVIHwgS0ZfUkNVX1BST1RFQ1RFRCkKJiM0MztCVEZfSURfRkxBR1MoZnVuYywgYnBmX2l0ZXJfYmxrZ19uZXh0LCBLRl9JVEVSX05FWFQgfCBLRl9SRVRfTlVMTCkKJiM0MztCVEZfSURfRkxBR1MoZnVuYywgYnBmX2l0ZXJfYmxrZ19kZXN0cm95LCBLRl9JVEVSX0RFU1RST1kpCiYjNDM7QlRGX0tGVU5DU19FTkQoYnBmX2Jsa2NnX2tmdW5jcykKJiM0MzsKJiM0MztzdGF0aWMgY29uc3Qgc3RydWN0IGJ0Zl9rZnVuY19pZF9zZXQgYnBmX2Jsa2NnX2tmdW5jX3NldCA9IHsKJiM0MzsJLm93bmVyCQk9IFRISVNfTU9EVUxFLAomIzQzOwkuc2V0CQk9ICZhbXA7YnBmX2Jsa2NnX2tmdW5jcywKJiM0Mzt9OwomIzQzOwomIzQzO3N0YXRpYyBpbnQgX19pbml0IGJwZl9ibGtjZ19pbml0KHZvaWQpCiYjNDM7ewomIzQzOwlpbnQgZXJyOwomIzQzOwomIzQzOwllcnIgPSByZWdpc3Rlcl9idGZfa2Z1bmNfaWRfc2V0KEJQRl9QUk9HX1RZUEVfVU5TUEVDLAomIzQzOwkJCQkJJmFtcDticGZfYmxrY2dfa2Z1bmNfc2V0KTsKJiM0MzsJaWYgKGVycikKJiM0MzsJCXByX3dhcm4oJiMzNDtlcnJvciB3aGlsZSByZWdpc3RlcmluZyBicGYgYmxrY2cga2Z1bmNzOiAlZFxuJiMzNDssIGVycik7CiYjNDM7CiYjNDM7CXJldHVybiBlcnI7CiYjNDM7fQomIzQzO2xhdGVfaW5pdGNhbGwoYnBmX2Jsa2NnX2luaXQpOwpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL2Nncm91cF9pdGVyX2lvLmggYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvY2dyb3VwX2l0ZXJfaW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwLi5mNGJiYWFjY2RmNzE2Ci0tLSAvZGV2L251bGwKJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL2Nncm91cF9pdGVyX2lvLmgKQEAgLTAsMCAmIzQzOzEsMTcgQEAKJiM0MzsvKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMCAqLwomIzQzOy8qIENvcHlyaWdodCAoYykgMjAyNSBNZXRhIFBsYXRmb3JtcywgSW5jLiBhbmQgYWZmaWxpYXRlcy4gKi8KJiM0MzsjaWZuZGVmIF9fQ0dST1VQX0lURVJfSU9fSAomIzQzOyNkZWZpbmUgX19DR1JPVVBfSVRFUl9JT19ICiYjNDM7CiYjNDM7c3RydWN0IGlvX3F1ZXJ5IHsKJiM0MzsJLyogb25lIGRldmljZSYjMzk7cyBpby5zdGF0IGNvdW50ZXJzICovCiYjNDM7CV9fdTY0IHJieXRlczsKJiM0MzsJX191NjQgd2J5dGVzOwomIzQzOwlfX3U2NCByaW9zOwomIzQzOwlfX3U2NCB3aW9zOwomIzQzOwlfX3U2NCBkYnl0ZXM7CiYjNDM7CV9fdTY0IGRpb3M7CiYjNDM7CV9fdTY0IGRldjsJLyogZGV2X3Qgb2YgdGhlIGRldmljZSB0aGUgY291bnRlcnMgYmVsb25nIHRvICovCiYjNDM7fTsKJiM0MzsKJiM0MzsjZW5kaWYgLyogX19DR1JPVVBfSVRFUl9JT19IICovCmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvY29uZmlnIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL2NvbmZpZwppbmRleCBlYTcwNDRmMzBhZGMzLi4yNzBlNmJmOTE5NGQyIDEwMDY0NAotLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvY29uZmlnCiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9jb25maWcKQEAgLTEsMyAmIzQzOzEsNCBAQAomIzQzO0NPTkZJR19CTEtfQ0dST1VQPXkKIENPTkZJR19CTEtfREVWX0xPT1A9eQogQ09ORklHX0JPT1RQQVJBTV9IQVJETE9DS1VQX1BBTklDPXkKIENPTkZJR19CT09UUEFSQU1fU09GVExPQ0tVUF9QQU5JQz0xCmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9jZ3JvdXBfaXRlcl9pby5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvY2dyb3VwX2l0ZXJfaW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwLi41ZDI3ZTVkMjgzNzk1Ci0tLSAvZGV2L251bGwKJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvY2dyb3VwX2l0ZXJfaW8uYwpAQCAtMCwwICYjNDM7MSwyNzcgQEAKJiM0MzsvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMAomIzQzOy8qIENvcHlyaWdodCAoYykgMjAyNSBNZXRhIFBsYXRmb3JtcywgSW5jLiBhbmQgYWZmaWxpYXRlcy4gKi8KJiM0MzsjZGVmaW5lIF9HTlVfU09VUkNFCiYjNDM7I2luY2x1ZGUgJmx0O3Rlc3RfcHJvZ3MuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7YnBmL2xpYmJwZi5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtmY250bC5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9sb29wLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N0ZGxpYi5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtzdHJpbmcuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7c3lzL2lvY3RsLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N5cy9zdGF0LmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N5cy9zeXNtYWNyb3MuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7dW5pc3RkLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJiMzNDtjZ3JvdXBfaGVscGVycy5oJiMzNDsKJiM0MzsjaW5jbHVkZSAmIzM0O2Nncm91cF9pdGVyX2lvLmgmIzM0OwomIzQzOyNpbmNsdWRlICYjMzQ7Y2dyb3VwX2l0ZXJfaW8uc2tlbC5oJiMzNDsKJiM0MzsKJiM0MzsjZGVmaW5lIElPX1NJWkUgKDQgKiAxMDI0ICogMTAyNCkKJiM0MzsKJiM0MztzdGF0aWMgaW50IHJlYWRfc3RhdHMoc3RydWN0IGJwZl9saW5rICpsaW5rKQomIzQzO3sKJiM0MzsJaW50IGZkLCByZXQgPSAwOwomIzQzOwlzc2l6ZV90IGJ5dGVzOwomIzQzOwomIzQzOwlmZCA9IGJwZl9pdGVyX2NyZWF0ZShicGZfbGlua19fZmQobGluaykpOwomIzQzOwlpZiAoIUFTU0VSVF9PS19GRChmZCwgJiMzNDticGZfaXRlcl9jcmVhdGUmIzM0OykpCiYjNDM7CQlyZXR1cm4gMTsKJiM0MzsKJiM0MzsJLyogUmVzdWx0cyBsYW5kIGluIHNrZWwtJmd0O2RhdGFfcXVlcnk7IHRoZSByZWFkIGl0c2VsZiByZXR1cm5zIG5vIGRhdGEuICovCiYjNDM7CWJ5dGVzID0gcmVhZChmZCwgTlVMTCwgMCk7CiYjNDM7CWlmICghQVNTRVJUX0VRKGJ5dGVzLCAwLCAmIzM0O3JlYWQgZmQmIzM0OykpCiYjNDM7CQlyZXQgPSAxOwomIzQzOwomIzQzOwljbG9zZShmZCk7CiYjNDM7CXJldHVybiByZXQ7CiYjNDM7fQomIzQzOwomIzQzOy8qIFNldCB1cCBhIGxvb3AgZGV2aWNlIGZvciBjZ3JvdXAtY2hhcmdlZCBJL08uICovCiYjNDM7c3RhdGljIGludCBsb29wX3NldHVwKGNoYXIgKmxvb3BfcGF0aCwgc2l6ZV90IHN6LCBpbnQgKmN0bF9mZCwgaW50ICpsb29wX2ZkLAomIzQzOwkJICAgICAgaW50ICpiYWNrX2ZkKQomIzQzO3sKJiM0MzsJY2hhciBiYWNrX3BhdGhbXSA9ICYjMzQ7L3RtcC9jZ3JvdXBfaXRlcl9pby5YWFhYWFgmIzM0OzsKJiM0MzsJaW50IG5yOwomIzQzOwomIzQzOwkqY3RsX2ZkID0gKmxvb3BfZmQgPSAqYmFja19mZCA9IC0xOwomIzQzOwomIzQzOwkqY3RsX2ZkID0gb3BlbigmIzM0Oy9kZXYvbG9vcC1jb250cm9sJiMzNDssIE9fUkRXUiB8IE9fQ0xPRVhFQyk7CiYjNDM7CWlmICgqY3RsX2ZkICZsdDsgMCkKJiM0MzsJCXJldHVybiAtMTsKJiM0MzsKJiM0MzsJbnIgPSBpb2N0bCgqY3RsX2ZkLCBMT09QX0NUTF9HRVRfRlJFRSk7CiYjNDM7CWlmIChuciAmbHQ7IDApCiYjNDM7CQlnb3RvIGVycjsKJiM0MzsJc25wcmludGYobG9vcF9wYXRoLCBzeiwgJiMzNDsvZGV2L2xvb3AlZCYjMzQ7LCBucik7CiYjNDM7CiYjNDM7CSpiYWNrX2ZkID0gbWtzdGVtcChiYWNrX3BhdGgpOwomIzQzOwlpZiAoKmJhY2tfZmQgJmx0OyAwKQomIzQzOwkJZ290byBlcnI7CiYjNDM7CXVubGluayhiYWNrX3BhdGgpOwomIzQzOwlpZiAoZnRydW5jYXRlKCpiYWNrX2ZkLCAob2ZmX3QpSU9fU0laRSAqIDQpKQomIzQzOwkJZ290byBlcnI7CiYjNDM7CiYjNDM7CSpsb29wX2ZkID0gb3Blbihsb29wX3BhdGgsIE9fUkRXUiB8IE9fQ0xPRVhFQyk7CiYjNDM7CWlmICgqbG9vcF9mZCAmbHQ7IDApCiYjNDM7CQlnb3RvIGVycjsKJiM0MzsJaWYgKGlvY3RsKCpsb29wX2ZkLCBMT09QX1NFVF9GRCwgKmJhY2tfZmQpKQomIzQzOwkJZ290byBlcnI7CiYjNDM7CiYjNDM7CXJldHVybiAwOwomIzQzO2VycjoKJiM0MzsJaWYgKCpsb29wX2ZkICZndDs9IDApCiYjNDM7CQljbG9zZSgqbG9vcF9mZCk7CiYjNDM7CWlmICgqYmFja19mZCAmZ3Q7PSAwKQomIzQzOwkJY2xvc2UoKmJhY2tfZmQpOwomIzQzOwljbG9zZSgqY3RsX2ZkKTsKJiM0MzsJKmN0bF9mZCA9ICpsb29wX2ZkID0gKmJhY2tfZmQgPSAtMTsKJiM0MzsJcmV0dXJuIC0xOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgdm9pZCBsb29wX3RlYXJkb3duKGNvbnN0IGNoYXIgKmxvb3BfcGF0aCwgaW50IGN0bF9mZCwgaW50IGxvb3BfZmQsCiYjNDM7CQkJICBpbnQgYmFja19mZCkKJiM0Mzt7CiYjNDM7CWludCBuciA9IC0xOwomIzQzOwomIzQzOwlpZiAobG9vcF9mZCAmZ3Q7PSAwKSB7CiYjNDM7CQlpb2N0bChsb29wX2ZkLCBMT09QX0NMUl9GRCwgMCk7CiYjNDM7CQljbG9zZShsb29wX2ZkKTsKJiM0MzsJfQomIzQzOwlpZiAoYmFja19mZCAmZ3Q7PSAwKQomIzQzOwkJY2xvc2UoYmFja19mZCk7CiYjNDM7CWlmIChjdGxfZmQgJmd0Oz0gMCkgewomIzQzOwkJaWYgKHNzY2FuZihsb29wX3BhdGgsICYjMzQ7L2Rldi9sb29wJWQmIzM0OywgJmFtcDtucikgPT0gMSAmYW1wOyZhbXA7IG5yICZndDs9IDApCiYjNDM7CQkJaW9jdGwoY3RsX2ZkLCBMT09QX0NUTF9SRU1PVkUsIG5yKTsKJiM0MzsJCWNsb3NlKGN0bF9mZCk7CiYjNDM7CX0KJiM0Mzt9CiYjNDM7CiYjNDM7LyogT19ESVJFQ1Qga2VlcHMgSS9PIGNoYXJnZWQgdG8gdGhlIGN1cnJlbnQgY2dyb3VwLiAqLwomIzQzO3N0YXRpYyBpbnQgZG9fZGlyZWN0X2lvKGNvbnN0IGNoYXIgKmxvb3BfcGF0aCkKJiM0Mzt7CiYjNDM7CXZvaWQgKmJ1ZjsKJiM0MzsJaW50IGZkLCByZXQgPSAtMTsKJiM0MzsKJiM0MzsJZmQgPSBvcGVuKGxvb3BfcGF0aCwgT19SRFdSIHwgT19ESVJFQ1QgfCBPX0NMT0VYRUMpOwomIzQzOwlpZiAoZmQgJmx0OyAwKQomIzQzOwkJcmV0dXJuIC0xOwomIzQzOwlpZiAocG9zaXhfbWVtYWxpZ24oJmFtcDtidWYsIDQwOTYsIElPX1NJWkUpKQomIzQzOwkJZ290byBvdXRfZmQ7CiYjNDM7CW1lbXNldChidWYsIDB4YWIsIElPX1NJWkUpOwomIzQzOwomIzQzOwlpZiAocHdyaXRlKGZkLCBidWYsIElPX1NJWkUsIDApICE9IElPX1NJWkUpCiYjNDM7CQlnb3RvIG91dF9idWY7CiYjNDM7CWZzeW5jKGZkKTsKJiM0MzsJaWYgKHByZWFkKGZkLCBidWYsIElPX1NJWkUsIDApICE9IElPX1NJWkUpCiYjNDM7CQlnb3RvIG91dF9idWY7CiYjNDM7CXJldCA9IDA7CiYjNDM7b3V0X2J1ZjoKJiM0MzsJZnJlZShidWYpOwomIzQzO291dF9mZDoKJiM0MzsJY2xvc2UoZmQpOwomIzQzOwlyZXR1cm4gcmV0OwomIzQzO30KJiM0MzsKJiM0MzsvKiBSZWFkIEBkZXYmIzM5O3MgaW8uc3RhdCBjb3VudGVycy4gQGRldiB1c2VzIGtlcm5lbCBkZXZfdCBlbmNvZGluZy4gKi8KJiM0MztzdGF0aWMgaW50IHBhcnNlX2lvX3N0YXQoaW50IGNncm91cF9mZCwgX191NjQgZGV2LCBzdHJ1Y3QgaW9fcXVlcnkgKm91dCkKJiM0Mzt7CiYjNDM7CXVuc2lnbmVkIGludCB3YW50X21haiA9IGRldiAmZ3Q7Jmd0OyAyMCwgd2FudF9taW4gPSBkZXYgJmFtcDsgKCgxVSAmbHQ7Jmx0OyAyMCkgLSAxKTsKJiM0MzsJY2hhciBidWZbNDA5Nl0sICpsaW5lLCAqc2F2ZXB0cjsKJiM0MzsJaW50IGZkLCBuLCByZXQgPSAtMTsKJiM0MzsKJiM0MzsJZmQgPSBvcGVuYXQoY2dyb3VwX2ZkLCAmIzM0O2lvLnN0YXQmIzM0OywgT19SRE9OTFkpOwomIzQzOwlpZiAoZmQgJmx0OyAwKQomIzQzOwkJcmV0dXJuIC0xOwomIzQzOwluID0gcmVhZChmZCwgYnVmLCBzaXplb2YoYnVmKSAtIDEpOwomIzQzOwljbG9zZShmZCk7CiYjNDM7CWlmIChuICZsdDs9IDApCiYjNDM7CQlyZXR1cm4gLTE7CiYjNDM7CWJ1ZltuXSA9ICYjMzk7XDAmIzM5OzsKJiM0MzsKJiM0MzsJZm9yIChsaW5lID0gc3RydG9rX3IoYnVmLCAmIzM0O1xuJiMzNDssICZhbXA7c2F2ZXB0cik7IGxpbmU7CiYjNDM7CSAgICAgbGluZSA9IHN0cnRva19yKE5VTEwsICYjMzQ7XG4mIzM0OywgJmFtcDtzYXZlcHRyKSkgewomIzQzOwkJdW5zaWduZWQgbG9uZyBsb25nIHJiID0gMCwgd2IgPSAwLCByaSA9IDAsIHdpID0gMCwgZGIgPSAwLCBkaSA9IDA7CiYjNDM7CQl1bnNpZ25lZCBpbnQgbWFqLCBtaW47CiYjNDM7CiYjNDM7CQkvKiBPbmx5IHRoZSBkZXZpY2UgaWQgaXMgcmVxdWlyZWQ7IG1pc3NpbmcgY291bnRlcnMgc3RheSB6ZXJvLiAqLwomIzQzOwkJaWYgKHNzY2FuZihsaW5lLAomIzQzOwkJCSAgICYjMzQ7JXU6JXUgcmJ5dGVzPSVsbHUgd2J5dGVzPSVsbHUgcmlvcz0lbGx1IHdpb3M9JWxsdSBkYnl0ZXM9JWxsdSBkaW9zPSVsbHUmIzM0OywKJiM0MzsJCQkgICAmYW1wO21haiwgJmFtcDttaW4sICZhbXA7cmIsICZhbXA7d2IsICZhbXA7cmksICZhbXA7d2ksICZhbXA7ZGIsICZhbXA7ZGkpICZsdDsgMikKJiM0MzsJCQljb250aW51ZTsKJiM0MzsJCWlmIChtYWogIT0gd2FudF9tYWogfHwgbWluICE9IHdhbnRfbWluKQomIzQzOwkJCWNvbnRpbnVlOwomIzQzOwomIzQzOwkJb3V0LSZndDtyYnl0ZXMgPSByYjsKJiM0MzsJCW91dC0mZ3Q7d2J5dGVzID0gd2I7CiYjNDM7CQlvdXQtJmd0O3Jpb3MgPSByaTsKJiM0MzsJCW91dC0mZ3Q7d2lvcyA9IHdpOwomIzQzOwkJb3V0LSZndDtkYnl0ZXMgPSBkYjsKJiM0MzsJCW91dC0mZ3Q7ZGlvcyA9IGRpOwomIzQzOwkJcmV0ID0gMDsKJiM0MzsJCWJyZWFrOwomIzQzOwl9CiYjNDM7CXJldHVybiByZXQ7CiYjNDM7fQomIzQzOwomIzQzO3ZvaWQgdGVzdF9jZ3JvdXBfaXRlcl9pbyh2b2lkKQomIzQzO3sKJiM0MzsJY2hhciAqY2dyb3VwX3JlbF9wYXRoID0gJiMzNDsvY2dyb3VwX2l0ZXJfaW9fdGVzdCYjMzQ7OwomIzQzOwlpbnQgY3RsX2ZkID0gLTEsIGxvb3BfZmQgPSAtMSwgYmFja19mZCA9IC0xOwomIzQzOwlzdHJ1Y3QgY2dyb3VwX2l0ZXJfaW8gKnNrZWwgPSBOVUxMOwomIzQzOwlzdHJ1Y3QgYnBmX2xpbmsgKmxpbmsgPSBOVUxMOwomIzQzOwljaGFyIGxvb3BfcGF0aFs2NF07CiYjNDM7CXN0cnVjdCBpb19xdWVyeSAqcTsKJiM0MzsJaW50IGNncm91cF9mZDsKJiM0MzsKJiM0MzsJY2dyb3VwX2ZkID0gY2dyb3VwX3NldHVwX2FuZF9qb2luKGNncm91cF9yZWxfcGF0aCk7CiYjNDM7CWlmICghQVNTRVJUX09LX0ZEKGNncm91cF9mZCwgJiMzNDtjZ3JvdXBfc2V0dXBfYW5kX2pvaW4mIzM0OykpCiYjNDM7CQlyZXR1cm47CiYjNDM7CiYjNDM7CWlmIChsb29wX3NldHVwKGxvb3BfcGF0aCwgc2l6ZW9mKGxvb3BfcGF0aCksICZhbXA7Y3RsX2ZkLCAmYW1wO2xvb3BfZmQsICZhbXA7YmFja19mZCkpIHsKJiM0MzsJCXRlc3RfX3NraXAoKTsJLyogbmVlZHMgcm9vdCAmIzQzOyBDT05GSUdfQkxLX0RFVl9MT09QICovCiYjNDM7CQlnb3RvIGNsZWFudXBfY2dyb3VwX2ZkOwomIzQzOwl9CiYjNDM7CiYjNDM7CXNrZWwgPSBjZ3JvdXBfaXRlcl9pb19fb3Blbl9hbmRfbG9hZCgpOwomIzQzOwlpZiAoIUFTU0VSVF9PS19QVFIoc2tlbCwgJiMzNDtjZ3JvdXBfaXRlcl9pb19fb3Blbl9hbmRfbG9hZCYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cF9sb29wOwomIzQzOwomIzQzOwkvKiBDb252ZXJ0IGdsaWJjIHN0X3JkZXYgdG8ga2VybmVsIGRldl90IGZvcm1hdC4gKi8KJiM0MzsJewomIzQzOwkJc3RydWN0IHN0YXQgbHN0OwomIzQzOwomIzQzOwkJaWYgKCFBU1NFUlRfT0soZnN0YXQobG9vcF9mZCwgJmFtcDtsc3QpLCAmIzM0O2ZzdGF0IGxvb3AmIzM0OykpCiYjNDM7CQkJZ290byBjbGVhbnVwX3NrZWw7CiYjNDM7CQlza2VsLSZndDtkYXRhX3F1ZXJ5LSZndDt0YXJnZXRfZGV2ID0KJiM0MzsJCQkoKF9fdTY0KW1ham9yKGxzdC5zdF9yZGV2KSAmbHQ7Jmx0OyAyMCkgfCBtaW5vcihsc3Quc3RfcmRldik7CiYjNDM7CX0KJiM0MzsKJiM0MzsJREVDTEFSRV9MSUJCUEZfT1BUUyhicGZfaXRlcl9hdHRhY2hfb3B0cywgb3B0cyk7CiYjNDM7CXVuaW9uIGJwZl9pdGVyX2xpbmtfaW5mbyBsaW5mbyA9IHsKJiM0MzsJCS5jZ3JvdXAuY2dyb3VwX2ZkID0gY2dyb3VwX2ZkLAomIzQzOwkJLmNncm91cC5vcmRlciA9IEJQRl9DR1JPVVBfSVRFUl9TRUxGX09OTFksCiYjNDM7CX07CiYjNDM7CW9wdHMubGlua19pbmZvID0gJmFtcDtsaW5mbzsKJiM0MzsJb3B0cy5saW5rX2luZm9fbGVuID0gc2l6ZW9mKGxpbmZvKTsKJiM0MzsKJiM0MzsJbGluayA9IGJwZl9wcm9ncmFtX19hdHRhY2hfaXRlcihza2VsLSZndDtwcm9ncy5jZ3JvdXBfaW9fcXVlcnksICZhbXA7b3B0cyk7CiYjNDM7CWlmICghQVNTRVJUX09LX1BUUihsaW5rLCAmIzM0O2JwZl9wcm9ncmFtX19hdHRhY2hfaXRlciYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cF9za2VsOwomIzQzOwomIzQzOwkvKiBUaGlzIHByb2Nlc3MgaXMgaW4gdGhlIHRlc3QgY2dyb3VwLCBzbyB0aGUgbG9vcCBJL08gaXMgY2hhcmdlZCBoZXJlLiAqLwomIzQzOwlpZiAoIUFTU0VSVF9PSyhkb19kaXJlY3RfaW8obG9vcF9wYXRoKSwgJiMzNDtkb19kaXJlY3RfaW8mIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXBfbGluazsKJiM0MzsKJiM0MzsJaWYgKCFBU1NFUlRfT0socmVhZF9zdGF0cyhsaW5rKSwgJiMzNDtyZWFkIHN0YXRzJiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwX2xpbms7CiYjNDM7CiYjNDM7CXEgPSAmYW1wO3NrZWwtJmd0O2RhdGFfcXVlcnktJmd0O2lvX3F1ZXJ5OwomIzQzOwlpZiAodGVzdF9fc3RhcnRfc3VidGVzdCgmIzM0O2Nncm91cF9pdGVyX2lvX193cml0ZSYjMzQ7KSkgewomIzQzOwkJQVNTRVJUX0dUKHEtJmd0O3dieXRlcywgMCwgJiMzNDt3Ynl0ZXMmIzM0Oyk7CiYjNDM7CQlBU1NFUlRfR1QocS0mZ3Q7d2lvcywgMCwgJiMzNDt3aW9zJiMzNDspOwomIzQzOwl9CiYjNDM7CWlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KCYjMzQ7Y2dyb3VwX2l0ZXJfaW9fX3JlYWQmIzM0OykpIHsKJiM0MzsJCUFTU0VSVF9HVChxLSZndDtyYnl0ZXMsIDAsICYjMzQ7cmJ5dGVzJiMzNDspOwomIzQzOwkJQVNTRVJUX0dUKHEtJmd0O3Jpb3MsIDAsICYjMzQ7cmlvcyYjMzQ7KTsKJiM0MzsJfQomIzQzOwlpZiAodGVzdF9fc3RhcnRfc3VidGVzdCgmIzM0O2Nncm91cF9pdGVyX2lvX19kZXYmIzM0OykpCiYjNDM7CQlBU1NFUlRfR1QocS0mZ3Q7ZGV2LCAwLCAmIzM0O2RldiYjMzQ7KTsKJiM0MzsKJiM0MzsJLyogQ29tcGFyZSB3aXRoIGlvLnN0YXQgd2l0aG91dCBJL08gYmV0d2VlbiB0aGUgcmVhZHMuICovCiYjNDM7CWlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KCYjMzQ7Y2dyb3VwX2l0ZXJfaW9fX21hdGNoJiMzNDspKSB7CiYjNDM7CQlzdHJ1Y3QgaW9fcXVlcnkgZmlsZXYgPSB7fTsKJiM0MzsKJiM0MzsJCWlmIChBU1NFUlRfT0socmVhZF9zdGF0cyhsaW5rKSwgJiMzNDtyZWFkIHN0YXRzJiMzNDspICZhbXA7JmFtcDsKJiM0MzsJCSAgICBBU1NFUlRfT0socGFyc2VfaW9fc3RhdChjZ3JvdXBfZmQsIHEtJmd0O2RldiwgJmFtcDtmaWxldiksCiYjNDM7CQkJICAgICAgJiMzNDtwYXJzZSBpby5zdGF0JiMzNDspKSB7CiYjNDM7CQkJQVNTRVJUX0VRKHEtJmd0O3JieXRlcywgZmlsZXYucmJ5dGVzLCAmIzM0O3JieXRlcyYjMzQ7KTsKJiM0MzsJCQlBU1NFUlRfRVEocS0mZ3Q7d2J5dGVzLCBmaWxldi53Ynl0ZXMsICYjMzQ7d2J5dGVzJiMzNDspOwomIzQzOwkJCUFTU0VSVF9FUShxLSZndDtyaW9zLCBmaWxldi5yaW9zLCAmIzM0O3Jpb3MmIzM0Oyk7CiYjNDM7CQkJQVNTRVJUX0VRKHEtJmd0O3dpb3MsIGZpbGV2Lndpb3MsICYjMzQ7d2lvcyYjMzQ7KTsKJiM0MzsJCQlBU1NFUlRfRVEocS0mZ3Q7ZGJ5dGVzLCBmaWxldi5kYnl0ZXMsICYjMzQ7ZGJ5dGVzJiMzNDspOwomIzQzOwkJCUFTU0VSVF9FUShxLSZndDtkaW9zLCBmaWxldi5kaW9zLCAmIzM0O2Rpb3MmIzM0Oyk7CiYjNDM7CQl9CiYjNDM7CX0KJiM0MzsKJiM0MzsJLyogUm9vdCBzdGF0aXN0aWNzIGluY2x1ZGUgdGhpcyBjZ3JvdXAmIzM5O3MgSS9PLiAqLwomIzQzOwlpZiAodGVzdF9fc3RhcnRfc3VidGVzdCgmIzM0O2Nncm91cF9pdGVyX2lvX19yb290JiMzNDspKSB7CiYjNDM7CQlzdHJ1Y3QgYnBmX2xpbmsgKnJvb3RfbGluazsKJiM0MzsJCXN0cnVjdCBpb19xdWVyeSAqcjsKJiM0MzsKJiM0MzsJCXNrZWwtJmd0O2RhdGFfcXVlcnktJmd0O2dvdF9yb290X2NzcyA9IDA7CiYjNDM7CQlyb290X2xpbmsgPSBicGZfcHJvZ3JhbV9fYXR0YWNoX2l0ZXIoc2tlbC0mZ3Q7cHJvZ3MuY2dyb3VwX3Jvb3RfaW9fcXVlcnksCiYjNDM7CQkJCQkJICAgICAmYW1wO29wdHMpOwomIzQzOwkJaWYgKEFTU0VSVF9PS19QVFIocm9vdF9saW5rLCAmIzM0O2F0dGFjaCByb290IGl0ZXImIzM0OykpIHsKJiM0MzsJCQlpZiAoQVNTRVJUX09LKHJlYWRfc3RhdHMocm9vdF9saW5rKSwgJiMzNDtyZWFkIHJvb3Qgc3RhdHMmIzM0OykpIHsKJiM0MzsJCQkJciA9ICZhbXA7c2tlbC0mZ3Q7ZGF0YV9xdWVyeS0mZ3Q7cm9vdF9xdWVyeTsKJiM0MzsJCQkJQVNTRVJUX0VRKHNrZWwtJmd0O2RhdGFfcXVlcnktJmd0O2dvdF9yb290X2NzcywgMSwKJiM0MzsJCQkJCSAgJiMzNDtnb3Rfcm9vdF9jc3MmIzM0Oyk7CiYjNDM7CQkJCUFTU0VSVF9FUShyLSZndDtkZXYsIHEtJmd0O2RldiwgJiMzNDtyb290IGRldiYjMzQ7KTsKJiM0MzsJCQkJQVNTRVJUX0dFKHItJmd0O3dieXRlcywgcS0mZ3Q7d2J5dGVzLCAmIzM0O3Jvb3Qgd2J5dGVzJiMzNDspOwomIzQzOwkJCQlBU1NFUlRfR0Uoci0mZ3Q7d2lvcywgcS0mZ3Q7d2lvcywgJiMzNDtyb290IHdpb3MmIzM0Oyk7CiYjNDM7CQkJCUFTU0VSVF9HRShyLSZndDtyYnl0ZXMsIHEtJmd0O3JieXRlcywgJiMzNDtyb290IHJieXRlcyYjMzQ7KTsKJiM0MzsJCQkJQVNTRVJUX0dFKHItJmd0O3Jpb3MsIHEtJmd0O3Jpb3MsICYjMzQ7cm9vdCByaW9zJiMzNDspOwomIzQzOwkJCX0KJiM0MzsJCQlicGZfbGlua19fZGVzdHJveShyb290X2xpbmspOwomIzQzOwkJfQomIzQzOwl9CiYjNDM7CiYjNDM7Y2xlYW51cF9saW5rOgomIzQzOwlicGZfbGlua19fZGVzdHJveShsaW5rKTsKJiM0MztjbGVhbnVwX3NrZWw6CiYjNDM7CWNncm91cF9pdGVyX2lvX19kZXN0cm95KHNrZWwpOwomIzQzO2NsZWFudXBfbG9vcDoKJiM0MzsJbG9vcF90ZWFyZG93bihsb29wX3BhdGgsIGN0bF9mZCwgbG9vcF9mZCwgYmFja19mZCk7CiYjNDM7Y2xlYW51cF9jZ3JvdXBfZmQ6CiYjNDM7CWNsb3NlKGNncm91cF9mZCk7CiYjNDM7CWNsZWFudXBfY2dyb3VwX2Vudmlyb25tZW50KCk7CiYjNDM7fQpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL2Nncm91cF9pdGVyX2lvLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvY2dyb3VwX2l0ZXJfaW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwLi4yY2Q1MzgwNjg5ODdhCi0tLSAvZGV2L251bGwKJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL2Nncm91cF9pdGVyX2lvLmMKQEAgLTAsMCAmIzQzOzEsOTkgQEAKJiM0MzsvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMAomIzQzOy8qIENvcHlyaWdodCAoYykgMjAyNSBNZXRhIFBsYXRmb3JtcywgSW5jLiBhbmQgYWZmaWxpYXRlcy4gKi8KJiM0MzsjaW5jbHVkZSAmbHQ7dm1saW51eC5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDticGYvYnBmX2hlbHBlcnMuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7YnBmL2JwZl9jb3JlX3JlYWQuaCZndDsKJiM0MzsjaW5jbHVkZSAmIzM0O2JwZl9leHBlcmltZW50YWwuaCYjMzQ7CiYjNDM7I2luY2x1ZGUgJiMzNDtjZ3JvdXBfaXRlcl9pby5oJiMzNDsKJiM0MzsKJiM0MztjaGFyIF9saWNlbnNlW10gU0VDKCYjMzQ7bGljZW5zZSYjMzQ7KSA9ICYjMzQ7R1BMJiMzNDs7CiYjNDM7CiYjNDM7c3RydWN0IGlvX3F1ZXJ5IGlvX3F1ZXJ5IFNFQygmIzM0Oy5kYXRhLnF1ZXJ5JiMzNDspOwomIzQzOwomIzQzO3N0cnVjdCBpb19xdWVyeSByb290X3F1ZXJ5IFNFQygmIzM0Oy5kYXRhLnF1ZXJ5JiMzNDspOwomIzQzOwomIzQzO19fdTY0IGdvdF9yb290X2NzcyBTRUMoJiMzNDsuZGF0YS5xdWVyeSYjMzQ7KTsKJiM0MzsKJiM0MzsvKiBEZXZpY2Ugc2VsZWN0ZWQgYnkgdXNlcnNwYWNlIGluIGtlcm5lbCBkZXZfdCBmb3JtYXQuICovCiYjNDM7X191NjQgdGFyZ2V0X2RldiBTRUMoJiMzNDsuZGF0YS5xdWVyeSYjMzQ7KTsKJiM0MzsKJiM0MzsvKiBLZWVwIGlubGluZTogUkNVIGFuZCBvcGVuLWNvZGVkIGl0ZXJhdG9ycyBjYW5ub3QgY3Jvc3MgYSBCUEYgY2FsbC4gKi8KJiM0MztzdGF0aWMgX19hbHdheXNfaW5saW5lIGludCByZWFkX3RhcmdldF9kZXYoc3RydWN0IGNncm91cCAqY2dycCwKJiM0MzsJCQkJCSAgIHN0cnVjdCBpb19xdWVyeSAqb3V0KQomIzQzO3sKJiM0MzsJc3RydWN0IGNncm91cF9zdWJzeXNfc3RhdGUgKmNzczsKJiM0MzsJc3RydWN0IGJsa2NnX2dxICpwb3M7CiYjNDM7CV9fdTY0IGRldjsKJiM0MzsJaW50IHNzaWQ7CiYjNDM7CiYjNDM7CS8qIFRoZSBmbHVzaCBjYW4gc2xlZXAsIHNvIHJ1biBpdCBiZWZvcmUgdGhlIFJDVSBzZWN0aW9uLiAqLwomIzQzOwlicGZfYmxrY2dfZmx1c2hfc3RhdHMoY2dycCk7CiYjNDM7CiYjNDM7CWJwZl9yY3VfcmVhZF9sb2NrKCk7CiYjNDM7CXNzaWQgPSBicGZfY29yZV9lbnVtX3ZhbHVlKGVudW0gY2dyb3VwX3N1YnN5c19pZCwgaW9fY2dycF9pZCk7CiYjNDM7CiYjNDM7CS8qCiYjNDM7CSAqIHN1YnN5c1tdIGlzIF9fcmN1LCBzbyB0aGlzIHJlYWQgZ2l2ZXMgYW4gUkNVIHBvaW50ZXIgdGhlIGl0ZXJhdG9yCiYjNDM7CSAqIGFjY2VwdHMuIEJQRl9DT1JFX1JFQUQoKSB3b3VsZCByZXR1cm4gYSBwbGFpbiB2YWx1ZSBpbnN0ZWFkLgomIzQzOwkgKi8KJiM0MzsJY3NzID0gY2dycC0mZ3Q7c3Vic3lzW3NzaWRdOwomIzQzOwlpZiAoIWNzcykgewomIzQzOwkJYnBmX3JjdV9yZWFkX3VubG9jaygpOwomIzQzOwkJcmV0dXJuIDA7CiYjNDM7CX0KJiM0MzsKJiM0MzsJYnBmX2Zvcl9lYWNoKGJsa2csIHBvcywgY3NzKSB7CiYjNDM7CQlkZXYgPSBCUEZfQ09SRV9SRUFEKHBvcywgcSwgZGlzaywgcGFydDAsIGJkX2Rldik7CiYjNDM7CQlpZiAoZGV2ICE9IHRhcmdldF9kZXYpCiYjNDM7CQkJY29udGludWU7CiYjNDM7CiYjNDM7CQlvdXQtJmd0O2RldiA9IGRldjsKJiM0MzsJCW91dC0mZ3Q7cmJ5dGVzID0gQlBGX0NPUkVfUkVBRChwb3MsIGlvc3RhdC5jdXIuYnl0ZXNbQkxLR19JT1NUQVRfUkVBRF0pOwomIzQzOwkJb3V0LSZndDt3Ynl0ZXMgPSBCUEZfQ09SRV9SRUFEKHBvcywgaW9zdGF0LmN1ci5ieXRlc1tCTEtHX0lPU1RBVF9XUklURV0pOwomIzQzOwkJb3V0LSZndDtyaW9zID0gQlBGX0NPUkVfUkVBRChwb3MsIGlvc3RhdC5jdXIuaW9zW0JMS0dfSU9TVEFUX1JFQURdKTsKJiM0MzsJCW91dC0mZ3Q7d2lvcyA9IEJQRl9DT1JFX1JFQUQocG9zLCBpb3N0YXQuY3VyLmlvc1tCTEtHX0lPU1RBVF9XUklURV0pOwomIzQzOwkJb3V0LSZndDtkYnl0ZXMgPSBCUEZfQ09SRV9SRUFEKHBvcywgaW9zdGF0LmN1ci5ieXRlc1tCTEtHX0lPU1RBVF9ESVNDQVJEXSk7CiYjNDM7CQlvdXQtJmd0O2Rpb3MgPSBCUEZfQ09SRV9SRUFEKHBvcywgaW9zdGF0LmN1ci5pb3NbQkxLR19JT1NUQVRfRElTQ0FSRF0pOwomIzQzOwkJYnJlYWs7CiYjNDM7CX0KJiM0MzsJYnBmX3JjdV9yZWFkX3VubG9jaygpOwomIzQzOwlyZXR1cm4gMTsKJiM0Mzt9CiYjNDM7CiYjNDM7U0VDKCYjMzQ7aXRlci5zL2Nncm91cCYjMzQ7KQomIzQzO2ludCBjZ3JvdXBfaW9fcXVlcnkoc3RydWN0IGJwZl9pdGVyX19jZ3JvdXAgKmN0eCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBjZ3JvdXAgKmNncnAgPSBjdHgtJmd0O2Nncm91cDsKJiM0MzsKJiM0MzsJaWYgKCFjZ3JwKQomIzQzOwkJcmV0dXJuIDE7CiYjNDM7CiYjNDM7CS8qIFN0YXJ0IGZyZXNoIHNvIGEgZGV2aWNlIHRoYXQgaXMgbm90IGZvdW5kIHN0YXlzIGFsbC16ZXJvLiAqLwomIzQzOwlfX2J1aWx0aW5fbWVtc2V0KCZhbXA7aW9fcXVlcnksIDAsIHNpemVvZihpb19xdWVyeSkpOwomIzQzOwomIzQzOwlyZWFkX3RhcmdldF9kZXYoY2dycCwgJmFtcDtpb19xdWVyeSk7CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MzsKJiM0MztTRUMoJiMzNDtpdGVyLnMvY2dyb3VwJiMzNDspCiYjNDM7aW50IGNncm91cF9yb290X2lvX3F1ZXJ5KHN0cnVjdCBicGZfaXRlcl9fY2dyb3VwICpjdHgpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgY2dyb3VwICpyb290OwomIzQzOwomIzQzOwlpZiAoIWN0eC0mZ3Q7Y2dyb3VwKQomIzQzOwkJcmV0dXJuIDE7CiYjNDM7CiYjNDM7CV9fYnVpbHRpbl9tZW1zZXQoJmFtcDtyb290X3F1ZXJ5LCAwLCBzaXplb2Yocm9vdF9xdWVyeSkpOwomIzQzOwomIzQzOwkvKiBUaGUgcm9vdCBjZ3JvdXAgYWx3YXlzIGhhcyBpZCAxLiAqLwomIzQzOwlyb290ID0gYnBmX2Nncm91cF9mcm9tX2lkKDEpOwomIzQzOwlpZiAoIXJvb3QpCiYjNDM7CQlyZXR1cm4gMDsKJiM0MzsKJiM0MzsJLyogUm9vdCBjb3VudGVycyBpbmNsdWRlIGFsbCBjZ3JvdXBzJiMzOTsgSS9PLiAqLwomIzQzOwlpZiAocmVhZF90YXJnZXRfZGV2KHJvb3QsICZhbXA7cm9vdF9xdWVyeSkpCiYjNDM7CQlnb3Rfcm9vdF9jc3MgPSAxOwomIzQzOwomIzQzOwlicGZfY2dyb3VwX3JlbGVhc2Uocm9vdCk7CiYjNDM7CXJldHVybiAwOwomIzQzO30KPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+My8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTcgMjI6MzQ8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogOTY3NQoJCQkJCQkJb3V0cHV0OiAyMQoJCQkJCQkJdGhvdWdodHM6IDYwOAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipGdXp6aW5nIE5ldyBCUEYgS2Z1bmNzIGZvciBCbG9jayBDZ3JvdXAgSS9PIFN0YXRpc3RpY3MqKgoKT2theSwgc28gdGhlcmUmIzM5O3MgYSBwYXRjaCBpbnRyb2R1Y2luZyBCUEYga2Z1bmNzIGZvciBibG9jayBjZ3JvdXAgSS9PIHN0YXRpc3RpY3MuIE15IGluaXRpYWwgdGhvdWdodCBpcywgJiMzNDtJcyB0aGlzIGZ1enphYmxlPyYjMzQ7IFRoZSBhbnN3ZXIgaXMgYSBjbGVhciB5ZXMsIGJlY2F1c2Ugd2UmIzM5O3JlIHRhbGtpbmcgYWJvdXQgKm5ldyogQlBGIGtmdW5jcyB0aGF0IGFyZSBub3cgYWNjZXNzaWJsZSBmcm9tIEJQRiBwcm9ncmFtcy4gVGhpcyBvcGVucyB1cCBhIG5ldyBhdHRhY2sgc3VyZmFjZSwgYW5kIHRoYXTigJlzIHByZWNpc2VseSB3aGF0IEkmIzM5O20gaW50ZXJlc3RlZCBpbiBmb3IgZnV6emluZy4KClRoZXNlIG5ldyBrZnVuY3MgYXJlOiBgYnBmX2Jsa2NnX2ZsdXNoX3N0YXRzYCwgYGJwZl9pdGVyX2Jsa2dfbmV3YCwgYGJwZl9pdGVyX2Jsa2dfbmV4dGAsIGFuZCBgYnBmX2l0ZXJfYmxrZ19kZXN0cm95YC4gTGV0JiMzOTtzIHRha2UgYSBxdWljayBsb29rIGluc2lkZSBgYmxvY2svYnBmX2Jsa2NnLmNgIGp1c3QgdG8gbWFrZSBzdXJlIHdlIGhhdmVuJiMzOTt0IG1pc3NlZCBhbnl0aGluZyBlbHNlIGluIHRoZXJlLiBOb3BlLCB0aG9zZSBhcmUgdGhlIG9ubHkgZm91ciBmdW5jdGlvbnMuIEhvbGQgb24sIGBicGZfaXRlcl9ibGtnX2Rlc3Ryb3lgIGlzICplbXB0eSouIEl0JiMzOTtzIHN0aWxsIHdvcnRoIGFkZGluZywgYnV0IHRoZSBvdGhlciB0aHJlZSBhcmUgZ29pbmcgdG8gYmUgbW9yZSBpbnRlcmVzdGluZyBmb3IgZnV6emluZy4KCk15IG5leHQgc3RlcCBpcyB0byBuYWlsIGRvd24gdGhlIGNvbmZpZ3VyYXRpb24gcHJlcmVxdWlzaXRlcy4gV2UgbmVlZCBgQ09ORklHX0JQRl9TWVNDQUxMYCBhbmQgYENPTkZJR19CTEtfQ0dST1VQYCB0byBhY3R1YWxseSBoYXZlIGBicGZfYmxrY2cub2AgYnVpbHQuIE5vdywganVzdCB0byBtYWtlIHN1cmUsIGxldCBtZSBkb3VibGUtY2hlY2sgdGhlIGBLY29uZmlnYCBmb3IgYEJMS19DR1JPVVBgLiBBbHJpZ2h0LCBpdCBsb29rcyBsaWtlIGBCTEtfQ0dST1VQYCBkZXBlbmRzIG9uIGJvdGggYENHUk9VUFNgIGFuZCBgQkxPQ0tgLiBUaW1lIHRvIGZpcmUgdXAgYGdyZXBwZXJgIGFuZCBzZWUgd2hhdCBlbHNlIHdlIGNhbiB1bmNvdmVyIQoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE3IDIyOjM0PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2NvbmZpZyBCTEtfQ0dST1VQJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2Jsb2NrL0tjb25maWc9Mzk9Y29uZmlnIEJMS19SUV9BTExPQ19USU1FXG4tLVxuYmxvY2svS2NvbmZpZy00MS1cbmJsb2NrL0tjb25maWc6NDI6Y29uZmlnIEJMS19DR1JPVVBfUldTVEFUXG5ibG9jay9LY29uZmlnLTQzLVx0Ym9vbFxuYmxvY2svS2NvbmZpZy00NC1cbmJsb2NrL0tjb25maWc6NDU6Y29uZmlnIEJMS19DR1JPVVBfUFVOVF9CSU9cbmJsb2NrL0tjb25maWctNDYtXHRib29sXG4tLVxuYmxvY2svS2NvbmZpZz0xMjc9Y29uZmlnIEJMS19XQlRfTVFcbi0tXG5ibG9jay9LY29uZmlnLTEzMy1cbmJsb2NrL0tjb25maWc6MTM0OmNvbmZpZyBCTEtfQ0dST1VQX0lPTEFURU5DWVxuYmxvY2svS2NvbmZpZy0xMzUtXHRib29sIFwmIzM0O0VuYWJsZSBzdXBwb3J0IGZvciBsYXRlbmN5IGJhc2VkIGNncm91cCBJTyBwcm90ZWN0aW9uXCYjMzQ7XG4tLVxuYmxvY2svS2NvbmZpZy0xNDQtXG5ibG9jay9LY29uZmlnOjE0NTpjb25maWcgQkxLX0NHUk9VUF9GQ19BUFBJRFxuYmxvY2svS2NvbmZpZy0xNDYtXHRib29sIFwmIzM0O0VuYWJsZSBzdXBwb3J0IHRvIHRyYWNrIEZDIEkvTyBUcmFmZmljIGFjcm9zcyBjZ3JvdXAgYXBwbGljYXRpb25zXCYjMzQ7XG4tLVxuYmxvY2svS2NvbmZpZy0xNTMtXG5ibG9jay9LY29uZmlnOjE1NDpjb25maWcgQkxLX0NHUk9VUF9JT0NPU1RcbmJsb2NrL0tjb25maWctMTU1LVx0Ym9vbCBcJiMzNDtFbmFibGUgc3VwcG9ydCBmb3IgY29zdCBtb2RlbCBiYXNlZCBjZ3JvdXAgSU8gY29udHJvbGxlclwmIzM0O1xuLS1cbmJsb2NrL0tjb25maWctMTYzLVxuYmxvY2svS2NvbmZpZzoxNjQ6Y29uZmlnIEJMS19DR1JPVVBfSU9QUklPXG5ibG9jay9LY29uZmlnLTE2NS1cdGJvb2wgXCYjMzQ7Q2dyb3VwIEkvTyBjb250cm9sbGVyIGZvciBhc3NpZ25pbmcgYW4gSS9PIHByaW9yaXR5IGNsYXNzXCYjMzQ7XG4tLVxuaW5pdC9LY29uZmlnPTEwOTk9Y29uZmlnIE1FTUNHX1YxXG4tLVxuaW5pdC9LY29uZmlnLTExMTUtXG5pbml0L0tjb25maWc6MTExNjpjb25maWcgQkxLX0NHUk9VUFxuaW5pdC9LY29uZmlnLTExMTctXHRib29sIFwmIzM0O0lPIGNvbnRyb2xsZXJcJiMzNDtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD41LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xNyAyMjozNDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMTA4OQoJCQkJCQkJb3V0cHV0OiAzMwoJCQkJCQkJdGhvdWdodHM6IDE4CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIGEgc3VtbWFyeSBvZiBteSB0aG91Z2h0IHByb2Nlc3MsIGFzIHJlcXVlc3RlZDoKCioqQ2hlY2tpbmcgQkxLX0NHUk9VUCBDb25maWd1cmF0aW9uKioKCk9rYXksIHNvIEkgbmVlZCB0byBxdWlja2x5IGFzY2VydGFpbiB0aGUgc3RhdHVzIG9mIGBCTEtfQ0dST1VQYCB3aXRoaW4gdGhlIGtlcm5lbCBjb25maWd1cmF0aW9uLiBNeSBpbW1lZGlhdGUgaW5zdGluY3QgaXMgdG8gY2hlY2sgYGluaXQvS2NvbmZpZ2AuIFRoYXQmIzM5O3MgdGhlIG1vc3QgbG9naWNhbCBwbGFjZSB0byBzdGFydCBkaWdnaW5nIGZvciBkZWZpbml0aW9ucyByZWxhdGVkIHRvIGJsb2NrIGxheWVyIGNvbnRyb2wgZ3JvdXBzLCBlc3BlY2lhbGx5IHNpbmNlIGl0JiMzOTtzIGEgY29yZSBjb25maWd1cmF0aW9uIGZpbGUuIExldCYjMzk7cyBzZWUgaWYgaXQmIzM5O3MgZGVmaW5lZCB0aGVyZSwgYW5kIGlmIHNvLCB3aGF0IHRoZSBkZXBlbmRlbmNpZXMgYW5kIGRlZmF1bHQgdmFsdWUgYXJlLiBUaGlzIHNob3VsZCBnaXZlIG1lIGEgZ29vZCBpbml0aWFsIG92ZXJ2aWV3IG9mIGhvdyBgQkxLX0NHUk9VUGAgaXMgaGFuZGxlZCB3aXRoaW4gdGhlIGJ1aWxkIHN5c3RlbSBhbmQgaWYgaXQgaXMgZW5hYmxlZCBvciBkaXNhYmxlZCBieSBkZWZhdWx0LiBVbmRlcnN0YW5kaW5nIHRoZSBjb25maWd1cmF0aW9uIGlzIGNyaXRpY2FsIHRvIG1vdmluZyBmb3J3YXJkLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjYvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE3IDIyOjM0PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7aW5pdC9LY29uZmlnJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMTExMCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiAyMAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsxMTEwOlx0XHQgIFBsZWFzZSBub3RlIHRoYXQgZmVhdHVyZSBzZXQgb2YgdGhlIGxlZ2FjeSBtZW1vcnkgY29udHJvbGxlciBpcyBsaWtlbHlcbjExMTE6XHRcdCAgZ29pbmcgdG8gc2hyaW5rIGR1ZSB0byBkZXByZWNhdGlvbiBwcm9jZXNzLiBOZXcgZGVwbG95bWVudHMgd2l0aCB2MVxuMTExMjpcdFx0ICBjb250cm9sbGVyIGFyZSBoaWdobHkgZGlzY291cmFnZWQuXG4xMTEzOlx0XG4xMTE0Olx0XHQgIFNheSBOIGlmIHVuc3VyZS5cbjExMTU6XHRcbjExMTY6XHRjb25maWcgQkxLX0NHUk9VUFxuMTExNzpcdFx0Ym9vbCBcJiMzNDtJTyBjb250cm9sbGVyXCYjMzQ7XG4xMTE4Olx0XHRkZXBlbmRzIG9uIEJMT0NLXG4xMTE5Olx0XHRkZWZhdWx0IG5cbjExMjA6XHRcdGhlbHBcbjExMjE6XHRcdEdlbmVyaWMgYmxvY2sgSU8gY29udHJvbGxlciBjZ3JvdXAgaW50ZXJmYWNlLiBUaGlzIGlzIHRoZSBjb21tb25cbjExMjI6XHRcdGNncm91cCBpbnRlcmZhY2Ugd2hpY2ggc2hvdWxkIGJlIHVzZWQgYnkgdmFyaW91cyBJTyBjb250cm9sbGluZ1xuMTEyMzpcdFx0cG9saWNpZXMuXG4xMTI0Olx0XG4xMTI1Olx0XHRDdXJyZW50bHksIENGUSBJTyBzY2hlZHVsZXIgdXNlcyBpdCB0byByZWNvZ25pemUgdGFzayBncm91cHMgYW5kXG4xMTI2Olx0XHRjb250cm9sIGRpc2sgYmFuZHdpZHRoIGFsbG9jYXRpb24gKHByb3BvcnRpb25hbCB0aW1lIHNsaWNlIGFsbG9jYXRpb24pXG4xMTI3Olx0XHR0byBzdWNoIHRhc2sgZ3JvdXBzLiBJdCBpcyBhbHNvIHVzZWQgYnkgYmlvIHRocm90dGxpbmcgbG9naWMgaW5cbjExMjg6XHRcdGJsb2NrIGxheWVyIHRvIGltcGxlbWVudCB1cHBlciBsaW1pdCBpbiBJTyByYXRlcyBvbiBhIGRldmljZS5cbjExMjk6XHRcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD43LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xNyAyMjozNDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMTU4MgoJCQkJCQkJb3V0cHV0OiAzNgoJCQkJCQkJdGhvdWdodHM6IDQyCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBoZXJlJiMzOTtzIG15IHRha2Ugb24gdGhvc2UgdGhvdWdodHMsIGZyYW1lZCBhcyBteSBvd246CgoqKkRlcGVuZGVuY2llcyBhbmQgdGhlIGJwZl9ibGtjZy5jIENoZWNrKioKCkFscmlnaHQsIGxldCYjMzk7cyBzZWUsIGl0IGxvb2tzIGxpa2UgYEJMS19DR1JPVVBgIGlzIGZ1bmRhbWVudGFsbHkgcmVsaWFudCBvbiBgQkxPQ0tgLiBUaGF0IG1ha2VzIHNlbnNlOyB3ZSYjMzk7cmUgdGFsa2luZyBhYm91dCBibG9jayBJL08gY29udHJvbCB3aXRoaW4gY2dyb3Vwcywgc28gdGhlIGJhc2ljIGJsb2NrIGRldmljZSBpbmZyYXN0cnVjdHVyZSBuZWVkcyB0byBiZSB0aGVyZS4gQW5kLCBJIHJlY2FsbCBub3csIGBCUEZfU1lTQ0FMTGAgaXMgYWxzbyBkZWZpbml0ZWx5IGdvaW5nIHRvIGJlIGluIHRoZSBtaXguIENvbnNpZGVyaW5nIHRoaXMgaXMgQlBGLXJlbGF0ZWQgY29kZSwgdGhhdOKAmXMgbm90IGEgc3VycHJpc2UuIEkgbmVlZCB0byBiZSBhYmxlIHRvIHRyYWNlIGNlcnRhaW4gY2FsbHMgaW4gdGhlIGtlcm5lbC4KClJpZ2h0LCBzbyB0byBtYWtlIHN1cmUgSSB1bmRlcnN0YW5kIHRoZSBjb2RlIGNvcnJlY3RseSwgSSB0aGluayBJIHdpbGwgcmVyZWFkIGBicGZfYmxrY2cuY2AuIExldCYjMzk7cyBzZWUgd2hhdCYjMzk7cyBhY3R1YWxseSBnb2luZyBvbi4gSSBuZWVkIHRvIG1ha2UgY2VydGFpbiBJIGZ1bGx5IHVuZGVyc3RhbmQgaG93IHRoZSBCUEYgcHJvZ3JhbXMgaG9vayBpbnRvIHRoZSBibG9jayBJL08gcGF0aC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD44LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xNyAyMjozNDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O2Jsb2NrL2JwZl9ibGtjZy5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMSwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiAxMDAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7ICAgMTpcdC8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9yLWxhdGVyXG4gICAyOlx0LypcbiAgIDM6XHQgKiBCbG9jayBJL08gQ29udHJvbGxlci1yZWxhdGVkIEJQRiBrZnVuY3MgYW5kIGF1eGlsaWFyeSBjb2RlXG4gICA0Olx0ICovXG4gICA1Olx0XG4gICA2Olx0I2luY2x1ZGUgXCYjMzQ7YmxrLWNncm91cC5oXCYjMzQ7XG4gICA3Olx0XG4gICA4Olx0I2luY2x1ZGUgXHUwMDNjbGludXgvYnBmLmhcdTAwM2VcbiAgIDk6XHQjaW5jbHVkZSBcdTAwM2NsaW51eC9idGZfaWRzLmhcdTAwM2VcbiAgMTA6XHQjaW5jbHVkZSBcdTAwM2NsaW51eC9yY3VsaXN0LmhcdTAwM2VcbiAgMTE6XHRcbiAgMTI6XHRfX2JwZl9rZnVuY19zdGFydF9kZWZzKCk7XG4gIDEzOlx0XG4gIDE0Olx0LyoqXG4gIDE1Olx0ICogYnBmX2Jsa2NnX2ZsdXNoX3N0YXRzIC0gRmx1c2ggYSBibG9jayBjZ3JvdXAmIzM5O3MgaW8gc3RhdGlzdGljc1xuICAxNjpcdCAqIEBjZ3JwOiBjZ3JvdXAgdG8gZmx1c2hcbiAgMTc6XHQgKlxuICAxODpcdCAqIFByb3BhZ2F0ZSBJL08gc3RhdGlzdGljcyB1cCB0aGUgY2dyb3VwIHRyZWUuIFJvb3Qgc3RhdGlzdGljcyBjb21lIGZyb21cbiAgMTk6XHQgKiBibG9jayBkZXZpY2VzIGFuZCBpbmNsdWRlIGFsbCBjZ3JvdXBzJiMzOTsgSS9PLlxuICAyMDpcdCAqL1xuICAyMTpcdF9fYnBmX2tmdW5jIHZvaWQgYnBmX2Jsa2NnX2ZsdXNoX3N0YXRzKHN0cnVjdCBjZ3JvdXAgKmNncnApXG4gIDIyOlx0e1xuICAyMzpcdFx0c3RydWN0IGNncm91cF9zdWJzeXNfc3RhdGUgKmNzcztcbiAgMjQ6XHRcbiAgMjU6XHRcdC8qIFBpbiB0aGUgY3NzIGZvciB0aGUgc2xlZXBhYmxlIGZsdXNoLiAqL1xuICAyNjpcdFx0cmN1X3JlYWRfbG9jaygpO1xuICAyNzpcdFx0Y3NzID0gY2dyb3VwX2NzcyhjZ3JwLCBcdTAwMjZpb19jZ3JwX3N1YnN5cyk7XG4gIDI4Olx0XHRpZiAoY3NzIFx1MDAyNlx1MDAyNiAhY3NzX3RyeWdldChjc3MpKVxuICAyOTpcdFx0XHRjc3MgPSBOVUxMO1xuICAzMDpcdFx0cmN1X3JlYWRfdW5sb2NrKCk7XG4gIDMxOlx0XG4gIDMyOlx0XHRpZiAoIWNzcylcbiAgMzM6XHRcdFx0cmV0dXJuO1xuICAzNDpcdFxuICAzNTpcdFx0aWYgKCFjc3MtXHUwMDNlcGFyZW50KVxuICAzNjpcdFx0XHRibGtjZ19maWxsX3Jvb3RfaW9zdGF0cygpO1xuICAzNzpcdFx0ZWxzZVxuICAzODpcdFx0XHRjc3NfcnN0YXRfZmx1c2goY3NzKTtcbiAgMzk6XHRcbiAgNDA6XHRcdGNzc19wdXQoY3NzKTtcbiAgNDE6XHR9XG4gIDQyOlx0XG4gIDQzOlx0c3RydWN0IGJwZl9pdGVyX2Jsa2cge1xuICA0NDpcdFx0X191NjQgX19vcGFxdWVbMl07XG4gIDQ1Olx0fSBfX2FsaWduZWQoOCk7XG4gIDQ2Olx0XG4gIDQ3Olx0c3RydWN0IGJwZl9pdGVyX2Jsa2dfa2VybiB7XG4gIDQ4Olx0XHRzdHJ1Y3QgYmxrY2cgKmJsa2NnO1xuICA0OTpcdFx0c3RydWN0IGJsa2NnX2dxICpwb3M7XG4gIDUwOlx0fSBfX2FsaWduZWQoOCk7XG4gIDUxOlx0XG4gIDUyOlx0LyoqXG4gIDUzOlx0ICogYnBmX2l0ZXJfYmxrZ19uZXcgLSBTdGFydCBpdGVyYXRpbmcgYSBibG9jayBjZ3JvdXAmIzM5O3MgcGVyLWRldmljZSBibGtnc1xuICA1NDpcdCAqIEBpdDogaXRlcmF0b3IgdG8gaW5pdGlhbGl6ZVxuICA1NTpcdCAqIEBjc3M6IHRoZSBpbyBjb250cm9sbGVyJiMzOTtzIGNzc1xuICA1NjpcdCAqXG4gIDU3Olx0ICogRWFjaCBibGtnIGhvbGRzIG9uZSBkZXZpY2UmIzM5O3MgaW8uc3RhdCBjb3VudGVycy4gT2ZmbGluZSBibGtncyBhcmUgc2tpcHBlZC5cbiAgNTg6XHQgKiBBIGJsa2cgd2l0aG91dCBhIGRpc2sgY2FuIGJlIHJldHVybmVkLiBNdXN0IHJ1biB1bmRlciBSQ1UuXG4gIDU5Olx0ICpcbiAgNjA6XHQgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgLUVJTlZBTCBpZiBAY3NzIGlzIG5vdCB0aGUgaW8gY29udHJvbGxlciYjMzk7cy5cbiAgNjE6XHQgKi9cbiAgNjI6XHRfX2JwZl9rZnVuYyBpbnQgYnBmX2l0ZXJfYmxrZ19uZXcoc3RydWN0IGJwZl9pdGVyX2Jsa2cgKml0LFxuICA2MzpcdFx0XHRcdFx0ICBzdHJ1Y3QgY2dyb3VwX3N1YnN5c19zdGF0ZSAqY3NzKVxuICA2NDpcdHtcbiAgNjU6XHRcdHN0cnVjdCBicGZfaXRlcl9ibGtnX2tlcm4gKmtpdCA9ICh2b2lkICopaXQ7XG4gIDY2Olx0XG4gIDY3Olx0XHRCVUlMRF9CVUdfT04oc2l6ZW9mKHN0cnVjdCBicGZfaXRlcl9ibGtnX2tlcm4pIFx1MDAzZSBzaXplb2Yoc3RydWN0IGJwZl9pdGVyX2Jsa2cpKTtcbiAgNjg6XHRcdEJVSUxEX0JVR19PTihfX2FsaWdub2ZfXyhzdHJ1Y3QgYnBmX2l0ZXJfYmxrZ19rZXJuKSAhPVxuICA2OTpcdFx0XHQgICAgIF9fYWxpZ25vZl9fKHN0cnVjdCBicGZfaXRlcl9ibGtnKSk7XG4gIDcwOlx0XG4gIDcxOlx0XHRraXQtXHUwMDNlcG9zID0gTlVMTDtcbiAgNzI6XHRcbiAgNzM6XHRcdGlmIChjc3MtXHUwMDNlc3MgIT0gXHUwMDI2aW9fY2dycF9zdWJzeXMpIHtcbiAgNzQ6XHRcdFx0a2l0LVx1MDAzZWJsa2NnID0gTlVMTDtcbiAgNzU6XHRcdFx0cmV0dXJuIC1FSU5WQUw7XG4gIDc2Olx0XHR9XG4gIDc3Olx0XG4gIDc4Olx0XHRraXQtXHUwMDNlYmxrY2cgPSBjc3NfdG9fYmxrY2coY3NzKTtcbiAgNzk6XHRcdHJldHVybiAwO1xuICA4MDpcdH1cbiAgODE6XHRcbiAgODI6XHQvKipcbiAgODM6XHQgKiBicGZfaXRlcl9ibGtnX25leHQgLSBSZXR1cm4gdGhlIG5leHQgb25saW5lIGJsa2cgb2YgdGhlIGl0ZXJhdGVkIGJsb2NrIGNncm91cFxuICA4NDpcdCAqIEBpdDogaXRlcmF0b3JcbiAgODU6XHQgKlxuICA4NjpcdCAqIFJldHVybjogdGhlIG5leHQgb25saW5lIGJsa2csIG9yIE5VTEwgd2hlbiB0aGUgd2FsayBpcyBkb25lLlxuICA4NzpcdCAqL1xuICA4ODpcdF9fYnBmX2tmdW5jIHN0cnVjdCBibGtjZ19ncSAqYnBmX2l0ZXJfYmxrZ19uZXh0KHN0cnVjdCBicGZfaXRlcl9ibGtnICppdClcbiAgODk6XHR7XG4gIDkwOlx0XHRzdHJ1Y3QgYnBmX2l0ZXJfYmxrZ19rZXJuICpraXQgPSAodm9pZCAqKWl0O1xuICA5MTpcdFx0c3RydWN0IGJsa2NnX2dxICpibGtnID0ga2l0LVx1MDAzZXBvcztcbiAgOTI6XHRcdHN0cnVjdCBobGlzdF9ub2RlICpub2RlO1xuICA5MzpcdFxuICA5NDpcdFx0aWYgKCFraXQtXHUwMDNlYmxrY2cpXG4gIDk1Olx0XHRcdHJldHVybiBOVUxMO1xuICA5NjpcdFxuICA5NzpcdFx0aWYgKCFibGtnKVxuICA5ODpcdFx0XHRub2RlID0gcmN1X2RlcmVmZXJlbmNlKGhsaXN0X2ZpcnN0X3JjdShcdTAwMjZraXQtXHUwMDNlYmxrY2ctXHUwMDNlYmxrZ19saXN0KSk7XG4gIDk5Olx0XHRlbHNlXG4gMTAwOlx0XHRcdG5vZGUgPSByY3VfZGVyZWZlcmVuY2UoaGxpc3RfbmV4dF9yY3UoXHUwMDI2YmxrZy1cdTAwM2VibGtjZ19ub2RlKSk7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+OS8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTcgMjI6MzQ8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTMyODEKCQkJCQkJCW91dHB1dDogMTkKCQkJCQkJCXRob3VnaHRzOiAyNjMKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqTXkgQW5hbHlzaXMgb2YgQlBGIEZ1bmN0aW9uIFJlYWNoYWJpbGl0eSoqCgpPa2F5LCBzbyBJJiMzOTttIGxvb2tpbmcgYXQgdGhlc2UgdGhyZWUgQlBGLXJlbGF0ZWQgZnVuY3Rpb25zOiBgYnBmX2Jsa2NnX2ZsdXNoX3N0YXRzYCwgYGJwZl9pdGVyX2Jsa2dfbmV3YCwgYW5kIGBicGZfaXRlcl9ibGtnX25leHRgLiBUaGUga2V5IHBvaW50IGlzIHRoYXQgdGhleSYjMzk7cmUgY2FsbGFibGUgZnJvbSBCUEYgcHJvZ3JhbXMuIFRoYXQgbWVhbnMgdGhleSBuZWVkIHRvIGJlIGluY2x1ZGVkIGluIGBGb2N1c1N5bWJvbHNgLiBQcmV0dHkgc3RyYWlnaHRmb3J3YXJkLgoKTm93LCB3aGljaCBjb25maWdzIGFyZSBuZWVkZWQgZm9yIHRoZXNlPyBNeSBpbml0aWFsIHRob3VnaHRzIGFyZSBgQkxLX0NHUk9VUGAgYW5kIGBCUEZfU1lTQ0FMTGAuIExldCYjMzk7cyBqdXN0IHF1aWNrbHkgZG91YmxlLWNoZWNrIHRoYXQgYEJQRl9TWVNDQUxMYCBpcyBpbmRlZWQgdGhlIHJpZ2h0IG9uZS4gQWgsIGhlcmUmIzM5O3MgYGJsb2NrL01ha2VmaWxlYDoKCmBgYG1ha2VmaWxlCmlmZGVmIENPTkZJR19CUEZfU1lTQ0FMTApvYmotJChDT05GSUdfQkxLX0NHUk9VUCkJJiM0Mzs9IGJwZl9ibGtjZy5vCmVuZGlmCmBgYAoKWWVwLCB0aGF0IGNvbmZpcm1zIGl0LiBgQlBGX1NZU0NBTExgICphbmQqIGBCTEtfQ0dST1VQYC4gR29vZC4KClRoZSBuZXh0IHRoaW5nIHRoYXQgSSBzaG91bGQgYmUgY2hlY2tpbmcgaXMgd2hldGhlciBgQ0dST1VQU2AgaXMgbmVlZGVkLiBgQkxLX0NHUk9VUGAgZGVwZW5kcyBvbiBgQkxPQ0tgIGFuZCBgQ0dST1VQU2A/IAoKV2FpdCwgaG9sZCBvbiwgbGV0JiMzOTtzIGxvb2sgYXQgYGluaXQvS2NvbmZpZ2A6CgpgYGBrY29uZmlnCmNvbmZpZyBCTEtfQ0dST1VQCglib29sICYjMzQ7SU8gY29udHJvbGxlciYjMzQ7CglkZXBlbmRzIG9uIEJMT0NLCmBgYAoKT2theSwgaXQgc2VlbXMgYXMgaWYgYEJMS19DR1JPVVBgIGlzIGluc2lkZSBgbWVudWNvbmZpZyBDR1JPVVBTYC4KTGV0IG1lIGRvIGEgcXVpY2sgY3Jvc3MtY2hlY2suLi4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTcgMjI6MzQ8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7bWVudWNvbmZpZyBDR1JPVVBTJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2luaXQvS2NvbmZpZz0xMDQ0PWNvbmZpZyBTTEFCX09CSl9FWFRcbi0tXG5pbml0L0tjb25maWctMTA0Ni1cbmluaXQvS2NvbmZpZzoxMDQ3Om1lbnVjb25maWcgQ0dST1VQU1xuaW5pdC9LY29uZmlnLTEwNDgtXHRib29sIFwmIzM0O0NvbnRyb2wgR3JvdXAgc3VwcG9ydFwmIzM0O1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjExLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xNyAyMjozNDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMzk3NAoJCQkJCQkJb3V0cHV0OiAzMwoJCQkJCQkJdGhvdWdodHM6IDM3CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBoZXJlJiMzOTtzIG15IHRha2Ugb24gdGhvc2UgdGhvdWdodHMsIGZyYW1lZCBhcyBhbiBleHBlcnQmIzM5O3MgaW50ZXJuYWwgbW9ub2xvZ3VlOgoKKipDaGVja2luZyB0aGUgQ0dST1VQIENvbmZpZ3VyYXRpb24qKgoKQWxyaWdodCwgc28gYEJMS19DR1JPVVBgIGlzIGluZGVlZCBuZXN0ZWQgd2l0aGluIHRoZSBgQ0dST1VQU2Agb3B0aW9uIGluIGBtZW51Y29uZmlnYC4gVGhhdCYjMzk7cyB0aGUgc3RhcnRpbmcgcG9pbnQuIE5vdywgdG8gYmUgc3VyZSwgYW5kIHRvIHVuZGVyc3RhbmQgdGhlIGJyb2FkZXIgY29udGV4dCwgSSBuZWVkIHRvIGxvb2sgYXQgYGluaXQvS2NvbmZpZ2AgdG8gc2VlIHRoZSBkZXBlbmRlbmNpZXMgYW5kIHdoYXQgZWxzZSBtaWdodCBiZSB0aWVkIHRvIGl0LiBTcGVjaWZpY2FsbHksIEkmIzM5O2xsIGp1bXAgdG8gYXJvdW5kIGxpbmUgMTA0NywgYXMgdGhhdCBzZWVtcyB0byBiZSB3aGVyZSB0aGUgcmVsZXZhbnQgc2VjdGlvbiBzaG91bGQgYmUuIEhvcGVmdWxseSwgdGhhdCBnaXZlcyBtZSBhIGJldHRlciBwaWN0dXJlLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEyLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xNyAyMjozNTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O2luaXQvS2NvbmZpZyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDEwNDAsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogMjAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7MTA0MDpcdFx0aGVscFxuMTA0MTpcdFx0ICBJZiBzZXQsIGF1dG9tYXRpYyBOVU1BIGJhbGFuY2luZyB3aWxsIGJlIGVuYWJsZWQgaWYgcnVubmluZyBvbiBhIE5VTUFcbjEwNDI6XHRcdCAgbWFjaGluZS5cbjEwNDM6XHRcbjEwNDQ6XHRjb25maWcgU0xBQl9PQkpfRVhUXG4xMDQ1Olx0XHRib29sXG4xMDQ2Olx0XG4xMDQ3Olx0bWVudWNvbmZpZyBDR1JPVVBTXG4xMDQ4Olx0XHRib29sIFwmIzM0O0NvbnRyb2wgR3JvdXAgc3VwcG9ydFwmIzM0O1xuMTA0OTpcdFx0c2VsZWN0IEtFUk5GU1xuMTA1MDpcdFx0aGVscFxuMTA1MTpcdFx0ICBUaGlzIG9wdGlvbiBhZGRzIHN1cHBvcnQgZm9yIGdyb3VwaW5nIHNldHMgb2YgcHJvY2Vzc2VzIHRvZ2V0aGVyLCBmb3JcbjEwNTI6XHRcdCAgdXNlIHdpdGggcHJvY2VzcyBjb250cm9sIHN1YnN5c3RlbXMgc3VjaCBhcyBDcHVzZXRzLCBDRlMsIG1lbW9yeVxuMTA1MzpcdFx0ICBjb250cm9scyBvciBkZXZpY2UgaXNvbGF0aW9uLlxuMTA1NDpcdFx0ICBTZWVcbjEwNTU6XHRcdFx0LSBEb2N1bWVudGF0aW9uL3NjaGVkdWxlci9zY2hlZC1kZXNpZ24tQ0ZTLnJzdFx0KENGUylcbjEwNTY6XHRcdFx0LSBEb2N1bWVudGF0aW9uL2FkbWluLWd1aWRlL2Nncm91cC12MS8gKGZlYXR1cmVzIGZvciBncm91cGluZywgaXNvbGF0aW9uXG4xMDU3Olx0XHRcdFx0XHRcdCAgYW5kIHJlc291cmNlIGNvbnRyb2wpXG4xMDU4Olx0XG4xMDU5Olx0XHQgIFNheSBOIGlmIHVuc3VyZS5cbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMy8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTcgMjI6MzU8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTQ0NjMKCQkJCQkJCW91dHB1dDogMzMKCQkJCQkJCXRob3VnaHRzOiAzMwoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgaGVyZSYjMzk7cyBteSBpbnRlcnByZXRhdGlvbiBvZiB0aG9zZSB0aG91Z2h0cywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZSwgcHJlc2VudGVkIGluIHRoZSBmaXJzdCBwZXJzb246CgoqKktlcm5lbCBTdWJzeXN0ZW0gRGVwZW5kZW5jaWVzOiBBIFF1aWNrIE1lbnRhbCBBdWRpdCoqCgpSaWdodCwgc28gYENHUk9VUFNgIGlzIGRlZmluaXRlbHkgYSBjb3JlIHJlcXVpcmVtZW50IGhlcmUuIEJ1dCBob2xkIG9uLCBJIHNlZW0gdG8gcmVtZW1iZXIgYEJMS19DR1JPVVBgIGJlaW5nIGNvbmRpdGlvbmFsbHkgY29tcGlsZWQuLi4gYnVyaWVkIHdpdGhpbiBhbiBgaWYgQ0dST1VQU2AgYmxvY2ssIHJpZ2h0PyBOZWVkIHRvIGNvbmZpcm0gdGhhdCBxdWlja2x5LiBHb3R0YSBrZWVwIHRoZSBkZXBlbmRlbmN5IGNoYWluIHN0cmFpZ2h0IGluIG15IGhlYWQuIExldCBtZSBqdXN0IGRvdWJsZSBjaGVjayB0aGUgcmVsZXZhbnQgY29uZmlnIG9wdGlvbnMgdG8gYmUgYWJzb2x1dGVseSBzdXJlIHRoYXQgYEJMS19DR1JPVVBgIGlzIG9ubHkgZW5hYmxlZCB3aGVuIGBDR1JPVVBTYCBpcy4gV291bGRuJiMzOTt0IHdhbnQgYW55IHN1cnByaXNlcyB3aGVuIGJ1aWxkaW5nLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE0LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xNyAyMjozNTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O2luaXQvS2NvbmZpZyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDEwNjAsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogMjAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7MTA2MDpcdFxuMTA2MTpcdGlmIENHUk9VUFNcbjEwNjI6XHRcbjEwNjM6XHRjb25maWcgUEFHRV9DT1VOVEVSXG4xMDY0Olx0XHRib29sXG4xMDY1Olx0XG4xMDY2Olx0Y29uZmlnIENHUk9VUF9GQVZPUl9EWU5NT0RTXG4xMDY3Olx0XHRib29sIFwmIzM0O0Zhdm9yIGR5bmFtaWMgbW9kaWZpY2F0aW9uIGxhdGVuY3kgcmVkdWN0aW9uIGJ5IGRlZmF1bHRcJiMzNDtcbjEwNjg6XHRcdGhlbHBcbjEwNjk6XHRcdCAgVGhpcyBvcHRpb24gZW5hYmxlcyB0aGUgXCYjMzQ7ZmF2b3JkeW5tb2RzXCYjMzQ7IG1vdW50IG9wdGlvbiBieSBkZWZhdWx0XG4xMDcwOlx0XHQgIHdoaWNoIHJlZHVjZXMgdGhlIGxhdGVuY2llcyBvZiBkeW5hbWljIGNncm91cCBtb2RpZmljYXRpb25zIHN1Y2hcbjEwNzE6XHRcdCAgYXMgdGFzayBtaWdyYXRpb25zIGFuZCBjb250cm9sbGVyIG9uL29mZnMgYXQgdGhlIGNvc3Qgb2YgbWFraW5nXG4xMDcyOlx0XHQgIGhvdCBwYXRoIG9wZXJhdGlvbnMgc3VjaCBhcyBmb3JrcyBhbmQgZXhpdHMgbW9yZSBleHBlbnNpdmUuXG4xMDczOlx0XG4xMDc0Olx0XHQgIFNheSBOIGlmIHVuc3VyZS5cbjEwNzU6XHRcbjEwNzY6XHRjb25maWcgTUVNQ0dcbjEwNzc6XHRcdGJvb2wgXCYjMzQ7TWVtb3J5IGNvbnRyb2xsZXJcJiMzNDtcbjEwNzg6XHRcdHNlbGVjdCBQQUdFX0NPVU5URVJcbjEwNzk6XHRcdHNlbGVjdCBFVkVOVEZEXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTUvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE3IDIyOjM1PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDE0OTI5CgkJCQkJCQlvdXRwdXQ6IDIxCgkJCQkJCQl0aG91Z2h0czogNzIKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGhlcmUmIzM5O3MgbXkgdGFrZSBvbiB0aG9zZSB0aG91Z2h0cywgZnJhbWVkIGFzIG15IG93biBtZW50YWwgcHJvY2Vzc2luZzoKCioqRGVwZW5kZW5jaWVzIGFuZCBDb25kaXRpb25hbHMqKgoKQWxyaWdodCwgbGV0JiMzOTtzIG5haWwgdGhpcyBkb3duLiBJJiMzOTt2ZSBnb3QgdG8gZW5zdXJlIHRoYXQgbXkgdW5kZXJzdGFuZGluZyBvZiB0aGlzIHN5c3RlbSBpcyBjb3JyZWN0LCBlc3BlY2lhbGx5IHdoZW4gaXQgY29tZXMgdG8gdGhvc2UgZmVhdHVyZSBmbGFncyBhbmQgY29uZGl0aW9uYWxzLiBTbywgYEJMS19DR1JPVVBgLCBubyBkb3VidCwgdGhhdCBzaXRzIHNxdWFyZWx5IHdpdGhpbiB0aGUgYGlmIENHUk9VUFNgIGJsb2NrLiBNYWtlcyBwZXJmZWN0IHNlbnNlLiBUaGVyZWZvcmUsIHRoYXQgbWVhbnMgYENHUk9VUFNgIGlzIGRlZmluaXRlbHkgYSBwcmVyZXF1aXNpdGUuIEFuZCwgbmF0dXJhbGx5LCBgQkxPQ0tgIGlzIHJlcXVpcmVkIHRvbywgSSYjMzk7ZCBleHBlY3QgaXQgdG8gYmUsIGJ1dCBpdCYjMzk7cyBnb29kIHRvIGNvbmZpcm0uIFRoYXQmIzM5O3MgYSBmdW5kYW1lbnRhbC4gQW5kIGhleSwgbGV0JiMzOTtzIGtlZXAgZ29pbmcuCgpOb3csIHRoYXQgYEJQRl9TWVNDQUxMYC4uLiBJIG5lZWQgdG8gZG91YmxlLWNoZWNrIHRoYXQgdGhpcyBpcyBjb250YWluZWQgd2l0aGluLCBzYXksIGFuIGBpZiBCUEZgIGNvbmRpdGlvbmFsLiBJdCYjMzk7cyBjcnVjaWFsIHRvIGtub3cgdGhhdCBpdCBpcyBjb250YWluZWQuIEkgbmVlZCB0byBrbm93IHdoZXJlIGl0IHN0YW5kcy4gT3RoZXJ3aXNlLCBJIHdpbGwgbm90IGJlIGFibGUgdG8gcHJvY2VlZC4gSSBoYXZlIHRoZSBmZWVsaW5nIHRoYXQgSSYjMzk7bSBtaXNzaW5nIHNvbWV0aGluZywgdGhvdWdoLiBMZXQmIzM5O3MgZGlnIGluIGEgYml0LgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE2LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xNyAyMjozNTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtjb25maWcgQlBGX1NZU0NBTEwmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7a2VybmVsL2JwZi9LY29uZmlnPTI1PW1lbnUgXCYjMzQ7QlBGIHN1YnN5c3RlbVwmIzM0O1xua2VybmVsL2JwZi9LY29uZmlnLTI2LVxua2VybmVsL2JwZi9LY29uZmlnOjI3OmNvbmZpZyBCUEZfU1lTQ0FMTFxua2VybmVsL2JwZi9LY29uZmlnLTI4LVx0Ym9vbCBcJiMzNDtFbmFibGUgYnBmKCkgc3lzdGVtIGNhbGxcJiMzNDtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNy8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTcgMjI6MzU8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTUzMzcKCQkJCQkJCW91dHB1dDogMzQKCQkJCQkJCXRob3VnaHRzOiAxMwoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBhIHN1bW1hcnkgb2YgbXkgdGhvdWdodCBwcm9jZXNzLCBhcyByZXF1ZXN0ZWQ6CgoqKk5hdmlnYXRpbmcgdGhlIEtlcm5lbCYjMzk7cyBCUEYgQ29uZmlndXJhdGlvbioqCgpPa2F5LCB0aW1lIHRvIGRpdmUgaW4uIE15IGltbWVkaWF0ZSB0aG91Z2h0IGlzIHRvIHN0YXJ0IHdpdGggdGhlIGNvbmZpZ3VyYXRpb24gZmlsZSBmb3IgdGhlIEJlcmtlbGV5IFBhY2tldCBGaWx0ZXIgKEJQRikgc3Vic3lzdGVtLiBJIG5lZWQgdG8gZ2V0IGEgaGFuZGxlIG9uIHRoZSBhdmFpbGFibGUgb3B0aW9ucyBhbmQgZGVwZW5kZW5jaWVzIGJlZm9yZSBJIGdvIGRlZXBlci4gVGhhdCBtZWFucyBJIG5lZWQgdG8gbG9vayBhdCBga2VybmVsL2JwZi9LY29uZmlnYC4gVGhpcyBLY29uZmlnIGZpbGUgd2lsbCBiZSB0aGUgY2VudHJhbCBwb2ludCB0byB1bmRlcnN0YW5kIGhvdyBCUEYgaXMgaW50ZWdyYXRlZCBpbnRvIHRoZSBrZXJuZWwmIzM5O3MgYnVpbGQgc3lzdGVtIGFuZCB3aGF0IGZlYXR1cmVzIGNhbiBiZSBlbmFibGVkIG9yIGRpc2FibGVkLiBUaGlzIGlzIHdoZXJlIHRoZSBjb3JlIEJQRiBjb250cm9scyBhcmUgZGVmaW5lZCwgYW5kIHdoZXJlIEkgY2FuIHN0YXJ0IHVudGFuZ2xpbmcgdGhlIHJlbGF0aW9uc2hpcHMgYmV0d2VlbiBkaWZmZXJlbnQgQlBGIGZlYXR1cmVzLiBUaGlzIGlzIHRoZSBsb2dpY2FsIGZpcnN0IHN0ZXAgZm9yIG1lIHRvIHVuZGVyc3RhbmQgaG93IEJQRiBmaXRzIGludG8gdGhlIGtlcm5lbCBjb25maWd1cmF0aW9uLiBMZXQmIzM5O3Mgc2VlIHdoYXQmIzM5O3MgaW4gdGhlcmUuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTgvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE3IDIyOjM1PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7a2VybmVsL2JwZi9LY29uZmlnJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMjAsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogMjAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7ICAyMDpcdCMgVXNlZCBieSBhcmNocyB0byB0ZWxsIHRoYXQgdGhleSB3YW50IHRoZSBCUEYgSklUIGNvbXBpbGVyIGVuYWJsZWQgYnlcbiAgMjE6XHQjIGRlZmF1bHQgZm9yIGtlcm5lbHMgdGhhdCB3ZXJlIGNvbXBpbGVkIHdpdGggQlBGIEpJVCBzdXBwb3J0LlxuICAyMjpcdGNvbmZpZyBBUkNIX1dBTlRfREVGQVVMVF9CUEZfSklUXG4gIDIzOlx0XHRib29sXG4gIDI0Olx0XG4gIDI1Olx0bWVudSBcJiMzNDtCUEYgc3Vic3lzdGVtXCYjMzQ7XG4gIDI2Olx0XG4gIDI3Olx0Y29uZmlnIEJQRl9TWVNDQUxMXG4gIDI4Olx0XHRib29sIFwmIzM0O0VuYWJsZSBicGYoKSBzeXN0ZW0gY2FsbFwmIzM0O1xuICAyOTpcdFx0c2VsZWN0IEJQRlxuICAzMDpcdFx0c2VsZWN0IElSUV9XT1JLXG4gIDMxOlx0XHRzZWxlY3QgTkVFRF9UQVNLU19SQ1VcbiAgMzI6XHRcdHNlbGVjdCBUQVNLU19UUkFDRV9SQ1VcbiAgMzM6XHRcdHNlbGVjdCBCSU5BUllfUFJJTlRGXG4gIDM0Olx0XHRzZWxlY3QgTkVUX1NPQ0tfTVNHIGlmIE5FVFxuICAzNTpcdFx0c2VsZWN0IE5FVF9YR1JFU1MgaWYgTkVUXG4gIDM2Olx0XHRzZWxlY3QgUEFHRV9QT09MIGlmIE5FVFxuICAzNzpcdFx0ZGVmYXVsdCBuXG4gIDM4Olx0XHRoZWxwXG4gIDM5Olx0XHQgIEVuYWJsZSB0aGUgYnBmKCkgc3lzdGVtIGNhbGwgdGhhdCBhbGxvd3MgdG8gbWFuaXB1bGF0ZSBCUEYgcHJvZ3JhbXNcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xOS8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTcgMjI6MzU8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTU4MjkKCQkJCQkJCW91dHB1dDogMTc1CgkJCQkJCQl0aG91Z2h0czogNDkyCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKk15IEFuYWx5c2lzIG9mIEJsb2NrIEkvTyBDR1JPVVAgQlBGIFN1cHBvcnQqKgoKT2theSwgc28gSSYjMzk7bSBwdXR0aW5nIHRvZ2V0aGVyIHRoZSBwaWVjZXMgZm9yIEJQRiBzeXNjYWxsIHN1cHBvcnQgcmVsYXRlZCB0byBibG9jayBJL08gY2dyb3Vwcy4gVGhlIGNvcmUgaXMgZGVmaW5pdGVseSBnb2luZyB0byByZWx5IG9uIGBCUEZfU1lTQ0FMTGAsIHRoYXQmIzM5O3MgYSBnaXZlbi4gTm93LCBsZXQmIzM5O3MgdGFsayBhYm91dCB0aGUgc3BlY2lmaWMgY29uZmlncyBhbmQgc3ltYm9scy4KCkkgc2VlIHRoYXQgSSBuZWVkIHRvIGVuYWJsZSBhIGZldyBrZXJuZWwgY29uZmlncyB0byBnZXQgdGhpcyByaWdodC4gVGhlIHJlcXVpcmVkIGNvbmZpZ3VyYXRpb25zIGFyZSBwcmV0dHkgY2xlYXItY3V0OiBgQkxLX0NHUk9VUGAsIGBCUEZfU1lTQ0FMTGAsIGBDR1JPVVBTYCwgYW5kIG9mIGNvdXJzZSwgYEJMT0NLYC4gVGhlIGRlcGVuZGVuY2llcyBzZWVtIHNvdW5kLCBib3RoIGBDR1JPVVBTYCBhbmQgYEJMT0NLYCBhcmUgZnVuZGFtZW50YWwgZm9yIHRoaXMgZnVuY3Rpb25hbGl0eS4KCk5vdywgdG8gdGhlIHN5bWJvbHMgSSYjMzk7bGwgbmVlZCB0byBmb2N1cyBvbi4gSSYjMzk7dmUgaWRlbnRpZmllZCBgYnBmX2Jsa2NnX2ZsdXNoX3N0YXRzYCwgYGJwZl9pdGVyX2Jsa2dfbmV3YCwgYW5kIGBicGZfaXRlcl9ibGtnX25leHRgLiBJIGluaXRpYWxseSBzcG90dGVkIHRoYXQgYGJwZl9pdGVyX2Jsa2dfZGVzdHJveWAgaXMgYW4gZW1wdHkga2Z1bmMuIEEga2Z1bmMsIGV2ZW4gYW4gZW1wdHkgb25lLCBoYXMgc29tZSBpbXBvcnRhbmNlIHNvIEkgd2lsbCBpbmNsdWRlIGl0LgoKVGhlbiwgSSBzdHVtYmxlZCB1cG9uIGBibGtjZ19maWxsX3Jvb3RfaW9zdGF0c2AuIEkgbm90aWNlZCBpdCB3YXMgbWFkZSBub24tc3RhdGljLCBzbyBpdCYjMzk7cyBwcm9iYWJseSBpbXBvcnRhbnQuIEl0JiMzOTtzIGNhbGxlZCBmcm9tIGBicGZfYmxrY2dfZmx1c2hfc3RhdHNgIHNvIEkgc2hvdWxkIGluY29ycG9yYXRlIGl0IGludG8gYEZvY3VzU3ltYm9sc2AuIEl0IHJlc2lkZXMgaW4gYGJsb2NrL2Jsay1jZ3JvdXAuY2AgYW5kIGl0ZXJhdGVzIGJsb2NrIGRldmljZXMuIFdoaWxlIGl0JiMzOTtzIG5vdCBhIHBlcmZvcm1hbmNlLWNyaXRpY2FsIHBhdGgsIGl0JiMzOTtzIGludm9sdmVkIGluIHN0YXRzIGZsdXNoaW5nLCBzbyBJIHRoaW5rIGl0JiMzOTtzIHJlbGV2YW50IHRvIGluY2x1ZGUuCgpTbyB0aGUgZmluYWwgc2V0IG9mIHN5bWJvbHMgSSYjMzk7bSBmb2N1c2luZyBvbiBhcmU6IGBicGZfYmxrY2dfZmx1c2hfc3RhdHNgLCBgYnBmX2l0ZXJfYmxrZ19uZXdgLCBgYnBmX2l0ZXJfYmxrZ19uZXh0YCwgYGJwZl9pdGVyX2Jsa2dfZGVzdHJveWAsIGFuZCBgYmxrY2dfZmlsbF9yb290X2lvc3RhdHNgLgoKSSYjMzk7bSBjb25maWRlbnQgaW4gdGhlc2Ugc2VsZWN0aW9ucy4gTm93IEkgc2hvdWxkIGNhbGwgYHNldC1yZXN1bHRzYC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yMC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTcgMjI6MzU8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5zZXQtcmVzdWx0czwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0JMS19DR1JPVVAmIzM0OywKICAgICYjMzQ7QlBGX1NZU0NBTEwmIzM0OywKICAgICYjMzQ7Q0dST1VQUyYjMzQ7LAogICAgJiMzNDtCTE9DSyYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O2JwZl9ibGtjZ19mbHVzaF9zdGF0cyYjMzQ7LAogICAgJiMzNDticGZfaXRlcl9ibGtnX25ldyYjMzQ7LAogICAgJiMzNDticGZfaXRlcl9ibGtnX25leHQmIzM0OywKICAgICYjMzQ7YnBmX2l0ZXJfYmxrZ19kZXN0cm95JiMzNDssCiAgICAmIzM0O2Jsa2NnX2ZpbGxfcm9vdF9pb3N0YXRzJiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIGludHJvZHVjZXMgbmV3IEJQRiBrZnVuY3MgZm9yIGJsb2NrIGNncm91cCBJL08gc3RhdGlzdGljcywgd2hpY2ggYXJlIHJlYWNoYWJsZSBmcm9tIEJQRiBwcm9ncmFtcy4gVGhlc2UgZnVuY3Rpb25zIGFsbG93IEJQRiBwcm9ncmFtcyB0byBmbHVzaCBibG9jayBjZ3JvdXAgc3RhdHMgYW5kIGl0ZXJhdGUgb3ZlciBwZXItZGV2aWNlIGJsa2dzLiBUaGUgY2hhbmdlcyBhcmUgZnVuY3Rpb25hbGx5IHNpZ25pZmljYW50IGFuZCBzaG91bGQgYmUgZnV6emVkLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtCTEtfQ0dST1VQJiMzNDssCiAgICAmIzM0O0JQRl9TWVNDQUxMJiMzNDssCiAgICAmIzM0O0NHUk9VUFMmIzM0OywKICAgICYjMzQ7QkxPQ0smIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDticGZfYmxrY2dfZmx1c2hfc3RhdHMmIzM0OywKICAgICYjMzQ7YnBmX2l0ZXJfYmxrZ19uZXcmIzM0OywKICAgICYjMzQ7YnBmX2l0ZXJfYmxrZ19uZXh0JiMzNDssCiAgICAmIzM0O2JwZl9pdGVyX2Jsa2dfZGVzdHJveSYjMzQ7LAogICAgJiMzNDtibGtjZ19maWxsX3Jvb3RfaW9zdGF0cyYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBpbnRyb2R1Y2VzIG5ldyBCUEYga2Z1bmNzIGZvciBibG9jayBjZ3JvdXAgSS9PIHN0YXRpc3RpY3MsIHdoaWNoIGFyZSByZWFjaGFibGUgZnJvbSBCUEYgcHJvZ3JhbXMuIFRoZXNlIGZ1bmN0aW9ucyBhbGxvdyBCUEYgcHJvZ3JhbXMgdG8gZmx1c2ggYmxvY2sgY2dyb3VwIHN0YXRzIGFuZCBpdGVyYXRlIG92ZXIgcGVyLWRldmljZSBibGtncy4gVGhlIGNoYW5nZXMgYXJlIGZ1bmN0aW9uYWxseSBzaWduaWZpY2FudCBhbmQgc2hvdWxkIGJlIGZ1enplZC4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yMS8xPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTcgMjI6MzU8L3RkPgoJCQk8dGQ+YWN0aW9uPC90ZD4KCQkJPHRkPklmPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIyLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xNyAyMjozNTwvdGQ+CgkJCTx0ZD5hZ2VudDwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5iZXN0LWV4cGVuc2l2ZTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtLTVNBTlJlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBzZXJpZXMgaW50cm9kdWNlcyBCUEYga2Z1bmNzIGZvciBibG9jayBjZ3JvdXAgKGJsa2NnKSBpdGVyYXRpb24gYW5kIHN0YXRpc3RpY3MgZmx1c2hpbmcgKGBicGZfYmxrY2dfZmx1c2hfc3RhdHNgLCBgYnBmX2l0ZXJfYmxrZ19uZXdgLCBgYnBmX2l0ZXJfYmxrZ19uZXh0YCwgYGJwZl9pdGVyX2Jsa2dfZGVzdHJveWApLiBUaGUgaXRlcmF0b3Igc3RhdGUgKGBzdHJ1Y3QgYnBmX2l0ZXJfYmxrZ19rZXJuYCkgaXMgZnVsbHkgaW5pdGlhbGl6ZWQgaW4gYGJwZl9pdGVyX2Jsa2dfbmV3YCBiZWZvcmUgYmVpbmcgdXNlZCBpbiBzdWJzZXF1ZW50IGNhbGxzLiBUaGVyZSBhcmUgbm8gbmV3IGtlcm5lbCBzdHJ1Y3R1cmVzIGNvcGllZCB0byB1c2VyIHNwYWNlIChlLmcuLCB2aWEgYGNvcHlfdG9fdXNlcmAgb3IgbmV0bGluayksIG5vciBhcmUgdGhlcmUgYW55IGNvbXBsZXggYWxsb2NhdGlvbnMgd2hlcmUgdW5pbml0aWFsaXplZCBmaWVsZHMgY291bGQgYmUgbGVha2VkIG9yIHVzZWQgaW4gY29udHJvbCBmbG93LiBUaGUgY2hhbmdlcyBwcmltYXJpbHkgaW52b2x2ZSBwb2ludGVyIHRyYXZlcnNhbCBhbmQgQlBGLWFjY2Vzc2libGUgcmVhZHMgb2YgZXhpc3RpbmcgaW5pdGlhbGl6ZWQgY2dyb3VwIHN0cnVjdHVyZXMuIEFueSBwb3RlbnRpYWwgbWVtb3J5IHNhZmV0eSBpc3N1ZXMsIHN1Y2ggYXMgb3V0LW9mLWJvdW5kcyBhY2Nlc3NlcyBvciB1c2UtYWZ0ZXItZnJlZSBidWdzIGR1cmluZyBpdGVyYXRpb24sIHdvdWxkIGJlIGVmZmVjdGl2ZWx5IGNhdWdodCBieSBLQVNBTiBhbmQgdGhlIEJQRiB2ZXJpZmllci4gVGhlcmVmb3JlLCBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaXMgbm90IHJlcXVpcmVkLiYjMzQ7LAogICYjMzQ7TmVlZHNLTVNBTiYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5JbnN0cnVjdGlvbjo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBzZWN1cml0eSBlbmdpbmVlciBzcGVjaWFsaXppbmcgaW4ga2VybmVsIG1lbW9yeQplcnJvciBkZXRlY3RvcnMgKEtBU0FOIGFuZCBLTVNBTikuIFlvdXIgam9iIGlzIHRvIHJldmlldyB0aGUgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZApkZXRlcm1pbmUgaWYgdGhlIGNvZGUgY2hhbmdlcyBqdXN0aWZ5IHNwYXduaW5nIGEgZGVkaWNhdGVkIEtNU0FOIChLZXJuZWxNZW1vcnlTYW5pdGl6ZXIpCmZ1enppbmcgc2Vzc2lvbiBpbiBhZGRpdGlvbiB0byBzdGFuZGFyZCBLQVNBTiBmdXp6aW5nLgoKQ1JJVElDQUwgRElTVElOQ1RJT04gQkVUV0VFTiBLQVNBTiBBTkQgS01TQU46Ci0gU3RhbmRhcmQgS0FTQU4ga2VybmVsIGJ1aWxkcyAodXBzdHJlYW0tYXBwYXJtb3Ita2FzYW4uY29uZmlnKSBhbHJlYWR5IGVuYWJsZQogIGEgY29tcHJlaGVuc2l2ZSBzdWl0ZSBvZiBkZWJ1Z2dpbmcgdG9vbHMgYW5kIHNhbml0aXplcnMsIGluY2x1ZGluZyBLQVNBTgogIChvdXQtb2YtYm91bmRzIGFjY2Vzc2VzLCB1c2UtYWZ0ZXItZnJlZSwgZG91YmxlIGZyZWUsIGludmFsaWQgZnJlZSksIExPQ0tERVAKICAobG9ja2luZyBidWdzIGFuZCBkZWFkbG9ja3MpLCBVQi1zYW5pdGl6ZXJzLCBhbmQgbWVtb3J5IGNvcnJ1cHRpb24gY2hlY2tzLgotIEtNU0FOIChLZXJuZWxNZW1vcnlTYW5pdGl6ZXIpIGRldGVjdHMgcmVhZHMgb2YgVU5JTklUSUFMSVpFRCBtZW1vcnkgKHN0YWNrLCBoZWFwLAogIG9yIHBhZ2UgYWxsb2NhdGlvbnMpIGFuZCBrZXJuZWwtdG8tdXNlciBtZW1vcnkgaW5mby1sZWFrcy4KClJ1bGU6IFRIRVJFIElTIE5PIFNFTlNFIElOIFJVTk5JTkcgQSBLTVNBTiBTRVNTSU9OIElGIEEgQlVHIENBTiBCRSBDQVVHSFQgQlkgS0FTQU4sCkxPQ0tERVAsIE9SIE9USEVSIFNUQU5EQVJEIEJVRyBERVRFQ1RPUlMuCkEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpbmN1cnMgc2lnbmlmaWNhbnQgcmVzb3VyY2UgY29zdHMuIFlvdSBtdXN0IE9OTFkKc2V0IE5lZWRzS01TQU49dHJ1ZSBpZiB0aGUgY29kZSBjaGFuZ2VzIGludHJvZHVjZSBvciBleHBvc2UgVU5JTklUSUFMSVpFRCBNRU1PUlkgcmlza3MKdGhhdCBhcmUgZGV0ZWN0ZWQgT05MWSBieSBLTVNBTi4KCkxvb2sgaG9saXN0aWNhbGx5IGF0IHRoZSBwYXRjaCBzZXJpZXMgYW5kIHN1cnJvdW5kaW5nIGNvZGUuIEV2ZW4gaWYgbm8gZGlyZWN0CnVuaW5pdGlhbGl6ZWQgZmllbGQgYWNjZXNzZXMgb3IgbmV3IGJ1ZmZlciBhbGxvY2F0aW9ucyBhcmUgYWRkZWQgaW4gdGhlIGRpZmYgaXRzZWxmLAphIHBhdGNoIG1heSBhbHRlciBjb250cm9sIGZsb3csIGJvdW5kcyBjaGVja2luZywgb3IgZGF0YSBsZW5ndGggY2FsY3VsYXRpb25zIGluIHdheXMKdGhhdCBjaGFuZ2UgaG93IHRoZSByZXN0IG9mIHRoZSBjb2RlIG9wZXJhdGVzIG9uIGV4aXN0aW5nIGJ1ZmZlcnMgKGUuZy4gYWxsb3dpbmcKdW5pbml0aWFsaXplZCBzdGFjay9oZWFwIG1lbW9yeSB0byBiZSByZWFkLCBjb3BpZWQgdG8gdXNlciBzcGFjZSwgb3IgdXNlZCBpbiBjb250cm9sCmZsb3cpLiBEbyBub3QgaGVzaXRhdGUgdG8gdXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gaW5zcGVjdCB0aGUgc3Vycm91bmRpbmcgY29kZSwKY2FsbGVkIGZ1bmN0aW9ucywgYW5kIGNhbGxlcnMuCgpTZXQgTmVlZHNLTVNBTj10cnVlIE9OTFkgSUYgdGhlIHBhdGNoIGludHJvZHVjZXMgb3IgbW9kaWZpZXM6CjEuIEtlcm5lbCBzdHJ1Y3R1cmVzIHNlbnQgdG8gdXNlciBzcGFjZSAodmlhIGNvcHlfdG9fdXNlciwgcHV0X3VzZXIsIG5ldGxpbmsgc2tiCiAgIGF0dHJpYnV0ZXMsIGlvY3RsIG91dHB1dCBhcmd1bWVudHMsIHNvY2tldCBvcHRpb25zLCBvciBCUEYgYnVmZmVycykgd2hlcmUgZmllbGRzCiAgIG9yIHN0cnVjdHVyZSBwYWRkaW5nIG1pZ2h0IG5vdCBiZSBmdWxseSBpbml0aWFsaXplZC96ZXJvZWQuCjIuIENvbmRpdGlvbmFsIGxvZ2ljIG9yIGJyYW5jaGluZyB0aGF0IGRlcGVuZHMgb24gcG90ZW50aWFsbHkgdW5pbml0aWFsaXplZCB2YXJpYWJsZXMKICAgb3Igc3RydWN0IGZpZWxkcy4KMy4gQWxsb2NhdGlvbiBvciBpbml0aWFsaXphdGlvbiBvZiBjb21wbGV4IGRhdGEgc3RydWN0dXJlcyB3aGVyZSB1bmluaXRpYWxpemVkIGZpZWxkcwogICBjb3VsZCBiZSByZWFkIGxhdGVyIGluIHJlYWNoYWJsZSBjb2RlIHBhdGhzLgo0LiBCb3VuZHMgY2hlY2tzLCBsZW5ndGhzLCBvciBsb2dpYyBpbiBhIHdheSB0aGF0IGFsbG93cyBzdXJyb3VuZGluZyBjb2RlIHRvIGFjY2VzcwogICB1bmluaXRpYWxpemVkIGJ5dGVzIG9mIGV4aXN0aW5nIGJ1ZmZlcnMuCgpTZXQgTmVlZHNLTVNBTj1mYWxzZSBJRjoKLSBUaGUgY29kZSBjaGFuZ2VzIHByaW1hcmlseSByaXNrIG91dC1vZi1ib3VuZHMgYWNjZXNzLCBhcnJheSBvdmVyZmxvd3MsIE5VTEwgcG9pbnRlcgogIGRlcmVmZXJlbmNlcywgbG9ja2luZyBkZWFkbG9ja3MsIG9yIHVzZS1hZnRlci1mcmVlIGJ1Z3MgKHRoZXNlIGFyZSBhbHJlYWR5IGNhdWdodAogIGJ5IEtBU0FOLCBMT0NLREVQLCBvciBzdGFuZGFyZCBidWcgZGV0ZWN0b3JzKS4KLSBBbGwgc3RhY2svaGVhcCBzdHJ1Y3R1cmVzIHRvdWNoZWQgb3IgaW50cm9kdWNlZCBieSB0aGUgcGF0Y2ggYXJlIGZ1bGx5IHplcm9lZAogIG9yIGluaXRpYWxpemVkIChlLmcuIHVzaW5nID0gezB9LCBtZW1zZXQsIGt6YWxsb2MpIGJlZm9yZSBiZWluZyByZWFkIG9yIGNvcGllZC4KLSBUaGUgcGF0Y2ggZG9lcyBub3QgaW50cm9kdWNlIGFueSByaXNrIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHVzYWdlIG9yIGluZm8tbGVha3MuCgpVc2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBpbnNwZWN0IHRoZSBzdXJyb3VuZGluZyBjb2RlIGlmIG5lY2Vzc2FyeSwgdGhlbiBwcm92aWRlCmRldGFpbGVkIEtNU0FOUmVhc29uaW5nIGNvbnRyYXN0aW5nIEtBU0FOIHZzIEtNU0FOIGFwcGxpY2FiaWxpdHkgZm9yIHRoaXMgcGF0Y2guClByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLgoKClVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuCkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LgpJZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UHJvbXB0OjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Rm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6CmNvbW1pdCA3NzMwMDM2M2ZlOWM1YjBhZmMzNmQ5Zjc0ZWFkYjQxYmE2ZGQ1M2E1CkF1dGhvcjogc3l6LWNsdXN0ZXIgJmx0O3RyaWFnZUBzeXprYWxsZXIuY29tJmd0OwpEYXRlOiAgIE1vbiBBdWcgMTcgMjI6MzQ6MzIgMjAyNiAmIzQzOzAwMDAKCiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXcKCmRpZmYgLS1naXQgYS9NQUlOVEFJTkVSUyBiL01BSU5UQUlORVJTCmluZGV4IDJmOTQ3MmMxYTA5MDcuLjg3YzU2ZTk1NTU3NzEgMTAwNjQ0Ci0tLSBhL01BSU5UQUlORVJTCiYjNDM7JiM0MzsmIzQzOyBiL01BSU5UQUlORVJTCkBAIC02NjE3LDYgJiM0Mzs2NjE3LDcgQEAgRjoJYmxvY2svYmxrLWNncm91cC5jCiBGOglibG9jay9ibGstaW9jb3N0LmMKIEY6CWJsb2NrL2Jsay1pb2xhdGVuY3kuYwogRjoJYmxvY2svYmxrLXRocm90dGxlLmMKJiM0MztGOglibG9jay9icGZfYmxrY2cuYwogRjoJaW5jbHVkZS9saW51eC9ibGstY2dyb3VwLmgKIAogQ09OVFJPTCBHUk9VUCAtIENQVVNFVApkaWZmIC0tZ2l0IGEvYmxvY2svTWFrZWZpbGUgYi9ibG9jay9NYWtlZmlsZQppbmRleCBlN2JkMzIwZTNkNjk3Li41NzJlNDk5ODhjOGVlIDEwMDY0NAotLS0gYS9ibG9jay9NYWtlZmlsZQomIzQzOyYjNDM7JiM0MzsgYi9ibG9jay9NYWtlZmlsZQpAQCAtMTcsNiAmIzQzOzE3LDkgQEAgb2JqLSQoQ09ORklHX0JMS19FUlJPUl9JTkpFQ1RJT04pICYjNDM7PSBlcnJvci1pbmplY3Rpb24ubwogb2JqLSQoQ09ORklHX0JMS19ERVZfQlNHX0NPTU1PTikgJiM0Mzs9IGJzZy5vCiBvYmotJChDT05GSUdfQkxLX0RFVl9CU0dMSUIpCSYjNDM7PSBic2ctbGliLm8KIG9iai0kKENPTkZJR19CTEtfQ0dST1VQKQkmIzQzOz0gYmxrLWNncm91cC5vCiYjNDM7aWZkZWYgQ09ORklHX0JQRl9TWVNDQUxMCiYjNDM7b2JqLSQoQ09ORklHX0JMS19DR1JPVVApCSYjNDM7PSBicGZfYmxrY2cubwomIzQzO2VuZGlmCiBvYmotJChDT05GSUdfQkxLX0NHUk9VUF9SV1NUQVQpCSYjNDM7PSBibGstY2dyb3VwLXJ3c3RhdC5vCiBvYmotJChDT05GSUdfQkxLX0NHUk9VUF9GQ19BUFBJRCkgJiM0Mzs9IGJsay1jZ3JvdXAtZmMtYXBwaWQubwogb2JqLSQoQ09ORklHX0JMS19ERVZfVEhST1RUTElORykJJiM0Mzs9IGJsay10aHJvdHRsZS5vCmRpZmYgLS1naXQgYS9ibG9jay9ibGstY2dyb3VwLmMgYi9ibG9jay9ibGstY2dyb3VwLmMKaW5kZXggZDk2NzYxMjZjNWI1ZC4uOGQ1MzhhZDRlODYxYyAxMDA2NDQKLS0tIGEvYmxvY2svYmxrLWNncm91cC5jCiYjNDM7JiM0MzsmIzQzOyBiL2Jsb2NrL2Jsay1jZ3JvdXAuYwpAQCAtMTA4Niw3ICYjNDM7MTA4Niw3IEBAIHN0YXRpYyB2b2lkIGJsa2NnX3JzdGF0X2ZsdXNoKHN0cnVjdCBjZ3JvdXBfc3Vic3lzX3N0YXRlICpjc3MsIGludCBjcHUpCiAgKiBmbHVzaGluZyB0aGUgcm9vdCBjZ3JvdXAmIzM5O3Mgc3RhdHMgYnkgZXhwbGljaXRseSBmaWxsaW5nIGluIHRoZSBpb3N0YXQKICAqIHdpdGggZGlzayBsZXZlbCBzdGF0aXN0aWNzLgogICovCi1zdGF0aWMgdm9pZCBibGtjZ19maWxsX3Jvb3RfaW9zdGF0cyh2b2lkKQomIzQzO3ZvaWQgYmxrY2dfZmlsbF9yb290X2lvc3RhdHModm9pZCkKIHsKIAlzdHJ1Y3QgY2xhc3NfZGV2X2l0ZXIgaXRlcjsKIAlzdHJ1Y3QgZGV2aWNlICpkZXY7CmRpZmYgLS1naXQgYS9ibG9jay9ibGstY2dyb3VwLmggYi9ibG9jay9ibGstY2dyb3VwLmgKaW5kZXggNjE1MzkwZjc1MWFhMi4uOGM5YzJhMWFkZmFhNCAxMDA2NDQKLS0tIGEvYmxvY2svYmxrLWNncm91cC5oCiYjNDM7JiM0MzsmIzQzOyBiL2Jsb2NrL2Jsay1jZ3JvdXAuaApAQCAtMjA1LDYgJiM0MzsyMDUsNyBAQCB2b2lkIGJsa2NnX2RlYWN0aXZhdGVfcG9saWN5KHN0cnVjdCBnZW5kaXNrICpkaXNrLAogCQkJICAgICBjb25zdCBzdHJ1Y3QgYmxrY2dfcG9saWN5ICpwb2wpOwogCiBjb25zdCBjaGFyICpibGtnX2Rldl9uYW1lKHN0cnVjdCBibGtjZ19ncSAqYmxrZyk7CiYjNDM7dm9pZCBibGtjZ19maWxsX3Jvb3RfaW9zdGF0cyh2b2lkKTsKIHZvaWQgYmxrY2dfcHJpbnRfYmxrZ3Moc3RydWN0IHNlcV9maWxlICpzZiwgc3RydWN0IGJsa2NnICpibGtjZywKIAkJICAgICAgIHU2NCAoKnByZmlsbCkoc3RydWN0IHNlcV9maWxlICosCiAJCQkJICAgICBzdHJ1Y3QgYmxrZ19wb2xpY3lfZGF0YSAqLCBpbnQpLApkaWZmIC0tZ2l0IGEvYmxvY2svYnBmX2Jsa2NnLmMgYi9ibG9jay9icGZfYmxrY2cuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwLi4yNWM4MDlmNTA5MWMyCi0tLSAvZGV2L251bGwKJiM0MzsmIzQzOyYjNDM7IGIvYmxvY2svYnBmX2Jsa2NnLmMKQEAgLTAsMCAmIzQzOzEsMTU0IEBACiYjNDM7Ly8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb3ItbGF0ZXIKJiM0MzsvKgomIzQzOyAqIEJsb2NrIEkvTyBDb250cm9sbGVyLXJlbGF0ZWQgQlBGIGtmdW5jcyBhbmQgYXV4aWxpYXJ5IGNvZGUKJiM0MzsgKi8KJiM0MzsKJiM0MzsjaW5jbHVkZSAmIzM0O2Jsay1jZ3JvdXAuaCYjMzQ7CiYjNDM7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L2JwZi5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9idGZfaWRzLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L3JjdWxpc3QuaCZndDsKJiM0MzsKJiM0MztfX2JwZl9rZnVuY19zdGFydF9kZWZzKCk7CiYjNDM7CiYjNDM7LyoqCiYjNDM7ICogYnBmX2Jsa2NnX2ZsdXNoX3N0YXRzIC0gRmx1c2ggYSBibG9jayBjZ3JvdXAmIzM5O3MgaW8gc3RhdGlzdGljcwomIzQzOyAqIEBjZ3JwOiBjZ3JvdXAgdG8gZmx1c2gKJiM0MzsgKgomIzQzOyAqIFByb3BhZ2F0ZSBJL08gc3RhdGlzdGljcyB1cCB0aGUgY2dyb3VwIHRyZWUuIFJvb3Qgc3RhdGlzdGljcyBjb21lIGZyb20KJiM0MzsgKiBibG9jayBkZXZpY2VzIGFuZCBpbmNsdWRlIGFsbCBjZ3JvdXBzJiMzOTsgSS9PLgomIzQzOyAqLwomIzQzO19fYnBmX2tmdW5jIHZvaWQgYnBmX2Jsa2NnX2ZsdXNoX3N0YXRzKHN0cnVjdCBjZ3JvdXAgKmNncnApCiYjNDM7ewomIzQzOwlzdHJ1Y3QgY2dyb3VwX3N1YnN5c19zdGF0ZSAqY3NzOwomIzQzOwomIzQzOwkvKiBQaW4gdGhlIGNzcyBmb3IgdGhlIHNsZWVwYWJsZSBmbHVzaC4gKi8KJiM0MzsJcmN1X3JlYWRfbG9jaygpOwomIzQzOwljc3MgPSBjZ3JvdXBfY3NzKGNncnAsICZhbXA7aW9fY2dycF9zdWJzeXMpOwomIzQzOwlpZiAoY3NzICZhbXA7JmFtcDsgIWNzc190cnlnZXQoY3NzKSkKJiM0MzsJCWNzcyA9IE5VTEw7CiYjNDM7CXJjdV9yZWFkX3VubG9jaygpOwomIzQzOwomIzQzOwlpZiAoIWNzcykKJiM0MzsJCXJldHVybjsKJiM0MzsKJiM0MzsJaWYgKCFjc3MtJmd0O3BhcmVudCkKJiM0MzsJCWJsa2NnX2ZpbGxfcm9vdF9pb3N0YXRzKCk7CiYjNDM7CWVsc2UKJiM0MzsJCWNzc19yc3RhdF9mbHVzaChjc3MpOwomIzQzOwomIzQzOwljc3NfcHV0KGNzcyk7CiYjNDM7fQomIzQzOwomIzQzO3N0cnVjdCBicGZfaXRlcl9ibGtnIHsKJiM0MzsJX191NjQgX19vcGFxdWVbMl07CiYjNDM7fSBfX2FsaWduZWQoOCk7CiYjNDM7CiYjNDM7c3RydWN0IGJwZl9pdGVyX2Jsa2dfa2VybiB7CiYjNDM7CXN0cnVjdCBibGtjZyAqYmxrY2c7CiYjNDM7CXN0cnVjdCBibGtjZ19ncSAqcG9zOwomIzQzO30gX19hbGlnbmVkKDgpOwomIzQzOwomIzQzOy8qKgomIzQzOyAqIGJwZl9pdGVyX2Jsa2dfbmV3IC0gU3RhcnQgaXRlcmF0aW5nIGEgYmxvY2sgY2dyb3VwJiMzOTtzIHBlci1kZXZpY2UgYmxrZ3MKJiM0MzsgKiBAaXQ6IGl0ZXJhdG9yIHRvIGluaXRpYWxpemUKJiM0MzsgKiBAY3NzOiB0aGUgaW8gY29udHJvbGxlciYjMzk7cyBjc3MKJiM0MzsgKgomIzQzOyAqIEVhY2ggYmxrZyBob2xkcyBvbmUgZGV2aWNlJiMzOTtzIGlvLnN0YXQgY291bnRlcnMuIE9mZmxpbmUgYmxrZ3MgYXJlIHNraXBwZWQuCiYjNDM7ICogQSBibGtnIHdpdGhvdXQgYSBkaXNrIGNhbiBiZSByZXR1cm5lZC4gTXVzdCBydW4gdW5kZXIgUkNVLgomIzQzOyAqCiYjNDM7ICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIC1FSU5WQUwgaWYgQGNzcyBpcyBub3QgdGhlIGlvIGNvbnRyb2xsZXImIzM5O3MuCiYjNDM7ICovCiYjNDM7X19icGZfa2Z1bmMgaW50IGJwZl9pdGVyX2Jsa2dfbmV3KHN0cnVjdCBicGZfaXRlcl9ibGtnICppdCwKJiM0MzsJCQkJICBzdHJ1Y3QgY2dyb3VwX3N1YnN5c19zdGF0ZSAqY3NzKQomIzQzO3sKJiM0MzsJc3RydWN0IGJwZl9pdGVyX2Jsa2dfa2VybiAqa2l0ID0gKHZvaWQgKilpdDsKJiM0MzsKJiM0MzsJQlVJTERfQlVHX09OKHNpemVvZihzdHJ1Y3QgYnBmX2l0ZXJfYmxrZ19rZXJuKSAmZ3Q7IHNpemVvZihzdHJ1Y3QgYnBmX2l0ZXJfYmxrZykpOwomIzQzOwlCVUlMRF9CVUdfT04oX19hbGlnbm9mX18oc3RydWN0IGJwZl9pdGVyX2Jsa2dfa2VybikgIT0KJiM0MzsJCSAgICAgX19hbGlnbm9mX18oc3RydWN0IGJwZl9pdGVyX2Jsa2cpKTsKJiM0MzsKJiM0MzsJa2l0LSZndDtwb3MgPSBOVUxMOwomIzQzOwomIzQzOwlpZiAoY3NzLSZndDtzcyAhPSAmYW1wO2lvX2NncnBfc3Vic3lzKSB7CiYjNDM7CQlraXQtJmd0O2Jsa2NnID0gTlVMTDsKJiM0MzsJCXJldHVybiAtRUlOVkFMOwomIzQzOwl9CiYjNDM7CiYjNDM7CWtpdC0mZ3Q7YmxrY2cgPSBjc3NfdG9fYmxrY2coY3NzKTsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOwomIzQzOy8qKgomIzQzOyAqIGJwZl9pdGVyX2Jsa2dfbmV4dCAtIFJldHVybiB0aGUgbmV4dCBvbmxpbmUgYmxrZyBvZiB0aGUgaXRlcmF0ZWQgYmxvY2sgY2dyb3VwCiYjNDM7ICogQGl0OiBpdGVyYXRvcgomIzQzOyAqCiYjNDM7ICogUmV0dXJuOiB0aGUgbmV4dCBvbmxpbmUgYmxrZywgb3IgTlVMTCB3aGVuIHRoZSB3YWxrIGlzIGRvbmUuCiYjNDM7ICovCiYjNDM7X19icGZfa2Z1bmMgc3RydWN0IGJsa2NnX2dxICpicGZfaXRlcl9ibGtnX25leHQoc3RydWN0IGJwZl9pdGVyX2Jsa2cgKml0KQomIzQzO3sKJiM0MzsJc3RydWN0IGJwZl9pdGVyX2Jsa2dfa2VybiAqa2l0ID0gKHZvaWQgKilpdDsKJiM0MzsJc3RydWN0IGJsa2NnX2dxICpibGtnID0ga2l0LSZndDtwb3M7CiYjNDM7CXN0cnVjdCBobGlzdF9ub2RlICpub2RlOwomIzQzOwomIzQzOwlpZiAoIWtpdC0mZ3Q7YmxrY2cpCiYjNDM7CQlyZXR1cm4gTlVMTDsKJiM0MzsKJiM0MzsJaWYgKCFibGtnKQomIzQzOwkJbm9kZSA9IHJjdV9kZXJlZmVyZW5jZShobGlzdF9maXJzdF9yY3UoJmFtcDtraXQtJmd0O2Jsa2NnLSZndDtibGtnX2xpc3QpKTsKJiM0MzsJZWxzZQomIzQzOwkJbm9kZSA9IHJjdV9kZXJlZmVyZW5jZShobGlzdF9uZXh0X3JjdSgmYW1wO2Jsa2ctJmd0O2Jsa2NnX25vZGUpKTsKJiM0MzsKJiM0MzsJLyogU2tpcCBvZmZsaW5lIGJsa2dzLCBtYXRjaGluZyBpby5zdGF0LiAqLwomIzQzOwl3aGlsZSAobm9kZSkgewomIzQzOwkJYmxrZyA9IGhsaXN0X2VudHJ5KG5vZGUsIHN0cnVjdCBibGtjZ19ncSwgYmxrY2dfbm9kZSk7CiYjNDM7CQkvKiBBIHJhY2Ugb25seSBjaGFuZ2VzIHdoZXRoZXIgdGhpcyBibGtnIGlzIHJldHVybmVkLiAqLwomIzQzOwkJaWYgKGRhdGFfcmFjZShibGtnLSZndDtvbmxpbmUpKSB7CiYjNDM7CQkJa2l0LSZndDtwb3MgPSBibGtnOwomIzQzOwkJCXJldHVybiBibGtnOwomIzQzOwkJfQomIzQzOwkJbm9kZSA9IHJjdV9kZXJlZmVyZW5jZShobGlzdF9uZXh0X3JjdSgmYW1wO2Jsa2ctJmd0O2Jsa2NnX25vZGUpKTsKJiM0MzsJfQomIzQzOwomIzQzOwkvKiBUaGUgaXRlcmF0b3IgbXVzdCBrZWVwIHJldHVybmluZyBOVUxMIGFmdGVyIGNvbXBsZXRpb24uICovCiYjNDM7CWtpdC0mZ3Q7cG9zID0gTlVMTDsKJiM0MzsJa2l0LSZndDtibGtjZyA9IE5VTEw7CiYjNDM7CXJldHVybiBOVUxMOwomIzQzO30KJiM0MzsKJiM0MzsvKioKJiM0MzsgKiBicGZfaXRlcl9ibGtnX2Rlc3Ryb3kgLSBUZWFyIGRvd24gYSBibGtnIGl0ZXJhdG9yCiYjNDM7ICogQGl0OiBpdGVyYXRvcgomIzQzOyAqLwomIzQzO19fYnBmX2tmdW5jIHZvaWQgYnBmX2l0ZXJfYmxrZ19kZXN0cm95KHN0cnVjdCBicGZfaXRlcl9ibGtnICppdCkKJiM0Mzt7CiYjNDM7fQomIzQzOwomIzQzO19fYnBmX2tmdW5jX2VuZF9kZWZzKCk7CiYjNDM7CiYjNDM7QlRGX0tGVU5DU19TVEFSVChicGZfYmxrY2dfa2Z1bmNzKQomIzQzO0JURl9JRF9GTEFHUyhmdW5jLCBicGZfYmxrY2dfZmx1c2hfc3RhdHMsIEtGX1NMRUVQQUJMRSkKJiM0MzsKJiM0MztCVEZfSURfRkxBR1MoZnVuYywgYnBmX2l0ZXJfYmxrZ19uZXcsCiYjNDM7CSAgICAgS0ZfSVRFUl9ORVcgfCBLRl9SQ1UgfCBLRl9SQ1VfUFJPVEVDVEVEKQomIzQzO0JURl9JRF9GTEFHUyhmdW5jLCBicGZfaXRlcl9ibGtnX25leHQsIEtGX0lURVJfTkVYVCB8IEtGX1JFVF9OVUxMKQomIzQzO0JURl9JRF9GTEFHUyhmdW5jLCBicGZfaXRlcl9ibGtnX2Rlc3Ryb3ksIEtGX0lURVJfREVTVFJPWSkKJiM0MztCVEZfS0ZVTkNTX0VORChicGZfYmxrY2dfa2Z1bmNzKQomIzQzOwomIzQzO3N0YXRpYyBjb25zdCBzdHJ1Y3QgYnRmX2tmdW5jX2lkX3NldCBicGZfYmxrY2dfa2Z1bmNfc2V0ID0gewomIzQzOwkub3duZXIJCT0gVEhJU19NT0RVTEUsCiYjNDM7CS5zZXQJCT0gJmFtcDticGZfYmxrY2dfa2Z1bmNzLAomIzQzO307CiYjNDM7CiYjNDM7c3RhdGljIGludCBfX2luaXQgYnBmX2Jsa2NnX2luaXQodm9pZCkKJiM0Mzt7CiYjNDM7CWludCBlcnI7CiYjNDM7CiYjNDM7CWVyciA9IHJlZ2lzdGVyX2J0Zl9rZnVuY19pZF9zZXQoQlBGX1BST0dfVFlQRV9VTlNQRUMsCiYjNDM7CQkJCQkmYW1wO2JwZl9ibGtjZ19rZnVuY19zZXQpOwomIzQzOwlpZiAoZXJyKQomIzQzOwkJcHJfd2FybigmIzM0O2Vycm9yIHdoaWxlIHJlZ2lzdGVyaW5nIGJwZiBibGtjZyBrZnVuY3M6ICVkXG4mIzM0OywgZXJyKTsKJiM0MzsKJiM0MzsJcmV0dXJuIGVycjsKJiM0Mzt9CiYjNDM7bGF0ZV9pbml0Y2FsbChicGZfYmxrY2dfaW5pdCk7CmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvY2dyb3VwX2l0ZXJfaW8uaCBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9jZ3JvdXBfaXRlcl9pby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAuLmY0YmJhYWNjZGY3MTYKLS0tIC9kZXYvbnVsbAomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvY2dyb3VwX2l0ZXJfaW8uaApAQCAtMCwwICYjNDM7MSwxNyBAQAomIzQzOy8qIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wICovCiYjNDM7LyogQ29weXJpZ2h0IChjKSAyMDI1IE1ldGEgUGxhdGZvcm1zLCBJbmMuIGFuZCBhZmZpbGlhdGVzLiAqLwomIzQzOyNpZm5kZWYgX19DR1JPVVBfSVRFUl9JT19ICiYjNDM7I2RlZmluZSBfX0NHUk9VUF9JVEVSX0lPX0gKJiM0MzsKJiM0MztzdHJ1Y3QgaW9fcXVlcnkgewomIzQzOwkvKiBvbmUgZGV2aWNlJiMzOTtzIGlvLnN0YXQgY291bnRlcnMgKi8KJiM0MzsJX191NjQgcmJ5dGVzOwomIzQzOwlfX3U2NCB3Ynl0ZXM7CiYjNDM7CV9fdTY0IHJpb3M7CiYjNDM7CV9fdTY0IHdpb3M7CiYjNDM7CV9fdTY0IGRieXRlczsKJiM0MzsJX191NjQgZGlvczsKJiM0MzsJX191NjQgZGV2OwkvKiBkZXZfdCBvZiB0aGUgZGV2aWNlIHRoZSBjb3VudGVycyBiZWxvbmcgdG8gKi8KJiM0Mzt9OwomIzQzOwomIzQzOyNlbmRpZiAvKiBfX0NHUk9VUF9JVEVSX0lPX0ggKi8KZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9jb25maWcgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvY29uZmlnCmluZGV4IGVhNzA0NGYzMGFkYzMuLjI3MGU2YmY5MTk0ZDIgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9jb25maWcKJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL2NvbmZpZwpAQCAtMSwzICYjNDM7MSw0IEBACiYjNDM7Q09ORklHX0JMS19DR1JPVVA9eQogQ09ORklHX0JMS19ERVZfTE9PUD15CiBDT05GSUdfQk9PVFBBUkFNX0hBUkRMT0NLVVBfUEFOSUM9eQogQ09ORklHX0JPT1RQQVJBTV9TT0ZUTE9DS1VQX1BBTklDPTEKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2Nncm91cF9pdGVyX2lvLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9jZ3JvdXBfaXRlcl9pby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAuLjVkMjdlNWQyODM3OTUKLS0tIC9kZXYvbnVsbAomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9jZ3JvdXBfaXRlcl9pby5jCkBAIC0wLDAgJiM0MzsxLDI3NyBAQAomIzQzOy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wCiYjNDM7LyogQ29weXJpZ2h0IChjKSAyMDI1IE1ldGEgUGxhdGZvcm1zLCBJbmMuIGFuZCBhZmZpbGlhdGVzLiAqLwomIzQzOyNkZWZpbmUgX0dOVV9TT1VSQ0UKJiM0MzsjaW5jbHVkZSAmbHQ7dGVzdF9wcm9ncy5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDticGYvbGliYnBmLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2ZjbnRsLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L2xvb3AuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7c3RkbGliLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N0cmluZy5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtzeXMvaW9jdGwuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7c3lzL3N0YXQuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7c3lzL3N5c21hY3Jvcy5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDt1bmlzdGQuaCZndDsKJiM0MzsjaW5jbHVkZSAmIzM0O2Nncm91cF9oZWxwZXJzLmgmIzM0OwomIzQzOyNpbmNsdWRlICYjMzQ7Y2dyb3VwX2l0ZXJfaW8uaCYjMzQ7CiYjNDM7I2luY2x1ZGUgJiMzNDtjZ3JvdXBfaXRlcl9pby5za2VsLmgmIzM0OwomIzQzOwomIzQzOyNkZWZpbmUgSU9fU0laRSAoNCAqIDEwMjQgKiAxMDI0KQomIzQzOwomIzQzO3N0YXRpYyBpbnQgcmVhZF9zdGF0cyhzdHJ1Y3QgYnBmX2xpbmsgKmxpbmspCiYjNDM7ewomIzQzOwlpbnQgZmQsIHJldCA9IDA7CiYjNDM7CXNzaXplX3QgYnl0ZXM7CiYjNDM7CiYjNDM7CWZkID0gYnBmX2l0ZXJfY3JlYXRlKGJwZl9saW5rX19mZChsaW5rKSk7CiYjNDM7CWlmICghQVNTRVJUX09LX0ZEKGZkLCAmIzM0O2JwZl9pdGVyX2NyZWF0ZSYjMzQ7KSkKJiM0MzsJCXJldHVybiAxOwomIzQzOwomIzQzOwkvKiBSZXN1bHRzIGxhbmQgaW4gc2tlbC0mZ3Q7ZGF0YV9xdWVyeTsgdGhlIHJlYWQgaXRzZWxmIHJldHVybnMgbm8gZGF0YS4gKi8KJiM0MzsJYnl0ZXMgPSByZWFkKGZkLCBOVUxMLCAwKTsKJiM0MzsJaWYgKCFBU1NFUlRfRVEoYnl0ZXMsIDAsICYjMzQ7cmVhZCBmZCYjMzQ7KSkKJiM0MzsJCXJldCA9IDE7CiYjNDM7CiYjNDM7CWNsb3NlKGZkKTsKJiM0MzsJcmV0dXJuIHJldDsKJiM0Mzt9CiYjNDM7CiYjNDM7LyogU2V0IHVwIGEgbG9vcCBkZXZpY2UgZm9yIGNncm91cC1jaGFyZ2VkIEkvTy4gKi8KJiM0MztzdGF0aWMgaW50IGxvb3Bfc2V0dXAoY2hhciAqbG9vcF9wYXRoLCBzaXplX3Qgc3osIGludCAqY3RsX2ZkLCBpbnQgKmxvb3BfZmQsCiYjNDM7CQkgICAgICBpbnQgKmJhY2tfZmQpCiYjNDM7ewomIzQzOwljaGFyIGJhY2tfcGF0aFtdID0gJiMzNDsvdG1wL2Nncm91cF9pdGVyX2lvLlhYWFhYWCYjMzQ7OwomIzQzOwlpbnQgbnI7CiYjNDM7CiYjNDM7CSpjdGxfZmQgPSAqbG9vcF9mZCA9ICpiYWNrX2ZkID0gLTE7CiYjNDM7CiYjNDM7CSpjdGxfZmQgPSBvcGVuKCYjMzQ7L2Rldi9sb29wLWNvbnRyb2wmIzM0OywgT19SRFdSIHwgT19DTE9FWEVDKTsKJiM0MzsJaWYgKCpjdGxfZmQgJmx0OyAwKQomIzQzOwkJcmV0dXJuIC0xOwomIzQzOwomIzQzOwluciA9IGlvY3RsKCpjdGxfZmQsIExPT1BfQ1RMX0dFVF9GUkVFKTsKJiM0MzsJaWYgKG5yICZsdDsgMCkKJiM0MzsJCWdvdG8gZXJyOwomIzQzOwlzbnByaW50Zihsb29wX3BhdGgsIHN6LCAmIzM0Oy9kZXYvbG9vcCVkJiMzNDssIG5yKTsKJiM0MzsKJiM0MzsJKmJhY2tfZmQgPSBta3N0ZW1wKGJhY2tfcGF0aCk7CiYjNDM7CWlmICgqYmFja19mZCAmbHQ7IDApCiYjNDM7CQlnb3RvIGVycjsKJiM0MzsJdW5saW5rKGJhY2tfcGF0aCk7CiYjNDM7CWlmIChmdHJ1bmNhdGUoKmJhY2tfZmQsIChvZmZfdClJT19TSVpFICogNCkpCiYjNDM7CQlnb3RvIGVycjsKJiM0MzsKJiM0MzsJKmxvb3BfZmQgPSBvcGVuKGxvb3BfcGF0aCwgT19SRFdSIHwgT19DTE9FWEVDKTsKJiM0MzsJaWYgKCpsb29wX2ZkICZsdDsgMCkKJiM0MzsJCWdvdG8gZXJyOwomIzQzOwlpZiAoaW9jdGwoKmxvb3BfZmQsIExPT1BfU0VUX0ZELCAqYmFja19mZCkpCiYjNDM7CQlnb3RvIGVycjsKJiM0MzsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7ZXJyOgomIzQzOwlpZiAoKmxvb3BfZmQgJmd0Oz0gMCkKJiM0MzsJCWNsb3NlKCpsb29wX2ZkKTsKJiM0MzsJaWYgKCpiYWNrX2ZkICZndDs9IDApCiYjNDM7CQljbG9zZSgqYmFja19mZCk7CiYjNDM7CWNsb3NlKCpjdGxfZmQpOwomIzQzOwkqY3RsX2ZkID0gKmxvb3BfZmQgPSAqYmFja19mZCA9IC0xOwomIzQzOwlyZXR1cm4gLTE7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkIGxvb3BfdGVhcmRvd24oY29uc3QgY2hhciAqbG9vcF9wYXRoLCBpbnQgY3RsX2ZkLCBpbnQgbG9vcF9mZCwKJiM0MzsJCQkgIGludCBiYWNrX2ZkKQomIzQzO3sKJiM0MzsJaW50IG5yID0gLTE7CiYjNDM7CiYjNDM7CWlmIChsb29wX2ZkICZndDs9IDApIHsKJiM0MzsJCWlvY3RsKGxvb3BfZmQsIExPT1BfQ0xSX0ZELCAwKTsKJiM0MzsJCWNsb3NlKGxvb3BfZmQpOwomIzQzOwl9CiYjNDM7CWlmIChiYWNrX2ZkICZndDs9IDApCiYjNDM7CQljbG9zZShiYWNrX2ZkKTsKJiM0MzsJaWYgKGN0bF9mZCAmZ3Q7PSAwKSB7CiYjNDM7CQlpZiAoc3NjYW5mKGxvb3BfcGF0aCwgJiMzNDsvZGV2L2xvb3AlZCYjMzQ7LCAmYW1wO25yKSA9PSAxICZhbXA7JmFtcDsgbnIgJmd0Oz0gMCkKJiM0MzsJCQlpb2N0bChjdGxfZmQsIExPT1BfQ1RMX1JFTU9WRSwgbnIpOwomIzQzOwkJY2xvc2UoY3RsX2ZkKTsKJiM0MzsJfQomIzQzO30KJiM0MzsKJiM0MzsvKiBPX0RJUkVDVCBrZWVwcyBJL08gY2hhcmdlZCB0byB0aGUgY3VycmVudCBjZ3JvdXAuICovCiYjNDM7c3RhdGljIGludCBkb19kaXJlY3RfaW8oY29uc3QgY2hhciAqbG9vcF9wYXRoKQomIzQzO3sKJiM0MzsJdm9pZCAqYnVmOwomIzQzOwlpbnQgZmQsIHJldCA9IC0xOwomIzQzOwomIzQzOwlmZCA9IG9wZW4obG9vcF9wYXRoLCBPX1JEV1IgfCBPX0RJUkVDVCB8IE9fQ0xPRVhFQyk7CiYjNDM7CWlmIChmZCAmbHQ7IDApCiYjNDM7CQlyZXR1cm4gLTE7CiYjNDM7CWlmIChwb3NpeF9tZW1hbGlnbigmYW1wO2J1ZiwgNDA5NiwgSU9fU0laRSkpCiYjNDM7CQlnb3RvIG91dF9mZDsKJiM0MzsJbWVtc2V0KGJ1ZiwgMHhhYiwgSU9fU0laRSk7CiYjNDM7CiYjNDM7CWlmIChwd3JpdGUoZmQsIGJ1ZiwgSU9fU0laRSwgMCkgIT0gSU9fU0laRSkKJiM0MzsJCWdvdG8gb3V0X2J1ZjsKJiM0MzsJZnN5bmMoZmQpOwomIzQzOwlpZiAocHJlYWQoZmQsIGJ1ZiwgSU9fU0laRSwgMCkgIT0gSU9fU0laRSkKJiM0MzsJCWdvdG8gb3V0X2J1ZjsKJiM0MzsJcmV0ID0gMDsKJiM0MztvdXRfYnVmOgomIzQzOwlmcmVlKGJ1Zik7CiYjNDM7b3V0X2ZkOgomIzQzOwljbG9zZShmZCk7CiYjNDM7CXJldHVybiByZXQ7CiYjNDM7fQomIzQzOwomIzQzOy8qIFJlYWQgQGRldiYjMzk7cyBpby5zdGF0IGNvdW50ZXJzLiBAZGV2IHVzZXMga2VybmVsIGRldl90IGVuY29kaW5nLiAqLwomIzQzO3N0YXRpYyBpbnQgcGFyc2VfaW9fc3RhdChpbnQgY2dyb3VwX2ZkLCBfX3U2NCBkZXYsIHN0cnVjdCBpb19xdWVyeSAqb3V0KQomIzQzO3sKJiM0MzsJdW5zaWduZWQgaW50IHdhbnRfbWFqID0gZGV2ICZndDsmZ3Q7IDIwLCB3YW50X21pbiA9IGRldiAmYW1wOyAoKDFVICZsdDsmbHQ7IDIwKSAtIDEpOwomIzQzOwljaGFyIGJ1Zls0MDk2XSwgKmxpbmUsICpzYXZlcHRyOwomIzQzOwlpbnQgZmQsIG4sIHJldCA9IC0xOwomIzQzOwomIzQzOwlmZCA9IG9wZW5hdChjZ3JvdXBfZmQsICYjMzQ7aW8uc3RhdCYjMzQ7LCBPX1JET05MWSk7CiYjNDM7CWlmIChmZCAmbHQ7IDApCiYjNDM7CQlyZXR1cm4gLTE7CiYjNDM7CW4gPSByZWFkKGZkLCBidWYsIHNpemVvZihidWYpIC0gMSk7CiYjNDM7CWNsb3NlKGZkKTsKJiM0MzsJaWYgKG4gJmx0Oz0gMCkKJiM0MzsJCXJldHVybiAtMTsKJiM0MzsJYnVmW25dID0gJiMzOTtcMCYjMzk7OwomIzQzOwomIzQzOwlmb3IgKGxpbmUgPSBzdHJ0b2tfcihidWYsICYjMzQ7XG4mIzM0OywgJmFtcDtzYXZlcHRyKTsgbGluZTsKJiM0MzsJICAgICBsaW5lID0gc3RydG9rX3IoTlVMTCwgJiMzNDtcbiYjMzQ7LCAmYW1wO3NhdmVwdHIpKSB7CiYjNDM7CQl1bnNpZ25lZCBsb25nIGxvbmcgcmIgPSAwLCB3YiA9IDAsIHJpID0gMCwgd2kgPSAwLCBkYiA9IDAsIGRpID0gMDsKJiM0MzsJCXVuc2lnbmVkIGludCBtYWosIG1pbjsKJiM0MzsKJiM0MzsJCS8qIE9ubHkgdGhlIGRldmljZSBpZCBpcyByZXF1aXJlZDsgbWlzc2luZyBjb3VudGVycyBzdGF5IHplcm8uICovCiYjNDM7CQlpZiAoc3NjYW5mKGxpbmUsCiYjNDM7CQkJICAgJiMzNDsldToldSByYnl0ZXM9JWxsdSB3Ynl0ZXM9JWxsdSByaW9zPSVsbHUgd2lvcz0lbGx1IGRieXRlcz0lbGx1IGRpb3M9JWxsdSYjMzQ7LAomIzQzOwkJCSAgICZhbXA7bWFqLCAmYW1wO21pbiwgJmFtcDtyYiwgJmFtcDt3YiwgJmFtcDtyaSwgJmFtcDt3aSwgJmFtcDtkYiwgJmFtcDtkaSkgJmx0OyAyKQomIzQzOwkJCWNvbnRpbnVlOwomIzQzOwkJaWYgKG1haiAhPSB3YW50X21haiB8fCBtaW4gIT0gd2FudF9taW4pCiYjNDM7CQkJY29udGludWU7CiYjNDM7CiYjNDM7CQlvdXQtJmd0O3JieXRlcyA9IHJiOwomIzQzOwkJb3V0LSZndDt3Ynl0ZXMgPSB3YjsKJiM0MzsJCW91dC0mZ3Q7cmlvcyA9IHJpOwomIzQzOwkJb3V0LSZndDt3aW9zID0gd2k7CiYjNDM7CQlvdXQtJmd0O2RieXRlcyA9IGRiOwomIzQzOwkJb3V0LSZndDtkaW9zID0gZGk7CiYjNDM7CQlyZXQgPSAwOwomIzQzOwkJYnJlYWs7CiYjNDM7CX0KJiM0MzsJcmV0dXJuIHJldDsKJiM0Mzt9CiYjNDM7CiYjNDM7dm9pZCB0ZXN0X2Nncm91cF9pdGVyX2lvKHZvaWQpCiYjNDM7ewomIzQzOwljaGFyICpjZ3JvdXBfcmVsX3BhdGggPSAmIzM0Oy9jZ3JvdXBfaXRlcl9pb190ZXN0JiMzNDs7CiYjNDM7CWludCBjdGxfZmQgPSAtMSwgbG9vcF9mZCA9IC0xLCBiYWNrX2ZkID0gLTE7CiYjNDM7CXN0cnVjdCBjZ3JvdXBfaXRlcl9pbyAqc2tlbCA9IE5VTEw7CiYjNDM7CXN0cnVjdCBicGZfbGluayAqbGluayA9IE5VTEw7CiYjNDM7CWNoYXIgbG9vcF9wYXRoWzY0XTsKJiM0MzsJc3RydWN0IGlvX3F1ZXJ5ICpxOwomIzQzOwlpbnQgY2dyb3VwX2ZkOwomIzQzOwomIzQzOwljZ3JvdXBfZmQgPSBjZ3JvdXBfc2V0dXBfYW5kX2pvaW4oY2dyb3VwX3JlbF9wYXRoKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0tfRkQoY2dyb3VwX2ZkLCAmIzM0O2Nncm91cF9zZXR1cF9hbmRfam9pbiYjMzQ7KSkKJiM0MzsJCXJldHVybjsKJiM0MzsKJiM0MzsJaWYgKGxvb3Bfc2V0dXAobG9vcF9wYXRoLCBzaXplb2YobG9vcF9wYXRoKSwgJmFtcDtjdGxfZmQsICZhbXA7bG9vcF9mZCwgJmFtcDtiYWNrX2ZkKSkgewomIzQzOwkJdGVzdF9fc2tpcCgpOwkvKiBuZWVkcyByb290ICYjNDM7IENPTkZJR19CTEtfREVWX0xPT1AgKi8KJiM0MzsJCWdvdG8gY2xlYW51cF9jZ3JvdXBfZmQ7CiYjNDM7CX0KJiM0MzsKJiM0MzsJc2tlbCA9IGNncm91cF9pdGVyX2lvX19vcGVuX2FuZF9sb2FkKCk7CiYjNDM7CWlmICghQVNTRVJUX09LX1BUUihza2VsLCAmIzM0O2Nncm91cF9pdGVyX2lvX19vcGVuX2FuZF9sb2FkJiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwX2xvb3A7CiYjNDM7CiYjNDM7CS8qIENvbnZlcnQgZ2xpYmMgc3RfcmRldiB0byBrZXJuZWwgZGV2X3QgZm9ybWF0LiAqLwomIzQzOwl7CiYjNDM7CQlzdHJ1Y3Qgc3RhdCBsc3Q7CiYjNDM7CiYjNDM7CQlpZiAoIUFTU0VSVF9PSyhmc3RhdChsb29wX2ZkLCAmYW1wO2xzdCksICYjMzQ7ZnN0YXQgbG9vcCYjMzQ7KSkKJiM0MzsJCQlnb3RvIGNsZWFudXBfc2tlbDsKJiM0MzsJCXNrZWwtJmd0O2RhdGFfcXVlcnktJmd0O3RhcmdldF9kZXYgPQomIzQzOwkJCSgoX191NjQpbWFqb3IobHN0LnN0X3JkZXYpICZsdDsmbHQ7IDIwKSB8IG1pbm9yKGxzdC5zdF9yZGV2KTsKJiM0MzsJfQomIzQzOwomIzQzOwlERUNMQVJFX0xJQkJQRl9PUFRTKGJwZl9pdGVyX2F0dGFjaF9vcHRzLCBvcHRzKTsKJiM0MzsJdW5pb24gYnBmX2l0ZXJfbGlua19pbmZvIGxpbmZvID0gewomIzQzOwkJLmNncm91cC5jZ3JvdXBfZmQgPSBjZ3JvdXBfZmQsCiYjNDM7CQkuY2dyb3VwLm9yZGVyID0gQlBGX0NHUk9VUF9JVEVSX1NFTEZfT05MWSwKJiM0MzsJfTsKJiM0MzsJb3B0cy5saW5rX2luZm8gPSAmYW1wO2xpbmZvOwomIzQzOwlvcHRzLmxpbmtfaW5mb19sZW4gPSBzaXplb2YobGluZm8pOwomIzQzOwomIzQzOwlsaW5rID0gYnBmX3Byb2dyYW1fX2F0dGFjaF9pdGVyKHNrZWwtJmd0O3Byb2dzLmNncm91cF9pb19xdWVyeSwgJmFtcDtvcHRzKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0tfUFRSKGxpbmssICYjMzQ7YnBmX3Byb2dyYW1fX2F0dGFjaF9pdGVyJiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwX3NrZWw7CiYjNDM7CiYjNDM7CS8qIFRoaXMgcHJvY2VzcyBpcyBpbiB0aGUgdGVzdCBjZ3JvdXAsIHNvIHRoZSBsb29wIEkvTyBpcyBjaGFyZ2VkIGhlcmUuICovCiYjNDM7CWlmICghQVNTRVJUX09LKGRvX2RpcmVjdF9pbyhsb29wX3BhdGgpLCAmIzM0O2RvX2RpcmVjdF9pbyYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cF9saW5rOwomIzQzOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhyZWFkX3N0YXRzKGxpbmspLCAmIzM0O3JlYWQgc3RhdHMmIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXBfbGluazsKJiM0MzsKJiM0MzsJcSA9ICZhbXA7c2tlbC0mZ3Q7ZGF0YV9xdWVyeS0mZ3Q7aW9fcXVlcnk7CiYjNDM7CWlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KCYjMzQ7Y2dyb3VwX2l0ZXJfaW9fX3dyaXRlJiMzNDspKSB7CiYjNDM7CQlBU1NFUlRfR1QocS0mZ3Q7d2J5dGVzLCAwLCAmIzM0O3dieXRlcyYjMzQ7KTsKJiM0MzsJCUFTU0VSVF9HVChxLSZndDt3aW9zLCAwLCAmIzM0O3dpb3MmIzM0Oyk7CiYjNDM7CX0KJiM0MzsJaWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoJiMzNDtjZ3JvdXBfaXRlcl9pb19fcmVhZCYjMzQ7KSkgewomIzQzOwkJQVNTRVJUX0dUKHEtJmd0O3JieXRlcywgMCwgJiMzNDtyYnl0ZXMmIzM0Oyk7CiYjNDM7CQlBU1NFUlRfR1QocS0mZ3Q7cmlvcywgMCwgJiMzNDtyaW9zJiMzNDspOwomIzQzOwl9CiYjNDM7CWlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KCYjMzQ7Y2dyb3VwX2l0ZXJfaW9fX2RldiYjMzQ7KSkKJiM0MzsJCUFTU0VSVF9HVChxLSZndDtkZXYsIDAsICYjMzQ7ZGV2JiMzNDspOwomIzQzOwomIzQzOwkvKiBDb21wYXJlIHdpdGggaW8uc3RhdCB3aXRob3V0IEkvTyBiZXR3ZWVuIHRoZSByZWFkcy4gKi8KJiM0MzsJaWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoJiMzNDtjZ3JvdXBfaXRlcl9pb19fbWF0Y2gmIzM0OykpIHsKJiM0MzsJCXN0cnVjdCBpb19xdWVyeSBmaWxldiA9IHt9OwomIzQzOwomIzQzOwkJaWYgKEFTU0VSVF9PSyhyZWFkX3N0YXRzKGxpbmspLCAmIzM0O3JlYWQgc3RhdHMmIzM0OykgJmFtcDsmYW1wOwomIzQzOwkJICAgIEFTU0VSVF9PSyhwYXJzZV9pb19zdGF0KGNncm91cF9mZCwgcS0mZ3Q7ZGV2LCAmYW1wO2ZpbGV2KSwKJiM0MzsJCQkgICAgICAmIzM0O3BhcnNlIGlvLnN0YXQmIzM0OykpIHsKJiM0MzsJCQlBU1NFUlRfRVEocS0mZ3Q7cmJ5dGVzLCBmaWxldi5yYnl0ZXMsICYjMzQ7cmJ5dGVzJiMzNDspOwomIzQzOwkJCUFTU0VSVF9FUShxLSZndDt3Ynl0ZXMsIGZpbGV2LndieXRlcywgJiMzNDt3Ynl0ZXMmIzM0Oyk7CiYjNDM7CQkJQVNTRVJUX0VRKHEtJmd0O3Jpb3MsIGZpbGV2LnJpb3MsICYjMzQ7cmlvcyYjMzQ7KTsKJiM0MzsJCQlBU1NFUlRfRVEocS0mZ3Q7d2lvcywgZmlsZXYud2lvcywgJiMzNDt3aW9zJiMzNDspOwomIzQzOwkJCUFTU0VSVF9FUShxLSZndDtkYnl0ZXMsIGZpbGV2LmRieXRlcywgJiMzNDtkYnl0ZXMmIzM0Oyk7CiYjNDM7CQkJQVNTRVJUX0VRKHEtJmd0O2Rpb3MsIGZpbGV2LmRpb3MsICYjMzQ7ZGlvcyYjMzQ7KTsKJiM0MzsJCX0KJiM0MzsJfQomIzQzOwomIzQzOwkvKiBSb290IHN0YXRpc3RpY3MgaW5jbHVkZSB0aGlzIGNncm91cCYjMzk7cyBJL08uICovCiYjNDM7CWlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KCYjMzQ7Y2dyb3VwX2l0ZXJfaW9fX3Jvb3QmIzM0OykpIHsKJiM0MzsJCXN0cnVjdCBicGZfbGluayAqcm9vdF9saW5rOwomIzQzOwkJc3RydWN0IGlvX3F1ZXJ5ICpyOwomIzQzOwomIzQzOwkJc2tlbC0mZ3Q7ZGF0YV9xdWVyeS0mZ3Q7Z290X3Jvb3RfY3NzID0gMDsKJiM0MzsJCXJvb3RfbGluayA9IGJwZl9wcm9ncmFtX19hdHRhY2hfaXRlcihza2VsLSZndDtwcm9ncy5jZ3JvdXBfcm9vdF9pb19xdWVyeSwKJiM0MzsJCQkJCQkgICAgICZhbXA7b3B0cyk7CiYjNDM7CQlpZiAoQVNTRVJUX09LX1BUUihyb290X2xpbmssICYjMzQ7YXR0YWNoIHJvb3QgaXRlciYjMzQ7KSkgewomIzQzOwkJCWlmIChBU1NFUlRfT0socmVhZF9zdGF0cyhyb290X2xpbmspLCAmIzM0O3JlYWQgcm9vdCBzdGF0cyYjMzQ7KSkgewomIzQzOwkJCQlyID0gJmFtcDtza2VsLSZndDtkYXRhX3F1ZXJ5LSZndDtyb290X3F1ZXJ5OwomIzQzOwkJCQlBU1NFUlRfRVEoc2tlbC0mZ3Q7ZGF0YV9xdWVyeS0mZ3Q7Z290X3Jvb3RfY3NzLCAxLAomIzQzOwkJCQkJICAmIzM0O2dvdF9yb290X2NzcyYjMzQ7KTsKJiM0MzsJCQkJQVNTRVJUX0VRKHItJmd0O2RldiwgcS0mZ3Q7ZGV2LCAmIzM0O3Jvb3QgZGV2JiMzNDspOwomIzQzOwkJCQlBU1NFUlRfR0Uoci0mZ3Q7d2J5dGVzLCBxLSZndDt3Ynl0ZXMsICYjMzQ7cm9vdCB3Ynl0ZXMmIzM0Oyk7CiYjNDM7CQkJCUFTU0VSVF9HRShyLSZndDt3aW9zLCBxLSZndDt3aW9zLCAmIzM0O3Jvb3Qgd2lvcyYjMzQ7KTsKJiM0MzsJCQkJQVNTRVJUX0dFKHItJmd0O3JieXRlcywgcS0mZ3Q7cmJ5dGVzLCAmIzM0O3Jvb3QgcmJ5dGVzJiMzNDspOwomIzQzOwkJCQlBU1NFUlRfR0Uoci0mZ3Q7cmlvcywgcS0mZ3Q7cmlvcywgJiMzNDtyb290IHJpb3MmIzM0Oyk7CiYjNDM7CQkJfQomIzQzOwkJCWJwZl9saW5rX19kZXN0cm95KHJvb3RfbGluayk7CiYjNDM7CQl9CiYjNDM7CX0KJiM0MzsKJiM0MztjbGVhbnVwX2xpbms6CiYjNDM7CWJwZl9saW5rX19kZXN0cm95KGxpbmspOwomIzQzO2NsZWFudXBfc2tlbDoKJiM0MzsJY2dyb3VwX2l0ZXJfaW9fX2Rlc3Ryb3koc2tlbCk7CiYjNDM7Y2xlYW51cF9sb29wOgomIzQzOwlsb29wX3RlYXJkb3duKGxvb3BfcGF0aCwgY3RsX2ZkLCBsb29wX2ZkLCBiYWNrX2ZkKTsKJiM0MztjbGVhbnVwX2Nncm91cF9mZDoKJiM0MzsJY2xvc2UoY2dyb3VwX2ZkKTsKJiM0MzsJY2xlYW51cF9jZ3JvdXBfZW52aXJvbm1lbnQoKTsKJiM0Mzt9CmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvY2dyb3VwX2l0ZXJfaW8uYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9jZ3JvdXBfaXRlcl9pby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAuLjJjZDUzODA2ODk4N2EKLS0tIC9kZXYvbnVsbAomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvY2dyb3VwX2l0ZXJfaW8uYwpAQCAtMCwwICYjNDM7MSw5OSBAQAomIzQzOy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wCiYjNDM7LyogQ29weXJpZ2h0IChjKSAyMDI1IE1ldGEgUGxhdGZvcm1zLCBJbmMuIGFuZCBhZmZpbGlhdGVzLiAqLwomIzQzOyNpbmNsdWRlICZsdDt2bWxpbnV4LmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2JwZi9icGZfaGVscGVycy5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDticGYvYnBmX2NvcmVfcmVhZC5oJmd0OwomIzQzOyNpbmNsdWRlICYjMzQ7YnBmX2V4cGVyaW1lbnRhbC5oJiMzNDsKJiM0MzsjaW5jbHVkZSAmIzM0O2Nncm91cF9pdGVyX2lvLmgmIzM0OwomIzQzOwomIzQzO2NoYXIgX2xpY2Vuc2VbXSBTRUMoJiMzNDtsaWNlbnNlJiMzNDspID0gJiMzNDtHUEwmIzM0OzsKJiM0MzsKJiM0MztzdHJ1Y3QgaW9fcXVlcnkgaW9fcXVlcnkgU0VDKCYjMzQ7LmRhdGEucXVlcnkmIzM0Oyk7CiYjNDM7CiYjNDM7c3RydWN0IGlvX3F1ZXJ5IHJvb3RfcXVlcnkgU0VDKCYjMzQ7LmRhdGEucXVlcnkmIzM0Oyk7CiYjNDM7CiYjNDM7X191NjQgZ290X3Jvb3RfY3NzIFNFQygmIzM0Oy5kYXRhLnF1ZXJ5JiMzNDspOwomIzQzOwomIzQzOy8qIERldmljZSBzZWxlY3RlZCBieSB1c2Vyc3BhY2UgaW4ga2VybmVsIGRldl90IGZvcm1hdC4gKi8KJiM0MztfX3U2NCB0YXJnZXRfZGV2IFNFQygmIzM0Oy5kYXRhLnF1ZXJ5JiMzNDspOwomIzQzOwomIzQzOy8qIEtlZXAgaW5saW5lOiBSQ1UgYW5kIG9wZW4tY29kZWQgaXRlcmF0b3JzIGNhbm5vdCBjcm9zcyBhIEJQRiBjYWxsLiAqLwomIzQzO3N0YXRpYyBfX2Fsd2F5c19pbmxpbmUgaW50IHJlYWRfdGFyZ2V0X2RldihzdHJ1Y3QgY2dyb3VwICpjZ3JwLAomIzQzOwkJCQkJICAgc3RydWN0IGlvX3F1ZXJ5ICpvdXQpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgY2dyb3VwX3N1YnN5c19zdGF0ZSAqY3NzOwomIzQzOwlzdHJ1Y3QgYmxrY2dfZ3EgKnBvczsKJiM0MzsJX191NjQgZGV2OwomIzQzOwlpbnQgc3NpZDsKJiM0MzsKJiM0MzsJLyogVGhlIGZsdXNoIGNhbiBzbGVlcCwgc28gcnVuIGl0IGJlZm9yZSB0aGUgUkNVIHNlY3Rpb24uICovCiYjNDM7CWJwZl9ibGtjZ19mbHVzaF9zdGF0cyhjZ3JwKTsKJiM0MzsKJiM0MzsJYnBmX3JjdV9yZWFkX2xvY2soKTsKJiM0MzsJc3NpZCA9IGJwZl9jb3JlX2VudW1fdmFsdWUoZW51bSBjZ3JvdXBfc3Vic3lzX2lkLCBpb19jZ3JwX2lkKTsKJiM0MzsKJiM0MzsJLyoKJiM0MzsJICogc3Vic3lzW10gaXMgX19yY3UsIHNvIHRoaXMgcmVhZCBnaXZlcyBhbiBSQ1UgcG9pbnRlciB0aGUgaXRlcmF0b3IKJiM0MzsJICogYWNjZXB0cy4gQlBGX0NPUkVfUkVBRCgpIHdvdWxkIHJldHVybiBhIHBsYWluIHZhbHVlIGluc3RlYWQuCiYjNDM7CSAqLwomIzQzOwljc3MgPSBjZ3JwLSZndDtzdWJzeXNbc3NpZF07CiYjNDM7CWlmICghY3NzKSB7CiYjNDM7CQlicGZfcmN1X3JlYWRfdW5sb2NrKCk7CiYjNDM7CQlyZXR1cm4gMDsKJiM0MzsJfQomIzQzOwomIzQzOwlicGZfZm9yX2VhY2goYmxrZywgcG9zLCBjc3MpIHsKJiM0MzsJCWRldiA9IEJQRl9DT1JFX1JFQUQocG9zLCBxLCBkaXNrLCBwYXJ0MCwgYmRfZGV2KTsKJiM0MzsJCWlmIChkZXYgIT0gdGFyZ2V0X2RldikKJiM0MzsJCQljb250aW51ZTsKJiM0MzsKJiM0MzsJCW91dC0mZ3Q7ZGV2ID0gZGV2OwomIzQzOwkJb3V0LSZndDtyYnl0ZXMgPSBCUEZfQ09SRV9SRUFEKHBvcywgaW9zdGF0LmN1ci5ieXRlc1tCTEtHX0lPU1RBVF9SRUFEXSk7CiYjNDM7CQlvdXQtJmd0O3dieXRlcyA9IEJQRl9DT1JFX1JFQUQocG9zLCBpb3N0YXQuY3VyLmJ5dGVzW0JMS0dfSU9TVEFUX1dSSVRFXSk7CiYjNDM7CQlvdXQtJmd0O3Jpb3MgPSBCUEZfQ09SRV9SRUFEKHBvcywgaW9zdGF0LmN1ci5pb3NbQkxLR19JT1NUQVRfUkVBRF0pOwomIzQzOwkJb3V0LSZndDt3aW9zID0gQlBGX0NPUkVfUkVBRChwb3MsIGlvc3RhdC5jdXIuaW9zW0JMS0dfSU9TVEFUX1dSSVRFXSk7CiYjNDM7CQlvdXQtJmd0O2RieXRlcyA9IEJQRl9DT1JFX1JFQUQocG9zLCBpb3N0YXQuY3VyLmJ5dGVzW0JMS0dfSU9TVEFUX0RJU0NBUkRdKTsKJiM0MzsJCW91dC0mZ3Q7ZGlvcyA9IEJQRl9DT1JFX1JFQUQocG9zLCBpb3N0YXQuY3VyLmlvc1tCTEtHX0lPU1RBVF9ESVNDQVJEXSk7CiYjNDM7CQlicmVhazsKJiM0MzsJfQomIzQzOwlicGZfcmN1X3JlYWRfdW5sb2NrKCk7CiYjNDM7CXJldHVybiAxOwomIzQzO30KJiM0MzsKJiM0MztTRUMoJiMzNDtpdGVyLnMvY2dyb3VwJiMzNDspCiYjNDM7aW50IGNncm91cF9pb19xdWVyeShzdHJ1Y3QgYnBmX2l0ZXJfX2Nncm91cCAqY3R4KQomIzQzO3sKJiM0MzsJc3RydWN0IGNncm91cCAqY2dycCA9IGN0eC0mZ3Q7Y2dyb3VwOwomIzQzOwomIzQzOwlpZiAoIWNncnApCiYjNDM7CQlyZXR1cm4gMTsKJiM0MzsKJiM0MzsJLyogU3RhcnQgZnJlc2ggc28gYSBkZXZpY2UgdGhhdCBpcyBub3QgZm91bmQgc3RheXMgYWxsLXplcm8uICovCiYjNDM7CV9fYnVpbHRpbl9tZW1zZXQoJmFtcDtpb19xdWVyeSwgMCwgc2l6ZW9mKGlvX3F1ZXJ5KSk7CiYjNDM7CiYjNDM7CXJlYWRfdGFyZ2V0X2RldihjZ3JwLCAmYW1wO2lvX3F1ZXJ5KTsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOwomIzQzO1NFQygmIzM0O2l0ZXIucy9jZ3JvdXAmIzM0OykKJiM0MztpbnQgY2dyb3VwX3Jvb3RfaW9fcXVlcnkoc3RydWN0IGJwZl9pdGVyX19jZ3JvdXAgKmN0eCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBjZ3JvdXAgKnJvb3Q7CiYjNDM7CiYjNDM7CWlmICghY3R4LSZndDtjZ3JvdXApCiYjNDM7CQlyZXR1cm4gMTsKJiM0MzsKJiM0MzsJX19idWlsdGluX21lbXNldCgmYW1wO3Jvb3RfcXVlcnksIDAsIHNpemVvZihyb290X3F1ZXJ5KSk7CiYjNDM7CiYjNDM7CS8qIFRoZSByb290IGNncm91cCBhbHdheXMgaGFzIGlkIDEuICovCiYjNDM7CXJvb3QgPSBicGZfY2dyb3VwX2Zyb21faWQoMSk7CiYjNDM7CWlmICghcm9vdCkKJiM0MzsJCXJldHVybiAwOwomIzQzOwomIzQzOwkvKiBSb290IGNvdW50ZXJzIGluY2x1ZGUgYWxsIGNncm91cHMmIzM5OyBJL08uICovCiYjNDM7CWlmIChyZWFkX3RhcmdldF9kZXYocm9vdCwgJmFtcDtyb290X3F1ZXJ5KSkKJiM0MzsJCWdvdF9yb290X2NzcyA9IDE7CiYjNDM7CiYjNDM7CWJwZl9jZ3JvdXBfcmVsZWFzZShyb290KTsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yMy8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTcgMjI6MzU8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogOTY3MgoJCQkJCQkJb3V0cHV0OiAyNDQKCQkJCQkJCXRob3VnaHRzOiAxMzY5CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyB0aGUgQmxvY2sgQ2dyb3VwIEJQRiBLZnVuYyBQYXRjaCBmb3IgTWVtb3J5IFNhZmV0eSoqCgpPa2F5LCBzbyBJJiMzOTttIGxvb2tpbmcgYXQgdGhpcyBwYXRjaCBzZXJpZXMgdGhhdCBpbnRyb2R1Y2VzIEJQRiBrZnVuY3MgdG8gaXRlcmF0ZSBibG9jayBjZ3JvdXBzIChibGtjZykgYW5kIGZsdXNoIHRoZWlyIHN0YXRpc3RpY3MuIFRoZSBjb2RlIGludHJvZHVjZXMgZnVuY3Rpb25zIGxpa2UgYGJwZl9ibGtjZ19mbHVzaF9zdGF0c2AsIGBicGZfaXRlcl9ibGtnX25ld2AsIGBicGZfaXRlcl9ibGtnX25leHRgLCBhbmQgYGJwZl9pdGVyX2Jsa2dfZGVzdHJveWAuIE15IHByaW1hcnkgY29uY2VybiwgYXMgYWx3YXlzLCBpcyBtZW1vcnkgc2FmZXR5LCBzcGVjaWZpY2FsbHkgd2hldGhlciB0aGlzIHBhdGNoIGNvdWxkIGludHJvZHVjZSBhbnkgdW5pbml0aWFsaXplZCBtZW1vcnkgcmVhZHMgdGhhdCBLTVNBTiAoS2VybmVsIE1lbW9yeSBTYW5pdGl6ZXIpIG1pZ2h0IGZsYWcsIGJ1dCBLQVNBTiAoS2VybmVsIEFkZHJlc3MgU0FOaXRpemVyKSB3b3VsZG4mIzM5O3QuCgpMZXQmIzM5O3MgZGl2ZSBpbnRvIHRoZSBgYnBmX2l0ZXJfYmxrZ19uZXdgIGltcGxlbWVudGF0aW9uLiBUaGUgaXRlcmF0b3Igc3RhdGUgYGl0YCBjb21lcyBmcm9tIHRoZSBCUEYgaW5mcmFzdHJ1Y3R1cmUsIGFsbG9jYXRlZCBvbiB0aGUgQlBGIHN0YWNrLCBhbmQgaXMgaW5pdGlhbGl6ZWQgZWl0aGVyIGJ5IHRoZSB2ZXJpZmllci9CUEYgcnVudGltZSBvciB0aGlzIGBfbmV3YCBmdW5jdGlvbi4gSSBzZWUgYGtpdC0mZ3Q7cG9zYCBhbmQgYGtpdC0mZ3Q7YmxrY2dgIGFyZSBiZWluZyBpbml0aWFsaXplZCB3aXRoaW4gdGhpcyBmdW5jdGlvbi4gVGhlIHN0cnVjdCBgYnBmX2l0ZXJfYmxrZ2AgYW5kIGBicGZfaXRlcl9ibGtnX2tlcm5gIGFyZSBwcm9wZXJseSBzaXplZCwgYW5kIGBjc3NgIGlzIGNoZWNrZWQuIElmIGl0IGlzbiYjMzk7dCBhbiBpbyBjZ3JvdXAsIHRoZSBibGtjZyBpcyBOVUxMLiBPdGhlcndpc2UsIGBibGtjZ2AgaXMgc2V0LiBTbywgYm90aCBwb2ludGVycyBhcmUgYWx3YXlzIGluaXRpYWxpemVkIGVpdGhlciB0byBhIHZhbGlkIHZhbHVlIG9yIE5VTEwuCgpUaGUgYGJwZl9ibGtjZ19mbHVzaF9zdGF0c2AgZnVuY3Rpb24gc2VlbXMgdG8gYmUgY2FsbGluZyBgYmxrY2dfZmlsbF9yb290X2lvc3RhdHMoKWAgb3IgYGNzc19yc3RhdF9mbHVzaChjc3MpYC4gTmVpdGhlciBvZiB0aGVzZSBmdW5jdGlvbnMgYXJlIGRpcmVjdGx5IHNlbmRpbmcgbmV3IGRhdGEgc3RydWN0dXJlcyB0byB1c2VyIHNwYWNlIGluIGEgbWFubmVyIHRoYXQgY291bGQgbGVhayB1bmluaXRpYWxpemVkIG1lbW9yeS4gVGhlIHRlc3RzIGFyZSByZWFkaW5nIHJlc3VsdHMgdGhyb3VnaCBCUEYgbWFwcyBhbmQgZGF0YSBzZWN0aW9ucyB3aGljaCBpcyB0aGUgc3RhbmRhcmQgQlBGIHdheS4gVGhpcyBpcyBnb29kOyBub3RoaW5nIGlzIGJlaW5nIGV4cG9zZWQgZGlyZWN0bHkuCgpJJiMzOTttIGRvdWJsZS1jaGVja2luZyB0aGUgaW5pdGlhbGl6YXRpb24gaW4gYGJwZl9pdGVyX2Jsa2dfbmV3YC4gSWYgYGNzcy0mZ3Q7c3MgIT0gJmFtcDtpb19jZ3JwX3N1YnN5c2AsIGBraXQtJmd0O2Jsa2NnYCBpcyBzZXQgdG8gTlVMTCwgYW5kIGBraXQtJmd0O3Bvc2AgaXMgYWxyZWFkeSBOVUxMLiBPdGhlcndpc2UsIGlmIGl0ICppcyogYW4gaW8gY2dyb3VwLCBga2l0LSZndDtibGtjZ2AgaXMgc2V0LiBTbywgYm90aCBmaWVsZHMgYXJlIGluaXRpYWxpemVkIGluIGFsbCBzY2VuYXJpb3MuCgpJIGFsc28gc2VlIHRoYXQgYGJsa2NnX2ZpbGxfcm9vdF9pb3N0YXRzYCBpcyBub3cgbm9uLXN0YXRpYywgYW5kIGBicGZfYmxrY2dfZmx1c2hfc3RhdHNgIHVzZXMgYHJjdV9yZWFkX2xvY2tgIGFuZCBgY2dyb3VwX2Nzc2AsIHdoaWNoIGlzIG5vcm1hbCBmb3IgdGhpcyBraW5kIG9mIGNvZGUuCgpPa2F5LCBsZXQmIzM5O3MgbG9vayBhdCBgYnBmX2l0ZXJfYmxrZ19uZXh0YC4gSXQmIzM5O3Mgc3RyYWlnaHRmb3J3YXJkLiBJdCBkZXJlZmVyZW5jZXMgYGtpdC0mZ3Q7cG9zYCBhbmQgbW92ZXMgaXQgYWxvbmcgdGhlIGxpc3QsIGhhbmRsaW5nIG9mZmxpbmUgYmxrZ3MgZ3JhY2VmdWxseS4gVGhlIGl0ZXJhdG9yIGlzIGRlc2lnbmVkIHRvIHJldHVybiBOVUxMIGFmdGVyIGNvbXBsZXRpb24uIEl0IGFwcGVhcnMgdGhhdCB0aGVyZSBhcmUgbm8gdW5pbml0aWFsaXplZCB2YXJpYWJsZXMgYXQgYWxsIGFuZCBubyBtZW1vcnkgbGVha3MuCgpUaGVyZWZvcmUsIGdpdmVuIHRoZSBuYXR1cmUgb2YgdGhlIHBhdGNoLCBhbmQgZXNwZWNpYWxseSB0aGUgY29tcGxldGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIEJQRiBpdGVyYXRvciBzdGF0ZSwgSSYjMzk7bSBjb25jbHVkaW5nIHRoYXQgdGhpcyBwYXRjaCBkb2VzbiYjMzk7dCBpbnRyb2R1Y2UgYW55IHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJpc2tzIHRoYXQgS01TQU4gd291bGQgY2F0Y2ggYnV0IEtBU0FOIHdvdWxkbiYjMzk7dC4gVGhlIEJQRiBwcm9ncmFtIHJlYWRzIHRoZSBkYXRhIHVzaW5nIGBCUEZfQ09SRV9SRUFEYCwgYW5kIHRoZXJlIGFyZSBubyBuZXcgc3RydWN0dXJlcyBjb3BpZWQgdG8gdXNlcnNwYWNlIHVzaW5nIGBjb3B5X3RvX3VzZXJgLiBJJiMzOTttIGNvbmZpZGVudCB0aGF0IHN0YW5kYXJkIEtBU0FOIGFuZCB0aGUgQlBGIHZlcmlmaWVyIGFyZSBlbm91Z2ggdG8gY2F0Y2ggYW55IGJ1Z3MgaW4gdGhpcyBwYXRjaC4gVGhlcmVmb3JlLCBJJiMzOTttIHNldHRpbmcgYE5lZWRzS01TQU49ZmFsc2VgLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI0LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xNyAyMjozNTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnNldC1yZXN1bHRzPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtLTVNBTlJlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBzZXJpZXMgaW50cm9kdWNlcyBCUEYga2Z1bmNzIGZvciBibG9jayBjZ3JvdXAgKGJsa2NnKSBpdGVyYXRpb24gYW5kIHN0YXRpc3RpY3MgZmx1c2hpbmcgKGBicGZfYmxrY2dfZmx1c2hfc3RhdHNgLCBgYnBmX2l0ZXJfYmxrZ19uZXdgLCBgYnBmX2l0ZXJfYmxrZ19uZXh0YCwgYGJwZl9pdGVyX2Jsa2dfZGVzdHJveWApLiBUaGUgaXRlcmF0b3Igc3RhdGUgKGBzdHJ1Y3QgYnBmX2l0ZXJfYmxrZ19rZXJuYCkgaXMgZnVsbHkgaW5pdGlhbGl6ZWQgaW4gYGJwZl9pdGVyX2Jsa2dfbmV3YCBiZWZvcmUgYmVpbmcgdXNlZCBpbiBzdWJzZXF1ZW50IGNhbGxzLiBUaGVyZSBhcmUgbm8gbmV3IGtlcm5lbCBzdHJ1Y3R1cmVzIGNvcGllZCB0byB1c2VyIHNwYWNlIChlLmcuLCB2aWEgYGNvcHlfdG9fdXNlcmAgb3IgbmV0bGluayksIG5vciBhcmUgdGhlcmUgYW55IGNvbXBsZXggYWxsb2NhdGlvbnMgd2hlcmUgdW5pbml0aWFsaXplZCBmaWVsZHMgY291bGQgYmUgbGVha2VkIG9yIHVzZWQgaW4gY29udHJvbCBmbG93LiBUaGUgY2hhbmdlcyBwcmltYXJpbHkgaW52b2x2ZSBwb2ludGVyIHRyYXZlcnNhbCBhbmQgQlBGLWFjY2Vzc2libGUgcmVhZHMgb2YgZXhpc3RpbmcgaW5pdGlhbGl6ZWQgY2dyb3VwIHN0cnVjdHVyZXMuIEFueSBwb3RlbnRpYWwgbWVtb3J5IHNhZmV0eSBpc3N1ZXMsIHN1Y2ggYXMgb3V0LW9mLWJvdW5kcyBhY2Nlc3NlcyBvciB1c2UtYWZ0ZXItZnJlZSBidWdzIGR1cmluZyBpdGVyYXRpb24sIHdvdWxkIGJlIGVmZmVjdGl2ZWx5IGNhdWdodCBieSBLQVNBTiBhbmQgdGhlIEJQRiB2ZXJpZmllci4gVGhlcmVmb3JlLCBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaXMgbm90IHJlcXVpcmVkLiYjMzQ7LAogICYjMzQ7TmVlZHNLTVNBTiYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggc2VyaWVzIGludHJvZHVjZXMgQlBGIGtmdW5jcyBmb3IgYmxvY2sgY2dyb3VwIChibGtjZykgaXRlcmF0aW9uIGFuZCBzdGF0aXN0aWNzIGZsdXNoaW5nIChgYnBmX2Jsa2NnX2ZsdXNoX3N0YXRzYCwgYGJwZl9pdGVyX2Jsa2dfbmV3YCwgYGJwZl9pdGVyX2Jsa2dfbmV4dGAsIGBicGZfaXRlcl9ibGtnX2Rlc3Ryb3lgKS4gVGhlIGl0ZXJhdG9yIHN0YXRlIChgc3RydWN0IGJwZl9pdGVyX2Jsa2dfa2VybmApIGlzIGZ1bGx5IGluaXRpYWxpemVkIGluIGBicGZfaXRlcl9ibGtnX25ld2AgYmVmb3JlIGJlaW5nIHVzZWQgaW4gc3Vic2VxdWVudCBjYWxscy4gVGhlcmUgYXJlIG5vIG5ldyBrZXJuZWwgc3RydWN0dXJlcyBjb3BpZWQgdG8gdXNlciBzcGFjZSAoZS5nLiwgdmlhIGBjb3B5X3RvX3VzZXJgIG9yIG5ldGxpbmspLCBub3IgYXJlIHRoZXJlIGFueSBjb21wbGV4IGFsbG9jYXRpb25zIHdoZXJlIHVuaW5pdGlhbGl6ZWQgZmllbGRzIGNvdWxkIGJlIGxlYWtlZCBvciB1c2VkIGluIGNvbnRyb2wgZmxvdy4gVGhlIGNoYW5nZXMgcHJpbWFyaWx5IGludm9sdmUgcG9pbnRlciB0cmF2ZXJzYWwgYW5kIEJQRi1hY2Nlc3NpYmxlIHJlYWRzIG9mIGV4aXN0aW5nIGluaXRpYWxpemVkIGNncm91cCBzdHJ1Y3R1cmVzLiBBbnkgcG90ZW50aWFsIG1lbW9yeSBzYWZldHkgaXNzdWVzLCBzdWNoIGFzIG91dC1vZi1ib3VuZHMgYWNjZXNzZXMgb3IgdXNlLWFmdGVyLWZyZWUgYnVncyBkdXJpbmcgaXRlcmF0aW9uLCB3b3VsZCBiZSBlZmZlY3RpdmVseSBjYXVnaHQgYnkgS0FTQU4gYW5kIHRoZSBCUEYgdmVyaWZpZXIuIFRoZXJlZm9yZSwgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGlzIG5vdCByZXF1aXJlZC4mIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTwvdGJvZHk+Cgk8L3RhYmxlPgoKCTxkaXYgaWQ9ImxsbV9zdW1tYXJ5X3RhYmxlX2RpdiIgc3R5bGU9Im1hcmdpbjogMjBweCAwOyI+CgkJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQkJPGNhcHRpb24+TExNIENhbGxzIFN1bW1hcnk6PC9jYXB0aW9uPgoJCQk8dGhlYWQ+CgkJCQk8dHI+CgkJCQkJPHRoPlRvdGFsIENhbGxzPC90aD4KCQkJCQk8dGg+VG90YWwgVG9rZW5zPC90aD4KCQkJCQk8dGg+QXZnIFRva2VuczwvdGg+CgkJCQkJPHRoPlRvdGFsIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQkJPHRoPkF2ZyBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJPC90cj4KCQkJPC90aGVhZD4KCQkJPHRib2R5IGlkPSJsbG1fc3VtbWFyeV9zdGF0c19ib2R5Ij48L3Rib2R5PgoJCTwvdGFibGU+Cgk8L2Rpdj4KCgk8ZGl2IGlkPSJ0b29sX3N1bW1hcnlfdGFibGVfZGl2IiBzdHlsZT0ibWFyZ2luOiAyMHB4IDA7Ij4KCQk8dGFibGUgY2xhc3M9Imxpc3RfdGFibGUiPgoJCQk8Y2FwdGlvbj5Ub29sIENhbGxzIFN1bW1hcnk6PC9jYXB0aW9uPgoJCQk8dGhlYWQ+CgkJCQk8dHI+CgkJCQkJPHRoPlRvdGFsIENhbGxzPC90aD4KCQkJCQk8dGg+VG90YWwgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCQk8dGg+QXZnIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQk8L3RyPgoJCQk8L3RoZWFkPgoJCQk8dGJvZHkgaWQ9InRvb2xfc3VtbWFyeV9zdGF0c19ib2R5Ij48L3Rib2R5PgoJCTwvdGFibGU+Cgk8L2Rpdj4KCgk8ZGl2IGlkPSJkdXJhdGlvbl9jaGFydF9kaXYiIHN0eWxlPSJ3aWR0aDogMTAwJTsgbWFyZ2luOiAyMHB4IDA7IGJvcmRlcjogMXB4OyI+PC9kaXY+Cgk8ZGl2IGlkPSJ0b2tlbl9jaGFydF9kaXYiIHN0eWxlPSJ3aWR0aDogMTAwJTsgbWFyZ2luOiAyMHB4IDA7IGJvcmRlcjogMXB4OyI+PC9kaXY+CgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS9qc2FwaSI+PC9zY3JpcHQ+Cgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CgkJZ29vZ2xlLmxvYWQoInZpc3VhbGl6YXRpb24iLCAiMSIsIHtwYWNrYWdlczpbImNvcmVjaGFydCJdfSk7CgkJZ29vZ2xlLnNldE9uTG9hZENhbGxiYWNrKGRyYXdDaGFydHMpOwoKCQlmdW5jdGlvbiBkcmF3Q2hhcnRzKCkgewoJCQljb25zdCByYXdEYXRhID0gW3siU3RhcnRlZCI6IjIwMjYtMDgtMTdUMjI6MzQ6MzQuNDM4ODQzODk3WiIsIlNlcSI6MCwiTmVzdGluZyI6MCwiVHlwZSI6ImZsb3ciLCJOYW1lIjoicGF0Y2gtdHJpYWdlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NjU5NzI1MDMwNDYsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiQkxLX0NHUk9VUFwiLFxuICAgIFwiQlBGX1NZU0NBTExcIixcbiAgICBcIkNHUk9VUFNcIixcbiAgICBcIkJMT0NLXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwiYnBmX2Jsa2NnX2ZsdXNoX3N0YXRzXCIsXG4gICAgXCJicGZfaXRlcl9ibGtnX25ld1wiLFxuICAgIFwiYnBmX2l0ZXJfYmxrZ19uZXh0XCIsXG4gICAgXCJicGZfaXRlcl9ibGtnX2Rlc3Ryb3lcIixcbiAgICBcImJsa2NnX2ZpbGxfcm9vdF9pb3N0YXRzXCJcbiAgXSxcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBzZXJpZXMgaW50cm9kdWNlcyBCUEYga2Z1bmNzIGZvciBibG9jayBjZ3JvdXAgKGJsa2NnKSBpdGVyYXRpb24gYW5kIHN0YXRpc3RpY3MgZmx1c2hpbmcgKGBicGZfYmxrY2dfZmx1c2hfc3RhdHNgLCBgYnBmX2l0ZXJfYmxrZ19uZXdgLCBgYnBmX2l0ZXJfYmxrZ19uZXh0YCwgYGJwZl9pdGVyX2Jsa2dfZGVzdHJveWApLiBUaGUgaXRlcmF0b3Igc3RhdGUgKGBzdHJ1Y3QgYnBmX2l0ZXJfYmxrZ19rZXJuYCkgaXMgZnVsbHkgaW5pdGlhbGl6ZWQgaW4gYGJwZl9pdGVyX2Jsa2dfbmV3YCBiZWZvcmUgYmVpbmcgdXNlZCBpbiBzdWJzZXF1ZW50IGNhbGxzLiBUaGVyZSBhcmUgbm8gbmV3IGtlcm5lbCBzdHJ1Y3R1cmVzIGNvcGllZCB0byB1c2VyIHNwYWNlIChlLmcuLCB2aWEgYGNvcHlfdG9fdXNlcmAgb3IgbmV0bGluayksIG5vciBhcmUgdGhlcmUgYW55IGNvbXBsZXggYWxsb2NhdGlvbnMgd2hlcmUgdW5pbml0aWFsaXplZCBmaWVsZHMgY291bGQgYmUgbGVha2VkIG9yIHVzZWQgaW4gY29udHJvbCBmbG93LiBUaGUgY2hhbmdlcyBwcmltYXJpbHkgaW52b2x2ZSBwb2ludGVyIHRyYXZlcnNhbCBhbmQgQlBGLWFjY2Vzc2libGUgcmVhZHMgb2YgZXhpc3RpbmcgaW5pdGlhbGl6ZWQgY2dyb3VwIHN0cnVjdHVyZXMuIEFueSBwb3RlbnRpYWwgbWVtb3J5IHNhZmV0eSBpc3N1ZXMsIHN1Y2ggYXMgb3V0LW9mLWJvdW5kcyBhY2Nlc3NlcyBvciB1c2UtYWZ0ZXItZnJlZSBidWdzIGR1cmluZyBpdGVyYXRpb24sIHdvdWxkIGJlIGVmZmVjdGl2ZWx5IGNhdWdodCBieSBLQVNBTiBhbmQgdGhlIEJQRiB2ZXJpZmllci4gVGhlcmVmb3JlLCBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaXMgbm90IHJlcXVpcmVkLlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2UsXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGludHJvZHVjZXMgbmV3IEJQRiBrZnVuY3MgZm9yIGJsb2NrIGNncm91cCBJL08gc3RhdGlzdGljcywgd2hpY2ggYXJlIHJlYWNoYWJsZSBmcm9tIEJQRiBwcm9ncmFtcy4gVGhlc2UgZnVuY3Rpb25zIGFsbG93IEJQRiBwcm9ncmFtcyB0byBmbHVzaCBibG9jayBjZ3JvdXAgc3RhdHMgYW5kIGl0ZXJhdGUgb3ZlciBwZXItZGV2aWNlIGJsa2dzLiBUaGUgY2hhbmdlcyBhcmUgZnVuY3Rpb25hbGx5IHNpZ25pZmljYW50IGFuZCBzaG91bGQgYmUgZnV6emVkLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xN1QyMjozNDozNC40Mzg4NTAwNzdaIiwiU2VxIjoxLCJOZXN0aW5nIjoxLCJUeXBlIjoiYWN0aW9uIiwiTmFtZSI6InJlYWQtcGF0Y2gtZGlmZiIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjEzMzAyOTI1MTksIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIlBhdGNoRGlmZlwiOiBcImNvbW1pdCA3NzMwMDM2M2ZlOWM1YjBhZmMzNmQ5Zjc0ZWFkYjQxYmE2ZGQ1M2E1XFxuQXV0aG9yOiBzeXotY2x1c3RlciBcXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cXHUwMDNlXFxuRGF0ZTogICBNb24gQXVnIDE3IDIyOjM0OjMyIDIwMjYgKzAwMDBcXG5cXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XFxuXFxuZGlmZiAtLWdpdCBhL01BSU5UQUlORVJTIGIvTUFJTlRBSU5FUlNcXG5pbmRleCAyZjk0NzJjMWEwOTA3Li44N2M1NmU5NTU1NzcxIDEwMDY0NFxcbi0tLSBhL01BSU5UQUlORVJTXFxuKysrIGIvTUFJTlRBSU5FUlNcXG5AQCAtNjYxNyw2ICs2NjE3LDcgQEAgRjpcXHRibG9jay9ibGstY2dyb3VwLmNcXG4gRjpcXHRibG9jay9ibGstaW9jb3N0LmNcXG4gRjpcXHRibG9jay9ibGstaW9sYXRlbmN5LmNcXG4gRjpcXHRibG9jay9ibGstdGhyb3R0bGUuY1xcbitGOlxcdGJsb2NrL2JwZl9ibGtjZy5jXFxuIEY6XFx0aW5jbHVkZS9saW51eC9ibGstY2dyb3VwLmhcXG4gXFxuIENPTlRST0wgR1JPVVAgLSBDUFVTRVRcXG5kaWZmIC0tZ2l0IGEvYmxvY2svTWFrZWZpbGUgYi9ibG9jay9NYWtlZmlsZVxcbmluZGV4IGU3YmQzMjBlM2Q2OTcuLjU3MmU0OTk4OGM4ZWUgMTAwNjQ0XFxuLS0tIGEvYmxvY2svTWFrZWZpbGVcXG4rKysgYi9ibG9jay9NYWtlZmlsZVxcbkBAIC0xNyw2ICsxNyw5IEBAIG9iai0kKENPTkZJR19CTEtfRVJST1JfSU5KRUNUSU9OKSArPSBlcnJvci1pbmplY3Rpb24ub1xcbiBvYmotJChDT05GSUdfQkxLX0RFVl9CU0dfQ09NTU9OKSArPSBic2cub1xcbiBvYmotJChDT05GSUdfQkxLX0RFVl9CU0dMSUIpXFx0Kz0gYnNnLWxpYi5vXFxuIG9iai0kKENPTkZJR19CTEtfQ0dST1VQKVxcdCs9IGJsay1jZ3JvdXAub1xcbitpZmRlZiBDT05GSUdfQlBGX1NZU0NBTExcXG4rb2JqLSQoQ09ORklHX0JMS19DR1JPVVApXFx0Kz0gYnBmX2Jsa2NnLm9cXG4rZW5kaWZcXG4gb2JqLSQoQ09ORklHX0JMS19DR1JPVVBfUldTVEFUKVxcdCs9IGJsay1jZ3JvdXAtcndzdGF0Lm9cXG4gb2JqLSQoQ09ORklHX0JMS19DR1JPVVBfRkNfQVBQSUQpICs9IGJsay1jZ3JvdXAtZmMtYXBwaWQub1xcbiBvYmotJChDT05GSUdfQkxLX0RFVl9USFJPVFRMSU5HKVxcdCs9IGJsay10aHJvdHRsZS5vXFxuZGlmZiAtLWdpdCBhL2Jsb2NrL2Jsay1jZ3JvdXAuYyBiL2Jsb2NrL2Jsay1jZ3JvdXAuY1xcbmluZGV4IGQ5Njc2MTI2YzViNWQuLjhkNTM4YWQ0ZTg2MWMgMTAwNjQ0XFxuLS0tIGEvYmxvY2svYmxrLWNncm91cC5jXFxuKysrIGIvYmxvY2svYmxrLWNncm91cC5jXFxuQEAgLTEwODYsNyArMTA4Niw3IEBAIHN0YXRpYyB2b2lkIGJsa2NnX3JzdGF0X2ZsdXNoKHN0cnVjdCBjZ3JvdXBfc3Vic3lzX3N0YXRlICpjc3MsIGludCBjcHUpXFxuICAqIGZsdXNoaW5nIHRoZSByb290IGNncm91cCdzIHN0YXRzIGJ5IGV4cGxpY2l0bHkgZmlsbGluZyBpbiB0aGUgaW9zdGF0XFxuICAqIHdpdGggZGlzayBsZXZlbCBzdGF0aXN0aWNzLlxcbiAgKi9cXG4tc3RhdGljIHZvaWQgYmxrY2dfZmlsbF9yb290X2lvc3RhdHModm9pZClcXG4rdm9pZCBibGtjZ19maWxsX3Jvb3RfaW9zdGF0cyh2b2lkKVxcbiB7XFxuIFxcdHN0cnVjdCBjbGFzc19kZXZfaXRlciBpdGVyO1xcbiBcXHRzdHJ1Y3QgZGV2aWNlICpkZXY7XFxuZGlmZiAtLWdpdCBhL2Jsb2NrL2Jsay1jZ3JvdXAuaCBiL2Jsb2NrL2Jsay1jZ3JvdXAuaFxcbmluZGV4IDYxNTM5MGY3NTFhYTIuLjhjOWMyYTFhZGZhYTQgMTAwNjQ0XFxuLS0tIGEvYmxvY2svYmxrLWNncm91cC5oXFxuKysrIGIvYmxvY2svYmxrLWNncm91cC5oXFxuQEAgLTIwNSw2ICsyMDUsNyBAQCB2b2lkIGJsa2NnX2RlYWN0aXZhdGVfcG9saWN5KHN0cnVjdCBnZW5kaXNrICpkaXNrLFxcbiBcXHRcXHRcXHQgICAgIGNvbnN0IHN0cnVjdCBibGtjZ19wb2xpY3kgKnBvbCk7XFxuIFxcbiBjb25zdCBjaGFyICpibGtnX2Rldl9uYW1lKHN0cnVjdCBibGtjZ19ncSAqYmxrZyk7XFxuK3ZvaWQgYmxrY2dfZmlsbF9yb290X2lvc3RhdHModm9pZCk7XFxuIHZvaWQgYmxrY2dfcHJpbnRfYmxrZ3Moc3RydWN0IHNlcV9maWxlICpzZiwgc3RydWN0IGJsa2NnICpibGtjZyxcXG4gXFx0XFx0ICAgICAgIHU2NCAoKnByZmlsbCkoc3RydWN0IHNlcV9maWxlICosXFxuIFxcdFxcdFxcdFxcdCAgICAgc3RydWN0IGJsa2dfcG9saWN5X2RhdGEgKiwgaW50KSxcXG5kaWZmIC0tZ2l0IGEvYmxvY2svYnBmX2Jsa2NnLmMgYi9ibG9jay9icGZfYmxrY2cuY1xcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uMjVjODA5ZjUwOTFjMlxcbi0tLSAvZGV2L251bGxcXG4rKysgYi9ibG9jay9icGZfYmxrY2cuY1xcbkBAIC0wLDAgKzEsMTU0IEBAXFxuKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9yLWxhdGVyXFxuKy8qXFxuKyAqIEJsb2NrIEkvTyBDb250cm9sbGVyLXJlbGF0ZWQgQlBGIGtmdW5jcyBhbmQgYXV4aWxpYXJ5IGNvZGVcXG4rICovXFxuK1xcbisjaW5jbHVkZSBcXFwiYmxrLWNncm91cC5oXFxcIlxcbitcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2JwZi5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvYnRmX2lkcy5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvcmN1bGlzdC5oXFx1MDAzZVxcbitcXG4rX19icGZfa2Z1bmNfc3RhcnRfZGVmcygpO1xcbitcXG4rLyoqXFxuKyAqIGJwZl9ibGtjZ19mbHVzaF9zdGF0cyAtIEZsdXNoIGEgYmxvY2sgY2dyb3VwJ3MgaW8gc3RhdGlzdGljc1xcbisgKiBAY2dycDogY2dyb3VwIHRvIGZsdXNoXFxuKyAqXFxuKyAqIFByb3BhZ2F0ZSBJL08gc3RhdGlzdGljcyB1cCB0aGUgY2dyb3VwIHRyZWUuIFJvb3Qgc3RhdGlzdGljcyBjb21lIGZyb21cXG4rICogYmxvY2sgZGV2aWNlcyBhbmQgaW5jbHVkZSBhbGwgY2dyb3VwcycgSS9PLlxcbisgKi9cXG4rX19icGZfa2Z1bmMgdm9pZCBicGZfYmxrY2dfZmx1c2hfc3RhdHMoc3RydWN0IGNncm91cCAqY2dycClcXG4re1xcbitcXHRzdHJ1Y3QgY2dyb3VwX3N1YnN5c19zdGF0ZSAqY3NzO1xcbitcXG4rXFx0LyogUGluIHRoZSBjc3MgZm9yIHRoZSBzbGVlcGFibGUgZmx1c2guICovXFxuK1xcdHJjdV9yZWFkX2xvY2soKTtcXG4rXFx0Y3NzID0gY2dyb3VwX2NzcyhjZ3JwLCBcXHUwMDI2aW9fY2dycF9zdWJzeXMpO1xcbitcXHRpZiAoY3NzIFxcdTAwMjZcXHUwMDI2ICFjc3NfdHJ5Z2V0KGNzcykpXFxuK1xcdFxcdGNzcyA9IE5VTEw7XFxuK1xcdHJjdV9yZWFkX3VubG9jaygpO1xcbitcXG4rXFx0aWYgKCFjc3MpXFxuK1xcdFxcdHJldHVybjtcXG4rXFxuK1xcdGlmICghY3NzLVxcdTAwM2VwYXJlbnQpXFxuK1xcdFxcdGJsa2NnX2ZpbGxfcm9vdF9pb3N0YXRzKCk7XFxuK1xcdGVsc2VcXG4rXFx0XFx0Y3NzX3JzdGF0X2ZsdXNoKGNzcyk7XFxuK1xcbitcXHRjc3NfcHV0KGNzcyk7XFxuK31cXG4rXFxuK3N0cnVjdCBicGZfaXRlcl9ibGtnIHtcXG4rXFx0X191NjQgX19vcGFxdWVbMl07XFxuK30gX19hbGlnbmVkKDgpO1xcbitcXG4rc3RydWN0IGJwZl9pdGVyX2Jsa2dfa2VybiB7XFxuK1xcdHN0cnVjdCBibGtjZyAqYmxrY2c7XFxuK1xcdHN0cnVjdCBibGtjZ19ncSAqcG9zO1xcbit9IF9fYWxpZ25lZCg4KTtcXG4rXFxuKy8qKlxcbisgKiBicGZfaXRlcl9ibGtnX25ldyAtIFN0YXJ0IGl0ZXJhdGluZyBhIGJsb2NrIGNncm91cCdzIHBlci1kZXZpY2UgYmxrZ3NcXG4rICogQGl0OiBpdGVyYXRvciB0byBpbml0aWFsaXplXFxuKyAqIEBjc3M6IHRoZSBpbyBjb250cm9sbGVyJ3MgY3NzXFxuKyAqXFxuKyAqIEVhY2ggYmxrZyBob2xkcyBvbmUgZGV2aWNlJ3MgaW8uc3RhdCBjb3VudGVycy4gT2ZmbGluZSBibGtncyBhcmUgc2tpcHBlZC5cXG4rICogQSBibGtnIHdpdGhvdXQgYSBkaXNrIGNhbiBiZSByZXR1cm5lZC4gTXVzdCBydW4gdW5kZXIgUkNVLlxcbisgKlxcbisgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgLUVJTlZBTCBpZiBAY3NzIGlzIG5vdCB0aGUgaW8gY29udHJvbGxlcidzLlxcbisgKi9cXG4rX19icGZfa2Z1bmMgaW50IGJwZl9pdGVyX2Jsa2dfbmV3KHN0cnVjdCBicGZfaXRlcl9ibGtnICppdCxcXG4rXFx0XFx0XFx0XFx0ICBzdHJ1Y3QgY2dyb3VwX3N1YnN5c19zdGF0ZSAqY3NzKVxcbit7XFxuK1xcdHN0cnVjdCBicGZfaXRlcl9ibGtnX2tlcm4gKmtpdCA9ICh2b2lkICopaXQ7XFxuK1xcbitcXHRCVUlMRF9CVUdfT04oc2l6ZW9mKHN0cnVjdCBicGZfaXRlcl9ibGtnX2tlcm4pIFxcdTAwM2Ugc2l6ZW9mKHN0cnVjdCBicGZfaXRlcl9ibGtnKSk7XFxuK1xcdEJVSUxEX0JVR19PTihfX2FsaWdub2ZfXyhzdHJ1Y3QgYnBmX2l0ZXJfYmxrZ19rZXJuKSAhPVxcbitcXHRcXHQgICAgIF9fYWxpZ25vZl9fKHN0cnVjdCBicGZfaXRlcl9ibGtnKSk7XFxuK1xcbitcXHRraXQtXFx1MDAzZXBvcyA9IE5VTEw7XFxuK1xcbitcXHRpZiAoY3NzLVxcdTAwM2VzcyAhPSBcXHUwMDI2aW9fY2dycF9zdWJzeXMpIHtcXG4rXFx0XFx0a2l0LVxcdTAwM2VibGtjZyA9IE5VTEw7XFxuK1xcdFxcdHJldHVybiAtRUlOVkFMO1xcbitcXHR9XFxuK1xcbitcXHRraXQtXFx1MDAzZWJsa2NnID0gY3NzX3RvX2Jsa2NnKGNzcyk7XFxuK1xcdHJldHVybiAwO1xcbit9XFxuK1xcbisvKipcXG4rICogYnBmX2l0ZXJfYmxrZ19uZXh0IC0gUmV0dXJuIHRoZSBuZXh0IG9ubGluZSBibGtnIG9mIHRoZSBpdGVyYXRlZCBibG9jayBjZ3JvdXBcXG4rICogQGl0OiBpdGVyYXRvclxcbisgKlxcbisgKiBSZXR1cm46IHRoZSBuZXh0IG9ubGluZSBibGtnLCBvciBOVUxMIHdoZW4gdGhlIHdhbGsgaXMgZG9uZS5cXG4rICovXFxuK19fYnBmX2tmdW5jIHN0cnVjdCBibGtjZ19ncSAqYnBmX2l0ZXJfYmxrZ19uZXh0KHN0cnVjdCBicGZfaXRlcl9ibGtnICppdClcXG4re1xcbitcXHRzdHJ1Y3QgYnBmX2l0ZXJfYmxrZ19rZXJuICpraXQgPSAodm9pZCAqKWl0O1xcbitcXHRzdHJ1Y3QgYmxrY2dfZ3EgKmJsa2cgPSBraXQtXFx1MDAzZXBvcztcXG4rXFx0c3RydWN0IGhsaXN0X25vZGUgKm5vZGU7XFxuK1xcbitcXHRpZiAoIWtpdC1cXHUwMDNlYmxrY2cpXFxuK1xcdFxcdHJldHVybiBOVUxMO1xcbitcXG4rXFx0aWYgKCFibGtnKVxcbitcXHRcXHRub2RlID0gcmN1X2RlcmVmZXJlbmNlKGhsaXN0X2ZpcnN0X3JjdShcXHUwMDI2a2l0LVxcdTAwM2VibGtjZy1cXHUwMDNlYmxrZ19saXN0KSk7XFxuK1xcdGVsc2VcXG4rXFx0XFx0bm9kZSA9IHJjdV9kZXJlZmVyZW5jZShobGlzdF9uZXh0X3JjdShcXHUwMDI2YmxrZy1cXHUwMDNlYmxrY2dfbm9kZSkpO1xcbitcXG4rXFx0LyogU2tpcCBvZmZsaW5lIGJsa2dzLCBtYXRjaGluZyBpby5zdGF0LiAqL1xcbitcXHR3aGlsZSAobm9kZSkge1xcbitcXHRcXHRibGtnID0gaGxpc3RfZW50cnkobm9kZSwgc3RydWN0IGJsa2NnX2dxLCBibGtjZ19ub2RlKTtcXG4rXFx0XFx0LyogQSByYWNlIG9ubHkgY2hhbmdlcyB3aGV0aGVyIHRoaXMgYmxrZyBpcyByZXR1cm5lZC4gKi9cXG4rXFx0XFx0aWYgKGRhdGFfcmFjZShibGtnLVxcdTAwM2VvbmxpbmUpKSB7XFxuK1xcdFxcdFxcdGtpdC1cXHUwMDNlcG9zID0gYmxrZztcXG4rXFx0XFx0XFx0cmV0dXJuIGJsa2c7XFxuK1xcdFxcdH1cXG4rXFx0XFx0bm9kZSA9IHJjdV9kZXJlZmVyZW5jZShobGlzdF9uZXh0X3JjdShcXHUwMDI2YmxrZy1cXHUwMDNlYmxrY2dfbm9kZSkpO1xcbitcXHR9XFxuK1xcbitcXHQvKiBUaGUgaXRlcmF0b3IgbXVzdCBrZWVwIHJldHVybmluZyBOVUxMIGFmdGVyIGNvbXBsZXRpb24uICovXFxuK1xcdGtpdC1cXHUwMDNlcG9zID0gTlVMTDtcXG4rXFx0a2l0LVxcdTAwM2VibGtjZyA9IE5VTEw7XFxuK1xcdHJldHVybiBOVUxMO1xcbit9XFxuK1xcbisvKipcXG4rICogYnBmX2l0ZXJfYmxrZ19kZXN0cm95IC0gVGVhciBkb3duIGEgYmxrZyBpdGVyYXRvclxcbisgKiBAaXQ6IGl0ZXJhdG9yXFxuKyAqL1xcbitfX2JwZl9rZnVuYyB2b2lkIGJwZl9pdGVyX2Jsa2dfZGVzdHJveShzdHJ1Y3QgYnBmX2l0ZXJfYmxrZyAqaXQpXFxuK3tcXG4rfVxcbitcXG4rX19icGZfa2Z1bmNfZW5kX2RlZnMoKTtcXG4rXFxuK0JURl9LRlVOQ1NfU1RBUlQoYnBmX2Jsa2NnX2tmdW5jcylcXG4rQlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9ibGtjZ19mbHVzaF9zdGF0cywgS0ZfU0xFRVBBQkxFKVxcbitcXG4rQlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9pdGVyX2Jsa2dfbmV3LFxcbitcXHQgICAgIEtGX0lURVJfTkVXIHwgS0ZfUkNVIHwgS0ZfUkNVX1BST1RFQ1RFRClcXG4rQlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9pdGVyX2Jsa2dfbmV4dCwgS0ZfSVRFUl9ORVhUIHwgS0ZfUkVUX05VTEwpXFxuK0JURl9JRF9GTEFHUyhmdW5jLCBicGZfaXRlcl9ibGtnX2Rlc3Ryb3ksIEtGX0lURVJfREVTVFJPWSlcXG4rQlRGX0tGVU5DU19FTkQoYnBmX2Jsa2NnX2tmdW5jcylcXG4rXFxuK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYnRmX2tmdW5jX2lkX3NldCBicGZfYmxrY2dfa2Z1bmNfc2V0ID0ge1xcbitcXHQub3duZXJcXHRcXHQ9IFRISVNfTU9EVUxFLFxcbitcXHQuc2V0XFx0XFx0PSBcXHUwMDI2YnBmX2Jsa2NnX2tmdW5jcyxcXG4rfTtcXG4rXFxuK3N0YXRpYyBpbnQgX19pbml0IGJwZl9ibGtjZ19pbml0KHZvaWQpXFxuK3tcXG4rXFx0aW50IGVycjtcXG4rXFxuK1xcdGVyciA9IHJlZ2lzdGVyX2J0Zl9rZnVuY19pZF9zZXQoQlBGX1BST0dfVFlQRV9VTlNQRUMsXFxuK1xcdFxcdFxcdFxcdFxcdFxcdTAwMjZicGZfYmxrY2dfa2Z1bmNfc2V0KTtcXG4rXFx0aWYgKGVycilcXG4rXFx0XFx0cHJfd2FybihcXFwiZXJyb3Igd2hpbGUgcmVnaXN0ZXJpbmcgYnBmIGJsa2NnIGtmdW5jczogJWRcXFxcblxcXCIsIGVycik7XFxuK1xcbitcXHRyZXR1cm4gZXJyO1xcbit9XFxuK2xhdGVfaW5pdGNhbGwoYnBmX2Jsa2NnX2luaXQpO1xcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvY2dyb3VwX2l0ZXJfaW8uaCBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9jZ3JvdXBfaXRlcl9pby5oXFxubmV3IGZpbGUgbW9kZSAxMDA2NDRcXG5pbmRleCAwMDAwMDAwMDAwMDAwLi5mNGJiYWFjY2RmNzE2XFxuLS0tIC9kZXYvbnVsbFxcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9jZ3JvdXBfaXRlcl9pby5oXFxuQEAgLTAsMCArMSwxNyBAQFxcbisvKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMCAqL1xcbisvKiBDb3B5cmlnaHQgKGMpIDIwMjUgTWV0YSBQbGF0Zm9ybXMsIEluYy4gYW5kIGFmZmlsaWF0ZXMuICovXFxuKyNpZm5kZWYgX19DR1JPVVBfSVRFUl9JT19IXFxuKyNkZWZpbmUgX19DR1JPVVBfSVRFUl9JT19IXFxuK1xcbitzdHJ1Y3QgaW9fcXVlcnkge1xcbitcXHQvKiBvbmUgZGV2aWNlJ3MgaW8uc3RhdCBjb3VudGVycyAqL1xcbitcXHRfX3U2NCByYnl0ZXM7XFxuK1xcdF9fdTY0IHdieXRlcztcXG4rXFx0X191NjQgcmlvcztcXG4rXFx0X191NjQgd2lvcztcXG4rXFx0X191NjQgZGJ5dGVzO1xcbitcXHRfX3U2NCBkaW9zO1xcbitcXHRfX3U2NCBkZXY7XFx0LyogZGV2X3Qgb2YgdGhlIGRldmljZSB0aGUgY291bnRlcnMgYmVsb25nIHRvICovXFxuK307XFxuK1xcbisjZW5kaWYgLyogX19DR1JPVVBfSVRFUl9JT19IICovXFxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9jb25maWcgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvY29uZmlnXFxuaW5kZXggZWE3MDQ0ZjMwYWRjMy4uMjcwZTZiZjkxOTRkMiAxMDA2NDRcXG4tLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvY29uZmlnXFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL2NvbmZpZ1xcbkBAIC0xLDMgKzEsNCBAQFxcbitDT05GSUdfQkxLX0NHUk9VUD15XFxuIENPTkZJR19CTEtfREVWX0xPT1A9eVxcbiBDT05GSUdfQk9PVFBBUkFNX0hBUkRMT0NLVVBfUEFOSUM9eVxcbiBDT05GSUdfQk9PVFBBUkFNX1NPRlRMT0NLVVBfUEFOSUM9MVxcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9jZ3JvdXBfaXRlcl9pby5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvY2dyb3VwX2l0ZXJfaW8uY1xcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uNWQyN2U1ZDI4Mzc5NVxcbi0tLSAvZGV2L251bGxcXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9jZ3JvdXBfaXRlcl9pby5jXFxuQEAgLTAsMCArMSwyNzcgQEBcXG4rLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcXG4rLyogQ29weXJpZ2h0IChjKSAyMDI1IE1ldGEgUGxhdGZvcm1zLCBJbmMuIGFuZCBhZmZpbGlhdGVzLiAqL1xcbisjZGVmaW5lIF9HTlVfU09VUkNFXFxuKyNpbmNsdWRlIFxcdTAwM2N0ZXN0X3Byb2dzLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NicGYvbGliYnBmLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NmY250bC5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvbG9vcC5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjc3RkbGliLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NzdHJpbmcuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY3N5cy9pb2N0bC5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjc3lzL3N0YXQuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY3N5cy9zeXNtYWNyb3MuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY3VuaXN0ZC5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXFwiY2dyb3VwX2hlbHBlcnMuaFxcXCJcXG4rI2luY2x1ZGUgXFxcImNncm91cF9pdGVyX2lvLmhcXFwiXFxuKyNpbmNsdWRlIFxcXCJjZ3JvdXBfaXRlcl9pby5za2VsLmhcXFwiXFxuK1xcbisjZGVmaW5lIElPX1NJWkUgKDQgKiAxMDI0ICogMTAyNClcXG4rXFxuK3N0YXRpYyBpbnQgcmVhZF9zdGF0cyhzdHJ1Y3QgYnBmX2xpbmsgKmxpbmspXFxuK3tcXG4rXFx0aW50IGZkLCByZXQgPSAwO1xcbitcXHRzc2l6ZV90IGJ5dGVzO1xcbitcXG4rXFx0ZmQgPSBicGZfaXRlcl9jcmVhdGUoYnBmX2xpbmtfX2ZkKGxpbmspKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0tfRkQoZmQsIFxcXCJicGZfaXRlcl9jcmVhdGVcXFwiKSlcXG4rXFx0XFx0cmV0dXJuIDE7XFxuK1xcbitcXHQvKiBSZXN1bHRzIGxhbmQgaW4gc2tlbC1cXHUwMDNlZGF0YV9xdWVyeTsgdGhlIHJlYWQgaXRzZWxmIHJldHVybnMgbm8gZGF0YS4gKi9cXG4rXFx0Ynl0ZXMgPSByZWFkKGZkLCBOVUxMLCAwKTtcXG4rXFx0aWYgKCFBU1NFUlRfRVEoYnl0ZXMsIDAsIFxcXCJyZWFkIGZkXFxcIikpXFxuK1xcdFxcdHJldCA9IDE7XFxuK1xcbitcXHRjbG9zZShmZCk7XFxuK1xcdHJldHVybiByZXQ7XFxuK31cXG4rXFxuKy8qIFNldCB1cCBhIGxvb3AgZGV2aWNlIGZvciBjZ3JvdXAtY2hhcmdlZCBJL08uICovXFxuK3N0YXRpYyBpbnQgbG9vcF9zZXR1cChjaGFyICpsb29wX3BhdGgsIHNpemVfdCBzeiwgaW50ICpjdGxfZmQsIGludCAqbG9vcF9mZCxcXG4rXFx0XFx0ICAgICAgaW50ICpiYWNrX2ZkKVxcbit7XFxuK1xcdGNoYXIgYmFja19wYXRoW10gPSBcXFwiL3RtcC9jZ3JvdXBfaXRlcl9pby5YWFhYWFhcXFwiO1xcbitcXHRpbnQgbnI7XFxuK1xcbitcXHQqY3RsX2ZkID0gKmxvb3BfZmQgPSAqYmFja19mZCA9IC0xO1xcbitcXG4rXFx0KmN0bF9mZCA9IG9wZW4oXFxcIi9kZXYvbG9vcC1jb250cm9sXFxcIiwgT19SRFdSIHwgT19DTE9FWEVDKTtcXG4rXFx0aWYgKCpjdGxfZmQgXFx1MDAzYyAwKVxcbitcXHRcXHRyZXR1cm4gLTE7XFxuK1xcbitcXHRuciA9IGlvY3RsKCpjdGxfZmQsIExPT1BfQ1RMX0dFVF9GUkVFKTtcXG4rXFx0aWYgKG5yIFxcdTAwM2MgMClcXG4rXFx0XFx0Z290byBlcnI7XFxuK1xcdHNucHJpbnRmKGxvb3BfcGF0aCwgc3osIFxcXCIvZGV2L2xvb3AlZFxcXCIsIG5yKTtcXG4rXFxuK1xcdCpiYWNrX2ZkID0gbWtzdGVtcChiYWNrX3BhdGgpO1xcbitcXHRpZiAoKmJhY2tfZmQgXFx1MDAzYyAwKVxcbitcXHRcXHRnb3RvIGVycjtcXG4rXFx0dW5saW5rKGJhY2tfcGF0aCk7XFxuK1xcdGlmIChmdHJ1bmNhdGUoKmJhY2tfZmQsIChvZmZfdClJT19TSVpFICogNCkpXFxuK1xcdFxcdGdvdG8gZXJyO1xcbitcXG4rXFx0Kmxvb3BfZmQgPSBvcGVuKGxvb3BfcGF0aCwgT19SRFdSIHwgT19DTE9FWEVDKTtcXG4rXFx0aWYgKCpsb29wX2ZkIFxcdTAwM2MgMClcXG4rXFx0XFx0Z290byBlcnI7XFxuK1xcdGlmIChpb2N0bCgqbG9vcF9mZCwgTE9PUF9TRVRfRkQsICpiYWNrX2ZkKSlcXG4rXFx0XFx0Z290byBlcnI7XFxuK1xcbitcXHRyZXR1cm4gMDtcXG4rZXJyOlxcbitcXHRpZiAoKmxvb3BfZmQgXFx1MDAzZT0gMClcXG4rXFx0XFx0Y2xvc2UoKmxvb3BfZmQpO1xcbitcXHRpZiAoKmJhY2tfZmQgXFx1MDAzZT0gMClcXG4rXFx0XFx0Y2xvc2UoKmJhY2tfZmQpO1xcbitcXHRjbG9zZSgqY3RsX2ZkKTtcXG4rXFx0KmN0bF9mZCA9ICpsb29wX2ZkID0gKmJhY2tfZmQgPSAtMTtcXG4rXFx0cmV0dXJuIC0xO1xcbit9XFxuK1xcbitzdGF0aWMgdm9pZCBsb29wX3RlYXJkb3duKGNvbnN0IGNoYXIgKmxvb3BfcGF0aCwgaW50IGN0bF9mZCwgaW50IGxvb3BfZmQsXFxuK1xcdFxcdFxcdCAgaW50IGJhY2tfZmQpXFxuK3tcXG4rXFx0aW50IG5yID0gLTE7XFxuK1xcbitcXHRpZiAobG9vcF9mZCBcXHUwMDNlPSAwKSB7XFxuK1xcdFxcdGlvY3RsKGxvb3BfZmQsIExPT1BfQ0xSX0ZELCAwKTtcXG4rXFx0XFx0Y2xvc2UobG9vcF9mZCk7XFxuK1xcdH1cXG4rXFx0aWYgKGJhY2tfZmQgXFx1MDAzZT0gMClcXG4rXFx0XFx0Y2xvc2UoYmFja19mZCk7XFxuK1xcdGlmIChjdGxfZmQgXFx1MDAzZT0gMCkge1xcbitcXHRcXHRpZiAoc3NjYW5mKGxvb3BfcGF0aCwgXFxcIi9kZXYvbG9vcCVkXFxcIiwgXFx1MDAyNm5yKSA9PSAxIFxcdTAwMjZcXHUwMDI2IG5yIFxcdTAwM2U9IDApXFxuK1xcdFxcdFxcdGlvY3RsKGN0bF9mZCwgTE9PUF9DVExfUkVNT1ZFLCBucik7XFxuK1xcdFxcdGNsb3NlKGN0bF9mZCk7XFxuK1xcdH1cXG4rfVxcbitcXG4rLyogT19ESVJFQ1Qga2VlcHMgSS9PIGNoYXJnZWQgdG8gdGhlIGN1cnJlbnQgY2dyb3VwLiAqL1xcbitzdGF0aWMgaW50IGRvX2RpcmVjdF9pbyhjb25zdCBjaGFyICpsb29wX3BhdGgpXFxuK3tcXG4rXFx0dm9pZCAqYnVmO1xcbitcXHRpbnQgZmQsIHJldCA9IC0xO1xcbitcXG4rXFx0ZmQgPSBvcGVuKGxvb3BfcGF0aCwgT19SRFdSIHwgT19ESVJFQ1QgfCBPX0NMT0VYRUMpO1xcbitcXHRpZiAoZmQgXFx1MDAzYyAwKVxcbitcXHRcXHRyZXR1cm4gLTE7XFxuK1xcdGlmIChwb3NpeF9tZW1hbGlnbihcXHUwMDI2YnVmLCA0MDk2LCBJT19TSVpFKSlcXG4rXFx0XFx0Z290byBvdXRfZmQ7XFxuK1xcdG1lbXNldChidWYsIDB4YWIsIElPX1NJWkUpO1xcbitcXG4rXFx0aWYgKHB3cml0ZShmZCwgYnVmLCBJT19TSVpFLCAwKSAhPSBJT19TSVpFKVxcbitcXHRcXHRnb3RvIG91dF9idWY7XFxuK1xcdGZzeW5jKGZkKTtcXG4rXFx0aWYgKHByZWFkKGZkLCBidWYsIElPX1NJWkUsIDApICE9IElPX1NJWkUpXFxuK1xcdFxcdGdvdG8gb3V0X2J1ZjtcXG4rXFx0cmV0ID0gMDtcXG4rb3V0X2J1ZjpcXG4rXFx0ZnJlZShidWYpO1xcbitvdXRfZmQ6XFxuK1xcdGNsb3NlKGZkKTtcXG4rXFx0cmV0dXJuIHJldDtcXG4rfVxcbitcXG4rLyogUmVhZCBAZGV2J3MgaW8uc3RhdCBjb3VudGVycy4gQGRldiB1c2VzIGtlcm5lbCBkZXZfdCBlbmNvZGluZy4gKi9cXG4rc3RhdGljIGludCBwYXJzZV9pb19zdGF0KGludCBjZ3JvdXBfZmQsIF9fdTY0IGRldiwgc3RydWN0IGlvX3F1ZXJ5ICpvdXQpXFxuK3tcXG4rXFx0dW5zaWduZWQgaW50IHdhbnRfbWFqID0gZGV2IFxcdTAwM2VcXHUwMDNlIDIwLCB3YW50X21pbiA9IGRldiBcXHUwMDI2ICgoMVUgXFx1MDAzY1xcdTAwM2MgMjApIC0gMSk7XFxuK1xcdGNoYXIgYnVmWzQwOTZdLCAqbGluZSwgKnNhdmVwdHI7XFxuK1xcdGludCBmZCwgbiwgcmV0ID0gLTE7XFxuK1xcbitcXHRmZCA9IG9wZW5hdChjZ3JvdXBfZmQsIFxcXCJpby5zdGF0XFxcIiwgT19SRE9OTFkpO1xcbitcXHRpZiAoZmQgXFx1MDAzYyAwKVxcbitcXHRcXHRyZXR1cm4gLTE7XFxuK1xcdG4gPSByZWFkKGZkLCBidWYsIHNpemVvZihidWYpIC0gMSk7XFxuK1xcdGNsb3NlKGZkKTtcXG4rXFx0aWYgKG4gXFx1MDAzYz0gMClcXG4rXFx0XFx0cmV0dXJuIC0xO1xcbitcXHRidWZbbl0gPSAnXFxcXDAnO1xcbitcXG4rXFx0Zm9yIChsaW5lID0gc3RydG9rX3IoYnVmLCBcXFwiXFxcXG5cXFwiLCBcXHUwMDI2c2F2ZXB0cik7IGxpbmU7XFxuK1xcdCAgICAgbGluZSA9IHN0cnRva19yKE5VTEwsIFxcXCJcXFxcblxcXCIsIFxcdTAwMjZzYXZlcHRyKSkge1xcbitcXHRcXHR1bnNpZ25lZCBsb25nIGxvbmcgcmIgPSAwLCB3YiA9IDAsIHJpID0gMCwgd2kgPSAwLCBkYiA9IDAsIGRpID0gMDtcXG4rXFx0XFx0dW5zaWduZWQgaW50IG1haiwgbWluO1xcbitcXG4rXFx0XFx0LyogT25seSB0aGUgZGV2aWNlIGlkIGlzIHJlcXVpcmVkOyBtaXNzaW5nIGNvdW50ZXJzIHN0YXkgemVyby4gKi9cXG4rXFx0XFx0aWYgKHNzY2FuZihsaW5lLFxcbitcXHRcXHRcXHQgICBcXFwiJXU6JXUgcmJ5dGVzPSVsbHUgd2J5dGVzPSVsbHUgcmlvcz0lbGx1IHdpb3M9JWxsdSBkYnl0ZXM9JWxsdSBkaW9zPSVsbHVcXFwiLFxcbitcXHRcXHRcXHQgICBcXHUwMDI2bWFqLCBcXHUwMDI2bWluLCBcXHUwMDI2cmIsIFxcdTAwMjZ3YiwgXFx1MDAyNnJpLCBcXHUwMDI2d2ksIFxcdTAwMjZkYiwgXFx1MDAyNmRpKSBcXHUwMDNjIDIpXFxuK1xcdFxcdFxcdGNvbnRpbnVlO1xcbitcXHRcXHRpZiAobWFqICE9IHdhbnRfbWFqIHx8IG1pbiAhPSB3YW50X21pbilcXG4rXFx0XFx0XFx0Y29udGludWU7XFxuK1xcbitcXHRcXHRvdXQtXFx1MDAzZXJieXRlcyA9IHJiO1xcbitcXHRcXHRvdXQtXFx1MDAzZXdieXRlcyA9IHdiO1xcbitcXHRcXHRvdXQtXFx1MDAzZXJpb3MgPSByaTtcXG4rXFx0XFx0b3V0LVxcdTAwM2V3aW9zID0gd2k7XFxuK1xcdFxcdG91dC1cXHUwMDNlZGJ5dGVzID0gZGI7XFxuK1xcdFxcdG91dC1cXHUwMDNlZGlvcyA9IGRpO1xcbitcXHRcXHRyZXQgPSAwO1xcbitcXHRcXHRicmVhaztcXG4rXFx0fVxcbitcXHRyZXR1cm4gcmV0O1xcbit9XFxuK1xcbit2b2lkIHRlc3RfY2dyb3VwX2l0ZXJfaW8odm9pZClcXG4re1xcbitcXHRjaGFyICpjZ3JvdXBfcmVsX3BhdGggPSBcXFwiL2Nncm91cF9pdGVyX2lvX3Rlc3RcXFwiO1xcbitcXHRpbnQgY3RsX2ZkID0gLTEsIGxvb3BfZmQgPSAtMSwgYmFja19mZCA9IC0xO1xcbitcXHRzdHJ1Y3QgY2dyb3VwX2l0ZXJfaW8gKnNrZWwgPSBOVUxMO1xcbitcXHRzdHJ1Y3QgYnBmX2xpbmsgKmxpbmsgPSBOVUxMO1xcbitcXHRjaGFyIGxvb3BfcGF0aFs2NF07XFxuK1xcdHN0cnVjdCBpb19xdWVyeSAqcTtcXG4rXFx0aW50IGNncm91cF9mZDtcXG4rXFxuK1xcdGNncm91cF9mZCA9IGNncm91cF9zZXR1cF9hbmRfam9pbihjZ3JvdXBfcmVsX3BhdGgpO1xcbitcXHRpZiAoIUFTU0VSVF9PS19GRChjZ3JvdXBfZmQsIFxcXCJjZ3JvdXBfc2V0dXBfYW5kX2pvaW5cXFwiKSlcXG4rXFx0XFx0cmV0dXJuO1xcbitcXG4rXFx0aWYgKGxvb3Bfc2V0dXAobG9vcF9wYXRoLCBzaXplb2YobG9vcF9wYXRoKSwgXFx1MDAyNmN0bF9mZCwgXFx1MDAyNmxvb3BfZmQsIFxcdTAwMjZiYWNrX2ZkKSkge1xcbitcXHRcXHR0ZXN0X19za2lwKCk7XFx0LyogbmVlZHMgcm9vdCArIENPTkZJR19CTEtfREVWX0xPT1AgKi9cXG4rXFx0XFx0Z290byBjbGVhbnVwX2Nncm91cF9mZDtcXG4rXFx0fVxcbitcXG4rXFx0c2tlbCA9IGNncm91cF9pdGVyX2lvX19vcGVuX2FuZF9sb2FkKCk7XFxuK1xcdGlmICghQVNTRVJUX09LX1BUUihza2VsLCBcXFwiY2dyb3VwX2l0ZXJfaW9fX29wZW5fYW5kX2xvYWRcXFwiKSlcXG4rXFx0XFx0Z290byBjbGVhbnVwX2xvb3A7XFxuK1xcbitcXHQvKiBDb252ZXJ0IGdsaWJjIHN0X3JkZXYgdG8ga2VybmVsIGRldl90IGZvcm1hdC4gKi9cXG4rXFx0e1xcbitcXHRcXHRzdHJ1Y3Qgc3RhdCBsc3Q7XFxuK1xcbitcXHRcXHRpZiAoIUFTU0VSVF9PSyhmc3RhdChsb29wX2ZkLCBcXHUwMDI2bHN0KSwgXFxcImZzdGF0IGxvb3BcXFwiKSlcXG4rXFx0XFx0XFx0Z290byBjbGVhbnVwX3NrZWw7XFxuK1xcdFxcdHNrZWwtXFx1MDAzZWRhdGFfcXVlcnktXFx1MDAzZXRhcmdldF9kZXYgPVxcbitcXHRcXHRcXHQoKF9fdTY0KW1ham9yKGxzdC5zdF9yZGV2KSBcXHUwMDNjXFx1MDAzYyAyMCkgfCBtaW5vcihsc3Quc3RfcmRldik7XFxuK1xcdH1cXG4rXFxuK1xcdERFQ0xBUkVfTElCQlBGX09QVFMoYnBmX2l0ZXJfYXR0YWNoX29wdHMsIG9wdHMpO1xcbitcXHR1bmlvbiBicGZfaXRlcl9saW5rX2luZm8gbGluZm8gPSB7XFxuK1xcdFxcdC5jZ3JvdXAuY2dyb3VwX2ZkID0gY2dyb3VwX2ZkLFxcbitcXHRcXHQuY2dyb3VwLm9yZGVyID0gQlBGX0NHUk9VUF9JVEVSX1NFTEZfT05MWSxcXG4rXFx0fTtcXG4rXFx0b3B0cy5saW5rX2luZm8gPSBcXHUwMDI2bGluZm87XFxuK1xcdG9wdHMubGlua19pbmZvX2xlbiA9IHNpemVvZihsaW5mbyk7XFxuK1xcbitcXHRsaW5rID0gYnBmX3Byb2dyYW1fX2F0dGFjaF9pdGVyKHNrZWwtXFx1MDAzZXByb2dzLmNncm91cF9pb19xdWVyeSwgXFx1MDAyNm9wdHMpO1xcbitcXHRpZiAoIUFTU0VSVF9PS19QVFIobGluaywgXFxcImJwZl9wcm9ncmFtX19hdHRhY2hfaXRlclxcXCIpKVxcbitcXHRcXHRnb3RvIGNsZWFudXBfc2tlbDtcXG4rXFxuK1xcdC8qIFRoaXMgcHJvY2VzcyBpcyBpbiB0aGUgdGVzdCBjZ3JvdXAsIHNvIHRoZSBsb29wIEkvTyBpcyBjaGFyZ2VkIGhlcmUuICovXFxuK1xcdGlmICghQVNTRVJUX09LKGRvX2RpcmVjdF9pbyhsb29wX3BhdGgpLCBcXFwiZG9fZGlyZWN0X2lvXFxcIikpXFxuK1xcdFxcdGdvdG8gY2xlYW51cF9saW5rO1xcbitcXG4rXFx0aWYgKCFBU1NFUlRfT0socmVhZF9zdGF0cyhsaW5rKSwgXFxcInJlYWQgc3RhdHNcXFwiKSlcXG4rXFx0XFx0Z290byBjbGVhbnVwX2xpbms7XFxuK1xcbitcXHRxID0gXFx1MDAyNnNrZWwtXFx1MDAzZWRhdGFfcXVlcnktXFx1MDAzZWlvX3F1ZXJ5O1xcbitcXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcXFwiY2dyb3VwX2l0ZXJfaW9fX3dyaXRlXFxcIikpIHtcXG4rXFx0XFx0QVNTRVJUX0dUKHEtXFx1MDAzZXdieXRlcywgMCwgXFxcIndieXRlc1xcXCIpO1xcbitcXHRcXHRBU1NFUlRfR1QocS1cXHUwMDNld2lvcywgMCwgXFxcIndpb3NcXFwiKTtcXG4rXFx0fVxcbitcXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcXFwiY2dyb3VwX2l0ZXJfaW9fX3JlYWRcXFwiKSkge1xcbitcXHRcXHRBU1NFUlRfR1QocS1cXHUwMDNlcmJ5dGVzLCAwLCBcXFwicmJ5dGVzXFxcIik7XFxuK1xcdFxcdEFTU0VSVF9HVChxLVxcdTAwM2VyaW9zLCAwLCBcXFwicmlvc1xcXCIpO1xcbitcXHR9XFxuK1xcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFxcXCJjZ3JvdXBfaXRlcl9pb19fZGV2XFxcIikpXFxuK1xcdFxcdEFTU0VSVF9HVChxLVxcdTAwM2VkZXYsIDAsIFxcXCJkZXZcXFwiKTtcXG4rXFxuK1xcdC8qIENvbXBhcmUgd2l0aCBpby5zdGF0IHdpdGhvdXQgSS9PIGJldHdlZW4gdGhlIHJlYWRzLiAqL1xcbitcXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcXFwiY2dyb3VwX2l0ZXJfaW9fX21hdGNoXFxcIikpIHtcXG4rXFx0XFx0c3RydWN0IGlvX3F1ZXJ5IGZpbGV2ID0ge307XFxuK1xcbitcXHRcXHRpZiAoQVNTRVJUX09LKHJlYWRfc3RhdHMobGluayksIFxcXCJyZWFkIHN0YXRzXFxcIikgXFx1MDAyNlxcdTAwMjZcXG4rXFx0XFx0ICAgIEFTU0VSVF9PSyhwYXJzZV9pb19zdGF0KGNncm91cF9mZCwgcS1cXHUwMDNlZGV2LCBcXHUwMDI2ZmlsZXYpLFxcbitcXHRcXHRcXHQgICAgICBcXFwicGFyc2UgaW8uc3RhdFxcXCIpKSB7XFxuK1xcdFxcdFxcdEFTU0VSVF9FUShxLVxcdTAwM2VyYnl0ZXMsIGZpbGV2LnJieXRlcywgXFxcInJieXRlc1xcXCIpO1xcbitcXHRcXHRcXHRBU1NFUlRfRVEocS1cXHUwMDNld2J5dGVzLCBmaWxldi53Ynl0ZXMsIFxcXCJ3Ynl0ZXNcXFwiKTtcXG4rXFx0XFx0XFx0QVNTRVJUX0VRKHEtXFx1MDAzZXJpb3MsIGZpbGV2LnJpb3MsIFxcXCJyaW9zXFxcIik7XFxuK1xcdFxcdFxcdEFTU0VSVF9FUShxLVxcdTAwM2V3aW9zLCBmaWxldi53aW9zLCBcXFwid2lvc1xcXCIpO1xcbitcXHRcXHRcXHRBU1NFUlRfRVEocS1cXHUwMDNlZGJ5dGVzLCBmaWxldi5kYnl0ZXMsIFxcXCJkYnl0ZXNcXFwiKTtcXG4rXFx0XFx0XFx0QVNTRVJUX0VRKHEtXFx1MDAzZWRpb3MsIGZpbGV2LmRpb3MsIFxcXCJkaW9zXFxcIik7XFxuK1xcdFxcdH1cXG4rXFx0fVxcbitcXG4rXFx0LyogUm9vdCBzdGF0aXN0aWNzIGluY2x1ZGUgdGhpcyBjZ3JvdXAncyBJL08uICovXFxuK1xcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFxcXCJjZ3JvdXBfaXRlcl9pb19fcm9vdFxcXCIpKSB7XFxuK1xcdFxcdHN0cnVjdCBicGZfbGluayAqcm9vdF9saW5rO1xcbitcXHRcXHRzdHJ1Y3QgaW9fcXVlcnkgKnI7XFxuK1xcbitcXHRcXHRza2VsLVxcdTAwM2VkYXRhX3F1ZXJ5LVxcdTAwM2Vnb3Rfcm9vdF9jc3MgPSAwO1xcbitcXHRcXHRyb290X2xpbmsgPSBicGZfcHJvZ3JhbV9fYXR0YWNoX2l0ZXIoc2tlbC1cXHUwMDNlcHJvZ3MuY2dyb3VwX3Jvb3RfaW9fcXVlcnksXFxuK1xcdFxcdFxcdFxcdFxcdFxcdCAgICAgXFx1MDAyNm9wdHMpO1xcbitcXHRcXHRpZiAoQVNTRVJUX09LX1BUUihyb290X2xpbmssIFxcXCJhdHRhY2ggcm9vdCBpdGVyXFxcIikpIHtcXG4rXFx0XFx0XFx0aWYgKEFTU0VSVF9PSyhyZWFkX3N0YXRzKHJvb3RfbGluayksIFxcXCJyZWFkIHJvb3Qgc3RhdHNcXFwiKSkge1xcbitcXHRcXHRcXHRcXHRyID0gXFx1MDAyNnNrZWwtXFx1MDAzZWRhdGFfcXVlcnktXFx1MDAzZXJvb3RfcXVlcnk7XFxuK1xcdFxcdFxcdFxcdEFTU0VSVF9FUShza2VsLVxcdTAwM2VkYXRhX3F1ZXJ5LVxcdTAwM2Vnb3Rfcm9vdF9jc3MsIDEsXFxuK1xcdFxcdFxcdFxcdFxcdCAgXFxcImdvdF9yb290X2Nzc1xcXCIpO1xcbitcXHRcXHRcXHRcXHRBU1NFUlRfRVEoci1cXHUwMDNlZGV2LCBxLVxcdTAwM2VkZXYsIFxcXCJyb290IGRldlxcXCIpO1xcbitcXHRcXHRcXHRcXHRBU1NFUlRfR0Uoci1cXHUwMDNld2J5dGVzLCBxLVxcdTAwM2V3Ynl0ZXMsIFxcXCJyb290IHdieXRlc1xcXCIpO1xcbitcXHRcXHRcXHRcXHRBU1NFUlRfR0Uoci1cXHUwMDNld2lvcywgcS1cXHUwMDNld2lvcywgXFxcInJvb3Qgd2lvc1xcXCIpO1xcbitcXHRcXHRcXHRcXHRBU1NFUlRfR0Uoci1cXHUwMDNlcmJ5dGVzLCBxLVxcdTAwM2VyYnl0ZXMsIFxcXCJyb290IHJieXRlc1xcXCIpO1xcbitcXHRcXHRcXHRcXHRBU1NFUlRfR0Uoci1cXHUwMDNlcmlvcywgcS1cXHUwMDNlcmlvcywgXFxcInJvb3Qgcmlvc1xcXCIpO1xcbitcXHRcXHRcXHR9XFxuK1xcdFxcdFxcdGJwZl9saW5rX19kZXN0cm95KHJvb3RfbGluayk7XFxuK1xcdFxcdH1cXG4rXFx0fVxcbitcXG4rY2xlYW51cF9saW5rOlxcbitcXHRicGZfbGlua19fZGVzdHJveShsaW5rKTtcXG4rY2xlYW51cF9za2VsOlxcbitcXHRjZ3JvdXBfaXRlcl9pb19fZGVzdHJveShza2VsKTtcXG4rY2xlYW51cF9sb29wOlxcbitcXHRsb29wX3RlYXJkb3duKGxvb3BfcGF0aCwgY3RsX2ZkLCBsb29wX2ZkLCBiYWNrX2ZkKTtcXG4rY2xlYW51cF9jZ3JvdXBfZmQ6XFxuK1xcdGNsb3NlKGNncm91cF9mZCk7XFxuK1xcdGNsZWFudXBfY2dyb3VwX2Vudmlyb25tZW50KCk7XFxuK31cXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL2Nncm91cF9pdGVyX2lvLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvY2dyb3VwX2l0ZXJfaW8uY1xcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uMmNkNTM4MDY4OTg3YVxcbi0tLSAvZGV2L251bGxcXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvY2dyb3VwX2l0ZXJfaW8uY1xcbkBAIC0wLDAgKzEsOTkgQEBcXG4rLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcXG4rLyogQ29weXJpZ2h0IChjKSAyMDI1IE1ldGEgUGxhdGZvcm1zLCBJbmMuIGFuZCBhZmZpbGlhdGVzLiAqL1xcbisjaW5jbHVkZSBcXHUwMDNjdm1saW51eC5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjYnBmL2JwZl9oZWxwZXJzLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NicGYvYnBmX2NvcmVfcmVhZC5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXFwiYnBmX2V4cGVyaW1lbnRhbC5oXFxcIlxcbisjaW5jbHVkZSBcXFwiY2dyb3VwX2l0ZXJfaW8uaFxcXCJcXG4rXFxuK2NoYXIgX2xpY2Vuc2VbXSBTRUMoXFxcImxpY2Vuc2VcXFwiKSA9IFxcXCJHUExcXFwiO1xcbitcXG4rc3RydWN0IGlvX3F1ZXJ5IGlvX3F1ZXJ5IFNFQyhcXFwiLmRhdGEucXVlcnlcXFwiKTtcXG4rXFxuK3N0cnVjdCBpb19xdWVyeSByb290X3F1ZXJ5IFNFQyhcXFwiLmRhdGEucXVlcnlcXFwiKTtcXG4rXFxuK19fdTY0IGdvdF9yb290X2NzcyBTRUMoXFxcIi5kYXRhLnF1ZXJ5XFxcIik7XFxuK1xcbisvKiBEZXZpY2Ugc2VsZWN0ZWQgYnkgdXNlcnNwYWNlIGluIGtlcm5lbCBkZXZfdCBmb3JtYXQuICovXFxuK19fdTY0IHRhcmdldF9kZXYgU0VDKFxcXCIuZGF0YS5xdWVyeVxcXCIpO1xcbitcXG4rLyogS2VlcCBpbmxpbmU6IFJDVSBhbmQgb3Blbi1jb2RlZCBpdGVyYXRvcnMgY2Fubm90IGNyb3NzIGEgQlBGIGNhbGwuICovXFxuK3N0YXRpYyBfX2Fsd2F5c19pbmxpbmUgaW50IHJlYWRfdGFyZ2V0X2RldihzdHJ1Y3QgY2dyb3VwICpjZ3JwLFxcbitcXHRcXHRcXHRcXHRcXHQgICBzdHJ1Y3QgaW9fcXVlcnkgKm91dClcXG4re1xcbitcXHRzdHJ1Y3QgY2dyb3VwX3N1YnN5c19zdGF0ZSAqY3NzO1xcbitcXHRzdHJ1Y3QgYmxrY2dfZ3EgKnBvcztcXG4rXFx0X191NjQgZGV2O1xcbitcXHRpbnQgc3NpZDtcXG4rXFxuK1xcdC8qIFRoZSBmbHVzaCBjYW4gc2xlZXAsIHNvIHJ1biBpdCBiZWZvcmUgdGhlIFJDVSBzZWN0aW9uLiAqL1xcbitcXHRicGZfYmxrY2dfZmx1c2hfc3RhdHMoY2dycCk7XFxuK1xcbitcXHRicGZfcmN1X3JlYWRfbG9jaygpO1xcbitcXHRzc2lkID0gYnBmX2NvcmVfZW51bV92YWx1ZShlbnVtIGNncm91cF9zdWJzeXNfaWQsIGlvX2NncnBfaWQpO1xcbitcXG4rXFx0LypcXG4rXFx0ICogc3Vic3lzW10gaXMgX19yY3UsIHNvIHRoaXMgcmVhZCBnaXZlcyBhbiBSQ1UgcG9pbnRlciB0aGUgaXRlcmF0b3JcXG4rXFx0ICogYWNjZXB0cy4gQlBGX0NPUkVfUkVBRCgpIHdvdWxkIHJldHVybiBhIHBsYWluIHZhbHVlIGluc3RlYWQuXFxuK1xcdCAqL1xcbitcXHRjc3MgPSBjZ3JwLVxcdTAwM2VzdWJzeXNbc3NpZF07XFxuK1xcdGlmICghY3NzKSB7XFxuK1xcdFxcdGJwZl9yY3VfcmVhZF91bmxvY2soKTtcXG4rXFx0XFx0cmV0dXJuIDA7XFxuK1xcdH1cXG4rXFxuK1xcdGJwZl9mb3JfZWFjaChibGtnLCBwb3MsIGNzcykge1xcbitcXHRcXHRkZXYgPSBCUEZfQ09SRV9SRUFEKHBvcywgcSwgZGlzaywgcGFydDAsIGJkX2Rldik7XFxuK1xcdFxcdGlmIChkZXYgIT0gdGFyZ2V0X2RldilcXG4rXFx0XFx0XFx0Y29udGludWU7XFxuK1xcbitcXHRcXHRvdXQtXFx1MDAzZWRldiA9IGRldjtcXG4rXFx0XFx0b3V0LVxcdTAwM2VyYnl0ZXMgPSBCUEZfQ09SRV9SRUFEKHBvcywgaW9zdGF0LmN1ci5ieXRlc1tCTEtHX0lPU1RBVF9SRUFEXSk7XFxuK1xcdFxcdG91dC1cXHUwMDNld2J5dGVzID0gQlBGX0NPUkVfUkVBRChwb3MsIGlvc3RhdC5jdXIuYnl0ZXNbQkxLR19JT1NUQVRfV1JJVEVdKTtcXG4rXFx0XFx0b3V0LVxcdTAwM2VyaW9zID0gQlBGX0NPUkVfUkVBRChwb3MsIGlvc3RhdC5jdXIuaW9zW0JMS0dfSU9TVEFUX1JFQURdKTtcXG4rXFx0XFx0b3V0LVxcdTAwM2V3aW9zID0gQlBGX0NPUkVfUkVBRChwb3MsIGlvc3RhdC5jdXIuaW9zW0JMS0dfSU9TVEFUX1dSSVRFXSk7XFxuK1xcdFxcdG91dC1cXHUwMDNlZGJ5dGVzID0gQlBGX0NPUkVfUkVBRChwb3MsIGlvc3RhdC5jdXIuYnl0ZXNbQkxLR19JT1NUQVRfRElTQ0FSRF0pO1xcbitcXHRcXHRvdXQtXFx1MDAzZWRpb3MgPSBCUEZfQ09SRV9SRUFEKHBvcywgaW9zdGF0LmN1ci5pb3NbQkxLR19JT1NUQVRfRElTQ0FSRF0pO1xcbitcXHRcXHRicmVhaztcXG4rXFx0fVxcbitcXHRicGZfcmN1X3JlYWRfdW5sb2NrKCk7XFxuK1xcdHJldHVybiAxO1xcbit9XFxuK1xcbitTRUMoXFxcIml0ZXIucy9jZ3JvdXBcXFwiKVxcbitpbnQgY2dyb3VwX2lvX3F1ZXJ5KHN0cnVjdCBicGZfaXRlcl9fY2dyb3VwICpjdHgpXFxuK3tcXG4rXFx0c3RydWN0IGNncm91cCAqY2dycCA9IGN0eC1cXHUwMDNlY2dyb3VwO1xcbitcXG4rXFx0aWYgKCFjZ3JwKVxcbitcXHRcXHRyZXR1cm4gMTtcXG4rXFxuK1xcdC8qIFN0YXJ0IGZyZXNoIHNvIGEgZGV2aWNlIHRoYXQgaXMgbm90IGZvdW5kIHN0YXlzIGFsbC16ZXJvLiAqL1xcbitcXHRfX2J1aWx0aW5fbWVtc2V0KFxcdTAwMjZpb19xdWVyeSwgMCwgc2l6ZW9mKGlvX3F1ZXJ5KSk7XFxuK1xcbitcXHRyZWFkX3RhcmdldF9kZXYoY2dycCwgXFx1MDAyNmlvX3F1ZXJ5KTtcXG4rXFx0cmV0dXJuIDA7XFxuK31cXG4rXFxuK1NFQyhcXFwiaXRlci5zL2Nncm91cFxcXCIpXFxuK2ludCBjZ3JvdXBfcm9vdF9pb19xdWVyeShzdHJ1Y3QgYnBmX2l0ZXJfX2Nncm91cCAqY3R4KVxcbit7XFxuK1xcdHN0cnVjdCBjZ3JvdXAgKnJvb3Q7XFxuK1xcbitcXHRpZiAoIWN0eC1cXHUwMDNlY2dyb3VwKVxcbitcXHRcXHRyZXR1cm4gMTtcXG4rXFxuK1xcdF9fYnVpbHRpbl9tZW1zZXQoXFx1MDAyNnJvb3RfcXVlcnksIDAsIHNpemVvZihyb290X3F1ZXJ5KSk7XFxuK1xcbitcXHQvKiBUaGUgcm9vdCBjZ3JvdXAgYWx3YXlzIGhhcyBpZCAxLiAqL1xcbitcXHRyb290ID0gYnBmX2Nncm91cF9mcm9tX2lkKDEpO1xcbitcXHRpZiAoIXJvb3QpXFxuK1xcdFxcdHJldHVybiAwO1xcbitcXG4rXFx0LyogUm9vdCBjb3VudGVycyBpbmNsdWRlIGFsbCBjZ3JvdXBzJyBJL08uICovXFxuK1xcdGlmIChyZWFkX3RhcmdldF9kZXYocm9vdCwgXFx1MDAyNnJvb3RfcXVlcnkpKVxcbitcXHRcXHRnb3Rfcm9vdF9jc3MgPSAxO1xcbitcXG4rXFx0YnBmX2Nncm91cF9yZWxlYXNlKHJvb3QpO1xcbitcXHRyZXR1cm4gMDtcXG4rfVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xN1QyMjozNDozNS43Njk3MDE1NjZaIiwiU2VxIjoyLCJOZXN0aW5nIjoxLCJUeXBlIjoiYWdlbnQiLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJiZXN0LWV4cGVuc2l2ZSIsIkR1cmF0aW9uIjo0OTM2MTkzMTI0NSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJCTEtfQ0dST1VQXCIsXG4gICAgXCJCUEZfU1lTQ0FMTFwiLFxuICAgIFwiQ0dST1VQU1wiLFxuICAgIFwiQkxPQ0tcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJicGZfYmxrY2dfZmx1c2hfc3RhdHNcIixcbiAgICBcImJwZl9pdGVyX2Jsa2dfbmV3XCIsXG4gICAgXCJicGZfaXRlcl9ibGtnX25leHRcIixcbiAgICBcImJwZl9pdGVyX2Jsa2dfZGVzdHJveVwiLFxuICAgIFwiYmxrY2dfZmlsbF9yb290X2lvc3RhdHNcIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBpbnRyb2R1Y2VzIG5ldyBCUEYga2Z1bmNzIGZvciBibG9jayBjZ3JvdXAgSS9PIHN0YXRpc3RpY3MsIHdoaWNoIGFyZSByZWFjaGFibGUgZnJvbSBCUEYgcHJvZ3JhbXMuIFRoZXNlIGZ1bmN0aW9ucyBhbGxvdyBCUEYgcHJvZ3JhbXMgdG8gZmx1c2ggYmxvY2sgY2dyb3VwIHN0YXRzIGFuZCBpdGVyYXRlIG92ZXIgcGVyLWRldmljZSBibGtncy4gVGhlIGNoYW5nZXMgYXJlIGZ1bmN0aW9uYWxseSBzaWduaWZpY2FudCBhbmQgc2hvdWxkIGJlIGZ1enplZC5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiWW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIG1haW50YWluZXIuXG5Zb3VyIGpvYiBpcyB0byByZXZpZXcgYSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kIGRldGVybWluZVxuaWYgaXQgbWFrZXMgZnVuY3Rpb25hbCBjaGFuZ2VzIHRvIHRoZSBrZXJuZWwgdGhhdCBzaG91bGQgYmUgZnV6emVkLlxuXG5JTVBPUlRBTlQ6IFRoZSBjaGFuZ2VzIGhhdmUgQUxSRUFEWSBiZWVuIGFwcGxpZWQgYW5kIGNvbW1pdHRlZCBhcyB0aGUgSEVBRCBjb21taXQgaW5cbnlvdXIgd29ya3NwYWNlLiBEbyBOT1QgcmVseSBvbiB5b3VyIGludGVybmFsIGtub3dsZWRnZSBvZiB0aGUga2VybmVsLiBZb3UgbXVzdCBhY3RpdmVseVxudXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gZXhhbWluZSB0aGUgYWN0dWFsIHNvdXJjZSBjb2RlIGFuZCBjb25maXJtIGFueSBhc3N1bXB0aW9ucy5cblxuUmV0dXJuIFdvcnRoRnV6emluZz1mYWxzZSBpZiB0aGUgcGF0Y2ggb25seSBjb250YWluczpcbi0gTW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLywgS2NvbmZpZyBmaWxlcywgb3IgY29kZSBjb21tZW50cy5cbi0gUHVyZWx5IGRlY29yYXRpdmUgY2hhbmdlcywgc3VjaCBhcyBsb2dnaW5nIChlLmcuLCBwcl9lcnIsIHByaW50aykgb3IgdHJhY2Vwb2ludHMuXG4tIENoYW5nZXMgdG8gbnVtZXJpYyBjb25zdGFudHMgb3IgbWFjcm9zIHRoYXQgZG8gbm90IGZ1bmN0aW9uYWxseSBhbHRlciBleGVjdXRpb24gZmxvdy5cbi0gQ29kZSBwYXRocyB0aGF0IGFyZSBpbXBvc3NpYmxlIHRvIHJlYWNoIGluIHZpcnR1YWxpemVkIGVudmlyb25tZW50cyBsaWtlIEdDRSBvciBRRU1VLFxuICBldmVuIHdoZW4gdXRpbGl6aW5nIHNvZnR3YXJlLWVtdWxhdGVkIGhhcmR3YXJlIChlLmcuLCB1c2IgZ2FkZ2V0LCBtYWM4MDIxMV9od3NpbSkuXG4tIENvZGUgaW4gdmVuZG9yLXNwZWNpZmljIFBDSWUgc3dpdGNoLCBTbWFydE5JQywgb3IgR1BVIGRyaXZlcnMgKGUuZy4sIG1seHN3LCBwZHNfY29yZSwgcWVkLFxuICBpb25pYywgYW1kZ3B1KSB0aGF0IHJlcXVpcmUgcGh5c2ljYWwgUENJZSBoYXJkd2FyZSBjYXJkcyBub3QgZW11bGF0ZWQgaW4gc3RhbmRhcmQgUUVNVS5cbi0gRHJpdmVyIC5yZW1vdmUsIC5zaHV0ZG93biwgb3IgcGNpX3VucmVnaXN0ZXJfZHJpdmVyIHRlYXJkb3duIGNhbGxiYWNrcyAoZS5nLiwgaWdiX3JlbW92ZSlcbiAgdGhhdCBhcmUgZXhlY3V0ZWQgb25seSBkdXJpbmcgUENJIGhvdC11bnBsdWcgb3Igc3lzZnMgZHJpdmVyIHVuYmluZCBvcGVyYXRpb25zLlxuXG5JZiBpdCBtb2RpZmllcyByZWFjaGFibGUgY29yZSBrZXJuZWwgbG9naWMsIGRyaXZlcnMsIG9yIGFyY2hpdGVjdHVyZXMsIHVzZSB5b3VyIGNvZGUgc2VhcmNoXG50b29scyB0byB2ZXJpZnkgdGhlIGNvZGUgY2FuIGJlIGV4ZWN1dGVkLCB0aGVuIHJldHVybiBXb3J0aEZ1enppbmc9dHJ1ZS5cblxuV2hlbiByZXR1cm5pbmcgV29ydGhGdXp6aW5nPXRydWUsIHlvdSBNVVNUIEFMU086XG4xLiBFeHRyYWN0IGFueSBzcGVjaWZpYyBrZXJuZWwgZnVuY3Rpb25zIHRoYXQgc2hvdWxkIGJlIGhlYXZpbHkgZnV6emVkIGludG8gRm9jdXNTeW1ib2xzLlxuICAgQXZvaWQgbGlzdGluZyBnZW5lcmljIGhvdC1wYXRoIGZ1bmN0aW9ucyB0byBwcmV2ZW50IHNrZXdlZCB0ZXN0IGRpc3RyaWJ1dGlvbnMuXG4gICBQcmVmZXIgbm9uLXN0YXRpYywgbm9uLWlubGluZWQgQVBJIGVudHJ5cG9pbnQgZnVuY3Rpb25zIG92ZXIgaW50ZXJuYWwgc3RhdGljIGhlbHBlciBmdW5jdGlvbnNcbiAgICh3aGljaCBhcmUgaW5saW5lZCBieSB0aGUgY29tcGlsZXIgYW5kIGRvIG5vdCBoYXZlIGRpc3RpbmN0IHN5bWJvbCBhZGRyZXNzZXMpLlxuMi4gSWRlbnRpZnkgYW55IHNwZWNpZmljIENPTkZJR18gb3B0aW9ucyByZXF1aXJlZCB0byBwcm9wZXJseSB0ZXN0IHRoaXMgbmV3L21vZGlmaWVkIGZlYXR1cmUuXG4gICBHbyBhbmQgbG9vayBpbnRvIHRoZSBLY29uZmlnIGZpbGVzIGFuZCBjaGVjayBmb3IgaWZkZWZzIGFyb3VuZCB0aGUgY29kZSwgZG8gbm90IG1ha2UgYXNzdW1wdGlvbnMuXG4gICBBbHNvIGNoZWNrIFwiZGVwZW5kcyBvblwiIGxpbmVzIGluIEtjb25maWcgdG8gaW5jbHVkZSBhbnkgbm9uLXN0YW5kYXJkIHBhcmVudCBzdWJzeXN0ZW0gY29uZmlnc1xuICAgbmVlZGVkIGZvciBLYnVpbGQgdG8gY29tcGlsZSB0aGUgY29kZSBzdGF0aWNhbGx5IGludG8gdm1saW51eC4gTGlzdCB0aGVtIGluIHRoZSBFbmFibGVDb25maWdzXG4gICBvdXRwdXQgYXJyYXksIGFuZCBETyBOT1QgYWRkIGEgJ0NPTkZJR18nIHByZWZpeCAoZS5nLiwgcmV0dXJuIFwiTkVUX0lQVjRcIiBpbnN0ZWFkIG9mIFwiQ09ORklHX05FVF9JUFY0XCIpLlxuUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuXG5cblxuVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy5cbkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LlxuSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLlxuIiwiUHJvbXB0IjoiRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6XG5jb21taXQgNzczMDAzNjNmZTljNWIwYWZjMzZkOWY3NGVhZGI0MWJhNmRkNTNhNVxuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBNb24gQXVnIDE3IDIyOjM0OjMyIDIwMjYgKzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvTUFJTlRBSU5FUlMgYi9NQUlOVEFJTkVSU1xuaW5kZXggMmY5NDcyYzFhMDkwNy4uODdjNTZlOTU1NTc3MSAxMDA2NDRcbi0tLSBhL01BSU5UQUlORVJTXG4rKysgYi9NQUlOVEFJTkVSU1xuQEAgLTY2MTcsNiArNjYxNyw3IEBAIEY6XHRibG9jay9ibGstY2dyb3VwLmNcbiBGOlx0YmxvY2svYmxrLWlvY29zdC5jXG4gRjpcdGJsb2NrL2Jsay1pb2xhdGVuY3kuY1xuIEY6XHRibG9jay9ibGstdGhyb3R0bGUuY1xuK0Y6XHRibG9jay9icGZfYmxrY2cuY1xuIEY6XHRpbmNsdWRlL2xpbnV4L2Jsay1jZ3JvdXAuaFxuIFxuIENPTlRST0wgR1JPVVAgLSBDUFVTRVRcbmRpZmYgLS1naXQgYS9ibG9jay9NYWtlZmlsZSBiL2Jsb2NrL01ha2VmaWxlXG5pbmRleCBlN2JkMzIwZTNkNjk3Li41NzJlNDk5ODhjOGVlIDEwMDY0NFxuLS0tIGEvYmxvY2svTWFrZWZpbGVcbisrKyBiL2Jsb2NrL01ha2VmaWxlXG5AQCAtMTcsNiArMTcsOSBAQCBvYmotJChDT05GSUdfQkxLX0VSUk9SX0lOSkVDVElPTikgKz0gZXJyb3ItaW5qZWN0aW9uLm9cbiBvYmotJChDT05GSUdfQkxLX0RFVl9CU0dfQ09NTU9OKSArPSBic2cub1xuIG9iai0kKENPTkZJR19CTEtfREVWX0JTR0xJQilcdCs9IGJzZy1saWIub1xuIG9iai0kKENPTkZJR19CTEtfQ0dST1VQKVx0Kz0gYmxrLWNncm91cC5vXG4raWZkZWYgQ09ORklHX0JQRl9TWVNDQUxMXG4rb2JqLSQoQ09ORklHX0JMS19DR1JPVVApXHQrPSBicGZfYmxrY2cub1xuK2VuZGlmXG4gb2JqLSQoQ09ORklHX0JMS19DR1JPVVBfUldTVEFUKVx0Kz0gYmxrLWNncm91cC1yd3N0YXQub1xuIG9iai0kKENPTkZJR19CTEtfQ0dST1VQX0ZDX0FQUElEKSArPSBibGstY2dyb3VwLWZjLWFwcGlkLm9cbiBvYmotJChDT05GSUdfQkxLX0RFVl9USFJPVFRMSU5HKVx0Kz0gYmxrLXRocm90dGxlLm9cbmRpZmYgLS1naXQgYS9ibG9jay9ibGstY2dyb3VwLmMgYi9ibG9jay9ibGstY2dyb3VwLmNcbmluZGV4IGQ5Njc2MTI2YzViNWQuLjhkNTM4YWQ0ZTg2MWMgMTAwNjQ0XG4tLS0gYS9ibG9jay9ibGstY2dyb3VwLmNcbisrKyBiL2Jsb2NrL2Jsay1jZ3JvdXAuY1xuQEAgLTEwODYsNyArMTA4Niw3IEBAIHN0YXRpYyB2b2lkIGJsa2NnX3JzdGF0X2ZsdXNoKHN0cnVjdCBjZ3JvdXBfc3Vic3lzX3N0YXRlICpjc3MsIGludCBjcHUpXG4gICogZmx1c2hpbmcgdGhlIHJvb3QgY2dyb3VwJ3Mgc3RhdHMgYnkgZXhwbGljaXRseSBmaWxsaW5nIGluIHRoZSBpb3N0YXRcbiAgKiB3aXRoIGRpc2sgbGV2ZWwgc3RhdGlzdGljcy5cbiAgKi9cbi1zdGF0aWMgdm9pZCBibGtjZ19maWxsX3Jvb3RfaW9zdGF0cyh2b2lkKVxuK3ZvaWQgYmxrY2dfZmlsbF9yb290X2lvc3RhdHModm9pZClcbiB7XG4gXHRzdHJ1Y3QgY2xhc3NfZGV2X2l0ZXIgaXRlcjtcbiBcdHN0cnVjdCBkZXZpY2UgKmRldjtcbmRpZmYgLS1naXQgYS9ibG9jay9ibGstY2dyb3VwLmggYi9ibG9jay9ibGstY2dyb3VwLmhcbmluZGV4IDYxNTM5MGY3NTFhYTIuLjhjOWMyYTFhZGZhYTQgMTAwNjQ0XG4tLS0gYS9ibG9jay9ibGstY2dyb3VwLmhcbisrKyBiL2Jsb2NrL2Jsay1jZ3JvdXAuaFxuQEAgLTIwNSw2ICsyMDUsNyBAQCB2b2lkIGJsa2NnX2RlYWN0aXZhdGVfcG9saWN5KHN0cnVjdCBnZW5kaXNrICpkaXNrLFxuIFx0XHRcdCAgICAgY29uc3Qgc3RydWN0IGJsa2NnX3BvbGljeSAqcG9sKTtcbiBcbiBjb25zdCBjaGFyICpibGtnX2Rldl9uYW1lKHN0cnVjdCBibGtjZ19ncSAqYmxrZyk7XG4rdm9pZCBibGtjZ19maWxsX3Jvb3RfaW9zdGF0cyh2b2lkKTtcbiB2b2lkIGJsa2NnX3ByaW50X2Jsa2dzKHN0cnVjdCBzZXFfZmlsZSAqc2YsIHN0cnVjdCBibGtjZyAqYmxrY2csXG4gXHRcdCAgICAgICB1NjQgKCpwcmZpbGwpKHN0cnVjdCBzZXFfZmlsZSAqLFxuIFx0XHRcdFx0ICAgICBzdHJ1Y3QgYmxrZ19wb2xpY3lfZGF0YSAqLCBpbnQpLFxuZGlmZiAtLWdpdCBhL2Jsb2NrL2JwZl9ibGtjZy5jIGIvYmxvY2svYnBmX2Jsa2NnLmNcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwLi4yNWM4MDlmNTA5MWMyXG4tLS0gL2Rldi9udWxsXG4rKysgYi9ibG9jay9icGZfYmxrY2cuY1xuQEAgLTAsMCArMSwxNTQgQEBcbisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vci1sYXRlclxuKy8qXG4rICogQmxvY2sgSS9PIENvbnRyb2xsZXItcmVsYXRlZCBCUEYga2Z1bmNzIGFuZCBhdXhpbGlhcnkgY29kZVxuKyAqL1xuK1xuKyNpbmNsdWRlIFwiYmxrLWNncm91cC5oXCJcbitcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9icGYuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L2J0Zl9pZHMuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L3JjdWxpc3QuaFx1MDAzZVxuK1xuK19fYnBmX2tmdW5jX3N0YXJ0X2RlZnMoKTtcbitcbisvKipcbisgKiBicGZfYmxrY2dfZmx1c2hfc3RhdHMgLSBGbHVzaCBhIGJsb2NrIGNncm91cCdzIGlvIHN0YXRpc3RpY3NcbisgKiBAY2dycDogY2dyb3VwIHRvIGZsdXNoXG4rICpcbisgKiBQcm9wYWdhdGUgSS9PIHN0YXRpc3RpY3MgdXAgdGhlIGNncm91cCB0cmVlLiBSb290IHN0YXRpc3RpY3MgY29tZSBmcm9tXG4rICogYmxvY2sgZGV2aWNlcyBhbmQgaW5jbHVkZSBhbGwgY2dyb3VwcycgSS9PLlxuKyAqL1xuK19fYnBmX2tmdW5jIHZvaWQgYnBmX2Jsa2NnX2ZsdXNoX3N0YXRzKHN0cnVjdCBjZ3JvdXAgKmNncnApXG4re1xuK1x0c3RydWN0IGNncm91cF9zdWJzeXNfc3RhdGUgKmNzcztcbitcbitcdC8qIFBpbiB0aGUgY3NzIGZvciB0aGUgc2xlZXBhYmxlIGZsdXNoLiAqL1xuK1x0cmN1X3JlYWRfbG9jaygpO1xuK1x0Y3NzID0gY2dyb3VwX2NzcyhjZ3JwLCBcdTAwMjZpb19jZ3JwX3N1YnN5cyk7XG4rXHRpZiAoY3NzIFx1MDAyNlx1MDAyNiAhY3NzX3RyeWdldChjc3MpKVxuK1x0XHRjc3MgPSBOVUxMO1xuK1x0cmN1X3JlYWRfdW5sb2NrKCk7XG4rXG4rXHRpZiAoIWNzcylcbitcdFx0cmV0dXJuO1xuK1xuK1x0aWYgKCFjc3MtXHUwMDNlcGFyZW50KVxuK1x0XHRibGtjZ19maWxsX3Jvb3RfaW9zdGF0cygpO1xuK1x0ZWxzZVxuK1x0XHRjc3NfcnN0YXRfZmx1c2goY3NzKTtcbitcbitcdGNzc19wdXQoY3NzKTtcbit9XG4rXG4rc3RydWN0IGJwZl9pdGVyX2Jsa2cge1xuK1x0X191NjQgX19vcGFxdWVbMl07XG4rfSBfX2FsaWduZWQoOCk7XG4rXG4rc3RydWN0IGJwZl9pdGVyX2Jsa2dfa2VybiB7XG4rXHRzdHJ1Y3QgYmxrY2cgKmJsa2NnO1xuK1x0c3RydWN0IGJsa2NnX2dxICpwb3M7XG4rfSBfX2FsaWduZWQoOCk7XG4rXG4rLyoqXG4rICogYnBmX2l0ZXJfYmxrZ19uZXcgLSBTdGFydCBpdGVyYXRpbmcgYSBibG9jayBjZ3JvdXAncyBwZXItZGV2aWNlIGJsa2dzXG4rICogQGl0OiBpdGVyYXRvciB0byBpbml0aWFsaXplXG4rICogQGNzczogdGhlIGlvIGNvbnRyb2xsZXIncyBjc3NcbisgKlxuKyAqIEVhY2ggYmxrZyBob2xkcyBvbmUgZGV2aWNlJ3MgaW8uc3RhdCBjb3VudGVycy4gT2ZmbGluZSBibGtncyBhcmUgc2tpcHBlZC5cbisgKiBBIGJsa2cgd2l0aG91dCBhIGRpc2sgY2FuIGJlIHJldHVybmVkLiBNdXN0IHJ1biB1bmRlciBSQ1UuXG4rICpcbisgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgLUVJTlZBTCBpZiBAY3NzIGlzIG5vdCB0aGUgaW8gY29udHJvbGxlcidzLlxuKyAqL1xuK19fYnBmX2tmdW5jIGludCBicGZfaXRlcl9ibGtnX25ldyhzdHJ1Y3QgYnBmX2l0ZXJfYmxrZyAqaXQsXG4rXHRcdFx0XHQgIHN0cnVjdCBjZ3JvdXBfc3Vic3lzX3N0YXRlICpjc3MpXG4re1xuK1x0c3RydWN0IGJwZl9pdGVyX2Jsa2dfa2VybiAqa2l0ID0gKHZvaWQgKilpdDtcbitcbitcdEJVSUxEX0JVR19PTihzaXplb2Yoc3RydWN0IGJwZl9pdGVyX2Jsa2dfa2VybikgXHUwMDNlIHNpemVvZihzdHJ1Y3QgYnBmX2l0ZXJfYmxrZykpO1xuK1x0QlVJTERfQlVHX09OKF9fYWxpZ25vZl9fKHN0cnVjdCBicGZfaXRlcl9ibGtnX2tlcm4pICE9XG4rXHRcdCAgICAgX19hbGlnbm9mX18oc3RydWN0IGJwZl9pdGVyX2Jsa2cpKTtcbitcbitcdGtpdC1cdTAwM2Vwb3MgPSBOVUxMO1xuK1xuK1x0aWYgKGNzcy1cdTAwM2VzcyAhPSBcdTAwMjZpb19jZ3JwX3N1YnN5cykge1xuK1x0XHRraXQtXHUwMDNlYmxrY2cgPSBOVUxMO1xuK1x0XHRyZXR1cm4gLUVJTlZBTDtcbitcdH1cbitcbitcdGtpdC1cdTAwM2VibGtjZyA9IGNzc190b19ibGtjZyhjc3MpO1xuK1x0cmV0dXJuIDA7XG4rfVxuK1xuKy8qKlxuKyAqIGJwZl9pdGVyX2Jsa2dfbmV4dCAtIFJldHVybiB0aGUgbmV4dCBvbmxpbmUgYmxrZyBvZiB0aGUgaXRlcmF0ZWQgYmxvY2sgY2dyb3VwXG4rICogQGl0OiBpdGVyYXRvclxuKyAqXG4rICogUmV0dXJuOiB0aGUgbmV4dCBvbmxpbmUgYmxrZywgb3IgTlVMTCB3aGVuIHRoZSB3YWxrIGlzIGRvbmUuXG4rICovXG4rX19icGZfa2Z1bmMgc3RydWN0IGJsa2NnX2dxICpicGZfaXRlcl9ibGtnX25leHQoc3RydWN0IGJwZl9pdGVyX2Jsa2cgKml0KVxuK3tcbitcdHN0cnVjdCBicGZfaXRlcl9ibGtnX2tlcm4gKmtpdCA9ICh2b2lkICopaXQ7XG4rXHRzdHJ1Y3QgYmxrY2dfZ3EgKmJsa2cgPSBraXQtXHUwMDNlcG9zO1xuK1x0c3RydWN0IGhsaXN0X25vZGUgKm5vZGU7XG4rXG4rXHRpZiAoIWtpdC1cdTAwM2VibGtjZylcbitcdFx0cmV0dXJuIE5VTEw7XG4rXG4rXHRpZiAoIWJsa2cpXG4rXHRcdG5vZGUgPSByY3VfZGVyZWZlcmVuY2UoaGxpc3RfZmlyc3RfcmN1KFx1MDAyNmtpdC1cdTAwM2VibGtjZy1cdTAwM2VibGtnX2xpc3QpKTtcbitcdGVsc2VcbitcdFx0bm9kZSA9IHJjdV9kZXJlZmVyZW5jZShobGlzdF9uZXh0X3JjdShcdTAwMjZibGtnLVx1MDAzZWJsa2NnX25vZGUpKTtcbitcbitcdC8qIFNraXAgb2ZmbGluZSBibGtncywgbWF0Y2hpbmcgaW8uc3RhdC4gKi9cbitcdHdoaWxlIChub2RlKSB7XG4rXHRcdGJsa2cgPSBobGlzdF9lbnRyeShub2RlLCBzdHJ1Y3QgYmxrY2dfZ3EsIGJsa2NnX25vZGUpO1xuK1x0XHQvKiBBIHJhY2Ugb25seSBjaGFuZ2VzIHdoZXRoZXIgdGhpcyBibGtnIGlzIHJldHVybmVkLiAqL1xuK1x0XHRpZiAoZGF0YV9yYWNlKGJsa2ctXHUwMDNlb25saW5lKSkge1xuK1x0XHRcdGtpdC1cdTAwM2Vwb3MgPSBibGtnO1xuK1x0XHRcdHJldHVybiBibGtnO1xuK1x0XHR9XG4rXHRcdG5vZGUgPSByY3VfZGVyZWZlcmVuY2UoaGxpc3RfbmV4dF9yY3UoXHUwMDI2YmxrZy1cdTAwM2VibGtjZ19ub2RlKSk7XG4rXHR9XG4rXG4rXHQvKiBUaGUgaXRlcmF0b3IgbXVzdCBrZWVwIHJldHVybmluZyBOVUxMIGFmdGVyIGNvbXBsZXRpb24uICovXG4rXHRraXQtXHUwMDNlcG9zID0gTlVMTDtcbitcdGtpdC1cdTAwM2VibGtjZyA9IE5VTEw7XG4rXHRyZXR1cm4gTlVMTDtcbit9XG4rXG4rLyoqXG4rICogYnBmX2l0ZXJfYmxrZ19kZXN0cm95IC0gVGVhciBkb3duIGEgYmxrZyBpdGVyYXRvclxuKyAqIEBpdDogaXRlcmF0b3JcbisgKi9cbitfX2JwZl9rZnVuYyB2b2lkIGJwZl9pdGVyX2Jsa2dfZGVzdHJveShzdHJ1Y3QgYnBmX2l0ZXJfYmxrZyAqaXQpXG4re1xuK31cbitcbitfX2JwZl9rZnVuY19lbmRfZGVmcygpO1xuK1xuK0JURl9LRlVOQ1NfU1RBUlQoYnBmX2Jsa2NnX2tmdW5jcylcbitCVEZfSURfRkxBR1MoZnVuYywgYnBmX2Jsa2NnX2ZsdXNoX3N0YXRzLCBLRl9TTEVFUEFCTEUpXG4rXG4rQlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9pdGVyX2Jsa2dfbmV3LFxuK1x0ICAgICBLRl9JVEVSX05FVyB8IEtGX1JDVSB8IEtGX1JDVV9QUk9URUNURUQpXG4rQlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9pdGVyX2Jsa2dfbmV4dCwgS0ZfSVRFUl9ORVhUIHwgS0ZfUkVUX05VTEwpXG4rQlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9pdGVyX2Jsa2dfZGVzdHJveSwgS0ZfSVRFUl9ERVNUUk9ZKVxuK0JURl9LRlVOQ1NfRU5EKGJwZl9ibGtjZ19rZnVuY3MpXG4rXG4rc3RhdGljIGNvbnN0IHN0cnVjdCBidGZfa2Z1bmNfaWRfc2V0IGJwZl9ibGtjZ19rZnVuY19zZXQgPSB7XG4rXHQub3duZXJcdFx0PSBUSElTX01PRFVMRSxcbitcdC5zZXRcdFx0PSBcdTAwMjZicGZfYmxrY2dfa2Z1bmNzLFxuK307XG4rXG4rc3RhdGljIGludCBfX2luaXQgYnBmX2Jsa2NnX2luaXQodm9pZClcbit7XG4rXHRpbnQgZXJyO1xuK1xuK1x0ZXJyID0gcmVnaXN0ZXJfYnRmX2tmdW5jX2lkX3NldChCUEZfUFJPR19UWVBFX1VOU1BFQyxcbitcdFx0XHRcdFx0XHUwMDI2YnBmX2Jsa2NnX2tmdW5jX3NldCk7XG4rXHRpZiAoZXJyKVxuK1x0XHRwcl93YXJuKFwiZXJyb3Igd2hpbGUgcmVnaXN0ZXJpbmcgYnBmIGJsa2NnIGtmdW5jczogJWRcXG5cIiwgZXJyKTtcbitcbitcdHJldHVybiBlcnI7XG4rfVxuK2xhdGVfaW5pdGNhbGwoYnBmX2Jsa2NnX2luaXQpO1xuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9jZ3JvdXBfaXRlcl9pby5oIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL2Nncm91cF9pdGVyX2lvLmhcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwLi5mNGJiYWFjY2RmNzE2XG4tLS0gL2Rldi9udWxsXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvY2dyb3VwX2l0ZXJfaW8uaFxuQEAgLTAsMCArMSwxNyBAQFxuKy8qIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wICovXG4rLyogQ29weXJpZ2h0IChjKSAyMDI1IE1ldGEgUGxhdGZvcm1zLCBJbmMuIGFuZCBhZmZpbGlhdGVzLiAqL1xuKyNpZm5kZWYgX19DR1JPVVBfSVRFUl9JT19IXG4rI2RlZmluZSBfX0NHUk9VUF9JVEVSX0lPX0hcbitcbitzdHJ1Y3QgaW9fcXVlcnkge1xuK1x0Lyogb25lIGRldmljZSdzIGlvLnN0YXQgY291bnRlcnMgKi9cbitcdF9fdTY0IHJieXRlcztcbitcdF9fdTY0IHdieXRlcztcbitcdF9fdTY0IHJpb3M7XG4rXHRfX3U2NCB3aW9zO1xuK1x0X191NjQgZGJ5dGVzO1xuK1x0X191NjQgZGlvcztcbitcdF9fdTY0IGRldjtcdC8qIGRldl90IG9mIHRoZSBkZXZpY2UgdGhlIGNvdW50ZXJzIGJlbG9uZyB0byAqL1xuK307XG4rXG4rI2VuZGlmIC8qIF9fQ0dST1VQX0lURVJfSU9fSCAqL1xuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9jb25maWcgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvY29uZmlnXG5pbmRleCBlYTcwNDRmMzBhZGMzLi4yNzBlNmJmOTE5NGQyIDEwMDY0NFxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL2NvbmZpZ1xuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL2NvbmZpZ1xuQEAgLTEsMyArMSw0IEBAXG4rQ09ORklHX0JMS19DR1JPVVA9eVxuIENPTkZJR19CTEtfREVWX0xPT1A9eVxuIENPTkZJR19CT09UUEFSQU1fSEFSRExPQ0tVUF9QQU5JQz15XG4gQ09ORklHX0JPT1RQQVJBTV9TT0ZUTE9DS1VQX1BBTklDPTFcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9jZ3JvdXBfaXRlcl9pby5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvY2dyb3VwX2l0ZXJfaW8uY1xubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAuLjVkMjdlNWQyODM3OTVcbi0tLSAvZGV2L251bGxcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2Nncm91cF9pdGVyX2lvLmNcbkBAIC0wLDAgKzEsMjc3IEBAXG4rLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcbisvKiBDb3B5cmlnaHQgKGMpIDIwMjUgTWV0YSBQbGF0Zm9ybXMsIEluYy4gYW5kIGFmZmlsaWF0ZXMuICovXG4rI2RlZmluZSBfR05VX1NPVVJDRVxuKyNpbmNsdWRlIFx1MDAzY3Rlc3RfcHJvZ3MuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2JwZi9saWJicGYuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2ZjbnRsLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9sb29wLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NzdGRsaWIuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3N0cmluZy5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3lzL2lvY3RsLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NzeXMvc3RhdC5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3lzL3N5c21hY3Jvcy5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjdW5pc3RkLmhcdTAwM2VcbisjaW5jbHVkZSBcImNncm91cF9oZWxwZXJzLmhcIlxuKyNpbmNsdWRlIFwiY2dyb3VwX2l0ZXJfaW8uaFwiXG4rI2luY2x1ZGUgXCJjZ3JvdXBfaXRlcl9pby5za2VsLmhcIlxuK1xuKyNkZWZpbmUgSU9fU0laRSAoNCAqIDEwMjQgKiAxMDI0KVxuK1xuK3N0YXRpYyBpbnQgcmVhZF9zdGF0cyhzdHJ1Y3QgYnBmX2xpbmsgKmxpbmspXG4re1xuK1x0aW50IGZkLCByZXQgPSAwO1xuK1x0c3NpemVfdCBieXRlcztcbitcbitcdGZkID0gYnBmX2l0ZXJfY3JlYXRlKGJwZl9saW5rX19mZChsaW5rKSk7XG4rXHRpZiAoIUFTU0VSVF9PS19GRChmZCwgXCJicGZfaXRlcl9jcmVhdGVcIikpXG4rXHRcdHJldHVybiAxO1xuK1xuK1x0LyogUmVzdWx0cyBsYW5kIGluIHNrZWwtXHUwMDNlZGF0YV9xdWVyeTsgdGhlIHJlYWQgaXRzZWxmIHJldHVybnMgbm8gZGF0YS4gKi9cbitcdGJ5dGVzID0gcmVhZChmZCwgTlVMTCwgMCk7XG4rXHRpZiAoIUFTU0VSVF9FUShieXRlcywgMCwgXCJyZWFkIGZkXCIpKVxuK1x0XHRyZXQgPSAxO1xuK1xuK1x0Y2xvc2UoZmQpO1xuK1x0cmV0dXJuIHJldDtcbit9XG4rXG4rLyogU2V0IHVwIGEgbG9vcCBkZXZpY2UgZm9yIGNncm91cC1jaGFyZ2VkIEkvTy4gKi9cbitzdGF0aWMgaW50IGxvb3Bfc2V0dXAoY2hhciAqbG9vcF9wYXRoLCBzaXplX3Qgc3osIGludCAqY3RsX2ZkLCBpbnQgKmxvb3BfZmQsXG4rXHRcdCAgICAgIGludCAqYmFja19mZClcbit7XG4rXHRjaGFyIGJhY2tfcGF0aFtdID0gXCIvdG1wL2Nncm91cF9pdGVyX2lvLlhYWFhYWFwiO1xuK1x0aW50IG5yO1xuK1xuK1x0KmN0bF9mZCA9ICpsb29wX2ZkID0gKmJhY2tfZmQgPSAtMTtcbitcbitcdCpjdGxfZmQgPSBvcGVuKFwiL2Rldi9sb29wLWNvbnRyb2xcIiwgT19SRFdSIHwgT19DTE9FWEVDKTtcbitcdGlmICgqY3RsX2ZkIFx1MDAzYyAwKVxuK1x0XHRyZXR1cm4gLTE7XG4rXG4rXHRuciA9IGlvY3RsKCpjdGxfZmQsIExPT1BfQ1RMX0dFVF9GUkVFKTtcbitcdGlmIChuciBcdTAwM2MgMClcbitcdFx0Z290byBlcnI7XG4rXHRzbnByaW50Zihsb29wX3BhdGgsIHN6LCBcIi9kZXYvbG9vcCVkXCIsIG5yKTtcbitcbitcdCpiYWNrX2ZkID0gbWtzdGVtcChiYWNrX3BhdGgpO1xuK1x0aWYgKCpiYWNrX2ZkIFx1MDAzYyAwKVxuK1x0XHRnb3RvIGVycjtcbitcdHVubGluayhiYWNrX3BhdGgpO1xuK1x0aWYgKGZ0cnVuY2F0ZSgqYmFja19mZCwgKG9mZl90KUlPX1NJWkUgKiA0KSlcbitcdFx0Z290byBlcnI7XG4rXG4rXHQqbG9vcF9mZCA9IG9wZW4obG9vcF9wYXRoLCBPX1JEV1IgfCBPX0NMT0VYRUMpO1xuK1x0aWYgKCpsb29wX2ZkIFx1MDAzYyAwKVxuK1x0XHRnb3RvIGVycjtcbitcdGlmIChpb2N0bCgqbG9vcF9mZCwgTE9PUF9TRVRfRkQsICpiYWNrX2ZkKSlcbitcdFx0Z290byBlcnI7XG4rXG4rXHRyZXR1cm4gMDtcbitlcnI6XG4rXHRpZiAoKmxvb3BfZmQgXHUwMDNlPSAwKVxuK1x0XHRjbG9zZSgqbG9vcF9mZCk7XG4rXHRpZiAoKmJhY2tfZmQgXHUwMDNlPSAwKVxuK1x0XHRjbG9zZSgqYmFja19mZCk7XG4rXHRjbG9zZSgqY3RsX2ZkKTtcbitcdCpjdGxfZmQgPSAqbG9vcF9mZCA9ICpiYWNrX2ZkID0gLTE7XG4rXHRyZXR1cm4gLTE7XG4rfVxuK1xuK3N0YXRpYyB2b2lkIGxvb3BfdGVhcmRvd24oY29uc3QgY2hhciAqbG9vcF9wYXRoLCBpbnQgY3RsX2ZkLCBpbnQgbG9vcF9mZCxcbitcdFx0XHQgIGludCBiYWNrX2ZkKVxuK3tcbitcdGludCBuciA9IC0xO1xuK1xuK1x0aWYgKGxvb3BfZmQgXHUwMDNlPSAwKSB7XG4rXHRcdGlvY3RsKGxvb3BfZmQsIExPT1BfQ0xSX0ZELCAwKTtcbitcdFx0Y2xvc2UobG9vcF9mZCk7XG4rXHR9XG4rXHRpZiAoYmFja19mZCBcdTAwM2U9IDApXG4rXHRcdGNsb3NlKGJhY2tfZmQpO1xuK1x0aWYgKGN0bF9mZCBcdTAwM2U9IDApIHtcbitcdFx0aWYgKHNzY2FuZihsb29wX3BhdGgsIFwiL2Rldi9sb29wJWRcIiwgXHUwMDI2bnIpID09IDEgXHUwMDI2XHUwMDI2IG5yIFx1MDAzZT0gMClcbitcdFx0XHRpb2N0bChjdGxfZmQsIExPT1BfQ1RMX1JFTU9WRSwgbnIpO1xuK1x0XHRjbG9zZShjdGxfZmQpO1xuK1x0fVxuK31cbitcbisvKiBPX0RJUkVDVCBrZWVwcyBJL08gY2hhcmdlZCB0byB0aGUgY3VycmVudCBjZ3JvdXAuICovXG4rc3RhdGljIGludCBkb19kaXJlY3RfaW8oY29uc3QgY2hhciAqbG9vcF9wYXRoKVxuK3tcbitcdHZvaWQgKmJ1ZjtcbitcdGludCBmZCwgcmV0ID0gLTE7XG4rXG4rXHRmZCA9IG9wZW4obG9vcF9wYXRoLCBPX1JEV1IgfCBPX0RJUkVDVCB8IE9fQ0xPRVhFQyk7XG4rXHRpZiAoZmQgXHUwMDNjIDApXG4rXHRcdHJldHVybiAtMTtcbitcdGlmIChwb3NpeF9tZW1hbGlnbihcdTAwMjZidWYsIDQwOTYsIElPX1NJWkUpKVxuK1x0XHRnb3RvIG91dF9mZDtcbitcdG1lbXNldChidWYsIDB4YWIsIElPX1NJWkUpO1xuK1xuK1x0aWYgKHB3cml0ZShmZCwgYnVmLCBJT19TSVpFLCAwKSAhPSBJT19TSVpFKVxuK1x0XHRnb3RvIG91dF9idWY7XG4rXHRmc3luYyhmZCk7XG4rXHRpZiAocHJlYWQoZmQsIGJ1ZiwgSU9fU0laRSwgMCkgIT0gSU9fU0laRSlcbitcdFx0Z290byBvdXRfYnVmO1xuK1x0cmV0ID0gMDtcbitvdXRfYnVmOlxuK1x0ZnJlZShidWYpO1xuK291dF9mZDpcbitcdGNsb3NlKGZkKTtcbitcdHJldHVybiByZXQ7XG4rfVxuK1xuKy8qIFJlYWQgQGRldidzIGlvLnN0YXQgY291bnRlcnMuIEBkZXYgdXNlcyBrZXJuZWwgZGV2X3QgZW5jb2RpbmcuICovXG4rc3RhdGljIGludCBwYXJzZV9pb19zdGF0KGludCBjZ3JvdXBfZmQsIF9fdTY0IGRldiwgc3RydWN0IGlvX3F1ZXJ5ICpvdXQpXG4re1xuK1x0dW5zaWduZWQgaW50IHdhbnRfbWFqID0gZGV2IFx1MDAzZVx1MDAzZSAyMCwgd2FudF9taW4gPSBkZXYgXHUwMDI2ICgoMVUgXHUwMDNjXHUwMDNjIDIwKSAtIDEpO1xuK1x0Y2hhciBidWZbNDA5Nl0sICpsaW5lLCAqc2F2ZXB0cjtcbitcdGludCBmZCwgbiwgcmV0ID0gLTE7XG4rXG4rXHRmZCA9IG9wZW5hdChjZ3JvdXBfZmQsIFwiaW8uc3RhdFwiLCBPX1JET05MWSk7XG4rXHRpZiAoZmQgXHUwMDNjIDApXG4rXHRcdHJldHVybiAtMTtcbitcdG4gPSByZWFkKGZkLCBidWYsIHNpemVvZihidWYpIC0gMSk7XG4rXHRjbG9zZShmZCk7XG4rXHRpZiAobiBcdTAwM2M9IDApXG4rXHRcdHJldHVybiAtMTtcbitcdGJ1ZltuXSA9ICdcXDAnO1xuK1xuK1x0Zm9yIChsaW5lID0gc3RydG9rX3IoYnVmLCBcIlxcblwiLCBcdTAwMjZzYXZlcHRyKTsgbGluZTtcbitcdCAgICAgbGluZSA9IHN0cnRva19yKE5VTEwsIFwiXFxuXCIsIFx1MDAyNnNhdmVwdHIpKSB7XG4rXHRcdHVuc2lnbmVkIGxvbmcgbG9uZyByYiA9IDAsIHdiID0gMCwgcmkgPSAwLCB3aSA9IDAsIGRiID0gMCwgZGkgPSAwO1xuK1x0XHR1bnNpZ25lZCBpbnQgbWFqLCBtaW47XG4rXG4rXHRcdC8qIE9ubHkgdGhlIGRldmljZSBpZCBpcyByZXF1aXJlZDsgbWlzc2luZyBjb3VudGVycyBzdGF5IHplcm8uICovXG4rXHRcdGlmIChzc2NhbmYobGluZSxcbitcdFx0XHQgICBcIiV1OiV1IHJieXRlcz0lbGx1IHdieXRlcz0lbGx1IHJpb3M9JWxsdSB3aW9zPSVsbHUgZGJ5dGVzPSVsbHUgZGlvcz0lbGx1XCIsXG4rXHRcdFx0ICAgXHUwMDI2bWFqLCBcdTAwMjZtaW4sIFx1MDAyNnJiLCBcdTAwMjZ3YiwgXHUwMDI2cmksIFx1MDAyNndpLCBcdTAwMjZkYiwgXHUwMDI2ZGkpIFx1MDAzYyAyKVxuK1x0XHRcdGNvbnRpbnVlO1xuK1x0XHRpZiAobWFqICE9IHdhbnRfbWFqIHx8IG1pbiAhPSB3YW50X21pbilcbitcdFx0XHRjb250aW51ZTtcbitcbitcdFx0b3V0LVx1MDAzZXJieXRlcyA9IHJiO1xuK1x0XHRvdXQtXHUwMDNld2J5dGVzID0gd2I7XG4rXHRcdG91dC1cdTAwM2VyaW9zID0gcmk7XG4rXHRcdG91dC1cdTAwM2V3aW9zID0gd2k7XG4rXHRcdG91dC1cdTAwM2VkYnl0ZXMgPSBkYjtcbitcdFx0b3V0LVx1MDAzZWRpb3MgPSBkaTtcbitcdFx0cmV0ID0gMDtcbitcdFx0YnJlYWs7XG4rXHR9XG4rXHRyZXR1cm4gcmV0O1xuK31cbitcbit2b2lkIHRlc3RfY2dyb3VwX2l0ZXJfaW8odm9pZClcbit7XG4rXHRjaGFyICpjZ3JvdXBfcmVsX3BhdGggPSBcIi9jZ3JvdXBfaXRlcl9pb190ZXN0XCI7XG4rXHRpbnQgY3RsX2ZkID0gLTEsIGxvb3BfZmQgPSAtMSwgYmFja19mZCA9IC0xO1xuK1x0c3RydWN0IGNncm91cF9pdGVyX2lvICpza2VsID0gTlVMTDtcbitcdHN0cnVjdCBicGZfbGluayAqbGluayA9IE5VTEw7XG4rXHRjaGFyIGxvb3BfcGF0aFs2NF07XG4rXHRzdHJ1Y3QgaW9fcXVlcnkgKnE7XG4rXHRpbnQgY2dyb3VwX2ZkO1xuK1xuK1x0Y2dyb3VwX2ZkID0gY2dyb3VwX3NldHVwX2FuZF9qb2luKGNncm91cF9yZWxfcGF0aCk7XG4rXHRpZiAoIUFTU0VSVF9PS19GRChjZ3JvdXBfZmQsIFwiY2dyb3VwX3NldHVwX2FuZF9qb2luXCIpKVxuK1x0XHRyZXR1cm47XG4rXG4rXHRpZiAobG9vcF9zZXR1cChsb29wX3BhdGgsIHNpemVvZihsb29wX3BhdGgpLCBcdTAwMjZjdGxfZmQsIFx1MDAyNmxvb3BfZmQsIFx1MDAyNmJhY2tfZmQpKSB7XG4rXHRcdHRlc3RfX3NraXAoKTtcdC8qIG5lZWRzIHJvb3QgKyBDT05GSUdfQkxLX0RFVl9MT09QICovXG4rXHRcdGdvdG8gY2xlYW51cF9jZ3JvdXBfZmQ7XG4rXHR9XG4rXG4rXHRza2VsID0gY2dyb3VwX2l0ZXJfaW9fX29wZW5fYW5kX2xvYWQoKTtcbitcdGlmICghQVNTRVJUX09LX1BUUihza2VsLCBcImNncm91cF9pdGVyX2lvX19vcGVuX2FuZF9sb2FkXCIpKVxuK1x0XHRnb3RvIGNsZWFudXBfbG9vcDtcbitcbitcdC8qIENvbnZlcnQgZ2xpYmMgc3RfcmRldiB0byBrZXJuZWwgZGV2X3QgZm9ybWF0LiAqL1xuK1x0e1xuK1x0XHRzdHJ1Y3Qgc3RhdCBsc3Q7XG4rXG4rXHRcdGlmICghQVNTRVJUX09LKGZzdGF0KGxvb3BfZmQsIFx1MDAyNmxzdCksIFwiZnN0YXQgbG9vcFwiKSlcbitcdFx0XHRnb3RvIGNsZWFudXBfc2tlbDtcbitcdFx0c2tlbC1cdTAwM2VkYXRhX3F1ZXJ5LVx1MDAzZXRhcmdldF9kZXYgPVxuK1x0XHRcdCgoX191NjQpbWFqb3IobHN0LnN0X3JkZXYpIFx1MDAzY1x1MDAzYyAyMCkgfCBtaW5vcihsc3Quc3RfcmRldik7XG4rXHR9XG4rXG4rXHRERUNMQVJFX0xJQkJQRl9PUFRTKGJwZl9pdGVyX2F0dGFjaF9vcHRzLCBvcHRzKTtcbitcdHVuaW9uIGJwZl9pdGVyX2xpbmtfaW5mbyBsaW5mbyA9IHtcbitcdFx0LmNncm91cC5jZ3JvdXBfZmQgPSBjZ3JvdXBfZmQsXG4rXHRcdC5jZ3JvdXAub3JkZXIgPSBCUEZfQ0dST1VQX0lURVJfU0VMRl9PTkxZLFxuK1x0fTtcbitcdG9wdHMubGlua19pbmZvID0gXHUwMDI2bGluZm87XG4rXHRvcHRzLmxpbmtfaW5mb19sZW4gPSBzaXplb2YobGluZm8pO1xuK1xuK1x0bGluayA9IGJwZl9wcm9ncmFtX19hdHRhY2hfaXRlcihza2VsLVx1MDAzZXByb2dzLmNncm91cF9pb19xdWVyeSwgXHUwMDI2b3B0cyk7XG4rXHRpZiAoIUFTU0VSVF9PS19QVFIobGluaywgXCJicGZfcHJvZ3JhbV9fYXR0YWNoX2l0ZXJcIikpXG4rXHRcdGdvdG8gY2xlYW51cF9za2VsO1xuK1xuK1x0LyogVGhpcyBwcm9jZXNzIGlzIGluIHRoZSB0ZXN0IGNncm91cCwgc28gdGhlIGxvb3AgSS9PIGlzIGNoYXJnZWQgaGVyZS4gKi9cbitcdGlmICghQVNTRVJUX09LKGRvX2RpcmVjdF9pbyhsb29wX3BhdGgpLCBcImRvX2RpcmVjdF9pb1wiKSlcbitcdFx0Z290byBjbGVhbnVwX2xpbms7XG4rXG4rXHRpZiAoIUFTU0VSVF9PSyhyZWFkX3N0YXRzKGxpbmspLCBcInJlYWQgc3RhdHNcIikpXG4rXHRcdGdvdG8gY2xlYW51cF9saW5rO1xuK1xuK1x0cSA9IFx1MDAyNnNrZWwtXHUwMDNlZGF0YV9xdWVyeS1cdTAwM2Vpb19xdWVyeTtcbitcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwiY2dyb3VwX2l0ZXJfaW9fX3dyaXRlXCIpKSB7XG4rXHRcdEFTU0VSVF9HVChxLVx1MDAzZXdieXRlcywgMCwgXCJ3Ynl0ZXNcIik7XG4rXHRcdEFTU0VSVF9HVChxLVx1MDAzZXdpb3MsIDAsIFwid2lvc1wiKTtcbitcdH1cbitcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwiY2dyb3VwX2l0ZXJfaW9fX3JlYWRcIikpIHtcbitcdFx0QVNTRVJUX0dUKHEtXHUwMDNlcmJ5dGVzLCAwLCBcInJieXRlc1wiKTtcbitcdFx0QVNTRVJUX0dUKHEtXHUwMDNlcmlvcywgMCwgXCJyaW9zXCIpO1xuK1x0fVxuK1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCJjZ3JvdXBfaXRlcl9pb19fZGV2XCIpKVxuK1x0XHRBU1NFUlRfR1QocS1cdTAwM2VkZXYsIDAsIFwiZGV2XCIpO1xuK1xuK1x0LyogQ29tcGFyZSB3aXRoIGlvLnN0YXQgd2l0aG91dCBJL08gYmV0d2VlbiB0aGUgcmVhZHMuICovXG4rXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcImNncm91cF9pdGVyX2lvX19tYXRjaFwiKSkge1xuK1x0XHRzdHJ1Y3QgaW9fcXVlcnkgZmlsZXYgPSB7fTtcbitcbitcdFx0aWYgKEFTU0VSVF9PSyhyZWFkX3N0YXRzKGxpbmspLCBcInJlYWQgc3RhdHNcIikgXHUwMDI2XHUwMDI2XG4rXHRcdCAgICBBU1NFUlRfT0socGFyc2VfaW9fc3RhdChjZ3JvdXBfZmQsIHEtXHUwMDNlZGV2LCBcdTAwMjZmaWxldiksXG4rXHRcdFx0ICAgICAgXCJwYXJzZSBpby5zdGF0XCIpKSB7XG4rXHRcdFx0QVNTRVJUX0VRKHEtXHUwMDNlcmJ5dGVzLCBmaWxldi5yYnl0ZXMsIFwicmJ5dGVzXCIpO1xuK1x0XHRcdEFTU0VSVF9FUShxLVx1MDAzZXdieXRlcywgZmlsZXYud2J5dGVzLCBcIndieXRlc1wiKTtcbitcdFx0XHRBU1NFUlRfRVEocS1cdTAwM2VyaW9zLCBmaWxldi5yaW9zLCBcInJpb3NcIik7XG4rXHRcdFx0QVNTRVJUX0VRKHEtXHUwMDNld2lvcywgZmlsZXYud2lvcywgXCJ3aW9zXCIpO1xuK1x0XHRcdEFTU0VSVF9FUShxLVx1MDAzZWRieXRlcywgZmlsZXYuZGJ5dGVzLCBcImRieXRlc1wiKTtcbitcdFx0XHRBU1NFUlRfRVEocS1cdTAwM2VkaW9zLCBmaWxldi5kaW9zLCBcImRpb3NcIik7XG4rXHRcdH1cbitcdH1cbitcbitcdC8qIFJvb3Qgc3RhdGlzdGljcyBpbmNsdWRlIHRoaXMgY2dyb3VwJ3MgSS9PLiAqL1xuK1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCJjZ3JvdXBfaXRlcl9pb19fcm9vdFwiKSkge1xuK1x0XHRzdHJ1Y3QgYnBmX2xpbmsgKnJvb3RfbGluaztcbitcdFx0c3RydWN0IGlvX3F1ZXJ5ICpyO1xuK1xuK1x0XHRza2VsLVx1MDAzZWRhdGFfcXVlcnktXHUwMDNlZ290X3Jvb3RfY3NzID0gMDtcbitcdFx0cm9vdF9saW5rID0gYnBmX3Byb2dyYW1fX2F0dGFjaF9pdGVyKHNrZWwtXHUwMDNlcHJvZ3MuY2dyb3VwX3Jvb3RfaW9fcXVlcnksXG4rXHRcdFx0XHRcdFx0ICAgICBcdTAwMjZvcHRzKTtcbitcdFx0aWYgKEFTU0VSVF9PS19QVFIocm9vdF9saW5rLCBcImF0dGFjaCByb290IGl0ZXJcIikpIHtcbitcdFx0XHRpZiAoQVNTRVJUX09LKHJlYWRfc3RhdHMocm9vdF9saW5rKSwgXCJyZWFkIHJvb3Qgc3RhdHNcIikpIHtcbitcdFx0XHRcdHIgPSBcdTAwMjZza2VsLVx1MDAzZWRhdGFfcXVlcnktXHUwMDNlcm9vdF9xdWVyeTtcbitcdFx0XHRcdEFTU0VSVF9FUShza2VsLVx1MDAzZWRhdGFfcXVlcnktXHUwMDNlZ290X3Jvb3RfY3NzLCAxLFxuK1x0XHRcdFx0XHQgIFwiZ290X3Jvb3RfY3NzXCIpO1xuK1x0XHRcdFx0QVNTRVJUX0VRKHItXHUwMDNlZGV2LCBxLVx1MDAzZWRldiwgXCJyb290IGRldlwiKTtcbitcdFx0XHRcdEFTU0VSVF9HRShyLVx1MDAzZXdieXRlcywgcS1cdTAwM2V3Ynl0ZXMsIFwicm9vdCB3Ynl0ZXNcIik7XG4rXHRcdFx0XHRBU1NFUlRfR0Uoci1cdTAwM2V3aW9zLCBxLVx1MDAzZXdpb3MsIFwicm9vdCB3aW9zXCIpO1xuK1x0XHRcdFx0QVNTRVJUX0dFKHItXHUwMDNlcmJ5dGVzLCBxLVx1MDAzZXJieXRlcywgXCJyb290IHJieXRlc1wiKTtcbitcdFx0XHRcdEFTU0VSVF9HRShyLVx1MDAzZXJpb3MsIHEtXHUwMDNlcmlvcywgXCJyb290IHJpb3NcIik7XG4rXHRcdFx0fVxuK1x0XHRcdGJwZl9saW5rX19kZXN0cm95KHJvb3RfbGluayk7XG4rXHRcdH1cbitcdH1cbitcbitjbGVhbnVwX2xpbms6XG4rXHRicGZfbGlua19fZGVzdHJveShsaW5rKTtcbitjbGVhbnVwX3NrZWw6XG4rXHRjZ3JvdXBfaXRlcl9pb19fZGVzdHJveShza2VsKTtcbitjbGVhbnVwX2xvb3A6XG4rXHRsb29wX3RlYXJkb3duKGxvb3BfcGF0aCwgY3RsX2ZkLCBsb29wX2ZkLCBiYWNrX2ZkKTtcbitjbGVhbnVwX2Nncm91cF9mZDpcbitcdGNsb3NlKGNncm91cF9mZCk7XG4rXHRjbGVhbnVwX2Nncm91cF9lbnZpcm9ubWVudCgpO1xuK31cbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvY2dyb3VwX2l0ZXJfaW8uYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9jZ3JvdXBfaXRlcl9pby5jXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uMmNkNTM4MDY4OTg3YVxuLS0tIC9kZXYvbnVsbFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL2Nncm91cF9pdGVyX2lvLmNcbkBAIC0wLDAgKzEsOTkgQEBcbisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxuKy8qIENvcHlyaWdodCAoYykgMjAyNSBNZXRhIFBsYXRmb3JtcywgSW5jLiBhbmQgYWZmaWxpYXRlcy4gKi9cbisjaW5jbHVkZSBcdTAwM2N2bWxpbnV4LmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NicGYvYnBmX2hlbHBlcnMuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2JwZi9icGZfY29yZV9yZWFkLmhcdTAwM2VcbisjaW5jbHVkZSBcImJwZl9leHBlcmltZW50YWwuaFwiXG4rI2luY2x1ZGUgXCJjZ3JvdXBfaXRlcl9pby5oXCJcbitcbitjaGFyIF9saWNlbnNlW10gU0VDKFwibGljZW5zZVwiKSA9IFwiR1BMXCI7XG4rXG4rc3RydWN0IGlvX3F1ZXJ5IGlvX3F1ZXJ5IFNFQyhcIi5kYXRhLnF1ZXJ5XCIpO1xuK1xuK3N0cnVjdCBpb19xdWVyeSByb290X3F1ZXJ5IFNFQyhcIi5kYXRhLnF1ZXJ5XCIpO1xuK1xuK19fdTY0IGdvdF9yb290X2NzcyBTRUMoXCIuZGF0YS5xdWVyeVwiKTtcbitcbisvKiBEZXZpY2Ugc2VsZWN0ZWQgYnkgdXNlcnNwYWNlIGluIGtlcm5lbCBkZXZfdCBmb3JtYXQuICovXG4rX191NjQgdGFyZ2V0X2RldiBTRUMoXCIuZGF0YS5xdWVyeVwiKTtcbitcbisvKiBLZWVwIGlubGluZTogUkNVIGFuZCBvcGVuLWNvZGVkIGl0ZXJhdG9ycyBjYW5ub3QgY3Jvc3MgYSBCUEYgY2FsbC4gKi9cbitzdGF0aWMgX19hbHdheXNfaW5saW5lIGludCByZWFkX3RhcmdldF9kZXYoc3RydWN0IGNncm91cCAqY2dycCxcbitcdFx0XHRcdFx0ICAgc3RydWN0IGlvX3F1ZXJ5ICpvdXQpXG4re1xuK1x0c3RydWN0IGNncm91cF9zdWJzeXNfc3RhdGUgKmNzcztcbitcdHN0cnVjdCBibGtjZ19ncSAqcG9zO1xuK1x0X191NjQgZGV2O1xuK1x0aW50IHNzaWQ7XG4rXG4rXHQvKiBUaGUgZmx1c2ggY2FuIHNsZWVwLCBzbyBydW4gaXQgYmVmb3JlIHRoZSBSQ1Ugc2VjdGlvbi4gKi9cbitcdGJwZl9ibGtjZ19mbHVzaF9zdGF0cyhjZ3JwKTtcbitcbitcdGJwZl9yY3VfcmVhZF9sb2NrKCk7XG4rXHRzc2lkID0gYnBmX2NvcmVfZW51bV92YWx1ZShlbnVtIGNncm91cF9zdWJzeXNfaWQsIGlvX2NncnBfaWQpO1xuK1xuK1x0LypcbitcdCAqIHN1YnN5c1tdIGlzIF9fcmN1LCBzbyB0aGlzIHJlYWQgZ2l2ZXMgYW4gUkNVIHBvaW50ZXIgdGhlIGl0ZXJhdG9yXG4rXHQgKiBhY2NlcHRzLiBCUEZfQ09SRV9SRUFEKCkgd291bGQgcmV0dXJuIGEgcGxhaW4gdmFsdWUgaW5zdGVhZC5cbitcdCAqL1xuK1x0Y3NzID0gY2dycC1cdTAwM2VzdWJzeXNbc3NpZF07XG4rXHRpZiAoIWNzcykge1xuK1x0XHRicGZfcmN1X3JlYWRfdW5sb2NrKCk7XG4rXHRcdHJldHVybiAwO1xuK1x0fVxuK1xuK1x0YnBmX2Zvcl9lYWNoKGJsa2csIHBvcywgY3NzKSB7XG4rXHRcdGRldiA9IEJQRl9DT1JFX1JFQUQocG9zLCBxLCBkaXNrLCBwYXJ0MCwgYmRfZGV2KTtcbitcdFx0aWYgKGRldiAhPSB0YXJnZXRfZGV2KVxuK1x0XHRcdGNvbnRpbnVlO1xuK1xuK1x0XHRvdXQtXHUwMDNlZGV2ID0gZGV2O1xuK1x0XHRvdXQtXHUwMDNlcmJ5dGVzID0gQlBGX0NPUkVfUkVBRChwb3MsIGlvc3RhdC5jdXIuYnl0ZXNbQkxLR19JT1NUQVRfUkVBRF0pO1xuK1x0XHRvdXQtXHUwMDNld2J5dGVzID0gQlBGX0NPUkVfUkVBRChwb3MsIGlvc3RhdC5jdXIuYnl0ZXNbQkxLR19JT1NUQVRfV1JJVEVdKTtcbitcdFx0b3V0LVx1MDAzZXJpb3MgPSBCUEZfQ09SRV9SRUFEKHBvcywgaW9zdGF0LmN1ci5pb3NbQkxLR19JT1NUQVRfUkVBRF0pO1xuK1x0XHRvdXQtXHUwMDNld2lvcyA9IEJQRl9DT1JFX1JFQUQocG9zLCBpb3N0YXQuY3VyLmlvc1tCTEtHX0lPU1RBVF9XUklURV0pO1xuK1x0XHRvdXQtXHUwMDNlZGJ5dGVzID0gQlBGX0NPUkVfUkVBRChwb3MsIGlvc3RhdC5jdXIuYnl0ZXNbQkxLR19JT1NUQVRfRElTQ0FSRF0pO1xuK1x0XHRvdXQtXHUwMDNlZGlvcyA9IEJQRl9DT1JFX1JFQUQocG9zLCBpb3N0YXQuY3VyLmlvc1tCTEtHX0lPU1RBVF9ESVNDQVJEXSk7XG4rXHRcdGJyZWFrO1xuK1x0fVxuK1x0YnBmX3JjdV9yZWFkX3VubG9jaygpO1xuK1x0cmV0dXJuIDE7XG4rfVxuK1xuK1NFQyhcIml0ZXIucy9jZ3JvdXBcIilcbitpbnQgY2dyb3VwX2lvX3F1ZXJ5KHN0cnVjdCBicGZfaXRlcl9fY2dyb3VwICpjdHgpXG4re1xuK1x0c3RydWN0IGNncm91cCAqY2dycCA9IGN0eC1cdTAwM2VjZ3JvdXA7XG4rXG4rXHRpZiAoIWNncnApXG4rXHRcdHJldHVybiAxO1xuK1xuK1x0LyogU3RhcnQgZnJlc2ggc28gYSBkZXZpY2UgdGhhdCBpcyBub3QgZm91bmQgc3RheXMgYWxsLXplcm8uICovXG4rXHRfX2J1aWx0aW5fbWVtc2V0KFx1MDAyNmlvX3F1ZXJ5LCAwLCBzaXplb2YoaW9fcXVlcnkpKTtcbitcbitcdHJlYWRfdGFyZ2V0X2RldihjZ3JwLCBcdTAwMjZpb19xdWVyeSk7XG4rXHRyZXR1cm4gMDtcbit9XG4rXG4rU0VDKFwiaXRlci5zL2Nncm91cFwiKVxuK2ludCBjZ3JvdXBfcm9vdF9pb19xdWVyeShzdHJ1Y3QgYnBmX2l0ZXJfX2Nncm91cCAqY3R4KVxuK3tcbitcdHN0cnVjdCBjZ3JvdXAgKnJvb3Q7XG4rXG4rXHRpZiAoIWN0eC1cdTAwM2VjZ3JvdXApXG4rXHRcdHJldHVybiAxO1xuK1xuK1x0X19idWlsdGluX21lbXNldChcdTAwMjZyb290X3F1ZXJ5LCAwLCBzaXplb2Yocm9vdF9xdWVyeSkpO1xuK1xuK1x0LyogVGhlIHJvb3QgY2dyb3VwIGFsd2F5cyBoYXMgaWQgMS4gKi9cbitcdHJvb3QgPSBicGZfY2dyb3VwX2Zyb21faWQoMSk7XG4rXHRpZiAoIXJvb3QpXG4rXHRcdHJldHVybiAwO1xuK1xuK1x0LyogUm9vdCBjb3VudGVycyBpbmNsdWRlIGFsbCBjZ3JvdXBzJyBJL08uICovXG4rXHRpZiAocmVhZF90YXJnZXRfZGV2KHJvb3QsIFx1MDAyNnJvb3RfcXVlcnkpKVxuK1x0XHRnb3Rfcm9vdF9jc3MgPSAxO1xuK1xuK1x0YnBmX2Nncm91cF9yZWxlYXNlKHJvb3QpO1xuK1x0cmV0dXJuIDA7XG4rfVxuIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTdUMjI6MzQ6MzUuNzY5NzAyODI2WiIsIlNlcSI6MywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NjkwNTUxMjkzNywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipGdXp6aW5nIE5ldyBCUEYgS2Z1bmNzIGZvciBCbG9jayBDZ3JvdXAgSS9PIFN0YXRpc3RpY3MqKlxuXG5Pa2F5LCBzbyB0aGVyZSdzIGEgcGF0Y2ggaW50cm9kdWNpbmcgQlBGIGtmdW5jcyBmb3IgYmxvY2sgY2dyb3VwIEkvTyBzdGF0aXN0aWNzLiBNeSBpbml0aWFsIHRob3VnaHQgaXMsIFwiSXMgdGhpcyBmdXp6YWJsZT9cIiBUaGUgYW5zd2VyIGlzIGEgY2xlYXIgeWVzLCBiZWNhdXNlIHdlJ3JlIHRhbGtpbmcgYWJvdXQgKm5ldyogQlBGIGtmdW5jcyB0aGF0IGFyZSBub3cgYWNjZXNzaWJsZSBmcm9tIEJQRiBwcm9ncmFtcy4gVGhpcyBvcGVucyB1cCBhIG5ldyBhdHRhY2sgc3VyZmFjZSwgYW5kIHRoYXTigJlzIHByZWNpc2VseSB3aGF0IEknbSBpbnRlcmVzdGVkIGluIGZvciBmdXp6aW5nLlxuXG5UaGVzZSBuZXcga2Z1bmNzIGFyZTogYGJwZl9ibGtjZ19mbHVzaF9zdGF0c2AsIGBicGZfaXRlcl9ibGtnX25ld2AsIGBicGZfaXRlcl9ibGtnX25leHRgLCBhbmQgYGJwZl9pdGVyX2Jsa2dfZGVzdHJveWAuIExldCdzIHRha2UgYSBxdWljayBsb29rIGluc2lkZSBgYmxvY2svYnBmX2Jsa2NnLmNgIGp1c3QgdG8gbWFrZSBzdXJlIHdlIGhhdmVuJ3QgbWlzc2VkIGFueXRoaW5nIGVsc2UgaW4gdGhlcmUuIE5vcGUsIHRob3NlIGFyZSB0aGUgb25seSBmb3VyIGZ1bmN0aW9ucy4gSG9sZCBvbiwgYGJwZl9pdGVyX2Jsa2dfZGVzdHJveWAgaXMgKmVtcHR5Ki4gSXQncyBzdGlsbCB3b3J0aCBhZGRpbmcsIGJ1dCB0aGUgb3RoZXIgdGhyZWUgYXJlIGdvaW5nIHRvIGJlIG1vcmUgaW50ZXJlc3RpbmcgZm9yIGZ1enppbmcuXG5cbk15IG5leHQgc3RlcCBpcyB0byBuYWlsIGRvd24gdGhlIGNvbmZpZ3VyYXRpb24gcHJlcmVxdWlzaXRlcy4gV2UgbmVlZCBgQ09ORklHX0JQRl9TWVNDQUxMYCBhbmQgYENPTkZJR19CTEtfQ0dST1VQYCB0byBhY3R1YWxseSBoYXZlIGBicGZfYmxrY2cub2AgYnVpbHQuIE5vdywganVzdCB0byBtYWtlIHN1cmUsIGxldCBtZSBkb3VibGUtY2hlY2sgdGhlIGBLY29uZmlnYCBmb3IgYEJMS19DR1JPVVBgLiBBbHJpZ2h0LCBpdCBsb29rcyBsaWtlIGBCTEtfQ0dST1VQYCBkZXBlbmRzIG9uIGJvdGggYENHUk9VUFNgIGFuZCBgQkxPQ0tgLiBUaW1lIHRvIGZpcmUgdXAgYGdyZXBwZXJgIGFuZCBzZWUgd2hhdCBlbHNlIHdlIGNhbiB1bmNvdmVyIVxuXG5cbiIsIklucHV0VG9rZW5zIjo5Njc1LCJPdXRwdXRUb2tlbnMiOjIxLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NjA4LCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTdUMjI6MzQ6NDIuNjc1MjE5MjYzWiIsIlNlcSI6NCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE1MTQ3MzY1MDQsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiY29uZmlnIEJMS19DR1JPVVBcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiYmxvY2svS2NvbmZpZz0zOT1jb25maWcgQkxLX1JRX0FMTE9DX1RJTUVcXG4tLVxcbmJsb2NrL0tjb25maWctNDEtXFxuYmxvY2svS2NvbmZpZzo0Mjpjb25maWcgQkxLX0NHUk9VUF9SV1NUQVRcXG5ibG9jay9LY29uZmlnLTQzLVxcdGJvb2xcXG5ibG9jay9LY29uZmlnLTQ0LVxcbmJsb2NrL0tjb25maWc6NDU6Y29uZmlnIEJMS19DR1JPVVBfUFVOVF9CSU9cXG5ibG9jay9LY29uZmlnLTQ2LVxcdGJvb2xcXG4tLVxcbmJsb2NrL0tjb25maWc9MTI3PWNvbmZpZyBCTEtfV0JUX01RXFxuLS1cXG5ibG9jay9LY29uZmlnLTEzMy1cXG5ibG9jay9LY29uZmlnOjEzNDpjb25maWcgQkxLX0NHUk9VUF9JT0xBVEVOQ1lcXG5ibG9jay9LY29uZmlnLTEzNS1cXHRib29sIFxcXCJFbmFibGUgc3VwcG9ydCBmb3IgbGF0ZW5jeSBiYXNlZCBjZ3JvdXAgSU8gcHJvdGVjdGlvblxcXCJcXG4tLVxcbmJsb2NrL0tjb25maWctMTQ0LVxcbmJsb2NrL0tjb25maWc6MTQ1OmNvbmZpZyBCTEtfQ0dST1VQX0ZDX0FQUElEXFxuYmxvY2svS2NvbmZpZy0xNDYtXFx0Ym9vbCBcXFwiRW5hYmxlIHN1cHBvcnQgdG8gdHJhY2sgRkMgSS9PIFRyYWZmaWMgYWNyb3NzIGNncm91cCBhcHBsaWNhdGlvbnNcXFwiXFxuLS1cXG5ibG9jay9LY29uZmlnLTE1My1cXG5ibG9jay9LY29uZmlnOjE1NDpjb25maWcgQkxLX0NHUk9VUF9JT0NPU1RcXG5ibG9jay9LY29uZmlnLTE1NS1cXHRib29sIFxcXCJFbmFibGUgc3VwcG9ydCBmb3IgY29zdCBtb2RlbCBiYXNlZCBjZ3JvdXAgSU8gY29udHJvbGxlclxcXCJcXG4tLVxcbmJsb2NrL0tjb25maWctMTYzLVxcbmJsb2NrL0tjb25maWc6MTY0OmNvbmZpZyBCTEtfQ0dST1VQX0lPUFJJT1xcbmJsb2NrL0tjb25maWctMTY1LVxcdGJvb2wgXFxcIkNncm91cCBJL08gY29udHJvbGxlciBmb3IgYXNzaWduaW5nIGFuIEkvTyBwcmlvcml0eSBjbGFzc1xcXCJcXG4tLVxcbmluaXQvS2NvbmZpZz0xMDk5PWNvbmZpZyBNRU1DR19WMVxcbi0tXFxuaW5pdC9LY29uZmlnLTExMTUtXFxuaW5pdC9LY29uZmlnOjExMTY6Y29uZmlnIEJMS19DR1JPVVBcXG5pbml0L0tjb25maWctMTExNy1cXHRib29sIFxcXCJJTyBjb250cm9sbGVyXFxcIlxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xN1QyMjozNDo0NC4xODk5NjEwMTdaIiwiU2VxIjo1LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjozMzIyMjI3OTMwLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgYSBzdW1tYXJ5IG9mIG15IHRob3VnaHQgcHJvY2VzcywgYXMgcmVxdWVzdGVkOlxuXG4qKkNoZWNraW5nIEJMS19DR1JPVVAgQ29uZmlndXJhdGlvbioqXG5cbk9rYXksIHNvIEkgbmVlZCB0byBxdWlja2x5IGFzY2VydGFpbiB0aGUgc3RhdHVzIG9mIGBCTEtfQ0dST1VQYCB3aXRoaW4gdGhlIGtlcm5lbCBjb25maWd1cmF0aW9uLiBNeSBpbW1lZGlhdGUgaW5zdGluY3QgaXMgdG8gY2hlY2sgYGluaXQvS2NvbmZpZ2AuIFRoYXQncyB0aGUgbW9zdCBsb2dpY2FsIHBsYWNlIHRvIHN0YXJ0IGRpZ2dpbmcgZm9yIGRlZmluaXRpb25zIHJlbGF0ZWQgdG8gYmxvY2sgbGF5ZXIgY29udHJvbCBncm91cHMsIGVzcGVjaWFsbHkgc2luY2UgaXQncyBhIGNvcmUgY29uZmlndXJhdGlvbiBmaWxlLiBMZXQncyBzZWUgaWYgaXQncyBkZWZpbmVkIHRoZXJlLCBhbmQgaWYgc28sIHdoYXQgdGhlIGRlcGVuZGVuY2llcyBhbmQgZGVmYXVsdCB2YWx1ZSBhcmUuIFRoaXMgc2hvdWxkIGdpdmUgbWUgYSBnb29kIGluaXRpYWwgb3ZlcnZpZXcgb2YgaG93IGBCTEtfQ0dST1VQYCBpcyBoYW5kbGVkIHdpdGhpbiB0aGUgYnVpbGQgc3lzdGVtIGFuZCBpZiBpdCBpcyBlbmFibGVkIG9yIGRpc2FibGVkIGJ5IGRlZmF1bHQuIFVuZGVyc3RhbmRpbmcgdGhlIGNvbmZpZ3VyYXRpb24gaXMgY3JpdGljYWwgdG8gbW92aW5nIGZvcndhcmQuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjExMDg5LCJPdXRwdXRUb2tlbnMiOjMzLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTgsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTdUMjI6MzQ6NDcuNTEyMTkwNzk3WiIsIlNlcSI6NiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTAxNzEwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcImluaXQvS2NvbmZpZ1wiLFxuICBcIkZpcnN0TGluZVwiOiAxMTEwLFxuICBcIkxpbmVDb3VudFwiOiAyMFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIxMTEwOlxcdFxcdCAgUGxlYXNlIG5vdGUgdGhhdCBmZWF0dXJlIHNldCBvZiB0aGUgbGVnYWN5IG1lbW9yeSBjb250cm9sbGVyIGlzIGxpa2VseVxcbjExMTE6XFx0XFx0ICBnb2luZyB0byBzaHJpbmsgZHVlIHRvIGRlcHJlY2F0aW9uIHByb2Nlc3MuIE5ldyBkZXBsb3ltZW50cyB3aXRoIHYxXFxuMTExMjpcXHRcXHQgIGNvbnRyb2xsZXIgYXJlIGhpZ2hseSBkaXNjb3VyYWdlZC5cXG4xMTEzOlxcdFxcbjExMTQ6XFx0XFx0ICBTYXkgTiBpZiB1bnN1cmUuXFxuMTExNTpcXHRcXG4xMTE2OlxcdGNvbmZpZyBCTEtfQ0dST1VQXFxuMTExNzpcXHRcXHRib29sIFxcXCJJTyBjb250cm9sbGVyXFxcIlxcbjExMTg6XFx0XFx0ZGVwZW5kcyBvbiBCTE9DS1xcbjExMTk6XFx0XFx0ZGVmYXVsdCBuXFxuMTEyMDpcXHRcXHRoZWxwXFxuMTEyMTpcXHRcXHRHZW5lcmljIGJsb2NrIElPIGNvbnRyb2xsZXIgY2dyb3VwIGludGVyZmFjZS4gVGhpcyBpcyB0aGUgY29tbW9uXFxuMTEyMjpcXHRcXHRjZ3JvdXAgaW50ZXJmYWNlIHdoaWNoIHNob3VsZCBiZSB1c2VkIGJ5IHZhcmlvdXMgSU8gY29udHJvbGxpbmdcXG4xMTIzOlxcdFxcdHBvbGljaWVzLlxcbjExMjQ6XFx0XFxuMTEyNTpcXHRcXHRDdXJyZW50bHksIENGUSBJTyBzY2hlZHVsZXIgdXNlcyBpdCB0byByZWNvZ25pemUgdGFzayBncm91cHMgYW5kXFxuMTEyNjpcXHRcXHRjb250cm9sIGRpc2sgYmFuZHdpZHRoIGFsbG9jYXRpb24gKHByb3BvcnRpb25hbCB0aW1lIHNsaWNlIGFsbG9jYXRpb24pXFxuMTEyNzpcXHRcXHR0byBzdWNoIHRhc2sgZ3JvdXBzLiBJdCBpcyBhbHNvIHVzZWQgYnkgYmlvIHRocm90dGxpbmcgbG9naWMgaW5cXG4xMTI4OlxcdFxcdGJsb2NrIGxheWVyIHRvIGltcGxlbWVudCB1cHBlciBsaW1pdCBpbiBJTyByYXRlcyBvbiBhIGRldmljZS5cXG4xMTI5OlxcdFxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xN1QyMjozNDo0Ny41MTIyOTQzMjdaIiwiU2VxIjo3LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjozODg5NDIyMTIxLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBoZXJlJ3MgbXkgdGFrZSBvbiB0aG9zZSB0aG91Z2h0cywgZnJhbWVkIGFzIG15IG93bjpcblxuKipEZXBlbmRlbmNpZXMgYW5kIHRoZSBicGZfYmxrY2cuYyBDaGVjayoqXG5cbkFscmlnaHQsIGxldCdzIHNlZSwgaXQgbG9va3MgbGlrZSBgQkxLX0NHUk9VUGAgaXMgZnVuZGFtZW50YWxseSByZWxpYW50IG9uIGBCTE9DS2AuIFRoYXQgbWFrZXMgc2Vuc2U7IHdlJ3JlIHRhbGtpbmcgYWJvdXQgYmxvY2sgSS9PIGNvbnRyb2wgd2l0aGluIGNncm91cHMsIHNvIHRoZSBiYXNpYyBibG9jayBkZXZpY2UgaW5mcmFzdHJ1Y3R1cmUgbmVlZHMgdG8gYmUgdGhlcmUuIEFuZCwgSSByZWNhbGwgbm93LCBgQlBGX1NZU0NBTExgIGlzIGFsc28gZGVmaW5pdGVseSBnb2luZyB0byBiZSBpbiB0aGUgbWl4LiBDb25zaWRlcmluZyB0aGlzIGlzIEJQRi1yZWxhdGVkIGNvZGUsIHRoYXTigJlzIG5vdCBhIHN1cnByaXNlLiBJIG5lZWQgdG8gYmUgYWJsZSB0byB0cmFjZSBjZXJ0YWluIGNhbGxzIGluIHRoZSBrZXJuZWwuXG5cblJpZ2h0LCBzbyB0byBtYWtlIHN1cmUgSSB1bmRlcnN0YW5kIHRoZSBjb2RlIGNvcnJlY3RseSwgSSB0aGluayBJIHdpbGwgcmVyZWFkIGBicGZfYmxrY2cuY2AuIExldCdzIHNlZSB3aGF0J3MgYWN0dWFsbHkgZ29pbmcgb24uIEkgbmVlZCB0byBtYWtlIGNlcnRhaW4gSSBmdWxseSB1bmRlcnN0YW5kIGhvdyB0aGUgQlBGIHByb2dyYW1zIGhvb2sgaW50byB0aGUgYmxvY2sgSS9PIHBhdGguXG5cblxuIiwiSW5wdXRUb2tlbnMiOjExNTgyLCJPdXRwdXRUb2tlbnMiOjM2LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NDIsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0xN1QyMjozNDo1MS40MDE3MTkwNThaIiwiU2VxIjo4LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo4NDk2MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJibG9jay9icGZfYmxrY2cuY1wiLFxuICBcIkZpcnN0TGluZVwiOiAxLFxuICBcIkxpbmVDb3VudFwiOiAxMDBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiICAgMTpcXHQvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vci1sYXRlclxcbiAgIDI6XFx0LypcXG4gICAzOlxcdCAqIEJsb2NrIEkvTyBDb250cm9sbGVyLXJlbGF0ZWQgQlBGIGtmdW5jcyBhbmQgYXV4aWxpYXJ5IGNvZGVcXG4gICA0OlxcdCAqL1xcbiAgIDU6XFx0XFxuICAgNjpcXHQjaW5jbHVkZSBcXFwiYmxrLWNncm91cC5oXFxcIlxcbiAgIDc6XFx0XFxuICAgODpcXHQjaW5jbHVkZSBcXHUwMDNjbGludXgvYnBmLmhcXHUwMDNlXFxuICAgOTpcXHQjaW5jbHVkZSBcXHUwMDNjbGludXgvYnRmX2lkcy5oXFx1MDAzZVxcbiAgMTA6XFx0I2luY2x1ZGUgXFx1MDAzY2xpbnV4L3JjdWxpc3QuaFxcdTAwM2VcXG4gIDExOlxcdFxcbiAgMTI6XFx0X19icGZfa2Z1bmNfc3RhcnRfZGVmcygpO1xcbiAgMTM6XFx0XFxuICAxNDpcXHQvKipcXG4gIDE1OlxcdCAqIGJwZl9ibGtjZ19mbHVzaF9zdGF0cyAtIEZsdXNoIGEgYmxvY2sgY2dyb3VwJ3MgaW8gc3RhdGlzdGljc1xcbiAgMTY6XFx0ICogQGNncnA6IGNncm91cCB0byBmbHVzaFxcbiAgMTc6XFx0ICpcXG4gIDE4OlxcdCAqIFByb3BhZ2F0ZSBJL08gc3RhdGlzdGljcyB1cCB0aGUgY2dyb3VwIHRyZWUuIFJvb3Qgc3RhdGlzdGljcyBjb21lIGZyb21cXG4gIDE5OlxcdCAqIGJsb2NrIGRldmljZXMgYW5kIGluY2x1ZGUgYWxsIGNncm91cHMnIEkvTy5cXG4gIDIwOlxcdCAqL1xcbiAgMjE6XFx0X19icGZfa2Z1bmMgdm9pZCBicGZfYmxrY2dfZmx1c2hfc3RhdHMoc3RydWN0IGNncm91cCAqY2dycClcXG4gIDIyOlxcdHtcXG4gIDIzOlxcdFxcdHN0cnVjdCBjZ3JvdXBfc3Vic3lzX3N0YXRlICpjc3M7XFxuICAyNDpcXHRcXG4gIDI1OlxcdFxcdC8qIFBpbiB0aGUgY3NzIGZvciB0aGUgc2xlZXBhYmxlIGZsdXNoLiAqL1xcbiAgMjY6XFx0XFx0cmN1X3JlYWRfbG9jaygpO1xcbiAgMjc6XFx0XFx0Y3NzID0gY2dyb3VwX2NzcyhjZ3JwLCBcXHUwMDI2aW9fY2dycF9zdWJzeXMpO1xcbiAgMjg6XFx0XFx0aWYgKGNzcyBcXHUwMDI2XFx1MDAyNiAhY3NzX3RyeWdldChjc3MpKVxcbiAgMjk6XFx0XFx0XFx0Y3NzID0gTlVMTDtcXG4gIDMwOlxcdFxcdHJjdV9yZWFkX3VubG9jaygpO1xcbiAgMzE6XFx0XFxuICAzMjpcXHRcXHRpZiAoIWNzcylcXG4gIDMzOlxcdFxcdFxcdHJldHVybjtcXG4gIDM0OlxcdFxcbiAgMzU6XFx0XFx0aWYgKCFjc3MtXFx1MDAzZXBhcmVudClcXG4gIDM2OlxcdFxcdFxcdGJsa2NnX2ZpbGxfcm9vdF9pb3N0YXRzKCk7XFxuICAzNzpcXHRcXHRlbHNlXFxuICAzODpcXHRcXHRcXHRjc3NfcnN0YXRfZmx1c2goY3NzKTtcXG4gIDM5OlxcdFxcbiAgNDA6XFx0XFx0Y3NzX3B1dChjc3MpO1xcbiAgNDE6XFx0fVxcbiAgNDI6XFx0XFxuICA0MzpcXHRzdHJ1Y3QgYnBmX2l0ZXJfYmxrZyB7XFxuICA0NDpcXHRcXHRfX3U2NCBfX29wYXF1ZVsyXTtcXG4gIDQ1OlxcdH0gX19hbGlnbmVkKDgpO1xcbiAgNDY6XFx0XFxuICA0NzpcXHRzdHJ1Y3QgYnBmX2l0ZXJfYmxrZ19rZXJuIHtcXG4gIDQ4OlxcdFxcdHN0cnVjdCBibGtjZyAqYmxrY2c7XFxuICA0OTpcXHRcXHRzdHJ1Y3QgYmxrY2dfZ3EgKnBvcztcXG4gIDUwOlxcdH0gX19hbGlnbmVkKDgpO1xcbiAgNTE6XFx0XFxuICA1MjpcXHQvKipcXG4gIDUzOlxcdCAqIGJwZl9pdGVyX2Jsa2dfbmV3IC0gU3RhcnQgaXRlcmF0aW5nIGEgYmxvY2sgY2dyb3VwJ3MgcGVyLWRldmljZSBibGtnc1xcbiAgNTQ6XFx0ICogQGl0OiBpdGVyYXRvciB0byBpbml0aWFsaXplXFxuICA1NTpcXHQgKiBAY3NzOiB0aGUgaW8gY29udHJvbGxlcidzIGNzc1xcbiAgNTY6XFx0ICpcXG4gIDU3OlxcdCAqIEVhY2ggYmxrZyBob2xkcyBvbmUgZGV2aWNlJ3MgaW8uc3RhdCBjb3VudGVycy4gT2ZmbGluZSBibGtncyBhcmUgc2tpcHBlZC5cXG4gIDU4OlxcdCAqIEEgYmxrZyB3aXRob3V0IGEgZGlzayBjYW4gYmUgcmV0dXJuZWQuIE11c3QgcnVuIHVuZGVyIFJDVS5cXG4gIDU5OlxcdCAqXFxuICA2MDpcXHQgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgLUVJTlZBTCBpZiBAY3NzIGlzIG5vdCB0aGUgaW8gY29udHJvbGxlcidzLlxcbiAgNjE6XFx0ICovXFxuICA2MjpcXHRfX2JwZl9rZnVuYyBpbnQgYnBmX2l0ZXJfYmxrZ19uZXcoc3RydWN0IGJwZl9pdGVyX2Jsa2cgKml0LFxcbiAgNjM6XFx0XFx0XFx0XFx0XFx0ICBzdHJ1Y3QgY2dyb3VwX3N1YnN5c19zdGF0ZSAqY3NzKVxcbiAgNjQ6XFx0e1xcbiAgNjU6XFx0XFx0c3RydWN0IGJwZl9pdGVyX2Jsa2dfa2VybiAqa2l0ID0gKHZvaWQgKilpdDtcXG4gIDY2OlxcdFxcbiAgNjc6XFx0XFx0QlVJTERfQlVHX09OKHNpemVvZihzdHJ1Y3QgYnBmX2l0ZXJfYmxrZ19rZXJuKSBcXHUwMDNlIHNpemVvZihzdHJ1Y3QgYnBmX2l0ZXJfYmxrZykpO1xcbiAgNjg6XFx0XFx0QlVJTERfQlVHX09OKF9fYWxpZ25vZl9fKHN0cnVjdCBicGZfaXRlcl9ibGtnX2tlcm4pICE9XFxuICA2OTpcXHRcXHRcXHQgICAgIF9fYWxpZ25vZl9fKHN0cnVjdCBicGZfaXRlcl9ibGtnKSk7XFxuICA3MDpcXHRcXG4gIDcxOlxcdFxcdGtpdC1cXHUwMDNlcG9zID0gTlVMTDtcXG4gIDcyOlxcdFxcbiAgNzM6XFx0XFx0aWYgKGNzcy1cXHUwMDNlc3MgIT0gXFx1MDAyNmlvX2NncnBfc3Vic3lzKSB7XFxuICA3NDpcXHRcXHRcXHRraXQtXFx1MDAzZWJsa2NnID0gTlVMTDtcXG4gIDc1OlxcdFxcdFxcdHJldHVybiAtRUlOVkFMO1xcbiAgNzY6XFx0XFx0fVxcbiAgNzc6XFx0XFxuICA3ODpcXHRcXHRraXQtXFx1MDAzZWJsa2NnID0gY3NzX3RvX2Jsa2NnKGNzcyk7XFxuICA3OTpcXHRcXHRyZXR1cm4gMDtcXG4gIDgwOlxcdH1cXG4gIDgxOlxcdFxcbiAgODI6XFx0LyoqXFxuICA4MzpcXHQgKiBicGZfaXRlcl9ibGtnX25leHQgLSBSZXR1cm4gdGhlIG5leHQgb25saW5lIGJsa2cgb2YgdGhlIGl0ZXJhdGVkIGJsb2NrIGNncm91cFxcbiAgODQ6XFx0ICogQGl0OiBpdGVyYXRvclxcbiAgODU6XFx0ICpcXG4gIDg2OlxcdCAqIFJldHVybjogdGhlIG5leHQgb25saW5lIGJsa2csIG9yIE5VTEwgd2hlbiB0aGUgd2FsayBpcyBkb25lLlxcbiAgODc6XFx0ICovXFxuICA4ODpcXHRfX2JwZl9rZnVuYyBzdHJ1Y3QgYmxrY2dfZ3EgKmJwZl9pdGVyX2Jsa2dfbmV4dChzdHJ1Y3QgYnBmX2l0ZXJfYmxrZyAqaXQpXFxuICA4OTpcXHR7XFxuICA5MDpcXHRcXHRzdHJ1Y3QgYnBmX2l0ZXJfYmxrZ19rZXJuICpraXQgPSAodm9pZCAqKWl0O1xcbiAgOTE6XFx0XFx0c3RydWN0IGJsa2NnX2dxICpibGtnID0ga2l0LVxcdTAwM2Vwb3M7XFxuICA5MjpcXHRcXHRzdHJ1Y3QgaGxpc3Rfbm9kZSAqbm9kZTtcXG4gIDkzOlxcdFxcbiAgOTQ6XFx0XFx0aWYgKCFraXQtXFx1MDAzZWJsa2NnKVxcbiAgOTU6XFx0XFx0XFx0cmV0dXJuIE5VTEw7XFxuICA5NjpcXHRcXG4gIDk3OlxcdFxcdGlmICghYmxrZylcXG4gIDk4OlxcdFxcdFxcdG5vZGUgPSByY3VfZGVyZWZlcmVuY2UoaGxpc3RfZmlyc3RfcmN1KFxcdTAwMjZraXQtXFx1MDAzZWJsa2NnLVxcdTAwM2VibGtnX2xpc3QpKTtcXG4gIDk5OlxcdFxcdGVsc2VcXG4gMTAwOlxcdFxcdFxcdG5vZGUgPSByY3VfZGVyZWZlcmVuY2UoaGxpc3RfbmV4dF9yY3UoXFx1MDAyNmJsa2ctXFx1MDAzZWJsa2NnX25vZGUpKTtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTdUMjI6MzQ6NTEuNDAxODA1Mzg4WiIsIlNlcSI6OSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NTU2Njc2OTU0OCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipNeSBBbmFseXNpcyBvZiBCUEYgRnVuY3Rpb24gUmVhY2hhYmlsaXR5KipcblxuT2theSwgc28gSSdtIGxvb2tpbmcgYXQgdGhlc2UgdGhyZWUgQlBGLXJlbGF0ZWQgZnVuY3Rpb25zOiBgYnBmX2Jsa2NnX2ZsdXNoX3N0YXRzYCwgYGJwZl9pdGVyX2Jsa2dfbmV3YCwgYW5kIGBicGZfaXRlcl9ibGtnX25leHRgLiBUaGUga2V5IHBvaW50IGlzIHRoYXQgdGhleSdyZSBjYWxsYWJsZSBmcm9tIEJQRiBwcm9ncmFtcy4gVGhhdCBtZWFucyB0aGV5IG5lZWQgdG8gYmUgaW5jbHVkZWQgaW4gYEZvY3VzU3ltYm9sc2AuIFByZXR0eSBzdHJhaWdodGZvcndhcmQuXG5cbk5vdywgd2hpY2ggY29uZmlncyBhcmUgbmVlZGVkIGZvciB0aGVzZT8gTXkgaW5pdGlhbCB0aG91Z2h0cyBhcmUgYEJMS19DR1JPVVBgIGFuZCBgQlBGX1NZU0NBTExgLiBMZXQncyBqdXN0IHF1aWNrbHkgZG91YmxlLWNoZWNrIHRoYXQgYEJQRl9TWVNDQUxMYCBpcyBpbmRlZWQgdGhlIHJpZ2h0IG9uZS4gQWgsIGhlcmUncyBgYmxvY2svTWFrZWZpbGVgOlxuXG5gYGBtYWtlZmlsZVxuaWZkZWYgQ09ORklHX0JQRl9TWVNDQUxMXG5vYmotJChDT05GSUdfQkxLX0NHUk9VUClcdCs9IGJwZl9ibGtjZy5vXG5lbmRpZlxuYGBgXG5cblllcCwgdGhhdCBjb25maXJtcyBpdC4gYEJQRl9TWVNDQUxMYCAqYW5kKiBgQkxLX0NHUk9VUGAuIEdvb2QuXG5cblRoZSBuZXh0IHRoaW5nIHRoYXQgSSBzaG91bGQgYmUgY2hlY2tpbmcgaXMgd2hldGhlciBgQ0dST1VQU2AgaXMgbmVlZGVkLiBgQkxLX0NHUk9VUGAgZGVwZW5kcyBvbiBgQkxPQ0tgIGFuZCBgQ0dST1VQU2A/IFxuXG5XYWl0LCBob2xkIG9uLCBsZXQncyBsb29rIGF0IGBpbml0L0tjb25maWdgOlxuXG5gYGBrY29uZmlnXG5jb25maWcgQkxLX0NHUk9VUFxuXHRib29sIFwiSU8gY29udHJvbGxlclwiXG5cdGRlcGVuZHMgb24gQkxPQ0tcbmBgYFxuXG5Pa2F5LCBpdCBzZWVtcyBhcyBpZiBgQkxLX0NHUk9VUGAgaXMgaW5zaWRlIGBtZW51Y29uZmlnIENHUk9VUFNgLlxuTGV0IG1lIGRvIGEgcXVpY2sgY3Jvc3MtY2hlY2suLi5cblxuXG4iLCJJbnB1dFRva2VucyI6MTMyODEsIk91dHB1dFRva2VucyI6MTksIk91dHB1dFRob3VnaHRzVG9rZW5zIjoyNjMsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0xN1QyMjozNDo1Ni45Njg1NzY5NTVaIiwiU2VxIjoxMCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE2MjA0MjEwNzksIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwibWVudWNvbmZpZyBDR1JPVVBTXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImluaXQvS2NvbmZpZz0xMDQ0PWNvbmZpZyBTTEFCX09CSl9FWFRcXG4tLVxcbmluaXQvS2NvbmZpZy0xMDQ2LVxcbmluaXQvS2NvbmZpZzoxMDQ3Om1lbnVjb25maWcgQ0dST1VQU1xcbmluaXQvS2NvbmZpZy0xMDQ4LVxcdGJvb2wgXFxcIkNvbnRyb2wgR3JvdXAgc3VwcG9ydFxcXCJcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTdUMjI6MzQ6NTguNTg5MDA2Mzg1WiIsIlNlcSI6MTEsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjQzNDY1NDYxMjUsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGhlcmUncyBteSB0YWtlIG9uIHRob3NlIHRob3VnaHRzLCBmcmFtZWQgYXMgYW4gZXhwZXJ0J3MgaW50ZXJuYWwgbW9ub2xvZ3VlOlxuXG4qKkNoZWNraW5nIHRoZSBDR1JPVVAgQ29uZmlndXJhdGlvbioqXG5cbkFscmlnaHQsIHNvIGBCTEtfQ0dST1VQYCBpcyBpbmRlZWQgbmVzdGVkIHdpdGhpbiB0aGUgYENHUk9VUFNgIG9wdGlvbiBpbiBgbWVudWNvbmZpZ2AuIFRoYXQncyB0aGUgc3RhcnRpbmcgcG9pbnQuIE5vdywgdG8gYmUgc3VyZSwgYW5kIHRvIHVuZGVyc3RhbmQgdGhlIGJyb2FkZXIgY29udGV4dCwgSSBuZWVkIHRvIGxvb2sgYXQgYGluaXQvS2NvbmZpZ2AgdG8gc2VlIHRoZSBkZXBlbmRlbmNpZXMgYW5kIHdoYXQgZWxzZSBtaWdodCBiZSB0aWVkIHRvIGl0LiBTcGVjaWZpY2FsbHksIEknbGwganVtcCB0byBhcm91bmQgbGluZSAxMDQ3LCBhcyB0aGF0IHNlZW1zIHRvIGJlIHdoZXJlIHRoZSByZWxldmFudCBzZWN0aW9uIHNob3VsZCBiZS4gSG9wZWZ1bGx5LCB0aGF0IGdpdmVzIG1lIGEgYmV0dGVyIHBpY3R1cmUuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjEzOTc0LCJPdXRwdXRUb2tlbnMiOjMzLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MzcsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTdUMjI6MzU6MDIuOTM1NTU1NDRaIiwiU2VxIjoxMiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTE4NjAwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcImluaXQvS2NvbmZpZ1wiLFxuICBcIkZpcnN0TGluZVwiOiAxMDQwLFxuICBcIkxpbmVDb3VudFwiOiAyMFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIxMDQwOlxcdFxcdGhlbHBcXG4xMDQxOlxcdFxcdCAgSWYgc2V0LCBhdXRvbWF0aWMgTlVNQSBiYWxhbmNpbmcgd2lsbCBiZSBlbmFibGVkIGlmIHJ1bm5pbmcgb24gYSBOVU1BXFxuMTA0MjpcXHRcXHQgIG1hY2hpbmUuXFxuMTA0MzpcXHRcXG4xMDQ0OlxcdGNvbmZpZyBTTEFCX09CSl9FWFRcXG4xMDQ1OlxcdFxcdGJvb2xcXG4xMDQ2OlxcdFxcbjEwNDc6XFx0bWVudWNvbmZpZyBDR1JPVVBTXFxuMTA0ODpcXHRcXHRib29sIFxcXCJDb250cm9sIEdyb3VwIHN1cHBvcnRcXFwiXFxuMTA0OTpcXHRcXHRzZWxlY3QgS0VSTkZTXFxuMTA1MDpcXHRcXHRoZWxwXFxuMTA1MTpcXHRcXHQgIFRoaXMgb3B0aW9uIGFkZHMgc3VwcG9ydCBmb3IgZ3JvdXBpbmcgc2V0cyBvZiBwcm9jZXNzZXMgdG9nZXRoZXIsIGZvclxcbjEwNTI6XFx0XFx0ICB1c2Ugd2l0aCBwcm9jZXNzIGNvbnRyb2wgc3Vic3lzdGVtcyBzdWNoIGFzIENwdXNldHMsIENGUywgbWVtb3J5XFxuMTA1MzpcXHRcXHQgIGNvbnRyb2xzIG9yIGRldmljZSBpc29sYXRpb24uXFxuMTA1NDpcXHRcXHQgIFNlZVxcbjEwNTU6XFx0XFx0XFx0LSBEb2N1bWVudGF0aW9uL3NjaGVkdWxlci9zY2hlZC1kZXNpZ24tQ0ZTLnJzdFxcdChDRlMpXFxuMTA1NjpcXHRcXHRcXHQtIERvY3VtZW50YXRpb24vYWRtaW4tZ3VpZGUvY2dyb3VwLXYxLyAoZmVhdHVyZXMgZm9yIGdyb3VwaW5nLCBpc29sYXRpb25cXG4xMDU3OlxcdFxcdFxcdFxcdFxcdFxcdCAgYW5kIHJlc291cmNlIGNvbnRyb2wpXFxuMTA1ODpcXHRcXG4xMDU5OlxcdFxcdCAgU2F5IE4gaWYgdW5zdXJlLlxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xN1QyMjozNTowMi45MzU2NzU1OFoiLCJTZXEiOjEzLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo0MjQ5ODI0ODkxLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBoZXJlJ3MgbXkgaW50ZXJwcmV0YXRpb24gb2YgdGhvc2UgdGhvdWdodHMsIHRhaWxvcmVkIGZvciBhbiBleHBlcnQgYXVkaWVuY2UsIHByZXNlbnRlZCBpbiB0aGUgZmlyc3QgcGVyc29uOlxuXG4qKktlcm5lbCBTdWJzeXN0ZW0gRGVwZW5kZW5jaWVzOiBBIFF1aWNrIE1lbnRhbCBBdWRpdCoqXG5cblJpZ2h0LCBzbyBgQ0dST1VQU2AgaXMgZGVmaW5pdGVseSBhIGNvcmUgcmVxdWlyZW1lbnQgaGVyZS4gQnV0IGhvbGQgb24sIEkgc2VlbSB0byByZW1lbWJlciBgQkxLX0NHUk9VUGAgYmVpbmcgY29uZGl0aW9uYWxseSBjb21waWxlZC4uLiBidXJpZWQgd2l0aGluIGFuIGBpZiBDR1JPVVBTYCBibG9jaywgcmlnaHQ/IE5lZWQgdG8gY29uZmlybSB0aGF0IHF1aWNrbHkuIEdvdHRhIGtlZXAgdGhlIGRlcGVuZGVuY3kgY2hhaW4gc3RyYWlnaHQgaW4gbXkgaGVhZC4gTGV0IG1lIGp1c3QgZG91YmxlIGNoZWNrIHRoZSByZWxldmFudCBjb25maWcgb3B0aW9ucyB0byBiZSBhYnNvbHV0ZWx5IHN1cmUgdGhhdCBgQkxLX0NHUk9VUGAgaXMgb25seSBlbmFibGVkIHdoZW4gYENHUk9VUFNgIGlzLiBXb3VsZG4ndCB3YW50IGFueSBzdXJwcmlzZXMgd2hlbiBidWlsZGluZy5cblxuXG4iLCJJbnB1dFRva2VucyI6MTQ0NjMsIk91dHB1dFRva2VucyI6MzMsIk91dHB1dFRob3VnaHRzVG9rZW5zIjozMywiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE3VDIyOjM1OjA3LjE4NTUwMjkzMVoiLCJTZXEiOjE0LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMTM1MDAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwiaW5pdC9LY29uZmlnXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDEwNjAsXG4gIFwiTGluZUNvdW50XCI6IDIwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIjEwNjA6XFx0XFxuMTA2MTpcXHRpZiBDR1JPVVBTXFxuMTA2MjpcXHRcXG4xMDYzOlxcdGNvbmZpZyBQQUdFX0NPVU5URVJcXG4xMDY0OlxcdFxcdGJvb2xcXG4xMDY1OlxcdFxcbjEwNjY6XFx0Y29uZmlnIENHUk9VUF9GQVZPUl9EWU5NT0RTXFxuMTA2NzpcXHRcXHRib29sIFxcXCJGYXZvciBkeW5hbWljIG1vZGlmaWNhdGlvbiBsYXRlbmN5IHJlZHVjdGlvbiBieSBkZWZhdWx0XFxcIlxcbjEwNjg6XFx0XFx0aGVscFxcbjEwNjk6XFx0XFx0ICBUaGlzIG9wdGlvbiBlbmFibGVzIHRoZSBcXFwiZmF2b3JkeW5tb2RzXFxcIiBtb3VudCBvcHRpb24gYnkgZGVmYXVsdFxcbjEwNzA6XFx0XFx0ICB3aGljaCByZWR1Y2VzIHRoZSBsYXRlbmNpZXMgb2YgZHluYW1pYyBjZ3JvdXAgbW9kaWZpY2F0aW9ucyBzdWNoXFxuMTA3MTpcXHRcXHQgIGFzIHRhc2sgbWlncmF0aW9ucyBhbmQgY29udHJvbGxlciBvbi9vZmZzIGF0IHRoZSBjb3N0IG9mIG1ha2luZ1xcbjEwNzI6XFx0XFx0ICBob3QgcGF0aCBvcGVyYXRpb25zIHN1Y2ggYXMgZm9ya3MgYW5kIGV4aXRzIG1vcmUgZXhwZW5zaXZlLlxcbjEwNzM6XFx0XFxuMTA3NDpcXHRcXHQgIFNheSBOIGlmIHVuc3VyZS5cXG4xMDc1OlxcdFxcbjEwNzY6XFx0Y29uZmlnIE1FTUNHXFxuMTA3NzpcXHRcXHRib29sIFxcXCJNZW1vcnkgY29udHJvbGxlclxcXCJcXG4xMDc4OlxcdFxcdHNlbGVjdCBQQUdFX0NPVU5URVJcXG4xMDc5OlxcdFxcdHNlbGVjdCBFVkVOVEZEXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE3VDIyOjM1OjA3LjE4NTYxNzUzMVoiLCJTZXEiOjE1LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjozOTgzNDc5NjA0LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBoZXJlJ3MgbXkgdGFrZSBvbiB0aG9zZSB0aG91Z2h0cywgZnJhbWVkIGFzIG15IG93biBtZW50YWwgcHJvY2Vzc2luZzpcblxuKipEZXBlbmRlbmNpZXMgYW5kIENvbmRpdGlvbmFscyoqXG5cbkFscmlnaHQsIGxldCdzIG5haWwgdGhpcyBkb3duLiBJJ3ZlIGdvdCB0byBlbnN1cmUgdGhhdCBteSB1bmRlcnN0YW5kaW5nIG9mIHRoaXMgc3lzdGVtIGlzIGNvcnJlY3QsIGVzcGVjaWFsbHkgd2hlbiBpdCBjb21lcyB0byB0aG9zZSBmZWF0dXJlIGZsYWdzIGFuZCBjb25kaXRpb25hbHMuIFNvLCBgQkxLX0NHUk9VUGAsIG5vIGRvdWJ0LCB0aGF0IHNpdHMgc3F1YXJlbHkgd2l0aGluIHRoZSBgaWYgQ0dST1VQU2AgYmxvY2suIE1ha2VzIHBlcmZlY3Qgc2Vuc2UuIFRoZXJlZm9yZSwgdGhhdCBtZWFucyBgQ0dST1VQU2AgaXMgZGVmaW5pdGVseSBhIHByZXJlcXVpc2l0ZS4gQW5kLCBuYXR1cmFsbHksIGBCTE9DS2AgaXMgcmVxdWlyZWQgdG9vLCBJJ2QgZXhwZWN0IGl0IHRvIGJlLCBidXQgaXQncyBnb29kIHRvIGNvbmZpcm0uIFRoYXQncyBhIGZ1bmRhbWVudGFsLiBBbmQgaGV5LCBsZXQncyBrZWVwIGdvaW5nLlxuXG5Ob3csIHRoYXQgYEJQRl9TWVNDQUxMYC4uLiBJIG5lZWQgdG8gZG91YmxlLWNoZWNrIHRoYXQgdGhpcyBpcyBjb250YWluZWQgd2l0aGluLCBzYXksIGFuIGBpZiBCUEZgIGNvbmRpdGlvbmFsLiBJdCdzIGNydWNpYWwgdG8ga25vdyB0aGF0IGl0IGlzIGNvbnRhaW5lZC4gSSBuZWVkIHRvIGtub3cgd2hlcmUgaXQgc3RhbmRzLiBPdGhlcndpc2UsIEkgd2lsbCBub3QgYmUgYWJsZSB0byBwcm9jZWVkLiBJIGhhdmUgdGhlIGZlZWxpbmcgdGhhdCBJJ20gbWlzc2luZyBzb21ldGhpbmcsIHRob3VnaC4gTGV0J3MgZGlnIGluIGEgYml0LlxuXG5cbiIsIklucHV0VG9rZW5zIjoxNDkyOSwiT3V0cHV0VG9rZW5zIjoyMSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjcyLCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTdUMjI6MzU6MTEuMTY5MDk5Njg1WiIsIlNlcSI6MTYsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNDM2NDk0MTAzLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImNvbmZpZyBCUEZfU1lTQ0FMTFwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJrZXJuZWwvYnBmL0tjb25maWc9MjU9bWVudSBcXFwiQlBGIHN1YnN5c3RlbVxcXCJcXG5rZXJuZWwvYnBmL0tjb25maWctMjYtXFxua2VybmVsL2JwZi9LY29uZmlnOjI3OmNvbmZpZyBCUEZfU1lTQ0FMTFxcbmtlcm5lbC9icGYvS2NvbmZpZy0yOC1cXHRib29sIFxcXCJFbmFibGUgYnBmKCkgc3lzdGVtIGNhbGxcXFwiXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE3VDIyOjM1OjEyLjYwNTU5ODQyOFoiLCJTZXEiOjE3LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo0MDYxMTI2MzM1LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgYSBzdW1tYXJ5IG9mIG15IHRob3VnaHQgcHJvY2VzcywgYXMgcmVxdWVzdGVkOlxuXG4qKk5hdmlnYXRpbmcgdGhlIEtlcm5lbCdzIEJQRiBDb25maWd1cmF0aW9uKipcblxuT2theSwgdGltZSB0byBkaXZlIGluLiBNeSBpbW1lZGlhdGUgdGhvdWdodCBpcyB0byBzdGFydCB3aXRoIHRoZSBjb25maWd1cmF0aW9uIGZpbGUgZm9yIHRoZSBCZXJrZWxleSBQYWNrZXQgRmlsdGVyIChCUEYpIHN1YnN5c3RlbS4gSSBuZWVkIHRvIGdldCBhIGhhbmRsZSBvbiB0aGUgYXZhaWxhYmxlIG9wdGlvbnMgYW5kIGRlcGVuZGVuY2llcyBiZWZvcmUgSSBnbyBkZWVwZXIuIFRoYXQgbWVhbnMgSSBuZWVkIHRvIGxvb2sgYXQgYGtlcm5lbC9icGYvS2NvbmZpZ2AuIFRoaXMgS2NvbmZpZyBmaWxlIHdpbGwgYmUgdGhlIGNlbnRyYWwgcG9pbnQgdG8gdW5kZXJzdGFuZCBob3cgQlBGIGlzIGludGVncmF0ZWQgaW50byB0aGUga2VybmVsJ3MgYnVpbGQgc3lzdGVtIGFuZCB3aGF0IGZlYXR1cmVzIGNhbiBiZSBlbmFibGVkIG9yIGRpc2FibGVkLiBUaGlzIGlzIHdoZXJlIHRoZSBjb3JlIEJQRiBjb250cm9scyBhcmUgZGVmaW5lZCwgYW5kIHdoZXJlIEkgY2FuIHN0YXJ0IHVudGFuZ2xpbmcgdGhlIHJlbGF0aW9uc2hpcHMgYmV0d2VlbiBkaWZmZXJlbnQgQlBGIGZlYXR1cmVzLiBUaGlzIGlzIHRoZSBsb2dpY2FsIGZpcnN0IHN0ZXAgZm9yIG1lIHRvIHVuZGVyc3RhbmQgaG93IEJQRiBmaXRzIGludG8gdGhlIGtlcm5lbCBjb25maWd1cmF0aW9uLiBMZXQncyBzZWUgd2hhdCdzIGluIHRoZXJlLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxNTMzNywiT3V0cHV0VG9rZW5zIjozNCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjEzLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE3VDIyOjM1OjE2LjY2NjcyNjcxM1oiLCJTZXEiOjE4LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo1NDk3MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJrZXJuZWwvYnBmL0tjb25maWdcIixcbiAgXCJGaXJzdExpbmVcIjogMjAsXG4gIFwiTGluZUNvdW50XCI6IDIwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIiAgMjA6XFx0IyBVc2VkIGJ5IGFyY2hzIHRvIHRlbGwgdGhhdCB0aGV5IHdhbnQgdGhlIEJQRiBKSVQgY29tcGlsZXIgZW5hYmxlZCBieVxcbiAgMjE6XFx0IyBkZWZhdWx0IGZvciBrZXJuZWxzIHRoYXQgd2VyZSBjb21waWxlZCB3aXRoIEJQRiBKSVQgc3VwcG9ydC5cXG4gIDIyOlxcdGNvbmZpZyBBUkNIX1dBTlRfREVGQVVMVF9CUEZfSklUXFxuICAyMzpcXHRcXHRib29sXFxuICAyNDpcXHRcXG4gIDI1OlxcdG1lbnUgXFxcIkJQRiBzdWJzeXN0ZW1cXFwiXFxuICAyNjpcXHRcXG4gIDI3OlxcdGNvbmZpZyBCUEZfU1lTQ0FMTFxcbiAgMjg6XFx0XFx0Ym9vbCBcXFwiRW5hYmxlIGJwZigpIHN5c3RlbSBjYWxsXFxcIlxcbiAgMjk6XFx0XFx0c2VsZWN0IEJQRlxcbiAgMzA6XFx0XFx0c2VsZWN0IElSUV9XT1JLXFxuICAzMTpcXHRcXHRzZWxlY3QgTkVFRF9UQVNLU19SQ1VcXG4gIDMyOlxcdFxcdHNlbGVjdCBUQVNLU19UUkFDRV9SQ1VcXG4gIDMzOlxcdFxcdHNlbGVjdCBCSU5BUllfUFJJTlRGXFxuICAzNDpcXHRcXHRzZWxlY3QgTkVUX1NPQ0tfTVNHIGlmIE5FVFxcbiAgMzU6XFx0XFx0c2VsZWN0IE5FVF9YR1JFU1MgaWYgTkVUXFxuICAzNjpcXHRcXHRzZWxlY3QgUEFHRV9QT09MIGlmIE5FVFxcbiAgMzc6XFx0XFx0ZGVmYXVsdCBuXFxuICAzODpcXHRcXHRoZWxwXFxuICAzOTpcXHRcXHQgIEVuYWJsZSB0aGUgYnBmKCkgc3lzdGVtIGNhbGwgdGhhdCBhbGxvd3MgdG8gbWFuaXB1bGF0ZSBCUEYgcHJvZ3JhbXNcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTdUMjI6MzU6MTYuNjY2NzgzNDYzWiIsIlNlcSI6MTksIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjgzODc4NDc0NTcsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqTXkgQW5hbHlzaXMgb2YgQmxvY2sgSS9PIENHUk9VUCBCUEYgU3VwcG9ydCoqXG5cbk9rYXksIHNvIEknbSBwdXR0aW5nIHRvZ2V0aGVyIHRoZSBwaWVjZXMgZm9yIEJQRiBzeXNjYWxsIHN1cHBvcnQgcmVsYXRlZCB0byBibG9jayBJL08gY2dyb3Vwcy4gVGhlIGNvcmUgaXMgZGVmaW5pdGVseSBnb2luZyB0byByZWx5IG9uIGBCUEZfU1lTQ0FMTGAsIHRoYXQncyBhIGdpdmVuLiBOb3csIGxldCdzIHRhbGsgYWJvdXQgdGhlIHNwZWNpZmljIGNvbmZpZ3MgYW5kIHN5bWJvbHMuXG5cbkkgc2VlIHRoYXQgSSBuZWVkIHRvIGVuYWJsZSBhIGZldyBrZXJuZWwgY29uZmlncyB0byBnZXQgdGhpcyByaWdodC4gVGhlIHJlcXVpcmVkIGNvbmZpZ3VyYXRpb25zIGFyZSBwcmV0dHkgY2xlYXItY3V0OiBgQkxLX0NHUk9VUGAsIGBCUEZfU1lTQ0FMTGAsIGBDR1JPVVBTYCwgYW5kIG9mIGNvdXJzZSwgYEJMT0NLYC4gVGhlIGRlcGVuZGVuY2llcyBzZWVtIHNvdW5kLCBib3RoIGBDR1JPVVBTYCBhbmQgYEJMT0NLYCBhcmUgZnVuZGFtZW50YWwgZm9yIHRoaXMgZnVuY3Rpb25hbGl0eS5cblxuTm93LCB0byB0aGUgc3ltYm9scyBJJ2xsIG5lZWQgdG8gZm9jdXMgb24uIEkndmUgaWRlbnRpZmllZCBgYnBmX2Jsa2NnX2ZsdXNoX3N0YXRzYCwgYGJwZl9pdGVyX2Jsa2dfbmV3YCwgYW5kIGBicGZfaXRlcl9ibGtnX25leHRgLiBJIGluaXRpYWxseSBzcG90dGVkIHRoYXQgYGJwZl9pdGVyX2Jsa2dfZGVzdHJveWAgaXMgYW4gZW1wdHkga2Z1bmMuIEEga2Z1bmMsIGV2ZW4gYW4gZW1wdHkgb25lLCBoYXMgc29tZSBpbXBvcnRhbmNlIHNvIEkgd2lsbCBpbmNsdWRlIGl0LlxuXG5UaGVuLCBJIHN0dW1ibGVkIHVwb24gYGJsa2NnX2ZpbGxfcm9vdF9pb3N0YXRzYC4gSSBub3RpY2VkIGl0IHdhcyBtYWRlIG5vbi1zdGF0aWMsIHNvIGl0J3MgcHJvYmFibHkgaW1wb3J0YW50LiBJdCdzIGNhbGxlZCBmcm9tIGBicGZfYmxrY2dfZmx1c2hfc3RhdHNgIHNvIEkgc2hvdWxkIGluY29ycG9yYXRlIGl0IGludG8gYEZvY3VzU3ltYm9sc2AuIEl0IHJlc2lkZXMgaW4gYGJsb2NrL2Jsay1jZ3JvdXAuY2AgYW5kIGl0ZXJhdGVzIGJsb2NrIGRldmljZXMuIFdoaWxlIGl0J3Mgbm90IGEgcGVyZm9ybWFuY2UtY3JpdGljYWwgcGF0aCwgaXQncyBpbnZvbHZlZCBpbiBzdGF0cyBmbHVzaGluZywgc28gSSB0aGluayBpdCdzIHJlbGV2YW50IHRvIGluY2x1ZGUuXG5cblNvIHRoZSBmaW5hbCBzZXQgb2Ygc3ltYm9scyBJJ20gZm9jdXNpbmcgb24gYXJlOiBgYnBmX2Jsa2NnX2ZsdXNoX3N0YXRzYCwgYGJwZl9pdGVyX2Jsa2dfbmV3YCwgYGJwZl9pdGVyX2Jsa2dfbmV4dGAsIGBicGZfaXRlcl9ibGtnX2Rlc3Ryb3lgLCBhbmQgYGJsa2NnX2ZpbGxfcm9vdF9pb3N0YXRzYC5cblxuSSdtIGNvbmZpZGVudCBpbiB0aGVzZSBzZWxlY3Rpb25zLiBOb3cgSSBzaG91bGQgY2FsbCBgc2V0LXJlc3VsdHNgLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxNTgyOSwiT3V0cHV0VG9rZW5zIjoxNzUsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo0OTIsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0xN1QyMjozNToyNS4wNTQ2MzMzMloiLCJTZXEiOjIwLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJzZXQtcmVzdWx0cyIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjc2OTk2ODgxLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJCTEtfQ0dST1VQXCIsXG4gICAgXCJCUEZfU1lTQ0FMTFwiLFxuICAgIFwiQ0dST1VQU1wiLFxuICAgIFwiQkxPQ0tcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJicGZfYmxrY2dfZmx1c2hfc3RhdHNcIixcbiAgICBcImJwZl9pdGVyX2Jsa2dfbmV3XCIsXG4gICAgXCJicGZfaXRlcl9ibGtnX25leHRcIixcbiAgICBcImJwZl9pdGVyX2Jsa2dfZGVzdHJveVwiLFxuICAgIFwiYmxrY2dfZmlsbF9yb290X2lvc3RhdHNcIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBpbnRyb2R1Y2VzIG5ldyBCUEYga2Z1bmNzIGZvciBibG9jayBjZ3JvdXAgSS9PIHN0YXRpc3RpY3MsIHdoaWNoIGFyZSByZWFjaGFibGUgZnJvbSBCUEYgcHJvZ3JhbXMuIFRoZXNlIGZ1bmN0aW9ucyBhbGxvdyBCUEYgcHJvZ3JhbXMgdG8gZmx1c2ggYmxvY2sgY2dyb3VwIHN0YXRzIGFuZCBpdGVyYXRlIG92ZXIgcGVyLWRldmljZSBibGtncy4gVGhlIGNoYW5nZXMgYXJlIGZ1bmN0aW9uYWxseSBzaWduaWZpY2FudCBhbmQgc2hvdWxkIGJlIGZ1enplZC5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJCTEtfQ0dST1VQXCIsXG4gICAgXCJCUEZfU1lTQ0FMTFwiLFxuICAgIFwiQ0dST1VQU1wiLFxuICAgIFwiQkxPQ0tcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJicGZfYmxrY2dfZmx1c2hfc3RhdHNcIixcbiAgICBcImJwZl9pdGVyX2Jsa2dfbmV3XCIsXG4gICAgXCJicGZfaXRlcl9ibGtnX25leHRcIixcbiAgICBcImJwZl9pdGVyX2Jsa2dfZGVzdHJveVwiLFxuICAgIFwiYmxrY2dfZmlsbF9yb290X2lvc3RhdHNcIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBpbnRyb2R1Y2VzIG5ldyBCUEYga2Z1bmNzIGZvciBibG9jayBjZ3JvdXAgSS9PIHN0YXRpc3RpY3MsIHdoaWNoIGFyZSByZWFjaGFibGUgZnJvbSBCUEYgcHJvZ3JhbXMuIFRoZXNlIGZ1bmN0aW9ucyBhbGxvdyBCUEYgcHJvZ3JhbXMgdG8gZmx1c2ggYmxvY2sgY2dyb3VwIHN0YXRzIGFuZCBpdGVyYXRlIG92ZXIgcGVyLWRldmljZSBibGtncy4gVGhlIGNoYW5nZXMgYXJlIGZ1bmN0aW9uYWxseSBzaWduaWZpY2FudCBhbmQgc2hvdWxkIGJlIGZ1enplZC5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTdUMjI6MzU6MjUuMTMxNjM2NjkxWiIsIlNlcSI6MjEsIk5lc3RpbmciOjEsIlR5cGUiOiJhY3Rpb24iLCJOYW1lIjoiSWYiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNTI3OTcwMDg5MiwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE3VDIyOjM1OjI1LjEzMjA3MjM1MVoiLCJTZXEiOjIyLCJOZXN0aW5nIjoyLCJUeXBlIjoiYWdlbnQiLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJiZXN0LWV4cGVuc2l2ZSIsIkR1cmF0aW9uIjoxNTI3OTI2MDk4MiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggc2VyaWVzIGludHJvZHVjZXMgQlBGIGtmdW5jcyBmb3IgYmxvY2sgY2dyb3VwIChibGtjZykgaXRlcmF0aW9uIGFuZCBzdGF0aXN0aWNzIGZsdXNoaW5nIChgYnBmX2Jsa2NnX2ZsdXNoX3N0YXRzYCwgYGJwZl9pdGVyX2Jsa2dfbmV3YCwgYGJwZl9pdGVyX2Jsa2dfbmV4dGAsIGBicGZfaXRlcl9ibGtnX2Rlc3Ryb3lgKS4gVGhlIGl0ZXJhdG9yIHN0YXRlIChgc3RydWN0IGJwZl9pdGVyX2Jsa2dfa2VybmApIGlzIGZ1bGx5IGluaXRpYWxpemVkIGluIGBicGZfaXRlcl9ibGtnX25ld2AgYmVmb3JlIGJlaW5nIHVzZWQgaW4gc3Vic2VxdWVudCBjYWxscy4gVGhlcmUgYXJlIG5vIG5ldyBrZXJuZWwgc3RydWN0dXJlcyBjb3BpZWQgdG8gdXNlciBzcGFjZSAoZS5nLiwgdmlhIGBjb3B5X3RvX3VzZXJgIG9yIG5ldGxpbmspLCBub3IgYXJlIHRoZXJlIGFueSBjb21wbGV4IGFsbG9jYXRpb25zIHdoZXJlIHVuaW5pdGlhbGl6ZWQgZmllbGRzIGNvdWxkIGJlIGxlYWtlZCBvciB1c2VkIGluIGNvbnRyb2wgZmxvdy4gVGhlIGNoYW5nZXMgcHJpbWFyaWx5IGludm9sdmUgcG9pbnRlciB0cmF2ZXJzYWwgYW5kIEJQRi1hY2Nlc3NpYmxlIHJlYWRzIG9mIGV4aXN0aW5nIGluaXRpYWxpemVkIGNncm91cCBzdHJ1Y3R1cmVzLiBBbnkgcG90ZW50aWFsIG1lbW9yeSBzYWZldHkgaXNzdWVzLCBzdWNoIGFzIG91dC1vZi1ib3VuZHMgYWNjZXNzZXMgb3IgdXNlLWFmdGVyLWZyZWUgYnVncyBkdXJpbmcgaXRlcmF0aW9uLCB3b3VsZCBiZSBlZmZlY3RpdmVseSBjYXVnaHQgYnkgS0FTQU4gYW5kIHRoZSBCUEYgdmVyaWZpZXIuIFRoZXJlZm9yZSwgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGlzIG5vdCByZXF1aXJlZC5cIixcbiAgXCJOZWVkc0tNU0FOXCI6IGZhbHNlXG59IiwiSW5zdHJ1Y3Rpb24iOiJZb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgc2VjdXJpdHkgZW5naW5lZXIgc3BlY2lhbGl6aW5nIGluIGtlcm5lbCBtZW1vcnlcbmVycm9yIGRldGVjdG9ycyAoS0FTQU4gYW5kIEtNU0FOKS4gWW91ciBqb2IgaXMgdG8gcmV2aWV3IHRoZSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kXG5kZXRlcm1pbmUgaWYgdGhlIGNvZGUgY2hhbmdlcyBqdXN0aWZ5IHNwYXduaW5nIGEgZGVkaWNhdGVkIEtNU0FOIChLZXJuZWxNZW1vcnlTYW5pdGl6ZXIpXG5mdXp6aW5nIHNlc3Npb24gaW4gYWRkaXRpb24gdG8gc3RhbmRhcmQgS0FTQU4gZnV6emluZy5cblxuQ1JJVElDQUwgRElTVElOQ1RJT04gQkVUV0VFTiBLQVNBTiBBTkQgS01TQU46XG4tIFN0YW5kYXJkIEtBU0FOIGtlcm5lbCBidWlsZHMgKHVwc3RyZWFtLWFwcGFybW9yLWthc2FuLmNvbmZpZykgYWxyZWFkeSBlbmFibGVcbiAgYSBjb21wcmVoZW5zaXZlIHN1aXRlIG9mIGRlYnVnZ2luZyB0b29scyBhbmQgc2FuaXRpemVycywgaW5jbHVkaW5nIEtBU0FOXG4gIChvdXQtb2YtYm91bmRzIGFjY2Vzc2VzLCB1c2UtYWZ0ZXItZnJlZSwgZG91YmxlIGZyZWUsIGludmFsaWQgZnJlZSksIExPQ0tERVBcbiAgKGxvY2tpbmcgYnVncyBhbmQgZGVhZGxvY2tzKSwgVUItc2FuaXRpemVycywgYW5kIG1lbW9yeSBjb3JydXB0aW9uIGNoZWNrcy5cbi0gS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcikgZGV0ZWN0cyByZWFkcyBvZiBVTklOSVRJQUxJWkVEIG1lbW9yeSAoc3RhY2ssIGhlYXAsXG4gIG9yIHBhZ2UgYWxsb2NhdGlvbnMpIGFuZCBrZXJuZWwtdG8tdXNlciBtZW1vcnkgaW5mby1sZWFrcy5cblxuUnVsZTogVEhFUkUgSVMgTk8gU0VOU0UgSU4gUlVOTklORyBBIEtNU0FOIFNFU1NJT04gSUYgQSBCVUcgQ0FOIEJFIENBVUdIVCBCWSBLQVNBTixcbkxPQ0tERVAsIE9SIE9USEVSIFNUQU5EQVJEIEJVRyBERVRFQ1RPUlMuXG5BIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaW5jdXJzIHNpZ25pZmljYW50IHJlc291cmNlIGNvc3RzLiBZb3UgbXVzdCBPTkxZXG5zZXQgTmVlZHNLTVNBTj10cnVlIGlmIHRoZSBjb2RlIGNoYW5nZXMgaW50cm9kdWNlIG9yIGV4cG9zZSBVTklOSVRJQUxJWkVEIE1FTU9SWSByaXNrc1xudGhhdCBhcmUgZGV0ZWN0ZWQgT05MWSBieSBLTVNBTi5cblxuTG9vayBob2xpc3RpY2FsbHkgYXQgdGhlIHBhdGNoIHNlcmllcyBhbmQgc3Vycm91bmRpbmcgY29kZS4gRXZlbiBpZiBubyBkaXJlY3RcbnVuaW5pdGlhbGl6ZWQgZmllbGQgYWNjZXNzZXMgb3IgbmV3IGJ1ZmZlciBhbGxvY2F0aW9ucyBhcmUgYWRkZWQgaW4gdGhlIGRpZmYgaXRzZWxmLFxuYSBwYXRjaCBtYXkgYWx0ZXIgY29udHJvbCBmbG93LCBib3VuZHMgY2hlY2tpbmcsIG9yIGRhdGEgbGVuZ3RoIGNhbGN1bGF0aW9ucyBpbiB3YXlzXG50aGF0IGNoYW5nZSBob3cgdGhlIHJlc3Qgb2YgdGhlIGNvZGUgb3BlcmF0ZXMgb24gZXhpc3RpbmcgYnVmZmVycyAoZS5nLiBhbGxvd2luZ1xudW5pbml0aWFsaXplZCBzdGFjay9oZWFwIG1lbW9yeSB0byBiZSByZWFkLCBjb3BpZWQgdG8gdXNlciBzcGFjZSwgb3IgdXNlZCBpbiBjb250cm9sXG5mbG93KS4gRG8gbm90IGhlc2l0YXRlIHRvIHVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUsXG5jYWxsZWQgZnVuY3Rpb25zLCBhbmQgY2FsbGVycy5cblxuU2V0IE5lZWRzS01TQU49dHJ1ZSBPTkxZIElGIHRoZSBwYXRjaCBpbnRyb2R1Y2VzIG9yIG1vZGlmaWVzOlxuMS4gS2VybmVsIHN0cnVjdHVyZXMgc2VudCB0byB1c2VyIHNwYWNlICh2aWEgY29weV90b191c2VyLCBwdXRfdXNlciwgbmV0bGluayBza2JcbiAgIGF0dHJpYnV0ZXMsIGlvY3RsIG91dHB1dCBhcmd1bWVudHMsIHNvY2tldCBvcHRpb25zLCBvciBCUEYgYnVmZmVycykgd2hlcmUgZmllbGRzXG4gICBvciBzdHJ1Y3R1cmUgcGFkZGluZyBtaWdodCBub3QgYmUgZnVsbHkgaW5pdGlhbGl6ZWQvemVyb2VkLlxuMi4gQ29uZGl0aW9uYWwgbG9naWMgb3IgYnJhbmNoaW5nIHRoYXQgZGVwZW5kcyBvbiBwb3RlbnRpYWxseSB1bmluaXRpYWxpemVkIHZhcmlhYmxlc1xuICAgb3Igc3RydWN0IGZpZWxkcy5cbjMuIEFsbG9jYXRpb24gb3IgaW5pdGlhbGl6YXRpb24gb2YgY29tcGxleCBkYXRhIHN0cnVjdHVyZXMgd2hlcmUgdW5pbml0aWFsaXplZCBmaWVsZHNcbiAgIGNvdWxkIGJlIHJlYWQgbGF0ZXIgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMuXG40LiBCb3VuZHMgY2hlY2tzLCBsZW5ndGhzLCBvciBsb2dpYyBpbiBhIHdheSB0aGF0IGFsbG93cyBzdXJyb3VuZGluZyBjb2RlIHRvIGFjY2Vzc1xuICAgdW5pbml0aWFsaXplZCBieXRlcyBvZiBleGlzdGluZyBidWZmZXJzLlxuXG5TZXQgTmVlZHNLTVNBTj1mYWxzZSBJRjpcbi0gVGhlIGNvZGUgY2hhbmdlcyBwcmltYXJpbHkgcmlzayBvdXQtb2YtYm91bmRzIGFjY2VzcywgYXJyYXkgb3ZlcmZsb3dzLCBOVUxMIHBvaW50ZXJcbiAgZGVyZWZlcmVuY2VzLCBsb2NraW5nIGRlYWRsb2Nrcywgb3IgdXNlLWFmdGVyLWZyZWUgYnVncyAodGhlc2UgYXJlIGFscmVhZHkgY2F1Z2h0XG4gIGJ5IEtBU0FOLCBMT0NLREVQLCBvciBzdGFuZGFyZCBidWcgZGV0ZWN0b3JzKS5cbi0gQWxsIHN0YWNrL2hlYXAgc3RydWN0dXJlcyB0b3VjaGVkIG9yIGludHJvZHVjZWQgYnkgdGhlIHBhdGNoIGFyZSBmdWxseSB6ZXJvZWRcbiAgb3IgaW5pdGlhbGl6ZWQgKGUuZy4gdXNpbmcgPSB7MH0sIG1lbXNldCwga3phbGxvYykgYmVmb3JlIGJlaW5nIHJlYWQgb3IgY29waWVkLlxuLSBUaGUgcGF0Y2ggZG9lcyBub3QgaW50cm9kdWNlIGFueSByaXNrIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHVzYWdlIG9yIGluZm8tbGVha3MuXG5cblVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUgaWYgbmVjZXNzYXJ5LCB0aGVuIHByb3ZpZGVcbmRldGFpbGVkIEtNU0FOUmVhc29uaW5nIGNvbnRyYXN0aW5nIEtBU0FOIHZzIEtNU0FOIGFwcGxpY2FiaWxpdHkgZm9yIHRoaXMgcGF0Y2guXG5QcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy5cblxuXG5Vc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLlxuSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuXG5JZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuXG4iLCJQcm9tcHQiOiJGb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczpcbmNvbW1pdCA3NzMwMDM2M2ZlOWM1YjBhZmMzNmQ5Zjc0ZWFkYjQxYmE2ZGQ1M2E1XG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIE1vbiBBdWcgMTcgMjI6MzQ6MzIgMjAyNiArMDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS9NQUlOVEFJTkVSUyBiL01BSU5UQUlORVJTXG5pbmRleCAyZjk0NzJjMWEwOTA3Li44N2M1NmU5NTU1NzcxIDEwMDY0NFxuLS0tIGEvTUFJTlRBSU5FUlNcbisrKyBiL01BSU5UQUlORVJTXG5AQCAtNjYxNyw2ICs2NjE3LDcgQEAgRjpcdGJsb2NrL2Jsay1jZ3JvdXAuY1xuIEY6XHRibG9jay9ibGstaW9jb3N0LmNcbiBGOlx0YmxvY2svYmxrLWlvbGF0ZW5jeS5jXG4gRjpcdGJsb2NrL2Jsay10aHJvdHRsZS5jXG4rRjpcdGJsb2NrL2JwZl9ibGtjZy5jXG4gRjpcdGluY2x1ZGUvbGludXgvYmxrLWNncm91cC5oXG4gXG4gQ09OVFJPTCBHUk9VUCAtIENQVVNFVFxuZGlmZiAtLWdpdCBhL2Jsb2NrL01ha2VmaWxlIGIvYmxvY2svTWFrZWZpbGVcbmluZGV4IGU3YmQzMjBlM2Q2OTcuLjU3MmU0OTk4OGM4ZWUgMTAwNjQ0XG4tLS0gYS9ibG9jay9NYWtlZmlsZVxuKysrIGIvYmxvY2svTWFrZWZpbGVcbkBAIC0xNyw2ICsxNyw5IEBAIG9iai0kKENPTkZJR19CTEtfRVJST1JfSU5KRUNUSU9OKSArPSBlcnJvci1pbmplY3Rpb24ub1xuIG9iai0kKENPTkZJR19CTEtfREVWX0JTR19DT01NT04pICs9IGJzZy5vXG4gb2JqLSQoQ09ORklHX0JMS19ERVZfQlNHTElCKVx0Kz0gYnNnLWxpYi5vXG4gb2JqLSQoQ09ORklHX0JMS19DR1JPVVApXHQrPSBibGstY2dyb3VwLm9cbitpZmRlZiBDT05GSUdfQlBGX1NZU0NBTExcbitvYmotJChDT05GSUdfQkxLX0NHUk9VUClcdCs9IGJwZl9ibGtjZy5vXG4rZW5kaWZcbiBvYmotJChDT05GSUdfQkxLX0NHUk9VUF9SV1NUQVQpXHQrPSBibGstY2dyb3VwLXJ3c3RhdC5vXG4gb2JqLSQoQ09ORklHX0JMS19DR1JPVVBfRkNfQVBQSUQpICs9IGJsay1jZ3JvdXAtZmMtYXBwaWQub1xuIG9iai0kKENPTkZJR19CTEtfREVWX1RIUk9UVExJTkcpXHQrPSBibGstdGhyb3R0bGUub1xuZGlmZiAtLWdpdCBhL2Jsb2NrL2Jsay1jZ3JvdXAuYyBiL2Jsb2NrL2Jsay1jZ3JvdXAuY1xuaW5kZXggZDk2NzYxMjZjNWI1ZC4uOGQ1MzhhZDRlODYxYyAxMDA2NDRcbi0tLSBhL2Jsb2NrL2Jsay1jZ3JvdXAuY1xuKysrIGIvYmxvY2svYmxrLWNncm91cC5jXG5AQCAtMTA4Niw3ICsxMDg2LDcgQEAgc3RhdGljIHZvaWQgYmxrY2dfcnN0YXRfZmx1c2goc3RydWN0IGNncm91cF9zdWJzeXNfc3RhdGUgKmNzcywgaW50IGNwdSlcbiAgKiBmbHVzaGluZyB0aGUgcm9vdCBjZ3JvdXAncyBzdGF0cyBieSBleHBsaWNpdGx5IGZpbGxpbmcgaW4gdGhlIGlvc3RhdFxuICAqIHdpdGggZGlzayBsZXZlbCBzdGF0aXN0aWNzLlxuICAqL1xuLXN0YXRpYyB2b2lkIGJsa2NnX2ZpbGxfcm9vdF9pb3N0YXRzKHZvaWQpXG4rdm9pZCBibGtjZ19maWxsX3Jvb3RfaW9zdGF0cyh2b2lkKVxuIHtcbiBcdHN0cnVjdCBjbGFzc19kZXZfaXRlciBpdGVyO1xuIFx0c3RydWN0IGRldmljZSAqZGV2O1xuZGlmZiAtLWdpdCBhL2Jsb2NrL2Jsay1jZ3JvdXAuaCBiL2Jsb2NrL2Jsay1jZ3JvdXAuaFxuaW5kZXggNjE1MzkwZjc1MWFhMi4uOGM5YzJhMWFkZmFhNCAxMDA2NDRcbi0tLSBhL2Jsb2NrL2Jsay1jZ3JvdXAuaFxuKysrIGIvYmxvY2svYmxrLWNncm91cC5oXG5AQCAtMjA1LDYgKzIwNSw3IEBAIHZvaWQgYmxrY2dfZGVhY3RpdmF0ZV9wb2xpY3koc3RydWN0IGdlbmRpc2sgKmRpc2ssXG4gXHRcdFx0ICAgICBjb25zdCBzdHJ1Y3QgYmxrY2dfcG9saWN5ICpwb2wpO1xuIFxuIGNvbnN0IGNoYXIgKmJsa2dfZGV2X25hbWUoc3RydWN0IGJsa2NnX2dxICpibGtnKTtcbit2b2lkIGJsa2NnX2ZpbGxfcm9vdF9pb3N0YXRzKHZvaWQpO1xuIHZvaWQgYmxrY2dfcHJpbnRfYmxrZ3Moc3RydWN0IHNlcV9maWxlICpzZiwgc3RydWN0IGJsa2NnICpibGtjZyxcbiBcdFx0ICAgICAgIHU2NCAoKnByZmlsbCkoc3RydWN0IHNlcV9maWxlICosXG4gXHRcdFx0XHQgICAgIHN0cnVjdCBibGtnX3BvbGljeV9kYXRhICosIGludCksXG5kaWZmIC0tZ2l0IGEvYmxvY2svYnBmX2Jsa2NnLmMgYi9ibG9jay9icGZfYmxrY2cuY1xubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAuLjI1YzgwOWY1MDkxYzJcbi0tLSAvZGV2L251bGxcbisrKyBiL2Jsb2NrL2JwZl9ibGtjZy5jXG5AQCAtMCwwICsxLDE1NCBAQFxuKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9yLWxhdGVyXG4rLypcbisgKiBCbG9jayBJL08gQ29udHJvbGxlci1yZWxhdGVkIEJQRiBrZnVuY3MgYW5kIGF1eGlsaWFyeSBjb2RlXG4rICovXG4rXG4rI2luY2x1ZGUgXCJibGstY2dyb3VwLmhcIlxuK1xuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L2JwZi5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvYnRmX2lkcy5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvcmN1bGlzdC5oXHUwMDNlXG4rXG4rX19icGZfa2Z1bmNfc3RhcnRfZGVmcygpO1xuK1xuKy8qKlxuKyAqIGJwZl9ibGtjZ19mbHVzaF9zdGF0cyAtIEZsdXNoIGEgYmxvY2sgY2dyb3VwJ3MgaW8gc3RhdGlzdGljc1xuKyAqIEBjZ3JwOiBjZ3JvdXAgdG8gZmx1c2hcbisgKlxuKyAqIFByb3BhZ2F0ZSBJL08gc3RhdGlzdGljcyB1cCB0aGUgY2dyb3VwIHRyZWUuIFJvb3Qgc3RhdGlzdGljcyBjb21lIGZyb21cbisgKiBibG9jayBkZXZpY2VzIGFuZCBpbmNsdWRlIGFsbCBjZ3JvdXBzJyBJL08uXG4rICovXG4rX19icGZfa2Z1bmMgdm9pZCBicGZfYmxrY2dfZmx1c2hfc3RhdHMoc3RydWN0IGNncm91cCAqY2dycClcbit7XG4rXHRzdHJ1Y3QgY2dyb3VwX3N1YnN5c19zdGF0ZSAqY3NzO1xuK1xuK1x0LyogUGluIHRoZSBjc3MgZm9yIHRoZSBzbGVlcGFibGUgZmx1c2guICovXG4rXHRyY3VfcmVhZF9sb2NrKCk7XG4rXHRjc3MgPSBjZ3JvdXBfY3NzKGNncnAsIFx1MDAyNmlvX2NncnBfc3Vic3lzKTtcbitcdGlmIChjc3MgXHUwMDI2XHUwMDI2ICFjc3NfdHJ5Z2V0KGNzcykpXG4rXHRcdGNzcyA9IE5VTEw7XG4rXHRyY3VfcmVhZF91bmxvY2soKTtcbitcbitcdGlmICghY3NzKVxuK1x0XHRyZXR1cm47XG4rXG4rXHRpZiAoIWNzcy1cdTAwM2VwYXJlbnQpXG4rXHRcdGJsa2NnX2ZpbGxfcm9vdF9pb3N0YXRzKCk7XG4rXHRlbHNlXG4rXHRcdGNzc19yc3RhdF9mbHVzaChjc3MpO1xuK1xuK1x0Y3NzX3B1dChjc3MpO1xuK31cbitcbitzdHJ1Y3QgYnBmX2l0ZXJfYmxrZyB7XG4rXHRfX3U2NCBfX29wYXF1ZVsyXTtcbit9IF9fYWxpZ25lZCg4KTtcbitcbitzdHJ1Y3QgYnBmX2l0ZXJfYmxrZ19rZXJuIHtcbitcdHN0cnVjdCBibGtjZyAqYmxrY2c7XG4rXHRzdHJ1Y3QgYmxrY2dfZ3EgKnBvcztcbit9IF9fYWxpZ25lZCg4KTtcbitcbisvKipcbisgKiBicGZfaXRlcl9ibGtnX25ldyAtIFN0YXJ0IGl0ZXJhdGluZyBhIGJsb2NrIGNncm91cCdzIHBlci1kZXZpY2UgYmxrZ3NcbisgKiBAaXQ6IGl0ZXJhdG9yIHRvIGluaXRpYWxpemVcbisgKiBAY3NzOiB0aGUgaW8gY29udHJvbGxlcidzIGNzc1xuKyAqXG4rICogRWFjaCBibGtnIGhvbGRzIG9uZSBkZXZpY2UncyBpby5zdGF0IGNvdW50ZXJzLiBPZmZsaW5lIGJsa2dzIGFyZSBza2lwcGVkLlxuKyAqIEEgYmxrZyB3aXRob3V0IGEgZGlzayBjYW4gYmUgcmV0dXJuZWQuIE11c3QgcnVuIHVuZGVyIFJDVS5cbisgKlxuKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCAtRUlOVkFMIGlmIEBjc3MgaXMgbm90IHRoZSBpbyBjb250cm9sbGVyJ3MuXG4rICovXG4rX19icGZfa2Z1bmMgaW50IGJwZl9pdGVyX2Jsa2dfbmV3KHN0cnVjdCBicGZfaXRlcl9ibGtnICppdCxcbitcdFx0XHRcdCAgc3RydWN0IGNncm91cF9zdWJzeXNfc3RhdGUgKmNzcylcbit7XG4rXHRzdHJ1Y3QgYnBmX2l0ZXJfYmxrZ19rZXJuICpraXQgPSAodm9pZCAqKWl0O1xuK1xuK1x0QlVJTERfQlVHX09OKHNpemVvZihzdHJ1Y3QgYnBmX2l0ZXJfYmxrZ19rZXJuKSBcdTAwM2Ugc2l6ZW9mKHN0cnVjdCBicGZfaXRlcl9ibGtnKSk7XG4rXHRCVUlMRF9CVUdfT04oX19hbGlnbm9mX18oc3RydWN0IGJwZl9pdGVyX2Jsa2dfa2VybikgIT1cbitcdFx0ICAgICBfX2FsaWdub2ZfXyhzdHJ1Y3QgYnBmX2l0ZXJfYmxrZykpO1xuK1xuK1x0a2l0LVx1MDAzZXBvcyA9IE5VTEw7XG4rXG4rXHRpZiAoY3NzLVx1MDAzZXNzICE9IFx1MDAyNmlvX2NncnBfc3Vic3lzKSB7XG4rXHRcdGtpdC1cdTAwM2VibGtjZyA9IE5VTEw7XG4rXHRcdHJldHVybiAtRUlOVkFMO1xuK1x0fVxuK1xuK1x0a2l0LVx1MDAzZWJsa2NnID0gY3NzX3RvX2Jsa2NnKGNzcyk7XG4rXHRyZXR1cm4gMDtcbit9XG4rXG4rLyoqXG4rICogYnBmX2l0ZXJfYmxrZ19uZXh0IC0gUmV0dXJuIHRoZSBuZXh0IG9ubGluZSBibGtnIG9mIHRoZSBpdGVyYXRlZCBibG9jayBjZ3JvdXBcbisgKiBAaXQ6IGl0ZXJhdG9yXG4rICpcbisgKiBSZXR1cm46IHRoZSBuZXh0IG9ubGluZSBibGtnLCBvciBOVUxMIHdoZW4gdGhlIHdhbGsgaXMgZG9uZS5cbisgKi9cbitfX2JwZl9rZnVuYyBzdHJ1Y3QgYmxrY2dfZ3EgKmJwZl9pdGVyX2Jsa2dfbmV4dChzdHJ1Y3QgYnBmX2l0ZXJfYmxrZyAqaXQpXG4re1xuK1x0c3RydWN0IGJwZl9pdGVyX2Jsa2dfa2VybiAqa2l0ID0gKHZvaWQgKilpdDtcbitcdHN0cnVjdCBibGtjZ19ncSAqYmxrZyA9IGtpdC1cdTAwM2Vwb3M7XG4rXHRzdHJ1Y3QgaGxpc3Rfbm9kZSAqbm9kZTtcbitcbitcdGlmICgha2l0LVx1MDAzZWJsa2NnKVxuK1x0XHRyZXR1cm4gTlVMTDtcbitcbitcdGlmICghYmxrZylcbitcdFx0bm9kZSA9IHJjdV9kZXJlZmVyZW5jZShobGlzdF9maXJzdF9yY3UoXHUwMDI2a2l0LVx1MDAzZWJsa2NnLVx1MDAzZWJsa2dfbGlzdCkpO1xuK1x0ZWxzZVxuK1x0XHRub2RlID0gcmN1X2RlcmVmZXJlbmNlKGhsaXN0X25leHRfcmN1KFx1MDAyNmJsa2ctXHUwMDNlYmxrY2dfbm9kZSkpO1xuK1xuK1x0LyogU2tpcCBvZmZsaW5lIGJsa2dzLCBtYXRjaGluZyBpby5zdGF0LiAqL1xuK1x0d2hpbGUgKG5vZGUpIHtcbitcdFx0YmxrZyA9IGhsaXN0X2VudHJ5KG5vZGUsIHN0cnVjdCBibGtjZ19ncSwgYmxrY2dfbm9kZSk7XG4rXHRcdC8qIEEgcmFjZSBvbmx5IGNoYW5nZXMgd2hldGhlciB0aGlzIGJsa2cgaXMgcmV0dXJuZWQuICovXG4rXHRcdGlmIChkYXRhX3JhY2UoYmxrZy1cdTAwM2VvbmxpbmUpKSB7XG4rXHRcdFx0a2l0LVx1MDAzZXBvcyA9IGJsa2c7XG4rXHRcdFx0cmV0dXJuIGJsa2c7XG4rXHRcdH1cbitcdFx0bm9kZSA9IHJjdV9kZXJlZmVyZW5jZShobGlzdF9uZXh0X3JjdShcdTAwMjZibGtnLVx1MDAzZWJsa2NnX25vZGUpKTtcbitcdH1cbitcbitcdC8qIFRoZSBpdGVyYXRvciBtdXN0IGtlZXAgcmV0dXJuaW5nIE5VTEwgYWZ0ZXIgY29tcGxldGlvbi4gKi9cbitcdGtpdC1cdTAwM2Vwb3MgPSBOVUxMO1xuK1x0a2l0LVx1MDAzZWJsa2NnID0gTlVMTDtcbitcdHJldHVybiBOVUxMO1xuK31cbitcbisvKipcbisgKiBicGZfaXRlcl9ibGtnX2Rlc3Ryb3kgLSBUZWFyIGRvd24gYSBibGtnIGl0ZXJhdG9yXG4rICogQGl0OiBpdGVyYXRvclxuKyAqL1xuK19fYnBmX2tmdW5jIHZvaWQgYnBmX2l0ZXJfYmxrZ19kZXN0cm95KHN0cnVjdCBicGZfaXRlcl9ibGtnICppdClcbit7XG4rfVxuK1xuK19fYnBmX2tmdW5jX2VuZF9kZWZzKCk7XG4rXG4rQlRGX0tGVU5DU19TVEFSVChicGZfYmxrY2dfa2Z1bmNzKVxuK0JURl9JRF9GTEFHUyhmdW5jLCBicGZfYmxrY2dfZmx1c2hfc3RhdHMsIEtGX1NMRUVQQUJMRSlcbitcbitCVEZfSURfRkxBR1MoZnVuYywgYnBmX2l0ZXJfYmxrZ19uZXcsXG4rXHQgICAgIEtGX0lURVJfTkVXIHwgS0ZfUkNVIHwgS0ZfUkNVX1BST1RFQ1RFRClcbitCVEZfSURfRkxBR1MoZnVuYywgYnBmX2l0ZXJfYmxrZ19uZXh0LCBLRl9JVEVSX05FWFQgfCBLRl9SRVRfTlVMTClcbitCVEZfSURfRkxBR1MoZnVuYywgYnBmX2l0ZXJfYmxrZ19kZXN0cm95LCBLRl9JVEVSX0RFU1RST1kpXG4rQlRGX0tGVU5DU19FTkQoYnBmX2Jsa2NnX2tmdW5jcylcbitcbitzdGF0aWMgY29uc3Qgc3RydWN0IGJ0Zl9rZnVuY19pZF9zZXQgYnBmX2Jsa2NnX2tmdW5jX3NldCA9IHtcbitcdC5vd25lclx0XHQ9IFRISVNfTU9EVUxFLFxuK1x0LnNldFx0XHQ9IFx1MDAyNmJwZl9ibGtjZ19rZnVuY3MsXG4rfTtcbitcbitzdGF0aWMgaW50IF9faW5pdCBicGZfYmxrY2dfaW5pdCh2b2lkKVxuK3tcbitcdGludCBlcnI7XG4rXG4rXHRlcnIgPSByZWdpc3Rlcl9idGZfa2Z1bmNfaWRfc2V0KEJQRl9QUk9HX1RZUEVfVU5TUEVDLFxuK1x0XHRcdFx0XHRcdTAwMjZicGZfYmxrY2dfa2Z1bmNfc2V0KTtcbitcdGlmIChlcnIpXG4rXHRcdHByX3dhcm4oXCJlcnJvciB3aGlsZSByZWdpc3RlcmluZyBicGYgYmxrY2cga2Z1bmNzOiAlZFxcblwiLCBlcnIpO1xuK1xuK1x0cmV0dXJuIGVycjtcbit9XG4rbGF0ZV9pbml0Y2FsbChicGZfYmxrY2dfaW5pdCk7XG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL2Nncm91cF9pdGVyX2lvLmggYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvY2dyb3VwX2l0ZXJfaW8uaFxubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAuLmY0YmJhYWNjZGY3MTZcbi0tLSAvZGV2L251bGxcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9jZ3JvdXBfaXRlcl9pby5oXG5AQCAtMCwwICsxLDE3IEBAXG4rLyogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAgKi9cbisvKiBDb3B5cmlnaHQgKGMpIDIwMjUgTWV0YSBQbGF0Zm9ybXMsIEluYy4gYW5kIGFmZmlsaWF0ZXMuICovXG4rI2lmbmRlZiBfX0NHUk9VUF9JVEVSX0lPX0hcbisjZGVmaW5lIF9fQ0dST1VQX0lURVJfSU9fSFxuK1xuK3N0cnVjdCBpb19xdWVyeSB7XG4rXHQvKiBvbmUgZGV2aWNlJ3MgaW8uc3RhdCBjb3VudGVycyAqL1xuK1x0X191NjQgcmJ5dGVzO1xuK1x0X191NjQgd2J5dGVzO1xuK1x0X191NjQgcmlvcztcbitcdF9fdTY0IHdpb3M7XG4rXHRfX3U2NCBkYnl0ZXM7XG4rXHRfX3U2NCBkaW9zO1xuK1x0X191NjQgZGV2O1x0LyogZGV2X3Qgb2YgdGhlIGRldmljZSB0aGUgY291bnRlcnMgYmVsb25nIHRvICovXG4rfTtcbitcbisjZW5kaWYgLyogX19DR1JPVVBfSVRFUl9JT19IICovXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL2NvbmZpZyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9jb25maWdcbmluZGV4IGVhNzA0NGYzMGFkYzMuLjI3MGU2YmY5MTk0ZDIgMTAwNjQ0XG4tLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvY29uZmlnXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvY29uZmlnXG5AQCAtMSwzICsxLDQgQEBcbitDT05GSUdfQkxLX0NHUk9VUD15XG4gQ09ORklHX0JMS19ERVZfTE9PUD15XG4gQ09ORklHX0JPT1RQQVJBTV9IQVJETE9DS1VQX1BBTklDPXlcbiBDT05GSUdfQk9PVFBBUkFNX1NPRlRMT0NLVVBfUEFOSUM9MVxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2Nncm91cF9pdGVyX2lvLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9jZ3JvdXBfaXRlcl9pby5jXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uNWQyN2U1ZDI4Mzc5NVxuLS0tIC9kZXYvbnVsbFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvY2dyb3VwX2l0ZXJfaW8uY1xuQEAgLTAsMCArMSwyNzcgQEBcbisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxuKy8qIENvcHlyaWdodCAoYykgMjAyNSBNZXRhIFBsYXRmb3JtcywgSW5jLiBhbmQgYWZmaWxpYXRlcy4gKi9cbisjZGVmaW5lIF9HTlVfU09VUkNFXG4rI2luY2x1ZGUgXHUwMDNjdGVzdF9wcm9ncy5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjYnBmL2xpYmJwZi5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjZmNudGwuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L2xvb3AuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3N0ZGxpYi5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3RyaW5nLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NzeXMvaW9jdGwuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3N5cy9zdGF0LmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NzeXMvc3lzbWFjcm9zLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2N1bmlzdGQuaFx1MDAzZVxuKyNpbmNsdWRlIFwiY2dyb3VwX2hlbHBlcnMuaFwiXG4rI2luY2x1ZGUgXCJjZ3JvdXBfaXRlcl9pby5oXCJcbisjaW5jbHVkZSBcImNncm91cF9pdGVyX2lvLnNrZWwuaFwiXG4rXG4rI2RlZmluZSBJT19TSVpFICg0ICogMTAyNCAqIDEwMjQpXG4rXG4rc3RhdGljIGludCByZWFkX3N0YXRzKHN0cnVjdCBicGZfbGluayAqbGluaylcbit7XG4rXHRpbnQgZmQsIHJldCA9IDA7XG4rXHRzc2l6ZV90IGJ5dGVzO1xuK1xuK1x0ZmQgPSBicGZfaXRlcl9jcmVhdGUoYnBmX2xpbmtfX2ZkKGxpbmspKTtcbitcdGlmICghQVNTRVJUX09LX0ZEKGZkLCBcImJwZl9pdGVyX2NyZWF0ZVwiKSlcbitcdFx0cmV0dXJuIDE7XG4rXG4rXHQvKiBSZXN1bHRzIGxhbmQgaW4gc2tlbC1cdTAwM2VkYXRhX3F1ZXJ5OyB0aGUgcmVhZCBpdHNlbGYgcmV0dXJucyBubyBkYXRhLiAqL1xuK1x0Ynl0ZXMgPSByZWFkKGZkLCBOVUxMLCAwKTtcbitcdGlmICghQVNTRVJUX0VRKGJ5dGVzLCAwLCBcInJlYWQgZmRcIikpXG4rXHRcdHJldCA9IDE7XG4rXG4rXHRjbG9zZShmZCk7XG4rXHRyZXR1cm4gcmV0O1xuK31cbitcbisvKiBTZXQgdXAgYSBsb29wIGRldmljZSBmb3IgY2dyb3VwLWNoYXJnZWQgSS9PLiAqL1xuK3N0YXRpYyBpbnQgbG9vcF9zZXR1cChjaGFyICpsb29wX3BhdGgsIHNpemVfdCBzeiwgaW50ICpjdGxfZmQsIGludCAqbG9vcF9mZCxcbitcdFx0ICAgICAgaW50ICpiYWNrX2ZkKVxuK3tcbitcdGNoYXIgYmFja19wYXRoW10gPSBcIi90bXAvY2dyb3VwX2l0ZXJfaW8uWFhYWFhYXCI7XG4rXHRpbnQgbnI7XG4rXG4rXHQqY3RsX2ZkID0gKmxvb3BfZmQgPSAqYmFja19mZCA9IC0xO1xuK1xuK1x0KmN0bF9mZCA9IG9wZW4oXCIvZGV2L2xvb3AtY29udHJvbFwiLCBPX1JEV1IgfCBPX0NMT0VYRUMpO1xuK1x0aWYgKCpjdGxfZmQgXHUwMDNjIDApXG4rXHRcdHJldHVybiAtMTtcbitcbitcdG5yID0gaW9jdGwoKmN0bF9mZCwgTE9PUF9DVExfR0VUX0ZSRUUpO1xuK1x0aWYgKG5yIFx1MDAzYyAwKVxuK1x0XHRnb3RvIGVycjtcbitcdHNucHJpbnRmKGxvb3BfcGF0aCwgc3osIFwiL2Rldi9sb29wJWRcIiwgbnIpO1xuK1xuK1x0KmJhY2tfZmQgPSBta3N0ZW1wKGJhY2tfcGF0aCk7XG4rXHRpZiAoKmJhY2tfZmQgXHUwMDNjIDApXG4rXHRcdGdvdG8gZXJyO1xuK1x0dW5saW5rKGJhY2tfcGF0aCk7XG4rXHRpZiAoZnRydW5jYXRlKCpiYWNrX2ZkLCAob2ZmX3QpSU9fU0laRSAqIDQpKVxuK1x0XHRnb3RvIGVycjtcbitcbitcdCpsb29wX2ZkID0gb3Blbihsb29wX3BhdGgsIE9fUkRXUiB8IE9fQ0xPRVhFQyk7XG4rXHRpZiAoKmxvb3BfZmQgXHUwMDNjIDApXG4rXHRcdGdvdG8gZXJyO1xuK1x0aWYgKGlvY3RsKCpsb29wX2ZkLCBMT09QX1NFVF9GRCwgKmJhY2tfZmQpKVxuK1x0XHRnb3RvIGVycjtcbitcbitcdHJldHVybiAwO1xuK2VycjpcbitcdGlmICgqbG9vcF9mZCBcdTAwM2U9IDApXG4rXHRcdGNsb3NlKCpsb29wX2ZkKTtcbitcdGlmICgqYmFja19mZCBcdTAwM2U9IDApXG4rXHRcdGNsb3NlKCpiYWNrX2ZkKTtcbitcdGNsb3NlKCpjdGxfZmQpO1xuK1x0KmN0bF9mZCA9ICpsb29wX2ZkID0gKmJhY2tfZmQgPSAtMTtcbitcdHJldHVybiAtMTtcbit9XG4rXG4rc3RhdGljIHZvaWQgbG9vcF90ZWFyZG93bihjb25zdCBjaGFyICpsb29wX3BhdGgsIGludCBjdGxfZmQsIGludCBsb29wX2ZkLFxuK1x0XHRcdCAgaW50IGJhY2tfZmQpXG4re1xuK1x0aW50IG5yID0gLTE7XG4rXG4rXHRpZiAobG9vcF9mZCBcdTAwM2U9IDApIHtcbitcdFx0aW9jdGwobG9vcF9mZCwgTE9PUF9DTFJfRkQsIDApO1xuK1x0XHRjbG9zZShsb29wX2ZkKTtcbitcdH1cbitcdGlmIChiYWNrX2ZkIFx1MDAzZT0gMClcbitcdFx0Y2xvc2UoYmFja19mZCk7XG4rXHRpZiAoY3RsX2ZkIFx1MDAzZT0gMCkge1xuK1x0XHRpZiAoc3NjYW5mKGxvb3BfcGF0aCwgXCIvZGV2L2xvb3AlZFwiLCBcdTAwMjZucikgPT0gMSBcdTAwMjZcdTAwMjYgbnIgXHUwMDNlPSAwKVxuK1x0XHRcdGlvY3RsKGN0bF9mZCwgTE9PUF9DVExfUkVNT1ZFLCBucik7XG4rXHRcdGNsb3NlKGN0bF9mZCk7XG4rXHR9XG4rfVxuK1xuKy8qIE9fRElSRUNUIGtlZXBzIEkvTyBjaGFyZ2VkIHRvIHRoZSBjdXJyZW50IGNncm91cC4gKi9cbitzdGF0aWMgaW50IGRvX2RpcmVjdF9pbyhjb25zdCBjaGFyICpsb29wX3BhdGgpXG4re1xuK1x0dm9pZCAqYnVmO1xuK1x0aW50IGZkLCByZXQgPSAtMTtcbitcbitcdGZkID0gb3Blbihsb29wX3BhdGgsIE9fUkRXUiB8IE9fRElSRUNUIHwgT19DTE9FWEVDKTtcbitcdGlmIChmZCBcdTAwM2MgMClcbitcdFx0cmV0dXJuIC0xO1xuK1x0aWYgKHBvc2l4X21lbWFsaWduKFx1MDAyNmJ1ZiwgNDA5NiwgSU9fU0laRSkpXG4rXHRcdGdvdG8gb3V0X2ZkO1xuK1x0bWVtc2V0KGJ1ZiwgMHhhYiwgSU9fU0laRSk7XG4rXG4rXHRpZiAocHdyaXRlKGZkLCBidWYsIElPX1NJWkUsIDApICE9IElPX1NJWkUpXG4rXHRcdGdvdG8gb3V0X2J1ZjtcbitcdGZzeW5jKGZkKTtcbitcdGlmIChwcmVhZChmZCwgYnVmLCBJT19TSVpFLCAwKSAhPSBJT19TSVpFKVxuK1x0XHRnb3RvIG91dF9idWY7XG4rXHRyZXQgPSAwO1xuK291dF9idWY6XG4rXHRmcmVlKGJ1Zik7XG4rb3V0X2ZkOlxuK1x0Y2xvc2UoZmQpO1xuK1x0cmV0dXJuIHJldDtcbit9XG4rXG4rLyogUmVhZCBAZGV2J3MgaW8uc3RhdCBjb3VudGVycy4gQGRldiB1c2VzIGtlcm5lbCBkZXZfdCBlbmNvZGluZy4gKi9cbitzdGF0aWMgaW50IHBhcnNlX2lvX3N0YXQoaW50IGNncm91cF9mZCwgX191NjQgZGV2LCBzdHJ1Y3QgaW9fcXVlcnkgKm91dClcbit7XG4rXHR1bnNpZ25lZCBpbnQgd2FudF9tYWogPSBkZXYgXHUwMDNlXHUwMDNlIDIwLCB3YW50X21pbiA9IGRldiBcdTAwMjYgKCgxVSBcdTAwM2NcdTAwM2MgMjApIC0gMSk7XG4rXHRjaGFyIGJ1Zls0MDk2XSwgKmxpbmUsICpzYXZlcHRyO1xuK1x0aW50IGZkLCBuLCByZXQgPSAtMTtcbitcbitcdGZkID0gb3BlbmF0KGNncm91cF9mZCwgXCJpby5zdGF0XCIsIE9fUkRPTkxZKTtcbitcdGlmIChmZCBcdTAwM2MgMClcbitcdFx0cmV0dXJuIC0xO1xuK1x0biA9IHJlYWQoZmQsIGJ1Ziwgc2l6ZW9mKGJ1ZikgLSAxKTtcbitcdGNsb3NlKGZkKTtcbitcdGlmIChuIFx1MDAzYz0gMClcbitcdFx0cmV0dXJuIC0xO1xuK1x0YnVmW25dID0gJ1xcMCc7XG4rXG4rXHRmb3IgKGxpbmUgPSBzdHJ0b2tfcihidWYsIFwiXFxuXCIsIFx1MDAyNnNhdmVwdHIpOyBsaW5lO1xuK1x0ICAgICBsaW5lID0gc3RydG9rX3IoTlVMTCwgXCJcXG5cIiwgXHUwMDI2c2F2ZXB0cikpIHtcbitcdFx0dW5zaWduZWQgbG9uZyBsb25nIHJiID0gMCwgd2IgPSAwLCByaSA9IDAsIHdpID0gMCwgZGIgPSAwLCBkaSA9IDA7XG4rXHRcdHVuc2lnbmVkIGludCBtYWosIG1pbjtcbitcbitcdFx0LyogT25seSB0aGUgZGV2aWNlIGlkIGlzIHJlcXVpcmVkOyBtaXNzaW5nIGNvdW50ZXJzIHN0YXkgemVyby4gKi9cbitcdFx0aWYgKHNzY2FuZihsaW5lLFxuK1x0XHRcdCAgIFwiJXU6JXUgcmJ5dGVzPSVsbHUgd2J5dGVzPSVsbHUgcmlvcz0lbGx1IHdpb3M9JWxsdSBkYnl0ZXM9JWxsdSBkaW9zPSVsbHVcIixcbitcdFx0XHQgICBcdTAwMjZtYWosIFx1MDAyNm1pbiwgXHUwMDI2cmIsIFx1MDAyNndiLCBcdTAwMjZyaSwgXHUwMDI2d2ksIFx1MDAyNmRiLCBcdTAwMjZkaSkgXHUwMDNjIDIpXG4rXHRcdFx0Y29udGludWU7XG4rXHRcdGlmIChtYWogIT0gd2FudF9tYWogfHwgbWluICE9IHdhbnRfbWluKVxuK1x0XHRcdGNvbnRpbnVlO1xuK1xuK1x0XHRvdXQtXHUwMDNlcmJ5dGVzID0gcmI7XG4rXHRcdG91dC1cdTAwM2V3Ynl0ZXMgPSB3YjtcbitcdFx0b3V0LVx1MDAzZXJpb3MgPSByaTtcbitcdFx0b3V0LVx1MDAzZXdpb3MgPSB3aTtcbitcdFx0b3V0LVx1MDAzZWRieXRlcyA9IGRiO1xuK1x0XHRvdXQtXHUwMDNlZGlvcyA9IGRpO1xuK1x0XHRyZXQgPSAwO1xuK1x0XHRicmVhaztcbitcdH1cbitcdHJldHVybiByZXQ7XG4rfVxuK1xuK3ZvaWQgdGVzdF9jZ3JvdXBfaXRlcl9pbyh2b2lkKVxuK3tcbitcdGNoYXIgKmNncm91cF9yZWxfcGF0aCA9IFwiL2Nncm91cF9pdGVyX2lvX3Rlc3RcIjtcbitcdGludCBjdGxfZmQgPSAtMSwgbG9vcF9mZCA9IC0xLCBiYWNrX2ZkID0gLTE7XG4rXHRzdHJ1Y3QgY2dyb3VwX2l0ZXJfaW8gKnNrZWwgPSBOVUxMO1xuK1x0c3RydWN0IGJwZl9saW5rICpsaW5rID0gTlVMTDtcbitcdGNoYXIgbG9vcF9wYXRoWzY0XTtcbitcdHN0cnVjdCBpb19xdWVyeSAqcTtcbitcdGludCBjZ3JvdXBfZmQ7XG4rXG4rXHRjZ3JvdXBfZmQgPSBjZ3JvdXBfc2V0dXBfYW5kX2pvaW4oY2dyb3VwX3JlbF9wYXRoKTtcbitcdGlmICghQVNTRVJUX09LX0ZEKGNncm91cF9mZCwgXCJjZ3JvdXBfc2V0dXBfYW5kX2pvaW5cIikpXG4rXHRcdHJldHVybjtcbitcbitcdGlmIChsb29wX3NldHVwKGxvb3BfcGF0aCwgc2l6ZW9mKGxvb3BfcGF0aCksIFx1MDAyNmN0bF9mZCwgXHUwMDI2bG9vcF9mZCwgXHUwMDI2YmFja19mZCkpIHtcbitcdFx0dGVzdF9fc2tpcCgpO1x0LyogbmVlZHMgcm9vdCArIENPTkZJR19CTEtfREVWX0xPT1AgKi9cbitcdFx0Z290byBjbGVhbnVwX2Nncm91cF9mZDtcbitcdH1cbitcbitcdHNrZWwgPSBjZ3JvdXBfaXRlcl9pb19fb3Blbl9hbmRfbG9hZCgpO1xuK1x0aWYgKCFBU1NFUlRfT0tfUFRSKHNrZWwsIFwiY2dyb3VwX2l0ZXJfaW9fX29wZW5fYW5kX2xvYWRcIikpXG4rXHRcdGdvdG8gY2xlYW51cF9sb29wO1xuK1xuK1x0LyogQ29udmVydCBnbGliYyBzdF9yZGV2IHRvIGtlcm5lbCBkZXZfdCBmb3JtYXQuICovXG4rXHR7XG4rXHRcdHN0cnVjdCBzdGF0IGxzdDtcbitcbitcdFx0aWYgKCFBU1NFUlRfT0soZnN0YXQobG9vcF9mZCwgXHUwMDI2bHN0KSwgXCJmc3RhdCBsb29wXCIpKVxuK1x0XHRcdGdvdG8gY2xlYW51cF9za2VsO1xuK1x0XHRza2VsLVx1MDAzZWRhdGFfcXVlcnktXHUwMDNldGFyZ2V0X2RldiA9XG4rXHRcdFx0KChfX3U2NCltYWpvcihsc3Quc3RfcmRldikgXHUwMDNjXHUwMDNjIDIwKSB8IG1pbm9yKGxzdC5zdF9yZGV2KTtcbitcdH1cbitcbitcdERFQ0xBUkVfTElCQlBGX09QVFMoYnBmX2l0ZXJfYXR0YWNoX29wdHMsIG9wdHMpO1xuK1x0dW5pb24gYnBmX2l0ZXJfbGlua19pbmZvIGxpbmZvID0ge1xuK1x0XHQuY2dyb3VwLmNncm91cF9mZCA9IGNncm91cF9mZCxcbitcdFx0LmNncm91cC5vcmRlciA9IEJQRl9DR1JPVVBfSVRFUl9TRUxGX09OTFksXG4rXHR9O1xuK1x0b3B0cy5saW5rX2luZm8gPSBcdTAwMjZsaW5mbztcbitcdG9wdHMubGlua19pbmZvX2xlbiA9IHNpemVvZihsaW5mbyk7XG4rXG4rXHRsaW5rID0gYnBmX3Byb2dyYW1fX2F0dGFjaF9pdGVyKHNrZWwtXHUwMDNlcHJvZ3MuY2dyb3VwX2lvX3F1ZXJ5LCBcdTAwMjZvcHRzKTtcbitcdGlmICghQVNTRVJUX09LX1BUUihsaW5rLCBcImJwZl9wcm9ncmFtX19hdHRhY2hfaXRlclwiKSlcbitcdFx0Z290byBjbGVhbnVwX3NrZWw7XG4rXG4rXHQvKiBUaGlzIHByb2Nlc3MgaXMgaW4gdGhlIHRlc3QgY2dyb3VwLCBzbyB0aGUgbG9vcCBJL08gaXMgY2hhcmdlZCBoZXJlLiAqL1xuK1x0aWYgKCFBU1NFUlRfT0soZG9fZGlyZWN0X2lvKGxvb3BfcGF0aCksIFwiZG9fZGlyZWN0X2lvXCIpKVxuK1x0XHRnb3RvIGNsZWFudXBfbGluaztcbitcbitcdGlmICghQVNTRVJUX09LKHJlYWRfc3RhdHMobGluayksIFwicmVhZCBzdGF0c1wiKSlcbitcdFx0Z290byBjbGVhbnVwX2xpbms7XG4rXG4rXHRxID0gXHUwMDI2c2tlbC1cdTAwM2VkYXRhX3F1ZXJ5LVx1MDAzZWlvX3F1ZXJ5O1xuK1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCJjZ3JvdXBfaXRlcl9pb19fd3JpdGVcIikpIHtcbitcdFx0QVNTRVJUX0dUKHEtXHUwMDNld2J5dGVzLCAwLCBcIndieXRlc1wiKTtcbitcdFx0QVNTRVJUX0dUKHEtXHUwMDNld2lvcywgMCwgXCJ3aW9zXCIpO1xuK1x0fVxuK1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCJjZ3JvdXBfaXRlcl9pb19fcmVhZFwiKSkge1xuK1x0XHRBU1NFUlRfR1QocS1cdTAwM2VyYnl0ZXMsIDAsIFwicmJ5dGVzXCIpO1xuK1x0XHRBU1NFUlRfR1QocS1cdTAwM2VyaW9zLCAwLCBcInJpb3NcIik7XG4rXHR9XG4rXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcImNncm91cF9pdGVyX2lvX19kZXZcIikpXG4rXHRcdEFTU0VSVF9HVChxLVx1MDAzZWRldiwgMCwgXCJkZXZcIik7XG4rXG4rXHQvKiBDb21wYXJlIHdpdGggaW8uc3RhdCB3aXRob3V0IEkvTyBiZXR3ZWVuIHRoZSByZWFkcy4gKi9cbitcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwiY2dyb3VwX2l0ZXJfaW9fX21hdGNoXCIpKSB7XG4rXHRcdHN0cnVjdCBpb19xdWVyeSBmaWxldiA9IHt9O1xuK1xuK1x0XHRpZiAoQVNTRVJUX09LKHJlYWRfc3RhdHMobGluayksIFwicmVhZCBzdGF0c1wiKSBcdTAwMjZcdTAwMjZcbitcdFx0ICAgIEFTU0VSVF9PSyhwYXJzZV9pb19zdGF0KGNncm91cF9mZCwgcS1cdTAwM2VkZXYsIFx1MDAyNmZpbGV2KSxcbitcdFx0XHQgICAgICBcInBhcnNlIGlvLnN0YXRcIikpIHtcbitcdFx0XHRBU1NFUlRfRVEocS1cdTAwM2VyYnl0ZXMsIGZpbGV2LnJieXRlcywgXCJyYnl0ZXNcIik7XG4rXHRcdFx0QVNTRVJUX0VRKHEtXHUwMDNld2J5dGVzLCBmaWxldi53Ynl0ZXMsIFwid2J5dGVzXCIpO1xuK1x0XHRcdEFTU0VSVF9FUShxLVx1MDAzZXJpb3MsIGZpbGV2LnJpb3MsIFwicmlvc1wiKTtcbitcdFx0XHRBU1NFUlRfRVEocS1cdTAwM2V3aW9zLCBmaWxldi53aW9zLCBcIndpb3NcIik7XG4rXHRcdFx0QVNTRVJUX0VRKHEtXHUwMDNlZGJ5dGVzLCBmaWxldi5kYnl0ZXMsIFwiZGJ5dGVzXCIpO1xuK1x0XHRcdEFTU0VSVF9FUShxLVx1MDAzZWRpb3MsIGZpbGV2LmRpb3MsIFwiZGlvc1wiKTtcbitcdFx0fVxuK1x0fVxuK1xuK1x0LyogUm9vdCBzdGF0aXN0aWNzIGluY2x1ZGUgdGhpcyBjZ3JvdXAncyBJL08uICovXG4rXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcImNncm91cF9pdGVyX2lvX19yb290XCIpKSB7XG4rXHRcdHN0cnVjdCBicGZfbGluayAqcm9vdF9saW5rO1xuK1x0XHRzdHJ1Y3QgaW9fcXVlcnkgKnI7XG4rXG4rXHRcdHNrZWwtXHUwMDNlZGF0YV9xdWVyeS1cdTAwM2Vnb3Rfcm9vdF9jc3MgPSAwO1xuK1x0XHRyb290X2xpbmsgPSBicGZfcHJvZ3JhbV9fYXR0YWNoX2l0ZXIoc2tlbC1cdTAwM2Vwcm9ncy5jZ3JvdXBfcm9vdF9pb19xdWVyeSxcbitcdFx0XHRcdFx0XHQgICAgIFx1MDAyNm9wdHMpO1xuK1x0XHRpZiAoQVNTRVJUX09LX1BUUihyb290X2xpbmssIFwiYXR0YWNoIHJvb3QgaXRlclwiKSkge1xuK1x0XHRcdGlmIChBU1NFUlRfT0socmVhZF9zdGF0cyhyb290X2xpbmspLCBcInJlYWQgcm9vdCBzdGF0c1wiKSkge1xuK1x0XHRcdFx0ciA9IFx1MDAyNnNrZWwtXHUwMDNlZGF0YV9xdWVyeS1cdTAwM2Vyb290X3F1ZXJ5O1xuK1x0XHRcdFx0QVNTRVJUX0VRKHNrZWwtXHUwMDNlZGF0YV9xdWVyeS1cdTAwM2Vnb3Rfcm9vdF9jc3MsIDEsXG4rXHRcdFx0XHRcdCAgXCJnb3Rfcm9vdF9jc3NcIik7XG4rXHRcdFx0XHRBU1NFUlRfRVEoci1cdTAwM2VkZXYsIHEtXHUwMDNlZGV2LCBcInJvb3QgZGV2XCIpO1xuK1x0XHRcdFx0QVNTRVJUX0dFKHItXHUwMDNld2J5dGVzLCBxLVx1MDAzZXdieXRlcywgXCJyb290IHdieXRlc1wiKTtcbitcdFx0XHRcdEFTU0VSVF9HRShyLVx1MDAzZXdpb3MsIHEtXHUwMDNld2lvcywgXCJyb290IHdpb3NcIik7XG4rXHRcdFx0XHRBU1NFUlRfR0Uoci1cdTAwM2VyYnl0ZXMsIHEtXHUwMDNlcmJ5dGVzLCBcInJvb3QgcmJ5dGVzXCIpO1xuK1x0XHRcdFx0QVNTRVJUX0dFKHItXHUwMDNlcmlvcywgcS1cdTAwM2VyaW9zLCBcInJvb3Qgcmlvc1wiKTtcbitcdFx0XHR9XG4rXHRcdFx0YnBmX2xpbmtfX2Rlc3Ryb3kocm9vdF9saW5rKTtcbitcdFx0fVxuK1x0fVxuK1xuK2NsZWFudXBfbGluazpcbitcdGJwZl9saW5rX19kZXN0cm95KGxpbmspO1xuK2NsZWFudXBfc2tlbDpcbitcdGNncm91cF9pdGVyX2lvX19kZXN0cm95KHNrZWwpO1xuK2NsZWFudXBfbG9vcDpcbitcdGxvb3BfdGVhcmRvd24obG9vcF9wYXRoLCBjdGxfZmQsIGxvb3BfZmQsIGJhY2tfZmQpO1xuK2NsZWFudXBfY2dyb3VwX2ZkOlxuK1x0Y2xvc2UoY2dyb3VwX2ZkKTtcbitcdGNsZWFudXBfY2dyb3VwX2Vudmlyb25tZW50KCk7XG4rfVxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9jZ3JvdXBfaXRlcl9pby5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL2Nncm91cF9pdGVyX2lvLmNcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwLi4yY2Q1MzgwNjg5ODdhXG4tLS0gL2Rldi9udWxsXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvY2dyb3VwX2l0ZXJfaW8uY1xuQEAgLTAsMCArMSw5OSBAQFxuKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXG4rLyogQ29weXJpZ2h0IChjKSAyMDI1IE1ldGEgUGxhdGZvcm1zLCBJbmMuIGFuZCBhZmZpbGlhdGVzLiAqL1xuKyNpbmNsdWRlIFx1MDAzY3ZtbGludXguaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2JwZi9icGZfaGVscGVycy5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjYnBmL2JwZl9jb3JlX3JlYWQuaFx1MDAzZVxuKyNpbmNsdWRlIFwiYnBmX2V4cGVyaW1lbnRhbC5oXCJcbisjaW5jbHVkZSBcImNncm91cF9pdGVyX2lvLmhcIlxuK1xuK2NoYXIgX2xpY2Vuc2VbXSBTRUMoXCJsaWNlbnNlXCIpID0gXCJHUExcIjtcbitcbitzdHJ1Y3QgaW9fcXVlcnkgaW9fcXVlcnkgU0VDKFwiLmRhdGEucXVlcnlcIik7XG4rXG4rc3RydWN0IGlvX3F1ZXJ5IHJvb3RfcXVlcnkgU0VDKFwiLmRhdGEucXVlcnlcIik7XG4rXG4rX191NjQgZ290X3Jvb3RfY3NzIFNFQyhcIi5kYXRhLnF1ZXJ5XCIpO1xuK1xuKy8qIERldmljZSBzZWxlY3RlZCBieSB1c2Vyc3BhY2UgaW4ga2VybmVsIGRldl90IGZvcm1hdC4gKi9cbitfX3U2NCB0YXJnZXRfZGV2IFNFQyhcIi5kYXRhLnF1ZXJ5XCIpO1xuK1xuKy8qIEtlZXAgaW5saW5lOiBSQ1UgYW5kIG9wZW4tY29kZWQgaXRlcmF0b3JzIGNhbm5vdCBjcm9zcyBhIEJQRiBjYWxsLiAqL1xuK3N0YXRpYyBfX2Fsd2F5c19pbmxpbmUgaW50IHJlYWRfdGFyZ2V0X2RldihzdHJ1Y3QgY2dyb3VwICpjZ3JwLFxuK1x0XHRcdFx0XHQgICBzdHJ1Y3QgaW9fcXVlcnkgKm91dClcbit7XG4rXHRzdHJ1Y3QgY2dyb3VwX3N1YnN5c19zdGF0ZSAqY3NzO1xuK1x0c3RydWN0IGJsa2NnX2dxICpwb3M7XG4rXHRfX3U2NCBkZXY7XG4rXHRpbnQgc3NpZDtcbitcbitcdC8qIFRoZSBmbHVzaCBjYW4gc2xlZXAsIHNvIHJ1biBpdCBiZWZvcmUgdGhlIFJDVSBzZWN0aW9uLiAqL1xuK1x0YnBmX2Jsa2NnX2ZsdXNoX3N0YXRzKGNncnApO1xuK1xuK1x0YnBmX3JjdV9yZWFkX2xvY2soKTtcbitcdHNzaWQgPSBicGZfY29yZV9lbnVtX3ZhbHVlKGVudW0gY2dyb3VwX3N1YnN5c19pZCwgaW9fY2dycF9pZCk7XG4rXG4rXHQvKlxuK1x0ICogc3Vic3lzW10gaXMgX19yY3UsIHNvIHRoaXMgcmVhZCBnaXZlcyBhbiBSQ1UgcG9pbnRlciB0aGUgaXRlcmF0b3JcbitcdCAqIGFjY2VwdHMuIEJQRl9DT1JFX1JFQUQoKSB3b3VsZCByZXR1cm4gYSBwbGFpbiB2YWx1ZSBpbnN0ZWFkLlxuK1x0ICovXG4rXHRjc3MgPSBjZ3JwLVx1MDAzZXN1YnN5c1tzc2lkXTtcbitcdGlmICghY3NzKSB7XG4rXHRcdGJwZl9yY3VfcmVhZF91bmxvY2soKTtcbitcdFx0cmV0dXJuIDA7XG4rXHR9XG4rXG4rXHRicGZfZm9yX2VhY2goYmxrZywgcG9zLCBjc3MpIHtcbitcdFx0ZGV2ID0gQlBGX0NPUkVfUkVBRChwb3MsIHEsIGRpc2ssIHBhcnQwLCBiZF9kZXYpO1xuK1x0XHRpZiAoZGV2ICE9IHRhcmdldF9kZXYpXG4rXHRcdFx0Y29udGludWU7XG4rXG4rXHRcdG91dC1cdTAwM2VkZXYgPSBkZXY7XG4rXHRcdG91dC1cdTAwM2VyYnl0ZXMgPSBCUEZfQ09SRV9SRUFEKHBvcywgaW9zdGF0LmN1ci5ieXRlc1tCTEtHX0lPU1RBVF9SRUFEXSk7XG4rXHRcdG91dC1cdTAwM2V3Ynl0ZXMgPSBCUEZfQ09SRV9SRUFEKHBvcywgaW9zdGF0LmN1ci5ieXRlc1tCTEtHX0lPU1RBVF9XUklURV0pO1xuK1x0XHRvdXQtXHUwMDNlcmlvcyA9IEJQRl9DT1JFX1JFQUQocG9zLCBpb3N0YXQuY3VyLmlvc1tCTEtHX0lPU1RBVF9SRUFEXSk7XG4rXHRcdG91dC1cdTAwM2V3aW9zID0gQlBGX0NPUkVfUkVBRChwb3MsIGlvc3RhdC5jdXIuaW9zW0JMS0dfSU9TVEFUX1dSSVRFXSk7XG4rXHRcdG91dC1cdTAwM2VkYnl0ZXMgPSBCUEZfQ09SRV9SRUFEKHBvcywgaW9zdGF0LmN1ci5ieXRlc1tCTEtHX0lPU1RBVF9ESVNDQVJEXSk7XG4rXHRcdG91dC1cdTAwM2VkaW9zID0gQlBGX0NPUkVfUkVBRChwb3MsIGlvc3RhdC5jdXIuaW9zW0JMS0dfSU9TVEFUX0RJU0NBUkRdKTtcbitcdFx0YnJlYWs7XG4rXHR9XG4rXHRicGZfcmN1X3JlYWRfdW5sb2NrKCk7XG4rXHRyZXR1cm4gMTtcbit9XG4rXG4rU0VDKFwiaXRlci5zL2Nncm91cFwiKVxuK2ludCBjZ3JvdXBfaW9fcXVlcnkoc3RydWN0IGJwZl9pdGVyX19jZ3JvdXAgKmN0eClcbit7XG4rXHRzdHJ1Y3QgY2dyb3VwICpjZ3JwID0gY3R4LVx1MDAzZWNncm91cDtcbitcbitcdGlmICghY2dycClcbitcdFx0cmV0dXJuIDE7XG4rXG4rXHQvKiBTdGFydCBmcmVzaCBzbyBhIGRldmljZSB0aGF0IGlzIG5vdCBmb3VuZCBzdGF5cyBhbGwtemVyby4gKi9cbitcdF9fYnVpbHRpbl9tZW1zZXQoXHUwMDI2aW9fcXVlcnksIDAsIHNpemVvZihpb19xdWVyeSkpO1xuK1xuK1x0cmVhZF90YXJnZXRfZGV2KGNncnAsIFx1MDAyNmlvX3F1ZXJ5KTtcbitcdHJldHVybiAwO1xuK31cbitcbitTRUMoXCJpdGVyLnMvY2dyb3VwXCIpXG4raW50IGNncm91cF9yb290X2lvX3F1ZXJ5KHN0cnVjdCBicGZfaXRlcl9fY2dyb3VwICpjdHgpXG4re1xuK1x0c3RydWN0IGNncm91cCAqcm9vdDtcbitcbitcdGlmICghY3R4LVx1MDAzZWNncm91cClcbitcdFx0cmV0dXJuIDE7XG4rXG4rXHRfX2J1aWx0aW5fbWVtc2V0KFx1MDAyNnJvb3RfcXVlcnksIDAsIHNpemVvZihyb290X3F1ZXJ5KSk7XG4rXG4rXHQvKiBUaGUgcm9vdCBjZ3JvdXAgYWx3YXlzIGhhcyBpZCAxLiAqL1xuK1x0cm9vdCA9IGJwZl9jZ3JvdXBfZnJvbV9pZCgxKTtcbitcdGlmICghcm9vdClcbitcdFx0cmV0dXJuIDA7XG4rXG4rXHQvKiBSb290IGNvdW50ZXJzIGluY2x1ZGUgYWxsIGNncm91cHMnIEkvTy4gKi9cbitcdGlmIChyZWFkX3RhcmdldF9kZXYocm9vdCwgXHUwMDI2cm9vdF9xdWVyeSkpXG4rXHRcdGdvdF9yb290X2NzcyA9IDE7XG4rXG4rXHRicGZfY2dyb3VwX3JlbGVhc2Uocm9vdCk7XG4rXHRyZXR1cm4gMDtcbit9XG4iLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xN1QyMjozNToyNS4xMzIwNzM0MDFaIiwiU2VxIjoyMywiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MTUyNzkyNDA4NzIsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIHRoZSBCbG9jayBDZ3JvdXAgQlBGIEtmdW5jIFBhdGNoIGZvciBNZW1vcnkgU2FmZXR5KipcblxuT2theSwgc28gSSdtIGxvb2tpbmcgYXQgdGhpcyBwYXRjaCBzZXJpZXMgdGhhdCBpbnRyb2R1Y2VzIEJQRiBrZnVuY3MgdG8gaXRlcmF0ZSBibG9jayBjZ3JvdXBzIChibGtjZykgYW5kIGZsdXNoIHRoZWlyIHN0YXRpc3RpY3MuIFRoZSBjb2RlIGludHJvZHVjZXMgZnVuY3Rpb25zIGxpa2UgYGJwZl9ibGtjZ19mbHVzaF9zdGF0c2AsIGBicGZfaXRlcl9ibGtnX25ld2AsIGBicGZfaXRlcl9ibGtnX25leHRgLCBhbmQgYGJwZl9pdGVyX2Jsa2dfZGVzdHJveWAuIE15IHByaW1hcnkgY29uY2VybiwgYXMgYWx3YXlzLCBpcyBtZW1vcnkgc2FmZXR5LCBzcGVjaWZpY2FsbHkgd2hldGhlciB0aGlzIHBhdGNoIGNvdWxkIGludHJvZHVjZSBhbnkgdW5pbml0aWFsaXplZCBtZW1vcnkgcmVhZHMgdGhhdCBLTVNBTiAoS2VybmVsIE1lbW9yeSBTYW5pdGl6ZXIpIG1pZ2h0IGZsYWcsIGJ1dCBLQVNBTiAoS2VybmVsIEFkZHJlc3MgU0FOaXRpemVyKSB3b3VsZG4ndC5cblxuTGV0J3MgZGl2ZSBpbnRvIHRoZSBgYnBmX2l0ZXJfYmxrZ19uZXdgIGltcGxlbWVudGF0aW9uLiBUaGUgaXRlcmF0b3Igc3RhdGUgYGl0YCBjb21lcyBmcm9tIHRoZSBCUEYgaW5mcmFzdHJ1Y3R1cmUsIGFsbG9jYXRlZCBvbiB0aGUgQlBGIHN0YWNrLCBhbmQgaXMgaW5pdGlhbGl6ZWQgZWl0aGVyIGJ5IHRoZSB2ZXJpZmllci9CUEYgcnVudGltZSBvciB0aGlzIGBfbmV3YCBmdW5jdGlvbi4gSSBzZWUgYGtpdC1cdTAwM2Vwb3NgIGFuZCBga2l0LVx1MDAzZWJsa2NnYCBhcmUgYmVpbmcgaW5pdGlhbGl6ZWQgd2l0aGluIHRoaXMgZnVuY3Rpb24uIFRoZSBzdHJ1Y3QgYGJwZl9pdGVyX2Jsa2dgIGFuZCBgYnBmX2l0ZXJfYmxrZ19rZXJuYCBhcmUgcHJvcGVybHkgc2l6ZWQsIGFuZCBgY3NzYCBpcyBjaGVja2VkLiBJZiBpdCBpc24ndCBhbiBpbyBjZ3JvdXAsIHRoZSBibGtjZyBpcyBOVUxMLiBPdGhlcndpc2UsIGBibGtjZ2AgaXMgc2V0LiBTbywgYm90aCBwb2ludGVycyBhcmUgYWx3YXlzIGluaXRpYWxpemVkIGVpdGhlciB0byBhIHZhbGlkIHZhbHVlIG9yIE5VTEwuXG5cblRoZSBgYnBmX2Jsa2NnX2ZsdXNoX3N0YXRzYCBmdW5jdGlvbiBzZWVtcyB0byBiZSBjYWxsaW5nIGBibGtjZ19maWxsX3Jvb3RfaW9zdGF0cygpYCBvciBgY3NzX3JzdGF0X2ZsdXNoKGNzcylgLiBOZWl0aGVyIG9mIHRoZXNlIGZ1bmN0aW9ucyBhcmUgZGlyZWN0bHkgc2VuZGluZyBuZXcgZGF0YSBzdHJ1Y3R1cmVzIHRvIHVzZXIgc3BhY2UgaW4gYSBtYW5uZXIgdGhhdCBjb3VsZCBsZWFrIHVuaW5pdGlhbGl6ZWQgbWVtb3J5LiBUaGUgdGVzdHMgYXJlIHJlYWRpbmcgcmVzdWx0cyB0aHJvdWdoIEJQRiBtYXBzIGFuZCBkYXRhIHNlY3Rpb25zIHdoaWNoIGlzIHRoZSBzdGFuZGFyZCBCUEYgd2F5LiBUaGlzIGlzIGdvb2Q7IG5vdGhpbmcgaXMgYmVpbmcgZXhwb3NlZCBkaXJlY3RseS5cblxuSSdtIGRvdWJsZS1jaGVja2luZyB0aGUgaW5pdGlhbGl6YXRpb24gaW4gYGJwZl9pdGVyX2Jsa2dfbmV3YC4gSWYgYGNzcy1cdTAwM2VzcyAhPSBcdTAwMjZpb19jZ3JwX3N1YnN5c2AsIGBraXQtXHUwMDNlYmxrY2dgIGlzIHNldCB0byBOVUxMLCBhbmQgYGtpdC1cdTAwM2Vwb3NgIGlzIGFscmVhZHkgTlVMTC4gT3RoZXJ3aXNlLCBpZiBpdCAqaXMqIGFuIGlvIGNncm91cCwgYGtpdC1cdTAwM2VibGtjZ2AgaXMgc2V0LiBTbywgYm90aCBmaWVsZHMgYXJlIGluaXRpYWxpemVkIGluIGFsbCBzY2VuYXJpb3MuXG5cbkkgYWxzbyBzZWUgdGhhdCBgYmxrY2dfZmlsbF9yb290X2lvc3RhdHNgIGlzIG5vdyBub24tc3RhdGljLCBhbmQgYGJwZl9ibGtjZ19mbHVzaF9zdGF0c2AgdXNlcyBgcmN1X3JlYWRfbG9ja2AgYW5kIGBjZ3JvdXBfY3NzYCwgd2hpY2ggaXMgbm9ybWFsIGZvciB0aGlzIGtpbmQgb2YgY29kZS5cblxuT2theSwgbGV0J3MgbG9vayBhdCBgYnBmX2l0ZXJfYmxrZ19uZXh0YC4gSXQncyBzdHJhaWdodGZvcndhcmQuIEl0IGRlcmVmZXJlbmNlcyBga2l0LVx1MDAzZXBvc2AgYW5kIG1vdmVzIGl0IGFsb25nIHRoZSBsaXN0LCBoYW5kbGluZyBvZmZsaW5lIGJsa2dzIGdyYWNlZnVsbHkuIFRoZSBpdGVyYXRvciBpcyBkZXNpZ25lZCB0byByZXR1cm4gTlVMTCBhZnRlciBjb21wbGV0aW9uLiBJdCBhcHBlYXJzIHRoYXQgdGhlcmUgYXJlIG5vIHVuaW5pdGlhbGl6ZWQgdmFyaWFibGVzIGF0IGFsbCBhbmQgbm8gbWVtb3J5IGxlYWtzLlxuXG5UaGVyZWZvcmUsIGdpdmVuIHRoZSBuYXR1cmUgb2YgdGhlIHBhdGNoLCBhbmQgZXNwZWNpYWxseSB0aGUgY29tcGxldGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIEJQRiBpdGVyYXRvciBzdGF0ZSwgSSdtIGNvbmNsdWRpbmcgdGhhdCB0aGlzIHBhdGNoIGRvZXNuJ3QgaW50cm9kdWNlIGFueSB1bmluaXRpYWxpemVkIG1lbW9yeSByaXNrcyB0aGF0IEtNU0FOIHdvdWxkIGNhdGNoIGJ1dCBLQVNBTiB3b3VsZG4ndC4gVGhlIEJQRiBwcm9ncmFtIHJlYWRzIHRoZSBkYXRhIHVzaW5nIGBCUEZfQ09SRV9SRUFEYCwgYW5kIHRoZXJlIGFyZSBubyBuZXcgc3RydWN0dXJlcyBjb3BpZWQgdG8gdXNlcnNwYWNlIHVzaW5nIGBjb3B5X3RvX3VzZXJgLiBJJ20gY29uZmlkZW50IHRoYXQgc3RhbmRhcmQgS0FTQU4gYW5kIHRoZSBCUEYgdmVyaWZpZXIgYXJlIGVub3VnaCB0byBjYXRjaCBhbnkgYnVncyBpbiB0aGlzIHBhdGNoLiBUaGVyZWZvcmUsIEknbSBzZXR0aW5nIGBOZWVkc0tNU0FOPWZhbHNlYC5cblxuXG4iLCJJbnB1dFRva2VucyI6OTY3MiwiT3V0cHV0VG9rZW5zIjoyNDQsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxMzY5LCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTdUMjI6MzU6NDAuNDExMzE3NjAzWiIsIlNlcSI6MjQsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InNldC1yZXN1bHRzIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTQzNzAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBzZXJpZXMgaW50cm9kdWNlcyBCUEYga2Z1bmNzIGZvciBibG9jayBjZ3JvdXAgKGJsa2NnKSBpdGVyYXRpb24gYW5kIHN0YXRpc3RpY3MgZmx1c2hpbmcgKGBicGZfYmxrY2dfZmx1c2hfc3RhdHNgLCBgYnBmX2l0ZXJfYmxrZ19uZXdgLCBgYnBmX2l0ZXJfYmxrZ19uZXh0YCwgYGJwZl9pdGVyX2Jsa2dfZGVzdHJveWApLiBUaGUgaXRlcmF0b3Igc3RhdGUgKGBzdHJ1Y3QgYnBmX2l0ZXJfYmxrZ19rZXJuYCkgaXMgZnVsbHkgaW5pdGlhbGl6ZWQgaW4gYGJwZl9pdGVyX2Jsa2dfbmV3YCBiZWZvcmUgYmVpbmcgdXNlZCBpbiBzdWJzZXF1ZW50IGNhbGxzLiBUaGVyZSBhcmUgbm8gbmV3IGtlcm5lbCBzdHJ1Y3R1cmVzIGNvcGllZCB0byB1c2VyIHNwYWNlIChlLmcuLCB2aWEgYGNvcHlfdG9fdXNlcmAgb3IgbmV0bGluayksIG5vciBhcmUgdGhlcmUgYW55IGNvbXBsZXggYWxsb2NhdGlvbnMgd2hlcmUgdW5pbml0aWFsaXplZCBmaWVsZHMgY291bGQgYmUgbGVha2VkIG9yIHVzZWQgaW4gY29udHJvbCBmbG93LiBUaGUgY2hhbmdlcyBwcmltYXJpbHkgaW52b2x2ZSBwb2ludGVyIHRyYXZlcnNhbCBhbmQgQlBGLWFjY2Vzc2libGUgcmVhZHMgb2YgZXhpc3RpbmcgaW5pdGlhbGl6ZWQgY2dyb3VwIHN0cnVjdHVyZXMuIEFueSBwb3RlbnRpYWwgbWVtb3J5IHNhZmV0eSBpc3N1ZXMsIHN1Y2ggYXMgb3V0LW9mLWJvdW5kcyBhY2Nlc3NlcyBvciB1c2UtYWZ0ZXItZnJlZSBidWdzIGR1cmluZyBpdGVyYXRpb24sIHdvdWxkIGJlIGVmZmVjdGl2ZWx5IGNhdWdodCBieSBLQVNBTiBhbmQgdGhlIEJQRiB2ZXJpZmllci4gVGhlcmVmb3JlLCBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaXMgbm90IHJlcXVpcmVkLlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2Vcbn0iLCJSZXN1bHRzIjoie1xuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIHNlcmllcyBpbnRyb2R1Y2VzIEJQRiBrZnVuY3MgZm9yIGJsb2NrIGNncm91cCAoYmxrY2cpIGl0ZXJhdGlvbiBhbmQgc3RhdGlzdGljcyBmbHVzaGluZyAoYGJwZl9ibGtjZ19mbHVzaF9zdGF0c2AsIGBicGZfaXRlcl9ibGtnX25ld2AsIGBicGZfaXRlcl9ibGtnX25leHRgLCBgYnBmX2l0ZXJfYmxrZ19kZXN0cm95YCkuIFRoZSBpdGVyYXRvciBzdGF0ZSAoYHN0cnVjdCBicGZfaXRlcl9ibGtnX2tlcm5gKSBpcyBmdWxseSBpbml0aWFsaXplZCBpbiBgYnBmX2l0ZXJfYmxrZ19uZXdgIGJlZm9yZSBiZWluZyB1c2VkIGluIHN1YnNlcXVlbnQgY2FsbHMuIFRoZXJlIGFyZSBubyBuZXcga2VybmVsIHN0cnVjdHVyZXMgY29waWVkIHRvIHVzZXIgc3BhY2UgKGUuZy4sIHZpYSBgY29weV90b191c2VyYCBvciBuZXRsaW5rKSwgbm9yIGFyZSB0aGVyZSBhbnkgY29tcGxleCBhbGxvY2F0aW9ucyB3aGVyZSB1bmluaXRpYWxpemVkIGZpZWxkcyBjb3VsZCBiZSBsZWFrZWQgb3IgdXNlZCBpbiBjb250cm9sIGZsb3cuIFRoZSBjaGFuZ2VzIHByaW1hcmlseSBpbnZvbHZlIHBvaW50ZXIgdHJhdmVyc2FsIGFuZCBCUEYtYWNjZXNzaWJsZSByZWFkcyBvZiBleGlzdGluZyBpbml0aWFsaXplZCBjZ3JvdXAgc3RydWN0dXJlcy4gQW55IHBvdGVudGlhbCBtZW1vcnkgc2FmZXR5IGlzc3Vlcywgc3VjaCBhcyBvdXQtb2YtYm91bmRzIGFjY2Vzc2VzIG9yIHVzZS1hZnRlci1mcmVlIGJ1Z3MgZHVyaW5nIGl0ZXJhdGlvbiwgd291bGQgYmUgZWZmZWN0aXZlbHkgY2F1Z2h0IGJ5IEtBU0FOIGFuZCB0aGUgQlBGIHZlcmlmaWVyLiBUaGVyZWZvcmUsIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpcyBub3QgcmVxdWlyZWQuXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiBmYWxzZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9XTsKCQkJaWYgKCFyYXdEYXRhIHx8IHJhd0RhdGEubGVuZ3RoID09PSAwKSByZXR1cm47CgoJCQlkcmF3U3VtbWFyeVRhYmxlcyhyYXdEYXRhKTsKCQkJZHJhd0R1cmF0aW9uQ2hhcnQocmF3RGF0YSk7CgkJCWRyYXdUb2tlbkNvbnN1bXB0aW9uQ2hhcnQocmF3RGF0YSk7CgkJfQoKCQlmdW5jdGlvbiBkcmF3U3VtbWFyeVRhYmxlcyhyYXdEYXRhKSB7CgkJCWNvbnN0IHN0YXRzID0gewoJCQkJbGxtOiB7IGNvdW50OiAwLCB0b2tlbnM6IDAsIGR1cmF0aW9uOiAwIH0sCgkJCQl0b29sOiB7IGNvdW50OiAwLCBkdXJhdGlvbjogMCB9CgkJCX07CgoJCQlyYXdEYXRhLmZvckVhY2gocyA9PiB7CgkJCQljb25zdCBkdXIgPSBzLkR1cmF0aW9uIC8gMTAwMDAwMDAwMDsgCgkJCQlpZiAocy5UeXBlID09PSAibGxtIikgewoJCQkJCXN0YXRzLmxsbS5jb3VudCsrOwoJCQkJCXN0YXRzLmxsbS50b2tlbnMgKz0gKHMuSW5wdXRUb2tlbnMgKyBzLk91dHB1dFRva2VucyArIHMuT3V0cHV0VGhvdWdodHNUb2tlbnMpOwoJCQkJCXN0YXRzLmxsbS5kdXJhdGlvbiArPSBkdXI7CgkJCQl9IGVsc2UgaWYgKHMuVHlwZSA9PT0gInRvb2wiKSB7CgkJCQkJc3RhdHMudG9vbC5jb3VudCsrOwoJCQkJCXN0YXRzLnRvb2wuZHVyYXRpb24gKz0gZHVyOwoJCQkJfQoJCQl9KTsKCgkJCWNvbnN0IGF2Z0xsbUR1ciA9IHN0YXRzLmxsbS5jb3VudCA+IDAgPyAoc3RhdHMubGxtLmR1cmF0aW9uIC8gc3RhdHMubGxtLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCQkJY29uc3QgYXZnTGxtVG9rZW4gPSBzdGF0cy5sbG0uY291bnQgPiAwID8gKHN0YXRzLmxsbS50b2tlbnMgLyBzdGF0cy5sbG0uY291bnQpLnRvRml4ZWQoMikgOiAwOwoJCQljb25zdCBhdmdUb29sRHVyID0gc3RhdHMudG9vbC5jb3VudCA+IDAgPyAoc3RhdHMudG9vbC5kdXJhdGlvbiAvIHN0YXRzLnRvb2wuY291bnQpLnRvRml4ZWQoMikgOiAwOwoKCQkJY29uc3QgbGxtU3VtYXJ5Q2VsbHMgPSBbc3RhdHMubGxtLmNvdW50LCBzdGF0cy5sbG0udG9rZW5zLCBhdmdMbG1Ub2tlbiwgc3RhdHMubGxtLmR1cmF0aW9uLCBhdmdMbG1EdXJdOwoJCQljb25zdCB0b29sU3VtbWFyeUNlbGxzID0gW3N0YXRzLnRvb2wuY291bnQsIHN0YXRzLnRvb2wuZHVyYXRpb24sIGF2Z1Rvb2xEdXJdOwoKCQkJY29uc3QgbGxtU3VtbWFyeUJvZHkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGxtX3N1bW1hcnlfc3RhdHNfYm9keScpOwoJCQlsbG1TdW1tYXJ5Qm9keS5pbm5lckhUTUwgPSAiIjsKCQkJY29uc3QgbGxtVHIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0cicpOwoJCQlsbG1TdW1hcnlDZWxscy5mb3JFYWNoKGNlbGwgPT4gewoJCQkJY29uc3QgdGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZCcpOwoJCQkJdGQudGV4dENvbnRlbnQgPSBjZWxsOwoJCQkJbGxtVHIuYXBwZW5kQ2hpbGQodGQpOwoJCQl9KTsKCQkJbGxtU3VtbWFyeUJvZHkuYXBwZW5kQ2hpbGQobGxtVHIpOwoKCQkJY29uc3QgdG9vbFN1bW1hcnlCb2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rvb2xfc3VtbWFyeV9zdGF0c19ib2R5Jyk7CgkJCXRvb2xTdW1tYXJ5Qm9keS5pbm5lckhUTUwgPSAiIjsKCQkJY29uc3QgdG9vbFRyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndHInKTsKCQkJdG9vbFN1bW1hcnlDZWxscy5mb3JFYWNoKGNlbGwgPT4gewoJCQkJY29uc3QgdGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZCcpOwoJCQkJdGQudGV4dENvbnRlbnQgPSBjZWxsOwoJCQkJdG9vbFRyLmFwcGVuZENoaWxkKHRkKTsKCQkJfSk7CgkJCXRvb2xTdW1tYXJ5Qm9keS5hcHBlbmRDaGlsZCh0b29sVHIpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd0R1cmF0aW9uQ2hhcnQocmF3RGF0YSkgewoJCQljb25zdCBmaWx0ZXJlZFN0ZXBzID0gcmF3RGF0YS5maWx0ZXIoZCA9PiBbImxsbSIsICJ0b29sIl0uaW5jbHVkZXMoZC5UeXBlKSk7CgkJCWNvbnN0IGRhdGEgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uRGF0YVRhYmxlKCk7CgkJCWRhdGEuYWRkQ29sdW1uKCdzdHJpbmcnLCAnU3RlcCcpOwoJCQlkYXRhLmFkZENvbHVtbignbnVtYmVyJywgJ0R1cmF0aW9uJyk7CgkJCWRhdGEuYWRkQ29sdW1uKHt0eXBlOiAnc3RyaW5nJywgcm9sZTogJ3Rvb2x0aXAnfSk7IAoKCQkJZmlsdGVyZWRTdGVwcy5mb3JFYWNoKHMgPT4gewoJCQkJCgkJCQljb25zdCBkdXIgPSBzLkR1cmF0aW9uIC8gMTAwMDAwMDAwMDsKCQkJCWxldCB0b29sdGlwID0gcy5OYW1lOwoJCQkJaWYgKHMuVHlwZSA9PT0gImxsbSIgJiYgcy5Ub29sQ2FsbHMgJiYgcy5Ub29sQ2FsbHMubGVuZ3RoID4gMCkgewoJCQkJCXRvb2x0aXAgKz0gYFxuVG9vbHM6ICR7cy5Ub29sQ2FsbHMuam9pbignLCAnKX1gOwoJCQkJfQoJCQkJZGF0YS5hZGRSb3coW2Ake3MuU2VxfWAsIGR1ciwgdG9vbHRpcF0pOwoJCQl9KTsKCgkJCWNvbnN0IG9wdGlvbnMgPSB7CgkJCQl0aXRsZTogJ1RpbWUgQ29uc3VtcHRpb24gb2YgTExNL1Rvb2wgQ2FsbHMnLAoJCQkJaEF4aXM6IHsKCQkJCQl0aXRsZTogJ0xMTS9Ub29sIFN0ZXBzJywKCQkJCX0sCgkJCQl2QXhpczogeyB0aXRsZTogJ1NlY29uZHMnIH0sCgkJCQlsZWdlbmQ6IHsgcG9zaXRpb246ICdub25lJyB9LAoJCQkJYmFyOiB7IGdyb3VwV2lkdGg6ICc3NSUnIH0sCgkJCQljaGFydEFyZWE6IHsgd2lkdGg6ICc4NSUnLCBoZWlnaHQ6ICc3MCUnIH0sCgkJCQloZWlnaHQ6IDQwMAoJCQl9OwoKCQkJY29uc3QgY2hhcnQgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uQ29sdW1uQ2hhcnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2R1cmF0aW9uX2NoYXJ0X2RpdicpKTsKCQkJY2hhcnQuZHJhdyhkYXRhLCBvcHRpb25zKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdUb2tlbkNvbnN1bXB0aW9uQ2hhcnQocmF3RGF0YSkgewoJCQljb25zdCBsbG1TdGVwcyA9IHJhd0RhdGEuZmlsdGVyKGQgPT4gZC5UeXBlID09PSAibGxtIik7CgkJCWlmIChsbG1TdGVwcy5sZW5ndGggPT09IDApIHJldHVybjsKCgkJCWNvbnN0IGRhdGEgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uRGF0YVRhYmxlKCk7CgkJCWRhdGEuYWRkQ29sdW1uKCdzdHJpbmcnLCAnU3RlcCcpOwkJCQoJCQlkYXRhLmFkZENvbHVtbignbnVtYmVyJywgJ1Rva2VucycpOwkJCQoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICdzdHlsZSd9KTsJCgkJCWRhdGEuYWRkQ29sdW1uKHt0eXBlOiAnc3RyaW5nJywgcm9sZTogJ3Rvb2x0aXAnfSk7CQoKCQkJY29uc3QgYWdlbnRDb2xvcnMgPSB7fTsKCQkJY29uc3QgcGFsZXR0ZSA9IFsnIzQyODVGNCcsICcjREI0NDM3JywgJyNGNEI0MDAnLCAnIzBGOUQ1OCcsICcjQUI0N0JDJywgJyMwMEFDQzEnXTsKCQkJbGV0IGNvbG9ySWR4ID0gMDsKCQkJY29uc3QgYWdlbnRMTE1Db3VudHMgPSB7fTsKCQkJbGxtU3RlcHMuZm9yRWFjaChzID0+IHsKCQkJCWlmICghYWdlbnRDb2xvcnNbcy5OYW1lXSkgewoJCQkJCWFnZW50Q29sb3JzW3MuTmFtZV0gPSBwYWxldHRlW2NvbG9ySWR4ICUgcGFsZXR0ZS5sZW5ndGhdOwoJCQkJCWNvbG9ySWR4Kys7CgkJCQl9CgoJCQkJYWdlbnRMTE1Db3VudHNbcy5OYW1lXSA9IChhZ2VudExMTUNvdW50c1tzLk5hbWVdIHx8IDApICsgMTsKCQkJCWNvbnN0IGxhYmVsID0gYCR7cy5OYW1lfS0ke2FnZW50TExNQ291bnRzW3MuTmFtZV19YDsKCQkJCWNvbnN0IHRvdGFsVG9rZW5zID0gcy5JbnB1dFRva2VucyArIHMuT3V0cHV0VG9rZW5zICsgcy5PdXRwdXRUaG91Z2h0c1Rva2VuczsKCQkJCWNvbnN0IHN0eWxlID0gYGNvbG9yOiAke2FnZW50Q29sb3JzW3MuTmFtZV19YDsKCQkJCWxldCB0b29sdGlwID0gYFRvdGFsIFRva2VuczogJHt0b3RhbFRva2Vuc31cbihJbjogJHtzLklucHV0VG9rZW5zfSwgT3V0OiAke3MuT3V0cHV0VG9rZW5zfSwgVGhvdWdodHM6ICR7cy5PdXRwdXRUaG91Z2h0c1Rva2Vuc30pYDsKCQkJCWlmIChzLlRvb2xDYWxscyAmJiBzLlRvb2xDYWxscy5sZW5ndGggPiAwKSB7CgkJCQkJdG9vbHRpcCArPSBgXG5Ub29sczogJHtzLlRvb2xDYWxscy5qb2luKCcsICcpfWA7CgkJCQl9CgoJCQkJZGF0YS5hZGRSb3coW2xhYmVsLCB0b3RhbFRva2Vucywgc3R5bGUsIHRvb2x0aXBdKTsKCQkJfSk7CgoJCQljb25zdCBvcHRpb25zID0gewoJCQkJdGl0bGU6ICdUb2tlbiBDb25zdW1wdGlvbiBieSBMTE0gQ2FsbHMnLAoJCQkJaEF4aXM6IHsKCQkJCQl0aXRsZTogJ0xMTSBDYWxsIFNlcXVlbmNlJywKCQkJCX0sCgkJCQl2QXhpczogeyB0aXRsZTogJ0NvbnN1bWVkIFRva2VucycgfSwKCQkJCWxlZ2VuZDogeyBwb3NpdGlvbjogJ25vbmUnIH0sCgkJCQliYXI6IHsgZ3JvdXBXaWR0aDogJzc1JScgfSwKCQkJCWNoYXJ0QXJlYTogeyB3aWR0aDogJzg1JScsIGhlaWdodDogJzcwJScgfSwKCQkJCWhlaWdodDogNDAwCgkJCX07CgoJCQljb25zdCBjaGFydCA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5Db2x1bW5DaGFydChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG9rZW5fY2hhcnRfZGl2JykpOwoJCQljaGFydC5kcmF3KGRhdGEsIG9wdGlvbnMpOwoJCX0KCQlsZXQgYWxsRXhwYW5kZWQgPSBmYWxzZTsKCQlmdW5jdGlvbiB0b2dnbGVBbGxEZXRhaWxzKCkgewoJCQlhbGxFeHBhbmRlZCA9ICFhbGxFeHBhbmRlZDsKCQkJZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnZGV0YWlscycpLmZvckVhY2goZCA9PiB7CgkJCQlpZiAoYWxsRXhwYW5kZWQpIGQuc2V0QXR0cmlidXRlKCdvcGVuJywgJycpOwoJCQkJZWxzZSBkLnJlbW92ZUF0dHJpYnV0ZSgnb3BlbicpOwoJCQl9KTsKCQl9Cgk8L3NjcmlwdD4KCgo8L2JvZHk+CjwvaHRtbD4K" },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:nil,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,} --------- Name: series-workflowmqfq4[1] Phase: Succeeded StartedAt: 2026-08-17 22:36:13 +0000 UTC FinishedAt: 2026-08-17 22:36:13 +0000 UTC Input: nil Output: nil --------- Name: series-workflowmqfq4[1].abort-on-skip-outcome Phase: Skipped StartedAt: 2026-08-17 22:36:13 +0000 UTC FinishedAt: 2026-08-17 22:36:13 +0000 UTC Input: nil Output: nil --------- Name: series-workflowmqfq4[2] Phase: Succeeded StartedAt: 2026-08-17 22:36:13 +0000 UTC FinishedAt: 2026-08-18 02:17:30 +0000 UTC Input: nil Output: nil --------- Name: series-workflowmqfq4[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"2780860eddecba9ffe210bb9436eee3cf22bfcdd","config_name":"upstream-apparmor-kasan.config","enable_configs":["BLK_CGROUP","BPF_SYSCALL","CGROUPS","BLOCK"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["bpf","fs"],"focus_symbols":["bpf_blkcg_flush_stats","bpf_iter_blkg_new","bpf_iter_blkg_next","bpf_iter_blkg_destroy","blkcg_fill_root_iostats"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"2780860eddecba9ffe210bb9436eee3cf22bfcdd","config_name":"upstream-apparmor-kasan.config","enable_configs":["BLK_CGROUP","BPF_SYSCALL","CGROUPS","BLOCK"],"series_id":"e1f69090-9b52-43f2-9c8a-7b018cef8515","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-08-17 22:36:13 +0000 UTC FinishedAt: 2026-08-18 02:17:30 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:element,Default:nil,Value:*{"base":{"arch":"amd64","commit_hash":"2780860eddecba9ffe210bb9436eee3cf22bfcdd","config_name":"upstream-apparmor-kasan.config","enable_configs":["BLK_CGROUP","BPF_SYSCALL","CGROUPS","BLOCK"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},"fuzz":{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["bpf","fs"],"focus_symbols":["bpf_blkcg_flush_stats","bpf_iter_blkg_new","bpf_iter_blkg_next","bpf_iter_blkg_destroy","blkcg_fill_root_iostats"],"skip_cover_check":false},"patched":{"arch":"amd64","commit_hash":"2780860eddecba9ffe210bb9436eee3cf22bfcdd","config_name":"upstream-apparmor-kasan.config","enable_configs":["BLK_CGROUP","BPF_SYSCALL","CGROUPS","BLOCK"],"series_id":"e1f69090-9b52-43f2-9c8a-7b018cef8515","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-workflowmqfq4[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"2780860eddecba9ffe210bb9436eee3cf22bfcdd","config_name":"upstream-apparmor-kasan.config","enable_configs":["BLK_CGROUP","BPF_SYSCALL","CGROUPS","BLOCK"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["bpf","fs"],"focus_symbols":["bpf_blkcg_flush_stats","bpf_iter_blkg_new","bpf_iter_blkg_next","bpf_iter_blkg_destroy","blkcg_fill_root_iostats"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"2780860eddecba9ffe210bb9436eee3cf22bfcdd","config_name":"upstream-apparmor-kasan.config","enable_configs":["BLK_CGROUP","BPF_SYSCALL","CGROUPS","BLOCK"],"series_id":"e1f69090-9b52-43f2-9c8a-7b018cef8515","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-08-17 22:36:13 +0000 UTC FinishedAt: 2026-08-17 22:36:23 +0000 UTC Input: nil Output: nil --------- Name: series-workflowmqfq4[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"2780860eddecba9ffe210bb9436eee3cf22bfcdd","config_name":"upstream-apparmor-kasan.config","enable_configs":["BLK_CGROUP","BPF_SYSCALL","CGROUPS","BLOCK"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["bpf","fs"],"focus_symbols":["bpf_blkcg_flush_stats","bpf_iter_blkg_new","bpf_iter_blkg_next","bpf_iter_blkg_destroy","blkcg_fill_root_iostats"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"2780860eddecba9ffe210bb9436eee3cf22bfcdd","config_name":"upstream-apparmor-kasan.config","enable_configs":["BLK_CGROUP","BPF_SYSCALL","CGROUPS","BLOCK"],"series_id":"e1f69090-9b52-43f2-9c8a-7b018cef8515","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-08-17 22:36:13 +0000 UTC FinishedAt: 2026-08-17 22:36:18 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"arch":"amd64","commit_hash":"2780860eddecba9ffe210bb9436eee3cf22bfcdd","config_name":"upstream-apparmor-kasan.config","enable_configs":["BLK_CGROUP","BPF_SYSCALL","CGROUPS","BLOCK"],"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-workflowmqfq4/series-workflowmqfq4-convert-artifact-3303895619/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowmqfq4[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"2780860eddecba9ffe210bb9436eee3cf22bfcdd","config_name":"upstream-apparmor-kasan.config","enable_configs":["BLK_CGROUP","BPF_SYSCALL","CGROUPS","BLOCK"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["bpf","fs"],"focus_symbols":["bpf_blkcg_flush_stats","bpf_iter_blkg_new","bpf_iter_blkg_next","bpf_iter_blkg_destroy","blkcg_fill_root_iostats"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"2780860eddecba9ffe210bb9436eee3cf22bfcdd","config_name":"upstream-apparmor-kasan.config","enable_configs":["BLK_CGROUP","BPF_SYSCALL","CGROUPS","BLOCK"],"series_id":"e1f69090-9b52-43f2-9c8a-7b018cef8515","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-08-17 22:36:23 +0000 UTC FinishedAt: 2026-08-17 22:52:29 +0000 UTC Input: nil Output: nil --------- Name: series-workflowmqfq4[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"2780860eddecba9ffe210bb9436eee3cf22bfcdd","config_name":"upstream-apparmor-kasan.config","enable_configs":["BLK_CGROUP","BPF_SYSCALL","CGROUPS","BLOCK"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["bpf","fs"],"focus_symbols":["bpf_blkcg_flush_stats","bpf_iter_blkg_new","bpf_iter_blkg_next","bpf_iter_blkg_destroy","blkcg_fill_root_iostats"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"2780860eddecba9ffe210bb9436eee3cf22bfcdd","config_name":"upstream-apparmor-kasan.config","enable_configs":["BLK_CGROUP","BPF_SYSCALL","CGROUPS","BLOCK"],"series_id":"e1f69090-9b52-43f2-9c8a-7b018cef8515","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-08-17 22:36:23 +0000 UTC FinishedAt: 2026-08-17 22:52:29 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:findings,Default:nil,Value:*false,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:test-name,Default:nil,Value:*[KASAN] Build Base,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:smoke-build,Default:nil,Value:*false,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:session-id,Default:nil,Value:*9f9a0547-d7e2-4695-9b0e-c84744639ab6,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-workflowmqfq4/series-workflowmqfq4-convert-artifact-3303895619/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": "46024bae-bc62-4ddf-88d9-0dfb60ab8fd2", "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-workflowmqfq4/series-workflowmqfq4-build-action-4064341169/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowmqfq4[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"2780860eddecba9ffe210bb9436eee3cf22bfcdd","config_name":"upstream-apparmor-kasan.config","enable_configs":["BLK_CGROUP","BPF_SYSCALL","CGROUPS","BLOCK"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["bpf","fs"],"focus_symbols":["bpf_blkcg_flush_stats","bpf_iter_blkg_new","bpf_iter_blkg_next","bpf_iter_blkg_destroy","blkcg_fill_root_iostats"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"2780860eddecba9ffe210bb9436eee3cf22bfcdd","config_name":"upstream-apparmor-kasan.config","enable_configs":["BLK_CGROUP","BPF_SYSCALL","CGROUPS","BLOCK"],"series_id":"e1f69090-9b52-43f2-9c8a-7b018cef8515","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-08-17 22:36:23 +0000 UTC FinishedAt: 2026-08-17 22:52:19 +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:*9f9a0547-d7e2-4695-9b0e-c84744639ab6,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-workflowmqfq4/series-workflowmqfq4-convert-artifact-3303895619/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": "46024bae-bc62-4ddf-88d9-0dfb60ab8fd2", "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-workflowmqfq4/series-workflowmqfq4-build-action-4064341169/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowmqfq4[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"2780860eddecba9ffe210bb9436eee3cf22bfcdd","config_name":"upstream-apparmor-kasan.config","enable_configs":["BLK_CGROUP","BPF_SYSCALL","CGROUPS","BLOCK"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["bpf","fs"],"focus_symbols":["bpf_blkcg_flush_stats","bpf_iter_blkg_new","bpf_iter_blkg_next","bpf_iter_blkg_destroy","blkcg_fill_root_iostats"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"2780860eddecba9ffe210bb9436eee3cf22bfcdd","config_name":"upstream-apparmor-kasan.config","enable_configs":["BLK_CGROUP","BPF_SYSCALL","CGROUPS","BLOCK"],"series_id":"e1f69090-9b52-43f2-9c8a-7b018cef8515","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-08-17 22:52:29 +0000 UTC FinishedAt: 2026-08-17 22:52:29 +0000 UTC Input: nil Output: nil --------- Name: series-workflowmqfq4[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"2780860eddecba9ffe210bb9436eee3cf22bfcdd","config_name":"upstream-apparmor-kasan.config","enable_configs":["BLK_CGROUP","BPF_SYSCALL","CGROUPS","BLOCK"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["bpf","fs"],"focus_symbols":["bpf_blkcg_flush_stats","bpf_iter_blkg_new","bpf_iter_blkg_next","bpf_iter_blkg_destroy","blkcg_fill_root_iostats"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"2780860eddecba9ffe210bb9436eee3cf22bfcdd","config_name":"upstream-apparmor-kasan.config","enable_configs":["BLK_CGROUP","BPF_SYSCALL","CGROUPS","BLOCK"],"series_id":"e1f69090-9b52-43f2-9c8a-7b018cef8515","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-08-17 22:52:29 +0000 UTC FinishedAt: 2026-08-17 22:52:29 +0000 UTC Input: nil Output: nil --------- Name: series-workflowmqfq4[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"2780860eddecba9ffe210bb9436eee3cf22bfcdd","config_name":"upstream-apparmor-kasan.config","enable_configs":["BLK_CGROUP","BPF_SYSCALL","CGROUPS","BLOCK"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["bpf","fs"],"focus_symbols":["bpf_blkcg_flush_stats","bpf_iter_blkg_new","bpf_iter_blkg_next","bpf_iter_blkg_destroy","blkcg_fill_root_iostats"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"2780860eddecba9ffe210bb9436eee3cf22bfcdd","config_name":"upstream-apparmor-kasan.config","enable_configs":["BLK_CGROUP","BPF_SYSCALL","CGROUPS","BLOCK"],"series_id":"e1f69090-9b52-43f2-9c8a-7b018cef8515","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-08-17 22:52:29 +0000 UTC FinishedAt: 2026-08-17 22:52:39 +0000 UTC Input: nil Output: nil --------- Name: series-workflowmqfq4[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"2780860eddecba9ffe210bb9436eee3cf22bfcdd","config_name":"upstream-apparmor-kasan.config","enable_configs":["BLK_CGROUP","BPF_SYSCALL","CGROUPS","BLOCK"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["bpf","fs"],"focus_symbols":["bpf_blkcg_flush_stats","bpf_iter_blkg_new","bpf_iter_blkg_next","bpf_iter_blkg_destroy","blkcg_fill_root_iostats"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"2780860eddecba9ffe210bb9436eee3cf22bfcdd","config_name":"upstream-apparmor-kasan.config","enable_configs":["BLK_CGROUP","BPF_SYSCALL","CGROUPS","BLOCK"],"series_id":"e1f69090-9b52-43f2-9c8a-7b018cef8515","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-08-17 22:52:29 +0000 UTC FinishedAt: 2026-08-17 22:52:33 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"arch":"amd64","commit_hash":"2780860eddecba9ffe210bb9436eee3cf22bfcdd","config_name":"upstream-apparmor-kasan.config","enable_configs":["BLK_CGROUP","BPF_SYSCALL","CGROUPS","BLOCK"],"series_id":"e1f69090-9b52-43f2-9c8a-7b018cef8515","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-workflowmqfq4/series-workflowmqfq4-convert-artifact-2412404474/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowmqfq4[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"2780860eddecba9ffe210bb9436eee3cf22bfcdd","config_name":"upstream-apparmor-kasan.config","enable_configs":["BLK_CGROUP","BPF_SYSCALL","CGROUPS","BLOCK"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["bpf","fs"],"focus_symbols":["bpf_blkcg_flush_stats","bpf_iter_blkg_new","bpf_iter_blkg_next","bpf_iter_blkg_destroy","blkcg_fill_root_iostats"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"2780860eddecba9ffe210bb9436eee3cf22bfcdd","config_name":"upstream-apparmor-kasan.config","enable_configs":["BLK_CGROUP","BPF_SYSCALL","CGROUPS","BLOCK"],"series_id":"e1f69090-9b52-43f2-9c8a-7b018cef8515","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-08-17 22:52:39 +0000 UTC FinishedAt: 2026-08-17 22:54:45 +0000 UTC Input: nil Output: nil --------- Name: series-workflowmqfq4[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"2780860eddecba9ffe210bb9436eee3cf22bfcdd","config_name":"upstream-apparmor-kasan.config","enable_configs":["BLK_CGROUP","BPF_SYSCALL","CGROUPS","BLOCK"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["bpf","fs"],"focus_symbols":["bpf_blkcg_flush_stats","bpf_iter_blkg_new","bpf_iter_blkg_next","bpf_iter_blkg_destroy","blkcg_fill_root_iostats"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"2780860eddecba9ffe210bb9436eee3cf22bfcdd","config_name":"upstream-apparmor-kasan.config","enable_configs":["BLK_CGROUP","BPF_SYSCALL","CGROUPS","BLOCK"],"series_id":"e1f69090-9b52-43f2-9c8a-7b018cef8515","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-08-17 22:52:39 +0000 UTC FinishedAt: 2026-08-17 22:54:35 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*46024bae-bc62-4ddf-88d9-0dfb60ab8fd2,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-workflowmqfq4/series-workflowmqfq4-build-action-4064341169/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-workflowmqfq4[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"2780860eddecba9ffe210bb9436eee3cf22bfcdd","config_name":"upstream-apparmor-kasan.config","enable_configs":["BLK_CGROUP","BPF_SYSCALL","CGROUPS","BLOCK"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["bpf","fs"],"focus_symbols":["bpf_blkcg_flush_stats","bpf_iter_blkg_new","bpf_iter_blkg_next","bpf_iter_blkg_destroy","blkcg_fill_root_iostats"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"2780860eddecba9ffe210bb9436eee3cf22bfcdd","config_name":"upstream-apparmor-kasan.config","enable_configs":["BLK_CGROUP","BPF_SYSCALL","CGROUPS","BLOCK"],"series_id":"e1f69090-9b52-43f2-9c8a-7b018cef8515","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-08-17 22:54:45 +0000 UTC FinishedAt: 2026-08-17 22:54:45 +0000 UTC Input: nil Output: nil --------- Name: series-workflowmqfq4[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"2780860eddecba9ffe210bb9436eee3cf22bfcdd","config_name":"upstream-apparmor-kasan.config","enable_configs":["BLK_CGROUP","BPF_SYSCALL","CGROUPS","BLOCK"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["bpf","fs"],"focus_symbols":["bpf_blkcg_flush_stats","bpf_iter_blkg_new","bpf_iter_blkg_next","bpf_iter_blkg_destroy","blkcg_fill_root_iostats"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"2780860eddecba9ffe210bb9436eee3cf22bfcdd","config_name":"upstream-apparmor-kasan.config","enable_configs":["BLK_CGROUP","BPF_SYSCALL","CGROUPS","BLOCK"],"series_id":"e1f69090-9b52-43f2-9c8a-7b018cef8515","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-08-17 22:54:45 +0000 UTC FinishedAt: 2026-08-17 22:54:45 +0000 UTC Input: nil Output: nil --------- Name: series-workflowmqfq4[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"2780860eddecba9ffe210bb9436eee3cf22bfcdd","config_name":"upstream-apparmor-kasan.config","enable_configs":["BLK_CGROUP","BPF_SYSCALL","CGROUPS","BLOCK"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["bpf","fs"],"focus_symbols":["bpf_blkcg_flush_stats","bpf_iter_blkg_new","bpf_iter_blkg_next","bpf_iter_blkg_destroy","blkcg_fill_root_iostats"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"2780860eddecba9ffe210bb9436eee3cf22bfcdd","config_name":"upstream-apparmor-kasan.config","enable_configs":["BLK_CGROUP","BPF_SYSCALL","CGROUPS","BLOCK"],"series_id":"e1f69090-9b52-43f2-9c8a-7b018cef8515","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-08-17 22:54:45 +0000 UTC FinishedAt: 2026-08-17 23:11:09 +0000 UTC Input: nil Output: nil --------- Name: series-workflowmqfq4[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"2780860eddecba9ffe210bb9436eee3cf22bfcdd","config_name":"upstream-apparmor-kasan.config","enable_configs":["BLK_CGROUP","BPF_SYSCALL","CGROUPS","BLOCK"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["bpf","fs"],"focus_symbols":["bpf_blkcg_flush_stats","bpf_iter_blkg_new","bpf_iter_blkg_next","bpf_iter_blkg_destroy","blkcg_fill_root_iostats"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"2780860eddecba9ffe210bb9436eee3cf22bfcdd","config_name":"upstream-apparmor-kasan.config","enable_configs":["BLK_CGROUP","BPF_SYSCALL","CGROUPS","BLOCK"],"series_id":"e1f69090-9b52-43f2-9c8a-7b018cef8515","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-08-17 22:54:45 +0000 UTC FinishedAt: 2026-08-17 23:11:09 +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:*9f9a0547-d7e2-4695-9b0e-c84744639ab6,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-workflowmqfq4/series-workflowmqfq4-convert-artifact-2412404474/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": "68b6bf4d-5141-47ca-9472-387d4a1bf796", "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-workflowmqfq4/series-workflowmqfq4-build-action-1378156126/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowmqfq4[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"2780860eddecba9ffe210bb9436eee3cf22bfcdd","config_name":"upstream-apparmor-kasan.config","enable_configs":["BLK_CGROUP","BPF_SYSCALL","CGROUPS","BLOCK"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["bpf","fs"],"focus_symbols":["bpf_blkcg_flush_stats","bpf_iter_blkg_new","bpf_iter_blkg_next","bpf_iter_blkg_destroy","blkcg_fill_root_iostats"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"2780860eddecba9ffe210bb9436eee3cf22bfcdd","config_name":"upstream-apparmor-kasan.config","enable_configs":["BLK_CGROUP","BPF_SYSCALL","CGROUPS","BLOCK"],"series_id":"e1f69090-9b52-43f2-9c8a-7b018cef8515","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-08-17 22:54:45 +0000 UTC FinishedAt: 2026-08-17 23:10:59 +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:*9f9a0547-d7e2-4695-9b0e-c84744639ab6,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-workflowmqfq4/series-workflowmqfq4-convert-artifact-2412404474/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": "68b6bf4d-5141-47ca-9472-387d4a1bf796", "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-workflowmqfq4/series-workflowmqfq4-build-action-1378156126/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowmqfq4[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"2780860eddecba9ffe210bb9436eee3cf22bfcdd","config_name":"upstream-apparmor-kasan.config","enable_configs":["BLK_CGROUP","BPF_SYSCALL","CGROUPS","BLOCK"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["bpf","fs"],"focus_symbols":["bpf_blkcg_flush_stats","bpf_iter_blkg_new","bpf_iter_blkg_next","bpf_iter_blkg_destroy","blkcg_fill_root_iostats"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"2780860eddecba9ffe210bb9436eee3cf22bfcdd","config_name":"upstream-apparmor-kasan.config","enable_configs":["BLK_CGROUP","BPF_SYSCALL","CGROUPS","BLOCK"],"series_id":"e1f69090-9b52-43f2-9c8a-7b018cef8515","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-08-17 23:11:09 +0000 UTC FinishedAt: 2026-08-17 23:11:09 +0000 UTC Input: nil Output: nil --------- Name: series-workflowmqfq4[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"2780860eddecba9ffe210bb9436eee3cf22bfcdd","config_name":"upstream-apparmor-kasan.config","enable_configs":["BLK_CGROUP","BPF_SYSCALL","CGROUPS","BLOCK"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["bpf","fs"],"focus_symbols":["bpf_blkcg_flush_stats","bpf_iter_blkg_new","bpf_iter_blkg_next","bpf_iter_blkg_destroy","blkcg_fill_root_iostats"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"2780860eddecba9ffe210bb9436eee3cf22bfcdd","config_name":"upstream-apparmor-kasan.config","enable_configs":["BLK_CGROUP","BPF_SYSCALL","CGROUPS","BLOCK"],"series_id":"e1f69090-9b52-43f2-9c8a-7b018cef8515","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-08-17 23:11:09 +0000 UTC FinishedAt: 2026-08-17 23:11:09 +0000 UTC Input: nil Output: nil --------- Name: series-workflowmqfq4[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"2780860eddecba9ffe210bb9436eee3cf22bfcdd","config_name":"upstream-apparmor-kasan.config","enable_configs":["BLK_CGROUP","BPF_SYSCALL","CGROUPS","BLOCK"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["bpf","fs"],"focus_symbols":["bpf_blkcg_flush_stats","bpf_iter_blkg_new","bpf_iter_blkg_next","bpf_iter_blkg_destroy","blkcg_fill_root_iostats"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"2780860eddecba9ffe210bb9436eee3cf22bfcdd","config_name":"upstream-apparmor-kasan.config","enable_configs":["BLK_CGROUP","BPF_SYSCALL","CGROUPS","BLOCK"],"series_id":"e1f69090-9b52-43f2-9c8a-7b018cef8515","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-08-17 23:11:09 +0000 UTC FinishedAt: 2026-08-17 23:13:17 +0000 UTC Input: nil Output: nil --------- Name: series-workflowmqfq4[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"2780860eddecba9ffe210bb9436eee3cf22bfcdd","config_name":"upstream-apparmor-kasan.config","enable_configs":["BLK_CGROUP","BPF_SYSCALL","CGROUPS","BLOCK"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["bpf","fs"],"focus_symbols":["bpf_blkcg_flush_stats","bpf_iter_blkg_new","bpf_iter_blkg_next","bpf_iter_blkg_destroy","blkcg_fill_root_iostats"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"2780860eddecba9ffe210bb9436eee3cf22bfcdd","config_name":"upstream-apparmor-kasan.config","enable_configs":["BLK_CGROUP","BPF_SYSCALL","CGROUPS","BLOCK"],"series_id":"e1f69090-9b52-43f2-9c8a-7b018cef8515","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-08-17 23:11:09 +0000 UTC FinishedAt: 2026-08-17 23:13:06 +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:*68b6bf4d-5141-47ca-9472-387d4a1bf796,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-workflowmqfq4/series-workflowmqfq4-build-action-1378156126/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-workflowmqfq4[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"2780860eddecba9ffe210bb9436eee3cf22bfcdd","config_name":"upstream-apparmor-kasan.config","enable_configs":["BLK_CGROUP","BPF_SYSCALL","CGROUPS","BLOCK"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["bpf","fs"],"focus_symbols":["bpf_blkcg_flush_stats","bpf_iter_blkg_new","bpf_iter_blkg_next","bpf_iter_blkg_destroy","blkcg_fill_root_iostats"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"2780860eddecba9ffe210bb9436eee3cf22bfcdd","config_name":"upstream-apparmor-kasan.config","enable_configs":["BLK_CGROUP","BPF_SYSCALL","CGROUPS","BLOCK"],"series_id":"e1f69090-9b52-43f2-9c8a-7b018cef8515","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-08-17 23:13:17 +0000 UTC FinishedAt: 2026-08-18 02:17:30 +0000 UTC Input: nil Output: nil --------- Name: series-workflowmqfq4[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"2780860eddecba9ffe210bb9436eee3cf22bfcdd","config_name":"upstream-apparmor-kasan.config","enable_configs":["BLK_CGROUP","BPF_SYSCALL","CGROUPS","BLOCK"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["bpf","fs"],"focus_symbols":["bpf_blkcg_flush_stats","bpf_iter_blkg_new","bpf_iter_blkg_next","bpf_iter_blkg_destroy","blkcg_fill_root_iostats"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"2780860eddecba9ffe210bb9436eee3cf22bfcdd","config_name":"upstream-apparmor-kasan.config","enable_configs":["BLK_CGROUP","BPF_SYSCALL","CGROUPS","BLOCK"],"series_id":"e1f69090-9b52-43f2-9c8a-7b018cef8515","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-08-17 23:13:17 +0000 UTC FinishedAt: 2026-08-18 02:17:30 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:config,Default:nil,Value:*{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["bpf","fs"],"focus_symbols":["bpf_blkcg_flush_stats","bpf_iter_blkg_new","bpf_iter_blkg_next","bpf_iter_blkg_destroy","blkcg_fill_root_iostats"],"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:*46024bae-bc62-4ddf-88d9-0dfb60ab8fd2,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*68b6bf4d-5141-47ca-9472-387d4a1bf796,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-workflowmqfq4/series-workflowmqfq4-build-action-4064341169/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-workflowmqfq4/series-workflowmqfq4-build-action-1378156126/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: nil --------- Name: series-workflowmqfq4[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"2780860eddecba9ffe210bb9436eee3cf22bfcdd","config_name":"upstream-apparmor-kasan.config","enable_configs":["BLK_CGROUP","BPF_SYSCALL","CGROUPS","BLOCK"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["bpf","fs"],"focus_symbols":["bpf_blkcg_flush_stats","bpf_iter_blkg_new","bpf_iter_blkg_next","bpf_iter_blkg_destroy","blkcg_fill_root_iostats"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"2780860eddecba9ffe210bb9436eee3cf22bfcdd","config_name":"upstream-apparmor-kasan.config","enable_configs":["BLK_CGROUP","BPF_SYSCALL","CGROUPS","BLOCK"],"series_id":"e1f69090-9b52-43f2-9c8a-7b018cef8515","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-08-17 23:13:17 +0000 UTC FinishedAt: 2026-08-17 23:13:27 +0000 UTC Input: nil Output: nil --------- Name: series-workflowmqfq4[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"2780860eddecba9ffe210bb9436eee3cf22bfcdd","config_name":"upstream-apparmor-kasan.config","enable_configs":["BLK_CGROUP","BPF_SYSCALL","CGROUPS","BLOCK"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["bpf","fs"],"focus_symbols":["bpf_blkcg_flush_stats","bpf_iter_blkg_new","bpf_iter_blkg_next","bpf_iter_blkg_destroy","blkcg_fill_root_iostats"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"2780860eddecba9ffe210bb9436eee3cf22bfcdd","config_name":"upstream-apparmor-kasan.config","enable_configs":["BLK_CGROUP","BPF_SYSCALL","CGROUPS","BLOCK"],"series_id":"e1f69090-9b52-43f2-9c8a-7b018cef8515","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-08-17 23:13:17 +0000 UTC FinishedAt: 2026-08-17 23:13:22 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["bpf","fs"],"focus_symbols":["bpf_blkcg_flush_stats","bpf_iter_blkg_new","bpf_iter_blkg_next","bpf_iter_blkg_destroy","blkcg_fill_root_iostats"],"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-workflowmqfq4/series-workflowmqfq4-convert-artifact-928588079/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowmqfq4[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"2780860eddecba9ffe210bb9436eee3cf22bfcdd","config_name":"upstream-apparmor-kasan.config","enable_configs":["BLK_CGROUP","BPF_SYSCALL","CGROUPS","BLOCK"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["bpf","fs"],"focus_symbols":["bpf_blkcg_flush_stats","bpf_iter_blkg_new","bpf_iter_blkg_next","bpf_iter_blkg_destroy","blkcg_fill_root_iostats"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"2780860eddecba9ffe210bb9436eee3cf22bfcdd","config_name":"upstream-apparmor-kasan.config","enable_configs":["BLK_CGROUP","BPF_SYSCALL","CGROUPS","BLOCK"],"series_id":"e1f69090-9b52-43f2-9c8a-7b018cef8515","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-08-17 23:13:17 +0000 UTC FinishedAt: 2026-08-17 23:13:17 +0000 UTC Input: nil Output: nil --------- Name: series-workflowmqfq4[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"2780860eddecba9ffe210bb9436eee3cf22bfcdd","config_name":"upstream-apparmor-kasan.config","enable_configs":["BLK_CGROUP","BPF_SYSCALL","CGROUPS","BLOCK"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["bpf","fs"],"focus_symbols":["bpf_blkcg_flush_stats","bpf_iter_blkg_new","bpf_iter_blkg_next","bpf_iter_blkg_destroy","blkcg_fill_root_iostats"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"2780860eddecba9ffe210bb9436eee3cf22bfcdd","config_name":"upstream-apparmor-kasan.config","enable_configs":["BLK_CGROUP","BPF_SYSCALL","CGROUPS","BLOCK"],"series_id":"e1f69090-9b52-43f2-9c8a-7b018cef8515","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-08-17 23:13:17 +0000 UTC FinishedAt: 2026-08-17 23:13:17 +0000 UTC Input: nil Output: nil --------- Name: series-workflowmqfq4[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"2780860eddecba9ffe210bb9436eee3cf22bfcdd","config_name":"upstream-apparmor-kasan.config","enable_configs":["BLK_CGROUP","BPF_SYSCALL","CGROUPS","BLOCK"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["bpf","fs"],"focus_symbols":["bpf_blkcg_flush_stats","bpf_iter_blkg_new","bpf_iter_blkg_next","bpf_iter_blkg_destroy","blkcg_fill_root_iostats"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"2780860eddecba9ffe210bb9436eee3cf22bfcdd","config_name":"upstream-apparmor-kasan.config","enable_configs":["BLK_CGROUP","BPF_SYSCALL","CGROUPS","BLOCK"],"series_id":"e1f69090-9b52-43f2-9c8a-7b018cef8515","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-08-17 23:13:17 +0000 UTC FinishedAt: 2026-08-17 23:13:17 +0000 UTC Input: nil Output: nil --------- Name: series-workflowmqfq4[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"2780860eddecba9ffe210bb9436eee3cf22bfcdd","config_name":"upstream-apparmor-kasan.config","enable_configs":["BLK_CGROUP","BPF_SYSCALL","CGROUPS","BLOCK"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["bpf","fs"],"focus_symbols":["bpf_blkcg_flush_stats","bpf_iter_blkg_new","bpf_iter_blkg_next","bpf_iter_blkg_destroy","blkcg_fill_root_iostats"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"2780860eddecba9ffe210bb9436eee3cf22bfcdd","config_name":"upstream-apparmor-kasan.config","enable_configs":["BLK_CGROUP","BPF_SYSCALL","CGROUPS","BLOCK"],"series_id":"e1f69090-9b52-43f2-9c8a-7b018cef8515","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-08-17 23:13:27 +0000 UTC FinishedAt: 2026-08-18 02:17:30 +0000 UTC Input: nil Output: nil --------- Name: series-workflowmqfq4[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"2780860eddecba9ffe210bb9436eee3cf22bfcdd","config_name":"upstream-apparmor-kasan.config","enable_configs":["BLK_CGROUP","BPF_SYSCALL","CGROUPS","BLOCK"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["bpf","fs"],"focus_symbols":["bpf_blkcg_flush_stats","bpf_iter_blkg_new","bpf_iter_blkg_next","bpf_iter_blkg_destroy","blkcg_fill_root_iostats"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"2780860eddecba9ffe210bb9436eee3cf22bfcdd","config_name":"upstream-apparmor-kasan.config","enable_configs":["BLK_CGROUP","BPF_SYSCALL","CGROUPS","BLOCK"],"series_id":"e1f69090-9b52-43f2-9c8a-7b018cef8515","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-08-17 23:13:27 +0000 UTC FinishedAt: 2026-08-18 02:17:21 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*46024bae-bc62-4ddf-88d9-0dfb60ab8fd2,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*68b6bf4d-5141-47ca-9472-387d4a1bf796,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-workflowmqfq4/series-workflowmqfq4-build-action-4064341169/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-workflowmqfq4/series-workflowmqfq4-build-action-1378156126/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-workflowmqfq4/series-workflowmqfq4-convert-artifact-928588079/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,}