Name: series-workflowdrx5p Phase: Succeeded StartedAt: 2026-09-07 21:34:39 +0000 UTC FinishedAt: 2026-09-08 01:43:32 +0000 UTC Input: nil Output: nil --------- Name: series-workflowdrx5p[0] Phase: Succeeded StartedAt: 2026-09-07 21:34:39 +0000 UTC FinishedAt: 2026-09-07 21:56:29 +0000 UTC Input: nil Output: nil --------- Name: series-workflowdrx5p[0].run-triage Phase: Succeeded StartedAt: 2026-09-07 21:34:39 +0000 UTC FinishedAt: 2026-09-07 21:56:29 +0000 UTC Input: nil Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "skip_reason": "", "targets": [ { "base": { "arch": "amd64", "tree_name": "mm-new", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git", "commit_hash": "0d9ff90a5422cc7509258aaaba1e7481df4d332a", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "TRANSPARENT_HUGEPAGE" ], "series_id": "" }, "patched": { "arch": "amd64", "tree_name": "mm-new", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git", "commit_hash": "0d9ff90a5422cc7509258aaaba1e7481df4d332a", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "TRANSPARENT_HUGEPAGE" ], "series_id": "8331135f-f2e0-4800-bdcb-e79a8e626fce" }, "track": "KASAN", "fuzz": { "focus": null, "focus_symbols": [ "__thp_vma_allowable_orders", "vma_file_can_map_huge", "vma_file_bypass_thp_tuneables", "madvise_collapse" ], "corpus_urls": [ "https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db" ], "skip_cover_check": true, "bug_title_re": "" }, "retest": null } ], "trajectory": "CjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KPGhlYWQ+Cgk8dGl0bGU+QUkgVHJhamVjdG9yeTwvdGl0bGU+Cgk8c3R5bGU+CgkJdGFibGUgewoJCQlib3JkZXI6IDFweCBzb2xpZCAjY2NjOwoJCQltYXJnaW46IDIwcHggNXB4OwoJCQlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwoJCQl3aGl0ZS1zcGFjZTogbm93cmFwOwoJCQl0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKCQkJb3ZlcmZsb3c6IGhpZGRlbjsKCQl9CgoJCXRhYmxlIGNhcHRpb24gewoJCQlmb250LXdlaWdodDogYm9sZDsKCQl9CgoJCXRhYmxlIHRkLCB0YWJsZSB0aCB7CgkJCXZlcnRpY2FsLWFsaWduOiB0b3A7CgkJCXBhZGRpbmc6IDJweCA4cHg7CgkJCXRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwoJCQlvdmVyZmxvdzogaGlkZGVuOwoJCX0KCgkJLmxpc3RfdGFibGUgdGQsIC5saXN0X3RhYmxlIHRoIHsKCQkJYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjY2NjOwoJCX0KCgkJLmxpc3RfdGFibGUgdGggewoJCQliYWNrZ3JvdW5kOiAjRjRGNEY0OwoJCX0KCgkJLmxpc3RfdGFibGUgdHI6bnRoLWNoaWxkKDJuKSB7CgkJCWJhY2tncm91bmQ6ICNGNEY0RjQ7CgkJfQoKCQkubGlzdF90YWJsZSB0cjpob3ZlciB7CgkJCWJhY2tncm91bmQ6ICNmZmZmOTk7CgkJfQoKCQkjYWlfZGV0YWlsc19kaXYgcHJlIHsKCQkJbWFyZ2luOiAxcHg7CgkJCW1heC13aWR0aDogMTIwY2g7CgkJCXdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKCQkJb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKCQl9Cgk8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PgoJPGgxPkFJIFRyYWplY3Rvcnk8L2gxPgoJPGJyPgoKCQoJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQk8Y2FwdGlvbj5UcmFqZWN0b3J5OiAoPGEgaHJlZj0iIyIgb25jbGljaz0idG9nZ2xlQWxsRGV0YWlscygpOyByZXR1cm4gZmFsc2U7Ij5FeHBhbmQvQ29sbGFwc2UgQWxsPC9hPik8L2NhcHRpb24+CgkJPHRoZWFkPjx0cj4KCQkJPHRoPlNlcTwvdGg+CgkJCTx0aD5UaW1lc3RhbXA8L3RoPgoJCQk8dGg+VHlwZTwvdGg+CgkJCTx0aD5OYW1lPC90aD4KCQkJPHRoPkR1cmF0aW9uPC90aD4KCQk8L3RyPjwvdGhlYWQ+CgkJPHRib2R5PgoJCQoJCTx0cj4KCQkJPHRkPjAvMDwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA3IDIxOjU1PC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O1RSQU5TUEFSRU5UX0hVR0VQQUdFJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7X190aHBfdm1hX2FsbG93YWJsZV9vcmRlcnMmIzM0OywKICAgICYjMzQ7dm1hX2ZpbGVfY2FuX21hcF9odWdlJiMzNDssCiAgICAmIzM0O3ZtYV9maWxlX2J5cGFzc190aHBfdHVuZWFibGVzJiMzNDssCiAgICAmIzM0O21hZHZpc2VfY29sbGFwc2UmIzM0OwogIF0sCiAgJiMzNDtLTVNBTlJlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCByZWZhY3RvcnMgVEhQIChUcmFuc3BhcmVudCBIdWdlIFBhZ2UpIHBvbGljeSBjaGVja3MgZm9yIGZpbGUtYmFja2VkIGFuZCBzcGVjaWFsL1BGTk1BUCBWTUFzIGluIGBtbS9odWdlX21lbW9yeS5jYC4gSXQgYnJlYWtzIG91dCB0aGUgbG9naWMgZm9yIGNoZWNraW5nIFRIUCB0dW5hYmxlcyBhbmQgaHVnZSBwYWdlIHN1cHBvcnQgaW50byBoZWxwZXIgZnVuY3Rpb25zIChgdm1hX2ZpbGVfYnlwYXNzX3RocF90dW5lYWJsZXNgLCBgdm1hX2ZpbGVfYWxsb3dfdGhwX3R1bmVhYmxlc2AsIGB2bWFfZmlsZV9jaGVja190aHBfdHVuZWFibGVzYCwgYW5kIGB2bWFfZmlsZV9jYW5fbWFwX2h1Z2VgKSBhbmQgYWxsb3dzIFBGTk1BUCBWTUFzIHdpdGggYGh1Z2VfZmF1bHRgIGhhbmRsZXJzIHRvIGJ5cGFzcyBnbG9iYWwgVEhQIHR1bmFibGVzLlxuXG5Ob25lIG9mIHRoZSBjaGFuZ2VzIHRvdWNoIGJ1ZmZlciBjb3BpZXMgdG8gdXNlciBzcGFjZSwgdW5pbml0aWFsaXplZCBzdGFjayBvciBoZWFwIG1lbW9yeSwgb3IgbWVtb3J5IGFsbG9jYXRpb25zLiBBbGwgdmFyaWFibGVzIGFuZCBzdHJ1Y3QgbWVtYmVycyBldmFsdWF0ZWQgKHN1Y2ggYXMgYHZtYS1cdTAwM2V2bV9vcHNgLCBgdm1fZmxhZ3NgLCBhbmQgYHR5cGVgKSBhcmUgZnVsbHkgaW5pdGlhbGl6ZWQgYXJndW1lbnRzIG9yIHN0cnVjdHVyZSBmaWVsZHMuIFBvdGVudGlhbCBpc3N1ZXMgaW4gdGhpcyBjb2RlIHBhdGggKHN1Y2ggYXMgTlVMTCBwb2ludGVyIGRlcmVmZXJlbmNlcyBpZiBgdm1fb3BzYCB3ZXJlIE5VTEwpIGFyZSBkZXRlY3RlZCBieSBzdGFuZGFyZCBrZXJuZWwgZmF1bHQgaGFuZGxlcnMgYW5kIEtBU0FOLiBUaGVyZSBpcyBubyByaXNrIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHVzYWdlIG9yIGluZm9ybWF0aW9uIGxlYWtzIHRoYXQgd291bGQgcmVxdWlyZSBLTVNBTi4mIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UsCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggcmVmYWN0b3JzIGFuZCBhbHRlcnMgVEhQIChUcmFuc3BhcmVudCBIdWdlIFBhZ2UpIGFsbG93YWJsZSBvcmRlcnMgY2hlY2tpbmcgZm9yIGZpbGUtYmFja2VkIFZNQXMgaW4gbW0vaHVnZV9tZW1vcnkuYywgYWRkaW5nIGhlbHBlcnMgbGlrZSB2bWFfZmlsZV9jYW5fbWFwX2h1Z2UgYW5kIHZtYV9maWxlX2J5cGFzc190aHBfdHVuZWFibGVzLiBUaGlzIGNvcmUgbWVtb3J5IG1hbmFnZW1lbnQgbG9naWMgaXMgcmVhY2hhYmxlIHZpYSBzdGFuZGFyZCBzeXNjYWxscyBhbmQgaW50ZXJmYWNlcyBzdWNoIGFzIG1hZHZpc2UoTUFEVl9DT0xMQVBTRSksIHBhZ2UgZmF1bHQgaGFuZGxlcnMsIGFuZCAvcHJvYy9waWQvc21hcHMuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MS8xPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDcgMjE6NTU8L3RkPgoJCQk8dGQ+YWN0aW9uPC90ZD4KCQkJPHRkPnJlYWQtcGF0Y2gtZGlmZjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O1BhdGNoRGlmZiYjMzQ7OiAmIzM0O2NvbW1pdCA0MDdiOGU3YjZmOGFhNjI5NmJkOTc0YzdkOTI2ZWI3NTM5Yjc0Y2U2XG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIE1vbiBTZXAgNyAyMTo1NToxNiAyMDI2ICYjNDM7MDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS9tbS9odWdlX21lbW9yeS5jIGIvbW0vaHVnZV9tZW1vcnkuY1xuaW5kZXggYWZiYjU5NzRiZDIyNS4uNzVjMjA0YWY0MGNiZCAxMDA2NDRcbi0tLSBhL21tL2h1Z2VfbWVtb3J5LmNcbiYjNDM7JiM0MzsmIzQzOyBiL21tL2h1Z2VfbWVtb3J5LmNcbkBAIC05Miw3ICYjNDM7OTIsNyBAQCB1bnNpZ25lZCBsb25nIGh1Z2VfYW5vbl9vcmRlcnNfbWFkdmlzZSBfX3JlYWRfbW9zdGx5O1xuIHVuc2lnbmVkIGxvbmcgaHVnZV9hbm9uX29yZGVyc19pbmhlcml0IF9fcmVhZF9tb3N0bHk7XG4gc3RhdGljIGJvb2wgYW5vbl9vcmRlcnNfY29uZmlndXJlZCBfX2luaXRkYXRhO1xuIFxuLXN0YXRpYyBpbmxpbmUgYm9vbCBmaWxlX3RocF9lbmFibGVkKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKVxuJiM0MztzdGF0aWMgaW5saW5lIGJvb2wgZmlsZV90aHBfZW5hYmxlZChjb25zdCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSlcbiB7XG4gXHRzdHJ1Y3QgaW5vZGUgKmlub2RlO1xuIFxuQEAgLTExOCw2ICYjNDM7MTE4LDY3IEBAIHN0YXRpYyBib29sIHZtYV9pc19zcGVjaWFsX2h1Z2UoY29uc3Qgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpXG4gXHRyZXR1cm4gdm1hX3Rlc3RfYW55KHZtYSwgVk1BX1BGTk1BUF9CSVQsIFZNQV9NSVhFRE1BUF9CSVQpO1xuIH1cbiBcbiYjNDM7c3RhdGljIGJvb2wgdm1hX2ZpbGVfYnlwYXNzX3RocF90dW5lYWJsZXMoY29uc3Qgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4mIzQzO1x0XHRlbnVtIHR2YV90eXBlIHR5cGUpXG4mIzQzO3tcbiYjNDM7XHRjb25zdCBib29sIGhhc19odWdlX2ZhdWx0ID0gdm1hLVx1MDAzZXZtX29wcy1cdTAwM2VodWdlX2ZhdWx0O1xuJiM0MztcbiYjNDM7XHQvKiBNQURWX0NPTExBUFNFIGlnbm9yZXMgdHVuZWFibGVzLiAqL1xuJiM0MztcdGlmICh0eXBlID09IFRWQV9GT1JDRURfQ09MTEFQU0UpXG4mIzQzO1x0XHRyZXR1cm4gdHJ1ZTtcbiYjNDM7XHQvKiBIdWdlIFBGTiBtYXBwaW5ncyBhcmUgdW5jb21wYWN0YWJsZSBzbyB0aGUgcG9saWN5IGRvZXNuJiMzOTt0IGFwcGx5LiAqL1xuJiM0MztcdGlmICh2bWFfdGVzdCh2bWEsIFZNQV9QRk5NQVBfQklUKSBcdTAwMjZcdTAwMjYgaGFzX2h1Z2VfZmF1bHQpXG4mIzQzO1x0XHRyZXR1cm4gdHJ1ZTtcbiYjNDM7XHRyZXR1cm4gZmFsc2U7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBib29sIHZtYV9maWxlX2FsbG93X3RocF90dW5lYWJsZXModm1fZmxhZ3NfdCB2bV9mbGFncylcbiYjNDM7e1xuJiM0MztcdC8qIFRIUD1hbHdheXM/ICovXG4mIzQzO1x0aWYgKGh1Z2VwYWdlX2dsb2JhbF9hbHdheXMoKSlcbiYjNDM7XHRcdHJldHVybiB0cnVlO1xuJiM0MztcdC8qIFRIUD1tYWR2aXNlIGFuZCBtYXJrZWQgTUFEVl9IVUdFUEFHRT8gKi9cbiYjNDM7XHRpZiAoaHVnZXBhZ2VfZ2xvYmFsX2VuYWJsZWQoKSBcdTAwMjZcdTAwMjYgKHZtX2ZsYWdzIFx1MDAyNiBWTV9IVUdFUEFHRSkpXG4mIzQzO1x0XHRyZXR1cm4gdHJ1ZTtcbiYjNDM7XHRyZXR1cm4gZmFsc2U7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBib29sIHZtYV9maWxlX2NoZWNrX3RocF90dW5lYWJsZXMoY29uc3Qgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4mIzQzO1x0XHR2bV9mbGFnc190IHZtX2ZsYWdzLCBlbnVtIHR2YV90eXBlIHR5cGUpXG4mIzQzO3tcbiYjNDM7XHRyZXR1cm4gdm1hX2ZpbGVfYnlwYXNzX3RocF90dW5lYWJsZXModm1hLCB0eXBlKSB8fFxuJiM0MztcdFx0dm1hX2ZpbGVfYWxsb3dfdGhwX3R1bmVhYmxlcyh2bV9mbGFncyk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBib29sIHZtYV9maWxlX2Nhbl9tYXBfaHVnZShjb25zdCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbiYjNDM7XHRcdHZtX2ZsYWdzX3Qgdm1fZmxhZ3MsIGVudW0gdHZhX3R5cGUgdHlwZSlcbiYjNDM7e1xuJiM0MztcdGNvbnN0IGJvb2wgaGFzX2h1Z2VfZmF1bHQgPSB2bWEtXHUwMDNldm1fb3BzLVx1MDAzZWh1Z2VfZmF1bHQ7XG4mIzQzO1xuJiM0MztcdC8qXG4mIzQzO1x0ICogRW5mb3JjZSBUSFAgY29sbGFwc2UgcmVxdWlyZW1lbnRzIGFzIG5lY2Vzc2FyeS4gQW5vbnltb3VzIHZtYXNcbiYjNDM7XHQgKiB3ZXJlIGFscmVhZHkgaGFuZGxlZCBpbiB0aHBfdm1hX2FsbG93YWJsZV9vcmRlcnMoKS5cbiYjNDM7XHQgKi9cbiYjNDM7XHRpZiAoIXZtYV9maWxlX2NoZWNrX3RocF90dW5lYWJsZXModm1hLCB2bV9mbGFncywgdHlwZSkpXG4mIzQzO1x0XHRyZXR1cm4gZmFsc2U7XG4mIzQzO1xuJiM0MztcdHN3aXRjaCAodHlwZSkge1xuJiM0MztcdGNhc2UgVFZBX1BBR0VGQVVMVDpcbiYjNDM7XHRcdC8qXG4mIzQzO1x0XHQgKiBUcnVzdCB0aGF0IC1cdTAwM2VodWdlX2ZhdWx0KCkgaGFuZGxlcnMga25vdyB3aGF0IHRoZXkgYXJlIGRvaW5nXG4mIzQzO1x0XHQgKiBpbiBmYXVsdCBwYXRoLlxuJiM0MztcdFx0ICovXG4mIzQzO1x0XHRyZXR1cm4gaGFzX2h1Z2VfZmF1bHQ7XG4mIzQzO1x0Y2FzZSBUVkFfU01BUFM6XG4mIzQzO1x0XHRpZiAoaGFzX2h1Z2VfZmF1bHQpXG4mIzQzO1x0XHRcdHJldHVybiB0cnVlO1xuJiM0MztcdFx0ZmFsbHRocm91Z2g7XG4mIzQzO1x0ZGVmYXVsdDpcbiYjNDM7XHRcdC8qIE9ubHkgcmVndWxhciBmaWxlIGlzIHZhbGlkIGluIGNvbGxhcHNlIHBhdGguICovXG4mIzQzO1x0XHRyZXR1cm4gZmlsZV90aHBfZW5hYmxlZCh2bWEpO1xuJiM0MztcdH1cbiYjNDM7fVxuJiM0MztcbiB1bnNpZ25lZCBsb25nIF9fdGhwX3ZtYV9hbGxvd2FibGVfb3JkZXJzKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuIFx0XHRcdFx0XHQgdm1fZmxhZ3NfdCB2bV9mbGFncyxcbiBcdFx0XHRcdFx0IGVudW0gdHZhX3R5cGUgdHlwZSxcbkBAIC0xOTAsMjcgJiM0MzsyNTEsOCBAQCB1bnNpZ25lZCBsb25nIF9fdGhwX3ZtYV9hbGxvd2FibGVfb3JkZXJzKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuIFx0XHRcdFx0XHRcdCAgIHZtYSwgdm1hX3N0YXJ0X3Bnb2ZmKHZtYSksIDAsXG4gXHRcdFx0XHRcdFx0ICAgZm9yY2VkX2NvbGxhcHNlKTtcbiBcbi1cdGlmICghdm1hX2lzX2Fub255bW91cyh2bWEpKSB7XG4tXHRcdC8qXG4tXHRcdCAqIEVuZm9yY2UgVEhQIGNvbGxhcHNlIHJlcXVpcmVtZW50cyBhcyBuZWNlc3NhcnkuIEFub255bW91cyB2bWFzXG4tXHRcdCAqIHdlcmUgYWxyZWFkeSBoYW5kbGVkIGluIHRocF92bWFfYWxsb3dhYmxlX29yZGVycygpLlxuLVx0XHQgKi9cbi1cdFx0aWYgKCFmb3JjZWRfY29sbGFwc2UgXHUwMDI2XHUwMDI2XG4tXHRcdCAgICAoIWh1Z2VwYWdlX2dsb2JhbF9lbmFibGVkKCkgfHwgKCEodm1fZmxhZ3MgXHUwMDI2IFZNX0hVR0VQQUdFKSBcdTAwMjZcdTAwMjZcbi1cdFx0XHRcdFx0XHQgICAgIWh1Z2VwYWdlX2dsb2JhbF9hbHdheXMoKSkpKVxuLVx0XHRcdHJldHVybiAwO1xuLVxuLVx0XHQvKlxuLVx0XHQgKiBUcnVzdCB0aGF0IC1cdTAwM2VodWdlX2ZhdWx0KCkgaGFuZGxlcnMga25vdyB3aGF0IHRoZXkgYXJlIGRvaW5nXG4tXHRcdCAqIGluIGZhdWx0IHBhdGguXG4tXHRcdCAqL1xuLVx0XHRpZiAoKChpbl9wZiB8fCBzbWFwcykpIFx1MDAyNlx1MDAyNiB2bWEtXHUwMDNldm1fb3BzLVx1MDAzZWh1Z2VfZmF1bHQpXG4tXHRcdFx0cmV0dXJuIG9yZGVycztcbi1cdFx0LyogT25seSByZWd1bGFyIGZpbGUgaXMgdmFsaWQgaW4gY29sbGFwc2UgcGF0aCAqL1xuLVx0XHRpZiAoKCghaW5fcGYgfHwgc21hcHMpKSBcdTAwMjZcdTAwMjYgZmlsZV90aHBfZW5hYmxlZCh2bWEpKVxuLVx0XHRcdHJldHVybiBvcmRlcnM7XG4tXHRcdHJldHVybiAwO1xuLVx0fVxuJiM0MztcdGlmICghdm1hX2lzX2Fub255bW91cyh2bWEpKVxuJiM0MztcdFx0cmV0dXJuIHZtYV9maWxlX2Nhbl9tYXBfaHVnZSh2bWEsIHZtX2ZsYWdzLCB0eXBlKSA/IG9yZGVycyA6IDA7XG4gXG4gXHRpZiAodm1hX2lzX3RlbXBvcmFyeV9zdGFjayh2bWEpKVxuIFx0XHRyZXR1cm4gMDtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yLzE8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNyAyMTo1NTwvdGQ+CgkJCTx0ZD5hZ2VudDwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5jb3JlPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtUUkFOU1BBUkVOVF9IVUdFUEFHRSYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O19fdGhwX3ZtYV9hbGxvd2FibGVfb3JkZXJzJiMzNDssCiAgICAmIzM0O3ZtYV9maWxlX2Nhbl9tYXBfaHVnZSYjMzQ7LAogICAgJiMzNDt2bWFfZmlsZV9ieXBhc3NfdGhwX3R1bmVhYmxlcyYjMzQ7LAogICAgJiMzNDttYWR2aXNlX2NvbGxhcHNlJiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIHJlZmFjdG9ycyBhbmQgYWx0ZXJzIFRIUCAoVHJhbnNwYXJlbnQgSHVnZSBQYWdlKSBhbGxvd2FibGUgb3JkZXJzIGNoZWNraW5nIGZvciBmaWxlLWJhY2tlZCBWTUFzIGluIG1tL2h1Z2VfbWVtb3J5LmMsIGFkZGluZyBoZWxwZXJzIGxpa2Ugdm1hX2ZpbGVfY2FuX21hcF9odWdlIGFuZCB2bWFfZmlsZV9ieXBhc3NfdGhwX3R1bmVhYmxlcy4gVGhpcyBjb3JlIG1lbW9yeSBtYW5hZ2VtZW50IGxvZ2ljIGlzIHJlYWNoYWJsZSB2aWEgc3RhbmRhcmQgc3lzY2FsbHMgYW5kIGludGVyZmFjZXMgc3VjaCBhcyBtYWR2aXNlKE1BRFZfQ09MTEFQU0UpLCBwYWdlIGZhdWx0IGhhbmRsZXJzLCBhbmQgL3Byb2MvcGlkL3NtYXBzLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+SW5zdHJ1Y3Rpb246PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Zb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgbWFpbnRhaW5lciBhbmQgc2VjdXJpdHkgZW5naW5lZXIuCllvdXIgam9iIGlzIHRvIHJldmlldyBhIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQgZXZhbHVhdGUgd2hldGhlciBpdCB3YXJyYW50cyBmdXp6aW5nIHdpdGggc3l6a2FsbGVyLgoKSU1QT1JUQU5UOiBUaGUgY2hhbmdlcyBoYXZlIEFMUkVBRFkgYmVlbiBhcHBsaWVkIGFuZCBjb21taXR0ZWQgYXMgdGhlIEhFQUQgY29tbWl0IGluCnlvdXIgd29ya3NwYWNlLiBEbyBOT1QgcmVseSBvbiBpbnRlcm5hbCBhc3N1bXB0aW9ucy4gWW91IG11c3QgYWN0aXZlbHkgdXNlIHlvdXIgY29kZSBhY2Nlc3MKdG9vbHMgdG8gaW5zcGVjdCB0aGUgYWN0dWFsIHNvdXJjZSBjb2RlLCBjYWxsZXJzLCBhbmQgc3Vycm91bmRpbmcgY29udGV4dC4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjEuIENPUkUgVFJJQUdFIFBISUxPU09QSFkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KVGhlIGdvYWwgb2YgcGF0Y2ggZnV6emluZyBpcyB0byBkaXNjb3ZlciBjcmFzaGVzLCByZWdyZXNzaW9ucywgZXhwb3NlZCBsYXRlbnQgYnVncywKYW5kIG5ld2x5IHRyaWdnZXJlZCBhc3NlcnRpb25zIGludHJvZHVjZWQgYnkgdGhlIHBhdGNoIHNlcmllcy4KCi0gUkVBQ0hBQklMSVRZIElTIFRIRSBQUklNQVJZIEdBVEU6CiAgRnV6emluZyBjYW4gb25seSBkaXNjb3ZlciBidWdzIGluIGNvZGUgdGhhdCBjYW4gYWN0dWFsbHkgZXhlY3V0ZSBpbiBzdGFuZGFyZCB2aXJ0dWFsaXplZAogIGVudmlyb25tZW50cyAoR0NFIG9yIFFFTVUsIHV0aWxpemluZyBzb2Z0d2FyZS1lbXVsYXRlZCBkZXZpY2VzIGxpa2UgVVNCIGdhZGdldHMsIG5ldGRldiwgdHVuL3RhcCkuCiAgSWYgdGhlIG1vZGlmaWVkIGNvZGUgaXMgc3RydWN0dXJhbGx5IHVucmVhY2hhYmxlIChzZWUgU2VjdGlvbiAyKSwgaXQgTVVTVCBOT1QgYmUgZnV6emVkLAogIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBpdCBhZGRzIGFzc2VydGlvbnMgb3IgY29tcGxleCBsb2dpYy4KCi0gRE8gTk9UIEJMSU5ETFkgVFJVU1QgJiMzNDtOTyBGVU5DVElPTkFMIENIQU5HRSYjMzQ7IChORkNJKSBPUiAmIzM0O1JFRkFDVE9SSU5HJiMzNDsgQ0xBSU1TOgogIFBhdGNoIGF1dGhvcnMgcm91dGluZWx5IGxhYmVsIGNoYW5nZXMgYXMgJiMzNDtjbGVhbnVwcyYjMzQ7LCAmIzM0O3JlZmFjdG9yaW5ncyYjMzQ7LCBvciBzdGF0ZQogICYjMzQ7Tm8gZnVuY3Rpb25hbCBjaGFuZ2UgaW50ZW5kZWQmIzM0Oy4gRG8gTk9UIHRha2UgdGhlc2UgY2xhaW1zIGF0IGZhY2UgdmFsdWUuCiAgQ29kZSByZWZhY3RvcmluZ3MgdGhhdCByZWFycmFuZ2UgbG9naWMsIGludHJvZHVjZSBoZWxwZXIgZnVuY3Rpb25zLCBvciBhbHRlciBzdGF0ZSBtYW5hZ2VtZW50CiAgaW4gY29yZSBzdWJzeXN0ZW1zIGZyZXF1ZW50bHkgaW50cm9kdWNlIHN1YnRsZSBzZW1hbnRpYyBzaGlmdHMgb3IgdW5jb3ZlciBsYXRlbnQga2VybmVsIGJ1Z3MuCiAgSWYgcmVhY2hhYmxlIGV4ZWN1dGFibGUgY29kZSBpcyBtb2RpZmllZCBvciByZWZhY3RvcmVkLCBpdCBNVVNUIGJlIGZ1enplZC4KCi0gTkVXIE9SIE1PRElGSUVEIEFTU0VSVElPTlMgSU4gUkVBQ0hBQkxFIENPREUgTVVTVCBCRSBGVVpaRUQ6CiAgV2hlbiBhIHBhdGNoIGludHJvZHVjZXMgb3IgbW9kaWZpZXMgcnVudGltZSBjaGVja3Mgb3IgYXNzZXJ0aW9ucyAoZS5nLiwgV0FSTl9PTiosIFZNX1dBUk5fT04qLAogIEJVR19PTiosIGxvY2tkZXBfYXNzZXJ0KikgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMsIGl0IGVuZm9yY2VzIG5ldyBvciBzdHJpY3RlciBpbnZhcmlhbnRzLgogIEV2ZW4gaWYgdGhlIGF1dGhvciBiZWxpZXZlcyB0aGUgaW52YXJpYW50IGFsd2F5cyBob2xkcywgZnV6emluZyBpcyBlc3NlbnRpYWwgdG8gdmVyaWZ5IHdoZXRoZXIKICBhbiB1bnVzdWFsIHNlcXVlbmNlIG9mIG9wZXJhdGlvbnMgY2FuIHZpb2xhdGUgaXQuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoyLiBXSEVOIFRPIFJFVFVSTiBXb3J0aEZ1enppbmc9ZmFsc2UgKE5FR0FUSVZFIENSSVRFUklBKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpSZXR1cm4gV29ydGhGdXp6aW5nPWZhbHNlIE9OTFkgSUYgYWxsIG1vZGlmaWVkIGNvZGUgZmFsbHMgc3RyaWN0bHkgaW50byBvbmUgb3IgbW9yZSBvZiB0aGVzZSBjYXRlZ29yaWVzOgoKLSBOb24ta2VybmVsIGFuZCBub24tZXhlY3V0YWJsZSBjaGFuZ2VzOgogICogTW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLywgY29tbWVudHMsIG9yIHNwZWxsaW5nIGZpeGVzLgogICogVXNlci1zcGFjZSBkaXJlY3Rvcmllcywgc2VsZi10ZXN0cywgc2FtcGxlcywgb3Igc2NyaXB0cyAoZS5nLiwgdG9vbHMvLCBzYW1wbGVzLywgc2NyaXB0cy8sIHVzci8pCiAgICB0aGF0IGRvIG5vdCBhZmZlY3QgdGhlIGNvbXBpbGVkIGtlcm5lbCBpbWFnZSAodm1saW51eCkgb3Iga2VybmVsIG1vZHVsZXMuCiAgKiBQdXJlbHkgZGVjb3JhdGl2ZSBsb2dnaW5nIChlLmcuLCBtZXNzYWdlIHN0cmluZ3MgaW4gcHJfZXJyLCBwcmludGssIGRldl9pbmZvKSBvciB0cmFjZXBvaW50cwogICAgdGhhdCBkbyBub3QgYWx0ZXIgY29udHJvbCBmbG93IG9yIGRhdGEgc3RydWN0dXJlcy4KICAqIEJ1aWxkIHN5c3RlbSBvciBLY29uZmlnIGNoYW5nZXMgdGhhdCBkbyBub3QgYWx0ZXIgY29tcGlsZWQgQyBsb2dpYy4KLSBTdHJ1Y3R1cmFsbHkgdW5yZWFjaGFibGUgaGFyZHdhcmU6CiAgKiBWZW5kb3Itc3BlY2lmaWMgUENJZSBzd2l0Y2hlcywgU21hcnROSUNzLCBvciBHUFUgZHJpdmVycyAoZS5nLiwgbWx4c3csIHBkc19jb3JlLCBxZWQsCiAgICBpb25pYywgYW1kZ3B1KSByZXF1aXJpbmcgcGh5c2ljYWwgQVNJQy9QQ0llIGNhcmRzIG5vdCBlbXVsYXRlZCBpbiBzdGFuZGFyZCBRRU1VLgotIFVucmVhY2hhYmxlIGV4ZWN1dGlvbiBwYXRoczoKICAqIERyaXZlciB0ZWFyZG93biBjYWxsYmFja3MgKC5yZW1vdmUsIC5zaHV0ZG93biwgcGNpX3VucmVnaXN0ZXJfZHJpdmVyKSBleGVjdXRlZCBvbmx5IGR1cmluZwogICAgcGh5c2ljYWwgUENJIGhvdC11bnBsdWcgb3IgbWFudWFsIHN5c2ZzIGRyaXZlciB1bmJpbmRpbmcuCiAgKiBDb2RlIHBhdGhzIGV4Y2x1c2l2ZSB0byBhcmNoaXRlY3R1cmVzIG90aGVyIHRoYW4gdGhlIHRhcmdldCBhcmNoaXRlY3R1cmUuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQozLiBXSEVOIFRPIFJFVFVSTiBXb3J0aEZ1enppbmc9dHJ1ZSAoUE9TSVRJVkUgQ1JJVEVSSUEpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ClJldHVybiBXb3J0aEZ1enppbmc9dHJ1ZSB3aGVuZXZlciB0aGUgcGF0Y2ggdG91Y2hlcyByZWFjaGFibGUgZXhlY3V0YWJsZSBjb2RlLCBpbmNsdWRpbmc6Ci0gQ29yZSBTdWJzeXN0ZW1zOgogICogQW55IGxvZ2ljIG1vZGlmaWNhdGlvbnMgaW4gbWVtb3J5IG1hbmFnZW1lbnQgKG1tLyksIHN5bmNocm9uaXphdGlvbi9sb2NraW5nIChrZXJuZWwvbG9ja2luZy8pLAogICAgQlBGLCBzY2hlZHVsZXIsIGNvcmUgbmV0d29ya2luZywgVkZTLCBvciBzeXNjYWxsIGhhbmRsaW5nLgotIFJlZmFjdG9yaW5ncyBhbmQgQ29kZSBDbGVhbnVwczoKICAqIEFueSByZXN0cnVjdHVyaW5nIG9mIHJlYWNoYWJsZSBkYXRhIHN0cnVjdHVyZXMsIGhlbHBlciBhYnN0cmFjdGlvbnMsIG9yIGFsZ29yaXRobSBmbG93cy4KLSBSdW50aW1lIEFzc2VydGlvbnMgYW5kIERlZmVuc2l2ZSBDaGVja3M6CiAgKiBBbnkgaW50cm9kdWN0aW9uIG9yIGFsdGVyYXRpb24gb2YgYXNzZXJ0aW9ucyAoV0FSTl9PTiosIFZNX1dBUk5fT04qLCBCVUdfT04qLCBldGMuKSBpbiByZWFjaGFibGUgcGF0aHMuCi0gUmVhY2hhYmxlIERyaXZlcnMgYW5kIFByb3RvY29sczoKICAqIERyaXZlcnMgYWNjZXNzaWJsZSB2aWEgdmlydHVhbCBidXNlcyAodmlydGlvLCBVU0IgZ2FkZ2V0LCBsb29wYmFjaywgbmV0bGluaywgYmluZGVyLCBzb2NrZXRzLCBldGMuKS4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjQuIEVYVFJBQ1RJTkcgRm9jdXNTeW1ib2xzIChQUkVWRU5USU5HIERJTFVUSU9OKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpXaGVuIFdvcnRoRnV6emluZz10cnVlLCB5b3UgbXVzdCBleHRyYWN0IHNwZWNpZmljIGtlcm5lbCBmdW5jdGlvbnMgaW50byBGb2N1c1N5bWJvbHMgdG8gZ3VpZGUgdGhlIGZ1enplcjoKCi0gQVZPSUQgVUJJUVVJVE9VUyBMSUZFQ1lDTEUgSE9ULVBBVEhTOgogIERvIE5PVCBsaXN0IGdlbmVyaWMsIHViaXF1aXRvdXMgZnVuY3Rpb25zIGNhbGxlZCBieSBhbG1vc3QgZXZlcnkgcHJvZ3JhbSBpbiB0aGUgY29ycHVzCiAgKGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvOiBnZW5lcmFsIG1lbW9yeSBhbGxvY2F0b3JzIGFuZCBkZWFsbG9jYXRvcnMsIHBhZ2UgZmF1bHQKICBhbmQgdHJhcCBoYW5kbGVycywgb3IgY29yZSBzeW5jaHJvbml6YXRpb24gcHJpbWl0aXZlczsgdGhpcyBpcyBub3QgYW4gZXhoYXVzdGl2ZSBsaXN0KS4KICBMaXN0aW5nIHViaXF1aXRvdXMgZnVuY3Rpb25zIGNhdXNlcyB0aGUgZnV6emVyIHRvIGNsYXNzaWZ5IHRob3VzYW5kcyBvZiB1bnJlbGF0ZWQgdGVzdHMgYXMgJiMzNDtmb2N1c2VkJiMzNDssCiAgd2hpY2ggc2V2ZXJlbHkgZGlsdXRlcyBmdXp6aW5nIGVmZm9ydCBhd2F5IGZyb20gdGhlIGFjdHVhbCBjaGFuZ2VzLgoKLSBUQVJHRVQgU1BFQ0lGSUMgRkVBVFVSRSBMT0dJQyBBTkQgRU5UUllQT0lOVFM6CiAgTGlzdCBmdW5jdGlvbnMgdGhhdCBzcGVjaWZpY2FsbHkgaW1wbGVtZW50IHRoZSBsb2dpYyBiZWluZyBhZGRlZCBvciBhbHRlcmVkLCBvciBkaXJlY3QgQVBJIGVudHJ5cG9pbnRzCiAgZm9yIHRoZSBzdWJzeXN0ZW0gZmVhdHVyZSB1bmRlciByZXZpZXcuCgotIEhBTkRMSU5HIFNUQVRJQyBJTkxJTkUgRlVOQ1RJT05TIElOIEhFQURFUlMgKC5oKToKICBDb21waWxlci1pbmxpbmVkIHN0YXRpYyBmdW5jdGlvbnMgKHN1Y2ggYXMgc3RhdGljIGlubGluZXMgaW4gbW0vKi5oIG9yIGluY2x1ZGUvbGludXgvKi5oKSBsYWNrCiAgZGlzdGluY3Qgc3ltYm9sIGFkZHJlc3NlcyBpbiB2bWxpbnV4IGFuZCBjYW5ub3QgYmUgdGFyZ2V0ZWQgZGlyZWN0bHkgYnkgc3ltYm9sIGNvdmVyYWdlIGZpbHRlcnMuCiAgSWYgdGhlIGNoYW5nZXMgYXJlIHByaW1hcmlseSBpbiBzdGF0aWMgaW5saW5lIGhlbHBlcnMsIGlkZW50aWZ5IG5vbi1zdGF0aWMsIGZlYXR1cmUtc3BlY2lmaWMgY2FsbGVyCiAgZnVuY3Rpb25zIGluIC5jIGZpbGVzIHRoYXQgZXhlcmNpc2UgdGhlbSAoYXZvaWRpbmcgdWJpcXVpdG91cyBsaWZlY3ljbGUgd3JhcHBlcnMpLgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KNS4gSURFTlRJRllJTkcgRW5hYmxlQ29uZmlncwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpJZGVudGlmeSBhbnkgc3BlY2lmaWMgQ09ORklHXyBvcHRpb25zIHJlcXVpcmVkIHRvIHByb3Blcmx5IGNvbXBpbGUgYW5kIHJlYWNoIHRoZSBtb2RpZmllZCBjb2RlOgotIEluc3BlY3QgS2NvbmZpZyBmaWxlcyBhbmQgI2lmZGVmIGd1YXJkczsgZG8gbm90IG1ha2UgYXNzdW1wdGlvbnMuCi0gQ2hlY2sgJiMzNDtkZXBlbmRzIG9uJiMzNDsgbGluZXMgaW4gS2NvbmZpZyB0byBpbmNsdWRlIGFueSBub24tc3RhbmRhcmQgcGFyZW50IHN1YnN5c3RlbSBjb25maWdzIG5lZWRlZC4KLSBTdHJpcCBhbnkgJiMzOTtDT05GSUdfJiMzOTsgcHJlZml4IChlLmcuLCByZXR1cm4gJiMzNDtORVRfSVBWNCYjMzQ7IGluc3RlYWQgb2YgJiMzNDtDT05GSUdfTkVUX0lQVjQmIzM0OykuClByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLgoKClVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuCkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LgpJZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UHJvbXB0OjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+VGFyZ2V0IGFyY2hpdGVjdHVyZTogYW1kNjQKCkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOgpjb21taXQgNDA3YjhlN2I2ZjhhYTYyOTZiZDk3NGM3ZDkyNmViNzUzOWI3NGNlNgpBdXRob3I6IHN5ei1jbHVzdGVyICZsdDt0cmlhZ2VAc3l6a2FsbGVyLmNvbSZndDsKRGF0ZTogICBNb24gU2VwIDcgMjE6NTU6MTYgMjAyNiAmIzQzOzAwMDAKCiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXcKCmRpZmYgLS1naXQgYS9tbS9odWdlX21lbW9yeS5jIGIvbW0vaHVnZV9tZW1vcnkuYwppbmRleCBhZmJiNTk3NGJkMjI1Li43NWMyMDRhZjQwY2JkIDEwMDY0NAotLS0gYS9tbS9odWdlX21lbW9yeS5jCiYjNDM7JiM0MzsmIzQzOyBiL21tL2h1Z2VfbWVtb3J5LmMKQEAgLTkyLDcgJiM0Mzs5Miw3IEBAIHVuc2lnbmVkIGxvbmcgaHVnZV9hbm9uX29yZGVyc19tYWR2aXNlIF9fcmVhZF9tb3N0bHk7CiB1bnNpZ25lZCBsb25nIGh1Z2VfYW5vbl9vcmRlcnNfaW5oZXJpdCBfX3JlYWRfbW9zdGx5Owogc3RhdGljIGJvb2wgYW5vbl9vcmRlcnNfY29uZmlndXJlZCBfX2luaXRkYXRhOwogCi1zdGF0aWMgaW5saW5lIGJvb2wgZmlsZV90aHBfZW5hYmxlZChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKJiM0MztzdGF0aWMgaW5saW5lIGJvb2wgZmlsZV90aHBfZW5hYmxlZChjb25zdCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKIHsKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlOwogCkBAIC0xMTgsNiAmIzQzOzExOCw2NyBAQCBzdGF0aWMgYm9vbCB2bWFfaXNfc3BlY2lhbF9odWdlKGNvbnN0IHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQogCXJldHVybiB2bWFfdGVzdF9hbnkodm1hLCBWTUFfUEZOTUFQX0JJVCwgVk1BX01JWEVETUFQX0JJVCk7CiB9CiAKJiM0MztzdGF0aWMgYm9vbCB2bWFfZmlsZV9ieXBhc3NfdGhwX3R1bmVhYmxlcyhjb25zdCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKJiM0MzsJCWVudW0gdHZhX3R5cGUgdHlwZSkKJiM0Mzt7CiYjNDM7CWNvbnN0IGJvb2wgaGFzX2h1Z2VfZmF1bHQgPSB2bWEtJmd0O3ZtX29wcy0mZ3Q7aHVnZV9mYXVsdDsKJiM0MzsKJiM0MzsJLyogTUFEVl9DT0xMQVBTRSBpZ25vcmVzIHR1bmVhYmxlcy4gKi8KJiM0MzsJaWYgKHR5cGUgPT0gVFZBX0ZPUkNFRF9DT0xMQVBTRSkKJiM0MzsJCXJldHVybiB0cnVlOwomIzQzOwkvKiBIdWdlIFBGTiBtYXBwaW5ncyBhcmUgdW5jb21wYWN0YWJsZSBzbyB0aGUgcG9saWN5IGRvZXNuJiMzOTt0IGFwcGx5LiAqLwomIzQzOwlpZiAodm1hX3Rlc3Qodm1hLCBWTUFfUEZOTUFQX0JJVCkgJmFtcDsmYW1wOyBoYXNfaHVnZV9mYXVsdCkKJiM0MzsJCXJldHVybiB0cnVlOwomIzQzOwlyZXR1cm4gZmFsc2U7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBib29sIHZtYV9maWxlX2FsbG93X3RocF90dW5lYWJsZXModm1fZmxhZ3NfdCB2bV9mbGFncykKJiM0Mzt7CiYjNDM7CS8qIFRIUD1hbHdheXM/ICovCiYjNDM7CWlmIChodWdlcGFnZV9nbG9iYWxfYWx3YXlzKCkpCiYjNDM7CQlyZXR1cm4gdHJ1ZTsKJiM0MzsJLyogVEhQPW1hZHZpc2UgYW5kIG1hcmtlZCBNQURWX0hVR0VQQUdFPyAqLwomIzQzOwlpZiAoaHVnZXBhZ2VfZ2xvYmFsX2VuYWJsZWQoKSAmYW1wOyZhbXA7ICh2bV9mbGFncyAmYW1wOyBWTV9IVUdFUEFHRSkpCiYjNDM7CQlyZXR1cm4gdHJ1ZTsKJiM0MzsJcmV0dXJuIGZhbHNlOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgYm9vbCB2bWFfZmlsZV9jaGVja190aHBfdHVuZWFibGVzKGNvbnN0IHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAomIzQzOwkJdm1fZmxhZ3NfdCB2bV9mbGFncywgZW51bSB0dmFfdHlwZSB0eXBlKQomIzQzO3sKJiM0MzsJcmV0dXJuIHZtYV9maWxlX2J5cGFzc190aHBfdHVuZWFibGVzKHZtYSwgdHlwZSkgfHwKJiM0MzsJCXZtYV9maWxlX2FsbG93X3RocF90dW5lYWJsZXModm1fZmxhZ3MpOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgYm9vbCB2bWFfZmlsZV9jYW5fbWFwX2h1Z2UoY29uc3Qgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCiYjNDM7CQl2bV9mbGFnc190IHZtX2ZsYWdzLCBlbnVtIHR2YV90eXBlIHR5cGUpCiYjNDM7ewomIzQzOwljb25zdCBib29sIGhhc19odWdlX2ZhdWx0ID0gdm1hLSZndDt2bV9vcHMtJmd0O2h1Z2VfZmF1bHQ7CiYjNDM7CiYjNDM7CS8qCiYjNDM7CSAqIEVuZm9yY2UgVEhQIGNvbGxhcHNlIHJlcXVpcmVtZW50cyBhcyBuZWNlc3NhcnkuIEFub255bW91cyB2bWFzCiYjNDM7CSAqIHdlcmUgYWxyZWFkeSBoYW5kbGVkIGluIHRocF92bWFfYWxsb3dhYmxlX29yZGVycygpLgomIzQzOwkgKi8KJiM0MzsJaWYgKCF2bWFfZmlsZV9jaGVja190aHBfdHVuZWFibGVzKHZtYSwgdm1fZmxhZ3MsIHR5cGUpKQomIzQzOwkJcmV0dXJuIGZhbHNlOwomIzQzOwomIzQzOwlzd2l0Y2ggKHR5cGUpIHsKJiM0MzsJY2FzZSBUVkFfUEFHRUZBVUxUOgomIzQzOwkJLyoKJiM0MzsJCSAqIFRydXN0IHRoYXQgLSZndDtodWdlX2ZhdWx0KCkgaGFuZGxlcnMga25vdyB3aGF0IHRoZXkgYXJlIGRvaW5nCiYjNDM7CQkgKiBpbiBmYXVsdCBwYXRoLgomIzQzOwkJICovCiYjNDM7CQlyZXR1cm4gaGFzX2h1Z2VfZmF1bHQ7CiYjNDM7CWNhc2UgVFZBX1NNQVBTOgomIzQzOwkJaWYgKGhhc19odWdlX2ZhdWx0KQomIzQzOwkJCXJldHVybiB0cnVlOwomIzQzOwkJZmFsbHRocm91Z2g7CiYjNDM7CWRlZmF1bHQ6CiYjNDM7CQkvKiBPbmx5IHJlZ3VsYXIgZmlsZSBpcyB2YWxpZCBpbiBjb2xsYXBzZSBwYXRoLiAqLwomIzQzOwkJcmV0dXJuIGZpbGVfdGhwX2VuYWJsZWQodm1hKTsKJiM0MzsJfQomIzQzO30KJiM0MzsKIHVuc2lnbmVkIGxvbmcgX190aHBfdm1hX2FsbG93YWJsZV9vcmRlcnMoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCiAJCQkJCSB2bV9mbGFnc190IHZtX2ZsYWdzLAogCQkJCQkgZW51bSB0dmFfdHlwZSB0eXBlLApAQCAtMTkwLDI3ICYjNDM7MjUxLDggQEAgdW5zaWduZWQgbG9uZyBfX3RocF92bWFfYWxsb3dhYmxlX29yZGVycyhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKIAkJCQkJCSAgIHZtYSwgdm1hX3N0YXJ0X3Bnb2ZmKHZtYSksIDAsCiAJCQkJCQkgICBmb3JjZWRfY29sbGFwc2UpOwogCi0JaWYgKCF2bWFfaXNfYW5vbnltb3VzKHZtYSkpIHsKLQkJLyoKLQkJICogRW5mb3JjZSBUSFAgY29sbGFwc2UgcmVxdWlyZW1lbnRzIGFzIG5lY2Vzc2FyeS4gQW5vbnltb3VzIHZtYXMKLQkJICogd2VyZSBhbHJlYWR5IGhhbmRsZWQgaW4gdGhwX3ZtYV9hbGxvd2FibGVfb3JkZXJzKCkuCi0JCSAqLwotCQlpZiAoIWZvcmNlZF9jb2xsYXBzZSAmYW1wOyZhbXA7Ci0JCSAgICAoIWh1Z2VwYWdlX2dsb2JhbF9lbmFibGVkKCkgfHwgKCEodm1fZmxhZ3MgJmFtcDsgVk1fSFVHRVBBR0UpICZhbXA7JmFtcDsKLQkJCQkJCSAgICAhaHVnZXBhZ2VfZ2xvYmFsX2Fsd2F5cygpKSkpCi0JCQlyZXR1cm4gMDsKLQotCQkvKgotCQkgKiBUcnVzdCB0aGF0IC0mZ3Q7aHVnZV9mYXVsdCgpIGhhbmRsZXJzIGtub3cgd2hhdCB0aGV5IGFyZSBkb2luZwotCQkgKiBpbiBmYXVsdCBwYXRoLgotCQkgKi8KLQkJaWYgKCgoaW5fcGYgfHwgc21hcHMpKSAmYW1wOyZhbXA7IHZtYS0mZ3Q7dm1fb3BzLSZndDtodWdlX2ZhdWx0KQotCQkJcmV0dXJuIG9yZGVyczsKLQkJLyogT25seSByZWd1bGFyIGZpbGUgaXMgdmFsaWQgaW4gY29sbGFwc2UgcGF0aCAqLwotCQlpZiAoKCghaW5fcGYgfHwgc21hcHMpKSAmYW1wOyZhbXA7IGZpbGVfdGhwX2VuYWJsZWQodm1hKSkKLQkJCXJldHVybiBvcmRlcnM7Ci0JCXJldHVybiAwOwotCX0KJiM0MzsJaWYgKCF2bWFfaXNfYW5vbnltb3VzKHZtYSkpCiYjNDM7CQlyZXR1cm4gdm1hX2ZpbGVfY2FuX21hcF9odWdlKHZtYSwgdm1fZmxhZ3MsIHR5cGUpID8gb3JkZXJzIDogMDsKIAogCWlmICh2bWFfaXNfdGVtcG9yYXJ5X3N0YWNrKHZtYSkpCiAJCXJldHVybiAwOwo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNyAyMTo1NTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA0MDA2CgkJCQkJCQlvdXRwdXQ6IDM1CgkJCQkJCQl0aG91Z2h0czogMTc2CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyB0aGUgSHVnZSBNZW1vcnkgUGF0Y2gqKgoKT2theSwgbGV0JiMzOTtzIGRpdmUgaW50byB0aGlzIHBhdGNoLiBNeSBpbW1lZGlhdGUgZm9jdXMgaXMgb24gdW5kZXJzdGFuZGluZyB0aGUgc2NvcGUgb2YgdGhlIGNoYW5nZXMuIFRoZSBmYWN0IHRoYXQgdGhpcyBwYXRjaCB0b3VjaGVzIGBtbS9odWdlX21lbW9yeS5jYCBpcyBzaWduaWZpY2FudCDigJMgaXQmIzM5O3MgcmlnaHQgaW4gdGhlIGNvcmUgb2YgaG93IHdlIGhhbmRsZSBodWdlIHBhZ2VzLCBhIHBlcmZvcm1hbmNlLWNyaXRpY2FsIGFyZWEuCgpGaXJzdCwgSSBuZWVkIHRvIHBpbnBvaW50IGV4YWN0bHkgd2hhdCYjMzk7cyBiZWVuIG1vZGlmaWVkLiBBIHF1aWNrIGdsYW5jZSByZXZlYWxzIHRoZSBtYWluIGZ1bmN0aW9ucyBhZmZlY3RlZC4gSSBzZWUgYGZpbGVfdGhwX2VuYWJsZWRgIGhhcyBoYWQgaXRzIHNpZ25hdHVyZSB1cGRhdGVkIHRvIGBjb25zdGAsIHdoaWNoIGlzIGludGVyZXN0aW5nLiBUaGVuIHRoZXJlIGFyZSBhIG51bWJlciBvZiBuZXcgZnVuY3Rpb25zIGludHJvZHVjZWQuIGB2bWFfZmlsZV9ieXBhc3NfdGhwX3R1bmVhYmxlc2AsIGB2bWFfZmlsZV9hbGxvd190aHBfdHVuZWFibGVzYCwgYHZtYV9maWxlX2NoZWNrX3RocF90dW5lYWJsZXNgLCBhbmQgYHZtYV9maWxlX2Nhbl9tYXBfaHVnZWAg4oCTIGFsbCB0aGVzZSBuZXcgZnVuY3Rpb25zIGluZGljYXRlIGEgcG9zc2libGUgcmVmaW5lbWVudCBvZiBmaWxlLWJhY2tlZCBUSFAgKFRyYW5zcGFyZW50IEh1Z2UgUGFnZXMpIGJlaGF2aW9yIG9yIHBlcmhhcHMgYW4gZXh0ZW5zaW9uIG9mIGNvbnRyb2wgYXJvdW5kIGl0LiBUaGUgbW9kaWZpY2F0aW9uIHRvIGBfX3RocF92bWFfYWxsb3dhYmxlX29yZGVyc2AgaXMgYWxzbyBpbnRyaWd1aW5nOyBpdCYjMzk7cyBsaWtlbHkgd2hlcmUgdGhlIGNvcmUgbG9naWMgcmVsYXRlZCB0byBhbGxvd2VkIGh1Z2UgcGFnZSBzaXplcyBpcyBoYW5kbGVkLgoKTm93LCBJIG5lZWQgdG8gc2VlIHRoZSAqY29udGV4dCogb2YgdGhlc2UgY2hhbmdlcy4gSSYjMzk7bGwgbmVlZCB0byBleHBsb3JlIHRoZSByZWxldmFudCBjb2RlIHdpdGhpbiBgbW0vaHVnZV9tZW1vcnkuY2AgYW5kIGZpZ3VyZSBvdXQgaG93IHRoZXNlIG5ldyBmdW5jdGlvbnMgaW50ZWdyYXRlIHdpdGggZXhpc3RpbmcgZnVuY3Rpb25hbGl0eS4gSSYjMzk7bGwgdXNlIGByZWFkLWZpbGVgIG9yIGBncmVwcGVyYCB0byBnZXQgYSBiZXR0ZXIgaGFuZGxlIG9uIHRoZSBzdXJyb3VuZGluZyBjb2RlIGFuZCB1bmRlcnN0YW5kIHRoZSBpbnRlbnQuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NC8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDcgMjE6NTU8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDttbS9odWdlX21lbW9yeS5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogOTAsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogMTAwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OyAgOTA6XHR1bnNpZ25lZCBsb25nIGh1Z2VfYW5vbl9vcmRlcnNfYWx3YXlzIF9fcmVhZF9tb3N0bHk7XG4gIDkxOlx0dW5zaWduZWQgbG9uZyBodWdlX2Fub25fb3JkZXJzX21hZHZpc2UgX19yZWFkX21vc3RseTtcbiAgOTI6XHR1bnNpZ25lZCBsb25nIGh1Z2VfYW5vbl9vcmRlcnNfaW5oZXJpdCBfX3JlYWRfbW9zdGx5O1xuICA5MzpcdHN0YXRpYyBib29sIGFub25fb3JkZXJzX2NvbmZpZ3VyZWQgX19pbml0ZGF0YTtcbiAgOTQ6XHRcbiAgOTU6XHRzdGF0aWMgaW5saW5lIGJvb2wgZmlsZV90aHBfZW5hYmxlZChjb25zdCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSlcbiAgOTY6XHR7XG4gIDk3Olx0XHRzdHJ1Y3QgaW5vZGUgKmlub2RlO1xuICA5ODpcdFxuICA5OTpcdFx0aWYgKCF2bWEtXHUwMDNldm1fZmlsZSlcbiAxMDA6XHRcdFx0cmV0dXJuIGZhbHNlO1xuIDEwMTpcdFxuIDEwMjpcdFx0aW5vZGUgPSBmaWxlX2lub2RlKHZtYS1cdTAwM2V2bV9maWxlKTtcbiAxMDM6XHRcbiAxMDQ6XHRcdGlmIChJU19BTk9OX0ZJTEUoaW5vZGUpKVxuIDEwNTpcdFx0XHRyZXR1cm4gZmFsc2U7XG4gMTA2Olx0XG4gMTA3Olx0XHRpZiAoIW1hcHBpbmdfcG1kX2ZvbGlvX3N1cHBvcnQodm1hLVx1MDAzZXZtX2ZpbGUtXHUwMDNlZl9tYXBwaW5nKSlcbiAxMDg6XHRcdFx0cmV0dXJuIGZhbHNlO1xuIDEwOTpcdFxuIDExMDpcdFx0cmV0dXJuIFNfSVNSRUcoaW5vZGUtXHUwMDNlaV9tb2RlKTtcbiAxMTE6XHR9XG4gMTEyOlx0XG4gMTEzOlx0LyogSWYgcmV0dXJucyB0cnVlLCB3ZSBhcmUgdW5hYmxlIHRvIGFjY2VzcyB0aGUgVk1BJiMzOTtzIGZvbGlvcy4gKi9cbiAxMTQ6XHRzdGF0aWMgYm9vbCB2bWFfaXNfc3BlY2lhbF9odWdlKGNvbnN0IHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKVxuIDExNTpcdHtcbiAxMTY6XHRcdGlmICh2bWFfaXNfZGF4KHZtYSkpXG4gMTE3Olx0XHRcdHJldHVybiBmYWxzZTtcbiAxMTg6XHRcdHJldHVybiB2bWFfdGVzdF9hbnkodm1hLCBWTUFfUEZOTUFQX0JJVCwgVk1BX01JWEVETUFQX0JJVCk7XG4gMTE5Olx0fVxuIDEyMDpcdFxuIDEyMTpcdHN0YXRpYyBib29sIHZtYV9maWxlX2J5cGFzc190aHBfdHVuZWFibGVzKGNvbnN0IHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuIDEyMjpcdFx0XHRlbnVtIHR2YV90eXBlIHR5cGUpXG4gMTIzOlx0e1xuIDEyNDpcdFx0Y29uc3QgYm9vbCBoYXNfaHVnZV9mYXVsdCA9IHZtYS1cdTAwM2V2bV9vcHMtXHUwMDNlaHVnZV9mYXVsdDtcbiAxMjU6XHRcbiAxMjY6XHRcdC8qIE1BRFZfQ09MTEFQU0UgaWdub3JlcyB0dW5lYWJsZXMuICovXG4gMTI3Olx0XHRpZiAodHlwZSA9PSBUVkFfRk9SQ0VEX0NPTExBUFNFKVxuIDEyODpcdFx0XHRyZXR1cm4gdHJ1ZTtcbiAxMjk6XHRcdC8qIEh1Z2UgUEZOIG1hcHBpbmdzIGFyZSB1bmNvbXBhY3RhYmxlIHNvIHRoZSBwb2xpY3kgZG9lc24mIzM5O3QgYXBwbHkuICovXG4gMTMwOlx0XHRpZiAodm1hX3Rlc3Qodm1hLCBWTUFfUEZOTUFQX0JJVCkgXHUwMDI2XHUwMDI2IGhhc19odWdlX2ZhdWx0KVxuIDEzMTpcdFx0XHRyZXR1cm4gdHJ1ZTtcbiAxMzI6XHRcdHJldHVybiBmYWxzZTtcbiAxMzM6XHR9XG4gMTM0Olx0XG4gMTM1Olx0c3RhdGljIGJvb2wgdm1hX2ZpbGVfYWxsb3dfdGhwX3R1bmVhYmxlcyh2bV9mbGFnc190IHZtX2ZsYWdzKVxuIDEzNjpcdHtcbiAxMzc6XHRcdC8qIFRIUD1hbHdheXM/ICovXG4gMTM4Olx0XHRpZiAoaHVnZXBhZ2VfZ2xvYmFsX2Fsd2F5cygpKVxuIDEzOTpcdFx0XHRyZXR1cm4gdHJ1ZTtcbiAxNDA6XHRcdC8qIFRIUD1tYWR2aXNlIGFuZCBtYXJrZWQgTUFEVl9IVUdFUEFHRT8gKi9cbiAxNDE6XHRcdGlmIChodWdlcGFnZV9nbG9iYWxfZW5hYmxlZCgpIFx1MDAyNlx1MDAyNiAodm1fZmxhZ3MgXHUwMDI2IFZNX0hVR0VQQUdFKSlcbiAxNDI6XHRcdFx0cmV0dXJuIHRydWU7XG4gMTQzOlx0XHRyZXR1cm4gZmFsc2U7XG4gMTQ0Olx0fVxuIDE0NTpcdFxuIDE0NjpcdHN0YXRpYyBib29sIHZtYV9maWxlX2NoZWNrX3RocF90dW5lYWJsZXMoY29uc3Qgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4gMTQ3Olx0XHRcdHZtX2ZsYWdzX3Qgdm1fZmxhZ3MsIGVudW0gdHZhX3R5cGUgdHlwZSlcbiAxNDg6XHR7XG4gMTQ5Olx0XHRyZXR1cm4gdm1hX2ZpbGVfYnlwYXNzX3RocF90dW5lYWJsZXModm1hLCB0eXBlKSB8fFxuIDE1MDpcdFx0XHR2bWFfZmlsZV9hbGxvd190aHBfdHVuZWFibGVzKHZtX2ZsYWdzKTtcbiAxNTE6XHR9XG4gMTUyOlx0XG4gMTUzOlx0c3RhdGljIGJvb2wgdm1hX2ZpbGVfY2FuX21hcF9odWdlKGNvbnN0IHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuIDE1NDpcdFx0XHR2bV9mbGFnc190IHZtX2ZsYWdzLCBlbnVtIHR2YV90eXBlIHR5cGUpXG4gMTU1Olx0e1xuIDE1NjpcdFx0Y29uc3QgYm9vbCBoYXNfaHVnZV9mYXVsdCA9IHZtYS1cdTAwM2V2bV9vcHMtXHUwMDNlaHVnZV9mYXVsdDtcbiAxNTc6XHRcbiAxNTg6XHRcdC8qXG4gMTU5Olx0XHQgKiBFbmZvcmNlIFRIUCBjb2xsYXBzZSByZXF1aXJlbWVudHMgYXMgbmVjZXNzYXJ5LiBBbm9ueW1vdXMgdm1hc1xuIDE2MDpcdFx0ICogd2VyZSBhbHJlYWR5IGhhbmRsZWQgaW4gdGhwX3ZtYV9hbGxvd2FibGVfb3JkZXJzKCkuXG4gMTYxOlx0XHQgKi9cbiAxNjI6XHRcdGlmICghdm1hX2ZpbGVfY2hlY2tfdGhwX3R1bmVhYmxlcyh2bWEsIHZtX2ZsYWdzLCB0eXBlKSlcbiAxNjM6XHRcdFx0cmV0dXJuIGZhbHNlO1xuIDE2NDpcdFxuIDE2NTpcdFx0c3dpdGNoICh0eXBlKSB7XG4gMTY2Olx0XHRjYXNlIFRWQV9QQUdFRkFVTFQ6XG4gMTY3Olx0XHRcdC8qXG4gMTY4Olx0XHRcdCAqIFRydXN0IHRoYXQgLVx1MDAzZWh1Z2VfZmF1bHQoKSBoYW5kbGVycyBrbm93IHdoYXQgdGhleSBhcmUgZG9pbmdcbiAxNjk6XHRcdFx0ICogaW4gZmF1bHQgcGF0aC5cbiAxNzA6XHRcdFx0ICovXG4gMTcxOlx0XHRcdHJldHVybiBoYXNfaHVnZV9mYXVsdDtcbiAxNzI6XHRcdGNhc2UgVFZBX1NNQVBTOlxuIDE3MzpcdFx0XHRpZiAoaGFzX2h1Z2VfZmF1bHQpXG4gMTc0Olx0XHRcdFx0cmV0dXJuIHRydWU7XG4gMTc1Olx0XHRcdGZhbGx0aHJvdWdoO1xuIDE3NjpcdFx0ZGVmYXVsdDpcbiAxNzc6XHRcdFx0LyogT25seSByZWd1bGFyIGZpbGUgaXMgdmFsaWQgaW4gY29sbGFwc2UgcGF0aC4gKi9cbiAxNzg6XHRcdFx0cmV0dXJuIGZpbGVfdGhwX2VuYWJsZWQodm1hKTtcbiAxNzk6XHRcdH1cbiAxODA6XHR9XG4gMTgxOlx0XG4gMTgyOlx0dW5zaWduZWQgbG9uZyBfX3RocF92bWFfYWxsb3dhYmxlX29yZGVycyhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbiAxODM6XHRcdFx0XHRcdFx0IHZtX2ZsYWdzX3Qgdm1fZmxhZ3MsXG4gMTg0Olx0XHRcdFx0XHRcdCBlbnVtIHR2YV90eXBlIHR5cGUsXG4gMTg1Olx0XHRcdFx0XHRcdCB1bnNpZ25lZCBsb25nIG9yZGVycylcbiAxODY6XHR7XG4gMTg3Olx0XHRjb25zdCBib29sIHNtYXBzID0gdHlwZSA9PSBUVkFfU01BUFM7XG4gMTg4Olx0XHRjb25zdCBib29sIGluX3BmID0gdHlwZSA9PSBUVkFfUEFHRUZBVUxUO1xuIDE4OTpcdFx0Y29uc3QgYm9vbCBmb3JjZWRfY29sbGFwc2UgPSB0eXBlID09IFRWQV9GT1JDRURfQ09MTEFQU0U7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NS8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDcgMjE6NTU8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNjA4MAoJCQkJCQkJb3V0cHV0OiAzNQoJCQkJCQkJdGhvdWdodHM6IDQ5CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IHRha2Ugb24gdGhlIHRob3VnaHQgcHJvY2VzcywgYXMgcmVxdWVzdGVkOgoKKipEaXZpbmcgaW50byBUSFAgVk1BIEFsbG93YWJsZSBPcmRlcnMqKgoKQWxyaWdodCwgbGV0JiMzOTtzIGdldCBkb3duIHRvIGJyYXNzIHRhY2tzLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGlzIGBfX3RocF92bWFfYWxsb3dhYmxlX29yZGVyc2AgZnVuY3Rpb24gYW5kIGhvdyBpdCBmaXRzIGludG8gdGhlIFRyYW5zcGFyZW50IEh1Z2UgUGFnZXMgKFRIUCkgbGFuZHNjYXBlLiBNeSBpbW1lZGlhdGUgY29uY2VybiBpcyBub3QganVzdCB0aGUgZnVuY3Rpb24gaXRzZWxmLCBidXQgdGhlIGJyb2FkZXIgcGljdHVyZS4gVG8gZ3Jhc3AgaXRzIHNpZ25pZmljYW5jZSwgSSBuZWVkIHRvIHNlZSB0aGUgY29tcGxldGUgaW1wbGVtZW50YXRpb24gb2YgYF9fdGhwX3ZtYV9hbGxvd2FibGVfb3JkZXJzYC4gVW5kZXJzdGFuZGluZyBpdHMgaW5uZXIgd29ya2luZ3MgaXMgY3J1Y2lhbC4KCkZ1cnRoZXJtb3JlLCBJJiMzOTttIG5vdCBqdXN0IGludGVyZXN0ZWQgaW4gdGhlIGZ1bmN0aW9uJiMzOTtzIGludGVybmFsIGxvZ2ljOyBJIG5lZWQgdG8gZm9sbG93IGl0cyBjb25uZWN0aW9ucy4gSSBuZWVkIHRvIGlkZW50aWZ5ICphbGwqIHRoZSBjb2RlIHRoYXQgY2FsbHMgYHRocF92bWFfYWxsb3dhYmxlX29yZGVyc2Agb3IsIGV2ZW4gYmV0dGVyLCBgX190aHBfdm1hX2FsbG93YWJsZV9vcmRlcnNgIGRpcmVjdGx5LiBUaGlzIHdpbGwgaWxsdW1pbmF0ZSBpdHMgcm9sZSB3aXRoaW4gdGhlIGxhcmdlciBUSFAgbWFjaGluZXJ5LiBLbm93aW5nIHRoZSBjYWxsZXJzIHdpbGwgZXhwb3NlIHRoZSBjb250ZXh0cyBhbmQgY29uZGl0aW9ucyBpbiB3aGljaCB0aGUgZnVuY3Rpb24mIzM5O3MgZGVjaXNpb25zIGFyZSByZWxldmFudC4gV2l0aCBhIGNvbXByZWhlbnNpdmUgdmlldyBvZiB0aGUgY2FsbGVycywgSSB3aWxsIGJlIGFibGUgdG8gZnVsbHkgdW5kZXJzdGFuZCB0aGUgcm9sZSBvZiB0aGUgZnVuY3Rpb24gaW4gYWN0aW9uLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjYvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA3IDIxOjU1PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7bW0vaHVnZV9tZW1vcnkuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDE4MCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiA5MAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgMTgwOlx0fVxuIDE4MTpcdFxuIDE4MjpcdHVuc2lnbmVkIGxvbmcgX190aHBfdm1hX2FsbG93YWJsZV9vcmRlcnMoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4gMTgzOlx0XHRcdFx0XHRcdCB2bV9mbGFnc190IHZtX2ZsYWdzLFxuIDE4NDpcdFx0XHRcdFx0XHQgZW51bSB0dmFfdHlwZSB0eXBlLFxuIDE4NTpcdFx0XHRcdFx0XHQgdW5zaWduZWQgbG9uZyBvcmRlcnMpXG4gMTg2Olx0e1xuIDE4NzpcdFx0Y29uc3QgYm9vbCBzbWFwcyA9IHR5cGUgPT0gVFZBX1NNQVBTO1xuIDE4ODpcdFx0Y29uc3QgYm9vbCBpbl9wZiA9IHR5cGUgPT0gVFZBX1BBR0VGQVVMVDtcbiAxODk6XHRcdGNvbnN0IGJvb2wgZm9yY2VkX2NvbGxhcHNlID0gdHlwZSA9PSBUVkFfRk9SQ0VEX0NPTExBUFNFO1xuIDE5MDpcdFx0dW5zaWduZWQgbG9uZyBzdXBwb3J0ZWRfb3JkZXJzO1xuIDE5MTpcdFxuIDE5MjpcdFx0LyogQ2hlY2sgdGhlIGludGVyc2VjdGlvbiBvZiByZXF1ZXN0ZWQgYW5kIHN1cHBvcnRlZCBvcmRlcnMuICovXG4gMTkzOlx0XHRpZiAodm1hX2lzX2Fub255bW91cyh2bWEpKVxuIDE5NDpcdFx0XHRzdXBwb3J0ZWRfb3JkZXJzID0gVEhQX09SREVSU19BTExfQU5PTjtcbiAxOTU6XHRcdGVsc2UgaWYgKHZtYV9pc19kYXgodm1hKSB8fCB2bWFfaXNfc3BlY2lhbF9odWdlKHZtYSkpXG4gMTk2Olx0XHRcdHN1cHBvcnRlZF9vcmRlcnMgPSBUSFBfT1JERVJTX0FMTF9TUEVDSUFMX0RBWDtcbiAxOTc6XHRcdGVsc2VcbiAxOTg6XHRcdFx0c3VwcG9ydGVkX29yZGVycyA9IFRIUF9PUkRFUlNfQUxMX0ZJTEVfREVGQVVMVDtcbiAxOTk6XHRcbiAyMDA6XHRcdG9yZGVycyBcdTAwMjY9IHN1cHBvcnRlZF9vcmRlcnM7XG4gMjAxOlx0XHRpZiAoIW9yZGVycylcbiAyMDI6XHRcdFx0cmV0dXJuIDA7XG4gMjAzOlx0XG4gMjA0Olx0XHRpZiAoIXZtYS1cdTAwM2V2bV9tbSlcdFx0LyogdmRzbyAqL1xuIDIwNTpcdFx0XHRyZXR1cm4gMDtcbiAyMDY6XHRcbiAyMDc6XHRcdGlmICh0aHBfZGlzYWJsZWRfYnlfaHcoKSB8fCB2bWFfdGhwX2Rpc2FibGVkKHZtYSwgdm1fZmxhZ3MsIGZvcmNlZF9jb2xsYXBzZSkpXG4gMjA4Olx0XHRcdHJldHVybiAwO1xuIDIwOTpcdFxuIDIxMDpcdFx0Lyoga2h1Z2VwYWdlZCBkb2VzbiYjMzk7dCBjb2xsYXBzZSBEQVggdm1hLCBidXQgcGFnZSBmYXVsdCBpcyBmaW5lLiAqL1xuIDIxMTpcdFx0aWYgKHZtYV9pc19kYXgodm1hKSlcbiAyMTI6XHRcdFx0cmV0dXJuIGluX3BmID8gb3JkZXJzIDogMDtcbiAyMTM6XHRcbiAyMTQ6XHRcdC8qXG4gMjE1Olx0XHQgKiBraHVnZXBhZ2VkIHNwZWNpYWwgVk1BIGFuZCBodWdldGxiIFZNQS5cbiAyMTY6XHRcdCAqIE11c3QgYmUgY2hlY2tlZCBhZnRlciBkYXggc2luY2Ugc29tZSBkYXggbWFwcGluZ3MgbWF5IGhhdmVcbiAyMTc6XHRcdCAqIFZNX01JWEVETUFQIHNldC5cbiAyMTg6XHRcdCAqL1xuIDIxOTpcdFx0aWYgKCFpbl9wZiBcdTAwMjZcdTAwMjYgIXNtYXBzIFx1MDAyNlx1MDAyNiAodm1fZmxhZ3MgXHUwMDI2IFZNX05PX0tIVUdFUEFHRUQpKVxuIDIyMDpcdFx0XHRyZXR1cm4gMDtcbiAyMjE6XHRcbiAyMjI6XHRcdC8qXG4gMjIzOlx0XHQgKiBDaGVjayBhbGlnbm1lbnQgZm9yIGZpbGUgdm1hIGFuZCBzaXplIGZvciBib3RoIGZpbGUgYW5kIGFub24gdm1hIGJ5XG4gMjI0Olx0XHQgKiBmaWx0ZXJpbmcgb3V0IHRoZSB1bnN1aXRhYmxlIG9yZGVycy5cbiAyMjU6XHRcdCAqXG4gMjI2Olx0XHQgKiBTa2lwIHRoZSBjaGVjayBmb3IgcGFnZSBmYXVsdC4gSHVnZSBmYXVsdCBkb2VzIHRoZSBjaGVjayBpbiBmYXVsdFxuIDIyNzpcdFx0ICogaGFuZGxlcnMuXG4gMjI4Olx0XHQgKi9cbiAyMjk6XHRcdGlmICghaW5fcGYpIHtcbiAyMzA6XHRcdFx0aW50IG9yZGVyID0gaGlnaGVzdF9vcmRlcihvcmRlcnMpO1xuIDIzMTpcdFx0XHR1bnNpZ25lZCBsb25nIGFkZHI7XG4gMjMyOlx0XG4gMjMzOlx0XHRcdHdoaWxlIChvcmRlcnMpIHtcbiAyMzQ6XHRcdFx0XHRhZGRyID0gdm1hLVx1MDAzZXZtX2VuZCAtIChQQUdFX1NJWkUgXHUwMDNjXHUwMDNjIG9yZGVyKTtcbiAyMzU6XHRcdFx0XHRpZiAodGhwX3ZtYV9zdWl0YWJsZV9vcmRlcih2bWEsIGFkZHIsIG9yZGVyKSlcbiAyMzY6XHRcdFx0XHRcdGJyZWFrO1xuIDIzNzpcdFx0XHRcdG9yZGVyID0gbmV4dF9vcmRlcihcdTAwMjZvcmRlcnMsIG9yZGVyKTtcbiAyMzg6XHRcdFx0fVxuIDIzOTpcdFxuIDI0MDpcdFx0XHRpZiAoIW9yZGVycylcbiAyNDE6XHRcdFx0XHRyZXR1cm4gMDtcbiAyNDI6XHRcdH1cbiAyNDM6XHRcbiAyNDQ6XHRcdC8qXG4gMjQ1Olx0XHQgKiBFbmFibGVkIHZpYSBzaG1lbSBtb3VudCBvcHRpb25zIG9yIHN5c2ZzIHNldHRpbmdzLlxuIDI0NjpcdFx0ICogTXVzdCBiZSBkb25lIGJlZm9yZSBodWdlcGFnZSBmbGFncyBjaGVjayBzaW5jZSBzaG1lbSBoYXMgaXRzXG4gMjQ3Olx0XHQgKiBvd24gZmxhZ3MuXG4gMjQ4Olx0XHQgKi9cbiAyNDk6XHRcdGlmICghaW5fcGYgXHUwMDI2XHUwMDI2IHNobWVtX2ZpbGUodm1hLVx1MDAzZXZtX2ZpbGUpKVxuIDI1MDpcdFx0XHRyZXR1cm4gb3JkZXJzIFx1MDAyNiBzaG1lbV9hbGxvd2FibGVfaHVnZV9vcmRlcnMoZmlsZV9pbm9kZSh2bWEtXHUwMDNldm1fZmlsZSksXG4gMjUxOlx0XHRcdFx0XHRcdFx0ICAgdm1hLCB2bWFfc3RhcnRfcGdvZmYodm1hKSwgMCxcbiAyNTI6XHRcdFx0XHRcdFx0XHQgICBmb3JjZWRfY29sbGFwc2UpO1xuIDI1MzpcdFxuIDI1NDpcdFx0aWYgKCF2bWFfaXNfYW5vbnltb3VzKHZtYSkpXG4gMjU1Olx0XHRcdHJldHVybiB2bWFfZmlsZV9jYW5fbWFwX2h1Z2Uodm1hLCB2bV9mbGFncywgdHlwZSkgPyBvcmRlcnMgOiAwO1xuIDI1NjpcdFxuIDI1NzpcdFx0aWYgKHZtYV9pc190ZW1wb3Jhcnlfc3RhY2sodm1hKSlcbiAyNTg6XHRcdFx0cmV0dXJuIDA7XG4gMjU5Olx0XG4gMjYwOlx0XHQvKlxuIDI2MTpcdFx0ICogVEhQZWxpZ2libGUgYml0IG9mIHNtYXBzIHNob3VsZCBzaG93IDEgZm9yIHByb3BlciBWTUFzIGV2ZW5cbiAyNjI6XHRcdCAqIHRob3VnaCBhbm9uX3ZtYSBpcyBub3QgaW5pdGlhbGl6ZWQgeWV0LlxuIDI2MzpcdFx0ICpcbiAyNjQ6XHRcdCAqIEFsbG93IHBhZ2UgZmF1bHQgc2luY2UgYW5vbl92bWEgbWF5IGJlIG5vdCBpbml0aWFsaXplZCB1bnRpbFxuIDI2NTpcdFx0ICogdGhlIGZpcnN0IHBhZ2UgZmF1bHQuXG4gMjY2Olx0XHQgKi9cbiAyNjc6XHRcdGlmICghdm1hLVx1MDAzZWFub25fdm1hKVxuIDI2ODpcdFx0XHRyZXR1cm4gKHNtYXBzIHx8IGluX3BmKSA/IG9yZGVycyA6IDA7XG4gMjY5Olx0XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Ny8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDcgMjE6NTU8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNzc3OAoJCQkJCQkJb3V0cHV0OiAyOAoJCQkJCQkJdGhvdWdodHM6IDQyNAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipJbnZlc3RpZ2F0aW5nIGEgUG90ZW50aWFsIE5VTEwgUG9pbnRlciBEZXJlZmVyZW5jZSBpbiBGaWxlIFZNQXMqKgoKT2theSwgc28gSSYjMzk7bSBkaWdnaW5nIGludG8gdGhpcyBgdm1hX2ZpbGVfY2FuX21hcF9odWdlYCBmdW5jdGlvbiwgYW5kIGl0JiMzOTtzIHVzaW5nIGB2bWEtJmd0O3ZtX29wcy0mZ3Q7aHVnZV9mYXVsdGAuIE15IGltbWVkaWF0ZSB0aG91Z2h0IGlzLCAmIzM0O1doYXQgaWYgYHZtYS0mZ3Q7dm1fb3BzYCBpcyBOVUxMPyYjMzQ7IEl0JiMzOTtzIGEgY2xhc3NpYyBjaGVjaywgc28gSSBzdGFydCB0byBsb29rIGF0IGl0LgoKU3BlY2lmaWNhbGx5LCBJIHNlZSBhIGxpbmUgaW4gYHZtYV9maWxlX2Nhbl9tYXBfaHVnZWAgdGhhdCBkZWNsYXJlcyBgY29uc3QgYm9vbCBoYXNfaHVnZV9mYXVsdCA9IHZtYS0mZ3Q7dm1fb3BzLSZndDtodWdlX2ZhdWx0O2AuIEhvbGQgb24hIElzIGB2bWEtJmd0O3ZtX29wc2AgKmFsd2F5cyogbm9uLU5VTEwgZm9yIGZpbGUgVk1Bcz8gSSBuZWVkIHRvIGNsYXJpZnkgdGhhdC4KClRoZW4sIHRoZSBxdWVzdGlvbiBvZiBhbm9ueW1vdXMgVk1BcyBwb3BzIHVwLCBzbyBJIG5lZWQgdG8gY2hlY2sgYCF2bWFfaXNfYW5vbnltb3VzKHZtYSlgLiBDb3VsZCBgdm1hLSZndDt2bV9vcHNgICpzdGlsbCogYmUgTlVMTD8gQWhhISBNeSB1bmRlcnN0YW5kaW5nIG9mIHRoZSBMaW51eCBrZXJuZWwgbWVtb3J5IG1hbmFnZW1lbnQgaW50ZXJuYWxzIHRlbGxzIG1lIHRoYXQgaXQgYWN0dWFsbHkgKmlzKiBwb3NzaWJsZSBmb3IgZmlsZSBWTUFzIHRvIGhhdmUgYHZtYS0mZ3Q7dm1fb3BzID09IE5VTExgISBTcGVjaWZpY2FsbHksIHRoZXJlIGFyZSBzaXR1YXRpb25zIHdoZXJlIGEgZHJpdmVyIG9yIGZpbGUgY3JlYXRlcyBhIFZNQSB3aXRob3V0IHByb3ZpZGluZyBgdm1fb3BzYCwgbGlrZSB3aXRoIGdlbmVyaWMgbW1hcCBvcGVyYXRpb25zLgoKQWxyaWdodCwgdGltZSB0byBiYWNrIHVwIGEgbGl0dGxlIGFuZCB0aGluayBhYm91dCBob3cgYHZtYS0mZ3Q7dm1fb3BzYCBoYXMgYmVlbiBoYW5kbGVkIHVwIHRvIG5vdy4gTGV0IG1lIHNlZSB3aGVyZSB0aGlzIHZhcmlhYmxlIGlzIGFjY2Vzc2VkIGFuZCBob3cgaXQmIzM5O3MgaGFuZGxlZC4gRm9yIGV4YW1wbGU6CmBgYGMKaWYgKCgoaW5fcGYgfHwgc21hcHMpKSAmYW1wOyZhbXA7IHZtYS0mZ3Q7dm1fb3BzLSZndDtodWdlX2ZhdWx0KQpgYGAKSXMgYHZtYS0mZ3Q7dm1fb3BzYCBldmVyIGNoZWNrZWQgZm9yIGJlaW5nIE5VTEwgc29tZXdoZXJlIGVsc2U/IFRoaXMgaXMgY3JpdGljYWwuCgpJJiMzOTttIGFsc28gc2VlaW5nIGB2bWFfZmlsZV9ieXBhc3NfdGhwX3R1bmVhYmxlc2A6CgpgYGBjCnN0YXRpYyBib29sIHZtYV9maWxlX2J5cGFzc190aHBfdHVuZWFibGVzKGNvbnN0IHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAoJCWVudW0gdHZhX3R5cGUgdHlwZSkKewoJY29uc3QgYm9vbCBoYXNfaHVnZV9mYXVsdCA9IHZtYS0mZ3Q7dm1fb3BzLSZndDtodWdlX2ZhdWx0OwpgYGAKCklmIGB2bWEtJmd0O3ZtX29wc2AgKmlzKiBOVUxMIChvciwgbW9yZSBzcGVjaWZpY2FsbHksIGlmIHdlJiMzOTtyZSBkZWFsaW5nIHdpdGggYSBmaWxlIFZNQSB3aGVyZSBgdm1hLSZndDt2bV9vcHMgPT0gTlVMTGApLCB0aGVuIGRlcmVmZXJlbmNpbmcgYHZtYS0mZ3Q7dm1fb3BzLSZndDtodWdlX2ZhdWx0YCBpcyBnb2luZyB0byBjYXVzZSBhIE5VTEwgcG9pbnRlciBkZXJlZmVyZW5jZSEgVGhhdCYjMzk7cyBhIHNlcmlvdXMgYnVnIGNhbmRpZGF0ZS4gSSYjMzk7ZCBiZXR0ZXIgYmUgY2FyZWZ1bCBhbmQgbm90ZSB0aGF0IHRoaXMgaXMgbXkgY3VycmVudCBsaW5lIG9mIHRoaW5raW5nLgoKTm93LCBsZXQmIzM5O3MgZ3JlcCBpbiB0aGUgYG1tL2AgZGlyZWN0b3J5IGZvciBgdm1hLSZndDt2bV9vcHNgIGFuZCBzZWUgaWYgdGhlcmUgYXJlIG90aGVyIHBsYWNlcyB3aGVyZSBgdm1hLSZndDt2bV9vcHNgIGNvdWxkIGJlIE5VTEwgZm9yIGZpbGUgVk1Bcy4gVGhpcyBpcyB3aGVyZSBJIG5lZWQgdG8gc3RhcnQgZ2F0aGVyaW5nIGV2aWRlbmNlLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjgvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA3IDIxOjU1PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O3ZtYS1cdTAwM2V2bV9vcHMmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDttbS8mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bW0vZGVidWcuYz0xNTU9dm9pZCBkdW1wX3ZtYShjb25zdCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSlcbi0tXG5tbS9kZWJ1Zy5jLTE2NS1cdFx0KHVuc2lnbmVkIGxvbmcpcGdwcm90X3ZhbCh2bWEtXHUwMDNldm1fcGFnZV9wcm90KSxcbm1tL2RlYnVnLmM6MTY2Olx0XHR2bWEtXHUwMDNlYW5vbl92bWEsIHZtYS1cdTAwM2V2bV9vcHMsIHZtYV9zdGFydF9wZ29mZih2bWEpLFxubW0vZGVidWcuYy0xNjctXHRcdHZtYS1cdTAwM2V2bV9maWxlLCB2bWEtXHUwMDNldm1fcHJpdmF0ZV9kYXRhLFxuLS1cbm1tL2ZpbGVtYXAuYz00MDQwPWludCBnZW5lcmljX2ZpbGVfbW1hcChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpXG4tLVxubW0vZmlsZW1hcC5jLTQwNDYtXHRmaWxlX2FjY2Vzc2VkKGZpbGUpO1xubW0vZmlsZW1hcC5jOjQwNDc6XHR2bWEtXHUwMDNldm1fb3BzID0gXHUwMDI2Z2VuZXJpY19maWxlX3ZtX29wcztcbm1tL2ZpbGVtYXAuYy00MDQ4LVx0cmV0dXJuIDA7XG4tLVxubW0vZ3VwLmM9NjExPXN0YXRpYyBzdHJ1Y3QgcGFnZSAqbm9fcGFnZV90YWJsZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbi0tXG5tbS9ndXAuYy02MjgtXHRcdFx0cmV0dXJuIEVSUl9QVFIoLUVGQVVMVCk7XG5tbS9ndXAuYzo2Mjk6XHR9IGVsc2UgaWYgKCh2bWFfaXNfYW5vbnltb3VzKHZtYSkgfHwgIXZtYS1cdTAwM2V2bV9vcHMtXHUwMDNlZmF1bHQpKSB7XG5tbS9ndXAuYy02MzAtXHRcdHJldHVybiBFUlJfUFRSKC1FRkFVTFQpO1xuLS1cbm1tL2h1Z2VfbWVtb3J5LmM9MTIxPXN0YXRpYyBib29sIHZtYV9maWxlX2J5cGFzc190aHBfdHVuZWFibGVzKGNvbnN0IHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuLS1cbm1tL2h1Z2VfbWVtb3J5LmMtMTIzLXtcbm1tL2h1Z2VfbWVtb3J5LmM6MTI0Olx0Y29uc3QgYm9vbCBoYXNfaHVnZV9mYXVsdCA9IHZtYS1cdTAwM2V2bV9vcHMtXHUwMDNlaHVnZV9mYXVsdDtcbm1tL2h1Z2VfbWVtb3J5LmMtMTI1LVxuLS1cbm1tL2h1Z2VfbWVtb3J5LmM9MTUzPXN0YXRpYyBib29sIHZtYV9maWxlX2Nhbl9tYXBfaHVnZShjb25zdCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbi0tXG5tbS9odWdlX21lbW9yeS5jLTE1NS17XG5tbS9odWdlX21lbW9yeS5jOjE1NjpcdGNvbnN0IGJvb2wgaGFzX2h1Z2VfZmF1bHQgPSB2bWEtXHUwMDNldm1fb3BzLVx1MDAzZWh1Z2VfZmF1bHQ7XG5tbS9odWdlX21lbW9yeS5jLTE1Ny1cbi0tXG5tbS9pbnRlcm5hbC5oPTIzNj1zdGF0aWMgaW5saW5lIGludCBtbWFwX2ZpbGUoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKVxuLS1cbm1tL2ludGVybmFsLmgtMjQ3LVx0ICovXG5tbS9pbnRlcm5hbC5oOjI0ODpcdHZtYS1cdTAwM2V2bV9vcHMgPSBcdTAwMjZ2bWFfZHVtbXlfdm1fb3BzO1xubW0vaW50ZXJuYWwuaC0yNDktXG4tLVxubW0vaW50ZXJuYWwuaD0yNTg9c3RhdGljIGlubGluZSB2b2lkIHZtYV9jbG9zZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSlcbm1tL2ludGVybmFsLmgtMjU5LXtcbm1tL2ludGVybmFsLmg6MjYwOlx0aWYgKHZtYS1cdTAwM2V2bV9vcHMgXHUwMDI2XHUwMDI2IHZtYS1cdTAwM2V2bV9vcHMtXHUwMDNlY2xvc2UpIHtcbm1tL2ludGVybmFsLmg6MjYxOlx0XHR2bWEtXHUwMDNldm1fb3BzLVx1MDAzZWNsb3NlKHZtYSk7XG5tbS9pbnRlcm5hbC5oLTI2Mi1cbi0tXG5tbS9pbnRlcm5hbC5oLTI2Ni1cdFx0ICovXG5tbS9pbnRlcm5hbC5oOjI2NzpcdFx0dm1hLVx1MDAzZXZtX29wcyA9IFx1MDAyNnZtYV9kdW1teV92bV9vcHM7XG5tbS9pbnRlcm5hbC5oLTI2OC1cdH1cbi0tXG5tbS9tZW1vcnkuYz02Mjg9c3RhdGljIHZvaWQgcHJpbnRfYmFkX3BhZ2VfbWFwKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuLS1cbm1tL21lbW9yeS5jLTY1OC1cdFx0IHZtYS1cdTAwM2V2bV9maWxlLFxubW0vbWVtb3J5LmM6NjU5Olx0XHQgdm1hLVx1MDAzZXZtX29wcyA/IHZtYS1cdTAwM2V2bV9vcHMtXHUwMDNlZmF1bHQgOiBOVUxMLFxubW0vbWVtb3J5LmMtNjYwLVx0XHQgdm1hLVx1MDAzZXZtX2ZpbGUgPyB2bWEtXHUwMDNldm1fZmlsZS1cdTAwM2VmX29wLVx1MDAzZW1tYXAgOiBOVUxMLFxuLS1cbm1tL21lbW9yeS5jPTc1NT1zdGF0aWMgaW5saW5lIHN0cnVjdCBwYWdlICpfX3ZtX25vcm1hbF9wYWdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuLS1cbm1tL21lbW9yeS5jLTc2MS0jaWZkZWYgQ09ORklHX0ZJTkRfTk9STUFMX1BBR0Vcbm1tL21lbW9yeS5jOjc2MjpcdFx0XHRpZiAodm1hLVx1MDAzZXZtX29wcyBcdTAwMjZcdTAwMjYgdm1hLVx1MDAzZXZtX29wcy1cdTAwM2VmaW5kX25vcm1hbF9wYWdlKVxubW0vbWVtb3J5LmM6NzYzOlx0XHRcdFx0cmV0dXJuIHZtYS1cdTAwM2V2bV9vcHMtXHUwMDNlZmluZF9ub3JtYWxfcGFnZSh2bWEsIGFkZHIpO1xubW0vbWVtb3J5LmMtNzY0LSNlbmRpZiAvKiBDT05GSUdfRklORF9OT1JNQUxfUEFHRSAqL1xuLS1cbm1tL21lbW9yeS5jPTI0MzQ9c3RhdGljIGJvb2wgdm1fbWl4ZWRfemVyb3BhZ2VfYWxsb3dlZChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSlcbi0tXG5tbS9tZW1vcnkuYy0yNDU0LVx0ICogYmUgcHJvYmxlbWF0aWMgYXMgc29vbiBhcyB0aGUgemVyb3BhZ2UgZ2V0cyByZXBsYWNlZCBieSBhIGRpZmZlcmVudFxubW0vbWVtb3J5LmM6MjQ1NTpcdCAqIHBhZ2UgZHVlIHRvIHZtYS1cdTAwM2V2bV9vcHMtXHUwMDNlcGZuX21rd3JpdGUsIGJlY2F1c2Ugd2hhdCYjMzk7cyBtYXBwZWQgd291bGRcbm1tL21lbW9yeS5jLTI0NTYtXHQgKiBub3cgZGlmZmVyIHRvIHdoYXQgR1VQIGxvb2tlZCB1cC4gRlNEQVggaXMgaW5jb21wYXRpYmxlIHRvXG4tLVxubW0vbWVtb3J5LmMtMjQ1OS1cdCAqL1xubW0vbWVtb3J5LmM6MjQ2MDpcdHJldHVybiB2bWEtXHUwMDNldm1fb3BzIFx1MDAyNlx1MDAyNiB2bWEtXHUwMDNldm1fb3BzLVx1MDAzZXBmbl9ta3dyaXRlIFx1MDAyNlx1MDAyNlxubW0vbWVtb3J5LmMtMjQ2MS1cdCAgICAgICAodm1hX2lzX2ZzZGF4KHZtYSkgfHwgdm1hLVx1MDAzZXZtX2ZsYWdzIFx1MDAyNiBWTV9JTyk7XG4tLVxubW0vbWVtb3J5LmM9MzgwNT1zdGF0aWMgdm1fZmF1bHRfdCBkb19wYWdlX21rd3JpdGUoc3RydWN0IHZtX2ZhdWx0ICp2bWYsIHN0cnVjdCBmb2xpbyAqZm9saW8pXG4tLVxubW0vbWVtb3J5LmMtMzgxNS1cbm1tL21lbW9yeS5jOjM4MTY6XHRyZXQgPSB2bWYtXHUwMDNldm1hLVx1MDAzZXZtX29wcy1cdTAwM2VwYWdlX21rd3JpdGUodm1mKTtcbm1tL21lbW9yeS5jLTM4MTctXHQvKiBSZXN0b3JlIG9yaWdpbmFsIGZsYWdzIHNvIHRoYXQgY2FsbGVyIGlzIG5vdCBzdXJwcmlzZWQgKi9cbi0tXG5tbS9tZW1vcnkuYz0zODM4PXN0YXRpYyB2bV9mYXVsdF90IGZhdWx0X2RpcnR5X3NoYXJlZF9wYWdlKHN0cnVjdCB2bV9mYXVsdCAqdm1mKVxuLS1cbm1tL21lbW9yeS5jLTM4NDMtXHRib29sIGRpcnRpZWQ7XG5tbS9tZW1vcnkuYzozODQ0Olx0Ym9vbCBwYWdlX21rd3JpdGUgPSB2bWEtXHUwMDNldm1fb3BzIFx1MDAyNlx1MDAyNiB2bWEtXHUwMDNldm1fb3BzLVx1MDAzZXBhZ2VfbWt3cml0ZTtcbm1tL21lbW9yeS5jLTM4NDUtXG4tLVxubW0vbWVtb3J5LmM9MzkyNT1zdGF0aWMgaW5saW5lIHZtX2ZhdWx0X3Qgdm1mX2Nhbl9jYWxsX2ZhdWx0KGNvbnN0IHN0cnVjdCB2bV9mYXVsdCAqdm1mKVxuLS1cbm1tL21lbW9yeS5jLTM5MjgtXG5tbS9tZW1vcnkuYzozOTI5Olx0aWYgKHZtYS1cdTAwM2V2bV9vcHMtXHUwMDNlbWFwX3BhZ2VzIHx8ICEodm1mLVx1MDAzZWZsYWdzIFx1MDAyNiBGQVVMVF9GTEFHX1ZNQV9MT0NLKSlcbm1tL21lbW9yeS5jLTM5MzAtXHRcdHJldHVybiAwO1xuLS1cbm1tL21lbW9yeS5jPTQxNzc9c3RhdGljIHZtX2ZhdWx0X3Qgd3BfcGZuX3NoYXJlZChzdHJ1Y3Qgdm1fZmF1bHQgKnZtZilcbi0tXG5tbS9tZW1vcnkuYy00MTgwLVxubW0vbWVtb3J5LmM6NDE4MTpcdGlmICh2bWEtXHUwMDNldm1fb3BzIFx1MDAyNlx1MDAyNiB2bWEtXHUwMDNldm1fb3BzLVx1MDAzZXBmbl9ta3dyaXRlKSB7XG5tbS9tZW1vcnkuYy00MTgyLVx0XHR2bV9mYXVsdF90IHJldDtcbi0tXG5tbS9tZW1vcnkuYy00MTg5LVx0XHR2bWYtXHUwMDNlZmxhZ3MgfD0gRkFVTFRfRkxBR19NS1dSSVRFO1xubW0vbWVtb3J5LmM6NDE5MDpcdFx0cmV0ID0gdm1hLVx1MDAzZXZtX29wcy1cdTAwM2VwZm5fbWt3cml0ZSh2bWYpO1xubW0vbWVtb3J5LmMtNDE5MS1cdFx0aWYgKHJldCBcdTAwMjYgKFZNX0ZBVUxUX0VSUk9SIHwgVk1fRkFVTFRfTk9QQUdFKSlcbi0tXG5tbS9tZW1vcnkuYz00MTk5PXN0YXRpYyB2bV9mYXVsdF90IHdwX3BhZ2Vfc2hhcmVkKHN0cnVjdCB2bV9mYXVsdCAqdm1mLCBzdHJ1Y3QgZm9saW8gKmZvbGlvKVxuLS1cbm1tL21lbW9yeS5jLTQyMDYtXG5tbS9tZW1vcnkuYzo0MjA3Olx0aWYgKHZtYS1cdTAwM2V2bV9vcHMgXHUwMDI2XHUwMDI2IHZtYS1cdTAwM2V2bV9vcHMtXHUwMDNlcGFnZV9ta3dyaXRlKSB7XG5tbS9tZW1vcnkuYy00MjA4LVx0XHR2bV9mYXVsdF90IHRtcDtcbi0tXG5tbS9tZW1vcnkuYz01NDI3PXN0YXRpYyB2bV9mYXVsdF90IGRvX2Fub255bW91c19wYWdlKHN0cnVjdCB2bV9mYXVsdCAqdm1mKVxuLS1cbm1tL21lbW9yeS5jLTU1MzQtICogKHNlZSBGQVVMVF9GTEFHX1ZNQV9MT0NLKSBhbmQgbWF5IGhhdmUgYmVlbiByZWxlYXNlZCBkZXBlbmRpbmcgb25cbm1tL21lbW9yeS5jOjU1MzU6ICogZmxhZ3MgYW5kIHZtYS1cdTAwM2V2bV9vcHMtXHUwMDNlZmF1bHQoKSByZXR1cm4gdmFsdWUuXG5tbS9tZW1vcnkuYy01NTM2LSAqIFNlZSBmaWxlbWFwX2ZhdWx0KCkgYW5kIF9fZm9saW9fbG9ja19vcl9yZXRyeSgpLlxuLS1cbm1tL21lbW9yeS5jPTU1Mzg9c3RhdGljIHZtX2ZhdWx0X3QgX19kb19mYXVsdChzdHJ1Y3Qgdm1fZmF1bHQgKnZtZilcbi0tXG5tbS9tZW1vcnkuYy01NTY0LVxubW0vbWVtb3J5LmM6NTU2NTpcdHJldCA9IHZtYS1cdTAwM2V2bV9vcHMtXHUwMDNlZmF1bHQodm1mKTtcbm1tL21lbW9yeS5jLTU1NjYtXHRpZiAodW5saWtlbHkocmV0IFx1MDAyNiAoVk1fRkFVTFRfRVJST1IgfCBWTV9GQVVMVF9OT1BBR0UgfCBWTV9GQVVMVF9SRVRSWSB8XG4tLVxubW0vbWVtb3J5LmM9NTkzND1zdGF0aWMgdm1fZmF1bHRfdCBkb19mYXVsdF9hcm91bmQoc3RydWN0IHZtX2ZhdWx0ICp2bWYpXG4tLVxubW0vbWVtb3J5LmMtNTk1Ny1cdHJjdV9yZWFkX2xvY2soKTtcbm1tL21lbW9yeS5jOjU5NTg6XHRyZXQgPSB2bWYtXHUwMDNldm1hLVx1MDAzZXZtX29wcy1cdTAwM2VtYXBfcGFnZXModm1mLFxubW0vbWVtb3J5LmMtNTk1OS1cdFx0XHR2bWYtXHUwMDNlcGdvZmYgJiM0MzsgZnJvbV9wdGUgLSBwdGVfb2ZmLFxuLS1cbm1tL21lbW9yeS5jPTU5Njc9c3RhdGljIGlubGluZSBib29sIHNob3VsZF9mYXVsdF9hcm91bmQoc3RydWN0IHZtX2ZhdWx0ICp2bWYpXG4tLVxubW0vbWVtb3J5LmMtNTk2OS1cdC8qIE5vIC1cdTAwM2VtYXBfcGFnZXM/ICBObyB3YXkgdG8gZmF1bHQgYXJvdW5kLi4uICovXG5tbS9tZW1vcnkuYzo1OTcwOlx0aWYgKCF2bWYtXHUwMDNldm1hLVx1MDAzZXZtX29wcy1cdTAwM2VtYXBfcGFnZXMpXG5tbS9tZW1vcnkuYy01OTcxLVx0XHRyZXR1cm4gZmFsc2U7XG4tLVxubW0vbWVtb3J5LmM9NjA1ND1zdGF0aWMgdm1fZmF1bHRfdCBkb19zaGFyZWRfZmF1bHQoc3RydWN0IHZtX2ZhdWx0ICp2bWYpXG4tLVxubW0vbWVtb3J5LmMtNjA3My1cdCAqL1xubW0vbWVtb3J5LmM6NjA3NDpcdGlmICh2bWEtXHUwMDNldm1fb3BzLVx1MDAzZXBhZ2VfbWt3cml0ZSkge1xubW0vbWVtb3J5LmMtNjA3NS1cdFx0Zm9saW9fdW5sb2NrKGZvbGlvKTtcbi0tXG5tbS9tZW1vcnkuYz02MTA0PXN0YXRpYyB2bV9mYXVsdF90IGRvX2ZhdWx0KHN0cnVjdCB2bV9mYXVsdCAqdm1mKVxuLS1cbm1tL21lbW9yeS5jLTYxMTItXHQgKi9cbm1tL21lbW9yeS5jOjYxMTM6XHRpZiAoIXZtYS1cdTAwM2V2bV9vcHMtXHUwMDNlZmF1bHQpIHtcbm1tL21lbW9yeS5jLTYxMTQtXHRcdHZtZi1cdTAwM2VwdGUgPSBwdGVfb2Zmc2V0X21hcF9sb2NrKHZtZi1cdTAwM2V2bWEtXHUwMDNldm1fbW0sIHZtZi1cdTAwM2VwbWQsXG4tLVxubW0vbWVtb3J5LmM9NjM3OT1zdGF0aWMgaW5saW5lIHZtX2ZhdWx0X3QgY3JlYXRlX2h1Z2VfcG1kKHN0cnVjdCB2bV9mYXVsdCAqdm1mKVxuLS1cbm1tL21lbW9yeS5jLTYzODMtXHRcdHJldHVybiBkb19odWdlX3BtZF9hbm9ueW1vdXNfcGFnZSh2bWYpO1xubW0vbWVtb3J5LmM6NjM4NDpcdGlmICh2bWEtXHUwMDNldm1fb3BzLVx1MDAzZWh1Z2VfZmF1bHQpXG5tbS9tZW1vcnkuYzo2Mzg1Olx0XHRyZXR1cm4gdm1hLVx1MDAzZXZtX29wcy1cdTAwM2VodWdlX2ZhdWx0KHZtZiwgUE1EX09SREVSKTtcbm1tL21lbW9yeS5jLTYzODYtXHRyZXR1cm4gVk1fRkFVTFRfRkFMTEJBQ0s7XG4tLVxubW0vbWVtb3J5LmM9NjM5MD1zdGF0aWMgaW5saW5lIHZtX2ZhdWx0X3Qgd3BfaHVnZV9wbWQoc3RydWN0IHZtX2ZhdWx0ICp2bWYpXG4tLVxubW0vbWVtb3J5LmMtNjQwNi1cdGlmICh2bWEtXHUwMDNldm1fZmxhZ3MgXHUwMDI2IChWTV9TSEFSRUQgfCBWTV9NQVlTSEFSRSkpIHtcbm1tL21lbW9yeS5jOjY0MDc6XHRcdGlmICh2bWEtXHUwMDNldm1fb3BzLVx1MDAzZWh1Z2VfZmF1bHQpIHtcbm1tL21lbW9yeS5jOjY0MDg6XHRcdFx0cmV0ID0gdm1hLVx1MDAzZXZtX29wcy1cdTAwM2VodWdlX2ZhdWx0KHZtZiwgUE1EX09SREVSKTtcbm1tL21lbW9yeS5jLTY0MDktXHRcdFx0aWYgKCEocmV0IFx1MDAyNiBWTV9GQVVMVF9GQUxMQkFDSykpXG4tLVxubW0vbWVtb3J5LmM9NjQyMT1zdGF0aWMgdm1fZmF1bHRfdCBjcmVhdGVfaHVnZV9wdWQoc3RydWN0IHZtX2ZhdWx0ICp2bWYpXG4tLVxubW0vbWVtb3J5LmMtNjQyOC1cdFx0cmV0dXJuIFZNX0ZBVUxUX0ZBTExCQUNLO1xubW0vbWVtb3J5LmM6NjQyOTpcdGlmICh2bWEtXHUwMDNldm1fb3BzLVx1MDAzZWh1Z2VfZmF1bHQpXG5tbS9tZW1vcnkuYzo2NDMwOlx0XHRyZXR1cm4gdm1hLVx1MDAzZXZtX29wcy1cdTAwM2VodWdlX2ZhdWx0KHZtZiwgUFVEX09SREVSKTtcbm1tL21lbW9yeS5jLTY0MzEtI2VuZGlmIC8qIENPTkZJR19UUkFOU1BBUkVOVF9IVUdFUEFHRSAqL1xuLS1cbm1tL21lbW9yeS5jPTY0MzU9c3RhdGljIHZtX2ZhdWx0X3Qgd3BfaHVnZV9wdWQoc3RydWN0IHZtX2ZhdWx0ICp2bWYsIHB1ZF90IG9yaWdfcHVkKVxuLS1cbm1tL21lbW9yeS5jLTY0NDUtXHRpZiAodm1hLVx1MDAzZXZtX2ZsYWdzIFx1MDAyNiAoVk1fU0hBUkVEIHwgVk1fTUFZU0hBUkUpKSB7XG5tbS9tZW1vcnkuYzo2NDQ2Olx0XHRpZiAodm1hLVx1MDAzZXZtX29wcy1cdTAwM2VodWdlX2ZhdWx0KSB7XG5tbS9tZW1vcnkuYzo2NDQ3Olx0XHRcdHJldCA9IHZtYS1cdTAwM2V2bV9vcHMtXHUwMDNlaHVnZV9mYXVsdCh2bWYsIFBVRF9PUkRFUik7XG5tbS9tZW1vcnkuYy02NDQ4LVx0XHRcdGlmICghKHJldCBcdTAwMjYgVk1fRkFVTFRfRkFMTEJBQ0spKVxuLS1cbm1tL21lbW9yeS5jPTcyMTA9c3RhdGljIGludCBfX2FjY2Vzc19yZW1vdGVfdm0oc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgYWRkcixcbi0tXG5tbS9tZW1vcnkuYy03MjU0LSNpZmRlZiBDT05GSUdfSEFWRV9JT1JFTUFQX1BST1Rcbm1tL21lbW9yeS5jOjcyNTU6XHRcdFx0aWYgKHZtYS1cdTAwM2V2bV9vcHMgXHUwMDI2XHUwMDI2IHZtYS1cdTAwM2V2bV9vcHMtXHUwMDNlYWNjZXNzKVxubW0vbWVtb3J5LmM6NzI1NjpcdFx0XHRcdGJ5dGVzID0gdm1hLVx1MDAzZXZtX29wcy1cdTAwM2VhY2Nlc3Modm1hLCBhZGRyLCBidWYsXG5tbS9tZW1vcnkuYy03MjU3LVx0XHRcdFx0XHRcdFx0ICAgIGxlbiwgd3JpdGUpO1xuLS1cbm1tL21lbXBvbGljeS5jPTEwMTI9c3RhdGljIGludCB2bWFfcmVwbGFjZV9wb2xpY3koc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4tLVxubW0vbWVtcG9saWN5LmMtMTAyNC1cbm1tL21lbXBvbGljeS5jOjEwMjU6XHRpZiAodm1hLVx1MDAzZXZtX29wcyBcdTAwMjZcdTAwMjYgdm1hLVx1MDAzZXZtX29wcy1cdTAwM2VzZXRfcG9saWN5KSB7XG5tbS9tZW1wb2xpY3kuYzoxMDI2Olx0XHRlcnIgPSB2bWEtXHUwMDNldm1fb3BzLVx1MDAzZXNldF9wb2xpY3kodm1hLCBuZXcpO1xubW0vbWVtcG9saWN5LmMtMTAyNy1cdFx0aWYgKGVycilcbi0tXG5tbS9tZW1wb2xpY3kuYz0yMDIxPXN0cnVjdCBtZW1wb2xpY3kgKl9fZ2V0X3ZtYV9wb2xpY3koc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4tLVxubW0vbWVtcG9saWN5LmMtMjAyNC1cdCppbHggPSAwO1xubW0vbWVtcG9saWN5LmM6MjAyNTpcdHJldHVybiAodm1hLVx1MDAzZXZtX29wcyBcdTAwMjZcdTAwMjYgdm1hLVx1MDAzZXZtX29wcy1cdTAwM2VnZXRfcG9saWN5KSA/XG5tbS9tZW1wb2xpY3kuYzoyMDI2Olx0XHR2bWEtXHUwMDNldm1fb3BzLVx1MDAzZWdldF9wb2xpY3kodm1hLCBhZGRyLCBpbHgpIDogdm1hLVx1MDAzZXZtX3BvbGljeTtcbm1tL21lbXBvbGljeS5jLTIwMjctfVxuLS1cbm1tL21tYXAuYz0xNDY1PWJvb2wgdm1hX2lzX3NwZWNpYWxfbWFwcGluZyhjb25zdCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbi0tXG5tbS9tbWFwLmMtMTQ2OC1cdHJldHVybiB2bWEtXHUwMDNldm1fcHJpdmF0ZV9kYXRhID09IHNtIFx1MDAyNlx1MDAyNlxubW0vbW1hcC5jOjE0Njk6XHRcdHZtYS1cdTAwM2V2bV9vcHMgPT0gXHUwMDI2c3BlY2lhbF9tYXBwaW5nX3Ztb3BzO1xubW0vbW1hcC5jLTE0NzAtfVxuLS1cbm1tL21wcm90ZWN0LmM9ODcxPXN0YXRpYyBpbnQgZG9fbXByb3RlY3RfcGtleSh1bnNpZ25lZCBsb25nIHN0YXJ0LCBzaXplX3QgbGVuLFxuLS1cbm1tL21wcm90ZWN0LmMtOTk1LVxubW0vbXByb3RlY3QuYzo5OTY6XHRcdGlmICh2bWEtXHUwMDNldm1fb3BzIFx1MDAyNlx1MDAyNiB2bWEtXHUwMDNldm1fb3BzLVx1MDAzZW1wcm90ZWN0KSB7XG5tbS9tcHJvdGVjdC5jOjk5NzpcdFx0XHRlcnJvciA9IHZtYS1cdTAwM2V2bV9vcHMtXHUwMDNlbXByb3RlY3Qodm1hLCBuc3RhcnQsIHRtcCwgbmV3ZmxhZ3MpO1xubW0vbXByb3RlY3QuYy05OTgtXHRcdFx0aWYgKGVycm9yKVxuLS1cbm1tL21yZW1hcC5jPTExMTI9c3RhdGljIHVuc2lnbmVkIGxvbmcgcHJlcF9tb3ZlX3ZtYShzdHJ1Y3Qgdm1hX3JlbWFwX3N0cnVjdCAqdnJtKVxuLS1cbm1tL21yZW1hcC5jLTExMjctXG5tbS9tcmVtYXAuYzoxMTI4Olx0aWYgKHZtYS1cdTAwM2V2bV9vcHMgXHUwMDI2XHUwMDI2IHZtYS1cdTAwM2V2bV9vcHMtXHUwMDNlbWF5X3NwbGl0KSB7XG5tbS9tcmVtYXAuYy0xMTI5LVx0XHRpZiAodm1hLVx1MDAzZXZtX3N0YXJ0ICE9IG9sZF9hZGRyKVxubW0vbXJlbWFwLmM6MTEzMDpcdFx0XHRlcnIgPSB2bWEtXHUwMDNldm1fb3BzLVx1MDAzZW1heV9zcGxpdCh2bWEsIG9sZF9hZGRyKTtcbm1tL21yZW1hcC5jLTExMzEtXHRcdGlmICghZXJyIFx1MDAyNlx1MDAyNiB2bWEtXHUwMDNldm1fZW5kICE9IG9sZF9hZGRyICYjNDM7IG9sZF9sZW4pXG5tbS9tcmVtYXAuYzoxMTMyOlx0XHRcdGVyciA9IHZtYS1cdTAwM2V2bV9vcHMtXHUwMDNlbWF5X3NwbGl0KHZtYSwgb2xkX2FkZHIgJiM0Mzsgb2xkX2xlbik7XG5tbS9tcmVtYXAuYy0xMTMzLVx0XHRpZiAoZXJyKVxuLS1cbm1tL21yZW1hcC5jPTEyNjU9c3RhdGljIGludCBjb3B5X3ZtYV9hbmRfZGF0YShzdHJ1Y3Qgdm1hX3JlbWFwX3N0cnVjdCAqdnJtLFxuLS1cbm1tL21yZW1hcC5jLTEyOTQtXHRcdGVyciA9IC1FTk9NRU07XG5tbS9tcmVtYXAuYzoxMjk1Olx0ZWxzZSBpZiAodm1hLVx1MDAzZXZtX29wcyBcdTAwMjZcdTAwMjYgdm1hLVx1MDAzZXZtX29wcy1cdTAwM2VtcmVtYXApXG5tbS9tcmVtYXAuYzoxMjk2Olx0XHRlcnIgPSB2bWEtXHUwMDNldm1fb3BzLVx1MDAzZW1yZW1hcChuZXdfdm1hKTtcbm1tL21yZW1hcC5jLTEyOTctXG4tLVxubW0vc2VjcmV0bWVtLmM9MjEzPWJvb2wgdm1hX2lzX3NlY3JldG1lbShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSlcbm1tL3NlY3JldG1lbS5jLTIxNC17XG5tbS9zZWNyZXRtZW0uYzoyMTU6XHRyZXR1cm4gdm1hLVx1MDAzZXZtX29wcyA9PSBcdTAwMjZzZWNyZXRtZW1fdm1fb3BzO1xubW0vc2VjcmV0bWVtLmMtMjE2LX1cbi0tXG5tbS9zaG1lbS5jPTI4ND1ib29sIHZtYV9pc19hbm9uX3NobWVtKGNvbnN0IHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKVxubW0vc2htZW0uYy0yODUte1xubW0vc2htZW0uYzoyODY6XHRyZXR1cm4gdm1hLVx1MDAzZXZtX29wcyA9PSBcdTAwMjZzaG1lbV9hbm9uX3ZtX29wcztcbm1tL3NobWVtLmMtMjg3LX1cbi0tXG5tbS9zaG1lbS5jPTI4OT1ib29sIHZtYV9pc19zaG1lbShjb25zdCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSlcbm1tL3NobWVtLmMtMjkwLXtcbm1tL3NobWVtLmM6MjkxOlx0cmV0dXJuIHZtYV9pc19hbm9uX3NobWVtKHZtYSkgfHwgdm1hLVx1MDAzZXZtX29wcyA9PSBcdTAwMjZzaG1lbV92bV9vcHM7XG5tbS9zaG1lbS5jLTI5Mi19XG4tLVxubW0vc2htZW0uYz01OTA4PWludCBzaG1lbV96ZXJvX3NldHVwKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKVxuLS1cbm1tL3NobWVtLmMtNTkxNy1cdHZtYS1cdTAwM2V2bV9maWxlID0gZmlsZTtcbm1tL3NobWVtLmM6NTkxODpcdHZtYS1cdTAwM2V2bV9vcHMgPSBcdTAwMjZzaG1lbV9hbm9uX3ZtX29wcztcbm1tL3NobWVtLmMtNTkxOS1cbi0tXG5tbS91c2VyZmF1bHRmZC5jPTgzPXN0YXRpYyBjb25zdCBzdHJ1Y3Qgdm1fdWZmZF9vcHMgKnZtYV91ZmZkX29wcyhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSlcbi0tXG5tbS91c2VyZmF1bHRmZC5jLTg2LVx0XHRyZXR1cm4gXHUwMDI2YW5vbl91ZmZkX29wcztcbm1tL3VzZXJmYXVsdGZkLmM6ODc6XHRyZXR1cm4gdm1hLVx1MDAzZXZtX29wcy1cdTAwM2V1ZmZkX29wcztcbm1tL3VzZXJmYXVsdGZkLmMtODgtfVxuLS1cbm1tL3V0aWwuYz0xMTgwPXZvaWQgY29tcGF0X3NldF9kZXNjX2Zyb21fdm1hKHN0cnVjdCB2bV9hcmVhX2Rlc2MgKmRlc2MsXG4tLVxubW0vdXRpbC5jLTExOTQtXHRkZXNjLVx1MDAzZXBhZ2VfcHJvdCA9IHZtYS1cdTAwM2V2bV9wYWdlX3Byb3Q7XG5tbS91dGlsLmM6MTE5NTpcdGRlc2MtXHUwMDNldm1fb3BzID0gdm1hLVx1MDAzZXZtX29wcztcbm1tL3V0aWwuYy0xMTk2LVxuLS1cbm1tL3V0aWwuYz0xMzczPXN0YXRpYyBpbnQgY2FsbF92bWFfbWFwcGVkKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKVxubW0vdXRpbC5jLTEzNzQte1xubW0vdXRpbC5jOjEzNzU6XHRjb25zdCBzdHJ1Y3Qgdm1fb3BlcmF0aW9uc19zdHJ1Y3QgKnZtX29wcyA9IHZtYS1cdTAwM2V2bV9vcHM7XG5tbS91dGlsLmMtMTM3Ni1cdHZvaWQgKnZtX3ByaXZhdGVfZGF0YSA9IHZtYS1cdTAwM2V2bV9wcml2YXRlX2RhdGE7XG4tLVxubW0vdm1hLmM9NTQ0PV9fc3BsaXRfdm1hKHN0cnVjdCB2bWFfaXRlcmF0b3IgKnZtaSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4tLVxubW0vdm1hLmMtNTUzLVxubW0vdm1hLmM6NTU0Olx0aWYgKHZtYS1cdTAwM2V2bV9vcHMgXHUwMDI2XHUwMDI2IHZtYS1cdTAwM2V2bV9vcHMtXHUwMDNlbWF5X3NwbGl0KSB7XG5tbS92bWEuYzo1NTU6XHRcdGVyciA9IHZtYS1cdTAwM2V2bV9vcHMtXHUwMDNlbWF5X3NwbGl0KHZtYSwgYWRkcik7XG5tbS92bWEuYy01NTYtXHRcdGlmIChlcnIpXG4tLVxubW0vdm1hLmM9ODU1PXN0YXRpYyBib29sIGNhbl9tZXJnZV9yZW1vdmVfdm1hKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKVxubW0vdm1hLmMtODU2LXtcbm1tL3ZtYS5jOjg1NzpcdHJldHVybiAhdm1hLVx1MDAzZXZtX29wcyB8fCAhdm1hLVx1MDAzZXZtX29wcy1cdTAwM2VjbG9zZTtcbm1tL3ZtYS5jLTg1OC19XG4tLVxubW0vdm1hLmM9MTk0ND1zdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKmNvcHlfdm1hKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqKnZtYXAsXG4tLVxubW0vdm1hLmMtMjAxNi1cdFx0XHRnZXRfZmlsZShuZXdfdm1hLVx1MDAzZXZtX2ZpbGUpO1xubW0vdm1hLmM6MjAxNzpcdFx0aWYgKG5ld192bWEtXHUwMDNldm1fb3BzIFx1MDAyNlx1MDAyNiBuZXdfdm1hLVx1MDAzZXZtX29wcy1cdTAwM2VvcGVuKVxubW0vdm1hLmM6MjAxODpcdFx0XHRuZXdfdm1hLVx1MDAzZXZtX29wcy1cdTAwM2VvcGVuKG5ld192bWEpO1xubW0vdm1hLmMtMjAxOS1cdFx0aWYgKHZtYV9saW5rKG1tLCBuZXdfdm1hKSlcbi0tXG5tbS92bWEuYz0yMTg1PWJvb2wgdm1hX25lZWRzX2RpcnR5X3RyYWNraW5nKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKVxuLS1cbm1tL3ZtYS5jLTIxOTEtXHQvKiBEb2VzIHRoZSBmaWxlc3lzdGVtIG5lZWQgdG8gYmUgbm90aWZpZWQ/ICovXG5tbS92bWEuYzoyMTkyOlx0aWYgKHZtX29wc19uZWVkc193cml0ZW5vdGlmeSh2bWEtXHUwMDNldm1fb3BzKSlcbm1tL3ZtYS5jLTIxOTMtXHRcdHJldHVybiB0cnVlO1xuLS1cbm1tL3ZtYS5jPTIyMDg9Ym9vbCB2bWFfd2FudHNfd3JpdGVub3RpZnkoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHBncHJvdF90IHZtX3BhZ2VfcHJvdClcbi0tXG5tbS92bWEuYy0yMjE0LVx0LyogVGhlIGJhY2tlciB3aXNoZXMgdG8ga25vdyB3aGVuIHBhZ2VzIGFyZSBmaXJzdCB3cml0dGVuIHRvPyAqL1xubW0vdm1hLmM6MjIxNTpcdGlmICh2bV9vcHNfbmVlZHNfd3JpdGVub3RpZnkodm1hLVx1MDAzZXZtX29wcykpXG5tbS92bWEuYy0yMjE2LVx0XHRyZXR1cm4gdHJ1ZTtcbi0tXG5tbS92bWEuYz0yNzk5PXN0YXRpYyB2b2lkIHNldF92bWFfdXNlcl9kZWZpbmVkX2ZpZWxkcyhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbi0tXG5tbS92bWEuYy0yODAyLVx0aWYgKG1hcC1cdTAwM2V2bV9vcHMpXG5tbS92bWEuYzoyODAzOlx0XHR2bWEtXHUwMDNldm1fb3BzID0gbWFwLVx1MDAzZXZtX29wcztcbm1tL3ZtYS5jLTI4MDQtXHRlbHNlXHQvKiBPbmx5IC9kZXYvemVybyBzaG91bGQgZG8gdGhpcy4gKi9cbi0tXG5tbS92bWEuYz0zNDYxPXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqX19pbnN0YWxsX3NwZWNpYWxfbWFwcGluZyhcbi0tXG5tbS92bWEuYy0zNDgyLVxubW0vdm1hLmM6MzQ4MzpcdHZtYS1cdTAwM2V2bV9vcHMgPSBvcHM7XG5tbS92bWEuYy0zNDg0LVx0dm1hLVx1MDAzZXZtX3ByaXZhdGVfZGF0YSA9IHByaXY7XG4tLVxubW0vdm1hLmg9Mzg5PXN0YXRpYyBpbmxpbmUgdm9pZCBjb21wYXRfc2V0X3ZtYV9mcm9tX2Rlc2Moc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4tLVxubW0vdm1hLmgtNDA1LVx0LyogVXNlci1kZWZpbmVkIGZpZWxkcy4gKi9cbm1tL3ZtYS5oOjQwNjpcdHZtYS1cdTAwM2V2bV9vcHMgPSBkZXNjLVx1MDAzZXZtX29wcztcbm1tL3ZtYS5oLTQwNy1cdHZtYS1cdTAwM2V2bV9wcml2YXRlX2RhdGEgPSBkZXNjLVx1MDAzZXByaXZhdGVfZGF0YTtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD45LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNyAyMTo1NTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxNDc0MQoJCQkJCQkJb3V0cHV0OiAyNQoJCQkJCQkJdGhvdWdodHM6IDc0MgoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipNeSBBbmFseXNpcyBvZiB0aGlzIFBvdGVudGlhbCBWdWxuZXJhYmlsaXR5KioKCk9rYXksIGhlcmUmIzM5O3MgdGhlIGJyZWFrZG93biBvZiBteSB0aGlua2luZy4gTXkgaW5pdGlhbCBjb25jZXJuIHN0ZW1tZWQgZnJvbSB0aGUgYG1tYXBfZmlsZWAgZnVuY3Rpb24gYW5kIHRoZSBwb3RlbnRpYWwgZm9yIGEgbnVsbCBwb2ludGVyIGRlcmVmZXJlbmNlLiBJIHNlZSB0aGF0IGFub255bW91cyBWTUFzIGFuZCBkdW1teSBvbmVzIHVzZSBgdm1hX2R1bW15X3ZtX29wc2AsIGJ1dCBJJiMzOTttIHRoaW5raW5nIGFib3V0IHRoZSBjYXNlIHdoZXJlIGEgZHJpdmVyIG1pZ2h0IHNldCBgdm1hLSZndDt2bV9vcHMgPSBOVUxMYCBpbnRlbnRpb25hbGx5IG9yIGJ5IG92ZXJzaWdodC4gSSYjMzk7bSBpbWFnaW5pbmcgYSBzY2VuYXJpbyB3aGVyZSwgZXZlbiBpZiB0aGUgZHVtbXkgb3BlcmF0aW9ucyBhcmUgcHJlc2VudCwgYSBkcml2ZXIgY291bGQgc2V0IHRoaXMgcG9pbnRlciB0byBudWxsLiBXaGF0IGhhcHBlbnMgdGhlbiB3aGVuIHRoZSBjb2RlIGxhdGVyIHRyaWVzIHRvIHVzZSBgdm1hLSZndDt2bV9vcHNgIHdpdGhvdXQgY2hlY2tpbmcgaWYgaXQmIzM5O3MgTlVMTD8KClRoZW4gSSB6ZXJvZWQgaW4gb24gdGhlIGBtbS9odWdlX21lbW9yeS5jYCBmaWxlLCBzcGVjaWZpY2FsbHkgdGhlIGB2bWFfZmlsZV9ieXBhc3NfdGhwX3R1bmVhYmxlc2AgZnVuY3Rpb24uIEkgc2VlIGFuICp1bmNvbmRpdGlvbmFsKiBkZXJlZmVyZW5jZSBvZiBgdm1hLSZndDt2bV9vcHNgIGluIHRoaXMgZnVuY3Rpb246IGBjb25zdCBib29sIGhhc19odWdlX2ZhdWx0ID0gdm1hLSZndDt2bV9vcHMtJmd0O2h1Z2VfZmF1bHQ7YC4gVGhpcyBpcyBhIGJpZyByZWQgZmxhZyEgQmVmb3JlIGl0IHdhcyBzb21ldGhpbmcgbGlrZSBgaWYgKCgoaW5fcGYgfHwgc21hcHMpKSAmYW1wOyZhbXA7IHZtYS0mZ3Q7dm1fb3BzLSZndDtodWdlX2ZhdWx0KWAsIGJ1dCBub3csIGl0JiMzOTtzIHN0cmFpZ2h0LXVwIGRlcmVmZXJlbmNpbmcuCgpNeSBtaW5kIHJhY2VkIHRvIHRoZSBxdWVzdGlvbiBvZiB3aGV0aGVyIGB2bWEtJmd0O3ZtX29wc2AgaXMgKmFsd2F5cyogbm9uLU5VTEwgd2hlbiBpdCBpcyBub3QgYW5vbnltb3VzLCBidXQgdGhlbiBJIHJlYWxpemVkIGl0IGRvZXNuJiMzOTt0IG1hdHRlciwgbm93LCBpdCYjMzk7cyBiZWluZyBkZXJlZmVyZW5jZWQgdW5jb25kaXRpb25hbGx5LCB3aGV0aGVyIGl0IGlzIG9yIGlzbiYjMzk7dC4gU28sIGlmIGB2bWEtJmd0O3ZtX29wc2AgKmlzKiBOVUxMIGluIHRoYXQgY29udGV4dCwgdGhlbiB3ZSBoYXZlIGEgY2xhc3NpYyBudWxsIHBvaW50ZXIgZGVyZWZlcmVuY2UgdnVsbmVyYWJpbGl0eS4KCk5vdywgSSBzd2l0Y2hlZCBnZWFycyB0byB0cmlhZ2UuIEkga25vdyB0aGF0IG1lbW9yeSBtYW5hZ2VtZW50IGNvZGUgaXMgY3JpdGljYWwuIEkmIzM5O20gZ29pbmcgdGhyb3VnaCB0aGUgdHJpYWdlIGNyaXRlcmlhIGluIG15IGhlYWQ6IGNoYW5nZXMgaW4gbWVtb3J5IG1hbmFnZW1lbnQgKG1tLyksIHN5bmNocm9uaXphdGlvbi9sb2NraW5nLCBCUEYsIHNjaGVkdWxlciwgY29yZSBuZXR3b3JraW5nLCBWRlMsIG9yIHN5c2NhbGwgaGFuZGxpbmc/IFRoaXMgaXMgKmRlZmluaXRlbHkqIGNvcmUgbWVtb3J5IG1hbmFnZW1lbnQsIHNwZWNpZmljYWxseSByZWxhdGVkIHRvIFRIUCAoVHJhbnNwYXJlbnQgSHVnZSBQYWdlcykuIEl0JiMzOTtzIG1vZGlmeWluZyBgdm1hX2ZpbGVfYnlwYXNzX3RocF90dW5lYWJsZXNgLCBzbyBpdCYjMzk7cyBhIGRpcmVjdCBjaGFuZ2UgaW4gaG93IFRIUCBvcmRlcnMgYXJlIGNhbGN1bGF0ZWQgZm9yIGZpbGUtYmFja2VkIFZNQXMuCgpJIHRoaW5rIHRocm91Z2ggdGhlIHBvdGVudGlhbCByZWFjaGFiaWxpdHk6IFRoaXMgY29kZSBpcyB1c2VkIGJ5IGBtYWR2aXNlKE1BRFZfQ09MTEFQU0UpYCwgZHVyaW5nIHBhZ2UgZmF1bHRzIG9uIGZpbGUgVk1BcywgdmlhIGAvcHJvYy9waWQvc21hcHNgLCBhbmQgYnkgYGtodWdlcGFnZWRgLiBBYnNvbHV0ZWx5IHJlYWNoYWJsZSBpbiB0eXBpY2FsIFFFTVUveDg2XzY0IHNldHVwcy4gU28sIGJhc2VkIG9uIHRoZSByZWFjaGFiaWxpdHkgYW5kIHRoZSBwb3RlbnRpYWwgZm9yIGEgbnVsbCBkZXJlZmVyZW5jZSBpbiBjb3JlIG1lbW9yeSBtYW5hZ2VtZW50LCBJJiMzOTttIG1hcmtpbmcgaXQgYXMgZGVmaW5pdGVseSBgV29ydGhGdXp6aW5nPXRydWVgLgoKTmV4dCwgSSYjMzk7bGwgZm9jdXMgb24gbmFpbGluZyBkb3duIHRoZSBuZWNlc3NhcnkgYEVuYWJsZUNvbmZpZ3NgLCBpZGVudGlmeWluZyB0aGUgYEZvY3VzU3ltYm9sc2AsIGFuZCB0aGUgc3BlY2lmaWMgcmVhc29ucyB3aHkgdGhpcyBwYXRjaCBpcyBwYXJ0aWN1bGFybHkgY29uY2VybmluZyB0byB3cml0ZSBhIHNvbGlkIGp1c3RpZmljYXRpb24gZm9yIHRoaXMgYW5hbHlzaXMuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTAvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA3IDIxOjU1PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2h1Z2VfbWVtb3J5JiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7bW0vJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O21tL01ha2VmaWxlPTEwMD1vYmotJChDT05GSUdfREVWSUNFX01JR1JBVElPTikgJiM0Mzs9IG1pZ3JhdGVfZGV2aWNlLm9cbm1tL01ha2VmaWxlOjEwMTpvYmotJChDT05GSUdfVFJBTlNQQVJFTlRfSFVHRVBBR0UpICYjNDM7PSBodWdlX21lbW9yeS5vIGtodWdlcGFnZWQub1xubW0vTWFrZWZpbGUtMTAyLW9iai0kKENPTkZJR19QQUdFX0NPVU5URVIpICYjNDM7PSBwYWdlX2NvdW50ZXIub1xuLS1cbm1tL2ludGVybmFsLmg9MTI4Mj1pbnQgX19tdXN0X2NoZWNrIHRyeV9ncmFiX2ZvbGlvKHN0cnVjdCBmb2xpbyAqZm9saW8sIGludCByZWZzLFxuLS1cbm1tL2ludGVybmFsLmgtMTI4NS0vKlxubW0vaW50ZXJuYWwuaDoxMjg2OiAqIG1tL2h1Z2VfbWVtb3J5LmNcbm1tL2ludGVybmFsLmgtMTI4Ny0gKi9cbi0tXG5tbS9raHVnZXBhZ2VkLmM9MzM9ZW51bSBzY2FuX3Jlc3VsdCB7XG4tLVxubW0va2h1Z2VwYWdlZC5jLTY4LSNkZWZpbmUgQ1JFQVRFX1RSQUNFX1BPSU5UU1xubW0va2h1Z2VwYWdlZC5jOjY5OiNpbmNsdWRlIFx1MDAzY3RyYWNlL2V2ZW50cy9odWdlX21lbW9yeS5oXHUwMDNlXG5tbS9raHVnZXBhZ2VkLmMtNzAtXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTEvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA3IDIxOjU1PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDE2MzgzCgkJCQkJCQlvdXRwdXQ6IDMwCgkJCQkJCQl0aG91Z2h0czogNDgKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGhlcmUmIzM5O3MgbXkgaW50ZXJwcmV0YXRpb24gb2YgdGhhdCB0aG91Z2h0IHByb2Nlc3MsIGFzIGlmIGl0IHdlcmUgbXkgb3duOgoKKipJbnZlc3RpZ2F0aW5nIHRoZSBEZXBlbmRlbmN5IG9mIEh1Z2UgTWVtb3J5IFN1cHBvcnQqKgoKUmlnaHQsIHNvIGBodWdlX21lbW9yeS5vYCBpcyB0aHJvd2luZyBhIGZpdCwgYW5kIEkga25vdyB0aGF0IG1lYW5zIGl0IG5lZWRzIHRyYW5zcGFyZW50IGh1Z2UgcGFnZXMgZW5hYmxlZC4gVGhlIGZpcnN0IGxvZ2ljYWwgc3RlcCBpcyB0byBjb25maXJtIHRoZSBkZXBlbmRlbmN5LiBJIG5lZWQgdG8gZGlnIGludG8gdGhlIGtlcm5lbCBjb25maWd1cmF0aW9uIHRvIGJlIHN1cmUuIFNvLCBJIG5lZWQgdG8gY2hlY2sgdGhlIEtjb25maWcgZGVmaW5pdGlvbiBvZiBgVFJBTlNQQVJFTlRfSFVHRVBBR0VgLiBUaGF0JiMzOTtzIHdoZXJlIGFsbCB0aGUgY29uZmlndXJhdGlvbiBvcHRpb25zIGFyZSBkZWNsYXJlZCwgYW5kIHRoZSBkZXBlbmRlbmNpZXMgYXJlIHNwZWxsZWQgb3V0LiBJdCYjMzk7cyBsaWtlbHkgaW4gYG1tL0tjb25maWdgLCBhcyB0aGUgbWVtb3J5IG1hbmFnZW1lbnQgc3Vic3lzdGVtIGlzIHRoZSBvYnZpb3VzIHBsYWNlIGZvciB0aGF0LiBMZXQmIzM5O3MgZ28gdGFrZSBhIGxvb2sgdGhlcmUgYW5kIGNvbmZpcm0gdGhhdCBgQ09ORklHX1RSQU5TUEFSRU5UX0hVR0VQQUdFYCBpcyBpbmRlZWQgYSBoYXJkIHJlcXVpcmVtZW50IGZvciB0aGUgZnVuY3Rpb25hbGl0eSBJJiMzOTttIHRyeWluZyB0byBlbmFibGUuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTIvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA3IDIxOjU1PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2NvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRSYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O21tLyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDttbS9LY29uZmlnPTgzMj1jb25maWcgTU1fSURcbi0tXG5tbS9LY29uZmlnLTgzNC1cbm1tL0tjb25maWc6ODM1Om1lbnVjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0Vcbm1tL0tjb25maWctODM2LVx0Ym9vbCBcJiMzNDtUcmFuc3BhcmVudCBIdWdlcGFnZSBTdXBwb3J0XCYjMzQ7XG4tLVxubW0vS2NvbmZpZz04NTM9Y2hvaWNlXG4tLVxubW0vS2NvbmZpZy04NTgtXG5tbS9LY29uZmlnOjg1OTpcdGNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRV9BTFdBWVNcbm1tL0tjb25maWctODYwLVx0XHRib29sIFwmIzM0O2Fsd2F5c1wmIzM0O1xuLS1cbm1tL0tjb25maWctODY1LVxubW0vS2NvbmZpZzo4NjY6XHRjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VfTUFEVklTRVxubW0vS2NvbmZpZy04NjctXHRcdGJvb2wgXCYjMzQ7bWFkdmlzZVwmIzM0O1xuLS1cbm1tL0tjb25maWctODc0LVxubW0vS2NvbmZpZzo4NzU6XHRjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VfTkVWRVJcbm1tL0tjb25maWctODc2LVx0XHRib29sIFwmIzM0O25ldmVyXCYjMzQ7XG4tLVxubW0vS2NvbmZpZz04ODI9Y2hvaWNlXG4tLVxubW0vS2NvbmZpZy04OTEtXG5tbS9LY29uZmlnOjg5MjpcdGNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRV9TSE1FTV9IVUdFX05FVkVSXG5tbS9LY29uZmlnLTg5My1cdFx0Ym9vbCBcJiMzNDtuZXZlclwmIzM0O1xuLS1cbm1tL0tjb25maWctOTAxLVxubW0vS2NvbmZpZzo5MDI6XHRjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VfU0hNRU1fSFVHRV9BTFdBWVNcbm1tL0tjb25maWctOTAzLVx0XHRib29sIFwmIzM0O2Fsd2F5c1wmIzM0O1xuLS1cbm1tL0tjb25maWctOTA5LVxubW0vS2NvbmZpZzo5MTA6XHRjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VfU0hNRU1fSFVHRV9XSVRISU5fU0laRVxubW0vS2NvbmZpZy05MTEtXHRcdGJvb2wgXCYjMzQ7d2l0aGluX3NpemVcJiMzNDtcbi0tXG5tbS9LY29uZmlnLTkxNy1cbm1tL0tjb25maWc6OTE4Olx0Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX1NITUVNX0hVR0VfQURWSVNFXG5tbS9LY29uZmlnLTkxOS1cdFx0Ym9vbCBcJiMzNDthZHZpc2VcJiMzNDtcbi0tXG5tbS9LY29uZmlnPTkyNz1jaG9pY2Vcbi0tXG5tbS9LY29uZmlnLTkzNi1cbm1tL0tjb25maWc6OTM3Olx0Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX1RNUEZTX0hVR0VfTkVWRVJcbm1tL0tjb25maWctOTM4LVx0XHRib29sIFwmIzM0O25ldmVyXCYjMzQ7XG4tLVxubW0vS2NvbmZpZy05NDUtXG5tbS9LY29uZmlnOjk0NjpcdGNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRV9UTVBGU19IVUdFX0FMV0FZU1xubW0vS2NvbmZpZy05NDctXHRcdGJvb2wgXCYjMzQ7YWx3YXlzXCYjMzQ7XG4tLVxubW0vS2NvbmZpZy05NTMtXG5tbS9LY29uZmlnOjk1NDpcdGNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRV9UTVBGU19IVUdFX1dJVEhJTl9TSVpFXG5tbS9LY29uZmlnLTk1NS1cdFx0Ym9vbCBcJiMzNDt3aXRoaW5fc2l6ZVwmIzM0O1xuLS1cbm1tL0tjb25maWctOTYxLVxubW0vS2NvbmZpZzo5NjI6XHRjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VfVE1QRlNfSFVHRV9BRFZJU0Vcbm1tL0tjb25maWctOTYzLVx0XHRib29sIFwmIzM0O2FkdmlzZVwmIzM0O1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEzLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNyAyMTo1NTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxNzM1NQoJCQkJCQkJb3V0cHV0OiAzMgoJCQkJCQkJdGhvdWdodHM6IDI0CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IHRha2Ugb24gdGhlIGRlcGVuZGVuY2llcyBvZiBgVFJBTlNQQVJFTlRfSFVHRVBBR0VgIGluIGBtbS9LY29uZmlnYCwgYXMgaWYgSSB3ZXJlIHRoZSBvbmUgdGhpbmtpbmcgaXQgdGhyb3VnaDoKCioqRGVjb25zdHJ1Y3RpbmcgVFJBTlNQQVJFTlRfSFVHRVBBR0UgRGVwZW5kZW5jaWVzKioKCk9rYXksIGxldCYjMzk7cyBkaXZlIGludG8gdGhlIGBtbS9LY29uZmlnYCBmaWxlIGFuZCBmaWd1cmUgb3V0IHdoYXQgbWFrZXMgYFRSQU5TUEFSRU5UX0hVR0VQQUdFYCB0aWNrLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCB3aGF0IG90aGVyIGtlcm5lbCBmZWF0dXJlcywgY29uZmlndXJhdGlvbiBvcHRpb25zLCBvciBhcmNoaXRlY3R1cmFsIGNvbnN0cmFpbnRzIGRpY3RhdGUgd2hldGhlciB0aGlzIHRoaW5nIGlzIGV2ZW4gKnBvc3NpYmxlKiB0byBlbmFibGUsIG11Y2ggbGVzcyAqYSBnb29kIGlkZWEqLiBObyBkb3VidCB0aGVyZSBhcmUgZGVwZW5kZW5jaWVzIG9uIHBhZ2Ugc2l6ZSwgbWF5YmUgc3BlY2lmaWMgQ1BVIGFyY2hpdGVjdHVyZXMsIGFuZCBwcm9iYWJseSBzb21lIGludGVyYWN0aW9uIHdpdGggTlVNQSBjb25maWd1cmF0aW9ucy4gSSYjMzk7bSBlc3BlY2lhbGx5IGludGVyZXN0ZWQgaW4gd2hldGhlciB0aGVyZSBhcmUgaGFyZCBkZXBlbmRlbmNpZXMgb3IganVzdCAmIzM0O2ltcGxpZXMmIzM0OyByZWxhdGlvbnNoaXBzLiBBcmUgdGhlcmUgYW55IGZlYXR1cmVzIHdoaWNoIHJlcXVpcmUgaXQsIG9yIHdoaWNoIGl0IHJlcXVpcmVzPyBJJiMzOTtsbCBwcm9iYWJseSBiZSBsb29raW5nIGZvciBvcHRpb25zIHJlbGF0ZWQgdG8gbWVtb3J5IG1hbmFnZW1lbnQgYW5kIGFsbG9jYXRpb24uIEnigJltIHRoaW5raW5nIGFib3V0IHBlcmZvcm1hbmNlIGNvbnNpZGVyYXRpb25zIHRvbyDigJMgaHVnZXBhZ2VzIGFyZSBhIGRvdWJsZS1lZGdlZCBzd29yZCwgc28gdGhlICpjb25kaXRpb25zKiBmb3IgdGhlaXIgdXNlIG11c3QgYmUgY2FyZWZ1bGx5IGNvbnNpZGVyZWQuIEl0JiMzOTtzIHRpbWUgdG8gc2lmdCB0aHJvdWdoIHRoZSBLY29uZmlnIGFuZCBicmVhayB0aGlzIGRvd24uCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTQvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA3IDIxOjU1PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7bW0vS2NvbmZpZyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDgzMCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiA0MAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgODMwOlx0XHQgIG1lbW9yeSBjb25zdHJhaW5lZC5cbiA4MzE6XHRcbiA4MzI6XHRjb25maWcgTU1fSURcbiA4MzM6XHRcdGRlZl9ib29sIG5cbiA4MzQ6XHRcbiA4MzU6XHRtZW51Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFXG4gODM2Olx0XHRib29sIFwmIzM0O1RyYW5zcGFyZW50IEh1Z2VwYWdlIFN1cHBvcnRcJiMzNDtcbiA4Mzc6XHRcdGRlcGVuZHMgb24gSEFWRV9BUkNIX1RSQU5TUEFSRU5UX0hVR0VQQUdFIFx1MDAyNlx1MDAyNiAhUFJFRU1QVF9SVFxuIDgzODpcdFx0c2VsZWN0IENPTVBBQ1RJT05cbiA4Mzk6XHRcdHNlbGVjdCBYQVJSQVlfTVVMVElcbiA4NDA6XHRcdHNlbGVjdCBNTV9JRFxuIDg0MTpcdFx0aGVscFxuIDg0MjpcdFx0ICBUcmFuc3BhcmVudCBIdWdlcGFnZXMgYWxsb3dzIHRoZSBrZXJuZWwgdG8gdXNlIGh1Z2UgcGFnZXMgYW5kXG4gODQzOlx0XHQgIGh1Z2UgdGxiIHRyYW5zcGFyZW50bHkgdG8gdGhlIGFwcGxpY2F0aW9ucyB3aGVuZXZlciBwb3NzaWJsZS5cbiA4NDQ6XHRcdCAgVGhpcyBmZWF0dXJlIGNhbiBpbXByb3ZlIGNvbXB1dGluZyBwZXJmb3JtYW5jZSB0byBjZXJ0YWluXG4gODQ1Olx0XHQgIGFwcGxpY2F0aW9ucyBieSBzcGVlZGluZyB1cCBwYWdlIGZhdWx0cyBkdXJpbmcgbWVtb3J5XG4gODQ2Olx0XHQgIGFsbG9jYXRpb24sIGJ5IHJlZHVjaW5nIHRoZSBudW1iZXIgb2YgdGxiIG1pc3NlcyBhbmQgYnkgc3BlZWRpbmdcbiA4NDc6XHRcdCAgdXAgdGhlIHBhZ2V0YWJsZSB3YWxraW5nLlxuIDg0ODpcdFxuIDg0OTpcdFx0ICBJZiBtZW1vcnkgY29uc3RyYWluZWQgb24gZW1iZWRkZWQsIHlvdSBtYXkgd2FudCB0byBzYXkgTi5cbiA4NTA6XHRcbiA4NTE6XHRpZiBUUkFOU1BBUkVOVF9IVUdFUEFHRVxuIDg1MjpcdFxuIDg1MzpcdGNob2ljZVxuIDg1NDpcdFx0cHJvbXB0IFwmIzM0O1RyYW5zcGFyZW50IEh1Z2VwYWdlIFN1cHBvcnQgc3lzZnMgZGVmYXVsdHNcJiMzNDtcbiA4NTU6XHRcdGRlZmF1bHQgVFJBTlNQQVJFTlRfSFVHRVBBR0VfQUxXQVlTXG4gODU2Olx0XHRoZWxwXG4gODU3Olx0XHQgIFNlbGVjdHMgdGhlIHN5c2ZzIGRlZmF1bHRzIGZvciBUcmFuc3BhcmVudCBIdWdlcGFnZSBTdXBwb3J0LlxuIDg1ODpcdFxuIDg1OTpcdFx0Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX0FMV0FZU1xuIDg2MDpcdFx0XHRib29sIFwmIzM0O2Fsd2F5c1wmIzM0O1xuIDg2MTpcdFx0aGVscFxuIDg2MjpcdFx0ICBFbmFibGluZyBUcmFuc3BhcmVudCBIdWdlcGFnZSBhbHdheXMsIGNhbiBpbmNyZWFzZSB0aGVcbiA4NjM6XHRcdCAgbWVtb3J5IGZvb3RwcmludCBvZiBhcHBsaWNhdGlvbnMgd2l0aG91dCBhIGd1YXJhbnRlZWRcbiA4NjQ6XHRcdCAgYmVuZWZpdCBidXQgaXQgd2lsbCB3b3JrIGF1dG9tYXRpY2FsbHkgZm9yIGFsbCBhcHBsaWNhdGlvbnMuXG4gODY1Olx0XG4gODY2Olx0XHRjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VfTUFEVklTRVxuIDg2NzpcdFx0XHRib29sIFwmIzM0O21hZHZpc2VcJiMzNDtcbiA4Njg6XHRcdGhlbHBcbiA4Njk6XHRcdCAgRW5hYmxpbmcgVHJhbnNwYXJlbnQgSHVnZXBhZ2UgbWFkdmlzZSwgd2lsbCBvbmx5IHByb3ZpZGUgYVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE1LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNyAyMTo1NTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxODE5NAoJCQkJCQkJb3V0cHV0OiAzMgoJCQkJCQkJdGhvdWdodHM6IDk1CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyBUcmFuc3BhcmVudCBIdWdlIFBhZ2VzIENvbmZpZ3VyYXRpb24qKgoKT2theSwgc28gdGhlIG1haW4gdGhpbmcgdG8gYmUgbG9va2luZyBhdCBoZXJlIGlzIGBDT05GSUdfVFJBTlNQQVJFTlRfSFVHRVBBR0VgLiBUaGF0JiMzOTtzIHRoZSBjb3JlIHNldHRpbmcsIHNvIGV2ZXJ5dGhpbmcgZWxzZSBpcyBwcm9iYWJseSBjb250aW5nZW50IG9uIGl0LiBNeSBpbW1lZGlhdGUgdGhvdWdodCBpcyB0byB1bmRlcnN0YW5kIGhvdyB0aGUgc3lzdGVtIGRlY2lkZXMgd2hhdCBraW5kIG9mIGh1Z2UgcGFnZXMgaXQmIzM5O3MgZ29pbmcgdG8gYWxsb3cgZm9yIGEgZ2l2ZW4gVk1BLiBJIG5lZWQgdG8gZGlnIGludG8gdGhlIGRlY2lzaW9uLW1ha2luZyBwcm9jZXNzLgoKTXkgbmV4dCBzdGVwIGlzIHRvIGV4YW1pbmUgdGhlIGZ1bmN0aW9uIGNhbGxzIGZvciBgX190aHBfdm1hX2FsbG93YWJsZV9vcmRlcnNgIGFuZCBgdGhwX3ZtYV9hbGxvd2FibGVfb3JkZXJzYC4gVGhlc2UgZnVuY3Rpb25zIGFyZSAqa2V5KiBoZXJlLCB0aGlzIGlzIHdoZXJlIHRoZSBwb2xpY3kgaXMgc2V0LiBJIG5lZWQgdG8gdW5kZXJzdGFuZCB3aGF0IHBhcmFtZXRlcnMgYXJlIGJlaW5nIHBhc3NlZCwgd2hlcmUgdGhlc2UgZnVuY3Rpb25zIGFyZSBiZWluZyB1c2VkLCBhbmQgd2hhdCBmYWN0b3JzIGluZmx1ZW5jZSB0aGVpciByZXR1cm4gdmFsdWVzLiBJJiMzOTtsbCBuZWVkIHRvIHBheSBjbG9zZSBhdHRlbnRpb24gdG8gYW55IHN5bWJvbHMgbGlzdGVkIGluIHRoZSBkb2N1bWVudGF0aW9uIGFzICpGb2N1c1N5bWJvbHMqLgoKVG8gZ2V0IGEgZnVsbCBwaWN0dXJlLCBhIGdyZXAgYWNyb3NzIHRoZSBlbnRpcmUga2VybmVsIHNvdXJjZSBpcyB0aGUgb2J2aW91cyBuZXh0IHN0ZXAuIEkgbmVlZCBhIGNvbXByZWhlbnNpdmUgbGlzdCBvZiBldmVyeSBpbnN0YW5jZSB3aGVyZSB0aG9zZSB0d28gZnVuY3Rpb25zIGFyZSBpbnZva2VkLiBUaGlzIHdpbGwgaWxsdW1pbmF0ZSB0aGUgZGlmZmVyZW50IGNvbnRleHRzIGluIHdoaWNoIGh1Z2UgcGFnZSBhbGxvY2F0aW9uIGlzIGNvbnNpZGVyZWQsIGFsbG93aW5nIG1lIHRvIGJ1aWxkIGEgY29tcGxldGUgbWVudGFsIG1vZGVsIG9mIGhvdyB0aGUgc3lzdGVtIGhhbmRsZXMgaXQuIFdpdGggdGhpcyBpbmZvcm1hdGlvbiwgSSBjYW4gZXZhbHVhdGUgdGhlIHBlcmZvcm1hbmNlIGltcGxpY2F0aW9ucyBhbmQgcG90ZW50aWFsIHZ1bG5lcmFiaWxpdGllcy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNi8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDcgMjE6NTU8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7dGhwX3ZtYV9hbGxvd2FibGVfb3JkZXJzJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7bW0vJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O21tL2h1Z2VfbWVtb3J5LmM9MTUzPXN0YXRpYyBib29sIHZtYV9maWxlX2Nhbl9tYXBfaHVnZShjb25zdCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbi0tXG5tbS9odWdlX21lbW9yeS5jLTE1OS1cdCAqIEVuZm9yY2UgVEhQIGNvbGxhcHNlIHJlcXVpcmVtZW50cyBhcyBuZWNlc3NhcnkuIEFub255bW91cyB2bWFzXG5tbS9odWdlX21lbW9yeS5jOjE2MDpcdCAqIHdlcmUgYWxyZWFkeSBoYW5kbGVkIGluIHRocF92bWFfYWxsb3dhYmxlX29yZGVycygpLlxubW0vaHVnZV9tZW1vcnkuYy0xNjEtXHQgKi9cbi0tXG5tbS9odWdlX21lbW9yeS5jLTE4MS1cbm1tL2h1Z2VfbWVtb3J5LmM6MTgyOnVuc2lnbmVkIGxvbmcgX190aHBfdm1hX2FsbG93YWJsZV9vcmRlcnMoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG5tbS9odWdlX21lbW9yeS5jLTE4My1cdFx0XHRcdFx0IHZtX2ZsYWdzX3Qgdm1fZmxhZ3MsXG4tLVxubW0va2h1Z2VwYWdlZC5jPTU2OD1zdGF0aWMgdW5zaWduZWQgbG9uZyBjb2xsYXBzZV9wb3NzaWJsZV9vcmRlcnMoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4tLVxubW0va2h1Z2VwYWdlZC5jLTU3OC1cbm1tL2todWdlcGFnZWQuYzo1Nzk6XHRyZXR1cm4gdGhwX3ZtYV9hbGxvd2FibGVfb3JkZXJzKHZtYSwgdm1fZmxhZ3MsIHR2YV9mbGFncywgb3JkZXJzKTtcbm1tL2todWdlcGFnZWQuYy01ODAtfVxuLS1cbm1tL2todWdlcGFnZWQuYz0xMDY0PXN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IGh1Z2VwYWdlX3ZtYV9yZXZhbGlkYXRlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHJlc3MsXG4tLVxubW0va2h1Z2VwYWdlZC5jLTEwODctXHRcdHJldHVybiBTQ0FOX0FERFJFU1NfUkFOR0U7XG5tbS9raHVnZXBhZ2VkLmM6MTA4ODpcdGlmICghdGhwX3ZtYV9hbGxvd2FibGVfb3JkZXJzKHZtYSwgdm1hLVx1MDAzZXZtX2ZsYWdzLCB0eXBlLCBCSVQob3JkZXIpKSlcbm1tL2todWdlcGFnZWQuYy0xMDg5LVx0XHRyZXR1cm4gU0NBTl9WTUFfQ0hFQ0s7XG4tLVxubW0va2h1Z2VwYWdlZC5jLTEwOTMtXHQgKlxubW0va2h1Z2VwYWdlZC5jOjEwOTQ6XHQgKiB0aHBfdm1hX2FsbG93YWJsZV9vcmRlcnMoKSBtYXkgcmV0dXJuIHRydWUgZm9yIHF1YWxpZmllZCBmaWxlXG5tbS9raHVnZXBhZ2VkLmMtMTA5NS1cdCAqIHZtYXMuXG4tLVxubW0vbWVtb3J5LmM9NDc5NT1zdGF0aWMgdW5zaWduZWQgbG9uZyB0aHBfc3dhcGluX3N1aXRhYmxlX29yZGVycyhzdHJ1Y3Qgdm1fZmF1bHQgKnZtZilcbi0tXG5tbS9tZW1vcnkuYy00ODI0LVx0ICovXG5tbS9tZW1vcnkuYzo0ODI1Olx0b3JkZXJzID0gdGhwX3ZtYV9hbGxvd2FibGVfb3JkZXJzKHZtYSwgdm1hLVx1MDAzZXZtX2ZsYWdzLCBUVkFfUEFHRUZBVUxULFxubW0vbWVtb3J5LmMtNDgyNi1cdFx0XHRcdFx0ICBCSVQoUE1EX09SREVSKSAtIDEpO1xuLS1cbm1tL21lbW9yeS5jPTUzMDE9c3RhdGljIHN0cnVjdCBmb2xpbyAqYWxsb2NfYW5vbl9mb2xpbyhzdHJ1Y3Qgdm1fZmF1bHQgKnZtZilcbi0tXG5tbS9tZW1vcnkuYy01MzIzLVx0ICovXG5tbS9tZW1vcnkuYzo1MzI0Olx0b3JkZXJzID0gdGhwX3ZtYV9hbGxvd2FibGVfb3JkZXJzKHZtYSwgdm1hLVx1MDAzZXZtX2ZsYWdzLCBUVkFfUEFHRUZBVUxULFxubW0vbWVtb3J5LmMtNTMyNS1cdFx0XHRcdFx0ICBCSVQoUE1EX09SREVSKSAtIDEpO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE3LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNyAyMTo1NTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxOTMyOAoJCQkJCQkJb3V0cHV0OiAyNAoJCQkJCQkJdGhvdWdodHM6IDI5CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IHRoaW5raW5nOgoKKipJbnZlc3RpZ2F0aW5nIENhbGxlcnMgUmVsYXRlZCB0byBIdWdlIFBhZ2VzKioKCk9rYXksIEkgbmVlZCB0byBleHBhbmQgbXkgc2VhcmNoIHRvIGlkZW50aWZ5ICphbGwqIHRoZSBwbGFjZXMgd2l0aGluIHRoZSBrZXJuZWwgdGhhdCBpbnRlcmFjdCB3aXRoIGh1Z2UgcGFnZXMuIFRoZSBpbml0aWFsIHNlYXJjaCB3YXMgYSBnb29kIHN0YXJ0LCBidXQgSSBrbm93IHRoZXJlIGFyZSBsaWtlbHkgbW9yZSBzY2F0dGVyZWQgY2FsbHMuIE15IGluc3RpbmN0IGlzIHRvIHJ1biBhIGBncmVwYCBjb21tYW5kLCBidXQgbm93IEkgbmVlZCB0byBkZXRlcm1pbmUgd2hlcmUgdG8gZm9jdXMgaXQuIE15IGltbWVkaWF0ZSB0aG91Z2h0IGlzIHRvIHRhcmdldCBhIGNvdXBsZSBvZiBrZXkgYXJlYXMuCgpGaXJzdCwgdGhlIGBmcy9wcm9jL2AgZGlyZWN0b3J5IGlzIGEgbGlrZWx5IGNhbmRpZGF0ZSBiZWNhdXNlIHRoZSBwcm9jIGZpbGVzeXN0ZW0gcHJvdmlkZXMgYSB3aW5kb3cgaW50byB2YXJpb3VzIGtlcm5lbCBpbnRlcm5hbHMsIGluY2x1ZGluZyBtZW1vcnkgbWFuYWdlbWVudC4gSXQmIzM5O3MgYSBwcmltZSBzcG90IHRvIGZpbmQgY29kZSB0aGF0IGV4cG9zZXMgb3IgbWFuaXB1bGF0ZXMgaHVnZSBwYWdlIGluZm9ybWF0aW9uLiBTbyB0aGF0IHNob3VsZCBiZSBhIHVzZWZ1bCBzZWFyY2guCgpUaGVuLCB0byBiZSB0aG9yb3VnaCwgSSBzaG91bGQgYWxzbyBsb29rIGF0IHRoZSBpbmNsdWRlIGZpbGVzLiBJdCYjMzk7cyBhbG1vc3QgZ3VhcmFudGVlZCB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgc3RydWN0dXJlcywgYW5kIHJlbGF0ZWQgbWFjcm9zLCBhcmUgaW4gdGhlIGBpbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaGAgaGVhZGVyIGZpbGUuIEJ5IGdyZXBwaW5nIHRoaXMgZmlsZSBJIGNhbiBmaW5kIGFueSBwb3RlbnRpYWwgY2FsbGVycyBkaXJlY3RseSwgaW5jbHVkaW5nIHdpdGhpbiByZWxhdGVkIGhlYWRlciBmaWxlcy4gCgpCeSBjb21iaW5pbmcgdGhlc2UgdHdvIHNlYXJjaGVzLCBJIHNob3VsZCBnZXQgYSBjb21wcmVoZW5zaXZlIHZpZXcgb2YgdGhlIGNvZGViYXNlIGFuZCBpZGVudGlmeSBhbnkgb3Zlcmxvb2tlZCBjYWxscyBvciBwb3RlbnRpYWxseSBvYnNjdXJlIGludGVyYWN0aW9ucy4gSXQgc2hvdWxkIGJlIGEgZ29vZCBzdGFydGluZyBwb2ludCBmb3IgYSBtb3JlIGluLWRlcHRoIGludmVzdGlnYXRpb24uCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTgvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA3IDIxOjU1PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O3RocF92bWFfYWxsb3dhYmxlX29yZGVycyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtmcy9wcm9jL3Rhc2tfbW11LmM9MTQ1OT1zdGF0aWMgaW50IHNob3dfc21hcChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnYpXG4tLVxuZnMvcHJvYy90YXNrX21tdS5jLTE0NzYtXHRzZXFfcHJpbnRmKG0sIFwmIzM0O1RIUGVsaWdpYmxlOiAgICAlOHVcXG5cJiMzNDssXG5mcy9wcm9jL3Rhc2tfbW11LmM6MTQ3NzpcdFx0ICAgISF0aHBfdm1hX2FsbG93YWJsZV9vcmRlcnModm1hLCB2bWEtXHUwMDNldm1fZmxhZ3MsIFRWQV9TTUFQUyxcbmZzL3Byb2MvdGFza19tbXUuYy0xNDc4LVx0XHRcdFx0XHQgICAgICBUSFBfT1JERVJTX0FMTCkpO1xuLS1cbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oPTk3PWVudW0gdHZhX3R5cGUge1xuLS1cbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oLTEwNC0jZGVmaW5lIHRocF92bWFfYWxsb3dhYmxlX29yZGVyKHZtYSwgdm1fZmxhZ3MsIHR5cGUsIG9yZGVyKSBcXFxuaW5jbHVkZS9saW51eC9odWdlX21tLmg6MTA1Olx0KCEhdGhwX3ZtYV9hbGxvd2FibGVfb3JkZXJzKHZtYSwgdm1fZmxhZ3MsIHR5cGUsIEJJVChvcmRlcikpKVxuaW5jbHVkZS9saW51eC9odWdlX21tLmgtMTA2LVxuLS1cbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oPTI3Nj1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgdGhwX3ZtYV9zdWl0YWJsZV9vcmRlcnMoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4tLVxuaW5jbHVkZS9saW51eC9odWdlX21tLmgtMjk4LVxuaW5jbHVkZS9saW51eC9odWdlX21tLmg6Mjk5OnVuc2lnbmVkIGxvbmcgX190aHBfdm1hX2FsbG93YWJsZV9vcmRlcnMoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaC0zMDAtXHRcdFx0XHRcdCB2bV9mbGFnc190IHZtX2ZsYWdzLFxuLS1cbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oLTMwNC0vKipcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oOjMwNTogKiB0aHBfdm1hX2FsbG93YWJsZV9vcmRlcnMgLSBkZXRlcm1pbmUgaHVnZXBhZ2Ugb3JkZXJzIHRoYXQgYXJlIGFsbG93ZWQgZm9yIHZtYVxuaW5jbHVkZS9saW51eC9odWdlX21tLmgtMzA2LSAqIEB2bWE6ICB0aGUgdm0gYXJlYSB0byBjaGVja1xuLS1cbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oPTMxOT1zdGF0aWMgaW5saW5lXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaDozMjA6dW5zaWduZWQgbG9uZyB0aHBfdm1hX2FsbG93YWJsZV9vcmRlcnMoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaC0zMjEtXHRcdFx0XHQgICAgICAgdm1fZmxhZ3NfdCB2bV9mbGFncyxcbi0tXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaC0zNDItXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaDozNDM6XHRyZXR1cm4gX190aHBfdm1hX2FsbG93YWJsZV9vcmRlcnModm1hLCB2bV9mbGFncywgdHlwZSwgb3JkZXJzKTtcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oLTM0NC19XG4tLVxuaW5jbHVkZS9saW51eC9odWdlX21tLmg9NjE5PXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyB0aHBfdm1hX3N1aXRhYmxlX29yZGVycyhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbi0tXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaC02MjQtXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaDo2MjU6c3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHRocF92bWFfYWxsb3dhYmxlX29yZGVycyhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oLTYyNi1cdFx0XHRcdFx0dm1fZmxhZ3NfdCB2bV9mbGFncyxcbi0tXG5tbS9odWdlX21lbW9yeS5jPTE1Mz1zdGF0aWMgYm9vbCB2bWFfZmlsZV9jYW5fbWFwX2h1Z2UoY29uc3Qgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4tLVxubW0vaHVnZV9tZW1vcnkuYy0xNTktXHQgKiBFbmZvcmNlIFRIUCBjb2xsYXBzZSByZXF1aXJlbWVudHMgYXMgbmVjZXNzYXJ5LiBBbm9ueW1vdXMgdm1hc1xubW0vaHVnZV9tZW1vcnkuYzoxNjA6XHQgKiB3ZXJlIGFscmVhZHkgaGFuZGxlZCBpbiB0aHBfdm1hX2FsbG93YWJsZV9vcmRlcnMoKS5cbm1tL2h1Z2VfbWVtb3J5LmMtMTYxLVx0ICovXG4tLVxubW0vaHVnZV9tZW1vcnkuYy0xODEtXG5tbS9odWdlX21lbW9yeS5jOjE4Mjp1bnNpZ25lZCBsb25nIF9fdGhwX3ZtYV9hbGxvd2FibGVfb3JkZXJzKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxubW0vaHVnZV9tZW1vcnkuYy0xODMtXHRcdFx0XHRcdCB2bV9mbGFnc190IHZtX2ZsYWdzLFxuLS1cbm1tL2todWdlcGFnZWQuYz01Njg9c3RhdGljIHVuc2lnbmVkIGxvbmcgY29sbGFwc2VfcG9zc2libGVfb3JkZXJzKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuLS1cbm1tL2todWdlcGFnZWQuYy01NzgtXG5tbS9raHVnZXBhZ2VkLmM6NTc5Olx0cmV0dXJuIHRocF92bWFfYWxsb3dhYmxlX29yZGVycyh2bWEsIHZtX2ZsYWdzLCB0dmFfZmxhZ3MsIG9yZGVycyk7XG5tbS9raHVnZXBhZ2VkLmMtNTgwLX1cbi0tXG5tbS9raHVnZXBhZ2VkLmM9MTA2ND1zdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBodWdlcGFnZV92bWFfcmV2YWxpZGF0ZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBhZGRyZXNzLFxuLS1cbm1tL2todWdlcGFnZWQuYy0xMDg3LVx0XHRyZXR1cm4gU0NBTl9BRERSRVNTX1JBTkdFO1xubW0va2h1Z2VwYWdlZC5jOjEwODg6XHRpZiAoIXRocF92bWFfYWxsb3dhYmxlX29yZGVycyh2bWEsIHZtYS1cdTAwM2V2bV9mbGFncywgdHlwZSwgQklUKG9yZGVyKSkpXG5tbS9raHVnZXBhZ2VkLmMtMTA4OS1cdFx0cmV0dXJuIFNDQU5fVk1BX0NIRUNLO1xuLS1cbm1tL2todWdlcGFnZWQuYy0xMDkzLVx0ICpcbm1tL2todWdlcGFnZWQuYzoxMDk0Olx0ICogdGhwX3ZtYV9hbGxvd2FibGVfb3JkZXJzKCkgbWF5IHJldHVybiB0cnVlIGZvciBxdWFsaWZpZWQgZmlsZVxubW0va2h1Z2VwYWdlZC5jLTEwOTUtXHQgKiB2bWFzLlxuLS1cbm1tL21lbW9yeS5jPTQ3OTU9c3RhdGljIHVuc2lnbmVkIGxvbmcgdGhwX3N3YXBpbl9zdWl0YWJsZV9vcmRlcnMoc3RydWN0IHZtX2ZhdWx0ICp2bWYpXG4tLVxubW0vbWVtb3J5LmMtNDgyNC1cdCAqL1xubW0vbWVtb3J5LmM6NDgyNTpcdG9yZGVycyA9IHRocF92bWFfYWxsb3dhYmxlX29yZGVycyh2bWEsIHZtYS1cdTAwM2V2bV9mbGFncywgVFZBX1BBR0VGQVVMVCxcbm1tL21lbW9yeS5jLTQ4MjYtXHRcdFx0XHRcdCAgQklUKFBNRF9PUkRFUikgLSAxKTtcbi0tXG5tbS9tZW1vcnkuYz01MzAxPXN0YXRpYyBzdHJ1Y3QgZm9saW8gKmFsbG9jX2Fub25fZm9saW8oc3RydWN0IHZtX2ZhdWx0ICp2bWYpXG4tLVxubW0vbWVtb3J5LmMtNTMyMy1cdCAqL1xubW0vbWVtb3J5LmM6NTMyNDpcdG9yZGVycyA9IHRocF92bWFfYWxsb3dhYmxlX29yZGVycyh2bWEsIHZtYS1cdTAwM2V2bV9mbGFncywgVFZBX1BBR0VGQVVMVCxcbm1tL21lbW9yeS5jLTUzMjUtXHRcdFx0XHRcdCAgQklUKFBNRF9PUkRFUikgLSAxKTtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xOS8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDcgMjE6NTU8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMjExMzQKCQkJCQkJCW91dHB1dDogMjMKCQkJCQkJCXRob3VnaHRzOiAzMDYKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqSW52ZXN0aWdhdGluZyBgX190aHBfdm1hX2FsbG93YWJsZV9vcmRlcnNgIGluIHRoZSBIdWdlIFBhZ2VzIFN1YnN5c3RlbSoqCgpPa2F5LCBzbyBJJiMzOTttIGxvb2tpbmcgYXQgYG1tL2h1Z2VfbWVtb3J5LmNgLCBzcGVjaWZpY2FsbHkgYXJvdW5kIHRoZSBUSFAgKFRyYW5zcGFyZW50IEh1Z2UgUGFnZXMpIGNvZGUuIEl0JiMzOTtzIGltbWVkaWF0ZWx5IGludGVyZXN0aW5nIHRoYXQgYF9fdGhwX3ZtYV9hbGxvd2FibGVfb3JkZXJzYCBpc24mIzM5O3Qgc3RhdGljLiBUaGF0IHRlbGxzIG1lIGl0JiMzOTtzIHBvdGVudGlhbGx5IGV4cG9zZWQgb3V0c2lkZSBvZiB0aGF0IGZpbGUsIHdoaWNoIGNvdWxkIGJlIHJlbGV2YW50LiBOb3csIGxldCBtZSBxdWlja2x5IGludmVudG9yeSB0aGUgb3RoZXIgc3RhdGljIGZ1bmN0aW9ucyBpbiBgbW0vaHVnZV9tZW1vcnkuY2AgdG8gZ2V0IHRoZSBjb250ZXh0OiBgdm1hX2ZpbGVfYnlwYXNzX3RocF90dW5lYWJsZXNgLCBgdm1hX2ZpbGVfYWxsb3dfdGhwX3R1bmVhYmxlc2AsIGB2bWFfZmlsZV9jaGVja190aHBfdHVuZWFibGVzYCwgYHZtYV9maWxlX2Nhbl9tYXBfaHVnZWAsIGFuZCBgZmlsZV90aHBfZW5hYmxlZGAuIFRoZXNlIGFsbCBzZWVtIHJlbGF0ZWQgdG8gVk1BIChWaXJ0dWFsIE1lbW9yeSBBcmVhKSBtYW5hZ2VtZW50IGFuZCBmaWxlLWJhY2tlZCBUSFAgY29uZmlndXJhdGlvbiBvciBkZWNpc2lvbnMuCgpOb3csIHdoZXJlIGVsc2UgaXMgdGhpcyBzdHVmZiBnZXR0aW5nIGNhbGxlZCBvciByZWxhdGVkIHRvPyBJIHNob3VsZCBleHBhbmQgdGhlIHNlYXJjaCB0byBmaW5kIGNhbGxlcnMuIFNpbmNlIFRIUCBpcyBvZnRlbiByZWxhdGVkIHRvIHRoZSBiYWNrZ3JvdW5kIGRlZnJhZywgaXQmIzM5O3Mgd29ydGggY2hlY2tpbmcgYGtodWdlcGFnZWQuY2AuIEluIGBraHVnZXBhZ2VkLmNgLCBgY29sbGFwc2VfZmlsZWAsIGBtYWR2aXNlX2NvbGxhcHNlYCwgYGNvbGxhcHNlX3Bvc3NpYmxlX29yZGVyc2AsIGFuZCBgaHVnZXBhZ2Vfdm1hX3JldmFsaWRhdGVgIGFyZSBvYnZpb3VzIHBsYWNlcyB0byBzdGFydC4gSSYjMzk7bSBlc3BlY2lhbGx5IGN1cmlvdXMgYWJvdXQgYG1hZHZpc2VgIHdpdGggYE1BRFZfQ09MTEFQU0VgLiBUaGlzIGlzIHdoZXJlIHVzZXJzcGFjZSBleHBsaWNpdGx5IHJlcXVlc3RzIHBhZ2UgY29sbGFwc2luZy4gVGltZSB0byBzZWUgaG93IHRoYXQgdGllcyBpbnRvIGV2ZXJ5dGhpbmcuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjAvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA3IDIxOjU1PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O1RWQV9GT1JDRURfQ09MTEFQU0UmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7aW5jbHVkZS9saW51eC9odWdlX21tLmg9OTc9ZW51bSB0dmFfdHlwZSB7XG4tLVxuaW5jbHVkZS9saW51eC9odWdlX21tLmgtMTAwLVx0VFZBX0tIVUdFUEFHRUQsXHRcdC8qIEtodWdlcGFnZWQgY29sbGFwc2UuICovXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaDoxMDE6XHRUVkFfRk9SQ0VEX0NPTExBUFNFLFx0LyogRm9yY2VkIGNvbGxhcHNlIChlLmcuIE1BRFZfQ09MTEFQU0UpLiAqL1xuaW5jbHVkZS9saW51eC9odWdlX21tLmgtMTAyLX07XG4tLVxuaW5jbHVkZS9saW51eC9odWdlX21tLmg9MzIwPXVuc2lnbmVkIGxvbmcgdGhwX3ZtYV9hbGxvd2FibGVfb3JkZXJzKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuLS1cbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oLTMyOC1cdCAqL1xuaW5jbHVkZS9saW51eC9odWdlX21tLmg6MzI5Olx0aWYgKHR5cGUgIT0gVFZBX0ZPUkNFRF9DT0xMQVBTRSBcdTAwMjZcdTAwMjYgdm1hX2lzX2Fub255bW91cyh2bWEpKSB7XG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaC0zMzAtXHRcdHVuc2lnbmVkIGxvbmcgbWFzayA9IFJFQURfT05DRShodWdlX2Fub25fb3JkZXJzX2Fsd2F5cyk7XG4tLVxubW0vaHVnZV9tZW1vcnkuYz0xMjE9c3RhdGljIGJvb2wgdm1hX2ZpbGVfYnlwYXNzX3RocF90dW5lYWJsZXMoY29uc3Qgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4tLVxubW0vaHVnZV9tZW1vcnkuYy0xMjYtXHQvKiBNQURWX0NPTExBUFNFIGlnbm9yZXMgdHVuZWFibGVzLiAqL1xubW0vaHVnZV9tZW1vcnkuYzoxMjc6XHRpZiAodHlwZSA9PSBUVkFfRk9SQ0VEX0NPTExBUFNFKVxubW0vaHVnZV9tZW1vcnkuYy0xMjgtXHRcdHJldHVybiB0cnVlO1xuLS1cbm1tL2h1Z2VfbWVtb3J5LmM9MTgyPXVuc2lnbmVkIGxvbmcgX190aHBfdm1hX2FsbG93YWJsZV9vcmRlcnMoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4tLVxubW0vaHVnZV9tZW1vcnkuYy0xODgtXHRjb25zdCBib29sIGluX3BmID0gdHlwZSA9PSBUVkFfUEFHRUZBVUxUO1xubW0vaHVnZV9tZW1vcnkuYzoxODk6XHRjb25zdCBib29sIGZvcmNlZF9jb2xsYXBzZSA9IHR5cGUgPT0gVFZBX0ZPUkNFRF9DT0xMQVBTRTtcbm1tL2h1Z2VfbWVtb3J5LmMtMTkwLVx0dW5zaWduZWQgbG9uZyBzdXBwb3J0ZWRfb3JkZXJzO1xuLS1cbm1tL2todWdlcGFnZWQuYz0xMDY0PXN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IGh1Z2VwYWdlX3ZtYV9yZXZhbGlkYXRlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHJlc3MsXG4tLVxubW0va2h1Z2VwYWdlZC5jLTEwNjktXHRlbnVtIHR2YV90eXBlIHR5cGUgPSBjYy1cdTAwM2Vpc19raHVnZXBhZ2VkID8gVFZBX0tIVUdFUEFHRUQgOlxubW0va2h1Z2VwYWdlZC5jOjEwNzA6XHRcdFx0XHQgVFZBX0ZPUkNFRF9DT0xMQVBTRTtcbm1tL2todWdlcGFnZWQuYy0xMDcxLVxuLS1cbm1tL2todWdlcGFnZWQuYz0xNjAwPXN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IGNvbGxhcHNlX3NjYW5fcG1kKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLFxuLS1cbm1tL2todWdlcGFnZWQuYy0xNjA2LVx0dW5zaWduZWQgaW50IG1heF9wdGVzX25vbmUgPSBjb2xsYXBzZV9tYXhfcHRlc19ub25lKGNjLCB2bWEsIEhQQUdFX1BNRF9PUkRFUik7XG5tbS9raHVnZXBhZ2VkLmM6MTYwNzpcdGVudW0gdHZhX3R5cGUgdHZhX2ZsYWdzID0gY2MtXHUwMDNlaXNfa2h1Z2VwYWdlZCA/IFRWQV9LSFVHRVBBR0VEIDogVFZBX0ZPUkNFRF9DT0xMQVBTRTtcbm1tL2todWdlcGFnZWQuYy0xNjA4LVx0cG1kX3QgKnBtZDtcbi0tXG5tbS9raHVnZXBhZ2VkLmM9MTg1MT1zdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCB0cnlfY29sbGFwc2VfcHRlX21hcHBlZF90aHAoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgYWRkcixcbi0tXG5tbS9raHVnZXBhZ2VkLmMtMTg4Ni1cdCAqL1xubW0va2h1Z2VwYWdlZC5jOjE4ODc6XHRpZiAoIXRocF92bWFfYWxsb3dhYmxlX29yZGVyKHZtYSwgdm1hLVx1MDAzZXZtX2ZsYWdzLCBUVkFfRk9SQ0VEX0NPTExBUFNFLCBQTURfT1JERVIpKVxubW0va2h1Z2VwYWdlZC5jLTE4ODgtXHRcdHJldHVybiBTQ0FOX1ZNQV9DSEVDSztcbi0tXG5tbS9raHVnZXBhZ2VkLmM9MzE4Mj1pbnQgbWFkdmlzZV9jb2xsYXBzZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBzdGFydCxcbi0tXG5tbS9raHVnZXBhZ2VkLmMtMzE5NC1cbm1tL2todWdlcGFnZWQuYzozMTk1Olx0aWYgKCFjb2xsYXBzZV9wb3NzaWJsZSh2bWEsIHZtYS1cdTAwM2V2bV9mbGFncywgVFZBX0ZPUkNFRF9DT0xMQVBTRSkpXG5tbS9raHVnZXBhZ2VkLmMtMzE5Ni1cdFx0cmV0dXJuIC1FSU5WQUw7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjEvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA3IDIxOjU1PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDIyODM3CgkJCQkJCQlvdXRwdXQ6IDE4NgoJCQkJCQkJdGhvdWdodHM6IDYyMAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipNeSBBc3Nlc3NtZW50IG9mIHRoZSBUSFAgQWxsb3dhYmxlIE9yZGVycyBMb2dpYyBDaGFuZ2VzKioKCk9rYXksIGxldCYjMzk7cyBicmVhayB0aGlzIGRvd24uIEkgbmVlZCB0byBnZXQgYSBoYW5kbGUgb24gdGhlIGNoYW5nZXMgdG8gdGhlIFRyYW5zcGFyZW50IEh1Z2UgUGFnZSAoVEhQKSBhbGxvd2FibGUgb3JkZXJzIGxvZ2ljLCBlc3BlY2lhbGx5IGZvciBmaWxlLWJhY2tlZCBWTUFzLiBUaGUgZmlyc3QgdGhpbmdzIEkmIzM5O20gZ29pbmcgdG8gbG9vayBhdCBhcmUgdGhlIGNvcmUgZnVuY3Rpb25zIGluIGBmcy9wcm9jL3Rhc2tfbW11LmNgLCBgbW0va2h1Z2VwYWdlZC5jYCwgYW5kIGBodWdlcGFnZV92bWFfcmV2YWxpZGF0ZWAuIEkmIzM5O2xsIHBheSBjbG9zZSBhdHRlbnRpb24gdG8gdGhlIGBzaG93X3NtYXBgIGluIHRoZSB0YXNrX21tdSBmaWxlLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCB3aGVyZSB0aGUgcmV2YWxpZGF0aW9uIGxvZ2ljIGlzIGxpdmluZy4KCk15IEZvY3VzU3ltYm9scyB3aWxsIGJlOiBgX190aHBfdm1hX2FsbG93YWJsZV9vcmRlcnNgICh0aGF0JiMzOTtzIHRoZSBjb3JlIGNoYW5nZSksIGB2bWFfZmlsZV9jYW5fbWFwX2h1Z2VgLCBhbmQgYHZtYV9maWxlX2J5cGFzc190aHBfdHVuZWFibGVzYCAodGhlIG5ldyBoZWxwZXJzKSwgYW5kIGBtYWR2aXNlX2NvbGxhcHNlYCB0byB1bmRlcnN0YW5kIHRoZSBtYWR2aXNlIHBhdGggZm9yIGZpbGUgY29sbGFwc2VzLiBJdCBzZWVtcyB0aGF0IGB2bWFfZmlsZV9jYW5fbWFwX2h1Z2VgIGFuZCBgdm1hX2ZpbGVfYnlwYXNzX3RocF90dW5lYWJsZXNgIHNob3VsZCBiZSBpbmNsdWRlZCBhcyBGb2N1c1N5bWJvbHMuIFJlbWVtYmVyLCB3ZSBzaG91bGQgaW5jbHVkZSB0aGUgbmV3IGhlbHBlciBmdW5jdGlvbnMsIGV2ZW4gaWYgdGhleSYjMzk7cmUgc3RhdGljIGFuZCBub3QgaW5saW5lZCwgYmVjYXVzZSB0aGV5IHdpbGwgaGF2ZSBzeW1ib2xzIGluIGB2bWxpbnV4YC4KCk5vdywgSSBuZWVkIHRvIGRvdWJsZS1jaGVjayB0aGUgcmVsZXZhbnQgY29uZmlndXJhdGlvbnMuIFRoZSBjcml0aWNhbCBvbmUgaXMgYFRSQU5TUEFSRU5UX0hVR0VQQUdFYC4gSSBzaG91bGQgcHJvYmFibHkgY2hlY2sgYG1tL0tjb25maWdgIGZvciBvdGhlciByZWxldmFudCBjb25maWd1cmF0aW9ucywgYnV0IEkgdGhpbmsgYFRSQU5TUEFSRU5UX0hVR0VQQUdFYCBpcyB0aGUgb25seSBvbmUgSSBuZWVkIHRvIGZvY3VzIG9uLiBJIHNlZSBpdCBkZXBlbmRzIG9uIGBIQVZFX0FSQ0hfVFJBTlNQQVJFTlRfSFVHRVBBR0UgJmFtcDsmYW1wOyAhUFJFRU1QVF9SVGAuIEdvb2QsIG9uIGFtZDY0LCBgSEFWRV9BUkNIX1RSQU5TUEFSRU5UX0hVR0VQQUdFYCBpcyBgeWAsIHNvIGl0IHNob3VsZCBiZSBmaW5lLiBZZXMsIGBDT05GSUdfVFJBTlNQQVJFTlRfSFVHRVBBR0VgIChzdHJpcCBDT05GSUdfIHByZWZpeCAtJmd0OyAmIzM0O1RSQU5TUEFSRU5UX0hVR0VQQUdFJiMzNDspLgoKT2theSwgbGV0JiMzOTtzIGRpZ2VzdCB0aGUgcmVhc29uaW5nIGZvciB0aGUgY2hhbmdlcyBtb3JlIGNhcmVmdWxseS4gVGhlIHBhdGNoIHJlc3RydWN0dXJlcyBUSFAgYWxsb3dhYmxlIG9yZGVycywgaW50cm9kdWNpbmcgc2V2ZXJhbCBuZXcgZnVuY3Rpb25zIGluIGBtbS9odWdlX21lbW9yeS5jYDogYHZtYV9maWxlX2Nhbl9tYXBfaHVnZWAsIGB2bWFfZmlsZV9ieXBhc3NfdGhwX3R1bmVhYmxlc2AsIGB2bWFfZmlsZV9hbGxvd190aHBfdHVuZWFibGVzYCwgYW5kIGB2bWFfZmlsZV9jaGVja190aHBfdHVuZWFibGVzYC4gVGhlc2UgbmV3IGZ1bmN0aW9ucyBldmFsdWF0ZSB0aGUgVEhQIHR1bmVhYmxlcyBhbmQgaHVnZSBmYXVsdCBjYXBhYmlsaXRpZXMgZHVyaW5nIHBhZ2UgZmF1bHRzLCBzbWFwcyBxdWVyaWVzLCBhbmQgZm9yY2VkIGNvbGxhcHNlcyBzdWNoIGFzIHRoZSBgTUFEVl9DT0xMQVBTRWAgb3B0aW9uLiBJdCYjMzk7cyB0b3VjaGluZyBzb21lIHByZXR0eSBsb3ctbGV2ZWwgbWVtb3J5IG1hbmFnZW1lbnQgc3R1ZmYsIHdoaWNoIG1lYW5zIGl04oCZcyBlYXNpbHkgcmVhY2hhYmxlIGFuZCBmdXp6YWJsZSB2aWEgc3RhbmRhcmQgc3lzY2FsbHMgbGlrZSBgbWFkdmlzZWAsIGBtbWFwYCwgcGFnZSBmYXVsdHMsIGFuZCBgL3Byb2MvJmx0O3BpZCZndDsvc21hcHNgLgoKUmlnaHQsIEkgYW0gc2F0aXNmaWVkIHdpdGggdGhpcyBhbmFseXNpcywgSSYjMzk7bGwgY2FsbCBgc2V0LXJlc3VsdHNgIHRvb2wgbm93LgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIyLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNyAyMTo1NjwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnNldC1yZXN1bHRzPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7VFJBTlNQQVJFTlRfSFVHRVBBR0UmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDtfX3RocF92bWFfYWxsb3dhYmxlX29yZGVycyYjMzQ7LAogICAgJiMzNDt2bWFfZmlsZV9jYW5fbWFwX2h1Z2UmIzM0OywKICAgICYjMzQ7dm1hX2ZpbGVfYnlwYXNzX3RocF90dW5lYWJsZXMmIzM0OywKICAgICYjMzQ7bWFkdmlzZV9jb2xsYXBzZSYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCByZWZhY3RvcnMgYW5kIGFsdGVycyBUSFAgKFRyYW5zcGFyZW50IEh1Z2UgUGFnZSkgYWxsb3dhYmxlIG9yZGVycyBjaGVja2luZyBmb3IgZmlsZS1iYWNrZWQgVk1BcyBpbiBtbS9odWdlX21lbW9yeS5jLCBhZGRpbmcgaGVscGVycyBsaWtlIHZtYV9maWxlX2Nhbl9tYXBfaHVnZSBhbmQgdm1hX2ZpbGVfYnlwYXNzX3RocF90dW5lYWJsZXMuIFRoaXMgY29yZSBtZW1vcnkgbWFuYWdlbWVudCBsb2dpYyBpcyByZWFjaGFibGUgdmlhIHN0YW5kYXJkIHN5c2NhbGxzIGFuZCBpbnRlcmZhY2VzIHN1Y2ggYXMgbWFkdmlzZShNQURWX0NPTExBUFNFKSwgcGFnZSBmYXVsdCBoYW5kbGVycywgYW5kIC9wcm9jL3BpZC9zbWFwcy4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7VFJBTlNQQVJFTlRfSFVHRVBBR0UmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDtfX3RocF92bWFfYWxsb3dhYmxlX29yZGVycyYjMzQ7LAogICAgJiMzNDt2bWFfZmlsZV9jYW5fbWFwX2h1Z2UmIzM0OywKICAgICYjMzQ7dm1hX2ZpbGVfYnlwYXNzX3RocF90dW5lYWJsZXMmIzM0OywKICAgICYjMzQ7bWFkdmlzZV9jb2xsYXBzZSYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCByZWZhY3RvcnMgYW5kIGFsdGVycyBUSFAgKFRyYW5zcGFyZW50IEh1Z2UgUGFnZSkgYWxsb3dhYmxlIG9yZGVycyBjaGVja2luZyBmb3IgZmlsZS1iYWNrZWQgVk1BcyBpbiBtbS9odWdlX21lbW9yeS5jLCBhZGRpbmcgaGVscGVycyBsaWtlIHZtYV9maWxlX2Nhbl9tYXBfaHVnZSBhbmQgdm1hX2ZpbGVfYnlwYXNzX3RocF90dW5lYWJsZXMuIFRoaXMgY29yZSBtZW1vcnkgbWFuYWdlbWVudCBsb2dpYyBpcyByZWFjaGFibGUgdmlhIHN0YW5kYXJkIHN5c2NhbGxzIGFuZCBpbnRlcmZhY2VzIHN1Y2ggYXMgbWFkdmlzZShNQURWX0NPTExBUFNFKSwgcGFnZSBmYXVsdCBoYW5kbGVycywgYW5kIC9wcm9jL3BpZC9zbWFwcy4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yMy8xPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDcgMjE6NTY8L3RkPgoJCQk8dGQ+YWN0aW9uPC90ZD4KCQkJPHRkPklmPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI0LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNyAyMTo1NjwvdGQ+CgkJCTx0ZD5hZ2VudDwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5jb3JlPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0tNU0FOUmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIHJlZmFjdG9ycyBUSFAgKFRyYW5zcGFyZW50IEh1Z2UgUGFnZSkgcG9saWN5IGNoZWNrcyBmb3IgZmlsZS1iYWNrZWQgYW5kIHNwZWNpYWwvUEZOTUFQIFZNQXMgaW4gYG1tL2h1Z2VfbWVtb3J5LmNgLiBJdCBicmVha3Mgb3V0IHRoZSBsb2dpYyBmb3IgY2hlY2tpbmcgVEhQIHR1bmFibGVzIGFuZCBodWdlIHBhZ2Ugc3VwcG9ydCBpbnRvIGhlbHBlciBmdW5jdGlvbnMgKGB2bWFfZmlsZV9ieXBhc3NfdGhwX3R1bmVhYmxlc2AsIGB2bWFfZmlsZV9hbGxvd190aHBfdHVuZWFibGVzYCwgYHZtYV9maWxlX2NoZWNrX3RocF90dW5lYWJsZXNgLCBhbmQgYHZtYV9maWxlX2Nhbl9tYXBfaHVnZWApIGFuZCBhbGxvd3MgUEZOTUFQIFZNQXMgd2l0aCBgaHVnZV9mYXVsdGAgaGFuZGxlcnMgdG8gYnlwYXNzIGdsb2JhbCBUSFAgdHVuYWJsZXMuXG5cbk5vbmUgb2YgdGhlIGNoYW5nZXMgdG91Y2ggYnVmZmVyIGNvcGllcyB0byB1c2VyIHNwYWNlLCB1bmluaXRpYWxpemVkIHN0YWNrIG9yIGhlYXAgbWVtb3J5LCBvciBtZW1vcnkgYWxsb2NhdGlvbnMuIEFsbCB2YXJpYWJsZXMgYW5kIHN0cnVjdCBtZW1iZXJzIGV2YWx1YXRlZCAoc3VjaCBhcyBgdm1hLVx1MDAzZXZtX29wc2AsIGB2bV9mbGFnc2AsIGFuZCBgdHlwZWApIGFyZSBmdWxseSBpbml0aWFsaXplZCBhcmd1bWVudHMgb3Igc3RydWN0dXJlIGZpZWxkcy4gUG90ZW50aWFsIGlzc3VlcyBpbiB0aGlzIGNvZGUgcGF0aCAoc3VjaCBhcyBOVUxMIHBvaW50ZXIgZGVyZWZlcmVuY2VzIGlmIGB2bV9vcHNgIHdlcmUgTlVMTCkgYXJlIGRldGVjdGVkIGJ5IHN0YW5kYXJkIGtlcm5lbCBmYXVsdCBoYW5kbGVycyBhbmQgS0FTQU4uIFRoZXJlIGlzIG5vIHJpc2sgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgdXNhZ2Ugb3IgaW5mb3JtYXRpb24gbGVha3MgdGhhdCB3b3VsZCByZXF1aXJlIEtNU0FOLiYjMzQ7LAogICYjMzQ7TmVlZHNLTVNBTiYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5JbnN0cnVjdGlvbjo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBzZWN1cml0eSBlbmdpbmVlciBzcGVjaWFsaXppbmcgaW4ga2VybmVsIG1lbW9yeQplcnJvciBkZXRlY3RvcnMgKEtBU0FOIGFuZCBLTVNBTikuIFlvdXIgam9iIGlzIHRvIHJldmlldyB0aGUgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZApkZXRlcm1pbmUgaWYgdGhlIGNvZGUgY2hhbmdlcyBqdXN0aWZ5IHNwYXduaW5nIGEgZGVkaWNhdGVkIEtNU0FOIChLZXJuZWxNZW1vcnlTYW5pdGl6ZXIpCmZ1enppbmcgc2Vzc2lvbiBpbiBhZGRpdGlvbiB0byBzdGFuZGFyZCBLQVNBTiBmdXp6aW5nLgoKQ1JJVElDQUwgRElTVElOQ1RJT04gQkVUV0VFTiBLQVNBTiBBTkQgS01TQU46Ci0gU3RhbmRhcmQgS0FTQU4ga2VybmVsIGJ1aWxkcyAodXBzdHJlYW0tYXBwYXJtb3Ita2FzYW4uY29uZmlnKSBhbHJlYWR5IGVuYWJsZQogIGEgY29tcHJlaGVuc2l2ZSBzdWl0ZSBvZiBkZWJ1Z2dpbmcgdG9vbHMgYW5kIHNhbml0aXplcnMsIGluY2x1ZGluZyBLQVNBTgogIChvdXQtb2YtYm91bmRzIGFjY2Vzc2VzLCB1c2UtYWZ0ZXItZnJlZSwgZG91YmxlIGZyZWUsIGludmFsaWQgZnJlZSksIExPQ0tERVAKICAobG9ja2luZyBidWdzIGFuZCBkZWFkbG9ja3MpLCBVQi1zYW5pdGl6ZXJzLCBhbmQgbWVtb3J5IGNvcnJ1cHRpb24gY2hlY2tzLgotIEtNU0FOIChLZXJuZWxNZW1vcnlTYW5pdGl6ZXIpIGRldGVjdHMgcmVhZHMgb2YgVU5JTklUSUFMSVpFRCBtZW1vcnkgKHN0YWNrLCBoZWFwLAogIG9yIHBhZ2UgYWxsb2NhdGlvbnMpIGFuZCBrZXJuZWwtdG8tdXNlciBtZW1vcnkgaW5mby1sZWFrcy4KClJ1bGU6IFRIRVJFIElTIE5PIFNFTlNFIElOIFJVTk5JTkcgQSBLTVNBTiBTRVNTSU9OIElGIEEgQlVHIENBTiBCRSBDQVVHSFQgQlkgS0FTQU4sCkxPQ0tERVAsIE9SIE9USEVSIFNUQU5EQVJEIEJVRyBERVRFQ1RPUlMuCkEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpbmN1cnMgc2lnbmlmaWNhbnQgcmVzb3VyY2UgY29zdHMuIFlvdSBtdXN0IE9OTFkKc2V0IE5lZWRzS01TQU49dHJ1ZSBpZiB0aGUgY29kZSBjaGFuZ2VzIGludHJvZHVjZSBvciBleHBvc2UgVU5JTklUSUFMSVpFRCBNRU1PUlkgcmlza3MKdGhhdCBhcmUgZGV0ZWN0ZWQgT05MWSBieSBLTVNBTi4KCkxvb2sgaG9saXN0aWNhbGx5IGF0IHRoZSBwYXRjaCBzZXJpZXMgYW5kIHN1cnJvdW5kaW5nIGNvZGUuIEV2ZW4gaWYgbm8gZGlyZWN0CnVuaW5pdGlhbGl6ZWQgZmllbGQgYWNjZXNzZXMgb3IgbmV3IGJ1ZmZlciBhbGxvY2F0aW9ucyBhcmUgYWRkZWQgaW4gdGhlIGRpZmYgaXRzZWxmLAphIHBhdGNoIG1heSBhbHRlciBjb250cm9sIGZsb3csIGJvdW5kcyBjaGVja2luZywgb3IgZGF0YSBsZW5ndGggY2FsY3VsYXRpb25zIGluIHdheXMKdGhhdCBjaGFuZ2UgaG93IHRoZSByZXN0IG9mIHRoZSBjb2RlIG9wZXJhdGVzIG9uIGV4aXN0aW5nIGJ1ZmZlcnMgKGUuZy4gYWxsb3dpbmcKdW5pbml0aWFsaXplZCBzdGFjay9oZWFwIG1lbW9yeSB0byBiZSByZWFkLCBjb3BpZWQgdG8gdXNlciBzcGFjZSwgb3IgdXNlZCBpbiBjb250cm9sCmZsb3cpLiBEbyBub3QgaGVzaXRhdGUgdG8gdXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gaW5zcGVjdCB0aGUgc3Vycm91bmRpbmcgY29kZSwKY2FsbGVkIGZ1bmN0aW9ucywgYW5kIGNhbGxlcnMuCgpTZXQgTmVlZHNLTVNBTj10cnVlIE9OTFkgSUYgdGhlIHBhdGNoIGludHJvZHVjZXMgb3IgbW9kaWZpZXM6CjEuIEtlcm5lbCBzdHJ1Y3R1cmVzIHNlbnQgdG8gdXNlciBzcGFjZSAodmlhIGNvcHlfdG9fdXNlciwgcHV0X3VzZXIsIG5ldGxpbmsgc2tiCiAgIGF0dHJpYnV0ZXMsIGlvY3RsIG91dHB1dCBhcmd1bWVudHMsIHNvY2tldCBvcHRpb25zLCBvciBCUEYgYnVmZmVycykgd2hlcmUgZmllbGRzCiAgIG9yIHN0cnVjdHVyZSBwYWRkaW5nIG1pZ2h0IG5vdCBiZSBmdWxseSBpbml0aWFsaXplZC96ZXJvZWQuCjIuIENvbmRpdGlvbmFsIGxvZ2ljIG9yIGJyYW5jaGluZyB0aGF0IGRlcGVuZHMgb24gcG90ZW50aWFsbHkgdW5pbml0aWFsaXplZCB2YXJpYWJsZXMKICAgb3Igc3RydWN0IGZpZWxkcy4KMy4gQWxsb2NhdGlvbiBvciBpbml0aWFsaXphdGlvbiBvZiBjb21wbGV4IGRhdGEgc3RydWN0dXJlcyB3aGVyZSB1bmluaXRpYWxpemVkIGZpZWxkcwogICBjb3VsZCBiZSByZWFkIGxhdGVyIGluIHJlYWNoYWJsZSBjb2RlIHBhdGhzLgo0LiBCb3VuZHMgY2hlY2tzLCBsZW5ndGhzLCBvciBsb2dpYyBpbiBhIHdheSB0aGF0IGFsbG93cyBzdXJyb3VuZGluZyBjb2RlIHRvIGFjY2VzcwogICB1bmluaXRpYWxpemVkIGJ5dGVzIG9mIGV4aXN0aW5nIGJ1ZmZlcnMuCgpTZXQgTmVlZHNLTVNBTj1mYWxzZSBJRjoKLSBUaGUgY29kZSBjaGFuZ2VzIHByaW1hcmlseSByaXNrIG91dC1vZi1ib3VuZHMgYWNjZXNzLCBhcnJheSBvdmVyZmxvd3MsIE5VTEwgcG9pbnRlcgogIGRlcmVmZXJlbmNlcywgbG9ja2luZyBkZWFkbG9ja3MsIG9yIHVzZS1hZnRlci1mcmVlIGJ1Z3MgKHRoZXNlIGFyZSBhbHJlYWR5IGNhdWdodAogIGJ5IEtBU0FOLCBMT0NLREVQLCBvciBzdGFuZGFyZCBidWcgZGV0ZWN0b3JzKS4KLSBBbGwgc3RhY2svaGVhcCBzdHJ1Y3R1cmVzIHRvdWNoZWQgb3IgaW50cm9kdWNlZCBieSB0aGUgcGF0Y2ggYXJlIGZ1bGx5IHplcm9lZAogIG9yIGluaXRpYWxpemVkIChlLmcuIHVzaW5nID0gezB9LCBtZW1zZXQsIGt6YWxsb2MpIGJlZm9yZSBiZWluZyByZWFkIG9yIGNvcGllZC4KLSBUaGUgcGF0Y2ggZG9lcyBub3QgaW50cm9kdWNlIGFueSByaXNrIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHVzYWdlIG9yIGluZm8tbGVha3MuCgpVc2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBpbnNwZWN0IHRoZSBzdXJyb3VuZGluZyBjb2RlIGlmIG5lY2Vzc2FyeSwgdGhlbiBwcm92aWRlCmRldGFpbGVkIEtNU0FOUmVhc29uaW5nIGNvbnRyYXN0aW5nIEtBU0FOIHZzIEtNU0FOIGFwcGxpY2FiaWxpdHkgZm9yIHRoaXMgcGF0Y2guClByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLgoKClVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuCkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LgpJZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UHJvbXB0OjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+VGFyZ2V0IGFyY2hpdGVjdHVyZTogYW1kNjQKCkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOgpjb21taXQgNDA3YjhlN2I2ZjhhYTYyOTZiZDk3NGM3ZDkyNmViNzUzOWI3NGNlNgpBdXRob3I6IHN5ei1jbHVzdGVyICZsdDt0cmlhZ2VAc3l6a2FsbGVyLmNvbSZndDsKRGF0ZTogICBNb24gU2VwIDcgMjE6NTU6MTYgMjAyNiAmIzQzOzAwMDAKCiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXcKCmRpZmYgLS1naXQgYS9tbS9odWdlX21lbW9yeS5jIGIvbW0vaHVnZV9tZW1vcnkuYwppbmRleCBhZmJiNTk3NGJkMjI1Li43NWMyMDRhZjQwY2JkIDEwMDY0NAotLS0gYS9tbS9odWdlX21lbW9yeS5jCiYjNDM7JiM0MzsmIzQzOyBiL21tL2h1Z2VfbWVtb3J5LmMKQEAgLTkyLDcgJiM0Mzs5Miw3IEBAIHVuc2lnbmVkIGxvbmcgaHVnZV9hbm9uX29yZGVyc19tYWR2aXNlIF9fcmVhZF9tb3N0bHk7CiB1bnNpZ25lZCBsb25nIGh1Z2VfYW5vbl9vcmRlcnNfaW5oZXJpdCBfX3JlYWRfbW9zdGx5Owogc3RhdGljIGJvb2wgYW5vbl9vcmRlcnNfY29uZmlndXJlZCBfX2luaXRkYXRhOwogCi1zdGF0aWMgaW5saW5lIGJvb2wgZmlsZV90aHBfZW5hYmxlZChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKJiM0MztzdGF0aWMgaW5saW5lIGJvb2wgZmlsZV90aHBfZW5hYmxlZChjb25zdCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKIHsKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlOwogCkBAIC0xMTgsNiAmIzQzOzExOCw2NyBAQCBzdGF0aWMgYm9vbCB2bWFfaXNfc3BlY2lhbF9odWdlKGNvbnN0IHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQogCXJldHVybiB2bWFfdGVzdF9hbnkodm1hLCBWTUFfUEZOTUFQX0JJVCwgVk1BX01JWEVETUFQX0JJVCk7CiB9CiAKJiM0MztzdGF0aWMgYm9vbCB2bWFfZmlsZV9ieXBhc3NfdGhwX3R1bmVhYmxlcyhjb25zdCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKJiM0MzsJCWVudW0gdHZhX3R5cGUgdHlwZSkKJiM0Mzt7CiYjNDM7CWNvbnN0IGJvb2wgaGFzX2h1Z2VfZmF1bHQgPSB2bWEtJmd0O3ZtX29wcy0mZ3Q7aHVnZV9mYXVsdDsKJiM0MzsKJiM0MzsJLyogTUFEVl9DT0xMQVBTRSBpZ25vcmVzIHR1bmVhYmxlcy4gKi8KJiM0MzsJaWYgKHR5cGUgPT0gVFZBX0ZPUkNFRF9DT0xMQVBTRSkKJiM0MzsJCXJldHVybiB0cnVlOwomIzQzOwkvKiBIdWdlIFBGTiBtYXBwaW5ncyBhcmUgdW5jb21wYWN0YWJsZSBzbyB0aGUgcG9saWN5IGRvZXNuJiMzOTt0IGFwcGx5LiAqLwomIzQzOwlpZiAodm1hX3Rlc3Qodm1hLCBWTUFfUEZOTUFQX0JJVCkgJmFtcDsmYW1wOyBoYXNfaHVnZV9mYXVsdCkKJiM0MzsJCXJldHVybiB0cnVlOwomIzQzOwlyZXR1cm4gZmFsc2U7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBib29sIHZtYV9maWxlX2FsbG93X3RocF90dW5lYWJsZXModm1fZmxhZ3NfdCB2bV9mbGFncykKJiM0Mzt7CiYjNDM7CS8qIFRIUD1hbHdheXM/ICovCiYjNDM7CWlmIChodWdlcGFnZV9nbG9iYWxfYWx3YXlzKCkpCiYjNDM7CQlyZXR1cm4gdHJ1ZTsKJiM0MzsJLyogVEhQPW1hZHZpc2UgYW5kIG1hcmtlZCBNQURWX0hVR0VQQUdFPyAqLwomIzQzOwlpZiAoaHVnZXBhZ2VfZ2xvYmFsX2VuYWJsZWQoKSAmYW1wOyZhbXA7ICh2bV9mbGFncyAmYW1wOyBWTV9IVUdFUEFHRSkpCiYjNDM7CQlyZXR1cm4gdHJ1ZTsKJiM0MzsJcmV0dXJuIGZhbHNlOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgYm9vbCB2bWFfZmlsZV9jaGVja190aHBfdHVuZWFibGVzKGNvbnN0IHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAomIzQzOwkJdm1fZmxhZ3NfdCB2bV9mbGFncywgZW51bSB0dmFfdHlwZSB0eXBlKQomIzQzO3sKJiM0MzsJcmV0dXJuIHZtYV9maWxlX2J5cGFzc190aHBfdHVuZWFibGVzKHZtYSwgdHlwZSkgfHwKJiM0MzsJCXZtYV9maWxlX2FsbG93X3RocF90dW5lYWJsZXModm1fZmxhZ3MpOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgYm9vbCB2bWFfZmlsZV9jYW5fbWFwX2h1Z2UoY29uc3Qgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCiYjNDM7CQl2bV9mbGFnc190IHZtX2ZsYWdzLCBlbnVtIHR2YV90eXBlIHR5cGUpCiYjNDM7ewomIzQzOwljb25zdCBib29sIGhhc19odWdlX2ZhdWx0ID0gdm1hLSZndDt2bV9vcHMtJmd0O2h1Z2VfZmF1bHQ7CiYjNDM7CiYjNDM7CS8qCiYjNDM7CSAqIEVuZm9yY2UgVEhQIGNvbGxhcHNlIHJlcXVpcmVtZW50cyBhcyBuZWNlc3NhcnkuIEFub255bW91cyB2bWFzCiYjNDM7CSAqIHdlcmUgYWxyZWFkeSBoYW5kbGVkIGluIHRocF92bWFfYWxsb3dhYmxlX29yZGVycygpLgomIzQzOwkgKi8KJiM0MzsJaWYgKCF2bWFfZmlsZV9jaGVja190aHBfdHVuZWFibGVzKHZtYSwgdm1fZmxhZ3MsIHR5cGUpKQomIzQzOwkJcmV0dXJuIGZhbHNlOwomIzQzOwomIzQzOwlzd2l0Y2ggKHR5cGUpIHsKJiM0MzsJY2FzZSBUVkFfUEFHRUZBVUxUOgomIzQzOwkJLyoKJiM0MzsJCSAqIFRydXN0IHRoYXQgLSZndDtodWdlX2ZhdWx0KCkgaGFuZGxlcnMga25vdyB3aGF0IHRoZXkgYXJlIGRvaW5nCiYjNDM7CQkgKiBpbiBmYXVsdCBwYXRoLgomIzQzOwkJICovCiYjNDM7CQlyZXR1cm4gaGFzX2h1Z2VfZmF1bHQ7CiYjNDM7CWNhc2UgVFZBX1NNQVBTOgomIzQzOwkJaWYgKGhhc19odWdlX2ZhdWx0KQomIzQzOwkJCXJldHVybiB0cnVlOwomIzQzOwkJZmFsbHRocm91Z2g7CiYjNDM7CWRlZmF1bHQ6CiYjNDM7CQkvKiBPbmx5IHJlZ3VsYXIgZmlsZSBpcyB2YWxpZCBpbiBjb2xsYXBzZSBwYXRoLiAqLwomIzQzOwkJcmV0dXJuIGZpbGVfdGhwX2VuYWJsZWQodm1hKTsKJiM0MzsJfQomIzQzO30KJiM0MzsKIHVuc2lnbmVkIGxvbmcgX190aHBfdm1hX2FsbG93YWJsZV9vcmRlcnMoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCiAJCQkJCSB2bV9mbGFnc190IHZtX2ZsYWdzLAogCQkJCQkgZW51bSB0dmFfdHlwZSB0eXBlLApAQCAtMTkwLDI3ICYjNDM7MjUxLDggQEAgdW5zaWduZWQgbG9uZyBfX3RocF92bWFfYWxsb3dhYmxlX29yZGVycyhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKIAkJCQkJCSAgIHZtYSwgdm1hX3N0YXJ0X3Bnb2ZmKHZtYSksIDAsCiAJCQkJCQkgICBmb3JjZWRfY29sbGFwc2UpOwogCi0JaWYgKCF2bWFfaXNfYW5vbnltb3VzKHZtYSkpIHsKLQkJLyoKLQkJICogRW5mb3JjZSBUSFAgY29sbGFwc2UgcmVxdWlyZW1lbnRzIGFzIG5lY2Vzc2FyeS4gQW5vbnltb3VzIHZtYXMKLQkJICogd2VyZSBhbHJlYWR5IGhhbmRsZWQgaW4gdGhwX3ZtYV9hbGxvd2FibGVfb3JkZXJzKCkuCi0JCSAqLwotCQlpZiAoIWZvcmNlZF9jb2xsYXBzZSAmYW1wOyZhbXA7Ci0JCSAgICAoIWh1Z2VwYWdlX2dsb2JhbF9lbmFibGVkKCkgfHwgKCEodm1fZmxhZ3MgJmFtcDsgVk1fSFVHRVBBR0UpICZhbXA7JmFtcDsKLQkJCQkJCSAgICAhaHVnZXBhZ2VfZ2xvYmFsX2Fsd2F5cygpKSkpCi0JCQlyZXR1cm4gMDsKLQotCQkvKgotCQkgKiBUcnVzdCB0aGF0IC0mZ3Q7aHVnZV9mYXVsdCgpIGhhbmRsZXJzIGtub3cgd2hhdCB0aGV5IGFyZSBkb2luZwotCQkgKiBpbiBmYXVsdCBwYXRoLgotCQkgKi8KLQkJaWYgKCgoaW5fcGYgfHwgc21hcHMpKSAmYW1wOyZhbXA7IHZtYS0mZ3Q7dm1fb3BzLSZndDtodWdlX2ZhdWx0KQotCQkJcmV0dXJuIG9yZGVyczsKLQkJLyogT25seSByZWd1bGFyIGZpbGUgaXMgdmFsaWQgaW4gY29sbGFwc2UgcGF0aCAqLwotCQlpZiAoKCghaW5fcGYgfHwgc21hcHMpKSAmYW1wOyZhbXA7IGZpbGVfdGhwX2VuYWJsZWQodm1hKSkKLQkJCXJldHVybiBvcmRlcnM7Ci0JCXJldHVybiAwOwotCX0KJiM0MzsJaWYgKCF2bWFfaXNfYW5vbnltb3VzKHZtYSkpCiYjNDM7CQlyZXR1cm4gdm1hX2ZpbGVfY2FuX21hcF9odWdlKHZtYSwgdm1fZmxhZ3MsIHR5cGUpID8gb3JkZXJzIDogMDsKIAogCWlmICh2bWFfaXNfdGVtcG9yYXJ5X3N0YWNrKHZtYSkpCiAJCXJldHVybiAwOwo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yNS8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDcgMjE6NTY8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMzIxOAoJCQkJCQkJb3V0cHV0OiAzOAoJCQkJCQkJdGhvdWdodHM6IDQ1OAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgdGhlIEh1Z2UgTWVtb3J5IFBhdGNoIGZvciBVbmluaXRpYWxpemVkIE1lbW9yeSBSaXNrcyoqCgpPa2F5LCBsZXQmIzM5O3MgZGl2ZSBpbnRvIHRoaXMgcGF0Y2guIE15IGltbWVkaWF0ZSBnb2FsIGlzIHRvIGRldGVybWluZSBpZiBpdCBpbnRyb2R1Y2VzIGFueSBuZXcgb3Bwb3J0dW5pdGllcyBmb3IgdW5pbml0aWFsaXplZCBtZW1vcnkgZXhwb3N1cmUgdGhhdCBtaWdodCB3YXJyYW50IEtNU0FOIHNjcnV0aW55LiBJJiMzOTtsbCBzdGFydCBieSByZWFkaW5nIHRocm91Z2ggdGhlIGNoYW5nZXMgaW4gYG1tL2h1Z2VfbWVtb3J5LmNgLiBJdCBsb29rcyBsaWtlIHdlIGhhdmUgYSBzZXQgb2YgZnVuY3Rpb24gbW9kaWZpY2F0aW9ucy4KCkZpcnN0LCBJIHNlZSBhIGBjb25zdGAgcXVhbGlmaWVyIGFkZGVkIHRvIGBmaWxlX3RocF9lbmFibGVkYCwgYSBnb29kIHByYWN0aWNlIGZvciBlbnN1cmluZyBkYXRhIGludGVncml0eSwgdGhvdWdoIGxpa2VseSBub3QgS01TQU4gcmVsZXZhbnQuIFRoZW4gdGhlcmUgYXJlIGEgZmV3IG5ldyBib29sZWFuIGZ1bmN0aW9uczogYHZtYV9maWxlX2J5cGFzc190aHBfdHVuZWFibGVzYCwgYHZtYV9maWxlX2FsbG93X3RocF90dW5lYWJsZXNgLCBgdm1hX2ZpbGVfY2hlY2tfdGhwX3R1bmVhYmxlc2AsIGFuZCBgdm1hX2ZpbGVfY2FuX21hcF9odWdlYC4gVGhleSBzZWVtIHRvIGRlYWwgd2l0aCB0aGUgdHVuYWJpbGl0eSBhbmQgZW5hYmxpbmcvZGlzYWJsaW5nIG9mIFRyYW5zcGFyZW50IEh1Z2UgUGFnZXMgKFRIUCkgZm9yIGZpbGUtYmFja2VkIFZNQXMsIGJhc2VkIG9uIHZhcmlvdXMgY29uZGl0aW9ucyBhbmQgZmxhZ3MuIEZpbmFsbHksIGBfX3RocF92bWFfYWxsb3dhYmxlX29yZGVyc2AgaXMgcmVmYWN0b3JlZCB0byB1c2UgYHZtYV9maWxlX2Nhbl9tYXBfaHVnZWAuCgpOb3csIHRoZSBjcml0aWNhbCBwYXJ0LiBNeSByYWRhciBpcyB1cCBmb3Igd2hlcmUgdW5pbml0aWFsaXplZCBkYXRhIGNvdWxkIGJlY29tZSBhIHByb2JsZW0uIEkmIzM5O2xsIG5lZWQgdG8gZ28gYmV5b25kIGEgc3VwZXJmaWNpYWwgcmVhZCBhbmQgc2VlIGhvdyB0aGVzZSBuZXcgZnVuY3Rpb25zIGFyZSB1c2VkLCBhbmQgaG93IGV4aXN0aW5nIGRhdGEgZmxvd3MgYXJlIG1vZGlmaWVkLiBJIHdpbGwgcHJvYmFibHkgbmVlZCB0byBkaWcgaW50byBgbW0vaHVnZV9tZW1vcnkuY2AgZGlyZWN0bHksIGxpa2VseSB1c2luZyBgcmVhZC1maWxlYCBvciBgZ3JlcHBlcmAgdG8gdW5kZXJzdGFuZCBhbGwgdGhlIGRhdGEgc3RydWN0dXJlcyBhbmQgY29udHJvbCBmbG93LCBwYXJ0aWN1bGFybHkgZm9jdXNpbmcgb24gYW55IHBvdGVudGlhbCBkYXRhIHJhY2VzLiBJIHdhbnQgdG8gc2VlIGlmIGFueSBvZiB0aGVzZSBuZXcgZnVuY3Rpb25zLCBlc3BlY2lhbGx5IGB2bWFfZmlsZV9jYW5fbWFwX2h1Z2VgIGFuZCBob3cgaXQgaXMgdXNlZCBpbiBgX190aHBfdm1hX2FsbG93YWJsZV9vcmRlcnNgLCBpbnRyb2R1Y2UgcGF0aHMgd2hlcmUgZGF0YSBtaWdodCBiZSByZWFkIGJlZm9yZSBiZWluZyBpbml0aWFsaXplZC4gSSB3aWxsIGFsc28gYmUgbG9va2luZyB0byBzZWUgaWYgdGhlcmUgaXMgYW55IG1lbW9yeSBhbGxvY2F0aW9uIHRoYXQgY291bGQgYmUgZXhwb3NlZC4gVGhlIGRldmlsIGlzIGFsd2F5cyBpbiB0aGUgZGV0YWlscyEKCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yNi8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDcgMjE6NTY8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7X190aHBfdm1hX2FsbG93YWJsZV9vcmRlcnMmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDttbS9odWdlX21lbW9yeS5jJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O21tL2h1Z2VfbWVtb3J5LmM9MTUzPXN0YXRpYyBib29sIHZtYV9maWxlX2Nhbl9tYXBfaHVnZShjb25zdCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbi0tXG5tbS9odWdlX21lbW9yeS5jLTE4MS1cbm1tL2h1Z2VfbWVtb3J5LmM6MTgyOnVuc2lnbmVkIGxvbmcgX190aHBfdm1hX2FsbG93YWJsZV9vcmRlcnMoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG5tbS9odWdlX21lbW9yeS5jLTE4My1cdFx0XHRcdFx0IHZtX2ZsYWdzX3Qgdm1fZmxhZ3MsXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjcvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA3IDIxOjU2PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDQyNTkKCQkJCQkJCW91dHB1dDogMzUKCQkJCQkJCXRob3VnaHRzOiAzMwoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgbGV0JiMzOTtzIGRpdmUgaW50byB0aGlzLiBIZXJlJiMzOTtzIGhvdyBJJiMzOTtkIGFwcHJvYWNoIHRoaXMgdGFzaywgYXMgaWYgdGhlc2Ugd2VyZSBteSBpbnRlcm5hbCB0aG91Z2h0czoKCioqQW5hbHl6aW5nIGBfX3RocF92bWFfYWxsb3dhYmxlX29yZGVyc2AgYW5kIGB2bWFfZmlsZV9jYW5fbWFwX2h1Z2VgKioKClJpZ2h0LCBsZXQmIzM5O3MgZ2V0IGRvd24gdG8gdGhlIG5pdHR5LWdyaXR0eS4gTXkgZXhwZXJ0aXNlIHRlbGxzIG1lIHRoZXNlIGFyZSBsaWtlbHkga2V5IGZ1bmN0aW9ucyBkZWFsaW5nIHdpdGggVHJhbnNwYXJlbnQgSHVnZSBQYWdlcyAoVEhQKSBhbmQgdGhlaXIgaW50ZXJhY3Rpb24gd2l0aCBWaXJ0dWFsIE1lbW9yeSBBcmVhcyAoVk1Bcykgd2hlbiBtYXBwaW5nIGZpbGVzLiBHaXZlbiB0aGUgbmFtaW5nIGNvbnZlbnRpb25zLCBgX190aHBfdm1hX2FsbG93YWJsZV9vcmRlcnNgIHN1Z2dlc3RzIGl0JiMzOTtzIGNoZWNraW5nIHRoZSBsZWdhbGl0eSBvciBwZXJtaXNzaWJpbGl0eSBvZiB1c2luZyBUSFBzIHdpdGhpbiBhIFZNQSwgcG90ZW50aWFsbHkgcmVnYXJkaW5nIG9yZGVyIChpLmUuIHNpemUpIGNvbnN0cmFpbnRzLiBUaGUgZG91YmxlIHVuZGVyc2NvcmUgcHJlZml4IHVzdWFsbHkgbWVhbnMgdGhpcyBpcyBhbiBpbnRlcm5hbCBmdW5jdGlvbiwgbm90IG1lYW50IHRvIGJlIGNhbGxlZCBkaXJlY3RseS4gYHZtYV9maWxlX2Nhbl9tYXBfaHVnZWAsIG9uIHRoZSBvdGhlciBoYW5kLCBoaW50cyBhdCBhIGJyb2FkZXIgY2hlY2suIFRoaXMgc291bmRzIGxpa2UgYSBmdW5jdGlvbiB0byBkZXRlcm1pbmUgaWYgYSBzcGVjaWZpYyBmaWxlIGNhbiBiZSBtYXBwZWQgd2l0aCBodWdlIHBhZ2VzLCBwb3RlbnRpYWxseSBlbmNvbXBhc3NpbmcgYnJvYWRlciBjb25zaWRlcmF0aW9ucyB0aGFuIGp1c3QgVk1BLXNwZWNpZmljIG9yZGVycy4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgd2hhdCBmYWN0b3JzIGFyZSBjb25zaWRlcmVkIGhlcmUuIEkgbmVlZCB0byBleGFtaW5lIHRoZSBzdXJyb3VuZGluZyBjb2RlIHRvIGRldGVybWluZSBob3cgYF9fdGhwX3ZtYV9hbGxvd2FibGVfb3JkZXJzYCBpcyB1c2VkLCBhbmQgbW9yZSBpbXBvcnRhbnRseSwgKndoeSouIElzIGl0IGEgaGFyZCBsaW1pdD8gRG9lcyBpdCBjb25zaWRlciBOVU1BIG5vZGVzPyBXaGF0IGNyaXRlcmlhIGRvZXMgaXQgYXBwbHk/IFNpbWlsYXJseSwgd2hhdCBjaGVja3MgZG9lcyBgdm1hX2ZpbGVfY2FuX21hcF9odWdlYCBwZXJmb3JtPyBBcmUgd2UgdGFsa2luZyBhYm91dCB0aGUgZmlsZSYjMzk7cyBpbm9kZSBmbGFncywgb3IgdGhlIHVuZGVybHlpbmcgZmlsZXN5c3RlbSYjMzk7cyBjYXBhYmlsaXRpZXM/IFRoaXMgc291bmRzIGxpa2UgcG90ZW50aWFsbHkgdmVyeSBpbnRlcmVzdGluZyBjb2RlIHRvIGFuYWx5emUuIEkmIzM5O20ga2VlbiB0byB1bmRlcnN0YW5kIHRoZSBpbnRlcmRlcGVuZGVuY2llcyBiZXR3ZWVuIHRoZXNlIHR3byBmdW5jdGlvbnMgaW4gcmVsYXRpb24gdG8gVEhQIGVuYWJsZW1lbnQgYW5kIGZpbGUgbWFwcGluZy4gTGV0JiMzOTtzIHNlZSBob3cgdGhlc2UgZnVuY3Rpb24gY2FsbHMgd2VhdmUgdG9nZXRoZXIgd2l0aGluIHRoZSBtZW1vcnkgbWFuYWdlbWVudCBzdWJzeXN0ZW0uCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjgvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA3IDIxOjU2PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7bW0vaHVnZV9tZW1vcnkuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDEyMCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiA4MAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgMTIwOlx0XG4gMTIxOlx0c3RhdGljIGJvb2wgdm1hX2ZpbGVfYnlwYXNzX3RocF90dW5lYWJsZXMoY29uc3Qgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4gMTIyOlx0XHRcdGVudW0gdHZhX3R5cGUgdHlwZSlcbiAxMjM6XHR7XG4gMTI0Olx0XHRjb25zdCBib29sIGhhc19odWdlX2ZhdWx0ID0gdm1hLVx1MDAzZXZtX29wcy1cdTAwM2VodWdlX2ZhdWx0O1xuIDEyNTpcdFxuIDEyNjpcdFx0LyogTUFEVl9DT0xMQVBTRSBpZ25vcmVzIHR1bmVhYmxlcy4gKi9cbiAxMjc6XHRcdGlmICh0eXBlID09IFRWQV9GT1JDRURfQ09MTEFQU0UpXG4gMTI4Olx0XHRcdHJldHVybiB0cnVlO1xuIDEyOTpcdFx0LyogSHVnZSBQRk4gbWFwcGluZ3MgYXJlIHVuY29tcGFjdGFibGUgc28gdGhlIHBvbGljeSBkb2VzbiYjMzk7dCBhcHBseS4gKi9cbiAxMzA6XHRcdGlmICh2bWFfdGVzdCh2bWEsIFZNQV9QRk5NQVBfQklUKSBcdTAwMjZcdTAwMjYgaGFzX2h1Z2VfZmF1bHQpXG4gMTMxOlx0XHRcdHJldHVybiB0cnVlO1xuIDEzMjpcdFx0cmV0dXJuIGZhbHNlO1xuIDEzMzpcdH1cbiAxMzQ6XHRcbiAxMzU6XHRzdGF0aWMgYm9vbCB2bWFfZmlsZV9hbGxvd190aHBfdHVuZWFibGVzKHZtX2ZsYWdzX3Qgdm1fZmxhZ3MpXG4gMTM2Olx0e1xuIDEzNzpcdFx0LyogVEhQPWFsd2F5cz8gKi9cbiAxMzg6XHRcdGlmIChodWdlcGFnZV9nbG9iYWxfYWx3YXlzKCkpXG4gMTM5Olx0XHRcdHJldHVybiB0cnVlO1xuIDE0MDpcdFx0LyogVEhQPW1hZHZpc2UgYW5kIG1hcmtlZCBNQURWX0hVR0VQQUdFPyAqL1xuIDE0MTpcdFx0aWYgKGh1Z2VwYWdlX2dsb2JhbF9lbmFibGVkKCkgXHUwMDI2XHUwMDI2ICh2bV9mbGFncyBcdTAwMjYgVk1fSFVHRVBBR0UpKVxuIDE0MjpcdFx0XHRyZXR1cm4gdHJ1ZTtcbiAxNDM6XHRcdHJldHVybiBmYWxzZTtcbiAxNDQ6XHR9XG4gMTQ1Olx0XG4gMTQ2Olx0c3RhdGljIGJvb2wgdm1hX2ZpbGVfY2hlY2tfdGhwX3R1bmVhYmxlcyhjb25zdCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbiAxNDc6XHRcdFx0dm1fZmxhZ3NfdCB2bV9mbGFncywgZW51bSB0dmFfdHlwZSB0eXBlKVxuIDE0ODpcdHtcbiAxNDk6XHRcdHJldHVybiB2bWFfZmlsZV9ieXBhc3NfdGhwX3R1bmVhYmxlcyh2bWEsIHR5cGUpIHx8XG4gMTUwOlx0XHRcdHZtYV9maWxlX2FsbG93X3RocF90dW5lYWJsZXModm1fZmxhZ3MpO1xuIDE1MTpcdH1cbiAxNTI6XHRcbiAxNTM6XHRzdGF0aWMgYm9vbCB2bWFfZmlsZV9jYW5fbWFwX2h1Z2UoY29uc3Qgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4gMTU0Olx0XHRcdHZtX2ZsYWdzX3Qgdm1fZmxhZ3MsIGVudW0gdHZhX3R5cGUgdHlwZSlcbiAxNTU6XHR7XG4gMTU2Olx0XHRjb25zdCBib29sIGhhc19odWdlX2ZhdWx0ID0gdm1hLVx1MDAzZXZtX29wcy1cdTAwM2VodWdlX2ZhdWx0O1xuIDE1NzpcdFxuIDE1ODpcdFx0LypcbiAxNTk6XHRcdCAqIEVuZm9yY2UgVEhQIGNvbGxhcHNlIHJlcXVpcmVtZW50cyBhcyBuZWNlc3NhcnkuIEFub255bW91cyB2bWFzXG4gMTYwOlx0XHQgKiB3ZXJlIGFscmVhZHkgaGFuZGxlZCBpbiB0aHBfdm1hX2FsbG93YWJsZV9vcmRlcnMoKS5cbiAxNjE6XHRcdCAqL1xuIDE2MjpcdFx0aWYgKCF2bWFfZmlsZV9jaGVja190aHBfdHVuZWFibGVzKHZtYSwgdm1fZmxhZ3MsIHR5cGUpKVxuIDE2MzpcdFx0XHRyZXR1cm4gZmFsc2U7XG4gMTY0Olx0XG4gMTY1Olx0XHRzd2l0Y2ggKHR5cGUpIHtcbiAxNjY6XHRcdGNhc2UgVFZBX1BBR0VGQVVMVDpcbiAxNjc6XHRcdFx0LypcbiAxNjg6XHRcdFx0ICogVHJ1c3QgdGhhdCAtXHUwMDNlaHVnZV9mYXVsdCgpIGhhbmRsZXJzIGtub3cgd2hhdCB0aGV5IGFyZSBkb2luZ1xuIDE2OTpcdFx0XHQgKiBpbiBmYXVsdCBwYXRoLlxuIDE3MDpcdFx0XHQgKi9cbiAxNzE6XHRcdFx0cmV0dXJuIGhhc19odWdlX2ZhdWx0O1xuIDE3MjpcdFx0Y2FzZSBUVkFfU01BUFM6XG4gMTczOlx0XHRcdGlmIChoYXNfaHVnZV9mYXVsdClcbiAxNzQ6XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcbiAxNzU6XHRcdFx0ZmFsbHRocm91Z2g7XG4gMTc2Olx0XHRkZWZhdWx0OlxuIDE3NzpcdFx0XHQvKiBPbmx5IHJlZ3VsYXIgZmlsZSBpcyB2YWxpZCBpbiBjb2xsYXBzZSBwYXRoLiAqL1xuIDE3ODpcdFx0XHRyZXR1cm4gZmlsZV90aHBfZW5hYmxlZCh2bWEpO1xuIDE3OTpcdFx0fVxuIDE4MDpcdH1cbiAxODE6XHRcbiAxODI6XHR1bnNpZ25lZCBsb25nIF9fdGhwX3ZtYV9hbGxvd2FibGVfb3JkZXJzKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuIDE4MzpcdFx0XHRcdFx0XHQgdm1fZmxhZ3NfdCB2bV9mbGFncyxcbiAxODQ6XHRcdFx0XHRcdFx0IGVudW0gdHZhX3R5cGUgdHlwZSxcbiAxODU6XHRcdFx0XHRcdFx0IHVuc2lnbmVkIGxvbmcgb3JkZXJzKVxuIDE4NjpcdHtcbiAxODc6XHRcdGNvbnN0IGJvb2wgc21hcHMgPSB0eXBlID09IFRWQV9TTUFQUztcbiAxODg6XHRcdGNvbnN0IGJvb2wgaW5fcGYgPSB0eXBlID09IFRWQV9QQUdFRkFVTFQ7XG4gMTg5Olx0XHRjb25zdCBib29sIGZvcmNlZF9jb2xsYXBzZSA9IHR5cGUgPT0gVFZBX0ZPUkNFRF9DT0xMQVBTRTtcbiAxOTA6XHRcdHVuc2lnbmVkIGxvbmcgc3VwcG9ydGVkX29yZGVycztcbiAxOTE6XHRcbiAxOTI6XHRcdC8qIENoZWNrIHRoZSBpbnRlcnNlY3Rpb24gb2YgcmVxdWVzdGVkIGFuZCBzdXBwb3J0ZWQgb3JkZXJzLiAqL1xuIDE5MzpcdFx0aWYgKHZtYV9pc19hbm9ueW1vdXModm1hKSlcbiAxOTQ6XHRcdFx0c3VwcG9ydGVkX29yZGVycyA9IFRIUF9PUkRFUlNfQUxMX0FOT047XG4gMTk1Olx0XHRlbHNlIGlmICh2bWFfaXNfZGF4KHZtYSkgfHwgdm1hX2lzX3NwZWNpYWxfaHVnZSh2bWEpKVxuIDE5NjpcdFx0XHRzdXBwb3J0ZWRfb3JkZXJzID0gVEhQX09SREVSU19BTExfU1BFQ0lBTF9EQVg7XG4gMTk3Olx0XHRlbHNlXG4gMTk4Olx0XHRcdHN1cHBvcnRlZF9vcmRlcnMgPSBUSFBfT1JERVJTX0FMTF9GSUxFX0RFRkFVTFQ7XG4gMTk5Olx0XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjkvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA3IDIxOjU2PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDU5NzIKCQkJCQkJCW91dHB1dDogMzUKCQkJCQkJCXRob3VnaHRzOiA0MQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBteSB0YWtlIG9uIHRoZSB0aG91Z2h0IHByb2Nlc3MsIGFzIHJlcXVlc3RlZDoKCioqRGl2aW5nIGludG8gYF9fdGhwX3ZtYV9hbGxvd2FibGVfb3JkZXJzYCBpbiBgbW0vaHVnZV9tZW1vcnkuY2AqKgoKT2theSwgc28gSSBuZWVkIHRvIGdldCBhIGJldHRlciBncmFzcCBvZiB0aGUgbG9naWMgd2l0aGluIGBfX3RocF92bWFfYWxsb3dhYmxlX29yZGVyc2AuIEkmIzM5O3ZlIGJlZW4gd29ya2luZyB3aXRoIGh1Z2UgcGFnZXMgbGF0ZWx5LCBhbmQgSSB3YW50IHRvIHJlYWxseSB1bmRlcnN0YW5kIHRoZSBjb25kaXRpb25zIHRoYXQgZ292ZXJuIHdoZXRoZXIgb3Igbm90IGEgc3BlY2lmaWMgVk1BIGNhbiBhY3R1YWxseSAqdXNlKiB0aGVtLiBJdCYjMzk7cyBhIGNyaXRpY2FsIGZ1bmN0aW9uLCBkZXRlcm1pbmluZyB0aGUgc2l6aW5nIG9mIFRIUHMgYXZhaWxhYmxlIHRvIHRoZSBWTUEuCgpJJiMzOTttIHNraXBwaW5nIHRoZSBwcmVsaW1pbmFyaWVzIGFuZCBnb2luZyBzdHJhaWdodCB0byBsaW5lcyAyMDAgdGhyb3VnaCAyNjAgb2YgYG1tL2h1Z2VfbWVtb3J5LmNgLiBUaG9zZSBsaW5lcyBzaG91bGQgZ2l2ZSBtZSB0aGUgcmVzdCBvZiB0aGUgcHV6emxlIHBpZWNlcy4gSSYjMzk7bSBleHBlY3RpbmcgdG8gZmluZCB0aGUga2V5IGNvbnN0cmFpbnRzIG91dGxpbmVkLiBTcGVjaWZpY2FsbHkgSSYjMzk7bSBob3BpbmcgdG8gc2VlOiBpZiB0aGVyZSYjMzk7cyBhbnkgcmVtYWluaW5nIGxvZ2ljLCBhbnkgZGVwZW5kZW5jaWVzLCBvciBzcGVjaWFsIGhhbmRsaW5nIEkgbmVlZCB0byBiZSBhd2FyZSBvZi4gSSBuZWVkIHRvIGJlIGFibGUgdG8gYW50aWNpcGF0ZSBwcm9ibGVtcyBhbmQgZXhwbGFpbiBlZGdlIGNhc2VzLiBMZXQmIzM5O3Mgc2VlIHdoYXQgdGhlIGNvZGUgc2F5cy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zMC8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDcgMjE6NTY8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDttbS9odWdlX21lbW9yeS5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMjAwLAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDY1Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OyAyMDA6XHRcdG9yZGVycyBcdTAwMjY9IHN1cHBvcnRlZF9vcmRlcnM7XG4gMjAxOlx0XHRpZiAoIW9yZGVycylcbiAyMDI6XHRcdFx0cmV0dXJuIDA7XG4gMjAzOlx0XG4gMjA0Olx0XHRpZiAoIXZtYS1cdTAwM2V2bV9tbSlcdFx0LyogdmRzbyAqL1xuIDIwNTpcdFx0XHRyZXR1cm4gMDtcbiAyMDY6XHRcbiAyMDc6XHRcdGlmICh0aHBfZGlzYWJsZWRfYnlfaHcoKSB8fCB2bWFfdGhwX2Rpc2FibGVkKHZtYSwgdm1fZmxhZ3MsIGZvcmNlZF9jb2xsYXBzZSkpXG4gMjA4Olx0XHRcdHJldHVybiAwO1xuIDIwOTpcdFxuIDIxMDpcdFx0Lyoga2h1Z2VwYWdlZCBkb2VzbiYjMzk7dCBjb2xsYXBzZSBEQVggdm1hLCBidXQgcGFnZSBmYXVsdCBpcyBmaW5lLiAqL1xuIDIxMTpcdFx0aWYgKHZtYV9pc19kYXgodm1hKSlcbiAyMTI6XHRcdFx0cmV0dXJuIGluX3BmID8gb3JkZXJzIDogMDtcbiAyMTM6XHRcbiAyMTQ6XHRcdC8qXG4gMjE1Olx0XHQgKiBraHVnZXBhZ2VkIHNwZWNpYWwgVk1BIGFuZCBodWdldGxiIFZNQS5cbiAyMTY6XHRcdCAqIE11c3QgYmUgY2hlY2tlZCBhZnRlciBkYXggc2luY2Ugc29tZSBkYXggbWFwcGluZ3MgbWF5IGhhdmVcbiAyMTc6XHRcdCAqIFZNX01JWEVETUFQIHNldC5cbiAyMTg6XHRcdCAqL1xuIDIxOTpcdFx0aWYgKCFpbl9wZiBcdTAwMjZcdTAwMjYgIXNtYXBzIFx1MDAyNlx1MDAyNiAodm1fZmxhZ3MgXHUwMDI2IFZNX05PX0tIVUdFUEFHRUQpKVxuIDIyMDpcdFx0XHRyZXR1cm4gMDtcbiAyMjE6XHRcbiAyMjI6XHRcdC8qXG4gMjIzOlx0XHQgKiBDaGVjayBhbGlnbm1lbnQgZm9yIGZpbGUgdm1hIGFuZCBzaXplIGZvciBib3RoIGZpbGUgYW5kIGFub24gdm1hIGJ5XG4gMjI0Olx0XHQgKiBmaWx0ZXJpbmcgb3V0IHRoZSB1bnN1aXRhYmxlIG9yZGVycy5cbiAyMjU6XHRcdCAqXG4gMjI2Olx0XHQgKiBTa2lwIHRoZSBjaGVjayBmb3IgcGFnZSBmYXVsdC4gSHVnZSBmYXVsdCBkb2VzIHRoZSBjaGVjayBpbiBmYXVsdFxuIDIyNzpcdFx0ICogaGFuZGxlcnMuXG4gMjI4Olx0XHQgKi9cbiAyMjk6XHRcdGlmICghaW5fcGYpIHtcbiAyMzA6XHRcdFx0aW50IG9yZGVyID0gaGlnaGVzdF9vcmRlcihvcmRlcnMpO1xuIDIzMTpcdFx0XHR1bnNpZ25lZCBsb25nIGFkZHI7XG4gMjMyOlx0XG4gMjMzOlx0XHRcdHdoaWxlIChvcmRlcnMpIHtcbiAyMzQ6XHRcdFx0XHRhZGRyID0gdm1hLVx1MDAzZXZtX2VuZCAtIChQQUdFX1NJWkUgXHUwMDNjXHUwMDNjIG9yZGVyKTtcbiAyMzU6XHRcdFx0XHRpZiAodGhwX3ZtYV9zdWl0YWJsZV9vcmRlcih2bWEsIGFkZHIsIG9yZGVyKSlcbiAyMzY6XHRcdFx0XHRcdGJyZWFrO1xuIDIzNzpcdFx0XHRcdG9yZGVyID0gbmV4dF9vcmRlcihcdTAwMjZvcmRlcnMsIG9yZGVyKTtcbiAyMzg6XHRcdFx0fVxuIDIzOTpcdFxuIDI0MDpcdFx0XHRpZiAoIW9yZGVycylcbiAyNDE6XHRcdFx0XHRyZXR1cm4gMDtcbiAyNDI6XHRcdH1cbiAyNDM6XHRcbiAyNDQ6XHRcdC8qXG4gMjQ1Olx0XHQgKiBFbmFibGVkIHZpYSBzaG1lbSBtb3VudCBvcHRpb25zIG9yIHN5c2ZzIHNldHRpbmdzLlxuIDI0NjpcdFx0ICogTXVzdCBiZSBkb25lIGJlZm9yZSBodWdlcGFnZSBmbGFncyBjaGVjayBzaW5jZSBzaG1lbSBoYXMgaXRzXG4gMjQ3Olx0XHQgKiBvd24gZmxhZ3MuXG4gMjQ4Olx0XHQgKi9cbiAyNDk6XHRcdGlmICghaW5fcGYgXHUwMDI2XHUwMDI2IHNobWVtX2ZpbGUodm1hLVx1MDAzZXZtX2ZpbGUpKVxuIDI1MDpcdFx0XHRyZXR1cm4gb3JkZXJzIFx1MDAyNiBzaG1lbV9hbGxvd2FibGVfaHVnZV9vcmRlcnMoZmlsZV9pbm9kZSh2bWEtXHUwMDNldm1fZmlsZSksXG4gMjUxOlx0XHRcdFx0XHRcdFx0ICAgdm1hLCB2bWFfc3RhcnRfcGdvZmYodm1hKSwgMCxcbiAyNTI6XHRcdFx0XHRcdFx0XHQgICBmb3JjZWRfY29sbGFwc2UpO1xuIDI1MzpcdFxuIDI1NDpcdFx0aWYgKCF2bWFfaXNfYW5vbnltb3VzKHZtYSkpXG4gMjU1Olx0XHRcdHJldHVybiB2bWFfZmlsZV9jYW5fbWFwX2h1Z2Uodm1hLCB2bV9mbGFncywgdHlwZSkgPyBvcmRlcnMgOiAwO1xuIDI1NjpcdFxuIDI1NzpcdFx0aWYgKHZtYV9pc190ZW1wb3Jhcnlfc3RhY2sodm1hKSlcbiAyNTg6XHRcdFx0cmV0dXJuIDA7XG4gMjU5Olx0XG4gMjYwOlx0XHQvKlxuIDI2MTpcdFx0ICogVEhQZWxpZ2libGUgYml0IG9mIHNtYXBzIHNob3VsZCBzaG93IDEgZm9yIHByb3BlciBWTUFzIGV2ZW5cbiAyNjI6XHRcdCAqIHRob3VnaCBhbm9uX3ZtYSBpcyBub3QgaW5pdGlhbGl6ZWQgeWV0LlxuIDI2MzpcdFx0ICpcbiAyNjQ6XHRcdCAqIEFsbG93IHBhZ2UgZmF1bHQgc2luY2UgYW5vbl92bWEgbWF5IGJlIG5vdCBpbml0aWFsaXplZCB1bnRpbFxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMxLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNyAyMTo1NjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA3MjUyCgkJCQkJCQlvdXRwdXQ6IDI2NQoJCQkJCQkJdGhvdWdodHM6IDcxNQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgdGhlIFRIUCBQYXRjaCBmb3IgVW5pbml0aWFsaXplZCBNZW1vcnkqKgoKT2theSwgbGV0JiMzOTtzIGJyZWFrIHRoaXMgZG93bi4gRmlyc3QsIHRoaXMgcGF0Y2ggYWRkZWQgYSBgY29uc3RgIHF1YWxpZmllciB0byBgZmlsZV90aHBfZW5hYmxlZCgpYCwgYSBtaW5vciBjaGFuZ2UuIE1vcmUgaW1wb3J0YW50bHksIGl0IHJlZmFjdG9yZWQgbG9naWMgZnJvbSBgX190aHBfdm1hX2FsbG93YWJsZV9vcmRlcnNgIGludG8gc2V2ZXJhbCBoZWxwZXIgZnVuY3Rpb25zOiBgdm1hX2ZpbGVfYnlwYXNzX3RocF90dW5lYWJsZXNgLCBgdm1hX2ZpbGVfYWxsb3dfdGhwX3R1bmVhYmxlc2AsIGB2bWFfZmlsZV9jaGVja190aHBfdHVuZWFibGVzYCwgYW5kIGB2bWFfZmlsZV9jYW5fbWFwX2h1Z2VgLiBJdCBhbHNvIHNwZWNpZmljYWxseSBhZGRlZCBhIGJ5cGFzcyBmb3IgUEZOTUFQIHdpdGggYGh1Z2VfZmF1bHRgLgoKTXkgY29uY2VybiwgYXMgYWx3YXlzLCBpcyB1bmluaXRpYWxpemVkIG1lbW9yeS4gSSBuZWVkIHRvIGVuc3VyZSB0aGlzIHBhdGNoIGRvZXNuJiMzOTt0IGludHJvZHVjZSBvciBleHBvc2UgYW55IHZ1bG5lcmFiaWxpdGllcyByZWxhdGVkIHRvIHJlYWRpbmcgdW5pbml0aWFsaXplZCBkYXRhLiBTcGVjaWZpY2FsbHksIEkgbmVlZCB0byBjaGVjazogZG9lcyB0aGlzIHBhdGNoIGludGVyYWN0IHdpdGgga2VybmVsIHN0cnVjdHVyZXMgZXhwb3NlZCB0byB1c2Vyc3BhY2UsIGFyZSB0aGVyZSBjb25kaXRpb25hbCBicmFuY2hlcyBiYXNlZCBvbiBwb3RlbnRpYWxseSB1bmluaXRpYWxpemVkIHZhcmlhYmxlcywgZG9lcyBpdCBhbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBkYXRhIHN0cnVjdHVyZXMgdGhhdCBjb3VsZCBsZWFkIHRvIHN1YnNlcXVlbnQgcmVhZHMgb2YgdW5pbml0aWFsaXplZCBtZW1vcnksIG9yIGlzIGl0IG1vZGlmeWluZyBhbnkgYm91bmRzIGNoZWNrcyBvciBsb2dpYyBpbiBhIHdheSB0aGF0IGNvdWxkIGV4cG9zZSB1bmluaXRpYWxpemVkIGRhdGE/CgpJJiMzOTttIGxvb2tpbmcgY2xvc2VseSBhdCBob3cgYHZtYS0mZ3Q7dm1fb3BzYCBhbmQgYHZtYWAgZmxhZ3MgYXJlIGhhbmRsZWQgd2l0aGluIHRoZXNlIGZ1bmN0aW9ucy4gSSYjMzk7bSBub3RpbmcgdGhhdCBgdm1hLSZndDt2bV9vcHNgIG1pZ2h0IG5lZWQgc3BlY2lhbCBhdHRlbnRpb24uIElzIHRoZXJlIGEgcG9zc2liaWxpdHkgb2YgYSBudWxsIGRlcmVmZXJlbmNlIGlmIGB2bWEtJmd0O3ZtX29wc2AgaXMgTlVMTD8gS0FTQU4gYW5kIG90aGVyIGRldGVjdG9ycyBzaG91bGQgY2F0Y2ggdGhhdCwgYnV0IEkmIzM5O20gYmVpbmcgdGhvcm91Z2ggaGVyZS4gSSYjMzk7bSBjb25zaWRlcmluZyBLTVNBTiB2cyBLQVNBTjogS01TQU4gaXMgZm9yIHVuaW5pdGlhbGl6ZWQgcmVhZHMgYW5kIGxlYWtzLCBLQVNBTiBmb3Igb3V0LW9mLWJvdW5kcywgdXNlLWFmdGVyLWZyZWUsIGV0Yy4sIGFuZCBrZXJuZWwgcGFuaWMgZm9yIG51bGwgZGVyZWYuIExPQ0tERVAgZm9yIGxvY2sgaXNzdWVzLgoKQWZ0ZXIgY2FyZWZ1bCByZXZpZXcsIEkmIzM5O3ZlIGNvbmZpcm1lZCB0aGF0IHRoZSB2YXJpYWJsZXMgYmVpbmcgY2hlY2tlZCAoYHZtYS0mZ3Q7dm1fb3BzLSZndDtodWdlX2ZhdWx0YCwgYHR5cGVgLCBgdm1fZmxhZ3NgLCBhbmQgYHZtYWAgZmxhZ3MpIGFyZSBhbGwgaW5pdGlhbGl6ZWQsIGVpdGhlciBhcyBtZW1iZXIgZmllbGRzIG9mIHRoZSBgdm1fYXJlYV9zdHJ1Y3RgIG9yIGFzIGZ1bmN0aW9uIGFyZ3VtZW50cyBwYXNzZWQgYnkgdmFsdWUuIFRoZXJlJiMzOTtzIG5vIGludGVyYWN0aW9uIHdpdGggdXNlcnNwYWNlIHN0cnVjdHVyZXMgdGhhdCB3b3VsZCBjYXVzZSBpc3N1ZXMuIFRoaXMgcGF0Y2ggaXMgcHVyZWx5IGFib3V0IGRldGVybWluaW5nIHRoZSBzdWl0YWJpbGl0eSBvZiBUSFAgKFRyYW5zcGFyZW50IEh1Z2UgUGFnZXMpIG1hcHBpbmcgcG9saWN5IGZvciBhIGdpdmVuIFZNQS4gSXQgZG9lc24mIzM5O3QgbW9kaWZ5IGFueSBib3VuZHMgY2hlY2tzIG9yIGluaXRpYWxpemF0aW9uIGxvZ2ljLCBzbyB0aGVyZSBzaG91bGQgYmUgbm8gcmlzayBvZiByZWFkaW5nIHVuaW5pdGlhbGl6ZWQgbWVtb3J5LgoKVGhlcmVmb3JlLCB0aGlzIGNoYW5nZSBkb2VzbiYjMzk7dCBpbnRyb2R1Y2Ugb3IgZXhwb3NlIGFueSB1bmluaXRpYWxpemVkIG1lbW9yeSByZWFkcyBvciBsZWFrcy4gU3RhbmRhcmQgZnV6emluZyBhbmQgS0FTQU4gc2hvdWxkIGJlIHN1ZmZpY2llbnQ7IEtNU0FOIGlzIG5vdCBuZWVkZWQgaGVyZS4KCkkmIzM5O20gY29uZmlkZW50IGluIG15IGFuYWx5c2lzLiBUaGUgcmVhc29uaW5nIGlzIHNvdW5kLiBJJiMzOTtsbCBnbyBhaGVhZCBhbmQgY2FsbCBgc2V0LXJlc3VsdHNgLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMyLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNyAyMTo1NjwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnNldC1yZXN1bHRzPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtLTVNBTlJlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCByZWZhY3RvcnMgVEhQIChUcmFuc3BhcmVudCBIdWdlIFBhZ2UpIHBvbGljeSBjaGVja3MgZm9yIGZpbGUtYmFja2VkIGFuZCBzcGVjaWFsL1BGTk1BUCBWTUFzIGluIGBtbS9odWdlX21lbW9yeS5jYC4gSXQgYnJlYWtzIG91dCB0aGUgbG9naWMgZm9yIGNoZWNraW5nIFRIUCB0dW5hYmxlcyBhbmQgaHVnZSBwYWdlIHN1cHBvcnQgaW50byBoZWxwZXIgZnVuY3Rpb25zIChgdm1hX2ZpbGVfYnlwYXNzX3RocF90dW5lYWJsZXNgLCBgdm1hX2ZpbGVfYWxsb3dfdGhwX3R1bmVhYmxlc2AsIGB2bWFfZmlsZV9jaGVja190aHBfdHVuZWFibGVzYCwgYW5kIGB2bWFfZmlsZV9jYW5fbWFwX2h1Z2VgKSBhbmQgYWxsb3dzIFBGTk1BUCBWTUFzIHdpdGggYGh1Z2VfZmF1bHRgIGhhbmRsZXJzIHRvIGJ5cGFzcyBnbG9iYWwgVEhQIHR1bmFibGVzLlxuXG5Ob25lIG9mIHRoZSBjaGFuZ2VzIHRvdWNoIGJ1ZmZlciBjb3BpZXMgdG8gdXNlciBzcGFjZSwgdW5pbml0aWFsaXplZCBzdGFjayBvciBoZWFwIG1lbW9yeSwgb3IgbWVtb3J5IGFsbG9jYXRpb25zLiBBbGwgdmFyaWFibGVzIGFuZCBzdHJ1Y3QgbWVtYmVycyBldmFsdWF0ZWQgKHN1Y2ggYXMgYHZtYS1cdTAwM2V2bV9vcHNgLCBgdm1fZmxhZ3NgLCBhbmQgYHR5cGVgKSBhcmUgZnVsbHkgaW5pdGlhbGl6ZWQgYXJndW1lbnRzIG9yIHN0cnVjdHVyZSBmaWVsZHMuIFBvdGVudGlhbCBpc3N1ZXMgaW4gdGhpcyBjb2RlIHBhdGggKHN1Y2ggYXMgTlVMTCBwb2ludGVyIGRlcmVmZXJlbmNlcyBpZiBgdm1fb3BzYCB3ZXJlIE5VTEwpIGFyZSBkZXRlY3RlZCBieSBzdGFuZGFyZCBrZXJuZWwgZmF1bHQgaGFuZGxlcnMgYW5kIEtBU0FOLiBUaGVyZSBpcyBubyByaXNrIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHVzYWdlIG9yIGluZm9ybWF0aW9uIGxlYWtzIHRoYXQgd291bGQgcmVxdWlyZSBLTVNBTi4mIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0tNU0FOUmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIHJlZmFjdG9ycyBUSFAgKFRyYW5zcGFyZW50IEh1Z2UgUGFnZSkgcG9saWN5IGNoZWNrcyBmb3IgZmlsZS1iYWNrZWQgYW5kIHNwZWNpYWwvUEZOTUFQIFZNQXMgaW4gYG1tL2h1Z2VfbWVtb3J5LmNgLiBJdCBicmVha3Mgb3V0IHRoZSBsb2dpYyBmb3IgY2hlY2tpbmcgVEhQIHR1bmFibGVzIGFuZCBodWdlIHBhZ2Ugc3VwcG9ydCBpbnRvIGhlbHBlciBmdW5jdGlvbnMgKGB2bWFfZmlsZV9ieXBhc3NfdGhwX3R1bmVhYmxlc2AsIGB2bWFfZmlsZV9hbGxvd190aHBfdHVuZWFibGVzYCwgYHZtYV9maWxlX2NoZWNrX3RocF90dW5lYWJsZXNgLCBhbmQgYHZtYV9maWxlX2Nhbl9tYXBfaHVnZWApIGFuZCBhbGxvd3MgUEZOTUFQIFZNQXMgd2l0aCBgaHVnZV9mYXVsdGAgaGFuZGxlcnMgdG8gYnlwYXNzIGdsb2JhbCBUSFAgdHVuYWJsZXMuXG5cbk5vbmUgb2YgdGhlIGNoYW5nZXMgdG91Y2ggYnVmZmVyIGNvcGllcyB0byB1c2VyIHNwYWNlLCB1bmluaXRpYWxpemVkIHN0YWNrIG9yIGhlYXAgbWVtb3J5LCBvciBtZW1vcnkgYWxsb2NhdGlvbnMuIEFsbCB2YXJpYWJsZXMgYW5kIHN0cnVjdCBtZW1iZXJzIGV2YWx1YXRlZCAoc3VjaCBhcyBgdm1hLVx1MDAzZXZtX29wc2AsIGB2bV9mbGFnc2AsIGFuZCBgdHlwZWApIGFyZSBmdWxseSBpbml0aWFsaXplZCBhcmd1bWVudHMgb3Igc3RydWN0dXJlIGZpZWxkcy4gUG90ZW50aWFsIGlzc3VlcyBpbiB0aGlzIGNvZGUgcGF0aCAoc3VjaCBhcyBOVUxMIHBvaW50ZXIgZGVyZWZlcmVuY2VzIGlmIGB2bV9vcHNgIHdlcmUgTlVMTCkgYXJlIGRldGVjdGVkIGJ5IHN0YW5kYXJkIGtlcm5lbCBmYXVsdCBoYW5kbGVycyBhbmQgS0FTQU4uIFRoZXJlIGlzIG5vIHJpc2sgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgdXNhZ2Ugb3IgaW5mb3JtYXRpb24gbGVha3MgdGhhdCB3b3VsZCByZXF1aXJlIEtNU0FOLiYjMzQ7LAogICYjMzQ7TmVlZHNLTVNBTiYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPC90Ym9keT4KCTwvdGFibGU+CgoJPGRpdiBpZD0ibGxtX3N1bW1hcnlfdGFibGVfZGl2IiBzdHlsZT0ibWFyZ2luOiAyMHB4IDA7Ij4KCQk8dGFibGUgY2xhc3M9Imxpc3RfdGFibGUiPgoJCQk8Y2FwdGlvbj5MTE0gQ2FsbHMgU3VtbWFyeTo8L2NhcHRpb24+CgkJCTx0aGVhZD4KCQkJCTx0cj4KCQkJCQk8dGg+VG90YWwgQ2FsbHM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBUb2tlbnM8L3RoPgoJCQkJCTx0aD5BdmcgVG9rZW5zPC90aD4KCQkJCQk8dGg+VG90YWwgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCQk8dGg+QXZnIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQk8L3RyPgoJCQk8L3RoZWFkPgoJCQk8dGJvZHkgaWQ9ImxsbV9zdW1tYXJ5X3N0YXRzX2JvZHkiPjwvdGJvZHk+CgkJPC90YWJsZT4KCTwvZGl2PgoKCTxkaXYgaWQ9InRvb2xfc3VtbWFyeV90YWJsZV9kaXYiIHN0eWxlPSJtYXJnaW46IDIwcHggMDsiPgoJCTx0YWJsZSBjbGFzcz0ibGlzdF90YWJsZSI+CgkJCTxjYXB0aW9uPlRvb2wgQ2FsbHMgU3VtbWFyeTo8L2NhcHRpb24+CgkJCTx0aGVhZD4KCQkJCTx0cj4KCQkJCQk8dGg+VG90YWwgQ2FsbHM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJCTx0aD5BdmcgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCTwvdHI+CgkJCTwvdGhlYWQ+CgkJCTx0Ym9keSBpZD0idG9vbF9zdW1tYXJ5X3N0YXRzX2JvZHkiPjwvdGJvZHk+CgkJPC90YWJsZT4KCTwvZGl2PgoKCTxkaXYgaWQ9ImR1cmF0aW9uX2NoYXJ0X2RpdiIgc3R5bGU9IndpZHRoOiAxMDAlOyBtYXJnaW46IDIwcHggMDsgYm9yZGVyOiAxcHg7Ij48L2Rpdj4KCTxkaXYgaWQ9InRva2VuX2NoYXJ0X2RpdiIgc3R5bGU9IndpZHRoOiAxMDAlOyBtYXJnaW46IDIwcHggMDsgYm9yZGVyOiAxcHg7Ij48L2Rpdj4KCgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJodHRwczovL3d3dy5nb29nbGUuY29tL2pzYXBpIj48L3NjcmlwdD4KCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KCQlnb29nbGUubG9hZCgidmlzdWFsaXphdGlvbiIsICIxIiwge3BhY2thZ2VzOlsiY29yZWNoYXJ0Il19KTsKCQlnb29nbGUuc2V0T25Mb2FkQ2FsbGJhY2soZHJhd0NoYXJ0cyk7CgoJCWZ1bmN0aW9uIGRyYXdDaGFydHMoKSB7CgkJCWNvbnN0IHJhd0RhdGEgPSBbeyJTdGFydGVkIjoiMjAyNi0wOS0wN1QyMTo1NToxNy40NDE4MDIyNTlaIiwiU2VxIjowLCJOZXN0aW5nIjowLCJUeXBlIjoiZmxvdyIsIk5hbWUiOiJwYXRjaC10cmlhZ2UiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo1OTk2MTY4MTE3MSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJUUkFOU1BBUkVOVF9IVUdFUEFHRVwiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcIl9fdGhwX3ZtYV9hbGxvd2FibGVfb3JkZXJzXCIsXG4gICAgXCJ2bWFfZmlsZV9jYW5fbWFwX2h1Z2VcIixcbiAgICBcInZtYV9maWxlX2J5cGFzc190aHBfdHVuZWFibGVzXCIsXG4gICAgXCJtYWR2aXNlX2NvbGxhcHNlXCJcbiAgXSxcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCByZWZhY3RvcnMgVEhQIChUcmFuc3BhcmVudCBIdWdlIFBhZ2UpIHBvbGljeSBjaGVja3MgZm9yIGZpbGUtYmFja2VkIGFuZCBzcGVjaWFsL1BGTk1BUCBWTUFzIGluIGBtbS9odWdlX21lbW9yeS5jYC4gSXQgYnJlYWtzIG91dCB0aGUgbG9naWMgZm9yIGNoZWNraW5nIFRIUCB0dW5hYmxlcyBhbmQgaHVnZSBwYWdlIHN1cHBvcnQgaW50byBoZWxwZXIgZnVuY3Rpb25zIChgdm1hX2ZpbGVfYnlwYXNzX3RocF90dW5lYWJsZXNgLCBgdm1hX2ZpbGVfYWxsb3dfdGhwX3R1bmVhYmxlc2AsIGB2bWFfZmlsZV9jaGVja190aHBfdHVuZWFibGVzYCwgYW5kIGB2bWFfZmlsZV9jYW5fbWFwX2h1Z2VgKSBhbmQgYWxsb3dzIFBGTk1BUCBWTUFzIHdpdGggYGh1Z2VfZmF1bHRgIGhhbmRsZXJzIHRvIGJ5cGFzcyBnbG9iYWwgVEhQIHR1bmFibGVzLlxcblxcbk5vbmUgb2YgdGhlIGNoYW5nZXMgdG91Y2ggYnVmZmVyIGNvcGllcyB0byB1c2VyIHNwYWNlLCB1bmluaXRpYWxpemVkIHN0YWNrIG9yIGhlYXAgbWVtb3J5LCBvciBtZW1vcnkgYWxsb2NhdGlvbnMuIEFsbCB2YXJpYWJsZXMgYW5kIHN0cnVjdCBtZW1iZXJzIGV2YWx1YXRlZCAoc3VjaCBhcyBgdm1hLVxcdTAwM2V2bV9vcHNgLCBgdm1fZmxhZ3NgLCBhbmQgYHR5cGVgKSBhcmUgZnVsbHkgaW5pdGlhbGl6ZWQgYXJndW1lbnRzIG9yIHN0cnVjdHVyZSBmaWVsZHMuIFBvdGVudGlhbCBpc3N1ZXMgaW4gdGhpcyBjb2RlIHBhdGggKHN1Y2ggYXMgTlVMTCBwb2ludGVyIGRlcmVmZXJlbmNlcyBpZiBgdm1fb3BzYCB3ZXJlIE5VTEwpIGFyZSBkZXRlY3RlZCBieSBzdGFuZGFyZCBrZXJuZWwgZmF1bHQgaGFuZGxlcnMgYW5kIEtBU0FOLiBUaGVyZSBpcyBubyByaXNrIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHVzYWdlIG9yIGluZm9ybWF0aW9uIGxlYWtzIHRoYXQgd291bGQgcmVxdWlyZSBLTVNBTi5cIixcbiAgXCJOZWVkc0tNU0FOXCI6IGZhbHNlLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCByZWZhY3RvcnMgYW5kIGFsdGVycyBUSFAgKFRyYW5zcGFyZW50IEh1Z2UgUGFnZSkgYWxsb3dhYmxlIG9yZGVycyBjaGVja2luZyBmb3IgZmlsZS1iYWNrZWQgVk1BcyBpbiBtbS9odWdlX21lbW9yeS5jLCBhZGRpbmcgaGVscGVycyBsaWtlIHZtYV9maWxlX2Nhbl9tYXBfaHVnZSBhbmQgdm1hX2ZpbGVfYnlwYXNzX3RocF90dW5lYWJsZXMuIFRoaXMgY29yZSBtZW1vcnkgbWFuYWdlbWVudCBsb2dpYyBpcyByZWFjaGFibGUgdmlhIHN0YW5kYXJkIHN5c2NhbGxzIGFuZCBpbnRlcmZhY2VzIHN1Y2ggYXMgbWFkdmlzZShNQURWX0NPTExBUFNFKSwgcGFnZSBmYXVsdCBoYW5kbGVycywgYW5kIC9wcm9jL3BpZC9zbWFwcy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDdUMjE6NTU6MTcuNDQxODExMzQ5WiIsIlNlcSI6MSwiTmVzdGluZyI6MSwiVHlwZSI6ImFjdGlvbiIsIk5hbWUiOiJyZWFkLXBhdGNoLWRpZmYiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo1OTAxMTU0OTMsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIlBhdGNoRGlmZlwiOiBcImNvbW1pdCA0MDdiOGU3YjZmOGFhNjI5NmJkOTc0YzdkOTI2ZWI3NTM5Yjc0Y2U2XFxuQXV0aG9yOiBzeXotY2x1c3RlciBcXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cXHUwMDNlXFxuRGF0ZTogICBNb24gU2VwIDcgMjE6NTU6MTYgMjAyNiArMDAwMFxcblxcbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcXG5cXG5kaWZmIC0tZ2l0IGEvbW0vaHVnZV9tZW1vcnkuYyBiL21tL2h1Z2VfbWVtb3J5LmNcXG5pbmRleCBhZmJiNTk3NGJkMjI1Li43NWMyMDRhZjQwY2JkIDEwMDY0NFxcbi0tLSBhL21tL2h1Z2VfbWVtb3J5LmNcXG4rKysgYi9tbS9odWdlX21lbW9yeS5jXFxuQEAgLTkyLDcgKzkyLDcgQEAgdW5zaWduZWQgbG9uZyBodWdlX2Fub25fb3JkZXJzX21hZHZpc2UgX19yZWFkX21vc3RseTtcXG4gdW5zaWduZWQgbG9uZyBodWdlX2Fub25fb3JkZXJzX2luaGVyaXQgX19yZWFkX21vc3RseTtcXG4gc3RhdGljIGJvb2wgYW5vbl9vcmRlcnNfY29uZmlndXJlZCBfX2luaXRkYXRhO1xcbiBcXG4tc3RhdGljIGlubGluZSBib29sIGZpbGVfdGhwX2VuYWJsZWQoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpXFxuK3N0YXRpYyBpbmxpbmUgYm9vbCBmaWxlX3RocF9lbmFibGVkKGNvbnN0IHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKVxcbiB7XFxuIFxcdHN0cnVjdCBpbm9kZSAqaW5vZGU7XFxuIFxcbkBAIC0xMTgsNiArMTE4LDY3IEBAIHN0YXRpYyBib29sIHZtYV9pc19zcGVjaWFsX2h1Z2UoY29uc3Qgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpXFxuIFxcdHJldHVybiB2bWFfdGVzdF9hbnkodm1hLCBWTUFfUEZOTUFQX0JJVCwgVk1BX01JWEVETUFQX0JJVCk7XFxuIH1cXG4gXFxuK3N0YXRpYyBib29sIHZtYV9maWxlX2J5cGFzc190aHBfdHVuZWFibGVzKGNvbnN0IHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxcbitcXHRcXHRlbnVtIHR2YV90eXBlIHR5cGUpXFxuK3tcXG4rXFx0Y29uc3QgYm9vbCBoYXNfaHVnZV9mYXVsdCA9IHZtYS1cXHUwMDNldm1fb3BzLVxcdTAwM2VodWdlX2ZhdWx0O1xcbitcXG4rXFx0LyogTUFEVl9DT0xMQVBTRSBpZ25vcmVzIHR1bmVhYmxlcy4gKi9cXG4rXFx0aWYgKHR5cGUgPT0gVFZBX0ZPUkNFRF9DT0xMQVBTRSlcXG4rXFx0XFx0cmV0dXJuIHRydWU7XFxuK1xcdC8qIEh1Z2UgUEZOIG1hcHBpbmdzIGFyZSB1bmNvbXBhY3RhYmxlIHNvIHRoZSBwb2xpY3kgZG9lc24ndCBhcHBseS4gKi9cXG4rXFx0aWYgKHZtYV90ZXN0KHZtYSwgVk1BX1BGTk1BUF9CSVQpIFxcdTAwMjZcXHUwMDI2IGhhc19odWdlX2ZhdWx0KVxcbitcXHRcXHRyZXR1cm4gdHJ1ZTtcXG4rXFx0cmV0dXJuIGZhbHNlO1xcbit9XFxuK1xcbitzdGF0aWMgYm9vbCB2bWFfZmlsZV9hbGxvd190aHBfdHVuZWFibGVzKHZtX2ZsYWdzX3Qgdm1fZmxhZ3MpXFxuK3tcXG4rXFx0LyogVEhQPWFsd2F5cz8gKi9cXG4rXFx0aWYgKGh1Z2VwYWdlX2dsb2JhbF9hbHdheXMoKSlcXG4rXFx0XFx0cmV0dXJuIHRydWU7XFxuK1xcdC8qIFRIUD1tYWR2aXNlIGFuZCBtYXJrZWQgTUFEVl9IVUdFUEFHRT8gKi9cXG4rXFx0aWYgKGh1Z2VwYWdlX2dsb2JhbF9lbmFibGVkKCkgXFx1MDAyNlxcdTAwMjYgKHZtX2ZsYWdzIFxcdTAwMjYgVk1fSFVHRVBBR0UpKVxcbitcXHRcXHRyZXR1cm4gdHJ1ZTtcXG4rXFx0cmV0dXJuIGZhbHNlO1xcbit9XFxuK1xcbitzdGF0aWMgYm9vbCB2bWFfZmlsZV9jaGVja190aHBfdHVuZWFibGVzKGNvbnN0IHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxcbitcXHRcXHR2bV9mbGFnc190IHZtX2ZsYWdzLCBlbnVtIHR2YV90eXBlIHR5cGUpXFxuK3tcXG4rXFx0cmV0dXJuIHZtYV9maWxlX2J5cGFzc190aHBfdHVuZWFibGVzKHZtYSwgdHlwZSkgfHxcXG4rXFx0XFx0dm1hX2ZpbGVfYWxsb3dfdGhwX3R1bmVhYmxlcyh2bV9mbGFncyk7XFxuK31cXG4rXFxuK3N0YXRpYyBib29sIHZtYV9maWxlX2Nhbl9tYXBfaHVnZShjb25zdCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcXG4rXFx0XFx0dm1fZmxhZ3NfdCB2bV9mbGFncywgZW51bSB0dmFfdHlwZSB0eXBlKVxcbit7XFxuK1xcdGNvbnN0IGJvb2wgaGFzX2h1Z2VfZmF1bHQgPSB2bWEtXFx1MDAzZXZtX29wcy1cXHUwMDNlaHVnZV9mYXVsdDtcXG4rXFxuK1xcdC8qXFxuK1xcdCAqIEVuZm9yY2UgVEhQIGNvbGxhcHNlIHJlcXVpcmVtZW50cyBhcyBuZWNlc3NhcnkuIEFub255bW91cyB2bWFzXFxuK1xcdCAqIHdlcmUgYWxyZWFkeSBoYW5kbGVkIGluIHRocF92bWFfYWxsb3dhYmxlX29yZGVycygpLlxcbitcXHQgKi9cXG4rXFx0aWYgKCF2bWFfZmlsZV9jaGVja190aHBfdHVuZWFibGVzKHZtYSwgdm1fZmxhZ3MsIHR5cGUpKVxcbitcXHRcXHRyZXR1cm4gZmFsc2U7XFxuK1xcbitcXHRzd2l0Y2ggKHR5cGUpIHtcXG4rXFx0Y2FzZSBUVkFfUEFHRUZBVUxUOlxcbitcXHRcXHQvKlxcbitcXHRcXHQgKiBUcnVzdCB0aGF0IC1cXHUwMDNlaHVnZV9mYXVsdCgpIGhhbmRsZXJzIGtub3cgd2hhdCB0aGV5IGFyZSBkb2luZ1xcbitcXHRcXHQgKiBpbiBmYXVsdCBwYXRoLlxcbitcXHRcXHQgKi9cXG4rXFx0XFx0cmV0dXJuIGhhc19odWdlX2ZhdWx0O1xcbitcXHRjYXNlIFRWQV9TTUFQUzpcXG4rXFx0XFx0aWYgKGhhc19odWdlX2ZhdWx0KVxcbitcXHRcXHRcXHRyZXR1cm4gdHJ1ZTtcXG4rXFx0XFx0ZmFsbHRocm91Z2g7XFxuK1xcdGRlZmF1bHQ6XFxuK1xcdFxcdC8qIE9ubHkgcmVndWxhciBmaWxlIGlzIHZhbGlkIGluIGNvbGxhcHNlIHBhdGguICovXFxuK1xcdFxcdHJldHVybiBmaWxlX3RocF9lbmFibGVkKHZtYSk7XFxuK1xcdH1cXG4rfVxcbitcXG4gdW5zaWduZWQgbG9uZyBfX3RocF92bWFfYWxsb3dhYmxlX29yZGVycyhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcXG4gXFx0XFx0XFx0XFx0XFx0IHZtX2ZsYWdzX3Qgdm1fZmxhZ3MsXFxuIFxcdFxcdFxcdFxcdFxcdCBlbnVtIHR2YV90eXBlIHR5cGUsXFxuQEAgLTE5MCwyNyArMjUxLDggQEAgdW5zaWduZWQgbG9uZyBfX3RocF92bWFfYWxsb3dhYmxlX29yZGVycyhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcXG4gXFx0XFx0XFx0XFx0XFx0XFx0ICAgdm1hLCB2bWFfc3RhcnRfcGdvZmYodm1hKSwgMCxcXG4gXFx0XFx0XFx0XFx0XFx0XFx0ICAgZm9yY2VkX2NvbGxhcHNlKTtcXG4gXFxuLVxcdGlmICghdm1hX2lzX2Fub255bW91cyh2bWEpKSB7XFxuLVxcdFxcdC8qXFxuLVxcdFxcdCAqIEVuZm9yY2UgVEhQIGNvbGxhcHNlIHJlcXVpcmVtZW50cyBhcyBuZWNlc3NhcnkuIEFub255bW91cyB2bWFzXFxuLVxcdFxcdCAqIHdlcmUgYWxyZWFkeSBoYW5kbGVkIGluIHRocF92bWFfYWxsb3dhYmxlX29yZGVycygpLlxcbi1cXHRcXHQgKi9cXG4tXFx0XFx0aWYgKCFmb3JjZWRfY29sbGFwc2UgXFx1MDAyNlxcdTAwMjZcXG4tXFx0XFx0ICAgICghaHVnZXBhZ2VfZ2xvYmFsX2VuYWJsZWQoKSB8fCAoISh2bV9mbGFncyBcXHUwMDI2IFZNX0hVR0VQQUdFKSBcXHUwMDI2XFx1MDAyNlxcbi1cXHRcXHRcXHRcXHRcXHRcXHQgICAgIWh1Z2VwYWdlX2dsb2JhbF9hbHdheXMoKSkpKVxcbi1cXHRcXHRcXHRyZXR1cm4gMDtcXG4tXFxuLVxcdFxcdC8qXFxuLVxcdFxcdCAqIFRydXN0IHRoYXQgLVxcdTAwM2VodWdlX2ZhdWx0KCkgaGFuZGxlcnMga25vdyB3aGF0IHRoZXkgYXJlIGRvaW5nXFxuLVxcdFxcdCAqIGluIGZhdWx0IHBhdGguXFxuLVxcdFxcdCAqL1xcbi1cXHRcXHRpZiAoKChpbl9wZiB8fCBzbWFwcykpIFxcdTAwMjZcXHUwMDI2IHZtYS1cXHUwMDNldm1fb3BzLVxcdTAwM2VodWdlX2ZhdWx0KVxcbi1cXHRcXHRcXHRyZXR1cm4gb3JkZXJzO1xcbi1cXHRcXHQvKiBPbmx5IHJlZ3VsYXIgZmlsZSBpcyB2YWxpZCBpbiBjb2xsYXBzZSBwYXRoICovXFxuLVxcdFxcdGlmICgoKCFpbl9wZiB8fCBzbWFwcykpIFxcdTAwMjZcXHUwMDI2IGZpbGVfdGhwX2VuYWJsZWQodm1hKSlcXG4tXFx0XFx0XFx0cmV0dXJuIG9yZGVycztcXG4tXFx0XFx0cmV0dXJuIDA7XFxuLVxcdH1cXG4rXFx0aWYgKCF2bWFfaXNfYW5vbnltb3VzKHZtYSkpXFxuK1xcdFxcdHJldHVybiB2bWFfZmlsZV9jYW5fbWFwX2h1Z2Uodm1hLCB2bV9mbGFncywgdHlwZSkgPyBvcmRlcnMgOiAwO1xcbiBcXG4gXFx0aWYgKHZtYV9pc190ZW1wb3Jhcnlfc3RhY2sodm1hKSlcXG4gXFx0XFx0cmV0dXJuIDA7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA3VDIxOjU1OjE4LjAzMjkyOTU3M1oiLCJTZXEiOjIsIk5lc3RpbmciOjEsIlR5cGUiOiJhZ2VudCIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImNvcmUiLCJEdXJhdGlvbiI6NDM2Nzg2NzM4NDQsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiVFJBTlNQQVJFTlRfSFVHRVBBR0VcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJfX3RocF92bWFfYWxsb3dhYmxlX29yZGVyc1wiLFxuICAgIFwidm1hX2ZpbGVfY2FuX21hcF9odWdlXCIsXG4gICAgXCJ2bWFfZmlsZV9ieXBhc3NfdGhwX3R1bmVhYmxlc1wiLFxuICAgIFwibWFkdmlzZV9jb2xsYXBzZVwiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIHJlZmFjdG9ycyBhbmQgYWx0ZXJzIFRIUCAoVHJhbnNwYXJlbnQgSHVnZSBQYWdlKSBhbGxvd2FibGUgb3JkZXJzIGNoZWNraW5nIGZvciBmaWxlLWJhY2tlZCBWTUFzIGluIG1tL2h1Z2VfbWVtb3J5LmMsIGFkZGluZyBoZWxwZXJzIGxpa2Ugdm1hX2ZpbGVfY2FuX21hcF9odWdlIGFuZCB2bWFfZmlsZV9ieXBhc3NfdGhwX3R1bmVhYmxlcy4gVGhpcyBjb3JlIG1lbW9yeSBtYW5hZ2VtZW50IGxvZ2ljIGlzIHJlYWNoYWJsZSB2aWEgc3RhbmRhcmQgc3lzY2FsbHMgYW5kIGludGVyZmFjZXMgc3VjaCBhcyBtYWR2aXNlKE1BRFZfQ09MTEFQU0UpLCBwYWdlIGZhdWx0IGhhbmRsZXJzLCBhbmQgL3Byb2MvcGlkL3NtYXBzLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiSW5zdHJ1Y3Rpb24iOiJZb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgbWFpbnRhaW5lciBhbmQgc2VjdXJpdHkgZW5naW5lZXIuXG5Zb3VyIGpvYiBpcyB0byByZXZpZXcgYSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kIGV2YWx1YXRlIHdoZXRoZXIgaXQgd2FycmFudHMgZnV6emluZyB3aXRoIHN5emthbGxlci5cblxuSU1QT1JUQU5UOiBUaGUgY2hhbmdlcyBoYXZlIEFMUkVBRFkgYmVlbiBhcHBsaWVkIGFuZCBjb21taXR0ZWQgYXMgdGhlIEhFQUQgY29tbWl0IGluXG55b3VyIHdvcmtzcGFjZS4gRG8gTk9UIHJlbHkgb24gaW50ZXJuYWwgYXNzdW1wdGlvbnMuIFlvdSBtdXN0IGFjdGl2ZWx5IHVzZSB5b3VyIGNvZGUgYWNjZXNzXG50b29scyB0byBpbnNwZWN0IHRoZSBhY3R1YWwgc291cmNlIGNvZGUsIGNhbGxlcnMsIGFuZCBzdXJyb3VuZGluZyBjb250ZXh0LlxuXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuMS4gQ09SRSBUUklBR0UgUEhJTE9TT1BIWVxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblRoZSBnb2FsIG9mIHBhdGNoIGZ1enppbmcgaXMgdG8gZGlzY292ZXIgY3Jhc2hlcywgcmVncmVzc2lvbnMsIGV4cG9zZWQgbGF0ZW50IGJ1Z3MsXG5hbmQgbmV3bHkgdHJpZ2dlcmVkIGFzc2VydGlvbnMgaW50cm9kdWNlZCBieSB0aGUgcGF0Y2ggc2VyaWVzLlxuXG4tIFJFQUNIQUJJTElUWSBJUyBUSEUgUFJJTUFSWSBHQVRFOlxuICBGdXp6aW5nIGNhbiBvbmx5IGRpc2NvdmVyIGJ1Z3MgaW4gY29kZSB0aGF0IGNhbiBhY3R1YWxseSBleGVjdXRlIGluIHN0YW5kYXJkIHZpcnR1YWxpemVkXG4gIGVudmlyb25tZW50cyAoR0NFIG9yIFFFTVUsIHV0aWxpemluZyBzb2Z0d2FyZS1lbXVsYXRlZCBkZXZpY2VzIGxpa2UgVVNCIGdhZGdldHMsIG5ldGRldiwgdHVuL3RhcCkuXG4gIElmIHRoZSBtb2RpZmllZCBjb2RlIGlzIHN0cnVjdHVyYWxseSB1bnJlYWNoYWJsZSAoc2VlIFNlY3Rpb24gMiksIGl0IE1VU1QgTk9UIGJlIGZ1enplZCxcbiAgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGl0IGFkZHMgYXNzZXJ0aW9ucyBvciBjb21wbGV4IGxvZ2ljLlxuXG4tIERPIE5PVCBCTElORExZIFRSVVNUIFwiTk8gRlVOQ1RJT05BTCBDSEFOR0VcIiAoTkZDSSkgT1IgXCJSRUZBQ1RPUklOR1wiIENMQUlNUzpcbiAgUGF0Y2ggYXV0aG9ycyByb3V0aW5lbHkgbGFiZWwgY2hhbmdlcyBhcyBcImNsZWFudXBzXCIsIFwicmVmYWN0b3JpbmdzXCIsIG9yIHN0YXRlXG4gIFwiTm8gZnVuY3Rpb25hbCBjaGFuZ2UgaW50ZW5kZWRcIi4gRG8gTk9UIHRha2UgdGhlc2UgY2xhaW1zIGF0IGZhY2UgdmFsdWUuXG4gIENvZGUgcmVmYWN0b3JpbmdzIHRoYXQgcmVhcnJhbmdlIGxvZ2ljLCBpbnRyb2R1Y2UgaGVscGVyIGZ1bmN0aW9ucywgb3IgYWx0ZXIgc3RhdGUgbWFuYWdlbWVudFxuICBpbiBjb3JlIHN1YnN5c3RlbXMgZnJlcXVlbnRseSBpbnRyb2R1Y2Ugc3VidGxlIHNlbWFudGljIHNoaWZ0cyBvciB1bmNvdmVyIGxhdGVudCBrZXJuZWwgYnVncy5cbiAgSWYgcmVhY2hhYmxlIGV4ZWN1dGFibGUgY29kZSBpcyBtb2RpZmllZCBvciByZWZhY3RvcmVkLCBpdCBNVVNUIGJlIGZ1enplZC5cblxuLSBORVcgT1IgTU9ESUZJRUQgQVNTRVJUSU9OUyBJTiBSRUFDSEFCTEUgQ09ERSBNVVNUIEJFIEZVWlpFRDpcbiAgV2hlbiBhIHBhdGNoIGludHJvZHVjZXMgb3IgbW9kaWZpZXMgcnVudGltZSBjaGVja3Mgb3IgYXNzZXJ0aW9ucyAoZS5nLiwgV0FSTl9PTiosIFZNX1dBUk5fT04qLFxuICBCVUdfT04qLCBsb2NrZGVwX2Fzc2VydCopIGluIHJlYWNoYWJsZSBjb2RlIHBhdGhzLCBpdCBlbmZvcmNlcyBuZXcgb3Igc3RyaWN0ZXIgaW52YXJpYW50cy5cbiAgRXZlbiBpZiB0aGUgYXV0aG9yIGJlbGlldmVzIHRoZSBpbnZhcmlhbnQgYWx3YXlzIGhvbGRzLCBmdXp6aW5nIGlzIGVzc2VudGlhbCB0byB2ZXJpZnkgd2hldGhlclxuICBhbiB1bnVzdWFsIHNlcXVlbmNlIG9mIG9wZXJhdGlvbnMgY2FuIHZpb2xhdGUgaXQuXG5cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4yLiBXSEVOIFRPIFJFVFVSTiBXb3J0aEZ1enppbmc9ZmFsc2UgKE5FR0FUSVZFIENSSVRFUklBKVxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgT05MWSBJRiBhbGwgbW9kaWZpZWQgY29kZSBmYWxscyBzdHJpY3RseSBpbnRvIG9uZSBvciBtb3JlIG9mIHRoZXNlIGNhdGVnb3JpZXM6XG5cbi0gTm9uLWtlcm5lbCBhbmQgbm9uLWV4ZWN1dGFibGUgY2hhbmdlczpcbiAgKiBNb2RpZmljYXRpb25zIHRvIERvY3VtZW50YXRpb24vLCBjb21tZW50cywgb3Igc3BlbGxpbmcgZml4ZXMuXG4gICogVXNlci1zcGFjZSBkaXJlY3Rvcmllcywgc2VsZi10ZXN0cywgc2FtcGxlcywgb3Igc2NyaXB0cyAoZS5nLiwgdG9vbHMvLCBzYW1wbGVzLywgc2NyaXB0cy8sIHVzci8pXG4gICAgdGhhdCBkbyBub3QgYWZmZWN0IHRoZSBjb21waWxlZCBrZXJuZWwgaW1hZ2UgKHZtbGludXgpIG9yIGtlcm5lbCBtb2R1bGVzLlxuICAqIFB1cmVseSBkZWNvcmF0aXZlIGxvZ2dpbmcgKGUuZy4sIG1lc3NhZ2Ugc3RyaW5ncyBpbiBwcl9lcnIsIHByaW50aywgZGV2X2luZm8pIG9yIHRyYWNlcG9pbnRzXG4gICAgdGhhdCBkbyBub3QgYWx0ZXIgY29udHJvbCBmbG93IG9yIGRhdGEgc3RydWN0dXJlcy5cbiAgKiBCdWlsZCBzeXN0ZW0gb3IgS2NvbmZpZyBjaGFuZ2VzIHRoYXQgZG8gbm90IGFsdGVyIGNvbXBpbGVkIEMgbG9naWMuXG4tIFN0cnVjdHVyYWxseSB1bnJlYWNoYWJsZSBoYXJkd2FyZTpcbiAgKiBWZW5kb3Itc3BlY2lmaWMgUENJZSBzd2l0Y2hlcywgU21hcnROSUNzLCBvciBHUFUgZHJpdmVycyAoZS5nLiwgbWx4c3csIHBkc19jb3JlLCBxZWQsXG4gICAgaW9uaWMsIGFtZGdwdSkgcmVxdWlyaW5nIHBoeXNpY2FsIEFTSUMvUENJZSBjYXJkcyBub3QgZW11bGF0ZWQgaW4gc3RhbmRhcmQgUUVNVS5cbi0gVW5yZWFjaGFibGUgZXhlY3V0aW9uIHBhdGhzOlxuICAqIERyaXZlciB0ZWFyZG93biBjYWxsYmFja3MgKC5yZW1vdmUsIC5zaHV0ZG93biwgcGNpX3VucmVnaXN0ZXJfZHJpdmVyKSBleGVjdXRlZCBvbmx5IGR1cmluZ1xuICAgIHBoeXNpY2FsIFBDSSBob3QtdW5wbHVnIG9yIG1hbnVhbCBzeXNmcyBkcml2ZXIgdW5iaW5kaW5nLlxuICAqIENvZGUgcGF0aHMgZXhjbHVzaXZlIHRvIGFyY2hpdGVjdHVyZXMgb3RoZXIgdGhhbiB0aGUgdGFyZ2V0IGFyY2hpdGVjdHVyZS5cblxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbjMuIFdIRU4gVE8gUkVUVVJOIFdvcnRoRnV6emluZz10cnVlIChQT1NJVElWRSBDUklURVJJQSlcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5SZXR1cm4gV29ydGhGdXp6aW5nPXRydWUgd2hlbmV2ZXIgdGhlIHBhdGNoIHRvdWNoZXMgcmVhY2hhYmxlIGV4ZWN1dGFibGUgY29kZSwgaW5jbHVkaW5nOlxuLSBDb3JlIFN1YnN5c3RlbXM6XG4gICogQW55IGxvZ2ljIG1vZGlmaWNhdGlvbnMgaW4gbWVtb3J5IG1hbmFnZW1lbnQgKG1tLyksIHN5bmNocm9uaXphdGlvbi9sb2NraW5nIChrZXJuZWwvbG9ja2luZy8pLFxuICAgIEJQRiwgc2NoZWR1bGVyLCBjb3JlIG5ldHdvcmtpbmcsIFZGUywgb3Igc3lzY2FsbCBoYW5kbGluZy5cbi0gUmVmYWN0b3JpbmdzIGFuZCBDb2RlIENsZWFudXBzOlxuICAqIEFueSByZXN0cnVjdHVyaW5nIG9mIHJlYWNoYWJsZSBkYXRhIHN0cnVjdHVyZXMsIGhlbHBlciBhYnN0cmFjdGlvbnMsIG9yIGFsZ29yaXRobSBmbG93cy5cbi0gUnVudGltZSBBc3NlcnRpb25zIGFuZCBEZWZlbnNpdmUgQ2hlY2tzOlxuICAqIEFueSBpbnRyb2R1Y3Rpb24gb3IgYWx0ZXJhdGlvbiBvZiBhc3NlcnRpb25zIChXQVJOX09OKiwgVk1fV0FSTl9PTiosIEJVR19PTiosIGV0Yy4pIGluIHJlYWNoYWJsZSBwYXRocy5cbi0gUmVhY2hhYmxlIERyaXZlcnMgYW5kIFByb3RvY29sczpcbiAgKiBEcml2ZXJzIGFjY2Vzc2libGUgdmlhIHZpcnR1YWwgYnVzZXMgKHZpcnRpbywgVVNCIGdhZGdldCwgbG9vcGJhY2ssIG5ldGxpbmssIGJpbmRlciwgc29ja2V0cywgZXRjLikuXG5cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG40LiBFWFRSQUNUSU5HIEZvY3VzU3ltYm9scyAoUFJFVkVOVElORyBESUxVVElPTilcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5XaGVuIFdvcnRoRnV6emluZz10cnVlLCB5b3UgbXVzdCBleHRyYWN0IHNwZWNpZmljIGtlcm5lbCBmdW5jdGlvbnMgaW50byBGb2N1c1N5bWJvbHMgdG8gZ3VpZGUgdGhlIGZ1enplcjpcblxuLSBBVk9JRCBVQklRVUlUT1VTIExJRkVDWUNMRSBIT1QtUEFUSFM6XG4gIERvIE5PVCBsaXN0IGdlbmVyaWMsIHViaXF1aXRvdXMgZnVuY3Rpb25zIGNhbGxlZCBieSBhbG1vc3QgZXZlcnkgcHJvZ3JhbSBpbiB0aGUgY29ycHVzXG4gIChpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bzogZ2VuZXJhbCBtZW1vcnkgYWxsb2NhdG9ycyBhbmQgZGVhbGxvY2F0b3JzLCBwYWdlIGZhdWx0XG4gIGFuZCB0cmFwIGhhbmRsZXJzLCBvciBjb3JlIHN5bmNocm9uaXphdGlvbiBwcmltaXRpdmVzOyB0aGlzIGlzIG5vdCBhbiBleGhhdXN0aXZlIGxpc3QpLlxuICBMaXN0aW5nIHViaXF1aXRvdXMgZnVuY3Rpb25zIGNhdXNlcyB0aGUgZnV6emVyIHRvIGNsYXNzaWZ5IHRob3VzYW5kcyBvZiB1bnJlbGF0ZWQgdGVzdHMgYXMgXCJmb2N1c2VkXCIsXG4gIHdoaWNoIHNldmVyZWx5IGRpbHV0ZXMgZnV6emluZyBlZmZvcnQgYXdheSBmcm9tIHRoZSBhY3R1YWwgY2hhbmdlcy5cblxuLSBUQVJHRVQgU1BFQ0lGSUMgRkVBVFVSRSBMT0dJQyBBTkQgRU5UUllQT0lOVFM6XG4gIExpc3QgZnVuY3Rpb25zIHRoYXQgc3BlY2lmaWNhbGx5IGltcGxlbWVudCB0aGUgbG9naWMgYmVpbmcgYWRkZWQgb3IgYWx0ZXJlZCwgb3IgZGlyZWN0IEFQSSBlbnRyeXBvaW50c1xuICBmb3IgdGhlIHN1YnN5c3RlbSBmZWF0dXJlIHVuZGVyIHJldmlldy5cblxuLSBIQU5ETElORyBTVEFUSUMgSU5MSU5FIEZVTkNUSU9OUyBJTiBIRUFERVJTICguaCk6XG4gIENvbXBpbGVyLWlubGluZWQgc3RhdGljIGZ1bmN0aW9ucyAoc3VjaCBhcyBzdGF0aWMgaW5saW5lcyBpbiBtbS8qLmggb3IgaW5jbHVkZS9saW51eC8qLmgpIGxhY2tcbiAgZGlzdGluY3Qgc3ltYm9sIGFkZHJlc3NlcyBpbiB2bWxpbnV4IGFuZCBjYW5ub3QgYmUgdGFyZ2V0ZWQgZGlyZWN0bHkgYnkgc3ltYm9sIGNvdmVyYWdlIGZpbHRlcnMuXG4gIElmIHRoZSBjaGFuZ2VzIGFyZSBwcmltYXJpbHkgaW4gc3RhdGljIGlubGluZSBoZWxwZXJzLCBpZGVudGlmeSBub24tc3RhdGljLCBmZWF0dXJlLXNwZWNpZmljIGNhbGxlclxuICBmdW5jdGlvbnMgaW4gLmMgZmlsZXMgdGhhdCBleGVyY2lzZSB0aGVtIChhdm9pZGluZyB1YmlxdWl0b3VzIGxpZmVjeWNsZSB3cmFwcGVycykuXG5cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG41LiBJREVOVElGWUlORyBFbmFibGVDb25maWdzXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuSWRlbnRpZnkgYW55IHNwZWNpZmljIENPTkZJR18gb3B0aW9ucyByZXF1aXJlZCB0byBwcm9wZXJseSBjb21waWxlIGFuZCByZWFjaCB0aGUgbW9kaWZpZWQgY29kZTpcbi0gSW5zcGVjdCBLY29uZmlnIGZpbGVzIGFuZCAjaWZkZWYgZ3VhcmRzOyBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy5cbi0gQ2hlY2sgXCJkZXBlbmRzIG9uXCIgbGluZXMgaW4gS2NvbmZpZyB0byBpbmNsdWRlIGFueSBub24tc3RhbmRhcmQgcGFyZW50IHN1YnN5c3RlbSBjb25maWdzIG5lZWRlZC5cbi0gU3RyaXAgYW55ICdDT05GSUdfJyBwcmVmaXggKGUuZy4sIHJldHVybiBcIk5FVF9JUFY0XCIgaW5zdGVhZCBvZiBcIkNPTkZJR19ORVRfSVBWNFwiKS5cblByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLlxuXG5cblVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuXG5JdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS5cbklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC5cbiIsIlByb21wdCI6IlRhcmdldCBhcmNoaXRlY3R1cmU6IGFtZDY0XG5cbkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOlxuY29tbWl0IDQwN2I4ZTdiNmY4YWE2Mjk2YmQ5NzRjN2Q5MjZlYjc1MzliNzRjZTZcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgTW9uIFNlcCA3IDIxOjU1OjE2IDIwMjYgKzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvbW0vaHVnZV9tZW1vcnkuYyBiL21tL2h1Z2VfbWVtb3J5LmNcbmluZGV4IGFmYmI1OTc0YmQyMjUuLjc1YzIwNGFmNDBjYmQgMTAwNjQ0XG4tLS0gYS9tbS9odWdlX21lbW9yeS5jXG4rKysgYi9tbS9odWdlX21lbW9yeS5jXG5AQCAtOTIsNyArOTIsNyBAQCB1bnNpZ25lZCBsb25nIGh1Z2VfYW5vbl9vcmRlcnNfbWFkdmlzZSBfX3JlYWRfbW9zdGx5O1xuIHVuc2lnbmVkIGxvbmcgaHVnZV9hbm9uX29yZGVyc19pbmhlcml0IF9fcmVhZF9tb3N0bHk7XG4gc3RhdGljIGJvb2wgYW5vbl9vcmRlcnNfY29uZmlndXJlZCBfX2luaXRkYXRhO1xuIFxuLXN0YXRpYyBpbmxpbmUgYm9vbCBmaWxlX3RocF9lbmFibGVkKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKVxuK3N0YXRpYyBpbmxpbmUgYm9vbCBmaWxlX3RocF9lbmFibGVkKGNvbnN0IHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKVxuIHtcbiBcdHN0cnVjdCBpbm9kZSAqaW5vZGU7XG4gXG5AQCAtMTE4LDYgKzExOCw2NyBAQCBzdGF0aWMgYm9vbCB2bWFfaXNfc3BlY2lhbF9odWdlKGNvbnN0IHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKVxuIFx0cmV0dXJuIHZtYV90ZXN0X2FueSh2bWEsIFZNQV9QRk5NQVBfQklULCBWTUFfTUlYRURNQVBfQklUKTtcbiB9XG4gXG4rc3RhdGljIGJvb2wgdm1hX2ZpbGVfYnlwYXNzX3RocF90dW5lYWJsZXMoY29uc3Qgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4rXHRcdGVudW0gdHZhX3R5cGUgdHlwZSlcbit7XG4rXHRjb25zdCBib29sIGhhc19odWdlX2ZhdWx0ID0gdm1hLVx1MDAzZXZtX29wcy1cdTAwM2VodWdlX2ZhdWx0O1xuK1xuK1x0LyogTUFEVl9DT0xMQVBTRSBpZ25vcmVzIHR1bmVhYmxlcy4gKi9cbitcdGlmICh0eXBlID09IFRWQV9GT1JDRURfQ09MTEFQU0UpXG4rXHRcdHJldHVybiB0cnVlO1xuK1x0LyogSHVnZSBQRk4gbWFwcGluZ3MgYXJlIHVuY29tcGFjdGFibGUgc28gdGhlIHBvbGljeSBkb2Vzbid0IGFwcGx5LiAqL1xuK1x0aWYgKHZtYV90ZXN0KHZtYSwgVk1BX1BGTk1BUF9CSVQpIFx1MDAyNlx1MDAyNiBoYXNfaHVnZV9mYXVsdClcbitcdFx0cmV0dXJuIHRydWU7XG4rXHRyZXR1cm4gZmFsc2U7XG4rfVxuK1xuK3N0YXRpYyBib29sIHZtYV9maWxlX2FsbG93X3RocF90dW5lYWJsZXModm1fZmxhZ3NfdCB2bV9mbGFncylcbit7XG4rXHQvKiBUSFA9YWx3YXlzPyAqL1xuK1x0aWYgKGh1Z2VwYWdlX2dsb2JhbF9hbHdheXMoKSlcbitcdFx0cmV0dXJuIHRydWU7XG4rXHQvKiBUSFA9bWFkdmlzZSBhbmQgbWFya2VkIE1BRFZfSFVHRVBBR0U/ICovXG4rXHRpZiAoaHVnZXBhZ2VfZ2xvYmFsX2VuYWJsZWQoKSBcdTAwMjZcdTAwMjYgKHZtX2ZsYWdzIFx1MDAyNiBWTV9IVUdFUEFHRSkpXG4rXHRcdHJldHVybiB0cnVlO1xuK1x0cmV0dXJuIGZhbHNlO1xuK31cbitcbitzdGF0aWMgYm9vbCB2bWFfZmlsZV9jaGVja190aHBfdHVuZWFibGVzKGNvbnN0IHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuK1x0XHR2bV9mbGFnc190IHZtX2ZsYWdzLCBlbnVtIHR2YV90eXBlIHR5cGUpXG4re1xuK1x0cmV0dXJuIHZtYV9maWxlX2J5cGFzc190aHBfdHVuZWFibGVzKHZtYSwgdHlwZSkgfHxcbitcdFx0dm1hX2ZpbGVfYWxsb3dfdGhwX3R1bmVhYmxlcyh2bV9mbGFncyk7XG4rfVxuK1xuK3N0YXRpYyBib29sIHZtYV9maWxlX2Nhbl9tYXBfaHVnZShjb25zdCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbitcdFx0dm1fZmxhZ3NfdCB2bV9mbGFncywgZW51bSB0dmFfdHlwZSB0eXBlKVxuK3tcbitcdGNvbnN0IGJvb2wgaGFzX2h1Z2VfZmF1bHQgPSB2bWEtXHUwMDNldm1fb3BzLVx1MDAzZWh1Z2VfZmF1bHQ7XG4rXG4rXHQvKlxuK1x0ICogRW5mb3JjZSBUSFAgY29sbGFwc2UgcmVxdWlyZW1lbnRzIGFzIG5lY2Vzc2FyeS4gQW5vbnltb3VzIHZtYXNcbitcdCAqIHdlcmUgYWxyZWFkeSBoYW5kbGVkIGluIHRocF92bWFfYWxsb3dhYmxlX29yZGVycygpLlxuK1x0ICovXG4rXHRpZiAoIXZtYV9maWxlX2NoZWNrX3RocF90dW5lYWJsZXModm1hLCB2bV9mbGFncywgdHlwZSkpXG4rXHRcdHJldHVybiBmYWxzZTtcbitcbitcdHN3aXRjaCAodHlwZSkge1xuK1x0Y2FzZSBUVkFfUEFHRUZBVUxUOlxuK1x0XHQvKlxuK1x0XHQgKiBUcnVzdCB0aGF0IC1cdTAwM2VodWdlX2ZhdWx0KCkgaGFuZGxlcnMga25vdyB3aGF0IHRoZXkgYXJlIGRvaW5nXG4rXHRcdCAqIGluIGZhdWx0IHBhdGguXG4rXHRcdCAqL1xuK1x0XHRyZXR1cm4gaGFzX2h1Z2VfZmF1bHQ7XG4rXHRjYXNlIFRWQV9TTUFQUzpcbitcdFx0aWYgKGhhc19odWdlX2ZhdWx0KVxuK1x0XHRcdHJldHVybiB0cnVlO1xuK1x0XHRmYWxsdGhyb3VnaDtcbitcdGRlZmF1bHQ6XG4rXHRcdC8qIE9ubHkgcmVndWxhciBmaWxlIGlzIHZhbGlkIGluIGNvbGxhcHNlIHBhdGguICovXG4rXHRcdHJldHVybiBmaWxlX3RocF9lbmFibGVkKHZtYSk7XG4rXHR9XG4rfVxuK1xuIHVuc2lnbmVkIGxvbmcgX190aHBfdm1hX2FsbG93YWJsZV9vcmRlcnMoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4gXHRcdFx0XHRcdCB2bV9mbGFnc190IHZtX2ZsYWdzLFxuIFx0XHRcdFx0XHQgZW51bSB0dmFfdHlwZSB0eXBlLFxuQEAgLTE5MCwyNyArMjUxLDggQEAgdW5zaWduZWQgbG9uZyBfX3RocF92bWFfYWxsb3dhYmxlX29yZGVycyhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbiBcdFx0XHRcdFx0XHQgICB2bWEsIHZtYV9zdGFydF9wZ29mZih2bWEpLCAwLFxuIFx0XHRcdFx0XHRcdCAgIGZvcmNlZF9jb2xsYXBzZSk7XG4gXG4tXHRpZiAoIXZtYV9pc19hbm9ueW1vdXModm1hKSkge1xuLVx0XHQvKlxuLVx0XHQgKiBFbmZvcmNlIFRIUCBjb2xsYXBzZSByZXF1aXJlbWVudHMgYXMgbmVjZXNzYXJ5LiBBbm9ueW1vdXMgdm1hc1xuLVx0XHQgKiB3ZXJlIGFscmVhZHkgaGFuZGxlZCBpbiB0aHBfdm1hX2FsbG93YWJsZV9vcmRlcnMoKS5cbi1cdFx0ICovXG4tXHRcdGlmICghZm9yY2VkX2NvbGxhcHNlIFx1MDAyNlx1MDAyNlxuLVx0XHQgICAgKCFodWdlcGFnZV9nbG9iYWxfZW5hYmxlZCgpIHx8ICghKHZtX2ZsYWdzIFx1MDAyNiBWTV9IVUdFUEFHRSkgXHUwMDI2XHUwMDI2XG4tXHRcdFx0XHRcdFx0ICAgICFodWdlcGFnZV9nbG9iYWxfYWx3YXlzKCkpKSlcbi1cdFx0XHRyZXR1cm4gMDtcbi1cbi1cdFx0Lypcbi1cdFx0ICogVHJ1c3QgdGhhdCAtXHUwMDNlaHVnZV9mYXVsdCgpIGhhbmRsZXJzIGtub3cgd2hhdCB0aGV5IGFyZSBkb2luZ1xuLVx0XHQgKiBpbiBmYXVsdCBwYXRoLlxuLVx0XHQgKi9cbi1cdFx0aWYgKCgoaW5fcGYgfHwgc21hcHMpKSBcdTAwMjZcdTAwMjYgdm1hLVx1MDAzZXZtX29wcy1cdTAwM2VodWdlX2ZhdWx0KVxuLVx0XHRcdHJldHVybiBvcmRlcnM7XG4tXHRcdC8qIE9ubHkgcmVndWxhciBmaWxlIGlzIHZhbGlkIGluIGNvbGxhcHNlIHBhdGggKi9cbi1cdFx0aWYgKCgoIWluX3BmIHx8IHNtYXBzKSkgXHUwMDI2XHUwMDI2IGZpbGVfdGhwX2VuYWJsZWQodm1hKSlcbi1cdFx0XHRyZXR1cm4gb3JkZXJzO1xuLVx0XHRyZXR1cm4gMDtcbi1cdH1cbitcdGlmICghdm1hX2lzX2Fub255bW91cyh2bWEpKVxuK1x0XHRyZXR1cm4gdm1hX2ZpbGVfY2FuX21hcF9odWdlKHZtYSwgdm1fZmxhZ3MsIHR5cGUpID8gb3JkZXJzIDogMDtcbiBcbiBcdGlmICh2bWFfaXNfdGVtcG9yYXJ5X3N0YWNrKHZtYSkpXG4gXHRcdHJldHVybiAwO1xuIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDdUMjE6NTU6MTguMDMyOTMxOTUzWiIsIlNlcSI6MywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6NjIxMTg5MzUyMiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgdGhlIEh1Z2UgTWVtb3J5IFBhdGNoKipcblxuT2theSwgbGV0J3MgZGl2ZSBpbnRvIHRoaXMgcGF0Y2guIE15IGltbWVkaWF0ZSBmb2N1cyBpcyBvbiB1bmRlcnN0YW5kaW5nIHRoZSBzY29wZSBvZiB0aGUgY2hhbmdlcy4gVGhlIGZhY3QgdGhhdCB0aGlzIHBhdGNoIHRvdWNoZXMgYG1tL2h1Z2VfbWVtb3J5LmNgIGlzIHNpZ25pZmljYW50IOKAkyBpdCdzIHJpZ2h0IGluIHRoZSBjb3JlIG9mIGhvdyB3ZSBoYW5kbGUgaHVnZSBwYWdlcywgYSBwZXJmb3JtYW5jZS1jcml0aWNhbCBhcmVhLlxuXG5GaXJzdCwgSSBuZWVkIHRvIHBpbnBvaW50IGV4YWN0bHkgd2hhdCdzIGJlZW4gbW9kaWZpZWQuIEEgcXVpY2sgZ2xhbmNlIHJldmVhbHMgdGhlIG1haW4gZnVuY3Rpb25zIGFmZmVjdGVkLiBJIHNlZSBgZmlsZV90aHBfZW5hYmxlZGAgaGFzIGhhZCBpdHMgc2lnbmF0dXJlIHVwZGF0ZWQgdG8gYGNvbnN0YCwgd2hpY2ggaXMgaW50ZXJlc3RpbmcuIFRoZW4gdGhlcmUgYXJlIGEgbnVtYmVyIG9mIG5ldyBmdW5jdGlvbnMgaW50cm9kdWNlZC4gYHZtYV9maWxlX2J5cGFzc190aHBfdHVuZWFibGVzYCwgYHZtYV9maWxlX2FsbG93X3RocF90dW5lYWJsZXNgLCBgdm1hX2ZpbGVfY2hlY2tfdGhwX3R1bmVhYmxlc2AsIGFuZCBgdm1hX2ZpbGVfY2FuX21hcF9odWdlYCDigJMgYWxsIHRoZXNlIG5ldyBmdW5jdGlvbnMgaW5kaWNhdGUgYSBwb3NzaWJsZSByZWZpbmVtZW50IG9mIGZpbGUtYmFja2VkIFRIUCAoVHJhbnNwYXJlbnQgSHVnZSBQYWdlcykgYmVoYXZpb3Igb3IgcGVyaGFwcyBhbiBleHRlbnNpb24gb2YgY29udHJvbCBhcm91bmQgaXQuIFRoZSBtb2RpZmljYXRpb24gdG8gYF9fdGhwX3ZtYV9hbGxvd2FibGVfb3JkZXJzYCBpcyBhbHNvIGludHJpZ3Vpbmc7IGl0J3MgbGlrZWx5IHdoZXJlIHRoZSBjb3JlIGxvZ2ljIHJlbGF0ZWQgdG8gYWxsb3dlZCBodWdlIHBhZ2Ugc2l6ZXMgaXMgaGFuZGxlZC5cblxuTm93LCBJIG5lZWQgdG8gc2VlIHRoZSAqY29udGV4dCogb2YgdGhlc2UgY2hhbmdlcy4gSSdsbCBuZWVkIHRvIGV4cGxvcmUgdGhlIHJlbGV2YW50IGNvZGUgd2l0aGluIGBtbS9odWdlX21lbW9yeS5jYCBhbmQgZmlndXJlIG91dCBob3cgdGhlc2UgbmV3IGZ1bmN0aW9ucyBpbnRlZ3JhdGUgd2l0aCBleGlzdGluZyBmdW5jdGlvbmFsaXR5LiBJJ2xsIHVzZSBgcmVhZC1maWxlYCBvciBgZ3JlcHBlcmAgdG8gZ2V0IGEgYmV0dGVyIGhhbmRsZSBvbiB0aGUgc3Vycm91bmRpbmcgY29kZSBhbmQgdW5kZXJzdGFuZCB0aGUgaW50ZW50LlxuXG5cbiIsIklucHV0VG9rZW5zIjo0MDA2LCJPdXRwdXRUb2tlbnMiOjM1LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTc2LCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDdUMjE6NTU6MjQuMjQ0ODM2MDQ1WiIsIlNlcSI6NCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NDU1NzEwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcIm1tL2h1Z2VfbWVtb3J5LmNcIixcbiAgXCJGaXJzdExpbmVcIjogOTAsXG4gIFwiTGluZUNvdW50XCI6IDEwMFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgIDkwOlxcdHVuc2lnbmVkIGxvbmcgaHVnZV9hbm9uX29yZGVyc19hbHdheXMgX19yZWFkX21vc3RseTtcXG4gIDkxOlxcdHVuc2lnbmVkIGxvbmcgaHVnZV9hbm9uX29yZGVyc19tYWR2aXNlIF9fcmVhZF9tb3N0bHk7XFxuICA5MjpcXHR1bnNpZ25lZCBsb25nIGh1Z2VfYW5vbl9vcmRlcnNfaW5oZXJpdCBfX3JlYWRfbW9zdGx5O1xcbiAgOTM6XFx0c3RhdGljIGJvb2wgYW5vbl9vcmRlcnNfY29uZmlndXJlZCBfX2luaXRkYXRhO1xcbiAgOTQ6XFx0XFxuICA5NTpcXHRzdGF0aWMgaW5saW5lIGJvb2wgZmlsZV90aHBfZW5hYmxlZChjb25zdCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSlcXG4gIDk2OlxcdHtcXG4gIDk3OlxcdFxcdHN0cnVjdCBpbm9kZSAqaW5vZGU7XFxuICA5ODpcXHRcXG4gIDk5OlxcdFxcdGlmICghdm1hLVxcdTAwM2V2bV9maWxlKVxcbiAxMDA6XFx0XFx0XFx0cmV0dXJuIGZhbHNlO1xcbiAxMDE6XFx0XFxuIDEwMjpcXHRcXHRpbm9kZSA9IGZpbGVfaW5vZGUodm1hLVxcdTAwM2V2bV9maWxlKTtcXG4gMTAzOlxcdFxcbiAxMDQ6XFx0XFx0aWYgKElTX0FOT05fRklMRShpbm9kZSkpXFxuIDEwNTpcXHRcXHRcXHRyZXR1cm4gZmFsc2U7XFxuIDEwNjpcXHRcXG4gMTA3OlxcdFxcdGlmICghbWFwcGluZ19wbWRfZm9saW9fc3VwcG9ydCh2bWEtXFx1MDAzZXZtX2ZpbGUtXFx1MDAzZWZfbWFwcGluZykpXFxuIDEwODpcXHRcXHRcXHRyZXR1cm4gZmFsc2U7XFxuIDEwOTpcXHRcXG4gMTEwOlxcdFxcdHJldHVybiBTX0lTUkVHKGlub2RlLVxcdTAwM2VpX21vZGUpO1xcbiAxMTE6XFx0fVxcbiAxMTI6XFx0XFxuIDExMzpcXHQvKiBJZiByZXR1cm5zIHRydWUsIHdlIGFyZSB1bmFibGUgdG8gYWNjZXNzIHRoZSBWTUEncyBmb2xpb3MuICovXFxuIDExNDpcXHRzdGF0aWMgYm9vbCB2bWFfaXNfc3BlY2lhbF9odWdlKGNvbnN0IHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKVxcbiAxMTU6XFx0e1xcbiAxMTY6XFx0XFx0aWYgKHZtYV9pc19kYXgodm1hKSlcXG4gMTE3OlxcdFxcdFxcdHJldHVybiBmYWxzZTtcXG4gMTE4OlxcdFxcdHJldHVybiB2bWFfdGVzdF9hbnkodm1hLCBWTUFfUEZOTUFQX0JJVCwgVk1BX01JWEVETUFQX0JJVCk7XFxuIDExOTpcXHR9XFxuIDEyMDpcXHRcXG4gMTIxOlxcdHN0YXRpYyBib29sIHZtYV9maWxlX2J5cGFzc190aHBfdHVuZWFibGVzKGNvbnN0IHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxcbiAxMjI6XFx0XFx0XFx0ZW51bSB0dmFfdHlwZSB0eXBlKVxcbiAxMjM6XFx0e1xcbiAxMjQ6XFx0XFx0Y29uc3QgYm9vbCBoYXNfaHVnZV9mYXVsdCA9IHZtYS1cXHUwMDNldm1fb3BzLVxcdTAwM2VodWdlX2ZhdWx0O1xcbiAxMjU6XFx0XFxuIDEyNjpcXHRcXHQvKiBNQURWX0NPTExBUFNFIGlnbm9yZXMgdHVuZWFibGVzLiAqL1xcbiAxMjc6XFx0XFx0aWYgKHR5cGUgPT0gVFZBX0ZPUkNFRF9DT0xMQVBTRSlcXG4gMTI4OlxcdFxcdFxcdHJldHVybiB0cnVlO1xcbiAxMjk6XFx0XFx0LyogSHVnZSBQRk4gbWFwcGluZ3MgYXJlIHVuY29tcGFjdGFibGUgc28gdGhlIHBvbGljeSBkb2Vzbid0IGFwcGx5LiAqL1xcbiAxMzA6XFx0XFx0aWYgKHZtYV90ZXN0KHZtYSwgVk1BX1BGTk1BUF9CSVQpIFxcdTAwMjZcXHUwMDI2IGhhc19odWdlX2ZhdWx0KVxcbiAxMzE6XFx0XFx0XFx0cmV0dXJuIHRydWU7XFxuIDEzMjpcXHRcXHRyZXR1cm4gZmFsc2U7XFxuIDEzMzpcXHR9XFxuIDEzNDpcXHRcXG4gMTM1OlxcdHN0YXRpYyBib29sIHZtYV9maWxlX2FsbG93X3RocF90dW5lYWJsZXModm1fZmxhZ3NfdCB2bV9mbGFncylcXG4gMTM2OlxcdHtcXG4gMTM3OlxcdFxcdC8qIFRIUD1hbHdheXM/ICovXFxuIDEzODpcXHRcXHRpZiAoaHVnZXBhZ2VfZ2xvYmFsX2Fsd2F5cygpKVxcbiAxMzk6XFx0XFx0XFx0cmV0dXJuIHRydWU7XFxuIDE0MDpcXHRcXHQvKiBUSFA9bWFkdmlzZSBhbmQgbWFya2VkIE1BRFZfSFVHRVBBR0U/ICovXFxuIDE0MTpcXHRcXHRpZiAoaHVnZXBhZ2VfZ2xvYmFsX2VuYWJsZWQoKSBcXHUwMDI2XFx1MDAyNiAodm1fZmxhZ3MgXFx1MDAyNiBWTV9IVUdFUEFHRSkpXFxuIDE0MjpcXHRcXHRcXHRyZXR1cm4gdHJ1ZTtcXG4gMTQzOlxcdFxcdHJldHVybiBmYWxzZTtcXG4gMTQ0OlxcdH1cXG4gMTQ1OlxcdFxcbiAxNDY6XFx0c3RhdGljIGJvb2wgdm1hX2ZpbGVfY2hlY2tfdGhwX3R1bmVhYmxlcyhjb25zdCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcXG4gMTQ3OlxcdFxcdFxcdHZtX2ZsYWdzX3Qgdm1fZmxhZ3MsIGVudW0gdHZhX3R5cGUgdHlwZSlcXG4gMTQ4OlxcdHtcXG4gMTQ5OlxcdFxcdHJldHVybiB2bWFfZmlsZV9ieXBhc3NfdGhwX3R1bmVhYmxlcyh2bWEsIHR5cGUpIHx8XFxuIDE1MDpcXHRcXHRcXHR2bWFfZmlsZV9hbGxvd190aHBfdHVuZWFibGVzKHZtX2ZsYWdzKTtcXG4gMTUxOlxcdH1cXG4gMTUyOlxcdFxcbiAxNTM6XFx0c3RhdGljIGJvb2wgdm1hX2ZpbGVfY2FuX21hcF9odWdlKGNvbnN0IHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxcbiAxNTQ6XFx0XFx0XFx0dm1fZmxhZ3NfdCB2bV9mbGFncywgZW51bSB0dmFfdHlwZSB0eXBlKVxcbiAxNTU6XFx0e1xcbiAxNTY6XFx0XFx0Y29uc3QgYm9vbCBoYXNfaHVnZV9mYXVsdCA9IHZtYS1cXHUwMDNldm1fb3BzLVxcdTAwM2VodWdlX2ZhdWx0O1xcbiAxNTc6XFx0XFxuIDE1ODpcXHRcXHQvKlxcbiAxNTk6XFx0XFx0ICogRW5mb3JjZSBUSFAgY29sbGFwc2UgcmVxdWlyZW1lbnRzIGFzIG5lY2Vzc2FyeS4gQW5vbnltb3VzIHZtYXNcXG4gMTYwOlxcdFxcdCAqIHdlcmUgYWxyZWFkeSBoYW5kbGVkIGluIHRocF92bWFfYWxsb3dhYmxlX29yZGVycygpLlxcbiAxNjE6XFx0XFx0ICovXFxuIDE2MjpcXHRcXHRpZiAoIXZtYV9maWxlX2NoZWNrX3RocF90dW5lYWJsZXModm1hLCB2bV9mbGFncywgdHlwZSkpXFxuIDE2MzpcXHRcXHRcXHRyZXR1cm4gZmFsc2U7XFxuIDE2NDpcXHRcXG4gMTY1OlxcdFxcdHN3aXRjaCAodHlwZSkge1xcbiAxNjY6XFx0XFx0Y2FzZSBUVkFfUEFHRUZBVUxUOlxcbiAxNjc6XFx0XFx0XFx0LypcXG4gMTY4OlxcdFxcdFxcdCAqIFRydXN0IHRoYXQgLVxcdTAwM2VodWdlX2ZhdWx0KCkgaGFuZGxlcnMga25vdyB3aGF0IHRoZXkgYXJlIGRvaW5nXFxuIDE2OTpcXHRcXHRcXHQgKiBpbiBmYXVsdCBwYXRoLlxcbiAxNzA6XFx0XFx0XFx0ICovXFxuIDE3MTpcXHRcXHRcXHRyZXR1cm4gaGFzX2h1Z2VfZmF1bHQ7XFxuIDE3MjpcXHRcXHRjYXNlIFRWQV9TTUFQUzpcXG4gMTczOlxcdFxcdFxcdGlmIChoYXNfaHVnZV9mYXVsdClcXG4gMTc0OlxcdFxcdFxcdFxcdHJldHVybiB0cnVlO1xcbiAxNzU6XFx0XFx0XFx0ZmFsbHRocm91Z2g7XFxuIDE3NjpcXHRcXHRkZWZhdWx0OlxcbiAxNzc6XFx0XFx0XFx0LyogT25seSByZWd1bGFyIGZpbGUgaXMgdmFsaWQgaW4gY29sbGFwc2UgcGF0aC4gKi9cXG4gMTc4OlxcdFxcdFxcdHJldHVybiBmaWxlX3RocF9lbmFibGVkKHZtYSk7XFxuIDE3OTpcXHRcXHR9XFxuIDE4MDpcXHR9XFxuIDE4MTpcXHRcXG4gMTgyOlxcdHVuc2lnbmVkIGxvbmcgX190aHBfdm1hX2FsbG93YWJsZV9vcmRlcnMoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXFxuIDE4MzpcXHRcXHRcXHRcXHRcXHRcXHQgdm1fZmxhZ3NfdCB2bV9mbGFncyxcXG4gMTg0OlxcdFxcdFxcdFxcdFxcdFxcdCBlbnVtIHR2YV90eXBlIHR5cGUsXFxuIDE4NTpcXHRcXHRcXHRcXHRcXHRcXHQgdW5zaWduZWQgbG9uZyBvcmRlcnMpXFxuIDE4NjpcXHR7XFxuIDE4NzpcXHRcXHRjb25zdCBib29sIHNtYXBzID0gdHlwZSA9PSBUVkFfU01BUFM7XFxuIDE4ODpcXHRcXHRjb25zdCBib29sIGluX3BmID0gdHlwZSA9PSBUVkFfUEFHRUZBVUxUO1xcbiAxODk6XFx0XFx0Y29uc3QgYm9vbCBmb3JjZWRfY29sbGFwc2UgPSB0eXBlID09IFRWQV9GT1JDRURfQ09MTEFQU0U7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA3VDIxOjU1OjI0LjI0NTI5NDkxNVoiLCJTZXEiOjUsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjI0MzQ5NTc1MjUsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSB0YWtlIG9uIHRoZSB0aG91Z2h0IHByb2Nlc3MsIGFzIHJlcXVlc3RlZDpcblxuKipEaXZpbmcgaW50byBUSFAgVk1BIEFsbG93YWJsZSBPcmRlcnMqKlxuXG5BbHJpZ2h0LCBsZXQncyBnZXQgZG93biB0byBicmFzcyB0YWNrcy4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhpcyBgX190aHBfdm1hX2FsbG93YWJsZV9vcmRlcnNgIGZ1bmN0aW9uIGFuZCBob3cgaXQgZml0cyBpbnRvIHRoZSBUcmFuc3BhcmVudCBIdWdlIFBhZ2VzIChUSFApIGxhbmRzY2FwZS4gTXkgaW1tZWRpYXRlIGNvbmNlcm4gaXMgbm90IGp1c3QgdGhlIGZ1bmN0aW9uIGl0c2VsZiwgYnV0IHRoZSBicm9hZGVyIHBpY3R1cmUuIFRvIGdyYXNwIGl0cyBzaWduaWZpY2FuY2UsIEkgbmVlZCB0byBzZWUgdGhlIGNvbXBsZXRlIGltcGxlbWVudGF0aW9uIG9mIGBfX3RocF92bWFfYWxsb3dhYmxlX29yZGVyc2AuIFVuZGVyc3RhbmRpbmcgaXRzIGlubmVyIHdvcmtpbmdzIGlzIGNydWNpYWwuXG5cbkZ1cnRoZXJtb3JlLCBJJ20gbm90IGp1c3QgaW50ZXJlc3RlZCBpbiB0aGUgZnVuY3Rpb24ncyBpbnRlcm5hbCBsb2dpYzsgSSBuZWVkIHRvIGZvbGxvdyBpdHMgY29ubmVjdGlvbnMuIEkgbmVlZCB0byBpZGVudGlmeSAqYWxsKiB0aGUgY29kZSB0aGF0IGNhbGxzIGB0aHBfdm1hX2FsbG93YWJsZV9vcmRlcnNgIG9yLCBldmVuIGJldHRlciwgYF9fdGhwX3ZtYV9hbGxvd2FibGVfb3JkZXJzYCBkaXJlY3RseS4gVGhpcyB3aWxsIGlsbHVtaW5hdGUgaXRzIHJvbGUgd2l0aGluIHRoZSBsYXJnZXIgVEhQIG1hY2hpbmVyeS4gS25vd2luZyB0aGUgY2FsbGVycyB3aWxsIGV4cG9zZSB0aGUgY29udGV4dHMgYW5kIGNvbmRpdGlvbnMgaW4gd2hpY2ggdGhlIGZ1bmN0aW9uJ3MgZGVjaXNpb25zIGFyZSByZWxldmFudC4gV2l0aCBhIGNvbXByZWhlbnNpdmUgdmlldyBvZiB0aGUgY2FsbGVycywgSSB3aWxsIGJlIGFibGUgdG8gZnVsbHkgdW5kZXJzdGFuZCB0aGUgcm9sZSBvZiB0aGUgZnVuY3Rpb24gaW4gYWN0aW9uLlxuXG5cbiIsIklucHV0VG9rZW5zIjo2MDgwLCJPdXRwdXRUb2tlbnMiOjM1LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NDksIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0wN1QyMTo1NToyNi42ODAyNTYwNFoiLCJTZXEiOjYsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjIwODc5MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJtbS9odWdlX21lbW9yeS5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDE4MCxcbiAgXCJMaW5lQ291bnRcIjogOTBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiIDE4MDpcXHR9XFxuIDE4MTpcXHRcXG4gMTgyOlxcdHVuc2lnbmVkIGxvbmcgX190aHBfdm1hX2FsbG93YWJsZV9vcmRlcnMoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXFxuIDE4MzpcXHRcXHRcXHRcXHRcXHRcXHQgdm1fZmxhZ3NfdCB2bV9mbGFncyxcXG4gMTg0OlxcdFxcdFxcdFxcdFxcdFxcdCBlbnVtIHR2YV90eXBlIHR5cGUsXFxuIDE4NTpcXHRcXHRcXHRcXHRcXHRcXHQgdW5zaWduZWQgbG9uZyBvcmRlcnMpXFxuIDE4NjpcXHR7XFxuIDE4NzpcXHRcXHRjb25zdCBib29sIHNtYXBzID0gdHlwZSA9PSBUVkFfU01BUFM7XFxuIDE4ODpcXHRcXHRjb25zdCBib29sIGluX3BmID0gdHlwZSA9PSBUVkFfUEFHRUZBVUxUO1xcbiAxODk6XFx0XFx0Y29uc3QgYm9vbCBmb3JjZWRfY29sbGFwc2UgPSB0eXBlID09IFRWQV9GT1JDRURfQ09MTEFQU0U7XFxuIDE5MDpcXHRcXHR1bnNpZ25lZCBsb25nIHN1cHBvcnRlZF9vcmRlcnM7XFxuIDE5MTpcXHRcXG4gMTkyOlxcdFxcdC8qIENoZWNrIHRoZSBpbnRlcnNlY3Rpb24gb2YgcmVxdWVzdGVkIGFuZCBzdXBwb3J0ZWQgb3JkZXJzLiAqL1xcbiAxOTM6XFx0XFx0aWYgKHZtYV9pc19hbm9ueW1vdXModm1hKSlcXG4gMTk0OlxcdFxcdFxcdHN1cHBvcnRlZF9vcmRlcnMgPSBUSFBfT1JERVJTX0FMTF9BTk9OO1xcbiAxOTU6XFx0XFx0ZWxzZSBpZiAodm1hX2lzX2RheCh2bWEpIHx8IHZtYV9pc19zcGVjaWFsX2h1Z2Uodm1hKSlcXG4gMTk2OlxcdFxcdFxcdHN1cHBvcnRlZF9vcmRlcnMgPSBUSFBfT1JERVJTX0FMTF9TUEVDSUFMX0RBWDtcXG4gMTk3OlxcdFxcdGVsc2VcXG4gMTk4OlxcdFxcdFxcdHN1cHBvcnRlZF9vcmRlcnMgPSBUSFBfT1JERVJTX0FMTF9GSUxFX0RFRkFVTFQ7XFxuIDE5OTpcXHRcXG4gMjAwOlxcdFxcdG9yZGVycyBcXHUwMDI2PSBzdXBwb3J0ZWRfb3JkZXJzO1xcbiAyMDE6XFx0XFx0aWYgKCFvcmRlcnMpXFxuIDIwMjpcXHRcXHRcXHRyZXR1cm4gMDtcXG4gMjAzOlxcdFxcbiAyMDQ6XFx0XFx0aWYgKCF2bWEtXFx1MDAzZXZtX21tKVxcdFxcdC8qIHZkc28gKi9cXG4gMjA1OlxcdFxcdFxcdHJldHVybiAwO1xcbiAyMDY6XFx0XFxuIDIwNzpcXHRcXHRpZiAodGhwX2Rpc2FibGVkX2J5X2h3KCkgfHwgdm1hX3RocF9kaXNhYmxlZCh2bWEsIHZtX2ZsYWdzLCBmb3JjZWRfY29sbGFwc2UpKVxcbiAyMDg6XFx0XFx0XFx0cmV0dXJuIDA7XFxuIDIwOTpcXHRcXG4gMjEwOlxcdFxcdC8qIGtodWdlcGFnZWQgZG9lc24ndCBjb2xsYXBzZSBEQVggdm1hLCBidXQgcGFnZSBmYXVsdCBpcyBmaW5lLiAqL1xcbiAyMTE6XFx0XFx0aWYgKHZtYV9pc19kYXgodm1hKSlcXG4gMjEyOlxcdFxcdFxcdHJldHVybiBpbl9wZiA/IG9yZGVycyA6IDA7XFxuIDIxMzpcXHRcXG4gMjE0OlxcdFxcdC8qXFxuIDIxNTpcXHRcXHQgKiBraHVnZXBhZ2VkIHNwZWNpYWwgVk1BIGFuZCBodWdldGxiIFZNQS5cXG4gMjE2OlxcdFxcdCAqIE11c3QgYmUgY2hlY2tlZCBhZnRlciBkYXggc2luY2Ugc29tZSBkYXggbWFwcGluZ3MgbWF5IGhhdmVcXG4gMjE3OlxcdFxcdCAqIFZNX01JWEVETUFQIHNldC5cXG4gMjE4OlxcdFxcdCAqL1xcbiAyMTk6XFx0XFx0aWYgKCFpbl9wZiBcXHUwMDI2XFx1MDAyNiAhc21hcHMgXFx1MDAyNlxcdTAwMjYgKHZtX2ZsYWdzIFxcdTAwMjYgVk1fTk9fS0hVR0VQQUdFRCkpXFxuIDIyMDpcXHRcXHRcXHRyZXR1cm4gMDtcXG4gMjIxOlxcdFxcbiAyMjI6XFx0XFx0LypcXG4gMjIzOlxcdFxcdCAqIENoZWNrIGFsaWdubWVudCBmb3IgZmlsZSB2bWEgYW5kIHNpemUgZm9yIGJvdGggZmlsZSBhbmQgYW5vbiB2bWEgYnlcXG4gMjI0OlxcdFxcdCAqIGZpbHRlcmluZyBvdXQgdGhlIHVuc3VpdGFibGUgb3JkZXJzLlxcbiAyMjU6XFx0XFx0ICpcXG4gMjI2OlxcdFxcdCAqIFNraXAgdGhlIGNoZWNrIGZvciBwYWdlIGZhdWx0LiBIdWdlIGZhdWx0IGRvZXMgdGhlIGNoZWNrIGluIGZhdWx0XFxuIDIyNzpcXHRcXHQgKiBoYW5kbGVycy5cXG4gMjI4OlxcdFxcdCAqL1xcbiAyMjk6XFx0XFx0aWYgKCFpbl9wZikge1xcbiAyMzA6XFx0XFx0XFx0aW50IG9yZGVyID0gaGlnaGVzdF9vcmRlcihvcmRlcnMpO1xcbiAyMzE6XFx0XFx0XFx0dW5zaWduZWQgbG9uZyBhZGRyO1xcbiAyMzI6XFx0XFxuIDIzMzpcXHRcXHRcXHR3aGlsZSAob3JkZXJzKSB7XFxuIDIzNDpcXHRcXHRcXHRcXHRhZGRyID0gdm1hLVxcdTAwM2V2bV9lbmQgLSAoUEFHRV9TSVpFIFxcdTAwM2NcXHUwMDNjIG9yZGVyKTtcXG4gMjM1OlxcdFxcdFxcdFxcdGlmICh0aHBfdm1hX3N1aXRhYmxlX29yZGVyKHZtYSwgYWRkciwgb3JkZXIpKVxcbiAyMzY6XFx0XFx0XFx0XFx0XFx0YnJlYWs7XFxuIDIzNzpcXHRcXHRcXHRcXHRvcmRlciA9IG5leHRfb3JkZXIoXFx1MDAyNm9yZGVycywgb3JkZXIpO1xcbiAyMzg6XFx0XFx0XFx0fVxcbiAyMzk6XFx0XFxuIDI0MDpcXHRcXHRcXHRpZiAoIW9yZGVycylcXG4gMjQxOlxcdFxcdFxcdFxcdHJldHVybiAwO1xcbiAyNDI6XFx0XFx0fVxcbiAyNDM6XFx0XFxuIDI0NDpcXHRcXHQvKlxcbiAyNDU6XFx0XFx0ICogRW5hYmxlZCB2aWEgc2htZW0gbW91bnQgb3B0aW9ucyBvciBzeXNmcyBzZXR0aW5ncy5cXG4gMjQ2OlxcdFxcdCAqIE11c3QgYmUgZG9uZSBiZWZvcmUgaHVnZXBhZ2UgZmxhZ3MgY2hlY2sgc2luY2Ugc2htZW0gaGFzIGl0c1xcbiAyNDc6XFx0XFx0ICogb3duIGZsYWdzLlxcbiAyNDg6XFx0XFx0ICovXFxuIDI0OTpcXHRcXHRpZiAoIWluX3BmIFxcdTAwMjZcXHUwMDI2IHNobWVtX2ZpbGUodm1hLVxcdTAwM2V2bV9maWxlKSlcXG4gMjUwOlxcdFxcdFxcdHJldHVybiBvcmRlcnMgXFx1MDAyNiBzaG1lbV9hbGxvd2FibGVfaHVnZV9vcmRlcnMoZmlsZV9pbm9kZSh2bWEtXFx1MDAzZXZtX2ZpbGUpLFxcbiAyNTE6XFx0XFx0XFx0XFx0XFx0XFx0XFx0ICAgdm1hLCB2bWFfc3RhcnRfcGdvZmYodm1hKSwgMCxcXG4gMjUyOlxcdFxcdFxcdFxcdFxcdFxcdFxcdCAgIGZvcmNlZF9jb2xsYXBzZSk7XFxuIDI1MzpcXHRcXG4gMjU0OlxcdFxcdGlmICghdm1hX2lzX2Fub255bW91cyh2bWEpKVxcbiAyNTU6XFx0XFx0XFx0cmV0dXJuIHZtYV9maWxlX2Nhbl9tYXBfaHVnZSh2bWEsIHZtX2ZsYWdzLCB0eXBlKSA/IG9yZGVycyA6IDA7XFxuIDI1NjpcXHRcXG4gMjU3OlxcdFxcdGlmICh2bWFfaXNfdGVtcG9yYXJ5X3N0YWNrKHZtYSkpXFxuIDI1ODpcXHRcXHRcXHRyZXR1cm4gMDtcXG4gMjU5OlxcdFxcbiAyNjA6XFx0XFx0LypcXG4gMjYxOlxcdFxcdCAqIFRIUGVsaWdpYmxlIGJpdCBvZiBzbWFwcyBzaG91bGQgc2hvdyAxIGZvciBwcm9wZXIgVk1BcyBldmVuXFxuIDI2MjpcXHRcXHQgKiB0aG91Z2ggYW5vbl92bWEgaXMgbm90IGluaXRpYWxpemVkIHlldC5cXG4gMjYzOlxcdFxcdCAqXFxuIDI2NDpcXHRcXHQgKiBBbGxvdyBwYWdlIGZhdWx0IHNpbmNlIGFub25fdm1hIG1heSBiZSBub3QgaW5pdGlhbGl6ZWQgdW50aWxcXG4gMjY1OlxcdFxcdCAqIHRoZSBmaXJzdCBwYWdlIGZhdWx0LlxcbiAyNjY6XFx0XFx0ICovXFxuIDI2NzpcXHRcXHRpZiAoIXZtYS1cXHUwMDNlYW5vbl92bWEpXFxuIDI2ODpcXHRcXHRcXHRyZXR1cm4gKHNtYXBzIHx8IGluX3BmKSA/IG9yZGVycyA6IDA7XFxuIDI2OTpcXHRcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDdUMjE6NTU6MjYuNjgwNDY3MDVaIiwiU2VxIjo3LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjo0NzMwNDQ4MzU2LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkludmVzdGlnYXRpbmcgYSBQb3RlbnRpYWwgTlVMTCBQb2ludGVyIERlcmVmZXJlbmNlIGluIEZpbGUgVk1BcyoqXG5cbk9rYXksIHNvIEknbSBkaWdnaW5nIGludG8gdGhpcyBgdm1hX2ZpbGVfY2FuX21hcF9odWdlYCBmdW5jdGlvbiwgYW5kIGl0J3MgdXNpbmcgYHZtYS1cdTAwM2V2bV9vcHMtXHUwMDNlaHVnZV9mYXVsdGAuIE15IGltbWVkaWF0ZSB0aG91Z2h0IGlzLCBcIldoYXQgaWYgYHZtYS1cdTAwM2V2bV9vcHNgIGlzIE5VTEw/XCIgSXQncyBhIGNsYXNzaWMgY2hlY2ssIHNvIEkgc3RhcnQgdG8gbG9vayBhdCBpdC5cblxuU3BlY2lmaWNhbGx5LCBJIHNlZSBhIGxpbmUgaW4gYHZtYV9maWxlX2Nhbl9tYXBfaHVnZWAgdGhhdCBkZWNsYXJlcyBgY29uc3QgYm9vbCBoYXNfaHVnZV9mYXVsdCA9IHZtYS1cdTAwM2V2bV9vcHMtXHUwMDNlaHVnZV9mYXVsdDtgLiBIb2xkIG9uISBJcyBgdm1hLVx1MDAzZXZtX29wc2AgKmFsd2F5cyogbm9uLU5VTEwgZm9yIGZpbGUgVk1Bcz8gSSBuZWVkIHRvIGNsYXJpZnkgdGhhdC5cblxuVGhlbiwgdGhlIHF1ZXN0aW9uIG9mIGFub255bW91cyBWTUFzIHBvcHMgdXAsIHNvIEkgbmVlZCB0byBjaGVjayBgIXZtYV9pc19hbm9ueW1vdXModm1hKWAuIENvdWxkIGB2bWEtXHUwMDNldm1fb3BzYCAqc3RpbGwqIGJlIE5VTEw/IEFoYSEgTXkgdW5kZXJzdGFuZGluZyBvZiB0aGUgTGludXgga2VybmVsIG1lbW9yeSBtYW5hZ2VtZW50IGludGVybmFscyB0ZWxscyBtZSB0aGF0IGl0IGFjdHVhbGx5ICppcyogcG9zc2libGUgZm9yIGZpbGUgVk1BcyB0byBoYXZlIGB2bWEtXHUwMDNldm1fb3BzID09IE5VTExgISBTcGVjaWZpY2FsbHksIHRoZXJlIGFyZSBzaXR1YXRpb25zIHdoZXJlIGEgZHJpdmVyIG9yIGZpbGUgY3JlYXRlcyBhIFZNQSB3aXRob3V0IHByb3ZpZGluZyBgdm1fb3BzYCwgbGlrZSB3aXRoIGdlbmVyaWMgbW1hcCBvcGVyYXRpb25zLlxuXG5BbHJpZ2h0LCB0aW1lIHRvIGJhY2sgdXAgYSBsaXR0bGUgYW5kIHRoaW5rIGFib3V0IGhvdyBgdm1hLVx1MDAzZXZtX29wc2AgaGFzIGJlZW4gaGFuZGxlZCB1cCB0byBub3cuIExldCBtZSBzZWUgd2hlcmUgdGhpcyB2YXJpYWJsZSBpcyBhY2Nlc3NlZCBhbmQgaG93IGl0J3MgaGFuZGxlZC4gRm9yIGV4YW1wbGU6XG5gYGBjXG5pZiAoKChpbl9wZiB8fCBzbWFwcykpIFx1MDAyNlx1MDAyNiB2bWEtXHUwMDNldm1fb3BzLVx1MDAzZWh1Z2VfZmF1bHQpXG5gYGBcbklzIGB2bWEtXHUwMDNldm1fb3BzYCBldmVyIGNoZWNrZWQgZm9yIGJlaW5nIE5VTEwgc29tZXdoZXJlIGVsc2U/IFRoaXMgaXMgY3JpdGljYWwuXG5cbkknbSBhbHNvIHNlZWluZyBgdm1hX2ZpbGVfYnlwYXNzX3RocF90dW5lYWJsZXNgOlxuXG5gYGBjXG5zdGF0aWMgYm9vbCB2bWFfZmlsZV9ieXBhc3NfdGhwX3R1bmVhYmxlcyhjb25zdCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcblx0XHRlbnVtIHR2YV90eXBlIHR5cGUpXG57XG5cdGNvbnN0IGJvb2wgaGFzX2h1Z2VfZmF1bHQgPSB2bWEtXHUwMDNldm1fb3BzLVx1MDAzZWh1Z2VfZmF1bHQ7XG5gYGBcblxuSWYgYHZtYS1cdTAwM2V2bV9vcHNgICppcyogTlVMTCAob3IsIG1vcmUgc3BlY2lmaWNhbGx5LCBpZiB3ZSdyZSBkZWFsaW5nIHdpdGggYSBmaWxlIFZNQSB3aGVyZSBgdm1hLVx1MDAzZXZtX29wcyA9PSBOVUxMYCksIHRoZW4gZGVyZWZlcmVuY2luZyBgdm1hLVx1MDAzZXZtX29wcy1cdTAwM2VodWdlX2ZhdWx0YCBpcyBnb2luZyB0byBjYXVzZSBhIE5VTEwgcG9pbnRlciBkZXJlZmVyZW5jZSEgVGhhdCdzIGEgc2VyaW91cyBidWcgY2FuZGlkYXRlLiBJJ2QgYmV0dGVyIGJlIGNhcmVmdWwgYW5kIG5vdGUgdGhhdCB0aGlzIGlzIG15IGN1cnJlbnQgbGluZSBvZiB0aGlua2luZy5cblxuTm93LCBsZXQncyBncmVwIGluIHRoZSBgbW0vYCBkaXJlY3RvcnkgZm9yIGB2bWEtXHUwMDNldm1fb3BzYCBhbmQgc2VlIGlmIHRoZXJlIGFyZSBvdGhlciBwbGFjZXMgd2hlcmUgYHZtYS1cdTAwM2V2bV9vcHNgIGNvdWxkIGJlIE5VTEwgZm9yIGZpbGUgVk1Bcy4gVGhpcyBpcyB3aGVyZSBJIG5lZWQgdG8gc3RhcnQgZ2F0aGVyaW5nIGV2aWRlbmNlLlxuXG5cbiIsIklucHV0VG9rZW5zIjo3Nzc4LCJPdXRwdXRUb2tlbnMiOjI4LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NDI0LCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMDdUMjE6NTU6MzEuNDEwOTE5NDc2WiIsIlNlcSI6OCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjYyNzI3NzMwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcInZtYS1cXHUwMDNldm1fb3BzXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIm1tL1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJtbS9kZWJ1Zy5jPTE1NT12b2lkIGR1bXBfdm1hKGNvbnN0IHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKVxcbi0tXFxubW0vZGVidWcuYy0xNjUtXFx0XFx0KHVuc2lnbmVkIGxvbmcpcGdwcm90X3ZhbCh2bWEtXFx1MDAzZXZtX3BhZ2VfcHJvdCksXFxubW0vZGVidWcuYzoxNjY6XFx0XFx0dm1hLVxcdTAwM2Vhbm9uX3ZtYSwgdm1hLVxcdTAwM2V2bV9vcHMsIHZtYV9zdGFydF9wZ29mZih2bWEpLFxcbm1tL2RlYnVnLmMtMTY3LVxcdFxcdHZtYS1cXHUwMDNldm1fZmlsZSwgdm1hLVxcdTAwM2V2bV9wcml2YXRlX2RhdGEsXFxuLS1cXG5tbS9maWxlbWFwLmM9NDA0MD1pbnQgZ2VuZXJpY19maWxlX21tYXAoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKVxcbi0tXFxubW0vZmlsZW1hcC5jLTQwNDYtXFx0ZmlsZV9hY2Nlc3NlZChmaWxlKTtcXG5tbS9maWxlbWFwLmM6NDA0NzpcXHR2bWEtXFx1MDAzZXZtX29wcyA9IFxcdTAwMjZnZW5lcmljX2ZpbGVfdm1fb3BzO1xcbm1tL2ZpbGVtYXAuYy00MDQ4LVxcdHJldHVybiAwO1xcbi0tXFxubW0vZ3VwLmM9NjExPXN0YXRpYyBzdHJ1Y3QgcGFnZSAqbm9fcGFnZV90YWJsZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcXG4tLVxcbm1tL2d1cC5jLTYyOC1cXHRcXHRcXHRyZXR1cm4gRVJSX1BUUigtRUZBVUxUKTtcXG5tbS9ndXAuYzo2Mjk6XFx0fSBlbHNlIGlmICgodm1hX2lzX2Fub255bW91cyh2bWEpIHx8ICF2bWEtXFx1MDAzZXZtX29wcy1cXHUwMDNlZmF1bHQpKSB7XFxubW0vZ3VwLmMtNjMwLVxcdFxcdHJldHVybiBFUlJfUFRSKC1FRkFVTFQpO1xcbi0tXFxubW0vaHVnZV9tZW1vcnkuYz0xMjE9c3RhdGljIGJvb2wgdm1hX2ZpbGVfYnlwYXNzX3RocF90dW5lYWJsZXMoY29uc3Qgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXFxuLS1cXG5tbS9odWdlX21lbW9yeS5jLTEyMy17XFxubW0vaHVnZV9tZW1vcnkuYzoxMjQ6XFx0Y29uc3QgYm9vbCBoYXNfaHVnZV9mYXVsdCA9IHZtYS1cXHUwMDNldm1fb3BzLVxcdTAwM2VodWdlX2ZhdWx0O1xcbm1tL2h1Z2VfbWVtb3J5LmMtMTI1LVxcbi0tXFxubW0vaHVnZV9tZW1vcnkuYz0xNTM9c3RhdGljIGJvb2wgdm1hX2ZpbGVfY2FuX21hcF9odWdlKGNvbnN0IHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxcbi0tXFxubW0vaHVnZV9tZW1vcnkuYy0xNTUte1xcbm1tL2h1Z2VfbWVtb3J5LmM6MTU2OlxcdGNvbnN0IGJvb2wgaGFzX2h1Z2VfZmF1bHQgPSB2bWEtXFx1MDAzZXZtX29wcy1cXHUwMDNlaHVnZV9mYXVsdDtcXG5tbS9odWdlX21lbW9yeS5jLTE1Ny1cXG4tLVxcbm1tL2ludGVybmFsLmg9MjM2PXN0YXRpYyBpbmxpbmUgaW50IG1tYXBfZmlsZShzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpXFxuLS1cXG5tbS9pbnRlcm5hbC5oLTI0Ny1cXHQgKi9cXG5tbS9pbnRlcm5hbC5oOjI0ODpcXHR2bWEtXFx1MDAzZXZtX29wcyA9IFxcdTAwMjZ2bWFfZHVtbXlfdm1fb3BzO1xcbm1tL2ludGVybmFsLmgtMjQ5LVxcbi0tXFxubW0vaW50ZXJuYWwuaD0yNTg9c3RhdGljIGlubGluZSB2b2lkIHZtYV9jbG9zZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSlcXG5tbS9pbnRlcm5hbC5oLTI1OS17XFxubW0vaW50ZXJuYWwuaDoyNjA6XFx0aWYgKHZtYS1cXHUwMDNldm1fb3BzIFxcdTAwMjZcXHUwMDI2IHZtYS1cXHUwMDNldm1fb3BzLVxcdTAwM2VjbG9zZSkge1xcbm1tL2ludGVybmFsLmg6MjYxOlxcdFxcdHZtYS1cXHUwMDNldm1fb3BzLVxcdTAwM2VjbG9zZSh2bWEpO1xcbm1tL2ludGVybmFsLmgtMjYyLVxcbi0tXFxubW0vaW50ZXJuYWwuaC0yNjYtXFx0XFx0ICovXFxubW0vaW50ZXJuYWwuaDoyNjc6XFx0XFx0dm1hLVxcdTAwM2V2bV9vcHMgPSBcXHUwMDI2dm1hX2R1bW15X3ZtX29wcztcXG5tbS9pbnRlcm5hbC5oLTI2OC1cXHR9XFxuLS1cXG5tbS9tZW1vcnkuYz02Mjg9c3RhdGljIHZvaWQgcHJpbnRfYmFkX3BhZ2VfbWFwKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxcbi0tXFxubW0vbWVtb3J5LmMtNjU4LVxcdFxcdCB2bWEtXFx1MDAzZXZtX2ZpbGUsXFxubW0vbWVtb3J5LmM6NjU5OlxcdFxcdCB2bWEtXFx1MDAzZXZtX29wcyA/IHZtYS1cXHUwMDNldm1fb3BzLVxcdTAwM2VmYXVsdCA6IE5VTEwsXFxubW0vbWVtb3J5LmMtNjYwLVxcdFxcdCB2bWEtXFx1MDAzZXZtX2ZpbGUgPyB2bWEtXFx1MDAzZXZtX2ZpbGUtXFx1MDAzZWZfb3AtXFx1MDAzZW1tYXAgOiBOVUxMLFxcbi0tXFxubW0vbWVtb3J5LmM9NzU1PXN0YXRpYyBpbmxpbmUgc3RydWN0IHBhZ2UgKl9fdm1fbm9ybWFsX3BhZ2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXFxuLS1cXG5tbS9tZW1vcnkuYy03NjEtI2lmZGVmIENPTkZJR19GSU5EX05PUk1BTF9QQUdFXFxubW0vbWVtb3J5LmM6NzYyOlxcdFxcdFxcdGlmICh2bWEtXFx1MDAzZXZtX29wcyBcXHUwMDI2XFx1MDAyNiB2bWEtXFx1MDAzZXZtX29wcy1cXHUwMDNlZmluZF9ub3JtYWxfcGFnZSlcXG5tbS9tZW1vcnkuYzo3NjM6XFx0XFx0XFx0XFx0cmV0dXJuIHZtYS1cXHUwMDNldm1fb3BzLVxcdTAwM2VmaW5kX25vcm1hbF9wYWdlKHZtYSwgYWRkcik7XFxubW0vbWVtb3J5LmMtNzY0LSNlbmRpZiAvKiBDT05GSUdfRklORF9OT1JNQUxfUEFHRSAqL1xcbi0tXFxubW0vbWVtb3J5LmM9MjQzND1zdGF0aWMgYm9vbCB2bV9taXhlZF96ZXJvcGFnZV9hbGxvd2VkKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKVxcbi0tXFxubW0vbWVtb3J5LmMtMjQ1NC1cXHQgKiBiZSBwcm9ibGVtYXRpYyBhcyBzb29uIGFzIHRoZSB6ZXJvcGFnZSBnZXRzIHJlcGxhY2VkIGJ5IGEgZGlmZmVyZW50XFxubW0vbWVtb3J5LmM6MjQ1NTpcXHQgKiBwYWdlIGR1ZSB0byB2bWEtXFx1MDAzZXZtX29wcy1cXHUwMDNlcGZuX21rd3JpdGUsIGJlY2F1c2Ugd2hhdCdzIG1hcHBlZCB3b3VsZFxcbm1tL21lbW9yeS5jLTI0NTYtXFx0ICogbm93IGRpZmZlciB0byB3aGF0IEdVUCBsb29rZWQgdXAuIEZTREFYIGlzIGluY29tcGF0aWJsZSB0b1xcbi0tXFxubW0vbWVtb3J5LmMtMjQ1OS1cXHQgKi9cXG5tbS9tZW1vcnkuYzoyNDYwOlxcdHJldHVybiB2bWEtXFx1MDAzZXZtX29wcyBcXHUwMDI2XFx1MDAyNiB2bWEtXFx1MDAzZXZtX29wcy1cXHUwMDNlcGZuX21rd3JpdGUgXFx1MDAyNlxcdTAwMjZcXG5tbS9tZW1vcnkuYy0yNDYxLVxcdCAgICAgICAodm1hX2lzX2ZzZGF4KHZtYSkgfHwgdm1hLVxcdTAwM2V2bV9mbGFncyBcXHUwMDI2IFZNX0lPKTtcXG4tLVxcbm1tL21lbW9yeS5jPTM4MDU9c3RhdGljIHZtX2ZhdWx0X3QgZG9fcGFnZV9ta3dyaXRlKHN0cnVjdCB2bV9mYXVsdCAqdm1mLCBzdHJ1Y3QgZm9saW8gKmZvbGlvKVxcbi0tXFxubW0vbWVtb3J5LmMtMzgxNS1cXG5tbS9tZW1vcnkuYzozODE2OlxcdHJldCA9IHZtZi1cXHUwMDNldm1hLVxcdTAwM2V2bV9vcHMtXFx1MDAzZXBhZ2VfbWt3cml0ZSh2bWYpO1xcbm1tL21lbW9yeS5jLTM4MTctXFx0LyogUmVzdG9yZSBvcmlnaW5hbCBmbGFncyBzbyB0aGF0IGNhbGxlciBpcyBub3Qgc3VycHJpc2VkICovXFxuLS1cXG5tbS9tZW1vcnkuYz0zODM4PXN0YXRpYyB2bV9mYXVsdF90IGZhdWx0X2RpcnR5X3NoYXJlZF9wYWdlKHN0cnVjdCB2bV9mYXVsdCAqdm1mKVxcbi0tXFxubW0vbWVtb3J5LmMtMzg0My1cXHRib29sIGRpcnRpZWQ7XFxubW0vbWVtb3J5LmM6Mzg0NDpcXHRib29sIHBhZ2VfbWt3cml0ZSA9IHZtYS1cXHUwMDNldm1fb3BzIFxcdTAwMjZcXHUwMDI2IHZtYS1cXHUwMDNldm1fb3BzLVxcdTAwM2VwYWdlX21rd3JpdGU7XFxubW0vbWVtb3J5LmMtMzg0NS1cXG4tLVxcbm1tL21lbW9yeS5jPTM5MjU9c3RhdGljIGlubGluZSB2bV9mYXVsdF90IHZtZl9jYW5fY2FsbF9mYXVsdChjb25zdCBzdHJ1Y3Qgdm1fZmF1bHQgKnZtZilcXG4tLVxcbm1tL21lbW9yeS5jLTM5MjgtXFxubW0vbWVtb3J5LmM6MzkyOTpcXHRpZiAodm1hLVxcdTAwM2V2bV9vcHMtXFx1MDAzZW1hcF9wYWdlcyB8fCAhKHZtZi1cXHUwMDNlZmxhZ3MgXFx1MDAyNiBGQVVMVF9GTEFHX1ZNQV9MT0NLKSlcXG5tbS9tZW1vcnkuYy0zOTMwLVxcdFxcdHJldHVybiAwO1xcbi0tXFxubW0vbWVtb3J5LmM9NDE3Nz1zdGF0aWMgdm1fZmF1bHRfdCB3cF9wZm5fc2hhcmVkKHN0cnVjdCB2bV9mYXVsdCAqdm1mKVxcbi0tXFxubW0vbWVtb3J5LmMtNDE4MC1cXG5tbS9tZW1vcnkuYzo0MTgxOlxcdGlmICh2bWEtXFx1MDAzZXZtX29wcyBcXHUwMDI2XFx1MDAyNiB2bWEtXFx1MDAzZXZtX29wcy1cXHUwMDNlcGZuX21rd3JpdGUpIHtcXG5tbS9tZW1vcnkuYy00MTgyLVxcdFxcdHZtX2ZhdWx0X3QgcmV0O1xcbi0tXFxubW0vbWVtb3J5LmMtNDE4OS1cXHRcXHR2bWYtXFx1MDAzZWZsYWdzIHw9IEZBVUxUX0ZMQUdfTUtXUklURTtcXG5tbS9tZW1vcnkuYzo0MTkwOlxcdFxcdHJldCA9IHZtYS1cXHUwMDNldm1fb3BzLVxcdTAwM2VwZm5fbWt3cml0ZSh2bWYpO1xcbm1tL21lbW9yeS5jLTQxOTEtXFx0XFx0aWYgKHJldCBcXHUwMDI2IChWTV9GQVVMVF9FUlJPUiB8IFZNX0ZBVUxUX05PUEFHRSkpXFxuLS1cXG5tbS9tZW1vcnkuYz00MTk5PXN0YXRpYyB2bV9mYXVsdF90IHdwX3BhZ2Vfc2hhcmVkKHN0cnVjdCB2bV9mYXVsdCAqdm1mLCBzdHJ1Y3QgZm9saW8gKmZvbGlvKVxcbi0tXFxubW0vbWVtb3J5LmMtNDIwNi1cXG5tbS9tZW1vcnkuYzo0MjA3OlxcdGlmICh2bWEtXFx1MDAzZXZtX29wcyBcXHUwMDI2XFx1MDAyNiB2bWEtXFx1MDAzZXZtX29wcy1cXHUwMDNlcGFnZV9ta3dyaXRlKSB7XFxubW0vbWVtb3J5LmMtNDIwOC1cXHRcXHR2bV9mYXVsdF90IHRtcDtcXG4tLVxcbm1tL21lbW9yeS5jPTU0Mjc9c3RhdGljIHZtX2ZhdWx0X3QgZG9fYW5vbnltb3VzX3BhZ2Uoc3RydWN0IHZtX2ZhdWx0ICp2bWYpXFxuLS1cXG5tbS9tZW1vcnkuYy01NTM0LSAqIChzZWUgRkFVTFRfRkxBR19WTUFfTE9DSykgYW5kIG1heSBoYXZlIGJlZW4gcmVsZWFzZWQgZGVwZW5kaW5nIG9uXFxubW0vbWVtb3J5LmM6NTUzNTogKiBmbGFncyBhbmQgdm1hLVxcdTAwM2V2bV9vcHMtXFx1MDAzZWZhdWx0KCkgcmV0dXJuIHZhbHVlLlxcbm1tL21lbW9yeS5jLTU1MzYtICogU2VlIGZpbGVtYXBfZmF1bHQoKSBhbmQgX19mb2xpb19sb2NrX29yX3JldHJ5KCkuXFxuLS1cXG5tbS9tZW1vcnkuYz01NTM4PXN0YXRpYyB2bV9mYXVsdF90IF9fZG9fZmF1bHQoc3RydWN0IHZtX2ZhdWx0ICp2bWYpXFxuLS1cXG5tbS9tZW1vcnkuYy01NTY0LVxcbm1tL21lbW9yeS5jOjU1NjU6XFx0cmV0ID0gdm1hLVxcdTAwM2V2bV9vcHMtXFx1MDAzZWZhdWx0KHZtZik7XFxubW0vbWVtb3J5LmMtNTU2Ni1cXHRpZiAodW5saWtlbHkocmV0IFxcdTAwMjYgKFZNX0ZBVUxUX0VSUk9SIHwgVk1fRkFVTFRfTk9QQUdFIHwgVk1fRkFVTFRfUkVUUlkgfFxcbi0tXFxubW0vbWVtb3J5LmM9NTkzND1zdGF0aWMgdm1fZmF1bHRfdCBkb19mYXVsdF9hcm91bmQoc3RydWN0IHZtX2ZhdWx0ICp2bWYpXFxuLS1cXG5tbS9tZW1vcnkuYy01OTU3LVxcdHJjdV9yZWFkX2xvY2soKTtcXG5tbS9tZW1vcnkuYzo1OTU4OlxcdHJldCA9IHZtZi1cXHUwMDNldm1hLVxcdTAwM2V2bV9vcHMtXFx1MDAzZW1hcF9wYWdlcyh2bWYsXFxubW0vbWVtb3J5LmMtNTk1OS1cXHRcXHRcXHR2bWYtXFx1MDAzZXBnb2ZmICsgZnJvbV9wdGUgLSBwdGVfb2ZmLFxcbi0tXFxubW0vbWVtb3J5LmM9NTk2Nz1zdGF0aWMgaW5saW5lIGJvb2wgc2hvdWxkX2ZhdWx0X2Fyb3VuZChzdHJ1Y3Qgdm1fZmF1bHQgKnZtZilcXG4tLVxcbm1tL21lbW9yeS5jLTU5NjktXFx0LyogTm8gLVxcdTAwM2VtYXBfcGFnZXM/ICBObyB3YXkgdG8gZmF1bHQgYXJvdW5kLi4uICovXFxubW0vbWVtb3J5LmM6NTk3MDpcXHRpZiAoIXZtZi1cXHUwMDNldm1hLVxcdTAwM2V2bV9vcHMtXFx1MDAzZW1hcF9wYWdlcylcXG5tbS9tZW1vcnkuYy01OTcxLVxcdFxcdHJldHVybiBmYWxzZTtcXG4tLVxcbm1tL21lbW9yeS5jPTYwNTQ9c3RhdGljIHZtX2ZhdWx0X3QgZG9fc2hhcmVkX2ZhdWx0KHN0cnVjdCB2bV9mYXVsdCAqdm1mKVxcbi0tXFxubW0vbWVtb3J5LmMtNjA3My1cXHQgKi9cXG5tbS9tZW1vcnkuYzo2MDc0OlxcdGlmICh2bWEtXFx1MDAzZXZtX29wcy1cXHUwMDNlcGFnZV9ta3dyaXRlKSB7XFxubW0vbWVtb3J5LmMtNjA3NS1cXHRcXHRmb2xpb191bmxvY2soZm9saW8pO1xcbi0tXFxubW0vbWVtb3J5LmM9NjEwND1zdGF0aWMgdm1fZmF1bHRfdCBkb19mYXVsdChzdHJ1Y3Qgdm1fZmF1bHQgKnZtZilcXG4tLVxcbm1tL21lbW9yeS5jLTYxMTItXFx0ICovXFxubW0vbWVtb3J5LmM6NjExMzpcXHRpZiAoIXZtYS1cXHUwMDNldm1fb3BzLVxcdTAwM2VmYXVsdCkge1xcbm1tL21lbW9yeS5jLTYxMTQtXFx0XFx0dm1mLVxcdTAwM2VwdGUgPSBwdGVfb2Zmc2V0X21hcF9sb2NrKHZtZi1cXHUwMDNldm1hLVxcdTAwM2V2bV9tbSwgdm1mLVxcdTAwM2VwbWQsXFxuLS1cXG5tbS9tZW1vcnkuYz02Mzc5PXN0YXRpYyBpbmxpbmUgdm1fZmF1bHRfdCBjcmVhdGVfaHVnZV9wbWQoc3RydWN0IHZtX2ZhdWx0ICp2bWYpXFxuLS1cXG5tbS9tZW1vcnkuYy02MzgzLVxcdFxcdHJldHVybiBkb19odWdlX3BtZF9hbm9ueW1vdXNfcGFnZSh2bWYpO1xcbm1tL21lbW9yeS5jOjYzODQ6XFx0aWYgKHZtYS1cXHUwMDNldm1fb3BzLVxcdTAwM2VodWdlX2ZhdWx0KVxcbm1tL21lbW9yeS5jOjYzODU6XFx0XFx0cmV0dXJuIHZtYS1cXHUwMDNldm1fb3BzLVxcdTAwM2VodWdlX2ZhdWx0KHZtZiwgUE1EX09SREVSKTtcXG5tbS9tZW1vcnkuYy02Mzg2LVxcdHJldHVybiBWTV9GQVVMVF9GQUxMQkFDSztcXG4tLVxcbm1tL21lbW9yeS5jPTYzOTA9c3RhdGljIGlubGluZSB2bV9mYXVsdF90IHdwX2h1Z2VfcG1kKHN0cnVjdCB2bV9mYXVsdCAqdm1mKVxcbi0tXFxubW0vbWVtb3J5LmMtNjQwNi1cXHRpZiAodm1hLVxcdTAwM2V2bV9mbGFncyBcXHUwMDI2IChWTV9TSEFSRUQgfCBWTV9NQVlTSEFSRSkpIHtcXG5tbS9tZW1vcnkuYzo2NDA3OlxcdFxcdGlmICh2bWEtXFx1MDAzZXZtX29wcy1cXHUwMDNlaHVnZV9mYXVsdCkge1xcbm1tL21lbW9yeS5jOjY0MDg6XFx0XFx0XFx0cmV0ID0gdm1hLVxcdTAwM2V2bV9vcHMtXFx1MDAzZWh1Z2VfZmF1bHQodm1mLCBQTURfT1JERVIpO1xcbm1tL21lbW9yeS5jLTY0MDktXFx0XFx0XFx0aWYgKCEocmV0IFxcdTAwMjYgVk1fRkFVTFRfRkFMTEJBQ0spKVxcbi0tXFxubW0vbWVtb3J5LmM9NjQyMT1zdGF0aWMgdm1fZmF1bHRfdCBjcmVhdGVfaHVnZV9wdWQoc3RydWN0IHZtX2ZhdWx0ICp2bWYpXFxuLS1cXG5tbS9tZW1vcnkuYy02NDI4LVxcdFxcdHJldHVybiBWTV9GQVVMVF9GQUxMQkFDSztcXG5tbS9tZW1vcnkuYzo2NDI5OlxcdGlmICh2bWEtXFx1MDAzZXZtX29wcy1cXHUwMDNlaHVnZV9mYXVsdClcXG5tbS9tZW1vcnkuYzo2NDMwOlxcdFxcdHJldHVybiB2bWEtXFx1MDAzZXZtX29wcy1cXHUwMDNlaHVnZV9mYXVsdCh2bWYsIFBVRF9PUkRFUik7XFxubW0vbWVtb3J5LmMtNjQzMS0jZW5kaWYgLyogQ09ORklHX1RSQU5TUEFSRU5UX0hVR0VQQUdFICovXFxuLS1cXG5tbS9tZW1vcnkuYz02NDM1PXN0YXRpYyB2bV9mYXVsdF90IHdwX2h1Z2VfcHVkKHN0cnVjdCB2bV9mYXVsdCAqdm1mLCBwdWRfdCBvcmlnX3B1ZClcXG4tLVxcbm1tL21lbW9yeS5jLTY0NDUtXFx0aWYgKHZtYS1cXHUwMDNldm1fZmxhZ3MgXFx1MDAyNiAoVk1fU0hBUkVEIHwgVk1fTUFZU0hBUkUpKSB7XFxubW0vbWVtb3J5LmM6NjQ0NjpcXHRcXHRpZiAodm1hLVxcdTAwM2V2bV9vcHMtXFx1MDAzZWh1Z2VfZmF1bHQpIHtcXG5tbS9tZW1vcnkuYzo2NDQ3OlxcdFxcdFxcdHJldCA9IHZtYS1cXHUwMDNldm1fb3BzLVxcdTAwM2VodWdlX2ZhdWx0KHZtZiwgUFVEX09SREVSKTtcXG5tbS9tZW1vcnkuYy02NDQ4LVxcdFxcdFxcdGlmICghKHJldCBcXHUwMDI2IFZNX0ZBVUxUX0ZBTExCQUNLKSlcXG4tLVxcbm1tL21lbW9yeS5jPTcyMTA9c3RhdGljIGludCBfX2FjY2Vzc19yZW1vdGVfdm0oc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgYWRkcixcXG4tLVxcbm1tL21lbW9yeS5jLTcyNTQtI2lmZGVmIENPTkZJR19IQVZFX0lPUkVNQVBfUFJPVFxcbm1tL21lbW9yeS5jOjcyNTU6XFx0XFx0XFx0aWYgKHZtYS1cXHUwMDNldm1fb3BzIFxcdTAwMjZcXHUwMDI2IHZtYS1cXHUwMDNldm1fb3BzLVxcdTAwM2VhY2Nlc3MpXFxubW0vbWVtb3J5LmM6NzI1NjpcXHRcXHRcXHRcXHRieXRlcyA9IHZtYS1cXHUwMDNldm1fb3BzLVxcdTAwM2VhY2Nlc3Modm1hLCBhZGRyLCBidWYsXFxubW0vbWVtb3J5LmMtNzI1Ny1cXHRcXHRcXHRcXHRcXHRcXHRcXHQgICAgbGVuLCB3cml0ZSk7XFxuLS1cXG5tbS9tZW1wb2xpY3kuYz0xMDEyPXN0YXRpYyBpbnQgdm1hX3JlcGxhY2VfcG9saWN5KHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxcbi0tXFxubW0vbWVtcG9saWN5LmMtMTAyNC1cXG5tbS9tZW1wb2xpY3kuYzoxMDI1OlxcdGlmICh2bWEtXFx1MDAzZXZtX29wcyBcXHUwMDI2XFx1MDAyNiB2bWEtXFx1MDAzZXZtX29wcy1cXHUwMDNlc2V0X3BvbGljeSkge1xcbm1tL21lbXBvbGljeS5jOjEwMjY6XFx0XFx0ZXJyID0gdm1hLVxcdTAwM2V2bV9vcHMtXFx1MDAzZXNldF9wb2xpY3kodm1hLCBuZXcpO1xcbm1tL21lbXBvbGljeS5jLTEwMjctXFx0XFx0aWYgKGVycilcXG4tLVxcbm1tL21lbXBvbGljeS5jPTIwMjE9c3RydWN0IG1lbXBvbGljeSAqX19nZXRfdm1hX3BvbGljeShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcXG4tLVxcbm1tL21lbXBvbGljeS5jLTIwMjQtXFx0KmlseCA9IDA7XFxubW0vbWVtcG9saWN5LmM6MjAyNTpcXHRyZXR1cm4gKHZtYS1cXHUwMDNldm1fb3BzIFxcdTAwMjZcXHUwMDI2IHZtYS1cXHUwMDNldm1fb3BzLVxcdTAwM2VnZXRfcG9saWN5KSA/XFxubW0vbWVtcG9saWN5LmM6MjAyNjpcXHRcXHR2bWEtXFx1MDAzZXZtX29wcy1cXHUwMDNlZ2V0X3BvbGljeSh2bWEsIGFkZHIsIGlseCkgOiB2bWEtXFx1MDAzZXZtX3BvbGljeTtcXG5tbS9tZW1wb2xpY3kuYy0yMDI3LX1cXG4tLVxcbm1tL21tYXAuYz0xNDY1PWJvb2wgdm1hX2lzX3NwZWNpYWxfbWFwcGluZyhjb25zdCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcXG4tLVxcbm1tL21tYXAuYy0xNDY4LVxcdHJldHVybiB2bWEtXFx1MDAzZXZtX3ByaXZhdGVfZGF0YSA9PSBzbSBcXHUwMDI2XFx1MDAyNlxcbm1tL21tYXAuYzoxNDY5OlxcdFxcdHZtYS1cXHUwMDNldm1fb3BzID09IFxcdTAwMjZzcGVjaWFsX21hcHBpbmdfdm1vcHM7XFxubW0vbW1hcC5jLTE0NzAtfVxcbi0tXFxubW0vbXByb3RlY3QuYz04NzE9c3RhdGljIGludCBkb19tcHJvdGVjdF9wa2V5KHVuc2lnbmVkIGxvbmcgc3RhcnQsIHNpemVfdCBsZW4sXFxuLS1cXG5tbS9tcHJvdGVjdC5jLTk5NS1cXG5tbS9tcHJvdGVjdC5jOjk5NjpcXHRcXHRpZiAodm1hLVxcdTAwM2V2bV9vcHMgXFx1MDAyNlxcdTAwMjYgdm1hLVxcdTAwM2V2bV9vcHMtXFx1MDAzZW1wcm90ZWN0KSB7XFxubW0vbXByb3RlY3QuYzo5OTc6XFx0XFx0XFx0ZXJyb3IgPSB2bWEtXFx1MDAzZXZtX29wcy1cXHUwMDNlbXByb3RlY3Qodm1hLCBuc3RhcnQsIHRtcCwgbmV3ZmxhZ3MpO1xcbm1tL21wcm90ZWN0LmMtOTk4LVxcdFxcdFxcdGlmIChlcnJvcilcXG4tLVxcbm1tL21yZW1hcC5jPTExMTI9c3RhdGljIHVuc2lnbmVkIGxvbmcgcHJlcF9tb3ZlX3ZtYShzdHJ1Y3Qgdm1hX3JlbWFwX3N0cnVjdCAqdnJtKVxcbi0tXFxubW0vbXJlbWFwLmMtMTEyNy1cXG5tbS9tcmVtYXAuYzoxMTI4OlxcdGlmICh2bWEtXFx1MDAzZXZtX29wcyBcXHUwMDI2XFx1MDAyNiB2bWEtXFx1MDAzZXZtX29wcy1cXHUwMDNlbWF5X3NwbGl0KSB7XFxubW0vbXJlbWFwLmMtMTEyOS1cXHRcXHRpZiAodm1hLVxcdTAwM2V2bV9zdGFydCAhPSBvbGRfYWRkcilcXG5tbS9tcmVtYXAuYzoxMTMwOlxcdFxcdFxcdGVyciA9IHZtYS1cXHUwMDNldm1fb3BzLVxcdTAwM2VtYXlfc3BsaXQodm1hLCBvbGRfYWRkcik7XFxubW0vbXJlbWFwLmMtMTEzMS1cXHRcXHRpZiAoIWVyciBcXHUwMDI2XFx1MDAyNiB2bWEtXFx1MDAzZXZtX2VuZCAhPSBvbGRfYWRkciArIG9sZF9sZW4pXFxubW0vbXJlbWFwLmM6MTEzMjpcXHRcXHRcXHRlcnIgPSB2bWEtXFx1MDAzZXZtX29wcy1cXHUwMDNlbWF5X3NwbGl0KHZtYSwgb2xkX2FkZHIgKyBvbGRfbGVuKTtcXG5tbS9tcmVtYXAuYy0xMTMzLVxcdFxcdGlmIChlcnIpXFxuLS1cXG5tbS9tcmVtYXAuYz0xMjY1PXN0YXRpYyBpbnQgY29weV92bWFfYW5kX2RhdGEoc3RydWN0IHZtYV9yZW1hcF9zdHJ1Y3QgKnZybSxcXG4tLVxcbm1tL21yZW1hcC5jLTEyOTQtXFx0XFx0ZXJyID0gLUVOT01FTTtcXG5tbS9tcmVtYXAuYzoxMjk1OlxcdGVsc2UgaWYgKHZtYS1cXHUwMDNldm1fb3BzIFxcdTAwMjZcXHUwMDI2IHZtYS1cXHUwMDNldm1fb3BzLVxcdTAwM2VtcmVtYXApXFxubW0vbXJlbWFwLmM6MTI5NjpcXHRcXHRlcnIgPSB2bWEtXFx1MDAzZXZtX29wcy1cXHUwMDNlbXJlbWFwKG5ld192bWEpO1xcbm1tL21yZW1hcC5jLTEyOTctXFxuLS1cXG5tbS9zZWNyZXRtZW0uYz0yMTM9Ym9vbCB2bWFfaXNfc2VjcmV0bWVtKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKVxcbm1tL3NlY3JldG1lbS5jLTIxNC17XFxubW0vc2VjcmV0bWVtLmM6MjE1OlxcdHJldHVybiB2bWEtXFx1MDAzZXZtX29wcyA9PSBcXHUwMDI2c2VjcmV0bWVtX3ZtX29wcztcXG5tbS9zZWNyZXRtZW0uYy0yMTYtfVxcbi0tXFxubW0vc2htZW0uYz0yODQ9Ym9vbCB2bWFfaXNfYW5vbl9zaG1lbShjb25zdCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSlcXG5tbS9zaG1lbS5jLTI4NS17XFxubW0vc2htZW0uYzoyODY6XFx0cmV0dXJuIHZtYS1cXHUwMDNldm1fb3BzID09IFxcdTAwMjZzaG1lbV9hbm9uX3ZtX29wcztcXG5tbS9zaG1lbS5jLTI4Ny19XFxuLS1cXG5tbS9zaG1lbS5jPTI4OT1ib29sIHZtYV9pc19zaG1lbShjb25zdCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSlcXG5tbS9zaG1lbS5jLTI5MC17XFxubW0vc2htZW0uYzoyOTE6XFx0cmV0dXJuIHZtYV9pc19hbm9uX3NobWVtKHZtYSkgfHwgdm1hLVxcdTAwM2V2bV9vcHMgPT0gXFx1MDAyNnNobWVtX3ZtX29wcztcXG5tbS9zaG1lbS5jLTI5Mi19XFxuLS1cXG5tbS9zaG1lbS5jPTU5MDg9aW50IHNobWVtX3plcm9fc2V0dXAoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpXFxuLS1cXG5tbS9zaG1lbS5jLTU5MTctXFx0dm1hLVxcdTAwM2V2bV9maWxlID0gZmlsZTtcXG5tbS9zaG1lbS5jOjU5MTg6XFx0dm1hLVxcdTAwM2V2bV9vcHMgPSBcXHUwMDI2c2htZW1fYW5vbl92bV9vcHM7XFxubW0vc2htZW0uYy01OTE5LVxcbi0tXFxubW0vdXNlcmZhdWx0ZmQuYz04Mz1zdGF0aWMgY29uc3Qgc3RydWN0IHZtX3VmZmRfb3BzICp2bWFfdWZmZF9vcHMoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpXFxuLS1cXG5tbS91c2VyZmF1bHRmZC5jLTg2LVxcdFxcdHJldHVybiBcXHUwMDI2YW5vbl91ZmZkX29wcztcXG5tbS91c2VyZmF1bHRmZC5jOjg3OlxcdHJldHVybiB2bWEtXFx1MDAzZXZtX29wcy1cXHUwMDNldWZmZF9vcHM7XFxubW0vdXNlcmZhdWx0ZmQuYy04OC19XFxuLS1cXG5tbS91dGlsLmM9MTE4MD12b2lkIGNvbXBhdF9zZXRfZGVzY19mcm9tX3ZtYShzdHJ1Y3Qgdm1fYXJlYV9kZXNjICpkZXNjLFxcbi0tXFxubW0vdXRpbC5jLTExOTQtXFx0ZGVzYy1cXHUwMDNlcGFnZV9wcm90ID0gdm1hLVxcdTAwM2V2bV9wYWdlX3Byb3Q7XFxubW0vdXRpbC5jOjExOTU6XFx0ZGVzYy1cXHUwMDNldm1fb3BzID0gdm1hLVxcdTAwM2V2bV9vcHM7XFxubW0vdXRpbC5jLTExOTYtXFxuLS1cXG5tbS91dGlsLmM9MTM3Mz1zdGF0aWMgaW50IGNhbGxfdm1hX21hcHBlZChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSlcXG5tbS91dGlsLmMtMTM3NC17XFxubW0vdXRpbC5jOjEzNzU6XFx0Y29uc3Qgc3RydWN0IHZtX29wZXJhdGlvbnNfc3RydWN0ICp2bV9vcHMgPSB2bWEtXFx1MDAzZXZtX29wcztcXG5tbS91dGlsLmMtMTM3Ni1cXHR2b2lkICp2bV9wcml2YXRlX2RhdGEgPSB2bWEtXFx1MDAzZXZtX3ByaXZhdGVfZGF0YTtcXG4tLVxcbm1tL3ZtYS5jPTU0ND1fX3NwbGl0X3ZtYShzdHJ1Y3Qgdm1hX2l0ZXJhdG9yICp2bWksIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxcbi0tXFxubW0vdm1hLmMtNTUzLVxcbm1tL3ZtYS5jOjU1NDpcXHRpZiAodm1hLVxcdTAwM2V2bV9vcHMgXFx1MDAyNlxcdTAwMjYgdm1hLVxcdTAwM2V2bV9vcHMtXFx1MDAzZW1heV9zcGxpdCkge1xcbm1tL3ZtYS5jOjU1NTpcXHRcXHRlcnIgPSB2bWEtXFx1MDAzZXZtX29wcy1cXHUwMDNlbWF5X3NwbGl0KHZtYSwgYWRkcik7XFxubW0vdm1hLmMtNTU2LVxcdFxcdGlmIChlcnIpXFxuLS1cXG5tbS92bWEuYz04NTU9c3RhdGljIGJvb2wgY2FuX21lcmdlX3JlbW92ZV92bWEoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpXFxubW0vdm1hLmMtODU2LXtcXG5tbS92bWEuYzo4NTc6XFx0cmV0dXJuICF2bWEtXFx1MDAzZXZtX29wcyB8fCAhdm1hLVxcdTAwM2V2bV9vcHMtXFx1MDAzZWNsb3NlO1xcbm1tL3ZtYS5jLTg1OC19XFxuLS1cXG5tbS92bWEuYz0xOTQ0PXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqY29weV92bWEoc3RydWN0IHZtX2FyZWFfc3RydWN0ICoqdm1hcCxcXG4tLVxcbm1tL3ZtYS5jLTIwMTYtXFx0XFx0XFx0Z2V0X2ZpbGUobmV3X3ZtYS1cXHUwMDNldm1fZmlsZSk7XFxubW0vdm1hLmM6MjAxNzpcXHRcXHRpZiAobmV3X3ZtYS1cXHUwMDNldm1fb3BzIFxcdTAwMjZcXHUwMDI2IG5ld192bWEtXFx1MDAzZXZtX29wcy1cXHUwMDNlb3BlbilcXG5tbS92bWEuYzoyMDE4OlxcdFxcdFxcdG5ld192bWEtXFx1MDAzZXZtX29wcy1cXHUwMDNlb3BlbihuZXdfdm1hKTtcXG5tbS92bWEuYy0yMDE5LVxcdFxcdGlmICh2bWFfbGluayhtbSwgbmV3X3ZtYSkpXFxuLS1cXG5tbS92bWEuYz0yMTg1PWJvb2wgdm1hX25lZWRzX2RpcnR5X3RyYWNraW5nKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKVxcbi0tXFxubW0vdm1hLmMtMjE5MS1cXHQvKiBEb2VzIHRoZSBmaWxlc3lzdGVtIG5lZWQgdG8gYmUgbm90aWZpZWQ/ICovXFxubW0vdm1hLmM6MjE5MjpcXHRpZiAodm1fb3BzX25lZWRzX3dyaXRlbm90aWZ5KHZtYS1cXHUwMDNldm1fb3BzKSlcXG5tbS92bWEuYy0yMTkzLVxcdFxcdHJldHVybiB0cnVlO1xcbi0tXFxubW0vdm1hLmM9MjIwOD1ib29sIHZtYV93YW50c193cml0ZW5vdGlmeShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgcGdwcm90X3Qgdm1fcGFnZV9wcm90KVxcbi0tXFxubW0vdm1hLmMtMjIxNC1cXHQvKiBUaGUgYmFja2VyIHdpc2hlcyB0byBrbm93IHdoZW4gcGFnZXMgYXJlIGZpcnN0IHdyaXR0ZW4gdG8/ICovXFxubW0vdm1hLmM6MjIxNTpcXHRpZiAodm1fb3BzX25lZWRzX3dyaXRlbm90aWZ5KHZtYS1cXHUwMDNldm1fb3BzKSlcXG5tbS92bWEuYy0yMjE2LVxcdFxcdHJldHVybiB0cnVlO1xcbi0tXFxubW0vdm1hLmM9Mjc5OT1zdGF0aWMgdm9pZCBzZXRfdm1hX3VzZXJfZGVmaW5lZF9maWVsZHMoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXFxuLS1cXG5tbS92bWEuYy0yODAyLVxcdGlmIChtYXAtXFx1MDAzZXZtX29wcylcXG5tbS92bWEuYzoyODAzOlxcdFxcdHZtYS1cXHUwMDNldm1fb3BzID0gbWFwLVxcdTAwM2V2bV9vcHM7XFxubW0vdm1hLmMtMjgwNC1cXHRlbHNlXFx0LyogT25seSAvZGV2L3plcm8gc2hvdWxkIGRvIHRoaXMuICovXFxuLS1cXG5tbS92bWEuYz0zNDYxPXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqX19pbnN0YWxsX3NwZWNpYWxfbWFwcGluZyhcXG4tLVxcbm1tL3ZtYS5jLTM0ODItXFxubW0vdm1hLmM6MzQ4MzpcXHR2bWEtXFx1MDAzZXZtX29wcyA9IG9wcztcXG5tbS92bWEuYy0zNDg0LVxcdHZtYS1cXHUwMDNldm1fcHJpdmF0ZV9kYXRhID0gcHJpdjtcXG4tLVxcbm1tL3ZtYS5oPTM4OT1zdGF0aWMgaW5saW5lIHZvaWQgY29tcGF0X3NldF92bWFfZnJvbV9kZXNjKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxcbi0tXFxubW0vdm1hLmgtNDA1LVxcdC8qIFVzZXItZGVmaW5lZCBmaWVsZHMuICovXFxubW0vdm1hLmg6NDA2OlxcdHZtYS1cXHUwMDNldm1fb3BzID0gZGVzYy1cXHUwMDNldm1fb3BzO1xcbm1tL3ZtYS5oLTQwNy1cXHR2bWEtXFx1MDAzZXZtX3ByaXZhdGVfZGF0YSA9IGRlc2MtXFx1MDAzZXByaXZhdGVfZGF0YTtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDdUMjE6NTU6MzEuNDczNjUxMzc2WiIsIlNlcSI6OSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6NTY1NTUzMTI4MCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipNeSBBbmFseXNpcyBvZiB0aGlzIFBvdGVudGlhbCBWdWxuZXJhYmlsaXR5KipcblxuT2theSwgaGVyZSdzIHRoZSBicmVha2Rvd24gb2YgbXkgdGhpbmtpbmcuIE15IGluaXRpYWwgY29uY2VybiBzdGVtbWVkIGZyb20gdGhlIGBtbWFwX2ZpbGVgIGZ1bmN0aW9uIGFuZCB0aGUgcG90ZW50aWFsIGZvciBhIG51bGwgcG9pbnRlciBkZXJlZmVyZW5jZS4gSSBzZWUgdGhhdCBhbm9ueW1vdXMgVk1BcyBhbmQgZHVtbXkgb25lcyB1c2UgYHZtYV9kdW1teV92bV9vcHNgLCBidXQgSSdtIHRoaW5raW5nIGFib3V0IHRoZSBjYXNlIHdoZXJlIGEgZHJpdmVyIG1pZ2h0IHNldCBgdm1hLVx1MDAzZXZtX29wcyA9IE5VTExgIGludGVudGlvbmFsbHkgb3IgYnkgb3ZlcnNpZ2h0LiBJJ20gaW1hZ2luaW5nIGEgc2NlbmFyaW8gd2hlcmUsIGV2ZW4gaWYgdGhlIGR1bW15IG9wZXJhdGlvbnMgYXJlIHByZXNlbnQsIGEgZHJpdmVyIGNvdWxkIHNldCB0aGlzIHBvaW50ZXIgdG8gbnVsbC4gV2hhdCBoYXBwZW5zIHRoZW4gd2hlbiB0aGUgY29kZSBsYXRlciB0cmllcyB0byB1c2UgYHZtYS1cdTAwM2V2bV9vcHNgIHdpdGhvdXQgY2hlY2tpbmcgaWYgaXQncyBOVUxMP1xuXG5UaGVuIEkgemVyb2VkIGluIG9uIHRoZSBgbW0vaHVnZV9tZW1vcnkuY2AgZmlsZSwgc3BlY2lmaWNhbGx5IHRoZSBgdm1hX2ZpbGVfYnlwYXNzX3RocF90dW5lYWJsZXNgIGZ1bmN0aW9uLiBJIHNlZSBhbiAqdW5jb25kaXRpb25hbCogZGVyZWZlcmVuY2Ugb2YgYHZtYS1cdTAwM2V2bV9vcHNgIGluIHRoaXMgZnVuY3Rpb246IGBjb25zdCBib29sIGhhc19odWdlX2ZhdWx0ID0gdm1hLVx1MDAzZXZtX29wcy1cdTAwM2VodWdlX2ZhdWx0O2AuIFRoaXMgaXMgYSBiaWcgcmVkIGZsYWchIEJlZm9yZSBpdCB3YXMgc29tZXRoaW5nIGxpa2UgYGlmICgoKGluX3BmIHx8IHNtYXBzKSkgXHUwMDI2XHUwMDI2IHZtYS1cdTAwM2V2bV9vcHMtXHUwMDNlaHVnZV9mYXVsdClgLCBidXQgbm93LCBpdCdzIHN0cmFpZ2h0LXVwIGRlcmVmZXJlbmNpbmcuXG5cbk15IG1pbmQgcmFjZWQgdG8gdGhlIHF1ZXN0aW9uIG9mIHdoZXRoZXIgYHZtYS1cdTAwM2V2bV9vcHNgIGlzICphbHdheXMqIG5vbi1OVUxMIHdoZW4gaXQgaXMgbm90IGFub255bW91cywgYnV0IHRoZW4gSSByZWFsaXplZCBpdCBkb2Vzbid0IG1hdHRlciwgbm93LCBpdCdzIGJlaW5nIGRlcmVmZXJlbmNlZCB1bmNvbmRpdGlvbmFsbHksIHdoZXRoZXIgaXQgaXMgb3IgaXNuJ3QuIFNvLCBpZiBgdm1hLVx1MDAzZXZtX29wc2AgKmlzKiBOVUxMIGluIHRoYXQgY29udGV4dCwgdGhlbiB3ZSBoYXZlIGEgY2xhc3NpYyBudWxsIHBvaW50ZXIgZGVyZWZlcmVuY2UgdnVsbmVyYWJpbGl0eS5cblxuTm93LCBJIHN3aXRjaGVkIGdlYXJzIHRvIHRyaWFnZS4gSSBrbm93IHRoYXQgbWVtb3J5IG1hbmFnZW1lbnQgY29kZSBpcyBjcml0aWNhbC4gSSdtIGdvaW5nIHRocm91Z2ggdGhlIHRyaWFnZSBjcml0ZXJpYSBpbiBteSBoZWFkOiBjaGFuZ2VzIGluIG1lbW9yeSBtYW5hZ2VtZW50IChtbS8pLCBzeW5jaHJvbml6YXRpb24vbG9ja2luZywgQlBGLCBzY2hlZHVsZXIsIGNvcmUgbmV0d29ya2luZywgVkZTLCBvciBzeXNjYWxsIGhhbmRsaW5nPyBUaGlzIGlzICpkZWZpbml0ZWx5KiBjb3JlIG1lbW9yeSBtYW5hZ2VtZW50LCBzcGVjaWZpY2FsbHkgcmVsYXRlZCB0byBUSFAgKFRyYW5zcGFyZW50IEh1Z2UgUGFnZXMpLiBJdCdzIG1vZGlmeWluZyBgdm1hX2ZpbGVfYnlwYXNzX3RocF90dW5lYWJsZXNgLCBzbyBpdCdzIGEgZGlyZWN0IGNoYW5nZSBpbiBob3cgVEhQIG9yZGVycyBhcmUgY2FsY3VsYXRlZCBmb3IgZmlsZS1iYWNrZWQgVk1Bcy5cblxuSSB0aGluayB0aHJvdWdoIHRoZSBwb3RlbnRpYWwgcmVhY2hhYmlsaXR5OiBUaGlzIGNvZGUgaXMgdXNlZCBieSBgbWFkdmlzZShNQURWX0NPTExBUFNFKWAsIGR1cmluZyBwYWdlIGZhdWx0cyBvbiBmaWxlIFZNQXMsIHZpYSBgL3Byb2MvcGlkL3NtYXBzYCwgYW5kIGJ5IGBraHVnZXBhZ2VkYC4gQWJzb2x1dGVseSByZWFjaGFibGUgaW4gdHlwaWNhbCBRRU1VL3g4Nl82NCBzZXR1cHMuIFNvLCBiYXNlZCBvbiB0aGUgcmVhY2hhYmlsaXR5IGFuZCB0aGUgcG90ZW50aWFsIGZvciBhIG51bGwgZGVyZWZlcmVuY2UgaW4gY29yZSBtZW1vcnkgbWFuYWdlbWVudCwgSSdtIG1hcmtpbmcgaXQgYXMgZGVmaW5pdGVseSBgV29ydGhGdXp6aW5nPXRydWVgLlxuXG5OZXh0LCBJJ2xsIGZvY3VzIG9uIG5haWxpbmcgZG93biB0aGUgbmVjZXNzYXJ5IGBFbmFibGVDb25maWdzYCwgaWRlbnRpZnlpbmcgdGhlIGBGb2N1c1N5bWJvbHNgLCBhbmQgdGhlIHNwZWNpZmljIHJlYXNvbnMgd2h5IHRoaXMgcGF0Y2ggaXMgcGFydGljdWxhcmx5IGNvbmNlcm5pbmcgdG8gd3JpdGUgYSBzb2xpZCBqdXN0aWZpY2F0aW9uIGZvciB0aGlzIGFuYWx5c2lzLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxNDc0MSwiT3V0cHV0VG9rZW5zIjoyNSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjc0MiwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0wN1QyMTo1NTozNy4xMjkxODU3NzZaIiwiU2VxIjoxMCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjYxNzU5MzM5LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImh1Z2VfbWVtb3J5XCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIm1tL1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJtbS9NYWtlZmlsZT0xMDA9b2JqLSQoQ09ORklHX0RFVklDRV9NSUdSQVRJT04pICs9IG1pZ3JhdGVfZGV2aWNlLm9cXG5tbS9NYWtlZmlsZToxMDE6b2JqLSQoQ09ORklHX1RSQU5TUEFSRU5UX0hVR0VQQUdFKSArPSBodWdlX21lbW9yeS5vIGtodWdlcGFnZWQub1xcbm1tL01ha2VmaWxlLTEwMi1vYmotJChDT05GSUdfUEFHRV9DT1VOVEVSKSArPSBwYWdlX2NvdW50ZXIub1xcbi0tXFxubW0vaW50ZXJuYWwuaD0xMjgyPWludCBfX211c3RfY2hlY2sgdHJ5X2dyYWJfZm9saW8oc3RydWN0IGZvbGlvICpmb2xpbywgaW50IHJlZnMsXFxuLS1cXG5tbS9pbnRlcm5hbC5oLTEyODUtLypcXG5tbS9pbnRlcm5hbC5oOjEyODY6ICogbW0vaHVnZV9tZW1vcnkuY1xcbm1tL2ludGVybmFsLmgtMTI4Ny0gKi9cXG4tLVxcbm1tL2todWdlcGFnZWQuYz0zMz1lbnVtIHNjYW5fcmVzdWx0IHtcXG4tLVxcbm1tL2todWdlcGFnZWQuYy02OC0jZGVmaW5lIENSRUFURV9UUkFDRV9QT0lOVFNcXG5tbS9raHVnZXBhZ2VkLmM6Njk6I2luY2x1ZGUgXFx1MDAzY3RyYWNlL2V2ZW50cy9odWdlX21lbW9yeS5oXFx1MDAzZVxcbm1tL2todWdlcGFnZWQuYy03MC1cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDdUMjE6NTU6MzcuMTkwOTUxNjM1WiIsIlNlcSI6MTEsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjIwNTQzODM5OTIsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGhlcmUncyBteSBpbnRlcnByZXRhdGlvbiBvZiB0aGF0IHRob3VnaHQgcHJvY2VzcywgYXMgaWYgaXQgd2VyZSBteSBvd246XG5cbioqSW52ZXN0aWdhdGluZyB0aGUgRGVwZW5kZW5jeSBvZiBIdWdlIE1lbW9yeSBTdXBwb3J0KipcblxuUmlnaHQsIHNvIGBodWdlX21lbW9yeS5vYCBpcyB0aHJvd2luZyBhIGZpdCwgYW5kIEkga25vdyB0aGF0IG1lYW5zIGl0IG5lZWRzIHRyYW5zcGFyZW50IGh1Z2UgcGFnZXMgZW5hYmxlZC4gVGhlIGZpcnN0IGxvZ2ljYWwgc3RlcCBpcyB0byBjb25maXJtIHRoZSBkZXBlbmRlbmN5LiBJIG5lZWQgdG8gZGlnIGludG8gdGhlIGtlcm5lbCBjb25maWd1cmF0aW9uIHRvIGJlIHN1cmUuIFNvLCBJIG5lZWQgdG8gY2hlY2sgdGhlIEtjb25maWcgZGVmaW5pdGlvbiBvZiBgVFJBTlNQQVJFTlRfSFVHRVBBR0VgLiBUaGF0J3Mgd2hlcmUgYWxsIHRoZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgYXJlIGRlY2xhcmVkLCBhbmQgdGhlIGRlcGVuZGVuY2llcyBhcmUgc3BlbGxlZCBvdXQuIEl0J3MgbGlrZWx5IGluIGBtbS9LY29uZmlnYCwgYXMgdGhlIG1lbW9yeSBtYW5hZ2VtZW50IHN1YnN5c3RlbSBpcyB0aGUgb2J2aW91cyBwbGFjZSBmb3IgdGhhdC4gTGV0J3MgZ28gdGFrZSBhIGxvb2sgdGhlcmUgYW5kIGNvbmZpcm0gdGhhdCBgQ09ORklHX1RSQU5TUEFSRU5UX0hVR0VQQUdFYCBpcyBpbmRlZWQgYSBoYXJkIHJlcXVpcmVtZW50IGZvciB0aGUgZnVuY3Rpb25hbGl0eSBJJ20gdHJ5aW5nIHRvIGVuYWJsZS5cblxuXG4iLCJJbnB1dFRva2VucyI6MTYzODMsIk91dHB1dFRva2VucyI6MzAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo0OCwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0wN1QyMTo1NTozOS4yNDUzMzg3OTdaIiwiU2VxIjoxMiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjExMDM5ODk2NSwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwibW0vXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm1tL0tjb25maWc9ODMyPWNvbmZpZyBNTV9JRFxcbi0tXFxubW0vS2NvbmZpZy04MzQtXFxubW0vS2NvbmZpZzo4MzU6bWVudWNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRVxcbm1tL0tjb25maWctODM2LVxcdGJvb2wgXFxcIlRyYW5zcGFyZW50IEh1Z2VwYWdlIFN1cHBvcnRcXFwiXFxuLS1cXG5tbS9LY29uZmlnPTg1Mz1jaG9pY2VcXG4tLVxcbm1tL0tjb25maWctODU4LVxcbm1tL0tjb25maWc6ODU5OlxcdGNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRV9BTFdBWVNcXG5tbS9LY29uZmlnLTg2MC1cXHRcXHRib29sIFxcXCJhbHdheXNcXFwiXFxuLS1cXG5tbS9LY29uZmlnLTg2NS1cXG5tbS9LY29uZmlnOjg2NjpcXHRjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VfTUFEVklTRVxcbm1tL0tjb25maWctODY3LVxcdFxcdGJvb2wgXFxcIm1hZHZpc2VcXFwiXFxuLS1cXG5tbS9LY29uZmlnLTg3NC1cXG5tbS9LY29uZmlnOjg3NTpcXHRjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VfTkVWRVJcXG5tbS9LY29uZmlnLTg3Ni1cXHRcXHRib29sIFxcXCJuZXZlclxcXCJcXG4tLVxcbm1tL0tjb25maWc9ODgyPWNob2ljZVxcbi0tXFxubW0vS2NvbmZpZy04OTEtXFxubW0vS2NvbmZpZzo4OTI6XFx0Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX1NITUVNX0hVR0VfTkVWRVJcXG5tbS9LY29uZmlnLTg5My1cXHRcXHRib29sIFxcXCJuZXZlclxcXCJcXG4tLVxcbm1tL0tjb25maWctOTAxLVxcbm1tL0tjb25maWc6OTAyOlxcdGNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRV9TSE1FTV9IVUdFX0FMV0FZU1xcbm1tL0tjb25maWctOTAzLVxcdFxcdGJvb2wgXFxcImFsd2F5c1xcXCJcXG4tLVxcbm1tL0tjb25maWctOTA5LVxcbm1tL0tjb25maWc6OTEwOlxcdGNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRV9TSE1FTV9IVUdFX1dJVEhJTl9TSVpFXFxubW0vS2NvbmZpZy05MTEtXFx0XFx0Ym9vbCBcXFwid2l0aGluX3NpemVcXFwiXFxuLS1cXG5tbS9LY29uZmlnLTkxNy1cXG5tbS9LY29uZmlnOjkxODpcXHRjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VfU0hNRU1fSFVHRV9BRFZJU0VcXG5tbS9LY29uZmlnLTkxOS1cXHRcXHRib29sIFxcXCJhZHZpc2VcXFwiXFxuLS1cXG5tbS9LY29uZmlnPTkyNz1jaG9pY2VcXG4tLVxcbm1tL0tjb25maWctOTM2LVxcbm1tL0tjb25maWc6OTM3OlxcdGNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRV9UTVBGU19IVUdFX05FVkVSXFxubW0vS2NvbmZpZy05MzgtXFx0XFx0Ym9vbCBcXFwibmV2ZXJcXFwiXFxuLS1cXG5tbS9LY29uZmlnLTk0NS1cXG5tbS9LY29uZmlnOjk0NjpcXHRjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VfVE1QRlNfSFVHRV9BTFdBWVNcXG5tbS9LY29uZmlnLTk0Ny1cXHRcXHRib29sIFxcXCJhbHdheXNcXFwiXFxuLS1cXG5tbS9LY29uZmlnLTk1My1cXG5tbS9LY29uZmlnOjk1NDpcXHRjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VfVE1QRlNfSFVHRV9XSVRISU5fU0laRVxcbm1tL0tjb25maWctOTU1LVxcdFxcdGJvb2wgXFxcIndpdGhpbl9zaXplXFxcIlxcbi0tXFxubW0vS2NvbmZpZy05NjEtXFxubW0vS2NvbmZpZzo5NjI6XFx0Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX1RNUEZTX0hVR0VfQURWSVNFXFxubW0vS2NvbmZpZy05NjMtXFx0XFx0Ym9vbCBcXFwiYWR2aXNlXFxcIlxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wN1QyMTo1NTozOS4zNTU3NDIwMDJaIiwiU2VxIjoxMywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6MjE3NjE2MTMyOCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IHRha2Ugb24gdGhlIGRlcGVuZGVuY2llcyBvZiBgVFJBTlNQQVJFTlRfSFVHRVBBR0VgIGluIGBtbS9LY29uZmlnYCwgYXMgaWYgSSB3ZXJlIHRoZSBvbmUgdGhpbmtpbmcgaXQgdGhyb3VnaDpcblxuKipEZWNvbnN0cnVjdGluZyBUUkFOU1BBUkVOVF9IVUdFUEFHRSBEZXBlbmRlbmNpZXMqKlxuXG5Pa2F5LCBsZXQncyBkaXZlIGludG8gdGhlIGBtbS9LY29uZmlnYCBmaWxlIGFuZCBmaWd1cmUgb3V0IHdoYXQgbWFrZXMgYFRSQU5TUEFSRU5UX0hVR0VQQUdFYCB0aWNrLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCB3aGF0IG90aGVyIGtlcm5lbCBmZWF0dXJlcywgY29uZmlndXJhdGlvbiBvcHRpb25zLCBvciBhcmNoaXRlY3R1cmFsIGNvbnN0cmFpbnRzIGRpY3RhdGUgd2hldGhlciB0aGlzIHRoaW5nIGlzIGV2ZW4gKnBvc3NpYmxlKiB0byBlbmFibGUsIG11Y2ggbGVzcyAqYSBnb29kIGlkZWEqLiBObyBkb3VidCB0aGVyZSBhcmUgZGVwZW5kZW5jaWVzIG9uIHBhZ2Ugc2l6ZSwgbWF5YmUgc3BlY2lmaWMgQ1BVIGFyY2hpdGVjdHVyZXMsIGFuZCBwcm9iYWJseSBzb21lIGludGVyYWN0aW9uIHdpdGggTlVNQSBjb25maWd1cmF0aW9ucy4gSSdtIGVzcGVjaWFsbHkgaW50ZXJlc3RlZCBpbiB3aGV0aGVyIHRoZXJlIGFyZSBoYXJkIGRlcGVuZGVuY2llcyBvciBqdXN0IFwiaW1wbGllc1wiIHJlbGF0aW9uc2hpcHMuIEFyZSB0aGVyZSBhbnkgZmVhdHVyZXMgd2hpY2ggcmVxdWlyZSBpdCwgb3Igd2hpY2ggaXQgcmVxdWlyZXM/IEknbGwgcHJvYmFibHkgYmUgbG9va2luZyBmb3Igb3B0aW9ucyByZWxhdGVkIHRvIG1lbW9yeSBtYW5hZ2VtZW50IGFuZCBhbGxvY2F0aW9uLiBJ4oCZbSB0aGlua2luZyBhYm91dCBwZXJmb3JtYW5jZSBjb25zaWRlcmF0aW9ucyB0b28g4oCTIGh1Z2VwYWdlcyBhcmUgYSBkb3VibGUtZWRnZWQgc3dvcmQsIHNvIHRoZSAqY29uZGl0aW9ucyogZm9yIHRoZWlyIHVzZSBtdXN0IGJlIGNhcmVmdWxseSBjb25zaWRlcmVkLiBJdCdzIHRpbWUgdG8gc2lmdCB0aHJvdWdoIHRoZSBLY29uZmlnIGFuZCBicmVhayB0aGlzIGRvd24uXG5cblxuIiwiSW5wdXRUb2tlbnMiOjE3MzU1LCJPdXRwdXRUb2tlbnMiOjMyLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjQsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMDdUMjE6NTU6NDEuNTMxOTA2MzJaIiwiU2VxIjoxNCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTQ3MjQwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcIm1tL0tjb25maWdcIixcbiAgXCJGaXJzdExpbmVcIjogODMwLFxuICBcIkxpbmVDb3VudFwiOiA0MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgODMwOlxcdFxcdCAgbWVtb3J5IGNvbnN0cmFpbmVkLlxcbiA4MzE6XFx0XFxuIDgzMjpcXHRjb25maWcgTU1fSURcXG4gODMzOlxcdFxcdGRlZl9ib29sIG5cXG4gODM0OlxcdFxcbiA4MzU6XFx0bWVudWNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRVxcbiA4MzY6XFx0XFx0Ym9vbCBcXFwiVHJhbnNwYXJlbnQgSHVnZXBhZ2UgU3VwcG9ydFxcXCJcXG4gODM3OlxcdFxcdGRlcGVuZHMgb24gSEFWRV9BUkNIX1RSQU5TUEFSRU5UX0hVR0VQQUdFIFxcdTAwMjZcXHUwMDI2ICFQUkVFTVBUX1JUXFxuIDgzODpcXHRcXHRzZWxlY3QgQ09NUEFDVElPTlxcbiA4Mzk6XFx0XFx0c2VsZWN0IFhBUlJBWV9NVUxUSVxcbiA4NDA6XFx0XFx0c2VsZWN0IE1NX0lEXFxuIDg0MTpcXHRcXHRoZWxwXFxuIDg0MjpcXHRcXHQgIFRyYW5zcGFyZW50IEh1Z2VwYWdlcyBhbGxvd3MgdGhlIGtlcm5lbCB0byB1c2UgaHVnZSBwYWdlcyBhbmRcXG4gODQzOlxcdFxcdCAgaHVnZSB0bGIgdHJhbnNwYXJlbnRseSB0byB0aGUgYXBwbGljYXRpb25zIHdoZW5ldmVyIHBvc3NpYmxlLlxcbiA4NDQ6XFx0XFx0ICBUaGlzIGZlYXR1cmUgY2FuIGltcHJvdmUgY29tcHV0aW5nIHBlcmZvcm1hbmNlIHRvIGNlcnRhaW5cXG4gODQ1OlxcdFxcdCAgYXBwbGljYXRpb25zIGJ5IHNwZWVkaW5nIHVwIHBhZ2UgZmF1bHRzIGR1cmluZyBtZW1vcnlcXG4gODQ2OlxcdFxcdCAgYWxsb2NhdGlvbiwgYnkgcmVkdWNpbmcgdGhlIG51bWJlciBvZiB0bGIgbWlzc2VzIGFuZCBieSBzcGVlZGluZ1xcbiA4NDc6XFx0XFx0ICB1cCB0aGUgcGFnZXRhYmxlIHdhbGtpbmcuXFxuIDg0ODpcXHRcXG4gODQ5OlxcdFxcdCAgSWYgbWVtb3J5IGNvbnN0cmFpbmVkIG9uIGVtYmVkZGVkLCB5b3UgbWF5IHdhbnQgdG8gc2F5IE4uXFxuIDg1MDpcXHRcXG4gODUxOlxcdGlmIFRSQU5TUEFSRU5UX0hVR0VQQUdFXFxuIDg1MjpcXHRcXG4gODUzOlxcdGNob2ljZVxcbiA4NTQ6XFx0XFx0cHJvbXB0IFxcXCJUcmFuc3BhcmVudCBIdWdlcGFnZSBTdXBwb3J0IHN5c2ZzIGRlZmF1bHRzXFxcIlxcbiA4NTU6XFx0XFx0ZGVmYXVsdCBUUkFOU1BBUkVOVF9IVUdFUEFHRV9BTFdBWVNcXG4gODU2OlxcdFxcdGhlbHBcXG4gODU3OlxcdFxcdCAgU2VsZWN0cyB0aGUgc3lzZnMgZGVmYXVsdHMgZm9yIFRyYW5zcGFyZW50IEh1Z2VwYWdlIFN1cHBvcnQuXFxuIDg1ODpcXHRcXG4gODU5OlxcdFxcdGNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRV9BTFdBWVNcXG4gODYwOlxcdFxcdFxcdGJvb2wgXFxcImFsd2F5c1xcXCJcXG4gODYxOlxcdFxcdGhlbHBcXG4gODYyOlxcdFxcdCAgRW5hYmxpbmcgVHJhbnNwYXJlbnQgSHVnZXBhZ2UgYWx3YXlzLCBjYW4gaW5jcmVhc2UgdGhlXFxuIDg2MzpcXHRcXHQgIG1lbW9yeSBmb290cHJpbnQgb2YgYXBwbGljYXRpb25zIHdpdGhvdXQgYSBndWFyYW50ZWVkXFxuIDg2NDpcXHRcXHQgIGJlbmVmaXQgYnV0IGl0IHdpbGwgd29yayBhdXRvbWF0aWNhbGx5IGZvciBhbGwgYXBwbGljYXRpb25zLlxcbiA4NjU6XFx0XFxuIDg2NjpcXHRcXHRjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VfTUFEVklTRVxcbiA4Njc6XFx0XFx0XFx0Ym9vbCBcXFwibWFkdmlzZVxcXCJcXG4gODY4OlxcdFxcdGhlbHBcXG4gODY5OlxcdFxcdCAgRW5hYmxpbmcgVHJhbnNwYXJlbnQgSHVnZXBhZ2UgbWFkdmlzZSwgd2lsbCBvbmx5IHByb3ZpZGUgYVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wN1QyMTo1NTo0MS41MzIwNTYyNloiLCJTZXEiOjE1LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjoyNTM5OTg4Mzg1LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyBUcmFuc3BhcmVudCBIdWdlIFBhZ2VzIENvbmZpZ3VyYXRpb24qKlxuXG5Pa2F5LCBzbyB0aGUgbWFpbiB0aGluZyB0byBiZSBsb29raW5nIGF0IGhlcmUgaXMgYENPTkZJR19UUkFOU1BBUkVOVF9IVUdFUEFHRWAuIFRoYXQncyB0aGUgY29yZSBzZXR0aW5nLCBzbyBldmVyeXRoaW5nIGVsc2UgaXMgcHJvYmFibHkgY29udGluZ2VudCBvbiBpdC4gTXkgaW1tZWRpYXRlIHRob3VnaHQgaXMgdG8gdW5kZXJzdGFuZCBob3cgdGhlIHN5c3RlbSBkZWNpZGVzIHdoYXQga2luZCBvZiBodWdlIHBhZ2VzIGl0J3MgZ29pbmcgdG8gYWxsb3cgZm9yIGEgZ2l2ZW4gVk1BLiBJIG5lZWQgdG8gZGlnIGludG8gdGhlIGRlY2lzaW9uLW1ha2luZyBwcm9jZXNzLlxuXG5NeSBuZXh0IHN0ZXAgaXMgdG8gZXhhbWluZSB0aGUgZnVuY3Rpb24gY2FsbHMgZm9yIGBfX3RocF92bWFfYWxsb3dhYmxlX29yZGVyc2AgYW5kIGB0aHBfdm1hX2FsbG93YWJsZV9vcmRlcnNgLiBUaGVzZSBmdW5jdGlvbnMgYXJlICprZXkqIGhlcmUsIHRoaXMgaXMgd2hlcmUgdGhlIHBvbGljeSBpcyBzZXQuIEkgbmVlZCB0byB1bmRlcnN0YW5kIHdoYXQgcGFyYW1ldGVycyBhcmUgYmVpbmcgcGFzc2VkLCB3aGVyZSB0aGVzZSBmdW5jdGlvbnMgYXJlIGJlaW5nIHVzZWQsIGFuZCB3aGF0IGZhY3RvcnMgaW5mbHVlbmNlIHRoZWlyIHJldHVybiB2YWx1ZXMuIEknbGwgbmVlZCB0byBwYXkgY2xvc2UgYXR0ZW50aW9uIHRvIGFueSBzeW1ib2xzIGxpc3RlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhcyAqRm9jdXNTeW1ib2xzKi5cblxuVG8gZ2V0IGEgZnVsbCBwaWN0dXJlLCBhIGdyZXAgYWNyb3NzIHRoZSBlbnRpcmUga2VybmVsIHNvdXJjZSBpcyB0aGUgb2J2aW91cyBuZXh0IHN0ZXAuIEkgbmVlZCBhIGNvbXByZWhlbnNpdmUgbGlzdCBvZiBldmVyeSBpbnN0YW5jZSB3aGVyZSB0aG9zZSB0d28gZnVuY3Rpb25zIGFyZSBpbnZva2VkLiBUaGlzIHdpbGwgaWxsdW1pbmF0ZSB0aGUgZGlmZmVyZW50IGNvbnRleHRzIGluIHdoaWNoIGh1Z2UgcGFnZSBhbGxvY2F0aW9uIGlzIGNvbnNpZGVyZWQsIGFsbG93aW5nIG1lIHRvIGJ1aWxkIGEgY29tcGxldGUgbWVudGFsIG1vZGVsIG9mIGhvdyB0aGUgc3lzdGVtIGhhbmRsZXMgaXQuIFdpdGggdGhpcyBpbmZvcm1hdGlvbiwgSSBjYW4gZXZhbHVhdGUgdGhlIHBlcmZvcm1hbmNlIGltcGxpY2F0aW9ucyBhbmQgcG90ZW50aWFsIHZ1bG5lcmFiaWxpdGllcy5cblxuXG4iLCJJbnB1dFRva2VucyI6MTgxOTQsIk91dHB1dFRva2VucyI6MzIsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo5NSwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA3VDIxOjU1OjQ0LjA3MjA0NzE0NVoiLCJTZXEiOjE2LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6ODgxNTUwNTQsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwidGhwX3ZtYV9hbGxvd2FibGVfb3JkZXJzXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIm1tL1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJtbS9odWdlX21lbW9yeS5jPTE1Mz1zdGF0aWMgYm9vbCB2bWFfZmlsZV9jYW5fbWFwX2h1Z2UoY29uc3Qgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXFxuLS1cXG5tbS9odWdlX21lbW9yeS5jLTE1OS1cXHQgKiBFbmZvcmNlIFRIUCBjb2xsYXBzZSByZXF1aXJlbWVudHMgYXMgbmVjZXNzYXJ5LiBBbm9ueW1vdXMgdm1hc1xcbm1tL2h1Z2VfbWVtb3J5LmM6MTYwOlxcdCAqIHdlcmUgYWxyZWFkeSBoYW5kbGVkIGluIHRocF92bWFfYWxsb3dhYmxlX29yZGVycygpLlxcbm1tL2h1Z2VfbWVtb3J5LmMtMTYxLVxcdCAqL1xcbi0tXFxubW0vaHVnZV9tZW1vcnkuYy0xODEtXFxubW0vaHVnZV9tZW1vcnkuYzoxODI6dW5zaWduZWQgbG9uZyBfX3RocF92bWFfYWxsb3dhYmxlX29yZGVycyhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcXG5tbS9odWdlX21lbW9yeS5jLTE4My1cXHRcXHRcXHRcXHRcXHQgdm1fZmxhZ3NfdCB2bV9mbGFncyxcXG4tLVxcbm1tL2todWdlcGFnZWQuYz01Njg9c3RhdGljIHVuc2lnbmVkIGxvbmcgY29sbGFwc2VfcG9zc2libGVfb3JkZXJzKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxcbi0tXFxubW0va2h1Z2VwYWdlZC5jLTU3OC1cXG5tbS9raHVnZXBhZ2VkLmM6NTc5OlxcdHJldHVybiB0aHBfdm1hX2FsbG93YWJsZV9vcmRlcnModm1hLCB2bV9mbGFncywgdHZhX2ZsYWdzLCBvcmRlcnMpO1xcbm1tL2todWdlcGFnZWQuYy01ODAtfVxcbi0tXFxubW0va2h1Z2VwYWdlZC5jPTEwNjQ9c3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgaHVnZXBhZ2Vfdm1hX3JldmFsaWRhdGUoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgYWRkcmVzcyxcXG4tLVxcbm1tL2todWdlcGFnZWQuYy0xMDg3LVxcdFxcdHJldHVybiBTQ0FOX0FERFJFU1NfUkFOR0U7XFxubW0va2h1Z2VwYWdlZC5jOjEwODg6XFx0aWYgKCF0aHBfdm1hX2FsbG93YWJsZV9vcmRlcnModm1hLCB2bWEtXFx1MDAzZXZtX2ZsYWdzLCB0eXBlLCBCSVQob3JkZXIpKSlcXG5tbS9raHVnZXBhZ2VkLmMtMTA4OS1cXHRcXHRyZXR1cm4gU0NBTl9WTUFfQ0hFQ0s7XFxuLS1cXG5tbS9raHVnZXBhZ2VkLmMtMTA5My1cXHQgKlxcbm1tL2todWdlcGFnZWQuYzoxMDk0OlxcdCAqIHRocF92bWFfYWxsb3dhYmxlX29yZGVycygpIG1heSByZXR1cm4gdHJ1ZSBmb3IgcXVhbGlmaWVkIGZpbGVcXG5tbS9raHVnZXBhZ2VkLmMtMTA5NS1cXHQgKiB2bWFzLlxcbi0tXFxubW0vbWVtb3J5LmM9NDc5NT1zdGF0aWMgdW5zaWduZWQgbG9uZyB0aHBfc3dhcGluX3N1aXRhYmxlX29yZGVycyhzdHJ1Y3Qgdm1fZmF1bHQgKnZtZilcXG4tLVxcbm1tL21lbW9yeS5jLTQ4MjQtXFx0ICovXFxubW0vbWVtb3J5LmM6NDgyNTpcXHRvcmRlcnMgPSB0aHBfdm1hX2FsbG93YWJsZV9vcmRlcnModm1hLCB2bWEtXFx1MDAzZXZtX2ZsYWdzLCBUVkFfUEFHRUZBVUxULFxcbm1tL21lbW9yeS5jLTQ4MjYtXFx0XFx0XFx0XFx0XFx0ICBCSVQoUE1EX09SREVSKSAtIDEpO1xcbi0tXFxubW0vbWVtb3J5LmM9NTMwMT1zdGF0aWMgc3RydWN0IGZvbGlvICphbGxvY19hbm9uX2ZvbGlvKHN0cnVjdCB2bV9mYXVsdCAqdm1mKVxcbi0tXFxubW0vbWVtb3J5LmMtNTMyMy1cXHQgKi9cXG5tbS9tZW1vcnkuYzo1MzI0OlxcdG9yZGVycyA9IHRocF92bWFfYWxsb3dhYmxlX29yZGVycyh2bWEsIHZtYS1cXHUwMDNldm1fZmxhZ3MsIFRWQV9QQUdFRkFVTFQsXFxubW0vbWVtb3J5LmMtNTMyNS1cXHRcXHRcXHRcXHRcXHQgIEJJVChQTURfT1JERVIpIC0gMSk7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA3VDIxOjU1OjQ0LjE2MDIwNjkwOVoiLCJTZXEiOjE3LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjoyNzQ2ODQwNDAzLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgbXkgdGhpbmtpbmc6XG5cbioqSW52ZXN0aWdhdGluZyBDYWxsZXJzIFJlbGF0ZWQgdG8gSHVnZSBQYWdlcyoqXG5cbk9rYXksIEkgbmVlZCB0byBleHBhbmQgbXkgc2VhcmNoIHRvIGlkZW50aWZ5ICphbGwqIHRoZSBwbGFjZXMgd2l0aGluIHRoZSBrZXJuZWwgdGhhdCBpbnRlcmFjdCB3aXRoIGh1Z2UgcGFnZXMuIFRoZSBpbml0aWFsIHNlYXJjaCB3YXMgYSBnb29kIHN0YXJ0LCBidXQgSSBrbm93IHRoZXJlIGFyZSBsaWtlbHkgbW9yZSBzY2F0dGVyZWQgY2FsbHMuIE15IGluc3RpbmN0IGlzIHRvIHJ1biBhIGBncmVwYCBjb21tYW5kLCBidXQgbm93IEkgbmVlZCB0byBkZXRlcm1pbmUgd2hlcmUgdG8gZm9jdXMgaXQuIE15IGltbWVkaWF0ZSB0aG91Z2h0IGlzIHRvIHRhcmdldCBhIGNvdXBsZSBvZiBrZXkgYXJlYXMuXG5cbkZpcnN0LCB0aGUgYGZzL3Byb2MvYCBkaXJlY3RvcnkgaXMgYSBsaWtlbHkgY2FuZGlkYXRlIGJlY2F1c2UgdGhlIHByb2MgZmlsZXN5c3RlbSBwcm92aWRlcyBhIHdpbmRvdyBpbnRvIHZhcmlvdXMga2VybmVsIGludGVybmFscywgaW5jbHVkaW5nIG1lbW9yeSBtYW5hZ2VtZW50LiBJdCdzIGEgcHJpbWUgc3BvdCB0byBmaW5kIGNvZGUgdGhhdCBleHBvc2VzIG9yIG1hbmlwdWxhdGVzIGh1Z2UgcGFnZSBpbmZvcm1hdGlvbi4gU28gdGhhdCBzaG91bGQgYmUgYSB1c2VmdWwgc2VhcmNoLlxuXG5UaGVuLCB0byBiZSB0aG9yb3VnaCwgSSBzaG91bGQgYWxzbyBsb29rIGF0IHRoZSBpbmNsdWRlIGZpbGVzLiBJdCdzIGFsbW9zdCBndWFyYW50ZWVkIHRoZSBkZWZpbml0aW9uIG9mIHRoZSBzdHJ1Y3R1cmVzLCBhbmQgcmVsYXRlZCBtYWNyb3MsIGFyZSBpbiB0aGUgYGluY2x1ZGUvbGludXgvaHVnZV9tbS5oYCBoZWFkZXIgZmlsZS4gQnkgZ3JlcHBpbmcgdGhpcyBmaWxlIEkgY2FuIGZpbmQgYW55IHBvdGVudGlhbCBjYWxsZXJzIGRpcmVjdGx5LCBpbmNsdWRpbmcgd2l0aGluIHJlbGF0ZWQgaGVhZGVyIGZpbGVzLiBcblxuQnkgY29tYmluaW5nIHRoZXNlIHR3byBzZWFyY2hlcywgSSBzaG91bGQgZ2V0IGEgY29tcHJlaGVuc2l2ZSB2aWV3IG9mIHRoZSBjb2RlYmFzZSBhbmQgaWRlbnRpZnkgYW55IG92ZXJsb29rZWQgY2FsbHMgb3IgcG90ZW50aWFsbHkgb2JzY3VyZSBpbnRlcmFjdGlvbnMuIEl0IHNob3VsZCBiZSBhIGdvb2Qgc3RhcnRpbmcgcG9pbnQgZm9yIGEgbW9yZSBpbi1kZXB0aCBpbnZlc3RpZ2F0aW9uLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxOTMyOCwiT3V0cHV0VG9rZW5zIjoyNCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjI5LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA3VDIxOjU1OjQ2LjkwNzA1MDYzM1oiLCJTZXEiOjE4LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MjQ3ODg4MzAzNiwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJ0aHBfdm1hX2FsbG93YWJsZV9vcmRlcnNcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiZnMvcHJvYy90YXNrX21tdS5jPTE0NTk9c3RhdGljIGludCBzaG93X3NtYXAoc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp2KVxcbi0tXFxuZnMvcHJvYy90YXNrX21tdS5jLTE0NzYtXFx0c2VxX3ByaW50ZihtLCBcXFwiVEhQZWxpZ2libGU6ICAgICU4dVxcXFxuXFxcIixcXG5mcy9wcm9jL3Rhc2tfbW11LmM6MTQ3NzpcXHRcXHQgICAhIXRocF92bWFfYWxsb3dhYmxlX29yZGVycyh2bWEsIHZtYS1cXHUwMDNldm1fZmxhZ3MsIFRWQV9TTUFQUyxcXG5mcy9wcm9jL3Rhc2tfbW11LmMtMTQ3OC1cXHRcXHRcXHRcXHRcXHQgICAgICBUSFBfT1JERVJTX0FMTCkpO1xcbi0tXFxuaW5jbHVkZS9saW51eC9odWdlX21tLmg9OTc9ZW51bSB0dmFfdHlwZSB7XFxuLS1cXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaC0xMDQtI2RlZmluZSB0aHBfdm1hX2FsbG93YWJsZV9vcmRlcih2bWEsIHZtX2ZsYWdzLCB0eXBlLCBvcmRlcikgXFxcXFxcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oOjEwNTpcXHQoISF0aHBfdm1hX2FsbG93YWJsZV9vcmRlcnModm1hLCB2bV9mbGFncywgdHlwZSwgQklUKG9yZGVyKSkpXFxuaW5jbHVkZS9saW51eC9odWdlX21tLmgtMTA2LVxcbi0tXFxuaW5jbHVkZS9saW51eC9odWdlX21tLmg9Mjc2PXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyB0aHBfdm1hX3N1aXRhYmxlX29yZGVycyhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcXG4tLVxcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oLTI5OC1cXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaDoyOTk6dW5zaWduZWQgbG9uZyBfX3RocF92bWFfYWxsb3dhYmxlX29yZGVycyhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaC0zMDAtXFx0XFx0XFx0XFx0XFx0IHZtX2ZsYWdzX3Qgdm1fZmxhZ3MsXFxuLS1cXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaC0zMDQtLyoqXFxuaW5jbHVkZS9saW51eC9odWdlX21tLmg6MzA1OiAqIHRocF92bWFfYWxsb3dhYmxlX29yZGVycyAtIGRldGVybWluZSBodWdlcGFnZSBvcmRlcnMgdGhhdCBhcmUgYWxsb3dlZCBmb3Igdm1hXFxuaW5jbHVkZS9saW51eC9odWdlX21tLmgtMzA2LSAqIEB2bWE6ICB0aGUgdm0gYXJlYSB0byBjaGVja1xcbi0tXFxuaW5jbHVkZS9saW51eC9odWdlX21tLmg9MzE5PXN0YXRpYyBpbmxpbmVcXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaDozMjA6dW5zaWduZWQgbG9uZyB0aHBfdm1hX2FsbG93YWJsZV9vcmRlcnMoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXFxuaW5jbHVkZS9saW51eC9odWdlX21tLmgtMzIxLVxcdFxcdFxcdFxcdCAgICAgICB2bV9mbGFnc190IHZtX2ZsYWdzLFxcbi0tXFxuaW5jbHVkZS9saW51eC9odWdlX21tLmgtMzQyLVxcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oOjM0MzpcXHRyZXR1cm4gX190aHBfdm1hX2FsbG93YWJsZV9vcmRlcnModm1hLCB2bV9mbGFncywgdHlwZSwgb3JkZXJzKTtcXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaC0zNDQtfVxcbi0tXFxuaW5jbHVkZS9saW51eC9odWdlX21tLmg9NjE5PXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyB0aHBfdm1hX3N1aXRhYmxlX29yZGVycyhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcXG4tLVxcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oLTYyNC1cXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaDo2MjU6c3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHRocF92bWFfYWxsb3dhYmxlX29yZGVycyhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaC02MjYtXFx0XFx0XFx0XFx0XFx0dm1fZmxhZ3NfdCB2bV9mbGFncyxcXG4tLVxcbm1tL2h1Z2VfbWVtb3J5LmM9MTUzPXN0YXRpYyBib29sIHZtYV9maWxlX2Nhbl9tYXBfaHVnZShjb25zdCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcXG4tLVxcbm1tL2h1Z2VfbWVtb3J5LmMtMTU5LVxcdCAqIEVuZm9yY2UgVEhQIGNvbGxhcHNlIHJlcXVpcmVtZW50cyBhcyBuZWNlc3NhcnkuIEFub255bW91cyB2bWFzXFxubW0vaHVnZV9tZW1vcnkuYzoxNjA6XFx0ICogd2VyZSBhbHJlYWR5IGhhbmRsZWQgaW4gdGhwX3ZtYV9hbGxvd2FibGVfb3JkZXJzKCkuXFxubW0vaHVnZV9tZW1vcnkuYy0xNjEtXFx0ICovXFxuLS1cXG5tbS9odWdlX21lbW9yeS5jLTE4MS1cXG5tbS9odWdlX21lbW9yeS5jOjE4Mjp1bnNpZ25lZCBsb25nIF9fdGhwX3ZtYV9hbGxvd2FibGVfb3JkZXJzKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxcbm1tL2h1Z2VfbWVtb3J5LmMtMTgzLVxcdFxcdFxcdFxcdFxcdCB2bV9mbGFnc190IHZtX2ZsYWdzLFxcbi0tXFxubW0va2h1Z2VwYWdlZC5jPTU2OD1zdGF0aWMgdW5zaWduZWQgbG9uZyBjb2xsYXBzZV9wb3NzaWJsZV9vcmRlcnMoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXFxuLS1cXG5tbS9raHVnZXBhZ2VkLmMtNTc4LVxcbm1tL2todWdlcGFnZWQuYzo1Nzk6XFx0cmV0dXJuIHRocF92bWFfYWxsb3dhYmxlX29yZGVycyh2bWEsIHZtX2ZsYWdzLCB0dmFfZmxhZ3MsIG9yZGVycyk7XFxubW0va2h1Z2VwYWdlZC5jLTU4MC19XFxuLS1cXG5tbS9raHVnZXBhZ2VkLmM9MTA2ND1zdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBodWdlcGFnZV92bWFfcmV2YWxpZGF0ZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBhZGRyZXNzLFxcbi0tXFxubW0va2h1Z2VwYWdlZC5jLTEwODctXFx0XFx0cmV0dXJuIFNDQU5fQUREUkVTU19SQU5HRTtcXG5tbS9raHVnZXBhZ2VkLmM6MTA4ODpcXHRpZiAoIXRocF92bWFfYWxsb3dhYmxlX29yZGVycyh2bWEsIHZtYS1cXHUwMDNldm1fZmxhZ3MsIHR5cGUsIEJJVChvcmRlcikpKVxcbm1tL2todWdlcGFnZWQuYy0xMDg5LVxcdFxcdHJldHVybiBTQ0FOX1ZNQV9DSEVDSztcXG4tLVxcbm1tL2todWdlcGFnZWQuYy0xMDkzLVxcdCAqXFxubW0va2h1Z2VwYWdlZC5jOjEwOTQ6XFx0ICogdGhwX3ZtYV9hbGxvd2FibGVfb3JkZXJzKCkgbWF5IHJldHVybiB0cnVlIGZvciBxdWFsaWZpZWQgZmlsZVxcbm1tL2todWdlcGFnZWQuYy0xMDk1LVxcdCAqIHZtYXMuXFxuLS1cXG5tbS9tZW1vcnkuYz00Nzk1PXN0YXRpYyB1bnNpZ25lZCBsb25nIHRocF9zd2FwaW5fc3VpdGFibGVfb3JkZXJzKHN0cnVjdCB2bV9mYXVsdCAqdm1mKVxcbi0tXFxubW0vbWVtb3J5LmMtNDgyNC1cXHQgKi9cXG5tbS9tZW1vcnkuYzo0ODI1OlxcdG9yZGVycyA9IHRocF92bWFfYWxsb3dhYmxlX29yZGVycyh2bWEsIHZtYS1cXHUwMDNldm1fZmxhZ3MsIFRWQV9QQUdFRkFVTFQsXFxubW0vbWVtb3J5LmMtNDgyNi1cXHRcXHRcXHRcXHRcXHQgIEJJVChQTURfT1JERVIpIC0gMSk7XFxuLS1cXG5tbS9tZW1vcnkuYz01MzAxPXN0YXRpYyBzdHJ1Y3QgZm9saW8gKmFsbG9jX2Fub25fZm9saW8oc3RydWN0IHZtX2ZhdWx0ICp2bWYpXFxuLS1cXG5tbS9tZW1vcnkuYy01MzIzLVxcdCAqL1xcbm1tL21lbW9yeS5jOjUzMjQ6XFx0b3JkZXJzID0gdGhwX3ZtYV9hbGxvd2FibGVfb3JkZXJzKHZtYSwgdm1hLVxcdTAwM2V2bV9mbGFncywgVFZBX1BBR0VGQVVMVCxcXG5tbS9tZW1vcnkuYy01MzI1LVxcdFxcdFxcdFxcdFxcdCAgQklUKFBNRF9PUkRFUikgLSAxKTtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDdUMjE6NTU6NDkuMzg1OTQxODI5WiIsIlNlcSI6MTksIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjQyNTM4Mjk1MTIsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqSW52ZXN0aWdhdGluZyBgX190aHBfdm1hX2FsbG93YWJsZV9vcmRlcnNgIGluIHRoZSBIdWdlIFBhZ2VzIFN1YnN5c3RlbSoqXG5cbk9rYXksIHNvIEknbSBsb29raW5nIGF0IGBtbS9odWdlX21lbW9yeS5jYCwgc3BlY2lmaWNhbGx5IGFyb3VuZCB0aGUgVEhQIChUcmFuc3BhcmVudCBIdWdlIFBhZ2VzKSBjb2RlLiBJdCdzIGltbWVkaWF0ZWx5IGludGVyZXN0aW5nIHRoYXQgYF9fdGhwX3ZtYV9hbGxvd2FibGVfb3JkZXJzYCBpc24ndCBzdGF0aWMuIFRoYXQgdGVsbHMgbWUgaXQncyBwb3RlbnRpYWxseSBleHBvc2VkIG91dHNpZGUgb2YgdGhhdCBmaWxlLCB3aGljaCBjb3VsZCBiZSByZWxldmFudC4gTm93LCBsZXQgbWUgcXVpY2tseSBpbnZlbnRvcnkgdGhlIG90aGVyIHN0YXRpYyBmdW5jdGlvbnMgaW4gYG1tL2h1Z2VfbWVtb3J5LmNgIHRvIGdldCB0aGUgY29udGV4dDogYHZtYV9maWxlX2J5cGFzc190aHBfdHVuZWFibGVzYCwgYHZtYV9maWxlX2FsbG93X3RocF90dW5lYWJsZXNgLCBgdm1hX2ZpbGVfY2hlY2tfdGhwX3R1bmVhYmxlc2AsIGB2bWFfZmlsZV9jYW5fbWFwX2h1Z2VgLCBhbmQgYGZpbGVfdGhwX2VuYWJsZWRgLiBUaGVzZSBhbGwgc2VlbSByZWxhdGVkIHRvIFZNQSAoVmlydHVhbCBNZW1vcnkgQXJlYSkgbWFuYWdlbWVudCBhbmQgZmlsZS1iYWNrZWQgVEhQIGNvbmZpZ3VyYXRpb24gb3IgZGVjaXNpb25zLlxuXG5Ob3csIHdoZXJlIGVsc2UgaXMgdGhpcyBzdHVmZiBnZXR0aW5nIGNhbGxlZCBvciByZWxhdGVkIHRvPyBJIHNob3VsZCBleHBhbmQgdGhlIHNlYXJjaCB0byBmaW5kIGNhbGxlcnMuIFNpbmNlIFRIUCBpcyBvZnRlbiByZWxhdGVkIHRvIHRoZSBiYWNrZ3JvdW5kIGRlZnJhZywgaXQncyB3b3J0aCBjaGVja2luZyBga2h1Z2VwYWdlZC5jYC4gSW4gYGtodWdlcGFnZWQuY2AsIGBjb2xsYXBzZV9maWxlYCwgYG1hZHZpc2VfY29sbGFwc2VgLCBgY29sbGFwc2VfcG9zc2libGVfb3JkZXJzYCwgYW5kIGBodWdlcGFnZV92bWFfcmV2YWxpZGF0ZWAgYXJlIG9idmlvdXMgcGxhY2VzIHRvIHN0YXJ0LiBJJ20gZXNwZWNpYWxseSBjdXJpb3VzIGFib3V0IGBtYWR2aXNlYCB3aXRoIGBNQURWX0NPTExBUFNFYC4gVGhpcyBpcyB3aGVyZSB1c2Vyc3BhY2UgZXhwbGljaXRseSByZXF1ZXN0cyBwYWdlIGNvbGxhcHNpbmcuIFRpbWUgdG8gc2VlIGhvdyB0aGF0IHRpZXMgaW50byBldmVyeXRoaW5nLlxuXG5cbiIsIklucHV0VG9rZW5zIjoyMTEzNCwiT3V0cHV0VG9rZW5zIjoyMywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjMwNiwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0wN1QyMTo1NTo1My42Mzk3NzQ5ODFaIiwiU2VxIjoyMCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjIzMDUzMTAzMzEsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiVFZBX0ZPUkNFRF9DT0xMQVBTRVwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJpbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaD05Nz1lbnVtIHR2YV90eXBlIHtcXG4tLVxcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oLTEwMC1cXHRUVkFfS0hVR0VQQUdFRCxcXHRcXHQvKiBLaHVnZXBhZ2VkIGNvbGxhcHNlLiAqL1xcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oOjEwMTpcXHRUVkFfRk9SQ0VEX0NPTExBUFNFLFxcdC8qIEZvcmNlZCBjb2xsYXBzZSAoZS5nLiBNQURWX0NPTExBUFNFKS4gKi9cXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaC0xMDItfTtcXG4tLVxcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oPTMyMD11bnNpZ25lZCBsb25nIHRocF92bWFfYWxsb3dhYmxlX29yZGVycyhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcXG4tLVxcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oLTMyOC1cXHQgKi9cXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaDozMjk6XFx0aWYgKHR5cGUgIT0gVFZBX0ZPUkNFRF9DT0xMQVBTRSBcXHUwMDI2XFx1MDAyNiB2bWFfaXNfYW5vbnltb3VzKHZtYSkpIHtcXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaC0zMzAtXFx0XFx0dW5zaWduZWQgbG9uZyBtYXNrID0gUkVBRF9PTkNFKGh1Z2VfYW5vbl9vcmRlcnNfYWx3YXlzKTtcXG4tLVxcbm1tL2h1Z2VfbWVtb3J5LmM9MTIxPXN0YXRpYyBib29sIHZtYV9maWxlX2J5cGFzc190aHBfdHVuZWFibGVzKGNvbnN0IHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxcbi0tXFxubW0vaHVnZV9tZW1vcnkuYy0xMjYtXFx0LyogTUFEVl9DT0xMQVBTRSBpZ25vcmVzIHR1bmVhYmxlcy4gKi9cXG5tbS9odWdlX21lbW9yeS5jOjEyNzpcXHRpZiAodHlwZSA9PSBUVkFfRk9SQ0VEX0NPTExBUFNFKVxcbm1tL2h1Z2VfbWVtb3J5LmMtMTI4LVxcdFxcdHJldHVybiB0cnVlO1xcbi0tXFxubW0vaHVnZV9tZW1vcnkuYz0xODI9dW5zaWduZWQgbG9uZyBfX3RocF92bWFfYWxsb3dhYmxlX29yZGVycyhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcXG4tLVxcbm1tL2h1Z2VfbWVtb3J5LmMtMTg4LVxcdGNvbnN0IGJvb2wgaW5fcGYgPSB0eXBlID09IFRWQV9QQUdFRkFVTFQ7XFxubW0vaHVnZV9tZW1vcnkuYzoxODk6XFx0Y29uc3QgYm9vbCBmb3JjZWRfY29sbGFwc2UgPSB0eXBlID09IFRWQV9GT1JDRURfQ09MTEFQU0U7XFxubW0vaHVnZV9tZW1vcnkuYy0xOTAtXFx0dW5zaWduZWQgbG9uZyBzdXBwb3J0ZWRfb3JkZXJzO1xcbi0tXFxubW0va2h1Z2VwYWdlZC5jPTEwNjQ9c3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgaHVnZXBhZ2Vfdm1hX3JldmFsaWRhdGUoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgYWRkcmVzcyxcXG4tLVxcbm1tL2todWdlcGFnZWQuYy0xMDY5LVxcdGVudW0gdHZhX3R5cGUgdHlwZSA9IGNjLVxcdTAwM2Vpc19raHVnZXBhZ2VkID8gVFZBX0tIVUdFUEFHRUQgOlxcbm1tL2todWdlcGFnZWQuYzoxMDcwOlxcdFxcdFxcdFxcdCBUVkFfRk9SQ0VEX0NPTExBUFNFO1xcbm1tL2todWdlcGFnZWQuYy0xMDcxLVxcbi0tXFxubW0va2h1Z2VwYWdlZC5jPTE2MDA9c3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgY29sbGFwc2Vfc2Nhbl9wbWQoc3RydWN0IG1tX3N0cnVjdCAqbW0sXFxuLS1cXG5tbS9raHVnZXBhZ2VkLmMtMTYwNi1cXHR1bnNpZ25lZCBpbnQgbWF4X3B0ZXNfbm9uZSA9IGNvbGxhcHNlX21heF9wdGVzX25vbmUoY2MsIHZtYSwgSFBBR0VfUE1EX09SREVSKTtcXG5tbS9raHVnZXBhZ2VkLmM6MTYwNzpcXHRlbnVtIHR2YV90eXBlIHR2YV9mbGFncyA9IGNjLVxcdTAwM2Vpc19raHVnZXBhZ2VkID8gVFZBX0tIVUdFUEFHRUQgOiBUVkFfRk9SQ0VEX0NPTExBUFNFO1xcbm1tL2todWdlcGFnZWQuYy0xNjA4LVxcdHBtZF90ICpwbWQ7XFxuLS1cXG5tbS9raHVnZXBhZ2VkLmM9MTg1MT1zdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCB0cnlfY29sbGFwc2VfcHRlX21hcHBlZF90aHAoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgYWRkcixcXG4tLVxcbm1tL2todWdlcGFnZWQuYy0xODg2LVxcdCAqL1xcbm1tL2todWdlcGFnZWQuYzoxODg3OlxcdGlmICghdGhwX3ZtYV9hbGxvd2FibGVfb3JkZXIodm1hLCB2bWEtXFx1MDAzZXZtX2ZsYWdzLCBUVkFfRk9SQ0VEX0NPTExBUFNFLCBQTURfT1JERVIpKVxcbm1tL2todWdlcGFnZWQuYy0xODg4LVxcdFxcdHJldHVybiBTQ0FOX1ZNQV9DSEVDSztcXG4tLVxcbm1tL2todWdlcGFnZWQuYz0zMTgyPWludCBtYWR2aXNlX2NvbGxhcHNlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIHN0YXJ0LFxcbi0tXFxubW0va2h1Z2VwYWdlZC5jLTMxOTQtXFxubW0va2h1Z2VwYWdlZC5jOjMxOTU6XFx0aWYgKCFjb2xsYXBzZV9wb3NzaWJsZSh2bWEsIHZtYS1cXHUwMDNldm1fZmxhZ3MsIFRWQV9GT1JDRURfQ09MTEFQU0UpKVxcbm1tL2todWdlcGFnZWQuYy0zMTk2LVxcdFxcdHJldHVybiAtRUlOVkFMO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wN1QyMTo1NTo1NS45NDUwOTE0MDJaIiwiU2VxIjoyMSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6NTYyODIxMDQ1MywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipNeSBBc3Nlc3NtZW50IG9mIHRoZSBUSFAgQWxsb3dhYmxlIE9yZGVycyBMb2dpYyBDaGFuZ2VzKipcblxuT2theSwgbGV0J3MgYnJlYWsgdGhpcyBkb3duLiBJIG5lZWQgdG8gZ2V0IGEgaGFuZGxlIG9uIHRoZSBjaGFuZ2VzIHRvIHRoZSBUcmFuc3BhcmVudCBIdWdlIFBhZ2UgKFRIUCkgYWxsb3dhYmxlIG9yZGVycyBsb2dpYywgZXNwZWNpYWxseSBmb3IgZmlsZS1iYWNrZWQgVk1Bcy4gVGhlIGZpcnN0IHRoaW5ncyBJJ20gZ29pbmcgdG8gbG9vayBhdCBhcmUgdGhlIGNvcmUgZnVuY3Rpb25zIGluIGBmcy9wcm9jL3Rhc2tfbW11LmNgLCBgbW0va2h1Z2VwYWdlZC5jYCwgYW5kIGBodWdlcGFnZV92bWFfcmV2YWxpZGF0ZWAuIEknbGwgcGF5IGNsb3NlIGF0dGVudGlvbiB0byB0aGUgYHNob3dfc21hcGAgaW4gdGhlIHRhc2tfbW11IGZpbGUuIEkgbmVlZCB0byB1bmRlcnN0YW5kIHdoZXJlIHRoZSByZXZhbGlkYXRpb24gbG9naWMgaXMgbGl2aW5nLlxuXG5NeSBGb2N1c1N5bWJvbHMgd2lsbCBiZTogYF9fdGhwX3ZtYV9hbGxvd2FibGVfb3JkZXJzYCAodGhhdCdzIHRoZSBjb3JlIGNoYW5nZSksIGB2bWFfZmlsZV9jYW5fbWFwX2h1Z2VgLCBhbmQgYHZtYV9maWxlX2J5cGFzc190aHBfdHVuZWFibGVzYCAodGhlIG5ldyBoZWxwZXJzKSwgYW5kIGBtYWR2aXNlX2NvbGxhcHNlYCB0byB1bmRlcnN0YW5kIHRoZSBtYWR2aXNlIHBhdGggZm9yIGZpbGUgY29sbGFwc2VzLiBJdCBzZWVtcyB0aGF0IGB2bWFfZmlsZV9jYW5fbWFwX2h1Z2VgIGFuZCBgdm1hX2ZpbGVfYnlwYXNzX3RocF90dW5lYWJsZXNgIHNob3VsZCBiZSBpbmNsdWRlZCBhcyBGb2N1c1N5bWJvbHMuIFJlbWVtYmVyLCB3ZSBzaG91bGQgaW5jbHVkZSB0aGUgbmV3IGhlbHBlciBmdW5jdGlvbnMsIGV2ZW4gaWYgdGhleSdyZSBzdGF0aWMgYW5kIG5vdCBpbmxpbmVkLCBiZWNhdXNlIHRoZXkgd2lsbCBoYXZlIHN5bWJvbHMgaW4gYHZtbGludXhgLlxuXG5Ob3csIEkgbmVlZCB0byBkb3VibGUtY2hlY2sgdGhlIHJlbGV2YW50IGNvbmZpZ3VyYXRpb25zLiBUaGUgY3JpdGljYWwgb25lIGlzIGBUUkFOU1BBUkVOVF9IVUdFUEFHRWAuIEkgc2hvdWxkIHByb2JhYmx5IGNoZWNrIGBtbS9LY29uZmlnYCBmb3Igb3RoZXIgcmVsZXZhbnQgY29uZmlndXJhdGlvbnMsIGJ1dCBJIHRoaW5rIGBUUkFOU1BBUkVOVF9IVUdFUEFHRWAgaXMgdGhlIG9ubHkgb25lIEkgbmVlZCB0byBmb2N1cyBvbi4gSSBzZWUgaXQgZGVwZW5kcyBvbiBgSEFWRV9BUkNIX1RSQU5TUEFSRU5UX0hVR0VQQUdFIFx1MDAyNlx1MDAyNiAhUFJFRU1QVF9SVGAuIEdvb2QsIG9uIGFtZDY0LCBgSEFWRV9BUkNIX1RSQU5TUEFSRU5UX0hVR0VQQUdFYCBpcyBgeWAsIHNvIGl0IHNob3VsZCBiZSBmaW5lLiBZZXMsIGBDT05GSUdfVFJBTlNQQVJFTlRfSFVHRVBBR0VgIChzdHJpcCBDT05GSUdfIHByZWZpeCAtXHUwMDNlIFwiVFJBTlNQQVJFTlRfSFVHRVBBR0VcIikuXG5cbk9rYXksIGxldCdzIGRpZ2VzdCB0aGUgcmVhc29uaW5nIGZvciB0aGUgY2hhbmdlcyBtb3JlIGNhcmVmdWxseS4gVGhlIHBhdGNoIHJlc3RydWN0dXJlcyBUSFAgYWxsb3dhYmxlIG9yZGVycywgaW50cm9kdWNpbmcgc2V2ZXJhbCBuZXcgZnVuY3Rpb25zIGluIGBtbS9odWdlX21lbW9yeS5jYDogYHZtYV9maWxlX2Nhbl9tYXBfaHVnZWAsIGB2bWFfZmlsZV9ieXBhc3NfdGhwX3R1bmVhYmxlc2AsIGB2bWFfZmlsZV9hbGxvd190aHBfdHVuZWFibGVzYCwgYW5kIGB2bWFfZmlsZV9jaGVja190aHBfdHVuZWFibGVzYC4gVGhlc2UgbmV3IGZ1bmN0aW9ucyBldmFsdWF0ZSB0aGUgVEhQIHR1bmVhYmxlcyBhbmQgaHVnZSBmYXVsdCBjYXBhYmlsaXRpZXMgZHVyaW5nIHBhZ2UgZmF1bHRzLCBzbWFwcyBxdWVyaWVzLCBhbmQgZm9yY2VkIGNvbGxhcHNlcyBzdWNoIGFzIHRoZSBgTUFEVl9DT0xMQVBTRWAgb3B0aW9uLiBJdCdzIHRvdWNoaW5nIHNvbWUgcHJldHR5IGxvdy1sZXZlbCBtZW1vcnkgbWFuYWdlbWVudCBzdHVmZiwgd2hpY2ggbWVhbnMgaXTigJlzIGVhc2lseSByZWFjaGFibGUgYW5kIGZ1enphYmxlIHZpYSBzdGFuZGFyZCBzeXNjYWxscyBsaWtlIGBtYWR2aXNlYCwgYG1tYXBgLCBwYWdlIGZhdWx0cywgYW5kIGAvcHJvYy9cdTAwM2NwaWRcdTAwM2Uvc21hcHNgLlxuXG5SaWdodCwgSSBhbSBzYXRpc2ZpZWQgd2l0aCB0aGlzIGFuYWx5c2lzLCBJJ2xsIGNhbGwgYHNldC1yZXN1bHRzYCB0b29sIG5vdy5cblxuXG4iLCJJbnB1dFRva2VucyI6MjI4MzcsIk91dHB1dFRva2VucyI6MTg2LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NjIwLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA3VDIxOjU2OjAxLjU3MzMwNDIwNloiLCJTZXEiOjIyLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJzZXQtcmVzdWx0cyIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjEzODI5NDc4MSwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiVFJBTlNQQVJFTlRfSFVHRVBBR0VcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJfX3RocF92bWFfYWxsb3dhYmxlX29yZGVyc1wiLFxuICAgIFwidm1hX2ZpbGVfY2FuX21hcF9odWdlXCIsXG4gICAgXCJ2bWFfZmlsZV9ieXBhc3NfdGhwX3R1bmVhYmxlc1wiLFxuICAgIFwibWFkdmlzZV9jb2xsYXBzZVwiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIHJlZmFjdG9ycyBhbmQgYWx0ZXJzIFRIUCAoVHJhbnNwYXJlbnQgSHVnZSBQYWdlKSBhbGxvd2FibGUgb3JkZXJzIGNoZWNraW5nIGZvciBmaWxlLWJhY2tlZCBWTUFzIGluIG1tL2h1Z2VfbWVtb3J5LmMsIGFkZGluZyBoZWxwZXJzIGxpa2Ugdm1hX2ZpbGVfY2FuX21hcF9odWdlIGFuZCB2bWFfZmlsZV9ieXBhc3NfdGhwX3R1bmVhYmxlcy4gVGhpcyBjb3JlIG1lbW9yeSBtYW5hZ2VtZW50IGxvZ2ljIGlzIHJlYWNoYWJsZSB2aWEgc3RhbmRhcmQgc3lzY2FsbHMgYW5kIGludGVyZmFjZXMgc3VjaCBhcyBtYWR2aXNlKE1BRFZfQ09MTEFQU0UpLCBwYWdlIGZhdWx0IGhhbmRsZXJzLCBhbmQgL3Byb2MvcGlkL3NtYXBzLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIlRSQU5TUEFSRU5UX0hVR0VQQUdFXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwiX190aHBfdm1hX2FsbG93YWJsZV9vcmRlcnNcIixcbiAgICBcInZtYV9maWxlX2Nhbl9tYXBfaHVnZVwiLFxuICAgIFwidm1hX2ZpbGVfYnlwYXNzX3RocF90dW5lYWJsZXNcIixcbiAgICBcIm1hZHZpc2VfY29sbGFwc2VcIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCByZWZhY3RvcnMgYW5kIGFsdGVycyBUSFAgKFRyYW5zcGFyZW50IEh1Z2UgUGFnZSkgYWxsb3dhYmxlIG9yZGVycyBjaGVja2luZyBmb3IgZmlsZS1iYWNrZWQgVk1BcyBpbiBtbS9odWdlX21lbW9yeS5jLCBhZGRpbmcgaGVscGVycyBsaWtlIHZtYV9maWxlX2Nhbl9tYXBfaHVnZSBhbmQgdm1hX2ZpbGVfYnlwYXNzX3RocF90dW5lYWJsZXMuIFRoaXMgY29yZSBtZW1vcnkgbWFuYWdlbWVudCBsb2dpYyBpcyByZWFjaGFibGUgdmlhIHN0YW5kYXJkIHN5c2NhbGxzIGFuZCBpbnRlcmZhY2VzIHN1Y2ggYXMgbWFkdmlzZShNQURWX0NPTExBUFNFKSwgcGFnZSBmYXVsdCBoYW5kbGVycywgYW5kIC9wcm9jL3BpZC9zbWFwcy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDdUMjE6NTY6MDEuNzExNjA4Mjk4WiIsIlNlcSI6MjMsIk5lc3RpbmciOjEsIlR5cGUiOiJhY3Rpb24iLCJOYW1lIjoiSWYiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNTY5MTg2MDc4MywiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA3VDIxOjU2OjAxLjcxNDM3MjI1WiIsIlNlcSI6MjQsIk5lc3RpbmciOjIsIlR5cGUiOiJhZ2VudCIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImNvcmUiLCJEdXJhdGlvbiI6MTU2ODkwODk1OTAsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIHJlZmFjdG9ycyBUSFAgKFRyYW5zcGFyZW50IEh1Z2UgUGFnZSkgcG9saWN5IGNoZWNrcyBmb3IgZmlsZS1iYWNrZWQgYW5kIHNwZWNpYWwvUEZOTUFQIFZNQXMgaW4gYG1tL2h1Z2VfbWVtb3J5LmNgLiBJdCBicmVha3Mgb3V0IHRoZSBsb2dpYyBmb3IgY2hlY2tpbmcgVEhQIHR1bmFibGVzIGFuZCBodWdlIHBhZ2Ugc3VwcG9ydCBpbnRvIGhlbHBlciBmdW5jdGlvbnMgKGB2bWFfZmlsZV9ieXBhc3NfdGhwX3R1bmVhYmxlc2AsIGB2bWFfZmlsZV9hbGxvd190aHBfdHVuZWFibGVzYCwgYHZtYV9maWxlX2NoZWNrX3RocF90dW5lYWJsZXNgLCBhbmQgYHZtYV9maWxlX2Nhbl9tYXBfaHVnZWApIGFuZCBhbGxvd3MgUEZOTUFQIFZNQXMgd2l0aCBgaHVnZV9mYXVsdGAgaGFuZGxlcnMgdG8gYnlwYXNzIGdsb2JhbCBUSFAgdHVuYWJsZXMuXFxuXFxuTm9uZSBvZiB0aGUgY2hhbmdlcyB0b3VjaCBidWZmZXIgY29waWVzIHRvIHVzZXIgc3BhY2UsIHVuaW5pdGlhbGl6ZWQgc3RhY2sgb3IgaGVhcCBtZW1vcnksIG9yIG1lbW9yeSBhbGxvY2F0aW9ucy4gQWxsIHZhcmlhYmxlcyBhbmQgc3RydWN0IG1lbWJlcnMgZXZhbHVhdGVkIChzdWNoIGFzIGB2bWEtXFx1MDAzZXZtX29wc2AsIGB2bV9mbGFnc2AsIGFuZCBgdHlwZWApIGFyZSBmdWxseSBpbml0aWFsaXplZCBhcmd1bWVudHMgb3Igc3RydWN0dXJlIGZpZWxkcy4gUG90ZW50aWFsIGlzc3VlcyBpbiB0aGlzIGNvZGUgcGF0aCAoc3VjaCBhcyBOVUxMIHBvaW50ZXIgZGVyZWZlcmVuY2VzIGlmIGB2bV9vcHNgIHdlcmUgTlVMTCkgYXJlIGRldGVjdGVkIGJ5IHN0YW5kYXJkIGtlcm5lbCBmYXVsdCBoYW5kbGVycyBhbmQgS0FTQU4uIFRoZXJlIGlzIG5vIHJpc2sgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgdXNhZ2Ugb3IgaW5mb3JtYXRpb24gbGVha3MgdGhhdCB3b3VsZCByZXF1aXJlIEtNU0FOLlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2Vcbn0iLCJJbnN0cnVjdGlvbiI6IllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBzZWN1cml0eSBlbmdpbmVlciBzcGVjaWFsaXppbmcgaW4ga2VybmVsIG1lbW9yeVxuZXJyb3IgZGV0ZWN0b3JzIChLQVNBTiBhbmQgS01TQU4pLiBZb3VyIGpvYiBpcyB0byByZXZpZXcgdGhlIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmRcbmRldGVybWluZSBpZiB0aGUgY29kZSBjaGFuZ2VzIGp1c3RpZnkgc3Bhd25pbmcgYSBkZWRpY2F0ZWQgS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcilcbmZ1enppbmcgc2Vzc2lvbiBpbiBhZGRpdGlvbiB0byBzdGFuZGFyZCBLQVNBTiBmdXp6aW5nLlxuXG5DUklUSUNBTCBESVNUSU5DVElPTiBCRVRXRUVOIEtBU0FOIEFORCBLTVNBTjpcbi0gU3RhbmRhcmQgS0FTQU4ga2VybmVsIGJ1aWxkcyAodXBzdHJlYW0tYXBwYXJtb3Ita2FzYW4uY29uZmlnKSBhbHJlYWR5IGVuYWJsZVxuICBhIGNvbXByZWhlbnNpdmUgc3VpdGUgb2YgZGVidWdnaW5nIHRvb2xzIGFuZCBzYW5pdGl6ZXJzLCBpbmNsdWRpbmcgS0FTQU5cbiAgKG91dC1vZi1ib3VuZHMgYWNjZXNzZXMsIHVzZS1hZnRlci1mcmVlLCBkb3VibGUgZnJlZSwgaW52YWxpZCBmcmVlKSwgTE9DS0RFUFxuICAobG9ja2luZyBidWdzIGFuZCBkZWFkbG9ja3MpLCBVQi1zYW5pdGl6ZXJzLCBhbmQgbWVtb3J5IGNvcnJ1cHRpb24gY2hlY2tzLlxuLSBLTVNBTiAoS2VybmVsTWVtb3J5U2FuaXRpemVyKSBkZXRlY3RzIHJlYWRzIG9mIFVOSU5JVElBTElaRUQgbWVtb3J5IChzdGFjaywgaGVhcCxcbiAgb3IgcGFnZSBhbGxvY2F0aW9ucykgYW5kIGtlcm5lbC10by11c2VyIG1lbW9yeSBpbmZvLWxlYWtzLlxuXG5SdWxlOiBUSEVSRSBJUyBOTyBTRU5TRSBJTiBSVU5OSU5HIEEgS01TQU4gU0VTU0lPTiBJRiBBIEJVRyBDQU4gQkUgQ0FVR0hUIEJZIEtBU0FOLFxuTE9DS0RFUCwgT1IgT1RIRVIgU1RBTkRBUkQgQlVHIERFVEVDVE9SUy5cbkEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpbmN1cnMgc2lnbmlmaWNhbnQgcmVzb3VyY2UgY29zdHMuIFlvdSBtdXN0IE9OTFlcbnNldCBOZWVkc0tNU0FOPXRydWUgaWYgdGhlIGNvZGUgY2hhbmdlcyBpbnRyb2R1Y2Ugb3IgZXhwb3NlIFVOSU5JVElBTElaRUQgTUVNT1JZIHJpc2tzXG50aGF0IGFyZSBkZXRlY3RlZCBPTkxZIGJ5IEtNU0FOLlxuXG5Mb29rIGhvbGlzdGljYWxseSBhdCB0aGUgcGF0Y2ggc2VyaWVzIGFuZCBzdXJyb3VuZGluZyBjb2RlLiBFdmVuIGlmIG5vIGRpcmVjdFxudW5pbml0aWFsaXplZCBmaWVsZCBhY2Nlc3NlcyBvciBuZXcgYnVmZmVyIGFsbG9jYXRpb25zIGFyZSBhZGRlZCBpbiB0aGUgZGlmZiBpdHNlbGYsXG5hIHBhdGNoIG1heSBhbHRlciBjb250cm9sIGZsb3csIGJvdW5kcyBjaGVja2luZywgb3IgZGF0YSBsZW5ndGggY2FsY3VsYXRpb25zIGluIHdheXNcbnRoYXQgY2hhbmdlIGhvdyB0aGUgcmVzdCBvZiB0aGUgY29kZSBvcGVyYXRlcyBvbiBleGlzdGluZyBidWZmZXJzIChlLmcuIGFsbG93aW5nXG51bmluaXRpYWxpemVkIHN0YWNrL2hlYXAgbWVtb3J5IHRvIGJlIHJlYWQsIGNvcGllZCB0byB1c2VyIHNwYWNlLCBvciB1c2VkIGluIGNvbnRyb2xcbmZsb3cpLiBEbyBub3QgaGVzaXRhdGUgdG8gdXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gaW5zcGVjdCB0aGUgc3Vycm91bmRpbmcgY29kZSxcbmNhbGxlZCBmdW5jdGlvbnMsIGFuZCBjYWxsZXJzLlxuXG5TZXQgTmVlZHNLTVNBTj10cnVlIE9OTFkgSUYgdGhlIHBhdGNoIGludHJvZHVjZXMgb3IgbW9kaWZpZXM6XG4xLiBLZXJuZWwgc3RydWN0dXJlcyBzZW50IHRvIHVzZXIgc3BhY2UgKHZpYSBjb3B5X3RvX3VzZXIsIHB1dF91c2VyLCBuZXRsaW5rIHNrYlxuICAgYXR0cmlidXRlcywgaW9jdGwgb3V0cHV0IGFyZ3VtZW50cywgc29ja2V0IG9wdGlvbnMsIG9yIEJQRiBidWZmZXJzKSB3aGVyZSBmaWVsZHNcbiAgIG9yIHN0cnVjdHVyZSBwYWRkaW5nIG1pZ2h0IG5vdCBiZSBmdWxseSBpbml0aWFsaXplZC96ZXJvZWQuXG4yLiBDb25kaXRpb25hbCBsb2dpYyBvciBicmFuY2hpbmcgdGhhdCBkZXBlbmRzIG9uIHBvdGVudGlhbGx5IHVuaW5pdGlhbGl6ZWQgdmFyaWFibGVzXG4gICBvciBzdHJ1Y3QgZmllbGRzLlxuMy4gQWxsb2NhdGlvbiBvciBpbml0aWFsaXphdGlvbiBvZiBjb21wbGV4IGRhdGEgc3RydWN0dXJlcyB3aGVyZSB1bmluaXRpYWxpemVkIGZpZWxkc1xuICAgY291bGQgYmUgcmVhZCBsYXRlciBpbiByZWFjaGFibGUgY29kZSBwYXRocy5cbjQuIEJvdW5kcyBjaGVja3MsIGxlbmd0aHMsIG9yIGxvZ2ljIGluIGEgd2F5IHRoYXQgYWxsb3dzIHN1cnJvdW5kaW5nIGNvZGUgdG8gYWNjZXNzXG4gICB1bmluaXRpYWxpemVkIGJ5dGVzIG9mIGV4aXN0aW5nIGJ1ZmZlcnMuXG5cblNldCBOZWVkc0tNU0FOPWZhbHNlIElGOlxuLSBUaGUgY29kZSBjaGFuZ2VzIHByaW1hcmlseSByaXNrIG91dC1vZi1ib3VuZHMgYWNjZXNzLCBhcnJheSBvdmVyZmxvd3MsIE5VTEwgcG9pbnRlclxuICBkZXJlZmVyZW5jZXMsIGxvY2tpbmcgZGVhZGxvY2tzLCBvciB1c2UtYWZ0ZXItZnJlZSBidWdzICh0aGVzZSBhcmUgYWxyZWFkeSBjYXVnaHRcbiAgYnkgS0FTQU4sIExPQ0tERVAsIG9yIHN0YW5kYXJkIGJ1ZyBkZXRlY3RvcnMpLlxuLSBBbGwgc3RhY2svaGVhcCBzdHJ1Y3R1cmVzIHRvdWNoZWQgb3IgaW50cm9kdWNlZCBieSB0aGUgcGF0Y2ggYXJlIGZ1bGx5IHplcm9lZFxuICBvciBpbml0aWFsaXplZCAoZS5nLiB1c2luZyA9IHswfSwgbWVtc2V0LCBremFsbG9jKSBiZWZvcmUgYmVpbmcgcmVhZCBvciBjb3BpZWQuXG4tIFRoZSBwYXRjaCBkb2VzIG5vdCBpbnRyb2R1Y2UgYW55IHJpc2sgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgdXNhZ2Ugb3IgaW5mby1sZWFrcy5cblxuVXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gaW5zcGVjdCB0aGUgc3Vycm91bmRpbmcgY29kZSBpZiBuZWNlc3NhcnksIHRoZW4gcHJvdmlkZVxuZGV0YWlsZWQgS01TQU5SZWFzb25pbmcgY29udHJhc3RpbmcgS0FTQU4gdnMgS01TQU4gYXBwbGljYWJpbGl0eSBmb3IgdGhpcyBwYXRjaC5cblByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLlxuXG5cblVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuXG5JdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS5cbklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC5cbiIsIlByb21wdCI6IlRhcmdldCBhcmNoaXRlY3R1cmU6IGFtZDY0XG5cbkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOlxuY29tbWl0IDQwN2I4ZTdiNmY4YWE2Mjk2YmQ5NzRjN2Q5MjZlYjc1MzliNzRjZTZcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgTW9uIFNlcCA3IDIxOjU1OjE2IDIwMjYgKzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvbW0vaHVnZV9tZW1vcnkuYyBiL21tL2h1Z2VfbWVtb3J5LmNcbmluZGV4IGFmYmI1OTc0YmQyMjUuLjc1YzIwNGFmNDBjYmQgMTAwNjQ0XG4tLS0gYS9tbS9odWdlX21lbW9yeS5jXG4rKysgYi9tbS9odWdlX21lbW9yeS5jXG5AQCAtOTIsNyArOTIsNyBAQCB1bnNpZ25lZCBsb25nIGh1Z2VfYW5vbl9vcmRlcnNfbWFkdmlzZSBfX3JlYWRfbW9zdGx5O1xuIHVuc2lnbmVkIGxvbmcgaHVnZV9hbm9uX29yZGVyc19pbmhlcml0IF9fcmVhZF9tb3N0bHk7XG4gc3RhdGljIGJvb2wgYW5vbl9vcmRlcnNfY29uZmlndXJlZCBfX2luaXRkYXRhO1xuIFxuLXN0YXRpYyBpbmxpbmUgYm9vbCBmaWxlX3RocF9lbmFibGVkKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKVxuK3N0YXRpYyBpbmxpbmUgYm9vbCBmaWxlX3RocF9lbmFibGVkKGNvbnN0IHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKVxuIHtcbiBcdHN0cnVjdCBpbm9kZSAqaW5vZGU7XG4gXG5AQCAtMTE4LDYgKzExOCw2NyBAQCBzdGF0aWMgYm9vbCB2bWFfaXNfc3BlY2lhbF9odWdlKGNvbnN0IHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKVxuIFx0cmV0dXJuIHZtYV90ZXN0X2FueSh2bWEsIFZNQV9QRk5NQVBfQklULCBWTUFfTUlYRURNQVBfQklUKTtcbiB9XG4gXG4rc3RhdGljIGJvb2wgdm1hX2ZpbGVfYnlwYXNzX3RocF90dW5lYWJsZXMoY29uc3Qgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4rXHRcdGVudW0gdHZhX3R5cGUgdHlwZSlcbit7XG4rXHRjb25zdCBib29sIGhhc19odWdlX2ZhdWx0ID0gdm1hLVx1MDAzZXZtX29wcy1cdTAwM2VodWdlX2ZhdWx0O1xuK1xuK1x0LyogTUFEVl9DT0xMQVBTRSBpZ25vcmVzIHR1bmVhYmxlcy4gKi9cbitcdGlmICh0eXBlID09IFRWQV9GT1JDRURfQ09MTEFQU0UpXG4rXHRcdHJldHVybiB0cnVlO1xuK1x0LyogSHVnZSBQRk4gbWFwcGluZ3MgYXJlIHVuY29tcGFjdGFibGUgc28gdGhlIHBvbGljeSBkb2Vzbid0IGFwcGx5LiAqL1xuK1x0aWYgKHZtYV90ZXN0KHZtYSwgVk1BX1BGTk1BUF9CSVQpIFx1MDAyNlx1MDAyNiBoYXNfaHVnZV9mYXVsdClcbitcdFx0cmV0dXJuIHRydWU7XG4rXHRyZXR1cm4gZmFsc2U7XG4rfVxuK1xuK3N0YXRpYyBib29sIHZtYV9maWxlX2FsbG93X3RocF90dW5lYWJsZXModm1fZmxhZ3NfdCB2bV9mbGFncylcbit7XG4rXHQvKiBUSFA9YWx3YXlzPyAqL1xuK1x0aWYgKGh1Z2VwYWdlX2dsb2JhbF9hbHdheXMoKSlcbitcdFx0cmV0dXJuIHRydWU7XG4rXHQvKiBUSFA9bWFkdmlzZSBhbmQgbWFya2VkIE1BRFZfSFVHRVBBR0U/ICovXG4rXHRpZiAoaHVnZXBhZ2VfZ2xvYmFsX2VuYWJsZWQoKSBcdTAwMjZcdTAwMjYgKHZtX2ZsYWdzIFx1MDAyNiBWTV9IVUdFUEFHRSkpXG4rXHRcdHJldHVybiB0cnVlO1xuK1x0cmV0dXJuIGZhbHNlO1xuK31cbitcbitzdGF0aWMgYm9vbCB2bWFfZmlsZV9jaGVja190aHBfdHVuZWFibGVzKGNvbnN0IHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuK1x0XHR2bV9mbGFnc190IHZtX2ZsYWdzLCBlbnVtIHR2YV90eXBlIHR5cGUpXG4re1xuK1x0cmV0dXJuIHZtYV9maWxlX2J5cGFzc190aHBfdHVuZWFibGVzKHZtYSwgdHlwZSkgfHxcbitcdFx0dm1hX2ZpbGVfYWxsb3dfdGhwX3R1bmVhYmxlcyh2bV9mbGFncyk7XG4rfVxuK1xuK3N0YXRpYyBib29sIHZtYV9maWxlX2Nhbl9tYXBfaHVnZShjb25zdCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbitcdFx0dm1fZmxhZ3NfdCB2bV9mbGFncywgZW51bSB0dmFfdHlwZSB0eXBlKVxuK3tcbitcdGNvbnN0IGJvb2wgaGFzX2h1Z2VfZmF1bHQgPSB2bWEtXHUwMDNldm1fb3BzLVx1MDAzZWh1Z2VfZmF1bHQ7XG4rXG4rXHQvKlxuK1x0ICogRW5mb3JjZSBUSFAgY29sbGFwc2UgcmVxdWlyZW1lbnRzIGFzIG5lY2Vzc2FyeS4gQW5vbnltb3VzIHZtYXNcbitcdCAqIHdlcmUgYWxyZWFkeSBoYW5kbGVkIGluIHRocF92bWFfYWxsb3dhYmxlX29yZGVycygpLlxuK1x0ICovXG4rXHRpZiAoIXZtYV9maWxlX2NoZWNrX3RocF90dW5lYWJsZXModm1hLCB2bV9mbGFncywgdHlwZSkpXG4rXHRcdHJldHVybiBmYWxzZTtcbitcbitcdHN3aXRjaCAodHlwZSkge1xuK1x0Y2FzZSBUVkFfUEFHRUZBVUxUOlxuK1x0XHQvKlxuK1x0XHQgKiBUcnVzdCB0aGF0IC1cdTAwM2VodWdlX2ZhdWx0KCkgaGFuZGxlcnMga25vdyB3aGF0IHRoZXkgYXJlIGRvaW5nXG4rXHRcdCAqIGluIGZhdWx0IHBhdGguXG4rXHRcdCAqL1xuK1x0XHRyZXR1cm4gaGFzX2h1Z2VfZmF1bHQ7XG4rXHRjYXNlIFRWQV9TTUFQUzpcbitcdFx0aWYgKGhhc19odWdlX2ZhdWx0KVxuK1x0XHRcdHJldHVybiB0cnVlO1xuK1x0XHRmYWxsdGhyb3VnaDtcbitcdGRlZmF1bHQ6XG4rXHRcdC8qIE9ubHkgcmVndWxhciBmaWxlIGlzIHZhbGlkIGluIGNvbGxhcHNlIHBhdGguICovXG4rXHRcdHJldHVybiBmaWxlX3RocF9lbmFibGVkKHZtYSk7XG4rXHR9XG4rfVxuK1xuIHVuc2lnbmVkIGxvbmcgX190aHBfdm1hX2FsbG93YWJsZV9vcmRlcnMoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4gXHRcdFx0XHRcdCB2bV9mbGFnc190IHZtX2ZsYWdzLFxuIFx0XHRcdFx0XHQgZW51bSB0dmFfdHlwZSB0eXBlLFxuQEAgLTE5MCwyNyArMjUxLDggQEAgdW5zaWduZWQgbG9uZyBfX3RocF92bWFfYWxsb3dhYmxlX29yZGVycyhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbiBcdFx0XHRcdFx0XHQgICB2bWEsIHZtYV9zdGFydF9wZ29mZih2bWEpLCAwLFxuIFx0XHRcdFx0XHRcdCAgIGZvcmNlZF9jb2xsYXBzZSk7XG4gXG4tXHRpZiAoIXZtYV9pc19hbm9ueW1vdXModm1hKSkge1xuLVx0XHQvKlxuLVx0XHQgKiBFbmZvcmNlIFRIUCBjb2xsYXBzZSByZXF1aXJlbWVudHMgYXMgbmVjZXNzYXJ5LiBBbm9ueW1vdXMgdm1hc1xuLVx0XHQgKiB3ZXJlIGFscmVhZHkgaGFuZGxlZCBpbiB0aHBfdm1hX2FsbG93YWJsZV9vcmRlcnMoKS5cbi1cdFx0ICovXG4tXHRcdGlmICghZm9yY2VkX2NvbGxhcHNlIFx1MDAyNlx1MDAyNlxuLVx0XHQgICAgKCFodWdlcGFnZV9nbG9iYWxfZW5hYmxlZCgpIHx8ICghKHZtX2ZsYWdzIFx1MDAyNiBWTV9IVUdFUEFHRSkgXHUwMDI2XHUwMDI2XG4tXHRcdFx0XHRcdFx0ICAgICFodWdlcGFnZV9nbG9iYWxfYWx3YXlzKCkpKSlcbi1cdFx0XHRyZXR1cm4gMDtcbi1cbi1cdFx0Lypcbi1cdFx0ICogVHJ1c3QgdGhhdCAtXHUwMDNlaHVnZV9mYXVsdCgpIGhhbmRsZXJzIGtub3cgd2hhdCB0aGV5IGFyZSBkb2luZ1xuLVx0XHQgKiBpbiBmYXVsdCBwYXRoLlxuLVx0XHQgKi9cbi1cdFx0aWYgKCgoaW5fcGYgfHwgc21hcHMpKSBcdTAwMjZcdTAwMjYgdm1hLVx1MDAzZXZtX29wcy1cdTAwM2VodWdlX2ZhdWx0KVxuLVx0XHRcdHJldHVybiBvcmRlcnM7XG4tXHRcdC8qIE9ubHkgcmVndWxhciBmaWxlIGlzIHZhbGlkIGluIGNvbGxhcHNlIHBhdGggKi9cbi1cdFx0aWYgKCgoIWluX3BmIHx8IHNtYXBzKSkgXHUwMDI2XHUwMDI2IGZpbGVfdGhwX2VuYWJsZWQodm1hKSlcbi1cdFx0XHRyZXR1cm4gb3JkZXJzO1xuLVx0XHRyZXR1cm4gMDtcbi1cdH1cbitcdGlmICghdm1hX2lzX2Fub255bW91cyh2bWEpKVxuK1x0XHRyZXR1cm4gdm1hX2ZpbGVfY2FuX21hcF9odWdlKHZtYSwgdm1fZmxhZ3MsIHR5cGUpID8gb3JkZXJzIDogMDtcbiBcbiBcdGlmICh2bWFfaXNfdGVtcG9yYXJ5X3N0YWNrKHZtYSkpXG4gXHRcdHJldHVybiAwO1xuIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDdUMjE6NTY6MDEuNzE0Mzc0NTFaIiwiU2VxIjoyNSwiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6NDQ4MzE0NTYxMSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgdGhlIEh1Z2UgTWVtb3J5IFBhdGNoIGZvciBVbmluaXRpYWxpemVkIE1lbW9yeSBSaXNrcyoqXG5cbk9rYXksIGxldCdzIGRpdmUgaW50byB0aGlzIHBhdGNoLiBNeSBpbW1lZGlhdGUgZ29hbCBpcyB0byBkZXRlcm1pbmUgaWYgaXQgaW50cm9kdWNlcyBhbnkgbmV3IG9wcG9ydHVuaXRpZXMgZm9yIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGV4cG9zdXJlIHRoYXQgbWlnaHQgd2FycmFudCBLTVNBTiBzY3J1dGlueS4gSSdsbCBzdGFydCBieSByZWFkaW5nIHRocm91Z2ggdGhlIGNoYW5nZXMgaW4gYG1tL2h1Z2VfbWVtb3J5LmNgLiBJdCBsb29rcyBsaWtlIHdlIGhhdmUgYSBzZXQgb2YgZnVuY3Rpb24gbW9kaWZpY2F0aW9ucy5cblxuRmlyc3QsIEkgc2VlIGEgYGNvbnN0YCBxdWFsaWZpZXIgYWRkZWQgdG8gYGZpbGVfdGhwX2VuYWJsZWRgLCBhIGdvb2QgcHJhY3RpY2UgZm9yIGVuc3VyaW5nIGRhdGEgaW50ZWdyaXR5LCB0aG91Z2ggbGlrZWx5IG5vdCBLTVNBTiByZWxldmFudC4gVGhlbiB0aGVyZSBhcmUgYSBmZXcgbmV3IGJvb2xlYW4gZnVuY3Rpb25zOiBgdm1hX2ZpbGVfYnlwYXNzX3RocF90dW5lYWJsZXNgLCBgdm1hX2ZpbGVfYWxsb3dfdGhwX3R1bmVhYmxlc2AsIGB2bWFfZmlsZV9jaGVja190aHBfdHVuZWFibGVzYCwgYW5kIGB2bWFfZmlsZV9jYW5fbWFwX2h1Z2VgLiBUaGV5IHNlZW0gdG8gZGVhbCB3aXRoIHRoZSB0dW5hYmlsaXR5IGFuZCBlbmFibGluZy9kaXNhYmxpbmcgb2YgVHJhbnNwYXJlbnQgSHVnZSBQYWdlcyAoVEhQKSBmb3IgZmlsZS1iYWNrZWQgVk1BcywgYmFzZWQgb24gdmFyaW91cyBjb25kaXRpb25zIGFuZCBmbGFncy4gRmluYWxseSwgYF9fdGhwX3ZtYV9hbGxvd2FibGVfb3JkZXJzYCBpcyByZWZhY3RvcmVkIHRvIHVzZSBgdm1hX2ZpbGVfY2FuX21hcF9odWdlYC5cblxuTm93LCB0aGUgY3JpdGljYWwgcGFydC4gTXkgcmFkYXIgaXMgdXAgZm9yIHdoZXJlIHVuaW5pdGlhbGl6ZWQgZGF0YSBjb3VsZCBiZWNvbWUgYSBwcm9ibGVtLiBJJ2xsIG5lZWQgdG8gZ28gYmV5b25kIGEgc3VwZXJmaWNpYWwgcmVhZCBhbmQgc2VlIGhvdyB0aGVzZSBuZXcgZnVuY3Rpb25zIGFyZSB1c2VkLCBhbmQgaG93IGV4aXN0aW5nIGRhdGEgZmxvd3MgYXJlIG1vZGlmaWVkLiBJIHdpbGwgcHJvYmFibHkgbmVlZCB0byBkaWcgaW50byBgbW0vaHVnZV9tZW1vcnkuY2AgZGlyZWN0bHksIGxpa2VseSB1c2luZyBgcmVhZC1maWxlYCBvciBgZ3JlcHBlcmAgdG8gdW5kZXJzdGFuZCBhbGwgdGhlIGRhdGEgc3RydWN0dXJlcyBhbmQgY29udHJvbCBmbG93LCBwYXJ0aWN1bGFybHkgZm9jdXNpbmcgb24gYW55IHBvdGVudGlhbCBkYXRhIHJhY2VzLiBJIHdhbnQgdG8gc2VlIGlmIGFueSBvZiB0aGVzZSBuZXcgZnVuY3Rpb25zLCBlc3BlY2lhbGx5IGB2bWFfZmlsZV9jYW5fbWFwX2h1Z2VgIGFuZCBob3cgaXQgaXMgdXNlZCBpbiBgX190aHBfdm1hX2FsbG93YWJsZV9vcmRlcnNgLCBpbnRyb2R1Y2UgcGF0aHMgd2hlcmUgZGF0YSBtaWdodCBiZSByZWFkIGJlZm9yZSBiZWluZyBpbml0aWFsaXplZC4gSSB3aWxsIGFsc28gYmUgbG9va2luZyB0byBzZWUgaWYgdGhlcmUgaXMgYW55IG1lbW9yeSBhbGxvY2F0aW9uIHRoYXQgY291bGQgYmUgZXhwb3NlZC4gVGhlIGRldmlsIGlzIGFsd2F5cyBpbiB0aGUgZGV0YWlscyFcblxuXG4iLCJJbnB1dFRva2VucyI6MzIxOCwiT3V0cHV0VG9rZW5zIjozOCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjQ1OCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA3VDIxOjU2OjA2LjE5NzUyNDk4MVoiLCJTZXEiOjI2LCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NjY0MzExNDMsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiX190aHBfdm1hX2FsbG93YWJsZV9vcmRlcnNcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwibW0vaHVnZV9tZW1vcnkuY1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJtbS9odWdlX21lbW9yeS5jPTE1Mz1zdGF0aWMgYm9vbCB2bWFfZmlsZV9jYW5fbWFwX2h1Z2UoY29uc3Qgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXFxuLS1cXG5tbS9odWdlX21lbW9yeS5jLTE4MS1cXG5tbS9odWdlX21lbW9yeS5jOjE4Mjp1bnNpZ25lZCBsb25nIF9fdGhwX3ZtYV9hbGxvd2FibGVfb3JkZXJzKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxcbm1tL2h1Z2VfbWVtb3J5LmMtMTgzLVxcdFxcdFxcdFxcdFxcdCB2bV9mbGFnc190IHZtX2ZsYWdzLFxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wN1QyMTo1NjowNi4yNjM5NjA5MDRaIiwiU2VxIjoyNywiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6MzEyMDMzNTQxOSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgbGV0J3MgZGl2ZSBpbnRvIHRoaXMuIEhlcmUncyBob3cgSSdkIGFwcHJvYWNoIHRoaXMgdGFzaywgYXMgaWYgdGhlc2Ugd2VyZSBteSBpbnRlcm5hbCB0aG91Z2h0czpcblxuKipBbmFseXppbmcgYF9fdGhwX3ZtYV9hbGxvd2FibGVfb3JkZXJzYCBhbmQgYHZtYV9maWxlX2Nhbl9tYXBfaHVnZWAqKlxuXG5SaWdodCwgbGV0J3MgZ2V0IGRvd24gdG8gdGhlIG5pdHR5LWdyaXR0eS4gTXkgZXhwZXJ0aXNlIHRlbGxzIG1lIHRoZXNlIGFyZSBsaWtlbHkga2V5IGZ1bmN0aW9ucyBkZWFsaW5nIHdpdGggVHJhbnNwYXJlbnQgSHVnZSBQYWdlcyAoVEhQKSBhbmQgdGhlaXIgaW50ZXJhY3Rpb24gd2l0aCBWaXJ0dWFsIE1lbW9yeSBBcmVhcyAoVk1Bcykgd2hlbiBtYXBwaW5nIGZpbGVzLiBHaXZlbiB0aGUgbmFtaW5nIGNvbnZlbnRpb25zLCBgX190aHBfdm1hX2FsbG93YWJsZV9vcmRlcnNgIHN1Z2dlc3RzIGl0J3MgY2hlY2tpbmcgdGhlIGxlZ2FsaXR5IG9yIHBlcm1pc3NpYmlsaXR5IG9mIHVzaW5nIFRIUHMgd2l0aGluIGEgVk1BLCBwb3RlbnRpYWxseSByZWdhcmRpbmcgb3JkZXIgKGkuZS4gc2l6ZSkgY29uc3RyYWludHMuIFRoZSBkb3VibGUgdW5kZXJzY29yZSBwcmVmaXggdXN1YWxseSBtZWFucyB0aGlzIGlzIGFuIGludGVybmFsIGZ1bmN0aW9uLCBub3QgbWVhbnQgdG8gYmUgY2FsbGVkIGRpcmVjdGx5LiBgdm1hX2ZpbGVfY2FuX21hcF9odWdlYCwgb24gdGhlIG90aGVyIGhhbmQsIGhpbnRzIGF0IGEgYnJvYWRlciBjaGVjay4gVGhpcyBzb3VuZHMgbGlrZSBhIGZ1bmN0aW9uIHRvIGRldGVybWluZSBpZiBhIHNwZWNpZmljIGZpbGUgY2FuIGJlIG1hcHBlZCB3aXRoIGh1Z2UgcGFnZXMsIHBvdGVudGlhbGx5IGVuY29tcGFzc2luZyBicm9hZGVyIGNvbnNpZGVyYXRpb25zIHRoYW4ganVzdCBWTUEtc3BlY2lmaWMgb3JkZXJzLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCB3aGF0IGZhY3RvcnMgYXJlIGNvbnNpZGVyZWQgaGVyZS4gSSBuZWVkIHRvIGV4YW1pbmUgdGhlIHN1cnJvdW5kaW5nIGNvZGUgdG8gZGV0ZXJtaW5lIGhvdyBgX190aHBfdm1hX2FsbG93YWJsZV9vcmRlcnNgIGlzIHVzZWQsIGFuZCBtb3JlIGltcG9ydGFudGx5LCAqd2h5Ki4gSXMgaXQgYSBoYXJkIGxpbWl0PyBEb2VzIGl0IGNvbnNpZGVyIE5VTUEgbm9kZXM/IFdoYXQgY3JpdGVyaWEgZG9lcyBpdCBhcHBseT8gU2ltaWxhcmx5LCB3aGF0IGNoZWNrcyBkb2VzIGB2bWFfZmlsZV9jYW5fbWFwX2h1Z2VgIHBlcmZvcm0/IEFyZSB3ZSB0YWxraW5nIGFib3V0IHRoZSBmaWxlJ3MgaW5vZGUgZmxhZ3MsIG9yIHRoZSB1bmRlcmx5aW5nIGZpbGVzeXN0ZW0ncyBjYXBhYmlsaXRpZXM/IFRoaXMgc291bmRzIGxpa2UgcG90ZW50aWFsbHkgdmVyeSBpbnRlcmVzdGluZyBjb2RlIHRvIGFuYWx5emUuIEknbSBrZWVuIHRvIHVuZGVyc3RhbmQgdGhlIGludGVyZGVwZW5kZW5jaWVzIGJldHdlZW4gdGhlc2UgdHdvIGZ1bmN0aW9ucyBpbiByZWxhdGlvbiB0byBUSFAgZW5hYmxlbWVudCBhbmQgZmlsZSBtYXBwaW5nLiBMZXQncyBzZWUgaG93IHRoZXNlIGZ1bmN0aW9uIGNhbGxzIHdlYXZlIHRvZ2V0aGVyIHdpdGhpbiB0aGUgbWVtb3J5IG1hbmFnZW1lbnQgc3Vic3lzdGVtLlxuXG5cbiIsIklucHV0VG9rZW5zIjo0MjU5LCJPdXRwdXRUb2tlbnMiOjM1LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MzMsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMDdUMjE6NTY6MDkuMzg0Mjk5NjkzWiIsIlNlcSI6MjgsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjQ0MjM2MSwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJtbS9odWdlX21lbW9yeS5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDEyMCxcbiAgXCJMaW5lQ291bnRcIjogODBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiIDEyMDpcXHRcXG4gMTIxOlxcdHN0YXRpYyBib29sIHZtYV9maWxlX2J5cGFzc190aHBfdHVuZWFibGVzKGNvbnN0IHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxcbiAxMjI6XFx0XFx0XFx0ZW51bSB0dmFfdHlwZSB0eXBlKVxcbiAxMjM6XFx0e1xcbiAxMjQ6XFx0XFx0Y29uc3QgYm9vbCBoYXNfaHVnZV9mYXVsdCA9IHZtYS1cXHUwMDNldm1fb3BzLVxcdTAwM2VodWdlX2ZhdWx0O1xcbiAxMjU6XFx0XFxuIDEyNjpcXHRcXHQvKiBNQURWX0NPTExBUFNFIGlnbm9yZXMgdHVuZWFibGVzLiAqL1xcbiAxMjc6XFx0XFx0aWYgKHR5cGUgPT0gVFZBX0ZPUkNFRF9DT0xMQVBTRSlcXG4gMTI4OlxcdFxcdFxcdHJldHVybiB0cnVlO1xcbiAxMjk6XFx0XFx0LyogSHVnZSBQRk4gbWFwcGluZ3MgYXJlIHVuY29tcGFjdGFibGUgc28gdGhlIHBvbGljeSBkb2Vzbid0IGFwcGx5LiAqL1xcbiAxMzA6XFx0XFx0aWYgKHZtYV90ZXN0KHZtYSwgVk1BX1BGTk1BUF9CSVQpIFxcdTAwMjZcXHUwMDI2IGhhc19odWdlX2ZhdWx0KVxcbiAxMzE6XFx0XFx0XFx0cmV0dXJuIHRydWU7XFxuIDEzMjpcXHRcXHRyZXR1cm4gZmFsc2U7XFxuIDEzMzpcXHR9XFxuIDEzNDpcXHRcXG4gMTM1OlxcdHN0YXRpYyBib29sIHZtYV9maWxlX2FsbG93X3RocF90dW5lYWJsZXModm1fZmxhZ3NfdCB2bV9mbGFncylcXG4gMTM2OlxcdHtcXG4gMTM3OlxcdFxcdC8qIFRIUD1hbHdheXM/ICovXFxuIDEzODpcXHRcXHRpZiAoaHVnZXBhZ2VfZ2xvYmFsX2Fsd2F5cygpKVxcbiAxMzk6XFx0XFx0XFx0cmV0dXJuIHRydWU7XFxuIDE0MDpcXHRcXHQvKiBUSFA9bWFkdmlzZSBhbmQgbWFya2VkIE1BRFZfSFVHRVBBR0U/ICovXFxuIDE0MTpcXHRcXHRpZiAoaHVnZXBhZ2VfZ2xvYmFsX2VuYWJsZWQoKSBcXHUwMDI2XFx1MDAyNiAodm1fZmxhZ3MgXFx1MDAyNiBWTV9IVUdFUEFHRSkpXFxuIDE0MjpcXHRcXHRcXHRyZXR1cm4gdHJ1ZTtcXG4gMTQzOlxcdFxcdHJldHVybiBmYWxzZTtcXG4gMTQ0OlxcdH1cXG4gMTQ1OlxcdFxcbiAxNDY6XFx0c3RhdGljIGJvb2wgdm1hX2ZpbGVfY2hlY2tfdGhwX3R1bmVhYmxlcyhjb25zdCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcXG4gMTQ3OlxcdFxcdFxcdHZtX2ZsYWdzX3Qgdm1fZmxhZ3MsIGVudW0gdHZhX3R5cGUgdHlwZSlcXG4gMTQ4OlxcdHtcXG4gMTQ5OlxcdFxcdHJldHVybiB2bWFfZmlsZV9ieXBhc3NfdGhwX3R1bmVhYmxlcyh2bWEsIHR5cGUpIHx8XFxuIDE1MDpcXHRcXHRcXHR2bWFfZmlsZV9hbGxvd190aHBfdHVuZWFibGVzKHZtX2ZsYWdzKTtcXG4gMTUxOlxcdH1cXG4gMTUyOlxcdFxcbiAxNTM6XFx0c3RhdGljIGJvb2wgdm1hX2ZpbGVfY2FuX21hcF9odWdlKGNvbnN0IHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxcbiAxNTQ6XFx0XFx0XFx0dm1fZmxhZ3NfdCB2bV9mbGFncywgZW51bSB0dmFfdHlwZSB0eXBlKVxcbiAxNTU6XFx0e1xcbiAxNTY6XFx0XFx0Y29uc3QgYm9vbCBoYXNfaHVnZV9mYXVsdCA9IHZtYS1cXHUwMDNldm1fb3BzLVxcdTAwM2VodWdlX2ZhdWx0O1xcbiAxNTc6XFx0XFxuIDE1ODpcXHRcXHQvKlxcbiAxNTk6XFx0XFx0ICogRW5mb3JjZSBUSFAgY29sbGFwc2UgcmVxdWlyZW1lbnRzIGFzIG5lY2Vzc2FyeS4gQW5vbnltb3VzIHZtYXNcXG4gMTYwOlxcdFxcdCAqIHdlcmUgYWxyZWFkeSBoYW5kbGVkIGluIHRocF92bWFfYWxsb3dhYmxlX29yZGVycygpLlxcbiAxNjE6XFx0XFx0ICovXFxuIDE2MjpcXHRcXHRpZiAoIXZtYV9maWxlX2NoZWNrX3RocF90dW5lYWJsZXModm1hLCB2bV9mbGFncywgdHlwZSkpXFxuIDE2MzpcXHRcXHRcXHRyZXR1cm4gZmFsc2U7XFxuIDE2NDpcXHRcXG4gMTY1OlxcdFxcdHN3aXRjaCAodHlwZSkge1xcbiAxNjY6XFx0XFx0Y2FzZSBUVkFfUEFHRUZBVUxUOlxcbiAxNjc6XFx0XFx0XFx0LypcXG4gMTY4OlxcdFxcdFxcdCAqIFRydXN0IHRoYXQgLVxcdTAwM2VodWdlX2ZhdWx0KCkgaGFuZGxlcnMga25vdyB3aGF0IHRoZXkgYXJlIGRvaW5nXFxuIDE2OTpcXHRcXHRcXHQgKiBpbiBmYXVsdCBwYXRoLlxcbiAxNzA6XFx0XFx0XFx0ICovXFxuIDE3MTpcXHRcXHRcXHRyZXR1cm4gaGFzX2h1Z2VfZmF1bHQ7XFxuIDE3MjpcXHRcXHRjYXNlIFRWQV9TTUFQUzpcXG4gMTczOlxcdFxcdFxcdGlmIChoYXNfaHVnZV9mYXVsdClcXG4gMTc0OlxcdFxcdFxcdFxcdHJldHVybiB0cnVlO1xcbiAxNzU6XFx0XFx0XFx0ZmFsbHRocm91Z2g7XFxuIDE3NjpcXHRcXHRkZWZhdWx0OlxcbiAxNzc6XFx0XFx0XFx0LyogT25seSByZWd1bGFyIGZpbGUgaXMgdmFsaWQgaW4gY29sbGFwc2UgcGF0aC4gKi9cXG4gMTc4OlxcdFxcdFxcdHJldHVybiBmaWxlX3RocF9lbmFibGVkKHZtYSk7XFxuIDE3OTpcXHRcXHR9XFxuIDE4MDpcXHR9XFxuIDE4MTpcXHRcXG4gMTgyOlxcdHVuc2lnbmVkIGxvbmcgX190aHBfdm1hX2FsbG93YWJsZV9vcmRlcnMoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXFxuIDE4MzpcXHRcXHRcXHRcXHRcXHRcXHQgdm1fZmxhZ3NfdCB2bV9mbGFncyxcXG4gMTg0OlxcdFxcdFxcdFxcdFxcdFxcdCBlbnVtIHR2YV90eXBlIHR5cGUsXFxuIDE4NTpcXHRcXHRcXHRcXHRcXHRcXHQgdW5zaWduZWQgbG9uZyBvcmRlcnMpXFxuIDE4NjpcXHR7XFxuIDE4NzpcXHRcXHRjb25zdCBib29sIHNtYXBzID0gdHlwZSA9PSBUVkFfU01BUFM7XFxuIDE4ODpcXHRcXHRjb25zdCBib29sIGluX3BmID0gdHlwZSA9PSBUVkFfUEFHRUZBVUxUO1xcbiAxODk6XFx0XFx0Y29uc3QgYm9vbCBmb3JjZWRfY29sbGFwc2UgPSB0eXBlID09IFRWQV9GT1JDRURfQ09MTEFQU0U7XFxuIDE5MDpcXHRcXHR1bnNpZ25lZCBsb25nIHN1cHBvcnRlZF9vcmRlcnM7XFxuIDE5MTpcXHRcXG4gMTkyOlxcdFxcdC8qIENoZWNrIHRoZSBpbnRlcnNlY3Rpb24gb2YgcmVxdWVzdGVkIGFuZCBzdXBwb3J0ZWQgb3JkZXJzLiAqL1xcbiAxOTM6XFx0XFx0aWYgKHZtYV9pc19hbm9ueW1vdXModm1hKSlcXG4gMTk0OlxcdFxcdFxcdHN1cHBvcnRlZF9vcmRlcnMgPSBUSFBfT1JERVJTX0FMTF9BTk9OO1xcbiAxOTU6XFx0XFx0ZWxzZSBpZiAodm1hX2lzX2RheCh2bWEpIHx8IHZtYV9pc19zcGVjaWFsX2h1Z2Uodm1hKSlcXG4gMTk2OlxcdFxcdFxcdHN1cHBvcnRlZF9vcmRlcnMgPSBUSFBfT1JERVJTX0FMTF9TUEVDSUFMX0RBWDtcXG4gMTk3OlxcdFxcdGVsc2VcXG4gMTk4OlxcdFxcdFxcdHN1cHBvcnRlZF9vcmRlcnMgPSBUSFBfT1JERVJTX0FMTF9GSUxFX0RFRkFVTFQ7XFxuIDE5OTpcXHRcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDdUMjE6NTY6MDkuMzg0NzQ2NTQ0WiIsIlNlcSI6MjksIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjIxNjE4MDU5MjUsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSB0YWtlIG9uIHRoZSB0aG91Z2h0IHByb2Nlc3MsIGFzIHJlcXVlc3RlZDpcblxuKipEaXZpbmcgaW50byBgX190aHBfdm1hX2FsbG93YWJsZV9vcmRlcnNgIGluIGBtbS9odWdlX21lbW9yeS5jYCoqXG5cbk9rYXksIHNvIEkgbmVlZCB0byBnZXQgYSBiZXR0ZXIgZ3Jhc3Agb2YgdGhlIGxvZ2ljIHdpdGhpbiBgX190aHBfdm1hX2FsbG93YWJsZV9vcmRlcnNgLiBJJ3ZlIGJlZW4gd29ya2luZyB3aXRoIGh1Z2UgcGFnZXMgbGF0ZWx5LCBhbmQgSSB3YW50IHRvIHJlYWxseSB1bmRlcnN0YW5kIHRoZSBjb25kaXRpb25zIHRoYXQgZ292ZXJuIHdoZXRoZXIgb3Igbm90IGEgc3BlY2lmaWMgVk1BIGNhbiBhY3R1YWxseSAqdXNlKiB0aGVtLiBJdCdzIGEgY3JpdGljYWwgZnVuY3Rpb24sIGRldGVybWluaW5nIHRoZSBzaXppbmcgb2YgVEhQcyBhdmFpbGFibGUgdG8gdGhlIFZNQS5cblxuSSdtIHNraXBwaW5nIHRoZSBwcmVsaW1pbmFyaWVzIGFuZCBnb2luZyBzdHJhaWdodCB0byBsaW5lcyAyMDAgdGhyb3VnaCAyNjAgb2YgYG1tL2h1Z2VfbWVtb3J5LmNgLiBUaG9zZSBsaW5lcyBzaG91bGQgZ2l2ZSBtZSB0aGUgcmVzdCBvZiB0aGUgcHV6emxlIHBpZWNlcy4gSSdtIGV4cGVjdGluZyB0byBmaW5kIHRoZSBrZXkgY29uc3RyYWludHMgb3V0bGluZWQuIFNwZWNpZmljYWxseSBJJ20gaG9waW5nIHRvIHNlZTogaWYgdGhlcmUncyBhbnkgcmVtYWluaW5nIGxvZ2ljLCBhbnkgZGVwZW5kZW5jaWVzLCBvciBzcGVjaWFsIGhhbmRsaW5nIEkgbmVlZCB0byBiZSBhd2FyZSBvZi4gSSBuZWVkIHRvIGJlIGFibGUgdG8gYW50aWNpcGF0ZSBwcm9ibGVtcyBhbmQgZXhwbGFpbiBlZGdlIGNhc2VzLiBMZXQncyBzZWUgd2hhdCB0aGUgY29kZSBzYXlzLlxuXG5cbiIsIklucHV0VG9rZW5zIjo1OTcyLCJPdXRwdXRUb2tlbnMiOjM1LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NDEsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0wN1QyMTo1NjoxMS41NDY1NTU0OThaIiwiU2VxIjozMCwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NDc5OTcwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcIm1tL2h1Z2VfbWVtb3J5LmNcIixcbiAgXCJGaXJzdExpbmVcIjogMjAwLFxuICBcIkxpbmVDb3VudFwiOiA2NVxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgMjAwOlxcdFxcdG9yZGVycyBcXHUwMDI2PSBzdXBwb3J0ZWRfb3JkZXJzO1xcbiAyMDE6XFx0XFx0aWYgKCFvcmRlcnMpXFxuIDIwMjpcXHRcXHRcXHRyZXR1cm4gMDtcXG4gMjAzOlxcdFxcbiAyMDQ6XFx0XFx0aWYgKCF2bWEtXFx1MDAzZXZtX21tKVxcdFxcdC8qIHZkc28gKi9cXG4gMjA1OlxcdFxcdFxcdHJldHVybiAwO1xcbiAyMDY6XFx0XFxuIDIwNzpcXHRcXHRpZiAodGhwX2Rpc2FibGVkX2J5X2h3KCkgfHwgdm1hX3RocF9kaXNhYmxlZCh2bWEsIHZtX2ZsYWdzLCBmb3JjZWRfY29sbGFwc2UpKVxcbiAyMDg6XFx0XFx0XFx0cmV0dXJuIDA7XFxuIDIwOTpcXHRcXG4gMjEwOlxcdFxcdC8qIGtodWdlcGFnZWQgZG9lc24ndCBjb2xsYXBzZSBEQVggdm1hLCBidXQgcGFnZSBmYXVsdCBpcyBmaW5lLiAqL1xcbiAyMTE6XFx0XFx0aWYgKHZtYV9pc19kYXgodm1hKSlcXG4gMjEyOlxcdFxcdFxcdHJldHVybiBpbl9wZiA/IG9yZGVycyA6IDA7XFxuIDIxMzpcXHRcXG4gMjE0OlxcdFxcdC8qXFxuIDIxNTpcXHRcXHQgKiBraHVnZXBhZ2VkIHNwZWNpYWwgVk1BIGFuZCBodWdldGxiIFZNQS5cXG4gMjE2OlxcdFxcdCAqIE11c3QgYmUgY2hlY2tlZCBhZnRlciBkYXggc2luY2Ugc29tZSBkYXggbWFwcGluZ3MgbWF5IGhhdmVcXG4gMjE3OlxcdFxcdCAqIFZNX01JWEVETUFQIHNldC5cXG4gMjE4OlxcdFxcdCAqL1xcbiAyMTk6XFx0XFx0aWYgKCFpbl9wZiBcXHUwMDI2XFx1MDAyNiAhc21hcHMgXFx1MDAyNlxcdTAwMjYgKHZtX2ZsYWdzIFxcdTAwMjYgVk1fTk9fS0hVR0VQQUdFRCkpXFxuIDIyMDpcXHRcXHRcXHRyZXR1cm4gMDtcXG4gMjIxOlxcdFxcbiAyMjI6XFx0XFx0LypcXG4gMjIzOlxcdFxcdCAqIENoZWNrIGFsaWdubWVudCBmb3IgZmlsZSB2bWEgYW5kIHNpemUgZm9yIGJvdGggZmlsZSBhbmQgYW5vbiB2bWEgYnlcXG4gMjI0OlxcdFxcdCAqIGZpbHRlcmluZyBvdXQgdGhlIHVuc3VpdGFibGUgb3JkZXJzLlxcbiAyMjU6XFx0XFx0ICpcXG4gMjI2OlxcdFxcdCAqIFNraXAgdGhlIGNoZWNrIGZvciBwYWdlIGZhdWx0LiBIdWdlIGZhdWx0IGRvZXMgdGhlIGNoZWNrIGluIGZhdWx0XFxuIDIyNzpcXHRcXHQgKiBoYW5kbGVycy5cXG4gMjI4OlxcdFxcdCAqL1xcbiAyMjk6XFx0XFx0aWYgKCFpbl9wZikge1xcbiAyMzA6XFx0XFx0XFx0aW50IG9yZGVyID0gaGlnaGVzdF9vcmRlcihvcmRlcnMpO1xcbiAyMzE6XFx0XFx0XFx0dW5zaWduZWQgbG9uZyBhZGRyO1xcbiAyMzI6XFx0XFxuIDIzMzpcXHRcXHRcXHR3aGlsZSAob3JkZXJzKSB7XFxuIDIzNDpcXHRcXHRcXHRcXHRhZGRyID0gdm1hLVxcdTAwM2V2bV9lbmQgLSAoUEFHRV9TSVpFIFxcdTAwM2NcXHUwMDNjIG9yZGVyKTtcXG4gMjM1OlxcdFxcdFxcdFxcdGlmICh0aHBfdm1hX3N1aXRhYmxlX29yZGVyKHZtYSwgYWRkciwgb3JkZXIpKVxcbiAyMzY6XFx0XFx0XFx0XFx0XFx0YnJlYWs7XFxuIDIzNzpcXHRcXHRcXHRcXHRvcmRlciA9IG5leHRfb3JkZXIoXFx1MDAyNm9yZGVycywgb3JkZXIpO1xcbiAyMzg6XFx0XFx0XFx0fVxcbiAyMzk6XFx0XFxuIDI0MDpcXHRcXHRcXHRpZiAoIW9yZGVycylcXG4gMjQxOlxcdFxcdFxcdFxcdHJldHVybiAwO1xcbiAyNDI6XFx0XFx0fVxcbiAyNDM6XFx0XFxuIDI0NDpcXHRcXHQvKlxcbiAyNDU6XFx0XFx0ICogRW5hYmxlZCB2aWEgc2htZW0gbW91bnQgb3B0aW9ucyBvciBzeXNmcyBzZXR0aW5ncy5cXG4gMjQ2OlxcdFxcdCAqIE11c3QgYmUgZG9uZSBiZWZvcmUgaHVnZXBhZ2UgZmxhZ3MgY2hlY2sgc2luY2Ugc2htZW0gaGFzIGl0c1xcbiAyNDc6XFx0XFx0ICogb3duIGZsYWdzLlxcbiAyNDg6XFx0XFx0ICovXFxuIDI0OTpcXHRcXHRpZiAoIWluX3BmIFxcdTAwMjZcXHUwMDI2IHNobWVtX2ZpbGUodm1hLVxcdTAwM2V2bV9maWxlKSlcXG4gMjUwOlxcdFxcdFxcdHJldHVybiBvcmRlcnMgXFx1MDAyNiBzaG1lbV9hbGxvd2FibGVfaHVnZV9vcmRlcnMoZmlsZV9pbm9kZSh2bWEtXFx1MDAzZXZtX2ZpbGUpLFxcbiAyNTE6XFx0XFx0XFx0XFx0XFx0XFx0XFx0ICAgdm1hLCB2bWFfc3RhcnRfcGdvZmYodm1hKSwgMCxcXG4gMjUyOlxcdFxcdFxcdFxcdFxcdFxcdFxcdCAgIGZvcmNlZF9jb2xsYXBzZSk7XFxuIDI1MzpcXHRcXG4gMjU0OlxcdFxcdGlmICghdm1hX2lzX2Fub255bW91cyh2bWEpKVxcbiAyNTU6XFx0XFx0XFx0cmV0dXJuIHZtYV9maWxlX2Nhbl9tYXBfaHVnZSh2bWEsIHZtX2ZsYWdzLCB0eXBlKSA/IG9yZGVycyA6IDA7XFxuIDI1NjpcXHRcXG4gMjU3OlxcdFxcdGlmICh2bWFfaXNfdGVtcG9yYXJ5X3N0YWNrKHZtYSkpXFxuIDI1ODpcXHRcXHRcXHRyZXR1cm4gMDtcXG4gMjU5OlxcdFxcbiAyNjA6XFx0XFx0LypcXG4gMjYxOlxcdFxcdCAqIFRIUGVsaWdpYmxlIGJpdCBvZiBzbWFwcyBzaG91bGQgc2hvdyAxIGZvciBwcm9wZXIgVk1BcyBldmVuXFxuIDI2MjpcXHRcXHQgKiB0aG91Z2ggYW5vbl92bWEgaXMgbm90IGluaXRpYWxpemVkIHlldC5cXG4gMjYzOlxcdFxcdCAqXFxuIDI2NDpcXHRcXHQgKiBBbGxvdyBwYWdlIGZhdWx0IHNpbmNlIGFub25fdm1hIG1heSBiZSBub3QgaW5pdGlhbGl6ZWQgdW50aWxcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDdUMjE6NTY6MTEuNTQ3MDM4NzM4WiIsIlNlcSI6MzEsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjU4NTYzODgyMDIsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIHRoZSBUSFAgUGF0Y2ggZm9yIFVuaW5pdGlhbGl6ZWQgTWVtb3J5KipcblxuT2theSwgbGV0J3MgYnJlYWsgdGhpcyBkb3duLiBGaXJzdCwgdGhpcyBwYXRjaCBhZGRlZCBhIGBjb25zdGAgcXVhbGlmaWVyIHRvIGBmaWxlX3RocF9lbmFibGVkKClgLCBhIG1pbm9yIGNoYW5nZS4gTW9yZSBpbXBvcnRhbnRseSwgaXQgcmVmYWN0b3JlZCBsb2dpYyBmcm9tIGBfX3RocF92bWFfYWxsb3dhYmxlX29yZGVyc2AgaW50byBzZXZlcmFsIGhlbHBlciBmdW5jdGlvbnM6IGB2bWFfZmlsZV9ieXBhc3NfdGhwX3R1bmVhYmxlc2AsIGB2bWFfZmlsZV9hbGxvd190aHBfdHVuZWFibGVzYCwgYHZtYV9maWxlX2NoZWNrX3RocF90dW5lYWJsZXNgLCBhbmQgYHZtYV9maWxlX2Nhbl9tYXBfaHVnZWAuIEl0IGFsc28gc3BlY2lmaWNhbGx5IGFkZGVkIGEgYnlwYXNzIGZvciBQRk5NQVAgd2l0aCBgaHVnZV9mYXVsdGAuXG5cbk15IGNvbmNlcm4sIGFzIGFsd2F5cywgaXMgdW5pbml0aWFsaXplZCBtZW1vcnkuIEkgbmVlZCB0byBlbnN1cmUgdGhpcyBwYXRjaCBkb2Vzbid0IGludHJvZHVjZSBvciBleHBvc2UgYW55IHZ1bG5lcmFiaWxpdGllcyByZWxhdGVkIHRvIHJlYWRpbmcgdW5pbml0aWFsaXplZCBkYXRhLiBTcGVjaWZpY2FsbHksIEkgbmVlZCB0byBjaGVjazogZG9lcyB0aGlzIHBhdGNoIGludGVyYWN0IHdpdGgga2VybmVsIHN0cnVjdHVyZXMgZXhwb3NlZCB0byB1c2Vyc3BhY2UsIGFyZSB0aGVyZSBjb25kaXRpb25hbCBicmFuY2hlcyBiYXNlZCBvbiBwb3RlbnRpYWxseSB1bmluaXRpYWxpemVkIHZhcmlhYmxlcywgZG9lcyBpdCBhbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBkYXRhIHN0cnVjdHVyZXMgdGhhdCBjb3VsZCBsZWFkIHRvIHN1YnNlcXVlbnQgcmVhZHMgb2YgdW5pbml0aWFsaXplZCBtZW1vcnksIG9yIGlzIGl0IG1vZGlmeWluZyBhbnkgYm91bmRzIGNoZWNrcyBvciBsb2dpYyBpbiBhIHdheSB0aGF0IGNvdWxkIGV4cG9zZSB1bmluaXRpYWxpemVkIGRhdGE/XG5cbkknbSBsb29raW5nIGNsb3NlbHkgYXQgaG93IGB2bWEtXHUwMDNldm1fb3BzYCBhbmQgYHZtYWAgZmxhZ3MgYXJlIGhhbmRsZWQgd2l0aGluIHRoZXNlIGZ1bmN0aW9ucy4gSSdtIG5vdGluZyB0aGF0IGB2bWEtXHUwMDNldm1fb3BzYCBtaWdodCBuZWVkIHNwZWNpYWwgYXR0ZW50aW9uLiBJcyB0aGVyZSBhIHBvc3NpYmlsaXR5IG9mIGEgbnVsbCBkZXJlZmVyZW5jZSBpZiBgdm1hLVx1MDAzZXZtX29wc2AgaXMgTlVMTD8gS0FTQU4gYW5kIG90aGVyIGRldGVjdG9ycyBzaG91bGQgY2F0Y2ggdGhhdCwgYnV0IEknbSBiZWluZyB0aG9yb3VnaCBoZXJlLiBJJ20gY29uc2lkZXJpbmcgS01TQU4gdnMgS0FTQU46IEtNU0FOIGlzIGZvciB1bmluaXRpYWxpemVkIHJlYWRzIGFuZCBsZWFrcywgS0FTQU4gZm9yIG91dC1vZi1ib3VuZHMsIHVzZS1hZnRlci1mcmVlLCBldGMuLCBhbmQga2VybmVsIHBhbmljIGZvciBudWxsIGRlcmVmLiBMT0NLREVQIGZvciBsb2NrIGlzc3Vlcy5cblxuQWZ0ZXIgY2FyZWZ1bCByZXZpZXcsIEkndmUgY29uZmlybWVkIHRoYXQgdGhlIHZhcmlhYmxlcyBiZWluZyBjaGVja2VkIChgdm1hLVx1MDAzZXZtX29wcy1cdTAwM2VodWdlX2ZhdWx0YCwgYHR5cGVgLCBgdm1fZmxhZ3NgLCBhbmQgYHZtYWAgZmxhZ3MpIGFyZSBhbGwgaW5pdGlhbGl6ZWQsIGVpdGhlciBhcyBtZW1iZXIgZmllbGRzIG9mIHRoZSBgdm1fYXJlYV9zdHJ1Y3RgIG9yIGFzIGZ1bmN0aW9uIGFyZ3VtZW50cyBwYXNzZWQgYnkgdmFsdWUuIFRoZXJlJ3Mgbm8gaW50ZXJhY3Rpb24gd2l0aCB1c2Vyc3BhY2Ugc3RydWN0dXJlcyB0aGF0IHdvdWxkIGNhdXNlIGlzc3Vlcy4gVGhpcyBwYXRjaCBpcyBwdXJlbHkgYWJvdXQgZGV0ZXJtaW5pbmcgdGhlIHN1aXRhYmlsaXR5IG9mIFRIUCAoVHJhbnNwYXJlbnQgSHVnZSBQYWdlcykgbWFwcGluZyBwb2xpY3kgZm9yIGEgZ2l2ZW4gVk1BLiBJdCBkb2Vzbid0IG1vZGlmeSBhbnkgYm91bmRzIGNoZWNrcyBvciBpbml0aWFsaXphdGlvbiBsb2dpYywgc28gdGhlcmUgc2hvdWxkIGJlIG5vIHJpc2sgb2YgcmVhZGluZyB1bmluaXRpYWxpemVkIG1lbW9yeS5cblxuVGhlcmVmb3JlLCB0aGlzIGNoYW5nZSBkb2Vzbid0IGludHJvZHVjZSBvciBleHBvc2UgYW55IHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJlYWRzIG9yIGxlYWtzLiBTdGFuZGFyZCBmdXp6aW5nIGFuZCBLQVNBTiBzaG91bGQgYmUgc3VmZmljaWVudDsgS01TQU4gaXMgbm90IG5lZWRlZCBoZXJlLlxuXG5JJ20gY29uZmlkZW50IGluIG15IGFuYWx5c2lzLiBUaGUgcmVhc29uaW5nIGlzIHNvdW5kLiBJJ2xsIGdvIGFoZWFkIGFuZCBjYWxsIGBzZXQtcmVzdWx0c2AuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjcyNTIsIk91dHB1dFRva2VucyI6MjY1LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NzE1LCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMDdUMjE6NTY6MTcuNDAzNDMwOThaIiwiU2VxIjozMiwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoic2V0LXJlc3VsdHMiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyNjkyMCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIHJlZmFjdG9ycyBUSFAgKFRyYW5zcGFyZW50IEh1Z2UgUGFnZSkgcG9saWN5IGNoZWNrcyBmb3IgZmlsZS1iYWNrZWQgYW5kIHNwZWNpYWwvUEZOTUFQIFZNQXMgaW4gYG1tL2h1Z2VfbWVtb3J5LmNgLiBJdCBicmVha3Mgb3V0IHRoZSBsb2dpYyBmb3IgY2hlY2tpbmcgVEhQIHR1bmFibGVzIGFuZCBodWdlIHBhZ2Ugc3VwcG9ydCBpbnRvIGhlbHBlciBmdW5jdGlvbnMgKGB2bWFfZmlsZV9ieXBhc3NfdGhwX3R1bmVhYmxlc2AsIGB2bWFfZmlsZV9hbGxvd190aHBfdHVuZWFibGVzYCwgYHZtYV9maWxlX2NoZWNrX3RocF90dW5lYWJsZXNgLCBhbmQgYHZtYV9maWxlX2Nhbl9tYXBfaHVnZWApIGFuZCBhbGxvd3MgUEZOTUFQIFZNQXMgd2l0aCBgaHVnZV9mYXVsdGAgaGFuZGxlcnMgdG8gYnlwYXNzIGdsb2JhbCBUSFAgdHVuYWJsZXMuXFxuXFxuTm9uZSBvZiB0aGUgY2hhbmdlcyB0b3VjaCBidWZmZXIgY29waWVzIHRvIHVzZXIgc3BhY2UsIHVuaW5pdGlhbGl6ZWQgc3RhY2sgb3IgaGVhcCBtZW1vcnksIG9yIG1lbW9yeSBhbGxvY2F0aW9ucy4gQWxsIHZhcmlhYmxlcyBhbmQgc3RydWN0IG1lbWJlcnMgZXZhbHVhdGVkIChzdWNoIGFzIGB2bWEtXFx1MDAzZXZtX29wc2AsIGB2bV9mbGFnc2AsIGFuZCBgdHlwZWApIGFyZSBmdWxseSBpbml0aWFsaXplZCBhcmd1bWVudHMgb3Igc3RydWN0dXJlIGZpZWxkcy4gUG90ZW50aWFsIGlzc3VlcyBpbiB0aGlzIGNvZGUgcGF0aCAoc3VjaCBhcyBOVUxMIHBvaW50ZXIgZGVyZWZlcmVuY2VzIGlmIGB2bV9vcHNgIHdlcmUgTlVMTCkgYXJlIGRldGVjdGVkIGJ5IHN0YW5kYXJkIGtlcm5lbCBmYXVsdCBoYW5kbGVycyBhbmQgS0FTQU4uIFRoZXJlIGlzIG5vIHJpc2sgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgdXNhZ2Ugb3IgaW5mb3JtYXRpb24gbGVha3MgdGhhdCB3b3VsZCByZXF1aXJlIEtNU0FOLlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2Vcbn0iLCJSZXN1bHRzIjoie1xuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIHJlZmFjdG9ycyBUSFAgKFRyYW5zcGFyZW50IEh1Z2UgUGFnZSkgcG9saWN5IGNoZWNrcyBmb3IgZmlsZS1iYWNrZWQgYW5kIHNwZWNpYWwvUEZOTUFQIFZNQXMgaW4gYG1tL2h1Z2VfbWVtb3J5LmNgLiBJdCBicmVha3Mgb3V0IHRoZSBsb2dpYyBmb3IgY2hlY2tpbmcgVEhQIHR1bmFibGVzIGFuZCBodWdlIHBhZ2Ugc3VwcG9ydCBpbnRvIGhlbHBlciBmdW5jdGlvbnMgKGB2bWFfZmlsZV9ieXBhc3NfdGhwX3R1bmVhYmxlc2AsIGB2bWFfZmlsZV9hbGxvd190aHBfdHVuZWFibGVzYCwgYHZtYV9maWxlX2NoZWNrX3RocF90dW5lYWJsZXNgLCBhbmQgYHZtYV9maWxlX2Nhbl9tYXBfaHVnZWApIGFuZCBhbGxvd3MgUEZOTUFQIFZNQXMgd2l0aCBgaHVnZV9mYXVsdGAgaGFuZGxlcnMgdG8gYnlwYXNzIGdsb2JhbCBUSFAgdHVuYWJsZXMuXFxuXFxuTm9uZSBvZiB0aGUgY2hhbmdlcyB0b3VjaCBidWZmZXIgY29waWVzIHRvIHVzZXIgc3BhY2UsIHVuaW5pdGlhbGl6ZWQgc3RhY2sgb3IgaGVhcCBtZW1vcnksIG9yIG1lbW9yeSBhbGxvY2F0aW9ucy4gQWxsIHZhcmlhYmxlcyBhbmQgc3RydWN0IG1lbWJlcnMgZXZhbHVhdGVkIChzdWNoIGFzIGB2bWEtXFx1MDAzZXZtX29wc2AsIGB2bV9mbGFnc2AsIGFuZCBgdHlwZWApIGFyZSBmdWxseSBpbml0aWFsaXplZCBhcmd1bWVudHMgb3Igc3RydWN0dXJlIGZpZWxkcy4gUG90ZW50aWFsIGlzc3VlcyBpbiB0aGlzIGNvZGUgcGF0aCAoc3VjaCBhcyBOVUxMIHBvaW50ZXIgZGVyZWZlcmVuY2VzIGlmIGB2bV9vcHNgIHdlcmUgTlVMTCkgYXJlIGRldGVjdGVkIGJ5IHN0YW5kYXJkIGtlcm5lbCBmYXVsdCBoYW5kbGVycyBhbmQgS0FTQU4uIFRoZXJlIGlzIG5vIHJpc2sgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgdXNhZ2Ugb3IgaW5mb3JtYXRpb24gbGVha3MgdGhhdCB3b3VsZCByZXF1aXJlIEtNU0FOLlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2Vcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfV07CgkJCWlmICghcmF3RGF0YSB8fCByYXdEYXRhLmxlbmd0aCA9PT0gMCkgcmV0dXJuOwoKCQkJZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSk7CgkJCWRyYXdEdXJhdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCQlkcmF3VG9rZW5Db25zdW1wdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSkgewoJCQljb25zdCBzdGF0cyA9IHsKCQkJCWxsbTogeyBjb3VudDogMCwgdG9rZW5zOiAwLCBkdXJhdGlvbjogMCB9LAoJCQkJdG9vbDogeyBjb3VudDogMCwgZHVyYXRpb246IDAgfQoJCQl9OwoKCQkJcmF3RGF0YS5mb3JFYWNoKHMgPT4gewoJCQkJY29uc3QgZHVyID0gcy5EdXJhdGlvbiAvIDEwMDAwMDAwMDA7IAoJCQkJaWYgKHMuVHlwZSA9PT0gImxsbSIpIHsKCQkJCQlzdGF0cy5sbG0uY291bnQrKzsKCQkJCQlzdGF0cy5sbG0udG9rZW5zICs9IChzLklucHV0VG9rZW5zICsgcy5PdXRwdXRUb2tlbnMgKyBzLk91dHB1dFRob3VnaHRzVG9rZW5zKTsKCQkJCQlzdGF0cy5sbG0uZHVyYXRpb24gKz0gZHVyOwoJCQkJfSBlbHNlIGlmIChzLlR5cGUgPT09ICJ0b29sIikgewoJCQkJCXN0YXRzLnRvb2wuY291bnQrKzsKCQkJCQlzdGF0cy50b29sLmR1cmF0aW9uICs9IGR1cjsKCQkJCX0KCQkJfSk7CgoJCQljb25zdCBhdmdMbG1EdXIgPSBzdGF0cy5sbG0uY291bnQgPiAwID8gKHN0YXRzLmxsbS5kdXJhdGlvbiAvIHN0YXRzLmxsbS5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgkJCWNvbnN0IGF2Z0xsbVRva2VuID0gc3RhdHMubGxtLmNvdW50ID4gMCA/IChzdGF0cy5sbG0udG9rZW5zIC8gc3RhdHMubGxtLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCQkJY29uc3QgYXZnVG9vbER1ciA9IHN0YXRzLnRvb2wuY291bnQgPiAwID8gKHN0YXRzLnRvb2wuZHVyYXRpb24gLyBzdGF0cy50b29sLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCgkJCWNvbnN0IGxsbVN1bWFyeUNlbGxzID0gW3N0YXRzLmxsbS5jb3VudCwgc3RhdHMubGxtLnRva2VucywgYXZnTGxtVG9rZW4sIHN0YXRzLmxsbS5kdXJhdGlvbiwgYXZnTGxtRHVyXTsKCQkJY29uc3QgdG9vbFN1bW1hcnlDZWxscyA9IFtzdGF0cy50b29sLmNvdW50LCBzdGF0cy50b29sLmR1cmF0aW9uLCBhdmdUb29sRHVyXTsKCgkJCWNvbnN0IGxsbVN1bW1hcnlCb2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xsbV9zdW1tYXJ5X3N0YXRzX2JvZHknKTsKCQkJbGxtU3VtbWFyeUJvZHkuaW5uZXJIVE1MID0gIiI7CgkJCWNvbnN0IGxsbVRyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndHInKTsKCQkJbGxtU3VtYXJ5Q2VsbHMuZm9yRWFjaChjZWxsID0+IHsKCQkJCWNvbnN0IHRkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTsKCQkJCXRkLnRleHRDb250ZW50ID0gY2VsbDsKCQkJCWxsbVRyLmFwcGVuZENoaWxkKHRkKTsKCQkJfSk7CgkJCWxsbVN1bW1hcnlCb2R5LmFwcGVuZENoaWxkKGxsbVRyKTsKCgkJCWNvbnN0IHRvb2xTdW1tYXJ5Qm9keSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b29sX3N1bW1hcnlfc3RhdHNfYm9keScpOwoJCQl0b29sU3VtbWFyeUJvZHkuaW5uZXJIVE1MID0gIiI7CgkJCWNvbnN0IHRvb2xUciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RyJyk7CgkJCXRvb2xTdW1tYXJ5Q2VsbHMuZm9yRWFjaChjZWxsID0+IHsKCQkJCWNvbnN0IHRkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTsKCQkJCXRkLnRleHRDb250ZW50ID0gY2VsbDsKCQkJCXRvb2xUci5hcHBlbmRDaGlsZCh0ZCk7CgkJCX0pOwoJCQl0b29sU3VtbWFyeUJvZHkuYXBwZW5kQ2hpbGQodG9vbFRyKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdEdXJhdGlvbkNoYXJ0KHJhd0RhdGEpIHsKCQkJY29uc3QgZmlsdGVyZWRTdGVwcyA9IHJhd0RhdGEuZmlsdGVyKGQgPT4gWyJsbG0iLCAidG9vbCJdLmluY2x1ZGVzKGQuVHlwZSkpOwoJCQljb25zdCBkYXRhID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkRhdGFUYWJsZSgpOwoJCQlkYXRhLmFkZENvbHVtbignc3RyaW5nJywgJ1N0ZXAnKTsKCQkJZGF0YS5hZGRDb2x1bW4oJ251bWJlcicsICdEdXJhdGlvbicpOwoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICd0b29sdGlwJ30pOyAKCgkJCWZpbHRlcmVkU3RlcHMuZm9yRWFjaChzID0+IHsKCQkJCQoJCQkJY29uc3QgZHVyID0gcy5EdXJhdGlvbiAvIDEwMDAwMDAwMDA7CgkJCQlsZXQgdG9vbHRpcCA9IHMuTmFtZTsKCQkJCWlmIChzLlR5cGUgPT09ICJsbG0iICYmIHMuVG9vbENhbGxzICYmIHMuVG9vbENhbGxzLmxlbmd0aCA+IDApIHsKCQkJCQl0b29sdGlwICs9IGBcblRvb2xzOiAke3MuVG9vbENhbGxzLmpvaW4oJywgJyl9YDsKCQkJCX0KCQkJCWRhdGEuYWRkUm93KFtgJHtzLlNlcX1gLCBkdXIsIHRvb2x0aXBdKTsKCQkJfSk7CgoJCQljb25zdCBvcHRpb25zID0gewoJCQkJdGl0bGU6ICdUaW1lIENvbnN1bXB0aW9uIG9mIExMTS9Ub29sIENhbGxzJywKCQkJCWhBeGlzOiB7CgkJCQkJdGl0bGU6ICdMTE0vVG9vbCBTdGVwcycsCgkJCQl9LAoJCQkJdkF4aXM6IHsgdGl0bGU6ICdTZWNvbmRzJyB9LAoJCQkJbGVnZW5kOiB7IHBvc2l0aW9uOiAnbm9uZScgfSwKCQkJCWJhcjogeyBncm91cFdpZHRoOiAnNzUlJyB9LAoJCQkJY2hhcnRBcmVhOiB7IHdpZHRoOiAnODUlJywgaGVpZ2h0OiAnNzAlJyB9LAoJCQkJaGVpZ2h0OiA0MDAKCQkJfTsKCgkJCWNvbnN0IGNoYXJ0ID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkNvbHVtbkNoYXJ0KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkdXJhdGlvbl9jaGFydF9kaXYnKSk7CgkJCWNoYXJ0LmRyYXcoZGF0YSwgb3B0aW9ucyk7CgkJfQoKCQlmdW5jdGlvbiBkcmF3VG9rZW5Db25zdW1wdGlvbkNoYXJ0KHJhd0RhdGEpIHsKCQkJY29uc3QgbGxtU3RlcHMgPSByYXdEYXRhLmZpbHRlcihkID0+IGQuVHlwZSA9PT0gImxsbSIpOwoJCQlpZiAobGxtU3RlcHMubGVuZ3RoID09PSAwKSByZXR1cm47CgoJCQljb25zdCBkYXRhID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkRhdGFUYWJsZSgpOwoJCQlkYXRhLmFkZENvbHVtbignc3RyaW5nJywgJ1N0ZXAnKTsJCQkKCQkJZGF0YS5hZGRDb2x1bW4oJ251bWJlcicsICdUb2tlbnMnKTsJCQkKCQkJZGF0YS5hZGRDb2x1bW4oe3R5cGU6ICdzdHJpbmcnLCByb2xlOiAnc3R5bGUnfSk7CQoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICd0b29sdGlwJ30pOwkKCgkJCWNvbnN0IGFnZW50Q29sb3JzID0ge307CgkJCWNvbnN0IHBhbGV0dGUgPSBbJyM0Mjg1RjQnLCAnI0RCNDQzNycsICcjRjRCNDAwJywgJyMwRjlENTgnLCAnI0FCNDdCQycsICcjMDBBQ0MxJ107CgkJCWxldCBjb2xvcklkeCA9IDA7CgkJCWNvbnN0IGFnZW50TExNQ291bnRzID0ge307CgkJCWxsbVN0ZXBzLmZvckVhY2gocyA9PiB7CgkJCQlpZiAoIWFnZW50Q29sb3JzW3MuTmFtZV0pIHsKCQkJCQlhZ2VudENvbG9yc1tzLk5hbWVdID0gcGFsZXR0ZVtjb2xvcklkeCAlIHBhbGV0dGUubGVuZ3RoXTsKCQkJCQljb2xvcklkeCsrOwoJCQkJfQoKCQkJCWFnZW50TExNQ291bnRzW3MuTmFtZV0gPSAoYWdlbnRMTE1Db3VudHNbcy5OYW1lXSB8fCAwKSArIDE7CgkJCQljb25zdCBsYWJlbCA9IGAke3MuTmFtZX0tJHthZ2VudExMTUNvdW50c1tzLk5hbWVdfWA7CgkJCQljb25zdCB0b3RhbFRva2VucyA9IHMuSW5wdXRUb2tlbnMgKyBzLk91dHB1dFRva2VucyArIHMuT3V0cHV0VGhvdWdodHNUb2tlbnM7CgkJCQljb25zdCBzdHlsZSA9IGBjb2xvcjogJHthZ2VudENvbG9yc1tzLk5hbWVdfWA7CgkJCQlsZXQgdG9vbHRpcCA9IGBUb3RhbCBUb2tlbnM6ICR7dG90YWxUb2tlbnN9XG4oSW46ICR7cy5JbnB1dFRva2Vuc30sIE91dDogJHtzLk91dHB1dFRva2Vuc30sIFRob3VnaHRzOiAke3MuT3V0cHV0VGhvdWdodHNUb2tlbnN9KWA7CgkJCQlpZiAocy5Ub29sQ2FsbHMgJiYgcy5Ub29sQ2FsbHMubGVuZ3RoID4gMCkgewoJCQkJCXRvb2x0aXAgKz0gYFxuVG9vbHM6ICR7cy5Ub29sQ2FsbHMuam9pbignLCAnKX1gOwoJCQkJfQoKCQkJCWRhdGEuYWRkUm93KFtsYWJlbCwgdG90YWxUb2tlbnMsIHN0eWxlLCB0b29sdGlwXSk7CgkJCX0pOwoKCQkJY29uc3Qgb3B0aW9ucyA9IHsKCQkJCXRpdGxlOiAnVG9rZW4gQ29uc3VtcHRpb24gYnkgTExNIENhbGxzJywKCQkJCWhBeGlzOiB7CgkJCQkJdGl0bGU6ICdMTE0gQ2FsbCBTZXF1ZW5jZScsCgkJCQl9LAoJCQkJdkF4aXM6IHsgdGl0bGU6ICdDb25zdW1lZCBUb2tlbnMnIH0sCgkJCQlsZWdlbmQ6IHsgcG9zaXRpb246ICdub25lJyB9LAoJCQkJYmFyOiB7IGdyb3VwV2lkdGg6ICc3NSUnIH0sCgkJCQljaGFydEFyZWE6IHsgd2lkdGg6ICc4NSUnLCBoZWlnaHQ6ICc3MCUnIH0sCgkJCQloZWlnaHQ6IDQwMAoJCQl9OwoKCQkJY29uc3QgY2hhcnQgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uQ29sdW1uQ2hhcnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rva2VuX2NoYXJ0X2RpdicpKTsKCQkJY2hhcnQuZHJhdyhkYXRhLCBvcHRpb25zKTsKCQl9CgkJbGV0IGFsbEV4cGFuZGVkID0gZmFsc2U7CgkJZnVuY3Rpb24gdG9nZ2xlQWxsRGV0YWlscygpIHsKCQkJYWxsRXhwYW5kZWQgPSAhYWxsRXhwYW5kZWQ7CgkJCWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2RldGFpbHMnKS5mb3JFYWNoKGQgPT4gewoJCQkJaWYgKGFsbEV4cGFuZGVkKSBkLnNldEF0dHJpYnV0ZSgnb3BlbicsICcnKTsKCQkJCWVsc2UgZC5yZW1vdmVBdHRyaWJ1dGUoJ29wZW4nKTsKCQkJfSk7CgkJfQoJPC9zY3JpcHQ+CgoKPC9ib2R5Pgo8L2h0bWw+Cg==" },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:nil,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,} --------- Name: series-workflowdrx5p[0].run-triage(0) Phase: Succeeded StartedAt: 2026-09-07 21:34:39 +0000 UTC FinishedAt: 2026-09-07 21:56:19 +0000 UTC Input: nil Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "skip_reason": "", "targets": [ { "base": { "arch": "amd64", "tree_name": "mm-new", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git", "commit_hash": "0d9ff90a5422cc7509258aaaba1e7481df4d332a", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "TRANSPARENT_HUGEPAGE" ], "series_id": "" }, "patched": { "arch": "amd64", "tree_name": "mm-new", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git", "commit_hash": "0d9ff90a5422cc7509258aaaba1e7481df4d332a", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "TRANSPARENT_HUGEPAGE" ], "series_id": "8331135f-f2e0-4800-bdcb-e79a8e626fce" }, "track": "KASAN", "fuzz": { "focus": null, "focus_symbols": [ "__thp_vma_allowable_orders", "vma_file_can_map_huge", "vma_file_bypass_thp_tuneables", "madvise_collapse" ], "corpus_urls": [ "https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db" ], "skip_cover_check": true, "bug_title_re": "" }, "retest": null } ], "trajectory": "CjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KPGhlYWQ+Cgk8dGl0bGU+QUkgVHJhamVjdG9yeTwvdGl0bGU+Cgk8c3R5bGU+CgkJdGFibGUgewoJCQlib3JkZXI6IDFweCBzb2xpZCAjY2NjOwoJCQltYXJnaW46IDIwcHggNXB4OwoJCQlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwoJCQl3aGl0ZS1zcGFjZTogbm93cmFwOwoJCQl0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKCQkJb3ZlcmZsb3c6IGhpZGRlbjsKCQl9CgoJCXRhYmxlIGNhcHRpb24gewoJCQlmb250LXdlaWdodDogYm9sZDsKCQl9CgoJCXRhYmxlIHRkLCB0YWJsZSB0aCB7CgkJCXZlcnRpY2FsLWFsaWduOiB0b3A7CgkJCXBhZGRpbmc6IDJweCA4cHg7CgkJCXRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwoJCQlvdmVyZmxvdzogaGlkZGVuOwoJCX0KCgkJLmxpc3RfdGFibGUgdGQsIC5saXN0X3RhYmxlIHRoIHsKCQkJYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjY2NjOwoJCX0KCgkJLmxpc3RfdGFibGUgdGggewoJCQliYWNrZ3JvdW5kOiAjRjRGNEY0OwoJCX0KCgkJLmxpc3RfdGFibGUgdHI6bnRoLWNoaWxkKDJuKSB7CgkJCWJhY2tncm91bmQ6ICNGNEY0RjQ7CgkJfQoKCQkubGlzdF90YWJsZSB0cjpob3ZlciB7CgkJCWJhY2tncm91bmQ6ICNmZmZmOTk7CgkJfQoKCQkjYWlfZGV0YWlsc19kaXYgcHJlIHsKCQkJbWFyZ2luOiAxcHg7CgkJCW1heC13aWR0aDogMTIwY2g7CgkJCXdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKCQkJb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKCQl9Cgk8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PgoJPGgxPkFJIFRyYWplY3Rvcnk8L2gxPgoJPGJyPgoKCQoJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQk8Y2FwdGlvbj5UcmFqZWN0b3J5OiAoPGEgaHJlZj0iIyIgb25jbGljaz0idG9nZ2xlQWxsRGV0YWlscygpOyByZXR1cm4gZmFsc2U7Ij5FeHBhbmQvQ29sbGFwc2UgQWxsPC9hPik8L2NhcHRpb24+CgkJPHRoZWFkPjx0cj4KCQkJPHRoPlNlcTwvdGg+CgkJCTx0aD5UaW1lc3RhbXA8L3RoPgoJCQk8dGg+VHlwZTwvdGg+CgkJCTx0aD5OYW1lPC90aD4KCQkJPHRoPkR1cmF0aW9uPC90aD4KCQk8L3RyPjwvdGhlYWQ+CgkJPHRib2R5PgoJCQoJCTx0cj4KCQkJPHRkPjAvMDwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA3IDIxOjU1PC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O1RSQU5TUEFSRU5UX0hVR0VQQUdFJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7X190aHBfdm1hX2FsbG93YWJsZV9vcmRlcnMmIzM0OywKICAgICYjMzQ7dm1hX2ZpbGVfY2FuX21hcF9odWdlJiMzNDssCiAgICAmIzM0O3ZtYV9maWxlX2J5cGFzc190aHBfdHVuZWFibGVzJiMzNDssCiAgICAmIzM0O21hZHZpc2VfY29sbGFwc2UmIzM0OwogIF0sCiAgJiMzNDtLTVNBTlJlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCByZWZhY3RvcnMgVEhQIChUcmFuc3BhcmVudCBIdWdlIFBhZ2UpIHBvbGljeSBjaGVja3MgZm9yIGZpbGUtYmFja2VkIGFuZCBzcGVjaWFsL1BGTk1BUCBWTUFzIGluIGBtbS9odWdlX21lbW9yeS5jYC4gSXQgYnJlYWtzIG91dCB0aGUgbG9naWMgZm9yIGNoZWNraW5nIFRIUCB0dW5hYmxlcyBhbmQgaHVnZSBwYWdlIHN1cHBvcnQgaW50byBoZWxwZXIgZnVuY3Rpb25zIChgdm1hX2ZpbGVfYnlwYXNzX3RocF90dW5lYWJsZXNgLCBgdm1hX2ZpbGVfYWxsb3dfdGhwX3R1bmVhYmxlc2AsIGB2bWFfZmlsZV9jaGVja190aHBfdHVuZWFibGVzYCwgYW5kIGB2bWFfZmlsZV9jYW5fbWFwX2h1Z2VgKSBhbmQgYWxsb3dzIFBGTk1BUCBWTUFzIHdpdGggYGh1Z2VfZmF1bHRgIGhhbmRsZXJzIHRvIGJ5cGFzcyBnbG9iYWwgVEhQIHR1bmFibGVzLlxuXG5Ob25lIG9mIHRoZSBjaGFuZ2VzIHRvdWNoIGJ1ZmZlciBjb3BpZXMgdG8gdXNlciBzcGFjZSwgdW5pbml0aWFsaXplZCBzdGFjayBvciBoZWFwIG1lbW9yeSwgb3IgbWVtb3J5IGFsbG9jYXRpb25zLiBBbGwgdmFyaWFibGVzIGFuZCBzdHJ1Y3QgbWVtYmVycyBldmFsdWF0ZWQgKHN1Y2ggYXMgYHZtYS1cdTAwM2V2bV9vcHNgLCBgdm1fZmxhZ3NgLCBhbmQgYHR5cGVgKSBhcmUgZnVsbHkgaW5pdGlhbGl6ZWQgYXJndW1lbnRzIG9yIHN0cnVjdHVyZSBmaWVsZHMuIFBvdGVudGlhbCBpc3N1ZXMgaW4gdGhpcyBjb2RlIHBhdGggKHN1Y2ggYXMgTlVMTCBwb2ludGVyIGRlcmVmZXJlbmNlcyBpZiBgdm1fb3BzYCB3ZXJlIE5VTEwpIGFyZSBkZXRlY3RlZCBieSBzdGFuZGFyZCBrZXJuZWwgZmF1bHQgaGFuZGxlcnMgYW5kIEtBU0FOLiBUaGVyZSBpcyBubyByaXNrIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHVzYWdlIG9yIGluZm9ybWF0aW9uIGxlYWtzIHRoYXQgd291bGQgcmVxdWlyZSBLTVNBTi4mIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UsCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggcmVmYWN0b3JzIGFuZCBhbHRlcnMgVEhQIChUcmFuc3BhcmVudCBIdWdlIFBhZ2UpIGFsbG93YWJsZSBvcmRlcnMgY2hlY2tpbmcgZm9yIGZpbGUtYmFja2VkIFZNQXMgaW4gbW0vaHVnZV9tZW1vcnkuYywgYWRkaW5nIGhlbHBlcnMgbGlrZSB2bWFfZmlsZV9jYW5fbWFwX2h1Z2UgYW5kIHZtYV9maWxlX2J5cGFzc190aHBfdHVuZWFibGVzLiBUaGlzIGNvcmUgbWVtb3J5IG1hbmFnZW1lbnQgbG9naWMgaXMgcmVhY2hhYmxlIHZpYSBzdGFuZGFyZCBzeXNjYWxscyBhbmQgaW50ZXJmYWNlcyBzdWNoIGFzIG1hZHZpc2UoTUFEVl9DT0xMQVBTRSksIHBhZ2UgZmF1bHQgaGFuZGxlcnMsIGFuZCAvcHJvYy9waWQvc21hcHMuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MS8xPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDcgMjE6NTU8L3RkPgoJCQk8dGQ+YWN0aW9uPC90ZD4KCQkJPHRkPnJlYWQtcGF0Y2gtZGlmZjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O1BhdGNoRGlmZiYjMzQ7OiAmIzM0O2NvbW1pdCA0MDdiOGU3YjZmOGFhNjI5NmJkOTc0YzdkOTI2ZWI3NTM5Yjc0Y2U2XG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIE1vbiBTZXAgNyAyMTo1NToxNiAyMDI2ICYjNDM7MDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS9tbS9odWdlX21lbW9yeS5jIGIvbW0vaHVnZV9tZW1vcnkuY1xuaW5kZXggYWZiYjU5NzRiZDIyNS4uNzVjMjA0YWY0MGNiZCAxMDA2NDRcbi0tLSBhL21tL2h1Z2VfbWVtb3J5LmNcbiYjNDM7JiM0MzsmIzQzOyBiL21tL2h1Z2VfbWVtb3J5LmNcbkBAIC05Miw3ICYjNDM7OTIsNyBAQCB1bnNpZ25lZCBsb25nIGh1Z2VfYW5vbl9vcmRlcnNfbWFkdmlzZSBfX3JlYWRfbW9zdGx5O1xuIHVuc2lnbmVkIGxvbmcgaHVnZV9hbm9uX29yZGVyc19pbmhlcml0IF9fcmVhZF9tb3N0bHk7XG4gc3RhdGljIGJvb2wgYW5vbl9vcmRlcnNfY29uZmlndXJlZCBfX2luaXRkYXRhO1xuIFxuLXN0YXRpYyBpbmxpbmUgYm9vbCBmaWxlX3RocF9lbmFibGVkKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKVxuJiM0MztzdGF0aWMgaW5saW5lIGJvb2wgZmlsZV90aHBfZW5hYmxlZChjb25zdCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSlcbiB7XG4gXHRzdHJ1Y3QgaW5vZGUgKmlub2RlO1xuIFxuQEAgLTExOCw2ICYjNDM7MTE4LDY3IEBAIHN0YXRpYyBib29sIHZtYV9pc19zcGVjaWFsX2h1Z2UoY29uc3Qgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpXG4gXHRyZXR1cm4gdm1hX3Rlc3RfYW55KHZtYSwgVk1BX1BGTk1BUF9CSVQsIFZNQV9NSVhFRE1BUF9CSVQpO1xuIH1cbiBcbiYjNDM7c3RhdGljIGJvb2wgdm1hX2ZpbGVfYnlwYXNzX3RocF90dW5lYWJsZXMoY29uc3Qgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4mIzQzO1x0XHRlbnVtIHR2YV90eXBlIHR5cGUpXG4mIzQzO3tcbiYjNDM7XHRjb25zdCBib29sIGhhc19odWdlX2ZhdWx0ID0gdm1hLVx1MDAzZXZtX29wcy1cdTAwM2VodWdlX2ZhdWx0O1xuJiM0MztcbiYjNDM7XHQvKiBNQURWX0NPTExBUFNFIGlnbm9yZXMgdHVuZWFibGVzLiAqL1xuJiM0MztcdGlmICh0eXBlID09IFRWQV9GT1JDRURfQ09MTEFQU0UpXG4mIzQzO1x0XHRyZXR1cm4gdHJ1ZTtcbiYjNDM7XHQvKiBIdWdlIFBGTiBtYXBwaW5ncyBhcmUgdW5jb21wYWN0YWJsZSBzbyB0aGUgcG9saWN5IGRvZXNuJiMzOTt0IGFwcGx5LiAqL1xuJiM0MztcdGlmICh2bWFfdGVzdCh2bWEsIFZNQV9QRk5NQVBfQklUKSBcdTAwMjZcdTAwMjYgaGFzX2h1Z2VfZmF1bHQpXG4mIzQzO1x0XHRyZXR1cm4gdHJ1ZTtcbiYjNDM7XHRyZXR1cm4gZmFsc2U7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBib29sIHZtYV9maWxlX2FsbG93X3RocF90dW5lYWJsZXModm1fZmxhZ3NfdCB2bV9mbGFncylcbiYjNDM7e1xuJiM0MztcdC8qIFRIUD1hbHdheXM/ICovXG4mIzQzO1x0aWYgKGh1Z2VwYWdlX2dsb2JhbF9hbHdheXMoKSlcbiYjNDM7XHRcdHJldHVybiB0cnVlO1xuJiM0MztcdC8qIFRIUD1tYWR2aXNlIGFuZCBtYXJrZWQgTUFEVl9IVUdFUEFHRT8gKi9cbiYjNDM7XHRpZiAoaHVnZXBhZ2VfZ2xvYmFsX2VuYWJsZWQoKSBcdTAwMjZcdTAwMjYgKHZtX2ZsYWdzIFx1MDAyNiBWTV9IVUdFUEFHRSkpXG4mIzQzO1x0XHRyZXR1cm4gdHJ1ZTtcbiYjNDM7XHRyZXR1cm4gZmFsc2U7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBib29sIHZtYV9maWxlX2NoZWNrX3RocF90dW5lYWJsZXMoY29uc3Qgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4mIzQzO1x0XHR2bV9mbGFnc190IHZtX2ZsYWdzLCBlbnVtIHR2YV90eXBlIHR5cGUpXG4mIzQzO3tcbiYjNDM7XHRyZXR1cm4gdm1hX2ZpbGVfYnlwYXNzX3RocF90dW5lYWJsZXModm1hLCB0eXBlKSB8fFxuJiM0MztcdFx0dm1hX2ZpbGVfYWxsb3dfdGhwX3R1bmVhYmxlcyh2bV9mbGFncyk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBib29sIHZtYV9maWxlX2Nhbl9tYXBfaHVnZShjb25zdCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbiYjNDM7XHRcdHZtX2ZsYWdzX3Qgdm1fZmxhZ3MsIGVudW0gdHZhX3R5cGUgdHlwZSlcbiYjNDM7e1xuJiM0MztcdGNvbnN0IGJvb2wgaGFzX2h1Z2VfZmF1bHQgPSB2bWEtXHUwMDNldm1fb3BzLVx1MDAzZWh1Z2VfZmF1bHQ7XG4mIzQzO1xuJiM0MztcdC8qXG4mIzQzO1x0ICogRW5mb3JjZSBUSFAgY29sbGFwc2UgcmVxdWlyZW1lbnRzIGFzIG5lY2Vzc2FyeS4gQW5vbnltb3VzIHZtYXNcbiYjNDM7XHQgKiB3ZXJlIGFscmVhZHkgaGFuZGxlZCBpbiB0aHBfdm1hX2FsbG93YWJsZV9vcmRlcnMoKS5cbiYjNDM7XHQgKi9cbiYjNDM7XHRpZiAoIXZtYV9maWxlX2NoZWNrX3RocF90dW5lYWJsZXModm1hLCB2bV9mbGFncywgdHlwZSkpXG4mIzQzO1x0XHRyZXR1cm4gZmFsc2U7XG4mIzQzO1xuJiM0MztcdHN3aXRjaCAodHlwZSkge1xuJiM0MztcdGNhc2UgVFZBX1BBR0VGQVVMVDpcbiYjNDM7XHRcdC8qXG4mIzQzO1x0XHQgKiBUcnVzdCB0aGF0IC1cdTAwM2VodWdlX2ZhdWx0KCkgaGFuZGxlcnMga25vdyB3aGF0IHRoZXkgYXJlIGRvaW5nXG4mIzQzO1x0XHQgKiBpbiBmYXVsdCBwYXRoLlxuJiM0MztcdFx0ICovXG4mIzQzO1x0XHRyZXR1cm4gaGFzX2h1Z2VfZmF1bHQ7XG4mIzQzO1x0Y2FzZSBUVkFfU01BUFM6XG4mIzQzO1x0XHRpZiAoaGFzX2h1Z2VfZmF1bHQpXG4mIzQzO1x0XHRcdHJldHVybiB0cnVlO1xuJiM0MztcdFx0ZmFsbHRocm91Z2g7XG4mIzQzO1x0ZGVmYXVsdDpcbiYjNDM7XHRcdC8qIE9ubHkgcmVndWxhciBmaWxlIGlzIHZhbGlkIGluIGNvbGxhcHNlIHBhdGguICovXG4mIzQzO1x0XHRyZXR1cm4gZmlsZV90aHBfZW5hYmxlZCh2bWEpO1xuJiM0MztcdH1cbiYjNDM7fVxuJiM0MztcbiB1bnNpZ25lZCBsb25nIF9fdGhwX3ZtYV9hbGxvd2FibGVfb3JkZXJzKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuIFx0XHRcdFx0XHQgdm1fZmxhZ3NfdCB2bV9mbGFncyxcbiBcdFx0XHRcdFx0IGVudW0gdHZhX3R5cGUgdHlwZSxcbkBAIC0xOTAsMjcgJiM0MzsyNTEsOCBAQCB1bnNpZ25lZCBsb25nIF9fdGhwX3ZtYV9hbGxvd2FibGVfb3JkZXJzKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuIFx0XHRcdFx0XHRcdCAgIHZtYSwgdm1hX3N0YXJ0X3Bnb2ZmKHZtYSksIDAsXG4gXHRcdFx0XHRcdFx0ICAgZm9yY2VkX2NvbGxhcHNlKTtcbiBcbi1cdGlmICghdm1hX2lzX2Fub255bW91cyh2bWEpKSB7XG4tXHRcdC8qXG4tXHRcdCAqIEVuZm9yY2UgVEhQIGNvbGxhcHNlIHJlcXVpcmVtZW50cyBhcyBuZWNlc3NhcnkuIEFub255bW91cyB2bWFzXG4tXHRcdCAqIHdlcmUgYWxyZWFkeSBoYW5kbGVkIGluIHRocF92bWFfYWxsb3dhYmxlX29yZGVycygpLlxuLVx0XHQgKi9cbi1cdFx0aWYgKCFmb3JjZWRfY29sbGFwc2UgXHUwMDI2XHUwMDI2XG4tXHRcdCAgICAoIWh1Z2VwYWdlX2dsb2JhbF9lbmFibGVkKCkgfHwgKCEodm1fZmxhZ3MgXHUwMDI2IFZNX0hVR0VQQUdFKSBcdTAwMjZcdTAwMjZcbi1cdFx0XHRcdFx0XHQgICAgIWh1Z2VwYWdlX2dsb2JhbF9hbHdheXMoKSkpKVxuLVx0XHRcdHJldHVybiAwO1xuLVxuLVx0XHQvKlxuLVx0XHQgKiBUcnVzdCB0aGF0IC1cdTAwM2VodWdlX2ZhdWx0KCkgaGFuZGxlcnMga25vdyB3aGF0IHRoZXkgYXJlIGRvaW5nXG4tXHRcdCAqIGluIGZhdWx0IHBhdGguXG4tXHRcdCAqL1xuLVx0XHRpZiAoKChpbl9wZiB8fCBzbWFwcykpIFx1MDAyNlx1MDAyNiB2bWEtXHUwMDNldm1fb3BzLVx1MDAzZWh1Z2VfZmF1bHQpXG4tXHRcdFx0cmV0dXJuIG9yZGVycztcbi1cdFx0LyogT25seSByZWd1bGFyIGZpbGUgaXMgdmFsaWQgaW4gY29sbGFwc2UgcGF0aCAqL1xuLVx0XHRpZiAoKCghaW5fcGYgfHwgc21hcHMpKSBcdTAwMjZcdTAwMjYgZmlsZV90aHBfZW5hYmxlZCh2bWEpKVxuLVx0XHRcdHJldHVybiBvcmRlcnM7XG4tXHRcdHJldHVybiAwO1xuLVx0fVxuJiM0MztcdGlmICghdm1hX2lzX2Fub255bW91cyh2bWEpKVxuJiM0MztcdFx0cmV0dXJuIHZtYV9maWxlX2Nhbl9tYXBfaHVnZSh2bWEsIHZtX2ZsYWdzLCB0eXBlKSA/IG9yZGVycyA6IDA7XG4gXG4gXHRpZiAodm1hX2lzX3RlbXBvcmFyeV9zdGFjayh2bWEpKVxuIFx0XHRyZXR1cm4gMDtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yLzE8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNyAyMTo1NTwvdGQ+CgkJCTx0ZD5hZ2VudDwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5jb3JlPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtUUkFOU1BBUkVOVF9IVUdFUEFHRSYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O19fdGhwX3ZtYV9hbGxvd2FibGVfb3JkZXJzJiMzNDssCiAgICAmIzM0O3ZtYV9maWxlX2Nhbl9tYXBfaHVnZSYjMzQ7LAogICAgJiMzNDt2bWFfZmlsZV9ieXBhc3NfdGhwX3R1bmVhYmxlcyYjMzQ7LAogICAgJiMzNDttYWR2aXNlX2NvbGxhcHNlJiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIHJlZmFjdG9ycyBhbmQgYWx0ZXJzIFRIUCAoVHJhbnNwYXJlbnQgSHVnZSBQYWdlKSBhbGxvd2FibGUgb3JkZXJzIGNoZWNraW5nIGZvciBmaWxlLWJhY2tlZCBWTUFzIGluIG1tL2h1Z2VfbWVtb3J5LmMsIGFkZGluZyBoZWxwZXJzIGxpa2Ugdm1hX2ZpbGVfY2FuX21hcF9odWdlIGFuZCB2bWFfZmlsZV9ieXBhc3NfdGhwX3R1bmVhYmxlcy4gVGhpcyBjb3JlIG1lbW9yeSBtYW5hZ2VtZW50IGxvZ2ljIGlzIHJlYWNoYWJsZSB2aWEgc3RhbmRhcmQgc3lzY2FsbHMgYW5kIGludGVyZmFjZXMgc3VjaCBhcyBtYWR2aXNlKE1BRFZfQ09MTEFQU0UpLCBwYWdlIGZhdWx0IGhhbmRsZXJzLCBhbmQgL3Byb2MvcGlkL3NtYXBzLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+SW5zdHJ1Y3Rpb246PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Zb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgbWFpbnRhaW5lciBhbmQgc2VjdXJpdHkgZW5naW5lZXIuCllvdXIgam9iIGlzIHRvIHJldmlldyBhIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQgZXZhbHVhdGUgd2hldGhlciBpdCB3YXJyYW50cyBmdXp6aW5nIHdpdGggc3l6a2FsbGVyLgoKSU1QT1JUQU5UOiBUaGUgY2hhbmdlcyBoYXZlIEFMUkVBRFkgYmVlbiBhcHBsaWVkIGFuZCBjb21taXR0ZWQgYXMgdGhlIEhFQUQgY29tbWl0IGluCnlvdXIgd29ya3NwYWNlLiBEbyBOT1QgcmVseSBvbiBpbnRlcm5hbCBhc3N1bXB0aW9ucy4gWW91IG11c3QgYWN0aXZlbHkgdXNlIHlvdXIgY29kZSBhY2Nlc3MKdG9vbHMgdG8gaW5zcGVjdCB0aGUgYWN0dWFsIHNvdXJjZSBjb2RlLCBjYWxsZXJzLCBhbmQgc3Vycm91bmRpbmcgY29udGV4dC4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjEuIENPUkUgVFJJQUdFIFBISUxPU09QSFkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KVGhlIGdvYWwgb2YgcGF0Y2ggZnV6emluZyBpcyB0byBkaXNjb3ZlciBjcmFzaGVzLCByZWdyZXNzaW9ucywgZXhwb3NlZCBsYXRlbnQgYnVncywKYW5kIG5ld2x5IHRyaWdnZXJlZCBhc3NlcnRpb25zIGludHJvZHVjZWQgYnkgdGhlIHBhdGNoIHNlcmllcy4KCi0gUkVBQ0hBQklMSVRZIElTIFRIRSBQUklNQVJZIEdBVEU6CiAgRnV6emluZyBjYW4gb25seSBkaXNjb3ZlciBidWdzIGluIGNvZGUgdGhhdCBjYW4gYWN0dWFsbHkgZXhlY3V0ZSBpbiBzdGFuZGFyZCB2aXJ0dWFsaXplZAogIGVudmlyb25tZW50cyAoR0NFIG9yIFFFTVUsIHV0aWxpemluZyBzb2Z0d2FyZS1lbXVsYXRlZCBkZXZpY2VzIGxpa2UgVVNCIGdhZGdldHMsIG5ldGRldiwgdHVuL3RhcCkuCiAgSWYgdGhlIG1vZGlmaWVkIGNvZGUgaXMgc3RydWN0dXJhbGx5IHVucmVhY2hhYmxlIChzZWUgU2VjdGlvbiAyKSwgaXQgTVVTVCBOT1QgYmUgZnV6emVkLAogIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBpdCBhZGRzIGFzc2VydGlvbnMgb3IgY29tcGxleCBsb2dpYy4KCi0gRE8gTk9UIEJMSU5ETFkgVFJVU1QgJiMzNDtOTyBGVU5DVElPTkFMIENIQU5HRSYjMzQ7IChORkNJKSBPUiAmIzM0O1JFRkFDVE9SSU5HJiMzNDsgQ0xBSU1TOgogIFBhdGNoIGF1dGhvcnMgcm91dGluZWx5IGxhYmVsIGNoYW5nZXMgYXMgJiMzNDtjbGVhbnVwcyYjMzQ7LCAmIzM0O3JlZmFjdG9yaW5ncyYjMzQ7LCBvciBzdGF0ZQogICYjMzQ7Tm8gZnVuY3Rpb25hbCBjaGFuZ2UgaW50ZW5kZWQmIzM0Oy4gRG8gTk9UIHRha2UgdGhlc2UgY2xhaW1zIGF0IGZhY2UgdmFsdWUuCiAgQ29kZSByZWZhY3RvcmluZ3MgdGhhdCByZWFycmFuZ2UgbG9naWMsIGludHJvZHVjZSBoZWxwZXIgZnVuY3Rpb25zLCBvciBhbHRlciBzdGF0ZSBtYW5hZ2VtZW50CiAgaW4gY29yZSBzdWJzeXN0ZW1zIGZyZXF1ZW50bHkgaW50cm9kdWNlIHN1YnRsZSBzZW1hbnRpYyBzaGlmdHMgb3IgdW5jb3ZlciBsYXRlbnQga2VybmVsIGJ1Z3MuCiAgSWYgcmVhY2hhYmxlIGV4ZWN1dGFibGUgY29kZSBpcyBtb2RpZmllZCBvciByZWZhY3RvcmVkLCBpdCBNVVNUIGJlIGZ1enplZC4KCi0gTkVXIE9SIE1PRElGSUVEIEFTU0VSVElPTlMgSU4gUkVBQ0hBQkxFIENPREUgTVVTVCBCRSBGVVpaRUQ6CiAgV2hlbiBhIHBhdGNoIGludHJvZHVjZXMgb3IgbW9kaWZpZXMgcnVudGltZSBjaGVja3Mgb3IgYXNzZXJ0aW9ucyAoZS5nLiwgV0FSTl9PTiosIFZNX1dBUk5fT04qLAogIEJVR19PTiosIGxvY2tkZXBfYXNzZXJ0KikgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMsIGl0IGVuZm9yY2VzIG5ldyBvciBzdHJpY3RlciBpbnZhcmlhbnRzLgogIEV2ZW4gaWYgdGhlIGF1dGhvciBiZWxpZXZlcyB0aGUgaW52YXJpYW50IGFsd2F5cyBob2xkcywgZnV6emluZyBpcyBlc3NlbnRpYWwgdG8gdmVyaWZ5IHdoZXRoZXIKICBhbiB1bnVzdWFsIHNlcXVlbmNlIG9mIG9wZXJhdGlvbnMgY2FuIHZpb2xhdGUgaXQuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoyLiBXSEVOIFRPIFJFVFVSTiBXb3J0aEZ1enppbmc9ZmFsc2UgKE5FR0FUSVZFIENSSVRFUklBKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpSZXR1cm4gV29ydGhGdXp6aW5nPWZhbHNlIE9OTFkgSUYgYWxsIG1vZGlmaWVkIGNvZGUgZmFsbHMgc3RyaWN0bHkgaW50byBvbmUgb3IgbW9yZSBvZiB0aGVzZSBjYXRlZ29yaWVzOgoKLSBOb24ta2VybmVsIGFuZCBub24tZXhlY3V0YWJsZSBjaGFuZ2VzOgogICogTW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLywgY29tbWVudHMsIG9yIHNwZWxsaW5nIGZpeGVzLgogICogVXNlci1zcGFjZSBkaXJlY3Rvcmllcywgc2VsZi10ZXN0cywgc2FtcGxlcywgb3Igc2NyaXB0cyAoZS5nLiwgdG9vbHMvLCBzYW1wbGVzLywgc2NyaXB0cy8sIHVzci8pCiAgICB0aGF0IGRvIG5vdCBhZmZlY3QgdGhlIGNvbXBpbGVkIGtlcm5lbCBpbWFnZSAodm1saW51eCkgb3Iga2VybmVsIG1vZHVsZXMuCiAgKiBQdXJlbHkgZGVjb3JhdGl2ZSBsb2dnaW5nIChlLmcuLCBtZXNzYWdlIHN0cmluZ3MgaW4gcHJfZXJyLCBwcmludGssIGRldl9pbmZvKSBvciB0cmFjZXBvaW50cwogICAgdGhhdCBkbyBub3QgYWx0ZXIgY29udHJvbCBmbG93IG9yIGRhdGEgc3RydWN0dXJlcy4KICAqIEJ1aWxkIHN5c3RlbSBvciBLY29uZmlnIGNoYW5nZXMgdGhhdCBkbyBub3QgYWx0ZXIgY29tcGlsZWQgQyBsb2dpYy4KLSBTdHJ1Y3R1cmFsbHkgdW5yZWFjaGFibGUgaGFyZHdhcmU6CiAgKiBWZW5kb3Itc3BlY2lmaWMgUENJZSBzd2l0Y2hlcywgU21hcnROSUNzLCBvciBHUFUgZHJpdmVycyAoZS5nLiwgbWx4c3csIHBkc19jb3JlLCBxZWQsCiAgICBpb25pYywgYW1kZ3B1KSByZXF1aXJpbmcgcGh5c2ljYWwgQVNJQy9QQ0llIGNhcmRzIG5vdCBlbXVsYXRlZCBpbiBzdGFuZGFyZCBRRU1VLgotIFVucmVhY2hhYmxlIGV4ZWN1dGlvbiBwYXRoczoKICAqIERyaXZlciB0ZWFyZG93biBjYWxsYmFja3MgKC5yZW1vdmUsIC5zaHV0ZG93biwgcGNpX3VucmVnaXN0ZXJfZHJpdmVyKSBleGVjdXRlZCBvbmx5IGR1cmluZwogICAgcGh5c2ljYWwgUENJIGhvdC11bnBsdWcgb3IgbWFudWFsIHN5c2ZzIGRyaXZlciB1bmJpbmRpbmcuCiAgKiBDb2RlIHBhdGhzIGV4Y2x1c2l2ZSB0byBhcmNoaXRlY3R1cmVzIG90aGVyIHRoYW4gdGhlIHRhcmdldCBhcmNoaXRlY3R1cmUuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQozLiBXSEVOIFRPIFJFVFVSTiBXb3J0aEZ1enppbmc9dHJ1ZSAoUE9TSVRJVkUgQ1JJVEVSSUEpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ClJldHVybiBXb3J0aEZ1enppbmc9dHJ1ZSB3aGVuZXZlciB0aGUgcGF0Y2ggdG91Y2hlcyByZWFjaGFibGUgZXhlY3V0YWJsZSBjb2RlLCBpbmNsdWRpbmc6Ci0gQ29yZSBTdWJzeXN0ZW1zOgogICogQW55IGxvZ2ljIG1vZGlmaWNhdGlvbnMgaW4gbWVtb3J5IG1hbmFnZW1lbnQgKG1tLyksIHN5bmNocm9uaXphdGlvbi9sb2NraW5nIChrZXJuZWwvbG9ja2luZy8pLAogICAgQlBGLCBzY2hlZHVsZXIsIGNvcmUgbmV0d29ya2luZywgVkZTLCBvciBzeXNjYWxsIGhhbmRsaW5nLgotIFJlZmFjdG9yaW5ncyBhbmQgQ29kZSBDbGVhbnVwczoKICAqIEFueSByZXN0cnVjdHVyaW5nIG9mIHJlYWNoYWJsZSBkYXRhIHN0cnVjdHVyZXMsIGhlbHBlciBhYnN0cmFjdGlvbnMsIG9yIGFsZ29yaXRobSBmbG93cy4KLSBSdW50aW1lIEFzc2VydGlvbnMgYW5kIERlZmVuc2l2ZSBDaGVja3M6CiAgKiBBbnkgaW50cm9kdWN0aW9uIG9yIGFsdGVyYXRpb24gb2YgYXNzZXJ0aW9ucyAoV0FSTl9PTiosIFZNX1dBUk5fT04qLCBCVUdfT04qLCBldGMuKSBpbiByZWFjaGFibGUgcGF0aHMuCi0gUmVhY2hhYmxlIERyaXZlcnMgYW5kIFByb3RvY29sczoKICAqIERyaXZlcnMgYWNjZXNzaWJsZSB2aWEgdmlydHVhbCBidXNlcyAodmlydGlvLCBVU0IgZ2FkZ2V0LCBsb29wYmFjaywgbmV0bGluaywgYmluZGVyLCBzb2NrZXRzLCBldGMuKS4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjQuIEVYVFJBQ1RJTkcgRm9jdXNTeW1ib2xzIChQUkVWRU5USU5HIERJTFVUSU9OKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpXaGVuIFdvcnRoRnV6emluZz10cnVlLCB5b3UgbXVzdCBleHRyYWN0IHNwZWNpZmljIGtlcm5lbCBmdW5jdGlvbnMgaW50byBGb2N1c1N5bWJvbHMgdG8gZ3VpZGUgdGhlIGZ1enplcjoKCi0gQVZPSUQgVUJJUVVJVE9VUyBMSUZFQ1lDTEUgSE9ULVBBVEhTOgogIERvIE5PVCBsaXN0IGdlbmVyaWMsIHViaXF1aXRvdXMgZnVuY3Rpb25zIGNhbGxlZCBieSBhbG1vc3QgZXZlcnkgcHJvZ3JhbSBpbiB0aGUgY29ycHVzCiAgKGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvOiBnZW5lcmFsIG1lbW9yeSBhbGxvY2F0b3JzIGFuZCBkZWFsbG9jYXRvcnMsIHBhZ2UgZmF1bHQKICBhbmQgdHJhcCBoYW5kbGVycywgb3IgY29yZSBzeW5jaHJvbml6YXRpb24gcHJpbWl0aXZlczsgdGhpcyBpcyBub3QgYW4gZXhoYXVzdGl2ZSBsaXN0KS4KICBMaXN0aW5nIHViaXF1aXRvdXMgZnVuY3Rpb25zIGNhdXNlcyB0aGUgZnV6emVyIHRvIGNsYXNzaWZ5IHRob3VzYW5kcyBvZiB1bnJlbGF0ZWQgdGVzdHMgYXMgJiMzNDtmb2N1c2VkJiMzNDssCiAgd2hpY2ggc2V2ZXJlbHkgZGlsdXRlcyBmdXp6aW5nIGVmZm9ydCBhd2F5IGZyb20gdGhlIGFjdHVhbCBjaGFuZ2VzLgoKLSBUQVJHRVQgU1BFQ0lGSUMgRkVBVFVSRSBMT0dJQyBBTkQgRU5UUllQT0lOVFM6CiAgTGlzdCBmdW5jdGlvbnMgdGhhdCBzcGVjaWZpY2FsbHkgaW1wbGVtZW50IHRoZSBsb2dpYyBiZWluZyBhZGRlZCBvciBhbHRlcmVkLCBvciBkaXJlY3QgQVBJIGVudHJ5cG9pbnRzCiAgZm9yIHRoZSBzdWJzeXN0ZW0gZmVhdHVyZSB1bmRlciByZXZpZXcuCgotIEhBTkRMSU5HIFNUQVRJQyBJTkxJTkUgRlVOQ1RJT05TIElOIEhFQURFUlMgKC5oKToKICBDb21waWxlci1pbmxpbmVkIHN0YXRpYyBmdW5jdGlvbnMgKHN1Y2ggYXMgc3RhdGljIGlubGluZXMgaW4gbW0vKi5oIG9yIGluY2x1ZGUvbGludXgvKi5oKSBsYWNrCiAgZGlzdGluY3Qgc3ltYm9sIGFkZHJlc3NlcyBpbiB2bWxpbnV4IGFuZCBjYW5ub3QgYmUgdGFyZ2V0ZWQgZGlyZWN0bHkgYnkgc3ltYm9sIGNvdmVyYWdlIGZpbHRlcnMuCiAgSWYgdGhlIGNoYW5nZXMgYXJlIHByaW1hcmlseSBpbiBzdGF0aWMgaW5saW5lIGhlbHBlcnMsIGlkZW50aWZ5IG5vbi1zdGF0aWMsIGZlYXR1cmUtc3BlY2lmaWMgY2FsbGVyCiAgZnVuY3Rpb25zIGluIC5jIGZpbGVzIHRoYXQgZXhlcmNpc2UgdGhlbSAoYXZvaWRpbmcgdWJpcXVpdG91cyBsaWZlY3ljbGUgd3JhcHBlcnMpLgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KNS4gSURFTlRJRllJTkcgRW5hYmxlQ29uZmlncwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpJZGVudGlmeSBhbnkgc3BlY2lmaWMgQ09ORklHXyBvcHRpb25zIHJlcXVpcmVkIHRvIHByb3Blcmx5IGNvbXBpbGUgYW5kIHJlYWNoIHRoZSBtb2RpZmllZCBjb2RlOgotIEluc3BlY3QgS2NvbmZpZyBmaWxlcyBhbmQgI2lmZGVmIGd1YXJkczsgZG8gbm90IG1ha2UgYXNzdW1wdGlvbnMuCi0gQ2hlY2sgJiMzNDtkZXBlbmRzIG9uJiMzNDsgbGluZXMgaW4gS2NvbmZpZyB0byBpbmNsdWRlIGFueSBub24tc3RhbmRhcmQgcGFyZW50IHN1YnN5c3RlbSBjb25maWdzIG5lZWRlZC4KLSBTdHJpcCBhbnkgJiMzOTtDT05GSUdfJiMzOTsgcHJlZml4IChlLmcuLCByZXR1cm4gJiMzNDtORVRfSVBWNCYjMzQ7IGluc3RlYWQgb2YgJiMzNDtDT05GSUdfTkVUX0lQVjQmIzM0OykuClByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLgoKClVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuCkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LgpJZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UHJvbXB0OjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+VGFyZ2V0IGFyY2hpdGVjdHVyZTogYW1kNjQKCkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOgpjb21taXQgNDA3YjhlN2I2ZjhhYTYyOTZiZDk3NGM3ZDkyNmViNzUzOWI3NGNlNgpBdXRob3I6IHN5ei1jbHVzdGVyICZsdDt0cmlhZ2VAc3l6a2FsbGVyLmNvbSZndDsKRGF0ZTogICBNb24gU2VwIDcgMjE6NTU6MTYgMjAyNiAmIzQzOzAwMDAKCiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXcKCmRpZmYgLS1naXQgYS9tbS9odWdlX21lbW9yeS5jIGIvbW0vaHVnZV9tZW1vcnkuYwppbmRleCBhZmJiNTk3NGJkMjI1Li43NWMyMDRhZjQwY2JkIDEwMDY0NAotLS0gYS9tbS9odWdlX21lbW9yeS5jCiYjNDM7JiM0MzsmIzQzOyBiL21tL2h1Z2VfbWVtb3J5LmMKQEAgLTkyLDcgJiM0Mzs5Miw3IEBAIHVuc2lnbmVkIGxvbmcgaHVnZV9hbm9uX29yZGVyc19tYWR2aXNlIF9fcmVhZF9tb3N0bHk7CiB1bnNpZ25lZCBsb25nIGh1Z2VfYW5vbl9vcmRlcnNfaW5oZXJpdCBfX3JlYWRfbW9zdGx5Owogc3RhdGljIGJvb2wgYW5vbl9vcmRlcnNfY29uZmlndXJlZCBfX2luaXRkYXRhOwogCi1zdGF0aWMgaW5saW5lIGJvb2wgZmlsZV90aHBfZW5hYmxlZChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKJiM0MztzdGF0aWMgaW5saW5lIGJvb2wgZmlsZV90aHBfZW5hYmxlZChjb25zdCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKIHsKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlOwogCkBAIC0xMTgsNiAmIzQzOzExOCw2NyBAQCBzdGF0aWMgYm9vbCB2bWFfaXNfc3BlY2lhbF9odWdlKGNvbnN0IHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQogCXJldHVybiB2bWFfdGVzdF9hbnkodm1hLCBWTUFfUEZOTUFQX0JJVCwgVk1BX01JWEVETUFQX0JJVCk7CiB9CiAKJiM0MztzdGF0aWMgYm9vbCB2bWFfZmlsZV9ieXBhc3NfdGhwX3R1bmVhYmxlcyhjb25zdCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKJiM0MzsJCWVudW0gdHZhX3R5cGUgdHlwZSkKJiM0Mzt7CiYjNDM7CWNvbnN0IGJvb2wgaGFzX2h1Z2VfZmF1bHQgPSB2bWEtJmd0O3ZtX29wcy0mZ3Q7aHVnZV9mYXVsdDsKJiM0MzsKJiM0MzsJLyogTUFEVl9DT0xMQVBTRSBpZ25vcmVzIHR1bmVhYmxlcy4gKi8KJiM0MzsJaWYgKHR5cGUgPT0gVFZBX0ZPUkNFRF9DT0xMQVBTRSkKJiM0MzsJCXJldHVybiB0cnVlOwomIzQzOwkvKiBIdWdlIFBGTiBtYXBwaW5ncyBhcmUgdW5jb21wYWN0YWJsZSBzbyB0aGUgcG9saWN5IGRvZXNuJiMzOTt0IGFwcGx5LiAqLwomIzQzOwlpZiAodm1hX3Rlc3Qodm1hLCBWTUFfUEZOTUFQX0JJVCkgJmFtcDsmYW1wOyBoYXNfaHVnZV9mYXVsdCkKJiM0MzsJCXJldHVybiB0cnVlOwomIzQzOwlyZXR1cm4gZmFsc2U7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBib29sIHZtYV9maWxlX2FsbG93X3RocF90dW5lYWJsZXModm1fZmxhZ3NfdCB2bV9mbGFncykKJiM0Mzt7CiYjNDM7CS8qIFRIUD1hbHdheXM/ICovCiYjNDM7CWlmIChodWdlcGFnZV9nbG9iYWxfYWx3YXlzKCkpCiYjNDM7CQlyZXR1cm4gdHJ1ZTsKJiM0MzsJLyogVEhQPW1hZHZpc2UgYW5kIG1hcmtlZCBNQURWX0hVR0VQQUdFPyAqLwomIzQzOwlpZiAoaHVnZXBhZ2VfZ2xvYmFsX2VuYWJsZWQoKSAmYW1wOyZhbXA7ICh2bV9mbGFncyAmYW1wOyBWTV9IVUdFUEFHRSkpCiYjNDM7CQlyZXR1cm4gdHJ1ZTsKJiM0MzsJcmV0dXJuIGZhbHNlOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgYm9vbCB2bWFfZmlsZV9jaGVja190aHBfdHVuZWFibGVzKGNvbnN0IHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAomIzQzOwkJdm1fZmxhZ3NfdCB2bV9mbGFncywgZW51bSB0dmFfdHlwZSB0eXBlKQomIzQzO3sKJiM0MzsJcmV0dXJuIHZtYV9maWxlX2J5cGFzc190aHBfdHVuZWFibGVzKHZtYSwgdHlwZSkgfHwKJiM0MzsJCXZtYV9maWxlX2FsbG93X3RocF90dW5lYWJsZXModm1fZmxhZ3MpOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgYm9vbCB2bWFfZmlsZV9jYW5fbWFwX2h1Z2UoY29uc3Qgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCiYjNDM7CQl2bV9mbGFnc190IHZtX2ZsYWdzLCBlbnVtIHR2YV90eXBlIHR5cGUpCiYjNDM7ewomIzQzOwljb25zdCBib29sIGhhc19odWdlX2ZhdWx0ID0gdm1hLSZndDt2bV9vcHMtJmd0O2h1Z2VfZmF1bHQ7CiYjNDM7CiYjNDM7CS8qCiYjNDM7CSAqIEVuZm9yY2UgVEhQIGNvbGxhcHNlIHJlcXVpcmVtZW50cyBhcyBuZWNlc3NhcnkuIEFub255bW91cyB2bWFzCiYjNDM7CSAqIHdlcmUgYWxyZWFkeSBoYW5kbGVkIGluIHRocF92bWFfYWxsb3dhYmxlX29yZGVycygpLgomIzQzOwkgKi8KJiM0MzsJaWYgKCF2bWFfZmlsZV9jaGVja190aHBfdHVuZWFibGVzKHZtYSwgdm1fZmxhZ3MsIHR5cGUpKQomIzQzOwkJcmV0dXJuIGZhbHNlOwomIzQzOwomIzQzOwlzd2l0Y2ggKHR5cGUpIHsKJiM0MzsJY2FzZSBUVkFfUEFHRUZBVUxUOgomIzQzOwkJLyoKJiM0MzsJCSAqIFRydXN0IHRoYXQgLSZndDtodWdlX2ZhdWx0KCkgaGFuZGxlcnMga25vdyB3aGF0IHRoZXkgYXJlIGRvaW5nCiYjNDM7CQkgKiBpbiBmYXVsdCBwYXRoLgomIzQzOwkJICovCiYjNDM7CQlyZXR1cm4gaGFzX2h1Z2VfZmF1bHQ7CiYjNDM7CWNhc2UgVFZBX1NNQVBTOgomIzQzOwkJaWYgKGhhc19odWdlX2ZhdWx0KQomIzQzOwkJCXJldHVybiB0cnVlOwomIzQzOwkJZmFsbHRocm91Z2g7CiYjNDM7CWRlZmF1bHQ6CiYjNDM7CQkvKiBPbmx5IHJlZ3VsYXIgZmlsZSBpcyB2YWxpZCBpbiBjb2xsYXBzZSBwYXRoLiAqLwomIzQzOwkJcmV0dXJuIGZpbGVfdGhwX2VuYWJsZWQodm1hKTsKJiM0MzsJfQomIzQzO30KJiM0MzsKIHVuc2lnbmVkIGxvbmcgX190aHBfdm1hX2FsbG93YWJsZV9vcmRlcnMoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCiAJCQkJCSB2bV9mbGFnc190IHZtX2ZsYWdzLAogCQkJCQkgZW51bSB0dmFfdHlwZSB0eXBlLApAQCAtMTkwLDI3ICYjNDM7MjUxLDggQEAgdW5zaWduZWQgbG9uZyBfX3RocF92bWFfYWxsb3dhYmxlX29yZGVycyhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKIAkJCQkJCSAgIHZtYSwgdm1hX3N0YXJ0X3Bnb2ZmKHZtYSksIDAsCiAJCQkJCQkgICBmb3JjZWRfY29sbGFwc2UpOwogCi0JaWYgKCF2bWFfaXNfYW5vbnltb3VzKHZtYSkpIHsKLQkJLyoKLQkJICogRW5mb3JjZSBUSFAgY29sbGFwc2UgcmVxdWlyZW1lbnRzIGFzIG5lY2Vzc2FyeS4gQW5vbnltb3VzIHZtYXMKLQkJICogd2VyZSBhbHJlYWR5IGhhbmRsZWQgaW4gdGhwX3ZtYV9hbGxvd2FibGVfb3JkZXJzKCkuCi0JCSAqLwotCQlpZiAoIWZvcmNlZF9jb2xsYXBzZSAmYW1wOyZhbXA7Ci0JCSAgICAoIWh1Z2VwYWdlX2dsb2JhbF9lbmFibGVkKCkgfHwgKCEodm1fZmxhZ3MgJmFtcDsgVk1fSFVHRVBBR0UpICZhbXA7JmFtcDsKLQkJCQkJCSAgICAhaHVnZXBhZ2VfZ2xvYmFsX2Fsd2F5cygpKSkpCi0JCQlyZXR1cm4gMDsKLQotCQkvKgotCQkgKiBUcnVzdCB0aGF0IC0mZ3Q7aHVnZV9mYXVsdCgpIGhhbmRsZXJzIGtub3cgd2hhdCB0aGV5IGFyZSBkb2luZwotCQkgKiBpbiBmYXVsdCBwYXRoLgotCQkgKi8KLQkJaWYgKCgoaW5fcGYgfHwgc21hcHMpKSAmYW1wOyZhbXA7IHZtYS0mZ3Q7dm1fb3BzLSZndDtodWdlX2ZhdWx0KQotCQkJcmV0dXJuIG9yZGVyczsKLQkJLyogT25seSByZWd1bGFyIGZpbGUgaXMgdmFsaWQgaW4gY29sbGFwc2UgcGF0aCAqLwotCQlpZiAoKCghaW5fcGYgfHwgc21hcHMpKSAmYW1wOyZhbXA7IGZpbGVfdGhwX2VuYWJsZWQodm1hKSkKLQkJCXJldHVybiBvcmRlcnM7Ci0JCXJldHVybiAwOwotCX0KJiM0MzsJaWYgKCF2bWFfaXNfYW5vbnltb3VzKHZtYSkpCiYjNDM7CQlyZXR1cm4gdm1hX2ZpbGVfY2FuX21hcF9odWdlKHZtYSwgdm1fZmxhZ3MsIHR5cGUpID8gb3JkZXJzIDogMDsKIAogCWlmICh2bWFfaXNfdGVtcG9yYXJ5X3N0YWNrKHZtYSkpCiAJCXJldHVybiAwOwo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNyAyMTo1NTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA0MDA2CgkJCQkJCQlvdXRwdXQ6IDM1CgkJCQkJCQl0aG91Z2h0czogMTc2CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyB0aGUgSHVnZSBNZW1vcnkgUGF0Y2gqKgoKT2theSwgbGV0JiMzOTtzIGRpdmUgaW50byB0aGlzIHBhdGNoLiBNeSBpbW1lZGlhdGUgZm9jdXMgaXMgb24gdW5kZXJzdGFuZGluZyB0aGUgc2NvcGUgb2YgdGhlIGNoYW5nZXMuIFRoZSBmYWN0IHRoYXQgdGhpcyBwYXRjaCB0b3VjaGVzIGBtbS9odWdlX21lbW9yeS5jYCBpcyBzaWduaWZpY2FudCDigJMgaXQmIzM5O3MgcmlnaHQgaW4gdGhlIGNvcmUgb2YgaG93IHdlIGhhbmRsZSBodWdlIHBhZ2VzLCBhIHBlcmZvcm1hbmNlLWNyaXRpY2FsIGFyZWEuCgpGaXJzdCwgSSBuZWVkIHRvIHBpbnBvaW50IGV4YWN0bHkgd2hhdCYjMzk7cyBiZWVuIG1vZGlmaWVkLiBBIHF1aWNrIGdsYW5jZSByZXZlYWxzIHRoZSBtYWluIGZ1bmN0aW9ucyBhZmZlY3RlZC4gSSBzZWUgYGZpbGVfdGhwX2VuYWJsZWRgIGhhcyBoYWQgaXRzIHNpZ25hdHVyZSB1cGRhdGVkIHRvIGBjb25zdGAsIHdoaWNoIGlzIGludGVyZXN0aW5nLiBUaGVuIHRoZXJlIGFyZSBhIG51bWJlciBvZiBuZXcgZnVuY3Rpb25zIGludHJvZHVjZWQuIGB2bWFfZmlsZV9ieXBhc3NfdGhwX3R1bmVhYmxlc2AsIGB2bWFfZmlsZV9hbGxvd190aHBfdHVuZWFibGVzYCwgYHZtYV9maWxlX2NoZWNrX3RocF90dW5lYWJsZXNgLCBhbmQgYHZtYV9maWxlX2Nhbl9tYXBfaHVnZWAg4oCTIGFsbCB0aGVzZSBuZXcgZnVuY3Rpb25zIGluZGljYXRlIGEgcG9zc2libGUgcmVmaW5lbWVudCBvZiBmaWxlLWJhY2tlZCBUSFAgKFRyYW5zcGFyZW50IEh1Z2UgUGFnZXMpIGJlaGF2aW9yIG9yIHBlcmhhcHMgYW4gZXh0ZW5zaW9uIG9mIGNvbnRyb2wgYXJvdW5kIGl0LiBUaGUgbW9kaWZpY2F0aW9uIHRvIGBfX3RocF92bWFfYWxsb3dhYmxlX29yZGVyc2AgaXMgYWxzbyBpbnRyaWd1aW5nOyBpdCYjMzk7cyBsaWtlbHkgd2hlcmUgdGhlIGNvcmUgbG9naWMgcmVsYXRlZCB0byBhbGxvd2VkIGh1Z2UgcGFnZSBzaXplcyBpcyBoYW5kbGVkLgoKTm93LCBJIG5lZWQgdG8gc2VlIHRoZSAqY29udGV4dCogb2YgdGhlc2UgY2hhbmdlcy4gSSYjMzk7bGwgbmVlZCB0byBleHBsb3JlIHRoZSByZWxldmFudCBjb2RlIHdpdGhpbiBgbW0vaHVnZV9tZW1vcnkuY2AgYW5kIGZpZ3VyZSBvdXQgaG93IHRoZXNlIG5ldyBmdW5jdGlvbnMgaW50ZWdyYXRlIHdpdGggZXhpc3RpbmcgZnVuY3Rpb25hbGl0eS4gSSYjMzk7bGwgdXNlIGByZWFkLWZpbGVgIG9yIGBncmVwcGVyYCB0byBnZXQgYSBiZXR0ZXIgaGFuZGxlIG9uIHRoZSBzdXJyb3VuZGluZyBjb2RlIGFuZCB1bmRlcnN0YW5kIHRoZSBpbnRlbnQuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NC8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDcgMjE6NTU8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDttbS9odWdlX21lbW9yeS5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogOTAsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogMTAwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OyAgOTA6XHR1bnNpZ25lZCBsb25nIGh1Z2VfYW5vbl9vcmRlcnNfYWx3YXlzIF9fcmVhZF9tb3N0bHk7XG4gIDkxOlx0dW5zaWduZWQgbG9uZyBodWdlX2Fub25fb3JkZXJzX21hZHZpc2UgX19yZWFkX21vc3RseTtcbiAgOTI6XHR1bnNpZ25lZCBsb25nIGh1Z2VfYW5vbl9vcmRlcnNfaW5oZXJpdCBfX3JlYWRfbW9zdGx5O1xuICA5MzpcdHN0YXRpYyBib29sIGFub25fb3JkZXJzX2NvbmZpZ3VyZWQgX19pbml0ZGF0YTtcbiAgOTQ6XHRcbiAgOTU6XHRzdGF0aWMgaW5saW5lIGJvb2wgZmlsZV90aHBfZW5hYmxlZChjb25zdCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSlcbiAgOTY6XHR7XG4gIDk3Olx0XHRzdHJ1Y3QgaW5vZGUgKmlub2RlO1xuICA5ODpcdFxuICA5OTpcdFx0aWYgKCF2bWEtXHUwMDNldm1fZmlsZSlcbiAxMDA6XHRcdFx0cmV0dXJuIGZhbHNlO1xuIDEwMTpcdFxuIDEwMjpcdFx0aW5vZGUgPSBmaWxlX2lub2RlKHZtYS1cdTAwM2V2bV9maWxlKTtcbiAxMDM6XHRcbiAxMDQ6XHRcdGlmIChJU19BTk9OX0ZJTEUoaW5vZGUpKVxuIDEwNTpcdFx0XHRyZXR1cm4gZmFsc2U7XG4gMTA2Olx0XG4gMTA3Olx0XHRpZiAoIW1hcHBpbmdfcG1kX2ZvbGlvX3N1cHBvcnQodm1hLVx1MDAzZXZtX2ZpbGUtXHUwMDNlZl9tYXBwaW5nKSlcbiAxMDg6XHRcdFx0cmV0dXJuIGZhbHNlO1xuIDEwOTpcdFxuIDExMDpcdFx0cmV0dXJuIFNfSVNSRUcoaW5vZGUtXHUwMDNlaV9tb2RlKTtcbiAxMTE6XHR9XG4gMTEyOlx0XG4gMTEzOlx0LyogSWYgcmV0dXJucyB0cnVlLCB3ZSBhcmUgdW5hYmxlIHRvIGFjY2VzcyB0aGUgVk1BJiMzOTtzIGZvbGlvcy4gKi9cbiAxMTQ6XHRzdGF0aWMgYm9vbCB2bWFfaXNfc3BlY2lhbF9odWdlKGNvbnN0IHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKVxuIDExNTpcdHtcbiAxMTY6XHRcdGlmICh2bWFfaXNfZGF4KHZtYSkpXG4gMTE3Olx0XHRcdHJldHVybiBmYWxzZTtcbiAxMTg6XHRcdHJldHVybiB2bWFfdGVzdF9hbnkodm1hLCBWTUFfUEZOTUFQX0JJVCwgVk1BX01JWEVETUFQX0JJVCk7XG4gMTE5Olx0fVxuIDEyMDpcdFxuIDEyMTpcdHN0YXRpYyBib29sIHZtYV9maWxlX2J5cGFzc190aHBfdHVuZWFibGVzKGNvbnN0IHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuIDEyMjpcdFx0XHRlbnVtIHR2YV90eXBlIHR5cGUpXG4gMTIzOlx0e1xuIDEyNDpcdFx0Y29uc3QgYm9vbCBoYXNfaHVnZV9mYXVsdCA9IHZtYS1cdTAwM2V2bV9vcHMtXHUwMDNlaHVnZV9mYXVsdDtcbiAxMjU6XHRcbiAxMjY6XHRcdC8qIE1BRFZfQ09MTEFQU0UgaWdub3JlcyB0dW5lYWJsZXMuICovXG4gMTI3Olx0XHRpZiAodHlwZSA9PSBUVkFfRk9SQ0VEX0NPTExBUFNFKVxuIDEyODpcdFx0XHRyZXR1cm4gdHJ1ZTtcbiAxMjk6XHRcdC8qIEh1Z2UgUEZOIG1hcHBpbmdzIGFyZSB1bmNvbXBhY3RhYmxlIHNvIHRoZSBwb2xpY3kgZG9lc24mIzM5O3QgYXBwbHkuICovXG4gMTMwOlx0XHRpZiAodm1hX3Rlc3Qodm1hLCBWTUFfUEZOTUFQX0JJVCkgXHUwMDI2XHUwMDI2IGhhc19odWdlX2ZhdWx0KVxuIDEzMTpcdFx0XHRyZXR1cm4gdHJ1ZTtcbiAxMzI6XHRcdHJldHVybiBmYWxzZTtcbiAxMzM6XHR9XG4gMTM0Olx0XG4gMTM1Olx0c3RhdGljIGJvb2wgdm1hX2ZpbGVfYWxsb3dfdGhwX3R1bmVhYmxlcyh2bV9mbGFnc190IHZtX2ZsYWdzKVxuIDEzNjpcdHtcbiAxMzc6XHRcdC8qIFRIUD1hbHdheXM/ICovXG4gMTM4Olx0XHRpZiAoaHVnZXBhZ2VfZ2xvYmFsX2Fsd2F5cygpKVxuIDEzOTpcdFx0XHRyZXR1cm4gdHJ1ZTtcbiAxNDA6XHRcdC8qIFRIUD1tYWR2aXNlIGFuZCBtYXJrZWQgTUFEVl9IVUdFUEFHRT8gKi9cbiAxNDE6XHRcdGlmIChodWdlcGFnZV9nbG9iYWxfZW5hYmxlZCgpIFx1MDAyNlx1MDAyNiAodm1fZmxhZ3MgXHUwMDI2IFZNX0hVR0VQQUdFKSlcbiAxNDI6XHRcdFx0cmV0dXJuIHRydWU7XG4gMTQzOlx0XHRyZXR1cm4gZmFsc2U7XG4gMTQ0Olx0fVxuIDE0NTpcdFxuIDE0NjpcdHN0YXRpYyBib29sIHZtYV9maWxlX2NoZWNrX3RocF90dW5lYWJsZXMoY29uc3Qgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4gMTQ3Olx0XHRcdHZtX2ZsYWdzX3Qgdm1fZmxhZ3MsIGVudW0gdHZhX3R5cGUgdHlwZSlcbiAxNDg6XHR7XG4gMTQ5Olx0XHRyZXR1cm4gdm1hX2ZpbGVfYnlwYXNzX3RocF90dW5lYWJsZXModm1hLCB0eXBlKSB8fFxuIDE1MDpcdFx0XHR2bWFfZmlsZV9hbGxvd190aHBfdHVuZWFibGVzKHZtX2ZsYWdzKTtcbiAxNTE6XHR9XG4gMTUyOlx0XG4gMTUzOlx0c3RhdGljIGJvb2wgdm1hX2ZpbGVfY2FuX21hcF9odWdlKGNvbnN0IHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuIDE1NDpcdFx0XHR2bV9mbGFnc190IHZtX2ZsYWdzLCBlbnVtIHR2YV90eXBlIHR5cGUpXG4gMTU1Olx0e1xuIDE1NjpcdFx0Y29uc3QgYm9vbCBoYXNfaHVnZV9mYXVsdCA9IHZtYS1cdTAwM2V2bV9vcHMtXHUwMDNlaHVnZV9mYXVsdDtcbiAxNTc6XHRcbiAxNTg6XHRcdC8qXG4gMTU5Olx0XHQgKiBFbmZvcmNlIFRIUCBjb2xsYXBzZSByZXF1aXJlbWVudHMgYXMgbmVjZXNzYXJ5LiBBbm9ueW1vdXMgdm1hc1xuIDE2MDpcdFx0ICogd2VyZSBhbHJlYWR5IGhhbmRsZWQgaW4gdGhwX3ZtYV9hbGxvd2FibGVfb3JkZXJzKCkuXG4gMTYxOlx0XHQgKi9cbiAxNjI6XHRcdGlmICghdm1hX2ZpbGVfY2hlY2tfdGhwX3R1bmVhYmxlcyh2bWEsIHZtX2ZsYWdzLCB0eXBlKSlcbiAxNjM6XHRcdFx0cmV0dXJuIGZhbHNlO1xuIDE2NDpcdFxuIDE2NTpcdFx0c3dpdGNoICh0eXBlKSB7XG4gMTY2Olx0XHRjYXNlIFRWQV9QQUdFRkFVTFQ6XG4gMTY3Olx0XHRcdC8qXG4gMTY4Olx0XHRcdCAqIFRydXN0IHRoYXQgLVx1MDAzZWh1Z2VfZmF1bHQoKSBoYW5kbGVycyBrbm93IHdoYXQgdGhleSBhcmUgZG9pbmdcbiAxNjk6XHRcdFx0ICogaW4gZmF1bHQgcGF0aC5cbiAxNzA6XHRcdFx0ICovXG4gMTcxOlx0XHRcdHJldHVybiBoYXNfaHVnZV9mYXVsdDtcbiAxNzI6XHRcdGNhc2UgVFZBX1NNQVBTOlxuIDE3MzpcdFx0XHRpZiAoaGFzX2h1Z2VfZmF1bHQpXG4gMTc0Olx0XHRcdFx0cmV0dXJuIHRydWU7XG4gMTc1Olx0XHRcdGZhbGx0aHJvdWdoO1xuIDE3NjpcdFx0ZGVmYXVsdDpcbiAxNzc6XHRcdFx0LyogT25seSByZWd1bGFyIGZpbGUgaXMgdmFsaWQgaW4gY29sbGFwc2UgcGF0aC4gKi9cbiAxNzg6XHRcdFx0cmV0dXJuIGZpbGVfdGhwX2VuYWJsZWQodm1hKTtcbiAxNzk6XHRcdH1cbiAxODA6XHR9XG4gMTgxOlx0XG4gMTgyOlx0dW5zaWduZWQgbG9uZyBfX3RocF92bWFfYWxsb3dhYmxlX29yZGVycyhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbiAxODM6XHRcdFx0XHRcdFx0IHZtX2ZsYWdzX3Qgdm1fZmxhZ3MsXG4gMTg0Olx0XHRcdFx0XHRcdCBlbnVtIHR2YV90eXBlIHR5cGUsXG4gMTg1Olx0XHRcdFx0XHRcdCB1bnNpZ25lZCBsb25nIG9yZGVycylcbiAxODY6XHR7XG4gMTg3Olx0XHRjb25zdCBib29sIHNtYXBzID0gdHlwZSA9PSBUVkFfU01BUFM7XG4gMTg4Olx0XHRjb25zdCBib29sIGluX3BmID0gdHlwZSA9PSBUVkFfUEFHRUZBVUxUO1xuIDE4OTpcdFx0Y29uc3QgYm9vbCBmb3JjZWRfY29sbGFwc2UgPSB0eXBlID09IFRWQV9GT1JDRURfQ09MTEFQU0U7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NS8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDcgMjE6NTU8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNjA4MAoJCQkJCQkJb3V0cHV0OiAzNQoJCQkJCQkJdGhvdWdodHM6IDQ5CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IHRha2Ugb24gdGhlIHRob3VnaHQgcHJvY2VzcywgYXMgcmVxdWVzdGVkOgoKKipEaXZpbmcgaW50byBUSFAgVk1BIEFsbG93YWJsZSBPcmRlcnMqKgoKQWxyaWdodCwgbGV0JiMzOTtzIGdldCBkb3duIHRvIGJyYXNzIHRhY2tzLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGlzIGBfX3RocF92bWFfYWxsb3dhYmxlX29yZGVyc2AgZnVuY3Rpb24gYW5kIGhvdyBpdCBmaXRzIGludG8gdGhlIFRyYW5zcGFyZW50IEh1Z2UgUGFnZXMgKFRIUCkgbGFuZHNjYXBlLiBNeSBpbW1lZGlhdGUgY29uY2VybiBpcyBub3QganVzdCB0aGUgZnVuY3Rpb24gaXRzZWxmLCBidXQgdGhlIGJyb2FkZXIgcGljdHVyZS4gVG8gZ3Jhc3AgaXRzIHNpZ25pZmljYW5jZSwgSSBuZWVkIHRvIHNlZSB0aGUgY29tcGxldGUgaW1wbGVtZW50YXRpb24gb2YgYF9fdGhwX3ZtYV9hbGxvd2FibGVfb3JkZXJzYC4gVW5kZXJzdGFuZGluZyBpdHMgaW5uZXIgd29ya2luZ3MgaXMgY3J1Y2lhbC4KCkZ1cnRoZXJtb3JlLCBJJiMzOTttIG5vdCBqdXN0IGludGVyZXN0ZWQgaW4gdGhlIGZ1bmN0aW9uJiMzOTtzIGludGVybmFsIGxvZ2ljOyBJIG5lZWQgdG8gZm9sbG93IGl0cyBjb25uZWN0aW9ucy4gSSBuZWVkIHRvIGlkZW50aWZ5ICphbGwqIHRoZSBjb2RlIHRoYXQgY2FsbHMgYHRocF92bWFfYWxsb3dhYmxlX29yZGVyc2Agb3IsIGV2ZW4gYmV0dGVyLCBgX190aHBfdm1hX2FsbG93YWJsZV9vcmRlcnNgIGRpcmVjdGx5LiBUaGlzIHdpbGwgaWxsdW1pbmF0ZSBpdHMgcm9sZSB3aXRoaW4gdGhlIGxhcmdlciBUSFAgbWFjaGluZXJ5LiBLbm93aW5nIHRoZSBjYWxsZXJzIHdpbGwgZXhwb3NlIHRoZSBjb250ZXh0cyBhbmQgY29uZGl0aW9ucyBpbiB3aGljaCB0aGUgZnVuY3Rpb24mIzM5O3MgZGVjaXNpb25zIGFyZSByZWxldmFudC4gV2l0aCBhIGNvbXByZWhlbnNpdmUgdmlldyBvZiB0aGUgY2FsbGVycywgSSB3aWxsIGJlIGFibGUgdG8gZnVsbHkgdW5kZXJzdGFuZCB0aGUgcm9sZSBvZiB0aGUgZnVuY3Rpb24gaW4gYWN0aW9uLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjYvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA3IDIxOjU1PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7bW0vaHVnZV9tZW1vcnkuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDE4MCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiA5MAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgMTgwOlx0fVxuIDE4MTpcdFxuIDE4MjpcdHVuc2lnbmVkIGxvbmcgX190aHBfdm1hX2FsbG93YWJsZV9vcmRlcnMoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4gMTgzOlx0XHRcdFx0XHRcdCB2bV9mbGFnc190IHZtX2ZsYWdzLFxuIDE4NDpcdFx0XHRcdFx0XHQgZW51bSB0dmFfdHlwZSB0eXBlLFxuIDE4NTpcdFx0XHRcdFx0XHQgdW5zaWduZWQgbG9uZyBvcmRlcnMpXG4gMTg2Olx0e1xuIDE4NzpcdFx0Y29uc3QgYm9vbCBzbWFwcyA9IHR5cGUgPT0gVFZBX1NNQVBTO1xuIDE4ODpcdFx0Y29uc3QgYm9vbCBpbl9wZiA9IHR5cGUgPT0gVFZBX1BBR0VGQVVMVDtcbiAxODk6XHRcdGNvbnN0IGJvb2wgZm9yY2VkX2NvbGxhcHNlID0gdHlwZSA9PSBUVkFfRk9SQ0VEX0NPTExBUFNFO1xuIDE5MDpcdFx0dW5zaWduZWQgbG9uZyBzdXBwb3J0ZWRfb3JkZXJzO1xuIDE5MTpcdFxuIDE5MjpcdFx0LyogQ2hlY2sgdGhlIGludGVyc2VjdGlvbiBvZiByZXF1ZXN0ZWQgYW5kIHN1cHBvcnRlZCBvcmRlcnMuICovXG4gMTkzOlx0XHRpZiAodm1hX2lzX2Fub255bW91cyh2bWEpKVxuIDE5NDpcdFx0XHRzdXBwb3J0ZWRfb3JkZXJzID0gVEhQX09SREVSU19BTExfQU5PTjtcbiAxOTU6XHRcdGVsc2UgaWYgKHZtYV9pc19kYXgodm1hKSB8fCB2bWFfaXNfc3BlY2lhbF9odWdlKHZtYSkpXG4gMTk2Olx0XHRcdHN1cHBvcnRlZF9vcmRlcnMgPSBUSFBfT1JERVJTX0FMTF9TUEVDSUFMX0RBWDtcbiAxOTc6XHRcdGVsc2VcbiAxOTg6XHRcdFx0c3VwcG9ydGVkX29yZGVycyA9IFRIUF9PUkRFUlNfQUxMX0ZJTEVfREVGQVVMVDtcbiAxOTk6XHRcbiAyMDA6XHRcdG9yZGVycyBcdTAwMjY9IHN1cHBvcnRlZF9vcmRlcnM7XG4gMjAxOlx0XHRpZiAoIW9yZGVycylcbiAyMDI6XHRcdFx0cmV0dXJuIDA7XG4gMjAzOlx0XG4gMjA0Olx0XHRpZiAoIXZtYS1cdTAwM2V2bV9tbSlcdFx0LyogdmRzbyAqL1xuIDIwNTpcdFx0XHRyZXR1cm4gMDtcbiAyMDY6XHRcbiAyMDc6XHRcdGlmICh0aHBfZGlzYWJsZWRfYnlfaHcoKSB8fCB2bWFfdGhwX2Rpc2FibGVkKHZtYSwgdm1fZmxhZ3MsIGZvcmNlZF9jb2xsYXBzZSkpXG4gMjA4Olx0XHRcdHJldHVybiAwO1xuIDIwOTpcdFxuIDIxMDpcdFx0Lyoga2h1Z2VwYWdlZCBkb2VzbiYjMzk7dCBjb2xsYXBzZSBEQVggdm1hLCBidXQgcGFnZSBmYXVsdCBpcyBmaW5lLiAqL1xuIDIxMTpcdFx0aWYgKHZtYV9pc19kYXgodm1hKSlcbiAyMTI6XHRcdFx0cmV0dXJuIGluX3BmID8gb3JkZXJzIDogMDtcbiAyMTM6XHRcbiAyMTQ6XHRcdC8qXG4gMjE1Olx0XHQgKiBraHVnZXBhZ2VkIHNwZWNpYWwgVk1BIGFuZCBodWdldGxiIFZNQS5cbiAyMTY6XHRcdCAqIE11c3QgYmUgY2hlY2tlZCBhZnRlciBkYXggc2luY2Ugc29tZSBkYXggbWFwcGluZ3MgbWF5IGhhdmVcbiAyMTc6XHRcdCAqIFZNX01JWEVETUFQIHNldC5cbiAyMTg6XHRcdCAqL1xuIDIxOTpcdFx0aWYgKCFpbl9wZiBcdTAwMjZcdTAwMjYgIXNtYXBzIFx1MDAyNlx1MDAyNiAodm1fZmxhZ3MgXHUwMDI2IFZNX05PX0tIVUdFUEFHRUQpKVxuIDIyMDpcdFx0XHRyZXR1cm4gMDtcbiAyMjE6XHRcbiAyMjI6XHRcdC8qXG4gMjIzOlx0XHQgKiBDaGVjayBhbGlnbm1lbnQgZm9yIGZpbGUgdm1hIGFuZCBzaXplIGZvciBib3RoIGZpbGUgYW5kIGFub24gdm1hIGJ5XG4gMjI0Olx0XHQgKiBmaWx0ZXJpbmcgb3V0IHRoZSB1bnN1aXRhYmxlIG9yZGVycy5cbiAyMjU6XHRcdCAqXG4gMjI2Olx0XHQgKiBTa2lwIHRoZSBjaGVjayBmb3IgcGFnZSBmYXVsdC4gSHVnZSBmYXVsdCBkb2VzIHRoZSBjaGVjayBpbiBmYXVsdFxuIDIyNzpcdFx0ICogaGFuZGxlcnMuXG4gMjI4Olx0XHQgKi9cbiAyMjk6XHRcdGlmICghaW5fcGYpIHtcbiAyMzA6XHRcdFx0aW50IG9yZGVyID0gaGlnaGVzdF9vcmRlcihvcmRlcnMpO1xuIDIzMTpcdFx0XHR1bnNpZ25lZCBsb25nIGFkZHI7XG4gMjMyOlx0XG4gMjMzOlx0XHRcdHdoaWxlIChvcmRlcnMpIHtcbiAyMzQ6XHRcdFx0XHRhZGRyID0gdm1hLVx1MDAzZXZtX2VuZCAtIChQQUdFX1NJWkUgXHUwMDNjXHUwMDNjIG9yZGVyKTtcbiAyMzU6XHRcdFx0XHRpZiAodGhwX3ZtYV9zdWl0YWJsZV9vcmRlcih2bWEsIGFkZHIsIG9yZGVyKSlcbiAyMzY6XHRcdFx0XHRcdGJyZWFrO1xuIDIzNzpcdFx0XHRcdG9yZGVyID0gbmV4dF9vcmRlcihcdTAwMjZvcmRlcnMsIG9yZGVyKTtcbiAyMzg6XHRcdFx0fVxuIDIzOTpcdFxuIDI0MDpcdFx0XHRpZiAoIW9yZGVycylcbiAyNDE6XHRcdFx0XHRyZXR1cm4gMDtcbiAyNDI6XHRcdH1cbiAyNDM6XHRcbiAyNDQ6XHRcdC8qXG4gMjQ1Olx0XHQgKiBFbmFibGVkIHZpYSBzaG1lbSBtb3VudCBvcHRpb25zIG9yIHN5c2ZzIHNldHRpbmdzLlxuIDI0NjpcdFx0ICogTXVzdCBiZSBkb25lIGJlZm9yZSBodWdlcGFnZSBmbGFncyBjaGVjayBzaW5jZSBzaG1lbSBoYXMgaXRzXG4gMjQ3Olx0XHQgKiBvd24gZmxhZ3MuXG4gMjQ4Olx0XHQgKi9cbiAyNDk6XHRcdGlmICghaW5fcGYgXHUwMDI2XHUwMDI2IHNobWVtX2ZpbGUodm1hLVx1MDAzZXZtX2ZpbGUpKVxuIDI1MDpcdFx0XHRyZXR1cm4gb3JkZXJzIFx1MDAyNiBzaG1lbV9hbGxvd2FibGVfaHVnZV9vcmRlcnMoZmlsZV9pbm9kZSh2bWEtXHUwMDNldm1fZmlsZSksXG4gMjUxOlx0XHRcdFx0XHRcdFx0ICAgdm1hLCB2bWFfc3RhcnRfcGdvZmYodm1hKSwgMCxcbiAyNTI6XHRcdFx0XHRcdFx0XHQgICBmb3JjZWRfY29sbGFwc2UpO1xuIDI1MzpcdFxuIDI1NDpcdFx0aWYgKCF2bWFfaXNfYW5vbnltb3VzKHZtYSkpXG4gMjU1Olx0XHRcdHJldHVybiB2bWFfZmlsZV9jYW5fbWFwX2h1Z2Uodm1hLCB2bV9mbGFncywgdHlwZSkgPyBvcmRlcnMgOiAwO1xuIDI1NjpcdFxuIDI1NzpcdFx0aWYgKHZtYV9pc190ZW1wb3Jhcnlfc3RhY2sodm1hKSlcbiAyNTg6XHRcdFx0cmV0dXJuIDA7XG4gMjU5Olx0XG4gMjYwOlx0XHQvKlxuIDI2MTpcdFx0ICogVEhQZWxpZ2libGUgYml0IG9mIHNtYXBzIHNob3VsZCBzaG93IDEgZm9yIHByb3BlciBWTUFzIGV2ZW5cbiAyNjI6XHRcdCAqIHRob3VnaCBhbm9uX3ZtYSBpcyBub3QgaW5pdGlhbGl6ZWQgeWV0LlxuIDI2MzpcdFx0ICpcbiAyNjQ6XHRcdCAqIEFsbG93IHBhZ2UgZmF1bHQgc2luY2UgYW5vbl92bWEgbWF5IGJlIG5vdCBpbml0aWFsaXplZCB1bnRpbFxuIDI2NTpcdFx0ICogdGhlIGZpcnN0IHBhZ2UgZmF1bHQuXG4gMjY2Olx0XHQgKi9cbiAyNjc6XHRcdGlmICghdm1hLVx1MDAzZWFub25fdm1hKVxuIDI2ODpcdFx0XHRyZXR1cm4gKHNtYXBzIHx8IGluX3BmKSA/IG9yZGVycyA6IDA7XG4gMjY5Olx0XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Ny8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDcgMjE6NTU8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNzc3OAoJCQkJCQkJb3V0cHV0OiAyOAoJCQkJCQkJdGhvdWdodHM6IDQyNAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipJbnZlc3RpZ2F0aW5nIGEgUG90ZW50aWFsIE5VTEwgUG9pbnRlciBEZXJlZmVyZW5jZSBpbiBGaWxlIFZNQXMqKgoKT2theSwgc28gSSYjMzk7bSBkaWdnaW5nIGludG8gdGhpcyBgdm1hX2ZpbGVfY2FuX21hcF9odWdlYCBmdW5jdGlvbiwgYW5kIGl0JiMzOTtzIHVzaW5nIGB2bWEtJmd0O3ZtX29wcy0mZ3Q7aHVnZV9mYXVsdGAuIE15IGltbWVkaWF0ZSB0aG91Z2h0IGlzLCAmIzM0O1doYXQgaWYgYHZtYS0mZ3Q7dm1fb3BzYCBpcyBOVUxMPyYjMzQ7IEl0JiMzOTtzIGEgY2xhc3NpYyBjaGVjaywgc28gSSBzdGFydCB0byBsb29rIGF0IGl0LgoKU3BlY2lmaWNhbGx5LCBJIHNlZSBhIGxpbmUgaW4gYHZtYV9maWxlX2Nhbl9tYXBfaHVnZWAgdGhhdCBkZWNsYXJlcyBgY29uc3QgYm9vbCBoYXNfaHVnZV9mYXVsdCA9IHZtYS0mZ3Q7dm1fb3BzLSZndDtodWdlX2ZhdWx0O2AuIEhvbGQgb24hIElzIGB2bWEtJmd0O3ZtX29wc2AgKmFsd2F5cyogbm9uLU5VTEwgZm9yIGZpbGUgVk1Bcz8gSSBuZWVkIHRvIGNsYXJpZnkgdGhhdC4KClRoZW4sIHRoZSBxdWVzdGlvbiBvZiBhbm9ueW1vdXMgVk1BcyBwb3BzIHVwLCBzbyBJIG5lZWQgdG8gY2hlY2sgYCF2bWFfaXNfYW5vbnltb3VzKHZtYSlgLiBDb3VsZCBgdm1hLSZndDt2bV9vcHNgICpzdGlsbCogYmUgTlVMTD8gQWhhISBNeSB1bmRlcnN0YW5kaW5nIG9mIHRoZSBMaW51eCBrZXJuZWwgbWVtb3J5IG1hbmFnZW1lbnQgaW50ZXJuYWxzIHRlbGxzIG1lIHRoYXQgaXQgYWN0dWFsbHkgKmlzKiBwb3NzaWJsZSBmb3IgZmlsZSBWTUFzIHRvIGhhdmUgYHZtYS0mZ3Q7dm1fb3BzID09IE5VTExgISBTcGVjaWZpY2FsbHksIHRoZXJlIGFyZSBzaXR1YXRpb25zIHdoZXJlIGEgZHJpdmVyIG9yIGZpbGUgY3JlYXRlcyBhIFZNQSB3aXRob3V0IHByb3ZpZGluZyBgdm1fb3BzYCwgbGlrZSB3aXRoIGdlbmVyaWMgbW1hcCBvcGVyYXRpb25zLgoKQWxyaWdodCwgdGltZSB0byBiYWNrIHVwIGEgbGl0dGxlIGFuZCB0aGluayBhYm91dCBob3cgYHZtYS0mZ3Q7dm1fb3BzYCBoYXMgYmVlbiBoYW5kbGVkIHVwIHRvIG5vdy4gTGV0IG1lIHNlZSB3aGVyZSB0aGlzIHZhcmlhYmxlIGlzIGFjY2Vzc2VkIGFuZCBob3cgaXQmIzM5O3MgaGFuZGxlZC4gRm9yIGV4YW1wbGU6CmBgYGMKaWYgKCgoaW5fcGYgfHwgc21hcHMpKSAmYW1wOyZhbXA7IHZtYS0mZ3Q7dm1fb3BzLSZndDtodWdlX2ZhdWx0KQpgYGAKSXMgYHZtYS0mZ3Q7dm1fb3BzYCBldmVyIGNoZWNrZWQgZm9yIGJlaW5nIE5VTEwgc29tZXdoZXJlIGVsc2U/IFRoaXMgaXMgY3JpdGljYWwuCgpJJiMzOTttIGFsc28gc2VlaW5nIGB2bWFfZmlsZV9ieXBhc3NfdGhwX3R1bmVhYmxlc2A6CgpgYGBjCnN0YXRpYyBib29sIHZtYV9maWxlX2J5cGFzc190aHBfdHVuZWFibGVzKGNvbnN0IHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAoJCWVudW0gdHZhX3R5cGUgdHlwZSkKewoJY29uc3QgYm9vbCBoYXNfaHVnZV9mYXVsdCA9IHZtYS0mZ3Q7dm1fb3BzLSZndDtodWdlX2ZhdWx0OwpgYGAKCklmIGB2bWEtJmd0O3ZtX29wc2AgKmlzKiBOVUxMIChvciwgbW9yZSBzcGVjaWZpY2FsbHksIGlmIHdlJiMzOTtyZSBkZWFsaW5nIHdpdGggYSBmaWxlIFZNQSB3aGVyZSBgdm1hLSZndDt2bV9vcHMgPT0gTlVMTGApLCB0aGVuIGRlcmVmZXJlbmNpbmcgYHZtYS0mZ3Q7dm1fb3BzLSZndDtodWdlX2ZhdWx0YCBpcyBnb2luZyB0byBjYXVzZSBhIE5VTEwgcG9pbnRlciBkZXJlZmVyZW5jZSEgVGhhdCYjMzk7cyBhIHNlcmlvdXMgYnVnIGNhbmRpZGF0ZS4gSSYjMzk7ZCBiZXR0ZXIgYmUgY2FyZWZ1bCBhbmQgbm90ZSB0aGF0IHRoaXMgaXMgbXkgY3VycmVudCBsaW5lIG9mIHRoaW5raW5nLgoKTm93LCBsZXQmIzM5O3MgZ3JlcCBpbiB0aGUgYG1tL2AgZGlyZWN0b3J5IGZvciBgdm1hLSZndDt2bV9vcHNgIGFuZCBzZWUgaWYgdGhlcmUgYXJlIG90aGVyIHBsYWNlcyB3aGVyZSBgdm1hLSZndDt2bV9vcHNgIGNvdWxkIGJlIE5VTEwgZm9yIGZpbGUgVk1Bcy4gVGhpcyBpcyB3aGVyZSBJIG5lZWQgdG8gc3RhcnQgZ2F0aGVyaW5nIGV2aWRlbmNlLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjgvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA3IDIxOjU1PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O3ZtYS1cdTAwM2V2bV9vcHMmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDttbS8mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bW0vZGVidWcuYz0xNTU9dm9pZCBkdW1wX3ZtYShjb25zdCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSlcbi0tXG5tbS9kZWJ1Zy5jLTE2NS1cdFx0KHVuc2lnbmVkIGxvbmcpcGdwcm90X3ZhbCh2bWEtXHUwMDNldm1fcGFnZV9wcm90KSxcbm1tL2RlYnVnLmM6MTY2Olx0XHR2bWEtXHUwMDNlYW5vbl92bWEsIHZtYS1cdTAwM2V2bV9vcHMsIHZtYV9zdGFydF9wZ29mZih2bWEpLFxubW0vZGVidWcuYy0xNjctXHRcdHZtYS1cdTAwM2V2bV9maWxlLCB2bWEtXHUwMDNldm1fcHJpdmF0ZV9kYXRhLFxuLS1cbm1tL2ZpbGVtYXAuYz00MDQwPWludCBnZW5lcmljX2ZpbGVfbW1hcChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpXG4tLVxubW0vZmlsZW1hcC5jLTQwNDYtXHRmaWxlX2FjY2Vzc2VkKGZpbGUpO1xubW0vZmlsZW1hcC5jOjQwNDc6XHR2bWEtXHUwMDNldm1fb3BzID0gXHUwMDI2Z2VuZXJpY19maWxlX3ZtX29wcztcbm1tL2ZpbGVtYXAuYy00MDQ4LVx0cmV0dXJuIDA7XG4tLVxubW0vZ3VwLmM9NjExPXN0YXRpYyBzdHJ1Y3QgcGFnZSAqbm9fcGFnZV90YWJsZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbi0tXG5tbS9ndXAuYy02MjgtXHRcdFx0cmV0dXJuIEVSUl9QVFIoLUVGQVVMVCk7XG5tbS9ndXAuYzo2Mjk6XHR9IGVsc2UgaWYgKCh2bWFfaXNfYW5vbnltb3VzKHZtYSkgfHwgIXZtYS1cdTAwM2V2bV9vcHMtXHUwMDNlZmF1bHQpKSB7XG5tbS9ndXAuYy02MzAtXHRcdHJldHVybiBFUlJfUFRSKC1FRkFVTFQpO1xuLS1cbm1tL2h1Z2VfbWVtb3J5LmM9MTIxPXN0YXRpYyBib29sIHZtYV9maWxlX2J5cGFzc190aHBfdHVuZWFibGVzKGNvbnN0IHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuLS1cbm1tL2h1Z2VfbWVtb3J5LmMtMTIzLXtcbm1tL2h1Z2VfbWVtb3J5LmM6MTI0Olx0Y29uc3QgYm9vbCBoYXNfaHVnZV9mYXVsdCA9IHZtYS1cdTAwM2V2bV9vcHMtXHUwMDNlaHVnZV9mYXVsdDtcbm1tL2h1Z2VfbWVtb3J5LmMtMTI1LVxuLS1cbm1tL2h1Z2VfbWVtb3J5LmM9MTUzPXN0YXRpYyBib29sIHZtYV9maWxlX2Nhbl9tYXBfaHVnZShjb25zdCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbi0tXG5tbS9odWdlX21lbW9yeS5jLTE1NS17XG5tbS9odWdlX21lbW9yeS5jOjE1NjpcdGNvbnN0IGJvb2wgaGFzX2h1Z2VfZmF1bHQgPSB2bWEtXHUwMDNldm1fb3BzLVx1MDAzZWh1Z2VfZmF1bHQ7XG5tbS9odWdlX21lbW9yeS5jLTE1Ny1cbi0tXG5tbS9pbnRlcm5hbC5oPTIzNj1zdGF0aWMgaW5saW5lIGludCBtbWFwX2ZpbGUoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKVxuLS1cbm1tL2ludGVybmFsLmgtMjQ3LVx0ICovXG5tbS9pbnRlcm5hbC5oOjI0ODpcdHZtYS1cdTAwM2V2bV9vcHMgPSBcdTAwMjZ2bWFfZHVtbXlfdm1fb3BzO1xubW0vaW50ZXJuYWwuaC0yNDktXG4tLVxubW0vaW50ZXJuYWwuaD0yNTg9c3RhdGljIGlubGluZSB2b2lkIHZtYV9jbG9zZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSlcbm1tL2ludGVybmFsLmgtMjU5LXtcbm1tL2ludGVybmFsLmg6MjYwOlx0aWYgKHZtYS1cdTAwM2V2bV9vcHMgXHUwMDI2XHUwMDI2IHZtYS1cdTAwM2V2bV9vcHMtXHUwMDNlY2xvc2UpIHtcbm1tL2ludGVybmFsLmg6MjYxOlx0XHR2bWEtXHUwMDNldm1fb3BzLVx1MDAzZWNsb3NlKHZtYSk7XG5tbS9pbnRlcm5hbC5oLTI2Mi1cbi0tXG5tbS9pbnRlcm5hbC5oLTI2Ni1cdFx0ICovXG5tbS9pbnRlcm5hbC5oOjI2NzpcdFx0dm1hLVx1MDAzZXZtX29wcyA9IFx1MDAyNnZtYV9kdW1teV92bV9vcHM7XG5tbS9pbnRlcm5hbC5oLTI2OC1cdH1cbi0tXG5tbS9tZW1vcnkuYz02Mjg9c3RhdGljIHZvaWQgcHJpbnRfYmFkX3BhZ2VfbWFwKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuLS1cbm1tL21lbW9yeS5jLTY1OC1cdFx0IHZtYS1cdTAwM2V2bV9maWxlLFxubW0vbWVtb3J5LmM6NjU5Olx0XHQgdm1hLVx1MDAzZXZtX29wcyA/IHZtYS1cdTAwM2V2bV9vcHMtXHUwMDNlZmF1bHQgOiBOVUxMLFxubW0vbWVtb3J5LmMtNjYwLVx0XHQgdm1hLVx1MDAzZXZtX2ZpbGUgPyB2bWEtXHUwMDNldm1fZmlsZS1cdTAwM2VmX29wLVx1MDAzZW1tYXAgOiBOVUxMLFxuLS1cbm1tL21lbW9yeS5jPTc1NT1zdGF0aWMgaW5saW5lIHN0cnVjdCBwYWdlICpfX3ZtX25vcm1hbF9wYWdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuLS1cbm1tL21lbW9yeS5jLTc2MS0jaWZkZWYgQ09ORklHX0ZJTkRfTk9STUFMX1BBR0Vcbm1tL21lbW9yeS5jOjc2MjpcdFx0XHRpZiAodm1hLVx1MDAzZXZtX29wcyBcdTAwMjZcdTAwMjYgdm1hLVx1MDAzZXZtX29wcy1cdTAwM2VmaW5kX25vcm1hbF9wYWdlKVxubW0vbWVtb3J5LmM6NzYzOlx0XHRcdFx0cmV0dXJuIHZtYS1cdTAwM2V2bV9vcHMtXHUwMDNlZmluZF9ub3JtYWxfcGFnZSh2bWEsIGFkZHIpO1xubW0vbWVtb3J5LmMtNzY0LSNlbmRpZiAvKiBDT05GSUdfRklORF9OT1JNQUxfUEFHRSAqL1xuLS1cbm1tL21lbW9yeS5jPTI0MzQ9c3RhdGljIGJvb2wgdm1fbWl4ZWRfemVyb3BhZ2VfYWxsb3dlZChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSlcbi0tXG5tbS9tZW1vcnkuYy0yNDU0LVx0ICogYmUgcHJvYmxlbWF0aWMgYXMgc29vbiBhcyB0aGUgemVyb3BhZ2UgZ2V0cyByZXBsYWNlZCBieSBhIGRpZmZlcmVudFxubW0vbWVtb3J5LmM6MjQ1NTpcdCAqIHBhZ2UgZHVlIHRvIHZtYS1cdTAwM2V2bV9vcHMtXHUwMDNlcGZuX21rd3JpdGUsIGJlY2F1c2Ugd2hhdCYjMzk7cyBtYXBwZWQgd291bGRcbm1tL21lbW9yeS5jLTI0NTYtXHQgKiBub3cgZGlmZmVyIHRvIHdoYXQgR1VQIGxvb2tlZCB1cC4gRlNEQVggaXMgaW5jb21wYXRpYmxlIHRvXG4tLVxubW0vbWVtb3J5LmMtMjQ1OS1cdCAqL1xubW0vbWVtb3J5LmM6MjQ2MDpcdHJldHVybiB2bWEtXHUwMDNldm1fb3BzIFx1MDAyNlx1MDAyNiB2bWEtXHUwMDNldm1fb3BzLVx1MDAzZXBmbl9ta3dyaXRlIFx1MDAyNlx1MDAyNlxubW0vbWVtb3J5LmMtMjQ2MS1cdCAgICAgICAodm1hX2lzX2ZzZGF4KHZtYSkgfHwgdm1hLVx1MDAzZXZtX2ZsYWdzIFx1MDAyNiBWTV9JTyk7XG4tLVxubW0vbWVtb3J5LmM9MzgwNT1zdGF0aWMgdm1fZmF1bHRfdCBkb19wYWdlX21rd3JpdGUoc3RydWN0IHZtX2ZhdWx0ICp2bWYsIHN0cnVjdCBmb2xpbyAqZm9saW8pXG4tLVxubW0vbWVtb3J5LmMtMzgxNS1cbm1tL21lbW9yeS5jOjM4MTY6XHRyZXQgPSB2bWYtXHUwMDNldm1hLVx1MDAzZXZtX29wcy1cdTAwM2VwYWdlX21rd3JpdGUodm1mKTtcbm1tL21lbW9yeS5jLTM4MTctXHQvKiBSZXN0b3JlIG9yaWdpbmFsIGZsYWdzIHNvIHRoYXQgY2FsbGVyIGlzIG5vdCBzdXJwcmlzZWQgKi9cbi0tXG5tbS9tZW1vcnkuYz0zODM4PXN0YXRpYyB2bV9mYXVsdF90IGZhdWx0X2RpcnR5X3NoYXJlZF9wYWdlKHN0cnVjdCB2bV9mYXVsdCAqdm1mKVxuLS1cbm1tL21lbW9yeS5jLTM4NDMtXHRib29sIGRpcnRpZWQ7XG5tbS9tZW1vcnkuYzozODQ0Olx0Ym9vbCBwYWdlX21rd3JpdGUgPSB2bWEtXHUwMDNldm1fb3BzIFx1MDAyNlx1MDAyNiB2bWEtXHUwMDNldm1fb3BzLVx1MDAzZXBhZ2VfbWt3cml0ZTtcbm1tL21lbW9yeS5jLTM4NDUtXG4tLVxubW0vbWVtb3J5LmM9MzkyNT1zdGF0aWMgaW5saW5lIHZtX2ZhdWx0X3Qgdm1mX2Nhbl9jYWxsX2ZhdWx0KGNvbnN0IHN0cnVjdCB2bV9mYXVsdCAqdm1mKVxuLS1cbm1tL21lbW9yeS5jLTM5MjgtXG5tbS9tZW1vcnkuYzozOTI5Olx0aWYgKHZtYS1cdTAwM2V2bV9vcHMtXHUwMDNlbWFwX3BhZ2VzIHx8ICEodm1mLVx1MDAzZWZsYWdzIFx1MDAyNiBGQVVMVF9GTEFHX1ZNQV9MT0NLKSlcbm1tL21lbW9yeS5jLTM5MzAtXHRcdHJldHVybiAwO1xuLS1cbm1tL21lbW9yeS5jPTQxNzc9c3RhdGljIHZtX2ZhdWx0X3Qgd3BfcGZuX3NoYXJlZChzdHJ1Y3Qgdm1fZmF1bHQgKnZtZilcbi0tXG5tbS9tZW1vcnkuYy00MTgwLVxubW0vbWVtb3J5LmM6NDE4MTpcdGlmICh2bWEtXHUwMDNldm1fb3BzIFx1MDAyNlx1MDAyNiB2bWEtXHUwMDNldm1fb3BzLVx1MDAzZXBmbl9ta3dyaXRlKSB7XG5tbS9tZW1vcnkuYy00MTgyLVx0XHR2bV9mYXVsdF90IHJldDtcbi0tXG5tbS9tZW1vcnkuYy00MTg5LVx0XHR2bWYtXHUwMDNlZmxhZ3MgfD0gRkFVTFRfRkxBR19NS1dSSVRFO1xubW0vbWVtb3J5LmM6NDE5MDpcdFx0cmV0ID0gdm1hLVx1MDAzZXZtX29wcy1cdTAwM2VwZm5fbWt3cml0ZSh2bWYpO1xubW0vbWVtb3J5LmMtNDE5MS1cdFx0aWYgKHJldCBcdTAwMjYgKFZNX0ZBVUxUX0VSUk9SIHwgVk1fRkFVTFRfTk9QQUdFKSlcbi0tXG5tbS9tZW1vcnkuYz00MTk5PXN0YXRpYyB2bV9mYXVsdF90IHdwX3BhZ2Vfc2hhcmVkKHN0cnVjdCB2bV9mYXVsdCAqdm1mLCBzdHJ1Y3QgZm9saW8gKmZvbGlvKVxuLS1cbm1tL21lbW9yeS5jLTQyMDYtXG5tbS9tZW1vcnkuYzo0MjA3Olx0aWYgKHZtYS1cdTAwM2V2bV9vcHMgXHUwMDI2XHUwMDI2IHZtYS1cdTAwM2V2bV9vcHMtXHUwMDNlcGFnZV9ta3dyaXRlKSB7XG5tbS9tZW1vcnkuYy00MjA4LVx0XHR2bV9mYXVsdF90IHRtcDtcbi0tXG5tbS9tZW1vcnkuYz01NDI3PXN0YXRpYyB2bV9mYXVsdF90IGRvX2Fub255bW91c19wYWdlKHN0cnVjdCB2bV9mYXVsdCAqdm1mKVxuLS1cbm1tL21lbW9yeS5jLTU1MzQtICogKHNlZSBGQVVMVF9GTEFHX1ZNQV9MT0NLKSBhbmQgbWF5IGhhdmUgYmVlbiByZWxlYXNlZCBkZXBlbmRpbmcgb25cbm1tL21lbW9yeS5jOjU1MzU6ICogZmxhZ3MgYW5kIHZtYS1cdTAwM2V2bV9vcHMtXHUwMDNlZmF1bHQoKSByZXR1cm4gdmFsdWUuXG5tbS9tZW1vcnkuYy01NTM2LSAqIFNlZSBmaWxlbWFwX2ZhdWx0KCkgYW5kIF9fZm9saW9fbG9ja19vcl9yZXRyeSgpLlxuLS1cbm1tL21lbW9yeS5jPTU1Mzg9c3RhdGljIHZtX2ZhdWx0X3QgX19kb19mYXVsdChzdHJ1Y3Qgdm1fZmF1bHQgKnZtZilcbi0tXG5tbS9tZW1vcnkuYy01NTY0LVxubW0vbWVtb3J5LmM6NTU2NTpcdHJldCA9IHZtYS1cdTAwM2V2bV9vcHMtXHUwMDNlZmF1bHQodm1mKTtcbm1tL21lbW9yeS5jLTU1NjYtXHRpZiAodW5saWtlbHkocmV0IFx1MDAyNiAoVk1fRkFVTFRfRVJST1IgfCBWTV9GQVVMVF9OT1BBR0UgfCBWTV9GQVVMVF9SRVRSWSB8XG4tLVxubW0vbWVtb3J5LmM9NTkzND1zdGF0aWMgdm1fZmF1bHRfdCBkb19mYXVsdF9hcm91bmQoc3RydWN0IHZtX2ZhdWx0ICp2bWYpXG4tLVxubW0vbWVtb3J5LmMtNTk1Ny1cdHJjdV9yZWFkX2xvY2soKTtcbm1tL21lbW9yeS5jOjU5NTg6XHRyZXQgPSB2bWYtXHUwMDNldm1hLVx1MDAzZXZtX29wcy1cdTAwM2VtYXBfcGFnZXModm1mLFxubW0vbWVtb3J5LmMtNTk1OS1cdFx0XHR2bWYtXHUwMDNlcGdvZmYgJiM0MzsgZnJvbV9wdGUgLSBwdGVfb2ZmLFxuLS1cbm1tL21lbW9yeS5jPTU5Njc9c3RhdGljIGlubGluZSBib29sIHNob3VsZF9mYXVsdF9hcm91bmQoc3RydWN0IHZtX2ZhdWx0ICp2bWYpXG4tLVxubW0vbWVtb3J5LmMtNTk2OS1cdC8qIE5vIC1cdTAwM2VtYXBfcGFnZXM/ICBObyB3YXkgdG8gZmF1bHQgYXJvdW5kLi4uICovXG5tbS9tZW1vcnkuYzo1OTcwOlx0aWYgKCF2bWYtXHUwMDNldm1hLVx1MDAzZXZtX29wcy1cdTAwM2VtYXBfcGFnZXMpXG5tbS9tZW1vcnkuYy01OTcxLVx0XHRyZXR1cm4gZmFsc2U7XG4tLVxubW0vbWVtb3J5LmM9NjA1ND1zdGF0aWMgdm1fZmF1bHRfdCBkb19zaGFyZWRfZmF1bHQoc3RydWN0IHZtX2ZhdWx0ICp2bWYpXG4tLVxubW0vbWVtb3J5LmMtNjA3My1cdCAqL1xubW0vbWVtb3J5LmM6NjA3NDpcdGlmICh2bWEtXHUwMDNldm1fb3BzLVx1MDAzZXBhZ2VfbWt3cml0ZSkge1xubW0vbWVtb3J5LmMtNjA3NS1cdFx0Zm9saW9fdW5sb2NrKGZvbGlvKTtcbi0tXG5tbS9tZW1vcnkuYz02MTA0PXN0YXRpYyB2bV9mYXVsdF90IGRvX2ZhdWx0KHN0cnVjdCB2bV9mYXVsdCAqdm1mKVxuLS1cbm1tL21lbW9yeS5jLTYxMTItXHQgKi9cbm1tL21lbW9yeS5jOjYxMTM6XHRpZiAoIXZtYS1cdTAwM2V2bV9vcHMtXHUwMDNlZmF1bHQpIHtcbm1tL21lbW9yeS5jLTYxMTQtXHRcdHZtZi1cdTAwM2VwdGUgPSBwdGVfb2Zmc2V0X21hcF9sb2NrKHZtZi1cdTAwM2V2bWEtXHUwMDNldm1fbW0sIHZtZi1cdTAwM2VwbWQsXG4tLVxubW0vbWVtb3J5LmM9NjM3OT1zdGF0aWMgaW5saW5lIHZtX2ZhdWx0X3QgY3JlYXRlX2h1Z2VfcG1kKHN0cnVjdCB2bV9mYXVsdCAqdm1mKVxuLS1cbm1tL21lbW9yeS5jLTYzODMtXHRcdHJldHVybiBkb19odWdlX3BtZF9hbm9ueW1vdXNfcGFnZSh2bWYpO1xubW0vbWVtb3J5LmM6NjM4NDpcdGlmICh2bWEtXHUwMDNldm1fb3BzLVx1MDAzZWh1Z2VfZmF1bHQpXG5tbS9tZW1vcnkuYzo2Mzg1Olx0XHRyZXR1cm4gdm1hLVx1MDAzZXZtX29wcy1cdTAwM2VodWdlX2ZhdWx0KHZtZiwgUE1EX09SREVSKTtcbm1tL21lbW9yeS5jLTYzODYtXHRyZXR1cm4gVk1fRkFVTFRfRkFMTEJBQ0s7XG4tLVxubW0vbWVtb3J5LmM9NjM5MD1zdGF0aWMgaW5saW5lIHZtX2ZhdWx0X3Qgd3BfaHVnZV9wbWQoc3RydWN0IHZtX2ZhdWx0ICp2bWYpXG4tLVxubW0vbWVtb3J5LmMtNjQwNi1cdGlmICh2bWEtXHUwMDNldm1fZmxhZ3MgXHUwMDI2IChWTV9TSEFSRUQgfCBWTV9NQVlTSEFSRSkpIHtcbm1tL21lbW9yeS5jOjY0MDc6XHRcdGlmICh2bWEtXHUwMDNldm1fb3BzLVx1MDAzZWh1Z2VfZmF1bHQpIHtcbm1tL21lbW9yeS5jOjY0MDg6XHRcdFx0cmV0ID0gdm1hLVx1MDAzZXZtX29wcy1cdTAwM2VodWdlX2ZhdWx0KHZtZiwgUE1EX09SREVSKTtcbm1tL21lbW9yeS5jLTY0MDktXHRcdFx0aWYgKCEocmV0IFx1MDAyNiBWTV9GQVVMVF9GQUxMQkFDSykpXG4tLVxubW0vbWVtb3J5LmM9NjQyMT1zdGF0aWMgdm1fZmF1bHRfdCBjcmVhdGVfaHVnZV9wdWQoc3RydWN0IHZtX2ZhdWx0ICp2bWYpXG4tLVxubW0vbWVtb3J5LmMtNjQyOC1cdFx0cmV0dXJuIFZNX0ZBVUxUX0ZBTExCQUNLO1xubW0vbWVtb3J5LmM6NjQyOTpcdGlmICh2bWEtXHUwMDNldm1fb3BzLVx1MDAzZWh1Z2VfZmF1bHQpXG5tbS9tZW1vcnkuYzo2NDMwOlx0XHRyZXR1cm4gdm1hLVx1MDAzZXZtX29wcy1cdTAwM2VodWdlX2ZhdWx0KHZtZiwgUFVEX09SREVSKTtcbm1tL21lbW9yeS5jLTY0MzEtI2VuZGlmIC8qIENPTkZJR19UUkFOU1BBUkVOVF9IVUdFUEFHRSAqL1xuLS1cbm1tL21lbW9yeS5jPTY0MzU9c3RhdGljIHZtX2ZhdWx0X3Qgd3BfaHVnZV9wdWQoc3RydWN0IHZtX2ZhdWx0ICp2bWYsIHB1ZF90IG9yaWdfcHVkKVxuLS1cbm1tL21lbW9yeS5jLTY0NDUtXHRpZiAodm1hLVx1MDAzZXZtX2ZsYWdzIFx1MDAyNiAoVk1fU0hBUkVEIHwgVk1fTUFZU0hBUkUpKSB7XG5tbS9tZW1vcnkuYzo2NDQ2Olx0XHRpZiAodm1hLVx1MDAzZXZtX29wcy1cdTAwM2VodWdlX2ZhdWx0KSB7XG5tbS9tZW1vcnkuYzo2NDQ3Olx0XHRcdHJldCA9IHZtYS1cdTAwM2V2bV9vcHMtXHUwMDNlaHVnZV9mYXVsdCh2bWYsIFBVRF9PUkRFUik7XG5tbS9tZW1vcnkuYy02NDQ4LVx0XHRcdGlmICghKHJldCBcdTAwMjYgVk1fRkFVTFRfRkFMTEJBQ0spKVxuLS1cbm1tL21lbW9yeS5jPTcyMTA9c3RhdGljIGludCBfX2FjY2Vzc19yZW1vdGVfdm0oc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgYWRkcixcbi0tXG5tbS9tZW1vcnkuYy03MjU0LSNpZmRlZiBDT05GSUdfSEFWRV9JT1JFTUFQX1BST1Rcbm1tL21lbW9yeS5jOjcyNTU6XHRcdFx0aWYgKHZtYS1cdTAwM2V2bV9vcHMgXHUwMDI2XHUwMDI2IHZtYS1cdTAwM2V2bV9vcHMtXHUwMDNlYWNjZXNzKVxubW0vbWVtb3J5LmM6NzI1NjpcdFx0XHRcdGJ5dGVzID0gdm1hLVx1MDAzZXZtX29wcy1cdTAwM2VhY2Nlc3Modm1hLCBhZGRyLCBidWYsXG5tbS9tZW1vcnkuYy03MjU3LVx0XHRcdFx0XHRcdFx0ICAgIGxlbiwgd3JpdGUpO1xuLS1cbm1tL21lbXBvbGljeS5jPTEwMTI9c3RhdGljIGludCB2bWFfcmVwbGFjZV9wb2xpY3koc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4tLVxubW0vbWVtcG9saWN5LmMtMTAyNC1cbm1tL21lbXBvbGljeS5jOjEwMjU6XHRpZiAodm1hLVx1MDAzZXZtX29wcyBcdTAwMjZcdTAwMjYgdm1hLVx1MDAzZXZtX29wcy1cdTAwM2VzZXRfcG9saWN5KSB7XG5tbS9tZW1wb2xpY3kuYzoxMDI2Olx0XHRlcnIgPSB2bWEtXHUwMDNldm1fb3BzLVx1MDAzZXNldF9wb2xpY3kodm1hLCBuZXcpO1xubW0vbWVtcG9saWN5LmMtMTAyNy1cdFx0aWYgKGVycilcbi0tXG5tbS9tZW1wb2xpY3kuYz0yMDIxPXN0cnVjdCBtZW1wb2xpY3kgKl9fZ2V0X3ZtYV9wb2xpY3koc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4tLVxubW0vbWVtcG9saWN5LmMtMjAyNC1cdCppbHggPSAwO1xubW0vbWVtcG9saWN5LmM6MjAyNTpcdHJldHVybiAodm1hLVx1MDAzZXZtX29wcyBcdTAwMjZcdTAwMjYgdm1hLVx1MDAzZXZtX29wcy1cdTAwM2VnZXRfcG9saWN5KSA/XG5tbS9tZW1wb2xpY3kuYzoyMDI2Olx0XHR2bWEtXHUwMDNldm1fb3BzLVx1MDAzZWdldF9wb2xpY3kodm1hLCBhZGRyLCBpbHgpIDogdm1hLVx1MDAzZXZtX3BvbGljeTtcbm1tL21lbXBvbGljeS5jLTIwMjctfVxuLS1cbm1tL21tYXAuYz0xNDY1PWJvb2wgdm1hX2lzX3NwZWNpYWxfbWFwcGluZyhjb25zdCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbi0tXG5tbS9tbWFwLmMtMTQ2OC1cdHJldHVybiB2bWEtXHUwMDNldm1fcHJpdmF0ZV9kYXRhID09IHNtIFx1MDAyNlx1MDAyNlxubW0vbW1hcC5jOjE0Njk6XHRcdHZtYS1cdTAwM2V2bV9vcHMgPT0gXHUwMDI2c3BlY2lhbF9tYXBwaW5nX3Ztb3BzO1xubW0vbW1hcC5jLTE0NzAtfVxuLS1cbm1tL21wcm90ZWN0LmM9ODcxPXN0YXRpYyBpbnQgZG9fbXByb3RlY3RfcGtleSh1bnNpZ25lZCBsb25nIHN0YXJ0LCBzaXplX3QgbGVuLFxuLS1cbm1tL21wcm90ZWN0LmMtOTk1LVxubW0vbXByb3RlY3QuYzo5OTY6XHRcdGlmICh2bWEtXHUwMDNldm1fb3BzIFx1MDAyNlx1MDAyNiB2bWEtXHUwMDNldm1fb3BzLVx1MDAzZW1wcm90ZWN0KSB7XG5tbS9tcHJvdGVjdC5jOjk5NzpcdFx0XHRlcnJvciA9IHZtYS1cdTAwM2V2bV9vcHMtXHUwMDNlbXByb3RlY3Qodm1hLCBuc3RhcnQsIHRtcCwgbmV3ZmxhZ3MpO1xubW0vbXByb3RlY3QuYy05OTgtXHRcdFx0aWYgKGVycm9yKVxuLS1cbm1tL21yZW1hcC5jPTExMTI9c3RhdGljIHVuc2lnbmVkIGxvbmcgcHJlcF9tb3ZlX3ZtYShzdHJ1Y3Qgdm1hX3JlbWFwX3N0cnVjdCAqdnJtKVxuLS1cbm1tL21yZW1hcC5jLTExMjctXG5tbS9tcmVtYXAuYzoxMTI4Olx0aWYgKHZtYS1cdTAwM2V2bV9vcHMgXHUwMDI2XHUwMDI2IHZtYS1cdTAwM2V2bV9vcHMtXHUwMDNlbWF5X3NwbGl0KSB7XG5tbS9tcmVtYXAuYy0xMTI5LVx0XHRpZiAodm1hLVx1MDAzZXZtX3N0YXJ0ICE9IG9sZF9hZGRyKVxubW0vbXJlbWFwLmM6MTEzMDpcdFx0XHRlcnIgPSB2bWEtXHUwMDNldm1fb3BzLVx1MDAzZW1heV9zcGxpdCh2bWEsIG9sZF9hZGRyKTtcbm1tL21yZW1hcC5jLTExMzEtXHRcdGlmICghZXJyIFx1MDAyNlx1MDAyNiB2bWEtXHUwMDNldm1fZW5kICE9IG9sZF9hZGRyICYjNDM7IG9sZF9sZW4pXG5tbS9tcmVtYXAuYzoxMTMyOlx0XHRcdGVyciA9IHZtYS1cdTAwM2V2bV9vcHMtXHUwMDNlbWF5X3NwbGl0KHZtYSwgb2xkX2FkZHIgJiM0Mzsgb2xkX2xlbik7XG5tbS9tcmVtYXAuYy0xMTMzLVx0XHRpZiAoZXJyKVxuLS1cbm1tL21yZW1hcC5jPTEyNjU9c3RhdGljIGludCBjb3B5X3ZtYV9hbmRfZGF0YShzdHJ1Y3Qgdm1hX3JlbWFwX3N0cnVjdCAqdnJtLFxuLS1cbm1tL21yZW1hcC5jLTEyOTQtXHRcdGVyciA9IC1FTk9NRU07XG5tbS9tcmVtYXAuYzoxMjk1Olx0ZWxzZSBpZiAodm1hLVx1MDAzZXZtX29wcyBcdTAwMjZcdTAwMjYgdm1hLVx1MDAzZXZtX29wcy1cdTAwM2VtcmVtYXApXG5tbS9tcmVtYXAuYzoxMjk2Olx0XHRlcnIgPSB2bWEtXHUwMDNldm1fb3BzLVx1MDAzZW1yZW1hcChuZXdfdm1hKTtcbm1tL21yZW1hcC5jLTEyOTctXG4tLVxubW0vc2VjcmV0bWVtLmM9MjEzPWJvb2wgdm1hX2lzX3NlY3JldG1lbShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSlcbm1tL3NlY3JldG1lbS5jLTIxNC17XG5tbS9zZWNyZXRtZW0uYzoyMTU6XHRyZXR1cm4gdm1hLVx1MDAzZXZtX29wcyA9PSBcdTAwMjZzZWNyZXRtZW1fdm1fb3BzO1xubW0vc2VjcmV0bWVtLmMtMjE2LX1cbi0tXG5tbS9zaG1lbS5jPTI4ND1ib29sIHZtYV9pc19hbm9uX3NobWVtKGNvbnN0IHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKVxubW0vc2htZW0uYy0yODUte1xubW0vc2htZW0uYzoyODY6XHRyZXR1cm4gdm1hLVx1MDAzZXZtX29wcyA9PSBcdTAwMjZzaG1lbV9hbm9uX3ZtX29wcztcbm1tL3NobWVtLmMtMjg3LX1cbi0tXG5tbS9zaG1lbS5jPTI4OT1ib29sIHZtYV9pc19zaG1lbShjb25zdCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSlcbm1tL3NobWVtLmMtMjkwLXtcbm1tL3NobWVtLmM6MjkxOlx0cmV0dXJuIHZtYV9pc19hbm9uX3NobWVtKHZtYSkgfHwgdm1hLVx1MDAzZXZtX29wcyA9PSBcdTAwMjZzaG1lbV92bV9vcHM7XG5tbS9zaG1lbS5jLTI5Mi19XG4tLVxubW0vc2htZW0uYz01OTA4PWludCBzaG1lbV96ZXJvX3NldHVwKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKVxuLS1cbm1tL3NobWVtLmMtNTkxNy1cdHZtYS1cdTAwM2V2bV9maWxlID0gZmlsZTtcbm1tL3NobWVtLmM6NTkxODpcdHZtYS1cdTAwM2V2bV9vcHMgPSBcdTAwMjZzaG1lbV9hbm9uX3ZtX29wcztcbm1tL3NobWVtLmMtNTkxOS1cbi0tXG5tbS91c2VyZmF1bHRmZC5jPTgzPXN0YXRpYyBjb25zdCBzdHJ1Y3Qgdm1fdWZmZF9vcHMgKnZtYV91ZmZkX29wcyhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSlcbi0tXG5tbS91c2VyZmF1bHRmZC5jLTg2LVx0XHRyZXR1cm4gXHUwMDI2YW5vbl91ZmZkX29wcztcbm1tL3VzZXJmYXVsdGZkLmM6ODc6XHRyZXR1cm4gdm1hLVx1MDAzZXZtX29wcy1cdTAwM2V1ZmZkX29wcztcbm1tL3VzZXJmYXVsdGZkLmMtODgtfVxuLS1cbm1tL3V0aWwuYz0xMTgwPXZvaWQgY29tcGF0X3NldF9kZXNjX2Zyb21fdm1hKHN0cnVjdCB2bV9hcmVhX2Rlc2MgKmRlc2MsXG4tLVxubW0vdXRpbC5jLTExOTQtXHRkZXNjLVx1MDAzZXBhZ2VfcHJvdCA9IHZtYS1cdTAwM2V2bV9wYWdlX3Byb3Q7XG5tbS91dGlsLmM6MTE5NTpcdGRlc2MtXHUwMDNldm1fb3BzID0gdm1hLVx1MDAzZXZtX29wcztcbm1tL3V0aWwuYy0xMTk2LVxuLS1cbm1tL3V0aWwuYz0xMzczPXN0YXRpYyBpbnQgY2FsbF92bWFfbWFwcGVkKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKVxubW0vdXRpbC5jLTEzNzQte1xubW0vdXRpbC5jOjEzNzU6XHRjb25zdCBzdHJ1Y3Qgdm1fb3BlcmF0aW9uc19zdHJ1Y3QgKnZtX29wcyA9IHZtYS1cdTAwM2V2bV9vcHM7XG5tbS91dGlsLmMtMTM3Ni1cdHZvaWQgKnZtX3ByaXZhdGVfZGF0YSA9IHZtYS1cdTAwM2V2bV9wcml2YXRlX2RhdGE7XG4tLVxubW0vdm1hLmM9NTQ0PV9fc3BsaXRfdm1hKHN0cnVjdCB2bWFfaXRlcmF0b3IgKnZtaSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4tLVxubW0vdm1hLmMtNTUzLVxubW0vdm1hLmM6NTU0Olx0aWYgKHZtYS1cdTAwM2V2bV9vcHMgXHUwMDI2XHUwMDI2IHZtYS1cdTAwM2V2bV9vcHMtXHUwMDNlbWF5X3NwbGl0KSB7XG5tbS92bWEuYzo1NTU6XHRcdGVyciA9IHZtYS1cdTAwM2V2bV9vcHMtXHUwMDNlbWF5X3NwbGl0KHZtYSwgYWRkcik7XG5tbS92bWEuYy01NTYtXHRcdGlmIChlcnIpXG4tLVxubW0vdm1hLmM9ODU1PXN0YXRpYyBib29sIGNhbl9tZXJnZV9yZW1vdmVfdm1hKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKVxubW0vdm1hLmMtODU2LXtcbm1tL3ZtYS5jOjg1NzpcdHJldHVybiAhdm1hLVx1MDAzZXZtX29wcyB8fCAhdm1hLVx1MDAzZXZtX29wcy1cdTAwM2VjbG9zZTtcbm1tL3ZtYS5jLTg1OC19XG4tLVxubW0vdm1hLmM9MTk0ND1zdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKmNvcHlfdm1hKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqKnZtYXAsXG4tLVxubW0vdm1hLmMtMjAxNi1cdFx0XHRnZXRfZmlsZShuZXdfdm1hLVx1MDAzZXZtX2ZpbGUpO1xubW0vdm1hLmM6MjAxNzpcdFx0aWYgKG5ld192bWEtXHUwMDNldm1fb3BzIFx1MDAyNlx1MDAyNiBuZXdfdm1hLVx1MDAzZXZtX29wcy1cdTAwM2VvcGVuKVxubW0vdm1hLmM6MjAxODpcdFx0XHRuZXdfdm1hLVx1MDAzZXZtX29wcy1cdTAwM2VvcGVuKG5ld192bWEpO1xubW0vdm1hLmMtMjAxOS1cdFx0aWYgKHZtYV9saW5rKG1tLCBuZXdfdm1hKSlcbi0tXG5tbS92bWEuYz0yMTg1PWJvb2wgdm1hX25lZWRzX2RpcnR5X3RyYWNraW5nKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKVxuLS1cbm1tL3ZtYS5jLTIxOTEtXHQvKiBEb2VzIHRoZSBmaWxlc3lzdGVtIG5lZWQgdG8gYmUgbm90aWZpZWQ/ICovXG5tbS92bWEuYzoyMTkyOlx0aWYgKHZtX29wc19uZWVkc193cml0ZW5vdGlmeSh2bWEtXHUwMDNldm1fb3BzKSlcbm1tL3ZtYS5jLTIxOTMtXHRcdHJldHVybiB0cnVlO1xuLS1cbm1tL3ZtYS5jPTIyMDg9Ym9vbCB2bWFfd2FudHNfd3JpdGVub3RpZnkoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHBncHJvdF90IHZtX3BhZ2VfcHJvdClcbi0tXG5tbS92bWEuYy0yMjE0LVx0LyogVGhlIGJhY2tlciB3aXNoZXMgdG8ga25vdyB3aGVuIHBhZ2VzIGFyZSBmaXJzdCB3cml0dGVuIHRvPyAqL1xubW0vdm1hLmM6MjIxNTpcdGlmICh2bV9vcHNfbmVlZHNfd3JpdGVub3RpZnkodm1hLVx1MDAzZXZtX29wcykpXG5tbS92bWEuYy0yMjE2LVx0XHRyZXR1cm4gdHJ1ZTtcbi0tXG5tbS92bWEuYz0yNzk5PXN0YXRpYyB2b2lkIHNldF92bWFfdXNlcl9kZWZpbmVkX2ZpZWxkcyhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbi0tXG5tbS92bWEuYy0yODAyLVx0aWYgKG1hcC1cdTAwM2V2bV9vcHMpXG5tbS92bWEuYzoyODAzOlx0XHR2bWEtXHUwMDNldm1fb3BzID0gbWFwLVx1MDAzZXZtX29wcztcbm1tL3ZtYS5jLTI4MDQtXHRlbHNlXHQvKiBPbmx5IC9kZXYvemVybyBzaG91bGQgZG8gdGhpcy4gKi9cbi0tXG5tbS92bWEuYz0zNDYxPXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqX19pbnN0YWxsX3NwZWNpYWxfbWFwcGluZyhcbi0tXG5tbS92bWEuYy0zNDgyLVxubW0vdm1hLmM6MzQ4MzpcdHZtYS1cdTAwM2V2bV9vcHMgPSBvcHM7XG5tbS92bWEuYy0zNDg0LVx0dm1hLVx1MDAzZXZtX3ByaXZhdGVfZGF0YSA9IHByaXY7XG4tLVxubW0vdm1hLmg9Mzg5PXN0YXRpYyBpbmxpbmUgdm9pZCBjb21wYXRfc2V0X3ZtYV9mcm9tX2Rlc2Moc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4tLVxubW0vdm1hLmgtNDA1LVx0LyogVXNlci1kZWZpbmVkIGZpZWxkcy4gKi9cbm1tL3ZtYS5oOjQwNjpcdHZtYS1cdTAwM2V2bV9vcHMgPSBkZXNjLVx1MDAzZXZtX29wcztcbm1tL3ZtYS5oLTQwNy1cdHZtYS1cdTAwM2V2bV9wcml2YXRlX2RhdGEgPSBkZXNjLVx1MDAzZXByaXZhdGVfZGF0YTtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD45LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNyAyMTo1NTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxNDc0MQoJCQkJCQkJb3V0cHV0OiAyNQoJCQkJCQkJdGhvdWdodHM6IDc0MgoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipNeSBBbmFseXNpcyBvZiB0aGlzIFBvdGVudGlhbCBWdWxuZXJhYmlsaXR5KioKCk9rYXksIGhlcmUmIzM5O3MgdGhlIGJyZWFrZG93biBvZiBteSB0aGlua2luZy4gTXkgaW5pdGlhbCBjb25jZXJuIHN0ZW1tZWQgZnJvbSB0aGUgYG1tYXBfZmlsZWAgZnVuY3Rpb24gYW5kIHRoZSBwb3RlbnRpYWwgZm9yIGEgbnVsbCBwb2ludGVyIGRlcmVmZXJlbmNlLiBJIHNlZSB0aGF0IGFub255bW91cyBWTUFzIGFuZCBkdW1teSBvbmVzIHVzZSBgdm1hX2R1bW15X3ZtX29wc2AsIGJ1dCBJJiMzOTttIHRoaW5raW5nIGFib3V0IHRoZSBjYXNlIHdoZXJlIGEgZHJpdmVyIG1pZ2h0IHNldCBgdm1hLSZndDt2bV9vcHMgPSBOVUxMYCBpbnRlbnRpb25hbGx5IG9yIGJ5IG92ZXJzaWdodC4gSSYjMzk7bSBpbWFnaW5pbmcgYSBzY2VuYXJpbyB3aGVyZSwgZXZlbiBpZiB0aGUgZHVtbXkgb3BlcmF0aW9ucyBhcmUgcHJlc2VudCwgYSBkcml2ZXIgY291bGQgc2V0IHRoaXMgcG9pbnRlciB0byBudWxsLiBXaGF0IGhhcHBlbnMgdGhlbiB3aGVuIHRoZSBjb2RlIGxhdGVyIHRyaWVzIHRvIHVzZSBgdm1hLSZndDt2bV9vcHNgIHdpdGhvdXQgY2hlY2tpbmcgaWYgaXQmIzM5O3MgTlVMTD8KClRoZW4gSSB6ZXJvZWQgaW4gb24gdGhlIGBtbS9odWdlX21lbW9yeS5jYCBmaWxlLCBzcGVjaWZpY2FsbHkgdGhlIGB2bWFfZmlsZV9ieXBhc3NfdGhwX3R1bmVhYmxlc2AgZnVuY3Rpb24uIEkgc2VlIGFuICp1bmNvbmRpdGlvbmFsKiBkZXJlZmVyZW5jZSBvZiBgdm1hLSZndDt2bV9vcHNgIGluIHRoaXMgZnVuY3Rpb246IGBjb25zdCBib29sIGhhc19odWdlX2ZhdWx0ID0gdm1hLSZndDt2bV9vcHMtJmd0O2h1Z2VfZmF1bHQ7YC4gVGhpcyBpcyBhIGJpZyByZWQgZmxhZyEgQmVmb3JlIGl0IHdhcyBzb21ldGhpbmcgbGlrZSBgaWYgKCgoaW5fcGYgfHwgc21hcHMpKSAmYW1wOyZhbXA7IHZtYS0mZ3Q7dm1fb3BzLSZndDtodWdlX2ZhdWx0KWAsIGJ1dCBub3csIGl0JiMzOTtzIHN0cmFpZ2h0LXVwIGRlcmVmZXJlbmNpbmcuCgpNeSBtaW5kIHJhY2VkIHRvIHRoZSBxdWVzdGlvbiBvZiB3aGV0aGVyIGB2bWEtJmd0O3ZtX29wc2AgaXMgKmFsd2F5cyogbm9uLU5VTEwgd2hlbiBpdCBpcyBub3QgYW5vbnltb3VzLCBidXQgdGhlbiBJIHJlYWxpemVkIGl0IGRvZXNuJiMzOTt0IG1hdHRlciwgbm93LCBpdCYjMzk7cyBiZWluZyBkZXJlZmVyZW5jZWQgdW5jb25kaXRpb25hbGx5LCB3aGV0aGVyIGl0IGlzIG9yIGlzbiYjMzk7dC4gU28sIGlmIGB2bWEtJmd0O3ZtX29wc2AgKmlzKiBOVUxMIGluIHRoYXQgY29udGV4dCwgdGhlbiB3ZSBoYXZlIGEgY2xhc3NpYyBudWxsIHBvaW50ZXIgZGVyZWZlcmVuY2UgdnVsbmVyYWJpbGl0eS4KCk5vdywgSSBzd2l0Y2hlZCBnZWFycyB0byB0cmlhZ2UuIEkga25vdyB0aGF0IG1lbW9yeSBtYW5hZ2VtZW50IGNvZGUgaXMgY3JpdGljYWwuIEkmIzM5O20gZ29pbmcgdGhyb3VnaCB0aGUgdHJpYWdlIGNyaXRlcmlhIGluIG15IGhlYWQ6IGNoYW5nZXMgaW4gbWVtb3J5IG1hbmFnZW1lbnQgKG1tLyksIHN5bmNocm9uaXphdGlvbi9sb2NraW5nLCBCUEYsIHNjaGVkdWxlciwgY29yZSBuZXR3b3JraW5nLCBWRlMsIG9yIHN5c2NhbGwgaGFuZGxpbmc/IFRoaXMgaXMgKmRlZmluaXRlbHkqIGNvcmUgbWVtb3J5IG1hbmFnZW1lbnQsIHNwZWNpZmljYWxseSByZWxhdGVkIHRvIFRIUCAoVHJhbnNwYXJlbnQgSHVnZSBQYWdlcykuIEl0JiMzOTtzIG1vZGlmeWluZyBgdm1hX2ZpbGVfYnlwYXNzX3RocF90dW5lYWJsZXNgLCBzbyBpdCYjMzk7cyBhIGRpcmVjdCBjaGFuZ2UgaW4gaG93IFRIUCBvcmRlcnMgYXJlIGNhbGN1bGF0ZWQgZm9yIGZpbGUtYmFja2VkIFZNQXMuCgpJIHRoaW5rIHRocm91Z2ggdGhlIHBvdGVudGlhbCByZWFjaGFiaWxpdHk6IFRoaXMgY29kZSBpcyB1c2VkIGJ5IGBtYWR2aXNlKE1BRFZfQ09MTEFQU0UpYCwgZHVyaW5nIHBhZ2UgZmF1bHRzIG9uIGZpbGUgVk1BcywgdmlhIGAvcHJvYy9waWQvc21hcHNgLCBhbmQgYnkgYGtodWdlcGFnZWRgLiBBYnNvbHV0ZWx5IHJlYWNoYWJsZSBpbiB0eXBpY2FsIFFFTVUveDg2XzY0IHNldHVwcy4gU28sIGJhc2VkIG9uIHRoZSByZWFjaGFiaWxpdHkgYW5kIHRoZSBwb3RlbnRpYWwgZm9yIGEgbnVsbCBkZXJlZmVyZW5jZSBpbiBjb3JlIG1lbW9yeSBtYW5hZ2VtZW50LCBJJiMzOTttIG1hcmtpbmcgaXQgYXMgZGVmaW5pdGVseSBgV29ydGhGdXp6aW5nPXRydWVgLgoKTmV4dCwgSSYjMzk7bGwgZm9jdXMgb24gbmFpbGluZyBkb3duIHRoZSBuZWNlc3NhcnkgYEVuYWJsZUNvbmZpZ3NgLCBpZGVudGlmeWluZyB0aGUgYEZvY3VzU3ltYm9sc2AsIGFuZCB0aGUgc3BlY2lmaWMgcmVhc29ucyB3aHkgdGhpcyBwYXRjaCBpcyBwYXJ0aWN1bGFybHkgY29uY2VybmluZyB0byB3cml0ZSBhIHNvbGlkIGp1c3RpZmljYXRpb24gZm9yIHRoaXMgYW5hbHlzaXMuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTAvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA3IDIxOjU1PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2h1Z2VfbWVtb3J5JiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7bW0vJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O21tL01ha2VmaWxlPTEwMD1vYmotJChDT05GSUdfREVWSUNFX01JR1JBVElPTikgJiM0Mzs9IG1pZ3JhdGVfZGV2aWNlLm9cbm1tL01ha2VmaWxlOjEwMTpvYmotJChDT05GSUdfVFJBTlNQQVJFTlRfSFVHRVBBR0UpICYjNDM7PSBodWdlX21lbW9yeS5vIGtodWdlcGFnZWQub1xubW0vTWFrZWZpbGUtMTAyLW9iai0kKENPTkZJR19QQUdFX0NPVU5URVIpICYjNDM7PSBwYWdlX2NvdW50ZXIub1xuLS1cbm1tL2ludGVybmFsLmg9MTI4Mj1pbnQgX19tdXN0X2NoZWNrIHRyeV9ncmFiX2ZvbGlvKHN0cnVjdCBmb2xpbyAqZm9saW8sIGludCByZWZzLFxuLS1cbm1tL2ludGVybmFsLmgtMTI4NS0vKlxubW0vaW50ZXJuYWwuaDoxMjg2OiAqIG1tL2h1Z2VfbWVtb3J5LmNcbm1tL2ludGVybmFsLmgtMTI4Ny0gKi9cbi0tXG5tbS9raHVnZXBhZ2VkLmM9MzM9ZW51bSBzY2FuX3Jlc3VsdCB7XG4tLVxubW0va2h1Z2VwYWdlZC5jLTY4LSNkZWZpbmUgQ1JFQVRFX1RSQUNFX1BPSU5UU1xubW0va2h1Z2VwYWdlZC5jOjY5OiNpbmNsdWRlIFx1MDAzY3RyYWNlL2V2ZW50cy9odWdlX21lbW9yeS5oXHUwMDNlXG5tbS9raHVnZXBhZ2VkLmMtNzAtXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTEvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA3IDIxOjU1PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDE2MzgzCgkJCQkJCQlvdXRwdXQ6IDMwCgkJCQkJCQl0aG91Z2h0czogNDgKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGhlcmUmIzM5O3MgbXkgaW50ZXJwcmV0YXRpb24gb2YgdGhhdCB0aG91Z2h0IHByb2Nlc3MsIGFzIGlmIGl0IHdlcmUgbXkgb3duOgoKKipJbnZlc3RpZ2F0aW5nIHRoZSBEZXBlbmRlbmN5IG9mIEh1Z2UgTWVtb3J5IFN1cHBvcnQqKgoKUmlnaHQsIHNvIGBodWdlX21lbW9yeS5vYCBpcyB0aHJvd2luZyBhIGZpdCwgYW5kIEkga25vdyB0aGF0IG1lYW5zIGl0IG5lZWRzIHRyYW5zcGFyZW50IGh1Z2UgcGFnZXMgZW5hYmxlZC4gVGhlIGZpcnN0IGxvZ2ljYWwgc3RlcCBpcyB0byBjb25maXJtIHRoZSBkZXBlbmRlbmN5LiBJIG5lZWQgdG8gZGlnIGludG8gdGhlIGtlcm5lbCBjb25maWd1cmF0aW9uIHRvIGJlIHN1cmUuIFNvLCBJIG5lZWQgdG8gY2hlY2sgdGhlIEtjb25maWcgZGVmaW5pdGlvbiBvZiBgVFJBTlNQQVJFTlRfSFVHRVBBR0VgLiBUaGF0JiMzOTtzIHdoZXJlIGFsbCB0aGUgY29uZmlndXJhdGlvbiBvcHRpb25zIGFyZSBkZWNsYXJlZCwgYW5kIHRoZSBkZXBlbmRlbmNpZXMgYXJlIHNwZWxsZWQgb3V0LiBJdCYjMzk7cyBsaWtlbHkgaW4gYG1tL0tjb25maWdgLCBhcyB0aGUgbWVtb3J5IG1hbmFnZW1lbnQgc3Vic3lzdGVtIGlzIHRoZSBvYnZpb3VzIHBsYWNlIGZvciB0aGF0LiBMZXQmIzM5O3MgZ28gdGFrZSBhIGxvb2sgdGhlcmUgYW5kIGNvbmZpcm0gdGhhdCBgQ09ORklHX1RSQU5TUEFSRU5UX0hVR0VQQUdFYCBpcyBpbmRlZWQgYSBoYXJkIHJlcXVpcmVtZW50IGZvciB0aGUgZnVuY3Rpb25hbGl0eSBJJiMzOTttIHRyeWluZyB0byBlbmFibGUuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTIvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA3IDIxOjU1PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2NvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRSYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O21tLyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDttbS9LY29uZmlnPTgzMj1jb25maWcgTU1fSURcbi0tXG5tbS9LY29uZmlnLTgzNC1cbm1tL0tjb25maWc6ODM1Om1lbnVjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0Vcbm1tL0tjb25maWctODM2LVx0Ym9vbCBcJiMzNDtUcmFuc3BhcmVudCBIdWdlcGFnZSBTdXBwb3J0XCYjMzQ7XG4tLVxubW0vS2NvbmZpZz04NTM9Y2hvaWNlXG4tLVxubW0vS2NvbmZpZy04NTgtXG5tbS9LY29uZmlnOjg1OTpcdGNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRV9BTFdBWVNcbm1tL0tjb25maWctODYwLVx0XHRib29sIFwmIzM0O2Fsd2F5c1wmIzM0O1xuLS1cbm1tL0tjb25maWctODY1LVxubW0vS2NvbmZpZzo4NjY6XHRjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VfTUFEVklTRVxubW0vS2NvbmZpZy04NjctXHRcdGJvb2wgXCYjMzQ7bWFkdmlzZVwmIzM0O1xuLS1cbm1tL0tjb25maWctODc0LVxubW0vS2NvbmZpZzo4NzU6XHRjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VfTkVWRVJcbm1tL0tjb25maWctODc2LVx0XHRib29sIFwmIzM0O25ldmVyXCYjMzQ7XG4tLVxubW0vS2NvbmZpZz04ODI9Y2hvaWNlXG4tLVxubW0vS2NvbmZpZy04OTEtXG5tbS9LY29uZmlnOjg5MjpcdGNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRV9TSE1FTV9IVUdFX05FVkVSXG5tbS9LY29uZmlnLTg5My1cdFx0Ym9vbCBcJiMzNDtuZXZlclwmIzM0O1xuLS1cbm1tL0tjb25maWctOTAxLVxubW0vS2NvbmZpZzo5MDI6XHRjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VfU0hNRU1fSFVHRV9BTFdBWVNcbm1tL0tjb25maWctOTAzLVx0XHRib29sIFwmIzM0O2Fsd2F5c1wmIzM0O1xuLS1cbm1tL0tjb25maWctOTA5LVxubW0vS2NvbmZpZzo5MTA6XHRjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VfU0hNRU1fSFVHRV9XSVRISU5fU0laRVxubW0vS2NvbmZpZy05MTEtXHRcdGJvb2wgXCYjMzQ7d2l0aGluX3NpemVcJiMzNDtcbi0tXG5tbS9LY29uZmlnLTkxNy1cbm1tL0tjb25maWc6OTE4Olx0Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX1NITUVNX0hVR0VfQURWSVNFXG5tbS9LY29uZmlnLTkxOS1cdFx0Ym9vbCBcJiMzNDthZHZpc2VcJiMzNDtcbi0tXG5tbS9LY29uZmlnPTkyNz1jaG9pY2Vcbi0tXG5tbS9LY29uZmlnLTkzNi1cbm1tL0tjb25maWc6OTM3Olx0Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX1RNUEZTX0hVR0VfTkVWRVJcbm1tL0tjb25maWctOTM4LVx0XHRib29sIFwmIzM0O25ldmVyXCYjMzQ7XG4tLVxubW0vS2NvbmZpZy05NDUtXG5tbS9LY29uZmlnOjk0NjpcdGNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRV9UTVBGU19IVUdFX0FMV0FZU1xubW0vS2NvbmZpZy05NDctXHRcdGJvb2wgXCYjMzQ7YWx3YXlzXCYjMzQ7XG4tLVxubW0vS2NvbmZpZy05NTMtXG5tbS9LY29uZmlnOjk1NDpcdGNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRV9UTVBGU19IVUdFX1dJVEhJTl9TSVpFXG5tbS9LY29uZmlnLTk1NS1cdFx0Ym9vbCBcJiMzNDt3aXRoaW5fc2l6ZVwmIzM0O1xuLS1cbm1tL0tjb25maWctOTYxLVxubW0vS2NvbmZpZzo5NjI6XHRjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VfVE1QRlNfSFVHRV9BRFZJU0Vcbm1tL0tjb25maWctOTYzLVx0XHRib29sIFwmIzM0O2FkdmlzZVwmIzM0O1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEzLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNyAyMTo1NTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxNzM1NQoJCQkJCQkJb3V0cHV0OiAzMgoJCQkJCQkJdGhvdWdodHM6IDI0CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IHRha2Ugb24gdGhlIGRlcGVuZGVuY2llcyBvZiBgVFJBTlNQQVJFTlRfSFVHRVBBR0VgIGluIGBtbS9LY29uZmlnYCwgYXMgaWYgSSB3ZXJlIHRoZSBvbmUgdGhpbmtpbmcgaXQgdGhyb3VnaDoKCioqRGVjb25zdHJ1Y3RpbmcgVFJBTlNQQVJFTlRfSFVHRVBBR0UgRGVwZW5kZW5jaWVzKioKCk9rYXksIGxldCYjMzk7cyBkaXZlIGludG8gdGhlIGBtbS9LY29uZmlnYCBmaWxlIGFuZCBmaWd1cmUgb3V0IHdoYXQgbWFrZXMgYFRSQU5TUEFSRU5UX0hVR0VQQUdFYCB0aWNrLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCB3aGF0IG90aGVyIGtlcm5lbCBmZWF0dXJlcywgY29uZmlndXJhdGlvbiBvcHRpb25zLCBvciBhcmNoaXRlY3R1cmFsIGNvbnN0cmFpbnRzIGRpY3RhdGUgd2hldGhlciB0aGlzIHRoaW5nIGlzIGV2ZW4gKnBvc3NpYmxlKiB0byBlbmFibGUsIG11Y2ggbGVzcyAqYSBnb29kIGlkZWEqLiBObyBkb3VidCB0aGVyZSBhcmUgZGVwZW5kZW5jaWVzIG9uIHBhZ2Ugc2l6ZSwgbWF5YmUgc3BlY2lmaWMgQ1BVIGFyY2hpdGVjdHVyZXMsIGFuZCBwcm9iYWJseSBzb21lIGludGVyYWN0aW9uIHdpdGggTlVNQSBjb25maWd1cmF0aW9ucy4gSSYjMzk7bSBlc3BlY2lhbGx5IGludGVyZXN0ZWQgaW4gd2hldGhlciB0aGVyZSBhcmUgaGFyZCBkZXBlbmRlbmNpZXMgb3IganVzdCAmIzM0O2ltcGxpZXMmIzM0OyByZWxhdGlvbnNoaXBzLiBBcmUgdGhlcmUgYW55IGZlYXR1cmVzIHdoaWNoIHJlcXVpcmUgaXQsIG9yIHdoaWNoIGl0IHJlcXVpcmVzPyBJJiMzOTtsbCBwcm9iYWJseSBiZSBsb29raW5nIGZvciBvcHRpb25zIHJlbGF0ZWQgdG8gbWVtb3J5IG1hbmFnZW1lbnQgYW5kIGFsbG9jYXRpb24uIEnigJltIHRoaW5raW5nIGFib3V0IHBlcmZvcm1hbmNlIGNvbnNpZGVyYXRpb25zIHRvbyDigJMgaHVnZXBhZ2VzIGFyZSBhIGRvdWJsZS1lZGdlZCBzd29yZCwgc28gdGhlICpjb25kaXRpb25zKiBmb3IgdGhlaXIgdXNlIG11c3QgYmUgY2FyZWZ1bGx5IGNvbnNpZGVyZWQuIEl0JiMzOTtzIHRpbWUgdG8gc2lmdCB0aHJvdWdoIHRoZSBLY29uZmlnIGFuZCBicmVhayB0aGlzIGRvd24uCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTQvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA3IDIxOjU1PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7bW0vS2NvbmZpZyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDgzMCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiA0MAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgODMwOlx0XHQgIG1lbW9yeSBjb25zdHJhaW5lZC5cbiA4MzE6XHRcbiA4MzI6XHRjb25maWcgTU1fSURcbiA4MzM6XHRcdGRlZl9ib29sIG5cbiA4MzQ6XHRcbiA4MzU6XHRtZW51Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFXG4gODM2Olx0XHRib29sIFwmIzM0O1RyYW5zcGFyZW50IEh1Z2VwYWdlIFN1cHBvcnRcJiMzNDtcbiA4Mzc6XHRcdGRlcGVuZHMgb24gSEFWRV9BUkNIX1RSQU5TUEFSRU5UX0hVR0VQQUdFIFx1MDAyNlx1MDAyNiAhUFJFRU1QVF9SVFxuIDgzODpcdFx0c2VsZWN0IENPTVBBQ1RJT05cbiA4Mzk6XHRcdHNlbGVjdCBYQVJSQVlfTVVMVElcbiA4NDA6XHRcdHNlbGVjdCBNTV9JRFxuIDg0MTpcdFx0aGVscFxuIDg0MjpcdFx0ICBUcmFuc3BhcmVudCBIdWdlcGFnZXMgYWxsb3dzIHRoZSBrZXJuZWwgdG8gdXNlIGh1Z2UgcGFnZXMgYW5kXG4gODQzOlx0XHQgIGh1Z2UgdGxiIHRyYW5zcGFyZW50bHkgdG8gdGhlIGFwcGxpY2F0aW9ucyB3aGVuZXZlciBwb3NzaWJsZS5cbiA4NDQ6XHRcdCAgVGhpcyBmZWF0dXJlIGNhbiBpbXByb3ZlIGNvbXB1dGluZyBwZXJmb3JtYW5jZSB0byBjZXJ0YWluXG4gODQ1Olx0XHQgIGFwcGxpY2F0aW9ucyBieSBzcGVlZGluZyB1cCBwYWdlIGZhdWx0cyBkdXJpbmcgbWVtb3J5XG4gODQ2Olx0XHQgIGFsbG9jYXRpb24sIGJ5IHJlZHVjaW5nIHRoZSBudW1iZXIgb2YgdGxiIG1pc3NlcyBhbmQgYnkgc3BlZWRpbmdcbiA4NDc6XHRcdCAgdXAgdGhlIHBhZ2V0YWJsZSB3YWxraW5nLlxuIDg0ODpcdFxuIDg0OTpcdFx0ICBJZiBtZW1vcnkgY29uc3RyYWluZWQgb24gZW1iZWRkZWQsIHlvdSBtYXkgd2FudCB0byBzYXkgTi5cbiA4NTA6XHRcbiA4NTE6XHRpZiBUUkFOU1BBUkVOVF9IVUdFUEFHRVxuIDg1MjpcdFxuIDg1MzpcdGNob2ljZVxuIDg1NDpcdFx0cHJvbXB0IFwmIzM0O1RyYW5zcGFyZW50IEh1Z2VwYWdlIFN1cHBvcnQgc3lzZnMgZGVmYXVsdHNcJiMzNDtcbiA4NTU6XHRcdGRlZmF1bHQgVFJBTlNQQVJFTlRfSFVHRVBBR0VfQUxXQVlTXG4gODU2Olx0XHRoZWxwXG4gODU3Olx0XHQgIFNlbGVjdHMgdGhlIHN5c2ZzIGRlZmF1bHRzIGZvciBUcmFuc3BhcmVudCBIdWdlcGFnZSBTdXBwb3J0LlxuIDg1ODpcdFxuIDg1OTpcdFx0Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX0FMV0FZU1xuIDg2MDpcdFx0XHRib29sIFwmIzM0O2Fsd2F5c1wmIzM0O1xuIDg2MTpcdFx0aGVscFxuIDg2MjpcdFx0ICBFbmFibGluZyBUcmFuc3BhcmVudCBIdWdlcGFnZSBhbHdheXMsIGNhbiBpbmNyZWFzZSB0aGVcbiA4NjM6XHRcdCAgbWVtb3J5IGZvb3RwcmludCBvZiBhcHBsaWNhdGlvbnMgd2l0aG91dCBhIGd1YXJhbnRlZWRcbiA4NjQ6XHRcdCAgYmVuZWZpdCBidXQgaXQgd2lsbCB3b3JrIGF1dG9tYXRpY2FsbHkgZm9yIGFsbCBhcHBsaWNhdGlvbnMuXG4gODY1Olx0XG4gODY2Olx0XHRjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VfTUFEVklTRVxuIDg2NzpcdFx0XHRib29sIFwmIzM0O21hZHZpc2VcJiMzNDtcbiA4Njg6XHRcdGhlbHBcbiA4Njk6XHRcdCAgRW5hYmxpbmcgVHJhbnNwYXJlbnQgSHVnZXBhZ2UgbWFkdmlzZSwgd2lsbCBvbmx5IHByb3ZpZGUgYVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE1LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNyAyMTo1NTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxODE5NAoJCQkJCQkJb3V0cHV0OiAzMgoJCQkJCQkJdGhvdWdodHM6IDk1CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyBUcmFuc3BhcmVudCBIdWdlIFBhZ2VzIENvbmZpZ3VyYXRpb24qKgoKT2theSwgc28gdGhlIG1haW4gdGhpbmcgdG8gYmUgbG9va2luZyBhdCBoZXJlIGlzIGBDT05GSUdfVFJBTlNQQVJFTlRfSFVHRVBBR0VgLiBUaGF0JiMzOTtzIHRoZSBjb3JlIHNldHRpbmcsIHNvIGV2ZXJ5dGhpbmcgZWxzZSBpcyBwcm9iYWJseSBjb250aW5nZW50IG9uIGl0LiBNeSBpbW1lZGlhdGUgdGhvdWdodCBpcyB0byB1bmRlcnN0YW5kIGhvdyB0aGUgc3lzdGVtIGRlY2lkZXMgd2hhdCBraW5kIG9mIGh1Z2UgcGFnZXMgaXQmIzM5O3MgZ29pbmcgdG8gYWxsb3cgZm9yIGEgZ2l2ZW4gVk1BLiBJIG5lZWQgdG8gZGlnIGludG8gdGhlIGRlY2lzaW9uLW1ha2luZyBwcm9jZXNzLgoKTXkgbmV4dCBzdGVwIGlzIHRvIGV4YW1pbmUgdGhlIGZ1bmN0aW9uIGNhbGxzIGZvciBgX190aHBfdm1hX2FsbG93YWJsZV9vcmRlcnNgIGFuZCBgdGhwX3ZtYV9hbGxvd2FibGVfb3JkZXJzYC4gVGhlc2UgZnVuY3Rpb25zIGFyZSAqa2V5KiBoZXJlLCB0aGlzIGlzIHdoZXJlIHRoZSBwb2xpY3kgaXMgc2V0LiBJIG5lZWQgdG8gdW5kZXJzdGFuZCB3aGF0IHBhcmFtZXRlcnMgYXJlIGJlaW5nIHBhc3NlZCwgd2hlcmUgdGhlc2UgZnVuY3Rpb25zIGFyZSBiZWluZyB1c2VkLCBhbmQgd2hhdCBmYWN0b3JzIGluZmx1ZW5jZSB0aGVpciByZXR1cm4gdmFsdWVzLiBJJiMzOTtsbCBuZWVkIHRvIHBheSBjbG9zZSBhdHRlbnRpb24gdG8gYW55IHN5bWJvbHMgbGlzdGVkIGluIHRoZSBkb2N1bWVudGF0aW9uIGFzICpGb2N1c1N5bWJvbHMqLgoKVG8gZ2V0IGEgZnVsbCBwaWN0dXJlLCBhIGdyZXAgYWNyb3NzIHRoZSBlbnRpcmUga2VybmVsIHNvdXJjZSBpcyB0aGUgb2J2aW91cyBuZXh0IHN0ZXAuIEkgbmVlZCBhIGNvbXByZWhlbnNpdmUgbGlzdCBvZiBldmVyeSBpbnN0YW5jZSB3aGVyZSB0aG9zZSB0d28gZnVuY3Rpb25zIGFyZSBpbnZva2VkLiBUaGlzIHdpbGwgaWxsdW1pbmF0ZSB0aGUgZGlmZmVyZW50IGNvbnRleHRzIGluIHdoaWNoIGh1Z2UgcGFnZSBhbGxvY2F0aW9uIGlzIGNvbnNpZGVyZWQsIGFsbG93aW5nIG1lIHRvIGJ1aWxkIGEgY29tcGxldGUgbWVudGFsIG1vZGVsIG9mIGhvdyB0aGUgc3lzdGVtIGhhbmRsZXMgaXQuIFdpdGggdGhpcyBpbmZvcm1hdGlvbiwgSSBjYW4gZXZhbHVhdGUgdGhlIHBlcmZvcm1hbmNlIGltcGxpY2F0aW9ucyBhbmQgcG90ZW50aWFsIHZ1bG5lcmFiaWxpdGllcy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNi8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDcgMjE6NTU8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7dGhwX3ZtYV9hbGxvd2FibGVfb3JkZXJzJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7bW0vJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O21tL2h1Z2VfbWVtb3J5LmM9MTUzPXN0YXRpYyBib29sIHZtYV9maWxlX2Nhbl9tYXBfaHVnZShjb25zdCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbi0tXG5tbS9odWdlX21lbW9yeS5jLTE1OS1cdCAqIEVuZm9yY2UgVEhQIGNvbGxhcHNlIHJlcXVpcmVtZW50cyBhcyBuZWNlc3NhcnkuIEFub255bW91cyB2bWFzXG5tbS9odWdlX21lbW9yeS5jOjE2MDpcdCAqIHdlcmUgYWxyZWFkeSBoYW5kbGVkIGluIHRocF92bWFfYWxsb3dhYmxlX29yZGVycygpLlxubW0vaHVnZV9tZW1vcnkuYy0xNjEtXHQgKi9cbi0tXG5tbS9odWdlX21lbW9yeS5jLTE4MS1cbm1tL2h1Z2VfbWVtb3J5LmM6MTgyOnVuc2lnbmVkIGxvbmcgX190aHBfdm1hX2FsbG93YWJsZV9vcmRlcnMoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG5tbS9odWdlX21lbW9yeS5jLTE4My1cdFx0XHRcdFx0IHZtX2ZsYWdzX3Qgdm1fZmxhZ3MsXG4tLVxubW0va2h1Z2VwYWdlZC5jPTU2OD1zdGF0aWMgdW5zaWduZWQgbG9uZyBjb2xsYXBzZV9wb3NzaWJsZV9vcmRlcnMoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4tLVxubW0va2h1Z2VwYWdlZC5jLTU3OC1cbm1tL2todWdlcGFnZWQuYzo1Nzk6XHRyZXR1cm4gdGhwX3ZtYV9hbGxvd2FibGVfb3JkZXJzKHZtYSwgdm1fZmxhZ3MsIHR2YV9mbGFncywgb3JkZXJzKTtcbm1tL2todWdlcGFnZWQuYy01ODAtfVxuLS1cbm1tL2todWdlcGFnZWQuYz0xMDY0PXN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IGh1Z2VwYWdlX3ZtYV9yZXZhbGlkYXRlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHJlc3MsXG4tLVxubW0va2h1Z2VwYWdlZC5jLTEwODctXHRcdHJldHVybiBTQ0FOX0FERFJFU1NfUkFOR0U7XG5tbS9raHVnZXBhZ2VkLmM6MTA4ODpcdGlmICghdGhwX3ZtYV9hbGxvd2FibGVfb3JkZXJzKHZtYSwgdm1hLVx1MDAzZXZtX2ZsYWdzLCB0eXBlLCBCSVQob3JkZXIpKSlcbm1tL2todWdlcGFnZWQuYy0xMDg5LVx0XHRyZXR1cm4gU0NBTl9WTUFfQ0hFQ0s7XG4tLVxubW0va2h1Z2VwYWdlZC5jLTEwOTMtXHQgKlxubW0va2h1Z2VwYWdlZC5jOjEwOTQ6XHQgKiB0aHBfdm1hX2FsbG93YWJsZV9vcmRlcnMoKSBtYXkgcmV0dXJuIHRydWUgZm9yIHF1YWxpZmllZCBmaWxlXG5tbS9raHVnZXBhZ2VkLmMtMTA5NS1cdCAqIHZtYXMuXG4tLVxubW0vbWVtb3J5LmM9NDc5NT1zdGF0aWMgdW5zaWduZWQgbG9uZyB0aHBfc3dhcGluX3N1aXRhYmxlX29yZGVycyhzdHJ1Y3Qgdm1fZmF1bHQgKnZtZilcbi0tXG5tbS9tZW1vcnkuYy00ODI0LVx0ICovXG5tbS9tZW1vcnkuYzo0ODI1Olx0b3JkZXJzID0gdGhwX3ZtYV9hbGxvd2FibGVfb3JkZXJzKHZtYSwgdm1hLVx1MDAzZXZtX2ZsYWdzLCBUVkFfUEFHRUZBVUxULFxubW0vbWVtb3J5LmMtNDgyNi1cdFx0XHRcdFx0ICBCSVQoUE1EX09SREVSKSAtIDEpO1xuLS1cbm1tL21lbW9yeS5jPTUzMDE9c3RhdGljIHN0cnVjdCBmb2xpbyAqYWxsb2NfYW5vbl9mb2xpbyhzdHJ1Y3Qgdm1fZmF1bHQgKnZtZilcbi0tXG5tbS9tZW1vcnkuYy01MzIzLVx0ICovXG5tbS9tZW1vcnkuYzo1MzI0Olx0b3JkZXJzID0gdGhwX3ZtYV9hbGxvd2FibGVfb3JkZXJzKHZtYSwgdm1hLVx1MDAzZXZtX2ZsYWdzLCBUVkFfUEFHRUZBVUxULFxubW0vbWVtb3J5LmMtNTMyNS1cdFx0XHRcdFx0ICBCSVQoUE1EX09SREVSKSAtIDEpO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE3LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNyAyMTo1NTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxOTMyOAoJCQkJCQkJb3V0cHV0OiAyNAoJCQkJCQkJdGhvdWdodHM6IDI5CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IHRoaW5raW5nOgoKKipJbnZlc3RpZ2F0aW5nIENhbGxlcnMgUmVsYXRlZCB0byBIdWdlIFBhZ2VzKioKCk9rYXksIEkgbmVlZCB0byBleHBhbmQgbXkgc2VhcmNoIHRvIGlkZW50aWZ5ICphbGwqIHRoZSBwbGFjZXMgd2l0aGluIHRoZSBrZXJuZWwgdGhhdCBpbnRlcmFjdCB3aXRoIGh1Z2UgcGFnZXMuIFRoZSBpbml0aWFsIHNlYXJjaCB3YXMgYSBnb29kIHN0YXJ0LCBidXQgSSBrbm93IHRoZXJlIGFyZSBsaWtlbHkgbW9yZSBzY2F0dGVyZWQgY2FsbHMuIE15IGluc3RpbmN0IGlzIHRvIHJ1biBhIGBncmVwYCBjb21tYW5kLCBidXQgbm93IEkgbmVlZCB0byBkZXRlcm1pbmUgd2hlcmUgdG8gZm9jdXMgaXQuIE15IGltbWVkaWF0ZSB0aG91Z2h0IGlzIHRvIHRhcmdldCBhIGNvdXBsZSBvZiBrZXkgYXJlYXMuCgpGaXJzdCwgdGhlIGBmcy9wcm9jL2AgZGlyZWN0b3J5IGlzIGEgbGlrZWx5IGNhbmRpZGF0ZSBiZWNhdXNlIHRoZSBwcm9jIGZpbGVzeXN0ZW0gcHJvdmlkZXMgYSB3aW5kb3cgaW50byB2YXJpb3VzIGtlcm5lbCBpbnRlcm5hbHMsIGluY2x1ZGluZyBtZW1vcnkgbWFuYWdlbWVudC4gSXQmIzM5O3MgYSBwcmltZSBzcG90IHRvIGZpbmQgY29kZSB0aGF0IGV4cG9zZXMgb3IgbWFuaXB1bGF0ZXMgaHVnZSBwYWdlIGluZm9ybWF0aW9uLiBTbyB0aGF0IHNob3VsZCBiZSBhIHVzZWZ1bCBzZWFyY2guCgpUaGVuLCB0byBiZSB0aG9yb3VnaCwgSSBzaG91bGQgYWxzbyBsb29rIGF0IHRoZSBpbmNsdWRlIGZpbGVzLiBJdCYjMzk7cyBhbG1vc3QgZ3VhcmFudGVlZCB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgc3RydWN0dXJlcywgYW5kIHJlbGF0ZWQgbWFjcm9zLCBhcmUgaW4gdGhlIGBpbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaGAgaGVhZGVyIGZpbGUuIEJ5IGdyZXBwaW5nIHRoaXMgZmlsZSBJIGNhbiBmaW5kIGFueSBwb3RlbnRpYWwgY2FsbGVycyBkaXJlY3RseSwgaW5jbHVkaW5nIHdpdGhpbiByZWxhdGVkIGhlYWRlciBmaWxlcy4gCgpCeSBjb21iaW5pbmcgdGhlc2UgdHdvIHNlYXJjaGVzLCBJIHNob3VsZCBnZXQgYSBjb21wcmVoZW5zaXZlIHZpZXcgb2YgdGhlIGNvZGViYXNlIGFuZCBpZGVudGlmeSBhbnkgb3Zlcmxvb2tlZCBjYWxscyBvciBwb3RlbnRpYWxseSBvYnNjdXJlIGludGVyYWN0aW9ucy4gSXQgc2hvdWxkIGJlIGEgZ29vZCBzdGFydGluZyBwb2ludCBmb3IgYSBtb3JlIGluLWRlcHRoIGludmVzdGlnYXRpb24uCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTgvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA3IDIxOjU1PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O3RocF92bWFfYWxsb3dhYmxlX29yZGVycyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtmcy9wcm9jL3Rhc2tfbW11LmM9MTQ1OT1zdGF0aWMgaW50IHNob3dfc21hcChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnYpXG4tLVxuZnMvcHJvYy90YXNrX21tdS5jLTE0NzYtXHRzZXFfcHJpbnRmKG0sIFwmIzM0O1RIUGVsaWdpYmxlOiAgICAlOHVcXG5cJiMzNDssXG5mcy9wcm9jL3Rhc2tfbW11LmM6MTQ3NzpcdFx0ICAgISF0aHBfdm1hX2FsbG93YWJsZV9vcmRlcnModm1hLCB2bWEtXHUwMDNldm1fZmxhZ3MsIFRWQV9TTUFQUyxcbmZzL3Byb2MvdGFza19tbXUuYy0xNDc4LVx0XHRcdFx0XHQgICAgICBUSFBfT1JERVJTX0FMTCkpO1xuLS1cbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oPTk3PWVudW0gdHZhX3R5cGUge1xuLS1cbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oLTEwNC0jZGVmaW5lIHRocF92bWFfYWxsb3dhYmxlX29yZGVyKHZtYSwgdm1fZmxhZ3MsIHR5cGUsIG9yZGVyKSBcXFxuaW5jbHVkZS9saW51eC9odWdlX21tLmg6MTA1Olx0KCEhdGhwX3ZtYV9hbGxvd2FibGVfb3JkZXJzKHZtYSwgdm1fZmxhZ3MsIHR5cGUsIEJJVChvcmRlcikpKVxuaW5jbHVkZS9saW51eC9odWdlX21tLmgtMTA2LVxuLS1cbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oPTI3Nj1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgdGhwX3ZtYV9zdWl0YWJsZV9vcmRlcnMoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4tLVxuaW5jbHVkZS9saW51eC9odWdlX21tLmgtMjk4LVxuaW5jbHVkZS9saW51eC9odWdlX21tLmg6Mjk5OnVuc2lnbmVkIGxvbmcgX190aHBfdm1hX2FsbG93YWJsZV9vcmRlcnMoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaC0zMDAtXHRcdFx0XHRcdCB2bV9mbGFnc190IHZtX2ZsYWdzLFxuLS1cbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oLTMwNC0vKipcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oOjMwNTogKiB0aHBfdm1hX2FsbG93YWJsZV9vcmRlcnMgLSBkZXRlcm1pbmUgaHVnZXBhZ2Ugb3JkZXJzIHRoYXQgYXJlIGFsbG93ZWQgZm9yIHZtYVxuaW5jbHVkZS9saW51eC9odWdlX21tLmgtMzA2LSAqIEB2bWE6ICB0aGUgdm0gYXJlYSB0byBjaGVja1xuLS1cbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oPTMxOT1zdGF0aWMgaW5saW5lXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaDozMjA6dW5zaWduZWQgbG9uZyB0aHBfdm1hX2FsbG93YWJsZV9vcmRlcnMoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaC0zMjEtXHRcdFx0XHQgICAgICAgdm1fZmxhZ3NfdCB2bV9mbGFncyxcbi0tXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaC0zNDItXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaDozNDM6XHRyZXR1cm4gX190aHBfdm1hX2FsbG93YWJsZV9vcmRlcnModm1hLCB2bV9mbGFncywgdHlwZSwgb3JkZXJzKTtcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oLTM0NC19XG4tLVxuaW5jbHVkZS9saW51eC9odWdlX21tLmg9NjE5PXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyB0aHBfdm1hX3N1aXRhYmxlX29yZGVycyhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbi0tXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaC02MjQtXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaDo2MjU6c3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHRocF92bWFfYWxsb3dhYmxlX29yZGVycyhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oLTYyNi1cdFx0XHRcdFx0dm1fZmxhZ3NfdCB2bV9mbGFncyxcbi0tXG5tbS9odWdlX21lbW9yeS5jPTE1Mz1zdGF0aWMgYm9vbCB2bWFfZmlsZV9jYW5fbWFwX2h1Z2UoY29uc3Qgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4tLVxubW0vaHVnZV9tZW1vcnkuYy0xNTktXHQgKiBFbmZvcmNlIFRIUCBjb2xsYXBzZSByZXF1aXJlbWVudHMgYXMgbmVjZXNzYXJ5LiBBbm9ueW1vdXMgdm1hc1xubW0vaHVnZV9tZW1vcnkuYzoxNjA6XHQgKiB3ZXJlIGFscmVhZHkgaGFuZGxlZCBpbiB0aHBfdm1hX2FsbG93YWJsZV9vcmRlcnMoKS5cbm1tL2h1Z2VfbWVtb3J5LmMtMTYxLVx0ICovXG4tLVxubW0vaHVnZV9tZW1vcnkuYy0xODEtXG5tbS9odWdlX21lbW9yeS5jOjE4Mjp1bnNpZ25lZCBsb25nIF9fdGhwX3ZtYV9hbGxvd2FibGVfb3JkZXJzKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxubW0vaHVnZV9tZW1vcnkuYy0xODMtXHRcdFx0XHRcdCB2bV9mbGFnc190IHZtX2ZsYWdzLFxuLS1cbm1tL2todWdlcGFnZWQuYz01Njg9c3RhdGljIHVuc2lnbmVkIGxvbmcgY29sbGFwc2VfcG9zc2libGVfb3JkZXJzKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuLS1cbm1tL2todWdlcGFnZWQuYy01NzgtXG5tbS9raHVnZXBhZ2VkLmM6NTc5Olx0cmV0dXJuIHRocF92bWFfYWxsb3dhYmxlX29yZGVycyh2bWEsIHZtX2ZsYWdzLCB0dmFfZmxhZ3MsIG9yZGVycyk7XG5tbS9raHVnZXBhZ2VkLmMtNTgwLX1cbi0tXG5tbS9raHVnZXBhZ2VkLmM9MTA2ND1zdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBodWdlcGFnZV92bWFfcmV2YWxpZGF0ZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBhZGRyZXNzLFxuLS1cbm1tL2todWdlcGFnZWQuYy0xMDg3LVx0XHRyZXR1cm4gU0NBTl9BRERSRVNTX1JBTkdFO1xubW0va2h1Z2VwYWdlZC5jOjEwODg6XHRpZiAoIXRocF92bWFfYWxsb3dhYmxlX29yZGVycyh2bWEsIHZtYS1cdTAwM2V2bV9mbGFncywgdHlwZSwgQklUKG9yZGVyKSkpXG5tbS9raHVnZXBhZ2VkLmMtMTA4OS1cdFx0cmV0dXJuIFNDQU5fVk1BX0NIRUNLO1xuLS1cbm1tL2todWdlcGFnZWQuYy0xMDkzLVx0ICpcbm1tL2todWdlcGFnZWQuYzoxMDk0Olx0ICogdGhwX3ZtYV9hbGxvd2FibGVfb3JkZXJzKCkgbWF5IHJldHVybiB0cnVlIGZvciBxdWFsaWZpZWQgZmlsZVxubW0va2h1Z2VwYWdlZC5jLTEwOTUtXHQgKiB2bWFzLlxuLS1cbm1tL21lbW9yeS5jPTQ3OTU9c3RhdGljIHVuc2lnbmVkIGxvbmcgdGhwX3N3YXBpbl9zdWl0YWJsZV9vcmRlcnMoc3RydWN0IHZtX2ZhdWx0ICp2bWYpXG4tLVxubW0vbWVtb3J5LmMtNDgyNC1cdCAqL1xubW0vbWVtb3J5LmM6NDgyNTpcdG9yZGVycyA9IHRocF92bWFfYWxsb3dhYmxlX29yZGVycyh2bWEsIHZtYS1cdTAwM2V2bV9mbGFncywgVFZBX1BBR0VGQVVMVCxcbm1tL21lbW9yeS5jLTQ4MjYtXHRcdFx0XHRcdCAgQklUKFBNRF9PUkRFUikgLSAxKTtcbi0tXG5tbS9tZW1vcnkuYz01MzAxPXN0YXRpYyBzdHJ1Y3QgZm9saW8gKmFsbG9jX2Fub25fZm9saW8oc3RydWN0IHZtX2ZhdWx0ICp2bWYpXG4tLVxubW0vbWVtb3J5LmMtNTMyMy1cdCAqL1xubW0vbWVtb3J5LmM6NTMyNDpcdG9yZGVycyA9IHRocF92bWFfYWxsb3dhYmxlX29yZGVycyh2bWEsIHZtYS1cdTAwM2V2bV9mbGFncywgVFZBX1BBR0VGQVVMVCxcbm1tL21lbW9yeS5jLTUzMjUtXHRcdFx0XHRcdCAgQklUKFBNRF9PUkRFUikgLSAxKTtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xOS8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDcgMjE6NTU8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMjExMzQKCQkJCQkJCW91dHB1dDogMjMKCQkJCQkJCXRob3VnaHRzOiAzMDYKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqSW52ZXN0aWdhdGluZyBgX190aHBfdm1hX2FsbG93YWJsZV9vcmRlcnNgIGluIHRoZSBIdWdlIFBhZ2VzIFN1YnN5c3RlbSoqCgpPa2F5LCBzbyBJJiMzOTttIGxvb2tpbmcgYXQgYG1tL2h1Z2VfbWVtb3J5LmNgLCBzcGVjaWZpY2FsbHkgYXJvdW5kIHRoZSBUSFAgKFRyYW5zcGFyZW50IEh1Z2UgUGFnZXMpIGNvZGUuIEl0JiMzOTtzIGltbWVkaWF0ZWx5IGludGVyZXN0aW5nIHRoYXQgYF9fdGhwX3ZtYV9hbGxvd2FibGVfb3JkZXJzYCBpc24mIzM5O3Qgc3RhdGljLiBUaGF0IHRlbGxzIG1lIGl0JiMzOTtzIHBvdGVudGlhbGx5IGV4cG9zZWQgb3V0c2lkZSBvZiB0aGF0IGZpbGUsIHdoaWNoIGNvdWxkIGJlIHJlbGV2YW50LiBOb3csIGxldCBtZSBxdWlja2x5IGludmVudG9yeSB0aGUgb3RoZXIgc3RhdGljIGZ1bmN0aW9ucyBpbiBgbW0vaHVnZV9tZW1vcnkuY2AgdG8gZ2V0IHRoZSBjb250ZXh0OiBgdm1hX2ZpbGVfYnlwYXNzX3RocF90dW5lYWJsZXNgLCBgdm1hX2ZpbGVfYWxsb3dfdGhwX3R1bmVhYmxlc2AsIGB2bWFfZmlsZV9jaGVja190aHBfdHVuZWFibGVzYCwgYHZtYV9maWxlX2Nhbl9tYXBfaHVnZWAsIGFuZCBgZmlsZV90aHBfZW5hYmxlZGAuIFRoZXNlIGFsbCBzZWVtIHJlbGF0ZWQgdG8gVk1BIChWaXJ0dWFsIE1lbW9yeSBBcmVhKSBtYW5hZ2VtZW50IGFuZCBmaWxlLWJhY2tlZCBUSFAgY29uZmlndXJhdGlvbiBvciBkZWNpc2lvbnMuCgpOb3csIHdoZXJlIGVsc2UgaXMgdGhpcyBzdHVmZiBnZXR0aW5nIGNhbGxlZCBvciByZWxhdGVkIHRvPyBJIHNob3VsZCBleHBhbmQgdGhlIHNlYXJjaCB0byBmaW5kIGNhbGxlcnMuIFNpbmNlIFRIUCBpcyBvZnRlbiByZWxhdGVkIHRvIHRoZSBiYWNrZ3JvdW5kIGRlZnJhZywgaXQmIzM5O3Mgd29ydGggY2hlY2tpbmcgYGtodWdlcGFnZWQuY2AuIEluIGBraHVnZXBhZ2VkLmNgLCBgY29sbGFwc2VfZmlsZWAsIGBtYWR2aXNlX2NvbGxhcHNlYCwgYGNvbGxhcHNlX3Bvc3NpYmxlX29yZGVyc2AsIGFuZCBgaHVnZXBhZ2Vfdm1hX3JldmFsaWRhdGVgIGFyZSBvYnZpb3VzIHBsYWNlcyB0byBzdGFydC4gSSYjMzk7bSBlc3BlY2lhbGx5IGN1cmlvdXMgYWJvdXQgYG1hZHZpc2VgIHdpdGggYE1BRFZfQ09MTEFQU0VgLiBUaGlzIGlzIHdoZXJlIHVzZXJzcGFjZSBleHBsaWNpdGx5IHJlcXVlc3RzIHBhZ2UgY29sbGFwc2luZy4gVGltZSB0byBzZWUgaG93IHRoYXQgdGllcyBpbnRvIGV2ZXJ5dGhpbmcuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjAvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA3IDIxOjU1PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O1RWQV9GT1JDRURfQ09MTEFQU0UmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7aW5jbHVkZS9saW51eC9odWdlX21tLmg9OTc9ZW51bSB0dmFfdHlwZSB7XG4tLVxuaW5jbHVkZS9saW51eC9odWdlX21tLmgtMTAwLVx0VFZBX0tIVUdFUEFHRUQsXHRcdC8qIEtodWdlcGFnZWQgY29sbGFwc2UuICovXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaDoxMDE6XHRUVkFfRk9SQ0VEX0NPTExBUFNFLFx0LyogRm9yY2VkIGNvbGxhcHNlIChlLmcuIE1BRFZfQ09MTEFQU0UpLiAqL1xuaW5jbHVkZS9saW51eC9odWdlX21tLmgtMTAyLX07XG4tLVxuaW5jbHVkZS9saW51eC9odWdlX21tLmg9MzIwPXVuc2lnbmVkIGxvbmcgdGhwX3ZtYV9hbGxvd2FibGVfb3JkZXJzKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuLS1cbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oLTMyOC1cdCAqL1xuaW5jbHVkZS9saW51eC9odWdlX21tLmg6MzI5Olx0aWYgKHR5cGUgIT0gVFZBX0ZPUkNFRF9DT0xMQVBTRSBcdTAwMjZcdTAwMjYgdm1hX2lzX2Fub255bW91cyh2bWEpKSB7XG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaC0zMzAtXHRcdHVuc2lnbmVkIGxvbmcgbWFzayA9IFJFQURfT05DRShodWdlX2Fub25fb3JkZXJzX2Fsd2F5cyk7XG4tLVxubW0vaHVnZV9tZW1vcnkuYz0xMjE9c3RhdGljIGJvb2wgdm1hX2ZpbGVfYnlwYXNzX3RocF90dW5lYWJsZXMoY29uc3Qgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4tLVxubW0vaHVnZV9tZW1vcnkuYy0xMjYtXHQvKiBNQURWX0NPTExBUFNFIGlnbm9yZXMgdHVuZWFibGVzLiAqL1xubW0vaHVnZV9tZW1vcnkuYzoxMjc6XHRpZiAodHlwZSA9PSBUVkFfRk9SQ0VEX0NPTExBUFNFKVxubW0vaHVnZV9tZW1vcnkuYy0xMjgtXHRcdHJldHVybiB0cnVlO1xuLS1cbm1tL2h1Z2VfbWVtb3J5LmM9MTgyPXVuc2lnbmVkIGxvbmcgX190aHBfdm1hX2FsbG93YWJsZV9vcmRlcnMoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4tLVxubW0vaHVnZV9tZW1vcnkuYy0xODgtXHRjb25zdCBib29sIGluX3BmID0gdHlwZSA9PSBUVkFfUEFHRUZBVUxUO1xubW0vaHVnZV9tZW1vcnkuYzoxODk6XHRjb25zdCBib29sIGZvcmNlZF9jb2xsYXBzZSA9IHR5cGUgPT0gVFZBX0ZPUkNFRF9DT0xMQVBTRTtcbm1tL2h1Z2VfbWVtb3J5LmMtMTkwLVx0dW5zaWduZWQgbG9uZyBzdXBwb3J0ZWRfb3JkZXJzO1xuLS1cbm1tL2todWdlcGFnZWQuYz0xMDY0PXN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IGh1Z2VwYWdlX3ZtYV9yZXZhbGlkYXRlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHJlc3MsXG4tLVxubW0va2h1Z2VwYWdlZC5jLTEwNjktXHRlbnVtIHR2YV90eXBlIHR5cGUgPSBjYy1cdTAwM2Vpc19raHVnZXBhZ2VkID8gVFZBX0tIVUdFUEFHRUQgOlxubW0va2h1Z2VwYWdlZC5jOjEwNzA6XHRcdFx0XHQgVFZBX0ZPUkNFRF9DT0xMQVBTRTtcbm1tL2todWdlcGFnZWQuYy0xMDcxLVxuLS1cbm1tL2todWdlcGFnZWQuYz0xNjAwPXN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IGNvbGxhcHNlX3NjYW5fcG1kKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLFxuLS1cbm1tL2todWdlcGFnZWQuYy0xNjA2LVx0dW5zaWduZWQgaW50IG1heF9wdGVzX25vbmUgPSBjb2xsYXBzZV9tYXhfcHRlc19ub25lKGNjLCB2bWEsIEhQQUdFX1BNRF9PUkRFUik7XG5tbS9raHVnZXBhZ2VkLmM6MTYwNzpcdGVudW0gdHZhX3R5cGUgdHZhX2ZsYWdzID0gY2MtXHUwMDNlaXNfa2h1Z2VwYWdlZCA/IFRWQV9LSFVHRVBBR0VEIDogVFZBX0ZPUkNFRF9DT0xMQVBTRTtcbm1tL2todWdlcGFnZWQuYy0xNjA4LVx0cG1kX3QgKnBtZDtcbi0tXG5tbS9raHVnZXBhZ2VkLmM9MTg1MT1zdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCB0cnlfY29sbGFwc2VfcHRlX21hcHBlZF90aHAoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgYWRkcixcbi0tXG5tbS9raHVnZXBhZ2VkLmMtMTg4Ni1cdCAqL1xubW0va2h1Z2VwYWdlZC5jOjE4ODc6XHRpZiAoIXRocF92bWFfYWxsb3dhYmxlX29yZGVyKHZtYSwgdm1hLVx1MDAzZXZtX2ZsYWdzLCBUVkFfRk9SQ0VEX0NPTExBUFNFLCBQTURfT1JERVIpKVxubW0va2h1Z2VwYWdlZC5jLTE4ODgtXHRcdHJldHVybiBTQ0FOX1ZNQV9DSEVDSztcbi0tXG5tbS9raHVnZXBhZ2VkLmM9MzE4Mj1pbnQgbWFkdmlzZV9jb2xsYXBzZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBzdGFydCxcbi0tXG5tbS9raHVnZXBhZ2VkLmMtMzE5NC1cbm1tL2todWdlcGFnZWQuYzozMTk1Olx0aWYgKCFjb2xsYXBzZV9wb3NzaWJsZSh2bWEsIHZtYS1cdTAwM2V2bV9mbGFncywgVFZBX0ZPUkNFRF9DT0xMQVBTRSkpXG5tbS9raHVnZXBhZ2VkLmMtMzE5Ni1cdFx0cmV0dXJuIC1FSU5WQUw7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjEvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA3IDIxOjU1PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDIyODM3CgkJCQkJCQlvdXRwdXQ6IDE4NgoJCQkJCQkJdGhvdWdodHM6IDYyMAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipNeSBBc3Nlc3NtZW50IG9mIHRoZSBUSFAgQWxsb3dhYmxlIE9yZGVycyBMb2dpYyBDaGFuZ2VzKioKCk9rYXksIGxldCYjMzk7cyBicmVhayB0aGlzIGRvd24uIEkgbmVlZCB0byBnZXQgYSBoYW5kbGUgb24gdGhlIGNoYW5nZXMgdG8gdGhlIFRyYW5zcGFyZW50IEh1Z2UgUGFnZSAoVEhQKSBhbGxvd2FibGUgb3JkZXJzIGxvZ2ljLCBlc3BlY2lhbGx5IGZvciBmaWxlLWJhY2tlZCBWTUFzLiBUaGUgZmlyc3QgdGhpbmdzIEkmIzM5O20gZ29pbmcgdG8gbG9vayBhdCBhcmUgdGhlIGNvcmUgZnVuY3Rpb25zIGluIGBmcy9wcm9jL3Rhc2tfbW11LmNgLCBgbW0va2h1Z2VwYWdlZC5jYCwgYW5kIGBodWdlcGFnZV92bWFfcmV2YWxpZGF0ZWAuIEkmIzM5O2xsIHBheSBjbG9zZSBhdHRlbnRpb24gdG8gdGhlIGBzaG93X3NtYXBgIGluIHRoZSB0YXNrX21tdSBmaWxlLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCB3aGVyZSB0aGUgcmV2YWxpZGF0aW9uIGxvZ2ljIGlzIGxpdmluZy4KCk15IEZvY3VzU3ltYm9scyB3aWxsIGJlOiBgX190aHBfdm1hX2FsbG93YWJsZV9vcmRlcnNgICh0aGF0JiMzOTtzIHRoZSBjb3JlIGNoYW5nZSksIGB2bWFfZmlsZV9jYW5fbWFwX2h1Z2VgLCBhbmQgYHZtYV9maWxlX2J5cGFzc190aHBfdHVuZWFibGVzYCAodGhlIG5ldyBoZWxwZXJzKSwgYW5kIGBtYWR2aXNlX2NvbGxhcHNlYCB0byB1bmRlcnN0YW5kIHRoZSBtYWR2aXNlIHBhdGggZm9yIGZpbGUgY29sbGFwc2VzLiBJdCBzZWVtcyB0aGF0IGB2bWFfZmlsZV9jYW5fbWFwX2h1Z2VgIGFuZCBgdm1hX2ZpbGVfYnlwYXNzX3RocF90dW5lYWJsZXNgIHNob3VsZCBiZSBpbmNsdWRlZCBhcyBGb2N1c1N5bWJvbHMuIFJlbWVtYmVyLCB3ZSBzaG91bGQgaW5jbHVkZSB0aGUgbmV3IGhlbHBlciBmdW5jdGlvbnMsIGV2ZW4gaWYgdGhleSYjMzk7cmUgc3RhdGljIGFuZCBub3QgaW5saW5lZCwgYmVjYXVzZSB0aGV5IHdpbGwgaGF2ZSBzeW1ib2xzIGluIGB2bWxpbnV4YC4KCk5vdywgSSBuZWVkIHRvIGRvdWJsZS1jaGVjayB0aGUgcmVsZXZhbnQgY29uZmlndXJhdGlvbnMuIFRoZSBjcml0aWNhbCBvbmUgaXMgYFRSQU5TUEFSRU5UX0hVR0VQQUdFYC4gSSBzaG91bGQgcHJvYmFibHkgY2hlY2sgYG1tL0tjb25maWdgIGZvciBvdGhlciByZWxldmFudCBjb25maWd1cmF0aW9ucywgYnV0IEkgdGhpbmsgYFRSQU5TUEFSRU5UX0hVR0VQQUdFYCBpcyB0aGUgb25seSBvbmUgSSBuZWVkIHRvIGZvY3VzIG9uLiBJIHNlZSBpdCBkZXBlbmRzIG9uIGBIQVZFX0FSQ0hfVFJBTlNQQVJFTlRfSFVHRVBBR0UgJmFtcDsmYW1wOyAhUFJFRU1QVF9SVGAuIEdvb2QsIG9uIGFtZDY0LCBgSEFWRV9BUkNIX1RSQU5TUEFSRU5UX0hVR0VQQUdFYCBpcyBgeWAsIHNvIGl0IHNob3VsZCBiZSBmaW5lLiBZZXMsIGBDT05GSUdfVFJBTlNQQVJFTlRfSFVHRVBBR0VgIChzdHJpcCBDT05GSUdfIHByZWZpeCAtJmd0OyAmIzM0O1RSQU5TUEFSRU5UX0hVR0VQQUdFJiMzNDspLgoKT2theSwgbGV0JiMzOTtzIGRpZ2VzdCB0aGUgcmVhc29uaW5nIGZvciB0aGUgY2hhbmdlcyBtb3JlIGNhcmVmdWxseS4gVGhlIHBhdGNoIHJlc3RydWN0dXJlcyBUSFAgYWxsb3dhYmxlIG9yZGVycywgaW50cm9kdWNpbmcgc2V2ZXJhbCBuZXcgZnVuY3Rpb25zIGluIGBtbS9odWdlX21lbW9yeS5jYDogYHZtYV9maWxlX2Nhbl9tYXBfaHVnZWAsIGB2bWFfZmlsZV9ieXBhc3NfdGhwX3R1bmVhYmxlc2AsIGB2bWFfZmlsZV9hbGxvd190aHBfdHVuZWFibGVzYCwgYW5kIGB2bWFfZmlsZV9jaGVja190aHBfdHVuZWFibGVzYC4gVGhlc2UgbmV3IGZ1bmN0aW9ucyBldmFsdWF0ZSB0aGUgVEhQIHR1bmVhYmxlcyBhbmQgaHVnZSBmYXVsdCBjYXBhYmlsaXRpZXMgZHVyaW5nIHBhZ2UgZmF1bHRzLCBzbWFwcyBxdWVyaWVzLCBhbmQgZm9yY2VkIGNvbGxhcHNlcyBzdWNoIGFzIHRoZSBgTUFEVl9DT0xMQVBTRWAgb3B0aW9uLiBJdCYjMzk7cyB0b3VjaGluZyBzb21lIHByZXR0eSBsb3ctbGV2ZWwgbWVtb3J5IG1hbmFnZW1lbnQgc3R1ZmYsIHdoaWNoIG1lYW5zIGl04oCZcyBlYXNpbHkgcmVhY2hhYmxlIGFuZCBmdXp6YWJsZSB2aWEgc3RhbmRhcmQgc3lzY2FsbHMgbGlrZSBgbWFkdmlzZWAsIGBtbWFwYCwgcGFnZSBmYXVsdHMsIGFuZCBgL3Byb2MvJmx0O3BpZCZndDsvc21hcHNgLgoKUmlnaHQsIEkgYW0gc2F0aXNmaWVkIHdpdGggdGhpcyBhbmFseXNpcywgSSYjMzk7bGwgY2FsbCBgc2V0LXJlc3VsdHNgIHRvb2wgbm93LgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIyLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNyAyMTo1NjwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnNldC1yZXN1bHRzPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7VFJBTlNQQVJFTlRfSFVHRVBBR0UmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDtfX3RocF92bWFfYWxsb3dhYmxlX29yZGVycyYjMzQ7LAogICAgJiMzNDt2bWFfZmlsZV9jYW5fbWFwX2h1Z2UmIzM0OywKICAgICYjMzQ7dm1hX2ZpbGVfYnlwYXNzX3RocF90dW5lYWJsZXMmIzM0OywKICAgICYjMzQ7bWFkdmlzZV9jb2xsYXBzZSYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCByZWZhY3RvcnMgYW5kIGFsdGVycyBUSFAgKFRyYW5zcGFyZW50IEh1Z2UgUGFnZSkgYWxsb3dhYmxlIG9yZGVycyBjaGVja2luZyBmb3IgZmlsZS1iYWNrZWQgVk1BcyBpbiBtbS9odWdlX21lbW9yeS5jLCBhZGRpbmcgaGVscGVycyBsaWtlIHZtYV9maWxlX2Nhbl9tYXBfaHVnZSBhbmQgdm1hX2ZpbGVfYnlwYXNzX3RocF90dW5lYWJsZXMuIFRoaXMgY29yZSBtZW1vcnkgbWFuYWdlbWVudCBsb2dpYyBpcyByZWFjaGFibGUgdmlhIHN0YW5kYXJkIHN5c2NhbGxzIGFuZCBpbnRlcmZhY2VzIHN1Y2ggYXMgbWFkdmlzZShNQURWX0NPTExBUFNFKSwgcGFnZSBmYXVsdCBoYW5kbGVycywgYW5kIC9wcm9jL3BpZC9zbWFwcy4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7VFJBTlNQQVJFTlRfSFVHRVBBR0UmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDtfX3RocF92bWFfYWxsb3dhYmxlX29yZGVycyYjMzQ7LAogICAgJiMzNDt2bWFfZmlsZV9jYW5fbWFwX2h1Z2UmIzM0OywKICAgICYjMzQ7dm1hX2ZpbGVfYnlwYXNzX3RocF90dW5lYWJsZXMmIzM0OywKICAgICYjMzQ7bWFkdmlzZV9jb2xsYXBzZSYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCByZWZhY3RvcnMgYW5kIGFsdGVycyBUSFAgKFRyYW5zcGFyZW50IEh1Z2UgUGFnZSkgYWxsb3dhYmxlIG9yZGVycyBjaGVja2luZyBmb3IgZmlsZS1iYWNrZWQgVk1BcyBpbiBtbS9odWdlX21lbW9yeS5jLCBhZGRpbmcgaGVscGVycyBsaWtlIHZtYV9maWxlX2Nhbl9tYXBfaHVnZSBhbmQgdm1hX2ZpbGVfYnlwYXNzX3RocF90dW5lYWJsZXMuIFRoaXMgY29yZSBtZW1vcnkgbWFuYWdlbWVudCBsb2dpYyBpcyByZWFjaGFibGUgdmlhIHN0YW5kYXJkIHN5c2NhbGxzIGFuZCBpbnRlcmZhY2VzIHN1Y2ggYXMgbWFkdmlzZShNQURWX0NPTExBUFNFKSwgcGFnZSBmYXVsdCBoYW5kbGVycywgYW5kIC9wcm9jL3BpZC9zbWFwcy4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yMy8xPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDcgMjE6NTY8L3RkPgoJCQk8dGQ+YWN0aW9uPC90ZD4KCQkJPHRkPklmPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI0LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNyAyMTo1NjwvdGQ+CgkJCTx0ZD5hZ2VudDwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5jb3JlPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0tNU0FOUmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIHJlZmFjdG9ycyBUSFAgKFRyYW5zcGFyZW50IEh1Z2UgUGFnZSkgcG9saWN5IGNoZWNrcyBmb3IgZmlsZS1iYWNrZWQgYW5kIHNwZWNpYWwvUEZOTUFQIFZNQXMgaW4gYG1tL2h1Z2VfbWVtb3J5LmNgLiBJdCBicmVha3Mgb3V0IHRoZSBsb2dpYyBmb3IgY2hlY2tpbmcgVEhQIHR1bmFibGVzIGFuZCBodWdlIHBhZ2Ugc3VwcG9ydCBpbnRvIGhlbHBlciBmdW5jdGlvbnMgKGB2bWFfZmlsZV9ieXBhc3NfdGhwX3R1bmVhYmxlc2AsIGB2bWFfZmlsZV9hbGxvd190aHBfdHVuZWFibGVzYCwgYHZtYV9maWxlX2NoZWNrX3RocF90dW5lYWJsZXNgLCBhbmQgYHZtYV9maWxlX2Nhbl9tYXBfaHVnZWApIGFuZCBhbGxvd3MgUEZOTUFQIFZNQXMgd2l0aCBgaHVnZV9mYXVsdGAgaGFuZGxlcnMgdG8gYnlwYXNzIGdsb2JhbCBUSFAgdHVuYWJsZXMuXG5cbk5vbmUgb2YgdGhlIGNoYW5nZXMgdG91Y2ggYnVmZmVyIGNvcGllcyB0byB1c2VyIHNwYWNlLCB1bmluaXRpYWxpemVkIHN0YWNrIG9yIGhlYXAgbWVtb3J5LCBvciBtZW1vcnkgYWxsb2NhdGlvbnMuIEFsbCB2YXJpYWJsZXMgYW5kIHN0cnVjdCBtZW1iZXJzIGV2YWx1YXRlZCAoc3VjaCBhcyBgdm1hLVx1MDAzZXZtX29wc2AsIGB2bV9mbGFnc2AsIGFuZCBgdHlwZWApIGFyZSBmdWxseSBpbml0aWFsaXplZCBhcmd1bWVudHMgb3Igc3RydWN0dXJlIGZpZWxkcy4gUG90ZW50aWFsIGlzc3VlcyBpbiB0aGlzIGNvZGUgcGF0aCAoc3VjaCBhcyBOVUxMIHBvaW50ZXIgZGVyZWZlcmVuY2VzIGlmIGB2bV9vcHNgIHdlcmUgTlVMTCkgYXJlIGRldGVjdGVkIGJ5IHN0YW5kYXJkIGtlcm5lbCBmYXVsdCBoYW5kbGVycyBhbmQgS0FTQU4uIFRoZXJlIGlzIG5vIHJpc2sgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgdXNhZ2Ugb3IgaW5mb3JtYXRpb24gbGVha3MgdGhhdCB3b3VsZCByZXF1aXJlIEtNU0FOLiYjMzQ7LAogICYjMzQ7TmVlZHNLTVNBTiYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5JbnN0cnVjdGlvbjo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBzZWN1cml0eSBlbmdpbmVlciBzcGVjaWFsaXppbmcgaW4ga2VybmVsIG1lbW9yeQplcnJvciBkZXRlY3RvcnMgKEtBU0FOIGFuZCBLTVNBTikuIFlvdXIgam9iIGlzIHRvIHJldmlldyB0aGUgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZApkZXRlcm1pbmUgaWYgdGhlIGNvZGUgY2hhbmdlcyBqdXN0aWZ5IHNwYXduaW5nIGEgZGVkaWNhdGVkIEtNU0FOIChLZXJuZWxNZW1vcnlTYW5pdGl6ZXIpCmZ1enppbmcgc2Vzc2lvbiBpbiBhZGRpdGlvbiB0byBzdGFuZGFyZCBLQVNBTiBmdXp6aW5nLgoKQ1JJVElDQUwgRElTVElOQ1RJT04gQkVUV0VFTiBLQVNBTiBBTkQgS01TQU46Ci0gU3RhbmRhcmQgS0FTQU4ga2VybmVsIGJ1aWxkcyAodXBzdHJlYW0tYXBwYXJtb3Ita2FzYW4uY29uZmlnKSBhbHJlYWR5IGVuYWJsZQogIGEgY29tcHJlaGVuc2l2ZSBzdWl0ZSBvZiBkZWJ1Z2dpbmcgdG9vbHMgYW5kIHNhbml0aXplcnMsIGluY2x1ZGluZyBLQVNBTgogIChvdXQtb2YtYm91bmRzIGFjY2Vzc2VzLCB1c2UtYWZ0ZXItZnJlZSwgZG91YmxlIGZyZWUsIGludmFsaWQgZnJlZSksIExPQ0tERVAKICAobG9ja2luZyBidWdzIGFuZCBkZWFkbG9ja3MpLCBVQi1zYW5pdGl6ZXJzLCBhbmQgbWVtb3J5IGNvcnJ1cHRpb24gY2hlY2tzLgotIEtNU0FOIChLZXJuZWxNZW1vcnlTYW5pdGl6ZXIpIGRldGVjdHMgcmVhZHMgb2YgVU5JTklUSUFMSVpFRCBtZW1vcnkgKHN0YWNrLCBoZWFwLAogIG9yIHBhZ2UgYWxsb2NhdGlvbnMpIGFuZCBrZXJuZWwtdG8tdXNlciBtZW1vcnkgaW5mby1sZWFrcy4KClJ1bGU6IFRIRVJFIElTIE5PIFNFTlNFIElOIFJVTk5JTkcgQSBLTVNBTiBTRVNTSU9OIElGIEEgQlVHIENBTiBCRSBDQVVHSFQgQlkgS0FTQU4sCkxPQ0tERVAsIE9SIE9USEVSIFNUQU5EQVJEIEJVRyBERVRFQ1RPUlMuCkEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpbmN1cnMgc2lnbmlmaWNhbnQgcmVzb3VyY2UgY29zdHMuIFlvdSBtdXN0IE9OTFkKc2V0IE5lZWRzS01TQU49dHJ1ZSBpZiB0aGUgY29kZSBjaGFuZ2VzIGludHJvZHVjZSBvciBleHBvc2UgVU5JTklUSUFMSVpFRCBNRU1PUlkgcmlza3MKdGhhdCBhcmUgZGV0ZWN0ZWQgT05MWSBieSBLTVNBTi4KCkxvb2sgaG9saXN0aWNhbGx5IGF0IHRoZSBwYXRjaCBzZXJpZXMgYW5kIHN1cnJvdW5kaW5nIGNvZGUuIEV2ZW4gaWYgbm8gZGlyZWN0CnVuaW5pdGlhbGl6ZWQgZmllbGQgYWNjZXNzZXMgb3IgbmV3IGJ1ZmZlciBhbGxvY2F0aW9ucyBhcmUgYWRkZWQgaW4gdGhlIGRpZmYgaXRzZWxmLAphIHBhdGNoIG1heSBhbHRlciBjb250cm9sIGZsb3csIGJvdW5kcyBjaGVja2luZywgb3IgZGF0YSBsZW5ndGggY2FsY3VsYXRpb25zIGluIHdheXMKdGhhdCBjaGFuZ2UgaG93IHRoZSByZXN0IG9mIHRoZSBjb2RlIG9wZXJhdGVzIG9uIGV4aXN0aW5nIGJ1ZmZlcnMgKGUuZy4gYWxsb3dpbmcKdW5pbml0aWFsaXplZCBzdGFjay9oZWFwIG1lbW9yeSB0byBiZSByZWFkLCBjb3BpZWQgdG8gdXNlciBzcGFjZSwgb3IgdXNlZCBpbiBjb250cm9sCmZsb3cpLiBEbyBub3QgaGVzaXRhdGUgdG8gdXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gaW5zcGVjdCB0aGUgc3Vycm91bmRpbmcgY29kZSwKY2FsbGVkIGZ1bmN0aW9ucywgYW5kIGNhbGxlcnMuCgpTZXQgTmVlZHNLTVNBTj10cnVlIE9OTFkgSUYgdGhlIHBhdGNoIGludHJvZHVjZXMgb3IgbW9kaWZpZXM6CjEuIEtlcm5lbCBzdHJ1Y3R1cmVzIHNlbnQgdG8gdXNlciBzcGFjZSAodmlhIGNvcHlfdG9fdXNlciwgcHV0X3VzZXIsIG5ldGxpbmsgc2tiCiAgIGF0dHJpYnV0ZXMsIGlvY3RsIG91dHB1dCBhcmd1bWVudHMsIHNvY2tldCBvcHRpb25zLCBvciBCUEYgYnVmZmVycykgd2hlcmUgZmllbGRzCiAgIG9yIHN0cnVjdHVyZSBwYWRkaW5nIG1pZ2h0IG5vdCBiZSBmdWxseSBpbml0aWFsaXplZC96ZXJvZWQuCjIuIENvbmRpdGlvbmFsIGxvZ2ljIG9yIGJyYW5jaGluZyB0aGF0IGRlcGVuZHMgb24gcG90ZW50aWFsbHkgdW5pbml0aWFsaXplZCB2YXJpYWJsZXMKICAgb3Igc3RydWN0IGZpZWxkcy4KMy4gQWxsb2NhdGlvbiBvciBpbml0aWFsaXphdGlvbiBvZiBjb21wbGV4IGRhdGEgc3RydWN0dXJlcyB3aGVyZSB1bmluaXRpYWxpemVkIGZpZWxkcwogICBjb3VsZCBiZSByZWFkIGxhdGVyIGluIHJlYWNoYWJsZSBjb2RlIHBhdGhzLgo0LiBCb3VuZHMgY2hlY2tzLCBsZW5ndGhzLCBvciBsb2dpYyBpbiBhIHdheSB0aGF0IGFsbG93cyBzdXJyb3VuZGluZyBjb2RlIHRvIGFjY2VzcwogICB1bmluaXRpYWxpemVkIGJ5dGVzIG9mIGV4aXN0aW5nIGJ1ZmZlcnMuCgpTZXQgTmVlZHNLTVNBTj1mYWxzZSBJRjoKLSBUaGUgY29kZSBjaGFuZ2VzIHByaW1hcmlseSByaXNrIG91dC1vZi1ib3VuZHMgYWNjZXNzLCBhcnJheSBvdmVyZmxvd3MsIE5VTEwgcG9pbnRlcgogIGRlcmVmZXJlbmNlcywgbG9ja2luZyBkZWFkbG9ja3MsIG9yIHVzZS1hZnRlci1mcmVlIGJ1Z3MgKHRoZXNlIGFyZSBhbHJlYWR5IGNhdWdodAogIGJ5IEtBU0FOLCBMT0NLREVQLCBvciBzdGFuZGFyZCBidWcgZGV0ZWN0b3JzKS4KLSBBbGwgc3RhY2svaGVhcCBzdHJ1Y3R1cmVzIHRvdWNoZWQgb3IgaW50cm9kdWNlZCBieSB0aGUgcGF0Y2ggYXJlIGZ1bGx5IHplcm9lZAogIG9yIGluaXRpYWxpemVkIChlLmcuIHVzaW5nID0gezB9LCBtZW1zZXQsIGt6YWxsb2MpIGJlZm9yZSBiZWluZyByZWFkIG9yIGNvcGllZC4KLSBUaGUgcGF0Y2ggZG9lcyBub3QgaW50cm9kdWNlIGFueSByaXNrIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHVzYWdlIG9yIGluZm8tbGVha3MuCgpVc2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBpbnNwZWN0IHRoZSBzdXJyb3VuZGluZyBjb2RlIGlmIG5lY2Vzc2FyeSwgdGhlbiBwcm92aWRlCmRldGFpbGVkIEtNU0FOUmVhc29uaW5nIGNvbnRyYXN0aW5nIEtBU0FOIHZzIEtNU0FOIGFwcGxpY2FiaWxpdHkgZm9yIHRoaXMgcGF0Y2guClByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLgoKClVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuCkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LgpJZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UHJvbXB0OjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+VGFyZ2V0IGFyY2hpdGVjdHVyZTogYW1kNjQKCkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOgpjb21taXQgNDA3YjhlN2I2ZjhhYTYyOTZiZDk3NGM3ZDkyNmViNzUzOWI3NGNlNgpBdXRob3I6IHN5ei1jbHVzdGVyICZsdDt0cmlhZ2VAc3l6a2FsbGVyLmNvbSZndDsKRGF0ZTogICBNb24gU2VwIDcgMjE6NTU6MTYgMjAyNiAmIzQzOzAwMDAKCiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXcKCmRpZmYgLS1naXQgYS9tbS9odWdlX21lbW9yeS5jIGIvbW0vaHVnZV9tZW1vcnkuYwppbmRleCBhZmJiNTk3NGJkMjI1Li43NWMyMDRhZjQwY2JkIDEwMDY0NAotLS0gYS9tbS9odWdlX21lbW9yeS5jCiYjNDM7JiM0MzsmIzQzOyBiL21tL2h1Z2VfbWVtb3J5LmMKQEAgLTkyLDcgJiM0Mzs5Miw3IEBAIHVuc2lnbmVkIGxvbmcgaHVnZV9hbm9uX29yZGVyc19tYWR2aXNlIF9fcmVhZF9tb3N0bHk7CiB1bnNpZ25lZCBsb25nIGh1Z2VfYW5vbl9vcmRlcnNfaW5oZXJpdCBfX3JlYWRfbW9zdGx5Owogc3RhdGljIGJvb2wgYW5vbl9vcmRlcnNfY29uZmlndXJlZCBfX2luaXRkYXRhOwogCi1zdGF0aWMgaW5saW5lIGJvb2wgZmlsZV90aHBfZW5hYmxlZChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKJiM0MztzdGF0aWMgaW5saW5lIGJvb2wgZmlsZV90aHBfZW5hYmxlZChjb25zdCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKIHsKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlOwogCkBAIC0xMTgsNiAmIzQzOzExOCw2NyBAQCBzdGF0aWMgYm9vbCB2bWFfaXNfc3BlY2lhbF9odWdlKGNvbnN0IHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQogCXJldHVybiB2bWFfdGVzdF9hbnkodm1hLCBWTUFfUEZOTUFQX0JJVCwgVk1BX01JWEVETUFQX0JJVCk7CiB9CiAKJiM0MztzdGF0aWMgYm9vbCB2bWFfZmlsZV9ieXBhc3NfdGhwX3R1bmVhYmxlcyhjb25zdCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKJiM0MzsJCWVudW0gdHZhX3R5cGUgdHlwZSkKJiM0Mzt7CiYjNDM7CWNvbnN0IGJvb2wgaGFzX2h1Z2VfZmF1bHQgPSB2bWEtJmd0O3ZtX29wcy0mZ3Q7aHVnZV9mYXVsdDsKJiM0MzsKJiM0MzsJLyogTUFEVl9DT0xMQVBTRSBpZ25vcmVzIHR1bmVhYmxlcy4gKi8KJiM0MzsJaWYgKHR5cGUgPT0gVFZBX0ZPUkNFRF9DT0xMQVBTRSkKJiM0MzsJCXJldHVybiB0cnVlOwomIzQzOwkvKiBIdWdlIFBGTiBtYXBwaW5ncyBhcmUgdW5jb21wYWN0YWJsZSBzbyB0aGUgcG9saWN5IGRvZXNuJiMzOTt0IGFwcGx5LiAqLwomIzQzOwlpZiAodm1hX3Rlc3Qodm1hLCBWTUFfUEZOTUFQX0JJVCkgJmFtcDsmYW1wOyBoYXNfaHVnZV9mYXVsdCkKJiM0MzsJCXJldHVybiB0cnVlOwomIzQzOwlyZXR1cm4gZmFsc2U7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBib29sIHZtYV9maWxlX2FsbG93X3RocF90dW5lYWJsZXModm1fZmxhZ3NfdCB2bV9mbGFncykKJiM0Mzt7CiYjNDM7CS8qIFRIUD1hbHdheXM/ICovCiYjNDM7CWlmIChodWdlcGFnZV9nbG9iYWxfYWx3YXlzKCkpCiYjNDM7CQlyZXR1cm4gdHJ1ZTsKJiM0MzsJLyogVEhQPW1hZHZpc2UgYW5kIG1hcmtlZCBNQURWX0hVR0VQQUdFPyAqLwomIzQzOwlpZiAoaHVnZXBhZ2VfZ2xvYmFsX2VuYWJsZWQoKSAmYW1wOyZhbXA7ICh2bV9mbGFncyAmYW1wOyBWTV9IVUdFUEFHRSkpCiYjNDM7CQlyZXR1cm4gdHJ1ZTsKJiM0MzsJcmV0dXJuIGZhbHNlOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgYm9vbCB2bWFfZmlsZV9jaGVja190aHBfdHVuZWFibGVzKGNvbnN0IHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAomIzQzOwkJdm1fZmxhZ3NfdCB2bV9mbGFncywgZW51bSB0dmFfdHlwZSB0eXBlKQomIzQzO3sKJiM0MzsJcmV0dXJuIHZtYV9maWxlX2J5cGFzc190aHBfdHVuZWFibGVzKHZtYSwgdHlwZSkgfHwKJiM0MzsJCXZtYV9maWxlX2FsbG93X3RocF90dW5lYWJsZXModm1fZmxhZ3MpOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgYm9vbCB2bWFfZmlsZV9jYW5fbWFwX2h1Z2UoY29uc3Qgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCiYjNDM7CQl2bV9mbGFnc190IHZtX2ZsYWdzLCBlbnVtIHR2YV90eXBlIHR5cGUpCiYjNDM7ewomIzQzOwljb25zdCBib29sIGhhc19odWdlX2ZhdWx0ID0gdm1hLSZndDt2bV9vcHMtJmd0O2h1Z2VfZmF1bHQ7CiYjNDM7CiYjNDM7CS8qCiYjNDM7CSAqIEVuZm9yY2UgVEhQIGNvbGxhcHNlIHJlcXVpcmVtZW50cyBhcyBuZWNlc3NhcnkuIEFub255bW91cyB2bWFzCiYjNDM7CSAqIHdlcmUgYWxyZWFkeSBoYW5kbGVkIGluIHRocF92bWFfYWxsb3dhYmxlX29yZGVycygpLgomIzQzOwkgKi8KJiM0MzsJaWYgKCF2bWFfZmlsZV9jaGVja190aHBfdHVuZWFibGVzKHZtYSwgdm1fZmxhZ3MsIHR5cGUpKQomIzQzOwkJcmV0dXJuIGZhbHNlOwomIzQzOwomIzQzOwlzd2l0Y2ggKHR5cGUpIHsKJiM0MzsJY2FzZSBUVkFfUEFHRUZBVUxUOgomIzQzOwkJLyoKJiM0MzsJCSAqIFRydXN0IHRoYXQgLSZndDtodWdlX2ZhdWx0KCkgaGFuZGxlcnMga25vdyB3aGF0IHRoZXkgYXJlIGRvaW5nCiYjNDM7CQkgKiBpbiBmYXVsdCBwYXRoLgomIzQzOwkJICovCiYjNDM7CQlyZXR1cm4gaGFzX2h1Z2VfZmF1bHQ7CiYjNDM7CWNhc2UgVFZBX1NNQVBTOgomIzQzOwkJaWYgKGhhc19odWdlX2ZhdWx0KQomIzQzOwkJCXJldHVybiB0cnVlOwomIzQzOwkJZmFsbHRocm91Z2g7CiYjNDM7CWRlZmF1bHQ6CiYjNDM7CQkvKiBPbmx5IHJlZ3VsYXIgZmlsZSBpcyB2YWxpZCBpbiBjb2xsYXBzZSBwYXRoLiAqLwomIzQzOwkJcmV0dXJuIGZpbGVfdGhwX2VuYWJsZWQodm1hKTsKJiM0MzsJfQomIzQzO30KJiM0MzsKIHVuc2lnbmVkIGxvbmcgX190aHBfdm1hX2FsbG93YWJsZV9vcmRlcnMoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCiAJCQkJCSB2bV9mbGFnc190IHZtX2ZsYWdzLAogCQkJCQkgZW51bSB0dmFfdHlwZSB0eXBlLApAQCAtMTkwLDI3ICYjNDM7MjUxLDggQEAgdW5zaWduZWQgbG9uZyBfX3RocF92bWFfYWxsb3dhYmxlX29yZGVycyhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKIAkJCQkJCSAgIHZtYSwgdm1hX3N0YXJ0X3Bnb2ZmKHZtYSksIDAsCiAJCQkJCQkgICBmb3JjZWRfY29sbGFwc2UpOwogCi0JaWYgKCF2bWFfaXNfYW5vbnltb3VzKHZtYSkpIHsKLQkJLyoKLQkJICogRW5mb3JjZSBUSFAgY29sbGFwc2UgcmVxdWlyZW1lbnRzIGFzIG5lY2Vzc2FyeS4gQW5vbnltb3VzIHZtYXMKLQkJICogd2VyZSBhbHJlYWR5IGhhbmRsZWQgaW4gdGhwX3ZtYV9hbGxvd2FibGVfb3JkZXJzKCkuCi0JCSAqLwotCQlpZiAoIWZvcmNlZF9jb2xsYXBzZSAmYW1wOyZhbXA7Ci0JCSAgICAoIWh1Z2VwYWdlX2dsb2JhbF9lbmFibGVkKCkgfHwgKCEodm1fZmxhZ3MgJmFtcDsgVk1fSFVHRVBBR0UpICZhbXA7JmFtcDsKLQkJCQkJCSAgICAhaHVnZXBhZ2VfZ2xvYmFsX2Fsd2F5cygpKSkpCi0JCQlyZXR1cm4gMDsKLQotCQkvKgotCQkgKiBUcnVzdCB0aGF0IC0mZ3Q7aHVnZV9mYXVsdCgpIGhhbmRsZXJzIGtub3cgd2hhdCB0aGV5IGFyZSBkb2luZwotCQkgKiBpbiBmYXVsdCBwYXRoLgotCQkgKi8KLQkJaWYgKCgoaW5fcGYgfHwgc21hcHMpKSAmYW1wOyZhbXA7IHZtYS0mZ3Q7dm1fb3BzLSZndDtodWdlX2ZhdWx0KQotCQkJcmV0dXJuIG9yZGVyczsKLQkJLyogT25seSByZWd1bGFyIGZpbGUgaXMgdmFsaWQgaW4gY29sbGFwc2UgcGF0aCAqLwotCQlpZiAoKCghaW5fcGYgfHwgc21hcHMpKSAmYW1wOyZhbXA7IGZpbGVfdGhwX2VuYWJsZWQodm1hKSkKLQkJCXJldHVybiBvcmRlcnM7Ci0JCXJldHVybiAwOwotCX0KJiM0MzsJaWYgKCF2bWFfaXNfYW5vbnltb3VzKHZtYSkpCiYjNDM7CQlyZXR1cm4gdm1hX2ZpbGVfY2FuX21hcF9odWdlKHZtYSwgdm1fZmxhZ3MsIHR5cGUpID8gb3JkZXJzIDogMDsKIAogCWlmICh2bWFfaXNfdGVtcG9yYXJ5X3N0YWNrKHZtYSkpCiAJCXJldHVybiAwOwo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yNS8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDcgMjE6NTY8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMzIxOAoJCQkJCQkJb3V0cHV0OiAzOAoJCQkJCQkJdGhvdWdodHM6IDQ1OAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgdGhlIEh1Z2UgTWVtb3J5IFBhdGNoIGZvciBVbmluaXRpYWxpemVkIE1lbW9yeSBSaXNrcyoqCgpPa2F5LCBsZXQmIzM5O3MgZGl2ZSBpbnRvIHRoaXMgcGF0Y2guIE15IGltbWVkaWF0ZSBnb2FsIGlzIHRvIGRldGVybWluZSBpZiBpdCBpbnRyb2R1Y2VzIGFueSBuZXcgb3Bwb3J0dW5pdGllcyBmb3IgdW5pbml0aWFsaXplZCBtZW1vcnkgZXhwb3N1cmUgdGhhdCBtaWdodCB3YXJyYW50IEtNU0FOIHNjcnV0aW55LiBJJiMzOTtsbCBzdGFydCBieSByZWFkaW5nIHRocm91Z2ggdGhlIGNoYW5nZXMgaW4gYG1tL2h1Z2VfbWVtb3J5LmNgLiBJdCBsb29rcyBsaWtlIHdlIGhhdmUgYSBzZXQgb2YgZnVuY3Rpb24gbW9kaWZpY2F0aW9ucy4KCkZpcnN0LCBJIHNlZSBhIGBjb25zdGAgcXVhbGlmaWVyIGFkZGVkIHRvIGBmaWxlX3RocF9lbmFibGVkYCwgYSBnb29kIHByYWN0aWNlIGZvciBlbnN1cmluZyBkYXRhIGludGVncml0eSwgdGhvdWdoIGxpa2VseSBub3QgS01TQU4gcmVsZXZhbnQuIFRoZW4gdGhlcmUgYXJlIGEgZmV3IG5ldyBib29sZWFuIGZ1bmN0aW9uczogYHZtYV9maWxlX2J5cGFzc190aHBfdHVuZWFibGVzYCwgYHZtYV9maWxlX2FsbG93X3RocF90dW5lYWJsZXNgLCBgdm1hX2ZpbGVfY2hlY2tfdGhwX3R1bmVhYmxlc2AsIGFuZCBgdm1hX2ZpbGVfY2FuX21hcF9odWdlYC4gVGhleSBzZWVtIHRvIGRlYWwgd2l0aCB0aGUgdHVuYWJpbGl0eSBhbmQgZW5hYmxpbmcvZGlzYWJsaW5nIG9mIFRyYW5zcGFyZW50IEh1Z2UgUGFnZXMgKFRIUCkgZm9yIGZpbGUtYmFja2VkIFZNQXMsIGJhc2VkIG9uIHZhcmlvdXMgY29uZGl0aW9ucyBhbmQgZmxhZ3MuIEZpbmFsbHksIGBfX3RocF92bWFfYWxsb3dhYmxlX29yZGVyc2AgaXMgcmVmYWN0b3JlZCB0byB1c2UgYHZtYV9maWxlX2Nhbl9tYXBfaHVnZWAuCgpOb3csIHRoZSBjcml0aWNhbCBwYXJ0LiBNeSByYWRhciBpcyB1cCBmb3Igd2hlcmUgdW5pbml0aWFsaXplZCBkYXRhIGNvdWxkIGJlY29tZSBhIHByb2JsZW0uIEkmIzM5O2xsIG5lZWQgdG8gZ28gYmV5b25kIGEgc3VwZXJmaWNpYWwgcmVhZCBhbmQgc2VlIGhvdyB0aGVzZSBuZXcgZnVuY3Rpb25zIGFyZSB1c2VkLCBhbmQgaG93IGV4aXN0aW5nIGRhdGEgZmxvd3MgYXJlIG1vZGlmaWVkLiBJIHdpbGwgcHJvYmFibHkgbmVlZCB0byBkaWcgaW50byBgbW0vaHVnZV9tZW1vcnkuY2AgZGlyZWN0bHksIGxpa2VseSB1c2luZyBgcmVhZC1maWxlYCBvciBgZ3JlcHBlcmAgdG8gdW5kZXJzdGFuZCBhbGwgdGhlIGRhdGEgc3RydWN0dXJlcyBhbmQgY29udHJvbCBmbG93LCBwYXJ0aWN1bGFybHkgZm9jdXNpbmcgb24gYW55IHBvdGVudGlhbCBkYXRhIHJhY2VzLiBJIHdhbnQgdG8gc2VlIGlmIGFueSBvZiB0aGVzZSBuZXcgZnVuY3Rpb25zLCBlc3BlY2lhbGx5IGB2bWFfZmlsZV9jYW5fbWFwX2h1Z2VgIGFuZCBob3cgaXQgaXMgdXNlZCBpbiBgX190aHBfdm1hX2FsbG93YWJsZV9vcmRlcnNgLCBpbnRyb2R1Y2UgcGF0aHMgd2hlcmUgZGF0YSBtaWdodCBiZSByZWFkIGJlZm9yZSBiZWluZyBpbml0aWFsaXplZC4gSSB3aWxsIGFsc28gYmUgbG9va2luZyB0byBzZWUgaWYgdGhlcmUgaXMgYW55IG1lbW9yeSBhbGxvY2F0aW9uIHRoYXQgY291bGQgYmUgZXhwb3NlZC4gVGhlIGRldmlsIGlzIGFsd2F5cyBpbiB0aGUgZGV0YWlscyEKCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yNi8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDcgMjE6NTY8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7X190aHBfdm1hX2FsbG93YWJsZV9vcmRlcnMmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDttbS9odWdlX21lbW9yeS5jJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O21tL2h1Z2VfbWVtb3J5LmM9MTUzPXN0YXRpYyBib29sIHZtYV9maWxlX2Nhbl9tYXBfaHVnZShjb25zdCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbi0tXG5tbS9odWdlX21lbW9yeS5jLTE4MS1cbm1tL2h1Z2VfbWVtb3J5LmM6MTgyOnVuc2lnbmVkIGxvbmcgX190aHBfdm1hX2FsbG93YWJsZV9vcmRlcnMoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG5tbS9odWdlX21lbW9yeS5jLTE4My1cdFx0XHRcdFx0IHZtX2ZsYWdzX3Qgdm1fZmxhZ3MsXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjcvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA3IDIxOjU2PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDQyNTkKCQkJCQkJCW91dHB1dDogMzUKCQkJCQkJCXRob3VnaHRzOiAzMwoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgbGV0JiMzOTtzIGRpdmUgaW50byB0aGlzLiBIZXJlJiMzOTtzIGhvdyBJJiMzOTtkIGFwcHJvYWNoIHRoaXMgdGFzaywgYXMgaWYgdGhlc2Ugd2VyZSBteSBpbnRlcm5hbCB0aG91Z2h0czoKCioqQW5hbHl6aW5nIGBfX3RocF92bWFfYWxsb3dhYmxlX29yZGVyc2AgYW5kIGB2bWFfZmlsZV9jYW5fbWFwX2h1Z2VgKioKClJpZ2h0LCBsZXQmIzM5O3MgZ2V0IGRvd24gdG8gdGhlIG5pdHR5LWdyaXR0eS4gTXkgZXhwZXJ0aXNlIHRlbGxzIG1lIHRoZXNlIGFyZSBsaWtlbHkga2V5IGZ1bmN0aW9ucyBkZWFsaW5nIHdpdGggVHJhbnNwYXJlbnQgSHVnZSBQYWdlcyAoVEhQKSBhbmQgdGhlaXIgaW50ZXJhY3Rpb24gd2l0aCBWaXJ0dWFsIE1lbW9yeSBBcmVhcyAoVk1Bcykgd2hlbiBtYXBwaW5nIGZpbGVzLiBHaXZlbiB0aGUgbmFtaW5nIGNvbnZlbnRpb25zLCBgX190aHBfdm1hX2FsbG93YWJsZV9vcmRlcnNgIHN1Z2dlc3RzIGl0JiMzOTtzIGNoZWNraW5nIHRoZSBsZWdhbGl0eSBvciBwZXJtaXNzaWJpbGl0eSBvZiB1c2luZyBUSFBzIHdpdGhpbiBhIFZNQSwgcG90ZW50aWFsbHkgcmVnYXJkaW5nIG9yZGVyIChpLmUuIHNpemUpIGNvbnN0cmFpbnRzLiBUaGUgZG91YmxlIHVuZGVyc2NvcmUgcHJlZml4IHVzdWFsbHkgbWVhbnMgdGhpcyBpcyBhbiBpbnRlcm5hbCBmdW5jdGlvbiwgbm90IG1lYW50IHRvIGJlIGNhbGxlZCBkaXJlY3RseS4gYHZtYV9maWxlX2Nhbl9tYXBfaHVnZWAsIG9uIHRoZSBvdGhlciBoYW5kLCBoaW50cyBhdCBhIGJyb2FkZXIgY2hlY2suIFRoaXMgc291bmRzIGxpa2UgYSBmdW5jdGlvbiB0byBkZXRlcm1pbmUgaWYgYSBzcGVjaWZpYyBmaWxlIGNhbiBiZSBtYXBwZWQgd2l0aCBodWdlIHBhZ2VzLCBwb3RlbnRpYWxseSBlbmNvbXBhc3NpbmcgYnJvYWRlciBjb25zaWRlcmF0aW9ucyB0aGFuIGp1c3QgVk1BLXNwZWNpZmljIG9yZGVycy4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgd2hhdCBmYWN0b3JzIGFyZSBjb25zaWRlcmVkIGhlcmUuIEkgbmVlZCB0byBleGFtaW5lIHRoZSBzdXJyb3VuZGluZyBjb2RlIHRvIGRldGVybWluZSBob3cgYF9fdGhwX3ZtYV9hbGxvd2FibGVfb3JkZXJzYCBpcyB1c2VkLCBhbmQgbW9yZSBpbXBvcnRhbnRseSwgKndoeSouIElzIGl0IGEgaGFyZCBsaW1pdD8gRG9lcyBpdCBjb25zaWRlciBOVU1BIG5vZGVzPyBXaGF0IGNyaXRlcmlhIGRvZXMgaXQgYXBwbHk/IFNpbWlsYXJseSwgd2hhdCBjaGVja3MgZG9lcyBgdm1hX2ZpbGVfY2FuX21hcF9odWdlYCBwZXJmb3JtPyBBcmUgd2UgdGFsa2luZyBhYm91dCB0aGUgZmlsZSYjMzk7cyBpbm9kZSBmbGFncywgb3IgdGhlIHVuZGVybHlpbmcgZmlsZXN5c3RlbSYjMzk7cyBjYXBhYmlsaXRpZXM/IFRoaXMgc291bmRzIGxpa2UgcG90ZW50aWFsbHkgdmVyeSBpbnRlcmVzdGluZyBjb2RlIHRvIGFuYWx5emUuIEkmIzM5O20ga2VlbiB0byB1bmRlcnN0YW5kIHRoZSBpbnRlcmRlcGVuZGVuY2llcyBiZXR3ZWVuIHRoZXNlIHR3byBmdW5jdGlvbnMgaW4gcmVsYXRpb24gdG8gVEhQIGVuYWJsZW1lbnQgYW5kIGZpbGUgbWFwcGluZy4gTGV0JiMzOTtzIHNlZSBob3cgdGhlc2UgZnVuY3Rpb24gY2FsbHMgd2VhdmUgdG9nZXRoZXIgd2l0aGluIHRoZSBtZW1vcnkgbWFuYWdlbWVudCBzdWJzeXN0ZW0uCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjgvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA3IDIxOjU2PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7bW0vaHVnZV9tZW1vcnkuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDEyMCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiA4MAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgMTIwOlx0XG4gMTIxOlx0c3RhdGljIGJvb2wgdm1hX2ZpbGVfYnlwYXNzX3RocF90dW5lYWJsZXMoY29uc3Qgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4gMTIyOlx0XHRcdGVudW0gdHZhX3R5cGUgdHlwZSlcbiAxMjM6XHR7XG4gMTI0Olx0XHRjb25zdCBib29sIGhhc19odWdlX2ZhdWx0ID0gdm1hLVx1MDAzZXZtX29wcy1cdTAwM2VodWdlX2ZhdWx0O1xuIDEyNTpcdFxuIDEyNjpcdFx0LyogTUFEVl9DT0xMQVBTRSBpZ25vcmVzIHR1bmVhYmxlcy4gKi9cbiAxMjc6XHRcdGlmICh0eXBlID09IFRWQV9GT1JDRURfQ09MTEFQU0UpXG4gMTI4Olx0XHRcdHJldHVybiB0cnVlO1xuIDEyOTpcdFx0LyogSHVnZSBQRk4gbWFwcGluZ3MgYXJlIHVuY29tcGFjdGFibGUgc28gdGhlIHBvbGljeSBkb2VzbiYjMzk7dCBhcHBseS4gKi9cbiAxMzA6XHRcdGlmICh2bWFfdGVzdCh2bWEsIFZNQV9QRk5NQVBfQklUKSBcdTAwMjZcdTAwMjYgaGFzX2h1Z2VfZmF1bHQpXG4gMTMxOlx0XHRcdHJldHVybiB0cnVlO1xuIDEzMjpcdFx0cmV0dXJuIGZhbHNlO1xuIDEzMzpcdH1cbiAxMzQ6XHRcbiAxMzU6XHRzdGF0aWMgYm9vbCB2bWFfZmlsZV9hbGxvd190aHBfdHVuZWFibGVzKHZtX2ZsYWdzX3Qgdm1fZmxhZ3MpXG4gMTM2Olx0e1xuIDEzNzpcdFx0LyogVEhQPWFsd2F5cz8gKi9cbiAxMzg6XHRcdGlmIChodWdlcGFnZV9nbG9iYWxfYWx3YXlzKCkpXG4gMTM5Olx0XHRcdHJldHVybiB0cnVlO1xuIDE0MDpcdFx0LyogVEhQPW1hZHZpc2UgYW5kIG1hcmtlZCBNQURWX0hVR0VQQUdFPyAqL1xuIDE0MTpcdFx0aWYgKGh1Z2VwYWdlX2dsb2JhbF9lbmFibGVkKCkgXHUwMDI2XHUwMDI2ICh2bV9mbGFncyBcdTAwMjYgVk1fSFVHRVBBR0UpKVxuIDE0MjpcdFx0XHRyZXR1cm4gdHJ1ZTtcbiAxNDM6XHRcdHJldHVybiBmYWxzZTtcbiAxNDQ6XHR9XG4gMTQ1Olx0XG4gMTQ2Olx0c3RhdGljIGJvb2wgdm1hX2ZpbGVfY2hlY2tfdGhwX3R1bmVhYmxlcyhjb25zdCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbiAxNDc6XHRcdFx0dm1fZmxhZ3NfdCB2bV9mbGFncywgZW51bSB0dmFfdHlwZSB0eXBlKVxuIDE0ODpcdHtcbiAxNDk6XHRcdHJldHVybiB2bWFfZmlsZV9ieXBhc3NfdGhwX3R1bmVhYmxlcyh2bWEsIHR5cGUpIHx8XG4gMTUwOlx0XHRcdHZtYV9maWxlX2FsbG93X3RocF90dW5lYWJsZXModm1fZmxhZ3MpO1xuIDE1MTpcdH1cbiAxNTI6XHRcbiAxNTM6XHRzdGF0aWMgYm9vbCB2bWFfZmlsZV9jYW5fbWFwX2h1Z2UoY29uc3Qgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4gMTU0Olx0XHRcdHZtX2ZsYWdzX3Qgdm1fZmxhZ3MsIGVudW0gdHZhX3R5cGUgdHlwZSlcbiAxNTU6XHR7XG4gMTU2Olx0XHRjb25zdCBib29sIGhhc19odWdlX2ZhdWx0ID0gdm1hLVx1MDAzZXZtX29wcy1cdTAwM2VodWdlX2ZhdWx0O1xuIDE1NzpcdFxuIDE1ODpcdFx0LypcbiAxNTk6XHRcdCAqIEVuZm9yY2UgVEhQIGNvbGxhcHNlIHJlcXVpcmVtZW50cyBhcyBuZWNlc3NhcnkuIEFub255bW91cyB2bWFzXG4gMTYwOlx0XHQgKiB3ZXJlIGFscmVhZHkgaGFuZGxlZCBpbiB0aHBfdm1hX2FsbG93YWJsZV9vcmRlcnMoKS5cbiAxNjE6XHRcdCAqL1xuIDE2MjpcdFx0aWYgKCF2bWFfZmlsZV9jaGVja190aHBfdHVuZWFibGVzKHZtYSwgdm1fZmxhZ3MsIHR5cGUpKVxuIDE2MzpcdFx0XHRyZXR1cm4gZmFsc2U7XG4gMTY0Olx0XG4gMTY1Olx0XHRzd2l0Y2ggKHR5cGUpIHtcbiAxNjY6XHRcdGNhc2UgVFZBX1BBR0VGQVVMVDpcbiAxNjc6XHRcdFx0LypcbiAxNjg6XHRcdFx0ICogVHJ1c3QgdGhhdCAtXHUwMDNlaHVnZV9mYXVsdCgpIGhhbmRsZXJzIGtub3cgd2hhdCB0aGV5IGFyZSBkb2luZ1xuIDE2OTpcdFx0XHQgKiBpbiBmYXVsdCBwYXRoLlxuIDE3MDpcdFx0XHQgKi9cbiAxNzE6XHRcdFx0cmV0dXJuIGhhc19odWdlX2ZhdWx0O1xuIDE3MjpcdFx0Y2FzZSBUVkFfU01BUFM6XG4gMTczOlx0XHRcdGlmIChoYXNfaHVnZV9mYXVsdClcbiAxNzQ6XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcbiAxNzU6XHRcdFx0ZmFsbHRocm91Z2g7XG4gMTc2Olx0XHRkZWZhdWx0OlxuIDE3NzpcdFx0XHQvKiBPbmx5IHJlZ3VsYXIgZmlsZSBpcyB2YWxpZCBpbiBjb2xsYXBzZSBwYXRoLiAqL1xuIDE3ODpcdFx0XHRyZXR1cm4gZmlsZV90aHBfZW5hYmxlZCh2bWEpO1xuIDE3OTpcdFx0fVxuIDE4MDpcdH1cbiAxODE6XHRcbiAxODI6XHR1bnNpZ25lZCBsb25nIF9fdGhwX3ZtYV9hbGxvd2FibGVfb3JkZXJzKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuIDE4MzpcdFx0XHRcdFx0XHQgdm1fZmxhZ3NfdCB2bV9mbGFncyxcbiAxODQ6XHRcdFx0XHRcdFx0IGVudW0gdHZhX3R5cGUgdHlwZSxcbiAxODU6XHRcdFx0XHRcdFx0IHVuc2lnbmVkIGxvbmcgb3JkZXJzKVxuIDE4NjpcdHtcbiAxODc6XHRcdGNvbnN0IGJvb2wgc21hcHMgPSB0eXBlID09IFRWQV9TTUFQUztcbiAxODg6XHRcdGNvbnN0IGJvb2wgaW5fcGYgPSB0eXBlID09IFRWQV9QQUdFRkFVTFQ7XG4gMTg5Olx0XHRjb25zdCBib29sIGZvcmNlZF9jb2xsYXBzZSA9IHR5cGUgPT0gVFZBX0ZPUkNFRF9DT0xMQVBTRTtcbiAxOTA6XHRcdHVuc2lnbmVkIGxvbmcgc3VwcG9ydGVkX29yZGVycztcbiAxOTE6XHRcbiAxOTI6XHRcdC8qIENoZWNrIHRoZSBpbnRlcnNlY3Rpb24gb2YgcmVxdWVzdGVkIGFuZCBzdXBwb3J0ZWQgb3JkZXJzLiAqL1xuIDE5MzpcdFx0aWYgKHZtYV9pc19hbm9ueW1vdXModm1hKSlcbiAxOTQ6XHRcdFx0c3VwcG9ydGVkX29yZGVycyA9IFRIUF9PUkRFUlNfQUxMX0FOT047XG4gMTk1Olx0XHRlbHNlIGlmICh2bWFfaXNfZGF4KHZtYSkgfHwgdm1hX2lzX3NwZWNpYWxfaHVnZSh2bWEpKVxuIDE5NjpcdFx0XHRzdXBwb3J0ZWRfb3JkZXJzID0gVEhQX09SREVSU19BTExfU1BFQ0lBTF9EQVg7XG4gMTk3Olx0XHRlbHNlXG4gMTk4Olx0XHRcdHN1cHBvcnRlZF9vcmRlcnMgPSBUSFBfT1JERVJTX0FMTF9GSUxFX0RFRkFVTFQ7XG4gMTk5Olx0XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjkvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA3IDIxOjU2PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDU5NzIKCQkJCQkJCW91dHB1dDogMzUKCQkJCQkJCXRob3VnaHRzOiA0MQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBteSB0YWtlIG9uIHRoZSB0aG91Z2h0IHByb2Nlc3MsIGFzIHJlcXVlc3RlZDoKCioqRGl2aW5nIGludG8gYF9fdGhwX3ZtYV9hbGxvd2FibGVfb3JkZXJzYCBpbiBgbW0vaHVnZV9tZW1vcnkuY2AqKgoKT2theSwgc28gSSBuZWVkIHRvIGdldCBhIGJldHRlciBncmFzcCBvZiB0aGUgbG9naWMgd2l0aGluIGBfX3RocF92bWFfYWxsb3dhYmxlX29yZGVyc2AuIEkmIzM5O3ZlIGJlZW4gd29ya2luZyB3aXRoIGh1Z2UgcGFnZXMgbGF0ZWx5LCBhbmQgSSB3YW50IHRvIHJlYWxseSB1bmRlcnN0YW5kIHRoZSBjb25kaXRpb25zIHRoYXQgZ292ZXJuIHdoZXRoZXIgb3Igbm90IGEgc3BlY2lmaWMgVk1BIGNhbiBhY3R1YWxseSAqdXNlKiB0aGVtLiBJdCYjMzk7cyBhIGNyaXRpY2FsIGZ1bmN0aW9uLCBkZXRlcm1pbmluZyB0aGUgc2l6aW5nIG9mIFRIUHMgYXZhaWxhYmxlIHRvIHRoZSBWTUEuCgpJJiMzOTttIHNraXBwaW5nIHRoZSBwcmVsaW1pbmFyaWVzIGFuZCBnb2luZyBzdHJhaWdodCB0byBsaW5lcyAyMDAgdGhyb3VnaCAyNjAgb2YgYG1tL2h1Z2VfbWVtb3J5LmNgLiBUaG9zZSBsaW5lcyBzaG91bGQgZ2l2ZSBtZSB0aGUgcmVzdCBvZiB0aGUgcHV6emxlIHBpZWNlcy4gSSYjMzk7bSBleHBlY3RpbmcgdG8gZmluZCB0aGUga2V5IGNvbnN0cmFpbnRzIG91dGxpbmVkLiBTcGVjaWZpY2FsbHkgSSYjMzk7bSBob3BpbmcgdG8gc2VlOiBpZiB0aGVyZSYjMzk7cyBhbnkgcmVtYWluaW5nIGxvZ2ljLCBhbnkgZGVwZW5kZW5jaWVzLCBvciBzcGVjaWFsIGhhbmRsaW5nIEkgbmVlZCB0byBiZSBhd2FyZSBvZi4gSSBuZWVkIHRvIGJlIGFibGUgdG8gYW50aWNpcGF0ZSBwcm9ibGVtcyBhbmQgZXhwbGFpbiBlZGdlIGNhc2VzLiBMZXQmIzM5O3Mgc2VlIHdoYXQgdGhlIGNvZGUgc2F5cy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zMC8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDcgMjE6NTY8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDttbS9odWdlX21lbW9yeS5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMjAwLAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDY1Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OyAyMDA6XHRcdG9yZGVycyBcdTAwMjY9IHN1cHBvcnRlZF9vcmRlcnM7XG4gMjAxOlx0XHRpZiAoIW9yZGVycylcbiAyMDI6XHRcdFx0cmV0dXJuIDA7XG4gMjAzOlx0XG4gMjA0Olx0XHRpZiAoIXZtYS1cdTAwM2V2bV9tbSlcdFx0LyogdmRzbyAqL1xuIDIwNTpcdFx0XHRyZXR1cm4gMDtcbiAyMDY6XHRcbiAyMDc6XHRcdGlmICh0aHBfZGlzYWJsZWRfYnlfaHcoKSB8fCB2bWFfdGhwX2Rpc2FibGVkKHZtYSwgdm1fZmxhZ3MsIGZvcmNlZF9jb2xsYXBzZSkpXG4gMjA4Olx0XHRcdHJldHVybiAwO1xuIDIwOTpcdFxuIDIxMDpcdFx0Lyoga2h1Z2VwYWdlZCBkb2VzbiYjMzk7dCBjb2xsYXBzZSBEQVggdm1hLCBidXQgcGFnZSBmYXVsdCBpcyBmaW5lLiAqL1xuIDIxMTpcdFx0aWYgKHZtYV9pc19kYXgodm1hKSlcbiAyMTI6XHRcdFx0cmV0dXJuIGluX3BmID8gb3JkZXJzIDogMDtcbiAyMTM6XHRcbiAyMTQ6XHRcdC8qXG4gMjE1Olx0XHQgKiBraHVnZXBhZ2VkIHNwZWNpYWwgVk1BIGFuZCBodWdldGxiIFZNQS5cbiAyMTY6XHRcdCAqIE11c3QgYmUgY2hlY2tlZCBhZnRlciBkYXggc2luY2Ugc29tZSBkYXggbWFwcGluZ3MgbWF5IGhhdmVcbiAyMTc6XHRcdCAqIFZNX01JWEVETUFQIHNldC5cbiAyMTg6XHRcdCAqL1xuIDIxOTpcdFx0aWYgKCFpbl9wZiBcdTAwMjZcdTAwMjYgIXNtYXBzIFx1MDAyNlx1MDAyNiAodm1fZmxhZ3MgXHUwMDI2IFZNX05PX0tIVUdFUEFHRUQpKVxuIDIyMDpcdFx0XHRyZXR1cm4gMDtcbiAyMjE6XHRcbiAyMjI6XHRcdC8qXG4gMjIzOlx0XHQgKiBDaGVjayBhbGlnbm1lbnQgZm9yIGZpbGUgdm1hIGFuZCBzaXplIGZvciBib3RoIGZpbGUgYW5kIGFub24gdm1hIGJ5XG4gMjI0Olx0XHQgKiBmaWx0ZXJpbmcgb3V0IHRoZSB1bnN1aXRhYmxlIG9yZGVycy5cbiAyMjU6XHRcdCAqXG4gMjI2Olx0XHQgKiBTa2lwIHRoZSBjaGVjayBmb3IgcGFnZSBmYXVsdC4gSHVnZSBmYXVsdCBkb2VzIHRoZSBjaGVjayBpbiBmYXVsdFxuIDIyNzpcdFx0ICogaGFuZGxlcnMuXG4gMjI4Olx0XHQgKi9cbiAyMjk6XHRcdGlmICghaW5fcGYpIHtcbiAyMzA6XHRcdFx0aW50IG9yZGVyID0gaGlnaGVzdF9vcmRlcihvcmRlcnMpO1xuIDIzMTpcdFx0XHR1bnNpZ25lZCBsb25nIGFkZHI7XG4gMjMyOlx0XG4gMjMzOlx0XHRcdHdoaWxlIChvcmRlcnMpIHtcbiAyMzQ6XHRcdFx0XHRhZGRyID0gdm1hLVx1MDAzZXZtX2VuZCAtIChQQUdFX1NJWkUgXHUwMDNjXHUwMDNjIG9yZGVyKTtcbiAyMzU6XHRcdFx0XHRpZiAodGhwX3ZtYV9zdWl0YWJsZV9vcmRlcih2bWEsIGFkZHIsIG9yZGVyKSlcbiAyMzY6XHRcdFx0XHRcdGJyZWFrO1xuIDIzNzpcdFx0XHRcdG9yZGVyID0gbmV4dF9vcmRlcihcdTAwMjZvcmRlcnMsIG9yZGVyKTtcbiAyMzg6XHRcdFx0fVxuIDIzOTpcdFxuIDI0MDpcdFx0XHRpZiAoIW9yZGVycylcbiAyNDE6XHRcdFx0XHRyZXR1cm4gMDtcbiAyNDI6XHRcdH1cbiAyNDM6XHRcbiAyNDQ6XHRcdC8qXG4gMjQ1Olx0XHQgKiBFbmFibGVkIHZpYSBzaG1lbSBtb3VudCBvcHRpb25zIG9yIHN5c2ZzIHNldHRpbmdzLlxuIDI0NjpcdFx0ICogTXVzdCBiZSBkb25lIGJlZm9yZSBodWdlcGFnZSBmbGFncyBjaGVjayBzaW5jZSBzaG1lbSBoYXMgaXRzXG4gMjQ3Olx0XHQgKiBvd24gZmxhZ3MuXG4gMjQ4Olx0XHQgKi9cbiAyNDk6XHRcdGlmICghaW5fcGYgXHUwMDI2XHUwMDI2IHNobWVtX2ZpbGUodm1hLVx1MDAzZXZtX2ZpbGUpKVxuIDI1MDpcdFx0XHRyZXR1cm4gb3JkZXJzIFx1MDAyNiBzaG1lbV9hbGxvd2FibGVfaHVnZV9vcmRlcnMoZmlsZV9pbm9kZSh2bWEtXHUwMDNldm1fZmlsZSksXG4gMjUxOlx0XHRcdFx0XHRcdFx0ICAgdm1hLCB2bWFfc3RhcnRfcGdvZmYodm1hKSwgMCxcbiAyNTI6XHRcdFx0XHRcdFx0XHQgICBmb3JjZWRfY29sbGFwc2UpO1xuIDI1MzpcdFxuIDI1NDpcdFx0aWYgKCF2bWFfaXNfYW5vbnltb3VzKHZtYSkpXG4gMjU1Olx0XHRcdHJldHVybiB2bWFfZmlsZV9jYW5fbWFwX2h1Z2Uodm1hLCB2bV9mbGFncywgdHlwZSkgPyBvcmRlcnMgOiAwO1xuIDI1NjpcdFxuIDI1NzpcdFx0aWYgKHZtYV9pc190ZW1wb3Jhcnlfc3RhY2sodm1hKSlcbiAyNTg6XHRcdFx0cmV0dXJuIDA7XG4gMjU5Olx0XG4gMjYwOlx0XHQvKlxuIDI2MTpcdFx0ICogVEhQZWxpZ2libGUgYml0IG9mIHNtYXBzIHNob3VsZCBzaG93IDEgZm9yIHByb3BlciBWTUFzIGV2ZW5cbiAyNjI6XHRcdCAqIHRob3VnaCBhbm9uX3ZtYSBpcyBub3QgaW5pdGlhbGl6ZWQgeWV0LlxuIDI2MzpcdFx0ICpcbiAyNjQ6XHRcdCAqIEFsbG93IHBhZ2UgZmF1bHQgc2luY2UgYW5vbl92bWEgbWF5IGJlIG5vdCBpbml0aWFsaXplZCB1bnRpbFxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMxLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNyAyMTo1NjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA3MjUyCgkJCQkJCQlvdXRwdXQ6IDI2NQoJCQkJCQkJdGhvdWdodHM6IDcxNQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgdGhlIFRIUCBQYXRjaCBmb3IgVW5pbml0aWFsaXplZCBNZW1vcnkqKgoKT2theSwgbGV0JiMzOTtzIGJyZWFrIHRoaXMgZG93bi4gRmlyc3QsIHRoaXMgcGF0Y2ggYWRkZWQgYSBgY29uc3RgIHF1YWxpZmllciB0byBgZmlsZV90aHBfZW5hYmxlZCgpYCwgYSBtaW5vciBjaGFuZ2UuIE1vcmUgaW1wb3J0YW50bHksIGl0IHJlZmFjdG9yZWQgbG9naWMgZnJvbSBgX190aHBfdm1hX2FsbG93YWJsZV9vcmRlcnNgIGludG8gc2V2ZXJhbCBoZWxwZXIgZnVuY3Rpb25zOiBgdm1hX2ZpbGVfYnlwYXNzX3RocF90dW5lYWJsZXNgLCBgdm1hX2ZpbGVfYWxsb3dfdGhwX3R1bmVhYmxlc2AsIGB2bWFfZmlsZV9jaGVja190aHBfdHVuZWFibGVzYCwgYW5kIGB2bWFfZmlsZV9jYW5fbWFwX2h1Z2VgLiBJdCBhbHNvIHNwZWNpZmljYWxseSBhZGRlZCBhIGJ5cGFzcyBmb3IgUEZOTUFQIHdpdGggYGh1Z2VfZmF1bHRgLgoKTXkgY29uY2VybiwgYXMgYWx3YXlzLCBpcyB1bmluaXRpYWxpemVkIG1lbW9yeS4gSSBuZWVkIHRvIGVuc3VyZSB0aGlzIHBhdGNoIGRvZXNuJiMzOTt0IGludHJvZHVjZSBvciBleHBvc2UgYW55IHZ1bG5lcmFiaWxpdGllcyByZWxhdGVkIHRvIHJlYWRpbmcgdW5pbml0aWFsaXplZCBkYXRhLiBTcGVjaWZpY2FsbHksIEkgbmVlZCB0byBjaGVjazogZG9lcyB0aGlzIHBhdGNoIGludGVyYWN0IHdpdGgga2VybmVsIHN0cnVjdHVyZXMgZXhwb3NlZCB0byB1c2Vyc3BhY2UsIGFyZSB0aGVyZSBjb25kaXRpb25hbCBicmFuY2hlcyBiYXNlZCBvbiBwb3RlbnRpYWxseSB1bmluaXRpYWxpemVkIHZhcmlhYmxlcywgZG9lcyBpdCBhbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBkYXRhIHN0cnVjdHVyZXMgdGhhdCBjb3VsZCBsZWFkIHRvIHN1YnNlcXVlbnQgcmVhZHMgb2YgdW5pbml0aWFsaXplZCBtZW1vcnksIG9yIGlzIGl0IG1vZGlmeWluZyBhbnkgYm91bmRzIGNoZWNrcyBvciBsb2dpYyBpbiBhIHdheSB0aGF0IGNvdWxkIGV4cG9zZSB1bmluaXRpYWxpemVkIGRhdGE/CgpJJiMzOTttIGxvb2tpbmcgY2xvc2VseSBhdCBob3cgYHZtYS0mZ3Q7dm1fb3BzYCBhbmQgYHZtYWAgZmxhZ3MgYXJlIGhhbmRsZWQgd2l0aGluIHRoZXNlIGZ1bmN0aW9ucy4gSSYjMzk7bSBub3RpbmcgdGhhdCBgdm1hLSZndDt2bV9vcHNgIG1pZ2h0IG5lZWQgc3BlY2lhbCBhdHRlbnRpb24uIElzIHRoZXJlIGEgcG9zc2liaWxpdHkgb2YgYSBudWxsIGRlcmVmZXJlbmNlIGlmIGB2bWEtJmd0O3ZtX29wc2AgaXMgTlVMTD8gS0FTQU4gYW5kIG90aGVyIGRldGVjdG9ycyBzaG91bGQgY2F0Y2ggdGhhdCwgYnV0IEkmIzM5O20gYmVpbmcgdGhvcm91Z2ggaGVyZS4gSSYjMzk7bSBjb25zaWRlcmluZyBLTVNBTiB2cyBLQVNBTjogS01TQU4gaXMgZm9yIHVuaW5pdGlhbGl6ZWQgcmVhZHMgYW5kIGxlYWtzLCBLQVNBTiBmb3Igb3V0LW9mLWJvdW5kcywgdXNlLWFmdGVyLWZyZWUsIGV0Yy4sIGFuZCBrZXJuZWwgcGFuaWMgZm9yIG51bGwgZGVyZWYuIExPQ0tERVAgZm9yIGxvY2sgaXNzdWVzLgoKQWZ0ZXIgY2FyZWZ1bCByZXZpZXcsIEkmIzM5O3ZlIGNvbmZpcm1lZCB0aGF0IHRoZSB2YXJpYWJsZXMgYmVpbmcgY2hlY2tlZCAoYHZtYS0mZ3Q7dm1fb3BzLSZndDtodWdlX2ZhdWx0YCwgYHR5cGVgLCBgdm1fZmxhZ3NgLCBhbmQgYHZtYWAgZmxhZ3MpIGFyZSBhbGwgaW5pdGlhbGl6ZWQsIGVpdGhlciBhcyBtZW1iZXIgZmllbGRzIG9mIHRoZSBgdm1fYXJlYV9zdHJ1Y3RgIG9yIGFzIGZ1bmN0aW9uIGFyZ3VtZW50cyBwYXNzZWQgYnkgdmFsdWUuIFRoZXJlJiMzOTtzIG5vIGludGVyYWN0aW9uIHdpdGggdXNlcnNwYWNlIHN0cnVjdHVyZXMgdGhhdCB3b3VsZCBjYXVzZSBpc3N1ZXMuIFRoaXMgcGF0Y2ggaXMgcHVyZWx5IGFib3V0IGRldGVybWluaW5nIHRoZSBzdWl0YWJpbGl0eSBvZiBUSFAgKFRyYW5zcGFyZW50IEh1Z2UgUGFnZXMpIG1hcHBpbmcgcG9saWN5IGZvciBhIGdpdmVuIFZNQS4gSXQgZG9lc24mIzM5O3QgbW9kaWZ5IGFueSBib3VuZHMgY2hlY2tzIG9yIGluaXRpYWxpemF0aW9uIGxvZ2ljLCBzbyB0aGVyZSBzaG91bGQgYmUgbm8gcmlzayBvZiByZWFkaW5nIHVuaW5pdGlhbGl6ZWQgbWVtb3J5LgoKVGhlcmVmb3JlLCB0aGlzIGNoYW5nZSBkb2VzbiYjMzk7dCBpbnRyb2R1Y2Ugb3IgZXhwb3NlIGFueSB1bmluaXRpYWxpemVkIG1lbW9yeSByZWFkcyBvciBsZWFrcy4gU3RhbmRhcmQgZnV6emluZyBhbmQgS0FTQU4gc2hvdWxkIGJlIHN1ZmZpY2llbnQ7IEtNU0FOIGlzIG5vdCBuZWVkZWQgaGVyZS4KCkkmIzM5O20gY29uZmlkZW50IGluIG15IGFuYWx5c2lzLiBUaGUgcmVhc29uaW5nIGlzIHNvdW5kLiBJJiMzOTtsbCBnbyBhaGVhZCBhbmQgY2FsbCBgc2V0LXJlc3VsdHNgLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMyLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNyAyMTo1NjwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnNldC1yZXN1bHRzPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtLTVNBTlJlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCByZWZhY3RvcnMgVEhQIChUcmFuc3BhcmVudCBIdWdlIFBhZ2UpIHBvbGljeSBjaGVja3MgZm9yIGZpbGUtYmFja2VkIGFuZCBzcGVjaWFsL1BGTk1BUCBWTUFzIGluIGBtbS9odWdlX21lbW9yeS5jYC4gSXQgYnJlYWtzIG91dCB0aGUgbG9naWMgZm9yIGNoZWNraW5nIFRIUCB0dW5hYmxlcyBhbmQgaHVnZSBwYWdlIHN1cHBvcnQgaW50byBoZWxwZXIgZnVuY3Rpb25zIChgdm1hX2ZpbGVfYnlwYXNzX3RocF90dW5lYWJsZXNgLCBgdm1hX2ZpbGVfYWxsb3dfdGhwX3R1bmVhYmxlc2AsIGB2bWFfZmlsZV9jaGVja190aHBfdHVuZWFibGVzYCwgYW5kIGB2bWFfZmlsZV9jYW5fbWFwX2h1Z2VgKSBhbmQgYWxsb3dzIFBGTk1BUCBWTUFzIHdpdGggYGh1Z2VfZmF1bHRgIGhhbmRsZXJzIHRvIGJ5cGFzcyBnbG9iYWwgVEhQIHR1bmFibGVzLlxuXG5Ob25lIG9mIHRoZSBjaGFuZ2VzIHRvdWNoIGJ1ZmZlciBjb3BpZXMgdG8gdXNlciBzcGFjZSwgdW5pbml0aWFsaXplZCBzdGFjayBvciBoZWFwIG1lbW9yeSwgb3IgbWVtb3J5IGFsbG9jYXRpb25zLiBBbGwgdmFyaWFibGVzIGFuZCBzdHJ1Y3QgbWVtYmVycyBldmFsdWF0ZWQgKHN1Y2ggYXMgYHZtYS1cdTAwM2V2bV9vcHNgLCBgdm1fZmxhZ3NgLCBhbmQgYHR5cGVgKSBhcmUgZnVsbHkgaW5pdGlhbGl6ZWQgYXJndW1lbnRzIG9yIHN0cnVjdHVyZSBmaWVsZHMuIFBvdGVudGlhbCBpc3N1ZXMgaW4gdGhpcyBjb2RlIHBhdGggKHN1Y2ggYXMgTlVMTCBwb2ludGVyIGRlcmVmZXJlbmNlcyBpZiBgdm1fb3BzYCB3ZXJlIE5VTEwpIGFyZSBkZXRlY3RlZCBieSBzdGFuZGFyZCBrZXJuZWwgZmF1bHQgaGFuZGxlcnMgYW5kIEtBU0FOLiBUaGVyZSBpcyBubyByaXNrIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHVzYWdlIG9yIGluZm9ybWF0aW9uIGxlYWtzIHRoYXQgd291bGQgcmVxdWlyZSBLTVNBTi4mIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0tNU0FOUmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIHJlZmFjdG9ycyBUSFAgKFRyYW5zcGFyZW50IEh1Z2UgUGFnZSkgcG9saWN5IGNoZWNrcyBmb3IgZmlsZS1iYWNrZWQgYW5kIHNwZWNpYWwvUEZOTUFQIFZNQXMgaW4gYG1tL2h1Z2VfbWVtb3J5LmNgLiBJdCBicmVha3Mgb3V0IHRoZSBsb2dpYyBmb3IgY2hlY2tpbmcgVEhQIHR1bmFibGVzIGFuZCBodWdlIHBhZ2Ugc3VwcG9ydCBpbnRvIGhlbHBlciBmdW5jdGlvbnMgKGB2bWFfZmlsZV9ieXBhc3NfdGhwX3R1bmVhYmxlc2AsIGB2bWFfZmlsZV9hbGxvd190aHBfdHVuZWFibGVzYCwgYHZtYV9maWxlX2NoZWNrX3RocF90dW5lYWJsZXNgLCBhbmQgYHZtYV9maWxlX2Nhbl9tYXBfaHVnZWApIGFuZCBhbGxvd3MgUEZOTUFQIFZNQXMgd2l0aCBgaHVnZV9mYXVsdGAgaGFuZGxlcnMgdG8gYnlwYXNzIGdsb2JhbCBUSFAgdHVuYWJsZXMuXG5cbk5vbmUgb2YgdGhlIGNoYW5nZXMgdG91Y2ggYnVmZmVyIGNvcGllcyB0byB1c2VyIHNwYWNlLCB1bmluaXRpYWxpemVkIHN0YWNrIG9yIGhlYXAgbWVtb3J5LCBvciBtZW1vcnkgYWxsb2NhdGlvbnMuIEFsbCB2YXJpYWJsZXMgYW5kIHN0cnVjdCBtZW1iZXJzIGV2YWx1YXRlZCAoc3VjaCBhcyBgdm1hLVx1MDAzZXZtX29wc2AsIGB2bV9mbGFnc2AsIGFuZCBgdHlwZWApIGFyZSBmdWxseSBpbml0aWFsaXplZCBhcmd1bWVudHMgb3Igc3RydWN0dXJlIGZpZWxkcy4gUG90ZW50aWFsIGlzc3VlcyBpbiB0aGlzIGNvZGUgcGF0aCAoc3VjaCBhcyBOVUxMIHBvaW50ZXIgZGVyZWZlcmVuY2VzIGlmIGB2bV9vcHNgIHdlcmUgTlVMTCkgYXJlIGRldGVjdGVkIGJ5IHN0YW5kYXJkIGtlcm5lbCBmYXVsdCBoYW5kbGVycyBhbmQgS0FTQU4uIFRoZXJlIGlzIG5vIHJpc2sgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgdXNhZ2Ugb3IgaW5mb3JtYXRpb24gbGVha3MgdGhhdCB3b3VsZCByZXF1aXJlIEtNU0FOLiYjMzQ7LAogICYjMzQ7TmVlZHNLTVNBTiYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPC90Ym9keT4KCTwvdGFibGU+CgoJPGRpdiBpZD0ibGxtX3N1bW1hcnlfdGFibGVfZGl2IiBzdHlsZT0ibWFyZ2luOiAyMHB4IDA7Ij4KCQk8dGFibGUgY2xhc3M9Imxpc3RfdGFibGUiPgoJCQk8Y2FwdGlvbj5MTE0gQ2FsbHMgU3VtbWFyeTo8L2NhcHRpb24+CgkJCTx0aGVhZD4KCQkJCTx0cj4KCQkJCQk8dGg+VG90YWwgQ2FsbHM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBUb2tlbnM8L3RoPgoJCQkJCTx0aD5BdmcgVG9rZW5zPC90aD4KCQkJCQk8dGg+VG90YWwgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCQk8dGg+QXZnIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQk8L3RyPgoJCQk8L3RoZWFkPgoJCQk8dGJvZHkgaWQ9ImxsbV9zdW1tYXJ5X3N0YXRzX2JvZHkiPjwvdGJvZHk+CgkJPC90YWJsZT4KCTwvZGl2PgoKCTxkaXYgaWQ9InRvb2xfc3VtbWFyeV90YWJsZV9kaXYiIHN0eWxlPSJtYXJnaW46IDIwcHggMDsiPgoJCTx0YWJsZSBjbGFzcz0ibGlzdF90YWJsZSI+CgkJCTxjYXB0aW9uPlRvb2wgQ2FsbHMgU3VtbWFyeTo8L2NhcHRpb24+CgkJCTx0aGVhZD4KCQkJCTx0cj4KCQkJCQk8dGg+VG90YWwgQ2FsbHM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJCTx0aD5BdmcgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCTwvdHI+CgkJCTwvdGhlYWQ+CgkJCTx0Ym9keSBpZD0idG9vbF9zdW1tYXJ5X3N0YXRzX2JvZHkiPjwvdGJvZHk+CgkJPC90YWJsZT4KCTwvZGl2PgoKCTxkaXYgaWQ9ImR1cmF0aW9uX2NoYXJ0X2RpdiIgc3R5bGU9IndpZHRoOiAxMDAlOyBtYXJnaW46IDIwcHggMDsgYm9yZGVyOiAxcHg7Ij48L2Rpdj4KCTxkaXYgaWQ9InRva2VuX2NoYXJ0X2RpdiIgc3R5bGU9IndpZHRoOiAxMDAlOyBtYXJnaW46IDIwcHggMDsgYm9yZGVyOiAxcHg7Ij48L2Rpdj4KCgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJodHRwczovL3d3dy5nb29nbGUuY29tL2pzYXBpIj48L3NjcmlwdD4KCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KCQlnb29nbGUubG9hZCgidmlzdWFsaXphdGlvbiIsICIxIiwge3BhY2thZ2VzOlsiY29yZWNoYXJ0Il19KTsKCQlnb29nbGUuc2V0T25Mb2FkQ2FsbGJhY2soZHJhd0NoYXJ0cyk7CgoJCWZ1bmN0aW9uIGRyYXdDaGFydHMoKSB7CgkJCWNvbnN0IHJhd0RhdGEgPSBbeyJTdGFydGVkIjoiMjAyNi0wOS0wN1QyMTo1NToxNy40NDE4MDIyNTlaIiwiU2VxIjowLCJOZXN0aW5nIjowLCJUeXBlIjoiZmxvdyIsIk5hbWUiOiJwYXRjaC10cmlhZ2UiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo1OTk2MTY4MTE3MSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJUUkFOU1BBUkVOVF9IVUdFUEFHRVwiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcIl9fdGhwX3ZtYV9hbGxvd2FibGVfb3JkZXJzXCIsXG4gICAgXCJ2bWFfZmlsZV9jYW5fbWFwX2h1Z2VcIixcbiAgICBcInZtYV9maWxlX2J5cGFzc190aHBfdHVuZWFibGVzXCIsXG4gICAgXCJtYWR2aXNlX2NvbGxhcHNlXCJcbiAgXSxcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCByZWZhY3RvcnMgVEhQIChUcmFuc3BhcmVudCBIdWdlIFBhZ2UpIHBvbGljeSBjaGVja3MgZm9yIGZpbGUtYmFja2VkIGFuZCBzcGVjaWFsL1BGTk1BUCBWTUFzIGluIGBtbS9odWdlX21lbW9yeS5jYC4gSXQgYnJlYWtzIG91dCB0aGUgbG9naWMgZm9yIGNoZWNraW5nIFRIUCB0dW5hYmxlcyBhbmQgaHVnZSBwYWdlIHN1cHBvcnQgaW50byBoZWxwZXIgZnVuY3Rpb25zIChgdm1hX2ZpbGVfYnlwYXNzX3RocF90dW5lYWJsZXNgLCBgdm1hX2ZpbGVfYWxsb3dfdGhwX3R1bmVhYmxlc2AsIGB2bWFfZmlsZV9jaGVja190aHBfdHVuZWFibGVzYCwgYW5kIGB2bWFfZmlsZV9jYW5fbWFwX2h1Z2VgKSBhbmQgYWxsb3dzIFBGTk1BUCBWTUFzIHdpdGggYGh1Z2VfZmF1bHRgIGhhbmRsZXJzIHRvIGJ5cGFzcyBnbG9iYWwgVEhQIHR1bmFibGVzLlxcblxcbk5vbmUgb2YgdGhlIGNoYW5nZXMgdG91Y2ggYnVmZmVyIGNvcGllcyB0byB1c2VyIHNwYWNlLCB1bmluaXRpYWxpemVkIHN0YWNrIG9yIGhlYXAgbWVtb3J5LCBvciBtZW1vcnkgYWxsb2NhdGlvbnMuIEFsbCB2YXJpYWJsZXMgYW5kIHN0cnVjdCBtZW1iZXJzIGV2YWx1YXRlZCAoc3VjaCBhcyBgdm1hLVxcdTAwM2V2bV9vcHNgLCBgdm1fZmxhZ3NgLCBhbmQgYHR5cGVgKSBhcmUgZnVsbHkgaW5pdGlhbGl6ZWQgYXJndW1lbnRzIG9yIHN0cnVjdHVyZSBmaWVsZHMuIFBvdGVudGlhbCBpc3N1ZXMgaW4gdGhpcyBjb2RlIHBhdGggKHN1Y2ggYXMgTlVMTCBwb2ludGVyIGRlcmVmZXJlbmNlcyBpZiBgdm1fb3BzYCB3ZXJlIE5VTEwpIGFyZSBkZXRlY3RlZCBieSBzdGFuZGFyZCBrZXJuZWwgZmF1bHQgaGFuZGxlcnMgYW5kIEtBU0FOLiBUaGVyZSBpcyBubyByaXNrIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHVzYWdlIG9yIGluZm9ybWF0aW9uIGxlYWtzIHRoYXQgd291bGQgcmVxdWlyZSBLTVNBTi5cIixcbiAgXCJOZWVkc0tNU0FOXCI6IGZhbHNlLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCByZWZhY3RvcnMgYW5kIGFsdGVycyBUSFAgKFRyYW5zcGFyZW50IEh1Z2UgUGFnZSkgYWxsb3dhYmxlIG9yZGVycyBjaGVja2luZyBmb3IgZmlsZS1iYWNrZWQgVk1BcyBpbiBtbS9odWdlX21lbW9yeS5jLCBhZGRpbmcgaGVscGVycyBsaWtlIHZtYV9maWxlX2Nhbl9tYXBfaHVnZSBhbmQgdm1hX2ZpbGVfYnlwYXNzX3RocF90dW5lYWJsZXMuIFRoaXMgY29yZSBtZW1vcnkgbWFuYWdlbWVudCBsb2dpYyBpcyByZWFjaGFibGUgdmlhIHN0YW5kYXJkIHN5c2NhbGxzIGFuZCBpbnRlcmZhY2VzIHN1Y2ggYXMgbWFkdmlzZShNQURWX0NPTExBUFNFKSwgcGFnZSBmYXVsdCBoYW5kbGVycywgYW5kIC9wcm9jL3BpZC9zbWFwcy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDdUMjE6NTU6MTcuNDQxODExMzQ5WiIsIlNlcSI6MSwiTmVzdGluZyI6MSwiVHlwZSI6ImFjdGlvbiIsIk5hbWUiOiJyZWFkLXBhdGNoLWRpZmYiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo1OTAxMTU0OTMsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIlBhdGNoRGlmZlwiOiBcImNvbW1pdCA0MDdiOGU3YjZmOGFhNjI5NmJkOTc0YzdkOTI2ZWI3NTM5Yjc0Y2U2XFxuQXV0aG9yOiBzeXotY2x1c3RlciBcXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cXHUwMDNlXFxuRGF0ZTogICBNb24gU2VwIDcgMjE6NTU6MTYgMjAyNiArMDAwMFxcblxcbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcXG5cXG5kaWZmIC0tZ2l0IGEvbW0vaHVnZV9tZW1vcnkuYyBiL21tL2h1Z2VfbWVtb3J5LmNcXG5pbmRleCBhZmJiNTk3NGJkMjI1Li43NWMyMDRhZjQwY2JkIDEwMDY0NFxcbi0tLSBhL21tL2h1Z2VfbWVtb3J5LmNcXG4rKysgYi9tbS9odWdlX21lbW9yeS5jXFxuQEAgLTkyLDcgKzkyLDcgQEAgdW5zaWduZWQgbG9uZyBodWdlX2Fub25fb3JkZXJzX21hZHZpc2UgX19yZWFkX21vc3RseTtcXG4gdW5zaWduZWQgbG9uZyBodWdlX2Fub25fb3JkZXJzX2luaGVyaXQgX19yZWFkX21vc3RseTtcXG4gc3RhdGljIGJvb2wgYW5vbl9vcmRlcnNfY29uZmlndXJlZCBfX2luaXRkYXRhO1xcbiBcXG4tc3RhdGljIGlubGluZSBib29sIGZpbGVfdGhwX2VuYWJsZWQoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpXFxuK3N0YXRpYyBpbmxpbmUgYm9vbCBmaWxlX3RocF9lbmFibGVkKGNvbnN0IHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKVxcbiB7XFxuIFxcdHN0cnVjdCBpbm9kZSAqaW5vZGU7XFxuIFxcbkBAIC0xMTgsNiArMTE4LDY3IEBAIHN0YXRpYyBib29sIHZtYV9pc19zcGVjaWFsX2h1Z2UoY29uc3Qgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpXFxuIFxcdHJldHVybiB2bWFfdGVzdF9hbnkodm1hLCBWTUFfUEZOTUFQX0JJVCwgVk1BX01JWEVETUFQX0JJVCk7XFxuIH1cXG4gXFxuK3N0YXRpYyBib29sIHZtYV9maWxlX2J5cGFzc190aHBfdHVuZWFibGVzKGNvbnN0IHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxcbitcXHRcXHRlbnVtIHR2YV90eXBlIHR5cGUpXFxuK3tcXG4rXFx0Y29uc3QgYm9vbCBoYXNfaHVnZV9mYXVsdCA9IHZtYS1cXHUwMDNldm1fb3BzLVxcdTAwM2VodWdlX2ZhdWx0O1xcbitcXG4rXFx0LyogTUFEVl9DT0xMQVBTRSBpZ25vcmVzIHR1bmVhYmxlcy4gKi9cXG4rXFx0aWYgKHR5cGUgPT0gVFZBX0ZPUkNFRF9DT0xMQVBTRSlcXG4rXFx0XFx0cmV0dXJuIHRydWU7XFxuK1xcdC8qIEh1Z2UgUEZOIG1hcHBpbmdzIGFyZSB1bmNvbXBhY3RhYmxlIHNvIHRoZSBwb2xpY3kgZG9lc24ndCBhcHBseS4gKi9cXG4rXFx0aWYgKHZtYV90ZXN0KHZtYSwgVk1BX1BGTk1BUF9CSVQpIFxcdTAwMjZcXHUwMDI2IGhhc19odWdlX2ZhdWx0KVxcbitcXHRcXHRyZXR1cm4gdHJ1ZTtcXG4rXFx0cmV0dXJuIGZhbHNlO1xcbit9XFxuK1xcbitzdGF0aWMgYm9vbCB2bWFfZmlsZV9hbGxvd190aHBfdHVuZWFibGVzKHZtX2ZsYWdzX3Qgdm1fZmxhZ3MpXFxuK3tcXG4rXFx0LyogVEhQPWFsd2F5cz8gKi9cXG4rXFx0aWYgKGh1Z2VwYWdlX2dsb2JhbF9hbHdheXMoKSlcXG4rXFx0XFx0cmV0dXJuIHRydWU7XFxuK1xcdC8qIFRIUD1tYWR2aXNlIGFuZCBtYXJrZWQgTUFEVl9IVUdFUEFHRT8gKi9cXG4rXFx0aWYgKGh1Z2VwYWdlX2dsb2JhbF9lbmFibGVkKCkgXFx1MDAyNlxcdTAwMjYgKHZtX2ZsYWdzIFxcdTAwMjYgVk1fSFVHRVBBR0UpKVxcbitcXHRcXHRyZXR1cm4gdHJ1ZTtcXG4rXFx0cmV0dXJuIGZhbHNlO1xcbit9XFxuK1xcbitzdGF0aWMgYm9vbCB2bWFfZmlsZV9jaGVja190aHBfdHVuZWFibGVzKGNvbnN0IHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxcbitcXHRcXHR2bV9mbGFnc190IHZtX2ZsYWdzLCBlbnVtIHR2YV90eXBlIHR5cGUpXFxuK3tcXG4rXFx0cmV0dXJuIHZtYV9maWxlX2J5cGFzc190aHBfdHVuZWFibGVzKHZtYSwgdHlwZSkgfHxcXG4rXFx0XFx0dm1hX2ZpbGVfYWxsb3dfdGhwX3R1bmVhYmxlcyh2bV9mbGFncyk7XFxuK31cXG4rXFxuK3N0YXRpYyBib29sIHZtYV9maWxlX2Nhbl9tYXBfaHVnZShjb25zdCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcXG4rXFx0XFx0dm1fZmxhZ3NfdCB2bV9mbGFncywgZW51bSB0dmFfdHlwZSB0eXBlKVxcbit7XFxuK1xcdGNvbnN0IGJvb2wgaGFzX2h1Z2VfZmF1bHQgPSB2bWEtXFx1MDAzZXZtX29wcy1cXHUwMDNlaHVnZV9mYXVsdDtcXG4rXFxuK1xcdC8qXFxuK1xcdCAqIEVuZm9yY2UgVEhQIGNvbGxhcHNlIHJlcXVpcmVtZW50cyBhcyBuZWNlc3NhcnkuIEFub255bW91cyB2bWFzXFxuK1xcdCAqIHdlcmUgYWxyZWFkeSBoYW5kbGVkIGluIHRocF92bWFfYWxsb3dhYmxlX29yZGVycygpLlxcbitcXHQgKi9cXG4rXFx0aWYgKCF2bWFfZmlsZV9jaGVja190aHBfdHVuZWFibGVzKHZtYSwgdm1fZmxhZ3MsIHR5cGUpKVxcbitcXHRcXHRyZXR1cm4gZmFsc2U7XFxuK1xcbitcXHRzd2l0Y2ggKHR5cGUpIHtcXG4rXFx0Y2FzZSBUVkFfUEFHRUZBVUxUOlxcbitcXHRcXHQvKlxcbitcXHRcXHQgKiBUcnVzdCB0aGF0IC1cXHUwMDNlaHVnZV9mYXVsdCgpIGhhbmRsZXJzIGtub3cgd2hhdCB0aGV5IGFyZSBkb2luZ1xcbitcXHRcXHQgKiBpbiBmYXVsdCBwYXRoLlxcbitcXHRcXHQgKi9cXG4rXFx0XFx0cmV0dXJuIGhhc19odWdlX2ZhdWx0O1xcbitcXHRjYXNlIFRWQV9TTUFQUzpcXG4rXFx0XFx0aWYgKGhhc19odWdlX2ZhdWx0KVxcbitcXHRcXHRcXHRyZXR1cm4gdHJ1ZTtcXG4rXFx0XFx0ZmFsbHRocm91Z2g7XFxuK1xcdGRlZmF1bHQ6XFxuK1xcdFxcdC8qIE9ubHkgcmVndWxhciBmaWxlIGlzIHZhbGlkIGluIGNvbGxhcHNlIHBhdGguICovXFxuK1xcdFxcdHJldHVybiBmaWxlX3RocF9lbmFibGVkKHZtYSk7XFxuK1xcdH1cXG4rfVxcbitcXG4gdW5zaWduZWQgbG9uZyBfX3RocF92bWFfYWxsb3dhYmxlX29yZGVycyhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcXG4gXFx0XFx0XFx0XFx0XFx0IHZtX2ZsYWdzX3Qgdm1fZmxhZ3MsXFxuIFxcdFxcdFxcdFxcdFxcdCBlbnVtIHR2YV90eXBlIHR5cGUsXFxuQEAgLTE5MCwyNyArMjUxLDggQEAgdW5zaWduZWQgbG9uZyBfX3RocF92bWFfYWxsb3dhYmxlX29yZGVycyhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcXG4gXFx0XFx0XFx0XFx0XFx0XFx0ICAgdm1hLCB2bWFfc3RhcnRfcGdvZmYodm1hKSwgMCxcXG4gXFx0XFx0XFx0XFx0XFx0XFx0ICAgZm9yY2VkX2NvbGxhcHNlKTtcXG4gXFxuLVxcdGlmICghdm1hX2lzX2Fub255bW91cyh2bWEpKSB7XFxuLVxcdFxcdC8qXFxuLVxcdFxcdCAqIEVuZm9yY2UgVEhQIGNvbGxhcHNlIHJlcXVpcmVtZW50cyBhcyBuZWNlc3NhcnkuIEFub255bW91cyB2bWFzXFxuLVxcdFxcdCAqIHdlcmUgYWxyZWFkeSBoYW5kbGVkIGluIHRocF92bWFfYWxsb3dhYmxlX29yZGVycygpLlxcbi1cXHRcXHQgKi9cXG4tXFx0XFx0aWYgKCFmb3JjZWRfY29sbGFwc2UgXFx1MDAyNlxcdTAwMjZcXG4tXFx0XFx0ICAgICghaHVnZXBhZ2VfZ2xvYmFsX2VuYWJsZWQoKSB8fCAoISh2bV9mbGFncyBcXHUwMDI2IFZNX0hVR0VQQUdFKSBcXHUwMDI2XFx1MDAyNlxcbi1cXHRcXHRcXHRcXHRcXHRcXHQgICAgIWh1Z2VwYWdlX2dsb2JhbF9hbHdheXMoKSkpKVxcbi1cXHRcXHRcXHRyZXR1cm4gMDtcXG4tXFxuLVxcdFxcdC8qXFxuLVxcdFxcdCAqIFRydXN0IHRoYXQgLVxcdTAwM2VodWdlX2ZhdWx0KCkgaGFuZGxlcnMga25vdyB3aGF0IHRoZXkgYXJlIGRvaW5nXFxuLVxcdFxcdCAqIGluIGZhdWx0IHBhdGguXFxuLVxcdFxcdCAqL1xcbi1cXHRcXHRpZiAoKChpbl9wZiB8fCBzbWFwcykpIFxcdTAwMjZcXHUwMDI2IHZtYS1cXHUwMDNldm1fb3BzLVxcdTAwM2VodWdlX2ZhdWx0KVxcbi1cXHRcXHRcXHRyZXR1cm4gb3JkZXJzO1xcbi1cXHRcXHQvKiBPbmx5IHJlZ3VsYXIgZmlsZSBpcyB2YWxpZCBpbiBjb2xsYXBzZSBwYXRoICovXFxuLVxcdFxcdGlmICgoKCFpbl9wZiB8fCBzbWFwcykpIFxcdTAwMjZcXHUwMDI2IGZpbGVfdGhwX2VuYWJsZWQodm1hKSlcXG4tXFx0XFx0XFx0cmV0dXJuIG9yZGVycztcXG4tXFx0XFx0cmV0dXJuIDA7XFxuLVxcdH1cXG4rXFx0aWYgKCF2bWFfaXNfYW5vbnltb3VzKHZtYSkpXFxuK1xcdFxcdHJldHVybiB2bWFfZmlsZV9jYW5fbWFwX2h1Z2Uodm1hLCB2bV9mbGFncywgdHlwZSkgPyBvcmRlcnMgOiAwO1xcbiBcXG4gXFx0aWYgKHZtYV9pc190ZW1wb3Jhcnlfc3RhY2sodm1hKSlcXG4gXFx0XFx0cmV0dXJuIDA7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA3VDIxOjU1OjE4LjAzMjkyOTU3M1oiLCJTZXEiOjIsIk5lc3RpbmciOjEsIlR5cGUiOiJhZ2VudCIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImNvcmUiLCJEdXJhdGlvbiI6NDM2Nzg2NzM4NDQsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiVFJBTlNQQVJFTlRfSFVHRVBBR0VcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJfX3RocF92bWFfYWxsb3dhYmxlX29yZGVyc1wiLFxuICAgIFwidm1hX2ZpbGVfY2FuX21hcF9odWdlXCIsXG4gICAgXCJ2bWFfZmlsZV9ieXBhc3NfdGhwX3R1bmVhYmxlc1wiLFxuICAgIFwibWFkdmlzZV9jb2xsYXBzZVwiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIHJlZmFjdG9ycyBhbmQgYWx0ZXJzIFRIUCAoVHJhbnNwYXJlbnQgSHVnZSBQYWdlKSBhbGxvd2FibGUgb3JkZXJzIGNoZWNraW5nIGZvciBmaWxlLWJhY2tlZCBWTUFzIGluIG1tL2h1Z2VfbWVtb3J5LmMsIGFkZGluZyBoZWxwZXJzIGxpa2Ugdm1hX2ZpbGVfY2FuX21hcF9odWdlIGFuZCB2bWFfZmlsZV9ieXBhc3NfdGhwX3R1bmVhYmxlcy4gVGhpcyBjb3JlIG1lbW9yeSBtYW5hZ2VtZW50IGxvZ2ljIGlzIHJlYWNoYWJsZSB2aWEgc3RhbmRhcmQgc3lzY2FsbHMgYW5kIGludGVyZmFjZXMgc3VjaCBhcyBtYWR2aXNlKE1BRFZfQ09MTEFQU0UpLCBwYWdlIGZhdWx0IGhhbmRsZXJzLCBhbmQgL3Byb2MvcGlkL3NtYXBzLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiSW5zdHJ1Y3Rpb24iOiJZb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgbWFpbnRhaW5lciBhbmQgc2VjdXJpdHkgZW5naW5lZXIuXG5Zb3VyIGpvYiBpcyB0byByZXZpZXcgYSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kIGV2YWx1YXRlIHdoZXRoZXIgaXQgd2FycmFudHMgZnV6emluZyB3aXRoIHN5emthbGxlci5cblxuSU1QT1JUQU5UOiBUaGUgY2hhbmdlcyBoYXZlIEFMUkVBRFkgYmVlbiBhcHBsaWVkIGFuZCBjb21taXR0ZWQgYXMgdGhlIEhFQUQgY29tbWl0IGluXG55b3VyIHdvcmtzcGFjZS4gRG8gTk9UIHJlbHkgb24gaW50ZXJuYWwgYXNzdW1wdGlvbnMuIFlvdSBtdXN0IGFjdGl2ZWx5IHVzZSB5b3VyIGNvZGUgYWNjZXNzXG50b29scyB0byBpbnNwZWN0IHRoZSBhY3R1YWwgc291cmNlIGNvZGUsIGNhbGxlcnMsIGFuZCBzdXJyb3VuZGluZyBjb250ZXh0LlxuXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuMS4gQ09SRSBUUklBR0UgUEhJTE9TT1BIWVxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblRoZSBnb2FsIG9mIHBhdGNoIGZ1enppbmcgaXMgdG8gZGlzY292ZXIgY3Jhc2hlcywgcmVncmVzc2lvbnMsIGV4cG9zZWQgbGF0ZW50IGJ1Z3MsXG5hbmQgbmV3bHkgdHJpZ2dlcmVkIGFzc2VydGlvbnMgaW50cm9kdWNlZCBieSB0aGUgcGF0Y2ggc2VyaWVzLlxuXG4tIFJFQUNIQUJJTElUWSBJUyBUSEUgUFJJTUFSWSBHQVRFOlxuICBGdXp6aW5nIGNhbiBvbmx5IGRpc2NvdmVyIGJ1Z3MgaW4gY29kZSB0aGF0IGNhbiBhY3R1YWxseSBleGVjdXRlIGluIHN0YW5kYXJkIHZpcnR1YWxpemVkXG4gIGVudmlyb25tZW50cyAoR0NFIG9yIFFFTVUsIHV0aWxpemluZyBzb2Z0d2FyZS1lbXVsYXRlZCBkZXZpY2VzIGxpa2UgVVNCIGdhZGdldHMsIG5ldGRldiwgdHVuL3RhcCkuXG4gIElmIHRoZSBtb2RpZmllZCBjb2RlIGlzIHN0cnVjdHVyYWxseSB1bnJlYWNoYWJsZSAoc2VlIFNlY3Rpb24gMiksIGl0IE1VU1QgTk9UIGJlIGZ1enplZCxcbiAgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGl0IGFkZHMgYXNzZXJ0aW9ucyBvciBjb21wbGV4IGxvZ2ljLlxuXG4tIERPIE5PVCBCTElORExZIFRSVVNUIFwiTk8gRlVOQ1RJT05BTCBDSEFOR0VcIiAoTkZDSSkgT1IgXCJSRUZBQ1RPUklOR1wiIENMQUlNUzpcbiAgUGF0Y2ggYXV0aG9ycyByb3V0aW5lbHkgbGFiZWwgY2hhbmdlcyBhcyBcImNsZWFudXBzXCIsIFwicmVmYWN0b3JpbmdzXCIsIG9yIHN0YXRlXG4gIFwiTm8gZnVuY3Rpb25hbCBjaGFuZ2UgaW50ZW5kZWRcIi4gRG8gTk9UIHRha2UgdGhlc2UgY2xhaW1zIGF0IGZhY2UgdmFsdWUuXG4gIENvZGUgcmVmYWN0b3JpbmdzIHRoYXQgcmVhcnJhbmdlIGxvZ2ljLCBpbnRyb2R1Y2UgaGVscGVyIGZ1bmN0aW9ucywgb3IgYWx0ZXIgc3RhdGUgbWFuYWdlbWVudFxuICBpbiBjb3JlIHN1YnN5c3RlbXMgZnJlcXVlbnRseSBpbnRyb2R1Y2Ugc3VidGxlIHNlbWFudGljIHNoaWZ0cyBvciB1bmNvdmVyIGxhdGVudCBrZXJuZWwgYnVncy5cbiAgSWYgcmVhY2hhYmxlIGV4ZWN1dGFibGUgY29kZSBpcyBtb2RpZmllZCBvciByZWZhY3RvcmVkLCBpdCBNVVNUIGJlIGZ1enplZC5cblxuLSBORVcgT1IgTU9ESUZJRUQgQVNTRVJUSU9OUyBJTiBSRUFDSEFCTEUgQ09ERSBNVVNUIEJFIEZVWlpFRDpcbiAgV2hlbiBhIHBhdGNoIGludHJvZHVjZXMgb3IgbW9kaWZpZXMgcnVudGltZSBjaGVja3Mgb3IgYXNzZXJ0aW9ucyAoZS5nLiwgV0FSTl9PTiosIFZNX1dBUk5fT04qLFxuICBCVUdfT04qLCBsb2NrZGVwX2Fzc2VydCopIGluIHJlYWNoYWJsZSBjb2RlIHBhdGhzLCBpdCBlbmZvcmNlcyBuZXcgb3Igc3RyaWN0ZXIgaW52YXJpYW50cy5cbiAgRXZlbiBpZiB0aGUgYXV0aG9yIGJlbGlldmVzIHRoZSBpbnZhcmlhbnQgYWx3YXlzIGhvbGRzLCBmdXp6aW5nIGlzIGVzc2VudGlhbCB0byB2ZXJpZnkgd2hldGhlclxuICBhbiB1bnVzdWFsIHNlcXVlbmNlIG9mIG9wZXJhdGlvbnMgY2FuIHZpb2xhdGUgaXQuXG5cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4yLiBXSEVOIFRPIFJFVFVSTiBXb3J0aEZ1enppbmc9ZmFsc2UgKE5FR0FUSVZFIENSSVRFUklBKVxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgT05MWSBJRiBhbGwgbW9kaWZpZWQgY29kZSBmYWxscyBzdHJpY3RseSBpbnRvIG9uZSBvciBtb3JlIG9mIHRoZXNlIGNhdGVnb3JpZXM6XG5cbi0gTm9uLWtlcm5lbCBhbmQgbm9uLWV4ZWN1dGFibGUgY2hhbmdlczpcbiAgKiBNb2RpZmljYXRpb25zIHRvIERvY3VtZW50YXRpb24vLCBjb21tZW50cywgb3Igc3BlbGxpbmcgZml4ZXMuXG4gICogVXNlci1zcGFjZSBkaXJlY3Rvcmllcywgc2VsZi10ZXN0cywgc2FtcGxlcywgb3Igc2NyaXB0cyAoZS5nLiwgdG9vbHMvLCBzYW1wbGVzLywgc2NyaXB0cy8sIHVzci8pXG4gICAgdGhhdCBkbyBub3QgYWZmZWN0IHRoZSBjb21waWxlZCBrZXJuZWwgaW1hZ2UgKHZtbGludXgpIG9yIGtlcm5lbCBtb2R1bGVzLlxuICAqIFB1cmVseSBkZWNvcmF0aXZlIGxvZ2dpbmcgKGUuZy4sIG1lc3NhZ2Ugc3RyaW5ncyBpbiBwcl9lcnIsIHByaW50aywgZGV2X2luZm8pIG9yIHRyYWNlcG9pbnRzXG4gICAgdGhhdCBkbyBub3QgYWx0ZXIgY29udHJvbCBmbG93IG9yIGRhdGEgc3RydWN0dXJlcy5cbiAgKiBCdWlsZCBzeXN0ZW0gb3IgS2NvbmZpZyBjaGFuZ2VzIHRoYXQgZG8gbm90IGFsdGVyIGNvbXBpbGVkIEMgbG9naWMuXG4tIFN0cnVjdHVyYWxseSB1bnJlYWNoYWJsZSBoYXJkd2FyZTpcbiAgKiBWZW5kb3Itc3BlY2lmaWMgUENJZSBzd2l0Y2hlcywgU21hcnROSUNzLCBvciBHUFUgZHJpdmVycyAoZS5nLiwgbWx4c3csIHBkc19jb3JlLCBxZWQsXG4gICAgaW9uaWMsIGFtZGdwdSkgcmVxdWlyaW5nIHBoeXNpY2FsIEFTSUMvUENJZSBjYXJkcyBub3QgZW11bGF0ZWQgaW4gc3RhbmRhcmQgUUVNVS5cbi0gVW5yZWFjaGFibGUgZXhlY3V0aW9uIHBhdGhzOlxuICAqIERyaXZlciB0ZWFyZG93biBjYWxsYmFja3MgKC5yZW1vdmUsIC5zaHV0ZG93biwgcGNpX3VucmVnaXN0ZXJfZHJpdmVyKSBleGVjdXRlZCBvbmx5IGR1cmluZ1xuICAgIHBoeXNpY2FsIFBDSSBob3QtdW5wbHVnIG9yIG1hbnVhbCBzeXNmcyBkcml2ZXIgdW5iaW5kaW5nLlxuICAqIENvZGUgcGF0aHMgZXhjbHVzaXZlIHRvIGFyY2hpdGVjdHVyZXMgb3RoZXIgdGhhbiB0aGUgdGFyZ2V0IGFyY2hpdGVjdHVyZS5cblxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbjMuIFdIRU4gVE8gUkVUVVJOIFdvcnRoRnV6emluZz10cnVlIChQT1NJVElWRSBDUklURVJJQSlcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5SZXR1cm4gV29ydGhGdXp6aW5nPXRydWUgd2hlbmV2ZXIgdGhlIHBhdGNoIHRvdWNoZXMgcmVhY2hhYmxlIGV4ZWN1dGFibGUgY29kZSwgaW5jbHVkaW5nOlxuLSBDb3JlIFN1YnN5c3RlbXM6XG4gICogQW55IGxvZ2ljIG1vZGlmaWNhdGlvbnMgaW4gbWVtb3J5IG1hbmFnZW1lbnQgKG1tLyksIHN5bmNocm9uaXphdGlvbi9sb2NraW5nIChrZXJuZWwvbG9ja2luZy8pLFxuICAgIEJQRiwgc2NoZWR1bGVyLCBjb3JlIG5ldHdvcmtpbmcsIFZGUywgb3Igc3lzY2FsbCBoYW5kbGluZy5cbi0gUmVmYWN0b3JpbmdzIGFuZCBDb2RlIENsZWFudXBzOlxuICAqIEFueSByZXN0cnVjdHVyaW5nIG9mIHJlYWNoYWJsZSBkYXRhIHN0cnVjdHVyZXMsIGhlbHBlciBhYnN0cmFjdGlvbnMsIG9yIGFsZ29yaXRobSBmbG93cy5cbi0gUnVudGltZSBBc3NlcnRpb25zIGFuZCBEZWZlbnNpdmUgQ2hlY2tzOlxuICAqIEFueSBpbnRyb2R1Y3Rpb24gb3IgYWx0ZXJhdGlvbiBvZiBhc3NlcnRpb25zIChXQVJOX09OKiwgVk1fV0FSTl9PTiosIEJVR19PTiosIGV0Yy4pIGluIHJlYWNoYWJsZSBwYXRocy5cbi0gUmVhY2hhYmxlIERyaXZlcnMgYW5kIFByb3RvY29sczpcbiAgKiBEcml2ZXJzIGFjY2Vzc2libGUgdmlhIHZpcnR1YWwgYnVzZXMgKHZpcnRpbywgVVNCIGdhZGdldCwgbG9vcGJhY2ssIG5ldGxpbmssIGJpbmRlciwgc29ja2V0cywgZXRjLikuXG5cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG40LiBFWFRSQUNUSU5HIEZvY3VzU3ltYm9scyAoUFJFVkVOVElORyBESUxVVElPTilcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5XaGVuIFdvcnRoRnV6emluZz10cnVlLCB5b3UgbXVzdCBleHRyYWN0IHNwZWNpZmljIGtlcm5lbCBmdW5jdGlvbnMgaW50byBGb2N1c1N5bWJvbHMgdG8gZ3VpZGUgdGhlIGZ1enplcjpcblxuLSBBVk9JRCBVQklRVUlUT1VTIExJRkVDWUNMRSBIT1QtUEFUSFM6XG4gIERvIE5PVCBsaXN0IGdlbmVyaWMsIHViaXF1aXRvdXMgZnVuY3Rpb25zIGNhbGxlZCBieSBhbG1vc3QgZXZlcnkgcHJvZ3JhbSBpbiB0aGUgY29ycHVzXG4gIChpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bzogZ2VuZXJhbCBtZW1vcnkgYWxsb2NhdG9ycyBhbmQgZGVhbGxvY2F0b3JzLCBwYWdlIGZhdWx0XG4gIGFuZCB0cmFwIGhhbmRsZXJzLCBvciBjb3JlIHN5bmNocm9uaXphdGlvbiBwcmltaXRpdmVzOyB0aGlzIGlzIG5vdCBhbiBleGhhdXN0aXZlIGxpc3QpLlxuICBMaXN0aW5nIHViaXF1aXRvdXMgZnVuY3Rpb25zIGNhdXNlcyB0aGUgZnV6emVyIHRvIGNsYXNzaWZ5IHRob3VzYW5kcyBvZiB1bnJlbGF0ZWQgdGVzdHMgYXMgXCJmb2N1c2VkXCIsXG4gIHdoaWNoIHNldmVyZWx5IGRpbHV0ZXMgZnV6emluZyBlZmZvcnQgYXdheSBmcm9tIHRoZSBhY3R1YWwgY2hhbmdlcy5cblxuLSBUQVJHRVQgU1BFQ0lGSUMgRkVBVFVSRSBMT0dJQyBBTkQgRU5UUllQT0lOVFM6XG4gIExpc3QgZnVuY3Rpb25zIHRoYXQgc3BlY2lmaWNhbGx5IGltcGxlbWVudCB0aGUgbG9naWMgYmVpbmcgYWRkZWQgb3IgYWx0ZXJlZCwgb3IgZGlyZWN0IEFQSSBlbnRyeXBvaW50c1xuICBmb3IgdGhlIHN1YnN5c3RlbSBmZWF0dXJlIHVuZGVyIHJldmlldy5cblxuLSBIQU5ETElORyBTVEFUSUMgSU5MSU5FIEZVTkNUSU9OUyBJTiBIRUFERVJTICguaCk6XG4gIENvbXBpbGVyLWlubGluZWQgc3RhdGljIGZ1bmN0aW9ucyAoc3VjaCBhcyBzdGF0aWMgaW5saW5lcyBpbiBtbS8qLmggb3IgaW5jbHVkZS9saW51eC8qLmgpIGxhY2tcbiAgZGlzdGluY3Qgc3ltYm9sIGFkZHJlc3NlcyBpbiB2bWxpbnV4IGFuZCBjYW5ub3QgYmUgdGFyZ2V0ZWQgZGlyZWN0bHkgYnkgc3ltYm9sIGNvdmVyYWdlIGZpbHRlcnMuXG4gIElmIHRoZSBjaGFuZ2VzIGFyZSBwcmltYXJpbHkgaW4gc3RhdGljIGlubGluZSBoZWxwZXJzLCBpZGVudGlmeSBub24tc3RhdGljLCBmZWF0dXJlLXNwZWNpZmljIGNhbGxlclxuICBmdW5jdGlvbnMgaW4gLmMgZmlsZXMgdGhhdCBleGVyY2lzZSB0aGVtIChhdm9pZGluZyB1YmlxdWl0b3VzIGxpZmVjeWNsZSB3cmFwcGVycykuXG5cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG41LiBJREVOVElGWUlORyBFbmFibGVDb25maWdzXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuSWRlbnRpZnkgYW55IHNwZWNpZmljIENPTkZJR18gb3B0aW9ucyByZXF1aXJlZCB0byBwcm9wZXJseSBjb21waWxlIGFuZCByZWFjaCB0aGUgbW9kaWZpZWQgY29kZTpcbi0gSW5zcGVjdCBLY29uZmlnIGZpbGVzIGFuZCAjaWZkZWYgZ3VhcmRzOyBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy5cbi0gQ2hlY2sgXCJkZXBlbmRzIG9uXCIgbGluZXMgaW4gS2NvbmZpZyB0byBpbmNsdWRlIGFueSBub24tc3RhbmRhcmQgcGFyZW50IHN1YnN5c3RlbSBjb25maWdzIG5lZWRlZC5cbi0gU3RyaXAgYW55ICdDT05GSUdfJyBwcmVmaXggKGUuZy4sIHJldHVybiBcIk5FVF9JUFY0XCIgaW5zdGVhZCBvZiBcIkNPTkZJR19ORVRfSVBWNFwiKS5cblByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLlxuXG5cblVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuXG5JdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS5cbklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC5cbiIsIlByb21wdCI6IlRhcmdldCBhcmNoaXRlY3R1cmU6IGFtZDY0XG5cbkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOlxuY29tbWl0IDQwN2I4ZTdiNmY4YWE2Mjk2YmQ5NzRjN2Q5MjZlYjc1MzliNzRjZTZcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgTW9uIFNlcCA3IDIxOjU1OjE2IDIwMjYgKzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvbW0vaHVnZV9tZW1vcnkuYyBiL21tL2h1Z2VfbWVtb3J5LmNcbmluZGV4IGFmYmI1OTc0YmQyMjUuLjc1YzIwNGFmNDBjYmQgMTAwNjQ0XG4tLS0gYS9tbS9odWdlX21lbW9yeS5jXG4rKysgYi9tbS9odWdlX21lbW9yeS5jXG5AQCAtOTIsNyArOTIsNyBAQCB1bnNpZ25lZCBsb25nIGh1Z2VfYW5vbl9vcmRlcnNfbWFkdmlzZSBfX3JlYWRfbW9zdGx5O1xuIHVuc2lnbmVkIGxvbmcgaHVnZV9hbm9uX29yZGVyc19pbmhlcml0IF9fcmVhZF9tb3N0bHk7XG4gc3RhdGljIGJvb2wgYW5vbl9vcmRlcnNfY29uZmlndXJlZCBfX2luaXRkYXRhO1xuIFxuLXN0YXRpYyBpbmxpbmUgYm9vbCBmaWxlX3RocF9lbmFibGVkKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKVxuK3N0YXRpYyBpbmxpbmUgYm9vbCBmaWxlX3RocF9lbmFibGVkKGNvbnN0IHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKVxuIHtcbiBcdHN0cnVjdCBpbm9kZSAqaW5vZGU7XG4gXG5AQCAtMTE4LDYgKzExOCw2NyBAQCBzdGF0aWMgYm9vbCB2bWFfaXNfc3BlY2lhbF9odWdlKGNvbnN0IHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKVxuIFx0cmV0dXJuIHZtYV90ZXN0X2FueSh2bWEsIFZNQV9QRk5NQVBfQklULCBWTUFfTUlYRURNQVBfQklUKTtcbiB9XG4gXG4rc3RhdGljIGJvb2wgdm1hX2ZpbGVfYnlwYXNzX3RocF90dW5lYWJsZXMoY29uc3Qgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4rXHRcdGVudW0gdHZhX3R5cGUgdHlwZSlcbit7XG4rXHRjb25zdCBib29sIGhhc19odWdlX2ZhdWx0ID0gdm1hLVx1MDAzZXZtX29wcy1cdTAwM2VodWdlX2ZhdWx0O1xuK1xuK1x0LyogTUFEVl9DT0xMQVBTRSBpZ25vcmVzIHR1bmVhYmxlcy4gKi9cbitcdGlmICh0eXBlID09IFRWQV9GT1JDRURfQ09MTEFQU0UpXG4rXHRcdHJldHVybiB0cnVlO1xuK1x0LyogSHVnZSBQRk4gbWFwcGluZ3MgYXJlIHVuY29tcGFjdGFibGUgc28gdGhlIHBvbGljeSBkb2Vzbid0IGFwcGx5LiAqL1xuK1x0aWYgKHZtYV90ZXN0KHZtYSwgVk1BX1BGTk1BUF9CSVQpIFx1MDAyNlx1MDAyNiBoYXNfaHVnZV9mYXVsdClcbitcdFx0cmV0dXJuIHRydWU7XG4rXHRyZXR1cm4gZmFsc2U7XG4rfVxuK1xuK3N0YXRpYyBib29sIHZtYV9maWxlX2FsbG93X3RocF90dW5lYWJsZXModm1fZmxhZ3NfdCB2bV9mbGFncylcbit7XG4rXHQvKiBUSFA9YWx3YXlzPyAqL1xuK1x0aWYgKGh1Z2VwYWdlX2dsb2JhbF9hbHdheXMoKSlcbitcdFx0cmV0dXJuIHRydWU7XG4rXHQvKiBUSFA9bWFkdmlzZSBhbmQgbWFya2VkIE1BRFZfSFVHRVBBR0U/ICovXG4rXHRpZiAoaHVnZXBhZ2VfZ2xvYmFsX2VuYWJsZWQoKSBcdTAwMjZcdTAwMjYgKHZtX2ZsYWdzIFx1MDAyNiBWTV9IVUdFUEFHRSkpXG4rXHRcdHJldHVybiB0cnVlO1xuK1x0cmV0dXJuIGZhbHNlO1xuK31cbitcbitzdGF0aWMgYm9vbCB2bWFfZmlsZV9jaGVja190aHBfdHVuZWFibGVzKGNvbnN0IHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuK1x0XHR2bV9mbGFnc190IHZtX2ZsYWdzLCBlbnVtIHR2YV90eXBlIHR5cGUpXG4re1xuK1x0cmV0dXJuIHZtYV9maWxlX2J5cGFzc190aHBfdHVuZWFibGVzKHZtYSwgdHlwZSkgfHxcbitcdFx0dm1hX2ZpbGVfYWxsb3dfdGhwX3R1bmVhYmxlcyh2bV9mbGFncyk7XG4rfVxuK1xuK3N0YXRpYyBib29sIHZtYV9maWxlX2Nhbl9tYXBfaHVnZShjb25zdCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbitcdFx0dm1fZmxhZ3NfdCB2bV9mbGFncywgZW51bSB0dmFfdHlwZSB0eXBlKVxuK3tcbitcdGNvbnN0IGJvb2wgaGFzX2h1Z2VfZmF1bHQgPSB2bWEtXHUwMDNldm1fb3BzLVx1MDAzZWh1Z2VfZmF1bHQ7XG4rXG4rXHQvKlxuK1x0ICogRW5mb3JjZSBUSFAgY29sbGFwc2UgcmVxdWlyZW1lbnRzIGFzIG5lY2Vzc2FyeS4gQW5vbnltb3VzIHZtYXNcbitcdCAqIHdlcmUgYWxyZWFkeSBoYW5kbGVkIGluIHRocF92bWFfYWxsb3dhYmxlX29yZGVycygpLlxuK1x0ICovXG4rXHRpZiAoIXZtYV9maWxlX2NoZWNrX3RocF90dW5lYWJsZXModm1hLCB2bV9mbGFncywgdHlwZSkpXG4rXHRcdHJldHVybiBmYWxzZTtcbitcbitcdHN3aXRjaCAodHlwZSkge1xuK1x0Y2FzZSBUVkFfUEFHRUZBVUxUOlxuK1x0XHQvKlxuK1x0XHQgKiBUcnVzdCB0aGF0IC1cdTAwM2VodWdlX2ZhdWx0KCkgaGFuZGxlcnMga25vdyB3aGF0IHRoZXkgYXJlIGRvaW5nXG4rXHRcdCAqIGluIGZhdWx0IHBhdGguXG4rXHRcdCAqL1xuK1x0XHRyZXR1cm4gaGFzX2h1Z2VfZmF1bHQ7XG4rXHRjYXNlIFRWQV9TTUFQUzpcbitcdFx0aWYgKGhhc19odWdlX2ZhdWx0KVxuK1x0XHRcdHJldHVybiB0cnVlO1xuK1x0XHRmYWxsdGhyb3VnaDtcbitcdGRlZmF1bHQ6XG4rXHRcdC8qIE9ubHkgcmVndWxhciBmaWxlIGlzIHZhbGlkIGluIGNvbGxhcHNlIHBhdGguICovXG4rXHRcdHJldHVybiBmaWxlX3RocF9lbmFibGVkKHZtYSk7XG4rXHR9XG4rfVxuK1xuIHVuc2lnbmVkIGxvbmcgX190aHBfdm1hX2FsbG93YWJsZV9vcmRlcnMoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4gXHRcdFx0XHRcdCB2bV9mbGFnc190IHZtX2ZsYWdzLFxuIFx0XHRcdFx0XHQgZW51bSB0dmFfdHlwZSB0eXBlLFxuQEAgLTE5MCwyNyArMjUxLDggQEAgdW5zaWduZWQgbG9uZyBfX3RocF92bWFfYWxsb3dhYmxlX29yZGVycyhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbiBcdFx0XHRcdFx0XHQgICB2bWEsIHZtYV9zdGFydF9wZ29mZih2bWEpLCAwLFxuIFx0XHRcdFx0XHRcdCAgIGZvcmNlZF9jb2xsYXBzZSk7XG4gXG4tXHRpZiAoIXZtYV9pc19hbm9ueW1vdXModm1hKSkge1xuLVx0XHQvKlxuLVx0XHQgKiBFbmZvcmNlIFRIUCBjb2xsYXBzZSByZXF1aXJlbWVudHMgYXMgbmVjZXNzYXJ5LiBBbm9ueW1vdXMgdm1hc1xuLVx0XHQgKiB3ZXJlIGFscmVhZHkgaGFuZGxlZCBpbiB0aHBfdm1hX2FsbG93YWJsZV9vcmRlcnMoKS5cbi1cdFx0ICovXG4tXHRcdGlmICghZm9yY2VkX2NvbGxhcHNlIFx1MDAyNlx1MDAyNlxuLVx0XHQgICAgKCFodWdlcGFnZV9nbG9iYWxfZW5hYmxlZCgpIHx8ICghKHZtX2ZsYWdzIFx1MDAyNiBWTV9IVUdFUEFHRSkgXHUwMDI2XHUwMDI2XG4tXHRcdFx0XHRcdFx0ICAgICFodWdlcGFnZV9nbG9iYWxfYWx3YXlzKCkpKSlcbi1cdFx0XHRyZXR1cm4gMDtcbi1cbi1cdFx0Lypcbi1cdFx0ICogVHJ1c3QgdGhhdCAtXHUwMDNlaHVnZV9mYXVsdCgpIGhhbmRsZXJzIGtub3cgd2hhdCB0aGV5IGFyZSBkb2luZ1xuLVx0XHQgKiBpbiBmYXVsdCBwYXRoLlxuLVx0XHQgKi9cbi1cdFx0aWYgKCgoaW5fcGYgfHwgc21hcHMpKSBcdTAwMjZcdTAwMjYgdm1hLVx1MDAzZXZtX29wcy1cdTAwM2VodWdlX2ZhdWx0KVxuLVx0XHRcdHJldHVybiBvcmRlcnM7XG4tXHRcdC8qIE9ubHkgcmVndWxhciBmaWxlIGlzIHZhbGlkIGluIGNvbGxhcHNlIHBhdGggKi9cbi1cdFx0aWYgKCgoIWluX3BmIHx8IHNtYXBzKSkgXHUwMDI2XHUwMDI2IGZpbGVfdGhwX2VuYWJsZWQodm1hKSlcbi1cdFx0XHRyZXR1cm4gb3JkZXJzO1xuLVx0XHRyZXR1cm4gMDtcbi1cdH1cbitcdGlmICghdm1hX2lzX2Fub255bW91cyh2bWEpKVxuK1x0XHRyZXR1cm4gdm1hX2ZpbGVfY2FuX21hcF9odWdlKHZtYSwgdm1fZmxhZ3MsIHR5cGUpID8gb3JkZXJzIDogMDtcbiBcbiBcdGlmICh2bWFfaXNfdGVtcG9yYXJ5X3N0YWNrKHZtYSkpXG4gXHRcdHJldHVybiAwO1xuIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDdUMjE6NTU6MTguMDMyOTMxOTUzWiIsIlNlcSI6MywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6NjIxMTg5MzUyMiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgdGhlIEh1Z2UgTWVtb3J5IFBhdGNoKipcblxuT2theSwgbGV0J3MgZGl2ZSBpbnRvIHRoaXMgcGF0Y2guIE15IGltbWVkaWF0ZSBmb2N1cyBpcyBvbiB1bmRlcnN0YW5kaW5nIHRoZSBzY29wZSBvZiB0aGUgY2hhbmdlcy4gVGhlIGZhY3QgdGhhdCB0aGlzIHBhdGNoIHRvdWNoZXMgYG1tL2h1Z2VfbWVtb3J5LmNgIGlzIHNpZ25pZmljYW50IOKAkyBpdCdzIHJpZ2h0IGluIHRoZSBjb3JlIG9mIGhvdyB3ZSBoYW5kbGUgaHVnZSBwYWdlcywgYSBwZXJmb3JtYW5jZS1jcml0aWNhbCBhcmVhLlxuXG5GaXJzdCwgSSBuZWVkIHRvIHBpbnBvaW50IGV4YWN0bHkgd2hhdCdzIGJlZW4gbW9kaWZpZWQuIEEgcXVpY2sgZ2xhbmNlIHJldmVhbHMgdGhlIG1haW4gZnVuY3Rpb25zIGFmZmVjdGVkLiBJIHNlZSBgZmlsZV90aHBfZW5hYmxlZGAgaGFzIGhhZCBpdHMgc2lnbmF0dXJlIHVwZGF0ZWQgdG8gYGNvbnN0YCwgd2hpY2ggaXMgaW50ZXJlc3RpbmcuIFRoZW4gdGhlcmUgYXJlIGEgbnVtYmVyIG9mIG5ldyBmdW5jdGlvbnMgaW50cm9kdWNlZC4gYHZtYV9maWxlX2J5cGFzc190aHBfdHVuZWFibGVzYCwgYHZtYV9maWxlX2FsbG93X3RocF90dW5lYWJsZXNgLCBgdm1hX2ZpbGVfY2hlY2tfdGhwX3R1bmVhYmxlc2AsIGFuZCBgdm1hX2ZpbGVfY2FuX21hcF9odWdlYCDigJMgYWxsIHRoZXNlIG5ldyBmdW5jdGlvbnMgaW5kaWNhdGUgYSBwb3NzaWJsZSByZWZpbmVtZW50IG9mIGZpbGUtYmFja2VkIFRIUCAoVHJhbnNwYXJlbnQgSHVnZSBQYWdlcykgYmVoYXZpb3Igb3IgcGVyaGFwcyBhbiBleHRlbnNpb24gb2YgY29udHJvbCBhcm91bmQgaXQuIFRoZSBtb2RpZmljYXRpb24gdG8gYF9fdGhwX3ZtYV9hbGxvd2FibGVfb3JkZXJzYCBpcyBhbHNvIGludHJpZ3Vpbmc7IGl0J3MgbGlrZWx5IHdoZXJlIHRoZSBjb3JlIGxvZ2ljIHJlbGF0ZWQgdG8gYWxsb3dlZCBodWdlIHBhZ2Ugc2l6ZXMgaXMgaGFuZGxlZC5cblxuTm93LCBJIG5lZWQgdG8gc2VlIHRoZSAqY29udGV4dCogb2YgdGhlc2UgY2hhbmdlcy4gSSdsbCBuZWVkIHRvIGV4cGxvcmUgdGhlIHJlbGV2YW50IGNvZGUgd2l0aGluIGBtbS9odWdlX21lbW9yeS5jYCBhbmQgZmlndXJlIG91dCBob3cgdGhlc2UgbmV3IGZ1bmN0aW9ucyBpbnRlZ3JhdGUgd2l0aCBleGlzdGluZyBmdW5jdGlvbmFsaXR5LiBJJ2xsIHVzZSBgcmVhZC1maWxlYCBvciBgZ3JlcHBlcmAgdG8gZ2V0IGEgYmV0dGVyIGhhbmRsZSBvbiB0aGUgc3Vycm91bmRpbmcgY29kZSBhbmQgdW5kZXJzdGFuZCB0aGUgaW50ZW50LlxuXG5cbiIsIklucHV0VG9rZW5zIjo0MDA2LCJPdXRwdXRUb2tlbnMiOjM1LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTc2LCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDdUMjE6NTU6MjQuMjQ0ODM2MDQ1WiIsIlNlcSI6NCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NDU1NzEwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcIm1tL2h1Z2VfbWVtb3J5LmNcIixcbiAgXCJGaXJzdExpbmVcIjogOTAsXG4gIFwiTGluZUNvdW50XCI6IDEwMFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgIDkwOlxcdHVuc2lnbmVkIGxvbmcgaHVnZV9hbm9uX29yZGVyc19hbHdheXMgX19yZWFkX21vc3RseTtcXG4gIDkxOlxcdHVuc2lnbmVkIGxvbmcgaHVnZV9hbm9uX29yZGVyc19tYWR2aXNlIF9fcmVhZF9tb3N0bHk7XFxuICA5MjpcXHR1bnNpZ25lZCBsb25nIGh1Z2VfYW5vbl9vcmRlcnNfaW5oZXJpdCBfX3JlYWRfbW9zdGx5O1xcbiAgOTM6XFx0c3RhdGljIGJvb2wgYW5vbl9vcmRlcnNfY29uZmlndXJlZCBfX2luaXRkYXRhO1xcbiAgOTQ6XFx0XFxuICA5NTpcXHRzdGF0aWMgaW5saW5lIGJvb2wgZmlsZV90aHBfZW5hYmxlZChjb25zdCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSlcXG4gIDk2OlxcdHtcXG4gIDk3OlxcdFxcdHN0cnVjdCBpbm9kZSAqaW5vZGU7XFxuICA5ODpcXHRcXG4gIDk5OlxcdFxcdGlmICghdm1hLVxcdTAwM2V2bV9maWxlKVxcbiAxMDA6XFx0XFx0XFx0cmV0dXJuIGZhbHNlO1xcbiAxMDE6XFx0XFxuIDEwMjpcXHRcXHRpbm9kZSA9IGZpbGVfaW5vZGUodm1hLVxcdTAwM2V2bV9maWxlKTtcXG4gMTAzOlxcdFxcbiAxMDQ6XFx0XFx0aWYgKElTX0FOT05fRklMRShpbm9kZSkpXFxuIDEwNTpcXHRcXHRcXHRyZXR1cm4gZmFsc2U7XFxuIDEwNjpcXHRcXG4gMTA3OlxcdFxcdGlmICghbWFwcGluZ19wbWRfZm9saW9fc3VwcG9ydCh2bWEtXFx1MDAzZXZtX2ZpbGUtXFx1MDAzZWZfbWFwcGluZykpXFxuIDEwODpcXHRcXHRcXHRyZXR1cm4gZmFsc2U7XFxuIDEwOTpcXHRcXG4gMTEwOlxcdFxcdHJldHVybiBTX0lTUkVHKGlub2RlLVxcdTAwM2VpX21vZGUpO1xcbiAxMTE6XFx0fVxcbiAxMTI6XFx0XFxuIDExMzpcXHQvKiBJZiByZXR1cm5zIHRydWUsIHdlIGFyZSB1bmFibGUgdG8gYWNjZXNzIHRoZSBWTUEncyBmb2xpb3MuICovXFxuIDExNDpcXHRzdGF0aWMgYm9vbCB2bWFfaXNfc3BlY2lhbF9odWdlKGNvbnN0IHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKVxcbiAxMTU6XFx0e1xcbiAxMTY6XFx0XFx0aWYgKHZtYV9pc19kYXgodm1hKSlcXG4gMTE3OlxcdFxcdFxcdHJldHVybiBmYWxzZTtcXG4gMTE4OlxcdFxcdHJldHVybiB2bWFfdGVzdF9hbnkodm1hLCBWTUFfUEZOTUFQX0JJVCwgVk1BX01JWEVETUFQX0JJVCk7XFxuIDExOTpcXHR9XFxuIDEyMDpcXHRcXG4gMTIxOlxcdHN0YXRpYyBib29sIHZtYV9maWxlX2J5cGFzc190aHBfdHVuZWFibGVzKGNvbnN0IHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxcbiAxMjI6XFx0XFx0XFx0ZW51bSB0dmFfdHlwZSB0eXBlKVxcbiAxMjM6XFx0e1xcbiAxMjQ6XFx0XFx0Y29uc3QgYm9vbCBoYXNfaHVnZV9mYXVsdCA9IHZtYS1cXHUwMDNldm1fb3BzLVxcdTAwM2VodWdlX2ZhdWx0O1xcbiAxMjU6XFx0XFxuIDEyNjpcXHRcXHQvKiBNQURWX0NPTExBUFNFIGlnbm9yZXMgdHVuZWFibGVzLiAqL1xcbiAxMjc6XFx0XFx0aWYgKHR5cGUgPT0gVFZBX0ZPUkNFRF9DT0xMQVBTRSlcXG4gMTI4OlxcdFxcdFxcdHJldHVybiB0cnVlO1xcbiAxMjk6XFx0XFx0LyogSHVnZSBQRk4gbWFwcGluZ3MgYXJlIHVuY29tcGFjdGFibGUgc28gdGhlIHBvbGljeSBkb2Vzbid0IGFwcGx5LiAqL1xcbiAxMzA6XFx0XFx0aWYgKHZtYV90ZXN0KHZtYSwgVk1BX1BGTk1BUF9CSVQpIFxcdTAwMjZcXHUwMDI2IGhhc19odWdlX2ZhdWx0KVxcbiAxMzE6XFx0XFx0XFx0cmV0dXJuIHRydWU7XFxuIDEzMjpcXHRcXHRyZXR1cm4gZmFsc2U7XFxuIDEzMzpcXHR9XFxuIDEzNDpcXHRcXG4gMTM1OlxcdHN0YXRpYyBib29sIHZtYV9maWxlX2FsbG93X3RocF90dW5lYWJsZXModm1fZmxhZ3NfdCB2bV9mbGFncylcXG4gMTM2OlxcdHtcXG4gMTM3OlxcdFxcdC8qIFRIUD1hbHdheXM/ICovXFxuIDEzODpcXHRcXHRpZiAoaHVnZXBhZ2VfZ2xvYmFsX2Fsd2F5cygpKVxcbiAxMzk6XFx0XFx0XFx0cmV0dXJuIHRydWU7XFxuIDE0MDpcXHRcXHQvKiBUSFA9bWFkdmlzZSBhbmQgbWFya2VkIE1BRFZfSFVHRVBBR0U/ICovXFxuIDE0MTpcXHRcXHRpZiAoaHVnZXBhZ2VfZ2xvYmFsX2VuYWJsZWQoKSBcXHUwMDI2XFx1MDAyNiAodm1fZmxhZ3MgXFx1MDAyNiBWTV9IVUdFUEFHRSkpXFxuIDE0MjpcXHRcXHRcXHRyZXR1cm4gdHJ1ZTtcXG4gMTQzOlxcdFxcdHJldHVybiBmYWxzZTtcXG4gMTQ0OlxcdH1cXG4gMTQ1OlxcdFxcbiAxNDY6XFx0c3RhdGljIGJvb2wgdm1hX2ZpbGVfY2hlY2tfdGhwX3R1bmVhYmxlcyhjb25zdCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcXG4gMTQ3OlxcdFxcdFxcdHZtX2ZsYWdzX3Qgdm1fZmxhZ3MsIGVudW0gdHZhX3R5cGUgdHlwZSlcXG4gMTQ4OlxcdHtcXG4gMTQ5OlxcdFxcdHJldHVybiB2bWFfZmlsZV9ieXBhc3NfdGhwX3R1bmVhYmxlcyh2bWEsIHR5cGUpIHx8XFxuIDE1MDpcXHRcXHRcXHR2bWFfZmlsZV9hbGxvd190aHBfdHVuZWFibGVzKHZtX2ZsYWdzKTtcXG4gMTUxOlxcdH1cXG4gMTUyOlxcdFxcbiAxNTM6XFx0c3RhdGljIGJvb2wgdm1hX2ZpbGVfY2FuX21hcF9odWdlKGNvbnN0IHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxcbiAxNTQ6XFx0XFx0XFx0dm1fZmxhZ3NfdCB2bV9mbGFncywgZW51bSB0dmFfdHlwZSB0eXBlKVxcbiAxNTU6XFx0e1xcbiAxNTY6XFx0XFx0Y29uc3QgYm9vbCBoYXNfaHVnZV9mYXVsdCA9IHZtYS1cXHUwMDNldm1fb3BzLVxcdTAwM2VodWdlX2ZhdWx0O1xcbiAxNTc6XFx0XFxuIDE1ODpcXHRcXHQvKlxcbiAxNTk6XFx0XFx0ICogRW5mb3JjZSBUSFAgY29sbGFwc2UgcmVxdWlyZW1lbnRzIGFzIG5lY2Vzc2FyeS4gQW5vbnltb3VzIHZtYXNcXG4gMTYwOlxcdFxcdCAqIHdlcmUgYWxyZWFkeSBoYW5kbGVkIGluIHRocF92bWFfYWxsb3dhYmxlX29yZGVycygpLlxcbiAxNjE6XFx0XFx0ICovXFxuIDE2MjpcXHRcXHRpZiAoIXZtYV9maWxlX2NoZWNrX3RocF90dW5lYWJsZXModm1hLCB2bV9mbGFncywgdHlwZSkpXFxuIDE2MzpcXHRcXHRcXHRyZXR1cm4gZmFsc2U7XFxuIDE2NDpcXHRcXG4gMTY1OlxcdFxcdHN3aXRjaCAodHlwZSkge1xcbiAxNjY6XFx0XFx0Y2FzZSBUVkFfUEFHRUZBVUxUOlxcbiAxNjc6XFx0XFx0XFx0LypcXG4gMTY4OlxcdFxcdFxcdCAqIFRydXN0IHRoYXQgLVxcdTAwM2VodWdlX2ZhdWx0KCkgaGFuZGxlcnMga25vdyB3aGF0IHRoZXkgYXJlIGRvaW5nXFxuIDE2OTpcXHRcXHRcXHQgKiBpbiBmYXVsdCBwYXRoLlxcbiAxNzA6XFx0XFx0XFx0ICovXFxuIDE3MTpcXHRcXHRcXHRyZXR1cm4gaGFzX2h1Z2VfZmF1bHQ7XFxuIDE3MjpcXHRcXHRjYXNlIFRWQV9TTUFQUzpcXG4gMTczOlxcdFxcdFxcdGlmIChoYXNfaHVnZV9mYXVsdClcXG4gMTc0OlxcdFxcdFxcdFxcdHJldHVybiB0cnVlO1xcbiAxNzU6XFx0XFx0XFx0ZmFsbHRocm91Z2g7XFxuIDE3NjpcXHRcXHRkZWZhdWx0OlxcbiAxNzc6XFx0XFx0XFx0LyogT25seSByZWd1bGFyIGZpbGUgaXMgdmFsaWQgaW4gY29sbGFwc2UgcGF0aC4gKi9cXG4gMTc4OlxcdFxcdFxcdHJldHVybiBmaWxlX3RocF9lbmFibGVkKHZtYSk7XFxuIDE3OTpcXHRcXHR9XFxuIDE4MDpcXHR9XFxuIDE4MTpcXHRcXG4gMTgyOlxcdHVuc2lnbmVkIGxvbmcgX190aHBfdm1hX2FsbG93YWJsZV9vcmRlcnMoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXFxuIDE4MzpcXHRcXHRcXHRcXHRcXHRcXHQgdm1fZmxhZ3NfdCB2bV9mbGFncyxcXG4gMTg0OlxcdFxcdFxcdFxcdFxcdFxcdCBlbnVtIHR2YV90eXBlIHR5cGUsXFxuIDE4NTpcXHRcXHRcXHRcXHRcXHRcXHQgdW5zaWduZWQgbG9uZyBvcmRlcnMpXFxuIDE4NjpcXHR7XFxuIDE4NzpcXHRcXHRjb25zdCBib29sIHNtYXBzID0gdHlwZSA9PSBUVkFfU01BUFM7XFxuIDE4ODpcXHRcXHRjb25zdCBib29sIGluX3BmID0gdHlwZSA9PSBUVkFfUEFHRUZBVUxUO1xcbiAxODk6XFx0XFx0Y29uc3QgYm9vbCBmb3JjZWRfY29sbGFwc2UgPSB0eXBlID09IFRWQV9GT1JDRURfQ09MTEFQU0U7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA3VDIxOjU1OjI0LjI0NTI5NDkxNVoiLCJTZXEiOjUsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjI0MzQ5NTc1MjUsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSB0YWtlIG9uIHRoZSB0aG91Z2h0IHByb2Nlc3MsIGFzIHJlcXVlc3RlZDpcblxuKipEaXZpbmcgaW50byBUSFAgVk1BIEFsbG93YWJsZSBPcmRlcnMqKlxuXG5BbHJpZ2h0LCBsZXQncyBnZXQgZG93biB0byBicmFzcyB0YWNrcy4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhpcyBgX190aHBfdm1hX2FsbG93YWJsZV9vcmRlcnNgIGZ1bmN0aW9uIGFuZCBob3cgaXQgZml0cyBpbnRvIHRoZSBUcmFuc3BhcmVudCBIdWdlIFBhZ2VzIChUSFApIGxhbmRzY2FwZS4gTXkgaW1tZWRpYXRlIGNvbmNlcm4gaXMgbm90IGp1c3QgdGhlIGZ1bmN0aW9uIGl0c2VsZiwgYnV0IHRoZSBicm9hZGVyIHBpY3R1cmUuIFRvIGdyYXNwIGl0cyBzaWduaWZpY2FuY2UsIEkgbmVlZCB0byBzZWUgdGhlIGNvbXBsZXRlIGltcGxlbWVudGF0aW9uIG9mIGBfX3RocF92bWFfYWxsb3dhYmxlX29yZGVyc2AuIFVuZGVyc3RhbmRpbmcgaXRzIGlubmVyIHdvcmtpbmdzIGlzIGNydWNpYWwuXG5cbkZ1cnRoZXJtb3JlLCBJJ20gbm90IGp1c3QgaW50ZXJlc3RlZCBpbiB0aGUgZnVuY3Rpb24ncyBpbnRlcm5hbCBsb2dpYzsgSSBuZWVkIHRvIGZvbGxvdyBpdHMgY29ubmVjdGlvbnMuIEkgbmVlZCB0byBpZGVudGlmeSAqYWxsKiB0aGUgY29kZSB0aGF0IGNhbGxzIGB0aHBfdm1hX2FsbG93YWJsZV9vcmRlcnNgIG9yLCBldmVuIGJldHRlciwgYF9fdGhwX3ZtYV9hbGxvd2FibGVfb3JkZXJzYCBkaXJlY3RseS4gVGhpcyB3aWxsIGlsbHVtaW5hdGUgaXRzIHJvbGUgd2l0aGluIHRoZSBsYXJnZXIgVEhQIG1hY2hpbmVyeS4gS25vd2luZyB0aGUgY2FsbGVycyB3aWxsIGV4cG9zZSB0aGUgY29udGV4dHMgYW5kIGNvbmRpdGlvbnMgaW4gd2hpY2ggdGhlIGZ1bmN0aW9uJ3MgZGVjaXNpb25zIGFyZSByZWxldmFudC4gV2l0aCBhIGNvbXByZWhlbnNpdmUgdmlldyBvZiB0aGUgY2FsbGVycywgSSB3aWxsIGJlIGFibGUgdG8gZnVsbHkgdW5kZXJzdGFuZCB0aGUgcm9sZSBvZiB0aGUgZnVuY3Rpb24gaW4gYWN0aW9uLlxuXG5cbiIsIklucHV0VG9rZW5zIjo2MDgwLCJPdXRwdXRUb2tlbnMiOjM1LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NDksIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0wN1QyMTo1NToyNi42ODAyNTYwNFoiLCJTZXEiOjYsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjIwODc5MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJtbS9odWdlX21lbW9yeS5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDE4MCxcbiAgXCJMaW5lQ291bnRcIjogOTBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiIDE4MDpcXHR9XFxuIDE4MTpcXHRcXG4gMTgyOlxcdHVuc2lnbmVkIGxvbmcgX190aHBfdm1hX2FsbG93YWJsZV9vcmRlcnMoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXFxuIDE4MzpcXHRcXHRcXHRcXHRcXHRcXHQgdm1fZmxhZ3NfdCB2bV9mbGFncyxcXG4gMTg0OlxcdFxcdFxcdFxcdFxcdFxcdCBlbnVtIHR2YV90eXBlIHR5cGUsXFxuIDE4NTpcXHRcXHRcXHRcXHRcXHRcXHQgdW5zaWduZWQgbG9uZyBvcmRlcnMpXFxuIDE4NjpcXHR7XFxuIDE4NzpcXHRcXHRjb25zdCBib29sIHNtYXBzID0gdHlwZSA9PSBUVkFfU01BUFM7XFxuIDE4ODpcXHRcXHRjb25zdCBib29sIGluX3BmID0gdHlwZSA9PSBUVkFfUEFHRUZBVUxUO1xcbiAxODk6XFx0XFx0Y29uc3QgYm9vbCBmb3JjZWRfY29sbGFwc2UgPSB0eXBlID09IFRWQV9GT1JDRURfQ09MTEFQU0U7XFxuIDE5MDpcXHRcXHR1bnNpZ25lZCBsb25nIHN1cHBvcnRlZF9vcmRlcnM7XFxuIDE5MTpcXHRcXG4gMTkyOlxcdFxcdC8qIENoZWNrIHRoZSBpbnRlcnNlY3Rpb24gb2YgcmVxdWVzdGVkIGFuZCBzdXBwb3J0ZWQgb3JkZXJzLiAqL1xcbiAxOTM6XFx0XFx0aWYgKHZtYV9pc19hbm9ueW1vdXModm1hKSlcXG4gMTk0OlxcdFxcdFxcdHN1cHBvcnRlZF9vcmRlcnMgPSBUSFBfT1JERVJTX0FMTF9BTk9OO1xcbiAxOTU6XFx0XFx0ZWxzZSBpZiAodm1hX2lzX2RheCh2bWEpIHx8IHZtYV9pc19zcGVjaWFsX2h1Z2Uodm1hKSlcXG4gMTk2OlxcdFxcdFxcdHN1cHBvcnRlZF9vcmRlcnMgPSBUSFBfT1JERVJTX0FMTF9TUEVDSUFMX0RBWDtcXG4gMTk3OlxcdFxcdGVsc2VcXG4gMTk4OlxcdFxcdFxcdHN1cHBvcnRlZF9vcmRlcnMgPSBUSFBfT1JERVJTX0FMTF9GSUxFX0RFRkFVTFQ7XFxuIDE5OTpcXHRcXG4gMjAwOlxcdFxcdG9yZGVycyBcXHUwMDI2PSBzdXBwb3J0ZWRfb3JkZXJzO1xcbiAyMDE6XFx0XFx0aWYgKCFvcmRlcnMpXFxuIDIwMjpcXHRcXHRcXHRyZXR1cm4gMDtcXG4gMjAzOlxcdFxcbiAyMDQ6XFx0XFx0aWYgKCF2bWEtXFx1MDAzZXZtX21tKVxcdFxcdC8qIHZkc28gKi9cXG4gMjA1OlxcdFxcdFxcdHJldHVybiAwO1xcbiAyMDY6XFx0XFxuIDIwNzpcXHRcXHRpZiAodGhwX2Rpc2FibGVkX2J5X2h3KCkgfHwgdm1hX3RocF9kaXNhYmxlZCh2bWEsIHZtX2ZsYWdzLCBmb3JjZWRfY29sbGFwc2UpKVxcbiAyMDg6XFx0XFx0XFx0cmV0dXJuIDA7XFxuIDIwOTpcXHRcXG4gMjEwOlxcdFxcdC8qIGtodWdlcGFnZWQgZG9lc24ndCBjb2xsYXBzZSBEQVggdm1hLCBidXQgcGFnZSBmYXVsdCBpcyBmaW5lLiAqL1xcbiAyMTE6XFx0XFx0aWYgKHZtYV9pc19kYXgodm1hKSlcXG4gMjEyOlxcdFxcdFxcdHJldHVybiBpbl9wZiA/IG9yZGVycyA6IDA7XFxuIDIxMzpcXHRcXG4gMjE0OlxcdFxcdC8qXFxuIDIxNTpcXHRcXHQgKiBraHVnZXBhZ2VkIHNwZWNpYWwgVk1BIGFuZCBodWdldGxiIFZNQS5cXG4gMjE2OlxcdFxcdCAqIE11c3QgYmUgY2hlY2tlZCBhZnRlciBkYXggc2luY2Ugc29tZSBkYXggbWFwcGluZ3MgbWF5IGhhdmVcXG4gMjE3OlxcdFxcdCAqIFZNX01JWEVETUFQIHNldC5cXG4gMjE4OlxcdFxcdCAqL1xcbiAyMTk6XFx0XFx0aWYgKCFpbl9wZiBcXHUwMDI2XFx1MDAyNiAhc21hcHMgXFx1MDAyNlxcdTAwMjYgKHZtX2ZsYWdzIFxcdTAwMjYgVk1fTk9fS0hVR0VQQUdFRCkpXFxuIDIyMDpcXHRcXHRcXHRyZXR1cm4gMDtcXG4gMjIxOlxcdFxcbiAyMjI6XFx0XFx0LypcXG4gMjIzOlxcdFxcdCAqIENoZWNrIGFsaWdubWVudCBmb3IgZmlsZSB2bWEgYW5kIHNpemUgZm9yIGJvdGggZmlsZSBhbmQgYW5vbiB2bWEgYnlcXG4gMjI0OlxcdFxcdCAqIGZpbHRlcmluZyBvdXQgdGhlIHVuc3VpdGFibGUgb3JkZXJzLlxcbiAyMjU6XFx0XFx0ICpcXG4gMjI2OlxcdFxcdCAqIFNraXAgdGhlIGNoZWNrIGZvciBwYWdlIGZhdWx0LiBIdWdlIGZhdWx0IGRvZXMgdGhlIGNoZWNrIGluIGZhdWx0XFxuIDIyNzpcXHRcXHQgKiBoYW5kbGVycy5cXG4gMjI4OlxcdFxcdCAqL1xcbiAyMjk6XFx0XFx0aWYgKCFpbl9wZikge1xcbiAyMzA6XFx0XFx0XFx0aW50IG9yZGVyID0gaGlnaGVzdF9vcmRlcihvcmRlcnMpO1xcbiAyMzE6XFx0XFx0XFx0dW5zaWduZWQgbG9uZyBhZGRyO1xcbiAyMzI6XFx0XFxuIDIzMzpcXHRcXHRcXHR3aGlsZSAob3JkZXJzKSB7XFxuIDIzNDpcXHRcXHRcXHRcXHRhZGRyID0gdm1hLVxcdTAwM2V2bV9lbmQgLSAoUEFHRV9TSVpFIFxcdTAwM2NcXHUwMDNjIG9yZGVyKTtcXG4gMjM1OlxcdFxcdFxcdFxcdGlmICh0aHBfdm1hX3N1aXRhYmxlX29yZGVyKHZtYSwgYWRkciwgb3JkZXIpKVxcbiAyMzY6XFx0XFx0XFx0XFx0XFx0YnJlYWs7XFxuIDIzNzpcXHRcXHRcXHRcXHRvcmRlciA9IG5leHRfb3JkZXIoXFx1MDAyNm9yZGVycywgb3JkZXIpO1xcbiAyMzg6XFx0XFx0XFx0fVxcbiAyMzk6XFx0XFxuIDI0MDpcXHRcXHRcXHRpZiAoIW9yZGVycylcXG4gMjQxOlxcdFxcdFxcdFxcdHJldHVybiAwO1xcbiAyNDI6XFx0XFx0fVxcbiAyNDM6XFx0XFxuIDI0NDpcXHRcXHQvKlxcbiAyNDU6XFx0XFx0ICogRW5hYmxlZCB2aWEgc2htZW0gbW91bnQgb3B0aW9ucyBvciBzeXNmcyBzZXR0aW5ncy5cXG4gMjQ2OlxcdFxcdCAqIE11c3QgYmUgZG9uZSBiZWZvcmUgaHVnZXBhZ2UgZmxhZ3MgY2hlY2sgc2luY2Ugc2htZW0gaGFzIGl0c1xcbiAyNDc6XFx0XFx0ICogb3duIGZsYWdzLlxcbiAyNDg6XFx0XFx0ICovXFxuIDI0OTpcXHRcXHRpZiAoIWluX3BmIFxcdTAwMjZcXHUwMDI2IHNobWVtX2ZpbGUodm1hLVxcdTAwM2V2bV9maWxlKSlcXG4gMjUwOlxcdFxcdFxcdHJldHVybiBvcmRlcnMgXFx1MDAyNiBzaG1lbV9hbGxvd2FibGVfaHVnZV9vcmRlcnMoZmlsZV9pbm9kZSh2bWEtXFx1MDAzZXZtX2ZpbGUpLFxcbiAyNTE6XFx0XFx0XFx0XFx0XFx0XFx0XFx0ICAgdm1hLCB2bWFfc3RhcnRfcGdvZmYodm1hKSwgMCxcXG4gMjUyOlxcdFxcdFxcdFxcdFxcdFxcdFxcdCAgIGZvcmNlZF9jb2xsYXBzZSk7XFxuIDI1MzpcXHRcXG4gMjU0OlxcdFxcdGlmICghdm1hX2lzX2Fub255bW91cyh2bWEpKVxcbiAyNTU6XFx0XFx0XFx0cmV0dXJuIHZtYV9maWxlX2Nhbl9tYXBfaHVnZSh2bWEsIHZtX2ZsYWdzLCB0eXBlKSA/IG9yZGVycyA6IDA7XFxuIDI1NjpcXHRcXG4gMjU3OlxcdFxcdGlmICh2bWFfaXNfdGVtcG9yYXJ5X3N0YWNrKHZtYSkpXFxuIDI1ODpcXHRcXHRcXHRyZXR1cm4gMDtcXG4gMjU5OlxcdFxcbiAyNjA6XFx0XFx0LypcXG4gMjYxOlxcdFxcdCAqIFRIUGVsaWdpYmxlIGJpdCBvZiBzbWFwcyBzaG91bGQgc2hvdyAxIGZvciBwcm9wZXIgVk1BcyBldmVuXFxuIDI2MjpcXHRcXHQgKiB0aG91Z2ggYW5vbl92bWEgaXMgbm90IGluaXRpYWxpemVkIHlldC5cXG4gMjYzOlxcdFxcdCAqXFxuIDI2NDpcXHRcXHQgKiBBbGxvdyBwYWdlIGZhdWx0IHNpbmNlIGFub25fdm1hIG1heSBiZSBub3QgaW5pdGlhbGl6ZWQgdW50aWxcXG4gMjY1OlxcdFxcdCAqIHRoZSBmaXJzdCBwYWdlIGZhdWx0LlxcbiAyNjY6XFx0XFx0ICovXFxuIDI2NzpcXHRcXHRpZiAoIXZtYS1cXHUwMDNlYW5vbl92bWEpXFxuIDI2ODpcXHRcXHRcXHRyZXR1cm4gKHNtYXBzIHx8IGluX3BmKSA/IG9yZGVycyA6IDA7XFxuIDI2OTpcXHRcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDdUMjE6NTU6MjYuNjgwNDY3MDVaIiwiU2VxIjo3LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjo0NzMwNDQ4MzU2LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkludmVzdGlnYXRpbmcgYSBQb3RlbnRpYWwgTlVMTCBQb2ludGVyIERlcmVmZXJlbmNlIGluIEZpbGUgVk1BcyoqXG5cbk9rYXksIHNvIEknbSBkaWdnaW5nIGludG8gdGhpcyBgdm1hX2ZpbGVfY2FuX21hcF9odWdlYCBmdW5jdGlvbiwgYW5kIGl0J3MgdXNpbmcgYHZtYS1cdTAwM2V2bV9vcHMtXHUwMDNlaHVnZV9mYXVsdGAuIE15IGltbWVkaWF0ZSB0aG91Z2h0IGlzLCBcIldoYXQgaWYgYHZtYS1cdTAwM2V2bV9vcHNgIGlzIE5VTEw/XCIgSXQncyBhIGNsYXNzaWMgY2hlY2ssIHNvIEkgc3RhcnQgdG8gbG9vayBhdCBpdC5cblxuU3BlY2lmaWNhbGx5LCBJIHNlZSBhIGxpbmUgaW4gYHZtYV9maWxlX2Nhbl9tYXBfaHVnZWAgdGhhdCBkZWNsYXJlcyBgY29uc3QgYm9vbCBoYXNfaHVnZV9mYXVsdCA9IHZtYS1cdTAwM2V2bV9vcHMtXHUwMDNlaHVnZV9mYXVsdDtgLiBIb2xkIG9uISBJcyBgdm1hLVx1MDAzZXZtX29wc2AgKmFsd2F5cyogbm9uLU5VTEwgZm9yIGZpbGUgVk1Bcz8gSSBuZWVkIHRvIGNsYXJpZnkgdGhhdC5cblxuVGhlbiwgdGhlIHF1ZXN0aW9uIG9mIGFub255bW91cyBWTUFzIHBvcHMgdXAsIHNvIEkgbmVlZCB0byBjaGVjayBgIXZtYV9pc19hbm9ueW1vdXModm1hKWAuIENvdWxkIGB2bWEtXHUwMDNldm1fb3BzYCAqc3RpbGwqIGJlIE5VTEw/IEFoYSEgTXkgdW5kZXJzdGFuZGluZyBvZiB0aGUgTGludXgga2VybmVsIG1lbW9yeSBtYW5hZ2VtZW50IGludGVybmFscyB0ZWxscyBtZSB0aGF0IGl0IGFjdHVhbGx5ICppcyogcG9zc2libGUgZm9yIGZpbGUgVk1BcyB0byBoYXZlIGB2bWEtXHUwMDNldm1fb3BzID09IE5VTExgISBTcGVjaWZpY2FsbHksIHRoZXJlIGFyZSBzaXR1YXRpb25zIHdoZXJlIGEgZHJpdmVyIG9yIGZpbGUgY3JlYXRlcyBhIFZNQSB3aXRob3V0IHByb3ZpZGluZyBgdm1fb3BzYCwgbGlrZSB3aXRoIGdlbmVyaWMgbW1hcCBvcGVyYXRpb25zLlxuXG5BbHJpZ2h0LCB0aW1lIHRvIGJhY2sgdXAgYSBsaXR0bGUgYW5kIHRoaW5rIGFib3V0IGhvdyBgdm1hLVx1MDAzZXZtX29wc2AgaGFzIGJlZW4gaGFuZGxlZCB1cCB0byBub3cuIExldCBtZSBzZWUgd2hlcmUgdGhpcyB2YXJpYWJsZSBpcyBhY2Nlc3NlZCBhbmQgaG93IGl0J3MgaGFuZGxlZC4gRm9yIGV4YW1wbGU6XG5gYGBjXG5pZiAoKChpbl9wZiB8fCBzbWFwcykpIFx1MDAyNlx1MDAyNiB2bWEtXHUwMDNldm1fb3BzLVx1MDAzZWh1Z2VfZmF1bHQpXG5gYGBcbklzIGB2bWEtXHUwMDNldm1fb3BzYCBldmVyIGNoZWNrZWQgZm9yIGJlaW5nIE5VTEwgc29tZXdoZXJlIGVsc2U/IFRoaXMgaXMgY3JpdGljYWwuXG5cbkknbSBhbHNvIHNlZWluZyBgdm1hX2ZpbGVfYnlwYXNzX3RocF90dW5lYWJsZXNgOlxuXG5gYGBjXG5zdGF0aWMgYm9vbCB2bWFfZmlsZV9ieXBhc3NfdGhwX3R1bmVhYmxlcyhjb25zdCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcblx0XHRlbnVtIHR2YV90eXBlIHR5cGUpXG57XG5cdGNvbnN0IGJvb2wgaGFzX2h1Z2VfZmF1bHQgPSB2bWEtXHUwMDNldm1fb3BzLVx1MDAzZWh1Z2VfZmF1bHQ7XG5gYGBcblxuSWYgYHZtYS1cdTAwM2V2bV9vcHNgICppcyogTlVMTCAob3IsIG1vcmUgc3BlY2lmaWNhbGx5LCBpZiB3ZSdyZSBkZWFsaW5nIHdpdGggYSBmaWxlIFZNQSB3aGVyZSBgdm1hLVx1MDAzZXZtX29wcyA9PSBOVUxMYCksIHRoZW4gZGVyZWZlcmVuY2luZyBgdm1hLVx1MDAzZXZtX29wcy1cdTAwM2VodWdlX2ZhdWx0YCBpcyBnb2luZyB0byBjYXVzZSBhIE5VTEwgcG9pbnRlciBkZXJlZmVyZW5jZSEgVGhhdCdzIGEgc2VyaW91cyBidWcgY2FuZGlkYXRlLiBJJ2QgYmV0dGVyIGJlIGNhcmVmdWwgYW5kIG5vdGUgdGhhdCB0aGlzIGlzIG15IGN1cnJlbnQgbGluZSBvZiB0aGlua2luZy5cblxuTm93LCBsZXQncyBncmVwIGluIHRoZSBgbW0vYCBkaXJlY3RvcnkgZm9yIGB2bWEtXHUwMDNldm1fb3BzYCBhbmQgc2VlIGlmIHRoZXJlIGFyZSBvdGhlciBwbGFjZXMgd2hlcmUgYHZtYS1cdTAwM2V2bV9vcHNgIGNvdWxkIGJlIE5VTEwgZm9yIGZpbGUgVk1Bcy4gVGhpcyBpcyB3aGVyZSBJIG5lZWQgdG8gc3RhcnQgZ2F0aGVyaW5nIGV2aWRlbmNlLlxuXG5cbiIsIklucHV0VG9rZW5zIjo3Nzc4LCJPdXRwdXRUb2tlbnMiOjI4LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NDI0LCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMDdUMjE6NTU6MzEuNDEwOTE5NDc2WiIsIlNlcSI6OCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjYyNzI3NzMwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcInZtYS1cXHUwMDNldm1fb3BzXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIm1tL1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJtbS9kZWJ1Zy5jPTE1NT12b2lkIGR1bXBfdm1hKGNvbnN0IHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKVxcbi0tXFxubW0vZGVidWcuYy0xNjUtXFx0XFx0KHVuc2lnbmVkIGxvbmcpcGdwcm90X3ZhbCh2bWEtXFx1MDAzZXZtX3BhZ2VfcHJvdCksXFxubW0vZGVidWcuYzoxNjY6XFx0XFx0dm1hLVxcdTAwM2Vhbm9uX3ZtYSwgdm1hLVxcdTAwM2V2bV9vcHMsIHZtYV9zdGFydF9wZ29mZih2bWEpLFxcbm1tL2RlYnVnLmMtMTY3LVxcdFxcdHZtYS1cXHUwMDNldm1fZmlsZSwgdm1hLVxcdTAwM2V2bV9wcml2YXRlX2RhdGEsXFxuLS1cXG5tbS9maWxlbWFwLmM9NDA0MD1pbnQgZ2VuZXJpY19maWxlX21tYXAoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKVxcbi0tXFxubW0vZmlsZW1hcC5jLTQwNDYtXFx0ZmlsZV9hY2Nlc3NlZChmaWxlKTtcXG5tbS9maWxlbWFwLmM6NDA0NzpcXHR2bWEtXFx1MDAzZXZtX29wcyA9IFxcdTAwMjZnZW5lcmljX2ZpbGVfdm1fb3BzO1xcbm1tL2ZpbGVtYXAuYy00MDQ4LVxcdHJldHVybiAwO1xcbi0tXFxubW0vZ3VwLmM9NjExPXN0YXRpYyBzdHJ1Y3QgcGFnZSAqbm9fcGFnZV90YWJsZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcXG4tLVxcbm1tL2d1cC5jLTYyOC1cXHRcXHRcXHRyZXR1cm4gRVJSX1BUUigtRUZBVUxUKTtcXG5tbS9ndXAuYzo2Mjk6XFx0fSBlbHNlIGlmICgodm1hX2lzX2Fub255bW91cyh2bWEpIHx8ICF2bWEtXFx1MDAzZXZtX29wcy1cXHUwMDNlZmF1bHQpKSB7XFxubW0vZ3VwLmMtNjMwLVxcdFxcdHJldHVybiBFUlJfUFRSKC1FRkFVTFQpO1xcbi0tXFxubW0vaHVnZV9tZW1vcnkuYz0xMjE9c3RhdGljIGJvb2wgdm1hX2ZpbGVfYnlwYXNzX3RocF90dW5lYWJsZXMoY29uc3Qgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXFxuLS1cXG5tbS9odWdlX21lbW9yeS5jLTEyMy17XFxubW0vaHVnZV9tZW1vcnkuYzoxMjQ6XFx0Y29uc3QgYm9vbCBoYXNfaHVnZV9mYXVsdCA9IHZtYS1cXHUwMDNldm1fb3BzLVxcdTAwM2VodWdlX2ZhdWx0O1xcbm1tL2h1Z2VfbWVtb3J5LmMtMTI1LVxcbi0tXFxubW0vaHVnZV9tZW1vcnkuYz0xNTM9c3RhdGljIGJvb2wgdm1hX2ZpbGVfY2FuX21hcF9odWdlKGNvbnN0IHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxcbi0tXFxubW0vaHVnZV9tZW1vcnkuYy0xNTUte1xcbm1tL2h1Z2VfbWVtb3J5LmM6MTU2OlxcdGNvbnN0IGJvb2wgaGFzX2h1Z2VfZmF1bHQgPSB2bWEtXFx1MDAzZXZtX29wcy1cXHUwMDNlaHVnZV9mYXVsdDtcXG5tbS9odWdlX21lbW9yeS5jLTE1Ny1cXG4tLVxcbm1tL2ludGVybmFsLmg9MjM2PXN0YXRpYyBpbmxpbmUgaW50IG1tYXBfZmlsZShzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpXFxuLS1cXG5tbS9pbnRlcm5hbC5oLTI0Ny1cXHQgKi9cXG5tbS9pbnRlcm5hbC5oOjI0ODpcXHR2bWEtXFx1MDAzZXZtX29wcyA9IFxcdTAwMjZ2bWFfZHVtbXlfdm1fb3BzO1xcbm1tL2ludGVybmFsLmgtMjQ5LVxcbi0tXFxubW0vaW50ZXJuYWwuaD0yNTg9c3RhdGljIGlubGluZSB2b2lkIHZtYV9jbG9zZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSlcXG5tbS9pbnRlcm5hbC5oLTI1OS17XFxubW0vaW50ZXJuYWwuaDoyNjA6XFx0aWYgKHZtYS1cXHUwMDNldm1fb3BzIFxcdTAwMjZcXHUwMDI2IHZtYS1cXHUwMDNldm1fb3BzLVxcdTAwM2VjbG9zZSkge1xcbm1tL2ludGVybmFsLmg6MjYxOlxcdFxcdHZtYS1cXHUwMDNldm1fb3BzLVxcdTAwM2VjbG9zZSh2bWEpO1xcbm1tL2ludGVybmFsLmgtMjYyLVxcbi0tXFxubW0vaW50ZXJuYWwuaC0yNjYtXFx0XFx0ICovXFxubW0vaW50ZXJuYWwuaDoyNjc6XFx0XFx0dm1hLVxcdTAwM2V2bV9vcHMgPSBcXHUwMDI2dm1hX2R1bW15X3ZtX29wcztcXG5tbS9pbnRlcm5hbC5oLTI2OC1cXHR9XFxuLS1cXG5tbS9tZW1vcnkuYz02Mjg9c3RhdGljIHZvaWQgcHJpbnRfYmFkX3BhZ2VfbWFwKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxcbi0tXFxubW0vbWVtb3J5LmMtNjU4LVxcdFxcdCB2bWEtXFx1MDAzZXZtX2ZpbGUsXFxubW0vbWVtb3J5LmM6NjU5OlxcdFxcdCB2bWEtXFx1MDAzZXZtX29wcyA/IHZtYS1cXHUwMDNldm1fb3BzLVxcdTAwM2VmYXVsdCA6IE5VTEwsXFxubW0vbWVtb3J5LmMtNjYwLVxcdFxcdCB2bWEtXFx1MDAzZXZtX2ZpbGUgPyB2bWEtXFx1MDAzZXZtX2ZpbGUtXFx1MDAzZWZfb3AtXFx1MDAzZW1tYXAgOiBOVUxMLFxcbi0tXFxubW0vbWVtb3J5LmM9NzU1PXN0YXRpYyBpbmxpbmUgc3RydWN0IHBhZ2UgKl9fdm1fbm9ybWFsX3BhZ2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXFxuLS1cXG5tbS9tZW1vcnkuYy03NjEtI2lmZGVmIENPTkZJR19GSU5EX05PUk1BTF9QQUdFXFxubW0vbWVtb3J5LmM6NzYyOlxcdFxcdFxcdGlmICh2bWEtXFx1MDAzZXZtX29wcyBcXHUwMDI2XFx1MDAyNiB2bWEtXFx1MDAzZXZtX29wcy1cXHUwMDNlZmluZF9ub3JtYWxfcGFnZSlcXG5tbS9tZW1vcnkuYzo3NjM6XFx0XFx0XFx0XFx0cmV0dXJuIHZtYS1cXHUwMDNldm1fb3BzLVxcdTAwM2VmaW5kX25vcm1hbF9wYWdlKHZtYSwgYWRkcik7XFxubW0vbWVtb3J5LmMtNzY0LSNlbmRpZiAvKiBDT05GSUdfRklORF9OT1JNQUxfUEFHRSAqL1xcbi0tXFxubW0vbWVtb3J5LmM9MjQzND1zdGF0aWMgYm9vbCB2bV9taXhlZF96ZXJvcGFnZV9hbGxvd2VkKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKVxcbi0tXFxubW0vbWVtb3J5LmMtMjQ1NC1cXHQgKiBiZSBwcm9ibGVtYXRpYyBhcyBzb29uIGFzIHRoZSB6ZXJvcGFnZSBnZXRzIHJlcGxhY2VkIGJ5IGEgZGlmZmVyZW50XFxubW0vbWVtb3J5LmM6MjQ1NTpcXHQgKiBwYWdlIGR1ZSB0byB2bWEtXFx1MDAzZXZtX29wcy1cXHUwMDNlcGZuX21rd3JpdGUsIGJlY2F1c2Ugd2hhdCdzIG1hcHBlZCB3b3VsZFxcbm1tL21lbW9yeS5jLTI0NTYtXFx0ICogbm93IGRpZmZlciB0byB3aGF0IEdVUCBsb29rZWQgdXAuIEZTREFYIGlzIGluY29tcGF0aWJsZSB0b1xcbi0tXFxubW0vbWVtb3J5LmMtMjQ1OS1cXHQgKi9cXG5tbS9tZW1vcnkuYzoyNDYwOlxcdHJldHVybiB2bWEtXFx1MDAzZXZtX29wcyBcXHUwMDI2XFx1MDAyNiB2bWEtXFx1MDAzZXZtX29wcy1cXHUwMDNlcGZuX21rd3JpdGUgXFx1MDAyNlxcdTAwMjZcXG5tbS9tZW1vcnkuYy0yNDYxLVxcdCAgICAgICAodm1hX2lzX2ZzZGF4KHZtYSkgfHwgdm1hLVxcdTAwM2V2bV9mbGFncyBcXHUwMDI2IFZNX0lPKTtcXG4tLVxcbm1tL21lbW9yeS5jPTM4MDU9c3RhdGljIHZtX2ZhdWx0X3QgZG9fcGFnZV9ta3dyaXRlKHN0cnVjdCB2bV9mYXVsdCAqdm1mLCBzdHJ1Y3QgZm9saW8gKmZvbGlvKVxcbi0tXFxubW0vbWVtb3J5LmMtMzgxNS1cXG5tbS9tZW1vcnkuYzozODE2OlxcdHJldCA9IHZtZi1cXHUwMDNldm1hLVxcdTAwM2V2bV9vcHMtXFx1MDAzZXBhZ2VfbWt3cml0ZSh2bWYpO1xcbm1tL21lbW9yeS5jLTM4MTctXFx0LyogUmVzdG9yZSBvcmlnaW5hbCBmbGFncyBzbyB0aGF0IGNhbGxlciBpcyBub3Qgc3VycHJpc2VkICovXFxuLS1cXG5tbS9tZW1vcnkuYz0zODM4PXN0YXRpYyB2bV9mYXVsdF90IGZhdWx0X2RpcnR5X3NoYXJlZF9wYWdlKHN0cnVjdCB2bV9mYXVsdCAqdm1mKVxcbi0tXFxubW0vbWVtb3J5LmMtMzg0My1cXHRib29sIGRpcnRpZWQ7XFxubW0vbWVtb3J5LmM6Mzg0NDpcXHRib29sIHBhZ2VfbWt3cml0ZSA9IHZtYS1cXHUwMDNldm1fb3BzIFxcdTAwMjZcXHUwMDI2IHZtYS1cXHUwMDNldm1fb3BzLVxcdTAwM2VwYWdlX21rd3JpdGU7XFxubW0vbWVtb3J5LmMtMzg0NS1cXG4tLVxcbm1tL21lbW9yeS5jPTM5MjU9c3RhdGljIGlubGluZSB2bV9mYXVsdF90IHZtZl9jYW5fY2FsbF9mYXVsdChjb25zdCBzdHJ1Y3Qgdm1fZmF1bHQgKnZtZilcXG4tLVxcbm1tL21lbW9yeS5jLTM5MjgtXFxubW0vbWVtb3J5LmM6MzkyOTpcXHRpZiAodm1hLVxcdTAwM2V2bV9vcHMtXFx1MDAzZW1hcF9wYWdlcyB8fCAhKHZtZi1cXHUwMDNlZmxhZ3MgXFx1MDAyNiBGQVVMVF9GTEFHX1ZNQV9MT0NLKSlcXG5tbS9tZW1vcnkuYy0zOTMwLVxcdFxcdHJldHVybiAwO1xcbi0tXFxubW0vbWVtb3J5LmM9NDE3Nz1zdGF0aWMgdm1fZmF1bHRfdCB3cF9wZm5fc2hhcmVkKHN0cnVjdCB2bV9mYXVsdCAqdm1mKVxcbi0tXFxubW0vbWVtb3J5LmMtNDE4MC1cXG5tbS9tZW1vcnkuYzo0MTgxOlxcdGlmICh2bWEtXFx1MDAzZXZtX29wcyBcXHUwMDI2XFx1MDAyNiB2bWEtXFx1MDAzZXZtX29wcy1cXHUwMDNlcGZuX21rd3JpdGUpIHtcXG5tbS9tZW1vcnkuYy00MTgyLVxcdFxcdHZtX2ZhdWx0X3QgcmV0O1xcbi0tXFxubW0vbWVtb3J5LmMtNDE4OS1cXHRcXHR2bWYtXFx1MDAzZWZsYWdzIHw9IEZBVUxUX0ZMQUdfTUtXUklURTtcXG5tbS9tZW1vcnkuYzo0MTkwOlxcdFxcdHJldCA9IHZtYS1cXHUwMDNldm1fb3BzLVxcdTAwM2VwZm5fbWt3cml0ZSh2bWYpO1xcbm1tL21lbW9yeS5jLTQxOTEtXFx0XFx0aWYgKHJldCBcXHUwMDI2IChWTV9GQVVMVF9FUlJPUiB8IFZNX0ZBVUxUX05PUEFHRSkpXFxuLS1cXG5tbS9tZW1vcnkuYz00MTk5PXN0YXRpYyB2bV9mYXVsdF90IHdwX3BhZ2Vfc2hhcmVkKHN0cnVjdCB2bV9mYXVsdCAqdm1mLCBzdHJ1Y3QgZm9saW8gKmZvbGlvKVxcbi0tXFxubW0vbWVtb3J5LmMtNDIwNi1cXG5tbS9tZW1vcnkuYzo0MjA3OlxcdGlmICh2bWEtXFx1MDAzZXZtX29wcyBcXHUwMDI2XFx1MDAyNiB2bWEtXFx1MDAzZXZtX29wcy1cXHUwMDNlcGFnZV9ta3dyaXRlKSB7XFxubW0vbWVtb3J5LmMtNDIwOC1cXHRcXHR2bV9mYXVsdF90IHRtcDtcXG4tLVxcbm1tL21lbW9yeS5jPTU0Mjc9c3RhdGljIHZtX2ZhdWx0X3QgZG9fYW5vbnltb3VzX3BhZ2Uoc3RydWN0IHZtX2ZhdWx0ICp2bWYpXFxuLS1cXG5tbS9tZW1vcnkuYy01NTM0LSAqIChzZWUgRkFVTFRfRkxBR19WTUFfTE9DSykgYW5kIG1heSBoYXZlIGJlZW4gcmVsZWFzZWQgZGVwZW5kaW5nIG9uXFxubW0vbWVtb3J5LmM6NTUzNTogKiBmbGFncyBhbmQgdm1hLVxcdTAwM2V2bV9vcHMtXFx1MDAzZWZhdWx0KCkgcmV0dXJuIHZhbHVlLlxcbm1tL21lbW9yeS5jLTU1MzYtICogU2VlIGZpbGVtYXBfZmF1bHQoKSBhbmQgX19mb2xpb19sb2NrX29yX3JldHJ5KCkuXFxuLS1cXG5tbS9tZW1vcnkuYz01NTM4PXN0YXRpYyB2bV9mYXVsdF90IF9fZG9fZmF1bHQoc3RydWN0IHZtX2ZhdWx0ICp2bWYpXFxuLS1cXG5tbS9tZW1vcnkuYy01NTY0LVxcbm1tL21lbW9yeS5jOjU1NjU6XFx0cmV0ID0gdm1hLVxcdTAwM2V2bV9vcHMtXFx1MDAzZWZhdWx0KHZtZik7XFxubW0vbWVtb3J5LmMtNTU2Ni1cXHRpZiAodW5saWtlbHkocmV0IFxcdTAwMjYgKFZNX0ZBVUxUX0VSUk9SIHwgVk1fRkFVTFRfTk9QQUdFIHwgVk1fRkFVTFRfUkVUUlkgfFxcbi0tXFxubW0vbWVtb3J5LmM9NTkzND1zdGF0aWMgdm1fZmF1bHRfdCBkb19mYXVsdF9hcm91bmQoc3RydWN0IHZtX2ZhdWx0ICp2bWYpXFxuLS1cXG5tbS9tZW1vcnkuYy01OTU3LVxcdHJjdV9yZWFkX2xvY2soKTtcXG5tbS9tZW1vcnkuYzo1OTU4OlxcdHJldCA9IHZtZi1cXHUwMDNldm1hLVxcdTAwM2V2bV9vcHMtXFx1MDAzZW1hcF9wYWdlcyh2bWYsXFxubW0vbWVtb3J5LmMtNTk1OS1cXHRcXHRcXHR2bWYtXFx1MDAzZXBnb2ZmICsgZnJvbV9wdGUgLSBwdGVfb2ZmLFxcbi0tXFxubW0vbWVtb3J5LmM9NTk2Nz1zdGF0aWMgaW5saW5lIGJvb2wgc2hvdWxkX2ZhdWx0X2Fyb3VuZChzdHJ1Y3Qgdm1fZmF1bHQgKnZtZilcXG4tLVxcbm1tL21lbW9yeS5jLTU5NjktXFx0LyogTm8gLVxcdTAwM2VtYXBfcGFnZXM/ICBObyB3YXkgdG8gZmF1bHQgYXJvdW5kLi4uICovXFxubW0vbWVtb3J5LmM6NTk3MDpcXHRpZiAoIXZtZi1cXHUwMDNldm1hLVxcdTAwM2V2bV9vcHMtXFx1MDAzZW1hcF9wYWdlcylcXG5tbS9tZW1vcnkuYy01OTcxLVxcdFxcdHJldHVybiBmYWxzZTtcXG4tLVxcbm1tL21lbW9yeS5jPTYwNTQ9c3RhdGljIHZtX2ZhdWx0X3QgZG9fc2hhcmVkX2ZhdWx0KHN0cnVjdCB2bV9mYXVsdCAqdm1mKVxcbi0tXFxubW0vbWVtb3J5LmMtNjA3My1cXHQgKi9cXG5tbS9tZW1vcnkuYzo2MDc0OlxcdGlmICh2bWEtXFx1MDAzZXZtX29wcy1cXHUwMDNlcGFnZV9ta3dyaXRlKSB7XFxubW0vbWVtb3J5LmMtNjA3NS1cXHRcXHRmb2xpb191bmxvY2soZm9saW8pO1xcbi0tXFxubW0vbWVtb3J5LmM9NjEwND1zdGF0aWMgdm1fZmF1bHRfdCBkb19mYXVsdChzdHJ1Y3Qgdm1fZmF1bHQgKnZtZilcXG4tLVxcbm1tL21lbW9yeS5jLTYxMTItXFx0ICovXFxubW0vbWVtb3J5LmM6NjExMzpcXHRpZiAoIXZtYS1cXHUwMDNldm1fb3BzLVxcdTAwM2VmYXVsdCkge1xcbm1tL21lbW9yeS5jLTYxMTQtXFx0XFx0dm1mLVxcdTAwM2VwdGUgPSBwdGVfb2Zmc2V0X21hcF9sb2NrKHZtZi1cXHUwMDNldm1hLVxcdTAwM2V2bV9tbSwgdm1mLVxcdTAwM2VwbWQsXFxuLS1cXG5tbS9tZW1vcnkuYz02Mzc5PXN0YXRpYyBpbmxpbmUgdm1fZmF1bHRfdCBjcmVhdGVfaHVnZV9wbWQoc3RydWN0IHZtX2ZhdWx0ICp2bWYpXFxuLS1cXG5tbS9tZW1vcnkuYy02MzgzLVxcdFxcdHJldHVybiBkb19odWdlX3BtZF9hbm9ueW1vdXNfcGFnZSh2bWYpO1xcbm1tL21lbW9yeS5jOjYzODQ6XFx0aWYgKHZtYS1cXHUwMDNldm1fb3BzLVxcdTAwM2VodWdlX2ZhdWx0KVxcbm1tL21lbW9yeS5jOjYzODU6XFx0XFx0cmV0dXJuIHZtYS1cXHUwMDNldm1fb3BzLVxcdTAwM2VodWdlX2ZhdWx0KHZtZiwgUE1EX09SREVSKTtcXG5tbS9tZW1vcnkuYy02Mzg2LVxcdHJldHVybiBWTV9GQVVMVF9GQUxMQkFDSztcXG4tLVxcbm1tL21lbW9yeS5jPTYzOTA9c3RhdGljIGlubGluZSB2bV9mYXVsdF90IHdwX2h1Z2VfcG1kKHN0cnVjdCB2bV9mYXVsdCAqdm1mKVxcbi0tXFxubW0vbWVtb3J5LmMtNjQwNi1cXHRpZiAodm1hLVxcdTAwM2V2bV9mbGFncyBcXHUwMDI2IChWTV9TSEFSRUQgfCBWTV9NQVlTSEFSRSkpIHtcXG5tbS9tZW1vcnkuYzo2NDA3OlxcdFxcdGlmICh2bWEtXFx1MDAzZXZtX29wcy1cXHUwMDNlaHVnZV9mYXVsdCkge1xcbm1tL21lbW9yeS5jOjY0MDg6XFx0XFx0XFx0cmV0ID0gdm1hLVxcdTAwM2V2bV9vcHMtXFx1MDAzZWh1Z2VfZmF1bHQodm1mLCBQTURfT1JERVIpO1xcbm1tL21lbW9yeS5jLTY0MDktXFx0XFx0XFx0aWYgKCEocmV0IFxcdTAwMjYgVk1fRkFVTFRfRkFMTEJBQ0spKVxcbi0tXFxubW0vbWVtb3J5LmM9NjQyMT1zdGF0aWMgdm1fZmF1bHRfdCBjcmVhdGVfaHVnZV9wdWQoc3RydWN0IHZtX2ZhdWx0ICp2bWYpXFxuLS1cXG5tbS9tZW1vcnkuYy02NDI4LVxcdFxcdHJldHVybiBWTV9GQVVMVF9GQUxMQkFDSztcXG5tbS9tZW1vcnkuYzo2NDI5OlxcdGlmICh2bWEtXFx1MDAzZXZtX29wcy1cXHUwMDNlaHVnZV9mYXVsdClcXG5tbS9tZW1vcnkuYzo2NDMwOlxcdFxcdHJldHVybiB2bWEtXFx1MDAzZXZtX29wcy1cXHUwMDNlaHVnZV9mYXVsdCh2bWYsIFBVRF9PUkRFUik7XFxubW0vbWVtb3J5LmMtNjQzMS0jZW5kaWYgLyogQ09ORklHX1RSQU5TUEFSRU5UX0hVR0VQQUdFICovXFxuLS1cXG5tbS9tZW1vcnkuYz02NDM1PXN0YXRpYyB2bV9mYXVsdF90IHdwX2h1Z2VfcHVkKHN0cnVjdCB2bV9mYXVsdCAqdm1mLCBwdWRfdCBvcmlnX3B1ZClcXG4tLVxcbm1tL21lbW9yeS5jLTY0NDUtXFx0aWYgKHZtYS1cXHUwMDNldm1fZmxhZ3MgXFx1MDAyNiAoVk1fU0hBUkVEIHwgVk1fTUFZU0hBUkUpKSB7XFxubW0vbWVtb3J5LmM6NjQ0NjpcXHRcXHRpZiAodm1hLVxcdTAwM2V2bV9vcHMtXFx1MDAzZWh1Z2VfZmF1bHQpIHtcXG5tbS9tZW1vcnkuYzo2NDQ3OlxcdFxcdFxcdHJldCA9IHZtYS1cXHUwMDNldm1fb3BzLVxcdTAwM2VodWdlX2ZhdWx0KHZtZiwgUFVEX09SREVSKTtcXG5tbS9tZW1vcnkuYy02NDQ4LVxcdFxcdFxcdGlmICghKHJldCBcXHUwMDI2IFZNX0ZBVUxUX0ZBTExCQUNLKSlcXG4tLVxcbm1tL21lbW9yeS5jPTcyMTA9c3RhdGljIGludCBfX2FjY2Vzc19yZW1vdGVfdm0oc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgYWRkcixcXG4tLVxcbm1tL21lbW9yeS5jLTcyNTQtI2lmZGVmIENPTkZJR19IQVZFX0lPUkVNQVBfUFJPVFxcbm1tL21lbW9yeS5jOjcyNTU6XFx0XFx0XFx0aWYgKHZtYS1cXHUwMDNldm1fb3BzIFxcdTAwMjZcXHUwMDI2IHZtYS1cXHUwMDNldm1fb3BzLVxcdTAwM2VhY2Nlc3MpXFxubW0vbWVtb3J5LmM6NzI1NjpcXHRcXHRcXHRcXHRieXRlcyA9IHZtYS1cXHUwMDNldm1fb3BzLVxcdTAwM2VhY2Nlc3Modm1hLCBhZGRyLCBidWYsXFxubW0vbWVtb3J5LmMtNzI1Ny1cXHRcXHRcXHRcXHRcXHRcXHRcXHQgICAgbGVuLCB3cml0ZSk7XFxuLS1cXG5tbS9tZW1wb2xpY3kuYz0xMDEyPXN0YXRpYyBpbnQgdm1hX3JlcGxhY2VfcG9saWN5KHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxcbi0tXFxubW0vbWVtcG9saWN5LmMtMTAyNC1cXG5tbS9tZW1wb2xpY3kuYzoxMDI1OlxcdGlmICh2bWEtXFx1MDAzZXZtX29wcyBcXHUwMDI2XFx1MDAyNiB2bWEtXFx1MDAzZXZtX29wcy1cXHUwMDNlc2V0X3BvbGljeSkge1xcbm1tL21lbXBvbGljeS5jOjEwMjY6XFx0XFx0ZXJyID0gdm1hLVxcdTAwM2V2bV9vcHMtXFx1MDAzZXNldF9wb2xpY3kodm1hLCBuZXcpO1xcbm1tL21lbXBvbGljeS5jLTEwMjctXFx0XFx0aWYgKGVycilcXG4tLVxcbm1tL21lbXBvbGljeS5jPTIwMjE9c3RydWN0IG1lbXBvbGljeSAqX19nZXRfdm1hX3BvbGljeShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcXG4tLVxcbm1tL21lbXBvbGljeS5jLTIwMjQtXFx0KmlseCA9IDA7XFxubW0vbWVtcG9saWN5LmM6MjAyNTpcXHRyZXR1cm4gKHZtYS1cXHUwMDNldm1fb3BzIFxcdTAwMjZcXHUwMDI2IHZtYS1cXHUwMDNldm1fb3BzLVxcdTAwM2VnZXRfcG9saWN5KSA/XFxubW0vbWVtcG9saWN5LmM6MjAyNjpcXHRcXHR2bWEtXFx1MDAzZXZtX29wcy1cXHUwMDNlZ2V0X3BvbGljeSh2bWEsIGFkZHIsIGlseCkgOiB2bWEtXFx1MDAzZXZtX3BvbGljeTtcXG5tbS9tZW1wb2xpY3kuYy0yMDI3LX1cXG4tLVxcbm1tL21tYXAuYz0xNDY1PWJvb2wgdm1hX2lzX3NwZWNpYWxfbWFwcGluZyhjb25zdCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcXG4tLVxcbm1tL21tYXAuYy0xNDY4LVxcdHJldHVybiB2bWEtXFx1MDAzZXZtX3ByaXZhdGVfZGF0YSA9PSBzbSBcXHUwMDI2XFx1MDAyNlxcbm1tL21tYXAuYzoxNDY5OlxcdFxcdHZtYS1cXHUwMDNldm1fb3BzID09IFxcdTAwMjZzcGVjaWFsX21hcHBpbmdfdm1vcHM7XFxubW0vbW1hcC5jLTE0NzAtfVxcbi0tXFxubW0vbXByb3RlY3QuYz04NzE9c3RhdGljIGludCBkb19tcHJvdGVjdF9wa2V5KHVuc2lnbmVkIGxvbmcgc3RhcnQsIHNpemVfdCBsZW4sXFxuLS1cXG5tbS9tcHJvdGVjdC5jLTk5NS1cXG5tbS9tcHJvdGVjdC5jOjk5NjpcXHRcXHRpZiAodm1hLVxcdTAwM2V2bV9vcHMgXFx1MDAyNlxcdTAwMjYgdm1hLVxcdTAwM2V2bV9vcHMtXFx1MDAzZW1wcm90ZWN0KSB7XFxubW0vbXByb3RlY3QuYzo5OTc6XFx0XFx0XFx0ZXJyb3IgPSB2bWEtXFx1MDAzZXZtX29wcy1cXHUwMDNlbXByb3RlY3Qodm1hLCBuc3RhcnQsIHRtcCwgbmV3ZmxhZ3MpO1xcbm1tL21wcm90ZWN0LmMtOTk4LVxcdFxcdFxcdGlmIChlcnJvcilcXG4tLVxcbm1tL21yZW1hcC5jPTExMTI9c3RhdGljIHVuc2lnbmVkIGxvbmcgcHJlcF9tb3ZlX3ZtYShzdHJ1Y3Qgdm1hX3JlbWFwX3N0cnVjdCAqdnJtKVxcbi0tXFxubW0vbXJlbWFwLmMtMTEyNy1cXG5tbS9tcmVtYXAuYzoxMTI4OlxcdGlmICh2bWEtXFx1MDAzZXZtX29wcyBcXHUwMDI2XFx1MDAyNiB2bWEtXFx1MDAzZXZtX29wcy1cXHUwMDNlbWF5X3NwbGl0KSB7XFxubW0vbXJlbWFwLmMtMTEyOS1cXHRcXHRpZiAodm1hLVxcdTAwM2V2bV9zdGFydCAhPSBvbGRfYWRkcilcXG5tbS9tcmVtYXAuYzoxMTMwOlxcdFxcdFxcdGVyciA9IHZtYS1cXHUwMDNldm1fb3BzLVxcdTAwM2VtYXlfc3BsaXQodm1hLCBvbGRfYWRkcik7XFxubW0vbXJlbWFwLmMtMTEzMS1cXHRcXHRpZiAoIWVyciBcXHUwMDI2XFx1MDAyNiB2bWEtXFx1MDAzZXZtX2VuZCAhPSBvbGRfYWRkciArIG9sZF9sZW4pXFxubW0vbXJlbWFwLmM6MTEzMjpcXHRcXHRcXHRlcnIgPSB2bWEtXFx1MDAzZXZtX29wcy1cXHUwMDNlbWF5X3NwbGl0KHZtYSwgb2xkX2FkZHIgKyBvbGRfbGVuKTtcXG5tbS9tcmVtYXAuYy0xMTMzLVxcdFxcdGlmIChlcnIpXFxuLS1cXG5tbS9tcmVtYXAuYz0xMjY1PXN0YXRpYyBpbnQgY29weV92bWFfYW5kX2RhdGEoc3RydWN0IHZtYV9yZW1hcF9zdHJ1Y3QgKnZybSxcXG4tLVxcbm1tL21yZW1hcC5jLTEyOTQtXFx0XFx0ZXJyID0gLUVOT01FTTtcXG5tbS9tcmVtYXAuYzoxMjk1OlxcdGVsc2UgaWYgKHZtYS1cXHUwMDNldm1fb3BzIFxcdTAwMjZcXHUwMDI2IHZtYS1cXHUwMDNldm1fb3BzLVxcdTAwM2VtcmVtYXApXFxubW0vbXJlbWFwLmM6MTI5NjpcXHRcXHRlcnIgPSB2bWEtXFx1MDAzZXZtX29wcy1cXHUwMDNlbXJlbWFwKG5ld192bWEpO1xcbm1tL21yZW1hcC5jLTEyOTctXFxuLS1cXG5tbS9zZWNyZXRtZW0uYz0yMTM9Ym9vbCB2bWFfaXNfc2VjcmV0bWVtKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKVxcbm1tL3NlY3JldG1lbS5jLTIxNC17XFxubW0vc2VjcmV0bWVtLmM6MjE1OlxcdHJldHVybiB2bWEtXFx1MDAzZXZtX29wcyA9PSBcXHUwMDI2c2VjcmV0bWVtX3ZtX29wcztcXG5tbS9zZWNyZXRtZW0uYy0yMTYtfVxcbi0tXFxubW0vc2htZW0uYz0yODQ9Ym9vbCB2bWFfaXNfYW5vbl9zaG1lbShjb25zdCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSlcXG5tbS9zaG1lbS5jLTI4NS17XFxubW0vc2htZW0uYzoyODY6XFx0cmV0dXJuIHZtYS1cXHUwMDNldm1fb3BzID09IFxcdTAwMjZzaG1lbV9hbm9uX3ZtX29wcztcXG5tbS9zaG1lbS5jLTI4Ny19XFxuLS1cXG5tbS9zaG1lbS5jPTI4OT1ib29sIHZtYV9pc19zaG1lbShjb25zdCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSlcXG5tbS9zaG1lbS5jLTI5MC17XFxubW0vc2htZW0uYzoyOTE6XFx0cmV0dXJuIHZtYV9pc19hbm9uX3NobWVtKHZtYSkgfHwgdm1hLVxcdTAwM2V2bV9vcHMgPT0gXFx1MDAyNnNobWVtX3ZtX29wcztcXG5tbS9zaG1lbS5jLTI5Mi19XFxuLS1cXG5tbS9zaG1lbS5jPTU5MDg9aW50IHNobWVtX3plcm9fc2V0dXAoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpXFxuLS1cXG5tbS9zaG1lbS5jLTU5MTctXFx0dm1hLVxcdTAwM2V2bV9maWxlID0gZmlsZTtcXG5tbS9zaG1lbS5jOjU5MTg6XFx0dm1hLVxcdTAwM2V2bV9vcHMgPSBcXHUwMDI2c2htZW1fYW5vbl92bV9vcHM7XFxubW0vc2htZW0uYy01OTE5LVxcbi0tXFxubW0vdXNlcmZhdWx0ZmQuYz04Mz1zdGF0aWMgY29uc3Qgc3RydWN0IHZtX3VmZmRfb3BzICp2bWFfdWZmZF9vcHMoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpXFxuLS1cXG5tbS91c2VyZmF1bHRmZC5jLTg2LVxcdFxcdHJldHVybiBcXHUwMDI2YW5vbl91ZmZkX29wcztcXG5tbS91c2VyZmF1bHRmZC5jOjg3OlxcdHJldHVybiB2bWEtXFx1MDAzZXZtX29wcy1cXHUwMDNldWZmZF9vcHM7XFxubW0vdXNlcmZhdWx0ZmQuYy04OC19XFxuLS1cXG5tbS91dGlsLmM9MTE4MD12b2lkIGNvbXBhdF9zZXRfZGVzY19mcm9tX3ZtYShzdHJ1Y3Qgdm1fYXJlYV9kZXNjICpkZXNjLFxcbi0tXFxubW0vdXRpbC5jLTExOTQtXFx0ZGVzYy1cXHUwMDNlcGFnZV9wcm90ID0gdm1hLVxcdTAwM2V2bV9wYWdlX3Byb3Q7XFxubW0vdXRpbC5jOjExOTU6XFx0ZGVzYy1cXHUwMDNldm1fb3BzID0gdm1hLVxcdTAwM2V2bV9vcHM7XFxubW0vdXRpbC5jLTExOTYtXFxuLS1cXG5tbS91dGlsLmM9MTM3Mz1zdGF0aWMgaW50IGNhbGxfdm1hX21hcHBlZChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSlcXG5tbS91dGlsLmMtMTM3NC17XFxubW0vdXRpbC5jOjEzNzU6XFx0Y29uc3Qgc3RydWN0IHZtX29wZXJhdGlvbnNfc3RydWN0ICp2bV9vcHMgPSB2bWEtXFx1MDAzZXZtX29wcztcXG5tbS91dGlsLmMtMTM3Ni1cXHR2b2lkICp2bV9wcml2YXRlX2RhdGEgPSB2bWEtXFx1MDAzZXZtX3ByaXZhdGVfZGF0YTtcXG4tLVxcbm1tL3ZtYS5jPTU0ND1fX3NwbGl0X3ZtYShzdHJ1Y3Qgdm1hX2l0ZXJhdG9yICp2bWksIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxcbi0tXFxubW0vdm1hLmMtNTUzLVxcbm1tL3ZtYS5jOjU1NDpcXHRpZiAodm1hLVxcdTAwM2V2bV9vcHMgXFx1MDAyNlxcdTAwMjYgdm1hLVxcdTAwM2V2bV9vcHMtXFx1MDAzZW1heV9zcGxpdCkge1xcbm1tL3ZtYS5jOjU1NTpcXHRcXHRlcnIgPSB2bWEtXFx1MDAzZXZtX29wcy1cXHUwMDNlbWF5X3NwbGl0KHZtYSwgYWRkcik7XFxubW0vdm1hLmMtNTU2LVxcdFxcdGlmIChlcnIpXFxuLS1cXG5tbS92bWEuYz04NTU9c3RhdGljIGJvb2wgY2FuX21lcmdlX3JlbW92ZV92bWEoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpXFxubW0vdm1hLmMtODU2LXtcXG5tbS92bWEuYzo4NTc6XFx0cmV0dXJuICF2bWEtXFx1MDAzZXZtX29wcyB8fCAhdm1hLVxcdTAwM2V2bV9vcHMtXFx1MDAzZWNsb3NlO1xcbm1tL3ZtYS5jLTg1OC19XFxuLS1cXG5tbS92bWEuYz0xOTQ0PXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqY29weV92bWEoc3RydWN0IHZtX2FyZWFfc3RydWN0ICoqdm1hcCxcXG4tLVxcbm1tL3ZtYS5jLTIwMTYtXFx0XFx0XFx0Z2V0X2ZpbGUobmV3X3ZtYS1cXHUwMDNldm1fZmlsZSk7XFxubW0vdm1hLmM6MjAxNzpcXHRcXHRpZiAobmV3X3ZtYS1cXHUwMDNldm1fb3BzIFxcdTAwMjZcXHUwMDI2IG5ld192bWEtXFx1MDAzZXZtX29wcy1cXHUwMDNlb3BlbilcXG5tbS92bWEuYzoyMDE4OlxcdFxcdFxcdG5ld192bWEtXFx1MDAzZXZtX29wcy1cXHUwMDNlb3BlbihuZXdfdm1hKTtcXG5tbS92bWEuYy0yMDE5LVxcdFxcdGlmICh2bWFfbGluayhtbSwgbmV3X3ZtYSkpXFxuLS1cXG5tbS92bWEuYz0yMTg1PWJvb2wgdm1hX25lZWRzX2RpcnR5X3RyYWNraW5nKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKVxcbi0tXFxubW0vdm1hLmMtMjE5MS1cXHQvKiBEb2VzIHRoZSBmaWxlc3lzdGVtIG5lZWQgdG8gYmUgbm90aWZpZWQ/ICovXFxubW0vdm1hLmM6MjE5MjpcXHRpZiAodm1fb3BzX25lZWRzX3dyaXRlbm90aWZ5KHZtYS1cXHUwMDNldm1fb3BzKSlcXG5tbS92bWEuYy0yMTkzLVxcdFxcdHJldHVybiB0cnVlO1xcbi0tXFxubW0vdm1hLmM9MjIwOD1ib29sIHZtYV93YW50c193cml0ZW5vdGlmeShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgcGdwcm90X3Qgdm1fcGFnZV9wcm90KVxcbi0tXFxubW0vdm1hLmMtMjIxNC1cXHQvKiBUaGUgYmFja2VyIHdpc2hlcyB0byBrbm93IHdoZW4gcGFnZXMgYXJlIGZpcnN0IHdyaXR0ZW4gdG8/ICovXFxubW0vdm1hLmM6MjIxNTpcXHRpZiAodm1fb3BzX25lZWRzX3dyaXRlbm90aWZ5KHZtYS1cXHUwMDNldm1fb3BzKSlcXG5tbS92bWEuYy0yMjE2LVxcdFxcdHJldHVybiB0cnVlO1xcbi0tXFxubW0vdm1hLmM9Mjc5OT1zdGF0aWMgdm9pZCBzZXRfdm1hX3VzZXJfZGVmaW5lZF9maWVsZHMoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXFxuLS1cXG5tbS92bWEuYy0yODAyLVxcdGlmIChtYXAtXFx1MDAzZXZtX29wcylcXG5tbS92bWEuYzoyODAzOlxcdFxcdHZtYS1cXHUwMDNldm1fb3BzID0gbWFwLVxcdTAwM2V2bV9vcHM7XFxubW0vdm1hLmMtMjgwNC1cXHRlbHNlXFx0LyogT25seSAvZGV2L3plcm8gc2hvdWxkIGRvIHRoaXMuICovXFxuLS1cXG5tbS92bWEuYz0zNDYxPXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqX19pbnN0YWxsX3NwZWNpYWxfbWFwcGluZyhcXG4tLVxcbm1tL3ZtYS5jLTM0ODItXFxubW0vdm1hLmM6MzQ4MzpcXHR2bWEtXFx1MDAzZXZtX29wcyA9IG9wcztcXG5tbS92bWEuYy0zNDg0LVxcdHZtYS1cXHUwMDNldm1fcHJpdmF0ZV9kYXRhID0gcHJpdjtcXG4tLVxcbm1tL3ZtYS5oPTM4OT1zdGF0aWMgaW5saW5lIHZvaWQgY29tcGF0X3NldF92bWFfZnJvbV9kZXNjKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxcbi0tXFxubW0vdm1hLmgtNDA1LVxcdC8qIFVzZXItZGVmaW5lZCBmaWVsZHMuICovXFxubW0vdm1hLmg6NDA2OlxcdHZtYS1cXHUwMDNldm1fb3BzID0gZGVzYy1cXHUwMDNldm1fb3BzO1xcbm1tL3ZtYS5oLTQwNy1cXHR2bWEtXFx1MDAzZXZtX3ByaXZhdGVfZGF0YSA9IGRlc2MtXFx1MDAzZXByaXZhdGVfZGF0YTtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDdUMjE6NTU6MzEuNDczNjUxMzc2WiIsIlNlcSI6OSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6NTY1NTUzMTI4MCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipNeSBBbmFseXNpcyBvZiB0aGlzIFBvdGVudGlhbCBWdWxuZXJhYmlsaXR5KipcblxuT2theSwgaGVyZSdzIHRoZSBicmVha2Rvd24gb2YgbXkgdGhpbmtpbmcuIE15IGluaXRpYWwgY29uY2VybiBzdGVtbWVkIGZyb20gdGhlIGBtbWFwX2ZpbGVgIGZ1bmN0aW9uIGFuZCB0aGUgcG90ZW50aWFsIGZvciBhIG51bGwgcG9pbnRlciBkZXJlZmVyZW5jZS4gSSBzZWUgdGhhdCBhbm9ueW1vdXMgVk1BcyBhbmQgZHVtbXkgb25lcyB1c2UgYHZtYV9kdW1teV92bV9vcHNgLCBidXQgSSdtIHRoaW5raW5nIGFib3V0IHRoZSBjYXNlIHdoZXJlIGEgZHJpdmVyIG1pZ2h0IHNldCBgdm1hLVx1MDAzZXZtX29wcyA9IE5VTExgIGludGVudGlvbmFsbHkgb3IgYnkgb3ZlcnNpZ2h0LiBJJ20gaW1hZ2luaW5nIGEgc2NlbmFyaW8gd2hlcmUsIGV2ZW4gaWYgdGhlIGR1bW15IG9wZXJhdGlvbnMgYXJlIHByZXNlbnQsIGEgZHJpdmVyIGNvdWxkIHNldCB0aGlzIHBvaW50ZXIgdG8gbnVsbC4gV2hhdCBoYXBwZW5zIHRoZW4gd2hlbiB0aGUgY29kZSBsYXRlciB0cmllcyB0byB1c2UgYHZtYS1cdTAwM2V2bV9vcHNgIHdpdGhvdXQgY2hlY2tpbmcgaWYgaXQncyBOVUxMP1xuXG5UaGVuIEkgemVyb2VkIGluIG9uIHRoZSBgbW0vaHVnZV9tZW1vcnkuY2AgZmlsZSwgc3BlY2lmaWNhbGx5IHRoZSBgdm1hX2ZpbGVfYnlwYXNzX3RocF90dW5lYWJsZXNgIGZ1bmN0aW9uLiBJIHNlZSBhbiAqdW5jb25kaXRpb25hbCogZGVyZWZlcmVuY2Ugb2YgYHZtYS1cdTAwM2V2bV9vcHNgIGluIHRoaXMgZnVuY3Rpb246IGBjb25zdCBib29sIGhhc19odWdlX2ZhdWx0ID0gdm1hLVx1MDAzZXZtX29wcy1cdTAwM2VodWdlX2ZhdWx0O2AuIFRoaXMgaXMgYSBiaWcgcmVkIGZsYWchIEJlZm9yZSBpdCB3YXMgc29tZXRoaW5nIGxpa2UgYGlmICgoKGluX3BmIHx8IHNtYXBzKSkgXHUwMDI2XHUwMDI2IHZtYS1cdTAwM2V2bV9vcHMtXHUwMDNlaHVnZV9mYXVsdClgLCBidXQgbm93LCBpdCdzIHN0cmFpZ2h0LXVwIGRlcmVmZXJlbmNpbmcuXG5cbk15IG1pbmQgcmFjZWQgdG8gdGhlIHF1ZXN0aW9uIG9mIHdoZXRoZXIgYHZtYS1cdTAwM2V2bV9vcHNgIGlzICphbHdheXMqIG5vbi1OVUxMIHdoZW4gaXQgaXMgbm90IGFub255bW91cywgYnV0IHRoZW4gSSByZWFsaXplZCBpdCBkb2Vzbid0IG1hdHRlciwgbm93LCBpdCdzIGJlaW5nIGRlcmVmZXJlbmNlZCB1bmNvbmRpdGlvbmFsbHksIHdoZXRoZXIgaXQgaXMgb3IgaXNuJ3QuIFNvLCBpZiBgdm1hLVx1MDAzZXZtX29wc2AgKmlzKiBOVUxMIGluIHRoYXQgY29udGV4dCwgdGhlbiB3ZSBoYXZlIGEgY2xhc3NpYyBudWxsIHBvaW50ZXIgZGVyZWZlcmVuY2UgdnVsbmVyYWJpbGl0eS5cblxuTm93LCBJIHN3aXRjaGVkIGdlYXJzIHRvIHRyaWFnZS4gSSBrbm93IHRoYXQgbWVtb3J5IG1hbmFnZW1lbnQgY29kZSBpcyBjcml0aWNhbC4gSSdtIGdvaW5nIHRocm91Z2ggdGhlIHRyaWFnZSBjcml0ZXJpYSBpbiBteSBoZWFkOiBjaGFuZ2VzIGluIG1lbW9yeSBtYW5hZ2VtZW50IChtbS8pLCBzeW5jaHJvbml6YXRpb24vbG9ja2luZywgQlBGLCBzY2hlZHVsZXIsIGNvcmUgbmV0d29ya2luZywgVkZTLCBvciBzeXNjYWxsIGhhbmRsaW5nPyBUaGlzIGlzICpkZWZpbml0ZWx5KiBjb3JlIG1lbW9yeSBtYW5hZ2VtZW50LCBzcGVjaWZpY2FsbHkgcmVsYXRlZCB0byBUSFAgKFRyYW5zcGFyZW50IEh1Z2UgUGFnZXMpLiBJdCdzIG1vZGlmeWluZyBgdm1hX2ZpbGVfYnlwYXNzX3RocF90dW5lYWJsZXNgLCBzbyBpdCdzIGEgZGlyZWN0IGNoYW5nZSBpbiBob3cgVEhQIG9yZGVycyBhcmUgY2FsY3VsYXRlZCBmb3IgZmlsZS1iYWNrZWQgVk1Bcy5cblxuSSB0aGluayB0aHJvdWdoIHRoZSBwb3RlbnRpYWwgcmVhY2hhYmlsaXR5OiBUaGlzIGNvZGUgaXMgdXNlZCBieSBgbWFkdmlzZShNQURWX0NPTExBUFNFKWAsIGR1cmluZyBwYWdlIGZhdWx0cyBvbiBmaWxlIFZNQXMsIHZpYSBgL3Byb2MvcGlkL3NtYXBzYCwgYW5kIGJ5IGBraHVnZXBhZ2VkYC4gQWJzb2x1dGVseSByZWFjaGFibGUgaW4gdHlwaWNhbCBRRU1VL3g4Nl82NCBzZXR1cHMuIFNvLCBiYXNlZCBvbiB0aGUgcmVhY2hhYmlsaXR5IGFuZCB0aGUgcG90ZW50aWFsIGZvciBhIG51bGwgZGVyZWZlcmVuY2UgaW4gY29yZSBtZW1vcnkgbWFuYWdlbWVudCwgSSdtIG1hcmtpbmcgaXQgYXMgZGVmaW5pdGVseSBgV29ydGhGdXp6aW5nPXRydWVgLlxuXG5OZXh0LCBJJ2xsIGZvY3VzIG9uIG5haWxpbmcgZG93biB0aGUgbmVjZXNzYXJ5IGBFbmFibGVDb25maWdzYCwgaWRlbnRpZnlpbmcgdGhlIGBGb2N1c1N5bWJvbHNgLCBhbmQgdGhlIHNwZWNpZmljIHJlYXNvbnMgd2h5IHRoaXMgcGF0Y2ggaXMgcGFydGljdWxhcmx5IGNvbmNlcm5pbmcgdG8gd3JpdGUgYSBzb2xpZCBqdXN0aWZpY2F0aW9uIGZvciB0aGlzIGFuYWx5c2lzLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxNDc0MSwiT3V0cHV0VG9rZW5zIjoyNSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjc0MiwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0wN1QyMTo1NTozNy4xMjkxODU3NzZaIiwiU2VxIjoxMCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjYxNzU5MzM5LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImh1Z2VfbWVtb3J5XCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIm1tL1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJtbS9NYWtlZmlsZT0xMDA9b2JqLSQoQ09ORklHX0RFVklDRV9NSUdSQVRJT04pICs9IG1pZ3JhdGVfZGV2aWNlLm9cXG5tbS9NYWtlZmlsZToxMDE6b2JqLSQoQ09ORklHX1RSQU5TUEFSRU5UX0hVR0VQQUdFKSArPSBodWdlX21lbW9yeS5vIGtodWdlcGFnZWQub1xcbm1tL01ha2VmaWxlLTEwMi1vYmotJChDT05GSUdfUEFHRV9DT1VOVEVSKSArPSBwYWdlX2NvdW50ZXIub1xcbi0tXFxubW0vaW50ZXJuYWwuaD0xMjgyPWludCBfX211c3RfY2hlY2sgdHJ5X2dyYWJfZm9saW8oc3RydWN0IGZvbGlvICpmb2xpbywgaW50IHJlZnMsXFxuLS1cXG5tbS9pbnRlcm5hbC5oLTEyODUtLypcXG5tbS9pbnRlcm5hbC5oOjEyODY6ICogbW0vaHVnZV9tZW1vcnkuY1xcbm1tL2ludGVybmFsLmgtMTI4Ny0gKi9cXG4tLVxcbm1tL2todWdlcGFnZWQuYz0zMz1lbnVtIHNjYW5fcmVzdWx0IHtcXG4tLVxcbm1tL2todWdlcGFnZWQuYy02OC0jZGVmaW5lIENSRUFURV9UUkFDRV9QT0lOVFNcXG5tbS9raHVnZXBhZ2VkLmM6Njk6I2luY2x1ZGUgXFx1MDAzY3RyYWNlL2V2ZW50cy9odWdlX21lbW9yeS5oXFx1MDAzZVxcbm1tL2todWdlcGFnZWQuYy03MC1cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDdUMjE6NTU6MzcuMTkwOTUxNjM1WiIsIlNlcSI6MTEsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjIwNTQzODM5OTIsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGhlcmUncyBteSBpbnRlcnByZXRhdGlvbiBvZiB0aGF0IHRob3VnaHQgcHJvY2VzcywgYXMgaWYgaXQgd2VyZSBteSBvd246XG5cbioqSW52ZXN0aWdhdGluZyB0aGUgRGVwZW5kZW5jeSBvZiBIdWdlIE1lbW9yeSBTdXBwb3J0KipcblxuUmlnaHQsIHNvIGBodWdlX21lbW9yeS5vYCBpcyB0aHJvd2luZyBhIGZpdCwgYW5kIEkga25vdyB0aGF0IG1lYW5zIGl0IG5lZWRzIHRyYW5zcGFyZW50IGh1Z2UgcGFnZXMgZW5hYmxlZC4gVGhlIGZpcnN0IGxvZ2ljYWwgc3RlcCBpcyB0byBjb25maXJtIHRoZSBkZXBlbmRlbmN5LiBJIG5lZWQgdG8gZGlnIGludG8gdGhlIGtlcm5lbCBjb25maWd1cmF0aW9uIHRvIGJlIHN1cmUuIFNvLCBJIG5lZWQgdG8gY2hlY2sgdGhlIEtjb25maWcgZGVmaW5pdGlvbiBvZiBgVFJBTlNQQVJFTlRfSFVHRVBBR0VgLiBUaGF0J3Mgd2hlcmUgYWxsIHRoZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgYXJlIGRlY2xhcmVkLCBhbmQgdGhlIGRlcGVuZGVuY2llcyBhcmUgc3BlbGxlZCBvdXQuIEl0J3MgbGlrZWx5IGluIGBtbS9LY29uZmlnYCwgYXMgdGhlIG1lbW9yeSBtYW5hZ2VtZW50IHN1YnN5c3RlbSBpcyB0aGUgb2J2aW91cyBwbGFjZSBmb3IgdGhhdC4gTGV0J3MgZ28gdGFrZSBhIGxvb2sgdGhlcmUgYW5kIGNvbmZpcm0gdGhhdCBgQ09ORklHX1RSQU5TUEFSRU5UX0hVR0VQQUdFYCBpcyBpbmRlZWQgYSBoYXJkIHJlcXVpcmVtZW50IGZvciB0aGUgZnVuY3Rpb25hbGl0eSBJJ20gdHJ5aW5nIHRvIGVuYWJsZS5cblxuXG4iLCJJbnB1dFRva2VucyI6MTYzODMsIk91dHB1dFRva2VucyI6MzAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo0OCwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0wN1QyMTo1NTozOS4yNDUzMzg3OTdaIiwiU2VxIjoxMiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjExMDM5ODk2NSwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwibW0vXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm1tL0tjb25maWc9ODMyPWNvbmZpZyBNTV9JRFxcbi0tXFxubW0vS2NvbmZpZy04MzQtXFxubW0vS2NvbmZpZzo4MzU6bWVudWNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRVxcbm1tL0tjb25maWctODM2LVxcdGJvb2wgXFxcIlRyYW5zcGFyZW50IEh1Z2VwYWdlIFN1cHBvcnRcXFwiXFxuLS1cXG5tbS9LY29uZmlnPTg1Mz1jaG9pY2VcXG4tLVxcbm1tL0tjb25maWctODU4LVxcbm1tL0tjb25maWc6ODU5OlxcdGNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRV9BTFdBWVNcXG5tbS9LY29uZmlnLTg2MC1cXHRcXHRib29sIFxcXCJhbHdheXNcXFwiXFxuLS1cXG5tbS9LY29uZmlnLTg2NS1cXG5tbS9LY29uZmlnOjg2NjpcXHRjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VfTUFEVklTRVxcbm1tL0tjb25maWctODY3LVxcdFxcdGJvb2wgXFxcIm1hZHZpc2VcXFwiXFxuLS1cXG5tbS9LY29uZmlnLTg3NC1cXG5tbS9LY29uZmlnOjg3NTpcXHRjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VfTkVWRVJcXG5tbS9LY29uZmlnLTg3Ni1cXHRcXHRib29sIFxcXCJuZXZlclxcXCJcXG4tLVxcbm1tL0tjb25maWc9ODgyPWNob2ljZVxcbi0tXFxubW0vS2NvbmZpZy04OTEtXFxubW0vS2NvbmZpZzo4OTI6XFx0Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX1NITUVNX0hVR0VfTkVWRVJcXG5tbS9LY29uZmlnLTg5My1cXHRcXHRib29sIFxcXCJuZXZlclxcXCJcXG4tLVxcbm1tL0tjb25maWctOTAxLVxcbm1tL0tjb25maWc6OTAyOlxcdGNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRV9TSE1FTV9IVUdFX0FMV0FZU1xcbm1tL0tjb25maWctOTAzLVxcdFxcdGJvb2wgXFxcImFsd2F5c1xcXCJcXG4tLVxcbm1tL0tjb25maWctOTA5LVxcbm1tL0tjb25maWc6OTEwOlxcdGNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRV9TSE1FTV9IVUdFX1dJVEhJTl9TSVpFXFxubW0vS2NvbmZpZy05MTEtXFx0XFx0Ym9vbCBcXFwid2l0aGluX3NpemVcXFwiXFxuLS1cXG5tbS9LY29uZmlnLTkxNy1cXG5tbS9LY29uZmlnOjkxODpcXHRjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VfU0hNRU1fSFVHRV9BRFZJU0VcXG5tbS9LY29uZmlnLTkxOS1cXHRcXHRib29sIFxcXCJhZHZpc2VcXFwiXFxuLS1cXG5tbS9LY29uZmlnPTkyNz1jaG9pY2VcXG4tLVxcbm1tL0tjb25maWctOTM2LVxcbm1tL0tjb25maWc6OTM3OlxcdGNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRV9UTVBGU19IVUdFX05FVkVSXFxubW0vS2NvbmZpZy05MzgtXFx0XFx0Ym9vbCBcXFwibmV2ZXJcXFwiXFxuLS1cXG5tbS9LY29uZmlnLTk0NS1cXG5tbS9LY29uZmlnOjk0NjpcXHRjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VfVE1QRlNfSFVHRV9BTFdBWVNcXG5tbS9LY29uZmlnLTk0Ny1cXHRcXHRib29sIFxcXCJhbHdheXNcXFwiXFxuLS1cXG5tbS9LY29uZmlnLTk1My1cXG5tbS9LY29uZmlnOjk1NDpcXHRjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VfVE1QRlNfSFVHRV9XSVRISU5fU0laRVxcbm1tL0tjb25maWctOTU1LVxcdFxcdGJvb2wgXFxcIndpdGhpbl9zaXplXFxcIlxcbi0tXFxubW0vS2NvbmZpZy05NjEtXFxubW0vS2NvbmZpZzo5NjI6XFx0Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX1RNUEZTX0hVR0VfQURWSVNFXFxubW0vS2NvbmZpZy05NjMtXFx0XFx0Ym9vbCBcXFwiYWR2aXNlXFxcIlxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wN1QyMTo1NTozOS4zNTU3NDIwMDJaIiwiU2VxIjoxMywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6MjE3NjE2MTMyOCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IHRha2Ugb24gdGhlIGRlcGVuZGVuY2llcyBvZiBgVFJBTlNQQVJFTlRfSFVHRVBBR0VgIGluIGBtbS9LY29uZmlnYCwgYXMgaWYgSSB3ZXJlIHRoZSBvbmUgdGhpbmtpbmcgaXQgdGhyb3VnaDpcblxuKipEZWNvbnN0cnVjdGluZyBUUkFOU1BBUkVOVF9IVUdFUEFHRSBEZXBlbmRlbmNpZXMqKlxuXG5Pa2F5LCBsZXQncyBkaXZlIGludG8gdGhlIGBtbS9LY29uZmlnYCBmaWxlIGFuZCBmaWd1cmUgb3V0IHdoYXQgbWFrZXMgYFRSQU5TUEFSRU5UX0hVR0VQQUdFYCB0aWNrLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCB3aGF0IG90aGVyIGtlcm5lbCBmZWF0dXJlcywgY29uZmlndXJhdGlvbiBvcHRpb25zLCBvciBhcmNoaXRlY3R1cmFsIGNvbnN0cmFpbnRzIGRpY3RhdGUgd2hldGhlciB0aGlzIHRoaW5nIGlzIGV2ZW4gKnBvc3NpYmxlKiB0byBlbmFibGUsIG11Y2ggbGVzcyAqYSBnb29kIGlkZWEqLiBObyBkb3VidCB0aGVyZSBhcmUgZGVwZW5kZW5jaWVzIG9uIHBhZ2Ugc2l6ZSwgbWF5YmUgc3BlY2lmaWMgQ1BVIGFyY2hpdGVjdHVyZXMsIGFuZCBwcm9iYWJseSBzb21lIGludGVyYWN0aW9uIHdpdGggTlVNQSBjb25maWd1cmF0aW9ucy4gSSdtIGVzcGVjaWFsbHkgaW50ZXJlc3RlZCBpbiB3aGV0aGVyIHRoZXJlIGFyZSBoYXJkIGRlcGVuZGVuY2llcyBvciBqdXN0IFwiaW1wbGllc1wiIHJlbGF0aW9uc2hpcHMuIEFyZSB0aGVyZSBhbnkgZmVhdHVyZXMgd2hpY2ggcmVxdWlyZSBpdCwgb3Igd2hpY2ggaXQgcmVxdWlyZXM/IEknbGwgcHJvYmFibHkgYmUgbG9va2luZyBmb3Igb3B0aW9ucyByZWxhdGVkIHRvIG1lbW9yeSBtYW5hZ2VtZW50IGFuZCBhbGxvY2F0aW9uLiBJ4oCZbSB0aGlua2luZyBhYm91dCBwZXJmb3JtYW5jZSBjb25zaWRlcmF0aW9ucyB0b28g4oCTIGh1Z2VwYWdlcyBhcmUgYSBkb3VibGUtZWRnZWQgc3dvcmQsIHNvIHRoZSAqY29uZGl0aW9ucyogZm9yIHRoZWlyIHVzZSBtdXN0IGJlIGNhcmVmdWxseSBjb25zaWRlcmVkLiBJdCdzIHRpbWUgdG8gc2lmdCB0aHJvdWdoIHRoZSBLY29uZmlnIGFuZCBicmVhayB0aGlzIGRvd24uXG5cblxuIiwiSW5wdXRUb2tlbnMiOjE3MzU1LCJPdXRwdXRUb2tlbnMiOjMyLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjQsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMDdUMjE6NTU6NDEuNTMxOTA2MzJaIiwiU2VxIjoxNCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTQ3MjQwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcIm1tL0tjb25maWdcIixcbiAgXCJGaXJzdExpbmVcIjogODMwLFxuICBcIkxpbmVDb3VudFwiOiA0MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgODMwOlxcdFxcdCAgbWVtb3J5IGNvbnN0cmFpbmVkLlxcbiA4MzE6XFx0XFxuIDgzMjpcXHRjb25maWcgTU1fSURcXG4gODMzOlxcdFxcdGRlZl9ib29sIG5cXG4gODM0OlxcdFxcbiA4MzU6XFx0bWVudWNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRVxcbiA4MzY6XFx0XFx0Ym9vbCBcXFwiVHJhbnNwYXJlbnQgSHVnZXBhZ2UgU3VwcG9ydFxcXCJcXG4gODM3OlxcdFxcdGRlcGVuZHMgb24gSEFWRV9BUkNIX1RSQU5TUEFSRU5UX0hVR0VQQUdFIFxcdTAwMjZcXHUwMDI2ICFQUkVFTVBUX1JUXFxuIDgzODpcXHRcXHRzZWxlY3QgQ09NUEFDVElPTlxcbiA4Mzk6XFx0XFx0c2VsZWN0IFhBUlJBWV9NVUxUSVxcbiA4NDA6XFx0XFx0c2VsZWN0IE1NX0lEXFxuIDg0MTpcXHRcXHRoZWxwXFxuIDg0MjpcXHRcXHQgIFRyYW5zcGFyZW50IEh1Z2VwYWdlcyBhbGxvd3MgdGhlIGtlcm5lbCB0byB1c2UgaHVnZSBwYWdlcyBhbmRcXG4gODQzOlxcdFxcdCAgaHVnZSB0bGIgdHJhbnNwYXJlbnRseSB0byB0aGUgYXBwbGljYXRpb25zIHdoZW5ldmVyIHBvc3NpYmxlLlxcbiA4NDQ6XFx0XFx0ICBUaGlzIGZlYXR1cmUgY2FuIGltcHJvdmUgY29tcHV0aW5nIHBlcmZvcm1hbmNlIHRvIGNlcnRhaW5cXG4gODQ1OlxcdFxcdCAgYXBwbGljYXRpb25zIGJ5IHNwZWVkaW5nIHVwIHBhZ2UgZmF1bHRzIGR1cmluZyBtZW1vcnlcXG4gODQ2OlxcdFxcdCAgYWxsb2NhdGlvbiwgYnkgcmVkdWNpbmcgdGhlIG51bWJlciBvZiB0bGIgbWlzc2VzIGFuZCBieSBzcGVlZGluZ1xcbiA4NDc6XFx0XFx0ICB1cCB0aGUgcGFnZXRhYmxlIHdhbGtpbmcuXFxuIDg0ODpcXHRcXG4gODQ5OlxcdFxcdCAgSWYgbWVtb3J5IGNvbnN0cmFpbmVkIG9uIGVtYmVkZGVkLCB5b3UgbWF5IHdhbnQgdG8gc2F5IE4uXFxuIDg1MDpcXHRcXG4gODUxOlxcdGlmIFRSQU5TUEFSRU5UX0hVR0VQQUdFXFxuIDg1MjpcXHRcXG4gODUzOlxcdGNob2ljZVxcbiA4NTQ6XFx0XFx0cHJvbXB0IFxcXCJUcmFuc3BhcmVudCBIdWdlcGFnZSBTdXBwb3J0IHN5c2ZzIGRlZmF1bHRzXFxcIlxcbiA4NTU6XFx0XFx0ZGVmYXVsdCBUUkFOU1BBUkVOVF9IVUdFUEFHRV9BTFdBWVNcXG4gODU2OlxcdFxcdGhlbHBcXG4gODU3OlxcdFxcdCAgU2VsZWN0cyB0aGUgc3lzZnMgZGVmYXVsdHMgZm9yIFRyYW5zcGFyZW50IEh1Z2VwYWdlIFN1cHBvcnQuXFxuIDg1ODpcXHRcXG4gODU5OlxcdFxcdGNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRV9BTFdBWVNcXG4gODYwOlxcdFxcdFxcdGJvb2wgXFxcImFsd2F5c1xcXCJcXG4gODYxOlxcdFxcdGhlbHBcXG4gODYyOlxcdFxcdCAgRW5hYmxpbmcgVHJhbnNwYXJlbnQgSHVnZXBhZ2UgYWx3YXlzLCBjYW4gaW5jcmVhc2UgdGhlXFxuIDg2MzpcXHRcXHQgIG1lbW9yeSBmb290cHJpbnQgb2YgYXBwbGljYXRpb25zIHdpdGhvdXQgYSBndWFyYW50ZWVkXFxuIDg2NDpcXHRcXHQgIGJlbmVmaXQgYnV0IGl0IHdpbGwgd29yayBhdXRvbWF0aWNhbGx5IGZvciBhbGwgYXBwbGljYXRpb25zLlxcbiA4NjU6XFx0XFxuIDg2NjpcXHRcXHRjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VfTUFEVklTRVxcbiA4Njc6XFx0XFx0XFx0Ym9vbCBcXFwibWFkdmlzZVxcXCJcXG4gODY4OlxcdFxcdGhlbHBcXG4gODY5OlxcdFxcdCAgRW5hYmxpbmcgVHJhbnNwYXJlbnQgSHVnZXBhZ2UgbWFkdmlzZSwgd2lsbCBvbmx5IHByb3ZpZGUgYVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wN1QyMTo1NTo0MS41MzIwNTYyNloiLCJTZXEiOjE1LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjoyNTM5OTg4Mzg1LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyBUcmFuc3BhcmVudCBIdWdlIFBhZ2VzIENvbmZpZ3VyYXRpb24qKlxuXG5Pa2F5LCBzbyB0aGUgbWFpbiB0aGluZyB0byBiZSBsb29raW5nIGF0IGhlcmUgaXMgYENPTkZJR19UUkFOU1BBUkVOVF9IVUdFUEFHRWAuIFRoYXQncyB0aGUgY29yZSBzZXR0aW5nLCBzbyBldmVyeXRoaW5nIGVsc2UgaXMgcHJvYmFibHkgY29udGluZ2VudCBvbiBpdC4gTXkgaW1tZWRpYXRlIHRob3VnaHQgaXMgdG8gdW5kZXJzdGFuZCBob3cgdGhlIHN5c3RlbSBkZWNpZGVzIHdoYXQga2luZCBvZiBodWdlIHBhZ2VzIGl0J3MgZ29pbmcgdG8gYWxsb3cgZm9yIGEgZ2l2ZW4gVk1BLiBJIG5lZWQgdG8gZGlnIGludG8gdGhlIGRlY2lzaW9uLW1ha2luZyBwcm9jZXNzLlxuXG5NeSBuZXh0IHN0ZXAgaXMgdG8gZXhhbWluZSB0aGUgZnVuY3Rpb24gY2FsbHMgZm9yIGBfX3RocF92bWFfYWxsb3dhYmxlX29yZGVyc2AgYW5kIGB0aHBfdm1hX2FsbG93YWJsZV9vcmRlcnNgLiBUaGVzZSBmdW5jdGlvbnMgYXJlICprZXkqIGhlcmUsIHRoaXMgaXMgd2hlcmUgdGhlIHBvbGljeSBpcyBzZXQuIEkgbmVlZCB0byB1bmRlcnN0YW5kIHdoYXQgcGFyYW1ldGVycyBhcmUgYmVpbmcgcGFzc2VkLCB3aGVyZSB0aGVzZSBmdW5jdGlvbnMgYXJlIGJlaW5nIHVzZWQsIGFuZCB3aGF0IGZhY3RvcnMgaW5mbHVlbmNlIHRoZWlyIHJldHVybiB2YWx1ZXMuIEknbGwgbmVlZCB0byBwYXkgY2xvc2UgYXR0ZW50aW9uIHRvIGFueSBzeW1ib2xzIGxpc3RlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhcyAqRm9jdXNTeW1ib2xzKi5cblxuVG8gZ2V0IGEgZnVsbCBwaWN0dXJlLCBhIGdyZXAgYWNyb3NzIHRoZSBlbnRpcmUga2VybmVsIHNvdXJjZSBpcyB0aGUgb2J2aW91cyBuZXh0IHN0ZXAuIEkgbmVlZCBhIGNvbXByZWhlbnNpdmUgbGlzdCBvZiBldmVyeSBpbnN0YW5jZSB3aGVyZSB0aG9zZSB0d28gZnVuY3Rpb25zIGFyZSBpbnZva2VkLiBUaGlzIHdpbGwgaWxsdW1pbmF0ZSB0aGUgZGlmZmVyZW50IGNvbnRleHRzIGluIHdoaWNoIGh1Z2UgcGFnZSBhbGxvY2F0aW9uIGlzIGNvbnNpZGVyZWQsIGFsbG93aW5nIG1lIHRvIGJ1aWxkIGEgY29tcGxldGUgbWVudGFsIG1vZGVsIG9mIGhvdyB0aGUgc3lzdGVtIGhhbmRsZXMgaXQuIFdpdGggdGhpcyBpbmZvcm1hdGlvbiwgSSBjYW4gZXZhbHVhdGUgdGhlIHBlcmZvcm1hbmNlIGltcGxpY2F0aW9ucyBhbmQgcG90ZW50aWFsIHZ1bG5lcmFiaWxpdGllcy5cblxuXG4iLCJJbnB1dFRva2VucyI6MTgxOTQsIk91dHB1dFRva2VucyI6MzIsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo5NSwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA3VDIxOjU1OjQ0LjA3MjA0NzE0NVoiLCJTZXEiOjE2LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6ODgxNTUwNTQsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwidGhwX3ZtYV9hbGxvd2FibGVfb3JkZXJzXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIm1tL1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJtbS9odWdlX21lbW9yeS5jPTE1Mz1zdGF0aWMgYm9vbCB2bWFfZmlsZV9jYW5fbWFwX2h1Z2UoY29uc3Qgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXFxuLS1cXG5tbS9odWdlX21lbW9yeS5jLTE1OS1cXHQgKiBFbmZvcmNlIFRIUCBjb2xsYXBzZSByZXF1aXJlbWVudHMgYXMgbmVjZXNzYXJ5LiBBbm9ueW1vdXMgdm1hc1xcbm1tL2h1Z2VfbWVtb3J5LmM6MTYwOlxcdCAqIHdlcmUgYWxyZWFkeSBoYW5kbGVkIGluIHRocF92bWFfYWxsb3dhYmxlX29yZGVycygpLlxcbm1tL2h1Z2VfbWVtb3J5LmMtMTYxLVxcdCAqL1xcbi0tXFxubW0vaHVnZV9tZW1vcnkuYy0xODEtXFxubW0vaHVnZV9tZW1vcnkuYzoxODI6dW5zaWduZWQgbG9uZyBfX3RocF92bWFfYWxsb3dhYmxlX29yZGVycyhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcXG5tbS9odWdlX21lbW9yeS5jLTE4My1cXHRcXHRcXHRcXHRcXHQgdm1fZmxhZ3NfdCB2bV9mbGFncyxcXG4tLVxcbm1tL2todWdlcGFnZWQuYz01Njg9c3RhdGljIHVuc2lnbmVkIGxvbmcgY29sbGFwc2VfcG9zc2libGVfb3JkZXJzKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxcbi0tXFxubW0va2h1Z2VwYWdlZC5jLTU3OC1cXG5tbS9raHVnZXBhZ2VkLmM6NTc5OlxcdHJldHVybiB0aHBfdm1hX2FsbG93YWJsZV9vcmRlcnModm1hLCB2bV9mbGFncywgdHZhX2ZsYWdzLCBvcmRlcnMpO1xcbm1tL2todWdlcGFnZWQuYy01ODAtfVxcbi0tXFxubW0va2h1Z2VwYWdlZC5jPTEwNjQ9c3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgaHVnZXBhZ2Vfdm1hX3JldmFsaWRhdGUoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgYWRkcmVzcyxcXG4tLVxcbm1tL2todWdlcGFnZWQuYy0xMDg3LVxcdFxcdHJldHVybiBTQ0FOX0FERFJFU1NfUkFOR0U7XFxubW0va2h1Z2VwYWdlZC5jOjEwODg6XFx0aWYgKCF0aHBfdm1hX2FsbG93YWJsZV9vcmRlcnModm1hLCB2bWEtXFx1MDAzZXZtX2ZsYWdzLCB0eXBlLCBCSVQob3JkZXIpKSlcXG5tbS9raHVnZXBhZ2VkLmMtMTA4OS1cXHRcXHRyZXR1cm4gU0NBTl9WTUFfQ0hFQ0s7XFxuLS1cXG5tbS9raHVnZXBhZ2VkLmMtMTA5My1cXHQgKlxcbm1tL2todWdlcGFnZWQuYzoxMDk0OlxcdCAqIHRocF92bWFfYWxsb3dhYmxlX29yZGVycygpIG1heSByZXR1cm4gdHJ1ZSBmb3IgcXVhbGlmaWVkIGZpbGVcXG5tbS9raHVnZXBhZ2VkLmMtMTA5NS1cXHQgKiB2bWFzLlxcbi0tXFxubW0vbWVtb3J5LmM9NDc5NT1zdGF0aWMgdW5zaWduZWQgbG9uZyB0aHBfc3dhcGluX3N1aXRhYmxlX29yZGVycyhzdHJ1Y3Qgdm1fZmF1bHQgKnZtZilcXG4tLVxcbm1tL21lbW9yeS5jLTQ4MjQtXFx0ICovXFxubW0vbWVtb3J5LmM6NDgyNTpcXHRvcmRlcnMgPSB0aHBfdm1hX2FsbG93YWJsZV9vcmRlcnModm1hLCB2bWEtXFx1MDAzZXZtX2ZsYWdzLCBUVkFfUEFHRUZBVUxULFxcbm1tL21lbW9yeS5jLTQ4MjYtXFx0XFx0XFx0XFx0XFx0ICBCSVQoUE1EX09SREVSKSAtIDEpO1xcbi0tXFxubW0vbWVtb3J5LmM9NTMwMT1zdGF0aWMgc3RydWN0IGZvbGlvICphbGxvY19hbm9uX2ZvbGlvKHN0cnVjdCB2bV9mYXVsdCAqdm1mKVxcbi0tXFxubW0vbWVtb3J5LmMtNTMyMy1cXHQgKi9cXG5tbS9tZW1vcnkuYzo1MzI0OlxcdG9yZGVycyA9IHRocF92bWFfYWxsb3dhYmxlX29yZGVycyh2bWEsIHZtYS1cXHUwMDNldm1fZmxhZ3MsIFRWQV9QQUdFRkFVTFQsXFxubW0vbWVtb3J5LmMtNTMyNS1cXHRcXHRcXHRcXHRcXHQgIEJJVChQTURfT1JERVIpIC0gMSk7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA3VDIxOjU1OjQ0LjE2MDIwNjkwOVoiLCJTZXEiOjE3LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjoyNzQ2ODQwNDAzLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgbXkgdGhpbmtpbmc6XG5cbioqSW52ZXN0aWdhdGluZyBDYWxsZXJzIFJlbGF0ZWQgdG8gSHVnZSBQYWdlcyoqXG5cbk9rYXksIEkgbmVlZCB0byBleHBhbmQgbXkgc2VhcmNoIHRvIGlkZW50aWZ5ICphbGwqIHRoZSBwbGFjZXMgd2l0aGluIHRoZSBrZXJuZWwgdGhhdCBpbnRlcmFjdCB3aXRoIGh1Z2UgcGFnZXMuIFRoZSBpbml0aWFsIHNlYXJjaCB3YXMgYSBnb29kIHN0YXJ0LCBidXQgSSBrbm93IHRoZXJlIGFyZSBsaWtlbHkgbW9yZSBzY2F0dGVyZWQgY2FsbHMuIE15IGluc3RpbmN0IGlzIHRvIHJ1biBhIGBncmVwYCBjb21tYW5kLCBidXQgbm93IEkgbmVlZCB0byBkZXRlcm1pbmUgd2hlcmUgdG8gZm9jdXMgaXQuIE15IGltbWVkaWF0ZSB0aG91Z2h0IGlzIHRvIHRhcmdldCBhIGNvdXBsZSBvZiBrZXkgYXJlYXMuXG5cbkZpcnN0LCB0aGUgYGZzL3Byb2MvYCBkaXJlY3RvcnkgaXMgYSBsaWtlbHkgY2FuZGlkYXRlIGJlY2F1c2UgdGhlIHByb2MgZmlsZXN5c3RlbSBwcm92aWRlcyBhIHdpbmRvdyBpbnRvIHZhcmlvdXMga2VybmVsIGludGVybmFscywgaW5jbHVkaW5nIG1lbW9yeSBtYW5hZ2VtZW50LiBJdCdzIGEgcHJpbWUgc3BvdCB0byBmaW5kIGNvZGUgdGhhdCBleHBvc2VzIG9yIG1hbmlwdWxhdGVzIGh1Z2UgcGFnZSBpbmZvcm1hdGlvbi4gU28gdGhhdCBzaG91bGQgYmUgYSB1c2VmdWwgc2VhcmNoLlxuXG5UaGVuLCB0byBiZSB0aG9yb3VnaCwgSSBzaG91bGQgYWxzbyBsb29rIGF0IHRoZSBpbmNsdWRlIGZpbGVzLiBJdCdzIGFsbW9zdCBndWFyYW50ZWVkIHRoZSBkZWZpbml0aW9uIG9mIHRoZSBzdHJ1Y3R1cmVzLCBhbmQgcmVsYXRlZCBtYWNyb3MsIGFyZSBpbiB0aGUgYGluY2x1ZGUvbGludXgvaHVnZV9tbS5oYCBoZWFkZXIgZmlsZS4gQnkgZ3JlcHBpbmcgdGhpcyBmaWxlIEkgY2FuIGZpbmQgYW55IHBvdGVudGlhbCBjYWxsZXJzIGRpcmVjdGx5LCBpbmNsdWRpbmcgd2l0aGluIHJlbGF0ZWQgaGVhZGVyIGZpbGVzLiBcblxuQnkgY29tYmluaW5nIHRoZXNlIHR3byBzZWFyY2hlcywgSSBzaG91bGQgZ2V0IGEgY29tcHJlaGVuc2l2ZSB2aWV3IG9mIHRoZSBjb2RlYmFzZSBhbmQgaWRlbnRpZnkgYW55IG92ZXJsb29rZWQgY2FsbHMgb3IgcG90ZW50aWFsbHkgb2JzY3VyZSBpbnRlcmFjdGlvbnMuIEl0IHNob3VsZCBiZSBhIGdvb2Qgc3RhcnRpbmcgcG9pbnQgZm9yIGEgbW9yZSBpbi1kZXB0aCBpbnZlc3RpZ2F0aW9uLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxOTMyOCwiT3V0cHV0VG9rZW5zIjoyNCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjI5LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA3VDIxOjU1OjQ2LjkwNzA1MDYzM1oiLCJTZXEiOjE4LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MjQ3ODg4MzAzNiwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJ0aHBfdm1hX2FsbG93YWJsZV9vcmRlcnNcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiZnMvcHJvYy90YXNrX21tdS5jPTE0NTk9c3RhdGljIGludCBzaG93X3NtYXAoc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp2KVxcbi0tXFxuZnMvcHJvYy90YXNrX21tdS5jLTE0NzYtXFx0c2VxX3ByaW50ZihtLCBcXFwiVEhQZWxpZ2libGU6ICAgICU4dVxcXFxuXFxcIixcXG5mcy9wcm9jL3Rhc2tfbW11LmM6MTQ3NzpcXHRcXHQgICAhIXRocF92bWFfYWxsb3dhYmxlX29yZGVycyh2bWEsIHZtYS1cXHUwMDNldm1fZmxhZ3MsIFRWQV9TTUFQUyxcXG5mcy9wcm9jL3Rhc2tfbW11LmMtMTQ3OC1cXHRcXHRcXHRcXHRcXHQgICAgICBUSFBfT1JERVJTX0FMTCkpO1xcbi0tXFxuaW5jbHVkZS9saW51eC9odWdlX21tLmg9OTc9ZW51bSB0dmFfdHlwZSB7XFxuLS1cXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaC0xMDQtI2RlZmluZSB0aHBfdm1hX2FsbG93YWJsZV9vcmRlcih2bWEsIHZtX2ZsYWdzLCB0eXBlLCBvcmRlcikgXFxcXFxcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oOjEwNTpcXHQoISF0aHBfdm1hX2FsbG93YWJsZV9vcmRlcnModm1hLCB2bV9mbGFncywgdHlwZSwgQklUKG9yZGVyKSkpXFxuaW5jbHVkZS9saW51eC9odWdlX21tLmgtMTA2LVxcbi0tXFxuaW5jbHVkZS9saW51eC9odWdlX21tLmg9Mjc2PXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyB0aHBfdm1hX3N1aXRhYmxlX29yZGVycyhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcXG4tLVxcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oLTI5OC1cXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaDoyOTk6dW5zaWduZWQgbG9uZyBfX3RocF92bWFfYWxsb3dhYmxlX29yZGVycyhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaC0zMDAtXFx0XFx0XFx0XFx0XFx0IHZtX2ZsYWdzX3Qgdm1fZmxhZ3MsXFxuLS1cXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaC0zMDQtLyoqXFxuaW5jbHVkZS9saW51eC9odWdlX21tLmg6MzA1OiAqIHRocF92bWFfYWxsb3dhYmxlX29yZGVycyAtIGRldGVybWluZSBodWdlcGFnZSBvcmRlcnMgdGhhdCBhcmUgYWxsb3dlZCBmb3Igdm1hXFxuaW5jbHVkZS9saW51eC9odWdlX21tLmgtMzA2LSAqIEB2bWE6ICB0aGUgdm0gYXJlYSB0byBjaGVja1xcbi0tXFxuaW5jbHVkZS9saW51eC9odWdlX21tLmg9MzE5PXN0YXRpYyBpbmxpbmVcXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaDozMjA6dW5zaWduZWQgbG9uZyB0aHBfdm1hX2FsbG93YWJsZV9vcmRlcnMoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXFxuaW5jbHVkZS9saW51eC9odWdlX21tLmgtMzIxLVxcdFxcdFxcdFxcdCAgICAgICB2bV9mbGFnc190IHZtX2ZsYWdzLFxcbi0tXFxuaW5jbHVkZS9saW51eC9odWdlX21tLmgtMzQyLVxcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oOjM0MzpcXHRyZXR1cm4gX190aHBfdm1hX2FsbG93YWJsZV9vcmRlcnModm1hLCB2bV9mbGFncywgdHlwZSwgb3JkZXJzKTtcXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaC0zNDQtfVxcbi0tXFxuaW5jbHVkZS9saW51eC9odWdlX21tLmg9NjE5PXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyB0aHBfdm1hX3N1aXRhYmxlX29yZGVycyhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcXG4tLVxcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oLTYyNC1cXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaDo2MjU6c3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHRocF92bWFfYWxsb3dhYmxlX29yZGVycyhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaC02MjYtXFx0XFx0XFx0XFx0XFx0dm1fZmxhZ3NfdCB2bV9mbGFncyxcXG4tLVxcbm1tL2h1Z2VfbWVtb3J5LmM9MTUzPXN0YXRpYyBib29sIHZtYV9maWxlX2Nhbl9tYXBfaHVnZShjb25zdCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcXG4tLVxcbm1tL2h1Z2VfbWVtb3J5LmMtMTU5LVxcdCAqIEVuZm9yY2UgVEhQIGNvbGxhcHNlIHJlcXVpcmVtZW50cyBhcyBuZWNlc3NhcnkuIEFub255bW91cyB2bWFzXFxubW0vaHVnZV9tZW1vcnkuYzoxNjA6XFx0ICogd2VyZSBhbHJlYWR5IGhhbmRsZWQgaW4gdGhwX3ZtYV9hbGxvd2FibGVfb3JkZXJzKCkuXFxubW0vaHVnZV9tZW1vcnkuYy0xNjEtXFx0ICovXFxuLS1cXG5tbS9odWdlX21lbW9yeS5jLTE4MS1cXG5tbS9odWdlX21lbW9yeS5jOjE4Mjp1bnNpZ25lZCBsb25nIF9fdGhwX3ZtYV9hbGxvd2FibGVfb3JkZXJzKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxcbm1tL2h1Z2VfbWVtb3J5LmMtMTgzLVxcdFxcdFxcdFxcdFxcdCB2bV9mbGFnc190IHZtX2ZsYWdzLFxcbi0tXFxubW0va2h1Z2VwYWdlZC5jPTU2OD1zdGF0aWMgdW5zaWduZWQgbG9uZyBjb2xsYXBzZV9wb3NzaWJsZV9vcmRlcnMoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXFxuLS1cXG5tbS9raHVnZXBhZ2VkLmMtNTc4LVxcbm1tL2todWdlcGFnZWQuYzo1Nzk6XFx0cmV0dXJuIHRocF92bWFfYWxsb3dhYmxlX29yZGVycyh2bWEsIHZtX2ZsYWdzLCB0dmFfZmxhZ3MsIG9yZGVycyk7XFxubW0va2h1Z2VwYWdlZC5jLTU4MC19XFxuLS1cXG5tbS9raHVnZXBhZ2VkLmM9MTA2ND1zdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBodWdlcGFnZV92bWFfcmV2YWxpZGF0ZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBhZGRyZXNzLFxcbi0tXFxubW0va2h1Z2VwYWdlZC5jLTEwODctXFx0XFx0cmV0dXJuIFNDQU5fQUREUkVTU19SQU5HRTtcXG5tbS9raHVnZXBhZ2VkLmM6MTA4ODpcXHRpZiAoIXRocF92bWFfYWxsb3dhYmxlX29yZGVycyh2bWEsIHZtYS1cXHUwMDNldm1fZmxhZ3MsIHR5cGUsIEJJVChvcmRlcikpKVxcbm1tL2todWdlcGFnZWQuYy0xMDg5LVxcdFxcdHJldHVybiBTQ0FOX1ZNQV9DSEVDSztcXG4tLVxcbm1tL2todWdlcGFnZWQuYy0xMDkzLVxcdCAqXFxubW0va2h1Z2VwYWdlZC5jOjEwOTQ6XFx0ICogdGhwX3ZtYV9hbGxvd2FibGVfb3JkZXJzKCkgbWF5IHJldHVybiB0cnVlIGZvciBxdWFsaWZpZWQgZmlsZVxcbm1tL2todWdlcGFnZWQuYy0xMDk1LVxcdCAqIHZtYXMuXFxuLS1cXG5tbS9tZW1vcnkuYz00Nzk1PXN0YXRpYyB1bnNpZ25lZCBsb25nIHRocF9zd2FwaW5fc3VpdGFibGVfb3JkZXJzKHN0cnVjdCB2bV9mYXVsdCAqdm1mKVxcbi0tXFxubW0vbWVtb3J5LmMtNDgyNC1cXHQgKi9cXG5tbS9tZW1vcnkuYzo0ODI1OlxcdG9yZGVycyA9IHRocF92bWFfYWxsb3dhYmxlX29yZGVycyh2bWEsIHZtYS1cXHUwMDNldm1fZmxhZ3MsIFRWQV9QQUdFRkFVTFQsXFxubW0vbWVtb3J5LmMtNDgyNi1cXHRcXHRcXHRcXHRcXHQgIEJJVChQTURfT1JERVIpIC0gMSk7XFxuLS1cXG5tbS9tZW1vcnkuYz01MzAxPXN0YXRpYyBzdHJ1Y3QgZm9saW8gKmFsbG9jX2Fub25fZm9saW8oc3RydWN0IHZtX2ZhdWx0ICp2bWYpXFxuLS1cXG5tbS9tZW1vcnkuYy01MzIzLVxcdCAqL1xcbm1tL21lbW9yeS5jOjUzMjQ6XFx0b3JkZXJzID0gdGhwX3ZtYV9hbGxvd2FibGVfb3JkZXJzKHZtYSwgdm1hLVxcdTAwM2V2bV9mbGFncywgVFZBX1BBR0VGQVVMVCxcXG5tbS9tZW1vcnkuYy01MzI1LVxcdFxcdFxcdFxcdFxcdCAgQklUKFBNRF9PUkRFUikgLSAxKTtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDdUMjE6NTU6NDkuMzg1OTQxODI5WiIsIlNlcSI6MTksIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjQyNTM4Mjk1MTIsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqSW52ZXN0aWdhdGluZyBgX190aHBfdm1hX2FsbG93YWJsZV9vcmRlcnNgIGluIHRoZSBIdWdlIFBhZ2VzIFN1YnN5c3RlbSoqXG5cbk9rYXksIHNvIEknbSBsb29raW5nIGF0IGBtbS9odWdlX21lbW9yeS5jYCwgc3BlY2lmaWNhbGx5IGFyb3VuZCB0aGUgVEhQIChUcmFuc3BhcmVudCBIdWdlIFBhZ2VzKSBjb2RlLiBJdCdzIGltbWVkaWF0ZWx5IGludGVyZXN0aW5nIHRoYXQgYF9fdGhwX3ZtYV9hbGxvd2FibGVfb3JkZXJzYCBpc24ndCBzdGF0aWMuIFRoYXQgdGVsbHMgbWUgaXQncyBwb3RlbnRpYWxseSBleHBvc2VkIG91dHNpZGUgb2YgdGhhdCBmaWxlLCB3aGljaCBjb3VsZCBiZSByZWxldmFudC4gTm93LCBsZXQgbWUgcXVpY2tseSBpbnZlbnRvcnkgdGhlIG90aGVyIHN0YXRpYyBmdW5jdGlvbnMgaW4gYG1tL2h1Z2VfbWVtb3J5LmNgIHRvIGdldCB0aGUgY29udGV4dDogYHZtYV9maWxlX2J5cGFzc190aHBfdHVuZWFibGVzYCwgYHZtYV9maWxlX2FsbG93X3RocF90dW5lYWJsZXNgLCBgdm1hX2ZpbGVfY2hlY2tfdGhwX3R1bmVhYmxlc2AsIGB2bWFfZmlsZV9jYW5fbWFwX2h1Z2VgLCBhbmQgYGZpbGVfdGhwX2VuYWJsZWRgLiBUaGVzZSBhbGwgc2VlbSByZWxhdGVkIHRvIFZNQSAoVmlydHVhbCBNZW1vcnkgQXJlYSkgbWFuYWdlbWVudCBhbmQgZmlsZS1iYWNrZWQgVEhQIGNvbmZpZ3VyYXRpb24gb3IgZGVjaXNpb25zLlxuXG5Ob3csIHdoZXJlIGVsc2UgaXMgdGhpcyBzdHVmZiBnZXR0aW5nIGNhbGxlZCBvciByZWxhdGVkIHRvPyBJIHNob3VsZCBleHBhbmQgdGhlIHNlYXJjaCB0byBmaW5kIGNhbGxlcnMuIFNpbmNlIFRIUCBpcyBvZnRlbiByZWxhdGVkIHRvIHRoZSBiYWNrZ3JvdW5kIGRlZnJhZywgaXQncyB3b3J0aCBjaGVja2luZyBga2h1Z2VwYWdlZC5jYC4gSW4gYGtodWdlcGFnZWQuY2AsIGBjb2xsYXBzZV9maWxlYCwgYG1hZHZpc2VfY29sbGFwc2VgLCBgY29sbGFwc2VfcG9zc2libGVfb3JkZXJzYCwgYW5kIGBodWdlcGFnZV92bWFfcmV2YWxpZGF0ZWAgYXJlIG9idmlvdXMgcGxhY2VzIHRvIHN0YXJ0LiBJJ20gZXNwZWNpYWxseSBjdXJpb3VzIGFib3V0IGBtYWR2aXNlYCB3aXRoIGBNQURWX0NPTExBUFNFYC4gVGhpcyBpcyB3aGVyZSB1c2Vyc3BhY2UgZXhwbGljaXRseSByZXF1ZXN0cyBwYWdlIGNvbGxhcHNpbmcuIFRpbWUgdG8gc2VlIGhvdyB0aGF0IHRpZXMgaW50byBldmVyeXRoaW5nLlxuXG5cbiIsIklucHV0VG9rZW5zIjoyMTEzNCwiT3V0cHV0VG9rZW5zIjoyMywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjMwNiwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0wN1QyMTo1NTo1My42Mzk3NzQ5ODFaIiwiU2VxIjoyMCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjIzMDUzMTAzMzEsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiVFZBX0ZPUkNFRF9DT0xMQVBTRVwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJpbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaD05Nz1lbnVtIHR2YV90eXBlIHtcXG4tLVxcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oLTEwMC1cXHRUVkFfS0hVR0VQQUdFRCxcXHRcXHQvKiBLaHVnZXBhZ2VkIGNvbGxhcHNlLiAqL1xcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oOjEwMTpcXHRUVkFfRk9SQ0VEX0NPTExBUFNFLFxcdC8qIEZvcmNlZCBjb2xsYXBzZSAoZS5nLiBNQURWX0NPTExBUFNFKS4gKi9cXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaC0xMDItfTtcXG4tLVxcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oPTMyMD11bnNpZ25lZCBsb25nIHRocF92bWFfYWxsb3dhYmxlX29yZGVycyhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcXG4tLVxcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oLTMyOC1cXHQgKi9cXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaDozMjk6XFx0aWYgKHR5cGUgIT0gVFZBX0ZPUkNFRF9DT0xMQVBTRSBcXHUwMDI2XFx1MDAyNiB2bWFfaXNfYW5vbnltb3VzKHZtYSkpIHtcXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaC0zMzAtXFx0XFx0dW5zaWduZWQgbG9uZyBtYXNrID0gUkVBRF9PTkNFKGh1Z2VfYW5vbl9vcmRlcnNfYWx3YXlzKTtcXG4tLVxcbm1tL2h1Z2VfbWVtb3J5LmM9MTIxPXN0YXRpYyBib29sIHZtYV9maWxlX2J5cGFzc190aHBfdHVuZWFibGVzKGNvbnN0IHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxcbi0tXFxubW0vaHVnZV9tZW1vcnkuYy0xMjYtXFx0LyogTUFEVl9DT0xMQVBTRSBpZ25vcmVzIHR1bmVhYmxlcy4gKi9cXG5tbS9odWdlX21lbW9yeS5jOjEyNzpcXHRpZiAodHlwZSA9PSBUVkFfRk9SQ0VEX0NPTExBUFNFKVxcbm1tL2h1Z2VfbWVtb3J5LmMtMTI4LVxcdFxcdHJldHVybiB0cnVlO1xcbi0tXFxubW0vaHVnZV9tZW1vcnkuYz0xODI9dW5zaWduZWQgbG9uZyBfX3RocF92bWFfYWxsb3dhYmxlX29yZGVycyhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcXG4tLVxcbm1tL2h1Z2VfbWVtb3J5LmMtMTg4LVxcdGNvbnN0IGJvb2wgaW5fcGYgPSB0eXBlID09IFRWQV9QQUdFRkFVTFQ7XFxubW0vaHVnZV9tZW1vcnkuYzoxODk6XFx0Y29uc3QgYm9vbCBmb3JjZWRfY29sbGFwc2UgPSB0eXBlID09IFRWQV9GT1JDRURfQ09MTEFQU0U7XFxubW0vaHVnZV9tZW1vcnkuYy0xOTAtXFx0dW5zaWduZWQgbG9uZyBzdXBwb3J0ZWRfb3JkZXJzO1xcbi0tXFxubW0va2h1Z2VwYWdlZC5jPTEwNjQ9c3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgaHVnZXBhZ2Vfdm1hX3JldmFsaWRhdGUoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgYWRkcmVzcyxcXG4tLVxcbm1tL2todWdlcGFnZWQuYy0xMDY5LVxcdGVudW0gdHZhX3R5cGUgdHlwZSA9IGNjLVxcdTAwM2Vpc19raHVnZXBhZ2VkID8gVFZBX0tIVUdFUEFHRUQgOlxcbm1tL2todWdlcGFnZWQuYzoxMDcwOlxcdFxcdFxcdFxcdCBUVkFfRk9SQ0VEX0NPTExBUFNFO1xcbm1tL2todWdlcGFnZWQuYy0xMDcxLVxcbi0tXFxubW0va2h1Z2VwYWdlZC5jPTE2MDA9c3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgY29sbGFwc2Vfc2Nhbl9wbWQoc3RydWN0IG1tX3N0cnVjdCAqbW0sXFxuLS1cXG5tbS9raHVnZXBhZ2VkLmMtMTYwNi1cXHR1bnNpZ25lZCBpbnQgbWF4X3B0ZXNfbm9uZSA9IGNvbGxhcHNlX21heF9wdGVzX25vbmUoY2MsIHZtYSwgSFBBR0VfUE1EX09SREVSKTtcXG5tbS9raHVnZXBhZ2VkLmM6MTYwNzpcXHRlbnVtIHR2YV90eXBlIHR2YV9mbGFncyA9IGNjLVxcdTAwM2Vpc19raHVnZXBhZ2VkID8gVFZBX0tIVUdFUEFHRUQgOiBUVkFfRk9SQ0VEX0NPTExBUFNFO1xcbm1tL2todWdlcGFnZWQuYy0xNjA4LVxcdHBtZF90ICpwbWQ7XFxuLS1cXG5tbS9raHVnZXBhZ2VkLmM9MTg1MT1zdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCB0cnlfY29sbGFwc2VfcHRlX21hcHBlZF90aHAoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgYWRkcixcXG4tLVxcbm1tL2todWdlcGFnZWQuYy0xODg2LVxcdCAqL1xcbm1tL2todWdlcGFnZWQuYzoxODg3OlxcdGlmICghdGhwX3ZtYV9hbGxvd2FibGVfb3JkZXIodm1hLCB2bWEtXFx1MDAzZXZtX2ZsYWdzLCBUVkFfRk9SQ0VEX0NPTExBUFNFLCBQTURfT1JERVIpKVxcbm1tL2todWdlcGFnZWQuYy0xODg4LVxcdFxcdHJldHVybiBTQ0FOX1ZNQV9DSEVDSztcXG4tLVxcbm1tL2todWdlcGFnZWQuYz0zMTgyPWludCBtYWR2aXNlX2NvbGxhcHNlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIHN0YXJ0LFxcbi0tXFxubW0va2h1Z2VwYWdlZC5jLTMxOTQtXFxubW0va2h1Z2VwYWdlZC5jOjMxOTU6XFx0aWYgKCFjb2xsYXBzZV9wb3NzaWJsZSh2bWEsIHZtYS1cXHUwMDNldm1fZmxhZ3MsIFRWQV9GT1JDRURfQ09MTEFQU0UpKVxcbm1tL2todWdlcGFnZWQuYy0zMTk2LVxcdFxcdHJldHVybiAtRUlOVkFMO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wN1QyMTo1NTo1NS45NDUwOTE0MDJaIiwiU2VxIjoyMSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6NTYyODIxMDQ1MywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipNeSBBc3Nlc3NtZW50IG9mIHRoZSBUSFAgQWxsb3dhYmxlIE9yZGVycyBMb2dpYyBDaGFuZ2VzKipcblxuT2theSwgbGV0J3MgYnJlYWsgdGhpcyBkb3duLiBJIG5lZWQgdG8gZ2V0IGEgaGFuZGxlIG9uIHRoZSBjaGFuZ2VzIHRvIHRoZSBUcmFuc3BhcmVudCBIdWdlIFBhZ2UgKFRIUCkgYWxsb3dhYmxlIG9yZGVycyBsb2dpYywgZXNwZWNpYWxseSBmb3IgZmlsZS1iYWNrZWQgVk1Bcy4gVGhlIGZpcnN0IHRoaW5ncyBJJ20gZ29pbmcgdG8gbG9vayBhdCBhcmUgdGhlIGNvcmUgZnVuY3Rpb25zIGluIGBmcy9wcm9jL3Rhc2tfbW11LmNgLCBgbW0va2h1Z2VwYWdlZC5jYCwgYW5kIGBodWdlcGFnZV92bWFfcmV2YWxpZGF0ZWAuIEknbGwgcGF5IGNsb3NlIGF0dGVudGlvbiB0byB0aGUgYHNob3dfc21hcGAgaW4gdGhlIHRhc2tfbW11IGZpbGUuIEkgbmVlZCB0byB1bmRlcnN0YW5kIHdoZXJlIHRoZSByZXZhbGlkYXRpb24gbG9naWMgaXMgbGl2aW5nLlxuXG5NeSBGb2N1c1N5bWJvbHMgd2lsbCBiZTogYF9fdGhwX3ZtYV9hbGxvd2FibGVfb3JkZXJzYCAodGhhdCdzIHRoZSBjb3JlIGNoYW5nZSksIGB2bWFfZmlsZV9jYW5fbWFwX2h1Z2VgLCBhbmQgYHZtYV9maWxlX2J5cGFzc190aHBfdHVuZWFibGVzYCAodGhlIG5ldyBoZWxwZXJzKSwgYW5kIGBtYWR2aXNlX2NvbGxhcHNlYCB0byB1bmRlcnN0YW5kIHRoZSBtYWR2aXNlIHBhdGggZm9yIGZpbGUgY29sbGFwc2VzLiBJdCBzZWVtcyB0aGF0IGB2bWFfZmlsZV9jYW5fbWFwX2h1Z2VgIGFuZCBgdm1hX2ZpbGVfYnlwYXNzX3RocF90dW5lYWJsZXNgIHNob3VsZCBiZSBpbmNsdWRlZCBhcyBGb2N1c1N5bWJvbHMuIFJlbWVtYmVyLCB3ZSBzaG91bGQgaW5jbHVkZSB0aGUgbmV3IGhlbHBlciBmdW5jdGlvbnMsIGV2ZW4gaWYgdGhleSdyZSBzdGF0aWMgYW5kIG5vdCBpbmxpbmVkLCBiZWNhdXNlIHRoZXkgd2lsbCBoYXZlIHN5bWJvbHMgaW4gYHZtbGludXhgLlxuXG5Ob3csIEkgbmVlZCB0byBkb3VibGUtY2hlY2sgdGhlIHJlbGV2YW50IGNvbmZpZ3VyYXRpb25zLiBUaGUgY3JpdGljYWwgb25lIGlzIGBUUkFOU1BBUkVOVF9IVUdFUEFHRWAuIEkgc2hvdWxkIHByb2JhYmx5IGNoZWNrIGBtbS9LY29uZmlnYCBmb3Igb3RoZXIgcmVsZXZhbnQgY29uZmlndXJhdGlvbnMsIGJ1dCBJIHRoaW5rIGBUUkFOU1BBUkVOVF9IVUdFUEFHRWAgaXMgdGhlIG9ubHkgb25lIEkgbmVlZCB0byBmb2N1cyBvbi4gSSBzZWUgaXQgZGVwZW5kcyBvbiBgSEFWRV9BUkNIX1RSQU5TUEFSRU5UX0hVR0VQQUdFIFx1MDAyNlx1MDAyNiAhUFJFRU1QVF9SVGAuIEdvb2QsIG9uIGFtZDY0LCBgSEFWRV9BUkNIX1RSQU5TUEFSRU5UX0hVR0VQQUdFYCBpcyBgeWAsIHNvIGl0IHNob3VsZCBiZSBmaW5lLiBZZXMsIGBDT05GSUdfVFJBTlNQQVJFTlRfSFVHRVBBR0VgIChzdHJpcCBDT05GSUdfIHByZWZpeCAtXHUwMDNlIFwiVFJBTlNQQVJFTlRfSFVHRVBBR0VcIikuXG5cbk9rYXksIGxldCdzIGRpZ2VzdCB0aGUgcmVhc29uaW5nIGZvciB0aGUgY2hhbmdlcyBtb3JlIGNhcmVmdWxseS4gVGhlIHBhdGNoIHJlc3RydWN0dXJlcyBUSFAgYWxsb3dhYmxlIG9yZGVycywgaW50cm9kdWNpbmcgc2V2ZXJhbCBuZXcgZnVuY3Rpb25zIGluIGBtbS9odWdlX21lbW9yeS5jYDogYHZtYV9maWxlX2Nhbl9tYXBfaHVnZWAsIGB2bWFfZmlsZV9ieXBhc3NfdGhwX3R1bmVhYmxlc2AsIGB2bWFfZmlsZV9hbGxvd190aHBfdHVuZWFibGVzYCwgYW5kIGB2bWFfZmlsZV9jaGVja190aHBfdHVuZWFibGVzYC4gVGhlc2UgbmV3IGZ1bmN0aW9ucyBldmFsdWF0ZSB0aGUgVEhQIHR1bmVhYmxlcyBhbmQgaHVnZSBmYXVsdCBjYXBhYmlsaXRpZXMgZHVyaW5nIHBhZ2UgZmF1bHRzLCBzbWFwcyBxdWVyaWVzLCBhbmQgZm9yY2VkIGNvbGxhcHNlcyBzdWNoIGFzIHRoZSBgTUFEVl9DT0xMQVBTRWAgb3B0aW9uLiBJdCdzIHRvdWNoaW5nIHNvbWUgcHJldHR5IGxvdy1sZXZlbCBtZW1vcnkgbWFuYWdlbWVudCBzdHVmZiwgd2hpY2ggbWVhbnMgaXTigJlzIGVhc2lseSByZWFjaGFibGUgYW5kIGZ1enphYmxlIHZpYSBzdGFuZGFyZCBzeXNjYWxscyBsaWtlIGBtYWR2aXNlYCwgYG1tYXBgLCBwYWdlIGZhdWx0cywgYW5kIGAvcHJvYy9cdTAwM2NwaWRcdTAwM2Uvc21hcHNgLlxuXG5SaWdodCwgSSBhbSBzYXRpc2ZpZWQgd2l0aCB0aGlzIGFuYWx5c2lzLCBJJ2xsIGNhbGwgYHNldC1yZXN1bHRzYCB0b29sIG5vdy5cblxuXG4iLCJJbnB1dFRva2VucyI6MjI4MzcsIk91dHB1dFRva2VucyI6MTg2LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NjIwLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA3VDIxOjU2OjAxLjU3MzMwNDIwNloiLCJTZXEiOjIyLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJzZXQtcmVzdWx0cyIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjEzODI5NDc4MSwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiVFJBTlNQQVJFTlRfSFVHRVBBR0VcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJfX3RocF92bWFfYWxsb3dhYmxlX29yZGVyc1wiLFxuICAgIFwidm1hX2ZpbGVfY2FuX21hcF9odWdlXCIsXG4gICAgXCJ2bWFfZmlsZV9ieXBhc3NfdGhwX3R1bmVhYmxlc1wiLFxuICAgIFwibWFkdmlzZV9jb2xsYXBzZVwiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIHJlZmFjdG9ycyBhbmQgYWx0ZXJzIFRIUCAoVHJhbnNwYXJlbnQgSHVnZSBQYWdlKSBhbGxvd2FibGUgb3JkZXJzIGNoZWNraW5nIGZvciBmaWxlLWJhY2tlZCBWTUFzIGluIG1tL2h1Z2VfbWVtb3J5LmMsIGFkZGluZyBoZWxwZXJzIGxpa2Ugdm1hX2ZpbGVfY2FuX21hcF9odWdlIGFuZCB2bWFfZmlsZV9ieXBhc3NfdGhwX3R1bmVhYmxlcy4gVGhpcyBjb3JlIG1lbW9yeSBtYW5hZ2VtZW50IGxvZ2ljIGlzIHJlYWNoYWJsZSB2aWEgc3RhbmRhcmQgc3lzY2FsbHMgYW5kIGludGVyZmFjZXMgc3VjaCBhcyBtYWR2aXNlKE1BRFZfQ09MTEFQU0UpLCBwYWdlIGZhdWx0IGhhbmRsZXJzLCBhbmQgL3Byb2MvcGlkL3NtYXBzLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIlRSQU5TUEFSRU5UX0hVR0VQQUdFXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwiX190aHBfdm1hX2FsbG93YWJsZV9vcmRlcnNcIixcbiAgICBcInZtYV9maWxlX2Nhbl9tYXBfaHVnZVwiLFxuICAgIFwidm1hX2ZpbGVfYnlwYXNzX3RocF90dW5lYWJsZXNcIixcbiAgICBcIm1hZHZpc2VfY29sbGFwc2VcIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCByZWZhY3RvcnMgYW5kIGFsdGVycyBUSFAgKFRyYW5zcGFyZW50IEh1Z2UgUGFnZSkgYWxsb3dhYmxlIG9yZGVycyBjaGVja2luZyBmb3IgZmlsZS1iYWNrZWQgVk1BcyBpbiBtbS9odWdlX21lbW9yeS5jLCBhZGRpbmcgaGVscGVycyBsaWtlIHZtYV9maWxlX2Nhbl9tYXBfaHVnZSBhbmQgdm1hX2ZpbGVfYnlwYXNzX3RocF90dW5lYWJsZXMuIFRoaXMgY29yZSBtZW1vcnkgbWFuYWdlbWVudCBsb2dpYyBpcyByZWFjaGFibGUgdmlhIHN0YW5kYXJkIHN5c2NhbGxzIGFuZCBpbnRlcmZhY2VzIHN1Y2ggYXMgbWFkdmlzZShNQURWX0NPTExBUFNFKSwgcGFnZSBmYXVsdCBoYW5kbGVycywgYW5kIC9wcm9jL3BpZC9zbWFwcy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDdUMjE6NTY6MDEuNzExNjA4Mjk4WiIsIlNlcSI6MjMsIk5lc3RpbmciOjEsIlR5cGUiOiJhY3Rpb24iLCJOYW1lIjoiSWYiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNTY5MTg2MDc4MywiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA3VDIxOjU2OjAxLjcxNDM3MjI1WiIsIlNlcSI6MjQsIk5lc3RpbmciOjIsIlR5cGUiOiJhZ2VudCIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImNvcmUiLCJEdXJhdGlvbiI6MTU2ODkwODk1OTAsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIHJlZmFjdG9ycyBUSFAgKFRyYW5zcGFyZW50IEh1Z2UgUGFnZSkgcG9saWN5IGNoZWNrcyBmb3IgZmlsZS1iYWNrZWQgYW5kIHNwZWNpYWwvUEZOTUFQIFZNQXMgaW4gYG1tL2h1Z2VfbWVtb3J5LmNgLiBJdCBicmVha3Mgb3V0IHRoZSBsb2dpYyBmb3IgY2hlY2tpbmcgVEhQIHR1bmFibGVzIGFuZCBodWdlIHBhZ2Ugc3VwcG9ydCBpbnRvIGhlbHBlciBmdW5jdGlvbnMgKGB2bWFfZmlsZV9ieXBhc3NfdGhwX3R1bmVhYmxlc2AsIGB2bWFfZmlsZV9hbGxvd190aHBfdHVuZWFibGVzYCwgYHZtYV9maWxlX2NoZWNrX3RocF90dW5lYWJsZXNgLCBhbmQgYHZtYV9maWxlX2Nhbl9tYXBfaHVnZWApIGFuZCBhbGxvd3MgUEZOTUFQIFZNQXMgd2l0aCBgaHVnZV9mYXVsdGAgaGFuZGxlcnMgdG8gYnlwYXNzIGdsb2JhbCBUSFAgdHVuYWJsZXMuXFxuXFxuTm9uZSBvZiB0aGUgY2hhbmdlcyB0b3VjaCBidWZmZXIgY29waWVzIHRvIHVzZXIgc3BhY2UsIHVuaW5pdGlhbGl6ZWQgc3RhY2sgb3IgaGVhcCBtZW1vcnksIG9yIG1lbW9yeSBhbGxvY2F0aW9ucy4gQWxsIHZhcmlhYmxlcyBhbmQgc3RydWN0IG1lbWJlcnMgZXZhbHVhdGVkIChzdWNoIGFzIGB2bWEtXFx1MDAzZXZtX29wc2AsIGB2bV9mbGFnc2AsIGFuZCBgdHlwZWApIGFyZSBmdWxseSBpbml0aWFsaXplZCBhcmd1bWVudHMgb3Igc3RydWN0dXJlIGZpZWxkcy4gUG90ZW50aWFsIGlzc3VlcyBpbiB0aGlzIGNvZGUgcGF0aCAoc3VjaCBhcyBOVUxMIHBvaW50ZXIgZGVyZWZlcmVuY2VzIGlmIGB2bV9vcHNgIHdlcmUgTlVMTCkgYXJlIGRldGVjdGVkIGJ5IHN0YW5kYXJkIGtlcm5lbCBmYXVsdCBoYW5kbGVycyBhbmQgS0FTQU4uIFRoZXJlIGlzIG5vIHJpc2sgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgdXNhZ2Ugb3IgaW5mb3JtYXRpb24gbGVha3MgdGhhdCB3b3VsZCByZXF1aXJlIEtNU0FOLlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2Vcbn0iLCJJbnN0cnVjdGlvbiI6IllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBzZWN1cml0eSBlbmdpbmVlciBzcGVjaWFsaXppbmcgaW4ga2VybmVsIG1lbW9yeVxuZXJyb3IgZGV0ZWN0b3JzIChLQVNBTiBhbmQgS01TQU4pLiBZb3VyIGpvYiBpcyB0byByZXZpZXcgdGhlIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmRcbmRldGVybWluZSBpZiB0aGUgY29kZSBjaGFuZ2VzIGp1c3RpZnkgc3Bhd25pbmcgYSBkZWRpY2F0ZWQgS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcilcbmZ1enppbmcgc2Vzc2lvbiBpbiBhZGRpdGlvbiB0byBzdGFuZGFyZCBLQVNBTiBmdXp6aW5nLlxuXG5DUklUSUNBTCBESVNUSU5DVElPTiBCRVRXRUVOIEtBU0FOIEFORCBLTVNBTjpcbi0gU3RhbmRhcmQgS0FTQU4ga2VybmVsIGJ1aWxkcyAodXBzdHJlYW0tYXBwYXJtb3Ita2FzYW4uY29uZmlnKSBhbHJlYWR5IGVuYWJsZVxuICBhIGNvbXByZWhlbnNpdmUgc3VpdGUgb2YgZGVidWdnaW5nIHRvb2xzIGFuZCBzYW5pdGl6ZXJzLCBpbmNsdWRpbmcgS0FTQU5cbiAgKG91dC1vZi1ib3VuZHMgYWNjZXNzZXMsIHVzZS1hZnRlci1mcmVlLCBkb3VibGUgZnJlZSwgaW52YWxpZCBmcmVlKSwgTE9DS0RFUFxuICAobG9ja2luZyBidWdzIGFuZCBkZWFkbG9ja3MpLCBVQi1zYW5pdGl6ZXJzLCBhbmQgbWVtb3J5IGNvcnJ1cHRpb24gY2hlY2tzLlxuLSBLTVNBTiAoS2VybmVsTWVtb3J5U2FuaXRpemVyKSBkZXRlY3RzIHJlYWRzIG9mIFVOSU5JVElBTElaRUQgbWVtb3J5IChzdGFjaywgaGVhcCxcbiAgb3IgcGFnZSBhbGxvY2F0aW9ucykgYW5kIGtlcm5lbC10by11c2VyIG1lbW9yeSBpbmZvLWxlYWtzLlxuXG5SdWxlOiBUSEVSRSBJUyBOTyBTRU5TRSBJTiBSVU5OSU5HIEEgS01TQU4gU0VTU0lPTiBJRiBBIEJVRyBDQU4gQkUgQ0FVR0hUIEJZIEtBU0FOLFxuTE9DS0RFUCwgT1IgT1RIRVIgU1RBTkRBUkQgQlVHIERFVEVDVE9SUy5cbkEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpbmN1cnMgc2lnbmlmaWNhbnQgcmVzb3VyY2UgY29zdHMuIFlvdSBtdXN0IE9OTFlcbnNldCBOZWVkc0tNU0FOPXRydWUgaWYgdGhlIGNvZGUgY2hhbmdlcyBpbnRyb2R1Y2Ugb3IgZXhwb3NlIFVOSU5JVElBTElaRUQgTUVNT1JZIHJpc2tzXG50aGF0IGFyZSBkZXRlY3RlZCBPTkxZIGJ5IEtNU0FOLlxuXG5Mb29rIGhvbGlzdGljYWxseSBhdCB0aGUgcGF0Y2ggc2VyaWVzIGFuZCBzdXJyb3VuZGluZyBjb2RlLiBFdmVuIGlmIG5vIGRpcmVjdFxudW5pbml0aWFsaXplZCBmaWVsZCBhY2Nlc3NlcyBvciBuZXcgYnVmZmVyIGFsbG9jYXRpb25zIGFyZSBhZGRlZCBpbiB0aGUgZGlmZiBpdHNlbGYsXG5hIHBhdGNoIG1heSBhbHRlciBjb250cm9sIGZsb3csIGJvdW5kcyBjaGVja2luZywgb3IgZGF0YSBsZW5ndGggY2FsY3VsYXRpb25zIGluIHdheXNcbnRoYXQgY2hhbmdlIGhvdyB0aGUgcmVzdCBvZiB0aGUgY29kZSBvcGVyYXRlcyBvbiBleGlzdGluZyBidWZmZXJzIChlLmcuIGFsbG93aW5nXG51bmluaXRpYWxpemVkIHN0YWNrL2hlYXAgbWVtb3J5IHRvIGJlIHJlYWQsIGNvcGllZCB0byB1c2VyIHNwYWNlLCBvciB1c2VkIGluIGNvbnRyb2xcbmZsb3cpLiBEbyBub3QgaGVzaXRhdGUgdG8gdXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gaW5zcGVjdCB0aGUgc3Vycm91bmRpbmcgY29kZSxcbmNhbGxlZCBmdW5jdGlvbnMsIGFuZCBjYWxsZXJzLlxuXG5TZXQgTmVlZHNLTVNBTj10cnVlIE9OTFkgSUYgdGhlIHBhdGNoIGludHJvZHVjZXMgb3IgbW9kaWZpZXM6XG4xLiBLZXJuZWwgc3RydWN0dXJlcyBzZW50IHRvIHVzZXIgc3BhY2UgKHZpYSBjb3B5X3RvX3VzZXIsIHB1dF91c2VyLCBuZXRsaW5rIHNrYlxuICAgYXR0cmlidXRlcywgaW9jdGwgb3V0cHV0IGFyZ3VtZW50cywgc29ja2V0IG9wdGlvbnMsIG9yIEJQRiBidWZmZXJzKSB3aGVyZSBmaWVsZHNcbiAgIG9yIHN0cnVjdHVyZSBwYWRkaW5nIG1pZ2h0IG5vdCBiZSBmdWxseSBpbml0aWFsaXplZC96ZXJvZWQuXG4yLiBDb25kaXRpb25hbCBsb2dpYyBvciBicmFuY2hpbmcgdGhhdCBkZXBlbmRzIG9uIHBvdGVudGlhbGx5IHVuaW5pdGlhbGl6ZWQgdmFyaWFibGVzXG4gICBvciBzdHJ1Y3QgZmllbGRzLlxuMy4gQWxsb2NhdGlvbiBvciBpbml0aWFsaXphdGlvbiBvZiBjb21wbGV4IGRhdGEgc3RydWN0dXJlcyB3aGVyZSB1bmluaXRpYWxpemVkIGZpZWxkc1xuICAgY291bGQgYmUgcmVhZCBsYXRlciBpbiByZWFjaGFibGUgY29kZSBwYXRocy5cbjQuIEJvdW5kcyBjaGVja3MsIGxlbmd0aHMsIG9yIGxvZ2ljIGluIGEgd2F5IHRoYXQgYWxsb3dzIHN1cnJvdW5kaW5nIGNvZGUgdG8gYWNjZXNzXG4gICB1bmluaXRpYWxpemVkIGJ5dGVzIG9mIGV4aXN0aW5nIGJ1ZmZlcnMuXG5cblNldCBOZWVkc0tNU0FOPWZhbHNlIElGOlxuLSBUaGUgY29kZSBjaGFuZ2VzIHByaW1hcmlseSByaXNrIG91dC1vZi1ib3VuZHMgYWNjZXNzLCBhcnJheSBvdmVyZmxvd3MsIE5VTEwgcG9pbnRlclxuICBkZXJlZmVyZW5jZXMsIGxvY2tpbmcgZGVhZGxvY2tzLCBvciB1c2UtYWZ0ZXItZnJlZSBidWdzICh0aGVzZSBhcmUgYWxyZWFkeSBjYXVnaHRcbiAgYnkgS0FTQU4sIExPQ0tERVAsIG9yIHN0YW5kYXJkIGJ1ZyBkZXRlY3RvcnMpLlxuLSBBbGwgc3RhY2svaGVhcCBzdHJ1Y3R1cmVzIHRvdWNoZWQgb3IgaW50cm9kdWNlZCBieSB0aGUgcGF0Y2ggYXJlIGZ1bGx5IHplcm9lZFxuICBvciBpbml0aWFsaXplZCAoZS5nLiB1c2luZyA9IHswfSwgbWVtc2V0LCBremFsbG9jKSBiZWZvcmUgYmVpbmcgcmVhZCBvciBjb3BpZWQuXG4tIFRoZSBwYXRjaCBkb2VzIG5vdCBpbnRyb2R1Y2UgYW55IHJpc2sgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgdXNhZ2Ugb3IgaW5mby1sZWFrcy5cblxuVXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gaW5zcGVjdCB0aGUgc3Vycm91bmRpbmcgY29kZSBpZiBuZWNlc3NhcnksIHRoZW4gcHJvdmlkZVxuZGV0YWlsZWQgS01TQU5SZWFzb25pbmcgY29udHJhc3RpbmcgS0FTQU4gdnMgS01TQU4gYXBwbGljYWJpbGl0eSBmb3IgdGhpcyBwYXRjaC5cblByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLlxuXG5cblVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuXG5JdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS5cbklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC5cbiIsIlByb21wdCI6IlRhcmdldCBhcmNoaXRlY3R1cmU6IGFtZDY0XG5cbkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOlxuY29tbWl0IDQwN2I4ZTdiNmY4YWE2Mjk2YmQ5NzRjN2Q5MjZlYjc1MzliNzRjZTZcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgTW9uIFNlcCA3IDIxOjU1OjE2IDIwMjYgKzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvbW0vaHVnZV9tZW1vcnkuYyBiL21tL2h1Z2VfbWVtb3J5LmNcbmluZGV4IGFmYmI1OTc0YmQyMjUuLjc1YzIwNGFmNDBjYmQgMTAwNjQ0XG4tLS0gYS9tbS9odWdlX21lbW9yeS5jXG4rKysgYi9tbS9odWdlX21lbW9yeS5jXG5AQCAtOTIsNyArOTIsNyBAQCB1bnNpZ25lZCBsb25nIGh1Z2VfYW5vbl9vcmRlcnNfbWFkdmlzZSBfX3JlYWRfbW9zdGx5O1xuIHVuc2lnbmVkIGxvbmcgaHVnZV9hbm9uX29yZGVyc19pbmhlcml0IF9fcmVhZF9tb3N0bHk7XG4gc3RhdGljIGJvb2wgYW5vbl9vcmRlcnNfY29uZmlndXJlZCBfX2luaXRkYXRhO1xuIFxuLXN0YXRpYyBpbmxpbmUgYm9vbCBmaWxlX3RocF9lbmFibGVkKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKVxuK3N0YXRpYyBpbmxpbmUgYm9vbCBmaWxlX3RocF9lbmFibGVkKGNvbnN0IHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKVxuIHtcbiBcdHN0cnVjdCBpbm9kZSAqaW5vZGU7XG4gXG5AQCAtMTE4LDYgKzExOCw2NyBAQCBzdGF0aWMgYm9vbCB2bWFfaXNfc3BlY2lhbF9odWdlKGNvbnN0IHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKVxuIFx0cmV0dXJuIHZtYV90ZXN0X2FueSh2bWEsIFZNQV9QRk5NQVBfQklULCBWTUFfTUlYRURNQVBfQklUKTtcbiB9XG4gXG4rc3RhdGljIGJvb2wgdm1hX2ZpbGVfYnlwYXNzX3RocF90dW5lYWJsZXMoY29uc3Qgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4rXHRcdGVudW0gdHZhX3R5cGUgdHlwZSlcbit7XG4rXHRjb25zdCBib29sIGhhc19odWdlX2ZhdWx0ID0gdm1hLVx1MDAzZXZtX29wcy1cdTAwM2VodWdlX2ZhdWx0O1xuK1xuK1x0LyogTUFEVl9DT0xMQVBTRSBpZ25vcmVzIHR1bmVhYmxlcy4gKi9cbitcdGlmICh0eXBlID09IFRWQV9GT1JDRURfQ09MTEFQU0UpXG4rXHRcdHJldHVybiB0cnVlO1xuK1x0LyogSHVnZSBQRk4gbWFwcGluZ3MgYXJlIHVuY29tcGFjdGFibGUgc28gdGhlIHBvbGljeSBkb2Vzbid0IGFwcGx5LiAqL1xuK1x0aWYgKHZtYV90ZXN0KHZtYSwgVk1BX1BGTk1BUF9CSVQpIFx1MDAyNlx1MDAyNiBoYXNfaHVnZV9mYXVsdClcbitcdFx0cmV0dXJuIHRydWU7XG4rXHRyZXR1cm4gZmFsc2U7XG4rfVxuK1xuK3N0YXRpYyBib29sIHZtYV9maWxlX2FsbG93X3RocF90dW5lYWJsZXModm1fZmxhZ3NfdCB2bV9mbGFncylcbit7XG4rXHQvKiBUSFA9YWx3YXlzPyAqL1xuK1x0aWYgKGh1Z2VwYWdlX2dsb2JhbF9hbHdheXMoKSlcbitcdFx0cmV0dXJuIHRydWU7XG4rXHQvKiBUSFA9bWFkdmlzZSBhbmQgbWFya2VkIE1BRFZfSFVHRVBBR0U/ICovXG4rXHRpZiAoaHVnZXBhZ2VfZ2xvYmFsX2VuYWJsZWQoKSBcdTAwMjZcdTAwMjYgKHZtX2ZsYWdzIFx1MDAyNiBWTV9IVUdFUEFHRSkpXG4rXHRcdHJldHVybiB0cnVlO1xuK1x0cmV0dXJuIGZhbHNlO1xuK31cbitcbitzdGF0aWMgYm9vbCB2bWFfZmlsZV9jaGVja190aHBfdHVuZWFibGVzKGNvbnN0IHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuK1x0XHR2bV9mbGFnc190IHZtX2ZsYWdzLCBlbnVtIHR2YV90eXBlIHR5cGUpXG4re1xuK1x0cmV0dXJuIHZtYV9maWxlX2J5cGFzc190aHBfdHVuZWFibGVzKHZtYSwgdHlwZSkgfHxcbitcdFx0dm1hX2ZpbGVfYWxsb3dfdGhwX3R1bmVhYmxlcyh2bV9mbGFncyk7XG4rfVxuK1xuK3N0YXRpYyBib29sIHZtYV9maWxlX2Nhbl9tYXBfaHVnZShjb25zdCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbitcdFx0dm1fZmxhZ3NfdCB2bV9mbGFncywgZW51bSB0dmFfdHlwZSB0eXBlKVxuK3tcbitcdGNvbnN0IGJvb2wgaGFzX2h1Z2VfZmF1bHQgPSB2bWEtXHUwMDNldm1fb3BzLVx1MDAzZWh1Z2VfZmF1bHQ7XG4rXG4rXHQvKlxuK1x0ICogRW5mb3JjZSBUSFAgY29sbGFwc2UgcmVxdWlyZW1lbnRzIGFzIG5lY2Vzc2FyeS4gQW5vbnltb3VzIHZtYXNcbitcdCAqIHdlcmUgYWxyZWFkeSBoYW5kbGVkIGluIHRocF92bWFfYWxsb3dhYmxlX29yZGVycygpLlxuK1x0ICovXG4rXHRpZiAoIXZtYV9maWxlX2NoZWNrX3RocF90dW5lYWJsZXModm1hLCB2bV9mbGFncywgdHlwZSkpXG4rXHRcdHJldHVybiBmYWxzZTtcbitcbitcdHN3aXRjaCAodHlwZSkge1xuK1x0Y2FzZSBUVkFfUEFHRUZBVUxUOlxuK1x0XHQvKlxuK1x0XHQgKiBUcnVzdCB0aGF0IC1cdTAwM2VodWdlX2ZhdWx0KCkgaGFuZGxlcnMga25vdyB3aGF0IHRoZXkgYXJlIGRvaW5nXG4rXHRcdCAqIGluIGZhdWx0IHBhdGguXG4rXHRcdCAqL1xuK1x0XHRyZXR1cm4gaGFzX2h1Z2VfZmF1bHQ7XG4rXHRjYXNlIFRWQV9TTUFQUzpcbitcdFx0aWYgKGhhc19odWdlX2ZhdWx0KVxuK1x0XHRcdHJldHVybiB0cnVlO1xuK1x0XHRmYWxsdGhyb3VnaDtcbitcdGRlZmF1bHQ6XG4rXHRcdC8qIE9ubHkgcmVndWxhciBmaWxlIGlzIHZhbGlkIGluIGNvbGxhcHNlIHBhdGguICovXG4rXHRcdHJldHVybiBmaWxlX3RocF9lbmFibGVkKHZtYSk7XG4rXHR9XG4rfVxuK1xuIHVuc2lnbmVkIGxvbmcgX190aHBfdm1hX2FsbG93YWJsZV9vcmRlcnMoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4gXHRcdFx0XHRcdCB2bV9mbGFnc190IHZtX2ZsYWdzLFxuIFx0XHRcdFx0XHQgZW51bSB0dmFfdHlwZSB0eXBlLFxuQEAgLTE5MCwyNyArMjUxLDggQEAgdW5zaWduZWQgbG9uZyBfX3RocF92bWFfYWxsb3dhYmxlX29yZGVycyhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbiBcdFx0XHRcdFx0XHQgICB2bWEsIHZtYV9zdGFydF9wZ29mZih2bWEpLCAwLFxuIFx0XHRcdFx0XHRcdCAgIGZvcmNlZF9jb2xsYXBzZSk7XG4gXG4tXHRpZiAoIXZtYV9pc19hbm9ueW1vdXModm1hKSkge1xuLVx0XHQvKlxuLVx0XHQgKiBFbmZvcmNlIFRIUCBjb2xsYXBzZSByZXF1aXJlbWVudHMgYXMgbmVjZXNzYXJ5LiBBbm9ueW1vdXMgdm1hc1xuLVx0XHQgKiB3ZXJlIGFscmVhZHkgaGFuZGxlZCBpbiB0aHBfdm1hX2FsbG93YWJsZV9vcmRlcnMoKS5cbi1cdFx0ICovXG4tXHRcdGlmICghZm9yY2VkX2NvbGxhcHNlIFx1MDAyNlx1MDAyNlxuLVx0XHQgICAgKCFodWdlcGFnZV9nbG9iYWxfZW5hYmxlZCgpIHx8ICghKHZtX2ZsYWdzIFx1MDAyNiBWTV9IVUdFUEFHRSkgXHUwMDI2XHUwMDI2XG4tXHRcdFx0XHRcdFx0ICAgICFodWdlcGFnZV9nbG9iYWxfYWx3YXlzKCkpKSlcbi1cdFx0XHRyZXR1cm4gMDtcbi1cbi1cdFx0Lypcbi1cdFx0ICogVHJ1c3QgdGhhdCAtXHUwMDNlaHVnZV9mYXVsdCgpIGhhbmRsZXJzIGtub3cgd2hhdCB0aGV5IGFyZSBkb2luZ1xuLVx0XHQgKiBpbiBmYXVsdCBwYXRoLlxuLVx0XHQgKi9cbi1cdFx0aWYgKCgoaW5fcGYgfHwgc21hcHMpKSBcdTAwMjZcdTAwMjYgdm1hLVx1MDAzZXZtX29wcy1cdTAwM2VodWdlX2ZhdWx0KVxuLVx0XHRcdHJldHVybiBvcmRlcnM7XG4tXHRcdC8qIE9ubHkgcmVndWxhciBmaWxlIGlzIHZhbGlkIGluIGNvbGxhcHNlIHBhdGggKi9cbi1cdFx0aWYgKCgoIWluX3BmIHx8IHNtYXBzKSkgXHUwMDI2XHUwMDI2IGZpbGVfdGhwX2VuYWJsZWQodm1hKSlcbi1cdFx0XHRyZXR1cm4gb3JkZXJzO1xuLVx0XHRyZXR1cm4gMDtcbi1cdH1cbitcdGlmICghdm1hX2lzX2Fub255bW91cyh2bWEpKVxuK1x0XHRyZXR1cm4gdm1hX2ZpbGVfY2FuX21hcF9odWdlKHZtYSwgdm1fZmxhZ3MsIHR5cGUpID8gb3JkZXJzIDogMDtcbiBcbiBcdGlmICh2bWFfaXNfdGVtcG9yYXJ5X3N0YWNrKHZtYSkpXG4gXHRcdHJldHVybiAwO1xuIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDdUMjE6NTY6MDEuNzE0Mzc0NTFaIiwiU2VxIjoyNSwiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6NDQ4MzE0NTYxMSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgdGhlIEh1Z2UgTWVtb3J5IFBhdGNoIGZvciBVbmluaXRpYWxpemVkIE1lbW9yeSBSaXNrcyoqXG5cbk9rYXksIGxldCdzIGRpdmUgaW50byB0aGlzIHBhdGNoLiBNeSBpbW1lZGlhdGUgZ29hbCBpcyB0byBkZXRlcm1pbmUgaWYgaXQgaW50cm9kdWNlcyBhbnkgbmV3IG9wcG9ydHVuaXRpZXMgZm9yIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGV4cG9zdXJlIHRoYXQgbWlnaHQgd2FycmFudCBLTVNBTiBzY3J1dGlueS4gSSdsbCBzdGFydCBieSByZWFkaW5nIHRocm91Z2ggdGhlIGNoYW5nZXMgaW4gYG1tL2h1Z2VfbWVtb3J5LmNgLiBJdCBsb29rcyBsaWtlIHdlIGhhdmUgYSBzZXQgb2YgZnVuY3Rpb24gbW9kaWZpY2F0aW9ucy5cblxuRmlyc3QsIEkgc2VlIGEgYGNvbnN0YCBxdWFsaWZpZXIgYWRkZWQgdG8gYGZpbGVfdGhwX2VuYWJsZWRgLCBhIGdvb2QgcHJhY3RpY2UgZm9yIGVuc3VyaW5nIGRhdGEgaW50ZWdyaXR5LCB0aG91Z2ggbGlrZWx5IG5vdCBLTVNBTiByZWxldmFudC4gVGhlbiB0aGVyZSBhcmUgYSBmZXcgbmV3IGJvb2xlYW4gZnVuY3Rpb25zOiBgdm1hX2ZpbGVfYnlwYXNzX3RocF90dW5lYWJsZXNgLCBgdm1hX2ZpbGVfYWxsb3dfdGhwX3R1bmVhYmxlc2AsIGB2bWFfZmlsZV9jaGVja190aHBfdHVuZWFibGVzYCwgYW5kIGB2bWFfZmlsZV9jYW5fbWFwX2h1Z2VgLiBUaGV5IHNlZW0gdG8gZGVhbCB3aXRoIHRoZSB0dW5hYmlsaXR5IGFuZCBlbmFibGluZy9kaXNhYmxpbmcgb2YgVHJhbnNwYXJlbnQgSHVnZSBQYWdlcyAoVEhQKSBmb3IgZmlsZS1iYWNrZWQgVk1BcywgYmFzZWQgb24gdmFyaW91cyBjb25kaXRpb25zIGFuZCBmbGFncy4gRmluYWxseSwgYF9fdGhwX3ZtYV9hbGxvd2FibGVfb3JkZXJzYCBpcyByZWZhY3RvcmVkIHRvIHVzZSBgdm1hX2ZpbGVfY2FuX21hcF9odWdlYC5cblxuTm93LCB0aGUgY3JpdGljYWwgcGFydC4gTXkgcmFkYXIgaXMgdXAgZm9yIHdoZXJlIHVuaW5pdGlhbGl6ZWQgZGF0YSBjb3VsZCBiZWNvbWUgYSBwcm9ibGVtLiBJJ2xsIG5lZWQgdG8gZ28gYmV5b25kIGEgc3VwZXJmaWNpYWwgcmVhZCBhbmQgc2VlIGhvdyB0aGVzZSBuZXcgZnVuY3Rpb25zIGFyZSB1c2VkLCBhbmQgaG93IGV4aXN0aW5nIGRhdGEgZmxvd3MgYXJlIG1vZGlmaWVkLiBJIHdpbGwgcHJvYmFibHkgbmVlZCB0byBkaWcgaW50byBgbW0vaHVnZV9tZW1vcnkuY2AgZGlyZWN0bHksIGxpa2VseSB1c2luZyBgcmVhZC1maWxlYCBvciBgZ3JlcHBlcmAgdG8gdW5kZXJzdGFuZCBhbGwgdGhlIGRhdGEgc3RydWN0dXJlcyBhbmQgY29udHJvbCBmbG93LCBwYXJ0aWN1bGFybHkgZm9jdXNpbmcgb24gYW55IHBvdGVudGlhbCBkYXRhIHJhY2VzLiBJIHdhbnQgdG8gc2VlIGlmIGFueSBvZiB0aGVzZSBuZXcgZnVuY3Rpb25zLCBlc3BlY2lhbGx5IGB2bWFfZmlsZV9jYW5fbWFwX2h1Z2VgIGFuZCBob3cgaXQgaXMgdXNlZCBpbiBgX190aHBfdm1hX2FsbG93YWJsZV9vcmRlcnNgLCBpbnRyb2R1Y2UgcGF0aHMgd2hlcmUgZGF0YSBtaWdodCBiZSByZWFkIGJlZm9yZSBiZWluZyBpbml0aWFsaXplZC4gSSB3aWxsIGFsc28gYmUgbG9va2luZyB0byBzZWUgaWYgdGhlcmUgaXMgYW55IG1lbW9yeSBhbGxvY2F0aW9uIHRoYXQgY291bGQgYmUgZXhwb3NlZC4gVGhlIGRldmlsIGlzIGFsd2F5cyBpbiB0aGUgZGV0YWlscyFcblxuXG4iLCJJbnB1dFRva2VucyI6MzIxOCwiT3V0cHV0VG9rZW5zIjozOCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjQ1OCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA3VDIxOjU2OjA2LjE5NzUyNDk4MVoiLCJTZXEiOjI2LCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NjY0MzExNDMsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiX190aHBfdm1hX2FsbG93YWJsZV9vcmRlcnNcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwibW0vaHVnZV9tZW1vcnkuY1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJtbS9odWdlX21lbW9yeS5jPTE1Mz1zdGF0aWMgYm9vbCB2bWFfZmlsZV9jYW5fbWFwX2h1Z2UoY29uc3Qgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXFxuLS1cXG5tbS9odWdlX21lbW9yeS5jLTE4MS1cXG5tbS9odWdlX21lbW9yeS5jOjE4Mjp1bnNpZ25lZCBsb25nIF9fdGhwX3ZtYV9hbGxvd2FibGVfb3JkZXJzKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxcbm1tL2h1Z2VfbWVtb3J5LmMtMTgzLVxcdFxcdFxcdFxcdFxcdCB2bV9mbGFnc190IHZtX2ZsYWdzLFxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wN1QyMTo1NjowNi4yNjM5NjA5MDRaIiwiU2VxIjoyNywiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6MzEyMDMzNTQxOSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgbGV0J3MgZGl2ZSBpbnRvIHRoaXMuIEhlcmUncyBob3cgSSdkIGFwcHJvYWNoIHRoaXMgdGFzaywgYXMgaWYgdGhlc2Ugd2VyZSBteSBpbnRlcm5hbCB0aG91Z2h0czpcblxuKipBbmFseXppbmcgYF9fdGhwX3ZtYV9hbGxvd2FibGVfb3JkZXJzYCBhbmQgYHZtYV9maWxlX2Nhbl9tYXBfaHVnZWAqKlxuXG5SaWdodCwgbGV0J3MgZ2V0IGRvd24gdG8gdGhlIG5pdHR5LWdyaXR0eS4gTXkgZXhwZXJ0aXNlIHRlbGxzIG1lIHRoZXNlIGFyZSBsaWtlbHkga2V5IGZ1bmN0aW9ucyBkZWFsaW5nIHdpdGggVHJhbnNwYXJlbnQgSHVnZSBQYWdlcyAoVEhQKSBhbmQgdGhlaXIgaW50ZXJhY3Rpb24gd2l0aCBWaXJ0dWFsIE1lbW9yeSBBcmVhcyAoVk1Bcykgd2hlbiBtYXBwaW5nIGZpbGVzLiBHaXZlbiB0aGUgbmFtaW5nIGNvbnZlbnRpb25zLCBgX190aHBfdm1hX2FsbG93YWJsZV9vcmRlcnNgIHN1Z2dlc3RzIGl0J3MgY2hlY2tpbmcgdGhlIGxlZ2FsaXR5IG9yIHBlcm1pc3NpYmlsaXR5IG9mIHVzaW5nIFRIUHMgd2l0aGluIGEgVk1BLCBwb3RlbnRpYWxseSByZWdhcmRpbmcgb3JkZXIgKGkuZS4gc2l6ZSkgY29uc3RyYWludHMuIFRoZSBkb3VibGUgdW5kZXJzY29yZSBwcmVmaXggdXN1YWxseSBtZWFucyB0aGlzIGlzIGFuIGludGVybmFsIGZ1bmN0aW9uLCBub3QgbWVhbnQgdG8gYmUgY2FsbGVkIGRpcmVjdGx5LiBgdm1hX2ZpbGVfY2FuX21hcF9odWdlYCwgb24gdGhlIG90aGVyIGhhbmQsIGhpbnRzIGF0IGEgYnJvYWRlciBjaGVjay4gVGhpcyBzb3VuZHMgbGlrZSBhIGZ1bmN0aW9uIHRvIGRldGVybWluZSBpZiBhIHNwZWNpZmljIGZpbGUgY2FuIGJlIG1hcHBlZCB3aXRoIGh1Z2UgcGFnZXMsIHBvdGVudGlhbGx5IGVuY29tcGFzc2luZyBicm9hZGVyIGNvbnNpZGVyYXRpb25zIHRoYW4ganVzdCBWTUEtc3BlY2lmaWMgb3JkZXJzLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCB3aGF0IGZhY3RvcnMgYXJlIGNvbnNpZGVyZWQgaGVyZS4gSSBuZWVkIHRvIGV4YW1pbmUgdGhlIHN1cnJvdW5kaW5nIGNvZGUgdG8gZGV0ZXJtaW5lIGhvdyBgX190aHBfdm1hX2FsbG93YWJsZV9vcmRlcnNgIGlzIHVzZWQsIGFuZCBtb3JlIGltcG9ydGFudGx5LCAqd2h5Ki4gSXMgaXQgYSBoYXJkIGxpbWl0PyBEb2VzIGl0IGNvbnNpZGVyIE5VTUEgbm9kZXM/IFdoYXQgY3JpdGVyaWEgZG9lcyBpdCBhcHBseT8gU2ltaWxhcmx5LCB3aGF0IGNoZWNrcyBkb2VzIGB2bWFfZmlsZV9jYW5fbWFwX2h1Z2VgIHBlcmZvcm0/IEFyZSB3ZSB0YWxraW5nIGFib3V0IHRoZSBmaWxlJ3MgaW5vZGUgZmxhZ3MsIG9yIHRoZSB1bmRlcmx5aW5nIGZpbGVzeXN0ZW0ncyBjYXBhYmlsaXRpZXM/IFRoaXMgc291bmRzIGxpa2UgcG90ZW50aWFsbHkgdmVyeSBpbnRlcmVzdGluZyBjb2RlIHRvIGFuYWx5emUuIEknbSBrZWVuIHRvIHVuZGVyc3RhbmQgdGhlIGludGVyZGVwZW5kZW5jaWVzIGJldHdlZW4gdGhlc2UgdHdvIGZ1bmN0aW9ucyBpbiByZWxhdGlvbiB0byBUSFAgZW5hYmxlbWVudCBhbmQgZmlsZSBtYXBwaW5nLiBMZXQncyBzZWUgaG93IHRoZXNlIGZ1bmN0aW9uIGNhbGxzIHdlYXZlIHRvZ2V0aGVyIHdpdGhpbiB0aGUgbWVtb3J5IG1hbmFnZW1lbnQgc3Vic3lzdGVtLlxuXG5cbiIsIklucHV0VG9rZW5zIjo0MjU5LCJPdXRwdXRUb2tlbnMiOjM1LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MzMsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMDdUMjE6NTY6MDkuMzg0Mjk5NjkzWiIsIlNlcSI6MjgsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjQ0MjM2MSwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJtbS9odWdlX21lbW9yeS5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDEyMCxcbiAgXCJMaW5lQ291bnRcIjogODBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiIDEyMDpcXHRcXG4gMTIxOlxcdHN0YXRpYyBib29sIHZtYV9maWxlX2J5cGFzc190aHBfdHVuZWFibGVzKGNvbnN0IHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxcbiAxMjI6XFx0XFx0XFx0ZW51bSB0dmFfdHlwZSB0eXBlKVxcbiAxMjM6XFx0e1xcbiAxMjQ6XFx0XFx0Y29uc3QgYm9vbCBoYXNfaHVnZV9mYXVsdCA9IHZtYS1cXHUwMDNldm1fb3BzLVxcdTAwM2VodWdlX2ZhdWx0O1xcbiAxMjU6XFx0XFxuIDEyNjpcXHRcXHQvKiBNQURWX0NPTExBUFNFIGlnbm9yZXMgdHVuZWFibGVzLiAqL1xcbiAxMjc6XFx0XFx0aWYgKHR5cGUgPT0gVFZBX0ZPUkNFRF9DT0xMQVBTRSlcXG4gMTI4OlxcdFxcdFxcdHJldHVybiB0cnVlO1xcbiAxMjk6XFx0XFx0LyogSHVnZSBQRk4gbWFwcGluZ3MgYXJlIHVuY29tcGFjdGFibGUgc28gdGhlIHBvbGljeSBkb2Vzbid0IGFwcGx5LiAqL1xcbiAxMzA6XFx0XFx0aWYgKHZtYV90ZXN0KHZtYSwgVk1BX1BGTk1BUF9CSVQpIFxcdTAwMjZcXHUwMDI2IGhhc19odWdlX2ZhdWx0KVxcbiAxMzE6XFx0XFx0XFx0cmV0dXJuIHRydWU7XFxuIDEzMjpcXHRcXHRyZXR1cm4gZmFsc2U7XFxuIDEzMzpcXHR9XFxuIDEzNDpcXHRcXG4gMTM1OlxcdHN0YXRpYyBib29sIHZtYV9maWxlX2FsbG93X3RocF90dW5lYWJsZXModm1fZmxhZ3NfdCB2bV9mbGFncylcXG4gMTM2OlxcdHtcXG4gMTM3OlxcdFxcdC8qIFRIUD1hbHdheXM/ICovXFxuIDEzODpcXHRcXHRpZiAoaHVnZXBhZ2VfZ2xvYmFsX2Fsd2F5cygpKVxcbiAxMzk6XFx0XFx0XFx0cmV0dXJuIHRydWU7XFxuIDE0MDpcXHRcXHQvKiBUSFA9bWFkdmlzZSBhbmQgbWFya2VkIE1BRFZfSFVHRVBBR0U/ICovXFxuIDE0MTpcXHRcXHRpZiAoaHVnZXBhZ2VfZ2xvYmFsX2VuYWJsZWQoKSBcXHUwMDI2XFx1MDAyNiAodm1fZmxhZ3MgXFx1MDAyNiBWTV9IVUdFUEFHRSkpXFxuIDE0MjpcXHRcXHRcXHRyZXR1cm4gdHJ1ZTtcXG4gMTQzOlxcdFxcdHJldHVybiBmYWxzZTtcXG4gMTQ0OlxcdH1cXG4gMTQ1OlxcdFxcbiAxNDY6XFx0c3RhdGljIGJvb2wgdm1hX2ZpbGVfY2hlY2tfdGhwX3R1bmVhYmxlcyhjb25zdCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcXG4gMTQ3OlxcdFxcdFxcdHZtX2ZsYWdzX3Qgdm1fZmxhZ3MsIGVudW0gdHZhX3R5cGUgdHlwZSlcXG4gMTQ4OlxcdHtcXG4gMTQ5OlxcdFxcdHJldHVybiB2bWFfZmlsZV9ieXBhc3NfdGhwX3R1bmVhYmxlcyh2bWEsIHR5cGUpIHx8XFxuIDE1MDpcXHRcXHRcXHR2bWFfZmlsZV9hbGxvd190aHBfdHVuZWFibGVzKHZtX2ZsYWdzKTtcXG4gMTUxOlxcdH1cXG4gMTUyOlxcdFxcbiAxNTM6XFx0c3RhdGljIGJvb2wgdm1hX2ZpbGVfY2FuX21hcF9odWdlKGNvbnN0IHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxcbiAxNTQ6XFx0XFx0XFx0dm1fZmxhZ3NfdCB2bV9mbGFncywgZW51bSB0dmFfdHlwZSB0eXBlKVxcbiAxNTU6XFx0e1xcbiAxNTY6XFx0XFx0Y29uc3QgYm9vbCBoYXNfaHVnZV9mYXVsdCA9IHZtYS1cXHUwMDNldm1fb3BzLVxcdTAwM2VodWdlX2ZhdWx0O1xcbiAxNTc6XFx0XFxuIDE1ODpcXHRcXHQvKlxcbiAxNTk6XFx0XFx0ICogRW5mb3JjZSBUSFAgY29sbGFwc2UgcmVxdWlyZW1lbnRzIGFzIG5lY2Vzc2FyeS4gQW5vbnltb3VzIHZtYXNcXG4gMTYwOlxcdFxcdCAqIHdlcmUgYWxyZWFkeSBoYW5kbGVkIGluIHRocF92bWFfYWxsb3dhYmxlX29yZGVycygpLlxcbiAxNjE6XFx0XFx0ICovXFxuIDE2MjpcXHRcXHRpZiAoIXZtYV9maWxlX2NoZWNrX3RocF90dW5lYWJsZXModm1hLCB2bV9mbGFncywgdHlwZSkpXFxuIDE2MzpcXHRcXHRcXHRyZXR1cm4gZmFsc2U7XFxuIDE2NDpcXHRcXG4gMTY1OlxcdFxcdHN3aXRjaCAodHlwZSkge1xcbiAxNjY6XFx0XFx0Y2FzZSBUVkFfUEFHRUZBVUxUOlxcbiAxNjc6XFx0XFx0XFx0LypcXG4gMTY4OlxcdFxcdFxcdCAqIFRydXN0IHRoYXQgLVxcdTAwM2VodWdlX2ZhdWx0KCkgaGFuZGxlcnMga25vdyB3aGF0IHRoZXkgYXJlIGRvaW5nXFxuIDE2OTpcXHRcXHRcXHQgKiBpbiBmYXVsdCBwYXRoLlxcbiAxNzA6XFx0XFx0XFx0ICovXFxuIDE3MTpcXHRcXHRcXHRyZXR1cm4gaGFzX2h1Z2VfZmF1bHQ7XFxuIDE3MjpcXHRcXHRjYXNlIFRWQV9TTUFQUzpcXG4gMTczOlxcdFxcdFxcdGlmIChoYXNfaHVnZV9mYXVsdClcXG4gMTc0OlxcdFxcdFxcdFxcdHJldHVybiB0cnVlO1xcbiAxNzU6XFx0XFx0XFx0ZmFsbHRocm91Z2g7XFxuIDE3NjpcXHRcXHRkZWZhdWx0OlxcbiAxNzc6XFx0XFx0XFx0LyogT25seSByZWd1bGFyIGZpbGUgaXMgdmFsaWQgaW4gY29sbGFwc2UgcGF0aC4gKi9cXG4gMTc4OlxcdFxcdFxcdHJldHVybiBmaWxlX3RocF9lbmFibGVkKHZtYSk7XFxuIDE3OTpcXHRcXHR9XFxuIDE4MDpcXHR9XFxuIDE4MTpcXHRcXG4gMTgyOlxcdHVuc2lnbmVkIGxvbmcgX190aHBfdm1hX2FsbG93YWJsZV9vcmRlcnMoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXFxuIDE4MzpcXHRcXHRcXHRcXHRcXHRcXHQgdm1fZmxhZ3NfdCB2bV9mbGFncyxcXG4gMTg0OlxcdFxcdFxcdFxcdFxcdFxcdCBlbnVtIHR2YV90eXBlIHR5cGUsXFxuIDE4NTpcXHRcXHRcXHRcXHRcXHRcXHQgdW5zaWduZWQgbG9uZyBvcmRlcnMpXFxuIDE4NjpcXHR7XFxuIDE4NzpcXHRcXHRjb25zdCBib29sIHNtYXBzID0gdHlwZSA9PSBUVkFfU01BUFM7XFxuIDE4ODpcXHRcXHRjb25zdCBib29sIGluX3BmID0gdHlwZSA9PSBUVkFfUEFHRUZBVUxUO1xcbiAxODk6XFx0XFx0Y29uc3QgYm9vbCBmb3JjZWRfY29sbGFwc2UgPSB0eXBlID09IFRWQV9GT1JDRURfQ09MTEFQU0U7XFxuIDE5MDpcXHRcXHR1bnNpZ25lZCBsb25nIHN1cHBvcnRlZF9vcmRlcnM7XFxuIDE5MTpcXHRcXG4gMTkyOlxcdFxcdC8qIENoZWNrIHRoZSBpbnRlcnNlY3Rpb24gb2YgcmVxdWVzdGVkIGFuZCBzdXBwb3J0ZWQgb3JkZXJzLiAqL1xcbiAxOTM6XFx0XFx0aWYgKHZtYV9pc19hbm9ueW1vdXModm1hKSlcXG4gMTk0OlxcdFxcdFxcdHN1cHBvcnRlZF9vcmRlcnMgPSBUSFBfT1JERVJTX0FMTF9BTk9OO1xcbiAxOTU6XFx0XFx0ZWxzZSBpZiAodm1hX2lzX2RheCh2bWEpIHx8IHZtYV9pc19zcGVjaWFsX2h1Z2Uodm1hKSlcXG4gMTk2OlxcdFxcdFxcdHN1cHBvcnRlZF9vcmRlcnMgPSBUSFBfT1JERVJTX0FMTF9TUEVDSUFMX0RBWDtcXG4gMTk3OlxcdFxcdGVsc2VcXG4gMTk4OlxcdFxcdFxcdHN1cHBvcnRlZF9vcmRlcnMgPSBUSFBfT1JERVJTX0FMTF9GSUxFX0RFRkFVTFQ7XFxuIDE5OTpcXHRcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDdUMjE6NTY6MDkuMzg0NzQ2NTQ0WiIsIlNlcSI6MjksIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjIxNjE4MDU5MjUsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSB0YWtlIG9uIHRoZSB0aG91Z2h0IHByb2Nlc3MsIGFzIHJlcXVlc3RlZDpcblxuKipEaXZpbmcgaW50byBgX190aHBfdm1hX2FsbG93YWJsZV9vcmRlcnNgIGluIGBtbS9odWdlX21lbW9yeS5jYCoqXG5cbk9rYXksIHNvIEkgbmVlZCB0byBnZXQgYSBiZXR0ZXIgZ3Jhc3Agb2YgdGhlIGxvZ2ljIHdpdGhpbiBgX190aHBfdm1hX2FsbG93YWJsZV9vcmRlcnNgLiBJJ3ZlIGJlZW4gd29ya2luZyB3aXRoIGh1Z2UgcGFnZXMgbGF0ZWx5LCBhbmQgSSB3YW50IHRvIHJlYWxseSB1bmRlcnN0YW5kIHRoZSBjb25kaXRpb25zIHRoYXQgZ292ZXJuIHdoZXRoZXIgb3Igbm90IGEgc3BlY2lmaWMgVk1BIGNhbiBhY3R1YWxseSAqdXNlKiB0aGVtLiBJdCdzIGEgY3JpdGljYWwgZnVuY3Rpb24sIGRldGVybWluaW5nIHRoZSBzaXppbmcgb2YgVEhQcyBhdmFpbGFibGUgdG8gdGhlIFZNQS5cblxuSSdtIHNraXBwaW5nIHRoZSBwcmVsaW1pbmFyaWVzIGFuZCBnb2luZyBzdHJhaWdodCB0byBsaW5lcyAyMDAgdGhyb3VnaCAyNjAgb2YgYG1tL2h1Z2VfbWVtb3J5LmNgLiBUaG9zZSBsaW5lcyBzaG91bGQgZ2l2ZSBtZSB0aGUgcmVzdCBvZiB0aGUgcHV6emxlIHBpZWNlcy4gSSdtIGV4cGVjdGluZyB0byBmaW5kIHRoZSBrZXkgY29uc3RyYWludHMgb3V0bGluZWQuIFNwZWNpZmljYWxseSBJJ20gaG9waW5nIHRvIHNlZTogaWYgdGhlcmUncyBhbnkgcmVtYWluaW5nIGxvZ2ljLCBhbnkgZGVwZW5kZW5jaWVzLCBvciBzcGVjaWFsIGhhbmRsaW5nIEkgbmVlZCB0byBiZSBhd2FyZSBvZi4gSSBuZWVkIHRvIGJlIGFibGUgdG8gYW50aWNpcGF0ZSBwcm9ibGVtcyBhbmQgZXhwbGFpbiBlZGdlIGNhc2VzLiBMZXQncyBzZWUgd2hhdCB0aGUgY29kZSBzYXlzLlxuXG5cbiIsIklucHV0VG9rZW5zIjo1OTcyLCJPdXRwdXRUb2tlbnMiOjM1LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NDEsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0wN1QyMTo1NjoxMS41NDY1NTU0OThaIiwiU2VxIjozMCwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NDc5OTcwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcIm1tL2h1Z2VfbWVtb3J5LmNcIixcbiAgXCJGaXJzdExpbmVcIjogMjAwLFxuICBcIkxpbmVDb3VudFwiOiA2NVxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgMjAwOlxcdFxcdG9yZGVycyBcXHUwMDI2PSBzdXBwb3J0ZWRfb3JkZXJzO1xcbiAyMDE6XFx0XFx0aWYgKCFvcmRlcnMpXFxuIDIwMjpcXHRcXHRcXHRyZXR1cm4gMDtcXG4gMjAzOlxcdFxcbiAyMDQ6XFx0XFx0aWYgKCF2bWEtXFx1MDAzZXZtX21tKVxcdFxcdC8qIHZkc28gKi9cXG4gMjA1OlxcdFxcdFxcdHJldHVybiAwO1xcbiAyMDY6XFx0XFxuIDIwNzpcXHRcXHRpZiAodGhwX2Rpc2FibGVkX2J5X2h3KCkgfHwgdm1hX3RocF9kaXNhYmxlZCh2bWEsIHZtX2ZsYWdzLCBmb3JjZWRfY29sbGFwc2UpKVxcbiAyMDg6XFx0XFx0XFx0cmV0dXJuIDA7XFxuIDIwOTpcXHRcXG4gMjEwOlxcdFxcdC8qIGtodWdlcGFnZWQgZG9lc24ndCBjb2xsYXBzZSBEQVggdm1hLCBidXQgcGFnZSBmYXVsdCBpcyBmaW5lLiAqL1xcbiAyMTE6XFx0XFx0aWYgKHZtYV9pc19kYXgodm1hKSlcXG4gMjEyOlxcdFxcdFxcdHJldHVybiBpbl9wZiA/IG9yZGVycyA6IDA7XFxuIDIxMzpcXHRcXG4gMjE0OlxcdFxcdC8qXFxuIDIxNTpcXHRcXHQgKiBraHVnZXBhZ2VkIHNwZWNpYWwgVk1BIGFuZCBodWdldGxiIFZNQS5cXG4gMjE2OlxcdFxcdCAqIE11c3QgYmUgY2hlY2tlZCBhZnRlciBkYXggc2luY2Ugc29tZSBkYXggbWFwcGluZ3MgbWF5IGhhdmVcXG4gMjE3OlxcdFxcdCAqIFZNX01JWEVETUFQIHNldC5cXG4gMjE4OlxcdFxcdCAqL1xcbiAyMTk6XFx0XFx0aWYgKCFpbl9wZiBcXHUwMDI2XFx1MDAyNiAhc21hcHMgXFx1MDAyNlxcdTAwMjYgKHZtX2ZsYWdzIFxcdTAwMjYgVk1fTk9fS0hVR0VQQUdFRCkpXFxuIDIyMDpcXHRcXHRcXHRyZXR1cm4gMDtcXG4gMjIxOlxcdFxcbiAyMjI6XFx0XFx0LypcXG4gMjIzOlxcdFxcdCAqIENoZWNrIGFsaWdubWVudCBmb3IgZmlsZSB2bWEgYW5kIHNpemUgZm9yIGJvdGggZmlsZSBhbmQgYW5vbiB2bWEgYnlcXG4gMjI0OlxcdFxcdCAqIGZpbHRlcmluZyBvdXQgdGhlIHVuc3VpdGFibGUgb3JkZXJzLlxcbiAyMjU6XFx0XFx0ICpcXG4gMjI2OlxcdFxcdCAqIFNraXAgdGhlIGNoZWNrIGZvciBwYWdlIGZhdWx0LiBIdWdlIGZhdWx0IGRvZXMgdGhlIGNoZWNrIGluIGZhdWx0XFxuIDIyNzpcXHRcXHQgKiBoYW5kbGVycy5cXG4gMjI4OlxcdFxcdCAqL1xcbiAyMjk6XFx0XFx0aWYgKCFpbl9wZikge1xcbiAyMzA6XFx0XFx0XFx0aW50IG9yZGVyID0gaGlnaGVzdF9vcmRlcihvcmRlcnMpO1xcbiAyMzE6XFx0XFx0XFx0dW5zaWduZWQgbG9uZyBhZGRyO1xcbiAyMzI6XFx0XFxuIDIzMzpcXHRcXHRcXHR3aGlsZSAob3JkZXJzKSB7XFxuIDIzNDpcXHRcXHRcXHRcXHRhZGRyID0gdm1hLVxcdTAwM2V2bV9lbmQgLSAoUEFHRV9TSVpFIFxcdTAwM2NcXHUwMDNjIG9yZGVyKTtcXG4gMjM1OlxcdFxcdFxcdFxcdGlmICh0aHBfdm1hX3N1aXRhYmxlX29yZGVyKHZtYSwgYWRkciwgb3JkZXIpKVxcbiAyMzY6XFx0XFx0XFx0XFx0XFx0YnJlYWs7XFxuIDIzNzpcXHRcXHRcXHRcXHRvcmRlciA9IG5leHRfb3JkZXIoXFx1MDAyNm9yZGVycywgb3JkZXIpO1xcbiAyMzg6XFx0XFx0XFx0fVxcbiAyMzk6XFx0XFxuIDI0MDpcXHRcXHRcXHRpZiAoIW9yZGVycylcXG4gMjQxOlxcdFxcdFxcdFxcdHJldHVybiAwO1xcbiAyNDI6XFx0XFx0fVxcbiAyNDM6XFx0XFxuIDI0NDpcXHRcXHQvKlxcbiAyNDU6XFx0XFx0ICogRW5hYmxlZCB2aWEgc2htZW0gbW91bnQgb3B0aW9ucyBvciBzeXNmcyBzZXR0aW5ncy5cXG4gMjQ2OlxcdFxcdCAqIE11c3QgYmUgZG9uZSBiZWZvcmUgaHVnZXBhZ2UgZmxhZ3MgY2hlY2sgc2luY2Ugc2htZW0gaGFzIGl0c1xcbiAyNDc6XFx0XFx0ICogb3duIGZsYWdzLlxcbiAyNDg6XFx0XFx0ICovXFxuIDI0OTpcXHRcXHRpZiAoIWluX3BmIFxcdTAwMjZcXHUwMDI2IHNobWVtX2ZpbGUodm1hLVxcdTAwM2V2bV9maWxlKSlcXG4gMjUwOlxcdFxcdFxcdHJldHVybiBvcmRlcnMgXFx1MDAyNiBzaG1lbV9hbGxvd2FibGVfaHVnZV9vcmRlcnMoZmlsZV9pbm9kZSh2bWEtXFx1MDAzZXZtX2ZpbGUpLFxcbiAyNTE6XFx0XFx0XFx0XFx0XFx0XFx0XFx0ICAgdm1hLCB2bWFfc3RhcnRfcGdvZmYodm1hKSwgMCxcXG4gMjUyOlxcdFxcdFxcdFxcdFxcdFxcdFxcdCAgIGZvcmNlZF9jb2xsYXBzZSk7XFxuIDI1MzpcXHRcXG4gMjU0OlxcdFxcdGlmICghdm1hX2lzX2Fub255bW91cyh2bWEpKVxcbiAyNTU6XFx0XFx0XFx0cmV0dXJuIHZtYV9maWxlX2Nhbl9tYXBfaHVnZSh2bWEsIHZtX2ZsYWdzLCB0eXBlKSA/IG9yZGVycyA6IDA7XFxuIDI1NjpcXHRcXG4gMjU3OlxcdFxcdGlmICh2bWFfaXNfdGVtcG9yYXJ5X3N0YWNrKHZtYSkpXFxuIDI1ODpcXHRcXHRcXHRyZXR1cm4gMDtcXG4gMjU5OlxcdFxcbiAyNjA6XFx0XFx0LypcXG4gMjYxOlxcdFxcdCAqIFRIUGVsaWdpYmxlIGJpdCBvZiBzbWFwcyBzaG91bGQgc2hvdyAxIGZvciBwcm9wZXIgVk1BcyBldmVuXFxuIDI2MjpcXHRcXHQgKiB0aG91Z2ggYW5vbl92bWEgaXMgbm90IGluaXRpYWxpemVkIHlldC5cXG4gMjYzOlxcdFxcdCAqXFxuIDI2NDpcXHRcXHQgKiBBbGxvdyBwYWdlIGZhdWx0IHNpbmNlIGFub25fdm1hIG1heSBiZSBub3QgaW5pdGlhbGl6ZWQgdW50aWxcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDdUMjE6NTY6MTEuNTQ3MDM4NzM4WiIsIlNlcSI6MzEsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjU4NTYzODgyMDIsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIHRoZSBUSFAgUGF0Y2ggZm9yIFVuaW5pdGlhbGl6ZWQgTWVtb3J5KipcblxuT2theSwgbGV0J3MgYnJlYWsgdGhpcyBkb3duLiBGaXJzdCwgdGhpcyBwYXRjaCBhZGRlZCBhIGBjb25zdGAgcXVhbGlmaWVyIHRvIGBmaWxlX3RocF9lbmFibGVkKClgLCBhIG1pbm9yIGNoYW5nZS4gTW9yZSBpbXBvcnRhbnRseSwgaXQgcmVmYWN0b3JlZCBsb2dpYyBmcm9tIGBfX3RocF92bWFfYWxsb3dhYmxlX29yZGVyc2AgaW50byBzZXZlcmFsIGhlbHBlciBmdW5jdGlvbnM6IGB2bWFfZmlsZV9ieXBhc3NfdGhwX3R1bmVhYmxlc2AsIGB2bWFfZmlsZV9hbGxvd190aHBfdHVuZWFibGVzYCwgYHZtYV9maWxlX2NoZWNrX3RocF90dW5lYWJsZXNgLCBhbmQgYHZtYV9maWxlX2Nhbl9tYXBfaHVnZWAuIEl0IGFsc28gc3BlY2lmaWNhbGx5IGFkZGVkIGEgYnlwYXNzIGZvciBQRk5NQVAgd2l0aCBgaHVnZV9mYXVsdGAuXG5cbk15IGNvbmNlcm4sIGFzIGFsd2F5cywgaXMgdW5pbml0aWFsaXplZCBtZW1vcnkuIEkgbmVlZCB0byBlbnN1cmUgdGhpcyBwYXRjaCBkb2Vzbid0IGludHJvZHVjZSBvciBleHBvc2UgYW55IHZ1bG5lcmFiaWxpdGllcyByZWxhdGVkIHRvIHJlYWRpbmcgdW5pbml0aWFsaXplZCBkYXRhLiBTcGVjaWZpY2FsbHksIEkgbmVlZCB0byBjaGVjazogZG9lcyB0aGlzIHBhdGNoIGludGVyYWN0IHdpdGgga2VybmVsIHN0cnVjdHVyZXMgZXhwb3NlZCB0byB1c2Vyc3BhY2UsIGFyZSB0aGVyZSBjb25kaXRpb25hbCBicmFuY2hlcyBiYXNlZCBvbiBwb3RlbnRpYWxseSB1bmluaXRpYWxpemVkIHZhcmlhYmxlcywgZG9lcyBpdCBhbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBkYXRhIHN0cnVjdHVyZXMgdGhhdCBjb3VsZCBsZWFkIHRvIHN1YnNlcXVlbnQgcmVhZHMgb2YgdW5pbml0aWFsaXplZCBtZW1vcnksIG9yIGlzIGl0IG1vZGlmeWluZyBhbnkgYm91bmRzIGNoZWNrcyBvciBsb2dpYyBpbiBhIHdheSB0aGF0IGNvdWxkIGV4cG9zZSB1bmluaXRpYWxpemVkIGRhdGE/XG5cbkknbSBsb29raW5nIGNsb3NlbHkgYXQgaG93IGB2bWEtXHUwMDNldm1fb3BzYCBhbmQgYHZtYWAgZmxhZ3MgYXJlIGhhbmRsZWQgd2l0aGluIHRoZXNlIGZ1bmN0aW9ucy4gSSdtIG5vdGluZyB0aGF0IGB2bWEtXHUwMDNldm1fb3BzYCBtaWdodCBuZWVkIHNwZWNpYWwgYXR0ZW50aW9uLiBJcyB0aGVyZSBhIHBvc3NpYmlsaXR5IG9mIGEgbnVsbCBkZXJlZmVyZW5jZSBpZiBgdm1hLVx1MDAzZXZtX29wc2AgaXMgTlVMTD8gS0FTQU4gYW5kIG90aGVyIGRldGVjdG9ycyBzaG91bGQgY2F0Y2ggdGhhdCwgYnV0IEknbSBiZWluZyB0aG9yb3VnaCBoZXJlLiBJJ20gY29uc2lkZXJpbmcgS01TQU4gdnMgS0FTQU46IEtNU0FOIGlzIGZvciB1bmluaXRpYWxpemVkIHJlYWRzIGFuZCBsZWFrcywgS0FTQU4gZm9yIG91dC1vZi1ib3VuZHMsIHVzZS1hZnRlci1mcmVlLCBldGMuLCBhbmQga2VybmVsIHBhbmljIGZvciBudWxsIGRlcmVmLiBMT0NLREVQIGZvciBsb2NrIGlzc3Vlcy5cblxuQWZ0ZXIgY2FyZWZ1bCByZXZpZXcsIEkndmUgY29uZmlybWVkIHRoYXQgdGhlIHZhcmlhYmxlcyBiZWluZyBjaGVja2VkIChgdm1hLVx1MDAzZXZtX29wcy1cdTAwM2VodWdlX2ZhdWx0YCwgYHR5cGVgLCBgdm1fZmxhZ3NgLCBhbmQgYHZtYWAgZmxhZ3MpIGFyZSBhbGwgaW5pdGlhbGl6ZWQsIGVpdGhlciBhcyBtZW1iZXIgZmllbGRzIG9mIHRoZSBgdm1fYXJlYV9zdHJ1Y3RgIG9yIGFzIGZ1bmN0aW9uIGFyZ3VtZW50cyBwYXNzZWQgYnkgdmFsdWUuIFRoZXJlJ3Mgbm8gaW50ZXJhY3Rpb24gd2l0aCB1c2Vyc3BhY2Ugc3RydWN0dXJlcyB0aGF0IHdvdWxkIGNhdXNlIGlzc3Vlcy4gVGhpcyBwYXRjaCBpcyBwdXJlbHkgYWJvdXQgZGV0ZXJtaW5pbmcgdGhlIHN1aXRhYmlsaXR5IG9mIFRIUCAoVHJhbnNwYXJlbnQgSHVnZSBQYWdlcykgbWFwcGluZyBwb2xpY3kgZm9yIGEgZ2l2ZW4gVk1BLiBJdCBkb2Vzbid0IG1vZGlmeSBhbnkgYm91bmRzIGNoZWNrcyBvciBpbml0aWFsaXphdGlvbiBsb2dpYywgc28gdGhlcmUgc2hvdWxkIGJlIG5vIHJpc2sgb2YgcmVhZGluZyB1bmluaXRpYWxpemVkIG1lbW9yeS5cblxuVGhlcmVmb3JlLCB0aGlzIGNoYW5nZSBkb2Vzbid0IGludHJvZHVjZSBvciBleHBvc2UgYW55IHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJlYWRzIG9yIGxlYWtzLiBTdGFuZGFyZCBmdXp6aW5nIGFuZCBLQVNBTiBzaG91bGQgYmUgc3VmZmljaWVudDsgS01TQU4gaXMgbm90IG5lZWRlZCBoZXJlLlxuXG5JJ20gY29uZmlkZW50IGluIG15IGFuYWx5c2lzLiBUaGUgcmVhc29uaW5nIGlzIHNvdW5kLiBJJ2xsIGdvIGFoZWFkIGFuZCBjYWxsIGBzZXQtcmVzdWx0c2AuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjcyNTIsIk91dHB1dFRva2VucyI6MjY1LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NzE1LCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMDdUMjE6NTY6MTcuNDAzNDMwOThaIiwiU2VxIjozMiwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoic2V0LXJlc3VsdHMiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyNjkyMCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIHJlZmFjdG9ycyBUSFAgKFRyYW5zcGFyZW50IEh1Z2UgUGFnZSkgcG9saWN5IGNoZWNrcyBmb3IgZmlsZS1iYWNrZWQgYW5kIHNwZWNpYWwvUEZOTUFQIFZNQXMgaW4gYG1tL2h1Z2VfbWVtb3J5LmNgLiBJdCBicmVha3Mgb3V0IHRoZSBsb2dpYyBmb3IgY2hlY2tpbmcgVEhQIHR1bmFibGVzIGFuZCBodWdlIHBhZ2Ugc3VwcG9ydCBpbnRvIGhlbHBlciBmdW5jdGlvbnMgKGB2bWFfZmlsZV9ieXBhc3NfdGhwX3R1bmVhYmxlc2AsIGB2bWFfZmlsZV9hbGxvd190aHBfdHVuZWFibGVzYCwgYHZtYV9maWxlX2NoZWNrX3RocF90dW5lYWJsZXNgLCBhbmQgYHZtYV9maWxlX2Nhbl9tYXBfaHVnZWApIGFuZCBhbGxvd3MgUEZOTUFQIFZNQXMgd2l0aCBgaHVnZV9mYXVsdGAgaGFuZGxlcnMgdG8gYnlwYXNzIGdsb2JhbCBUSFAgdHVuYWJsZXMuXFxuXFxuTm9uZSBvZiB0aGUgY2hhbmdlcyB0b3VjaCBidWZmZXIgY29waWVzIHRvIHVzZXIgc3BhY2UsIHVuaW5pdGlhbGl6ZWQgc3RhY2sgb3IgaGVhcCBtZW1vcnksIG9yIG1lbW9yeSBhbGxvY2F0aW9ucy4gQWxsIHZhcmlhYmxlcyBhbmQgc3RydWN0IG1lbWJlcnMgZXZhbHVhdGVkIChzdWNoIGFzIGB2bWEtXFx1MDAzZXZtX29wc2AsIGB2bV9mbGFnc2AsIGFuZCBgdHlwZWApIGFyZSBmdWxseSBpbml0aWFsaXplZCBhcmd1bWVudHMgb3Igc3RydWN0dXJlIGZpZWxkcy4gUG90ZW50aWFsIGlzc3VlcyBpbiB0aGlzIGNvZGUgcGF0aCAoc3VjaCBhcyBOVUxMIHBvaW50ZXIgZGVyZWZlcmVuY2VzIGlmIGB2bV9vcHNgIHdlcmUgTlVMTCkgYXJlIGRldGVjdGVkIGJ5IHN0YW5kYXJkIGtlcm5lbCBmYXVsdCBoYW5kbGVycyBhbmQgS0FTQU4uIFRoZXJlIGlzIG5vIHJpc2sgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgdXNhZ2Ugb3IgaW5mb3JtYXRpb24gbGVha3MgdGhhdCB3b3VsZCByZXF1aXJlIEtNU0FOLlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2Vcbn0iLCJSZXN1bHRzIjoie1xuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIHJlZmFjdG9ycyBUSFAgKFRyYW5zcGFyZW50IEh1Z2UgUGFnZSkgcG9saWN5IGNoZWNrcyBmb3IgZmlsZS1iYWNrZWQgYW5kIHNwZWNpYWwvUEZOTUFQIFZNQXMgaW4gYG1tL2h1Z2VfbWVtb3J5LmNgLiBJdCBicmVha3Mgb3V0IHRoZSBsb2dpYyBmb3IgY2hlY2tpbmcgVEhQIHR1bmFibGVzIGFuZCBodWdlIHBhZ2Ugc3VwcG9ydCBpbnRvIGhlbHBlciBmdW5jdGlvbnMgKGB2bWFfZmlsZV9ieXBhc3NfdGhwX3R1bmVhYmxlc2AsIGB2bWFfZmlsZV9hbGxvd190aHBfdHVuZWFibGVzYCwgYHZtYV9maWxlX2NoZWNrX3RocF90dW5lYWJsZXNgLCBhbmQgYHZtYV9maWxlX2Nhbl9tYXBfaHVnZWApIGFuZCBhbGxvd3MgUEZOTUFQIFZNQXMgd2l0aCBgaHVnZV9mYXVsdGAgaGFuZGxlcnMgdG8gYnlwYXNzIGdsb2JhbCBUSFAgdHVuYWJsZXMuXFxuXFxuTm9uZSBvZiB0aGUgY2hhbmdlcyB0b3VjaCBidWZmZXIgY29waWVzIHRvIHVzZXIgc3BhY2UsIHVuaW5pdGlhbGl6ZWQgc3RhY2sgb3IgaGVhcCBtZW1vcnksIG9yIG1lbW9yeSBhbGxvY2F0aW9ucy4gQWxsIHZhcmlhYmxlcyBhbmQgc3RydWN0IG1lbWJlcnMgZXZhbHVhdGVkIChzdWNoIGFzIGB2bWEtXFx1MDAzZXZtX29wc2AsIGB2bV9mbGFnc2AsIGFuZCBgdHlwZWApIGFyZSBmdWxseSBpbml0aWFsaXplZCBhcmd1bWVudHMgb3Igc3RydWN0dXJlIGZpZWxkcy4gUG90ZW50aWFsIGlzc3VlcyBpbiB0aGlzIGNvZGUgcGF0aCAoc3VjaCBhcyBOVUxMIHBvaW50ZXIgZGVyZWZlcmVuY2VzIGlmIGB2bV9vcHNgIHdlcmUgTlVMTCkgYXJlIGRldGVjdGVkIGJ5IHN0YW5kYXJkIGtlcm5lbCBmYXVsdCBoYW5kbGVycyBhbmQgS0FTQU4uIFRoZXJlIGlzIG5vIHJpc2sgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgdXNhZ2Ugb3IgaW5mb3JtYXRpb24gbGVha3MgdGhhdCB3b3VsZCByZXF1aXJlIEtNU0FOLlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2Vcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfV07CgkJCWlmICghcmF3RGF0YSB8fCByYXdEYXRhLmxlbmd0aCA9PT0gMCkgcmV0dXJuOwoKCQkJZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSk7CgkJCWRyYXdEdXJhdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCQlkcmF3VG9rZW5Db25zdW1wdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSkgewoJCQljb25zdCBzdGF0cyA9IHsKCQkJCWxsbTogeyBjb3VudDogMCwgdG9rZW5zOiAwLCBkdXJhdGlvbjogMCB9LAoJCQkJdG9vbDogeyBjb3VudDogMCwgZHVyYXRpb246IDAgfQoJCQl9OwoKCQkJcmF3RGF0YS5mb3JFYWNoKHMgPT4gewoJCQkJY29uc3QgZHVyID0gcy5EdXJhdGlvbiAvIDEwMDAwMDAwMDA7IAoJCQkJaWYgKHMuVHlwZSA9PT0gImxsbSIpIHsKCQkJCQlzdGF0cy5sbG0uY291bnQrKzsKCQkJCQlzdGF0cy5sbG0udG9rZW5zICs9IChzLklucHV0VG9rZW5zICsgcy5PdXRwdXRUb2tlbnMgKyBzLk91dHB1dFRob3VnaHRzVG9rZW5zKTsKCQkJCQlzdGF0cy5sbG0uZHVyYXRpb24gKz0gZHVyOwoJCQkJfSBlbHNlIGlmIChzLlR5cGUgPT09ICJ0b29sIikgewoJCQkJCXN0YXRzLnRvb2wuY291bnQrKzsKCQkJCQlzdGF0cy50b29sLmR1cmF0aW9uICs9IGR1cjsKCQkJCX0KCQkJfSk7CgoJCQljb25zdCBhdmdMbG1EdXIgPSBzdGF0cy5sbG0uY291bnQgPiAwID8gKHN0YXRzLmxsbS5kdXJhdGlvbiAvIHN0YXRzLmxsbS5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgkJCWNvbnN0IGF2Z0xsbVRva2VuID0gc3RhdHMubGxtLmNvdW50ID4gMCA/IChzdGF0cy5sbG0udG9rZW5zIC8gc3RhdHMubGxtLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCQkJY29uc3QgYXZnVG9vbER1ciA9IHN0YXRzLnRvb2wuY291bnQgPiAwID8gKHN0YXRzLnRvb2wuZHVyYXRpb24gLyBzdGF0cy50b29sLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCgkJCWNvbnN0IGxsbVN1bWFyeUNlbGxzID0gW3N0YXRzLmxsbS5jb3VudCwgc3RhdHMubGxtLnRva2VucywgYXZnTGxtVG9rZW4sIHN0YXRzLmxsbS5kdXJhdGlvbiwgYXZnTGxtRHVyXTsKCQkJY29uc3QgdG9vbFN1bW1hcnlDZWxscyA9IFtzdGF0cy50b29sLmNvdW50LCBzdGF0cy50b29sLmR1cmF0aW9uLCBhdmdUb29sRHVyXTsKCgkJCWNvbnN0IGxsbVN1bW1hcnlCb2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xsbV9zdW1tYXJ5X3N0YXRzX2JvZHknKTsKCQkJbGxtU3VtbWFyeUJvZHkuaW5uZXJIVE1MID0gIiI7CgkJCWNvbnN0IGxsbVRyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndHInKTsKCQkJbGxtU3VtYXJ5Q2VsbHMuZm9yRWFjaChjZWxsID0+IHsKCQkJCWNvbnN0IHRkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTsKCQkJCXRkLnRleHRDb250ZW50ID0gY2VsbDsKCQkJCWxsbVRyLmFwcGVuZENoaWxkKHRkKTsKCQkJfSk7CgkJCWxsbVN1bW1hcnlCb2R5LmFwcGVuZENoaWxkKGxsbVRyKTsKCgkJCWNvbnN0IHRvb2xTdW1tYXJ5Qm9keSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b29sX3N1bW1hcnlfc3RhdHNfYm9keScpOwoJCQl0b29sU3VtbWFyeUJvZHkuaW5uZXJIVE1MID0gIiI7CgkJCWNvbnN0IHRvb2xUciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RyJyk7CgkJCXRvb2xTdW1tYXJ5Q2VsbHMuZm9yRWFjaChjZWxsID0+IHsKCQkJCWNvbnN0IHRkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTsKCQkJCXRkLnRleHRDb250ZW50ID0gY2VsbDsKCQkJCXRvb2xUci5hcHBlbmRDaGlsZCh0ZCk7CgkJCX0pOwoJCQl0b29sU3VtbWFyeUJvZHkuYXBwZW5kQ2hpbGQodG9vbFRyKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdEdXJhdGlvbkNoYXJ0KHJhd0RhdGEpIHsKCQkJY29uc3QgZmlsdGVyZWRTdGVwcyA9IHJhd0RhdGEuZmlsdGVyKGQgPT4gWyJsbG0iLCAidG9vbCJdLmluY2x1ZGVzKGQuVHlwZSkpOwoJCQljb25zdCBkYXRhID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkRhdGFUYWJsZSgpOwoJCQlkYXRhLmFkZENvbHVtbignc3RyaW5nJywgJ1N0ZXAnKTsKCQkJZGF0YS5hZGRDb2x1bW4oJ251bWJlcicsICdEdXJhdGlvbicpOwoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICd0b29sdGlwJ30pOyAKCgkJCWZpbHRlcmVkU3RlcHMuZm9yRWFjaChzID0+IHsKCQkJCQoJCQkJY29uc3QgZHVyID0gcy5EdXJhdGlvbiAvIDEwMDAwMDAwMDA7CgkJCQlsZXQgdG9vbHRpcCA9IHMuTmFtZTsKCQkJCWlmIChzLlR5cGUgPT09ICJsbG0iICYmIHMuVG9vbENhbGxzICYmIHMuVG9vbENhbGxzLmxlbmd0aCA+IDApIHsKCQkJCQl0b29sdGlwICs9IGBcblRvb2xzOiAke3MuVG9vbENhbGxzLmpvaW4oJywgJyl9YDsKCQkJCX0KCQkJCWRhdGEuYWRkUm93KFtgJHtzLlNlcX1gLCBkdXIsIHRvb2x0aXBdKTsKCQkJfSk7CgoJCQljb25zdCBvcHRpb25zID0gewoJCQkJdGl0bGU6ICdUaW1lIENvbnN1bXB0aW9uIG9mIExMTS9Ub29sIENhbGxzJywKCQkJCWhBeGlzOiB7CgkJCQkJdGl0bGU6ICdMTE0vVG9vbCBTdGVwcycsCgkJCQl9LAoJCQkJdkF4aXM6IHsgdGl0bGU6ICdTZWNvbmRzJyB9LAoJCQkJbGVnZW5kOiB7IHBvc2l0aW9uOiAnbm9uZScgfSwKCQkJCWJhcjogeyBncm91cFdpZHRoOiAnNzUlJyB9LAoJCQkJY2hhcnRBcmVhOiB7IHdpZHRoOiAnODUlJywgaGVpZ2h0OiAnNzAlJyB9LAoJCQkJaGVpZ2h0OiA0MDAKCQkJfTsKCgkJCWNvbnN0IGNoYXJ0ID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkNvbHVtbkNoYXJ0KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkdXJhdGlvbl9jaGFydF9kaXYnKSk7CgkJCWNoYXJ0LmRyYXcoZGF0YSwgb3B0aW9ucyk7CgkJfQoKCQlmdW5jdGlvbiBkcmF3VG9rZW5Db25zdW1wdGlvbkNoYXJ0KHJhd0RhdGEpIHsKCQkJY29uc3QgbGxtU3RlcHMgPSByYXdEYXRhLmZpbHRlcihkID0+IGQuVHlwZSA9PT0gImxsbSIpOwoJCQlpZiAobGxtU3RlcHMubGVuZ3RoID09PSAwKSByZXR1cm47CgoJCQljb25zdCBkYXRhID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkRhdGFUYWJsZSgpOwoJCQlkYXRhLmFkZENvbHVtbignc3RyaW5nJywgJ1N0ZXAnKTsJCQkKCQkJZGF0YS5hZGRDb2x1bW4oJ251bWJlcicsICdUb2tlbnMnKTsJCQkKCQkJZGF0YS5hZGRDb2x1bW4oe3R5cGU6ICdzdHJpbmcnLCByb2xlOiAnc3R5bGUnfSk7CQoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICd0b29sdGlwJ30pOwkKCgkJCWNvbnN0IGFnZW50Q29sb3JzID0ge307CgkJCWNvbnN0IHBhbGV0dGUgPSBbJyM0Mjg1RjQnLCAnI0RCNDQzNycsICcjRjRCNDAwJywgJyMwRjlENTgnLCAnI0FCNDdCQycsICcjMDBBQ0MxJ107CgkJCWxldCBjb2xvcklkeCA9IDA7CgkJCWNvbnN0IGFnZW50TExNQ291bnRzID0ge307CgkJCWxsbVN0ZXBzLmZvckVhY2gocyA9PiB7CgkJCQlpZiAoIWFnZW50Q29sb3JzW3MuTmFtZV0pIHsKCQkJCQlhZ2VudENvbG9yc1tzLk5hbWVdID0gcGFsZXR0ZVtjb2xvcklkeCAlIHBhbGV0dGUubGVuZ3RoXTsKCQkJCQljb2xvcklkeCsrOwoJCQkJfQoKCQkJCWFnZW50TExNQ291bnRzW3MuTmFtZV0gPSAoYWdlbnRMTE1Db3VudHNbcy5OYW1lXSB8fCAwKSArIDE7CgkJCQljb25zdCBsYWJlbCA9IGAke3MuTmFtZX0tJHthZ2VudExMTUNvdW50c1tzLk5hbWVdfWA7CgkJCQljb25zdCB0b3RhbFRva2VucyA9IHMuSW5wdXRUb2tlbnMgKyBzLk91dHB1dFRva2VucyArIHMuT3V0cHV0VGhvdWdodHNUb2tlbnM7CgkJCQljb25zdCBzdHlsZSA9IGBjb2xvcjogJHthZ2VudENvbG9yc1tzLk5hbWVdfWA7CgkJCQlsZXQgdG9vbHRpcCA9IGBUb3RhbCBUb2tlbnM6ICR7dG90YWxUb2tlbnN9XG4oSW46ICR7cy5JbnB1dFRva2Vuc30sIE91dDogJHtzLk91dHB1dFRva2Vuc30sIFRob3VnaHRzOiAke3MuT3V0cHV0VGhvdWdodHNUb2tlbnN9KWA7CgkJCQlpZiAocy5Ub29sQ2FsbHMgJiYgcy5Ub29sQ2FsbHMubGVuZ3RoID4gMCkgewoJCQkJCXRvb2x0aXAgKz0gYFxuVG9vbHM6ICR7cy5Ub29sQ2FsbHMuam9pbignLCAnKX1gOwoJCQkJfQoKCQkJCWRhdGEuYWRkUm93KFtsYWJlbCwgdG90YWxUb2tlbnMsIHN0eWxlLCB0b29sdGlwXSk7CgkJCX0pOwoKCQkJY29uc3Qgb3B0aW9ucyA9IHsKCQkJCXRpdGxlOiAnVG9rZW4gQ29uc3VtcHRpb24gYnkgTExNIENhbGxzJywKCQkJCWhBeGlzOiB7CgkJCQkJdGl0bGU6ICdMTE0gQ2FsbCBTZXF1ZW5jZScsCgkJCQl9LAoJCQkJdkF4aXM6IHsgdGl0bGU6ICdDb25zdW1lZCBUb2tlbnMnIH0sCgkJCQlsZWdlbmQ6IHsgcG9zaXRpb246ICdub25lJyB9LAoJCQkJYmFyOiB7IGdyb3VwV2lkdGg6ICc3NSUnIH0sCgkJCQljaGFydEFyZWE6IHsgd2lkdGg6ICc4NSUnLCBoZWlnaHQ6ICc3MCUnIH0sCgkJCQloZWlnaHQ6IDQwMAoJCQl9OwoKCQkJY29uc3QgY2hhcnQgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uQ29sdW1uQ2hhcnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rva2VuX2NoYXJ0X2RpdicpKTsKCQkJY2hhcnQuZHJhdyhkYXRhLCBvcHRpb25zKTsKCQl9CgkJbGV0IGFsbEV4cGFuZGVkID0gZmFsc2U7CgkJZnVuY3Rpb24gdG9nZ2xlQWxsRGV0YWlscygpIHsKCQkJYWxsRXhwYW5kZWQgPSAhYWxsRXhwYW5kZWQ7CgkJCWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2RldGFpbHMnKS5mb3JFYWNoKGQgPT4gewoJCQkJaWYgKGFsbEV4cGFuZGVkKSBkLnNldEF0dHJpYnV0ZSgnb3BlbicsICcnKTsKCQkJCWVsc2UgZC5yZW1vdmVBdHRyaWJ1dGUoJ29wZW4nKTsKCQkJfSk7CgkJfQoJPC9zY3JpcHQ+CgoKPC9ib2R5Pgo8L2h0bWw+Cg==" },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:nil,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,} --------- Name: series-workflowdrx5p[1] Phase: Succeeded StartedAt: 2026-09-07 21:56:29 +0000 UTC FinishedAt: 2026-09-07 21:56:29 +0000 UTC Input: nil Output: nil --------- Name: series-workflowdrx5p[1].abort-on-skip-outcome Phase: Skipped StartedAt: 2026-09-07 21:56:29 +0000 UTC FinishedAt: 2026-09-07 21:56:29 +0000 UTC Input: nil Output: nil --------- Name: series-workflowdrx5p[2] Phase: Succeeded StartedAt: 2026-09-07 21:56:29 +0000 UTC FinishedAt: 2026-09-08 01:43:32 +0000 UTC Input: nil Output: nil --------- Name: series-workflowdrx5p[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"0d9ff90a5422cc7509258aaaba1e7481df4d332a","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["__thp_vma_allowable_orders","vma_file_can_map_huge","vma_file_bypass_thp_tuneables","madvise_collapse"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"0d9ff90a5422cc7509258aaaba1e7481df4d332a","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE"],"series_id":"8331135f-f2e0-4800-bdcb-e79a8e626fce","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN) Phase: Succeeded StartedAt: 2026-09-07 21:56:29 +0000 UTC FinishedAt: 2026-09-08 01:43:32 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:element,Default:nil,Value:*{"base":{"arch":"amd64","commit_hash":"0d9ff90a5422cc7509258aaaba1e7481df4d332a","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},"fuzz":{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["__thp_vma_allowable_orders","vma_file_can_map_huge","vma_file_bypass_thp_tuneables","madvise_collapse"],"skip_cover_check":true},"patched":{"arch":"amd64","commit_hash":"0d9ff90a5422cc7509258aaaba1e7481df4d332a","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE"],"series_id":"8331135f-f2e0-4800-bdcb-e79a8e626fce","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},"retest":null,"track":"KASAN"},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: nil --------- Name: series-workflowdrx5p[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"0d9ff90a5422cc7509258aaaba1e7481df4d332a","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["__thp_vma_allowable_orders","vma_file_can_map_huge","vma_file_bypass_thp_tuneables","madvise_collapse"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"0d9ff90a5422cc7509258aaaba1e7481df4d332a","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE"],"series_id":"8331135f-f2e0-4800-bdcb-e79a8e626fce","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[0] Phase: Succeeded StartedAt: 2026-09-07 21:56:29 +0000 UTC FinishedAt: 2026-09-07 21:56:39 +0000 UTC Input: nil Output: nil --------- Name: series-workflowdrx5p[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"0d9ff90a5422cc7509258aaaba1e7481df4d332a","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["__thp_vma_allowable_orders","vma_file_can_map_huge","vma_file_bypass_thp_tuneables","madvise_collapse"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"0d9ff90a5422cc7509258aaaba1e7481df4d332a","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE"],"series_id":"8331135f-f2e0-4800-bdcb-e79a8e626fce","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[0].save-base-req Phase: Succeeded StartedAt: 2026-09-07 21:56:29 +0000 UTC FinishedAt: 2026-09-07 21:56:36 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"arch":"amd64","commit_hash":"0d9ff90a5422cc7509258aaaba1e7481df4d332a","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: &Outputs{Parameters:[]Parameter{},Artifacts:[]Artifact{Artifact{Name:artifact,Path:/tmp/artifact,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowdrx5p/series-workflowdrx5p-convert-artifact-4263653629/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowdrx5p[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"0d9ff90a5422cc7509258aaaba1e7481df4d332a","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["__thp_vma_allowable_orders","vma_file_can_map_huge","vma_file_bypass_thp_tuneables","madvise_collapse"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"0d9ff90a5422cc7509258aaaba1e7481df4d332a","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE"],"series_id":"8331135f-f2e0-4800-bdcb-e79a8e626fce","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[1] Phase: Succeeded StartedAt: 2026-09-07 21:56:39 +0000 UTC FinishedAt: 2026-09-07 22:15:22 +0000 UTC Input: nil Output: nil --------- Name: series-workflowdrx5p[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"0d9ff90a5422cc7509258aaaba1e7481df4d332a","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["__thp_vma_allowable_orders","vma_file_can_map_huge","vma_file_bypass_thp_tuneables","madvise_collapse"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"0d9ff90a5422cc7509258aaaba1e7481df4d332a","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE"],"series_id":"8331135f-f2e0-4800-bdcb-e79a8e626fce","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[1].base-build Phase: Succeeded StartedAt: 2026-09-07 21:56:39 +0000 UTC FinishedAt: 2026-09-07 22:15:22 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:findings,Default:nil,Value:*false,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:test-name,Default:nil,Value:*[KASAN] Build Base,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:smoke-build,Default:nil,Value:*false,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:session-id,Default:nil,Value:*1625a56e-0654-4f01-91c8-3e5e9775cca3,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:request,Path:/tmp/request.json,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowdrx5p/series-workflowdrx5p-convert-artifact-4263653629/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "build_id": "ffb8d510-671c-4394-ae80-e40e857ed1e9", "success": true },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:*,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:kernel,Path:/output,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowdrx5p/series-workflowdrx5p-build-action-690428467/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowdrx5p[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"0d9ff90a5422cc7509258aaaba1e7481df4d332a","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["__thp_vma_allowable_orders","vma_file_can_map_huge","vma_file_bypass_thp_tuneables","madvise_collapse"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"0d9ff90a5422cc7509258aaaba1e7481df4d332a","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE"],"series_id":"8331135f-f2e0-4800-bdcb-e79a8e626fce","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[1].base-build(0) Phase: Succeeded StartedAt: 2026-09-07 21:56:39 +0000 UTC FinishedAt: 2026-09-07 22:15:12 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:findings,Default:nil,Value:*false,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:test-name,Default:nil,Value:*[KASAN] Build Base,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:smoke-build,Default:nil,Value:*false,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:session-id,Default:nil,Value:*1625a56e-0654-4f01-91c8-3e5e9775cca3,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:request,Path:/tmp/request.json,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowdrx5p/series-workflowdrx5p-convert-artifact-4263653629/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "build_id": "ffb8d510-671c-4394-ae80-e40e857ed1e9", "success": true },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:*,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:kernel,Path:/output,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowdrx5p/series-workflowdrx5p-build-action-690428467/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowdrx5p[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"0d9ff90a5422cc7509258aaaba1e7481df4d332a","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["__thp_vma_allowable_orders","vma_file_can_map_huge","vma_file_bypass_thp_tuneables","madvise_collapse"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"0d9ff90a5422cc7509258aaaba1e7481df4d332a","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE"],"series_id":"8331135f-f2e0-4800-bdcb-e79a8e626fce","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[2] Phase: Succeeded StartedAt: 2026-09-07 22:15:22 +0000 UTC FinishedAt: 2026-09-07 22:15:22 +0000 UTC Input: nil Output: nil --------- Name: series-workflowdrx5p[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"0d9ff90a5422cc7509258aaaba1e7481df4d332a","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["__thp_vma_allowable_orders","vma_file_can_map_huge","vma_file_bypass_thp_tuneables","madvise_collapse"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"0d9ff90a5422cc7509258aaaba1e7481df4d332a","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE"],"series_id":"8331135f-f2e0-4800-bdcb-e79a8e626fce","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[2].abort-if-base-build-failed Phase: Skipped StartedAt: 2026-09-07 22:15:22 +0000 UTC FinishedAt: 2026-09-07 22:15:22 +0000 UTC Input: nil Output: nil --------- Name: series-workflowdrx5p[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"0d9ff90a5422cc7509258aaaba1e7481df4d332a","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["__thp_vma_allowable_orders","vma_file_can_map_huge","vma_file_bypass_thp_tuneables","madvise_collapse"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"0d9ff90a5422cc7509258aaaba1e7481df4d332a","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE"],"series_id":"8331135f-f2e0-4800-bdcb-e79a8e626fce","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[3] Phase: Succeeded StartedAt: 2026-09-07 22:15:22 +0000 UTC FinishedAt: 2026-09-07 22:15:32 +0000 UTC Input: nil Output: nil --------- Name: series-workflowdrx5p[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"0d9ff90a5422cc7509258aaaba1e7481df4d332a","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["__thp_vma_allowable_orders","vma_file_can_map_huge","vma_file_bypass_thp_tuneables","madvise_collapse"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"0d9ff90a5422cc7509258aaaba1e7481df4d332a","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE"],"series_id":"8331135f-f2e0-4800-bdcb-e79a8e626fce","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[3].save-patched-req Phase: Succeeded StartedAt: 2026-09-07 22:15:22 +0000 UTC FinishedAt: 2026-09-07 22:15:27 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"arch":"amd64","commit_hash":"0d9ff90a5422cc7509258aaaba1e7481df4d332a","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE"],"series_id":"8331135f-f2e0-4800-bdcb-e79a8e626fce","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: &Outputs{Parameters:[]Parameter{},Artifacts:[]Artifact{Artifact{Name:artifact,Path:/tmp/artifact,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowdrx5p/series-workflowdrx5p-convert-artifact-3167539544/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowdrx5p[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"0d9ff90a5422cc7509258aaaba1e7481df4d332a","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["__thp_vma_allowable_orders","vma_file_can_map_huge","vma_file_bypass_thp_tuneables","madvise_collapse"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"0d9ff90a5422cc7509258aaaba1e7481df4d332a","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE"],"series_id":"8331135f-f2e0-4800-bdcb-e79a8e626fce","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[4] Phase: Succeeded StartedAt: 2026-09-07 22:15:32 +0000 UTC FinishedAt: 2026-09-07 22:17:55 +0000 UTC Input: nil Output: nil --------- Name: series-workflowdrx5p[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"0d9ff90a5422cc7509258aaaba1e7481df4d332a","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["__thp_vma_allowable_orders","vma_file_can_map_huge","vma_file_bypass_thp_tuneables","madvise_collapse"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"0d9ff90a5422cc7509258aaaba1e7481df4d332a","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE"],"series_id":"8331135f-f2e0-4800-bdcb-e79a8e626fce","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[4].boot-test-base Phase: Succeeded StartedAt: 2026-09-07 22:15:32 +0000 UTC FinishedAt: 2026-09-07 22:17:45 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*ffb8d510-671c-4394-ae80-e40e857ed1e9,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:test-name,Default:nil,Value:*[KASAN] Boot test: Base,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:report-findings,Default:nil,Value:*false,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:kernel,Path:/base,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowdrx5p/series-workflowdrx5p-build-action-690428467/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "success": true },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:nil,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,} --------- Name: series-workflowdrx5p[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"0d9ff90a5422cc7509258aaaba1e7481df4d332a","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["__thp_vma_allowable_orders","vma_file_can_map_huge","vma_file_bypass_thp_tuneables","madvise_collapse"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"0d9ff90a5422cc7509258aaaba1e7481df4d332a","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE"],"series_id":"8331135f-f2e0-4800-bdcb-e79a8e626fce","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[5] Phase: Succeeded StartedAt: 2026-09-07 22:17:55 +0000 UTC FinishedAt: 2026-09-07 22:17:55 +0000 UTC Input: nil Output: nil --------- Name: series-workflowdrx5p[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"0d9ff90a5422cc7509258aaaba1e7481df4d332a","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["__thp_vma_allowable_orders","vma_file_can_map_huge","vma_file_bypass_thp_tuneables","madvise_collapse"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"0d9ff90a5422cc7509258aaaba1e7481df4d332a","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE"],"series_id":"8331135f-f2e0-4800-bdcb-e79a8e626fce","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[5].abort-if-base-boot-failed Phase: Skipped StartedAt: 2026-09-07 22:17:55 +0000 UTC FinishedAt: 2026-09-07 22:17:55 +0000 UTC Input: nil Output: nil --------- Name: series-workflowdrx5p[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"0d9ff90a5422cc7509258aaaba1e7481df4d332a","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["__thp_vma_allowable_orders","vma_file_can_map_huge","vma_file_bypass_thp_tuneables","madvise_collapse"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"0d9ff90a5422cc7509258aaaba1e7481df4d332a","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE"],"series_id":"8331135f-f2e0-4800-bdcb-e79a8e626fce","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[6] Phase: Succeeded StartedAt: 2026-09-07 22:17:55 +0000 UTC FinishedAt: 2026-09-07 22:38:18 +0000 UTC Input: nil Output: nil --------- Name: series-workflowdrx5p[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"0d9ff90a5422cc7509258aaaba1e7481df4d332a","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["__thp_vma_allowable_orders","vma_file_can_map_huge","vma_file_bypass_thp_tuneables","madvise_collapse"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"0d9ff90a5422cc7509258aaaba1e7481df4d332a","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE"],"series_id":"8331135f-f2e0-4800-bdcb-e79a8e626fce","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[6].patched-build Phase: Succeeded StartedAt: 2026-09-07 22:17:55 +0000 UTC FinishedAt: 2026-09-07 22:38:18 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:findings,Default:nil,Value:*true,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:test-name,Default:nil,Value:*[KASAN] Build Patched,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:smoke-build,Default:nil,Value:*false,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:session-id,Default:nil,Value:*1625a56e-0654-4f01-91c8-3e5e9775cca3,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:request,Path:/tmp/request.json,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowdrx5p/series-workflowdrx5p-convert-artifact-3167539544/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "build_id": "02583d01-15e9-4930-bcc6-66b35e6f3be8", "success": true },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:*,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:kernel,Path:/output,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowdrx5p/series-workflowdrx5p-build-action-628652740/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowdrx5p[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"0d9ff90a5422cc7509258aaaba1e7481df4d332a","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["__thp_vma_allowable_orders","vma_file_can_map_huge","vma_file_bypass_thp_tuneables","madvise_collapse"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"0d9ff90a5422cc7509258aaaba1e7481df4d332a","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE"],"series_id":"8331135f-f2e0-4800-bdcb-e79a8e626fce","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[6].patched-build(0) Phase: Succeeded StartedAt: 2026-09-07 22:17:55 +0000 UTC FinishedAt: 2026-09-07 22:38:09 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:findings,Default:nil,Value:*true,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:test-name,Default:nil,Value:*[KASAN] Build Patched,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:smoke-build,Default:nil,Value:*false,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:session-id,Default:nil,Value:*1625a56e-0654-4f01-91c8-3e5e9775cca3,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:request,Path:/tmp/request.json,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowdrx5p/series-workflowdrx5p-convert-artifact-3167539544/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "build_id": "02583d01-15e9-4930-bcc6-66b35e6f3be8", "success": true },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:*,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:kernel,Path:/output,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowdrx5p/series-workflowdrx5p-build-action-628652740/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowdrx5p[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"0d9ff90a5422cc7509258aaaba1e7481df4d332a","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["__thp_vma_allowable_orders","vma_file_can_map_huge","vma_file_bypass_thp_tuneables","madvise_collapse"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"0d9ff90a5422cc7509258aaaba1e7481df4d332a","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE"],"series_id":"8331135f-f2e0-4800-bdcb-e79a8e626fce","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[7] Phase: Succeeded StartedAt: 2026-09-07 22:38:18 +0000 UTC FinishedAt: 2026-09-07 22:38:18 +0000 UTC Input: nil Output: nil --------- Name: series-workflowdrx5p[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"0d9ff90a5422cc7509258aaaba1e7481df4d332a","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["__thp_vma_allowable_orders","vma_file_can_map_huge","vma_file_bypass_thp_tuneables","madvise_collapse"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"0d9ff90a5422cc7509258aaaba1e7481df4d332a","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE"],"series_id":"8331135f-f2e0-4800-bdcb-e79a8e626fce","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[7].abort-if-patched-build-failed Phase: Skipped StartedAt: 2026-09-07 22:38:18 +0000 UTC FinishedAt: 2026-09-07 22:38:18 +0000 UTC Input: nil Output: nil --------- Name: series-workflowdrx5p[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"0d9ff90a5422cc7509258aaaba1e7481df4d332a","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["__thp_vma_allowable_orders","vma_file_can_map_huge","vma_file_bypass_thp_tuneables","madvise_collapse"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"0d9ff90a5422cc7509258aaaba1e7481df4d332a","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE"],"series_id":"8331135f-f2e0-4800-bdcb-e79a8e626fce","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[8] Phase: Succeeded StartedAt: 2026-09-07 22:38:18 +0000 UTC FinishedAt: 2026-09-07 22:40:29 +0000 UTC Input: nil Output: nil --------- Name: series-workflowdrx5p[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"0d9ff90a5422cc7509258aaaba1e7481df4d332a","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["__thp_vma_allowable_orders","vma_file_can_map_huge","vma_file_bypass_thp_tuneables","madvise_collapse"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"0d9ff90a5422cc7509258aaaba1e7481df4d332a","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE"],"series_id":"8331135f-f2e0-4800-bdcb-e79a8e626fce","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[8].boot-test-patched Phase: Succeeded StartedAt: 2026-09-07 22:38:18 +0000 UTC FinishedAt: 2026-09-07 22:40:19 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*02583d01-15e9-4930-bcc6-66b35e6f3be8,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:test-name,Default:nil,Value:*[KASAN] Boot test: Patched,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:report-findings,Default:nil,Value:*true,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:kernel,Path:/base,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowdrx5p/series-workflowdrx5p-build-action-628652740/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "success": true },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:nil,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,} --------- Name: series-workflowdrx5p[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"0d9ff90a5422cc7509258aaaba1e7481df4d332a","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["__thp_vma_allowable_orders","vma_file_can_map_huge","vma_file_bypass_thp_tuneables","madvise_collapse"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"0d9ff90a5422cc7509258aaaba1e7481df4d332a","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE"],"series_id":"8331135f-f2e0-4800-bdcb-e79a8e626fce","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[10] Phase: Succeeded StartedAt: 2026-09-07 22:40:29 +0000 UTC FinishedAt: 2026-09-08 01:43:32 +0000 UTC Input: nil Output: nil --------- Name: series-workflowdrx5p[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"0d9ff90a5422cc7509258aaaba1e7481df4d332a","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["__thp_vma_allowable_orders","vma_file_can_map_huge","vma_file_bypass_thp_tuneables","madvise_collapse"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"0d9ff90a5422cc7509258aaaba1e7481df4d332a","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE"],"series_id":"8331135f-f2e0-4800-bdcb-e79a8e626fce","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[10].run-fuzz Phase: Succeeded StartedAt: 2026-09-07 22:40:29 +0000 UTC FinishedAt: 2026-09-08 01:43:32 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:config,Default:nil,Value:*{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["__thp_vma_allowable_orders","vma_file_can_map_huge","vma_file_bypass_thp_tuneables","madvise_collapse"],"skip_cover_check":true},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:track,Default:nil,Value:*KASAN,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:base-build-id,Default:nil,Value:*ffb8d510-671c-4394-ae80-e40e857ed1e9,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*02583d01-15e9-4930-bcc6-66b35e6f3be8,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:base-kernel,Path:,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowdrx5p/series-workflowdrx5p-build-action-690428467/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},Artifact{Name:patched-kernel,Path:,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowdrx5p/series-workflowdrx5p-build-action-628652740/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: nil --------- Name: series-workflowdrx5p[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"0d9ff90a5422cc7509258aaaba1e7481df4d332a","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["__thp_vma_allowable_orders","vma_file_can_map_huge","vma_file_bypass_thp_tuneables","madvise_collapse"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"0d9ff90a5422cc7509258aaaba1e7481df4d332a","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE"],"series_id":"8331135f-f2e0-4800-bdcb-e79a8e626fce","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[10].run-fuzz[0] Phase: Succeeded StartedAt: 2026-09-07 22:40:29 +0000 UTC FinishedAt: 2026-09-07 22:40:39 +0000 UTC Input: nil Output: nil --------- Name: series-workflowdrx5p[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"0d9ff90a5422cc7509258aaaba1e7481df4d332a","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["__thp_vma_allowable_orders","vma_file_can_map_huge","vma_file_bypass_thp_tuneables","madvise_collapse"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"0d9ff90a5422cc7509258aaaba1e7481df4d332a","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE"],"series_id":"8331135f-f2e0-4800-bdcb-e79a8e626fce","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[10].run-fuzz[0].save-fuzz-config Phase: Succeeded StartedAt: 2026-09-07 22:40:29 +0000 UTC FinishedAt: 2026-09-07 22:40:33 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["__thp_vma_allowable_orders","vma_file_can_map_huge","vma_file_bypass_thp_tuneables","madvise_collapse"],"skip_cover_check":true},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: &Outputs{Parameters:[]Parameter{},Artifacts:[]Artifact{Artifact{Name:artifact,Path:/tmp/artifact,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowdrx5p/series-workflowdrx5p-convert-artifact-3016664369/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowdrx5p[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"0d9ff90a5422cc7509258aaaba1e7481df4d332a","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["__thp_vma_allowable_orders","vma_file_can_map_huge","vma_file_bypass_thp_tuneables","madvise_collapse"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"0d9ff90a5422cc7509258aaaba1e7481df4d332a","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE"],"series_id":"8331135f-f2e0-4800-bdcb-e79a8e626fce","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[10].run-retest Phase: Skipped StartedAt: 2026-09-07 22:40:29 +0000 UTC FinishedAt: 2026-09-07 22:40:29 +0000 UTC Input: nil Output: nil --------- Name: series-workflowdrx5p[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"0d9ff90a5422cc7509258aaaba1e7481df4d332a","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["__thp_vma_allowable_orders","vma_file_can_map_huge","vma_file_bypass_thp_tuneables","madvise_collapse"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"0d9ff90a5422cc7509258aaaba1e7481df4d332a","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE"],"series_id":"8331135f-f2e0-4800-bdcb-e79a8e626fce","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[9] Phase: Succeeded StartedAt: 2026-09-07 22:40:29 +0000 UTC FinishedAt: 2026-09-07 22:40:29 +0000 UTC Input: nil Output: nil --------- Name: series-workflowdrx5p[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"0d9ff90a5422cc7509258aaaba1e7481df4d332a","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["__thp_vma_allowable_orders","vma_file_can_map_huge","vma_file_bypass_thp_tuneables","madvise_collapse"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"0d9ff90a5422cc7509258aaaba1e7481df4d332a","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE"],"series_id":"8331135f-f2e0-4800-bdcb-e79a8e626fce","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[9].abort-if-patched-boot-failed Phase: Skipped StartedAt: 2026-09-07 22:40:29 +0000 UTC FinishedAt: 2026-09-07 22:40:29 +0000 UTC Input: nil Output: nil --------- Name: series-workflowdrx5p[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"0d9ff90a5422cc7509258aaaba1e7481df4d332a","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["__thp_vma_allowable_orders","vma_file_can_map_huge","vma_file_bypass_thp_tuneables","madvise_collapse"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"0d9ff90a5422cc7509258aaaba1e7481df4d332a","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE"],"series_id":"8331135f-f2e0-4800-bdcb-e79a8e626fce","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[10].run-fuzz[1] Phase: Succeeded StartedAt: 2026-09-07 22:40:39 +0000 UTC FinishedAt: 2026-09-08 01:43:32 +0000 UTC Input: nil Output: nil --------- Name: series-workflowdrx5p[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"0d9ff90a5422cc7509258aaaba1e7481df4d332a","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["__thp_vma_allowable_orders","vma_file_can_map_huge","vma_file_bypass_thp_tuneables","madvise_collapse"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"0d9ff90a5422cc7509258aaaba1e7481df4d332a","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE"],"series_id":"8331135f-f2e0-4800-bdcb-e79a8e626fce","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[10].run-fuzz[1].fuzz Phase: Succeeded StartedAt: 2026-09-07 22:40:39 +0000 UTC FinishedAt: 2026-09-08 01:43:22 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*ffb8d510-671c-4394-ae80-e40e857ed1e9,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*02583d01-15e9-4930-bcc6-66b35e6f3be8,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:test-name,Default:nil,Value:*[KASAN] Fuzz,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:base-kernel,Path:/base,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowdrx5p/series-workflowdrx5p-build-action-690428467/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},Artifact{Name:patched-kernel,Path:/patched,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowdrx5p/series-workflowdrx5p-build-action-628652740/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},Artifact{Name:config,Path:/tmp/config.json,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowdrx5p/series-workflowdrx5p-convert-artifact-3016664369/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: &Outputs{Parameters:[]Parameter{},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,}