Name: series-workflow9wm8z Phase: Running StartedAt: 2026-09-14 07:40:59 +0000 UTC FinishedAt: 0001-01-01 00:00:00 +0000 UTC Input: nil Output: nil --------- Name: series-workflow9wm8z[0] Phase: Running StartedAt: 2026-09-14 07:40:59 +0000 UTC FinishedAt: 0001-01-01 00:00:00 +0000 UTC Input: nil Output: nil --------- Name: series-workflow9wm8z[0].run-triage Phase: Running StartedAt: 2026-09-14 07:40:59 +0000 UTC FinishedAt: 0001-01-01 00:00:00 +0000 UTC Input: nil Output: nil --------- Name: series-workflow9wm8z[0].run-triage(0) Phase: Running StartedAt: 2026-09-14 07:40:59 +0000 UTC FinishedAt: 0001-01-01 00:00:00 +0000 UTC Input: nil Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "skip_reason": "", "targets": [ { "base": { "arch": "amd64", "tree_name": "axboe", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git", "commit_hash": "df2908090cda368b01ff43709f51890076c56157", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "MEMORY_HOTPLUG", "MEMORY_HOTREMOVE", "SPARSEMEM_VMEMMAP", "COMPACTION" ], "series_id": "" }, "patched": { "arch": "amd64", "tree_name": "axboe", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git", "commit_hash": "df2908090cda368b01ff43709f51890076c56157", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "MEMORY_HOTPLUG", "MEMORY_HOTREMOVE", "SPARSEMEM_VMEMMAP", "COMPACTION" ], "series_id": "54dca9ff-d62a-4ac2-ab46-1950f9a731b3" }, "track": "KASAN", "fuzz": { "focus": null, "focus_symbols": [ "memory_block_online", "memory_block_offline", "adjust_present_page_count", "remove_pfn_range_from_zone", "shrink_zone_span", "offline_pages", "online_pages", "isolate_migratepages_range" ], "corpus_urls": [ "https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db" ], "skip_cover_check": true, "bug_title_re": "", "base_commit": "df2908090cda368b01ff43709f51890076c56157", "base_tree": "axboe" }, "retest": null } ], "trajectory": "CjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KPGhlYWQ+Cgk8dGl0bGU+QUkgVHJhamVjdG9yeTwvdGl0bGU+Cgk8c3R5bGU+CgkJdGFibGUgewoJCQlib3JkZXI6IDFweCBzb2xpZCAjY2NjOwoJCQltYXJnaW46IDIwcHggNXB4OwoJCQlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwoJCQl3aGl0ZS1zcGFjZTogbm93cmFwOwoJCQl0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKCQkJb3ZlcmZsb3c6IGhpZGRlbjsKCQl9CgoJCXRhYmxlIGNhcHRpb24gewoJCQlmb250LXdlaWdodDogYm9sZDsKCQl9CgoJCXRhYmxlIHRkLCB0YWJsZSB0aCB7CgkJCXZlcnRpY2FsLWFsaWduOiB0b3A7CgkJCXBhZGRpbmc6IDJweCA4cHg7CgkJCXRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwoJCQlvdmVyZmxvdzogaGlkZGVuOwoJCX0KCgkJLmxpc3RfdGFibGUgdGQsIC5saXN0X3RhYmxlIHRoIHsKCQkJYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjY2NjOwoJCX0KCgkJLmxpc3RfdGFibGUgdGggewoJCQliYWNrZ3JvdW5kOiAjRjRGNEY0OwoJCX0KCgkJLmxpc3RfdGFibGUgdHI6bnRoLWNoaWxkKDJuKSB7CgkJCWJhY2tncm91bmQ6ICNGNEY0RjQ7CgkJfQoKCQkubGlzdF90YWJsZSB0cjpob3ZlciB7CgkJCWJhY2tncm91bmQ6ICNmZmZmOTk7CgkJfQoKCQkjYWlfZGV0YWlsc19kaXYgcHJlIHsKCQkJbWFyZ2luOiAxcHg7CgkJCW1heC13aWR0aDogMTIwY2g7CgkJCXdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKCQkJb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKCQl9Cgk8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PgoJPGgxPkFJIFRyYWplY3Rvcnk8L2gxPgoJPGJyPgoKCQoJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQk8Y2FwdGlvbj5UcmFqZWN0b3J5OiAoPGEgaHJlZj0iIyIgb25jbGljaz0idG9nZ2xlQWxsRGV0YWlscygpOyByZXR1cm4gZmFsc2U7Ij5FeHBhbmQvQ29sbGFwc2UgQWxsPC9hPik8L2NhcHRpb24+CgkJPHRoZWFkPjx0cj4KCQkJPHRoPlNlcTwvdGg+CgkJCTx0aD5UaW1lc3RhbXA8L3RoPgoJCQk8dGg+VHlwZTwvdGg+CgkJCTx0aD5OYW1lPC90aD4KCQkJPHRoPkR1cmF0aW9uPC90aD4KCQk8L3RyPjwvdGhlYWQ+CgkJPHRib2R5PgoJCQoJCTx0cj4KCQkJPHRkPjAvMDwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE0IDA3OjQyPC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MTZtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtNRU1PUllfSE9UUExVRyYjMzQ7LAogICAgJiMzNDtNRU1PUllfSE9UUkVNT1ZFJiMzNDssCiAgICAmIzM0O1NQQVJTRU1FTV9WTUVNTUFQJiMzNDssCiAgICAmIzM0O0NPTVBBQ1RJT04mIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDttZW1vcnlfYmxvY2tfb25saW5lJiMzNDssCiAgICAmIzM0O21lbW9yeV9ibG9ja19vZmZsaW5lJiMzNDssCiAgICAmIzM0O2FkanVzdF9wcmVzZW50X3BhZ2VfY291bnQmIzM0OywKICAgICYjMzQ7cmVtb3ZlX3Bmbl9yYW5nZV9mcm9tX3pvbmUmIzM0OywKICAgICYjMzQ7c2hyaW5rX3pvbmVfc3BhbiYjMzQ7LAogICAgJiMzNDtvZmZsaW5lX3BhZ2VzJiMzNDssCiAgICAmIzM0O29ubGluZV9wYWdlcyYjMzQ7LAogICAgJiMzNDtpc29sYXRlX21pZ3JhdGVwYWdlc19yYW5nZSYjMzQ7CiAgXSwKICAmIzM0O0tNU0FOUmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIG9wdGltaXplcyBjb250aWd1b3VzIHpvbmUgZGV0ZWN0aW9uIGJ5IGludHJvZHVjaW5nIHRoZSBgcGFnZXNfd2l0aF9vbmxpbmVfbWVtbWFwYCBjb3VudGVyIGluIGBzdHJ1Y3Qgem9uZWAgdG8gcmVwbGFjZSB0aGUgaXRlcmF0aW9uIG92ZXIgcGFnZWJsb2NrcyBpbiBgc2V0X3pvbmVfY29udGlndW91cygpYC4gSXQgYWxzbyByZWZhY3RvcnMgc3Vic2VjdGlvbiBvdmVybGFwIGNoZWNraW5nIGR1cmluZyBtZW1vcnkgaG90cGx1ZyBvcGVyYXRpb25zIChgZHJpdmVycy9iYXNlL21lbW9yeS5jYCwgYG1tL21lbW9yeV9ob3RwbHVnLmNgLCBgbW0vbW1faW5pdC5jYCkuXG5cbk5vbmUgb2YgdGhlIGNoYW5nZXMgdG91Y2gga2VybmVsLXRvLXVzZXIgY29weSBtZWNoYW5pc21zIChlLmcuLCBgY29weV90b191c2VyYCwgbmV0bGluaywgaW9jdGwsIGV0Yy4pLCBub3IgZG8gdGhleSBpbnRyb2R1Y2UgdW5pbml0aWFsaXplZCBzdGFjayBvciBoZWFwIGFsbG9jYXRpb25zLiBgc3RydWN0IHpvbmVgIGluc3RhbmNlcyBhcmUgemVyby1pbml0aWFsaXplZCBkdXJpbmcgZWFybHkgYm9vdCBhbmQgaG90cGx1ZyBub2RlIGFsbG9jYXRpb24uIEFueSBwb3RlbnRpYWwgbG9naWMgYnVncyBpbiBjb250aWd1b3VzIHpvbmUgY2FsY3VsYXRpb24gb3IgUEZOIHRyYXZlcnNhbCBjb3VsZCBsZWFkIHRvIGludmFsaWQgc3RydWN0IHBhZ2UgZGVyZWZlcmVuY2VzIG9yIG91dC1vZi1ib3VuZHMgYWNjZXNzZXMgZHVyaW5nIGNvbXBhY3Rpb24vcGFnZSBpc29sYXRpb24sIHdoaWNoIGZhbGwgdW5kZXIgdGhlIHB1cnZpZXcgb2YgS0FTQU4gb3Igc3RhbmRhcmQgZmF1bHQgaGFuZGxlcnMsIG5vdCBLTVNBTi4gVGhlcmVmb3JlLCBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaXMgbm90IHdhcnJhbnRlZC4mIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UsCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggcmVmYWN0b3JzIGNvcmUgbWVtb3J5IG1hbmFnZW1lbnQgbG9naWMgZm9yIHRyYWNraW5nIHpvbmUgY29udGlndWl0eSBhbmQgc2hyaW5raW5nIHpvbmUgc3BhbnMgYWNyb3NzIG1tL21lbW9yeV9ob3RwbHVnLmMsIGRyaXZlcnMvYmFzZS9tZW1vcnkuYywgYW5kIGluY2x1ZGUvbGludXgvbW16b25lLmguIEluc3RlYWQgb2Ygc2Nhbm5pbmcgcGFnZWJsb2Nrcywgem9uZSBjb250aWd1aXR5IGlzIG5vdyB0cmFja2VkIGR5bmFtaWNhbGx5IHZpYSBwYWdlc193aXRoX29ubGluZV9tZW1tYXAgYW5kIHVwZGF0ZWQgZHVyaW5nIG1lbW9yeSBvbmxpbmUvb2ZmbGluZSBvcGVyYXRpb25zLiBJbmNvcnJlY3Qgem9uZSBjb250aWd1aXR5IHRyYWNraW5nIGNhbiBsZWFkIHRvIGludmFsaWQgcGZuX3RvX3BhZ2UoKSBsb29rdXBzIGR1cmluZyBtZW1vcnkgY29tcGFjdGlvbiAoZS5nLiBpc29sYXRlX21pZ3JhdGVwYWdlc19yYW5nZSksIGFuZCBtb2RpZmllZCB6b25lIHNocmlua2luZyBsb2dpYyAoc3Vic2VjdGlvbl9vdmVybGFwc196b25lKSBjb3VsZCBjb3JydXB0IHpvbmUgYm91bmRhcmllcy4gVGhlc2UgcGF0aHMgYXJlIHJlYWNoYWJsZSB2aWEgc3lzZnMgbWVtb3J5IGJsb2NrIG1hbmFnZW1lbnQgYW5kIG1lbW9yeSBjb21wYWN0aW9uLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE0IDA3OjQyPC90ZD4KCQkJPHRkPmFjdGlvbjwvdGQ+CgkJCTx0ZD5yZWFkLXBhdGNoLWRpZmY8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtQYXRjaERpZmYmIzM0OzogJiMzNDtjb21taXQgYjc1NzQxZTk2MDQ3MDRmYzUwNmIxODNjNTJkNTE1MjFlMjQwMTA5MFxuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBNb24gU2VwIDE0IDA3OjQyOjU2IDIwMjYgJiM0MzswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vbW0vcGh5c2ljYWxfbWVtb3J5LnJzdCBiL0RvY3VtZW50YXRpb24vbW0vcGh5c2ljYWxfbWVtb3J5LnJzdFxuaW5kZXggYTA5NDA3ZDcyOTczNi4uMmU2N2U4YjIzYTk5NCAxMDA2NDRcbi0tLSBhL0RvY3VtZW50YXRpb24vbW0vcGh5c2ljYWxfbWVtb3J5LnJzdFxuJiM0MzsmIzQzOyYjNDM7IGIvRG9jdW1lbnRhdGlvbi9tbS9waHlzaWNhbF9tZW1vcnkucnN0XG5AQCAtNDgwLDYgJiM0Mzs0ODAsMTIgQEAgR2VuZXJhbFxuICAgYGBwcmVzZW50X3BhZ2VzYGAgc2hvdWxkIHVzZSBgYGdldF9vbmxpbmVfbWVtcygpYGAgdG8gZ2V0IGEgc3RhYmxlIHZhbHVlLiBJdFxuICAgaXMgaW5pdGlhbGl6ZWQgYnkgYGBjYWxjdWxhdGVfbm9kZV90b3RhbHBhZ2VzKClgYC5cbiBcbiYjNDM7YGBwYWdlc193aXRoX29ubGluZV9tZW1tYXBgYFxuJiM0MzsgIFBhZ2VzIHdpdGhpbiB0aGUgem9uZSB0aGF0IGhhdmUgYW4gb25saW5lIG1lbW9yeSBtYXA6IHByZXNlbnQgcGFnZXMgYW5kXG4mIzQzOyAgbWVtb3J5IGhvbGVzIHdob3NlIG1lbW9yeSBtYXAgaGFzIGJlZW4gaW5pdGlhbGl6ZWQgYW5kXG4mIzQzOyAgYGBwZm5fdG9fb25saW5lX3BhZ2UoKWBgIHN1Y2NlZWRzLiBTZWUgdGhlIGNvbW1lbnQgZm9yXG4mIzQzOyAgYGBwYWdlc193aXRoX29ubGluZV9tZW1tYXBgYCBpbiBgYGluY2x1ZGUvbGludXgvbW16b25lLmhgYCBmb3IgbW9yZSBkZXRhaWxzLlxuJiM0MztcbiBgYHByZXNlbnRfZWFybHlfcGFnZXNgYFxuICAgVGhlIHByZXNlbnQgcGFnZXMgZXhpc3Rpbmcgd2l0aGluIHRoZSB6b25lIGxvY2F0ZWQgb24gbWVtb3J5IGF2YWlsYWJsZSBzaW5jZVxuICAgZWFybHkgYm9vdCwgZXhjbHVkaW5nIGhvdHBsdWdnZWQgbWVtb3J5LiBEZWZpbmVkIG9ubHkgd2hlblxuZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9tZW1vcnkuYyBiL2RyaXZlcnMvYmFzZS9tZW1vcnkuY1xuaW5kZXggNWVlYWQzMzQ2ZjFlMy4uMjhmOTUwM2Y2YTcxMCAxMDA2NDRcbi0tLSBhL2RyaXZlcnMvYmFzZS9tZW1vcnkuY1xuJiM0MzsmIzQzOyYjNDM7IGIvZHJpdmVycy9iYXNlL21lbW9yeS5jXG5AQCAtMjU1LDYgJiM0MzsyNTUsNyBAQCBzdGF0aWMgaW50IG1lbW9yeV9ibG9ja19vbmxpbmUoc3RydWN0IG1lbW9yeV9ibG9jayAqbWVtKVxuIFx0XHRucl92bWVtbWFwX3BhZ2VzID0gbWVtLVx1MDAzZWFsdG1hcC1cdTAwM2VmcmVlO1xuIFxuIFx0bWVtX2hvdHBsdWdfYmVnaW4oKTtcbiYjNDM7XHRjbGVhcl96b25lX2NvbnRpZ3VvdXMoem9uZSk7XG4gXHRpZiAobnJfdm1lbW1hcF9wYWdlcykge1xuIFx0XHRyZXQgPSBtaHBfaW5pdF9tZW1tYXBfb25fbWVtb3J5KHN0YXJ0X3BmbiwgbnJfdm1lbW1hcF9wYWdlcywgem9uZSk7XG4gXHRcdGlmIChyZXQpXG5AQCAtMjc5LDYgJiM0MzsyODAsNyBAQCBzdGF0aWMgaW50IG1lbW9yeV9ibG9ja19vbmxpbmUoc3RydWN0IG1lbW9yeV9ibG9jayAqbWVtKVxuIFxuIFx0bWVtLVx1MDAzZXpvbmUgPSB6b25lO1xuIG91dDpcbiYjNDM7XHRzZXRfem9uZV9jb250aWd1b3VzKHpvbmUpO1xuIFx0bWVtX2hvdHBsdWdfZG9uZSgpO1xuIFx0cmV0dXJuIHJldDtcbiB9XG5AQCAtMzA0LDYgJiM0MzszMDYsNyBAQCBzdGF0aWMgaW50IG1lbW9yeV9ibG9ja19vZmZsaW5lKHN0cnVjdCBtZW1vcnlfYmxvY2sgKm1lbSlcbiBcdFx0bnJfdm1lbW1hcF9wYWdlcyA9IG1lbS1cdTAwM2VhbHRtYXAtXHUwMDNlZnJlZTtcbiBcbiBcdG1lbV9ob3RwbHVnX2JlZ2luKCk7XG4mIzQzO1x0Y2xlYXJfem9uZV9jb250aWd1b3VzKG1lbS1cdTAwM2V6b25lKTtcbiBcdGlmIChucl92bWVtbWFwX3BhZ2VzKVxuIFx0XHRhZGp1c3RfcHJlc2VudF9wYWdlX2NvdW50KHBmbl90b19wYWdlKHN0YXJ0X3BmbiksIG1lbS1cdTAwM2Vncm91cCxcbiBcdFx0XHRcdFx0ICAtbnJfdm1lbW1hcF9wYWdlcyk7XG5AQCAtMzIxLDggJiM0MzszMjQsMTAgQEAgc3RhdGljIGludCBtZW1vcnlfYmxvY2tfb2ZmbGluZShzdHJ1Y3QgbWVtb3J5X2Jsb2NrICptZW0pXG4gXHRpZiAobnJfdm1lbW1hcF9wYWdlcylcbiBcdFx0bWhwX2RlaW5pdF9tZW1tYXBfb25fbWVtb3J5KHN0YXJ0X3BmbiwgbnJfdm1lbW1hcF9wYWdlcyk7XG4gXG4tXHRtZW0tXHUwMDNlem9uZSA9IE5VTEw7XG4gb3V0OlxuJiM0MztcdHNldF96b25lX2NvbnRpZ3VvdXMobWVtLVx1MDAzZXpvbmUpO1xuJiM0MztcdGlmICghcmV0KVxuJiM0MztcdFx0bWVtLVx1MDAzZXpvbmUgPSBOVUxMO1xuIFx0bWVtX2hvdHBsdWdfZG9uZSgpO1xuIFx0cmV0dXJuIHJldDtcbiB9XG5kaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tbXpvbmUuaCBiL2luY2x1ZGUvbGludXgvbW16b25lLmhcbmluZGV4IDk0ZjljM2ZmNTQxNjAuLjdiZWZlNTAyMjNkMTIgMTAwNjQ0XG4tLS0gYS9pbmNsdWRlL2xpbnV4L21tem9uZS5oXG4mIzQzOyYjNDM7JiM0MzsgYi9pbmNsdWRlL2xpbnV4L21tem9uZS5oXG5AQCAtMTA0Myw2ICYjNDM7MTA0Myw0MiBAQCBzdHJ1Y3Qgem9uZSB7XG4gXHQgKiBjbWEgcGFnZXMgaXMgcHJlc2VudCBwYWdlcyB0aGF0IGFyZSBhc3NpZ25lZCBmb3IgQ01BIHVzZVxuIFx0ICogKE1JR1JBVEVfQ01BKS5cbiBcdCAqXG4mIzQzO1x0ICogcGFnZXNfd2l0aF9vbmxpbmVfbWVtbWFwIHRyYWNrcyBwYWdlcyB3aXRoaW4gdGhlIHpvbmUgdGhhdCBoYXZlXG4mIzQzO1x0ICogYW4gb25saW5lIG1lbW9yeSBtYXA6IHByZXNlbnQgcGFnZXMgYW5kIG1lbW9yeSBob2xlcyB3aG9zZVxuJiM0MztcdCAqIG1lbW9yeSBtYXAgaGFzIGJlZW4gaW5pdGlhbGl6ZWQgYW5kIHBmbl90b19vbmxpbmVfcGFnZSgpXG4mIzQzO1x0ICogc3VjY2VlZHMuIFdoZW4gc3Bhbm5lZF9wYWdlcyA9PSBwYWdlc193aXRoX29ubGluZV9tZW1tYXAsXG4mIzQzO1x0ICogcGZuX3RvX3BhZ2UoKSBjYW4gYmUgcGVyZm9ybWVkIHdpdGhvdXQgZnVydGhlciBjaGVja3Mgb24gYW55XG4mIzQzO1x0ICogUEZOIHdpdGhpbiB0aGUgem9uZSBzcGFuLlxuJiM0MztcdCAqXG4mIzQzO1x0ICogTm90ZTogdGhpcyBjb3VudGVyIG1heSB0ZW1wb3JhcmlseSB1bmRlcmNvdW50IHdoZW4gcGFnZXMgd2l0aCBhblxuJiM0MztcdCAqIG9ubGluZSBtZW1vcnkgbWFwIGV4aXN0IG91dHNpZGUgdGhlIGN1cnJlbnQgem9uZSBzcGFuLiBTdWNoIHBhZ2VzXG4mIzQzO1x0ICogYXJlIG9ubHkgY3JlYXRlZCBkdXJpbmcgYm9vdCwgd2hlbiBpbml0aWFsaXppbmcgdGhlIG1lbW9yeSBtYXAgb2ZcbiYjNDM7XHQgKiBwYWdlcyB0aGF0IGRvIG5vdCBmYWxsIGludG8gYW55IHpvbmUgc3Bhbi4gVGhlIHVuZGVyY291bnQgaXRzZWxmXG4mIzQzO1x0ICogY2FuIG9ubHkgaGFwcGVuIGFmdGVyIGJvb3QsIGR1cmluZyBtZW1vcnkgaG90cGx1Zywgd2hlbiBncm93aW5nXG4mIzQzO1x0ICogdGhlIHpvbmUgdG8gY292ZXIgc3VjaCBwYWdlcyBhbmQgbGF0ZXIgc2hyaW5raW5nIGl0IGJhY2ssIHdoaWNoXG4mIzQzO1x0ICogbWF5IHJlc3VsdCBpbiBhIFwmIzM0O3RvbyBzbWFsbFwmIzM0OyB2YWx1ZS4gVGhpcyBpcyBzYWZlOiBpdCBtZXJlbHlcbiYjNDM7XHQgKiBwcmV2ZW50cyBkZXRlY3RpbmcgYSBjb250aWd1b3VzIHpvbmUuXG4mIzQzO1x0ICpcbiYjNDM7XHQgKiBIZXJlIGlzIGFuIGV4YW1wbGUgKHBhZ2UgbnVtYmVycyBhcmUganVzdCBmb3IgaWxsdXN0cmF0aW9uXG4mIzQzO1x0ICogcHVycG9zZXMpOlxuJiM0MztcdCAqICAgYWZ0ZXIgYm9vdDpcbiYjNDM7XHQgKiAgICAgICBbICB6b25lIHNwYW4gIF1cbiYjNDM7XHQgKiAgICAgICBbICAgem9uZSBwYWdlcyAgIF1cbiYjNDM7XHQgKiAgICAgICBzcGFubmVkPTEwLCBpbml0aWFsaXplZD0xNSwgb25saW5lPTEwXG4mIzQzO1x0ICogICAgICAgb25saW5lID09IHNwYW5uZWQgIC1cdTAwM2UgIGNvbnRpZ3VvdXNcbiYjNDM7XHQgKlxuJiM0MztcdCAqICAgZ3Jvd2luZyBhZnRlciBob3RwbHVnIChob3RwbHVnIDUpOlxuJiM0MztcdCAqICAgICAgIFsgIHpvbmUgc3BhbiAgICAgICAgICAgICAgICAgICAgICAgICAgXVxuJiM0MztcdCAqICAgICAgIFsgICB6b25lIHBhZ2VzICAgXSAgIFsgICB6b25lIHBhZ2VzICAgXVxuJiM0MztcdCAqICAgICAgIHNwYW5uZWQ9MzAsIGluaXRpYWxpemVkPTIwLCBvbmxpbmU9MTVcbiYjNDM7XHQgKiAgICAgICBvbmxpbmUgIT0gc3Bhbm5lZCAgLVx1MDAzZSAgbm90IGNvbnRpZ3VvdXNcbiYjNDM7XHQgKlxuJiM0MztcdCAqICAgc2hyaW5raW5nIGFmdGVyIGhvdHVucGx1ZyAoaG90dW5wbHVnIDUgYWdhaW4pOlxuJiM0MztcdCAqICAgICAgIFsgIHpvbmUgc3BhbiAgICAgXVxuJiM0MztcdCAqICAgICAgIFsgICB6b25lIHBhZ2VzICAgXVxuJiM0MztcdCAqICAgICAgIHNwYW5uZWQ9MTUsIGluaXRpYWxpemVkPTE1LCBvbmxpbmU9MTBcbiYjNDM7XHQgKiAgICAgICBvbmxpbmUgIT0gc3Bhbm5lZCAgLVx1MDAzZSAgbm90IGNvbnRpZ3VvdXMgYWx0aG91Z2ggY29udGlndW91c1xuJiM0MztcdCAqXG4gXHQgKiBTbyBwcmVzZW50X3BhZ2VzIG1heSBiZSB1c2VkIGJ5IG1lbW9yeSBob3RwbHVnIG9yIG1lbW9yeSBwb3dlclxuIFx0ICogbWFuYWdlbWVudCBsb2dpYyB0byBmaWd1cmUgb3V0IHVubWFuYWdlZCBwYWdlcyBieSBjaGVja2luZ1xuIFx0ICogKHByZXNlbnRfcGFnZXMgLSBtYW5hZ2VkX3BhZ2VzKS4gQW5kIG1hbmFnZWRfcGFnZXMgc2hvdWxkIGJlIHVzZWRcbkBAIC0xMDY3LDYgJiM0MzsxMTAzLDcgQEAgc3RydWN0IHpvbmUge1xuIFx0YXRvbWljX2xvbmdfdFx0XHRtYW5hZ2VkX3BhZ2VzO1xuIFx0dW5zaWduZWQgbG9uZ1x0XHRzcGFubmVkX3BhZ2VzO1xuIFx0dW5zaWduZWQgbG9uZ1x0XHRwcmVzZW50X3BhZ2VzO1xuJiM0MztcdHVuc2lnbmVkIGxvbmdcdFx0cGFnZXNfd2l0aF9vbmxpbmVfbWVtbWFwO1xuICNpZiBkZWZpbmVkKENPTkZJR19NRU1PUllfSE9UUExVRylcbiBcdHVuc2lnbmVkIGxvbmdcdFx0cHJlc2VudF9lYXJseV9wYWdlcztcbiAjZW5kaWZcbkBAIC0xNjk0LDYgJiM0MzsxNzMxLDM4IEBAIHN0YXRpYyBpbmxpbmUgYm9vbCB6b25lX2lzX3pvbmVfZGV2aWNlKGNvbnN0IHN0cnVjdCB6b25lICp6b25lKVxuIH1cbiAjZW5kaWZcbiBcbiYjNDM7LyoqXG4mIzQzOyAqIHpvbmVfaXNfY29udGlndW91cyAtIHRlc3Qgd2hldGhlciBhIHpvbmUgaXMgY29udGlndW91c1xuJiM0MzsgKiBAem9uZTogdGhlIHpvbmUgdG8gdGVzdC5cbiYjNDM7ICpcbiYjNDM7ICogSW4gYSBjb250aWd1b3VzIHpvbmUsIGl0IGlzIHZhbGlkIHRvIGNhbGwgcGZuX3RvX3BhZ2UoKSBvbiBhbnkgUEZOIGluIHRoZVxuJiM0MzsgKiBzcGFubmVkIHpvbmUgd2l0aG91dCByZXF1aXJpbmcgcGZuX3ZhbGlkKCkgb3IgcGZuX3RvX29ubGluZV9wYWdlKCkgY2hlY2tzLlxuJiM0MzsgKlxuJiM0MzsgKiBOb3RlIHRoYXQgbWlzc2luZyBzeW5jaHJvbml6YXRpb24gd2l0aCBtZW1vcnkgb2ZmbGluaW5nIG1ha2VzIGFueSBQRk5cbiYjNDM7ICogdHJhdmVyc2FsIHByb25lIHRvIHJhY2VzLlxuJiM0MzsgKlxuJiM0MzsgKiBaT05FX0RFVklDRSB6b25lcyBhcmUgYWx3YXlzIG1hcmtlZCBub24tY29udGlndW91cy5cbiYjNDM7ICpcbiYjNDM7ICogUmV0dXJuOiB0cnVlIGlmIGNvbnRpZ3VvdXMsIG90aGVyd2lzZSBmYWxzZS5cbiYjNDM7ICovXG4mIzQzO3N0YXRpYyBpbmxpbmUgYm9vbCB6b25lX2lzX2NvbnRpZ3VvdXMoY29uc3Qgc3RydWN0IHpvbmUgKnpvbmUpXG4mIzQzO3tcbiYjNDM7XHRyZXR1cm4gUkVBRF9PTkNFKHpvbmUtXHUwMDNlY29udGlndW91cyk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfem9uZV9jb250aWd1b3VzKHN0cnVjdCB6b25lICp6b25lKVxuJiM0Mzt7XG4mIzQzO1x0aWYgKHpvbmVfaXNfem9uZV9kZXZpY2Uoem9uZSkpXG4mIzQzO1x0XHRyZXR1cm47XG4mIzQzO1x0aWYgKHpvbmUtXHUwMDNlc3Bhbm5lZF9wYWdlcyA9PSB6b25lLVx1MDAzZXBhZ2VzX3dpdGhfb25saW5lX21lbW1hcClcbiYjNDM7XHRcdFdSSVRFX09OQ0Uoem9uZS1cdTAwM2Vjb250aWd1b3VzLCB0cnVlKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGlubGluZSB2b2lkIGNsZWFyX3pvbmVfY29udGlndW91cyhzdHJ1Y3Qgem9uZSAqem9uZSlcbiYjNDM7e1xuJiM0MztcdFdSSVRFX09OQ0Uoem9uZS1cdTAwM2Vjb250aWd1b3VzLCBmYWxzZSk7XG4mIzQzO31cbiYjNDM7XG4gLypcbiAgKiBSZXR1cm5zIHRydWUgaWYgYSB6b25lIGhhcyBwYWdlcyBtYW5hZ2VkIGJ5IHRoZSBidWRkeSBhbGxvY2F0b3IuXG4gICogQWxsIHRoZSByZWNsYWltIGRlY2lzaW9ucyBoYXZlIHRvIHVzZSB0aGlzIGZ1bmN0aW9uIHJhdGhlciB0aGFuXG5kaWZmIC0tZ2l0IGEvbW0vbWVtb3J5X2hvdHBsdWcuYyBiL21tL21lbW9yeV9ob3RwbHVnLmNcbmluZGV4IDIyNmFiOWNiMDc4YWQuLjEwMDk0MWQxYjgyOGEgMTAwNjQ0XG4tLS0gYS9tbS9tZW1vcnlfaG90cGx1Zy5jXG4mIzQzOyYjNDM7JiM0MzsgYi9tbS9tZW1vcnlfaG90cGx1Zy5jXG5AQCAtNDI1LDQ5ICYjNDM7NDI1LDM5IEBAIGludCBfX2FkZF9wYWdlcyhpbnQgbmlkLCB1bnNpZ25lZCBsb25nIHBmbiwgdW5zaWduZWQgbG9uZyBucl9wYWdlcyxcbiBcdHJldHVybiBlcnI7XG4gfVxuIFxuLS8qIGZpbmQgdGhlIHNtYWxsZXN0IHZhbGlkIHBmbiBpbiB0aGUgcmFuZ2UgW3N0YXJ0X3BmbiwgZW5kX3BmbikgKi9cbi1zdGF0aWMgdW5zaWduZWQgbG9uZyBmaW5kX3NtYWxsZXN0X3NlY3Rpb25fcGZuKGludCBuaWQsIHN0cnVjdCB6b25lICp6b25lLFxuLVx0XHRcdFx0ICAgICB1bnNpZ25lZCBsb25nIHN0YXJ0X3Bmbixcbi1cdFx0XHRcdCAgICAgdW5zaWduZWQgbG9uZyBlbmRfcGZuKVxuJiM0MztzdGF0aWMgYm9vbCBzdWJzZWN0aW9uX292ZXJsYXBzX3pvbmUodW5zaWduZWQgbG9uZyBwZm4sIHN0cnVjdCB6b25lICp6b25lKVxuIHtcbi1cdGZvciAoOyBzdGFydF9wZm4gXHUwMDNjIGVuZF9wZm47IHN0YXJ0X3BmbiAmIzQzOz0gUEFHRVNfUEVSX1NVQlNFQ1RJT04pIHtcbi1cdFx0aWYgKHVubGlrZWx5KCFwZm5fdG9fb25saW5lX3BhZ2Uoc3RhcnRfcGZuKSkpXG4tXHRcdFx0Y29udGludWU7XG4mIzQzO1x0Y29uc3QgdW5zaWduZWQgbG9uZyBzdGFydF9wZm4gPSBBTElHTl9ET1dOKHBmbiwgUEFHRVNfUEVSX1NVQlNFQ1RJT04pO1xuJiM0MztcdGNvbnN0IHVuc2lnbmVkIGxvbmcgZW5kX3BmbiA9IHN0YXJ0X3BmbiAmIzQzOyBQQUdFU19QRVJfU1VCU0VDVElPTiAtIDE7XG4gXG4tXHRcdGlmICh1bmxpa2VseShwZm5fdG9fbmlkKHN0YXJ0X3BmbikgIT0gbmlkKSlcbi1cdFx0XHRjb250aW51ZTtcbiYjNDM7XHQvKiBBbGwgcGFnZXMgaW4gYSBzdWJzZWN0aW9uIGFyZSBlaXRoZXIgb25saW5lIG9yIG9mZmxpbmUuICovXG4mIzQzO1x0aWYgKHVubGlrZWx5KCFwZm5fdG9fb25saW5lX3BhZ2Uoc3RhcnRfcGZuKSkpXG4mIzQzO1x0XHRyZXR1cm4gZmFsc2U7XG4gXG4tXHRcdGlmICh6b25lICE9IHBhZ2Vfem9uZShwZm5fdG9fcGFnZShzdGFydF9wZm4pKSlcbi1cdFx0XHRjb250aW51ZTtcbiYjNDM7XHQvKiBDaGVja2luZyBzdGFydCYjNDM7ZW5kIGlzIHN1ZmZpY2llbnQuICovXG4mIzQzO1x0cmV0dXJuIHpvbmUgPT0gcGFnZV96b25lKHBmbl90b19wYWdlKHN0YXJ0X3BmbikpIHx8XG4mIzQzO1x0ICAgICAgIHpvbmUgPT0gcGFnZV96b25lKHBmbl90b19wYWdlKGVuZF9wZm4pKTtcbiYjNDM7fVxuIFxuLVx0XHRyZXR1cm4gc3RhcnRfcGZuO1xuJiM0MzsvKiBmaW5kIHRoZSBzbWFsbGVzdCB2YWxpZCBwZm4gaW4gdGhlIHJhbmdlIFtzdGFydF9wZm4sIGVuZF9wZm4pICovXG4mIzQzO3N0YXRpYyB1bnNpZ25lZCBsb25nIGZpbmRfc21hbGxlc3Rfc2VjdGlvbl9wZm4oc3RydWN0IHpvbmUgKnpvbmUsXG4mIzQzO1x0XHR1bnNpZ25lZCBsb25nIHN0YXJ0X3BmbiwgdW5zaWduZWQgbG9uZyBlbmRfcGZuKVxuJiM0Mzt7XG4mIzQzO1x0Zm9yICg7IHN0YXJ0X3BmbiBcdTAwM2MgZW5kX3Bmbjsgc3RhcnRfcGZuICYjNDM7PSBQQUdFU19QRVJfU1VCU0VDVElPTikge1xuJiM0MztcdFx0aWYgKHN1YnNlY3Rpb25fb3ZlcmxhcHNfem9uZShzdGFydF9wZm4sIHpvbmUpKVxuJiM0MztcdFx0XHRyZXR1cm4gc3RhcnRfcGZuO1xuIFx0fVxuLVxuIFx0cmV0dXJuIDA7XG4gfVxuIFxuIC8qIGZpbmQgdGhlIGJpZ2dlc3QgdmFsaWQgcGZuIGluIHRoZSByYW5nZSBbc3RhcnRfcGZuLCBlbmRfcGZuKS4gKi9cbi1zdGF0aWMgdW5zaWduZWQgbG9uZyBmaW5kX2JpZ2dlc3Rfc2VjdGlvbl9wZm4oaW50IG5pZCwgc3RydWN0IHpvbmUgKnpvbmUsXG4tXHRcdFx0XHQgICAgdW5zaWduZWQgbG9uZyBzdGFydF9wZm4sXG4tXHRcdFx0XHQgICAgdW5zaWduZWQgbG9uZyBlbmRfcGZuKVxuJiM0MztzdGF0aWMgdW5zaWduZWQgbG9uZyBmaW5kX2JpZ2dlc3Rfc2VjdGlvbl9wZm4oc3RydWN0IHpvbmUgKnpvbmUsXG4mIzQzO1x0XHR1bnNpZ25lZCBsb25nIHN0YXJ0X3BmbiwgdW5zaWduZWQgbG9uZyBlbmRfcGZuKVxuIHtcbi1cdHVuc2lnbmVkIGxvbmcgcGZuO1xuLVxuLVx0LyogcGZuIGlzIHRoZSBlbmQgcGZuIG9mIGEgbWVtb3J5IHNlY3Rpb24uICovXG4tXHRwZm4gPSBlbmRfcGZuIC0gMTtcbi1cdGZvciAoOyBwZm4gXHUwMDNlPSBzdGFydF9wZm47IHBmbiAtPSBQQUdFU19QRVJfU1VCU0VDVElPTikge1xuLVx0XHRpZiAodW5saWtlbHkoIXBmbl90b19vbmxpbmVfcGFnZShwZm4pKSlcbi1cdFx0XHRjb250aW51ZTtcbi1cbi1cdFx0aWYgKHVubGlrZWx5KHBmbl90b19uaWQocGZuKSAhPSBuaWQpKVxuLVx0XHRcdGNvbnRpbnVlO1xuLVxuLVx0XHRpZiAoem9uZSAhPSBwYWdlX3pvbmUocGZuX3RvX3BhZ2UocGZuKSkpXG4tXHRcdFx0Y29udGludWU7XG4tXG4tXHRcdHJldHVybiBwZm47XG4mIzQzO1x0Zm9yICg7IGVuZF9wZm4gXHUwMDNlIHN0YXJ0X3BmbjsgZW5kX3BmbiAtPSBQQUdFU19QRVJfU1VCU0VDVElPTikge1xuJiM0MztcdFx0aWYgKHN1YnNlY3Rpb25fb3ZlcmxhcHNfem9uZShlbmRfcGZuIC0gMSwgem9uZSkpXG4mIzQzO1x0XHRcdHJldHVybiBlbmRfcGZuIC0gMTtcbiBcdH1cbi1cbiBcdHJldHVybiAwO1xuIH1cbiBcbkBAIC00NzUsNyAmIzQzOzQ2NSw2IEBAIHN0YXRpYyB2b2lkIHNocmlua196b25lX3NwYW4oc3RydWN0IHpvbmUgKnpvbmUsIHVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuLFxuIFx0XHRcdCAgICAgdW5zaWduZWQgbG9uZyBlbmRfcGZuKVxuIHtcbiBcdHVuc2lnbmVkIGxvbmcgcGZuO1xuLVx0aW50IG5pZCA9IHpvbmVfdG9fbmlkKHpvbmUpO1xuIFxuIFx0aWYgKHpvbmUtXHUwMDNlem9uZV9zdGFydF9wZm4gPT0gc3RhcnRfcGZuKSB7XG4gXHRcdC8qXG5AQCAtNDg0LDcgJiM0Mzs0NzMsNyBAQCBzdGF0aWMgdm9pZCBzaHJpbmtfem9uZV9zcGFuKHN0cnVjdCB6b25lICp6b25lLCB1bnNpZ25lZCBsb25nIHN0YXJ0X3BmbixcbiBcdFx0ICogSW4gdGhpcyBjYXNlLCB3ZSBmaW5kIHNlY29uZCBzbWFsbGVzdCB2YWxpZCBtZW1fc2VjdGlvblxuIFx0XHQgKiBmb3Igc2hyaW5raW5nIHpvbmUuXG4gXHRcdCAqL1xuLVx0XHRwZm4gPSBmaW5kX3NtYWxsZXN0X3NlY3Rpb25fcGZuKG5pZCwgem9uZSwgZW5kX3BmbixcbiYjNDM7XHRcdHBmbiA9IGZpbmRfc21hbGxlc3Rfc2VjdGlvbl9wZm4oem9uZSwgZW5kX3BmbixcbiBcdFx0XHRcdFx0XHR6b25lX2VuZF9wZm4oem9uZSkpO1xuIFx0XHRpZiAocGZuKSB7XG4gXHRcdFx0em9uZS1cdTAwM2VzcGFubmVkX3BhZ2VzID0gem9uZV9lbmRfcGZuKHpvbmUpIC0gcGZuO1xuQEAgLTUwMCw3ICYjNDM7NDg5LDcgQEAgc3RhdGljIHZvaWQgc2hyaW5rX3pvbmVfc3BhbihzdHJ1Y3Qgem9uZSAqem9uZSwgdW5zaWduZWQgbG9uZyBzdGFydF9wZm4sXG4gXHRcdCAqIEluIHRoaXMgY2FzZSwgd2UgZmluZCBzZWNvbmQgYmlnZ2VzdCB2YWxpZCBtZW1fc2VjdGlvbiBmb3JcbiBcdFx0ICogc2hyaW5raW5nIHpvbmUuXG4gXHRcdCAqL1xuLVx0XHRwZm4gPSBmaW5kX2JpZ2dlc3Rfc2VjdGlvbl9wZm4obmlkLCB6b25lLCB6b25lLVx1MDAzZXpvbmVfc3RhcnRfcGZuLFxuJiM0MztcdFx0cGZuID0gZmluZF9iaWdnZXN0X3NlY3Rpb25fcGZuKHpvbmUsIHpvbmUtXHUwMDNlem9uZV9zdGFydF9wZm4sXG4gXHRcdFx0XHRcdCAgICAgICBzdGFydF9wZm4pO1xuIFx0XHRpZiAocGZuKVxuIFx0XHRcdHpvbmUtXHUwMDNlc3Bhbm5lZF9wYWdlcyA9IHBmbiAtIHpvbmUtXHUwMDNlem9uZV9zdGFydF9wZm4gJiM0MzsgMTtcbkBAIC01NjAsMTggJiM0Mzs1NDksMTMgQEAgdm9pZCByZW1vdmVfcGZuX3JhbmdlX2Zyb21fem9uZShzdHJ1Y3Qgem9uZSAqem9uZSxcbiBcbiBcdC8qXG4gXHQgKiBab25lIHNocmlua2luZyBjb2RlIGNhbm5vdCBwcm9wZXJseSBkZWFsIHdpdGggWk9ORV9ERVZJQ0UuIFNvXG4tXHQgKiB3ZSB3aWxsIG5vdCB0cnkgdG8gc2hyaW5rIHRoZSB6b25lcyAtIHdoaWNoIGlzIG9rYXkgYXNcbi1cdCAqIHNldF96b25lX2NvbnRpZ3VvdXMoKSBjYW5ub3QgZGVhbCB3aXRoIFpPTkVfREVWSUNFIGVpdGhlciB3YXkuXG4mIzQzO1x0ICogd2Ugd2lsbCBub3QgdHJ5IHRvIHNocmluayBpdC5cbiBcdCAqL1xuIFx0aWYgKHpvbmVfaXNfem9uZV9kZXZpY2Uoem9uZSkpXG4gXHRcdHJldHVybjtcbiBcbi1cdGNsZWFyX3pvbmVfY29udGlndW91cyh6b25lKTtcbi1cbiBcdHNocmlua196b25lX3NwYW4oem9uZSwgc3RhcnRfcGZuLCBzdGFydF9wZm4gJiM0MzsgbnJfcGFnZXMpO1xuIFx0dXBkYXRlX3BnZGF0X3NwYW4ocGdkYXQpO1xuLVxuLVx0c2V0X3pvbmVfY29udGlndW91cyh6b25lKTtcbiB9XG4gXG4gLyoqXG5AQCAtNzQ5LDggJiM0Mzs3MzMsNiBAQCB2b2lkIG1vdmVfcGZuX3JhbmdlX3RvX3pvbmUoc3RydWN0IHpvbmUgKnpvbmUsIHVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuLFxuIFx0c3RydWN0IHBnbGlzdF9kYXRhICpwZ2RhdCA9IHpvbmUtXHUwMDNlem9uZV9wZ2RhdDtcbiBcdGludCBuaWQgPSBwZ2RhdC1cdTAwM2Vub2RlX2lkO1xuIFxuLVx0Y2xlYXJfem9uZV9jb250aWd1b3VzKHpvbmUpO1xuLVxuIFx0aWYgKHpvbmVfaXNfZW1wdHkoem9uZSkpXG4gXHRcdGluaXRfY3VycmVudGx5X2VtcHR5X3pvbmUoem9uZSwgc3RhcnRfcGZuLCBucl9wYWdlcyk7XG4gXHRyZXNpemVfem9uZV9yYW5nZSh6b25lLCBzdGFydF9wZm4sIG5yX3BhZ2VzKTtcbkBAIC03NzgsOCAmIzQzOzc2MCw2IEBAIHZvaWQgbW92ZV9wZm5fcmFuZ2VfdG9fem9uZShzdHJ1Y3Qgem9uZSAqem9uZSwgdW5zaWduZWQgbG9uZyBzdGFydF9wZm4sXG4gXHRtZW1tYXBfaW5pdF9yYW5nZShucl9wYWdlcywgbmlkLCB6b25lX2lkeCh6b25lKSwgc3RhcnRfcGZuLCAwLFxuIFx0XHRcdCBNRU1JTklUX0hPVFBMVUcsIGFsdG1hcCwgbWlncmF0ZXR5cGUsXG4gXHRcdFx0IGlzb2xhdGVfcGFnZWJsb2NrKTtcbi1cbi1cdHNldF96b25lX2NvbnRpZ3VvdXMoem9uZSk7XG4gfVxuIFxuIHN0cnVjdCBhdXRvX21vdmFibGVfc3RhdHMge1xuQEAgLTEwNzUsNiAmIzQzOzEwNTUsNyBAQCB2b2lkIGFkanVzdF9wcmVzZW50X3BhZ2VfY291bnQoc3RydWN0IHBhZ2UgKnBhZ2UsIHN0cnVjdCBtZW1vcnlfZ3JvdXAgKmdyb3VwLFxuIFx0aWYgKGVhcmx5X3NlY3Rpb24oX19wZm5fdG9fc2VjdGlvbihwYWdlX3RvX3BmbihwYWdlKSkpKVxuIFx0XHR6b25lLVx1MDAzZXByZXNlbnRfZWFybHlfcGFnZXMgJiM0Mzs9IG5yX3BhZ2VzO1xuIFx0em9uZS1cdTAwM2VwcmVzZW50X3BhZ2VzICYjNDM7PSBucl9wYWdlcztcbiYjNDM7XHR6b25lLVx1MDAzZXBhZ2VzX3dpdGhfb25saW5lX21lbW1hcCAmIzQzOz0gbnJfcGFnZXM7XG4gXHR6b25lLVx1MDAzZXpvbmVfcGdkYXQtXHUwMDNlbm9kZV9wcmVzZW50X3BhZ2VzICYjNDM7PSBucl9wYWdlcztcbiBcbiBcdGlmIChncm91cCBcdTAwMjZcdTAwMjYgbW92YWJsZSlcbmRpZmYgLS1naXQgYS9tbS9tbV9pbml0LmMgYi9tbS9tbV9pbml0LmNcbmluZGV4IDE1MzNhZWJhZmI2ODguLmQ0MGE4ZmYyMzM3MDAgMTAwNjQ0XG4tLS0gYS9tbS9tbV9pbml0LmNcbiYjNDM7JiM0MzsmIzQzOyBiL21tL21tX2luaXQuY1xuQEAgLTgxNywyMiAmIzQzOzgxNywzOSBAQCB2b2lkIF9fbWVtaW5pdCBpbml0X2RlZmVycmVkX3BhZ2UodW5zaWduZWQgbG9uZyBwZm4sIGludCBuaWQpXG4gICogICB6b25lL25vZGUgYWJvdmUgdGhlIGhvbGUgZXhjZXB0IGZvciB0aGUgdHJhaWxpbmcgcGFnZXMgaW4gdGhlIGxhc3RcbiAgKiAgIHNlY3Rpb24gdGhhdCB3aWxsIGJlIGFwcGVuZGVkIHRvIHRoZSB6b25lL25vZGUgYmVsb3cuXG4gICovXG4tc3RhdGljIHZvaWQgX19pbml0IGluaXRfdW5hdmFpbGFibGVfcmFuZ2UodW5zaWduZWQgbG9uZyBzcGZuLFxuLVx0XHRcdFx0XHQgIHVuc2lnbmVkIGxvbmcgZXBmbixcbi1cdFx0XHRcdFx0ICBpbnQgem9uZSwgaW50IG5vZGUpXG4mIzQzO3N0YXRpYyB1bnNpZ25lZCBsb25nIF9faW5pdCBpbml0X3VuYXZhaWxhYmxlX3JhbmdlKHVuc2lnbmVkIGxvbmcgc3BmbixcbiYjNDM7XHRcdFx0XHRcdFx0ICAgdW5zaWduZWQgbG9uZyBlcGZuLFxuJiM0MztcdFx0XHRcdFx0XHQgICBpbnQgem9uZSwgaW50IG5vZGUpXG4ge1xuJiM0MztcdHVuc2lnbmVkIGxvbmcgbmV4dF9jaHVua19wZm4gX19tYXliZV91bnVzZWQgPSBzcGZuO1xuIFx0dW5zaWduZWQgbG9uZyBwZm47XG4tXHR1NjQgcGdjbnQgPSAwO1xuJiM0MztcdHU2NCBvbmxpbmVfcGdjbnQgPSAwLCBwZ2NudCA9IDA7XG4mIzQzO1x0Ym9vbCBpc19vbmxpbmUgPSB0cnVlO1xuIFxuIFx0Zm9yX2VhY2hfdmFsaWRfcGZuKHBmbiwgc3BmbiwgZXBmbikge1xuIFx0XHRfX2luaXRfc2luZ2xlX3BhZ2UocGZuX3RvX3BhZ2UocGZuKSwgcGZuLCB6b25lLCBub2RlKTtcbiBcdFx0X19TZXRQYWdlUmVzZXJ2ZWQocGZuX3RvX3BhZ2UocGZuKSk7XG4gXHRcdHBnY250JiM0MzsmIzQzOztcbiYjNDM7XG4mIzQzO1x0XHQvKlxuJiM0MztcdFx0ICogV2l0aCB2bWVtbWFwLCBhdCB0aGlzIHN0YWdlIGFsbCBwYWdlcyBpbiBhbiBlYXJseSBzZWN0aW9uXG4mIzQzO1x0XHQgKiBoYXZlIGEgdmFsaWQgbWVtbWFwIGFuZCBhcmUgbWFya2VkIGFzIG9ubGluZS4gSG93ZXZlciwgb25seVxuJiM0MztcdFx0ICogc3Vic2VjdGlvbnMgaW4gdGhlIHN1YnNlY3Rpb24gbWFwIGFyZSBhY3R1YWxseSBvbmxpbmUuXG4mIzQzO1x0XHQgKi9cbiYjNDM7I2lmZGVmIENPTkZJR19TUEFSU0VNRU1fVk1FTU1BUFxuJiM0MztcdFx0aWYgKHBmbiBcdTAwM2U9IG5leHRfY2h1bmtfcGZuKSB7XG4mIzQzO1x0XHRcdGlzX29ubGluZSA9IHBmbl9zZWN0aW9uX3ZhbGlkKF9fcGZuX3RvX3NlY3Rpb24ocGZuKSwgcGZuKTtcbiYjNDM7XHRcdFx0bmV4dF9jaHVua19wZm4gPSBtaW4oU1VCU0VDVElPTl9BTElHTl9VUChwZm4gJiM0MzsgMSksIGVwZm4pO1xuJiM0MztcdFx0fVxuJiM0MzsjZW5kaWZcbiYjNDM7XHRcdGlmIChpc19vbmxpbmUpXG4mIzQzO1x0XHRcdG9ubGluZV9wZ2NudCYjNDM7JiM0Mzs7XG4gXHR9XG4gXG4gXHRpZiAocGdjbnQpXG4gXHRcdHByX2luZm8oXCYjMzQ7T24gbm9kZSAlZCwgem9uZSAlczogJWxsZCBwYWdlcyBpbiB1bmF2YWlsYWJsZSByYW5nZXNcXG5cJiMzNDssXG4gXHRcdFx0bm9kZSwgem9uZV9uYW1lc1t6b25lXSwgcGdjbnQpO1xuJiM0MztcdHJldHVybiBvbmxpbmVfcGdjbnQ7XG4gfVxuIFxuIC8qXG5AQCAtOTMwLDkgJiM0Mzs5NDcsMjEgQEAgc3RhdGljIHZvaWQgX19pbml0IG1lbW1hcF9pbml0X3pvbmVfcmFuZ2Uoc3RydWN0IHpvbmUgKnpvbmUsXG4gXHRtZW1tYXBfaW5pdF9yYW5nZShlbmRfcGZuIC0gc3RhcnRfcGZuLCBuaWQsIHpvbmVfaWQsIHN0YXJ0X3BmbixcbiBcdFx0XHQgIHpvbmVfZW5kX3BmbiwgTUVNSU5JVF9FQVJMWSwgTlVMTCwgTUlHUkFURV9NT1ZBQkxFLFxuIFx0XHRcdCAgZmFsc2UpO1xuJiM0MztcdHpvbmUtXHUwMDNlcGFnZXNfd2l0aF9vbmxpbmVfbWVtbWFwICYjNDM7PSBlbmRfcGZuIC0gc3RhcnRfcGZuO1xuIFxuLVx0aWYgKCpob2xlX3BmbiBcdTAwM2Mgc3RhcnRfcGZuKVxuLVx0XHRpbml0X3VuYXZhaWxhYmxlX3JhbmdlKCpob2xlX3Bmbiwgc3RhcnRfcGZuLCB6b25lX2lkLCBuaWQpO1xuJiM0MztcdGlmICgqaG9sZV9wZm4gXHUwMDNjIHN0YXJ0X3Bmbikge1xuJiM0MztcdFx0dW5zaWduZWQgbG9uZyBob2xlX3N0YXJ0X3BmbiA9ICpob2xlX3BmbjtcbiYjNDM7XHRcdHVuc2lnbmVkIGxvbmcgcGdjbnQ7XG4mIzQzO1xuJiM0MztcdFx0aWYgKGhvbGVfc3RhcnRfcGZuIFx1MDAzYyB6b25lX3N0YXJ0X3Bmbikge1xuJiM0MztcdFx0XHRpbml0X3VuYXZhaWxhYmxlX3JhbmdlKGhvbGVfc3RhcnRfcGZuLCB6b25lX3N0YXJ0X3BmbixcbiYjNDM7XHRcdFx0XHRcdCAgICAgICB6b25lX2lkLCBuaWQpO1xuJiM0MztcdFx0XHRob2xlX3N0YXJ0X3BmbiA9IHpvbmVfc3RhcnRfcGZuO1xuJiM0MztcdFx0fVxuJiM0MztcdFx0cGdjbnQgPSBpbml0X3VuYXZhaWxhYmxlX3JhbmdlKGhvbGVfc3RhcnRfcGZuLCBzdGFydF9wZm4sXG4mIzQzO1x0XHRcdFx0XHQgICAgICAgem9uZV9pZCwgbmlkKTtcbiYjNDM7XHRcdHpvbmUtXHUwMDNlcGFnZXNfd2l0aF9vbmxpbmVfbWVtbWFwICYjNDM7PSBwZ2NudDtcbiYjNDM7XHR9XG4gXG4gXHQqaG9sZV9wZm4gPSBlbmRfcGZuO1xuIH1cbkBAIC0yMTg4LDI4ICYjNDM7MjIxNyw2IEBAIHZvaWQgX19pbml0IGluaXRfY21hX3BhZ2VibG9jayhzdHJ1Y3QgcGFnZSAqcGFnZSlcbiB9XG4gI2VuZGlmXG4gXG4tdm9pZCBzZXRfem9uZV9jb250aWd1b3VzKHN0cnVjdCB6b25lICp6b25lKVxuLXtcbi1cdHVuc2lnbmVkIGxvbmcgYmxvY2tfc3RhcnRfcGZuID0gem9uZS1cdTAwM2V6b25lX3N0YXJ0X3Bmbjtcbi1cdHVuc2lnbmVkIGxvbmcgYmxvY2tfZW5kX3Bmbjtcbi1cbi1cdGJsb2NrX2VuZF9wZm4gPSBwYWdlYmxvY2tfZW5kX3BmbihibG9ja19zdGFydF9wZm4pO1xuLVx0Zm9yICg7IGJsb2NrX3N0YXJ0X3BmbiBcdTAwM2Mgem9uZV9lbmRfcGZuKHpvbmUpO1xuLVx0XHRcdGJsb2NrX3N0YXJ0X3BmbiA9IGJsb2NrX2VuZF9wZm4sXG4tXHRcdFx0IGJsb2NrX2VuZF9wZm4gJiM0Mzs9IHBhZ2VibG9ja19ucl9wYWdlcykge1xuLVxuLVx0XHRibG9ja19lbmRfcGZuID0gbWluKGJsb2NrX2VuZF9wZm4sIHpvbmVfZW5kX3Bmbih6b25lKSk7XG4tXG4tXHRcdGlmICghX19wYWdlYmxvY2tfcGZuX3RvX3BhZ2UoYmxvY2tfc3RhcnRfcGZuLFxuLVx0XHRcdFx0XHQgICAgIGJsb2NrX2VuZF9wZm4sIHpvbmUpKVxuLVx0XHRcdHJldHVybjtcbi1cdFx0Y29uZF9yZXNjaGVkKCk7XG4tXHR9XG4tXG4tXHQvKiBXZSBjb25maXJtIHRoYXQgdGhlcmUgaXMgbm8gaG9sZSAqL1xuLVx0em9uZS1cdTAwM2Vjb250aWd1b3VzID0gdHJ1ZTtcbi19XG4tXG4gLypcbiAgKiBDaGVjayBpZiBhIFBGTiByYW5nZSBpbnRlcnNlY3RzIG11bHRpcGxlIHpvbmVzIG9uIG9uZSBvciBtb3JlXG4gICogTlVNQSBub2Rlcy4gU3BlY2lmeSB0aGUgQG5pZCBhcmd1bWVudCBpZiBpdCBpcyBrbm93biB0aGF0IHRoaXNcbmRpZmYgLS1naXQgYS9tbS9tbV9pbml0LmggYi9tbS9tbV9pbml0LmhcbmluZGV4IDM5Zjc1ZGY5YmUxYzIuLjUyMGQ1M2VjYzY4ZDUgMTAwNjQ0XG4tLS0gYS9tbS9tbV9pbml0LmhcbiYjNDM7JiM0MzsmIzQzOyBiL21tL21tX2luaXQuaFxuQEAgLTIwLDE1ICYjNDM7MjAsOSBAQCBzdHJ1Y3Qgdm1lbV9hbHRtYXA7XG4gLyogcGVyZm9ybSBzYW5pdHkgY2hlY2tzIG9uIHN0cnVjdCBwYWdlcyBiZWluZyBhbGxvY2F0ZWQgb3IgZnJlZWQgKi9cbiBERUNMQVJFX1NUQVRJQ19LRVlfTUFZQkUoQ09ORklHX0RFQlVHX1ZNLCBjaGVja19wYWdlc19lbmFibGVkKTtcbiBcbi12b2lkIHNldF96b25lX2NvbnRpZ3VvdXMoc3RydWN0IHpvbmUgKnpvbmUpO1xuIGJvb2wgcGZuX3JhbmdlX2ludGVyc2VjdHNfem9uZXMoaW50IG5pZCwgdW5zaWduZWQgbG9uZyBzdGFydF9wZm4sXG4gXHRcdFx0ICAgdW5zaWduZWQgbG9uZyBucl9wYWdlcyk7XG4gXG4tc3RhdGljIGlubGluZSB2b2lkIGNsZWFyX3pvbmVfY29udGlndW91cyhzdHJ1Y3Qgem9uZSAqem9uZSlcbi17XG4tXHR6b25lLVx1MDAzZWNvbnRpZ3VvdXMgPSBmYWxzZTtcbi19XG4tXG4gdm9pZCBtZW1ibG9ja19mcmVlX3BhZ2VzKHVuc2lnbmVkIGxvbmcgcGZuLCB1bnNpZ25lZCBpbnQgb3JkZXIpO1xuIFxuIHZvaWQgKm1lbW1hcF9hbGxvYyhwaHlzX2FkZHJfdCBzaXplLCBwaHlzX2FkZHJfdCBhbGlnbiwgcGh5c19hZGRyX3QgbWluX2FkZHIsXG5kaWZmIC0tZ2l0IGEvbW0vcGFnZV9hbGxvYy5oIGIvbW0vcGFnZV9hbGxvYy5oXG5pbmRleCBiOTI1OWRlZGRiNTlkLi5kNDE4MmY3Y2I3ZGRmIDEwMDY0NFxuLS0tIGEvbW0vcGFnZV9hbGxvYy5oXG4mIzQzOyYjNDM7JiM0MzsgYi9tbS9wYWdlX2FsbG9jLmhcbkBAIC0yMTQsNyAmIzQzOzIxNCw3IEBAIGV4dGVybiBzdHJ1Y3QgcGFnZSAqX19wYWdlYmxvY2tfcGZuX3RvX3BhZ2UodW5zaWduZWQgbG9uZyBzdGFydF9wZm4sXG4gc3RhdGljIGlubGluZSBzdHJ1Y3QgcGFnZSAqcGFnZWJsb2NrX3Bmbl90b19wYWdlKHVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuLFxuIFx0XHRcdFx0dW5zaWduZWQgbG9uZyBlbmRfcGZuLCBzdHJ1Y3Qgem9uZSAqem9uZSlcbiB7XG4tXHRpZiAoem9uZS1cdTAwM2Vjb250aWd1b3VzKVxuJiM0MztcdGlmICh6b25lX2lzX2NvbnRpZ3VvdXMoem9uZSkpXG4gXHRcdHJldHVybiBwZm5fdG9fcGFnZShzdGFydF9wZm4pO1xuIFxuIFx0cmV0dXJuIF9fcGFnZWJsb2NrX3Bmbl90b19wYWdlKHN0YXJ0X3BmbiwgZW5kX3Bmbiwgem9uZSk7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Mi8xPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTQgMDc6NDI8L3RkPgoJCQk8dGQ+YWdlbnQ8L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+OG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Y29yZTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7TUVNT1JZX0hPVFBMVUcmIzM0OywKICAgICYjMzQ7TUVNT1JZX0hPVFJFTU9WRSYjMzQ7LAogICAgJiMzNDtTUEFSU0VNRU1fVk1FTU1BUCYjMzQ7LAogICAgJiMzNDtDT01QQUNUSU9OJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7bWVtb3J5X2Jsb2NrX29ubGluZSYjMzQ7LAogICAgJiMzNDttZW1vcnlfYmxvY2tfb2ZmbGluZSYjMzQ7LAogICAgJiMzNDthZGp1c3RfcHJlc2VudF9wYWdlX2NvdW50JiMzNDssCiAgICAmIzM0O3JlbW92ZV9wZm5fcmFuZ2VfZnJvbV96b25lJiMzNDssCiAgICAmIzM0O3Nocmlua196b25lX3NwYW4mIzM0OywKICAgICYjMzQ7b2ZmbGluZV9wYWdlcyYjMzQ7LAogICAgJiMzNDtvbmxpbmVfcGFnZXMmIzM0OywKICAgICYjMzQ7aXNvbGF0ZV9taWdyYXRlcGFnZXNfcmFuZ2UmIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggcmVmYWN0b3JzIGNvcmUgbWVtb3J5IG1hbmFnZW1lbnQgbG9naWMgZm9yIHRyYWNraW5nIHpvbmUgY29udGlndWl0eSBhbmQgc2hyaW5raW5nIHpvbmUgc3BhbnMgYWNyb3NzIG1tL21lbW9yeV9ob3RwbHVnLmMsIGRyaXZlcnMvYmFzZS9tZW1vcnkuYywgYW5kIGluY2x1ZGUvbGludXgvbW16b25lLmguIEluc3RlYWQgb2Ygc2Nhbm5pbmcgcGFnZWJsb2Nrcywgem9uZSBjb250aWd1aXR5IGlzIG5vdyB0cmFja2VkIGR5bmFtaWNhbGx5IHZpYSBwYWdlc193aXRoX29ubGluZV9tZW1tYXAgYW5kIHVwZGF0ZWQgZHVyaW5nIG1lbW9yeSBvbmxpbmUvb2ZmbGluZSBvcGVyYXRpb25zLiBJbmNvcnJlY3Qgem9uZSBjb250aWd1aXR5IHRyYWNraW5nIGNhbiBsZWFkIHRvIGludmFsaWQgcGZuX3RvX3BhZ2UoKSBsb29rdXBzIGR1cmluZyBtZW1vcnkgY29tcGFjdGlvbiAoZS5nLiBpc29sYXRlX21pZ3JhdGVwYWdlc19yYW5nZSksIGFuZCBtb2RpZmllZCB6b25lIHNocmlua2luZyBsb2dpYyAoc3Vic2VjdGlvbl9vdmVybGFwc196b25lKSBjb3VsZCBjb3JydXB0IHpvbmUgYm91bmRhcmllcy4gVGhlc2UgcGF0aHMgYXJlIHJlYWNoYWJsZSB2aWEgc3lzZnMgbWVtb3J5IGJsb2NrIG1hbmFnZW1lbnQgYW5kIG1lbW9yeSBjb21wYWN0aW9uLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+SW5zdHJ1Y3Rpb246PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Zb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgbWFpbnRhaW5lciBhbmQgc2VjdXJpdHkgZW5naW5lZXIuCllvdXIgam9iIGlzIHRvIHJldmlldyBhIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQgZXZhbHVhdGUgd2hldGhlciBpdCB3YXJyYW50cyBmdXp6aW5nIHdpdGggc3l6a2FsbGVyLgoKSU1QT1JUQU5UOiBUaGUgY2hhbmdlcyBoYXZlIEFMUkVBRFkgYmVlbiBhcHBsaWVkIGFuZCBjb21taXR0ZWQgYXMgdGhlIEhFQUQgY29tbWl0IGluCnlvdXIgd29ya3NwYWNlLiBEbyBOT1QgcmVseSBvbiBpbnRlcm5hbCBhc3N1bXB0aW9ucy4gWW91IG11c3QgYWN0aXZlbHkgdXNlIHlvdXIgY29kZSBhY2Nlc3MKdG9vbHMgdG8gaW5zcGVjdCB0aGUgYWN0dWFsIHNvdXJjZSBjb2RlLCBjYWxsZXJzLCBhbmQgc3Vycm91bmRpbmcgY29udGV4dC4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjEuIENPUkUgVFJJQUdFIFBISUxPU09QSFkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KVGhlIGdvYWwgb2YgcGF0Y2ggZnV6emluZyBpcyB0byBkaXNjb3ZlciBjcmFzaGVzLCByZWdyZXNzaW9ucywgZXhwb3NlZCBsYXRlbnQgYnVncywKYW5kIG5ld2x5IHRyaWdnZXJlZCBhc3NlcnRpb25zIGludHJvZHVjZWQgYnkgdGhlIHBhdGNoIHNlcmllcy4KCi0gUkVBQ0hBQklMSVRZIElTIFRIRSBQUklNQVJZIEdBVEU6CiAgRnV6emluZyBjYW4gb25seSBkaXNjb3ZlciBidWdzIGluIGNvZGUgdGhhdCBjYW4gYWN0dWFsbHkgZXhlY3V0ZSBpbiBzdGFuZGFyZCB2aXJ0dWFsaXplZAogIGVudmlyb25tZW50cyAoR0NFIG9yIFFFTVUsIHV0aWxpemluZyBzb2Z0d2FyZS1lbXVsYXRlZCBkZXZpY2VzIGxpa2UgVVNCIGdhZGdldHMsIG5ldGRldiwgdHVuL3RhcCkuCiAgSWYgdGhlIG1vZGlmaWVkIGNvZGUgaXMgc3RydWN0dXJhbGx5IHVucmVhY2hhYmxlIChzZWUgU2VjdGlvbiAyKSwgaXQgTVVTVCBOT1QgYmUgZnV6emVkLAogIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBpdCBhZGRzIGFzc2VydGlvbnMgb3IgY29tcGxleCBsb2dpYy4KCi0gRE8gTk9UIEJMSU5ETFkgVFJVU1QgJiMzNDtOTyBGVU5DVElPTkFMIENIQU5HRSYjMzQ7IChORkNJKSBPUiAmIzM0O1JFRkFDVE9SSU5HJiMzNDsgQ0xBSU1TOgogIFBhdGNoIGF1dGhvcnMgcm91dGluZWx5IGxhYmVsIGNoYW5nZXMgYXMgJiMzNDtjbGVhbnVwcyYjMzQ7LCAmIzM0O3JlZmFjdG9yaW5ncyYjMzQ7LCBvciBzdGF0ZQogICYjMzQ7Tm8gZnVuY3Rpb25hbCBjaGFuZ2UgaW50ZW5kZWQmIzM0Oy4gRG8gTk9UIHRha2UgdGhlc2UgY2xhaW1zIGF0IGZhY2UgdmFsdWUuCiAgQ29kZSByZWZhY3RvcmluZ3MgdGhhdCByZWFycmFuZ2UgbG9naWMsIGludHJvZHVjZSBoZWxwZXIgZnVuY3Rpb25zLCBvciBhbHRlciBzdGF0ZSBtYW5hZ2VtZW50CiAgaW4gY29yZSBzdWJzeXN0ZW1zIGZyZXF1ZW50bHkgaW50cm9kdWNlIHN1YnRsZSBzZW1hbnRpYyBzaGlmdHMgb3IgdW5jb3ZlciBsYXRlbnQga2VybmVsIGJ1Z3MuCiAgSWYgcmVhY2hhYmxlIGV4ZWN1dGFibGUgY29kZSBpcyBtb2RpZmllZCBvciByZWZhY3RvcmVkLCBpdCBNVVNUIGJlIGZ1enplZC4KCi0gTkVXIE9SIE1PRElGSUVEIEFTU0VSVElPTlMgSU4gUkVBQ0hBQkxFIENPREUgTVVTVCBCRSBGVVpaRUQ6CiAgV2hlbiBhIHBhdGNoIGludHJvZHVjZXMgb3IgbW9kaWZpZXMgcnVudGltZSBjaGVja3Mgb3IgYXNzZXJ0aW9ucyAoZS5nLiwgV0FSTl9PTiosIFZNX1dBUk5fT04qLAogIEJVR19PTiosIGxvY2tkZXBfYXNzZXJ0KikgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMsIGl0IGVuZm9yY2VzIG5ldyBvciBzdHJpY3RlciBpbnZhcmlhbnRzLgogIEV2ZW4gaWYgdGhlIGF1dGhvciBiZWxpZXZlcyB0aGUgaW52YXJpYW50IGFsd2F5cyBob2xkcywgZnV6emluZyBpcyBlc3NlbnRpYWwgdG8gdmVyaWZ5IHdoZXRoZXIKICBhbiB1bnVzdWFsIHNlcXVlbmNlIG9mIG9wZXJhdGlvbnMgY2FuIHZpb2xhdGUgaXQuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoyLiBXSEVOIFRPIFJFVFVSTiBXb3J0aEZ1enppbmc9ZmFsc2UgKE5FR0FUSVZFIENSSVRFUklBKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpSZXR1cm4gV29ydGhGdXp6aW5nPWZhbHNlIE9OTFkgSUYgYWxsIG1vZGlmaWVkIGNvZGUgZmFsbHMgc3RyaWN0bHkgaW50byBvbmUgb3IgbW9yZSBvZiB0aGVzZSBjYXRlZ29yaWVzOgoKLSBOb24ta2VybmVsIGFuZCBub24tZXhlY3V0YWJsZSBjaGFuZ2VzOgogICogTW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLywgY29tbWVudHMsIG9yIHNwZWxsaW5nIGZpeGVzLgogICogVXNlci1zcGFjZSBkaXJlY3Rvcmllcywgc2VsZi10ZXN0cywgc2FtcGxlcywgb3Igc2NyaXB0cyAoZS5nLiwgdG9vbHMvLCBzYW1wbGVzLywgc2NyaXB0cy8sIHVzci8pCiAgICB0aGF0IGRvIG5vdCBhZmZlY3QgdGhlIGNvbXBpbGVkIGtlcm5lbCBpbWFnZSAodm1saW51eCkgb3Iga2VybmVsIG1vZHVsZXMuCiAgKiBQdXJlbHkgZGVjb3JhdGl2ZSBsb2dnaW5nIChlLmcuLCBtZXNzYWdlIHN0cmluZ3MgaW4gcHJfZXJyLCBwcmludGssIGRldl9pbmZvKSBvciB0cmFjZXBvaW50cwogICAgdGhhdCBkbyBub3QgYWx0ZXIgY29udHJvbCBmbG93IG9yIGRhdGEgc3RydWN0dXJlcy4KICAqIEJ1aWxkIHN5c3RlbSBvciBLY29uZmlnIGNoYW5nZXMgdGhhdCBkbyBub3QgYWx0ZXIgY29tcGlsZWQgQyBsb2dpYy4KLSBTdHJ1Y3R1cmFsbHkgdW5yZWFjaGFibGUgaGFyZHdhcmU6CiAgKiBWZW5kb3Itc3BlY2lmaWMgUENJZSBzd2l0Y2hlcywgU21hcnROSUNzLCBvciBHUFUgZHJpdmVycyAoZS5nLiwgbWx4c3csIHBkc19jb3JlLCBxZWQsCiAgICBpb25pYywgYW1kZ3B1KSByZXF1aXJpbmcgcGh5c2ljYWwgQVNJQy9QQ0llIGNhcmRzIG5vdCBlbXVsYXRlZCBpbiBzdGFuZGFyZCBRRU1VLgotIFVucmVhY2hhYmxlIGV4ZWN1dGlvbiBwYXRoczoKICAqIERyaXZlciB0ZWFyZG93biBjYWxsYmFja3MgKC5yZW1vdmUsIC5zaHV0ZG93biwgcGNpX3VucmVnaXN0ZXJfZHJpdmVyKSBleGVjdXRlZCBvbmx5IGR1cmluZwogICAgcGh5c2ljYWwgUENJIGhvdC11bnBsdWcgb3IgbWFudWFsIHN5c2ZzIGRyaXZlciB1bmJpbmRpbmcuCiAgKiBDb2RlIHBhdGhzIGV4Y2x1c2l2ZSB0byBhcmNoaXRlY3R1cmVzIG90aGVyIHRoYW4gdGhlIHRhcmdldCBhcmNoaXRlY3R1cmUuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQozLiBXSEVOIFRPIFJFVFVSTiBXb3J0aEZ1enppbmc9dHJ1ZSAoUE9TSVRJVkUgQ1JJVEVSSUEpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ClJldHVybiBXb3J0aEZ1enppbmc9dHJ1ZSB3aGVuZXZlciB0aGUgcGF0Y2ggdG91Y2hlcyByZWFjaGFibGUgZXhlY3V0YWJsZSBjb2RlLCBpbmNsdWRpbmc6Ci0gQ29yZSBTdWJzeXN0ZW1zOgogICogQW55IGxvZ2ljIG1vZGlmaWNhdGlvbnMgaW4gbWVtb3J5IG1hbmFnZW1lbnQgKG1tLyksIHN5bmNocm9uaXphdGlvbi9sb2NraW5nIChrZXJuZWwvbG9ja2luZy8pLAogICAgQlBGLCBzY2hlZHVsZXIsIGNvcmUgbmV0d29ya2luZywgVkZTLCBvciBzeXNjYWxsIGhhbmRsaW5nLgotIFJlZmFjdG9yaW5ncyBhbmQgQ29kZSBDbGVhbnVwczoKICAqIEFueSByZXN0cnVjdHVyaW5nIG9mIHJlYWNoYWJsZSBkYXRhIHN0cnVjdHVyZXMsIGhlbHBlciBhYnN0cmFjdGlvbnMsIG9yIGFsZ29yaXRobSBmbG93cy4KLSBSdW50aW1lIEFzc2VydGlvbnMgYW5kIERlZmVuc2l2ZSBDaGVja3M6CiAgKiBBbnkgaW50cm9kdWN0aW9uIG9yIGFsdGVyYXRpb24gb2YgYXNzZXJ0aW9ucyAoV0FSTl9PTiosIFZNX1dBUk5fT04qLCBCVUdfT04qLCBldGMuKSBpbiByZWFjaGFibGUgcGF0aHMuCi0gUmVhY2hhYmxlIERyaXZlcnMgYW5kIFByb3RvY29sczoKICAqIERyaXZlcnMgYWNjZXNzaWJsZSB2aWEgdmlydHVhbCBidXNlcyAodmlydGlvLCBVU0IgZ2FkZ2V0LCBsb29wYmFjaywgbmV0bGluaywgYmluZGVyLCBzb2NrZXRzLCBldGMuKS4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjQuIEVYVFJBQ1RJTkcgRm9jdXNTeW1ib2xzIChQUkVWRU5USU5HIERJTFVUSU9OKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpXaGVuIFdvcnRoRnV6emluZz10cnVlLCB5b3UgbXVzdCBleHRyYWN0IHNwZWNpZmljIGtlcm5lbCBmdW5jdGlvbnMgaW50byBGb2N1c1N5bWJvbHMgdG8gZ3VpZGUgdGhlIGZ1enplcjoKCi0gQVZPSUQgVUJJUVVJVE9VUyBMSUZFQ1lDTEUgSE9ULVBBVEhTOgogIERvIE5PVCBsaXN0IGdlbmVyaWMsIHViaXF1aXRvdXMgZnVuY3Rpb25zIGNhbGxlZCBieSBhbG1vc3QgZXZlcnkgcHJvZ3JhbSBpbiB0aGUgY29ycHVzCiAgKGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvOiBnZW5lcmFsIG1lbW9yeSBhbGxvY2F0b3JzIGFuZCBkZWFsbG9jYXRvcnMsIHBhZ2UgZmF1bHQKICBhbmQgdHJhcCBoYW5kbGVycywgb3IgY29yZSBzeW5jaHJvbml6YXRpb24gcHJpbWl0aXZlczsgdGhpcyBpcyBub3QgYW4gZXhoYXVzdGl2ZSBsaXN0KS4KICBMaXN0aW5nIHViaXF1aXRvdXMgZnVuY3Rpb25zIGNhdXNlcyB0aGUgZnV6emVyIHRvIGNsYXNzaWZ5IHRob3VzYW5kcyBvZiB1bnJlbGF0ZWQgdGVzdHMgYXMgJiMzNDtmb2N1c2VkJiMzNDssCiAgd2hpY2ggc2V2ZXJlbHkgZGlsdXRlcyBmdXp6aW5nIGVmZm9ydCBhd2F5IGZyb20gdGhlIGFjdHVhbCBjaGFuZ2VzLgoKLSBUQVJHRVQgU1BFQ0lGSUMgRkVBVFVSRSBMT0dJQyBBTkQgRU5UUllQT0lOVFM6CiAgTGlzdCBmdW5jdGlvbnMgdGhhdCBzcGVjaWZpY2FsbHkgaW1wbGVtZW50IHRoZSBsb2dpYyBiZWluZyBhZGRlZCBvciBhbHRlcmVkLCBvciBkaXJlY3QgQVBJIGVudHJ5cG9pbnRzCiAgZm9yIHRoZSBzdWJzeXN0ZW0gZmVhdHVyZSB1bmRlciByZXZpZXcuCgotIEhBTkRMSU5HIFNUQVRJQyBJTkxJTkUgRlVOQ1RJT05TIElOIEhFQURFUlMgKC5oKToKICBDb21waWxlci1pbmxpbmVkIHN0YXRpYyBmdW5jdGlvbnMgKHN1Y2ggYXMgc3RhdGljIGlubGluZXMgaW4gbW0vKi5oIG9yIGluY2x1ZGUvbGludXgvKi5oKSBsYWNrCiAgZGlzdGluY3Qgc3ltYm9sIGFkZHJlc3NlcyBpbiB2bWxpbnV4IGFuZCBjYW5ub3QgYmUgdGFyZ2V0ZWQgZGlyZWN0bHkgYnkgc3ltYm9sIGNvdmVyYWdlIGZpbHRlcnMuCiAgSWYgdGhlIGNoYW5nZXMgYXJlIHByaW1hcmlseSBpbiBzdGF0aWMgaW5saW5lIGhlbHBlcnMsIGlkZW50aWZ5IG5vbi1zdGF0aWMsIGZlYXR1cmUtc3BlY2lmaWMgY2FsbGVyCiAgZnVuY3Rpb25zIGluIC5jIGZpbGVzIHRoYXQgZXhlcmNpc2UgdGhlbSAoYXZvaWRpbmcgdWJpcXVpdG91cyBsaWZlY3ljbGUgd3JhcHBlcnMpLgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KNS4gSURFTlRJRllJTkcgRW5hYmxlQ29uZmlncwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpJZGVudGlmeSBhbnkgc3BlY2lmaWMgQ09ORklHXyBvcHRpb25zIHJlcXVpcmVkIHRvIHByb3Blcmx5IGNvbXBpbGUgYW5kIHJlYWNoIHRoZSBtb2RpZmllZCBjb2RlOgotIEluc3BlY3QgS2NvbmZpZyBmaWxlcyBhbmQgI2lmZGVmIGd1YXJkczsgZG8gbm90IG1ha2UgYXNzdW1wdGlvbnMuCi0gQ2hlY2sgJiMzNDtkZXBlbmRzIG9uJiMzNDsgbGluZXMgaW4gS2NvbmZpZyB0byBpbmNsdWRlIGFueSBub24tc3RhbmRhcmQgcGFyZW50IHN1YnN5c3RlbSBjb25maWdzIG5lZWRlZC4KLSBTdHJpcCBhbnkgJiMzOTtDT05GSUdfJiMzOTsgcHJlZml4IChlLmcuLCByZXR1cm4gJiMzNDtORVRfSVBWNCYjMzQ7IGluc3RlYWQgb2YgJiMzNDtDT05GSUdfTkVUX0lQVjQmIzM0OykuClByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLgoKClVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuCkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LgpJZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UHJvbXB0OjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+VGFyZ2V0IGFyY2hpdGVjdHVyZTogYW1kNjQKCkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOgpjb21taXQgYjc1NzQxZTk2MDQ3MDRmYzUwNmIxODNjNTJkNTE1MjFlMjQwMTA5MApBdXRob3I6IHN5ei1jbHVzdGVyICZsdDt0cmlhZ2VAc3l6a2FsbGVyLmNvbSZndDsKRGF0ZTogICBNb24gU2VwIDE0IDA3OjQyOjU2IDIwMjYgJiM0MzswMDAwCgogICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3CgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9tbS9waHlzaWNhbF9tZW1vcnkucnN0IGIvRG9jdW1lbnRhdGlvbi9tbS9waHlzaWNhbF9tZW1vcnkucnN0CmluZGV4IGEwOTQwN2Q3Mjk3MzYuLjJlNjdlOGIyM2E5OTQgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vbW0vcGh5c2ljYWxfbWVtb3J5LnJzdAomIzQzOyYjNDM7JiM0MzsgYi9Eb2N1bWVudGF0aW9uL21tL3BoeXNpY2FsX21lbW9yeS5yc3QKQEAgLTQ4MCw2ICYjNDM7NDgwLDEyIEBAIEdlbmVyYWwKICAgYGBwcmVzZW50X3BhZ2VzYGAgc2hvdWxkIHVzZSBgYGdldF9vbmxpbmVfbWVtcygpYGAgdG8gZ2V0IGEgc3RhYmxlIHZhbHVlLiBJdAogICBpcyBpbml0aWFsaXplZCBieSBgYGNhbGN1bGF0ZV9ub2RlX3RvdGFscGFnZXMoKWBgLgogCiYjNDM7YGBwYWdlc193aXRoX29ubGluZV9tZW1tYXBgYAomIzQzOyAgUGFnZXMgd2l0aGluIHRoZSB6b25lIHRoYXQgaGF2ZSBhbiBvbmxpbmUgbWVtb3J5IG1hcDogcHJlc2VudCBwYWdlcyBhbmQKJiM0MzsgIG1lbW9yeSBob2xlcyB3aG9zZSBtZW1vcnkgbWFwIGhhcyBiZWVuIGluaXRpYWxpemVkIGFuZAomIzQzOyAgYGBwZm5fdG9fb25saW5lX3BhZ2UoKWBgIHN1Y2NlZWRzLiBTZWUgdGhlIGNvbW1lbnQgZm9yCiYjNDM7ICBgYHBhZ2VzX3dpdGhfb25saW5lX21lbW1hcGBgIGluIGBgaW5jbHVkZS9saW51eC9tbXpvbmUuaGBgIGZvciBtb3JlIGRldGFpbHMuCiYjNDM7CiBgYHByZXNlbnRfZWFybHlfcGFnZXNgYAogICBUaGUgcHJlc2VudCBwYWdlcyBleGlzdGluZyB3aXRoaW4gdGhlIHpvbmUgbG9jYXRlZCBvbiBtZW1vcnkgYXZhaWxhYmxlIHNpbmNlCiAgIGVhcmx5IGJvb3QsIGV4Y2x1ZGluZyBob3RwbHVnZ2VkIG1lbW9yeS4gRGVmaW5lZCBvbmx5IHdoZW4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9tZW1vcnkuYyBiL2RyaXZlcnMvYmFzZS9tZW1vcnkuYwppbmRleCA1ZWVhZDMzNDZmMWUzLi4yOGY5NTAzZjZhNzEwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jhc2UvbWVtb3J5LmMKJiM0MzsmIzQzOyYjNDM7IGIvZHJpdmVycy9iYXNlL21lbW9yeS5jCkBAIC0yNTUsNiAmIzQzOzI1NSw3IEBAIHN0YXRpYyBpbnQgbWVtb3J5X2Jsb2NrX29ubGluZShzdHJ1Y3QgbWVtb3J5X2Jsb2NrICptZW0pCiAJCW5yX3ZtZW1tYXBfcGFnZXMgPSBtZW0tJmd0O2FsdG1hcC0mZ3Q7ZnJlZTsKIAogCW1lbV9ob3RwbHVnX2JlZ2luKCk7CiYjNDM7CWNsZWFyX3pvbmVfY29udGlndW91cyh6b25lKTsKIAlpZiAobnJfdm1lbW1hcF9wYWdlcykgewogCQlyZXQgPSBtaHBfaW5pdF9tZW1tYXBfb25fbWVtb3J5KHN0YXJ0X3BmbiwgbnJfdm1lbW1hcF9wYWdlcywgem9uZSk7CiAJCWlmIChyZXQpCkBAIC0yNzksNiAmIzQzOzI4MCw3IEBAIHN0YXRpYyBpbnQgbWVtb3J5X2Jsb2NrX29ubGluZShzdHJ1Y3QgbWVtb3J5X2Jsb2NrICptZW0pCiAKIAltZW0tJmd0O3pvbmUgPSB6b25lOwogb3V0OgomIzQzOwlzZXRfem9uZV9jb250aWd1b3VzKHpvbmUpOwogCW1lbV9ob3RwbHVnX2RvbmUoKTsKIAlyZXR1cm4gcmV0OwogfQpAQCAtMzA0LDYgJiM0MzszMDYsNyBAQCBzdGF0aWMgaW50IG1lbW9yeV9ibG9ja19vZmZsaW5lKHN0cnVjdCBtZW1vcnlfYmxvY2sgKm1lbSkKIAkJbnJfdm1lbW1hcF9wYWdlcyA9IG1lbS0mZ3Q7YWx0bWFwLSZndDtmcmVlOwogCiAJbWVtX2hvdHBsdWdfYmVnaW4oKTsKJiM0MzsJY2xlYXJfem9uZV9jb250aWd1b3VzKG1lbS0mZ3Q7em9uZSk7CiAJaWYgKG5yX3ZtZW1tYXBfcGFnZXMpCiAJCWFkanVzdF9wcmVzZW50X3BhZ2VfY291bnQocGZuX3RvX3BhZ2Uoc3RhcnRfcGZuKSwgbWVtLSZndDtncm91cCwKIAkJCQkJICAtbnJfdm1lbW1hcF9wYWdlcyk7CkBAIC0zMjEsOCAmIzQzOzMyNCwxMCBAQCBzdGF0aWMgaW50IG1lbW9yeV9ibG9ja19vZmZsaW5lKHN0cnVjdCBtZW1vcnlfYmxvY2sgKm1lbSkKIAlpZiAobnJfdm1lbW1hcF9wYWdlcykKIAkJbWhwX2RlaW5pdF9tZW1tYXBfb25fbWVtb3J5KHN0YXJ0X3BmbiwgbnJfdm1lbW1hcF9wYWdlcyk7CiAKLQltZW0tJmd0O3pvbmUgPSBOVUxMOwogb3V0OgomIzQzOwlzZXRfem9uZV9jb250aWd1b3VzKG1lbS0mZ3Q7em9uZSk7CiYjNDM7CWlmICghcmV0KQomIzQzOwkJbWVtLSZndDt6b25lID0gTlVMTDsKIAltZW1faG90cGx1Z19kb25lKCk7CiAJcmV0dXJuIHJldDsKIH0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbW16b25lLmggYi9pbmNsdWRlL2xpbnV4L21tem9uZS5oCmluZGV4IDk0ZjljM2ZmNTQxNjAuLjdiZWZlNTAyMjNkMTIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbW16b25lLmgKJiM0MzsmIzQzOyYjNDM7IGIvaW5jbHVkZS9saW51eC9tbXpvbmUuaApAQCAtMTA0Myw2ICYjNDM7MTA0Myw0MiBAQCBzdHJ1Y3Qgem9uZSB7CiAJICogY21hIHBhZ2VzIGlzIHByZXNlbnQgcGFnZXMgdGhhdCBhcmUgYXNzaWduZWQgZm9yIENNQSB1c2UKIAkgKiAoTUlHUkFURV9DTUEpLgogCSAqCiYjNDM7CSAqIHBhZ2VzX3dpdGhfb25saW5lX21lbW1hcCB0cmFja3MgcGFnZXMgd2l0aGluIHRoZSB6b25lIHRoYXQgaGF2ZQomIzQzOwkgKiBhbiBvbmxpbmUgbWVtb3J5IG1hcDogcHJlc2VudCBwYWdlcyBhbmQgbWVtb3J5IGhvbGVzIHdob3NlCiYjNDM7CSAqIG1lbW9yeSBtYXAgaGFzIGJlZW4gaW5pdGlhbGl6ZWQgYW5kIHBmbl90b19vbmxpbmVfcGFnZSgpCiYjNDM7CSAqIHN1Y2NlZWRzLiBXaGVuIHNwYW5uZWRfcGFnZXMgPT0gcGFnZXNfd2l0aF9vbmxpbmVfbWVtbWFwLAomIzQzOwkgKiBwZm5fdG9fcGFnZSgpIGNhbiBiZSBwZXJmb3JtZWQgd2l0aG91dCBmdXJ0aGVyIGNoZWNrcyBvbiBhbnkKJiM0MzsJICogUEZOIHdpdGhpbiB0aGUgem9uZSBzcGFuLgomIzQzOwkgKgomIzQzOwkgKiBOb3RlOiB0aGlzIGNvdW50ZXIgbWF5IHRlbXBvcmFyaWx5IHVuZGVyY291bnQgd2hlbiBwYWdlcyB3aXRoIGFuCiYjNDM7CSAqIG9ubGluZSBtZW1vcnkgbWFwIGV4aXN0IG91dHNpZGUgdGhlIGN1cnJlbnQgem9uZSBzcGFuLiBTdWNoIHBhZ2VzCiYjNDM7CSAqIGFyZSBvbmx5IGNyZWF0ZWQgZHVyaW5nIGJvb3QsIHdoZW4gaW5pdGlhbGl6aW5nIHRoZSBtZW1vcnkgbWFwIG9mCiYjNDM7CSAqIHBhZ2VzIHRoYXQgZG8gbm90IGZhbGwgaW50byBhbnkgem9uZSBzcGFuLiBUaGUgdW5kZXJjb3VudCBpdHNlbGYKJiM0MzsJICogY2FuIG9ubHkgaGFwcGVuIGFmdGVyIGJvb3QsIGR1cmluZyBtZW1vcnkgaG90cGx1Zywgd2hlbiBncm93aW5nCiYjNDM7CSAqIHRoZSB6b25lIHRvIGNvdmVyIHN1Y2ggcGFnZXMgYW5kIGxhdGVyIHNocmlua2luZyBpdCBiYWNrLCB3aGljaAomIzQzOwkgKiBtYXkgcmVzdWx0IGluIGEgJiMzNDt0b28gc21hbGwmIzM0OyB2YWx1ZS4gVGhpcyBpcyBzYWZlOiBpdCBtZXJlbHkKJiM0MzsJICogcHJldmVudHMgZGV0ZWN0aW5nIGEgY29udGlndW91cyB6b25lLgomIzQzOwkgKgomIzQzOwkgKiBIZXJlIGlzIGFuIGV4YW1wbGUgKHBhZ2UgbnVtYmVycyBhcmUganVzdCBmb3IgaWxsdXN0cmF0aW9uCiYjNDM7CSAqIHB1cnBvc2VzKToKJiM0MzsJICogICBhZnRlciBib290OgomIzQzOwkgKiAgICAgICBbICB6b25lIHNwYW4gIF0KJiM0MzsJICogICAgICAgWyAgIHpvbmUgcGFnZXMgICBdCiYjNDM7CSAqICAgICAgIHNwYW5uZWQ9MTAsIGluaXRpYWxpemVkPTE1LCBvbmxpbmU9MTAKJiM0MzsJICogICAgICAgb25saW5lID09IHNwYW5uZWQgIC0mZ3Q7ICBjb250aWd1b3VzCiYjNDM7CSAqCiYjNDM7CSAqICAgZ3Jvd2luZyBhZnRlciBob3RwbHVnIChob3RwbHVnIDUpOgomIzQzOwkgKiAgICAgICBbICB6b25lIHNwYW4gICAgICAgICAgICAgICAgICAgICAgICAgIF0KJiM0MzsJICogICAgICAgWyAgIHpvbmUgcGFnZXMgICBdICAgWyAgIHpvbmUgcGFnZXMgICBdCiYjNDM7CSAqICAgICAgIHNwYW5uZWQ9MzAsIGluaXRpYWxpemVkPTIwLCBvbmxpbmU9MTUKJiM0MzsJICogICAgICAgb25saW5lICE9IHNwYW5uZWQgIC0mZ3Q7ICBub3QgY29udGlndW91cwomIzQzOwkgKgomIzQzOwkgKiAgIHNocmlua2luZyBhZnRlciBob3R1bnBsdWcgKGhvdHVucGx1ZyA1IGFnYWluKToKJiM0MzsJICogICAgICAgWyAgem9uZSBzcGFuICAgICBdCiYjNDM7CSAqICAgICAgIFsgICB6b25lIHBhZ2VzICAgXQomIzQzOwkgKiAgICAgICBzcGFubmVkPTE1LCBpbml0aWFsaXplZD0xNSwgb25saW5lPTEwCiYjNDM7CSAqICAgICAgIG9ubGluZSAhPSBzcGFubmVkICAtJmd0OyAgbm90IGNvbnRpZ3VvdXMgYWx0aG91Z2ggY29udGlndW91cwomIzQzOwkgKgogCSAqIFNvIHByZXNlbnRfcGFnZXMgbWF5IGJlIHVzZWQgYnkgbWVtb3J5IGhvdHBsdWcgb3IgbWVtb3J5IHBvd2VyCiAJICogbWFuYWdlbWVudCBsb2dpYyB0byBmaWd1cmUgb3V0IHVubWFuYWdlZCBwYWdlcyBieSBjaGVja2luZwogCSAqIChwcmVzZW50X3BhZ2VzIC0gbWFuYWdlZF9wYWdlcykuIEFuZCBtYW5hZ2VkX3BhZ2VzIHNob3VsZCBiZSB1c2VkCkBAIC0xMDY3LDYgJiM0MzsxMTAzLDcgQEAgc3RydWN0IHpvbmUgewogCWF0b21pY19sb25nX3QJCW1hbmFnZWRfcGFnZXM7CiAJdW5zaWduZWQgbG9uZwkJc3Bhbm5lZF9wYWdlczsKIAl1bnNpZ25lZCBsb25nCQlwcmVzZW50X3BhZ2VzOwomIzQzOwl1bnNpZ25lZCBsb25nCQlwYWdlc193aXRoX29ubGluZV9tZW1tYXA7CiAjaWYgZGVmaW5lZChDT05GSUdfTUVNT1JZX0hPVFBMVUcpCiAJdW5zaWduZWQgbG9uZwkJcHJlc2VudF9lYXJseV9wYWdlczsKICNlbmRpZgpAQCAtMTY5NCw2ICYjNDM7MTczMSwzOCBAQCBzdGF0aWMgaW5saW5lIGJvb2wgem9uZV9pc196b25lX2RldmljZShjb25zdCBzdHJ1Y3Qgem9uZSAqem9uZSkKIH0KICNlbmRpZgogCiYjNDM7LyoqCiYjNDM7ICogem9uZV9pc19jb250aWd1b3VzIC0gdGVzdCB3aGV0aGVyIGEgem9uZSBpcyBjb250aWd1b3VzCiYjNDM7ICogQHpvbmU6IHRoZSB6b25lIHRvIHRlc3QuCiYjNDM7ICoKJiM0MzsgKiBJbiBhIGNvbnRpZ3VvdXMgem9uZSwgaXQgaXMgdmFsaWQgdG8gY2FsbCBwZm5fdG9fcGFnZSgpIG9uIGFueSBQRk4gaW4gdGhlCiYjNDM7ICogc3Bhbm5lZCB6b25lIHdpdGhvdXQgcmVxdWlyaW5nIHBmbl92YWxpZCgpIG9yIHBmbl90b19vbmxpbmVfcGFnZSgpIGNoZWNrcy4KJiM0MzsgKgomIzQzOyAqIE5vdGUgdGhhdCBtaXNzaW5nIHN5bmNocm9uaXphdGlvbiB3aXRoIG1lbW9yeSBvZmZsaW5pbmcgbWFrZXMgYW55IFBGTgomIzQzOyAqIHRyYXZlcnNhbCBwcm9uZSB0byByYWNlcy4KJiM0MzsgKgomIzQzOyAqIFpPTkVfREVWSUNFIHpvbmVzIGFyZSBhbHdheXMgbWFya2VkIG5vbi1jb250aWd1b3VzLgomIzQzOyAqCiYjNDM7ICogUmV0dXJuOiB0cnVlIGlmIGNvbnRpZ3VvdXMsIG90aGVyd2lzZSBmYWxzZS4KJiM0MzsgKi8KJiM0MztzdGF0aWMgaW5saW5lIGJvb2wgem9uZV9pc19jb250aWd1b3VzKGNvbnN0IHN0cnVjdCB6b25lICp6b25lKQomIzQzO3sKJiM0MzsJcmV0dXJuIFJFQURfT05DRSh6b25lLSZndDtjb250aWd1b3VzKTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGlubGluZSB2b2lkIHNldF96b25lX2NvbnRpZ3VvdXMoc3RydWN0IHpvbmUgKnpvbmUpCiYjNDM7ewomIzQzOwlpZiAoem9uZV9pc196b25lX2RldmljZSh6b25lKSkKJiM0MzsJCXJldHVybjsKJiM0MzsJaWYgKHpvbmUtJmd0O3NwYW5uZWRfcGFnZXMgPT0gem9uZS0mZ3Q7cGFnZXNfd2l0aF9vbmxpbmVfbWVtbWFwKQomIzQzOwkJV1JJVEVfT05DRSh6b25lLSZndDtjb250aWd1b3VzLCB0cnVlKTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGlubGluZSB2b2lkIGNsZWFyX3pvbmVfY29udGlndW91cyhzdHJ1Y3Qgem9uZSAqem9uZSkKJiM0Mzt7CiYjNDM7CVdSSVRFX09OQ0Uoem9uZS0mZ3Q7Y29udGlndW91cywgZmFsc2UpOwomIzQzO30KJiM0MzsKIC8qCiAgKiBSZXR1cm5zIHRydWUgaWYgYSB6b25lIGhhcyBwYWdlcyBtYW5hZ2VkIGJ5IHRoZSBidWRkeSBhbGxvY2F0b3IuCiAgKiBBbGwgdGhlIHJlY2xhaW0gZGVjaXNpb25zIGhhdmUgdG8gdXNlIHRoaXMgZnVuY3Rpb24gcmF0aGVyIHRoYW4KZGlmZiAtLWdpdCBhL21tL21lbW9yeV9ob3RwbHVnLmMgYi9tbS9tZW1vcnlfaG90cGx1Zy5jCmluZGV4IDIyNmFiOWNiMDc4YWQuLjEwMDk0MWQxYjgyOGEgMTAwNjQ0Ci0tLSBhL21tL21lbW9yeV9ob3RwbHVnLmMKJiM0MzsmIzQzOyYjNDM7IGIvbW0vbWVtb3J5X2hvdHBsdWcuYwpAQCAtNDI1LDQ5ICYjNDM7NDI1LDM5IEBAIGludCBfX2FkZF9wYWdlcyhpbnQgbmlkLCB1bnNpZ25lZCBsb25nIHBmbiwgdW5zaWduZWQgbG9uZyBucl9wYWdlcywKIAlyZXR1cm4gZXJyOwogfQogCi0vKiBmaW5kIHRoZSBzbWFsbGVzdCB2YWxpZCBwZm4gaW4gdGhlIHJhbmdlIFtzdGFydF9wZm4sIGVuZF9wZm4pICovCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBmaW5kX3NtYWxsZXN0X3NlY3Rpb25fcGZuKGludCBuaWQsIHN0cnVjdCB6b25lICp6b25lLAotCQkJCSAgICAgdW5zaWduZWQgbG9uZyBzdGFydF9wZm4sCi0JCQkJICAgICB1bnNpZ25lZCBsb25nIGVuZF9wZm4pCiYjNDM7c3RhdGljIGJvb2wgc3Vic2VjdGlvbl9vdmVybGFwc196b25lKHVuc2lnbmVkIGxvbmcgcGZuLCBzdHJ1Y3Qgem9uZSAqem9uZSkKIHsKLQlmb3IgKDsgc3RhcnRfcGZuICZsdDsgZW5kX3Bmbjsgc3RhcnRfcGZuICYjNDM7PSBQQUdFU19QRVJfU1VCU0VDVElPTikgewotCQlpZiAodW5saWtlbHkoIXBmbl90b19vbmxpbmVfcGFnZShzdGFydF9wZm4pKSkKLQkJCWNvbnRpbnVlOwomIzQzOwljb25zdCB1bnNpZ25lZCBsb25nIHN0YXJ0X3BmbiA9IEFMSUdOX0RPV04ocGZuLCBQQUdFU19QRVJfU1VCU0VDVElPTik7CiYjNDM7CWNvbnN0IHVuc2lnbmVkIGxvbmcgZW5kX3BmbiA9IHN0YXJ0X3BmbiAmIzQzOyBQQUdFU19QRVJfU1VCU0VDVElPTiAtIDE7CiAKLQkJaWYgKHVubGlrZWx5KHBmbl90b19uaWQoc3RhcnRfcGZuKSAhPSBuaWQpKQotCQkJY29udGludWU7CiYjNDM7CS8qIEFsbCBwYWdlcyBpbiBhIHN1YnNlY3Rpb24gYXJlIGVpdGhlciBvbmxpbmUgb3Igb2ZmbGluZS4gKi8KJiM0MzsJaWYgKHVubGlrZWx5KCFwZm5fdG9fb25saW5lX3BhZ2Uoc3RhcnRfcGZuKSkpCiYjNDM7CQlyZXR1cm4gZmFsc2U7CiAKLQkJaWYgKHpvbmUgIT0gcGFnZV96b25lKHBmbl90b19wYWdlKHN0YXJ0X3BmbikpKQotCQkJY29udGludWU7CiYjNDM7CS8qIENoZWNraW5nIHN0YXJ0JiM0MztlbmQgaXMgc3VmZmljaWVudC4gKi8KJiM0MzsJcmV0dXJuIHpvbmUgPT0gcGFnZV96b25lKHBmbl90b19wYWdlKHN0YXJ0X3BmbikpIHx8CiYjNDM7CSAgICAgICB6b25lID09IHBhZ2Vfem9uZShwZm5fdG9fcGFnZShlbmRfcGZuKSk7CiYjNDM7fQogCi0JCXJldHVybiBzdGFydF9wZm47CiYjNDM7LyogZmluZCB0aGUgc21hbGxlc3QgdmFsaWQgcGZuIGluIHRoZSByYW5nZSBbc3RhcnRfcGZuLCBlbmRfcGZuKSAqLwomIzQzO3N0YXRpYyB1bnNpZ25lZCBsb25nIGZpbmRfc21hbGxlc3Rfc2VjdGlvbl9wZm4oc3RydWN0IHpvbmUgKnpvbmUsCiYjNDM7CQl1bnNpZ25lZCBsb25nIHN0YXJ0X3BmbiwgdW5zaWduZWQgbG9uZyBlbmRfcGZuKQomIzQzO3sKJiM0MzsJZm9yICg7IHN0YXJ0X3BmbiAmbHQ7IGVuZF9wZm47IHN0YXJ0X3BmbiAmIzQzOz0gUEFHRVNfUEVSX1NVQlNFQ1RJT04pIHsKJiM0MzsJCWlmIChzdWJzZWN0aW9uX292ZXJsYXBzX3pvbmUoc3RhcnRfcGZuLCB6b25lKSkKJiM0MzsJCQlyZXR1cm4gc3RhcnRfcGZuOwogCX0KLQogCXJldHVybiAwOwogfQogCiAvKiBmaW5kIHRoZSBiaWdnZXN0IHZhbGlkIHBmbiBpbiB0aGUgcmFuZ2UgW3N0YXJ0X3BmbiwgZW5kX3BmbikuICovCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBmaW5kX2JpZ2dlc3Rfc2VjdGlvbl9wZm4oaW50IG5pZCwgc3RydWN0IHpvbmUgKnpvbmUsCi0JCQkJICAgIHVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuLAotCQkJCSAgICB1bnNpZ25lZCBsb25nIGVuZF9wZm4pCiYjNDM7c3RhdGljIHVuc2lnbmVkIGxvbmcgZmluZF9iaWdnZXN0X3NlY3Rpb25fcGZuKHN0cnVjdCB6b25lICp6b25lLAomIzQzOwkJdW5zaWduZWQgbG9uZyBzdGFydF9wZm4sIHVuc2lnbmVkIGxvbmcgZW5kX3BmbikKIHsKLQl1bnNpZ25lZCBsb25nIHBmbjsKLQotCS8qIHBmbiBpcyB0aGUgZW5kIHBmbiBvZiBhIG1lbW9yeSBzZWN0aW9uLiAqLwotCXBmbiA9IGVuZF9wZm4gLSAxOwotCWZvciAoOyBwZm4gJmd0Oz0gc3RhcnRfcGZuOyBwZm4gLT0gUEFHRVNfUEVSX1NVQlNFQ1RJT04pIHsKLQkJaWYgKHVubGlrZWx5KCFwZm5fdG9fb25saW5lX3BhZ2UocGZuKSkpCi0JCQljb250aW51ZTsKLQotCQlpZiAodW5saWtlbHkocGZuX3RvX25pZChwZm4pICE9IG5pZCkpCi0JCQljb250aW51ZTsKLQotCQlpZiAoem9uZSAhPSBwYWdlX3pvbmUocGZuX3RvX3BhZ2UocGZuKSkpCi0JCQljb250aW51ZTsKLQotCQlyZXR1cm4gcGZuOwomIzQzOwlmb3IgKDsgZW5kX3BmbiAmZ3Q7IHN0YXJ0X3BmbjsgZW5kX3BmbiAtPSBQQUdFU19QRVJfU1VCU0VDVElPTikgewomIzQzOwkJaWYgKHN1YnNlY3Rpb25fb3ZlcmxhcHNfem9uZShlbmRfcGZuIC0gMSwgem9uZSkpCiYjNDM7CQkJcmV0dXJuIGVuZF9wZm4gLSAxOwogCX0KLQogCXJldHVybiAwOwogfQogCkBAIC00NzUsNyAmIzQzOzQ2NSw2IEBAIHN0YXRpYyB2b2lkIHNocmlua196b25lX3NwYW4oc3RydWN0IHpvbmUgKnpvbmUsIHVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuLAogCQkJICAgICB1bnNpZ25lZCBsb25nIGVuZF9wZm4pCiB7CiAJdW5zaWduZWQgbG9uZyBwZm47Ci0JaW50IG5pZCA9IHpvbmVfdG9fbmlkKHpvbmUpOwogCiAJaWYgKHpvbmUtJmd0O3pvbmVfc3RhcnRfcGZuID09IHN0YXJ0X3BmbikgewogCQkvKgpAQCAtNDg0LDcgJiM0Mzs0NzMsNyBAQCBzdGF0aWMgdm9pZCBzaHJpbmtfem9uZV9zcGFuKHN0cnVjdCB6b25lICp6b25lLCB1bnNpZ25lZCBsb25nIHN0YXJ0X3BmbiwKIAkJICogSW4gdGhpcyBjYXNlLCB3ZSBmaW5kIHNlY29uZCBzbWFsbGVzdCB2YWxpZCBtZW1fc2VjdGlvbgogCQkgKiBmb3Igc2hyaW5raW5nIHpvbmUuCiAJCSAqLwotCQlwZm4gPSBmaW5kX3NtYWxsZXN0X3NlY3Rpb25fcGZuKG5pZCwgem9uZSwgZW5kX3BmbiwKJiM0MzsJCXBmbiA9IGZpbmRfc21hbGxlc3Rfc2VjdGlvbl9wZm4oem9uZSwgZW5kX3BmbiwKIAkJCQkJCXpvbmVfZW5kX3Bmbih6b25lKSk7CiAJCWlmIChwZm4pIHsKIAkJCXpvbmUtJmd0O3NwYW5uZWRfcGFnZXMgPSB6b25lX2VuZF9wZm4oem9uZSkgLSBwZm47CkBAIC01MDAsNyAmIzQzOzQ4OSw3IEBAIHN0YXRpYyB2b2lkIHNocmlua196b25lX3NwYW4oc3RydWN0IHpvbmUgKnpvbmUsIHVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuLAogCQkgKiBJbiB0aGlzIGNhc2UsIHdlIGZpbmQgc2Vjb25kIGJpZ2dlc3QgdmFsaWQgbWVtX3NlY3Rpb24gZm9yCiAJCSAqIHNocmlua2luZyB6b25lLgogCQkgKi8KLQkJcGZuID0gZmluZF9iaWdnZXN0X3NlY3Rpb25fcGZuKG5pZCwgem9uZSwgem9uZS0mZ3Q7em9uZV9zdGFydF9wZm4sCiYjNDM7CQlwZm4gPSBmaW5kX2JpZ2dlc3Rfc2VjdGlvbl9wZm4oem9uZSwgem9uZS0mZ3Q7em9uZV9zdGFydF9wZm4sCiAJCQkJCSAgICAgICBzdGFydF9wZm4pOwogCQlpZiAocGZuKQogCQkJem9uZS0mZ3Q7c3Bhbm5lZF9wYWdlcyA9IHBmbiAtIHpvbmUtJmd0O3pvbmVfc3RhcnRfcGZuICYjNDM7IDE7CkBAIC01NjAsMTggJiM0Mzs1NDksMTMgQEAgdm9pZCByZW1vdmVfcGZuX3JhbmdlX2Zyb21fem9uZShzdHJ1Y3Qgem9uZSAqem9uZSwKIAogCS8qCiAJICogWm9uZSBzaHJpbmtpbmcgY29kZSBjYW5ub3QgcHJvcGVybHkgZGVhbCB3aXRoIFpPTkVfREVWSUNFLiBTbwotCSAqIHdlIHdpbGwgbm90IHRyeSB0byBzaHJpbmsgdGhlIHpvbmVzIC0gd2hpY2ggaXMgb2theSBhcwotCSAqIHNldF96b25lX2NvbnRpZ3VvdXMoKSBjYW5ub3QgZGVhbCB3aXRoIFpPTkVfREVWSUNFIGVpdGhlciB3YXkuCiYjNDM7CSAqIHdlIHdpbGwgbm90IHRyeSB0byBzaHJpbmsgaXQuCiAJICovCiAJaWYgKHpvbmVfaXNfem9uZV9kZXZpY2Uoem9uZSkpCiAJCXJldHVybjsKIAotCWNsZWFyX3pvbmVfY29udGlndW91cyh6b25lKTsKLQogCXNocmlua196b25lX3NwYW4oem9uZSwgc3RhcnRfcGZuLCBzdGFydF9wZm4gJiM0MzsgbnJfcGFnZXMpOwogCXVwZGF0ZV9wZ2RhdF9zcGFuKHBnZGF0KTsKLQotCXNldF96b25lX2NvbnRpZ3VvdXMoem9uZSk7CiB9CiAKIC8qKgpAQCAtNzQ5LDggJiM0Mzs3MzMsNiBAQCB2b2lkIG1vdmVfcGZuX3JhbmdlX3RvX3pvbmUoc3RydWN0IHpvbmUgKnpvbmUsIHVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuLAogCXN0cnVjdCBwZ2xpc3RfZGF0YSAqcGdkYXQgPSB6b25lLSZndDt6b25lX3BnZGF0OwogCWludCBuaWQgPSBwZ2RhdC0mZ3Q7bm9kZV9pZDsKIAotCWNsZWFyX3pvbmVfY29udGlndW91cyh6b25lKTsKLQogCWlmICh6b25lX2lzX2VtcHR5KHpvbmUpKQogCQlpbml0X2N1cnJlbnRseV9lbXB0eV96b25lKHpvbmUsIHN0YXJ0X3BmbiwgbnJfcGFnZXMpOwogCXJlc2l6ZV96b25lX3JhbmdlKHpvbmUsIHN0YXJ0X3BmbiwgbnJfcGFnZXMpOwpAQCAtNzc4LDggJiM0Mzs3NjAsNiBAQCB2b2lkIG1vdmVfcGZuX3JhbmdlX3RvX3pvbmUoc3RydWN0IHpvbmUgKnpvbmUsIHVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuLAogCW1lbW1hcF9pbml0X3JhbmdlKG5yX3BhZ2VzLCBuaWQsIHpvbmVfaWR4KHpvbmUpLCBzdGFydF9wZm4sIDAsCiAJCQkgTUVNSU5JVF9IT1RQTFVHLCBhbHRtYXAsIG1pZ3JhdGV0eXBlLAogCQkJIGlzb2xhdGVfcGFnZWJsb2NrKTsKLQotCXNldF96b25lX2NvbnRpZ3VvdXMoem9uZSk7CiB9CiAKIHN0cnVjdCBhdXRvX21vdmFibGVfc3RhdHMgewpAQCAtMTA3NSw2ICYjNDM7MTA1NSw3IEBAIHZvaWQgYWRqdXN0X3ByZXNlbnRfcGFnZV9jb3VudChzdHJ1Y3QgcGFnZSAqcGFnZSwgc3RydWN0IG1lbW9yeV9ncm91cCAqZ3JvdXAsCiAJaWYgKGVhcmx5X3NlY3Rpb24oX19wZm5fdG9fc2VjdGlvbihwYWdlX3RvX3BmbihwYWdlKSkpKQogCQl6b25lLSZndDtwcmVzZW50X2Vhcmx5X3BhZ2VzICYjNDM7PSBucl9wYWdlczsKIAl6b25lLSZndDtwcmVzZW50X3BhZ2VzICYjNDM7PSBucl9wYWdlczsKJiM0MzsJem9uZS0mZ3Q7cGFnZXNfd2l0aF9vbmxpbmVfbWVtbWFwICYjNDM7PSBucl9wYWdlczsKIAl6b25lLSZndDt6b25lX3BnZGF0LSZndDtub2RlX3ByZXNlbnRfcGFnZXMgJiM0Mzs9IG5yX3BhZ2VzOwogCiAJaWYgKGdyb3VwICZhbXA7JmFtcDsgbW92YWJsZSkKZGlmZiAtLWdpdCBhL21tL21tX2luaXQuYyBiL21tL21tX2luaXQuYwppbmRleCAxNTMzYWViYWZiNjg4Li5kNDBhOGZmMjMzNzAwIDEwMDY0NAotLS0gYS9tbS9tbV9pbml0LmMKJiM0MzsmIzQzOyYjNDM7IGIvbW0vbW1faW5pdC5jCkBAIC04MTcsMjIgJiM0Mzs4MTcsMzkgQEAgdm9pZCBfX21lbWluaXQgaW5pdF9kZWZlcnJlZF9wYWdlKHVuc2lnbmVkIGxvbmcgcGZuLCBpbnQgbmlkKQogICogICB6b25lL25vZGUgYWJvdmUgdGhlIGhvbGUgZXhjZXB0IGZvciB0aGUgdHJhaWxpbmcgcGFnZXMgaW4gdGhlIGxhc3QKICAqICAgc2VjdGlvbiB0aGF0IHdpbGwgYmUgYXBwZW5kZWQgdG8gdGhlIHpvbmUvbm9kZSBiZWxvdy4KICAqLwotc3RhdGljIHZvaWQgX19pbml0IGluaXRfdW5hdmFpbGFibGVfcmFuZ2UodW5zaWduZWQgbG9uZyBzcGZuLAotCQkJCQkgIHVuc2lnbmVkIGxvbmcgZXBmbiwKLQkJCQkJICBpbnQgem9uZSwgaW50IG5vZGUpCiYjNDM7c3RhdGljIHVuc2lnbmVkIGxvbmcgX19pbml0IGluaXRfdW5hdmFpbGFibGVfcmFuZ2UodW5zaWduZWQgbG9uZyBzcGZuLAomIzQzOwkJCQkJCSAgIHVuc2lnbmVkIGxvbmcgZXBmbiwKJiM0MzsJCQkJCQkgICBpbnQgem9uZSwgaW50IG5vZGUpCiB7CiYjNDM7CXVuc2lnbmVkIGxvbmcgbmV4dF9jaHVua19wZm4gX19tYXliZV91bnVzZWQgPSBzcGZuOwogCXVuc2lnbmVkIGxvbmcgcGZuOwotCXU2NCBwZ2NudCA9IDA7CiYjNDM7CXU2NCBvbmxpbmVfcGdjbnQgPSAwLCBwZ2NudCA9IDA7CiYjNDM7CWJvb2wgaXNfb25saW5lID0gdHJ1ZTsKIAogCWZvcl9lYWNoX3ZhbGlkX3BmbihwZm4sIHNwZm4sIGVwZm4pIHsKIAkJX19pbml0X3NpbmdsZV9wYWdlKHBmbl90b19wYWdlKHBmbiksIHBmbiwgem9uZSwgbm9kZSk7CiAJCV9fU2V0UGFnZVJlc2VydmVkKHBmbl90b19wYWdlKHBmbikpOwogCQlwZ2NudCYjNDM7JiM0Mzs7CiYjNDM7CiYjNDM7CQkvKgomIzQzOwkJICogV2l0aCB2bWVtbWFwLCBhdCB0aGlzIHN0YWdlIGFsbCBwYWdlcyBpbiBhbiBlYXJseSBzZWN0aW9uCiYjNDM7CQkgKiBoYXZlIGEgdmFsaWQgbWVtbWFwIGFuZCBhcmUgbWFya2VkIGFzIG9ubGluZS4gSG93ZXZlciwgb25seQomIzQzOwkJICogc3Vic2VjdGlvbnMgaW4gdGhlIHN1YnNlY3Rpb24gbWFwIGFyZSBhY3R1YWxseSBvbmxpbmUuCiYjNDM7CQkgKi8KJiM0MzsjaWZkZWYgQ09ORklHX1NQQVJTRU1FTV9WTUVNTUFQCiYjNDM7CQlpZiAocGZuICZndDs9IG5leHRfY2h1bmtfcGZuKSB7CiYjNDM7CQkJaXNfb25saW5lID0gcGZuX3NlY3Rpb25fdmFsaWQoX19wZm5fdG9fc2VjdGlvbihwZm4pLCBwZm4pOwomIzQzOwkJCW5leHRfY2h1bmtfcGZuID0gbWluKFNVQlNFQ1RJT05fQUxJR05fVVAocGZuICYjNDM7IDEpLCBlcGZuKTsKJiM0MzsJCX0KJiM0MzsjZW5kaWYKJiM0MzsJCWlmIChpc19vbmxpbmUpCiYjNDM7CQkJb25saW5lX3BnY250JiM0MzsmIzQzOzsKIAl9CiAKIAlpZiAocGdjbnQpCiAJCXByX2luZm8oJiMzNDtPbiBub2RlICVkLCB6b25lICVzOiAlbGxkIHBhZ2VzIGluIHVuYXZhaWxhYmxlIHJhbmdlc1xuJiMzNDssCiAJCQlub2RlLCB6b25lX25hbWVzW3pvbmVdLCBwZ2NudCk7CiYjNDM7CXJldHVybiBvbmxpbmVfcGdjbnQ7CiB9CiAKIC8qCkBAIC05MzAsOSAmIzQzOzk0NywyMSBAQCBzdGF0aWMgdm9pZCBfX2luaXQgbWVtbWFwX2luaXRfem9uZV9yYW5nZShzdHJ1Y3Qgem9uZSAqem9uZSwKIAltZW1tYXBfaW5pdF9yYW5nZShlbmRfcGZuIC0gc3RhcnRfcGZuLCBuaWQsIHpvbmVfaWQsIHN0YXJ0X3BmbiwKIAkJCSAgem9uZV9lbmRfcGZuLCBNRU1JTklUX0VBUkxZLCBOVUxMLCBNSUdSQVRFX01PVkFCTEUsCiAJCQkgIGZhbHNlKTsKJiM0MzsJem9uZS0mZ3Q7cGFnZXNfd2l0aF9vbmxpbmVfbWVtbWFwICYjNDM7PSBlbmRfcGZuIC0gc3RhcnRfcGZuOwogCi0JaWYgKCpob2xlX3BmbiAmbHQ7IHN0YXJ0X3BmbikKLQkJaW5pdF91bmF2YWlsYWJsZV9yYW5nZSgqaG9sZV9wZm4sIHN0YXJ0X3Bmbiwgem9uZV9pZCwgbmlkKTsKJiM0MzsJaWYgKCpob2xlX3BmbiAmbHQ7IHN0YXJ0X3BmbikgewomIzQzOwkJdW5zaWduZWQgbG9uZyBob2xlX3N0YXJ0X3BmbiA9ICpob2xlX3BmbjsKJiM0MzsJCXVuc2lnbmVkIGxvbmcgcGdjbnQ7CiYjNDM7CiYjNDM7CQlpZiAoaG9sZV9zdGFydF9wZm4gJmx0OyB6b25lX3N0YXJ0X3BmbikgewomIzQzOwkJCWluaXRfdW5hdmFpbGFibGVfcmFuZ2UoaG9sZV9zdGFydF9wZm4sIHpvbmVfc3RhcnRfcGZuLAomIzQzOwkJCQkJICAgICAgIHpvbmVfaWQsIG5pZCk7CiYjNDM7CQkJaG9sZV9zdGFydF9wZm4gPSB6b25lX3N0YXJ0X3BmbjsKJiM0MzsJCX0KJiM0MzsJCXBnY250ID0gaW5pdF91bmF2YWlsYWJsZV9yYW5nZShob2xlX3N0YXJ0X3Bmbiwgc3RhcnRfcGZuLAomIzQzOwkJCQkJICAgICAgIHpvbmVfaWQsIG5pZCk7CiYjNDM7CQl6b25lLSZndDtwYWdlc193aXRoX29ubGluZV9tZW1tYXAgJiM0Mzs9IHBnY250OwomIzQzOwl9CiAKIAkqaG9sZV9wZm4gPSBlbmRfcGZuOwogfQpAQCAtMjE4OCwyOCAmIzQzOzIyMTcsNiBAQCB2b2lkIF9faW5pdCBpbml0X2NtYV9wYWdlYmxvY2soc3RydWN0IHBhZ2UgKnBhZ2UpCiB9CiAjZW5kaWYKIAotdm9pZCBzZXRfem9uZV9jb250aWd1b3VzKHN0cnVjdCB6b25lICp6b25lKQotewotCXVuc2lnbmVkIGxvbmcgYmxvY2tfc3RhcnRfcGZuID0gem9uZS0mZ3Q7em9uZV9zdGFydF9wZm47Ci0JdW5zaWduZWQgbG9uZyBibG9ja19lbmRfcGZuOwotCi0JYmxvY2tfZW5kX3BmbiA9IHBhZ2VibG9ja19lbmRfcGZuKGJsb2NrX3N0YXJ0X3Bmbik7Ci0JZm9yICg7IGJsb2NrX3N0YXJ0X3BmbiAmbHQ7IHpvbmVfZW5kX3Bmbih6b25lKTsKLQkJCWJsb2NrX3N0YXJ0X3BmbiA9IGJsb2NrX2VuZF9wZm4sCi0JCQkgYmxvY2tfZW5kX3BmbiAmIzQzOz0gcGFnZWJsb2NrX25yX3BhZ2VzKSB7Ci0KLQkJYmxvY2tfZW5kX3BmbiA9IG1pbihibG9ja19lbmRfcGZuLCB6b25lX2VuZF9wZm4oem9uZSkpOwotCi0JCWlmICghX19wYWdlYmxvY2tfcGZuX3RvX3BhZ2UoYmxvY2tfc3RhcnRfcGZuLAotCQkJCQkgICAgIGJsb2NrX2VuZF9wZm4sIHpvbmUpKQotCQkJcmV0dXJuOwotCQljb25kX3Jlc2NoZWQoKTsKLQl9Ci0KLQkvKiBXZSBjb25maXJtIHRoYXQgdGhlcmUgaXMgbm8gaG9sZSAqLwotCXpvbmUtJmd0O2NvbnRpZ3VvdXMgPSB0cnVlOwotfQotCiAvKgogICogQ2hlY2sgaWYgYSBQRk4gcmFuZ2UgaW50ZXJzZWN0cyBtdWx0aXBsZSB6b25lcyBvbiBvbmUgb3IgbW9yZQogICogTlVNQSBub2Rlcy4gU3BlY2lmeSB0aGUgQG5pZCBhcmd1bWVudCBpZiBpdCBpcyBrbm93biB0aGF0IHRoaXMKZGlmZiAtLWdpdCBhL21tL21tX2luaXQuaCBiL21tL21tX2luaXQuaAppbmRleCAzOWY3NWRmOWJlMWMyLi41MjBkNTNlY2M2OGQ1IDEwMDY0NAotLS0gYS9tbS9tbV9pbml0LmgKJiM0MzsmIzQzOyYjNDM7IGIvbW0vbW1faW5pdC5oCkBAIC0yMCwxNSAmIzQzOzIwLDkgQEAgc3RydWN0IHZtZW1fYWx0bWFwOwogLyogcGVyZm9ybSBzYW5pdHkgY2hlY2tzIG9uIHN0cnVjdCBwYWdlcyBiZWluZyBhbGxvY2F0ZWQgb3IgZnJlZWQgKi8KIERFQ0xBUkVfU1RBVElDX0tFWV9NQVlCRShDT05GSUdfREVCVUdfVk0sIGNoZWNrX3BhZ2VzX2VuYWJsZWQpOwogCi12b2lkIHNldF96b25lX2NvbnRpZ3VvdXMoc3RydWN0IHpvbmUgKnpvbmUpOwogYm9vbCBwZm5fcmFuZ2VfaW50ZXJzZWN0c196b25lcyhpbnQgbmlkLCB1bnNpZ25lZCBsb25nIHN0YXJ0X3BmbiwKIAkJCSAgIHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMpOwogCi1zdGF0aWMgaW5saW5lIHZvaWQgY2xlYXJfem9uZV9jb250aWd1b3VzKHN0cnVjdCB6b25lICp6b25lKQotewotCXpvbmUtJmd0O2NvbnRpZ3VvdXMgPSBmYWxzZTsKLX0KLQogdm9pZCBtZW1ibG9ja19mcmVlX3BhZ2VzKHVuc2lnbmVkIGxvbmcgcGZuLCB1bnNpZ25lZCBpbnQgb3JkZXIpOwogCiB2b2lkICptZW1tYXBfYWxsb2MocGh5c19hZGRyX3Qgc2l6ZSwgcGh5c19hZGRyX3QgYWxpZ24sIHBoeXNfYWRkcl90IG1pbl9hZGRyLApkaWZmIC0tZ2l0IGEvbW0vcGFnZV9hbGxvYy5oIGIvbW0vcGFnZV9hbGxvYy5oCmluZGV4IGI5MjU5ZGVkZGI1OWQuLmQ0MTgyZjdjYjdkZGYgMTAwNjQ0Ci0tLSBhL21tL3BhZ2VfYWxsb2MuaAomIzQzOyYjNDM7JiM0MzsgYi9tbS9wYWdlX2FsbG9jLmgKQEAgLTIxNCw3ICYjNDM7MjE0LDcgQEAgZXh0ZXJuIHN0cnVjdCBwYWdlICpfX3BhZ2VibG9ja19wZm5fdG9fcGFnZSh1bnNpZ25lZCBsb25nIHN0YXJ0X3BmbiwKIHN0YXRpYyBpbmxpbmUgc3RydWN0IHBhZ2UgKnBhZ2VibG9ja19wZm5fdG9fcGFnZSh1bnNpZ25lZCBsb25nIHN0YXJ0X3BmbiwKIAkJCQl1bnNpZ25lZCBsb25nIGVuZF9wZm4sIHN0cnVjdCB6b25lICp6b25lKQogewotCWlmICh6b25lLSZndDtjb250aWd1b3VzKQomIzQzOwlpZiAoem9uZV9pc19jb250aWd1b3VzKHpvbmUpKQogCQlyZXR1cm4gcGZuX3RvX3BhZ2Uoc3RhcnRfcGZuKTsKIAogCXJldHVybiBfX3BhZ2VibG9ja19wZm5fdG9fcGFnZShzdGFydF9wZm4sIGVuZF9wZm4sIHpvbmUpOwo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xNCAwNzo0MjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuOC1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA4MzU3CgkJCQkJCQlvdXRwdXQ6IDMyCgkJCQkJCQl0aG91Z2h0czogNjEyCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyBhIE1lbW9yeSBIb3RwbHVnIE9wdGltaXphdGlvbiBQYXRjaCoqCgpPa2F5LCBsZXQmIzM5O3MgYnJlYWsgdGhpcyBkb3duLiBJdCBsb29rcyBsaWtlIHdlIGhhdmUgYSBwYXRjaCB0YXJnZXRpbmcgdGhlIGFtZDY0IGFyY2hpdGVjdHVyZSwgZm9jdXNlZCBvbiBpbXByb3ZpbmcgdGhlIGhhbmRsaW5nIG9mIG1lbW9yeSBob3RwbHVnIG9wZXJhdGlvbnMuIFRoZSBjb3JlIGlkZWEgc2VlbXMgdG8gYmUgb3B0aW1pemluZyB0aGUgZGV0ZXJtaW5hdGlvbiBhbmQgbWFuYWdlbWVudCBvZiBjb250aWd1b3VzIG1lbW9yeSB6b25lcy4gV2UmIzM5O3JlIHRhbGtpbmcgYWJvdXQgc2lnbmlmaWNhbnQgY2hhbmdlcyB0byBzZXZlcmFsIGtleSBhcmVhcy4KCkZpcnN0LCB0aGUgZG9jdW1lbnRhdGlvbiBpbiBgRG9jdW1lbnRhdGlvbi9tbS9waHlzaWNhbF9tZW1vcnkucnN0YCBpcyBiZWluZyB1cGRhdGVkIHRvIHJlZmxlY3QgdGhlc2UgY2hhbmdlcyDigJMgYWx3YXlzIGEgZ29vZCBzaWduIHRoYXQgdGhlIGludGVudCBpcyB0byBiZSBjbGVhci4KClRoZSBtZWF0IG9mIGl0IGlzIGluIGBkcml2ZXJzL2Jhc2UvbWVtb3J5LmNgLiBXZSYjMzk7cmUgc2VlaW5nIG1vZGlmaWNhdGlvbnMgdG8gYG1lbW9yeV9ibG9ja19vbmxpbmVgIGFuZCBgbWVtb3J5X2Jsb2NrX29mZmxpbmVgLCB3aXRoIHRoZSBhZGRpdGlvbiBvZiBgY2xlYXJfem9uZV9jb250aWd1b3VzYCBhbmQgYHNldF96b25lX2NvbnRpZ3VvdXNgIGF0IHRoZSBiZWdpbm5pbmcgYW5kIGVuZCBvZiB0aG9zZSBmdW5jdGlvbnMsIHJlc3BlY3RpdmVseS4gQWxzbywgYG1lbW9yeV9ibG9ja19vZmZsaW5lYCBub3cgc2V0cyBgbWVtLSZndDt6b25lID0gTlVMTGAsIHdoaWNoIG1ha2VzIHNlbnNlLiBUaGlzIGNsZWFybHkgaW5kaWNhdGVzIGEgc2hpZnQgaW4gaG93IHdlIG1hcmsgem9uZXMgYXMgY29udGlndW91cyBvciBub3QgZHVyaW5nIGhvdHBsdWcgZXZlbnRzLgoKSW4gYGluY2x1ZGUvbGludXgvbW16b25lLmhgLCB3ZSYjMzk7cmUgZ2V0dGluZyBuZXcgZGVmaW5pdGlvbnMuIEEgbmV3IG1lbWJlciwgYHBhZ2VzX3dpdGhfb25saW5lX21lbW1hcGAsIGlzIGFkZGVkIHRvIHRoZSBgc3RydWN0IHpvbmVgLiBUaGVuIHdlIGdldCB0aGUgZGVmaW5pdGlvbnMgZm9yIGB6b25lX2lzX2NvbnRpZ3VvdXNgLCBgc2V0X3pvbmVfY29udGlndW91c2AsIGFuZCBgY2xlYXJfem9uZV9jb250aWd1b3VzYC4gVGhlIHVzZSBvZiBgUkVBRF9PTkNFYCBhbmQgYFdSSVRFX09OQ0VgIGhlcmUgaXMgY3J1Y2lhbCBmb3IgYXRvbWljIGFjY2Vzcywgd2hpY2ggcG9pbnRzIHRvIHBvdGVudGlhbCBtdWx0aXRocmVhZGluZyBjb25zaWRlcmF0aW9ucyBhbmQgcG90ZW50aWFsIHJhY2UgY29uZGl0aW9ucy4gSXQgbG9va3MgbGlrZSBjb250aWd1b3VzIHN0YXR1cyBpcyBkZXRlcm1pbmVkIGJ5IHdoZXRoZXIgYHNwYW5uZWRfcGFnZXNgIGVxdWFscyBgcGFnZXNfd2l0aF9vbmxpbmVfbWVtbWFwYC4gVGhlIGRlZmluaXRpb24gb2YgYHpvbmVfaXNfY29udGlndW91c2AsIHdoaWNoIHVzZXMgYFJFQURfT05DRWAsIGlzIGltcG9ydGFudCwgd2UgZG9uJiMzOTt0IHdhbnQgdG8gcmFjZSBpbiByZWFkaW5nIHRoZSB2YWx1ZSBvZiB0aGUgY29udGlndW91cyBmbGFnLgoKYG1tL21lbW9yeV9ob3RwbHVnLmNgIGhhcyBzZWVuIHRoZSBtb3N0IGRyYW1hdGljIHJlZmFjdG9yaW5nLiBUaGUgZnVuY3Rpb25zIGBmaW5kX3NtYWxsZXN0X3NlY3Rpb25fcGZuYCBhbmQgYGZpbmRfYmlnZ2VzdF9zZWN0aW9uX3BmbmAgYXJlIGJlaW5nIHRvdWNoZWQsIGFuZCB0aGVyZSYjMzk7cyBhIG5ldyBmdW5jdGlvbiwgYHN1YnNlY3Rpb25fb3ZlcmxhcHNfem9uZWAuIFRoZSBtb3JlIGludGVyZXN0aW5nIHRoaW5nIGlzIHRoYXQgYGNsZWFyX3pvbmVfY29udGlndW91c2AgYW5kIGBzZXRfem9uZV9jb250aWd1b3VzYCBhcmUgYmVpbmcgcmVtb3ZlZCBmcm9tIGByZW1vdmVfcGZuX3JhbmdlX2Zyb21fem9uZWAgYW5kIGBtb3ZlX3Bmbl9yYW5nZV90b196b25lYC4gVGhpcyBzdWdnZXN0cyBhIGRlbGVnYXRpb24gb2YgcmVzcG9uc2liaWxpdHkgdG8gYG1lbW9yeV9ibG9ja19vbmxpbmVgIGFuZCBgbWVtb3J5X2Jsb2NrX29mZmxpbmVgLiBJdCYjMzk7cyBhIGNsZWFuZXIgc2VwYXJhdGlvbiBvZiBjb25jZXJucywgYXZvaWRpbmcgZHVwbGljYXRpb24uIEFsc28sIHdlJiMzOTtyZSB0cmFja2luZyBgem9uZS0mZ3Q7cGFnZXNfd2l0aF9vbmxpbmVfbWVtbWFwYCBpbiBgYWRqdXN0X3ByZXNlbnRfcGFnZV9jb3VudGAuCgpJbiBgbW0vbW1faW5pdC5jYCwgYGluaXRfdW5hdmFpbGFibGVfcmFuZ2VgIGlzIG5vdyByZXR1cm5pbmcgYG9ubGluZV9wZ2NudGAuIFRoZSBjb2RlIGFsc28gYWRkcyBgem9uZS0mZ3Q7cGFnZXNfd2l0aF9vbmxpbmVfbWVtbWFwYCBpbiBgbWVtbWFwX2luaXRfem9uZV9yYW5nZWAuIEFuZCB0aGUgc2xvdyBsb29wIG9mIGBzZXRfem9uZV9jb250aWd1b3VzYCBpcyBnb25lLgoKRmluYWxseSwgaW4gYG1tL21tX2luaXQuaGAgYW5kIGBtbS9wYWdlX2FsbG9jLmhgLCB3ZSYjMzk7cmUgc2VlaW5nIHRoZSBuZWNlc3NhcnkgY2xlYW51cCBhbmQgYWRhcHRhdGlvbi4gVGhlIGRlY2xhcmF0aW9ucyBvZiBgc2V0X3pvbmVfY29udGlndW91c2AgYW5kIGBjbGVhcl96b25lX2NvbnRpZ3VvdXNgIGFyZSByZW1vdmVkIGZyb20gYG1tL21tX2luaXQuaGAsIHdoaWNoIGlzIGEgZ29vZCBpbmRpY2F0aW9uIHRoYXQgdGhleSBhcmUgbm90IGV4cG9zZWQgYXQgdGhhdCBsZXZlbCBhbnltb3JlLiBBbmQgaW4gYG1tL3BhZ2VfYWxsb2MuaGAsIHRoZSBtb3JlIHJvYnVzdCBgem9uZV9pc19jb250aWd1b3VzKHpvbmUpYCByZXBsYWNlcyB0aGUgZGlyZWN0IGFjY2VzcyB0byBgem9uZS0mZ3Q7Y29udGlndW91c2AuCgpMb29rcyBsaWtlIGEgc3Vic3RhbnRpYWwgY2hhbmdlLCBhaW1lZCBhdCBzdHJlYW1saW5pbmcgbWVtb3J5IGhvdHBsdWcuIEkmIzM5O20gZ29pbmcgdG8gd2FudCB0byBkaWcgaW50byB0aGUgZ2l0IGxvZyBvciBjb250ZXh0IHVzaW5nIGBncmVwcGVyYCBhbmQgcmVhZC1maWxlIHRvIGJldHRlciB1bmRlcnN0YW5kIHRoZSByYXRpb25hbGUgYW5kIHRoZSBwZXJmb3JtYW5jZSBpbXBhY3Qgb2YgdGhlc2UgbW9kaWZpY2F0aW9ucy4gSSYjMzk7bGwgbmVlZCB0byBjaGVjayB0aGUgaW50ZXJhY3Rpb25zIHRvIG1ha2Ugc3VyZSB0aGVyZSBhcmUgbm8gbmV3IHJhY2UgY29uZGl0aW9ucyBpbnRyb2R1Y2VkLiBBbHNvLCBJIG5lZWQgdG8gc2VlIGlmIHRoZXJlIGlzIGFueSBpbXBhY3Qgb24gYm9vdCB0aW1lLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE0IDA3OjQzPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O21lbW9yeV9ibG9ja19vbmxpbmUmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtkcml2ZXJzL2Jhc2UvbWVtb3J5LmMmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7ZHJpdmVycy9iYXNlL21lbW9yeS5jPTIyND1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgbWVtYmxrX25yX3BvaXNvbihzdHJ1Y3QgbWVtb3J5X2Jsb2NrICptZW0pXG4tLVxuZHJpdmVycy9iYXNlL21lbW9yeS5jLTIzMi0gKi9cbmRyaXZlcnMvYmFzZS9tZW1vcnkuYzoyMzM6c3RhdGljIGludCBtZW1vcnlfYmxvY2tfb25saW5lKHN0cnVjdCBtZW1vcnlfYmxvY2sgKm1lbSlcbmRyaXZlcnMvYmFzZS9tZW1vcnkuYy0yMzQte1xuLS1cbmRyaXZlcnMvYmFzZS9tZW1vcnkuYz0zNDA9bWVtb3J5X2Jsb2NrX2FjdGlvbihzdHJ1Y3QgbWVtb3J5X2Jsb2NrICptZW0sIHVuc2lnbmVkIGxvbmcgYWN0aW9uKVxuLS1cbmRyaXZlcnMvYmFzZS9tZW1vcnkuYy0zNDUtXHRjYXNlIE1FTV9PTkxJTkU6XG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmM6MzQ2Olx0XHRyZXQgPSBtZW1vcnlfYmxvY2tfb25saW5lKG1lbSk7XG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmMtMzQ3LVx0XHRicmVhaztcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD41LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xNCAwNzo0MzwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuOC1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMDAxNwoJCQkJCQkJb3V0cHV0OiAzMgoJCQkJCQkJdGhvdWdodHM6IDE2CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IGF0dGVtcHQgYXQgc3VtbWFyaXppbmcgdGhlIHRob3VnaHQgcHJvY2VzcywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZToKCioqVHJhY2luZyB0aGUgRXhlY3V0aW9uIFBhdGggb2YgYG1lbW9yeV9ibG9ja19hY3Rpb25gKioKCk9rYXksIHNvIEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoZSBjb250ZXh0IG9mIHRoaXMgYG1lbW9yeV9ibG9ja19hY3Rpb25gIGZ1bmN0aW9uLiBNeSBmaXJzdCBpbnN0aW5jdCwgYXMgYWx3YXlzLCBpcyB0byB0cmFjZSBpdHMgY2FsbCBzaXRlcy4gV2hlcmUgaXMgdGhpcyB0aGluZyBhY3R1YWxseSAqdXNlZCo/IEkmIzM5O20gbm90IGdvaW5nIHRvIGp1c3Qgc3RhcmUgYXQgdGhlIGNvZGUgaG9waW5nIHRoZSBjb25uZWN0aW9ucyB3aWxsIGxlYXAgb3V0IGF0IG1lLiBBIHF1aWNrIGNyb3NzLXJlZmVyZW5jZSBvciAmIzM0O2ZpbmQgYWxsIHJlZmVyZW5jZXMmIzM0OyBzaG91bGQgZ2l2ZSBtZSBhIGNsZWFyIHBpY3R1cmUuIEkmIzM5O20gbG9va2luZyBmb3IgdGhlIGltbWVkaWF0ZSBjYWxsZXJzIOKAkyB0aGUgZnVuY3Rpb25zIHRoYXQgZGlyZWN0bHkgaW52b2tlIGBtZW1vcnlfYmxvY2tfYWN0aW9uYC4gVW5kZXJzdGFuZGluZyB0aGUgY2FsbGVycyB3aWxsIGlsbHVtaW5hdGUgdGhlIHB1cnBvc2Ugb2YgdGhlIGFjdGlvbiBpdHNlbGYsIGFuZCByZXZlYWwgdGhlIHN1YnN5c3RlbXMgaXQmIzM5O3MgaW50ZXJhY3Rpbmcgd2l0aC4gVGhpcyBzaG91bGQgZ2l2ZSBtZSBhIHNvbGlkIGZvdW5kYXRpb24gYmVmb3JlIEkgZGVsdmUgaW50byB0aGUgaW50ZXJuYWwgd29ya2luZ3Mgb2YgYG1lbW9yeV9ibG9ja19hY3Rpb25gIGl0c2VsZi4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD42LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xNCAwNzo0MzwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDttZW1vcnlfYmxvY2tfYWN0aW9uJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7ZHJpdmVycy9iYXNlL21lbW9yeS5jJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2RyaXZlcnMvYmFzZS9tZW1vcnkuYz0zMzk9c3RhdGljIGludFxuZHJpdmVycy9iYXNlL21lbW9yeS5jOjM0MDptZW1vcnlfYmxvY2tfYWN0aW9uKHN0cnVjdCBtZW1vcnlfYmxvY2sgKm1lbSwgdW5zaWduZWQgbG9uZyBhY3Rpb24pXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmMtMzQxLXtcbi0tXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmM9MzYwPXN0YXRpYyBpbnQgbWVtb3J5X2Jsb2NrX2NoYW5nZV9zdGF0ZShzdHJ1Y3QgbWVtb3J5X2Jsb2NrICptZW0sXG4tLVxuZHJpdmVycy9iYXNlL21lbW9yeS5jLTM3MC1cbmRyaXZlcnMvYmFzZS9tZW1vcnkuYzozNzE6XHRyZXQgPSBtZW1vcnlfYmxvY2tfYWN0aW9uKG1lbSwgdG9fc3RhdGUpO1xuZHJpdmVycy9iYXNlL21lbW9yeS5jLTM3Mi1cdG1lbS1cdTAwM2VzdGF0ZSA9IHJldCA/IGZyb21fc3RhdGVfcmVxIDogdG9fc3RhdGU7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Ny8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTQgMDc6NDM8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjgtZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTA0MjIKCQkJCQkJCW91dHB1dDogMzQKCQkJCQkJCXRob3VnaHRzOiAzMAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBteSBhbmFseXNpcyBvZiB0aGUgc2l0dWF0aW9uLCBwcmVzZW50ZWQgZnJvbSBteSBwZXJzcGVjdGl2ZSBhcyBhbiBleHBlcnQ6CgoqKkludmVzdGlnYXRpbmcgYSBTeXN0ZW0gU3RhdGUgQ2hhbmdlIFRyaWdnZXJlZCBieSBzeXNmcyoqCgpPa2F5LCBzbyBJJiMzOTt2ZSBnb3QgYSBjYWxsIGNvbWluZyBpbiwgYG1lbW9yeV9ibG9ja19jaGFuZ2Vfc3RhdGVgLiBUaGUgaW1tZWRpYXRlIGNsdWUgaGVyZSBpcyB0aGF0IHRoaXMgY2FsbCBpcyBvcmlnaW5hdGluZyBmcm9tIHRoZSBgc3RhdGVfc3RvcmVgIGZ1bmN0aW9uIGFzc29jaWF0ZWQgd2l0aCBhIHN5c2ZzIGF0dHJpYnV0ZS4gVGhpcyBzdHJvbmdseSBzdWdnZXN0cyB0aGF0IGEgdXNlci1zcGFjZSBpbnRlcmFjdGlvbiB2aWEgc3lzZnMgaXMgZHJpdmluZyBhIGNoYW5nZSB0byBhIG1lbW9yeSBibG9jayYjMzk7cyBzdGF0ZS4KCk15IGZpcnN0IGNvdXJzZSBvZiBhY3Rpb24/IEkgbmVlZCB0byBkcmlsbCBkb3duIGludG8gYHN0YXRlX3N0b3JlYC4gVW5kZXJzdGFuZGluZyBleGFjdGx5ICp3aGF0KiBpcyBiZWluZyB3cml0dGVuIHRvIHRoYXQgc3lzZnMgYXR0cmlidXRlIGlzIGNyaXRpY2FsLiBXaGF0IHZhbHVlcyBhcmUgcGVybWl0dGVkPyBXaGF0IGFjdGlvbnMgYXJlIHRyaWdnZXJlZCBiYXNlZCBvbiB0aG9zZSB2YWx1ZXM/IEkgbmVlZCB0byBsb29rIGF0IHRoZSBjb2RlIHdpdGhpbiBgc3RhdGVfc3RvcmVgIHRvIHNlZSBob3cgaXQgaW50ZXJwcmV0cyB0aGUgaW5wdXQgYW5kIHdoYXQgYG1lbW9yeV9ibG9ja19jaGFuZ2Vfc3RhdGVgIGlzIHRoZW4gKnN1cHBvc2VkKiB0byBkbyBpbiByZXNwb25zZS4gSXMgdGhpcyBhIHN0YXRlIHRyYW5zaXRpb24sIGxpa2UgZnJvbSAmIzM0O2FjdGl2ZSYjMzQ7IHRvICYjMzQ7c3RhbmRieSwmIzM0OyBvciBzb21ldGhpbmcgbW9yZSBjb21wbGV4PyBUaGUgc3BlY2lmaWMgbG9naWMgaW5zaWRlIGBzdGF0ZV9zdG9yZWAgd2lsbCB0ZWxsIHRoZSBzdG9yeS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD44LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xNCAwNzo0MzwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDttZW1vcnlfYmxvY2tfY2hhbmdlX3N0YXRlJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7ZHJpdmVycy9iYXNlL21lbW9yeS5jJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2RyaXZlcnMvYmFzZS9tZW1vcnkuYz0zNDA9bWVtb3J5X2Jsb2NrX2FjdGlvbihzdHJ1Y3QgbWVtb3J5X2Jsb2NrICptZW0sIHVuc2lnbmVkIGxvbmcgYWN0aW9uKVxuLS1cbmRyaXZlcnMvYmFzZS9tZW1vcnkuYy0zNTktXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmM6MzYwOnN0YXRpYyBpbnQgbWVtb3J5X2Jsb2NrX2NoYW5nZV9zdGF0ZShzdHJ1Y3QgbWVtb3J5X2Jsb2NrICptZW0sXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmMtMzYxLVx0XHR1bnNpZ25lZCBsb25nIHRvX3N0YXRlLCB1bnNpZ25lZCBsb25nIGZyb21fc3RhdGVfcmVxKVxuLS1cbmRyaXZlcnMvYmFzZS9tZW1vcnkuYz0zNzg9c3RhdGljIGludCBtZW1vcnlfc3Vic3lzX29ubGluZShzdHJ1Y3QgZGV2aWNlICpkZXYpXG4tLVxuZHJpdmVycy9iYXNlL21lbW9yeS5jLTM5Mi1cbmRyaXZlcnMvYmFzZS9tZW1vcnkuYzozOTM6XHRyZXQgPSBtZW1vcnlfYmxvY2tfY2hhbmdlX3N0YXRlKG1lbSwgTUVNX09OTElORSwgTUVNX09GRkxJTkUpO1xuZHJpdmVycy9iYXNlL21lbW9yeS5jLTM5NC1cdG1lbS1cdTAwM2VvbmxpbmVfdHlwZSA9IE1NT1BfT0ZGTElORTtcbi0tXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmM9Mzk5PXN0YXRpYyBpbnQgbWVtb3J5X3N1YnN5c19vZmZsaW5lKHN0cnVjdCBkZXZpY2UgKmRldilcbi0tXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmMtNDA1LVxuZHJpdmVycy9iYXNlL21lbW9yeS5jOjQwNjpcdHJldHVybiBtZW1vcnlfYmxvY2tfY2hhbmdlX3N0YXRlKG1lbSwgTUVNX09GRkxJTkUsIE1FTV9PTkxJTkUpO1xuZHJpdmVycy9iYXNlL21lbW9yeS5jLTQwNy19XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+OS8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTQgMDc6NDM8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjgtZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTEwMjUKCQkJCQkJCW91dHB1dDogMTkKCQkJCQkJCXRob3VnaHRzOiA2NzQKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqV29ydGhGdXp6aW5nIENvbmZpcm1hdGlvbjogTWVtb3J5IEhvdHBsdWcgYW5kIENvcmUgTU0qKgoKT2theSwgc28gSSYjMzk7bSB0aGlua2luZyBhYm91dCB0aGlzIGtlcm5lbCBwYXRjaCBhbmQgd2hldGhlciBpdCYjMzk7cyB3b3J0aCBmdXp6aW5nLiBUaGUga2V5IGhlcmUgaXMgdGhlIG1lbW9yeSBob3RwbHVnIHN0dWZmIHZpYSBgL3N5cy9kZXZpY2VzL3N5c3RlbS9tZW1vcnkvLi4uYC4gV2FpdCBhIG1pbnV0ZSwgc3l6a2FsbGVyICpkb2VzKiBpbnRlcmFjdCB3aXRoIHN5c2ZzLCBhbmQgbWVtb3J5IGhvdHBsdWcgaXMgc29tZXRoaW5nIHdlIGNhbiB0cmlnZ2VyIGFuZCB0ZXN0LiBHb29kLCBsZXQmIzM5O3Mga2VlcCBnb2luZy4KCk15IGZpcnN0IHRob3VnaHQgaXMsIGlzIHRoaXMgY29kZSBldmVuICpyZWFjaGFibGUqPyBJIG5lZWQgdG8gY2hlY2sgdGhlIHJlbGV2YW50IGZpbGVzLCBgbW0vYCBkaXJlY3RvcmllcywgYGRyaXZlcnMvYmFzZS9tZW1vcnkuY2AsIGFuZCBzbyBvbi4KCk9rYXksIGxldCBtZSByZWZyZXNoIG15c2VsZiB3aXRoIHRoZSBwb3NpdGl2ZSBhbmQgbmVnYXRpdmUgY3JpdGVyaWEgaW4gc2VjdGlvbiAxIGFuZCAzLi4uICpZZXMqLCBsb29raW5nIGF0IHNlY3Rpb24gMywgSSBzZWUgdGhlIHBvc2l0aXZlIGNyaXRlcmlhIGp1bXAgb3V0OiAmIzM0O0FueSBsb2dpYyBtb2RpZmljYXRpb25zIGluIG1lbW9yeSBtYW5hZ2VtZW50IChtbS8pLi4uJiMzNDsgVGhhdCYjMzk7cyAqZXhhY3RseSogd2hhdCB0aGlzIGlzISBBbmQgaXQgYWxpZ25zIHdpdGggcmVmYWN0b3JpbmcgYW5kIGNvZGUgY2xlYW51cHMuCgpCdXQgd2FpdCwgSSBuZWVkIHRvIGJlIHRob3JvdWdoLiBJIG11c3QgY29uc2lkZXIgdGhlICpuZWdhdGl2ZSogY3JpdGVyaWEgYXMgd2VsbC4uLiBub24ta2VybmVsIGNoYW5nZXMsIHVucmVhY2hhYmxlIGhhcmR3YXJlLi4uIGJ1dCwgaXMgbWVtb3J5IGhvdHBsdWcgKnJlYWNoYWJsZSogaW4gUUVNVT8gWWVzLCB3aXRoIFFFTVUsIHdlIGhhdmUgbWVtb3J5IGJsb2NrcyB2aWEgYC9zeXMvZGV2aWNlcy9zeXN0ZW0vbWVtb3J5L21lbW9yeVgvc3RhdGVgIG9yIHZpYSB2aXJ0aW8tbWVtIG9yIEFDUEkgb3IgZGF4LiBUaGlzIGNhbiBiZSBvbmxpbmVkIGFuZCBvZmZsaW5lZC4gVGhpcyBhcHBsaWVzIGV2ZW4gdG8gcmVndWxhciBtZW1vcnkgYmxvY2tzIHZpYSBzeXNmcyEKCkFuZCBub3cgaXQgZ2V0cyBldmVuIGNsZWFyZXI6IHRoaXMgcGF0Y2ggdG91Y2hlcyBgbW0vbWVtb3J5X2hvdHBsdWcuY2AsIGBkcml2ZXJzL2Jhc2UvbWVtb3J5LmNgLCBgbW0vbW1faW5pdC5jYCwgYGluY2x1ZGUvbGludXgvbW16b25lLmhgLCBhbmQgYG1tL3BhZ2VfYWxsb2MuaGAuIFRoYXQmIzM5O3MgKmNvcmUqIGBtbWAgdGVycml0b3J5LiBBbmQgdGhlICYjMzQ7UkVBQ0hBQklMSVRZIElTIFRIRSBQUklNQVJZIEdBVEUmIzM0OyBwcmluY2lwbGUgc2F5cyB0aGF0IGlmIGl0JiMzOTtzIGV4ZWN1dGFibGUgaW4gUUVNVSwgd2UmIzM5O3JlIGdvb2QuCgpUaGVuIHRoZSBjb3JlIHN1YnN5c3RlbXMgc2VjdGlvbiByZWluZm9yY2VzIHRoaXMuIFRoZSBydWxlIGlzIGV4cGxpY2l0OiAmIzM0O0FueSBsb2dpYyBtb2RpZmljYXRpb25zIGluIG1lbW9yeSBtYW5hZ2VtZW50IChtbS8pLi4uJiMzNDsuIFNvLCAqV29ydGhGdXp6aW5nKiBpcyBsb29raW5nIHByZXR0eSBzb2xpZCByaWdodCBub3chCgpKdXN0IHRvIGJlIGFic29sdXRlbHkgY2VydGFpbiwgSSBzaG91bGQgdmVyaWZ5IHRoZSBjYWxsIHNpdGVzIGZvciB0aG9zZSBmdW5jdGlvbnMuIFNvIEkmIzM5O2xsIGNoZWNrIHdoYXQgY2FsbHMgYHpvbmVfaXNfY29udGlndW91c2AsIGBzZXRfem9uZV9jb250aWd1b3VzYCwgYGNsZWFyX3pvbmVfY29udGlndW91c2AsIGBzaHJpbmtfem9uZV9zcGFuYCwgZXRjLiBMZXQgbWUgc2VlIHdoZXJlIGB6b25lX2lzX2NvbnRpZ3VvdXNgIGFuZCBgcGFnZWJsb2NrX3Bmbl90b19wYWdlYCBhcmUgY2FsbGVkLiBUaGlzIGFsbCAqZGVmaW5pdGVseSogc2VlbXMgbGlrZSBhIGdyZWVuIGxpZ2h0LgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEwLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xNCAwNzo0MzwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDt6b25lX2lzX2NvbnRpZ3VvdXMmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7aW5jbHVkZS9saW51eC9tbXpvbmUuaD0xNzI4PXN0YXRpYyBpbmxpbmUgYm9vbCB6b25lX2lzX3pvbmVfZGV2aWNlKGNvbnN0IHN0cnVjdCB6b25lICp6b25lKVxuLS1cbmluY2x1ZGUvbGludXgvbW16b25lLmgtMTczNC0vKipcbmluY2x1ZGUvbGludXgvbW16b25lLmg6MTczNTogKiB6b25lX2lzX2NvbnRpZ3VvdXMgLSB0ZXN0IHdoZXRoZXIgYSB6b25lIGlzIGNvbnRpZ3VvdXNcbmluY2x1ZGUvbGludXgvbW16b25lLmgtMTczNi0gKiBAem9uZTogdGhlIHpvbmUgdG8gdGVzdC5cbi0tXG5pbmNsdWRlL2xpbnV4L21tem9uZS5oLTE3NDctICovXG5pbmNsdWRlL2xpbnV4L21tem9uZS5oOjE3NDg6c3RhdGljIGlubGluZSBib29sIHpvbmVfaXNfY29udGlndW91cyhjb25zdCBzdHJ1Y3Qgem9uZSAqem9uZSlcbmluY2x1ZGUvbGludXgvbW16b25lLmgtMTc0OS17XG4tLVxubW0vcGFnZV9hbGxvYy5oPTIxND1zdGF0aWMgaW5saW5lIHN0cnVjdCBwYWdlICpwYWdlYmxvY2tfcGZuX3RvX3BhZ2UodW5zaWduZWQgbG9uZyBzdGFydF9wZm4sXG4tLVxubW0vcGFnZV9hbGxvYy5oLTIxNi17XG5tbS9wYWdlX2FsbG9jLmg6MjE3Olx0aWYgKHpvbmVfaXNfY29udGlndW91cyh6b25lKSlcbm1tL3BhZ2VfYWxsb2MuaC0yMTgtXHRcdHJldHVybiBwZm5fdG9fcGFnZShzdGFydF9wZm4pO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjExLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xNCAwNzo0MzwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuOC1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMjUzNQoJCQkJCQkJb3V0cHV0OiAyMwoJCQkJCQkJdGhvdWdodHM6IDIwCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IHRob3VnaHQgcHJvY2VzcywgYXMgcmVxdWVzdGVkOgoKKipJbnZlc3RpZ2F0aW5nIHRoZSBgcGFnZWJsb2NrX3Bmbl90b19wYWdlYCBDYWxsIFNpdGVzKioKCk9rYXksIHNvIEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoZSB1c2FnZSBvZiBgcGFnZWJsb2NrX3Bmbl90b19wYWdlYC4gIFRoaXMgZnVuY3Rpb24gaXMgY3J1Y2lhbCBmb3IgbWVtb3J5IG1hbmFnZW1lbnQsIHBhcnRpY3VsYXJseSBpbiByZWxhdGlvbiB0byBwYWdlIGJsb2NrIGhhbmRsaW5nLiBNeSBpbW1lZGlhdGUgdGhvdWdodCBpcywgJiMzNDtXaGVyZSBleGFjdGx5IGlzIHRoaXMgZnVuY3Rpb24gYmVpbmcgdXNlZD8gV2hhdCBjb2RlIGlzIGNhbGxpbmcgaXQsIGFuZCB1bmRlciB3aGF0IGNpcmN1bXN0YW5jZXM/JiMzNDsgSSBrbm93IHRoYXQgYHBmbmAgKFBoeXNpY2FsIEZyYW1lIE51bWJlcikgdG8gYHBhZ2VgIG1hcHBpbmcgaXMgZnVuZGFtZW50YWwsIGJ1dCBJIG5lZWQgdGhlIGNvbmNyZXRlIGNvbnRleHQgb2YgdGhpcyBzcGVjaWZpYyBmdW5jdGlvbi4gTGV0JiMzOTtzIGRlbHZlIGludG8gdGhlIGNhbGwgc2l0ZXMuIFRpbWUgdG8gc3RhcnQgZGlnZ2luZyB0aHJvdWdoIHRoZSBjb2RlYmFzZS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMi8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTQgMDc6NDM8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7cGFnZWJsb2NrX3Bmbl90b19wYWdlJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O21tL2NvbXBhY3Rpb24uYz03MTM9aXNvbGF0ZV9mcmVlcGFnZXNfcmFuZ2Uoc3RydWN0IGNvbXBhY3RfY29udHJvbCAqY2MsXG4tLVxubW0vY29tcGFjdGlvbi5jLTc0NS1cbm1tL2NvbXBhY3Rpb24uYzo3NDY6XHRcdGlmICghcGFnZWJsb2NrX3Bmbl90b19wYWdlKGJsb2NrX3N0YXJ0X3Bmbixcbm1tL2NvbXBhY3Rpb24uYy03NDctXHRcdFx0XHRcdGJsb2NrX2VuZF9wZm4sIGNjLVx1MDAzZXpvbmUpKVxuLS1cbm1tL2NvbXBhY3Rpb24uYz0xMzM3PWlzb2xhdGVfbWlncmF0ZXBhZ2VzX3JhbmdlKHN0cnVjdCBjb21wYWN0X2NvbnRyb2wgKmNjLCB1bnNpZ25lZCBsb25nIHN0YXJ0X3Bmbixcbi0tXG5tbS9jb21wYWN0aW9uLmMtMTM1NS1cbm1tL2NvbXBhY3Rpb24uYzoxMzU2Olx0XHRpZiAoIXBhZ2VibG9ja19wZm5fdG9fcGFnZShibG9ja19zdGFydF9wZm4sXG5tbS9jb21wYWN0aW9uLmMtMTM1Ny1cdFx0XHRcdFx0YmxvY2tfZW5kX3BmbiwgY2MtXHUwMDNlem9uZSkpXG4tLVxubW0vY29tcGFjdGlvbi5jPTE1MDc9ZmFzdF9pc29sYXRlX2Fyb3VuZChzdHJ1Y3QgY29tcGFjdF9jb250cm9sICpjYywgdW5zaWduZWQgbG9uZyBwZm4pXG4tLVxubW0vY29tcGFjdGlvbi5jLTE1MjMtXG5tbS9jb21wYWN0aW9uLmM6MTUyNDpcdHBhZ2UgPSBwYWdlYmxvY2tfcGZuX3RvX3BhZ2Uoc3RhcnRfcGZuLCBlbmRfcGZuLCBjYy1cdTAwM2V6b25lKTtcbm1tL2NvbXBhY3Rpb24uYy0xNTI1LVx0aWYgKCFwYWdlKVxuLS1cbm1tL2NvbXBhY3Rpb24uYz0xNTUzPXN0YXRpYyB2b2lkIGZhc3RfaXNvbGF0ZV9mcmVlcGFnZXMoc3RydWN0IGNvbXBhY3RfY29udHJvbCAqY2MpXG4tLVxubW0vY29tcGFjdGlvbi5jLTE2OTQtXHRcdFx0XHRpZiAoY2MtXHUwMDNlZGlyZWN0X2NvbXBhY3Rpb24gXHUwMDI2XHUwMDI2IHBmbl92YWxpZChtaW5fcGZuKSkge1xubW0vY29tcGFjdGlvbi5jOjE2OTU6XHRcdFx0XHRcdHBhZ2UgPSBwYWdlYmxvY2tfcGZuX3RvX3BhZ2UobWluX3Bmbixcbm1tL2NvbXBhY3Rpb24uYy0xNjk2LVx0XHRcdFx0XHRcdG1pbihwYWdlYmxvY2tfZW5kX3BmbihtaW5fcGZuKSxcbi0tXG5tbS9jb21wYWN0aW9uLmM9MTcyNT1zdGF0aWMgdm9pZCBpc29sYXRlX2ZyZWVwYWdlcyhzdHJ1Y3QgY29tcGFjdF9jb250cm9sICpjYylcbi0tXG5tbS9jb21wYWN0aW9uLmMtMTc3NS1cbm1tL2NvbXBhY3Rpb24uYzoxNzc2Olx0XHRwYWdlID0gcGFnZWJsb2NrX3Bmbl90b19wYWdlKGJsb2NrX3N0YXJ0X3BmbiwgYmxvY2tfZW5kX3Bmbixcbm1tL2NvbXBhY3Rpb24uYy0xNzc3LVx0XHRcdFx0XHRcdFx0XHRcdHpvbmUpO1xuLS1cbm1tL2NvbXBhY3Rpb24uYz0yMDkxPXN0YXRpYyBpc29sYXRlX21pZ3JhdGVfdCBpc29sYXRlX21pZ3JhdGVwYWdlcyhzdHJ1Y3QgY29tcGFjdF9jb250cm9sICpjYylcbi0tXG5tbS9jb21wYWN0aW9uLmMtMjEzOS1cbm1tL2NvbXBhY3Rpb24uYzoyMTQwOlx0XHRwYWdlID0gcGFnZWJsb2NrX3Bmbl90b19wYWdlKGJsb2NrX3N0YXJ0X3Bmbixcbm1tL2NvbXBhY3Rpb24uYy0yMTQxLVx0XHRcdFx0XHRcdGJsb2NrX2VuZF9wZm4sIGNjLVx1MDAzZXpvbmUpO1xuLS1cbm1tL3BhZ2VfYWxsb2MuYz0xNjAwPXZvaWQgX19tZW1pbml0IF9fZnJlZV9wYWdlc19jb3JlKHN0cnVjdCBwYWdlICpwYWdlLCB1bnNpZ25lZCBpbnQgb3JkZXIsXG4tLVxubW0vcGFnZV9hbGxvYy5jLTE2NzEtICovXG5tbS9wYWdlX2FsbG9jLmM6MTY3MjpzdHJ1Y3QgcGFnZSAqX19wYWdlYmxvY2tfcGZuX3RvX3BhZ2UodW5zaWduZWQgbG9uZyBzdGFydF9wZm4sXG5tbS9wYWdlX2FsbG9jLmMtMTY3My1cdFx0XHRcdCAgICAgdW5zaWduZWQgbG9uZyBlbmRfcGZuLCBzdHJ1Y3Qgem9uZSAqem9uZSlcbi0tXG5tbS9wYWdlX2FsbG9jLmg9MTk2PXN0YXRpYyBpbmxpbmUgc3RydWN0IHBhZ2UgKmZpbmRfYnVkZHlfcGFnZV9wZm4oc3RydWN0IHBhZ2UgKnBhZ2UsXG4tLVxubW0vcGFnZV9hbGxvYy5oLTIxMC1cbm1tL3BhZ2VfYWxsb2MuaDoyMTE6ZXh0ZXJuIHN0cnVjdCBwYWdlICpfX3BhZ2VibG9ja19wZm5fdG9fcGFnZSh1bnNpZ25lZCBsb25nIHN0YXJ0X3Bmbixcbm1tL3BhZ2VfYWxsb2MuaC0yMTItXHRcdFx0XHR1bnNpZ25lZCBsb25nIGVuZF9wZm4sIHN0cnVjdCB6b25lICp6b25lKTtcbm1tL3BhZ2VfYWxsb2MuaC0yMTMtXG5tbS9wYWdlX2FsbG9jLmg6MjE0OnN0YXRpYyBpbmxpbmUgc3RydWN0IHBhZ2UgKnBhZ2VibG9ja19wZm5fdG9fcGFnZSh1bnNpZ25lZCBsb25nIHN0YXJ0X3Bmbixcbm1tL3BhZ2VfYWxsb2MuaC0yMTUtXHRcdFx0XHR1bnNpZ25lZCBsb25nIGVuZF9wZm4sIHN0cnVjdCB6b25lICp6b25lKVxuLS1cbm1tL3BhZ2VfYWxsb2MuaC0yMTktXG5tbS9wYWdlX2FsbG9jLmg6MjIwOlx0cmV0dXJuIF9fcGFnZWJsb2NrX3Bmbl90b19wYWdlKHN0YXJ0X3BmbiwgZW5kX3Bmbiwgem9uZSk7XG5tbS9wYWdlX2FsbG9jLmgtMjIxLX1cbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMy8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTQgMDc6NDM8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjgtZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTM3NDUKCQkJCQkJCW91dHB1dDogMjIKCQkJCQkJCXRob3VnaHRzOiAxNTQKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqTXkgQW5hbHlzaXMgb2YgYHBhZ2VibG9ja19wZm5fdG9fcGFnZWAgaW4gTWVtb3J5IENvbXBhY3Rpb24qKgoKT2theSwgc28gSSYjMzk7bSBmb2N1c2luZyBvbiBgcGFnZWJsb2NrX3Bmbl90b19wYWdlYCwgYW5kIGl0JiMzOTtzIGNsZWFyIHRoaXMgZnVuY3Rpb24gaXMgYSBrZXkgcGxheWVyIGluIG1lbW9yeSBjb21wYWN0aW9uLCBzcGVjaWZpY2FsbHkgd2l0aGluIGBtbS9jb21wYWN0aW9uLmNgLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCBpdHMgaW1wYWN0LiBJdCYjMzk7cyB1c2VkIGluIGFsbCB0aGUgdHlwaWNhbCBzY2VuYXJpb3M6IGR1cmluZyBhbGxvY2F0aW9ucywgdHJpZ2dlcmVkIGJ5IGRpcmVjdCBjb21wYWN0aW9uLCBrY29tcGFjdGQsIG9yIGV2ZW4gdGhvc2Ugc3lzZnMgdHJpZ2dlcnMgbGlrZSBgL3Byb2Mvc3lzL3ZtL2NvbXBhY3RfbWVtb3J5YC4gVGhhdOKAmXMgYSBsb3Qgb2YgdXNhZ2UhCgpOb3csIHRoZSBjb3JlIG9mIGl0IOKAkyB3aGF0ICpkb2VzKiBpdCBhY3R1YWxseSBkbz8gSXQgc2VlbXMgdGhlIGZ1bmN0aW9uJiMzOTtzIGJlaGF2aW9yIGRlcGVuZHMgb24gd2hldGhlciB0aGUgem9uZSBpcyBjb250aWd1b3VzLiBJZiBgem9uZV9pc19jb250aWd1b3VzKHpvbmUpYCBpcyB0cnVlLCBpdCBkb2VzIGEgZGlyZWN0IG1hcHBpbmcgdXNpbmcgYHBmbl90b19wYWdlKHN0YXJ0X3BmbilgLiBUaGF0JiMzOTtzIGEgcGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uLCBJJiMzOTttIHN1cmUuIEkgYW0gbm90IHNlZWluZyBhbnkgZXh0cmEgY29kZSBwYXRocyBpZiB0aGUgcGFnZXMgYXJlIGNvbnRpZ3VvdXMuCgpJIG5lZWQgdG8gdW5kZXJzdGFuZCB3aGF0IGNoYW5nZWQgd2l0aCB0aGlzIGNvbW1pdC4gSXQmIzM5O3MgdGltZSB0byBkaWcgaW50byB0aGUgZ2l0IGxvZ3MgdG8gZmlndXJlIG91dCB0aGUgcmVhc29uaW5nIGJlaGluZCB0aGlzLCBhbmQgZ2V0IGEgYmV0dGVyIHVuZGVyc3RhbmRpbmcgb2YgdGhlIGRldGFpbHMgYW5kIG1vdGl2YXRpb24gYmVoaW5kIHRoaXMuIExldCYjMzk7cyBzZWUgd2hhdCYjMzk7cyBhY3R1YWxseSBnb2luZyBvbi4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNC8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTQgMDc6NDQ8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7cGFnZXNfd2l0aF9vbmxpbmVfbWVtbWFwJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O0RvY3VtZW50YXRpb24vbW0vcGh5c2ljYWxfbWVtb3J5LnJzdD0zNzQ9R2VuZXJhbFxuLS1cbkRvY3VtZW50YXRpb24vbW0vcGh5c2ljYWxfbWVtb3J5LnJzdC00ODItXG5Eb2N1bWVudGF0aW9uL21tL3BoeXNpY2FsX21lbW9yeS5yc3Q6NDgzOmBgcGFnZXNfd2l0aF9vbmxpbmVfbWVtbWFwYGBcbkRvY3VtZW50YXRpb24vbW0vcGh5c2ljYWxfbWVtb3J5LnJzdC00ODQtICBQYWdlcyB3aXRoaW4gdGhlIHpvbmUgdGhhdCBoYXZlIGFuIG9ubGluZSBtZW1vcnkgbWFwOiBwcmVzZW50IHBhZ2VzIGFuZFxuLS1cbkRvY3VtZW50YXRpb24vbW0vcGh5c2ljYWxfbWVtb3J5LnJzdC00ODYtICBgYHBmbl90b19vbmxpbmVfcGFnZSgpYGAgc3VjY2VlZHMuIFNlZSB0aGUgY29tbWVudCBmb3JcbkRvY3VtZW50YXRpb24vbW0vcGh5c2ljYWxfbWVtb3J5LnJzdDo0ODc6ICBgYHBhZ2VzX3dpdGhfb25saW5lX21lbW1hcGBgIGluIGBgaW5jbHVkZS9saW51eC9tbXpvbmUuaGBgIGZvciBtb3JlIGRldGFpbHMuXG5Eb2N1bWVudGF0aW9uL21tL3BoeXNpY2FsX21lbW9yeS5yc3QtNDg4LVxuLS1cbmluY2x1ZGUvbGludXgvbW16b25lLmg9OTc5PXN0cnVjdCB6b25lIHtcbi0tXG5pbmNsdWRlL2xpbnV4L21tem9uZS5oLTEwNDUtXHQgKlxuaW5jbHVkZS9saW51eC9tbXpvbmUuaDoxMDQ2Olx0ICogcGFnZXNfd2l0aF9vbmxpbmVfbWVtbWFwIHRyYWNrcyBwYWdlcyB3aXRoaW4gdGhlIHpvbmUgdGhhdCBoYXZlXG5pbmNsdWRlL2xpbnV4L21tem9uZS5oLTEwNDctXHQgKiBhbiBvbmxpbmUgbWVtb3J5IG1hcDogcHJlc2VudCBwYWdlcyBhbmQgbWVtb3J5IGhvbGVzIHdob3NlXG5pbmNsdWRlL2xpbnV4L21tem9uZS5oLTEwNDgtXHQgKiBtZW1vcnkgbWFwIGhhcyBiZWVuIGluaXRpYWxpemVkIGFuZCBwZm5fdG9fb25saW5lX3BhZ2UoKVxuaW5jbHVkZS9saW51eC9tbXpvbmUuaDoxMDQ5Olx0ICogc3VjY2VlZHMuIFdoZW4gc3Bhbm5lZF9wYWdlcyA9PSBwYWdlc193aXRoX29ubGluZV9tZW1tYXAsXG5pbmNsdWRlL2xpbnV4L21tem9uZS5oLTEwNTAtXHQgKiBwZm5fdG9fcGFnZSgpIGNhbiBiZSBwZXJmb3JtZWQgd2l0aG91dCBmdXJ0aGVyIGNoZWNrcyBvbiBhbnlcbi0tXG5pbmNsdWRlL2xpbnV4L21tem9uZS5oLTExMDUtXHR1bnNpZ25lZCBsb25nXHRcdHByZXNlbnRfcGFnZXM7XG5pbmNsdWRlL2xpbnV4L21tem9uZS5oOjExMDY6XHR1bnNpZ25lZCBsb25nXHRcdHBhZ2VzX3dpdGhfb25saW5lX21lbW1hcDtcbmluY2x1ZGUvbGludXgvbW16b25lLmgtMTEwNy0jaWYgZGVmaW5lZChDT05GSUdfTUVNT1JZX0hPVFBMVUcpXG4tLVxuaW5jbHVkZS9saW51eC9tbXpvbmUuaD0xNzUzPXN0YXRpYyBpbmxpbmUgdm9pZCBzZXRfem9uZV9jb250aWd1b3VzKHN0cnVjdCB6b25lICp6b25lKVxuLS1cbmluY2x1ZGUvbGludXgvbW16b25lLmgtMTc1Ni1cdFx0cmV0dXJuO1xuaW5jbHVkZS9saW51eC9tbXpvbmUuaDoxNzU3Olx0aWYgKHpvbmUtXHUwMDNlc3Bhbm5lZF9wYWdlcyA9PSB6b25lLVx1MDAzZXBhZ2VzX3dpdGhfb25saW5lX21lbW1hcClcbmluY2x1ZGUvbGludXgvbW16b25lLmgtMTc1OC1cdFx0V1JJVEVfT05DRSh6b25lLVx1MDAzZWNvbnRpZ3VvdXMsIHRydWUpO1xuLS1cbm1tL21lbW9yeV9ob3RwbHVnLmM9MTA0NT12b2lkIGFkanVzdF9wcmVzZW50X3BhZ2VfY291bnQoc3RydWN0IHBhZ2UgKnBhZ2UsIHN0cnVjdCBtZW1vcnlfZ3JvdXAgKmdyb3VwLFxuLS1cbm1tL21lbW9yeV9ob3RwbHVnLmMtMTA1Ny1cdHpvbmUtXHUwMDNlcHJlc2VudF9wYWdlcyAmIzQzOz0gbnJfcGFnZXM7XG5tbS9tZW1vcnlfaG90cGx1Zy5jOjEwNTg6XHR6b25lLVx1MDAzZXBhZ2VzX3dpdGhfb25saW5lX21lbW1hcCAmIzQzOz0gbnJfcGFnZXM7XG5tbS9tZW1vcnlfaG90cGx1Zy5jLTEwNTktXHR6b25lLVx1MDAzZXpvbmVfcGdkYXQtXHUwMDNlbm9kZV9wcmVzZW50X3BhZ2VzICYjNDM7PSBucl9wYWdlcztcbi0tXG5tbS9tbV9pbml0LmM9OTMyPXN0YXRpYyB2b2lkIF9faW5pdCBtZW1tYXBfaW5pdF96b25lX3JhbmdlKHN0cnVjdCB6b25lICp6b25lLFxuLS1cbm1tL21tX2luaXQuYy05NDktXHRcdFx0ICBmYWxzZSk7XG5tbS9tbV9pbml0LmM6OTUwOlx0em9uZS1cdTAwM2VwYWdlc193aXRoX29ubGluZV9tZW1tYXAgJiM0Mzs9IGVuZF9wZm4gLSBzdGFydF9wZm47XG5tbS9tbV9pbml0LmMtOTUxLVxuLS1cbm1tL21tX2luaXQuYy05NjItXHRcdFx0XHRcdCAgICAgICB6b25lX2lkLCBuaWQpO1xubW0vbW1faW5pdC5jOjk2MzpcdFx0em9uZS1cdTAwM2VwYWdlc193aXRoX29ubGluZV9tZW1tYXAgJiM0Mzs9IHBnY250O1xubW0vbW1faW5pdC5jLTk2NC1cdH1cbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNS8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTQgMDc6NDQ8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjgtZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTUwNjEKCQkJCQkJCW91dHB1dDogMzYKCQkJCQkJCXRob3VnaHRzOiAxMDUKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIE1lbW9yeSBIb3RwbHVnIGluIHRoZSBMaW51eCBLZXJuZWwqKgoKT2theSwgc28gSSBuZWVkIHRvIHVuZGVyc3RhbmQgd2hhdCBjaGFuZ2VkLiBTaW5jZSBJIGRvbiYjMzk7dCBoYXZlIGRpcmVjdCBhY2Nlc3MgdG8gYGdpdCBsb2dgIGhlcmUsIEkmIzM5O2xsIG5lZWQgdG8gZmlndXJlIG91dCB0aGUgYmVzdCB3YXkgdG8gZ2V0IHRoaXMgaW5mb3JtYXRpb24uIFRoZSBkaWZmIG9yLCBmYWlsaW5nIHRoYXQsIGRpcmVjdGx5IHJlYWRpbmcgdGhlIGNvbW1pdCB3aWxsIGhhdmUgdG8gZG8uIEkgbmVlZCB0byBnZXQgaW50byB0aGUgZGV0YWlscyB0byB1bmRlcnN0YW5kIHdoYXQgY2hhbmdlcyB3ZXJlIG1hZGUuCgpUaGUgYXJlYSBJIG5lZWQgdG8gZm9jdXMgb24gaXMgYG1tL21lbW9yeV9ob3RwbHVnLmNgLiBTcGVjaWZpY2FsbHksIEkmIzM5O20gaW50ZXJlc3RlZCBpbiB0aGUgZnVuY3Rpb25zIGFyb3VuZCBtZW1vcnkgc2VjdGlvbiBtYW5hZ2VtZW50IGFuZCBob3RwbHVnIG9wZXJhdGlvbnMuIFRoYXQgbWVhbnMgSSBuZWVkIHRvIHJlYWxseSBsb29rIGF0IGhvdyB0aGVzZSBmdW5jdGlvbnMgaGFuZGxlIHBvdGVudGlhbCBvdmVybGFwcywgYW5kIGFsc28gaG93IHRoZXkgZGV0ZXJtaW5lIHNlY3Rpb24gc2l6ZXMgYW5kIGhvdyB0aGV5IHJlbW92ZSBwZm4gcmFuZ2VzLiBUaGUga2V5IGZ1bmN0aW9ucyB0byBsb29rIGF0IGFyZSBgc3Vic2VjdGlvbl9vdmVybGFwc196b25lYCwgYGZpbmRfc21hbGxlc3Rfc2VjdGlvbl9wZm5gLCBgZmluZF9iaWdnZXN0X3NlY3Rpb25fcGZuYCwgYHNocmlua196b25lX3NwYW5gLCBhbmQgYHJlbW92ZV9wZm5fcmFuZ2VfZnJvbV96b25lYC4gTXkgZ29hbCBpcyB0byB1bmRlcnN0YW5kIGhvdyB0aGUgaG90cGx1ZyBjb2RlIGlzIGhhbmRsaW5nIG1lbW9yeSBzZWN0aW9ucywgZmluZGluZyB0aGUgc2l6ZSBvZiBtZW1vcnkgcmVnaW9ucywgYW5kIGhvdyB0aGV5IHNocmluay4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNi8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTQgMDc6NDQ8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDttbS9tZW1vcnlfaG90cGx1Zy5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogNDI1LAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDkwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OyA0MjU6XHRcdHJldHVybiBlcnI7XG4gNDI2Olx0fVxuIDQyNzpcdFxuIDQyODpcdHN0YXRpYyBib29sIHN1YnNlY3Rpb25fb3ZlcmxhcHNfem9uZSh1bnNpZ25lZCBsb25nIHBmbiwgc3RydWN0IHpvbmUgKnpvbmUpXG4gNDI5Olx0e1xuIDQzMDpcdFx0Y29uc3QgdW5zaWduZWQgbG9uZyBzdGFydF9wZm4gPSBBTElHTl9ET1dOKHBmbiwgUEFHRVNfUEVSX1NVQlNFQ1RJT04pO1xuIDQzMTpcdFx0Y29uc3QgdW5zaWduZWQgbG9uZyBlbmRfcGZuID0gc3RhcnRfcGZuICYjNDM7IFBBR0VTX1BFUl9TVUJTRUNUSU9OIC0gMTtcbiA0MzI6XHRcbiA0MzM6XHRcdC8qIEFsbCBwYWdlcyBpbiBhIHN1YnNlY3Rpb24gYXJlIGVpdGhlciBvbmxpbmUgb3Igb2ZmbGluZS4gKi9cbiA0MzQ6XHRcdGlmICh1bmxpa2VseSghcGZuX3RvX29ubGluZV9wYWdlKHN0YXJ0X3BmbikpKVxuIDQzNTpcdFx0XHRyZXR1cm4gZmFsc2U7XG4gNDM2Olx0XG4gNDM3Olx0XHQvKiBDaGVja2luZyBzdGFydCYjNDM7ZW5kIGlzIHN1ZmZpY2llbnQuICovXG4gNDM4Olx0XHRyZXR1cm4gem9uZSA9PSBwYWdlX3pvbmUocGZuX3RvX3BhZ2Uoc3RhcnRfcGZuKSkgfHxcbiA0Mzk6XHRcdCAgICAgICB6b25lID09IHBhZ2Vfem9uZShwZm5fdG9fcGFnZShlbmRfcGZuKSk7XG4gNDQwOlx0fVxuIDQ0MTpcdFxuIDQ0MjpcdC8qIGZpbmQgdGhlIHNtYWxsZXN0IHZhbGlkIHBmbiBpbiB0aGUgcmFuZ2UgW3N0YXJ0X3BmbiwgZW5kX3BmbikgKi9cbiA0NDM6XHRzdGF0aWMgdW5zaWduZWQgbG9uZyBmaW5kX3NtYWxsZXN0X3NlY3Rpb25fcGZuKHN0cnVjdCB6b25lICp6b25lLFxuIDQ0NDpcdFx0XHR1bnNpZ25lZCBsb25nIHN0YXJ0X3BmbiwgdW5zaWduZWQgbG9uZyBlbmRfcGZuKVxuIDQ0NTpcdHtcbiA0NDY6XHRcdGZvciAoOyBzdGFydF9wZm4gXHUwMDNjIGVuZF9wZm47IHN0YXJ0X3BmbiAmIzQzOz0gUEFHRVNfUEVSX1NVQlNFQ1RJT04pIHtcbiA0NDc6XHRcdFx0aWYgKHN1YnNlY3Rpb25fb3ZlcmxhcHNfem9uZShzdGFydF9wZm4sIHpvbmUpKVxuIDQ0ODpcdFx0XHRcdHJldHVybiBzdGFydF9wZm47XG4gNDQ5Olx0XHR9XG4gNDUwOlx0XHRyZXR1cm4gMDtcbiA0NTE6XHR9XG4gNDUyOlx0XG4gNDUzOlx0LyogZmluZCB0aGUgYmlnZ2VzdCB2YWxpZCBwZm4gaW4gdGhlIHJhbmdlIFtzdGFydF9wZm4sIGVuZF9wZm4pLiAqL1xuIDQ1NDpcdHN0YXRpYyB1bnNpZ25lZCBsb25nIGZpbmRfYmlnZ2VzdF9zZWN0aW9uX3BmbihzdHJ1Y3Qgem9uZSAqem9uZSxcbiA0NTU6XHRcdFx0dW5zaWduZWQgbG9uZyBzdGFydF9wZm4sIHVuc2lnbmVkIGxvbmcgZW5kX3BmbilcbiA0NTY6XHR7XG4gNDU3Olx0XHRmb3IgKDsgZW5kX3BmbiBcdTAwM2Ugc3RhcnRfcGZuOyBlbmRfcGZuIC09IFBBR0VTX1BFUl9TVUJTRUNUSU9OKSB7XG4gNDU4Olx0XHRcdGlmIChzdWJzZWN0aW9uX292ZXJsYXBzX3pvbmUoZW5kX3BmbiAtIDEsIHpvbmUpKVxuIDQ1OTpcdFx0XHRcdHJldHVybiBlbmRfcGZuIC0gMTtcbiA0NjA6XHRcdH1cbiA0NjE6XHRcdHJldHVybiAwO1xuIDQ2MjpcdH1cbiA0NjM6XHRcbiA0NjQ6XHRzdGF0aWMgdm9pZCBzaHJpbmtfem9uZV9zcGFuKHN0cnVjdCB6b25lICp6b25lLCB1bnNpZ25lZCBsb25nIHN0YXJ0X3BmbixcbiA0NjU6XHRcdFx0XHQgICAgIHVuc2lnbmVkIGxvbmcgZW5kX3BmbilcbiA0NjY6XHR7XG4gNDY3Olx0XHR1bnNpZ25lZCBsb25nIHBmbjtcbiA0Njg6XHRcbiA0Njk6XHRcdGlmICh6b25lLVx1MDAzZXpvbmVfc3RhcnRfcGZuID09IHN0YXJ0X3Bmbikge1xuIDQ3MDpcdFx0XHQvKlxuIDQ3MTpcdFx0XHQgKiBJZiB0aGUgc2VjdGlvbiBpcyBzbWFsbGVzdCBzZWN0aW9uIGluIHRoZSB6b25lLCBpdCBuZWVkXG4gNDcyOlx0XHRcdCAqIHNocmluayB6b25lLVx1MDAzZXpvbmVfc3RhcnRfcGZuIGFuZCB6b25lLVx1MDAzZXpvbmVfc3Bhbm5lZF9wYWdlcy5cbiA0NzM6XHRcdFx0ICogSW4gdGhpcyBjYXNlLCB3ZSBmaW5kIHNlY29uZCBzbWFsbGVzdCB2YWxpZCBtZW1fc2VjdGlvblxuIDQ3NDpcdFx0XHQgKiBmb3Igc2hyaW5raW5nIHpvbmUuXG4gNDc1Olx0XHRcdCAqL1xuIDQ3NjpcdFx0XHRwZm4gPSBmaW5kX3NtYWxsZXN0X3NlY3Rpb25fcGZuKHpvbmUsIGVuZF9wZm4sXG4gNDc3Olx0XHRcdFx0XHRcdFx0em9uZV9lbmRfcGZuKHpvbmUpKTtcbiA0Nzg6XHRcdFx0aWYgKHBmbikge1xuIDQ3OTpcdFx0XHRcdHpvbmUtXHUwMDNlc3Bhbm5lZF9wYWdlcyA9IHpvbmVfZW5kX3Bmbih6b25lKSAtIHBmbjtcbiA0ODA6XHRcdFx0XHR6b25lLVx1MDAzZXpvbmVfc3RhcnRfcGZuID0gcGZuO1xuIDQ4MTpcdFx0XHR9IGVsc2Uge1xuIDQ4MjpcdFx0XHRcdHpvbmUtXHUwMDNlem9uZV9zdGFydF9wZm4gPSAwO1xuIDQ4MzpcdFx0XHRcdHpvbmUtXHUwMDNlc3Bhbm5lZF9wYWdlcyA9IDA7XG4gNDg0Olx0XHRcdH1cbiA0ODU6XHRcdH0gZWxzZSBpZiAoem9uZV9lbmRfcGZuKHpvbmUpID09IGVuZF9wZm4pIHtcbiA0ODY6XHRcdFx0LypcbiA0ODc6XHRcdFx0ICogSWYgdGhlIHNlY3Rpb24gaXMgYmlnZ2VzdCBzZWN0aW9uIGluIHRoZSB6b25lLCBpdCBuZWVkXG4gNDg4Olx0XHRcdCAqIHNocmluayB6b25lLVx1MDAzZXNwYW5uZWRfcGFnZXMuXG4gNDg5Olx0XHRcdCAqIEluIHRoaXMgY2FzZSwgd2UgZmluZCBzZWNvbmQgYmlnZ2VzdCB2YWxpZCBtZW1fc2VjdGlvbiBmb3JcbiA0OTA6XHRcdFx0ICogc2hyaW5raW5nIHpvbmUuXG4gNDkxOlx0XHRcdCAqL1xuIDQ5MjpcdFx0XHRwZm4gPSBmaW5kX2JpZ2dlc3Rfc2VjdGlvbl9wZm4oem9uZSwgem9uZS1cdTAwM2V6b25lX3N0YXJ0X3BmbixcbiA0OTM6XHRcdFx0XHRcdFx0ICAgICAgIHN0YXJ0X3Bmbik7XG4gNDk0Olx0XHRcdGlmIChwZm4pXG4gNDk1Olx0XHRcdFx0em9uZS1cdTAwM2VzcGFubmVkX3BhZ2VzID0gcGZuIC0gem9uZS1cdTAwM2V6b25lX3N0YXJ0X3BmbiAmIzQzOyAxO1xuIDQ5NjpcdFx0XHRlbHNlIHtcbiA0OTc6XHRcdFx0XHR6b25lLVx1MDAzZXpvbmVfc3RhcnRfcGZuID0gMDtcbiA0OTg6XHRcdFx0XHR6b25lLVx1MDAzZXNwYW5uZWRfcGFnZXMgPSAwO1xuIDQ5OTpcdFx0XHR9XG4gNTAwOlx0XHR9XG4gNTAxOlx0fVxuIDUwMjpcdFxuIDUwMzpcdHN0YXRpYyB2b2lkIHVwZGF0ZV9wZ2RhdF9zcGFuKHN0cnVjdCBwZ2xpc3RfZGF0YSAqcGdkYXQpXG4gNTA0Olx0e1xuIDUwNTpcdFx0dW5zaWduZWQgbG9uZyBub2RlX3N0YXJ0X3BmbiA9IDAsIG5vZGVfZW5kX3BmbiA9IDA7XG4gNTA2Olx0XHRzdHJ1Y3Qgem9uZSAqem9uZTtcbiA1MDc6XHRcbiA1MDg6XHRcdGZvciAoem9uZSA9IHBnZGF0LVx1MDAzZW5vZGVfem9uZXM7XG4gNTA5Olx0XHQgICAgIHpvbmUgXHUwMDNjIHBnZGF0LVx1MDAzZW5vZGVfem9uZXMgJiM0MzsgTUFYX05SX1pPTkVTOyB6b25lJiM0MzsmIzQzOykge1xuIDUxMDpcdFx0XHR1bnNpZ25lZCBsb25nIGVuZF9wZm4gPSB6b25lX2VuZF9wZm4oem9uZSk7XG4gNTExOlx0XG4gNTEyOlx0XHRcdC8qIE5vIG5lZWQgdG8gbG9jayB0aGUgem9uZXMsIHRoZXkgY2FuJiMzOTt0IGNoYW5nZS4gKi9cbiA1MTM6XHRcdFx0aWYgKCF6b25lLVx1MDAzZXNwYW5uZWRfcGFnZXMpXG4gNTE0Olx0XHRcdFx0Y29udGludWU7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTcvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE0IDA3OjQ0PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy44LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDE2OTA2CgkJCQkJCQlvdXRwdXQ6IDM1CgkJCQkJCQl0aG91Z2h0czogMzUKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgc3VtbWFyeSwgYXMgaWYgSSB3ZXJlIHRoaW5raW5nIHRoZXNlIHRob3VnaHRzOgoKKipBbmFseXppbmcgdGhlIE1lbW9yeSBBbGxvY2F0aW9uIENoYW5nZXMgaW4gYGRyaXZlcnMvYmFzZS9tZW1vcnkuY2AqKgoKT2theSwgc28gd2UmIzM5O3JlIGxvb2tpbmcgYXQgdGhlIG1lbW9yeSBhbGxvY2F0aW9uIGNoYW5nZXMsIGFuZCB0byBnZXQgYSByZWFsbHkgZ29vZCBoYW5kbGUgb24gdGhlbSwgSSBuZWVkIHRvIGRpZyBpbnRvIHRoZSBjb2RlLiBTcGVjaWZpY2FsbHksIGxldCYjMzk7cyB0YXJnZXQgYGRyaXZlcnMvYmFzZS9tZW1vcnkuY2AgYW5kIGZvY3VzIG9uIGxpbmVzIDI1MCB0aHJvdWdoIDMzNS4gVGhhdCYjMzk7cyB1c3VhbGx5IHdoZXJlIHRoZSBjb3JlIGFsbG9jYXRpb24gYW5kIGRlYWxsb2NhdGlvbiBmdW5jdGlvbnMgbGl2ZSwgb3IgYXQgbGVhc3QgdGhlIGNyaXRpY2FsIGNhbGxzIHRoYXQgaGF2ZSBiZWVuIG1vZGlmaWVkIHdpbGwgYmUuIEJ5IGV4YW1pbmluZyB0aGF0IHNlY3Rpb24sIEkgc2hvdWxkIGJlIGFibGUgdG8gaWRlbnRpZnkgZXhhY3RseSB3aGF0IGhhcyBiZWVuIGFsdGVyZWQgaW4gdGhlIGxvZ2ljLCBob3cgdGhlIG5ldyBhcHByb2FjaCB3b3JrcywgYW5kLCBjcnVjaWFsbHksIGhvdyB0aG9zZSBmdW5jdGlvbnMgYXJlIGJlaW5nIGNhbGxlZCB3aXRoaW4gdGhlIGJyb2FkZXIgZnJhbWV3b3JrIG9mIHRoZSBkcml2ZXIgY29kZS4gSXQmIzM5O3MgdGhlIGJlc3Qgd2F5IHRvIHVuZGVyc3RhbmQgdGhlIGltcGFjdCBvZiBhbnkgY2hhbmdlcyB0byB0aGUgbWVtb3J5IG1hbmFnZW1lbnQuIEkgc3VzcGVjdCBpdCBtaWdodCBoYXZlIHNvbWV0aGluZyB0byBkbyB3aXRoIHRoZSByZWNlbnQgcGVyZm9ybWFuY2UgaXNzdWVzLCBzbyBhIGZvY3VzZWQgcmVhZCBoZXJlIHNob3VsZCBpbGx1bWluYXRlIHdoYXQgaGFzIGJlZW4gZG9uZSBhbmQgaG9wZWZ1bGx5IGhlbHAgdG8gaXNvbGF0ZSB0aGUgcHJvYmxlbS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xOC8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTQgMDc6NDQ8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtkcml2ZXJzL2Jhc2UvbWVtb3J5LmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAyNTAsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogODUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7IDI1MDpcdFx0ICogdGhlaXIgaW5pdGlhbGl6YXRpb24gYW5kIGFjY291bnRpbmcgYXQgbWVtb3J5IG9ubGluaW5nL29mZmxpbmluZ1xuIDI1MTpcdFx0ICogc3RhZ2UgaGVscHMgdG8ga2VlcCBhY2NvdW50aW5nIGVhc2llciB0byBmb2xsb3cgLSBlLmcgdm1lbW1hcHNcbiAyNTI6XHRcdCAqIGJlbG9uZyB0byB0aGUgc2FtZSB6b25lIGFzIHRoZSBtZW1vcnkgdGhleSBiYWNrZWQuXG4gMjUzOlx0XHQgKi9cbiAyNTQ6XHRcdGlmIChtZW0tXHUwMDNlYWx0bWFwKVxuIDI1NTpcdFx0XHRucl92bWVtbWFwX3BhZ2VzID0gbWVtLVx1MDAzZWFsdG1hcC1cdTAwM2VmcmVlO1xuIDI1NjpcdFxuIDI1NzpcdFx0bWVtX2hvdHBsdWdfYmVnaW4oKTtcbiAyNTg6XHRcdGNsZWFyX3pvbmVfY29udGlndW91cyh6b25lKTtcbiAyNTk6XHRcdGlmIChucl92bWVtbWFwX3BhZ2VzKSB7XG4gMjYwOlx0XHRcdHJldCA9IG1ocF9pbml0X21lbW1hcF9vbl9tZW1vcnkoc3RhcnRfcGZuLCBucl92bWVtbWFwX3BhZ2VzLCB6b25lKTtcbiAyNjE6XHRcdFx0aWYgKHJldClcbiAyNjI6XHRcdFx0XHRnb3RvIG91dDtcbiAyNjM6XHRcdH1cbiAyNjQ6XHRcbiAyNjU6XHRcdHJldCA9IG9ubGluZV9wYWdlcyhzdGFydF9wZm4gJiM0MzsgbnJfdm1lbW1hcF9wYWdlcyxcbiAyNjY6XHRcdFx0XHQgICBucl9wYWdlcyAtIG5yX3ZtZW1tYXBfcGFnZXMsIHpvbmUsIG1lbS1cdTAwM2Vncm91cCk7XG4gMjY3Olx0XHRpZiAocmV0KSB7XG4gMjY4Olx0XHRcdGlmIChucl92bWVtbWFwX3BhZ2VzKVxuIDI2OTpcdFx0XHRcdG1ocF9kZWluaXRfbWVtbWFwX29uX21lbW9yeShzdGFydF9wZm4sIG5yX3ZtZW1tYXBfcGFnZXMpO1xuIDI3MDpcdFx0XHRnb3RvIG91dDtcbiAyNzE6XHRcdH1cbiAyNzI6XHRcbiAyNzM6XHRcdC8qXG4gMjc0Olx0XHQgKiBBY2NvdW50IG9uY2Ugb25saW5pbmcgc3VjY2VlZGVkLiBJZiB0aGUgem9uZSB3YXMgdW5wb3B1bGF0ZWQsIGl0IGlzXG4gMjc1Olx0XHQgKiBub3cgYWxyZWFkeSBwcm9wZXJseSBwb3B1bGF0ZWQuXG4gMjc2Olx0XHQgKi9cbiAyNzc6XHRcdGlmIChucl92bWVtbWFwX3BhZ2VzKVxuIDI3ODpcdFx0XHRhZGp1c3RfcHJlc2VudF9wYWdlX2NvdW50KHBmbl90b19wYWdlKHN0YXJ0X3BmbiksIG1lbS1cdTAwM2Vncm91cCxcbiAyNzk6XHRcdFx0XHRcdFx0ICBucl92bWVtbWFwX3BhZ2VzKTtcbiAyODA6XHRcbiAyODE6XHRcdG1lbS1cdTAwM2V6b25lID0gem9uZTtcbiAyODI6XHRvdXQ6XG4gMjgzOlx0XHRzZXRfem9uZV9jb250aWd1b3VzKHpvbmUpO1xuIDI4NDpcdFx0bWVtX2hvdHBsdWdfZG9uZSgpO1xuIDI4NTpcdFx0cmV0dXJuIHJldDtcbiAyODY6XHR9XG4gMjg3Olx0XG4gMjg4Olx0LypcbiAyODk6XHQgKiBNdXN0IGFjcXVpcmUgbWVtX2hvdHBsdWdfbG9jayBpbiB3cml0ZSBtb2RlLlxuIDI5MDpcdCAqL1xuIDI5MTpcdHN0YXRpYyBpbnQgbWVtb3J5X2Jsb2NrX29mZmxpbmUoc3RydWN0IG1lbW9yeV9ibG9jayAqbWVtKVxuIDI5MjpcdHtcbiAyOTM6XHRcdHVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuID0gc2VjdGlvbl9ucl90b19wZm4obWVtLVx1MDAzZXN0YXJ0X3NlY3Rpb25fbnIpO1xuIDI5NDpcdFx0dW5zaWduZWQgbG9uZyBucl9wYWdlcyA9IFBBR0VTX1BFUl9TRUNUSU9OICogc2VjdGlvbnNfcGVyX2Jsb2NrO1xuIDI5NTpcdFx0dW5zaWduZWQgbG9uZyBucl92bWVtbWFwX3BhZ2VzID0gMDtcbiAyOTY6XHRcdGludCByZXQ7XG4gMjk3Olx0XG4gMjk4Olx0XHRpZiAoIW1lbS1cdTAwM2V6b25lKVxuIDI5OTpcdFx0XHRyZXR1cm4gLUVJTlZBTDtcbiAzMDA6XHRcbiAzMDE6XHRcdC8qXG4gMzAyOlx0XHQgKiBVbmFjY291bnQgYmVmb3JlIG9mZmxpbmluZywgc3VjaCB0aGF0IHVucG9wdWxhdGVkIHpvbmUgYW5kIGt0aHJlYWRzXG4gMzAzOlx0XHQgKiBjYW4gcHJvcGVybHkgYmUgdG9ybiBkb3duIGluIG9mZmxpbmVfcGFnZXMoKS5cbiAzMDQ6XHRcdCAqL1xuIDMwNTpcdFx0aWYgKG1lbS1cdTAwM2VhbHRtYXApXG4gMzA2Olx0XHRcdG5yX3ZtZW1tYXBfcGFnZXMgPSBtZW0tXHUwMDNlYWx0bWFwLVx1MDAzZWZyZWU7XG4gMzA3Olx0XG4gMzA4Olx0XHRtZW1faG90cGx1Z19iZWdpbigpO1xuIDMwOTpcdFx0Y2xlYXJfem9uZV9jb250aWd1b3VzKG1lbS1cdTAwM2V6b25lKTtcbiAzMTA6XHRcdGlmIChucl92bWVtbWFwX3BhZ2VzKVxuIDMxMTpcdFx0XHRhZGp1c3RfcHJlc2VudF9wYWdlX2NvdW50KHBmbl90b19wYWdlKHN0YXJ0X3BmbiksIG1lbS1cdTAwM2Vncm91cCxcbiAzMTI6XHRcdFx0XHRcdFx0ICAtbnJfdm1lbW1hcF9wYWdlcyk7XG4gMzEzOlx0XG4gMzE0Olx0XHRyZXQgPSBvZmZsaW5lX3BhZ2VzKHN0YXJ0X3BmbiAmIzQzOyBucl92bWVtbWFwX3BhZ2VzLFxuIDMxNTpcdFx0XHRcdCAgICBucl9wYWdlcyAtIG5yX3ZtZW1tYXBfcGFnZXMsIG1lbS1cdTAwM2V6b25lLCBtZW0tXHUwMDNlZ3JvdXApO1xuIDMxNjpcdFx0aWYgKHJldCkge1xuIDMxNzpcdFx0XHQvKiBvZmZsaW5lX3BhZ2VzKCkgZmFpbGVkLiBBY2NvdW50IGJhY2suICovXG4gMzE4Olx0XHRcdGlmIChucl92bWVtbWFwX3BhZ2VzKVxuIDMxOTpcdFx0XHRcdGFkanVzdF9wcmVzZW50X3BhZ2VfY291bnQocGZuX3RvX3BhZ2Uoc3RhcnRfcGZuKSxcbiAzMjA6XHRcdFx0XHRcdFx0XHQgIG1lbS1cdTAwM2Vncm91cCwgbnJfdm1lbW1hcF9wYWdlcyk7XG4gMzIxOlx0XHRcdGdvdG8gb3V0O1xuIDMyMjpcdFx0fVxuIDMyMzpcdFxuIDMyNDpcdFx0aWYgKG5yX3ZtZW1tYXBfcGFnZXMpXG4gMzI1Olx0XHRcdG1ocF9kZWluaXRfbWVtbWFwX29uX21lbW9yeShzdGFydF9wZm4sIG5yX3ZtZW1tYXBfcGFnZXMpO1xuIDMyNjpcdFxuIDMyNzpcdG91dDpcbiAzMjg6XHRcdHNldF96b25lX2NvbnRpZ3VvdXMobWVtLVx1MDAzZXpvbmUpO1xuIDMyOTpcdFx0aWYgKCFyZXQpXG4gMzMwOlx0XHRcdG1lbS1cdTAwM2V6b25lID0gTlVMTDtcbiAzMzE6XHRcdG1lbV9ob3RwbHVnX2RvbmUoKTtcbiAzMzI6XHRcdHJldHVybiByZXQ7XG4gMzMzOlx0fVxuIDMzNDpcdFxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE5LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xNCAwNzo0NDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuOC1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxODQ4NwoJCQkJCQkJb3V0cHV0OiAyNAoJCQkJCQkJdGhvdWdodHM6IDk4NwoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgdGhlIE1lbW9yeSBCbG9jayBPZmZsaW5lL09ubGluZSBDaGFuZ2VzKioKCk9rYXksIGxldCYjMzk7cyBicmVhayB0aGlzIGRvd24uIEluIHRoZSBgbWVtb3J5X2Jsb2NrX29mZmxpbmVgIGZ1bmN0aW9uLCBJIHNlZSBgY2xlYXJfem9uZV9jb250aWd1b3VzYCBpcyBjYWxsZWQsIGFuZCB0aGVuLCBhdCB0aGUgZW5kLCBgc2V0X3pvbmVfY29udGlndW91c2AgaXMgY2FsbGVkLiBUaGUgY3J1Y2lhbCBxdWVzdGlvbiB0aGF0IGltbWVkaWF0ZWx5IGp1bXBzIG91dCBhdCBtZSBpczogd2hhdCYjMzk7cyBoYXBwZW5pbmcgd2l0aCB0aGUgYHpvbmUtJmd0O2NvbnRpZ3VvdXNgIGZsYWc/CgpCZWZvcmUgdGhpcyBwYXRjaCwgYHNldF96b25lX2NvbnRpZ3VvdXNgIHVzZWQgdG8gaXRlcmF0ZSB0aHJvdWdoIGFsbCB0aGUgcGFnZWJsb2NrcyB3aXRoaW4gYSB6b25lLiBJdCB3b3VsZCBtZXRpY3Vsb3VzbHkgY2hlY2sgZWFjaCBvbmUsIGFuZCBvbmx5IHNldCB0aGUgZmxhZyBpZiBubyBnYXBzIHdlcmUgZm91bmQuIEl0IHdhcyBhIGxvb3Agb3ZlcjoKCmBgYGMKdm9pZCBzZXRfem9uZV9jb250aWd1b3VzKHN0cnVjdCB6b25lICp6b25lKQp7Cgl1bnNpZ25lZCBsb25nIGJsb2NrX3N0YXJ0X3BmbiA9IHpvbmUtJmd0O3pvbmVfc3RhcnRfcGZuOwoJdW5zaWduZWQgbG9uZyBibG9ja19lbmRfcGZuOwoKCWJsb2NrX2VuZF9wZm4gPSBwYWdlYmxvY2tfZW5kX3BmbihibG9ja19zdGFydF9wZm4pOwoJZm9yICg7IGJsb2NrX3N0YXJ0X3BmbiAmbHQ7IHpvbmVfZW5kX3Bmbih6b25lKTsKCQkJYmxvY2tfc3RhcnRfcGZuID0gYmxvY2tfZW5kX3BmbiwKCQkJIGJsb2NrX2VuZF9wZm4gJiM0Mzs9IHBhZ2VibG9ja19ucl9wYWdlcykgewoKCQlibG9ja19lbmRfcGZuID0gbWluKGJsb2NrX2VuZF9wZm4sIHpvbmVfZW5kX3Bmbih6b25lKSk7CgoJCWlmICghX19wYWdlYmxvY2tfcGZuX3RvX3BhZ2UoYmxvY2tfc3RhcnRfcGZuLAoJCQkJCSAgICAgYmxvY2tfZW5kX3Bmbiwgem9uZSkpCgkJCXJldHVybjsKCQljb25kX3Jlc2NoZWQoKTsKCX0KCgkvKiBXZSBjb25maXJtIHRoYXQgdGhlcmUgaXMgbm8gaG9sZSAqLwoJem9uZS0mZ3Q7Y29udGlndW91cyA9IHRydWU7Cn0KYGBgCgpOb3csIGl0JiMzOTtzIGFuIGlubGluZSBmdW5jdGlvbiwgbXVjaCBzaW1wbGVyOgoKYGBgYwpzdGF0aWMgaW5saW5lIHZvaWQgc2V0X3pvbmVfY29udGlndW91cyhzdHJ1Y3Qgem9uZSAqem9uZSkKewoJaWYgKHpvbmVfaXNfem9uZV9kZXZpY2Uoem9uZSkpCgkJcmV0dXJuOwoJaWYgKHpvbmUtJmd0O3NwYW5uZWRfcGFnZXMgPT0gem9uZS0mZ3Q7cGFnZXNfd2l0aF9vbmxpbmVfbWVtbWFwKQoJCVdSSVRFX09OQ0Uoem9uZS0mZ3Q7Y29udGlndW91cywgdHJ1ZSk7Cn0KYGBgCgpUaGlzIGlubGluZSB2ZXJzaW9uIGNvbXBhcmVzIGB6b25lLSZndDtzcGFubmVkX3BhZ2VzYCB0byBgem9uZS0mZ3Q7cGFnZXNfd2l0aF9vbmxpbmVfbWVtbWFwYC4gVGhlIGZsYWcgaXMgb25seSBzZXQgaWYgdGhleSBhcmUgZXF1YWwhIFNvLCBgem9uZS0mZ3Q7cGFnZXNfd2l0aF9vbmxpbmVfbWVtbWFwYCBpcyBub3cgY3JpdGljYWwgaGVyZSwgc28gSSB3YW50IHRvIHVuZGVyc3RhbmQgaG93IGl0JiMzOTtzIG1hbmFnZWQsIGFuZCBpZiBpdCYjMzk7cyBjb3JyZWN0LgoKSSBuZWVkIHRvIHVuZGVyc3RhbmQgaG93IGB6b25lLSZndDtwYWdlc193aXRoX29ubGluZV9tZW1tYXBgIGlzIHRyYWNrZWQuIEkgc2VlIGl0JiMzOTtzIHVwZGF0ZWQ6CgoqICAgRHVyaW5nIGVhcmx5IGJvb3QgaW4gYG1tbWFwX2luaXRfem9uZV9yYW5nZWA6IEkgc2VlIGl0IGdldHMgaW5jcmVtZW50ZWQgd2l0aCB0aGUgbnVtYmVyIG9mIHBhZ2VzIGluIHRoZSB6b25lLgoKKiAgIEluIGBhZGp1c3RfcHJlc2VudF9wYWdlX2NvdW50YDogSXQgZ2V0cyB1cGRhdGVkIChhZGRlZCBvciBzdWJ0cmFjdGVkKS4KCiogICBBbmQgaW1wb3J0YW50bHksIGR1cmluZyBtZW1vcnkgaG90cGx1ZyBvcGVyYXRpb25zLCB3aGljaCBpcyB3aGF0IGNvbmNlcm5zIG1lIG1vc3QgaGVyZS4KCkkgc2VlIHRoYXQgYHNocmlua196b25lX3NwYW5gLCBgZmluZF9zbWFsbGVzdF9zZWN0aW9uX3BmbmAsIGFuZCBgZmluZF9iaWdnZXN0X3NlY3Rpb25fcGZuYCBoYXZlIGhhZCBsb2dpYyBjaGFuZ2VzIHJlbGF0ZWQgdG8gdGhpcy4gU3BlY2lmaWNhbGx5LCB0aGUgb2xkIGNvZGUgdXNlZCB0byBjYXJlZnVsbHkgY2hlY2sgZm9yIG5vZGUgYW5kIHpvbmUgbWlzbWF0Y2hlcy4gVGhlIG5ldyBsb2dpYyBpbiBgc3Vic2VjdGlvbl9vdmVybGFwc196b25lYCBmb2N1c2VzIG9uIGFsaWduaW5nIHRvIGEgc3BlY2lmaWMgc3Vic2VjdGlvbiBzaXplLiBUaGlzIGxvb2tzIGxpa2UgYSBzaW1wbGlmaWNhdGlvbi4KCk5vdywgSSBzcG90IHRoZSBjb3JlIG9mIHRoaXMgY2hhbmdlLiBgY2xlYXJfem9uZV9jb250aWd1b3VzYCBhbmQgYHNldF96b25lX2NvbnRpZ3VvdXNgIHdlcmUgKnJlbW92ZWQqIGZyb20gYHJlbW92ZV9wZm5fcmFuZ2VfZnJvbV96b25lYCBhbmQgYG1vdmVfcGZuX3JhbmdlX3RvX3pvbmVgIGFuZCBtb3ZlZCBpbnRvIGBtZW1vcnlfYmxvY2tfb25saW5lYCBhbmQgYG1lbW9yeV9ibG9ja19vZmZsaW5lYC4gVGhlIHByb2JsZW0gaGVyZSBpcyB0aGF0IHRoZXNlIGZ1bmN0aW9ucyBjYW4gYmUgY2FsbGVkICppbmRlcGVuZGVudGx5KiBvZiBgbWVtb3J5X2Jsb2NrX29ubGluZWAvYG9mZmxpbmVgISBUaGF0IG1lYW5zIHRoYXQgdGhlIGNvbnRpZ3VpdHkgZmxhZyBtaWdodCBiZSBpbmNvcnJlY3RseSBzZXQgb3IgY2xlYXJlZCEgVGhpcyBpcyBhIHBvdGVudGlhbCByYWNlIGNvbmRpdGlvbiBvciBkYXRhIGNvcnJ1cHRpb24uIEkgbmVlZCB0byBiZSAqYWJzb2x1dGVseSogc3VyZSB0aGF0IHRoZSBsb2dpYyBpcyBjb3JyZWN0IGluIGFsbCBjYXNlcywgZXNwZWNpYWxseSBiZWNhdXNlIGl0JiMzOTtzIG5vdyB0aWVkIHRvIHRoZSBjb3VudCBvZiBvbmxpbmUgcGFnZXMsIHdoaWNoIGNhbiBjaGFuZ2UgaW4gdmFyaW91cyB3YXlzLiBJIG5lZWQgdG8gY29uZmlybSB0aGF0IEFMTCBjYWxsZXJzIG9mIGByZW1vdmVfcGZuX3JhbmdlX2Zyb21fem9uZWAgYW5kIGBtb3ZlX3Bmbl9yYW5nZV90b196b25lYCBhcmUgbm93IHNhZmUsIGFzIHdlbGwuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjAvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE0IDA3OjQ0PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O3JlbW92ZV9wZm5fcmFuZ2VfZnJvbV96b25lJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2luY2x1ZGUvbGludXgvbWVtb3J5X2hvdHBsdWcuaD0zMTI9ZXh0ZXJuIHZvaWQgbW92ZV9wZm5fcmFuZ2VfdG9fem9uZShzdHJ1Y3Qgem9uZSAqem9uZSwgdW5zaWduZWQgbG9uZyBzdGFydF9wZm4sXG4tLVxuaW5jbHVkZS9saW51eC9tZW1vcnlfaG90cGx1Zy5oLTMxNS1cdFx0XHRcdCAgIGJvb2wgaXNvbGF0ZV9wYWdlYmxvY2spO1xuaW5jbHVkZS9saW51eC9tZW1vcnlfaG90cGx1Zy5oOjMxNjpleHRlcm4gdm9pZCByZW1vdmVfcGZuX3JhbmdlX2Zyb21fem9uZShzdHJ1Y3Qgem9uZSAqem9uZSxcbmluY2x1ZGUvbGludXgvbWVtb3J5X2hvdHBsdWcuaC0zMTctXHRcdFx0XHQgICAgICAgdW5zaWduZWQgbG9uZyBzdGFydF9wZm4sXG4tLVxubW0vbWVtb3J5X2hvdHBsdWcuYz01MDM9c3RhdGljIHZvaWQgdXBkYXRlX3BnZGF0X3NwYW4oc3RydWN0IHBnbGlzdF9kYXRhICpwZ2RhdClcbi0tXG5tbS9tZW1vcnlfaG90cGx1Zy5jLTUzMC1cbm1tL21lbW9yeV9ob3RwbHVnLmM6NTMxOnZvaWQgcmVtb3ZlX3Bmbl9yYW5nZV9mcm9tX3pvbmUoc3RydWN0IHpvbmUgKnpvbmUsXG5tbS9tZW1vcnlfaG90cGx1Zy5jLTUzMi1cdFx0XHRcdCAgICAgIHVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuLFxuLS1cbm1tL21lbW9yeV9ob3RwbHVnLmM9MTA5OD12b2lkIG1ocF9kZWluaXRfbWVtbWFwX29uX21lbW9yeSh1bnNpZ25lZCBsb25nIHBmbiwgdW5zaWduZWQgbG9uZyBucl9wYWdlcylcbi0tXG5tbS9tZW1vcnlfaG90cGx1Zy5jLTExMTMtXHQgKi9cbm1tL21lbW9yeV9ob3RwbHVnLmM6MTExNDpcdHJlbW92ZV9wZm5fcmFuZ2VfZnJvbV96b25lKHBhZ2Vfem9uZShwZm5fdG9fcGFnZShwZm4pKSwgcGZuLCBucl9wYWdlcyk7XG5tbS9tZW1vcnlfaG90cGx1Zy5jLTExMTUtXHRrYXNhbl9yZW1vdmVfemVyb19zaGFkb3coX192YShQRk5fUEhZUyhwZm4pKSwgUEZOX1BIWVMobnJfcGFnZXMpKTtcbi0tXG5tbS9tZW1vcnlfaG90cGx1Zy5jPTExMjE9aW50IG9ubGluZV9wYWdlcyh1bnNpZ25lZCBsb25nIHBmbiwgdW5zaWduZWQgbG9uZyBucl9wYWdlcyxcbi0tXG5tbS9tZW1vcnlfaG90cGx1Zy5jLTEyMzEtXHRcdG5vZGVfbm90aWZ5KE5PREVfQ0FOQ0VMX0FERElOR19GSVJTVF9NRU1PUlksIFx1MDAyNm5vZGVfYXJnKTtcbm1tL21lbW9yeV9ob3RwbHVnLmM6MTIzMjpcdHJlbW92ZV9wZm5fcmFuZ2VfZnJvbV96b25lKHpvbmUsIHBmbiwgbnJfcGFnZXMpO1xubW0vbWVtb3J5X2hvdHBsdWcuYy0xMjMzLVx0cmV0dXJuIHJldDtcbi0tXG5tbS9tZW1vcnlfaG90cGx1Zy5jPTE5MzY9aW50IG9mZmxpbmVfcGFnZXModW5zaWduZWQgbG9uZyBzdGFydF9wZm4sIHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMsXG4tLVxubW0vbWVtb3J5X2hvdHBsdWcuYy0yMTMzLVx0bWVtb3J5X25vdGlmeShNRU1fT0ZGTElORSwgXHUwMDI2bWVtX2FyZyk7XG5tbS9tZW1vcnlfaG90cGx1Zy5jOjIxMzQ6XHRyZW1vdmVfcGZuX3JhbmdlX2Zyb21fem9uZSh6b25lLCBzdGFydF9wZm4sIG5yX3BhZ2VzKTtcbm1tL21lbW9yeV9ob3RwbHVnLmMtMjEzNS1cdHJldHVybiAwO1xuLS1cbm1tL21lbXJlbWFwLmM9ODY9c3RhdGljIHZvaWQgcGFnZXVubWFwX3JhbmdlKHN0cnVjdCBkZXZfcGFnZW1hcCAqcGdtYXAsIGludCByYW5nZV9pZClcbi0tXG5tbS9tZW1yZW1hcC5jLTk1LVx0bWVtX2hvdHBsdWdfYmVnaW4oKTtcbm1tL21lbXJlbWFwLmM6OTY6XHRyZW1vdmVfcGZuX3JhbmdlX2Zyb21fem9uZShwYWdlX3pvbmUoZmlyc3RfcGFnZSksIFBIWVNfUEZOKHJhbmdlLVx1MDAzZXN0YXJ0KSxcbm1tL21lbXJlbWFwLmMtOTctXHRcdFx0XHQgICBQSFlTX1BGTihyYW5nZV9sZW4ocmFuZ2UpKSk7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjEvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE0IDA3OjQ0PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy44LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDIxMTc0CgkJCQkJCQlvdXRwdXQ6IDI0CgkJCQkJCQl0aG91Z2h0czogMTkKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGhlcmUmIzM5O3MgbXkgdGFrZSBvbiB0aG9zZSB0aG91Z2h0cywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZSwgYW5kIHdyaXR0ZW4gYXMgaWYgdGhleSB3ZXJlIG15IG93biBtZW50YWwgcHJvY2VzczoKCioqRGl2aW5nIERlZXBlciBpbnRvIGBtb3ZlX3Bmbl9yYW5nZV90b196b25lYCoqCgpSaWdodCwgc28gd2UmIzM5O3ZlIGJlZW4gbG9va2luZyBhdCB0aGUgYG1vdmVfcGZuX3JhbmdlX3RvX3pvbmVgIGZ1bmN0aW9uLCBhbmQgSSYjMzk7dmUgZ290IGEgaHVuY2ggaXQmIzM5O3Mgd29ydGggY2hlY2tpbmcgaXRzIGNhbGxlcnMgbW9yZSB0aG9yb3VnaGx5LiBXZSYjMzk7dmUgZ290IHRoZSBjb3JlIGxvZ2ljIHByZXR0eSB3ZWxsIHVuZGVyc3Rvb2Qgbm93LCBpdHMgcHVycG9zZSBvZiBwaHlzaWNhbGx5IG1vdmluZyBtZW1vcnkgcGFnZXMgZnJvbSBvbmUgem9uZSB0byBhbm90aGVyLCBsaWtlbHkgZm9yIG1lbW9yeSBtYW5hZ2VtZW50IHB1cnBvc2VzLiBJdCBtYWtlcyBzZW5zZSB0byB2ZXJpZnkgd2hhdCBjb2RlICp1c2VzKiB0aGF0IGZ1bmN0aW9uIGFuZCB3aHkuIEEgdGhvcm91Z2ggcmV2aWV3IG9mIHRoZSBjYWxsZXIgc2l0ZXMgd2lsbCBwcm9iYWJseSB0dXJuIHVwIHZhbHVhYmxlIGluc2lnaHRzIGludG8gaG93IHRoZXNlIG9wZXJhdGlvbnMgZml0IGludG8gdGhlIG92ZXJhbGwgbWVtb3J5IG1hbmFnZW1lbnQgc2NoZW1lLiBJJiMzOTttIGltYWdpbmluZyBpdCYjMzk7cyB1c2VkIGluIHRoaW5ncyBsaWtlIE5VTUEgbm9kZSBiYWxhbmNpbmcsIG1lbW9yeSBob3RwbHVnIG9wZXJhdGlvbnMsIG9yIHBlcmhhcHMgZXZlbiBjb21wYWN0aW9uLiBUaGUgbW9yZSBJIGNvbnNpZGVyIGl0LCB0aGUgbW9yZSBJIHJlYWxpemUgdGhhdCBrbm93aW5nIHRoZSBzdXJyb3VuZGluZyB1c2FnZSBpcyB2aXRhbCBmb3IgdW5kZXJzdGFuZGluZyB0aGlzIG9wZXJhdGlvbiYjMzk7cyBpbXBhY3RzIGFuZCBhbnkgYXNzb2NpYXRlZCBzeW5jaHJvbml6YXRpb24gaXNzdWVzLiBMZXQmIzM5O3Mgc2VlIHdoYXQgd2UgZmluZCB3aGVuIHdlIGRpZyBpbnRvIHRob3NlIGNhbGwgc2l0ZXMuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjIvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE0IDA3OjQ0PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O21vdmVfcGZuX3JhbmdlX3RvX3pvbmUmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7aW5jbHVkZS9saW51eC9tZW1vcnlfaG90cGx1Zy5oPTMwOT1leHRlcm4gaW50IGFkZF9tZW1vcnlfZHJpdmVyX21hbmFnZWQoaW50IG5pZCwgdTY0IHN0YXJ0LCB1NjQgc2l6ZSxcbi0tXG5pbmNsdWRlL2xpbnV4L21lbW9yeV9ob3RwbHVnLmgtMzExLVx0XHRcdFx0ICAgICBtaHBfdCBtaHBfZmxhZ3MpO1xuaW5jbHVkZS9saW51eC9tZW1vcnlfaG90cGx1Zy5oOjMxMjpleHRlcm4gdm9pZCBtb3ZlX3Bmbl9yYW5nZV90b196b25lKHN0cnVjdCB6b25lICp6b25lLCB1bnNpZ25lZCBsb25nIHN0YXJ0X3BmbixcbmluY2x1ZGUvbGludXgvbWVtb3J5X2hvdHBsdWcuaC0zMTMtXHRcdFx0XHQgICB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzLFxuLS1cbm1tL21lbW9yeV9ob3RwbHVnLmM9NzE0PXN0YXRpYyBpbmxpbmUgdm9pZCBzZWN0aW9uX3RhaW50X3pvbmVfZGV2aWNlKHVuc2lnbmVkIGxvbmcgcGZuKVxuLS1cbm1tL21lbW9yeV9ob3RwbHVnLmMtNzI3LSAqL1xubW0vbWVtb3J5X2hvdHBsdWcuYzo3Mjg6dm9pZCBtb3ZlX3Bmbl9yYW5nZV90b196b25lKHN0cnVjdCB6b25lICp6b25lLCB1bnNpZ25lZCBsb25nIHN0YXJ0X3Bmbixcbm1tL21lbW9yeV9ob3RwbHVnLmMtNzI5LVx0XHRcdFx0ICB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzLFxuLS1cbm1tL21lbW9yeV9ob3RwbHVnLmM9MTA2Nz1pbnQgbWhwX2luaXRfbWVtbWFwX29uX21lbW9yeSh1bnNpZ25lZCBsb25nIHBmbiwgdW5zaWduZWQgbG9uZyBucl9wYWdlcyxcbi0tXG5tbS9tZW1vcnlfaG90cGx1Zy5jLTEwNzYtXG5tbS9tZW1vcnlfaG90cGx1Zy5jOjEwNzc6XHRtb3ZlX3Bmbl9yYW5nZV90b196b25lKHpvbmUsIHBmbiwgbnJfcGFnZXMsIE5VTEwsIE1JR1JBVEVfVU5NT1ZBQkxFLFxubW0vbWVtb3J5X2hvdHBsdWcuYy0xMDc4LVx0XHRcdCAgICAgICBmYWxzZSk7XG4tLVxubW0vbWVtb3J5X2hvdHBsdWcuYz0xMTIxPWludCBvbmxpbmVfcGFnZXModW5zaWduZWQgbG9uZyBwZm4sIHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMsXG4tLVxubW0vbWVtb3J5X2hvdHBsdWcuYy0xMTQ4LVx0LyogYXNzb2NpYXRlIHBmbiByYW5nZSB3aXRoIHRoZSB6b25lICovXG5tbS9tZW1vcnlfaG90cGx1Zy5jOjExNDk6XHRtb3ZlX3Bmbl9yYW5nZV90b196b25lKHpvbmUsIHBmbiwgbnJfcGFnZXMsIE5VTEwsIE1JR1JBVEVfTU9WQUJMRSxcbm1tL21lbW9yeV9ob3RwbHVnLmMtMTE1MC1cdFx0XHQgICAgICAgdHJ1ZSk7XG4tLVxubW0vbWVtb3J5X2hvdHBsdWcuYz0yMjE5PXZvaWQgdHJ5X29mZmxpbmVfbm9kZShpbnQgbmlkKVxuLS1cbm1tL21lbW9yeV9ob3RwbHVnLmMtMjIyNC1cdCAqIElmIHRoZSBub2RlIHN0aWxsIHNwYW5zIHBhZ2VzIChlc3BlY2lhbGx5IFpPTkVfREVWSUNFKSwgZG9uJiMzOTt0XG5tbS9tZW1vcnlfaG90cGx1Zy5jOjIyMjU6XHQgKiBvZmZsaW5lIGl0LiBBIG5vZGUgc3BhbnMgbWVtb3J5IGFmdGVyIG1vdmVfcGZuX3JhbmdlX3RvX3pvbmUoKSxcbm1tL21lbW9yeV9ob3RwbHVnLmMtMjIyNi1cdCAqIGUuZy4sIGFmdGVyIHRoZSBtZW1vcnkgYmxvY2sgd2FzIG9ubGluZWQuXG4tLVxubW0vbWVtcmVtYXAuYz0xNDQ9c3RhdGljIGludCBwYWdlbWFwX3JhbmdlKHN0cnVjdCBkZXZfcGFnZW1hcCAqcGdtYXAsIHN0cnVjdCBtaHBfcGFyYW1zICpwYXJhbXMsXG4tLVxubW0vbWVtcmVtYXAuYy0yMjgtXHRcdHpvbmUgPSBcdTAwMjZOT0RFX0RBVEEobmlkKS1cdTAwM2Vub2RlX3pvbmVzW1pPTkVfREVWSUNFXTtcbm1tL21lbXJlbWFwLmM6MjI5Olx0XHRtb3ZlX3Bmbl9yYW5nZV90b196b25lKHpvbmUsIFBIWVNfUEZOKHJhbmdlLVx1MDAzZXN0YXJ0KSxcbm1tL21lbXJlbWFwLmMtMjMwLVx0XHRcdFx0UEhZU19QRk4ocmFuZ2VfbGVuKHJhbmdlKSksIHBhcmFtcy1cdTAwM2VhbHRtYXAsXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjMvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE0IDA3OjQ0PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4zbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy44LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDIyMjE1CgkJCQkJCQlvdXRwdXQ6IDI5CgkJCQkJCQl0aG91Z2h0czogOTkyCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKldvcnRoRnV6emluZyBBbmFseXNpczogTWVtb3J5IEhvdHBsdWcgYW5kIENvbnRpZ3VpdHkqKgoKT2theSwgbGV0JiMzOTtzIGJyZWFrIHRoaXMgZG93bi4gRmlyc3QsIGBzaHJpbmtfem9uZV9zcGFuYCBjYWxscyBgcmVtb3ZlX3Bmbl9yYW5nZV9mcm9tX3pvbmVgLiBXaXRoaW4gYHNocmlua196b25lX3NwYW5gLCB0aGUgYGZpbmRfc21hbGxlc3Rfc2VjdGlvbl9wZm5gIGFuZCBgZmluZF9iaWdnZXN0X3NlY3Rpb25fcGZuYCBmdW5jdGlvbnMgbm93IHVzZSBgc3Vic2VjdGlvbl9vdmVybGFwc196b25lYC4gVGhpcyBmdW5jdGlvbiBpcyBpbnRlcmVzdGluZyBiZWNhdXNlIGl0IGNoZWNrcyBpZiBhIHN1YnNlY3Rpb24gb3ZlcmxhcHMgYSBnaXZlbiB6b25lLiBUaGUgY29kZSBjYWxjdWxhdGVzIHN0YXJ0IGFuZCBlbmQgUEZOUyBmb3Igc3Vic2VjdGlvbnMsIGFuZCBjcnVjaWFsbHksIGl0IGNoZWNrcyBpZiBgcGZuX3RvX29ubGluZV9wYWdlKHN0YXJ0X3BmbilgIGlzIHZhbGlkLiAgVGhhdCBzZWVtcyBmaW5lLCBidXQgd2FpdOKApiB3aGF0IGlmIGB6b25lX2lzX2NvbnRpZ3VvdXNgIGFsc28gaGFzIGltcGxpY2F0aW9ucyBmb3IgY29tcGFjdGlvbj8gIElmIGl0IGVycm9uZW91c2x5IHJldHVybnMgYHRydWVgLCB0aGVuIGNvbXBhY3Rpb24gcm91dGluZXMgbWlnaHQgY2FsbCBgcGZuX3RvX3BhZ2Uoc3RhcnRfcGZuKWAgd2l0aG91dCBwcm9wZXIgdmFsaWRhdGlvbiBhbmQgem9uZSBjaGVja3MhICBUaGlzIG1ha2VzIG1lIHdvcnJ5IGFib3V0IHRoZSBwb3RlbnRpYWwgZm9yIGVycm9ycyBpZiB0aGUgYHpvbmVfaXNfY29udGlndW91c2AgZmxhZyBpcyBpbmNvbnNpc3RlbnQsIHBvc3NpYmx5IGR1ZSB0byBhIHJhY2UgY29uZGl0aW9uIG9yIHByb2JsZW1zIHdpdGggb2ZmbGluaW5nIG1lbW9yeS4gVGhpcyBoYXMgdGhlIHBvdGVudGlhbCB0byBjYXVzZSBpc3N1ZXMgd2l0aGluIGBpc29sYXRlX21pZ3JhdGVwYWdlc19yYW5nZWAgb3IgYGlzb2xhdGVfZnJlZXBhZ2VzX3JhbmdlYC4KCkxvb2tpbmcgYXQgdGhlIHBhdGNoIGNoYW5nZXMgaW4gbW9yZSBkZXRhaWwsIGl0JiMzOTtzIGNsZWFyIHRoaXMgdG91Y2hlcyBjb3JlIG1lbW9yeSBtYW5hZ2VtZW50IChgbW0vYCkgY29kZSwgc3BlY2lmaWNhbGx5IGludm9sdmluZyBtZW1vcnkgaG90cGx1ZywgaW5pdGlhbGl6YXRpb24sIGFuZCBjb21wYWN0aW9uLXJlbGF0ZWQgem9uZSBjb250aWd1aXR5IHRyYWNraW5nLgoKTm93LCB0aGUgY3J1Y2lhbCBxdWVzdGlvbjogSXMgdGhpcyByZWFjaGFibGUgaW4gdHlwaWNhbCBlbnZpcm9ubWVudHM/IFllcyEgU3RhbmRhcmQgTGludXgga2VybmVscyBydW5uaW5nIGluIFFFTVUgdXNlIGBTUEFSU0VNRU1fVk1FTU1BUGAgYW5kIGBNRU1PUllfSE9UUExVR2AuIFN5emthbGxlciBjYW4gaW50ZXJhY3Qgd2l0aCBgL3N5cy9kZXZpY2VzL3N5c3RlbS9tZW1vcnkvLi4uYCAob25saW5lL29mZmxpbmUgbWVtb3J5IGJsb2Nrcykgb3IgdHJpZ2dlciBjb21wYWN0aW9uLiBJdCYjMzk7cyBlc3BlY2lhbGx5IHNpZ25pZmljYW50IHRoYXQgc3l6a2FsbGVyLCB3aGljaCBydW5zIGFzIHJvb3QsIGhhcyBhY2Nlc3MgdG8gc3lzZnMgZmlsZXMgbGlrZSBgL3N5cy9kZXZpY2VzL3N5c3RlbS9tZW1vcnkvbWVtb3J5Ki9zdGF0ZWAuIFRoZSBzeXN0ZW0gaW50ZXJhY3RzIHdpdGggbWVtb3J5IGJsb2Nrcywgd2hpY2ggaXMgcmlnaHQgaW4gdGhlIGNyb3NzaGFpcnMgb2YgdGhlIGNoYW5nZWQgY29kZS4KClRoZSBjcml0ZXJpYSBmb3IgcmV0dXJuaW5nIGBXb3J0aEZ1enppbmc9dHJ1ZWAgYXJlIG1ldDogdGhlIHBhdGNoIG1vZGlmaWVzIGNvcmUgbWVtb3J5IG1hbmFnZW1lbnQgbG9naWMgKG1tLyksIGFuZCBub25lIG9mIHRoZSBuZWdhdGl2ZSBjcml0ZXJpYSBhcHBseSAoZS5nLiwgbm9uLWtlcm5lbCBjaGFuZ2VzLCB1bnJlYWNoYWJsZSBoYXJkd2FyZSwgb3IgYXJjaGl0ZWN0dXJlLXNwZWNpZmljIHBhdGhzKS4KClRoZXJlZm9yZSwgdGhpcyBwYXRjaCBpcyAqZGVmaW5pdGVseSogd29ydGggZnV6emluZy4gVGhlIGNoYW5nZXMgYXJlIGluIGNvcmUgTU0gY29kZSAoYG1tL21lbW9yeV9ob3RwbHVnLmNgLCBgbW0vbW1faW5pdC5jYCwgYGRyaXZlcnMvYmFzZS9tZW1vcnkuY2AsIGBpbmNsdWRlL2xpbnV4L21tem9uZS5oYCwgYG1tL3BhZ2VfYWxsb2MuaGApLCBhbmQgdGhlIHRhcmdldCBlbnZpcm9ubWVudCAoUUVNVSB3aXRoIHN5emthbGxlcikgaXMgZGlyZWN0bHkgYWZmZWN0ZWQuCgpOb3csIEkgbmVlZCB0byBmaWd1cmUgb3V0OgoxLiAgYEVuYWJsZUNvbmZpZ3NgIC0gSSBuZWVkIHRvIGV4YW1pbmUgS2NvbmZpZyBvcHRpb25zIGxpa2UgYENPTkZJR19NRU1PUllfSE9UUExVR2AsIGBDT05GSUdfU1BBUlNFTUVNYCwgYW5kIGBDT05GSUdfU1BBUlNFTUVNX1ZNRU1NQVBgIGFuZCBob3cgdGhleSBhcmUgdXNlZCBpbiB0aGUgbW9kaWZpZWQgY29kZS4gSSBuZWVkIHRvIGxvb2sgYXQgYGRyaXZlcnMvYmFzZS9tZW1vcnkuY2AsIGBtbS9tZW1vcnlfaG90cGx1Zy5jYCBhbmQgZWxzZXdoZXJlLgoyLiAgYEZvY3VzU3ltYm9sc2AKMy4gIGBSZWFzb25pbmdgCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjQvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE0IDA3OjQ4PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O21lbW9yeV9ibG9ja19vbmxpbmUmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtkcml2ZXJzL2Jhc2UvJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2RyaXZlcnMvYmFzZS9tZW1vcnkuYz0yMjQ9c3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIG1lbWJsa19ucl9wb2lzb24oc3RydWN0IG1lbW9yeV9ibG9jayAqbWVtKVxuLS1cbmRyaXZlcnMvYmFzZS9tZW1vcnkuYy0yMzItICovXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmM6MjMzOnN0YXRpYyBpbnQgbWVtb3J5X2Jsb2NrX29ubGluZShzdHJ1Y3QgbWVtb3J5X2Jsb2NrICptZW0pXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmMtMjM0LXtcbi0tXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmM9MzQwPW1lbW9yeV9ibG9ja19hY3Rpb24oc3RydWN0IG1lbW9yeV9ibG9jayAqbWVtLCB1bnNpZ25lZCBsb25nIGFjdGlvbilcbi0tXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmMtMzQ1LVx0Y2FzZSBNRU1fT05MSU5FOlxuZHJpdmVycy9iYXNlL21lbW9yeS5jOjM0NjpcdFx0cmV0ID0gbWVtb3J5X2Jsb2NrX29ubGluZShtZW0pO1xuZHJpdmVycy9iYXNlL21lbW9yeS5jLTM0Ny1cdFx0YnJlYWs7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjUvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE0IDA3OjQ4PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy44LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDI0MDk2CgkJCQkJCQlvdXRwdXQ6IDI3CgkJCQkJCQl0aG91Z2h0czogMzUKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGxldCYjMzk7cyBkaXZlIGludG8gdGhpcy4gSGVyZSYjMzk7cyBteSB0YWtlIG9uIHRob3NlIGBkcml2ZXJzL2Jhc2UvbWVtb3J5LmNgIGJpdHM6CgoqKkludmVzdGlnYXRpbmcgTWVtb3J5IEhvdHBsdWcgQ29kZSoqCgpBbHJpZ2h0LCBJJiMzOTttIHRoaW5raW5nIEkgbmVlZCB0byByZWZyZXNoIG15IG1lbW9yeSBvbiB0aGUgbWVtb3J5IGhvdHBsdWcgaW1wbGVtZW50YXRpb24uIFRoZSBmaXJzdCB0aGluZyBJJiMzOTttIGdvaW5nIHRvIGxvb2sgYXQgYXJlIHRoZSBgI2lmZGVmYCBndWFyZHMgc3Vycm91bmRpbmcgYG1lbW9yeV9ibG9ja19vbmxpbmVgIHdpdGhpbiBgZHJpdmVycy9iYXNlL21lbW9yeS5jYC4gSSBleHBlY3QgdG8gc2VlIHNwZWNpZmljIGNvbXBpbGUtdGltZSBjb25maWd1cmF0aW9ucyBjb250cm9sbGluZyB0aGUgYXZhaWxhYmlsaXR5IG9mIHRoaXMgZnVuY3Rpb24uIEkmIzM5O2xsIG5lZWQgdG8gdW5kZXJzdGFuZCB1bmRlciB3aGF0IGNpcmN1bXN0YW5jZXMgbWVtb3J5IGNhbiBiZSBob3RwbHVnZ2VkLCBhbmQgdGhpcyBzaG91bGQgdGVsbCBtZSBhIGxvdCBhYm91dCB0aGUgZGVwZW5kZW5jaWVzIGFuZCBhbnkgcGxhdGZvcm0gbGltaXRhdGlvbnMuIFRoZW4gSSBuZWVkIHRvIGp1bXAgb3ZlciB0byB0aGUgYGRyaXZlcnMvYmFzZS9NYWtlZmlsZWAuIFRoZSBtYWtlZmlsZSBkaXJlY3RpdmVzIHdpbGwgc2hvdyB0aGUgc3ltYm9scyBkZWZpbmVkIGJ5IHRob3NlIGd1YXJkcy4gSXQgd2lsbCB0ZWxsIG1lIHdoaWNoIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBlbmFibGUgdGhpcyBzcGVjaWZpYyBjb2RlIGJsb2NrLCBhbmQgdGhlcmVmb3JlIHdoaWNoIGRyaXZlcnMgYW5kIGFyY2hpdGVjdHVyZXMgYXJlIHN1cHBvcnRlZC4gVGhlIGdvYWwgaXMgYSBkZWVwZXIgdW5kZXJzdGFuZGluZyBvZiB0aGUgZmxleGliaWxpdHkgaW4gdGhlIHN5c3RlbS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yNi8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTQgMDc6NDg8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7bWVtb3J5XFwubyYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O2RyaXZlcnMvYmFzZS8mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7ZHJpdmVycy9iYXNlL01ha2VmaWxlPTE1PW9iai0kKENPTkZJR19OVU1BKVx0JiM0Mzs9IG5vZGUub1xuZHJpdmVycy9iYXNlL01ha2VmaWxlOjE2Om9iai0kKENPTkZJR19NRU1PUllfSE9UUExVRykgJiM0Mzs9IG1lbW9yeS5vXG5kcml2ZXJzL2Jhc2UvTWFrZWZpbGUtMTctaWZlcSAoJChDT05GSUdfU1lTRlMpLHkpXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjcvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE0IDA3OjQ4PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy44LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDI0NDM5CgkJCQkJCQlvdXRwdXQ6IDI4CgkJCQkJCQl0aG91Z2h0czogNDAKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgdGhvdWdodCBwcm9jZXNzLCBhcyBpdCByZWxhdGVzIHRvIHRoZSBrZXJuZWwgbW9kdWxlIGFuZCBtZW1vcnkgaG90cGx1ZzoKCioqSW52ZXN0aWdhdGluZyBNZW1vcnkgSG90cGx1ZyBDb25maWd1cmF0aW9uKioKCk9rYXksIHNvIGBkcml2ZXJzL2Jhc2UvbWVtb3J5Lm9gIGlzIGJ1aWx0IHdpdGggYENPTkZJR19NRU1PUllfSE9UUExVR2AgZW5hYmxlZC4gVGhhdCBpbW1lZGlhdGVseSB0ZWxscyBtZSBtZW1vcnkgaG90cGx1ZyBpcyBhIGNvcmUgcmVxdWlyZW1lbnQgZm9yIHRoaXMgcGFydGljdWxhciBvYmplY3QgZmlsZS4gTXkgbmV4dCBsb2dpY2FsIHN0ZXAgaXMgdG8gZGl2ZSBpbnRvIHRoZSBtZW1vcnkgbWFuYWdlbWVudCBzdWJzeXN0ZW0sIHNwZWNpZmljYWxseSB0aGUgYG1tL01ha2VmaWxlYC4gSSBuZWVkIHRvIGNvbmZpcm0gaG93IGBtZW1vcnlfaG90cGx1Zy5vYCBpcyBoYW5kbGVkIHdpdGhpbiB0aGF0IGJ1aWxkIHByb2Nlc3MuIEkgd2FudCB0byBzZWUgaG93IHRoYXQgZmlsZSBpcyBpbmNvcnBvcmF0ZWQgYW5kIHdoYXQgZGVwZW5kZW5jaWVzIG9yIGJ1aWxkIGZsYWdzIG1pZ2h0IGJlIGltcGFjdGluZyBpdCB3aXRoaW4gdGhlIGJyb2FkZXIgbWVtb3J5IG1hbmFnZW1lbnQgY29udGV4dC4gVGhpcyB3aWxsIGdpdmUgbWUgYSBiZXR0ZXIgdW5kZXJzdGFuZGluZyBvZiBob3cgdGhlIGtlcm5lbCBoYW5kbGVzIHRoZSBhZGRpdGlvbiBhbmQgcmVtb3ZhbCBvZiBtZW1vcnkuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjgvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE0IDA3OjQ4PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O21lbW9yeV9ob3RwbHVnXFwubyYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O21tLyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDttbS9NYWtlZmlsZT02Mj1wYWdlLWFsbG9jLSQoQ09ORklHX1NIVUZGTEVfUEFHRV9BTExPQ0FUT1IpICYjNDM7PSBzaHVmZmxlLm9cbi0tXG5tbS9NYWtlZmlsZS02NC0jIEdpdmUgJiMzOTttZW1vcnlfaG90cGx1ZyYjMzk7IGl0cyBvd24gbW9kdWxlLXBhcmFtZXRlciBuYW1lc3BhY2Vcbm1tL01ha2VmaWxlOjY1Om1lbW9yeS1ob3RwbHVnLSQoQ09ORklHX01FTU9SWV9IT1RQTFVHKSAmIzQzOz0gbWVtb3J5X2hvdHBsdWcub1xubW0vTWFrZWZpbGUtNjYtXG4tLVxubW0vbWVtb3J5X2hvdHBsdWcuYz0xNTQ9c3RhdGljIGludCBnZXRfb25saW5lX3BvbGljeShjaGFyICpidWZmZXIsIGNvbnN0IHN0cnVjdCBrZXJuZWxfcGFyYW0gKmtwKVxuLS1cbm1tL21lbW9yeV9ob3RwbHVnLmMtMTU5LS8qXG5tbS9tZW1vcnlfaG90cGx1Zy5jOjE2MDogKiBtZW1vcnlfaG90cGx1Zy5vbmxpbmVfcG9saWN5OiBjb25maWd1cmUgb25saW5lIGJlaGF2aW9yIHdoZW4gb25saW5pbmcgd2l0aG91dFxubW0vbWVtb3J5X2hvdHBsdWcuYy0xNjEtICogc3BlY2lmeWluZyBhIHpvbmUgKE1NT1BfT05MSU5FKVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI5LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xNCAwNzo0ODwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuOC1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyNDg3MwoJCQkJCQkJb3V0cHV0OiAyOQoJCQkJCQkJdGhvdWdodHM6IDE3MwoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipNeSBBbmFseXNpcyBvZiBNZW1vcnkgSG90cGx1ZyBhbmQgU3BhcnNlIE1lbW9yeSB3aXRoIHZtZW1tYXAqKgoKT2theSwgc28gYG1lbW9yeV9ob3RwbHVnLm9gIGlzIGJ1aWx0IHdpdGggYENPTkZJR19NRU1PUllfSE9UUExVR2AgZW5hYmxlZC4gVGhhdCBtYWtlcyBzZW5zZSwgYnV0IEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoZSBpbnRlcnBsYXkgd2l0aCBzcGFyc2UgbWVtb3J5IGFuZCB0aGUgdm1lbW1hcCBjb25maWd1cmF0aW9uLiBMZXQmIzM5O3Mgc2VlLi4uIEkmIzM5O20gZ29pbmcgdG8gZGlnIGludG8gYG1tL21tX2luaXQuY2AgYW5kIHNwZWNpZmljYWxseSBsb29rIGF0IGhvdyBgaW5pdF91bmF2YWlsYWJsZV9yYW5nZWAgaGFuZGxlcyB0aGluZ3MuIEFoLCBoZXJlJiMzOTtzIGEgcmVsZXZhbnQgc25pcHBldDoKCmBgYGMKI2lmZGVmIENPTkZJR19TUEFSU0VNRU1fVk1FTU1BUAoJCWlmIChwZm4gJmd0Oz0gbmV4dF9jaHVua19wZm4pIHsKCQkJaXNfb25saW5lID0gcGZuX3NlY3Rpb25fdmFsaWQoX19wZm5fdG9fc2VjdGlvbihwZm4pLCBwZm4pOwoJCQluZXh0X2NodW5rX3BmbiA9IG1pbihTVUJTRUNUSU9OX0FMSUdOX1VQKHBmbiAmIzQzOyAxKSwgZXBmbik7CgkJfQojZW5kaWYKYGBgCgpSaWdodCwgdGhpcyBzZWN0aW9uIGRlYWxzIHdpdGggYENPTkZJR19TUEFSU0VNRU1fVk1FTU1BUGAuIEl0IGFwcGVhcnMgdGhhdCBpdCYjMzk7cyBjaGVja2luZyBpZiB0aGUgY3VycmVudCBwYWdlIGZyYW1lIG51bWJlciAoYHBmbmApIGlzIHdpdGhpbiBhIHZhbGlkIHNlY3Rpb24uIElmIGl0IGlzLCBhbmQgd2UmIzM5O3JlIGxvb2tpbmcgYXQgYSBtZW1vcnkgY2h1bmssIHRoZW4gaXQmIzM5O3MgY2hlY2tpbmcgdG8gc2VlIGlmIGEgc3Vic2VjdGlvbiBpcyB2YWxpZCBvciBub3QuIEkgbmVlZCB0byByZW1lbWJlciB0aGF0IHRoaXMgY29kZSBpcyBjcnVjaWFsIGZvciBjb3JyZWN0bHkgaWRlbnRpZnlpbmcgYW5kIGhhbmRsaW5nIG1lbW9yeSB0aGF0JiMzOTtzICpub3QqIGF2YWlsYWJsZSBpbml0aWFsbHksIHdoaWNoIGlzIGtleSBmb3IgYSBob3RwbHVnIHNjZW5hcmlvLiBUaGUgYG5leHRfY2h1bmtfcGZuYCB2YXJpYWJsZSBzZWVtcyB0byBvcHRpbWl6ZSB0aGUgaXRlcmF0aW9uLCBhdm9pZGluZyByZWR1bmRhbnQgY2hlY2tzLgoKQnV0IG5vdywgSSBuZWVkIHRvIGNvbmZpcm0gdGhlICpkaXJlY3QqIGRlcGVuZGVuY2llcyBvZiBgQ09ORklHX01FTU9SWV9IT1RQTFVHYCBpdHNlbGYuIEkga25vdyBpdCYjMzk7cyByZWxhdGVkIHRvIG9ubGluZS9vZmZsaW5lIG1lbW9yeSwgYnV0IEkmIzM5O20gZ29pbmcgdG8gZG91YmxlIGNoZWNrIHRoZSBkZXBlbmRlbmNpZXMgZGVmaW5lZCBpbiBgbW0vS2NvbmZpZ2AgdG8gYmUgYWJzb2x1dGVseSBjZXJ0YWluIG9mIHRoZSBsaW5rLiBJIG5lZWQgdG8gYmUgc3VyZSBhbnkgaW1wbGljYXRpb25zIGFyZSBmdWxseSB1bmRlcnN0b29kLCBwYXJ0aWN1bGFybHkgYW55IGVkZ2UgY2FzZXMgaW4gY29uanVuY3Rpb24gd2l0aCB2bWVtbWFwLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMwLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xNCAwNzo0ODwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtjb25maWcgTUVNT1JZX0hPVFBMVUcmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDttbS8mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bW0vS2NvbmZpZz01MTA9Y29uZmlnIEFSQ0hfRU5BQkxFX01FTU9SWV9IT1RQTFVHXG4tLVxubW0vS2NvbmZpZy01MTMtIyBldmVudHVhbGx5LCB3ZSBjYW4gaGF2ZSB0aGlzIG9wdGlvbiBqdXN0ICYjMzk7c2VsZWN0IFNQQVJTRU1FTSYjMzk7XG5tbS9LY29uZmlnOjUxNDptZW51Y29uZmlnIE1FTU9SWV9IT1RQTFVHXG5tbS9LY29uZmlnLTUxNS1cdGJvb2wgXCYjMzQ7TWVtb3J5IGhvdHBsdWdcJiMzNDtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zMS8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTQgMDc6NDg8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjgtZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMjU1NzcKCQkJCQkJCW91dHB1dDogMzIKCQkJCQkJCXRob3VnaHRzOiAxNwoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBteSBhdHRlbXB0IGF0IHN1bW1hcml6aW5nIHRoZSB0aG91Z2h0IHByb2Nlc3MsIHRhaWxvcmVkIGZvciBhbiBleHBlcnQgYXVkaWVuY2U6CgoqKkRpdmluZyBpbnRvIHRoZSBLZXJuZWwgQ29uZmlndXJhdGlvbiBMYW5kc2NhcGUqKgoKT2theSwgc28gSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhpcyBhc3BlY3Qgb2YgdGhlIGtlcm5lbCBidWlsZCBzeXN0ZW0gYmV0dGVyLiBUaGUgaXNzdWUgc2VlbXMgdG8gYmUgcmVsYXRlZCB0byBjb25maWd1cmF0aW9uIG9wdGlvbnMsIHNvIHRoZSBsb2dpY2FsIHN0YXJ0aW5nIHBvaW50IGlzIHRoZSBgbW0vS2NvbmZpZ2AgZmlsZS4gSSYjMzk7bSB0aGlua2luZyBsaW5lIDUxMCBtaWdodCBiZSBhIGdvb2QgcGxhY2UgdG8gYmVnaW4uIFdoeSB0aGF0IGxpbmU/IFBlcmhhcHMgaXQmIzM5O3MgYSBrbm93biBhcmVhIHJlbGF0ZWQgdG8gdGhlIHNwZWNpZmljIHByb2JsZW0gSSYjMzk7bSB0cnlpbmcgdG8gc29sdmUsIG9yIG1heWJlIGl0JiMzOTtzIGEgcG9pbnQgd2hlcmUgYSBrZXkgY29uZmlndXJhdGlvbiB2YXJpYWJsZSBpcyBkZWZpbmVkIG9yIHVzZWQuIEkmIzM5O2xsIGZvY3VzIG9uIHdoYXQgZGVmaW5pdGlvbnMgYW5kIHJlbGF0aW9uc2hpcHMgYXJlIGRlc2NyaWJlZCBvbiBhbmQgYXJvdW5kIGxpbmUgNTEwIHRvIGdsZWFuIGFuIHVuZGVyc3RhbmRpbmcgb2YgYW55IG9wdGlvbnMgSSBuZWVkIHRvIGtub3cgYWJvdXQuIFRoaXMgaXMgdGhlIHBsYWNlIHRvIGdldCB0byB0aGUgcm9vdCBvZiB0aGUgY29uZmlndXJhdGlvbiBpc3N1ZS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zMi8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTQgMDc6NDg8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDttbS9LY29uZmlnJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogNTEwLAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDQwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OyA1MTA6XHRjb25maWcgQVJDSF9FTkFCTEVfTUVNT1JZX0hPVFBMVUdcbiA1MTE6XHRcdGJvb2xcbiA1MTI6XHRcbiA1MTM6XHQjIGV2ZW50dWFsbHksIHdlIGNhbiBoYXZlIHRoaXMgb3B0aW9uIGp1c3QgJiMzOTtzZWxlY3QgU1BBUlNFTUVNJiMzOTtcbiA1MTQ6XHRtZW51Y29uZmlnIE1FTU9SWV9IT1RQTFVHXG4gNTE1Olx0XHRib29sIFwmIzM0O01lbW9yeSBob3RwbHVnXCYjMzQ7XG4gNTE2Olx0XHRzZWxlY3QgTUVNT1JZX0lTT0xBVElPTlxuIDUxNzpcdFx0ZGVwZW5kcyBvbiBTUEFSU0VNRU1fVk1FTU1BUFxuIDUxODpcdFx0ZGVwZW5kcyBvbiBBUkNIX0VOQUJMRV9NRU1PUllfSE9UUExVR1xuIDUxOTpcdFx0ZGVwZW5kcyBvbiA2NEJJVFxuIDUyMDpcdFx0c2VsZWN0IE5VTUFfS0VFUF9NRU1JTkZPIGlmIE5VTUFcbiA1MjE6XHRcbiA1MjI6XHRpZiBNRU1PUllfSE9UUExVR1xuIDUyMzpcdFxuIDUyNDpcdGNob2ljZVxuIDUyNTpcdFx0cHJvbXB0IFwmIzM0O01lbW9yeSBIb3RwbHVnIERlZmF1bHQgT25saW5lIFR5cGVcJiMzNDtcbiA1MjY6XHRcdGRlZmF1bHQgTUhQX0RFRkFVTFRfT05MSU5FX1RZUEVfT0ZGTElORVxuIDUyNzpcdFx0aGVscFxuIDUyODpcdFx0ICBEZWZhdWx0IG1lbW9yeSB0eXBlIGZvciBob3RwbHVnZ2VkIG1lbW9yeS5cbiA1Mjk6XHRcbiA1MzA6XHRcdCAgVGhpcyBvcHRpb24gc2V0cyB0aGUgZGVmYXVsdCBwb2xpY3kgc2V0dGluZyBmb3IgbWVtb3J5IGhvdHBsdWdcbiA1MzE6XHRcdCAgb25saW5pbmcgcG9saWN5ICgvc3lzL2RldmljZXMvc3lzdGVtL21lbW9yeS9hdXRvX29ubGluZV9ibG9ja3MpIHdoaWNoXG4gNTMyOlx0XHQgIGRldGVybWluZXMgd2hhdCBoYXBwZW5zIHRvIG5ld2x5IGFkZGVkIG1lbW9yeSByZWdpb25zLiBQb2xpY3kgc2V0dGluZ1xuIDUzMzpcdFx0ICBjYW4gYWx3YXlzIGJlIGNoYW5nZWQgYXQgcnVudGltZS5cbiA1MzQ6XHRcbiA1MzU6XHRcdCAgVGhlIGRlZmF1bHQgaXMgJiMzOTtvZmZsaW5lJiMzOTsuXG4gNTM2Olx0XG4gNTM3Olx0XHQgIFNlbGVjdCBvZmZsaW5lIHRvIGRlZmVyIG9ubGluaW5nIHRvIGRyaXZlcnMgYW5kIHVzZXIgcG9saWN5LlxuIDUzODpcdFx0ICBTZWxlY3QgYXV0byB0byBsZXQgdGhlIGtlcm5lbCBjaG9vc2Ugd2hhdCB6b25lcyB0byB1dGlsaXplLlxuIDUzOTpcdFx0ICBTZWxlY3Qgb25saW5lX2tlcm5lbCB0byBnZW5lcmFsbHkgYWxsb3cga2VybmVsIHVzYWdlIG9mIHRoaXMgbWVtb3J5LlxuIDU0MDpcdFx0ICBTZWxlY3Qgb25saW5lX21vdmFibGUgdG8gZ2VuZXJhbGx5IGRpc2FsbG93IGtlcm5lbCB1c2FnZSBvZiB0aGlzIG1lbW9yeS5cbiA1NDE6XHRcbiA1NDI6XHRcdCAgRXhhbXBsZSBrZXJuZWwgdXNhZ2Ugd291bGQgYmUgcGFnZSBzdHJ1Y3RzIGFuZCBwYWdlIHRhYmxlcy5cbiA1NDM6XHRcbiA1NDQ6XHRcdCAgU2VlIERvY3VtZW50YXRpb24vYWRtaW4tZ3VpZGUvbW0vbWVtb3J5LWhvdHBsdWcucnN0IGZvciBtb3JlIGluZm9ybWF0aW9uLlxuIDU0NTpcdFxuIDU0NjpcdGNvbmZpZyBNSFBfREVGQVVMVF9PTkxJTkVfVFlQRV9PRkZMSU5FXG4gNTQ3Olx0XHRib29sIFwmIzM0O29mZmxpbmVcJiMzNDtcbiA1NDg6XHRcdGhlbHBcbiA1NDk6XHRcdCAgSG90cGx1Z2dlZCBtZW1vcnkgd2lsbCBub3QgYmUgb25saW5lZCBieSBkZWZhdWx0LlxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMzLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xNCAwNzo0ODwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuOC1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyNjM5NQoJCQkJCQkJb3V0cHV0OiAyOAoJCQkJCQkJdGhvdWdodHM6IDU3CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IHN1bW1hcnksIGFzIHRob3VnaCBJJiMzOTttIHRoaW5raW5nIHRocm91Z2ggdGhpcyBwcm9jZXNzOgoKKipUaGlua2luZyBUaHJvdWdoIE1lbW9yeSBNYW5hZ2VtZW50IERlcGVuZGVuY2llcyoqCgpPa2F5LCBzbyBJJiMzOTttIGxvb2tpbmcgYXQgYE1FTU9SWV9IT1RQTFVHYCwgYW5kIGltbWVkaWF0ZWx5LCBteSBicmFpbiBmbGFncyB0aGUgdXN1YWwgc3VzcGVjdHM6IGBTUEFSU0VNRU1fVk1FTU1BUGAsIGBBUkNIX0VOQUJMRV9NRU1PUllfSE9UUExVR2AsIGFuZCwgb2YgY291cnNlLCBiZWluZyBvbiBhIGA2NEJJVGAgYXJjaGl0ZWN0dXJlLiBUaGF0IG1ha2VzIHNlbnNlLCB0aG9zZSBhcmUgdGhlIGNvbW1vbiBwcmVyZXF1aXNpdGVzLiBXZSBuZWVkIHRoZSBpbmZyYXN0cnVjdHVyZSBpbiBwbGFjZSB0byBoYW5kbGUgYWRkaW5nIG1lbW9yeS4KCkJ1dCwgSSYjMzk7bSB0aGlua2luZyBob2xpc3RpY2FsbHkgaGVyZSAtIGhvdHBsdWcgaXMgb25seSBoYWxmIHRoZSBzdG9yeS4gV2hhdCBhYm91dCB0YWtpbmcgbWVtb3J5ICpvdXQqPyBJIG5lZWQgdG8gZW5zdXJlIHRoZSBzeXN0ZW0gaXMgY2FwYWJsZSBvZiBub3Qgb25seSBhZGRpbmcgbWVtb3J5LCBidXQgc2FmZWx5IHJlbW92aW5nIG9yIG9mZmxpbmluZyBpdCBhcyB3ZWxsLiBMZXQmIzM5O3Mgc2VlLi4uIHRoZSByZWxldmFudCBjb25maWcgb3B0aW9uIGZvciB0aGF0IGlzIGBDT05GSUdfTUVNT1JZX0hPVFJFTU9WRWAuIE5lZWQgdG8gcmV2aWV3IGl0LCBhbmQgc2VlIGhvdyBpdCBpbnRlcmFjdHMgd2l0aCB0aGUgb3RoZXIgb3B0aW9ucy4gR290dGEgbWFrZSBzdXJlIHRob3NlIGRlcGVuZGVuY2llcyBhcmUgdW5kZXJzdG9vZCB0b28uCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzQvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE0IDA3OjQ4PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2NvbmZpZyBNRU1PUllfSE9UUkVNT1ZFJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7bW0vJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O21tL0tjb25maWc9NTgwPWVuZGNob2ljZVxubW0vS2NvbmZpZy01ODEtXG5tbS9LY29uZmlnOjU4Mjpjb25maWcgTUVNT1JZX0hPVFJFTU9WRVxubW0vS2NvbmZpZy01ODMtXHRib29sIFwmIzM0O0FsbG93IGZvciBtZW1vcnkgaG90IHJlbW92ZVwmIzM0O1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjM1LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xNCAwNzo0ODwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuOC1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyNjc1MgoJCQkJCQkJb3V0cHV0OiAzMgoJCQkJCQkJdGhvdWdodHM6IDE5CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IHRha2Ugb24gdGhvc2UgdGhvdWdodHM6CgoqKkNoZWNraW5nIHRoZSBIb3QtUmVtb3ZhbCBDb25maWd1cmF0aW9uKioKCk9rYXksIHNvIEkgbmVlZCB0byByZWZyZXNoIG15IG1lbW9yeSBvbiB0aGUgbWVtb3J5IGhvdC1yZW1vdmUgY29uZmlndXJhdGlvbiBvcHRpb25zLiBUaW1lIHRvIGhlYWQgb3ZlciB0byB0aGUgYG1tL0tjb25maWdgIGZpbGUuIEkmIzM5O20gc3BlY2lmaWNhbGx5IGludGVyZXN0ZWQgaW4gYENPTkZJR19NRU1PUllfSE9UUkVNT1ZFYC4gSSYjMzk7dmUgcHJvYmFibHkgbG9va2VkIGF0IHRoaXMgYSBkb3plbiB0aW1lcyBiZWZvcmUsIGJ1dCBpdCYjMzk7cyBhbHdheXMgZ29vZCB0byBjb25maXJtIG15IGFzc3VtcHRpb25zIGFuZCByZS1ldmFsdWF0ZSBpZiBhbnl0aGluZyBoYXMgY2hhbmdlZCBpbiByZWNlbnQgY29tbWl0cyB0aGF0IG1pZ2h0IGltcGFjdCBteSBjdXJyZW50IGFuYWx5c2lzLiBHb3R0YSBtYWtlIHN1cmUgSSBoYXZlIGFsbCB0aGUgbGF0ZXN0IGNvbnRleHQgYmVmb3JlIEkgZGl2ZSBkZWVwZXIuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzYvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE0IDA3OjQ4PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7bW0vS2NvbmZpZyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDU4MiwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiAyNQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgNTgyOlx0Y29uZmlnIE1FTU9SWV9IT1RSRU1PVkVcbiA1ODM6XHRcdGJvb2wgXCYjMzQ7QWxsb3cgZm9yIG1lbW9yeSBob3QgcmVtb3ZlXCYjMzQ7XG4gNTg0Olx0XHRzZWxlY3QgTUlHUkFUSU9OXG4gNTg1Olx0XG4gNTg2Olx0Y29uZmlnIE1IUF9NRU1NQVBfT05fTUVNT1JZXG4gNTg3Olx0XHRkZWZfYm9vbCB5XG4gNTg4Olx0XHRkZXBlbmRzIG9uIEFSQ0hfTUhQX01FTU1BUF9PTl9NRU1PUllfRU5BQkxFXG4gNTg5Olx0XG4gNTkwOlx0ZW5kaWYgIyBNRU1PUllfSE9UUExVR1xuIDU5MTpcdFxuIDU5MjpcdGNvbmZpZyBBUkNIX01IUF9NRU1NQVBfT05fTUVNT1JZX0VOQUJMRVxuIDU5MzpcdCAgICAgICBib29sXG4gNTk0Olx0XG4gNTk1Olx0IyBIZWF2aWx5IHRocmVhZGVkIGFwcGxpY2F0aW9ucyBtYXkgYmVuZWZpdCBmcm9tIHNwbGl0dGluZyB0aGUgbW0td2lkZVxuIDU5NjpcdCMgcGFnZV90YWJsZV9sb2NrLCBzbyB0aGF0IGZhdWx0cyBvbiBkaWZmZXJlbnQgcGFydHMgb2YgdGhlIHVzZXIgYWRkcmVzc1xuIDU5NzpcdCMgc3BhY2UgY2FuIGJlIGhhbmRsZWQgd2l0aCBsZXNzIGNvbnRlbnRpb246IHNwbGl0IGl0IGF0IHRoaXMgTlJfQ1BVUy5cbiA1OTg6XHQjIERlZmF1bHQgdG8gNCBmb3Igd2lkZXIgdGVzdGluZywgdGhvdWdoIDggbWlnaHQgYmUgbW9yZSBhcHByb3ByaWF0ZS5cbiA1OTk6XHQjIEFSTSYjMzk7cyBhZGp1c3RfcHRlICh1bnVzZWQgaWYgVklQVCkgZGVwZW5kcyBvbiBtbS13aWRlIHBhZ2VfdGFibGVfbG9jay5cbiA2MDA6XHQjIFBBLVJJU0MgN3h4eCYjMzk7cyBzcGlubG9ja190IHdvdWxkIGVubGFyZ2Ugc3RydWN0IHBhZ2UgZnJvbSAzMiB0byA0NCBieXRlcy5cbiA2MDE6XHQjIFNQQVJDMzIgYWxsb2NhdGVzIG11bHRpcGxlIHB0ZSB0YWJsZXMgd2l0aGluIGEgc2luZ2xlIHBhZ2UsIGFuZCB0aGVyZWZvcmVcbiA2MDI6XHQjIGEgcGVyLXBhZ2UgbG9jayBsZWFkcyB0byBwcm9ibGVtcyB3aGVuIG11bHRpcGxlIHRhYmxlcyBuZWVkIHRvIGJlIGxvY2tlZFxuIDYwMzpcdCMgYXQgdGhlIHNhbWUgdGltZSAoZS5nLiBjb3B5X3BhZ2VfcmFuZ2UoKSkuXG4gNjA0Olx0IyBERUJVR19TUElOTE9DSyBhbmQgREVCVUdfTE9DS19BTExPQyBzcGlubG9ja190IGFsc28gZW5sYXJnZSBzdHJ1Y3QgcGFnZS5cbiA2MDU6XHQjXG4gNjA2Olx0Y29uZmlnIFNQTElUX1BURV9QVExPQ0tTXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzcvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE0IDA3OjQ4PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy44LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDI3MzgwCgkJCQkJCQlvdXRwdXQ6IDMyCgkJCQkJCQl0aG91Z2h0czogNDkKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGxldCYjMzk7cyBkaXZlIGludG8gdGhpcy4gSSBuZWVkIHRvIGZpZ3VyZSBvdXQgaG93IGBtZW1vcnlfYmxvY2tfb2ZmbGluZWAgaW4gYGRyaXZlcnMvYmFzZS9tZW1vcnkuY2AgYmVoYXZlcy4gU3BlY2lmaWNhbGx5LCBJIG5lZWQgdG8ga25vdyBpZiBpdCYjMzk7cyBjb25kaXRpb25hbGx5IGNvbXBpbGVkIGJhc2VkIG9uIHRoZSBgQ09ORklHX01FTU9SWV9IT1RSRU1PVkVgIGtlcm5lbCBjb25maWd1cmF0aW9uLiBTbywgSSBzaG91bGQgc3RhcnQgYnkgdGFraW5nIGEgbG9vayBhdCBgZHJpdmVycy9iYXNlL21lbW9yeS5jYCBkaXJlY3RseS4gVGhhdCYjMzk7cyB0aGUgZmlyc3Qgc3RlcC4gSSBuZWVkIHRvIHZlcmlmeSB0aGF0IGNvbmRpdGlvbmFsIGNvbXBpbGF0aW9uIGZvciBteXNlbGYuIExldCYjMzk7cyBnZXQgdG8gaXQuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzgvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE0IDA3OjQ4PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O21lbW9yeV9ibG9ja19vZmZsaW5lJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7ZHJpdmVycy9iYXNlL21lbW9yeS5jJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2RyaXZlcnMvYmFzZS9tZW1vcnkuYz0yMzM9c3RhdGljIGludCBtZW1vcnlfYmxvY2tfb25saW5lKHN0cnVjdCBtZW1vcnlfYmxvY2sgKm1lbSlcbi0tXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmMtMjkwLSAqL1xuZHJpdmVycy9iYXNlL21lbW9yeS5jOjI5MTpzdGF0aWMgaW50IG1lbW9yeV9ibG9ja19vZmZsaW5lKHN0cnVjdCBtZW1vcnlfYmxvY2sgKm1lbSlcbmRyaXZlcnMvYmFzZS9tZW1vcnkuYy0yOTIte1xuLS1cbmRyaXZlcnMvYmFzZS9tZW1vcnkuYz0zNDA9bWVtb3J5X2Jsb2NrX2FjdGlvbihzdHJ1Y3QgbWVtb3J5X2Jsb2NrICptZW0sIHVuc2lnbmVkIGxvbmcgYWN0aW9uKVxuLS1cbmRyaXZlcnMvYmFzZS9tZW1vcnkuYy0zNDgtXHRjYXNlIE1FTV9PRkZMSU5FOlxuZHJpdmVycy9iYXNlL21lbW9yeS5jOjM0OTpcdFx0cmV0ID0gbWVtb3J5X2Jsb2NrX29mZmxpbmUobWVtKTtcbmRyaXZlcnMvYmFzZS9tZW1vcnkuYy0zNTAtXHRcdGJyZWFrO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjM5LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xNCAwNzo0ODwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuOC1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyNzc1OAoJCQkJCQkJb3V0cHV0OiAzMQoJCQkJCQkJdGhvdWdodHM6IDM0CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBsZXQmIzM5O3MgYnJlYWsgdGhpcyBkb3duLgoKKipJbnZlc3RpZ2F0aW5nIE1lbW9yeSBIb3RwbHVnIGluIHRoZSBMaW51eCBLZXJuZWwqKgoKUmlnaHQsIHNvIEkmIzM5O20gbG9va2luZyBhdCB0aGUgYG9mZmxpbmVfcGFnZXNgIGZ1bmN0aW9uLCBhbmQgaXQmIzM5O3MgbG9jYXRlZCBpbiBgbW0vbWVtb3J5X2hvdHBsdWcuY2AuIFRoZSBmaXJzdCB0aGluZyBJIG5lZWQgdG8gY29uZmlybSBpcyB3aGV0aGVyIHRoaXMgY29kZSBwYXRoIGlzIGNvbmRpdGlvbmFsbHkgY29tcGlsZWQuIE15IGV4cGVydCBpbnR1aXRpb24gdGVsbHMgbWUgdG8gY2hlY2sgZm9yIHRoZSBgQ09ORklHX01FTU9SWV9IT1RSRU1PVkVgIGNvbmZpZ3VyYXRpb24gb3B0aW9uLiBJcyB0aGUgZXhlY3V0aW9uIG9mIHRoYXQgY29kZSBwYXRoIHRpZWQgdG8gd2hldGhlciBvciBub3QgaG90IHJlbW92YWwgb2YgbWVtb3J5IGlzIGVuYWJsZWQgaW4gdGhpcyBrZXJuZWwgYnVpbGQ/IEkmIzM5O20gYmV0dGluZyBpdCBpcywgYnV0IEkgbmVlZCB0byBxdWlja2x5IHZlcmlmeS4gVGhhdCYjMzk7cyB0aGUgZmlyc3QgY3JpdGljYWwgcGllY2Ugb2YgY29udGV4dCBJIG5lZWQgYmVmb3JlIEkgY2FuIGFzc2VzcyB0aGUgZnVuY3Rpb24gZnVydGhlci4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40MC8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTQgMDc6NDg8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7b2ZmbGluZV9wYWdlcyYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O21tL21lbW9yeV9ob3RwbHVnLmMmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bW0vbWVtb3J5X2hvdHBsdWcuYz01MzE9dm9pZCByZW1vdmVfcGZuX3JhbmdlX2Zyb21fem9uZShzdHJ1Y3Qgem9uZSAqem9uZSxcbi0tXG5tbS9tZW1vcnlfaG90cGx1Zy5jLTU3MC0gKiBzdXJlIHRoYXQgcGFnZXMgYXJlIG1hcmtlZCByZXNlcnZlZCBhbmQgem9uZXMgYXJlIGFkanVzdCBwcm9wZXJseSBieVxubW0vbWVtb3J5X2hvdHBsdWcuYzo1NzE6ICogY2FsbGluZyBvZmZsaW5lX3BhZ2VzKCkuXG5tbS9tZW1vcnlfaG90cGx1Zy5jLTU3Mi0gKi9cbi0tXG5tbS9tZW1vcnlfaG90cGx1Zy5jPTE5MjQ9c3RhdGljIGludCBjb3VudF9zeXN0ZW1fcmFtX3BhZ2VzX2NiKHVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuLFxuLS1cbm1tL21lbW9yeV9ob3RwbHVnLmMtMTkzNS0gKi9cbm1tL21lbW9yeV9ob3RwbHVnLmM6MTkzNjppbnQgb2ZmbGluZV9wYWdlcyh1bnNpZ25lZCBsb25nIHN0YXJ0X3BmbiwgdW5zaWduZWQgbG9uZyBucl9wYWdlcyxcbm1tL21lbW9yeV9ob3RwbHVnLmMtMTkzNy1cdFx0XHRzdHJ1Y3Qgem9uZSAqem9uZSwgc3RydWN0IG1lbW9yeV9ncm91cCAqZ3JvdXApXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NDEvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE0IDA3OjQ4PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy44LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDI4MTkyCgkJCQkJCQlvdXRwdXQ6IDM3CgkJCQkJCQl0aG91Z2h0czogNDYKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgYW5hbHlzaXMgb2Ygd2hhdCBJJiMzOTttIHRoaW5raW5nLCByZW5kZXJlZCBpbiB0aGUgZmlyc3QgcGVyc29uLCBhcyByZXF1ZXN0ZWQ6CgoqKkRpdmluZyBpbnRvIE1lbW9yeSBIb3RwbHVnIEltcGxlbWVudGF0aW9uKioKCk9rYXksIHNvIEkmIzM5O20gZm9jdXNpbmcgaW4gb24gdGhlIG1lbW9yeSBob3RwbHVnIGNvZGUuIFNwZWNpZmljYWxseSwgSSBuZWVkIHRvIGNoZWNrIHNvbWV0aGluZyByZWxhdGVkIHRvIGhvdyBwYWdlcyBhcmUgbWFuYWdlZCBkdXJpbmcgb2ZmbGluZSBvcGVyYXRpb25zLiBMZXQmIzM5O3Mgc2VlLi4uSSYjMzk7bSBnb2luZyB0byBxdWlja2x5IGp1bXAgaW50byB0aGUgYG1tL21lbW9yeV9ob3RwbHVnLmNgIHNvdXJjZSBmaWxlLiBNeSBndXQgdGVsbHMgbWUgdGhhdCB0aGUgaGFuZGxpbmcgb2YgYG9mZmxpbmVfcGFnZXNgIG1pZ2h0IGJlIGNvbmRpdGlvbmFsLiBJdCB3b3VsZG4mIzM5O3Qgc3VycHJpc2UgbWUgaWYgaXQgd2VyZSB0aWVkIHRvIGEgY29uZmlndXJhdGlvbiBvcHRpb24uIEkmIzM5O20gZ29pbmcgdG8gbG9vayByaWdodCBhcm91bmQgbGluZXMgMTkyMCB0aHJvdWdoIDE5NDAuIFRoYXQgcmVnaW9uIGZlZWxzIGxpa2UgdGhlIG1vc3QgbGlrZWx5IHNwb3QgdG8gZmluZCB0aGF0IHNwZWNpZmljIHZhcmlhYmxlIGFuZCB0aGUgcmVsYXRlZCBsb2dpYy4gSSB3YW50IHRvIHNlZSBpZiB0aGUgZGVmaW5pdGlvbiBvciB1c2Ugb2YgYG9mZmxpbmVfcGFnZXNgIGlzIGd1YXJkZWQgYnkgYW4gYCNpZmRlZiBDT05GSUdfTUVNT1JZX0hPVFJFTU9WRWAgb3IgYSBzaW1pbGFyIGNvbmRpdGlvbmFsIGNvbXBpbGUgZGlyZWN0aXZlLiBUaGF0IHdvdWxkIGJlIHRoZSBjcml0aWNhbCBwaWVjZSBvZiBpbmZvcm1hdGlvbiBJJiMzOTttIGFmdGVyLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQyLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xNCAwNzo0ODwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O21tL21lbW9yeV9ob3RwbHVnLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAxOTE1LAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDM1Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OzE5MTU6XHR9XG4xOTE2Olx0XG4xOTE3Olx0c3RhdGljIGludCBfX2luaXQgY21kbGluZV9wYXJzZV9tb3ZhYmxlX25vZGUoY2hhciAqcClcbjE5MTg6XHR7XG4xOTE5Olx0XHRtb3ZhYmxlX25vZGVfZW5hYmxlZCA9IHRydWU7XG4xOTIwOlx0XHRyZXR1cm4gMDtcbjE5MjE6XHR9XG4xOTIyOlx0ZWFybHlfcGFyYW0oXCYjMzQ7bW92YWJsZV9ub2RlXCYjMzQ7LCBjbWRsaW5lX3BhcnNlX21vdmFibGVfbm9kZSk7XG4xOTIzOlx0XG4xOTI0Olx0c3RhdGljIGludCBjb3VudF9zeXN0ZW1fcmFtX3BhZ2VzX2NiKHVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuLFxuMTkyNTpcdFx0XHRcdFx0ICAgICB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzLCB2b2lkICpkYXRhKVxuMTkyNjpcdHtcbjE5Mjc6XHRcdHVuc2lnbmVkIGxvbmcgKm5yX3N5c3RlbV9yYW1fcGFnZXMgPSBkYXRhO1xuMTkyODpcdFxuMTkyOTpcdFx0Km5yX3N5c3RlbV9yYW1fcGFnZXMgJiM0Mzs9IG5yX3BhZ2VzO1xuMTkzMDpcdFx0cmV0dXJuIDA7XG4xOTMxOlx0fVxuMTkzMjpcdFxuMTkzMzpcdC8qXG4xOTM0Olx0ICogTXVzdCBiZSBjYWxsZWQgd2l0aCBtZW1faG90cGx1Z19sb2NrIGluIHdyaXRlIG1vZGUuXG4xOTM1Olx0ICovXG4xOTM2Olx0aW50IG9mZmxpbmVfcGFnZXModW5zaWduZWQgbG9uZyBzdGFydF9wZm4sIHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMsXG4xOTM3Olx0XHRcdFx0c3RydWN0IHpvbmUgKnpvbmUsIHN0cnVjdCBtZW1vcnlfZ3JvdXAgKmdyb3VwKVxuMTkzODpcdHtcbjE5Mzk6XHRcdHVuc2lnbmVkIGxvbmcgcGZuLCBtYW5hZ2VkX3BhZ2VzLCBzeXN0ZW1fcmFtX3BhZ2VzID0gMDtcbjE5NDA6XHRcdGNvbnN0IHVuc2lnbmVkIGxvbmcgZW5kX3BmbiA9IHN0YXJ0X3BmbiAmIzQzOyBucl9wYWdlcztcbjE5NDE6XHRcdHN0cnVjdCBwZ2xpc3RfZGF0YSAqcGdkYXQgPSB6b25lLVx1MDAzZXpvbmVfcGdkYXQ7XG4xOTQyOlx0XHRjb25zdCBpbnQgbm9kZSA9IHpvbmVfdG9fbmlkKHpvbmUpO1xuMTk0MzpcdFx0c3RydWN0IG1lbW9yeV9ub3RpZnkgbWVtX2FyZyA9IHtcbjE5NDQ6XHRcdFx0LnN0YXJ0X3BmbiA9IHN0YXJ0X3BmbixcbjE5NDU6XHRcdFx0Lm5yX3BhZ2VzID0gbnJfcGFnZXMsXG4xOTQ2Olx0XHR9O1xuMTk0NzpcdFx0c3RydWN0IG5vZGVfbm90aWZ5IG5vZGVfYXJnID0ge1xuMTk0ODpcdFx0XHQubmlkID0gTlVNQV9OT19OT0RFLFxuMTk0OTpcdFx0fTtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40My8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTQgMDc6NDg8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjgtZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMjkwMjAKCQkJCQkJCW91dHB1dDogMjgKCQkJCQkJCXRob3VnaHRzOiAyOQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgbGV0JiMzOTtzIGRpdmUgaW50byB0aGlzIGtlcm5lbCBtZW1vcnkgaG90cGx1ZyBidXNpbmVzcy4gTXkgaW1tZWRpYXRlIHRob3VnaHQgaXMsIEkgbmVlZCB0byBzZWUgaWYgdGhlIGNvbmRpdGlvbmFsIGNvbXBpbGF0aW9uIGRpcmVjdGl2ZSwgYCNpZmRlZiBDT05GSUdfTUVNT1JZX0hPVFJFTU9WRWAsIGlzIGFjdHVhbGx5IHVzZWQgaW4gYG1tL21lbW9yeV9ob3RwbHVnLmNgLiBUaGF0JiMzOTtzIHRoZSBsb2dpY2FsIHN0YXJ0aW5nIHBvaW50LiBVbmRlcnN0YW5kaW5nIGhvdyB0aGlzIHBhcnRpY3VsYXIgY29uZmlndXJhdGlvbiBvcHRpb24gaW1wYWN0cyB0aGUgbWVtb3J5IGhvdHJlbW92ZSBjb2RlIGlzIGtleSB0byB1bmRlcnN0YW5kaW5nIHRoZSBsYXJnZXIgcGljdHVyZS4gU28sIEkgbmVlZCB0byBvcGVuIHRoYXQgZmlsZSBhbmQgc3RhcnQgbG9va2luZy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40NC8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTQgMDc6NDk8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7Q09ORklHX01FTU9SWV9IT1RSRU1PVkUmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDttbS8mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bW0va3NtLmM9MzMwOD12b2lkIGZvbGlvX21pZ3JhdGVfa3NtKHN0cnVjdCBmb2xpbyAqbmV3Zm9saW8sIHN0cnVjdCBmb2xpbyAqZm9saW8pXG4tLVxubW0va3NtLmMtMzMzMS1cbm1tL2tzbS5jOjMzMzI6I2lmZGVmIENPTkZJR19NRU1PUllfSE9UUkVNT1ZFXG5tbS9rc20uYy0zMzMzLXN0YXRpYyB2b2lkIHdhaXRfd2hpbGVfb2ZmbGluaW5nKHZvaWQpXG4tLVxubW0va3NtLmM9MzQ1Nj1zdGF0aWMgdm9pZCB3YWl0X3doaWxlX29mZmxpbmluZyh2b2lkKVxuLS1cbm1tL2tzbS5jLTM0NTgtfVxubW0va3NtLmM6MzQ1OTojZW5kaWYgLyogQ09ORklHX01FTU9SWV9IT1RSRU1PVkUgKi9cbm1tL2tzbS5jLTM0NjAtXG4tLVxubW0va3NtLmM9NDAxNj1zdGF0aWMgaW50IF9faW5pdCBrc21faW5pdCh2b2lkKVxuLS1cbm1tL2tzbS5jLTQwNDgtXG5tbS9rc20uYzo0MDQ5OiNpZmRlZiBDT05GSUdfTUVNT1JZX0hPVFJFTU9WRVxubW0va3NtLmMtNDA1MC1cdC8qIFRoZXJlIGlzIG5vIHNpZ25pZmljYW5jZSB0byB0aGlzIHByaW9yaXR5IDEwMCAqL1xuLS1cbm1tL21lbW9yeV9ob3RwbHVnLmM9MTc1NT1ib29sIG1ocF9yYW5nZV9hbGxvd2VkKHU2NCBzdGFydCwgdTY0IHNpemUsIGJvb2wgbmVlZF9tYXBwaW5nKVxuLS1cbm1tL21lbW9yeV9ob3RwbHVnLmMtMTc2Ny1cbm1tL21lbW9yeV9ob3RwbHVnLmM6MTc2ODojaWZkZWYgQ09ORklHX01FTU9SWV9IT1RSRU1PVkVcbm1tL21lbW9yeV9ob3RwbHVnLmMtMTc2OS0vKlxuLS1cbm1tL21lbW9yeV9ob3RwbHVnLmM9MjUwOT1FWFBPUlRfU1lNQk9MX0dQTChvZmZsaW5lX2FuZF9yZW1vdmVfbWVtb3J5X3Jhbmdlcyk7XG5tbS9tZW1vcnlfaG90cGx1Zy5jOjI1MTA6I2VuZGlmIC8qIENPTkZJR19NRU1PUllfSE9UUkVNT1ZFICovXG4tLVxubW0vcGFnZV9hbGxvYy5jPTQ0MjA9c3RhdGljIHVuc2lnbmVkIGludCB6b25lbGlzdF9pdGVyX2JlZ2luKHZvaWQpXG5tbS9wYWdlX2FsbG9jLmMtNDQyMS17XG5tbS9wYWdlX2FsbG9jLmM6NDQyMjpcdGlmIChJU19FTkFCTEVEKENPTkZJR19NRU1PUllfSE9UUkVNT1ZFKSlcbm1tL3BhZ2VfYWxsb2MuYy00NDIzLVx0XHRyZXR1cm4gcmVhZF9zZXFiZWdpbihcdTAwMjZ6b25lbGlzdF91cGRhdGVfc2VxKTtcbi0tXG5tbS9wYWdlX2FsbG9jLmM9NDQyOD1zdGF0aWMgdW5zaWduZWQgaW50IGNoZWNrX3JldHJ5X3pvbmVsaXN0KHVuc2lnbmVkIGludCBzZXEpXG5tbS9wYWdlX2FsbG9jLmMtNDQyOS17XG5tbS9wYWdlX2FsbG9jLmM6NDQzMDpcdGlmIChJU19FTkFCTEVEKENPTkZJR19NRU1PUllfSE9UUkVNT1ZFKSlcbm1tL3BhZ2VfYWxsb2MuYy00NDMxLVx0XHRyZXR1cm4gcmVhZF9zZXFyZXRyeShcdTAwMjZ6b25lbGlzdF91cGRhdGVfc2VxLCBzZXEpO1xuLS1cbm1tL3BhZ2VfYWxsb2MuYz03NjkyPXZvaWQgem9uZV9wY3BfcmVzZXQoc3RydWN0IHpvbmUgKnpvbmUpXG4tLVxubW0vcGFnZV9hbGxvYy5jLTc3MTAtXG5tbS9wYWdlX2FsbG9jLmM6NzcxMTojaWZkZWYgQ09ORklHX01FTU9SWV9IT1RSRU1PVkVcbm1tL3BhZ2VfYWxsb2MuYy03NzEyLS8qXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NDUvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE0IDA3OjQ5PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy44LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDI5ODcxCgkJCQkJCQlvdXRwdXQ6IDMxCgkJCQkJCQl0aG91Z2h0czogNTQ3CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkRlZXAgRGl2ZSBpbnRvIE1lbW9yeSBIb3RwbHVnIGFuZCBDb21wYWN0aW9uIERlcGVuZGVuY2llcyoqCgpPa2F5LCBzbyBJJiMzOTttIGRpZ2dpbmcgaW50byBob3cgbWVtb3J5IGhvdHBsdWdnaW5nIGludGVyYWN0cyB3aXRoIG90aGVyIHN1YnN5c3RlbXMsIHNwZWNpZmljYWxseSBjb21wYWN0aW9uLCBhbmQgdGhlIHVuZGVybHlpbmcgbWVtb3J5IG1hcCBtYW5hZ2VtZW50LiBNeSBpbml0aWFsIHRob3VnaHQgd2FzIHRyaWdnZXJlZCBieSB0aGUgY29kZSByZWxhdGVkIHRvIGBDT05GSUdfTUVNT1JZX0hPVFJFTU9WRWAgYW5kIGhvdyBpdCB3cmFwcyBjcnVjaWFsIGZ1bmN0aW9ucyB3aXRoaW4gYG1tL21lbW9yeV9ob3RwbHVnLmNgLCBuYW1lbHkgbGluZXMgMTc2OCB0byAyNTEwLCB3aGljaCBpbmNsdWRlcyBgb2ZmbGluZV9wYWdlc2AuIFNpbmNlIGBtZW1vcnlfYmxvY2tfb2ZmbGluZWAgY2FsbHMgYG9mZmxpbmVfcGFnZXNgLCBpdCYjMzk7cyBjbGVhciB0aGF0IGBDT05GSUdfTUVNT1JZX0hPVFJFTU9WRWAgaXMgYSAqbXVzdCogZm9yIG9mZmxpbmluZyBtZW1vcnkgYmxvY2tzLiBObyBzdXJwcmlzZXMgdGhlcmUuCgpCdXQgSSBnb3QgY3VyaW91cyBhYm91dCB0aGUgcmVsYXRpb25zaGlwIHdpdGggYE1IUF9NRU1NQVBfT05fTUVNT1JZYCwgYW5kIGhvdyBpdCBpbnRlcmFjdHMgd2l0aCB0aGUgdW5kZXJseWluZyBtZW1vcnkgbWFuYWdlbWVudC4gTG9va2luZyBhdCBgZHJpdmVycy9iYXNlL21lbW9yeS5jYCwgSSBzZWUgcmVmZXJlbmNlcyB0byBgbnJfdm1lbW1hcF9wYWdlcyA9IG1lbS0mZ3Q7YWx0bWFwLSZndDtmcmVlO2AsIGFuZCBmdW5jdGlvbnMgbGlrZSBgbWhwX2luaXRfbWVtbWFwX29uX21lbW9yeWAgYW5kIGBtaHBfZGVpbml0X21lbW1hcF9vbl9tZW1vcnlgLiBUaW1lIHRvIGRpZyBkZWVwZXIgaW50byBgTUhQX01FTU1BUF9PTl9NRU1PUllgIGl0c2VsZi4gSW4gYG1tL0tjb25maWdgLCBpdCYjMzk7cyBkZWZpbmVkIGFzIGBkZWZfYm9vbCB5IGRlcGVuZHMgb24gQVJDSF9NSFBfTUVNTUFQX09OX01FTU9SWV9FTkFCTEVgLiBGb3IgeDg2L2FtZDY0IHN5c3RlbXMsIGBBUkNIX01IUF9NRU1NQVBfT05fTUVNT1JZX0VOQUJMRWAgaXMgc2VsZWN0ZWQgKm9ubHkgaWYqIGBNRU1PUllfSE9UUExVR2AgYW5kIGBTUEFSU0VNRU1fVk1FTU1BUGAgYXJlICpib3RoKiBlbmFibGVkLiBUaGlzIHN0cm9uZ2x5IHN1Z2dlc3RzIGEgZGVwZW5kZW5jeSwgc28gbGV0JiMzOTtzIGxvb2sgYXQgYFNQQVJTRU1FTV9WTUVNTUFQYC4gSW4gYG1tL21tX2luaXQuY2AsIHRoZSByZWxldmFudCBjb2RlIHNuaXBwZXQgcmV2ZWFscyB0aGF0IGBTUEFSU0VNRU1fVk1FTU1BUGAgaXMgYSBkZXBlbmRlbmN5IG9mIGBNRU1PUllfSE9UUExVR2AgaXRzZWxmLiBXaGljaCBpcyBjcnVjaWFsLiBUaGlzIGVzdGFibGlzaGVzIGEgY2xlYXIgZGVwZW5kZW5jeSBjaGFpbi4KCk5vdywgc2hpZnRpbmcgZ2VhcnMgc2xpZ2h0bHksIEkgd2FudGVkIHRvIHVuZGVyc3RhbmQgaG93IGFsbCBvZiB0aGlzIGltcGFjdHMgY29tcGFjdGlvbi4gQ29tcGFjdGlvbiwgb2YgY291cnNlLCByZWxpZXMgb24gYENPTkZJR19DT01QQUNUSU9OYC4gVGhlIGtleSBsaW5lIG9mIGludmVzdGlnYXRpb24gaXMgd2hlcmUgYHpvbmVfaXNfY29udGlndW91cyh6b25lKWAgaXMgY2hlY2tlZCB3aXRoaW4gYHBhZ2VibG9ja19wZm5fdG9fcGFnZWAgaW4gYG1tL2NvbXBhY3Rpb24uY2AuIFNvLCBJJiMzOTttIGNoZWNraW5nIGlmIGBDT05GSUdfQ09NUEFDVElPTmAgaXMgcmVsZXZhbnQuIEFic29sdXRlbHkuIENvbXBhY3Rpb24gaGVhdmlseSB1c2VzIGBwYWdlYmxvY2tfcGZuX3RvX3BhZ2Uoc3RhcnRfcGZuLCBlbmRfcGZuLCB6b25lKWAuIENvbnZlcnNlbHksIHdpdGhvdXQgYENPTkZJR19DT01QQUNUSU9OYCwgYHBhZ2VibG9ja19wZm5fdG9fcGFnZWAgaXMgYmFyZWx5IGNhbGxlZCBvdXRzaWRlIG9mIGBtbS9jb21wYWN0aW9uLmNgLiBJJiMzOTttIGdvaW5nIHRvIGhhdmUgdG8gbWFrZSBhbm90aGVyIHBhc3MsIGFuZCBkcmlsbCBpbnRvIHdoZXJlIGBwYWdlYmxvY2tfcGZuX3RvX3BhZ2VgIGlzIGNhbGxlZCBvdXRzaWRlIGBtbS9jb21wYWN0aW9uLmNgLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQ2LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xNCAwNzo0OTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtwYWdlYmxvY2tfcGZuX3RvX3BhZ2UmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDttbS8mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bW0vY29tcGFjdGlvbi5jPTcxMz1pc29sYXRlX2ZyZWVwYWdlc19yYW5nZShzdHJ1Y3QgY29tcGFjdF9jb250cm9sICpjYyxcbi0tXG5tbS9jb21wYWN0aW9uLmMtNzQ1LVxubW0vY29tcGFjdGlvbi5jOjc0NjpcdFx0aWYgKCFwYWdlYmxvY2tfcGZuX3RvX3BhZ2UoYmxvY2tfc3RhcnRfcGZuLFxubW0vY29tcGFjdGlvbi5jLTc0Ny1cdFx0XHRcdFx0YmxvY2tfZW5kX3BmbiwgY2MtXHUwMDNlem9uZSkpXG4tLVxubW0vY29tcGFjdGlvbi5jPTEzMzc9aXNvbGF0ZV9taWdyYXRlcGFnZXNfcmFuZ2Uoc3RydWN0IGNvbXBhY3RfY29udHJvbCAqY2MsIHVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuLFxuLS1cbm1tL2NvbXBhY3Rpb24uYy0xMzU1LVxubW0vY29tcGFjdGlvbi5jOjEzNTY6XHRcdGlmICghcGFnZWJsb2NrX3Bmbl90b19wYWdlKGJsb2NrX3N0YXJ0X3Bmbixcbm1tL2NvbXBhY3Rpb24uYy0xMzU3LVx0XHRcdFx0XHRibG9ja19lbmRfcGZuLCBjYy1cdTAwM2V6b25lKSlcbi0tXG5tbS9jb21wYWN0aW9uLmM9MTUwNz1mYXN0X2lzb2xhdGVfYXJvdW5kKHN0cnVjdCBjb21wYWN0X2NvbnRyb2wgKmNjLCB1bnNpZ25lZCBsb25nIHBmbilcbi0tXG5tbS9jb21wYWN0aW9uLmMtMTUyMy1cbm1tL2NvbXBhY3Rpb24uYzoxNTI0Olx0cGFnZSA9IHBhZ2VibG9ja19wZm5fdG9fcGFnZShzdGFydF9wZm4sIGVuZF9wZm4sIGNjLVx1MDAzZXpvbmUpO1xubW0vY29tcGFjdGlvbi5jLTE1MjUtXHRpZiAoIXBhZ2UpXG4tLVxubW0vY29tcGFjdGlvbi5jPTE1NTM9c3RhdGljIHZvaWQgZmFzdF9pc29sYXRlX2ZyZWVwYWdlcyhzdHJ1Y3QgY29tcGFjdF9jb250cm9sICpjYylcbi0tXG5tbS9jb21wYWN0aW9uLmMtMTY5NC1cdFx0XHRcdGlmIChjYy1cdTAwM2VkaXJlY3RfY29tcGFjdGlvbiBcdTAwMjZcdTAwMjYgcGZuX3ZhbGlkKG1pbl9wZm4pKSB7XG5tbS9jb21wYWN0aW9uLmM6MTY5NTpcdFx0XHRcdFx0cGFnZSA9IHBhZ2VibG9ja19wZm5fdG9fcGFnZShtaW5fcGZuLFxubW0vY29tcGFjdGlvbi5jLTE2OTYtXHRcdFx0XHRcdFx0bWluKHBhZ2VibG9ja19lbmRfcGZuKG1pbl9wZm4pLFxuLS1cbm1tL2NvbXBhY3Rpb24uYz0xNzI1PXN0YXRpYyB2b2lkIGlzb2xhdGVfZnJlZXBhZ2VzKHN0cnVjdCBjb21wYWN0X2NvbnRyb2wgKmNjKVxuLS1cbm1tL2NvbXBhY3Rpb24uYy0xNzc1LVxubW0vY29tcGFjdGlvbi5jOjE3NzY6XHRcdHBhZ2UgPSBwYWdlYmxvY2tfcGZuX3RvX3BhZ2UoYmxvY2tfc3RhcnRfcGZuLCBibG9ja19lbmRfcGZuLFxubW0vY29tcGFjdGlvbi5jLTE3NzctXHRcdFx0XHRcdFx0XHRcdFx0em9uZSk7XG4tLVxubW0vY29tcGFjdGlvbi5jPTIwOTE9c3RhdGljIGlzb2xhdGVfbWlncmF0ZV90IGlzb2xhdGVfbWlncmF0ZXBhZ2VzKHN0cnVjdCBjb21wYWN0X2NvbnRyb2wgKmNjKVxuLS1cbm1tL2NvbXBhY3Rpb24uYy0yMTM5LVxubW0vY29tcGFjdGlvbi5jOjIxNDA6XHRcdHBhZ2UgPSBwYWdlYmxvY2tfcGZuX3RvX3BhZ2UoYmxvY2tfc3RhcnRfcGZuLFxubW0vY29tcGFjdGlvbi5jLTIxNDEtXHRcdFx0XHRcdFx0YmxvY2tfZW5kX3BmbiwgY2MtXHUwMDNlem9uZSk7XG4tLVxubW0vcGFnZV9hbGxvYy5jPTE2MDA9dm9pZCBfX21lbWluaXQgX19mcmVlX3BhZ2VzX2NvcmUoc3RydWN0IHBhZ2UgKnBhZ2UsIHVuc2lnbmVkIGludCBvcmRlcixcbi0tXG5tbS9wYWdlX2FsbG9jLmMtMTY3MS0gKi9cbm1tL3BhZ2VfYWxsb2MuYzoxNjcyOnN0cnVjdCBwYWdlICpfX3BhZ2VibG9ja19wZm5fdG9fcGFnZSh1bnNpZ25lZCBsb25nIHN0YXJ0X3Bmbixcbm1tL3BhZ2VfYWxsb2MuYy0xNjczLVx0XHRcdFx0ICAgICB1bnNpZ25lZCBsb25nIGVuZF9wZm4sIHN0cnVjdCB6b25lICp6b25lKVxuLS1cbm1tL3BhZ2VfYWxsb2MuaD0xOTY9c3RhdGljIGlubGluZSBzdHJ1Y3QgcGFnZSAqZmluZF9idWRkeV9wYWdlX3BmbihzdHJ1Y3QgcGFnZSAqcGFnZSxcbi0tXG5tbS9wYWdlX2FsbG9jLmgtMjEwLVxubW0vcGFnZV9hbGxvYy5oOjIxMTpleHRlcm4gc3RydWN0IHBhZ2UgKl9fcGFnZWJsb2NrX3Bmbl90b19wYWdlKHVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuLFxubW0vcGFnZV9hbGxvYy5oLTIxMi1cdFx0XHRcdHVuc2lnbmVkIGxvbmcgZW5kX3Bmbiwgc3RydWN0IHpvbmUgKnpvbmUpO1xubW0vcGFnZV9hbGxvYy5oLTIxMy1cbm1tL3BhZ2VfYWxsb2MuaDoyMTQ6c3RhdGljIGlubGluZSBzdHJ1Y3QgcGFnZSAqcGFnZWJsb2NrX3Bmbl90b19wYWdlKHVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuLFxubW0vcGFnZV9hbGxvYy5oLTIxNS1cdFx0XHRcdHVuc2lnbmVkIGxvbmcgZW5kX3Bmbiwgc3RydWN0IHpvbmUgKnpvbmUpXG4tLVxubW0vcGFnZV9hbGxvYy5oLTIxOS1cbm1tL3BhZ2VfYWxsb2MuaDoyMjA6XHRyZXR1cm4gX19wYWdlYmxvY2tfcGZuX3RvX3BhZ2Uoc3RhcnRfcGZuLCBlbmRfcGZuLCB6b25lKTtcbm1tL3BhZ2VfYWxsb2MuaC0yMjEtfVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQ3LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xNCAwNzo0OTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuOC1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAzMjA3MgoJCQkJCQkJb3V0cHV0OiAzMwoJCQkJCQkJdGhvdWdodHM6IDQxNwoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipNeSBBbmFseXNpcyBvZiBDb21wYWN0aW9uIGFuZCBSZWxhdGVkIE1lbW9yeSBNYW5hZ2VtZW50IEZlYXR1cmVzKioKCk9rYXksIHNvIEkmIzM5O20gZGlnZ2luZyBpbnRvIHRoaXMgY29kZSwgc3BlY2lmaWNhbGx5IGFyb3VuZCBtZW1vcnkgY29tcGFjdGlvbi4gVGhlIGZpcnN0IHRoaW5nIHRoYXQganVtcHMgb3V0IGlzIHRoYXQgYHBhZ2VibG9ja19wZm5fdG9fcGFnZWAgaXMgb25seSBjYWxsZWQgZnJvbSBgbW0vY29tcGFjdGlvbi5jYC4gVGhhdCYjMzk7cyBhIGdvb2Qgc3RhcnRpbmcgcG9pbnQuIExldCYjMzk7cyBtYWtlIHN1cmUgYENPTkZJR19DT01QQUNUSU9OYCBpcyBlbmFibGVkIC0gWWVwLCBpdCBpcywgYXMgZXhwZWN0ZWQuIEFuZCB3aGlsZSBJJiMzOTttIGF0IGl0LCBJIHNob3VsZCBhbHNvIGNvbmZpcm0gdGhhdCByZWxhdGVkIGZlYXR1cmVzIGxpa2UgYENPTkZJR19NRU1PUllfSE9UUExVR2AsIGBDT05GSUdfTUVNT1JZX0hPVFJFTU9WRWAsIGFuZCBgQ09ORklHX1NQQVJTRU1FTV9WTUVNTUFQYCBhcmUgZW5hYmxlZCwgd2hpY2ggYXJlIGFsbCBzdGFuZGFyZCBhbmQgaW1wb3J0YW50IGluIHRoaXMgY29udGV4dC4KCk5vdywgSSBuZWVkIHRvIGlkZW50aWZ5IHRoZSBrZXkgZnVuY3Rpb25zIG9yIHN5bWJvbHMgdGhhdCBhcmUgdGhlIHJlYWwgZm9jdXMgb2YgdGhpcyB3b3JrLiBJIG5lZWQgdG8gYmUgY2FyZWZ1bCBoZXJlLCBhdm9pZGluZyB0aGUgdHJhcCBvZiBsaXN0aW5nIHViaXF1aXRvdXMgZnVuY3Rpb25zIGxpa2UgYWxsb2NhdG9ycyBvciBzeW5jaHJvbml6YXRpb24gcHJpbWl0aXZlcywgdGhhdCBhcmUgKmV2ZXJ5d2hlcmUqIGluIHRoZSBrZXJuZWwuIFRoYXQganVzdCBkaWx1dGVzIHRoZSBhbmFseXNpcyBhbmQgZnV6emluZyBlZmZvcnQuIEluc3RlYWQsIEkgd2FudCB0byBwaW5wb2ludCB0aGUgKnNwZWNpZmljKiBmZWF0dXJlIGxvZ2ljIOKAkyB0aG9zZSBmdW5jdGlvbnMgdGhhdCAqaW1wbGVtZW50KiB0aGUgbmV3IG9yIGFsdGVyZWQgY29tcGFjdGlvbiBiZWhhdmlvciwgb3IgdGhlIG1haW4gQVBJIGVudHJ5IHBvaW50cyBmb3IgdGhpcyBzdWJzeXN0ZW0uIEFuZCBJIHNob3VsZCBiZSBwYXJ0aWN1bGFybHkgbWluZGZ1bCBvZiB0aG9zZSBzdGF0aWMgaW5saW5lIGZ1bmN0aW9ucyBpbiBoZWFkZXJzLiBUaGV5IGxhY2sgdW5pcXVlIHN5bWJvbHMsIHNvIEkgbmVlZCB0byBmaW5kIHRoZSBub24tc3RhdGljIGNhbGxlcnMgaW4gdGhlIC5jIGZpbGVzIHRoYXQgKnVzZSogdGhvc2UgaW5saW5lIGhlbHBlcnMuCgpTbywgbGV0JiMzOTtzIGxvb2sgYXQgdGhlIGZ1bmN0aW9ucyB0aGF0IGhhdmUgYmVlbiBhZGRlZCBvciBtb2RpZmllZC4gU3RhcnRpbmcgd2l0aCBgZHJpdmVycy9iYXNlL21lbW9yeS5jYC4gSSBzZWUgYG1lbW9yeV9ibG9ja19vbmxpbmVgIC0gd2FpdCBhIG1pbnV0ZSwgaXQmIzM5O3MgYHN0YXRpY2AuIERhbW4uIEkmIzM5O2xsIG5lZWQgdG8gZmlndXJlIG91dCBpZiB0aGVyZSYjMzk7cyBhIG5vbi1zdGF0aWMgY2FsbGVyLiBQZXJoYXBzIGBtZW1vcnlfc3Vic3lzX29ubGluZWAgb3IgYG1lbW9yeV9ibG9ja19hY3Rpb25gPyBJIG5lZWQgdG8gY2hlY2sgYGRyaXZlcnMvYmFzZS9tZW1vcnkuY2AgdGhvcm91Z2hseS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40OC8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTQgMDc6NDk8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7bWVtb3J5X3N1YnN5c19vbmxpbmUmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtkcml2ZXJzL2Jhc2UvbWVtb3J5LmMmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7ZHJpdmVycy9iYXNlL21lbW9yeS5jPTYyPUVYUE9SVF9TWU1CT0woc2VjdGlvbnNfcGVyX2Jsb2NrKTtcbmRyaXZlcnMvYmFzZS9tZW1vcnkuYy02My1cbmRyaXZlcnMvYmFzZS9tZW1vcnkuYzo2NDpzdGF0aWMgaW50IG1lbW9yeV9zdWJzeXNfb25saW5lKHN0cnVjdCBkZXZpY2UgKmRldik7XG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmMtNjUtc3RhdGljIGludCBtZW1vcnlfc3Vic3lzX29mZmxpbmUoc3RydWN0IGRldmljZSAqZGV2KTtcbi0tXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmM9Njc9c3RhdGljIGNvbnN0IHN0cnVjdCBidXNfdHlwZSBtZW1vcnlfc3Vic3lzID0ge1xuLS1cbmRyaXZlcnMvYmFzZS9tZW1vcnkuYy02OS1cdC5kZXZfbmFtZSA9IE1FTU9SWV9DTEFTU19OQU1FLFxuZHJpdmVycy9iYXNlL21lbW9yeS5jOjcwOlx0Lm9ubGluZSA9IG1lbW9yeV9zdWJzeXNfb25saW5lLFxuZHJpdmVycy9iYXNlL21lbW9yeS5jLTcxLVx0Lm9mZmxpbmUgPSBtZW1vcnlfc3Vic3lzX29mZmxpbmUsXG4tLVxuZHJpdmVycy9iYXNlL21lbW9yeS5jPTM2MD1zdGF0aWMgaW50IG1lbW9yeV9ibG9ja19jaGFuZ2Vfc3RhdGUoc3RydWN0IG1lbW9yeV9ibG9jayAqbWVtLFxuLS1cbmRyaXZlcnMvYmFzZS9tZW1vcnkuYy0zNzctLyogVGhlIGRldmljZSBsb2NrIHNlcmlhbGl6ZXMgb3BlcmF0aW9ucyBvbiBtZW1vcnlfc3Vic3lzX1tvbmxpbmV8b2ZmbGluZV0gKi9cbmRyaXZlcnMvYmFzZS9tZW1vcnkuYzozNzg6c3RhdGljIGludCBtZW1vcnlfc3Vic3lzX29ubGluZShzdHJ1Y3QgZGV2aWNlICpkZXYpXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmMtMzc5LXtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40OS8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTQgMDc6NDk8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjgtZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMzMyMTUKCQkJCQkJCW91dHB1dDogMzQKCQkJCQkJCXRob3VnaHRzOiA0MwoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgbGV0JiMzOTtzIGJyZWFrIHRoaXMgZG93bi4KCioqSW52ZXN0aWdhdGluZyBNZW1vcnkgQmxvY2sgU3RhdGUgVHJhbnNpdGlvbnMqKgoKQWxyaWdodCwgc28gSSBuZWVkIHRvIGZpZ3VyZSBvdXQgd2hhdCYjMzk7cyB0cmlnZ2VyaW5nIGNoYW5nZXMgaW4gdGhlIHN0YXRlIG9mIHRoZXNlIG1lbW9yeSBibG9ja3MuIE15IGZpcnN0IHN0ZXAgaXMgdG8gdHJhY2UgYmFjayB0aGUgY2FsbHMgdG8gYG1lbW9yeV9ibG9ja19jaGFuZ2Vfc3RhdGVgLiBUaGlzIGZ1bmN0aW9uIGlzIGtleS4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgd2hhdCYjMzk7cyBpbmZsdWVuY2luZyBpdC4gIFNpbWlsYXJseSwgSSYjMzk7bGwgbmVlZCB0byBsb29rIGF0IGBtZW1vcnlfYmxvY2tfb25saW5lYCBhbmQgYG1lbW9yeV9ibG9ja19vZmZsaW5lYCB0byB1bmRlcnN0YW5kIGhvdyB0aGUgbWVtb3J5IGJsb2NrcyBnbyBmcm9tIGEgcG93ZXJlZCBkb3duLCB0byBwb3dlcmVkIHVwLCBhbmQgdmljZS12ZXJzYS4gIEkmIzM5O2xsIHN0YXJ0IHdpdGggYSBzdHJhaWdodGZvcndhcmQgc2VhcmNoIGZvciBgbWVtb3J5X2Jsb2NrX2NoYW5nZV9zdGF0ZWAgY2FsbHMgaW4gdGhlIGNvZGViYXNlLiBUaGF0IHNob3VsZCBnaXZlIG1lIGEgZ29vZCBpbml0aWFsIGxpc3Qgb2YgZW50cnkgcG9pbnRzIGFuZCBob3BlZnVsbHkgc29tZSBjb250ZXh0LgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjUwLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xNCAwNzo0OTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDttZW1vcnlfYmxvY2tfY2hhbmdlX3N0YXRlJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7ZHJpdmVycy9iYXNlL21lbW9yeS5jJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2RyaXZlcnMvYmFzZS9tZW1vcnkuYz0zNDA9bWVtb3J5X2Jsb2NrX2FjdGlvbihzdHJ1Y3QgbWVtb3J5X2Jsb2NrICptZW0sIHVuc2lnbmVkIGxvbmcgYWN0aW9uKVxuLS1cbmRyaXZlcnMvYmFzZS9tZW1vcnkuYy0zNTktXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmM6MzYwOnN0YXRpYyBpbnQgbWVtb3J5X2Jsb2NrX2NoYW5nZV9zdGF0ZShzdHJ1Y3QgbWVtb3J5X2Jsb2NrICptZW0sXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmMtMzYxLVx0XHR1bnNpZ25lZCBsb25nIHRvX3N0YXRlLCB1bnNpZ25lZCBsb25nIGZyb21fc3RhdGVfcmVxKVxuLS1cbmRyaXZlcnMvYmFzZS9tZW1vcnkuYz0zNzg9c3RhdGljIGludCBtZW1vcnlfc3Vic3lzX29ubGluZShzdHJ1Y3QgZGV2aWNlICpkZXYpXG4tLVxuZHJpdmVycy9iYXNlL21lbW9yeS5jLTM5Mi1cbmRyaXZlcnMvYmFzZS9tZW1vcnkuYzozOTM6XHRyZXQgPSBtZW1vcnlfYmxvY2tfY2hhbmdlX3N0YXRlKG1lbSwgTUVNX09OTElORSwgTUVNX09GRkxJTkUpO1xuZHJpdmVycy9iYXNlL21lbW9yeS5jLTM5NC1cdG1lbS1cdTAwM2VvbmxpbmVfdHlwZSA9IE1NT1BfT0ZGTElORTtcbi0tXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmM9Mzk5PXN0YXRpYyBpbnQgbWVtb3J5X3N1YnN5c19vZmZsaW5lKHN0cnVjdCBkZXZpY2UgKmRldilcbi0tXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmMtNDA1LVxuZHJpdmVycy9iYXNlL21lbW9yeS5jOjQwNjpcdHJldHVybiBtZW1vcnlfYmxvY2tfY2hhbmdlX3N0YXRlKG1lbSwgTUVNX09GRkxJTkUsIE1FTV9PTkxJTkUpO1xuZHJpdmVycy9iYXNlL21lbW9yeS5jLTQwNy19XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NTEvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE0IDA3OjQ5PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy44LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDMzNzY0CgkJCQkJCQlvdXRwdXQ6IDM1CgkJCQkJCQl0aG91Z2h0czogMzUKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGxldCYjMzk7cyBkaXZlIGludG8gdGhpcyBjb2RlLgoKKipJbnZlc3RpZ2F0aW5nIE1lbW9yeSBTdWJzeXN0ZW0gSW50ZXJhY3Rpb25zKioKCkFscmlnaHQsIEkgbmVlZCB0byBmaWd1cmUgb3V0IHRoZSBzY29wZSBvZiBob3cgdGhlc2UgbWVtb3J5LXJlbGF0ZWQgZnVuY3Rpb25zIGFyZSBiZWluZyB1c2VkLiBTcGVjaWZpY2FsbHksIEkmIzM5O20gdGhpbmtpbmcgYWJvdXQgYG1lbW9yeV9zdWJzeXNfb25saW5lYCBhbmQgYG1lbW9yeV9ibG9ja19hY3Rpb25gLiBJIG5lZWQgdG8gdHJhY2sgZG93biBhbGwgdGhlIGNhbGwgc2l0ZXMgdG8gdGhvc2UuIEl04oCZcyBjcml0aWNhbCB0byBnZXQgYSBmdWxsIHBpY3R1cmUgb2Ygd2hhdCBkZXBlbmRzIG9uIHRoZW0sIGFuZCB3aGVyZSBjaGFuZ2VzIHRvIHRoZXNlIGZ1bmN0aW9ucyBjb3VsZCBoYXZlIHRoZSBiaWdnZXN0IGltcGFjdC4KCkxldCYjMzk7cyBub3QgZm9yZ2V0IHRvIGNoZWNrIHRoZSBgc3RhdGVfc3RvcmVgIGZ1bmN0aW9uIHdpdGhpbiB0aGUgc3lzZnMuIFRoYXQmIzM5O3MgYSBsaWtlbHkgcG9pbnQgb2YgaW50ZXJhY3Rpb24uIEkmIzM5O2xsIG5lZWQgdG8gdW5kZXJzdGFuZCBob3cgdGhlIHN5c3RlbSBzdGF0ZSBpcyBiZWluZyBtYW5pcHVsYXRlZCB0aHJvdWdoIHRoYXQgaW50ZXJmYWNlIGluIHJlbGF0aW9uIHRvIHRoZSBtZW1vcnkgc3Vic3lzdGVtcyBJJiMzOTttIGludmVzdGlnYXRpbmcuIEkgaGF2ZSBhIGh1bmNoIHRoYXQgdGhlcmUgd2lsbCBiZSBzb21lIG92ZXJsYXAgdGhlcmUuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NTIvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE0IDA3OjUwPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7ZHJpdmVycy9iYXNlL21lbW9yeS5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogNDAwLAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDUwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OyA0MDA6XHR7XG4gNDAxOlx0XHRzdHJ1Y3QgbWVtb3J5X2Jsb2NrICptZW0gPSB0b19tZW1vcnlfYmxvY2soZGV2KTtcbiA0MDI6XHRcbiA0MDM6XHRcdGlmIChtZW0tXHUwMDNlc3RhdGUgPT0gTUVNX09GRkxJTkUpXG4gNDA0Olx0XHRcdHJldHVybiAwO1xuIDQwNTpcdFxuIDQwNjpcdFx0cmV0dXJuIG1lbW9yeV9ibG9ja19jaGFuZ2Vfc3RhdGUobWVtLCBNRU1fT0ZGTElORSwgTUVNX09OTElORSk7XG4gNDA3Olx0fVxuIDQwODpcdFxuIDQwOTpcdHN0YXRpYyBzc2l6ZV90IHN0YXRlX3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsXG4gNDEwOlx0XHRcdFx0ICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpXG4gNDExOlx0e1xuIDQxMjpcdFx0Y29uc3QgaW50IG9ubGluZV90eXBlID0gbWhwX29ubGluZV90eXBlX2Zyb21fc3RyKGJ1Zik7XG4gNDEzOlx0XHRzdHJ1Y3QgbWVtb3J5X2Jsb2NrICptZW0gPSB0b19tZW1vcnlfYmxvY2soZGV2KTtcbiA0MTQ6XHRcdGludCByZXQ7XG4gNDE1Olx0XG4gNDE2Olx0XHRpZiAob25saW5lX3R5cGUgXHUwMDNjIDApXG4gNDE3Olx0XHRcdHJldHVybiAtRUlOVkFMO1xuIDQxODpcdFxuIDQxOTpcdFx0cmV0ID0gbG9ja19kZXZpY2VfaG90cGx1Z19zeXNmcygpO1xuIDQyMDpcdFx0aWYgKHJldClcbiA0MjE6XHRcdFx0cmV0dXJuIHJldDtcbiA0MjI6XHRcbiA0MjM6XHRcdHN3aXRjaCAob25saW5lX3R5cGUpIHtcbiA0MjQ6XHRcdGNhc2UgTU1PUF9PTkxJTkVfS0VSTkVMOlxuIDQyNTpcdFx0Y2FzZSBNTU9QX09OTElORV9NT1ZBQkxFOlxuIDQyNjpcdFx0Y2FzZSBNTU9QX09OTElORTpcbiA0Mjc6XHRcdFx0LyogbWVtLVx1MDAzZW9ubGluZV90eXBlIGlzIHByb3RlY3RlZCBieSBkZXZpY2VfaG90cGx1Z19sb2NrICovXG4gNDI4Olx0XHRcdG1lbS1cdTAwM2VvbmxpbmVfdHlwZSA9IG9ubGluZV90eXBlO1xuIDQyOTpcdFx0XHRyZXQgPSBkZXZpY2Vfb25saW5lKFx1MDAyNm1lbS1cdTAwM2VkZXYpO1xuIDQzMDpcdFx0XHRicmVhaztcbiA0MzE6XHRcdGNhc2UgTU1PUF9PRkZMSU5FOlxuIDQzMjpcdFx0XHRyZXQgPSBkZXZpY2Vfb2ZmbGluZShcdTAwMjZtZW0tXHUwMDNlZGV2KTtcbiA0MzM6XHRcdFx0YnJlYWs7XG4gNDM0Olx0XHRkZWZhdWx0OlxuIDQzNTpcdFx0XHRyZXQgPSAtRUlOVkFMOyAvKiBzaG91bGQgbmV2ZXIgaGFwcGVuICovXG4gNDM2Olx0XHR9XG4gNDM3Olx0XG4gNDM4Olx0XHR1bmxvY2tfZGV2aWNlX2hvdHBsdWcoKTtcbiA0Mzk6XHRcbiA0NDA6XHRcdGlmIChyZXQgXHUwMDNjIDApXG4gNDQxOlx0XHRcdHJldHVybiByZXQ7XG4gNDQyOlx0XHRpZiAocmV0KVxuIDQ0MzpcdFx0XHRyZXR1cm4gLUVJTlZBTDtcbiA0NDQ6XHRcbiA0NDU6XHRcdHJldHVybiBjb3VudDtcbiA0NDY6XHR9XG4gNDQ3Olx0XG4gNDQ4Olx0LypcbiA0NDk6XHQgKiBMZWdhY3kgaW50ZXJmYWNlIHRoYXQgd2UgY2Fubm90IHJlbW92ZTogczM5MHggZXhwb3NlcyB0aGUgc3RvcmFnZSBpbmNyZW1lbnRcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD41My8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTQgMDc6NTA8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjFtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjgtZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMzQ2NzEKCQkJCQkJCW91dHB1dDogNjUKCQkJCQkJCXRob3VnaHRzOiAxMDc2CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyBNZW1vcnkgSG90cGx1ZyBhbmQgQ29udGlndWl0eSBDaGFuZ2VzKioKCk9rYXksIHNvIEkmIzM5O20gZGl2aW5nIGludG8gdGhpcyBtZW1vcnkgbWFuYWdlbWVudCBjb2RlLiBNeSBpbml0aWFsIHRob3VnaHQgaXMgdG8gdHJhY2UgdGhlIG9ubGluZS9vZmZsaW5lIHByb2Nlc3MsIGFuZCBpdCBsb29rcyBsaWtlIGBzdGF0ZV9zdG9yZWAgaW4gYGRyaXZlcnMvYmFzZS9tZW1vcnkuY2AgaXMgdGhlIGtleS4gSXQgdWx0aW1hdGVseSBjYWxscyBgbWVtb3J5X2Jsb2NrX29ubGluZWAgYW5kIGBtZW1vcnlfYmxvY2tfb2ZmbGluZWAgdGhyb3VnaCBhIGNoYWluIG9mIGZ1bmN0aW9ucy4gVGhhdCYjMzk7cyBhIGdvb2Qgc3RhcnRpbmcgcG9pbnQuCgpOZXh0LCBJJiMzOTttIHJldmlld2luZyBgbW0vbWVtb3J5X2hvdHBsdWcuY2AgYW5kIGlkZW50aWZ5aW5nIHRoZSBmdW5jdGlvbnMgdGhhdCBhcmUgbm9uLXN0YXRpYyBvciBoYXZlIGJlZW4gbW9kaWZpZWQuIGByZW1vdmVfcGZuX3JhbmdlX2Zyb21fem9uZWAsIGBhZGp1c3RfcHJlc2VudF9wYWdlX2NvdW50YCwgYW5kIGBtb3ZlX3Bmbl9yYW5nZV90b196b25lYCBzdGFuZCBvdXQgYXMgdGhlIG5vbi1zdGF0aWMgZnVuY3Rpb25zIG9mIGludGVyZXN0LiBJIGFsc28gbmVlZCB0byBmb2N1cyBvbiB3aGF0IGNhbGxzIHRoZW07IGBvZmZsaW5lX3BhZ2VzYCBpcyBrZXksIGFzIGlzIGBvbmxpbmVfcGFnZXNgLCBhbmQgZnVuY3Rpb25zIHJlbGF0ZWQgdG8gbWVtb3J5IG1hcCBpbml0aWFsaXphdGlvbi9kZS1pbml0aWFsaXphdGlvbi4KCk5vdyBJJiMzOTttIHR1cm5pbmcgbXkgYXR0ZW50aW9uIHRvIGNvbXBhY3Rpb24gYW5kIHRoZSBpbnRlZ3JhdGlvbiBvZiBjb250aWd1aXR5IGNoZWNrcy4gTXkgb3JpZ2luYWwgaW5zdGluY3Qgd2FzIHRvIHplcm8gaW4gb24gYHBhZ2VibG9ja19wZm5fdG9fcGFnZWAsIGJ1dCB0aGVuIEkgcmVhbGl6ZWQgaXQgY2FsbHMgYHpvbmVfaXNfY29udGlndW91c2AuIFdhaXQsIGB6b25lX2lzX2NvbnRpZ3VvdXNgLCBgc2V0X3pvbmVfY29udGlndW91c2AsIGFuZCBgY2xlYXJfem9uZV9jb250aWd1b3VzYCBhcmUgKmlubGluZSogYW5kIGRlZmluZWQgaW4gYSBoZWFkZXIgZmlsZSwgYGluY2x1ZGUvbGludXgvbW16b25lLmhgLiBCYXNlZCBvbiB0aGUgZG9jdW1lbnRhdGlvbiwgSSBrbm93IHRoZXNlIHN0YXRpYyBpbmxpbmUgZnVuY3Rpb25zIGFyZSBub3QgaWRlYWwgdGFyZ2V0cyBmb3Igc3ltYm9sIGNvdmVyYWdlLgoKVGhpcyBtZWFucyBJIG5lZWQgdG8gYWRqdXN0IG15IHN0cmF0ZWd5LiBJIG5lZWQgdG8gZm9jdXMgb24gdGhlICpub24tc3RhdGljKiBmdW5jdGlvbnMgdGhhdCAqY2FsbCogdGhvc2UgaW5saW5lIGZ1bmN0aW9ucy4gU28sIHdoYXQgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSB1c2luZyB0aGVzZSBjb250aWd1aXR5IGNoZWNrcz8gSSBzZWUgdGhlbSBiZWluZyBjYWxsZWQgYnkgZnVuY3Rpb25zIGluIGBtbS9jb21wYWN0aW9uLmNgLCBzdWNoIGFzIGBpc29sYXRlX21pZ3JhdGVwYWdlc19yYW5nZWAsIGBpc29sYXRlX2ZyZWVwYWdlc19yYW5nZWAsIGFuZCB0aGUgb3RoZXIgaXNvbGF0b3JzLCBhcyB3ZWxsIGFzIHRoZSBtYWluIGNvbXBhY3Rpb24gZW50cnkgcG9pbnRzOiBgY29tcGFjdF96b25lYCAvIGBzeXNmc19jb21wYWN0X25vZGVgIC8gYGNvbXBhY3Rfbm9kZXNgLgoKSSYjMzk7bSBub3cgZ29pbmcgYmFjayB0byBgZHJpdmVycy9iYXNlL21lbW9yeS5jYC4gSSBuZWVkIHRvIHJldmlldyB3aGF0JiMzOTtzIGFjdHVhbGx5ICpub24tc3RhdGljKiBpbiB0aGF0IGZpbGUuIE15IGZvY3VzIHNob3VsZCBiZSBvbiB0aGUgY2FsbHMgdG8gYG1lbW9yeV9ibG9ja19vbmxpbmVgIGFuZCBgbWVtb3J5X2Jsb2NrX29mZmxpbmVgIGFuZCBob3cgdGhleSByZWxhdGUgdG8gdGhlIGlubGluZSBjb250aWd1aXR5IGNoZWNrcyBmcm9tIG1tem9uZS5oLCBidXQgSSBjYW4mIzM5O3QgZmluZCBhbnkgbm9uLXN0YXRpYyBmdW5jdGlvbnMgaW4gdGhhdCBmaWxlIHRoYXQgYXJlIHJlbGV2YW50LiBJIG5lZWQgdG8gZmluZCB0aGUgY2FsbHMgdG8gdGhlIG1vZGlmaWVkIGxvZ2ljLCBvciBjb2RlIHRoYXQgdXNlcyB0aGUgaW5saW5lIGNvbnRpZ3VpdHkgY2hlY2tzLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjU0LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xNCAwNzo1MTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDteW2EtekEtWl9dW2EtekEtWjAtOV8qIF0mIzQzOyBbYS16QS1aX11bYS16QS1aMC05X10qXFwoJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7ZHJpdmVycy9iYXNlL21lbW9yeS5jJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2RyaXZlcnMvYmFzZS9tZW1vcnkuYz0zMj1zdGF0aWMgY29uc3QgY2hhciAqY29uc3Qgb25saW5lX3R5cGVfdG9fc3RyW10gPSB7XG4tLVxuZHJpdmVycy9iYXNlL21lbW9yeS5jLTM4LVxuZHJpdmVycy9iYXNlL21lbW9yeS5jOjM5OmludCBtaHBfb25saW5lX3R5cGVfZnJvbV9zdHIoY29uc3QgY2hhciAqc3RyKVxuZHJpdmVycy9iYXNlL21lbW9yeS5jLTQwLXtcbi0tXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmM9NjI9RVhQT1JUX1NZTUJPTChzZWN0aW9uc19wZXJfYmxvY2spO1xuZHJpdmVycy9iYXNlL21lbW9yeS5jLTYzLVxuZHJpdmVycy9iYXNlL21lbW9yeS5jOjY0OnN0YXRpYyBpbnQgbWVtb3J5X3N1YnN5c19vbmxpbmUoc3RydWN0IGRldmljZSAqZGV2KTtcbmRyaXZlcnMvYmFzZS9tZW1vcnkuYzo2NTpzdGF0aWMgaW50IG1lbW9yeV9zdWJzeXNfb2ZmbGluZShzdHJ1Y3QgZGV2aWNlICpkZXYpO1xuZHJpdmVycy9iYXNlL21lbW9yeS5jLTY2LVxuZHJpdmVycy9iYXNlL21lbW9yeS5jPTY3PXN0YXRpYyBjb25zdCBzdHJ1Y3QgYnVzX3R5cGUgbWVtb3J5X3N1YnN5cyA9IHtcbi0tXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmMtNzgtICovXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmM6Nzk6c3RhdGljIERFRklORV9YQVJSQVkobWVtb3J5X2Jsb2Nrcyk7XG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmMtODAtXG4tLVxuZHJpdmVycy9iYXNlL21lbW9yeS5jLTgzLSAqL1xuZHJpdmVycy9iYXNlL21lbW9yeS5jOjg0OnN0YXRpYyBERUZJTkVfWEFSUkFZX0ZMQUdTKG1lbW9yeV9ncm91cHMsIFhBX0ZMQUdTX0FMTE9DKTtcbmRyaXZlcnMvYmFzZS9tZW1vcnkuYy04NS0jZGVmaW5lIE1FTU9SWV9HUk9VUF9NQVJLX0RZTkFNSUNcdFhBX01BUktfMVxuZHJpdmVycy9iYXNlL21lbW9yeS5jLTg2LVxuZHJpdmVycy9iYXNlL21lbW9yeS5jOjg3OnN0YXRpYyBCTE9DS0lOR19OT1RJRklFUl9IRUFEKG1lbW9yeV9jaGFpbik7XG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmMtODgtXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmM6ODk6aW50IHJlZ2lzdGVyX21lbW9yeV9ub3RpZmllcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iKVxuZHJpdmVycy9iYXNlL21lbW9yeS5jLTkwLXtcbi0tXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmM9OTM9RVhQT1JUX1NZTUJPTChyZWdpc3Rlcl9tZW1vcnlfbm90aWZpZXIpO1xuZHJpdmVycy9iYXNlL21lbW9yeS5jLTk0LVxuZHJpdmVycy9iYXNlL21lbW9yeS5jOjk1OnZvaWQgdW5yZWdpc3Rlcl9tZW1vcnlfbm90aWZpZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYilcbmRyaXZlcnMvYmFzZS9tZW1vcnkuYy05Ni17XG4tLVxuZHJpdmVycy9iYXNlL21lbW9yeS5jPTk5PUVYUE9SVF9TWU1CT0wodW5yZWdpc3Rlcl9tZW1vcnlfbm90aWZpZXIpO1xuZHJpdmVycy9iYXNlL21lbW9yeS5jLTEwMC1cbmRyaXZlcnMvYmFzZS9tZW1vcnkuYzoxMDE6c3RhdGljIHZvaWQgbWVtb3J5X2Jsb2NrX3JlbGVhc2Uoc3RydWN0IGRldmljZSAqZGV2KVxuZHJpdmVycy9iYXNlL21lbW9yeS5jLTEwMi17XG4tLVxuZHJpdmVycy9iYXNlL21lbW9yeS5jPTExMj1zdGF0aWMgYm9vbCBtZW1vcnlfYmxvY2tfYWR2aXNlZF9zaXplX3F1ZXJpZWQ7XG4tLVxuZHJpdmVycy9iYXNlL21lbW9yeS5jLTEyOC0gKi9cbmRyaXZlcnMvYmFzZS9tZW1vcnkuYzoxMjk6aW50IF9faW5pdCBtZW1vcnlfYmxvY2tfYWR2aXNlX21heF9zaXplKHVuc2lnbmVkIGxvbmcgc2l6ZSlcbmRyaXZlcnMvYmFzZS9tZW1vcnkuYy0xMzAte1xuLS1cbmRyaXZlcnMvYmFzZS9tZW1vcnkuYy0xNTMtICovXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmM6MTU0OnVuc2lnbmVkIGxvbmcgbWVtb3J5X2Jsb2NrX2FkdmlzZWRfbWF4X3NpemUodm9pZClcbmRyaXZlcnMvYmFzZS9tZW1vcnkuYy0xNTUte1xuLS1cbmRyaXZlcnMvYmFzZS9tZW1vcnkuYy0xNTktXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmM6MTYwOnVuc2lnbmVkIGxvbmcgX193ZWFrIG1lbW9yeV9ibG9ja19zaXplX2J5dGVzKHZvaWQpXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmMtMTYxLXtcbi0tXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmM9MTY0PUVYUE9SVF9TWU1CT0xfR1BMKG1lbW9yeV9ibG9ja19zaXplX2J5dGVzKTtcbi0tXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmMtMTY2LS8qIFNob3cgdGhlIG1lbW9yeSBibG9jayBJRCwgcmVsYXRpdmUgdG8gdGhlIG1lbW9yeSBibG9jayBzaXplICovXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmM6MTY3OnN0YXRpYyBzc2l6ZV90IHBoeXNfaW5kZXhfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmMtMTY4LVx0XHRcdCAgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKVxuLS1cbmRyaXZlcnMvYmFzZS9tZW1vcnkuYy0xNzgtICovXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmM6MTc5OnN0YXRpYyBzc2l6ZV90IHJlbW92YWJsZV9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmMtMTgwLVx0XHRcdCAgICAgIGNoYXIgKmJ1Zilcbi0tXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmMtMTg3LSAqL1xuZHJpdmVycy9iYXNlL21lbW9yeS5jOjE4ODpzdGF0aWMgc3NpemVfdCBzdGF0ZV9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmMtMTg5LVx0XHRcdCAgY2hhciAqYnVmKVxuLS1cbmRyaXZlcnMvYmFzZS9tZW1vcnkuYy0yMTUtXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmM6MjE2OmludCBtZW1vcnlfbm90aWZ5KGVudW0gbWVtb3J5X2Jsb2NrX3N0YXRlIHN0YXRlLCB2b2lkICp2KVxuZHJpdmVycy9iYXNlL21lbW9yeS5jLTIxNy17XG4tLVxuZHJpdmVycy9iYXNlL21lbW9yeS5jLTIyMS0jaWYgZGVmaW5lZChDT05GSUdfTUVNT1JZX0ZBSUxVUkUpIFx1MDAyNlx1MDAyNiBkZWZpbmVkKENPTkZJR19NRU1PUllfSE9UUExVRylcbmRyaXZlcnMvYmFzZS9tZW1vcnkuYzoyMjI6c3RhdGljIHVuc2lnbmVkIGxvbmcgbWVtYmxrX25yX3BvaXNvbihzdHJ1Y3QgbWVtb3J5X2Jsb2NrICptZW0pO1xuZHJpdmVycy9iYXNlL21lbW9yeS5jLTIyMy0jZWxzZVxuZHJpdmVycy9iYXNlL21lbW9yeS5jOjIyNDpzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgbWVtYmxrX25yX3BvaXNvbihzdHJ1Y3QgbWVtb3J5X2Jsb2NrICptZW0pXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmMtMjI1LXtcbi0tXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmMtMjMyLSAqL1xuZHJpdmVycy9iYXNlL21lbW9yeS5jOjIzMzpzdGF0aWMgaW50IG1lbW9yeV9ibG9ja19vbmxpbmUoc3RydWN0IG1lbW9yeV9ibG9jayAqbWVtKVxuZHJpdmVycy9iYXNlL21lbW9yeS5jLTIzNC17XG4tLVxuZHJpdmVycy9iYXNlL21lbW9yeS5jLTI5MC0gKi9cbmRyaXZlcnMvYmFzZS9tZW1vcnkuYzoyOTE6c3RhdGljIGludCBtZW1vcnlfYmxvY2tfb2ZmbGluZShzdHJ1Y3QgbWVtb3J5X2Jsb2NrICptZW0pXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmMtMjkyLXtcbi0tXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmM9MzQwPW1lbW9yeV9ibG9ja19hY3Rpb24oc3RydWN0IG1lbW9yeV9ibG9jayAqbWVtLCB1bnNpZ25lZCBsb25nIGFjdGlvbilcbi0tXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmMtMzU5LVxuZHJpdmVycy9iYXNlL21lbW9yeS5jOjM2MDpzdGF0aWMgaW50IG1lbW9yeV9ibG9ja19jaGFuZ2Vfc3RhdGUoc3RydWN0IG1lbW9yeV9ibG9jayAqbWVtLFxuZHJpdmVycy9iYXNlL21lbW9yeS5jLTM2MS1cdFx0dW5zaWduZWQgbG9uZyB0b19zdGF0ZSwgdW5zaWduZWQgbG9uZyBmcm9tX3N0YXRlX3JlcSlcbi0tXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmMtMzc3LS8qIFRoZSBkZXZpY2UgbG9jayBzZXJpYWxpemVzIG9wZXJhdGlvbnMgb24gbWVtb3J5X3N1YnN5c19bb25saW5lfG9mZmxpbmVdICovXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmM6Mzc4OnN0YXRpYyBpbnQgbWVtb3J5X3N1YnN5c19vbmxpbmUoc3RydWN0IGRldmljZSAqZGV2KVxuZHJpdmVycy9iYXNlL21lbW9yeS5jLTM3OS17XG4tLVxuZHJpdmVycy9iYXNlL21lbW9yeS5jLTM5OC1cbmRyaXZlcnMvYmFzZS9tZW1vcnkuYzozOTk6c3RhdGljIGludCBtZW1vcnlfc3Vic3lzX29mZmxpbmUoc3RydWN0IGRldmljZSAqZGV2KVxuZHJpdmVycy9iYXNlL21lbW9yeS5jLTQwMC17XG4tLVxuZHJpdmVycy9iYXNlL21lbW9yeS5jLTQwOC1cbmRyaXZlcnMvYmFzZS9tZW1vcnkuYzo0MDk6c3RhdGljIHNzaXplX3Qgc3RhdGVfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0cixcbmRyaXZlcnMvYmFzZS9tZW1vcnkuYy00MTAtXHRcdFx0ICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpXG4tLVxuZHJpdmVycy9iYXNlL21lbW9yeS5jLTQ1NC0gKi9cbmRyaXZlcnMvYmFzZS9tZW1vcnkuYzo0NTU6c3RhdGljIHNzaXplX3QgcGh5c19kZXZpY2Vfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmMtNDU2LVx0XHRcdFx0c3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1Zilcbi0tXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmMtNDY1LSNpZmRlZiBDT05GSUdfTUVNT1JZX0hPVFJFTU9WRVxuZHJpdmVycy9iYXNlL21lbW9yeS5jOjQ2NjpzdGF0aWMgaW50IHByaW50X2FsbG93ZWRfem9uZShjaGFyICpidWYsIGludCBsZW4sIGludCBuaWQsXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmMtNDY3LVx0XHRcdCAgICAgIHN0cnVjdCBtZW1vcnlfZ3JvdXAgKmdyb3VwLFxuLS1cbmRyaXZlcnMvYmFzZS9tZW1vcnkuYy00NzktXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmM6NDgwOnN0YXRpYyBzc2l6ZV90IHZhbGlkX3pvbmVzX3Nob3coc3RydWN0IGRldmljZSAqZGV2LFxuZHJpdmVycy9iYXNlL21lbW9yeS5jLTQ4MS1cdFx0XHRcdHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpXG4tLVxuZHJpdmVycy9iYXNlL21lbW9yeS5jLTUxNC19XG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmM6NTE1OnN0YXRpYyBERVZJQ0VfQVRUUl9STyh2YWxpZF96b25lcyk7XG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmMtNTE2LSNlbmRpZlxuZHJpdmVycy9iYXNlL21lbW9yeS5jLTUxNy1cbmRyaXZlcnMvYmFzZS9tZW1vcnkuYzo1MTg6c3RhdGljIERFVklDRV9BVFRSX1JPKHBoeXNfaW5kZXgpO1xuZHJpdmVycy9iYXNlL21lbW9yeS5jOjUxOTpzdGF0aWMgREVWSUNFX0FUVFJfUlcoc3RhdGUpO1xuZHJpdmVycy9iYXNlL21lbW9yeS5jOjUyMDpzdGF0aWMgREVWSUNFX0FUVFJfUk8ocGh5c19kZXZpY2UpO1xuZHJpdmVycy9iYXNlL21lbW9yeS5jOjUyMTpzdGF0aWMgREVWSUNFX0FUVFJfUk8ocmVtb3ZhYmxlKTtcbmRyaXZlcnMvYmFzZS9tZW1vcnkuYy01MjItXG4tLVxuZHJpdmVycy9iYXNlL21lbW9yeS5jLTUyNS0gKi9cbmRyaXZlcnMvYmFzZS9tZW1vcnkuYzo1MjY6c3RhdGljIHNzaXplX3QgYmxvY2tfc2l6ZV9ieXRlc19zaG93KHN0cnVjdCBkZXZpY2UgKmRldixcbmRyaXZlcnMvYmFzZS9tZW1vcnkuYy01MjctXHRcdFx0XHQgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpXG4tLVxuZHJpdmVycy9iYXNlL21lbW9yeS5jLTUzMS1cbmRyaXZlcnMvYmFzZS9tZW1vcnkuYzo1MzI6c3RhdGljIERFVklDRV9BVFRSX1JPKGJsb2NrX3NpemVfYnl0ZXMpO1xuZHJpdmVycy9iYXNlL21lbW9yeS5jLTUzMy1cbi0tXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmMtNTM3LVxuZHJpdmVycy9iYXNlL21lbW9yeS5jOjUzODpzdGF0aWMgc3NpemVfdCBhdXRvX29ubGluZV9ibG9ja3Nfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmMtNTM5LVx0XHRcdFx0ICAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpXG4tLVxuZHJpdmVycy9iYXNlL21lbW9yeS5jLTU0NC1cbmRyaXZlcnMvYmFzZS9tZW1vcnkuYzo1NDU6c3RhdGljIHNzaXplX3QgYXV0b19vbmxpbmVfYmxvY2tzX3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldixcbmRyaXZlcnMvYmFzZS9tZW1vcnkuYy01NDYtXHRcdFx0XHRcdHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLFxuLS1cbmRyaXZlcnMvYmFzZS9tZW1vcnkuYy01NTctXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmM6NTU4OnN0YXRpYyBERVZJQ0VfQVRUUl9SVyhhdXRvX29ubGluZV9ibG9ja3MpO1xuZHJpdmVycy9iYXNlL21lbW9yeS5jLTU1OS1cbi0tXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmMtNTYxLSNpbmNsdWRlIFx1MDAzY2xpbnV4L2tleGVjLmhcdTAwM2VcbmRyaXZlcnMvYmFzZS9tZW1vcnkuYzo1NjI6c3RhdGljIHNzaXplX3QgY3Jhc2hfaG90cGx1Z19zaG93KHN0cnVjdCBkZXZpY2UgKmRldixcbmRyaXZlcnMvYmFzZS9tZW1vcnkuYy01NjMtXHRcdFx0XHQgICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1Zilcbi0tXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmMtNTY2LX1cbmRyaXZlcnMvYmFzZS9tZW1vcnkuYzo1Njc6c3RhdGljIERFVklDRV9BVFRSX1JPKGNyYXNoX2hvdHBsdWcpO1xuZHJpdmVycy9iYXNlL21lbW9yeS5jLTU2OC0jZW5kaWZcbi0tXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmMtNTc2LSNpZmRlZiBDT05GSUdfQVJDSF9NRU1PUllfUFJPQkVcbmRyaXZlcnMvYmFzZS9tZW1vcnkuYzo1Nzc6c3RhdGljIHNzaXplX3QgcHJvYmVfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0cixcbmRyaXZlcnMvYmFzZS9tZW1vcnkuYy01NzgtXHRcdFx0ICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpXG4tLVxuZHJpdmVycy9iYXNlL21lbW9yeS5jLTYwOC1cbmRyaXZlcnMvYmFzZS9tZW1vcnkuYzo2MDk6c3RhdGljIERFVklDRV9BVFRSX1dPKHByb2JlKTtcbmRyaXZlcnMvYmFzZS9tZW1vcnkuYy02MTAtI2VuZGlmXG4tLVxuZHJpdmVycy9iYXNlL21lbW9yeS5jLTYxNy0vKiBTb2Z0IG9mZmxpbmUgYSBwYWdlICovXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmM6NjE4OnN0YXRpYyBzc2l6ZV90IHNvZnRfb2ZmbGluZV9wYWdlX3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldixcbmRyaXZlcnMvYmFzZS9tZW1vcnkuYy02MTktXHRcdFx0XHQgICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsXG4tLVxuZHJpdmVycy9iYXNlL21lbW9yeS5jLTYzMy0vKiBGb3JjaWJseSBvZmZsaW5lIGEgcGFnZSwgaW5jbHVkaW5nIGtpbGxpbmcgcHJvY2Vzc2VzLiAqL1xuZHJpdmVycy9iYXNlL21lbW9yeS5jOjYzNDpzdGF0aWMgc3NpemVfdCBoYXJkX29mZmxpbmVfcGFnZV9zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmMtNjM1LVx0XHRcdFx0ICAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLFxuLS1cbmRyaXZlcnMvYmFzZS9tZW1vcnkuYy02NTAtXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmM6NjUxOnN0YXRpYyBERVZJQ0VfQVRUUl9XTyhzb2Z0X29mZmxpbmVfcGFnZSk7XG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmM6NjUyOnN0YXRpYyBERVZJQ0VfQVRUUl9XTyhoYXJkX29mZmxpbmVfcGFnZSk7XG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmMtNjUzLSNlbmRpZlxuLS1cbmRyaXZlcnMvYmFzZS9tZW1vcnkuYy02NTUtLyogU2VlIHBoeXNfZGV2aWNlX3Nob3coKS4gKi9cbmRyaXZlcnMvYmFzZS9tZW1vcnkuYzo2NTY6aW50IF9fd2VhayBhcmNoX2dldF9tZW1vcnlfcGh5c19kZXZpY2UodW5zaWduZWQgbG9uZyBzdGFydF9wZm4pXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmMtNjU3LXtcbi0tXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmM9NjkxPXN0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwICptZW1vcnlfbWVtYmxrX2F0dHJfZ3JvdXBzW10gPSB7XG4tLVxuZHJpdmVycy9iYXNlL21lbW9yeS5jLTY5NS1cbmRyaXZlcnMvYmFzZS9tZW1vcnkuYzo2OTY6c3RhdGljIGludCBfX2FkZF9tZW1vcnlfYmxvY2soc3RydWN0IG1lbW9yeV9ibG9jayAqbWVtb3J5KVxuZHJpdmVycy9iYXNlL21lbW9yeS5jLTY5Ny17XG4tLVxuZHJpdmVycy9iYXNlL21lbW9yeS5jPTcxOT1zdGF0aWMgc3RydWN0IHpvbmUgKmVhcmx5X25vZGVfem9uZV9mb3JfbWVtb3J5X2Jsb2NrKHN0cnVjdCBtZW1vcnlfYmxvY2sgKm1lbSxcbi0tXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmMtNzY3LSAqL1xuZHJpdmVycy9iYXNlL21lbW9yeS5jOjc2ODp2b2lkIG1lbW9yeV9ibG9ja19hZGRfbmlkX2Vhcmx5KHN0cnVjdCBtZW1vcnlfYmxvY2sgKm1lbSwgaW50IG5pZClcbmRyaXZlcnMvYmFzZS9tZW1vcnkuYy03Njkte1xuLS1cbmRyaXZlcnMvYmFzZS9tZW1vcnkuYy03OTQtXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmM6Nzk1OnN0YXRpYyBpbnQgYWRkX21lbW9yeV9ibG9jayh1bnNpZ25lZCBsb25nIGJsb2NrX2lkLCBpbnQgbmlkLCB1bnNpZ25lZCBsb25nIHN0YXRlLFxuZHJpdmVycy9iYXNlL21lbW9yeS5jLTc5Ni1cdFx0XHQgICAgc3RydWN0IHZtZW1fYWx0bWFwICphbHRtYXAsXG4tLVxuZHJpdmVycy9iYXNlL21lbW9yeS5jLTg0MC1cbmRyaXZlcnMvYmFzZS9tZW1vcnkuYzo4NDE6c3RhdGljIHZvaWQgcmVtb3ZlX21lbW9yeV9ibG9jayhzdHJ1Y3QgbWVtb3J5X2Jsb2NrICptZW1vcnkpXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmMtODQyLXtcbi0tXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmMtODY0LSAqL1xuZHJpdmVycy9iYXNlL21lbW9yeS5jOjg2NTppbnQgY3JlYXRlX21lbW9yeV9ibG9ja19kZXZpY2VzKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgc2l6ZSxcbmRyaXZlcnMvYmFzZS9tZW1vcnkuYy04NjYtXHRcdFx0XHRpbnQgbmlkLCBzdHJ1Y3Qgdm1lbV9hbHRtYXAgKmFsdG1hcCxcbi0tXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmMtOTAzLSAqL1xuZHJpdmVycy9iYXNlL21lbW9yeS5jOjkwNDp2b2lkIHJlbW92ZV9tZW1vcnlfYmxvY2tfZGV2aWNlcyh1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIHNpemUpXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmMtOTA1LXtcbi0tXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmM9OTQ3PXN0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwICptZW1vcnlfcm9vdF9hdHRyX2dyb3Vwc1tdID0ge1xuLS1cbmRyaXZlcnMvYmFzZS9tZW1vcnkuYy05NTYtICovXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmM6OTU3OnZvaWQgX19pbml0IG1lbW9yeV9kZXZfaW5pdCh2b2lkKVxuZHJpdmVycy9iYXNlL21lbW9yeS5jLTk1OC17XG4tLVxuZHJpdmVycy9iYXNlL21lbW9yeS5jLTEwMDktICovXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmM6MTAxMDppbnQgd2Fsa19tZW1vcnlfYmxvY2tzKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgc2l6ZSxcbmRyaXZlcnMvYmFzZS9tZW1vcnkuYy0xMDExLVx0XHQgICAgICAgdm9pZCAqYXJnLCB3YWxrX21lbW9yeV9ibG9ja3NfZnVuY190IGZ1bmMpXG4tLVxuZHJpdmVycy9iYXNlL21lbW9yeS5jPTEwMzU9c3RydWN0IGZvcl9lYWNoX21lbW9yeV9ibG9ja19jYl9kYXRhIHtcbi0tXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmMtMTAzOS1cbmRyaXZlcnMvYmFzZS9tZW1vcnkuYzoxMDQwOnN0YXRpYyBpbnQgZm9yX2VhY2hfbWVtb3J5X2Jsb2NrX2NiKHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqZGF0YSlcbmRyaXZlcnMvYmFzZS9tZW1vcnkuYy0xMDQxLXtcbi0tXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmMtMTA1OS0gKi9cbmRyaXZlcnMvYmFzZS9tZW1vcnkuYzoxMDYwOmludCBmb3JfZWFjaF9tZW1vcnlfYmxvY2sodm9pZCAqYXJnLCB3YWxrX21lbW9yeV9ibG9ja3NfZnVuY190IGZ1bmMpXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmMtMTA2MS17XG4tLVxuZHJpdmVycy9iYXNlL21lbW9yeS5jLTEwNzYtICovXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmM6MTA3NzpzdGF0aWMgaW50IG1lbW9yeV9ncm91cF9yZWdpc3RlcihzdHJ1Y3QgbWVtb3J5X2dyb3VwIGdyb3VwKVxuZHJpdmVycy9iYXNlL21lbW9yeS5jLTEwNzgte1xuLS1cbmRyaXZlcnMvYmFzZS9tZW1vcnkuYy0xMTE3LSAqL1xuZHJpdmVycy9iYXNlL21lbW9yeS5jOjExMTg6aW50IG1lbW9yeV9ncm91cF9yZWdpc3Rlcl9zdGF0aWMoaW50IG5pZCwgdW5zaWduZWQgbG9uZyBtYXhfcGFnZXMpXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmMtMTExOS17XG4tLVxuZHJpdmVycy9iYXNlL21lbW9yeS5jPTExMzE9RVhQT1JUX1NZTUJPTF9HUEwobWVtb3J5X2dyb3VwX3JlZ2lzdGVyX3N0YXRpYyk7XG4tLVxuZHJpdmVycy9iYXNlL21lbW9yeS5jLTExNDctICovXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmM6MTE0ODppbnQgbWVtb3J5X2dyb3VwX3JlZ2lzdGVyX2R5bmFtaWMoaW50IG5pZCwgdW5zaWduZWQgbG9uZyB1bml0X3BhZ2VzKVxuZHJpdmVycy9iYXNlL21lbW9yeS5jLTExNDkte1xuLS1cbmRyaXZlcnMvYmFzZS9tZW1vcnkuYz0xMTYzPUVYUE9SVF9TWU1CT0xfR1BMKG1lbW9yeV9ncm91cF9yZWdpc3Rlcl9keW5hbWljKTtcbi0tXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmMtMTE3NS0gKi9cbmRyaXZlcnMvYmFzZS9tZW1vcnkuYzoxMTc2OmludCBtZW1vcnlfZ3JvdXBfdW5yZWdpc3RlcihpbnQgbWdpZClcbmRyaXZlcnMvYmFzZS9tZW1vcnkuYy0xMTc3LXtcbi0tXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmM9MTIwMD1zdHJ1Y3QgbWVtb3J5X2dyb3VwICptZW1vcnlfZ3JvdXBfZmluZF9ieV9pZChpbnQgbWdpZClcbi0tXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmMtMTIwOS0gKi9cbmRyaXZlcnMvYmFzZS9tZW1vcnkuYzoxMjEwOmludCB3YWxrX2R5bmFtaWNfbWVtb3J5X2dyb3VwcyhpbnQgbmlkLCB3YWxrX21lbW9yeV9ncm91cHNfZnVuY190IGZ1bmMsXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmMtMTIxMS1cdFx0XHQgICAgICAgc3RydWN0IG1lbW9yeV9ncm91cCAqZXhjbHVkZWQsIHZvaWQgKmFyZylcbi0tXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmMtMTIzMi0jaWYgZGVmaW5lZChDT05GSUdfTUVNT1JZX0ZBSUxVUkUpIFx1MDAyNlx1MDAyNiBkZWZpbmVkKENPTkZJR19NRU1PUllfSE9UUExVRylcbmRyaXZlcnMvYmFzZS9tZW1vcnkuYzoxMjMzOnZvaWQgbWVtYmxrX25yX3BvaXNvbl9pbmModW5zaWduZWQgbG9uZyBwZm4pXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmMtMTIzNC17XG4tLVxuZHJpdmVycy9iYXNlL21lbW9yeS5jLTEyNDMtXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmM6MTI0NDp2b2lkIG1lbWJsa19ucl9wb2lzb25fc3ViKHVuc2lnbmVkIGxvbmcgcGZuLCBsb25nIGkpXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmMtMTI0NS17XG4tLVxuZHJpdmVycy9iYXNlL21lbW9yeS5jLTEyNTQtXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmM6MTI1NTpzdGF0aWMgdW5zaWduZWQgbG9uZyBtZW1ibGtfbnJfcG9pc29uKHN0cnVjdCBtZW1vcnlfYmxvY2sgKm1lbSlcbmRyaXZlcnMvYmFzZS9tZW1vcnkuYy0xMjU2LXtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD41NS8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTQgMDc6NTE8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjgtZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNDA2NTUKCQkJCQkJCW91dHB1dDogMjY4CgkJCQkJCQl0aG91Z2h0czogMjQxOQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXNpcyBvZiBNZW1vcnkgSG90cGx1ZyBhbmQgWm9uZSBDb250aWd1aXR5IENoYW5nZXMgZm9yIEZ1enppbmcqKgoKQWxyaWdodCwgbGV0JiMzOTtzIGJyZWFrIHRoaXMgZG93bi4gSW4gYSA2NC1iaXQgTGludXggZW52aXJvbm1lbnQgd2l0aCBga2FsbHN5bXNgLCBzdGF0aWMgZnVuY3Rpb25zIHRoYXQgYXJlbiYjMzk7dCBpbmxpbmVkICphcmUqIHN5bWJvbHMgaW4gYHZtbGludXhgLCB0aGF0JiMzOTtzIHRoZSBrZXkuIFNvLCB0aGUgZmlyc3QgcXVlc3Rpb24gaXMgYWJvdXQgc3ltYm9sIGNvdmVyYWdlIGluIFN5emthbGxlciwgd2hpY2ggaXMgY3J1Y2lhbCBoZXJlLiBBcmUgZnVuY3Rpb25zIGxpa2UgYG1lbW9yeV9ibG9ja19vbmxpbmVgLCBgbWVtb3J5X2Jsb2NrX29mZmxpbmVgLCBgcmVtb3ZlX3Bmbl9yYW5nZV9mcm9tX3pvbmVgLCBhbmQgdGhlIHJlc3QsIGFjdHVhbCBzeW1ib2xzPwoKSSBuZWVkIHRvIGNvbmZpcm0gaWYgdGhvc2Ugc3RhdGljIGZ1bmN0aW9ucywgZXNwZWNpYWxseSBgbWVtb3J5X2Jsb2NrX29ubGluZWAgYW5kIGBzaHJpbmtfem9uZV9zcGFuYCwgYXJlICpub3QqIGlubGluZWQsIG9yIGlmIHRoZXkmIzM5O3JlIHB1YmxpYy9leHBvcnRlZC4gVGhlIGNvZGUgaXMgaW4gYG1tL21lbW9yeV9ob3RwbHVnLmNgLiBBaCwgZ290IGl0LgoKKiAgIGByZW1vdmVfcGZuX3JhbmdlX2Zyb21fem9uZWAgaXMgYSAqbm9uLXN0YXRpYyogZ2xvYmFsIGZ1bmN0aW9uLgoqICAgYGFkanVzdF9wcmVzZW50X3BhZ2VfY291bnRgIGlzIGFsc28gKm5vbi1zdGF0aWMqLgoqICAgYG9mZmxpbmVfcGFnZXNgIGFuZCBgb25saW5lX3BhZ2VzYCBhcmUgY2xlYXJseSBub24tc3RhdGljLgoqICAgQW5kIHRoZXJlJiMzOTtzIGBtb3ZlX3Bmbl9yYW5nZV90b196b25lYCwgYW5vdGhlciBub24tc3RhdGljIGZ1bmN0aW9uLgoKQW5kIGluIGBtbS9jb21wYWN0aW9uLmNgLCB0aGVyZSYjMzk7cyBgaXNvbGF0ZV9taWdyYXRlcGFnZXNfcmFuZ2VgLCBhbmQgZnJpZW5kcy4gTm93LCB0aGUgY29yZSBxdWVzdGlvbjogQ2FuIEkgaW5jbHVkZSB0aGUgc3RhdGljIG9uZXMsIGxpa2UgYG1lbW9yeV9ibG9ja19vbmxpbmVgLCBvciBgbWVtb3J5X2Jsb2NrX29mZmxpbmVgLCBpbiBgRm9jdXNTeW1ib2xzYD8KCkxldCYjMzk7cyByZWZlciB0byB0aGUgZ3VpZGVsaW5lcy4gVGhlIGNyaXRpY2FsIGJpdCBpcyB0aGUgaGFuZGxpbmcgb2Ygc3RhdGljIGlubGluZSBmdW5jdGlvbnM6IFRoZXkgKmxhY2sqIGRpc3RpbmN0IGFkZHJlc3NlcyBpbiBgdm1saW51eGAuIFNvLCBJIG5lZWQgdG8gaWRlbnRpZnkgdGhlIG5vbi1zdGF0aWMgKmNhbGxlciogZnVuY3Rpb25zIGluIHRoZSBgLmNgIGZpbGVzIHRoYXQgdXNlIHRob3NlIHN0YXRpYyBpbmxpbmUgaGVscGVycy4gQXZvaWRpbmcgdWJpcXVpdG91cyB3cmFwcGVycyBpcyBpbXBvcnRhbnQuCgpTbywgYW55IHN0YXRpYyBmdW5jdGlvbnMgKmluIGAuY2AgZmlsZXMgdGhhdCBhcmVuJiMzOTt0IGlubGluZWQsIG9yIG5vbi1zdGF0aWMgZnVuY3Rpb25zKiBBUkUgc3ltYm9scyB3aXRoIGRpc3RpbmN0IGFkZHJlc3Nlcy4gUHJpb3JpdGl6aW5nIG5vbi1zdGF0aWMgZnVuY3Rpb25zIGlzIHRoZSBzYWZlc3QgYXBwcm9hY2guCgpMZXQmIzM5O3MgZ28gYmFjayBhbmQgZXhhbWluZSB0aGUgbGlzdC4gV2UgaGF2ZToKCiogICBgYWRqdXN0X3ByZXNlbnRfcGFnZV9jb3VudGAgKG1vZGlmaWVkIGRpcmVjdGx5KS4KKiAgIGByZW1vdmVfcGZuX3JhbmdlX2Zyb21fem9uZWAgKG1vZGlmaWVkIGRpcmVjdGx5KS4KKiAgIGBvZmZsaW5lX3BhZ2VzYCAoY2FsbHMgYHJlbW92ZV9wZm5fcmFuZ2VfZnJvbV96b25lYCkuCiogICBgb25saW5lX3BhZ2VzYCAoY2FsbHMgYGFkanVzdF9wcmVzZW50X3BhZ2VfY291bnRgIG9yIGBtb3ZlX3Bmbl9yYW5nZV90b196b25lYCkuCiogICBgbWVtb3J5X2Jsb2NrX29ubGluZWAgKGluIGBkcml2ZXJzL2Jhc2UvbWVtb3J5LmNgKS4KKiAgIGBtZW1vcnlfYmxvY2tfb2ZmbGluZWAgKGluIGBkcml2ZXJzL2Jhc2UvbWVtb3J5LmNgKS4KKiAgIGBpc29sYXRlX21pZ3JhdGVwYWdlc19yYW5nZWAgLyBgaXNvbGF0ZV9mcmVlcGFnZXNfcmFuZ2VgIChleGVyY2lzaW5nIGB6b25lX2lzX2NvbnRpZ3VvdXNgKS4KCldoYXQgYWJvdXQgYHNocmlua196b25lX3NwYW5gPyBBaCwgaXQmIzM5O3MgKnN0YXRpYyogaW4gYG1tL21lbW9yeV9ob3RwbHVnLmNgLCBhbmQgY29udGFpbnMgdGhlIG1vZGlmaWVkIGxvZ2ljLiBDcnVjaWFsbHksIGl0JiMzOTtzIGNhbGxlZCBieSBgcmVtb3ZlX3Bmbl9yYW5nZV9mcm9tX3pvbmVgLiBTbyBpbmNsdWRpbmcgYHJlbW92ZV9wZm5fcmFuZ2VfZnJvbV96b25lYCBpcyB0aGUgbm9uLXN0YXRpYyBzeW1ib2wgdGhhdCBpbnZva2VzIHRoZSBzdGF0aWMgZnVuY3Rpb24sIHRodXMgYHNocmlua196b25lX3NwYW5gIGlzIGNvdmVyZWQuCgpDcnVjaWFsbHk6IGFyZSBhbnkgb2YgdGhlc2UgdWJpcXVpdG91cz8gTm8hIFRoZXkgYXJlIG9ubHkgY2FsbGVkIGR1cmluZyBtZW1vcnkgaG90cGx1ZyBvcGVyYXRpb25zLCBub3QgZ2VuZXJhbCBsaWZlY3ljbGUgcGF0aHMuIFdoYXQgYWJvdXQgYGlzb2xhdGVfbWlncmF0ZXBhZ2VzX3JhbmdlYD8gSXQmIzM5O3MgY29tcGFjdGlvbi1zcGVjaWZpYy4KClRoZSBjb3JlIG9mIHRoaXMgcGF0Y2ggaXMgdGhlIGNoYW5nZSBpbiBob3cgem9uZSBjb250aWd1aXR5IGlzIHRyYWNrZWQuIE5vdyBpdCYjMzk7cyB0cmFja2VkIGR5bmFtaWNhbGx5IHRocm91Z2ggYHBhZ2VzX3dpdGhfb25saW5lX21lbW1hcGAuIFRoZSBwcmV2aW91cyBtZXRob2Qgb2Ygc2Nhbm5pbmcgYWxsIHBhZ2VibG9ja3MgaW4gYSB6b25lIChgc2V0X3pvbmVfY29udGlndW91c2AgaW4gYG1tL21tX2luaXQuY2ApIGlzIG5vIGxvbmdlciB1c2VkLiBUaGlzIGlzIGFsbCB0cmlnZ2VyZWQgZHVyaW5nIG1lbW9yeSBvbmxpbmluZy9vZmZsaW5pbmcgYnkgZnVuY3Rpb25zIGxpa2UgYG1lbW9yeV9ibG9ja19vbmxpbmVgLCBgbWVtb3J5X2Jsb2NrX29mZmxpbmVgLCBldGMuCgpTbywgbGV0JiMzOTtzIHJldmlldyB0aGUgZmluYWwgbGlzdCBvZiBzeW1ib2xzOgoKKiAgIGBhZGp1c3RfcHJlc2VudF9wYWdlX2NvdW50YAoqICAgYHJlbW92ZV9wZm5fcmFuZ2VfZnJvbV96b25lYAoqICAgYHNocmlua196b25lX3NwYW5gCiogICBgbWVtb3J5X2Jsb2NrX29ubGluZWAKKiAgIGBtZW1vcnlfYmxvY2tfb2ZmbGluZWAKKiAgIGBvZmZsaW5lX3BhZ2VzYAoqICAgYG9ubGluZV9wYWdlc2AKKiAgIGBpc29sYXRlX21pZ3JhdGVwYWdlc19yYW5nZWAKCk5vdywgcmVnYXJkaW5nIGBtZW1tYXBfaW5pdF96b25lX3JhbmdlYCBhbmQgYGluaXRfdW5hdmFpbGFibGVfcmFuZ2VgLCB0aGVzZSBhcmUgYF9faW5pdGAgZnVuY3Rpb25zLiBTaW5jZSBzeXprYWxsZXIgZnV6emVzIHJ1bnRpbWUgYWZ0ZXIgYm9vdCwgd2Ugc2hvdWxkICpleGNsdWRlKiB0aGVzZS4KCldoYXQgYWJvdXQgY29uZmlndXJhdGlvbiBvcHRpb25zPyBXZSBuZWVkOgoKMS4gIGBNRU1PUllfSE9UUExVR2AgKGVuYWJsZXMgYGRyaXZlcnMvYmFzZS9tZW1vcnkuCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD41Ni8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTQgMDc6NTE8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5zZXQtcmVzdWx0czwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O01FTU9SWV9IT1RQTFVHJiMzNDssCiAgICAmIzM0O01FTU9SWV9IT1RSRU1PVkUmIzM0OywKICAgICYjMzQ7U1BBUlNFTUVNX1ZNRU1NQVAmIzM0OywKICAgICYjMzQ7Q09NUEFDVElPTiYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O21lbW9yeV9ibG9ja19vbmxpbmUmIzM0OywKICAgICYjMzQ7bWVtb3J5X2Jsb2NrX29mZmxpbmUmIzM0OywKICAgICYjMzQ7YWRqdXN0X3ByZXNlbnRfcGFnZV9jb3VudCYjMzQ7LAogICAgJiMzNDtyZW1vdmVfcGZuX3JhbmdlX2Zyb21fem9uZSYjMzQ7LAogICAgJiMzNDtzaHJpbmtfem9uZV9zcGFuJiMzNDssCiAgICAmIzM0O29mZmxpbmVfcGFnZXMmIzM0OywKICAgICYjMzQ7b25saW5lX3BhZ2VzJiMzNDssCiAgICAmIzM0O2lzb2xhdGVfbWlncmF0ZXBhZ2VzX3JhbmdlJiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIHJlZmFjdG9ycyBjb3JlIG1lbW9yeSBtYW5hZ2VtZW50IGxvZ2ljIGZvciB0cmFja2luZyB6b25lIGNvbnRpZ3VpdHkgYW5kIHNocmlua2luZyB6b25lIHNwYW5zIGFjcm9zcyBtbS9tZW1vcnlfaG90cGx1Zy5jLCBkcml2ZXJzL2Jhc2UvbWVtb3J5LmMsIGFuZCBpbmNsdWRlL2xpbnV4L21tem9uZS5oLiBJbnN0ZWFkIG9mIHNjYW5uaW5nIHBhZ2VibG9ja3MsIHpvbmUgY29udGlndWl0eSBpcyBub3cgdHJhY2tlZCBkeW5hbWljYWxseSB2aWEgcGFnZXNfd2l0aF9vbmxpbmVfbWVtbWFwIGFuZCB1cGRhdGVkIGR1cmluZyBtZW1vcnkgb25saW5lL29mZmxpbmUgb3BlcmF0aW9ucy4gSW5jb3JyZWN0IHpvbmUgY29udGlndWl0eSB0cmFja2luZyBjYW4gbGVhZCB0byBpbnZhbGlkIHBmbl90b19wYWdlKCkgbG9va3VwcyBkdXJpbmcgbWVtb3J5IGNvbXBhY3Rpb24gKGUuZy4gaXNvbGF0ZV9taWdyYXRlcGFnZXNfcmFuZ2UpLCBhbmQgbW9kaWZpZWQgem9uZSBzaHJpbmtpbmcgbG9naWMgKHN1YnNlY3Rpb25fb3ZlcmxhcHNfem9uZSkgY291bGQgY29ycnVwdCB6b25lIGJvdW5kYXJpZXMuIFRoZXNlIHBhdGhzIGFyZSByZWFjaGFibGUgdmlhIHN5c2ZzIG1lbW9yeSBibG9jayBtYW5hZ2VtZW50IGFuZCBtZW1vcnkgY29tcGFjdGlvbi4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7TUVNT1JZX0hPVFBMVUcmIzM0OywKICAgICYjMzQ7TUVNT1JZX0hPVFJFTU9WRSYjMzQ7LAogICAgJiMzNDtTUEFSU0VNRU1fVk1FTU1BUCYjMzQ7LAogICAgJiMzNDtDT01QQUNUSU9OJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7bWVtb3J5X2Jsb2NrX29ubGluZSYjMzQ7LAogICAgJiMzNDttZW1vcnlfYmxvY2tfb2ZmbGluZSYjMzQ7LAogICAgJiMzNDthZGp1c3RfcHJlc2VudF9wYWdlX2NvdW50JiMzNDssCiAgICAmIzM0O3JlbW92ZV9wZm5fcmFuZ2VfZnJvbV96b25lJiMzNDssCiAgICAmIzM0O3Nocmlua196b25lX3NwYW4mIzM0OywKICAgICYjMzQ7b2ZmbGluZV9wYWdlcyYjMzQ7LAogICAgJiMzNDtvbmxpbmVfcGFnZXMmIzM0OywKICAgICYjMzQ7aXNvbGF0ZV9taWdyYXRlcGFnZXNfcmFuZ2UmIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggcmVmYWN0b3JzIGNvcmUgbWVtb3J5IG1hbmFnZW1lbnQgbG9naWMgZm9yIHRyYWNraW5nIHpvbmUgY29udGlndWl0eSBhbmQgc2hyaW5raW5nIHpvbmUgc3BhbnMgYWNyb3NzIG1tL21lbW9yeV9ob3RwbHVnLmMsIGRyaXZlcnMvYmFzZS9tZW1vcnkuYywgYW5kIGluY2x1ZGUvbGludXgvbW16b25lLmguIEluc3RlYWQgb2Ygc2Nhbm5pbmcgcGFnZWJsb2Nrcywgem9uZSBjb250aWd1aXR5IGlzIG5vdyB0cmFja2VkIGR5bmFtaWNhbGx5IHZpYSBwYWdlc193aXRoX29ubGluZV9tZW1tYXAgYW5kIHVwZGF0ZWQgZHVyaW5nIG1lbW9yeSBvbmxpbmUvb2ZmbGluZSBvcGVyYXRpb25zLiBJbmNvcnJlY3Qgem9uZSBjb250aWd1aXR5IHRyYWNraW5nIGNhbiBsZWFkIHRvIGludmFsaWQgcGZuX3RvX3BhZ2UoKSBsb29rdXBzIGR1cmluZyBtZW1vcnkgY29tcGFjdGlvbiAoZS5nLiBpc29sYXRlX21pZ3JhdGVwYWdlc19yYW5nZSksIGFuZCBtb2RpZmllZCB6b25lIHNocmlua2luZyBsb2dpYyAoc3Vic2VjdGlvbl9vdmVybGFwc196b25lKSBjb3VsZCBjb3JydXB0IHpvbmUgYm91bmRhcmllcy4gVGhlc2UgcGF0aHMgYXJlIHJlYWNoYWJsZSB2aWEgc3lzZnMgbWVtb3J5IGJsb2NrIG1hbmFnZW1lbnQgYW5kIG1lbW9yeSBjb21wYWN0aW9uLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjU3LzE8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xNCAwNzo1MTwvdGQ+CgkJCTx0ZD5hY3Rpb248L3RkPgoJCQk8dGQ+SWY8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT43bTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NTgvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE0IDA3OjUxPC90ZD4KCQkJPHRkPmFnZW50PC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjdtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmNvcmU8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggb3B0aW1pemVzIGNvbnRpZ3VvdXMgem9uZSBkZXRlY3Rpb24gYnkgaW50cm9kdWNpbmcgdGhlIGBwYWdlc193aXRoX29ubGluZV9tZW1tYXBgIGNvdW50ZXIgaW4gYHN0cnVjdCB6b25lYCB0byByZXBsYWNlIHRoZSBpdGVyYXRpb24gb3ZlciBwYWdlYmxvY2tzIGluIGBzZXRfem9uZV9jb250aWd1b3VzKClgLiBJdCBhbHNvIHJlZmFjdG9ycyBzdWJzZWN0aW9uIG92ZXJsYXAgY2hlY2tpbmcgZHVyaW5nIG1lbW9yeSBob3RwbHVnIG9wZXJhdGlvbnMgKGBkcml2ZXJzL2Jhc2UvbWVtb3J5LmNgLCBgbW0vbWVtb3J5X2hvdHBsdWcuY2AsIGBtbS9tbV9pbml0LmNgKS5cblxuTm9uZSBvZiB0aGUgY2hhbmdlcyB0b3VjaCBrZXJuZWwtdG8tdXNlciBjb3B5IG1lY2hhbmlzbXMgKGUuZy4sIGBjb3B5X3RvX3VzZXJgLCBuZXRsaW5rLCBpb2N0bCwgZXRjLiksIG5vciBkbyB0aGV5IGludHJvZHVjZSB1bmluaXRpYWxpemVkIHN0YWNrIG9yIGhlYXAgYWxsb2NhdGlvbnMuIGBzdHJ1Y3Qgem9uZWAgaW5zdGFuY2VzIGFyZSB6ZXJvLWluaXRpYWxpemVkIGR1cmluZyBlYXJseSBib290IGFuZCBob3RwbHVnIG5vZGUgYWxsb2NhdGlvbi4gQW55IHBvdGVudGlhbCBsb2dpYyBidWdzIGluIGNvbnRpZ3VvdXMgem9uZSBjYWxjdWxhdGlvbiBvciBQRk4gdHJhdmVyc2FsIGNvdWxkIGxlYWQgdG8gaW52YWxpZCBzdHJ1Y3QgcGFnZSBkZXJlZmVyZW5jZXMgb3Igb3V0LW9mLWJvdW5kcyBhY2Nlc3NlcyBkdXJpbmcgY29tcGFjdGlvbi9wYWdlIGlzb2xhdGlvbiwgd2hpY2ggZmFsbCB1bmRlciB0aGUgcHVydmlldyBvZiBLQVNBTiBvciBzdGFuZGFyZCBmYXVsdCBoYW5kbGVycywgbm90IEtNU0FOLiBUaGVyZWZvcmUsIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpcyBub3Qgd2FycmFudGVkLiYjMzQ7LAogICYjMzQ7TmVlZHNLTVNBTiYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5JbnN0cnVjdGlvbjo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBzZWN1cml0eSBlbmdpbmVlciBzcGVjaWFsaXppbmcgaW4ga2VybmVsIG1lbW9yeQplcnJvciBkZXRlY3RvcnMgKEtBU0FOIGFuZCBLTVNBTikuIFlvdXIgam9iIGlzIHRvIHJldmlldyB0aGUgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZApkZXRlcm1pbmUgaWYgdGhlIGNvZGUgY2hhbmdlcyBqdXN0aWZ5IHNwYXduaW5nIGEgZGVkaWNhdGVkIEtNU0FOIChLZXJuZWxNZW1vcnlTYW5pdGl6ZXIpCmZ1enppbmcgc2Vzc2lvbiBpbiBhZGRpdGlvbiB0byBzdGFuZGFyZCBLQVNBTiBmdXp6aW5nLgoKQ1JJVElDQUwgRElTVElOQ1RJT04gQkVUV0VFTiBLQVNBTiBBTkQgS01TQU46Ci0gU3RhbmRhcmQgS0FTQU4ga2VybmVsIGJ1aWxkcyAodXBzdHJlYW0tYXBwYXJtb3Ita2FzYW4uY29uZmlnKSBhbHJlYWR5IGVuYWJsZQogIGEgY29tcHJlaGVuc2l2ZSBzdWl0ZSBvZiBkZWJ1Z2dpbmcgdG9vbHMgYW5kIHNhbml0aXplcnMsIGluY2x1ZGluZyBLQVNBTgogIChvdXQtb2YtYm91bmRzIGFjY2Vzc2VzLCB1c2UtYWZ0ZXItZnJlZSwgZG91YmxlIGZyZWUsIGludmFsaWQgZnJlZSksIExPQ0tERVAKICAobG9ja2luZyBidWdzIGFuZCBkZWFkbG9ja3MpLCBVQi1zYW5pdGl6ZXJzLCBhbmQgbWVtb3J5IGNvcnJ1cHRpb24gY2hlY2tzLgotIEtNU0FOIChLZXJuZWxNZW1vcnlTYW5pdGl6ZXIpIGRldGVjdHMgcmVhZHMgb2YgVU5JTklUSUFMSVpFRCBtZW1vcnkgKHN0YWNrLCBoZWFwLAogIG9yIHBhZ2UgYWxsb2NhdGlvbnMpIGFuZCBrZXJuZWwtdG8tdXNlciBtZW1vcnkgaW5mby1sZWFrcy4KClJ1bGU6IFRIRVJFIElTIE5PIFNFTlNFIElOIFJVTk5JTkcgQSBLTVNBTiBTRVNTSU9OIElGIEEgQlVHIENBTiBCRSBDQVVHSFQgQlkgS0FTQU4sCkxPQ0tERVAsIE9SIE9USEVSIFNUQU5EQVJEIEJVRyBERVRFQ1RPUlMuCkEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpbmN1cnMgc2lnbmlmaWNhbnQgcmVzb3VyY2UgY29zdHMuIFlvdSBtdXN0IE9OTFkKc2V0IE5lZWRzS01TQU49dHJ1ZSBpZiB0aGUgY29kZSBjaGFuZ2VzIGludHJvZHVjZSBvciBleHBvc2UgVU5JTklUSUFMSVpFRCBNRU1PUlkgcmlza3MKdGhhdCBhcmUgZGV0ZWN0ZWQgT05MWSBieSBLTVNBTi4KCkxvb2sgaG9saXN0aWNhbGx5IGF0IHRoZSBwYXRjaCBzZXJpZXMgYW5kIHN1cnJvdW5kaW5nIGNvZGUuIEV2ZW4gaWYgbm8gZGlyZWN0CnVuaW5pdGlhbGl6ZWQgZmllbGQgYWNjZXNzZXMgb3IgbmV3IGJ1ZmZlciBhbGxvY2F0aW9ucyBhcmUgYWRkZWQgaW4gdGhlIGRpZmYgaXRzZWxmLAphIHBhdGNoIG1heSBhbHRlciBjb250cm9sIGZsb3csIGJvdW5kcyBjaGVja2luZywgb3IgZGF0YSBsZW5ndGggY2FsY3VsYXRpb25zIGluIHdheXMKdGhhdCBjaGFuZ2UgaG93IHRoZSByZXN0IG9mIHRoZSBjb2RlIG9wZXJhdGVzIG9uIGV4aXN0aW5nIGJ1ZmZlcnMgKGUuZy4gYWxsb3dpbmcKdW5pbml0aWFsaXplZCBzdGFjay9oZWFwIG1lbW9yeSB0byBiZSByZWFkLCBjb3BpZWQgdG8gdXNlciBzcGFjZSwgb3IgdXNlZCBpbiBjb250cm9sCmZsb3cpLiBEbyBub3QgaGVzaXRhdGUgdG8gdXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gaW5zcGVjdCB0aGUgc3Vycm91bmRpbmcgY29kZSwKY2FsbGVkIGZ1bmN0aW9ucywgYW5kIGNhbGxlcnMuCgpTZXQgTmVlZHNLTVNBTj10cnVlIE9OTFkgSUYgdGhlIHBhdGNoIGludHJvZHVjZXMgb3IgbW9kaWZpZXM6CjEuIEtlcm5lbCBzdHJ1Y3R1cmVzIHNlbnQgdG8gdXNlciBzcGFjZSAodmlhIGNvcHlfdG9fdXNlciwgcHV0X3VzZXIsIG5ldGxpbmsgc2tiCiAgIGF0dHJpYnV0ZXMsIGlvY3RsIG91dHB1dCBhcmd1bWVudHMsIHNvY2tldCBvcHRpb25zLCBvciBCUEYgYnVmZmVycykgd2hlcmUgZmllbGRzCiAgIG9yIHN0cnVjdHVyZSBwYWRkaW5nIG1pZ2h0IG5vdCBiZSBmdWxseSBpbml0aWFsaXplZC96ZXJvZWQuCjIuIENvbmRpdGlvbmFsIGxvZ2ljIG9yIGJyYW5jaGluZyB0aGF0IGRlcGVuZHMgb24gcG90ZW50aWFsbHkgdW5pbml0aWFsaXplZCB2YXJpYWJsZXMKICAgb3Igc3RydWN0IGZpZWxkcy4KMy4gQWxsb2NhdGlvbiBvciBpbml0aWFsaXphdGlvbiBvZiBjb21wbGV4IGRhdGEgc3RydWN0dXJlcyB3aGVyZSB1bmluaXRpYWxpemVkIGZpZWxkcwogICBjb3VsZCBiZSByZWFkIGxhdGVyIGluIHJlYWNoYWJsZSBjb2RlIHBhdGhzLgo0LiBCb3VuZHMgY2hlY2tzLCBsZW5ndGhzLCBvciBsb2dpYyBpbiBhIHdheSB0aGF0IGFsbG93cyBzdXJyb3VuZGluZyBjb2RlIHRvIGFjY2VzcwogICB1bmluaXRpYWxpemVkIGJ5dGVzIG9mIGV4aXN0aW5nIGJ1ZmZlcnMuCgpTZXQgTmVlZHNLTVNBTj1mYWxzZSBJRjoKLSBUaGUgY29kZSBjaGFuZ2VzIHByaW1hcmlseSByaXNrIG91dC1vZi1ib3VuZHMgYWNjZXNzLCBhcnJheSBvdmVyZmxvd3MsIE5VTEwgcG9pbnRlcgogIGRlcmVmZXJlbmNlcywgbG9ja2luZyBkZWFkbG9ja3MsIG9yIHVzZS1hZnRlci1mcmVlIGJ1Z3MgKHRoZXNlIGFyZSBhbHJlYWR5IGNhdWdodAogIGJ5IEtBU0FOLCBMT0NLREVQLCBvciBzdGFuZGFyZCBidWcgZGV0ZWN0b3JzKS4KLSBBbGwgc3RhY2svaGVhcCBzdHJ1Y3R1cmVzIHRvdWNoZWQgb3IgaW50cm9kdWNlZCBieSB0aGUgcGF0Y2ggYXJlIGZ1bGx5IHplcm9lZAogIG9yIGluaXRpYWxpemVkIChlLmcuIHVzaW5nID0gezB9LCBtZW1zZXQsIGt6YWxsb2MpIGJlZm9yZSBiZWluZyByZWFkIG9yIGNvcGllZC4KLSBUaGUgcGF0Y2ggZG9lcyBub3QgaW50cm9kdWNlIGFueSByaXNrIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHVzYWdlIG9yIGluZm8tbGVha3MuCgpVc2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBpbnNwZWN0IHRoZSBzdXJyb3VuZGluZyBjb2RlIGlmIG5lY2Vzc2FyeSwgdGhlbiBwcm92aWRlCmRldGFpbGVkIEtNU0FOUmVhc29uaW5nIGNvbnRyYXN0aW5nIEtBU0FOIHZzIEtNU0FOIGFwcGxpY2FiaWxpdHkgZm9yIHRoaXMgcGF0Y2guClByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLgoKClVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuCkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LgpJZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UHJvbXB0OjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+VGFyZ2V0IGFyY2hpdGVjdHVyZTogYW1kNjQKCkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOgpjb21taXQgYjc1NzQxZTk2MDQ3MDRmYzUwNmIxODNjNTJkNTE1MjFlMjQwMTA5MApBdXRob3I6IHN5ei1jbHVzdGVyICZsdDt0cmlhZ2VAc3l6a2FsbGVyLmNvbSZndDsKRGF0ZTogICBNb24gU2VwIDE0IDA3OjQyOjU2IDIwMjYgJiM0MzswMDAwCgogICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3CgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9tbS9waHlzaWNhbF9tZW1vcnkucnN0IGIvRG9jdW1lbnRhdGlvbi9tbS9waHlzaWNhbF9tZW1vcnkucnN0CmluZGV4IGEwOTQwN2Q3Mjk3MzYuLjJlNjdlOGIyM2E5OTQgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vbW0vcGh5c2ljYWxfbWVtb3J5LnJzdAomIzQzOyYjNDM7JiM0MzsgYi9Eb2N1bWVudGF0aW9uL21tL3BoeXNpY2FsX21lbW9yeS5yc3QKQEAgLTQ4MCw2ICYjNDM7NDgwLDEyIEBAIEdlbmVyYWwKICAgYGBwcmVzZW50X3BhZ2VzYGAgc2hvdWxkIHVzZSBgYGdldF9vbmxpbmVfbWVtcygpYGAgdG8gZ2V0IGEgc3RhYmxlIHZhbHVlLiBJdAogICBpcyBpbml0aWFsaXplZCBieSBgYGNhbGN1bGF0ZV9ub2RlX3RvdGFscGFnZXMoKWBgLgogCiYjNDM7YGBwYWdlc193aXRoX29ubGluZV9tZW1tYXBgYAomIzQzOyAgUGFnZXMgd2l0aGluIHRoZSB6b25lIHRoYXQgaGF2ZSBhbiBvbmxpbmUgbWVtb3J5IG1hcDogcHJlc2VudCBwYWdlcyBhbmQKJiM0MzsgIG1lbW9yeSBob2xlcyB3aG9zZSBtZW1vcnkgbWFwIGhhcyBiZWVuIGluaXRpYWxpemVkIGFuZAomIzQzOyAgYGBwZm5fdG9fb25saW5lX3BhZ2UoKWBgIHN1Y2NlZWRzLiBTZWUgdGhlIGNvbW1lbnQgZm9yCiYjNDM7ICBgYHBhZ2VzX3dpdGhfb25saW5lX21lbW1hcGBgIGluIGBgaW5jbHVkZS9saW51eC9tbXpvbmUuaGBgIGZvciBtb3JlIGRldGFpbHMuCiYjNDM7CiBgYHByZXNlbnRfZWFybHlfcGFnZXNgYAogICBUaGUgcHJlc2VudCBwYWdlcyBleGlzdGluZyB3aXRoaW4gdGhlIHpvbmUgbG9jYXRlZCBvbiBtZW1vcnkgYXZhaWxhYmxlIHNpbmNlCiAgIGVhcmx5IGJvb3QsIGV4Y2x1ZGluZyBob3RwbHVnZ2VkIG1lbW9yeS4gRGVmaW5lZCBvbmx5IHdoZW4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9tZW1vcnkuYyBiL2RyaXZlcnMvYmFzZS9tZW1vcnkuYwppbmRleCA1ZWVhZDMzNDZmMWUzLi4yOGY5NTAzZjZhNzEwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jhc2UvbWVtb3J5LmMKJiM0MzsmIzQzOyYjNDM7IGIvZHJpdmVycy9iYXNlL21lbW9yeS5jCkBAIC0yNTUsNiAmIzQzOzI1NSw3IEBAIHN0YXRpYyBpbnQgbWVtb3J5X2Jsb2NrX29ubGluZShzdHJ1Y3QgbWVtb3J5X2Jsb2NrICptZW0pCiAJCW5yX3ZtZW1tYXBfcGFnZXMgPSBtZW0tJmd0O2FsdG1hcC0mZ3Q7ZnJlZTsKIAogCW1lbV9ob3RwbHVnX2JlZ2luKCk7CiYjNDM7CWNsZWFyX3pvbmVfY29udGlndW91cyh6b25lKTsKIAlpZiAobnJfdm1lbW1hcF9wYWdlcykgewogCQlyZXQgPSBtaHBfaW5pdF9tZW1tYXBfb25fbWVtb3J5KHN0YXJ0X3BmbiwgbnJfdm1lbW1hcF9wYWdlcywgem9uZSk7CiAJCWlmIChyZXQpCkBAIC0yNzksNiAmIzQzOzI4MCw3IEBAIHN0YXRpYyBpbnQgbWVtb3J5X2Jsb2NrX29ubGluZShzdHJ1Y3QgbWVtb3J5X2Jsb2NrICptZW0pCiAKIAltZW0tJmd0O3pvbmUgPSB6b25lOwogb3V0OgomIzQzOwlzZXRfem9uZV9jb250aWd1b3VzKHpvbmUpOwogCW1lbV9ob3RwbHVnX2RvbmUoKTsKIAlyZXR1cm4gcmV0OwogfQpAQCAtMzA0LDYgJiM0MzszMDYsNyBAQCBzdGF0aWMgaW50IG1lbW9yeV9ibG9ja19vZmZsaW5lKHN0cnVjdCBtZW1vcnlfYmxvY2sgKm1lbSkKIAkJbnJfdm1lbW1hcF9wYWdlcyA9IG1lbS0mZ3Q7YWx0bWFwLSZndDtmcmVlOwogCiAJbWVtX2hvdHBsdWdfYmVnaW4oKTsKJiM0MzsJY2xlYXJfem9uZV9jb250aWd1b3VzKG1lbS0mZ3Q7em9uZSk7CiAJaWYgKG5yX3ZtZW1tYXBfcGFnZXMpCiAJCWFkanVzdF9wcmVzZW50X3BhZ2VfY291bnQocGZuX3RvX3BhZ2Uoc3RhcnRfcGZuKSwgbWVtLSZndDtncm91cCwKIAkJCQkJICAtbnJfdm1lbW1hcF9wYWdlcyk7CkBAIC0zMjEsOCAmIzQzOzMyNCwxMCBAQCBzdGF0aWMgaW50IG1lbW9yeV9ibG9ja19vZmZsaW5lKHN0cnVjdCBtZW1vcnlfYmxvY2sgKm1lbSkKIAlpZiAobnJfdm1lbW1hcF9wYWdlcykKIAkJbWhwX2RlaW5pdF9tZW1tYXBfb25fbWVtb3J5KHN0YXJ0X3BmbiwgbnJfdm1lbW1hcF9wYWdlcyk7CiAKLQltZW0tJmd0O3pvbmUgPSBOVUxMOwogb3V0OgomIzQzOwlzZXRfem9uZV9jb250aWd1b3VzKG1lbS0mZ3Q7em9uZSk7CiYjNDM7CWlmICghcmV0KQomIzQzOwkJbWVtLSZndDt6b25lID0gTlVMTDsKIAltZW1faG90cGx1Z19kb25lKCk7CiAJcmV0dXJuIHJldDsKIH0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbW16b25lLmggYi9pbmNsdWRlL2xpbnV4L21tem9uZS5oCmluZGV4IDk0ZjljM2ZmNTQxNjAuLjdiZWZlNTAyMjNkMTIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbW16b25lLmgKJiM0MzsmIzQzOyYjNDM7IGIvaW5jbHVkZS9saW51eC9tbXpvbmUuaApAQCAtMTA0Myw2ICYjNDM7MTA0Myw0MiBAQCBzdHJ1Y3Qgem9uZSB7CiAJICogY21hIHBhZ2VzIGlzIHByZXNlbnQgcGFnZXMgdGhhdCBhcmUgYXNzaWduZWQgZm9yIENNQSB1c2UKIAkgKiAoTUlHUkFURV9DTUEpLgogCSAqCiYjNDM7CSAqIHBhZ2VzX3dpdGhfb25saW5lX21lbW1hcCB0cmFja3MgcGFnZXMgd2l0aGluIHRoZSB6b25lIHRoYXQgaGF2ZQomIzQzOwkgKiBhbiBvbmxpbmUgbWVtb3J5IG1hcDogcHJlc2VudCBwYWdlcyBhbmQgbWVtb3J5IGhvbGVzIHdob3NlCiYjNDM7CSAqIG1lbW9yeSBtYXAgaGFzIGJlZW4gaW5pdGlhbGl6ZWQgYW5kIHBmbl90b19vbmxpbmVfcGFnZSgpCiYjNDM7CSAqIHN1Y2NlZWRzLiBXaGVuIHNwYW5uZWRfcGFnZXMgPT0gcGFnZXNfd2l0aF9vbmxpbmVfbWVtbWFwLAomIzQzOwkgKiBwZm5fdG9fcGFnZSgpIGNhbiBiZSBwZXJmb3JtZWQgd2l0aG91dCBmdXJ0aGVyIGNoZWNrcyBvbiBhbnkKJiM0MzsJICogUEZOIHdpdGhpbiB0aGUgem9uZSBzcGFuLgomIzQzOwkgKgomIzQzOwkgKiBOb3RlOiB0aGlzIGNvdW50ZXIgbWF5IHRlbXBvcmFyaWx5IHVuZGVyY291bnQgd2hlbiBwYWdlcyB3aXRoIGFuCiYjNDM7CSAqIG9ubGluZSBtZW1vcnkgbWFwIGV4aXN0IG91dHNpZGUgdGhlIGN1cnJlbnQgem9uZSBzcGFuLiBTdWNoIHBhZ2VzCiYjNDM7CSAqIGFyZSBvbmx5IGNyZWF0ZWQgZHVyaW5nIGJvb3QsIHdoZW4gaW5pdGlhbGl6aW5nIHRoZSBtZW1vcnkgbWFwIG9mCiYjNDM7CSAqIHBhZ2VzIHRoYXQgZG8gbm90IGZhbGwgaW50byBhbnkgem9uZSBzcGFuLiBUaGUgdW5kZXJjb3VudCBpdHNlbGYKJiM0MzsJICogY2FuIG9ubHkgaGFwcGVuIGFmdGVyIGJvb3QsIGR1cmluZyBtZW1vcnkgaG90cGx1Zywgd2hlbiBncm93aW5nCiYjNDM7CSAqIHRoZSB6b25lIHRvIGNvdmVyIHN1Y2ggcGFnZXMgYW5kIGxhdGVyIHNocmlua2luZyBpdCBiYWNrLCB3aGljaAomIzQzOwkgKiBtYXkgcmVzdWx0IGluIGEgJiMzNDt0b28gc21hbGwmIzM0OyB2YWx1ZS4gVGhpcyBpcyBzYWZlOiBpdCBtZXJlbHkKJiM0MzsJICogcHJldmVudHMgZGV0ZWN0aW5nIGEgY29udGlndW91cyB6b25lLgomIzQzOwkgKgomIzQzOwkgKiBIZXJlIGlzIGFuIGV4YW1wbGUgKHBhZ2UgbnVtYmVycyBhcmUganVzdCBmb3IgaWxsdXN0cmF0aW9uCiYjNDM7CSAqIHB1cnBvc2VzKToKJiM0MzsJICogICBhZnRlciBib290OgomIzQzOwkgKiAgICAgICBbICB6b25lIHNwYW4gIF0KJiM0MzsJICogICAgICAgWyAgIHpvbmUgcGFnZXMgICBdCiYjNDM7CSAqICAgICAgIHNwYW5uZWQ9MTAsIGluaXRpYWxpemVkPTE1LCBvbmxpbmU9MTAKJiM0MzsJICogICAgICAgb25saW5lID09IHNwYW5uZWQgIC0mZ3Q7ICBjb250aWd1b3VzCiYjNDM7CSAqCiYjNDM7CSAqICAgZ3Jvd2luZyBhZnRlciBob3RwbHVnIChob3RwbHVnIDUpOgomIzQzOwkgKiAgICAgICBbICB6b25lIHNwYW4gICAgICAgICAgICAgICAgICAgICAgICAgIF0KJiM0MzsJICogICAgICAgWyAgIHpvbmUgcGFnZXMgICBdICAgWyAgIHpvbmUgcGFnZXMgICBdCiYjNDM7CSAqICAgICAgIHNwYW5uZWQ9MzAsIGluaXRpYWxpemVkPTIwLCBvbmxpbmU9MTUKJiM0MzsJICogICAgICAgb25saW5lICE9IHNwYW5uZWQgIC0mZ3Q7ICBub3QgY29udGlndW91cwomIzQzOwkgKgomIzQzOwkgKiAgIHNocmlua2luZyBhZnRlciBob3R1bnBsdWcgKGhvdHVucGx1ZyA1IGFnYWluKToKJiM0MzsJICogICAgICAgWyAgem9uZSBzcGFuICAgICBdCiYjNDM7CSAqICAgICAgIFsgICB6b25lIHBhZ2VzICAgXQomIzQzOwkgKiAgICAgICBzcGFubmVkPTE1LCBpbml0aWFsaXplZD0xNSwgb25saW5lPTEwCiYjNDM7CSAqICAgICAgIG9ubGluZSAhPSBzcGFubmVkICAtJmd0OyAgbm90IGNvbnRpZ3VvdXMgYWx0aG91Z2ggY29udGlndW91cwomIzQzOwkgKgogCSAqIFNvIHByZXNlbnRfcGFnZXMgbWF5IGJlIHVzZWQgYnkgbWVtb3J5IGhvdHBsdWcgb3IgbWVtb3J5IHBvd2VyCiAJICogbWFuYWdlbWVudCBsb2dpYyB0byBmaWd1cmUgb3V0IHVubWFuYWdlZCBwYWdlcyBieSBjaGVja2luZwogCSAqIChwcmVzZW50X3BhZ2VzIC0gbWFuYWdlZF9wYWdlcykuIEFuZCBtYW5hZ2VkX3BhZ2VzIHNob3VsZCBiZSB1c2VkCkBAIC0xMDY3LDYgJiM0MzsxMTAzLDcgQEAgc3RydWN0IHpvbmUgewogCWF0b21pY19sb25nX3QJCW1hbmFnZWRfcGFnZXM7CiAJdW5zaWduZWQgbG9uZwkJc3Bhbm5lZF9wYWdlczsKIAl1bnNpZ25lZCBsb25nCQlwcmVzZW50X3BhZ2VzOwomIzQzOwl1bnNpZ25lZCBsb25nCQlwYWdlc193aXRoX29ubGluZV9tZW1tYXA7CiAjaWYgZGVmaW5lZChDT05GSUdfTUVNT1JZX0hPVFBMVUcpCiAJdW5zaWduZWQgbG9uZwkJcHJlc2VudF9lYXJseV9wYWdlczsKICNlbmRpZgpAQCAtMTY5NCw2ICYjNDM7MTczMSwzOCBAQCBzdGF0aWMgaW5saW5lIGJvb2wgem9uZV9pc196b25lX2RldmljZShjb25zdCBzdHJ1Y3Qgem9uZSAqem9uZSkKIH0KICNlbmRpZgogCiYjNDM7LyoqCiYjNDM7ICogem9uZV9pc19jb250aWd1b3VzIC0gdGVzdCB3aGV0aGVyIGEgem9uZSBpcyBjb250aWd1b3VzCiYjNDM7ICogQHpvbmU6IHRoZSB6b25lIHRvIHRlc3QuCiYjNDM7ICoKJiM0MzsgKiBJbiBhIGNvbnRpZ3VvdXMgem9uZSwgaXQgaXMgdmFsaWQgdG8gY2FsbCBwZm5fdG9fcGFnZSgpIG9uIGFueSBQRk4gaW4gdGhlCiYjNDM7ICogc3Bhbm5lZCB6b25lIHdpdGhvdXQgcmVxdWlyaW5nIHBmbl92YWxpZCgpIG9yIHBmbl90b19vbmxpbmVfcGFnZSgpIGNoZWNrcy4KJiM0MzsgKgomIzQzOyAqIE5vdGUgdGhhdCBtaXNzaW5nIHN5bmNocm9uaXphdGlvbiB3aXRoIG1lbW9yeSBvZmZsaW5pbmcgbWFrZXMgYW55IFBGTgomIzQzOyAqIHRyYXZlcnNhbCBwcm9uZSB0byByYWNlcy4KJiM0MzsgKgomIzQzOyAqIFpPTkVfREVWSUNFIHpvbmVzIGFyZSBhbHdheXMgbWFya2VkIG5vbi1jb250aWd1b3VzLgomIzQzOyAqCiYjNDM7ICogUmV0dXJuOiB0cnVlIGlmIGNvbnRpZ3VvdXMsIG90aGVyd2lzZSBmYWxzZS4KJiM0MzsgKi8KJiM0MztzdGF0aWMgaW5saW5lIGJvb2wgem9uZV9pc19jb250aWd1b3VzKGNvbnN0IHN0cnVjdCB6b25lICp6b25lKQomIzQzO3sKJiM0MzsJcmV0dXJuIFJFQURfT05DRSh6b25lLSZndDtjb250aWd1b3VzKTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGlubGluZSB2b2lkIHNldF96b25lX2NvbnRpZ3VvdXMoc3RydWN0IHpvbmUgKnpvbmUpCiYjNDM7ewomIzQzOwlpZiAoem9uZV9pc196b25lX2RldmljZSh6b25lKSkKJiM0MzsJCXJldHVybjsKJiM0MzsJaWYgKHpvbmUtJmd0O3NwYW5uZWRfcGFnZXMgPT0gem9uZS0mZ3Q7cGFnZXNfd2l0aF9vbmxpbmVfbWVtbWFwKQomIzQzOwkJV1JJVEVfT05DRSh6b25lLSZndDtjb250aWd1b3VzLCB0cnVlKTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGlubGluZSB2b2lkIGNsZWFyX3pvbmVfY29udGlndW91cyhzdHJ1Y3Qgem9uZSAqem9uZSkKJiM0Mzt7CiYjNDM7CVdSSVRFX09OQ0Uoem9uZS0mZ3Q7Y29udGlndW91cywgZmFsc2UpOwomIzQzO30KJiM0MzsKIC8qCiAgKiBSZXR1cm5zIHRydWUgaWYgYSB6b25lIGhhcyBwYWdlcyBtYW5hZ2VkIGJ5IHRoZSBidWRkeSBhbGxvY2F0b3IuCiAgKiBBbGwgdGhlIHJlY2xhaW0gZGVjaXNpb25zIGhhdmUgdG8gdXNlIHRoaXMgZnVuY3Rpb24gcmF0aGVyIHRoYW4KZGlmZiAtLWdpdCBhL21tL21lbW9yeV9ob3RwbHVnLmMgYi9tbS9tZW1vcnlfaG90cGx1Zy5jCmluZGV4IDIyNmFiOWNiMDc4YWQuLjEwMDk0MWQxYjgyOGEgMTAwNjQ0Ci0tLSBhL21tL21lbW9yeV9ob3RwbHVnLmMKJiM0MzsmIzQzOyYjNDM7IGIvbW0vbWVtb3J5X2hvdHBsdWcuYwpAQCAtNDI1LDQ5ICYjNDM7NDI1LDM5IEBAIGludCBfX2FkZF9wYWdlcyhpbnQgbmlkLCB1bnNpZ25lZCBsb25nIHBmbiwgdW5zaWduZWQgbG9uZyBucl9wYWdlcywKIAlyZXR1cm4gZXJyOwogfQogCi0vKiBmaW5kIHRoZSBzbWFsbGVzdCB2YWxpZCBwZm4gaW4gdGhlIHJhbmdlIFtzdGFydF9wZm4sIGVuZF9wZm4pICovCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBmaW5kX3NtYWxsZXN0X3NlY3Rpb25fcGZuKGludCBuaWQsIHN0cnVjdCB6b25lICp6b25lLAotCQkJCSAgICAgdW5zaWduZWQgbG9uZyBzdGFydF9wZm4sCi0JCQkJICAgICB1bnNpZ25lZCBsb25nIGVuZF9wZm4pCiYjNDM7c3RhdGljIGJvb2wgc3Vic2VjdGlvbl9vdmVybGFwc196b25lKHVuc2lnbmVkIGxvbmcgcGZuLCBzdHJ1Y3Qgem9uZSAqem9uZSkKIHsKLQlmb3IgKDsgc3RhcnRfcGZuICZsdDsgZW5kX3Bmbjsgc3RhcnRfcGZuICYjNDM7PSBQQUdFU19QRVJfU1VCU0VDVElPTikgewotCQlpZiAodW5saWtlbHkoIXBmbl90b19vbmxpbmVfcGFnZShzdGFydF9wZm4pKSkKLQkJCWNvbnRpbnVlOwomIzQzOwljb25zdCB1bnNpZ25lZCBsb25nIHN0YXJ0X3BmbiA9IEFMSUdOX0RPV04ocGZuLCBQQUdFU19QRVJfU1VCU0VDVElPTik7CiYjNDM7CWNvbnN0IHVuc2lnbmVkIGxvbmcgZW5kX3BmbiA9IHN0YXJ0X3BmbiAmIzQzOyBQQUdFU19QRVJfU1VCU0VDVElPTiAtIDE7CiAKLQkJaWYgKHVubGlrZWx5KHBmbl90b19uaWQoc3RhcnRfcGZuKSAhPSBuaWQpKQotCQkJY29udGludWU7CiYjNDM7CS8qIEFsbCBwYWdlcyBpbiBhIHN1YnNlY3Rpb24gYXJlIGVpdGhlciBvbmxpbmUgb3Igb2ZmbGluZS4gKi8KJiM0MzsJaWYgKHVubGlrZWx5KCFwZm5fdG9fb25saW5lX3BhZ2Uoc3RhcnRfcGZuKSkpCiYjNDM7CQlyZXR1cm4gZmFsc2U7CiAKLQkJaWYgKHpvbmUgIT0gcGFnZV96b25lKHBmbl90b19wYWdlKHN0YXJ0X3BmbikpKQotCQkJY29udGludWU7CiYjNDM7CS8qIENoZWNraW5nIHN0YXJ0JiM0MztlbmQgaXMgc3VmZmljaWVudC4gKi8KJiM0MzsJcmV0dXJuIHpvbmUgPT0gcGFnZV96b25lKHBmbl90b19wYWdlKHN0YXJ0X3BmbikpIHx8CiYjNDM7CSAgICAgICB6b25lID09IHBhZ2Vfem9uZShwZm5fdG9fcGFnZShlbmRfcGZuKSk7CiYjNDM7fQogCi0JCXJldHVybiBzdGFydF9wZm47CiYjNDM7LyogZmluZCB0aGUgc21hbGxlc3QgdmFsaWQgcGZuIGluIHRoZSByYW5nZSBbc3RhcnRfcGZuLCBlbmRfcGZuKSAqLwomIzQzO3N0YXRpYyB1bnNpZ25lZCBsb25nIGZpbmRfc21hbGxlc3Rfc2VjdGlvbl9wZm4oc3RydWN0IHpvbmUgKnpvbmUsCiYjNDM7CQl1bnNpZ25lZCBsb25nIHN0YXJ0X3BmbiwgdW5zaWduZWQgbG9uZyBlbmRfcGZuKQomIzQzO3sKJiM0MzsJZm9yICg7IHN0YXJ0X3BmbiAmbHQ7IGVuZF9wZm47IHN0YXJ0X3BmbiAmIzQzOz0gUEFHRVNfUEVSX1NVQlNFQ1RJT04pIHsKJiM0MzsJCWlmIChzdWJzZWN0aW9uX292ZXJsYXBzX3pvbmUoc3RhcnRfcGZuLCB6b25lKSkKJiM0MzsJCQlyZXR1cm4gc3RhcnRfcGZuOwogCX0KLQogCXJldHVybiAwOwogfQogCiAvKiBmaW5kIHRoZSBiaWdnZXN0IHZhbGlkIHBmbiBpbiB0aGUgcmFuZ2UgW3N0YXJ0X3BmbiwgZW5kX3BmbikuICovCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBmaW5kX2JpZ2dlc3Rfc2VjdGlvbl9wZm4oaW50IG5pZCwgc3RydWN0IHpvbmUgKnpvbmUsCi0JCQkJICAgIHVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuLAotCQkJCSAgICB1bnNpZ25lZCBsb25nIGVuZF9wZm4pCiYjNDM7c3RhdGljIHVuc2lnbmVkIGxvbmcgZmluZF9iaWdnZXN0X3NlY3Rpb25fcGZuKHN0cnVjdCB6b25lICp6b25lLAomIzQzOwkJdW5zaWduZWQgbG9uZyBzdGFydF9wZm4sIHVuc2lnbmVkIGxvbmcgZW5kX3BmbikKIHsKLQl1bnNpZ25lZCBsb25nIHBmbjsKLQotCS8qIHBmbiBpcyB0aGUgZW5kIHBmbiBvZiBhIG1lbW9yeSBzZWN0aW9uLiAqLwotCXBmbiA9IGVuZF9wZm4gLSAxOwotCWZvciAoOyBwZm4gJmd0Oz0gc3RhcnRfcGZuOyBwZm4gLT0gUEFHRVNfUEVSX1NVQlNFQ1RJT04pIHsKLQkJaWYgKHVubGlrZWx5KCFwZm5fdG9fb25saW5lX3BhZ2UocGZuKSkpCi0JCQljb250aW51ZTsKLQotCQlpZiAodW5saWtlbHkocGZuX3RvX25pZChwZm4pICE9IG5pZCkpCi0JCQljb250aW51ZTsKLQotCQlpZiAoem9uZSAhPSBwYWdlX3pvbmUocGZuX3RvX3BhZ2UocGZuKSkpCi0JCQljb250aW51ZTsKLQotCQlyZXR1cm4gcGZuOwomIzQzOwlmb3IgKDsgZW5kX3BmbiAmZ3Q7IHN0YXJ0X3BmbjsgZW5kX3BmbiAtPSBQQUdFU19QRVJfU1VCU0VDVElPTikgewomIzQzOwkJaWYgKHN1YnNlY3Rpb25fb3ZlcmxhcHNfem9uZShlbmRfcGZuIC0gMSwgem9uZSkpCiYjNDM7CQkJcmV0dXJuIGVuZF9wZm4gLSAxOwogCX0KLQogCXJldHVybiAwOwogfQogCkBAIC00NzUsNyAmIzQzOzQ2NSw2IEBAIHN0YXRpYyB2b2lkIHNocmlua196b25lX3NwYW4oc3RydWN0IHpvbmUgKnpvbmUsIHVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuLAogCQkJICAgICB1bnNpZ25lZCBsb25nIGVuZF9wZm4pCiB7CiAJdW5zaWduZWQgbG9uZyBwZm47Ci0JaW50IG5pZCA9IHpvbmVfdG9fbmlkKHpvbmUpOwogCiAJaWYgKHpvbmUtJmd0O3pvbmVfc3RhcnRfcGZuID09IHN0YXJ0X3BmbikgewogCQkvKgpAQCAtNDg0LDcgJiM0Mzs0NzMsNyBAQCBzdGF0aWMgdm9pZCBzaHJpbmtfem9uZV9zcGFuKHN0cnVjdCB6b25lICp6b25lLCB1bnNpZ25lZCBsb25nIHN0YXJ0X3BmbiwKIAkJICogSW4gdGhpcyBjYXNlLCB3ZSBmaW5kIHNlY29uZCBzbWFsbGVzdCB2YWxpZCBtZW1fc2VjdGlvbgogCQkgKiBmb3Igc2hyaW5raW5nIHpvbmUuCiAJCSAqLwotCQlwZm4gPSBmaW5kX3NtYWxsZXN0X3NlY3Rpb25fcGZuKG5pZCwgem9uZSwgZW5kX3BmbiwKJiM0MzsJCXBmbiA9IGZpbmRfc21hbGxlc3Rfc2VjdGlvbl9wZm4oem9uZSwgZW5kX3BmbiwKIAkJCQkJCXpvbmVfZW5kX3Bmbih6b25lKSk7CiAJCWlmIChwZm4pIHsKIAkJCXpvbmUtJmd0O3NwYW5uZWRfcGFnZXMgPSB6b25lX2VuZF9wZm4oem9uZSkgLSBwZm47CkBAIC01MDAsNyAmIzQzOzQ4OSw3IEBAIHN0YXRpYyB2b2lkIHNocmlua196b25lX3NwYW4oc3RydWN0IHpvbmUgKnpvbmUsIHVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuLAogCQkgKiBJbiB0aGlzIGNhc2UsIHdlIGZpbmQgc2Vjb25kIGJpZ2dlc3QgdmFsaWQgbWVtX3NlY3Rpb24gZm9yCiAJCSAqIHNocmlua2luZyB6b25lLgogCQkgKi8KLQkJcGZuID0gZmluZF9iaWdnZXN0X3NlY3Rpb25fcGZuKG5pZCwgem9uZSwgem9uZS0mZ3Q7em9uZV9zdGFydF9wZm4sCiYjNDM7CQlwZm4gPSBmaW5kX2JpZ2dlc3Rfc2VjdGlvbl9wZm4oem9uZSwgem9uZS0mZ3Q7em9uZV9zdGFydF9wZm4sCiAJCQkJCSAgICAgICBzdGFydF9wZm4pOwogCQlpZiAocGZuKQogCQkJem9uZS0mZ3Q7c3Bhbm5lZF9wYWdlcyA9IHBmbiAtIHpvbmUtJmd0O3pvbmVfc3RhcnRfcGZuICYjNDM7IDE7CkBAIC01NjAsMTggJiM0Mzs1NDksMTMgQEAgdm9pZCByZW1vdmVfcGZuX3JhbmdlX2Zyb21fem9uZShzdHJ1Y3Qgem9uZSAqem9uZSwKIAogCS8qCiAJICogWm9uZSBzaHJpbmtpbmcgY29kZSBjYW5ub3QgcHJvcGVybHkgZGVhbCB3aXRoIFpPTkVfREVWSUNFLiBTbwotCSAqIHdlIHdpbGwgbm90IHRyeSB0byBzaHJpbmsgdGhlIHpvbmVzIC0gd2hpY2ggaXMgb2theSBhcwotCSAqIHNldF96b25lX2NvbnRpZ3VvdXMoKSBjYW5ub3QgZGVhbCB3aXRoIFpPTkVfREVWSUNFIGVpdGhlciB3YXkuCiYjNDM7CSAqIHdlIHdpbGwgbm90IHRyeSB0byBzaHJpbmsgaXQuCiAJICovCiAJaWYgKHpvbmVfaXNfem9uZV9kZXZpY2Uoem9uZSkpCiAJCXJldHVybjsKIAotCWNsZWFyX3pvbmVfY29udGlndW91cyh6b25lKTsKLQogCXNocmlua196b25lX3NwYW4oem9uZSwgc3RhcnRfcGZuLCBzdGFydF9wZm4gJiM0MzsgbnJfcGFnZXMpOwogCXVwZGF0ZV9wZ2RhdF9zcGFuKHBnZGF0KTsKLQotCXNldF96b25lX2NvbnRpZ3VvdXMoem9uZSk7CiB9CiAKIC8qKgpAQCAtNzQ5LDggJiM0Mzs3MzMsNiBAQCB2b2lkIG1vdmVfcGZuX3JhbmdlX3RvX3pvbmUoc3RydWN0IHpvbmUgKnpvbmUsIHVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuLAogCXN0cnVjdCBwZ2xpc3RfZGF0YSAqcGdkYXQgPSB6b25lLSZndDt6b25lX3BnZGF0OwogCWludCBuaWQgPSBwZ2RhdC0mZ3Q7bm9kZV9pZDsKIAotCWNsZWFyX3pvbmVfY29udGlndW91cyh6b25lKTsKLQogCWlmICh6b25lX2lzX2VtcHR5KHpvbmUpKQogCQlpbml0X2N1cnJlbnRseV9lbXB0eV96b25lKHpvbmUsIHN0YXJ0X3BmbiwgbnJfcGFnZXMpOwogCXJlc2l6ZV96b25lX3JhbmdlKHpvbmUsIHN0YXJ0X3BmbiwgbnJfcGFnZXMpOwpAQCAtNzc4LDggJiM0Mzs3NjAsNiBAQCB2b2lkIG1vdmVfcGZuX3JhbmdlX3RvX3pvbmUoc3RydWN0IHpvbmUgKnpvbmUsIHVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuLAogCW1lbW1hcF9pbml0X3JhbmdlKG5yX3BhZ2VzLCBuaWQsIHpvbmVfaWR4KHpvbmUpLCBzdGFydF9wZm4sIDAsCiAJCQkgTUVNSU5JVF9IT1RQTFVHLCBhbHRtYXAsIG1pZ3JhdGV0eXBlLAogCQkJIGlzb2xhdGVfcGFnZWJsb2NrKTsKLQotCXNldF96b25lX2NvbnRpZ3VvdXMoem9uZSk7CiB9CiAKIHN0cnVjdCBhdXRvX21vdmFibGVfc3RhdHMgewpAQCAtMTA3NSw2ICYjNDM7MTA1NSw3IEBAIHZvaWQgYWRqdXN0X3ByZXNlbnRfcGFnZV9jb3VudChzdHJ1Y3QgcGFnZSAqcGFnZSwgc3RydWN0IG1lbW9yeV9ncm91cCAqZ3JvdXAsCiAJaWYgKGVhcmx5X3NlY3Rpb24oX19wZm5fdG9fc2VjdGlvbihwYWdlX3RvX3BmbihwYWdlKSkpKQogCQl6b25lLSZndDtwcmVzZW50X2Vhcmx5X3BhZ2VzICYjNDM7PSBucl9wYWdlczsKIAl6b25lLSZndDtwcmVzZW50X3BhZ2VzICYjNDM7PSBucl9wYWdlczsKJiM0MzsJem9uZS0mZ3Q7cGFnZXNfd2l0aF9vbmxpbmVfbWVtbWFwICYjNDM7PSBucl9wYWdlczsKIAl6b25lLSZndDt6b25lX3BnZGF0LSZndDtub2RlX3ByZXNlbnRfcGFnZXMgJiM0Mzs9IG5yX3BhZ2VzOwogCiAJaWYgKGdyb3VwICZhbXA7JmFtcDsgbW92YWJsZSkKZGlmZiAtLWdpdCBhL21tL21tX2luaXQuYyBiL21tL21tX2luaXQuYwppbmRleCAxNTMzYWViYWZiNjg4Li5kNDBhOGZmMjMzNzAwIDEwMDY0NAotLS0gYS9tbS9tbV9pbml0LmMKJiM0MzsmIzQzOyYjNDM7IGIvbW0vbW1faW5pdC5jCkBAIC04MTcsMjIgJiM0Mzs4MTcsMzkgQEAgdm9pZCBfX21lbWluaXQgaW5pdF9kZWZlcnJlZF9wYWdlKHVuc2lnbmVkIGxvbmcgcGZuLCBpbnQgbmlkKQogICogICB6b25lL25vZGUgYWJvdmUgdGhlIGhvbGUgZXhjZXB0IGZvciB0aGUgdHJhaWxpbmcgcGFnZXMgaW4gdGhlIGxhc3QKICAqICAgc2VjdGlvbiB0aGF0IHdpbGwgYmUgYXBwZW5kZWQgdG8gdGhlIHpvbmUvbm9kZSBiZWxvdy4KICAqLwotc3RhdGljIHZvaWQgX19pbml0IGluaXRfdW5hdmFpbGFibGVfcmFuZ2UodW5zaWduZWQgbG9uZyBzcGZuLAotCQkJCQkgIHVuc2lnbmVkIGxvbmcgZXBmbiwKLQkJCQkJICBpbnQgem9uZSwgaW50IG5vZGUpCiYjNDM7c3RhdGljIHVuc2lnbmVkIGxvbmcgX19pbml0IGluaXRfdW5hdmFpbGFibGVfcmFuZ2UodW5zaWduZWQgbG9uZyBzcGZuLAomIzQzOwkJCQkJCSAgIHVuc2lnbmVkIGxvbmcgZXBmbiwKJiM0MzsJCQkJCQkgICBpbnQgem9uZSwgaW50IG5vZGUpCiB7CiYjNDM7CXVuc2lnbmVkIGxvbmcgbmV4dF9jaHVua19wZm4gX19tYXliZV91bnVzZWQgPSBzcGZuOwogCXVuc2lnbmVkIGxvbmcgcGZuOwotCXU2NCBwZ2NudCA9IDA7CiYjNDM7CXU2NCBvbmxpbmVfcGdjbnQgPSAwLCBwZ2NudCA9IDA7CiYjNDM7CWJvb2wgaXNfb25saW5lID0gdHJ1ZTsKIAogCWZvcl9lYWNoX3ZhbGlkX3BmbihwZm4sIHNwZm4sIGVwZm4pIHsKIAkJX19pbml0X3NpbmdsZV9wYWdlKHBmbl90b19wYWdlKHBmbiksIHBmbiwgem9uZSwgbm9kZSk7CiAJCV9fU2V0UGFnZVJlc2VydmVkKHBmbl90b19wYWdlKHBmbikpOwogCQlwZ2NudCYjNDM7JiM0Mzs7CiYjNDM7CiYjNDM7CQkvKgomIzQzOwkJICogV2l0aCB2bWVtbWFwLCBhdCB0aGlzIHN0YWdlIGFsbCBwYWdlcyBpbiBhbiBlYXJseSBzZWN0aW9uCiYjNDM7CQkgKiBoYXZlIGEgdmFsaWQgbWVtbWFwIGFuZCBhcmUgbWFya2VkIGFzIG9ubGluZS4gSG93ZXZlciwgb25seQomIzQzOwkJICogc3Vic2VjdGlvbnMgaW4gdGhlIHN1YnNlY3Rpb24gbWFwIGFyZSBhY3R1YWxseSBvbmxpbmUuCiYjNDM7CQkgKi8KJiM0MzsjaWZkZWYgQ09ORklHX1NQQVJTRU1FTV9WTUVNTUFQCiYjNDM7CQlpZiAocGZuICZndDs9IG5leHRfY2h1bmtfcGZuKSB7CiYjNDM7CQkJaXNfb25saW5lID0gcGZuX3NlY3Rpb25fdmFsaWQoX19wZm5fdG9fc2VjdGlvbihwZm4pLCBwZm4pOwomIzQzOwkJCW5leHRfY2h1bmtfcGZuID0gbWluKFNVQlNFQ1RJT05fQUxJR05fVVAocGZuICYjNDM7IDEpLCBlcGZuKTsKJiM0MzsJCX0KJiM0MzsjZW5kaWYKJiM0MzsJCWlmIChpc19vbmxpbmUpCiYjNDM7CQkJb25saW5lX3BnY250JiM0MzsmIzQzOzsKIAl9CiAKIAlpZiAocGdjbnQpCiAJCXByX2luZm8oJiMzNDtPbiBub2RlICVkLCB6b25lICVzOiAlbGxkIHBhZ2VzIGluIHVuYXZhaWxhYmxlIHJhbmdlc1xuJiMzNDssCiAJCQlub2RlLCB6b25lX25hbWVzW3pvbmVdLCBwZ2NudCk7CiYjNDM7CXJldHVybiBvbmxpbmVfcGdjbnQ7CiB9CiAKIC8qCkBAIC05MzAsOSAmIzQzOzk0NywyMSBAQCBzdGF0aWMgdm9pZCBfX2luaXQgbWVtbWFwX2luaXRfem9uZV9yYW5nZShzdHJ1Y3Qgem9uZSAqem9uZSwKIAltZW1tYXBfaW5pdF9yYW5nZShlbmRfcGZuIC0gc3RhcnRfcGZuLCBuaWQsIHpvbmVfaWQsIHN0YXJ0X3BmbiwKIAkJCSAgem9uZV9lbmRfcGZuLCBNRU1JTklUX0VBUkxZLCBOVUxMLCBNSUdSQVRFX01PVkFCTEUsCiAJCQkgIGZhbHNlKTsKJiM0MzsJem9uZS0mZ3Q7cGFnZXNfd2l0aF9vbmxpbmVfbWVtbWFwICYjNDM7PSBlbmRfcGZuIC0gc3RhcnRfcGZuOwogCi0JaWYgKCpob2xlX3BmbiAmbHQ7IHN0YXJ0X3BmbikKLQkJaW5pdF91bmF2YWlsYWJsZV9yYW5nZSgqaG9sZV9wZm4sIHN0YXJ0X3Bmbiwgem9uZV9pZCwgbmlkKTsKJiM0MzsJaWYgKCpob2xlX3BmbiAmbHQ7IHN0YXJ0X3BmbikgewomIzQzOwkJdW5zaWduZWQgbG9uZyBob2xlX3N0YXJ0X3BmbiA9ICpob2xlX3BmbjsKJiM0MzsJCXVuc2lnbmVkIGxvbmcgcGdjbnQ7CiYjNDM7CiYjNDM7CQlpZiAoaG9sZV9zdGFydF9wZm4gJmx0OyB6b25lX3N0YXJ0X3BmbikgewomIzQzOwkJCWluaXRfdW5hdmFpbGFibGVfcmFuZ2UoaG9sZV9zdGFydF9wZm4sIHpvbmVfc3RhcnRfcGZuLAomIzQzOwkJCQkJICAgICAgIHpvbmVfaWQsIG5pZCk7CiYjNDM7CQkJaG9sZV9zdGFydF9wZm4gPSB6b25lX3N0YXJ0X3BmbjsKJiM0MzsJCX0KJiM0MzsJCXBnY250ID0gaW5pdF91bmF2YWlsYWJsZV9yYW5nZShob2xlX3N0YXJ0X3Bmbiwgc3RhcnRfcGZuLAomIzQzOwkJCQkJICAgICAgIHpvbmVfaWQsIG5pZCk7CiYjNDM7CQl6b25lLSZndDtwYWdlc193aXRoX29ubGluZV9tZW1tYXAgJiM0Mzs9IHBnY250OwomIzQzOwl9CiAKIAkqaG9sZV9wZm4gPSBlbmRfcGZuOwogfQpAQCAtMjE4OCwyOCAmIzQzOzIyMTcsNiBAQCB2b2lkIF9faW5pdCBpbml0X2NtYV9wYWdlYmxvY2soc3RydWN0IHBhZ2UgKnBhZ2UpCiB9CiAjZW5kaWYKIAotdm9pZCBzZXRfem9uZV9jb250aWd1b3VzKHN0cnVjdCB6b25lICp6b25lKQotewotCXVuc2lnbmVkIGxvbmcgYmxvY2tfc3RhcnRfcGZuID0gem9uZS0mZ3Q7em9uZV9zdGFydF9wZm47Ci0JdW5zaWduZWQgbG9uZyBibG9ja19lbmRfcGZuOwotCi0JYmxvY2tfZW5kX3BmbiA9IHBhZ2VibG9ja19lbmRfcGZuKGJsb2NrX3N0YXJ0X3Bmbik7Ci0JZm9yICg7IGJsb2NrX3N0YXJ0X3BmbiAmbHQ7IHpvbmVfZW5kX3Bmbih6b25lKTsKLQkJCWJsb2NrX3N0YXJ0X3BmbiA9IGJsb2NrX2VuZF9wZm4sCi0JCQkgYmxvY2tfZW5kX3BmbiAmIzQzOz0gcGFnZWJsb2NrX25yX3BhZ2VzKSB7Ci0KLQkJYmxvY2tfZW5kX3BmbiA9IG1pbihibG9ja19lbmRfcGZuLCB6b25lX2VuZF9wZm4oem9uZSkpOwotCi0JCWlmICghX19wYWdlYmxvY2tfcGZuX3RvX3BhZ2UoYmxvY2tfc3RhcnRfcGZuLAotCQkJCQkgICAgIGJsb2NrX2VuZF9wZm4sIHpvbmUpKQotCQkJcmV0dXJuOwotCQljb25kX3Jlc2NoZWQoKTsKLQl9Ci0KLQkvKiBXZSBjb25maXJtIHRoYXQgdGhlcmUgaXMgbm8gaG9sZSAqLwotCXpvbmUtJmd0O2NvbnRpZ3VvdXMgPSB0cnVlOwotfQotCiAvKgogICogQ2hlY2sgaWYgYSBQRk4gcmFuZ2UgaW50ZXJzZWN0cyBtdWx0aXBsZSB6b25lcyBvbiBvbmUgb3IgbW9yZQogICogTlVNQSBub2Rlcy4gU3BlY2lmeSB0aGUgQG5pZCBhcmd1bWVudCBpZiBpdCBpcyBrbm93biB0aGF0IHRoaXMKZGlmZiAtLWdpdCBhL21tL21tX2luaXQuaCBiL21tL21tX2luaXQuaAppbmRleCAzOWY3NWRmOWJlMWMyLi41MjBkNTNlY2M2OGQ1IDEwMDY0NAotLS0gYS9tbS9tbV9pbml0LmgKJiM0MzsmIzQzOyYjNDM7IGIvbW0vbW1faW5pdC5oCkBAIC0yMCwxNSAmIzQzOzIwLDkgQEAgc3RydWN0IHZtZW1fYWx0bWFwOwogLyogcGVyZm9ybSBzYW5pdHkgY2hlY2tzIG9uIHN0cnVjdCBwYWdlcyBiZWluZyBhbGxvY2F0ZWQgb3IgZnJlZWQgKi8KIERFQ0xBUkVfU1RBVElDX0tFWV9NQVlCRShDT05GSUdfREVCVUdfVk0sIGNoZWNrX3BhZ2VzX2VuYWJsZWQpOwogCi12b2lkIHNldF96b25lX2NvbnRpZ3VvdXMoc3RydWN0IHpvbmUgKnpvbmUpOwogYm9vbCBwZm5fcmFuZ2VfaW50ZXJzZWN0c196b25lcyhpbnQgbmlkLCB1bnNpZ25lZCBsb25nIHN0YXJ0X3BmbiwKIAkJCSAgIHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMpOwogCi1zdGF0aWMgaW5saW5lIHZvaWQgY2xlYXJfem9uZV9jb250aWd1b3VzKHN0cnVjdCB6b25lICp6b25lKQotewotCXpvbmUtJmd0O2NvbnRpZ3VvdXMgPSBmYWxzZTsKLX0KLQogdm9pZCBtZW1ibG9ja19mcmVlX3BhZ2VzKHVuc2lnbmVkIGxvbmcgcGZuLCB1bnNpZ25lZCBpbnQgb3JkZXIpOwogCiB2b2lkICptZW1tYXBfYWxsb2MocGh5c19hZGRyX3Qgc2l6ZSwgcGh5c19hZGRyX3QgYWxpZ24sIHBoeXNfYWRkcl90IG1pbl9hZGRyLApkaWZmIC0tZ2l0IGEvbW0vcGFnZV9hbGxvYy5oIGIvbW0vcGFnZV9hbGxvYy5oCmluZGV4IGI5MjU5ZGVkZGI1OWQuLmQ0MTgyZjdjYjdkZGYgMTAwNjQ0Ci0tLSBhL21tL3BhZ2VfYWxsb2MuaAomIzQzOyYjNDM7JiM0MzsgYi9tbS9wYWdlX2FsbG9jLmgKQEAgLTIxNCw3ICYjNDM7MjE0LDcgQEAgZXh0ZXJuIHN0cnVjdCBwYWdlICpfX3BhZ2VibG9ja19wZm5fdG9fcGFnZSh1bnNpZ25lZCBsb25nIHN0YXJ0X3BmbiwKIHN0YXRpYyBpbmxpbmUgc3RydWN0IHBhZ2UgKnBhZ2VibG9ja19wZm5fdG9fcGFnZSh1bnNpZ25lZCBsb25nIHN0YXJ0X3BmbiwKIAkJCQl1bnNpZ25lZCBsb25nIGVuZF9wZm4sIHN0cnVjdCB6b25lICp6b25lKQogewotCWlmICh6b25lLSZndDtjb250aWd1b3VzKQomIzQzOwlpZiAoem9uZV9pc19jb250aWd1b3VzKHpvbmUpKQogCQlyZXR1cm4gcGZuX3RvX3BhZ2Uoc3RhcnRfcGZuKTsKIAogCXJldHVybiBfX3BhZ2VibG9ja19wZm5fdG9fcGFnZShzdGFydF9wZm4sIGVuZF9wZm4sIHpvbmUpOwo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD41OS8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTQgMDc6NTE8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjgtZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNzU2OQoJCQkJCQkJb3V0cHV0OiAyMwoJCQkJCQkJdGhvdWdodHM6IDkzOQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgdGhlIE1lbW9yeSBNYW5hZ2VtZW50IFBhdGNoIGZvciBLTVNBTiBJbXBsaWNhdGlvbnMqKgoKT2theSwgc28gdGhpcyBwYXRjaCBpcyBhbGwgYWJvdXQgcmVmaW5pbmcgaG93IHRoZSBrZXJuZWwgdHJhY2tzIGNvbnRpZ3VvdXMgbWVtb3J5IHpvbmVzLCBzcGVjaWZpY2FsbHkgaW50cm9kdWNpbmcgYHBhZ2VzX3dpdGhfb25saW5lX21lbW1hcGAgYW5kIHVwZGF0aW5nIGBzZXRfem9uZV9jb250aWd1b3VzYC4gTGV0JiMzOTtzIGJyZWFrIGRvd24gbXkgdW5kZXJzdGFuZGluZzoKCjEuICBJdCBpbnRyb2R1Y2VzIGBwYWdlc193aXRoX29ubGluZV9tZW1tYXBgIHdpdGhpbiB0aGUgYHN0cnVjdCB6b25lYCwgYW5kIGluaXRpYWxpemVzIG9yIHVwZGF0ZXMgdGhpcyB2YWx1ZSBpbiBgbWVtbWFwX2luaXRfem9uZV9yYW5nZWAsIGBpbml0X3VuYXZhaWxhYmxlX3JhbmdlYCwgYW5kIGBhZGp1c3RfcHJlc2VudF9wYWdlX2NvdW50YC4KCjIuICBUaGUgaW1wbGVtZW50YXRpb24gb2YgYHNldF96b25lX2NvbnRpZ3VvdXNgIGlzIHNpbXBsaWZpZWQuIEluc3RlYWQgb2YgdHJhdmVyc2luZyBwYWdlYmxvY2tzLCBpdCBub3cgY2hlY2tzIGlmIGBzcGFubmVkX3BhZ2VzYCBlcXVhbHMgYHBhZ2VzX3dpdGhfb25saW5lX21lbW1hcGAuIElmIHNvLCBpdCBzZXRzIGBjb250aWd1b3VzYCB0byB0cnVlLiBUaGlzIHVzZXMgYFdSSVRFX09OQ0VgIGFuZCBgUkVBRF9PTkNFYCBmb3Igc3luY2hyb25pemF0aW9uLCB3aGljaCBpcyBnb29kLiBUaGUgYG1lbW9yeV9ibG9ja19vbmxpbmVgIGFuZCBgbWVtb3J5X2Jsb2NrX29mZmxpbmVgIGZ1bmN0aW9ucyBpbiBgZHJpdmVycy9iYXNlL21lbW9yeS5jYCBhcmUgdXBkYXRlZCB0byBjbGVhciBhbmQgc2V0IHRoZSBjb250aWd1b3VzIGZsYWcgZHVyaW5nIGhvdHBsdWcgb3BlcmF0aW9ucy4gVGhlIGhvdHBsdWcgY29kZSBpbiBgbW0vbWVtb3J5X2hvdHBsdWcuY2AgaXMgYWxzbyBjaGFuZ2VkIHRvIHVzZSBzdWJzZWN0aW9uX292ZXJsYXBzX3pvbmUKCk5vdywgSSYjMzk7bSBhdCB0aGUgS01TQU4gcGFydC4gVGhpcyBpcyB3aGVyZSBJIGhhdmUgdG8gYmUgY2FyZWZ1bC4gVGhlIGluc3RydWN0aW9ucyBzYXkgdG8gb25seSBmbGFnIGBOZWVkc0tNU0FOPXRydWVgIGlmIHRoZXJlJiMzOTtzIGEgcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSByZWFkcyBvciBpbmZvcm1hdGlvbiBsZWFrcy4gU3RhbmRhcmQgS0FTQU4gc2hvdWxkIGhhbmRsZSBPT0IsIFVBRiwgZG91YmxlIGZyZWVzLCBhbmQgbG9ja2luZyBpc3N1ZXMsIHNvIEkgc2hvdWxkbiYjMzk7dCBkdXBsaWNhdGUgZWZmb3J0LgoKVGhlIGtleSBxdWVzdGlvbnMgZm9yIG1lIGFyZToKKiAgIERvZXMgdGhpcyBwYXRjaCBpbnRyb2R1Y2UgbmV3IGtlcm5lbCBzdHJ1Y3R1cmVzIHBhc3NlZCB0byB1c2Vyc3BhY2UgdGhhdCBtaWdodCBoYXZlIHVuaW5pdGlhbGl6ZWQgZmllbGRzPwoqICAgRG9lcyBpdCBoYXZlIGJyYW5jaGluZyBsb2dpYyB0aGF0IGRlcGVuZHMgb24gcG90ZW50aWFsbHkgdW5pbml0aWFsaXplZCB2YXJpYWJsZXM/CiogICBBcmUgdGhlcmUgbmV3IGNvbXBsZXggZGF0YSBzdHJ1Y3R1cmVzIHdoZXJlIHVuaW5pdGlhbGl6ZWQgZmllbGRzIGNvdWxkIGJlIHJlYWQgbGF0ZXI/CiogICBEb2VzIHRoZSBwYXRjaCBpbnRyb2R1Y2UgYSBjaGFuY2Ugb2YgdW5pbml0aWFsaXplZCBieXRlcyBnZXR0aW5nIHJlYWQgdGhyb3VnaCBjaGFuZ2VzIHRvIGJvdW5kcyBjaGVja3MsIGxlbmd0aHMsIGV0Yz8KCkkmIzM5O20gaW5pdGlhbGx5IGxlYW5pbmcgdG93YXJkcyAmIzM0O05vJiMzNDsgYmVjYXVzZSBtb3N0IG9mIHRoZSBjaGFuZ2VzIHNlZW0gdG8gYmUgYWJvdXQgbWVtb3J5IHRyYWNraW5nIGFuZCBzeW5jaHJvbml6YXRpb24uCgpIb3dldmVyLCBJIG5lZWQgdG8gYmUgKmFic29sdXRlbHkqIHN1cmUuIFRoZSBjcml0aWNhbCBwaWVjZSBvZiBjb2RlIEkgbmVlZCB0byByZWFsbHkgbG9vayBhdCBpcyB0aGUgY2hhbmdlcyB0byBgc2V0X3pvbmVfY29udGlndW91c2AsIGJlY2F1c2Ugb2YgdGhpcyBgcGFnZWJsb2NrX3Bmbl90b19wYWdlYCBmdW5jdGlvbi4gSWYgYHpvbmVgIGlzIGRldGVybWluZWQgdG8gKm5vdCogYmUgY29udGlndW91cywgdGhlbiB0aGUgY29kZSBjYWxscyBgX19wYWdlYmxvY2tfcGZuX3RvX3BhZ2VgLiBJcyB0aGVyZSBhIHNpdHVhdGlvbiB3aGVyZSB0aGVyZSBpcyBhIHJhY2Ugd2hlcmUgYHpvbmVgIGNvdWxkIGJlIGNvbnNpZGVyZWQgbm90IGNvbnRpZ3VvdXMgd2hlbiBpdCBhY3R1YWxseSAqaXMqPyBBbmQgd2hhdCBhYm91dCBgcGFnZWJsb2NrX3Bmbl90b19wYWdlYCBpdHNlbGY/IEkmIzM5O20gZ29pbmcgdG8gZG8gYSBncmVwIHRvIHVuZGVyc3RhbmQgdGhlIHVzZXMgb2YgdGhhdCBmdW5jdGlvbi4gSSBoYXZlIHRvIGxvb2sgZm9yIGFueSBzY2VuYXJpb3Mgd2hlcmUgaXQgY291bGQgbGVhZCB0byB1bmluaXRpYWxpemVkIG1lbW9yeSBiZWluZyByZWFkLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjYwLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xNCAwNzo1MjwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtwYWdlYmxvY2tfcGZuX3RvX3BhZ2UmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bW0vY29tcGFjdGlvbi5jPTcxMz1pc29sYXRlX2ZyZWVwYWdlc19yYW5nZShzdHJ1Y3QgY29tcGFjdF9jb250cm9sICpjYyxcbi0tXG5tbS9jb21wYWN0aW9uLmMtNzQ1LVxubW0vY29tcGFjdGlvbi5jOjc0NjpcdFx0aWYgKCFwYWdlYmxvY2tfcGZuX3RvX3BhZ2UoYmxvY2tfc3RhcnRfcGZuLFxubW0vY29tcGFjdGlvbi5jLTc0Ny1cdFx0XHRcdFx0YmxvY2tfZW5kX3BmbiwgY2MtXHUwMDNlem9uZSkpXG4tLVxubW0vY29tcGFjdGlvbi5jPTEzMzc9aXNvbGF0ZV9taWdyYXRlcGFnZXNfcmFuZ2Uoc3RydWN0IGNvbXBhY3RfY29udHJvbCAqY2MsIHVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuLFxuLS1cbm1tL2NvbXBhY3Rpb24uYy0xMzU1LVxubW0vY29tcGFjdGlvbi5jOjEzNTY6XHRcdGlmICghcGFnZWJsb2NrX3Bmbl90b19wYWdlKGJsb2NrX3N0YXJ0X3Bmbixcbm1tL2NvbXBhY3Rpb24uYy0xMzU3LVx0XHRcdFx0XHRibG9ja19lbmRfcGZuLCBjYy1cdTAwM2V6b25lKSlcbi0tXG5tbS9jb21wYWN0aW9uLmM9MTUwNz1mYXN0X2lzb2xhdGVfYXJvdW5kKHN0cnVjdCBjb21wYWN0X2NvbnRyb2wgKmNjLCB1bnNpZ25lZCBsb25nIHBmbilcbi0tXG5tbS9jb21wYWN0aW9uLmMtMTUyMy1cbm1tL2NvbXBhY3Rpb24uYzoxNTI0Olx0cGFnZSA9IHBhZ2VibG9ja19wZm5fdG9fcGFnZShzdGFydF9wZm4sIGVuZF9wZm4sIGNjLVx1MDAzZXpvbmUpO1xubW0vY29tcGFjdGlvbi5jLTE1MjUtXHRpZiAoIXBhZ2UpXG4tLVxubW0vY29tcGFjdGlvbi5jPTE1NTM9c3RhdGljIHZvaWQgZmFzdF9pc29sYXRlX2ZyZWVwYWdlcyhzdHJ1Y3QgY29tcGFjdF9jb250cm9sICpjYylcbi0tXG5tbS9jb21wYWN0aW9uLmMtMTY5NC1cdFx0XHRcdGlmIChjYy1cdTAwM2VkaXJlY3RfY29tcGFjdGlvbiBcdTAwMjZcdTAwMjYgcGZuX3ZhbGlkKG1pbl9wZm4pKSB7XG5tbS9jb21wYWN0aW9uLmM6MTY5NTpcdFx0XHRcdFx0cGFnZSA9IHBhZ2VibG9ja19wZm5fdG9fcGFnZShtaW5fcGZuLFxubW0vY29tcGFjdGlvbi5jLTE2OTYtXHRcdFx0XHRcdFx0bWluKHBhZ2VibG9ja19lbmRfcGZuKG1pbl9wZm4pLFxuLS1cbm1tL2NvbXBhY3Rpb24uYz0xNzI1PXN0YXRpYyB2b2lkIGlzb2xhdGVfZnJlZXBhZ2VzKHN0cnVjdCBjb21wYWN0X2NvbnRyb2wgKmNjKVxuLS1cbm1tL2NvbXBhY3Rpb24uYy0xNzc1LVxubW0vY29tcGFjdGlvbi5jOjE3NzY6XHRcdHBhZ2UgPSBwYWdlYmxvY2tfcGZuX3RvX3BhZ2UoYmxvY2tfc3RhcnRfcGZuLCBibG9ja19lbmRfcGZuLFxubW0vY29tcGFjdGlvbi5jLTE3NzctXHRcdFx0XHRcdFx0XHRcdFx0em9uZSk7XG4tLVxubW0vY29tcGFjdGlvbi5jPTIwOTE9c3RhdGljIGlzb2xhdGVfbWlncmF0ZV90IGlzb2xhdGVfbWlncmF0ZXBhZ2VzKHN0cnVjdCBjb21wYWN0X2NvbnRyb2wgKmNjKVxuLS1cbm1tL2NvbXBhY3Rpb24uYy0yMTM5LVxubW0vY29tcGFjdGlvbi5jOjIxNDA6XHRcdHBhZ2UgPSBwYWdlYmxvY2tfcGZuX3RvX3BhZ2UoYmxvY2tfc3RhcnRfcGZuLFxubW0vY29tcGFjdGlvbi5jLTIxNDEtXHRcdFx0XHRcdFx0YmxvY2tfZW5kX3BmbiwgY2MtXHUwMDNlem9uZSk7XG4tLVxubW0vcGFnZV9hbGxvYy5jPTE2MDA9dm9pZCBfX21lbWluaXQgX19mcmVlX3BhZ2VzX2NvcmUoc3RydWN0IHBhZ2UgKnBhZ2UsIHVuc2lnbmVkIGludCBvcmRlcixcbi0tXG5tbS9wYWdlX2FsbG9jLmMtMTY3MS0gKi9cbm1tL3BhZ2VfYWxsb2MuYzoxNjcyOnN0cnVjdCBwYWdlICpfX3BhZ2VibG9ja19wZm5fdG9fcGFnZSh1bnNpZ25lZCBsb25nIHN0YXJ0X3Bmbixcbm1tL3BhZ2VfYWxsb2MuYy0xNjczLVx0XHRcdFx0ICAgICB1bnNpZ25lZCBsb25nIGVuZF9wZm4sIHN0cnVjdCB6b25lICp6b25lKVxuLS1cbm1tL3BhZ2VfYWxsb2MuaD0xOTY9c3RhdGljIGlubGluZSBzdHJ1Y3QgcGFnZSAqZmluZF9idWRkeV9wYWdlX3BmbihzdHJ1Y3QgcGFnZSAqcGFnZSxcbi0tXG5tbS9wYWdlX2FsbG9jLmgtMjEwLVxubW0vcGFnZV9hbGxvYy5oOjIxMTpleHRlcm4gc3RydWN0IHBhZ2UgKl9fcGFnZWJsb2NrX3Bmbl90b19wYWdlKHVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuLFxubW0vcGFnZV9hbGxvYy5oLTIxMi1cdFx0XHRcdHVuc2lnbmVkIGxvbmcgZW5kX3Bmbiwgc3RydWN0IHpvbmUgKnpvbmUpO1xubW0vcGFnZV9hbGxvYy5oLTIxMy1cbm1tL3BhZ2VfYWxsb2MuaDoyMTQ6c3RhdGljIGlubGluZSBzdHJ1Y3QgcGFnZSAqcGFnZWJsb2NrX3Bmbl90b19wYWdlKHVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuLFxubW0vcGFnZV9hbGxvYy5oLTIxNS1cdFx0XHRcdHVuc2lnbmVkIGxvbmcgZW5kX3Bmbiwgc3RydWN0IHpvbmUgKnpvbmUpXG4tLVxubW0vcGFnZV9hbGxvYy5oLTIxOS1cbm1tL3BhZ2VfYWxsb2MuaDoyMjA6XHRyZXR1cm4gX19wYWdlYmxvY2tfcGZuX3RvX3BhZ2Uoc3RhcnRfcGZuLCBlbmRfcGZuLCB6b25lKTtcbm1tL3BhZ2VfYWxsb2MuaC0yMjEtfVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjYxLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xNCAwNzo1MjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuOC1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMDE1OAoJCQkJCQkJb3V0cHV0OiAzNgoJCQkJCQkJdGhvdWdodHM6IDE5CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBsZXQmIzM5O3MgZGl2ZSBpbnRvIHRoaXMuIEhlcmUmIzM5O3MgbXkgdGFrZSBvbiB1bmRlcnN0YW5kaW5nIHRoaXMgY29kZToKCioqRGl2aW5nIGludG8gYF9fcGFnZWJsb2NrX3Bmbl90b19wYWdlYCoqCgpBbHJpZ2h0LCBJJiMzOTttIGdvaW5nIHRvIGJyZWFrIGRvd24gdGhpcyBgX19wYWdlYmxvY2tfcGZuX3RvX3BhZ2VgIGZ1bmN0aW9uLiBJIHJlY29nbml6ZSB0aGlzIGFzIHNvbWV0aGluZyBjb3JlIHRvIG1lbW9yeSBtYW5hZ2VtZW50LCBsaWtlbHkgcmVsYXRlZCB0byB0aGUga2VybmVsJiMzOTtzIGludGVybmFsIHJlcHJlc2VudGF0aW9uIG9mIHBoeXNpY2FsIG1lbW9yeSBibG9ja3MuIFRoZSBuYW1lIGl0c2VsZiBzdWdnZXN0cyBhIHRyYW5zbGF0aW9uLCBhIG1hcHBpbmcuICYjMzQ7UEZOJiMzNDsgbGlrZWx5IHN0YW5kcyBmb3IgJiMzNDtQaHlzaWNhbCBGcmFtZSBOdW1iZXIsJiMzNDsgYSBmdW5kYW1lbnRhbCBjb25jZXB0IGluIGFkZHJlc3NpbmcgcGh5c2ljYWwgbWVtb3J5LiAmIzM0O1BhZ2UmIzM0OyBpbXBsaWVzIHdlJiMzOTtyZSBkZWFsaW5nIHdpdGggcGFnZS1iYXNlZCBtZW1vcnkgbWFuYWdlbWVudCwgd2hpY2ggaXMgcHJhY3RpY2FsbHkgdWJpcXVpdG91cy4gU28sIG15IGluaXRpYWwgdGhvdWdodCBpcyB0aGF0IHRoaXMgZnVuY3Rpb24gdHJhbnNsYXRlcyBhIHBoeXNpY2FsIGZyYW1lIG51bWJlciAoUEZOKSwgcGVyaGFwcyByZXByZXNlbnRpbmcgdGhlIHN0YXJ0IG9mIGEgbWVtb3J5IGJsb2NrLCBpbnRvIHRoZSBrZXJuZWwmIzM5O3MgaW50ZXJuYWwgYHN0cnVjdCBwYWdlYCByZXByZXNlbnRhdGlvbi4gVGhpcyBzdHJ1Y3QgaXMgY3J1Y2lhbDsgaXTigJlzIHdoZXJlIGFsbCB0aGUgbWV0YWRhdGEgYWJvdXQgYSBwaHlzaWNhbCBwYWdlIGxpdmVzOiBpdHMgdXNhZ2UgY291bnQsIGl0cyBzdGF0dXMgKGZyZWUsIHJlc2VydmVkLCBhY3RpdmUsIGV0Yy4pLCB3aGljaCBwcm9jZXNzZXMgbWlnaHQgYmUgdXNpbmcgaXQsIGFuZCBzbyBvbi4gVW5kZXJzdGFuZGluZyB0aGlzIG1hcHBpbmcgaXMgY3JpdGljYWwgZm9yIHRoaW5ncyBsaWtlIG1lbW9yeSBhbGxvY2F0aW9uLCBmcmVlaW5nLCBhbmQgcG90ZW50aWFsbHkgZXZlbiBwYWdlIG1pZ3JhdGlvbiBvciBwcm90ZWN0aW9uLiBOb3csIGxldCYjMzk7cyBzZWUgZXhhY3RseSBob3cgdGhpcyBmdW5jdGlvbiB3b3JrcyBpdHMgbWFnaWMhCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NjIvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE0IDA3OjUyPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7bW0vcGFnZV9hbGxvYy5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMTY3MCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiA0MAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsxNjcwOlx0ICogbm90IHJlY29nbml6ZSBhbnkgc3BlY2lmaWMgbWV0YWRhdGEgaW4gc3RydWN0IHBhZ2VzLlxuMTY3MTpcdCAqL1xuMTY3MjpcdHN0cnVjdCBwYWdlICpfX3BhZ2VibG9ja19wZm5fdG9fcGFnZSh1bnNpZ25lZCBsb25nIHN0YXJ0X3BmbixcbjE2NzM6XHRcdFx0XHRcdCAgICAgdW5zaWduZWQgbG9uZyBlbmRfcGZuLCBzdHJ1Y3Qgem9uZSAqem9uZSlcbjE2NzQ6XHR7XG4xNjc1Olx0XHRzdHJ1Y3QgcGFnZSAqc3RhcnRfcGFnZTtcbjE2NzY6XHRcdHN0cnVjdCBwYWdlICplbmRfcGFnZTtcbjE2Nzc6XHRcbjE2Nzg6XHRcdC8qIGVuZF9wZm4gaXMgb25lIHBhc3QgdGhlIHJhbmdlIHdlIGFyZSBjaGVja2luZyAqL1xuMTY3OTpcdFx0ZW5kX3Bmbi0tO1xuMTY4MDpcdFxuMTY4MTpcdFx0aWYgKCFwZm5fdmFsaWQoZW5kX3BmbikpXG4xNjgyOlx0XHRcdHJldHVybiBOVUxMO1xuMTY4MzpcdFxuMTY4NDpcdFx0c3RhcnRfcGFnZSA9IHBmbl90b19vbmxpbmVfcGFnZShzdGFydF9wZm4pO1xuMTY4NTpcdFx0aWYgKCFzdGFydF9wYWdlKVxuMTY4NjpcdFx0XHRyZXR1cm4gTlVMTDtcbjE2ODc6XHRcbjE2ODg6XHRcdGlmIChwYWdlX3pvbmUoc3RhcnRfcGFnZSkgIT0gem9uZSlcbjE2ODk6XHRcdFx0cmV0dXJuIE5VTEw7XG4xNjkwOlx0XG4xNjkxOlx0XHRlbmRfcGFnZSA9IHBmbl90b19wYWdlKGVuZF9wZm4pO1xuMTY5MjpcdFxuMTY5MzpcdFx0LyogVGhpcyBnaXZlcyBhIHNob3J0ZXIgY29kZSB0aGFuIGRlcml2aW5nIHBhZ2Vfem9uZShlbmRfcGFnZSkgKi9cbjE2OTQ6XHRcdGlmIChwYWdlX3pvbmVfaWQoc3RhcnRfcGFnZSkgIT0gcGFnZV96b25lX2lkKGVuZF9wYWdlKSlcbjE2OTU6XHRcdFx0cmV0dXJuIE5VTEw7XG4xNjk2Olx0XG4xNjk3Olx0XHRyZXR1cm4gc3RhcnRfcGFnZTtcbjE2OTg6XHR9XG4xNjk5Olx0XG4xNzAwOlx0LypcbjE3MDE6XHQgKiBUaGUgb3JkZXIgb2Ygc3ViZGl2aXNpb24gaGVyZSBpcyBjcml0aWNhbCBmb3IgdGhlIElPIHN1YnN5c3RlbS5cbjE3MDI6XHQgKiBQbGVhc2UgZG8gbm90IGFsdGVyIHRoaXMgb3JkZXIgd2l0aG91dCBnb29kIHJlYXNvbnMgYW5kIHJlZ3Jlc3Npb25cbjE3MDM6XHQgKiB0ZXN0aW5nLiBTcGVjaWZpY2FsbHksIGFzIGxhcmdlIGJsb2NrcyBvZiBtZW1vcnkgYXJlIHN1YmRpdmlkZWQsXG4xNzA0Olx0ICogdGhlIG9yZGVyIGluIHdoaWNoIHNtYWxsZXIgYmxvY2tzIGFyZSBkZWxpdmVyZWQgZGVwZW5kcyBvbiB0aGUgb3JkZXJcbjE3MDU6XHQgKiB0aGV5JiMzOTtyZSBzdWJkaXZpZGVkIGluIHRoaXMgZnVuY3Rpb24uIFRoaXMgaXMgdGhlIHByaW1hcnkgZmFjdG9yXG4xNzA2Olx0ICogaW5mbHVlbmNpbmcgdGhlIG9yZGVyIGluIHdoaWNoIHBhZ2VzIGFyZSBkZWxpdmVyZWQgdG8gdGhlIElPXG4xNzA3Olx0ICogc3Vic3lzdGVtIGFjY29yZGluZyB0byBlbXBpcmljYWwgdGVzdGluZywgYW5kIHRoaXMgaXMgYWxzbyBqdXN0aWZpZWRcbjE3MDg6XHQgKiBieSBjb25zaWRlcmluZyB0aGUgYmVoYXZpb3Igb2YgYSBidWRkeSBzeXN0ZW0gY29udGFpbmluZyBhIHNpbmdsZVxuMTcwOTpcdCAqIGxhcmdlIGJsb2NrIG9mIG1lbW9yeSBhY3RlZCBvbiBieSBhIHNlcmllcyBvZiBzbWFsbCBhbGxvY2F0aW9ucy5cbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD42My8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTQgMDc6NTI8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjgtZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTEwNzkKCQkJCQkJCW91dHB1dDogMjMKCQkJCQkJCXRob3VnaHRzOiA5OQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgQ29udGlndW91cyBNZW1vcnkgWm9uZSBPcHRpbWl6YXRpb24qKgoKT2theSwgc28gSSYjMzk7bSBsb29raW5nIGF0IHRoaXMgY29kZSBhbmQgaXQgc2VlbXMgbGlrZSB0aGVyZSYjMzk7cyBhbiBvcHRpbWl6YXRpb24gcmVsYXRlZCB0byBjb250aWd1b3VzIG1lbW9yeSB6b25lcy4gVGhlIGZ1bmN0aW9uIGB6b25lX2lzX2NvbnRpZ3VvdXMoem9uZSlgIGlzIGtleSBoZXJlLiBBcHBhcmVudGx5LCB3aGVuIHRoaXMgZnVuY3Rpb24gcmV0dXJucyB0cnVlIOKAkyBtZWFuaW5nIGEgem9uZSBpcyBjb250aWd1b3VzIOKAkyB0aGUgYHBhZ2VibG9ja19wZm5fdG9fcGFnZWAgZnVuY3Rpb24gYnlwYXNzZXMgYSBmZXcgY2hlY2tzLiBJdCBza2lwcyBgcGZuX3ZhbGlkKClgLCBgcGZuX3RvX29ubGluZV9wYWdlKClgLCBhbmQgbGlrZWx5IG90aGVyIHZhbGlkaXR5IGNoZWNrcy4gSW5zdGVhZCwgaXQganVzdCBkb2VzIGEgZGlyZWN0IGBwZm5fdG9fcGFnZShzdGFydF9wZm4pYC4gVGhhdCYjMzk7cyBhIGNsYXNzaWMgb3B0aW1pemF0aW9uOiBJZiB3ZSAqa25vdyogdGhlIG1lbW9yeSBpcyBsYWlkIG91dCBjb250aWd1b3VzbHksIHdlIGRvbiYjMzk7dCBuZWVkIHRvIHdhc3RlIGN5Y2xlcyB2ZXJpZnlpbmcgZWFjaCBQRk4uCgpJbnRlcmVzdGluZy4gSSBzZWUgdGhlIGNvbW1pdCBtZW50aW9ucyB0aGF0IHRoZSBgem9uZS0mZ3Q7Y29udGlndW91c2AgZmllbGQgKmFscmVhZHkgZXhpc3RzKi4gU28gdGhpcyBpc24mIzM5O3QgYSBuZXcgY29uY2VwdCwganVzdCBhIHJlZmluZW1lbnQsIHdoaWNoIGlzIGdvb2QuIFRoYXQgbWFrZXMgc2Vuc2UuIE5vdywgSSBuZWVkIHRvIHVuZGVyc3RhbmQgd2hlcmUgYHpvbmUtJmd0O2NvbnRpZ3VvdXNgIGlzIGFjdHVhbGx5IGRlZmluZWQgYW5kIGhvdyBpdCYjMzk7cyBiZWluZyB1c2VkLiBUaGF0JiMzOTtzIHRoZSByZWFsIHN0b3J5LCByaWdodD8gR290dGEgZm9sbG93IHRoZSBicmVhZGNydW1icyBhbmQgc2VlIGhvdyB0aGUga2VybmVsIGRldGVybWluZXMgaWYgYSB6b25lIGlzIGluZGVlZCBjb250aWd1b3VzIGFuZCBob3cgaXQgbGV2ZXJhZ2VzIHRoYXQga25vd2xlZGdlLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjY0LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xNCAwNzo1MjwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtjb250aWd1b3VzJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7bW0vJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O1xuRnVsbCBvdXRwdXQgaXMgdG9vIGxvbmcsIHNob3dpbmcgNTAwIG91dCBvZiA3ODYgbGluZXMuXG5Vc2UgbW9yZSBwcmVjaXNlIGV4cHJlc3Npb24gaWYgcG9zc2libGUuXG5cbm1tL0tjb25maWc9NjQyPWNvbmZpZyBDT01QQUNUSU9OXG4tLVxubW0vS2NvbmZpZy02NDgtXHQgIENvbXBhY3Rpb24gaXMgdGhlIG9ubHkgbWVtb3J5IG1hbmFnZW1lbnQgY29tcG9uZW50IHRvIGZvcm1cbm1tL0tjb25maWc6NjQ5Olx0ICBoaWdoIG9yZGVyIChsYXJnZXIgcGh5c2ljYWxseSBjb250aWd1b3VzKSBtZW1vcnkgYmxvY2tzXG5tbS9LY29uZmlnLTY1MC1cdCAgcmVsaWFibHkuIFRoZSBwYWdlIGFsbG9jYXRvciByZWxpZXMgb24gY29tcGFjdGlvbiBoZWF2aWx5IGFuZFxuLS1cbm1tL0tjb25maWc9NzgyPWNvbmZpZyBOT01NVV9JTklUSUFMX1RSSU1fRVhDRVNTXG4tLVxubW0vS2NvbmZpZy03ODYtXHRoZWxwXG5tbS9LY29uZmlnOjc4NzpcdCAgVGhlIE5PTU1VIG1tYXAoKSBmcmVxdWVudGx5IG5lZWRzIHRvIGFsbG9jYXRlIGxhcmdlIGNvbnRpZ3VvdXMgY2h1bmtzXG5tbS9LY29uZmlnLTc4OC1cdCAgb2YgbWVtb3J5IG9uIHdoaWNoIHRvIHN0b3JlIG1hcHBpbmdzLCBidXQgaXQgY2FuIG9ubHkgYXNrIHRoZSBzeXN0ZW1cbi0tXG5tbS9LY29uZmlnPTEwNTY9Y29uZmlnIENNQVxuLS1cbm1tL0tjb25maWctMTA2Mi1cdCAgVGhpcyBlbmFibGVzIHRoZSBDb250aWd1b3VzIE1lbW9yeSBBbGxvY2F0b3Igd2hpY2ggYWxsb3dzIG90aGVyXG5tbS9LY29uZmlnOjEwNjM6XHQgIHN1YnN5c3RlbXMgdG8gYWxsb2NhdGUgYmlnIHBoeXNpY2FsbHktY29udGlndW91cyBibG9ja3Mgb2YgbWVtb3J5LlxubW0vS2NvbmZpZy0xMDY0LVx0ICBDTUEgcmVzZXJ2ZXMgYSByZWdpb24gb2YgbWVtb3J5IGFuZCBhbGxvd3Mgb25seSBtb3ZhYmxlIHBhZ2VzIHRvXG5tbS9LY29uZmlnLTEwNjUtXHQgIGJlIGFsbG9jYXRlZCBmcm9tIGl0LiBUaGlzIHdheSwgdGhlIGtlcm5lbCBjYW4gdXNlIHRoZSBtZW1vcnkgZm9yXG5tbS9LY29uZmlnOjEwNjY6XHQgIHBhZ2VjYWNoZSBhbmQgd2hlbiBhIHN1YnN5c3RlbSByZXF1ZXN0cyBmb3IgY29udGlndW91cyBhcmVhLCB0aGVcbm1tL0tjb25maWc6MTA2NzpcdCAgYWxsb2NhdGVkIHBhZ2VzIGFyZSBtaWdyYXRlZCBhd2F5IHRvIHNlcnZlIHRoZSBjb250aWd1b3VzIHJlcXVlc3QuXG5tbS9LY29uZmlnLTEwNjgtXG4tLVxubW0vS2NvbmZpZz0xMDg0PWNvbmZpZyBDTUFfQVJFQVNcbi0tXG5tbS9LY29uZmlnLTEwOTctIyBTZWxlY3QgdGhpcyBjb25maWcgb3B0aW9uIGZyb20gdGhlIGFyY2hpdGVjdHVyZSBLY29uZmlnLCBpZiBhdmFpbGFibGUsIHRvIHNldFxubW0vS2NvbmZpZzoxMDk4OiMgdGhlIG1heCBwYWdlIG9yZGVyIGZvciBwaHlzaWNhbGx5IGNvbnRpZ3VvdXMgYWxsb2NhdGlvbnMuXG5tbS9LY29uZmlnLTEwOTktI1xuLS1cbm1tL0tjb25maWc9MTEwOD1jb25maWcgUEFHRV9CTE9DS19NQVhfT1JERVJcbi0tXG5tbS9LY29uZmlnLTExMTUtXHQgIFRoZSBwYWdlIGJsb2NrIG9yZGVyIHJlZmVycyB0byB0aGUgcG93ZXIgb2YgdHdvIG51bWJlciBvZiBwYWdlcyB0aGF0XG5tbS9LY29uZmlnOjExMTY6XHQgIGFyZSBwaHlzaWNhbGx5IGNvbnRpZ3VvdXMgYW5kIGNhbiBoYXZlIGEgbWlncmF0ZSB0eXBlIGFzc29jaWF0ZWQgdG9cbm1tL0tjb25maWctMTExNy1cdCAgdGhlbS4gVGhlIG1heGltdW0gc2l6ZSBvZiB0aGUgcGFnZSBibG9jayBvcmRlciBpcyBhdCBsZWFzdCBsaW1pdGVkIGJ5XG4tLVxubW0vY21hLmM9MjU1PXN0YXRpYyB2b2lkIF9faW5pdCBjbWFfZHJvcF9hcmVhKHN0cnVjdCBjbWEgKmNtYSlcbi0tXG5tbS9jbWEuYy0yNjEtLyoqXG5tbS9jbWEuYzoyNjI6ICogY21hX2luaXRfcmVzZXJ2ZWRfbWVtKCkgLSBjcmVhdGUgY3VzdG9tIGNvbnRpZ3VvdXMgYXJlYSBmcm9tIHJlc2VydmVkIG1lbW9yeVxubW0vY21hLmMtMjYzLSAqIEBiYXNlOiBCYXNlIGFkZHJlc3Mgb2YgdGhlIHJlc2VydmVkIGFyZWFcbi0tXG5tbS9jbWEuYy0yNzAtICpcbm1tL2NtYS5jOjI3MTogKiBUaGlzIGZ1bmN0aW9uIGNyZWF0ZXMgY3VzdG9tIGNvbnRpZ3VvdXMgYXJlYSBmcm9tIGFscmVhZHkgcmVzZXJ2ZWQgbWVtb3J5LlxubW0vY21hLmMtMjcyLSAqL1xuLS1cbm1tL2NtYS5jPTM4Nz1zdGF0aWMgcGh5c19hZGRyX3QgX19pbml0IGNtYV9hbGxvY19tZW0ocGh5c19hZGRyX3QgYmFzZSwgcGh5c19hZGRyX3Qgc2l6ZSxcbi0tXG5tbS9jbWEuYy00MzUtXG5tbS9jbWEuYzo0MzY6c3RhdGljIGludCBfX2luaXQgX19jbWFfZGVjbGFyZV9jb250aWd1b3VzX25pZChwaHlzX2FkZHJfdCAqYmFzZXAsXG5tbS9jbWEuYy00MzctXHRcdFx0cGh5c19hZGRyX3Qgc2l6ZSwgcGh5c19hZGRyX3QgbGltaXQsXG4tLVxubW0vY21hLmMtNTMzLSAqL1xubW0vY21hLmM6NTM0OmludCBfX2luaXQgY21hX2RlY2xhcmVfY29udGlndW91c19tdWx0aShwaHlzX2FkZHJfdCB0b3RhbF9zaXplLFxubW0vY21hLmMtNTM1LVx0XHRcdHBoeXNfYWRkcl90IGFsaWduLCB1bnNpZ25lZCBpbnQgb3JkZXJfcGVyX2JpdCxcbi0tXG5tbS9jbWEuYy01NTEtXHQgKi9cbm1tL2NtYS5jOjU1MjpcdHJldCA9IF9fY21hX2RlY2xhcmVfY29udGlndW91c19uaWQoXHUwMDI2c3RhcnQsIHRvdGFsX3NpemUsIDAsIGFsaWduLFxubW0vY21hLmMtNTUzLVx0XHRcdG9yZGVyX3Blcl9iaXQsIGZhbHNlLCBuYW1lLCByZXNfY21hLCBuaWQpO1xuLS1cbm1tL2NtYS5jLTU2MS1cdCAqIE5vIG5lZWQgdG8gZG8gdGhlIGFsaWdubWVudCBjaGVja3MgaGVyZSwgdGhlIGNhbGwgdG9cbm1tL2NtYS5jOjU2MjpcdCAqIGNtYV9kZWNsYXJlX2NvbnRpZ3VvdXNfbmlkIGFib3ZlIHdvdWxkIGhhdmUgY2F1Z2h0XG5tbS9jbWEuYy01NjMtXHQgKiBhbnkgaXNzdWVzLiBXaXRoIHRoZSBjaGVja3MsIHdlIGtub3cgdGhhdDpcbi0tXG5tbS9jbWEuYy03MTktLyoqXG5tbS9jbWEuYzo3MjA6ICogY21hX2RlY2xhcmVfY29udGlndW91c19uaWQoKSAtIHJlc2VydmUgY3VzdG9tIGNvbnRpZ3VvdXMgYXJlYVxubW0vY21hLmMtNzIxLSAqIEBiYXNlOiBCYXNlIGFkZHJlc3Mgb2YgdGhlIHJlc2VydmVkIGFyZWEgb3B0aW9uYWwsIHVzZSAwIGZvciBhbnlcbi0tXG5tbS9jbWEuYy03MzUtICpcbm1tL2NtYS5jOjczNjogKiBJZiBAZml4ZWQgaXMgdHJ1ZSwgcmVzZXJ2ZSBjb250aWd1b3VzIGFyZWEgYXQgZXhhY3RseSBAYmFzZS4gIElmIGZhbHNlLFxubW0vY21hLmMtNzM3LSAqIHJlc2VydmUgaW4gcmFuZ2UgZnJvbSBAYmFzZSB0byBAbGltaXQuXG5tbS9jbWEuYy03MzgtICovXG5tbS9jbWEuYzo3Mzk6aW50IF9faW5pdCBjbWFfZGVjbGFyZV9jb250aWd1b3VzX25pZChwaHlzX2FkZHJfdCBiYXNlLFxubW0vY21hLmMtNzQwLVx0XHRcdHBoeXNfYWRkcl90IHNpemUsIHBoeXNfYWRkcl90IGxpbWl0LFxuLS1cbm1tL2NtYS5jLTc0Ni1cbm1tL2NtYS5jOjc0NzpcdHJldCA9IF9fY21hX2RlY2xhcmVfY29udGlndW91c19uaWQoXHUwMDI2YmFzZSwgc2l6ZSwgbGltaXQsIGFsaWdubWVudCxcbm1tL2NtYS5jLTc0OC1cdFx0XHRvcmRlcl9wZXJfYml0LCBmaXhlZCwgbmFtZSwgcmVzX2NtYSwgbmlkKTtcbi0tXG5tbS9jbWEuYz03ODY9c3RhdGljIGludCBjbWFfcmFuZ2VfYWxsb2Moc3RydWN0IGNtYSAqY21hLCBzdHJ1Y3QgY21hX21lbXJhbmdlICpjbXIsXG4tLVxubW0vY21hLmMtODI0LVx0XHQvKlxubW0vY21hLmM6ODI1Olx0XHQgKiBEbyBub3QgaGFuZCBvdXQgcGFnZSByYW5nZXMgdGhhdCBhcmUgbm90IGNvbnRpZ3VvdXMsIHNvXG5tbS9jbWEuYy04MjYtXHRcdCAqIGNhbGxlcnMgY2FuIGp1c3QgaXRlcmF0ZSB0aGUgcGFnZXMgd2l0aG91dCBoYXZpbmcgdG8gd29ycnlcbi0tXG5tbS9jbWEuYy04MjgtXHRcdCAqL1xubW0vY21hLmM6ODI5Olx0XHRpZiAoIXBhZ2VfcmFuZ2VfY29udGlndW91cyhwYWdlLCBjb3VudCkpIHtcbm1tL2NtYS5jLTgzMC1cdFx0XHRzcGluX3VubG9ja19pcnEoXHUwMDI2Y21hLVx1MDAzZWxvY2spO1xuLS1cbm1tL2NtYS5jPTkzMj1zdHJ1Y3QgcGFnZSAqY21hX2FsbG9jX2Zyb3plbl9jb21wb3VuZChzdHJ1Y3QgY21hICpjbWEsIHVuc2lnbmVkIGludCBvcmRlcilcbi0tXG5tbS9jbWEuYy05MzktLyoqXG5tbS9jbWEuYzo5NDA6ICogY21hX2FsbG9jKCkgLSBhbGxvY2F0ZSBwYWdlcyBmcm9tIGNvbnRpZ3VvdXMgYXJlYVxubW0vY21hLmMtOTQxLSAqIEBjbWE6ICAgQ29udGlndW91cyBtZW1vcnkgcmVnaW9uIGZvciB3aGljaCB0aGUgYWxsb2NhdGlvbiBpcyBwZXJmb3JtZWQuXG4tLVxubW0vY21hLmMtOTQ1LSAqXG5tbS9jbWEuYzo5NDY6ICogVGhpcyBmdW5jdGlvbiBhbGxvY2F0ZXMgcGFydCBvZiBjb250aWd1b3VzIG1lbW9yeSBvbiBzcGVjaWZpY1xubW0vY21hLmM6OTQ3OiAqIGNvbnRpZ3VvdXMgbWVtb3J5IGFyZWEuXG5tbS9jbWEuYy05NDgtICovXG4tLVxubW0vY21hLmM9OTk2PXN0YXRpYyB2b2lkIF9fY21hX3JlbGVhc2VfZnJvemVuKHN0cnVjdCBjbWEgKmNtYSwgc3RydWN0IGNtYV9tZW1yYW5nZSAqY21yLFxuLS1cbm1tL2NtYS5jLTEwMTUtICogVGhpcyBmdW5jdGlvbiByZWxlYXNlcyBtZW1vcnkgYWxsb2NhdGVkIGJ5IGNtYV9hbGxvYygpLlxubW0vY21hLmM6MTAxNjogKiBJdCByZXR1cm5zIGZhbHNlIHdoZW4gcHJvdmlkZWQgcGFnZXMgZG8gbm90IGJlbG9uZyB0byBjb250aWd1b3VzIGFyZWEgYW5kXG5tbS9jbWEuYy0xMDE3LSAqIHRydWUgb3RoZXJ3aXNlLlxuLS1cbm1tL2RhbW9uL3Rlc3RzL3ZhZGRyLWt1bml0Lmg9MTM9c3RhdGljIGludCBfX2xpbmtfdm1hcyhzdHJ1Y3QgbWFwbGVfdHJlZSAqbXQsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hcyxcbi0tXG5tbS9kYW1vbi90ZXN0cy92YWRkci1rdW5pdC5oLTM5LSAqIGNvbXBsZXggYW5kIGR5bmFtaWMgbWVtb3J5IG1hcHBpbmdzIG9mIGVhY2ggdGFyZ2V0IHRhc2sgdG8gdGhyZWVcbm1tL2RhbW9uL3Rlc3RzL3ZhZGRyLWt1bml0Lmg6NDA6ICogZGlzY29udGlndW91cyByZWdpb25zIHdoaWNoIGNvdmVyIGV2ZXJ5IG1hcHBlZCBhcmVhcy4gIEhvd2V2ZXIsIHRoZSB0aHJlZVxubW0vZGFtb24vdGVzdHMvdmFkZHIta3VuaXQuaC00MS0gKiByZWdpb25zIHNob3VsZCBub3QgaW5jbHVkZSB0aGUgdHdvIGJpZ2dlc3QgdW5tYXBwZWQgYXJlYXMgaW4gdGhlIG9yaWdpbmFsXG4tLVxubW0vZGVidWdfdm1fcGd0YWJsZS5jPTQ1PXN0cnVjdCBwZ3RhYmxlX2RlYnVnX2FyZ3Mge1xuLS1cbm1tL2RlYnVnX3ZtX3BndGFibGUuYy02My1cbm1tL2RlYnVnX3ZtX3BndGFibGUuYzo2NDpcdGJvb2xcdFx0XHRpc19jb250aWd1b3VzX3BhZ2U7XG5tbS9kZWJ1Z192bV9wZ3RhYmxlLmMtNjUtXHR1bnNpZ25lZCBsb25nXHRcdHB1ZF9wZm47XG4tLVxubW0vZGVidWdfdm1fcGd0YWJsZS5jPTk3NT1kZWJ1Z192bV9wZ3RhYmxlX2ZyZWVfaHVnZV9wYWdlKHN0cnVjdCBwZ3RhYmxlX2RlYnVnX2FyZ3MgKmFyZ3MsXG4tLVxubW0vZGVidWdfdm1fcGd0YWJsZS5jLTk3OC0jaWZkZWYgQ09ORklHX0NPTlRJR19BTExPQ1xubW0vZGVidWdfdm1fcGd0YWJsZS5jOjk3OTpcdGlmIChhcmdzLVx1MDAzZWlzX2NvbnRpZ3VvdXNfcGFnZSkge1xubW0vZGVidWdfdm1fcGd0YWJsZS5jLTk4MC1cdFx0ZnJlZV9jb250aWdfcmFuZ2UocGZuLCAxIFx1MDAzY1x1MDAzYyBvcmRlcik7XG4tLVxubW0vZGVidWdfdm1fcGd0YWJsZS5jPTEwNDY9ZGVidWdfdm1fcGd0YWJsZV9hbGxvY19odWdlX3BhZ2Uoc3RydWN0IHBndGFibGVfZGVidWdfYXJncyAqYXJncywgaW50IG9yZGVyKVxuLS1cbm1tL2RlYnVnX3ZtX3BndGFibGUuYy0xMDU0LVx0XHRpZiAocGFnZSkge1xubW0vZGVidWdfdm1fcGd0YWJsZS5jOjEwNTU6XHRcdFx0YXJncy1cdTAwM2Vpc19jb250aWd1b3VzX3BhZ2UgPSB0cnVlO1xubW0vZGVidWdfdm1fcGd0YWJsZS5jLTEwNTYtXHRcdFx0cmV0dXJuIHBhZ2U7XG4tLVxubW0vZGVidWdfdm1fcGd0YWJsZS5jPTExNDM9c3RhdGljIGludCBfX2luaXQgaW5pdF9hcmdzKHN0cnVjdCBwZ3RhYmxlX2RlYnVnX2FyZ3MgKmFyZ3MpXG4tLVxubW0vZGVidWdfdm1fcGd0YWJsZS5jLTExNTktXHRhcmdzLVx1MDAzZXBhZ2VfcHJvdF9ub25lICAgICA9IHZtX2dldF9wYWdlX3Byb3QoVk1fTk9ORSk7XG5tbS9kZWJ1Z192bV9wZ3RhYmxlLmM6MTE2MDpcdGFyZ3MtXHUwMDNlaXNfY29udGlndW91c19wYWdlID0gZmFsc2U7XG5tbS9kZWJ1Z192bV9wZ3RhYmxlLmMtMTE2MS1cdGFyZ3MtXHUwMDNlcHVkX3BmbiAgICAgICAgICAgID0gVUxPTkdfTUFYO1xuLS1cbm1tL2ZpbGVtYXAuYz0yMjU1PUVYUE9SVF9TWU1CT0woZmlsZW1hcF9nZXRfZm9saW9zKTtcbi0tXG5tbS9maWxlbWFwLmMtMjI1Ny0vKipcbm1tL2ZpbGVtYXAuYzoyMjU4OiAqIGZpbGVtYXBfZ2V0X2ZvbGlvc19jb250aWcgLSBHZXQgYSBiYXRjaCBvZiBjb250aWd1b3VzIGZvbGlvc1xubW0vZmlsZW1hcC5jLTIyNTktICogQG1hcHBpbmc6XHRUaGUgYWRkcmVzc19zcGFjZSB0byBzZWFyY2hcbi0tXG5tbS9maWxlbWFwLmMtMjI2NC0gKiBmaWxlbWFwX2dldF9mb2xpb3NfY29udGlnKCkgd29ya3MgZXhhY3RseSBsaWtlIGZpbGVtYXBfZ2V0X2ZvbGlvcygpLFxubW0vZmlsZW1hcC5jOjIyNjU6ICogZXhjZXB0IHRoZSByZXR1cm5lZCBmb2xpb3MgYXJlIGd1YXJhbnRlZWQgdG8gYmUgY29udGlndW91cy4gVGhpcyBtYXlcbm1tL2ZpbGVtYXAuYzoyMjY2OiAqIG5vdCByZXR1cm4gYWxsIGNvbnRpZ3VvdXMgZm9saW9zIGlmIHRoZSBiYXRjaCBnZXRzIGZpbGxlZCB1cC5cbm1tL2ZpbGVtYXAuYy0yMjY3LSAqXG4tLVxubW0vZmlsZW1hcC5jPTI0NTU9c3RhdGljIHZvaWQgc2hyaW5rX3JlYWRhaGVhZF9zaXplX2VpbyhzdHJ1Y3QgZmlsZV9yYV9zdGF0ZSAqcmEpXG4tLVxubW0vZmlsZW1hcC5jLTI0NjItICpcbm1tL2ZpbGVtYXAuYzoyNDYzOiAqIEdldCBhIGJhdGNoIG9mIGZvbGlvcyB3aGljaCByZXByZXNlbnQgYSBjb250aWd1b3VzIHJhbmdlIG9mIGJ5dGVzIGluXG5tbS9maWxlbWFwLmMtMjQ2NC0gKiB0aGUgZmlsZS4gIE5vIGV4Y2VwdGlvbmFsIGVudHJpZXMgd2lsbCBiZSByZXR1cm5lZC4gIElmIEBpbmRleCBpcyBpblxuLS1cbm1tL2d1cC5jPTMyNz1FWFBPUlRfU1lNQk9MKHVucGluX3VzZXJfcGFnZXNfZGlydHlfbG9jayk7XG4tLVxubW0vZ3VwLmMtMzM5LSAqXG5tbS9ndXAuYzozNDA6ICogVGhlIHBhZ2UgcmFuZ2UgbXVzdCBiZSB0cnVseSBwaHlzaWNhbGx5IGNvbnRpZ3VvdXM6IHRoZSBwYWdlIHJhbmdlXG5tbS9ndXAuYzozNDE6ICogY29ycmVzcG9uZHMgdG8gYSBjb250aWd1b3VzIFBGTiByYW5nZSBhbmQgYWxsIHBhZ2VzIGNhbiBiZSBpdGVyYXRlZFxubW0vZ3VwLmMtMzQyLSAqIG5hdHVyYWxseS5cbi0tXG5tbS9ndXAuYz0zNTQ9dm9pZCB1bnBpbl91c2VyX3BhZ2VfcmFuZ2VfZGlydHlfbG9jayhzdHJ1Y3QgcGFnZSAqcGFnZSwgdW5zaWduZWQgbG9uZyBucGFnZXMsXG4tLVxubW0vZ3VwLmMtMzYwLVxubW0vZ3VwLmM6MzYxOlx0Vk1fV0FSTl9PTl9PTkNFKCFwYWdlX3JhbmdlX2NvbnRpZ3VvdXMocGFnZSwgbnBhZ2VzKSk7XG5tbS9ndXAuYy0zNjItXG4tLVxubW0vZ3VwLmM9MzQwOD1FWFBPUlRfU1lNQk9MKHBpbl91c2VyX3BhZ2VzX3VubG9ja2VkKTtcbi0tXG5tbS9ndXAuYy0zNDE4LSAqXG5tbS9ndXAuYzozNDE5OiAqIEF0dGVtcHQgdG8gcGluIGZvbGlvcyBhc3NvY2lhdGVkIHdpdGggYSBtZW1mZCBpbiB0aGUgY29udGlndW91cyByYW5nZVxubW0vZ3VwLmMtMzQyMC0gKiBbc3RhcnQsIGVuZF0uIEdpdmVuIHRoYXQgYSBtZW1mZCBpcyBlaXRoZXIgYmFja2VkIGJ5IHNobWVtIG9yIGh1Z2V0bGIsXG4tLVxubW0vaHVnZXRsYi5jPTQ5Mj1zdGF0aWMgdm9pZCByZWNvcmRfaHVnZXRsYl9jZ3JvdXBfdW5jaGFyZ2VfaW5mbyhzdHJ1Y3QgaHVnZXRsYl9jZ3JvdXAgKmhfY2csXG4tLVxubW0vaHVnZXRsYi5jLTUwMy1cdFx0ICogVGhlIGNhbGxlciB3aWxsIGhvbGQgZXhhY3RseSBvbmUgaF9jZy1cdTAwM2Vjc3MgcmVmZXJlbmNlIGZvciB0aGVcbm1tL2h1Z2V0bGIuYzo1MDQ6XHRcdCAqIHdob2xlIGNvbnRpZ3VvdXMgcmVzZXJ2YXRpb24gcmVnaW9uLiBCdXQgdGhpcyBhcmVhIG1pZ2h0IGJlXG5tbS9odWdldGxiLmMtNTA1LVx0XHQgKiBzY2F0dGVyZWQgd2hlbiB0aGVyZSBhcmUgYWxyZWFkeSBzb21lIGZpbGVfcmVnaW9ucyByZXNpZGUgaW5cbi0tXG5tbS9odWdldGxiX2NtYS5jPTIxMT12b2lkIF9faW5pdCBodWdldGxiX2NtYV9yZXNlcnZlKHZvaWQpXG4tLVxubW0vaHVnZXRsYl9jbWEuYy0zNTctXHRcdCAqL1xubW0vaHVnZXRsYl9jbWEuYzozNTg6XHRcdHJlcyA9IGNtYV9kZWNsYXJlX2NvbnRpZ3VvdXNfbXVsdGkoc2l6ZSwgZ2lnYW50aWNfcGFnZV9zaXplLFxubW0vaHVnZXRsYl9jbWEuYy0zNTktXHRcdFx0XHRcdEhVR0VUTEJfUEFHRV9PUkRFUiwgbmFtZSxcbi0tXG5tbS9pbnRlcm5hbC5oPTUwND1zdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9uZXh0X3N3cF9vZmZzZXQocHRlX3QgcHRlKVxuLS1cbm1tL2ludGVybmFsLmgtNTA5LS8qKlxubW0vaW50ZXJuYWwuaDo1MTA6ICogc3dhcF9wdGVfYmF0Y2ggLSBkZXRlY3QgYSBQVEUgYmF0Y2ggZm9yIGEgc2V0IG9mIGNvbnRpZ3VvdXMgc3dhcCBlbnRyaWVzXG5tbS9pbnRlcm5hbC5oLTUxMS0gKiBAc3RhcnRfcHRlcDogUGFnZSB0YWJsZSBwb2ludGVyIGZvciB0aGUgZmlyc3QgZW50cnkuXG4tLVxubW0vaW50ZXJuYWwuaC01MTQtICpcbm1tL2ludGVybmFsLmg6NTE1OiAqIERldGVjdCBhIGJhdGNoIG9mIGNvbnRpZ3VvdXMgc3dhcCBlbnRyaWVzOiBjb25zZWN1dGl2ZSAobm9uLXByZXNlbnQpIFBURXNcbm1tL2ludGVybmFsLmgtNTE2LSAqIGNvbnRhaW5pbmcgc3dhcCBlbnRyaWVzIGFsbCB3aXRoIGNvbnNlY3V0aXZlIG9mZnNldHMgYW5kIHRhcmdldGluZyB0aGUgc2FtZVxuLS1cbm1tL2tmZW5jZS9rZmVuY2VfdGVzdC5jPTQzNT1zdGF0aWMgdm9pZCB0ZXN0X2NvcnJ1cHRpb24oc3RydWN0IGt1bml0ICp0ZXN0KVxuLS1cbm1tL2tmZW5jZS9rZmVuY2VfdGVzdC5jLTQ2NS0gKiByZXNwZWN0aXZlbHkuIFRoZXJlZm9yZSBpdCBpcyBpbXBvc3NpYmxlIGZvciB0aGUgYWxsb2NhdGVkIG9iamVjdCB0b1xubW0va2ZlbmNlL2tmZW5jZV90ZXN0LmM6NDY2OiAqIGNvbnRpZ3VvdXNseSBsaW5lIHVwIHdpdGggdGhlIHJpZ2h0IGd1YXJkIHBhZ2UuXG5tbS9rZmVuY2Uva2ZlbmNlX3Rlc3QuYy00NjctICpcbi0tXG5tbS9rbXNhbi9jb3JlLmM9ODA9dm9pZCBrbXNhbl9pbnRlcm5hbF9tZW1tb3ZlX21ldGFkYXRhKHZvaWQgKmRzdCwgdm9pZCAqc3JjLCBzaXplX3Qgbilcbi0tXG5tbS9rbXNhbi9jb3JlLmMtOTItXHRcdHJldHVybjtcbm1tL2ttc2FuL2NvcmUuYzo5MzpcdEtNU0FOX1dBUk5fT04oIWttc2FuX21ldGFkYXRhX2lzX2NvbnRpZ3VvdXMoZHN0LCBuKSk7XG5tbS9rbXNhbi9jb3JlLmMtOTQtXHRhbGlnbl9zaGFkb3dfZHN0ID1cbi0tXG5tbS9rbXNhbi9jb3JlLmMtMTAyLVx0fVxubW0va21zYW4vY29yZS5jOjEwMzpcdEtNU0FOX1dBUk5fT04oIWttc2FuX21ldGFkYXRhX2lzX2NvbnRpZ3VvdXMoc3JjLCBuKSk7XG5tbS9rbXNhbi9jb3JlLmMtMTA0LVxuLS1cbm1tL2ttc2FuL2NvcmUuYz0xOTE9dm9pZCBrbXNhbl9pbnRlcm5hbF9zZXRfc2hhZG93X29yaWdpbih2b2lkICphZGRyLCBzaXplX3Qgc2l6ZSwgaW50IGIsXG4tLVxubW0va21zYW4vY29yZS5jLTE5OC1cbm1tL2ttc2FuL2NvcmUuYzoxOTk6XHRLTVNBTl9XQVJOX09OKCFrbXNhbl9tZXRhZGF0YV9pc19jb250aWd1b3VzKGFkZHIsIHNpemUpKTtcbm1tL2ttc2FuL2NvcmUuYy0yMDAtXHRzaGFkb3dfc3RhcnQgPSBrbXNhbl9nZXRfbWV0YWRhdGEoYWRkciwgS01TQU5fTUVUQV9TSEFET1cpO1xuLS1cbm1tL2ttc2FuL2NvcmUuYy0yMDItXHRcdC8qXG5tbS9rbXNhbi9jb3JlLmM6MjAzOlx0XHQgKiBrbXNhbl9tZXRhZGF0YV9pc19jb250aWd1b3VzKCkgaXMgdHJ1ZSwgc28gZWl0aGVyIGFsbCBzaGFkb3dcbm1tL2ttc2FuL2NvcmUuYy0yMDQtXHRcdCAqIGFuZCBvcmlnaW4gcGFnZXMgYXJlIE5VTEwsIG9yIGFsbCBhcmUgbm9uLU5VTEwuXG4tLVxubW0va21zYW4vY29yZS5jPTI1Mz12b2lkIGttc2FuX2ludGVybmFsX2NoZWNrX21lbW9yeSh2b2lkICphZGRyLCBzaXplX3Qgc2l6ZSxcbi0tXG5tbS9rbXNhbi9jb3JlLmMtMjY1LVx0XHRyZXR1cm47XG5tbS9rbXNhbi9jb3JlLmM6MjY2Olx0S01TQU5fV0FSTl9PTigha21zYW5fbWV0YWRhdGFfaXNfY29udGlndW91cyhhZGRyLCBzaXplKSk7XG5tbS9rbXNhbi9jb3JlLmMtMjY3LVx0d2hpbGUgKHBvcyBcdTAwM2Mgc2l6ZSkge1xuLS1cbm1tL2ttc2FuL2NvcmUuYy0zMjgtXG5tbS9rbXNhbi9jb3JlLmM6MzI5OmJvb2wga21zYW5fbWV0YWRhdGFfaXNfY29udGlndW91cyh2b2lkICphZGRyLCBzaXplX3Qgc2l6ZSlcbm1tL2ttc2FuL2NvcmUuYy0zMzAte1xuLS1cbm1tL2ttc2FuL2ttc2FuLmg9MTYyPXZvaWQga21zYW5faW50ZXJuYWxfdGFza19jcmVhdGUoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKTtcbm1tL2ttc2FuL2ttc2FuLmgtMTYzLVxubW0va21zYW4va21zYW4uaDoxNjQ6Ym9vbCBrbXNhbl9tZXRhZGF0YV9pc19jb250aWd1b3VzKHZvaWQgKmFkZHIsIHNpemVfdCBzaXplKTtcbm1tL2ttc2FuL2ttc2FuLmgtMTY1LXZvaWQga21zYW5faW50ZXJuYWxfY2hlY2tfbWVtb3J5KHZvaWQgKmFkZHIsIHNpemVfdCBzaXplLFxuLS1cbm1tL2ttc2FuL3NoYWRvdy5jPTgyPXN0cnVjdCBzaGFkb3dfb3JpZ2luX3B0ciBrbXNhbl9nZXRfc2hhZG93X29yaWdpbl9wdHIodm9pZCAqYWRkcmVzcywgdTY0IHNpemUsXG4tLVxubW0va21zYW4vc2hhZG93LmMtOTYtXG5tbS9rbXNhbi9zaGFkb3cuYzo5NzpcdEtNU0FOX1dBUk5fT04oIWttc2FuX21ldGFkYXRhX2lzX2NvbnRpZ3VvdXMoYWRkcmVzcywgc2l6ZSkpO1xubW0va21zYW4vc2hhZG93LmMtOTgtXHRzaGFkb3cgPSBrbXNhbl9nZXRfbWV0YWRhdGEoYWRkcmVzcywgS01TQU5fTUVUQV9TSEFET1cpO1xuLS1cbm1tL2ttc2FuL3NoYWRvdy5jPTE3MT12b2lkIGttc2FuX2FsbG9jX3BhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UsIHVuc2lnbmVkIGludCBvcmRlciwgZ2ZwX3QgZmxhZ3MpXG4tLVxubW0va21zYW4vc2hhZG93LmMtMTk4LVx0Lypcbm1tL2ttc2FuL3NoYWRvdy5jOjE5OTpcdCAqIEFkZHJlc3NlcyBhcmUgcGFnZS1hbGlnbmVkLCBwYWdlcyBhcmUgY29udGlndW91cywgc28gaXQmIzM5O3Mgb2tcbm1tL2ttc2FuL3NoYWRvdy5jLTIwMC1cdCAqIHRvIGp1c3QgZmlsbCB0aGUgb3JpZ2luIHBhZ2VzIHdpdGggQGhhbmRsZS5cbi0tXG5tbS9tZW1ibG9jay5jLTQ5LSAqXG5tbS9tZW1ibG9jay5jOjUwOiAqIE1lbWJsb2NrIHZpZXdzIHRoZSBzeXN0ZW0gbWVtb3J5IGFzIGNvbGxlY3Rpb25zIG9mIGNvbnRpZ3VvdXNcbm1tL21lbWJsb2NrLmMtNTEtICogcmVnaW9ucy4gVGhlcmUgYXJlIHNldmVyYWwgdHlwZXMgb2YgdGhlc2UgY29sbGVjdGlvbnM6XG4tLVxubW0vbWVtb3J5LmM9NDcxOT1zdGF0aWMgdm1fZmF1bHRfdCBoYW5kbGVfcHRlX21hcmtlcihzdHJ1Y3Qgdm1fZmF1bHQgKnZtZilcbi0tXG5tbS9tZW1vcnkuYy00NzQ3LS8qXG5tbS9tZW1vcnkuYzo0NzQ4OiAqIENoZWNrIGlmIHRoZSBQVEVzIHdpdGhpbiBhIHJhbmdlIGFyZSBjb250aWd1b3VzIHN3YXAgZW50cmllcy5cbm1tL21lbW9yeS5jLTQ3NDktICovXG4tLVxubW0vbWVtb3J5LmM9NDc5NT1zdGF0aWMgdW5zaWduZWQgbG9uZyB0aHBfc3dhcGluX3N1aXRhYmxlX29yZGVycyhzdHJ1Y3Qgdm1fZmF1bHQgKnZtZilcbi0tXG5tbS9tZW1vcnkuYy00ODQwLVx0ICogRm9yIGRvX3N3YXBfcGFnZSwgZmluZCB0aGUgaGlnaGVzdCBvcmRlciB3aGVyZSB0aGUgYWxpZ25lZCByYW5nZSBpc1xubW0vbWVtb3J5LmM6NDg0MTpcdCAqIGNvbXBsZXRlbHkgc3dhcCBlbnRyaWVzIHdpdGggY29udGlndW91cyBzd2FwIG9mZnNldHMuXG5tbS9tZW1vcnkuYy00ODQyLVx0ICovXG4tLVxubW0vbWVtb3J5X2hvdHBsdWcuYz0xNTQ9c3RhdGljIGludCBnZXRfb25saW5lX3BvbGljeShjaGFyICpidWZmZXIsIGNvbnN0IHN0cnVjdCBrZXJuZWxfcGFyYW0gKmtwKVxuLS1cbm1tL21lbW9yeV9ob3RwbHVnLmMtMTYyLSAqXG5tbS9tZW1vcnlfaG90cGx1Zy5jOjE2MzogKiBcJiMzNDtjb250aWctem9uZXNcJiMzNDs6IGtlZXAgem9uZSBjb250aWd1b3VzXG5tbS9tZW1vcnlfaG90cGx1Zy5jLTE2NC0gKiBcJiMzNDthdXRvLW1vdmFibGVcJiMzNDs6IG9ubGluZSBtZW1vcnkgdG8gWk9ORV9NT1ZBQkxFIGlmIHRoZSBjb25maWd1cmF0aW9uXG4tLVxubW0vbWVtcG9saWN5LmM9MjU0Nj1zdHJ1Y3QgcGFnZSAqYWxsb2NfZnJvemVuX3BhZ2VzX25vcHJvZihnZnBfdCBnZnAsIHVuc2lnbmVkIG9yZGVyKVxuLS1cbm1tL21lbXBvbGljeS5jLTI1NjUtICpcbm1tL21lbXBvbGljeS5jOjI1NjY6ICogQWxsb2NhdGUgMSBcdTAwM2NcdTAwM2MgQG9yZGVyIGNvbnRpZ3VvdXMgcGFnZXMuICBUaGUgcGh5c2ljYWwgYWRkcmVzcyBvZiB0aGVcbm1tL21lbXBvbGljeS5jLTI1NjctICogZmlyc3QgcGFnZSBpcyBuYXR1cmFsbHkgYWxpZ25lZCAoZWcgYW4gb3JkZXItMyBhbGxvY2F0aW9uIHdpbGwgYmUgYWxpZ25lZFxuLS1cbm1tL21pZ3JhdGVfZGV2aWNlLmM9MTQ0OD1FWFBPUlRfU1lNQk9MKG1pZ3JhdGVfZGV2aWNlX3JhbmdlKTtcbi0tXG5tbS9taWdyYXRlX2RldmljZS5jLTE0NTQtICpcbm1tL21pZ3JhdGVfZGV2aWNlLmM6MTQ1NTogKiBTaW1pbGFyIHRvIG1pZ3JhdGVfZGV2aWNlX3JhbmdlKCkgYnV0IHN1cHBvcnRzIG5vbi1jb250aWd1b3VzIHByZS1wb3B1bGF0ZWRcbm1tL21pZ3JhdGVfZGV2aWNlLmMtMTQ1Ni0gKiBhcnJheSBvZiBkZXZpY2UgcGFnZXMgdG8gbWlncmF0ZS5cbi0tXG5tbS9tbV9pbml0LmM9NzkyPXZvaWQgX19tZW1pbml0IGluaXRfZGVmZXJyZWRfcGFnZSh1bnNpZ25lZCBsb25nIHBmbiwgaW50IG5pZClcbi0tXG5tbS9tbV9pbml0LmMtODA2LSAqIC0gZWFybHkgcmVzZXJ2ZWQgbWVtb3J5IG1heSBub3QgYmUgbGlzdGVkIGluIG1lbWJsb2NrLm1lbW9yeVxubW0vbW1faW5pdC5jOjgwNzogKiAtIG5vbi1tZW1vcnkgcmVnaW9ucyBjb3ZlcmVkIGJ5IHRoZSBjb250aWd1b3VzIGZsYXRtZW0gbWFwcGluZ1xubW0vbW1faW5pdC5jLTgwOC0gKiAtIG1lbW9yeSBsYXlvdXRzIGRlZmluZWQgd2l0aCBtZW1tYXA9IGtlcm5lbCBwYXJhbWV0ZXIgbWF5IG5vdCBhbGlnblxuLS1cbm1tL21tX2luaXQuYz0xNDY2PXN0YXRpYyB2b2lkIF9faW5pdCBzZXRfcGFnZWJsb2NrX29yZGVyKHZvaWQpXG4tLVxubW0vbW1faW5pdC5jLTE0NzgtXHQvKlxubW0vbW1faW5pdC5jOjE0Nzk6XHQgKiBBc3N1bWUgdGhlIGxhcmdlc3QgY29udGlndW91cyBvcmRlciBvZiBpbnRlcmVzdCBpcyBhIGh1Z2UgcGFnZS5cbm1tL21tX2luaXQuYy0xNDgwLVx0ICogVGhpcyB2YWx1ZSBtYXkgYmUgdmFyaWFibGUgZGVwZW5kaW5nIG9uIGJvb3QgcGFyYW1ldGVycyBvbiBwb3dlcnBjLlxuLS1cbm1tL21tX2luaXQuYz0yMjQ2PXZvaWQgX19pbml0IHBhZ2VfYWxsb2NfaW5pdF9sYXRlKHZvaWQpXG4tLVxubW0vbW1faW5pdC5jLTIyODMtXHRmb3JfZWFjaF9wb3B1bGF0ZWRfem9uZSh6b25lKVxubW0vbW1faW5pdC5jOjIyODQ6XHRcdHNldF96b25lX2NvbnRpZ3VvdXMoem9uZSk7XG5tbS9tbV9pbml0LmMtMjI4NS1cbi0tXG5tbS9tbV9pbml0LmM9MjY1MD12b2lkIF9faW5pdCBtbV9jb3JlX2luaXQodm9pZClcbi0tXG5tbS9tbV9pbml0LmMtMjY2MC1cdC8qXG5tbS9tbV9pbml0LmM6MjY2MTpcdCAqIHBhZ2VfZXh0IHJlcXVpcmVzIGNvbnRpZ3VvdXMgcGFnZXMsXG5tbS9tbV9pbml0LmMtMjY2Mi1cdCAqIGJpZ2dlciB0aGFuIE1BWF9QQUdFX09SREVSIHVubGVzcyBTUEFSU0VNRU0uXG4tLVxubW0vbm9tbXUuYz0xNzg9bG9uZyB2cmVhZF9pdGVyKHN0cnVjdCBpb3ZfaXRlciAqaXRlciwgY29uc3QgY2hhciAqYWRkciwgc2l6ZV90IGNvdW50KVxuLS1cbm1tL25vbW11LmMtMTg3LS8qXG5tbS9ub21tdS5jOjE4ODogKlx0dm1hbGxvYyAgLSAgYWxsb2NhdGUgdmlydHVhbGx5IGNvbnRpZ3VvdXMgbWVtb3J5XG5tbS9ub21tdS5jLTE4OS0gKlxuLS1cbm1tL25vbW11LmMtMTkyLSAqXHRBbGxvY2F0ZSBlbm91Z2ggcGFnZXMgdG8gY292ZXIgQHNpemUgZnJvbSB0aGUgcGFnZSBsZXZlbFxubW0vbm9tbXUuYzoxOTM6ICpcdGFsbG9jYXRvciBhbmQgbWFwIHRoZW0gaW50byBjb250aWd1b3VzIGtlcm5lbCB2aXJ0dWFsIHNwYWNlLlxubW0vbm9tbXUuYy0xOTQtICpcbi0tXG5tbS9ub21tdS5jPTIwMj1FWFBPUlRfU1lNQk9MKHZtYWxsb2Nfbm9wcm9mKTtcbi0tXG5tbS9ub21tdS5jLTIwNC0vKlxubW0vbm9tbXUuYzoyMDU6ICpcdHZtYWxsb2NfaHVnZV9ub2RlICAtICBhbGxvY2F0ZSB2aXJ0dWFsbHkgY29udGlndW91cyBtZW1vcnksIG9uIGEgbm9kZVxubW0vbm9tbXUuYy0yMDYtICpcbi0tXG5tbS9ub21tdS5jLTIxMS0gKlx0QWxsb2NhdGUgZW5vdWdoIHBhZ2VzIHRvIGNvdmVyIEBzaXplIGZyb20gdGhlIHBhZ2UgbGV2ZWxcbm1tL25vbW11LmM6MjEyOiAqXHRhbGxvY2F0b3IgYW5kIG1hcCB0aGVtIGludG8gY29udGlndW91cyBrZXJuZWwgdmlydHVhbCBzcGFjZS5cbm1tL25vbW11LmMtMjEzLSAqXG4tLVxubW0vbm9tbXUuYz0yMTc9dm9pZCAqdm1hbGxvY19odWdlX25vZGVfbm9wcm9mKHVuc2lnbmVkIGxvbmcgc2l6ZSwgZ2ZwX3QgZ2ZwX21hc2ssIGludCBub2RlKVxuLS1cbm1tL25vbW11LmMtMjIyLS8qXG5tbS9ub21tdS5jOjIyMzogKlx0dnphbGxvYyAtIGFsbG9jYXRlIHZpcnR1YWxseSBjb250aWd1b3VzIG1lbW9yeSB3aXRoIHplcm8gZmlsbFxubW0vbm9tbXUuYy0yMjQtICpcbi0tXG5tbS9ub21tdS5jLTIyNy0gKlx0QWxsb2NhdGUgZW5vdWdoIHBhZ2VzIHRvIGNvdmVyIEBzaXplIGZyb20gdGhlIHBhZ2UgbGV2ZWxcbm1tL25vbW11LmM6MjI4OiAqXHRhbGxvY2F0b3IgYW5kIG1hcCB0aGVtIGludG8gY29udGlndW91cyBrZXJuZWwgdmlydHVhbCBzcGFjZS5cbm1tL25vbW11LmMtMjI5LSAqXHRUaGUgbWVtb3J5IGFsbG9jYXRlZCBpcyBzZXQgdG8gemVyby5cbi0tXG5tbS9ub21tdS5jPTIzOD1FWFBPUlRfU1lNQk9MKHZ6YWxsb2Nfbm9wcm9mKTtcbi0tXG5tbS9ub21tdS5jLTI0NS0gKiBBbGxvY2F0ZSBlbm91Z2ggcGFnZXMgdG8gY292ZXIgQHNpemUgZnJvbSB0aGUgcGFnZSBsZXZlbFxubW0vbm9tbXUuYzoyNDY6ICogYWxsb2NhdG9yIGFuZCBtYXAgdGhlbSBpbnRvIGNvbnRpZ3VvdXMga2VybmVsIHZpcnR1YWwgc3BhY2UuXG5tbS9ub21tdS5jLTI0Ny0gKlxuLS1cbm1tL25vbW11LmM9MjU1PUVYUE9SVF9TWU1CT0wodm1hbGxvY19ub2RlX25vcHJvZik7XG4tLVxubW0vbm9tbXUuYy0yNjItICogQWxsb2NhdGUgZW5vdWdoIHBhZ2VzIHRvIGNvdmVyIEBzaXplIGZyb20gdGhlIHBhZ2UgbGV2ZWxcbm1tL25vbW11LmM6MjYzOiAqIGFsbG9jYXRvciBhbmQgbWFwIHRoZW0gaW50byBjb250aWd1b3VzIGtlcm5lbCB2aXJ0dWFsIHNwYWNlLlxubW0vbm9tbXUuYy0yNjQtICogVGhlIG1lbW9yeSBhbGxvY2F0ZWQgaXMgc2V0IHRvIHplcm8uXG4tLVxubW0vbm9tbXUuYz0yNzM9RVhQT1JUX1NZTUJPTCh2emFsbG9jX25vZGVfbm9wcm9mKTtcbi0tXG5tbS9ub21tdS5jLTI3NS0vKipcbm1tL25vbW11LmM6Mjc2OiAqIHZtYWxsb2NfMzIgIC0gIGFsbG9jYXRlIHZpcnR1YWxseSBjb250aWd1b3VzIG1lbW9yeSAoMzJiaXQgYWRkcmVzc2FibGUpXG5tbS9ub21tdS5jLTI3Ny0gKlx0QHNpemU6XHRcdGFsbG9jYXRpb24gc2l6ZVxuLS1cbm1tL25vbW11LmMtMjc5LSAqXHRBbGxvY2F0ZSBlbm91Z2ggMzJiaXQgUEEgYWRkcmVzc2FibGUgcGFnZXMgdG8gY292ZXIgQHNpemUgZnJvbSB0aGVcbm1tL25vbW11LmM6MjgwOiAqXHRwYWdlIGxldmVsIGFsbG9jYXRvciBhbmQgbWFwIHRoZW0gaW50byBjb250aWd1b3VzIGtlcm5lbCB2aXJ0dWFsIHNwYWNlLlxubW0vbm9tbXUuYy0yODEtICovXG4tLVxubW0vbm9tbXUuYz0yODY9RVhQT1JUX1NZTUJPTCh2bWFsbG9jXzMyX25vcHJvZik7XG4tLVxubW0vbm9tbXUuYy0yODgtLyoqXG5tbS9ub21tdS5jOjI4OTogKiB2bWFsbG9jXzMyX3VzZXIgLSBhbGxvY2F0ZSB6ZXJvZWQgdmlydHVhbGx5IGNvbnRpZ3VvdXMgMzJiaXQgbWVtb3J5XG5tbS9ub21tdS5jLTI5MC0gKlx0QHNpemU6XHRcdGFsbG9jYXRpb24gc2l6ZVxuLS1cbm1tL25vbW11LmM9NTAyPXN0YXRpYyB2b2lkIGRlbGV0ZV9ub21tdV9yZWdpb24oc3RydWN0IHZtX3JlZ2lvbiAqcmVnaW9uKVxuLS1cbm1tL25vbW11LmMtNTExLS8qXG5tbS9ub21tdS5jOjUxMjogKiBmcmVlIGEgY29udGlndW91cyBzZXJpZXMgb2YgcGFnZXNcbm1tL25vbW11LmMtNTEzLSAqL1xuLS1cbm1tL3BhZ2VfYWxsb2MuYy0xMC0gKiAgUmVzaGFwZWQgaXQgdG8gYmUgYSB6b25lZCBhbGxvY2F0b3IsIEluZ28gTW9sbmFyLCBSZWQgSGF0LCAxOTk5XG5tbS9wYWdlX2FsbG9jLmM6MTE6ICogIERpc2NvbnRpZ3VvdXMgbWVtb3J5IHN1cHBvcnQsIEthbm9qIFNhcmNhciwgU0dJLCBOb3YgMTk5OVxubW0vcGFnZV9hbGxvYy5jLTEyLSAqICBab25lIGJhbGFuY2luZywgS2Fub2ogU2FyY2FyLCBTR0ksIEphbiAyMDAwXG4tLVxubW0vcGFnZV9hbGxvYy5jPTIyMTc9c3RhdGljIGJvb2wgc2hvdWxkX3RyeV9jbGFpbV9ibG9jayh1bnNpZ25lZCBpbnQgb3JkZXIsIGludCBzdGFydF9tdClcbi0tXG5tbS9wYWdlX2FsbG9jLmMtMjI1Mi1cdCAqIHJlY2xhaW1hYmxlIHBhZ2VzIHRoYXQgYXJlIGNsb3Nlc3QgdG8gdGhlIHJlcXVlc3Qgc2l6ZS4gQWZ0ZXIgYVxubW0vcGFnZV9hbGxvYy5jOjIyNTM6XHQgKiB3aGlsZSwgbWVtb3J5IGNvbXBhY3Rpb24gbWF5IG9jY3VyIHRvIGZvcm0gbGFyZ2UgY29udGlndW91cyBwYWdlcyxcbm1tL3BhZ2VfYWxsb2MuYy0yMjU0LVx0ICogYW5kIHRoZSBuZXh0IG1vdmFibGUgYWxsb2NhdGlvbiBtYXkgbm90IG5lZWQgdG8gc3RlYWwuXG4tLVxubW0vcGFnZV9hbGxvYy5jPTUzMDA9RVhQT1JUX1NZTUJPTF9HUEwoYWxsb2NfcGFnZXNfYnVsa19ub3Byb2YpO1xuLS1cbm1tL3BhZ2VfYWxsb2MuYy01MzA2LSAqXG5tbS9wYWdlX2FsbG9jLmM6NTMwNzogKiBGcmVlIHRoZSBvcmRlci0wIHBhZ2VzLiBBZGphY2VudCBlbnRyaWVzIHdob3NlIFBGTnMgZm9ybSBhIGNvbnRpZ3VvdXNcbm1tL3BhZ2VfYWxsb2MuYy01MzA4LSAqIHJ1biBhcmUgcmVsZWFzZWQgd2l0aCBhIHNpbmdsZSBfX2ZyZWVfY29udGlnX3JhbmdlKCkgY2FsbC5cbi0tXG5tbS9wYWdlX2FsbG9jLmMtNTMxMC0gKiBUaGlzIGFzc3VtZXMgcGFnZV9hcnJheSBpcyBzb3J0ZWQgaW4gYXNjZW5kaW5nIFBGTiBvcmRlci4gV2l0aG91dCB0aGF0LFxubW0vcGFnZV9hbGxvYy5jOjUzMTE6ICogdGhlIGZ1bmN0aW9uIHN0aWxsIGZyZWVzIGFsbCBwYWdlcywgYnV0IGNvbnRpZ3VvdXMgcnVucyBtYXkgbm90IGJlXG5tbS9wYWdlX2FsbG9jLmMtNTMxMi0gKiBkZXRlY3RlZCBhbmQgdGhlIGZyZWVpbmcgcGF0dGVybiBjYW4gZGVncmFkZSB0byBmcmVlaW5nIG9uZSBwYWdlIGF0IGFcbi0tXG5tbS9wYWdlX2FsbG9jLmM9NTMxNz12b2lkIGZyZWVfcGFnZXNfYnVsayhzdHJ1Y3QgcGFnZSAqKnBhZ2VfYXJyYXksIHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMpXG4tLVxubW0vcGFnZV9hbGxvYy5jLTUzMTktXHR3aGlsZSAobnJfcGFnZXMpIHtcbm1tL3BhZ2VfYWxsb2MuYzo1MzIwOlx0XHR1bnNpZ25lZCBsb25nIG5yX2NvbnRpZyA9IG51bV9wYWdlc19jb250aWd1b3VzKHBhZ2VfYXJyYXksIG5yX3BhZ2VzKTtcbm1tL3BhZ2VfYWxsb2MuYy01MzIxLVxuLS1cbm1tL3BhZ2VfYWxsb2MuYz01NTk5PXN0YXRpYyB2b2lkICptYWtlX2FsbG9jX2V4YWN0KHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgaW50IG9yZGVyLFxuLS1cbm1tL3BhZ2VfYWxsb2MuYy01NjE4LS8qKlxubW0vcGFnZV9hbGxvYy5jOjU2MTk6ICogYWxsb2NfcGFnZXNfZXhhY3QgLSBhbGxvY2F0ZSBhbiBleGFjdCBudW1iZXIgcGh5c2ljYWxseS1jb250aWd1b3VzIHBhZ2VzLlxubW0vcGFnZV9hbGxvYy5jLTU2MjAtICogQHNpemU6IHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gYWxsb2NhdGVcbi0tXG5tbS9wYWdlX2FsbG9jLmM9NTY0ND1FWFBPUlRfU1lNQk9MKGFsbG9jX3BhZ2VzX2V4YWN0X25vcHJvZik7XG4tLVxubW0vcGFnZV9hbGxvYy5jLTU2NDYtLyoqXG5tbS9wYWdlX2FsbG9jLmM6NTY0NzogKiBhbGxvY19wYWdlc19leGFjdF9uaWQgLSBhbGxvY2F0ZSBhbiBleGFjdCBudW1iZXIgb2YgcGh5c2ljYWxseS1jb250aWd1b3VzXG5tbS9wYWdlX2FsbG9jLmMtNTY0OC0gKlx0XHRcdCAgIHBhZ2VzIG9uIGEgbm9kZS5cbi0tXG5tbS9wYWdlX2FsbG9jLmM9NjEyMD1zdGF0aWMgaW50IHpvbmVfYmF0Y2hzaXplKHN0cnVjdCB6b25lICp6b25lKVxuLS1cbm1tL3BhZ2VfYWxsb2MuYy02MTUzLVx0ICogVGhlIHByb2JsZW0gaXMgdGhhdCBOT01NVSBuZWVkcyB0byBiZSBhYmxlIHRvIGFsbG9jYXRlIGxhcmdlIGNodW5rc1xubW0vcGFnZV9hbGxvYy5jOjYxNTQ6XHQgKiBvZiBjb250aWd1b3VzIG1lbW9yeSBhcyB0aGVyZSYjMzk7cyBubyBoYXJkd2FyZSBwYWdlIHRyYW5zbGF0aW9uIHRvXG5tbS9wYWdlX2FsbG9jLmM6NjE1NTpcdCAqIGFzc2VtYmxlIGFwcGFyZW50IGNvbnRpZ3VvdXMgbWVtb3J5IGZyb20gZGlzY29udGlndW91cyBwYWdlcy5cbm1tL3BhZ2VfYWxsb2MuYy02MTU2LVx0ICpcbm1tL3BhZ2VfYWxsb2MuYzo2MTU3Olx0ICogUXVldWVpbmcgbGFyZ2UgY29udGlndW91cyBydW5zIG9mIHBhZ2VzIGZvciBiYXRjaGluZywgaG93ZXZlcixcbm1tL3BhZ2VfYWxsb2MuYy02MTU4LVx0ICogY2F1c2VzIHRoZSBwYWdlcyB0byBhY3R1YWxseSBiZSBmcmVlZCBpbiBzbWFsbGVyIGNodW5rcy4gIEFzIHRoZXJlXG4tLVxubW0vcGFnZV9hbGxvYy5jPTcwNDc9c3RhdGljIHZvaWQgX19mcmVlX2NvbnRpZ19yYW5nZV9jb21tb24odW5zaWduZWQgbG9uZyBwZm4sIHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMsXG4tLVxubW0vcGFnZV9hbGxvYy5jLTcwNTgtXHRcdC8qXG5tbS9wYWdlX2FsbG9jLmM6NzA1OTpcdFx0ICogQ29udGlndW91cyBQRk5zIG1pZ2h0IG5vdCBoYXZlIGNvbnRpZ3VvdXMgXCYjMzQ7c3RydWN0IHBhZ2VzXCYjMzQ7XG5tbS9wYWdlX2FsbG9jLmMtNzA2MC1cdFx0ICogaW4gc29tZSBrZXJuZWwgY29uZmlnczogcGFnZSYjNDM7JiM0MzsgYWNyb3NzIGEgc2VjdGlvbiBib3VuZGFyeVxuLS1cbm1tL3BhZ2VfYWxsb2MuYy03MDk4LS8qKlxubW0vcGFnZV9hbGxvYy5jOjcwOTk6ICogX19mcmVlX2NvbnRpZ19yYW5nZSAtIEZyZWUgY29udGlndW91cyByYW5nZSBvZiBvcmRlci0wIHBhZ2VzLlxubW0vcGFnZV9hbGxvYy5jLTcxMDAtICogQHBmbjogUGFnZSBmcmFtZSBudW1iZXIgb2YgdGhlIGZpcnN0IHBhZ2UgaW4gdGhlIHJhbmdlLlxuLS1cbm1tL3BhZ2VfYWxsb2MuYy03MTAyLSAqXG5tbS9wYWdlX2FsbG9jLmM6NzEwMzogKiBGb3IgZWFjaCBvcmRlci0wIHN0cnVjdCBwYWdlIGluIHRoZSBwaHlzaWNhbGx5IGNvbnRpZ3VvdXMgcmFuZ2UsIHB1dCBhXG5tbS9wYWdlX2FsbG9jLmMtNzEwNC0gKiByZWZlcmVuY2UuIEZyZWUgYW55IHBhZ2Ugd2hvJiMzOTtzIHJlZmVyZW5jZSBjb3VudCBmYWxscyB0byB6ZXJvLiBUaGVcbi0tXG5tbS9wYWdlX2FsbG9jLmMtNzEwOC0gKiBNZW1vcnkgYWxsb2NhdGVkIHdpdGggYWxsb2NfcGFnZXMob3JkZXJcdTAwM2U9MSkgdGhlbiBzdWJzZXF1ZW50bHkgc3BsaXQgdG9cbm1tL3BhZ2VfYWxsb2MuYzo3MTA5OiAqIG9yZGVyLTAgd2l0aCBzcGxpdF9wYWdlKCkgaXMgYW4gZXhhbXBsZSBvZiBhcHByb3ByaWF0ZSBjb250aWd1b3VzIHBhZ2VzIHRoYXRcbm1tL3BhZ2VfYWxsb2MuYy03MTEwLSAqIGNhbiBiZSBmcmVlZCB3aXRoIHRoaXMgQVBJLlxuLS1cbm1tL3BhZ2VfYWxsb2MuYz03NDU2PXN0YXRpYyBib29sIHBmbl9yYW5nZV92YWxpZF9jb250aWcoc3RydWN0IHpvbmUgKnosIHVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuLFxuLS1cbm1tL3BhZ2VfYWxsb2MuYy03NDc3LVx0XHQgKiBPbmx5IGNvbnNpZGVyIHJhbmdlcyBjb250YWluaW5nIGh1Z2VwYWdlcyBpZiB0aG9zZSBwYWdlcyBhcmVcbm1tL3BhZ2VfYWxsb2MuYzo3NDc4Olx0XHQgKiBzbWFsbGVyIHRoYW4gdGhlIHJlcXVlc3RlZCBjb250aWd1b3VzIHJlZ2lvbi4gIGUuZy46XG5tbS9wYWdlX2FsbG9jLmMtNzQ3OS1cdFx0ICogICAgIE1vdmUgMk1CIHBhZ2VzIHRvIGZyZWUgdXAgYSAxR0IgcmFuZ2UuXG4tLVxubW0vcGFnZV9hbGxvYy5jLTc0ODEtXHRcdCAqXG5tbS9wYWdlX2FsbG9jLmM6NzQ4MjpcdFx0ICogVGhpcyBtYWtlcyBjb250aWd1b3VzIGFsbG9jYXRpb24gbW9yZSByZWxpYWJsZSBpZiBtdWx0aXBsZVxubW0vcGFnZV9hbGxvYy5jLTc0ODMtXHRcdCAqIGh1Z2VwYWdlIHNpemVzIGFyZSB1c2VkIHdpdGhvdXQgY2F1c2luZyBuZWVkbGVzcyBtb3ZlbWVudC5cbi0tXG5tbS9wYWdlX2FsbG9jLmM9NzUwNT1zdGF0aWMgYm9vbCB6b25lX3NwYW5zX2xhc3RfcGZuKGNvbnN0IHN0cnVjdCB6b25lICp6b25lLFxuLS1cbm1tL3BhZ2VfYWxsb2MuYy03NTEzLS8qKlxubW0vcGFnZV9hbGxvYy5jOjc1MTQ6ICogYWxsb2NfY29udGlnX2Zyb3plbl9wYWdlcygpIC0tIHRyaWVzIHRvIGZpbmQgYW5kIGFsbG9jYXRlIGNvbnRpZ3VvdXMgcmFuZ2Ugb2YgZnJvemVuIHBhZ2VzXG5tbS9wYWdlX2FsbG9jLmM6NzUxNTogKiBAbnJfcGFnZXM6XHROdW1iZXIgb2YgY29udGlndW91cyBwYWdlcyB0byBhbGxvY2F0ZVxubW0vcGFnZV9hbGxvYy5jLTc1MTYtICogQGdmcF9tYXNrOlx0R0ZQIG1hc2suIE5vZGUvem9uZS9wbGFjZW1lbnQgaGludHMgbGltaXQgdGhlIHNlYXJjaDsgb25seSBzb21lXG4tLVxubW0vcGFnZV9hbGxvYy5jLTc1MjItICogVGhpcyByb3V0aW5lIGlzIGEgd3JhcHBlciBhcm91bmQgYWxsb2NfY29udGlnX2Zyb3plbl9yYW5nZSgpLiBJdCBzY2FucyBvdmVyXG5tbS9wYWdlX2FsbG9jLmM6NzUyMzogKiB6b25lcyBvbiBhbiBhcHBsaWNhYmxlIHpvbmVsaXN0IHRvIGZpbmQgYSBjb250aWd1b3VzIHBmbiByYW5nZSB3aGljaCBjYW4gdGhlblxubW0vcGFnZV9hbGxvYy5jLTc1MjQtICogYmUgdHJpZWQgZm9yIGFsbG9jYXRpb24gd2l0aCBhbGxvY19jb250aWdfZnJvemVuX3JhbmdlKCkuIFRoaXMgcm91dGluZSBpc1xuLS1cbm1tL3BhZ2VfYWxsb2MuYy03NTM2LSAqXG5tbS9wYWdlX2FsbG9jLmM6NzUzNzogKiBSZXR1cm46IHBvaW50ZXIgdG8gY29udGlndW91cyBmcm96ZW4gcGFnZXMgb24gc3VjY2Vzcywgb3IgTlVMTCBpZiBub3Qgc3VjY2Vzc2Z1bC5cbm1tL3BhZ2VfYWxsb2MuYy03NTM4LSAqL1xubW0vcGFnZV9hbGxvYy5jPTc1Mzk9c3RydWN0IHBhZ2UgKmFsbG9jX2NvbnRpZ19mcm96ZW5fcGFnZXNfbm9wcm9mKHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMsXG4tLVxubW0vcGFnZV9hbGxvYy5jLTc1ODQtXHQgKiBzZWNvbmQgcGFzcywgd2Ugd2lsbCB0cnkgbW92aW5nIEh1Z2VUTEIgcGFnZXMgd2hlbiB0aG9zZSBwYWdlcyBhcmVcbm1tL3BhZ2VfYWxsb2MuYzo3NTg1Olx0ICogc21hbGxlciB0aGFuIHRoZSByZXF1ZXN0ZWQgY29udGlndW91cyByZWdpb24gc2l6ZS5cbm1tL3BhZ2VfYWxsb2MuYy03NTg2LVx0ICovXG4tLVxubW0vcGFnZV9hbGxvYy5jPTc1OTM9RVhQT1JUX1NZTUJPTChhbGxvY19jb250aWdfZnJvemVuX3BhZ2VzX25vcHJvZik7XG4tLVxubW0vcGFnZV9hbGxvYy5jLTc1OTUtLyoqXG5tbS9wYWdlX2FsbG9jLmM6NzU5NjogKiBhbGxvY19jb250aWdfcGFnZXMoKSAtLSB0cmllcyB0byBmaW5kIGFuZCBhbGxvY2F0ZSBjb250aWd1b3VzIHJhbmdlIG9mIHBhZ2VzXG5tbS9wYWdlX2FsbG9jLmM6NzU5NzogKiBAbnJfcGFnZXM6XHROdW1iZXIgb2YgY29udGlndW91cyBwYWdlcyB0byBhbGxvY2F0ZVxubW0vcGFnZV9hbGxvYy5jLTc1OTgtICogQGdmcF9tYXNrOlx0R0ZQIG1hc2suXG4tLVxubW0vcGFnZV9hbGxvYy5jLTc2MDgtICpcbm1tL3BhZ2VfYWxsb2MuYzo3NjA5OiAqIFJldHVybjogcG9pbnRlciB0byBjb250aWd1b3VzIHBhZ2VzIG9uIHN1Y2Nlc3MsIG9yIE5VTEwgaWYgbm90IHN1Y2Nlc3NmdWwuXG5tbS9wYWdlX2FsbG9jLmMtNzYxMC0gKi9cbi0tXG5tbS9wYWdlX2FsbG9jLmM9NzYyNj1FWFBPUlRfU1lNQk9MKGFsbG9jX2NvbnRpZ19wYWdlc19ub3Byb2YpO1xuLS1cbm1tL3BhZ2VfYWxsb2MuYy03NjI4LS8qKlxubW0vcGFnZV9hbGxvYy5jOjc2Mjk6ICogZnJlZV9jb250aWdfZnJvemVuX3JhbmdlKCkgLS0gZnJlZSB0aGUgY29udGlndW91cyByYW5nZSBvZiBmcm96ZW4gcGFnZXNcbm1tL3BhZ2VfYWxsb2MuYy03NjMwLSAqIEBwZm46XHRzdGFydCBQRk4gdG8gZnJlZVxubW0vcGFnZV9hbGxvYy5jOjc2MzE6ICogQG5yX3BhZ2VzOlx0TnVtYmVyIG9mIGNvbnRpZ3VvdXMgZnJvemVuIHBhZ2VzIHRvIGZyZWVcbm1tL3BhZ2VfYWxsb2MuYy03NjMyLSAqXG4tLVxubW0vcGFnZV9hbGxvYy5jPTc2NTE9RVhQT1JUX1NZTUJPTChmcmVlX2NvbnRpZ19mcm96ZW5fcmFuZ2UpO1xuLS1cbm1tL3BhZ2VfYWxsb2MuYy03NjUzLS8qKlxubW0vcGFnZV9hbGxvYy5jOjc2NTQ6ICogZnJlZV9jb250aWdfcmFuZ2UoKSAtLSBmcmVlIHRoZSBjb250aWd1b3VzIHJhbmdlIG9mIHBhZ2VzXG5tbS9wYWdlX2FsbG9jLmMtNzY1NS0gKiBAcGZuOlx0c3RhcnQgUEZOIHRvIGZyZWVcbm1tL3BhZ2VfYWxsb2MuYzo3NjU2OiAqIEBucl9wYWdlczpcdE51bWJlciBvZiBjb250aWd1b3VzIHBhZ2VzIHRvIGZyZWVcbm1tL3BhZ2VfYWxsb2MuYy03NjU3LSAqXG4tLVxubW0vcGFnZV9hbGxvYy5oPTEzOD1zdGF0aWMgaW5saW5lIGJvb2wgcGFnZV9pc19idWRkeShzdHJ1Y3QgcGFnZSAqcGFnZSwgc3RydWN0IHBhZ2UgKmJ1ZGR5LFxuLS1cbm1tL3BhZ2VfYWxsb2MuaC0xNzMtICpcbm1tL3BhZ2VfYWxsb2MuaDoxNzQ6ICogQXNzdW1wdGlvbjogKl9tZW1fbWFwIGlzIGNvbnRpZ3VvdXMgYXQgbGVhc3QgdXAgdG8gTUFYX1BBR0VfT1JERVJcbm1tL3BhZ2VfYWxsb2MuaC0xNzUtICovXG4tLVxubW0vcGFnZV9hbGxvYy5oPTIxND1zdGF0aWMgaW5saW5lIHN0cnVjdCBwYWdlICpwYWdlYmxvY2tfcGZuX3RvX3BhZ2UodW5zaWduZWQgbG9uZyBzdGFydF9wZm4sXG4tLVxubW0vcGFnZV9hbGxvYy5oLTIxNi17XG5tbS9wYWdlX2FsbG9jLmg6MjE3Olx0aWYgKHpvbmVfaXNfY29udGlndW91cyh6b25lKSlcbm1tL3BhZ2VfYWxsb2MuaC0yMTgtXHRcdHJldHVybiBwZm5fdG9fcGFnZShzdGFydF9wZm4pO1xuXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NjUvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE0IDA3OjUyPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy44LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDIwNTA5CgkJCQkJCQlvdXRwdXQ6IDM3CgkJCQkJCQl0aG91Z2h0czogNDgKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgYW5hbHlzaXMgb2YgdGhlIHByb3ZpZGVkIGluZm9ybWF0aW9uOgoKKipVbmRlcnN0YW5kaW5nIHRoZSBDb250aWd1b3VzIFpvbmUgTWVjaGFuaXNtKioKCk9rYXksIHNvIEkmIzM5O20gbG9va2luZyBhdCBtZW1vcnkgbWFuYWdlbWVudCwgc3BlY2lmaWNhbGx5IGhvdyBjb250aWd1b3VzIG1lbW9yeSB6b25lcyBhcmUgaGFuZGxlZCB3aXRoaW4gdGhlIExpbnV4IGtlcm5lbC4gVGhlIGtleSBwb2ludCBoZXJlIGlzIHRoYXQgYHpvbmUtJmd0O2NvbnRpZ3VvdXNgIGFscmVhZHkgZXhpc3RzIGFzIGEgZmllbGQgaW4gdGhlIGBzdHJ1Y3Qgem9uZWAgZGF0YSBzdHJ1Y3R1cmUuIFRoaXMgc3VnZ2VzdHMgdGhlcmUmIzM5O3Mgc29tZSBleGlzdGluZyBtZWNoYW5pc20gZm9yIHRyYWNraW5nIGNvbnRpZ3VvdXMgbWVtb3J5IHJlZ2lvbnMgd2l0aGluIGEgem9uZS4gTXkgaW1tZWRpYXRlIG5leHQgc3RlcCBpcyB0byBleGFtaW5lIHRoZSBkZWZpbml0aW9uIG9mIHRoaXMgYGNvbnRpZ3VvdXNgIGZpZWxkLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCBpdHMgc3RydWN0dXJlLCB3aGF0IGRhdGEgaXQgaG9sZHMsIGFuZCBob3cgaXQmIzM5O3MgdXNlZC4gQmFzZWQgb24gdGhlIHByb3ZpZGVkIGluZm9ybWF0aW9uLCBJJiMzOTttIGhlYWRpbmcgb3ZlciB0byBgaW5jbHVkZS9saW51eC9tbXpvbmUuaGAgYXJvdW5kIGxpbmUgMTA2MCB0byBmaW5kIHRoZSBkZWZpbml0aW9uLiBUaGF0IHNob3VsZCBnaXZlIG1lIHRoZSBuZWNlc3NhcnkgY29udGV4dCB0byBkZXRlcm1pbmUgaG93IHRoaXMgZmllbGQgZml0cyBpbnRvIHRoZSBvdmVyYWxsIG1lbW9yeSBtYW5hZ2VtZW50IHN0cmF0ZWd5LgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjY2LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xNCAwNzo1MjwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O2luY2x1ZGUvbGludXgvbW16b25lLmgmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAxMDQwLAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDYwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OzEwNDA6XHRcdCAqIGJvb3RtZW0gYWxsb2NhdG9yKTpcbjEwNDE6XHRcdCAqXHRtYW5hZ2VkX3BhZ2VzID0gcHJlc2VudF9wYWdlcyAtIHJlc2VydmVkX3BhZ2VzO1xuMTA0MjpcdFx0ICpcbjEwNDM6XHRcdCAqIGNtYSBwYWdlcyBpcyBwcmVzZW50IHBhZ2VzIHRoYXQgYXJlIGFzc2lnbmVkIGZvciBDTUEgdXNlXG4xMDQ0Olx0XHQgKiAoTUlHUkFURV9DTUEpLlxuMTA0NTpcdFx0ICpcbjEwNDY6XHRcdCAqIHBhZ2VzX3dpdGhfb25saW5lX21lbW1hcCB0cmFja3MgcGFnZXMgd2l0aGluIHRoZSB6b25lIHRoYXQgaGF2ZVxuMTA0NzpcdFx0ICogYW4gb25saW5lIG1lbW9yeSBtYXA6IHByZXNlbnQgcGFnZXMgYW5kIG1lbW9yeSBob2xlcyB3aG9zZVxuMTA0ODpcdFx0ICogbWVtb3J5IG1hcCBoYXMgYmVlbiBpbml0aWFsaXplZCBhbmQgcGZuX3RvX29ubGluZV9wYWdlKClcbjEwNDk6XHRcdCAqIHN1Y2NlZWRzLiBXaGVuIHNwYW5uZWRfcGFnZXMgPT0gcGFnZXNfd2l0aF9vbmxpbmVfbWVtbWFwLFxuMTA1MDpcdFx0ICogcGZuX3RvX3BhZ2UoKSBjYW4gYmUgcGVyZm9ybWVkIHdpdGhvdXQgZnVydGhlciBjaGVja3Mgb24gYW55XG4xMDUxOlx0XHQgKiBQRk4gd2l0aGluIHRoZSB6b25lIHNwYW4uXG4xMDUyOlx0XHQgKlxuMTA1MzpcdFx0ICogTm90ZTogdGhpcyBjb3VudGVyIG1heSB0ZW1wb3JhcmlseSB1bmRlcmNvdW50IHdoZW4gcGFnZXMgd2l0aCBhblxuMTA1NDpcdFx0ICogb25saW5lIG1lbW9yeSBtYXAgZXhpc3Qgb3V0c2lkZSB0aGUgY3VycmVudCB6b25lIHNwYW4uIFN1Y2ggcGFnZXNcbjEwNTU6XHRcdCAqIGFyZSBvbmx5IGNyZWF0ZWQgZHVyaW5nIGJvb3QsIHdoZW4gaW5pdGlhbGl6aW5nIHRoZSBtZW1vcnkgbWFwIG9mXG4xMDU2Olx0XHQgKiBwYWdlcyB0aGF0IGRvIG5vdCBmYWxsIGludG8gYW55IHpvbmUgc3Bhbi4gVGhlIHVuZGVyY291bnQgaXRzZWxmXG4xMDU3Olx0XHQgKiBjYW4gb25seSBoYXBwZW4gYWZ0ZXIgYm9vdCwgZHVyaW5nIG1lbW9yeSBob3RwbHVnLCB3aGVuIGdyb3dpbmdcbjEwNTg6XHRcdCAqIHRoZSB6b25lIHRvIGNvdmVyIHN1Y2ggcGFnZXMgYW5kIGxhdGVyIHNocmlua2luZyBpdCBiYWNrLCB3aGljaFxuMTA1OTpcdFx0ICogbWF5IHJlc3VsdCBpbiBhIFwmIzM0O3RvbyBzbWFsbFwmIzM0OyB2YWx1ZS4gVGhpcyBpcyBzYWZlOiBpdCBtZXJlbHlcbjEwNjA6XHRcdCAqIHByZXZlbnRzIGRldGVjdGluZyBhIGNvbnRpZ3VvdXMgem9uZS5cbjEwNjE6XHRcdCAqXG4xMDYyOlx0XHQgKiBIZXJlIGlzIGFuIGV4YW1wbGUgKHBhZ2UgbnVtYmVycyBhcmUganVzdCBmb3IgaWxsdXN0cmF0aW9uXG4xMDYzOlx0XHQgKiBwdXJwb3Nlcyk6XG4xMDY0Olx0XHQgKiAgIGFmdGVyIGJvb3Q6XG4xMDY1Olx0XHQgKiAgICAgICBbICB6b25lIHNwYW4gIF1cbjEwNjY6XHRcdCAqICAgICAgIFsgICB6b25lIHBhZ2VzICAgXVxuMTA2NzpcdFx0ICogICAgICAgc3Bhbm5lZD0xMCwgaW5pdGlhbGl6ZWQ9MTUsIG9ubGluZT0xMFxuMTA2ODpcdFx0ICogICAgICAgb25saW5lID09IHNwYW5uZWQgIC1cdTAwM2UgIGNvbnRpZ3VvdXNcbjEwNjk6XHRcdCAqXG4xMDcwOlx0XHQgKiAgIGdyb3dpbmcgYWZ0ZXIgaG90cGx1ZyAoaG90cGx1ZyA1KTpcbjEwNzE6XHRcdCAqICAgICAgIFsgIHpvbmUgc3BhbiAgICAgICAgICAgICAgICAgICAgICAgICAgXVxuMTA3MjpcdFx0ICogICAgICAgWyAgIHpvbmUgcGFnZXMgICBdICAgWyAgIHpvbmUgcGFnZXMgICBdXG4xMDczOlx0XHQgKiAgICAgICBzcGFubmVkPTMwLCBpbml0aWFsaXplZD0yMCwgb25saW5lPTE1XG4xMDc0Olx0XHQgKiAgICAgICBvbmxpbmUgIT0gc3Bhbm5lZCAgLVx1MDAzZSAgbm90IGNvbnRpZ3VvdXNcbjEwNzU6XHRcdCAqXG4xMDc2Olx0XHQgKiAgIHNocmlua2luZyBhZnRlciBob3R1bnBsdWcgKGhvdHVucGx1ZyA1IGFnYWluKTpcbjEwNzc6XHRcdCAqICAgICAgIFsgIHpvbmUgc3BhbiAgICAgXVxuMTA3ODpcdFx0ICogICAgICAgWyAgIHpvbmUgcGFnZXMgICBdXG4xMDc5Olx0XHQgKiAgICAgICBzcGFubmVkPTE1LCBpbml0aWFsaXplZD0xNSwgb25saW5lPTEwXG4xMDgwOlx0XHQgKiAgICAgICBvbmxpbmUgIT0gc3Bhbm5lZCAgLVx1MDAzZSAgbm90IGNvbnRpZ3VvdXMgYWx0aG91Z2ggY29udGlndW91c1xuMTA4MTpcdFx0ICpcbjEwODI6XHRcdCAqIFNvIHByZXNlbnRfcGFnZXMgbWF5IGJlIHVzZWQgYnkgbWVtb3J5IGhvdHBsdWcgb3IgbWVtb3J5IHBvd2VyXG4xMDgzOlx0XHQgKiBtYW5hZ2VtZW50IGxvZ2ljIHRvIGZpZ3VyZSBvdXQgdW5tYW5hZ2VkIHBhZ2VzIGJ5IGNoZWNraW5nXG4xMDg0Olx0XHQgKiAocHJlc2VudF9wYWdlcyAtIG1hbmFnZWRfcGFnZXMpLiBBbmQgbWFuYWdlZF9wYWdlcyBzaG91bGQgYmUgdXNlZFxuMTA4NTpcdFx0ICogYnkgcGFnZSBhbGxvY2F0b3IgYW5kIHZtIHNjYW5uZXIgdG8gY2FsY3VsYXRlIGFsbCBraW5kcyBvZiB3YXRlcm1hcmtzXG4xMDg2Olx0XHQgKiBhbmQgdGhyZXNob2xkcy5cbjEwODc6XHRcdCAqXG4xMDg4Olx0XHQgKiBMb2NraW5nIHJ1bGVzOlxuMTA4OTpcdFx0ICpcbjEwOTA6XHRcdCAqIHpvbmVfc3RhcnRfcGZuIGFuZCBzcGFubmVkX3BhZ2VzIGFyZSBwcm90ZWN0ZWQgYnkgc3Bhbl9zZXFsb2NrLlxuMTA5MTpcdFx0ICogSXQgaXMgYSBzZXFsb2NrIGJlY2F1c2UgaXQgaGFzIHRvIGJlIHJlYWQgb3V0c2lkZSBvZiB6b25lLVx1MDAzZWxvY2ssXG4xMDkyOlx0XHQgKiBhbmQgaXQgaXMgZG9uZSBpbiB0aGUgbWFpbiBhbGxvY2F0b3IgcGF0aC4gIEJ1dCwgaXQgaXMgd3JpdHRlblxuMTA5MzpcdFx0ICogcXVpdGUgaW5mcmVxdWVudGx5LlxuMTA5NDpcdFx0ICpcbjEwOTU6XHRcdCAqIFRoZSBzcGFuX3NlcSBsb2NrIGlzIGRlY2xhcmVkIGFsb25nIHdpdGggem9uZS1cdTAwM2Vsb2NrIGJlY2F1c2UgaXQgaXNcbjEwOTY6XHRcdCAqIGZyZXF1ZW50bHkgcmVhZCBpbiBwcm94aW1pdHkgdG8gem9uZS1cdTAwM2Vsb2NrLiAgSXQmIzM5O3MgZ29vZCB0b1xuMTA5NzpcdFx0ICogZ2l2ZSB0aGVtIGEgY2hhbmNlIG9mIGJlaW5nIGluIHRoZSBzYW1lIGNhY2hlbGluZS5cbjEwOTg6XHRcdCAqXG4xMDk5Olx0XHQgKiBXcml0ZSBhY2Nlc3MgdG8gcHJlc2VudF9wYWdlcyBhdCBydW50aW1lIHNob3VsZCBiZSBwcm90ZWN0ZWQgYnlcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD42Ny8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTQgMDc6NTI8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjgtZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMjE4MTMKCQkJCQkJCW91dHB1dDogMzcKCQkJCQkJCXRob3VnaHRzOiAyNgoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBteSB0YWtlIG9uIHRob3NlIGxpbmVzIGluIGBpbmNsdWRlL2xpbnV4L21tem9uZS5oYDoKCioqRGl2aW5nIGludG8gbW16b25lLmg6IEEgUXVpY2sgU2NhbiBvZiBMaW5lcyAxMTAwLTExMzAqKgoKQWxyaWdodCwgbGV0JiMzOTtzIHplcm8gaW4gb24gdGhvc2UgbGluZXMsIDExMDAgdG8gMTEzMCBpbiBgaW5jbHVkZS9saW51eC9tbXpvbmUuaGAuIEkmIzM5O20gaW1tZWRpYXRlbHkgZXhwZWN0aW5nIHRvIGZpbmQgc29tZXRoaW5nIGZ1bmRhbWVudGFsLCBwcm9iYWJseSBhIGNvcmUgc3RydWN0dXJlIG9yIHNvbWUga2V5IGRlZmluaXRpb25zIHJlbGF0ZWQgdG8gbWVtb3J5IG1hbmFnZW1lbnQgem9uZXMuIEdpdmVuIHRoZSBjb250ZXh0LCBJJiMzOTtkIHdhZ2VyIGl0IGhhcyBzb21ldGhpbmcgdG8gZG8gd2l0aCBob3cgdGhlIGtlcm5lbCBvcmdhbml6ZXMgcGh5c2ljYWwgbWVtb3J5LCBtYXliZSBkZWxpbmVhdGluZyBkaWZmZXJlbnQgbWVtb3J5IHR5cGVzIG9yIHJlZ2lvbnMuIEkmIzM5O20gZ29pbmcgdG8gcXVpY2tseSBwYXJzZSB0aGUgY29kZSBpbiBteSBoZWFkLCBsb29raW5nIGZvciB0aGUgdXN1YWwgc3VzcGVjdHM6IG1lbW9yeSBub2RlIHN0cnVjdHVyZXMsIE5VTUEtcmVsYXRlZCBkZWNsYXJhdGlvbnMsIG1heWJlIHNvbWUgYHN0cnVjdCBwYWdlYCBleHRlbnNpb25zIHJlbGV2YW50IHRvIHRoaXMgem9uZS4gSSYjMzk7bGwgYmUgd2F0Y2hpbmcgb3V0IGZvciB0aGluZ3MgbGlrZSBwZXItem9uZSBzdGF0aXN0aWNzLCBmcmVlIGxpc3RzLCBvciBhbnkgZmxhZ3MgdGhhdCBkZW5vdGUgdGhlIHpvbmUmIzM5O3Mgc3RhdHVzLiBJJiMzOTtsbCBhbHNvIHRyeSB0byBnYXVnZSB0aGUgcHVycG9zZSBvZiB0aG9zZSBzcGVjaWZpYyBsaW5lcyBpbiB0ZXJtcyBvZiB0aGUgYmlnZ2VyIHBpY3R1cmUgb2YgbWVtb3J5IG1hbmFnZW1lbnQuIFdoYXQgcHJvYmxlbSB3ZXJlIHRoZSBrZXJuZWwgZGV2ZWxvcGVycyB0cnlpbmcgdG8gc29sdmUgYXQgdGhpcyBzcGVjaWZpYyBwb2ludD8gSG9wZWZ1bGx5LCBJIHdpbGwgc2VlIGVub3VnaCBjb250ZXh0IHRvIGdhaW4gaW5zaWdodCBpbnRvIGhvdyB0aGF0IGltcGFjdHMgdGhlIG92ZXJhbGwgbWVtb3J5IGhhbmRsaW5nIHN0cmF0ZWdpZXMuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NjgvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE0IDA3OjUzPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7aW5jbHVkZS9saW51eC9tbXpvbmUuaCYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDExMDAsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogMzAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7MTEwMDpcdFx0ICogbWVtX2hvdHBsdWdfYmVnaW4vZG9uZSgpLiBBbnkgcmVhZGVyIHdobyBjYW4mIzM5O3QgdG9sZXJhbnQgZHJpZnQgb2ZcbjExMDE6XHRcdCAqIHByZXNlbnRfcGFnZXMgc2hvdWxkIHVzZSBnZXRfb25saW5lX21lbXMoKSB0byBnZXQgYSBzdGFibGUgdmFsdWUuXG4xMTAyOlx0XHQgKi9cbjExMDM6XHRcdGF0b21pY19sb25nX3RcdFx0bWFuYWdlZF9wYWdlcztcbjExMDQ6XHRcdHVuc2lnbmVkIGxvbmdcdFx0c3Bhbm5lZF9wYWdlcztcbjExMDU6XHRcdHVuc2lnbmVkIGxvbmdcdFx0cHJlc2VudF9wYWdlcztcbjExMDY6XHRcdHVuc2lnbmVkIGxvbmdcdFx0cGFnZXNfd2l0aF9vbmxpbmVfbWVtbWFwO1xuMTEwNzpcdCNpZiBkZWZpbmVkKENPTkZJR19NRU1PUllfSE9UUExVRylcbjExMDg6XHRcdHVuc2lnbmVkIGxvbmdcdFx0cHJlc2VudF9lYXJseV9wYWdlcztcbjExMDk6XHQjZW5kaWZcbjExMTA6XHQjaWZkZWYgQ09ORklHX0NNQVxuMTExMTpcdFx0dW5zaWduZWQgbG9uZ1x0XHRjbWFfcGFnZXM7XG4xMTEyOlx0I2VuZGlmXG4xMTEzOlx0XG4xMTE0Olx0XHRjb25zdCBjaGFyXHRcdCpuYW1lO1xuMTExNTpcdFxuMTExNjpcdCNpZmRlZiBDT05GSUdfTUVNT1JZX0lTT0xBVElPTlxuMTExNzpcdFx0LypcbjExMTg6XHRcdCAqIE51bWJlciBvZiBpc29sYXRlZCBwYWdlYmxvY2suIEl0IGlzIHVzZWQgdG8gc29sdmUgaW5jb3JyZWN0XG4xMTE5Olx0XHQgKiBmcmVlcGFnZSBjb3VudGluZyBwcm9ibGVtIGR1ZSB0byByYWN5IHJldHJpZXZpbmcgbWlncmF0ZXR5cGVcbjExMjA6XHRcdCAqIG9mIHBhZ2VibG9jay4gUHJvdGVjdGVkIGJ5IHpvbmUtXHUwMDNlbG9jay5cbjExMjE6XHRcdCAqL1xuMTEyMjpcdFx0dW5zaWduZWQgbG9uZ1x0XHRucl9pc29sYXRlX3BhZ2VibG9jaztcbjExMjM6XHQjZW5kaWZcbjExMjQ6XHRcbjExMjU6XHQjaWZkZWYgQ09ORklHX01FTU9SWV9IT1RQTFVHXG4xMTI2Olx0XHQvKiBzZWUgc3Bhbm5lZC9wcmVzZW50X3BhZ2VzIGZvciBtb3JlIGRlc2NyaXB0aW9uICovXG4xMTI3Olx0XHRzZXFsb2NrX3RcdFx0c3Bhbl9zZXFsb2NrO1xuMTEyODpcdCNlbmRpZlxuMTEyOTpcdFxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjY5LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xNCAwNzo1MzwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuOC1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyMjU3NAoJCQkJCQkJb3V0cHV0OiAyOQoJCQkJCQkJdGhvdWdodHM6IDE3CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIGEgc3VtbWFyeSBvZiBteSB0aG91Z2h0IHByb2Nlc3M6CgoqKkRpdmluZyBpbnRvIFpvbmUgQ29udGlndWl0eSoqCgpPa2F5LCBzbyBJJiMzOTttIGxvb2tpbmcgYXQgYHpvbmUtJmd0O2NvbnRpZ3VvdXNgLiBNeSBpbW1lZGlhdGUgdGhvdWdodCBpcywgJiMzNDtXaGVyZSBleGFjdGx5IGlzIHRoaXMgZGVmaW5lZCB3aXRoaW4gdGhlIGBzdHJ1Y3Qgem9uZWA/JiMzNDsgSSBrbm93IHRoZSBjb25jZXB0LCBvZiBjb3Vyc2UsIGJ1dCBJIG5lZWQgdG8gcXVpY2tseSByZWZyZXNoIG15IG1lbW9yeSBvbiB0aGUgcHJlY2lzZSBkZWNsYXJhdGlvbiB3aXRoaW4gdGhlIGRhdGEgc3RydWN0dXJlLiBJdCYjMzk7cyB0aW1lIHRvIHRyYWNlIHRoZSBjb2RlIGFuZCBwaW5wb2ludCBpdHMgbG9jYXRpb24gZm9yIGNvbnRleHQuIFVuZGVyc3RhbmRpbmcgaXRzIGRlY2xhcmF0aW9uIGlzIGNydWNpYWwgZm9yIGFueSBkZWVwZXIgYW5hbHlzaXMgb3IgZGVidWdnaW5nIEkgbWlnaHQgbmVlZCB0byBkby4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD43MC8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTQgMDc6NTM8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7Y29udGlndW91cyYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O2luY2x1ZGUvbGludXgvbW16b25lLmgmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7aW5jbHVkZS9saW51eC9tbXpvbmUuaC03My0gKiBPbmx5IHBhZ2VzIHdpdGhpbiBhIHNpbmdsZSBtZW1vcnkgc2VjdGlvbiBhcmUgZ3VhcmFudGVlZCB0byBiZVxuaW5jbHVkZS9saW51eC9tbXpvbmUuaDo3NDogKiBjb250aWd1b3VzLiBCeSBsaW1pdGluZyBmb2xpb3MgdG8gYSBzaW5nbGUgbWVtb3J5IHNlY3Rpb24sIGFsbCBmb2xpb1xuaW5jbHVkZS9saW51eC9tbXpvbmUuaDo3NTogKiBwYWdlcyBhcmUgZ3VhcmFudGVlZCB0byBiZSBjb250aWd1b3VzLlxuaW5jbHVkZS9saW51eC9tbXpvbmUuaC03Ni0gKi9cbi0tXG5pbmNsdWRlL2xpbnV4L21tem9uZS5oPTk3OT1zdHJ1Y3Qgem9uZSB7XG4tLVxuaW5jbHVkZS9saW51eC9tbXpvbmUuaC0xMDU5LVx0ICogbWF5IHJlc3VsdCBpbiBhIFwmIzM0O3RvbyBzbWFsbFwmIzM0OyB2YWx1ZS4gVGhpcyBpcyBzYWZlOiBpdCBtZXJlbHlcbmluY2x1ZGUvbGludXgvbW16b25lLmg6MTA2MDpcdCAqIHByZXZlbnRzIGRldGVjdGluZyBhIGNvbnRpZ3VvdXMgem9uZS5cbmluY2x1ZGUvbGludXgvbW16b25lLmgtMTA2MS1cdCAqXG4tLVxuaW5jbHVkZS9saW51eC9tbXpvbmUuaC0xMDY3LVx0ICogICAgICAgc3Bhbm5lZD0xMCwgaW5pdGlhbGl6ZWQ9MTUsIG9ubGluZT0xMFxuaW5jbHVkZS9saW51eC9tbXpvbmUuaDoxMDY4Olx0ICogICAgICAgb25saW5lID09IHNwYW5uZWQgIC1cdTAwM2UgIGNvbnRpZ3VvdXNcbmluY2x1ZGUvbGludXgvbW16b25lLmgtMTA2OS1cdCAqXG4tLVxuaW5jbHVkZS9saW51eC9tbXpvbmUuaC0xMDczLVx0ICogICAgICAgc3Bhbm5lZD0zMCwgaW5pdGlhbGl6ZWQ9MjAsIG9ubGluZT0xNVxuaW5jbHVkZS9saW51eC9tbXpvbmUuaDoxMDc0Olx0ICogICAgICAgb25saW5lICE9IHNwYW5uZWQgIC1cdTAwM2UgIG5vdCBjb250aWd1b3VzXG5pbmNsdWRlL2xpbnV4L21tem9uZS5oLTEwNzUtXHQgKlxuLS1cbmluY2x1ZGUvbGludXgvbW16b25lLmgtMTA3OS1cdCAqICAgICAgIHNwYW5uZWQ9MTUsIGluaXRpYWxpemVkPTE1LCBvbmxpbmU9MTBcbmluY2x1ZGUvbGludXgvbW16b25lLmg6MTA4MDpcdCAqICAgICAgIG9ubGluZSAhPSBzcGFubmVkICAtXHUwMDNlICBub3QgY29udGlndW91cyBhbHRob3VnaCBjb250aWd1b3VzXG5pbmNsdWRlL2xpbnV4L21tem9uZS5oLTEwODEtXHQgKlxuLS1cbmluY2x1ZGUvbGludXgvbW16b25lLmgtMTE5MC1cbmluY2x1ZGUvbGludXgvbW16b25lLmg6MTE5MTpcdGJvb2xcdFx0XHRjb250aWd1b3VzO1xuaW5jbHVkZS9saW51eC9tbXpvbmUuaC0xMTkyLVxuLS1cbmluY2x1ZGUvbGludXgvbW16b25lLmg9MTcyOD1zdGF0aWMgaW5saW5lIGJvb2wgem9uZV9pc196b25lX2RldmljZShjb25zdCBzdHJ1Y3Qgem9uZSAqem9uZSlcbi0tXG5pbmNsdWRlL2xpbnV4L21tem9uZS5oLTE3MzQtLyoqXG5pbmNsdWRlL2xpbnV4L21tem9uZS5oOjE3MzU6ICogem9uZV9pc19jb250aWd1b3VzIC0gdGVzdCB3aGV0aGVyIGEgem9uZSBpcyBjb250aWd1b3VzXG5pbmNsdWRlL2xpbnV4L21tem9uZS5oLTE3MzYtICogQHpvbmU6IHRoZSB6b25lIHRvIHRlc3QuXG5pbmNsdWRlL2xpbnV4L21tem9uZS5oLTE3MzctICpcbmluY2x1ZGUvbGludXgvbW16b25lLmg6MTczODogKiBJbiBhIGNvbnRpZ3VvdXMgem9uZSwgaXQgaXMgdmFsaWQgdG8gY2FsbCBwZm5fdG9fcGFnZSgpIG9uIGFueSBQRk4gaW4gdGhlXG5pbmNsdWRlL2xpbnV4L21tem9uZS5oLTE3MzktICogc3Bhbm5lZCB6b25lIHdpdGhvdXQgcmVxdWlyaW5nIHBmbl92YWxpZCgpIG9yIHBmbl90b19vbmxpbmVfcGFnZSgpIGNoZWNrcy5cbi0tXG5pbmNsdWRlL2xpbnV4L21tem9uZS5oLTE3NDMtICpcbmluY2x1ZGUvbGludXgvbW16b25lLmg6MTc0NDogKiBaT05FX0RFVklDRSB6b25lcyBhcmUgYWx3YXlzIG1hcmtlZCBub24tY29udGlndW91cy5cbmluY2x1ZGUvbGludXgvbW16b25lLmgtMTc0NS0gKlxuaW5jbHVkZS9saW51eC9tbXpvbmUuaDoxNzQ2OiAqIFJldHVybjogdHJ1ZSBpZiBjb250aWd1b3VzLCBvdGhlcndpc2UgZmFsc2UuXG5pbmNsdWRlL2xpbnV4L21tem9uZS5oLTE3NDctICovXG5pbmNsdWRlL2xpbnV4L21tem9uZS5oOjE3NDg6c3RhdGljIGlubGluZSBib29sIHpvbmVfaXNfY29udGlndW91cyhjb25zdCBzdHJ1Y3Qgem9uZSAqem9uZSlcbmluY2x1ZGUvbGludXgvbW16b25lLmgtMTc0OS17XG5pbmNsdWRlL2xpbnV4L21tem9uZS5oOjE3NTA6XHRyZXR1cm4gUkVBRF9PTkNFKHpvbmUtXHUwMDNlY29udGlndW91cyk7XG5pbmNsdWRlL2xpbnV4L21tem9uZS5oLTE3NTEtfVxuaW5jbHVkZS9saW51eC9tbXpvbmUuaC0xNzUyLVxuaW5jbHVkZS9saW51eC9tbXpvbmUuaDoxNzUzOnN0YXRpYyBpbmxpbmUgdm9pZCBzZXRfem9uZV9jb250aWd1b3VzKHN0cnVjdCB6b25lICp6b25lKVxuaW5jbHVkZS9saW51eC9tbXpvbmUuaC0xNzU0LXtcbi0tXG5pbmNsdWRlL2xpbnV4L21tem9uZS5oLTE3NTctXHRpZiAoem9uZS1cdTAwM2VzcGFubmVkX3BhZ2VzID09IHpvbmUtXHUwMDNlcGFnZXNfd2l0aF9vbmxpbmVfbWVtbWFwKVxuaW5jbHVkZS9saW51eC9tbXpvbmUuaDoxNzU4Olx0XHRXUklURV9PTkNFKHpvbmUtXHUwMDNlY29udGlndW91cywgdHJ1ZSk7XG5pbmNsdWRlL2xpbnV4L21tem9uZS5oLTE3NTktfVxuaW5jbHVkZS9saW51eC9tbXpvbmUuaC0xNzYwLVxuaW5jbHVkZS9saW51eC9tbXpvbmUuaDoxNzYxOnN0YXRpYyBpbmxpbmUgdm9pZCBjbGVhcl96b25lX2NvbnRpZ3VvdXMoc3RydWN0IHpvbmUgKnpvbmUpXG5pbmNsdWRlL2xpbnV4L21tem9uZS5oLTE3NjIte1xuaW5jbHVkZS9saW51eC9tbXpvbmUuaDoxNzYzOlx0V1JJVEVfT05DRSh6b25lLVx1MDAzZWNvbnRpZ3VvdXMsIGZhbHNlKTtcbmluY2x1ZGUvbGludXgvbW16b25lLmgtMTc2NC19XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NzEvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE0IDA3OjUzPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy44LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDIzODM0CgkJCQkJCQlvdXRwdXQ6IDI0CgkJCQkJCQl0aG91Z2h0czogMTI3CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyB0aGUgYHN0cnVjdCB6b25lYCBJbml0aWFsaXphdGlvbiBQcm9jZXNzKioKCk9rYXksIHNvIEkmIzM5O20gdGhpbmtpbmcgYWJvdXQgaG93IHRoZSBgc3RydWN0IHpvbmVgIHN0cnVjdHVyZSBnZXRzIGluaXRpYWxpemVkIHdpdGhpbiB0aGUgTGludXgga2VybmVsLiBGcm9tIHdoYXQgSSByZWNhbGwsIGFuZCBJJiMzOTttIHByZXR0eSBzdXJlIHRoaXMgaXMgcmlnaHQsIGl0JiMzOTtzIHN0YXRpY2FsbHkgYWxsb2NhdGVkLCBvciBhdCBsZWFzdCBhbGxvY2F0ZWQgdmVyeSBlYXJseSBvbiBkdXJpbmcgdGhlIGJvb3QgcHJvY2Vzcy4gSXQmIzM5O3MgYWxsb2NhdGVkIG9uIGEgcGVyLW5vZGUgYmFzaXMsIHR5cGljYWxseSBpbiBzb21ldGhpbmcgbGlrZSBgZnJlZV9hcmVhX2luaXRfY29yZWAsIGFuZCBJIGJlbGlldmUgdGhpcyBpcyBkb25lIHdpdGggYG1lbWJsb2NrYCBvciBwZXJoYXBzIHN0YXRpYyBCU1MsIG9yIG1heWJlIGBhbGxvY19ib290bWVtYCBvciBga3phbGxvY2AuIFRoYXQgc3VnZ2VzdHMgaXQmIzM5O3MgbGlrZWx5IHplcm8taW5pdGlhbGl6ZWQsIGRvZXNuJiMzOTt0IGl0PyBMZXQgbWUganVzdCBkb3VibGUtY2hlY2sgdGhhdCBgcGFnZXNfd2l0aF9vbmxpbmVfbWVtbWFwYCwgd2hpY2ggSSBrbm93IGlzIGFuIGB1bnNpZ25lZCBsb25nYCBpbiBgaW5jbHVkZS9saW51eC9tbXpvbmUuaGAsIGlzIGluaXRpYWxpemVkIGNvcnJlY3RseS4gVG8gY29uZmlybSB0aGUgemVyby1pbml0aWFsaXphdGlvbiwgSSByZWFsbHkgc2hvdWxkIGdvIGFuZCBsb29rIGF0IGBmcmVlX2FyZWFfaW5pdF9jb3JlYCBkaXJlY3RseSwgb3Igd2hlcmV2ZXIgem9uZXMgYXJlIGFjdHVhbGx5IGluaXRpYWxpemVkLiBUaGF0JiMzOTtzIHRoZSBrZXkgc3BvdCB0byB2ZXJpZnkgaG93IHRoZSBpbml0aWFsIHZhbHVlcyBhcmUgc2V0LgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjcyLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xNCAwNzo1MzwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDt6b25lLVx1MDAzZXBhZ2VzX3dpdGhfb25saW5lX21lbW1hcCYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtpbmNsdWRlL2xpbnV4L21tem9uZS5oPTE3NTM9c3RhdGljIGlubGluZSB2b2lkIHNldF96b25lX2NvbnRpZ3VvdXMoc3RydWN0IHpvbmUgKnpvbmUpXG4tLVxuaW5jbHVkZS9saW51eC9tbXpvbmUuaC0xNzU2LVx0XHRyZXR1cm47XG5pbmNsdWRlL2xpbnV4L21tem9uZS5oOjE3NTc6XHRpZiAoem9uZS1cdTAwM2VzcGFubmVkX3BhZ2VzID09IHpvbmUtXHUwMDNlcGFnZXNfd2l0aF9vbmxpbmVfbWVtbWFwKVxuaW5jbHVkZS9saW51eC9tbXpvbmUuaC0xNzU4LVx0XHRXUklURV9PTkNFKHpvbmUtXHUwMDNlY29udGlndW91cywgdHJ1ZSk7XG4tLVxubW0vbWVtb3J5X2hvdHBsdWcuYz0xMDQ1PXZvaWQgYWRqdXN0X3ByZXNlbnRfcGFnZV9jb3VudChzdHJ1Y3QgcGFnZSAqcGFnZSwgc3RydWN0IG1lbW9yeV9ncm91cCAqZ3JvdXAsXG4tLVxubW0vbWVtb3J5X2hvdHBsdWcuYy0xMDU3LVx0em9uZS1cdTAwM2VwcmVzZW50X3BhZ2VzICYjNDM7PSBucl9wYWdlcztcbm1tL21lbW9yeV9ob3RwbHVnLmM6MTA1ODpcdHpvbmUtXHUwMDNlcGFnZXNfd2l0aF9vbmxpbmVfbWVtbWFwICYjNDM7PSBucl9wYWdlcztcbm1tL21lbW9yeV9ob3RwbHVnLmMtMTA1OS1cdHpvbmUtXHUwMDNlem9uZV9wZ2RhdC1cdTAwM2Vub2RlX3ByZXNlbnRfcGFnZXMgJiM0Mzs9IG5yX3BhZ2VzO1xuLS1cbm1tL21tX2luaXQuYz05MzI9c3RhdGljIHZvaWQgX19pbml0IG1lbW1hcF9pbml0X3pvbmVfcmFuZ2Uoc3RydWN0IHpvbmUgKnpvbmUsXG4tLVxubW0vbW1faW5pdC5jLTk0OS1cdFx0XHQgIGZhbHNlKTtcbm1tL21tX2luaXQuYzo5NTA6XHR6b25lLVx1MDAzZXBhZ2VzX3dpdGhfb25saW5lX21lbW1hcCAmIzQzOz0gZW5kX3BmbiAtIHN0YXJ0X3Bmbjtcbm1tL21tX2luaXQuYy05NTEtXG4tLVxubW0vbW1faW5pdC5jLTk2Mi1cdFx0XHRcdFx0ICAgICAgIHpvbmVfaWQsIG5pZCk7XG5tbS9tbV9pbml0LmM6OTYzOlx0XHR6b25lLVx1MDAzZXBhZ2VzX3dpdGhfb25saW5lX21lbW1hcCAmIzQzOz0gcGdjbnQ7XG5tbS9tbV9pbml0LmMtOTY0LVx0fVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjczLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xNCAwNzo1MzwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuOC1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyNDYzMAoJCQkJCQkJb3V0cHV0OiAzNwoJCQkJCQkJdGhvdWdodHM6IDUxCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBsZXQmIzM5O3MgZGl2ZSBpbnRvIHRoaXMuIEhlcmUmIzM5O3MgaG93IEkmIzM5O2QgYXBwcm9hY2ggdGhpcyBwcm9ibGVtOgoKKipFeGFtaW5pbmcgT2ZmbGluZSBQYWdlIENvdW50IEFkanVzdG1lbnQqKgoKQWxyaWdodCwgSSBuZWVkIHRvIGZpZ3VyZSBvdXQgaG93IHBhZ2UgY291bnRzIGFyZSBoYW5kbGVkIHdoZW4gYSBtZW1vcnkgbm9kZSBnb2VzIG9mZmxpbmUuIE15IGluaXRpYWwgdGhvdWdodCBpcywgZG9lcyB0aGUgYGFkanVzdF9wcmVzZW50X3BhZ2VfY291bnRgIGZ1bmN0aW9uLCB3aGljaCBJIHJlbWVtYmVyIGZyb20gdGhlIG1lbW9yeSBob3RwbHVnIGNvZGUsIGFjdHVhbGx5IGFkZHJlc3MgdGhlIG9mZmxpbmUgc2NlbmFyaW8/IEl0IHNlZW1zIGxpa2UgaXQgc2hvdWxkLCBidXQgbGV0JiMzOTtzIGJlIHN1cmUuIFRpbWUgdG8gZGlnIGludG8gdGhlIHNvdXJjZS4gSSYjMzk7bGwgbmVlZCB0byBsb2NhdGUgYGFkanVzdF9wcmVzZW50X3BhZ2VfY291bnRgLiBJZiBJIHJlY2FsbCBjb3JyZWN0bHksIGl0JiMzOTtzIGRlZmluZWQgaW4gYG1tL21lbW9yeV9ob3RwbHVnLmNgLiBMZXQmIzM5O3MgY29uZmlybSBhbmQgc2VlIHdoYXQmIzM5O3MgYWN0dWFsbHkgaGFwcGVuaW5nIHVuZGVyIHRoZSBob29kLiBJIGV4cGVjdCB0byBmaW5kIHRoZSBtZWF0IG9mIHRoZSBtZW1vcnkgbWFuYWdlbWVudCBsb2dpYyByZWxhdGVkIHRvIG9mZmxpbmUgb3BlcmF0aW9ucyB0aGVyZS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD43NC8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTQgMDc6NTM8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDttbS9tZW1vcnlfaG90cGx1Zy5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMTA0NSwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiAzNQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsxMDQ1Olx0dm9pZCBhZGp1c3RfcHJlc2VudF9wYWdlX2NvdW50KHN0cnVjdCBwYWdlICpwYWdlLCBzdHJ1Y3QgbWVtb3J5X2dyb3VwICpncm91cCxcbjEwNDY6XHRcdFx0XHQgICAgICAgbG9uZyBucl9wYWdlcylcbjEwNDc6XHR7XG4xMDQ4Olx0XHRzdHJ1Y3Qgem9uZSAqem9uZSA9IHBhZ2Vfem9uZShwYWdlKTtcbjEwNDk6XHRcdGNvbnN0IGJvb2wgbW92YWJsZSA9IHpvbmVfaWR4KHpvbmUpID09IFpPTkVfTU9WQUJMRTtcbjEwNTA6XHRcbjEwNTE6XHRcdC8qXG4xMDUyOlx0XHQgKiBXZSBvbmx5IHN1cHBvcnQgb25saW5pbmcvb2ZmbGluaW5nL2FkZGluZy9yZW1vdmluZyBvZiBjb21wbGV0ZVxuMTA1MzpcdFx0ICogbWVtb3J5IGJsb2NrczsgdGhlcmVmb3JlLCBlaXRoZXIgYWxsIGlzIGVpdGhlciBlYXJseSBvciBob3RwbHVnZ2VkLlxuMTA1NDpcdFx0ICovXG4xMDU1Olx0XHRpZiAoZWFybHlfc2VjdGlvbihfX3Bmbl90b19zZWN0aW9uKHBhZ2VfdG9fcGZuKHBhZ2UpKSkpXG4xMDU2Olx0XHRcdHpvbmUtXHUwMDNlcHJlc2VudF9lYXJseV9wYWdlcyAmIzQzOz0gbnJfcGFnZXM7XG4xMDU3Olx0XHR6b25lLVx1MDAzZXByZXNlbnRfcGFnZXMgJiM0Mzs9IG5yX3BhZ2VzO1xuMTA1ODpcdFx0em9uZS1cdTAwM2VwYWdlc193aXRoX29ubGluZV9tZW1tYXAgJiM0Mzs9IG5yX3BhZ2VzO1xuMTA1OTpcdFx0em9uZS1cdTAwM2V6b25lX3BnZGF0LVx1MDAzZW5vZGVfcHJlc2VudF9wYWdlcyAmIzQzOz0gbnJfcGFnZXM7XG4xMDYwOlx0XG4xMDYxOlx0XHRpZiAoZ3JvdXAgXHUwMDI2XHUwMDI2IG1vdmFibGUpXG4xMDYyOlx0XHRcdGdyb3VwLVx1MDAzZXByZXNlbnRfbW92YWJsZV9wYWdlcyAmIzQzOz0gbnJfcGFnZXM7XG4xMDYzOlx0XHRlbHNlIGlmIChncm91cCBcdTAwMjZcdTAwMjYgIW1vdmFibGUpXG4xMDY0Olx0XHRcdGdyb3VwLVx1MDAzZXByZXNlbnRfa2VybmVsX3BhZ2VzICYjNDM7PSBucl9wYWdlcztcbjEwNjU6XHR9XG4xMDY2Olx0XG4xMDY3Olx0aW50IG1ocF9pbml0X21lbW1hcF9vbl9tZW1vcnkodW5zaWduZWQgbG9uZyBwZm4sIHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMsXG4xMDY4Olx0XHRcdFx0ICAgICAgc3RydWN0IHpvbmUgKnpvbmUpXG4xMDY5Olx0e1xuMTA3MDpcdFx0dW5zaWduZWQgbG9uZyBlbmRfcGZuID0gcGZuICYjNDM7IG5yX3BhZ2VzO1xuMTA3MTpcdFx0aW50IHJldCwgaTtcbjEwNzI6XHRcbjEwNzM6XHRcdHJldCA9IGthc2FuX2FkZF96ZXJvX3NoYWRvdyhfX3ZhKFBGTl9QSFlTKHBmbikpLCBQRk5fUEhZUyhucl9wYWdlcykpO1xuMTA3NDpcdFx0aWYgKHJldClcbjEwNzU6XHRcdFx0cmV0dXJuIHJldDtcbjEwNzY6XHRcbjEwNzc6XHRcdG1vdmVfcGZuX3JhbmdlX3RvX3pvbmUoem9uZSwgcGZuLCBucl9wYWdlcywgTlVMTCwgTUlHUkFURV9VTk1PVkFCTEUsXG4xMDc4Olx0XHRcdFx0ICAgICAgIGZhbHNlKTtcbjEwNzk6XHRcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD43NS8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTQgMDc6NTM8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjgtZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMjU0NzEKCQkJCQkJCW91dHB1dDogMjEKCQkJCQkJCXRob3VnaHRzOiA5ODYKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIE1lbW9yeSBIb3RwbHVnIGFuZCBPZmZsaW5pbmcgTWVjaGFuaWNzKioKCk9rYXksIHNvIEkmIzM5O20gZGl2aW5nIGludG8gaG93IHRoZSBrZXJuZWwgaGFuZGxlcyBtZW1vcnkgaG90cGx1ZyBhbmQgb2ZmbGluaW5nLCBwYXJ0aWN1bGFybHkgZm9jdXNpbmcgb24gaG93IHBhZ2UgY291bnRzIGFyZSBhZGp1c3RlZCBhbmQgaG93IHRoZSB6b25lcyBhcmUgbWFuYWdlZCBkdXJpbmcgdGhlc2Ugb3BlcmF0aW9ucy4KCkZpcnN0LCBJIG5vdGljZSBhIGNyaXRpY2FsIGRldGFpbDogYG5yX3BhZ2VzYCBpcyBuZWdhdGl2ZSB3aGVuIGEgbWVtb3J5IGJsb2NrIGlzIGJlaW5nIG9mZmxpbmVkLiBUaGlzIGlzIGtleS4gVGhlIGBhZGp1c3RfcHJlc2VudF9wYWdlX2NvdW50YCBmdW5jdGlvbiBpcyBjYWxsZWQgd2l0aCBhIG5lZ2F0aXZlIGBucl92bWVtbWFwX3BhZ2VzYCB2YWx1ZSBpbiB0aGlzIG9mZmxpbmluZyBjb250ZXh0LiBUaGlzIHN1YnRyYWN0aW9uIGlzIHRoZW4gcmVmbGVjdGVkIGluIGB6b25lLSZndDtwYWdlc193aXRoX29ubGluZV9tZW1tYXBgLiBTbyBpdCBtYWtlcyBzZW5zZS4KCk5leHQsIEkmIzM5O20gZXhhbWluaW5nIHRoZSBgbWVtb3J5X2Jsb2NrX29ubGluZWAgYW5kIGBtZW1vcnlfYmxvY2tfb2ZmbGluZWAgZnVuY3Rpb25zIGluIGBkcml2ZXJzL2Jhc2UvbWVtb3J5LmNgLiBJIHNlZSB0aGUgYG1lbV9ob3RwbHVnX2JlZ2luKClgIGFuZCBgbWVtX2hvdHBsdWdfZG9uZSgpYCBjYWxscyBicmFja2V0aW5nIHRoZSBjb3JlIG9wZXJhdGlvbnMuIEFsc28gYGNsZWFyX3pvbmVfY29udGlndW91c2AgYW5kIGBzZXRfem9uZV9jb250aWd1b3VzYCB3ZXJlIGNhbGxlZCBpbiB0aGUgb2xkIGNvZGUuIE5vdywgYGNsZWFyX3pvbmVfY29udGlndW91c2AgYW5kIGBzZXRfem9uZV9jb250aWd1b3VzYCBoYXZlIGJlZW4gbW92ZWQgdG8gYmUgYXJvdW5kIGBtZW1vcnlfYmxvY2tfb25saW5lYCBhbmQgYG1lbW9yeV9ibG9ja19vZmZsaW5lYCBzcGVjaWZpY2FsbHkuCgpOb3csIG15IG1pbmQgaXMganVtcGluZyB0byBvdGhlciByZWxhdGVkIGFyZWFzLCBhbmQgaG93IHRoZXNlIGNoYW5nZXMgaW1wYWN0IHRoZW0uIEkmIzM5O20gdGhpbmtpbmcgYWJvdXQgdGhlIGBzaHJpbmtfem9uZV9zcGFuYCwgYGZpbmRfc21hbGxlc3Rfc2VjdGlvbl9wZm5gLCBhbmQgYGZpbmRfYmlnZ2VzdF9zZWN0aW9uX3BmbmAgZnVuY3Rpb25zIGluIGBtbS9tZW1vcnlfaG90cGx1Zy5jYC4gSSBuZWVkIHRvIGVuc3VyZSB0aGUgY2hhbmdlcyBhcmUgY29uc2lzdGVudC4gSSBzZWUgYSBuZXcgZnVuY3Rpb24gYHN1YnNlY3Rpb25fb3ZlcmxhcHNfem9uZWAsIHdoaWNoIGNoZWNrcyBpZiBhIHN1YnNlY3Rpb24gb3ZlcmxhcHMgYSBnaXZlbiB6b25lLiBUaGUgbG9naWMgcmVsaWVzIG9uIGBwZm5fdG9fb25saW5lX3BhZ2VgLCB3aGljaCBJJiMzOTtsbCBuZWVkIHRvIGRvdWJsZS1jaGVjayBpbiByZWxhdGlvbiB0byB0aGUgbWFpbiB0b3BpYy4KCkkmIzM5O20gdGhpbmtpbmcgbW9yZSBhYm91dCBob3cgYGFkanVzdF9wcmVzZW50X3BhZ2VfY291bnRgIHdvcmtzLiBJIG5lZWQgdG8gdHJhY2UgdGhpcyBmdW5jdGlvbiBhcyBpdCBpcyBhcHBsaWVkIGhlcmUgaW4gaG90cGx1Zy9vZmZsaW5lLiBJIG5lZWQgdG8gc2VhcmNoIHRoZSBrZXJuZWwgc291cmNlIGFuZCB1bmRlcnN0YW5kIGl0cyByZWxhdGlvbnNoaXAgdG8gYG9ubGluZV9wYWdlc2AgYW5kIGVzcGVjaWFsbHkgdGhlIGBwYWdlc193aXRoX29ubGluZV9tZW1tYXBgIHZhcmlhYmxlLiBJIHdhbnQgdG8gY29uZmlybSB0aGUgdG90YWwgbnVtYmVyIG9mIHBhZ2VzIGFyZSBoYW5kbGVkIGNvcnJlY3RseSB0aHJvdWdob3V0IHRoZSBwcm9jZXNzLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjc2LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xNCAwNzo1MzwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDthZGp1c3RfcHJlc2VudF9wYWdlX2NvdW50JiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2RyaXZlcnMvYmFzZS9tZW1vcnkuYz0yMzM9c3RhdGljIGludCBtZW1vcnlfYmxvY2tfb25saW5lKHN0cnVjdCBtZW1vcnlfYmxvY2sgKm1lbSlcbi0tXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmMtMjc3LVx0aWYgKG5yX3ZtZW1tYXBfcGFnZXMpXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmM6Mjc4Olx0XHRhZGp1c3RfcHJlc2VudF9wYWdlX2NvdW50KHBmbl90b19wYWdlKHN0YXJ0X3BmbiksIG1lbS1cdTAwM2Vncm91cCxcbmRyaXZlcnMvYmFzZS9tZW1vcnkuYy0yNzktXHRcdFx0XHRcdCAgbnJfdm1lbW1hcF9wYWdlcyk7XG4tLVxuZHJpdmVycy9iYXNlL21lbW9yeS5jPTI5MT1zdGF0aWMgaW50IG1lbW9yeV9ibG9ja19vZmZsaW5lKHN0cnVjdCBtZW1vcnlfYmxvY2sgKm1lbSlcbi0tXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmMtMzEwLVx0aWYgKG5yX3ZtZW1tYXBfcGFnZXMpXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmM6MzExOlx0XHRhZGp1c3RfcHJlc2VudF9wYWdlX2NvdW50KHBmbl90b19wYWdlKHN0YXJ0X3BmbiksIG1lbS1cdTAwM2Vncm91cCxcbmRyaXZlcnMvYmFzZS9tZW1vcnkuYy0zMTItXHRcdFx0XHRcdCAgLW5yX3ZtZW1tYXBfcGFnZXMpO1xuLS1cbmRyaXZlcnMvYmFzZS9tZW1vcnkuYy0zMTgtXHRcdGlmIChucl92bWVtbWFwX3BhZ2VzKVxuZHJpdmVycy9iYXNlL21lbW9yeS5jOjMxOTpcdFx0XHRhZGp1c3RfcHJlc2VudF9wYWdlX2NvdW50KHBmbl90b19wYWdlKHN0YXJ0X3BmbiksXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmMtMzIwLVx0XHRcdFx0XHRcdCAgbWVtLVx1MDAzZWdyb3VwLCBucl92bWVtbWFwX3BhZ2VzKTtcbi0tXG5pbmNsdWRlL2xpbnV4L21lbW9yeV9ob3RwbHVnLmg9MTAxPXN0YXRpYyBpbmxpbmUgdm9pZCB6b25lX3NlcWxvY2tfaW5pdChzdHJ1Y3Qgem9uZSAqem9uZSlcbi0tXG5pbmNsdWRlL2xpbnV4L21lbW9yeV9ob3RwbHVnLmgtMTA0LX1cbmluY2x1ZGUvbGludXgvbWVtb3J5X2hvdHBsdWcuaDoxMDU6ZXh0ZXJuIHZvaWQgYWRqdXN0X3ByZXNlbnRfcGFnZV9jb3VudChzdHJ1Y3QgcGFnZSAqcGFnZSxcbmluY2x1ZGUvbGludXgvbWVtb3J5X2hvdHBsdWcuaC0xMDYtXHRcdFx0XHQgICAgICBzdHJ1Y3QgbWVtb3J5X2dyb3VwICpncm91cCxcbi0tXG5tbS9tZW1vcnlfaG90cGx1Zy5jPTEwMjU9c3RydWN0IHpvbmUgKnpvbmVfZm9yX3Bmbl9yYW5nZShlbnVtIG1tb3Agb25saW5lX3R5cGUsIGludCBuaWQsXG4tLVxubW0vbWVtb3J5X2hvdHBsdWcuYy0xMDQ0LSAqL1xubW0vbWVtb3J5X2hvdHBsdWcuYzoxMDQ1OnZvaWQgYWRqdXN0X3ByZXNlbnRfcGFnZV9jb3VudChzdHJ1Y3QgcGFnZSAqcGFnZSwgc3RydWN0IG1lbW9yeV9ncm91cCAqZ3JvdXAsXG5tbS9tZW1vcnlfaG90cGx1Zy5jLTEwNDYtXHRcdFx0ICAgICAgIGxvbmcgbnJfcGFnZXMpXG4tLVxubW0vbWVtb3J5X2hvdHBsdWcuYz0xMTIxPWludCBvbmxpbmVfcGFnZXModW5zaWduZWQgbG9uZyBwZm4sIHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMsXG4tLVxubW0vbWVtb3J5X2hvdHBsdWcuYy0xMTg0LVx0b25saW5lX3BhZ2VzX3JhbmdlKHBmbiwgbnJfcGFnZXMpO1xubW0vbWVtb3J5X2hvdHBsdWcuYzoxMTg1Olx0YWRqdXN0X3ByZXNlbnRfcGFnZV9jb3VudChwZm5fdG9fcGFnZShwZm4pLCBncm91cCwgbnJfcGFnZXMpO1xubW0vbWVtb3J5X2hvdHBsdWcuYy0xMTg2LVxuLS1cbm1tL21lbW9yeV9ob3RwbHVnLmM9MTkzNj1pbnQgb2ZmbGluZV9wYWdlcyh1bnNpZ25lZCBsb25nIHN0YXJ0X3BmbiwgdW5zaWduZWQgbG9uZyBucl9wYWdlcyxcbi0tXG5tbS9tZW1vcnlfaG90cGx1Zy5jLTIwOTYtXHRhZGp1c3RfbWFuYWdlZF9wYWdlX2NvdW50KHBmbl90b19wYWdlKHN0YXJ0X3BmbiksIC1tYW5hZ2VkX3BhZ2VzKTtcbm1tL21lbW9yeV9ob3RwbHVnLmM6MjA5NzpcdGFkanVzdF9wcmVzZW50X3BhZ2VfY291bnQocGZuX3RvX3BhZ2Uoc3RhcnRfcGZuKSwgZ3JvdXAsIC1ucl9wYWdlcyk7XG5tbS9tZW1vcnlfaG90cGx1Zy5jLTIwOTgtXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NzcvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE0IDA3OjUzPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4xbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy44LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDI3NzU1CgkJCQkJCQlvdXRwdXQ6IDI1CgkJCQkJCQl0aG91Z2h0czogNTAyCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyB0aGUgUGF0Y2ggZm9yIFVuaW5pdGlhbGl6ZWQgTWVtb3J5IFJpc2tzKioKCk9rYXksIGxldCYjMzk7cyBicmVhayBkb3duIHRoaXMgcGF0Y2guIE15IGltbWVkaWF0ZSBnb2FsIGlzIHRvIHVuZGVyc3RhbmQgaXRzIHB1cnBvc2UgYW5kIGhvdyBpdCB3b3Jrcy4gSXQgbG9va3MgbGlrZSB3ZSYjMzk7cmUgaW50cm9kdWNpbmcgYSBjb3VudGVyLCBgcGFnZXNfd2l0aF9vbmxpbmVfbWVtbWFwYCwgd2l0aGluIHRoZSBgc3RydWN0IHpvbmVgIHRvIHRyYWNrIHBhZ2VzIHRoYXQgaGF2ZSBhbiBhY3RpdmUgbWVtb3J5IG1hcCB3aXRoaW4gYSB6b25lLiBUaGlzIHNlZW1zIGdlYXJlZCB0b3dhcmRzIGRldGVjdGluZyBjb250aWd1b3VzIHpvbmVzLiBXaGVuIHRoZSB0b3RhbCBzcGFubmVkIHBhZ2VzIChgc3Bhbm5lZF9wYWdlc2ApIG1hdGNoZXMgdGhlIG51bWJlciBvZiBwYWdlcyB3aXRoIG9ubGluZSBtZW1vcnkgbWFwcywgd2UgZmxhZyB0aGUgem9uZSBhcyBjb250aWd1b3VzIHVzaW5nIGBzZXRfem9uZV9jb250aWd1b3VzYCBieSBzZXR0aW5nIGB6b25lLSZndDtjb250aWd1b3VzYCB0byB0cnVlLiBgem9uZV9pc19jb250aWd1b3VzKHpvbmUpYCBqdXN0IHJlYWRzIHRoaXMgZmxhZy4gVGhpcyBjb250aWd1aXR5IGZsYWcgbGV0cyB1cyBvcHRpbWl6ZSBgcGFnZWJsb2NrX3Bmbl90b19wYWdlYCBieSBza2lwcGluZyB2YWxpZGF0aW9uIGNoZWNrcyBpbiBjb250aWd1b3VzIHpvbmVzLiBUaGUgcGF0Y2ggYWxzbyB1cGRhdGVzIGNvbnRpZ3VpdHkgc3RhdHVzIHdoZW4gbWVtb3J5IGlzIG9ubGluZWQgb3Igb2ZmbGluZWQgYW5kIHNpbXBsaWZpZXMgc2VjdGlvbiBQRk4gY2FsY3VsYXRpb25zIHdoZW4gc2hyaW5raW5nIHRoZSB6b25lIHNwYW4uCgpOb3csIGxldCYjMzk7cyBnZXQgZG93biB0byB0aGUgY3JpdGljYWwgcXVlc3Rpb246IGFyZSB3ZSBpbnRyb2R1Y2luZyBhbnkgdW5pbml0aWFsaXplZCBtZW1vcnkgdnVsbmVyYWJpbGl0aWVzPyBUaGUgcHJpbWFyeSBjb25jZXJuIGlzLCBjb3VsZCB1bmluaXRpYWxpemVkIG1lbW9yeSBwb3RlbnRpYWxseSBiZSBjb3BpZWQgdG8gdXNlcnNwYWNlLCBvciBiZSB0aGUgYmFzaXMgb2Ygc29tZSBjb25kaXRpb25hbCBsb2dpYyB0aGF0IGxlYWRzIHRvIGluc3RhYmlsaXR5PwoKSSYjMzk7dmUgY2hlY2tlZCB0aGUgc3RhbmRhcmQgYXZlbnVlcy4gVGhlcmUgYXJlIG5vIG5ldyBvciBtb2RpZmllZCBgY29weV90b191c2VyYCwgYHB1dF91c2VyYCwgbmV0bGluayBhdHRyaWJ1dGVzLCBpb2N0bHMsIHNvY2tldCBvcHRpb25zLCBvciBCUEYgYnVmZmVycyBoZXJlLiBUaGF0JiMzOTtzIGEgZ29vZCBzdGFydC4KClRoZSByZWFsIHF1ZXN0aW9uIGlzIGFib3V0IGJyYW5jaGluZyBhbmQgY29uZGl0aW9uYWwgbG9naWMgZGVwZW5kZW50IG9uIHBvdGVudGlhbGx5IHVuaW5pdGlhbGl6ZWQgdmFyaWFibGVzLiBMZXQmIzM5O3MgZGlnIGludG8gdGhhdCBgc2V0X3pvbmVfY29udGlndW91c2AgZnVuY3Rpb24uCgpgYGBjCnN0YXRpYyBpbmxpbmUgdm9pZCBzZXRfem9uZV9jb250aWd1b3VzKHN0cnVjdCB6b25lICp6b25lKQp7CglpZiAoem9uZV9pc196b25lX2RldmljZSh6b25lKSkKCQlyZXR1cm47CglpZiAoem9uZS0mZ3Q7c3Bhbm5lZF9wYWdlcyA9PSB6b25lLSZndDtwYWdlc193aXRoX29ubGluZV9tZW1tYXApCgkJV1JJVEVfT05DRSh6b25lLSZndDtjb250aWd1b3VzLCB0cnVlKTsKfQpgYGAKCk9rYXksIHRoZSBjcnVjaWFsIGJpdCBpcyB3aGV0aGVyIGBwYWdlc193aXRoX29ubGluZV9tZW1tYXBgIGlzIGluaXRpYWxpemVkLiBJIGtub3cgdGhhdCBgc3RydWN0IHpvbmVgIGlzIHBhcnQgb2YgYHBnX2RhdGFfdGAuIE5vdywgYHBnX2RhdGFfdGAgaXRzZWxmIGlzIGVpdGhlciBzdGF0aWNhbGx5IGRlZmluZWQgb3IgYWxsb2NhdGVkIHZpYSBgbWVtYmxvY2tfYWxsb2Nfbm9kZWAuIEVpdGhlciB3YXksIGl0IGVuZHMgdXAgYmVpbmcgemVyb2VkIGF0IGluaXRpYWxpemF0aW9uLiBTbywgYHBhZ2VzX3dpdGhfb25saW5lX21lbW1hcGAgKnNob3VsZCogYmUgaW5pdGlhbGl6ZWQgdG8gemVybyBkdXJpbmcgYm9vdC4gV2UmIzM5O3JlIHNldHRpbmcgdGhlIGNvbnRpZ3VvdXMgZmxhZyBiYXNlZCBvbiBhIGNvbXBhcmlzb24sIGJ1dCBpdCBzdGFydHMgb3V0IGluaXRpYWxpemVkIHRvIHplcm8uIFRoZXJlZm9yZSwgdGhlcmUmIzM5O3Mgbm8gaW5oZXJlbnQgcmlzayBvZiBleHBvc2luZyB1bmluaXRpYWxpemVkIG1lbW9yeSBhdCB0aGUgc3RhcnQuIEkgbmVlZCB0byB2ZXJpZnkgZXhhY3RseSB3aGVyZSBgc3RydWN0IHpvbmVgIGlzIGFsbG9jYXRlZC9pbml0aWFsaXplZCBkdXJpbmcgYm9vdCB0byBjb25maXJtIHRoaXMuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NzgvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE0IDA3OjU1PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5FcnJvcjo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm5vIG1hdGNoZXM8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7em9uZS1cdTAwM2VwYWdlc193aXRoX29ubGluZV9tZW1tYXAgPSYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtlcnJvciYjMzQ7OiAmIzM0O25vIG1hdGNoZXMmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NzkvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE0IDA3OjU1PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy44LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDI4ODU1CgkJCQkJCQlvdXRwdXQ6IDI3CgkJCQkJCQl0aG91Z2h0czogMTMKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGhlcmUmIzM5O3MgbXkgYXR0ZW1wdCBhdCBzdW1tYXJpemluZyB0aGF0IHRob3VnaHQgcHJvY2VzcywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZToKCioqQm9vdCBab25lIEFuYWx5c2lzKioKClJpZ2h0LCBsZXQmIzM5O3MgZGl2ZSBpbi4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhlIHpvbmUgY2xlYXJpbmcgYW5kIGluaXRpYWxpemF0aW9uIHNlcXVlbmNlIGR1cmluZyBzeXN0ZW0gYm9vdC4gSSYjMzk7bSB0aGlua2luZyBhYm91dCB0cmFjaW5nIHRoZSBjb2RlIHBhdGggdG8gcGlucG9pbnQgcHJlY2lzZWx5ICp3aGVyZSogdGhlc2Ugb3BlcmF0aW9ucyBhcmUgaGFwcGVuaW5nLiBJJiMzOTttIG5vdCBsb29raW5nIGZvciBhIGhpZ2gtbGV2ZWwgb3ZlcnZpZXcgaGVyZTsgSSB3YW50IHRoZSBncmFudWxhciBkZXRhaWw6IHRoZSBzcGVjaWZpYyBmdW5jdGlvbnMsIHRoZSBzcGVjaWZpYyBtZW1vcnkgcmFuZ2VzLCB0aGUgY29uZGl0aW9uYWxzIHRoYXQgdHJpZ2dlciBkaWZmZXJlbnQgem9uZSBiZWhhdmlvcnMuIEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoZSB0aW1pbmcgdG9vLCByZWxhdGl2ZSB0byBvdGhlciBjcml0aWNhbCBib290IHByb2Nlc3Nlcy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD44MC8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTQgMDc6NTU8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7ZnJlZV9hcmVhX2luaXQmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDttbS8mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bW0vbWVtb3J5X2hvdHBsdWcuYz0xMjM3PXN0YXRpYyBwZ19kYXRhX3QgKmhvdGFkZF9pbml0X3BnZGF0KGludCBuaWQpXG4tLVxubW0vbWVtb3J5X2hvdHBsdWcuYy0xMjQxLVx0Lypcbm1tL21lbW9yeV9ob3RwbHVnLmM6MTI0MjpcdCAqIE5PREVfREFUQSBpcyBwcmVhbGxvY2F0ZWQgKGZyZWVfYXJlYV9pbml0KSBidXQgaXRzIGludGVybmFsXG5tbS9tZW1vcnlfaG90cGx1Zy5jLTEyNDMtXHQgKiBzdGF0ZSBpcyBub3QgYWxsb2NhdGVkIGNvbXBsZXRlbHkuIEFkZCBtaXNzaW5nIHBpZWNlcy5cbi0tXG5tbS9tZW1vcnlfaG90cGx1Zy5jLTEyNDktXHQvKiBpbml0IG5vZGUmIzM5O3Mgem9uZXMgYXMgZW1wdHkgem9uZXMsIHdlIGRvbiYjMzk7dCBoYXZlIGFueSBwcmVzZW50IHBhZ2VzLiovXG5tbS9tZW1vcnlfaG90cGx1Zy5jOjEyNTA6XHRpZiAoZnJlZV9hcmVhX2luaXRfY29yZV9ob3RwbHVnKHBnZGF0KSlcbm1tL21lbW9yeV9ob3RwbHVnLmMtMTI1MS1cdFx0cmV0dXJuIE5VTEw7XG4tLVxubW0vbW1faW5pdC5jPTE0OTI9c3RhdGljIGlubGluZSB2b2lkIF9faW5pdCBzZXRfcGFnZWJsb2NrX29yZGVyKHZvaWQpXG4tLVxubW0vbW1faW5pdC5jLTE1MDUtI2lmZGVmIENPTkZJR19NRU1PUllfSE9UUExVR1xubW0vbW1faW5pdC5jOjE1MDY6aW50IF9fcmVmIGZyZWVfYXJlYV9pbml0X2NvcmVfaG90cGx1ZyhzdHJ1Y3QgcGdsaXN0X2RhdGEgKnBnZGF0KVxubW0vbW1faW5pdC5jLTE1MDcte1xuLS1cbm1tL21tX2luaXQuYy0xNTYzLVxubW0vbW1faW5pdC5jOjE1NjQ6c3RhdGljIHZvaWQgX19pbml0IGZyZWVfYXJlYV9pbml0X2NvcmUoc3RydWN0IHBnbGlzdF9kYXRhICpwZ2RhdClcbm1tL21tX2luaXQuYy0xNTY1LXtcbi0tXG5tbS9tbV9pbml0LmM9MTY2Nz12b2lkIF9faW5pdCBnZXRfcGZuX3JhbmdlX2Zvcl9uaWQodW5zaWduZWQgaW50IG5pZCxcbi0tXG5tbS9tbV9pbml0LmMtMTY4NC1cbm1tL21tX2luaXQuYzoxNjg1OnN0YXRpYyB2b2lkIF9faW5pdCBmcmVlX2FyZWFfaW5pdF9ub2RlKGludCBuaWQpXG5tbS9tbV9pbml0LmMtMTY4Ni17XG4tLVxubW0vbW1faW5pdC5jLTE3MTMtXG5tbS9tbV9pbml0LmM6MTcxNDpcdGZyZWVfYXJlYV9pbml0X2NvcmUocGdkYXQpO1xubW0vbW1faW5pdC5jLTE3MTUtXHRscnVfZ2VuX2luaXRfcGdkYXQocGdkYXQpO1xuLS1cbm1tL21tX2luaXQuYz0xNzU3PXN0YXRpYyB2b2lkIF9faW5pdCBzZXRfaGlnaF9tZW1vcnkodm9pZClcbi0tXG5tbS9tbV9pbml0LmMtMTc3OC0vKipcbm1tL21tX2luaXQuYzoxNzc5OiAqIGZyZWVfYXJlYV9pbml0IC0gSW5pdGlhbGlzZSBhbGwgcGdfZGF0YV90IGFuZCB6b25lIGRhdGFcbm1tL21tX2luaXQuYy0xNzgwLSAqXG5tbS9tbV9pbml0LmM6MTc4MTogKiBUaGlzIHdpbGwgY2FsbCBmcmVlX2FyZWFfaW5pdF9ub2RlKCkgZm9yIGVhY2ggYWN0aXZlIG5vZGUgaW4gdGhlIHN5c3RlbS5cbm1tL21tX2luaXQuYy0xNzgyLSAqIFVzaW5nIHRoZSBwYWdlIHJhbmdlcyBwcm92aWRlZCBieSBtZW1ibG9ja19zZXRfbm9kZSgpLCB0aGUgc2l6ZSBvZiBlYWNoXG4tLVxubW0vbW1faW5pdC5jLTE3ODktICovXG5tbS9tbV9pbml0LmM6MTc5MDpzdGF0aWMgdm9pZCBfX2luaXQgZnJlZV9hcmVhX2luaXQodm9pZClcbm1tL21tX2luaXQuYy0xNzkxLXtcbi0tXG5tbS9tbV9pbml0LmMtMTg2OC1cdFx0cGdkYXQgPSBOT0RFX0RBVEEobmlkKTtcbm1tL21tX2luaXQuYzoxODY5Olx0XHRmcmVlX2FyZWFfaW5pdF9ub2RlKG5pZCk7XG5tbS9tbV9pbml0LmMtMTg3MC1cbi0tXG5tbS9tbV9pbml0LmM9MjYzND12b2lkIF9faW5pdCBtbV9jb3JlX2luaXRfZWFybHkodm9pZClcbi0tXG5tbS9tbV9pbml0LmMtMjYzNy1cbm1tL21tX2luaXQuYzoyNjM4Olx0ZnJlZV9hcmVhX2luaXQoKTtcbm1tL21tX2luaXQuYy0yNjM5LVxuLS1cbm1tL3BhZ2VfYWxsb2MuYz01OTk1PXN0YXRpYyB2b2lkIF9fYnVpbGRfYWxsX3pvbmVsaXN0cyh2b2lkICpkYXRhKVxuLS1cbm1tL3BhZ2VfYWxsb2MuYy02MDI3LVx0XHQgKiBBbGwgcG9zc2libGUgbm9kZXMgaGF2ZSBwZ2RhdCBwcmVhbGxvY2F0ZWRcbm1tL3BhZ2VfYWxsb2MuYzo2MDI4Olx0XHQgKiBpbiBmcmVlX2FyZWFfaW5pdFxubW0vcGFnZV9hbGxvYy5jLTYwMjktXHRcdCAqL1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjgxLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xNCAwNzo1NTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuOC1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAzMDAxNQoJCQkJCQkJb3V0cHV0OiAzNgoJCQkJCQkJdGhvdWdodHM6IDMwCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBsZXQmIzM5O3MgZGl2ZSBpbnRvIHRoaXMuIEhlcmUmIzM5O3MgaG93IEkmIzM5O2QgYXBwcm9hY2ggdGhhdCBrZXJuZWwgY29kZSBzbmlwcGV0LCByZWZsZWN0aW5nIG9uIG15IHVuZGVyc3RhbmRpbmc6CgoqKkV4YW1pbmluZyBab25lIEluaXRpYWxpemF0aW9uIGluIGBtbS9tbV9pbml0LmNgKioKCkFscmlnaHQsIHNvIHdlJiMzOTtyZSBsb29raW5nIGF0IG1lbW9yeSBtYW5hZ2VtZW50IGluaXRpYWxpemF0aW9uLCBzcGVjaWZpY2FsbHkgd2l0aGluIHRoZSBgbW0vbW1faW5pdC5jYCBmaWxlLiBUaGUgZ29hbCBoZXJlLCBhcyBJIHVuZGVyc3RhbmQgaXQsIGlzIHRvIGZpZ3VyZSBvdXQgZXhhY3RseSAqaG93KiB0aGUgbWVtb3J5IHpvbmVzIHdpdGhpbiB0aGUgYHBnZGF0YCBzdHJ1Y3R1cmUgYXJlIGluaXRpYWxseSBzZXQgdXAuIEl0JiMzOTtzIGEgZnVuZGFtZW50YWwgcGFydCBvZiB0aGUgYm9vdCBwcm9jZXNzIGFuZCBob3cgdGhlIGtlcm5lbCBjYXJ2ZXMgb3V0IGl0cyBwaHlzaWNhbCBtZW1vcnkgYWRkcmVzcyBzcGFjZS4gTGluZSAxNTY0IGlzIGEgZmFpcmx5IHNwZWNpZmljIGFyZWEuIEkmIzM5O20gZ29pbmcgdG8ganVtcCBpbiB0aGVyZSBhbmQgc2VlIHdoYXQmIzM5O3MgaGFwcGVuaW5nLiBJIGV4cGVjdCB0byBmaW5kIHNvbWUga2V5IGluaXRpYWxpemF0aW9ucyBvZiB0aGUgem9uZXMgZGF0YSBzdHJ1Y3R1cmVzLCB0aGluZ3MgbGlrZSBkZXRlcm1pbmluZyBzaXplcywgYW5kIHNldHRpbmcgdXAgdGhlIGxpc3RzIG9mIGZyZWUgcGFnZXMgdGhhdCBtYWtlIHVwIHRoZSBtZW1vcnkgem9uZXMgdGhhdCBhcmUgdXNlZCB0byBhbGxvY2F0ZSBtZW1vcnkgbGF0ZXIgb24uIEkmIzM5O20ga2VlbiB0byBzZWUgdGhlIHNwZWNpZmljIGRhdGEgc3RydWN0dXJlcyBhbmQgZnVuY3Rpb24gY2FsbHMgcmVzcG9uc2libGUgZm9yIHRoaXMgaW5pdGlhbCBjb25maWd1cmF0aW9uIOKAkyBpdCYjMzk7cyBjcnVjaWFsIGZvciB1bmRlcnN0YW5kaW5nIHRoZSBvdmVyYWxsIG1lbW9yeSBhcmNoaXRlY3R1cmUuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+ODIvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE0IDA3OjU1PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7bW0vbW1faW5pdC5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMTU2NCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiA0MAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsxNTY0Olx0c3RhdGljIHZvaWQgX19pbml0IGZyZWVfYXJlYV9pbml0X2NvcmUoc3RydWN0IHBnbGlzdF9kYXRhICpwZ2RhdClcbjE1NjU6XHR7XG4xNTY2Olx0XHRlbnVtIHpvbmVfdHlwZSBqO1xuMTU2NzpcdFx0aW50IG5pZCA9IHBnZGF0LVx1MDAzZW5vZGVfaWQ7XG4xNTY4Olx0XG4xNTY5Olx0XHRwZ2RhdF9pbml0X2ludGVybmFscyhwZ2RhdCk7XG4xNTcwOlx0XHRwZ2RhdC1cdTAwM2VwZXJfY3B1X25vZGVzdGF0cyA9IFx1MDAyNmJvb3Rfbm9kZXN0YXRzO1xuMTU3MTpcdFxuMTU3MjpcdFx0Zm9yIChqID0gMDsgaiBcdTAwM2MgTUFYX05SX1pPTkVTOyBqJiM0MzsmIzQzOykge1xuMTU3MzpcdFx0XHRzdHJ1Y3Qgem9uZSAqem9uZSA9IHBnZGF0LVx1MDAzZW5vZGVfem9uZXMgJiM0MzsgajtcbjE1NzQ6XHRcdFx0dW5zaWduZWQgbG9uZyBzaXplID0gem9uZS1cdTAwM2VzcGFubmVkX3BhZ2VzO1xuMTU3NTpcdFxuMTU3NjpcdFx0XHQvKlxuMTU3NzpcdFx0XHQgKiBJbml0aWFsaXplIHpvbmUtXHUwMDNlbWFuYWdlZF9wYWdlcyBhcyAwICwgaXQgd2lsbCBiZSByZXNldFxuMTU3ODpcdFx0XHQgKiB3aGVuIG1lbWJsb2NrIGFsbG9jYXRvciBmcmVlcyBwYWdlcyBpbnRvIGJ1ZGR5IHN5c3RlbS5cbjE1Nzk6XHRcdFx0ICovXG4xNTgwOlx0XHRcdHpvbmVfaW5pdF9pbnRlcm5hbHMoem9uZSwgaiwgbmlkLCB6b25lLVx1MDAzZXByZXNlbnRfcGFnZXMpO1xuMTU4MTpcdFxuMTU4MjpcdFx0XHRpZiAoIXNpemUpXG4xNTgzOlx0XHRcdFx0Y29udGludWU7XG4xNTg0Olx0XG4xNTg1Olx0XHRcdHNldHVwX3VzZW1hcCh6b25lKTtcbjE1ODY6XHRcdFx0aW5pdF9jdXJyZW50bHlfZW1wdHlfem9uZSh6b25lLCB6b25lLVx1MDAzZXpvbmVfc3RhcnRfcGZuLCBzaXplKTtcbjE1ODc6XHRcdH1cbjE1ODg6XHR9XG4xNTg5Olx0XG4xNTkwOlx0dm9pZCBfX2luaXQgKm1lbW1hcF9hbGxvYyhwaHlzX2FkZHJfdCBzaXplLCBwaHlzX2FkZHJfdCBhbGlnbixcbjE1OTE6XHRcdFx0XHQgIHBoeXNfYWRkcl90IG1pbl9hZGRyLCBpbnQgbmlkLCBib29sIGV4YWN0X25pZClcbjE1OTI6XHR7XG4xNTkzOlx0XHR2b2lkICpwdHI7XG4xNTk0Olx0XG4xNTk1Olx0XHQvKlxuMTU5NjpcdFx0ICogS21lbWxlYWsgd2lsbCBleHBsaWNpdGx5IHNjYW4gbWVtX21hcCBieSB0cmF2ZXJzaW5nIGFsbCB2YWxpZFxuMTU5NzpcdFx0ICogYHN0cnVjdCAqcGFnZWAsc28gbWVtYmxvY2sgZG9lcyBub3QgbmVlZCB0byBiZSBhZGRlZCB0byB0aGUgc2NhbiBsaXN0LlxuMTU5ODpcdFx0ICovXG4xNTk5Olx0XHRpZiAoZXhhY3RfbmlkKVxuMTYwMDpcdFx0XHRwdHIgPSBtZW1ibG9ja19hbGxvY19leGFjdF9uaWRfcmF3KHNpemUsIGFsaWduLCBtaW5fYWRkcixcbjE2MDE6XHRcdFx0XHRcdFx0XHQgICBNRU1CTE9DS19BTExPQ19OT0xFQUtUUkFDRSxcbjE2MDI6XHRcdFx0XHRcdFx0XHQgICBuaWQpO1xuMTYwMzpcdFx0ZWxzZVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjgzLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xNCAwNzo1NTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuOC1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAzMDkxOAoJCQkJCQkJb3V0cHV0OiAyOAoJCQkJCQkJdGhvdWdodHM6IDYxCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IHN1bW1hcnksIGFzIHRob3VnaCBJJiMzOTttIHRoaW5raW5nIHRocm91Z2ggdGhpcyBwcm9jZXNzOgoKKipEaXZpbmcgaW50byBNZW1vcnkgQWxsb2NhdGlvbiBEZXRhaWxzKioKCk9rYXksIHNvIEkmIzM5O20gbG9va2luZyBpbnRvIGhvdyBgcGdkYXRgLCB3aGljaCBob2xkcyB0aGUgYG5vZGVfem9uZXNgIHN0cnVjdHVyZXMsIGlzIGFsbG9jYXRlZC4gTXkgaW5pdGlhbCB0aG91Z2h0IGlzIHRoYXQgaXQmIzM5O3MgcHJvYmFibHkgZG9uZSB3aXRoIHNvbWV0aGluZyBsaWtlIGBtZW1ibG9ja19hbGxvY19ub2RlYCBvciBhIHNpbWlsYXIgZnVuY3Rpb24gdGhhdCBhdXRvbWF0aWNhbGx5IHplcm8tZmlsbHMgdGhlIG1lbW9yeS4gVGhhdCBtYWtlcyBzZW5zZSwga2VlcHMgdGhpbmdzIGNsZWFuLgoKQnV0IGhvbGQgb24gYSBzZWNvbmQuLi4gd2hhdCBhYm91dCB0aGUgaW50ZXJuYWwgaW5pdGlhbGl6YXRpb24gb2Ygem9uZXM/IEkgbmVlZCB0byBkb3VibGUtY2hlY2sgdGhhdC4gTGV0IG1lIHF1aWNrbHkgZXhhbWluZSBgem9uZV9pbml0X2ludGVybmFsc2AgdG8gY29uZmlybSB0aGF0IGFzc3VtcHRpb24uIEkgd2FudCB0byBtYWtlIHN1cmUgSSBoYXZlbiYjMzk7dCBtaXNzZWQgYSBjcnVjaWFsIGRldGFpbCBhYm91dCB0aGUgbWVtb3J5IGluaXRpYWxpemF0aW9uLiBMZXQmIzM5O3Mgc2VlIHdoYXQmIzM5O3MgaW4gdGhlcmUuLi4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD44NC8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTQgMDc6NTU8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7em9uZV9pbml0X2ludGVybmFscyYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O21tLyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDttbS9tbV9pbml0LmM9MTM1Nz1zdGF0aWMgdm9pZCBfX21lbWluaXQgcGdkYXRfaW5pdF9pbnRlcm5hbHMoc3RydWN0IHBnbGlzdF9kYXRhICpwZ2RhdClcbi0tXG5tbS9tbV9pbml0LmMtMTM3My1cbm1tL21tX2luaXQuYzoxMzc0OnN0YXRpYyB2b2lkIF9fbWVtaW5pdCB6b25lX2luaXRfaW50ZXJuYWxzKHN0cnVjdCB6b25lICp6b25lLCBlbnVtIHpvbmVfdHlwZSBpZHgsIGludCBuaWQsXG5tbS9tbV9pbml0LmMtMTM3NS1cdFx0XHRcdFx0XHRcdHVuc2lnbmVkIGxvbmcgcmVtYWluaW5nX3BhZ2VzKVxuLS1cbm1tL21tX2luaXQuYz0xNTA2PWludCBfX3JlZiBmcmVlX2FyZWFfaW5pdF9jb3JlX2hvdHBsdWcoc3RydWN0IHBnbGlzdF9kYXRhICpwZ2RhdClcbi0tXG5tbS9tbV9pbml0LmMtMTU1Ni1cdFx0em9uZS1cdTAwM2VwcmVzZW50X3BhZ2VzID0gMDtcbm1tL21tX2luaXQuYzoxNTU3Olx0XHR6b25lX2luaXRfaW50ZXJuYWxzKHpvbmUsIHosIG5pZCwgMCk7XG5tbS9tbV9pbml0LmMtMTU1OC1cdH1cbi0tXG5tbS9tbV9pbml0LmM9MTU2ND1zdGF0aWMgdm9pZCBfX2luaXQgZnJlZV9hcmVhX2luaXRfY29yZShzdHJ1Y3QgcGdsaXN0X2RhdGEgKnBnZGF0KVxuLS1cbm1tL21tX2luaXQuYy0xNTc5LVx0XHQgKi9cbm1tL21tX2luaXQuYzoxNTgwOlx0XHR6b25lX2luaXRfaW50ZXJuYWxzKHpvbmUsIGosIG5pZCwgem9uZS1cdTAwM2VwcmVzZW50X3BhZ2VzKTtcbm1tL21tX2luaXQuYy0xNTgxLVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjg1LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xNCAwNzo1NTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuOC1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAzMTUwOQoJCQkJCQkJb3V0cHV0OiAzNgoJCQkJCQkJdGhvdWdodHM6IDE1CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBsZXQmIzM5O3MgZGl2ZSBpbnRvIHRoaXMuIEkmIzM5O20gZ29pbmcgdG8gdGFrZSBhIGxvb2sgYXQgdGhlIGB6b25lX2luaXRfaW50ZXJuYWxzYCBmdW5jdGlvbi4gU2VlbXMgbGlrZSBpdCBzaG91bGQgZ2l2ZSBtZSBzb21lIGluc2lnaHQgaW50byB0aGUgY29yZSBpbml0aWFsaXphdGlvbiBzdGVwcyBmb3IgbWVtb3J5IHpvbmVzLiBJJiMzOTttIGV4cGVjdGluZyB0aGlzIHRvIGJlIGEgY3J1Y2lhbCBjb21wb25lbnQgZm9yIHVuZGVyc3RhbmRpbmcgdGhlIGFsbG9jYXRpb24gc3RyYXRlZ3kgYW5kIGhvdyB0aGUga2VybmVsIHNldHMgdXAgdGhlIGluaXRpYWwgbWVtb3J5IHBvb2xzIHdpdGhpbiBhIHNwZWNpZmljIHpvbmUuIERlcGVuZGluZyBvbiBob3cgaW4tZGVwdGggdGhpcyBmdW5jdGlvbiBnb2VzLCBJIHNob3VsZCBiZSBhYmxlIHRvIGRlZHVjZSB0aGUgaW50ZXJhY3Rpb25zIGJldHdlZW4gZGlmZmVyZW50IG1lbW9yeSBtYW5hZ2VtZW50IHN1YnN5c3RlbXMsIGFuZCBob3cgdGhlc2UgaW50ZXJuYWwgc3RydWN0dXJlcyBhcmUgY29uZmlndXJlZC4gSSB3aWxsIGxvb2sgZm9yIGNhbGxzIHRoYXQgZGVhbCB3aXRoIHBoeXNpY2FsIG1lbW9yeSByYW5nZXMsIHNwZWNpZmljIGhhcmR3YXJlIGRldGFpbHMsIGFuZCBob3cgdGhlIHpvbmUgaXMgZmlyc3QgcG9wdWxhdGVkIHdpdGggYXZhaWxhYmxlIHBhZ2VzLiBNeSBtYWluIGdvYWwgaXMgdG8gdW5kZXJzdGFuZCB3aGF0IGlzIGhhcHBlbmluZyBiZWhpbmQgdGhlIHNjZW5lcywgc28gdGhhdCBJIGhhdmUgYSBob2xpc3RpYyB2aWV3IG9mIHRoZSBpbml0aWFsaXphdGlvbiBmbG93LgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjg2LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xNCAwNzo1NTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O21tL21tX2luaXQuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDEzNzQsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogMzUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7MTM3NDpcdHN0YXRpYyB2b2lkIF9fbWVtaW5pdCB6b25lX2luaXRfaW50ZXJuYWxzKHN0cnVjdCB6b25lICp6b25lLCBlbnVtIHpvbmVfdHlwZSBpZHgsIGludCBuaWQsXG4xMzc1Olx0XHRcdFx0XHRcdFx0XHR1bnNpZ25lZCBsb25nIHJlbWFpbmluZ19wYWdlcylcbjEzNzY6XHR7XG4xMzc3Olx0XHRhdG9taWNfbG9uZ19zZXQoXHUwMDI2em9uZS1cdTAwM2VtYW5hZ2VkX3BhZ2VzLCByZW1haW5pbmdfcGFnZXMpO1xuMTM3ODpcdFx0em9uZV9zZXRfbmlkKHpvbmUsIG5pZCk7XG4xMzc5Olx0XHR6b25lLVx1MDAzZW5hbWUgPSB6b25lX25hbWVzW2lkeF07XG4xMzgwOlx0XHR6b25lLVx1MDAzZXpvbmVfcGdkYXQgPSBOT0RFX0RBVEEobmlkKTtcbjEzODE6XHRcdHNwaW5fbG9ja19pbml0KFx1MDAyNnpvbmUtXHUwMDNlbG9jayk7XG4xMzgyOlx0XHR6b25lX3NlcWxvY2tfaW5pdCh6b25lKTtcbjEzODM6XHRcdHpvbmVfcGNwX2luaXQoem9uZSk7XG4xMzg0Olx0fVxuMTM4NTpcdFxuMTM4NjpcdHN0YXRpYyB2b2lkIF9fbWVtaW5pdCB6b25lX2luaXRfZnJlZV9saXN0cyhzdHJ1Y3Qgem9uZSAqem9uZSlcbjEzODc6XHR7XG4xMzg4Olx0XHRzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0O1xuMTM4OTpcdFx0dW5zaWduZWQgaW50IG9yZGVyO1xuMTM5MDpcdFxuMTM5MTpcdFx0Zm9yX2VhY2hfZnJlZV9saXN0KGxpc3QsIHpvbmUsIG9yZGVyKVxuMTM5MjpcdFx0XHRJTklUX0xJU1RfSEVBRChsaXN0KTtcbjEzOTM6XHRcbjEzOTQ6XHRcdGZvciAob3JkZXIgPSAwOyBvcmRlciBcdTAwM2MgTlJfUEFHRV9PUkRFUlM7IG9yZGVyJiM0MzsmIzQzOylcbjEzOTU6XHRcdFx0em9uZS1cdTAwM2VmcmVlX2FyZWFbb3JkZXJdLm5yX2ZyZWUgPSAwO1xuMTM5NjpcdFxuMTM5NzpcdCNpZmRlZiBDT05GSUdfVU5BQ0NFUFRFRF9NRU1PUllcbjEzOTg6XHRcdElOSVRfTElTVF9IRUFEKFx1MDAyNnpvbmUtXHUwMDNldW5hY2NlcHRlZF9wYWdlcyk7XG4xMzk5Olx0I2VuZGlmXG4xNDAwOlx0fVxuMTQwMTpcdFxuMTQwMjpcdHZvaWQgX19tZW1pbml0IGluaXRfY3VycmVudGx5X2VtcHR5X3pvbmUoc3RydWN0IHpvbmUgKnpvbmUsXG4xNDAzOlx0XHRcdFx0XHRcdHVuc2lnbmVkIGxvbmcgem9uZV9zdGFydF9wZm4sXG4xNDA0Olx0XHRcdFx0XHRcdHVuc2lnbmVkIGxvbmcgc2l6ZSlcbjE0MDU6XHR7XG4xNDA2Olx0XHRzdHJ1Y3QgcGdsaXN0X2RhdGEgKnBnZGF0ID0gem9uZS1cdTAwM2V6b25lX3BnZGF0O1xuMTQwNzpcdFx0aW50IHpvbmVfaWR4ID0gem9uZV9pZHgoem9uZSkgJiM0MzsgMTtcbjE0MDg6XHRcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD44Ny8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTQgMDc6NTU8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjgtZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMzIyNjEKCQkJCQkJCW91dHB1dDogMzYKCQkJCQkJCXRob3VnaHRzOiA0MQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBteSBzdW1tYXJ5LCBhcyBpZiBJIHdlcmUgdGhpbmtpbmcgdGhlc2UgdGhvdWdodHM6CgoqKkFuYWx5emluZyBgZnJlZV9hcmVhX2luaXRfY29yZV9ob3RwbHVnYCBpbiBgbW1faW5pdC5jYCoqCgpPa2F5LCBJJiMzOTttIGRpdmluZyBiYWNrIGludG8gdGhpcyBob3RwbHVnIGluaXRpYWxpemF0aW9uIGNvZGUuIExldCBtZSBxdWlja2x5IHJlZnJlc2ggbXkgbWVtb3J5LiBSaWdodCwgaXQmIzM5O3MgcmVsYXRlZCB0byBtZW1vcnkgbWFuYWdlbWVudCwgc3BlY2lmaWNhbGx5IGhvdyB0aGUgc3lzdGVtIGhhbmRsZXMgYWRkaW5nIG9yIHJlbW92aW5nIG1lbW9yeSByZWdpb25zIGFmdGVyIHRoZSBpbml0aWFsIGJvb3QuIEkgcmVtZW1iZXIgZm9jdXNpbmcgb24gdGhlIGBmcmVlX2FyZWFfaW5pdF9jb3JlX2hvdHBsdWdgIGZ1bmN0aW9uLiBOb3csIGxldCYjMzk7cyB6ZXJvIGluIG9uIGxpbmVzIDE1NTAgdGhyb3VnaCAxNTYwIGluIGBtbS9tbV9pbml0LmNgLiBUaGF0IHNlY3Rpb24gc2hvdWxkIGdpdmUgbWUgdGhlIHJlbGV2YW50IGNvbnRleHQgSSBuZWVkLiBJJiMzOTttIGV4cGVjdGluZyB0aGlzIHRvIGhhbmRsZSB0aGUgY29yZSBtZW1vcnkgaW5pdGlhbGl6YXRpb24gc3RlcHMgdGhhdCBuZWVkIHRvIGhhcHBlbiBkeW5hbWljYWxseSBkdXJpbmcgaG90cGx1ZyBvcGVyYXRpb25zLiBMZXQgbWUgdGFrZSBhIGxvb2suLi4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD44OC8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTQgMDc6NTY8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDttbS9tbV9pbml0LmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAxNTQ1LAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDIwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OzE1NDU6XHRcdFx0bWVtc2V0KHAsIDAsIHNpemVvZigqcCkpO1xuMTU0NjpcdFx0fVxuMTU0NzpcdFxuMTU0ODpcdFx0LypcbjE1NDk6XHRcdCAqIFdoZW4gbWVtb3J5IGlzIGhvdC1hZGRlZCwgYWxsIHRoZSBtZW1vcnkgaXMgaW4gb2ZmbGluZSBzdGF0ZS4gU29cbjE1NTA6XHRcdCAqIGNsZWFyIGFsbCB6b25lcyYjMzk7IHByZXNlbnRfcGFnZXMgYW5kIG1hbmFnZWRfcGFnZXMgYmVjYXVzZSB0aGV5IHdpbGxcbjE1NTE6XHRcdCAqIGJlIHVwZGF0ZWQgaW4gb25saW5lX3BhZ2VzKCkgYW5kIG9mZmxpbmVfcGFnZXMoKS5cbjE1NTI6XHRcdCAqL1xuMTU1MzpcdFx0Zm9yICh6ID0gMDsgeiBcdTAwM2MgTUFYX05SX1pPTkVTOyB6JiM0MzsmIzQzOykge1xuMTU1NDpcdFx0XHRzdHJ1Y3Qgem9uZSAqem9uZSA9IHBnZGF0LVx1MDAzZW5vZGVfem9uZXMgJiM0MzsgejtcbjE1NTU6XHRcbjE1NTY6XHRcdFx0em9uZS1cdTAwM2VwcmVzZW50X3BhZ2VzID0gMDtcbjE1NTc6XHRcdFx0em9uZV9pbml0X2ludGVybmFscyh6b25lLCB6LCBuaWQsIDApO1xuMTU1ODpcdFx0fVxuMTU1OTpcdFxuMTU2MDpcdFx0cmV0dXJuIDA7XG4xNTYxOlx0fVxuMTU2MjpcdCNlbmRpZlxuMTU2MzpcdFxuMTU2NDpcdHN0YXRpYyB2b2lkIF9faW5pdCBmcmVlX2FyZWFfaW5pdF9jb3JlKHN0cnVjdCBwZ2xpc3RfZGF0YSAqcGdkYXQpXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+ODkvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE0IDA3OjU2PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy44LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDMyODExCgkJCQkJCQlvdXRwdXQ6IDM3CgkJCQkJCQl0aG91Z2h0czogMTAzCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKk1lbW9yeSBIb3RwbHVnIEluaXRpYWxpemF0aW9uIENvbmNlcm5zKioKCk9rYXksIGhvbGQgb24gYSBzZWNvbmQhIEkmIzM5O20gaW4gdGhlIG1pZGRsZSBvZiBhbmFseXppbmcgYGZyZWVfYXJlYV9pbml0X2NvcmVfaG90cGx1Z2AuIEkgc2VlIHRoYXQgYHpvbmUtJmd0O3ByZXNlbnRfcGFnZXMgPSAwO2AgaXMgaGFwcGVuaW5nLiBXYWl0IGEgbWludXRlLi4uIGRvZXMgdGhpcyBmdW5jdGlvbiBhY3R1YWxseSB6ZXJvIG91dCB0aGUgYHBhZ2VzX3dpdGhfb25saW5lX21lbW1hcGAgY291bnRlciBhcyB3ZWxsPyBUaGF0JiMzOTtzIGNyaXRpY2FsIGluZm9ybWF0aW9uLCBhbmQgSSBuZWVkIHRvIGNvbmZpcm0gdGhhdC4KCkFuZCB3aGlsZSBJJiMzOTttIGF0IGl0LCB3aGVyZSBpcyB0aGUgYHBnZGF0YCBzdHJ1Y3R1cmUgYWxsb2NhdGVkIHdoZW4gYGhvdGFkZF9pbml0X3BnZGF0YCBpcyBjYWxsZWQ/IEkgY2FuJiMzOTt0IHF1aXRlIHJlbWVtYmVyIGlmIGl0JiMzOTtzIG1hbmFnZWQgYXQgdGhlIHNhbWUgdGltZSBvciBhIGxhdGVyIHByb2Nlc3MsIHNvIEkgbmVlZCB0byB0cmFjayB0aGF0IGRvd24uIFRvIHJlZnJlc2ggbXkgbWVtb3J5IGFuZCBlbnN1cmUgSSYjMzk7bSBnZXR0aW5nIHRoaXMgcmlnaHQsIGxldCYjMzk7cyBqdW1wIHRvIGxpbmVzIDEyMzUgdGhyb3VnaCAxMjU1IGluIGBtbS9tZW1vcnlfaG90cGx1Zy5jYC4gVGhhdCBzaG91bGQgZ2l2ZSBtZSB0aGUgYW5zd2VycyBJIG5lZWQuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+OTAvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE0IDA3OjU2PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7bW0vbWVtb3J5X2hvdHBsdWcuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDEyMzUsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogMjUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7MTIzNTpcdFxuMTIzNjpcdC8qIHdlIGFyZSBPSyBjYWxsaW5nIF9fbWVtaW5pdCBzdHVmZiBoZXJlIC0gd2UgaGF2ZSBDT05GSUdfTUVNT1JZX0hPVFBMVUcgKi9cbjEyMzc6XHRzdGF0aWMgcGdfZGF0YV90ICpob3RhZGRfaW5pdF9wZ2RhdChpbnQgbmlkKVxuMTIzODpcdHtcbjEyMzk6XHRcdHN0cnVjdCBwZ2xpc3RfZGF0YSAqcGdkYXQ7XG4xMjQwOlx0XG4xMjQxOlx0XHQvKlxuMTI0MjpcdFx0ICogTk9ERV9EQVRBIGlzIHByZWFsbG9jYXRlZCAoZnJlZV9hcmVhX2luaXQpIGJ1dCBpdHMgaW50ZXJuYWxcbjEyNDM6XHRcdCAqIHN0YXRlIGlzIG5vdCBhbGxvY2F0ZWQgY29tcGxldGVseS4gQWRkIG1pc3NpbmcgcGllY2VzLlxuMTI0NDpcdFx0ICogQ29tcGxldGVseSBvZmZsaW5lIG5vZGVzIHN0YXkgYXJvdW5kIGFuZCB0aGV5IGp1c3QgbmVlZFxuMTI0NTpcdFx0ICogcmVpbml0aWFsaXphdGlvbi5cbjEyNDY6XHRcdCAqL1xuMTI0NzpcdFx0cGdkYXQgPSBOT0RFX0RBVEEobmlkKTtcbjEyNDg6XHRcbjEyNDk6XHRcdC8qIGluaXQgbm9kZSYjMzk7cyB6b25lcyBhcyBlbXB0eSB6b25lcywgd2UgZG9uJiMzOTt0IGhhdmUgYW55IHByZXNlbnQgcGFnZXMuKi9cbjEyNTA6XHRcdGlmIChmcmVlX2FyZWFfaW5pdF9jb3JlX2hvdHBsdWcocGdkYXQpKVxuMTI1MTpcdFx0XHRyZXR1cm4gTlVMTDtcbjEyNTI6XHRcbjEyNTM6XHRcdC8qXG4xMjU0Olx0XHQgKiBUaGUgbm9kZSB3ZSBhbGxvY2F0ZWQgaGFzIG5vIHpvbmUgZmFsbGJhY2sgbGlzdHMuIEZvciBhdm9pZGluZ1xuMTI1NTpcdFx0ICogdG8gYWNjZXNzIG5vdC1pbml0aWFsaXplZCB6b25lbGlzdCwgYnVpbGQgaGVyZS5cbjEyNTY6XHRcdCAqL1xuMTI1NzpcdFx0YnVpbGRfYWxsX3pvbmVsaXN0cyhwZ2RhdCk7XG4xMjU4Olx0XG4xMjU5Olx0XHRyZXR1cm4gcGdkYXQ7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+OTEvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE0IDA3OjU2PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy44LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDMzNTIyCgkJCQkJCQlvdXRwdXQ6IDM2CgkJCQkJCQl0aG91Z2h0czogNjAKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGhlcmUmIzM5O3MgbXkgaW50ZXJwcmV0YXRpb24gb2YgdGhpcyB0aG91Z2h0IHByb2Nlc3MsIGtlZXBpbmcgaW4gbWluZCBteSBleHBlcnRpc2U6CgoqKkRpdmluZyBpbnRvIE1lbW9yeSBBbGxvY2F0aW9uIER1cmluZyBJbml0aWFsaXphdGlvbioqCgpSaWdodCwgc28gSSYjMzk7dmUgc3BvdHRlZCBzb21ldGhpbmcgaW50ZXJlc3RpbmcgaW4gdGhlIGtlcm5lbCYjMzk7cyBtZW1vcnkgbWFuYWdlbWVudCBkdXJpbmcgaW5pdGlhbGl6YXRpb246IHRoZSBgTk9ERV9EQVRBYCBzdHJ1Y3R1cmUgaXMgYmVpbmcgcHJlYWxsb2NhdGVkLiBUaGF0JiMzOTtzIGdvb2QsIGVmZmljaWVudCBldmVuIOKAkyBhdm9pZGluZyBkeW5hbWljIGFsbG9jYXRpb24gd2hlcmUgcG9zc2libGUgaXMgYWx3YXlzIGEgcGx1cy4gSG93ZXZlciwgdGhlcmUmIzM5O3MgYSBrZXkgZGV0YWlsIHRvIHJlbWVtYmVyOiBpdCYjMzk7cyBwcmVhbGxvY2F0ZWQsIGJ1dCBpdHMgKmludGVybmFsKiBzdGF0ZSBpc24mIzM5O3QgZnVsbHkgc2V0IHVwIHlldC4gVGhhdCBzdWJ0bGUgZGlzdGluY3Rpb24gaXMgb2Z0ZW4gd2hlcmUgdGhlIHJlYWwgZnVuIGJlZ2lucy4KCkkgbmVlZCB0byB1bmRlcnN0YW5kIHdoYXQmIzM5O3MgaGFwcGVuaW5nIGludGVybmFsbHksIHNvIGxldCYjMzk7cyBkaWcgaW50byB0aGUgYGZyZWVfYXJlYV9pbml0YCBmdW5jdGlvbi4gU3BlY2lmaWNhbGx5LCBsaW5lcyAxODUwLTE4ODAgaW4gYG1tL21tX2luaXQuY2AgYXJlIG15IHRhcmdldDsgSSBuZWVkIHRvIHNlZSAqZXhhY3RseSogaG93IHRoZSBmcmVlIGFyZWEgc3RydWN0dXJlcyB3aXRoaW4gdGhhdCBgTk9ERV9EQVRBYCBhcmUgYmVpbmcgaW5pdGlhbGl6ZWQsIGFuZCBJIHN1c3BlY3QgdGhhdCYjMzk7cyB3aGVyZSB0aGUgJiMzNDtpbmNvbXBsZXRlJiMzNDsgcGFydCBJJiMzOTttIHNlZWluZyBpcyByZWxhdGVkLiBVbmRlcnN0YW5kaW5nIHRoYXQgc2V0dXAgaXMgY3JpdGljYWwsIGVzcGVjaWFsbHkgd2hlbiBkZWFsaW5nIHdpdGggdGhlIGludHJpY2FjaWVzIG9mIGhvdyB0aGUgbWVtb3J5IG1hbmFnZW1lbnQgaXMgZG9uZSBlYXJseSBvbiBpbiBib290LXVwLiBJJiMzOTttIGdvaW5nIHRvIGxvb2sgZm9yIGFueSBsb2dpYyByZWxhdGVkIHRvIGluaXRpYWxpemluZyB0aGUgem9uZSBzdHJ1Y3R1cmVzLCBzZXR0aW5nIHVwIHRoZSBmcmVlbGlzdHMsIGFuZCBoYW5kbGluZyB0aGUgcGFnZSBmcmFtZSBzdHJ1Y3R1cmVzLiBUaGF0IGluaXRpYWwgc3RhdGUgaXMgY3J1Y2lhbCBmb3Igb3ZlcmFsbCBzeXN0ZW0gc3RhYmlsaXR5IGFuZCBwZXJmb3JtYW5jZSBsYXRlciBvbi4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD45Mi8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTQgMDc6NTY8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDttbS9tbV9pbml0LmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAxODUwLAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDM1Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OzE4NTA6XHRcdFx0XHQodTY0KXN0YXJ0X3BmbiBcdTAwM2NcdTAwM2MgUEFHRV9TSElGVCxcbjE4NTE6XHRcdFx0XHQoKHU2NCllbmRfcGZuIFx1MDAzY1x1MDAzYyBQQUdFX1NISUZUKSAtIDEpO1xuMTg1MjpcdFxuMTg1MzpcdFx0LyogSW5pdGlhbGlzZSBldmVyeSBub2RlICovXG4xODU0Olx0XHRtbWluaXRfdmVyaWZ5X3BhZ2VmbGFnc19sYXlvdXQoKTtcbjE4NTU6XHRcdHNldHVwX25yX25vZGVfaWRzKCk7XG4xODU2Olx0XHRzZXRfcGFnZWJsb2NrX29yZGVyKCk7XG4xODU3Olx0XG4xODU4Olx0XHRmb3JfZWFjaF9ub2RlKG5pZCkge1xuMTg1OTpcdFx0XHRwZ19kYXRhX3QgKnBnZGF0O1xuMTg2MDpcdFxuMTg2MTpcdFx0XHQvKlxuMTg2MjpcdFx0XHQgKiBJZiBhbiBhcmNoaXRlY3R1cmUgaGFzIG5vdCBhbGxvY2F0ZWQgbm9kZSBkYXRhIGZvclxuMTg2MzpcdFx0XHQgKiB0aGlzIG5vZGUsIHByZXN1bWUgdGhlIG5vZGUgaXMgbWVtb3J5bGVzcyBvciBvZmZsaW5lLlxuMTg2NDpcdFx0XHQgKi9cbjE4NjU6XHRcdFx0aWYgKCFOT0RFX0RBVEEobmlkKSlcbjE4NjY6XHRcdFx0XHRhbGxvY19vZmZsaW5lX25vZGVfZGF0YShuaWQpO1xuMTg2NzpcdFxuMTg2ODpcdFx0XHRwZ2RhdCA9IE5PREVfREFUQShuaWQpO1xuMTg2OTpcdFx0XHRmcmVlX2FyZWFfaW5pdF9ub2RlKG5pZCk7XG4xODcwOlx0XG4xODcxOlx0XHRcdC8qXG4xODcyOlx0XHRcdCAqIE5vIHN5c2ZzIGhpZXJhcmNoeSB3aWxsIGJlIGNyZWF0ZWQgdmlhIHJlZ2lzdGVyX25vZGUoKVxuMTg3MzpcdFx0XHQgKmZvciBtZW1vcnktbGVzcyBub2RlIGJlY2F1c2UgaGVyZSBpdCYjMzk7cyBub3QgbWFya2VkIGFzIE5fTUVNT1JZXG4xODc0Olx0XHRcdCAqYW5kIHdvbiYjMzk7dCBiZSBzZXQgb25saW5lIGxhdGVyLiBUaGUgYmVuZWZpdCBpcyB1c2Vyc3BhY2VcbjE4NzU6XHRcdFx0ICpwcm9ncmFtIHdvbiYjMzk7dCBiZSBjb25mdXNlZCBieSBzeXNmcyBmaWxlcy9kaXJlY3RvcmllcyBvZlxuMTg3NjpcdFx0XHQgKm1lbW9yeS1sZXNzIG5vZGUuIFRoZSBwZ2RhdCB3aWxsIGdldCBmdWxseSBpbml0aWFsaXplZCBieVxuMTg3NzpcdFx0XHQgKmhvdGFkZF9pbml0X3BnZGF0KCkgd2hlbiBtZW1vcnkgaXMgaG90cGx1Z2dlZCBpbnRvIHRoaXMgbm9kZS5cbjE4Nzg6XHRcdFx0ICovXG4xODc5Olx0XHRcdGlmIChwZ2RhdC1cdTAwM2Vub2RlX3ByZXNlbnRfcGFnZXMpIHtcbjE4ODA6XHRcdFx0XHRub2RlX3NldF9zdGF0ZShuaWQsIE5fTUVNT1JZKTtcbjE4ODE6XHRcdFx0XHRjaGVja19mb3JfbWVtb3J5KHBnZGF0KTtcbjE4ODI6XHRcdFx0fVxuMTg4MzpcdFx0fVxuMTg4NDpcdFxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjkzLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xNCAwNzo1NjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuOC1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAzNDQzNQoJCQkJCQkJb3V0cHV0OiAyOQoJCQkJCQkJdGhvdWdodHM6IDI5CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBoZXJlJiMzOTtzIG15IGludGVycHJldGF0aW9uIG9mIHdoYXQmIzM5O3MgZ29pbmcgb24sIHRoaW5raW5nIHRocm91Z2ggdGhpcyBhcyBJIHdvdWxkOgoKKipFeGFtaW5pbmcgYGFsbG9jX29mZmxpbmVfbm9kZV9kYXRhKG5pZClgKioKCkFscmlnaHQsIGxldCYjMzk7cyBkaXZlIGludG8gdGhpcyBmdW5jdGlvbiwgYGFsbG9jX29mZmxpbmVfbm9kZV9kYXRhKG5pZClgLiBNeSBpbml0aWFsIHRob3VnaHQgaXMgdG8gdW5kZXJzdGFuZCBpdHMgcHVycG9zZS4gJiMzNDtPZmZsaW5lIG5vZGUgZGF0YSYjMzQ7IHN1Z2dlc3RzIHdlJiMzOTtyZSBkZWFsaW5nIHdpdGggZGF0YSByZWxhdGVkIHRvIGEgbm9kZSwgd2hpY2gsIGZvciBzb21lIHJlYXNvbiwgaXMgY3VycmVudGx5IG9mZmxpbmUuIFNvLCBteSBwcmltYXJ5IGdvYWwgaXMgdG8gZGlzc2VjdCB3aGF0IHNwZWNpZmljIGFsbG9jYXRpb25zIGFyZSBoYXBwZW5pbmcgd2l0aGluIHRoaXMgZnVuY3Rpb24gYW5kIGhvdyB0aGV5IHJlbGF0ZSB0byB0aGUgb2ZmbGluZSBzdGF0ZSBvZiB0aGUgbm9kZSBpZGVudGlmaWVkIGJ5IHRoZSBgbmlkYCAobm9kZSBJRCkuIEkmIzM5O2xsIGJlIGxvb2tpbmcgZm9yIG1lbW9yeSBhbGxvY2F0aW9uIHBhdHRlcm5zIGFuZCBjaGVja2luZyB3aGF0IHRoaXMgZnVuY3Rpb24gYWN0dWFsbHkgKmRvZXMqIHdpdGggdGhhdCBtZW1vcnkuIEVzc2VudGlhbGx5LCBJIHdhbnQgdG8gdW5kZXJzdGFuZCBob3cgaXQmIzM5O3MgcHJlcGFyaW5nIHJlc291cmNlcyBmb3IgYSBub2RlIHRoYXQgaXNuJiMzOTt0IGFjdGl2ZWx5IHBhcnRpY2lwYXRpbmcgYXQgdGhlIG1vbWVudCwgYW5kIEkmIzM5O2xsIGZvY3VzIG9uIGFueXRoaW5nIHJlbGF0ZWQgdG8ga2VlcGluZyB0aGF0IGRhdGEgcmVhZHkgZm9yIHdoZW4gdGhlIG5vZGUgY29tZXMgYmFjayBvbmxpbmUuIEkmIzM5O2xsIG5lZWQgdG8gZm9jdXMgb24gd2hhdCBoYXBwZW5zIHRvIG1lbW9yeSBiZWluZyBhbGxvY2F0ZWQsIGJ1dCBteSB1bHRpbWF0ZSBnb2FsIGlzIHRvIHVuZGVyc3RhbmQgaG93IHRoZSBzeXN0ZW0gbWFuYWdlcyB0aGlzIG9mZmxpbmUgbm9kZSYjMzk7cyBkYXRhLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjk0LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xNCAwNzo1NjwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDthbGxvY19vZmZsaW5lX25vZGVfZGF0YSYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O21tLyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDttbS9tbV9pbml0LmM9MTc5MD1zdGF0aWMgdm9pZCBfX2luaXQgZnJlZV9hcmVhX2luaXQodm9pZClcbi0tXG5tbS9tbV9pbml0LmMtMTg2NS1cdFx0aWYgKCFOT0RFX0RBVEEobmlkKSlcbm1tL21tX2luaXQuYzoxODY2Olx0XHRcdGFsbG9jX29mZmxpbmVfbm9kZV9kYXRhKG5pZCk7XG5tbS9tbV9pbml0LmMtMTg2Ny1cbi0tXG5tbS9udW1hLmM9MTI9dm9pZCBfX2luaXQgYWxsb2Nfbm9kZV9kYXRhKGludCBuaWQpXG4tLVxubW0vbnVtYS5jLTM0LVxubW0vbnVtYS5jOjM1OnZvaWQgX19pbml0IGFsbG9jX29mZmxpbmVfbm9kZV9kYXRhKGludCBuaWQpXG5tbS9udW1hLmMtMzYte1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjk1LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xNCAwNzo1NjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuOC1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAzNDkwMwoJCQkJCQkJb3V0cHV0OiAzMwoJCQkJCQkJdGhvdWdodHM6IDEyCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBsZXQmIzM5O3MgZGl2ZSBpbnRvIHRoaXMuIEhlcmUmIzM5O3MgbXkgdGFrZSBvbiB0aG9zZSBpbml0aWFsIHRob3VnaHRzOgoKKipQZWVyaW5nIGludG8gdGhlIENvcmUgb2YgTWVtb3J5IE1hbmFnZW1lbnQ6IFRoZSBgbW0vbnVtYS5jYCBGaWxlKioKCkFscmlnaHQsIHNvIHRoZSBmaXJzdCB0aGluZyB0aGF0IHBvcHMgaW50byBteSBoZWFkIGlzLCAmIzM0O09rYXksIGxldCYjMzk7cyB0YWtlIGEgbG9vayBhdCBgbW0vbnVtYS5jYC4mIzM0OyBJdCYjMzk7cyBhIGZ1bmRhbWVudGFsIGZpbGUgaW4gTGludXgmIzM5O3MgbWVtb3J5IG1hbmFnZW1lbnQgc3lzdGVtLCBwYXJ0aWN1bGFybHkgZm9jdXNpbmcgb24gTm9uLVVuaWZvcm0gTWVtb3J5IEFjY2VzcyAoTlVNQSkgYXJjaGl0ZWN0dXJlcy4gTXkgbWluZCBpbW1lZGlhdGVseSBiZWdpbnMgdG8gY2h1cm4gdGhyb3VnaCB0aGUgaW1wbGljYXRpb25zOiBOVU1BIGlzIGFsbCBhYm91dCBvcHRpbWl6aW5nIG1lbW9yeSBhY2Nlc3Mgc3BlZWQuIFdpdGggbXVsdGlwbGUgbWVtb3J5IG5vZGVzLCBhbmQgcG90ZW50aWFsbHkgdW5ldmVuIGFjY2VzcyB0aW1lcywgZ2V0dGluZyB0aGUgcmlnaHQgZGF0YSB0byB0aGUgcmlnaHQgQ1BVIGF0IHRoZSByaWdodCB0aW1lIGlzIGNydWNpYWwuIEkgZXhwZWN0IHRoaXMgZmlsZSB0byBjb250YWluIGFsbCB0aGUgY29yZSByb3V0aW5lcyBmb3IgbWVtb3J5IGFsbG9jYXRpb24sIHBsYWNlbWVudCwgYW5kIG1pZ3JhdGlvbiB3aXRoaW4gYSBOVU1BIHN5c3RlbS4gSSYjMzk7bSBwcm9iYWJseSBnb2luZyB0byBzZWUgZnVuY3Rpb25zIHJlbGF0ZWQgdG8gbm9kZSBzZWxlY3Rpb24sIHBvbGljeSBlbmZvcmNlbWVudCwgYW5kIG1heWJlIGV2ZW4gc29tZSB0b3BvbG9neS1hd2FyZSBhbGxvY2F0aW9uIHN0cmF0ZWdpZXMuIEkgYW0gdmVyeSBpbnRlcmVzdGVkIHRvIHNlZSB0aGUgZGV0YWlscy4gSSB3aWxsIGRpdmUgcmlnaHQgaW4uCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+OTYvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE0IDA3OjU3PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7bW0vbnVtYS5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMTIsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogNDAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7ICAxMjpcdHZvaWQgX19pbml0IGFsbG9jX25vZGVfZGF0YShpbnQgbmlkKVxuICAxMzpcdHtcbiAgMTQ6XHRcdGNvbnN0IHNpemVfdCBuZF9zaXplID0gcm91bmR1cChzaXplb2YocGdfZGF0YV90KSwgU01QX0NBQ0hFX0JZVEVTKTtcbiAgMTU6XHRcdHU2NCBuZF9wYTtcbiAgMTY6XHRcdGludCB0bmlkO1xuICAxNzpcdFxuICAxODpcdFx0LyogQWxsb2NhdGUgbm9kZSBkYXRhLiAgVHJ5IG5vZGUtbG9jYWwgbWVtb3J5IGFuZCB0aGVuIGFueSBub2RlLiAqL1xuICAxOTpcdFx0bmRfcGEgPSBtZW1ibG9ja19waHlzX2FsbG9jX3RyeV9uaWQobmRfc2l6ZSwgU01QX0NBQ0hFX0JZVEVTLCBuaWQpO1xuICAyMDpcdFx0aWYgKCFuZF9wYSlcbiAgMjE6XHRcdFx0cGFuaWMoXCYjMzQ7Q2Fubm90IGFsbG9jYXRlICV6dSBieXRlcyBmb3Igbm9kZSAlZCBkYXRhXFxuXCYjMzQ7LFxuICAyMjpcdFx0XHQgICAgICBuZF9zaXplLCBuaWQpO1xuICAyMzpcdFxuICAyNDpcdFx0LyogcmVwb3J0IGFuZCBpbml0aWFsaXplICovXG4gIDI1Olx0XHRwcl9pbmZvKFwmIzM0O05PREVfREFUQSglZCkgYWxsb2NhdGVkIFttZW0gJSMwMTBMeC0lIzAxMEx4XVxcblwmIzM0OywgbmlkLFxuICAyNjpcdFx0XHRuZF9wYSwgbmRfcGEgJiM0MzsgbmRfc2l6ZSAtIDEpO1xuICAyNzpcdFx0dG5pZCA9IGVhcmx5X3Bmbl90b19uaWQobmRfcGEgXHUwMDNlXHUwMDNlIFBBR0VfU0hJRlQpO1xuICAyODpcdFx0aWYgKHRuaWQgIT0gbmlkKVxuICAyOTpcdFx0XHRwcl9pbmZvKFwmIzM0OyAgICBOT0RFX0RBVEEoJWQpIG9uIG5vZGUgJWRcXG5cJiMzNDssIG5pZCwgdG5pZCk7XG4gIDMwOlx0XG4gIDMxOlx0XHRub2RlX2RhdGFbbmlkXSA9IF9fdmEobmRfcGEpO1xuICAzMjpcdFx0bWVtc2V0KE5PREVfREFUQShuaWQpLCAwLCBzaXplb2YocGdfZGF0YV90KSk7XG4gIDMzOlx0fVxuICAzNDpcdFxuICAzNTpcdHZvaWQgX19pbml0IGFsbG9jX29mZmxpbmVfbm9kZV9kYXRhKGludCBuaWQpXG4gIDM2Olx0e1xuICAzNzpcdFx0cGdfZGF0YV90ICpwZ2RhdDtcbiAgMzg6XHRcdG5vZGVfZGF0YVtuaWRdID0gbWVtYmxvY2tfYWxsb2Nfb3JfcGFuaWMoc2l6ZW9mKCpwZ2RhdCksIFNNUF9DQUNIRV9CWVRFUyk7XG4gIDM5Olx0fVxuICA0MDpcdFxuICA0MTpcdC8qIFN0dWIgZnVuY3Rpb25zOiAqL1xuICA0MjpcdFxuICA0MzpcdCNpZm5kZWYgbWVtb3J5X2FkZF9waHlzYWRkcl90b19uaWRcbiAgNDQ6XHRpbnQgbWVtb3J5X2FkZF9waHlzYWRkcl90b19uaWQodTY0IHN0YXJ0KVxuICA0NTpcdHtcbiAgNDY6XHRcdHByX2luZm9fb25jZShcJiMzNDtVbmtub3duIG9ubGluZSBub2RlIGZvciBtZW1vcnkgYXQgMHglbGx4LCBhc3N1bWluZyBub2RlIDBcXG5cJiMzNDssXG4gIDQ3Olx0XHRcdFx0c3RhcnQpO1xuICA0ODpcdFx0cmV0dXJuIDA7XG4gIDQ5Olx0fVxuICA1MDpcdEVYUE9SVF9TWU1CT0xfR1BMKG1lbW9yeV9hZGRfcGh5c2FkZHJfdG9fbmlkKTtcbiAgNTE6XHQjZW5kaWZcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD45Ny8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTQgMDc6NTc8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjgtZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMzU4MDgKCQkJCQkJCW91dHB1dDogMzAKCQkJCQkJCXRob3VnaHRzOiA1NDYKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIFBvdGVudGlhbCBVbmluaXRpYWxpemVkIE1lbW9yeSBBY2Nlc3NlcyoqCgpPa2F5LCBzbyBJJiMzOTttIGxvb2tpbmcgYXQgdGhpcyBwYXRjaCBhbmQgdHJ5aW5nIHRvIGFzc2VzcyBpdHMgaW1wYWN0LiBCb3RoIGBtZW1zZXRgIHdpdGggemVybyBhbmQgYG1lbWJsb2NrX2FsbG9jX29yX3BhbmljYCBlbnN1cmUgdGhlIG1lbW9yeSBpcyBpbml0aWFsaXplZCB0byB6ZXJvLCBzbyB0aGF0IHBhcnQgaXMgZmluZS4gYHBhZ2VzX3dpdGhfb25saW5lX21lbW1hcGAgc3RhcnRzIGF0IHplcm8uIE15IHByaW1hcnkgY29uY2VybiBoZXJlIGlzIGlmIHRoaXMgY2hhbmdlIGNvdWxkIGludHJvZHVjZSBhbnkgdW5pbml0aWFsaXplZCBtZW1vcnkgYWNjZXNzZXMuCgpUaGUgcGF0Y2ggdHJhY2tzIHdoZXRoZXIgYWxsIHBhZ2VzIHdpdGhpbiBhIHpvbmUmIzM5O3Mgc3BhbiBoYXZlIGFuIG9ubGluZSBtZW1tYXAsIHNwZWNpZmljYWxseSBjb21wYXJpbmcgYHNwYW5uZWRfcGFnZXNgIHdpdGggYHBhZ2VzX3dpdGhfb25saW5lX21lbW1hcGAuIFdoZW4gdGhleSYjMzk7cmUgZXF1YWwsIGl0IHNldHMgYHpvbmUtJmd0O2NvbnRpZ3VvdXNgIHRvIHRydWUuIE5vdywgaWYgdGhlIHpvbmUgaXMgZXJyb25lb3VzbHkgbWFya2VkIGNvbnRpZ3VvdXMgd2hlbiBpdCBpc24mIzM5O3QsIHRoaW5ncyBjb3VsZCBnZXQgaGFpcnkuIExldCYjMzk7cyBsb29rIGF0IGBwYWdlYmxvY2tfcGZuX3RvX3BhZ2VgOgoKSWYgdGhlIHpvbmUgaXMgbWlzdGFrZW5seSBtYXJrZWQgY29udGlndW91cywgaXQgd2lsbCB0YWtlIHRoZSBgcGZuX3RvX3BhZ2VgIGJyYW5jaCwgaW1tZWRpYXRlbHkgcmV0dXJuaW5nIGEgYHN0cnVjdCBwYWdlYCB3aXRob3V0IHRoZSB1c3VhbCBjaGVja3MgZm9yIGBwZm5fdmFsaWQoKWAgb3IgYHBmbl90b19vbmxpbmVfcGFnZSgpYC4gQW4gaW52YWxpZCBgc3RhcnRfcGZuYCwgYW4gb3V0LW9mLWJvdW5kcyBhY2Nlc3MsIG9yIGRlcmVmZXJlbmNpbmcgYSBub24tZXhpc3RlbnQgcGFnZSBmcmFtZSBpcyBhIHJlY2lwZSBmb3IgYSBjcmFzaCwgYSBwYWdlIGZhdWx0LCBvciBhdCBsZWFzdCBhIEtBU0FOIGFsZXJ0IG9uIGFuIG91dC1vZi1ib3VuZHMgYWNjZXNzLgoKQnV0IHdhaXQsIHdoYXQgYWJvdXQgdGhlIGBzdHJ1Y3QgcGFnZWAgaXRzZWxmPyBJbiBtZW1vcnkgaG9sZXMsIGBpbml0X3VuYXZhaWxhYmxlX3JhbmdlYCAqZG9lcyogaW5pdGlhbGl6ZSB0aGUgYHN0cnVjdCBwYWdlYCB3aGVuIGl0JiMzOTtzIHN1cHBvc2VkIHRvIGJlIHRoZXJlLiBJdCBzZXRzIGl0IHVwIHVzaW5nIGBfX2luaXRfc2luZ2xlX3BhZ2VgLCBhbmQgc2V0cyBpdCBhcyByZXNlcnZlZC4gSG93ZXZlciwgaWYgdGhlIG1lbW1hcCB3YXNuJiMzOTt0IGluaXRpYWxpemVkLCBvciB0aGUgYXJlYSBpcyB1bm1hcHBlZCwgYW55IGFjY2VzcyB3b3VsZCB0cmlnZ2VyIGEgcGFnZSBmYXVsdCwgd2hpY2ggdGhlIGtlcm5lbCYjMzk7cyBmYXVsdCBoYW5kbGVyIG9yIEtBU0FOIHNob3VsZCBjYXRjaC4KCkJ1dCwgZG9lcyBLTVNBTiB0cmFjayB0aGUgYHN0cnVjdCBwYWdlYCBtZXRhZGF0YT8gTm8sIGl0IGRvZXNuJiMzOTt0LiBLTVNBTiBzcGVjaWZpY2FsbHkgZXhjbHVkZXMgYHN0cnVjdCBwYWdlYCBtZXRhZGF0YSwgc28gdGhhdCB3b24mIzM5O3QgaGVscC4gSSBuZWVkIHRvIGtlZXAgaW4gbWluZCwgS01TQU4gZG9lcyBub3QgdHJhY2sgc2hhZG93IGZvciBzdHJ1Y3QgcGFnZSBvciBtZXRhZGF0YSBwYWdlcy4gVGhlcmVmb3JlLCB0aGUgbWVtb3J5IGFjY2VzcyBjb3VsZCBiZSBwcm9ibGVtYXRpYyBpZiB0aGlzIHBhdGNoIG1lc3NlcyB1cCB0aGUgYHpvbmUtJmd0O2NvbnRpZ3VvdXNgIGZsYWcuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+OTgvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE0IDA3OjU4PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2ttc2FuX2dldF9tZXRhZGF0YSYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O21tL2ttc2FuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O21tL2ttc2FuL2NvcmUuYz04MD12b2lkIGttc2FuX2ludGVybmFsX21lbW1vdmVfbWV0YWRhdGEodm9pZCAqZHN0LCB2b2lkICpzcmMsIHNpemVfdCBuKVxuLS1cbm1tL2ttc2FuL2NvcmUuYy04OS1cbm1tL2ttc2FuL2NvcmUuYzo5MDpcdHNoYWRvd19kc3QgPSBrbXNhbl9nZXRfbWV0YWRhdGEoZHN0LCBLTVNBTl9NRVRBX1NIQURPVyk7XG5tbS9rbXNhbi9jb3JlLmMtOTEtXHRpZiAoIXNoYWRvd19kc3QpXG4tLVxubW0va21zYW4vY29yZS5jLTk2LVxubW0va21zYW4vY29yZS5jOjk3Olx0c2hhZG93X3NyYyA9IGttc2FuX2dldF9tZXRhZGF0YShzcmMsIEtNU0FOX01FVEFfU0hBRE9XKTtcbm1tL2ttc2FuL2NvcmUuYy05OC1cdGlmICghc2hhZG93X3NyYykge1xuLS1cbm1tL2ttc2FuL2NvcmUuYy0xMDQtXG5tbS9rbXNhbi9jb3JlLmM6MTA1Olx0b3JpZ2luX2RzdCA9IGttc2FuX2dldF9tZXRhZGF0YShkc3QsIEtNU0FOX01FVEFfT1JJR0lOKTtcbm1tL2ttc2FuL2NvcmUuYzoxMDY6XHRvcmlnaW5fc3JjID0ga21zYW5fZ2V0X21ldGFkYXRhKHNyYywgS01TQU5fTUVUQV9PUklHSU4pO1xubW0va21zYW4vY29yZS5jLTEwNy1cdEtNU0FOX1dBUk5fT04oIW9yaWdpbl9kc3QgfHwgIW9yaWdpbl9zcmMpO1xuLS1cbm1tL2ttc2FuL2NvcmUuYz0xOTE9dm9pZCBrbXNhbl9pbnRlcm5hbF9zZXRfc2hhZG93X29yaWdpbih2b2lkICphZGRyLCBzaXplX3Qgc2l6ZSwgaW50IGIsXG4tLVxubW0va21zYW4vY29yZS5jLTE5OS1cdEtNU0FOX1dBUk5fT04oIWttc2FuX21ldGFkYXRhX2lzX2NvbnRpZ3VvdXMoYWRkciwgc2l6ZSkpO1xubW0va21zYW4vY29yZS5jOjIwMDpcdHNoYWRvd19zdGFydCA9IGttc2FuX2dldF9tZXRhZGF0YShhZGRyLCBLTVNBTl9NRVRBX1NIQURPVyk7XG5tbS9rbXNhbi9jb3JlLmMtMjAxLVx0aWYgKCFzaGFkb3dfc3RhcnQpIHtcbi0tXG5tbS9rbXNhbi9jb3JlLmMtMjI0LVx0b3JpZ2luX3N0YXJ0ID1cbm1tL2ttc2FuL2NvcmUuYzoyMjU6XHRcdCh1MzIgKilrbXNhbl9nZXRfbWV0YWRhdGEoKHZvaWQgKilhZGRyZXNzLCBLTVNBTl9NRVRBX09SSUdJTik7XG5tbS9rbXNhbi9jb3JlLmMtMjI2LVxuLS1cbm1tL2ttc2FuL2NvcmUuYz0yNTM9dm9pZCBrbXNhbl9pbnRlcm5hbF9jaGVja19tZW1vcnkodm9pZCAqYWRkciwgc2l6ZV90IHNpemUsXG4tLVxubW0va21zYW4vY29yZS5jLTI2OS1cdFx0XHRcdCBQQUdFX1NJWkUgLSAoKGFkZHI2NCAmIzQzOyBwb3MpICUgUEFHRV9TSVpFKSk7XG5tbS9rbXNhbi9jb3JlLmM6MjcwOlx0XHRzaGFkb3cgPSBrbXNhbl9nZXRfbWV0YWRhdGEoKHZvaWQgKikoYWRkcjY0ICYjNDM7IHBvcyksXG5tbS9rbXNhbi9jb3JlLmMtMjcxLVx0XHRcdFx0XHQgICAgS01TQU5fTUVUQV9TSEFET1cpO1xuLS1cbm1tL2ttc2FuL2NvcmUuYy0zMDEtXHRcdFx0fVxubW0va21zYW4vY29yZS5jOjMwMjpcdFx0XHRvcmlnaW4gPSBrbXNhbl9nZXRfbWV0YWRhdGEoKHZvaWQgKikoYWRkcjY0ICYjNDM7IHBvcyAmIzQzOyBpKSxcbm1tL2ttc2FuL2NvcmUuYy0zMDMtXHRcdFx0XHRcdFx0ICAgIEtNU0FOX01FVEFfT1JJR0lOKTtcbi0tXG5tbS9rbXNhbi9jb3JlLmM9MzI5PWJvb2wga21zYW5fbWV0YWRhdGFfaXNfY29udGlndW91cyh2b2lkICphZGRyLCBzaXplX3Qgc2l6ZSlcbi0tXG5tbS9rbXNhbi9jb3JlLmMtMzQ0LVxubW0va21zYW4vY29yZS5jOjM0NTpcdGN1cl9zaGFkb3cgPSBrbXNhbl9nZXRfbWV0YWRhdGEoKHZvaWQgKiljdXJfYWRkciwgLyppc19vcmlnaW4qLyBmYWxzZSk7XG5tbS9rbXNhbi9jb3JlLmMtMzQ2LVx0aWYgKCFjdXJfc2hhZG93KVxubW0va21zYW4vY29yZS5jLTM0Ny1cdFx0YWxsX3VudHJhY2tlZCA9IHRydWU7XG5tbS9rbXNhbi9jb3JlLmM6MzQ4Olx0Y3VyX29yaWdpbiA9IGttc2FuX2dldF9tZXRhZGF0YSgodm9pZCAqKWN1cl9hZGRyLCAvKmlzX29yaWdpbiovIHRydWUpO1xubW0va21zYW4vY29yZS5jLTM0OS1cdGlmIChhbGxfdW50cmFja2VkIFx1MDAyNlx1MDAyNiBjdXJfb3JpZ2luKVxuLS1cbm1tL2ttc2FuL2NvcmUuYy0zNTQtXHQgICAgIGN1cl9vcmlnaW4gPSBuZXh0X29yaWdpbiwgbmV4dF9hZGRyICYjNDM7PSBQQUdFX1NJWkUpIHtcbm1tL2ttc2FuL2NvcmUuYzozNTU6XHRcdG5leHRfc2hhZG93ID0ga21zYW5fZ2V0X21ldGFkYXRhKCh2b2lkICopbmV4dF9hZGRyLCBmYWxzZSk7XG5tbS9rbXNhbi9jb3JlLmM6MzU2Olx0XHRuZXh0X29yaWdpbiA9IGttc2FuX2dldF9tZXRhZGF0YSgodm9pZCAqKW5leHRfYWRkciwgdHJ1ZSk7XG5tbS9rbXNhbi9jb3JlLmMtMzU3LVx0XHRpZiAoYWxsX3VudHJhY2tlZCkge1xuLS1cbm1tL2ttc2FuL2NvcmUuYy0zNzgtXHQgICAgICAgbmV4dF9vcmlnaW4pO1xubW0va21zYW4vY29yZS5jOjM3OTpcdG9yaWdpbl9wID0ga21zYW5fZ2V0X21ldGFkYXRhKGFkZHIsIEtNU0FOX01FVEFfT1JJR0lOKTtcbm1tL2ttc2FuL2NvcmUuYy0zODAtXHRpZiAob3JpZ2luX3ApIHtcbi0tXG5tbS9rbXNhbi9ob29rcy5jPTEyNT1zdGF0aWMgdW5zaWduZWQgbG9uZyB2bWFsbG9jX3NoYWRvdyh1bnNpZ25lZCBsb25nIGFkZHIpXG5tbS9rbXNhbi9ob29rcy5jLTEyNi17XG5tbS9rbXNhbi9ob29rcy5jOjEyNzpcdHJldHVybiAodW5zaWduZWQgbG9uZylrbXNhbl9nZXRfbWV0YWRhdGEoKHZvaWQgKilhZGRyLFxubW0va21zYW4vaG9va3MuYy0xMjgtXHRcdFx0XHRcdFx0IEtNU0FOX01FVEFfU0hBRE9XKTtcbi0tXG5tbS9rbXNhbi9ob29rcy5jPTEzMT1zdGF0aWMgdW5zaWduZWQgbG9uZyB2bWFsbG9jX29yaWdpbih1bnNpZ25lZCBsb25nIGFkZHIpXG5tbS9rbXNhbi9ob29rcy5jLTEzMi17XG5tbS9rbXNhbi9ob29rcy5jOjEzMzpcdHJldHVybiAodW5zaWduZWQgbG9uZylrbXNhbl9nZXRfbWV0YWRhdGEoKHZvaWQgKilhZGRyLFxubW0va21zYW4vaG9va3MuYy0xMzQtXHRcdFx0XHRcdFx0IEtNU0FOX01FVEFfT1JJR0lOKTtcbi0tXG5tbS9rbXNhbi9pbnN0cnVtZW50YXRpb24uYz0yMj1zdGF0aWMgaW5saW5lIGJvb2wgaXNfYmFkX2FzbV9hZGRyKHZvaWQgKmFkZHIsIHVpbnRwdHJfdCBzaXplLCBib29sIGlzX3N0b3JlKVxuLS1cbm1tL2ttc2FuL2luc3RydW1lbnRhdGlvbi5jLTI2LVx0XHRyZXR1cm4gdHJ1ZTtcbm1tL2ttc2FuL2luc3RydW1lbnRhdGlvbi5jOjI3Olx0aWYgKCFrbXNhbl9nZXRfbWV0YWRhdGEoYWRkciwgS01TQU5fTUVUQV9TSEFET1cpKVxubW0va21zYW4vaW5zdHJ1bWVudGF0aW9uLmMtMjgtXHRcdHJldHVybiB0cnVlO1xuLS1cbm1tL2ttc2FuL3NoYWRvdy5jPTgyPXN0cnVjdCBzaGFkb3dfb3JpZ2luX3B0ciBrbXNhbl9nZXRfc2hhZG93X29yaWdpbl9wdHIodm9pZCAqYWRkcmVzcywgdTY0IHNpemUsXG4tLVxubW0va21zYW4vc2hhZG93LmMtOTctXHRLTVNBTl9XQVJOX09OKCFrbXNhbl9tZXRhZGF0YV9pc19jb250aWd1b3VzKGFkZHJlc3MsIHNpemUpKTtcbm1tL2ttc2FuL3NoYWRvdy5jOjk4Olx0c2hhZG93ID0ga21zYW5fZ2V0X21ldGFkYXRhKGFkZHJlc3MsIEtNU0FOX01FVEFfU0hBRE9XKTtcbm1tL2ttc2FuL3NoYWRvdy5jLTk5LVx0aWYgKCFzaGFkb3cpXG4tLVxubW0va21zYW4vc2hhZG93LmMtMTAyLVx0cmV0LnNoYWRvdyA9IHNoYWRvdztcbm1tL2ttc2FuL3NoYWRvdy5jOjEwMzpcdHJldC5vcmlnaW4gPSBrbXNhbl9nZXRfbWV0YWRhdGEoYWRkcmVzcywgS01TQU5fTUVUQV9PUklHSU4pO1xubW0va21zYW4vc2hhZG93LmMtMTA0LVx0cmV0dXJuIHJldDtcbi0tXG5tbS9rbXNhbi9zaGFkb3cuYy0xMjQtICovXG5tbS9rbXNhbi9zaGFkb3cuYzoxMjU6dm9pZCAqa21zYW5fZ2V0X21ldGFkYXRhKHZvaWQgKmFkZHJlc3MsIGJvb2wgaXNfb3JpZ2luKVxubW0va21zYW4vc2hhZG93LmMtMTI2LXtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD45OS8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTQgMDc6NTg8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjgtZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMzg1NTAKCQkJCQkJCW91dHB1dDogMzYKCQkJCQkJCXRob3VnaHRzOiAxMgoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgaGVyZSYjMzk7cyBteSBpbnRlcnByZXRhdGlvbiBvZiAmIzM0O0xldCYjMzk7cyBzZWUgYGttc2FuX2dldF9tZXRhZGF0YWAmIzM0OyBmcm9tIGFuIGV4cGVydCYjMzk7cyBwZXJzcGVjdGl2ZSwgcHJlc2VudGVkIGluIHRoZSBmaXJzdCBwZXJzb246CgoqKkFuYWx5emluZyBga21zYW5fZ2V0X21ldGFkYXRhYCoqCgpBbHJpZ2h0LCBzbyB0aGUgZmlyc3QgdGhpbmcgdGhhdCBqdW1wcyBvdXQgYXQgbWUgaXMgdGhhdCB3ZSYjMzk7cmUgdGFsa2luZyBhYm91dCBga21zYW5fZ2V0X21ldGFkYXRhYC4gTXkgaW5pdGlhbCB0aG91Z2h0IGlzLCAmIzM0O1doYXQgc3BlY2lmaWNhbGx5IGFyZSB3ZSBleGFtaW5pbmcgKndpdGhpbiogdGhpcyBmdW5jdGlvbj8mIzM0OyBBcmUgd2UgbG9va2luZyBhdCBpdHMgaW1wbGVtZW50YXRpb24sIGl0cyB1c2FnZSwgaXRzIGludGVyYWN0aW9uIHdpdGggb3RoZXIgcGFydHMgb2YgdGhlIGNvZGViYXNlLCBvciBtYXliZSBldmVuIGRlYnVnZ2luZyBpdD8gQ29uc2lkZXJpbmcgSSYjMzk7bSBhbiBleHBlcnQsIG15IG1pbmQgaW1tZWRpYXRlbHkgc3RhcnRzIGNhdGFsb2dpbmcgdGhlIHBvdGVudGlhbCBhcmVhcyBvZiBpbnRlcmVzdC4gSXMgdGhpcyByZWxhdGVkIHRvIGtleSBtYW5hZ2VtZW50PyBJcyBpdCBzZWN1cml0eS1zZW5zaXRpdmU/IFdoYXQgY29udGV4dCBpcyB0aGlzIG9wZXJhdGluZyB3aXRoaW4/IERvZXMgaXQgaW52b2x2ZSBoYXJkd2FyZSBzZWN1cml0eSBtb2R1bGVzPwoKSSBpbW1lZGlhdGVseSB3YW50IHRvIGRpdmUgZGVlcGVyLiAmIzM0O1doYXQmIzM5O3MgdGhlIGdvYWwgaGVyZT8gV2hhdCBwcm9ibGVtIGFyZSB3ZSB0cnlpbmcgdG8gc29sdmUgb3IgdW5kZXJzdGFuZD8mIzM0OyBJJiMzOTttIG1lbnRhbGx5IHBhcnNpbmcgdGhlIG5hbWUgLSAqa21zYW4qIC0gb2theSwgbGlrZWx5IEtleSBNYW5hZ2VtZW50IFNlcnZpY2UsIGFuZCAqbWV0YWRhdGEqIC0gSSYjMzk7bSB3b25kZXJpbmcgaWYgdGhpcyBnaXZlcyB1cyBpbmZvIGFib3V0IGtleXMuIFRoZSB1c2Ugb2YgS01TYW4gaW1wbGllcyBhIGZvY3VzIG9uIHNlY3VyaXR5LCBtZW1vcnkgc2FmZXR5LCBvciBwZXJoYXBzIGV2ZW4gZnV6emluZywgd2hpY2ggbWVhbnMgdGhlIG1ldGFkYXRhIG1pZ2h0IGJlIGFib3V0IG9iamVjdHMsIG93bmVyc2hpcCwgb3IgYWxsb2NhdGlvbiB0aGF0IGFyZSBjcnVjaWFsIGZvciBkZXRlY3RpbmcgbWVtb3J5IGNvcnJ1cHRpb24gdnVsbmVyYWJpbGl0aWVzLgoKTXkgbWluZCBpcyBub3cgcHJpbWVkIHRvIGxvb2sgZm9yIGNsdWVzOiBXaGF0JiMzOTtzIHRoZSBsYW5ndWFnZT8gSXMgaXQgQywgQyYjNDM7JiM0MzssIFJ1c3QsIG9yIHNvbWV0aGluZyBlbHNlPyBBcmUgdGhlcmUgYW55IG9idmlvdXMgYXJjaGl0ZWN0dXJhbCBwYXR0ZXJucyBvciBmcmFtZXdvcmtzIGluIHVzZT8gSSYjMzk7bSBhbHJlYWR5IGFudGljaXBhdGluZyBwb3NzaWJsZSBpc3N1ZXMsIHN1Y2ggYXMgcmFjZSBjb25kaXRpb25zLCB1bmluaXRpYWxpemVkIG1lbW9yeSByZWFkcywgb3IgaW5mb3JtYXRpb24gbGVha3MuIEkmIzM5O20gcmVhZHkgdG8gYXBwbHkgbXkgYWNjdW11bGF0ZWQga25vd2xlZGdlIGFuZCBhbmFseXRpY2FsIHNraWxscyB0byBkaXNzZWN0IHRoaXMgZnVuY3Rpb24gYW5kIGdhaW4gYSBjbGVhciB1bmRlcnN0YW5kaW5nIG9mIGl0cyByb2xlIGFuZCBiZWhhdmlvci4gU28sIGxldCYjMzk7cyBnZXQgaW50byBpdC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMDAvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE0IDA3OjU4PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7bW0va21zYW4vc2hhZG93LmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAxMjQsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogNDAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7IDEyNDpcdCAqL1xuIDEyNTpcdHZvaWQgKmttc2FuX2dldF9tZXRhZGF0YSh2b2lkICphZGRyZXNzLCBib29sIGlzX29yaWdpbilcbiAxMjY6XHR7XG4gMTI3Olx0XHR1NjQgYWRkciA9ICh1NjQpYWRkcmVzcywgb2ZmO1xuIDEyODpcdFx0c3RydWN0IHBhZ2UgKnBhZ2U7XG4gMTI5Olx0XHR2b2lkICpyZXQ7XG4gMTMwOlx0XG4gMTMxOlx0XHRpZiAoaXNfb3JpZ2luKVxuIDEzMjpcdFx0XHRhZGRyID0gQUxJR05fRE9XTihhZGRyLCBLTVNBTl9PUklHSU5fU0laRSk7XG4gMTMzOlx0XHRhZGRyZXNzID0gKHZvaWQgKilhZGRyO1xuIDEzNDpcdFx0aWYgKGttc2FuX2ludGVybmFsX2lzX3ZtYWxsb2NfYWRkcihhZGRyZXNzKSB8fFxuIDEzNTpcdFx0ICAgIGttc2FuX2ludGVybmFsX2lzX21vZHVsZV9hZGRyKGFkZHJlc3MpKVxuIDEzNjpcdFx0XHRyZXR1cm4gKHZvaWQgKil2bWFsbG9jX21ldGEoYWRkcmVzcywgaXNfb3JpZ2luKTtcbiAxMzc6XHRcbiAxMzg6XHRcdHJldCA9IGFyY2hfa21zYW5fZ2V0X21ldGFfb3JfbnVsbChhZGRyZXNzLCBpc19vcmlnaW4pO1xuIDEzOTpcdFx0aWYgKHJldClcbiAxNDA6XHRcdFx0cmV0dXJuIHJldDtcbiAxNDE6XHRcbiAxNDI6XHRcdHBhZ2UgPSB2aXJ0X3RvX3BhZ2Vfb3JfbnVsbChhZGRyZXNzKTtcbiAxNDM6XHRcdGlmICghcGFnZSlcbiAxNDQ6XHRcdFx0cmV0dXJuIE5VTEw7XG4gMTQ1Olx0XHRpZiAoIXBhZ2VfaGFzX21ldGFkYXRhKHBhZ2UpKVxuIDE0NjpcdFx0XHRyZXR1cm4gTlVMTDtcbiAxNDc6XHRcdG9mZiA9IG9mZnNldF9pbl9wYWdlKGFkZHIpO1xuIDE0ODpcdFxuIDE0OTpcdFx0cmV0dXJuIChpc19vcmlnaW4gPyBvcmlnaW5fcHRyX2ZvcihwYWdlKSA6IHNoYWRvd19wdHJfZm9yKHBhZ2UpKSAmIzQzOyBvZmY7XG4gMTUwOlx0fVxuIDE1MTpcdFxuIDE1MjpcdHZvaWQga21zYW5fY29weV9wYWdlX21ldGEoc3RydWN0IHBhZ2UgKmRzdCwgc3RydWN0IHBhZ2UgKnNyYylcbiAxNTM6XHR7XG4gMTU0Olx0XHRpZiAoIWttc2FuX2VuYWJsZWQgfHwga21zYW5faW5fcnVudGltZSgpKVxuIDE1NTpcdFx0XHRyZXR1cm47XG4gMTU2Olx0XHRpZiAoIWRzdCB8fCAhcGFnZV9oYXNfbWV0YWRhdGEoZHN0KSlcbiAxNTc6XHRcdFx0cmV0dXJuO1xuIDE1ODpcdFx0aWYgKCFzcmMgfHwgIXBhZ2VfaGFzX21ldGFkYXRhKHNyYykpIHtcbiAxNTk6XHRcdFx0a21zYW5faW50ZXJuYWxfdW5wb2lzb25fbWVtb3J5KHBhZ2VfYWRkcmVzcyhkc3QpLCBQQUdFX1NJWkUsXG4gMTYwOlx0XHRcdFx0XHRcdCAgICAgICAvKmNoZWNrZWQqLyBmYWxzZSk7XG4gMTYxOlx0XHRcdHJldHVybjtcbiAxNjI6XHRcdH1cbiAxNjM6XHRcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMDEvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE0IDA3OjU4PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy44LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDM5NTcwCgkJCQkJCQlvdXRwdXQ6IDMxCgkJCQkJCQl0aG91Z2h0czogMTUKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgYSBzdW1tYXJ5IG9mIG15IHRob3VnaHQgcHJvY2VzcywgYXMgcmVxdWVzdGVkOgoKKipDaGVja2luZyBgdmlydF90b19wYWdlX29yX251bGxgKioKCk9rYXksIHRpbWUgdG8gZGl2ZSBpbnRvIGB2aXJ0X3RvX3BhZ2Vfb3JfbnVsbGAuIE15IGZpcnN0IGluc3RpbmN0IGlzIHRvIGNvbmZpcm0gdGhhdCBJJiMzOTttIGRlYWxpbmcgd2l0aCB0aGUgY29ycmVjdCBmdW5jdGlvbi4gSSYjMzk7bGwgbWVudGFsbHkgcnVuIHRocm91Z2ggdGhlIHR5cGljYWwgc2NlbmFyaW9zIHdoZXJlIEkmIzM5O2QgKnVzZSogdGhpcyDigJMgdmlydHVhbCBhZGRyZXNzIHRvIHBhZ2UgbWFwcGluZywgZGVhbGluZyB3aXRoIHBvdGVudGlhbCBOVUxMIHBvaW50ZXJzIGZvciBzYWZldHksIHRoZSBpbmhlcmVudCBwb3RlbnRpYWwgZm9yIGZhaWx1cmVzIGluIHRoZSBtYXBwaW5nIHByb2Nlc3MuLi4gUmlnaHQsIHRoYXQgbGluZXMgdXAuIAoKTm93LCBJIG5lZWQgdG8gY29uc2lkZXIgcG90ZW50aWFsIHByb2JsZW1zLiBDb3VsZCB0aGVyZSBiZSBhbiBpc3N1ZSB3aXRoIGhvdyBpdCBoYW5kbGVzIHVubWFwcGVkIHJlZ2lvbnM/IEFyZSB0aGVyZSBhbnkga25vd24gY29ybmVyIGNhc2VzIHdoZXJlIGl0IG1pZ2h0IHJldHVybiBhbiB1bmV4cGVjdGVkIHZhbHVlPyBNYXliZSBhIGJ1ZyByZWxhdGVkIHRvIHNwZWNpZmljIGFyY2hpdGVjdHVyZXMgb3IgbWVtb3J5IG1vZGVscz8gSSYjMzk7bGwgbmVlZCB0byByZW1lbWJlciB0aGF0IHRoaXMgZnVuY3Rpb24gaXMga2VybmVsLWxldmVsIHNvIHRoZXJlJiMzOTtzIHBvdGVudGlhbCBmb3IgYWxsIHNvcnRzIG9mIHdlaXJkIGludGVyYWN0aW9ucyB3aXRoIG90aGVyIHN1YnN5c3RlbXMgdGhhdCBJIG1pZ2h0IG5lZWQgdG8gYWNjb3VudCBmb3IuIEkgbmVlZCB0byBiZSBzdXJlIHRvIHRoaW5rIGFib3V0IHRoZSBjb25zZXF1ZW5jZXMgaWYgdGhpcyByZXR1cm5zIGBOVUxMYCB1bmV4cGVjdGVkbHkgLSB3aGF0IHdvdWxkIHRoYXQgZG8gdG8gdGhlIGNvZGUgZnVydGhlciBkb3duIHRoZSBsaW5lPyBEb2VzIGl0IGhhbmRsZSBOVU1BIGNvcnJlY3RseT8gSSBzaG91bGQgcHJvYmFibHkgZG91YmxlLWNoZWNrIGl0cyBpbnRlcmFjdGlvbiB3aXRoIHRoZSBwYWdlIGNhY2hlLCB0b28uIE9rYXksIGxldCYjMzk7cyBzdGFydCBkaWdnaW5nIGRlZXBlciBhbmQgc2VlIHdoYXQgdGhlIGNvZGUgc2F5cy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMDIvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE0IDA3OjU4PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O3ZpcnRfdG9fcGFnZV9vcl9udWxsJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7bW0vJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O21tL2ttc2FuL3NoYWRvdy5jPTU2PXN0YXRpYyB1bnNpZ25lZCBsb25nIHZtYWxsb2NfbWV0YSh2b2lkICphZGRyLCBib29sIGlzX29yaWdpbilcbi0tXG5tbS9rbXNhbi9zaGFkb3cuYy03My1cbm1tL2ttc2FuL3NoYWRvdy5jOjc0OnN0YXRpYyBzdHJ1Y3QgcGFnZSAqdmlydF90b19wYWdlX29yX251bGwodm9pZCAqdmFkZHIpXG5tbS9rbXNhbi9zaGFkb3cuYy03NS17XG4tLVxubW0va21zYW4vc2hhZG93LmM9MTI1PXZvaWQgKmttc2FuX2dldF9tZXRhZGF0YSh2b2lkICphZGRyZXNzLCBib29sIGlzX29yaWdpbilcbi0tXG5tbS9rbXNhbi9zaGFkb3cuYy0xNDEtXG5tbS9rbXNhbi9zaGFkb3cuYzoxNDI6XHRwYWdlID0gdmlydF90b19wYWdlX29yX251bGwoYWRkcmVzcyk7XG5tbS9rbXNhbi9zaGFkb3cuYy0xNDMtXHRpZiAoIXBhZ2UpXG4tLVxubW0va21zYW4vc2hhZG93LmM9Mjc2PXZvaWQgX19pbml0IGttc2FuX2luaXRfYWxsb2NfbWV0YV9mb3JfcmFuZ2Uodm9pZCAqc3RhcnQsIHZvaWQgKmVuZClcbi0tXG5tbS9rbXNhbi9zaGFkb3cuYy0yODgtXHRmb3IgKHU2NCBhZGRyID0gMDsgYWRkciBcdTAwM2Mgc2l6ZTsgYWRkciAmIzQzOz0gUEFHRV9TSVpFKSB7XG5tbS9rbXNhbi9zaGFkb3cuYzoyODk6XHRcdHBhZ2UgPSB2aXJ0X3RvX3BhZ2Vfb3JfbnVsbCgoY2hhciAqKXN0YXJ0ICYjNDM7IGFkZHIpO1xubW0va21zYW4vc2hhZG93LmMtMjkwLVx0XHRzaGFkb3dfcCA9IHZpcnRfdG9fcGFnZSgoY2hhciAqKXNoYWRvdyAmIzQzOyBhZGRyKTtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMDMvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE0IDA3OjU4PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy44LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDQwMjIwCgkJCQkJCQlvdXRwdXQ6IDM1CgkJCQkJCQl0aG91Z2h0czogMTMKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgYSBmaXJzdC1wZXJzb24gc3VtbWFyeSwgdGFpbG9yZWQgYXMgcmVxdWVzdGVkOgoKKipEZWNvbnN0cnVjdGluZyBgdmlydF90b19wYWdlX29yX251bGxgKioKCk9rYXksIGxldCYjMzk7cyBkaXZlIGludG8gYHZpcnRfdG9fcGFnZV9vcl9udWxsYC4gQXMgYW4gZXhwZXJ0IGluIG15IGZpZWxkLCBteSBpbW1lZGlhdGUgdGhvdWdodCBpcyB0byBkaXNzZWN0IHdoYXQgdGhpcyBmdW5jdGlvbiBpcyAqcmVhbGx5KiB0cnlpbmcgdG8gYWNjb21wbGlzaC4gVGhlIG5hbWUgaXRzZWxmIGlzIGZhaXJseSBkZXNjcmlwdGl2ZSwgYnV0IEkga25vdyBiZXR0ZXIgdGhhbiB0byB0YWtlIHRoYXQgYXQgZmFjZSB2YWx1ZS4gSSYjMzk7bSBhbHJlYWR5IHRoaW5raW5nIGFib3V0IHBvdGVudGlhbCBlZGdlIGNhc2VzOiB3aGF0IHNjZW5hcmlvcyBtaWdodCBjYXVzZSBpdCB0byByZXR1cm4gTlVMTD8gSXMgaXQgZGVhbGluZyB3aXRoIGtlcm5lbCB2aXJ0dWFsIGFkZHJlc3NlcywgdXNlci1zcGFjZSB2aXJ0dWFsIGFkZHJlc3Nlcywgb3IgYm90aD8gQXJlIHRoZXJlIGFueSBhcmNoaXRlY3R1cmFsIGRlcGVuZGVuY2llcyBiYWtlZCBpbnRvIGl0cyBpbXBsZW1lbnRhdGlvbj8KCkkmIzM5O20gbWVudGFsbHkgbWFwcGluZyBvdXQgdGhlIHR5cGljYWwgYWRkcmVzcyB0cmFuc2xhdGlvbiBwcm9jZXNzIGluIG15IGhlYWQuIEkmIzM5O20gYXNzdW1pbmcgaXQmIzM5O3MgcHJvYmFibHkgdXNpbmcgdGhlIHBhZ2UgdGFibGVzIGFuZCB0aGUgTU1VIHRvIG1hcCBhIHZpcnR1YWwgYWRkcmVzcyB0byBhIHBoeXNpY2FsIHBhZ2UsIG9yIGF0IGxlYXN0IGF0dGVtcHRpbmcgdG8uIFNvLCB0aGUgcXVlc3Rpb24gaXMgaG93IGl0IGRlYWxzIHdpdGggZmFpbHVyZXMuIERvZXMgaXQgaGFuZGxlIHVubWFwcGVkIG1lbW9yeSBncmFjZWZ1bGx5LCBvciBkb2VzIGl0IHRyeSB0byBkbyBzb21ldGhpbmcgZWxzZT8gRG9lcyBpdCBoYXZlIGFueSBpbXBsaWNhdGlvbnMgZm9yIG1lbW9yeSBhbGxvY2F0aW9uIG9yIGRlYWxsb2NhdGlvbj8KCkkmIzM5O20gYWxzbyB3b25kZXJpbmcgaWYgaXQmIzM5O3MgdGhyZWFkLXNhZmUuIElmIG11bHRpcGxlIHRocmVhZHMgYXJlIGNhbGxpbmcgaXQgY29uY3VycmVudGx5LCBJIG5lZWQgdG8ga25vdyBob3cgaXQgaGFuZGxlcyB0aGF0LiBEb2VzIGl0IHVzZSBsb2Nrcz8gRG9lcyBpdCBtYWtlIGFueSBhc3N1bXB0aW9ucyBhYm91dCB0aGUgY2FsbGluZyBjb250ZXh0PyBBcmUgdGhlcmUgYW55IHBvdGVudGlhbCByYWNlIGNvbmRpdGlvbnMgSSBuZWVkIHRvIHdvcnJ5IGFib3V0PwoKSSYjMzk7bSBtZW50YWxseSBjb21wYXJpbmcgaXQgdG8gc2ltaWxhciBmdW5jdGlvbnMgSSYjMzk7dmUgd29ya2VkIHdpdGggaW4gdGhlIHBhc3QuIFdoYXQmIzM5O3MgdGhlIGtleSBkaWZmZXJlbmNlIGJldHdlZW4gdGhpcyBhbmQgc29tZXRoaW5nIGxpa2UgYHZpcnRfdG9fcGFnZWA/IFdoeSB0aGUgJiMzNDtvciBudWxsJiMzNDsgcGFydD8gV2hhdCYjMzk7cyB0aGUgY29zdCBvZiB0aGUgbnVsbCBjaGVjayB2ZXJzdXMgdGhlIG92ZXJoZWFkIG9mIHRoZSBhY3R1YWwgbWFwcGluZyBwcm9jZXNzPwoKSSYjMzk7bSBhbHJlYWR5IGZvcm11bGF0aW5nIHF1ZXN0aW9ucyBpbiBteSBoZWFkOiBXaGF0IGlzIGl0cyB0eXBpY2FsIHVzYWdlIHBhdHRlcm4/IFdoYXQgYXJlIHRoZSBpbXBsaWNhdGlvbnMgaWYgdGhpcyBmdW5jdGlvbiByZXR1cm5zIG51bGw/IEhvdyB3b3VsZCBpdCBhZmZlY3QgdGhlIHN5c3RlbSYjMzk7cyBwZXJmb3JtYW5jZSwgaWYgaXQgcmV0dXJucyBudWxsIGZyZXF1ZW50bHk/IApJJiMzOTttIHJlYWR5IHRvIGRpZyBpbnRvIHRoZSBjb2RlIGl0c2VsZiBub3cuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTA0LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xNCAwNzo1ODwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O21tL2ttc2FuL3NoYWRvdy5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogNzAsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogMjAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7ICA3MDpcdFx0fVxuICA3MTpcdFx0cmV0dXJuIDA7XG4gIDcyOlx0fVxuICA3MzpcdFxuICA3NDpcdHN0YXRpYyBzdHJ1Y3QgcGFnZSAqdmlydF90b19wYWdlX29yX251bGwodm9pZCAqdmFkZHIpXG4gIDc1Olx0e1xuICA3NjpcdFx0aWYgKGttc2FuX3ZpcnRfYWRkcl92YWxpZCh2YWRkcikpXG4gIDc3Olx0XHRcdHJldHVybiB2aXJ0X3RvX3BhZ2UodmFkZHIpO1xuICA3ODpcdFx0ZWxzZVxuICA3OTpcdFx0XHRyZXR1cm4gTlVMTDtcbiAgODA6XHR9XG4gIDgxOlx0XG4gIDgyOlx0c3RydWN0IHNoYWRvd19vcmlnaW5fcHRyIGttc2FuX2dldF9zaGFkb3dfb3JpZ2luX3B0cih2b2lkICphZGRyZXNzLCB1NjQgc2l6ZSxcbiAgODM6XHRcdFx0XHRcdFx0XHQgICAgIGJvb2wgc3RvcmUpXG4gIDg0Olx0e1xuICA4NTpcdFx0c3RydWN0IHNoYWRvd19vcmlnaW5fcHRyIHJldDtcbiAgODY6XHRcdHZvaWQgKnNoYWRvdztcbiAgODc6XHRcbiAgODg6XHRcdC8qXG4gIDg5Olx0XHQgKiBFdmVuIGlmIHdlIHJlZGlyZWN0IHRoaXMgbWVtb3J5IGFjY2VzcyB0byB0aGUgZHVtbXkgcGFnZSwgaXQgd2lsbFxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEwNS8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTQgMDc6NTg8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjgtZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNDA5MjEKCQkJCQkJCW91dHB1dDogMjMzCgkJCQkJCQl0aG91Z2h0czogMTA3OAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipLTVNBTiBBc3Nlc3NtZW50OiBUaGlzIFBhdGNoIFNlcmllcyBEb2VzbiYjMzk7dCBXYXJyYW50IEZ1enppbmcqKgoKT2theSwgbGV0JiMzOTtzIGJyZWFrIHRoaXMgZG93bi4gTXkgaW5pdGlhbCBhc3Nlc3NtZW50IGlzIHRoYXQgdGhpcyBwYXRjaCBzZXJpZXMgKmFic29sdXRlbHkqIGRvZXMgbm90IHJlcXVpcmUgS01TQU4gZnV6emluZy4gSXQmIzM5O3MgYSBjbGVhciAmIzM0O05lZWRzS01TQU49ZmFsc2UmIzM0OyBzaXR1YXRpb24sIGFuZCBJJiMzOTttIGNvbmZpZGVudCBpbiB0aGF0IGNvbmNsdXNpb24uCgpGaXJzdCwgSSBsb29rZWQgYXQgdGhlIGNvcmUgY2hhbmdlcy4gVGhlIGxvZ2ljIHN1cnJvdW5kaW5nIGB6b25lX2lzX2NvbnRpZ3VvdXNgLCBgc2V0X3pvbmVfY29udGlndW91c2AsIGBjbGVhcl96b25lX2NvbnRpZ3VvdXNgLCBhbmQgdGhlIG5ldyBgcGFnZXNfd2l0aF9vbmxpbmVfbWVtbWFwYCBmaWVsZCBpbiBgc3RydWN0IHpvbmVgIGFyZSB0aGUgcHJpbWFyeSBmb2N1cy4gQ3J1Y2lhbGx5LCBub25lIG9mIHRoZXNlIGNoYW5nZXMgaW50cm9kdWNlIGFueSBkaXJlY3QgaW50ZXJhY3Rpb25zIHdpdGggdXNlciBzcGFjZSB0aGF0IGNvdWxkIGxlYWQgdG8gaW5mb3JtYXRpb24gbGVha3Mgb3IgdGhlIGV4cG9zdXJlIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5LiBLTVNBTiYjMzk7cyBtZXRhZGF0YSBsb2dpYyBpc24mIzM5O3QgdG91Y2hlZCBoZXJlIGVpdGhlci4KCkkgdGhlbiB3ZW50IHRocm91Z2ggdGhlIGZvdXIgS01TQU4gY3JpdGVyaWEgbWV0aWN1bG91c2x5OgoKMS4gICoqTm8gZGF0YSBzZW50IHRvIHVzZXIgc3BhY2UuKiogVGhlIHBhdGNoIGRvZXNuJiMzOTt0IG1vZGlmeSBhbnl0aGluZyBwYXNzZWQgdG8gdXNlciBzcGFjZSB2aWEgYGNvcHlfdG9fdXNlcmAsIGBwdXRfdXNlcmAsIG5ldGxpbmssIGlvY3RsLCBzb2NrZXQgb3B0aW9ucywgb3IgQlBGIGJ1ZmZlcnMuIFRoYXQmIzM5O3MgYSBodWdlIGNoZWNrIGluIHRoZSAmIzM0O25vIEtNU0FOIG5lZWRlZCYjMzQ7IGJveC4KMi4gICoqTm8gcmVsaWFuY2Ugb24gdW5pbml0aWFsaXplZCB2YXJpYWJsZXMgaW4gY29uZGl0aW9uYWwgbG9naWMuKiogVGhlIGBwYWdlc193aXRoX29ubGluZV9tZW1tYXBgIGZpZWxkIGlzIHBhcnQgb2YgYHN0cnVjdCB6b25lYCwgd2hpY2ggaXMgKmFsd2F5cyogemVyb2VkIGR1cmluZyBub2RlIGluaXRpYWxpemF0aW9uLCBhbmQgc3Vic2VxdWVudGx5IHVwZGF0ZWQgYXMgcGFnZXMgYXJlIGluaXRpYWxpemVkL2FkZGVkLiBJdCYjMzk7cyBwcm9wZXJseSB0cmFja2VkLiBObyByZWFkaW5nIG9mIHVuaW5pdGlhbGl6ZWQgdmFyaWFibGVzIGhlcmUuCjMuICAqKk5vIGNyZWF0aW9uIG9mIGNvbXBsZXggZGF0YSBzdHJ1Y3R1cmVzIHdpdGggdW5pbml0aWFsaXplZCBmaWVsZHMuKiogVGhpcyBwYXRjaCBkb2VzbiYjMzk7dCBpbnRyb2R1Y2UgYW55IG5ldyB1bmluaXRpYWxpemVkIGZpZWxkcyB0aGF0IGNvdWxkIGJlIHJlYWQgbGF0ZXIgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMuCjQuICAqKk5vIHJpc2sgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgYmVpbmcgYWNjZXNzZWQgdGhyb3VnaCBib3VuZHMgY2hlY2tzIG9yIGxvZ2ljLioqIFRoZSBjaGFuZ2UgdG8gYHBhZ2VibG9ja19wZm5fdG9fcGFnZWAgdXNlcyBgem9uZV9pc19jb250aWd1b3VzYCBub3cuIElmIHRoZXJlICp3ZXJlKiBhIGJ1ZywgaXQgd291bGQgcmVzdWx0IGluIGBwYWdlYmxvY2tfcGZuX3RvX3BhZ2VgIHJldHVybmluZyBhIGBzdHJ1Y3QgcGFnZWAgZm9yIGFuIG9mZmxpbmUgc2VjdGlvbi4gS0FTQU4gYW5kIHBhZ2UgZmF1bHQgaGFuZGxlcnMgd291bGQgY2F0Y2ggdGhhdCwgYmVjYXVzZSBpdCB3b3VsZCBiZSBhIG1lbW9yeSBhY2Nlc3MgdmlvbGF0aW9uIG9yIGFuIGludmFsaWQgcG9pbnRlciBkZXJlZmVyZW5jZSAob3V0IG9mIGJvdW5kcykuIEl0JiMzOTtzIG5vdCBhYm91dCByZWFkaW5nIHVuaW5pdGlhbGl6ZWQgbWVtb3J5LgoKVGhlIGd1aWRlbGluZXMgYXJlIGV4cGxpY2l0LiBUaGUgcmlzayBoZXJlIGlzIHByaW1hcmlseSByZWxhdGVkIHRvIHBvdGVudGlhbCBvdXQtb2YtYm91bmRzIGFjY2Vzcywgd2hpY2ggS0FTQU4sIExPQ0tERVAsIGFuZCBzdGFuZGFyZCBidWcgZGV0ZWN0b3JzIGFscmVhZHkgaGFuZGxlLiBUaGUgc3RydWN0dXJlcyBhcmUgKmZ1bGx5KiBpbml0aWFsaXplZC4gVGhlIHBhdGNoIGRvZXMgKm5vdCogaW50cm9kdWNlIGFueSByaXNrIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHVzYWdlIG9yIGluZm8tbGVha3MuCgpJIGRvdWJsZS1jaGVja2VkIGFsbCB0aGUgaW52b2x2ZWQgZnVuY3Rpb25zLCB0b29scywgYW5kIGNhbGxzIHRvIG1ha2Ugc3VyZSBJIHdhc24mIzM5O3QgbWlzc2luZyBhbnl0aGluZy4gRXZlcnl0aGluZyBjaGVja3Mgb3V0LgoKU28sIHRoZSB2ZXJkaWN0IGlzIGNsZWFyLiBJJiMzOTttIGdvaW5nIHRvIHNldCBgTmVlZHNLTVNBTj1mYWxzZWAgYW5kIHByb3ZpZGUgdGhpcyBkZXRhaWxlZCBleHBsYW5hdGlvbi4gVGhlIHJhdGlvbmFsZSBpcyBzb2xpZC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMDYvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE0IDA3OjU5PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+c2V0LXJlc3VsdHM8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0tNU0FOUmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIG9wdGltaXplcyBjb250aWd1b3VzIHpvbmUgZGV0ZWN0aW9uIGJ5IGludHJvZHVjaW5nIHRoZSBgcGFnZXNfd2l0aF9vbmxpbmVfbWVtbWFwYCBjb3VudGVyIGluIGBzdHJ1Y3Qgem9uZWAgdG8gcmVwbGFjZSB0aGUgaXRlcmF0aW9uIG92ZXIgcGFnZWJsb2NrcyBpbiBgc2V0X3pvbmVfY29udGlndW91cygpYC4gSXQgYWxzbyByZWZhY3RvcnMgc3Vic2VjdGlvbiBvdmVybGFwIGNoZWNraW5nIGR1cmluZyBtZW1vcnkgaG90cGx1ZyBvcGVyYXRpb25zIChgZHJpdmVycy9iYXNlL21lbW9yeS5jYCwgYG1tL21lbW9yeV9ob3RwbHVnLmNgLCBgbW0vbW1faW5pdC5jYCkuXG5cbk5vbmUgb2YgdGhlIGNoYW5nZXMgdG91Y2gga2VybmVsLXRvLXVzZXIgY29weSBtZWNoYW5pc21zIChlLmcuLCBgY29weV90b191c2VyYCwgbmV0bGluaywgaW9jdGwsIGV0Yy4pLCBub3IgZG8gdGhleSBpbnRyb2R1Y2UgdW5pbml0aWFsaXplZCBzdGFjayBvciBoZWFwIGFsbG9jYXRpb25zLiBgc3RydWN0IHpvbmVgIGluc3RhbmNlcyBhcmUgemVyby1pbml0aWFsaXplZCBkdXJpbmcgZWFybHkgYm9vdCBhbmQgaG90cGx1ZyBub2RlIGFsbG9jYXRpb24uIEFueSBwb3RlbnRpYWwgbG9naWMgYnVncyBpbiBjb250aWd1b3VzIHpvbmUgY2FsY3VsYXRpb24gb3IgUEZOIHRyYXZlcnNhbCBjb3VsZCBsZWFkIHRvIGludmFsaWQgc3RydWN0IHBhZ2UgZGVyZWZlcmVuY2VzIG9yIG91dC1vZi1ib3VuZHMgYWNjZXNzZXMgZHVyaW5nIGNvbXBhY3Rpb24vcGFnZSBpc29sYXRpb24sIHdoaWNoIGZhbGwgdW5kZXIgdGhlIHB1cnZpZXcgb2YgS0FTQU4gb3Igc3RhbmRhcmQgZmF1bHQgaGFuZGxlcnMsIG5vdCBLTVNBTi4gVGhlcmVmb3JlLCBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaXMgbm90IHdhcnJhbnRlZC4mIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0tNU0FOUmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIG9wdGltaXplcyBjb250aWd1b3VzIHpvbmUgZGV0ZWN0aW9uIGJ5IGludHJvZHVjaW5nIHRoZSBgcGFnZXNfd2l0aF9vbmxpbmVfbWVtbWFwYCBjb3VudGVyIGluIGBzdHJ1Y3Qgem9uZWAgdG8gcmVwbGFjZSB0aGUgaXRlcmF0aW9uIG92ZXIgcGFnZWJsb2NrcyBpbiBgc2V0X3pvbmVfY29udGlndW91cygpYC4gSXQgYWxzbyByZWZhY3RvcnMgc3Vic2VjdGlvbiBvdmVybGFwIGNoZWNraW5nIGR1cmluZyBtZW1vcnkgaG90cGx1ZyBvcGVyYXRpb25zIChgZHJpdmVycy9iYXNlL21lbW9yeS5jYCwgYG1tL21lbW9yeV9ob3RwbHVnLmNgLCBgbW0vbW1faW5pdC5jYCkuXG5cbk5vbmUgb2YgdGhlIGNoYW5nZXMgdG91Y2gga2VybmVsLXRvLXVzZXIgY29weSBtZWNoYW5pc21zIChlLmcuLCBgY29weV90b191c2VyYCwgbmV0bGluaywgaW9jdGwsIGV0Yy4pLCBub3IgZG8gdGhleSBpbnRyb2R1Y2UgdW5pbml0aWFsaXplZCBzdGFjayBvciBoZWFwIGFsbG9jYXRpb25zLiBgc3RydWN0IHpvbmVgIGluc3RhbmNlcyBhcmUgemVyby1pbml0aWFsaXplZCBkdXJpbmcgZWFybHkgYm9vdCBhbmQgaG90cGx1ZyBub2RlIGFsbG9jYXRpb24uIEFueSBwb3RlbnRpYWwgbG9naWMgYnVncyBpbiBjb250aWd1b3VzIHpvbmUgY2FsY3VsYXRpb24gb3IgUEZOIHRyYXZlcnNhbCBjb3VsZCBsZWFkIHRvIGludmFsaWQgc3RydWN0IHBhZ2UgZGVyZWZlcmVuY2VzIG9yIG91dC1vZi1ib3VuZHMgYWNjZXNzZXMgZHVyaW5nIGNvbXBhY3Rpb24vcGFnZSBpc29sYXRpb24sIHdoaWNoIGZhbGwgdW5kZXIgdGhlIHB1cnZpZXcgb2YgS0FTQU4gb3Igc3RhbmRhcmQgZmF1bHQgaGFuZGxlcnMsIG5vdCBLTVNBTi4gVGhlcmVmb3JlLCBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaXMgbm90IHdhcnJhbnRlZC4mIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTwvdGJvZHk+Cgk8L3RhYmxlPgoKCTxkaXYgaWQ9ImxsbV9zdW1tYXJ5X3RhYmxlX2RpdiIgc3R5bGU9Im1hcmdpbjogMjBweCAwOyI+CgkJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQkJPGNhcHRpb24+TExNIENhbGxzIFN1bW1hcnk6PC9jYXB0aW9uPgoJCQk8dGhlYWQ+CgkJCQk8dHI+CgkJCQkJPHRoPlRvdGFsIENhbGxzPC90aD4KCQkJCQk8dGg+VG90YWwgVG9rZW5zPC90aD4KCQkJCQk8dGg+QXZnIFRva2VuczwvdGg+CgkJCQkJPHRoPlRvdGFsIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQkJPHRoPkF2ZyBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJPC90cj4KCQkJPC90aGVhZD4KCQkJPHRib2R5IGlkPSJsbG1fc3VtbWFyeV9zdGF0c19ib2R5Ij48L3Rib2R5PgoJCTwvdGFibGU+Cgk8L2Rpdj4KCgk8ZGl2IGlkPSJ0b29sX3N1bW1hcnlfdGFibGVfZGl2IiBzdHlsZT0ibWFyZ2luOiAyMHB4IDA7Ij4KCQk8dGFibGUgY2xhc3M9Imxpc3RfdGFibGUiPgoJCQk8Y2FwdGlvbj5Ub29sIENhbGxzIFN1bW1hcnk6PC9jYXB0aW9uPgoJCQk8dGhlYWQ+CgkJCQk8dHI+CgkJCQkJPHRoPlRvdGFsIENhbGxzPC90aD4KCQkJCQk8dGg+VG90YWwgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCQk8dGg+QXZnIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQk8L3RyPgoJCQk8L3RoZWFkPgoJCQk8dGJvZHkgaWQ9InRvb2xfc3VtbWFyeV9zdGF0c19ib2R5Ij48L3Rib2R5PgoJCTwvdGFibGU+Cgk8L2Rpdj4KCgk8ZGl2IGlkPSJkdXJhdGlvbl9jaGFydF9kaXYiIHN0eWxlPSJ3aWR0aDogMTAwJTsgbWFyZ2luOiAyMHB4IDA7IGJvcmRlcjogMXB4OyI+PC9kaXY+Cgk8ZGl2IGlkPSJ0b2tlbl9jaGFydF9kaXYiIHN0eWxlPSJ3aWR0aDogMTAwJTsgbWFyZ2luOiAyMHB4IDA7IGJvcmRlcjogMXB4OyI+PC9kaXY+CgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS9qc2FwaSI+PC9zY3JpcHQ+Cgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CgkJZ29vZ2xlLmxvYWQoInZpc3VhbGl6YXRpb24iLCAiMSIsIHtwYWNrYWdlczpbImNvcmVjaGFydCJdfSk7CgkJZ29vZ2xlLnNldE9uTG9hZENhbGxiYWNrKGRyYXdDaGFydHMpOwoKCQlmdW5jdGlvbiBkcmF3Q2hhcnRzKCkgewoJCQljb25zdCByYXdEYXRhID0gW3siU3RhcnRlZCI6IjIwMjYtMDktMTRUMDc6NDI6NTYuNzA5ODAzOTExWiIsIlNlcSI6MCwiTmVzdGluZyI6MCwiVHlwZSI6ImZsb3ciLCJOYW1lIjoicGF0Y2gtdHJpYWdlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6OTcyMDQyODA4MzU3LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIk1FTU9SWV9IT1RQTFVHXCIsXG4gICAgXCJNRU1PUllfSE9UUkVNT1ZFXCIsXG4gICAgXCJTUEFSU0VNRU1fVk1FTU1BUFwiLFxuICAgIFwiQ09NUEFDVElPTlwiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcIm1lbW9yeV9ibG9ja19vbmxpbmVcIixcbiAgICBcIm1lbW9yeV9ibG9ja19vZmZsaW5lXCIsXG4gICAgXCJhZGp1c3RfcHJlc2VudF9wYWdlX2NvdW50XCIsXG4gICAgXCJyZW1vdmVfcGZuX3JhbmdlX2Zyb21fem9uZVwiLFxuICAgIFwic2hyaW5rX3pvbmVfc3BhblwiLFxuICAgIFwib2ZmbGluZV9wYWdlc1wiLFxuICAgIFwib25saW5lX3BhZ2VzXCIsXG4gICAgXCJpc29sYXRlX21pZ3JhdGVwYWdlc19yYW5nZVwiXG4gIF0sXG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggb3B0aW1pemVzIGNvbnRpZ3VvdXMgem9uZSBkZXRlY3Rpb24gYnkgaW50cm9kdWNpbmcgdGhlIGBwYWdlc193aXRoX29ubGluZV9tZW1tYXBgIGNvdW50ZXIgaW4gYHN0cnVjdCB6b25lYCB0byByZXBsYWNlIHRoZSBpdGVyYXRpb24gb3ZlciBwYWdlYmxvY2tzIGluIGBzZXRfem9uZV9jb250aWd1b3VzKClgLiBJdCBhbHNvIHJlZmFjdG9ycyBzdWJzZWN0aW9uIG92ZXJsYXAgY2hlY2tpbmcgZHVyaW5nIG1lbW9yeSBob3RwbHVnIG9wZXJhdGlvbnMgKGBkcml2ZXJzL2Jhc2UvbWVtb3J5LmNgLCBgbW0vbWVtb3J5X2hvdHBsdWcuY2AsIGBtbS9tbV9pbml0LmNgKS5cXG5cXG5Ob25lIG9mIHRoZSBjaGFuZ2VzIHRvdWNoIGtlcm5lbC10by11c2VyIGNvcHkgbWVjaGFuaXNtcyAoZS5nLiwgYGNvcHlfdG9fdXNlcmAsIG5ldGxpbmssIGlvY3RsLCBldGMuKSwgbm9yIGRvIHRoZXkgaW50cm9kdWNlIHVuaW5pdGlhbGl6ZWQgc3RhY2sgb3IgaGVhcCBhbGxvY2F0aW9ucy4gYHN0cnVjdCB6b25lYCBpbnN0YW5jZXMgYXJlIHplcm8taW5pdGlhbGl6ZWQgZHVyaW5nIGVhcmx5IGJvb3QgYW5kIGhvdHBsdWcgbm9kZSBhbGxvY2F0aW9uLiBBbnkgcG90ZW50aWFsIGxvZ2ljIGJ1Z3MgaW4gY29udGlndW91cyB6b25lIGNhbGN1bGF0aW9uIG9yIFBGTiB0cmF2ZXJzYWwgY291bGQgbGVhZCB0byBpbnZhbGlkIHN0cnVjdCBwYWdlIGRlcmVmZXJlbmNlcyBvciBvdXQtb2YtYm91bmRzIGFjY2Vzc2VzIGR1cmluZyBjb21wYWN0aW9uL3BhZ2UgaXNvbGF0aW9uLCB3aGljaCBmYWxsIHVuZGVyIHRoZSBwdXJ2aWV3IG9mIEtBU0FOIG9yIHN0YW5kYXJkIGZhdWx0IGhhbmRsZXJzLCBub3QgS01TQU4uIFRoZXJlZm9yZSwgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGlzIG5vdCB3YXJyYW50ZWQuXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiBmYWxzZSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggcmVmYWN0b3JzIGNvcmUgbWVtb3J5IG1hbmFnZW1lbnQgbG9naWMgZm9yIHRyYWNraW5nIHpvbmUgY29udGlndWl0eSBhbmQgc2hyaW5raW5nIHpvbmUgc3BhbnMgYWNyb3NzIG1tL21lbW9yeV9ob3RwbHVnLmMsIGRyaXZlcnMvYmFzZS9tZW1vcnkuYywgYW5kIGluY2x1ZGUvbGludXgvbW16b25lLmguIEluc3RlYWQgb2Ygc2Nhbm5pbmcgcGFnZWJsb2Nrcywgem9uZSBjb250aWd1aXR5IGlzIG5vdyB0cmFja2VkIGR5bmFtaWNhbGx5IHZpYSBwYWdlc193aXRoX29ubGluZV9tZW1tYXAgYW5kIHVwZGF0ZWQgZHVyaW5nIG1lbW9yeSBvbmxpbmUvb2ZmbGluZSBvcGVyYXRpb25zLiBJbmNvcnJlY3Qgem9uZSBjb250aWd1aXR5IHRyYWNraW5nIGNhbiBsZWFkIHRvIGludmFsaWQgcGZuX3RvX3BhZ2UoKSBsb29rdXBzIGR1cmluZyBtZW1vcnkgY29tcGFjdGlvbiAoZS5nLiBpc29sYXRlX21pZ3JhdGVwYWdlc19yYW5nZSksIGFuZCBtb2RpZmllZCB6b25lIHNocmlua2luZyBsb2dpYyAoc3Vic2VjdGlvbl9vdmVybGFwc196b25lKSBjb3VsZCBjb3JydXB0IHpvbmUgYm91bmRhcmllcy4gVGhlc2UgcGF0aHMgYXJlIHJlYWNoYWJsZSB2aWEgc3lzZnMgbWVtb3J5IGJsb2NrIG1hbmFnZW1lbnQgYW5kIG1lbW9yeSBjb21wYWN0aW9uLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xNFQwNzo0Mjo1Ni43MDk4MDY5NDFaIiwiU2VxIjoxLCJOZXN0aW5nIjoxLCJUeXBlIjoiYWN0aW9uIiwiTmFtZSI6InJlYWQtcGF0Y2gtZGlmZiIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjUxOTk4MDU3MiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiUGF0Y2hEaWZmXCI6IFwiY29tbWl0IGI3NTc0MWU5NjA0NzA0ZmM1MDZiMTgzYzUyZDUxNTIxZTI0MDEwOTBcXG5BdXRob3I6IHN5ei1jbHVzdGVyIFxcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVxcdTAwM2VcXG5EYXRlOiAgIE1vbiBTZXAgMTQgMDc6NDI6NTYgMjAyNiArMDAwMFxcblxcbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcXG5cXG5kaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9tbS9waHlzaWNhbF9tZW1vcnkucnN0IGIvRG9jdW1lbnRhdGlvbi9tbS9waHlzaWNhbF9tZW1vcnkucnN0XFxuaW5kZXggYTA5NDA3ZDcyOTczNi4uMmU2N2U4YjIzYTk5NCAxMDA2NDRcXG4tLS0gYS9Eb2N1bWVudGF0aW9uL21tL3BoeXNpY2FsX21lbW9yeS5yc3RcXG4rKysgYi9Eb2N1bWVudGF0aW9uL21tL3BoeXNpY2FsX21lbW9yeS5yc3RcXG5AQCAtNDgwLDYgKzQ4MCwxMiBAQCBHZW5lcmFsXFxuICAgYGBwcmVzZW50X3BhZ2VzYGAgc2hvdWxkIHVzZSBgYGdldF9vbmxpbmVfbWVtcygpYGAgdG8gZ2V0IGEgc3RhYmxlIHZhbHVlLiBJdFxcbiAgIGlzIGluaXRpYWxpemVkIGJ5IGBgY2FsY3VsYXRlX25vZGVfdG90YWxwYWdlcygpYGAuXFxuIFxcbitgYHBhZ2VzX3dpdGhfb25saW5lX21lbW1hcGBgXFxuKyAgUGFnZXMgd2l0aGluIHRoZSB6b25lIHRoYXQgaGF2ZSBhbiBvbmxpbmUgbWVtb3J5IG1hcDogcHJlc2VudCBwYWdlcyBhbmRcXG4rICBtZW1vcnkgaG9sZXMgd2hvc2UgbWVtb3J5IG1hcCBoYXMgYmVlbiBpbml0aWFsaXplZCBhbmRcXG4rICBgYHBmbl90b19vbmxpbmVfcGFnZSgpYGAgc3VjY2VlZHMuIFNlZSB0aGUgY29tbWVudCBmb3JcXG4rICBgYHBhZ2VzX3dpdGhfb25saW5lX21lbW1hcGBgIGluIGBgaW5jbHVkZS9saW51eC9tbXpvbmUuaGBgIGZvciBtb3JlIGRldGFpbHMuXFxuK1xcbiBgYHByZXNlbnRfZWFybHlfcGFnZXNgYFxcbiAgIFRoZSBwcmVzZW50IHBhZ2VzIGV4aXN0aW5nIHdpdGhpbiB0aGUgem9uZSBsb2NhdGVkIG9uIG1lbW9yeSBhdmFpbGFibGUgc2luY2VcXG4gICBlYXJseSBib290LCBleGNsdWRpbmcgaG90cGx1Z2dlZCBtZW1vcnkuIERlZmluZWQgb25seSB3aGVuXFxuZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9tZW1vcnkuYyBiL2RyaXZlcnMvYmFzZS9tZW1vcnkuY1xcbmluZGV4IDVlZWFkMzM0NmYxZTMuLjI4Zjk1MDNmNmE3MTAgMTAwNjQ0XFxuLS0tIGEvZHJpdmVycy9iYXNlL21lbW9yeS5jXFxuKysrIGIvZHJpdmVycy9iYXNlL21lbW9yeS5jXFxuQEAgLTI1NSw2ICsyNTUsNyBAQCBzdGF0aWMgaW50IG1lbW9yeV9ibG9ja19vbmxpbmUoc3RydWN0IG1lbW9yeV9ibG9jayAqbWVtKVxcbiBcXHRcXHRucl92bWVtbWFwX3BhZ2VzID0gbWVtLVxcdTAwM2VhbHRtYXAtXFx1MDAzZWZyZWU7XFxuIFxcbiBcXHRtZW1faG90cGx1Z19iZWdpbigpO1xcbitcXHRjbGVhcl96b25lX2NvbnRpZ3VvdXMoem9uZSk7XFxuIFxcdGlmIChucl92bWVtbWFwX3BhZ2VzKSB7XFxuIFxcdFxcdHJldCA9IG1ocF9pbml0X21lbW1hcF9vbl9tZW1vcnkoc3RhcnRfcGZuLCBucl92bWVtbWFwX3BhZ2VzLCB6b25lKTtcXG4gXFx0XFx0aWYgKHJldClcXG5AQCAtMjc5LDYgKzI4MCw3IEBAIHN0YXRpYyBpbnQgbWVtb3J5X2Jsb2NrX29ubGluZShzdHJ1Y3QgbWVtb3J5X2Jsb2NrICptZW0pXFxuIFxcbiBcXHRtZW0tXFx1MDAzZXpvbmUgPSB6b25lO1xcbiBvdXQ6XFxuK1xcdHNldF96b25lX2NvbnRpZ3VvdXMoem9uZSk7XFxuIFxcdG1lbV9ob3RwbHVnX2RvbmUoKTtcXG4gXFx0cmV0dXJuIHJldDtcXG4gfVxcbkBAIC0zMDQsNiArMzA2LDcgQEAgc3RhdGljIGludCBtZW1vcnlfYmxvY2tfb2ZmbGluZShzdHJ1Y3QgbWVtb3J5X2Jsb2NrICptZW0pXFxuIFxcdFxcdG5yX3ZtZW1tYXBfcGFnZXMgPSBtZW0tXFx1MDAzZWFsdG1hcC1cXHUwMDNlZnJlZTtcXG4gXFxuIFxcdG1lbV9ob3RwbHVnX2JlZ2luKCk7XFxuK1xcdGNsZWFyX3pvbmVfY29udGlndW91cyhtZW0tXFx1MDAzZXpvbmUpO1xcbiBcXHRpZiAobnJfdm1lbW1hcF9wYWdlcylcXG4gXFx0XFx0YWRqdXN0X3ByZXNlbnRfcGFnZV9jb3VudChwZm5fdG9fcGFnZShzdGFydF9wZm4pLCBtZW0tXFx1MDAzZWdyb3VwLFxcbiBcXHRcXHRcXHRcXHRcXHQgIC1ucl92bWVtbWFwX3BhZ2VzKTtcXG5AQCAtMzIxLDggKzMyNCwxMCBAQCBzdGF0aWMgaW50IG1lbW9yeV9ibG9ja19vZmZsaW5lKHN0cnVjdCBtZW1vcnlfYmxvY2sgKm1lbSlcXG4gXFx0aWYgKG5yX3ZtZW1tYXBfcGFnZXMpXFxuIFxcdFxcdG1ocF9kZWluaXRfbWVtbWFwX29uX21lbW9yeShzdGFydF9wZm4sIG5yX3ZtZW1tYXBfcGFnZXMpO1xcbiBcXG4tXFx0bWVtLVxcdTAwM2V6b25lID0gTlVMTDtcXG4gb3V0OlxcbitcXHRzZXRfem9uZV9jb250aWd1b3VzKG1lbS1cXHUwMDNlem9uZSk7XFxuK1xcdGlmICghcmV0KVxcbitcXHRcXHRtZW0tXFx1MDAzZXpvbmUgPSBOVUxMO1xcbiBcXHRtZW1faG90cGx1Z19kb25lKCk7XFxuIFxcdHJldHVybiByZXQ7XFxuIH1cXG5kaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tbXpvbmUuaCBiL2luY2x1ZGUvbGludXgvbW16b25lLmhcXG5pbmRleCA5NGY5YzNmZjU0MTYwLi43YmVmZTUwMjIzZDEyIDEwMDY0NFxcbi0tLSBhL2luY2x1ZGUvbGludXgvbW16b25lLmhcXG4rKysgYi9pbmNsdWRlL2xpbnV4L21tem9uZS5oXFxuQEAgLTEwNDMsNiArMTA0Myw0MiBAQCBzdHJ1Y3Qgem9uZSB7XFxuIFxcdCAqIGNtYSBwYWdlcyBpcyBwcmVzZW50IHBhZ2VzIHRoYXQgYXJlIGFzc2lnbmVkIGZvciBDTUEgdXNlXFxuIFxcdCAqIChNSUdSQVRFX0NNQSkuXFxuIFxcdCAqXFxuK1xcdCAqIHBhZ2VzX3dpdGhfb25saW5lX21lbW1hcCB0cmFja3MgcGFnZXMgd2l0aGluIHRoZSB6b25lIHRoYXQgaGF2ZVxcbitcXHQgKiBhbiBvbmxpbmUgbWVtb3J5IG1hcDogcHJlc2VudCBwYWdlcyBhbmQgbWVtb3J5IGhvbGVzIHdob3NlXFxuK1xcdCAqIG1lbW9yeSBtYXAgaGFzIGJlZW4gaW5pdGlhbGl6ZWQgYW5kIHBmbl90b19vbmxpbmVfcGFnZSgpXFxuK1xcdCAqIHN1Y2NlZWRzLiBXaGVuIHNwYW5uZWRfcGFnZXMgPT0gcGFnZXNfd2l0aF9vbmxpbmVfbWVtbWFwLFxcbitcXHQgKiBwZm5fdG9fcGFnZSgpIGNhbiBiZSBwZXJmb3JtZWQgd2l0aG91dCBmdXJ0aGVyIGNoZWNrcyBvbiBhbnlcXG4rXFx0ICogUEZOIHdpdGhpbiB0aGUgem9uZSBzcGFuLlxcbitcXHQgKlxcbitcXHQgKiBOb3RlOiB0aGlzIGNvdW50ZXIgbWF5IHRlbXBvcmFyaWx5IHVuZGVyY291bnQgd2hlbiBwYWdlcyB3aXRoIGFuXFxuK1xcdCAqIG9ubGluZSBtZW1vcnkgbWFwIGV4aXN0IG91dHNpZGUgdGhlIGN1cnJlbnQgem9uZSBzcGFuLiBTdWNoIHBhZ2VzXFxuK1xcdCAqIGFyZSBvbmx5IGNyZWF0ZWQgZHVyaW5nIGJvb3QsIHdoZW4gaW5pdGlhbGl6aW5nIHRoZSBtZW1vcnkgbWFwIG9mXFxuK1xcdCAqIHBhZ2VzIHRoYXQgZG8gbm90IGZhbGwgaW50byBhbnkgem9uZSBzcGFuLiBUaGUgdW5kZXJjb3VudCBpdHNlbGZcXG4rXFx0ICogY2FuIG9ubHkgaGFwcGVuIGFmdGVyIGJvb3QsIGR1cmluZyBtZW1vcnkgaG90cGx1Zywgd2hlbiBncm93aW5nXFxuK1xcdCAqIHRoZSB6b25lIHRvIGNvdmVyIHN1Y2ggcGFnZXMgYW5kIGxhdGVyIHNocmlua2luZyBpdCBiYWNrLCB3aGljaFxcbitcXHQgKiBtYXkgcmVzdWx0IGluIGEgXFxcInRvbyBzbWFsbFxcXCIgdmFsdWUuIFRoaXMgaXMgc2FmZTogaXQgbWVyZWx5XFxuK1xcdCAqIHByZXZlbnRzIGRldGVjdGluZyBhIGNvbnRpZ3VvdXMgem9uZS5cXG4rXFx0ICpcXG4rXFx0ICogSGVyZSBpcyBhbiBleGFtcGxlIChwYWdlIG51bWJlcnMgYXJlIGp1c3QgZm9yIGlsbHVzdHJhdGlvblxcbitcXHQgKiBwdXJwb3Nlcyk6XFxuK1xcdCAqICAgYWZ0ZXIgYm9vdDpcXG4rXFx0ICogICAgICAgWyAgem9uZSBzcGFuICBdXFxuK1xcdCAqICAgICAgIFsgICB6b25lIHBhZ2VzICAgXVxcbitcXHQgKiAgICAgICBzcGFubmVkPTEwLCBpbml0aWFsaXplZD0xNSwgb25saW5lPTEwXFxuK1xcdCAqICAgICAgIG9ubGluZSA9PSBzcGFubmVkICAtXFx1MDAzZSAgY29udGlndW91c1xcbitcXHQgKlxcbitcXHQgKiAgIGdyb3dpbmcgYWZ0ZXIgaG90cGx1ZyAoaG90cGx1ZyA1KTpcXG4rXFx0ICogICAgICAgWyAgem9uZSBzcGFuICAgICAgICAgICAgICAgICAgICAgICAgICBdXFxuK1xcdCAqICAgICAgIFsgICB6b25lIHBhZ2VzICAgXSAgIFsgICB6b25lIHBhZ2VzICAgXVxcbitcXHQgKiAgICAgICBzcGFubmVkPTMwLCBpbml0aWFsaXplZD0yMCwgb25saW5lPTE1XFxuK1xcdCAqICAgICAgIG9ubGluZSAhPSBzcGFubmVkICAtXFx1MDAzZSAgbm90IGNvbnRpZ3VvdXNcXG4rXFx0ICpcXG4rXFx0ICogICBzaHJpbmtpbmcgYWZ0ZXIgaG90dW5wbHVnIChob3R1bnBsdWcgNSBhZ2Fpbik6XFxuK1xcdCAqICAgICAgIFsgIHpvbmUgc3BhbiAgICAgXVxcbitcXHQgKiAgICAgICBbICAgem9uZSBwYWdlcyAgIF1cXG4rXFx0ICogICAgICAgc3Bhbm5lZD0xNSwgaW5pdGlhbGl6ZWQ9MTUsIG9ubGluZT0xMFxcbitcXHQgKiAgICAgICBvbmxpbmUgIT0gc3Bhbm5lZCAgLVxcdTAwM2UgIG5vdCBjb250aWd1b3VzIGFsdGhvdWdoIGNvbnRpZ3VvdXNcXG4rXFx0ICpcXG4gXFx0ICogU28gcHJlc2VudF9wYWdlcyBtYXkgYmUgdXNlZCBieSBtZW1vcnkgaG90cGx1ZyBvciBtZW1vcnkgcG93ZXJcXG4gXFx0ICogbWFuYWdlbWVudCBsb2dpYyB0byBmaWd1cmUgb3V0IHVubWFuYWdlZCBwYWdlcyBieSBjaGVja2luZ1xcbiBcXHQgKiAocHJlc2VudF9wYWdlcyAtIG1hbmFnZWRfcGFnZXMpLiBBbmQgbWFuYWdlZF9wYWdlcyBzaG91bGQgYmUgdXNlZFxcbkBAIC0xMDY3LDYgKzExMDMsNyBAQCBzdHJ1Y3Qgem9uZSB7XFxuIFxcdGF0b21pY19sb25nX3RcXHRcXHRtYW5hZ2VkX3BhZ2VzO1xcbiBcXHR1bnNpZ25lZCBsb25nXFx0XFx0c3Bhbm5lZF9wYWdlcztcXG4gXFx0dW5zaWduZWQgbG9uZ1xcdFxcdHByZXNlbnRfcGFnZXM7XFxuK1xcdHVuc2lnbmVkIGxvbmdcXHRcXHRwYWdlc193aXRoX29ubGluZV9tZW1tYXA7XFxuICNpZiBkZWZpbmVkKENPTkZJR19NRU1PUllfSE9UUExVRylcXG4gXFx0dW5zaWduZWQgbG9uZ1xcdFxcdHByZXNlbnRfZWFybHlfcGFnZXM7XFxuICNlbmRpZlxcbkBAIC0xNjk0LDYgKzE3MzEsMzggQEAgc3RhdGljIGlubGluZSBib29sIHpvbmVfaXNfem9uZV9kZXZpY2UoY29uc3Qgc3RydWN0IHpvbmUgKnpvbmUpXFxuIH1cXG4gI2VuZGlmXFxuIFxcbisvKipcXG4rICogem9uZV9pc19jb250aWd1b3VzIC0gdGVzdCB3aGV0aGVyIGEgem9uZSBpcyBjb250aWd1b3VzXFxuKyAqIEB6b25lOiB0aGUgem9uZSB0byB0ZXN0LlxcbisgKlxcbisgKiBJbiBhIGNvbnRpZ3VvdXMgem9uZSwgaXQgaXMgdmFsaWQgdG8gY2FsbCBwZm5fdG9fcGFnZSgpIG9uIGFueSBQRk4gaW4gdGhlXFxuKyAqIHNwYW5uZWQgem9uZSB3aXRob3V0IHJlcXVpcmluZyBwZm5fdmFsaWQoKSBvciBwZm5fdG9fb25saW5lX3BhZ2UoKSBjaGVja3MuXFxuKyAqXFxuKyAqIE5vdGUgdGhhdCBtaXNzaW5nIHN5bmNocm9uaXphdGlvbiB3aXRoIG1lbW9yeSBvZmZsaW5pbmcgbWFrZXMgYW55IFBGTlxcbisgKiB0cmF2ZXJzYWwgcHJvbmUgdG8gcmFjZXMuXFxuKyAqXFxuKyAqIFpPTkVfREVWSUNFIHpvbmVzIGFyZSBhbHdheXMgbWFya2VkIG5vbi1jb250aWd1b3VzLlxcbisgKlxcbisgKiBSZXR1cm46IHRydWUgaWYgY29udGlndW91cywgb3RoZXJ3aXNlIGZhbHNlLlxcbisgKi9cXG4rc3RhdGljIGlubGluZSBib29sIHpvbmVfaXNfY29udGlndW91cyhjb25zdCBzdHJ1Y3Qgem9uZSAqem9uZSlcXG4re1xcbitcXHRyZXR1cm4gUkVBRF9PTkNFKHpvbmUtXFx1MDAzZWNvbnRpZ3VvdXMpO1xcbit9XFxuK1xcbitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X3pvbmVfY29udGlndW91cyhzdHJ1Y3Qgem9uZSAqem9uZSlcXG4re1xcbitcXHRpZiAoem9uZV9pc196b25lX2RldmljZSh6b25lKSlcXG4rXFx0XFx0cmV0dXJuO1xcbitcXHRpZiAoem9uZS1cXHUwMDNlc3Bhbm5lZF9wYWdlcyA9PSB6b25lLVxcdTAwM2VwYWdlc193aXRoX29ubGluZV9tZW1tYXApXFxuK1xcdFxcdFdSSVRFX09OQ0Uoem9uZS1cXHUwMDNlY29udGlndW91cywgdHJ1ZSk7XFxuK31cXG4rXFxuK3N0YXRpYyBpbmxpbmUgdm9pZCBjbGVhcl96b25lX2NvbnRpZ3VvdXMoc3RydWN0IHpvbmUgKnpvbmUpXFxuK3tcXG4rXFx0V1JJVEVfT05DRSh6b25lLVxcdTAwM2Vjb250aWd1b3VzLCBmYWxzZSk7XFxuK31cXG4rXFxuIC8qXFxuICAqIFJldHVybnMgdHJ1ZSBpZiBhIHpvbmUgaGFzIHBhZ2VzIG1hbmFnZWQgYnkgdGhlIGJ1ZGR5IGFsbG9jYXRvci5cXG4gICogQWxsIHRoZSByZWNsYWltIGRlY2lzaW9ucyBoYXZlIHRvIHVzZSB0aGlzIGZ1bmN0aW9uIHJhdGhlciB0aGFuXFxuZGlmZiAtLWdpdCBhL21tL21lbW9yeV9ob3RwbHVnLmMgYi9tbS9tZW1vcnlfaG90cGx1Zy5jXFxuaW5kZXggMjI2YWI5Y2IwNzhhZC4uMTAwOTQxZDFiODI4YSAxMDA2NDRcXG4tLS0gYS9tbS9tZW1vcnlfaG90cGx1Zy5jXFxuKysrIGIvbW0vbWVtb3J5X2hvdHBsdWcuY1xcbkBAIC00MjUsNDkgKzQyNSwzOSBAQCBpbnQgX19hZGRfcGFnZXMoaW50IG5pZCwgdW5zaWduZWQgbG9uZyBwZm4sIHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMsXFxuIFxcdHJldHVybiBlcnI7XFxuIH1cXG4gXFxuLS8qIGZpbmQgdGhlIHNtYWxsZXN0IHZhbGlkIHBmbiBpbiB0aGUgcmFuZ2UgW3N0YXJ0X3BmbiwgZW5kX3BmbikgKi9cXG4tc3RhdGljIHVuc2lnbmVkIGxvbmcgZmluZF9zbWFsbGVzdF9zZWN0aW9uX3BmbihpbnQgbmlkLCBzdHJ1Y3Qgem9uZSAqem9uZSxcXG4tXFx0XFx0XFx0XFx0ICAgICB1bnNpZ25lZCBsb25nIHN0YXJ0X3BmbixcXG4tXFx0XFx0XFx0XFx0ICAgICB1bnNpZ25lZCBsb25nIGVuZF9wZm4pXFxuK3N0YXRpYyBib29sIHN1YnNlY3Rpb25fb3ZlcmxhcHNfem9uZSh1bnNpZ25lZCBsb25nIHBmbiwgc3RydWN0IHpvbmUgKnpvbmUpXFxuIHtcXG4tXFx0Zm9yICg7IHN0YXJ0X3BmbiBcXHUwMDNjIGVuZF9wZm47IHN0YXJ0X3BmbiArPSBQQUdFU19QRVJfU1VCU0VDVElPTikge1xcbi1cXHRcXHRpZiAodW5saWtlbHkoIXBmbl90b19vbmxpbmVfcGFnZShzdGFydF9wZm4pKSlcXG4tXFx0XFx0XFx0Y29udGludWU7XFxuK1xcdGNvbnN0IHVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuID0gQUxJR05fRE9XTihwZm4sIFBBR0VTX1BFUl9TVUJTRUNUSU9OKTtcXG4rXFx0Y29uc3QgdW5zaWduZWQgbG9uZyBlbmRfcGZuID0gc3RhcnRfcGZuICsgUEFHRVNfUEVSX1NVQlNFQ1RJT04gLSAxO1xcbiBcXG4tXFx0XFx0aWYgKHVubGlrZWx5KHBmbl90b19uaWQoc3RhcnRfcGZuKSAhPSBuaWQpKVxcbi1cXHRcXHRcXHRjb250aW51ZTtcXG4rXFx0LyogQWxsIHBhZ2VzIGluIGEgc3Vic2VjdGlvbiBhcmUgZWl0aGVyIG9ubGluZSBvciBvZmZsaW5lLiAqL1xcbitcXHRpZiAodW5saWtlbHkoIXBmbl90b19vbmxpbmVfcGFnZShzdGFydF9wZm4pKSlcXG4rXFx0XFx0cmV0dXJuIGZhbHNlO1xcbiBcXG4tXFx0XFx0aWYgKHpvbmUgIT0gcGFnZV96b25lKHBmbl90b19wYWdlKHN0YXJ0X3BmbikpKVxcbi1cXHRcXHRcXHRjb250aW51ZTtcXG4rXFx0LyogQ2hlY2tpbmcgc3RhcnQrZW5kIGlzIHN1ZmZpY2llbnQuICovXFxuK1xcdHJldHVybiB6b25lID09IHBhZ2Vfem9uZShwZm5fdG9fcGFnZShzdGFydF9wZm4pKSB8fFxcbitcXHQgICAgICAgem9uZSA9PSBwYWdlX3pvbmUocGZuX3RvX3BhZ2UoZW5kX3BmbikpO1xcbit9XFxuIFxcbi1cXHRcXHRyZXR1cm4gc3RhcnRfcGZuO1xcbisvKiBmaW5kIHRoZSBzbWFsbGVzdCB2YWxpZCBwZm4gaW4gdGhlIHJhbmdlIFtzdGFydF9wZm4sIGVuZF9wZm4pICovXFxuK3N0YXRpYyB1bnNpZ25lZCBsb25nIGZpbmRfc21hbGxlc3Rfc2VjdGlvbl9wZm4oc3RydWN0IHpvbmUgKnpvbmUsXFxuK1xcdFxcdHVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuLCB1bnNpZ25lZCBsb25nIGVuZF9wZm4pXFxuK3tcXG4rXFx0Zm9yICg7IHN0YXJ0X3BmbiBcXHUwMDNjIGVuZF9wZm47IHN0YXJ0X3BmbiArPSBQQUdFU19QRVJfU1VCU0VDVElPTikge1xcbitcXHRcXHRpZiAoc3Vic2VjdGlvbl9vdmVybGFwc196b25lKHN0YXJ0X3Bmbiwgem9uZSkpXFxuK1xcdFxcdFxcdHJldHVybiBzdGFydF9wZm47XFxuIFxcdH1cXG4tXFxuIFxcdHJldHVybiAwO1xcbiB9XFxuIFxcbiAvKiBmaW5kIHRoZSBiaWdnZXN0IHZhbGlkIHBmbiBpbiB0aGUgcmFuZ2UgW3N0YXJ0X3BmbiwgZW5kX3BmbikuICovXFxuLXN0YXRpYyB1bnNpZ25lZCBsb25nIGZpbmRfYmlnZ2VzdF9zZWN0aW9uX3BmbihpbnQgbmlkLCBzdHJ1Y3Qgem9uZSAqem9uZSxcXG4tXFx0XFx0XFx0XFx0ICAgIHVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuLFxcbi1cXHRcXHRcXHRcXHQgICAgdW5zaWduZWQgbG9uZyBlbmRfcGZuKVxcbitzdGF0aWMgdW5zaWduZWQgbG9uZyBmaW5kX2JpZ2dlc3Rfc2VjdGlvbl9wZm4oc3RydWN0IHpvbmUgKnpvbmUsXFxuK1xcdFxcdHVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuLCB1bnNpZ25lZCBsb25nIGVuZF9wZm4pXFxuIHtcXG4tXFx0dW5zaWduZWQgbG9uZyBwZm47XFxuLVxcbi1cXHQvKiBwZm4gaXMgdGhlIGVuZCBwZm4gb2YgYSBtZW1vcnkgc2VjdGlvbi4gKi9cXG4tXFx0cGZuID0gZW5kX3BmbiAtIDE7XFxuLVxcdGZvciAoOyBwZm4gXFx1MDAzZT0gc3RhcnRfcGZuOyBwZm4gLT0gUEFHRVNfUEVSX1NVQlNFQ1RJT04pIHtcXG4tXFx0XFx0aWYgKHVubGlrZWx5KCFwZm5fdG9fb25saW5lX3BhZ2UocGZuKSkpXFxuLVxcdFxcdFxcdGNvbnRpbnVlO1xcbi1cXG4tXFx0XFx0aWYgKHVubGlrZWx5KHBmbl90b19uaWQocGZuKSAhPSBuaWQpKVxcbi1cXHRcXHRcXHRjb250aW51ZTtcXG4tXFxuLVxcdFxcdGlmICh6b25lICE9IHBhZ2Vfem9uZShwZm5fdG9fcGFnZShwZm4pKSlcXG4tXFx0XFx0XFx0Y29udGludWU7XFxuLVxcbi1cXHRcXHRyZXR1cm4gcGZuO1xcbitcXHRmb3IgKDsgZW5kX3BmbiBcXHUwMDNlIHN0YXJ0X3BmbjsgZW5kX3BmbiAtPSBQQUdFU19QRVJfU1VCU0VDVElPTikge1xcbitcXHRcXHRpZiAoc3Vic2VjdGlvbl9vdmVybGFwc196b25lKGVuZF9wZm4gLSAxLCB6b25lKSlcXG4rXFx0XFx0XFx0cmV0dXJuIGVuZF9wZm4gLSAxO1xcbiBcXHR9XFxuLVxcbiBcXHRyZXR1cm4gMDtcXG4gfVxcbiBcXG5AQCAtNDc1LDcgKzQ2NSw2IEBAIHN0YXRpYyB2b2lkIHNocmlua196b25lX3NwYW4oc3RydWN0IHpvbmUgKnpvbmUsIHVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuLFxcbiBcXHRcXHRcXHQgICAgIHVuc2lnbmVkIGxvbmcgZW5kX3BmbilcXG4ge1xcbiBcXHR1bnNpZ25lZCBsb25nIHBmbjtcXG4tXFx0aW50IG5pZCA9IHpvbmVfdG9fbmlkKHpvbmUpO1xcbiBcXG4gXFx0aWYgKHpvbmUtXFx1MDAzZXpvbmVfc3RhcnRfcGZuID09IHN0YXJ0X3Bmbikge1xcbiBcXHRcXHQvKlxcbkBAIC00ODQsNyArNDczLDcgQEAgc3RhdGljIHZvaWQgc2hyaW5rX3pvbmVfc3BhbihzdHJ1Y3Qgem9uZSAqem9uZSwgdW5zaWduZWQgbG9uZyBzdGFydF9wZm4sXFxuIFxcdFxcdCAqIEluIHRoaXMgY2FzZSwgd2UgZmluZCBzZWNvbmQgc21hbGxlc3QgdmFsaWQgbWVtX3NlY3Rpb25cXG4gXFx0XFx0ICogZm9yIHNocmlua2luZyB6b25lLlxcbiBcXHRcXHQgKi9cXG4tXFx0XFx0cGZuID0gZmluZF9zbWFsbGVzdF9zZWN0aW9uX3BmbihuaWQsIHpvbmUsIGVuZF9wZm4sXFxuK1xcdFxcdHBmbiA9IGZpbmRfc21hbGxlc3Rfc2VjdGlvbl9wZm4oem9uZSwgZW5kX3BmbixcXG4gXFx0XFx0XFx0XFx0XFx0XFx0em9uZV9lbmRfcGZuKHpvbmUpKTtcXG4gXFx0XFx0aWYgKHBmbikge1xcbiBcXHRcXHRcXHR6b25lLVxcdTAwM2VzcGFubmVkX3BhZ2VzID0gem9uZV9lbmRfcGZuKHpvbmUpIC0gcGZuO1xcbkBAIC01MDAsNyArNDg5LDcgQEAgc3RhdGljIHZvaWQgc2hyaW5rX3pvbmVfc3BhbihzdHJ1Y3Qgem9uZSAqem9uZSwgdW5zaWduZWQgbG9uZyBzdGFydF9wZm4sXFxuIFxcdFxcdCAqIEluIHRoaXMgY2FzZSwgd2UgZmluZCBzZWNvbmQgYmlnZ2VzdCB2YWxpZCBtZW1fc2VjdGlvbiBmb3JcXG4gXFx0XFx0ICogc2hyaW5raW5nIHpvbmUuXFxuIFxcdFxcdCAqL1xcbi1cXHRcXHRwZm4gPSBmaW5kX2JpZ2dlc3Rfc2VjdGlvbl9wZm4obmlkLCB6b25lLCB6b25lLVxcdTAwM2V6b25lX3N0YXJ0X3BmbixcXG4rXFx0XFx0cGZuID0gZmluZF9iaWdnZXN0X3NlY3Rpb25fcGZuKHpvbmUsIHpvbmUtXFx1MDAzZXpvbmVfc3RhcnRfcGZuLFxcbiBcXHRcXHRcXHRcXHRcXHQgICAgICAgc3RhcnRfcGZuKTtcXG4gXFx0XFx0aWYgKHBmbilcXG4gXFx0XFx0XFx0em9uZS1cXHUwMDNlc3Bhbm5lZF9wYWdlcyA9IHBmbiAtIHpvbmUtXFx1MDAzZXpvbmVfc3RhcnRfcGZuICsgMTtcXG5AQCAtNTYwLDE4ICs1NDksMTMgQEAgdm9pZCByZW1vdmVfcGZuX3JhbmdlX2Zyb21fem9uZShzdHJ1Y3Qgem9uZSAqem9uZSxcXG4gXFxuIFxcdC8qXFxuIFxcdCAqIFpvbmUgc2hyaW5raW5nIGNvZGUgY2Fubm90IHByb3Blcmx5IGRlYWwgd2l0aCBaT05FX0RFVklDRS4gU29cXG4tXFx0ICogd2Ugd2lsbCBub3QgdHJ5IHRvIHNocmluayB0aGUgem9uZXMgLSB3aGljaCBpcyBva2F5IGFzXFxuLVxcdCAqIHNldF96b25lX2NvbnRpZ3VvdXMoKSBjYW5ub3QgZGVhbCB3aXRoIFpPTkVfREVWSUNFIGVpdGhlciB3YXkuXFxuK1xcdCAqIHdlIHdpbGwgbm90IHRyeSB0byBzaHJpbmsgaXQuXFxuIFxcdCAqL1xcbiBcXHRpZiAoem9uZV9pc196b25lX2RldmljZSh6b25lKSlcXG4gXFx0XFx0cmV0dXJuO1xcbiBcXG4tXFx0Y2xlYXJfem9uZV9jb250aWd1b3VzKHpvbmUpO1xcbi1cXG4gXFx0c2hyaW5rX3pvbmVfc3Bhbih6b25lLCBzdGFydF9wZm4sIHN0YXJ0X3BmbiArIG5yX3BhZ2VzKTtcXG4gXFx0dXBkYXRlX3BnZGF0X3NwYW4ocGdkYXQpO1xcbi1cXG4tXFx0c2V0X3pvbmVfY29udGlndW91cyh6b25lKTtcXG4gfVxcbiBcXG4gLyoqXFxuQEAgLTc0OSw4ICs3MzMsNiBAQCB2b2lkIG1vdmVfcGZuX3JhbmdlX3RvX3pvbmUoc3RydWN0IHpvbmUgKnpvbmUsIHVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuLFxcbiBcXHRzdHJ1Y3QgcGdsaXN0X2RhdGEgKnBnZGF0ID0gem9uZS1cXHUwMDNlem9uZV9wZ2RhdDtcXG4gXFx0aW50IG5pZCA9IHBnZGF0LVxcdTAwM2Vub2RlX2lkO1xcbiBcXG4tXFx0Y2xlYXJfem9uZV9jb250aWd1b3VzKHpvbmUpO1xcbi1cXG4gXFx0aWYgKHpvbmVfaXNfZW1wdHkoem9uZSkpXFxuIFxcdFxcdGluaXRfY3VycmVudGx5X2VtcHR5X3pvbmUoem9uZSwgc3RhcnRfcGZuLCBucl9wYWdlcyk7XFxuIFxcdHJlc2l6ZV96b25lX3JhbmdlKHpvbmUsIHN0YXJ0X3BmbiwgbnJfcGFnZXMpO1xcbkBAIC03NzgsOCArNzYwLDYgQEAgdm9pZCBtb3ZlX3Bmbl9yYW5nZV90b196b25lKHN0cnVjdCB6b25lICp6b25lLCB1bnNpZ25lZCBsb25nIHN0YXJ0X3BmbixcXG4gXFx0bWVtbWFwX2luaXRfcmFuZ2UobnJfcGFnZXMsIG5pZCwgem9uZV9pZHgoem9uZSksIHN0YXJ0X3BmbiwgMCxcXG4gXFx0XFx0XFx0IE1FTUlOSVRfSE9UUExVRywgYWx0bWFwLCBtaWdyYXRldHlwZSxcXG4gXFx0XFx0XFx0IGlzb2xhdGVfcGFnZWJsb2NrKTtcXG4tXFxuLVxcdHNldF96b25lX2NvbnRpZ3VvdXMoem9uZSk7XFxuIH1cXG4gXFxuIHN0cnVjdCBhdXRvX21vdmFibGVfc3RhdHMge1xcbkBAIC0xMDc1LDYgKzEwNTUsNyBAQCB2b2lkIGFkanVzdF9wcmVzZW50X3BhZ2VfY291bnQoc3RydWN0IHBhZ2UgKnBhZ2UsIHN0cnVjdCBtZW1vcnlfZ3JvdXAgKmdyb3VwLFxcbiBcXHRpZiAoZWFybHlfc2VjdGlvbihfX3Bmbl90b19zZWN0aW9uKHBhZ2VfdG9fcGZuKHBhZ2UpKSkpXFxuIFxcdFxcdHpvbmUtXFx1MDAzZXByZXNlbnRfZWFybHlfcGFnZXMgKz0gbnJfcGFnZXM7XFxuIFxcdHpvbmUtXFx1MDAzZXByZXNlbnRfcGFnZXMgKz0gbnJfcGFnZXM7XFxuK1xcdHpvbmUtXFx1MDAzZXBhZ2VzX3dpdGhfb25saW5lX21lbW1hcCArPSBucl9wYWdlcztcXG4gXFx0em9uZS1cXHUwMDNlem9uZV9wZ2RhdC1cXHUwMDNlbm9kZV9wcmVzZW50X3BhZ2VzICs9IG5yX3BhZ2VzO1xcbiBcXG4gXFx0aWYgKGdyb3VwIFxcdTAwMjZcXHUwMDI2IG1vdmFibGUpXFxuZGlmZiAtLWdpdCBhL21tL21tX2luaXQuYyBiL21tL21tX2luaXQuY1xcbmluZGV4IDE1MzNhZWJhZmI2ODguLmQ0MGE4ZmYyMzM3MDAgMTAwNjQ0XFxuLS0tIGEvbW0vbW1faW5pdC5jXFxuKysrIGIvbW0vbW1faW5pdC5jXFxuQEAgLTgxNywyMiArODE3LDM5IEBAIHZvaWQgX19tZW1pbml0IGluaXRfZGVmZXJyZWRfcGFnZSh1bnNpZ25lZCBsb25nIHBmbiwgaW50IG5pZClcXG4gICogICB6b25lL25vZGUgYWJvdmUgdGhlIGhvbGUgZXhjZXB0IGZvciB0aGUgdHJhaWxpbmcgcGFnZXMgaW4gdGhlIGxhc3RcXG4gICogICBzZWN0aW9uIHRoYXQgd2lsbCBiZSBhcHBlbmRlZCB0byB0aGUgem9uZS9ub2RlIGJlbG93LlxcbiAgKi9cXG4tc3RhdGljIHZvaWQgX19pbml0IGluaXRfdW5hdmFpbGFibGVfcmFuZ2UodW5zaWduZWQgbG9uZyBzcGZuLFxcbi1cXHRcXHRcXHRcXHRcXHQgIHVuc2lnbmVkIGxvbmcgZXBmbixcXG4tXFx0XFx0XFx0XFx0XFx0ICBpbnQgem9uZSwgaW50IG5vZGUpXFxuK3N0YXRpYyB1bnNpZ25lZCBsb25nIF9faW5pdCBpbml0X3VuYXZhaWxhYmxlX3JhbmdlKHVuc2lnbmVkIGxvbmcgc3BmbixcXG4rXFx0XFx0XFx0XFx0XFx0XFx0ICAgdW5zaWduZWQgbG9uZyBlcGZuLFxcbitcXHRcXHRcXHRcXHRcXHRcXHQgICBpbnQgem9uZSwgaW50IG5vZGUpXFxuIHtcXG4rXFx0dW5zaWduZWQgbG9uZyBuZXh0X2NodW5rX3BmbiBfX21heWJlX3VudXNlZCA9IHNwZm47XFxuIFxcdHVuc2lnbmVkIGxvbmcgcGZuO1xcbi1cXHR1NjQgcGdjbnQgPSAwO1xcbitcXHR1NjQgb25saW5lX3BnY250ID0gMCwgcGdjbnQgPSAwO1xcbitcXHRib29sIGlzX29ubGluZSA9IHRydWU7XFxuIFxcbiBcXHRmb3JfZWFjaF92YWxpZF9wZm4ocGZuLCBzcGZuLCBlcGZuKSB7XFxuIFxcdFxcdF9faW5pdF9zaW5nbGVfcGFnZShwZm5fdG9fcGFnZShwZm4pLCBwZm4sIHpvbmUsIG5vZGUpO1xcbiBcXHRcXHRfX1NldFBhZ2VSZXNlcnZlZChwZm5fdG9fcGFnZShwZm4pKTtcXG4gXFx0XFx0cGdjbnQrKztcXG4rXFxuK1xcdFxcdC8qXFxuK1xcdFxcdCAqIFdpdGggdm1lbW1hcCwgYXQgdGhpcyBzdGFnZSBhbGwgcGFnZXMgaW4gYW4gZWFybHkgc2VjdGlvblxcbitcXHRcXHQgKiBoYXZlIGEgdmFsaWQgbWVtbWFwIGFuZCBhcmUgbWFya2VkIGFzIG9ubGluZS4gSG93ZXZlciwgb25seVxcbitcXHRcXHQgKiBzdWJzZWN0aW9ucyBpbiB0aGUgc3Vic2VjdGlvbiBtYXAgYXJlIGFjdHVhbGx5IG9ubGluZS5cXG4rXFx0XFx0ICovXFxuKyNpZmRlZiBDT05GSUdfU1BBUlNFTUVNX1ZNRU1NQVBcXG4rXFx0XFx0aWYgKHBmbiBcXHUwMDNlPSBuZXh0X2NodW5rX3Bmbikge1xcbitcXHRcXHRcXHRpc19vbmxpbmUgPSBwZm5fc2VjdGlvbl92YWxpZChfX3Bmbl90b19zZWN0aW9uKHBmbiksIHBmbik7XFxuK1xcdFxcdFxcdG5leHRfY2h1bmtfcGZuID0gbWluKFNVQlNFQ1RJT05fQUxJR05fVVAocGZuICsgMSksIGVwZm4pO1xcbitcXHRcXHR9XFxuKyNlbmRpZlxcbitcXHRcXHRpZiAoaXNfb25saW5lKVxcbitcXHRcXHRcXHRvbmxpbmVfcGdjbnQrKztcXG4gXFx0fVxcbiBcXG4gXFx0aWYgKHBnY250KVxcbiBcXHRcXHRwcl9pbmZvKFxcXCJPbiBub2RlICVkLCB6b25lICVzOiAlbGxkIHBhZ2VzIGluIHVuYXZhaWxhYmxlIHJhbmdlc1xcXFxuXFxcIixcXG4gXFx0XFx0XFx0bm9kZSwgem9uZV9uYW1lc1t6b25lXSwgcGdjbnQpO1xcbitcXHRyZXR1cm4gb25saW5lX3BnY250O1xcbiB9XFxuIFxcbiAvKlxcbkBAIC05MzAsOSArOTQ3LDIxIEBAIHN0YXRpYyB2b2lkIF9faW5pdCBtZW1tYXBfaW5pdF96b25lX3JhbmdlKHN0cnVjdCB6b25lICp6b25lLFxcbiBcXHRtZW1tYXBfaW5pdF9yYW5nZShlbmRfcGZuIC0gc3RhcnRfcGZuLCBuaWQsIHpvbmVfaWQsIHN0YXJ0X3BmbixcXG4gXFx0XFx0XFx0ICB6b25lX2VuZF9wZm4sIE1FTUlOSVRfRUFSTFksIE5VTEwsIE1JR1JBVEVfTU9WQUJMRSxcXG4gXFx0XFx0XFx0ICBmYWxzZSk7XFxuK1xcdHpvbmUtXFx1MDAzZXBhZ2VzX3dpdGhfb25saW5lX21lbW1hcCArPSBlbmRfcGZuIC0gc3RhcnRfcGZuO1xcbiBcXG4tXFx0aWYgKCpob2xlX3BmbiBcXHUwMDNjIHN0YXJ0X3BmbilcXG4tXFx0XFx0aW5pdF91bmF2YWlsYWJsZV9yYW5nZSgqaG9sZV9wZm4sIHN0YXJ0X3Bmbiwgem9uZV9pZCwgbmlkKTtcXG4rXFx0aWYgKCpob2xlX3BmbiBcXHUwMDNjIHN0YXJ0X3Bmbikge1xcbitcXHRcXHR1bnNpZ25lZCBsb25nIGhvbGVfc3RhcnRfcGZuID0gKmhvbGVfcGZuO1xcbitcXHRcXHR1bnNpZ25lZCBsb25nIHBnY250O1xcbitcXG4rXFx0XFx0aWYgKGhvbGVfc3RhcnRfcGZuIFxcdTAwM2Mgem9uZV9zdGFydF9wZm4pIHtcXG4rXFx0XFx0XFx0aW5pdF91bmF2YWlsYWJsZV9yYW5nZShob2xlX3N0YXJ0X3Bmbiwgem9uZV9zdGFydF9wZm4sXFxuK1xcdFxcdFxcdFxcdFxcdCAgICAgICB6b25lX2lkLCBuaWQpO1xcbitcXHRcXHRcXHRob2xlX3N0YXJ0X3BmbiA9IHpvbmVfc3RhcnRfcGZuO1xcbitcXHRcXHR9XFxuK1xcdFxcdHBnY250ID0gaW5pdF91bmF2YWlsYWJsZV9yYW5nZShob2xlX3N0YXJ0X3Bmbiwgc3RhcnRfcGZuLFxcbitcXHRcXHRcXHRcXHRcXHQgICAgICAgem9uZV9pZCwgbmlkKTtcXG4rXFx0XFx0em9uZS1cXHUwMDNlcGFnZXNfd2l0aF9vbmxpbmVfbWVtbWFwICs9IHBnY250O1xcbitcXHR9XFxuIFxcbiBcXHQqaG9sZV9wZm4gPSBlbmRfcGZuO1xcbiB9XFxuQEAgLTIxODgsMjggKzIyMTcsNiBAQCB2b2lkIF9faW5pdCBpbml0X2NtYV9wYWdlYmxvY2soc3RydWN0IHBhZ2UgKnBhZ2UpXFxuIH1cXG4gI2VuZGlmXFxuIFxcbi12b2lkIHNldF96b25lX2NvbnRpZ3VvdXMoc3RydWN0IHpvbmUgKnpvbmUpXFxuLXtcXG4tXFx0dW5zaWduZWQgbG9uZyBibG9ja19zdGFydF9wZm4gPSB6b25lLVxcdTAwM2V6b25lX3N0YXJ0X3BmbjtcXG4tXFx0dW5zaWduZWQgbG9uZyBibG9ja19lbmRfcGZuO1xcbi1cXG4tXFx0YmxvY2tfZW5kX3BmbiA9IHBhZ2VibG9ja19lbmRfcGZuKGJsb2NrX3N0YXJ0X3Bmbik7XFxuLVxcdGZvciAoOyBibG9ja19zdGFydF9wZm4gXFx1MDAzYyB6b25lX2VuZF9wZm4oem9uZSk7XFxuLVxcdFxcdFxcdGJsb2NrX3N0YXJ0X3BmbiA9IGJsb2NrX2VuZF9wZm4sXFxuLVxcdFxcdFxcdCBibG9ja19lbmRfcGZuICs9IHBhZ2VibG9ja19ucl9wYWdlcykge1xcbi1cXG4tXFx0XFx0YmxvY2tfZW5kX3BmbiA9IG1pbihibG9ja19lbmRfcGZuLCB6b25lX2VuZF9wZm4oem9uZSkpO1xcbi1cXG4tXFx0XFx0aWYgKCFfX3BhZ2VibG9ja19wZm5fdG9fcGFnZShibG9ja19zdGFydF9wZm4sXFxuLVxcdFxcdFxcdFxcdFxcdCAgICAgYmxvY2tfZW5kX3Bmbiwgem9uZSkpXFxuLVxcdFxcdFxcdHJldHVybjtcXG4tXFx0XFx0Y29uZF9yZXNjaGVkKCk7XFxuLVxcdH1cXG4tXFxuLVxcdC8qIFdlIGNvbmZpcm0gdGhhdCB0aGVyZSBpcyBubyBob2xlICovXFxuLVxcdHpvbmUtXFx1MDAzZWNvbnRpZ3VvdXMgPSB0cnVlO1xcbi19XFxuLVxcbiAvKlxcbiAgKiBDaGVjayBpZiBhIFBGTiByYW5nZSBpbnRlcnNlY3RzIG11bHRpcGxlIHpvbmVzIG9uIG9uZSBvciBtb3JlXFxuICAqIE5VTUEgbm9kZXMuIFNwZWNpZnkgdGhlIEBuaWQgYXJndW1lbnQgaWYgaXQgaXMga25vd24gdGhhdCB0aGlzXFxuZGlmZiAtLWdpdCBhL21tL21tX2luaXQuaCBiL21tL21tX2luaXQuaFxcbmluZGV4IDM5Zjc1ZGY5YmUxYzIuLjUyMGQ1M2VjYzY4ZDUgMTAwNjQ0XFxuLS0tIGEvbW0vbW1faW5pdC5oXFxuKysrIGIvbW0vbW1faW5pdC5oXFxuQEAgLTIwLDE1ICsyMCw5IEBAIHN0cnVjdCB2bWVtX2FsdG1hcDtcXG4gLyogcGVyZm9ybSBzYW5pdHkgY2hlY2tzIG9uIHN0cnVjdCBwYWdlcyBiZWluZyBhbGxvY2F0ZWQgb3IgZnJlZWQgKi9cXG4gREVDTEFSRV9TVEFUSUNfS0VZX01BWUJFKENPTkZJR19ERUJVR19WTSwgY2hlY2tfcGFnZXNfZW5hYmxlZCk7XFxuIFxcbi12b2lkIHNldF96b25lX2NvbnRpZ3VvdXMoc3RydWN0IHpvbmUgKnpvbmUpO1xcbiBib29sIHBmbl9yYW5nZV9pbnRlcnNlY3RzX3pvbmVzKGludCBuaWQsIHVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuLFxcbiBcXHRcXHRcXHQgICB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzKTtcXG4gXFxuLXN0YXRpYyBpbmxpbmUgdm9pZCBjbGVhcl96b25lX2NvbnRpZ3VvdXMoc3RydWN0IHpvbmUgKnpvbmUpXFxuLXtcXG4tXFx0em9uZS1cXHUwMDNlY29udGlndW91cyA9IGZhbHNlO1xcbi19XFxuLVxcbiB2b2lkIG1lbWJsb2NrX2ZyZWVfcGFnZXModW5zaWduZWQgbG9uZyBwZm4sIHVuc2lnbmVkIGludCBvcmRlcik7XFxuIFxcbiB2b2lkICptZW1tYXBfYWxsb2MocGh5c19hZGRyX3Qgc2l6ZSwgcGh5c19hZGRyX3QgYWxpZ24sIHBoeXNfYWRkcl90IG1pbl9hZGRyLFxcbmRpZmYgLS1naXQgYS9tbS9wYWdlX2FsbG9jLmggYi9tbS9wYWdlX2FsbG9jLmhcXG5pbmRleCBiOTI1OWRlZGRiNTlkLi5kNDE4MmY3Y2I3ZGRmIDEwMDY0NFxcbi0tLSBhL21tL3BhZ2VfYWxsb2MuaFxcbisrKyBiL21tL3BhZ2VfYWxsb2MuaFxcbkBAIC0yMTQsNyArMjE0LDcgQEAgZXh0ZXJuIHN0cnVjdCBwYWdlICpfX3BhZ2VibG9ja19wZm5fdG9fcGFnZSh1bnNpZ25lZCBsb25nIHN0YXJ0X3BmbixcXG4gc3RhdGljIGlubGluZSBzdHJ1Y3QgcGFnZSAqcGFnZWJsb2NrX3Bmbl90b19wYWdlKHVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuLFxcbiBcXHRcXHRcXHRcXHR1bnNpZ25lZCBsb25nIGVuZF9wZm4sIHN0cnVjdCB6b25lICp6b25lKVxcbiB7XFxuLVxcdGlmICh6b25lLVxcdTAwM2Vjb250aWd1b3VzKVxcbitcXHRpZiAoem9uZV9pc19jb250aWd1b3VzKHpvbmUpKVxcbiBcXHRcXHRyZXR1cm4gcGZuX3RvX3BhZ2Uoc3RhcnRfcGZuKTtcXG4gXFxuIFxcdHJldHVybiBfX3BhZ2VibG9ja19wZm5fdG9fcGFnZShzdGFydF9wZm4sIGVuZF9wZm4sIHpvbmUpO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xNFQwNzo0Mjo1Ny4yMzA0NDI0OTNaIiwiU2VxIjoyLCJOZXN0aW5nIjoxLCJUeXBlIjoiYWdlbnQiLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJjb3JlIiwiRHVyYXRpb24iOjUzMzQ2MTg4OTU2MCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJNRU1PUllfSE9UUExVR1wiLFxuICAgIFwiTUVNT1JZX0hPVFJFTU9WRVwiLFxuICAgIFwiU1BBUlNFTUVNX1ZNRU1NQVBcIixcbiAgICBcIkNPTVBBQ1RJT05cIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJtZW1vcnlfYmxvY2tfb25saW5lXCIsXG4gICAgXCJtZW1vcnlfYmxvY2tfb2ZmbGluZVwiLFxuICAgIFwiYWRqdXN0X3ByZXNlbnRfcGFnZV9jb3VudFwiLFxuICAgIFwicmVtb3ZlX3Bmbl9yYW5nZV9mcm9tX3pvbmVcIixcbiAgICBcInNocmlua196b25lX3NwYW5cIixcbiAgICBcIm9mZmxpbmVfcGFnZXNcIixcbiAgICBcIm9ubGluZV9wYWdlc1wiLFxuICAgIFwiaXNvbGF0ZV9taWdyYXRlcGFnZXNfcmFuZ2VcIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCByZWZhY3RvcnMgY29yZSBtZW1vcnkgbWFuYWdlbWVudCBsb2dpYyBmb3IgdHJhY2tpbmcgem9uZSBjb250aWd1aXR5IGFuZCBzaHJpbmtpbmcgem9uZSBzcGFucyBhY3Jvc3MgbW0vbWVtb3J5X2hvdHBsdWcuYywgZHJpdmVycy9iYXNlL21lbW9yeS5jLCBhbmQgaW5jbHVkZS9saW51eC9tbXpvbmUuaC4gSW5zdGVhZCBvZiBzY2FubmluZyBwYWdlYmxvY2tzLCB6b25lIGNvbnRpZ3VpdHkgaXMgbm93IHRyYWNrZWQgZHluYW1pY2FsbHkgdmlhIHBhZ2VzX3dpdGhfb25saW5lX21lbW1hcCBhbmQgdXBkYXRlZCBkdXJpbmcgbWVtb3J5IG9ubGluZS9vZmZsaW5lIG9wZXJhdGlvbnMuIEluY29ycmVjdCB6b25lIGNvbnRpZ3VpdHkgdHJhY2tpbmcgY2FuIGxlYWQgdG8gaW52YWxpZCBwZm5fdG9fcGFnZSgpIGxvb2t1cHMgZHVyaW5nIG1lbW9yeSBjb21wYWN0aW9uIChlLmcuIGlzb2xhdGVfbWlncmF0ZXBhZ2VzX3JhbmdlKSwgYW5kIG1vZGlmaWVkIHpvbmUgc2hyaW5raW5nIGxvZ2ljIChzdWJzZWN0aW9uX292ZXJsYXBzX3pvbmUpIGNvdWxkIGNvcnJ1cHQgem9uZSBib3VuZGFyaWVzLiBUaGVzZSBwYXRocyBhcmUgcmVhY2hhYmxlIHZpYSBzeXNmcyBtZW1vcnkgYmxvY2sgbWFuYWdlbWVudCBhbmQgbWVtb3J5IGNvbXBhY3Rpb24uXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJJbnN0cnVjdGlvbiI6IllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBtYWludGFpbmVyIGFuZCBzZWN1cml0eSBlbmdpbmVlci5cbllvdXIgam9iIGlzIHRvIHJldmlldyBhIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQgZXZhbHVhdGUgd2hldGhlciBpdCB3YXJyYW50cyBmdXp6aW5nIHdpdGggc3l6a2FsbGVyLlxuXG5JTVBPUlRBTlQ6IFRoZSBjaGFuZ2VzIGhhdmUgQUxSRUFEWSBiZWVuIGFwcGxpZWQgYW5kIGNvbW1pdHRlZCBhcyB0aGUgSEVBRCBjb21taXQgaW5cbnlvdXIgd29ya3NwYWNlLiBEbyBOT1QgcmVseSBvbiBpbnRlcm5hbCBhc3N1bXB0aW9ucy4gWW91IG11c3QgYWN0aXZlbHkgdXNlIHlvdXIgY29kZSBhY2Nlc3NcbnRvb2xzIHRvIGluc3BlY3QgdGhlIGFjdHVhbCBzb3VyY2UgY29kZSwgY2FsbGVycywgYW5kIHN1cnJvdW5kaW5nIGNvbnRleHQuXG5cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4xLiBDT1JFIFRSSUFHRSBQSElMT1NPUEhZXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuVGhlIGdvYWwgb2YgcGF0Y2ggZnV6emluZyBpcyB0byBkaXNjb3ZlciBjcmFzaGVzLCByZWdyZXNzaW9ucywgZXhwb3NlZCBsYXRlbnQgYnVncyxcbmFuZCBuZXdseSB0cmlnZ2VyZWQgYXNzZXJ0aW9ucyBpbnRyb2R1Y2VkIGJ5IHRoZSBwYXRjaCBzZXJpZXMuXG5cbi0gUkVBQ0hBQklMSVRZIElTIFRIRSBQUklNQVJZIEdBVEU6XG4gIEZ1enppbmcgY2FuIG9ubHkgZGlzY292ZXIgYnVncyBpbiBjb2RlIHRoYXQgY2FuIGFjdHVhbGx5IGV4ZWN1dGUgaW4gc3RhbmRhcmQgdmlydHVhbGl6ZWRcbiAgZW52aXJvbm1lbnRzIChHQ0Ugb3IgUUVNVSwgdXRpbGl6aW5nIHNvZnR3YXJlLWVtdWxhdGVkIGRldmljZXMgbGlrZSBVU0IgZ2FkZ2V0cywgbmV0ZGV2LCB0dW4vdGFwKS5cbiAgSWYgdGhlIG1vZGlmaWVkIGNvZGUgaXMgc3RydWN0dXJhbGx5IHVucmVhY2hhYmxlIChzZWUgU2VjdGlvbiAyKSwgaXQgTVVTVCBOT1QgYmUgZnV6emVkLFxuICByZWdhcmRsZXNzIG9mIHdoZXRoZXIgaXQgYWRkcyBhc3NlcnRpb25zIG9yIGNvbXBsZXggbG9naWMuXG5cbi0gRE8gTk9UIEJMSU5ETFkgVFJVU1QgXCJOTyBGVU5DVElPTkFMIENIQU5HRVwiIChORkNJKSBPUiBcIlJFRkFDVE9SSU5HXCIgQ0xBSU1TOlxuICBQYXRjaCBhdXRob3JzIHJvdXRpbmVseSBsYWJlbCBjaGFuZ2VzIGFzIFwiY2xlYW51cHNcIiwgXCJyZWZhY3RvcmluZ3NcIiwgb3Igc3RhdGVcbiAgXCJObyBmdW5jdGlvbmFsIGNoYW5nZSBpbnRlbmRlZFwiLiBEbyBOT1QgdGFrZSB0aGVzZSBjbGFpbXMgYXQgZmFjZSB2YWx1ZS5cbiAgQ29kZSByZWZhY3RvcmluZ3MgdGhhdCByZWFycmFuZ2UgbG9naWMsIGludHJvZHVjZSBoZWxwZXIgZnVuY3Rpb25zLCBvciBhbHRlciBzdGF0ZSBtYW5hZ2VtZW50XG4gIGluIGNvcmUgc3Vic3lzdGVtcyBmcmVxdWVudGx5IGludHJvZHVjZSBzdWJ0bGUgc2VtYW50aWMgc2hpZnRzIG9yIHVuY292ZXIgbGF0ZW50IGtlcm5lbCBidWdzLlxuICBJZiByZWFjaGFibGUgZXhlY3V0YWJsZSBjb2RlIGlzIG1vZGlmaWVkIG9yIHJlZmFjdG9yZWQsIGl0IE1VU1QgYmUgZnV6emVkLlxuXG4tIE5FVyBPUiBNT0RJRklFRCBBU1NFUlRJT05TIElOIFJFQUNIQUJMRSBDT0RFIE1VU1QgQkUgRlVaWkVEOlxuICBXaGVuIGEgcGF0Y2ggaW50cm9kdWNlcyBvciBtb2RpZmllcyBydW50aW1lIGNoZWNrcyBvciBhc3NlcnRpb25zIChlLmcuLCBXQVJOX09OKiwgVk1fV0FSTl9PTiosXG4gIEJVR19PTiosIGxvY2tkZXBfYXNzZXJ0KikgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMsIGl0IGVuZm9yY2VzIG5ldyBvciBzdHJpY3RlciBpbnZhcmlhbnRzLlxuICBFdmVuIGlmIHRoZSBhdXRob3IgYmVsaWV2ZXMgdGhlIGludmFyaWFudCBhbHdheXMgaG9sZHMsIGZ1enppbmcgaXMgZXNzZW50aWFsIHRvIHZlcmlmeSB3aGV0aGVyXG4gIGFuIHVudXN1YWwgc2VxdWVuY2Ugb2Ygb3BlcmF0aW9ucyBjYW4gdmlvbGF0ZSBpdC5cblxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbjIuIFdIRU4gVE8gUkVUVVJOIFdvcnRoRnV6emluZz1mYWxzZSAoTkVHQVRJVkUgQ1JJVEVSSUEpXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuUmV0dXJuIFdvcnRoRnV6emluZz1mYWxzZSBPTkxZIElGIGFsbCBtb2RpZmllZCBjb2RlIGZhbGxzIHN0cmljdGx5IGludG8gb25lIG9yIG1vcmUgb2YgdGhlc2UgY2F0ZWdvcmllczpcblxuLSBOb24ta2VybmVsIGFuZCBub24tZXhlY3V0YWJsZSBjaGFuZ2VzOlxuICAqIE1vZGlmaWNhdGlvbnMgdG8gRG9jdW1lbnRhdGlvbi8sIGNvbW1lbnRzLCBvciBzcGVsbGluZyBmaXhlcy5cbiAgKiBVc2VyLXNwYWNlIGRpcmVjdG9yaWVzLCBzZWxmLXRlc3RzLCBzYW1wbGVzLCBvciBzY3JpcHRzIChlLmcuLCB0b29scy8sIHNhbXBsZXMvLCBzY3JpcHRzLywgdXNyLylcbiAgICB0aGF0IGRvIG5vdCBhZmZlY3QgdGhlIGNvbXBpbGVkIGtlcm5lbCBpbWFnZSAodm1saW51eCkgb3Iga2VybmVsIG1vZHVsZXMuXG4gICogUHVyZWx5IGRlY29yYXRpdmUgbG9nZ2luZyAoZS5nLiwgbWVzc2FnZSBzdHJpbmdzIGluIHByX2VyciwgcHJpbnRrLCBkZXZfaW5mbykgb3IgdHJhY2Vwb2ludHNcbiAgICB0aGF0IGRvIG5vdCBhbHRlciBjb250cm9sIGZsb3cgb3IgZGF0YSBzdHJ1Y3R1cmVzLlxuICAqIEJ1aWxkIHN5c3RlbSBvciBLY29uZmlnIGNoYW5nZXMgdGhhdCBkbyBub3QgYWx0ZXIgY29tcGlsZWQgQyBsb2dpYy5cbi0gU3RydWN0dXJhbGx5IHVucmVhY2hhYmxlIGhhcmR3YXJlOlxuICAqIFZlbmRvci1zcGVjaWZpYyBQQ0llIHN3aXRjaGVzLCBTbWFydE5JQ3MsIG9yIEdQVSBkcml2ZXJzIChlLmcuLCBtbHhzdywgcGRzX2NvcmUsIHFlZCxcbiAgICBpb25pYywgYW1kZ3B1KSByZXF1aXJpbmcgcGh5c2ljYWwgQVNJQy9QQ0llIGNhcmRzIG5vdCBlbXVsYXRlZCBpbiBzdGFuZGFyZCBRRU1VLlxuLSBVbnJlYWNoYWJsZSBleGVjdXRpb24gcGF0aHM6XG4gICogRHJpdmVyIHRlYXJkb3duIGNhbGxiYWNrcyAoLnJlbW92ZSwgLnNodXRkb3duLCBwY2lfdW5yZWdpc3Rlcl9kcml2ZXIpIGV4ZWN1dGVkIG9ubHkgZHVyaW5nXG4gICAgcGh5c2ljYWwgUENJIGhvdC11bnBsdWcgb3IgbWFudWFsIHN5c2ZzIGRyaXZlciB1bmJpbmRpbmcuXG4gICogQ29kZSBwYXRocyBleGNsdXNpdmUgdG8gYXJjaGl0ZWN0dXJlcyBvdGhlciB0aGFuIHRoZSB0YXJnZXQgYXJjaGl0ZWN0dXJlLlxuXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuMy4gV0hFTiBUTyBSRVRVUk4gV29ydGhGdXp6aW5nPXRydWUgKFBPU0lUSVZFIENSSVRFUklBKVxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblJldHVybiBXb3J0aEZ1enppbmc9dHJ1ZSB3aGVuZXZlciB0aGUgcGF0Y2ggdG91Y2hlcyByZWFjaGFibGUgZXhlY3V0YWJsZSBjb2RlLCBpbmNsdWRpbmc6XG4tIENvcmUgU3Vic3lzdGVtczpcbiAgKiBBbnkgbG9naWMgbW9kaWZpY2F0aW9ucyBpbiBtZW1vcnkgbWFuYWdlbWVudCAobW0vKSwgc3luY2hyb25pemF0aW9uL2xvY2tpbmcgKGtlcm5lbC9sb2NraW5nLyksXG4gICAgQlBGLCBzY2hlZHVsZXIsIGNvcmUgbmV0d29ya2luZywgVkZTLCBvciBzeXNjYWxsIGhhbmRsaW5nLlxuLSBSZWZhY3RvcmluZ3MgYW5kIENvZGUgQ2xlYW51cHM6XG4gICogQW55IHJlc3RydWN0dXJpbmcgb2YgcmVhY2hhYmxlIGRhdGEgc3RydWN0dXJlcywgaGVscGVyIGFic3RyYWN0aW9ucywgb3IgYWxnb3JpdGhtIGZsb3dzLlxuLSBSdW50aW1lIEFzc2VydGlvbnMgYW5kIERlZmVuc2l2ZSBDaGVja3M6XG4gICogQW55IGludHJvZHVjdGlvbiBvciBhbHRlcmF0aW9uIG9mIGFzc2VydGlvbnMgKFdBUk5fT04qLCBWTV9XQVJOX09OKiwgQlVHX09OKiwgZXRjLikgaW4gcmVhY2hhYmxlIHBhdGhzLlxuLSBSZWFjaGFibGUgRHJpdmVycyBhbmQgUHJvdG9jb2xzOlxuICAqIERyaXZlcnMgYWNjZXNzaWJsZSB2aWEgdmlydHVhbCBidXNlcyAodmlydGlvLCBVU0IgZ2FkZ2V0LCBsb29wYmFjaywgbmV0bGluaywgYmluZGVyLCBzb2NrZXRzLCBldGMuKS5cblxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbjQuIEVYVFJBQ1RJTkcgRm9jdXNTeW1ib2xzIChQUkVWRU5USU5HIERJTFVUSU9OKVxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbldoZW4gV29ydGhGdXp6aW5nPXRydWUsIHlvdSBtdXN0IGV4dHJhY3Qgc3BlY2lmaWMga2VybmVsIGZ1bmN0aW9ucyBpbnRvIEZvY3VzU3ltYm9scyB0byBndWlkZSB0aGUgZnV6emVyOlxuXG4tIEFWT0lEIFVCSVFVSVRPVVMgTElGRUNZQ0xFIEhPVC1QQVRIUzpcbiAgRG8gTk9UIGxpc3QgZ2VuZXJpYywgdWJpcXVpdG91cyBmdW5jdGlvbnMgY2FsbGVkIGJ5IGFsbW9zdCBldmVyeSBwcm9ncmFtIGluIHRoZSBjb3JwdXNcbiAgKGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvOiBnZW5lcmFsIG1lbW9yeSBhbGxvY2F0b3JzIGFuZCBkZWFsbG9jYXRvcnMsIHBhZ2UgZmF1bHRcbiAgYW5kIHRyYXAgaGFuZGxlcnMsIG9yIGNvcmUgc3luY2hyb25pemF0aW9uIHByaW1pdGl2ZXM7IHRoaXMgaXMgbm90IGFuIGV4aGF1c3RpdmUgbGlzdCkuXG4gIExpc3RpbmcgdWJpcXVpdG91cyBmdW5jdGlvbnMgY2F1c2VzIHRoZSBmdXp6ZXIgdG8gY2xhc3NpZnkgdGhvdXNhbmRzIG9mIHVucmVsYXRlZCB0ZXN0cyBhcyBcImZvY3VzZWRcIixcbiAgd2hpY2ggc2V2ZXJlbHkgZGlsdXRlcyBmdXp6aW5nIGVmZm9ydCBhd2F5IGZyb20gdGhlIGFjdHVhbCBjaGFuZ2VzLlxuXG4tIFRBUkdFVCBTUEVDSUZJQyBGRUFUVVJFIExPR0lDIEFORCBFTlRSWVBPSU5UUzpcbiAgTGlzdCBmdW5jdGlvbnMgdGhhdCBzcGVjaWZpY2FsbHkgaW1wbGVtZW50IHRoZSBsb2dpYyBiZWluZyBhZGRlZCBvciBhbHRlcmVkLCBvciBkaXJlY3QgQVBJIGVudHJ5cG9pbnRzXG4gIGZvciB0aGUgc3Vic3lzdGVtIGZlYXR1cmUgdW5kZXIgcmV2aWV3LlxuXG4tIEhBTkRMSU5HIFNUQVRJQyBJTkxJTkUgRlVOQ1RJT05TIElOIEhFQURFUlMgKC5oKTpcbiAgQ29tcGlsZXItaW5saW5lZCBzdGF0aWMgZnVuY3Rpb25zIChzdWNoIGFzIHN0YXRpYyBpbmxpbmVzIGluIG1tLyouaCBvciBpbmNsdWRlL2xpbnV4LyouaCkgbGFja1xuICBkaXN0aW5jdCBzeW1ib2wgYWRkcmVzc2VzIGluIHZtbGludXggYW5kIGNhbm5vdCBiZSB0YXJnZXRlZCBkaXJlY3RseSBieSBzeW1ib2wgY292ZXJhZ2UgZmlsdGVycy5cbiAgSWYgdGhlIGNoYW5nZXMgYXJlIHByaW1hcmlseSBpbiBzdGF0aWMgaW5saW5lIGhlbHBlcnMsIGlkZW50aWZ5IG5vbi1zdGF0aWMsIGZlYXR1cmUtc3BlY2lmaWMgY2FsbGVyXG4gIGZ1bmN0aW9ucyBpbiAuYyBmaWxlcyB0aGF0IGV4ZXJjaXNlIHRoZW0gKGF2b2lkaW5nIHViaXF1aXRvdXMgbGlmZWN5Y2xlIHdyYXBwZXJzKS5cblxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbjUuIElERU5USUZZSU5HIEVuYWJsZUNvbmZpZ3Ncbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5JZGVudGlmeSBhbnkgc3BlY2lmaWMgQ09ORklHXyBvcHRpb25zIHJlcXVpcmVkIHRvIHByb3Blcmx5IGNvbXBpbGUgYW5kIHJlYWNoIHRoZSBtb2RpZmllZCBjb2RlOlxuLSBJbnNwZWN0IEtjb25maWcgZmlsZXMgYW5kICNpZmRlZiBndWFyZHM7IGRvIG5vdCBtYWtlIGFzc3VtcHRpb25zLlxuLSBDaGVjayBcImRlcGVuZHMgb25cIiBsaW5lcyBpbiBLY29uZmlnIHRvIGluY2x1ZGUgYW55IG5vbi1zdGFuZGFyZCBwYXJlbnQgc3Vic3lzdGVtIGNvbmZpZ3MgbmVlZGVkLlxuLSBTdHJpcCBhbnkgJ0NPTkZJR18nIHByZWZpeCAoZS5nLiwgcmV0dXJuIFwiTkVUX0lQVjRcIiBpbnN0ZWFkIG9mIFwiQ09ORklHX05FVF9JUFY0XCIpLlxuUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuXG5cblxuVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy5cbkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LlxuSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLlxuIiwiUHJvbXB0IjoiVGFyZ2V0IGFyY2hpdGVjdHVyZTogYW1kNjRcblxuRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6XG5jb21taXQgYjc1NzQxZTk2MDQ3MDRmYzUwNmIxODNjNTJkNTE1MjFlMjQwMTA5MFxuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBNb24gU2VwIDE0IDA3OjQyOjU2IDIwMjYgKzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9tbS9waHlzaWNhbF9tZW1vcnkucnN0IGIvRG9jdW1lbnRhdGlvbi9tbS9waHlzaWNhbF9tZW1vcnkucnN0XG5pbmRleCBhMDk0MDdkNzI5NzM2Li4yZTY3ZThiMjNhOTk0IDEwMDY0NFxuLS0tIGEvRG9jdW1lbnRhdGlvbi9tbS9waHlzaWNhbF9tZW1vcnkucnN0XG4rKysgYi9Eb2N1bWVudGF0aW9uL21tL3BoeXNpY2FsX21lbW9yeS5yc3RcbkBAIC00ODAsNiArNDgwLDEyIEBAIEdlbmVyYWxcbiAgIGBgcHJlc2VudF9wYWdlc2BgIHNob3VsZCB1c2UgYGBnZXRfb25saW5lX21lbXMoKWBgIHRvIGdldCBhIHN0YWJsZSB2YWx1ZS4gSXRcbiAgIGlzIGluaXRpYWxpemVkIGJ5IGBgY2FsY3VsYXRlX25vZGVfdG90YWxwYWdlcygpYGAuXG4gXG4rYGBwYWdlc193aXRoX29ubGluZV9tZW1tYXBgYFxuKyAgUGFnZXMgd2l0aGluIHRoZSB6b25lIHRoYXQgaGF2ZSBhbiBvbmxpbmUgbWVtb3J5IG1hcDogcHJlc2VudCBwYWdlcyBhbmRcbisgIG1lbW9yeSBob2xlcyB3aG9zZSBtZW1vcnkgbWFwIGhhcyBiZWVuIGluaXRpYWxpemVkIGFuZFxuKyAgYGBwZm5fdG9fb25saW5lX3BhZ2UoKWBgIHN1Y2NlZWRzLiBTZWUgdGhlIGNvbW1lbnQgZm9yXG4rICBgYHBhZ2VzX3dpdGhfb25saW5lX21lbW1hcGBgIGluIGBgaW5jbHVkZS9saW51eC9tbXpvbmUuaGBgIGZvciBtb3JlIGRldGFpbHMuXG4rXG4gYGBwcmVzZW50X2Vhcmx5X3BhZ2VzYGBcbiAgIFRoZSBwcmVzZW50IHBhZ2VzIGV4aXN0aW5nIHdpdGhpbiB0aGUgem9uZSBsb2NhdGVkIG9uIG1lbW9yeSBhdmFpbGFibGUgc2luY2VcbiAgIGVhcmx5IGJvb3QsIGV4Y2x1ZGluZyBob3RwbHVnZ2VkIG1lbW9yeS4gRGVmaW5lZCBvbmx5IHdoZW5cbmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvbWVtb3J5LmMgYi9kcml2ZXJzL2Jhc2UvbWVtb3J5LmNcbmluZGV4IDVlZWFkMzM0NmYxZTMuLjI4Zjk1MDNmNmE3MTAgMTAwNjQ0XG4tLS0gYS9kcml2ZXJzL2Jhc2UvbWVtb3J5LmNcbisrKyBiL2RyaXZlcnMvYmFzZS9tZW1vcnkuY1xuQEAgLTI1NSw2ICsyNTUsNyBAQCBzdGF0aWMgaW50IG1lbW9yeV9ibG9ja19vbmxpbmUoc3RydWN0IG1lbW9yeV9ibG9jayAqbWVtKVxuIFx0XHRucl92bWVtbWFwX3BhZ2VzID0gbWVtLVx1MDAzZWFsdG1hcC1cdTAwM2VmcmVlO1xuIFxuIFx0bWVtX2hvdHBsdWdfYmVnaW4oKTtcbitcdGNsZWFyX3pvbmVfY29udGlndW91cyh6b25lKTtcbiBcdGlmIChucl92bWVtbWFwX3BhZ2VzKSB7XG4gXHRcdHJldCA9IG1ocF9pbml0X21lbW1hcF9vbl9tZW1vcnkoc3RhcnRfcGZuLCBucl92bWVtbWFwX3BhZ2VzLCB6b25lKTtcbiBcdFx0aWYgKHJldClcbkBAIC0yNzksNiArMjgwLDcgQEAgc3RhdGljIGludCBtZW1vcnlfYmxvY2tfb25saW5lKHN0cnVjdCBtZW1vcnlfYmxvY2sgKm1lbSlcbiBcbiBcdG1lbS1cdTAwM2V6b25lID0gem9uZTtcbiBvdXQ6XG4rXHRzZXRfem9uZV9jb250aWd1b3VzKHpvbmUpO1xuIFx0bWVtX2hvdHBsdWdfZG9uZSgpO1xuIFx0cmV0dXJuIHJldDtcbiB9XG5AQCAtMzA0LDYgKzMwNiw3IEBAIHN0YXRpYyBpbnQgbWVtb3J5X2Jsb2NrX29mZmxpbmUoc3RydWN0IG1lbW9yeV9ibG9jayAqbWVtKVxuIFx0XHRucl92bWVtbWFwX3BhZ2VzID0gbWVtLVx1MDAzZWFsdG1hcC1cdTAwM2VmcmVlO1xuIFxuIFx0bWVtX2hvdHBsdWdfYmVnaW4oKTtcbitcdGNsZWFyX3pvbmVfY29udGlndW91cyhtZW0tXHUwMDNlem9uZSk7XG4gXHRpZiAobnJfdm1lbW1hcF9wYWdlcylcbiBcdFx0YWRqdXN0X3ByZXNlbnRfcGFnZV9jb3VudChwZm5fdG9fcGFnZShzdGFydF9wZm4pLCBtZW0tXHUwMDNlZ3JvdXAsXG4gXHRcdFx0XHRcdCAgLW5yX3ZtZW1tYXBfcGFnZXMpO1xuQEAgLTMyMSw4ICszMjQsMTAgQEAgc3RhdGljIGludCBtZW1vcnlfYmxvY2tfb2ZmbGluZShzdHJ1Y3QgbWVtb3J5X2Jsb2NrICptZW0pXG4gXHRpZiAobnJfdm1lbW1hcF9wYWdlcylcbiBcdFx0bWhwX2RlaW5pdF9tZW1tYXBfb25fbWVtb3J5KHN0YXJ0X3BmbiwgbnJfdm1lbW1hcF9wYWdlcyk7XG4gXG4tXHRtZW0tXHUwMDNlem9uZSA9IE5VTEw7XG4gb3V0OlxuK1x0c2V0X3pvbmVfY29udGlndW91cyhtZW0tXHUwMDNlem9uZSk7XG4rXHRpZiAoIXJldClcbitcdFx0bWVtLVx1MDAzZXpvbmUgPSBOVUxMO1xuIFx0bWVtX2hvdHBsdWdfZG9uZSgpO1xuIFx0cmV0dXJuIHJldDtcbiB9XG5kaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tbXpvbmUuaCBiL2luY2x1ZGUvbGludXgvbW16b25lLmhcbmluZGV4IDk0ZjljM2ZmNTQxNjAuLjdiZWZlNTAyMjNkMTIgMTAwNjQ0XG4tLS0gYS9pbmNsdWRlL2xpbnV4L21tem9uZS5oXG4rKysgYi9pbmNsdWRlL2xpbnV4L21tem9uZS5oXG5AQCAtMTA0Myw2ICsxMDQzLDQyIEBAIHN0cnVjdCB6b25lIHtcbiBcdCAqIGNtYSBwYWdlcyBpcyBwcmVzZW50IHBhZ2VzIHRoYXQgYXJlIGFzc2lnbmVkIGZvciBDTUEgdXNlXG4gXHQgKiAoTUlHUkFURV9DTUEpLlxuIFx0ICpcbitcdCAqIHBhZ2VzX3dpdGhfb25saW5lX21lbW1hcCB0cmFja3MgcGFnZXMgd2l0aGluIHRoZSB6b25lIHRoYXQgaGF2ZVxuK1x0ICogYW4gb25saW5lIG1lbW9yeSBtYXA6IHByZXNlbnQgcGFnZXMgYW5kIG1lbW9yeSBob2xlcyB3aG9zZVxuK1x0ICogbWVtb3J5IG1hcCBoYXMgYmVlbiBpbml0aWFsaXplZCBhbmQgcGZuX3RvX29ubGluZV9wYWdlKClcbitcdCAqIHN1Y2NlZWRzLiBXaGVuIHNwYW5uZWRfcGFnZXMgPT0gcGFnZXNfd2l0aF9vbmxpbmVfbWVtbWFwLFxuK1x0ICogcGZuX3RvX3BhZ2UoKSBjYW4gYmUgcGVyZm9ybWVkIHdpdGhvdXQgZnVydGhlciBjaGVja3Mgb24gYW55XG4rXHQgKiBQRk4gd2l0aGluIHRoZSB6b25lIHNwYW4uXG4rXHQgKlxuK1x0ICogTm90ZTogdGhpcyBjb3VudGVyIG1heSB0ZW1wb3JhcmlseSB1bmRlcmNvdW50IHdoZW4gcGFnZXMgd2l0aCBhblxuK1x0ICogb25saW5lIG1lbW9yeSBtYXAgZXhpc3Qgb3V0c2lkZSB0aGUgY3VycmVudCB6b25lIHNwYW4uIFN1Y2ggcGFnZXNcbitcdCAqIGFyZSBvbmx5IGNyZWF0ZWQgZHVyaW5nIGJvb3QsIHdoZW4gaW5pdGlhbGl6aW5nIHRoZSBtZW1vcnkgbWFwIG9mXG4rXHQgKiBwYWdlcyB0aGF0IGRvIG5vdCBmYWxsIGludG8gYW55IHpvbmUgc3Bhbi4gVGhlIHVuZGVyY291bnQgaXRzZWxmXG4rXHQgKiBjYW4gb25seSBoYXBwZW4gYWZ0ZXIgYm9vdCwgZHVyaW5nIG1lbW9yeSBob3RwbHVnLCB3aGVuIGdyb3dpbmdcbitcdCAqIHRoZSB6b25lIHRvIGNvdmVyIHN1Y2ggcGFnZXMgYW5kIGxhdGVyIHNocmlua2luZyBpdCBiYWNrLCB3aGljaFxuK1x0ICogbWF5IHJlc3VsdCBpbiBhIFwidG9vIHNtYWxsXCIgdmFsdWUuIFRoaXMgaXMgc2FmZTogaXQgbWVyZWx5XG4rXHQgKiBwcmV2ZW50cyBkZXRlY3RpbmcgYSBjb250aWd1b3VzIHpvbmUuXG4rXHQgKlxuK1x0ICogSGVyZSBpcyBhbiBleGFtcGxlIChwYWdlIG51bWJlcnMgYXJlIGp1c3QgZm9yIGlsbHVzdHJhdGlvblxuK1x0ICogcHVycG9zZXMpOlxuK1x0ICogICBhZnRlciBib290OlxuK1x0ICogICAgICAgWyAgem9uZSBzcGFuICBdXG4rXHQgKiAgICAgICBbICAgem9uZSBwYWdlcyAgIF1cbitcdCAqICAgICAgIHNwYW5uZWQ9MTAsIGluaXRpYWxpemVkPTE1LCBvbmxpbmU9MTBcbitcdCAqICAgICAgIG9ubGluZSA9PSBzcGFubmVkICAtXHUwMDNlICBjb250aWd1b3VzXG4rXHQgKlxuK1x0ICogICBncm93aW5nIGFmdGVyIGhvdHBsdWcgKGhvdHBsdWcgNSk6XG4rXHQgKiAgICAgICBbICB6b25lIHNwYW4gICAgICAgICAgICAgICAgICAgICAgICAgIF1cbitcdCAqICAgICAgIFsgICB6b25lIHBhZ2VzICAgXSAgIFsgICB6b25lIHBhZ2VzICAgXVxuK1x0ICogICAgICAgc3Bhbm5lZD0zMCwgaW5pdGlhbGl6ZWQ9MjAsIG9ubGluZT0xNVxuK1x0ICogICAgICAgb25saW5lICE9IHNwYW5uZWQgIC1cdTAwM2UgIG5vdCBjb250aWd1b3VzXG4rXHQgKlxuK1x0ICogICBzaHJpbmtpbmcgYWZ0ZXIgaG90dW5wbHVnIChob3R1bnBsdWcgNSBhZ2Fpbik6XG4rXHQgKiAgICAgICBbICB6b25lIHNwYW4gICAgIF1cbitcdCAqICAgICAgIFsgICB6b25lIHBhZ2VzICAgXVxuK1x0ICogICAgICAgc3Bhbm5lZD0xNSwgaW5pdGlhbGl6ZWQ9MTUsIG9ubGluZT0xMFxuK1x0ICogICAgICAgb25saW5lICE9IHNwYW5uZWQgIC1cdTAwM2UgIG5vdCBjb250aWd1b3VzIGFsdGhvdWdoIGNvbnRpZ3VvdXNcbitcdCAqXG4gXHQgKiBTbyBwcmVzZW50X3BhZ2VzIG1heSBiZSB1c2VkIGJ5IG1lbW9yeSBob3RwbHVnIG9yIG1lbW9yeSBwb3dlclxuIFx0ICogbWFuYWdlbWVudCBsb2dpYyB0byBmaWd1cmUgb3V0IHVubWFuYWdlZCBwYWdlcyBieSBjaGVja2luZ1xuIFx0ICogKHByZXNlbnRfcGFnZXMgLSBtYW5hZ2VkX3BhZ2VzKS4gQW5kIG1hbmFnZWRfcGFnZXMgc2hvdWxkIGJlIHVzZWRcbkBAIC0xMDY3LDYgKzExMDMsNyBAQCBzdHJ1Y3Qgem9uZSB7XG4gXHRhdG9taWNfbG9uZ190XHRcdG1hbmFnZWRfcGFnZXM7XG4gXHR1bnNpZ25lZCBsb25nXHRcdHNwYW5uZWRfcGFnZXM7XG4gXHR1bnNpZ25lZCBsb25nXHRcdHByZXNlbnRfcGFnZXM7XG4rXHR1bnNpZ25lZCBsb25nXHRcdHBhZ2VzX3dpdGhfb25saW5lX21lbW1hcDtcbiAjaWYgZGVmaW5lZChDT05GSUdfTUVNT1JZX0hPVFBMVUcpXG4gXHR1bnNpZ25lZCBsb25nXHRcdHByZXNlbnRfZWFybHlfcGFnZXM7XG4gI2VuZGlmXG5AQCAtMTY5NCw2ICsxNzMxLDM4IEBAIHN0YXRpYyBpbmxpbmUgYm9vbCB6b25lX2lzX3pvbmVfZGV2aWNlKGNvbnN0IHN0cnVjdCB6b25lICp6b25lKVxuIH1cbiAjZW5kaWZcbiBcbisvKipcbisgKiB6b25lX2lzX2NvbnRpZ3VvdXMgLSB0ZXN0IHdoZXRoZXIgYSB6b25lIGlzIGNvbnRpZ3VvdXNcbisgKiBAem9uZTogdGhlIHpvbmUgdG8gdGVzdC5cbisgKlxuKyAqIEluIGEgY29udGlndW91cyB6b25lLCBpdCBpcyB2YWxpZCB0byBjYWxsIHBmbl90b19wYWdlKCkgb24gYW55IFBGTiBpbiB0aGVcbisgKiBzcGFubmVkIHpvbmUgd2l0aG91dCByZXF1aXJpbmcgcGZuX3ZhbGlkKCkgb3IgcGZuX3RvX29ubGluZV9wYWdlKCkgY2hlY2tzLlxuKyAqXG4rICogTm90ZSB0aGF0IG1pc3Npbmcgc3luY2hyb25pemF0aW9uIHdpdGggbWVtb3J5IG9mZmxpbmluZyBtYWtlcyBhbnkgUEZOXG4rICogdHJhdmVyc2FsIHByb25lIHRvIHJhY2VzLlxuKyAqXG4rICogWk9ORV9ERVZJQ0Ugem9uZXMgYXJlIGFsd2F5cyBtYXJrZWQgbm9uLWNvbnRpZ3VvdXMuXG4rICpcbisgKiBSZXR1cm46IHRydWUgaWYgY29udGlndW91cywgb3RoZXJ3aXNlIGZhbHNlLlxuKyAqL1xuK3N0YXRpYyBpbmxpbmUgYm9vbCB6b25lX2lzX2NvbnRpZ3VvdXMoY29uc3Qgc3RydWN0IHpvbmUgKnpvbmUpXG4re1xuK1x0cmV0dXJuIFJFQURfT05DRSh6b25lLVx1MDAzZWNvbnRpZ3VvdXMpO1xuK31cbitcbitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X3pvbmVfY29udGlndW91cyhzdHJ1Y3Qgem9uZSAqem9uZSlcbit7XG4rXHRpZiAoem9uZV9pc196b25lX2RldmljZSh6b25lKSlcbitcdFx0cmV0dXJuO1xuK1x0aWYgKHpvbmUtXHUwMDNlc3Bhbm5lZF9wYWdlcyA9PSB6b25lLVx1MDAzZXBhZ2VzX3dpdGhfb25saW5lX21lbW1hcClcbitcdFx0V1JJVEVfT05DRSh6b25lLVx1MDAzZWNvbnRpZ3VvdXMsIHRydWUpO1xuK31cbitcbitzdGF0aWMgaW5saW5lIHZvaWQgY2xlYXJfem9uZV9jb250aWd1b3VzKHN0cnVjdCB6b25lICp6b25lKVxuK3tcbitcdFdSSVRFX09OQ0Uoem9uZS1cdTAwM2Vjb250aWd1b3VzLCBmYWxzZSk7XG4rfVxuK1xuIC8qXG4gICogUmV0dXJucyB0cnVlIGlmIGEgem9uZSBoYXMgcGFnZXMgbWFuYWdlZCBieSB0aGUgYnVkZHkgYWxsb2NhdG9yLlxuICAqIEFsbCB0aGUgcmVjbGFpbSBkZWNpc2lvbnMgaGF2ZSB0byB1c2UgdGhpcyBmdW5jdGlvbiByYXRoZXIgdGhhblxuZGlmZiAtLWdpdCBhL21tL21lbW9yeV9ob3RwbHVnLmMgYi9tbS9tZW1vcnlfaG90cGx1Zy5jXG5pbmRleCAyMjZhYjljYjA3OGFkLi4xMDA5NDFkMWI4MjhhIDEwMDY0NFxuLS0tIGEvbW0vbWVtb3J5X2hvdHBsdWcuY1xuKysrIGIvbW0vbWVtb3J5X2hvdHBsdWcuY1xuQEAgLTQyNSw0OSArNDI1LDM5IEBAIGludCBfX2FkZF9wYWdlcyhpbnQgbmlkLCB1bnNpZ25lZCBsb25nIHBmbiwgdW5zaWduZWQgbG9uZyBucl9wYWdlcyxcbiBcdHJldHVybiBlcnI7XG4gfVxuIFxuLS8qIGZpbmQgdGhlIHNtYWxsZXN0IHZhbGlkIHBmbiBpbiB0aGUgcmFuZ2UgW3N0YXJ0X3BmbiwgZW5kX3BmbikgKi9cbi1zdGF0aWMgdW5zaWduZWQgbG9uZyBmaW5kX3NtYWxsZXN0X3NlY3Rpb25fcGZuKGludCBuaWQsIHN0cnVjdCB6b25lICp6b25lLFxuLVx0XHRcdFx0ICAgICB1bnNpZ25lZCBsb25nIHN0YXJ0X3Bmbixcbi1cdFx0XHRcdCAgICAgdW5zaWduZWQgbG9uZyBlbmRfcGZuKVxuK3N0YXRpYyBib29sIHN1YnNlY3Rpb25fb3ZlcmxhcHNfem9uZSh1bnNpZ25lZCBsb25nIHBmbiwgc3RydWN0IHpvbmUgKnpvbmUpXG4ge1xuLVx0Zm9yICg7IHN0YXJ0X3BmbiBcdTAwM2MgZW5kX3Bmbjsgc3RhcnRfcGZuICs9IFBBR0VTX1BFUl9TVUJTRUNUSU9OKSB7XG4tXHRcdGlmICh1bmxpa2VseSghcGZuX3RvX29ubGluZV9wYWdlKHN0YXJ0X3BmbikpKVxuLVx0XHRcdGNvbnRpbnVlO1xuK1x0Y29uc3QgdW5zaWduZWQgbG9uZyBzdGFydF9wZm4gPSBBTElHTl9ET1dOKHBmbiwgUEFHRVNfUEVSX1NVQlNFQ1RJT04pO1xuK1x0Y29uc3QgdW5zaWduZWQgbG9uZyBlbmRfcGZuID0gc3RhcnRfcGZuICsgUEFHRVNfUEVSX1NVQlNFQ1RJT04gLSAxO1xuIFxuLVx0XHRpZiAodW5saWtlbHkocGZuX3RvX25pZChzdGFydF9wZm4pICE9IG5pZCkpXG4tXHRcdFx0Y29udGludWU7XG4rXHQvKiBBbGwgcGFnZXMgaW4gYSBzdWJzZWN0aW9uIGFyZSBlaXRoZXIgb25saW5lIG9yIG9mZmxpbmUuICovXG4rXHRpZiAodW5saWtlbHkoIXBmbl90b19vbmxpbmVfcGFnZShzdGFydF9wZm4pKSlcbitcdFx0cmV0dXJuIGZhbHNlO1xuIFxuLVx0XHRpZiAoem9uZSAhPSBwYWdlX3pvbmUocGZuX3RvX3BhZ2Uoc3RhcnRfcGZuKSkpXG4tXHRcdFx0Y29udGludWU7XG4rXHQvKiBDaGVja2luZyBzdGFydCtlbmQgaXMgc3VmZmljaWVudC4gKi9cbitcdHJldHVybiB6b25lID09IHBhZ2Vfem9uZShwZm5fdG9fcGFnZShzdGFydF9wZm4pKSB8fFxuK1x0ICAgICAgIHpvbmUgPT0gcGFnZV96b25lKHBmbl90b19wYWdlKGVuZF9wZm4pKTtcbit9XG4gXG4tXHRcdHJldHVybiBzdGFydF9wZm47XG4rLyogZmluZCB0aGUgc21hbGxlc3QgdmFsaWQgcGZuIGluIHRoZSByYW5nZSBbc3RhcnRfcGZuLCBlbmRfcGZuKSAqL1xuK3N0YXRpYyB1bnNpZ25lZCBsb25nIGZpbmRfc21hbGxlc3Rfc2VjdGlvbl9wZm4oc3RydWN0IHpvbmUgKnpvbmUsXG4rXHRcdHVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuLCB1bnNpZ25lZCBsb25nIGVuZF9wZm4pXG4re1xuK1x0Zm9yICg7IHN0YXJ0X3BmbiBcdTAwM2MgZW5kX3Bmbjsgc3RhcnRfcGZuICs9IFBBR0VTX1BFUl9TVUJTRUNUSU9OKSB7XG4rXHRcdGlmIChzdWJzZWN0aW9uX292ZXJsYXBzX3pvbmUoc3RhcnRfcGZuLCB6b25lKSlcbitcdFx0XHRyZXR1cm4gc3RhcnRfcGZuO1xuIFx0fVxuLVxuIFx0cmV0dXJuIDA7XG4gfVxuIFxuIC8qIGZpbmQgdGhlIGJpZ2dlc3QgdmFsaWQgcGZuIGluIHRoZSByYW5nZSBbc3RhcnRfcGZuLCBlbmRfcGZuKS4gKi9cbi1zdGF0aWMgdW5zaWduZWQgbG9uZyBmaW5kX2JpZ2dlc3Rfc2VjdGlvbl9wZm4oaW50IG5pZCwgc3RydWN0IHpvbmUgKnpvbmUsXG4tXHRcdFx0XHQgICAgdW5zaWduZWQgbG9uZyBzdGFydF9wZm4sXG4tXHRcdFx0XHQgICAgdW5zaWduZWQgbG9uZyBlbmRfcGZuKVxuK3N0YXRpYyB1bnNpZ25lZCBsb25nIGZpbmRfYmlnZ2VzdF9zZWN0aW9uX3BmbihzdHJ1Y3Qgem9uZSAqem9uZSxcbitcdFx0dW5zaWduZWQgbG9uZyBzdGFydF9wZm4sIHVuc2lnbmVkIGxvbmcgZW5kX3BmbilcbiB7XG4tXHR1bnNpZ25lZCBsb25nIHBmbjtcbi1cbi1cdC8qIHBmbiBpcyB0aGUgZW5kIHBmbiBvZiBhIG1lbW9yeSBzZWN0aW9uLiAqL1xuLVx0cGZuID0gZW5kX3BmbiAtIDE7XG4tXHRmb3IgKDsgcGZuIFx1MDAzZT0gc3RhcnRfcGZuOyBwZm4gLT0gUEFHRVNfUEVSX1NVQlNFQ1RJT04pIHtcbi1cdFx0aWYgKHVubGlrZWx5KCFwZm5fdG9fb25saW5lX3BhZ2UocGZuKSkpXG4tXHRcdFx0Y29udGludWU7XG4tXG4tXHRcdGlmICh1bmxpa2VseShwZm5fdG9fbmlkKHBmbikgIT0gbmlkKSlcbi1cdFx0XHRjb250aW51ZTtcbi1cbi1cdFx0aWYgKHpvbmUgIT0gcGFnZV96b25lKHBmbl90b19wYWdlKHBmbikpKVxuLVx0XHRcdGNvbnRpbnVlO1xuLVxuLVx0XHRyZXR1cm4gcGZuO1xuK1x0Zm9yICg7IGVuZF9wZm4gXHUwMDNlIHN0YXJ0X3BmbjsgZW5kX3BmbiAtPSBQQUdFU19QRVJfU1VCU0VDVElPTikge1xuK1x0XHRpZiAoc3Vic2VjdGlvbl9vdmVybGFwc196b25lKGVuZF9wZm4gLSAxLCB6b25lKSlcbitcdFx0XHRyZXR1cm4gZW5kX3BmbiAtIDE7XG4gXHR9XG4tXG4gXHRyZXR1cm4gMDtcbiB9XG4gXG5AQCAtNDc1LDcgKzQ2NSw2IEBAIHN0YXRpYyB2b2lkIHNocmlua196b25lX3NwYW4oc3RydWN0IHpvbmUgKnpvbmUsIHVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuLFxuIFx0XHRcdCAgICAgdW5zaWduZWQgbG9uZyBlbmRfcGZuKVxuIHtcbiBcdHVuc2lnbmVkIGxvbmcgcGZuO1xuLVx0aW50IG5pZCA9IHpvbmVfdG9fbmlkKHpvbmUpO1xuIFxuIFx0aWYgKHpvbmUtXHUwMDNlem9uZV9zdGFydF9wZm4gPT0gc3RhcnRfcGZuKSB7XG4gXHRcdC8qXG5AQCAtNDg0LDcgKzQ3Myw3IEBAIHN0YXRpYyB2b2lkIHNocmlua196b25lX3NwYW4oc3RydWN0IHpvbmUgKnpvbmUsIHVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuLFxuIFx0XHQgKiBJbiB0aGlzIGNhc2UsIHdlIGZpbmQgc2Vjb25kIHNtYWxsZXN0IHZhbGlkIG1lbV9zZWN0aW9uXG4gXHRcdCAqIGZvciBzaHJpbmtpbmcgem9uZS5cbiBcdFx0ICovXG4tXHRcdHBmbiA9IGZpbmRfc21hbGxlc3Rfc2VjdGlvbl9wZm4obmlkLCB6b25lLCBlbmRfcGZuLFxuK1x0XHRwZm4gPSBmaW5kX3NtYWxsZXN0X3NlY3Rpb25fcGZuKHpvbmUsIGVuZF9wZm4sXG4gXHRcdFx0XHRcdFx0em9uZV9lbmRfcGZuKHpvbmUpKTtcbiBcdFx0aWYgKHBmbikge1xuIFx0XHRcdHpvbmUtXHUwMDNlc3Bhbm5lZF9wYWdlcyA9IHpvbmVfZW5kX3Bmbih6b25lKSAtIHBmbjtcbkBAIC01MDAsNyArNDg5LDcgQEAgc3RhdGljIHZvaWQgc2hyaW5rX3pvbmVfc3BhbihzdHJ1Y3Qgem9uZSAqem9uZSwgdW5zaWduZWQgbG9uZyBzdGFydF9wZm4sXG4gXHRcdCAqIEluIHRoaXMgY2FzZSwgd2UgZmluZCBzZWNvbmQgYmlnZ2VzdCB2YWxpZCBtZW1fc2VjdGlvbiBmb3JcbiBcdFx0ICogc2hyaW5raW5nIHpvbmUuXG4gXHRcdCAqL1xuLVx0XHRwZm4gPSBmaW5kX2JpZ2dlc3Rfc2VjdGlvbl9wZm4obmlkLCB6b25lLCB6b25lLVx1MDAzZXpvbmVfc3RhcnRfcGZuLFxuK1x0XHRwZm4gPSBmaW5kX2JpZ2dlc3Rfc2VjdGlvbl9wZm4oem9uZSwgem9uZS1cdTAwM2V6b25lX3N0YXJ0X3BmbixcbiBcdFx0XHRcdFx0ICAgICAgIHN0YXJ0X3Bmbik7XG4gXHRcdGlmIChwZm4pXG4gXHRcdFx0em9uZS1cdTAwM2VzcGFubmVkX3BhZ2VzID0gcGZuIC0gem9uZS1cdTAwM2V6b25lX3N0YXJ0X3BmbiArIDE7XG5AQCAtNTYwLDE4ICs1NDksMTMgQEAgdm9pZCByZW1vdmVfcGZuX3JhbmdlX2Zyb21fem9uZShzdHJ1Y3Qgem9uZSAqem9uZSxcbiBcbiBcdC8qXG4gXHQgKiBab25lIHNocmlua2luZyBjb2RlIGNhbm5vdCBwcm9wZXJseSBkZWFsIHdpdGggWk9ORV9ERVZJQ0UuIFNvXG4tXHQgKiB3ZSB3aWxsIG5vdCB0cnkgdG8gc2hyaW5rIHRoZSB6b25lcyAtIHdoaWNoIGlzIG9rYXkgYXNcbi1cdCAqIHNldF96b25lX2NvbnRpZ3VvdXMoKSBjYW5ub3QgZGVhbCB3aXRoIFpPTkVfREVWSUNFIGVpdGhlciB3YXkuXG4rXHQgKiB3ZSB3aWxsIG5vdCB0cnkgdG8gc2hyaW5rIGl0LlxuIFx0ICovXG4gXHRpZiAoem9uZV9pc196b25lX2RldmljZSh6b25lKSlcbiBcdFx0cmV0dXJuO1xuIFxuLVx0Y2xlYXJfem9uZV9jb250aWd1b3VzKHpvbmUpO1xuLVxuIFx0c2hyaW5rX3pvbmVfc3Bhbih6b25lLCBzdGFydF9wZm4sIHN0YXJ0X3BmbiArIG5yX3BhZ2VzKTtcbiBcdHVwZGF0ZV9wZ2RhdF9zcGFuKHBnZGF0KTtcbi1cbi1cdHNldF96b25lX2NvbnRpZ3VvdXMoem9uZSk7XG4gfVxuIFxuIC8qKlxuQEAgLTc0OSw4ICs3MzMsNiBAQCB2b2lkIG1vdmVfcGZuX3JhbmdlX3RvX3pvbmUoc3RydWN0IHpvbmUgKnpvbmUsIHVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuLFxuIFx0c3RydWN0IHBnbGlzdF9kYXRhICpwZ2RhdCA9IHpvbmUtXHUwMDNlem9uZV9wZ2RhdDtcbiBcdGludCBuaWQgPSBwZ2RhdC1cdTAwM2Vub2RlX2lkO1xuIFxuLVx0Y2xlYXJfem9uZV9jb250aWd1b3VzKHpvbmUpO1xuLVxuIFx0aWYgKHpvbmVfaXNfZW1wdHkoem9uZSkpXG4gXHRcdGluaXRfY3VycmVudGx5X2VtcHR5X3pvbmUoem9uZSwgc3RhcnRfcGZuLCBucl9wYWdlcyk7XG4gXHRyZXNpemVfem9uZV9yYW5nZSh6b25lLCBzdGFydF9wZm4sIG5yX3BhZ2VzKTtcbkBAIC03NzgsOCArNzYwLDYgQEAgdm9pZCBtb3ZlX3Bmbl9yYW5nZV90b196b25lKHN0cnVjdCB6b25lICp6b25lLCB1bnNpZ25lZCBsb25nIHN0YXJ0X3BmbixcbiBcdG1lbW1hcF9pbml0X3JhbmdlKG5yX3BhZ2VzLCBuaWQsIHpvbmVfaWR4KHpvbmUpLCBzdGFydF9wZm4sIDAsXG4gXHRcdFx0IE1FTUlOSVRfSE9UUExVRywgYWx0bWFwLCBtaWdyYXRldHlwZSxcbiBcdFx0XHQgaXNvbGF0ZV9wYWdlYmxvY2spO1xuLVxuLVx0c2V0X3pvbmVfY29udGlndW91cyh6b25lKTtcbiB9XG4gXG4gc3RydWN0IGF1dG9fbW92YWJsZV9zdGF0cyB7XG5AQCAtMTA3NSw2ICsxMDU1LDcgQEAgdm9pZCBhZGp1c3RfcHJlc2VudF9wYWdlX2NvdW50KHN0cnVjdCBwYWdlICpwYWdlLCBzdHJ1Y3QgbWVtb3J5X2dyb3VwICpncm91cCxcbiBcdGlmIChlYXJseV9zZWN0aW9uKF9fcGZuX3RvX3NlY3Rpb24ocGFnZV90b19wZm4ocGFnZSkpKSlcbiBcdFx0em9uZS1cdTAwM2VwcmVzZW50X2Vhcmx5X3BhZ2VzICs9IG5yX3BhZ2VzO1xuIFx0em9uZS1cdTAwM2VwcmVzZW50X3BhZ2VzICs9IG5yX3BhZ2VzO1xuK1x0em9uZS1cdTAwM2VwYWdlc193aXRoX29ubGluZV9tZW1tYXAgKz0gbnJfcGFnZXM7XG4gXHR6b25lLVx1MDAzZXpvbmVfcGdkYXQtXHUwMDNlbm9kZV9wcmVzZW50X3BhZ2VzICs9IG5yX3BhZ2VzO1xuIFxuIFx0aWYgKGdyb3VwIFx1MDAyNlx1MDAyNiBtb3ZhYmxlKVxuZGlmZiAtLWdpdCBhL21tL21tX2luaXQuYyBiL21tL21tX2luaXQuY1xuaW5kZXggMTUzM2FlYmFmYjY4OC4uZDQwYThmZjIzMzcwMCAxMDA2NDRcbi0tLSBhL21tL21tX2luaXQuY1xuKysrIGIvbW0vbW1faW5pdC5jXG5AQCAtODE3LDIyICs4MTcsMzkgQEAgdm9pZCBfX21lbWluaXQgaW5pdF9kZWZlcnJlZF9wYWdlKHVuc2lnbmVkIGxvbmcgcGZuLCBpbnQgbmlkKVxuICAqICAgem9uZS9ub2RlIGFib3ZlIHRoZSBob2xlIGV4Y2VwdCBmb3IgdGhlIHRyYWlsaW5nIHBhZ2VzIGluIHRoZSBsYXN0XG4gICogICBzZWN0aW9uIHRoYXQgd2lsbCBiZSBhcHBlbmRlZCB0byB0aGUgem9uZS9ub2RlIGJlbG93LlxuICAqL1xuLXN0YXRpYyB2b2lkIF9faW5pdCBpbml0X3VuYXZhaWxhYmxlX3JhbmdlKHVuc2lnbmVkIGxvbmcgc3Bmbixcbi1cdFx0XHRcdFx0ICB1bnNpZ25lZCBsb25nIGVwZm4sXG4tXHRcdFx0XHRcdCAgaW50IHpvbmUsIGludCBub2RlKVxuK3N0YXRpYyB1bnNpZ25lZCBsb25nIF9faW5pdCBpbml0X3VuYXZhaWxhYmxlX3JhbmdlKHVuc2lnbmVkIGxvbmcgc3BmbixcbitcdFx0XHRcdFx0XHQgICB1bnNpZ25lZCBsb25nIGVwZm4sXG4rXHRcdFx0XHRcdFx0ICAgaW50IHpvbmUsIGludCBub2RlKVxuIHtcbitcdHVuc2lnbmVkIGxvbmcgbmV4dF9jaHVua19wZm4gX19tYXliZV91bnVzZWQgPSBzcGZuO1xuIFx0dW5zaWduZWQgbG9uZyBwZm47XG4tXHR1NjQgcGdjbnQgPSAwO1xuK1x0dTY0IG9ubGluZV9wZ2NudCA9IDAsIHBnY250ID0gMDtcbitcdGJvb2wgaXNfb25saW5lID0gdHJ1ZTtcbiBcbiBcdGZvcl9lYWNoX3ZhbGlkX3BmbihwZm4sIHNwZm4sIGVwZm4pIHtcbiBcdFx0X19pbml0X3NpbmdsZV9wYWdlKHBmbl90b19wYWdlKHBmbiksIHBmbiwgem9uZSwgbm9kZSk7XG4gXHRcdF9fU2V0UGFnZVJlc2VydmVkKHBmbl90b19wYWdlKHBmbikpO1xuIFx0XHRwZ2NudCsrO1xuK1xuK1x0XHQvKlxuK1x0XHQgKiBXaXRoIHZtZW1tYXAsIGF0IHRoaXMgc3RhZ2UgYWxsIHBhZ2VzIGluIGFuIGVhcmx5IHNlY3Rpb25cbitcdFx0ICogaGF2ZSBhIHZhbGlkIG1lbW1hcCBhbmQgYXJlIG1hcmtlZCBhcyBvbmxpbmUuIEhvd2V2ZXIsIG9ubHlcbitcdFx0ICogc3Vic2VjdGlvbnMgaW4gdGhlIHN1YnNlY3Rpb24gbWFwIGFyZSBhY3R1YWxseSBvbmxpbmUuXG4rXHRcdCAqL1xuKyNpZmRlZiBDT05GSUdfU1BBUlNFTUVNX1ZNRU1NQVBcbitcdFx0aWYgKHBmbiBcdTAwM2U9IG5leHRfY2h1bmtfcGZuKSB7XG4rXHRcdFx0aXNfb25saW5lID0gcGZuX3NlY3Rpb25fdmFsaWQoX19wZm5fdG9fc2VjdGlvbihwZm4pLCBwZm4pO1xuK1x0XHRcdG5leHRfY2h1bmtfcGZuID0gbWluKFNVQlNFQ1RJT05fQUxJR05fVVAocGZuICsgMSksIGVwZm4pO1xuK1x0XHR9XG4rI2VuZGlmXG4rXHRcdGlmIChpc19vbmxpbmUpXG4rXHRcdFx0b25saW5lX3BnY250Kys7XG4gXHR9XG4gXG4gXHRpZiAocGdjbnQpXG4gXHRcdHByX2luZm8oXCJPbiBub2RlICVkLCB6b25lICVzOiAlbGxkIHBhZ2VzIGluIHVuYXZhaWxhYmxlIHJhbmdlc1xcblwiLFxuIFx0XHRcdG5vZGUsIHpvbmVfbmFtZXNbem9uZV0sIHBnY250KTtcbitcdHJldHVybiBvbmxpbmVfcGdjbnQ7XG4gfVxuIFxuIC8qXG5AQCAtOTMwLDkgKzk0NywyMSBAQCBzdGF0aWMgdm9pZCBfX2luaXQgbWVtbWFwX2luaXRfem9uZV9yYW5nZShzdHJ1Y3Qgem9uZSAqem9uZSxcbiBcdG1lbW1hcF9pbml0X3JhbmdlKGVuZF9wZm4gLSBzdGFydF9wZm4sIG5pZCwgem9uZV9pZCwgc3RhcnRfcGZuLFxuIFx0XHRcdCAgem9uZV9lbmRfcGZuLCBNRU1JTklUX0VBUkxZLCBOVUxMLCBNSUdSQVRFX01PVkFCTEUsXG4gXHRcdFx0ICBmYWxzZSk7XG4rXHR6b25lLVx1MDAzZXBhZ2VzX3dpdGhfb25saW5lX21lbW1hcCArPSBlbmRfcGZuIC0gc3RhcnRfcGZuO1xuIFxuLVx0aWYgKCpob2xlX3BmbiBcdTAwM2Mgc3RhcnRfcGZuKVxuLVx0XHRpbml0X3VuYXZhaWxhYmxlX3JhbmdlKCpob2xlX3Bmbiwgc3RhcnRfcGZuLCB6b25lX2lkLCBuaWQpO1xuK1x0aWYgKCpob2xlX3BmbiBcdTAwM2Mgc3RhcnRfcGZuKSB7XG4rXHRcdHVuc2lnbmVkIGxvbmcgaG9sZV9zdGFydF9wZm4gPSAqaG9sZV9wZm47XG4rXHRcdHVuc2lnbmVkIGxvbmcgcGdjbnQ7XG4rXG4rXHRcdGlmIChob2xlX3N0YXJ0X3BmbiBcdTAwM2Mgem9uZV9zdGFydF9wZm4pIHtcbitcdFx0XHRpbml0X3VuYXZhaWxhYmxlX3JhbmdlKGhvbGVfc3RhcnRfcGZuLCB6b25lX3N0YXJ0X3BmbixcbitcdFx0XHRcdFx0ICAgICAgIHpvbmVfaWQsIG5pZCk7XG4rXHRcdFx0aG9sZV9zdGFydF9wZm4gPSB6b25lX3N0YXJ0X3BmbjtcbitcdFx0fVxuK1x0XHRwZ2NudCA9IGluaXRfdW5hdmFpbGFibGVfcmFuZ2UoaG9sZV9zdGFydF9wZm4sIHN0YXJ0X3BmbixcbitcdFx0XHRcdFx0ICAgICAgIHpvbmVfaWQsIG5pZCk7XG4rXHRcdHpvbmUtXHUwMDNlcGFnZXNfd2l0aF9vbmxpbmVfbWVtbWFwICs9IHBnY250O1xuK1x0fVxuIFxuIFx0KmhvbGVfcGZuID0gZW5kX3BmbjtcbiB9XG5AQCAtMjE4OCwyOCArMjIxNyw2IEBAIHZvaWQgX19pbml0IGluaXRfY21hX3BhZ2VibG9jayhzdHJ1Y3QgcGFnZSAqcGFnZSlcbiB9XG4gI2VuZGlmXG4gXG4tdm9pZCBzZXRfem9uZV9jb250aWd1b3VzKHN0cnVjdCB6b25lICp6b25lKVxuLXtcbi1cdHVuc2lnbmVkIGxvbmcgYmxvY2tfc3RhcnRfcGZuID0gem9uZS1cdTAwM2V6b25lX3N0YXJ0X3Bmbjtcbi1cdHVuc2lnbmVkIGxvbmcgYmxvY2tfZW5kX3Bmbjtcbi1cbi1cdGJsb2NrX2VuZF9wZm4gPSBwYWdlYmxvY2tfZW5kX3BmbihibG9ja19zdGFydF9wZm4pO1xuLVx0Zm9yICg7IGJsb2NrX3N0YXJ0X3BmbiBcdTAwM2Mgem9uZV9lbmRfcGZuKHpvbmUpO1xuLVx0XHRcdGJsb2NrX3N0YXJ0X3BmbiA9IGJsb2NrX2VuZF9wZm4sXG4tXHRcdFx0IGJsb2NrX2VuZF9wZm4gKz0gcGFnZWJsb2NrX25yX3BhZ2VzKSB7XG4tXG4tXHRcdGJsb2NrX2VuZF9wZm4gPSBtaW4oYmxvY2tfZW5kX3Bmbiwgem9uZV9lbmRfcGZuKHpvbmUpKTtcbi1cbi1cdFx0aWYgKCFfX3BhZ2VibG9ja19wZm5fdG9fcGFnZShibG9ja19zdGFydF9wZm4sXG4tXHRcdFx0XHRcdCAgICAgYmxvY2tfZW5kX3Bmbiwgem9uZSkpXG4tXHRcdFx0cmV0dXJuO1xuLVx0XHRjb25kX3Jlc2NoZWQoKTtcbi1cdH1cbi1cbi1cdC8qIFdlIGNvbmZpcm0gdGhhdCB0aGVyZSBpcyBubyBob2xlICovXG4tXHR6b25lLVx1MDAzZWNvbnRpZ3VvdXMgPSB0cnVlO1xuLX1cbi1cbiAvKlxuICAqIENoZWNrIGlmIGEgUEZOIHJhbmdlIGludGVyc2VjdHMgbXVsdGlwbGUgem9uZXMgb24gb25lIG9yIG1vcmVcbiAgKiBOVU1BIG5vZGVzLiBTcGVjaWZ5IHRoZSBAbmlkIGFyZ3VtZW50IGlmIGl0IGlzIGtub3duIHRoYXQgdGhpc1xuZGlmZiAtLWdpdCBhL21tL21tX2luaXQuaCBiL21tL21tX2luaXQuaFxuaW5kZXggMzlmNzVkZjliZTFjMi4uNTIwZDUzZWNjNjhkNSAxMDA2NDRcbi0tLSBhL21tL21tX2luaXQuaFxuKysrIGIvbW0vbW1faW5pdC5oXG5AQCAtMjAsMTUgKzIwLDkgQEAgc3RydWN0IHZtZW1fYWx0bWFwO1xuIC8qIHBlcmZvcm0gc2FuaXR5IGNoZWNrcyBvbiBzdHJ1Y3QgcGFnZXMgYmVpbmcgYWxsb2NhdGVkIG9yIGZyZWVkICovXG4gREVDTEFSRV9TVEFUSUNfS0VZX01BWUJFKENPTkZJR19ERUJVR19WTSwgY2hlY2tfcGFnZXNfZW5hYmxlZCk7XG4gXG4tdm9pZCBzZXRfem9uZV9jb250aWd1b3VzKHN0cnVjdCB6b25lICp6b25lKTtcbiBib29sIHBmbl9yYW5nZV9pbnRlcnNlY3RzX3pvbmVzKGludCBuaWQsIHVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuLFxuIFx0XHRcdCAgIHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMpO1xuIFxuLXN0YXRpYyBpbmxpbmUgdm9pZCBjbGVhcl96b25lX2NvbnRpZ3VvdXMoc3RydWN0IHpvbmUgKnpvbmUpXG4te1xuLVx0em9uZS1cdTAwM2Vjb250aWd1b3VzID0gZmFsc2U7XG4tfVxuLVxuIHZvaWQgbWVtYmxvY2tfZnJlZV9wYWdlcyh1bnNpZ25lZCBsb25nIHBmbiwgdW5zaWduZWQgaW50IG9yZGVyKTtcbiBcbiB2b2lkICptZW1tYXBfYWxsb2MocGh5c19hZGRyX3Qgc2l6ZSwgcGh5c19hZGRyX3QgYWxpZ24sIHBoeXNfYWRkcl90IG1pbl9hZGRyLFxuZGlmZiAtLWdpdCBhL21tL3BhZ2VfYWxsb2MuaCBiL21tL3BhZ2VfYWxsb2MuaFxuaW5kZXggYjkyNTlkZWRkYjU5ZC4uZDQxODJmN2NiN2RkZiAxMDA2NDRcbi0tLSBhL21tL3BhZ2VfYWxsb2MuaFxuKysrIGIvbW0vcGFnZV9hbGxvYy5oXG5AQCAtMjE0LDcgKzIxNCw3IEBAIGV4dGVybiBzdHJ1Y3QgcGFnZSAqX19wYWdlYmxvY2tfcGZuX3RvX3BhZ2UodW5zaWduZWQgbG9uZyBzdGFydF9wZm4sXG4gc3RhdGljIGlubGluZSBzdHJ1Y3QgcGFnZSAqcGFnZWJsb2NrX3Bmbl90b19wYWdlKHVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuLFxuIFx0XHRcdFx0dW5zaWduZWQgbG9uZyBlbmRfcGZuLCBzdHJ1Y3Qgem9uZSAqem9uZSlcbiB7XG4tXHRpZiAoem9uZS1cdTAwM2Vjb250aWd1b3VzKVxuK1x0aWYgKHpvbmVfaXNfY29udGlndW91cyh6b25lKSlcbiBcdFx0cmV0dXJuIHBmbl90b19wYWdlKHN0YXJ0X3Bmbik7XG4gXG4gXHRyZXR1cm4gX19wYWdlYmxvY2tfcGZuX3RvX3BhZ2Uoc3RhcnRfcGZuLCBlbmRfcGZuLCB6b25lKTtcbiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTE0VDA3OjQyOjU3LjIzMDQ0Mzg5M1oiLCJTZXEiOjMsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy44LWZsYXNoIiwiRHVyYXRpb24iOjE5NDU1Nzc1MDQ0LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyBhIE1lbW9yeSBIb3RwbHVnIE9wdGltaXphdGlvbiBQYXRjaCoqXG5cbk9rYXksIGxldCdzIGJyZWFrIHRoaXMgZG93bi4gSXQgbG9va3MgbGlrZSB3ZSBoYXZlIGEgcGF0Y2ggdGFyZ2V0aW5nIHRoZSBhbWQ2NCBhcmNoaXRlY3R1cmUsIGZvY3VzZWQgb24gaW1wcm92aW5nIHRoZSBoYW5kbGluZyBvZiBtZW1vcnkgaG90cGx1ZyBvcGVyYXRpb25zLiBUaGUgY29yZSBpZGVhIHNlZW1zIHRvIGJlIG9wdGltaXppbmcgdGhlIGRldGVybWluYXRpb24gYW5kIG1hbmFnZW1lbnQgb2YgY29udGlndW91cyBtZW1vcnkgem9uZXMuIFdlJ3JlIHRhbGtpbmcgYWJvdXQgc2lnbmlmaWNhbnQgY2hhbmdlcyB0byBzZXZlcmFsIGtleSBhcmVhcy5cblxuRmlyc3QsIHRoZSBkb2N1bWVudGF0aW9uIGluIGBEb2N1bWVudGF0aW9uL21tL3BoeXNpY2FsX21lbW9yeS5yc3RgIGlzIGJlaW5nIHVwZGF0ZWQgdG8gcmVmbGVjdCB0aGVzZSBjaGFuZ2VzIOKAkyBhbHdheXMgYSBnb29kIHNpZ24gdGhhdCB0aGUgaW50ZW50IGlzIHRvIGJlIGNsZWFyLlxuXG5UaGUgbWVhdCBvZiBpdCBpcyBpbiBgZHJpdmVycy9iYXNlL21lbW9yeS5jYC4gV2UncmUgc2VlaW5nIG1vZGlmaWNhdGlvbnMgdG8gYG1lbW9yeV9ibG9ja19vbmxpbmVgIGFuZCBgbWVtb3J5X2Jsb2NrX29mZmxpbmVgLCB3aXRoIHRoZSBhZGRpdGlvbiBvZiBgY2xlYXJfem9uZV9jb250aWd1b3VzYCBhbmQgYHNldF96b25lX2NvbnRpZ3VvdXNgIGF0IHRoZSBiZWdpbm5pbmcgYW5kIGVuZCBvZiB0aG9zZSBmdW5jdGlvbnMsIHJlc3BlY3RpdmVseS4gQWxzbywgYG1lbW9yeV9ibG9ja19vZmZsaW5lYCBub3cgc2V0cyBgbWVtLVx1MDAzZXpvbmUgPSBOVUxMYCwgd2hpY2ggbWFrZXMgc2Vuc2UuIFRoaXMgY2xlYXJseSBpbmRpY2F0ZXMgYSBzaGlmdCBpbiBob3cgd2UgbWFyayB6b25lcyBhcyBjb250aWd1b3VzIG9yIG5vdCBkdXJpbmcgaG90cGx1ZyBldmVudHMuXG5cbkluIGBpbmNsdWRlL2xpbnV4L21tem9uZS5oYCwgd2UncmUgZ2V0dGluZyBuZXcgZGVmaW5pdGlvbnMuIEEgbmV3IG1lbWJlciwgYHBhZ2VzX3dpdGhfb25saW5lX21lbW1hcGAsIGlzIGFkZGVkIHRvIHRoZSBgc3RydWN0IHpvbmVgLiBUaGVuIHdlIGdldCB0aGUgZGVmaW5pdGlvbnMgZm9yIGB6b25lX2lzX2NvbnRpZ3VvdXNgLCBgc2V0X3pvbmVfY29udGlndW91c2AsIGFuZCBgY2xlYXJfem9uZV9jb250aWd1b3VzYC4gVGhlIHVzZSBvZiBgUkVBRF9PTkNFYCBhbmQgYFdSSVRFX09OQ0VgIGhlcmUgaXMgY3J1Y2lhbCBmb3IgYXRvbWljIGFjY2Vzcywgd2hpY2ggcG9pbnRzIHRvIHBvdGVudGlhbCBtdWx0aXRocmVhZGluZyBjb25zaWRlcmF0aW9ucyBhbmQgcG90ZW50aWFsIHJhY2UgY29uZGl0aW9ucy4gSXQgbG9va3MgbGlrZSBjb250aWd1b3VzIHN0YXR1cyBpcyBkZXRlcm1pbmVkIGJ5IHdoZXRoZXIgYHNwYW5uZWRfcGFnZXNgIGVxdWFscyBgcGFnZXNfd2l0aF9vbmxpbmVfbWVtbWFwYC4gVGhlIGRlZmluaXRpb24gb2YgYHpvbmVfaXNfY29udGlndW91c2AsIHdoaWNoIHVzZXMgYFJFQURfT05DRWAsIGlzIGltcG9ydGFudCwgd2UgZG9uJ3Qgd2FudCB0byByYWNlIGluIHJlYWRpbmcgdGhlIHZhbHVlIG9mIHRoZSBjb250aWd1b3VzIGZsYWcuXG5cbmBtbS9tZW1vcnlfaG90cGx1Zy5jYCBoYXMgc2VlbiB0aGUgbW9zdCBkcmFtYXRpYyByZWZhY3RvcmluZy4gVGhlIGZ1bmN0aW9ucyBgZmluZF9zbWFsbGVzdF9zZWN0aW9uX3BmbmAgYW5kIGBmaW5kX2JpZ2dlc3Rfc2VjdGlvbl9wZm5gIGFyZSBiZWluZyB0b3VjaGVkLCBhbmQgdGhlcmUncyBhIG5ldyBmdW5jdGlvbiwgYHN1YnNlY3Rpb25fb3ZlcmxhcHNfem9uZWAuIFRoZSBtb3JlIGludGVyZXN0aW5nIHRoaW5nIGlzIHRoYXQgYGNsZWFyX3pvbmVfY29udGlndW91c2AgYW5kIGBzZXRfem9uZV9jb250aWd1b3VzYCBhcmUgYmVpbmcgcmVtb3ZlZCBmcm9tIGByZW1vdmVfcGZuX3JhbmdlX2Zyb21fem9uZWAgYW5kIGBtb3ZlX3Bmbl9yYW5nZV90b196b25lYC4gVGhpcyBzdWdnZXN0cyBhIGRlbGVnYXRpb24gb2YgcmVzcG9uc2liaWxpdHkgdG8gYG1lbW9yeV9ibG9ja19vbmxpbmVgIGFuZCBgbWVtb3J5X2Jsb2NrX29mZmxpbmVgLiBJdCdzIGEgY2xlYW5lciBzZXBhcmF0aW9uIG9mIGNvbmNlcm5zLCBhdm9pZGluZyBkdXBsaWNhdGlvbi4gQWxzbywgd2UncmUgdHJhY2tpbmcgYHpvbmUtXHUwMDNlcGFnZXNfd2l0aF9vbmxpbmVfbWVtbWFwYCBpbiBgYWRqdXN0X3ByZXNlbnRfcGFnZV9jb3VudGAuXG5cbkluIGBtbS9tbV9pbml0LmNgLCBgaW5pdF91bmF2YWlsYWJsZV9yYW5nZWAgaXMgbm93IHJldHVybmluZyBgb25saW5lX3BnY250YC4gVGhlIGNvZGUgYWxzbyBhZGRzIGB6b25lLVx1MDAzZXBhZ2VzX3dpdGhfb25saW5lX21lbW1hcGAgaW4gYG1lbW1hcF9pbml0X3pvbmVfcmFuZ2VgLiBBbmQgdGhlIHNsb3cgbG9vcCBvZiBgc2V0X3pvbmVfY29udGlndW91c2AgaXMgZ29uZS5cblxuRmluYWxseSwgaW4gYG1tL21tX2luaXQuaGAgYW5kIGBtbS9wYWdlX2FsbG9jLmhgLCB3ZSdyZSBzZWVpbmcgdGhlIG5lY2Vzc2FyeSBjbGVhbnVwIGFuZCBhZGFwdGF0aW9uLiBUaGUgZGVjbGFyYXRpb25zIG9mIGBzZXRfem9uZV9jb250aWd1b3VzYCBhbmQgYGNsZWFyX3pvbmVfY29udGlndW91c2AgYXJlIHJlbW92ZWQgZnJvbSBgbW0vbW1faW5pdC5oYCwgd2hpY2ggaXMgYSBnb29kIGluZGljYXRpb24gdGhhdCB0aGV5IGFyZSBub3QgZXhwb3NlZCBhdCB0aGF0IGxldmVsIGFueW1vcmUuIEFuZCBpbiBgbW0vcGFnZV9hbGxvYy5oYCwgdGhlIG1vcmUgcm9idXN0IGB6b25lX2lzX2NvbnRpZ3VvdXMoem9uZSlgIHJlcGxhY2VzIHRoZSBkaXJlY3QgYWNjZXNzIHRvIGB6b25lLVx1MDAzZWNvbnRpZ3VvdXNgLlxuXG5Mb29rcyBsaWtlIGEgc3Vic3RhbnRpYWwgY2hhbmdlLCBhaW1lZCBhdCBzdHJlYW1saW5pbmcgbWVtb3J5IGhvdHBsdWcuIEknbSBnb2luZyB0byB3YW50IHRvIGRpZyBpbnRvIHRoZSBnaXQgbG9nIG9yIGNvbnRleHQgdXNpbmcgYGdyZXBwZXJgIGFuZCByZWFkLWZpbGUgdG8gYmV0dGVyIHVuZGVyc3RhbmQgdGhlIHJhdGlvbmFsZSBhbmQgdGhlIHBlcmZvcm1hbmNlIGltcGFjdCBvZiB0aGVzZSBtb2RpZmljYXRpb25zLiBJJ2xsIG5lZWQgdG8gY2hlY2sgdGhlIGludGVyYWN0aW9ucyB0byBtYWtlIHN1cmUgdGhlcmUgYXJlIG5vIG5ldyByYWNlIGNvbmRpdGlvbnMgaW50cm9kdWNlZC4gQWxzbywgSSBuZWVkIHRvIHNlZSBpZiB0aGVyZSBpcyBhbnkgaW1wYWN0IG9uIGJvb3QgdGltZS5cblxuXG4iLCJJbnB1dFRva2VucyI6ODM1NywiT3V0cHV0VG9rZW5zIjozMiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjYxMiwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTE0VDA3OjQzOjE2LjY4NjIyMTgzN1oiLCJTZXEiOjQsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo0NjcyMTk0OSwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJtZW1vcnlfYmxvY2tfb25saW5lXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcImRyaXZlcnMvYmFzZS9tZW1vcnkuY1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJkcml2ZXJzL2Jhc2UvbWVtb3J5LmM9MjI0PXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBtZW1ibGtfbnJfcG9pc29uKHN0cnVjdCBtZW1vcnlfYmxvY2sgKm1lbSlcXG4tLVxcbmRyaXZlcnMvYmFzZS9tZW1vcnkuYy0yMzItICovXFxuZHJpdmVycy9iYXNlL21lbW9yeS5jOjIzMzpzdGF0aWMgaW50IG1lbW9yeV9ibG9ja19vbmxpbmUoc3RydWN0IG1lbW9yeV9ibG9jayAqbWVtKVxcbmRyaXZlcnMvYmFzZS9tZW1vcnkuYy0yMzQte1xcbi0tXFxuZHJpdmVycy9iYXNlL21lbW9yeS5jPTM0MD1tZW1vcnlfYmxvY2tfYWN0aW9uKHN0cnVjdCBtZW1vcnlfYmxvY2sgKm1lbSwgdW5zaWduZWQgbG9uZyBhY3Rpb24pXFxuLS1cXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmMtMzQ1LVxcdGNhc2UgTUVNX09OTElORTpcXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmM6MzQ2OlxcdFxcdHJldCA9IG1lbW9yeV9ibG9ja19vbmxpbmUobWVtKTtcXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmMtMzQ3LVxcdFxcdGJyZWFrO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xNFQwNzo0MzoxNi43MzI5NDcwMTZaIiwiU2VxIjo1LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuOC1mbGFzaCIsIkR1cmF0aW9uIjo3MTI4MTA2MzU5LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgbXkgYXR0ZW1wdCBhdCBzdW1tYXJpemluZyB0aGUgdGhvdWdodCBwcm9jZXNzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlOlxuXG4qKlRyYWNpbmcgdGhlIEV4ZWN1dGlvbiBQYXRoIG9mIGBtZW1vcnlfYmxvY2tfYWN0aW9uYCoqXG5cbk9rYXksIHNvIEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoZSBjb250ZXh0IG9mIHRoaXMgYG1lbW9yeV9ibG9ja19hY3Rpb25gIGZ1bmN0aW9uLiBNeSBmaXJzdCBpbnN0aW5jdCwgYXMgYWx3YXlzLCBpcyB0byB0cmFjZSBpdHMgY2FsbCBzaXRlcy4gV2hlcmUgaXMgdGhpcyB0aGluZyBhY3R1YWxseSAqdXNlZCo/IEknbSBub3QgZ29pbmcgdG8ganVzdCBzdGFyZSBhdCB0aGUgY29kZSBob3BpbmcgdGhlIGNvbm5lY3Rpb25zIHdpbGwgbGVhcCBvdXQgYXQgbWUuIEEgcXVpY2sgY3Jvc3MtcmVmZXJlbmNlIG9yIFwiZmluZCBhbGwgcmVmZXJlbmNlc1wiIHNob3VsZCBnaXZlIG1lIGEgY2xlYXIgcGljdHVyZS4gSSdtIGxvb2tpbmcgZm9yIHRoZSBpbW1lZGlhdGUgY2FsbGVycyDigJMgdGhlIGZ1bmN0aW9ucyB0aGF0IGRpcmVjdGx5IGludm9rZSBgbWVtb3J5X2Jsb2NrX2FjdGlvbmAuIFVuZGVyc3RhbmRpbmcgdGhlIGNhbGxlcnMgd2lsbCBpbGx1bWluYXRlIHRoZSBwdXJwb3NlIG9mIHRoZSBhY3Rpb24gaXRzZWxmLCBhbmQgcmV2ZWFsIHRoZSBzdWJzeXN0ZW1zIGl0J3MgaW50ZXJhY3Rpbmcgd2l0aC4gVGhpcyBzaG91bGQgZ2l2ZSBtZSBhIHNvbGlkIGZvdW5kYXRpb24gYmVmb3JlIEkgZGVsdmUgaW50byB0aGUgaW50ZXJuYWwgd29ya2luZ3Mgb2YgYG1lbW9yeV9ibG9ja19hY3Rpb25gIGl0c2VsZi5cblxuXG4iLCJJbnB1dFRva2VucyI6MTAwMTcsIk91dHB1dFRva2VucyI6MzIsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxNiwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0xNFQwNzo0MzoyMy44NjEwNTU1ODVaIiwiU2VxIjo2LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NDc2NTkwMDksIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwibWVtb3J5X2Jsb2NrX2FjdGlvblwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJkcml2ZXJzL2Jhc2UvbWVtb3J5LmNcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiZHJpdmVycy9iYXNlL21lbW9yeS5jPTMzOT1zdGF0aWMgaW50XFxuZHJpdmVycy9iYXNlL21lbW9yeS5jOjM0MDptZW1vcnlfYmxvY2tfYWN0aW9uKHN0cnVjdCBtZW1vcnlfYmxvY2sgKm1lbSwgdW5zaWduZWQgbG9uZyBhY3Rpb24pXFxuZHJpdmVycy9iYXNlL21lbW9yeS5jLTM0MS17XFxuLS1cXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmM9MzYwPXN0YXRpYyBpbnQgbWVtb3J5X2Jsb2NrX2NoYW5nZV9zdGF0ZShzdHJ1Y3QgbWVtb3J5X2Jsb2NrICptZW0sXFxuLS1cXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmMtMzcwLVxcbmRyaXZlcnMvYmFzZS9tZW1vcnkuYzozNzE6XFx0cmV0ID0gbWVtb3J5X2Jsb2NrX2FjdGlvbihtZW0sIHRvX3N0YXRlKTtcXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmMtMzcyLVxcdG1lbS1cXHUwMDNlc3RhdGUgPSByZXQgPyBmcm9tX3N0YXRlX3JlcSA6IHRvX3N0YXRlO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xNFQwNzo0MzoyMy45MDg3MjIwMzRaIiwiU2VxIjo3LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuOC1mbGFzaCIsIkR1cmF0aW9uIjo1MDY4NTMyNTY4LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgbXkgYW5hbHlzaXMgb2YgdGhlIHNpdHVhdGlvbiwgcHJlc2VudGVkIGZyb20gbXkgcGVyc3BlY3RpdmUgYXMgYW4gZXhwZXJ0OlxuXG4qKkludmVzdGlnYXRpbmcgYSBTeXN0ZW0gU3RhdGUgQ2hhbmdlIFRyaWdnZXJlZCBieSBzeXNmcyoqXG5cbk9rYXksIHNvIEkndmUgZ290IGEgY2FsbCBjb21pbmcgaW4sIGBtZW1vcnlfYmxvY2tfY2hhbmdlX3N0YXRlYC4gVGhlIGltbWVkaWF0ZSBjbHVlIGhlcmUgaXMgdGhhdCB0aGlzIGNhbGwgaXMgb3JpZ2luYXRpbmcgZnJvbSB0aGUgYHN0YXRlX3N0b3JlYCBmdW5jdGlvbiBhc3NvY2lhdGVkIHdpdGggYSBzeXNmcyBhdHRyaWJ1dGUuIFRoaXMgc3Ryb25nbHkgc3VnZ2VzdHMgdGhhdCBhIHVzZXItc3BhY2UgaW50ZXJhY3Rpb24gdmlhIHN5c2ZzIGlzIGRyaXZpbmcgYSBjaGFuZ2UgdG8gYSBtZW1vcnkgYmxvY2sncyBzdGF0ZS5cblxuTXkgZmlyc3QgY291cnNlIG9mIGFjdGlvbj8gSSBuZWVkIHRvIGRyaWxsIGRvd24gaW50byBgc3RhdGVfc3RvcmVgLiBVbmRlcnN0YW5kaW5nIGV4YWN0bHkgKndoYXQqIGlzIGJlaW5nIHdyaXR0ZW4gdG8gdGhhdCBzeXNmcyBhdHRyaWJ1dGUgaXMgY3JpdGljYWwuIFdoYXQgdmFsdWVzIGFyZSBwZXJtaXR0ZWQ/IFdoYXQgYWN0aW9ucyBhcmUgdHJpZ2dlcmVkIGJhc2VkIG9uIHRob3NlIHZhbHVlcz8gSSBuZWVkIHRvIGxvb2sgYXQgdGhlIGNvZGUgd2l0aGluIGBzdGF0ZV9zdG9yZWAgdG8gc2VlIGhvdyBpdCBpbnRlcnByZXRzIHRoZSBpbnB1dCBhbmQgd2hhdCBgbWVtb3J5X2Jsb2NrX2NoYW5nZV9zdGF0ZWAgaXMgdGhlbiAqc3VwcG9zZWQqIHRvIGRvIGluIHJlc3BvbnNlLiBJcyB0aGlzIGEgc3RhdGUgdHJhbnNpdGlvbiwgbGlrZSBmcm9tIFwiYWN0aXZlXCIgdG8gXCJzdGFuZGJ5LFwiIG9yIHNvbWV0aGluZyBtb3JlIGNvbXBsZXg/IFRoZSBzcGVjaWZpYyBsb2dpYyBpbnNpZGUgYHN0YXRlX3N0b3JlYCB3aWxsIHRlbGwgdGhlIHN0b3J5LlxuXG5cbiIsIklucHV0VG9rZW5zIjoxMDQyMiwiT3V0cHV0VG9rZW5zIjozNCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjMwLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTE0VDA3OjQzOjI4Ljk3NzI1NzI1MloiLCJTZXEiOjgsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo0NTg2NDAzMCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJtZW1vcnlfYmxvY2tfY2hhbmdlX3N0YXRlXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcImRyaXZlcnMvYmFzZS9tZW1vcnkuY1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJkcml2ZXJzL2Jhc2UvbWVtb3J5LmM9MzQwPW1lbW9yeV9ibG9ja19hY3Rpb24oc3RydWN0IG1lbW9yeV9ibG9jayAqbWVtLCB1bnNpZ25lZCBsb25nIGFjdGlvbilcXG4tLVxcbmRyaXZlcnMvYmFzZS9tZW1vcnkuYy0zNTktXFxuZHJpdmVycy9iYXNlL21lbW9yeS5jOjM2MDpzdGF0aWMgaW50IG1lbW9yeV9ibG9ja19jaGFuZ2Vfc3RhdGUoc3RydWN0IG1lbW9yeV9ibG9jayAqbWVtLFxcbmRyaXZlcnMvYmFzZS9tZW1vcnkuYy0zNjEtXFx0XFx0dW5zaWduZWQgbG9uZyB0b19zdGF0ZSwgdW5zaWduZWQgbG9uZyBmcm9tX3N0YXRlX3JlcSlcXG4tLVxcbmRyaXZlcnMvYmFzZS9tZW1vcnkuYz0zNzg9c3RhdGljIGludCBtZW1vcnlfc3Vic3lzX29ubGluZShzdHJ1Y3QgZGV2aWNlICpkZXYpXFxuLS1cXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmMtMzkyLVxcbmRyaXZlcnMvYmFzZS9tZW1vcnkuYzozOTM6XFx0cmV0ID0gbWVtb3J5X2Jsb2NrX2NoYW5nZV9zdGF0ZShtZW0sIE1FTV9PTkxJTkUsIE1FTV9PRkZMSU5FKTtcXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmMtMzk0LVxcdG1lbS1cXHUwMDNlb25saW5lX3R5cGUgPSBNTU9QX09GRkxJTkU7XFxuLS1cXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmM9Mzk5PXN0YXRpYyBpbnQgbWVtb3J5X3N1YnN5c19vZmZsaW5lKHN0cnVjdCBkZXZpY2UgKmRldilcXG4tLVxcbmRyaXZlcnMvYmFzZS9tZW1vcnkuYy00MDUtXFxuZHJpdmVycy9iYXNlL21lbW9yeS5jOjQwNjpcXHRyZXR1cm4gbWVtb3J5X2Jsb2NrX2NoYW5nZV9zdGF0ZShtZW0sIE1FTV9PRkZMSU5FLCBNRU1fT05MSU5FKTtcXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmMtNDA3LX1cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTRUMDc6NDM6MjkuMDIzMTI3NDIyWiIsIlNlcSI6OSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjgtZmxhc2giLCJEdXJhdGlvbiI6NTg5NzE3NjA4NiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipXb3J0aEZ1enppbmcgQ29uZmlybWF0aW9uOiBNZW1vcnkgSG90cGx1ZyBhbmQgQ29yZSBNTSoqXG5cbk9rYXksIHNvIEknbSB0aGlua2luZyBhYm91dCB0aGlzIGtlcm5lbCBwYXRjaCBhbmQgd2hldGhlciBpdCdzIHdvcnRoIGZ1enppbmcuIFRoZSBrZXkgaGVyZSBpcyB0aGUgbWVtb3J5IGhvdHBsdWcgc3R1ZmYgdmlhIGAvc3lzL2RldmljZXMvc3lzdGVtL21lbW9yeS8uLi5gLiBXYWl0IGEgbWludXRlLCBzeXprYWxsZXIgKmRvZXMqIGludGVyYWN0IHdpdGggc3lzZnMsIGFuZCBtZW1vcnkgaG90cGx1ZyBpcyBzb21ldGhpbmcgd2UgY2FuIHRyaWdnZXIgYW5kIHRlc3QuIEdvb2QsIGxldCdzIGtlZXAgZ29pbmcuXG5cbk15IGZpcnN0IHRob3VnaHQgaXMsIGlzIHRoaXMgY29kZSBldmVuICpyZWFjaGFibGUqPyBJIG5lZWQgdG8gY2hlY2sgdGhlIHJlbGV2YW50IGZpbGVzLCBgbW0vYCBkaXJlY3RvcmllcywgYGRyaXZlcnMvYmFzZS9tZW1vcnkuY2AsIGFuZCBzbyBvbi5cblxuT2theSwgbGV0IG1lIHJlZnJlc2ggbXlzZWxmIHdpdGggdGhlIHBvc2l0aXZlIGFuZCBuZWdhdGl2ZSBjcml0ZXJpYSBpbiBzZWN0aW9uIDEgYW5kIDMuLi4gKlllcyosIGxvb2tpbmcgYXQgc2VjdGlvbiAzLCBJIHNlZSB0aGUgcG9zaXRpdmUgY3JpdGVyaWEganVtcCBvdXQ6IFwiQW55IGxvZ2ljIG1vZGlmaWNhdGlvbnMgaW4gbWVtb3J5IG1hbmFnZW1lbnQgKG1tLykuLi5cIiBUaGF0J3MgKmV4YWN0bHkqIHdoYXQgdGhpcyBpcyEgQW5kIGl0IGFsaWducyB3aXRoIHJlZmFjdG9yaW5nIGFuZCBjb2RlIGNsZWFudXBzLlxuXG5CdXQgd2FpdCwgSSBuZWVkIHRvIGJlIHRob3JvdWdoLiBJIG11c3QgY29uc2lkZXIgdGhlICpuZWdhdGl2ZSogY3JpdGVyaWEgYXMgd2VsbC4uLiBub24ta2VybmVsIGNoYW5nZXMsIHVucmVhY2hhYmxlIGhhcmR3YXJlLi4uIGJ1dCwgaXMgbWVtb3J5IGhvdHBsdWcgKnJlYWNoYWJsZSogaW4gUUVNVT8gWWVzLCB3aXRoIFFFTVUsIHdlIGhhdmUgbWVtb3J5IGJsb2NrcyB2aWEgYC9zeXMvZGV2aWNlcy9zeXN0ZW0vbWVtb3J5L21lbW9yeVgvc3RhdGVgIG9yIHZpYSB2aXJ0aW8tbWVtIG9yIEFDUEkgb3IgZGF4LiBUaGlzIGNhbiBiZSBvbmxpbmVkIGFuZCBvZmZsaW5lZC4gVGhpcyBhcHBsaWVzIGV2ZW4gdG8gcmVndWxhciBtZW1vcnkgYmxvY2tzIHZpYSBzeXNmcyFcblxuQW5kIG5vdyBpdCBnZXRzIGV2ZW4gY2xlYXJlcjogdGhpcyBwYXRjaCB0b3VjaGVzIGBtbS9tZW1vcnlfaG90cGx1Zy5jYCwgYGRyaXZlcnMvYmFzZS9tZW1vcnkuY2AsIGBtbS9tbV9pbml0LmNgLCBgaW5jbHVkZS9saW51eC9tbXpvbmUuaGAsIGFuZCBgbW0vcGFnZV9hbGxvYy5oYC4gVGhhdCdzICpjb3JlKiBgbW1gIHRlcnJpdG9yeS4gQW5kIHRoZSBcIlJFQUNIQUJJTElUWSBJUyBUSEUgUFJJTUFSWSBHQVRFXCIgcHJpbmNpcGxlIHNheXMgdGhhdCBpZiBpdCdzIGV4ZWN1dGFibGUgaW4gUUVNVSwgd2UncmUgZ29vZC5cblxuVGhlbiB0aGUgY29yZSBzdWJzeXN0ZW1zIHNlY3Rpb24gcmVpbmZvcmNlcyB0aGlzLiBUaGUgcnVsZSBpcyBleHBsaWNpdDogXCJBbnkgbG9naWMgbW9kaWZpY2F0aW9ucyBpbiBtZW1vcnkgbWFuYWdlbWVudCAobW0vKS4uLlwiLiBTbywgKldvcnRoRnV6emluZyogaXMgbG9va2luZyBwcmV0dHkgc29saWQgcmlnaHQgbm93IVxuXG5KdXN0IHRvIGJlIGFic29sdXRlbHkgY2VydGFpbiwgSSBzaG91bGQgdmVyaWZ5IHRoZSBjYWxsIHNpdGVzIGZvciB0aG9zZSBmdW5jdGlvbnMuIFNvIEknbGwgY2hlY2sgd2hhdCBjYWxscyBgem9uZV9pc19jb250aWd1b3VzYCwgYHNldF96b25lX2NvbnRpZ3VvdXNgLCBgY2xlYXJfem9uZV9jb250aWd1b3VzYCwgYHNocmlua196b25lX3NwYW5gLCBldGMuIExldCBtZSBzZWUgd2hlcmUgYHpvbmVfaXNfY29udGlndW91c2AgYW5kIGBwYWdlYmxvY2tfcGZuX3RvX3BhZ2VgIGFyZSBjYWxsZWQuIFRoaXMgYWxsICpkZWZpbml0ZWx5KiBzZWVtcyBsaWtlIGEgZ3JlZW4gbGlnaHQuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjExMDI1LCJPdXRwdXRUb2tlbnMiOjE5LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6Njc0LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTE0VDA3OjQzOjM0LjkyMDMwNjIwOFoiLCJTZXEiOjEwLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTkzNDkwNzc2MiwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJ6b25lX2lzX2NvbnRpZ3VvdXNcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiaW5jbHVkZS9saW51eC9tbXpvbmUuaD0xNzI4PXN0YXRpYyBpbmxpbmUgYm9vbCB6b25lX2lzX3pvbmVfZGV2aWNlKGNvbnN0IHN0cnVjdCB6b25lICp6b25lKVxcbi0tXFxuaW5jbHVkZS9saW51eC9tbXpvbmUuaC0xNzM0LS8qKlxcbmluY2x1ZGUvbGludXgvbW16b25lLmg6MTczNTogKiB6b25lX2lzX2NvbnRpZ3VvdXMgLSB0ZXN0IHdoZXRoZXIgYSB6b25lIGlzIGNvbnRpZ3VvdXNcXG5pbmNsdWRlL2xpbnV4L21tem9uZS5oLTE3MzYtICogQHpvbmU6IHRoZSB6b25lIHRvIHRlc3QuXFxuLS1cXG5pbmNsdWRlL2xpbnV4L21tem9uZS5oLTE3NDctICovXFxuaW5jbHVkZS9saW51eC9tbXpvbmUuaDoxNzQ4OnN0YXRpYyBpbmxpbmUgYm9vbCB6b25lX2lzX2NvbnRpZ3VvdXMoY29uc3Qgc3RydWN0IHpvbmUgKnpvbmUpXFxuaW5jbHVkZS9saW51eC9tbXpvbmUuaC0xNzQ5LXtcXG4tLVxcbm1tL3BhZ2VfYWxsb2MuaD0yMTQ9c3RhdGljIGlubGluZSBzdHJ1Y3QgcGFnZSAqcGFnZWJsb2NrX3Bmbl90b19wYWdlKHVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuLFxcbi0tXFxubW0vcGFnZV9hbGxvYy5oLTIxNi17XFxubW0vcGFnZV9hbGxvYy5oOjIxNzpcXHRpZiAoem9uZV9pc19jb250aWd1b3VzKHpvbmUpKVxcbm1tL3BhZ2VfYWxsb2MuaC0yMTgtXFx0XFx0cmV0dXJuIHBmbl90b19wYWdlKHN0YXJ0X3Bmbik7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTE0VDA3OjQzOjM2Ljg1NTIyMTMyWiIsIlNlcSI6MTEsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy44LWZsYXNoIiwiRHVyYXRpb24iOjY3OTkzODk5NTQsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSB0aG91Z2h0IHByb2Nlc3MsIGFzIHJlcXVlc3RlZDpcblxuKipJbnZlc3RpZ2F0aW5nIHRoZSBgcGFnZWJsb2NrX3Bmbl90b19wYWdlYCBDYWxsIFNpdGVzKipcblxuT2theSwgc28gSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhlIHVzYWdlIG9mIGBwYWdlYmxvY2tfcGZuX3RvX3BhZ2VgLiAgVGhpcyBmdW5jdGlvbiBpcyBjcnVjaWFsIGZvciBtZW1vcnkgbWFuYWdlbWVudCwgcGFydGljdWxhcmx5IGluIHJlbGF0aW9uIHRvIHBhZ2UgYmxvY2sgaGFuZGxpbmcuIE15IGltbWVkaWF0ZSB0aG91Z2h0IGlzLCBcIldoZXJlIGV4YWN0bHkgaXMgdGhpcyBmdW5jdGlvbiBiZWluZyB1c2VkPyBXaGF0IGNvZGUgaXMgY2FsbGluZyBpdCwgYW5kIHVuZGVyIHdoYXQgY2lyY3Vtc3RhbmNlcz9cIiBJIGtub3cgdGhhdCBgcGZuYCAoUGh5c2ljYWwgRnJhbWUgTnVtYmVyKSB0byBgcGFnZWAgbWFwcGluZyBpcyBmdW5kYW1lbnRhbCwgYnV0IEkgbmVlZCB0aGUgY29uY3JldGUgY29udGV4dCBvZiB0aGlzIHNwZWNpZmljIGZ1bmN0aW9uLiBMZXQncyBkZWx2ZSBpbnRvIHRoZSBjYWxsIHNpdGVzLiBUaW1lIHRvIHN0YXJ0IGRpZ2dpbmcgdGhyb3VnaCB0aGUgY29kZWJhc2UuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjEyNTM1LCJPdXRwdXRUb2tlbnMiOjIzLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjAsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMTRUMDc6NDM6NDMuNjU0NjEzNjc0WiIsIlNlcSI6MTIsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNzU5MjI5OTM1LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcInBhZ2VibG9ja19wZm5fdG9fcGFnZVwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJtbS9jb21wYWN0aW9uLmM9NzEzPWlzb2xhdGVfZnJlZXBhZ2VzX3JhbmdlKHN0cnVjdCBjb21wYWN0X2NvbnRyb2wgKmNjLFxcbi0tXFxubW0vY29tcGFjdGlvbi5jLTc0NS1cXG5tbS9jb21wYWN0aW9uLmM6NzQ2OlxcdFxcdGlmICghcGFnZWJsb2NrX3Bmbl90b19wYWdlKGJsb2NrX3N0YXJ0X3BmbixcXG5tbS9jb21wYWN0aW9uLmMtNzQ3LVxcdFxcdFxcdFxcdFxcdGJsb2NrX2VuZF9wZm4sIGNjLVxcdTAwM2V6b25lKSlcXG4tLVxcbm1tL2NvbXBhY3Rpb24uYz0xMzM3PWlzb2xhdGVfbWlncmF0ZXBhZ2VzX3JhbmdlKHN0cnVjdCBjb21wYWN0X2NvbnRyb2wgKmNjLCB1bnNpZ25lZCBsb25nIHN0YXJ0X3BmbixcXG4tLVxcbm1tL2NvbXBhY3Rpb24uYy0xMzU1LVxcbm1tL2NvbXBhY3Rpb24uYzoxMzU2OlxcdFxcdGlmICghcGFnZWJsb2NrX3Bmbl90b19wYWdlKGJsb2NrX3N0YXJ0X3BmbixcXG5tbS9jb21wYWN0aW9uLmMtMTM1Ny1cXHRcXHRcXHRcXHRcXHRibG9ja19lbmRfcGZuLCBjYy1cXHUwMDNlem9uZSkpXFxuLS1cXG5tbS9jb21wYWN0aW9uLmM9MTUwNz1mYXN0X2lzb2xhdGVfYXJvdW5kKHN0cnVjdCBjb21wYWN0X2NvbnRyb2wgKmNjLCB1bnNpZ25lZCBsb25nIHBmbilcXG4tLVxcbm1tL2NvbXBhY3Rpb24uYy0xNTIzLVxcbm1tL2NvbXBhY3Rpb24uYzoxNTI0OlxcdHBhZ2UgPSBwYWdlYmxvY2tfcGZuX3RvX3BhZ2Uoc3RhcnRfcGZuLCBlbmRfcGZuLCBjYy1cXHUwMDNlem9uZSk7XFxubW0vY29tcGFjdGlvbi5jLTE1MjUtXFx0aWYgKCFwYWdlKVxcbi0tXFxubW0vY29tcGFjdGlvbi5jPTE1NTM9c3RhdGljIHZvaWQgZmFzdF9pc29sYXRlX2ZyZWVwYWdlcyhzdHJ1Y3QgY29tcGFjdF9jb250cm9sICpjYylcXG4tLVxcbm1tL2NvbXBhY3Rpb24uYy0xNjk0LVxcdFxcdFxcdFxcdGlmIChjYy1cXHUwMDNlZGlyZWN0X2NvbXBhY3Rpb24gXFx1MDAyNlxcdTAwMjYgcGZuX3ZhbGlkKG1pbl9wZm4pKSB7XFxubW0vY29tcGFjdGlvbi5jOjE2OTU6XFx0XFx0XFx0XFx0XFx0cGFnZSA9IHBhZ2VibG9ja19wZm5fdG9fcGFnZShtaW5fcGZuLFxcbm1tL2NvbXBhY3Rpb24uYy0xNjk2LVxcdFxcdFxcdFxcdFxcdFxcdG1pbihwYWdlYmxvY2tfZW5kX3BmbihtaW5fcGZuKSxcXG4tLVxcbm1tL2NvbXBhY3Rpb24uYz0xNzI1PXN0YXRpYyB2b2lkIGlzb2xhdGVfZnJlZXBhZ2VzKHN0cnVjdCBjb21wYWN0X2NvbnRyb2wgKmNjKVxcbi0tXFxubW0vY29tcGFjdGlvbi5jLTE3NzUtXFxubW0vY29tcGFjdGlvbi5jOjE3NzY6XFx0XFx0cGFnZSA9IHBhZ2VibG9ja19wZm5fdG9fcGFnZShibG9ja19zdGFydF9wZm4sIGJsb2NrX2VuZF9wZm4sXFxubW0vY29tcGFjdGlvbi5jLTE3NzctXFx0XFx0XFx0XFx0XFx0XFx0XFx0XFx0XFx0em9uZSk7XFxuLS1cXG5tbS9jb21wYWN0aW9uLmM9MjA5MT1zdGF0aWMgaXNvbGF0ZV9taWdyYXRlX3QgaXNvbGF0ZV9taWdyYXRlcGFnZXMoc3RydWN0IGNvbXBhY3RfY29udHJvbCAqY2MpXFxuLS1cXG5tbS9jb21wYWN0aW9uLmMtMjEzOS1cXG5tbS9jb21wYWN0aW9uLmM6MjE0MDpcXHRcXHRwYWdlID0gcGFnZWJsb2NrX3Bmbl90b19wYWdlKGJsb2NrX3N0YXJ0X3BmbixcXG5tbS9jb21wYWN0aW9uLmMtMjE0MS1cXHRcXHRcXHRcXHRcXHRcXHRibG9ja19lbmRfcGZuLCBjYy1cXHUwMDNlem9uZSk7XFxuLS1cXG5tbS9wYWdlX2FsbG9jLmM9MTYwMD12b2lkIF9fbWVtaW5pdCBfX2ZyZWVfcGFnZXNfY29yZShzdHJ1Y3QgcGFnZSAqcGFnZSwgdW5zaWduZWQgaW50IG9yZGVyLFxcbi0tXFxubW0vcGFnZV9hbGxvYy5jLTE2NzEtICovXFxubW0vcGFnZV9hbGxvYy5jOjE2NzI6c3RydWN0IHBhZ2UgKl9fcGFnZWJsb2NrX3Bmbl90b19wYWdlKHVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuLFxcbm1tL3BhZ2VfYWxsb2MuYy0xNjczLVxcdFxcdFxcdFxcdCAgICAgdW5zaWduZWQgbG9uZyBlbmRfcGZuLCBzdHJ1Y3Qgem9uZSAqem9uZSlcXG4tLVxcbm1tL3BhZ2VfYWxsb2MuaD0xOTY9c3RhdGljIGlubGluZSBzdHJ1Y3QgcGFnZSAqZmluZF9idWRkeV9wYWdlX3BmbihzdHJ1Y3QgcGFnZSAqcGFnZSxcXG4tLVxcbm1tL3BhZ2VfYWxsb2MuaC0yMTAtXFxubW0vcGFnZV9hbGxvYy5oOjIxMTpleHRlcm4gc3RydWN0IHBhZ2UgKl9fcGFnZWJsb2NrX3Bmbl90b19wYWdlKHVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuLFxcbm1tL3BhZ2VfYWxsb2MuaC0yMTItXFx0XFx0XFx0XFx0dW5zaWduZWQgbG9uZyBlbmRfcGZuLCBzdHJ1Y3Qgem9uZSAqem9uZSk7XFxubW0vcGFnZV9hbGxvYy5oLTIxMy1cXG5tbS9wYWdlX2FsbG9jLmg6MjE0OnN0YXRpYyBpbmxpbmUgc3RydWN0IHBhZ2UgKnBhZ2VibG9ja19wZm5fdG9fcGFnZSh1bnNpZ25lZCBsb25nIHN0YXJ0X3BmbixcXG5tbS9wYWdlX2FsbG9jLmgtMjE1LVxcdFxcdFxcdFxcdHVuc2lnbmVkIGxvbmcgZW5kX3Bmbiwgc3RydWN0IHpvbmUgKnpvbmUpXFxuLS1cXG5tbS9wYWdlX2FsbG9jLmgtMjE5LVxcbm1tL3BhZ2VfYWxsb2MuaDoyMjA6XFx0cmV0dXJuIF9fcGFnZWJsb2NrX3Bmbl90b19wYWdlKHN0YXJ0X3BmbiwgZW5kX3Bmbiwgem9uZSk7XFxubW0vcGFnZV9hbGxvYy5oLTIyMS19XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTE0VDA3OjQzOjQ1LjQxMzg0ODQ1OVoiLCJTZXEiOjEzLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuOC1mbGFzaCIsIkR1cmF0aW9uIjoxNjY4NjEyNDk0MywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipNeSBBbmFseXNpcyBvZiBgcGFnZWJsb2NrX3Bmbl90b19wYWdlYCBpbiBNZW1vcnkgQ29tcGFjdGlvbioqXG5cbk9rYXksIHNvIEknbSBmb2N1c2luZyBvbiBgcGFnZWJsb2NrX3Bmbl90b19wYWdlYCwgYW5kIGl0J3MgY2xlYXIgdGhpcyBmdW5jdGlvbiBpcyBhIGtleSBwbGF5ZXIgaW4gbWVtb3J5IGNvbXBhY3Rpb24sIHNwZWNpZmljYWxseSB3aXRoaW4gYG1tL2NvbXBhY3Rpb24uY2AuIEkgbmVlZCB0byB1bmRlcnN0YW5kIGl0cyBpbXBhY3QuIEl0J3MgdXNlZCBpbiBhbGwgdGhlIHR5cGljYWwgc2NlbmFyaW9zOiBkdXJpbmcgYWxsb2NhdGlvbnMsIHRyaWdnZXJlZCBieSBkaXJlY3QgY29tcGFjdGlvbiwga2NvbXBhY3RkLCBvciBldmVuIHRob3NlIHN5c2ZzIHRyaWdnZXJzIGxpa2UgYC9wcm9jL3N5cy92bS9jb21wYWN0X21lbW9yeWAuIFRoYXTigJlzIGEgbG90IG9mIHVzYWdlIVxuXG5Ob3csIHRoZSBjb3JlIG9mIGl0IOKAkyB3aGF0ICpkb2VzKiBpdCBhY3R1YWxseSBkbz8gSXQgc2VlbXMgdGhlIGZ1bmN0aW9uJ3MgYmVoYXZpb3IgZGVwZW5kcyBvbiB3aGV0aGVyIHRoZSB6b25lIGlzIGNvbnRpZ3VvdXMuIElmIGB6b25lX2lzX2NvbnRpZ3VvdXMoem9uZSlgIGlzIHRydWUsIGl0IGRvZXMgYSBkaXJlY3QgbWFwcGluZyB1c2luZyBgcGZuX3RvX3BhZ2Uoc3RhcnRfcGZuKWAuIFRoYXQncyBhIHBlcmZvcm1hbmNlIG9wdGltaXphdGlvbiwgSSdtIHN1cmUuIEkgYW0gbm90IHNlZWluZyBhbnkgZXh0cmEgY29kZSBwYXRocyBpZiB0aGUgcGFnZXMgYXJlIGNvbnRpZ3VvdXMuXG5cbkkgbmVlZCB0byB1bmRlcnN0YW5kIHdoYXQgY2hhbmdlZCB3aXRoIHRoaXMgY29tbWl0LiBJdCdzIHRpbWUgdG8gZGlnIGludG8gdGhlIGdpdCBsb2dzIHRvIGZpZ3VyZSBvdXQgdGhlIHJlYXNvbmluZyBiZWhpbmQgdGhpcywgYW5kIGdldCBhIGJldHRlciB1bmRlcnN0YW5kaW5nIG9mIHRoZSBkZXRhaWxzIGFuZCBtb3RpdmF0aW9uIGJlaGluZCB0aGlzLiBMZXQncyBzZWUgd2hhdCdzIGFjdHVhbGx5IGdvaW5nIG9uLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxMzc0NSwiT3V0cHV0VG9rZW5zIjoyMiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjE1NCwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0xNFQwNzo0NDowMi4wOTk5NzU5NjJaIiwiU2VxIjoxNCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE1NjAwMTY0NTgsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwicGFnZXNfd2l0aF9vbmxpbmVfbWVtbWFwXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIkRvY3VtZW50YXRpb24vbW0vcGh5c2ljYWxfbWVtb3J5LnJzdD0zNzQ9R2VuZXJhbFxcbi0tXFxuRG9jdW1lbnRhdGlvbi9tbS9waHlzaWNhbF9tZW1vcnkucnN0LTQ4Mi1cXG5Eb2N1bWVudGF0aW9uL21tL3BoeXNpY2FsX21lbW9yeS5yc3Q6NDgzOmBgcGFnZXNfd2l0aF9vbmxpbmVfbWVtbWFwYGBcXG5Eb2N1bWVudGF0aW9uL21tL3BoeXNpY2FsX21lbW9yeS5yc3QtNDg0LSAgUGFnZXMgd2l0aGluIHRoZSB6b25lIHRoYXQgaGF2ZSBhbiBvbmxpbmUgbWVtb3J5IG1hcDogcHJlc2VudCBwYWdlcyBhbmRcXG4tLVxcbkRvY3VtZW50YXRpb24vbW0vcGh5c2ljYWxfbWVtb3J5LnJzdC00ODYtICBgYHBmbl90b19vbmxpbmVfcGFnZSgpYGAgc3VjY2VlZHMuIFNlZSB0aGUgY29tbWVudCBmb3JcXG5Eb2N1bWVudGF0aW9uL21tL3BoeXNpY2FsX21lbW9yeS5yc3Q6NDg3OiAgYGBwYWdlc193aXRoX29ubGluZV9tZW1tYXBgYCBpbiBgYGluY2x1ZGUvbGludXgvbW16b25lLmhgYCBmb3IgbW9yZSBkZXRhaWxzLlxcbkRvY3VtZW50YXRpb24vbW0vcGh5c2ljYWxfbWVtb3J5LnJzdC00ODgtXFxuLS1cXG5pbmNsdWRlL2xpbnV4L21tem9uZS5oPTk3OT1zdHJ1Y3Qgem9uZSB7XFxuLS1cXG5pbmNsdWRlL2xpbnV4L21tem9uZS5oLTEwNDUtXFx0ICpcXG5pbmNsdWRlL2xpbnV4L21tem9uZS5oOjEwNDY6XFx0ICogcGFnZXNfd2l0aF9vbmxpbmVfbWVtbWFwIHRyYWNrcyBwYWdlcyB3aXRoaW4gdGhlIHpvbmUgdGhhdCBoYXZlXFxuaW5jbHVkZS9saW51eC9tbXpvbmUuaC0xMDQ3LVxcdCAqIGFuIG9ubGluZSBtZW1vcnkgbWFwOiBwcmVzZW50IHBhZ2VzIGFuZCBtZW1vcnkgaG9sZXMgd2hvc2VcXG5pbmNsdWRlL2xpbnV4L21tem9uZS5oLTEwNDgtXFx0ICogbWVtb3J5IG1hcCBoYXMgYmVlbiBpbml0aWFsaXplZCBhbmQgcGZuX3RvX29ubGluZV9wYWdlKClcXG5pbmNsdWRlL2xpbnV4L21tem9uZS5oOjEwNDk6XFx0ICogc3VjY2VlZHMuIFdoZW4gc3Bhbm5lZF9wYWdlcyA9PSBwYWdlc193aXRoX29ubGluZV9tZW1tYXAsXFxuaW5jbHVkZS9saW51eC9tbXpvbmUuaC0xMDUwLVxcdCAqIHBmbl90b19wYWdlKCkgY2FuIGJlIHBlcmZvcm1lZCB3aXRob3V0IGZ1cnRoZXIgY2hlY2tzIG9uIGFueVxcbi0tXFxuaW5jbHVkZS9saW51eC9tbXpvbmUuaC0xMTA1LVxcdHVuc2lnbmVkIGxvbmdcXHRcXHRwcmVzZW50X3BhZ2VzO1xcbmluY2x1ZGUvbGludXgvbW16b25lLmg6MTEwNjpcXHR1bnNpZ25lZCBsb25nXFx0XFx0cGFnZXNfd2l0aF9vbmxpbmVfbWVtbWFwO1xcbmluY2x1ZGUvbGludXgvbW16b25lLmgtMTEwNy0jaWYgZGVmaW5lZChDT05GSUdfTUVNT1JZX0hPVFBMVUcpXFxuLS1cXG5pbmNsdWRlL2xpbnV4L21tem9uZS5oPTE3NTM9c3RhdGljIGlubGluZSB2b2lkIHNldF96b25lX2NvbnRpZ3VvdXMoc3RydWN0IHpvbmUgKnpvbmUpXFxuLS1cXG5pbmNsdWRlL2xpbnV4L21tem9uZS5oLTE3NTYtXFx0XFx0cmV0dXJuO1xcbmluY2x1ZGUvbGludXgvbW16b25lLmg6MTc1NzpcXHRpZiAoem9uZS1cXHUwMDNlc3Bhbm5lZF9wYWdlcyA9PSB6b25lLVxcdTAwM2VwYWdlc193aXRoX29ubGluZV9tZW1tYXApXFxuaW5jbHVkZS9saW51eC9tbXpvbmUuaC0xNzU4LVxcdFxcdFdSSVRFX09OQ0Uoem9uZS1cXHUwMDNlY29udGlndW91cywgdHJ1ZSk7XFxuLS1cXG5tbS9tZW1vcnlfaG90cGx1Zy5jPTEwNDU9dm9pZCBhZGp1c3RfcHJlc2VudF9wYWdlX2NvdW50KHN0cnVjdCBwYWdlICpwYWdlLCBzdHJ1Y3QgbWVtb3J5X2dyb3VwICpncm91cCxcXG4tLVxcbm1tL21lbW9yeV9ob3RwbHVnLmMtMTA1Ny1cXHR6b25lLVxcdTAwM2VwcmVzZW50X3BhZ2VzICs9IG5yX3BhZ2VzO1xcbm1tL21lbW9yeV9ob3RwbHVnLmM6MTA1ODpcXHR6b25lLVxcdTAwM2VwYWdlc193aXRoX29ubGluZV9tZW1tYXAgKz0gbnJfcGFnZXM7XFxubW0vbWVtb3J5X2hvdHBsdWcuYy0xMDU5LVxcdHpvbmUtXFx1MDAzZXpvbmVfcGdkYXQtXFx1MDAzZW5vZGVfcHJlc2VudF9wYWdlcyArPSBucl9wYWdlcztcXG4tLVxcbm1tL21tX2luaXQuYz05MzI9c3RhdGljIHZvaWQgX19pbml0IG1lbW1hcF9pbml0X3pvbmVfcmFuZ2Uoc3RydWN0IHpvbmUgKnpvbmUsXFxuLS1cXG5tbS9tbV9pbml0LmMtOTQ5LVxcdFxcdFxcdCAgZmFsc2UpO1xcbm1tL21tX2luaXQuYzo5NTA6XFx0em9uZS1cXHUwMDNlcGFnZXNfd2l0aF9vbmxpbmVfbWVtbWFwICs9IGVuZF9wZm4gLSBzdGFydF9wZm47XFxubW0vbW1faW5pdC5jLTk1MS1cXG4tLVxcbm1tL21tX2luaXQuYy05NjItXFx0XFx0XFx0XFx0XFx0ICAgICAgIHpvbmVfaWQsIG5pZCk7XFxubW0vbW1faW5pdC5jOjk2MzpcXHRcXHR6b25lLVxcdTAwM2VwYWdlc193aXRoX29ubGluZV9tZW1tYXAgKz0gcGdjbnQ7XFxubW0vbW1faW5pdC5jLTk2NC1cXHR9XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTE0VDA3OjQ0OjAzLjY1OTk5ODE1WiIsIlNlcSI6MTUsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy44LWZsYXNoIiwiRHVyYXRpb24iOjI1NjUwNDU2ODQsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIE1lbW9yeSBIb3RwbHVnIGluIHRoZSBMaW51eCBLZXJuZWwqKlxuXG5Pa2F5LCBzbyBJIG5lZWQgdG8gdW5kZXJzdGFuZCB3aGF0IGNoYW5nZWQuIFNpbmNlIEkgZG9uJ3QgaGF2ZSBkaXJlY3QgYWNjZXNzIHRvIGBnaXQgbG9nYCBoZXJlLCBJJ2xsIG5lZWQgdG8gZmlndXJlIG91dCB0aGUgYmVzdCB3YXkgdG8gZ2V0IHRoaXMgaW5mb3JtYXRpb24uIFRoZSBkaWZmIG9yLCBmYWlsaW5nIHRoYXQsIGRpcmVjdGx5IHJlYWRpbmcgdGhlIGNvbW1pdCB3aWxsIGhhdmUgdG8gZG8uIEkgbmVlZCB0byBnZXQgaW50byB0aGUgZGV0YWlscyB0byB1bmRlcnN0YW5kIHdoYXQgY2hhbmdlcyB3ZXJlIG1hZGUuXG5cblRoZSBhcmVhIEkgbmVlZCB0byBmb2N1cyBvbiBpcyBgbW0vbWVtb3J5X2hvdHBsdWcuY2AuIFNwZWNpZmljYWxseSwgSSdtIGludGVyZXN0ZWQgaW4gdGhlIGZ1bmN0aW9ucyBhcm91bmQgbWVtb3J5IHNlY3Rpb24gbWFuYWdlbWVudCBhbmQgaG90cGx1ZyBvcGVyYXRpb25zLiBUaGF0IG1lYW5zIEkgbmVlZCB0byByZWFsbHkgbG9vayBhdCBob3cgdGhlc2UgZnVuY3Rpb25zIGhhbmRsZSBwb3RlbnRpYWwgb3ZlcmxhcHMsIGFuZCBhbHNvIGhvdyB0aGV5IGRldGVybWluZSBzZWN0aW9uIHNpemVzIGFuZCBob3cgdGhleSByZW1vdmUgcGZuIHJhbmdlcy4gVGhlIGtleSBmdW5jdGlvbnMgdG8gbG9vayBhdCBhcmUgYHN1YnNlY3Rpb25fb3ZlcmxhcHNfem9uZWAsIGBmaW5kX3NtYWxsZXN0X3NlY3Rpb25fcGZuYCwgYGZpbmRfYmlnZ2VzdF9zZWN0aW9uX3BmbmAsIGBzaHJpbmtfem9uZV9zcGFuYCwgYW5kIGByZW1vdmVfcGZuX3JhbmdlX2Zyb21fem9uZWAuIE15IGdvYWwgaXMgdG8gdW5kZXJzdGFuZCBob3cgdGhlIGhvdHBsdWcgY29kZSBpcyBoYW5kbGluZyBtZW1vcnkgc2VjdGlvbnMsIGZpbmRpbmcgdGhlIHNpemUgb2YgbWVtb3J5IHJlZ2lvbnMsIGFuZCBob3cgdGhleSBzaHJpbmsuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjE1MDYxLCJPdXRwdXRUb2tlbnMiOjM2LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTA1LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTE0VDA3OjQ0OjA2LjIyNTA0NTk0M1oiLCJTZXEiOjE2LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyNDc0MzAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwibW0vbWVtb3J5X2hvdHBsdWcuY1wiLFxuICBcIkZpcnN0TGluZVwiOiA0MjUsXG4gIFwiTGluZUNvdW50XCI6IDkwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIiA0MjU6XFx0XFx0cmV0dXJuIGVycjtcXG4gNDI2OlxcdH1cXG4gNDI3OlxcdFxcbiA0Mjg6XFx0c3RhdGljIGJvb2wgc3Vic2VjdGlvbl9vdmVybGFwc196b25lKHVuc2lnbmVkIGxvbmcgcGZuLCBzdHJ1Y3Qgem9uZSAqem9uZSlcXG4gNDI5OlxcdHtcXG4gNDMwOlxcdFxcdGNvbnN0IHVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuID0gQUxJR05fRE9XTihwZm4sIFBBR0VTX1BFUl9TVUJTRUNUSU9OKTtcXG4gNDMxOlxcdFxcdGNvbnN0IHVuc2lnbmVkIGxvbmcgZW5kX3BmbiA9IHN0YXJ0X3BmbiArIFBBR0VTX1BFUl9TVUJTRUNUSU9OIC0gMTtcXG4gNDMyOlxcdFxcbiA0MzM6XFx0XFx0LyogQWxsIHBhZ2VzIGluIGEgc3Vic2VjdGlvbiBhcmUgZWl0aGVyIG9ubGluZSBvciBvZmZsaW5lLiAqL1xcbiA0MzQ6XFx0XFx0aWYgKHVubGlrZWx5KCFwZm5fdG9fb25saW5lX3BhZ2Uoc3RhcnRfcGZuKSkpXFxuIDQzNTpcXHRcXHRcXHRyZXR1cm4gZmFsc2U7XFxuIDQzNjpcXHRcXG4gNDM3OlxcdFxcdC8qIENoZWNraW5nIHN0YXJ0K2VuZCBpcyBzdWZmaWNpZW50LiAqL1xcbiA0Mzg6XFx0XFx0cmV0dXJuIHpvbmUgPT0gcGFnZV96b25lKHBmbl90b19wYWdlKHN0YXJ0X3BmbikpIHx8XFxuIDQzOTpcXHRcXHQgICAgICAgem9uZSA9PSBwYWdlX3pvbmUocGZuX3RvX3BhZ2UoZW5kX3BmbikpO1xcbiA0NDA6XFx0fVxcbiA0NDE6XFx0XFxuIDQ0MjpcXHQvKiBmaW5kIHRoZSBzbWFsbGVzdCB2YWxpZCBwZm4gaW4gdGhlIHJhbmdlIFtzdGFydF9wZm4sIGVuZF9wZm4pICovXFxuIDQ0MzpcXHRzdGF0aWMgdW5zaWduZWQgbG9uZyBmaW5kX3NtYWxsZXN0X3NlY3Rpb25fcGZuKHN0cnVjdCB6b25lICp6b25lLFxcbiA0NDQ6XFx0XFx0XFx0dW5zaWduZWQgbG9uZyBzdGFydF9wZm4sIHVuc2lnbmVkIGxvbmcgZW5kX3BmbilcXG4gNDQ1OlxcdHtcXG4gNDQ2OlxcdFxcdGZvciAoOyBzdGFydF9wZm4gXFx1MDAzYyBlbmRfcGZuOyBzdGFydF9wZm4gKz0gUEFHRVNfUEVSX1NVQlNFQ1RJT04pIHtcXG4gNDQ3OlxcdFxcdFxcdGlmIChzdWJzZWN0aW9uX292ZXJsYXBzX3pvbmUoc3RhcnRfcGZuLCB6b25lKSlcXG4gNDQ4OlxcdFxcdFxcdFxcdHJldHVybiBzdGFydF9wZm47XFxuIDQ0OTpcXHRcXHR9XFxuIDQ1MDpcXHRcXHRyZXR1cm4gMDtcXG4gNDUxOlxcdH1cXG4gNDUyOlxcdFxcbiA0NTM6XFx0LyogZmluZCB0aGUgYmlnZ2VzdCB2YWxpZCBwZm4gaW4gdGhlIHJhbmdlIFtzdGFydF9wZm4sIGVuZF9wZm4pLiAqL1xcbiA0NTQ6XFx0c3RhdGljIHVuc2lnbmVkIGxvbmcgZmluZF9iaWdnZXN0X3NlY3Rpb25fcGZuKHN0cnVjdCB6b25lICp6b25lLFxcbiA0NTU6XFx0XFx0XFx0dW5zaWduZWQgbG9uZyBzdGFydF9wZm4sIHVuc2lnbmVkIGxvbmcgZW5kX3BmbilcXG4gNDU2OlxcdHtcXG4gNDU3OlxcdFxcdGZvciAoOyBlbmRfcGZuIFxcdTAwM2Ugc3RhcnRfcGZuOyBlbmRfcGZuIC09IFBBR0VTX1BFUl9TVUJTRUNUSU9OKSB7XFxuIDQ1ODpcXHRcXHRcXHRpZiAoc3Vic2VjdGlvbl9vdmVybGFwc196b25lKGVuZF9wZm4gLSAxLCB6b25lKSlcXG4gNDU5OlxcdFxcdFxcdFxcdHJldHVybiBlbmRfcGZuIC0gMTtcXG4gNDYwOlxcdFxcdH1cXG4gNDYxOlxcdFxcdHJldHVybiAwO1xcbiA0NjI6XFx0fVxcbiA0NjM6XFx0XFxuIDQ2NDpcXHRzdGF0aWMgdm9pZCBzaHJpbmtfem9uZV9zcGFuKHN0cnVjdCB6b25lICp6b25lLCB1bnNpZ25lZCBsb25nIHN0YXJ0X3BmbixcXG4gNDY1OlxcdFxcdFxcdFxcdCAgICAgdW5zaWduZWQgbG9uZyBlbmRfcGZuKVxcbiA0NjY6XFx0e1xcbiA0Njc6XFx0XFx0dW5zaWduZWQgbG9uZyBwZm47XFxuIDQ2ODpcXHRcXG4gNDY5OlxcdFxcdGlmICh6b25lLVxcdTAwM2V6b25lX3N0YXJ0X3BmbiA9PSBzdGFydF9wZm4pIHtcXG4gNDcwOlxcdFxcdFxcdC8qXFxuIDQ3MTpcXHRcXHRcXHQgKiBJZiB0aGUgc2VjdGlvbiBpcyBzbWFsbGVzdCBzZWN0aW9uIGluIHRoZSB6b25lLCBpdCBuZWVkXFxuIDQ3MjpcXHRcXHRcXHQgKiBzaHJpbmsgem9uZS1cXHUwMDNlem9uZV9zdGFydF9wZm4gYW5kIHpvbmUtXFx1MDAzZXpvbmVfc3Bhbm5lZF9wYWdlcy5cXG4gNDczOlxcdFxcdFxcdCAqIEluIHRoaXMgY2FzZSwgd2UgZmluZCBzZWNvbmQgc21hbGxlc3QgdmFsaWQgbWVtX3NlY3Rpb25cXG4gNDc0OlxcdFxcdFxcdCAqIGZvciBzaHJpbmtpbmcgem9uZS5cXG4gNDc1OlxcdFxcdFxcdCAqL1xcbiA0NzY6XFx0XFx0XFx0cGZuID0gZmluZF9zbWFsbGVzdF9zZWN0aW9uX3Bmbih6b25lLCBlbmRfcGZuLFxcbiA0Nzc6XFx0XFx0XFx0XFx0XFx0XFx0XFx0em9uZV9lbmRfcGZuKHpvbmUpKTtcXG4gNDc4OlxcdFxcdFxcdGlmIChwZm4pIHtcXG4gNDc5OlxcdFxcdFxcdFxcdHpvbmUtXFx1MDAzZXNwYW5uZWRfcGFnZXMgPSB6b25lX2VuZF9wZm4oem9uZSkgLSBwZm47XFxuIDQ4MDpcXHRcXHRcXHRcXHR6b25lLVxcdTAwM2V6b25lX3N0YXJ0X3BmbiA9IHBmbjtcXG4gNDgxOlxcdFxcdFxcdH0gZWxzZSB7XFxuIDQ4MjpcXHRcXHRcXHRcXHR6b25lLVxcdTAwM2V6b25lX3N0YXJ0X3BmbiA9IDA7XFxuIDQ4MzpcXHRcXHRcXHRcXHR6b25lLVxcdTAwM2VzcGFubmVkX3BhZ2VzID0gMDtcXG4gNDg0OlxcdFxcdFxcdH1cXG4gNDg1OlxcdFxcdH0gZWxzZSBpZiAoem9uZV9lbmRfcGZuKHpvbmUpID09IGVuZF9wZm4pIHtcXG4gNDg2OlxcdFxcdFxcdC8qXFxuIDQ4NzpcXHRcXHRcXHQgKiBJZiB0aGUgc2VjdGlvbiBpcyBiaWdnZXN0IHNlY3Rpb24gaW4gdGhlIHpvbmUsIGl0IG5lZWRcXG4gNDg4OlxcdFxcdFxcdCAqIHNocmluayB6b25lLVxcdTAwM2VzcGFubmVkX3BhZ2VzLlxcbiA0ODk6XFx0XFx0XFx0ICogSW4gdGhpcyBjYXNlLCB3ZSBmaW5kIHNlY29uZCBiaWdnZXN0IHZhbGlkIG1lbV9zZWN0aW9uIGZvclxcbiA0OTA6XFx0XFx0XFx0ICogc2hyaW5raW5nIHpvbmUuXFxuIDQ5MTpcXHRcXHRcXHQgKi9cXG4gNDkyOlxcdFxcdFxcdHBmbiA9IGZpbmRfYmlnZ2VzdF9zZWN0aW9uX3Bmbih6b25lLCB6b25lLVxcdTAwM2V6b25lX3N0YXJ0X3BmbixcXG4gNDkzOlxcdFxcdFxcdFxcdFxcdFxcdCAgICAgICBzdGFydF9wZm4pO1xcbiA0OTQ6XFx0XFx0XFx0aWYgKHBmbilcXG4gNDk1OlxcdFxcdFxcdFxcdHpvbmUtXFx1MDAzZXNwYW5uZWRfcGFnZXMgPSBwZm4gLSB6b25lLVxcdTAwM2V6b25lX3N0YXJ0X3BmbiArIDE7XFxuIDQ5NjpcXHRcXHRcXHRlbHNlIHtcXG4gNDk3OlxcdFxcdFxcdFxcdHpvbmUtXFx1MDAzZXpvbmVfc3RhcnRfcGZuID0gMDtcXG4gNDk4OlxcdFxcdFxcdFxcdHpvbmUtXFx1MDAzZXNwYW5uZWRfcGFnZXMgPSAwO1xcbiA0OTk6XFx0XFx0XFx0fVxcbiA1MDA6XFx0XFx0fVxcbiA1MDE6XFx0fVxcbiA1MDI6XFx0XFxuIDUwMzpcXHRzdGF0aWMgdm9pZCB1cGRhdGVfcGdkYXRfc3BhbihzdHJ1Y3QgcGdsaXN0X2RhdGEgKnBnZGF0KVxcbiA1MDQ6XFx0e1xcbiA1MDU6XFx0XFx0dW5zaWduZWQgbG9uZyBub2RlX3N0YXJ0X3BmbiA9IDAsIG5vZGVfZW5kX3BmbiA9IDA7XFxuIDUwNjpcXHRcXHRzdHJ1Y3Qgem9uZSAqem9uZTtcXG4gNTA3OlxcdFxcbiA1MDg6XFx0XFx0Zm9yICh6b25lID0gcGdkYXQtXFx1MDAzZW5vZGVfem9uZXM7XFxuIDUwOTpcXHRcXHQgICAgIHpvbmUgXFx1MDAzYyBwZ2RhdC1cXHUwMDNlbm9kZV96b25lcyArIE1BWF9OUl9aT05FUzsgem9uZSsrKSB7XFxuIDUxMDpcXHRcXHRcXHR1bnNpZ25lZCBsb25nIGVuZF9wZm4gPSB6b25lX2VuZF9wZm4oem9uZSk7XFxuIDUxMTpcXHRcXG4gNTEyOlxcdFxcdFxcdC8qIE5vIG5lZWQgdG8gbG9jayB0aGUgem9uZXMsIHRoZXkgY2FuJ3QgY2hhbmdlLiAqL1xcbiA1MTM6XFx0XFx0XFx0aWYgKCF6b25lLVxcdTAwM2VzcGFubmVkX3BhZ2VzKVxcbiA1MTQ6XFx0XFx0XFx0XFx0Y29udGludWU7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTE0VDA3OjQ0OjA2LjIyNTI5NTU5M1oiLCJTZXEiOjE3LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuOC1mbGFzaCIsIkR1cmF0aW9uIjo0MjY5NzU2MjY5LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgbXkgc3VtbWFyeSwgYXMgaWYgSSB3ZXJlIHRoaW5raW5nIHRoZXNlIHRob3VnaHRzOlxuXG4qKkFuYWx5emluZyB0aGUgTWVtb3J5IEFsbG9jYXRpb24gQ2hhbmdlcyBpbiBgZHJpdmVycy9iYXNlL21lbW9yeS5jYCoqXG5cbk9rYXksIHNvIHdlJ3JlIGxvb2tpbmcgYXQgdGhlIG1lbW9yeSBhbGxvY2F0aW9uIGNoYW5nZXMsIGFuZCB0byBnZXQgYSByZWFsbHkgZ29vZCBoYW5kbGUgb24gdGhlbSwgSSBuZWVkIHRvIGRpZyBpbnRvIHRoZSBjb2RlLiBTcGVjaWZpY2FsbHksIGxldCdzIHRhcmdldCBgZHJpdmVycy9iYXNlL21lbW9yeS5jYCBhbmQgZm9jdXMgb24gbGluZXMgMjUwIHRocm91Z2ggMzM1LiBUaGF0J3MgdXN1YWxseSB3aGVyZSB0aGUgY29yZSBhbGxvY2F0aW9uIGFuZCBkZWFsbG9jYXRpb24gZnVuY3Rpb25zIGxpdmUsIG9yIGF0IGxlYXN0IHRoZSBjcml0aWNhbCBjYWxscyB0aGF0IGhhdmUgYmVlbiBtb2RpZmllZCB3aWxsIGJlLiBCeSBleGFtaW5pbmcgdGhhdCBzZWN0aW9uLCBJIHNob3VsZCBiZSBhYmxlIHRvIGlkZW50aWZ5IGV4YWN0bHkgd2hhdCBoYXMgYmVlbiBhbHRlcmVkIGluIHRoZSBsb2dpYywgaG93IHRoZSBuZXcgYXBwcm9hY2ggd29ya3MsIGFuZCwgY3J1Y2lhbGx5LCBob3cgdGhvc2UgZnVuY3Rpb25zIGFyZSBiZWluZyBjYWxsZWQgd2l0aGluIHRoZSBicm9hZGVyIGZyYW1ld29yayBvZiB0aGUgZHJpdmVyIGNvZGUuIEl0J3MgdGhlIGJlc3Qgd2F5IHRvIHVuZGVyc3RhbmQgdGhlIGltcGFjdCBvZiBhbnkgY2hhbmdlcyB0byB0aGUgbWVtb3J5IG1hbmFnZW1lbnQuIEkgc3VzcGVjdCBpdCBtaWdodCBoYXZlIHNvbWV0aGluZyB0byBkbyB3aXRoIHRoZSByZWNlbnQgcGVyZm9ybWFuY2UgaXNzdWVzLCBzbyBhIGZvY3VzZWQgcmVhZCBoZXJlIHNob3VsZCBpbGx1bWluYXRlIHdoYXQgaGFzIGJlZW4gZG9uZSBhbmQgaG9wZWZ1bGx5IGhlbHAgdG8gaXNvbGF0ZSB0aGUgcHJvYmxlbS5cblxuXG4iLCJJbnB1dFRva2VucyI6MTY5MDYsIk91dHB1dFRva2VucyI6MzUsIk91dHB1dFRob3VnaHRzVG9rZW5zIjozNSwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTE0VDA3OjQ0OjEwLjQ5NTA1NzkzMloiLCJTZXEiOjE4LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMjI2MzAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwiZHJpdmVycy9iYXNlL21lbW9yeS5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDI1MCxcbiAgXCJMaW5lQ291bnRcIjogODVcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiIDI1MDpcXHRcXHQgKiB0aGVpciBpbml0aWFsaXphdGlvbiBhbmQgYWNjb3VudGluZyBhdCBtZW1vcnkgb25saW5pbmcvb2ZmbGluaW5nXFxuIDI1MTpcXHRcXHQgKiBzdGFnZSBoZWxwcyB0byBrZWVwIGFjY291bnRpbmcgZWFzaWVyIHRvIGZvbGxvdyAtIGUuZyB2bWVtbWFwc1xcbiAyNTI6XFx0XFx0ICogYmVsb25nIHRvIHRoZSBzYW1lIHpvbmUgYXMgdGhlIG1lbW9yeSB0aGV5IGJhY2tlZC5cXG4gMjUzOlxcdFxcdCAqL1xcbiAyNTQ6XFx0XFx0aWYgKG1lbS1cXHUwMDNlYWx0bWFwKVxcbiAyNTU6XFx0XFx0XFx0bnJfdm1lbW1hcF9wYWdlcyA9IG1lbS1cXHUwMDNlYWx0bWFwLVxcdTAwM2VmcmVlO1xcbiAyNTY6XFx0XFxuIDI1NzpcXHRcXHRtZW1faG90cGx1Z19iZWdpbigpO1xcbiAyNTg6XFx0XFx0Y2xlYXJfem9uZV9jb250aWd1b3VzKHpvbmUpO1xcbiAyNTk6XFx0XFx0aWYgKG5yX3ZtZW1tYXBfcGFnZXMpIHtcXG4gMjYwOlxcdFxcdFxcdHJldCA9IG1ocF9pbml0X21lbW1hcF9vbl9tZW1vcnkoc3RhcnRfcGZuLCBucl92bWVtbWFwX3BhZ2VzLCB6b25lKTtcXG4gMjYxOlxcdFxcdFxcdGlmIChyZXQpXFxuIDI2MjpcXHRcXHRcXHRcXHRnb3RvIG91dDtcXG4gMjYzOlxcdFxcdH1cXG4gMjY0OlxcdFxcbiAyNjU6XFx0XFx0cmV0ID0gb25saW5lX3BhZ2VzKHN0YXJ0X3BmbiArIG5yX3ZtZW1tYXBfcGFnZXMsXFxuIDI2NjpcXHRcXHRcXHRcXHQgICBucl9wYWdlcyAtIG5yX3ZtZW1tYXBfcGFnZXMsIHpvbmUsIG1lbS1cXHUwMDNlZ3JvdXApO1xcbiAyNjc6XFx0XFx0aWYgKHJldCkge1xcbiAyNjg6XFx0XFx0XFx0aWYgKG5yX3ZtZW1tYXBfcGFnZXMpXFxuIDI2OTpcXHRcXHRcXHRcXHRtaHBfZGVpbml0X21lbW1hcF9vbl9tZW1vcnkoc3RhcnRfcGZuLCBucl92bWVtbWFwX3BhZ2VzKTtcXG4gMjcwOlxcdFxcdFxcdGdvdG8gb3V0O1xcbiAyNzE6XFx0XFx0fVxcbiAyNzI6XFx0XFxuIDI3MzpcXHRcXHQvKlxcbiAyNzQ6XFx0XFx0ICogQWNjb3VudCBvbmNlIG9ubGluaW5nIHN1Y2NlZWRlZC4gSWYgdGhlIHpvbmUgd2FzIHVucG9wdWxhdGVkLCBpdCBpc1xcbiAyNzU6XFx0XFx0ICogbm93IGFscmVhZHkgcHJvcGVybHkgcG9wdWxhdGVkLlxcbiAyNzY6XFx0XFx0ICovXFxuIDI3NzpcXHRcXHRpZiAobnJfdm1lbW1hcF9wYWdlcylcXG4gMjc4OlxcdFxcdFxcdGFkanVzdF9wcmVzZW50X3BhZ2VfY291bnQocGZuX3RvX3BhZ2Uoc3RhcnRfcGZuKSwgbWVtLVxcdTAwM2Vncm91cCxcXG4gMjc5OlxcdFxcdFxcdFxcdFxcdFxcdCAgbnJfdm1lbW1hcF9wYWdlcyk7XFxuIDI4MDpcXHRcXG4gMjgxOlxcdFxcdG1lbS1cXHUwMDNlem9uZSA9IHpvbmU7XFxuIDI4MjpcXHRvdXQ6XFxuIDI4MzpcXHRcXHRzZXRfem9uZV9jb250aWd1b3VzKHpvbmUpO1xcbiAyODQ6XFx0XFx0bWVtX2hvdHBsdWdfZG9uZSgpO1xcbiAyODU6XFx0XFx0cmV0dXJuIHJldDtcXG4gMjg2OlxcdH1cXG4gMjg3OlxcdFxcbiAyODg6XFx0LypcXG4gMjg5OlxcdCAqIE11c3QgYWNxdWlyZSBtZW1faG90cGx1Z19sb2NrIGluIHdyaXRlIG1vZGUuXFxuIDI5MDpcXHQgKi9cXG4gMjkxOlxcdHN0YXRpYyBpbnQgbWVtb3J5X2Jsb2NrX29mZmxpbmUoc3RydWN0IG1lbW9yeV9ibG9jayAqbWVtKVxcbiAyOTI6XFx0e1xcbiAyOTM6XFx0XFx0dW5zaWduZWQgbG9uZyBzdGFydF9wZm4gPSBzZWN0aW9uX25yX3RvX3BmbihtZW0tXFx1MDAzZXN0YXJ0X3NlY3Rpb25fbnIpO1xcbiAyOTQ6XFx0XFx0dW5zaWduZWQgbG9uZyBucl9wYWdlcyA9IFBBR0VTX1BFUl9TRUNUSU9OICogc2VjdGlvbnNfcGVyX2Jsb2NrO1xcbiAyOTU6XFx0XFx0dW5zaWduZWQgbG9uZyBucl92bWVtbWFwX3BhZ2VzID0gMDtcXG4gMjk2OlxcdFxcdGludCByZXQ7XFxuIDI5NzpcXHRcXG4gMjk4OlxcdFxcdGlmICghbWVtLVxcdTAwM2V6b25lKVxcbiAyOTk6XFx0XFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuIDMwMDpcXHRcXG4gMzAxOlxcdFxcdC8qXFxuIDMwMjpcXHRcXHQgKiBVbmFjY291bnQgYmVmb3JlIG9mZmxpbmluZywgc3VjaCB0aGF0IHVucG9wdWxhdGVkIHpvbmUgYW5kIGt0aHJlYWRzXFxuIDMwMzpcXHRcXHQgKiBjYW4gcHJvcGVybHkgYmUgdG9ybiBkb3duIGluIG9mZmxpbmVfcGFnZXMoKS5cXG4gMzA0OlxcdFxcdCAqL1xcbiAzMDU6XFx0XFx0aWYgKG1lbS1cXHUwMDNlYWx0bWFwKVxcbiAzMDY6XFx0XFx0XFx0bnJfdm1lbW1hcF9wYWdlcyA9IG1lbS1cXHUwMDNlYWx0bWFwLVxcdTAwM2VmcmVlO1xcbiAzMDc6XFx0XFxuIDMwODpcXHRcXHRtZW1faG90cGx1Z19iZWdpbigpO1xcbiAzMDk6XFx0XFx0Y2xlYXJfem9uZV9jb250aWd1b3VzKG1lbS1cXHUwMDNlem9uZSk7XFxuIDMxMDpcXHRcXHRpZiAobnJfdm1lbW1hcF9wYWdlcylcXG4gMzExOlxcdFxcdFxcdGFkanVzdF9wcmVzZW50X3BhZ2VfY291bnQocGZuX3RvX3BhZ2Uoc3RhcnRfcGZuKSwgbWVtLVxcdTAwM2Vncm91cCxcXG4gMzEyOlxcdFxcdFxcdFxcdFxcdFxcdCAgLW5yX3ZtZW1tYXBfcGFnZXMpO1xcbiAzMTM6XFx0XFxuIDMxNDpcXHRcXHRyZXQgPSBvZmZsaW5lX3BhZ2VzKHN0YXJ0X3BmbiArIG5yX3ZtZW1tYXBfcGFnZXMsXFxuIDMxNTpcXHRcXHRcXHRcXHQgICAgbnJfcGFnZXMgLSBucl92bWVtbWFwX3BhZ2VzLCBtZW0tXFx1MDAzZXpvbmUsIG1lbS1cXHUwMDNlZ3JvdXApO1xcbiAzMTY6XFx0XFx0aWYgKHJldCkge1xcbiAzMTc6XFx0XFx0XFx0Lyogb2ZmbGluZV9wYWdlcygpIGZhaWxlZC4gQWNjb3VudCBiYWNrLiAqL1xcbiAzMTg6XFx0XFx0XFx0aWYgKG5yX3ZtZW1tYXBfcGFnZXMpXFxuIDMxOTpcXHRcXHRcXHRcXHRhZGp1c3RfcHJlc2VudF9wYWdlX2NvdW50KHBmbl90b19wYWdlKHN0YXJ0X3BmbiksXFxuIDMyMDpcXHRcXHRcXHRcXHRcXHRcXHRcXHQgIG1lbS1cXHUwMDNlZ3JvdXAsIG5yX3ZtZW1tYXBfcGFnZXMpO1xcbiAzMjE6XFx0XFx0XFx0Z290byBvdXQ7XFxuIDMyMjpcXHRcXHR9XFxuIDMyMzpcXHRcXG4gMzI0OlxcdFxcdGlmIChucl92bWVtbWFwX3BhZ2VzKVxcbiAzMjU6XFx0XFx0XFx0bWhwX2RlaW5pdF9tZW1tYXBfb25fbWVtb3J5KHN0YXJ0X3BmbiwgbnJfdm1lbW1hcF9wYWdlcyk7XFxuIDMyNjpcXHRcXG4gMzI3OlxcdG91dDpcXG4gMzI4OlxcdFxcdHNldF96b25lX2NvbnRpZ3VvdXMobWVtLVxcdTAwM2V6b25lKTtcXG4gMzI5OlxcdFxcdGlmICghcmV0KVxcbiAzMzA6XFx0XFx0XFx0bWVtLVxcdTAwM2V6b25lID0gTlVMTDtcXG4gMzMxOlxcdFxcdG1lbV9ob3RwbHVnX2RvbmUoKTtcXG4gMzMyOlxcdFxcdHJldHVybiByZXQ7XFxuIDMzMzpcXHR9XFxuIDMzNDpcXHRcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTRUMDc6NDQ6MTAuNDk1MTg2NjEyWiIsIlNlcSI6MTksIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy44LWZsYXNoIiwiRHVyYXRpb24iOjE3NjAyNzQzMjMwLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyB0aGUgTWVtb3J5IEJsb2NrIE9mZmxpbmUvT25saW5lIENoYW5nZXMqKlxuXG5Pa2F5LCBsZXQncyBicmVhayB0aGlzIGRvd24uIEluIHRoZSBgbWVtb3J5X2Jsb2NrX29mZmxpbmVgIGZ1bmN0aW9uLCBJIHNlZSBgY2xlYXJfem9uZV9jb250aWd1b3VzYCBpcyBjYWxsZWQsIGFuZCB0aGVuLCBhdCB0aGUgZW5kLCBgc2V0X3pvbmVfY29udGlndW91c2AgaXMgY2FsbGVkLiBUaGUgY3J1Y2lhbCBxdWVzdGlvbiB0aGF0IGltbWVkaWF0ZWx5IGp1bXBzIG91dCBhdCBtZSBpczogd2hhdCdzIGhhcHBlbmluZyB3aXRoIHRoZSBgem9uZS1cdTAwM2Vjb250aWd1b3VzYCBmbGFnP1xuXG5CZWZvcmUgdGhpcyBwYXRjaCwgYHNldF96b25lX2NvbnRpZ3VvdXNgIHVzZWQgdG8gaXRlcmF0ZSB0aHJvdWdoIGFsbCB0aGUgcGFnZWJsb2NrcyB3aXRoaW4gYSB6b25lLiBJdCB3b3VsZCBtZXRpY3Vsb3VzbHkgY2hlY2sgZWFjaCBvbmUsIGFuZCBvbmx5IHNldCB0aGUgZmxhZyBpZiBubyBnYXBzIHdlcmUgZm91bmQuIEl0IHdhcyBhIGxvb3Agb3ZlcjpcblxuYGBgY1xudm9pZCBzZXRfem9uZV9jb250aWd1b3VzKHN0cnVjdCB6b25lICp6b25lKVxue1xuXHR1bnNpZ25lZCBsb25nIGJsb2NrX3N0YXJ0X3BmbiA9IHpvbmUtXHUwMDNlem9uZV9zdGFydF9wZm47XG5cdHVuc2lnbmVkIGxvbmcgYmxvY2tfZW5kX3BmbjtcblxuXHRibG9ja19lbmRfcGZuID0gcGFnZWJsb2NrX2VuZF9wZm4oYmxvY2tfc3RhcnRfcGZuKTtcblx0Zm9yICg7IGJsb2NrX3N0YXJ0X3BmbiBcdTAwM2Mgem9uZV9lbmRfcGZuKHpvbmUpO1xuXHRcdFx0YmxvY2tfc3RhcnRfcGZuID0gYmxvY2tfZW5kX3Bmbixcblx0XHRcdCBibG9ja19lbmRfcGZuICs9IHBhZ2VibG9ja19ucl9wYWdlcykge1xuXG5cdFx0YmxvY2tfZW5kX3BmbiA9IG1pbihibG9ja19lbmRfcGZuLCB6b25lX2VuZF9wZm4oem9uZSkpO1xuXG5cdFx0aWYgKCFfX3BhZ2VibG9ja19wZm5fdG9fcGFnZShibG9ja19zdGFydF9wZm4sXG5cdFx0XHRcdFx0ICAgICBibG9ja19lbmRfcGZuLCB6b25lKSlcblx0XHRcdHJldHVybjtcblx0XHRjb25kX3Jlc2NoZWQoKTtcblx0fVxuXG5cdC8qIFdlIGNvbmZpcm0gdGhhdCB0aGVyZSBpcyBubyBob2xlICovXG5cdHpvbmUtXHUwMDNlY29udGlndW91cyA9IHRydWU7XG59XG5gYGBcblxuTm93LCBpdCdzIGFuIGlubGluZSBmdW5jdGlvbiwgbXVjaCBzaW1wbGVyOlxuXG5gYGBjXG5zdGF0aWMgaW5saW5lIHZvaWQgc2V0X3pvbmVfY29udGlndW91cyhzdHJ1Y3Qgem9uZSAqem9uZSlcbntcblx0aWYgKHpvbmVfaXNfem9uZV9kZXZpY2Uoem9uZSkpXG5cdFx0cmV0dXJuO1xuXHRpZiAoem9uZS1cdTAwM2VzcGFubmVkX3BhZ2VzID09IHpvbmUtXHUwMDNlcGFnZXNfd2l0aF9vbmxpbmVfbWVtbWFwKVxuXHRcdFdSSVRFX09OQ0Uoem9uZS1cdTAwM2Vjb250aWd1b3VzLCB0cnVlKTtcbn1cbmBgYFxuXG5UaGlzIGlubGluZSB2ZXJzaW9uIGNvbXBhcmVzIGB6b25lLVx1MDAzZXNwYW5uZWRfcGFnZXNgIHRvIGB6b25lLVx1MDAzZXBhZ2VzX3dpdGhfb25saW5lX21lbW1hcGAuIFRoZSBmbGFnIGlzIG9ubHkgc2V0IGlmIHRoZXkgYXJlIGVxdWFsISBTbywgYHpvbmUtXHUwMDNlcGFnZXNfd2l0aF9vbmxpbmVfbWVtbWFwYCBpcyBub3cgY3JpdGljYWwgaGVyZSwgc28gSSB3YW50IHRvIHVuZGVyc3RhbmQgaG93IGl0J3MgbWFuYWdlZCwgYW5kIGlmIGl0J3MgY29ycmVjdC5cblxuSSBuZWVkIHRvIHVuZGVyc3RhbmQgaG93IGB6b25lLVx1MDAzZXBhZ2VzX3dpdGhfb25saW5lX21lbW1hcGAgaXMgdHJhY2tlZC4gSSBzZWUgaXQncyB1cGRhdGVkOlxuXG4qICAgRHVyaW5nIGVhcmx5IGJvb3QgaW4gYG1tbWFwX2luaXRfem9uZV9yYW5nZWA6IEkgc2VlIGl0IGdldHMgaW5jcmVtZW50ZWQgd2l0aCB0aGUgbnVtYmVyIG9mIHBhZ2VzIGluIHRoZSB6b25lLlxuXG4qICAgSW4gYGFkanVzdF9wcmVzZW50X3BhZ2VfY291bnRgOiBJdCBnZXRzIHVwZGF0ZWQgKGFkZGVkIG9yIHN1YnRyYWN0ZWQpLlxuXG4qICAgQW5kIGltcG9ydGFudGx5LCBkdXJpbmcgbWVtb3J5IGhvdHBsdWcgb3BlcmF0aW9ucywgd2hpY2ggaXMgd2hhdCBjb25jZXJucyBtZSBtb3N0IGhlcmUuXG5cbkkgc2VlIHRoYXQgYHNocmlua196b25lX3NwYW5gLCBgZmluZF9zbWFsbGVzdF9zZWN0aW9uX3BmbmAsIGFuZCBgZmluZF9iaWdnZXN0X3NlY3Rpb25fcGZuYCBoYXZlIGhhZCBsb2dpYyBjaGFuZ2VzIHJlbGF0ZWQgdG8gdGhpcy4gU3BlY2lmaWNhbGx5LCB0aGUgb2xkIGNvZGUgdXNlZCB0byBjYXJlZnVsbHkgY2hlY2sgZm9yIG5vZGUgYW5kIHpvbmUgbWlzbWF0Y2hlcy4gVGhlIG5ldyBsb2dpYyBpbiBgc3Vic2VjdGlvbl9vdmVybGFwc196b25lYCBmb2N1c2VzIG9uIGFsaWduaW5nIHRvIGEgc3BlY2lmaWMgc3Vic2VjdGlvbiBzaXplLiBUaGlzIGxvb2tzIGxpa2UgYSBzaW1wbGlmaWNhdGlvbi5cblxuTm93LCBJIHNwb3QgdGhlIGNvcmUgb2YgdGhpcyBjaGFuZ2UuIGBjbGVhcl96b25lX2NvbnRpZ3VvdXNgIGFuZCBgc2V0X3pvbmVfY29udGlndW91c2Agd2VyZSAqcmVtb3ZlZCogZnJvbSBgcmVtb3ZlX3Bmbl9yYW5nZV9mcm9tX3pvbmVgIGFuZCBgbW92ZV9wZm5fcmFuZ2VfdG9fem9uZWAgYW5kIG1vdmVkIGludG8gYG1lbW9yeV9ibG9ja19vbmxpbmVgIGFuZCBgbWVtb3J5X2Jsb2NrX29mZmxpbmVgLiBUaGUgcHJvYmxlbSBoZXJlIGlzIHRoYXQgdGhlc2UgZnVuY3Rpb25zIGNhbiBiZSBjYWxsZWQgKmluZGVwZW5kZW50bHkqIG9mIGBtZW1vcnlfYmxvY2tfb25saW5lYC9gb2ZmbGluZWAhIFRoYXQgbWVhbnMgdGhhdCB0aGUgY29udGlndWl0eSBmbGFnIG1pZ2h0IGJlIGluY29ycmVjdGx5IHNldCBvciBjbGVhcmVkISBUaGlzIGlzIGEgcG90ZW50aWFsIHJhY2UgY29uZGl0aW9uIG9yIGRhdGEgY29ycnVwdGlvbi4gSSBuZWVkIHRvIGJlICphYnNvbHV0ZWx5KiBzdXJlIHRoYXQgdGhlIGxvZ2ljIGlzIGNvcnJlY3QgaW4gYWxsIGNhc2VzLCBlc3BlY2lhbGx5IGJlY2F1c2UgaXQncyBub3cgdGllZCB0byB0aGUgY291bnQgb2Ygb25saW5lIHBhZ2VzLCB3aGljaCBjYW4gY2hhbmdlIGluIHZhcmlvdXMgd2F5cy4gSSBuZWVkIHRvIGNvbmZpcm0gdGhhdCBBTEwgY2FsbGVycyBvZiBgcmVtb3ZlX3Bmbl9yYW5nZV9mcm9tX3pvbmVgIGFuZCBgbW92ZV9wZm5fcmFuZ2VfdG9fem9uZWAgYXJlIG5vdyBzYWZlLCBhcyB3ZWxsLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxODQ4NywiT3V0cHV0VG9rZW5zIjoyNCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjk4NywiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTE0VDA3OjQ0OjI4LjA5NzkzMjUxMloiLCJTZXEiOjIwLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTYzMzU4NjMxNywiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJyZW1vdmVfcGZuX3JhbmdlX2Zyb21fem9uZVwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJpbmNsdWRlL2xpbnV4L21lbW9yeV9ob3RwbHVnLmg9MzEyPWV4dGVybiB2b2lkIG1vdmVfcGZuX3JhbmdlX3RvX3pvbmUoc3RydWN0IHpvbmUgKnpvbmUsIHVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuLFxcbi0tXFxuaW5jbHVkZS9saW51eC9tZW1vcnlfaG90cGx1Zy5oLTMxNS1cXHRcXHRcXHRcXHQgICBib29sIGlzb2xhdGVfcGFnZWJsb2NrKTtcXG5pbmNsdWRlL2xpbnV4L21lbW9yeV9ob3RwbHVnLmg6MzE2OmV4dGVybiB2b2lkIHJlbW92ZV9wZm5fcmFuZ2VfZnJvbV96b25lKHN0cnVjdCB6b25lICp6b25lLFxcbmluY2x1ZGUvbGludXgvbWVtb3J5X2hvdHBsdWcuaC0zMTctXFx0XFx0XFx0XFx0ICAgICAgIHVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuLFxcbi0tXFxubW0vbWVtb3J5X2hvdHBsdWcuYz01MDM9c3RhdGljIHZvaWQgdXBkYXRlX3BnZGF0X3NwYW4oc3RydWN0IHBnbGlzdF9kYXRhICpwZ2RhdClcXG4tLVxcbm1tL21lbW9yeV9ob3RwbHVnLmMtNTMwLVxcbm1tL21lbW9yeV9ob3RwbHVnLmM6NTMxOnZvaWQgcmVtb3ZlX3Bmbl9yYW5nZV9mcm9tX3pvbmUoc3RydWN0IHpvbmUgKnpvbmUsXFxubW0vbWVtb3J5X2hvdHBsdWcuYy01MzItXFx0XFx0XFx0XFx0ICAgICAgdW5zaWduZWQgbG9uZyBzdGFydF9wZm4sXFxuLS1cXG5tbS9tZW1vcnlfaG90cGx1Zy5jPTEwOTg9dm9pZCBtaHBfZGVpbml0X21lbW1hcF9vbl9tZW1vcnkodW5zaWduZWQgbG9uZyBwZm4sIHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMpXFxuLS1cXG5tbS9tZW1vcnlfaG90cGx1Zy5jLTExMTMtXFx0ICovXFxubW0vbWVtb3J5X2hvdHBsdWcuYzoxMTE0OlxcdHJlbW92ZV9wZm5fcmFuZ2VfZnJvbV96b25lKHBhZ2Vfem9uZShwZm5fdG9fcGFnZShwZm4pKSwgcGZuLCBucl9wYWdlcyk7XFxubW0vbWVtb3J5X2hvdHBsdWcuYy0xMTE1LVxcdGthc2FuX3JlbW92ZV96ZXJvX3NoYWRvdyhfX3ZhKFBGTl9QSFlTKHBmbikpLCBQRk5fUEhZUyhucl9wYWdlcykpO1xcbi0tXFxubW0vbWVtb3J5X2hvdHBsdWcuYz0xMTIxPWludCBvbmxpbmVfcGFnZXModW5zaWduZWQgbG9uZyBwZm4sIHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMsXFxuLS1cXG5tbS9tZW1vcnlfaG90cGx1Zy5jLTEyMzEtXFx0XFx0bm9kZV9ub3RpZnkoTk9ERV9DQU5DRUxfQURESU5HX0ZJUlNUX01FTU9SWSwgXFx1MDAyNm5vZGVfYXJnKTtcXG5tbS9tZW1vcnlfaG90cGx1Zy5jOjEyMzI6XFx0cmVtb3ZlX3Bmbl9yYW5nZV9mcm9tX3pvbmUoem9uZSwgcGZuLCBucl9wYWdlcyk7XFxubW0vbWVtb3J5X2hvdHBsdWcuYy0xMjMzLVxcdHJldHVybiByZXQ7XFxuLS1cXG5tbS9tZW1vcnlfaG90cGx1Zy5jPTE5MzY9aW50IG9mZmxpbmVfcGFnZXModW5zaWduZWQgbG9uZyBzdGFydF9wZm4sIHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMsXFxuLS1cXG5tbS9tZW1vcnlfaG90cGx1Zy5jLTIxMzMtXFx0bWVtb3J5X25vdGlmeShNRU1fT0ZGTElORSwgXFx1MDAyNm1lbV9hcmcpO1xcbm1tL21lbW9yeV9ob3RwbHVnLmM6MjEzNDpcXHRyZW1vdmVfcGZuX3JhbmdlX2Zyb21fem9uZSh6b25lLCBzdGFydF9wZm4sIG5yX3BhZ2VzKTtcXG5tbS9tZW1vcnlfaG90cGx1Zy5jLTIxMzUtXFx0cmV0dXJuIDA7XFxuLS1cXG5tbS9tZW1yZW1hcC5jPTg2PXN0YXRpYyB2b2lkIHBhZ2V1bm1hcF9yYW5nZShzdHJ1Y3QgZGV2X3BhZ2VtYXAgKnBnbWFwLCBpbnQgcmFuZ2VfaWQpXFxuLS1cXG5tbS9tZW1yZW1hcC5jLTk1LVxcdG1lbV9ob3RwbHVnX2JlZ2luKCk7XFxubW0vbWVtcmVtYXAuYzo5NjpcXHRyZW1vdmVfcGZuX3JhbmdlX2Zyb21fem9uZShwYWdlX3pvbmUoZmlyc3RfcGFnZSksIFBIWVNfUEZOKHJhbmdlLVxcdTAwM2VzdGFydCksXFxubW0vbWVtcmVtYXAuYy05Ny1cXHRcXHRcXHRcXHQgICBQSFlTX1BGTihyYW5nZV9sZW4ocmFuZ2UpKSk7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTE0VDA3OjQ0OjI5LjczMTUyNDM2OVoiLCJTZXEiOjIxLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuOC1mbGFzaCIsIkR1cmF0aW9uIjo1Njk3NDkyNzA5LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBoZXJlJ3MgbXkgdGFrZSBvbiB0aG9zZSB0aG91Z2h0cywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZSwgYW5kIHdyaXR0ZW4gYXMgaWYgdGhleSB3ZXJlIG15IG93biBtZW50YWwgcHJvY2VzczpcblxuKipEaXZpbmcgRGVlcGVyIGludG8gYG1vdmVfcGZuX3JhbmdlX3RvX3pvbmVgKipcblxuUmlnaHQsIHNvIHdlJ3ZlIGJlZW4gbG9va2luZyBhdCB0aGUgYG1vdmVfcGZuX3JhbmdlX3RvX3pvbmVgIGZ1bmN0aW9uLCBhbmQgSSd2ZSBnb3QgYSBodW5jaCBpdCdzIHdvcnRoIGNoZWNraW5nIGl0cyBjYWxsZXJzIG1vcmUgdGhvcm91Z2hseS4gV2UndmUgZ290IHRoZSBjb3JlIGxvZ2ljIHByZXR0eSB3ZWxsIHVuZGVyc3Rvb2Qgbm93LCBpdHMgcHVycG9zZSBvZiBwaHlzaWNhbGx5IG1vdmluZyBtZW1vcnkgcGFnZXMgZnJvbSBvbmUgem9uZSB0byBhbm90aGVyLCBsaWtlbHkgZm9yIG1lbW9yeSBtYW5hZ2VtZW50IHB1cnBvc2VzLiBJdCBtYWtlcyBzZW5zZSB0byB2ZXJpZnkgd2hhdCBjb2RlICp1c2VzKiB0aGF0IGZ1bmN0aW9uIGFuZCB3aHkuIEEgdGhvcm91Z2ggcmV2aWV3IG9mIHRoZSBjYWxsZXIgc2l0ZXMgd2lsbCBwcm9iYWJseSB0dXJuIHVwIHZhbHVhYmxlIGluc2lnaHRzIGludG8gaG93IHRoZXNlIG9wZXJhdGlvbnMgZml0IGludG8gdGhlIG92ZXJhbGwgbWVtb3J5IG1hbmFnZW1lbnQgc2NoZW1lLiBJJ20gaW1hZ2luaW5nIGl0J3MgdXNlZCBpbiB0aGluZ3MgbGlrZSBOVU1BIG5vZGUgYmFsYW5jaW5nLCBtZW1vcnkgaG90cGx1ZyBvcGVyYXRpb25zLCBvciBwZXJoYXBzIGV2ZW4gY29tcGFjdGlvbi4gVGhlIG1vcmUgSSBjb25zaWRlciBpdCwgdGhlIG1vcmUgSSByZWFsaXplIHRoYXQga25vd2luZyB0aGUgc3Vycm91bmRpbmcgdXNhZ2UgaXMgdml0YWwgZm9yIHVuZGVyc3RhbmRpbmcgdGhpcyBvcGVyYXRpb24ncyBpbXBhY3RzIGFuZCBhbnkgYXNzb2NpYXRlZCBzeW5jaHJvbml6YXRpb24gaXNzdWVzLiBMZXQncyBzZWUgd2hhdCB3ZSBmaW5kIHdoZW4gd2UgZGlnIGludG8gdGhvc2UgY2FsbCBzaXRlcy5cblxuXG4iLCJJbnB1dFRva2VucyI6MjExNzQsIk91dHB1dFRva2VucyI6MjQsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxOSwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0xNFQwNzo0NDozNS40MjkwNDY5NzhaIiwiU2VxIjoyMiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE1OTg5MDY2NDcsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwibW92ZV9wZm5fcmFuZ2VfdG9fem9uZVwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJpbmNsdWRlL2xpbnV4L21lbW9yeV9ob3RwbHVnLmg9MzA5PWV4dGVybiBpbnQgYWRkX21lbW9yeV9kcml2ZXJfbWFuYWdlZChpbnQgbmlkLCB1NjQgc3RhcnQsIHU2NCBzaXplLFxcbi0tXFxuaW5jbHVkZS9saW51eC9tZW1vcnlfaG90cGx1Zy5oLTMxMS1cXHRcXHRcXHRcXHQgICAgIG1ocF90IG1ocF9mbGFncyk7XFxuaW5jbHVkZS9saW51eC9tZW1vcnlfaG90cGx1Zy5oOjMxMjpleHRlcm4gdm9pZCBtb3ZlX3Bmbl9yYW5nZV90b196b25lKHN0cnVjdCB6b25lICp6b25lLCB1bnNpZ25lZCBsb25nIHN0YXJ0X3BmbixcXG5pbmNsdWRlL2xpbnV4L21lbW9yeV9ob3RwbHVnLmgtMzEzLVxcdFxcdFxcdFxcdCAgIHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMsXFxuLS1cXG5tbS9tZW1vcnlfaG90cGx1Zy5jPTcxND1zdGF0aWMgaW5saW5lIHZvaWQgc2VjdGlvbl90YWludF96b25lX2RldmljZSh1bnNpZ25lZCBsb25nIHBmbilcXG4tLVxcbm1tL21lbW9yeV9ob3RwbHVnLmMtNzI3LSAqL1xcbm1tL21lbW9yeV9ob3RwbHVnLmM6NzI4OnZvaWQgbW92ZV9wZm5fcmFuZ2VfdG9fem9uZShzdHJ1Y3Qgem9uZSAqem9uZSwgdW5zaWduZWQgbG9uZyBzdGFydF9wZm4sXFxubW0vbWVtb3J5X2hvdHBsdWcuYy03MjktXFx0XFx0XFx0XFx0ICB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzLFxcbi0tXFxubW0vbWVtb3J5X2hvdHBsdWcuYz0xMDY3PWludCBtaHBfaW5pdF9tZW1tYXBfb25fbWVtb3J5KHVuc2lnbmVkIGxvbmcgcGZuLCB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzLFxcbi0tXFxubW0vbWVtb3J5X2hvdHBsdWcuYy0xMDc2LVxcbm1tL21lbW9yeV9ob3RwbHVnLmM6MTA3NzpcXHRtb3ZlX3Bmbl9yYW5nZV90b196b25lKHpvbmUsIHBmbiwgbnJfcGFnZXMsIE5VTEwsIE1JR1JBVEVfVU5NT1ZBQkxFLFxcbm1tL21lbW9yeV9ob3RwbHVnLmMtMTA3OC1cXHRcXHRcXHQgICAgICAgZmFsc2UpO1xcbi0tXFxubW0vbWVtb3J5X2hvdHBsdWcuYz0xMTIxPWludCBvbmxpbmVfcGFnZXModW5zaWduZWQgbG9uZyBwZm4sIHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMsXFxuLS1cXG5tbS9tZW1vcnlfaG90cGx1Zy5jLTExNDgtXFx0LyogYXNzb2NpYXRlIHBmbiByYW5nZSB3aXRoIHRoZSB6b25lICovXFxubW0vbWVtb3J5X2hvdHBsdWcuYzoxMTQ5OlxcdG1vdmVfcGZuX3JhbmdlX3RvX3pvbmUoem9uZSwgcGZuLCBucl9wYWdlcywgTlVMTCwgTUlHUkFURV9NT1ZBQkxFLFxcbm1tL21lbW9yeV9ob3RwbHVnLmMtMTE1MC1cXHRcXHRcXHQgICAgICAgdHJ1ZSk7XFxuLS1cXG5tbS9tZW1vcnlfaG90cGx1Zy5jPTIyMTk9dm9pZCB0cnlfb2ZmbGluZV9ub2RlKGludCBuaWQpXFxuLS1cXG5tbS9tZW1vcnlfaG90cGx1Zy5jLTIyMjQtXFx0ICogSWYgdGhlIG5vZGUgc3RpbGwgc3BhbnMgcGFnZXMgKGVzcGVjaWFsbHkgWk9ORV9ERVZJQ0UpLCBkb24ndFxcbm1tL21lbW9yeV9ob3RwbHVnLmM6MjIyNTpcXHQgKiBvZmZsaW5lIGl0LiBBIG5vZGUgc3BhbnMgbWVtb3J5IGFmdGVyIG1vdmVfcGZuX3JhbmdlX3RvX3pvbmUoKSxcXG5tbS9tZW1vcnlfaG90cGx1Zy5jLTIyMjYtXFx0ICogZS5nLiwgYWZ0ZXIgdGhlIG1lbW9yeSBibG9jayB3YXMgb25saW5lZC5cXG4tLVxcbm1tL21lbXJlbWFwLmM9MTQ0PXN0YXRpYyBpbnQgcGFnZW1hcF9yYW5nZShzdHJ1Y3QgZGV2X3BhZ2VtYXAgKnBnbWFwLCBzdHJ1Y3QgbWhwX3BhcmFtcyAqcGFyYW1zLFxcbi0tXFxubW0vbWVtcmVtYXAuYy0yMjgtXFx0XFx0em9uZSA9IFxcdTAwMjZOT0RFX0RBVEEobmlkKS1cXHUwMDNlbm9kZV96b25lc1taT05FX0RFVklDRV07XFxubW0vbWVtcmVtYXAuYzoyMjk6XFx0XFx0bW92ZV9wZm5fcmFuZ2VfdG9fem9uZSh6b25lLCBQSFlTX1BGTihyYW5nZS1cXHUwMDNlc3RhcnQpLFxcbm1tL21lbXJlbWFwLmMtMjMwLVxcdFxcdFxcdFxcdFBIWVNfUEZOKHJhbmdlX2xlbihyYW5nZSkpLCBwYXJhbXMtXFx1MDAzZWFsdG1hcCxcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTRUMDc6NDQ6MzcuMDI3OTYwNDI1WiIsIlNlcSI6MjMsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy44LWZsYXNoIiwiRHVyYXRpb24iOjIxODA0NzczMDkwMiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipXb3J0aEZ1enppbmcgQW5hbHlzaXM6IE1lbW9yeSBIb3RwbHVnIGFuZCBDb250aWd1aXR5KipcblxuT2theSwgbGV0J3MgYnJlYWsgdGhpcyBkb3duLiBGaXJzdCwgYHNocmlua196b25lX3NwYW5gIGNhbGxzIGByZW1vdmVfcGZuX3JhbmdlX2Zyb21fem9uZWAuIFdpdGhpbiBgc2hyaW5rX3pvbmVfc3BhbmAsIHRoZSBgZmluZF9zbWFsbGVzdF9zZWN0aW9uX3BmbmAgYW5kIGBmaW5kX2JpZ2dlc3Rfc2VjdGlvbl9wZm5gIGZ1bmN0aW9ucyBub3cgdXNlIGBzdWJzZWN0aW9uX292ZXJsYXBzX3pvbmVgLiBUaGlzIGZ1bmN0aW9uIGlzIGludGVyZXN0aW5nIGJlY2F1c2UgaXQgY2hlY2tzIGlmIGEgc3Vic2VjdGlvbiBvdmVybGFwcyBhIGdpdmVuIHpvbmUuIFRoZSBjb2RlIGNhbGN1bGF0ZXMgc3RhcnQgYW5kIGVuZCBQRk5TIGZvciBzdWJzZWN0aW9ucywgYW5kIGNydWNpYWxseSwgaXQgY2hlY2tzIGlmIGBwZm5fdG9fb25saW5lX3BhZ2Uoc3RhcnRfcGZuKWAgaXMgdmFsaWQuICBUaGF0IHNlZW1zIGZpbmUsIGJ1dCB3YWl04oCmIHdoYXQgaWYgYHpvbmVfaXNfY29udGlndW91c2AgYWxzbyBoYXMgaW1wbGljYXRpb25zIGZvciBjb21wYWN0aW9uPyAgSWYgaXQgZXJyb25lb3VzbHkgcmV0dXJucyBgdHJ1ZWAsIHRoZW4gY29tcGFjdGlvbiByb3V0aW5lcyBtaWdodCBjYWxsIGBwZm5fdG9fcGFnZShzdGFydF9wZm4pYCB3aXRob3V0IHByb3BlciB2YWxpZGF0aW9uIGFuZCB6b25lIGNoZWNrcyEgIFRoaXMgbWFrZXMgbWUgd29ycnkgYWJvdXQgdGhlIHBvdGVudGlhbCBmb3IgZXJyb3JzIGlmIHRoZSBgem9uZV9pc19jb250aWd1b3VzYCBmbGFnIGlzIGluY29uc2lzdGVudCwgcG9zc2libHkgZHVlIHRvIGEgcmFjZSBjb25kaXRpb24gb3IgcHJvYmxlbXMgd2l0aCBvZmZsaW5pbmcgbWVtb3J5LiBUaGlzIGhhcyB0aGUgcG90ZW50aWFsIHRvIGNhdXNlIGlzc3VlcyB3aXRoaW4gYGlzb2xhdGVfbWlncmF0ZXBhZ2VzX3JhbmdlYCBvciBgaXNvbGF0ZV9mcmVlcGFnZXNfcmFuZ2VgLlxuXG5Mb29raW5nIGF0IHRoZSBwYXRjaCBjaGFuZ2VzIGluIG1vcmUgZGV0YWlsLCBpdCdzIGNsZWFyIHRoaXMgdG91Y2hlcyBjb3JlIG1lbW9yeSBtYW5hZ2VtZW50IChgbW0vYCkgY29kZSwgc3BlY2lmaWNhbGx5IGludm9sdmluZyBtZW1vcnkgaG90cGx1ZywgaW5pdGlhbGl6YXRpb24sIGFuZCBjb21wYWN0aW9uLXJlbGF0ZWQgem9uZSBjb250aWd1aXR5IHRyYWNraW5nLlxuXG5Ob3csIHRoZSBjcnVjaWFsIHF1ZXN0aW9uOiBJcyB0aGlzIHJlYWNoYWJsZSBpbiB0eXBpY2FsIGVudmlyb25tZW50cz8gWWVzISBTdGFuZGFyZCBMaW51eCBrZXJuZWxzIHJ1bm5pbmcgaW4gUUVNVSB1c2UgYFNQQVJTRU1FTV9WTUVNTUFQYCBhbmQgYE1FTU9SWV9IT1RQTFVHYC4gU3l6a2FsbGVyIGNhbiBpbnRlcmFjdCB3aXRoIGAvc3lzL2RldmljZXMvc3lzdGVtL21lbW9yeS8uLi5gIChvbmxpbmUvb2ZmbGluZSBtZW1vcnkgYmxvY2tzKSBvciB0cmlnZ2VyIGNvbXBhY3Rpb24uIEl0J3MgZXNwZWNpYWxseSBzaWduaWZpY2FudCB0aGF0IHN5emthbGxlciwgd2hpY2ggcnVucyBhcyByb290LCBoYXMgYWNjZXNzIHRvIHN5c2ZzIGZpbGVzIGxpa2UgYC9zeXMvZGV2aWNlcy9zeXN0ZW0vbWVtb3J5L21lbW9yeSovc3RhdGVgLiBUaGUgc3lzdGVtIGludGVyYWN0cyB3aXRoIG1lbW9yeSBibG9ja3MsIHdoaWNoIGlzIHJpZ2h0IGluIHRoZSBjcm9zc2hhaXJzIG9mIHRoZSBjaGFuZ2VkIGNvZGUuXG5cblRoZSBjcml0ZXJpYSBmb3IgcmV0dXJuaW5nIGBXb3J0aEZ1enppbmc9dHJ1ZWAgYXJlIG1ldDogdGhlIHBhdGNoIG1vZGlmaWVzIGNvcmUgbWVtb3J5IG1hbmFnZW1lbnQgbG9naWMgKG1tLyksIGFuZCBub25lIG9mIHRoZSBuZWdhdGl2ZSBjcml0ZXJpYSBhcHBseSAoZS5nLiwgbm9uLWtlcm5lbCBjaGFuZ2VzLCB1bnJlYWNoYWJsZSBoYXJkd2FyZSwgb3IgYXJjaGl0ZWN0dXJlLXNwZWNpZmljIHBhdGhzKS5cblxuVGhlcmVmb3JlLCB0aGlzIHBhdGNoIGlzICpkZWZpbml0ZWx5KiB3b3J0aCBmdXp6aW5nLiBUaGUgY2hhbmdlcyBhcmUgaW4gY29yZSBNTSBjb2RlIChgbW0vbWVtb3J5X2hvdHBsdWcuY2AsIGBtbS9tbV9pbml0LmNgLCBgZHJpdmVycy9iYXNlL21lbW9yeS5jYCwgYGluY2x1ZGUvbGludXgvbW16b25lLmhgLCBgbW0vcGFnZV9hbGxvYy5oYCksIGFuZCB0aGUgdGFyZ2V0IGVudmlyb25tZW50IChRRU1VIHdpdGggc3l6a2FsbGVyKSBpcyBkaXJlY3RseSBhZmZlY3RlZC5cblxuTm93LCBJIG5lZWQgdG8gZmlndXJlIG91dDpcbjEuICBgRW5hYmxlQ29uZmlnc2AgLSBJIG5lZWQgdG8gZXhhbWluZSBLY29uZmlnIG9wdGlvbnMgbGlrZSBgQ09ORklHX01FTU9SWV9IT1RQTFVHYCwgYENPTkZJR19TUEFSU0VNRU1gLCBhbmQgYENPTkZJR19TUEFSU0VNRU1fVk1FTU1BUGAgYW5kIGhvdyB0aGV5IGFyZSB1c2VkIGluIHRoZSBtb2RpZmllZCBjb2RlLiBJIG5lZWQgdG8gbG9vayBhdCBgZHJpdmVycy9iYXNlL21lbW9yeS5jYCwgYG1tL21lbW9yeV9ob3RwbHVnLmNgIGFuZCBlbHNld2hlcmUuXG4yLiAgYEZvY3VzU3ltYm9sc2BcbjMuICBgUmVhc29uaW5nYFxuXG5cbiIsIklucHV0VG9rZW5zIjoyMjIxNSwiT3V0cHV0VG9rZW5zIjoyOSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjk5MiwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0xNFQwNzo0ODoxNS4wNzU2OTUxNzdaIiwiU2VxIjoyNCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjEwMTUyNTU2OCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJtZW1vcnlfYmxvY2tfb25saW5lXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcImRyaXZlcnMvYmFzZS9cIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiZHJpdmVycy9iYXNlL21lbW9yeS5jPTIyND1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgbWVtYmxrX25yX3BvaXNvbihzdHJ1Y3QgbWVtb3J5X2Jsb2NrICptZW0pXFxuLS1cXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmMtMjMyLSAqL1xcbmRyaXZlcnMvYmFzZS9tZW1vcnkuYzoyMzM6c3RhdGljIGludCBtZW1vcnlfYmxvY2tfb25saW5lKHN0cnVjdCBtZW1vcnlfYmxvY2sgKm1lbSlcXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmMtMjM0LXtcXG4tLVxcbmRyaXZlcnMvYmFzZS9tZW1vcnkuYz0zNDA9bWVtb3J5X2Jsb2NrX2FjdGlvbihzdHJ1Y3QgbWVtb3J5X2Jsb2NrICptZW0sIHVuc2lnbmVkIGxvbmcgYWN0aW9uKVxcbi0tXFxuZHJpdmVycy9iYXNlL21lbW9yeS5jLTM0NS1cXHRjYXNlIE1FTV9PTkxJTkU6XFxuZHJpdmVycy9iYXNlL21lbW9yeS5jOjM0NjpcXHRcXHRyZXQgPSBtZW1vcnlfYmxvY2tfb25saW5lKG1lbSk7XFxuZHJpdmVycy9iYXNlL21lbW9yeS5jLTM0Ny1cXHRcXHRicmVhaztcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTRUMDc6NDg6MTUuMTc3MjI2Mjc1WiIsIlNlcSI6MjUsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy44LWZsYXNoIiwiRHVyYXRpb24iOjc2NzkyODA4NTAsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGxldCdzIGRpdmUgaW50byB0aGlzLiBIZXJlJ3MgbXkgdGFrZSBvbiB0aG9zZSBgZHJpdmVycy9iYXNlL21lbW9yeS5jYCBiaXRzOlxuXG4qKkludmVzdGlnYXRpbmcgTWVtb3J5IEhvdHBsdWcgQ29kZSoqXG5cbkFscmlnaHQsIEknbSB0aGlua2luZyBJIG5lZWQgdG8gcmVmcmVzaCBteSBtZW1vcnkgb24gdGhlIG1lbW9yeSBob3RwbHVnIGltcGxlbWVudGF0aW9uLiBUaGUgZmlyc3QgdGhpbmcgSSdtIGdvaW5nIHRvIGxvb2sgYXQgYXJlIHRoZSBgI2lmZGVmYCBndWFyZHMgc3Vycm91bmRpbmcgYG1lbW9yeV9ibG9ja19vbmxpbmVgIHdpdGhpbiBgZHJpdmVycy9iYXNlL21lbW9yeS5jYC4gSSBleHBlY3QgdG8gc2VlIHNwZWNpZmljIGNvbXBpbGUtdGltZSBjb25maWd1cmF0aW9ucyBjb250cm9sbGluZyB0aGUgYXZhaWxhYmlsaXR5IG9mIHRoaXMgZnVuY3Rpb24uIEknbGwgbmVlZCB0byB1bmRlcnN0YW5kIHVuZGVyIHdoYXQgY2lyY3Vtc3RhbmNlcyBtZW1vcnkgY2FuIGJlIGhvdHBsdWdnZWQsIGFuZCB0aGlzIHNob3VsZCB0ZWxsIG1lIGEgbG90IGFib3V0IHRoZSBkZXBlbmRlbmNpZXMgYW5kIGFueSBwbGF0Zm9ybSBsaW1pdGF0aW9ucy4gVGhlbiBJIG5lZWQgdG8ganVtcCBvdmVyIHRvIHRoZSBgZHJpdmVycy9iYXNlL01ha2VmaWxlYC4gVGhlIG1ha2VmaWxlIGRpcmVjdGl2ZXMgd2lsbCBzaG93IHRoZSBzeW1ib2xzIGRlZmluZWQgYnkgdGhvc2UgZ3VhcmRzLiBJdCB3aWxsIHRlbGwgbWUgd2hpY2ggY29uZmlndXJhdGlvbiBvcHRpb25zIGVuYWJsZSB0aGlzIHNwZWNpZmljIGNvZGUgYmxvY2ssIGFuZCB0aGVyZWZvcmUgd2hpY2ggZHJpdmVycyBhbmQgYXJjaGl0ZWN0dXJlcyBhcmUgc3VwcG9ydGVkLiBUaGUgZ29hbCBpcyBhIGRlZXBlciB1bmRlcnN0YW5kaW5nIG9mIHRoZSBmbGV4aWJpbGl0eSBpbiB0aGUgc3lzdGVtLlxuXG5cbiIsIklucHV0VG9rZW5zIjoyNDA5NiwiT3V0cHV0VG9rZW5zIjoyNywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjM1LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTE0VDA3OjQ4OjIyLjg1NjUxMTIyNloiLCJTZXEiOjI2LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTA3ODY0MzE5LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcIm1lbW9yeVxcXFwub1wiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJkcml2ZXJzL2Jhc2UvXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImRyaXZlcnMvYmFzZS9NYWtlZmlsZT0xNT1vYmotJChDT05GSUdfTlVNQSlcXHQrPSBub2RlLm9cXG5kcml2ZXJzL2Jhc2UvTWFrZWZpbGU6MTY6b2JqLSQoQ09ORklHX01FTU9SWV9IT1RQTFVHKSArPSBtZW1vcnkub1xcbmRyaXZlcnMvYmFzZS9NYWtlZmlsZS0xNy1pZmVxICgkKENPTkZJR19TWVNGUykseSlcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTRUMDc6NDg6MjIuOTY0NDA2OTQ1WiIsIlNlcSI6MjcsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy44LWZsYXNoIiwiRHVyYXRpb24iOjIxODMyMTAwNzksIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSB0aG91Z2h0IHByb2Nlc3MsIGFzIGl0IHJlbGF0ZXMgdG8gdGhlIGtlcm5lbCBtb2R1bGUgYW5kIG1lbW9yeSBob3RwbHVnOlxuXG4qKkludmVzdGlnYXRpbmcgTWVtb3J5IEhvdHBsdWcgQ29uZmlndXJhdGlvbioqXG5cbk9rYXksIHNvIGBkcml2ZXJzL2Jhc2UvbWVtb3J5Lm9gIGlzIGJ1aWx0IHdpdGggYENPTkZJR19NRU1PUllfSE9UUExVR2AgZW5hYmxlZC4gVGhhdCBpbW1lZGlhdGVseSB0ZWxscyBtZSBtZW1vcnkgaG90cGx1ZyBpcyBhIGNvcmUgcmVxdWlyZW1lbnQgZm9yIHRoaXMgcGFydGljdWxhciBvYmplY3QgZmlsZS4gTXkgbmV4dCBsb2dpY2FsIHN0ZXAgaXMgdG8gZGl2ZSBpbnRvIHRoZSBtZW1vcnkgbWFuYWdlbWVudCBzdWJzeXN0ZW0sIHNwZWNpZmljYWxseSB0aGUgYG1tL01ha2VmaWxlYC4gSSBuZWVkIHRvIGNvbmZpcm0gaG93IGBtZW1vcnlfaG90cGx1Zy5vYCBpcyBoYW5kbGVkIHdpdGhpbiB0aGF0IGJ1aWxkIHByb2Nlc3MuIEkgd2FudCB0byBzZWUgaG93IHRoYXQgZmlsZSBpcyBpbmNvcnBvcmF0ZWQgYW5kIHdoYXQgZGVwZW5kZW5jaWVzIG9yIGJ1aWxkIGZsYWdzIG1pZ2h0IGJlIGltcGFjdGluZyBpdCB3aXRoaW4gdGhlIGJyb2FkZXIgbWVtb3J5IG1hbmFnZW1lbnQgY29udGV4dC4gVGhpcyB3aWxsIGdpdmUgbWUgYSBiZXR0ZXIgdW5kZXJzdGFuZGluZyBvZiBob3cgdGhlIGtlcm5lbCBoYW5kbGVzIHRoZSBhZGRpdGlvbiBhbmQgcmVtb3ZhbCBvZiBtZW1vcnkuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjI0NDM5LCJPdXRwdXRUb2tlbnMiOjI4LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NDAsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMTRUMDc6NDg6MjUuMTQ3NjE5ODU0WiIsIlNlcSI6MjgsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo4OTI0NzA0OCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJtZW1vcnlfaG90cGx1Z1xcXFwub1wiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJtbS9cIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwibW0vTWFrZWZpbGU9NjI9cGFnZS1hbGxvYy0kKENPTkZJR19TSFVGRkxFX1BBR0VfQUxMT0NBVE9SKSArPSBzaHVmZmxlLm9cXG4tLVxcbm1tL01ha2VmaWxlLTY0LSMgR2l2ZSAnbWVtb3J5X2hvdHBsdWcnIGl0cyBvd24gbW9kdWxlLXBhcmFtZXRlciBuYW1lc3BhY2VcXG5tbS9NYWtlZmlsZTo2NTptZW1vcnktaG90cGx1Zy0kKENPTkZJR19NRU1PUllfSE9UUExVRykgKz0gbWVtb3J5X2hvdHBsdWcub1xcbm1tL01ha2VmaWxlLTY2LVxcbi0tXFxubW0vbWVtb3J5X2hvdHBsdWcuYz0xNTQ9c3RhdGljIGludCBnZXRfb25saW5lX3BvbGljeShjaGFyICpidWZmZXIsIGNvbnN0IHN0cnVjdCBrZXJuZWxfcGFyYW0gKmtwKVxcbi0tXFxubW0vbWVtb3J5X2hvdHBsdWcuYy0xNTktLypcXG5tbS9tZW1vcnlfaG90cGx1Zy5jOjE2MDogKiBtZW1vcnlfaG90cGx1Zy5vbmxpbmVfcG9saWN5OiBjb25maWd1cmUgb25saW5lIGJlaGF2aW9yIHdoZW4gb25saW5pbmcgd2l0aG91dFxcbm1tL21lbW9yeV9ob3RwbHVnLmMtMTYxLSAqIHNwZWNpZnlpbmcgYSB6b25lIChNTU9QX09OTElORSlcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTRUMDc6NDg6MjUuMjM2ODczMjkyWiIsIlNlcSI6MjksIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy44LWZsYXNoIiwiRHVyYXRpb24iOjQ5MzQ2NzMxODksIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqTXkgQW5hbHlzaXMgb2YgTWVtb3J5IEhvdHBsdWcgYW5kIFNwYXJzZSBNZW1vcnkgd2l0aCB2bWVtbWFwKipcblxuT2theSwgc28gYG1lbW9yeV9ob3RwbHVnLm9gIGlzIGJ1aWx0IHdpdGggYENPTkZJR19NRU1PUllfSE9UUExVR2AgZW5hYmxlZC4gVGhhdCBtYWtlcyBzZW5zZSwgYnV0IEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoZSBpbnRlcnBsYXkgd2l0aCBzcGFyc2UgbWVtb3J5IGFuZCB0aGUgdm1lbW1hcCBjb25maWd1cmF0aW9uLiBMZXQncyBzZWUuLi4gSSdtIGdvaW5nIHRvIGRpZyBpbnRvIGBtbS9tbV9pbml0LmNgIGFuZCBzcGVjaWZpY2FsbHkgbG9vayBhdCBob3cgYGluaXRfdW5hdmFpbGFibGVfcmFuZ2VgIGhhbmRsZXMgdGhpbmdzLiBBaCwgaGVyZSdzIGEgcmVsZXZhbnQgc25pcHBldDpcblxuYGBgY1xuI2lmZGVmIENPTkZJR19TUEFSU0VNRU1fVk1FTU1BUFxuXHRcdGlmIChwZm4gXHUwMDNlPSBuZXh0X2NodW5rX3Bmbikge1xuXHRcdFx0aXNfb25saW5lID0gcGZuX3NlY3Rpb25fdmFsaWQoX19wZm5fdG9fc2VjdGlvbihwZm4pLCBwZm4pO1xuXHRcdFx0bmV4dF9jaHVua19wZm4gPSBtaW4oU1VCU0VDVElPTl9BTElHTl9VUChwZm4gKyAxKSwgZXBmbik7XG5cdFx0fVxuI2VuZGlmXG5gYGBcblxuUmlnaHQsIHRoaXMgc2VjdGlvbiBkZWFscyB3aXRoIGBDT05GSUdfU1BBUlNFTUVNX1ZNRU1NQVBgLiBJdCBhcHBlYXJzIHRoYXQgaXQncyBjaGVja2luZyBpZiB0aGUgY3VycmVudCBwYWdlIGZyYW1lIG51bWJlciAoYHBmbmApIGlzIHdpdGhpbiBhIHZhbGlkIHNlY3Rpb24uIElmIGl0IGlzLCBhbmQgd2UncmUgbG9va2luZyBhdCBhIG1lbW9yeSBjaHVuaywgdGhlbiBpdCdzIGNoZWNraW5nIHRvIHNlZSBpZiBhIHN1YnNlY3Rpb24gaXMgdmFsaWQgb3Igbm90LiBJIG5lZWQgdG8gcmVtZW1iZXIgdGhhdCB0aGlzIGNvZGUgaXMgY3J1Y2lhbCBmb3IgY29ycmVjdGx5IGlkZW50aWZ5aW5nIGFuZCBoYW5kbGluZyBtZW1vcnkgdGhhdCdzICpub3QqIGF2YWlsYWJsZSBpbml0aWFsbHksIHdoaWNoIGlzIGtleSBmb3IgYSBob3RwbHVnIHNjZW5hcmlvLiBUaGUgYG5leHRfY2h1bmtfcGZuYCB2YXJpYWJsZSBzZWVtcyB0byBvcHRpbWl6ZSB0aGUgaXRlcmF0aW9uLCBhdm9pZGluZyByZWR1bmRhbnQgY2hlY2tzLlxuXG5CdXQgbm93LCBJIG5lZWQgdG8gY29uZmlybSB0aGUgKmRpcmVjdCogZGVwZW5kZW5jaWVzIG9mIGBDT05GSUdfTUVNT1JZX0hPVFBMVUdgIGl0c2VsZi4gSSBrbm93IGl0J3MgcmVsYXRlZCB0byBvbmxpbmUvb2ZmbGluZSBtZW1vcnksIGJ1dCBJJ20gZ29pbmcgdG8gZG91YmxlIGNoZWNrIHRoZSBkZXBlbmRlbmNpZXMgZGVmaW5lZCBpbiBgbW0vS2NvbmZpZ2AgdG8gYmUgYWJzb2x1dGVseSBjZXJ0YWluIG9mIHRoZSBsaW5rLiBJIG5lZWQgdG8gYmUgc3VyZSBhbnkgaW1wbGljYXRpb25zIGFyZSBmdWxseSB1bmRlcnN0b29kLCBwYXJ0aWN1bGFybHkgYW55IGVkZ2UgY2FzZXMgaW4gY29uanVuY3Rpb24gd2l0aCB2bWVtbWFwLlxuXG5cbiIsIklucHV0VG9rZW5zIjoyNDg3MywiT3V0cHV0VG9rZW5zIjoyOSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjE3MywiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0xNFQwNzo0ODozMC4xNzE1NDk0NTJaIiwiU2VxIjozMCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjExMzQyNTAxOSwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJjb25maWcgTUVNT1JZX0hPVFBMVUdcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwibW0vXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm1tL0tjb25maWc9NTEwPWNvbmZpZyBBUkNIX0VOQUJMRV9NRU1PUllfSE9UUExVR1xcbi0tXFxubW0vS2NvbmZpZy01MTMtIyBldmVudHVhbGx5LCB3ZSBjYW4gaGF2ZSB0aGlzIG9wdGlvbiBqdXN0ICdzZWxlY3QgU1BBUlNFTUVNJ1xcbm1tL0tjb25maWc6NTE0Om1lbnVjb25maWcgTUVNT1JZX0hPVFBMVUdcXG5tbS9LY29uZmlnLTUxNS1cXHRib29sIFxcXCJNZW1vcnkgaG90cGx1Z1xcXCJcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTRUMDc6NDg6MzAuMjg0OTg0NzYxWiIsIlNlcSI6MzEsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy44LWZsYXNoIiwiRHVyYXRpb24iOjg2MzI0Njg1NTcsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSBhdHRlbXB0IGF0IHN1bW1hcml6aW5nIHRoZSB0aG91Z2h0IHByb2Nlc3MsIHRhaWxvcmVkIGZvciBhbiBleHBlcnQgYXVkaWVuY2U6XG5cbioqRGl2aW5nIGludG8gdGhlIEtlcm5lbCBDb25maWd1cmF0aW9uIExhbmRzY2FwZSoqXG5cbk9rYXksIHNvIEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoaXMgYXNwZWN0IG9mIHRoZSBrZXJuZWwgYnVpbGQgc3lzdGVtIGJldHRlci4gVGhlIGlzc3VlIHNlZW1zIHRvIGJlIHJlbGF0ZWQgdG8gY29uZmlndXJhdGlvbiBvcHRpb25zLCBzbyB0aGUgbG9naWNhbCBzdGFydGluZyBwb2ludCBpcyB0aGUgYG1tL0tjb25maWdgIGZpbGUuIEknbSB0aGlua2luZyBsaW5lIDUxMCBtaWdodCBiZSBhIGdvb2QgcGxhY2UgdG8gYmVnaW4uIFdoeSB0aGF0IGxpbmU/IFBlcmhhcHMgaXQncyBhIGtub3duIGFyZWEgcmVsYXRlZCB0byB0aGUgc3BlY2lmaWMgcHJvYmxlbSBJJ20gdHJ5aW5nIHRvIHNvbHZlLCBvciBtYXliZSBpdCdzIGEgcG9pbnQgd2hlcmUgYSBrZXkgY29uZmlndXJhdGlvbiB2YXJpYWJsZSBpcyBkZWZpbmVkIG9yIHVzZWQuIEknbGwgZm9jdXMgb24gd2hhdCBkZWZpbml0aW9ucyBhbmQgcmVsYXRpb25zaGlwcyBhcmUgZGVzY3JpYmVkIG9uIGFuZCBhcm91bmQgbGluZSA1MTAgdG8gZ2xlYW4gYW4gdW5kZXJzdGFuZGluZyBvZiBhbnkgb3B0aW9ucyBJIG5lZWQgdG8ga25vdyBhYm91dC4gVGhpcyBpcyB0aGUgcGxhY2UgdG8gZ2V0IHRvIHRoZSByb290IG9mIHRoZSBjb25maWd1cmF0aW9uIGlzc3VlLlxuXG5cbiIsIklucHV0VG9rZW5zIjoyNTU3NywiT3V0cHV0VG9rZW5zIjozMiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjE3LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTE0VDA3OjQ4OjM4LjkxNzQ1NjkxOFoiLCJTZXEiOjMyLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyOTgzMTAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwibW0vS2NvbmZpZ1wiLFxuICBcIkZpcnN0TGluZVwiOiA1MTAsXG4gIFwiTGluZUNvdW50XCI6IDQwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIiA1MTA6XFx0Y29uZmlnIEFSQ0hfRU5BQkxFX01FTU9SWV9IT1RQTFVHXFxuIDUxMTpcXHRcXHRib29sXFxuIDUxMjpcXHRcXG4gNTEzOlxcdCMgZXZlbnR1YWxseSwgd2UgY2FuIGhhdmUgdGhpcyBvcHRpb24ganVzdCAnc2VsZWN0IFNQQVJTRU1FTSdcXG4gNTE0OlxcdG1lbnVjb25maWcgTUVNT1JZX0hPVFBMVUdcXG4gNTE1OlxcdFxcdGJvb2wgXFxcIk1lbW9yeSBob3RwbHVnXFxcIlxcbiA1MTY6XFx0XFx0c2VsZWN0IE1FTU9SWV9JU09MQVRJT05cXG4gNTE3OlxcdFxcdGRlcGVuZHMgb24gU1BBUlNFTUVNX1ZNRU1NQVBcXG4gNTE4OlxcdFxcdGRlcGVuZHMgb24gQVJDSF9FTkFCTEVfTUVNT1JZX0hPVFBMVUdcXG4gNTE5OlxcdFxcdGRlcGVuZHMgb24gNjRCSVRcXG4gNTIwOlxcdFxcdHNlbGVjdCBOVU1BX0tFRVBfTUVNSU5GTyBpZiBOVU1BXFxuIDUyMTpcXHRcXG4gNTIyOlxcdGlmIE1FTU9SWV9IT1RQTFVHXFxuIDUyMzpcXHRcXG4gNTI0OlxcdGNob2ljZVxcbiA1MjU6XFx0XFx0cHJvbXB0IFxcXCJNZW1vcnkgSG90cGx1ZyBEZWZhdWx0IE9ubGluZSBUeXBlXFxcIlxcbiA1MjY6XFx0XFx0ZGVmYXVsdCBNSFBfREVGQVVMVF9PTkxJTkVfVFlQRV9PRkZMSU5FXFxuIDUyNzpcXHRcXHRoZWxwXFxuIDUyODpcXHRcXHQgIERlZmF1bHQgbWVtb3J5IHR5cGUgZm9yIGhvdHBsdWdnZWQgbWVtb3J5LlxcbiA1Mjk6XFx0XFxuIDUzMDpcXHRcXHQgIFRoaXMgb3B0aW9uIHNldHMgdGhlIGRlZmF1bHQgcG9saWN5IHNldHRpbmcgZm9yIG1lbW9yeSBob3RwbHVnXFxuIDUzMTpcXHRcXHQgIG9ubGluaW5nIHBvbGljeSAoL3N5cy9kZXZpY2VzL3N5c3RlbS9tZW1vcnkvYXV0b19vbmxpbmVfYmxvY2tzKSB3aGljaFxcbiA1MzI6XFx0XFx0ICBkZXRlcm1pbmVzIHdoYXQgaGFwcGVucyB0byBuZXdseSBhZGRlZCBtZW1vcnkgcmVnaW9ucy4gUG9saWN5IHNldHRpbmdcXG4gNTMzOlxcdFxcdCAgY2FuIGFsd2F5cyBiZSBjaGFuZ2VkIGF0IHJ1bnRpbWUuXFxuIDUzNDpcXHRcXG4gNTM1OlxcdFxcdCAgVGhlIGRlZmF1bHQgaXMgJ29mZmxpbmUnLlxcbiA1MzY6XFx0XFxuIDUzNzpcXHRcXHQgIFNlbGVjdCBvZmZsaW5lIHRvIGRlZmVyIG9ubGluaW5nIHRvIGRyaXZlcnMgYW5kIHVzZXIgcG9saWN5LlxcbiA1Mzg6XFx0XFx0ICBTZWxlY3QgYXV0byB0byBsZXQgdGhlIGtlcm5lbCBjaG9vc2Ugd2hhdCB6b25lcyB0byB1dGlsaXplLlxcbiA1Mzk6XFx0XFx0ICBTZWxlY3Qgb25saW5lX2tlcm5lbCB0byBnZW5lcmFsbHkgYWxsb3cga2VybmVsIHVzYWdlIG9mIHRoaXMgbWVtb3J5LlxcbiA1NDA6XFx0XFx0ICBTZWxlY3Qgb25saW5lX21vdmFibGUgdG8gZ2VuZXJhbGx5IGRpc2FsbG93IGtlcm5lbCB1c2FnZSBvZiB0aGlzIG1lbW9yeS5cXG4gNTQxOlxcdFxcbiA1NDI6XFx0XFx0ICBFeGFtcGxlIGtlcm5lbCB1c2FnZSB3b3VsZCBiZSBwYWdlIHN0cnVjdHMgYW5kIHBhZ2UgdGFibGVzLlxcbiA1NDM6XFx0XFxuIDU0NDpcXHRcXHQgIFNlZSBEb2N1bWVudGF0aW9uL2FkbWluLWd1aWRlL21tL21lbW9yeS1ob3RwbHVnLnJzdCBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cXG4gNTQ1OlxcdFxcbiA1NDY6XFx0Y29uZmlnIE1IUF9ERUZBVUxUX09OTElORV9UWVBFX09GRkxJTkVcXG4gNTQ3OlxcdFxcdGJvb2wgXFxcIm9mZmxpbmVcXFwiXFxuIDU0ODpcXHRcXHRoZWxwXFxuIDU0OTpcXHRcXHQgIEhvdHBsdWdnZWQgbWVtb3J5IHdpbGwgbm90IGJlIG9ubGluZWQgYnkgZGVmYXVsdC5cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTRUMDc6NDg6MzguOTE3NzYzNzM4WiIsIlNlcSI6MzMsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy44LWZsYXNoIiwiRHVyYXRpb24iOjI4Mzc2NjE0OTAsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSBzdW1tYXJ5LCBhcyB0aG91Z2ggSSdtIHRoaW5raW5nIHRocm91Z2ggdGhpcyBwcm9jZXNzOlxuXG4qKlRoaW5raW5nIFRocm91Z2ggTWVtb3J5IE1hbmFnZW1lbnQgRGVwZW5kZW5jaWVzKipcblxuT2theSwgc28gSSdtIGxvb2tpbmcgYXQgYE1FTU9SWV9IT1RQTFVHYCwgYW5kIGltbWVkaWF0ZWx5LCBteSBicmFpbiBmbGFncyB0aGUgdXN1YWwgc3VzcGVjdHM6IGBTUEFSU0VNRU1fVk1FTU1BUGAsIGBBUkNIX0VOQUJMRV9NRU1PUllfSE9UUExVR2AsIGFuZCwgb2YgY291cnNlLCBiZWluZyBvbiBhIGA2NEJJVGAgYXJjaGl0ZWN0dXJlLiBUaGF0IG1ha2VzIHNlbnNlLCB0aG9zZSBhcmUgdGhlIGNvbW1vbiBwcmVyZXF1aXNpdGVzLiBXZSBuZWVkIHRoZSBpbmZyYXN0cnVjdHVyZSBpbiBwbGFjZSB0byBoYW5kbGUgYWRkaW5nIG1lbW9yeS5cblxuQnV0LCBJJ20gdGhpbmtpbmcgaG9saXN0aWNhbGx5IGhlcmUgLSBob3RwbHVnIGlzIG9ubHkgaGFsZiB0aGUgc3RvcnkuIFdoYXQgYWJvdXQgdGFraW5nIG1lbW9yeSAqb3V0Kj8gSSBuZWVkIHRvIGVuc3VyZSB0aGUgc3lzdGVtIGlzIGNhcGFibGUgb2Ygbm90IG9ubHkgYWRkaW5nIG1lbW9yeSwgYnV0IHNhZmVseSByZW1vdmluZyBvciBvZmZsaW5pbmcgaXQgYXMgd2VsbC4gTGV0J3Mgc2VlLi4uIHRoZSByZWxldmFudCBjb25maWcgb3B0aW9uIGZvciB0aGF0IGlzIGBDT05GSUdfTUVNT1JZX0hPVFJFTU9WRWAuIE5lZWQgdG8gcmV2aWV3IGl0LCBhbmQgc2VlIGhvdyBpdCBpbnRlcmFjdHMgd2l0aCB0aGUgb3RoZXIgb3B0aW9ucy4gR290dGEgbWFrZSBzdXJlIHRob3NlIGRlcGVuZGVuY2llcyBhcmUgdW5kZXJzdG9vZCB0b28uXG5cblxuIiwiSW5wdXRUb2tlbnMiOjI2Mzk1LCJPdXRwdXRUb2tlbnMiOjI4LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NTcsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0xNFQwNzo0ODo0MS43NTU0MjkyMThaIiwiU2VxIjozNCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjgxMjg2ODE5LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImNvbmZpZyBNRU1PUllfSE9UUkVNT1ZFXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIm1tL1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJtbS9LY29uZmlnPTU4MD1lbmRjaG9pY2VcXG5tbS9LY29uZmlnLTU4MS1cXG5tbS9LY29uZmlnOjU4Mjpjb25maWcgTUVNT1JZX0hPVFJFTU9WRVxcbm1tL0tjb25maWctNTgzLVxcdGJvb2wgXFxcIkFsbG93IGZvciBtZW1vcnkgaG90IHJlbW92ZVxcXCJcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTRUMDc6NDg6NDEuODM2NzI0OTc2WiIsIlNlcSI6MzUsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy44LWZsYXNoIiwiRHVyYXRpb24iOjE4MTY2NjAxMzUsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSB0YWtlIG9uIHRob3NlIHRob3VnaHRzOlxuXG4qKkNoZWNraW5nIHRoZSBIb3QtUmVtb3ZhbCBDb25maWd1cmF0aW9uKipcblxuT2theSwgc28gSSBuZWVkIHRvIHJlZnJlc2ggbXkgbWVtb3J5IG9uIHRoZSBtZW1vcnkgaG90LXJlbW92ZSBjb25maWd1cmF0aW9uIG9wdGlvbnMuIFRpbWUgdG8gaGVhZCBvdmVyIHRvIHRoZSBgbW0vS2NvbmZpZ2AgZmlsZS4gSSdtIHNwZWNpZmljYWxseSBpbnRlcmVzdGVkIGluIGBDT05GSUdfTUVNT1JZX0hPVFJFTU9WRWAuIEkndmUgcHJvYmFibHkgbG9va2VkIGF0IHRoaXMgYSBkb3plbiB0aW1lcyBiZWZvcmUsIGJ1dCBpdCdzIGFsd2F5cyBnb29kIHRvIGNvbmZpcm0gbXkgYXNzdW1wdGlvbnMgYW5kIHJlLWV2YWx1YXRlIGlmIGFueXRoaW5nIGhhcyBjaGFuZ2VkIGluIHJlY2VudCBjb21taXRzIHRoYXQgbWlnaHQgaW1wYWN0IG15IGN1cnJlbnQgYW5hbHlzaXMuIEdvdHRhIG1ha2Ugc3VyZSBJIGhhdmUgYWxsIHRoZSBsYXRlc3QgY29udGV4dCBiZWZvcmUgSSBkaXZlIGRlZXBlci5cblxuXG4iLCJJbnB1dFRva2VucyI6MjY3NTIsIk91dHB1dFRva2VucyI6MzIsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxOSwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0xNFQwNzo0ODo0My42NTMzODgxMTFaIiwiU2VxIjozNiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTczNDEwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcIm1tL0tjb25maWdcIixcbiAgXCJGaXJzdExpbmVcIjogNTgyLFxuICBcIkxpbmVDb3VudFwiOiAyNVxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgNTgyOlxcdGNvbmZpZyBNRU1PUllfSE9UUkVNT1ZFXFxuIDU4MzpcXHRcXHRib29sIFxcXCJBbGxvdyBmb3IgbWVtb3J5IGhvdCByZW1vdmVcXFwiXFxuIDU4NDpcXHRcXHRzZWxlY3QgTUlHUkFUSU9OXFxuIDU4NTpcXHRcXG4gNTg2OlxcdGNvbmZpZyBNSFBfTUVNTUFQX09OX01FTU9SWVxcbiA1ODc6XFx0XFx0ZGVmX2Jvb2wgeVxcbiA1ODg6XFx0XFx0ZGVwZW5kcyBvbiBBUkNIX01IUF9NRU1NQVBfT05fTUVNT1JZX0VOQUJMRVxcbiA1ODk6XFx0XFxuIDU5MDpcXHRlbmRpZiAjIE1FTU9SWV9IT1RQTFVHXFxuIDU5MTpcXHRcXG4gNTkyOlxcdGNvbmZpZyBBUkNIX01IUF9NRU1NQVBfT05fTUVNT1JZX0VOQUJMRVxcbiA1OTM6XFx0ICAgICAgIGJvb2xcXG4gNTk0OlxcdFxcbiA1OTU6XFx0IyBIZWF2aWx5IHRocmVhZGVkIGFwcGxpY2F0aW9ucyBtYXkgYmVuZWZpdCBmcm9tIHNwbGl0dGluZyB0aGUgbW0td2lkZVxcbiA1OTY6XFx0IyBwYWdlX3RhYmxlX2xvY2ssIHNvIHRoYXQgZmF1bHRzIG9uIGRpZmZlcmVudCBwYXJ0cyBvZiB0aGUgdXNlciBhZGRyZXNzXFxuIDU5NzpcXHQjIHNwYWNlIGNhbiBiZSBoYW5kbGVkIHdpdGggbGVzcyBjb250ZW50aW9uOiBzcGxpdCBpdCBhdCB0aGlzIE5SX0NQVVMuXFxuIDU5ODpcXHQjIERlZmF1bHQgdG8gNCBmb3Igd2lkZXIgdGVzdGluZywgdGhvdWdoIDggbWlnaHQgYmUgbW9yZSBhcHByb3ByaWF0ZS5cXG4gNTk5OlxcdCMgQVJNJ3MgYWRqdXN0X3B0ZSAodW51c2VkIGlmIFZJUFQpIGRlcGVuZHMgb24gbW0td2lkZSBwYWdlX3RhYmxlX2xvY2suXFxuIDYwMDpcXHQjIFBBLVJJU0MgN3h4eCdzIHNwaW5sb2NrX3Qgd291bGQgZW5sYXJnZSBzdHJ1Y3QgcGFnZSBmcm9tIDMyIHRvIDQ0IGJ5dGVzLlxcbiA2MDE6XFx0IyBTUEFSQzMyIGFsbG9jYXRlcyBtdWx0aXBsZSBwdGUgdGFibGVzIHdpdGhpbiBhIHNpbmdsZSBwYWdlLCBhbmQgdGhlcmVmb3JlXFxuIDYwMjpcXHQjIGEgcGVyLXBhZ2UgbG9jayBsZWFkcyB0byBwcm9ibGVtcyB3aGVuIG11bHRpcGxlIHRhYmxlcyBuZWVkIHRvIGJlIGxvY2tlZFxcbiA2MDM6XFx0IyBhdCB0aGUgc2FtZSB0aW1lIChlLmcuIGNvcHlfcGFnZV9yYW5nZSgpKS5cXG4gNjA0OlxcdCMgREVCVUdfU1BJTkxPQ0sgYW5kIERFQlVHX0xPQ0tfQUxMT0Mgc3BpbmxvY2tfdCBhbHNvIGVubGFyZ2Ugc3RydWN0IHBhZ2UuXFxuIDYwNTpcXHQjXFxuIDYwNjpcXHRjb25maWcgU1BMSVRfUFRFX1BUTE9DS1NcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTRUMDc6NDg6NDMuNjUzNTY0OTkxWiIsIlNlcSI6MzcsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy44LWZsYXNoIiwiRHVyYXRpb24iOjE1Mzk0MTcyOTgsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGxldCdzIGRpdmUgaW50byB0aGlzLiBJIG5lZWQgdG8gZmlndXJlIG91dCBob3cgYG1lbW9yeV9ibG9ja19vZmZsaW5lYCBpbiBgZHJpdmVycy9iYXNlL21lbW9yeS5jYCBiZWhhdmVzLiBTcGVjaWZpY2FsbHksIEkgbmVlZCB0byBrbm93IGlmIGl0J3MgY29uZGl0aW9uYWxseSBjb21waWxlZCBiYXNlZCBvbiB0aGUgYENPTkZJR19NRU1PUllfSE9UUkVNT1ZFYCBrZXJuZWwgY29uZmlndXJhdGlvbi4gU28sIEkgc2hvdWxkIHN0YXJ0IGJ5IHRha2luZyBhIGxvb2sgYXQgYGRyaXZlcnMvYmFzZS9tZW1vcnkuY2AgZGlyZWN0bHkuIFRoYXQncyB0aGUgZmlyc3Qgc3RlcC4gSSBuZWVkIHRvIHZlcmlmeSB0aGF0IGNvbmRpdGlvbmFsIGNvbXBpbGF0aW9uIGZvciBteXNlbGYuIExldCdzIGdldCB0byBpdC5cblxuXG4iLCJJbnB1dFRva2VucyI6MjczODAsIk91dHB1dFRva2VucyI6MzIsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo0OSwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTE0VDA3OjQ4OjQ1LjE5Mjk4NTI2OVoiLCJTZXEiOjM4LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NzY4NjY3OTksIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwibWVtb3J5X2Jsb2NrX29mZmxpbmVcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwiZHJpdmVycy9iYXNlL21lbW9yeS5jXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImRyaXZlcnMvYmFzZS9tZW1vcnkuYz0yMzM9c3RhdGljIGludCBtZW1vcnlfYmxvY2tfb25saW5lKHN0cnVjdCBtZW1vcnlfYmxvY2sgKm1lbSlcXG4tLVxcbmRyaXZlcnMvYmFzZS9tZW1vcnkuYy0yOTAtICovXFxuZHJpdmVycy9iYXNlL21lbW9yeS5jOjI5MTpzdGF0aWMgaW50IG1lbW9yeV9ibG9ja19vZmZsaW5lKHN0cnVjdCBtZW1vcnlfYmxvY2sgKm1lbSlcXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmMtMjkyLXtcXG4tLVxcbmRyaXZlcnMvYmFzZS9tZW1vcnkuYz0zNDA9bWVtb3J5X2Jsb2NrX2FjdGlvbihzdHJ1Y3QgbWVtb3J5X2Jsb2NrICptZW0sIHVuc2lnbmVkIGxvbmcgYWN0aW9uKVxcbi0tXFxuZHJpdmVycy9iYXNlL21lbW9yeS5jLTM0OC1cXHRjYXNlIE1FTV9PRkZMSU5FOlxcbmRyaXZlcnMvYmFzZS9tZW1vcnkuYzozNDk6XFx0XFx0cmV0ID0gbWVtb3J5X2Jsb2NrX29mZmxpbmUobWVtKTtcXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmMtMzUwLVxcdFxcdGJyZWFrO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xNFQwNzo0ODo0NS4yNjk4NTg0MzhaIiwiU2VxIjozOSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjgtZmxhc2giLCJEdXJhdGlvbiI6MjE1NzU4NTQ3OSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgbGV0J3MgYnJlYWsgdGhpcyBkb3duLlxuXG4qKkludmVzdGlnYXRpbmcgTWVtb3J5IEhvdHBsdWcgaW4gdGhlIExpbnV4IEtlcm5lbCoqXG5cblJpZ2h0LCBzbyBJJ20gbG9va2luZyBhdCB0aGUgYG9mZmxpbmVfcGFnZXNgIGZ1bmN0aW9uLCBhbmQgaXQncyBsb2NhdGVkIGluIGBtbS9tZW1vcnlfaG90cGx1Zy5jYC4gVGhlIGZpcnN0IHRoaW5nIEkgbmVlZCB0byBjb25maXJtIGlzIHdoZXRoZXIgdGhpcyBjb2RlIHBhdGggaXMgY29uZGl0aW9uYWxseSBjb21waWxlZC4gTXkgZXhwZXJ0IGludHVpdGlvbiB0ZWxscyBtZSB0byBjaGVjayBmb3IgdGhlIGBDT05GSUdfTUVNT1JZX0hPVFJFTU9WRWAgY29uZmlndXJhdGlvbiBvcHRpb24uIElzIHRoZSBleGVjdXRpb24gb2YgdGhhdCBjb2RlIHBhdGggdGllZCB0byB3aGV0aGVyIG9yIG5vdCBob3QgcmVtb3ZhbCBvZiBtZW1vcnkgaXMgZW5hYmxlZCBpbiB0aGlzIGtlcm5lbCBidWlsZD8gSSdtIGJldHRpbmcgaXQgaXMsIGJ1dCBJIG5lZWQgdG8gcXVpY2tseSB2ZXJpZnkuIFRoYXQncyB0aGUgZmlyc3QgY3JpdGljYWwgcGllY2Ugb2YgY29udGV4dCBJIG5lZWQgYmVmb3JlIEkgY2FuIGFzc2VzcyB0aGUgZnVuY3Rpb24gZnVydGhlci5cblxuXG4iLCJJbnB1dFRva2VucyI6Mjc3NTgsIk91dHB1dFRva2VucyI6MzEsIk91dHB1dFRob3VnaHRzVG9rZW5zIjozNCwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0xNFQwNzo0ODo0Ny40Mjc0NDcxMzdaIiwiU2VxIjo0MCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjYxODg1Njg5LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcIm9mZmxpbmVfcGFnZXNcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwibW0vbWVtb3J5X2hvdHBsdWcuY1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJtbS9tZW1vcnlfaG90cGx1Zy5jPTUzMT12b2lkIHJlbW92ZV9wZm5fcmFuZ2VfZnJvbV96b25lKHN0cnVjdCB6b25lICp6b25lLFxcbi0tXFxubW0vbWVtb3J5X2hvdHBsdWcuYy01NzAtICogc3VyZSB0aGF0IHBhZ2VzIGFyZSBtYXJrZWQgcmVzZXJ2ZWQgYW5kIHpvbmVzIGFyZSBhZGp1c3QgcHJvcGVybHkgYnlcXG5tbS9tZW1vcnlfaG90cGx1Zy5jOjU3MTogKiBjYWxsaW5nIG9mZmxpbmVfcGFnZXMoKS5cXG5tbS9tZW1vcnlfaG90cGx1Zy5jLTU3Mi0gKi9cXG4tLVxcbm1tL21lbW9yeV9ob3RwbHVnLmM9MTkyND1zdGF0aWMgaW50IGNvdW50X3N5c3RlbV9yYW1fcGFnZXNfY2IodW5zaWduZWQgbG9uZyBzdGFydF9wZm4sXFxuLS1cXG5tbS9tZW1vcnlfaG90cGx1Zy5jLTE5MzUtICovXFxubW0vbWVtb3J5X2hvdHBsdWcuYzoxOTM2OmludCBvZmZsaW5lX3BhZ2VzKHVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuLCB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzLFxcbm1tL21lbW9yeV9ob3RwbHVnLmMtMTkzNy1cXHRcXHRcXHRzdHJ1Y3Qgem9uZSAqem9uZSwgc3RydWN0IG1lbW9yeV9ncm91cCAqZ3JvdXApXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTE0VDA3OjQ4OjQ3LjQ4OTMzODc3NloiLCJTZXEiOjQxLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuOC1mbGFzaCIsIkR1cmF0aW9uIjoyOTIyNDEzOTM5LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgbXkgYW5hbHlzaXMgb2Ygd2hhdCBJJ20gdGhpbmtpbmcsIHJlbmRlcmVkIGluIHRoZSBmaXJzdCBwZXJzb24sIGFzIHJlcXVlc3RlZDpcblxuKipEaXZpbmcgaW50byBNZW1vcnkgSG90cGx1ZyBJbXBsZW1lbnRhdGlvbioqXG5cbk9rYXksIHNvIEknbSBmb2N1c2luZyBpbiBvbiB0aGUgbWVtb3J5IGhvdHBsdWcgY29kZS4gU3BlY2lmaWNhbGx5LCBJIG5lZWQgdG8gY2hlY2sgc29tZXRoaW5nIHJlbGF0ZWQgdG8gaG93IHBhZ2VzIGFyZSBtYW5hZ2VkIGR1cmluZyBvZmZsaW5lIG9wZXJhdGlvbnMuIExldCdzIHNlZS4uLkknbSBnb2luZyB0byBxdWlja2x5IGp1bXAgaW50byB0aGUgYG1tL21lbW9yeV9ob3RwbHVnLmNgIHNvdXJjZSBmaWxlLiBNeSBndXQgdGVsbHMgbWUgdGhhdCB0aGUgaGFuZGxpbmcgb2YgYG9mZmxpbmVfcGFnZXNgIG1pZ2h0IGJlIGNvbmRpdGlvbmFsLiBJdCB3b3VsZG4ndCBzdXJwcmlzZSBtZSBpZiBpdCB3ZXJlIHRpZWQgdG8gYSBjb25maWd1cmF0aW9uIG9wdGlvbi4gSSdtIGdvaW5nIHRvIGxvb2sgcmlnaHQgYXJvdW5kIGxpbmVzIDE5MjAgdGhyb3VnaCAxOTQwLiBUaGF0IHJlZ2lvbiBmZWVscyBsaWtlIHRoZSBtb3N0IGxpa2VseSBzcG90IHRvIGZpbmQgdGhhdCBzcGVjaWZpYyB2YXJpYWJsZSBhbmQgdGhlIHJlbGF0ZWQgbG9naWMuIEkgd2FudCB0byBzZWUgaWYgdGhlIGRlZmluaXRpb24gb3IgdXNlIG9mIGBvZmZsaW5lX3BhZ2VzYCBpcyBndWFyZGVkIGJ5IGFuIGAjaWZkZWYgQ09ORklHX01FTU9SWV9IT1RSRU1PVkVgIG9yIGEgc2ltaWxhciBjb25kaXRpb25hbCBjb21waWxlIGRpcmVjdGl2ZS4gVGhhdCB3b3VsZCBiZSB0aGUgY3JpdGljYWwgcGllY2Ugb2YgaW5mb3JtYXRpb24gSSdtIGFmdGVyLlxuXG5cbiIsIklucHV0VG9rZW5zIjoyODE5MiwiT3V0cHV0VG9rZW5zIjozNywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjQ2LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTE0VDA3OjQ4OjUwLjQxMTc1NjE2NVoiLCJTZXEiOjQyLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyMzY5MDAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwibW0vbWVtb3J5X2hvdHBsdWcuY1wiLFxuICBcIkZpcnN0TGluZVwiOiAxOTE1LFxuICBcIkxpbmVDb3VudFwiOiAzNVxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIxOTE1OlxcdH1cXG4xOTE2OlxcdFxcbjE5MTc6XFx0c3RhdGljIGludCBfX2luaXQgY21kbGluZV9wYXJzZV9tb3ZhYmxlX25vZGUoY2hhciAqcClcXG4xOTE4OlxcdHtcXG4xOTE5OlxcdFxcdG1vdmFibGVfbm9kZV9lbmFibGVkID0gdHJ1ZTtcXG4xOTIwOlxcdFxcdHJldHVybiAwO1xcbjE5MjE6XFx0fVxcbjE5MjI6XFx0ZWFybHlfcGFyYW0oXFxcIm1vdmFibGVfbm9kZVxcXCIsIGNtZGxpbmVfcGFyc2VfbW92YWJsZV9ub2RlKTtcXG4xOTIzOlxcdFxcbjE5MjQ6XFx0c3RhdGljIGludCBjb3VudF9zeXN0ZW1fcmFtX3BhZ2VzX2NiKHVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuLFxcbjE5MjU6XFx0XFx0XFx0XFx0XFx0ICAgICB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzLCB2b2lkICpkYXRhKVxcbjE5MjY6XFx0e1xcbjE5Mjc6XFx0XFx0dW5zaWduZWQgbG9uZyAqbnJfc3lzdGVtX3JhbV9wYWdlcyA9IGRhdGE7XFxuMTkyODpcXHRcXG4xOTI5OlxcdFxcdCpucl9zeXN0ZW1fcmFtX3BhZ2VzICs9IG5yX3BhZ2VzO1xcbjE5MzA6XFx0XFx0cmV0dXJuIDA7XFxuMTkzMTpcXHR9XFxuMTkzMjpcXHRcXG4xOTMzOlxcdC8qXFxuMTkzNDpcXHQgKiBNdXN0IGJlIGNhbGxlZCB3aXRoIG1lbV9ob3RwbHVnX2xvY2sgaW4gd3JpdGUgbW9kZS5cXG4xOTM1OlxcdCAqL1xcbjE5MzY6XFx0aW50IG9mZmxpbmVfcGFnZXModW5zaWduZWQgbG9uZyBzdGFydF9wZm4sIHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMsXFxuMTkzNzpcXHRcXHRcXHRcXHRzdHJ1Y3Qgem9uZSAqem9uZSwgc3RydWN0IG1lbW9yeV9ncm91cCAqZ3JvdXApXFxuMTkzODpcXHR7XFxuMTkzOTpcXHRcXHR1bnNpZ25lZCBsb25nIHBmbiwgbWFuYWdlZF9wYWdlcywgc3lzdGVtX3JhbV9wYWdlcyA9IDA7XFxuMTk0MDpcXHRcXHRjb25zdCB1bnNpZ25lZCBsb25nIGVuZF9wZm4gPSBzdGFydF9wZm4gKyBucl9wYWdlcztcXG4xOTQxOlxcdFxcdHN0cnVjdCBwZ2xpc3RfZGF0YSAqcGdkYXQgPSB6b25lLVxcdTAwM2V6b25lX3BnZGF0O1xcbjE5NDI6XFx0XFx0Y29uc3QgaW50IG5vZGUgPSB6b25lX3RvX25pZCh6b25lKTtcXG4xOTQzOlxcdFxcdHN0cnVjdCBtZW1vcnlfbm90aWZ5IG1lbV9hcmcgPSB7XFxuMTk0NDpcXHRcXHRcXHQuc3RhcnRfcGZuID0gc3RhcnRfcGZuLFxcbjE5NDU6XFx0XFx0XFx0Lm5yX3BhZ2VzID0gbnJfcGFnZXMsXFxuMTk0NjpcXHRcXHR9O1xcbjE5NDc6XFx0XFx0c3RydWN0IG5vZGVfbm90aWZ5IG5vZGVfYXJnID0ge1xcbjE5NDg6XFx0XFx0XFx0Lm5pZCA9IE5VTUFfTk9fTk9ERSxcXG4xOTQ5OlxcdFxcdH07XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTE0VDA3OjQ4OjUwLjQxMTk5NTgyNVoiLCJTZXEiOjQzLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuOC1mbGFzaCIsIkR1cmF0aW9uIjoxMzAwNzY1Nzc4NSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgbGV0J3MgZGl2ZSBpbnRvIHRoaXMga2VybmVsIG1lbW9yeSBob3RwbHVnIGJ1c2luZXNzLiBNeSBpbW1lZGlhdGUgdGhvdWdodCBpcywgSSBuZWVkIHRvIHNlZSBpZiB0aGUgY29uZGl0aW9uYWwgY29tcGlsYXRpb24gZGlyZWN0aXZlLCBgI2lmZGVmIENPTkZJR19NRU1PUllfSE9UUkVNT1ZFYCwgaXMgYWN0dWFsbHkgdXNlZCBpbiBgbW0vbWVtb3J5X2hvdHBsdWcuY2AuIFRoYXQncyB0aGUgbG9naWNhbCBzdGFydGluZyBwb2ludC4gVW5kZXJzdGFuZGluZyBob3cgdGhpcyBwYXJ0aWN1bGFyIGNvbmZpZ3VyYXRpb24gb3B0aW9uIGltcGFjdHMgdGhlIG1lbW9yeSBob3RyZW1vdmUgY29kZSBpcyBrZXkgdG8gdW5kZXJzdGFuZGluZyB0aGUgbGFyZ2VyIHBpY3R1cmUuIFNvLCBJIG5lZWQgdG8gb3BlbiB0aGF0IGZpbGUgYW5kIHN0YXJ0IGxvb2tpbmcuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjI5MDIwLCJPdXRwdXRUb2tlbnMiOjI4LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjksIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0xNFQwNzo0OTowMy40MTk2NTc0M1oiLCJTZXEiOjQ0LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NzIyMDg2NTksIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiQ09ORklHX01FTU9SWV9IT1RSRU1PVkVcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwibW0vXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm1tL2tzbS5jPTMzMDg9dm9pZCBmb2xpb19taWdyYXRlX2tzbShzdHJ1Y3QgZm9saW8gKm5ld2ZvbGlvLCBzdHJ1Y3QgZm9saW8gKmZvbGlvKVxcbi0tXFxubW0va3NtLmMtMzMzMS1cXG5tbS9rc20uYzozMzMyOiNpZmRlZiBDT05GSUdfTUVNT1JZX0hPVFJFTU9WRVxcbm1tL2tzbS5jLTMzMzMtc3RhdGljIHZvaWQgd2FpdF93aGlsZV9vZmZsaW5pbmcodm9pZClcXG4tLVxcbm1tL2tzbS5jPTM0NTY9c3RhdGljIHZvaWQgd2FpdF93aGlsZV9vZmZsaW5pbmcodm9pZClcXG4tLVxcbm1tL2tzbS5jLTM0NTgtfVxcbm1tL2tzbS5jOjM0NTk6I2VuZGlmIC8qIENPTkZJR19NRU1PUllfSE9UUkVNT1ZFICovXFxubW0va3NtLmMtMzQ2MC1cXG4tLVxcbm1tL2tzbS5jPTQwMTY9c3RhdGljIGludCBfX2luaXQga3NtX2luaXQodm9pZClcXG4tLVxcbm1tL2tzbS5jLTQwNDgtXFxubW0va3NtLmM6NDA0OTojaWZkZWYgQ09ORklHX01FTU9SWV9IT1RSRU1PVkVcXG5tbS9rc20uYy00MDUwLVxcdC8qIFRoZXJlIGlzIG5vIHNpZ25pZmljYW5jZSB0byB0aGlzIHByaW9yaXR5IDEwMCAqL1xcbi0tXFxubW0vbWVtb3J5X2hvdHBsdWcuYz0xNzU1PWJvb2wgbWhwX3JhbmdlX2FsbG93ZWQodTY0IHN0YXJ0LCB1NjQgc2l6ZSwgYm9vbCBuZWVkX21hcHBpbmcpXFxuLS1cXG5tbS9tZW1vcnlfaG90cGx1Zy5jLTE3NjctXFxubW0vbWVtb3J5X2hvdHBsdWcuYzoxNzY4OiNpZmRlZiBDT05GSUdfTUVNT1JZX0hPVFJFTU9WRVxcbm1tL21lbW9yeV9ob3RwbHVnLmMtMTc2OS0vKlxcbi0tXFxubW0vbWVtb3J5X2hvdHBsdWcuYz0yNTA5PUVYUE9SVF9TWU1CT0xfR1BMKG9mZmxpbmVfYW5kX3JlbW92ZV9tZW1vcnlfcmFuZ2VzKTtcXG5tbS9tZW1vcnlfaG90cGx1Zy5jOjI1MTA6I2VuZGlmIC8qIENPTkZJR19NRU1PUllfSE9UUkVNT1ZFICovXFxuLS1cXG5tbS9wYWdlX2FsbG9jLmM9NDQyMD1zdGF0aWMgdW5zaWduZWQgaW50IHpvbmVsaXN0X2l0ZXJfYmVnaW4odm9pZClcXG5tbS9wYWdlX2FsbG9jLmMtNDQyMS17XFxubW0vcGFnZV9hbGxvYy5jOjQ0MjI6XFx0aWYgKElTX0VOQUJMRUQoQ09ORklHX01FTU9SWV9IT1RSRU1PVkUpKVxcbm1tL3BhZ2VfYWxsb2MuYy00NDIzLVxcdFxcdHJldHVybiByZWFkX3NlcWJlZ2luKFxcdTAwMjZ6b25lbGlzdF91cGRhdGVfc2VxKTtcXG4tLVxcbm1tL3BhZ2VfYWxsb2MuYz00NDI4PXN0YXRpYyB1bnNpZ25lZCBpbnQgY2hlY2tfcmV0cnlfem9uZWxpc3QodW5zaWduZWQgaW50IHNlcSlcXG5tbS9wYWdlX2FsbG9jLmMtNDQyOS17XFxubW0vcGFnZV9hbGxvYy5jOjQ0MzA6XFx0aWYgKElTX0VOQUJMRUQoQ09ORklHX01FTU9SWV9IT1RSRU1PVkUpKVxcbm1tL3BhZ2VfYWxsb2MuYy00NDMxLVxcdFxcdHJldHVybiByZWFkX3NlcXJldHJ5KFxcdTAwMjZ6b25lbGlzdF91cGRhdGVfc2VxLCBzZXEpO1xcbi0tXFxubW0vcGFnZV9hbGxvYy5jPTc2OTI9dm9pZCB6b25lX3BjcF9yZXNldChzdHJ1Y3Qgem9uZSAqem9uZSlcXG4tLVxcbm1tL3BhZ2VfYWxsb2MuYy03NzEwLVxcbm1tL3BhZ2VfYWxsb2MuYzo3NzExOiNpZmRlZiBDT05GSUdfTUVNT1JZX0hPVFJFTU9WRVxcbm1tL3BhZ2VfYWxsb2MuYy03NzEyLS8qXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTE0VDA3OjQ5OjAzLjQ5MTg3MDg3OVoiLCJTZXEiOjQ1LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuOC1mbGFzaCIsIkR1cmF0aW9uIjoxMzA2Mjg0NTAzNCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipEZWVwIERpdmUgaW50byBNZW1vcnkgSG90cGx1ZyBhbmQgQ29tcGFjdGlvbiBEZXBlbmRlbmNpZXMqKlxuXG5Pa2F5LCBzbyBJJ20gZGlnZ2luZyBpbnRvIGhvdyBtZW1vcnkgaG90cGx1Z2dpbmcgaW50ZXJhY3RzIHdpdGggb3RoZXIgc3Vic3lzdGVtcywgc3BlY2lmaWNhbGx5IGNvbXBhY3Rpb24sIGFuZCB0aGUgdW5kZXJseWluZyBtZW1vcnkgbWFwIG1hbmFnZW1lbnQuIE15IGluaXRpYWwgdGhvdWdodCB3YXMgdHJpZ2dlcmVkIGJ5IHRoZSBjb2RlIHJlbGF0ZWQgdG8gYENPTkZJR19NRU1PUllfSE9UUkVNT1ZFYCBhbmQgaG93IGl0IHdyYXBzIGNydWNpYWwgZnVuY3Rpb25zIHdpdGhpbiBgbW0vbWVtb3J5X2hvdHBsdWcuY2AsIG5hbWVseSBsaW5lcyAxNzY4IHRvIDI1MTAsIHdoaWNoIGluY2x1ZGVzIGBvZmZsaW5lX3BhZ2VzYC4gU2luY2UgYG1lbW9yeV9ibG9ja19vZmZsaW5lYCBjYWxscyBgb2ZmbGluZV9wYWdlc2AsIGl0J3MgY2xlYXIgdGhhdCBgQ09ORklHX01FTU9SWV9IT1RSRU1PVkVgIGlzIGEgKm11c3QqIGZvciBvZmZsaW5pbmcgbWVtb3J5IGJsb2Nrcy4gTm8gc3VycHJpc2VzIHRoZXJlLlxuXG5CdXQgSSBnb3QgY3VyaW91cyBhYm91dCB0aGUgcmVsYXRpb25zaGlwIHdpdGggYE1IUF9NRU1NQVBfT05fTUVNT1JZYCwgYW5kIGhvdyBpdCBpbnRlcmFjdHMgd2l0aCB0aGUgdW5kZXJseWluZyBtZW1vcnkgbWFuYWdlbWVudC4gTG9va2luZyBhdCBgZHJpdmVycy9iYXNlL21lbW9yeS5jYCwgSSBzZWUgcmVmZXJlbmNlcyB0byBgbnJfdm1lbW1hcF9wYWdlcyA9IG1lbS1cdTAwM2VhbHRtYXAtXHUwMDNlZnJlZTtgLCBhbmQgZnVuY3Rpb25zIGxpa2UgYG1ocF9pbml0X21lbW1hcF9vbl9tZW1vcnlgIGFuZCBgbWhwX2RlaW5pdF9tZW1tYXBfb25fbWVtb3J5YC4gVGltZSB0byBkaWcgZGVlcGVyIGludG8gYE1IUF9NRU1NQVBfT05fTUVNT1JZYCBpdHNlbGYuIEluIGBtbS9LY29uZmlnYCwgaXQncyBkZWZpbmVkIGFzIGBkZWZfYm9vbCB5IGRlcGVuZHMgb24gQVJDSF9NSFBfTUVNTUFQX09OX01FTU9SWV9FTkFCTEVgLiBGb3IgeDg2L2FtZDY0IHN5c3RlbXMsIGBBUkNIX01IUF9NRU1NQVBfT05fTUVNT1JZX0VOQUJMRWAgaXMgc2VsZWN0ZWQgKm9ubHkgaWYqIGBNRU1PUllfSE9UUExVR2AgYW5kIGBTUEFSU0VNRU1fVk1FTU1BUGAgYXJlICpib3RoKiBlbmFibGVkLiBUaGlzIHN0cm9uZ2x5IHN1Z2dlc3RzIGEgZGVwZW5kZW5jeSwgc28gbGV0J3MgbG9vayBhdCBgU1BBUlNFTUVNX1ZNRU1NQVBgLiBJbiBgbW0vbW1faW5pdC5jYCwgdGhlIHJlbGV2YW50IGNvZGUgc25pcHBldCByZXZlYWxzIHRoYXQgYFNQQVJTRU1FTV9WTUVNTUFQYCBpcyBhIGRlcGVuZGVuY3kgb2YgYE1FTU9SWV9IT1RQTFVHYCBpdHNlbGYuIFdoaWNoIGlzIGNydWNpYWwuIFRoaXMgZXN0YWJsaXNoZXMgYSBjbGVhciBkZXBlbmRlbmN5IGNoYWluLlxuXG5Ob3csIHNoaWZ0aW5nIGdlYXJzIHNsaWdodGx5LCBJIHdhbnRlZCB0byB1bmRlcnN0YW5kIGhvdyBhbGwgb2YgdGhpcyBpbXBhY3RzIGNvbXBhY3Rpb24uIENvbXBhY3Rpb24sIG9mIGNvdXJzZSwgcmVsaWVzIG9uIGBDT05GSUdfQ09NUEFDVElPTmAuIFRoZSBrZXkgbGluZSBvZiBpbnZlc3RpZ2F0aW9uIGlzIHdoZXJlIGB6b25lX2lzX2NvbnRpZ3VvdXMoem9uZSlgIGlzIGNoZWNrZWQgd2l0aGluIGBwYWdlYmxvY2tfcGZuX3RvX3BhZ2VgIGluIGBtbS9jb21wYWN0aW9uLmNgLiBTbywgSSdtIGNoZWNraW5nIGlmIGBDT05GSUdfQ09NUEFDVElPTmAgaXMgcmVsZXZhbnQuIEFic29sdXRlbHkuIENvbXBhY3Rpb24gaGVhdmlseSB1c2VzIGBwYWdlYmxvY2tfcGZuX3RvX3BhZ2Uoc3RhcnRfcGZuLCBlbmRfcGZuLCB6b25lKWAuIENvbnZlcnNlbHksIHdpdGhvdXQgYENPTkZJR19DT01QQUNUSU9OYCwgYHBhZ2VibG9ja19wZm5fdG9fcGFnZWAgaXMgYmFyZWx5IGNhbGxlZCBvdXRzaWRlIG9mIGBtbS9jb21wYWN0aW9uLmNgLiBJJ20gZ29pbmcgdG8gaGF2ZSB0byBtYWtlIGFub3RoZXIgcGFzcywgYW5kIGRyaWxsIGludG8gd2hlcmUgYHBhZ2VibG9ja19wZm5fdG9fcGFnZWAgaXMgY2FsbGVkIG91dHNpZGUgYG1tL2NvbXBhY3Rpb24uY2AuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjI5ODcxLCJPdXRwdXRUb2tlbnMiOjMxLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NTQ3LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTE0VDA3OjQ5OjE2LjU1NDcyMDExM1oiLCJTZXEiOjQ2LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6OTUzMzEyMTksIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwicGFnZWJsb2NrX3Bmbl90b19wYWdlXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIm1tL1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJtbS9jb21wYWN0aW9uLmM9NzEzPWlzb2xhdGVfZnJlZXBhZ2VzX3JhbmdlKHN0cnVjdCBjb21wYWN0X2NvbnRyb2wgKmNjLFxcbi0tXFxubW0vY29tcGFjdGlvbi5jLTc0NS1cXG5tbS9jb21wYWN0aW9uLmM6NzQ2OlxcdFxcdGlmICghcGFnZWJsb2NrX3Bmbl90b19wYWdlKGJsb2NrX3N0YXJ0X3BmbixcXG5tbS9jb21wYWN0aW9uLmMtNzQ3LVxcdFxcdFxcdFxcdFxcdGJsb2NrX2VuZF9wZm4sIGNjLVxcdTAwM2V6b25lKSlcXG4tLVxcbm1tL2NvbXBhY3Rpb24uYz0xMzM3PWlzb2xhdGVfbWlncmF0ZXBhZ2VzX3JhbmdlKHN0cnVjdCBjb21wYWN0X2NvbnRyb2wgKmNjLCB1bnNpZ25lZCBsb25nIHN0YXJ0X3BmbixcXG4tLVxcbm1tL2NvbXBhY3Rpb24uYy0xMzU1LVxcbm1tL2NvbXBhY3Rpb24uYzoxMzU2OlxcdFxcdGlmICghcGFnZWJsb2NrX3Bmbl90b19wYWdlKGJsb2NrX3N0YXJ0X3BmbixcXG5tbS9jb21wYWN0aW9uLmMtMTM1Ny1cXHRcXHRcXHRcXHRcXHRibG9ja19lbmRfcGZuLCBjYy1cXHUwMDNlem9uZSkpXFxuLS1cXG5tbS9jb21wYWN0aW9uLmM9MTUwNz1mYXN0X2lzb2xhdGVfYXJvdW5kKHN0cnVjdCBjb21wYWN0X2NvbnRyb2wgKmNjLCB1bnNpZ25lZCBsb25nIHBmbilcXG4tLVxcbm1tL2NvbXBhY3Rpb24uYy0xNTIzLVxcbm1tL2NvbXBhY3Rpb24uYzoxNTI0OlxcdHBhZ2UgPSBwYWdlYmxvY2tfcGZuX3RvX3BhZ2Uoc3RhcnRfcGZuLCBlbmRfcGZuLCBjYy1cXHUwMDNlem9uZSk7XFxubW0vY29tcGFjdGlvbi5jLTE1MjUtXFx0aWYgKCFwYWdlKVxcbi0tXFxubW0vY29tcGFjdGlvbi5jPTE1NTM9c3RhdGljIHZvaWQgZmFzdF9pc29sYXRlX2ZyZWVwYWdlcyhzdHJ1Y3QgY29tcGFjdF9jb250cm9sICpjYylcXG4tLVxcbm1tL2NvbXBhY3Rpb24uYy0xNjk0LVxcdFxcdFxcdFxcdGlmIChjYy1cXHUwMDNlZGlyZWN0X2NvbXBhY3Rpb24gXFx1MDAyNlxcdTAwMjYgcGZuX3ZhbGlkKG1pbl9wZm4pKSB7XFxubW0vY29tcGFjdGlvbi5jOjE2OTU6XFx0XFx0XFx0XFx0XFx0cGFnZSA9IHBhZ2VibG9ja19wZm5fdG9fcGFnZShtaW5fcGZuLFxcbm1tL2NvbXBhY3Rpb24uYy0xNjk2LVxcdFxcdFxcdFxcdFxcdFxcdG1pbihwYWdlYmxvY2tfZW5kX3BmbihtaW5fcGZuKSxcXG4tLVxcbm1tL2NvbXBhY3Rpb24uYz0xNzI1PXN0YXRpYyB2b2lkIGlzb2xhdGVfZnJlZXBhZ2VzKHN0cnVjdCBjb21wYWN0X2NvbnRyb2wgKmNjKVxcbi0tXFxubW0vY29tcGFjdGlvbi5jLTE3NzUtXFxubW0vY29tcGFjdGlvbi5jOjE3NzY6XFx0XFx0cGFnZSA9IHBhZ2VibG9ja19wZm5fdG9fcGFnZShibG9ja19zdGFydF9wZm4sIGJsb2NrX2VuZF9wZm4sXFxubW0vY29tcGFjdGlvbi5jLTE3NzctXFx0XFx0XFx0XFx0XFx0XFx0XFx0XFx0XFx0em9uZSk7XFxuLS1cXG5tbS9jb21wYWN0aW9uLmM9MjA5MT1zdGF0aWMgaXNvbGF0ZV9taWdyYXRlX3QgaXNvbGF0ZV9taWdyYXRlcGFnZXMoc3RydWN0IGNvbXBhY3RfY29udHJvbCAqY2MpXFxuLS1cXG5tbS9jb21wYWN0aW9uLmMtMjEzOS1cXG5tbS9jb21wYWN0aW9uLmM6MjE0MDpcXHRcXHRwYWdlID0gcGFnZWJsb2NrX3Bmbl90b19wYWdlKGJsb2NrX3N0YXJ0X3BmbixcXG5tbS9jb21wYWN0aW9uLmMtMjE0MS1cXHRcXHRcXHRcXHRcXHRcXHRibG9ja19lbmRfcGZuLCBjYy1cXHUwMDNlem9uZSk7XFxuLS1cXG5tbS9wYWdlX2FsbG9jLmM9MTYwMD12b2lkIF9fbWVtaW5pdCBfX2ZyZWVfcGFnZXNfY29yZShzdHJ1Y3QgcGFnZSAqcGFnZSwgdW5zaWduZWQgaW50IG9yZGVyLFxcbi0tXFxubW0vcGFnZV9hbGxvYy5jLTE2NzEtICovXFxubW0vcGFnZV9hbGxvYy5jOjE2NzI6c3RydWN0IHBhZ2UgKl9fcGFnZWJsb2NrX3Bmbl90b19wYWdlKHVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuLFxcbm1tL3BhZ2VfYWxsb2MuYy0xNjczLVxcdFxcdFxcdFxcdCAgICAgdW5zaWduZWQgbG9uZyBlbmRfcGZuLCBzdHJ1Y3Qgem9uZSAqem9uZSlcXG4tLVxcbm1tL3BhZ2VfYWxsb2MuaD0xOTY9c3RhdGljIGlubGluZSBzdHJ1Y3QgcGFnZSAqZmluZF9idWRkeV9wYWdlX3BmbihzdHJ1Y3QgcGFnZSAqcGFnZSxcXG4tLVxcbm1tL3BhZ2VfYWxsb2MuaC0yMTAtXFxubW0vcGFnZV9hbGxvYy5oOjIxMTpleHRlcm4gc3RydWN0IHBhZ2UgKl9fcGFnZWJsb2NrX3Bmbl90b19wYWdlKHVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuLFxcbm1tL3BhZ2VfYWxsb2MuaC0yMTItXFx0XFx0XFx0XFx0dW5zaWduZWQgbG9uZyBlbmRfcGZuLCBzdHJ1Y3Qgem9uZSAqem9uZSk7XFxubW0vcGFnZV9hbGxvYy5oLTIxMy1cXG5tbS9wYWdlX2FsbG9jLmg6MjE0OnN0YXRpYyBpbmxpbmUgc3RydWN0IHBhZ2UgKnBhZ2VibG9ja19wZm5fdG9fcGFnZSh1bnNpZ25lZCBsb25nIHN0YXJ0X3BmbixcXG5tbS9wYWdlX2FsbG9jLmgtMjE1LVxcdFxcdFxcdFxcdHVuc2lnbmVkIGxvbmcgZW5kX3Bmbiwgc3RydWN0IHpvbmUgKnpvbmUpXFxuLS1cXG5tbS9wYWdlX2FsbG9jLmgtMjE5LVxcbm1tL3BhZ2VfYWxsb2MuaDoyMjA6XFx0cmV0dXJuIF9fcGFnZWJsb2NrX3Bmbl90b19wYWdlKHN0YXJ0X3BmbiwgZW5kX3Bmbiwgem9uZSk7XFxubW0vcGFnZV9hbGxvYy5oLTIyMS19XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTE0VDA3OjQ5OjE2LjY1MDA1OTg3MloiLCJTZXEiOjQ3LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuOC1mbGFzaCIsIkR1cmF0aW9uIjoxNDc5NTg2MjI2OSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipNeSBBbmFseXNpcyBvZiBDb21wYWN0aW9uIGFuZCBSZWxhdGVkIE1lbW9yeSBNYW5hZ2VtZW50IEZlYXR1cmVzKipcblxuT2theSwgc28gSSdtIGRpZ2dpbmcgaW50byB0aGlzIGNvZGUsIHNwZWNpZmljYWxseSBhcm91bmQgbWVtb3J5IGNvbXBhY3Rpb24uIFRoZSBmaXJzdCB0aGluZyB0aGF0IGp1bXBzIG91dCBpcyB0aGF0IGBwYWdlYmxvY2tfcGZuX3RvX3BhZ2VgIGlzIG9ubHkgY2FsbGVkIGZyb20gYG1tL2NvbXBhY3Rpb24uY2AuIFRoYXQncyBhIGdvb2Qgc3RhcnRpbmcgcG9pbnQuIExldCdzIG1ha2Ugc3VyZSBgQ09ORklHX0NPTVBBQ1RJT05gIGlzIGVuYWJsZWQgLSBZZXAsIGl0IGlzLCBhcyBleHBlY3RlZC4gQW5kIHdoaWxlIEknbSBhdCBpdCwgSSBzaG91bGQgYWxzbyBjb25maXJtIHRoYXQgcmVsYXRlZCBmZWF0dXJlcyBsaWtlIGBDT05GSUdfTUVNT1JZX0hPVFBMVUdgLCBgQ09ORklHX01FTU9SWV9IT1RSRU1PVkVgLCBhbmQgYENPTkZJR19TUEFSU0VNRU1fVk1FTU1BUGAgYXJlIGVuYWJsZWQsIHdoaWNoIGFyZSBhbGwgc3RhbmRhcmQgYW5kIGltcG9ydGFudCBpbiB0aGlzIGNvbnRleHQuXG5cbk5vdywgSSBuZWVkIHRvIGlkZW50aWZ5IHRoZSBrZXkgZnVuY3Rpb25zIG9yIHN5bWJvbHMgdGhhdCBhcmUgdGhlIHJlYWwgZm9jdXMgb2YgdGhpcyB3b3JrLiBJIG5lZWQgdG8gYmUgY2FyZWZ1bCBoZXJlLCBhdm9pZGluZyB0aGUgdHJhcCBvZiBsaXN0aW5nIHViaXF1aXRvdXMgZnVuY3Rpb25zIGxpa2UgYWxsb2NhdG9ycyBvciBzeW5jaHJvbml6YXRpb24gcHJpbWl0aXZlcywgdGhhdCBhcmUgKmV2ZXJ5d2hlcmUqIGluIHRoZSBrZXJuZWwuIFRoYXQganVzdCBkaWx1dGVzIHRoZSBhbmFseXNpcyBhbmQgZnV6emluZyBlZmZvcnQuIEluc3RlYWQsIEkgd2FudCB0byBwaW5wb2ludCB0aGUgKnNwZWNpZmljKiBmZWF0dXJlIGxvZ2ljIOKAkyB0aG9zZSBmdW5jdGlvbnMgdGhhdCAqaW1wbGVtZW50KiB0aGUgbmV3IG9yIGFsdGVyZWQgY29tcGFjdGlvbiBiZWhhdmlvciwgb3IgdGhlIG1haW4gQVBJIGVudHJ5IHBvaW50cyBmb3IgdGhpcyBzdWJzeXN0ZW0uIEFuZCBJIHNob3VsZCBiZSBwYXJ0aWN1bGFybHkgbWluZGZ1bCBvZiB0aG9zZSBzdGF0aWMgaW5saW5lIGZ1bmN0aW9ucyBpbiBoZWFkZXJzLiBUaGV5IGxhY2sgdW5pcXVlIHN5bWJvbHMsIHNvIEkgbmVlZCB0byBmaW5kIHRoZSBub24tc3RhdGljIGNhbGxlcnMgaW4gdGhlIC5jIGZpbGVzIHRoYXQgKnVzZSogdGhvc2UgaW5saW5lIGhlbHBlcnMuXG5cblNvLCBsZXQncyBsb29rIGF0IHRoZSBmdW5jdGlvbnMgdGhhdCBoYXZlIGJlZW4gYWRkZWQgb3IgbW9kaWZpZWQuIFN0YXJ0aW5nIHdpdGggYGRyaXZlcnMvYmFzZS9tZW1vcnkuY2AuIEkgc2VlIGBtZW1vcnlfYmxvY2tfb25saW5lYCAtIHdhaXQgYSBtaW51dGUsIGl0J3MgYHN0YXRpY2AuIERhbW4uIEknbGwgbmVlZCB0byBmaWd1cmUgb3V0IGlmIHRoZXJlJ3MgYSBub24tc3RhdGljIGNhbGxlci4gUGVyaGFwcyBgbWVtb3J5X3N1YnN5c19vbmxpbmVgIG9yIGBtZW1vcnlfYmxvY2tfYWN0aW9uYD8gSSBuZWVkIHRvIGNoZWNrIGBkcml2ZXJzL2Jhc2UvbWVtb3J5LmNgIHRob3JvdWdobHkuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjMyMDcyLCJPdXRwdXRUb2tlbnMiOjMzLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NDE3LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTE0VDA3OjQ5OjMxLjQ0NTkyNDY5MVoiLCJTZXEiOjQ4LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NTY4MTIxMTksIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwibWVtb3J5X3N1YnN5c19vbmxpbmVcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwiZHJpdmVycy9iYXNlL21lbW9yeS5jXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImRyaXZlcnMvYmFzZS9tZW1vcnkuYz02Mj1FWFBPUlRfU1lNQk9MKHNlY3Rpb25zX3Blcl9ibG9jayk7XFxuZHJpdmVycy9iYXNlL21lbW9yeS5jLTYzLVxcbmRyaXZlcnMvYmFzZS9tZW1vcnkuYzo2NDpzdGF0aWMgaW50IG1lbW9yeV9zdWJzeXNfb25saW5lKHN0cnVjdCBkZXZpY2UgKmRldik7XFxuZHJpdmVycy9iYXNlL21lbW9yeS5jLTY1LXN0YXRpYyBpbnQgbWVtb3J5X3N1YnN5c19vZmZsaW5lKHN0cnVjdCBkZXZpY2UgKmRldik7XFxuLS1cXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmM9Njc9c3RhdGljIGNvbnN0IHN0cnVjdCBidXNfdHlwZSBtZW1vcnlfc3Vic3lzID0ge1xcbi0tXFxuZHJpdmVycy9iYXNlL21lbW9yeS5jLTY5LVxcdC5kZXZfbmFtZSA9IE1FTU9SWV9DTEFTU19OQU1FLFxcbmRyaXZlcnMvYmFzZS9tZW1vcnkuYzo3MDpcXHQub25saW5lID0gbWVtb3J5X3N1YnN5c19vbmxpbmUsXFxuZHJpdmVycy9iYXNlL21lbW9yeS5jLTcxLVxcdC5vZmZsaW5lID0gbWVtb3J5X3N1YnN5c19vZmZsaW5lLFxcbi0tXFxuZHJpdmVycy9iYXNlL21lbW9yeS5jPTM2MD1zdGF0aWMgaW50IG1lbW9yeV9ibG9ja19jaGFuZ2Vfc3RhdGUoc3RydWN0IG1lbW9yeV9ibG9jayAqbWVtLFxcbi0tXFxuZHJpdmVycy9iYXNlL21lbW9yeS5jLTM3Ny0vKiBUaGUgZGV2aWNlIGxvY2sgc2VyaWFsaXplcyBvcGVyYXRpb25zIG9uIG1lbW9yeV9zdWJzeXNfW29ubGluZXxvZmZsaW5lXSAqL1xcbmRyaXZlcnMvYmFzZS9tZW1vcnkuYzozNzg6c3RhdGljIGludCBtZW1vcnlfc3Vic3lzX29ubGluZShzdHJ1Y3QgZGV2aWNlICpkZXYpXFxuZHJpdmVycy9iYXNlL21lbW9yeS5jLTM3OS17XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTE0VDA3OjQ5OjMxLjUwMjc0MjMyMVoiLCJTZXEiOjQ5LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuOC1mbGFzaCIsIkR1cmF0aW9uIjoyNzYxMDg1MzUwNywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgbGV0J3MgYnJlYWsgdGhpcyBkb3duLlxuXG4qKkludmVzdGlnYXRpbmcgTWVtb3J5IEJsb2NrIFN0YXRlIFRyYW5zaXRpb25zKipcblxuQWxyaWdodCwgc28gSSBuZWVkIHRvIGZpZ3VyZSBvdXQgd2hhdCdzIHRyaWdnZXJpbmcgY2hhbmdlcyBpbiB0aGUgc3RhdGUgb2YgdGhlc2UgbWVtb3J5IGJsb2Nrcy4gTXkgZmlyc3Qgc3RlcCBpcyB0byB0cmFjZSBiYWNrIHRoZSBjYWxscyB0byBgbWVtb3J5X2Jsb2NrX2NoYW5nZV9zdGF0ZWAuIFRoaXMgZnVuY3Rpb24gaXMga2V5LiBJIG5lZWQgdG8gdW5kZXJzdGFuZCB3aGF0J3MgaW5mbHVlbmNpbmcgaXQuICBTaW1pbGFybHksIEknbGwgbmVlZCB0byBsb29rIGF0IGBtZW1vcnlfYmxvY2tfb25saW5lYCBhbmQgYG1lbW9yeV9ibG9ja19vZmZsaW5lYCB0byB1bmRlcnN0YW5kIGhvdyB0aGUgbWVtb3J5IGJsb2NrcyBnbyBmcm9tIGEgcG93ZXJlZCBkb3duLCB0byBwb3dlcmVkIHVwLCBhbmQgdmljZS12ZXJzYS4gIEknbGwgc3RhcnQgd2l0aCBhIHN0cmFpZ2h0Zm9yd2FyZCBzZWFyY2ggZm9yIGBtZW1vcnlfYmxvY2tfY2hhbmdlX3N0YXRlYCBjYWxscyBpbiB0aGUgY29kZWJhc2UuIFRoYXQgc2hvdWxkIGdpdmUgbWUgYSBnb29kIGluaXRpYWwgbGlzdCBvZiBlbnRyeSBwb2ludHMgYW5kIGhvcGVmdWxseSBzb21lIGNvbnRleHQuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjMzMjE1LCJPdXRwdXRUb2tlbnMiOjM0LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NDMsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMTRUMDc6NDk6NTkuMTEzNjAwMTE4WiIsIlNlcSI6NTAsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo3Nzk2ODUyOSwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJtZW1vcnlfYmxvY2tfY2hhbmdlX3N0YXRlXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcImRyaXZlcnMvYmFzZS9tZW1vcnkuY1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJkcml2ZXJzL2Jhc2UvbWVtb3J5LmM9MzQwPW1lbW9yeV9ibG9ja19hY3Rpb24oc3RydWN0IG1lbW9yeV9ibG9jayAqbWVtLCB1bnNpZ25lZCBsb25nIGFjdGlvbilcXG4tLVxcbmRyaXZlcnMvYmFzZS9tZW1vcnkuYy0zNTktXFxuZHJpdmVycy9iYXNlL21lbW9yeS5jOjM2MDpzdGF0aWMgaW50IG1lbW9yeV9ibG9ja19jaGFuZ2Vfc3RhdGUoc3RydWN0IG1lbW9yeV9ibG9jayAqbWVtLFxcbmRyaXZlcnMvYmFzZS9tZW1vcnkuYy0zNjEtXFx0XFx0dW5zaWduZWQgbG9uZyB0b19zdGF0ZSwgdW5zaWduZWQgbG9uZyBmcm9tX3N0YXRlX3JlcSlcXG4tLVxcbmRyaXZlcnMvYmFzZS9tZW1vcnkuYz0zNzg9c3RhdGljIGludCBtZW1vcnlfc3Vic3lzX29ubGluZShzdHJ1Y3QgZGV2aWNlICpkZXYpXFxuLS1cXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmMtMzkyLVxcbmRyaXZlcnMvYmFzZS9tZW1vcnkuYzozOTM6XFx0cmV0ID0gbWVtb3J5X2Jsb2NrX2NoYW5nZV9zdGF0ZShtZW0sIE1FTV9PTkxJTkUsIE1FTV9PRkZMSU5FKTtcXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmMtMzk0LVxcdG1lbS1cXHUwMDNlb25saW5lX3R5cGUgPSBNTU9QX09GRkxJTkU7XFxuLS1cXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmM9Mzk5PXN0YXRpYyBpbnQgbWVtb3J5X3N1YnN5c19vZmZsaW5lKHN0cnVjdCBkZXZpY2UgKmRldilcXG4tLVxcbmRyaXZlcnMvYmFzZS9tZW1vcnkuYy00MDUtXFxuZHJpdmVycy9iYXNlL21lbW9yeS5jOjQwNjpcXHRyZXR1cm4gbWVtb3J5X2Jsb2NrX2NoYW5nZV9zdGF0ZShtZW0sIE1FTV9PRkZMSU5FLCBNRU1fT05MSU5FKTtcXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmMtNDA3LX1cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTRUMDc6NDk6NTkuMTkxNTc1NTk3WiIsIlNlcSI6NTEsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy44LWZsYXNoIiwiRHVyYXRpb24iOjIwNjUxNTA4NTEsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGxldCdzIGRpdmUgaW50byB0aGlzIGNvZGUuXG5cbioqSW52ZXN0aWdhdGluZyBNZW1vcnkgU3Vic3lzdGVtIEludGVyYWN0aW9ucyoqXG5cbkFscmlnaHQsIEkgbmVlZCB0byBmaWd1cmUgb3V0IHRoZSBzY29wZSBvZiBob3cgdGhlc2UgbWVtb3J5LXJlbGF0ZWQgZnVuY3Rpb25zIGFyZSBiZWluZyB1c2VkLiBTcGVjaWZpY2FsbHksIEknbSB0aGlua2luZyBhYm91dCBgbWVtb3J5X3N1YnN5c19vbmxpbmVgIGFuZCBgbWVtb3J5X2Jsb2NrX2FjdGlvbmAuIEkgbmVlZCB0byB0cmFjayBkb3duIGFsbCB0aGUgY2FsbCBzaXRlcyB0byB0aG9zZS4gSXTigJlzIGNyaXRpY2FsIHRvIGdldCBhIGZ1bGwgcGljdHVyZSBvZiB3aGF0IGRlcGVuZHMgb24gdGhlbSwgYW5kIHdoZXJlIGNoYW5nZXMgdG8gdGhlc2UgZnVuY3Rpb25zIGNvdWxkIGhhdmUgdGhlIGJpZ2dlc3QgaW1wYWN0LlxuXG5MZXQncyBub3QgZm9yZ2V0IHRvIGNoZWNrIHRoZSBgc3RhdGVfc3RvcmVgIGZ1bmN0aW9uIHdpdGhpbiB0aGUgc3lzZnMuIFRoYXQncyBhIGxpa2VseSBwb2ludCBvZiBpbnRlcmFjdGlvbi4gSSdsbCBuZWVkIHRvIHVuZGVyc3RhbmQgaG93IHRoZSBzeXN0ZW0gc3RhdGUgaXMgYmVpbmcgbWFuaXB1bGF0ZWQgdGhyb3VnaCB0aGF0IGludGVyZmFjZSBpbiByZWxhdGlvbiB0byB0aGUgbWVtb3J5IHN1YnN5c3RlbXMgSSdtIGludmVzdGlnYXRpbmcuIEkgaGF2ZSBhIGh1bmNoIHRoYXQgdGhlcmUgd2lsbCBiZSBzb21lIG92ZXJsYXAgdGhlcmUuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjMzNzY0LCJPdXRwdXRUb2tlbnMiOjM1LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MzUsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMTRUMDc6NTA6MDEuMjU2NzMwNjA4WiIsIlNlcSI6NTIsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE1MDk2MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJkcml2ZXJzL2Jhc2UvbWVtb3J5LmNcIixcbiAgXCJGaXJzdExpbmVcIjogNDAwLFxuICBcIkxpbmVDb3VudFwiOiA1MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgNDAwOlxcdHtcXG4gNDAxOlxcdFxcdHN0cnVjdCBtZW1vcnlfYmxvY2sgKm1lbSA9IHRvX21lbW9yeV9ibG9jayhkZXYpO1xcbiA0MDI6XFx0XFxuIDQwMzpcXHRcXHRpZiAobWVtLVxcdTAwM2VzdGF0ZSA9PSBNRU1fT0ZGTElORSlcXG4gNDA0OlxcdFxcdFxcdHJldHVybiAwO1xcbiA0MDU6XFx0XFxuIDQwNjpcXHRcXHRyZXR1cm4gbWVtb3J5X2Jsb2NrX2NoYW5nZV9zdGF0ZShtZW0sIE1FTV9PRkZMSU5FLCBNRU1fT05MSU5FKTtcXG4gNDA3OlxcdH1cXG4gNDA4OlxcdFxcbiA0MDk6XFx0c3RhdGljIHNzaXplX3Qgc3RhdGVfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0cixcXG4gNDEwOlxcdFxcdFxcdFxcdCAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KVxcbiA0MTE6XFx0e1xcbiA0MTI6XFx0XFx0Y29uc3QgaW50IG9ubGluZV90eXBlID0gbWhwX29ubGluZV90eXBlX2Zyb21fc3RyKGJ1Zik7XFxuIDQxMzpcXHRcXHRzdHJ1Y3QgbWVtb3J5X2Jsb2NrICptZW0gPSB0b19tZW1vcnlfYmxvY2soZGV2KTtcXG4gNDE0OlxcdFxcdGludCByZXQ7XFxuIDQxNTpcXHRcXG4gNDE2OlxcdFxcdGlmIChvbmxpbmVfdHlwZSBcXHUwMDNjIDApXFxuIDQxNzpcXHRcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG4gNDE4OlxcdFxcbiA0MTk6XFx0XFx0cmV0ID0gbG9ja19kZXZpY2VfaG90cGx1Z19zeXNmcygpO1xcbiA0MjA6XFx0XFx0aWYgKHJldClcXG4gNDIxOlxcdFxcdFxcdHJldHVybiByZXQ7XFxuIDQyMjpcXHRcXG4gNDIzOlxcdFxcdHN3aXRjaCAob25saW5lX3R5cGUpIHtcXG4gNDI0OlxcdFxcdGNhc2UgTU1PUF9PTkxJTkVfS0VSTkVMOlxcbiA0MjU6XFx0XFx0Y2FzZSBNTU9QX09OTElORV9NT1ZBQkxFOlxcbiA0MjY6XFx0XFx0Y2FzZSBNTU9QX09OTElORTpcXG4gNDI3OlxcdFxcdFxcdC8qIG1lbS1cXHUwMDNlb25saW5lX3R5cGUgaXMgcHJvdGVjdGVkIGJ5IGRldmljZV9ob3RwbHVnX2xvY2sgKi9cXG4gNDI4OlxcdFxcdFxcdG1lbS1cXHUwMDNlb25saW5lX3R5cGUgPSBvbmxpbmVfdHlwZTtcXG4gNDI5OlxcdFxcdFxcdHJldCA9IGRldmljZV9vbmxpbmUoXFx1MDAyNm1lbS1cXHUwMDNlZGV2KTtcXG4gNDMwOlxcdFxcdFxcdGJyZWFrO1xcbiA0MzE6XFx0XFx0Y2FzZSBNTU9QX09GRkxJTkU6XFxuIDQzMjpcXHRcXHRcXHRyZXQgPSBkZXZpY2Vfb2ZmbGluZShcXHUwMDI2bWVtLVxcdTAwM2VkZXYpO1xcbiA0MzM6XFx0XFx0XFx0YnJlYWs7XFxuIDQzNDpcXHRcXHRkZWZhdWx0OlxcbiA0MzU6XFx0XFx0XFx0cmV0ID0gLUVJTlZBTDsgLyogc2hvdWxkIG5ldmVyIGhhcHBlbiAqL1xcbiA0MzY6XFx0XFx0fVxcbiA0Mzc6XFx0XFxuIDQzODpcXHRcXHR1bmxvY2tfZGV2aWNlX2hvdHBsdWcoKTtcXG4gNDM5OlxcdFxcbiA0NDA6XFx0XFx0aWYgKHJldCBcXHUwMDNjIDApXFxuIDQ0MTpcXHRcXHRcXHRyZXR1cm4gcmV0O1xcbiA0NDI6XFx0XFx0aWYgKHJldClcXG4gNDQzOlxcdFxcdFxcdHJldHVybiAtRUlOVkFMO1xcbiA0NDQ6XFx0XFxuIDQ0NTpcXHRcXHRyZXR1cm4gY291bnQ7XFxuIDQ0NjpcXHR9XFxuIDQ0NzpcXHRcXG4gNDQ4OlxcdC8qXFxuIDQ0OTpcXHQgKiBMZWdhY3kgaW50ZXJmYWNlIHRoYXQgd2UgY2Fubm90IHJlbW92ZTogczM5MHggZXhwb3NlcyB0aGUgc3RvcmFnZSBpbmNyZW1lbnRcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTRUMDc6NTA6MDEuMjU2ODg0NDY4WiIsIlNlcSI6NTMsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy44LWZsYXNoIiwiRHVyYXRpb24iOjYyODE4NTI3OTE3LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyBNZW1vcnkgSG90cGx1ZyBhbmQgQ29udGlndWl0eSBDaGFuZ2VzKipcblxuT2theSwgc28gSSdtIGRpdmluZyBpbnRvIHRoaXMgbWVtb3J5IG1hbmFnZW1lbnQgY29kZS4gTXkgaW5pdGlhbCB0aG91Z2h0IGlzIHRvIHRyYWNlIHRoZSBvbmxpbmUvb2ZmbGluZSBwcm9jZXNzLCBhbmQgaXQgbG9va3MgbGlrZSBgc3RhdGVfc3RvcmVgIGluIGBkcml2ZXJzL2Jhc2UvbWVtb3J5LmNgIGlzIHRoZSBrZXkuIEl0IHVsdGltYXRlbHkgY2FsbHMgYG1lbW9yeV9ibG9ja19vbmxpbmVgIGFuZCBgbWVtb3J5X2Jsb2NrX29mZmxpbmVgIHRocm91Z2ggYSBjaGFpbiBvZiBmdW5jdGlvbnMuIFRoYXQncyBhIGdvb2Qgc3RhcnRpbmcgcG9pbnQuXG5cbk5leHQsIEknbSByZXZpZXdpbmcgYG1tL21lbW9yeV9ob3RwbHVnLmNgIGFuZCBpZGVudGlmeWluZyB0aGUgZnVuY3Rpb25zIHRoYXQgYXJlIG5vbi1zdGF0aWMgb3IgaGF2ZSBiZWVuIG1vZGlmaWVkLiBgcmVtb3ZlX3Bmbl9yYW5nZV9mcm9tX3pvbmVgLCBgYWRqdXN0X3ByZXNlbnRfcGFnZV9jb3VudGAsIGFuZCBgbW92ZV9wZm5fcmFuZ2VfdG9fem9uZWAgc3RhbmQgb3V0IGFzIHRoZSBub24tc3RhdGljIGZ1bmN0aW9ucyBvZiBpbnRlcmVzdC4gSSBhbHNvIG5lZWQgdG8gZm9jdXMgb24gd2hhdCBjYWxscyB0aGVtOyBgb2ZmbGluZV9wYWdlc2AgaXMga2V5LCBhcyBpcyBgb25saW5lX3BhZ2VzYCwgYW5kIGZ1bmN0aW9ucyByZWxhdGVkIHRvIG1lbW9yeSBtYXAgaW5pdGlhbGl6YXRpb24vZGUtaW5pdGlhbGl6YXRpb24uXG5cbk5vdyBJJ20gdHVybmluZyBteSBhdHRlbnRpb24gdG8gY29tcGFjdGlvbiBhbmQgdGhlIGludGVncmF0aW9uIG9mIGNvbnRpZ3VpdHkgY2hlY2tzLiBNeSBvcmlnaW5hbCBpbnN0aW5jdCB3YXMgdG8gemVybyBpbiBvbiBgcGFnZWJsb2NrX3Bmbl90b19wYWdlYCwgYnV0IHRoZW4gSSByZWFsaXplZCBpdCBjYWxscyBgem9uZV9pc19jb250aWd1b3VzYC4gV2FpdCwgYHpvbmVfaXNfY29udGlndW91c2AsIGBzZXRfem9uZV9jb250aWd1b3VzYCwgYW5kIGBjbGVhcl96b25lX2NvbnRpZ3VvdXNgIGFyZSAqaW5saW5lKiBhbmQgZGVmaW5lZCBpbiBhIGhlYWRlciBmaWxlLCBgaW5jbHVkZS9saW51eC9tbXpvbmUuaGAuIEJhc2VkIG9uIHRoZSBkb2N1bWVudGF0aW9uLCBJIGtub3cgdGhlc2Ugc3RhdGljIGlubGluZSBmdW5jdGlvbnMgYXJlIG5vdCBpZGVhbCB0YXJnZXRzIGZvciBzeW1ib2wgY292ZXJhZ2UuXG5cblRoaXMgbWVhbnMgSSBuZWVkIHRvIGFkanVzdCBteSBzdHJhdGVneS4gSSBuZWVkIHRvIGZvY3VzIG9uIHRoZSAqbm9uLXN0YXRpYyogZnVuY3Rpb25zIHRoYXQgKmNhbGwqIHRob3NlIGlubGluZSBmdW5jdGlvbnMuIFNvLCB3aGF0IGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgdXNpbmcgdGhlc2UgY29udGlndWl0eSBjaGVja3M/IEkgc2VlIHRoZW0gYmVpbmcgY2FsbGVkIGJ5IGZ1bmN0aW9ucyBpbiBgbW0vY29tcGFjdGlvbi5jYCwgc3VjaCBhcyBgaXNvbGF0ZV9taWdyYXRlcGFnZXNfcmFuZ2VgLCBgaXNvbGF0ZV9mcmVlcGFnZXNfcmFuZ2VgLCBhbmQgdGhlIG90aGVyIGlzb2xhdG9ycywgYXMgd2VsbCBhcyB0aGUgbWFpbiBjb21wYWN0aW9uIGVudHJ5IHBvaW50czogYGNvbXBhY3Rfem9uZWAgLyBgc3lzZnNfY29tcGFjdF9ub2RlYCAvIGBjb21wYWN0X25vZGVzYC5cblxuSSdtIG5vdyBnb2luZyBiYWNrIHRvIGBkcml2ZXJzL2Jhc2UvbWVtb3J5LmNgLiBJIG5lZWQgdG8gcmV2aWV3IHdoYXQncyBhY3R1YWxseSAqbm9uLXN0YXRpYyogaW4gdGhhdCBmaWxlLiBNeSBmb2N1cyBzaG91bGQgYmUgb24gdGhlIGNhbGxzIHRvIGBtZW1vcnlfYmxvY2tfb25saW5lYCBhbmQgYG1lbW9yeV9ibG9ja19vZmZsaW5lYCBhbmQgaG93IHRoZXkgcmVsYXRlIHRvIHRoZSBpbmxpbmUgY29udGlndWl0eSBjaGVja3MgZnJvbSBtbXpvbmUuaCwgYnV0IEkgY2FuJ3QgZmluZCBhbnkgbm9uLXN0YXRpYyBmdW5jdGlvbnMgaW4gdGhhdCBmaWxlIHRoYXQgYXJlIHJlbGV2YW50LiBJIG5lZWQgdG8gZmluZCB0aGUgY2FsbHMgdG8gdGhlIG1vZGlmaWVkIGxvZ2ljLCBvciBjb2RlIHRoYXQgdXNlcyB0aGUgaW5saW5lIGNvbnRpZ3VpdHkgY2hlY2tzLlxuXG5cbiIsIklucHV0VG9rZW5zIjozNDY3MSwiT3V0cHV0VG9rZW5zIjo2NSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjEwNzYsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0xNFQwNzo1MTowNC4wNzU0MTYzNjZaIiwiU2VxIjo1NCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjk2NzM1ODI4LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcIl5bYS16QS1aX11bYS16QS1aMC05XyogXSsgW2EtekEtWl9dW2EtekEtWjAtOV9dKlxcXFwoXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcImRyaXZlcnMvYmFzZS9tZW1vcnkuY1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJkcml2ZXJzL2Jhc2UvbWVtb3J5LmM9MzI9c3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IG9ubGluZV90eXBlX3RvX3N0cltdID0ge1xcbi0tXFxuZHJpdmVycy9iYXNlL21lbW9yeS5jLTM4LVxcbmRyaXZlcnMvYmFzZS9tZW1vcnkuYzozOTppbnQgbWhwX29ubGluZV90eXBlX2Zyb21fc3RyKGNvbnN0IGNoYXIgKnN0cilcXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmMtNDAte1xcbi0tXFxuZHJpdmVycy9iYXNlL21lbW9yeS5jPTYyPUVYUE9SVF9TWU1CT0woc2VjdGlvbnNfcGVyX2Jsb2NrKTtcXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmMtNjMtXFxuZHJpdmVycy9iYXNlL21lbW9yeS5jOjY0OnN0YXRpYyBpbnQgbWVtb3J5X3N1YnN5c19vbmxpbmUoc3RydWN0IGRldmljZSAqZGV2KTtcXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmM6NjU6c3RhdGljIGludCBtZW1vcnlfc3Vic3lzX29mZmxpbmUoc3RydWN0IGRldmljZSAqZGV2KTtcXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmMtNjYtXFxuZHJpdmVycy9iYXNlL21lbW9yeS5jPTY3PXN0YXRpYyBjb25zdCBzdHJ1Y3QgYnVzX3R5cGUgbWVtb3J5X3N1YnN5cyA9IHtcXG4tLVxcbmRyaXZlcnMvYmFzZS9tZW1vcnkuYy03OC0gKi9cXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmM6Nzk6c3RhdGljIERFRklORV9YQVJSQVkobWVtb3J5X2Jsb2Nrcyk7XFxuZHJpdmVycy9iYXNlL21lbW9yeS5jLTgwLVxcbi0tXFxuZHJpdmVycy9iYXNlL21lbW9yeS5jLTgzLSAqL1xcbmRyaXZlcnMvYmFzZS9tZW1vcnkuYzo4NDpzdGF0aWMgREVGSU5FX1hBUlJBWV9GTEFHUyhtZW1vcnlfZ3JvdXBzLCBYQV9GTEFHU19BTExPQyk7XFxuZHJpdmVycy9iYXNlL21lbW9yeS5jLTg1LSNkZWZpbmUgTUVNT1JZX0dST1VQX01BUktfRFlOQU1JQ1xcdFhBX01BUktfMVxcbmRyaXZlcnMvYmFzZS9tZW1vcnkuYy04Ni1cXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmM6ODc6c3RhdGljIEJMT0NLSU5HX05PVElGSUVSX0hFQUQobWVtb3J5X2NoYWluKTtcXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmMtODgtXFxuZHJpdmVycy9iYXNlL21lbW9yeS5jOjg5OmludCByZWdpc3Rlcl9tZW1vcnlfbm90aWZpZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYilcXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmMtOTAte1xcbi0tXFxuZHJpdmVycy9iYXNlL21lbW9yeS5jPTkzPUVYUE9SVF9TWU1CT0wocmVnaXN0ZXJfbWVtb3J5X25vdGlmaWVyKTtcXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmMtOTQtXFxuZHJpdmVycy9iYXNlL21lbW9yeS5jOjk1OnZvaWQgdW5yZWdpc3Rlcl9tZW1vcnlfbm90aWZpZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYilcXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmMtOTYte1xcbi0tXFxuZHJpdmVycy9iYXNlL21lbW9yeS5jPTk5PUVYUE9SVF9TWU1CT0wodW5yZWdpc3Rlcl9tZW1vcnlfbm90aWZpZXIpO1xcbmRyaXZlcnMvYmFzZS9tZW1vcnkuYy0xMDAtXFxuZHJpdmVycy9iYXNlL21lbW9yeS5jOjEwMTpzdGF0aWMgdm9pZCBtZW1vcnlfYmxvY2tfcmVsZWFzZShzdHJ1Y3QgZGV2aWNlICpkZXYpXFxuZHJpdmVycy9iYXNlL21lbW9yeS5jLTEwMi17XFxuLS1cXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmM9MTEyPXN0YXRpYyBib29sIG1lbW9yeV9ibG9ja19hZHZpc2VkX3NpemVfcXVlcmllZDtcXG4tLVxcbmRyaXZlcnMvYmFzZS9tZW1vcnkuYy0xMjgtICovXFxuZHJpdmVycy9iYXNlL21lbW9yeS5jOjEyOTppbnQgX19pbml0IG1lbW9yeV9ibG9ja19hZHZpc2VfbWF4X3NpemUodW5zaWduZWQgbG9uZyBzaXplKVxcbmRyaXZlcnMvYmFzZS9tZW1vcnkuYy0xMzAte1xcbi0tXFxuZHJpdmVycy9iYXNlL21lbW9yeS5jLTE1My0gKi9cXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmM6MTU0OnVuc2lnbmVkIGxvbmcgbWVtb3J5X2Jsb2NrX2FkdmlzZWRfbWF4X3NpemUodm9pZClcXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmMtMTU1LXtcXG4tLVxcbmRyaXZlcnMvYmFzZS9tZW1vcnkuYy0xNTktXFxuZHJpdmVycy9iYXNlL21lbW9yeS5jOjE2MDp1bnNpZ25lZCBsb25nIF9fd2VhayBtZW1vcnlfYmxvY2tfc2l6ZV9ieXRlcyh2b2lkKVxcbmRyaXZlcnMvYmFzZS9tZW1vcnkuYy0xNjEte1xcbi0tXFxuZHJpdmVycy9iYXNlL21lbW9yeS5jPTE2ND1FWFBPUlRfU1lNQk9MX0dQTChtZW1vcnlfYmxvY2tfc2l6ZV9ieXRlcyk7XFxuLS1cXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmMtMTY2LS8qIFNob3cgdGhlIG1lbW9yeSBibG9jayBJRCwgcmVsYXRpdmUgdG8gdGhlIG1lbW9yeSBibG9jayBzaXplICovXFxuZHJpdmVycy9iYXNlL21lbW9yeS5jOjE2NzpzdGF0aWMgc3NpemVfdCBwaHlzX2luZGV4X3Nob3coc3RydWN0IGRldmljZSAqZGV2LFxcbmRyaXZlcnMvYmFzZS9tZW1vcnkuYy0xNjgtXFx0XFx0XFx0ICAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpXFxuLS1cXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmMtMTc4LSAqL1xcbmRyaXZlcnMvYmFzZS9tZW1vcnkuYzoxNzk6c3RhdGljIHNzaXplX3QgcmVtb3ZhYmxlX3Nob3coc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0cixcXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmMtMTgwLVxcdFxcdFxcdCAgICAgIGNoYXIgKmJ1ZilcXG4tLVxcbmRyaXZlcnMvYmFzZS9tZW1vcnkuYy0xODctICovXFxuZHJpdmVycy9iYXNlL21lbW9yeS5jOjE4ODpzdGF0aWMgc3NpemVfdCBzdGF0ZV9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsXFxuZHJpdmVycy9iYXNlL21lbW9yeS5jLTE4OS1cXHRcXHRcXHQgIGNoYXIgKmJ1ZilcXG4tLVxcbmRyaXZlcnMvYmFzZS9tZW1vcnkuYy0yMTUtXFxuZHJpdmVycy9iYXNlL21lbW9yeS5jOjIxNjppbnQgbWVtb3J5X25vdGlmeShlbnVtIG1lbW9yeV9ibG9ja19zdGF0ZSBzdGF0ZSwgdm9pZCAqdilcXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmMtMjE3LXtcXG4tLVxcbmRyaXZlcnMvYmFzZS9tZW1vcnkuYy0yMjEtI2lmIGRlZmluZWQoQ09ORklHX01FTU9SWV9GQUlMVVJFKSBcXHUwMDI2XFx1MDAyNiBkZWZpbmVkKENPTkZJR19NRU1PUllfSE9UUExVRylcXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmM6MjIyOnN0YXRpYyB1bnNpZ25lZCBsb25nIG1lbWJsa19ucl9wb2lzb24oc3RydWN0IG1lbW9yeV9ibG9jayAqbWVtKTtcXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmMtMjIzLSNlbHNlXFxuZHJpdmVycy9iYXNlL21lbW9yeS5jOjIyNDpzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgbWVtYmxrX25yX3BvaXNvbihzdHJ1Y3QgbWVtb3J5X2Jsb2NrICptZW0pXFxuZHJpdmVycy9iYXNlL21lbW9yeS5jLTIyNS17XFxuLS1cXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmMtMjMyLSAqL1xcbmRyaXZlcnMvYmFzZS9tZW1vcnkuYzoyMzM6c3RhdGljIGludCBtZW1vcnlfYmxvY2tfb25saW5lKHN0cnVjdCBtZW1vcnlfYmxvY2sgKm1lbSlcXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmMtMjM0LXtcXG4tLVxcbmRyaXZlcnMvYmFzZS9tZW1vcnkuYy0yOTAtICovXFxuZHJpdmVycy9iYXNlL21lbW9yeS5jOjI5MTpzdGF0aWMgaW50IG1lbW9yeV9ibG9ja19vZmZsaW5lKHN0cnVjdCBtZW1vcnlfYmxvY2sgKm1lbSlcXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmMtMjkyLXtcXG4tLVxcbmRyaXZlcnMvYmFzZS9tZW1vcnkuYz0zNDA9bWVtb3J5X2Jsb2NrX2FjdGlvbihzdHJ1Y3QgbWVtb3J5X2Jsb2NrICptZW0sIHVuc2lnbmVkIGxvbmcgYWN0aW9uKVxcbi0tXFxuZHJpdmVycy9iYXNlL21lbW9yeS5jLTM1OS1cXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmM6MzYwOnN0YXRpYyBpbnQgbWVtb3J5X2Jsb2NrX2NoYW5nZV9zdGF0ZShzdHJ1Y3QgbWVtb3J5X2Jsb2NrICptZW0sXFxuZHJpdmVycy9iYXNlL21lbW9yeS5jLTM2MS1cXHRcXHR1bnNpZ25lZCBsb25nIHRvX3N0YXRlLCB1bnNpZ25lZCBsb25nIGZyb21fc3RhdGVfcmVxKVxcbi0tXFxuZHJpdmVycy9iYXNlL21lbW9yeS5jLTM3Ny0vKiBUaGUgZGV2aWNlIGxvY2sgc2VyaWFsaXplcyBvcGVyYXRpb25zIG9uIG1lbW9yeV9zdWJzeXNfW29ubGluZXxvZmZsaW5lXSAqL1xcbmRyaXZlcnMvYmFzZS9tZW1vcnkuYzozNzg6c3RhdGljIGludCBtZW1vcnlfc3Vic3lzX29ubGluZShzdHJ1Y3QgZGV2aWNlICpkZXYpXFxuZHJpdmVycy9iYXNlL21lbW9yeS5jLTM3OS17XFxuLS1cXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmMtMzk4LVxcbmRyaXZlcnMvYmFzZS9tZW1vcnkuYzozOTk6c3RhdGljIGludCBtZW1vcnlfc3Vic3lzX29mZmxpbmUoc3RydWN0IGRldmljZSAqZGV2KVxcbmRyaXZlcnMvYmFzZS9tZW1vcnkuYy00MDAte1xcbi0tXFxuZHJpdmVycy9iYXNlL21lbW9yeS5jLTQwOC1cXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmM6NDA5OnN0YXRpYyBzc2l6ZV90IHN0YXRlX3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsXFxuZHJpdmVycy9iYXNlL21lbW9yeS5jLTQxMC1cXHRcXHRcXHQgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudClcXG4tLVxcbmRyaXZlcnMvYmFzZS9tZW1vcnkuYy00NTQtICovXFxuZHJpdmVycy9iYXNlL21lbW9yeS5jOjQ1NTpzdGF0aWMgc3NpemVfdCBwaHlzX2RldmljZV9zaG93KHN0cnVjdCBkZXZpY2UgKmRldixcXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmMtNDU2LVxcdFxcdFxcdFxcdHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpXFxuLS1cXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmMtNDY1LSNpZmRlZiBDT05GSUdfTUVNT1JZX0hPVFJFTU9WRVxcbmRyaXZlcnMvYmFzZS9tZW1vcnkuYzo0NjY6c3RhdGljIGludCBwcmludF9hbGxvd2VkX3pvbmUoY2hhciAqYnVmLCBpbnQgbGVuLCBpbnQgbmlkLFxcbmRyaXZlcnMvYmFzZS9tZW1vcnkuYy00NjctXFx0XFx0XFx0ICAgICAgc3RydWN0IG1lbW9yeV9ncm91cCAqZ3JvdXAsXFxuLS1cXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmMtNDc5LVxcbmRyaXZlcnMvYmFzZS9tZW1vcnkuYzo0ODA6c3RhdGljIHNzaXplX3QgdmFsaWRfem9uZXNfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsXFxuZHJpdmVycy9iYXNlL21lbW9yeS5jLTQ4MS1cXHRcXHRcXHRcXHRzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKVxcbi0tXFxuZHJpdmVycy9iYXNlL21lbW9yeS5jLTUxNC19XFxuZHJpdmVycy9iYXNlL21lbW9yeS5jOjUxNTpzdGF0aWMgREVWSUNFX0FUVFJfUk8odmFsaWRfem9uZXMpO1xcbmRyaXZlcnMvYmFzZS9tZW1vcnkuYy01MTYtI2VuZGlmXFxuZHJpdmVycy9iYXNlL21lbW9yeS5jLTUxNy1cXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmM6NTE4OnN0YXRpYyBERVZJQ0VfQVRUUl9STyhwaHlzX2luZGV4KTtcXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmM6NTE5OnN0YXRpYyBERVZJQ0VfQVRUUl9SVyhzdGF0ZSk7XFxuZHJpdmVycy9iYXNlL21lbW9yeS5jOjUyMDpzdGF0aWMgREVWSUNFX0FUVFJfUk8ocGh5c19kZXZpY2UpO1xcbmRyaXZlcnMvYmFzZS9tZW1vcnkuYzo1MjE6c3RhdGljIERFVklDRV9BVFRSX1JPKHJlbW92YWJsZSk7XFxuZHJpdmVycy9iYXNlL21lbW9yeS5jLTUyMi1cXG4tLVxcbmRyaXZlcnMvYmFzZS9tZW1vcnkuYy01MjUtICovXFxuZHJpdmVycy9iYXNlL21lbW9yeS5jOjUyNjpzdGF0aWMgc3NpemVfdCBibG9ja19zaXplX2J5dGVzX3Nob3coc3RydWN0IGRldmljZSAqZGV2LFxcbmRyaXZlcnMvYmFzZS9tZW1vcnkuYy01MjctXFx0XFx0XFx0XFx0ICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKVxcbi0tXFxuZHJpdmVycy9iYXNlL21lbW9yeS5jLTUzMS1cXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmM6NTMyOnN0YXRpYyBERVZJQ0VfQVRUUl9STyhibG9ja19zaXplX2J5dGVzKTtcXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmMtNTMzLVxcbi0tXFxuZHJpdmVycy9iYXNlL21lbW9yeS5jLTUzNy1cXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmM6NTM4OnN0YXRpYyBzc2l6ZV90IGF1dG9fb25saW5lX2Jsb2Nrc19zaG93KHN0cnVjdCBkZXZpY2UgKmRldixcXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmMtNTM5LVxcdFxcdFxcdFxcdCAgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKVxcbi0tXFxuZHJpdmVycy9iYXNlL21lbW9yeS5jLTU0NC1cXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmM6NTQ1OnN0YXRpYyBzc2l6ZV90IGF1dG9fb25saW5lX2Jsb2Nrc19zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsXFxuZHJpdmVycy9iYXNlL21lbW9yeS5jLTU0Ni1cXHRcXHRcXHRcXHRcXHRzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0cixcXG4tLVxcbmRyaXZlcnMvYmFzZS9tZW1vcnkuYy01NTctXFxuZHJpdmVycy9iYXNlL21lbW9yeS5jOjU1ODpzdGF0aWMgREVWSUNFX0FUVFJfUlcoYXV0b19vbmxpbmVfYmxvY2tzKTtcXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmMtNTU5LVxcbi0tXFxuZHJpdmVycy9iYXNlL21lbW9yeS5jLTU2MS0jaW5jbHVkZSBcXHUwMDNjbGludXgva2V4ZWMuaFxcdTAwM2VcXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmM6NTYyOnN0YXRpYyBzc2l6ZV90IGNyYXNoX2hvdHBsdWdfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsXFxuZHJpdmVycy9iYXNlL21lbW9yeS5jLTU2My1cXHRcXHRcXHRcXHQgICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZilcXG4tLVxcbmRyaXZlcnMvYmFzZS9tZW1vcnkuYy01NjYtfVxcbmRyaXZlcnMvYmFzZS9tZW1vcnkuYzo1Njc6c3RhdGljIERFVklDRV9BVFRSX1JPKGNyYXNoX2hvdHBsdWcpO1xcbmRyaXZlcnMvYmFzZS9tZW1vcnkuYy01NjgtI2VuZGlmXFxuLS1cXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmMtNTc2LSNpZmRlZiBDT05GSUdfQVJDSF9NRU1PUllfUFJPQkVcXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmM6NTc3OnN0YXRpYyBzc2l6ZV90IHByb2JlX3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsXFxuZHJpdmVycy9iYXNlL21lbW9yeS5jLTU3OC1cXHRcXHRcXHQgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudClcXG4tLVxcbmRyaXZlcnMvYmFzZS9tZW1vcnkuYy02MDgtXFxuZHJpdmVycy9iYXNlL21lbW9yeS5jOjYwOTpzdGF0aWMgREVWSUNFX0FUVFJfV08ocHJvYmUpO1xcbmRyaXZlcnMvYmFzZS9tZW1vcnkuYy02MTAtI2VuZGlmXFxuLS1cXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmMtNjE3LS8qIFNvZnQgb2ZmbGluZSBhIHBhZ2UgKi9cXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmM6NjE4OnN0YXRpYyBzc2l6ZV90IHNvZnRfb2ZmbGluZV9wYWdlX3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldixcXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmMtNjE5LVxcdFxcdFxcdFxcdCAgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0cixcXG4tLVxcbmRyaXZlcnMvYmFzZS9tZW1vcnkuYy02MzMtLyogRm9yY2libHkgb2ZmbGluZSBhIHBhZ2UsIGluY2x1ZGluZyBraWxsaW5nIHByb2Nlc3Nlcy4gKi9cXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmM6NjM0OnN0YXRpYyBzc2l6ZV90IGhhcmRfb2ZmbGluZV9wYWdlX3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldixcXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmMtNjM1LVxcdFxcdFxcdFxcdCAgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0cixcXG4tLVxcbmRyaXZlcnMvYmFzZS9tZW1vcnkuYy02NTAtXFxuZHJpdmVycy9iYXNlL21lbW9yeS5jOjY1MTpzdGF0aWMgREVWSUNFX0FUVFJfV08oc29mdF9vZmZsaW5lX3BhZ2UpO1xcbmRyaXZlcnMvYmFzZS9tZW1vcnkuYzo2NTI6c3RhdGljIERFVklDRV9BVFRSX1dPKGhhcmRfb2ZmbGluZV9wYWdlKTtcXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmMtNjUzLSNlbmRpZlxcbi0tXFxuZHJpdmVycy9iYXNlL21lbW9yeS5jLTY1NS0vKiBTZWUgcGh5c19kZXZpY2Vfc2hvdygpLiAqL1xcbmRyaXZlcnMvYmFzZS9tZW1vcnkuYzo2NTY6aW50IF9fd2VhayBhcmNoX2dldF9tZW1vcnlfcGh5c19kZXZpY2UodW5zaWduZWQgbG9uZyBzdGFydF9wZm4pXFxuZHJpdmVycy9iYXNlL21lbW9yeS5jLTY1Ny17XFxuLS1cXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmM9NjkxPXN0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwICptZW1vcnlfbWVtYmxrX2F0dHJfZ3JvdXBzW10gPSB7XFxuLS1cXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmMtNjk1LVxcbmRyaXZlcnMvYmFzZS9tZW1vcnkuYzo2OTY6c3RhdGljIGludCBfX2FkZF9tZW1vcnlfYmxvY2soc3RydWN0IG1lbW9yeV9ibG9jayAqbWVtb3J5KVxcbmRyaXZlcnMvYmFzZS9tZW1vcnkuYy02OTcte1xcbi0tXFxuZHJpdmVycy9iYXNlL21lbW9yeS5jPTcxOT1zdGF0aWMgc3RydWN0IHpvbmUgKmVhcmx5X25vZGVfem9uZV9mb3JfbWVtb3J5X2Jsb2NrKHN0cnVjdCBtZW1vcnlfYmxvY2sgKm1lbSxcXG4tLVxcbmRyaXZlcnMvYmFzZS9tZW1vcnkuYy03NjctICovXFxuZHJpdmVycy9iYXNlL21lbW9yeS5jOjc2ODp2b2lkIG1lbW9yeV9ibG9ja19hZGRfbmlkX2Vhcmx5KHN0cnVjdCBtZW1vcnlfYmxvY2sgKm1lbSwgaW50IG5pZClcXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmMtNzY5LXtcXG4tLVxcbmRyaXZlcnMvYmFzZS9tZW1vcnkuYy03OTQtXFxuZHJpdmVycy9iYXNlL21lbW9yeS5jOjc5NTpzdGF0aWMgaW50IGFkZF9tZW1vcnlfYmxvY2sodW5zaWduZWQgbG9uZyBibG9ja19pZCwgaW50IG5pZCwgdW5zaWduZWQgbG9uZyBzdGF0ZSxcXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmMtNzk2LVxcdFxcdFxcdCAgICBzdHJ1Y3Qgdm1lbV9hbHRtYXAgKmFsdG1hcCxcXG4tLVxcbmRyaXZlcnMvYmFzZS9tZW1vcnkuYy04NDAtXFxuZHJpdmVycy9iYXNlL21lbW9yeS5jOjg0MTpzdGF0aWMgdm9pZCByZW1vdmVfbWVtb3J5X2Jsb2NrKHN0cnVjdCBtZW1vcnlfYmxvY2sgKm1lbW9yeSlcXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmMtODQyLXtcXG4tLVxcbmRyaXZlcnMvYmFzZS9tZW1vcnkuYy04NjQtICovXFxuZHJpdmVycy9iYXNlL21lbW9yeS5jOjg2NTppbnQgY3JlYXRlX21lbW9yeV9ibG9ja19kZXZpY2VzKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgc2l6ZSxcXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmMtODY2LVxcdFxcdFxcdFxcdGludCBuaWQsIHN0cnVjdCB2bWVtX2FsdG1hcCAqYWx0bWFwLFxcbi0tXFxuZHJpdmVycy9iYXNlL21lbW9yeS5jLTkwMy0gKi9cXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmM6OTA0OnZvaWQgcmVtb3ZlX21lbW9yeV9ibG9ja19kZXZpY2VzKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgc2l6ZSlcXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmMtOTA1LXtcXG4tLVxcbmRyaXZlcnMvYmFzZS9tZW1vcnkuYz05NDc9c3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgKm1lbW9yeV9yb290X2F0dHJfZ3JvdXBzW10gPSB7XFxuLS1cXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmMtOTU2LSAqL1xcbmRyaXZlcnMvYmFzZS9tZW1vcnkuYzo5NTc6dm9pZCBfX2luaXQgbWVtb3J5X2Rldl9pbml0KHZvaWQpXFxuZHJpdmVycy9iYXNlL21lbW9yeS5jLTk1OC17XFxuLS1cXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmMtMTAwOS0gKi9cXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmM6MTAxMDppbnQgd2Fsa19tZW1vcnlfYmxvY2tzKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgc2l6ZSxcXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmMtMTAxMS1cXHRcXHQgICAgICAgdm9pZCAqYXJnLCB3YWxrX21lbW9yeV9ibG9ja3NfZnVuY190IGZ1bmMpXFxuLS1cXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmM9MTAzNT1zdHJ1Y3QgZm9yX2VhY2hfbWVtb3J5X2Jsb2NrX2NiX2RhdGEge1xcbi0tXFxuZHJpdmVycy9iYXNlL21lbW9yeS5jLTEwMzktXFxuZHJpdmVycy9iYXNlL21lbW9yeS5jOjEwNDA6c3RhdGljIGludCBmb3JfZWFjaF9tZW1vcnlfYmxvY2tfY2Ioc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICpkYXRhKVxcbmRyaXZlcnMvYmFzZS9tZW1vcnkuYy0xMDQxLXtcXG4tLVxcbmRyaXZlcnMvYmFzZS9tZW1vcnkuYy0xMDU5LSAqL1xcbmRyaXZlcnMvYmFzZS9tZW1vcnkuYzoxMDYwOmludCBmb3JfZWFjaF9tZW1vcnlfYmxvY2sodm9pZCAqYXJnLCB3YWxrX21lbW9yeV9ibG9ja3NfZnVuY190IGZ1bmMpXFxuZHJpdmVycy9iYXNlL21lbW9yeS5jLTEwNjEte1xcbi0tXFxuZHJpdmVycy9iYXNlL21lbW9yeS5jLTEwNzYtICovXFxuZHJpdmVycy9iYXNlL21lbW9yeS5jOjEwNzc6c3RhdGljIGludCBtZW1vcnlfZ3JvdXBfcmVnaXN0ZXIoc3RydWN0IG1lbW9yeV9ncm91cCBncm91cClcXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmMtMTA3OC17XFxuLS1cXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmMtMTExNy0gKi9cXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmM6MTExODppbnQgbWVtb3J5X2dyb3VwX3JlZ2lzdGVyX3N0YXRpYyhpbnQgbmlkLCB1bnNpZ25lZCBsb25nIG1heF9wYWdlcylcXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmMtMTExOS17XFxuLS1cXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmM9MTEzMT1FWFBPUlRfU1lNQk9MX0dQTChtZW1vcnlfZ3JvdXBfcmVnaXN0ZXJfc3RhdGljKTtcXG4tLVxcbmRyaXZlcnMvYmFzZS9tZW1vcnkuYy0xMTQ3LSAqL1xcbmRyaXZlcnMvYmFzZS9tZW1vcnkuYzoxMTQ4OmludCBtZW1vcnlfZ3JvdXBfcmVnaXN0ZXJfZHluYW1pYyhpbnQgbmlkLCB1bnNpZ25lZCBsb25nIHVuaXRfcGFnZXMpXFxuZHJpdmVycy9iYXNlL21lbW9yeS5jLTExNDkte1xcbi0tXFxuZHJpdmVycy9iYXNlL21lbW9yeS5jPTExNjM9RVhQT1JUX1NZTUJPTF9HUEwobWVtb3J5X2dyb3VwX3JlZ2lzdGVyX2R5bmFtaWMpO1xcbi0tXFxuZHJpdmVycy9iYXNlL21lbW9yeS5jLTExNzUtICovXFxuZHJpdmVycy9iYXNlL21lbW9yeS5jOjExNzY6aW50IG1lbW9yeV9ncm91cF91bnJlZ2lzdGVyKGludCBtZ2lkKVxcbmRyaXZlcnMvYmFzZS9tZW1vcnkuYy0xMTc3LXtcXG4tLVxcbmRyaXZlcnMvYmFzZS9tZW1vcnkuYz0xMjAwPXN0cnVjdCBtZW1vcnlfZ3JvdXAgKm1lbW9yeV9ncm91cF9maW5kX2J5X2lkKGludCBtZ2lkKVxcbi0tXFxuZHJpdmVycy9iYXNlL21lbW9yeS5jLTEyMDktICovXFxuZHJpdmVycy9iYXNlL21lbW9yeS5jOjEyMTA6aW50IHdhbGtfZHluYW1pY19tZW1vcnlfZ3JvdXBzKGludCBuaWQsIHdhbGtfbWVtb3J5X2dyb3Vwc19mdW5jX3QgZnVuYyxcXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmMtMTIxMS1cXHRcXHRcXHQgICAgICAgc3RydWN0IG1lbW9yeV9ncm91cCAqZXhjbHVkZWQsIHZvaWQgKmFyZylcXG4tLVxcbmRyaXZlcnMvYmFzZS9tZW1vcnkuYy0xMjMyLSNpZiBkZWZpbmVkKENPTkZJR19NRU1PUllfRkFJTFVSRSkgXFx1MDAyNlxcdTAwMjYgZGVmaW5lZChDT05GSUdfTUVNT1JZX0hPVFBMVUcpXFxuZHJpdmVycy9iYXNlL21lbW9yeS5jOjEyMzM6dm9pZCBtZW1ibGtfbnJfcG9pc29uX2luYyh1bnNpZ25lZCBsb25nIHBmbilcXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmMtMTIzNC17XFxuLS1cXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmMtMTI0My1cXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmM6MTI0NDp2b2lkIG1lbWJsa19ucl9wb2lzb25fc3ViKHVuc2lnbmVkIGxvbmcgcGZuLCBsb25nIGkpXFxuZHJpdmVycy9iYXNlL21lbW9yeS5jLTEyNDUte1xcbi0tXFxuZHJpdmVycy9iYXNlL21lbW9yeS5jLTEyNTQtXFxuZHJpdmVycy9iYXNlL21lbW9yeS5jOjEyNTU6c3RhdGljIHVuc2lnbmVkIGxvbmcgbWVtYmxrX25yX3BvaXNvbihzdHJ1Y3QgbWVtb3J5X2Jsb2NrICptZW0pXFxuZHJpdmVycy9iYXNlL21lbW9yeS5jLTEyNTYte1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xNFQwNzo1MTowNC4xNzIxNTg0OTRaIiwiU2VxIjo1NSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjgtZmxhc2giLCJEdXJhdGlvbiI6NDYzOTU0MDgyMDEsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHlzaXMgb2YgTWVtb3J5IEhvdHBsdWcgYW5kIFpvbmUgQ29udGlndWl0eSBDaGFuZ2VzIGZvciBGdXp6aW5nKipcblxuQWxyaWdodCwgbGV0J3MgYnJlYWsgdGhpcyBkb3duLiBJbiBhIDY0LWJpdCBMaW51eCBlbnZpcm9ubWVudCB3aXRoIGBrYWxsc3ltc2AsIHN0YXRpYyBmdW5jdGlvbnMgdGhhdCBhcmVuJ3QgaW5saW5lZCAqYXJlKiBzeW1ib2xzIGluIGB2bWxpbnV4YCwgdGhhdCdzIHRoZSBrZXkuIFNvLCB0aGUgZmlyc3QgcXVlc3Rpb24gaXMgYWJvdXQgc3ltYm9sIGNvdmVyYWdlIGluIFN5emthbGxlciwgd2hpY2ggaXMgY3J1Y2lhbCBoZXJlLiBBcmUgZnVuY3Rpb25zIGxpa2UgYG1lbW9yeV9ibG9ja19vbmxpbmVgLCBgbWVtb3J5X2Jsb2NrX29mZmxpbmVgLCBgcmVtb3ZlX3Bmbl9yYW5nZV9mcm9tX3pvbmVgLCBhbmQgdGhlIHJlc3QsIGFjdHVhbCBzeW1ib2xzP1xuXG5JIG5lZWQgdG8gY29uZmlybSBpZiB0aG9zZSBzdGF0aWMgZnVuY3Rpb25zLCBlc3BlY2lhbGx5IGBtZW1vcnlfYmxvY2tfb25saW5lYCBhbmQgYHNocmlua196b25lX3NwYW5gLCBhcmUgKm5vdCogaW5saW5lZCwgb3IgaWYgdGhleSdyZSBwdWJsaWMvZXhwb3J0ZWQuIFRoZSBjb2RlIGlzIGluIGBtbS9tZW1vcnlfaG90cGx1Zy5jYC4gQWgsIGdvdCBpdC5cblxuKiAgIGByZW1vdmVfcGZuX3JhbmdlX2Zyb21fem9uZWAgaXMgYSAqbm9uLXN0YXRpYyogZ2xvYmFsIGZ1bmN0aW9uLlxuKiAgIGBhZGp1c3RfcHJlc2VudF9wYWdlX2NvdW50YCBpcyBhbHNvICpub24tc3RhdGljKi5cbiogICBgb2ZmbGluZV9wYWdlc2AgYW5kIGBvbmxpbmVfcGFnZXNgIGFyZSBjbGVhcmx5IG5vbi1zdGF0aWMuXG4qICAgQW5kIHRoZXJlJ3MgYG1vdmVfcGZuX3JhbmdlX3RvX3pvbmVgLCBhbm90aGVyIG5vbi1zdGF0aWMgZnVuY3Rpb24uXG5cbkFuZCBpbiBgbW0vY29tcGFjdGlvbi5jYCwgdGhlcmUncyBgaXNvbGF0ZV9taWdyYXRlcGFnZXNfcmFuZ2VgLCBhbmQgZnJpZW5kcy4gTm93LCB0aGUgY29yZSBxdWVzdGlvbjogQ2FuIEkgaW5jbHVkZSB0aGUgc3RhdGljIG9uZXMsIGxpa2UgYG1lbW9yeV9ibG9ja19vbmxpbmVgLCBvciBgbWVtb3J5X2Jsb2NrX29mZmxpbmVgLCBpbiBgRm9jdXNTeW1ib2xzYD9cblxuTGV0J3MgcmVmZXIgdG8gdGhlIGd1aWRlbGluZXMuIFRoZSBjcml0aWNhbCBiaXQgaXMgdGhlIGhhbmRsaW5nIG9mIHN0YXRpYyBpbmxpbmUgZnVuY3Rpb25zOiBUaGV5ICpsYWNrKiBkaXN0aW5jdCBhZGRyZXNzZXMgaW4gYHZtbGludXhgLiBTbywgSSBuZWVkIHRvIGlkZW50aWZ5IHRoZSBub24tc3RhdGljICpjYWxsZXIqIGZ1bmN0aW9ucyBpbiB0aGUgYC5jYCBmaWxlcyB0aGF0IHVzZSB0aG9zZSBzdGF0aWMgaW5saW5lIGhlbHBlcnMuIEF2b2lkaW5nIHViaXF1aXRvdXMgd3JhcHBlcnMgaXMgaW1wb3J0YW50LlxuXG5TbywgYW55IHN0YXRpYyBmdW5jdGlvbnMgKmluIGAuY2AgZmlsZXMgdGhhdCBhcmVuJ3QgaW5saW5lZCwgb3Igbm9uLXN0YXRpYyBmdW5jdGlvbnMqIEFSRSBzeW1ib2xzIHdpdGggZGlzdGluY3QgYWRkcmVzc2VzLiBQcmlvcml0aXppbmcgbm9uLXN0YXRpYyBmdW5jdGlvbnMgaXMgdGhlIHNhZmVzdCBhcHByb2FjaC5cblxuTGV0J3MgZ28gYmFjayBhbmQgZXhhbWluZSB0aGUgbGlzdC4gV2UgaGF2ZTpcblxuKiAgIGBhZGp1c3RfcHJlc2VudF9wYWdlX2NvdW50YCAobW9kaWZpZWQgZGlyZWN0bHkpLlxuKiAgIGByZW1vdmVfcGZuX3JhbmdlX2Zyb21fem9uZWAgKG1vZGlmaWVkIGRpcmVjdGx5KS5cbiogICBgb2ZmbGluZV9wYWdlc2AgKGNhbGxzIGByZW1vdmVfcGZuX3JhbmdlX2Zyb21fem9uZWApLlxuKiAgIGBvbmxpbmVfcGFnZXNgIChjYWxscyBgYWRqdXN0X3ByZXNlbnRfcGFnZV9jb3VudGAgb3IgYG1vdmVfcGZuX3JhbmdlX3RvX3pvbmVgKS5cbiogICBgbWVtb3J5X2Jsb2NrX29ubGluZWAgKGluIGBkcml2ZXJzL2Jhc2UvbWVtb3J5LmNgKS5cbiogICBgbWVtb3J5X2Jsb2NrX29mZmxpbmVgIChpbiBgZHJpdmVycy9iYXNlL21lbW9yeS5jYCkuXG4qICAgYGlzb2xhdGVfbWlncmF0ZXBhZ2VzX3JhbmdlYCAvIGBpc29sYXRlX2ZyZWVwYWdlc19yYW5nZWAgKGV4ZXJjaXNpbmcgYHpvbmVfaXNfY29udGlndW91c2ApLlxuXG5XaGF0IGFib3V0IGBzaHJpbmtfem9uZV9zcGFuYD8gQWgsIGl0J3MgKnN0YXRpYyogaW4gYG1tL21lbW9yeV9ob3RwbHVnLmNgLCBhbmQgY29udGFpbnMgdGhlIG1vZGlmaWVkIGxvZ2ljLiBDcnVjaWFsbHksIGl0J3MgY2FsbGVkIGJ5IGByZW1vdmVfcGZuX3JhbmdlX2Zyb21fem9uZWAuIFNvIGluY2x1ZGluZyBgcmVtb3ZlX3Bmbl9yYW5nZV9mcm9tX3pvbmVgIGlzIHRoZSBub24tc3RhdGljIHN5bWJvbCB0aGF0IGludm9rZXMgdGhlIHN0YXRpYyBmdW5jdGlvbiwgdGh1cyBgc2hyaW5rX3pvbmVfc3BhbmAgaXMgY292ZXJlZC5cblxuQ3J1Y2lhbGx5OiBhcmUgYW55IG9mIHRoZXNlIHViaXF1aXRvdXM/IE5vISBUaGV5IGFyZSBvbmx5IGNhbGxlZCBkdXJpbmcgbWVtb3J5IGhvdHBsdWcgb3BlcmF0aW9ucywgbm90IGdlbmVyYWwgbGlmZWN5Y2xlIHBhdGhzLiBXaGF0IGFib3V0IGBpc29sYXRlX21pZ3JhdGVwYWdlc19yYW5nZWA/IEl0J3MgY29tcGFjdGlvbi1zcGVjaWZpYy5cblxuVGhlIGNvcmUgb2YgdGhpcyBwYXRjaCBpcyB0aGUgY2hhbmdlIGluIGhvdyB6b25lIGNvbnRpZ3VpdHkgaXMgdHJhY2tlZC4gTm93IGl0J3MgdHJhY2tlZCBkeW5hbWljYWxseSB0aHJvdWdoIGBwYWdlc193aXRoX29ubGluZV9tZW1tYXBgLiBUaGUgcHJldmlvdXMgbWV0aG9kIG9mIHNjYW5uaW5nIGFsbCBwYWdlYmxvY2tzIGluIGEgem9uZSAoYHNldF96b25lX2NvbnRpZ3VvdXNgIGluIGBtbS9tbV9pbml0LmNgKSBpcyBubyBsb25nZXIgdXNlZC4gVGhpcyBpcyBhbGwgdHJpZ2dlcmVkIGR1cmluZyBtZW1vcnkgb25saW5pbmcvb2ZmbGluaW5nIGJ5IGZ1bmN0aW9ucyBsaWtlIGBtZW1vcnlfYmxvY2tfb25saW5lYCwgYG1lbW9yeV9ibG9ja19vZmZsaW5lYCwgZXRjLlxuXG5TbywgbGV0J3MgcmV2aWV3IHRoZSBmaW5hbCBsaXN0IG9mIHN5bWJvbHM6XG5cbiogICBgYWRqdXN0X3ByZXNlbnRfcGFnZV9jb3VudGBcbiogICBgcmVtb3ZlX3Bmbl9yYW5nZV9mcm9tX3pvbmVgXG4qICAgYHNocmlua196b25lX3NwYW5gXG4qICAgYG1lbW9yeV9ibG9ja19vbmxpbmVgXG4qICAgYG1lbW9yeV9ibG9ja19vZmZsaW5lYFxuKiAgIGBvZmZsaW5lX3BhZ2VzYFxuKiAgIGBvbmxpbmVfcGFnZXNgXG4qICAgYGlzb2xhdGVfbWlncmF0ZXBhZ2VzX3JhbmdlYFxuXG5Ob3csIHJlZ2FyZGluZyBgbWVtbWFwX2luaXRfem9uZV9yYW5nZWAgYW5kIGBpbml0X3VuYXZhaWxhYmxlX3JhbmdlYCwgdGhlc2UgYXJlIGBfX2luaXRgIGZ1bmN0aW9ucy4gU2luY2Ugc3l6a2FsbGVyIGZ1enplcyBydW50aW1lIGFmdGVyIGJvb3QsIHdlIHNob3VsZCAqZXhjbHVkZSogdGhlc2UuXG5cbldoYXQgYWJvdXQgY29uZmlndXJhdGlvbiBvcHRpb25zPyBXZSBuZWVkOlxuXG4xLiAgYE1FTU9SWV9IT1RQTFVHYCAoZW5hYmxlcyBgZHJpdmVycy9iYXNlL21lbW9yeS5cblxuIiwiSW5wdXRUb2tlbnMiOjQwNjU1LCJPdXRwdXRUb2tlbnMiOjI2OCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjI0MTksIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMTRUMDc6NTE6NTAuNTY3NTcwNTI1WiIsIlNlcSI6NTYsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InNldC1yZXN1bHRzIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTI0NzU3MTk4LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJNRU1PUllfSE9UUExVR1wiLFxuICAgIFwiTUVNT1JZX0hPVFJFTU9WRVwiLFxuICAgIFwiU1BBUlNFTUVNX1ZNRU1NQVBcIixcbiAgICBcIkNPTVBBQ1RJT05cIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJtZW1vcnlfYmxvY2tfb25saW5lXCIsXG4gICAgXCJtZW1vcnlfYmxvY2tfb2ZmbGluZVwiLFxuICAgIFwiYWRqdXN0X3ByZXNlbnRfcGFnZV9jb3VudFwiLFxuICAgIFwicmVtb3ZlX3Bmbl9yYW5nZV9mcm9tX3pvbmVcIixcbiAgICBcInNocmlua196b25lX3NwYW5cIixcbiAgICBcIm9mZmxpbmVfcGFnZXNcIixcbiAgICBcIm9ubGluZV9wYWdlc1wiLFxuICAgIFwiaXNvbGF0ZV9taWdyYXRlcGFnZXNfcmFuZ2VcIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCByZWZhY3RvcnMgY29yZSBtZW1vcnkgbWFuYWdlbWVudCBsb2dpYyBmb3IgdHJhY2tpbmcgem9uZSBjb250aWd1aXR5IGFuZCBzaHJpbmtpbmcgem9uZSBzcGFucyBhY3Jvc3MgbW0vbWVtb3J5X2hvdHBsdWcuYywgZHJpdmVycy9iYXNlL21lbW9yeS5jLCBhbmQgaW5jbHVkZS9saW51eC9tbXpvbmUuaC4gSW5zdGVhZCBvZiBzY2FubmluZyBwYWdlYmxvY2tzLCB6b25lIGNvbnRpZ3VpdHkgaXMgbm93IHRyYWNrZWQgZHluYW1pY2FsbHkgdmlhIHBhZ2VzX3dpdGhfb25saW5lX21lbW1hcCBhbmQgdXBkYXRlZCBkdXJpbmcgbWVtb3J5IG9ubGluZS9vZmZsaW5lIG9wZXJhdGlvbnMuIEluY29ycmVjdCB6b25lIGNvbnRpZ3VpdHkgdHJhY2tpbmcgY2FuIGxlYWQgdG8gaW52YWxpZCBwZm5fdG9fcGFnZSgpIGxvb2t1cHMgZHVyaW5nIG1lbW9yeSBjb21wYWN0aW9uIChlLmcuIGlzb2xhdGVfbWlncmF0ZXBhZ2VzX3JhbmdlKSwgYW5kIG1vZGlmaWVkIHpvbmUgc2hyaW5raW5nIGxvZ2ljIChzdWJzZWN0aW9uX292ZXJsYXBzX3pvbmUpIGNvdWxkIGNvcnJ1cHQgem9uZSBib3VuZGFyaWVzLiBUaGVzZSBwYXRocyBhcmUgcmVhY2hhYmxlIHZpYSBzeXNmcyBtZW1vcnkgYmxvY2sgbWFuYWdlbWVudCBhbmQgbWVtb3J5IGNvbXBhY3Rpb24uXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiTUVNT1JZX0hPVFBMVUdcIixcbiAgICBcIk1FTU9SWV9IT1RSRU1PVkVcIixcbiAgICBcIlNQQVJTRU1FTV9WTUVNTUFQXCIsXG4gICAgXCJDT01QQUNUSU9OXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwibWVtb3J5X2Jsb2NrX29ubGluZVwiLFxuICAgIFwibWVtb3J5X2Jsb2NrX29mZmxpbmVcIixcbiAgICBcImFkanVzdF9wcmVzZW50X3BhZ2VfY291bnRcIixcbiAgICBcInJlbW92ZV9wZm5fcmFuZ2VfZnJvbV96b25lXCIsXG4gICAgXCJzaHJpbmtfem9uZV9zcGFuXCIsXG4gICAgXCJvZmZsaW5lX3BhZ2VzXCIsXG4gICAgXCJvbmxpbmVfcGFnZXNcIixcbiAgICBcImlzb2xhdGVfbWlncmF0ZXBhZ2VzX3JhbmdlXCJcbiAgXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggcmVmYWN0b3JzIGNvcmUgbWVtb3J5IG1hbmFnZW1lbnQgbG9naWMgZm9yIHRyYWNraW5nIHpvbmUgY29udGlndWl0eSBhbmQgc2hyaW5raW5nIHpvbmUgc3BhbnMgYWNyb3NzIG1tL21lbW9yeV9ob3RwbHVnLmMsIGRyaXZlcnMvYmFzZS9tZW1vcnkuYywgYW5kIGluY2x1ZGUvbGludXgvbW16b25lLmguIEluc3RlYWQgb2Ygc2Nhbm5pbmcgcGFnZWJsb2Nrcywgem9uZSBjb250aWd1aXR5IGlzIG5vdyB0cmFja2VkIGR5bmFtaWNhbGx5IHZpYSBwYWdlc193aXRoX29ubGluZV9tZW1tYXAgYW5kIHVwZGF0ZWQgZHVyaW5nIG1lbW9yeSBvbmxpbmUvb2ZmbGluZSBvcGVyYXRpb25zLiBJbmNvcnJlY3Qgem9uZSBjb250aWd1aXR5IHRyYWNraW5nIGNhbiBsZWFkIHRvIGludmFsaWQgcGZuX3RvX3BhZ2UoKSBsb29rdXBzIGR1cmluZyBtZW1vcnkgY29tcGFjdGlvbiAoZS5nLiBpc29sYXRlX21pZ3JhdGVwYWdlc19yYW5nZSksIGFuZCBtb2RpZmllZCB6b25lIHNocmlua2luZyBsb2dpYyAoc3Vic2VjdGlvbl9vdmVybGFwc196b25lKSBjb3VsZCBjb3JydXB0IHpvbmUgYm91bmRhcmllcy4gVGhlc2UgcGF0aHMgYXJlIHJlYWNoYWJsZSB2aWEgc3lzZnMgbWVtb3J5IGJsb2NrIG1hbmFnZW1lbnQgYW5kIG1lbW9yeSBjb21wYWN0aW9uLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xNFQwNzo1MTo1MC42OTIzMzU5MTNaIiwiU2VxIjo1NywiTmVzdGluZyI6MSwiVHlwZSI6ImFjdGlvbiIsIk5hbWUiOiJJZiIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjQzODA2MDI1NzQ0NSwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTE0VDA3OjUxOjUwLjY5Mjg0MzcxM1oiLCJTZXEiOjU4LCJOZXN0aW5nIjoyLCJUeXBlIjoiYWdlbnQiLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJjb3JlIiwiRHVyYXRpb24iOjQzODA1OTc0NTA0NSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggb3B0aW1pemVzIGNvbnRpZ3VvdXMgem9uZSBkZXRlY3Rpb24gYnkgaW50cm9kdWNpbmcgdGhlIGBwYWdlc193aXRoX29ubGluZV9tZW1tYXBgIGNvdW50ZXIgaW4gYHN0cnVjdCB6b25lYCB0byByZXBsYWNlIHRoZSBpdGVyYXRpb24gb3ZlciBwYWdlYmxvY2tzIGluIGBzZXRfem9uZV9jb250aWd1b3VzKClgLiBJdCBhbHNvIHJlZmFjdG9ycyBzdWJzZWN0aW9uIG92ZXJsYXAgY2hlY2tpbmcgZHVyaW5nIG1lbW9yeSBob3RwbHVnIG9wZXJhdGlvbnMgKGBkcml2ZXJzL2Jhc2UvbWVtb3J5LmNgLCBgbW0vbWVtb3J5X2hvdHBsdWcuY2AsIGBtbS9tbV9pbml0LmNgKS5cXG5cXG5Ob25lIG9mIHRoZSBjaGFuZ2VzIHRvdWNoIGtlcm5lbC10by11c2VyIGNvcHkgbWVjaGFuaXNtcyAoZS5nLiwgYGNvcHlfdG9fdXNlcmAsIG5ldGxpbmssIGlvY3RsLCBldGMuKSwgbm9yIGRvIHRoZXkgaW50cm9kdWNlIHVuaW5pdGlhbGl6ZWQgc3RhY2sgb3IgaGVhcCBhbGxvY2F0aW9ucy4gYHN0cnVjdCB6b25lYCBpbnN0YW5jZXMgYXJlIHplcm8taW5pdGlhbGl6ZWQgZHVyaW5nIGVhcmx5IGJvb3QgYW5kIGhvdHBsdWcgbm9kZSBhbGxvY2F0aW9uLiBBbnkgcG90ZW50aWFsIGxvZ2ljIGJ1Z3MgaW4gY29udGlndW91cyB6b25lIGNhbGN1bGF0aW9uIG9yIFBGTiB0cmF2ZXJzYWwgY291bGQgbGVhZCB0byBpbnZhbGlkIHN0cnVjdCBwYWdlIGRlcmVmZXJlbmNlcyBvciBvdXQtb2YtYm91bmRzIGFjY2Vzc2VzIGR1cmluZyBjb21wYWN0aW9uL3BhZ2UgaXNvbGF0aW9uLCB3aGljaCBmYWxsIHVuZGVyIHRoZSBwdXJ2aWV3IG9mIEtBU0FOIG9yIHN0YW5kYXJkIGZhdWx0IGhhbmRsZXJzLCBub3QgS01TQU4uIFRoZXJlZm9yZSwgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGlzIG5vdCB3YXJyYW50ZWQuXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiBmYWxzZVxufSIsIkluc3RydWN0aW9uIjoiWW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIHNlY3VyaXR5IGVuZ2luZWVyIHNwZWNpYWxpemluZyBpbiBrZXJuZWwgbWVtb3J5XG5lcnJvciBkZXRlY3RvcnMgKEtBU0FOIGFuZCBLTVNBTikuIFlvdXIgam9iIGlzIHRvIHJldmlldyB0aGUgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZFxuZGV0ZXJtaW5lIGlmIHRoZSBjb2RlIGNoYW5nZXMganVzdGlmeSBzcGF3bmluZyBhIGRlZGljYXRlZCBLTVNBTiAoS2VybmVsTWVtb3J5U2FuaXRpemVyKVxuZnV6emluZyBzZXNzaW9uIGluIGFkZGl0aW9uIHRvIHN0YW5kYXJkIEtBU0FOIGZ1enppbmcuXG5cbkNSSVRJQ0FMIERJU1RJTkNUSU9OIEJFVFdFRU4gS0FTQU4gQU5EIEtNU0FOOlxuLSBTdGFuZGFyZCBLQVNBTiBrZXJuZWwgYnVpbGRzICh1cHN0cmVhbS1hcHBhcm1vci1rYXNhbi5jb25maWcpIGFscmVhZHkgZW5hYmxlXG4gIGEgY29tcHJlaGVuc2l2ZSBzdWl0ZSBvZiBkZWJ1Z2dpbmcgdG9vbHMgYW5kIHNhbml0aXplcnMsIGluY2x1ZGluZyBLQVNBTlxuICAob3V0LW9mLWJvdW5kcyBhY2Nlc3NlcywgdXNlLWFmdGVyLWZyZWUsIGRvdWJsZSBmcmVlLCBpbnZhbGlkIGZyZWUpLCBMT0NLREVQXG4gIChsb2NraW5nIGJ1Z3MgYW5kIGRlYWRsb2NrcyksIFVCLXNhbml0aXplcnMsIGFuZCBtZW1vcnkgY29ycnVwdGlvbiBjaGVja3MuXG4tIEtNU0FOIChLZXJuZWxNZW1vcnlTYW5pdGl6ZXIpIGRldGVjdHMgcmVhZHMgb2YgVU5JTklUSUFMSVpFRCBtZW1vcnkgKHN0YWNrLCBoZWFwLFxuICBvciBwYWdlIGFsbG9jYXRpb25zKSBhbmQga2VybmVsLXRvLXVzZXIgbWVtb3J5IGluZm8tbGVha3MuXG5cblJ1bGU6IFRIRVJFIElTIE5PIFNFTlNFIElOIFJVTk5JTkcgQSBLTVNBTiBTRVNTSU9OIElGIEEgQlVHIENBTiBCRSBDQVVHSFQgQlkgS0FTQU4sXG5MT0NLREVQLCBPUiBPVEhFUiBTVEFOREFSRCBCVUcgREVURUNUT1JTLlxuQSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGluY3VycyBzaWduaWZpY2FudCByZXNvdXJjZSBjb3N0cy4gWW91IG11c3QgT05MWVxuc2V0IE5lZWRzS01TQU49dHJ1ZSBpZiB0aGUgY29kZSBjaGFuZ2VzIGludHJvZHVjZSBvciBleHBvc2UgVU5JTklUSUFMSVpFRCBNRU1PUlkgcmlza3NcbnRoYXQgYXJlIGRldGVjdGVkIE9OTFkgYnkgS01TQU4uXG5cbkxvb2sgaG9saXN0aWNhbGx5IGF0IHRoZSBwYXRjaCBzZXJpZXMgYW5kIHN1cnJvdW5kaW5nIGNvZGUuIEV2ZW4gaWYgbm8gZGlyZWN0XG51bmluaXRpYWxpemVkIGZpZWxkIGFjY2Vzc2VzIG9yIG5ldyBidWZmZXIgYWxsb2NhdGlvbnMgYXJlIGFkZGVkIGluIHRoZSBkaWZmIGl0c2VsZixcbmEgcGF0Y2ggbWF5IGFsdGVyIGNvbnRyb2wgZmxvdywgYm91bmRzIGNoZWNraW5nLCBvciBkYXRhIGxlbmd0aCBjYWxjdWxhdGlvbnMgaW4gd2F5c1xudGhhdCBjaGFuZ2UgaG93IHRoZSByZXN0IG9mIHRoZSBjb2RlIG9wZXJhdGVzIG9uIGV4aXN0aW5nIGJ1ZmZlcnMgKGUuZy4gYWxsb3dpbmdcbnVuaW5pdGlhbGl6ZWQgc3RhY2svaGVhcCBtZW1vcnkgdG8gYmUgcmVhZCwgY29waWVkIHRvIHVzZXIgc3BhY2UsIG9yIHVzZWQgaW4gY29udHJvbFxuZmxvdykuIERvIG5vdCBoZXNpdGF0ZSB0byB1c2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBpbnNwZWN0IHRoZSBzdXJyb3VuZGluZyBjb2RlLFxuY2FsbGVkIGZ1bmN0aW9ucywgYW5kIGNhbGxlcnMuXG5cblNldCBOZWVkc0tNU0FOPXRydWUgT05MWSBJRiB0aGUgcGF0Y2ggaW50cm9kdWNlcyBvciBtb2RpZmllczpcbjEuIEtlcm5lbCBzdHJ1Y3R1cmVzIHNlbnQgdG8gdXNlciBzcGFjZSAodmlhIGNvcHlfdG9fdXNlciwgcHV0X3VzZXIsIG5ldGxpbmsgc2tiXG4gICBhdHRyaWJ1dGVzLCBpb2N0bCBvdXRwdXQgYXJndW1lbnRzLCBzb2NrZXQgb3B0aW9ucywgb3IgQlBGIGJ1ZmZlcnMpIHdoZXJlIGZpZWxkc1xuICAgb3Igc3RydWN0dXJlIHBhZGRpbmcgbWlnaHQgbm90IGJlIGZ1bGx5IGluaXRpYWxpemVkL3plcm9lZC5cbjIuIENvbmRpdGlvbmFsIGxvZ2ljIG9yIGJyYW5jaGluZyB0aGF0IGRlcGVuZHMgb24gcG90ZW50aWFsbHkgdW5pbml0aWFsaXplZCB2YXJpYWJsZXNcbiAgIG9yIHN0cnVjdCBmaWVsZHMuXG4zLiBBbGxvY2F0aW9uIG9yIGluaXRpYWxpemF0aW9uIG9mIGNvbXBsZXggZGF0YSBzdHJ1Y3R1cmVzIHdoZXJlIHVuaW5pdGlhbGl6ZWQgZmllbGRzXG4gICBjb3VsZCBiZSByZWFkIGxhdGVyIGluIHJlYWNoYWJsZSBjb2RlIHBhdGhzLlxuNC4gQm91bmRzIGNoZWNrcywgbGVuZ3Rocywgb3IgbG9naWMgaW4gYSB3YXkgdGhhdCBhbGxvd3Mgc3Vycm91bmRpbmcgY29kZSB0byBhY2Nlc3NcbiAgIHVuaW5pdGlhbGl6ZWQgYnl0ZXMgb2YgZXhpc3RpbmcgYnVmZmVycy5cblxuU2V0IE5lZWRzS01TQU49ZmFsc2UgSUY6XG4tIFRoZSBjb2RlIGNoYW5nZXMgcHJpbWFyaWx5IHJpc2sgb3V0LW9mLWJvdW5kcyBhY2Nlc3MsIGFycmF5IG92ZXJmbG93cywgTlVMTCBwb2ludGVyXG4gIGRlcmVmZXJlbmNlcywgbG9ja2luZyBkZWFkbG9ja3MsIG9yIHVzZS1hZnRlci1mcmVlIGJ1Z3MgKHRoZXNlIGFyZSBhbHJlYWR5IGNhdWdodFxuICBieSBLQVNBTiwgTE9DS0RFUCwgb3Igc3RhbmRhcmQgYnVnIGRldGVjdG9ycykuXG4tIEFsbCBzdGFjay9oZWFwIHN0cnVjdHVyZXMgdG91Y2hlZCBvciBpbnRyb2R1Y2VkIGJ5IHRoZSBwYXRjaCBhcmUgZnVsbHkgemVyb2VkXG4gIG9yIGluaXRpYWxpemVkIChlLmcuIHVzaW5nID0gezB9LCBtZW1zZXQsIGt6YWxsb2MpIGJlZm9yZSBiZWluZyByZWFkIG9yIGNvcGllZC5cbi0gVGhlIHBhdGNoIGRvZXMgbm90IGludHJvZHVjZSBhbnkgcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSB1c2FnZSBvciBpbmZvLWxlYWtzLlxuXG5Vc2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBpbnNwZWN0IHRoZSBzdXJyb3VuZGluZyBjb2RlIGlmIG5lY2Vzc2FyeSwgdGhlbiBwcm92aWRlXG5kZXRhaWxlZCBLTVNBTlJlYXNvbmluZyBjb250cmFzdGluZyBLQVNBTiB2cyBLTVNBTiBhcHBsaWNhYmlsaXR5IGZvciB0aGlzIHBhdGNoLlxuUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuXG5cblxuVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy5cbkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LlxuSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLlxuIiwiUHJvbXB0IjoiVGFyZ2V0IGFyY2hpdGVjdHVyZTogYW1kNjRcblxuRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6XG5jb21taXQgYjc1NzQxZTk2MDQ3MDRmYzUwNmIxODNjNTJkNTE1MjFlMjQwMTA5MFxuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBNb24gU2VwIDE0IDA3OjQyOjU2IDIwMjYgKzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9tbS9waHlzaWNhbF9tZW1vcnkucnN0IGIvRG9jdW1lbnRhdGlvbi9tbS9waHlzaWNhbF9tZW1vcnkucnN0XG5pbmRleCBhMDk0MDdkNzI5NzM2Li4yZTY3ZThiMjNhOTk0IDEwMDY0NFxuLS0tIGEvRG9jdW1lbnRhdGlvbi9tbS9waHlzaWNhbF9tZW1vcnkucnN0XG4rKysgYi9Eb2N1bWVudGF0aW9uL21tL3BoeXNpY2FsX21lbW9yeS5yc3RcbkBAIC00ODAsNiArNDgwLDEyIEBAIEdlbmVyYWxcbiAgIGBgcHJlc2VudF9wYWdlc2BgIHNob3VsZCB1c2UgYGBnZXRfb25saW5lX21lbXMoKWBgIHRvIGdldCBhIHN0YWJsZSB2YWx1ZS4gSXRcbiAgIGlzIGluaXRpYWxpemVkIGJ5IGBgY2FsY3VsYXRlX25vZGVfdG90YWxwYWdlcygpYGAuXG4gXG4rYGBwYWdlc193aXRoX29ubGluZV9tZW1tYXBgYFxuKyAgUGFnZXMgd2l0aGluIHRoZSB6b25lIHRoYXQgaGF2ZSBhbiBvbmxpbmUgbWVtb3J5IG1hcDogcHJlc2VudCBwYWdlcyBhbmRcbisgIG1lbW9yeSBob2xlcyB3aG9zZSBtZW1vcnkgbWFwIGhhcyBiZWVuIGluaXRpYWxpemVkIGFuZFxuKyAgYGBwZm5fdG9fb25saW5lX3BhZ2UoKWBgIHN1Y2NlZWRzLiBTZWUgdGhlIGNvbW1lbnQgZm9yXG4rICBgYHBhZ2VzX3dpdGhfb25saW5lX21lbW1hcGBgIGluIGBgaW5jbHVkZS9saW51eC9tbXpvbmUuaGBgIGZvciBtb3JlIGRldGFpbHMuXG4rXG4gYGBwcmVzZW50X2Vhcmx5X3BhZ2VzYGBcbiAgIFRoZSBwcmVzZW50IHBhZ2VzIGV4aXN0aW5nIHdpdGhpbiB0aGUgem9uZSBsb2NhdGVkIG9uIG1lbW9yeSBhdmFpbGFibGUgc2luY2VcbiAgIGVhcmx5IGJvb3QsIGV4Y2x1ZGluZyBob3RwbHVnZ2VkIG1lbW9yeS4gRGVmaW5lZCBvbmx5IHdoZW5cbmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvbWVtb3J5LmMgYi9kcml2ZXJzL2Jhc2UvbWVtb3J5LmNcbmluZGV4IDVlZWFkMzM0NmYxZTMuLjI4Zjk1MDNmNmE3MTAgMTAwNjQ0XG4tLS0gYS9kcml2ZXJzL2Jhc2UvbWVtb3J5LmNcbisrKyBiL2RyaXZlcnMvYmFzZS9tZW1vcnkuY1xuQEAgLTI1NSw2ICsyNTUsNyBAQCBzdGF0aWMgaW50IG1lbW9yeV9ibG9ja19vbmxpbmUoc3RydWN0IG1lbW9yeV9ibG9jayAqbWVtKVxuIFx0XHRucl92bWVtbWFwX3BhZ2VzID0gbWVtLVx1MDAzZWFsdG1hcC1cdTAwM2VmcmVlO1xuIFxuIFx0bWVtX2hvdHBsdWdfYmVnaW4oKTtcbitcdGNsZWFyX3pvbmVfY29udGlndW91cyh6b25lKTtcbiBcdGlmIChucl92bWVtbWFwX3BhZ2VzKSB7XG4gXHRcdHJldCA9IG1ocF9pbml0X21lbW1hcF9vbl9tZW1vcnkoc3RhcnRfcGZuLCBucl92bWVtbWFwX3BhZ2VzLCB6b25lKTtcbiBcdFx0aWYgKHJldClcbkBAIC0yNzksNiArMjgwLDcgQEAgc3RhdGljIGludCBtZW1vcnlfYmxvY2tfb25saW5lKHN0cnVjdCBtZW1vcnlfYmxvY2sgKm1lbSlcbiBcbiBcdG1lbS1cdTAwM2V6b25lID0gem9uZTtcbiBvdXQ6XG4rXHRzZXRfem9uZV9jb250aWd1b3VzKHpvbmUpO1xuIFx0bWVtX2hvdHBsdWdfZG9uZSgpO1xuIFx0cmV0dXJuIHJldDtcbiB9XG5AQCAtMzA0LDYgKzMwNiw3IEBAIHN0YXRpYyBpbnQgbWVtb3J5X2Jsb2NrX29mZmxpbmUoc3RydWN0IG1lbW9yeV9ibG9jayAqbWVtKVxuIFx0XHRucl92bWVtbWFwX3BhZ2VzID0gbWVtLVx1MDAzZWFsdG1hcC1cdTAwM2VmcmVlO1xuIFxuIFx0bWVtX2hvdHBsdWdfYmVnaW4oKTtcbitcdGNsZWFyX3pvbmVfY29udGlndW91cyhtZW0tXHUwMDNlem9uZSk7XG4gXHRpZiAobnJfdm1lbW1hcF9wYWdlcylcbiBcdFx0YWRqdXN0X3ByZXNlbnRfcGFnZV9jb3VudChwZm5fdG9fcGFnZShzdGFydF9wZm4pLCBtZW0tXHUwMDNlZ3JvdXAsXG4gXHRcdFx0XHRcdCAgLW5yX3ZtZW1tYXBfcGFnZXMpO1xuQEAgLTMyMSw4ICszMjQsMTAgQEAgc3RhdGljIGludCBtZW1vcnlfYmxvY2tfb2ZmbGluZShzdHJ1Y3QgbWVtb3J5X2Jsb2NrICptZW0pXG4gXHRpZiAobnJfdm1lbW1hcF9wYWdlcylcbiBcdFx0bWhwX2RlaW5pdF9tZW1tYXBfb25fbWVtb3J5KHN0YXJ0X3BmbiwgbnJfdm1lbW1hcF9wYWdlcyk7XG4gXG4tXHRtZW0tXHUwMDNlem9uZSA9IE5VTEw7XG4gb3V0OlxuK1x0c2V0X3pvbmVfY29udGlndW91cyhtZW0tXHUwMDNlem9uZSk7XG4rXHRpZiAoIXJldClcbitcdFx0bWVtLVx1MDAzZXpvbmUgPSBOVUxMO1xuIFx0bWVtX2hvdHBsdWdfZG9uZSgpO1xuIFx0cmV0dXJuIHJldDtcbiB9XG5kaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tbXpvbmUuaCBiL2luY2x1ZGUvbGludXgvbW16b25lLmhcbmluZGV4IDk0ZjljM2ZmNTQxNjAuLjdiZWZlNTAyMjNkMTIgMTAwNjQ0XG4tLS0gYS9pbmNsdWRlL2xpbnV4L21tem9uZS5oXG4rKysgYi9pbmNsdWRlL2xpbnV4L21tem9uZS5oXG5AQCAtMTA0Myw2ICsxMDQzLDQyIEBAIHN0cnVjdCB6b25lIHtcbiBcdCAqIGNtYSBwYWdlcyBpcyBwcmVzZW50IHBhZ2VzIHRoYXQgYXJlIGFzc2lnbmVkIGZvciBDTUEgdXNlXG4gXHQgKiAoTUlHUkFURV9DTUEpLlxuIFx0ICpcbitcdCAqIHBhZ2VzX3dpdGhfb25saW5lX21lbW1hcCB0cmFja3MgcGFnZXMgd2l0aGluIHRoZSB6b25lIHRoYXQgaGF2ZVxuK1x0ICogYW4gb25saW5lIG1lbW9yeSBtYXA6IHByZXNlbnQgcGFnZXMgYW5kIG1lbW9yeSBob2xlcyB3aG9zZVxuK1x0ICogbWVtb3J5IG1hcCBoYXMgYmVlbiBpbml0aWFsaXplZCBhbmQgcGZuX3RvX29ubGluZV9wYWdlKClcbitcdCAqIHN1Y2NlZWRzLiBXaGVuIHNwYW5uZWRfcGFnZXMgPT0gcGFnZXNfd2l0aF9vbmxpbmVfbWVtbWFwLFxuK1x0ICogcGZuX3RvX3BhZ2UoKSBjYW4gYmUgcGVyZm9ybWVkIHdpdGhvdXQgZnVydGhlciBjaGVja3Mgb24gYW55XG4rXHQgKiBQRk4gd2l0aGluIHRoZSB6b25lIHNwYW4uXG4rXHQgKlxuK1x0ICogTm90ZTogdGhpcyBjb3VudGVyIG1heSB0ZW1wb3JhcmlseSB1bmRlcmNvdW50IHdoZW4gcGFnZXMgd2l0aCBhblxuK1x0ICogb25saW5lIG1lbW9yeSBtYXAgZXhpc3Qgb3V0c2lkZSB0aGUgY3VycmVudCB6b25lIHNwYW4uIFN1Y2ggcGFnZXNcbitcdCAqIGFyZSBvbmx5IGNyZWF0ZWQgZHVyaW5nIGJvb3QsIHdoZW4gaW5pdGlhbGl6aW5nIHRoZSBtZW1vcnkgbWFwIG9mXG4rXHQgKiBwYWdlcyB0aGF0IGRvIG5vdCBmYWxsIGludG8gYW55IHpvbmUgc3Bhbi4gVGhlIHVuZGVyY291bnQgaXRzZWxmXG4rXHQgKiBjYW4gb25seSBoYXBwZW4gYWZ0ZXIgYm9vdCwgZHVyaW5nIG1lbW9yeSBob3RwbHVnLCB3aGVuIGdyb3dpbmdcbitcdCAqIHRoZSB6b25lIHRvIGNvdmVyIHN1Y2ggcGFnZXMgYW5kIGxhdGVyIHNocmlua2luZyBpdCBiYWNrLCB3aGljaFxuK1x0ICogbWF5IHJlc3VsdCBpbiBhIFwidG9vIHNtYWxsXCIgdmFsdWUuIFRoaXMgaXMgc2FmZTogaXQgbWVyZWx5XG4rXHQgKiBwcmV2ZW50cyBkZXRlY3RpbmcgYSBjb250aWd1b3VzIHpvbmUuXG4rXHQgKlxuK1x0ICogSGVyZSBpcyBhbiBleGFtcGxlIChwYWdlIG51bWJlcnMgYXJlIGp1c3QgZm9yIGlsbHVzdHJhdGlvblxuK1x0ICogcHVycG9zZXMpOlxuK1x0ICogICBhZnRlciBib290OlxuK1x0ICogICAgICAgWyAgem9uZSBzcGFuICBdXG4rXHQgKiAgICAgICBbICAgem9uZSBwYWdlcyAgIF1cbitcdCAqICAgICAgIHNwYW5uZWQ9MTAsIGluaXRpYWxpemVkPTE1LCBvbmxpbmU9MTBcbitcdCAqICAgICAgIG9ubGluZSA9PSBzcGFubmVkICAtXHUwMDNlICBjb250aWd1b3VzXG4rXHQgKlxuK1x0ICogICBncm93aW5nIGFmdGVyIGhvdHBsdWcgKGhvdHBsdWcgNSk6XG4rXHQgKiAgICAgICBbICB6b25lIHNwYW4gICAgICAgICAgICAgICAgICAgICAgICAgIF1cbitcdCAqICAgICAgIFsgICB6b25lIHBhZ2VzICAgXSAgIFsgICB6b25lIHBhZ2VzICAgXVxuK1x0ICogICAgICAgc3Bhbm5lZD0zMCwgaW5pdGlhbGl6ZWQ9MjAsIG9ubGluZT0xNVxuK1x0ICogICAgICAgb25saW5lICE9IHNwYW5uZWQgIC1cdTAwM2UgIG5vdCBjb250aWd1b3VzXG4rXHQgKlxuK1x0ICogICBzaHJpbmtpbmcgYWZ0ZXIgaG90dW5wbHVnIChob3R1bnBsdWcgNSBhZ2Fpbik6XG4rXHQgKiAgICAgICBbICB6b25lIHNwYW4gICAgIF1cbitcdCAqICAgICAgIFsgICB6b25lIHBhZ2VzICAgXVxuK1x0ICogICAgICAgc3Bhbm5lZD0xNSwgaW5pdGlhbGl6ZWQ9MTUsIG9ubGluZT0xMFxuK1x0ICogICAgICAgb25saW5lICE9IHNwYW5uZWQgIC1cdTAwM2UgIG5vdCBjb250aWd1b3VzIGFsdGhvdWdoIGNvbnRpZ3VvdXNcbitcdCAqXG4gXHQgKiBTbyBwcmVzZW50X3BhZ2VzIG1heSBiZSB1c2VkIGJ5IG1lbW9yeSBob3RwbHVnIG9yIG1lbW9yeSBwb3dlclxuIFx0ICogbWFuYWdlbWVudCBsb2dpYyB0byBmaWd1cmUgb3V0IHVubWFuYWdlZCBwYWdlcyBieSBjaGVja2luZ1xuIFx0ICogKHByZXNlbnRfcGFnZXMgLSBtYW5hZ2VkX3BhZ2VzKS4gQW5kIG1hbmFnZWRfcGFnZXMgc2hvdWxkIGJlIHVzZWRcbkBAIC0xMDY3LDYgKzExMDMsNyBAQCBzdHJ1Y3Qgem9uZSB7XG4gXHRhdG9taWNfbG9uZ190XHRcdG1hbmFnZWRfcGFnZXM7XG4gXHR1bnNpZ25lZCBsb25nXHRcdHNwYW5uZWRfcGFnZXM7XG4gXHR1bnNpZ25lZCBsb25nXHRcdHByZXNlbnRfcGFnZXM7XG4rXHR1bnNpZ25lZCBsb25nXHRcdHBhZ2VzX3dpdGhfb25saW5lX21lbW1hcDtcbiAjaWYgZGVmaW5lZChDT05GSUdfTUVNT1JZX0hPVFBMVUcpXG4gXHR1bnNpZ25lZCBsb25nXHRcdHByZXNlbnRfZWFybHlfcGFnZXM7XG4gI2VuZGlmXG5AQCAtMTY5NCw2ICsxNzMxLDM4IEBAIHN0YXRpYyBpbmxpbmUgYm9vbCB6b25lX2lzX3pvbmVfZGV2aWNlKGNvbnN0IHN0cnVjdCB6b25lICp6b25lKVxuIH1cbiAjZW5kaWZcbiBcbisvKipcbisgKiB6b25lX2lzX2NvbnRpZ3VvdXMgLSB0ZXN0IHdoZXRoZXIgYSB6b25lIGlzIGNvbnRpZ3VvdXNcbisgKiBAem9uZTogdGhlIHpvbmUgdG8gdGVzdC5cbisgKlxuKyAqIEluIGEgY29udGlndW91cyB6b25lLCBpdCBpcyB2YWxpZCB0byBjYWxsIHBmbl90b19wYWdlKCkgb24gYW55IFBGTiBpbiB0aGVcbisgKiBzcGFubmVkIHpvbmUgd2l0aG91dCByZXF1aXJpbmcgcGZuX3ZhbGlkKCkgb3IgcGZuX3RvX29ubGluZV9wYWdlKCkgY2hlY2tzLlxuKyAqXG4rICogTm90ZSB0aGF0IG1pc3Npbmcgc3luY2hyb25pemF0aW9uIHdpdGggbWVtb3J5IG9mZmxpbmluZyBtYWtlcyBhbnkgUEZOXG4rICogdHJhdmVyc2FsIHByb25lIHRvIHJhY2VzLlxuKyAqXG4rICogWk9ORV9ERVZJQ0Ugem9uZXMgYXJlIGFsd2F5cyBtYXJrZWQgbm9uLWNvbnRpZ3VvdXMuXG4rICpcbisgKiBSZXR1cm46IHRydWUgaWYgY29udGlndW91cywgb3RoZXJ3aXNlIGZhbHNlLlxuKyAqL1xuK3N0YXRpYyBpbmxpbmUgYm9vbCB6b25lX2lzX2NvbnRpZ3VvdXMoY29uc3Qgc3RydWN0IHpvbmUgKnpvbmUpXG4re1xuK1x0cmV0dXJuIFJFQURfT05DRSh6b25lLVx1MDAzZWNvbnRpZ3VvdXMpO1xuK31cbitcbitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X3pvbmVfY29udGlndW91cyhzdHJ1Y3Qgem9uZSAqem9uZSlcbit7XG4rXHRpZiAoem9uZV9pc196b25lX2RldmljZSh6b25lKSlcbitcdFx0cmV0dXJuO1xuK1x0aWYgKHpvbmUtXHUwMDNlc3Bhbm5lZF9wYWdlcyA9PSB6b25lLVx1MDAzZXBhZ2VzX3dpdGhfb25saW5lX21lbW1hcClcbitcdFx0V1JJVEVfT05DRSh6b25lLVx1MDAzZWNvbnRpZ3VvdXMsIHRydWUpO1xuK31cbitcbitzdGF0aWMgaW5saW5lIHZvaWQgY2xlYXJfem9uZV9jb250aWd1b3VzKHN0cnVjdCB6b25lICp6b25lKVxuK3tcbitcdFdSSVRFX09OQ0Uoem9uZS1cdTAwM2Vjb250aWd1b3VzLCBmYWxzZSk7XG4rfVxuK1xuIC8qXG4gICogUmV0dXJucyB0cnVlIGlmIGEgem9uZSBoYXMgcGFnZXMgbWFuYWdlZCBieSB0aGUgYnVkZHkgYWxsb2NhdG9yLlxuICAqIEFsbCB0aGUgcmVjbGFpbSBkZWNpc2lvbnMgaGF2ZSB0byB1c2UgdGhpcyBmdW5jdGlvbiByYXRoZXIgdGhhblxuZGlmZiAtLWdpdCBhL21tL21lbW9yeV9ob3RwbHVnLmMgYi9tbS9tZW1vcnlfaG90cGx1Zy5jXG5pbmRleCAyMjZhYjljYjA3OGFkLi4xMDA5NDFkMWI4MjhhIDEwMDY0NFxuLS0tIGEvbW0vbWVtb3J5X2hvdHBsdWcuY1xuKysrIGIvbW0vbWVtb3J5X2hvdHBsdWcuY1xuQEAgLTQyNSw0OSArNDI1LDM5IEBAIGludCBfX2FkZF9wYWdlcyhpbnQgbmlkLCB1bnNpZ25lZCBsb25nIHBmbiwgdW5zaWduZWQgbG9uZyBucl9wYWdlcyxcbiBcdHJldHVybiBlcnI7XG4gfVxuIFxuLS8qIGZpbmQgdGhlIHNtYWxsZXN0IHZhbGlkIHBmbiBpbiB0aGUgcmFuZ2UgW3N0YXJ0X3BmbiwgZW5kX3BmbikgKi9cbi1zdGF0aWMgdW5zaWduZWQgbG9uZyBmaW5kX3NtYWxsZXN0X3NlY3Rpb25fcGZuKGludCBuaWQsIHN0cnVjdCB6b25lICp6b25lLFxuLVx0XHRcdFx0ICAgICB1bnNpZ25lZCBsb25nIHN0YXJ0X3Bmbixcbi1cdFx0XHRcdCAgICAgdW5zaWduZWQgbG9uZyBlbmRfcGZuKVxuK3N0YXRpYyBib29sIHN1YnNlY3Rpb25fb3ZlcmxhcHNfem9uZSh1bnNpZ25lZCBsb25nIHBmbiwgc3RydWN0IHpvbmUgKnpvbmUpXG4ge1xuLVx0Zm9yICg7IHN0YXJ0X3BmbiBcdTAwM2MgZW5kX3Bmbjsgc3RhcnRfcGZuICs9IFBBR0VTX1BFUl9TVUJTRUNUSU9OKSB7XG4tXHRcdGlmICh1bmxpa2VseSghcGZuX3RvX29ubGluZV9wYWdlKHN0YXJ0X3BmbikpKVxuLVx0XHRcdGNvbnRpbnVlO1xuK1x0Y29uc3QgdW5zaWduZWQgbG9uZyBzdGFydF9wZm4gPSBBTElHTl9ET1dOKHBmbiwgUEFHRVNfUEVSX1NVQlNFQ1RJT04pO1xuK1x0Y29uc3QgdW5zaWduZWQgbG9uZyBlbmRfcGZuID0gc3RhcnRfcGZuICsgUEFHRVNfUEVSX1NVQlNFQ1RJT04gLSAxO1xuIFxuLVx0XHRpZiAodW5saWtlbHkocGZuX3RvX25pZChzdGFydF9wZm4pICE9IG5pZCkpXG4tXHRcdFx0Y29udGludWU7XG4rXHQvKiBBbGwgcGFnZXMgaW4gYSBzdWJzZWN0aW9uIGFyZSBlaXRoZXIgb25saW5lIG9yIG9mZmxpbmUuICovXG4rXHRpZiAodW5saWtlbHkoIXBmbl90b19vbmxpbmVfcGFnZShzdGFydF9wZm4pKSlcbitcdFx0cmV0dXJuIGZhbHNlO1xuIFxuLVx0XHRpZiAoem9uZSAhPSBwYWdlX3pvbmUocGZuX3RvX3BhZ2Uoc3RhcnRfcGZuKSkpXG4tXHRcdFx0Y29udGludWU7XG4rXHQvKiBDaGVja2luZyBzdGFydCtlbmQgaXMgc3VmZmljaWVudC4gKi9cbitcdHJldHVybiB6b25lID09IHBhZ2Vfem9uZShwZm5fdG9fcGFnZShzdGFydF9wZm4pKSB8fFxuK1x0ICAgICAgIHpvbmUgPT0gcGFnZV96b25lKHBmbl90b19wYWdlKGVuZF9wZm4pKTtcbit9XG4gXG4tXHRcdHJldHVybiBzdGFydF9wZm47XG4rLyogZmluZCB0aGUgc21hbGxlc3QgdmFsaWQgcGZuIGluIHRoZSByYW5nZSBbc3RhcnRfcGZuLCBlbmRfcGZuKSAqL1xuK3N0YXRpYyB1bnNpZ25lZCBsb25nIGZpbmRfc21hbGxlc3Rfc2VjdGlvbl9wZm4oc3RydWN0IHpvbmUgKnpvbmUsXG4rXHRcdHVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuLCB1bnNpZ25lZCBsb25nIGVuZF9wZm4pXG4re1xuK1x0Zm9yICg7IHN0YXJ0X3BmbiBcdTAwM2MgZW5kX3Bmbjsgc3RhcnRfcGZuICs9IFBBR0VTX1BFUl9TVUJTRUNUSU9OKSB7XG4rXHRcdGlmIChzdWJzZWN0aW9uX292ZXJsYXBzX3pvbmUoc3RhcnRfcGZuLCB6b25lKSlcbitcdFx0XHRyZXR1cm4gc3RhcnRfcGZuO1xuIFx0fVxuLVxuIFx0cmV0dXJuIDA7XG4gfVxuIFxuIC8qIGZpbmQgdGhlIGJpZ2dlc3QgdmFsaWQgcGZuIGluIHRoZSByYW5nZSBbc3RhcnRfcGZuLCBlbmRfcGZuKS4gKi9cbi1zdGF0aWMgdW5zaWduZWQgbG9uZyBmaW5kX2JpZ2dlc3Rfc2VjdGlvbl9wZm4oaW50IG5pZCwgc3RydWN0IHpvbmUgKnpvbmUsXG4tXHRcdFx0XHQgICAgdW5zaWduZWQgbG9uZyBzdGFydF9wZm4sXG4tXHRcdFx0XHQgICAgdW5zaWduZWQgbG9uZyBlbmRfcGZuKVxuK3N0YXRpYyB1bnNpZ25lZCBsb25nIGZpbmRfYmlnZ2VzdF9zZWN0aW9uX3BmbihzdHJ1Y3Qgem9uZSAqem9uZSxcbitcdFx0dW5zaWduZWQgbG9uZyBzdGFydF9wZm4sIHVuc2lnbmVkIGxvbmcgZW5kX3BmbilcbiB7XG4tXHR1bnNpZ25lZCBsb25nIHBmbjtcbi1cbi1cdC8qIHBmbiBpcyB0aGUgZW5kIHBmbiBvZiBhIG1lbW9yeSBzZWN0aW9uLiAqL1xuLVx0cGZuID0gZW5kX3BmbiAtIDE7XG4tXHRmb3IgKDsgcGZuIFx1MDAzZT0gc3RhcnRfcGZuOyBwZm4gLT0gUEFHRVNfUEVSX1NVQlNFQ1RJT04pIHtcbi1cdFx0aWYgKHVubGlrZWx5KCFwZm5fdG9fb25saW5lX3BhZ2UocGZuKSkpXG4tXHRcdFx0Y29udGludWU7XG4tXG4tXHRcdGlmICh1bmxpa2VseShwZm5fdG9fbmlkKHBmbikgIT0gbmlkKSlcbi1cdFx0XHRjb250aW51ZTtcbi1cbi1cdFx0aWYgKHpvbmUgIT0gcGFnZV96b25lKHBmbl90b19wYWdlKHBmbikpKVxuLVx0XHRcdGNvbnRpbnVlO1xuLVxuLVx0XHRyZXR1cm4gcGZuO1xuK1x0Zm9yICg7IGVuZF9wZm4gXHUwMDNlIHN0YXJ0X3BmbjsgZW5kX3BmbiAtPSBQQUdFU19QRVJfU1VCU0VDVElPTikge1xuK1x0XHRpZiAoc3Vic2VjdGlvbl9vdmVybGFwc196b25lKGVuZF9wZm4gLSAxLCB6b25lKSlcbitcdFx0XHRyZXR1cm4gZW5kX3BmbiAtIDE7XG4gXHR9XG4tXG4gXHRyZXR1cm4gMDtcbiB9XG4gXG5AQCAtNDc1LDcgKzQ2NSw2IEBAIHN0YXRpYyB2b2lkIHNocmlua196b25lX3NwYW4oc3RydWN0IHpvbmUgKnpvbmUsIHVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuLFxuIFx0XHRcdCAgICAgdW5zaWduZWQgbG9uZyBlbmRfcGZuKVxuIHtcbiBcdHVuc2lnbmVkIGxvbmcgcGZuO1xuLVx0aW50IG5pZCA9IHpvbmVfdG9fbmlkKHpvbmUpO1xuIFxuIFx0aWYgKHpvbmUtXHUwMDNlem9uZV9zdGFydF9wZm4gPT0gc3RhcnRfcGZuKSB7XG4gXHRcdC8qXG5AQCAtNDg0LDcgKzQ3Myw3IEBAIHN0YXRpYyB2b2lkIHNocmlua196b25lX3NwYW4oc3RydWN0IHpvbmUgKnpvbmUsIHVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuLFxuIFx0XHQgKiBJbiB0aGlzIGNhc2UsIHdlIGZpbmQgc2Vjb25kIHNtYWxsZXN0IHZhbGlkIG1lbV9zZWN0aW9uXG4gXHRcdCAqIGZvciBzaHJpbmtpbmcgem9uZS5cbiBcdFx0ICovXG4tXHRcdHBmbiA9IGZpbmRfc21hbGxlc3Rfc2VjdGlvbl9wZm4obmlkLCB6b25lLCBlbmRfcGZuLFxuK1x0XHRwZm4gPSBmaW5kX3NtYWxsZXN0X3NlY3Rpb25fcGZuKHpvbmUsIGVuZF9wZm4sXG4gXHRcdFx0XHRcdFx0em9uZV9lbmRfcGZuKHpvbmUpKTtcbiBcdFx0aWYgKHBmbikge1xuIFx0XHRcdHpvbmUtXHUwMDNlc3Bhbm5lZF9wYWdlcyA9IHpvbmVfZW5kX3Bmbih6b25lKSAtIHBmbjtcbkBAIC01MDAsNyArNDg5LDcgQEAgc3RhdGljIHZvaWQgc2hyaW5rX3pvbmVfc3BhbihzdHJ1Y3Qgem9uZSAqem9uZSwgdW5zaWduZWQgbG9uZyBzdGFydF9wZm4sXG4gXHRcdCAqIEluIHRoaXMgY2FzZSwgd2UgZmluZCBzZWNvbmQgYmlnZ2VzdCB2YWxpZCBtZW1fc2VjdGlvbiBmb3JcbiBcdFx0ICogc2hyaW5raW5nIHpvbmUuXG4gXHRcdCAqL1xuLVx0XHRwZm4gPSBmaW5kX2JpZ2dlc3Rfc2VjdGlvbl9wZm4obmlkLCB6b25lLCB6b25lLVx1MDAzZXpvbmVfc3RhcnRfcGZuLFxuK1x0XHRwZm4gPSBmaW5kX2JpZ2dlc3Rfc2VjdGlvbl9wZm4oem9uZSwgem9uZS1cdTAwM2V6b25lX3N0YXJ0X3BmbixcbiBcdFx0XHRcdFx0ICAgICAgIHN0YXJ0X3Bmbik7XG4gXHRcdGlmIChwZm4pXG4gXHRcdFx0em9uZS1cdTAwM2VzcGFubmVkX3BhZ2VzID0gcGZuIC0gem9uZS1cdTAwM2V6b25lX3N0YXJ0X3BmbiArIDE7XG5AQCAtNTYwLDE4ICs1NDksMTMgQEAgdm9pZCByZW1vdmVfcGZuX3JhbmdlX2Zyb21fem9uZShzdHJ1Y3Qgem9uZSAqem9uZSxcbiBcbiBcdC8qXG4gXHQgKiBab25lIHNocmlua2luZyBjb2RlIGNhbm5vdCBwcm9wZXJseSBkZWFsIHdpdGggWk9ORV9ERVZJQ0UuIFNvXG4tXHQgKiB3ZSB3aWxsIG5vdCB0cnkgdG8gc2hyaW5rIHRoZSB6b25lcyAtIHdoaWNoIGlzIG9rYXkgYXNcbi1cdCAqIHNldF96b25lX2NvbnRpZ3VvdXMoKSBjYW5ub3QgZGVhbCB3aXRoIFpPTkVfREVWSUNFIGVpdGhlciB3YXkuXG4rXHQgKiB3ZSB3aWxsIG5vdCB0cnkgdG8gc2hyaW5rIGl0LlxuIFx0ICovXG4gXHRpZiAoem9uZV9pc196b25lX2RldmljZSh6b25lKSlcbiBcdFx0cmV0dXJuO1xuIFxuLVx0Y2xlYXJfem9uZV9jb250aWd1b3VzKHpvbmUpO1xuLVxuIFx0c2hyaW5rX3pvbmVfc3Bhbih6b25lLCBzdGFydF9wZm4sIHN0YXJ0X3BmbiArIG5yX3BhZ2VzKTtcbiBcdHVwZGF0ZV9wZ2RhdF9zcGFuKHBnZGF0KTtcbi1cbi1cdHNldF96b25lX2NvbnRpZ3VvdXMoem9uZSk7XG4gfVxuIFxuIC8qKlxuQEAgLTc0OSw4ICs3MzMsNiBAQCB2b2lkIG1vdmVfcGZuX3JhbmdlX3RvX3pvbmUoc3RydWN0IHpvbmUgKnpvbmUsIHVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuLFxuIFx0c3RydWN0IHBnbGlzdF9kYXRhICpwZ2RhdCA9IHpvbmUtXHUwMDNlem9uZV9wZ2RhdDtcbiBcdGludCBuaWQgPSBwZ2RhdC1cdTAwM2Vub2RlX2lkO1xuIFxuLVx0Y2xlYXJfem9uZV9jb250aWd1b3VzKHpvbmUpO1xuLVxuIFx0aWYgKHpvbmVfaXNfZW1wdHkoem9uZSkpXG4gXHRcdGluaXRfY3VycmVudGx5X2VtcHR5X3pvbmUoem9uZSwgc3RhcnRfcGZuLCBucl9wYWdlcyk7XG4gXHRyZXNpemVfem9uZV9yYW5nZSh6b25lLCBzdGFydF9wZm4sIG5yX3BhZ2VzKTtcbkBAIC03NzgsOCArNzYwLDYgQEAgdm9pZCBtb3ZlX3Bmbl9yYW5nZV90b196b25lKHN0cnVjdCB6b25lICp6b25lLCB1bnNpZ25lZCBsb25nIHN0YXJ0X3BmbixcbiBcdG1lbW1hcF9pbml0X3JhbmdlKG5yX3BhZ2VzLCBuaWQsIHpvbmVfaWR4KHpvbmUpLCBzdGFydF9wZm4sIDAsXG4gXHRcdFx0IE1FTUlOSVRfSE9UUExVRywgYWx0bWFwLCBtaWdyYXRldHlwZSxcbiBcdFx0XHQgaXNvbGF0ZV9wYWdlYmxvY2spO1xuLVxuLVx0c2V0X3pvbmVfY29udGlndW91cyh6b25lKTtcbiB9XG4gXG4gc3RydWN0IGF1dG9fbW92YWJsZV9zdGF0cyB7XG5AQCAtMTA3NSw2ICsxMDU1LDcgQEAgdm9pZCBhZGp1c3RfcHJlc2VudF9wYWdlX2NvdW50KHN0cnVjdCBwYWdlICpwYWdlLCBzdHJ1Y3QgbWVtb3J5X2dyb3VwICpncm91cCxcbiBcdGlmIChlYXJseV9zZWN0aW9uKF9fcGZuX3RvX3NlY3Rpb24ocGFnZV90b19wZm4ocGFnZSkpKSlcbiBcdFx0em9uZS1cdTAwM2VwcmVzZW50X2Vhcmx5X3BhZ2VzICs9IG5yX3BhZ2VzO1xuIFx0em9uZS1cdTAwM2VwcmVzZW50X3BhZ2VzICs9IG5yX3BhZ2VzO1xuK1x0em9uZS1cdTAwM2VwYWdlc193aXRoX29ubGluZV9tZW1tYXAgKz0gbnJfcGFnZXM7XG4gXHR6b25lLVx1MDAzZXpvbmVfcGdkYXQtXHUwMDNlbm9kZV9wcmVzZW50X3BhZ2VzICs9IG5yX3BhZ2VzO1xuIFxuIFx0aWYgKGdyb3VwIFx1MDAyNlx1MDAyNiBtb3ZhYmxlKVxuZGlmZiAtLWdpdCBhL21tL21tX2luaXQuYyBiL21tL21tX2luaXQuY1xuaW5kZXggMTUzM2FlYmFmYjY4OC4uZDQwYThmZjIzMzcwMCAxMDA2NDRcbi0tLSBhL21tL21tX2luaXQuY1xuKysrIGIvbW0vbW1faW5pdC5jXG5AQCAtODE3LDIyICs4MTcsMzkgQEAgdm9pZCBfX21lbWluaXQgaW5pdF9kZWZlcnJlZF9wYWdlKHVuc2lnbmVkIGxvbmcgcGZuLCBpbnQgbmlkKVxuICAqICAgem9uZS9ub2RlIGFib3ZlIHRoZSBob2xlIGV4Y2VwdCBmb3IgdGhlIHRyYWlsaW5nIHBhZ2VzIGluIHRoZSBsYXN0XG4gICogICBzZWN0aW9uIHRoYXQgd2lsbCBiZSBhcHBlbmRlZCB0byB0aGUgem9uZS9ub2RlIGJlbG93LlxuICAqL1xuLXN0YXRpYyB2b2lkIF9faW5pdCBpbml0X3VuYXZhaWxhYmxlX3JhbmdlKHVuc2lnbmVkIGxvbmcgc3Bmbixcbi1cdFx0XHRcdFx0ICB1bnNpZ25lZCBsb25nIGVwZm4sXG4tXHRcdFx0XHRcdCAgaW50IHpvbmUsIGludCBub2RlKVxuK3N0YXRpYyB1bnNpZ25lZCBsb25nIF9faW5pdCBpbml0X3VuYXZhaWxhYmxlX3JhbmdlKHVuc2lnbmVkIGxvbmcgc3BmbixcbitcdFx0XHRcdFx0XHQgICB1bnNpZ25lZCBsb25nIGVwZm4sXG4rXHRcdFx0XHRcdFx0ICAgaW50IHpvbmUsIGludCBub2RlKVxuIHtcbitcdHVuc2lnbmVkIGxvbmcgbmV4dF9jaHVua19wZm4gX19tYXliZV91bnVzZWQgPSBzcGZuO1xuIFx0dW5zaWduZWQgbG9uZyBwZm47XG4tXHR1NjQgcGdjbnQgPSAwO1xuK1x0dTY0IG9ubGluZV9wZ2NudCA9IDAsIHBnY250ID0gMDtcbitcdGJvb2wgaXNfb25saW5lID0gdHJ1ZTtcbiBcbiBcdGZvcl9lYWNoX3ZhbGlkX3BmbihwZm4sIHNwZm4sIGVwZm4pIHtcbiBcdFx0X19pbml0X3NpbmdsZV9wYWdlKHBmbl90b19wYWdlKHBmbiksIHBmbiwgem9uZSwgbm9kZSk7XG4gXHRcdF9fU2V0UGFnZVJlc2VydmVkKHBmbl90b19wYWdlKHBmbikpO1xuIFx0XHRwZ2NudCsrO1xuK1xuK1x0XHQvKlxuK1x0XHQgKiBXaXRoIHZtZW1tYXAsIGF0IHRoaXMgc3RhZ2UgYWxsIHBhZ2VzIGluIGFuIGVhcmx5IHNlY3Rpb25cbitcdFx0ICogaGF2ZSBhIHZhbGlkIG1lbW1hcCBhbmQgYXJlIG1hcmtlZCBhcyBvbmxpbmUuIEhvd2V2ZXIsIG9ubHlcbitcdFx0ICogc3Vic2VjdGlvbnMgaW4gdGhlIHN1YnNlY3Rpb24gbWFwIGFyZSBhY3R1YWxseSBvbmxpbmUuXG4rXHRcdCAqL1xuKyNpZmRlZiBDT05GSUdfU1BBUlNFTUVNX1ZNRU1NQVBcbitcdFx0aWYgKHBmbiBcdTAwM2U9IG5leHRfY2h1bmtfcGZuKSB7XG4rXHRcdFx0aXNfb25saW5lID0gcGZuX3NlY3Rpb25fdmFsaWQoX19wZm5fdG9fc2VjdGlvbihwZm4pLCBwZm4pO1xuK1x0XHRcdG5leHRfY2h1bmtfcGZuID0gbWluKFNVQlNFQ1RJT05fQUxJR05fVVAocGZuICsgMSksIGVwZm4pO1xuK1x0XHR9XG4rI2VuZGlmXG4rXHRcdGlmIChpc19vbmxpbmUpXG4rXHRcdFx0b25saW5lX3BnY250Kys7XG4gXHR9XG4gXG4gXHRpZiAocGdjbnQpXG4gXHRcdHByX2luZm8oXCJPbiBub2RlICVkLCB6b25lICVzOiAlbGxkIHBhZ2VzIGluIHVuYXZhaWxhYmxlIHJhbmdlc1xcblwiLFxuIFx0XHRcdG5vZGUsIHpvbmVfbmFtZXNbem9uZV0sIHBnY250KTtcbitcdHJldHVybiBvbmxpbmVfcGdjbnQ7XG4gfVxuIFxuIC8qXG5AQCAtOTMwLDkgKzk0NywyMSBAQCBzdGF0aWMgdm9pZCBfX2luaXQgbWVtbWFwX2luaXRfem9uZV9yYW5nZShzdHJ1Y3Qgem9uZSAqem9uZSxcbiBcdG1lbW1hcF9pbml0X3JhbmdlKGVuZF9wZm4gLSBzdGFydF9wZm4sIG5pZCwgem9uZV9pZCwgc3RhcnRfcGZuLFxuIFx0XHRcdCAgem9uZV9lbmRfcGZuLCBNRU1JTklUX0VBUkxZLCBOVUxMLCBNSUdSQVRFX01PVkFCTEUsXG4gXHRcdFx0ICBmYWxzZSk7XG4rXHR6b25lLVx1MDAzZXBhZ2VzX3dpdGhfb25saW5lX21lbW1hcCArPSBlbmRfcGZuIC0gc3RhcnRfcGZuO1xuIFxuLVx0aWYgKCpob2xlX3BmbiBcdTAwM2Mgc3RhcnRfcGZuKVxuLVx0XHRpbml0X3VuYXZhaWxhYmxlX3JhbmdlKCpob2xlX3Bmbiwgc3RhcnRfcGZuLCB6b25lX2lkLCBuaWQpO1xuK1x0aWYgKCpob2xlX3BmbiBcdTAwM2Mgc3RhcnRfcGZuKSB7XG4rXHRcdHVuc2lnbmVkIGxvbmcgaG9sZV9zdGFydF9wZm4gPSAqaG9sZV9wZm47XG4rXHRcdHVuc2lnbmVkIGxvbmcgcGdjbnQ7XG4rXG4rXHRcdGlmIChob2xlX3N0YXJ0X3BmbiBcdTAwM2Mgem9uZV9zdGFydF9wZm4pIHtcbitcdFx0XHRpbml0X3VuYXZhaWxhYmxlX3JhbmdlKGhvbGVfc3RhcnRfcGZuLCB6b25lX3N0YXJ0X3BmbixcbitcdFx0XHRcdFx0ICAgICAgIHpvbmVfaWQsIG5pZCk7XG4rXHRcdFx0aG9sZV9zdGFydF9wZm4gPSB6b25lX3N0YXJ0X3BmbjtcbitcdFx0fVxuK1x0XHRwZ2NudCA9IGluaXRfdW5hdmFpbGFibGVfcmFuZ2UoaG9sZV9zdGFydF9wZm4sIHN0YXJ0X3BmbixcbitcdFx0XHRcdFx0ICAgICAgIHpvbmVfaWQsIG5pZCk7XG4rXHRcdHpvbmUtXHUwMDNlcGFnZXNfd2l0aF9vbmxpbmVfbWVtbWFwICs9IHBnY250O1xuK1x0fVxuIFxuIFx0KmhvbGVfcGZuID0gZW5kX3BmbjtcbiB9XG5AQCAtMjE4OCwyOCArMjIxNyw2IEBAIHZvaWQgX19pbml0IGluaXRfY21hX3BhZ2VibG9jayhzdHJ1Y3QgcGFnZSAqcGFnZSlcbiB9XG4gI2VuZGlmXG4gXG4tdm9pZCBzZXRfem9uZV9jb250aWd1b3VzKHN0cnVjdCB6b25lICp6b25lKVxuLXtcbi1cdHVuc2lnbmVkIGxvbmcgYmxvY2tfc3RhcnRfcGZuID0gem9uZS1cdTAwM2V6b25lX3N0YXJ0X3Bmbjtcbi1cdHVuc2lnbmVkIGxvbmcgYmxvY2tfZW5kX3Bmbjtcbi1cbi1cdGJsb2NrX2VuZF9wZm4gPSBwYWdlYmxvY2tfZW5kX3BmbihibG9ja19zdGFydF9wZm4pO1xuLVx0Zm9yICg7IGJsb2NrX3N0YXJ0X3BmbiBcdTAwM2Mgem9uZV9lbmRfcGZuKHpvbmUpO1xuLVx0XHRcdGJsb2NrX3N0YXJ0X3BmbiA9IGJsb2NrX2VuZF9wZm4sXG4tXHRcdFx0IGJsb2NrX2VuZF9wZm4gKz0gcGFnZWJsb2NrX25yX3BhZ2VzKSB7XG4tXG4tXHRcdGJsb2NrX2VuZF9wZm4gPSBtaW4oYmxvY2tfZW5kX3Bmbiwgem9uZV9lbmRfcGZuKHpvbmUpKTtcbi1cbi1cdFx0aWYgKCFfX3BhZ2VibG9ja19wZm5fdG9fcGFnZShibG9ja19zdGFydF9wZm4sXG4tXHRcdFx0XHRcdCAgICAgYmxvY2tfZW5kX3Bmbiwgem9uZSkpXG4tXHRcdFx0cmV0dXJuO1xuLVx0XHRjb25kX3Jlc2NoZWQoKTtcbi1cdH1cbi1cbi1cdC8qIFdlIGNvbmZpcm0gdGhhdCB0aGVyZSBpcyBubyBob2xlICovXG4tXHR6b25lLVx1MDAzZWNvbnRpZ3VvdXMgPSB0cnVlO1xuLX1cbi1cbiAvKlxuICAqIENoZWNrIGlmIGEgUEZOIHJhbmdlIGludGVyc2VjdHMgbXVsdGlwbGUgem9uZXMgb24gb25lIG9yIG1vcmVcbiAgKiBOVU1BIG5vZGVzLiBTcGVjaWZ5IHRoZSBAbmlkIGFyZ3VtZW50IGlmIGl0IGlzIGtub3duIHRoYXQgdGhpc1xuZGlmZiAtLWdpdCBhL21tL21tX2luaXQuaCBiL21tL21tX2luaXQuaFxuaW5kZXggMzlmNzVkZjliZTFjMi4uNTIwZDUzZWNjNjhkNSAxMDA2NDRcbi0tLSBhL21tL21tX2luaXQuaFxuKysrIGIvbW0vbW1faW5pdC5oXG5AQCAtMjAsMTUgKzIwLDkgQEAgc3RydWN0IHZtZW1fYWx0bWFwO1xuIC8qIHBlcmZvcm0gc2FuaXR5IGNoZWNrcyBvbiBzdHJ1Y3QgcGFnZXMgYmVpbmcgYWxsb2NhdGVkIG9yIGZyZWVkICovXG4gREVDTEFSRV9TVEFUSUNfS0VZX01BWUJFKENPTkZJR19ERUJVR19WTSwgY2hlY2tfcGFnZXNfZW5hYmxlZCk7XG4gXG4tdm9pZCBzZXRfem9uZV9jb250aWd1b3VzKHN0cnVjdCB6b25lICp6b25lKTtcbiBib29sIHBmbl9yYW5nZV9pbnRlcnNlY3RzX3pvbmVzKGludCBuaWQsIHVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuLFxuIFx0XHRcdCAgIHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMpO1xuIFxuLXN0YXRpYyBpbmxpbmUgdm9pZCBjbGVhcl96b25lX2NvbnRpZ3VvdXMoc3RydWN0IHpvbmUgKnpvbmUpXG4te1xuLVx0em9uZS1cdTAwM2Vjb250aWd1b3VzID0gZmFsc2U7XG4tfVxuLVxuIHZvaWQgbWVtYmxvY2tfZnJlZV9wYWdlcyh1bnNpZ25lZCBsb25nIHBmbiwgdW5zaWduZWQgaW50IG9yZGVyKTtcbiBcbiB2b2lkICptZW1tYXBfYWxsb2MocGh5c19hZGRyX3Qgc2l6ZSwgcGh5c19hZGRyX3QgYWxpZ24sIHBoeXNfYWRkcl90IG1pbl9hZGRyLFxuZGlmZiAtLWdpdCBhL21tL3BhZ2VfYWxsb2MuaCBiL21tL3BhZ2VfYWxsb2MuaFxuaW5kZXggYjkyNTlkZWRkYjU5ZC4uZDQxODJmN2NiN2RkZiAxMDA2NDRcbi0tLSBhL21tL3BhZ2VfYWxsb2MuaFxuKysrIGIvbW0vcGFnZV9hbGxvYy5oXG5AQCAtMjE0LDcgKzIxNCw3IEBAIGV4dGVybiBzdHJ1Y3QgcGFnZSAqX19wYWdlYmxvY2tfcGZuX3RvX3BhZ2UodW5zaWduZWQgbG9uZyBzdGFydF9wZm4sXG4gc3RhdGljIGlubGluZSBzdHJ1Y3QgcGFnZSAqcGFnZWJsb2NrX3Bmbl90b19wYWdlKHVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuLFxuIFx0XHRcdFx0dW5zaWduZWQgbG9uZyBlbmRfcGZuLCBzdHJ1Y3Qgem9uZSAqem9uZSlcbiB7XG4tXHRpZiAoem9uZS1cdTAwM2Vjb250aWd1b3VzKVxuK1x0aWYgKHpvbmVfaXNfY29udGlndW91cyh6b25lKSlcbiBcdFx0cmV0dXJuIHBmbl90b19wYWdlKHN0YXJ0X3Bmbik7XG4gXG4gXHRyZXR1cm4gX19wYWdlYmxvY2tfcGZuX3RvX3BhZ2Uoc3RhcnRfcGZuLCBlbmRfcGZuLCB6b25lKTtcbiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTE0VDA3OjUxOjUwLjY5Mjg0NDU2M1oiLCJTZXEiOjU5LCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuOC1mbGFzaCIsIkR1cmF0aW9uIjoxMjU5OTM0ODYxMSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgdGhlIE1lbW9yeSBNYW5hZ2VtZW50IFBhdGNoIGZvciBLTVNBTiBJbXBsaWNhdGlvbnMqKlxuXG5Pa2F5LCBzbyB0aGlzIHBhdGNoIGlzIGFsbCBhYm91dCByZWZpbmluZyBob3cgdGhlIGtlcm5lbCB0cmFja3MgY29udGlndW91cyBtZW1vcnkgem9uZXMsIHNwZWNpZmljYWxseSBpbnRyb2R1Y2luZyBgcGFnZXNfd2l0aF9vbmxpbmVfbWVtbWFwYCBhbmQgdXBkYXRpbmcgYHNldF96b25lX2NvbnRpZ3VvdXNgLiBMZXQncyBicmVhayBkb3duIG15IHVuZGVyc3RhbmRpbmc6XG5cbjEuICBJdCBpbnRyb2R1Y2VzIGBwYWdlc193aXRoX29ubGluZV9tZW1tYXBgIHdpdGhpbiB0aGUgYHN0cnVjdCB6b25lYCwgYW5kIGluaXRpYWxpemVzIG9yIHVwZGF0ZXMgdGhpcyB2YWx1ZSBpbiBgbWVtbWFwX2luaXRfem9uZV9yYW5nZWAsIGBpbml0X3VuYXZhaWxhYmxlX3JhbmdlYCwgYW5kIGBhZGp1c3RfcHJlc2VudF9wYWdlX2NvdW50YC5cblxuMi4gIFRoZSBpbXBsZW1lbnRhdGlvbiBvZiBgc2V0X3pvbmVfY29udGlndW91c2AgaXMgc2ltcGxpZmllZC4gSW5zdGVhZCBvZiB0cmF2ZXJzaW5nIHBhZ2VibG9ja3MsIGl0IG5vdyBjaGVja3MgaWYgYHNwYW5uZWRfcGFnZXNgIGVxdWFscyBgcGFnZXNfd2l0aF9vbmxpbmVfbWVtbWFwYC4gSWYgc28sIGl0IHNldHMgYGNvbnRpZ3VvdXNgIHRvIHRydWUuIFRoaXMgdXNlcyBgV1JJVEVfT05DRWAgYW5kIGBSRUFEX09OQ0VgIGZvciBzeW5jaHJvbml6YXRpb24sIHdoaWNoIGlzIGdvb2QuIFRoZSBgbWVtb3J5X2Jsb2NrX29ubGluZWAgYW5kIGBtZW1vcnlfYmxvY2tfb2ZmbGluZWAgZnVuY3Rpb25zIGluIGBkcml2ZXJzL2Jhc2UvbWVtb3J5LmNgIGFyZSB1cGRhdGVkIHRvIGNsZWFyIGFuZCBzZXQgdGhlIGNvbnRpZ3VvdXMgZmxhZyBkdXJpbmcgaG90cGx1ZyBvcGVyYXRpb25zLiBUaGUgaG90cGx1ZyBjb2RlIGluIGBtbS9tZW1vcnlfaG90cGx1Zy5jYCBpcyBhbHNvIGNoYW5nZWQgdG8gdXNlIHN1YnNlY3Rpb25fb3ZlcmxhcHNfem9uZVxuXG5Ob3csIEknbSBhdCB0aGUgS01TQU4gcGFydC4gVGhpcyBpcyB3aGVyZSBJIGhhdmUgdG8gYmUgY2FyZWZ1bC4gVGhlIGluc3RydWN0aW9ucyBzYXkgdG8gb25seSBmbGFnIGBOZWVkc0tNU0FOPXRydWVgIGlmIHRoZXJlJ3MgYSByaXNrIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJlYWRzIG9yIGluZm9ybWF0aW9uIGxlYWtzLiBTdGFuZGFyZCBLQVNBTiBzaG91bGQgaGFuZGxlIE9PQiwgVUFGLCBkb3VibGUgZnJlZXMsIGFuZCBsb2NraW5nIGlzc3Vlcywgc28gSSBzaG91bGRuJ3QgZHVwbGljYXRlIGVmZm9ydC5cblxuVGhlIGtleSBxdWVzdGlvbnMgZm9yIG1lIGFyZTpcbiogICBEb2VzIHRoaXMgcGF0Y2ggaW50cm9kdWNlIG5ldyBrZXJuZWwgc3RydWN0dXJlcyBwYXNzZWQgdG8gdXNlcnNwYWNlIHRoYXQgbWlnaHQgaGF2ZSB1bmluaXRpYWxpemVkIGZpZWxkcz9cbiogICBEb2VzIGl0IGhhdmUgYnJhbmNoaW5nIGxvZ2ljIHRoYXQgZGVwZW5kcyBvbiBwb3RlbnRpYWxseSB1bmluaXRpYWxpemVkIHZhcmlhYmxlcz9cbiogICBBcmUgdGhlcmUgbmV3IGNvbXBsZXggZGF0YSBzdHJ1Y3R1cmVzIHdoZXJlIHVuaW5pdGlhbGl6ZWQgZmllbGRzIGNvdWxkIGJlIHJlYWQgbGF0ZXI/XG4qICAgRG9lcyB0aGUgcGF0Y2ggaW50cm9kdWNlIGEgY2hhbmNlIG9mIHVuaW5pdGlhbGl6ZWQgYnl0ZXMgZ2V0dGluZyByZWFkIHRocm91Z2ggY2hhbmdlcyB0byBib3VuZHMgY2hlY2tzLCBsZW5ndGhzLCBldGM/XG5cbkknbSBpbml0aWFsbHkgbGVhbmluZyB0b3dhcmRzIFwiTm9cIiBiZWNhdXNlIG1vc3Qgb2YgdGhlIGNoYW5nZXMgc2VlbSB0byBiZSBhYm91dCBtZW1vcnkgdHJhY2tpbmcgYW5kIHN5bmNocm9uaXphdGlvbi5cblxuSG93ZXZlciwgSSBuZWVkIHRvIGJlICphYnNvbHV0ZWx5KiBzdXJlLiBUaGUgY3JpdGljYWwgcGllY2Ugb2YgY29kZSBJIG5lZWQgdG8gcmVhbGx5IGxvb2sgYXQgaXMgdGhlIGNoYW5nZXMgdG8gYHNldF96b25lX2NvbnRpZ3VvdXNgLCBiZWNhdXNlIG9mIHRoaXMgYHBhZ2VibG9ja19wZm5fdG9fcGFnZWAgZnVuY3Rpb24uIElmIGB6b25lYCBpcyBkZXRlcm1pbmVkIHRvICpub3QqIGJlIGNvbnRpZ3VvdXMsIHRoZW4gdGhlIGNvZGUgY2FsbHMgYF9fcGFnZWJsb2NrX3Bmbl90b19wYWdlYC4gSXMgdGhlcmUgYSBzaXR1YXRpb24gd2hlcmUgdGhlcmUgaXMgYSByYWNlIHdoZXJlIGB6b25lYCBjb3VsZCBiZSBjb25zaWRlcmVkIG5vdCBjb250aWd1b3VzIHdoZW4gaXQgYWN0dWFsbHkgKmlzKj8gQW5kIHdoYXQgYWJvdXQgYHBhZ2VibG9ja19wZm5fdG9fcGFnZWAgaXRzZWxmPyBJJ20gZ29pbmcgdG8gZG8gYSBncmVwIHRvIHVuZGVyc3RhbmQgdGhlIHVzZXMgb2YgdGhhdCBmdW5jdGlvbi4gSSBoYXZlIHRvIGxvb2sgZm9yIGFueSBzY2VuYXJpb3Mgd2hlcmUgaXQgY291bGQgbGVhZCB0byB1bmluaXRpYWxpemVkIG1lbW9yeSBiZWluZyByZWFkLlxuXG5cbiIsIklucHV0VG9rZW5zIjo3NTY5LCJPdXRwdXRUb2tlbnMiOjIzLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6OTM5LCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTRUMDc6NTI6MDMuMjkyMTk2Mzk0WiIsIlNlcSI6NjAsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyMzAyNTA3MDY4LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcInBhZ2VibG9ja19wZm5fdG9fcGFnZVwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJtbS9jb21wYWN0aW9uLmM9NzEzPWlzb2xhdGVfZnJlZXBhZ2VzX3JhbmdlKHN0cnVjdCBjb21wYWN0X2NvbnRyb2wgKmNjLFxcbi0tXFxubW0vY29tcGFjdGlvbi5jLTc0NS1cXG5tbS9jb21wYWN0aW9uLmM6NzQ2OlxcdFxcdGlmICghcGFnZWJsb2NrX3Bmbl90b19wYWdlKGJsb2NrX3N0YXJ0X3BmbixcXG5tbS9jb21wYWN0aW9uLmMtNzQ3LVxcdFxcdFxcdFxcdFxcdGJsb2NrX2VuZF9wZm4sIGNjLVxcdTAwM2V6b25lKSlcXG4tLVxcbm1tL2NvbXBhY3Rpb24uYz0xMzM3PWlzb2xhdGVfbWlncmF0ZXBhZ2VzX3JhbmdlKHN0cnVjdCBjb21wYWN0X2NvbnRyb2wgKmNjLCB1bnNpZ25lZCBsb25nIHN0YXJ0X3BmbixcXG4tLVxcbm1tL2NvbXBhY3Rpb24uYy0xMzU1LVxcbm1tL2NvbXBhY3Rpb24uYzoxMzU2OlxcdFxcdGlmICghcGFnZWJsb2NrX3Bmbl90b19wYWdlKGJsb2NrX3N0YXJ0X3BmbixcXG5tbS9jb21wYWN0aW9uLmMtMTM1Ny1cXHRcXHRcXHRcXHRcXHRibG9ja19lbmRfcGZuLCBjYy1cXHUwMDNlem9uZSkpXFxuLS1cXG5tbS9jb21wYWN0aW9uLmM9MTUwNz1mYXN0X2lzb2xhdGVfYXJvdW5kKHN0cnVjdCBjb21wYWN0X2NvbnRyb2wgKmNjLCB1bnNpZ25lZCBsb25nIHBmbilcXG4tLVxcbm1tL2NvbXBhY3Rpb24uYy0xNTIzLVxcbm1tL2NvbXBhY3Rpb24uYzoxNTI0OlxcdHBhZ2UgPSBwYWdlYmxvY2tfcGZuX3RvX3BhZ2Uoc3RhcnRfcGZuLCBlbmRfcGZuLCBjYy1cXHUwMDNlem9uZSk7XFxubW0vY29tcGFjdGlvbi5jLTE1MjUtXFx0aWYgKCFwYWdlKVxcbi0tXFxubW0vY29tcGFjdGlvbi5jPTE1NTM9c3RhdGljIHZvaWQgZmFzdF9pc29sYXRlX2ZyZWVwYWdlcyhzdHJ1Y3QgY29tcGFjdF9jb250cm9sICpjYylcXG4tLVxcbm1tL2NvbXBhY3Rpb24uYy0xNjk0LVxcdFxcdFxcdFxcdGlmIChjYy1cXHUwMDNlZGlyZWN0X2NvbXBhY3Rpb24gXFx1MDAyNlxcdTAwMjYgcGZuX3ZhbGlkKG1pbl9wZm4pKSB7XFxubW0vY29tcGFjdGlvbi5jOjE2OTU6XFx0XFx0XFx0XFx0XFx0cGFnZSA9IHBhZ2VibG9ja19wZm5fdG9fcGFnZShtaW5fcGZuLFxcbm1tL2NvbXBhY3Rpb24uYy0xNjk2LVxcdFxcdFxcdFxcdFxcdFxcdG1pbihwYWdlYmxvY2tfZW5kX3BmbihtaW5fcGZuKSxcXG4tLVxcbm1tL2NvbXBhY3Rpb24uYz0xNzI1PXN0YXRpYyB2b2lkIGlzb2xhdGVfZnJlZXBhZ2VzKHN0cnVjdCBjb21wYWN0X2NvbnRyb2wgKmNjKVxcbi0tXFxubW0vY29tcGFjdGlvbi5jLTE3NzUtXFxubW0vY29tcGFjdGlvbi5jOjE3NzY6XFx0XFx0cGFnZSA9IHBhZ2VibG9ja19wZm5fdG9fcGFnZShibG9ja19zdGFydF9wZm4sIGJsb2NrX2VuZF9wZm4sXFxubW0vY29tcGFjdGlvbi5jLTE3NzctXFx0XFx0XFx0XFx0XFx0XFx0XFx0XFx0XFx0em9uZSk7XFxuLS1cXG5tbS9jb21wYWN0aW9uLmM9MjA5MT1zdGF0aWMgaXNvbGF0ZV9taWdyYXRlX3QgaXNvbGF0ZV9taWdyYXRlcGFnZXMoc3RydWN0IGNvbXBhY3RfY29udHJvbCAqY2MpXFxuLS1cXG5tbS9jb21wYWN0aW9uLmMtMjEzOS1cXG5tbS9jb21wYWN0aW9uLmM6MjE0MDpcXHRcXHRwYWdlID0gcGFnZWJsb2NrX3Bmbl90b19wYWdlKGJsb2NrX3N0YXJ0X3BmbixcXG5tbS9jb21wYWN0aW9uLmMtMjE0MS1cXHRcXHRcXHRcXHRcXHRcXHRibG9ja19lbmRfcGZuLCBjYy1cXHUwMDNlem9uZSk7XFxuLS1cXG5tbS9wYWdlX2FsbG9jLmM9MTYwMD12b2lkIF9fbWVtaW5pdCBfX2ZyZWVfcGFnZXNfY29yZShzdHJ1Y3QgcGFnZSAqcGFnZSwgdW5zaWduZWQgaW50IG9yZGVyLFxcbi0tXFxubW0vcGFnZV9hbGxvYy5jLTE2NzEtICovXFxubW0vcGFnZV9hbGxvYy5jOjE2NzI6c3RydWN0IHBhZ2UgKl9fcGFnZWJsb2NrX3Bmbl90b19wYWdlKHVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuLFxcbm1tL3BhZ2VfYWxsb2MuYy0xNjczLVxcdFxcdFxcdFxcdCAgICAgdW5zaWduZWQgbG9uZyBlbmRfcGZuLCBzdHJ1Y3Qgem9uZSAqem9uZSlcXG4tLVxcbm1tL3BhZ2VfYWxsb2MuaD0xOTY9c3RhdGljIGlubGluZSBzdHJ1Y3QgcGFnZSAqZmluZF9idWRkeV9wYWdlX3BmbihzdHJ1Y3QgcGFnZSAqcGFnZSxcXG4tLVxcbm1tL3BhZ2VfYWxsb2MuaC0yMTAtXFxubW0vcGFnZV9hbGxvYy5oOjIxMTpleHRlcm4gc3RydWN0IHBhZ2UgKl9fcGFnZWJsb2NrX3Bmbl90b19wYWdlKHVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuLFxcbm1tL3BhZ2VfYWxsb2MuaC0yMTItXFx0XFx0XFx0XFx0dW5zaWduZWQgbG9uZyBlbmRfcGZuLCBzdHJ1Y3Qgem9uZSAqem9uZSk7XFxubW0vcGFnZV9hbGxvYy5oLTIxMy1cXG5tbS9wYWdlX2FsbG9jLmg6MjE0OnN0YXRpYyBpbmxpbmUgc3RydWN0IHBhZ2UgKnBhZ2VibG9ja19wZm5fdG9fcGFnZSh1bnNpZ25lZCBsb25nIHN0YXJ0X3BmbixcXG5tbS9wYWdlX2FsbG9jLmgtMjE1LVxcdFxcdFxcdFxcdHVuc2lnbmVkIGxvbmcgZW5kX3Bmbiwgc3RydWN0IHpvbmUgKnpvbmUpXFxuLS1cXG5tbS9wYWdlX2FsbG9jLmgtMjE5LVxcbm1tL3BhZ2VfYWxsb2MuaDoyMjA6XFx0cmV0dXJuIF9fcGFnZWJsb2NrX3Bmbl90b19wYWdlKHN0YXJ0X3BmbiwgZW5kX3Bmbiwgem9uZSk7XFxubW0vcGFnZV9hbGxvYy5oLTIyMS19XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTE0VDA3OjUyOjA1LjU5NDcwODczMloiLCJTZXEiOjYxLCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuOC1mbGFzaCIsIkR1cmF0aW9uIjoyNDMxODk2OTQyNCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgbGV0J3MgZGl2ZSBpbnRvIHRoaXMuIEhlcmUncyBteSB0YWtlIG9uIHVuZGVyc3RhbmRpbmcgdGhpcyBjb2RlOlxuXG4qKkRpdmluZyBpbnRvIGBfX3BhZ2VibG9ja19wZm5fdG9fcGFnZWAqKlxuXG5BbHJpZ2h0LCBJJ20gZ29pbmcgdG8gYnJlYWsgZG93biB0aGlzIGBfX3BhZ2VibG9ja19wZm5fdG9fcGFnZWAgZnVuY3Rpb24uIEkgcmVjb2duaXplIHRoaXMgYXMgc29tZXRoaW5nIGNvcmUgdG8gbWVtb3J5IG1hbmFnZW1lbnQsIGxpa2VseSByZWxhdGVkIHRvIHRoZSBrZXJuZWwncyBpbnRlcm5hbCByZXByZXNlbnRhdGlvbiBvZiBwaHlzaWNhbCBtZW1vcnkgYmxvY2tzLiBUaGUgbmFtZSBpdHNlbGYgc3VnZ2VzdHMgYSB0cmFuc2xhdGlvbiwgYSBtYXBwaW5nLiBcIlBGTlwiIGxpa2VseSBzdGFuZHMgZm9yIFwiUGh5c2ljYWwgRnJhbWUgTnVtYmVyLFwiIGEgZnVuZGFtZW50YWwgY29uY2VwdCBpbiBhZGRyZXNzaW5nIHBoeXNpY2FsIG1lbW9yeS4gXCJQYWdlXCIgaW1wbGllcyB3ZSdyZSBkZWFsaW5nIHdpdGggcGFnZS1iYXNlZCBtZW1vcnkgbWFuYWdlbWVudCwgd2hpY2ggaXMgcHJhY3RpY2FsbHkgdWJpcXVpdG91cy4gU28sIG15IGluaXRpYWwgdGhvdWdodCBpcyB0aGF0IHRoaXMgZnVuY3Rpb24gdHJhbnNsYXRlcyBhIHBoeXNpY2FsIGZyYW1lIG51bWJlciAoUEZOKSwgcGVyaGFwcyByZXByZXNlbnRpbmcgdGhlIHN0YXJ0IG9mIGEgbWVtb3J5IGJsb2NrLCBpbnRvIHRoZSBrZXJuZWwncyBpbnRlcm5hbCBgc3RydWN0IHBhZ2VgIHJlcHJlc2VudGF0aW9uLiBUaGlzIHN0cnVjdCBpcyBjcnVjaWFsOyBpdOKAmXMgd2hlcmUgYWxsIHRoZSBtZXRhZGF0YSBhYm91dCBhIHBoeXNpY2FsIHBhZ2UgbGl2ZXM6IGl0cyB1c2FnZSBjb3VudCwgaXRzIHN0YXR1cyAoZnJlZSwgcmVzZXJ2ZWQsIGFjdGl2ZSwgZXRjLiksIHdoaWNoIHByb2Nlc3NlcyBtaWdodCBiZSB1c2luZyBpdCwgYW5kIHNvIG9uLiBVbmRlcnN0YW5kaW5nIHRoaXMgbWFwcGluZyBpcyBjcml0aWNhbCBmb3IgdGhpbmdzIGxpa2UgbWVtb3J5IGFsbG9jYXRpb24sIGZyZWVpbmcsIGFuZCBwb3RlbnRpYWxseSBldmVuIHBhZ2UgbWlncmF0aW9uIG9yIHByb3RlY3Rpb24uIE5vdywgbGV0J3Mgc2VlIGV4YWN0bHkgaG93IHRoaXMgZnVuY3Rpb24gd29ya3MgaXRzIG1hZ2ljIVxuXG5cbiIsIklucHV0VG9rZW5zIjoxMDE1OCwiT3V0cHV0VG9rZW5zIjozNiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjE5LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTE0VDA3OjUyOjI5LjkxMzY4MTUwNloiLCJTZXEiOjYyLCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo4ODc5NTAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwibW0vcGFnZV9hbGxvYy5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDE2NzAsXG4gIFwiTGluZUNvdW50XCI6IDQwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIjE2NzA6XFx0ICogbm90IHJlY29nbml6ZSBhbnkgc3BlY2lmaWMgbWV0YWRhdGEgaW4gc3RydWN0IHBhZ2VzLlxcbjE2NzE6XFx0ICovXFxuMTY3MjpcXHRzdHJ1Y3QgcGFnZSAqX19wYWdlYmxvY2tfcGZuX3RvX3BhZ2UodW5zaWduZWQgbG9uZyBzdGFydF9wZm4sXFxuMTY3MzpcXHRcXHRcXHRcXHRcXHQgICAgIHVuc2lnbmVkIGxvbmcgZW5kX3Bmbiwgc3RydWN0IHpvbmUgKnpvbmUpXFxuMTY3NDpcXHR7XFxuMTY3NTpcXHRcXHRzdHJ1Y3QgcGFnZSAqc3RhcnRfcGFnZTtcXG4xNjc2OlxcdFxcdHN0cnVjdCBwYWdlICplbmRfcGFnZTtcXG4xNjc3OlxcdFxcbjE2Nzg6XFx0XFx0LyogZW5kX3BmbiBpcyBvbmUgcGFzdCB0aGUgcmFuZ2Ugd2UgYXJlIGNoZWNraW5nICovXFxuMTY3OTpcXHRcXHRlbmRfcGZuLS07XFxuMTY4MDpcXHRcXG4xNjgxOlxcdFxcdGlmICghcGZuX3ZhbGlkKGVuZF9wZm4pKVxcbjE2ODI6XFx0XFx0XFx0cmV0dXJuIE5VTEw7XFxuMTY4MzpcXHRcXG4xNjg0OlxcdFxcdHN0YXJ0X3BhZ2UgPSBwZm5fdG9fb25saW5lX3BhZ2Uoc3RhcnRfcGZuKTtcXG4xNjg1OlxcdFxcdGlmICghc3RhcnRfcGFnZSlcXG4xNjg2OlxcdFxcdFxcdHJldHVybiBOVUxMO1xcbjE2ODc6XFx0XFxuMTY4ODpcXHRcXHRpZiAocGFnZV96b25lKHN0YXJ0X3BhZ2UpICE9IHpvbmUpXFxuMTY4OTpcXHRcXHRcXHRyZXR1cm4gTlVMTDtcXG4xNjkwOlxcdFxcbjE2OTE6XFx0XFx0ZW5kX3BhZ2UgPSBwZm5fdG9fcGFnZShlbmRfcGZuKTtcXG4xNjkyOlxcdFxcbjE2OTM6XFx0XFx0LyogVGhpcyBnaXZlcyBhIHNob3J0ZXIgY29kZSB0aGFuIGRlcml2aW5nIHBhZ2Vfem9uZShlbmRfcGFnZSkgKi9cXG4xNjk0OlxcdFxcdGlmIChwYWdlX3pvbmVfaWQoc3RhcnRfcGFnZSkgIT0gcGFnZV96b25lX2lkKGVuZF9wYWdlKSlcXG4xNjk1OlxcdFxcdFxcdHJldHVybiBOVUxMO1xcbjE2OTY6XFx0XFxuMTY5NzpcXHRcXHRyZXR1cm4gc3RhcnRfcGFnZTtcXG4xNjk4OlxcdH1cXG4xNjk5OlxcdFxcbjE3MDA6XFx0LypcXG4xNzAxOlxcdCAqIFRoZSBvcmRlciBvZiBzdWJkaXZpc2lvbiBoZXJlIGlzIGNyaXRpY2FsIGZvciB0aGUgSU8gc3Vic3lzdGVtLlxcbjE3MDI6XFx0ICogUGxlYXNlIGRvIG5vdCBhbHRlciB0aGlzIG9yZGVyIHdpdGhvdXQgZ29vZCByZWFzb25zIGFuZCByZWdyZXNzaW9uXFxuMTcwMzpcXHQgKiB0ZXN0aW5nLiBTcGVjaWZpY2FsbHksIGFzIGxhcmdlIGJsb2NrcyBvZiBtZW1vcnkgYXJlIHN1YmRpdmlkZWQsXFxuMTcwNDpcXHQgKiB0aGUgb3JkZXIgaW4gd2hpY2ggc21hbGxlciBibG9ja3MgYXJlIGRlbGl2ZXJlZCBkZXBlbmRzIG9uIHRoZSBvcmRlclxcbjE3MDU6XFx0ICogdGhleSdyZSBzdWJkaXZpZGVkIGluIHRoaXMgZnVuY3Rpb24uIFRoaXMgaXMgdGhlIHByaW1hcnkgZmFjdG9yXFxuMTcwNjpcXHQgKiBpbmZsdWVuY2luZyB0aGUgb3JkZXIgaW4gd2hpY2ggcGFnZXMgYXJlIGRlbGl2ZXJlZCB0byB0aGUgSU9cXG4xNzA3OlxcdCAqIHN1YnN5c3RlbSBhY2NvcmRpbmcgdG8gZW1waXJpY2FsIHRlc3RpbmcsIGFuZCB0aGlzIGlzIGFsc28ganVzdGlmaWVkXFxuMTcwODpcXHQgKiBieSBjb25zaWRlcmluZyB0aGUgYmVoYXZpb3Igb2YgYSBidWRkeSBzeXN0ZW0gY29udGFpbmluZyBhIHNpbmdsZVxcbjE3MDk6XFx0ICogbGFyZ2UgYmxvY2sgb2YgbWVtb3J5IGFjdGVkIG9uIGJ5IGEgc2VyaWVzIG9mIHNtYWxsIGFsbG9jYXRpb25zLlxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xNFQwNzo1MjoyOS45MTQ1OTA5MjZaIiwiU2VxIjo2MywiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjgtZmxhc2giLCJEdXJhdGlvbiI6ODQ0NDUyNzYyMCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgQ29udGlndW91cyBNZW1vcnkgWm9uZSBPcHRpbWl6YXRpb24qKlxuXG5Pa2F5LCBzbyBJJ20gbG9va2luZyBhdCB0aGlzIGNvZGUgYW5kIGl0IHNlZW1zIGxpa2UgdGhlcmUncyBhbiBvcHRpbWl6YXRpb24gcmVsYXRlZCB0byBjb250aWd1b3VzIG1lbW9yeSB6b25lcy4gVGhlIGZ1bmN0aW9uIGB6b25lX2lzX2NvbnRpZ3VvdXMoem9uZSlgIGlzIGtleSBoZXJlLiBBcHBhcmVudGx5LCB3aGVuIHRoaXMgZnVuY3Rpb24gcmV0dXJucyB0cnVlIOKAkyBtZWFuaW5nIGEgem9uZSBpcyBjb250aWd1b3VzIOKAkyB0aGUgYHBhZ2VibG9ja19wZm5fdG9fcGFnZWAgZnVuY3Rpb24gYnlwYXNzZXMgYSBmZXcgY2hlY2tzLiBJdCBza2lwcyBgcGZuX3ZhbGlkKClgLCBgcGZuX3RvX29ubGluZV9wYWdlKClgLCBhbmQgbGlrZWx5IG90aGVyIHZhbGlkaXR5IGNoZWNrcy4gSW5zdGVhZCwgaXQganVzdCBkb2VzIGEgZGlyZWN0IGBwZm5fdG9fcGFnZShzdGFydF9wZm4pYC4gVGhhdCdzIGEgY2xhc3NpYyBvcHRpbWl6YXRpb246IElmIHdlICprbm93KiB0aGUgbWVtb3J5IGlzIGxhaWQgb3V0IGNvbnRpZ3VvdXNseSwgd2UgZG9uJ3QgbmVlZCB0byB3YXN0ZSBjeWNsZXMgdmVyaWZ5aW5nIGVhY2ggUEZOLlxuXG5JbnRlcmVzdGluZy4gSSBzZWUgdGhlIGNvbW1pdCBtZW50aW9ucyB0aGF0IHRoZSBgem9uZS1cdTAwM2Vjb250aWd1b3VzYCBmaWVsZCAqYWxyZWFkeSBleGlzdHMqLiBTbyB0aGlzIGlzbid0IGEgbmV3IGNvbmNlcHQsIGp1c3QgYSByZWZpbmVtZW50LCB3aGljaCBpcyBnb29kLiBUaGF0IG1ha2VzIHNlbnNlLiBOb3csIEkgbmVlZCB0byB1bmRlcnN0YW5kIHdoZXJlIGB6b25lLVx1MDAzZWNvbnRpZ3VvdXNgIGlzIGFjdHVhbGx5IGRlZmluZWQgYW5kIGhvdyBpdCdzIGJlaW5nIHVzZWQuIFRoYXQncyB0aGUgcmVhbCBzdG9yeSwgcmlnaHQ/IEdvdHRhIGZvbGxvdyB0aGUgYnJlYWRjcnVtYnMgYW5kIHNlZSBob3cgdGhlIGtlcm5lbCBkZXRlcm1pbmVzIGlmIGEgem9uZSBpcyBpbmRlZWQgY29udGlndW91cyBhbmQgaG93IGl0IGxldmVyYWdlcyB0aGF0IGtub3dsZWRnZS5cblxuXG4iLCJJbnB1dFRva2VucyI6MTEwNzksIk91dHB1dFRva2VucyI6MjMsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo5OSwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTE0VDA3OjUyOjM4LjM1OTEyMjU4NloiLCJTZXEiOjY0LCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTI0MzcwNTI4LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImNvbnRpZ3VvdXNcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwibW0vXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIlxcbkZ1bGwgb3V0cHV0IGlzIHRvbyBsb25nLCBzaG93aW5nIDUwMCBvdXQgb2YgNzg2IGxpbmVzLlxcblVzZSBtb3JlIHByZWNpc2UgZXhwcmVzc2lvbiBpZiBwb3NzaWJsZS5cXG5cXG5tbS9LY29uZmlnPTY0Mj1jb25maWcgQ09NUEFDVElPTlxcbi0tXFxubW0vS2NvbmZpZy02NDgtXFx0ICBDb21wYWN0aW9uIGlzIHRoZSBvbmx5IG1lbW9yeSBtYW5hZ2VtZW50IGNvbXBvbmVudCB0byBmb3JtXFxubW0vS2NvbmZpZzo2NDk6XFx0ICBoaWdoIG9yZGVyIChsYXJnZXIgcGh5c2ljYWxseSBjb250aWd1b3VzKSBtZW1vcnkgYmxvY2tzXFxubW0vS2NvbmZpZy02NTAtXFx0ICByZWxpYWJseS4gVGhlIHBhZ2UgYWxsb2NhdG9yIHJlbGllcyBvbiBjb21wYWN0aW9uIGhlYXZpbHkgYW5kXFxuLS1cXG5tbS9LY29uZmlnPTc4Mj1jb25maWcgTk9NTVVfSU5JVElBTF9UUklNX0VYQ0VTU1xcbi0tXFxubW0vS2NvbmZpZy03ODYtXFx0aGVscFxcbm1tL0tjb25maWc6Nzg3OlxcdCAgVGhlIE5PTU1VIG1tYXAoKSBmcmVxdWVudGx5IG5lZWRzIHRvIGFsbG9jYXRlIGxhcmdlIGNvbnRpZ3VvdXMgY2h1bmtzXFxubW0vS2NvbmZpZy03ODgtXFx0ICBvZiBtZW1vcnkgb24gd2hpY2ggdG8gc3RvcmUgbWFwcGluZ3MsIGJ1dCBpdCBjYW4gb25seSBhc2sgdGhlIHN5c3RlbVxcbi0tXFxubW0vS2NvbmZpZz0xMDU2PWNvbmZpZyBDTUFcXG4tLVxcbm1tL0tjb25maWctMTA2Mi1cXHQgIFRoaXMgZW5hYmxlcyB0aGUgQ29udGlndW91cyBNZW1vcnkgQWxsb2NhdG9yIHdoaWNoIGFsbG93cyBvdGhlclxcbm1tL0tjb25maWc6MTA2MzpcXHQgIHN1YnN5c3RlbXMgdG8gYWxsb2NhdGUgYmlnIHBoeXNpY2FsbHktY29udGlndW91cyBibG9ja3Mgb2YgbWVtb3J5Llxcbm1tL0tjb25maWctMTA2NC1cXHQgIENNQSByZXNlcnZlcyBhIHJlZ2lvbiBvZiBtZW1vcnkgYW5kIGFsbG93cyBvbmx5IG1vdmFibGUgcGFnZXMgdG9cXG5tbS9LY29uZmlnLTEwNjUtXFx0ICBiZSBhbGxvY2F0ZWQgZnJvbSBpdC4gVGhpcyB3YXksIHRoZSBrZXJuZWwgY2FuIHVzZSB0aGUgbWVtb3J5IGZvclxcbm1tL0tjb25maWc6MTA2NjpcXHQgIHBhZ2VjYWNoZSBhbmQgd2hlbiBhIHN1YnN5c3RlbSByZXF1ZXN0cyBmb3IgY29udGlndW91cyBhcmVhLCB0aGVcXG5tbS9LY29uZmlnOjEwNjc6XFx0ICBhbGxvY2F0ZWQgcGFnZXMgYXJlIG1pZ3JhdGVkIGF3YXkgdG8gc2VydmUgdGhlIGNvbnRpZ3VvdXMgcmVxdWVzdC5cXG5tbS9LY29uZmlnLTEwNjgtXFxuLS1cXG5tbS9LY29uZmlnPTEwODQ9Y29uZmlnIENNQV9BUkVBU1xcbi0tXFxubW0vS2NvbmZpZy0xMDk3LSMgU2VsZWN0IHRoaXMgY29uZmlnIG9wdGlvbiBmcm9tIHRoZSBhcmNoaXRlY3R1cmUgS2NvbmZpZywgaWYgYXZhaWxhYmxlLCB0byBzZXRcXG5tbS9LY29uZmlnOjEwOTg6IyB0aGUgbWF4IHBhZ2Ugb3JkZXIgZm9yIHBoeXNpY2FsbHkgY29udGlndW91cyBhbGxvY2F0aW9ucy5cXG5tbS9LY29uZmlnLTEwOTktI1xcbi0tXFxubW0vS2NvbmZpZz0xMTA4PWNvbmZpZyBQQUdFX0JMT0NLX01BWF9PUkRFUlxcbi0tXFxubW0vS2NvbmZpZy0xMTE1LVxcdCAgVGhlIHBhZ2UgYmxvY2sgb3JkZXIgcmVmZXJzIHRvIHRoZSBwb3dlciBvZiB0d28gbnVtYmVyIG9mIHBhZ2VzIHRoYXRcXG5tbS9LY29uZmlnOjExMTY6XFx0ICBhcmUgcGh5c2ljYWxseSBjb250aWd1b3VzIGFuZCBjYW4gaGF2ZSBhIG1pZ3JhdGUgdHlwZSBhc3NvY2lhdGVkIHRvXFxubW0vS2NvbmZpZy0xMTE3LVxcdCAgdGhlbS4gVGhlIG1heGltdW0gc2l6ZSBvZiB0aGUgcGFnZSBibG9jayBvcmRlciBpcyBhdCBsZWFzdCBsaW1pdGVkIGJ5XFxuLS1cXG5tbS9jbWEuYz0yNTU9c3RhdGljIHZvaWQgX19pbml0IGNtYV9kcm9wX2FyZWEoc3RydWN0IGNtYSAqY21hKVxcbi0tXFxubW0vY21hLmMtMjYxLS8qKlxcbm1tL2NtYS5jOjI2MjogKiBjbWFfaW5pdF9yZXNlcnZlZF9tZW0oKSAtIGNyZWF0ZSBjdXN0b20gY29udGlndW91cyBhcmVhIGZyb20gcmVzZXJ2ZWQgbWVtb3J5XFxubW0vY21hLmMtMjYzLSAqIEBiYXNlOiBCYXNlIGFkZHJlc3Mgb2YgdGhlIHJlc2VydmVkIGFyZWFcXG4tLVxcbm1tL2NtYS5jLTI3MC0gKlxcbm1tL2NtYS5jOjI3MTogKiBUaGlzIGZ1bmN0aW9uIGNyZWF0ZXMgY3VzdG9tIGNvbnRpZ3VvdXMgYXJlYSBmcm9tIGFscmVhZHkgcmVzZXJ2ZWQgbWVtb3J5Llxcbm1tL2NtYS5jLTI3Mi0gKi9cXG4tLVxcbm1tL2NtYS5jPTM4Nz1zdGF0aWMgcGh5c19hZGRyX3QgX19pbml0IGNtYV9hbGxvY19tZW0ocGh5c19hZGRyX3QgYmFzZSwgcGh5c19hZGRyX3Qgc2l6ZSxcXG4tLVxcbm1tL2NtYS5jLTQzNS1cXG5tbS9jbWEuYzo0MzY6c3RhdGljIGludCBfX2luaXQgX19jbWFfZGVjbGFyZV9jb250aWd1b3VzX25pZChwaHlzX2FkZHJfdCAqYmFzZXAsXFxubW0vY21hLmMtNDM3LVxcdFxcdFxcdHBoeXNfYWRkcl90IHNpemUsIHBoeXNfYWRkcl90IGxpbWl0LFxcbi0tXFxubW0vY21hLmMtNTMzLSAqL1xcbm1tL2NtYS5jOjUzNDppbnQgX19pbml0IGNtYV9kZWNsYXJlX2NvbnRpZ3VvdXNfbXVsdGkocGh5c19hZGRyX3QgdG90YWxfc2l6ZSxcXG5tbS9jbWEuYy01MzUtXFx0XFx0XFx0cGh5c19hZGRyX3QgYWxpZ24sIHVuc2lnbmVkIGludCBvcmRlcl9wZXJfYml0LFxcbi0tXFxubW0vY21hLmMtNTUxLVxcdCAqL1xcbm1tL2NtYS5jOjU1MjpcXHRyZXQgPSBfX2NtYV9kZWNsYXJlX2NvbnRpZ3VvdXNfbmlkKFxcdTAwMjZzdGFydCwgdG90YWxfc2l6ZSwgMCwgYWxpZ24sXFxubW0vY21hLmMtNTUzLVxcdFxcdFxcdG9yZGVyX3Blcl9iaXQsIGZhbHNlLCBuYW1lLCByZXNfY21hLCBuaWQpO1xcbi0tXFxubW0vY21hLmMtNTYxLVxcdCAqIE5vIG5lZWQgdG8gZG8gdGhlIGFsaWdubWVudCBjaGVja3MgaGVyZSwgdGhlIGNhbGwgdG9cXG5tbS9jbWEuYzo1NjI6XFx0ICogY21hX2RlY2xhcmVfY29udGlndW91c19uaWQgYWJvdmUgd291bGQgaGF2ZSBjYXVnaHRcXG5tbS9jbWEuYy01NjMtXFx0ICogYW55IGlzc3Vlcy4gV2l0aCB0aGUgY2hlY2tzLCB3ZSBrbm93IHRoYXQ6XFxuLS1cXG5tbS9jbWEuYy03MTktLyoqXFxubW0vY21hLmM6NzIwOiAqIGNtYV9kZWNsYXJlX2NvbnRpZ3VvdXNfbmlkKCkgLSByZXNlcnZlIGN1c3RvbSBjb250aWd1b3VzIGFyZWFcXG5tbS9jbWEuYy03MjEtICogQGJhc2U6IEJhc2UgYWRkcmVzcyBvZiB0aGUgcmVzZXJ2ZWQgYXJlYSBvcHRpb25hbCwgdXNlIDAgZm9yIGFueVxcbi0tXFxubW0vY21hLmMtNzM1LSAqXFxubW0vY21hLmM6NzM2OiAqIElmIEBmaXhlZCBpcyB0cnVlLCByZXNlcnZlIGNvbnRpZ3VvdXMgYXJlYSBhdCBleGFjdGx5IEBiYXNlLiAgSWYgZmFsc2UsXFxubW0vY21hLmMtNzM3LSAqIHJlc2VydmUgaW4gcmFuZ2UgZnJvbSBAYmFzZSB0byBAbGltaXQuXFxubW0vY21hLmMtNzM4LSAqL1xcbm1tL2NtYS5jOjczOTppbnQgX19pbml0IGNtYV9kZWNsYXJlX2NvbnRpZ3VvdXNfbmlkKHBoeXNfYWRkcl90IGJhc2UsXFxubW0vY21hLmMtNzQwLVxcdFxcdFxcdHBoeXNfYWRkcl90IHNpemUsIHBoeXNfYWRkcl90IGxpbWl0LFxcbi0tXFxubW0vY21hLmMtNzQ2LVxcbm1tL2NtYS5jOjc0NzpcXHRyZXQgPSBfX2NtYV9kZWNsYXJlX2NvbnRpZ3VvdXNfbmlkKFxcdTAwMjZiYXNlLCBzaXplLCBsaW1pdCwgYWxpZ25tZW50LFxcbm1tL2NtYS5jLTc0OC1cXHRcXHRcXHRvcmRlcl9wZXJfYml0LCBmaXhlZCwgbmFtZSwgcmVzX2NtYSwgbmlkKTtcXG4tLVxcbm1tL2NtYS5jPTc4Nj1zdGF0aWMgaW50IGNtYV9yYW5nZV9hbGxvYyhzdHJ1Y3QgY21hICpjbWEsIHN0cnVjdCBjbWFfbWVtcmFuZ2UgKmNtcixcXG4tLVxcbm1tL2NtYS5jLTgyNC1cXHRcXHQvKlxcbm1tL2NtYS5jOjgyNTpcXHRcXHQgKiBEbyBub3QgaGFuZCBvdXQgcGFnZSByYW5nZXMgdGhhdCBhcmUgbm90IGNvbnRpZ3VvdXMsIHNvXFxubW0vY21hLmMtODI2LVxcdFxcdCAqIGNhbGxlcnMgY2FuIGp1c3QgaXRlcmF0ZSB0aGUgcGFnZXMgd2l0aG91dCBoYXZpbmcgdG8gd29ycnlcXG4tLVxcbm1tL2NtYS5jLTgyOC1cXHRcXHQgKi9cXG5tbS9jbWEuYzo4Mjk6XFx0XFx0aWYgKCFwYWdlX3JhbmdlX2NvbnRpZ3VvdXMocGFnZSwgY291bnQpKSB7XFxubW0vY21hLmMtODMwLVxcdFxcdFxcdHNwaW5fdW5sb2NrX2lycShcXHUwMDI2Y21hLVxcdTAwM2Vsb2NrKTtcXG4tLVxcbm1tL2NtYS5jPTkzMj1zdHJ1Y3QgcGFnZSAqY21hX2FsbG9jX2Zyb3plbl9jb21wb3VuZChzdHJ1Y3QgY21hICpjbWEsIHVuc2lnbmVkIGludCBvcmRlcilcXG4tLVxcbm1tL2NtYS5jLTkzOS0vKipcXG5tbS9jbWEuYzo5NDA6ICogY21hX2FsbG9jKCkgLSBhbGxvY2F0ZSBwYWdlcyBmcm9tIGNvbnRpZ3VvdXMgYXJlYVxcbm1tL2NtYS5jLTk0MS0gKiBAY21hOiAgIENvbnRpZ3VvdXMgbWVtb3J5IHJlZ2lvbiBmb3Igd2hpY2ggdGhlIGFsbG9jYXRpb24gaXMgcGVyZm9ybWVkLlxcbi0tXFxubW0vY21hLmMtOTQ1LSAqXFxubW0vY21hLmM6OTQ2OiAqIFRoaXMgZnVuY3Rpb24gYWxsb2NhdGVzIHBhcnQgb2YgY29udGlndW91cyBtZW1vcnkgb24gc3BlY2lmaWNcXG5tbS9jbWEuYzo5NDc6ICogY29udGlndW91cyBtZW1vcnkgYXJlYS5cXG5tbS9jbWEuYy05NDgtICovXFxuLS1cXG5tbS9jbWEuYz05OTY9c3RhdGljIHZvaWQgX19jbWFfcmVsZWFzZV9mcm96ZW4oc3RydWN0IGNtYSAqY21hLCBzdHJ1Y3QgY21hX21lbXJhbmdlICpjbXIsXFxuLS1cXG5tbS9jbWEuYy0xMDE1LSAqIFRoaXMgZnVuY3Rpb24gcmVsZWFzZXMgbWVtb3J5IGFsbG9jYXRlZCBieSBjbWFfYWxsb2MoKS5cXG5tbS9jbWEuYzoxMDE2OiAqIEl0IHJldHVybnMgZmFsc2Ugd2hlbiBwcm92aWRlZCBwYWdlcyBkbyBub3QgYmVsb25nIHRvIGNvbnRpZ3VvdXMgYXJlYSBhbmRcXG5tbS9jbWEuYy0xMDE3LSAqIHRydWUgb3RoZXJ3aXNlLlxcbi0tXFxubW0vZGFtb24vdGVzdHMvdmFkZHIta3VuaXQuaD0xMz1zdGF0aWMgaW50IF9fbGlua192bWFzKHN0cnVjdCBtYXBsZV90cmVlICptdCwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWFzLFxcbi0tXFxubW0vZGFtb24vdGVzdHMvdmFkZHIta3VuaXQuaC0zOS0gKiBjb21wbGV4IGFuZCBkeW5hbWljIG1lbW9yeSBtYXBwaW5ncyBvZiBlYWNoIHRhcmdldCB0YXNrIHRvIHRocmVlXFxubW0vZGFtb24vdGVzdHMvdmFkZHIta3VuaXQuaDo0MDogKiBkaXNjb250aWd1b3VzIHJlZ2lvbnMgd2hpY2ggY292ZXIgZXZlcnkgbWFwcGVkIGFyZWFzLiAgSG93ZXZlciwgdGhlIHRocmVlXFxubW0vZGFtb24vdGVzdHMvdmFkZHIta3VuaXQuaC00MS0gKiByZWdpb25zIHNob3VsZCBub3QgaW5jbHVkZSB0aGUgdHdvIGJpZ2dlc3QgdW5tYXBwZWQgYXJlYXMgaW4gdGhlIG9yaWdpbmFsXFxuLS1cXG5tbS9kZWJ1Z192bV9wZ3RhYmxlLmM9NDU9c3RydWN0IHBndGFibGVfZGVidWdfYXJncyB7XFxuLS1cXG5tbS9kZWJ1Z192bV9wZ3RhYmxlLmMtNjMtXFxubW0vZGVidWdfdm1fcGd0YWJsZS5jOjY0OlxcdGJvb2xcXHRcXHRcXHRpc19jb250aWd1b3VzX3BhZ2U7XFxubW0vZGVidWdfdm1fcGd0YWJsZS5jLTY1LVxcdHVuc2lnbmVkIGxvbmdcXHRcXHRwdWRfcGZuO1xcbi0tXFxubW0vZGVidWdfdm1fcGd0YWJsZS5jPTk3NT1kZWJ1Z192bV9wZ3RhYmxlX2ZyZWVfaHVnZV9wYWdlKHN0cnVjdCBwZ3RhYmxlX2RlYnVnX2FyZ3MgKmFyZ3MsXFxuLS1cXG5tbS9kZWJ1Z192bV9wZ3RhYmxlLmMtOTc4LSNpZmRlZiBDT05GSUdfQ09OVElHX0FMTE9DXFxubW0vZGVidWdfdm1fcGd0YWJsZS5jOjk3OTpcXHRpZiAoYXJncy1cXHUwMDNlaXNfY29udGlndW91c19wYWdlKSB7XFxubW0vZGVidWdfdm1fcGd0YWJsZS5jLTk4MC1cXHRcXHRmcmVlX2NvbnRpZ19yYW5nZShwZm4sIDEgXFx1MDAzY1xcdTAwM2Mgb3JkZXIpO1xcbi0tXFxubW0vZGVidWdfdm1fcGd0YWJsZS5jPTEwNDY9ZGVidWdfdm1fcGd0YWJsZV9hbGxvY19odWdlX3BhZ2Uoc3RydWN0IHBndGFibGVfZGVidWdfYXJncyAqYXJncywgaW50IG9yZGVyKVxcbi0tXFxubW0vZGVidWdfdm1fcGd0YWJsZS5jLTEwNTQtXFx0XFx0aWYgKHBhZ2UpIHtcXG5tbS9kZWJ1Z192bV9wZ3RhYmxlLmM6MTA1NTpcXHRcXHRcXHRhcmdzLVxcdTAwM2Vpc19jb250aWd1b3VzX3BhZ2UgPSB0cnVlO1xcbm1tL2RlYnVnX3ZtX3BndGFibGUuYy0xMDU2LVxcdFxcdFxcdHJldHVybiBwYWdlO1xcbi0tXFxubW0vZGVidWdfdm1fcGd0YWJsZS5jPTExNDM9c3RhdGljIGludCBfX2luaXQgaW5pdF9hcmdzKHN0cnVjdCBwZ3RhYmxlX2RlYnVnX2FyZ3MgKmFyZ3MpXFxuLS1cXG5tbS9kZWJ1Z192bV9wZ3RhYmxlLmMtMTE1OS1cXHRhcmdzLVxcdTAwM2VwYWdlX3Byb3Rfbm9uZSAgICAgPSB2bV9nZXRfcGFnZV9wcm90KFZNX05PTkUpO1xcbm1tL2RlYnVnX3ZtX3BndGFibGUuYzoxMTYwOlxcdGFyZ3MtXFx1MDAzZWlzX2NvbnRpZ3VvdXNfcGFnZSA9IGZhbHNlO1xcbm1tL2RlYnVnX3ZtX3BndGFibGUuYy0xMTYxLVxcdGFyZ3MtXFx1MDAzZXB1ZF9wZm4gICAgICAgICAgICA9IFVMT05HX01BWDtcXG4tLVxcbm1tL2ZpbGVtYXAuYz0yMjU1PUVYUE9SVF9TWU1CT0woZmlsZW1hcF9nZXRfZm9saW9zKTtcXG4tLVxcbm1tL2ZpbGVtYXAuYy0yMjU3LS8qKlxcbm1tL2ZpbGVtYXAuYzoyMjU4OiAqIGZpbGVtYXBfZ2V0X2ZvbGlvc19jb250aWcgLSBHZXQgYSBiYXRjaCBvZiBjb250aWd1b3VzIGZvbGlvc1xcbm1tL2ZpbGVtYXAuYy0yMjU5LSAqIEBtYXBwaW5nOlxcdFRoZSBhZGRyZXNzX3NwYWNlIHRvIHNlYXJjaFxcbi0tXFxubW0vZmlsZW1hcC5jLTIyNjQtICogZmlsZW1hcF9nZXRfZm9saW9zX2NvbnRpZygpIHdvcmtzIGV4YWN0bHkgbGlrZSBmaWxlbWFwX2dldF9mb2xpb3MoKSxcXG5tbS9maWxlbWFwLmM6MjI2NTogKiBleGNlcHQgdGhlIHJldHVybmVkIGZvbGlvcyBhcmUgZ3VhcmFudGVlZCB0byBiZSBjb250aWd1b3VzLiBUaGlzIG1heVxcbm1tL2ZpbGVtYXAuYzoyMjY2OiAqIG5vdCByZXR1cm4gYWxsIGNvbnRpZ3VvdXMgZm9saW9zIGlmIHRoZSBiYXRjaCBnZXRzIGZpbGxlZCB1cC5cXG5tbS9maWxlbWFwLmMtMjI2Ny0gKlxcbi0tXFxubW0vZmlsZW1hcC5jPTI0NTU9c3RhdGljIHZvaWQgc2hyaW5rX3JlYWRhaGVhZF9zaXplX2VpbyhzdHJ1Y3QgZmlsZV9yYV9zdGF0ZSAqcmEpXFxuLS1cXG5tbS9maWxlbWFwLmMtMjQ2Mi0gKlxcbm1tL2ZpbGVtYXAuYzoyNDYzOiAqIEdldCBhIGJhdGNoIG9mIGZvbGlvcyB3aGljaCByZXByZXNlbnQgYSBjb250aWd1b3VzIHJhbmdlIG9mIGJ5dGVzIGluXFxubW0vZmlsZW1hcC5jLTI0NjQtICogdGhlIGZpbGUuICBObyBleGNlcHRpb25hbCBlbnRyaWVzIHdpbGwgYmUgcmV0dXJuZWQuICBJZiBAaW5kZXggaXMgaW5cXG4tLVxcbm1tL2d1cC5jPTMyNz1FWFBPUlRfU1lNQk9MKHVucGluX3VzZXJfcGFnZXNfZGlydHlfbG9jayk7XFxuLS1cXG5tbS9ndXAuYy0zMzktICpcXG5tbS9ndXAuYzozNDA6ICogVGhlIHBhZ2UgcmFuZ2UgbXVzdCBiZSB0cnVseSBwaHlzaWNhbGx5IGNvbnRpZ3VvdXM6IHRoZSBwYWdlIHJhbmdlXFxubW0vZ3VwLmM6MzQxOiAqIGNvcnJlc3BvbmRzIHRvIGEgY29udGlndW91cyBQRk4gcmFuZ2UgYW5kIGFsbCBwYWdlcyBjYW4gYmUgaXRlcmF0ZWRcXG5tbS9ndXAuYy0zNDItICogbmF0dXJhbGx5Llxcbi0tXFxubW0vZ3VwLmM9MzU0PXZvaWQgdW5waW5fdXNlcl9wYWdlX3JhbmdlX2RpcnR5X2xvY2soc3RydWN0IHBhZ2UgKnBhZ2UsIHVuc2lnbmVkIGxvbmcgbnBhZ2VzLFxcbi0tXFxubW0vZ3VwLmMtMzYwLVxcbm1tL2d1cC5jOjM2MTpcXHRWTV9XQVJOX09OX09OQ0UoIXBhZ2VfcmFuZ2VfY29udGlndW91cyhwYWdlLCBucGFnZXMpKTtcXG5tbS9ndXAuYy0zNjItXFxuLS1cXG5tbS9ndXAuYz0zNDA4PUVYUE9SVF9TWU1CT0wocGluX3VzZXJfcGFnZXNfdW5sb2NrZWQpO1xcbi0tXFxubW0vZ3VwLmMtMzQxOC0gKlxcbm1tL2d1cC5jOjM0MTk6ICogQXR0ZW1wdCB0byBwaW4gZm9saW9zIGFzc29jaWF0ZWQgd2l0aCBhIG1lbWZkIGluIHRoZSBjb250aWd1b3VzIHJhbmdlXFxubW0vZ3VwLmMtMzQyMC0gKiBbc3RhcnQsIGVuZF0uIEdpdmVuIHRoYXQgYSBtZW1mZCBpcyBlaXRoZXIgYmFja2VkIGJ5IHNobWVtIG9yIGh1Z2V0bGIsXFxuLS1cXG5tbS9odWdldGxiLmM9NDkyPXN0YXRpYyB2b2lkIHJlY29yZF9odWdldGxiX2Nncm91cF91bmNoYXJnZV9pbmZvKHN0cnVjdCBodWdldGxiX2Nncm91cCAqaF9jZyxcXG4tLVxcbm1tL2h1Z2V0bGIuYy01MDMtXFx0XFx0ICogVGhlIGNhbGxlciB3aWxsIGhvbGQgZXhhY3RseSBvbmUgaF9jZy1cXHUwMDNlY3NzIHJlZmVyZW5jZSBmb3IgdGhlXFxubW0vaHVnZXRsYi5jOjUwNDpcXHRcXHQgKiB3aG9sZSBjb250aWd1b3VzIHJlc2VydmF0aW9uIHJlZ2lvbi4gQnV0IHRoaXMgYXJlYSBtaWdodCBiZVxcbm1tL2h1Z2V0bGIuYy01MDUtXFx0XFx0ICogc2NhdHRlcmVkIHdoZW4gdGhlcmUgYXJlIGFscmVhZHkgc29tZSBmaWxlX3JlZ2lvbnMgcmVzaWRlIGluXFxuLS1cXG5tbS9odWdldGxiX2NtYS5jPTIxMT12b2lkIF9faW5pdCBodWdldGxiX2NtYV9yZXNlcnZlKHZvaWQpXFxuLS1cXG5tbS9odWdldGxiX2NtYS5jLTM1Ny1cXHRcXHQgKi9cXG5tbS9odWdldGxiX2NtYS5jOjM1ODpcXHRcXHRyZXMgPSBjbWFfZGVjbGFyZV9jb250aWd1b3VzX211bHRpKHNpemUsIGdpZ2FudGljX3BhZ2Vfc2l6ZSxcXG5tbS9odWdldGxiX2NtYS5jLTM1OS1cXHRcXHRcXHRcXHRcXHRIVUdFVExCX1BBR0VfT1JERVIsIG5hbWUsXFxuLS1cXG5tbS9pbnRlcm5hbC5oPTUwND1zdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9uZXh0X3N3cF9vZmZzZXQocHRlX3QgcHRlKVxcbi0tXFxubW0vaW50ZXJuYWwuaC01MDktLyoqXFxubW0vaW50ZXJuYWwuaDo1MTA6ICogc3dhcF9wdGVfYmF0Y2ggLSBkZXRlY3QgYSBQVEUgYmF0Y2ggZm9yIGEgc2V0IG9mIGNvbnRpZ3VvdXMgc3dhcCBlbnRyaWVzXFxubW0vaW50ZXJuYWwuaC01MTEtICogQHN0YXJ0X3B0ZXA6IFBhZ2UgdGFibGUgcG9pbnRlciBmb3IgdGhlIGZpcnN0IGVudHJ5Llxcbi0tXFxubW0vaW50ZXJuYWwuaC01MTQtICpcXG5tbS9pbnRlcm5hbC5oOjUxNTogKiBEZXRlY3QgYSBiYXRjaCBvZiBjb250aWd1b3VzIHN3YXAgZW50cmllczogY29uc2VjdXRpdmUgKG5vbi1wcmVzZW50KSBQVEVzXFxubW0vaW50ZXJuYWwuaC01MTYtICogY29udGFpbmluZyBzd2FwIGVudHJpZXMgYWxsIHdpdGggY29uc2VjdXRpdmUgb2Zmc2V0cyBhbmQgdGFyZ2V0aW5nIHRoZSBzYW1lXFxuLS1cXG5tbS9rZmVuY2Uva2ZlbmNlX3Rlc3QuYz00MzU9c3RhdGljIHZvaWQgdGVzdF9jb3JydXB0aW9uKHN0cnVjdCBrdW5pdCAqdGVzdClcXG4tLVxcbm1tL2tmZW5jZS9rZmVuY2VfdGVzdC5jLTQ2NS0gKiByZXNwZWN0aXZlbHkuIFRoZXJlZm9yZSBpdCBpcyBpbXBvc3NpYmxlIGZvciB0aGUgYWxsb2NhdGVkIG9iamVjdCB0b1xcbm1tL2tmZW5jZS9rZmVuY2VfdGVzdC5jOjQ2NjogKiBjb250aWd1b3VzbHkgbGluZSB1cCB3aXRoIHRoZSByaWdodCBndWFyZCBwYWdlLlxcbm1tL2tmZW5jZS9rZmVuY2VfdGVzdC5jLTQ2Ny0gKlxcbi0tXFxubW0va21zYW4vY29yZS5jPTgwPXZvaWQga21zYW5faW50ZXJuYWxfbWVtbW92ZV9tZXRhZGF0YSh2b2lkICpkc3QsIHZvaWQgKnNyYywgc2l6ZV90IG4pXFxuLS1cXG5tbS9rbXNhbi9jb3JlLmMtOTItXFx0XFx0cmV0dXJuO1xcbm1tL2ttc2FuL2NvcmUuYzo5MzpcXHRLTVNBTl9XQVJOX09OKCFrbXNhbl9tZXRhZGF0YV9pc19jb250aWd1b3VzKGRzdCwgbikpO1xcbm1tL2ttc2FuL2NvcmUuYy05NC1cXHRhbGlnbl9zaGFkb3dfZHN0ID1cXG4tLVxcbm1tL2ttc2FuL2NvcmUuYy0xMDItXFx0fVxcbm1tL2ttc2FuL2NvcmUuYzoxMDM6XFx0S01TQU5fV0FSTl9PTigha21zYW5fbWV0YWRhdGFfaXNfY29udGlndW91cyhzcmMsIG4pKTtcXG5tbS9rbXNhbi9jb3JlLmMtMTA0LVxcbi0tXFxubW0va21zYW4vY29yZS5jPTE5MT12b2lkIGttc2FuX2ludGVybmFsX3NldF9zaGFkb3dfb3JpZ2luKHZvaWQgKmFkZHIsIHNpemVfdCBzaXplLCBpbnQgYixcXG4tLVxcbm1tL2ttc2FuL2NvcmUuYy0xOTgtXFxubW0va21zYW4vY29yZS5jOjE5OTpcXHRLTVNBTl9XQVJOX09OKCFrbXNhbl9tZXRhZGF0YV9pc19jb250aWd1b3VzKGFkZHIsIHNpemUpKTtcXG5tbS9rbXNhbi9jb3JlLmMtMjAwLVxcdHNoYWRvd19zdGFydCA9IGttc2FuX2dldF9tZXRhZGF0YShhZGRyLCBLTVNBTl9NRVRBX1NIQURPVyk7XFxuLS1cXG5tbS9rbXNhbi9jb3JlLmMtMjAyLVxcdFxcdC8qXFxubW0va21zYW4vY29yZS5jOjIwMzpcXHRcXHQgKiBrbXNhbl9tZXRhZGF0YV9pc19jb250aWd1b3VzKCkgaXMgdHJ1ZSwgc28gZWl0aGVyIGFsbCBzaGFkb3dcXG5tbS9rbXNhbi9jb3JlLmMtMjA0LVxcdFxcdCAqIGFuZCBvcmlnaW4gcGFnZXMgYXJlIE5VTEwsIG9yIGFsbCBhcmUgbm9uLU5VTEwuXFxuLS1cXG5tbS9rbXNhbi9jb3JlLmM9MjUzPXZvaWQga21zYW5faW50ZXJuYWxfY2hlY2tfbWVtb3J5KHZvaWQgKmFkZHIsIHNpemVfdCBzaXplLFxcbi0tXFxubW0va21zYW4vY29yZS5jLTI2NS1cXHRcXHRyZXR1cm47XFxubW0va21zYW4vY29yZS5jOjI2NjpcXHRLTVNBTl9XQVJOX09OKCFrbXNhbl9tZXRhZGF0YV9pc19jb250aWd1b3VzKGFkZHIsIHNpemUpKTtcXG5tbS9rbXNhbi9jb3JlLmMtMjY3LVxcdHdoaWxlIChwb3MgXFx1MDAzYyBzaXplKSB7XFxuLS1cXG5tbS9rbXNhbi9jb3JlLmMtMzI4LVxcbm1tL2ttc2FuL2NvcmUuYzozMjk6Ym9vbCBrbXNhbl9tZXRhZGF0YV9pc19jb250aWd1b3VzKHZvaWQgKmFkZHIsIHNpemVfdCBzaXplKVxcbm1tL2ttc2FuL2NvcmUuYy0zMzAte1xcbi0tXFxubW0va21zYW4va21zYW4uaD0xNjI9dm9pZCBrbXNhbl9pbnRlcm5hbF90YXNrX2NyZWF0ZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spO1xcbm1tL2ttc2FuL2ttc2FuLmgtMTYzLVxcbm1tL2ttc2FuL2ttc2FuLmg6MTY0OmJvb2wga21zYW5fbWV0YWRhdGFfaXNfY29udGlndW91cyh2b2lkICphZGRyLCBzaXplX3Qgc2l6ZSk7XFxubW0va21zYW4va21zYW4uaC0xNjUtdm9pZCBrbXNhbl9pbnRlcm5hbF9jaGVja19tZW1vcnkodm9pZCAqYWRkciwgc2l6ZV90IHNpemUsXFxuLS1cXG5tbS9rbXNhbi9zaGFkb3cuYz04Mj1zdHJ1Y3Qgc2hhZG93X29yaWdpbl9wdHIga21zYW5fZ2V0X3NoYWRvd19vcmlnaW5fcHRyKHZvaWQgKmFkZHJlc3MsIHU2NCBzaXplLFxcbi0tXFxubW0va21zYW4vc2hhZG93LmMtOTYtXFxubW0va21zYW4vc2hhZG93LmM6OTc6XFx0S01TQU5fV0FSTl9PTigha21zYW5fbWV0YWRhdGFfaXNfY29udGlndW91cyhhZGRyZXNzLCBzaXplKSk7XFxubW0va21zYW4vc2hhZG93LmMtOTgtXFx0c2hhZG93ID0ga21zYW5fZ2V0X21ldGFkYXRhKGFkZHJlc3MsIEtNU0FOX01FVEFfU0hBRE9XKTtcXG4tLVxcbm1tL2ttc2FuL3NoYWRvdy5jPTE3MT12b2lkIGttc2FuX2FsbG9jX3BhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UsIHVuc2lnbmVkIGludCBvcmRlciwgZ2ZwX3QgZmxhZ3MpXFxuLS1cXG5tbS9rbXNhbi9zaGFkb3cuYy0xOTgtXFx0LypcXG5tbS9rbXNhbi9zaGFkb3cuYzoxOTk6XFx0ICogQWRkcmVzc2VzIGFyZSBwYWdlLWFsaWduZWQsIHBhZ2VzIGFyZSBjb250aWd1b3VzLCBzbyBpdCdzIG9rXFxubW0va21zYW4vc2hhZG93LmMtMjAwLVxcdCAqIHRvIGp1c3QgZmlsbCB0aGUgb3JpZ2luIHBhZ2VzIHdpdGggQGhhbmRsZS5cXG4tLVxcbm1tL21lbWJsb2NrLmMtNDktICpcXG5tbS9tZW1ibG9jay5jOjUwOiAqIE1lbWJsb2NrIHZpZXdzIHRoZSBzeXN0ZW0gbWVtb3J5IGFzIGNvbGxlY3Rpb25zIG9mIGNvbnRpZ3VvdXNcXG5tbS9tZW1ibG9jay5jLTUxLSAqIHJlZ2lvbnMuIFRoZXJlIGFyZSBzZXZlcmFsIHR5cGVzIG9mIHRoZXNlIGNvbGxlY3Rpb25zOlxcbi0tXFxubW0vbWVtb3J5LmM9NDcxOT1zdGF0aWMgdm1fZmF1bHRfdCBoYW5kbGVfcHRlX21hcmtlcihzdHJ1Y3Qgdm1fZmF1bHQgKnZtZilcXG4tLVxcbm1tL21lbW9yeS5jLTQ3NDctLypcXG5tbS9tZW1vcnkuYzo0NzQ4OiAqIENoZWNrIGlmIHRoZSBQVEVzIHdpdGhpbiBhIHJhbmdlIGFyZSBjb250aWd1b3VzIHN3YXAgZW50cmllcy5cXG5tbS9tZW1vcnkuYy00NzQ5LSAqL1xcbi0tXFxubW0vbWVtb3J5LmM9NDc5NT1zdGF0aWMgdW5zaWduZWQgbG9uZyB0aHBfc3dhcGluX3N1aXRhYmxlX29yZGVycyhzdHJ1Y3Qgdm1fZmF1bHQgKnZtZilcXG4tLVxcbm1tL21lbW9yeS5jLTQ4NDAtXFx0ICogRm9yIGRvX3N3YXBfcGFnZSwgZmluZCB0aGUgaGlnaGVzdCBvcmRlciB3aGVyZSB0aGUgYWxpZ25lZCByYW5nZSBpc1xcbm1tL21lbW9yeS5jOjQ4NDE6XFx0ICogY29tcGxldGVseSBzd2FwIGVudHJpZXMgd2l0aCBjb250aWd1b3VzIHN3YXAgb2Zmc2V0cy5cXG5tbS9tZW1vcnkuYy00ODQyLVxcdCAqL1xcbi0tXFxubW0vbWVtb3J5X2hvdHBsdWcuYz0xNTQ9c3RhdGljIGludCBnZXRfb25saW5lX3BvbGljeShjaGFyICpidWZmZXIsIGNvbnN0IHN0cnVjdCBrZXJuZWxfcGFyYW0gKmtwKVxcbi0tXFxubW0vbWVtb3J5X2hvdHBsdWcuYy0xNjItICpcXG5tbS9tZW1vcnlfaG90cGx1Zy5jOjE2MzogKiBcXFwiY29udGlnLXpvbmVzXFxcIjoga2VlcCB6b25lIGNvbnRpZ3VvdXNcXG5tbS9tZW1vcnlfaG90cGx1Zy5jLTE2NC0gKiBcXFwiYXV0by1tb3ZhYmxlXFxcIjogb25saW5lIG1lbW9yeSB0byBaT05FX01PVkFCTEUgaWYgdGhlIGNvbmZpZ3VyYXRpb25cXG4tLVxcbm1tL21lbXBvbGljeS5jPTI1NDY9c3RydWN0IHBhZ2UgKmFsbG9jX2Zyb3plbl9wYWdlc19ub3Byb2YoZ2ZwX3QgZ2ZwLCB1bnNpZ25lZCBvcmRlcilcXG4tLVxcbm1tL21lbXBvbGljeS5jLTI1NjUtICpcXG5tbS9tZW1wb2xpY3kuYzoyNTY2OiAqIEFsbG9jYXRlIDEgXFx1MDAzY1xcdTAwM2MgQG9yZGVyIGNvbnRpZ3VvdXMgcGFnZXMuICBUaGUgcGh5c2ljYWwgYWRkcmVzcyBvZiB0aGVcXG5tbS9tZW1wb2xpY3kuYy0yNTY3LSAqIGZpcnN0IHBhZ2UgaXMgbmF0dXJhbGx5IGFsaWduZWQgKGVnIGFuIG9yZGVyLTMgYWxsb2NhdGlvbiB3aWxsIGJlIGFsaWduZWRcXG4tLVxcbm1tL21pZ3JhdGVfZGV2aWNlLmM9MTQ0OD1FWFBPUlRfU1lNQk9MKG1pZ3JhdGVfZGV2aWNlX3JhbmdlKTtcXG4tLVxcbm1tL21pZ3JhdGVfZGV2aWNlLmMtMTQ1NC0gKlxcbm1tL21pZ3JhdGVfZGV2aWNlLmM6MTQ1NTogKiBTaW1pbGFyIHRvIG1pZ3JhdGVfZGV2aWNlX3JhbmdlKCkgYnV0IHN1cHBvcnRzIG5vbi1jb250aWd1b3VzIHByZS1wb3B1bGF0ZWRcXG5tbS9taWdyYXRlX2RldmljZS5jLTE0NTYtICogYXJyYXkgb2YgZGV2aWNlIHBhZ2VzIHRvIG1pZ3JhdGUuXFxuLS1cXG5tbS9tbV9pbml0LmM9NzkyPXZvaWQgX19tZW1pbml0IGluaXRfZGVmZXJyZWRfcGFnZSh1bnNpZ25lZCBsb25nIHBmbiwgaW50IG5pZClcXG4tLVxcbm1tL21tX2luaXQuYy04MDYtICogLSBlYXJseSByZXNlcnZlZCBtZW1vcnkgbWF5IG5vdCBiZSBsaXN0ZWQgaW4gbWVtYmxvY2subWVtb3J5XFxubW0vbW1faW5pdC5jOjgwNzogKiAtIG5vbi1tZW1vcnkgcmVnaW9ucyBjb3ZlcmVkIGJ5IHRoZSBjb250aWd1b3VzIGZsYXRtZW0gbWFwcGluZ1xcbm1tL21tX2luaXQuYy04MDgtICogLSBtZW1vcnkgbGF5b3V0cyBkZWZpbmVkIHdpdGggbWVtbWFwPSBrZXJuZWwgcGFyYW1ldGVyIG1heSBub3QgYWxpZ25cXG4tLVxcbm1tL21tX2luaXQuYz0xNDY2PXN0YXRpYyB2b2lkIF9faW5pdCBzZXRfcGFnZWJsb2NrX29yZGVyKHZvaWQpXFxuLS1cXG5tbS9tbV9pbml0LmMtMTQ3OC1cXHQvKlxcbm1tL21tX2luaXQuYzoxNDc5OlxcdCAqIEFzc3VtZSB0aGUgbGFyZ2VzdCBjb250aWd1b3VzIG9yZGVyIG9mIGludGVyZXN0IGlzIGEgaHVnZSBwYWdlLlxcbm1tL21tX2luaXQuYy0xNDgwLVxcdCAqIFRoaXMgdmFsdWUgbWF5IGJlIHZhcmlhYmxlIGRlcGVuZGluZyBvbiBib290IHBhcmFtZXRlcnMgb24gcG93ZXJwYy5cXG4tLVxcbm1tL21tX2luaXQuYz0yMjQ2PXZvaWQgX19pbml0IHBhZ2VfYWxsb2NfaW5pdF9sYXRlKHZvaWQpXFxuLS1cXG5tbS9tbV9pbml0LmMtMjI4My1cXHRmb3JfZWFjaF9wb3B1bGF0ZWRfem9uZSh6b25lKVxcbm1tL21tX2luaXQuYzoyMjg0OlxcdFxcdHNldF96b25lX2NvbnRpZ3VvdXMoem9uZSk7XFxubW0vbW1faW5pdC5jLTIyODUtXFxuLS1cXG5tbS9tbV9pbml0LmM9MjY1MD12b2lkIF9faW5pdCBtbV9jb3JlX2luaXQodm9pZClcXG4tLVxcbm1tL21tX2luaXQuYy0yNjYwLVxcdC8qXFxubW0vbW1faW5pdC5jOjI2NjE6XFx0ICogcGFnZV9leHQgcmVxdWlyZXMgY29udGlndW91cyBwYWdlcyxcXG5tbS9tbV9pbml0LmMtMjY2Mi1cXHQgKiBiaWdnZXIgdGhhbiBNQVhfUEFHRV9PUkRFUiB1bmxlc3MgU1BBUlNFTUVNLlxcbi0tXFxubW0vbm9tbXUuYz0xNzg9bG9uZyB2cmVhZF9pdGVyKHN0cnVjdCBpb3ZfaXRlciAqaXRlciwgY29uc3QgY2hhciAqYWRkciwgc2l6ZV90IGNvdW50KVxcbi0tXFxubW0vbm9tbXUuYy0xODctLypcXG5tbS9ub21tdS5jOjE4ODogKlxcdHZtYWxsb2MgIC0gIGFsbG9jYXRlIHZpcnR1YWxseSBjb250aWd1b3VzIG1lbW9yeVxcbm1tL25vbW11LmMtMTg5LSAqXFxuLS1cXG5tbS9ub21tdS5jLTE5Mi0gKlxcdEFsbG9jYXRlIGVub3VnaCBwYWdlcyB0byBjb3ZlciBAc2l6ZSBmcm9tIHRoZSBwYWdlIGxldmVsXFxubW0vbm9tbXUuYzoxOTM6ICpcXHRhbGxvY2F0b3IgYW5kIG1hcCB0aGVtIGludG8gY29udGlndW91cyBrZXJuZWwgdmlydHVhbCBzcGFjZS5cXG5tbS9ub21tdS5jLTE5NC0gKlxcbi0tXFxubW0vbm9tbXUuYz0yMDI9RVhQT1JUX1NZTUJPTCh2bWFsbG9jX25vcHJvZik7XFxuLS1cXG5tbS9ub21tdS5jLTIwNC0vKlxcbm1tL25vbW11LmM6MjA1OiAqXFx0dm1hbGxvY19odWdlX25vZGUgIC0gIGFsbG9jYXRlIHZpcnR1YWxseSBjb250aWd1b3VzIG1lbW9yeSwgb24gYSBub2RlXFxubW0vbm9tbXUuYy0yMDYtICpcXG4tLVxcbm1tL25vbW11LmMtMjExLSAqXFx0QWxsb2NhdGUgZW5vdWdoIHBhZ2VzIHRvIGNvdmVyIEBzaXplIGZyb20gdGhlIHBhZ2UgbGV2ZWxcXG5tbS9ub21tdS5jOjIxMjogKlxcdGFsbG9jYXRvciBhbmQgbWFwIHRoZW0gaW50byBjb250aWd1b3VzIGtlcm5lbCB2aXJ0dWFsIHNwYWNlLlxcbm1tL25vbW11LmMtMjEzLSAqXFxuLS1cXG5tbS9ub21tdS5jPTIxNz12b2lkICp2bWFsbG9jX2h1Z2Vfbm9kZV9ub3Byb2YodW5zaWduZWQgbG9uZyBzaXplLCBnZnBfdCBnZnBfbWFzaywgaW50IG5vZGUpXFxuLS1cXG5tbS9ub21tdS5jLTIyMi0vKlxcbm1tL25vbW11LmM6MjIzOiAqXFx0dnphbGxvYyAtIGFsbG9jYXRlIHZpcnR1YWxseSBjb250aWd1b3VzIG1lbW9yeSB3aXRoIHplcm8gZmlsbFxcbm1tL25vbW11LmMtMjI0LSAqXFxuLS1cXG5tbS9ub21tdS5jLTIyNy0gKlxcdEFsbG9jYXRlIGVub3VnaCBwYWdlcyB0byBjb3ZlciBAc2l6ZSBmcm9tIHRoZSBwYWdlIGxldmVsXFxubW0vbm9tbXUuYzoyMjg6ICpcXHRhbGxvY2F0b3IgYW5kIG1hcCB0aGVtIGludG8gY29udGlndW91cyBrZXJuZWwgdmlydHVhbCBzcGFjZS5cXG5tbS9ub21tdS5jLTIyOS0gKlxcdFRoZSBtZW1vcnkgYWxsb2NhdGVkIGlzIHNldCB0byB6ZXJvLlxcbi0tXFxubW0vbm9tbXUuYz0yMzg9RVhQT1JUX1NZTUJPTCh2emFsbG9jX25vcHJvZik7XFxuLS1cXG5tbS9ub21tdS5jLTI0NS0gKiBBbGxvY2F0ZSBlbm91Z2ggcGFnZXMgdG8gY292ZXIgQHNpemUgZnJvbSB0aGUgcGFnZSBsZXZlbFxcbm1tL25vbW11LmM6MjQ2OiAqIGFsbG9jYXRvciBhbmQgbWFwIHRoZW0gaW50byBjb250aWd1b3VzIGtlcm5lbCB2aXJ0dWFsIHNwYWNlLlxcbm1tL25vbW11LmMtMjQ3LSAqXFxuLS1cXG5tbS9ub21tdS5jPTI1NT1FWFBPUlRfU1lNQk9MKHZtYWxsb2Nfbm9kZV9ub3Byb2YpO1xcbi0tXFxubW0vbm9tbXUuYy0yNjItICogQWxsb2NhdGUgZW5vdWdoIHBhZ2VzIHRvIGNvdmVyIEBzaXplIGZyb20gdGhlIHBhZ2UgbGV2ZWxcXG5tbS9ub21tdS5jOjI2MzogKiBhbGxvY2F0b3IgYW5kIG1hcCB0aGVtIGludG8gY29udGlndW91cyBrZXJuZWwgdmlydHVhbCBzcGFjZS5cXG5tbS9ub21tdS5jLTI2NC0gKiBUaGUgbWVtb3J5IGFsbG9jYXRlZCBpcyBzZXQgdG8gemVyby5cXG4tLVxcbm1tL25vbW11LmM9MjczPUVYUE9SVF9TWU1CT0wodnphbGxvY19ub2RlX25vcHJvZik7XFxuLS1cXG5tbS9ub21tdS5jLTI3NS0vKipcXG5tbS9ub21tdS5jOjI3NjogKiB2bWFsbG9jXzMyICAtICBhbGxvY2F0ZSB2aXJ0dWFsbHkgY29udGlndW91cyBtZW1vcnkgKDMyYml0IGFkZHJlc3NhYmxlKVxcbm1tL25vbW11LmMtMjc3LSAqXFx0QHNpemU6XFx0XFx0YWxsb2NhdGlvbiBzaXplXFxuLS1cXG5tbS9ub21tdS5jLTI3OS0gKlxcdEFsbG9jYXRlIGVub3VnaCAzMmJpdCBQQSBhZGRyZXNzYWJsZSBwYWdlcyB0byBjb3ZlciBAc2l6ZSBmcm9tIHRoZVxcbm1tL25vbW11LmM6MjgwOiAqXFx0cGFnZSBsZXZlbCBhbGxvY2F0b3IgYW5kIG1hcCB0aGVtIGludG8gY29udGlndW91cyBrZXJuZWwgdmlydHVhbCBzcGFjZS5cXG5tbS9ub21tdS5jLTI4MS0gKi9cXG4tLVxcbm1tL25vbW11LmM9Mjg2PUVYUE9SVF9TWU1CT0wodm1hbGxvY18zMl9ub3Byb2YpO1xcbi0tXFxubW0vbm9tbXUuYy0yODgtLyoqXFxubW0vbm9tbXUuYzoyODk6ICogdm1hbGxvY18zMl91c2VyIC0gYWxsb2NhdGUgemVyb2VkIHZpcnR1YWxseSBjb250aWd1b3VzIDMyYml0IG1lbW9yeVxcbm1tL25vbW11LmMtMjkwLSAqXFx0QHNpemU6XFx0XFx0YWxsb2NhdGlvbiBzaXplXFxuLS1cXG5tbS9ub21tdS5jPTUwMj1zdGF0aWMgdm9pZCBkZWxldGVfbm9tbXVfcmVnaW9uKHN0cnVjdCB2bV9yZWdpb24gKnJlZ2lvbilcXG4tLVxcbm1tL25vbW11LmMtNTExLS8qXFxubW0vbm9tbXUuYzo1MTI6ICogZnJlZSBhIGNvbnRpZ3VvdXMgc2VyaWVzIG9mIHBhZ2VzXFxubW0vbm9tbXUuYy01MTMtICovXFxuLS1cXG5tbS9wYWdlX2FsbG9jLmMtMTAtICogIFJlc2hhcGVkIGl0IHRvIGJlIGEgem9uZWQgYWxsb2NhdG9yLCBJbmdvIE1vbG5hciwgUmVkIEhhdCwgMTk5OVxcbm1tL3BhZ2VfYWxsb2MuYzoxMTogKiAgRGlzY29udGlndW91cyBtZW1vcnkgc3VwcG9ydCwgS2Fub2ogU2FyY2FyLCBTR0ksIE5vdiAxOTk5XFxubW0vcGFnZV9hbGxvYy5jLTEyLSAqICBab25lIGJhbGFuY2luZywgS2Fub2ogU2FyY2FyLCBTR0ksIEphbiAyMDAwXFxuLS1cXG5tbS9wYWdlX2FsbG9jLmM9MjIxNz1zdGF0aWMgYm9vbCBzaG91bGRfdHJ5X2NsYWltX2Jsb2NrKHVuc2lnbmVkIGludCBvcmRlciwgaW50IHN0YXJ0X210KVxcbi0tXFxubW0vcGFnZV9hbGxvYy5jLTIyNTItXFx0ICogcmVjbGFpbWFibGUgcGFnZXMgdGhhdCBhcmUgY2xvc2VzdCB0byB0aGUgcmVxdWVzdCBzaXplLiBBZnRlciBhXFxubW0vcGFnZV9hbGxvYy5jOjIyNTM6XFx0ICogd2hpbGUsIG1lbW9yeSBjb21wYWN0aW9uIG1heSBvY2N1ciB0byBmb3JtIGxhcmdlIGNvbnRpZ3VvdXMgcGFnZXMsXFxubW0vcGFnZV9hbGxvYy5jLTIyNTQtXFx0ICogYW5kIHRoZSBuZXh0IG1vdmFibGUgYWxsb2NhdGlvbiBtYXkgbm90IG5lZWQgdG8gc3RlYWwuXFxuLS1cXG5tbS9wYWdlX2FsbG9jLmM9NTMwMD1FWFBPUlRfU1lNQk9MX0dQTChhbGxvY19wYWdlc19idWxrX25vcHJvZik7XFxuLS1cXG5tbS9wYWdlX2FsbG9jLmMtNTMwNi0gKlxcbm1tL3BhZ2VfYWxsb2MuYzo1MzA3OiAqIEZyZWUgdGhlIG9yZGVyLTAgcGFnZXMuIEFkamFjZW50IGVudHJpZXMgd2hvc2UgUEZOcyBmb3JtIGEgY29udGlndW91c1xcbm1tL3BhZ2VfYWxsb2MuYy01MzA4LSAqIHJ1biBhcmUgcmVsZWFzZWQgd2l0aCBhIHNpbmdsZSBfX2ZyZWVfY29udGlnX3JhbmdlKCkgY2FsbC5cXG4tLVxcbm1tL3BhZ2VfYWxsb2MuYy01MzEwLSAqIFRoaXMgYXNzdW1lcyBwYWdlX2FycmF5IGlzIHNvcnRlZCBpbiBhc2NlbmRpbmcgUEZOIG9yZGVyLiBXaXRob3V0IHRoYXQsXFxubW0vcGFnZV9hbGxvYy5jOjUzMTE6ICogdGhlIGZ1bmN0aW9uIHN0aWxsIGZyZWVzIGFsbCBwYWdlcywgYnV0IGNvbnRpZ3VvdXMgcnVucyBtYXkgbm90IGJlXFxubW0vcGFnZV9hbGxvYy5jLTUzMTItICogZGV0ZWN0ZWQgYW5kIHRoZSBmcmVlaW5nIHBhdHRlcm4gY2FuIGRlZ3JhZGUgdG8gZnJlZWluZyBvbmUgcGFnZSBhdCBhXFxuLS1cXG5tbS9wYWdlX2FsbG9jLmM9NTMxNz12b2lkIGZyZWVfcGFnZXNfYnVsayhzdHJ1Y3QgcGFnZSAqKnBhZ2VfYXJyYXksIHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMpXFxuLS1cXG5tbS9wYWdlX2FsbG9jLmMtNTMxOS1cXHR3aGlsZSAobnJfcGFnZXMpIHtcXG5tbS9wYWdlX2FsbG9jLmM6NTMyMDpcXHRcXHR1bnNpZ25lZCBsb25nIG5yX2NvbnRpZyA9IG51bV9wYWdlc19jb250aWd1b3VzKHBhZ2VfYXJyYXksIG5yX3BhZ2VzKTtcXG5tbS9wYWdlX2FsbG9jLmMtNTMyMS1cXG4tLVxcbm1tL3BhZ2VfYWxsb2MuYz01NTk5PXN0YXRpYyB2b2lkICptYWtlX2FsbG9jX2V4YWN0KHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgaW50IG9yZGVyLFxcbi0tXFxubW0vcGFnZV9hbGxvYy5jLTU2MTgtLyoqXFxubW0vcGFnZV9hbGxvYy5jOjU2MTk6ICogYWxsb2NfcGFnZXNfZXhhY3QgLSBhbGxvY2F0ZSBhbiBleGFjdCBudW1iZXIgcGh5c2ljYWxseS1jb250aWd1b3VzIHBhZ2VzLlxcbm1tL3BhZ2VfYWxsb2MuYy01NjIwLSAqIEBzaXplOiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIGFsbG9jYXRlXFxuLS1cXG5tbS9wYWdlX2FsbG9jLmM9NTY0ND1FWFBPUlRfU1lNQk9MKGFsbG9jX3BhZ2VzX2V4YWN0X25vcHJvZik7XFxuLS1cXG5tbS9wYWdlX2FsbG9jLmMtNTY0Ni0vKipcXG5tbS9wYWdlX2FsbG9jLmM6NTY0NzogKiBhbGxvY19wYWdlc19leGFjdF9uaWQgLSBhbGxvY2F0ZSBhbiBleGFjdCBudW1iZXIgb2YgcGh5c2ljYWxseS1jb250aWd1b3VzXFxubW0vcGFnZV9hbGxvYy5jLTU2NDgtICpcXHRcXHRcXHQgICBwYWdlcyBvbiBhIG5vZGUuXFxuLS1cXG5tbS9wYWdlX2FsbG9jLmM9NjEyMD1zdGF0aWMgaW50IHpvbmVfYmF0Y2hzaXplKHN0cnVjdCB6b25lICp6b25lKVxcbi0tXFxubW0vcGFnZV9hbGxvYy5jLTYxNTMtXFx0ICogVGhlIHByb2JsZW0gaXMgdGhhdCBOT01NVSBuZWVkcyB0byBiZSBhYmxlIHRvIGFsbG9jYXRlIGxhcmdlIGNodW5rc1xcbm1tL3BhZ2VfYWxsb2MuYzo2MTU0OlxcdCAqIG9mIGNvbnRpZ3VvdXMgbWVtb3J5IGFzIHRoZXJlJ3Mgbm8gaGFyZHdhcmUgcGFnZSB0cmFuc2xhdGlvbiB0b1xcbm1tL3BhZ2VfYWxsb2MuYzo2MTU1OlxcdCAqIGFzc2VtYmxlIGFwcGFyZW50IGNvbnRpZ3VvdXMgbWVtb3J5IGZyb20gZGlzY29udGlndW91cyBwYWdlcy5cXG5tbS9wYWdlX2FsbG9jLmMtNjE1Ni1cXHQgKlxcbm1tL3BhZ2VfYWxsb2MuYzo2MTU3OlxcdCAqIFF1ZXVlaW5nIGxhcmdlIGNvbnRpZ3VvdXMgcnVucyBvZiBwYWdlcyBmb3IgYmF0Y2hpbmcsIGhvd2V2ZXIsXFxubW0vcGFnZV9hbGxvYy5jLTYxNTgtXFx0ICogY2F1c2VzIHRoZSBwYWdlcyB0byBhY3R1YWxseSBiZSBmcmVlZCBpbiBzbWFsbGVyIGNodW5rcy4gIEFzIHRoZXJlXFxuLS1cXG5tbS9wYWdlX2FsbG9jLmM9NzA0Nz1zdGF0aWMgdm9pZCBfX2ZyZWVfY29udGlnX3JhbmdlX2NvbW1vbih1bnNpZ25lZCBsb25nIHBmbiwgdW5zaWduZWQgbG9uZyBucl9wYWdlcyxcXG4tLVxcbm1tL3BhZ2VfYWxsb2MuYy03MDU4LVxcdFxcdC8qXFxubW0vcGFnZV9hbGxvYy5jOjcwNTk6XFx0XFx0ICogQ29udGlndW91cyBQRk5zIG1pZ2h0IG5vdCBoYXZlIGNvbnRpZ3VvdXMgXFxcInN0cnVjdCBwYWdlc1xcXCJcXG5tbS9wYWdlX2FsbG9jLmMtNzA2MC1cXHRcXHQgKiBpbiBzb21lIGtlcm5lbCBjb25maWdzOiBwYWdlKysgYWNyb3NzIGEgc2VjdGlvbiBib3VuZGFyeVxcbi0tXFxubW0vcGFnZV9hbGxvYy5jLTcwOTgtLyoqXFxubW0vcGFnZV9hbGxvYy5jOjcwOTk6ICogX19mcmVlX2NvbnRpZ19yYW5nZSAtIEZyZWUgY29udGlndW91cyByYW5nZSBvZiBvcmRlci0wIHBhZ2VzLlxcbm1tL3BhZ2VfYWxsb2MuYy03MTAwLSAqIEBwZm46IFBhZ2UgZnJhbWUgbnVtYmVyIG9mIHRoZSBmaXJzdCBwYWdlIGluIHRoZSByYW5nZS5cXG4tLVxcbm1tL3BhZ2VfYWxsb2MuYy03MTAyLSAqXFxubW0vcGFnZV9hbGxvYy5jOjcxMDM6ICogRm9yIGVhY2ggb3JkZXItMCBzdHJ1Y3QgcGFnZSBpbiB0aGUgcGh5c2ljYWxseSBjb250aWd1b3VzIHJhbmdlLCBwdXQgYVxcbm1tL3BhZ2VfYWxsb2MuYy03MTA0LSAqIHJlZmVyZW5jZS4gRnJlZSBhbnkgcGFnZSB3aG8ncyByZWZlcmVuY2UgY291bnQgZmFsbHMgdG8gemVyby4gVGhlXFxuLS1cXG5tbS9wYWdlX2FsbG9jLmMtNzEwOC0gKiBNZW1vcnkgYWxsb2NhdGVkIHdpdGggYWxsb2NfcGFnZXMob3JkZXJcXHUwMDNlPTEpIHRoZW4gc3Vic2VxdWVudGx5IHNwbGl0IHRvXFxubW0vcGFnZV9hbGxvYy5jOjcxMDk6ICogb3JkZXItMCB3aXRoIHNwbGl0X3BhZ2UoKSBpcyBhbiBleGFtcGxlIG9mIGFwcHJvcHJpYXRlIGNvbnRpZ3VvdXMgcGFnZXMgdGhhdFxcbm1tL3BhZ2VfYWxsb2MuYy03MTEwLSAqIGNhbiBiZSBmcmVlZCB3aXRoIHRoaXMgQVBJLlxcbi0tXFxubW0vcGFnZV9hbGxvYy5jPTc0NTY9c3RhdGljIGJvb2wgcGZuX3JhbmdlX3ZhbGlkX2NvbnRpZyhzdHJ1Y3Qgem9uZSAqeiwgdW5zaWduZWQgbG9uZyBzdGFydF9wZm4sXFxuLS1cXG5tbS9wYWdlX2FsbG9jLmMtNzQ3Ny1cXHRcXHQgKiBPbmx5IGNvbnNpZGVyIHJhbmdlcyBjb250YWluaW5nIGh1Z2VwYWdlcyBpZiB0aG9zZSBwYWdlcyBhcmVcXG5tbS9wYWdlX2FsbG9jLmM6NzQ3ODpcXHRcXHQgKiBzbWFsbGVyIHRoYW4gdGhlIHJlcXVlc3RlZCBjb250aWd1b3VzIHJlZ2lvbi4gIGUuZy46XFxubW0vcGFnZV9hbGxvYy5jLTc0NzktXFx0XFx0ICogICAgIE1vdmUgMk1CIHBhZ2VzIHRvIGZyZWUgdXAgYSAxR0IgcmFuZ2UuXFxuLS1cXG5tbS9wYWdlX2FsbG9jLmMtNzQ4MS1cXHRcXHQgKlxcbm1tL3BhZ2VfYWxsb2MuYzo3NDgyOlxcdFxcdCAqIFRoaXMgbWFrZXMgY29udGlndW91cyBhbGxvY2F0aW9uIG1vcmUgcmVsaWFibGUgaWYgbXVsdGlwbGVcXG5tbS9wYWdlX2FsbG9jLmMtNzQ4My1cXHRcXHQgKiBodWdlcGFnZSBzaXplcyBhcmUgdXNlZCB3aXRob3V0IGNhdXNpbmcgbmVlZGxlc3MgbW92ZW1lbnQuXFxuLS1cXG5tbS9wYWdlX2FsbG9jLmM9NzUwNT1zdGF0aWMgYm9vbCB6b25lX3NwYW5zX2xhc3RfcGZuKGNvbnN0IHN0cnVjdCB6b25lICp6b25lLFxcbi0tXFxubW0vcGFnZV9hbGxvYy5jLTc1MTMtLyoqXFxubW0vcGFnZV9hbGxvYy5jOjc1MTQ6ICogYWxsb2NfY29udGlnX2Zyb3plbl9wYWdlcygpIC0tIHRyaWVzIHRvIGZpbmQgYW5kIGFsbG9jYXRlIGNvbnRpZ3VvdXMgcmFuZ2Ugb2YgZnJvemVuIHBhZ2VzXFxubW0vcGFnZV9hbGxvYy5jOjc1MTU6ICogQG5yX3BhZ2VzOlxcdE51bWJlciBvZiBjb250aWd1b3VzIHBhZ2VzIHRvIGFsbG9jYXRlXFxubW0vcGFnZV9hbGxvYy5jLTc1MTYtICogQGdmcF9tYXNrOlxcdEdGUCBtYXNrLiBOb2RlL3pvbmUvcGxhY2VtZW50IGhpbnRzIGxpbWl0IHRoZSBzZWFyY2g7IG9ubHkgc29tZVxcbi0tXFxubW0vcGFnZV9hbGxvYy5jLTc1MjItICogVGhpcyByb3V0aW5lIGlzIGEgd3JhcHBlciBhcm91bmQgYWxsb2NfY29udGlnX2Zyb3plbl9yYW5nZSgpLiBJdCBzY2FucyBvdmVyXFxubW0vcGFnZV9hbGxvYy5jOjc1MjM6ICogem9uZXMgb24gYW4gYXBwbGljYWJsZSB6b25lbGlzdCB0byBmaW5kIGEgY29udGlndW91cyBwZm4gcmFuZ2Ugd2hpY2ggY2FuIHRoZW5cXG5tbS9wYWdlX2FsbG9jLmMtNzUyNC0gKiBiZSB0cmllZCBmb3IgYWxsb2NhdGlvbiB3aXRoIGFsbG9jX2NvbnRpZ19mcm96ZW5fcmFuZ2UoKS4gVGhpcyByb3V0aW5lIGlzXFxuLS1cXG5tbS9wYWdlX2FsbG9jLmMtNzUzNi0gKlxcbm1tL3BhZ2VfYWxsb2MuYzo3NTM3OiAqIFJldHVybjogcG9pbnRlciB0byBjb250aWd1b3VzIGZyb3plbiBwYWdlcyBvbiBzdWNjZXNzLCBvciBOVUxMIGlmIG5vdCBzdWNjZXNzZnVsLlxcbm1tL3BhZ2VfYWxsb2MuYy03NTM4LSAqL1xcbm1tL3BhZ2VfYWxsb2MuYz03NTM5PXN0cnVjdCBwYWdlICphbGxvY19jb250aWdfZnJvemVuX3BhZ2VzX25vcHJvZih1bnNpZ25lZCBsb25nIG5yX3BhZ2VzLFxcbi0tXFxubW0vcGFnZV9hbGxvYy5jLTc1ODQtXFx0ICogc2Vjb25kIHBhc3MsIHdlIHdpbGwgdHJ5IG1vdmluZyBIdWdlVExCIHBhZ2VzIHdoZW4gdGhvc2UgcGFnZXMgYXJlXFxubW0vcGFnZV9hbGxvYy5jOjc1ODU6XFx0ICogc21hbGxlciB0aGFuIHRoZSByZXF1ZXN0ZWQgY29udGlndW91cyByZWdpb24gc2l6ZS5cXG5tbS9wYWdlX2FsbG9jLmMtNzU4Ni1cXHQgKi9cXG4tLVxcbm1tL3BhZ2VfYWxsb2MuYz03NTkzPUVYUE9SVF9TWU1CT0woYWxsb2NfY29udGlnX2Zyb3plbl9wYWdlc19ub3Byb2YpO1xcbi0tXFxubW0vcGFnZV9hbGxvYy5jLTc1OTUtLyoqXFxubW0vcGFnZV9hbGxvYy5jOjc1OTY6ICogYWxsb2NfY29udGlnX3BhZ2VzKCkgLS0gdHJpZXMgdG8gZmluZCBhbmQgYWxsb2NhdGUgY29udGlndW91cyByYW5nZSBvZiBwYWdlc1xcbm1tL3BhZ2VfYWxsb2MuYzo3NTk3OiAqIEBucl9wYWdlczpcXHROdW1iZXIgb2YgY29udGlndW91cyBwYWdlcyB0byBhbGxvY2F0ZVxcbm1tL3BhZ2VfYWxsb2MuYy03NTk4LSAqIEBnZnBfbWFzazpcXHRHRlAgbWFzay5cXG4tLVxcbm1tL3BhZ2VfYWxsb2MuYy03NjA4LSAqXFxubW0vcGFnZV9hbGxvYy5jOjc2MDk6ICogUmV0dXJuOiBwb2ludGVyIHRvIGNvbnRpZ3VvdXMgcGFnZXMgb24gc3VjY2Vzcywgb3IgTlVMTCBpZiBub3Qgc3VjY2Vzc2Z1bC5cXG5tbS9wYWdlX2FsbG9jLmMtNzYxMC0gKi9cXG4tLVxcbm1tL3BhZ2VfYWxsb2MuYz03NjI2PUVYUE9SVF9TWU1CT0woYWxsb2NfY29udGlnX3BhZ2VzX25vcHJvZik7XFxuLS1cXG5tbS9wYWdlX2FsbG9jLmMtNzYyOC0vKipcXG5tbS9wYWdlX2FsbG9jLmM6NzYyOTogKiBmcmVlX2NvbnRpZ19mcm96ZW5fcmFuZ2UoKSAtLSBmcmVlIHRoZSBjb250aWd1b3VzIHJhbmdlIG9mIGZyb3plbiBwYWdlc1xcbm1tL3BhZ2VfYWxsb2MuYy03NjMwLSAqIEBwZm46XFx0c3RhcnQgUEZOIHRvIGZyZWVcXG5tbS9wYWdlX2FsbG9jLmM6NzYzMTogKiBAbnJfcGFnZXM6XFx0TnVtYmVyIG9mIGNvbnRpZ3VvdXMgZnJvemVuIHBhZ2VzIHRvIGZyZWVcXG5tbS9wYWdlX2FsbG9jLmMtNzYzMi0gKlxcbi0tXFxubW0vcGFnZV9hbGxvYy5jPTc2NTE9RVhQT1JUX1NZTUJPTChmcmVlX2NvbnRpZ19mcm96ZW5fcmFuZ2UpO1xcbi0tXFxubW0vcGFnZV9hbGxvYy5jLTc2NTMtLyoqXFxubW0vcGFnZV9hbGxvYy5jOjc2NTQ6ICogZnJlZV9jb250aWdfcmFuZ2UoKSAtLSBmcmVlIHRoZSBjb250aWd1b3VzIHJhbmdlIG9mIHBhZ2VzXFxubW0vcGFnZV9hbGxvYy5jLTc2NTUtICogQHBmbjpcXHRzdGFydCBQRk4gdG8gZnJlZVxcbm1tL3BhZ2VfYWxsb2MuYzo3NjU2OiAqIEBucl9wYWdlczpcXHROdW1iZXIgb2YgY29udGlndW91cyBwYWdlcyB0byBmcmVlXFxubW0vcGFnZV9hbGxvYy5jLTc2NTctICpcXG4tLVxcbm1tL3BhZ2VfYWxsb2MuaD0xMzg9c3RhdGljIGlubGluZSBib29sIHBhZ2VfaXNfYnVkZHkoc3RydWN0IHBhZ2UgKnBhZ2UsIHN0cnVjdCBwYWdlICpidWRkeSxcXG4tLVxcbm1tL3BhZ2VfYWxsb2MuaC0xNzMtICpcXG5tbS9wYWdlX2FsbG9jLmg6MTc0OiAqIEFzc3VtcHRpb246ICpfbWVtX21hcCBpcyBjb250aWd1b3VzIGF0IGxlYXN0IHVwIHRvIE1BWF9QQUdFX09SREVSXFxubW0vcGFnZV9hbGxvYy5oLTE3NS0gKi9cXG4tLVxcbm1tL3BhZ2VfYWxsb2MuaD0yMTQ9c3RhdGljIGlubGluZSBzdHJ1Y3QgcGFnZSAqcGFnZWJsb2NrX3Bmbl90b19wYWdlKHVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuLFxcbi0tXFxubW0vcGFnZV9hbGxvYy5oLTIxNi17XFxubW0vcGFnZV9hbGxvYy5oOjIxNzpcXHRpZiAoem9uZV9pc19jb250aWd1b3VzKHpvbmUpKVxcbm1tL3BhZ2VfYWxsb2MuaC0yMTgtXFx0XFx0cmV0dXJuIHBmbl90b19wYWdlKHN0YXJ0X3Bmbik7XFxuXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTE0VDA3OjUyOjM4LjQ4MzQ5NzU2NFoiLCJTZXEiOjY1LCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuOC1mbGFzaCIsIkR1cmF0aW9uIjoyMTMxODE5OTMzOCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IGFuYWx5c2lzIG9mIHRoZSBwcm92aWRlZCBpbmZvcm1hdGlvbjpcblxuKipVbmRlcnN0YW5kaW5nIHRoZSBDb250aWd1b3VzIFpvbmUgTWVjaGFuaXNtKipcblxuT2theSwgc28gSSdtIGxvb2tpbmcgYXQgbWVtb3J5IG1hbmFnZW1lbnQsIHNwZWNpZmljYWxseSBob3cgY29udGlndW91cyBtZW1vcnkgem9uZXMgYXJlIGhhbmRsZWQgd2l0aGluIHRoZSBMaW51eCBrZXJuZWwuIFRoZSBrZXkgcG9pbnQgaGVyZSBpcyB0aGF0IGB6b25lLVx1MDAzZWNvbnRpZ3VvdXNgIGFscmVhZHkgZXhpc3RzIGFzIGEgZmllbGQgaW4gdGhlIGBzdHJ1Y3Qgem9uZWAgZGF0YSBzdHJ1Y3R1cmUuIFRoaXMgc3VnZ2VzdHMgdGhlcmUncyBzb21lIGV4aXN0aW5nIG1lY2hhbmlzbSBmb3IgdHJhY2tpbmcgY29udGlndW91cyBtZW1vcnkgcmVnaW9ucyB3aXRoaW4gYSB6b25lLiBNeSBpbW1lZGlhdGUgbmV4dCBzdGVwIGlzIHRvIGV4YW1pbmUgdGhlIGRlZmluaXRpb24gb2YgdGhpcyBgY29udGlndW91c2AgZmllbGQuIEkgbmVlZCB0byB1bmRlcnN0YW5kIGl0cyBzdHJ1Y3R1cmUsIHdoYXQgZGF0YSBpdCBob2xkcywgYW5kIGhvdyBpdCdzIHVzZWQuIEJhc2VkIG9uIHRoZSBwcm92aWRlZCBpbmZvcm1hdGlvbiwgSSdtIGhlYWRpbmcgb3ZlciB0byBgaW5jbHVkZS9saW51eC9tbXpvbmUuaGAgYXJvdW5kIGxpbmUgMTA2MCB0byBmaW5kIHRoZSBkZWZpbml0aW9uLiBUaGF0IHNob3VsZCBnaXZlIG1lIHRoZSBuZWNlc3NhcnkgY29udGV4dCB0byBkZXRlcm1pbmUgaG93IHRoaXMgZmllbGQgZml0cyBpbnRvIHRoZSBvdmVyYWxsIG1lbW9yeSBtYW5hZ2VtZW50IHN0cmF0ZWd5LlxuXG5cbiIsIklucHV0VG9rZW5zIjoyMDUwOSwiT3V0cHV0VG9rZW5zIjozNywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjQ4LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTE0VDA3OjUyOjU5LjgwMTY5OTQ2MloiLCJTZXEiOjY2LCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMjM3MDAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwiaW5jbHVkZS9saW51eC9tbXpvbmUuaFwiLFxuICBcIkZpcnN0TGluZVwiOiAxMDQwLFxuICBcIkxpbmVDb3VudFwiOiA2MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIxMDQwOlxcdFxcdCAqIGJvb3RtZW0gYWxsb2NhdG9yKTpcXG4xMDQxOlxcdFxcdCAqXFx0bWFuYWdlZF9wYWdlcyA9IHByZXNlbnRfcGFnZXMgLSByZXNlcnZlZF9wYWdlcztcXG4xMDQyOlxcdFxcdCAqXFxuMTA0MzpcXHRcXHQgKiBjbWEgcGFnZXMgaXMgcHJlc2VudCBwYWdlcyB0aGF0IGFyZSBhc3NpZ25lZCBmb3IgQ01BIHVzZVxcbjEwNDQ6XFx0XFx0ICogKE1JR1JBVEVfQ01BKS5cXG4xMDQ1OlxcdFxcdCAqXFxuMTA0NjpcXHRcXHQgKiBwYWdlc193aXRoX29ubGluZV9tZW1tYXAgdHJhY2tzIHBhZ2VzIHdpdGhpbiB0aGUgem9uZSB0aGF0IGhhdmVcXG4xMDQ3OlxcdFxcdCAqIGFuIG9ubGluZSBtZW1vcnkgbWFwOiBwcmVzZW50IHBhZ2VzIGFuZCBtZW1vcnkgaG9sZXMgd2hvc2VcXG4xMDQ4OlxcdFxcdCAqIG1lbW9yeSBtYXAgaGFzIGJlZW4gaW5pdGlhbGl6ZWQgYW5kIHBmbl90b19vbmxpbmVfcGFnZSgpXFxuMTA0OTpcXHRcXHQgKiBzdWNjZWVkcy4gV2hlbiBzcGFubmVkX3BhZ2VzID09IHBhZ2VzX3dpdGhfb25saW5lX21lbW1hcCxcXG4xMDUwOlxcdFxcdCAqIHBmbl90b19wYWdlKCkgY2FuIGJlIHBlcmZvcm1lZCB3aXRob3V0IGZ1cnRoZXIgY2hlY2tzIG9uIGFueVxcbjEwNTE6XFx0XFx0ICogUEZOIHdpdGhpbiB0aGUgem9uZSBzcGFuLlxcbjEwNTI6XFx0XFx0ICpcXG4xMDUzOlxcdFxcdCAqIE5vdGU6IHRoaXMgY291bnRlciBtYXkgdGVtcG9yYXJpbHkgdW5kZXJjb3VudCB3aGVuIHBhZ2VzIHdpdGggYW5cXG4xMDU0OlxcdFxcdCAqIG9ubGluZSBtZW1vcnkgbWFwIGV4aXN0IG91dHNpZGUgdGhlIGN1cnJlbnQgem9uZSBzcGFuLiBTdWNoIHBhZ2VzXFxuMTA1NTpcXHRcXHQgKiBhcmUgb25seSBjcmVhdGVkIGR1cmluZyBib290LCB3aGVuIGluaXRpYWxpemluZyB0aGUgbWVtb3J5IG1hcCBvZlxcbjEwNTY6XFx0XFx0ICogcGFnZXMgdGhhdCBkbyBub3QgZmFsbCBpbnRvIGFueSB6b25lIHNwYW4uIFRoZSB1bmRlcmNvdW50IGl0c2VsZlxcbjEwNTc6XFx0XFx0ICogY2FuIG9ubHkgaGFwcGVuIGFmdGVyIGJvb3QsIGR1cmluZyBtZW1vcnkgaG90cGx1Zywgd2hlbiBncm93aW5nXFxuMTA1ODpcXHRcXHQgKiB0aGUgem9uZSB0byBjb3ZlciBzdWNoIHBhZ2VzIGFuZCBsYXRlciBzaHJpbmtpbmcgaXQgYmFjaywgd2hpY2hcXG4xMDU5OlxcdFxcdCAqIG1heSByZXN1bHQgaW4gYSBcXFwidG9vIHNtYWxsXFxcIiB2YWx1ZS4gVGhpcyBpcyBzYWZlOiBpdCBtZXJlbHlcXG4xMDYwOlxcdFxcdCAqIHByZXZlbnRzIGRldGVjdGluZyBhIGNvbnRpZ3VvdXMgem9uZS5cXG4xMDYxOlxcdFxcdCAqXFxuMTA2MjpcXHRcXHQgKiBIZXJlIGlzIGFuIGV4YW1wbGUgKHBhZ2UgbnVtYmVycyBhcmUganVzdCBmb3IgaWxsdXN0cmF0aW9uXFxuMTA2MzpcXHRcXHQgKiBwdXJwb3Nlcyk6XFxuMTA2NDpcXHRcXHQgKiAgIGFmdGVyIGJvb3Q6XFxuMTA2NTpcXHRcXHQgKiAgICAgICBbICB6b25lIHNwYW4gIF1cXG4xMDY2OlxcdFxcdCAqICAgICAgIFsgICB6b25lIHBhZ2VzICAgXVxcbjEwNjc6XFx0XFx0ICogICAgICAgc3Bhbm5lZD0xMCwgaW5pdGlhbGl6ZWQ9MTUsIG9ubGluZT0xMFxcbjEwNjg6XFx0XFx0ICogICAgICAgb25saW5lID09IHNwYW5uZWQgIC1cXHUwMDNlICBjb250aWd1b3VzXFxuMTA2OTpcXHRcXHQgKlxcbjEwNzA6XFx0XFx0ICogICBncm93aW5nIGFmdGVyIGhvdHBsdWcgKGhvdHBsdWcgNSk6XFxuMTA3MTpcXHRcXHQgKiAgICAgICBbICB6b25lIHNwYW4gICAgICAgICAgICAgICAgICAgICAgICAgIF1cXG4xMDcyOlxcdFxcdCAqICAgICAgIFsgICB6b25lIHBhZ2VzICAgXSAgIFsgICB6b25lIHBhZ2VzICAgXVxcbjEwNzM6XFx0XFx0ICogICAgICAgc3Bhbm5lZD0zMCwgaW5pdGlhbGl6ZWQ9MjAsIG9ubGluZT0xNVxcbjEwNzQ6XFx0XFx0ICogICAgICAgb25saW5lICE9IHNwYW5uZWQgIC1cXHUwMDNlICBub3QgY29udGlndW91c1xcbjEwNzU6XFx0XFx0ICpcXG4xMDc2OlxcdFxcdCAqICAgc2hyaW5raW5nIGFmdGVyIGhvdHVucGx1ZyAoaG90dW5wbHVnIDUgYWdhaW4pOlxcbjEwNzc6XFx0XFx0ICogICAgICAgWyAgem9uZSBzcGFuICAgICBdXFxuMTA3ODpcXHRcXHQgKiAgICAgICBbICAgem9uZSBwYWdlcyAgIF1cXG4xMDc5OlxcdFxcdCAqICAgICAgIHNwYW5uZWQ9MTUsIGluaXRpYWxpemVkPTE1LCBvbmxpbmU9MTBcXG4xMDgwOlxcdFxcdCAqICAgICAgIG9ubGluZSAhPSBzcGFubmVkICAtXFx1MDAzZSAgbm90IGNvbnRpZ3VvdXMgYWx0aG91Z2ggY29udGlndW91c1xcbjEwODE6XFx0XFx0ICpcXG4xMDgyOlxcdFxcdCAqIFNvIHByZXNlbnRfcGFnZXMgbWF5IGJlIHVzZWQgYnkgbWVtb3J5IGhvdHBsdWcgb3IgbWVtb3J5IHBvd2VyXFxuMTA4MzpcXHRcXHQgKiBtYW5hZ2VtZW50IGxvZ2ljIHRvIGZpZ3VyZSBvdXQgdW5tYW5hZ2VkIHBhZ2VzIGJ5IGNoZWNraW5nXFxuMTA4NDpcXHRcXHQgKiAocHJlc2VudF9wYWdlcyAtIG1hbmFnZWRfcGFnZXMpLiBBbmQgbWFuYWdlZF9wYWdlcyBzaG91bGQgYmUgdXNlZFxcbjEwODU6XFx0XFx0ICogYnkgcGFnZSBhbGxvY2F0b3IgYW5kIHZtIHNjYW5uZXIgdG8gY2FsY3VsYXRlIGFsbCBraW5kcyBvZiB3YXRlcm1hcmtzXFxuMTA4NjpcXHRcXHQgKiBhbmQgdGhyZXNob2xkcy5cXG4xMDg3OlxcdFxcdCAqXFxuMTA4ODpcXHRcXHQgKiBMb2NraW5nIHJ1bGVzOlxcbjEwODk6XFx0XFx0ICpcXG4xMDkwOlxcdFxcdCAqIHpvbmVfc3RhcnRfcGZuIGFuZCBzcGFubmVkX3BhZ2VzIGFyZSBwcm90ZWN0ZWQgYnkgc3Bhbl9zZXFsb2NrLlxcbjEwOTE6XFx0XFx0ICogSXQgaXMgYSBzZXFsb2NrIGJlY2F1c2UgaXQgaGFzIHRvIGJlIHJlYWQgb3V0c2lkZSBvZiB6b25lLVxcdTAwM2Vsb2NrLFxcbjEwOTI6XFx0XFx0ICogYW5kIGl0IGlzIGRvbmUgaW4gdGhlIG1haW4gYWxsb2NhdG9yIHBhdGguICBCdXQsIGl0IGlzIHdyaXR0ZW5cXG4xMDkzOlxcdFxcdCAqIHF1aXRlIGluZnJlcXVlbnRseS5cXG4xMDk0OlxcdFxcdCAqXFxuMTA5NTpcXHRcXHQgKiBUaGUgc3Bhbl9zZXEgbG9jayBpcyBkZWNsYXJlZCBhbG9uZyB3aXRoIHpvbmUtXFx1MDAzZWxvY2sgYmVjYXVzZSBpdCBpc1xcbjEwOTY6XFx0XFx0ICogZnJlcXVlbnRseSByZWFkIGluIHByb3hpbWl0eSB0byB6b25lLVxcdTAwM2Vsb2NrLiAgSXQncyBnb29kIHRvXFxuMTA5NzpcXHRcXHQgKiBnaXZlIHRoZW0gYSBjaGFuY2Ugb2YgYmVpbmcgaW4gdGhlIHNhbWUgY2FjaGVsaW5lLlxcbjEwOTg6XFx0XFx0ICpcXG4xMDk5OlxcdFxcdCAqIFdyaXRlIGFjY2VzcyB0byBwcmVzZW50X3BhZ2VzIGF0IHJ1bnRpbWUgc2hvdWxkIGJlIHByb3RlY3RlZCBieVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xNFQwNzo1Mjo1OS44MDE4MjY1NzFaIiwiU2VxIjo2NywiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjgtZmxhc2giLCJEdXJhdGlvbiI6NTgxMjQ4NDE4NywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IHRha2Ugb24gdGhvc2UgbGluZXMgaW4gYGluY2x1ZGUvbGludXgvbW16b25lLmhgOlxuXG4qKkRpdmluZyBpbnRvIG1tem9uZS5oOiBBIFF1aWNrIFNjYW4gb2YgTGluZXMgMTEwMC0xMTMwKipcblxuQWxyaWdodCwgbGV0J3MgemVybyBpbiBvbiB0aG9zZSBsaW5lcywgMTEwMCB0byAxMTMwIGluIGBpbmNsdWRlL2xpbnV4L21tem9uZS5oYC4gSSdtIGltbWVkaWF0ZWx5IGV4cGVjdGluZyB0byBmaW5kIHNvbWV0aGluZyBmdW5kYW1lbnRhbCwgcHJvYmFibHkgYSBjb3JlIHN0cnVjdHVyZSBvciBzb21lIGtleSBkZWZpbml0aW9ucyByZWxhdGVkIHRvIG1lbW9yeSBtYW5hZ2VtZW50IHpvbmVzLiBHaXZlbiB0aGUgY29udGV4dCwgSSdkIHdhZ2VyIGl0IGhhcyBzb21ldGhpbmcgdG8gZG8gd2l0aCBob3cgdGhlIGtlcm5lbCBvcmdhbml6ZXMgcGh5c2ljYWwgbWVtb3J5LCBtYXliZSBkZWxpbmVhdGluZyBkaWZmZXJlbnQgbWVtb3J5IHR5cGVzIG9yIHJlZ2lvbnMuIEknbSBnb2luZyB0byBxdWlja2x5IHBhcnNlIHRoZSBjb2RlIGluIG15IGhlYWQsIGxvb2tpbmcgZm9yIHRoZSB1c3VhbCBzdXNwZWN0czogbWVtb3J5IG5vZGUgc3RydWN0dXJlcywgTlVNQS1yZWxhdGVkIGRlY2xhcmF0aW9ucywgbWF5YmUgc29tZSBgc3RydWN0IHBhZ2VgIGV4dGVuc2lvbnMgcmVsZXZhbnQgdG8gdGhpcyB6b25lLiBJJ2xsIGJlIHdhdGNoaW5nIG91dCBmb3IgdGhpbmdzIGxpa2UgcGVyLXpvbmUgc3RhdGlzdGljcywgZnJlZSBsaXN0cywgb3IgYW55IGZsYWdzIHRoYXQgZGVub3RlIHRoZSB6b25lJ3Mgc3RhdHVzLiBJJ2xsIGFsc28gdHJ5IHRvIGdhdWdlIHRoZSBwdXJwb3NlIG9mIHRob3NlIHNwZWNpZmljIGxpbmVzIGluIHRlcm1zIG9mIHRoZSBiaWdnZXIgcGljdHVyZSBvZiBtZW1vcnkgbWFuYWdlbWVudC4gV2hhdCBwcm9ibGVtIHdlcmUgdGhlIGtlcm5lbCBkZXZlbG9wZXJzIHRyeWluZyB0byBzb2x2ZSBhdCB0aGlzIHNwZWNpZmljIHBvaW50PyBIb3BlZnVsbHksIEkgd2lsbCBzZWUgZW5vdWdoIGNvbnRleHQgdG8gZ2FpbiBpbnNpZ2h0IGludG8gaG93IHRoYXQgaW1wYWN0cyB0aGUgb3ZlcmFsbCBtZW1vcnkgaGFuZGxpbmcgc3RyYXRlZ2llcy5cblxuXG4iLCJJbnB1dFRva2VucyI6MjE4MTMsIk91dHB1dFRva2VucyI6MzcsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoyNiwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTE0VDA3OjUzOjA1LjYxNDMxMzM5OVoiLCJTZXEiOjY4LCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNzU2MDAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwiaW5jbHVkZS9saW51eC9tbXpvbmUuaFwiLFxuICBcIkZpcnN0TGluZVwiOiAxMTAwLFxuICBcIkxpbmVDb3VudFwiOiAzMFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIxMTAwOlxcdFxcdCAqIG1lbV9ob3RwbHVnX2JlZ2luL2RvbmUoKS4gQW55IHJlYWRlciB3aG8gY2FuJ3QgdG9sZXJhbnQgZHJpZnQgb2ZcXG4xMTAxOlxcdFxcdCAqIHByZXNlbnRfcGFnZXMgc2hvdWxkIHVzZSBnZXRfb25saW5lX21lbXMoKSB0byBnZXQgYSBzdGFibGUgdmFsdWUuXFxuMTEwMjpcXHRcXHQgKi9cXG4xMTAzOlxcdFxcdGF0b21pY19sb25nX3RcXHRcXHRtYW5hZ2VkX3BhZ2VzO1xcbjExMDQ6XFx0XFx0dW5zaWduZWQgbG9uZ1xcdFxcdHNwYW5uZWRfcGFnZXM7XFxuMTEwNTpcXHRcXHR1bnNpZ25lZCBsb25nXFx0XFx0cHJlc2VudF9wYWdlcztcXG4xMTA2OlxcdFxcdHVuc2lnbmVkIGxvbmdcXHRcXHRwYWdlc193aXRoX29ubGluZV9tZW1tYXA7XFxuMTEwNzpcXHQjaWYgZGVmaW5lZChDT05GSUdfTUVNT1JZX0hPVFBMVUcpXFxuMTEwODpcXHRcXHR1bnNpZ25lZCBsb25nXFx0XFx0cHJlc2VudF9lYXJseV9wYWdlcztcXG4xMTA5OlxcdCNlbmRpZlxcbjExMTA6XFx0I2lmZGVmIENPTkZJR19DTUFcXG4xMTExOlxcdFxcdHVuc2lnbmVkIGxvbmdcXHRcXHRjbWFfcGFnZXM7XFxuMTExMjpcXHQjZW5kaWZcXG4xMTEzOlxcdFxcbjExMTQ6XFx0XFx0Y29uc3QgY2hhclxcdFxcdCpuYW1lO1xcbjExMTU6XFx0XFxuMTExNjpcXHQjaWZkZWYgQ09ORklHX01FTU9SWV9JU09MQVRJT05cXG4xMTE3OlxcdFxcdC8qXFxuMTExODpcXHRcXHQgKiBOdW1iZXIgb2YgaXNvbGF0ZWQgcGFnZWJsb2NrLiBJdCBpcyB1c2VkIHRvIHNvbHZlIGluY29ycmVjdFxcbjExMTk6XFx0XFx0ICogZnJlZXBhZ2UgY291bnRpbmcgcHJvYmxlbSBkdWUgdG8gcmFjeSByZXRyaWV2aW5nIG1pZ3JhdGV0eXBlXFxuMTEyMDpcXHRcXHQgKiBvZiBwYWdlYmxvY2suIFByb3RlY3RlZCBieSB6b25lLVxcdTAwM2Vsb2NrLlxcbjExMjE6XFx0XFx0ICovXFxuMTEyMjpcXHRcXHR1bnNpZ25lZCBsb25nXFx0XFx0bnJfaXNvbGF0ZV9wYWdlYmxvY2s7XFxuMTEyMzpcXHQjZW5kaWZcXG4xMTI0OlxcdFxcbjExMjU6XFx0I2lmZGVmIENPTkZJR19NRU1PUllfSE9UUExVR1xcbjExMjY6XFx0XFx0Lyogc2VlIHNwYW5uZWQvcHJlc2VudF9wYWdlcyBmb3IgbW9yZSBkZXNjcmlwdGlvbiAqL1xcbjExMjc6XFx0XFx0c2VxbG9ja190XFx0XFx0c3Bhbl9zZXFsb2NrO1xcbjExMjg6XFx0I2VuZGlmXFxuMTEyOTpcXHRcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTRUMDc6NTM6MDUuNjE0NDkxOTI5WiIsIlNlcSI6NjksIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy44LWZsYXNoIiwiRHVyYXRpb24iOjMwOTExNzQ5MTAxLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgYSBzdW1tYXJ5IG9mIG15IHRob3VnaHQgcHJvY2VzczpcblxuKipEaXZpbmcgaW50byBab25lIENvbnRpZ3VpdHkqKlxuXG5Pa2F5LCBzbyBJJ20gbG9va2luZyBhdCBgem9uZS1cdTAwM2Vjb250aWd1b3VzYC4gTXkgaW1tZWRpYXRlIHRob3VnaHQgaXMsIFwiV2hlcmUgZXhhY3RseSBpcyB0aGlzIGRlZmluZWQgd2l0aGluIHRoZSBgc3RydWN0IHpvbmVgP1wiIEkga25vdyB0aGUgY29uY2VwdCwgb2YgY291cnNlLCBidXQgSSBuZWVkIHRvIHF1aWNrbHkgcmVmcmVzaCBteSBtZW1vcnkgb24gdGhlIHByZWNpc2UgZGVjbGFyYXRpb24gd2l0aGluIHRoZSBkYXRhIHN0cnVjdHVyZS4gSXQncyB0aW1lIHRvIHRyYWNlIHRoZSBjb2RlIGFuZCBwaW5wb2ludCBpdHMgbG9jYXRpb24gZm9yIGNvbnRleHQuIFVuZGVyc3RhbmRpbmcgaXRzIGRlY2xhcmF0aW9uIGlzIGNydWNpYWwgZm9yIGFueSBkZWVwZXIgYW5hbHlzaXMgb3IgZGVidWdnaW5nIEkgbWlnaHQgbmVlZCB0byBkby5cblxuXG4iLCJJbnB1dFRva2VucyI6MjI1NzQsIk91dHB1dFRva2VucyI6MjksIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxNywiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTE0VDA3OjUzOjM2LjUyNjI0NDc1WiIsIlNlcSI6NzAsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo2MDE1MjQzOSwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJjb250aWd1b3VzXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcImluY2x1ZGUvbGludXgvbW16b25lLmhcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiaW5jbHVkZS9saW51eC9tbXpvbmUuaC03My0gKiBPbmx5IHBhZ2VzIHdpdGhpbiBhIHNpbmdsZSBtZW1vcnkgc2VjdGlvbiBhcmUgZ3VhcmFudGVlZCB0byBiZVxcbmluY2x1ZGUvbGludXgvbW16b25lLmg6NzQ6ICogY29udGlndW91cy4gQnkgbGltaXRpbmcgZm9saW9zIHRvIGEgc2luZ2xlIG1lbW9yeSBzZWN0aW9uLCBhbGwgZm9saW9cXG5pbmNsdWRlL2xpbnV4L21tem9uZS5oOjc1OiAqIHBhZ2VzIGFyZSBndWFyYW50ZWVkIHRvIGJlIGNvbnRpZ3VvdXMuXFxuaW5jbHVkZS9saW51eC9tbXpvbmUuaC03Ni0gKi9cXG4tLVxcbmluY2x1ZGUvbGludXgvbW16b25lLmg9OTc5PXN0cnVjdCB6b25lIHtcXG4tLVxcbmluY2x1ZGUvbGludXgvbW16b25lLmgtMTA1OS1cXHQgKiBtYXkgcmVzdWx0IGluIGEgXFxcInRvbyBzbWFsbFxcXCIgdmFsdWUuIFRoaXMgaXMgc2FmZTogaXQgbWVyZWx5XFxuaW5jbHVkZS9saW51eC9tbXpvbmUuaDoxMDYwOlxcdCAqIHByZXZlbnRzIGRldGVjdGluZyBhIGNvbnRpZ3VvdXMgem9uZS5cXG5pbmNsdWRlL2xpbnV4L21tem9uZS5oLTEwNjEtXFx0ICpcXG4tLVxcbmluY2x1ZGUvbGludXgvbW16b25lLmgtMTA2Ny1cXHQgKiAgICAgICBzcGFubmVkPTEwLCBpbml0aWFsaXplZD0xNSwgb25saW5lPTEwXFxuaW5jbHVkZS9saW51eC9tbXpvbmUuaDoxMDY4OlxcdCAqICAgICAgIG9ubGluZSA9PSBzcGFubmVkICAtXFx1MDAzZSAgY29udGlndW91c1xcbmluY2x1ZGUvbGludXgvbW16b25lLmgtMTA2OS1cXHQgKlxcbi0tXFxuaW5jbHVkZS9saW51eC9tbXpvbmUuaC0xMDczLVxcdCAqICAgICAgIHNwYW5uZWQ9MzAsIGluaXRpYWxpemVkPTIwLCBvbmxpbmU9MTVcXG5pbmNsdWRlL2xpbnV4L21tem9uZS5oOjEwNzQ6XFx0ICogICAgICAgb25saW5lICE9IHNwYW5uZWQgIC1cXHUwMDNlICBub3QgY29udGlndW91c1xcbmluY2x1ZGUvbGludXgvbW16b25lLmgtMTA3NS1cXHQgKlxcbi0tXFxuaW5jbHVkZS9saW51eC9tbXpvbmUuaC0xMDc5LVxcdCAqICAgICAgIHNwYW5uZWQ9MTUsIGluaXRpYWxpemVkPTE1LCBvbmxpbmU9MTBcXG5pbmNsdWRlL2xpbnV4L21tem9uZS5oOjEwODA6XFx0ICogICAgICAgb25saW5lICE9IHNwYW5uZWQgIC1cXHUwMDNlICBub3QgY29udGlndW91cyBhbHRob3VnaCBjb250aWd1b3VzXFxuaW5jbHVkZS9saW51eC9tbXpvbmUuaC0xMDgxLVxcdCAqXFxuLS1cXG5pbmNsdWRlL2xpbnV4L21tem9uZS5oLTExOTAtXFxuaW5jbHVkZS9saW51eC9tbXpvbmUuaDoxMTkxOlxcdGJvb2xcXHRcXHRcXHRjb250aWd1b3VzO1xcbmluY2x1ZGUvbGludXgvbW16b25lLmgtMTE5Mi1cXG4tLVxcbmluY2x1ZGUvbGludXgvbW16b25lLmg9MTcyOD1zdGF0aWMgaW5saW5lIGJvb2wgem9uZV9pc196b25lX2RldmljZShjb25zdCBzdHJ1Y3Qgem9uZSAqem9uZSlcXG4tLVxcbmluY2x1ZGUvbGludXgvbW16b25lLmgtMTczNC0vKipcXG5pbmNsdWRlL2xpbnV4L21tem9uZS5oOjE3MzU6ICogem9uZV9pc19jb250aWd1b3VzIC0gdGVzdCB3aGV0aGVyIGEgem9uZSBpcyBjb250aWd1b3VzXFxuaW5jbHVkZS9saW51eC9tbXpvbmUuaC0xNzM2LSAqIEB6b25lOiB0aGUgem9uZSB0byB0ZXN0LlxcbmluY2x1ZGUvbGludXgvbW16b25lLmgtMTczNy0gKlxcbmluY2x1ZGUvbGludXgvbW16b25lLmg6MTczODogKiBJbiBhIGNvbnRpZ3VvdXMgem9uZSwgaXQgaXMgdmFsaWQgdG8gY2FsbCBwZm5fdG9fcGFnZSgpIG9uIGFueSBQRk4gaW4gdGhlXFxuaW5jbHVkZS9saW51eC9tbXpvbmUuaC0xNzM5LSAqIHNwYW5uZWQgem9uZSB3aXRob3V0IHJlcXVpcmluZyBwZm5fdmFsaWQoKSBvciBwZm5fdG9fb25saW5lX3BhZ2UoKSBjaGVja3MuXFxuLS1cXG5pbmNsdWRlL2xpbnV4L21tem9uZS5oLTE3NDMtICpcXG5pbmNsdWRlL2xpbnV4L21tem9uZS5oOjE3NDQ6ICogWk9ORV9ERVZJQ0Ugem9uZXMgYXJlIGFsd2F5cyBtYXJrZWQgbm9uLWNvbnRpZ3VvdXMuXFxuaW5jbHVkZS9saW51eC9tbXpvbmUuaC0xNzQ1LSAqXFxuaW5jbHVkZS9saW51eC9tbXpvbmUuaDoxNzQ2OiAqIFJldHVybjogdHJ1ZSBpZiBjb250aWd1b3VzLCBvdGhlcndpc2UgZmFsc2UuXFxuaW5jbHVkZS9saW51eC9tbXpvbmUuaC0xNzQ3LSAqL1xcbmluY2x1ZGUvbGludXgvbW16b25lLmg6MTc0ODpzdGF0aWMgaW5saW5lIGJvb2wgem9uZV9pc19jb250aWd1b3VzKGNvbnN0IHN0cnVjdCB6b25lICp6b25lKVxcbmluY2x1ZGUvbGludXgvbW16b25lLmgtMTc0OS17XFxuaW5jbHVkZS9saW51eC9tbXpvbmUuaDoxNzUwOlxcdHJldHVybiBSRUFEX09OQ0Uoem9uZS1cXHUwMDNlY29udGlndW91cyk7XFxuaW5jbHVkZS9saW51eC9tbXpvbmUuaC0xNzUxLX1cXG5pbmNsdWRlL2xpbnV4L21tem9uZS5oLTE3NTItXFxuaW5jbHVkZS9saW51eC9tbXpvbmUuaDoxNzUzOnN0YXRpYyBpbmxpbmUgdm9pZCBzZXRfem9uZV9jb250aWd1b3VzKHN0cnVjdCB6b25lICp6b25lKVxcbmluY2x1ZGUvbGludXgvbW16b25lLmgtMTc1NC17XFxuLS1cXG5pbmNsdWRlL2xpbnV4L21tem9uZS5oLTE3NTctXFx0aWYgKHpvbmUtXFx1MDAzZXNwYW5uZWRfcGFnZXMgPT0gem9uZS1cXHUwMDNlcGFnZXNfd2l0aF9vbmxpbmVfbWVtbWFwKVxcbmluY2x1ZGUvbGludXgvbW16b25lLmg6MTc1ODpcXHRcXHRXUklURV9PTkNFKHpvbmUtXFx1MDAzZWNvbnRpZ3VvdXMsIHRydWUpO1xcbmluY2x1ZGUvbGludXgvbW16b25lLmgtMTc1OS19XFxuaW5jbHVkZS9saW51eC9tbXpvbmUuaC0xNzYwLVxcbmluY2x1ZGUvbGludXgvbW16b25lLmg6MTc2MTpzdGF0aWMgaW5saW5lIHZvaWQgY2xlYXJfem9uZV9jb250aWd1b3VzKHN0cnVjdCB6b25lICp6b25lKVxcbmluY2x1ZGUvbGludXgvbW16b25lLmgtMTc2Mi17XFxuaW5jbHVkZS9saW51eC9tbXpvbmUuaDoxNzYzOlxcdFdSSVRFX09OQ0Uoem9uZS1cXHUwMDNlY29udGlndW91cywgZmFsc2UpO1xcbmluY2x1ZGUvbGludXgvbW16b25lLmgtMTc2NC19XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTE0VDA3OjUzOjM2LjU4NjQwNDg5OVoiLCJTZXEiOjcxLCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuOC1mbGFzaCIsIkR1cmF0aW9uIjo0ODcyMzQ0OTExLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyB0aGUgYHN0cnVjdCB6b25lYCBJbml0aWFsaXphdGlvbiBQcm9jZXNzKipcblxuT2theSwgc28gSSdtIHRoaW5raW5nIGFib3V0IGhvdyB0aGUgYHN0cnVjdCB6b25lYCBzdHJ1Y3R1cmUgZ2V0cyBpbml0aWFsaXplZCB3aXRoaW4gdGhlIExpbnV4IGtlcm5lbC4gRnJvbSB3aGF0IEkgcmVjYWxsLCBhbmQgSSdtIHByZXR0eSBzdXJlIHRoaXMgaXMgcmlnaHQsIGl0J3Mgc3RhdGljYWxseSBhbGxvY2F0ZWQsIG9yIGF0IGxlYXN0IGFsbG9jYXRlZCB2ZXJ5IGVhcmx5IG9uIGR1cmluZyB0aGUgYm9vdCBwcm9jZXNzLiBJdCdzIGFsbG9jYXRlZCBvbiBhIHBlci1ub2RlIGJhc2lzLCB0eXBpY2FsbHkgaW4gc29tZXRoaW5nIGxpa2UgYGZyZWVfYXJlYV9pbml0X2NvcmVgLCBhbmQgSSBiZWxpZXZlIHRoaXMgaXMgZG9uZSB3aXRoIGBtZW1ibG9ja2Agb3IgcGVyaGFwcyBzdGF0aWMgQlNTLCBvciBtYXliZSBgYWxsb2NfYm9vdG1lbWAgb3IgYGt6YWxsb2NgLiBUaGF0IHN1Z2dlc3RzIGl0J3MgbGlrZWx5IHplcm8taW5pdGlhbGl6ZWQsIGRvZXNuJ3QgaXQ/IExldCBtZSBqdXN0IGRvdWJsZS1jaGVjayB0aGF0IGBwYWdlc193aXRoX29ubGluZV9tZW1tYXBgLCB3aGljaCBJIGtub3cgaXMgYW4gYHVuc2lnbmVkIGxvbmdgIGluIGBpbmNsdWRlL2xpbnV4L21tem9uZS5oYCwgaXMgaW5pdGlhbGl6ZWQgY29ycmVjdGx5LiBUbyBjb25maXJtIHRoZSB6ZXJvLWluaXRpYWxpemF0aW9uLCBJIHJlYWxseSBzaG91bGQgZ28gYW5kIGxvb2sgYXQgYGZyZWVfYXJlYV9pbml0X2NvcmVgIGRpcmVjdGx5LCBvciB3aGVyZXZlciB6b25lcyBhcmUgYWN0dWFsbHkgaW5pdGlhbGl6ZWQuIFRoYXQncyB0aGUga2V5IHNwb3QgdG8gdmVyaWZ5IGhvdyB0aGUgaW5pdGlhbCB2YWx1ZXMgYXJlIHNldC5cblxuXG4iLCJJbnB1dFRva2VucyI6MjM4MzQsIk91dHB1dFRva2VucyI6MjQsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxMjcsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMTRUMDc6NTM6NDEuNDU4NzUzNThaIiwiU2VxIjo3MiwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjIzNTkzODYzMTYsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiem9uZS1cXHUwMDNlcGFnZXNfd2l0aF9vbmxpbmVfbWVtbWFwXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImluY2x1ZGUvbGludXgvbW16b25lLmg9MTc1Mz1zdGF0aWMgaW5saW5lIHZvaWQgc2V0X3pvbmVfY29udGlndW91cyhzdHJ1Y3Qgem9uZSAqem9uZSlcXG4tLVxcbmluY2x1ZGUvbGludXgvbW16b25lLmgtMTc1Ni1cXHRcXHRyZXR1cm47XFxuaW5jbHVkZS9saW51eC9tbXpvbmUuaDoxNzU3OlxcdGlmICh6b25lLVxcdTAwM2VzcGFubmVkX3BhZ2VzID09IHpvbmUtXFx1MDAzZXBhZ2VzX3dpdGhfb25saW5lX21lbW1hcClcXG5pbmNsdWRlL2xpbnV4L21tem9uZS5oLTE3NTgtXFx0XFx0V1JJVEVfT05DRSh6b25lLVxcdTAwM2Vjb250aWd1b3VzLCB0cnVlKTtcXG4tLVxcbm1tL21lbW9yeV9ob3RwbHVnLmM9MTA0NT12b2lkIGFkanVzdF9wcmVzZW50X3BhZ2VfY291bnQoc3RydWN0IHBhZ2UgKnBhZ2UsIHN0cnVjdCBtZW1vcnlfZ3JvdXAgKmdyb3VwLFxcbi0tXFxubW0vbWVtb3J5X2hvdHBsdWcuYy0xMDU3LVxcdHpvbmUtXFx1MDAzZXByZXNlbnRfcGFnZXMgKz0gbnJfcGFnZXM7XFxubW0vbWVtb3J5X2hvdHBsdWcuYzoxMDU4OlxcdHpvbmUtXFx1MDAzZXBhZ2VzX3dpdGhfb25saW5lX21lbW1hcCArPSBucl9wYWdlcztcXG5tbS9tZW1vcnlfaG90cGx1Zy5jLTEwNTktXFx0em9uZS1cXHUwMDNlem9uZV9wZ2RhdC1cXHUwMDNlbm9kZV9wcmVzZW50X3BhZ2VzICs9IG5yX3BhZ2VzO1xcbi0tXFxubW0vbW1faW5pdC5jPTkzMj1zdGF0aWMgdm9pZCBfX2luaXQgbWVtbWFwX2luaXRfem9uZV9yYW5nZShzdHJ1Y3Qgem9uZSAqem9uZSxcXG4tLVxcbm1tL21tX2luaXQuYy05NDktXFx0XFx0XFx0ICBmYWxzZSk7XFxubW0vbW1faW5pdC5jOjk1MDpcXHR6b25lLVxcdTAwM2VwYWdlc193aXRoX29ubGluZV9tZW1tYXAgKz0gZW5kX3BmbiAtIHN0YXJ0X3BmbjtcXG5tbS9tbV9pbml0LmMtOTUxLVxcbi0tXFxubW0vbW1faW5pdC5jLTk2Mi1cXHRcXHRcXHRcXHRcXHQgICAgICAgem9uZV9pZCwgbmlkKTtcXG5tbS9tbV9pbml0LmM6OTYzOlxcdFxcdHpvbmUtXFx1MDAzZXBhZ2VzX3dpdGhfb25saW5lX21lbW1hcCArPSBwZ2NudDtcXG5tbS9tbV9pbml0LmMtOTY0LVxcdH1cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTRUMDc6NTM6NDMuODE4MTQ3ODY2WiIsIlNlcSI6NzMsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy44LWZsYXNoIiwiRHVyYXRpb24iOjM3NjQ1MjY5MTcsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGxldCdzIGRpdmUgaW50byB0aGlzLiBIZXJlJ3MgaG93IEknZCBhcHByb2FjaCB0aGlzIHByb2JsZW06XG5cbioqRXhhbWluaW5nIE9mZmxpbmUgUGFnZSBDb3VudCBBZGp1c3RtZW50KipcblxuQWxyaWdodCwgSSBuZWVkIHRvIGZpZ3VyZSBvdXQgaG93IHBhZ2UgY291bnRzIGFyZSBoYW5kbGVkIHdoZW4gYSBtZW1vcnkgbm9kZSBnb2VzIG9mZmxpbmUuIE15IGluaXRpYWwgdGhvdWdodCBpcywgZG9lcyB0aGUgYGFkanVzdF9wcmVzZW50X3BhZ2VfY291bnRgIGZ1bmN0aW9uLCB3aGljaCBJIHJlbWVtYmVyIGZyb20gdGhlIG1lbW9yeSBob3RwbHVnIGNvZGUsIGFjdHVhbGx5IGFkZHJlc3MgdGhlIG9mZmxpbmUgc2NlbmFyaW8/IEl0IHNlZW1zIGxpa2UgaXQgc2hvdWxkLCBidXQgbGV0J3MgYmUgc3VyZS4gVGltZSB0byBkaWcgaW50byB0aGUgc291cmNlLiBJJ2xsIG5lZWQgdG8gbG9jYXRlIGBhZGp1c3RfcHJlc2VudF9wYWdlX2NvdW50YC4gSWYgSSByZWNhbGwgY29ycmVjdGx5LCBpdCdzIGRlZmluZWQgaW4gYG1tL21lbW9yeV9ob3RwbHVnLmNgLiBMZXQncyBjb25maXJtIGFuZCBzZWUgd2hhdCdzIGFjdHVhbGx5IGhhcHBlbmluZyB1bmRlciB0aGUgaG9vZC4gSSBleHBlY3QgdG8gZmluZCB0aGUgbWVhdCBvZiB0aGUgbWVtb3J5IG1hbmFnZW1lbnQgbG9naWMgcmVsYXRlZCB0byBvZmZsaW5lIG9wZXJhdGlvbnMgdGhlcmUuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjI0NjMwLCJPdXRwdXRUb2tlbnMiOjM3LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NTEsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMTRUMDc6NTM6NDcuNTgyNjc3NDYzWiIsIlNlcSI6NzQsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE0OTc2MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJtbS9tZW1vcnlfaG90cGx1Zy5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDEwNDUsXG4gIFwiTGluZUNvdW50XCI6IDM1XG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIjEwNDU6XFx0dm9pZCBhZGp1c3RfcHJlc2VudF9wYWdlX2NvdW50KHN0cnVjdCBwYWdlICpwYWdlLCBzdHJ1Y3QgbWVtb3J5X2dyb3VwICpncm91cCxcXG4xMDQ2OlxcdFxcdFxcdFxcdCAgICAgICBsb25nIG5yX3BhZ2VzKVxcbjEwNDc6XFx0e1xcbjEwNDg6XFx0XFx0c3RydWN0IHpvbmUgKnpvbmUgPSBwYWdlX3pvbmUocGFnZSk7XFxuMTA0OTpcXHRcXHRjb25zdCBib29sIG1vdmFibGUgPSB6b25lX2lkeCh6b25lKSA9PSBaT05FX01PVkFCTEU7XFxuMTA1MDpcXHRcXG4xMDUxOlxcdFxcdC8qXFxuMTA1MjpcXHRcXHQgKiBXZSBvbmx5IHN1cHBvcnQgb25saW5pbmcvb2ZmbGluaW5nL2FkZGluZy9yZW1vdmluZyBvZiBjb21wbGV0ZVxcbjEwNTM6XFx0XFx0ICogbWVtb3J5IGJsb2NrczsgdGhlcmVmb3JlLCBlaXRoZXIgYWxsIGlzIGVpdGhlciBlYXJseSBvciBob3RwbHVnZ2VkLlxcbjEwNTQ6XFx0XFx0ICovXFxuMTA1NTpcXHRcXHRpZiAoZWFybHlfc2VjdGlvbihfX3Bmbl90b19zZWN0aW9uKHBhZ2VfdG9fcGZuKHBhZ2UpKSkpXFxuMTA1NjpcXHRcXHRcXHR6b25lLVxcdTAwM2VwcmVzZW50X2Vhcmx5X3BhZ2VzICs9IG5yX3BhZ2VzO1xcbjEwNTc6XFx0XFx0em9uZS1cXHUwMDNlcHJlc2VudF9wYWdlcyArPSBucl9wYWdlcztcXG4xMDU4OlxcdFxcdHpvbmUtXFx1MDAzZXBhZ2VzX3dpdGhfb25saW5lX21lbW1hcCArPSBucl9wYWdlcztcXG4xMDU5OlxcdFxcdHpvbmUtXFx1MDAzZXpvbmVfcGdkYXQtXFx1MDAzZW5vZGVfcHJlc2VudF9wYWdlcyArPSBucl9wYWdlcztcXG4xMDYwOlxcdFxcbjEwNjE6XFx0XFx0aWYgKGdyb3VwIFxcdTAwMjZcXHUwMDI2IG1vdmFibGUpXFxuMTA2MjpcXHRcXHRcXHRncm91cC1cXHUwMDNlcHJlc2VudF9tb3ZhYmxlX3BhZ2VzICs9IG5yX3BhZ2VzO1xcbjEwNjM6XFx0XFx0ZWxzZSBpZiAoZ3JvdXAgXFx1MDAyNlxcdTAwMjYgIW1vdmFibGUpXFxuMTA2NDpcXHRcXHRcXHRncm91cC1cXHUwMDNlcHJlc2VudF9rZXJuZWxfcGFnZXMgKz0gbnJfcGFnZXM7XFxuMTA2NTpcXHR9XFxuMTA2NjpcXHRcXG4xMDY3OlxcdGludCBtaHBfaW5pdF9tZW1tYXBfb25fbWVtb3J5KHVuc2lnbmVkIGxvbmcgcGZuLCB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzLFxcbjEwNjg6XFx0XFx0XFx0XFx0ICAgICAgc3RydWN0IHpvbmUgKnpvbmUpXFxuMTA2OTpcXHR7XFxuMTA3MDpcXHRcXHR1bnNpZ25lZCBsb25nIGVuZF9wZm4gPSBwZm4gKyBucl9wYWdlcztcXG4xMDcxOlxcdFxcdGludCByZXQsIGk7XFxuMTA3MjpcXHRcXG4xMDczOlxcdFxcdHJldCA9IGthc2FuX2FkZF96ZXJvX3NoYWRvdyhfX3ZhKFBGTl9QSFlTKHBmbikpLCBQRk5fUEhZUyhucl9wYWdlcykpO1xcbjEwNzQ6XFx0XFx0aWYgKHJldClcXG4xMDc1OlxcdFxcdFxcdHJldHVybiByZXQ7XFxuMTA3NjpcXHRcXG4xMDc3OlxcdFxcdG1vdmVfcGZuX3JhbmdlX3RvX3pvbmUoem9uZSwgcGZuLCBucl9wYWdlcywgTlVMTCwgTUlHUkFURV9VTk1PVkFCTEUsXFxuMTA3ODpcXHRcXHRcXHRcXHQgICAgICAgZmFsc2UpO1xcbjEwNzk6XFx0XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTE0VDA3OjUzOjQ3LjU4MjgzMDMxM1oiLCJTZXEiOjc1LCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuOC1mbGFzaCIsIkR1cmF0aW9uIjo4MTY4MjUyMjQ0LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyBNZW1vcnkgSG90cGx1ZyBhbmQgT2ZmbGluaW5nIE1lY2hhbmljcyoqXG5cbk9rYXksIHNvIEknbSBkaXZpbmcgaW50byBob3cgdGhlIGtlcm5lbCBoYW5kbGVzIG1lbW9yeSBob3RwbHVnIGFuZCBvZmZsaW5pbmcsIHBhcnRpY3VsYXJseSBmb2N1c2luZyBvbiBob3cgcGFnZSBjb3VudHMgYXJlIGFkanVzdGVkIGFuZCBob3cgdGhlIHpvbmVzIGFyZSBtYW5hZ2VkIGR1cmluZyB0aGVzZSBvcGVyYXRpb25zLlxuXG5GaXJzdCwgSSBub3RpY2UgYSBjcml0aWNhbCBkZXRhaWw6IGBucl9wYWdlc2AgaXMgbmVnYXRpdmUgd2hlbiBhIG1lbW9yeSBibG9jayBpcyBiZWluZyBvZmZsaW5lZC4gVGhpcyBpcyBrZXkuIFRoZSBgYWRqdXN0X3ByZXNlbnRfcGFnZV9jb3VudGAgZnVuY3Rpb24gaXMgY2FsbGVkIHdpdGggYSBuZWdhdGl2ZSBgbnJfdm1lbW1hcF9wYWdlc2AgdmFsdWUgaW4gdGhpcyBvZmZsaW5pbmcgY29udGV4dC4gVGhpcyBzdWJ0cmFjdGlvbiBpcyB0aGVuIHJlZmxlY3RlZCBpbiBgem9uZS1cdTAwM2VwYWdlc193aXRoX29ubGluZV9tZW1tYXBgLiBTbyBpdCBtYWtlcyBzZW5zZS5cblxuTmV4dCwgSSdtIGV4YW1pbmluZyB0aGUgYG1lbW9yeV9ibG9ja19vbmxpbmVgIGFuZCBgbWVtb3J5X2Jsb2NrX29mZmxpbmVgIGZ1bmN0aW9ucyBpbiBgZHJpdmVycy9iYXNlL21lbW9yeS5jYC4gSSBzZWUgdGhlIGBtZW1faG90cGx1Z19iZWdpbigpYCBhbmQgYG1lbV9ob3RwbHVnX2RvbmUoKWAgY2FsbHMgYnJhY2tldGluZyB0aGUgY29yZSBvcGVyYXRpb25zLiBBbHNvIGBjbGVhcl96b25lX2NvbnRpZ3VvdXNgIGFuZCBgc2V0X3pvbmVfY29udGlndW91c2Agd2VyZSBjYWxsZWQgaW4gdGhlIG9sZCBjb2RlLiBOb3csIGBjbGVhcl96b25lX2NvbnRpZ3VvdXNgIGFuZCBgc2V0X3pvbmVfY29udGlndW91c2AgaGF2ZSBiZWVuIG1vdmVkIHRvIGJlIGFyb3VuZCBgbWVtb3J5X2Jsb2NrX29ubGluZWAgYW5kIGBtZW1vcnlfYmxvY2tfb2ZmbGluZWAgc3BlY2lmaWNhbGx5LlxuXG5Ob3csIG15IG1pbmQgaXMganVtcGluZyB0byBvdGhlciByZWxhdGVkIGFyZWFzLCBhbmQgaG93IHRoZXNlIGNoYW5nZXMgaW1wYWN0IHRoZW0uIEknbSB0aGlua2luZyBhYm91dCB0aGUgYHNocmlua196b25lX3NwYW5gLCBgZmluZF9zbWFsbGVzdF9zZWN0aW9uX3BmbmAsIGFuZCBgZmluZF9iaWdnZXN0X3NlY3Rpb25fcGZuYCBmdW5jdGlvbnMgaW4gYG1tL21lbW9yeV9ob3RwbHVnLmNgLiBJIG5lZWQgdG8gZW5zdXJlIHRoZSBjaGFuZ2VzIGFyZSBjb25zaXN0ZW50LiBJIHNlZSBhIG5ldyBmdW5jdGlvbiBgc3Vic2VjdGlvbl9vdmVybGFwc196b25lYCwgd2hpY2ggY2hlY2tzIGlmIGEgc3Vic2VjdGlvbiBvdmVybGFwcyBhIGdpdmVuIHpvbmUuIFRoZSBsb2dpYyByZWxpZXMgb24gYHBmbl90b19vbmxpbmVfcGFnZWAsIHdoaWNoIEknbGwgbmVlZCB0byBkb3VibGUtY2hlY2sgaW4gcmVsYXRpb24gdG8gdGhlIG1haW4gdG9waWMuXG5cbkknbSB0aGlua2luZyBtb3JlIGFib3V0IGhvdyBgYWRqdXN0X3ByZXNlbnRfcGFnZV9jb3VudGAgd29ya3MuIEkgbmVlZCB0byB0cmFjZSB0aGlzIGZ1bmN0aW9uIGFzIGl0IGlzIGFwcGxpZWQgaGVyZSBpbiBob3RwbHVnL29mZmxpbmUuIEkgbmVlZCB0byBzZWFyY2ggdGhlIGtlcm5lbCBzb3VyY2UgYW5kIHVuZGVyc3RhbmQgaXRzIHJlbGF0aW9uc2hpcCB0byBgb25saW5lX3BhZ2VzYCBhbmQgZXNwZWNpYWxseSB0aGUgYHBhZ2VzX3dpdGhfb25saW5lX21lbW1hcGAgdmFyaWFibGUuIEkgd2FudCB0byBjb25maXJtIHRoZSB0b3RhbCBudW1iZXIgb2YgcGFnZXMgYXJlIGhhbmRsZWQgY29ycmVjdGx5IHRocm91Z2hvdXQgdGhlIHByb2Nlc3MuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjI1NDcxLCJPdXRwdXRUb2tlbnMiOjIxLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6OTg2LCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMTRUMDc6NTM6NTUuNzUxMDg1NjQ3WiIsIlNlcSI6NzYsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyMzM0NTU2MzY3LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImFkanVzdF9wcmVzZW50X3BhZ2VfY291bnRcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiZHJpdmVycy9iYXNlL21lbW9yeS5jPTIzMz1zdGF0aWMgaW50IG1lbW9yeV9ibG9ja19vbmxpbmUoc3RydWN0IG1lbW9yeV9ibG9jayAqbWVtKVxcbi0tXFxuZHJpdmVycy9iYXNlL21lbW9yeS5jLTI3Ny1cXHRpZiAobnJfdm1lbW1hcF9wYWdlcylcXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmM6Mjc4OlxcdFxcdGFkanVzdF9wcmVzZW50X3BhZ2VfY291bnQocGZuX3RvX3BhZ2Uoc3RhcnRfcGZuKSwgbWVtLVxcdTAwM2Vncm91cCxcXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmMtMjc5LVxcdFxcdFxcdFxcdFxcdCAgbnJfdm1lbW1hcF9wYWdlcyk7XFxuLS1cXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmM9MjkxPXN0YXRpYyBpbnQgbWVtb3J5X2Jsb2NrX29mZmxpbmUoc3RydWN0IG1lbW9yeV9ibG9jayAqbWVtKVxcbi0tXFxuZHJpdmVycy9iYXNlL21lbW9yeS5jLTMxMC1cXHRpZiAobnJfdm1lbW1hcF9wYWdlcylcXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmM6MzExOlxcdFxcdGFkanVzdF9wcmVzZW50X3BhZ2VfY291bnQocGZuX3RvX3BhZ2Uoc3RhcnRfcGZuKSwgbWVtLVxcdTAwM2Vncm91cCxcXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmMtMzEyLVxcdFxcdFxcdFxcdFxcdCAgLW5yX3ZtZW1tYXBfcGFnZXMpO1xcbi0tXFxuZHJpdmVycy9iYXNlL21lbW9yeS5jLTMxOC1cXHRcXHRpZiAobnJfdm1lbW1hcF9wYWdlcylcXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmM6MzE5OlxcdFxcdFxcdGFkanVzdF9wcmVzZW50X3BhZ2VfY291bnQocGZuX3RvX3BhZ2Uoc3RhcnRfcGZuKSxcXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmMtMzIwLVxcdFxcdFxcdFxcdFxcdFxcdCAgbWVtLVxcdTAwM2Vncm91cCwgbnJfdm1lbW1hcF9wYWdlcyk7XFxuLS1cXG5pbmNsdWRlL2xpbnV4L21lbW9yeV9ob3RwbHVnLmg9MTAxPXN0YXRpYyBpbmxpbmUgdm9pZCB6b25lX3NlcWxvY2tfaW5pdChzdHJ1Y3Qgem9uZSAqem9uZSlcXG4tLVxcbmluY2x1ZGUvbGludXgvbWVtb3J5X2hvdHBsdWcuaC0xMDQtfVxcbmluY2x1ZGUvbGludXgvbWVtb3J5X2hvdHBsdWcuaDoxMDU6ZXh0ZXJuIHZvaWQgYWRqdXN0X3ByZXNlbnRfcGFnZV9jb3VudChzdHJ1Y3QgcGFnZSAqcGFnZSxcXG5pbmNsdWRlL2xpbnV4L21lbW9yeV9ob3RwbHVnLmgtMTA2LVxcdFxcdFxcdFxcdCAgICAgIHN0cnVjdCBtZW1vcnlfZ3JvdXAgKmdyb3VwLFxcbi0tXFxubW0vbWVtb3J5X2hvdHBsdWcuYz0xMDI1PXN0cnVjdCB6b25lICp6b25lX2Zvcl9wZm5fcmFuZ2UoZW51bSBtbW9wIG9ubGluZV90eXBlLCBpbnQgbmlkLFxcbi0tXFxubW0vbWVtb3J5X2hvdHBsdWcuYy0xMDQ0LSAqL1xcbm1tL21lbW9yeV9ob3RwbHVnLmM6MTA0NTp2b2lkIGFkanVzdF9wcmVzZW50X3BhZ2VfY291bnQoc3RydWN0IHBhZ2UgKnBhZ2UsIHN0cnVjdCBtZW1vcnlfZ3JvdXAgKmdyb3VwLFxcbm1tL21lbW9yeV9ob3RwbHVnLmMtMTA0Ni1cXHRcXHRcXHQgICAgICAgbG9uZyBucl9wYWdlcylcXG4tLVxcbm1tL21lbW9yeV9ob3RwbHVnLmM9MTEyMT1pbnQgb25saW5lX3BhZ2VzKHVuc2lnbmVkIGxvbmcgcGZuLCB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzLFxcbi0tXFxubW0vbWVtb3J5X2hvdHBsdWcuYy0xMTg0LVxcdG9ubGluZV9wYWdlc19yYW5nZShwZm4sIG5yX3BhZ2VzKTtcXG5tbS9tZW1vcnlfaG90cGx1Zy5jOjExODU6XFx0YWRqdXN0X3ByZXNlbnRfcGFnZV9jb3VudChwZm5fdG9fcGFnZShwZm4pLCBncm91cCwgbnJfcGFnZXMpO1xcbm1tL21lbW9yeV9ob3RwbHVnLmMtMTE4Ni1cXG4tLVxcbm1tL21lbW9yeV9ob3RwbHVnLmM9MTkzNj1pbnQgb2ZmbGluZV9wYWdlcyh1bnNpZ25lZCBsb25nIHN0YXJ0X3BmbiwgdW5zaWduZWQgbG9uZyBucl9wYWdlcyxcXG4tLVxcbm1tL21lbW9yeV9ob3RwbHVnLmMtMjA5Ni1cXHRhZGp1c3RfbWFuYWdlZF9wYWdlX2NvdW50KHBmbl90b19wYWdlKHN0YXJ0X3BmbiksIC1tYW5hZ2VkX3BhZ2VzKTtcXG5tbS9tZW1vcnlfaG90cGx1Zy5jOjIwOTc6XFx0YWRqdXN0X3ByZXNlbnRfcGFnZV9jb3VudChwZm5fdG9fcGFnZShzdGFydF9wZm4pLCBncm91cCwgLW5yX3BhZ2VzKTtcXG5tbS9tZW1vcnlfaG90cGx1Zy5jLTIwOTgtXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTE0VDA3OjUzOjU4LjA4NTY0ODYyNFoiLCJTZXEiOjc3LCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuOC1mbGFzaCIsIkR1cmF0aW9uIjo2ODQ1NzY3NTM3NSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgdGhlIFBhdGNoIGZvciBVbmluaXRpYWxpemVkIE1lbW9yeSBSaXNrcyoqXG5cbk9rYXksIGxldCdzIGJyZWFrIGRvd24gdGhpcyBwYXRjaC4gTXkgaW1tZWRpYXRlIGdvYWwgaXMgdG8gdW5kZXJzdGFuZCBpdHMgcHVycG9zZSBhbmQgaG93IGl0IHdvcmtzLiBJdCBsb29rcyBsaWtlIHdlJ3JlIGludHJvZHVjaW5nIGEgY291bnRlciwgYHBhZ2VzX3dpdGhfb25saW5lX21lbW1hcGAsIHdpdGhpbiB0aGUgYHN0cnVjdCB6b25lYCB0byB0cmFjayBwYWdlcyB0aGF0IGhhdmUgYW4gYWN0aXZlIG1lbW9yeSBtYXAgd2l0aGluIGEgem9uZS4gVGhpcyBzZWVtcyBnZWFyZWQgdG93YXJkcyBkZXRlY3RpbmcgY29udGlndW91cyB6b25lcy4gV2hlbiB0aGUgdG90YWwgc3Bhbm5lZCBwYWdlcyAoYHNwYW5uZWRfcGFnZXNgKSBtYXRjaGVzIHRoZSBudW1iZXIgb2YgcGFnZXMgd2l0aCBvbmxpbmUgbWVtb3J5IG1hcHMsIHdlIGZsYWcgdGhlIHpvbmUgYXMgY29udGlndW91cyB1c2luZyBgc2V0X3pvbmVfY29udGlndW91c2AgYnkgc2V0dGluZyBgem9uZS1cdTAwM2Vjb250aWd1b3VzYCB0byB0cnVlLiBgem9uZV9pc19jb250aWd1b3VzKHpvbmUpYCBqdXN0IHJlYWRzIHRoaXMgZmxhZy4gVGhpcyBjb250aWd1aXR5IGZsYWcgbGV0cyB1cyBvcHRpbWl6ZSBgcGFnZWJsb2NrX3Bmbl90b19wYWdlYCBieSBza2lwcGluZyB2YWxpZGF0aW9uIGNoZWNrcyBpbiBjb250aWd1b3VzIHpvbmVzLiBUaGUgcGF0Y2ggYWxzbyB1cGRhdGVzIGNvbnRpZ3VpdHkgc3RhdHVzIHdoZW4gbWVtb3J5IGlzIG9ubGluZWQgb3Igb2ZmbGluZWQgYW5kIHNpbXBsaWZpZXMgc2VjdGlvbiBQRk4gY2FsY3VsYXRpb25zIHdoZW4gc2hyaW5raW5nIHRoZSB6b25lIHNwYW4uXG5cbk5vdywgbGV0J3MgZ2V0IGRvd24gdG8gdGhlIGNyaXRpY2FsIHF1ZXN0aW9uOiBhcmUgd2UgaW50cm9kdWNpbmcgYW55IHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHZ1bG5lcmFiaWxpdGllcz8gVGhlIHByaW1hcnkgY29uY2VybiBpcywgY291bGQgdW5pbml0aWFsaXplZCBtZW1vcnkgcG90ZW50aWFsbHkgYmUgY29waWVkIHRvIHVzZXJzcGFjZSwgb3IgYmUgdGhlIGJhc2lzIG9mIHNvbWUgY29uZGl0aW9uYWwgbG9naWMgdGhhdCBsZWFkcyB0byBpbnN0YWJpbGl0eT9cblxuSSd2ZSBjaGVja2VkIHRoZSBzdGFuZGFyZCBhdmVudWVzLiBUaGVyZSBhcmUgbm8gbmV3IG9yIG1vZGlmaWVkIGBjb3B5X3RvX3VzZXJgLCBgcHV0X3VzZXJgLCBuZXRsaW5rIGF0dHJpYnV0ZXMsIGlvY3Rscywgc29ja2V0IG9wdGlvbnMsIG9yIEJQRiBidWZmZXJzIGhlcmUuIFRoYXQncyBhIGdvb2Qgc3RhcnQuXG5cblRoZSByZWFsIHF1ZXN0aW9uIGlzIGFib3V0IGJyYW5jaGluZyBhbmQgY29uZGl0aW9uYWwgbG9naWMgZGVwZW5kZW50IG9uIHBvdGVudGlhbGx5IHVuaW5pdGlhbGl6ZWQgdmFyaWFibGVzLiBMZXQncyBkaWcgaW50byB0aGF0IGBzZXRfem9uZV9jb250aWd1b3VzYCBmdW5jdGlvbi5cblxuYGBgY1xuc3RhdGljIGlubGluZSB2b2lkIHNldF96b25lX2NvbnRpZ3VvdXMoc3RydWN0IHpvbmUgKnpvbmUpXG57XG5cdGlmICh6b25lX2lzX3pvbmVfZGV2aWNlKHpvbmUpKVxuXHRcdHJldHVybjtcblx0aWYgKHpvbmUtXHUwMDNlc3Bhbm5lZF9wYWdlcyA9PSB6b25lLVx1MDAzZXBhZ2VzX3dpdGhfb25saW5lX21lbW1hcClcblx0XHRXUklURV9PTkNFKHpvbmUtXHUwMDNlY29udGlndW91cywgdHJ1ZSk7XG59XG5gYGBcblxuT2theSwgdGhlIGNydWNpYWwgYml0IGlzIHdoZXRoZXIgYHBhZ2VzX3dpdGhfb25saW5lX21lbW1hcGAgaXMgaW5pdGlhbGl6ZWQuIEkga25vdyB0aGF0IGBzdHJ1Y3Qgem9uZWAgaXMgcGFydCBvZiBgcGdfZGF0YV90YC4gTm93LCBgcGdfZGF0YV90YCBpdHNlbGYgaXMgZWl0aGVyIHN0YXRpY2FsbHkgZGVmaW5lZCBvciBhbGxvY2F0ZWQgdmlhIGBtZW1ibG9ja19hbGxvY19ub2RlYC4gRWl0aGVyIHdheSwgaXQgZW5kcyB1cCBiZWluZyB6ZXJvZWQgYXQgaW5pdGlhbGl6YXRpb24uIFNvLCBgcGFnZXNfd2l0aF9vbmxpbmVfbWVtbWFwYCAqc2hvdWxkKiBiZSBpbml0aWFsaXplZCB0byB6ZXJvIGR1cmluZyBib290LiBXZSdyZSBzZXR0aW5nIHRoZSBjb250aWd1b3VzIGZsYWcgYmFzZWQgb24gYSBjb21wYXJpc29uLCBidXQgaXQgc3RhcnRzIG91dCBpbml0aWFsaXplZCB0byB6ZXJvLiBUaGVyZWZvcmUsIHRoZXJlJ3Mgbm8gaW5oZXJlbnQgcmlzayBvZiBleHBvc2luZyB1bmluaXRpYWxpemVkIG1lbW9yeSBhdCB0aGUgc3RhcnQuIEkgbmVlZCB0byB2ZXJpZnkgZXhhY3RseSB3aGVyZSBgc3RydWN0IHpvbmVgIGlzIGFsbG9jYXRlZC9pbml0aWFsaXplZCBkdXJpbmcgYm9vdCB0byBjb25maXJtIHRoaXMuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjI3NzU1LCJPdXRwdXRUb2tlbnMiOjI1LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NTAyLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTE0VDA3OjU1OjA2LjU0MzMyNzYzWiIsIlNlcSI6NzgsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyMTgyODE5MDMwLCJFcnJvciI6Im5vIG1hdGNoZXMiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJ6b25lLVxcdTAwM2VwYWdlc193aXRoX29ubGluZV9tZW1tYXAgPVwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJlcnJvclwiOiBcIm5vIG1hdGNoZXNcIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTRUMDc6NTU6MDguNzI2MTU1NjA5WiIsIlNlcSI6NzksIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy44LWZsYXNoIiwiRHVyYXRpb24iOjE3MDk2NTEyODUsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGhlcmUncyBteSBhdHRlbXB0IGF0IHN1bW1hcml6aW5nIHRoYXQgdGhvdWdodCBwcm9jZXNzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlOlxuXG4qKkJvb3QgWm9uZSBBbmFseXNpcyoqXG5cblJpZ2h0LCBsZXQncyBkaXZlIGluLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGUgem9uZSBjbGVhcmluZyBhbmQgaW5pdGlhbGl6YXRpb24gc2VxdWVuY2UgZHVyaW5nIHN5c3RlbSBib290LiBJJ20gdGhpbmtpbmcgYWJvdXQgdHJhY2luZyB0aGUgY29kZSBwYXRoIHRvIHBpbnBvaW50IHByZWNpc2VseSAqd2hlcmUqIHRoZXNlIG9wZXJhdGlvbnMgYXJlIGhhcHBlbmluZy4gSSdtIG5vdCBsb29raW5nIGZvciBhIGhpZ2gtbGV2ZWwgb3ZlcnZpZXcgaGVyZTsgSSB3YW50IHRoZSBncmFudWxhciBkZXRhaWw6IHRoZSBzcGVjaWZpYyBmdW5jdGlvbnMsIHRoZSBzcGVjaWZpYyBtZW1vcnkgcmFuZ2VzLCB0aGUgY29uZGl0aW9uYWxzIHRoYXQgdHJpZ2dlciBkaWZmZXJlbnQgem9uZSBiZWhhdmlvcnMuIEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoZSB0aW1pbmcgdG9vLCByZWxhdGl2ZSB0byBvdGhlciBjcml0aWNhbCBib290IHByb2Nlc3Nlcy5cblxuXG4iLCJJbnB1dFRva2VucyI6Mjg4NTUsIk91dHB1dFRva2VucyI6MjcsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxMywiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0xNFQwNzo1NToxMC40MzU4MTA1MzRaIiwiU2VxIjo4MCwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjYzNzc0NDI5LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImZyZWVfYXJlYV9pbml0XCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIm1tL1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJtbS9tZW1vcnlfaG90cGx1Zy5jPTEyMzc9c3RhdGljIHBnX2RhdGFfdCAqaG90YWRkX2luaXRfcGdkYXQoaW50IG5pZClcXG4tLVxcbm1tL21lbW9yeV9ob3RwbHVnLmMtMTI0MS1cXHQvKlxcbm1tL21lbW9yeV9ob3RwbHVnLmM6MTI0MjpcXHQgKiBOT0RFX0RBVEEgaXMgcHJlYWxsb2NhdGVkIChmcmVlX2FyZWFfaW5pdCkgYnV0IGl0cyBpbnRlcm5hbFxcbm1tL21lbW9yeV9ob3RwbHVnLmMtMTI0My1cXHQgKiBzdGF0ZSBpcyBub3QgYWxsb2NhdGVkIGNvbXBsZXRlbHkuIEFkZCBtaXNzaW5nIHBpZWNlcy5cXG4tLVxcbm1tL21lbW9yeV9ob3RwbHVnLmMtMTI0OS1cXHQvKiBpbml0IG5vZGUncyB6b25lcyBhcyBlbXB0eSB6b25lcywgd2UgZG9uJ3QgaGF2ZSBhbnkgcHJlc2VudCBwYWdlcy4qL1xcbm1tL21lbW9yeV9ob3RwbHVnLmM6MTI1MDpcXHRpZiAoZnJlZV9hcmVhX2luaXRfY29yZV9ob3RwbHVnKHBnZGF0KSlcXG5tbS9tZW1vcnlfaG90cGx1Zy5jLTEyNTEtXFx0XFx0cmV0dXJuIE5VTEw7XFxuLS1cXG5tbS9tbV9pbml0LmM9MTQ5Mj1zdGF0aWMgaW5saW5lIHZvaWQgX19pbml0IHNldF9wYWdlYmxvY2tfb3JkZXIodm9pZClcXG4tLVxcbm1tL21tX2luaXQuYy0xNTA1LSNpZmRlZiBDT05GSUdfTUVNT1JZX0hPVFBMVUdcXG5tbS9tbV9pbml0LmM6MTUwNjppbnQgX19yZWYgZnJlZV9hcmVhX2luaXRfY29yZV9ob3RwbHVnKHN0cnVjdCBwZ2xpc3RfZGF0YSAqcGdkYXQpXFxubW0vbW1faW5pdC5jLTE1MDcte1xcbi0tXFxubW0vbW1faW5pdC5jLTE1NjMtXFxubW0vbW1faW5pdC5jOjE1NjQ6c3RhdGljIHZvaWQgX19pbml0IGZyZWVfYXJlYV9pbml0X2NvcmUoc3RydWN0IHBnbGlzdF9kYXRhICpwZ2RhdClcXG5tbS9tbV9pbml0LmMtMTU2NS17XFxuLS1cXG5tbS9tbV9pbml0LmM9MTY2Nz12b2lkIF9faW5pdCBnZXRfcGZuX3JhbmdlX2Zvcl9uaWQodW5zaWduZWQgaW50IG5pZCxcXG4tLVxcbm1tL21tX2luaXQuYy0xNjg0LVxcbm1tL21tX2luaXQuYzoxNjg1OnN0YXRpYyB2b2lkIF9faW5pdCBmcmVlX2FyZWFfaW5pdF9ub2RlKGludCBuaWQpXFxubW0vbW1faW5pdC5jLTE2ODYte1xcbi0tXFxubW0vbW1faW5pdC5jLTE3MTMtXFxubW0vbW1faW5pdC5jOjE3MTQ6XFx0ZnJlZV9hcmVhX2luaXRfY29yZShwZ2RhdCk7XFxubW0vbW1faW5pdC5jLTE3MTUtXFx0bHJ1X2dlbl9pbml0X3BnZGF0KHBnZGF0KTtcXG4tLVxcbm1tL21tX2luaXQuYz0xNzU3PXN0YXRpYyB2b2lkIF9faW5pdCBzZXRfaGlnaF9tZW1vcnkodm9pZClcXG4tLVxcbm1tL21tX2luaXQuYy0xNzc4LS8qKlxcbm1tL21tX2luaXQuYzoxNzc5OiAqIGZyZWVfYXJlYV9pbml0IC0gSW5pdGlhbGlzZSBhbGwgcGdfZGF0YV90IGFuZCB6b25lIGRhdGFcXG5tbS9tbV9pbml0LmMtMTc4MC0gKlxcbm1tL21tX2luaXQuYzoxNzgxOiAqIFRoaXMgd2lsbCBjYWxsIGZyZWVfYXJlYV9pbml0X25vZGUoKSBmb3IgZWFjaCBhY3RpdmUgbm9kZSBpbiB0aGUgc3lzdGVtLlxcbm1tL21tX2luaXQuYy0xNzgyLSAqIFVzaW5nIHRoZSBwYWdlIHJhbmdlcyBwcm92aWRlZCBieSBtZW1ibG9ja19zZXRfbm9kZSgpLCB0aGUgc2l6ZSBvZiBlYWNoXFxuLS1cXG5tbS9tbV9pbml0LmMtMTc4OS0gKi9cXG5tbS9tbV9pbml0LmM6MTc5MDpzdGF0aWMgdm9pZCBfX2luaXQgZnJlZV9hcmVhX2luaXQodm9pZClcXG5tbS9tbV9pbml0LmMtMTc5MS17XFxuLS1cXG5tbS9tbV9pbml0LmMtMTg2OC1cXHRcXHRwZ2RhdCA9IE5PREVfREFUQShuaWQpO1xcbm1tL21tX2luaXQuYzoxODY5OlxcdFxcdGZyZWVfYXJlYV9pbml0X25vZGUobmlkKTtcXG5tbS9tbV9pbml0LmMtMTg3MC1cXG4tLVxcbm1tL21tX2luaXQuYz0yNjM0PXZvaWQgX19pbml0IG1tX2NvcmVfaW5pdF9lYXJseSh2b2lkKVxcbi0tXFxubW0vbW1faW5pdC5jLTI2MzctXFxubW0vbW1faW5pdC5jOjI2Mzg6XFx0ZnJlZV9hcmVhX2luaXQoKTtcXG5tbS9tbV9pbml0LmMtMjYzOS1cXG4tLVxcbm1tL3BhZ2VfYWxsb2MuYz01OTk1PXN0YXRpYyB2b2lkIF9fYnVpbGRfYWxsX3pvbmVsaXN0cyh2b2lkICpkYXRhKVxcbi0tXFxubW0vcGFnZV9hbGxvYy5jLTYwMjctXFx0XFx0ICogQWxsIHBvc3NpYmxlIG5vZGVzIGhhdmUgcGdkYXQgcHJlYWxsb2NhdGVkXFxubW0vcGFnZV9hbGxvYy5jOjYwMjg6XFx0XFx0ICogaW4gZnJlZV9hcmVhX2luaXRcXG5tbS9wYWdlX2FsbG9jLmMtNjAyOS1cXHRcXHQgKi9cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTRUMDc6NTU6MTAuNDk5NTkyMjQzWiIsIlNlcSI6ODEsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy44LWZsYXNoIiwiRHVyYXRpb24iOjQxNDA2NzkyMDEsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGxldCdzIGRpdmUgaW50byB0aGlzLiBIZXJlJ3MgaG93IEknZCBhcHByb2FjaCB0aGF0IGtlcm5lbCBjb2RlIHNuaXBwZXQsIHJlZmxlY3Rpbmcgb24gbXkgdW5kZXJzdGFuZGluZzpcblxuKipFeGFtaW5pbmcgWm9uZSBJbml0aWFsaXphdGlvbiBpbiBgbW0vbW1faW5pdC5jYCoqXG5cbkFscmlnaHQsIHNvIHdlJ3JlIGxvb2tpbmcgYXQgbWVtb3J5IG1hbmFnZW1lbnQgaW5pdGlhbGl6YXRpb24sIHNwZWNpZmljYWxseSB3aXRoaW4gdGhlIGBtbS9tbV9pbml0LmNgIGZpbGUuIFRoZSBnb2FsIGhlcmUsIGFzIEkgdW5kZXJzdGFuZCBpdCwgaXMgdG8gZmlndXJlIG91dCBleGFjdGx5ICpob3cqIHRoZSBtZW1vcnkgem9uZXMgd2l0aGluIHRoZSBgcGdkYXRgIHN0cnVjdHVyZSBhcmUgaW5pdGlhbGx5IHNldCB1cC4gSXQncyBhIGZ1bmRhbWVudGFsIHBhcnQgb2YgdGhlIGJvb3QgcHJvY2VzcyBhbmQgaG93IHRoZSBrZXJuZWwgY2FydmVzIG91dCBpdHMgcGh5c2ljYWwgbWVtb3J5IGFkZHJlc3Mgc3BhY2UuIExpbmUgMTU2NCBpcyBhIGZhaXJseSBzcGVjaWZpYyBhcmVhLiBJJ20gZ29pbmcgdG8ganVtcCBpbiB0aGVyZSBhbmQgc2VlIHdoYXQncyBoYXBwZW5pbmcuIEkgZXhwZWN0IHRvIGZpbmQgc29tZSBrZXkgaW5pdGlhbGl6YXRpb25zIG9mIHRoZSB6b25lcyBkYXRhIHN0cnVjdHVyZXMsIHRoaW5ncyBsaWtlIGRldGVybWluaW5nIHNpemVzLCBhbmQgc2V0dGluZyB1cCB0aGUgbGlzdHMgb2YgZnJlZSBwYWdlcyB0aGF0IG1ha2UgdXAgdGhlIG1lbW9yeSB6b25lcyB0aGF0IGFyZSB1c2VkIHRvIGFsbG9jYXRlIG1lbW9yeSBsYXRlciBvbi4gSSdtIGtlZW4gdG8gc2VlIHRoZSBzcGVjaWZpYyBkYXRhIHN0cnVjdHVyZXMgYW5kIGZ1bmN0aW9uIGNhbGxzIHJlc3BvbnNpYmxlIGZvciB0aGlzIGluaXRpYWwgY29uZmlndXJhdGlvbiDigJMgaXQncyBjcnVjaWFsIGZvciB1bmRlcnN0YW5kaW5nIHRoZSBvdmVyYWxsIG1lbW9yeSBhcmNoaXRlY3R1cmUuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjMwMDE1LCJPdXRwdXRUb2tlbnMiOjM2LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MzAsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMTRUMDc6NTU6MTQuNjQwMjc0NjM1WiIsIlNlcSI6ODIsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE4MDk4MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJtbS9tbV9pbml0LmNcIixcbiAgXCJGaXJzdExpbmVcIjogMTU2NCxcbiAgXCJMaW5lQ291bnRcIjogNDBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiMTU2NDpcXHRzdGF0aWMgdm9pZCBfX2luaXQgZnJlZV9hcmVhX2luaXRfY29yZShzdHJ1Y3QgcGdsaXN0X2RhdGEgKnBnZGF0KVxcbjE1NjU6XFx0e1xcbjE1NjY6XFx0XFx0ZW51bSB6b25lX3R5cGUgajtcXG4xNTY3OlxcdFxcdGludCBuaWQgPSBwZ2RhdC1cXHUwMDNlbm9kZV9pZDtcXG4xNTY4OlxcdFxcbjE1Njk6XFx0XFx0cGdkYXRfaW5pdF9pbnRlcm5hbHMocGdkYXQpO1xcbjE1NzA6XFx0XFx0cGdkYXQtXFx1MDAzZXBlcl9jcHVfbm9kZXN0YXRzID0gXFx1MDAyNmJvb3Rfbm9kZXN0YXRzO1xcbjE1NzE6XFx0XFxuMTU3MjpcXHRcXHRmb3IgKGogPSAwOyBqIFxcdTAwM2MgTUFYX05SX1pPTkVTOyBqKyspIHtcXG4xNTczOlxcdFxcdFxcdHN0cnVjdCB6b25lICp6b25lID0gcGdkYXQtXFx1MDAzZW5vZGVfem9uZXMgKyBqO1xcbjE1NzQ6XFx0XFx0XFx0dW5zaWduZWQgbG9uZyBzaXplID0gem9uZS1cXHUwMDNlc3Bhbm5lZF9wYWdlcztcXG4xNTc1OlxcdFxcbjE1NzY6XFx0XFx0XFx0LypcXG4xNTc3OlxcdFxcdFxcdCAqIEluaXRpYWxpemUgem9uZS1cXHUwMDNlbWFuYWdlZF9wYWdlcyBhcyAwICwgaXQgd2lsbCBiZSByZXNldFxcbjE1Nzg6XFx0XFx0XFx0ICogd2hlbiBtZW1ibG9jayBhbGxvY2F0b3IgZnJlZXMgcGFnZXMgaW50byBidWRkeSBzeXN0ZW0uXFxuMTU3OTpcXHRcXHRcXHQgKi9cXG4xNTgwOlxcdFxcdFxcdHpvbmVfaW5pdF9pbnRlcm5hbHMoem9uZSwgaiwgbmlkLCB6b25lLVxcdTAwM2VwcmVzZW50X3BhZ2VzKTtcXG4xNTgxOlxcdFxcbjE1ODI6XFx0XFx0XFx0aWYgKCFzaXplKVxcbjE1ODM6XFx0XFx0XFx0XFx0Y29udGludWU7XFxuMTU4NDpcXHRcXG4xNTg1OlxcdFxcdFxcdHNldHVwX3VzZW1hcCh6b25lKTtcXG4xNTg2OlxcdFxcdFxcdGluaXRfY3VycmVudGx5X2VtcHR5X3pvbmUoem9uZSwgem9uZS1cXHUwMDNlem9uZV9zdGFydF9wZm4sIHNpemUpO1xcbjE1ODc6XFx0XFx0fVxcbjE1ODg6XFx0fVxcbjE1ODk6XFx0XFxuMTU5MDpcXHR2b2lkIF9faW5pdCAqbWVtbWFwX2FsbG9jKHBoeXNfYWRkcl90IHNpemUsIHBoeXNfYWRkcl90IGFsaWduLFxcbjE1OTE6XFx0XFx0XFx0XFx0ICBwaHlzX2FkZHJfdCBtaW5fYWRkciwgaW50IG5pZCwgYm9vbCBleGFjdF9uaWQpXFxuMTU5MjpcXHR7XFxuMTU5MzpcXHRcXHR2b2lkICpwdHI7XFxuMTU5NDpcXHRcXG4xNTk1OlxcdFxcdC8qXFxuMTU5NjpcXHRcXHQgKiBLbWVtbGVhayB3aWxsIGV4cGxpY2l0bHkgc2NhbiBtZW1fbWFwIGJ5IHRyYXZlcnNpbmcgYWxsIHZhbGlkXFxuMTU5NzpcXHRcXHQgKiBgc3RydWN0ICpwYWdlYCxzbyBtZW1ibG9jayBkb2VzIG5vdCBuZWVkIHRvIGJlIGFkZGVkIHRvIHRoZSBzY2FuIGxpc3QuXFxuMTU5ODpcXHRcXHQgKi9cXG4xNTk5OlxcdFxcdGlmIChleGFjdF9uaWQpXFxuMTYwMDpcXHRcXHRcXHRwdHIgPSBtZW1ibG9ja19hbGxvY19leGFjdF9uaWRfcmF3KHNpemUsIGFsaWduLCBtaW5fYWRkcixcXG4xNjAxOlxcdFxcdFxcdFxcdFxcdFxcdFxcdCAgIE1FTUJMT0NLX0FMTE9DX05PTEVBS1RSQUNFLFxcbjE2MDI6XFx0XFx0XFx0XFx0XFx0XFx0XFx0ICAgbmlkKTtcXG4xNjAzOlxcdFxcdGVsc2VcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTRUMDc6NTU6MTQuNjQwNDU4ODQ1WiIsIlNlcSI6ODMsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy44LWZsYXNoIiwiRHVyYXRpb24iOjQ4MjQ0MTMzNzEsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSBzdW1tYXJ5LCBhcyB0aG91Z2ggSSdtIHRoaW5raW5nIHRocm91Z2ggdGhpcyBwcm9jZXNzOlxuXG4qKkRpdmluZyBpbnRvIE1lbW9yeSBBbGxvY2F0aW9uIERldGFpbHMqKlxuXG5Pa2F5LCBzbyBJJ20gbG9va2luZyBpbnRvIGhvdyBgcGdkYXRgLCB3aGljaCBob2xkcyB0aGUgYG5vZGVfem9uZXNgIHN0cnVjdHVyZXMsIGlzIGFsbG9jYXRlZC4gTXkgaW5pdGlhbCB0aG91Z2h0IGlzIHRoYXQgaXQncyBwcm9iYWJseSBkb25lIHdpdGggc29tZXRoaW5nIGxpa2UgYG1lbWJsb2NrX2FsbG9jX25vZGVgIG9yIGEgc2ltaWxhciBmdW5jdGlvbiB0aGF0IGF1dG9tYXRpY2FsbHkgemVyby1maWxscyB0aGUgbWVtb3J5LiBUaGF0IG1ha2VzIHNlbnNlLCBrZWVwcyB0aGluZ3MgY2xlYW4uXG5cbkJ1dCBob2xkIG9uIGEgc2Vjb25kLi4uIHdoYXQgYWJvdXQgdGhlIGludGVybmFsIGluaXRpYWxpemF0aW9uIG9mIHpvbmVzPyBJIG5lZWQgdG8gZG91YmxlLWNoZWNrIHRoYXQuIExldCBtZSBxdWlja2x5IGV4YW1pbmUgYHpvbmVfaW5pdF9pbnRlcm5hbHNgIHRvIGNvbmZpcm0gdGhhdCBhc3N1bXB0aW9uLiBJIHdhbnQgdG8gbWFrZSBzdXJlIEkgaGF2ZW4ndCBtaXNzZWQgYSBjcnVjaWFsIGRldGFpbCBhYm91dCB0aGUgbWVtb3J5IGluaXRpYWxpemF0aW9uLiBMZXQncyBzZWUgd2hhdCdzIGluIHRoZXJlLi4uXG5cblxuIiwiSW5wdXRUb2tlbnMiOjMwOTE4LCJPdXRwdXRUb2tlbnMiOjI4LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NjEsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0xNFQwNzo1NToxOS40NjQ4NzY2MDZaIiwiU2VxIjo4NCwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjEyMTgxMjkzOSwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJ6b25lX2luaXRfaW50ZXJuYWxzXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIm1tL1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJtbS9tbV9pbml0LmM9MTM1Nz1zdGF0aWMgdm9pZCBfX21lbWluaXQgcGdkYXRfaW5pdF9pbnRlcm5hbHMoc3RydWN0IHBnbGlzdF9kYXRhICpwZ2RhdClcXG4tLVxcbm1tL21tX2luaXQuYy0xMzczLVxcbm1tL21tX2luaXQuYzoxMzc0OnN0YXRpYyB2b2lkIF9fbWVtaW5pdCB6b25lX2luaXRfaW50ZXJuYWxzKHN0cnVjdCB6b25lICp6b25lLCBlbnVtIHpvbmVfdHlwZSBpZHgsIGludCBuaWQsXFxubW0vbW1faW5pdC5jLTEzNzUtXFx0XFx0XFx0XFx0XFx0XFx0XFx0dW5zaWduZWQgbG9uZyByZW1haW5pbmdfcGFnZXMpXFxuLS1cXG5tbS9tbV9pbml0LmM9MTUwNj1pbnQgX19yZWYgZnJlZV9hcmVhX2luaXRfY29yZV9ob3RwbHVnKHN0cnVjdCBwZ2xpc3RfZGF0YSAqcGdkYXQpXFxuLS1cXG5tbS9tbV9pbml0LmMtMTU1Ni1cXHRcXHR6b25lLVxcdTAwM2VwcmVzZW50X3BhZ2VzID0gMDtcXG5tbS9tbV9pbml0LmM6MTU1NzpcXHRcXHR6b25lX2luaXRfaW50ZXJuYWxzKHpvbmUsIHosIG5pZCwgMCk7XFxubW0vbW1faW5pdC5jLTE1NTgtXFx0fVxcbi0tXFxubW0vbW1faW5pdC5jPTE1NjQ9c3RhdGljIHZvaWQgX19pbml0IGZyZWVfYXJlYV9pbml0X2NvcmUoc3RydWN0IHBnbGlzdF9kYXRhICpwZ2RhdClcXG4tLVxcbm1tL21tX2luaXQuYy0xNTc5LVxcdFxcdCAqL1xcbm1tL21tX2luaXQuYzoxNTgwOlxcdFxcdHpvbmVfaW5pdF9pbnRlcm5hbHMoem9uZSwgaiwgbmlkLCB6b25lLVxcdTAwM2VwcmVzZW50X3BhZ2VzKTtcXG5tbS9tbV9pbml0LmMtMTU4MS1cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTRUMDc6NTU6MTkuNTg2Njk2OTQ1WiIsIlNlcSI6ODUsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy44LWZsYXNoIiwiRHVyYXRpb24iOjM5MDY2MDI4OTc2LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBsZXQncyBkaXZlIGludG8gdGhpcy4gSSdtIGdvaW5nIHRvIHRha2UgYSBsb29rIGF0IHRoZSBgem9uZV9pbml0X2ludGVybmFsc2AgZnVuY3Rpb24uIFNlZW1zIGxpa2UgaXQgc2hvdWxkIGdpdmUgbWUgc29tZSBpbnNpZ2h0IGludG8gdGhlIGNvcmUgaW5pdGlhbGl6YXRpb24gc3RlcHMgZm9yIG1lbW9yeSB6b25lcy4gSSdtIGV4cGVjdGluZyB0aGlzIHRvIGJlIGEgY3J1Y2lhbCBjb21wb25lbnQgZm9yIHVuZGVyc3RhbmRpbmcgdGhlIGFsbG9jYXRpb24gc3RyYXRlZ3kgYW5kIGhvdyB0aGUga2VybmVsIHNldHMgdXAgdGhlIGluaXRpYWwgbWVtb3J5IHBvb2xzIHdpdGhpbiBhIHNwZWNpZmljIHpvbmUuIERlcGVuZGluZyBvbiBob3cgaW4tZGVwdGggdGhpcyBmdW5jdGlvbiBnb2VzLCBJIHNob3VsZCBiZSBhYmxlIHRvIGRlZHVjZSB0aGUgaW50ZXJhY3Rpb25zIGJldHdlZW4gZGlmZmVyZW50IG1lbW9yeSBtYW5hZ2VtZW50IHN1YnN5c3RlbXMsIGFuZCBob3cgdGhlc2UgaW50ZXJuYWwgc3RydWN0dXJlcyBhcmUgY29uZmlndXJlZC4gSSB3aWxsIGxvb2sgZm9yIGNhbGxzIHRoYXQgZGVhbCB3aXRoIHBoeXNpY2FsIG1lbW9yeSByYW5nZXMsIHNwZWNpZmljIGhhcmR3YXJlIGRldGFpbHMsIGFuZCBob3cgdGhlIHpvbmUgaXMgZmlyc3QgcG9wdWxhdGVkIHdpdGggYXZhaWxhYmxlIHBhZ2VzLiBNeSBtYWluIGdvYWwgaXMgdG8gdW5kZXJzdGFuZCB3aGF0IGlzIGhhcHBlbmluZyBiZWhpbmQgdGhlIHNjZW5lcywgc28gdGhhdCBJIGhhdmUgYSBob2xpc3RpYyB2aWV3IG9mIHRoZSBpbml0aWFsaXphdGlvbiBmbG93LlxuXG5cbiIsIklucHV0VG9rZW5zIjozMTUwOSwiT3V0cHV0VG9rZW5zIjozNiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjE1LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTE0VDA3OjU1OjU4LjY1MjcyODg5OVoiLCJTZXEiOjg2LCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyNjQ3ODksIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwibW0vbW1faW5pdC5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDEzNzQsXG4gIFwiTGluZUNvdW50XCI6IDM1XG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIjEzNzQ6XFx0c3RhdGljIHZvaWQgX19tZW1pbml0IHpvbmVfaW5pdF9pbnRlcm5hbHMoc3RydWN0IHpvbmUgKnpvbmUsIGVudW0gem9uZV90eXBlIGlkeCwgaW50IG5pZCxcXG4xMzc1OlxcdFxcdFxcdFxcdFxcdFxcdFxcdFxcdHVuc2lnbmVkIGxvbmcgcmVtYWluaW5nX3BhZ2VzKVxcbjEzNzY6XFx0e1xcbjEzNzc6XFx0XFx0YXRvbWljX2xvbmdfc2V0KFxcdTAwMjZ6b25lLVxcdTAwM2VtYW5hZ2VkX3BhZ2VzLCByZW1haW5pbmdfcGFnZXMpO1xcbjEzNzg6XFx0XFx0em9uZV9zZXRfbmlkKHpvbmUsIG5pZCk7XFxuMTM3OTpcXHRcXHR6b25lLVxcdTAwM2VuYW1lID0gem9uZV9uYW1lc1tpZHhdO1xcbjEzODA6XFx0XFx0em9uZS1cXHUwMDNlem9uZV9wZ2RhdCA9IE5PREVfREFUQShuaWQpO1xcbjEzODE6XFx0XFx0c3Bpbl9sb2NrX2luaXQoXFx1MDAyNnpvbmUtXFx1MDAzZWxvY2spO1xcbjEzODI6XFx0XFx0em9uZV9zZXFsb2NrX2luaXQoem9uZSk7XFxuMTM4MzpcXHRcXHR6b25lX3BjcF9pbml0KHpvbmUpO1xcbjEzODQ6XFx0fVxcbjEzODU6XFx0XFxuMTM4NjpcXHRzdGF0aWMgdm9pZCBfX21lbWluaXQgem9uZV9pbml0X2ZyZWVfbGlzdHMoc3RydWN0IHpvbmUgKnpvbmUpXFxuMTM4NzpcXHR7XFxuMTM4ODpcXHRcXHRzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0O1xcbjEzODk6XFx0XFx0dW5zaWduZWQgaW50IG9yZGVyO1xcbjEzOTA6XFx0XFxuMTM5MTpcXHRcXHRmb3JfZWFjaF9mcmVlX2xpc3QobGlzdCwgem9uZSwgb3JkZXIpXFxuMTM5MjpcXHRcXHRcXHRJTklUX0xJU1RfSEVBRChsaXN0KTtcXG4xMzkzOlxcdFxcbjEzOTQ6XFx0XFx0Zm9yIChvcmRlciA9IDA7IG9yZGVyIFxcdTAwM2MgTlJfUEFHRV9PUkRFUlM7IG9yZGVyKyspXFxuMTM5NTpcXHRcXHRcXHR6b25lLVxcdTAwM2VmcmVlX2FyZWFbb3JkZXJdLm5yX2ZyZWUgPSAwO1xcbjEzOTY6XFx0XFxuMTM5NzpcXHQjaWZkZWYgQ09ORklHX1VOQUNDRVBURURfTUVNT1JZXFxuMTM5ODpcXHRcXHRJTklUX0xJU1RfSEVBRChcXHUwMDI2em9uZS1cXHUwMDNldW5hY2NlcHRlZF9wYWdlcyk7XFxuMTM5OTpcXHQjZW5kaWZcXG4xNDAwOlxcdH1cXG4xNDAxOlxcdFxcbjE0MDI6XFx0dm9pZCBfX21lbWluaXQgaW5pdF9jdXJyZW50bHlfZW1wdHlfem9uZShzdHJ1Y3Qgem9uZSAqem9uZSxcXG4xNDAzOlxcdFxcdFxcdFxcdFxcdFxcdHVuc2lnbmVkIGxvbmcgem9uZV9zdGFydF9wZm4sXFxuMTQwNDpcXHRcXHRcXHRcXHRcXHRcXHR1bnNpZ25lZCBsb25nIHNpemUpXFxuMTQwNTpcXHR7XFxuMTQwNjpcXHRcXHRzdHJ1Y3QgcGdsaXN0X2RhdGEgKnBnZGF0ID0gem9uZS1cXHUwMDNlem9uZV9wZ2RhdDtcXG4xNDA3OlxcdFxcdGludCB6b25lX2lkeCA9IHpvbmVfaWR4KHpvbmUpICsgMTtcXG4xNDA4OlxcdFxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xNFQwNzo1NTo1OC42NTI5OTY3MVoiLCJTZXEiOjg3LCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuOC1mbGFzaCIsIkR1cmF0aW9uIjoyMjgwMjM4MDk4LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgbXkgc3VtbWFyeSwgYXMgaWYgSSB3ZXJlIHRoaW5raW5nIHRoZXNlIHRob3VnaHRzOlxuXG4qKkFuYWx5emluZyBgZnJlZV9hcmVhX2luaXRfY29yZV9ob3RwbHVnYCBpbiBgbW1faW5pdC5jYCoqXG5cbk9rYXksIEknbSBkaXZpbmcgYmFjayBpbnRvIHRoaXMgaG90cGx1ZyBpbml0aWFsaXphdGlvbiBjb2RlLiBMZXQgbWUgcXVpY2tseSByZWZyZXNoIG15IG1lbW9yeS4gUmlnaHQsIGl0J3MgcmVsYXRlZCB0byBtZW1vcnkgbWFuYWdlbWVudCwgc3BlY2lmaWNhbGx5IGhvdyB0aGUgc3lzdGVtIGhhbmRsZXMgYWRkaW5nIG9yIHJlbW92aW5nIG1lbW9yeSByZWdpb25zIGFmdGVyIHRoZSBpbml0aWFsIGJvb3QuIEkgcmVtZW1iZXIgZm9jdXNpbmcgb24gdGhlIGBmcmVlX2FyZWFfaW5pdF9jb3JlX2hvdHBsdWdgIGZ1bmN0aW9uLiBOb3csIGxldCdzIHplcm8gaW4gb24gbGluZXMgMTU1MCB0aHJvdWdoIDE1NjAgaW4gYG1tL21tX2luaXQuY2AuIFRoYXQgc2VjdGlvbiBzaG91bGQgZ2l2ZSBtZSB0aGUgcmVsZXZhbnQgY29udGV4dCBJIG5lZWQuIEknbSBleHBlY3RpbmcgdGhpcyB0byBoYW5kbGUgdGhlIGNvcmUgbWVtb3J5IGluaXRpYWxpemF0aW9uIHN0ZXBzIHRoYXQgbmVlZCB0byBoYXBwZW4gZHluYW1pY2FsbHkgZHVyaW5nIGhvdHBsdWcgb3BlcmF0aW9ucy4gTGV0IG1lIHRha2UgYSBsb29rLi4uXG5cblxuIiwiSW5wdXRUb2tlbnMiOjMyMjYxLCJPdXRwdXRUb2tlbnMiOjM2LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NDEsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0xNFQwNzo1NjowMC45MzMyMzgyNDdaIiwiU2VxIjo4OCwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6Mzc0MTUwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcIm1tL21tX2luaXQuY1wiLFxuICBcIkZpcnN0TGluZVwiOiAxNTQ1LFxuICBcIkxpbmVDb3VudFwiOiAyMFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIxNTQ1OlxcdFxcdFxcdG1lbXNldChwLCAwLCBzaXplb2YoKnApKTtcXG4xNTQ2OlxcdFxcdH1cXG4xNTQ3OlxcdFxcbjE1NDg6XFx0XFx0LypcXG4xNTQ5OlxcdFxcdCAqIFdoZW4gbWVtb3J5IGlzIGhvdC1hZGRlZCwgYWxsIHRoZSBtZW1vcnkgaXMgaW4gb2ZmbGluZSBzdGF0ZS4gU29cXG4xNTUwOlxcdFxcdCAqIGNsZWFyIGFsbCB6b25lcycgcHJlc2VudF9wYWdlcyBhbmQgbWFuYWdlZF9wYWdlcyBiZWNhdXNlIHRoZXkgd2lsbFxcbjE1NTE6XFx0XFx0ICogYmUgdXBkYXRlZCBpbiBvbmxpbmVfcGFnZXMoKSBhbmQgb2ZmbGluZV9wYWdlcygpLlxcbjE1NTI6XFx0XFx0ICovXFxuMTU1MzpcXHRcXHRmb3IgKHogPSAwOyB6IFxcdTAwM2MgTUFYX05SX1pPTkVTOyB6KyspIHtcXG4xNTU0OlxcdFxcdFxcdHN0cnVjdCB6b25lICp6b25lID0gcGdkYXQtXFx1MDAzZW5vZGVfem9uZXMgKyB6O1xcbjE1NTU6XFx0XFxuMTU1NjpcXHRcXHRcXHR6b25lLVxcdTAwM2VwcmVzZW50X3BhZ2VzID0gMDtcXG4xNTU3OlxcdFxcdFxcdHpvbmVfaW5pdF9pbnRlcm5hbHMoem9uZSwgeiwgbmlkLCAwKTtcXG4xNTU4OlxcdFxcdH1cXG4xNTU5OlxcdFxcbjE1NjA6XFx0XFx0cmV0dXJuIDA7XFxuMTU2MTpcXHR9XFxuMTU2MjpcXHQjZW5kaWZcXG4xNTYzOlxcdFxcbjE1NjQ6XFx0c3RhdGljIHZvaWQgX19pbml0IGZyZWVfYXJlYV9pbml0X2NvcmUoc3RydWN0IHBnbGlzdF9kYXRhICpwZ2RhdClcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTRUMDc6NTY6MDAuOTMzNjIwNDY3WiIsIlNlcSI6ODksIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy44LWZsYXNoIiwiRHVyYXRpb24iOjEzNzkzNDY5NTk0LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKk1lbW9yeSBIb3RwbHVnIEluaXRpYWxpemF0aW9uIENvbmNlcm5zKipcblxuT2theSwgaG9sZCBvbiBhIHNlY29uZCEgSSdtIGluIHRoZSBtaWRkbGUgb2YgYW5hbHl6aW5nIGBmcmVlX2FyZWFfaW5pdF9jb3JlX2hvdHBsdWdgLiBJIHNlZSB0aGF0IGB6b25lLVx1MDAzZXByZXNlbnRfcGFnZXMgPSAwO2AgaXMgaGFwcGVuaW5nLiBXYWl0IGEgbWludXRlLi4uIGRvZXMgdGhpcyBmdW5jdGlvbiBhY3R1YWxseSB6ZXJvIG91dCB0aGUgYHBhZ2VzX3dpdGhfb25saW5lX21lbW1hcGAgY291bnRlciBhcyB3ZWxsPyBUaGF0J3MgY3JpdGljYWwgaW5mb3JtYXRpb24sIGFuZCBJIG5lZWQgdG8gY29uZmlybSB0aGF0LlxuXG5BbmQgd2hpbGUgSSdtIGF0IGl0LCB3aGVyZSBpcyB0aGUgYHBnZGF0YCBzdHJ1Y3R1cmUgYWxsb2NhdGVkIHdoZW4gYGhvdGFkZF9pbml0X3BnZGF0YCBpcyBjYWxsZWQ/IEkgY2FuJ3QgcXVpdGUgcmVtZW1iZXIgaWYgaXQncyBtYW5hZ2VkIGF0IHRoZSBzYW1lIHRpbWUgb3IgYSBsYXRlciBwcm9jZXNzLCBzbyBJIG5lZWQgdG8gdHJhY2sgdGhhdCBkb3duLiBUbyByZWZyZXNoIG15IG1lbW9yeSBhbmQgZW5zdXJlIEknbSBnZXR0aW5nIHRoaXMgcmlnaHQsIGxldCdzIGp1bXAgdG8gbGluZXMgMTIzNSB0aHJvdWdoIDEyNTUgaW4gYG1tL21lbW9yeV9ob3RwbHVnLmNgLiBUaGF0IHNob3VsZCBnaXZlIG1lIHRoZSBhbnN3ZXJzIEkgbmVlZC5cblxuXG4iLCJJbnB1dFRva2VucyI6MzI4MTEsIk91dHB1dFRva2VucyI6MzcsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxMDMsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0xNFQwNzo1NjoxNC43MjcwOTM3MDFaIiwiU2VxIjo5MCwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTgxOTkwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcIm1tL21lbW9yeV9ob3RwbHVnLmNcIixcbiAgXCJGaXJzdExpbmVcIjogMTIzNSxcbiAgXCJMaW5lQ291bnRcIjogMjVcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiMTIzNTpcXHRcXG4xMjM2OlxcdC8qIHdlIGFyZSBPSyBjYWxsaW5nIF9fbWVtaW5pdCBzdHVmZiBoZXJlIC0gd2UgaGF2ZSBDT05GSUdfTUVNT1JZX0hPVFBMVUcgKi9cXG4xMjM3OlxcdHN0YXRpYyBwZ19kYXRhX3QgKmhvdGFkZF9pbml0X3BnZGF0KGludCBuaWQpXFxuMTIzODpcXHR7XFxuMTIzOTpcXHRcXHRzdHJ1Y3QgcGdsaXN0X2RhdGEgKnBnZGF0O1xcbjEyNDA6XFx0XFxuMTI0MTpcXHRcXHQvKlxcbjEyNDI6XFx0XFx0ICogTk9ERV9EQVRBIGlzIHByZWFsbG9jYXRlZCAoZnJlZV9hcmVhX2luaXQpIGJ1dCBpdHMgaW50ZXJuYWxcXG4xMjQzOlxcdFxcdCAqIHN0YXRlIGlzIG5vdCBhbGxvY2F0ZWQgY29tcGxldGVseS4gQWRkIG1pc3NpbmcgcGllY2VzLlxcbjEyNDQ6XFx0XFx0ICogQ29tcGxldGVseSBvZmZsaW5lIG5vZGVzIHN0YXkgYXJvdW5kIGFuZCB0aGV5IGp1c3QgbmVlZFxcbjEyNDU6XFx0XFx0ICogcmVpbml0aWFsaXphdGlvbi5cXG4xMjQ2OlxcdFxcdCAqL1xcbjEyNDc6XFx0XFx0cGdkYXQgPSBOT0RFX0RBVEEobmlkKTtcXG4xMjQ4OlxcdFxcbjEyNDk6XFx0XFx0LyogaW5pdCBub2RlJ3Mgem9uZXMgYXMgZW1wdHkgem9uZXMsIHdlIGRvbid0IGhhdmUgYW55IHByZXNlbnQgcGFnZXMuKi9cXG4xMjUwOlxcdFxcdGlmIChmcmVlX2FyZWFfaW5pdF9jb3JlX2hvdHBsdWcocGdkYXQpKVxcbjEyNTE6XFx0XFx0XFx0cmV0dXJuIE5VTEw7XFxuMTI1MjpcXHRcXG4xMjUzOlxcdFxcdC8qXFxuMTI1NDpcXHRcXHQgKiBUaGUgbm9kZSB3ZSBhbGxvY2F0ZWQgaGFzIG5vIHpvbmUgZmFsbGJhY2sgbGlzdHMuIEZvciBhdm9pZGluZ1xcbjEyNTU6XFx0XFx0ICogdG8gYWNjZXNzIG5vdC1pbml0aWFsaXplZCB6b25lbGlzdCwgYnVpbGQgaGVyZS5cXG4xMjU2OlxcdFxcdCAqL1xcbjEyNTc6XFx0XFx0YnVpbGRfYWxsX3pvbmVsaXN0cyhwZ2RhdCk7XFxuMTI1ODpcXHRcXG4xMjU5OlxcdFxcdHJldHVybiBwZ2RhdDtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTRUMDc6NTY6MTQuNzI3MjgwMTAxWiIsIlNlcSI6OTEsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy44LWZsYXNoIiwiRHVyYXRpb24iOjE2MjQ4NTYwMDc5LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBoZXJlJ3MgbXkgaW50ZXJwcmV0YXRpb24gb2YgdGhpcyB0aG91Z2h0IHByb2Nlc3MsIGtlZXBpbmcgaW4gbWluZCBteSBleHBlcnRpc2U6XG5cbioqRGl2aW5nIGludG8gTWVtb3J5IEFsbG9jYXRpb24gRHVyaW5nIEluaXRpYWxpemF0aW9uKipcblxuUmlnaHQsIHNvIEkndmUgc3BvdHRlZCBzb21ldGhpbmcgaW50ZXJlc3RpbmcgaW4gdGhlIGtlcm5lbCdzIG1lbW9yeSBtYW5hZ2VtZW50IGR1cmluZyBpbml0aWFsaXphdGlvbjogdGhlIGBOT0RFX0RBVEFgIHN0cnVjdHVyZSBpcyBiZWluZyBwcmVhbGxvY2F0ZWQuIFRoYXQncyBnb29kLCBlZmZpY2llbnQgZXZlbiDigJMgYXZvaWRpbmcgZHluYW1pYyBhbGxvY2F0aW9uIHdoZXJlIHBvc3NpYmxlIGlzIGFsd2F5cyBhIHBsdXMuIEhvd2V2ZXIsIHRoZXJlJ3MgYSBrZXkgZGV0YWlsIHRvIHJlbWVtYmVyOiBpdCdzIHByZWFsbG9jYXRlZCwgYnV0IGl0cyAqaW50ZXJuYWwqIHN0YXRlIGlzbid0IGZ1bGx5IHNldCB1cCB5ZXQuIFRoYXQgc3VidGxlIGRpc3RpbmN0aW9uIGlzIG9mdGVuIHdoZXJlIHRoZSByZWFsIGZ1biBiZWdpbnMuXG5cbkkgbmVlZCB0byB1bmRlcnN0YW5kIHdoYXQncyBoYXBwZW5pbmcgaW50ZXJuYWxseSwgc28gbGV0J3MgZGlnIGludG8gdGhlIGBmcmVlX2FyZWFfaW5pdGAgZnVuY3Rpb24uIFNwZWNpZmljYWxseSwgbGluZXMgMTg1MC0xODgwIGluIGBtbS9tbV9pbml0LmNgIGFyZSBteSB0YXJnZXQ7IEkgbmVlZCB0byBzZWUgKmV4YWN0bHkqIGhvdyB0aGUgZnJlZSBhcmVhIHN0cnVjdHVyZXMgd2l0aGluIHRoYXQgYE5PREVfREFUQWAgYXJlIGJlaW5nIGluaXRpYWxpemVkLCBhbmQgSSBzdXNwZWN0IHRoYXQncyB3aGVyZSB0aGUgXCJpbmNvbXBsZXRlXCIgcGFydCBJJ20gc2VlaW5nIGlzIHJlbGF0ZWQuIFVuZGVyc3RhbmRpbmcgdGhhdCBzZXR1cCBpcyBjcml0aWNhbCwgZXNwZWNpYWxseSB3aGVuIGRlYWxpbmcgd2l0aCB0aGUgaW50cmljYWNpZXMgb2YgaG93IHRoZSBtZW1vcnkgbWFuYWdlbWVudCBpcyBkb25lIGVhcmx5IG9uIGluIGJvb3QtdXAuIEknbSBnb2luZyB0byBsb29rIGZvciBhbnkgbG9naWMgcmVsYXRlZCB0byBpbml0aWFsaXppbmcgdGhlIHpvbmUgc3RydWN0dXJlcywgc2V0dGluZyB1cCB0aGUgZnJlZWxpc3RzLCBhbmQgaGFuZGxpbmcgdGhlIHBhZ2UgZnJhbWUgc3RydWN0dXJlcy4gVGhhdCBpbml0aWFsIHN0YXRlIGlzIGNydWNpYWwgZm9yIG92ZXJhbGwgc3lzdGVtIHN0YWJpbGl0eSBhbmQgcGVyZm9ybWFuY2UgbGF0ZXIgb24uXG5cblxuIiwiSW5wdXRUb2tlbnMiOjMzNTIyLCJPdXRwdXRUb2tlbnMiOjM2LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NjAsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0xNFQwNzo1NjozMC45NzU4NDM1OVoiLCJTZXEiOjkyLCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyMDAxMjAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwibW0vbW1faW5pdC5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDE4NTAsXG4gIFwiTGluZUNvdW50XCI6IDM1XG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIjE4NTA6XFx0XFx0XFx0XFx0KHU2NClzdGFydF9wZm4gXFx1MDAzY1xcdTAwM2MgUEFHRV9TSElGVCxcXG4xODUxOlxcdFxcdFxcdFxcdCgodTY0KWVuZF9wZm4gXFx1MDAzY1xcdTAwM2MgUEFHRV9TSElGVCkgLSAxKTtcXG4xODUyOlxcdFxcbjE4NTM6XFx0XFx0LyogSW5pdGlhbGlzZSBldmVyeSBub2RlICovXFxuMTg1NDpcXHRcXHRtbWluaXRfdmVyaWZ5X3BhZ2VmbGFnc19sYXlvdXQoKTtcXG4xODU1OlxcdFxcdHNldHVwX25yX25vZGVfaWRzKCk7XFxuMTg1NjpcXHRcXHRzZXRfcGFnZWJsb2NrX29yZGVyKCk7XFxuMTg1NzpcXHRcXG4xODU4OlxcdFxcdGZvcl9lYWNoX25vZGUobmlkKSB7XFxuMTg1OTpcXHRcXHRcXHRwZ19kYXRhX3QgKnBnZGF0O1xcbjE4NjA6XFx0XFxuMTg2MTpcXHRcXHRcXHQvKlxcbjE4NjI6XFx0XFx0XFx0ICogSWYgYW4gYXJjaGl0ZWN0dXJlIGhhcyBub3QgYWxsb2NhdGVkIG5vZGUgZGF0YSBmb3JcXG4xODYzOlxcdFxcdFxcdCAqIHRoaXMgbm9kZSwgcHJlc3VtZSB0aGUgbm9kZSBpcyBtZW1vcnlsZXNzIG9yIG9mZmxpbmUuXFxuMTg2NDpcXHRcXHRcXHQgKi9cXG4xODY1OlxcdFxcdFxcdGlmICghTk9ERV9EQVRBKG5pZCkpXFxuMTg2NjpcXHRcXHRcXHRcXHRhbGxvY19vZmZsaW5lX25vZGVfZGF0YShuaWQpO1xcbjE4Njc6XFx0XFxuMTg2ODpcXHRcXHRcXHRwZ2RhdCA9IE5PREVfREFUQShuaWQpO1xcbjE4Njk6XFx0XFx0XFx0ZnJlZV9hcmVhX2luaXRfbm9kZShuaWQpO1xcbjE4NzA6XFx0XFxuMTg3MTpcXHRcXHRcXHQvKlxcbjE4NzI6XFx0XFx0XFx0ICogTm8gc3lzZnMgaGllcmFyY2h5IHdpbGwgYmUgY3JlYXRlZCB2aWEgcmVnaXN0ZXJfbm9kZSgpXFxuMTg3MzpcXHRcXHRcXHQgKmZvciBtZW1vcnktbGVzcyBub2RlIGJlY2F1c2UgaGVyZSBpdCdzIG5vdCBtYXJrZWQgYXMgTl9NRU1PUllcXG4xODc0OlxcdFxcdFxcdCAqYW5kIHdvbid0IGJlIHNldCBvbmxpbmUgbGF0ZXIuIFRoZSBiZW5lZml0IGlzIHVzZXJzcGFjZVxcbjE4NzU6XFx0XFx0XFx0ICpwcm9ncmFtIHdvbid0IGJlIGNvbmZ1c2VkIGJ5IHN5c2ZzIGZpbGVzL2RpcmVjdG9yaWVzIG9mXFxuMTg3NjpcXHRcXHRcXHQgKm1lbW9yeS1sZXNzIG5vZGUuIFRoZSBwZ2RhdCB3aWxsIGdldCBmdWxseSBpbml0aWFsaXplZCBieVxcbjE4Nzc6XFx0XFx0XFx0ICpob3RhZGRfaW5pdF9wZ2RhdCgpIHdoZW4gbWVtb3J5IGlzIGhvdHBsdWdnZWQgaW50byB0aGlzIG5vZGUuXFxuMTg3ODpcXHRcXHRcXHQgKi9cXG4xODc5OlxcdFxcdFxcdGlmIChwZ2RhdC1cXHUwMDNlbm9kZV9wcmVzZW50X3BhZ2VzKSB7XFxuMTg4MDpcXHRcXHRcXHRcXHRub2RlX3NldF9zdGF0ZShuaWQsIE5fTUVNT1JZKTtcXG4xODgxOlxcdFxcdFxcdFxcdGNoZWNrX2Zvcl9tZW1vcnkocGdkYXQpO1xcbjE4ODI6XFx0XFx0XFx0fVxcbjE4ODM6XFx0XFx0fVxcbjE4ODQ6XFx0XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTE0VDA3OjU2OjMwLjk3NjA0NjZaIiwiU2VxIjo5MywiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjgtZmxhc2giLCJEdXJhdGlvbiI6ODE0NTI0NDcyNCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgaGVyZSdzIG15IGludGVycHJldGF0aW9uIG9mIHdoYXQncyBnb2luZyBvbiwgdGhpbmtpbmcgdGhyb3VnaCB0aGlzIGFzIEkgd291bGQ6XG5cbioqRXhhbWluaW5nIGBhbGxvY19vZmZsaW5lX25vZGVfZGF0YShuaWQpYCoqXG5cbkFscmlnaHQsIGxldCdzIGRpdmUgaW50byB0aGlzIGZ1bmN0aW9uLCBgYWxsb2Nfb2ZmbGluZV9ub2RlX2RhdGEobmlkKWAuIE15IGluaXRpYWwgdGhvdWdodCBpcyB0byB1bmRlcnN0YW5kIGl0cyBwdXJwb3NlLiBcIk9mZmxpbmUgbm9kZSBkYXRhXCIgc3VnZ2VzdHMgd2UncmUgZGVhbGluZyB3aXRoIGRhdGEgcmVsYXRlZCB0byBhIG5vZGUsIHdoaWNoLCBmb3Igc29tZSByZWFzb24sIGlzIGN1cnJlbnRseSBvZmZsaW5lLiBTbywgbXkgcHJpbWFyeSBnb2FsIGlzIHRvIGRpc3NlY3Qgd2hhdCBzcGVjaWZpYyBhbGxvY2F0aW9ucyBhcmUgaGFwcGVuaW5nIHdpdGhpbiB0aGlzIGZ1bmN0aW9uIGFuZCBob3cgdGhleSByZWxhdGUgdG8gdGhlIG9mZmxpbmUgc3RhdGUgb2YgdGhlIG5vZGUgaWRlbnRpZmllZCBieSB0aGUgYG5pZGAgKG5vZGUgSUQpLiBJJ2xsIGJlIGxvb2tpbmcgZm9yIG1lbW9yeSBhbGxvY2F0aW9uIHBhdHRlcm5zIGFuZCBjaGVja2luZyB3aGF0IHRoaXMgZnVuY3Rpb24gYWN0dWFsbHkgKmRvZXMqIHdpdGggdGhhdCBtZW1vcnkuIEVzc2VudGlhbGx5LCBJIHdhbnQgdG8gdW5kZXJzdGFuZCBob3cgaXQncyBwcmVwYXJpbmcgcmVzb3VyY2VzIGZvciBhIG5vZGUgdGhhdCBpc24ndCBhY3RpdmVseSBwYXJ0aWNpcGF0aW5nIGF0IHRoZSBtb21lbnQsIGFuZCBJJ2xsIGZvY3VzIG9uIGFueXRoaW5nIHJlbGF0ZWQgdG8ga2VlcGluZyB0aGF0IGRhdGEgcmVhZHkgZm9yIHdoZW4gdGhlIG5vZGUgY29tZXMgYmFjayBvbmxpbmUuIEknbGwgbmVlZCB0byBmb2N1cyBvbiB3aGF0IGhhcHBlbnMgdG8gbWVtb3J5IGJlaW5nIGFsbG9jYXRlZCwgYnV0IG15IHVsdGltYXRlIGdvYWwgaXMgdG8gdW5kZXJzdGFuZCBob3cgdGhlIHN5c3RlbSBtYW5hZ2VzIHRoaXMgb2ZmbGluZSBub2RlJ3MgZGF0YS5cblxuXG4iLCJJbnB1dFRva2VucyI6MzQ0MzUsIk91dHB1dFRva2VucyI6MjksIk91dHB1dFRob3VnaHRzVG9rZW5zIjoyOSwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTE0VDA3OjU2OjM5LjEyMTI5NDI2NFoiLCJTZXEiOjk0LCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6ODE0MzkwNTksIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiYWxsb2Nfb2ZmbGluZV9ub2RlX2RhdGFcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwibW0vXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm1tL21tX2luaXQuYz0xNzkwPXN0YXRpYyB2b2lkIF9faW5pdCBmcmVlX2FyZWFfaW5pdCh2b2lkKVxcbi0tXFxubW0vbW1faW5pdC5jLTE4NjUtXFx0XFx0aWYgKCFOT0RFX0RBVEEobmlkKSlcXG5tbS9tbV9pbml0LmM6MTg2NjpcXHRcXHRcXHRhbGxvY19vZmZsaW5lX25vZGVfZGF0YShuaWQpO1xcbm1tL21tX2luaXQuYy0xODY3LVxcbi0tXFxubW0vbnVtYS5jPTEyPXZvaWQgX19pbml0IGFsbG9jX25vZGVfZGF0YShpbnQgbmlkKVxcbi0tXFxubW0vbnVtYS5jLTM0LVxcbm1tL251bWEuYzozNTp2b2lkIF9faW5pdCBhbGxvY19vZmZsaW5lX25vZGVfZGF0YShpbnQgbmlkKVxcbm1tL251bWEuYy0zNi17XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTE0VDA3OjU2OjM5LjIwMjc0MDg3M1oiLCJTZXEiOjk1LCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuOC1mbGFzaCIsIkR1cmF0aW9uIjoyNTc0ODYwNjI5NSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgbGV0J3MgZGl2ZSBpbnRvIHRoaXMuIEhlcmUncyBteSB0YWtlIG9uIHRob3NlIGluaXRpYWwgdGhvdWdodHM6XG5cbioqUGVlcmluZyBpbnRvIHRoZSBDb3JlIG9mIE1lbW9yeSBNYW5hZ2VtZW50OiBUaGUgYG1tL251bWEuY2AgRmlsZSoqXG5cbkFscmlnaHQsIHNvIHRoZSBmaXJzdCB0aGluZyB0aGF0IHBvcHMgaW50byBteSBoZWFkIGlzLCBcIk9rYXksIGxldCdzIHRha2UgYSBsb29rIGF0IGBtbS9udW1hLmNgLlwiIEl0J3MgYSBmdW5kYW1lbnRhbCBmaWxlIGluIExpbnV4J3MgbWVtb3J5IG1hbmFnZW1lbnQgc3lzdGVtLCBwYXJ0aWN1bGFybHkgZm9jdXNpbmcgb24gTm9uLVVuaWZvcm0gTWVtb3J5IEFjY2VzcyAoTlVNQSkgYXJjaGl0ZWN0dXJlcy4gTXkgbWluZCBpbW1lZGlhdGVseSBiZWdpbnMgdG8gY2h1cm4gdGhyb3VnaCB0aGUgaW1wbGljYXRpb25zOiBOVU1BIGlzIGFsbCBhYm91dCBvcHRpbWl6aW5nIG1lbW9yeSBhY2Nlc3Mgc3BlZWQuIFdpdGggbXVsdGlwbGUgbWVtb3J5IG5vZGVzLCBhbmQgcG90ZW50aWFsbHkgdW5ldmVuIGFjY2VzcyB0aW1lcywgZ2V0dGluZyB0aGUgcmlnaHQgZGF0YSB0byB0aGUgcmlnaHQgQ1BVIGF0IHRoZSByaWdodCB0aW1lIGlzIGNydWNpYWwuIEkgZXhwZWN0IHRoaXMgZmlsZSB0byBjb250YWluIGFsbCB0aGUgY29yZSByb3V0aW5lcyBmb3IgbWVtb3J5IGFsbG9jYXRpb24sIHBsYWNlbWVudCwgYW5kIG1pZ3JhdGlvbiB3aXRoaW4gYSBOVU1BIHN5c3RlbS4gSSdtIHByb2JhYmx5IGdvaW5nIHRvIHNlZSBmdW5jdGlvbnMgcmVsYXRlZCB0byBub2RlIHNlbGVjdGlvbiwgcG9saWN5IGVuZm9yY2VtZW50LCBhbmQgbWF5YmUgZXZlbiBzb21lIHRvcG9sb2d5LWF3YXJlIGFsbG9jYXRpb24gc3RyYXRlZ2llcy4gSSBhbSB2ZXJ5IGludGVyZXN0ZWQgdG8gc2VlIHRoZSBkZXRhaWxzLiBJIHdpbGwgZGl2ZSByaWdodCBpbi5cblxuXG4iLCJJbnB1dFRva2VucyI6MzQ5MDMsIk91dHB1dFRva2VucyI6MzMsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxMiwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0xNFQwNzo1NzowNC45NTEzNTA1MjhaIiwiU2VxIjo5NiwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTQ3ODMxLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcIm1tL251bWEuY1wiLFxuICBcIkZpcnN0TGluZVwiOiAxMixcbiAgXCJMaW5lQ291bnRcIjogNDBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiICAxMjpcXHR2b2lkIF9faW5pdCBhbGxvY19ub2RlX2RhdGEoaW50IG5pZClcXG4gIDEzOlxcdHtcXG4gIDE0OlxcdFxcdGNvbnN0IHNpemVfdCBuZF9zaXplID0gcm91bmR1cChzaXplb2YocGdfZGF0YV90KSwgU01QX0NBQ0hFX0JZVEVTKTtcXG4gIDE1OlxcdFxcdHU2NCBuZF9wYTtcXG4gIDE2OlxcdFxcdGludCB0bmlkO1xcbiAgMTc6XFx0XFxuICAxODpcXHRcXHQvKiBBbGxvY2F0ZSBub2RlIGRhdGEuICBUcnkgbm9kZS1sb2NhbCBtZW1vcnkgYW5kIHRoZW4gYW55IG5vZGUuICovXFxuICAxOTpcXHRcXHRuZF9wYSA9IG1lbWJsb2NrX3BoeXNfYWxsb2NfdHJ5X25pZChuZF9zaXplLCBTTVBfQ0FDSEVfQllURVMsIG5pZCk7XFxuICAyMDpcXHRcXHRpZiAoIW5kX3BhKVxcbiAgMjE6XFx0XFx0XFx0cGFuaWMoXFxcIkNhbm5vdCBhbGxvY2F0ZSAlenUgYnl0ZXMgZm9yIG5vZGUgJWQgZGF0YVxcXFxuXFxcIixcXG4gIDIyOlxcdFxcdFxcdCAgICAgIG5kX3NpemUsIG5pZCk7XFxuICAyMzpcXHRcXG4gIDI0OlxcdFxcdC8qIHJlcG9ydCBhbmQgaW5pdGlhbGl6ZSAqL1xcbiAgMjU6XFx0XFx0cHJfaW5mbyhcXFwiTk9ERV9EQVRBKCVkKSBhbGxvY2F0ZWQgW21lbSAlIzAxMEx4LSUjMDEwTHhdXFxcXG5cXFwiLCBuaWQsXFxuICAyNjpcXHRcXHRcXHRuZF9wYSwgbmRfcGEgKyBuZF9zaXplIC0gMSk7XFxuICAyNzpcXHRcXHR0bmlkID0gZWFybHlfcGZuX3RvX25pZChuZF9wYSBcXHUwMDNlXFx1MDAzZSBQQUdFX1NISUZUKTtcXG4gIDI4OlxcdFxcdGlmICh0bmlkICE9IG5pZClcXG4gIDI5OlxcdFxcdFxcdHByX2luZm8oXFxcIiAgICBOT0RFX0RBVEEoJWQpIG9uIG5vZGUgJWRcXFxcblxcXCIsIG5pZCwgdG5pZCk7XFxuICAzMDpcXHRcXG4gIDMxOlxcdFxcdG5vZGVfZGF0YVtuaWRdID0gX192YShuZF9wYSk7XFxuICAzMjpcXHRcXHRtZW1zZXQoTk9ERV9EQVRBKG5pZCksIDAsIHNpemVvZihwZ19kYXRhX3QpKTtcXG4gIDMzOlxcdH1cXG4gIDM0OlxcdFxcbiAgMzU6XFx0dm9pZCBfX2luaXQgYWxsb2Nfb2ZmbGluZV9ub2RlX2RhdGEoaW50IG5pZClcXG4gIDM2OlxcdHtcXG4gIDM3OlxcdFxcdHBnX2RhdGFfdCAqcGdkYXQ7XFxuICAzODpcXHRcXHRub2RlX2RhdGFbbmlkXSA9IG1lbWJsb2NrX2FsbG9jX29yX3BhbmljKHNpemVvZigqcGdkYXQpLCBTTVBfQ0FDSEVfQllURVMpO1xcbiAgMzk6XFx0fVxcbiAgNDA6XFx0XFxuICA0MTpcXHQvKiBTdHViIGZ1bmN0aW9uczogKi9cXG4gIDQyOlxcdFxcbiAgNDM6XFx0I2lmbmRlZiBtZW1vcnlfYWRkX3BoeXNhZGRyX3RvX25pZFxcbiAgNDQ6XFx0aW50IG1lbW9yeV9hZGRfcGh5c2FkZHJfdG9fbmlkKHU2NCBzdGFydClcXG4gIDQ1OlxcdHtcXG4gIDQ2OlxcdFxcdHByX2luZm9fb25jZShcXFwiVW5rbm93biBvbmxpbmUgbm9kZSBmb3IgbWVtb3J5IGF0IDB4JWxseCwgYXNzdW1pbmcgbm9kZSAwXFxcXG5cXFwiLFxcbiAgNDc6XFx0XFx0XFx0XFx0c3RhcnQpO1xcbiAgNDg6XFx0XFx0cmV0dXJuIDA7XFxuICA0OTpcXHR9XFxuICA1MDpcXHRFWFBPUlRfU1lNQk9MX0dQTChtZW1vcnlfYWRkX3BoeXNhZGRyX3RvX25pZCk7XFxuICA1MTpcXHQjZW5kaWZcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTRUMDc6NTc6MDQuOTUxNTAzMTQ4WiIsIlNlcSI6OTcsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy44LWZsYXNoIiwiRHVyYXRpb24iOjU5NjgzNzU5MTkyLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyBQb3RlbnRpYWwgVW5pbml0aWFsaXplZCBNZW1vcnkgQWNjZXNzZXMqKlxuXG5Pa2F5LCBzbyBJJ20gbG9va2luZyBhdCB0aGlzIHBhdGNoIGFuZCB0cnlpbmcgdG8gYXNzZXNzIGl0cyBpbXBhY3QuIEJvdGggYG1lbXNldGAgd2l0aCB6ZXJvIGFuZCBgbWVtYmxvY2tfYWxsb2Nfb3JfcGFuaWNgIGVuc3VyZSB0aGUgbWVtb3J5IGlzIGluaXRpYWxpemVkIHRvIHplcm8sIHNvIHRoYXQgcGFydCBpcyBmaW5lLiBgcGFnZXNfd2l0aF9vbmxpbmVfbWVtbWFwYCBzdGFydHMgYXQgemVyby4gTXkgcHJpbWFyeSBjb25jZXJuIGhlcmUgaXMgaWYgdGhpcyBjaGFuZ2UgY291bGQgaW50cm9kdWNlIGFueSB1bmluaXRpYWxpemVkIG1lbW9yeSBhY2Nlc3Nlcy5cblxuVGhlIHBhdGNoIHRyYWNrcyB3aGV0aGVyIGFsbCBwYWdlcyB3aXRoaW4gYSB6b25lJ3Mgc3BhbiBoYXZlIGFuIG9ubGluZSBtZW1tYXAsIHNwZWNpZmljYWxseSBjb21wYXJpbmcgYHNwYW5uZWRfcGFnZXNgIHdpdGggYHBhZ2VzX3dpdGhfb25saW5lX21lbW1hcGAuIFdoZW4gdGhleSdyZSBlcXVhbCwgaXQgc2V0cyBgem9uZS1cdTAwM2Vjb250aWd1b3VzYCB0byB0cnVlLiBOb3csIGlmIHRoZSB6b25lIGlzIGVycm9uZW91c2x5IG1hcmtlZCBjb250aWd1b3VzIHdoZW4gaXQgaXNuJ3QsIHRoaW5ncyBjb3VsZCBnZXQgaGFpcnkuIExldCdzIGxvb2sgYXQgYHBhZ2VibG9ja19wZm5fdG9fcGFnZWA6XG5cbklmIHRoZSB6b25lIGlzIG1pc3Rha2VubHkgbWFya2VkIGNvbnRpZ3VvdXMsIGl0IHdpbGwgdGFrZSB0aGUgYHBmbl90b19wYWdlYCBicmFuY2gsIGltbWVkaWF0ZWx5IHJldHVybmluZyBhIGBzdHJ1Y3QgcGFnZWAgd2l0aG91dCB0aGUgdXN1YWwgY2hlY2tzIGZvciBgcGZuX3ZhbGlkKClgIG9yIGBwZm5fdG9fb25saW5lX3BhZ2UoKWAuIEFuIGludmFsaWQgYHN0YXJ0X3BmbmAsIGFuIG91dC1vZi1ib3VuZHMgYWNjZXNzLCBvciBkZXJlZmVyZW5jaW5nIGEgbm9uLWV4aXN0ZW50IHBhZ2UgZnJhbWUgaXMgYSByZWNpcGUgZm9yIGEgY3Jhc2gsIGEgcGFnZSBmYXVsdCwgb3IgYXQgbGVhc3QgYSBLQVNBTiBhbGVydCBvbiBhbiBvdXQtb2YtYm91bmRzIGFjY2Vzcy5cblxuQnV0IHdhaXQsIHdoYXQgYWJvdXQgdGhlIGBzdHJ1Y3QgcGFnZWAgaXRzZWxmPyBJbiBtZW1vcnkgaG9sZXMsIGBpbml0X3VuYXZhaWxhYmxlX3JhbmdlYCAqZG9lcyogaW5pdGlhbGl6ZSB0aGUgYHN0cnVjdCBwYWdlYCB3aGVuIGl0J3Mgc3VwcG9zZWQgdG8gYmUgdGhlcmUuIEl0IHNldHMgaXQgdXAgdXNpbmcgYF9faW5pdF9zaW5nbGVfcGFnZWAsIGFuZCBzZXRzIGl0IGFzIHJlc2VydmVkLiBIb3dldmVyLCBpZiB0aGUgbWVtbWFwIHdhc24ndCBpbml0aWFsaXplZCwgb3IgdGhlIGFyZWEgaXMgdW5tYXBwZWQsIGFueSBhY2Nlc3Mgd291bGQgdHJpZ2dlciBhIHBhZ2UgZmF1bHQsIHdoaWNoIHRoZSBrZXJuZWwncyBmYXVsdCBoYW5kbGVyIG9yIEtBU0FOIHNob3VsZCBjYXRjaC5cblxuQnV0LCBkb2VzIEtNU0FOIHRyYWNrIHRoZSBgc3RydWN0IHBhZ2VgIG1ldGFkYXRhPyBObywgaXQgZG9lc24ndC4gS01TQU4gc3BlY2lmaWNhbGx5IGV4Y2x1ZGVzIGBzdHJ1Y3QgcGFnZWAgbWV0YWRhdGEsIHNvIHRoYXQgd29uJ3QgaGVscC4gSSBuZWVkIHRvIGtlZXAgaW4gbWluZCwgS01TQU4gZG9lcyBub3QgdHJhY2sgc2hhZG93IGZvciBzdHJ1Y3QgcGFnZSBvciBtZXRhZGF0YSBwYWdlcy4gVGhlcmVmb3JlLCB0aGUgbWVtb3J5IGFjY2VzcyBjb3VsZCBiZSBwcm9ibGVtYXRpYyBpZiB0aGlzIHBhdGNoIG1lc3NlcyB1cCB0aGUgYHpvbmUtXHUwMDNlY29udGlndW91c2AgZmxhZy5cblxuXG4iLCJJbnB1dFRva2VucyI6MzU4MDgsIk91dHB1dFRva2VucyI6MzAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo1NDYsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0xNFQwNzo1ODowNC42MzUyNjU1MjlaIiwiU2VxIjo5OCwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjQ0NjMzODY5LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImttc2FuX2dldF9tZXRhZGF0YVwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJtbS9rbXNhblwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJtbS9rbXNhbi9jb3JlLmM9ODA9dm9pZCBrbXNhbl9pbnRlcm5hbF9tZW1tb3ZlX21ldGFkYXRhKHZvaWQgKmRzdCwgdm9pZCAqc3JjLCBzaXplX3QgbilcXG4tLVxcbm1tL2ttc2FuL2NvcmUuYy04OS1cXG5tbS9rbXNhbi9jb3JlLmM6OTA6XFx0c2hhZG93X2RzdCA9IGttc2FuX2dldF9tZXRhZGF0YShkc3QsIEtNU0FOX01FVEFfU0hBRE9XKTtcXG5tbS9rbXNhbi9jb3JlLmMtOTEtXFx0aWYgKCFzaGFkb3dfZHN0KVxcbi0tXFxubW0va21zYW4vY29yZS5jLTk2LVxcbm1tL2ttc2FuL2NvcmUuYzo5NzpcXHRzaGFkb3dfc3JjID0ga21zYW5fZ2V0X21ldGFkYXRhKHNyYywgS01TQU5fTUVUQV9TSEFET1cpO1xcbm1tL2ttc2FuL2NvcmUuYy05OC1cXHRpZiAoIXNoYWRvd19zcmMpIHtcXG4tLVxcbm1tL2ttc2FuL2NvcmUuYy0xMDQtXFxubW0va21zYW4vY29yZS5jOjEwNTpcXHRvcmlnaW5fZHN0ID0ga21zYW5fZ2V0X21ldGFkYXRhKGRzdCwgS01TQU5fTUVUQV9PUklHSU4pO1xcbm1tL2ttc2FuL2NvcmUuYzoxMDY6XFx0b3JpZ2luX3NyYyA9IGttc2FuX2dldF9tZXRhZGF0YShzcmMsIEtNU0FOX01FVEFfT1JJR0lOKTtcXG5tbS9rbXNhbi9jb3JlLmMtMTA3LVxcdEtNU0FOX1dBUk5fT04oIW9yaWdpbl9kc3QgfHwgIW9yaWdpbl9zcmMpO1xcbi0tXFxubW0va21zYW4vY29yZS5jPTE5MT12b2lkIGttc2FuX2ludGVybmFsX3NldF9zaGFkb3dfb3JpZ2luKHZvaWQgKmFkZHIsIHNpemVfdCBzaXplLCBpbnQgYixcXG4tLVxcbm1tL2ttc2FuL2NvcmUuYy0xOTktXFx0S01TQU5fV0FSTl9PTigha21zYW5fbWV0YWRhdGFfaXNfY29udGlndW91cyhhZGRyLCBzaXplKSk7XFxubW0va21zYW4vY29yZS5jOjIwMDpcXHRzaGFkb3dfc3RhcnQgPSBrbXNhbl9nZXRfbWV0YWRhdGEoYWRkciwgS01TQU5fTUVUQV9TSEFET1cpO1xcbm1tL2ttc2FuL2NvcmUuYy0yMDEtXFx0aWYgKCFzaGFkb3dfc3RhcnQpIHtcXG4tLVxcbm1tL2ttc2FuL2NvcmUuYy0yMjQtXFx0b3JpZ2luX3N0YXJ0ID1cXG5tbS9rbXNhbi9jb3JlLmM6MjI1OlxcdFxcdCh1MzIgKilrbXNhbl9nZXRfbWV0YWRhdGEoKHZvaWQgKilhZGRyZXNzLCBLTVNBTl9NRVRBX09SSUdJTik7XFxubW0va21zYW4vY29yZS5jLTIyNi1cXG4tLVxcbm1tL2ttc2FuL2NvcmUuYz0yNTM9dm9pZCBrbXNhbl9pbnRlcm5hbF9jaGVja19tZW1vcnkodm9pZCAqYWRkciwgc2l6ZV90IHNpemUsXFxuLS1cXG5tbS9rbXNhbi9jb3JlLmMtMjY5LVxcdFxcdFxcdFxcdCBQQUdFX1NJWkUgLSAoKGFkZHI2NCArIHBvcykgJSBQQUdFX1NJWkUpKTtcXG5tbS9rbXNhbi9jb3JlLmM6MjcwOlxcdFxcdHNoYWRvdyA9IGttc2FuX2dldF9tZXRhZGF0YSgodm9pZCAqKShhZGRyNjQgKyBwb3MpLFxcbm1tL2ttc2FuL2NvcmUuYy0yNzEtXFx0XFx0XFx0XFx0XFx0ICAgIEtNU0FOX01FVEFfU0hBRE9XKTtcXG4tLVxcbm1tL2ttc2FuL2NvcmUuYy0zMDEtXFx0XFx0XFx0fVxcbm1tL2ttc2FuL2NvcmUuYzozMDI6XFx0XFx0XFx0b3JpZ2luID0ga21zYW5fZ2V0X21ldGFkYXRhKCh2b2lkICopKGFkZHI2NCArIHBvcyArIGkpLFxcbm1tL2ttc2FuL2NvcmUuYy0zMDMtXFx0XFx0XFx0XFx0XFx0XFx0ICAgIEtNU0FOX01FVEFfT1JJR0lOKTtcXG4tLVxcbm1tL2ttc2FuL2NvcmUuYz0zMjk9Ym9vbCBrbXNhbl9tZXRhZGF0YV9pc19jb250aWd1b3VzKHZvaWQgKmFkZHIsIHNpemVfdCBzaXplKVxcbi0tXFxubW0va21zYW4vY29yZS5jLTM0NC1cXG5tbS9rbXNhbi9jb3JlLmM6MzQ1OlxcdGN1cl9zaGFkb3cgPSBrbXNhbl9nZXRfbWV0YWRhdGEoKHZvaWQgKiljdXJfYWRkciwgLyppc19vcmlnaW4qLyBmYWxzZSk7XFxubW0va21zYW4vY29yZS5jLTM0Ni1cXHRpZiAoIWN1cl9zaGFkb3cpXFxubW0va21zYW4vY29yZS5jLTM0Ny1cXHRcXHRhbGxfdW50cmFja2VkID0gdHJ1ZTtcXG5tbS9rbXNhbi9jb3JlLmM6MzQ4OlxcdGN1cl9vcmlnaW4gPSBrbXNhbl9nZXRfbWV0YWRhdGEoKHZvaWQgKiljdXJfYWRkciwgLyppc19vcmlnaW4qLyB0cnVlKTtcXG5tbS9rbXNhbi9jb3JlLmMtMzQ5LVxcdGlmIChhbGxfdW50cmFja2VkIFxcdTAwMjZcXHUwMDI2IGN1cl9vcmlnaW4pXFxuLS1cXG5tbS9rbXNhbi9jb3JlLmMtMzU0LVxcdCAgICAgY3VyX29yaWdpbiA9IG5leHRfb3JpZ2luLCBuZXh0X2FkZHIgKz0gUEFHRV9TSVpFKSB7XFxubW0va21zYW4vY29yZS5jOjM1NTpcXHRcXHRuZXh0X3NoYWRvdyA9IGttc2FuX2dldF9tZXRhZGF0YSgodm9pZCAqKW5leHRfYWRkciwgZmFsc2UpO1xcbm1tL2ttc2FuL2NvcmUuYzozNTY6XFx0XFx0bmV4dF9vcmlnaW4gPSBrbXNhbl9nZXRfbWV0YWRhdGEoKHZvaWQgKiluZXh0X2FkZHIsIHRydWUpO1xcbm1tL2ttc2FuL2NvcmUuYy0zNTctXFx0XFx0aWYgKGFsbF91bnRyYWNrZWQpIHtcXG4tLVxcbm1tL2ttc2FuL2NvcmUuYy0zNzgtXFx0ICAgICAgIG5leHRfb3JpZ2luKTtcXG5tbS9rbXNhbi9jb3JlLmM6Mzc5OlxcdG9yaWdpbl9wID0ga21zYW5fZ2V0X21ldGFkYXRhKGFkZHIsIEtNU0FOX01FVEFfT1JJR0lOKTtcXG5tbS9rbXNhbi9jb3JlLmMtMzgwLVxcdGlmIChvcmlnaW5fcCkge1xcbi0tXFxubW0va21zYW4vaG9va3MuYz0xMjU9c3RhdGljIHVuc2lnbmVkIGxvbmcgdm1hbGxvY19zaGFkb3codW5zaWduZWQgbG9uZyBhZGRyKVxcbm1tL2ttc2FuL2hvb2tzLmMtMTI2LXtcXG5tbS9rbXNhbi9ob29rcy5jOjEyNzpcXHRyZXR1cm4gKHVuc2lnbmVkIGxvbmcpa21zYW5fZ2V0X21ldGFkYXRhKCh2b2lkICopYWRkcixcXG5tbS9rbXNhbi9ob29rcy5jLTEyOC1cXHRcXHRcXHRcXHRcXHRcXHQgS01TQU5fTUVUQV9TSEFET1cpO1xcbi0tXFxubW0va21zYW4vaG9va3MuYz0xMzE9c3RhdGljIHVuc2lnbmVkIGxvbmcgdm1hbGxvY19vcmlnaW4odW5zaWduZWQgbG9uZyBhZGRyKVxcbm1tL2ttc2FuL2hvb2tzLmMtMTMyLXtcXG5tbS9rbXNhbi9ob29rcy5jOjEzMzpcXHRyZXR1cm4gKHVuc2lnbmVkIGxvbmcpa21zYW5fZ2V0X21ldGFkYXRhKCh2b2lkICopYWRkcixcXG5tbS9rbXNhbi9ob29rcy5jLTEzNC1cXHRcXHRcXHRcXHRcXHRcXHQgS01TQU5fTUVUQV9PUklHSU4pO1xcbi0tXFxubW0va21zYW4vaW5zdHJ1bWVudGF0aW9uLmM9MjI9c3RhdGljIGlubGluZSBib29sIGlzX2JhZF9hc21fYWRkcih2b2lkICphZGRyLCB1aW50cHRyX3Qgc2l6ZSwgYm9vbCBpc19zdG9yZSlcXG4tLVxcbm1tL2ttc2FuL2luc3RydW1lbnRhdGlvbi5jLTI2LVxcdFxcdHJldHVybiB0cnVlO1xcbm1tL2ttc2FuL2luc3RydW1lbnRhdGlvbi5jOjI3OlxcdGlmICgha21zYW5fZ2V0X21ldGFkYXRhKGFkZHIsIEtNU0FOX01FVEFfU0hBRE9XKSlcXG5tbS9rbXNhbi9pbnN0cnVtZW50YXRpb24uYy0yOC1cXHRcXHRyZXR1cm4gdHJ1ZTtcXG4tLVxcbm1tL2ttc2FuL3NoYWRvdy5jPTgyPXN0cnVjdCBzaGFkb3dfb3JpZ2luX3B0ciBrbXNhbl9nZXRfc2hhZG93X29yaWdpbl9wdHIodm9pZCAqYWRkcmVzcywgdTY0IHNpemUsXFxuLS1cXG5tbS9rbXNhbi9zaGFkb3cuYy05Ny1cXHRLTVNBTl9XQVJOX09OKCFrbXNhbl9tZXRhZGF0YV9pc19jb250aWd1b3VzKGFkZHJlc3MsIHNpemUpKTtcXG5tbS9rbXNhbi9zaGFkb3cuYzo5ODpcXHRzaGFkb3cgPSBrbXNhbl9nZXRfbWV0YWRhdGEoYWRkcmVzcywgS01TQU5fTUVUQV9TSEFET1cpO1xcbm1tL2ttc2FuL3NoYWRvdy5jLTk5LVxcdGlmICghc2hhZG93KVxcbi0tXFxubW0va21zYW4vc2hhZG93LmMtMTAyLVxcdHJldC5zaGFkb3cgPSBzaGFkb3c7XFxubW0va21zYW4vc2hhZG93LmM6MTAzOlxcdHJldC5vcmlnaW4gPSBrbXNhbl9nZXRfbWV0YWRhdGEoYWRkcmVzcywgS01TQU5fTUVUQV9PUklHSU4pO1xcbm1tL2ttc2FuL3NoYWRvdy5jLTEwNC1cXHRyZXR1cm4gcmV0O1xcbi0tXFxubW0va21zYW4vc2hhZG93LmMtMTI0LSAqL1xcbm1tL2ttc2FuL3NoYWRvdy5jOjEyNTp2b2lkICprbXNhbl9nZXRfbWV0YWRhdGEodm9pZCAqYWRkcmVzcywgYm9vbCBpc19vcmlnaW4pXFxubW0va21zYW4vc2hhZG93LmMtMTI2LXtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTRUMDc6NTg6MDQuNjc5OTA2ODM5WiIsIlNlcSI6OTksIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy44LWZsYXNoIiwiRHVyYXRpb24iOjY0MzU5ODY3MjgsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGhlcmUncyBteSBpbnRlcnByZXRhdGlvbiBvZiBcIkxldCdzIHNlZSBga21zYW5fZ2V0X21ldGFkYXRhYFwiIGZyb20gYW4gZXhwZXJ0J3MgcGVyc3BlY3RpdmUsIHByZXNlbnRlZCBpbiB0aGUgZmlyc3QgcGVyc29uOlxuXG4qKkFuYWx5emluZyBga21zYW5fZ2V0X21ldGFkYXRhYCoqXG5cbkFscmlnaHQsIHNvIHRoZSBmaXJzdCB0aGluZyB0aGF0IGp1bXBzIG91dCBhdCBtZSBpcyB0aGF0IHdlJ3JlIHRhbGtpbmcgYWJvdXQgYGttc2FuX2dldF9tZXRhZGF0YWAuIE15IGluaXRpYWwgdGhvdWdodCBpcywgXCJXaGF0IHNwZWNpZmljYWxseSBhcmUgd2UgZXhhbWluaW5nICp3aXRoaW4qIHRoaXMgZnVuY3Rpb24/XCIgQXJlIHdlIGxvb2tpbmcgYXQgaXRzIGltcGxlbWVudGF0aW9uLCBpdHMgdXNhZ2UsIGl0cyBpbnRlcmFjdGlvbiB3aXRoIG90aGVyIHBhcnRzIG9mIHRoZSBjb2RlYmFzZSwgb3IgbWF5YmUgZXZlbiBkZWJ1Z2dpbmcgaXQ/IENvbnNpZGVyaW5nIEknbSBhbiBleHBlcnQsIG15IG1pbmQgaW1tZWRpYXRlbHkgc3RhcnRzIGNhdGFsb2dpbmcgdGhlIHBvdGVudGlhbCBhcmVhcyBvZiBpbnRlcmVzdC4gSXMgdGhpcyByZWxhdGVkIHRvIGtleSBtYW5hZ2VtZW50PyBJcyBpdCBzZWN1cml0eS1zZW5zaXRpdmU/IFdoYXQgY29udGV4dCBpcyB0aGlzIG9wZXJhdGluZyB3aXRoaW4/IERvZXMgaXQgaW52b2x2ZSBoYXJkd2FyZSBzZWN1cml0eSBtb2R1bGVzP1xuXG5JIGltbWVkaWF0ZWx5IHdhbnQgdG8gZGl2ZSBkZWVwZXIuIFwiV2hhdCdzIHRoZSBnb2FsIGhlcmU/IFdoYXQgcHJvYmxlbSBhcmUgd2UgdHJ5aW5nIHRvIHNvbHZlIG9yIHVuZGVyc3RhbmQ/XCIgSSdtIG1lbnRhbGx5IHBhcnNpbmcgdGhlIG5hbWUgLSAqa21zYW4qIC0gb2theSwgbGlrZWx5IEtleSBNYW5hZ2VtZW50IFNlcnZpY2UsIGFuZCAqbWV0YWRhdGEqIC0gSSdtIHdvbmRlcmluZyBpZiB0aGlzIGdpdmVzIHVzIGluZm8gYWJvdXQga2V5cy4gVGhlIHVzZSBvZiBLTVNhbiBpbXBsaWVzIGEgZm9jdXMgb24gc2VjdXJpdHksIG1lbW9yeSBzYWZldHksIG9yIHBlcmhhcHMgZXZlbiBmdXp6aW5nLCB3aGljaCBtZWFucyB0aGUgbWV0YWRhdGEgbWlnaHQgYmUgYWJvdXQgb2JqZWN0cywgb3duZXJzaGlwLCBvciBhbGxvY2F0aW9uIHRoYXQgYXJlIGNydWNpYWwgZm9yIGRldGVjdGluZyBtZW1vcnkgY29ycnVwdGlvbiB2dWxuZXJhYmlsaXRpZXMuXG5cbk15IG1pbmQgaXMgbm93IHByaW1lZCB0byBsb29rIGZvciBjbHVlczogV2hhdCdzIHRoZSBsYW5ndWFnZT8gSXMgaXQgQywgQysrLCBSdXN0LCBvciBzb21ldGhpbmcgZWxzZT8gQXJlIHRoZXJlIGFueSBvYnZpb3VzIGFyY2hpdGVjdHVyYWwgcGF0dGVybnMgb3IgZnJhbWV3b3JrcyBpbiB1c2U/IEknbSBhbHJlYWR5IGFudGljaXBhdGluZyBwb3NzaWJsZSBpc3N1ZXMsIHN1Y2ggYXMgcmFjZSBjb25kaXRpb25zLCB1bmluaXRpYWxpemVkIG1lbW9yeSByZWFkcywgb3IgaW5mb3JtYXRpb24gbGVha3MuIEknbSByZWFkeSB0byBhcHBseSBteSBhY2N1bXVsYXRlZCBrbm93bGVkZ2UgYW5kIGFuYWx5dGljYWwgc2tpbGxzIHRvIGRpc3NlY3QgdGhpcyBmdW5jdGlvbiBhbmQgZ2FpbiBhIGNsZWFyIHVuZGVyc3RhbmRpbmcgb2YgaXRzIHJvbGUgYW5kIGJlaGF2aW9yLiBTbywgbGV0J3MgZ2V0IGludG8gaXQuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjM4NTUwLCJPdXRwdXRUb2tlbnMiOjM2LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTIsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMTRUMDc6NTg6MTEuMTE1ODk2NzM3WiIsIlNlcSI6MTAwLCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo4NDkwMCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJtbS9rbXNhbi9zaGFkb3cuY1wiLFxuICBcIkZpcnN0TGluZVwiOiAxMjQsXG4gIFwiTGluZUNvdW50XCI6IDQwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIiAxMjQ6XFx0ICovXFxuIDEyNTpcXHR2b2lkICprbXNhbl9nZXRfbWV0YWRhdGEodm9pZCAqYWRkcmVzcywgYm9vbCBpc19vcmlnaW4pXFxuIDEyNjpcXHR7XFxuIDEyNzpcXHRcXHR1NjQgYWRkciA9ICh1NjQpYWRkcmVzcywgb2ZmO1xcbiAxMjg6XFx0XFx0c3RydWN0IHBhZ2UgKnBhZ2U7XFxuIDEyOTpcXHRcXHR2b2lkICpyZXQ7XFxuIDEzMDpcXHRcXG4gMTMxOlxcdFxcdGlmIChpc19vcmlnaW4pXFxuIDEzMjpcXHRcXHRcXHRhZGRyID0gQUxJR05fRE9XTihhZGRyLCBLTVNBTl9PUklHSU5fU0laRSk7XFxuIDEzMzpcXHRcXHRhZGRyZXNzID0gKHZvaWQgKilhZGRyO1xcbiAxMzQ6XFx0XFx0aWYgKGttc2FuX2ludGVybmFsX2lzX3ZtYWxsb2NfYWRkcihhZGRyZXNzKSB8fFxcbiAxMzU6XFx0XFx0ICAgIGttc2FuX2ludGVybmFsX2lzX21vZHVsZV9hZGRyKGFkZHJlc3MpKVxcbiAxMzY6XFx0XFx0XFx0cmV0dXJuICh2b2lkICopdm1hbGxvY19tZXRhKGFkZHJlc3MsIGlzX29yaWdpbik7XFxuIDEzNzpcXHRcXG4gMTM4OlxcdFxcdHJldCA9IGFyY2hfa21zYW5fZ2V0X21ldGFfb3JfbnVsbChhZGRyZXNzLCBpc19vcmlnaW4pO1xcbiAxMzk6XFx0XFx0aWYgKHJldClcXG4gMTQwOlxcdFxcdFxcdHJldHVybiByZXQ7XFxuIDE0MTpcXHRcXG4gMTQyOlxcdFxcdHBhZ2UgPSB2aXJ0X3RvX3BhZ2Vfb3JfbnVsbChhZGRyZXNzKTtcXG4gMTQzOlxcdFxcdGlmICghcGFnZSlcXG4gMTQ0OlxcdFxcdFxcdHJldHVybiBOVUxMO1xcbiAxNDU6XFx0XFx0aWYgKCFwYWdlX2hhc19tZXRhZGF0YShwYWdlKSlcXG4gMTQ2OlxcdFxcdFxcdHJldHVybiBOVUxMO1xcbiAxNDc6XFx0XFx0b2ZmID0gb2Zmc2V0X2luX3BhZ2UoYWRkcik7XFxuIDE0ODpcXHRcXG4gMTQ5OlxcdFxcdHJldHVybiAoaXNfb3JpZ2luID8gb3JpZ2luX3B0cl9mb3IocGFnZSkgOiBzaGFkb3dfcHRyX2ZvcihwYWdlKSkgKyBvZmY7XFxuIDE1MDpcXHR9XFxuIDE1MTpcXHRcXG4gMTUyOlxcdHZvaWQga21zYW5fY29weV9wYWdlX21ldGEoc3RydWN0IHBhZ2UgKmRzdCwgc3RydWN0IHBhZ2UgKnNyYylcXG4gMTUzOlxcdHtcXG4gMTU0OlxcdFxcdGlmICgha21zYW5fZW5hYmxlZCB8fCBrbXNhbl9pbl9ydW50aW1lKCkpXFxuIDE1NTpcXHRcXHRcXHRyZXR1cm47XFxuIDE1NjpcXHRcXHRpZiAoIWRzdCB8fCAhcGFnZV9oYXNfbWV0YWRhdGEoZHN0KSlcXG4gMTU3OlxcdFxcdFxcdHJldHVybjtcXG4gMTU4OlxcdFxcdGlmICghc3JjIHx8ICFwYWdlX2hhc19tZXRhZGF0YShzcmMpKSB7XFxuIDE1OTpcXHRcXHRcXHRrbXNhbl9pbnRlcm5hbF91bnBvaXNvbl9tZW1vcnkocGFnZV9hZGRyZXNzKGRzdCksIFBBR0VfU0laRSxcXG4gMTYwOlxcdFxcdFxcdFxcdFxcdFxcdCAgICAgICAvKmNoZWNrZWQqLyBmYWxzZSk7XFxuIDE2MTpcXHRcXHRcXHRyZXR1cm47XFxuIDE2MjpcXHRcXHR9XFxuIDE2MzpcXHRcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTRUMDc6NTg6MTEuMTE1OTgzOTU3WiIsIlNlcSI6MTAxLCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuOC1mbGFzaCIsIkR1cmF0aW9uIjoyNjY4NTgxOTUyLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgYSBzdW1tYXJ5IG9mIG15IHRob3VnaHQgcHJvY2VzcywgYXMgcmVxdWVzdGVkOlxuXG4qKkNoZWNraW5nIGB2aXJ0X3RvX3BhZ2Vfb3JfbnVsbGAqKlxuXG5Pa2F5LCB0aW1lIHRvIGRpdmUgaW50byBgdmlydF90b19wYWdlX29yX251bGxgLiBNeSBmaXJzdCBpbnN0aW5jdCBpcyB0byBjb25maXJtIHRoYXQgSSdtIGRlYWxpbmcgd2l0aCB0aGUgY29ycmVjdCBmdW5jdGlvbi4gSSdsbCBtZW50YWxseSBydW4gdGhyb3VnaCB0aGUgdHlwaWNhbCBzY2VuYXJpb3Mgd2hlcmUgSSdkICp1c2UqIHRoaXMg4oCTIHZpcnR1YWwgYWRkcmVzcyB0byBwYWdlIG1hcHBpbmcsIGRlYWxpbmcgd2l0aCBwb3RlbnRpYWwgTlVMTCBwb2ludGVycyBmb3Igc2FmZXR5LCB0aGUgaW5oZXJlbnQgcG90ZW50aWFsIGZvciBmYWlsdXJlcyBpbiB0aGUgbWFwcGluZyBwcm9jZXNzLi4uIFJpZ2h0LCB0aGF0IGxpbmVzIHVwLiBcblxuTm93LCBJIG5lZWQgdG8gY29uc2lkZXIgcG90ZW50aWFsIHByb2JsZW1zLiBDb3VsZCB0aGVyZSBiZSBhbiBpc3N1ZSB3aXRoIGhvdyBpdCBoYW5kbGVzIHVubWFwcGVkIHJlZ2lvbnM/IEFyZSB0aGVyZSBhbnkga25vd24gY29ybmVyIGNhc2VzIHdoZXJlIGl0IG1pZ2h0IHJldHVybiBhbiB1bmV4cGVjdGVkIHZhbHVlPyBNYXliZSBhIGJ1ZyByZWxhdGVkIHRvIHNwZWNpZmljIGFyY2hpdGVjdHVyZXMgb3IgbWVtb3J5IG1vZGVscz8gSSdsbCBuZWVkIHRvIHJlbWVtYmVyIHRoYXQgdGhpcyBmdW5jdGlvbiBpcyBrZXJuZWwtbGV2ZWwgc28gdGhlcmUncyBwb3RlbnRpYWwgZm9yIGFsbCBzb3J0cyBvZiB3ZWlyZCBpbnRlcmFjdGlvbnMgd2l0aCBvdGhlciBzdWJzeXN0ZW1zIHRoYXQgSSBtaWdodCBuZWVkIHRvIGFjY291bnQgZm9yLiBJIG5lZWQgdG8gYmUgc3VyZSB0byB0aGluayBhYm91dCB0aGUgY29uc2VxdWVuY2VzIGlmIHRoaXMgcmV0dXJucyBgTlVMTGAgdW5leHBlY3RlZGx5IC0gd2hhdCB3b3VsZCB0aGF0IGRvIHRvIHRoZSBjb2RlIGZ1cnRoZXIgZG93biB0aGUgbGluZT8gRG9lcyBpdCBoYW5kbGUgTlVNQSBjb3JyZWN0bHk/IEkgc2hvdWxkIHByb2JhYmx5IGRvdWJsZS1jaGVjayBpdHMgaW50ZXJhY3Rpb24gd2l0aCB0aGUgcGFnZSBjYWNoZSwgdG9vLiBPa2F5LCBsZXQncyBzdGFydCBkaWdnaW5nIGRlZXBlciBhbmQgc2VlIHdoYXQgdGhlIGNvZGUgc2F5cy5cblxuXG4iLCJJbnB1dFRva2VucyI6Mzk1NzAsIk91dHB1dFRva2VucyI6MzEsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxNSwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTE0VDA3OjU4OjEzLjc4NDU2ODE5OVoiLCJTZXEiOjEwMiwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjQ3NDg5MTU5LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcInZpcnRfdG9fcGFnZV9vcl9udWxsXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIm1tL1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJtbS9rbXNhbi9zaGFkb3cuYz01Nj1zdGF0aWMgdW5zaWduZWQgbG9uZyB2bWFsbG9jX21ldGEodm9pZCAqYWRkciwgYm9vbCBpc19vcmlnaW4pXFxuLS1cXG5tbS9rbXNhbi9zaGFkb3cuYy03My1cXG5tbS9rbXNhbi9zaGFkb3cuYzo3NDpzdGF0aWMgc3RydWN0IHBhZ2UgKnZpcnRfdG9fcGFnZV9vcl9udWxsKHZvaWQgKnZhZGRyKVxcbm1tL2ttc2FuL3NoYWRvdy5jLTc1LXtcXG4tLVxcbm1tL2ttc2FuL3NoYWRvdy5jPTEyNT12b2lkICprbXNhbl9nZXRfbWV0YWRhdGEodm9pZCAqYWRkcmVzcywgYm9vbCBpc19vcmlnaW4pXFxuLS1cXG5tbS9rbXNhbi9zaGFkb3cuYy0xNDEtXFxubW0va21zYW4vc2hhZG93LmM6MTQyOlxcdHBhZ2UgPSB2aXJ0X3RvX3BhZ2Vfb3JfbnVsbChhZGRyZXNzKTtcXG5tbS9rbXNhbi9zaGFkb3cuYy0xNDMtXFx0aWYgKCFwYWdlKVxcbi0tXFxubW0va21zYW4vc2hhZG93LmM9Mjc2PXZvaWQgX19pbml0IGttc2FuX2luaXRfYWxsb2NfbWV0YV9mb3JfcmFuZ2Uodm9pZCAqc3RhcnQsIHZvaWQgKmVuZClcXG4tLVxcbm1tL2ttc2FuL3NoYWRvdy5jLTI4OC1cXHRmb3IgKHU2NCBhZGRyID0gMDsgYWRkciBcXHUwMDNjIHNpemU7IGFkZHIgKz0gUEFHRV9TSVpFKSB7XFxubW0va21zYW4vc2hhZG93LmM6Mjg5OlxcdFxcdHBhZ2UgPSB2aXJ0X3RvX3BhZ2Vfb3JfbnVsbCgoY2hhciAqKXN0YXJ0ICsgYWRkcik7XFxubW0va21zYW4vc2hhZG93LmMtMjkwLVxcdFxcdHNoYWRvd19wID0gdmlydF90b19wYWdlKChjaGFyICopc2hhZG93ICsgYWRkcik7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTE0VDA3OjU4OjEzLjgzMjA2MzYzOVoiLCJTZXEiOjEwMywiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjgtZmxhc2giLCJEdXJhdGlvbiI6MzQzOTUwNjEzMSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIGEgZmlyc3QtcGVyc29uIHN1bW1hcnksIHRhaWxvcmVkIGFzIHJlcXVlc3RlZDpcblxuKipEZWNvbnN0cnVjdGluZyBgdmlydF90b19wYWdlX29yX251bGxgKipcblxuT2theSwgbGV0J3MgZGl2ZSBpbnRvIGB2aXJ0X3RvX3BhZ2Vfb3JfbnVsbGAuIEFzIGFuIGV4cGVydCBpbiBteSBmaWVsZCwgbXkgaW1tZWRpYXRlIHRob3VnaHQgaXMgdG8gZGlzc2VjdCB3aGF0IHRoaXMgZnVuY3Rpb24gaXMgKnJlYWxseSogdHJ5aW5nIHRvIGFjY29tcGxpc2guIFRoZSBuYW1lIGl0c2VsZiBpcyBmYWlybHkgZGVzY3JpcHRpdmUsIGJ1dCBJIGtub3cgYmV0dGVyIHRoYW4gdG8gdGFrZSB0aGF0IGF0IGZhY2UgdmFsdWUuIEknbSBhbHJlYWR5IHRoaW5raW5nIGFib3V0IHBvdGVudGlhbCBlZGdlIGNhc2VzOiB3aGF0IHNjZW5hcmlvcyBtaWdodCBjYXVzZSBpdCB0byByZXR1cm4gTlVMTD8gSXMgaXQgZGVhbGluZyB3aXRoIGtlcm5lbCB2aXJ0dWFsIGFkZHJlc3NlcywgdXNlci1zcGFjZSB2aXJ0dWFsIGFkZHJlc3Nlcywgb3IgYm90aD8gQXJlIHRoZXJlIGFueSBhcmNoaXRlY3R1cmFsIGRlcGVuZGVuY2llcyBiYWtlZCBpbnRvIGl0cyBpbXBsZW1lbnRhdGlvbj9cblxuSSdtIG1lbnRhbGx5IG1hcHBpbmcgb3V0IHRoZSB0eXBpY2FsIGFkZHJlc3MgdHJhbnNsYXRpb24gcHJvY2VzcyBpbiBteSBoZWFkLiBJJ20gYXNzdW1pbmcgaXQncyBwcm9iYWJseSB1c2luZyB0aGUgcGFnZSB0YWJsZXMgYW5kIHRoZSBNTVUgdG8gbWFwIGEgdmlydHVhbCBhZGRyZXNzIHRvIGEgcGh5c2ljYWwgcGFnZSwgb3IgYXQgbGVhc3QgYXR0ZW1wdGluZyB0by4gU28sIHRoZSBxdWVzdGlvbiBpcyBob3cgaXQgZGVhbHMgd2l0aCBmYWlsdXJlcy4gRG9lcyBpdCBoYW5kbGUgdW5tYXBwZWQgbWVtb3J5IGdyYWNlZnVsbHksIG9yIGRvZXMgaXQgdHJ5IHRvIGRvIHNvbWV0aGluZyBlbHNlPyBEb2VzIGl0IGhhdmUgYW55IGltcGxpY2F0aW9ucyBmb3IgbWVtb3J5IGFsbG9jYXRpb24gb3IgZGVhbGxvY2F0aW9uP1xuXG5JJ20gYWxzbyB3b25kZXJpbmcgaWYgaXQncyB0aHJlYWQtc2FmZS4gSWYgbXVsdGlwbGUgdGhyZWFkcyBhcmUgY2FsbGluZyBpdCBjb25jdXJyZW50bHksIEkgbmVlZCB0byBrbm93IGhvdyBpdCBoYW5kbGVzIHRoYXQuIERvZXMgaXQgdXNlIGxvY2tzPyBEb2VzIGl0IG1ha2UgYW55IGFzc3VtcHRpb25zIGFib3V0IHRoZSBjYWxsaW5nIGNvbnRleHQ/IEFyZSB0aGVyZSBhbnkgcG90ZW50aWFsIHJhY2UgY29uZGl0aW9ucyBJIG5lZWQgdG8gd29ycnkgYWJvdXQ/XG5cbkknbSBtZW50YWxseSBjb21wYXJpbmcgaXQgdG8gc2ltaWxhciBmdW5jdGlvbnMgSSd2ZSB3b3JrZWQgd2l0aCBpbiB0aGUgcGFzdC4gV2hhdCdzIHRoZSBrZXkgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoaXMgYW5kIHNvbWV0aGluZyBsaWtlIGB2aXJ0X3RvX3BhZ2VgPyBXaHkgdGhlIFwib3IgbnVsbFwiIHBhcnQ/IFdoYXQncyB0aGUgY29zdCBvZiB0aGUgbnVsbCBjaGVjayB2ZXJzdXMgdGhlIG92ZXJoZWFkIG9mIHRoZSBhY3R1YWwgbWFwcGluZyBwcm9jZXNzP1xuXG5JJ20gYWxyZWFkeSBmb3JtdWxhdGluZyBxdWVzdGlvbnMgaW4gbXkgaGVhZDogV2hhdCBpcyBpdHMgdHlwaWNhbCB1c2FnZSBwYXR0ZXJuPyBXaGF0IGFyZSB0aGUgaW1wbGljYXRpb25zIGlmIHRoaXMgZnVuY3Rpb24gcmV0dXJucyBudWxsPyBIb3cgd291bGQgaXQgYWZmZWN0IHRoZSBzeXN0ZW0ncyBwZXJmb3JtYW5jZSwgaWYgaXQgcmV0dXJucyBudWxsIGZyZXF1ZW50bHk/IFxuSSdtIHJlYWR5IHRvIGRpZyBpbnRvIHRoZSBjb2RlIGl0c2VsZiBub3cuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjQwMjIwLCJPdXRwdXRUb2tlbnMiOjM1LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTMsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMTRUMDc6NTg6MTcuMjcxNTc1NjdaIiwiU2VxIjoxMDQsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjEzMDcwMCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJtbS9rbXNhbi9zaGFkb3cuY1wiLFxuICBcIkZpcnN0TGluZVwiOiA3MCxcbiAgXCJMaW5lQ291bnRcIjogMjBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiICA3MDpcXHRcXHR9XFxuICA3MTpcXHRcXHRyZXR1cm4gMDtcXG4gIDcyOlxcdH1cXG4gIDczOlxcdFxcbiAgNzQ6XFx0c3RhdGljIHN0cnVjdCBwYWdlICp2aXJ0X3RvX3BhZ2Vfb3JfbnVsbCh2b2lkICp2YWRkcilcXG4gIDc1OlxcdHtcXG4gIDc2OlxcdFxcdGlmIChrbXNhbl92aXJ0X2FkZHJfdmFsaWQodmFkZHIpKVxcbiAgNzc6XFx0XFx0XFx0cmV0dXJuIHZpcnRfdG9fcGFnZSh2YWRkcik7XFxuICA3ODpcXHRcXHRlbHNlXFxuICA3OTpcXHRcXHRcXHRyZXR1cm4gTlVMTDtcXG4gIDgwOlxcdH1cXG4gIDgxOlxcdFxcbiAgODI6XFx0c3RydWN0IHNoYWRvd19vcmlnaW5fcHRyIGttc2FuX2dldF9zaGFkb3dfb3JpZ2luX3B0cih2b2lkICphZGRyZXNzLCB1NjQgc2l6ZSxcXG4gIDgzOlxcdFxcdFxcdFxcdFxcdFxcdFxcdCAgICAgYm9vbCBzdG9yZSlcXG4gIDg0OlxcdHtcXG4gIDg1OlxcdFxcdHN0cnVjdCBzaGFkb3dfb3JpZ2luX3B0ciByZXQ7XFxuICA4NjpcXHRcXHR2b2lkICpzaGFkb3c7XFxuICA4NzpcXHRcXG4gIDg4OlxcdFxcdC8qXFxuICA4OTpcXHRcXHQgKiBFdmVuIGlmIHdlIHJlZGlyZWN0IHRoaXMgbWVtb3J5IGFjY2VzcyB0byB0aGUgZHVtbXkgcGFnZSwgaXQgd2lsbFxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xNFQwNzo1ODoxNy4yNzE3MTIzNFoiLCJTZXEiOjEwNSwiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjgtZmxhc2giLCJEdXJhdGlvbiI6NTE0ODA4NDcyMzgsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqS01TQU4gQXNzZXNzbWVudDogVGhpcyBQYXRjaCBTZXJpZXMgRG9lc24ndCBXYXJyYW50IEZ1enppbmcqKlxuXG5Pa2F5LCBsZXQncyBicmVhayB0aGlzIGRvd24uIE15IGluaXRpYWwgYXNzZXNzbWVudCBpcyB0aGF0IHRoaXMgcGF0Y2ggc2VyaWVzICphYnNvbHV0ZWx5KiBkb2VzIG5vdCByZXF1aXJlIEtNU0FOIGZ1enppbmcuIEl0J3MgYSBjbGVhciBcIk5lZWRzS01TQU49ZmFsc2VcIiBzaXR1YXRpb24sIGFuZCBJJ20gY29uZmlkZW50IGluIHRoYXQgY29uY2x1c2lvbi5cblxuRmlyc3QsIEkgbG9va2VkIGF0IHRoZSBjb3JlIGNoYW5nZXMuIFRoZSBsb2dpYyBzdXJyb3VuZGluZyBgem9uZV9pc19jb250aWd1b3VzYCwgYHNldF96b25lX2NvbnRpZ3VvdXNgLCBgY2xlYXJfem9uZV9jb250aWd1b3VzYCwgYW5kIHRoZSBuZXcgYHBhZ2VzX3dpdGhfb25saW5lX21lbW1hcGAgZmllbGQgaW4gYHN0cnVjdCB6b25lYCBhcmUgdGhlIHByaW1hcnkgZm9jdXMuIENydWNpYWxseSwgbm9uZSBvZiB0aGVzZSBjaGFuZ2VzIGludHJvZHVjZSBhbnkgZGlyZWN0IGludGVyYWN0aW9ucyB3aXRoIHVzZXIgc3BhY2UgdGhhdCBjb3VsZCBsZWFkIHRvIGluZm9ybWF0aW9uIGxlYWtzIG9yIHRoZSBleHBvc3VyZSBvZiB1bmluaXRpYWxpemVkIG1lbW9yeS4gS01TQU4ncyBtZXRhZGF0YSBsb2dpYyBpc24ndCB0b3VjaGVkIGhlcmUgZWl0aGVyLlxuXG5JIHRoZW4gd2VudCB0aHJvdWdoIHRoZSBmb3VyIEtNU0FOIGNyaXRlcmlhIG1ldGljdWxvdXNseTpcblxuMS4gICoqTm8gZGF0YSBzZW50IHRvIHVzZXIgc3BhY2UuKiogVGhlIHBhdGNoIGRvZXNuJ3QgbW9kaWZ5IGFueXRoaW5nIHBhc3NlZCB0byB1c2VyIHNwYWNlIHZpYSBgY29weV90b191c2VyYCwgYHB1dF91c2VyYCwgbmV0bGluaywgaW9jdGwsIHNvY2tldCBvcHRpb25zLCBvciBCUEYgYnVmZmVycy4gVGhhdCdzIGEgaHVnZSBjaGVjayBpbiB0aGUgXCJubyBLTVNBTiBuZWVkZWRcIiBib3guXG4yLiAgKipObyByZWxpYW5jZSBvbiB1bmluaXRpYWxpemVkIHZhcmlhYmxlcyBpbiBjb25kaXRpb25hbCBsb2dpYy4qKiBUaGUgYHBhZ2VzX3dpdGhfb25saW5lX21lbW1hcGAgZmllbGQgaXMgcGFydCBvZiBgc3RydWN0IHpvbmVgLCB3aGljaCBpcyAqYWx3YXlzKiB6ZXJvZWQgZHVyaW5nIG5vZGUgaW5pdGlhbGl6YXRpb24sIGFuZCBzdWJzZXF1ZW50bHkgdXBkYXRlZCBhcyBwYWdlcyBhcmUgaW5pdGlhbGl6ZWQvYWRkZWQuIEl0J3MgcHJvcGVybHkgdHJhY2tlZC4gTm8gcmVhZGluZyBvZiB1bmluaXRpYWxpemVkIHZhcmlhYmxlcyBoZXJlLlxuMy4gICoqTm8gY3JlYXRpb24gb2YgY29tcGxleCBkYXRhIHN0cnVjdHVyZXMgd2l0aCB1bmluaXRpYWxpemVkIGZpZWxkcy4qKiBUaGlzIHBhdGNoIGRvZXNuJ3QgaW50cm9kdWNlIGFueSBuZXcgdW5pbml0aWFsaXplZCBmaWVsZHMgdGhhdCBjb3VsZCBiZSByZWFkIGxhdGVyIGluIHJlYWNoYWJsZSBjb2RlIHBhdGhzLlxuNC4gICoqTm8gcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSBiZWluZyBhY2Nlc3NlZCB0aHJvdWdoIGJvdW5kcyBjaGVja3Mgb3IgbG9naWMuKiogVGhlIGNoYW5nZSB0byBgcGFnZWJsb2NrX3Bmbl90b19wYWdlYCB1c2VzIGB6b25lX2lzX2NvbnRpZ3VvdXNgIG5vdy4gSWYgdGhlcmUgKndlcmUqIGEgYnVnLCBpdCB3b3VsZCByZXN1bHQgaW4gYHBhZ2VibG9ja19wZm5fdG9fcGFnZWAgcmV0dXJuaW5nIGEgYHN0cnVjdCBwYWdlYCBmb3IgYW4gb2ZmbGluZSBzZWN0aW9uLiBLQVNBTiBhbmQgcGFnZSBmYXVsdCBoYW5kbGVycyB3b3VsZCBjYXRjaCB0aGF0LCBiZWNhdXNlIGl0IHdvdWxkIGJlIGEgbWVtb3J5IGFjY2VzcyB2aW9sYXRpb24gb3IgYW4gaW52YWxpZCBwb2ludGVyIGRlcmVmZXJlbmNlIChvdXQgb2YgYm91bmRzKS4gSXQncyBub3QgYWJvdXQgcmVhZGluZyB1bmluaXRpYWxpemVkIG1lbW9yeS5cblxuVGhlIGd1aWRlbGluZXMgYXJlIGV4cGxpY2l0LiBUaGUgcmlzayBoZXJlIGlzIHByaW1hcmlseSByZWxhdGVkIHRvIHBvdGVudGlhbCBvdXQtb2YtYm91bmRzIGFjY2Vzcywgd2hpY2ggS0FTQU4sIExPQ0tERVAsIGFuZCBzdGFuZGFyZCBidWcgZGV0ZWN0b3JzIGFscmVhZHkgaGFuZGxlLiBUaGUgc3RydWN0dXJlcyBhcmUgKmZ1bGx5KiBpbml0aWFsaXplZC4gVGhlIHBhdGNoIGRvZXMgKm5vdCogaW50cm9kdWNlIGFueSByaXNrIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHVzYWdlIG9yIGluZm8tbGVha3MuXG5cbkkgZG91YmxlLWNoZWNrZWQgYWxsIHRoZSBpbnZvbHZlZCBmdW5jdGlvbnMsIHRvb2xzLCBhbmQgY2FsbHMgdG8gbWFrZSBzdXJlIEkgd2Fzbid0IG1pc3NpbmcgYW55dGhpbmcuIEV2ZXJ5dGhpbmcgY2hlY2tzIG91dC5cblxuU28sIHRoZSB2ZXJkaWN0IGlzIGNsZWFyLiBJJ20gZ29pbmcgdG8gc2V0IGBOZWVkc0tNU0FOPWZhbHNlYCBhbmQgcHJvdmlkZSB0aGlzIGRldGFpbGVkIGV4cGxhbmF0aW9uLiBUaGUgcmF0aW9uYWxlIGlzIHNvbGlkLlxuXG5cbiIsIklucHV0VG9rZW5zIjo0MDkyMSwiT3V0cHV0VG9rZW5zIjoyMzMsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxMDc4LCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMTRUMDc6NTk6MDguNzUyNTYzMjk4WiIsIlNlcSI6MTA2LCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJzZXQtcmVzdWx0cyIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjIyNDUwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggb3B0aW1pemVzIGNvbnRpZ3VvdXMgem9uZSBkZXRlY3Rpb24gYnkgaW50cm9kdWNpbmcgdGhlIGBwYWdlc193aXRoX29ubGluZV9tZW1tYXBgIGNvdW50ZXIgaW4gYHN0cnVjdCB6b25lYCB0byByZXBsYWNlIHRoZSBpdGVyYXRpb24gb3ZlciBwYWdlYmxvY2tzIGluIGBzZXRfem9uZV9jb250aWd1b3VzKClgLiBJdCBhbHNvIHJlZmFjdG9ycyBzdWJzZWN0aW9uIG92ZXJsYXAgY2hlY2tpbmcgZHVyaW5nIG1lbW9yeSBob3RwbHVnIG9wZXJhdGlvbnMgKGBkcml2ZXJzL2Jhc2UvbWVtb3J5LmNgLCBgbW0vbWVtb3J5X2hvdHBsdWcuY2AsIGBtbS9tbV9pbml0LmNgKS5cXG5cXG5Ob25lIG9mIHRoZSBjaGFuZ2VzIHRvdWNoIGtlcm5lbC10by11c2VyIGNvcHkgbWVjaGFuaXNtcyAoZS5nLiwgYGNvcHlfdG9fdXNlcmAsIG5ldGxpbmssIGlvY3RsLCBldGMuKSwgbm9yIGRvIHRoZXkgaW50cm9kdWNlIHVuaW5pdGlhbGl6ZWQgc3RhY2sgb3IgaGVhcCBhbGxvY2F0aW9ucy4gYHN0cnVjdCB6b25lYCBpbnN0YW5jZXMgYXJlIHplcm8taW5pdGlhbGl6ZWQgZHVyaW5nIGVhcmx5IGJvb3QgYW5kIGhvdHBsdWcgbm9kZSBhbGxvY2F0aW9uLiBBbnkgcG90ZW50aWFsIGxvZ2ljIGJ1Z3MgaW4gY29udGlndW91cyB6b25lIGNhbGN1bGF0aW9uIG9yIFBGTiB0cmF2ZXJzYWwgY291bGQgbGVhZCB0byBpbnZhbGlkIHN0cnVjdCBwYWdlIGRlcmVmZXJlbmNlcyBvciBvdXQtb2YtYm91bmRzIGFjY2Vzc2VzIGR1cmluZyBjb21wYWN0aW9uL3BhZ2UgaXNvbGF0aW9uLCB3aGljaCBmYWxsIHVuZGVyIHRoZSBwdXJ2aWV3IG9mIEtBU0FOIG9yIHN0YW5kYXJkIGZhdWx0IGhhbmRsZXJzLCBub3QgS01TQU4uIFRoZXJlZm9yZSwgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGlzIG5vdCB3YXJyYW50ZWQuXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiBmYWxzZVxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggb3B0aW1pemVzIGNvbnRpZ3VvdXMgem9uZSBkZXRlY3Rpb24gYnkgaW50cm9kdWNpbmcgdGhlIGBwYWdlc193aXRoX29ubGluZV9tZW1tYXBgIGNvdW50ZXIgaW4gYHN0cnVjdCB6b25lYCB0byByZXBsYWNlIHRoZSBpdGVyYXRpb24gb3ZlciBwYWdlYmxvY2tzIGluIGBzZXRfem9uZV9jb250aWd1b3VzKClgLiBJdCBhbHNvIHJlZmFjdG9ycyBzdWJzZWN0aW9uIG92ZXJsYXAgY2hlY2tpbmcgZHVyaW5nIG1lbW9yeSBob3RwbHVnIG9wZXJhdGlvbnMgKGBkcml2ZXJzL2Jhc2UvbWVtb3J5LmNgLCBgbW0vbWVtb3J5X2hvdHBsdWcuY2AsIGBtbS9tbV9pbml0LmNgKS5cXG5cXG5Ob25lIG9mIHRoZSBjaGFuZ2VzIHRvdWNoIGtlcm5lbC10by11c2VyIGNvcHkgbWVjaGFuaXNtcyAoZS5nLiwgYGNvcHlfdG9fdXNlcmAsIG5ldGxpbmssIGlvY3RsLCBldGMuKSwgbm9yIGRvIHRoZXkgaW50cm9kdWNlIHVuaW5pdGlhbGl6ZWQgc3RhY2sgb3IgaGVhcCBhbGxvY2F0aW9ucy4gYHN0cnVjdCB6b25lYCBpbnN0YW5jZXMgYXJlIHplcm8taW5pdGlhbGl6ZWQgZHVyaW5nIGVhcmx5IGJvb3QgYW5kIGhvdHBsdWcgbm9kZSBhbGxvY2F0aW9uLiBBbnkgcG90ZW50aWFsIGxvZ2ljIGJ1Z3MgaW4gY29udGlndW91cyB6b25lIGNhbGN1bGF0aW9uIG9yIFBGTiB0cmF2ZXJzYWwgY291bGQgbGVhZCB0byBpbnZhbGlkIHN0cnVjdCBwYWdlIGRlcmVmZXJlbmNlcyBvciBvdXQtb2YtYm91bmRzIGFjY2Vzc2VzIGR1cmluZyBjb21wYWN0aW9uL3BhZ2UgaXNvbGF0aW9uLCB3aGljaCBmYWxsIHVuZGVyIHRoZSBwdXJ2aWV3IG9mIEtBU0FOIG9yIHN0YW5kYXJkIGZhdWx0IGhhbmRsZXJzLCBub3QgS01TQU4uIFRoZXJlZm9yZSwgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGlzIG5vdCB3YXJyYW50ZWQuXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiBmYWxzZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9XTsKCQkJaWYgKCFyYXdEYXRhIHx8IHJhd0RhdGEubGVuZ3RoID09PSAwKSByZXR1cm47CgoJCQlkcmF3U3VtbWFyeVRhYmxlcyhyYXdEYXRhKTsKCQkJZHJhd0R1cmF0aW9uQ2hhcnQocmF3RGF0YSk7CgkJCWRyYXdUb2tlbkNvbnN1bXB0aW9uQ2hhcnQocmF3RGF0YSk7CgkJfQoKCQlmdW5jdGlvbiBkcmF3U3VtbWFyeVRhYmxlcyhyYXdEYXRhKSB7CgkJCWNvbnN0IHN0YXRzID0gewoJCQkJbGxtOiB7IGNvdW50OiAwLCB0b2tlbnM6IDAsIGR1cmF0aW9uOiAwIH0sCgkJCQl0b29sOiB7IGNvdW50OiAwLCBkdXJhdGlvbjogMCB9CgkJCX07CgoJCQlyYXdEYXRhLmZvckVhY2gocyA9PiB7CgkJCQljb25zdCBkdXIgPSBzLkR1cmF0aW9uIC8gMTAwMDAwMDAwMDsgCgkJCQlpZiAocy5UeXBlID09PSAibGxtIikgewoJCQkJCXN0YXRzLmxsbS5jb3VudCsrOwoJCQkJCXN0YXRzLmxsbS50b2tlbnMgKz0gKHMuSW5wdXRUb2tlbnMgKyBzLk91dHB1dFRva2VucyArIHMuT3V0cHV0VGhvdWdodHNUb2tlbnMpOwoJCQkJCXN0YXRzLmxsbS5kdXJhdGlvbiArPSBkdXI7CgkJCQl9IGVsc2UgaWYgKHMuVHlwZSA9PT0gInRvb2wiKSB7CgkJCQkJc3RhdHMudG9vbC5jb3VudCsrOwoJCQkJCXN0YXRzLnRvb2wuZHVyYXRpb24gKz0gZHVyOwoJCQkJfQoJCQl9KTsKCgkJCWNvbnN0IGF2Z0xsbUR1ciA9IHN0YXRzLmxsbS5jb3VudCA+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:nil,}