Name: series-workflowblgnh Phase: Succeeded StartedAt: 2026-09-07 20:15:12 +0000 UTC FinishedAt: 2026-09-08 00:25:26 +0000 UTC Input: nil Output: nil --------- Name: series-workflowblgnh[0] Phase: Succeeded StartedAt: 2026-09-07 20:15:12 +0000 UTC FinishedAt: 2026-09-07 20:38:11 +0000 UTC Input: nil Output: nil --------- Name: series-workflowblgnh[0].run-triage Phase: Succeeded StartedAt: 2026-09-07 20:15:12 +0000 UTC FinishedAt: 2026-09-07 20:38:11 +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": "9e52420889a26d87ac7a92eb579cf18d7b516397", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "SWAP", "ZSWAP" ], "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": "9e52420889a26d87ac7a92eb579cf18d7b516397", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "SWAP", "ZSWAP" ], "series_id": "86ba1bb8-7273-4e3b-9bee-7ba04651ce92" }, "track": "KASAN", "fuzz": { "focus": null, "focus_symbols": [ "zswap_load", "swap_read_folio" ], "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+CgkJCTx0ZD4yMDI2LzA5LzA3IDIwOjM3PC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O1NXQVAmIzM0OywKICAgICYjMzQ7WlNXQVAmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDt6c3dhcF9sb2FkJiMzNDssCiAgICAmIzM0O3N3YXBfcmVhZF9mb2xpbyYjMzQ7CiAgXSwKICAmIzM0O0tNU0FOUmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIG1vZGlmaWVzIGB6c3dhcF9sb2FkKClgIHRvIHN1cHBvcnQgY2hlY2tpbmcgd2hldGhlciBsYXJnZSBmb2xpb3MgaGF2ZSBlbnRyaWVzIGluIHpzd2FwIHZpYSBgenN3YXBfaXNfcHJlc2VudCgpYC4gSWYgbm8gZW50cmllcyBpbiB0aGUgcmFuZ2UgYXJlIGNhY2hlZCBpbiB6c3dhcCwgaXQgcmV0dXJucyBgLUVOT0VOVGAgc28gdGhlIGJhY2tpbmcgc3dhcCBkZXZpY2UgY2FuIHJlYWQgdGhlIGVudGlyZSBsYXJnZSBmb2xpbyBpbnN0ZWFkIG9mIHVuY29uZGl0aW9uYWxseSBmYWlsaW5nIHdpdGggYC1FSU5WQUxgLlxuXG5BbGwgdmFyaWFibGVzIHVzZWQgaW4gdGhlIG5ld2x5IGludHJvZHVjZWQgYHpzd2FwX2lzX3ByZXNlbnQoKWAgZnVuY3Rpb24gKGBvZmZzZXRgLCBgdHJlZWAsIGBpbmRleGApIGFyZSBmdWxseSBpbml0aWFsaXplZCBzY2FsYXIgYW5kIHBvaW50ZXIgdmFsdWVzLiBUaGUgcGF0Y2ggZG9lcyBub3QgYWxsb2NhdGUgbmV3IHN0cnVjdHVyZXMsIGNvcHkgdW5pbml0aWFsaXplZCBtZW1vcnkgdG8gdXNlciBzcGFjZSwgYnJhbmNoIG9uIHVuaW5pdGlhbGl6ZWQgdmFsdWVzLCBvciBhbHRlciBidWZmZXIgbGVuZ3RocyBpbiBhIHdheSB0aGF0IHdvdWxkIGxlYXZlIHVuaW5pdGlhbGl6ZWQga2VybmVsIG1lbW9yeSBleHBvc2VkLiBBbnkgcG90ZW50aWFsIHBhZ2UvZm9saW8gc3RhdGUgaXNzdWVzIG9yIG91dC1vZi1ib3VuZHMgaW5kZXggaXNzdWVzIGFyZSBhZGVxdWF0ZWx5IGNvdmVyZWQgYnkgc3RhbmRhcmQgYXNzZXJ0aW9ucyBhbmQgS0FTQU4uIFRoZXJlZm9yZSwgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGlzIG5vdCByZXF1aXJlZC4mIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UsCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggbW9kaWZpZXMgbWVtb3J5IG1hbmFnZW1lbnQgbG9naWMgaW4gbW0venN3YXAuYyBieSBpbnRyb2R1Y2luZyB6c3dhcF9pc19wcmVzZW50KCkgYW5kIHVwZGF0aW5nIHpzd2FwX2xvYWQoKSB0byBpbnNwZWN0IGxhcmdlIGZvbGlvcyBpbnN0ZWFkIG9mIHVuY29uZGl0aW9uYWxseSByZWplY3RpbmcgdGhlbS4gVGhpcyBjaGFuZ2VzIGNvcmUgc3dhcC1pbiBoYW5kbGluZyBhbmQgYXNzZXJ0aW9ucyBpbiByZWFjaGFibGUgbW0gY29kZSwgd2FycmFudGluZyBmdXp6aW5nLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA3IDIwOjM3PC90ZD4KCQkJPHRkPmFjdGlvbjwvdGQ+CgkJCTx0ZD5yZWFkLXBhdGNoLWRpZmY8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtQYXRjaERpZmYmIzM0OzogJiMzNDtjb21taXQgMGFjZTJkYjM1MWFkMGE3ZWRiOTBhNmNhMDQ5MzU3NDhiYmM3MmZkMVxuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBNb24gU2VwIDcgMjA6Mzc6MDkgMjAyNiAmIzQzOzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvbW0venN3YXAuYyBiL21tL3pzd2FwLmNcbmluZGV4IDM3ZjM0ZTQwNmM4ZTMuLmZkMzZhYzM4ZTlhMWUgMTAwNjQ0XG4tLS0gYS9tbS96c3dhcC5jXG4mIzQzOyYjNDM7JiM0MzsgYi9tbS96c3dhcC5jXG5AQCAtMTU3MSw2ICYjNDM7MTU3MSwzMiBAQCBib29sIHpzd2FwX3N0b3JlKHN0cnVjdCBmb2xpbyAqZm9saW8pXG4gXHRyZXR1cm4gcmV0O1xuIH1cbiBcbiYjNDM7LyoqXG4mIzQzOyAqIHpzd2FwX2lzX3ByZXNlbnQoKSAtIGlzIGFueSBzbG90IGluIFtlbnRyeSwgZW50cnkgJiM0MzsgbnIpIGluIHpzd2FwP1xuJiM0MzsgKiBAZW50cnk6IGJhc2Ugc3dhcCBlbnRyeSBvZiB0aGUgcmFuZ2VcbiYjNDM7ICogQG5yOiBudW1iZXIgb2YgY29udGlndW91cyBzbG90cyB0byBjaGVja1xuJiM0MzsgKlxuJiM0MzsgKiBDb250ZXh0OiBUaGUgY2FsbGVyIG11c3Qga2VlcCB0aGUgcmFuZ2UgcGlubmVkLCBvdGhlcndpc2UgdGhlIGFuc3dlciBjYW5cbiYjNDM7ICogY2hhbmdlIHVuZGVyIGl0LlxuJiM0MzsgKiBSZXR1cm46IHRydWUgaWYgYXQgbGVhc3Qgb25lIHNsb3QgaW4gdGhlIHJhbmdlIGlzIGluIHpzd2FwLlxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIGJvb2wgenN3YXBfaXNfcHJlc2VudChzd3BfZW50cnlfdCBlbnRyeSwgdW5zaWduZWQgaW50IG5yKVxuJiM0Mzt7XG4mIzQzO1x0cGdvZmZfdCBvZmZzZXQgPSBzd3Bfb2Zmc2V0KGVudHJ5KTtcbiYjNDM7XHRzdHJ1Y3QgeGFycmF5ICp0cmVlID0gc3dhcF96c3dhcF90cmVlKGVudHJ5KTtcbiYjNDM7XHR1bnNpZ25lZCBsb25nIGluZGV4ID0gb2Zmc2V0O1xuJiM0MztcbiYjNDM7XHQvKlxuJiM0MztcdCAqIEEgcGlubmVkIHJhbmdlIGlzIGF0IG1vc3QgU1dBUEZJTEVfQ0xVU1RFUiBzbG90cyBhbmQgaXMgYWxpZ25lZCB0b1xuJiM0MztcdCAqIGl0cyBvd24gc2l6ZSwgc28gb25lIHRyZWUgY292ZXJzIGFsbCBvZiBpdCBhbmQgYSBzaW5nbGUgbG9va3VwIGlzXG4mIzQzO1x0ICogZW5vdWdoLiBTY2FubmluZyBvbmx5IHBhcnQgb2YgdGhlIHJhbmdlIHdvdWxkIHJlcG9ydCBhIGZhbHNlXG4mIzQzO1x0ICogXCYjMzQ7YWJzZW50XCYjMzQ7IGFuZCBsZXQgdGhlIGNhbGxlciByZWFkIGEgc3RhbGUgY29weSBmcm9tIHRoZSBkZXZpY2UuXG4mIzQzO1x0ICovXG4mIzQzO1x0QlVJTERfQlVHX09OKFNXQVBGSUxFX0NMVVNURVIgXHUwMDNlIFpTV0FQX0FERFJFU1NfU1BBQ0VfUEFHRVMpO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4geGFfZmluZCh0cmVlLCBcdTAwMjZpbmRleCwgb2Zmc2V0ICYjNDM7IG5yIC0gMSwgWEFfUFJFU0VOVCk7XG4mIzQzO31cbiYjNDM7XG4gLyoqXG4gICogenN3YXBfbG9hZCgpIC0gbG9hZCBhIGZvbGlvIGZyb20genN3YXBcbiAgKiBAZm9saW86IGZvbGlvIHRvIGxvYWRcbkBAIC0xNTc4LDE1ICYjNDM7MTYwNCwxMiBAQCBib29sIHpzd2FwX3N0b3JlKHN0cnVjdCBmb2xpbyAqZm9saW8pXG4gICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIHdpdGggdGhlIGZvbGlvIHVubG9ja2VkIGFuZCBtYXJrZWQgdXAtdG8tZGF0ZSwgb3Igb25lXG4gICogb2YgdGhlIGZvbGxvd2luZyBlcnJvciBjb2RlczpcbiAgKlxuLSAqICAtRUlPOiBpZiB0aGUgc3dhcHBlZCBvdXQgY29udGVudCB3YXMgaW4genN3YXAsIGJ1dCBjb3VsZCBub3QgYmUgbG9hZGVkXG4tICogIGludG8gdGhlIHBhZ2UgZHVlIHRvIGEgZGVjb21wcmVzc2lvbiBmYWlsdXJlLiBUaGUgZm9saW8gaXMgdW5sb2NrZWQsIGJ1dFxuLSAqICBOT1QgbWFya2VkIHVwLXRvLWRhdGUsIHNvIHRoYXQgYW4gSU8gZXJyb3IgaXMgZW1pdHRlZCAoZS5nLiBkb19zd2FwX3BhZ2UoKVxuLSAqICB3aWxsIFNJR0JVUykuXG4tICpcbi0gKiAgLUVJTlZBTDogaWYgdGhlIHN3YXBwZWQgb3V0IGNvbnRlbnQgd2FzIGluIHpzd2FwLCBidXQgdGhlIHBhZ2UgYmVsb25nc1xuLSAqICB0byBhIGxhcmdlIGZvbGlvLCB3aGljaCBpcyBub3Qgc3VwcG9ydGVkIGJ5IHpzd2FwLiBUaGUgZm9saW8gaXMgdW5sb2NrZWQsXG4tICogIGJ1dCBOT1QgbWFya2VkIHVwLXRvLWRhdGUsIHNvIHRoYXQgYW4gSU8gZXJyb3IgaXMgZW1pdHRlZCAoZS5nLlxuLSAqICBkb19zd2FwX3BhZ2UoKSB3aWxsIFNJR0JVUykuXG4mIzQzOyAqICAtRUlPOiBpZiB0aGUgc3dhcHBlZCBvdXQgY29udGVudCB3YXMgaW4genN3YXAgYnV0IGNvdWxkIG5vdCBiZSBoYW5kZWRcbiYjNDM7ICogIGJhY2ssIGVpdGhlciBiZWNhdXNlIGRlY29tcHJlc3Npb24gZmFpbGVkIG9yIGJlY2F1c2UgYSBzbG90IGluIGFcbiYjNDM7ICogIGxhcmdlLWZvbGlvIHJhbmdlIGlzIHN0aWxsIGluIHpzd2FwIGFuZCB6c3dhcCBjYW5ub3QgcmVjb25zdHJ1Y3QgYSBsYXJnZVxuJiM0MzsgKiAgZm9saW8gZnJvbSBwZXItcGFnZSBlbnRyaWVzLiBUaGUgZm9saW8gaXMgdW5sb2NrZWQsIGJ1dCBOT1QgbWFya2VkXG4mIzQzOyAqICB1cC10by1kYXRlLCBzbyB0aGF0IGFuIElPIGVycm9yIGlzIGVtaXR0ZWQgKGUuZy4gZG9fc3dhcF9wYWdlKCkgd2lsbFxuJiM0MzsgKiAgU0lHQlVTKS5cbiAgKlxuICAqICAtRU5PRU5UOiBpZiB0aGUgc3dhcHBlZCBvdXQgY29udGVudCB3YXMgbm90IGluIHpzd2FwLiBUaGUgZm9saW8gcmVtYWluc1xuICAqICBsb2NrZWQgb24gcmV0dXJuLlxuQEAgLTE2MDUsMTMgJiM0MzsxNjI4LDE4IEBAIGludCB6c3dhcF9sb2FkKHN0cnVjdCBmb2xpbyAqZm9saW8pXG4gXHRcdHJldHVybiAtRU5PRU5UO1xuIFxuIFx0Lypcbi1cdCAqIExhcmdlIGZvbGlvcyBzaG91bGQgbm90IGJlIHN3YXBwZWQgaW4gd2hpbGUgenN3YXAgaXMgYmVpbmcgdXNlZCwgYXNcbi1cdCAqIHRoZXkgYXJlIG5vdCBwcm9wZXJseSBoYW5kbGVkLiBac3dhcCBkb2VzIG5vdCBwcm9wZXJseSBsb2FkIGxhcmdlXG4tXHQgKiBmb2xpb3MsIGFuZCBhIGxhcmdlIGZvbGlvIG1heSBvbmx5IGJlIHBhcnRpYWxseSBpbiB6c3dhcC5cbiYjNDM7XHQgKiBBIGxhcmdlIGZvbGlvIGNhbiBsZWdpdGltYXRlbHkgcmVhY2ggenN3YXBfbG9hZCgpIHdpdGggaXRzIHdob2xlXG4mIzQzO1x0ICogcmFuZ2Ugb24gdGhlIGJhY2tpbmcgZGV2aWNlLCBzbyBzY2FuIHRoZSByYW5nZSByYXRoZXIgdGhhbiByZWplY3RpbmdcbiYjNDM7XHQgKiBpdCBvdXRyaWdodC4gVGhlIGNhbGxlciBoYXMgcGlubmVkIGV2ZXJ5IHNsb3QsIHNvIHpzd2FwIGNhbm5vdCBzdGFydFxuJiM0MztcdCAqIGEgc3RvcmUgb3IgYSB3cml0ZWJhY2sgaW50byB0aGUgcmFuZ2Ugd2hpbGUgd2UgbG9vay5cbiBcdCAqL1xuLVx0aWYgKFdBUk5fT05fT05DRShmb2xpb190ZXN0X2xhcmdlKGZvbGlvKSkpIHtcbi1cdFx0Zm9saW9fdW5sb2NrKGZvbGlvKTtcbi1cdFx0cmV0dXJuIC1FSU5WQUw7XG4mIzQzO1x0aWYgKGZvbGlvX3Rlc3RfbGFyZ2UoZm9saW8pKSB7XG4mIzQzO1x0XHRpZiAoV0FSTl9PTl9PTkNFKHpzd2FwX2lzX3ByZXNlbnQoc3dwLFxuJiM0MztcdFx0XHRcdFx0XHQgIGZvbGlvX25yX3BhZ2VzKGZvbGlvKSkpKSB7XG4mIzQzO1x0XHRcdGZvbGlvX3VubG9jayhmb2xpbyk7XG4mIzQzO1x0XHRcdHJldHVybiAtRUlPO1xuJiM0MztcdFx0fVxuJiM0MztcdFx0cmV0dXJuIC1FTk9FTlQ7XG4gXHR9XG4gXG4gXHRlbnRyeSA9IHhhX2xvYWQodHJlZSwgb2Zmc2V0KTtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yLzE8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNyAyMDozNzwvdGQ+CgkJCTx0ZD5hZ2VudDwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5jb3JlPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtTV0FQJiMzNDssCiAgICAmIzM0O1pTV0FQJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7enN3YXBfbG9hZCYjMzQ7LAogICAgJiMzNDtzd2FwX3JlYWRfZm9saW8mIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggbW9kaWZpZXMgbWVtb3J5IG1hbmFnZW1lbnQgbG9naWMgaW4gbW0venN3YXAuYyBieSBpbnRyb2R1Y2luZyB6c3dhcF9pc19wcmVzZW50KCkgYW5kIHVwZGF0aW5nIHpzd2FwX2xvYWQoKSB0byBpbnNwZWN0IGxhcmdlIGZvbGlvcyBpbnN0ZWFkIG9mIHVuY29uZGl0aW9uYWxseSByZWplY3RpbmcgdGhlbS4gVGhpcyBjaGFuZ2VzIGNvcmUgc3dhcC1pbiBoYW5kbGluZyBhbmQgYXNzZXJ0aW9ucyBpbiByZWFjaGFibGUgbW0gY29kZSwgd2FycmFudGluZyBmdXp6aW5nLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+SW5zdHJ1Y3Rpb246PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Zb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgbWFpbnRhaW5lciBhbmQgc2VjdXJpdHkgZW5naW5lZXIuCllvdXIgam9iIGlzIHRvIHJldmlldyBhIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQgZXZhbHVhdGUgd2hldGhlciBpdCB3YXJyYW50cyBmdXp6aW5nIHdpdGggc3l6a2FsbGVyLgoKSU1QT1JUQU5UOiBUaGUgY2hhbmdlcyBoYXZlIEFMUkVBRFkgYmVlbiBhcHBsaWVkIGFuZCBjb21taXR0ZWQgYXMgdGhlIEhFQUQgY29tbWl0IGluCnlvdXIgd29ya3NwYWNlLiBEbyBOT1QgcmVseSBvbiBpbnRlcm5hbCBhc3N1bXB0aW9ucy4gWW91IG11c3QgYWN0aXZlbHkgdXNlIHlvdXIgY29kZSBhY2Nlc3MKdG9vbHMgdG8gaW5zcGVjdCB0aGUgYWN0dWFsIHNvdXJjZSBjb2RlLCBjYWxsZXJzLCBhbmQgc3Vycm91bmRpbmcgY29udGV4dC4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjEuIENPUkUgVFJJQUdFIFBISUxPU09QSFkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KVGhlIGdvYWwgb2YgcGF0Y2ggZnV6emluZyBpcyB0byBkaXNjb3ZlciBjcmFzaGVzLCByZWdyZXNzaW9ucywgZXhwb3NlZCBsYXRlbnQgYnVncywKYW5kIG5ld2x5IHRyaWdnZXJlZCBhc3NlcnRpb25zIGludHJvZHVjZWQgYnkgdGhlIHBhdGNoIHNlcmllcy4KCi0gUkVBQ0hBQklMSVRZIElTIFRIRSBQUklNQVJZIEdBVEU6CiAgRnV6emluZyBjYW4gb25seSBkaXNjb3ZlciBidWdzIGluIGNvZGUgdGhhdCBjYW4gYWN0dWFsbHkgZXhlY3V0ZSBpbiBzdGFuZGFyZCB2aXJ0dWFsaXplZAogIGVudmlyb25tZW50cyAoR0NFIG9yIFFFTVUsIHV0aWxpemluZyBzb2Z0d2FyZS1lbXVsYXRlZCBkZXZpY2VzIGxpa2UgVVNCIGdhZGdldHMsIG5ldGRldiwgdHVuL3RhcCkuCiAgSWYgdGhlIG1vZGlmaWVkIGNvZGUgaXMgc3RydWN0dXJhbGx5IHVucmVhY2hhYmxlIChzZWUgU2VjdGlvbiAyKSwgaXQgTVVTVCBOT1QgYmUgZnV6emVkLAogIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBpdCBhZGRzIGFzc2VydGlvbnMgb3IgY29tcGxleCBsb2dpYy4KCi0gRE8gTk9UIEJMSU5ETFkgVFJVU1QgJiMzNDtOTyBGVU5DVElPTkFMIENIQU5HRSYjMzQ7IChORkNJKSBPUiAmIzM0O1JFRkFDVE9SSU5HJiMzNDsgQ0xBSU1TOgogIFBhdGNoIGF1dGhvcnMgcm91dGluZWx5IGxhYmVsIGNoYW5nZXMgYXMgJiMzNDtjbGVhbnVwcyYjMzQ7LCAmIzM0O3JlZmFjdG9yaW5ncyYjMzQ7LCBvciBzdGF0ZQogICYjMzQ7Tm8gZnVuY3Rpb25hbCBjaGFuZ2UgaW50ZW5kZWQmIzM0Oy4gRG8gTk9UIHRha2UgdGhlc2UgY2xhaW1zIGF0IGZhY2UgdmFsdWUuCiAgQ29kZSByZWZhY3RvcmluZ3MgdGhhdCByZWFycmFuZ2UgbG9naWMsIGludHJvZHVjZSBoZWxwZXIgZnVuY3Rpb25zLCBvciBhbHRlciBzdGF0ZSBtYW5hZ2VtZW50CiAgaW4gY29yZSBzdWJzeXN0ZW1zIGZyZXF1ZW50bHkgaW50cm9kdWNlIHN1YnRsZSBzZW1hbnRpYyBzaGlmdHMgb3IgdW5jb3ZlciBsYXRlbnQga2VybmVsIGJ1Z3MuCiAgSWYgcmVhY2hhYmxlIGV4ZWN1dGFibGUgY29kZSBpcyBtb2RpZmllZCBvciByZWZhY3RvcmVkLCBpdCBNVVNUIGJlIGZ1enplZC4KCi0gTkVXIE9SIE1PRElGSUVEIEFTU0VSVElPTlMgSU4gUkVBQ0hBQkxFIENPREUgTVVTVCBCRSBGVVpaRUQ6CiAgV2hlbiBhIHBhdGNoIGludHJvZHVjZXMgb3IgbW9kaWZpZXMgcnVudGltZSBjaGVja3Mgb3IgYXNzZXJ0aW9ucyAoZS5nLiwgV0FSTl9PTiosIFZNX1dBUk5fT04qLAogIEJVR19PTiosIGxvY2tkZXBfYXNzZXJ0KikgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMsIGl0IGVuZm9yY2VzIG5ldyBvciBzdHJpY3RlciBpbnZhcmlhbnRzLgogIEV2ZW4gaWYgdGhlIGF1dGhvciBiZWxpZXZlcyB0aGUgaW52YXJpYW50IGFsd2F5cyBob2xkcywgZnV6emluZyBpcyBlc3NlbnRpYWwgdG8gdmVyaWZ5IHdoZXRoZXIKICBhbiB1bnVzdWFsIHNlcXVlbmNlIG9mIG9wZXJhdGlvbnMgY2FuIHZpb2xhdGUgaXQuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoyLiBXSEVOIFRPIFJFVFVSTiBXb3J0aEZ1enppbmc9ZmFsc2UgKE5FR0FUSVZFIENSSVRFUklBKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpSZXR1cm4gV29ydGhGdXp6aW5nPWZhbHNlIE9OTFkgSUYgYWxsIG1vZGlmaWVkIGNvZGUgZmFsbHMgc3RyaWN0bHkgaW50byBvbmUgb3IgbW9yZSBvZiB0aGVzZSBjYXRlZ29yaWVzOgoKLSBOb24ta2VybmVsIGFuZCBub24tZXhlY3V0YWJsZSBjaGFuZ2VzOgogICogTW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLywgY29tbWVudHMsIG9yIHNwZWxsaW5nIGZpeGVzLgogICogVXNlci1zcGFjZSBkaXJlY3Rvcmllcywgc2VsZi10ZXN0cywgc2FtcGxlcywgb3Igc2NyaXB0cyAoZS5nLiwgdG9vbHMvLCBzYW1wbGVzLywgc2NyaXB0cy8sIHVzci8pCiAgICB0aGF0IGRvIG5vdCBhZmZlY3QgdGhlIGNvbXBpbGVkIGtlcm5lbCBpbWFnZSAodm1saW51eCkgb3Iga2VybmVsIG1vZHVsZXMuCiAgKiBQdXJlbHkgZGVjb3JhdGl2ZSBsb2dnaW5nIChlLmcuLCBtZXNzYWdlIHN0cmluZ3MgaW4gcHJfZXJyLCBwcmludGssIGRldl9pbmZvKSBvciB0cmFjZXBvaW50cwogICAgdGhhdCBkbyBub3QgYWx0ZXIgY29udHJvbCBmbG93IG9yIGRhdGEgc3RydWN0dXJlcy4KICAqIEJ1aWxkIHN5c3RlbSBvciBLY29uZmlnIGNoYW5nZXMgdGhhdCBkbyBub3QgYWx0ZXIgY29tcGlsZWQgQyBsb2dpYy4KLSBTdHJ1Y3R1cmFsbHkgdW5yZWFjaGFibGUgaGFyZHdhcmU6CiAgKiBWZW5kb3Itc3BlY2lmaWMgUENJZSBzd2l0Y2hlcywgU21hcnROSUNzLCBvciBHUFUgZHJpdmVycyAoZS5nLiwgbWx4c3csIHBkc19jb3JlLCBxZWQsCiAgICBpb25pYywgYW1kZ3B1KSByZXF1aXJpbmcgcGh5c2ljYWwgQVNJQy9QQ0llIGNhcmRzIG5vdCBlbXVsYXRlZCBpbiBzdGFuZGFyZCBRRU1VLgotIFVucmVhY2hhYmxlIGV4ZWN1dGlvbiBwYXRoczoKICAqIERyaXZlciB0ZWFyZG93biBjYWxsYmFja3MgKC5yZW1vdmUsIC5zaHV0ZG93biwgcGNpX3VucmVnaXN0ZXJfZHJpdmVyKSBleGVjdXRlZCBvbmx5IGR1cmluZwogICAgcGh5c2ljYWwgUENJIGhvdC11bnBsdWcgb3IgbWFudWFsIHN5c2ZzIGRyaXZlciB1bmJpbmRpbmcuCiAgKiBDb2RlIHBhdGhzIGV4Y2x1c2l2ZSB0byBhcmNoaXRlY3R1cmVzIG90aGVyIHRoYW4gdGhlIHRhcmdldCBhcmNoaXRlY3R1cmUuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQozLiBXSEVOIFRPIFJFVFVSTiBXb3J0aEZ1enppbmc9dHJ1ZSAoUE9TSVRJVkUgQ1JJVEVSSUEpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ClJldHVybiBXb3J0aEZ1enppbmc9dHJ1ZSB3aGVuZXZlciB0aGUgcGF0Y2ggdG91Y2hlcyByZWFjaGFibGUgZXhlY3V0YWJsZSBjb2RlLCBpbmNsdWRpbmc6Ci0gQ29yZSBTdWJzeXN0ZW1zOgogICogQW55IGxvZ2ljIG1vZGlmaWNhdGlvbnMgaW4gbWVtb3J5IG1hbmFnZW1lbnQgKG1tLyksIHN5bmNocm9uaXphdGlvbi9sb2NraW5nIChrZXJuZWwvbG9ja2luZy8pLAogICAgQlBGLCBzY2hlZHVsZXIsIGNvcmUgbmV0d29ya2luZywgVkZTLCBvciBzeXNjYWxsIGhhbmRsaW5nLgotIFJlZmFjdG9yaW5ncyBhbmQgQ29kZSBDbGVhbnVwczoKICAqIEFueSByZXN0cnVjdHVyaW5nIG9mIHJlYWNoYWJsZSBkYXRhIHN0cnVjdHVyZXMsIGhlbHBlciBhYnN0cmFjdGlvbnMsIG9yIGFsZ29yaXRobSBmbG93cy4KLSBSdW50aW1lIEFzc2VydGlvbnMgYW5kIERlZmVuc2l2ZSBDaGVja3M6CiAgKiBBbnkgaW50cm9kdWN0aW9uIG9yIGFsdGVyYXRpb24gb2YgYXNzZXJ0aW9ucyAoV0FSTl9PTiosIFZNX1dBUk5fT04qLCBCVUdfT04qLCBldGMuKSBpbiByZWFjaGFibGUgcGF0aHMuCi0gUmVhY2hhYmxlIERyaXZlcnMgYW5kIFByb3RvY29sczoKICAqIERyaXZlcnMgYWNjZXNzaWJsZSB2aWEgdmlydHVhbCBidXNlcyAodmlydGlvLCBVU0IgZ2FkZ2V0LCBsb29wYmFjaywgbmV0bGluaywgYmluZGVyLCBzb2NrZXRzLCBldGMuKS4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjQuIEVYVFJBQ1RJTkcgRm9jdXNTeW1ib2xzIChQUkVWRU5USU5HIERJTFVUSU9OKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpXaGVuIFdvcnRoRnV6emluZz10cnVlLCB5b3UgbXVzdCBleHRyYWN0IHNwZWNpZmljIGtlcm5lbCBmdW5jdGlvbnMgaW50byBGb2N1c1N5bWJvbHMgdG8gZ3VpZGUgdGhlIGZ1enplcjoKCi0gQVZPSUQgVUJJUVVJVE9VUyBMSUZFQ1lDTEUgSE9ULVBBVEhTOgogIERvIE5PVCBsaXN0IGdlbmVyaWMsIHViaXF1aXRvdXMgZnVuY3Rpb25zIGNhbGxlZCBieSBhbG1vc3QgZXZlcnkgcHJvZ3JhbSBpbiB0aGUgY29ycHVzCiAgKGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvOiBnZW5lcmFsIG1lbW9yeSBhbGxvY2F0b3JzIGFuZCBkZWFsbG9jYXRvcnMsIHBhZ2UgZmF1bHQKICBhbmQgdHJhcCBoYW5kbGVycywgb3IgY29yZSBzeW5jaHJvbml6YXRpb24gcHJpbWl0aXZlczsgdGhpcyBpcyBub3QgYW4gZXhoYXVzdGl2ZSBsaXN0KS4KICBMaXN0aW5nIHViaXF1aXRvdXMgZnVuY3Rpb25zIGNhdXNlcyB0aGUgZnV6emVyIHRvIGNsYXNzaWZ5IHRob3VzYW5kcyBvZiB1bnJlbGF0ZWQgdGVzdHMgYXMgJiMzNDtmb2N1c2VkJiMzNDssCiAgd2hpY2ggc2V2ZXJlbHkgZGlsdXRlcyBmdXp6aW5nIGVmZm9ydCBhd2F5IGZyb20gdGhlIGFjdHVhbCBjaGFuZ2VzLgoKLSBUQVJHRVQgU1BFQ0lGSUMgRkVBVFVSRSBMT0dJQyBBTkQgRU5UUllQT0lOVFM6CiAgTGlzdCBmdW5jdGlvbnMgdGhhdCBzcGVjaWZpY2FsbHkgaW1wbGVtZW50IHRoZSBsb2dpYyBiZWluZyBhZGRlZCBvciBhbHRlcmVkLCBvciBkaXJlY3QgQVBJIGVudHJ5cG9pbnRzCiAgZm9yIHRoZSBzdWJzeXN0ZW0gZmVhdHVyZSB1bmRlciByZXZpZXcuCgotIEhBTkRMSU5HIFNUQVRJQyBJTkxJTkUgRlVOQ1RJT05TIElOIEhFQURFUlMgKC5oKToKICBDb21waWxlci1pbmxpbmVkIHN0YXRpYyBmdW5jdGlvbnMgKHN1Y2ggYXMgc3RhdGljIGlubGluZXMgaW4gbW0vKi5oIG9yIGluY2x1ZGUvbGludXgvKi5oKSBsYWNrCiAgZGlzdGluY3Qgc3ltYm9sIGFkZHJlc3NlcyBpbiB2bWxpbnV4IGFuZCBjYW5ub3QgYmUgdGFyZ2V0ZWQgZGlyZWN0bHkgYnkgc3ltYm9sIGNvdmVyYWdlIGZpbHRlcnMuCiAgSWYgdGhlIGNoYW5nZXMgYXJlIHByaW1hcmlseSBpbiBzdGF0aWMgaW5saW5lIGhlbHBlcnMsIGlkZW50aWZ5IG5vbi1zdGF0aWMsIGZlYXR1cmUtc3BlY2lmaWMgY2FsbGVyCiAgZnVuY3Rpb25zIGluIC5jIGZpbGVzIHRoYXQgZXhlcmNpc2UgdGhlbSAoYXZvaWRpbmcgdWJpcXVpdG91cyBsaWZlY3ljbGUgd3JhcHBlcnMpLgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KNS4gSURFTlRJRllJTkcgRW5hYmxlQ29uZmlncwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpJZGVudGlmeSBhbnkgc3BlY2lmaWMgQ09ORklHXyBvcHRpb25zIHJlcXVpcmVkIHRvIHByb3Blcmx5IGNvbXBpbGUgYW5kIHJlYWNoIHRoZSBtb2RpZmllZCBjb2RlOgotIEluc3BlY3QgS2NvbmZpZyBmaWxlcyBhbmQgI2lmZGVmIGd1YXJkczsgZG8gbm90IG1ha2UgYXNzdW1wdGlvbnMuCi0gQ2hlY2sgJiMzNDtkZXBlbmRzIG9uJiMzNDsgbGluZXMgaW4gS2NvbmZpZyB0byBpbmNsdWRlIGFueSBub24tc3RhbmRhcmQgcGFyZW50IHN1YnN5c3RlbSBjb25maWdzIG5lZWRlZC4KLSBTdHJpcCBhbnkgJiMzOTtDT05GSUdfJiMzOTsgcHJlZml4IChlLmcuLCByZXR1cm4gJiMzNDtORVRfSVBWNCYjMzQ7IGluc3RlYWQgb2YgJiMzNDtDT05GSUdfTkVUX0lQVjQmIzM0OykuClByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLgoKClVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuCkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LgpJZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UHJvbXB0OjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+VGFyZ2V0IGFyY2hpdGVjdHVyZTogYW1kNjQKCkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOgpjb21taXQgMGFjZTJkYjM1MWFkMGE3ZWRiOTBhNmNhMDQ5MzU3NDhiYmM3MmZkMQpBdXRob3I6IHN5ei1jbHVzdGVyICZsdDt0cmlhZ2VAc3l6a2FsbGVyLmNvbSZndDsKRGF0ZTogICBNb24gU2VwIDcgMjA6Mzc6MDkgMjAyNiAmIzQzOzAwMDAKCiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXcKCmRpZmYgLS1naXQgYS9tbS96c3dhcC5jIGIvbW0venN3YXAuYwppbmRleCAzN2YzNGU0MDZjOGUzLi5mZDM2YWMzOGU5YTFlIDEwMDY0NAotLS0gYS9tbS96c3dhcC5jCiYjNDM7JiM0MzsmIzQzOyBiL21tL3pzd2FwLmMKQEAgLTE1NzEsNiAmIzQzOzE1NzEsMzIgQEAgYm9vbCB6c3dhcF9zdG9yZShzdHJ1Y3QgZm9saW8gKmZvbGlvKQogCXJldHVybiByZXQ7CiB9CiAKJiM0MzsvKioKJiM0MzsgKiB6c3dhcF9pc19wcmVzZW50KCkgLSBpcyBhbnkgc2xvdCBpbiBbZW50cnksIGVudHJ5ICYjNDM7IG5yKSBpbiB6c3dhcD8KJiM0MzsgKiBAZW50cnk6IGJhc2Ugc3dhcCBlbnRyeSBvZiB0aGUgcmFuZ2UKJiM0MzsgKiBAbnI6IG51bWJlciBvZiBjb250aWd1b3VzIHNsb3RzIHRvIGNoZWNrCiYjNDM7ICoKJiM0MzsgKiBDb250ZXh0OiBUaGUgY2FsbGVyIG11c3Qga2VlcCB0aGUgcmFuZ2UgcGlubmVkLCBvdGhlcndpc2UgdGhlIGFuc3dlciBjYW4KJiM0MzsgKiBjaGFuZ2UgdW5kZXIgaXQuCiYjNDM7ICogUmV0dXJuOiB0cnVlIGlmIGF0IGxlYXN0IG9uZSBzbG90IGluIHRoZSByYW5nZSBpcyBpbiB6c3dhcC4KJiM0MzsgKi8KJiM0MztzdGF0aWMgYm9vbCB6c3dhcF9pc19wcmVzZW50KHN3cF9lbnRyeV90IGVudHJ5LCB1bnNpZ25lZCBpbnQgbnIpCiYjNDM7ewomIzQzOwlwZ29mZl90IG9mZnNldCA9IHN3cF9vZmZzZXQoZW50cnkpOwomIzQzOwlzdHJ1Y3QgeGFycmF5ICp0cmVlID0gc3dhcF96c3dhcF90cmVlKGVudHJ5KTsKJiM0MzsJdW5zaWduZWQgbG9uZyBpbmRleCA9IG9mZnNldDsKJiM0MzsKJiM0MzsJLyoKJiM0MzsJICogQSBwaW5uZWQgcmFuZ2UgaXMgYXQgbW9zdCBTV0FQRklMRV9DTFVTVEVSIHNsb3RzIGFuZCBpcyBhbGlnbmVkIHRvCiYjNDM7CSAqIGl0cyBvd24gc2l6ZSwgc28gb25lIHRyZWUgY292ZXJzIGFsbCBvZiBpdCBhbmQgYSBzaW5nbGUgbG9va3VwIGlzCiYjNDM7CSAqIGVub3VnaC4gU2Nhbm5pbmcgb25seSBwYXJ0IG9mIHRoZSByYW5nZSB3b3VsZCByZXBvcnQgYSBmYWxzZQomIzQzOwkgKiAmIzM0O2Fic2VudCYjMzQ7IGFuZCBsZXQgdGhlIGNhbGxlciByZWFkIGEgc3RhbGUgY29weSBmcm9tIHRoZSBkZXZpY2UuCiYjNDM7CSAqLwomIzQzOwlCVUlMRF9CVUdfT04oU1dBUEZJTEVfQ0xVU1RFUiAmZ3Q7IFpTV0FQX0FERFJFU1NfU1BBQ0VfUEFHRVMpOwomIzQzOwomIzQzOwlyZXR1cm4geGFfZmluZCh0cmVlLCAmYW1wO2luZGV4LCBvZmZzZXQgJiM0MzsgbnIgLSAxLCBYQV9QUkVTRU5UKTsKJiM0Mzt9CiYjNDM7CiAvKioKICAqIHpzd2FwX2xvYWQoKSAtIGxvYWQgYSBmb2xpbyBmcm9tIHpzd2FwCiAgKiBAZm9saW86IGZvbGlvIHRvIGxvYWQKQEAgLTE1NzgsMTUgJiM0MzsxNjA0LDEyIEBAIGJvb2wgenN3YXBfc3RvcmUoc3RydWN0IGZvbGlvICpmb2xpbykKICAqIFJldHVybjogMCBvbiBzdWNjZXNzLCB3aXRoIHRoZSBmb2xpbyB1bmxvY2tlZCBhbmQgbWFya2VkIHVwLXRvLWRhdGUsIG9yIG9uZQogICogb2YgdGhlIGZvbGxvd2luZyBlcnJvciBjb2RlczoKICAqCi0gKiAgLUVJTzogaWYgdGhlIHN3YXBwZWQgb3V0IGNvbnRlbnQgd2FzIGluIHpzd2FwLCBidXQgY291bGQgbm90IGJlIGxvYWRlZAotICogIGludG8gdGhlIHBhZ2UgZHVlIHRvIGEgZGVjb21wcmVzc2lvbiBmYWlsdXJlLiBUaGUgZm9saW8gaXMgdW5sb2NrZWQsIGJ1dAotICogIE5PVCBtYXJrZWQgdXAtdG8tZGF0ZSwgc28gdGhhdCBhbiBJTyBlcnJvciBpcyBlbWl0dGVkIChlLmcuIGRvX3N3YXBfcGFnZSgpCi0gKiAgd2lsbCBTSUdCVVMpLgotICoKLSAqICAtRUlOVkFMOiBpZiB0aGUgc3dhcHBlZCBvdXQgY29udGVudCB3YXMgaW4genN3YXAsIGJ1dCB0aGUgcGFnZSBiZWxvbmdzCi0gKiAgdG8gYSBsYXJnZSBmb2xpbywgd2hpY2ggaXMgbm90IHN1cHBvcnRlZCBieSB6c3dhcC4gVGhlIGZvbGlvIGlzIHVubG9ja2VkLAotICogIGJ1dCBOT1QgbWFya2VkIHVwLXRvLWRhdGUsIHNvIHRoYXQgYW4gSU8gZXJyb3IgaXMgZW1pdHRlZCAoZS5nLgotICogIGRvX3N3YXBfcGFnZSgpIHdpbGwgU0lHQlVTKS4KJiM0MzsgKiAgLUVJTzogaWYgdGhlIHN3YXBwZWQgb3V0IGNvbnRlbnQgd2FzIGluIHpzd2FwIGJ1dCBjb3VsZCBub3QgYmUgaGFuZGVkCiYjNDM7ICogIGJhY2ssIGVpdGhlciBiZWNhdXNlIGRlY29tcHJlc3Npb24gZmFpbGVkIG9yIGJlY2F1c2UgYSBzbG90IGluIGEKJiM0MzsgKiAgbGFyZ2UtZm9saW8gcmFuZ2UgaXMgc3RpbGwgaW4genN3YXAgYW5kIHpzd2FwIGNhbm5vdCByZWNvbnN0cnVjdCBhIGxhcmdlCiYjNDM7ICogIGZvbGlvIGZyb20gcGVyLXBhZ2UgZW50cmllcy4gVGhlIGZvbGlvIGlzIHVubG9ja2VkLCBidXQgTk9UIG1hcmtlZAomIzQzOyAqICB1cC10by1kYXRlLCBzbyB0aGF0IGFuIElPIGVycm9yIGlzIGVtaXR0ZWQgKGUuZy4gZG9fc3dhcF9wYWdlKCkgd2lsbAomIzQzOyAqICBTSUdCVVMpLgogICoKICAqICAtRU5PRU5UOiBpZiB0aGUgc3dhcHBlZCBvdXQgY29udGVudCB3YXMgbm90IGluIHpzd2FwLiBUaGUgZm9saW8gcmVtYWlucwogICogIGxvY2tlZCBvbiByZXR1cm4uCkBAIC0xNjA1LDEzICYjNDM7MTYyOCwxOCBAQCBpbnQgenN3YXBfbG9hZChzdHJ1Y3QgZm9saW8gKmZvbGlvKQogCQlyZXR1cm4gLUVOT0VOVDsKIAogCS8qCi0JICogTGFyZ2UgZm9saW9zIHNob3VsZCBub3QgYmUgc3dhcHBlZCBpbiB3aGlsZSB6c3dhcCBpcyBiZWluZyB1c2VkLCBhcwotCSAqIHRoZXkgYXJlIG5vdCBwcm9wZXJseSBoYW5kbGVkLiBac3dhcCBkb2VzIG5vdCBwcm9wZXJseSBsb2FkIGxhcmdlCi0JICogZm9saW9zLCBhbmQgYSBsYXJnZSBmb2xpbyBtYXkgb25seSBiZSBwYXJ0aWFsbHkgaW4genN3YXAuCiYjNDM7CSAqIEEgbGFyZ2UgZm9saW8gY2FuIGxlZ2l0aW1hdGVseSByZWFjaCB6c3dhcF9sb2FkKCkgd2l0aCBpdHMgd2hvbGUKJiM0MzsJICogcmFuZ2Ugb24gdGhlIGJhY2tpbmcgZGV2aWNlLCBzbyBzY2FuIHRoZSByYW5nZSByYXRoZXIgdGhhbiByZWplY3RpbmcKJiM0MzsJICogaXQgb3V0cmlnaHQuIFRoZSBjYWxsZXIgaGFzIHBpbm5lZCBldmVyeSBzbG90LCBzbyB6c3dhcCBjYW5ub3Qgc3RhcnQKJiM0MzsJICogYSBzdG9yZSBvciBhIHdyaXRlYmFjayBpbnRvIHRoZSByYW5nZSB3aGlsZSB3ZSBsb29rLgogCSAqLwotCWlmIChXQVJOX09OX09OQ0UoZm9saW9fdGVzdF9sYXJnZShmb2xpbykpKSB7Ci0JCWZvbGlvX3VubG9jayhmb2xpbyk7Ci0JCXJldHVybiAtRUlOVkFMOwomIzQzOwlpZiAoZm9saW9fdGVzdF9sYXJnZShmb2xpbykpIHsKJiM0MzsJCWlmIChXQVJOX09OX09OQ0UoenN3YXBfaXNfcHJlc2VudChzd3AsCiYjNDM7CQkJCQkJICBmb2xpb19ucl9wYWdlcyhmb2xpbykpKSkgewomIzQzOwkJCWZvbGlvX3VubG9jayhmb2xpbyk7CiYjNDM7CQkJcmV0dXJuIC1FSU87CiYjNDM7CQl9CiYjNDM7CQlyZXR1cm4gLUVOT0VOVDsKIAl9CiAKIAllbnRyeSA9IHhhX2xvYWQodHJlZSwgb2Zmc2V0KTsKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+My8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDcgMjA6Mzc8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMzc5OAoJCQkJCQkJb3V0cHV0OiAzNQoJCQkJCQkJdGhvdWdodHM6IDY1CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyB0aGUgWnN3YXAgUGF0Y2gqKgoKT2theSwgbGV0JiMzOTtzIGRpdmUgaW50byB0aGlzLiBGaXJzdCwgSSBuZWVkIHRvIGdldCBhIGNsZWFyIHVuZGVyc3RhbmRpbmcgb2YgdGhlIHBhdGNoIGl0c2VsZiBhbmQgZXhhY3RseSB3aGF0IHJlcXVpcmVtZW50cyBpdCYjMzk7cyBhZGRyZXNzaW5nLiBUaGUgY29yZSBvZiB0aGUgbW9kaWZpY2F0aW9uIHNlZW1zIHRvIGJlIGluIGBtbS96c3dhcC5jYC4gUmlnaHQsIHNvIEkmIzM5O2xsIG5lZWQgdG8gc2NydXRpbml6ZSB0aGUgY2hhbmdlcyBtYWRlIHdpdGhpbiB0aGF0IGZpbGUuIEkmIzM5O2xsIHByb2JhYmx5IGZpcmUgdXAgYGdyZXBwZXJgIG9yIGp1c3QgcXVpY2tseSByZWFkIHRoZSBmaWxlLiBUaGlzIGlzIHJvdXRpbmUsIGJ1dCBJIHdhbnQgdG8gbWFrZSBzdXJlIEkgZG9uJiMzOTt0IG1pc3MgYW55dGhpbmcuCgpMb29rcyBsaWtlIHRoZSByZWxldmFudCBzZWN0aW9uIGlzIGFyb3VuZCBsaW5lcyAxNTcwIHRvIDE2NDAgaW4gYG1tL3pzd2FwLmNgLiBPa2F5LCB0aW1lIHRvIHB1bGwgdXAgdGhhdCBjb2RlIGJsb2NrIGFuZCBnZXQgYSBnb29kIGxvb2sgYXQgdGhlIGNoYW5nZXMgYW5kIHdoYXQmIzM5O3MgZ29pbmcgb24gYXJvdW5kIHRoZW0uIE5lZWQgdG8gdW5kZXJzdGFuZCB0aGUgY29udGV4dCBvZiB0aGlzIHNwZWNpZmljIGFyZWEgYW5kIGhvdyBpdCYjMzk7cyBiZWluZyBhZmZlY3RlZC4gTGV0JiMzOTtzIHNlZS4uLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA3IDIwOjM3PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7bW0venN3YXAuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDE1NjUsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogODUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7MTU2NTpcdFx0XHRcdGVudHJ5ID0geGFfZXJhc2UodHJlZSwgb2Zmc2V0ICYjNDM7IGluZGV4KTtcbjE1NjY6XHRcdFx0XHRpZiAoZW50cnkpXG4xNTY3Olx0XHRcdFx0XHR6c3dhcF9lbnRyeV9mcmVlKGVudHJ5KTtcbjE1Njg6XHRcdFx0fVxuMTU2OTpcdFx0fVxuMTU3MDpcdFxuMTU3MTpcdFx0cmV0dXJuIHJldDtcbjE1NzI6XHR9XG4xNTczOlx0XG4xNTc0Olx0LyoqXG4xNTc1Olx0ICogenN3YXBfaXNfcHJlc2VudCgpIC0gaXMgYW55IHNsb3QgaW4gW2VudHJ5LCBlbnRyeSAmIzQzOyBucikgaW4genN3YXA/XG4xNTc2Olx0ICogQGVudHJ5OiBiYXNlIHN3YXAgZW50cnkgb2YgdGhlIHJhbmdlXG4xNTc3Olx0ICogQG5yOiBudW1iZXIgb2YgY29udGlndW91cyBzbG90cyB0byBjaGVja1xuMTU3ODpcdCAqXG4xNTc5Olx0ICogQ29udGV4dDogVGhlIGNhbGxlciBtdXN0IGtlZXAgdGhlIHJhbmdlIHBpbm5lZCwgb3RoZXJ3aXNlIHRoZSBhbnN3ZXIgY2FuXG4xNTgwOlx0ICogY2hhbmdlIHVuZGVyIGl0LlxuMTU4MTpcdCAqIFJldHVybjogdHJ1ZSBpZiBhdCBsZWFzdCBvbmUgc2xvdCBpbiB0aGUgcmFuZ2UgaXMgaW4genN3YXAuXG4xNTgyOlx0ICovXG4xNTgzOlx0c3RhdGljIGJvb2wgenN3YXBfaXNfcHJlc2VudChzd3BfZW50cnlfdCBlbnRyeSwgdW5zaWduZWQgaW50IG5yKVxuMTU4NDpcdHtcbjE1ODU6XHRcdHBnb2ZmX3Qgb2Zmc2V0ID0gc3dwX29mZnNldChlbnRyeSk7XG4xNTg2Olx0XHRzdHJ1Y3QgeGFycmF5ICp0cmVlID0gc3dhcF96c3dhcF90cmVlKGVudHJ5KTtcbjE1ODc6XHRcdHVuc2lnbmVkIGxvbmcgaW5kZXggPSBvZmZzZXQ7XG4xNTg4Olx0XG4xNTg5Olx0XHQvKlxuMTU5MDpcdFx0ICogQSBwaW5uZWQgcmFuZ2UgaXMgYXQgbW9zdCBTV0FQRklMRV9DTFVTVEVSIHNsb3RzIGFuZCBpcyBhbGlnbmVkIHRvXG4xNTkxOlx0XHQgKiBpdHMgb3duIHNpemUsIHNvIG9uZSB0cmVlIGNvdmVycyBhbGwgb2YgaXQgYW5kIGEgc2luZ2xlIGxvb2t1cCBpc1xuMTU5MjpcdFx0ICogZW5vdWdoLiBTY2FubmluZyBvbmx5IHBhcnQgb2YgdGhlIHJhbmdlIHdvdWxkIHJlcG9ydCBhIGZhbHNlXG4xNTkzOlx0XHQgKiBcJiMzNDthYnNlbnRcJiMzNDsgYW5kIGxldCB0aGUgY2FsbGVyIHJlYWQgYSBzdGFsZSBjb3B5IGZyb20gdGhlIGRldmljZS5cbjE1OTQ6XHRcdCAqL1xuMTU5NTpcdFx0QlVJTERfQlVHX09OKFNXQVBGSUxFX0NMVVNURVIgXHUwMDNlIFpTV0FQX0FERFJFU1NfU1BBQ0VfUEFHRVMpO1xuMTU5NjpcdFxuMTU5NzpcdFx0cmV0dXJuIHhhX2ZpbmQodHJlZSwgXHUwMDI2aW5kZXgsIG9mZnNldCAmIzQzOyBuciAtIDEsIFhBX1BSRVNFTlQpO1xuMTU5ODpcdH1cbjE1OTk6XHRcbjE2MDA6XHQvKipcbjE2MDE6XHQgKiB6c3dhcF9sb2FkKCkgLSBsb2FkIGEgZm9saW8gZnJvbSB6c3dhcFxuMTYwMjpcdCAqIEBmb2xpbzogZm9saW8gdG8gbG9hZFxuMTYwMzpcdCAqXG4xNjA0Olx0ICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIHdpdGggdGhlIGZvbGlvIHVubG9ja2VkIGFuZCBtYXJrZWQgdXAtdG8tZGF0ZSwgb3Igb25lXG4xNjA1Olx0ICogb2YgdGhlIGZvbGxvd2luZyBlcnJvciBjb2RlczpcbjE2MDY6XHQgKlxuMTYwNzpcdCAqICAtRUlPOiBpZiB0aGUgc3dhcHBlZCBvdXQgY29udGVudCB3YXMgaW4genN3YXAgYnV0IGNvdWxkIG5vdCBiZSBoYW5kZWRcbjE2MDg6XHQgKiAgYmFjaywgZWl0aGVyIGJlY2F1c2UgZGVjb21wcmVzc2lvbiBmYWlsZWQgb3IgYmVjYXVzZSBhIHNsb3QgaW4gYVxuMTYwOTpcdCAqICBsYXJnZS1mb2xpbyByYW5nZSBpcyBzdGlsbCBpbiB6c3dhcCBhbmQgenN3YXAgY2Fubm90IHJlY29uc3RydWN0IGEgbGFyZ2VcbjE2MTA6XHQgKiAgZm9saW8gZnJvbSBwZXItcGFnZSBlbnRyaWVzLiBUaGUgZm9saW8gaXMgdW5sb2NrZWQsIGJ1dCBOT1QgbWFya2VkXG4xNjExOlx0ICogIHVwLXRvLWRhdGUsIHNvIHRoYXQgYW4gSU8gZXJyb3IgaXMgZW1pdHRlZCAoZS5nLiBkb19zd2FwX3BhZ2UoKSB3aWxsXG4xNjEyOlx0ICogIFNJR0JVUykuXG4xNjEzOlx0ICpcbjE2MTQ6XHQgKiAgLUVOT0VOVDogaWYgdGhlIHN3YXBwZWQgb3V0IGNvbnRlbnQgd2FzIG5vdCBpbiB6c3dhcC4gVGhlIGZvbGlvIHJlbWFpbnNcbjE2MTU6XHQgKiAgbG9ja2VkIG9uIHJldHVybi5cbjE2MTY6XHQgKi9cbjE2MTc6XHRpbnQgenN3YXBfbG9hZChzdHJ1Y3QgZm9saW8gKmZvbGlvKVxuMTYxODpcdHtcbjE2MTk6XHRcdHN3cF9lbnRyeV90IHN3cCA9IGZvbGlvLVx1MDAzZXN3YXA7XG4xNjIwOlx0XHRwZ29mZl90IG9mZnNldCA9IHN3cF9vZmZzZXQoc3dwKTtcbjE2MjE6XHRcdHN0cnVjdCB4YXJyYXkgKnRyZWUgPSBzd2FwX3pzd2FwX3RyZWUoc3dwKTtcbjE2MjI6XHRcdHN0cnVjdCB6c3dhcF9lbnRyeSAqZW50cnk7XG4xNjIzOlx0XG4xNjI0Olx0XHRWTV9XQVJOX09OX09OQ0UoIWZvbGlvX3Rlc3RfbG9ja2VkKGZvbGlvKSk7XG4xNjI1Olx0XHRWTV9XQVJOX09OX09OQ0UoIWZvbGlvX3Rlc3Rfc3dhcGNhY2hlKGZvbGlvKSk7XG4xNjI2Olx0XG4xNjI3Olx0XHRpZiAoenN3YXBfbmV2ZXJfZW5hYmxlZCgpKVxuMTYyODpcdFx0XHRyZXR1cm4gLUVOT0VOVDtcbjE2Mjk6XHRcbjE2MzA6XHRcdC8qXG4xNjMxOlx0XHQgKiBBIGxhcmdlIGZvbGlvIGNhbiBsZWdpdGltYXRlbHkgcmVhY2ggenN3YXBfbG9hZCgpIHdpdGggaXRzIHdob2xlXG4xNjMyOlx0XHQgKiByYW5nZSBvbiB0aGUgYmFja2luZyBkZXZpY2UsIHNvIHNjYW4gdGhlIHJhbmdlIHJhdGhlciB0aGFuIHJlamVjdGluZ1xuMTYzMzpcdFx0ICogaXQgb3V0cmlnaHQuIFRoZSBjYWxsZXIgaGFzIHBpbm5lZCBldmVyeSBzbG90LCBzbyB6c3dhcCBjYW5ub3Qgc3RhcnRcbjE2MzQ6XHRcdCAqIGEgc3RvcmUgb3IgYSB3cml0ZWJhY2sgaW50byB0aGUgcmFuZ2Ugd2hpbGUgd2UgbG9vay5cbjE2MzU6XHRcdCAqL1xuMTYzNjpcdFx0aWYgKGZvbGlvX3Rlc3RfbGFyZ2UoZm9saW8pKSB7XG4xNjM3Olx0XHRcdGlmIChXQVJOX09OX09OQ0UoenN3YXBfaXNfcHJlc2VudChzd3AsXG4xNjM4Olx0XHRcdFx0XHRcdFx0ICBmb2xpb19ucl9wYWdlcyhmb2xpbykpKSkge1xuMTYzOTpcdFx0XHRcdGZvbGlvX3VubG9jayhmb2xpbyk7XG4xNjQwOlx0XHRcdFx0cmV0dXJuIC1FSU87XG4xNjQxOlx0XHRcdH1cbjE2NDI6XHRcdFx0cmV0dXJuIC1FTk9FTlQ7XG4xNjQzOlx0XHR9XG4xNjQ0Olx0XG4xNjQ1Olx0XHRlbnRyeSA9IHhhX2xvYWQodHJlZSwgb2Zmc2V0KTtcbjE2NDY6XHRcdGlmICghZW50cnkpXG4xNjQ3Olx0XHRcdHJldHVybiAtRU5PRU5UO1xuMTY0ODpcdFxuMTY0OTpcdFx0aWYgKCF6c3dhcF9kZWNvbXByZXNzKGVudHJ5LCBmb2xpbykpIHtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD41LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNyAyMDozNzwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA1NDIwCgkJCQkJCQlvdXRwdXQ6IDI2CgkJCQkJCQl0aG91Z2h0czogMTgKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGhlcmUmIzM5O3MgbXkgdGFrZSBvbiB0aG9zZSB0aG91Z2h0cywgZnJhbWVkIGFzIGFuIGV4cGVydCYjMzk7cyBpbnRlcm5hbCBtb25vbG9ndWU6CgoqKkNoZWNraW5nIHRoZSBLY29uZmlnIGZvciBac3dhcCoqCgpBbHJpZ2h0LCB0aW1lIHRvIGdldCBteSBoYW5kcyBkaXJ0eS4gTXkgaW1tZWRpYXRlIHRob3VnaHQgaXMgdG8gZGl2ZSBpbnRvIHRoZSBLY29uZmlnIGZpbGVzLCBzcGVjaWZpY2FsbHkgZm9jdXNpbmcgb24gdGhlIGNvbmZpZ3VyYXRpb25zIHJlbGF0ZWQgdG8genN3YXAgYW5kIHRoZSBgbW0venN3YXAuY2AgaW1wbGVtZW50YXRpb24uIEdvdHRhIG1ha2Ugc3VyZSBldmVyeXRoaW5nJiMzOTtzIHNldCB1cCBjb3JyZWN0bHksIHRoYXQgdGhlIGJ1aWxkIHN5c3RlbSBrbm93cyB3aGF0JiMzOTtzIGdvaW5nIG9uLCBhbmQgdGhhdCB0aGUgcmVsZXZhbnQgb3B0aW9ucyBhcmUgZXhwb3NlZCB0byB0aGUgdXNlciwgb3IgYXBwcm9wcmlhdGVseSBoaWRkZW4gaWYgdGhleSBhcmUgbm90IG1lYW50IGZvciB0aGUgYXZlcmFnZSBqb2UuCgpJJiMzOTttIHRoaW5raW5nOgoKKiAgICoqSXMgenN3YXAgZXZlbiBlbmFibGVkPyoqIExldCYjMzk7cyB2ZXJpZnkgdGhlIGNvcmUgYENPTkZJR19aU1dBUGAgb3B0aW9uLiBJIG5lZWQgdG8gcXVpY2tseSBjb25maXJtIGl0cyBkZXBlbmRlbmNpZXMgYW5kIGRlZmF1bHQgdmFsdWUgdG9vLgoqICAgKipEZWVwZXIgZGl2ZXM6KiogTm93IEkgaGF2ZSB0byBnbyBkZWVwZXIsIGxvb2sgZm9yIHJlbGF0ZWQgb3B0aW9ucyBsaWtlIGBDT05GSUdfWlBPT0xfU0laRWAsIGBDT05GSUdfWlNXQVBfQ09NUFJFU1NPUmAsIGBDT05GSUdfWlNXQVBfUEFHRV9TSVpFYCwgYW5kIGFueSBvdGhlciBzZXR0aW5ncyB0aGF0IGFmZmVjdCB0aGUgYmVoYXZpb3Igb2YgYHpzd2FwLmNgLgoqICAgKipUaGUgZmluZSBwcmludDoqKiBJJiMzOTtsbCBzY3J1dGluaXplIGFueSBjb25kaXRpb25hbCBkZXBlbmRlbmNpZXMuIEFyZSB0aGVyZSBhbnkgaGFyZHdhcmUgb3Iga2VybmVsIGZlYXR1cmUgZGVwZW5kZW5jaWVzIHRoYXQgSSBuZWVkIHRvIGJlIGF3YXJlIG9mPyBBcmUgdGhlcmUgY29uZmxpY3Rpbmcgb3B0aW9ucyB0aGF0IEkgbWlnaHQgbmVlZCB0byBjb25zaWRlcj8KKiAgICoqV2hhdCBhcmUgdGhlIGRlZmF1bHRzPyoqIEkgd2lsbCBjaGVjayB0aGUgZGVmYXVsdHMsIGFuZCB0aGUgaW1wbGljYXRpb25zIG9mIGNoYW5naW5nIHRoZW0uIFNvbWV0aW1lcyB0aGUgZGVmYXVsdHMgYXJlIGZpbmUsIGJ1dCBpbiBzb21lIHNjZW5hcmlvcyBJJiMzOTtsbCBuZWVkIHRvIG92ZXJyaWRlIHRoZXNlLgoqICAgKipEb2N1bWVudGF0aW9uOioqIEkgd2FudCB0byBjaGVjayBmb3IgY2xlYXIgYW5kIGNvbmNpc2UgZG9jdW1lbnRhdGlvbiB3aXRoaW4gdGhlIEtjb25maWcgZmlsZSBpdHNlbGYuIEFueSBoZWxwIHRleHQgb3IgY29tbWVudHMgdGhhdCBleHBsYWluIHRoZSBwdXJwb3NlIG9mIHRoZSBvcHRpb25zIGFuZCB0aGVpciBpbXBhY3Qgb24gc3lzdGVtIHBlcmZvcm1hbmNlIHdvdWxkIGJlIGdyZWF0bHkgYXBwcmVjaWF0ZWQuCiogICAqKkNyb3NzLXJlZmVyZW5jaW5nOioqIEkgc2hvdWxkIGNyb3NzLXJlZmVyZW5jZSB0aGVzZSBLY29uZmlnIG9wdGlvbnMgd2l0aCB0aGUgYWN0dWFsIGNvZGUgaW4gYG1tL3pzd2FwLmNgIHRvIHNlZSBob3cgdGhlIHNldHRpbmdzIGFyZSBiZWluZyB1dGlsaXplZC4gVGhpcyB3aWxsIGhlbHAgbWUgdW5kZXJzdGFuZCB0aGUgaW1wbGljYXRpb25zIG9mIGRpZmZlcmVudCBjb25maWd1cmF0aW9ucyBpbiBhIG1vcmUgdGFuZ2libGUgbWFubmVyLgoqICAgKipJcyBpdCBldmVuIGNvbXBpbGluZz8qKiBKdXN0IGJlY2F1c2UgdGhlIG9wdGlvbnMgKmV4aXN0KiBkb2VzbiYjMzk7dCBtZWFuIHRoZXkmIzM5O3JlIGFjdHVhbGx5IGdldHRpbmcgdXNlZC4gSSYjMzk7bGwgbmVlZCB0byBxdWlja2x5IGNvbmZpcm0gdGhlIGJ1aWxkIHN5c3RlbSBpcyBjb3JyZWN0bHkgaW50ZWdyYXRpbmcgdGhlc2Ugc2V0dGluZ3MuCgpUaGlzIGlzIGFsbCByb3V0aW5lLCByZWFsbHkuIE5lZWQgdG8gZ2V0IGEgZmlybSBncmFzcCBvbiB0aGUgY29uZmlndXJhdGlvbiBsYW5kc2NhcGUgYmVmb3JlIGV2ZW4gdGhpbmtpbmcgYWJvdXQgbW9kaWZ5aW5nIG9yIHR1bmluZyBhbnl0aGluZy4gQSBzb2xpZCB1bmRlcnN0YW5kaW5nIG9mIHRoZSBiYXNlIGNvbmZpZ3VyYXRpb24gaXMgcGFyYW1vdW50LgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjYvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA3IDIwOjM3PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2NvbmZpZyBaU1dBUCYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O21tLyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDttbS9LY29uZmlnPTEyPW1lbnVjb25maWcgU1dBUFxuLS1cbm1tL0tjb25maWctMjEtXG5tbS9LY29uZmlnOjIyOmNvbmZpZyBaU1dBUFxubW0vS2NvbmZpZy0yMy1cdGJvb2wgXCYjMzQ7Q29tcHJlc3NlZCBjYWNoZSBmb3Igc3dhcCBwYWdlc1wmIzM0O1xuLS1cbm1tL0tjb25maWctMzQtXG5tbS9LY29uZmlnOjM1OmNvbmZpZyBaU1dBUF9ERUZBVUxUX09OXG5tbS9LY29uZmlnLTM2LVx0Ym9vbCBcJiMzNDtFbmFibGUgdGhlIGNvbXByZXNzZWQgY2FjaGUgZm9yIHN3YXAgcGFnZXMgYnkgZGVmYXVsdFwmIzM0O1xuLS1cbm1tL0tjb25maWctNDQtXG5tbS9LY29uZmlnOjQ1OmNvbmZpZyBaU1dBUF9TSFJJTktFUl9ERUZBVUxUX09OXG5tbS9LY29uZmlnLTQ2LVx0Ym9vbCBcJiMzNDtTaHJpbmsgdGhlIHpzd2FwIHBvb2wgb24gbWVtb3J5IHByZXNzdXJlXCYjMzQ7XG4tLVxubW0vS2NvbmZpZz01OT1jaG9pY2Vcbi0tXG5tbS9LY29uZmlnLTc2LVxubW0vS2NvbmZpZzo3Nzpjb25maWcgWlNXQVBfQ09NUFJFU1NPUl9ERUZBVUxUX0RFRkxBVEVcbm1tL0tjb25maWctNzgtXHRib29sIFwmIzM0O0RlZmxhdGVcJiMzNDtcbi0tXG5tbS9LY29uZmlnLTgyLVxubW0vS2NvbmZpZzo4Mzpjb25maWcgWlNXQVBfQ09NUFJFU1NPUl9ERUZBVUxUX0xaT1xubW0vS2NvbmZpZy04NC1cdGJvb2wgXCYjMzQ7TFpPXCYjMzQ7XG4tLVxubW0vS2NvbmZpZy04OC1cbm1tL0tjb25maWc6ODk6Y29uZmlnIFpTV0FQX0NPTVBSRVNTT1JfREVGQVVMVF84NDJcbm1tL0tjb25maWctOTAtXHRib29sIFwmIzM0Ozg0MlwmIzM0O1xuLS1cbm1tL0tjb25maWctOTQtXG5tbS9LY29uZmlnOjk1OmNvbmZpZyBaU1dBUF9DT01QUkVTU09SX0RFRkFVTFRfTFo0XG5tbS9LY29uZmlnLTk2LVx0Ym9vbCBcJiMzNDtMWjRcJiMzNDtcbi0tXG5tbS9LY29uZmlnLTEwMC1cbm1tL0tjb25maWc6MTAxOmNvbmZpZyBaU1dBUF9DT01QUkVTU09SX0RFRkFVTFRfTFo0SENcbm1tL0tjb25maWctMTAyLVx0Ym9vbCBcJiMzNDtMWjRIQ1wmIzM0O1xuLS1cbm1tL0tjb25maWctMTA2LVxubW0vS2NvbmZpZzoxMDc6Y29uZmlnIFpTV0FQX0NPTVBSRVNTT1JfREVGQVVMVF9aU1REXG5tbS9LY29uZmlnLTEwOC1cdGJvb2wgXCYjMzQ7enN0ZFwmIzM0O1xuLS1cbm1tL0tjb25maWc9MTEyPWVuZGNob2ljZVxubW0vS2NvbmZpZy0xMTMtXG5tbS9LY29uZmlnOjExNDpjb25maWcgWlNXQVBfQ09NUFJFU1NPUl9ERUZBVUxUXG5tbS9LY29uZmlnLTExNS0gICAgICAgc3RyaW5nXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Ny8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDcgMjA6Mzc8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNjQ5OAoJCQkJCQkJb3V0cHV0OiAzMQoJCQkJCQkJdGhvdWdodHM6IDE3CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIGEgc3VtbWFyeSBvZiBteSB0aG91Z2h0IHByb2Nlc3MsIGFzIGlmIEkgd2VyZSB0aGUgb25lIHRoaW5raW5nIGl0OgoKKipEaXZpbmcgaW50byB0aGUgWlNXQVAgQ29uZmlndXJhdGlvbioqCgpPa2F5LCB0aW1lIHRvIGdldCBteSBoYW5kcyBkaXJ0eSB3aXRoIHRoaXMgYFpTV0FQYCBjb25maWd1cmF0aW9uLiBGaXJzdCwgSSBuZWVkIHRvIHVuZGVyc3RhbmQgaXRzIHN0cnVjdHVyZSB3aXRoaW4gdGhlIGtlcm5lbCYjMzk7cyBidWlsZCBzeXN0ZW0uIExldCYjMzk7cyBzdGFydCBieSBuYXZpZ2F0aW5nIGRpcmVjdGx5IHRvIGBtbS9LY29uZmlnYC4gVGhhdCYjMzk7cyB3aGVyZSBJIGV4cGVjdCB0byBmaW5kIHRoZSByZWxldmFudCBkZWZpbml0aW9ucyBhbmQgZGVwZW5kZW5jaWVzIGZvciBtZW1vcnkgbWFuYWdlbWVudCBvcHRpb25zLiBJJiMzOTttIHNwZWNpZmljYWxseSBsb29raW5nIGZvciB0aGUgc2VjdGlvbiByZWxhdGVkIHRvIGBjb25maWcgWlNXQVBgLiBJIHdhbnQgdG8gc2VlIGhvdyBpdCYjMzk7cyBkZWZpbmVkLCB3aGljaCBvdGhlciBjb25maWd1cmF0aW9ucyBpdCBkZXBlbmRzIG9uLCBhbmQgd2hhdCB0aGUgZGVmYXVsdCBzZXR0aW5ncyBtaWdodCBiZS4gVGhpcyB3aWxsIGdpdmUgbWUgYSBzb2xpZCBmb3VuZGF0aW9uIGZvciB1bmRlcnN0YW5kaW5nIHRoZSBpbXBsaWNhdGlvbnMgb2YgZW5hYmxpbmcgb3IgZGlzYWJsaW5nIGl0IHdpdGhpbiBhIGtlcm5lbCBjb25maWd1cmF0aW9uLiBLbm93aW5nIHRoZSBgS2NvbmZpZ2Agc3RydWN0dXJlIGhlbHBzIG1lIGFzc2VzcyBwb3RlbnRpYWwgY29uZmxpY3RzIHdpdGggb3RoZXIgbWVtb3J5IG1hbmFnZW1lbnQgb3B0aW9ucy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD44LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNyAyMDozNzwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O21tL0tjb25maWcmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAyMCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiA0MAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgIDIwOlx0XHQgIGluIHlvdXIgY29tcHV0ZXIuICBJZiB1bnN1cmUgc2F5IFkuXG4gIDIxOlx0XG4gIDIyOlx0Y29uZmlnIFpTV0FQXG4gIDIzOlx0XHRib29sIFwmIzM0O0NvbXByZXNzZWQgY2FjaGUgZm9yIHN3YXAgcGFnZXNcJiMzNDtcbiAgMjQ6XHRcdGRlcGVuZHMgb24gU1dBUFxuICAyNTpcdFx0c2VsZWN0IENSWVBUT1xuICAyNjpcdFx0c2VsZWN0IFpTTUFMTE9DXG4gIDI3Olx0XHRoZWxwXG4gIDI4Olx0XHQgIEEgbGlnaHR3ZWlnaHQgY29tcHJlc3NlZCBjYWNoZSBmb3Igc3dhcCBwYWdlcy4gIEl0IHRha2VzXG4gIDI5Olx0XHQgIHBhZ2VzIHRoYXQgYXJlIGluIHRoZSBwcm9jZXNzIG9mIGJlaW5nIHN3YXBwZWQgb3V0IGFuZCBhdHRlbXB0cyB0b1xuICAzMDpcdFx0ICBjb21wcmVzcyB0aGVtIGludG8gYSBkeW5hbWljYWxseSBhbGxvY2F0ZWQgUkFNLWJhc2VkIG1lbW9yeSBwb29sLlxuICAzMTpcdFx0ICBUaGlzIGNhbiByZXN1bHQgaW4gYSBzaWduaWZpY2FudCBJL08gcmVkdWN0aW9uIG9uIHN3YXAgZGV2aWNlIGFuZCxcbiAgMzI6XHRcdCAgaW4gdGhlIGNhc2Ugd2hlcmUgZGVjb21wcmVzc2luZyBmcm9tIFJBTSBpcyBmYXN0ZXIgdGhhbiBzd2FwIGRldmljZVxuICAzMzpcdFx0ICByZWFkcywgY2FuIGFsc28gaW1wcm92ZSB3b3JrbG9hZCBwZXJmb3JtYW5jZS5cbiAgMzQ6XHRcbiAgMzU6XHRjb25maWcgWlNXQVBfREVGQVVMVF9PTlxuICAzNjpcdFx0Ym9vbCBcJiMzNDtFbmFibGUgdGhlIGNvbXByZXNzZWQgY2FjaGUgZm9yIHN3YXAgcGFnZXMgYnkgZGVmYXVsdFwmIzM0O1xuICAzNzpcdFx0ZGVwZW5kcyBvbiBaU1dBUFxuICAzODpcdFx0aGVscFxuICAzOTpcdFx0ICBJZiBzZWxlY3RlZCwgdGhlIGNvbXByZXNzZWQgY2FjaGUgZm9yIHN3YXAgcGFnZXMgd2lsbCBiZSBlbmFibGVkXG4gIDQwOlx0XHQgIGF0IGJvb3QsIG90aGVyd2lzZSBpdCB3aWxsIGJlIGRpc2FibGVkLlxuICA0MTpcdFxuICA0MjpcdFx0ICBUaGUgc2VsZWN0aW9uIG1hZGUgaGVyZSBjYW4gYmUgb3ZlcnJpZGRlbiBieSB1c2luZyB0aGUga2VybmVsXG4gIDQzOlx0XHQgIGNvbW1hbmQgbGluZSAmIzM5O3pzd2FwLmVuYWJsZWQ9JiMzOTsgb3B0aW9uLlxuICA0NDpcdFxuICA0NTpcdGNvbmZpZyBaU1dBUF9TSFJJTktFUl9ERUZBVUxUX09OXG4gIDQ2Olx0XHRib29sIFwmIzM0O1NocmluayB0aGUgenN3YXAgcG9vbCBvbiBtZW1vcnkgcHJlc3N1cmVcJiMzNDtcbiAgNDc6XHRcdGRlcGVuZHMgb24gWlNXQVBcbiAgNDg6XHRcdGRlZmF1bHQgblxuICA0OTpcdFx0aGVscFxuICA1MDpcdFx0ICBJZiBzZWxlY3RlZCwgdGhlIHpzd2FwIHNocmlua2VyIHdpbGwgYmUgZW5hYmxlZCwgYW5kIHRoZSBwYWdlc1xuICA1MTpcdFx0ICBzdG9yZWQgaW4gdGhlIHpzd2FwIHBvb2wgd2lsbCBiZWNvbWUgYXZhaWxhYmxlIGZvciByZWNsYWltIChpLmVcbiAgNTI6XHRcdCAgd3JpdHRlbiBiYWNrIHRvIHRoZSBiYWNraW5nIHN3YXAgZGV2aWNlKSBvbiBtZW1vcnkgcHJlc3N1cmUuXG4gIDUzOlx0XG4gIDU0Olx0XHQgIFRoaXMgbWVhbnMgdGhhdCB6c3dhcCB3cml0ZWJhY2sgY291bGQgaGFwcGVuIGV2ZW4gaWYgdGhlIHBvb2wgaXNcbiAgNTU6XHRcdCAgbm90IHlldCBmdWxsLCBvciB0aGUgY2dyb3VwIHpzd2FwIGxpbWl0IGhhcyBub3QgYmVlbiByZWFjaGVkLFxuICA1NjpcdFx0ICByZWR1Y2luZyB0aGUgY2hhbmNlIHRoYXQgY29sZCBwYWdlcyB3aWxsIHJlc2lkZSBpbiB0aGUgenN3YXAgcG9vbFxuICA1NzpcdFx0ICBhbmQgY29uc3VtZSBtZW1vcnkgaW5kZWZpbml0ZWx5LlxuICA1ODpcdFxuICA1OTpcdGNob2ljZVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjkvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA3IDIwOjM3PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDcyOTMKCQkJCQkJCW91dHB1dDogMTgKCQkJCQkJCXRob3VnaHRzOiAxNgoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgbGV0JiMzOTtzIGRpdmUgaW50byB0aGlzLiBIZXJlJiMzOTtzIGhvdyBJJiMzOTtkIGFwcHJvYWNoIHRoYXQga2VybmVsIGFuYWx5c2lzLCBzdW1tYXJpemluZyBteSBvd24gdGhvdWdodCBwcm9jZXNzOgoKKipJbnZlc3RpZ2F0aW5nIENhbGxlcnMgb2YgYHpzd2FwX2xvYWRgKioKCkFscmlnaHQsIHRpbWUgdG8gZ2V0IG15IGhhbmRzIGRpcnR5LiBJJiMzOTttIHRoaW5raW5nLCAmIzM0O09rYXksIGB6c3dhcF9sb2FkYC4uLiB0aGF0JiMzOTtzIGEga2V5IGZ1bmN0aW9uIGluIHRoZSBac3dhcCBzdWJzeXN0ZW0sIHJpZ2h0PyBJdCYjMzk7cyB0aGUgb25lIHJlc3BvbnNpYmxlIGZvciBsb2FkaW5nIGNvbXByZXNzZWQgcGFnZXMgZnJvbSB0aGUgc3dhcCBjYWNoZS4gU28sIHVuZGVyc3RhbmRpbmcgKndobyogY2FsbHMgaXQgaXMgY3J1Y2lhbCB0byB1bmRlcnN0YW5kaW5nIHRoZSBkYXRhIGZsb3csIHRoZSB0cmlnZ2VycyBmb3IgWnN3YXAgYWN0aXZpdHksIGFuZCBwb3RlbnRpYWwgYm90dGxlbmVja3MuJiMzNDsKCk15IGltbWVkaWF0ZSBpbnN0aW5jdCBpcyB0byBsb29rIGF0IHRoZSBjYWxsaW5nIGNvbnRleHQuICYjMzQ7SSBuZWVkIHRvIHRyYWNrIGRvd24gZXZlcnkgaW5zdGFuY2Ugd2hlcmUgYHpzd2FwX2xvYWRgIGlzIGludm9rZWQgd2l0aGluIHRoZSBrZXJuZWwuIFN0YXRpYyBhbmFseXNpcyB0b29scyBhcmUgbXkgZnJpZW5kcyBoZXJlLiYjMzQ7IEkmIzM5O2QgbGlrZWx5IHN0YXJ0IHdpdGggYHBlcmZgIHRvIGJ1aWxkIGEgZHluYW1pYyBjYWxsZ3JhcGggb3IgYGdyZXBgIHRvIHF1aWNrbHkgc2VhcmNoIHRoZSBzb3VyY2UgY29kZSBmb3IgYWxsIGluc3RhbmNlcyBvZiB0aGUgZnVuY3Rpb24gbmFtZS4gSSYjMzk7ZCBiZSBsb29raW5nIGZvciBhIGNvbXByZWhlbnNpdmUgbGlzdC4gJiMzNDtOb3csIGl0JiMzOTtzIG5vdCBlbm91Z2ggdG8gKmZpbmQqIHRoZSBjYWxsczsgSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhlICp3aHkqLiYjMzQ7CgomIzM0O0ZvciBlYWNoIGNhbGxlciwgSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhlIHB1cnBvc2Ugb2YgdGhhdCBjb2RlIHBhdGguIFdoYXQmIzM5O3MgdGhlIHNwZWNpZmljIHNjZW5hcmlvIHRoYXQgbGVhZHMgdG8gYHpzd2FwX2xvYWRgIGJlaW5nIGV4ZWN1dGVkPyBJcyBpdCBhIHBhZ2UgZmF1bHQgaW4gYSB1c2VyLXNwYWNlIGFwcGxpY2F0aW9uPyBJcyBpdCBhIGJhY2tncm91bmQgcHJvY2VzcyBzY2F2ZW5naW5nIG1lbW9yeT8gQXJlIHRoZXJlIGFueSBvYnZpb3VzIGxvY2tzIG9yIHN5bmNocm9uaXphdGlvbiBwcmltaXRpdmVzIGludm9sdmVkLCBhbmQgaG93IGNvdWxkIHRob3NlIGFmZmVjdCBwZXJmb3JtYW5jZT8gTWF5YmUgYSBsb2NrIGNvbnRlbnRpb24gb3IgcmFjZSBjb25kaXRpb24uJiMzNDsKCkkmIzM5O2QgYmUgcGFydGljdWxhcmx5IGludGVyZXN0ZWQgaW46CgoqICAgKipGcmVxdWVuY3k6KiogSG93IG9mdGVuIGlzIGB6c3dhcF9sb2FkYCBjYWxsZWQgZnJvbSBlYWNoIGNhbGxlcj8KKiAgICoqQ29udGV4dDoqKiBXaGF0JiMzOTtzIHRoZSBjb250ZXh0IHN3aXRjaGluZyBpbiB0aGF0IGNhbGw/CiogICAqKkFyZ3VtZW50czoqKiBXaGF0IGFyZSB0aGUgYXJndW1lbnRzIHBhc3NlZCB0byBgenN3YXBfbG9hZGA/IEFyZSB0aGVyZSBzcGVjaWZpYyBwYWdlIHJhbmdlcyBvciBvdGhlciBkYXRhIHRoYXQgbWlnaHQgcHJvdmlkZSBjbHVlcyBhYm91dCB0aGUgd29ya2xvYWQ/CiogICAqKkxhdGVuY3k6KiogSG93IGxvbmcgZG9lcyBgenN3YXBfbG9hZGAgdGFrZSB0byBleGVjdXRlIGluIGVhY2ggc2NlbmFyaW8/ICYjMzQ7SSYjMzk7bGwgbmVlZCB0byBpbnN0cnVtZW50IHRoZSBjb2RlIGlmIHRoZSBjYWxsIHN0YWNrcyBhcmVuJiMzOTt0IGF2YWlsYWJsZSB0byBtZS4mIzM0OwoKJiMzNDtGaW5hbGx5LCBhZnRlciBhIHRob3JvdWdoIGludmVzdGlnYXRpb24sIEkmIzM5O2Qgd2FudCB0byBidWlsZCBhIG1lbnRhbCBtYXAgb2YgaG93IFpzd2FwIGludGVncmF0ZXMgd2l0aCB0aGUga2VybmVsJiMzOTtzIG1lbW9yeSBtYW5hZ2VtZW50LiBUaGlzIGluZm9ybWF0aW9uIHdpbGwgYmUgaW52YWx1YWJsZSBmb3IgZnV0dXJlIGFuYWx5c2lzLCBkZWJ1Z2dpbmcsIGFuZCBwb3RlbnRpYWxseSwgb3B0aW1pemF0aW9uIGVmZm9ydHMuJiMzNDsKCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMC8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDcgMjA6Mzc8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7enN3YXBfbG9hZCYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtpbmNsdWRlL2xpbnV4L3pzd2FwLmg9Mjg9Ym9vbCB6c3dhcF9zdG9yZShzdHJ1Y3QgZm9saW8gKmZvbGlvKTtcbmluY2x1ZGUvbGludXgvenN3YXAuaDoyOTppbnQgenN3YXBfbG9hZChzdHJ1Y3QgZm9saW8gKmZvbGlvKTtcbmluY2x1ZGUvbGludXgvenN3YXAuaC0zMC12b2lkIHpzd2FwX2ludmFsaWRhdGUoc3dwX2VudHJ5X3Qgc3dwKTtcbi0tXG5pbmNsdWRlL2xpbnV4L3pzd2FwLmg9NDI9c3RhdGljIGlubGluZSBib29sIHpzd2FwX3N0b3JlKHN0cnVjdCBmb2xpbyAqZm9saW8pXG4tLVxuaW5jbHVkZS9saW51eC96c3dhcC5oLTQ2LVxuaW5jbHVkZS9saW51eC96c3dhcC5oOjQ3OnN0YXRpYyBpbmxpbmUgaW50IHpzd2FwX2xvYWQoc3RydWN0IGZvbGlvICpmb2xpbylcbmluY2x1ZGUvbGludXgvenN3YXAuaC00OC17XG4tLVxubW0vcGFnZV9pby5jPTQ1Mj12b2lkIHN3YXBfcmVhZF9mb2xpbyhzdHJ1Y3Qgc3dhcF9pb19jdHggKmN0eCwgc3RydWN0IGZvbGlvICpmb2xpbylcbi0tXG5tbS9wYWdlX2lvLmMtNDc5LVxubW0vcGFnZV9pby5jOjQ4MDpcdGlmICh6c3dhcF9sb2FkKGZvbGlvKSAhPSAtRU5PRU5UKVxubW0vcGFnZV9pby5jLTQ4MS1cdFx0Z290byBmaW5pc2g7XG4tLVxubW0venN3YXAuYz0xNTgzPXN0YXRpYyBib29sIHpzd2FwX2lzX3ByZXNlbnQoc3dwX2VudHJ5X3QgZW50cnksIHVuc2lnbmVkIGludCBucilcbi0tXG5tbS96c3dhcC5jLTE2MDAtLyoqXG5tbS96c3dhcC5jOjE2MDE6ICogenN3YXBfbG9hZCgpIC0gbG9hZCBhIGZvbGlvIGZyb20genN3YXBcbm1tL3pzd2FwLmMtMTYwMi0gKiBAZm9saW86IGZvbGlvIHRvIGxvYWRcbi0tXG5tbS96c3dhcC5jLTE2MTYtICovXG5tbS96c3dhcC5jOjE2MTc6aW50IHpzd2FwX2xvYWQoc3RydWN0IGZvbGlvICpmb2xpbylcbm1tL3pzd2FwLmMtMTYxOC17XG4tLVxubW0venN3YXAuYy0xNjMwLVx0Lypcbm1tL3pzd2FwLmM6MTYzMTpcdCAqIEEgbGFyZ2UgZm9saW8gY2FuIGxlZ2l0aW1hdGVseSByZWFjaCB6c3dhcF9sb2FkKCkgd2l0aCBpdHMgd2hvbGVcbm1tL3pzd2FwLmMtMTYzMi1cdCAqIHJhbmdlIG9uIHRoZSBiYWNraW5nIGRldmljZSwgc28gc2NhbiB0aGUgcmFuZ2UgcmF0aGVyIHRoYW4gcmVqZWN0aW5nXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTEvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA3IDIwOjM3PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDgyOTkKCQkJCQkJCW91dHB1dDogMTkKCQkJCQkJCXRob3VnaHRzOiAzNjUKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIGEgTWVtb3J5IE1hbmFnZW1lbnQgUGF0Y2gqKgoKT2theSwgbGV0JiMzOTtzIGJyZWFrIHRoaXMgZG93bi4gTXkgaW5pdGlhbCBvYnNlcnZhdGlvbiBpcyB0aGF0IHRoaXMgcGF0Y2ggZGl2ZXMgaW50byBgbW0venN3YXAuY2AsIGltbWVkaWF0ZWx5IHBsYWNpbmcgaXQgd2l0aGluIHRoZSBtZW1vcnkgbWFuYWdlbWVudCBzdWJzeXN0ZW0sIHNwZWNpZmljYWxseSByZWxhdGVkIHRvIHpzd2FwLiBUaGUgY29yZSBjaGFuZ2UgaXMgaW4gYHpzd2FwX2xvYWQoKWAuIEl0IGFwcGVhcnMgd2UmIzM5O3JlIHJlZmluaW5nIGl0cyBiZWhhdmlvciB3aXRoIGxhcmdlIGZvbGlvcy4gVGhlIGV4aXN0aW5nIGNvZGUgd2FybmVkIGFuZCByZXR1cm5lZCBgLUVJTlZBTGAuIFRoZSBuZXcgY29kZSBpbnRyb2R1Y2VzIGB6c3dhcF9pc19wcmVzZW50KClgIGFuZCBjaGFuZ2VzIHRoZSByZXR1cm4gdmFsdWVzIGFuZCB3YXJuaW5nLiBTcGVjaWZpY2FsbHksIGl0IG5vdyBjaGVja3MgaWYgKmFueSogcGFydCBvZiB0aGUgbGFyZ2UgZm9saW8gaXMgcHJlc2VudCBpbiB6c3dhcCB1c2luZyBhIG5ldyBoZWxwZXIgZnVuY3Rpb24sIGB6c3dhcF9pc19wcmVzZW50KClgLiBJZiBldmVuIGEgcGFydCBpcyBwcmVzZW50LCB0aGVuIGl0IHdhcm5zIGFuZCByZXR1cm5zIGAtRUlPYC4gSG93ZXZlciwgaWYgdGhlIGxhcmdlIGZvbGlvIGlzbiYjMzk7dCBwcmVzZW50IGluIHpzd2FwIGF0IGFsbCwgaXQmIzM5O2xsIHJldHVybiBgLUVOT0VOVGAgYWxsb3dpbmcgdGhlIHN3YXAgZGV2aWNlIHRvIHRha2Ugb3Zlci4KCk15IG5leHQgdGhvdWdodCBpcyByZWFjaGFiaWxpdHkgYW5kIGZ1enppbmcuIElzIHRoaXMgY2hhbmdlIHNvbWV0aGluZyB3ZSBjYW4gYWN0dWFsbHkgaGl0IGFuZCBpcyBpdCB3b3J0aCB0aGUgZWZmb3J0IG9mIGZ1enppbmc/IEl0JiMzOTtzIGNsZWFybHkgcmVhY2hhYmxlIGluIHN0YW5kYXJkIGtlcm5lbCBjb25maWd1cmF0aW9ucyB3aXRoIHN3YXAgYW5kIHpzd2FwIGVuYWJsZWQsIGVzcGVjaWFsbHkgd2l0aCB0aG9zZSBsYXJnZSBmb2xpbyBzd2FwLWlucyAobVRIUCwgc3dhcGNhY2hlKS4gV2UgaGF2ZSBsb2dpYyBjaGFuZ2VzIGluIG1lbW9yeSBtYW5hZ2VtZW50LCBzbyBhY2NvcmRpbmcgdG8gbXkgY3JpdGVyaWEsIGl0JiMzOTtzIHdvcnRoIGludmVzdGlnYXRpbmcuCgpOb3csIEkgbmVlZCB0byBjaG9vc2UgdGhlIGZvY3VzIHN5bWJvbHMgZm9yIGZ1enppbmcuIGB6c3dhcF9sb2FkYCBpcyBkaXJlY3RseSBpbXBhY3RlZCwgYW5kIGBzd2FwX3JlYWRfZm9saW9gIGJlY29tZXMgaW50ZXJlc3RpbmcgYmVjYXVzZSBpdCBtaWdodCBpbnRlcmFjdCBub3cgaW4gY2FzZXMgd2hlcmUgYC1FTk9FTlRgIGlzIHJldHVybmVkLiBTaW5jZSBgenN3YXBfbG9hZGAgaXMgenN3YXAgc3BlY2lmaWMsIGl0IHdvdWxkbiYjMzk7dCBiZSB1bml2ZXJzYWxseSB1c2VmdWwuIEJ1dCBtYXliZSBgc3dhcF9yZWFkX2ZvbGlvYCBpcyBhbiBpbnRlcmVzdGluZyBjYW5kaWRhdGUgZm9yIGNhbGxpbmcuIEkmIzM5O2xsIG5lZWQgdG8gY2hlY2sgdGhlIGNhbGwgaGllcmFyY2h5LgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEyLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNyAyMDozNzwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtzd2FwX3JlYWRfZm9saW8mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bW0vbWVtb3J5LmM9NDc1MD1zdGF0aWMgYm9vbCBjYW5fc3dhcGluX3RocChzdHJ1Y3Qgdm1fZmF1bHQgKnZtZiwgcHRlX3QgKnB0ZXAsIGludCBucl9wYWdlcylcbi0tXG5tbS9tZW1vcnkuYy00NzYyLVx0Lypcbm1tL21lbW9yeS5jOjQ3NjM6XHQgKiBzd2FwX3JlYWRfZm9saW8oKSBjYW4mIzM5O3QgaGFuZGxlIHRoZSBjYXNlIGEgbGFyZ2UgZm9saW8gaXMgaHlicmlkbHlcbm1tL21lbW9yeS5jLTQ3NjQtXHQgKiBmcm9tIGRpZmZlcmVudCBiYWNrZW5kcy4gQW5kIHRoZXkgYXJlIGxpa2VseSBjb3JuZXIgY2FzZXMuIFNpbWlsYXJcbi0tXG5tbS9wYWdlX2lvLmM9Mzk3PXN0YXRpYyBpbnQgc3dhcF96ZXJvbWFwX2JhdGNoKHN3cF9lbnRyeV90IGVudHJ5LCBpbnQgbWF4X25yLFxuLS1cbm1tL3BhZ2VfaW8uYy00MTgtXG5tbS9wYWdlX2lvLmM6NDE5OnN0YXRpYyBib29sIHN3YXBfcmVhZF9mb2xpb196ZXJvbWFwKHN0cnVjdCBmb2xpbyAqZm9saW8pXG5tbS9wYWdlX2lvLmMtNDIwLXtcbi0tXG5tbS9wYWdlX2lvLmMtNDUxLVxubW0vcGFnZV9pby5jOjQ1Mjp2b2lkIHN3YXBfcmVhZF9mb2xpbyhzdHJ1Y3Qgc3dhcF9pb19jdHggKmN0eCwgc3RydWN0IGZvbGlvICpmb2xpbylcbm1tL3BhZ2VfaW8uYy00NTMte1xuLS1cbm1tL3BhZ2VfaW8uYy00NzQtXG5tbS9wYWdlX2lvLmM6NDc1Olx0aWYgKHN3YXBfcmVhZF9mb2xpb196ZXJvbWFwKGZvbGlvKSkge1xubW0vcGFnZV9pby5jLTQ3Ni1cdFx0Zm9saW9fdW5sb2NrKGZvbGlvKTtcbi0tXG5tbS9zd2FwLmg9MjU2PWludCBzaW9fcG9vbF9pbml0KHZvaWQpO1xubW0vc3dhcC5oOjI1Nzp2b2lkIHN3YXBfcmVhZF9mb2xpbyhzdHJ1Y3Qgc3dhcF9pb19jdHggKmN0eCwgc3RydWN0IGZvbGlvICpmb2xpbyk7XG5tbS9zd2FwLmgtMjU4LXZvaWQgc3dhcF9yZWFkX3N1Ym1pdChzdHJ1Y3Qgc3dhcF9pb19jdHggKmN0eCk7XG4tLVxubW0vc3dhcC5oPTM3NT1zdGF0aWMgaW5saW5lIHZvaWQgZm9saW9fcHV0X3N3YXAoc3RydWN0IGZvbGlvICpmb2xpbywgc3RydWN0IHBhZ2UgKnBhZ2UpXG4tLVxubW0vc3dhcC5oLTM3OC1cbm1tL3N3YXAuaDozNzk6c3RhdGljIGlubGluZSB2b2lkIHN3YXBfcmVhZF9mb2xpbyhzdHJ1Y3Qgc3dhcF9pb19jdHggKmN0eCwgc3RydWN0IGZvbGlvICpmb2xpbylcbm1tL3N3YXAuaC0zODAte1xuLS1cbm1tL3N3YXBfc3RhdGUuYz02NDI9c3RhdGljIHN0cnVjdCBmb2xpbyAqc3dhcF9jYWNoZV9yZWFkX2ZvbGlvKHN0cnVjdCBzd2FwX2lvX2N0eCAqY3R4LFxuLS1cbm1tL3N3YXBfc3RhdGUuYy02NTctXG5tbS9zd2FwX3N0YXRlLmM6NjU4Olx0c3dhcF9yZWFkX2ZvbGlvKGN0eCwgZm9saW8pO1xubW0vc3dhcF9zdGF0ZS5jLTY1OS1cdGlmIChyZWFkYWhlYWQpIHtcbi0tXG5tbS9zd2FwX3N0YXRlLmM9NjgzPXN0cnVjdCBmb2xpbyAqc3dhcGluX3N5bmMoc3dwX2VudHJ5X3QgZW50cnksIGdmcF90IGdmcCwgdW5zaWduZWQgbG9uZyBvcmRlcnMsXG4tLVxubW0vc3dhcF9zdGF0ZS5jLTY5OC1cbm1tL3N3YXBfc3RhdGUuYzo2OTk6XHRzd2FwX3JlYWRfZm9saW8oXHUwMDI2Y3R4LCBmb2xpbyk7XG5tbS9zd2FwX3N0YXRlLmMtNzAwLVx0c3dhcF9yZWFkX3N1Ym1pdChcdTAwMjZjdHgpO1xuLS1cbm1tL3N3YXBmaWxlLmM9MjkyNj1FWFBPUlRfU1lNQk9MX0dQTChhZGRfc3dhcF9leHRlbnQpO1xuLS1cbm1tL3N3YXBmaWxlLmMtMjkzMC0gKiBvbnRvIGEgY29udGlndW91cyByYW5nZSBvZiBkaXNrIGJsb2Nrcy4gIEEgcmJ0cmVlIG9mIHN3YXAgZXh0ZW50cyBpc1xubW0vc3dhcGZpbGUuYzoyOTMxOiAqIGJ1aWx0IGF0IHN3YXBvbiB0aW1lIGFuZCBpcyB0aGVuIHVzZWQgYXQgc3dhcF93cml0ZXBhZ2Uvc3dhcF9yZWFkX2ZvbGlvXG5tbS9zd2FwZmlsZS5jLTI5MzItICogdGltZSBmb3IgbG9jYXRpbmcgd2hlcmUgb24gZGlzayBhIHBhZ2UgYmVsb25ncy5cbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMy8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDcgMjA6Mzc8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogOTg4NgoJCQkJCQkJb3V0cHV0OiAxMTQKCQkJCQkJCXRob3VnaHRzOiAzOTIKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqTXkgQXNzZXNzbWVudCBvZiB0aGUgWnN3YXAgUGF0Y2gqKgoKT2theSwgbGV0JiMzOTtzIGJyZWFrIHRoaXMgZG93bi4gRmlyc3QsIEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoZSBzY29wZSBvZiB0aGVzZSBjaGFuZ2VzLiBJJiMzOTttIHN0YXJ0aW5nIGJ5IHRyYWNpbmcgdGhlIGtleSBmdW5jdGlvbiBjYWxscywgbGlrZSBgenN3YXBfbG9hZGAsIGB6c3dhcF9zdG9yZWAsIGFuZCBgenN3YXBfaXNfcHJlc2VudGAgdG8gc2VlIHdoZXJlIHRoZXkmIzM5O3JlIGRlZmluZWQgYW5kIGhvdyB0aGV5JiMzOTtyZSB1c2VkLiBJJiMzOTt2ZSBjb25maXJtZWQgdGhhdCBgenN3YXBfbG9hZGAgaXMgbm9uLXN0YXRpYyBhbmQgaW4gYG1tL3pzd2FwLmNgLCB3aGljaCBpcyBpbXBvcnRhbnQgZm9yIHVuZGVyc3RhbmRpbmcgaXRzIHBvdGVudGlhbCBpbXBhY3QuIEkgYWxzbyBjaGVja2VkIGB6c3dhcF9zdG9yZWAgKGFsc28gaW4gYG1tL3pzd2FwLmNgKSwgYW5kIGB6c3dhcF9pc19wcmVzZW50YCAoc3RhdGljIGluIHRoZSBzYW1lIGZpbGUpLiBUaGVuIEkgd2VudCBvbiB0byB2ZXJpZnkgdGhlIHByZXNlbmNlIG9mIGBzd2FwX3JlYWRfZm9saW9gLCBhbmQgYHN3YXBfY2FjaGVfcmVhZF9mb2xpb2AsIGFuZCBgc3dhcGluX3N5bmNgLCBhbmQgdGhlaXIgcmVsYXRpb25zaGlwIHdpdGggdGhlIGtleSBmdW5jdGlvbnMuCgpOZXh0LCBJIG5lZWRlZCB0byBjb25maXJtIHRoZSBjb25maWd1cmF0aW9uIGRlcGVuZGVuY2llcy4gWnN3YXAgb2J2aW91c2x5IGhpbmdlcyBvbiBgQ09ORklHX1NXQVBgLCBhbmQgc3BlY2lmaWNhbGx5LCBgQ09ORklHX1pTV0FQYC4gSSBkb3VibGUtY2hlY2tlZCBgbW0vS2NvbmZpZ2AgdG8gYmUgYWJzb2x1dGVseSBzdXJlOyB5ZXMsIGBaU1dBUGAgKmRlcGVuZHMqIG9uIGBTV0FQYCwgKnNlbGVjdHMqIGBDUllQVE9gIGFuZCBgWlNNQUxMT0NgLCB3aGljaCBhbGlnbnMgd2l0aCBteSB1bmRlcnN0YW5kaW5nIG9mIGhvdyBjb21wcmVzc2VkIHN3YXAgb3BlcmF0ZXMuIEkgYWxzbyBub3RlZCBgQ09ORklHX1pTV0FQX0RFRkFVTFRfT05gIGFzIGEgcG9zc2libGUgY29udmVuaWVuY2Ugb3B0aW9uLCBidXQgbm90IGVzc2VudGlhbC4KCk5vdywgdG8gc29saWRpZnkgbXkgdW5kZXJzdGFuZGluZywgSSYjMzk7dmUgdmVyaWZpZWQgdGhlICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IGB6c3dhcF9sb2FkYCBhbmQgYHN3YXBfcmVhZF9mb2xpb2AuIFRoZXNlIGFyZSBjbGVhcmx5IHRoZSBjb3JlIG1vZGlmaWNhdGlvbnMgYmVpbmcgbWFkZSB0byBtZW1vcnkgbWFuYWdlbWVudC4KCkZpbmFsbHksIEkmIzM5O3ZlIHJldmlld2VkIHRoZSByZWFzb25pbmcgYmVoaW5kIHRoZSBwYXRjaDogVGhlIHBhdGNoIG1vZGlmaWVzIGB6c3dhcF9sb2FkKClgIGFuZCBhZGRzIGB6c3dhcF9pc19wcmVzZW50KClgIGluIGBtbS96c3dhcC5jYCwgd2hpY2ggaXMgY2VudHJhbCB0byB0aGUgY29yZSBtZW1vcnkgbWFuYWdlbWVudCBzd2FwLWluIGxvZ2ljIGFuZCBpbnRyb2R1Y2VzIG5ldyBhc3NlcnRpb24vY2hlY2tpbmcgYmVoYXZpb3Igd2hpY2ggbWF5IGJlIHJlYWNoZWQgaW4gdmlydHVhbGl6ZWQgZW52aXJvbm1lbnRzLiBUaGlzIGlzIGEgY3JpdGljYWwgY2hhbmdlIGJlY2F1c2UgaXQgY2hhbmdlcyBob3cgbGFyZ2UgZm9saW9zIGFyZSBoYW5kbGVkIGluIHpzd2FwLiBUaGlzIGNvdWxkIHBvdGVudGlhbGx5IGxlYWQgdG8gbmV3IGFuZCBpbnRlcmVzdGluZyBlZGdlIGNhc2VzIGFuZCB2dWxuZXJhYmlsaXRpZXMsIHNvIGl0JiMzOTtzIHNvbWV0aGluZyB0aGF0ICphYnNvbHV0ZWx5KiBuZWVkcyBmdXp6aW5nIGFuZCB0aG9yb3VnaCB0ZXN0aW5nLgoKVGhpcyBhbGwgY2hlY2tzIG91dDsgYWxsIHJlcXVpcmVtZW50cyBoYXZlIGJlZW4gbWV0IGFuZCB0aGUgaW1wbGljYXRpb25zIGFyZSBjbGVhci4gSSYjMzk7bSByZWFkeSB0byBgc2V0LXJlc3VsdHNgLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE0LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNyAyMDozNzwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnNldC1yZXN1bHRzPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7U1dBUCYjMzQ7LAogICAgJiMzNDtaU1dBUCYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O3pzd2FwX2xvYWQmIzM0OywKICAgICYjMzQ7c3dhcF9yZWFkX2ZvbGlvJiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIG1vZGlmaWVzIG1lbW9yeSBtYW5hZ2VtZW50IGxvZ2ljIGluIG1tL3pzd2FwLmMgYnkgaW50cm9kdWNpbmcgenN3YXBfaXNfcHJlc2VudCgpIGFuZCB1cGRhdGluZyB6c3dhcF9sb2FkKCkgdG8gaW5zcGVjdCBsYXJnZSBmb2xpb3MgaW5zdGVhZCBvZiB1bmNvbmRpdGlvbmFsbHkgcmVqZWN0aW5nIHRoZW0uIFRoaXMgY2hhbmdlcyBjb3JlIHN3YXAtaW4gaGFuZGxpbmcgYW5kIGFzc2VydGlvbnMgaW4gcmVhY2hhYmxlIG1tIGNvZGUsIHdhcnJhbnRpbmcgZnV6emluZy4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7U1dBUCYjMzQ7LAogICAgJiMzNDtaU1dBUCYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O3pzd2FwX2xvYWQmIzM0OywKICAgICYjMzQ7c3dhcF9yZWFkX2ZvbGlvJiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIG1vZGlmaWVzIG1lbW9yeSBtYW5hZ2VtZW50IGxvZ2ljIGluIG1tL3pzd2FwLmMgYnkgaW50cm9kdWNpbmcgenN3YXBfaXNfcHJlc2VudCgpIGFuZCB1cGRhdGluZyB6c3dhcF9sb2FkKCkgdG8gaW5zcGVjdCBsYXJnZSBmb2xpb3MgaW5zdGVhZCBvZiB1bmNvbmRpdGlvbmFsbHkgcmVqZWN0aW5nIHRoZW0uIFRoaXMgY2hhbmdlcyBjb3JlIHN3YXAtaW4gaGFuZGxpbmcgYW5kIGFzc2VydGlvbnMgaW4gcmVhY2hhYmxlIG1tIGNvZGUsIHdhcnJhbnRpbmcgZnV6emluZy4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNS8xPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDcgMjA6Mzc8L3RkPgoJCQk8dGQ+YWN0aW9uPC90ZD4KCQkJPHRkPklmPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE2LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNyAyMDozNzwvdGQ+CgkJCTx0ZD5hZ2VudDwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5jb3JlPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0tNU0FOUmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIG1vZGlmaWVzIGB6c3dhcF9sb2FkKClgIHRvIHN1cHBvcnQgY2hlY2tpbmcgd2hldGhlciBsYXJnZSBmb2xpb3MgaGF2ZSBlbnRyaWVzIGluIHpzd2FwIHZpYSBgenN3YXBfaXNfcHJlc2VudCgpYC4gSWYgbm8gZW50cmllcyBpbiB0aGUgcmFuZ2UgYXJlIGNhY2hlZCBpbiB6c3dhcCwgaXQgcmV0dXJucyBgLUVOT0VOVGAgc28gdGhlIGJhY2tpbmcgc3dhcCBkZXZpY2UgY2FuIHJlYWQgdGhlIGVudGlyZSBsYXJnZSBmb2xpbyBpbnN0ZWFkIG9mIHVuY29uZGl0aW9uYWxseSBmYWlsaW5nIHdpdGggYC1FSU5WQUxgLlxuXG5BbGwgdmFyaWFibGVzIHVzZWQgaW4gdGhlIG5ld2x5IGludHJvZHVjZWQgYHpzd2FwX2lzX3ByZXNlbnQoKWAgZnVuY3Rpb24gKGBvZmZzZXRgLCBgdHJlZWAsIGBpbmRleGApIGFyZSBmdWxseSBpbml0aWFsaXplZCBzY2FsYXIgYW5kIHBvaW50ZXIgdmFsdWVzLiBUaGUgcGF0Y2ggZG9lcyBub3QgYWxsb2NhdGUgbmV3IHN0cnVjdHVyZXMsIGNvcHkgdW5pbml0aWFsaXplZCBtZW1vcnkgdG8gdXNlciBzcGFjZSwgYnJhbmNoIG9uIHVuaW5pdGlhbGl6ZWQgdmFsdWVzLCBvciBhbHRlciBidWZmZXIgbGVuZ3RocyBpbiBhIHdheSB0aGF0IHdvdWxkIGxlYXZlIHVuaW5pdGlhbGl6ZWQga2VybmVsIG1lbW9yeSBleHBvc2VkLiBBbnkgcG90ZW50aWFsIHBhZ2UvZm9saW8gc3RhdGUgaXNzdWVzIG9yIG91dC1vZi1ib3VuZHMgaW5kZXggaXNzdWVzIGFyZSBhZGVxdWF0ZWx5IGNvdmVyZWQgYnkgc3RhbmRhcmQgYXNzZXJ0aW9ucyBhbmQgS0FTQU4uIFRoZXJlZm9yZSwgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGlzIG5vdCByZXF1aXJlZC4mIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+SW5zdHJ1Y3Rpb246PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Zb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgc2VjdXJpdHkgZW5naW5lZXIgc3BlY2lhbGl6aW5nIGluIGtlcm5lbCBtZW1vcnkKZXJyb3IgZGV0ZWN0b3JzIChLQVNBTiBhbmQgS01TQU4pLiBZb3VyIGpvYiBpcyB0byByZXZpZXcgdGhlIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQKZGV0ZXJtaW5lIGlmIHRoZSBjb2RlIGNoYW5nZXMganVzdGlmeSBzcGF3bmluZyBhIGRlZGljYXRlZCBLTVNBTiAoS2VybmVsTWVtb3J5U2FuaXRpemVyKQpmdXp6aW5nIHNlc3Npb24gaW4gYWRkaXRpb24gdG8gc3RhbmRhcmQgS0FTQU4gZnV6emluZy4KCkNSSVRJQ0FMIERJU1RJTkNUSU9OIEJFVFdFRU4gS0FTQU4gQU5EIEtNU0FOOgotIFN0YW5kYXJkIEtBU0FOIGtlcm5lbCBidWlsZHMgKHVwc3RyZWFtLWFwcGFybW9yLWthc2FuLmNvbmZpZykgYWxyZWFkeSBlbmFibGUKICBhIGNvbXByZWhlbnNpdmUgc3VpdGUgb2YgZGVidWdnaW5nIHRvb2xzIGFuZCBzYW5pdGl6ZXJzLCBpbmNsdWRpbmcgS0FTQU4KICAob3V0LW9mLWJvdW5kcyBhY2Nlc3NlcywgdXNlLWFmdGVyLWZyZWUsIGRvdWJsZSBmcmVlLCBpbnZhbGlkIGZyZWUpLCBMT0NLREVQCiAgKGxvY2tpbmcgYnVncyBhbmQgZGVhZGxvY2tzKSwgVUItc2FuaXRpemVycywgYW5kIG1lbW9yeSBjb3JydXB0aW9uIGNoZWNrcy4KLSBLTVNBTiAoS2VybmVsTWVtb3J5U2FuaXRpemVyKSBkZXRlY3RzIHJlYWRzIG9mIFVOSU5JVElBTElaRUQgbWVtb3J5IChzdGFjaywgaGVhcCwKICBvciBwYWdlIGFsbG9jYXRpb25zKSBhbmQga2VybmVsLXRvLXVzZXIgbWVtb3J5IGluZm8tbGVha3MuCgpSdWxlOiBUSEVSRSBJUyBOTyBTRU5TRSBJTiBSVU5OSU5HIEEgS01TQU4gU0VTU0lPTiBJRiBBIEJVRyBDQU4gQkUgQ0FVR0hUIEJZIEtBU0FOLApMT0NLREVQLCBPUiBPVEhFUiBTVEFOREFSRCBCVUcgREVURUNUT1JTLgpBIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaW5jdXJzIHNpZ25pZmljYW50IHJlc291cmNlIGNvc3RzLiBZb3UgbXVzdCBPTkxZCnNldCBOZWVkc0tNU0FOPXRydWUgaWYgdGhlIGNvZGUgY2hhbmdlcyBpbnRyb2R1Y2Ugb3IgZXhwb3NlIFVOSU5JVElBTElaRUQgTUVNT1JZIHJpc2tzCnRoYXQgYXJlIGRldGVjdGVkIE9OTFkgYnkgS01TQU4uCgpMb29rIGhvbGlzdGljYWxseSBhdCB0aGUgcGF0Y2ggc2VyaWVzIGFuZCBzdXJyb3VuZGluZyBjb2RlLiBFdmVuIGlmIG5vIGRpcmVjdAp1bmluaXRpYWxpemVkIGZpZWxkIGFjY2Vzc2VzIG9yIG5ldyBidWZmZXIgYWxsb2NhdGlvbnMgYXJlIGFkZGVkIGluIHRoZSBkaWZmIGl0c2VsZiwKYSBwYXRjaCBtYXkgYWx0ZXIgY29udHJvbCBmbG93LCBib3VuZHMgY2hlY2tpbmcsIG9yIGRhdGEgbGVuZ3RoIGNhbGN1bGF0aW9ucyBpbiB3YXlzCnRoYXQgY2hhbmdlIGhvdyB0aGUgcmVzdCBvZiB0aGUgY29kZSBvcGVyYXRlcyBvbiBleGlzdGluZyBidWZmZXJzIChlLmcuIGFsbG93aW5nCnVuaW5pdGlhbGl6ZWQgc3RhY2svaGVhcCBtZW1vcnkgdG8gYmUgcmVhZCwgY29waWVkIHRvIHVzZXIgc3BhY2UsIG9yIHVzZWQgaW4gY29udHJvbApmbG93KS4gRG8gbm90IGhlc2l0YXRlIHRvIHVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUsCmNhbGxlZCBmdW5jdGlvbnMsIGFuZCBjYWxsZXJzLgoKU2V0IE5lZWRzS01TQU49dHJ1ZSBPTkxZIElGIHRoZSBwYXRjaCBpbnRyb2R1Y2VzIG9yIG1vZGlmaWVzOgoxLiBLZXJuZWwgc3RydWN0dXJlcyBzZW50IHRvIHVzZXIgc3BhY2UgKHZpYSBjb3B5X3RvX3VzZXIsIHB1dF91c2VyLCBuZXRsaW5rIHNrYgogICBhdHRyaWJ1dGVzLCBpb2N0bCBvdXRwdXQgYXJndW1lbnRzLCBzb2NrZXQgb3B0aW9ucywgb3IgQlBGIGJ1ZmZlcnMpIHdoZXJlIGZpZWxkcwogICBvciBzdHJ1Y3R1cmUgcGFkZGluZyBtaWdodCBub3QgYmUgZnVsbHkgaW5pdGlhbGl6ZWQvemVyb2VkLgoyLiBDb25kaXRpb25hbCBsb2dpYyBvciBicmFuY2hpbmcgdGhhdCBkZXBlbmRzIG9uIHBvdGVudGlhbGx5IHVuaW5pdGlhbGl6ZWQgdmFyaWFibGVzCiAgIG9yIHN0cnVjdCBmaWVsZHMuCjMuIEFsbG9jYXRpb24gb3IgaW5pdGlhbGl6YXRpb24gb2YgY29tcGxleCBkYXRhIHN0cnVjdHVyZXMgd2hlcmUgdW5pbml0aWFsaXplZCBmaWVsZHMKICAgY291bGQgYmUgcmVhZCBsYXRlciBpbiByZWFjaGFibGUgY29kZSBwYXRocy4KNC4gQm91bmRzIGNoZWNrcywgbGVuZ3Rocywgb3IgbG9naWMgaW4gYSB3YXkgdGhhdCBhbGxvd3Mgc3Vycm91bmRpbmcgY29kZSB0byBhY2Nlc3MKICAgdW5pbml0aWFsaXplZCBieXRlcyBvZiBleGlzdGluZyBidWZmZXJzLgoKU2V0IE5lZWRzS01TQU49ZmFsc2UgSUY6Ci0gVGhlIGNvZGUgY2hhbmdlcyBwcmltYXJpbHkgcmlzayBvdXQtb2YtYm91bmRzIGFjY2VzcywgYXJyYXkgb3ZlcmZsb3dzLCBOVUxMIHBvaW50ZXIKICBkZXJlZmVyZW5jZXMsIGxvY2tpbmcgZGVhZGxvY2tzLCBvciB1c2UtYWZ0ZXItZnJlZSBidWdzICh0aGVzZSBhcmUgYWxyZWFkeSBjYXVnaHQKICBieSBLQVNBTiwgTE9DS0RFUCwgb3Igc3RhbmRhcmQgYnVnIGRldGVjdG9ycykuCi0gQWxsIHN0YWNrL2hlYXAgc3RydWN0dXJlcyB0b3VjaGVkIG9yIGludHJvZHVjZWQgYnkgdGhlIHBhdGNoIGFyZSBmdWxseSB6ZXJvZWQKICBvciBpbml0aWFsaXplZCAoZS5nLiB1c2luZyA9IHswfSwgbWVtc2V0LCBremFsbG9jKSBiZWZvcmUgYmVpbmcgcmVhZCBvciBjb3BpZWQuCi0gVGhlIHBhdGNoIGRvZXMgbm90IGludHJvZHVjZSBhbnkgcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSB1c2FnZSBvciBpbmZvLWxlYWtzLgoKVXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gaW5zcGVjdCB0aGUgc3Vycm91bmRpbmcgY29kZSBpZiBuZWNlc3NhcnksIHRoZW4gcHJvdmlkZQpkZXRhaWxlZCBLTVNBTlJlYXNvbmluZyBjb250cmFzdGluZyBLQVNBTiB2cyBLTVNBTiBhcHBsaWNhYmlsaXR5IGZvciB0aGlzIHBhdGNoLgpQcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy4KCgpVc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLgpJdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS4KSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlByb21wdDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPlRhcmdldCBhcmNoaXRlY3R1cmU6IGFtZDY0CgpGb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczoKY29tbWl0IDBhY2UyZGIzNTFhZDBhN2VkYjkwYTZjYTA0OTM1NzQ4YmJjNzJmZDEKQXV0aG9yOiBzeXotY2x1c3RlciAmbHQ7dHJpYWdlQHN5emthbGxlci5jb20mZ3Q7CkRhdGU6ICAgTW9uIFNlcCA3IDIwOjM3OjA5IDIwMjYgJiM0MzswMDAwCgogICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3CgpkaWZmIC0tZ2l0IGEvbW0venN3YXAuYyBiL21tL3pzd2FwLmMKaW5kZXggMzdmMzRlNDA2YzhlMy4uZmQzNmFjMzhlOWExZSAxMDA2NDQKLS0tIGEvbW0venN3YXAuYwomIzQzOyYjNDM7JiM0MzsgYi9tbS96c3dhcC5jCkBAIC0xNTcxLDYgJiM0MzsxNTcxLDMyIEBAIGJvb2wgenN3YXBfc3RvcmUoc3RydWN0IGZvbGlvICpmb2xpbykKIAlyZXR1cm4gcmV0OwogfQogCiYjNDM7LyoqCiYjNDM7ICogenN3YXBfaXNfcHJlc2VudCgpIC0gaXMgYW55IHNsb3QgaW4gW2VudHJ5LCBlbnRyeSAmIzQzOyBucikgaW4genN3YXA/CiYjNDM7ICogQGVudHJ5OiBiYXNlIHN3YXAgZW50cnkgb2YgdGhlIHJhbmdlCiYjNDM7ICogQG5yOiBudW1iZXIgb2YgY29udGlndW91cyBzbG90cyB0byBjaGVjawomIzQzOyAqCiYjNDM7ICogQ29udGV4dDogVGhlIGNhbGxlciBtdXN0IGtlZXAgdGhlIHJhbmdlIHBpbm5lZCwgb3RoZXJ3aXNlIHRoZSBhbnN3ZXIgY2FuCiYjNDM7ICogY2hhbmdlIHVuZGVyIGl0LgomIzQzOyAqIFJldHVybjogdHJ1ZSBpZiBhdCBsZWFzdCBvbmUgc2xvdCBpbiB0aGUgcmFuZ2UgaXMgaW4genN3YXAuCiYjNDM7ICovCiYjNDM7c3RhdGljIGJvb2wgenN3YXBfaXNfcHJlc2VudChzd3BfZW50cnlfdCBlbnRyeSwgdW5zaWduZWQgaW50IG5yKQomIzQzO3sKJiM0MzsJcGdvZmZfdCBvZmZzZXQgPSBzd3Bfb2Zmc2V0KGVudHJ5KTsKJiM0MzsJc3RydWN0IHhhcnJheSAqdHJlZSA9IHN3YXBfenN3YXBfdHJlZShlbnRyeSk7CiYjNDM7CXVuc2lnbmVkIGxvbmcgaW5kZXggPSBvZmZzZXQ7CiYjNDM7CiYjNDM7CS8qCiYjNDM7CSAqIEEgcGlubmVkIHJhbmdlIGlzIGF0IG1vc3QgU1dBUEZJTEVfQ0xVU1RFUiBzbG90cyBhbmQgaXMgYWxpZ25lZCB0bwomIzQzOwkgKiBpdHMgb3duIHNpemUsIHNvIG9uZSB0cmVlIGNvdmVycyBhbGwgb2YgaXQgYW5kIGEgc2luZ2xlIGxvb2t1cCBpcwomIzQzOwkgKiBlbm91Z2guIFNjYW5uaW5nIG9ubHkgcGFydCBvZiB0aGUgcmFuZ2Ugd291bGQgcmVwb3J0IGEgZmFsc2UKJiM0MzsJICogJiMzNDthYnNlbnQmIzM0OyBhbmQgbGV0IHRoZSBjYWxsZXIgcmVhZCBhIHN0YWxlIGNvcHkgZnJvbSB0aGUgZGV2aWNlLgomIzQzOwkgKi8KJiM0MzsJQlVJTERfQlVHX09OKFNXQVBGSUxFX0NMVVNURVIgJmd0OyBaU1dBUF9BRERSRVNTX1NQQUNFX1BBR0VTKTsKJiM0MzsKJiM0MzsJcmV0dXJuIHhhX2ZpbmQodHJlZSwgJmFtcDtpbmRleCwgb2Zmc2V0ICYjNDM7IG5yIC0gMSwgWEFfUFJFU0VOVCk7CiYjNDM7fQomIzQzOwogLyoqCiAgKiB6c3dhcF9sb2FkKCkgLSBsb2FkIGEgZm9saW8gZnJvbSB6c3dhcAogICogQGZvbGlvOiBmb2xpbyB0byBsb2FkCkBAIC0xNTc4LDE1ICYjNDM7MTYwNCwxMiBAQCBib29sIHpzd2FwX3N0b3JlKHN0cnVjdCBmb2xpbyAqZm9saW8pCiAgKiBSZXR1cm46IDAgb24gc3VjY2Vzcywgd2l0aCB0aGUgZm9saW8gdW5sb2NrZWQgYW5kIG1hcmtlZCB1cC10by1kYXRlLCBvciBvbmUKICAqIG9mIHRoZSBmb2xsb3dpbmcgZXJyb3IgY29kZXM6CiAgKgotICogIC1FSU86IGlmIHRoZSBzd2FwcGVkIG91dCBjb250ZW50IHdhcyBpbiB6c3dhcCwgYnV0IGNvdWxkIG5vdCBiZSBsb2FkZWQKLSAqICBpbnRvIHRoZSBwYWdlIGR1ZSB0byBhIGRlY29tcHJlc3Npb24gZmFpbHVyZS4gVGhlIGZvbGlvIGlzIHVubG9ja2VkLCBidXQKLSAqICBOT1QgbWFya2VkIHVwLXRvLWRhdGUsIHNvIHRoYXQgYW4gSU8gZXJyb3IgaXMgZW1pdHRlZCAoZS5nLiBkb19zd2FwX3BhZ2UoKQotICogIHdpbGwgU0lHQlVTKS4KLSAqCi0gKiAgLUVJTlZBTDogaWYgdGhlIHN3YXBwZWQgb3V0IGNvbnRlbnQgd2FzIGluIHpzd2FwLCBidXQgdGhlIHBhZ2UgYmVsb25ncwotICogIHRvIGEgbGFyZ2UgZm9saW8sIHdoaWNoIGlzIG5vdCBzdXBwb3J0ZWQgYnkgenN3YXAuIFRoZSBmb2xpbyBpcyB1bmxvY2tlZCwKLSAqICBidXQgTk9UIG1hcmtlZCB1cC10by1kYXRlLCBzbyB0aGF0IGFuIElPIGVycm9yIGlzIGVtaXR0ZWQgKGUuZy4KLSAqICBkb19zd2FwX3BhZ2UoKSB3aWxsIFNJR0JVUykuCiYjNDM7ICogIC1FSU86IGlmIHRoZSBzd2FwcGVkIG91dCBjb250ZW50IHdhcyBpbiB6c3dhcCBidXQgY291bGQgbm90IGJlIGhhbmRlZAomIzQzOyAqICBiYWNrLCBlaXRoZXIgYmVjYXVzZSBkZWNvbXByZXNzaW9uIGZhaWxlZCBvciBiZWNhdXNlIGEgc2xvdCBpbiBhCiYjNDM7ICogIGxhcmdlLWZvbGlvIHJhbmdlIGlzIHN0aWxsIGluIHpzd2FwIGFuZCB6c3dhcCBjYW5ub3QgcmVjb25zdHJ1Y3QgYSBsYXJnZQomIzQzOyAqICBmb2xpbyBmcm9tIHBlci1wYWdlIGVudHJpZXMuIFRoZSBmb2xpbyBpcyB1bmxvY2tlZCwgYnV0IE5PVCBtYXJrZWQKJiM0MzsgKiAgdXAtdG8tZGF0ZSwgc28gdGhhdCBhbiBJTyBlcnJvciBpcyBlbWl0dGVkIChlLmcuIGRvX3N3YXBfcGFnZSgpIHdpbGwKJiM0MzsgKiAgU0lHQlVTKS4KICAqCiAgKiAgLUVOT0VOVDogaWYgdGhlIHN3YXBwZWQgb3V0IGNvbnRlbnQgd2FzIG5vdCBpbiB6c3dhcC4gVGhlIGZvbGlvIHJlbWFpbnMKICAqICBsb2NrZWQgb24gcmV0dXJuLgpAQCAtMTYwNSwxMyAmIzQzOzE2MjgsMTggQEAgaW50IHpzd2FwX2xvYWQoc3RydWN0IGZvbGlvICpmb2xpbykKIAkJcmV0dXJuIC1FTk9FTlQ7CiAKIAkvKgotCSAqIExhcmdlIGZvbGlvcyBzaG91bGQgbm90IGJlIHN3YXBwZWQgaW4gd2hpbGUgenN3YXAgaXMgYmVpbmcgdXNlZCwgYXMKLQkgKiB0aGV5IGFyZSBub3QgcHJvcGVybHkgaGFuZGxlZC4gWnN3YXAgZG9lcyBub3QgcHJvcGVybHkgbG9hZCBsYXJnZQotCSAqIGZvbGlvcywgYW5kIGEgbGFyZ2UgZm9saW8gbWF5IG9ubHkgYmUgcGFydGlhbGx5IGluIHpzd2FwLgomIzQzOwkgKiBBIGxhcmdlIGZvbGlvIGNhbiBsZWdpdGltYXRlbHkgcmVhY2ggenN3YXBfbG9hZCgpIHdpdGggaXRzIHdob2xlCiYjNDM7CSAqIHJhbmdlIG9uIHRoZSBiYWNraW5nIGRldmljZSwgc28gc2NhbiB0aGUgcmFuZ2UgcmF0aGVyIHRoYW4gcmVqZWN0aW5nCiYjNDM7CSAqIGl0IG91dHJpZ2h0LiBUaGUgY2FsbGVyIGhhcyBwaW5uZWQgZXZlcnkgc2xvdCwgc28genN3YXAgY2Fubm90IHN0YXJ0CiYjNDM7CSAqIGEgc3RvcmUgb3IgYSB3cml0ZWJhY2sgaW50byB0aGUgcmFuZ2Ugd2hpbGUgd2UgbG9vay4KIAkgKi8KLQlpZiAoV0FSTl9PTl9PTkNFKGZvbGlvX3Rlc3RfbGFyZ2UoZm9saW8pKSkgewotCQlmb2xpb191bmxvY2soZm9saW8pOwotCQlyZXR1cm4gLUVJTlZBTDsKJiM0MzsJaWYgKGZvbGlvX3Rlc3RfbGFyZ2UoZm9saW8pKSB7CiYjNDM7CQlpZiAoV0FSTl9PTl9PTkNFKHpzd2FwX2lzX3ByZXNlbnQoc3dwLAomIzQzOwkJCQkJCSAgZm9saW9fbnJfcGFnZXMoZm9saW8pKSkpIHsKJiM0MzsJCQlmb2xpb191bmxvY2soZm9saW8pOwomIzQzOwkJCXJldHVybiAtRUlPOwomIzQzOwkJfQomIzQzOwkJcmV0dXJuIC1FTk9FTlQ7CiAJfQogCiAJZW50cnkgPSB4YV9sb2FkKHRyZWUsIG9mZnNldCk7CjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE3LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNyAyMDozNzwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAzMDEwCgkJCQkJCQlvdXRwdXQ6IDM1CgkJCQkJCQl0aG91Z2h0czogNjkKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgYW5hbHlzaXMgb2YgdGhlIHNpdHVhdGlvbjoKCioqS01TQU4gUGF0Y2ggQXNzZXNzbWVudCBmb3IgenN3YXAuYyoqCgpBbHJpZ2h0LCBsZXQmIzM5O3MgZGl2ZSBpbnRvIHRoaXMuIFRoZSBmaXJzdCBzdGVwIGlzIGNsZWFyOiB3ZSBuZWVkIHRvIGFzc2VzcyB0aGlzIHBhdGNoIHRvIGZpZ3VyZSBvdXQgaWYgS01TQU4gKEtlcm5lbCBNZW1vcnkgU2FuaXRpemVyKSBpcyBhY3R1YWxseSBuZWNlc3NhcnkuIFRoZSBmYWN0IHRoYXQgdGhlIHBhdGNoIGlzIGluIGBtbS96c3dhcC5jYCBuYXJyb3dzIG91ciBmb2N1cyBzaWduaWZpY2FudGx5LCB3aGljaCBpcyBnb29kLgoKTXkgaW1tZWRpYXRlIGluc3RpbmN0IGlzIHRvIGxvb2sgYXQgdGhlIGRpZmYuIEkmIzM5O2xsIHBvcmUgb3ZlciB0aGUgY29kZSBjaGFuZ2VzLCBidXQgSSYjMzk7bGwgbmVlZCBjb250ZXh0LiBJJiMzOTtsbCByZWFkIHRoZSBzdXJyb3VuZGluZyBjb2RlIGluIGBtbS96c3dhcC5jYCBhcm91bmQgdGhlIHNwZWNpZmljIGxpbmVzIHRoYXQgYXJlIGNoYW5nZWQuIEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoZSBsb2dpYyBmbG93IGFuZCB0aGUgZGF0YSBzdHJ1Y3R1cmVzIGludm9sdmVkLCB0byB1bmRlcnN0YW5kIHRoZSBpbnRlbnQgb2YgdGhpcyBwYXRjaC4KCkkgd2lsbCBhbHNvIGRvIGEgcXVpY2sgYGdyZXBgIG9yIGByZWFkLWZpbGVgIHRvIGNoZWNrIHRoZSBjb250ZXh0IGFyb3VuZCBgenN3YXBfbG9hZCgpYCB3aGljaCBpcyBsaWtlbHkgd2hlcmUgdGhlIHBhdGNoIHdpbGwgaGF2ZSB0aGUgbW9zdCBpbXBhY3QuIEkgd2FudCB0byBzZWUgaG93IGRhdGEgaXMgbG9hZGVkLCBtYW5pcHVsYXRlZCwgYW5kIHN1YnNlcXVlbnRseSB1c2VkLiBUaGlzIHdpbGwgaGVscCBtZSB1bmRlcnN0YW5kIHdoZXRoZXIgdW5pbml0aWFsaXplZCBtZW1vcnkgaXMgcG9zc2libHkgYmVpbmcgdXNlZC4gSSB3aWxsIGxpa2VseSBuZWVkIHRvIHVuZGVyc3RhbmQgd2hhdCB0aGUgcGF0Y2ggaXMgZG9pbmcgd2l0aCB0aGF0IGRhdGEgdG8gc2VlIGlmIHdlIGhhdmUgYSBLTVNBTiBwcm9ibGVtLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE4LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNyAyMDozNzwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O21tL3pzd2FwLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAxNTY1LAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDkwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OzE1NjU6XHRcdFx0XHRlbnRyeSA9IHhhX2VyYXNlKHRyZWUsIG9mZnNldCAmIzQzOyBpbmRleCk7XG4xNTY2Olx0XHRcdFx0aWYgKGVudHJ5KVxuMTU2NzpcdFx0XHRcdFx0enN3YXBfZW50cnlfZnJlZShlbnRyeSk7XG4xNTY4Olx0XHRcdH1cbjE1Njk6XHRcdH1cbjE1NzA6XHRcbjE1NzE6XHRcdHJldHVybiByZXQ7XG4xNTcyOlx0fVxuMTU3MzpcdFxuMTU3NDpcdC8qKlxuMTU3NTpcdCAqIHpzd2FwX2lzX3ByZXNlbnQoKSAtIGlzIGFueSBzbG90IGluIFtlbnRyeSwgZW50cnkgJiM0MzsgbnIpIGluIHpzd2FwP1xuMTU3NjpcdCAqIEBlbnRyeTogYmFzZSBzd2FwIGVudHJ5IG9mIHRoZSByYW5nZVxuMTU3NzpcdCAqIEBucjogbnVtYmVyIG9mIGNvbnRpZ3VvdXMgc2xvdHMgdG8gY2hlY2tcbjE1Nzg6XHQgKlxuMTU3OTpcdCAqIENvbnRleHQ6IFRoZSBjYWxsZXIgbXVzdCBrZWVwIHRoZSByYW5nZSBwaW5uZWQsIG90aGVyd2lzZSB0aGUgYW5zd2VyIGNhblxuMTU4MDpcdCAqIGNoYW5nZSB1bmRlciBpdC5cbjE1ODE6XHQgKiBSZXR1cm46IHRydWUgaWYgYXQgbGVhc3Qgb25lIHNsb3QgaW4gdGhlIHJhbmdlIGlzIGluIHpzd2FwLlxuMTU4MjpcdCAqL1xuMTU4MzpcdHN0YXRpYyBib29sIHpzd2FwX2lzX3ByZXNlbnQoc3dwX2VudHJ5X3QgZW50cnksIHVuc2lnbmVkIGludCBucilcbjE1ODQ6XHR7XG4xNTg1Olx0XHRwZ29mZl90IG9mZnNldCA9IHN3cF9vZmZzZXQoZW50cnkpO1xuMTU4NjpcdFx0c3RydWN0IHhhcnJheSAqdHJlZSA9IHN3YXBfenN3YXBfdHJlZShlbnRyeSk7XG4xNTg3Olx0XHR1bnNpZ25lZCBsb25nIGluZGV4ID0gb2Zmc2V0O1xuMTU4ODpcdFxuMTU4OTpcdFx0LypcbjE1OTA6XHRcdCAqIEEgcGlubmVkIHJhbmdlIGlzIGF0IG1vc3QgU1dBUEZJTEVfQ0xVU1RFUiBzbG90cyBhbmQgaXMgYWxpZ25lZCB0b1xuMTU5MTpcdFx0ICogaXRzIG93biBzaXplLCBzbyBvbmUgdHJlZSBjb3ZlcnMgYWxsIG9mIGl0IGFuZCBhIHNpbmdsZSBsb29rdXAgaXNcbjE1OTI6XHRcdCAqIGVub3VnaC4gU2Nhbm5pbmcgb25seSBwYXJ0IG9mIHRoZSByYW5nZSB3b3VsZCByZXBvcnQgYSBmYWxzZVxuMTU5MzpcdFx0ICogXCYjMzQ7YWJzZW50XCYjMzQ7IGFuZCBsZXQgdGhlIGNhbGxlciByZWFkIGEgc3RhbGUgY29weSBmcm9tIHRoZSBkZXZpY2UuXG4xNTk0Olx0XHQgKi9cbjE1OTU6XHRcdEJVSUxEX0JVR19PTihTV0FQRklMRV9DTFVTVEVSIFx1MDAzZSBaU1dBUF9BRERSRVNTX1NQQUNFX1BBR0VTKTtcbjE1OTY6XHRcbjE1OTc6XHRcdHJldHVybiB4YV9maW5kKHRyZWUsIFx1MDAyNmluZGV4LCBvZmZzZXQgJiM0MzsgbnIgLSAxLCBYQV9QUkVTRU5UKTtcbjE1OTg6XHR9XG4xNTk5Olx0XG4xNjAwOlx0LyoqXG4xNjAxOlx0ICogenN3YXBfbG9hZCgpIC0gbG9hZCBhIGZvbGlvIGZyb20genN3YXBcbjE2MDI6XHQgKiBAZm9saW86IGZvbGlvIHRvIGxvYWRcbjE2MDM6XHQgKlxuMTYwNDpcdCAqIFJldHVybjogMCBvbiBzdWNjZXNzLCB3aXRoIHRoZSBmb2xpbyB1bmxvY2tlZCBhbmQgbWFya2VkIHVwLXRvLWRhdGUsIG9yIG9uZVxuMTYwNTpcdCAqIG9mIHRoZSBmb2xsb3dpbmcgZXJyb3IgY29kZXM6XG4xNjA2Olx0ICpcbjE2MDc6XHQgKiAgLUVJTzogaWYgdGhlIHN3YXBwZWQgb3V0IGNvbnRlbnQgd2FzIGluIHpzd2FwIGJ1dCBjb3VsZCBub3QgYmUgaGFuZGVkXG4xNjA4Olx0ICogIGJhY2ssIGVpdGhlciBiZWNhdXNlIGRlY29tcHJlc3Npb24gZmFpbGVkIG9yIGJlY2F1c2UgYSBzbG90IGluIGFcbjE2MDk6XHQgKiAgbGFyZ2UtZm9saW8gcmFuZ2UgaXMgc3RpbGwgaW4genN3YXAgYW5kIHpzd2FwIGNhbm5vdCByZWNvbnN0cnVjdCBhIGxhcmdlXG4xNjEwOlx0ICogIGZvbGlvIGZyb20gcGVyLXBhZ2UgZW50cmllcy4gVGhlIGZvbGlvIGlzIHVubG9ja2VkLCBidXQgTk9UIG1hcmtlZFxuMTYxMTpcdCAqICB1cC10by1kYXRlLCBzbyB0aGF0IGFuIElPIGVycm9yIGlzIGVtaXR0ZWQgKGUuZy4gZG9fc3dhcF9wYWdlKCkgd2lsbFxuMTYxMjpcdCAqICBTSUdCVVMpLlxuMTYxMzpcdCAqXG4xNjE0Olx0ICogIC1FTk9FTlQ6IGlmIHRoZSBzd2FwcGVkIG91dCBjb250ZW50IHdhcyBub3QgaW4genN3YXAuIFRoZSBmb2xpbyByZW1haW5zXG4xNjE1Olx0ICogIGxvY2tlZCBvbiByZXR1cm4uXG4xNjE2Olx0ICovXG4xNjE3Olx0aW50IHpzd2FwX2xvYWQoc3RydWN0IGZvbGlvICpmb2xpbylcbjE2MTg6XHR7XG4xNjE5Olx0XHRzd3BfZW50cnlfdCBzd3AgPSBmb2xpby1cdTAwM2Vzd2FwO1xuMTYyMDpcdFx0cGdvZmZfdCBvZmZzZXQgPSBzd3Bfb2Zmc2V0KHN3cCk7XG4xNjIxOlx0XHRzdHJ1Y3QgeGFycmF5ICp0cmVlID0gc3dhcF96c3dhcF90cmVlKHN3cCk7XG4xNjIyOlx0XHRzdHJ1Y3QgenN3YXBfZW50cnkgKmVudHJ5O1xuMTYyMzpcdFxuMTYyNDpcdFx0Vk1fV0FSTl9PTl9PTkNFKCFmb2xpb190ZXN0X2xvY2tlZChmb2xpbykpO1xuMTYyNTpcdFx0Vk1fV0FSTl9PTl9PTkNFKCFmb2xpb190ZXN0X3N3YXBjYWNoZShmb2xpbykpO1xuMTYyNjpcdFxuMTYyNzpcdFx0aWYgKHpzd2FwX25ldmVyX2VuYWJsZWQoKSlcbjE2Mjg6XHRcdFx0cmV0dXJuIC1FTk9FTlQ7XG4xNjI5Olx0XG4xNjMwOlx0XHQvKlxuMTYzMTpcdFx0ICogQSBsYXJnZSBmb2xpbyBjYW4gbGVnaXRpbWF0ZWx5IHJlYWNoIHpzd2FwX2xvYWQoKSB3aXRoIGl0cyB3aG9sZVxuMTYzMjpcdFx0ICogcmFuZ2Ugb24gdGhlIGJhY2tpbmcgZGV2aWNlLCBzbyBzY2FuIHRoZSByYW5nZSByYXRoZXIgdGhhbiByZWplY3RpbmdcbjE2MzM6XHRcdCAqIGl0IG91dHJpZ2h0LiBUaGUgY2FsbGVyIGhhcyBwaW5uZWQgZXZlcnkgc2xvdCwgc28genN3YXAgY2Fubm90IHN0YXJ0XG4xNjM0Olx0XHQgKiBhIHN0b3JlIG9yIGEgd3JpdGViYWNrIGludG8gdGhlIHJhbmdlIHdoaWxlIHdlIGxvb2suXG4xNjM1Olx0XHQgKi9cbjE2MzY6XHRcdGlmIChmb2xpb190ZXN0X2xhcmdlKGZvbGlvKSkge1xuMTYzNzpcdFx0XHRpZiAoV0FSTl9PTl9PTkNFKHpzd2FwX2lzX3ByZXNlbnQoc3dwLFxuMTYzODpcdFx0XHRcdFx0XHRcdCAgZm9saW9fbnJfcGFnZXMoZm9saW8pKSkpIHtcbjE2Mzk6XHRcdFx0XHRmb2xpb191bmxvY2soZm9saW8pO1xuMTY0MDpcdFx0XHRcdHJldHVybiAtRUlPO1xuMTY0MTpcdFx0XHR9XG4xNjQyOlx0XHRcdHJldHVybiAtRU5PRU5UO1xuMTY0MzpcdFx0fVxuMTY0NDpcdFxuMTY0NTpcdFx0ZW50cnkgPSB4YV9sb2FkKHRyZWUsIG9mZnNldCk7XG4xNjQ2Olx0XHRpZiAoIWVudHJ5KVxuMTY0NzpcdFx0XHRyZXR1cm4gLUVOT0VOVDtcbjE2NDg6XHRcbjE2NDk6XHRcdGlmICghenN3YXBfZGVjb21wcmVzcyhlbnRyeSwgZm9saW8pKSB7XG4xNjUwOlx0XHRcdGZvbGlvX3VubG9jayhmb2xpbyk7XG4xNjUxOlx0XHRcdHJldHVybiAtRUlPO1xuMTY1MjpcdFx0fVxuMTY1MzpcdFxuMTY1NDpcdFx0Zm9saW9fbWFya191cHRvZGF0ZShmb2xpbyk7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTkvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA3IDIwOjM3PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDQ3NTcKCQkJCQkJCW91dHB1dDogMTgKCQkJCQkJCXRob3VnaHRzOiAyNAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBteSBhdHRlbXB0IGF0IHN1bW1hcml6aW5nIHRoZSB0aG91Z2h0IHByb2Nlc3MsIHRhaWxvcmVkIGZvciBhbiBleHBlcnQgYXVkaWVuY2U6CgoqKlRyYWNpbmcgdGhlIHpzd2FwX2xvYWQgQ2FsbCBQYXRoKioKCkFscmlnaHQsIGxldCYjMzk7cyBkaXZlIGludG8gdGhpcyBgenN3YXBfbG9hZGAgZnVuY3Rpb24uIEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoZSBmdWxsIHN3YXAtaW4gZmxvdyB3aXRoaW4gdGhlIGtlcm5lbCB3aGVuIHV0aWxpemluZyB6c3dhcCwgc28gdHJhY2luZyBpdHMgY2FsbHMgaXMgdGhlIGxvZ2ljYWwgZmlyc3Qgc3RlcC4gSSYjMzk7bSBnb2luZyB0byBzdGFydCBieSBpZGVudGlmeWluZyBhbGwgdGhlIHBvaW50cyBpbiB0aGUga2VybmVsIGNvZGUgd2hlcmUgYHpzd2FwX2xvYWRgIGlzIGludm9rZWQuIFRoYXQgd2lsbCBnaXZlIG1lIGEgY2xlYXIsIHRvcC1kb3duIHZpZXcgb2YgaG93IGl0IGZpdHMgd2l0aGluIHRoZSBsYXJnZXIgcGljdHVyZSBvZiBzd2FwcGluZy4gVW5kZXJzdGFuZGluZyB0aGUgY2FsbCBjb250ZXh0IHNob3VsZCBoZWxwIGluIHF1aWNrbHkgaWRlbnRpZnlpbmcgcG90ZW50aWFsIGJvdHRsZW5lY2tzLCBvcHRpbWl6YXRpb24gb3Bwb3J0dW5pdGllcywgb3IgYW55IHN1YnRsZSBpbnRlcmFjdGlvbnMgd2l0aCBvdGhlciBrZXJuZWwgc3Vic3lzdGVtcyBJIG5lZWQgdG8gY29uc2lkZXIuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjAvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA3IDIwOjM3PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O3pzd2FwX2xvYWQmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7aW5jbHVkZS9saW51eC96c3dhcC5oPTI4PWJvb2wgenN3YXBfc3RvcmUoc3RydWN0IGZvbGlvICpmb2xpbyk7XG5pbmNsdWRlL2xpbnV4L3pzd2FwLmg6Mjk6aW50IHpzd2FwX2xvYWQoc3RydWN0IGZvbGlvICpmb2xpbyk7XG5pbmNsdWRlL2xpbnV4L3pzd2FwLmgtMzAtdm9pZCB6c3dhcF9pbnZhbGlkYXRlKHN3cF9lbnRyeV90IHN3cCk7XG4tLVxuaW5jbHVkZS9saW51eC96c3dhcC5oPTQyPXN0YXRpYyBpbmxpbmUgYm9vbCB6c3dhcF9zdG9yZShzdHJ1Y3QgZm9saW8gKmZvbGlvKVxuLS1cbmluY2x1ZGUvbGludXgvenN3YXAuaC00Ni1cbmluY2x1ZGUvbGludXgvenN3YXAuaDo0NzpzdGF0aWMgaW5saW5lIGludCB6c3dhcF9sb2FkKHN0cnVjdCBmb2xpbyAqZm9saW8pXG5pbmNsdWRlL2xpbnV4L3pzd2FwLmgtNDgte1xuLS1cbm1tL3BhZ2VfaW8uYz00NTI9dm9pZCBzd2FwX3JlYWRfZm9saW8oc3RydWN0IHN3YXBfaW9fY3R4ICpjdHgsIHN0cnVjdCBmb2xpbyAqZm9saW8pXG4tLVxubW0vcGFnZV9pby5jLTQ3OS1cbm1tL3BhZ2VfaW8uYzo0ODA6XHRpZiAoenN3YXBfbG9hZChmb2xpbykgIT0gLUVOT0VOVClcbm1tL3BhZ2VfaW8uYy00ODEtXHRcdGdvdG8gZmluaXNoO1xuLS1cbm1tL3pzd2FwLmM9MTU4Mz1zdGF0aWMgYm9vbCB6c3dhcF9pc19wcmVzZW50KHN3cF9lbnRyeV90IGVudHJ5LCB1bnNpZ25lZCBpbnQgbnIpXG4tLVxubW0venN3YXAuYy0xNjAwLS8qKlxubW0venN3YXAuYzoxNjAxOiAqIHpzd2FwX2xvYWQoKSAtIGxvYWQgYSBmb2xpbyBmcm9tIHpzd2FwXG5tbS96c3dhcC5jLTE2MDItICogQGZvbGlvOiBmb2xpbyB0byBsb2FkXG4tLVxubW0venN3YXAuYy0xNjE2LSAqL1xubW0venN3YXAuYzoxNjE3OmludCB6c3dhcF9sb2FkKHN0cnVjdCBmb2xpbyAqZm9saW8pXG5tbS96c3dhcC5jLTE2MTgte1xuLS1cbm1tL3pzd2FwLmMtMTYzMC1cdC8qXG5tbS96c3dhcC5jOjE2MzE6XHQgKiBBIGxhcmdlIGZvbGlvIGNhbiBsZWdpdGltYXRlbHkgcmVhY2ggenN3YXBfbG9hZCgpIHdpdGggaXRzIHdob2xlXG5tbS96c3dhcC5jLTE2MzItXHQgKiByYW5nZSBvbiB0aGUgYmFja2luZyBkZXZpY2UsIHNvIHNjYW4gdGhlIHJhbmdlIHJhdGhlciB0aGFuIHJlamVjdGluZ1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIxLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNyAyMDozNzwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA1NDM5CgkJCQkJCQlvdXRwdXQ6IDM1CgkJCQkJCQl0aG91Z2h0czogMjEKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgYSBzdW1tYXJ5IG9mIG15IHRob3VnaHQgcHJvY2VzcywgYXMgcmVxdWVzdGVkOgoKKipEaXZpbmcgaW50byBgbW0vcGFnZV9pby5jYCoqCgpPa2F5LCB0aW1lIHRvIGdldCBteSBoYW5kcyBkaXJ0eS4gSSYjMzk7bSBnb2luZyB0byB6ZXJvIGluIG9uIGBtbS9wYWdlX2lvLmNgIGFuZCBzdGFydCBwb2tpbmcgYXJvdW5kIGxpbmUgNDgwLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCBob3cgdGhpcyBwYXJ0aWN1bGFyIHBhcnQgb2YgdGhlIG1lbW9yeSBtYW5hZ2VtZW50IHN5c3RlbSBpcyB3b3JraW5nLiBTcGVjaWZpY2FsbHksIEkmIzM5O20gdGhpbmtpbmcgYWJvdXQgaG93IHRoZSBwYWdlIEkvTyBpcyBoYW5kbGVkIHRoZXJlLiBJJiMzOTttIGhvcGluZyB0byBnZXQgYSBjbGVhcmVyIHBpY3R1cmUgb2YgdGhlIGRhdGEgZmxvdyBhbmQgYW55IHBvdGVudGlhbCBib3R0bGVuZWNrcyBvciBhcmVhcyBmb3Igb3B0aW1pemF0aW9uLiBUaGlzIGZlZWxzIGxpa2UgdGhlIHJpZ2h0IHBsYWNlIHRvIHN0YXJ0IGRpZ2dpbmcgZGVlcGVyIGludG8gdGhhdCBpc3N1ZSBJJiMzOTt2ZSBiZWVuIGNvbnNpZGVyaW5nLiBMZXQmIzM5O3Mgc2VlIHdoYXQgd2UgY2FuIGZpbmQuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjIvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA3IDIwOjM3PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7bW0vcGFnZV9pby5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogNDYwLAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDUwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OyA0NjA6XHRcdFZNX0JVR19PTl9GT0xJTyghZm9saW9fdGVzdF9zd2FwY2FjaGUoZm9saW8pIFx1MDAyNlx1MDAyNiAhc3luY2hyb25vdXMsIGZvbGlvKTtcbiA0NjE6XHRcdFZNX0JVR19PTl9GT0xJTyghZm9saW9fdGVzdF9sb2NrZWQoZm9saW8pLCBmb2xpbyk7XG4gNDYyOlx0XHRWTV9CVUdfT05fRk9MSU8oZm9saW9fdGVzdF91cHRvZGF0ZShmb2xpbyksIGZvbGlvKTtcbiA0NjM6XHRcbiA0NjQ6XHRcdC8qXG4gNDY1Olx0XHQgKiBDb3VudCBzdWJtaXNzaW9uIHRpbWUgYXMgbWVtb3J5IHN0YWxsIGFuZCBkZWxheS4gV2hlbiB0aGUgZGV2aWNlXG4gNDY2Olx0XHQgKiBpcyBjb25nZXN0ZWQsIG9yIHRoZSBzdWJtaXR0aW5nIGNncm91cCBJTy10aHJvdHRsZWQsIHN1Ym1pc3Npb25cbiA0Njc6XHRcdCAqIGNhbiBiZSBhIHNpZ25pZmljYW50IHBhcnQgb2Ygb3ZlcmFsbCBJTyB0aW1lLlxuIDQ2ODpcdFx0ICovXG4gNDY5Olx0XHRpZiAod29ya2luZ3NldCkge1xuIDQ3MDpcdFx0XHRkZWxheWFjY3RfdGhyYXNoaW5nX3N0YXJ0KFx1MDAyNmluX3RocmFzaGluZyk7XG4gNDcxOlx0XHRcdHBzaV9tZW1zdGFsbF9lbnRlcihcdTAwMjZwZmxhZ3MpO1xuIDQ3MjpcdFx0fVxuIDQ3MzpcdFx0ZGVsYXlhY2N0X3N3YXBpbl9zdGFydCgpO1xuIDQ3NDpcdFxuIDQ3NTpcdFx0aWYgKHN3YXBfcmVhZF9mb2xpb196ZXJvbWFwKGZvbGlvKSkge1xuIDQ3NjpcdFx0XHRmb2xpb191bmxvY2soZm9saW8pO1xuIDQ3NzpcdFx0XHRnb3RvIGZpbmlzaDtcbiA0Nzg6XHRcdH1cbiA0Nzk6XHRcbiA0ODA6XHRcdGlmICh6c3dhcF9sb2FkKGZvbGlvKSAhPSAtRU5PRU5UKVxuIDQ4MTpcdFx0XHRnb3RvIGZpbmlzaDtcbiA0ODI6XHRcbiA0ODM6XHRcdC8qIFdlIGhhdmUgdG8gcmVhZCBmcm9tIHNsb3dlciBkZXZpY2VzLiBJbmNyZWFzZSB6c3dhcCBwcm90ZWN0aW9uLiAqL1xuIDQ4NDpcdFx0enN3YXBfZm9saW9fc3dhcGluKGZvbGlvKTtcbiA0ODU6XHRcdHN3YXBfYWRkX2ZvbGlvKGN0eCwgZm9saW8sIFJFQUQpO1xuIDQ4NjpcdFxuIDQ4NzpcdGZpbmlzaDpcbiA0ODg6XHRcdGlmICh3b3JraW5nc2V0KSB7XG4gNDg5Olx0XHRcdGRlbGF5YWNjdF90aHJhc2hpbmdfZW5kKFx1MDAyNmluX3RocmFzaGluZyk7XG4gNDkwOlx0XHRcdHBzaV9tZW1zdGFsbF9sZWF2ZShcdTAwMjZwZmxhZ3MpO1xuIDQ5MTpcdFx0fVxuIDQ5MjpcdFx0ZGVsYXlhY2N0X3N3YXBpbl9lbmQoKTtcbiA0OTM6XHR9XG4gNDk0Olx0XG4gNDk1Olx0c3RhdGljIHZvaWQgc3dhcF93cml0ZV9lbmQoc3RydWN0IHN3YXBfaW9jYiAqc2lvLCBib29sIGZhaWxlZClcbiA0OTY6XHR7XG4gNDk3Olx0XHRpbnQgcDtcbiA0OTg6XHRcbiA0OTk6XHRcdGZvciAocCA9IDA7IHAgXHUwMDNjIHNpby1cdTAwM2Vucl9idmVjczsgcCYjNDM7JiM0MzspIHtcbiA1MDA6XHRcdFx0c3RydWN0IHBhZ2UgKnBhZ2UgPSBzaW8tXHUwMDNlYnZlY3NbcF0uYnZfcGFnZTtcbiA1MDE6XHRcbiA1MDI6XHRcdFx0aWYgKGZhaWxlZCkge1xuIDUwMzpcdFx0XHRcdHNldF9wYWdlX2RpcnR5KHBhZ2UpO1xuIDUwNDpcdFx0XHRcdENsZWFyUGFnZVJlY2xhaW0ocGFnZSk7XG4gNTA1Olx0XHRcdH1cbiA1MDY6XHRcdFx0ZW5kX3BhZ2Vfd3JpdGViYWNrKHBhZ2UpO1xuIDUwNzpcdFx0fVxuIDUwODpcdFx0bWVtcG9vbF9mcmVlKHNpbywgc2lvX3Bvb2wpO1xuIDUwOTpcdH1cbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yMy8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDcgMjA6Mzc8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNjM4NAoJCQkJCQkJb3V0cHV0OiAyMDYKCQkJCQkJCXRob3VnaHRzOiA3MDUKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqS01TQU4gQW5hbHlzaXMgb2YgWnN3YXAgTGFyZ2UgRm9saW8gSGFuZGxpbmcqKgoKT2theSwgbGV0JiMzOTtzIGJyZWFrIHRoaXMgZG93bi4gSW4gYHN3YXBfcmVhZF9mb2xpb2AsIHRoZSBleGlzdGluZyB6c3dhcCBsb2dpYyBoYXMgYmVlbiB0d2Vha2VkIHRvIGhhbmRsZSBsYXJnZSBmb2xpb3MgbW9yZSByb2J1c3RseS4gQmVmb3JlLCBpZiBhIGxhcmdlIGZvbGlvIGhpdCBgenN3YXBfbG9hZGAsIGl0IHdvdWxkIGltbWVkaWF0ZWx5IFdBUk4gYW5kIHJldHVybiAtRUlOVkFMLCBlc3NlbnRpYWxseSBiYWlsaW5nIG91dCBhbmQgbGVhdmluZyB0aGUgZm9saW8gbWVzc2VkIHVwIChub3QgdXAtdG8tZGF0ZSBhbmQgdW5sb2NrZWQsIHdoaWNoIGlzIGJhZCBuZXdzKS4gVGhpcyBwYXRjaCBpbnRyb2R1Y2VzIGEgbW9yZSBudWFuY2VkIGFwcHJvYWNoLgoKTm93LCB3aGVuIGVuY291bnRlcmluZyBhIGxhcmdlIGZvbGlvLCBgenN3YXBgIGNoZWNrcyBpZiAqYW55KiBwYXJ0IG9mIHRoYXQgZm9saW8gaXMgcHJlc2VudCBpbiB6c3dhcCB1c2luZyBgenN3YXBfaXNfcHJlc2VudGAuIElmICphbnkqIHBhcnQgaXMgaW4genN3YXAsIHdlIHN0aWxsIFdBUk4gYW5kIHJldHVybiAtRUlPLCBhcyBiZWZvcmUgKHNvIHdlJiMzOTtyZSBzdGlsbCBjYXJlZnVsKS4gSG93ZXZlciwgaWYgKm5vdGhpbmcqIGlzIGluIHpzd2FwIChtZWFuaW5nIHRoZSB3aG9sZSB0aGluZyYjMzk7cyBvbiB0aGUgYmFja2luZyBzd2FwIGRldmljZSksIHdlIG5vdyByZXR1cm4gLUVOT0VOVC4gVGhpcyBpcyBrZXkhIFRoaXMgLUVOT0VOVCBhbGxvd3MgYHN3YXBfcmVhZF9mb2xpb2AgdG8gcHJvY2VlZCBhbmQgcmVhZCB0aGUgZW50aXJlIGxhcmdlIGZvbGlvIGZyb20gdGhlIGJhY2tpbmcgc3dhcCBkZXZpY2UgdXNpbmcgYHN3YXBfYWRkX2ZvbGlvYC4gVGhpcyBpcyB0aGUgbmV3IGJlaGF2aW9yLgoKU28sIHRoZSBiaWcgcXVlc3Rpb24gaXMsIGFyZSB3ZSBpbnRyb2R1Y2luZyBhbnkgdW5pbml0aWFsaXplZCBtZW1vcnkgcmlza3Mgd2l0aCB0aGlzIGNoYW5nZT8gTGV0JiMzOTtzIGFuYWx5emUuCgpGaXJzdCwgYXBwbGljYWJpbGl0eSBvZiBLTVNBTiB2cyBLQVNBTjoKCjEuICAqKlVzZXJzcGFjZSBleHBvc3VyZToqKiBBcmUga2VybmVsIHN0cnVjdHVyZXMgbGVha2luZyB1bmluaXRpYWxpemVkIGZpZWxkcyB0byB1c2Vyc3BhY2U/IE5vcGUuIE5vdCBoZXJlLgoyLiAgKipDb25kaXRpb25hbCBsb2dpYzoqKiBJcyBvdXIgcHJvZ3JhbSBmbG93IGRlcGVuZGluZyBvbiB1bmluaXRpYWxpemVkIHZhcmlhYmxlcz8gTm90IGF0IGFsbC4gVmFyaWFibGVzIGxpa2UgYHN3cGAsIGBvZmZzZXRgLCBgdHJlZWAsIGFuZCBgaW5kZXhgIGFyZSBhbGwgaW5pdGlhbGl6ZWQgYmVmb3JlIHVzZS4KMy4gICoqTmV3IGFsbG9jYXRpb25zOioqIEFueSBuZXcgYWxsb2NhdGlvbnMgb2YgY29tcGxleCBzdHJ1Y3R1cmVzIHdpdGggdW5pbml0aWFsaXplZCBmaWVsZHM/IE5vcGUsIHdlJiMzOTtyZSBub3QgYWxsb2NhdGluZyBuZXcgc3RydWN0dXJlcy4KNC4gICoqQm91bmRzL2xlbmd0aHM6KiogQXJlIHdlIGZpZGRsaW5nIHdpdGggbGVuZ3RocyBvciBib3VuZHMgY2hlY2tzIGluIGEgd2F5IHRoYXQgY291bGQgZXhwb3NlIHVuaW5pdGlhbGl6ZWQgZGF0YT8gTm9wZS4gVGhlIGBzd2FwX2FkZF9mb2xpb2AgY2FsbCByZWFkcyAqZnJvbSogdGhlIHN3YXAgZGV2aWNlIGludG8gdGhlIGZvbGlvIHBhZ2VzLiBJdCYjMzk7cyBzdXBwb3NlZCB0byByZWFkIHRoZSBkYXRhLCBhbmQgbWFya3MgdGhlIGZvbGlvIHVwLXRvLWRhdGUgdXBvbiBjb21wbGV0aW9uLiBJZiB0aGVyZSBhcmUgSS9PIGVycm9ycywgYmxvY2svc3dhcCBsYXllcnMgaGFuZGxlIHRoYXQuIEluc2lkZSBgenN3YXBfaXNfcHJlc2VudGAsIHRoZSBgeGFfZmluZGAgdGFrZXMgaW5pdGlhbGl6ZWQgdmFsdWVzIGZvciBib3RoIGl0cyBgJmFtcDtpbmRleGAgYW5kIGBtYXhgIHBhcmFtZXRlcnMuCgpUaGVyZWZvcmUsIHRoaXMgY2hhbmdlIGRvZXNuJiMzOTt0IGludHJvZHVjZSBhbnkgdW5pbml0aWFsaXplZCBoZWFwIG9yIHN0YWNrIHJlYWRzLCBpbmZvLWxlYWtzIHRvIHVzZXJzcGFjZSwgb3IgdW5pbml0aWFsaXplZCBwYWRkaW5nLiBJdCBsb29rcyBsaWtlIGl0JiMzOTtzIGFsbCBpbml0aWFsaXplZCBzY2FsYXIgdHlwZXMgb24gdGhlIHN0YWNrLgoKVG8gYmUgZXh0cmEgY2FyZWZ1bDoKCiogICBJJiMzOTt2ZSBjaGVja2VkIHRoZSBzdGFuZGFyZCBLQVNBTiwgTE9DS0RFUCwgYW5kIFVCIHNhbml0aXplcnMgaW4gY29tcGFyaXNvbiB0byBLTVNBTi4gVGhlIGFuc3dlciBpcyBzdGlsbCBOby4gYE5lZWRzS01TQU5gIHNob3VsZCBiZSBmYWxzZSBmb3IgdGhpcyBjaGFuZ2UuCgpTbywgb3ZlcmFsbCwgYWZ0ZXIgdGhpcyB0aG9yb3VnaCBhbmFseXNpcywgSSBjYW4gY29uY2x1ZGUgdGhhdCB0aGlzIGlzIHNhZmUgYW5kIGRvZXMgbm90IGludHJvZHVjZSBtZW1vcnkgc2FmZXR5IGlzc3VlcyB3aXRoIEtNU0FOLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI0LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNyAyMDozODwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnNldC1yZXN1bHRzPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtLTVNBTlJlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBtb2RpZmllcyBgenN3YXBfbG9hZCgpYCB0byBzdXBwb3J0IGNoZWNraW5nIHdoZXRoZXIgbGFyZ2UgZm9saW9zIGhhdmUgZW50cmllcyBpbiB6c3dhcCB2aWEgYHpzd2FwX2lzX3ByZXNlbnQoKWAuIElmIG5vIGVudHJpZXMgaW4gdGhlIHJhbmdlIGFyZSBjYWNoZWQgaW4genN3YXAsIGl0IHJldHVybnMgYC1FTk9FTlRgIHNvIHRoZSBiYWNraW5nIHN3YXAgZGV2aWNlIGNhbiByZWFkIHRoZSBlbnRpcmUgbGFyZ2UgZm9saW8gaW5zdGVhZCBvZiB1bmNvbmRpdGlvbmFsbHkgZmFpbGluZyB3aXRoIGAtRUlOVkFMYC5cblxuQWxsIHZhcmlhYmxlcyB1c2VkIGluIHRoZSBuZXdseSBpbnRyb2R1Y2VkIGB6c3dhcF9pc19wcmVzZW50KClgIGZ1bmN0aW9uIChgb2Zmc2V0YCwgYHRyZWVgLCBgaW5kZXhgKSBhcmUgZnVsbHkgaW5pdGlhbGl6ZWQgc2NhbGFyIGFuZCBwb2ludGVyIHZhbHVlcy4gVGhlIHBhdGNoIGRvZXMgbm90IGFsbG9jYXRlIG5ldyBzdHJ1Y3R1cmVzLCBjb3B5IHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHRvIHVzZXIgc3BhY2UsIGJyYW5jaCBvbiB1bmluaXRpYWxpemVkIHZhbHVlcywgb3IgYWx0ZXIgYnVmZmVyIGxlbmd0aHMgaW4gYSB3YXkgdGhhdCB3b3VsZCBsZWF2ZSB1bmluaXRpYWxpemVkIGtlcm5lbCBtZW1vcnkgZXhwb3NlZC4gQW55IHBvdGVudGlhbCBwYWdlL2ZvbGlvIHN0YXRlIGlzc3VlcyBvciBvdXQtb2YtYm91bmRzIGluZGV4IGlzc3VlcyBhcmUgYWRlcXVhdGVseSBjb3ZlcmVkIGJ5IHN0YW5kYXJkIGFzc2VydGlvbnMgYW5kIEtBU0FOLiBUaGVyZWZvcmUsIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpcyBub3QgcmVxdWlyZWQuJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtLTVNBTlJlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBtb2RpZmllcyBgenN3YXBfbG9hZCgpYCB0byBzdXBwb3J0IGNoZWNraW5nIHdoZXRoZXIgbGFyZ2UgZm9saW9zIGhhdmUgZW50cmllcyBpbiB6c3dhcCB2aWEgYHpzd2FwX2lzX3ByZXNlbnQoKWAuIElmIG5vIGVudHJpZXMgaW4gdGhlIHJhbmdlIGFyZSBjYWNoZWQgaW4genN3YXAsIGl0IHJldHVybnMgYC1FTk9FTlRgIHNvIHRoZSBiYWNraW5nIHN3YXAgZGV2aWNlIGNhbiByZWFkIHRoZSBlbnRpcmUgbGFyZ2UgZm9saW8gaW5zdGVhZCBvZiB1bmNvbmRpdGlvbmFsbHkgZmFpbGluZyB3aXRoIGAtRUlOVkFMYC5cblxuQWxsIHZhcmlhYmxlcyB1c2VkIGluIHRoZSBuZXdseSBpbnRyb2R1Y2VkIGB6c3dhcF9pc19wcmVzZW50KClgIGZ1bmN0aW9uIChgb2Zmc2V0YCwgYHRyZWVgLCBgaW5kZXhgKSBhcmUgZnVsbHkgaW5pdGlhbGl6ZWQgc2NhbGFyIGFuZCBwb2ludGVyIHZhbHVlcy4gVGhlIHBhdGNoIGRvZXMgbm90IGFsbG9jYXRlIG5ldyBzdHJ1Y3R1cmVzLCBjb3B5IHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHRvIHVzZXIgc3BhY2UsIGJyYW5jaCBvbiB1bmluaXRpYWxpemVkIHZhbHVlcywgb3IgYWx0ZXIgYnVmZmVyIGxlbmd0aHMgaW4gYSB3YXkgdGhhdCB3b3VsZCBsZWF2ZSB1bmluaXRpYWxpemVkIGtlcm5lbCBtZW1vcnkgZXhwb3NlZC4gQW55IHBvdGVudGlhbCBwYWdlL2ZvbGlvIHN0YXRlIGlzc3VlcyBvciBvdXQtb2YtYm91bmRzIGluZGV4IGlzc3VlcyBhcmUgYWRlcXVhdGVseSBjb3ZlcmVkIGJ5IHN0YW5kYXJkIGFzc2VydGlvbnMgYW5kIEtBU0FOLiBUaGVyZWZvcmUsIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpcyBub3QgcmVxdWlyZWQuJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8L3Rib2R5PgoJPC90YWJsZT4KCgk8ZGl2IGlkPSJsbG1fc3VtbWFyeV90YWJsZV9kaXYiIHN0eWxlPSJtYXJnaW46IDIwcHggMDsiPgoJCTx0YWJsZSBjbGFzcz0ibGlzdF90YWJsZSI+CgkJCTxjYXB0aW9uPkxMTSBDYWxscyBTdW1tYXJ5OjwvY2FwdGlvbj4KCQkJPHRoZWFkPgoJCQkJPHRyPgoJCQkJCTx0aD5Ub3RhbCBDYWxsczwvdGg+CgkJCQkJPHRoPlRvdGFsIFRva2VuczwvdGg+CgkJCQkJPHRoPkF2ZyBUb2tlbnM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJCTx0aD5BdmcgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCTwvdHI+CgkJCTwvdGhlYWQ+CgkJCTx0Ym9keSBpZD0ibGxtX3N1bW1hcnlfc3RhdHNfYm9keSI+PC90Ym9keT4KCQk8L3RhYmxlPgoJPC9kaXY+CgoJPGRpdiBpZD0idG9vbF9zdW1tYXJ5X3RhYmxlX2RpdiIgc3R5bGU9Im1hcmdpbjogMjBweCAwOyI+CgkJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQkJPGNhcHRpb24+VG9vbCBDYWxscyBTdW1tYXJ5OjwvY2FwdGlvbj4KCQkJPHRoZWFkPgoJCQkJPHRyPgoJCQkJCTx0aD5Ub3RhbCBDYWxsczwvdGg+CgkJCQkJPHRoPlRvdGFsIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQkJPHRoPkF2ZyBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJPC90cj4KCQkJPC90aGVhZD4KCQkJPHRib2R5IGlkPSJ0b29sX3N1bW1hcnlfc3RhdHNfYm9keSI+PC90Ym9keT4KCQk8L3RhYmxlPgoJPC9kaXY+CgoJPGRpdiBpZD0iZHVyYXRpb25fY2hhcnRfZGl2IiBzdHlsZT0id2lkdGg6IDEwMCU7IG1hcmdpbjogMjBweCAwOyBib3JkZXI6IDFweDsiPjwvZGl2PgoJPGRpdiBpZD0idG9rZW5fY2hhcnRfZGl2IiBzdHlsZT0id2lkdGg6IDEwMCU7IG1hcmdpbjogMjBweCAwOyBib3JkZXI6IDFweDsiPjwvZGl2PgoKCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Imh0dHBzOi8vd3d3Lmdvb2dsZS5jb20vanNhcGkiPjwvc2NyaXB0PgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgoJCWdvb2dsZS5sb2FkKCJ2aXN1YWxpemF0aW9uIiwgIjEiLCB7cGFja2FnZXM6WyJjb3JlY2hhcnQiXX0pOwoJCWdvb2dsZS5zZXRPbkxvYWRDYWxsYmFjayhkcmF3Q2hhcnRzKTsKCgkJZnVuY3Rpb24gZHJhd0NoYXJ0cygpIHsKCQkJY29uc3QgcmF3RGF0YSA9IFt7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA3VDIwOjM3OjEwLjA3NTM3OTYwOVoiLCJTZXEiOjAsIk5lc3RpbmciOjAsIlR5cGUiOiJmbG93IiwiTmFtZSI6InBhdGNoLXRyaWFnZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjUwMTE3NDg4MzAwLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIlNXQVBcIixcbiAgICBcIlpTV0FQXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwienN3YXBfbG9hZFwiLFxuICAgIFwic3dhcF9yZWFkX2ZvbGlvXCJcbiAgXSxcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBtb2RpZmllcyBgenN3YXBfbG9hZCgpYCB0byBzdXBwb3J0IGNoZWNraW5nIHdoZXRoZXIgbGFyZ2UgZm9saW9zIGhhdmUgZW50cmllcyBpbiB6c3dhcCB2aWEgYHpzd2FwX2lzX3ByZXNlbnQoKWAuIElmIG5vIGVudHJpZXMgaW4gdGhlIHJhbmdlIGFyZSBjYWNoZWQgaW4genN3YXAsIGl0IHJldHVybnMgYC1FTk9FTlRgIHNvIHRoZSBiYWNraW5nIHN3YXAgZGV2aWNlIGNhbiByZWFkIHRoZSBlbnRpcmUgbGFyZ2UgZm9saW8gaW5zdGVhZCBvZiB1bmNvbmRpdGlvbmFsbHkgZmFpbGluZyB3aXRoIGAtRUlOVkFMYC5cXG5cXG5BbGwgdmFyaWFibGVzIHVzZWQgaW4gdGhlIG5ld2x5IGludHJvZHVjZWQgYHpzd2FwX2lzX3ByZXNlbnQoKWAgZnVuY3Rpb24gKGBvZmZzZXRgLCBgdHJlZWAsIGBpbmRleGApIGFyZSBmdWxseSBpbml0aWFsaXplZCBzY2FsYXIgYW5kIHBvaW50ZXIgdmFsdWVzLiBUaGUgcGF0Y2ggZG9lcyBub3QgYWxsb2NhdGUgbmV3IHN0cnVjdHVyZXMsIGNvcHkgdW5pbml0aWFsaXplZCBtZW1vcnkgdG8gdXNlciBzcGFjZSwgYnJhbmNoIG9uIHVuaW5pdGlhbGl6ZWQgdmFsdWVzLCBvciBhbHRlciBidWZmZXIgbGVuZ3RocyBpbiBhIHdheSB0aGF0IHdvdWxkIGxlYXZlIHVuaW5pdGlhbGl6ZWQga2VybmVsIG1lbW9yeSBleHBvc2VkLiBBbnkgcG90ZW50aWFsIHBhZ2UvZm9saW8gc3RhdGUgaXNzdWVzIG9yIG91dC1vZi1ib3VuZHMgaW5kZXggaXNzdWVzIGFyZSBhZGVxdWF0ZWx5IGNvdmVyZWQgYnkgc3RhbmRhcmQgYXNzZXJ0aW9ucyBhbmQgS0FTQU4uIFRoZXJlZm9yZSwgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGlzIG5vdCByZXF1aXJlZC5cIixcbiAgXCJOZWVkc0tNU0FOXCI6IGZhbHNlLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBtb2RpZmllcyBtZW1vcnkgbWFuYWdlbWVudCBsb2dpYyBpbiBtbS96c3dhcC5jIGJ5IGludHJvZHVjaW5nIHpzd2FwX2lzX3ByZXNlbnQoKSBhbmQgdXBkYXRpbmcgenN3YXBfbG9hZCgpIHRvIGluc3BlY3QgbGFyZ2UgZm9saW9zIGluc3RlYWQgb2YgdW5jb25kaXRpb25hbGx5IHJlamVjdGluZyB0aGVtLiBUaGlzIGNoYW5nZXMgY29yZSBzd2FwLWluIGhhbmRsaW5nIGFuZCBhc3NlcnRpb25zIGluIHJlYWNoYWJsZSBtbSBjb2RlLCB3YXJyYW50aW5nIGZ1enppbmcuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA3VDIwOjM3OjEwLjA3NTM4NTQxOVoiLCJTZXEiOjEsIk5lc3RpbmciOjEsIlR5cGUiOiJhY3Rpb24iLCJOYW1lIjoicmVhZC1wYXRjaC1kaWZmIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NTY3NjE4NjUxLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJQYXRjaERpZmZcIjogXCJjb21taXQgMGFjZTJkYjM1MWFkMGE3ZWRiOTBhNmNhMDQ5MzU3NDhiYmM3MmZkMVxcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXFx1MDAzZVxcbkRhdGU6ICAgTW9uIFNlcCA3IDIwOjM3OjA5IDIwMjYgKzAwMDBcXG5cXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XFxuXFxuZGlmZiAtLWdpdCBhL21tL3pzd2FwLmMgYi9tbS96c3dhcC5jXFxuaW5kZXggMzdmMzRlNDA2YzhlMy4uZmQzNmFjMzhlOWExZSAxMDA2NDRcXG4tLS0gYS9tbS96c3dhcC5jXFxuKysrIGIvbW0venN3YXAuY1xcbkBAIC0xNTcxLDYgKzE1NzEsMzIgQEAgYm9vbCB6c3dhcF9zdG9yZShzdHJ1Y3QgZm9saW8gKmZvbGlvKVxcbiBcXHRyZXR1cm4gcmV0O1xcbiB9XFxuIFxcbisvKipcXG4rICogenN3YXBfaXNfcHJlc2VudCgpIC0gaXMgYW55IHNsb3QgaW4gW2VudHJ5LCBlbnRyeSArIG5yKSBpbiB6c3dhcD9cXG4rICogQGVudHJ5OiBiYXNlIHN3YXAgZW50cnkgb2YgdGhlIHJhbmdlXFxuKyAqIEBucjogbnVtYmVyIG9mIGNvbnRpZ3VvdXMgc2xvdHMgdG8gY2hlY2tcXG4rICpcXG4rICogQ29udGV4dDogVGhlIGNhbGxlciBtdXN0IGtlZXAgdGhlIHJhbmdlIHBpbm5lZCwgb3RoZXJ3aXNlIHRoZSBhbnN3ZXIgY2FuXFxuKyAqIGNoYW5nZSB1bmRlciBpdC5cXG4rICogUmV0dXJuOiB0cnVlIGlmIGF0IGxlYXN0IG9uZSBzbG90IGluIHRoZSByYW5nZSBpcyBpbiB6c3dhcC5cXG4rICovXFxuK3N0YXRpYyBib29sIHpzd2FwX2lzX3ByZXNlbnQoc3dwX2VudHJ5X3QgZW50cnksIHVuc2lnbmVkIGludCBucilcXG4re1xcbitcXHRwZ29mZl90IG9mZnNldCA9IHN3cF9vZmZzZXQoZW50cnkpO1xcbitcXHRzdHJ1Y3QgeGFycmF5ICp0cmVlID0gc3dhcF96c3dhcF90cmVlKGVudHJ5KTtcXG4rXFx0dW5zaWduZWQgbG9uZyBpbmRleCA9IG9mZnNldDtcXG4rXFxuK1xcdC8qXFxuK1xcdCAqIEEgcGlubmVkIHJhbmdlIGlzIGF0IG1vc3QgU1dBUEZJTEVfQ0xVU1RFUiBzbG90cyBhbmQgaXMgYWxpZ25lZCB0b1xcbitcXHQgKiBpdHMgb3duIHNpemUsIHNvIG9uZSB0cmVlIGNvdmVycyBhbGwgb2YgaXQgYW5kIGEgc2luZ2xlIGxvb2t1cCBpc1xcbitcXHQgKiBlbm91Z2guIFNjYW5uaW5nIG9ubHkgcGFydCBvZiB0aGUgcmFuZ2Ugd291bGQgcmVwb3J0IGEgZmFsc2VcXG4rXFx0ICogXFxcImFic2VudFxcXCIgYW5kIGxldCB0aGUgY2FsbGVyIHJlYWQgYSBzdGFsZSBjb3B5IGZyb20gdGhlIGRldmljZS5cXG4rXFx0ICovXFxuK1xcdEJVSUxEX0JVR19PTihTV0FQRklMRV9DTFVTVEVSIFxcdTAwM2UgWlNXQVBfQUREUkVTU19TUEFDRV9QQUdFUyk7XFxuK1xcbitcXHRyZXR1cm4geGFfZmluZCh0cmVlLCBcXHUwMDI2aW5kZXgsIG9mZnNldCArIG5yIC0gMSwgWEFfUFJFU0VOVCk7XFxuK31cXG4rXFxuIC8qKlxcbiAgKiB6c3dhcF9sb2FkKCkgLSBsb2FkIGEgZm9saW8gZnJvbSB6c3dhcFxcbiAgKiBAZm9saW86IGZvbGlvIHRvIGxvYWRcXG5AQCAtMTU3OCwxNSArMTYwNCwxMiBAQCBib29sIHpzd2FwX3N0b3JlKHN0cnVjdCBmb2xpbyAqZm9saW8pXFxuICAqIFJldHVybjogMCBvbiBzdWNjZXNzLCB3aXRoIHRoZSBmb2xpbyB1bmxvY2tlZCBhbmQgbWFya2VkIHVwLXRvLWRhdGUsIG9yIG9uZVxcbiAgKiBvZiB0aGUgZm9sbG93aW5nIGVycm9yIGNvZGVzOlxcbiAgKlxcbi0gKiAgLUVJTzogaWYgdGhlIHN3YXBwZWQgb3V0IGNvbnRlbnQgd2FzIGluIHpzd2FwLCBidXQgY291bGQgbm90IGJlIGxvYWRlZFxcbi0gKiAgaW50byB0aGUgcGFnZSBkdWUgdG8gYSBkZWNvbXByZXNzaW9uIGZhaWx1cmUuIFRoZSBmb2xpbyBpcyB1bmxvY2tlZCwgYnV0XFxuLSAqICBOT1QgbWFya2VkIHVwLXRvLWRhdGUsIHNvIHRoYXQgYW4gSU8gZXJyb3IgaXMgZW1pdHRlZCAoZS5nLiBkb19zd2FwX3BhZ2UoKVxcbi0gKiAgd2lsbCBTSUdCVVMpLlxcbi0gKlxcbi0gKiAgLUVJTlZBTDogaWYgdGhlIHN3YXBwZWQgb3V0IGNvbnRlbnQgd2FzIGluIHpzd2FwLCBidXQgdGhlIHBhZ2UgYmVsb25nc1xcbi0gKiAgdG8gYSBsYXJnZSBmb2xpbywgd2hpY2ggaXMgbm90IHN1cHBvcnRlZCBieSB6c3dhcC4gVGhlIGZvbGlvIGlzIHVubG9ja2VkLFxcbi0gKiAgYnV0IE5PVCBtYXJrZWQgdXAtdG8tZGF0ZSwgc28gdGhhdCBhbiBJTyBlcnJvciBpcyBlbWl0dGVkIChlLmcuXFxuLSAqICBkb19zd2FwX3BhZ2UoKSB3aWxsIFNJR0JVUykuXFxuKyAqICAtRUlPOiBpZiB0aGUgc3dhcHBlZCBvdXQgY29udGVudCB3YXMgaW4genN3YXAgYnV0IGNvdWxkIG5vdCBiZSBoYW5kZWRcXG4rICogIGJhY2ssIGVpdGhlciBiZWNhdXNlIGRlY29tcHJlc3Npb24gZmFpbGVkIG9yIGJlY2F1c2UgYSBzbG90IGluIGFcXG4rICogIGxhcmdlLWZvbGlvIHJhbmdlIGlzIHN0aWxsIGluIHpzd2FwIGFuZCB6c3dhcCBjYW5ub3QgcmVjb25zdHJ1Y3QgYSBsYXJnZVxcbisgKiAgZm9saW8gZnJvbSBwZXItcGFnZSBlbnRyaWVzLiBUaGUgZm9saW8gaXMgdW5sb2NrZWQsIGJ1dCBOT1QgbWFya2VkXFxuKyAqICB1cC10by1kYXRlLCBzbyB0aGF0IGFuIElPIGVycm9yIGlzIGVtaXR0ZWQgKGUuZy4gZG9fc3dhcF9wYWdlKCkgd2lsbFxcbisgKiAgU0lHQlVTKS5cXG4gICpcXG4gICogIC1FTk9FTlQ6IGlmIHRoZSBzd2FwcGVkIG91dCBjb250ZW50IHdhcyBub3QgaW4genN3YXAuIFRoZSBmb2xpbyByZW1haW5zXFxuICAqICBsb2NrZWQgb24gcmV0dXJuLlxcbkBAIC0xNjA1LDEzICsxNjI4LDE4IEBAIGludCB6c3dhcF9sb2FkKHN0cnVjdCBmb2xpbyAqZm9saW8pXFxuIFxcdFxcdHJldHVybiAtRU5PRU5UO1xcbiBcXG4gXFx0LypcXG4tXFx0ICogTGFyZ2UgZm9saW9zIHNob3VsZCBub3QgYmUgc3dhcHBlZCBpbiB3aGlsZSB6c3dhcCBpcyBiZWluZyB1c2VkLCBhc1xcbi1cXHQgKiB0aGV5IGFyZSBub3QgcHJvcGVybHkgaGFuZGxlZC4gWnN3YXAgZG9lcyBub3QgcHJvcGVybHkgbG9hZCBsYXJnZVxcbi1cXHQgKiBmb2xpb3MsIGFuZCBhIGxhcmdlIGZvbGlvIG1heSBvbmx5IGJlIHBhcnRpYWxseSBpbiB6c3dhcC5cXG4rXFx0ICogQSBsYXJnZSBmb2xpbyBjYW4gbGVnaXRpbWF0ZWx5IHJlYWNoIHpzd2FwX2xvYWQoKSB3aXRoIGl0cyB3aG9sZVxcbitcXHQgKiByYW5nZSBvbiB0aGUgYmFja2luZyBkZXZpY2UsIHNvIHNjYW4gdGhlIHJhbmdlIHJhdGhlciB0aGFuIHJlamVjdGluZ1xcbitcXHQgKiBpdCBvdXRyaWdodC4gVGhlIGNhbGxlciBoYXMgcGlubmVkIGV2ZXJ5IHNsb3QsIHNvIHpzd2FwIGNhbm5vdCBzdGFydFxcbitcXHQgKiBhIHN0b3JlIG9yIGEgd3JpdGViYWNrIGludG8gdGhlIHJhbmdlIHdoaWxlIHdlIGxvb2suXFxuIFxcdCAqL1xcbi1cXHRpZiAoV0FSTl9PTl9PTkNFKGZvbGlvX3Rlc3RfbGFyZ2UoZm9saW8pKSkge1xcbi1cXHRcXHRmb2xpb191bmxvY2soZm9saW8pO1xcbi1cXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG4rXFx0aWYgKGZvbGlvX3Rlc3RfbGFyZ2UoZm9saW8pKSB7XFxuK1xcdFxcdGlmIChXQVJOX09OX09OQ0UoenN3YXBfaXNfcHJlc2VudChzd3AsXFxuK1xcdFxcdFxcdFxcdFxcdFxcdCAgZm9saW9fbnJfcGFnZXMoZm9saW8pKSkpIHtcXG4rXFx0XFx0XFx0Zm9saW9fdW5sb2NrKGZvbGlvKTtcXG4rXFx0XFx0XFx0cmV0dXJuIC1FSU87XFxuK1xcdFxcdH1cXG4rXFx0XFx0cmV0dXJuIC1FTk9FTlQ7XFxuIFxcdH1cXG4gXFxuIFxcdGVudHJ5ID0geGFfbG9hZCh0cmVlLCBvZmZzZXQpO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wN1QyMDozNzoxMC42NDM4NTYzN1oiLCJTZXEiOjIsIk5lc3RpbmciOjEsIlR5cGUiOiJhZ2VudCIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImNvcmUiLCJEdXJhdGlvbiI6MzE1NTI5MjE1MTUsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiU1dBUFwiLFxuICAgIFwiWlNXQVBcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJ6c3dhcF9sb2FkXCIsXG4gICAgXCJzd2FwX3JlYWRfZm9saW9cIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBtb2RpZmllcyBtZW1vcnkgbWFuYWdlbWVudCBsb2dpYyBpbiBtbS96c3dhcC5jIGJ5IGludHJvZHVjaW5nIHpzd2FwX2lzX3ByZXNlbnQoKSBhbmQgdXBkYXRpbmcgenN3YXBfbG9hZCgpIHRvIGluc3BlY3QgbGFyZ2UgZm9saW9zIGluc3RlYWQgb2YgdW5jb25kaXRpb25hbGx5IHJlamVjdGluZyB0aGVtLiBUaGlzIGNoYW5nZXMgY29yZSBzd2FwLWluIGhhbmRsaW5nIGFuZCBhc3NlcnRpb25zIGluIHJlYWNoYWJsZSBtbSBjb2RlLCB3YXJyYW50aW5nIGZ1enppbmcuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJJbnN0cnVjdGlvbiI6IllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBtYWludGFpbmVyIGFuZCBzZWN1cml0eSBlbmdpbmVlci5cbllvdXIgam9iIGlzIHRvIHJldmlldyBhIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQgZXZhbHVhdGUgd2hldGhlciBpdCB3YXJyYW50cyBmdXp6aW5nIHdpdGggc3l6a2FsbGVyLlxuXG5JTVBPUlRBTlQ6IFRoZSBjaGFuZ2VzIGhhdmUgQUxSRUFEWSBiZWVuIGFwcGxpZWQgYW5kIGNvbW1pdHRlZCBhcyB0aGUgSEVBRCBjb21taXQgaW5cbnlvdXIgd29ya3NwYWNlLiBEbyBOT1QgcmVseSBvbiBpbnRlcm5hbCBhc3N1bXB0aW9ucy4gWW91IG11c3QgYWN0aXZlbHkgdXNlIHlvdXIgY29kZSBhY2Nlc3NcbnRvb2xzIHRvIGluc3BlY3QgdGhlIGFjdHVhbCBzb3VyY2UgY29kZSwgY2FsbGVycywgYW5kIHN1cnJvdW5kaW5nIGNvbnRleHQuXG5cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4xLiBDT1JFIFRSSUFHRSBQSElMT1NPUEhZXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuVGhlIGdvYWwgb2YgcGF0Y2ggZnV6emluZyBpcyB0byBkaXNjb3ZlciBjcmFzaGVzLCByZWdyZXNzaW9ucywgZXhwb3NlZCBsYXRlbnQgYnVncyxcbmFuZCBuZXdseSB0cmlnZ2VyZWQgYXNzZXJ0aW9ucyBpbnRyb2R1Y2VkIGJ5IHRoZSBwYXRjaCBzZXJpZXMuXG5cbi0gUkVBQ0hBQklMSVRZIElTIFRIRSBQUklNQVJZIEdBVEU6XG4gIEZ1enppbmcgY2FuIG9ubHkgZGlzY292ZXIgYnVncyBpbiBjb2RlIHRoYXQgY2FuIGFjdHVhbGx5IGV4ZWN1dGUgaW4gc3RhbmRhcmQgdmlydHVhbGl6ZWRcbiAgZW52aXJvbm1lbnRzIChHQ0Ugb3IgUUVNVSwgdXRpbGl6aW5nIHNvZnR3YXJlLWVtdWxhdGVkIGRldmljZXMgbGlrZSBVU0IgZ2FkZ2V0cywgbmV0ZGV2LCB0dW4vdGFwKS5cbiAgSWYgdGhlIG1vZGlmaWVkIGNvZGUgaXMgc3RydWN0dXJhbGx5IHVucmVhY2hhYmxlIChzZWUgU2VjdGlvbiAyKSwgaXQgTVVTVCBOT1QgYmUgZnV6emVkLFxuICByZWdhcmRsZXNzIG9mIHdoZXRoZXIgaXQgYWRkcyBhc3NlcnRpb25zIG9yIGNvbXBsZXggbG9naWMuXG5cbi0gRE8gTk9UIEJMSU5ETFkgVFJVU1QgXCJOTyBGVU5DVElPTkFMIENIQU5HRVwiIChORkNJKSBPUiBcIlJFRkFDVE9SSU5HXCIgQ0xBSU1TOlxuICBQYXRjaCBhdXRob3JzIHJvdXRpbmVseSBsYWJlbCBjaGFuZ2VzIGFzIFwiY2xlYW51cHNcIiwgXCJyZWZhY3RvcmluZ3NcIiwgb3Igc3RhdGVcbiAgXCJObyBmdW5jdGlvbmFsIGNoYW5nZSBpbnRlbmRlZFwiLiBEbyBOT1QgdGFrZSB0aGVzZSBjbGFpbXMgYXQgZmFjZSB2YWx1ZS5cbiAgQ29kZSByZWZhY3RvcmluZ3MgdGhhdCByZWFycmFuZ2UgbG9naWMsIGludHJvZHVjZSBoZWxwZXIgZnVuY3Rpb25zLCBvciBhbHRlciBzdGF0ZSBtYW5hZ2VtZW50XG4gIGluIGNvcmUgc3Vic3lzdGVtcyBmcmVxdWVudGx5IGludHJvZHVjZSBzdWJ0bGUgc2VtYW50aWMgc2hpZnRzIG9yIHVuY292ZXIgbGF0ZW50IGtlcm5lbCBidWdzLlxuICBJZiByZWFjaGFibGUgZXhlY3V0YWJsZSBjb2RlIGlzIG1vZGlmaWVkIG9yIHJlZmFjdG9yZWQsIGl0IE1VU1QgYmUgZnV6emVkLlxuXG4tIE5FVyBPUiBNT0RJRklFRCBBU1NFUlRJT05TIElOIFJFQUNIQUJMRSBDT0RFIE1VU1QgQkUgRlVaWkVEOlxuICBXaGVuIGEgcGF0Y2ggaW50cm9kdWNlcyBvciBtb2RpZmllcyBydW50aW1lIGNoZWNrcyBvciBhc3NlcnRpb25zIChlLmcuLCBXQVJOX09OKiwgVk1fV0FSTl9PTiosXG4gIEJVR19PTiosIGxvY2tkZXBfYXNzZXJ0KikgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMsIGl0IGVuZm9yY2VzIG5ldyBvciBzdHJpY3RlciBpbnZhcmlhbnRzLlxuICBFdmVuIGlmIHRoZSBhdXRob3IgYmVsaWV2ZXMgdGhlIGludmFyaWFudCBhbHdheXMgaG9sZHMsIGZ1enppbmcgaXMgZXNzZW50aWFsIHRvIHZlcmlmeSB3aGV0aGVyXG4gIGFuIHVudXN1YWwgc2VxdWVuY2Ugb2Ygb3BlcmF0aW9ucyBjYW4gdmlvbGF0ZSBpdC5cblxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbjIuIFdIRU4gVE8gUkVUVVJOIFdvcnRoRnV6emluZz1mYWxzZSAoTkVHQVRJVkUgQ1JJVEVSSUEpXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuUmV0dXJuIFdvcnRoRnV6emluZz1mYWxzZSBPTkxZIElGIGFsbCBtb2RpZmllZCBjb2RlIGZhbGxzIHN0cmljdGx5IGludG8gb25lIG9yIG1vcmUgb2YgdGhlc2UgY2F0ZWdvcmllczpcblxuLSBOb24ta2VybmVsIGFuZCBub24tZXhlY3V0YWJsZSBjaGFuZ2VzOlxuICAqIE1vZGlmaWNhdGlvbnMgdG8gRG9jdW1lbnRhdGlvbi8sIGNvbW1lbnRzLCBvciBzcGVsbGluZyBmaXhlcy5cbiAgKiBVc2VyLXNwYWNlIGRpcmVjdG9yaWVzLCBzZWxmLXRlc3RzLCBzYW1wbGVzLCBvciBzY3JpcHRzIChlLmcuLCB0b29scy8sIHNhbXBsZXMvLCBzY3JpcHRzLywgdXNyLylcbiAgICB0aGF0IGRvIG5vdCBhZmZlY3QgdGhlIGNvbXBpbGVkIGtlcm5lbCBpbWFnZSAodm1saW51eCkgb3Iga2VybmVsIG1vZHVsZXMuXG4gICogUHVyZWx5IGRlY29yYXRpdmUgbG9nZ2luZyAoZS5nLiwgbWVzc2FnZSBzdHJpbmdzIGluIHByX2VyciwgcHJpbnRrLCBkZXZfaW5mbykgb3IgdHJhY2Vwb2ludHNcbiAgICB0aGF0IGRvIG5vdCBhbHRlciBjb250cm9sIGZsb3cgb3IgZGF0YSBzdHJ1Y3R1cmVzLlxuICAqIEJ1aWxkIHN5c3RlbSBvciBLY29uZmlnIGNoYW5nZXMgdGhhdCBkbyBub3QgYWx0ZXIgY29tcGlsZWQgQyBsb2dpYy5cbi0gU3RydWN0dXJhbGx5IHVucmVhY2hhYmxlIGhhcmR3YXJlOlxuICAqIFZlbmRvci1zcGVjaWZpYyBQQ0llIHN3aXRjaGVzLCBTbWFydE5JQ3MsIG9yIEdQVSBkcml2ZXJzIChlLmcuLCBtbHhzdywgcGRzX2NvcmUsIHFlZCxcbiAgICBpb25pYywgYW1kZ3B1KSByZXF1aXJpbmcgcGh5c2ljYWwgQVNJQy9QQ0llIGNhcmRzIG5vdCBlbXVsYXRlZCBpbiBzdGFuZGFyZCBRRU1VLlxuLSBVbnJlYWNoYWJsZSBleGVjdXRpb24gcGF0aHM6XG4gICogRHJpdmVyIHRlYXJkb3duIGNhbGxiYWNrcyAoLnJlbW92ZSwgLnNodXRkb3duLCBwY2lfdW5yZWdpc3Rlcl9kcml2ZXIpIGV4ZWN1dGVkIG9ubHkgZHVyaW5nXG4gICAgcGh5c2ljYWwgUENJIGhvdC11bnBsdWcgb3IgbWFudWFsIHN5c2ZzIGRyaXZlciB1bmJpbmRpbmcuXG4gICogQ29kZSBwYXRocyBleGNsdXNpdmUgdG8gYXJjaGl0ZWN0dXJlcyBvdGhlciB0aGFuIHRoZSB0YXJnZXQgYXJjaGl0ZWN0dXJlLlxuXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuMy4gV0hFTiBUTyBSRVRVUk4gV29ydGhGdXp6aW5nPXRydWUgKFBPU0lUSVZFIENSSVRFUklBKVxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblJldHVybiBXb3J0aEZ1enppbmc9dHJ1ZSB3aGVuZXZlciB0aGUgcGF0Y2ggdG91Y2hlcyByZWFjaGFibGUgZXhlY3V0YWJsZSBjb2RlLCBpbmNsdWRpbmc6XG4tIENvcmUgU3Vic3lzdGVtczpcbiAgKiBBbnkgbG9naWMgbW9kaWZpY2F0aW9ucyBpbiBtZW1vcnkgbWFuYWdlbWVudCAobW0vKSwgc3luY2hyb25pemF0aW9uL2xvY2tpbmcgKGtlcm5lbC9sb2NraW5nLyksXG4gICAgQlBGLCBzY2hlZHVsZXIsIGNvcmUgbmV0d29ya2luZywgVkZTLCBvciBzeXNjYWxsIGhhbmRsaW5nLlxuLSBSZWZhY3RvcmluZ3MgYW5kIENvZGUgQ2xlYW51cHM6XG4gICogQW55IHJlc3RydWN0dXJpbmcgb2YgcmVhY2hhYmxlIGRhdGEgc3RydWN0dXJlcywgaGVscGVyIGFic3RyYWN0aW9ucywgb3IgYWxnb3JpdGhtIGZsb3dzLlxuLSBSdW50aW1lIEFzc2VydGlvbnMgYW5kIERlZmVuc2l2ZSBDaGVja3M6XG4gICogQW55IGludHJvZHVjdGlvbiBvciBhbHRlcmF0aW9uIG9mIGFzc2VydGlvbnMgKFdBUk5fT04qLCBWTV9XQVJOX09OKiwgQlVHX09OKiwgZXRjLikgaW4gcmVhY2hhYmxlIHBhdGhzLlxuLSBSZWFjaGFibGUgRHJpdmVycyBhbmQgUHJvdG9jb2xzOlxuICAqIERyaXZlcnMgYWNjZXNzaWJsZSB2aWEgdmlydHVhbCBidXNlcyAodmlydGlvLCBVU0IgZ2FkZ2V0LCBsb29wYmFjaywgbmV0bGluaywgYmluZGVyLCBzb2NrZXRzLCBldGMuKS5cblxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbjQuIEVYVFJBQ1RJTkcgRm9jdXNTeW1ib2xzIChQUkVWRU5USU5HIERJTFVUSU9OKVxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbldoZW4gV29ydGhGdXp6aW5nPXRydWUsIHlvdSBtdXN0IGV4dHJhY3Qgc3BlY2lmaWMga2VybmVsIGZ1bmN0aW9ucyBpbnRvIEZvY3VzU3ltYm9scyB0byBndWlkZSB0aGUgZnV6emVyOlxuXG4tIEFWT0lEIFVCSVFVSVRPVVMgTElGRUNZQ0xFIEhPVC1QQVRIUzpcbiAgRG8gTk9UIGxpc3QgZ2VuZXJpYywgdWJpcXVpdG91cyBmdW5jdGlvbnMgY2FsbGVkIGJ5IGFsbW9zdCBldmVyeSBwcm9ncmFtIGluIHRoZSBjb3JwdXNcbiAgKGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvOiBnZW5lcmFsIG1lbW9yeSBhbGxvY2F0b3JzIGFuZCBkZWFsbG9jYXRvcnMsIHBhZ2UgZmF1bHRcbiAgYW5kIHRyYXAgaGFuZGxlcnMsIG9yIGNvcmUgc3luY2hyb25pemF0aW9uIHByaW1pdGl2ZXM7IHRoaXMgaXMgbm90IGFuIGV4aGF1c3RpdmUgbGlzdCkuXG4gIExpc3RpbmcgdWJpcXVpdG91cyBmdW5jdGlvbnMgY2F1c2VzIHRoZSBmdXp6ZXIgdG8gY2xhc3NpZnkgdGhvdXNhbmRzIG9mIHVucmVsYXRlZCB0ZXN0cyBhcyBcImZvY3VzZWRcIixcbiAgd2hpY2ggc2V2ZXJlbHkgZGlsdXRlcyBmdXp6aW5nIGVmZm9ydCBhd2F5IGZyb20gdGhlIGFjdHVhbCBjaGFuZ2VzLlxuXG4tIFRBUkdFVCBTUEVDSUZJQyBGRUFUVVJFIExPR0lDIEFORCBFTlRSWVBPSU5UUzpcbiAgTGlzdCBmdW5jdGlvbnMgdGhhdCBzcGVjaWZpY2FsbHkgaW1wbGVtZW50IHRoZSBsb2dpYyBiZWluZyBhZGRlZCBvciBhbHRlcmVkLCBvciBkaXJlY3QgQVBJIGVudHJ5cG9pbnRzXG4gIGZvciB0aGUgc3Vic3lzdGVtIGZlYXR1cmUgdW5kZXIgcmV2aWV3LlxuXG4tIEhBTkRMSU5HIFNUQVRJQyBJTkxJTkUgRlVOQ1RJT05TIElOIEhFQURFUlMgKC5oKTpcbiAgQ29tcGlsZXItaW5saW5lZCBzdGF0aWMgZnVuY3Rpb25zIChzdWNoIGFzIHN0YXRpYyBpbmxpbmVzIGluIG1tLyouaCBvciBpbmNsdWRlL2xpbnV4LyouaCkgbGFja1xuICBkaXN0aW5jdCBzeW1ib2wgYWRkcmVzc2VzIGluIHZtbGludXggYW5kIGNhbm5vdCBiZSB0YXJnZXRlZCBkaXJlY3RseSBieSBzeW1ib2wgY292ZXJhZ2UgZmlsdGVycy5cbiAgSWYgdGhlIGNoYW5nZXMgYXJlIHByaW1hcmlseSBpbiBzdGF0aWMgaW5saW5lIGhlbHBlcnMsIGlkZW50aWZ5IG5vbi1zdGF0aWMsIGZlYXR1cmUtc3BlY2lmaWMgY2FsbGVyXG4gIGZ1bmN0aW9ucyBpbiAuYyBmaWxlcyB0aGF0IGV4ZXJjaXNlIHRoZW0gKGF2b2lkaW5nIHViaXF1aXRvdXMgbGlmZWN5Y2xlIHdyYXBwZXJzKS5cblxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbjUuIElERU5USUZZSU5HIEVuYWJsZUNvbmZpZ3Ncbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5JZGVudGlmeSBhbnkgc3BlY2lmaWMgQ09ORklHXyBvcHRpb25zIHJlcXVpcmVkIHRvIHByb3Blcmx5IGNvbXBpbGUgYW5kIHJlYWNoIHRoZSBtb2RpZmllZCBjb2RlOlxuLSBJbnNwZWN0IEtjb25maWcgZmlsZXMgYW5kICNpZmRlZiBndWFyZHM7IGRvIG5vdCBtYWtlIGFzc3VtcHRpb25zLlxuLSBDaGVjayBcImRlcGVuZHMgb25cIiBsaW5lcyBpbiBLY29uZmlnIHRvIGluY2x1ZGUgYW55IG5vbi1zdGFuZGFyZCBwYXJlbnQgc3Vic3lzdGVtIGNvbmZpZ3MgbmVlZGVkLlxuLSBTdHJpcCBhbnkgJ0NPTkZJR18nIHByZWZpeCAoZS5nLiwgcmV0dXJuIFwiTkVUX0lQVjRcIiBpbnN0ZWFkIG9mIFwiQ09ORklHX05FVF9JUFY0XCIpLlxuUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuXG5cblxuVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy5cbkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LlxuSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLlxuIiwiUHJvbXB0IjoiVGFyZ2V0IGFyY2hpdGVjdHVyZTogYW1kNjRcblxuRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6XG5jb21taXQgMGFjZTJkYjM1MWFkMGE3ZWRiOTBhNmNhMDQ5MzU3NDhiYmM3MmZkMVxuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBNb24gU2VwIDcgMjA6Mzc6MDkgMjAyNiArMDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS9tbS96c3dhcC5jIGIvbW0venN3YXAuY1xuaW5kZXggMzdmMzRlNDA2YzhlMy4uZmQzNmFjMzhlOWExZSAxMDA2NDRcbi0tLSBhL21tL3pzd2FwLmNcbisrKyBiL21tL3pzd2FwLmNcbkBAIC0xNTcxLDYgKzE1NzEsMzIgQEAgYm9vbCB6c3dhcF9zdG9yZShzdHJ1Y3QgZm9saW8gKmZvbGlvKVxuIFx0cmV0dXJuIHJldDtcbiB9XG4gXG4rLyoqXG4rICogenN3YXBfaXNfcHJlc2VudCgpIC0gaXMgYW55IHNsb3QgaW4gW2VudHJ5LCBlbnRyeSArIG5yKSBpbiB6c3dhcD9cbisgKiBAZW50cnk6IGJhc2Ugc3dhcCBlbnRyeSBvZiB0aGUgcmFuZ2VcbisgKiBAbnI6IG51bWJlciBvZiBjb250aWd1b3VzIHNsb3RzIHRvIGNoZWNrXG4rICpcbisgKiBDb250ZXh0OiBUaGUgY2FsbGVyIG11c3Qga2VlcCB0aGUgcmFuZ2UgcGlubmVkLCBvdGhlcndpc2UgdGhlIGFuc3dlciBjYW5cbisgKiBjaGFuZ2UgdW5kZXIgaXQuXG4rICogUmV0dXJuOiB0cnVlIGlmIGF0IGxlYXN0IG9uZSBzbG90IGluIHRoZSByYW5nZSBpcyBpbiB6c3dhcC5cbisgKi9cbitzdGF0aWMgYm9vbCB6c3dhcF9pc19wcmVzZW50KHN3cF9lbnRyeV90IGVudHJ5LCB1bnNpZ25lZCBpbnQgbnIpXG4re1xuK1x0cGdvZmZfdCBvZmZzZXQgPSBzd3Bfb2Zmc2V0KGVudHJ5KTtcbitcdHN0cnVjdCB4YXJyYXkgKnRyZWUgPSBzd2FwX3pzd2FwX3RyZWUoZW50cnkpO1xuK1x0dW5zaWduZWQgbG9uZyBpbmRleCA9IG9mZnNldDtcbitcbitcdC8qXG4rXHQgKiBBIHBpbm5lZCByYW5nZSBpcyBhdCBtb3N0IFNXQVBGSUxFX0NMVVNURVIgc2xvdHMgYW5kIGlzIGFsaWduZWQgdG9cbitcdCAqIGl0cyBvd24gc2l6ZSwgc28gb25lIHRyZWUgY292ZXJzIGFsbCBvZiBpdCBhbmQgYSBzaW5nbGUgbG9va3VwIGlzXG4rXHQgKiBlbm91Z2guIFNjYW5uaW5nIG9ubHkgcGFydCBvZiB0aGUgcmFuZ2Ugd291bGQgcmVwb3J0IGEgZmFsc2VcbitcdCAqIFwiYWJzZW50XCIgYW5kIGxldCB0aGUgY2FsbGVyIHJlYWQgYSBzdGFsZSBjb3B5IGZyb20gdGhlIGRldmljZS5cbitcdCAqL1xuK1x0QlVJTERfQlVHX09OKFNXQVBGSUxFX0NMVVNURVIgXHUwMDNlIFpTV0FQX0FERFJFU1NfU1BBQ0VfUEFHRVMpO1xuK1xuK1x0cmV0dXJuIHhhX2ZpbmQodHJlZSwgXHUwMDI2aW5kZXgsIG9mZnNldCArIG5yIC0gMSwgWEFfUFJFU0VOVCk7XG4rfVxuK1xuIC8qKlxuICAqIHpzd2FwX2xvYWQoKSAtIGxvYWQgYSBmb2xpbyBmcm9tIHpzd2FwXG4gICogQGZvbGlvOiBmb2xpbyB0byBsb2FkXG5AQCAtMTU3OCwxNSArMTYwNCwxMiBAQCBib29sIHpzd2FwX3N0b3JlKHN0cnVjdCBmb2xpbyAqZm9saW8pXG4gICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIHdpdGggdGhlIGZvbGlvIHVubG9ja2VkIGFuZCBtYXJrZWQgdXAtdG8tZGF0ZSwgb3Igb25lXG4gICogb2YgdGhlIGZvbGxvd2luZyBlcnJvciBjb2RlczpcbiAgKlxuLSAqICAtRUlPOiBpZiB0aGUgc3dhcHBlZCBvdXQgY29udGVudCB3YXMgaW4genN3YXAsIGJ1dCBjb3VsZCBub3QgYmUgbG9hZGVkXG4tICogIGludG8gdGhlIHBhZ2UgZHVlIHRvIGEgZGVjb21wcmVzc2lvbiBmYWlsdXJlLiBUaGUgZm9saW8gaXMgdW5sb2NrZWQsIGJ1dFxuLSAqICBOT1QgbWFya2VkIHVwLXRvLWRhdGUsIHNvIHRoYXQgYW4gSU8gZXJyb3IgaXMgZW1pdHRlZCAoZS5nLiBkb19zd2FwX3BhZ2UoKVxuLSAqICB3aWxsIFNJR0JVUykuXG4tICpcbi0gKiAgLUVJTlZBTDogaWYgdGhlIHN3YXBwZWQgb3V0IGNvbnRlbnQgd2FzIGluIHpzd2FwLCBidXQgdGhlIHBhZ2UgYmVsb25nc1xuLSAqICB0byBhIGxhcmdlIGZvbGlvLCB3aGljaCBpcyBub3Qgc3VwcG9ydGVkIGJ5IHpzd2FwLiBUaGUgZm9saW8gaXMgdW5sb2NrZWQsXG4tICogIGJ1dCBOT1QgbWFya2VkIHVwLXRvLWRhdGUsIHNvIHRoYXQgYW4gSU8gZXJyb3IgaXMgZW1pdHRlZCAoZS5nLlxuLSAqICBkb19zd2FwX3BhZ2UoKSB3aWxsIFNJR0JVUykuXG4rICogIC1FSU86IGlmIHRoZSBzd2FwcGVkIG91dCBjb250ZW50IHdhcyBpbiB6c3dhcCBidXQgY291bGQgbm90IGJlIGhhbmRlZFxuKyAqICBiYWNrLCBlaXRoZXIgYmVjYXVzZSBkZWNvbXByZXNzaW9uIGZhaWxlZCBvciBiZWNhdXNlIGEgc2xvdCBpbiBhXG4rICogIGxhcmdlLWZvbGlvIHJhbmdlIGlzIHN0aWxsIGluIHpzd2FwIGFuZCB6c3dhcCBjYW5ub3QgcmVjb25zdHJ1Y3QgYSBsYXJnZVxuKyAqICBmb2xpbyBmcm9tIHBlci1wYWdlIGVudHJpZXMuIFRoZSBmb2xpbyBpcyB1bmxvY2tlZCwgYnV0IE5PVCBtYXJrZWRcbisgKiAgdXAtdG8tZGF0ZSwgc28gdGhhdCBhbiBJTyBlcnJvciBpcyBlbWl0dGVkIChlLmcuIGRvX3N3YXBfcGFnZSgpIHdpbGxcbisgKiAgU0lHQlVTKS5cbiAgKlxuICAqICAtRU5PRU5UOiBpZiB0aGUgc3dhcHBlZCBvdXQgY29udGVudCB3YXMgbm90IGluIHpzd2FwLiBUaGUgZm9saW8gcmVtYWluc1xuICAqICBsb2NrZWQgb24gcmV0dXJuLlxuQEAgLTE2MDUsMTMgKzE2MjgsMTggQEAgaW50IHpzd2FwX2xvYWQoc3RydWN0IGZvbGlvICpmb2xpbylcbiBcdFx0cmV0dXJuIC1FTk9FTlQ7XG4gXG4gXHQvKlxuLVx0ICogTGFyZ2UgZm9saW9zIHNob3VsZCBub3QgYmUgc3dhcHBlZCBpbiB3aGlsZSB6c3dhcCBpcyBiZWluZyB1c2VkLCBhc1xuLVx0ICogdGhleSBhcmUgbm90IHByb3Blcmx5IGhhbmRsZWQuIFpzd2FwIGRvZXMgbm90IHByb3Blcmx5IGxvYWQgbGFyZ2Vcbi1cdCAqIGZvbGlvcywgYW5kIGEgbGFyZ2UgZm9saW8gbWF5IG9ubHkgYmUgcGFydGlhbGx5IGluIHpzd2FwLlxuK1x0ICogQSBsYXJnZSBmb2xpbyBjYW4gbGVnaXRpbWF0ZWx5IHJlYWNoIHpzd2FwX2xvYWQoKSB3aXRoIGl0cyB3aG9sZVxuK1x0ICogcmFuZ2Ugb24gdGhlIGJhY2tpbmcgZGV2aWNlLCBzbyBzY2FuIHRoZSByYW5nZSByYXRoZXIgdGhhbiByZWplY3RpbmdcbitcdCAqIGl0IG91dHJpZ2h0LiBUaGUgY2FsbGVyIGhhcyBwaW5uZWQgZXZlcnkgc2xvdCwgc28genN3YXAgY2Fubm90IHN0YXJ0XG4rXHQgKiBhIHN0b3JlIG9yIGEgd3JpdGViYWNrIGludG8gdGhlIHJhbmdlIHdoaWxlIHdlIGxvb2suXG4gXHQgKi9cbi1cdGlmIChXQVJOX09OX09OQ0UoZm9saW9fdGVzdF9sYXJnZShmb2xpbykpKSB7XG4tXHRcdGZvbGlvX3VubG9jayhmb2xpbyk7XG4tXHRcdHJldHVybiAtRUlOVkFMO1xuK1x0aWYgKGZvbGlvX3Rlc3RfbGFyZ2UoZm9saW8pKSB7XG4rXHRcdGlmIChXQVJOX09OX09OQ0UoenN3YXBfaXNfcHJlc2VudChzd3AsXG4rXHRcdFx0XHRcdFx0ICBmb2xpb19ucl9wYWdlcyhmb2xpbykpKSkge1xuK1x0XHRcdGZvbGlvX3VubG9jayhmb2xpbyk7XG4rXHRcdFx0cmV0dXJuIC1FSU87XG4rXHRcdH1cbitcdFx0cmV0dXJuIC1FTk9FTlQ7XG4gXHR9XG4gXG4gXHRlbnRyeSA9IHhhX2xvYWQodHJlZSwgb2Zmc2V0KTtcbiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA3VDIwOjM3OjEwLjY0Mzg1ODExWiIsIlNlcSI6MywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6NzgyMDU5ODgyMCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgdGhlIFpzd2FwIFBhdGNoKipcblxuT2theSwgbGV0J3MgZGl2ZSBpbnRvIHRoaXMuIEZpcnN0LCBJIG5lZWQgdG8gZ2V0IGEgY2xlYXIgdW5kZXJzdGFuZGluZyBvZiB0aGUgcGF0Y2ggaXRzZWxmIGFuZCBleGFjdGx5IHdoYXQgcmVxdWlyZW1lbnRzIGl0J3MgYWRkcmVzc2luZy4gVGhlIGNvcmUgb2YgdGhlIG1vZGlmaWNhdGlvbiBzZWVtcyB0byBiZSBpbiBgbW0venN3YXAuY2AuIFJpZ2h0LCBzbyBJJ2xsIG5lZWQgdG8gc2NydXRpbml6ZSB0aGUgY2hhbmdlcyBtYWRlIHdpdGhpbiB0aGF0IGZpbGUuIEknbGwgcHJvYmFibHkgZmlyZSB1cCBgZ3JlcHBlcmAgb3IganVzdCBxdWlja2x5IHJlYWQgdGhlIGZpbGUuIFRoaXMgaXMgcm91dGluZSwgYnV0IEkgd2FudCB0byBtYWtlIHN1cmUgSSBkb24ndCBtaXNzIGFueXRoaW5nLlxuXG5Mb29rcyBsaWtlIHRoZSByZWxldmFudCBzZWN0aW9uIGlzIGFyb3VuZCBsaW5lcyAxNTcwIHRvIDE2NDAgaW4gYG1tL3pzd2FwLmNgLiBPa2F5LCB0aW1lIHRvIHB1bGwgdXAgdGhhdCBjb2RlIGJsb2NrIGFuZCBnZXQgYSBnb29kIGxvb2sgYXQgdGhlIGNoYW5nZXMgYW5kIHdoYXQncyBnb2luZyBvbiBhcm91bmQgdGhlbS4gTmVlZCB0byB1bmRlcnN0YW5kIHRoZSBjb250ZXh0IG9mIHRoaXMgc3BlY2lmaWMgYXJlYSBhbmQgaG93IGl0J3MgYmVpbmcgYWZmZWN0ZWQuIExldCdzIHNlZS4uLlxuXG5cbiIsIklucHV0VG9rZW5zIjozNzk4LCJPdXRwdXRUb2tlbnMiOjM1LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NjUsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wN1QyMDozNzoxOC40NjQ0NTg5NFoiLCJTZXEiOjQsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjExNDIxMCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJtbS96c3dhcC5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDE1NjUsXG4gIFwiTGluZUNvdW50XCI6IDg1XG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIjE1NjU6XFx0XFx0XFx0XFx0ZW50cnkgPSB4YV9lcmFzZSh0cmVlLCBvZmZzZXQgKyBpbmRleCk7XFxuMTU2NjpcXHRcXHRcXHRcXHRpZiAoZW50cnkpXFxuMTU2NzpcXHRcXHRcXHRcXHRcXHR6c3dhcF9lbnRyeV9mcmVlKGVudHJ5KTtcXG4xNTY4OlxcdFxcdFxcdH1cXG4xNTY5OlxcdFxcdH1cXG4xNTcwOlxcdFxcbjE1NzE6XFx0XFx0cmV0dXJuIHJldDtcXG4xNTcyOlxcdH1cXG4xNTczOlxcdFxcbjE1NzQ6XFx0LyoqXFxuMTU3NTpcXHQgKiB6c3dhcF9pc19wcmVzZW50KCkgLSBpcyBhbnkgc2xvdCBpbiBbZW50cnksIGVudHJ5ICsgbnIpIGluIHpzd2FwP1xcbjE1NzY6XFx0ICogQGVudHJ5OiBiYXNlIHN3YXAgZW50cnkgb2YgdGhlIHJhbmdlXFxuMTU3NzpcXHQgKiBAbnI6IG51bWJlciBvZiBjb250aWd1b3VzIHNsb3RzIHRvIGNoZWNrXFxuMTU3ODpcXHQgKlxcbjE1Nzk6XFx0ICogQ29udGV4dDogVGhlIGNhbGxlciBtdXN0IGtlZXAgdGhlIHJhbmdlIHBpbm5lZCwgb3RoZXJ3aXNlIHRoZSBhbnN3ZXIgY2FuXFxuMTU4MDpcXHQgKiBjaGFuZ2UgdW5kZXIgaXQuXFxuMTU4MTpcXHQgKiBSZXR1cm46IHRydWUgaWYgYXQgbGVhc3Qgb25lIHNsb3QgaW4gdGhlIHJhbmdlIGlzIGluIHpzd2FwLlxcbjE1ODI6XFx0ICovXFxuMTU4MzpcXHRzdGF0aWMgYm9vbCB6c3dhcF9pc19wcmVzZW50KHN3cF9lbnRyeV90IGVudHJ5LCB1bnNpZ25lZCBpbnQgbnIpXFxuMTU4NDpcXHR7XFxuMTU4NTpcXHRcXHRwZ29mZl90IG9mZnNldCA9IHN3cF9vZmZzZXQoZW50cnkpO1xcbjE1ODY6XFx0XFx0c3RydWN0IHhhcnJheSAqdHJlZSA9IHN3YXBfenN3YXBfdHJlZShlbnRyeSk7XFxuMTU4NzpcXHRcXHR1bnNpZ25lZCBsb25nIGluZGV4ID0gb2Zmc2V0O1xcbjE1ODg6XFx0XFxuMTU4OTpcXHRcXHQvKlxcbjE1OTA6XFx0XFx0ICogQSBwaW5uZWQgcmFuZ2UgaXMgYXQgbW9zdCBTV0FQRklMRV9DTFVTVEVSIHNsb3RzIGFuZCBpcyBhbGlnbmVkIHRvXFxuMTU5MTpcXHRcXHQgKiBpdHMgb3duIHNpemUsIHNvIG9uZSB0cmVlIGNvdmVycyBhbGwgb2YgaXQgYW5kIGEgc2luZ2xlIGxvb2t1cCBpc1xcbjE1OTI6XFx0XFx0ICogZW5vdWdoLiBTY2FubmluZyBvbmx5IHBhcnQgb2YgdGhlIHJhbmdlIHdvdWxkIHJlcG9ydCBhIGZhbHNlXFxuMTU5MzpcXHRcXHQgKiBcXFwiYWJzZW50XFxcIiBhbmQgbGV0IHRoZSBjYWxsZXIgcmVhZCBhIHN0YWxlIGNvcHkgZnJvbSB0aGUgZGV2aWNlLlxcbjE1OTQ6XFx0XFx0ICovXFxuMTU5NTpcXHRcXHRCVUlMRF9CVUdfT04oU1dBUEZJTEVfQ0xVU1RFUiBcXHUwMDNlIFpTV0FQX0FERFJFU1NfU1BBQ0VfUEFHRVMpO1xcbjE1OTY6XFx0XFxuMTU5NzpcXHRcXHRyZXR1cm4geGFfZmluZCh0cmVlLCBcXHUwMDI2aW5kZXgsIG9mZnNldCArIG5yIC0gMSwgWEFfUFJFU0VOVCk7XFxuMTU5ODpcXHR9XFxuMTU5OTpcXHRcXG4xNjAwOlxcdC8qKlxcbjE2MDE6XFx0ICogenN3YXBfbG9hZCgpIC0gbG9hZCBhIGZvbGlvIGZyb20genN3YXBcXG4xNjAyOlxcdCAqIEBmb2xpbzogZm9saW8gdG8gbG9hZFxcbjE2MDM6XFx0ICpcXG4xNjA0OlxcdCAqIFJldHVybjogMCBvbiBzdWNjZXNzLCB3aXRoIHRoZSBmb2xpbyB1bmxvY2tlZCBhbmQgbWFya2VkIHVwLXRvLWRhdGUsIG9yIG9uZVxcbjE2MDU6XFx0ICogb2YgdGhlIGZvbGxvd2luZyBlcnJvciBjb2RlczpcXG4xNjA2OlxcdCAqXFxuMTYwNzpcXHQgKiAgLUVJTzogaWYgdGhlIHN3YXBwZWQgb3V0IGNvbnRlbnQgd2FzIGluIHpzd2FwIGJ1dCBjb3VsZCBub3QgYmUgaGFuZGVkXFxuMTYwODpcXHQgKiAgYmFjaywgZWl0aGVyIGJlY2F1c2UgZGVjb21wcmVzc2lvbiBmYWlsZWQgb3IgYmVjYXVzZSBhIHNsb3QgaW4gYVxcbjE2MDk6XFx0ICogIGxhcmdlLWZvbGlvIHJhbmdlIGlzIHN0aWxsIGluIHpzd2FwIGFuZCB6c3dhcCBjYW5ub3QgcmVjb25zdHJ1Y3QgYSBsYXJnZVxcbjE2MTA6XFx0ICogIGZvbGlvIGZyb20gcGVyLXBhZ2UgZW50cmllcy4gVGhlIGZvbGlvIGlzIHVubG9ja2VkLCBidXQgTk9UIG1hcmtlZFxcbjE2MTE6XFx0ICogIHVwLXRvLWRhdGUsIHNvIHRoYXQgYW4gSU8gZXJyb3IgaXMgZW1pdHRlZCAoZS5nLiBkb19zd2FwX3BhZ2UoKSB3aWxsXFxuMTYxMjpcXHQgKiAgU0lHQlVTKS5cXG4xNjEzOlxcdCAqXFxuMTYxNDpcXHQgKiAgLUVOT0VOVDogaWYgdGhlIHN3YXBwZWQgb3V0IGNvbnRlbnQgd2FzIG5vdCBpbiB6c3dhcC4gVGhlIGZvbGlvIHJlbWFpbnNcXG4xNjE1OlxcdCAqICBsb2NrZWQgb24gcmV0dXJuLlxcbjE2MTY6XFx0ICovXFxuMTYxNzpcXHRpbnQgenN3YXBfbG9hZChzdHJ1Y3QgZm9saW8gKmZvbGlvKVxcbjE2MTg6XFx0e1xcbjE2MTk6XFx0XFx0c3dwX2VudHJ5X3Qgc3dwID0gZm9saW8tXFx1MDAzZXN3YXA7XFxuMTYyMDpcXHRcXHRwZ29mZl90IG9mZnNldCA9IHN3cF9vZmZzZXQoc3dwKTtcXG4xNjIxOlxcdFxcdHN0cnVjdCB4YXJyYXkgKnRyZWUgPSBzd2FwX3pzd2FwX3RyZWUoc3dwKTtcXG4xNjIyOlxcdFxcdHN0cnVjdCB6c3dhcF9lbnRyeSAqZW50cnk7XFxuMTYyMzpcXHRcXG4xNjI0OlxcdFxcdFZNX1dBUk5fT05fT05DRSghZm9saW9fdGVzdF9sb2NrZWQoZm9saW8pKTtcXG4xNjI1OlxcdFxcdFZNX1dBUk5fT05fT05DRSghZm9saW9fdGVzdF9zd2FwY2FjaGUoZm9saW8pKTtcXG4xNjI2OlxcdFxcbjE2Mjc6XFx0XFx0aWYgKHpzd2FwX25ldmVyX2VuYWJsZWQoKSlcXG4xNjI4OlxcdFxcdFxcdHJldHVybiAtRU5PRU5UO1xcbjE2Mjk6XFx0XFxuMTYzMDpcXHRcXHQvKlxcbjE2MzE6XFx0XFx0ICogQSBsYXJnZSBmb2xpbyBjYW4gbGVnaXRpbWF0ZWx5IHJlYWNoIHpzd2FwX2xvYWQoKSB3aXRoIGl0cyB3aG9sZVxcbjE2MzI6XFx0XFx0ICogcmFuZ2Ugb24gdGhlIGJhY2tpbmcgZGV2aWNlLCBzbyBzY2FuIHRoZSByYW5nZSByYXRoZXIgdGhhbiByZWplY3RpbmdcXG4xNjMzOlxcdFxcdCAqIGl0IG91dHJpZ2h0LiBUaGUgY2FsbGVyIGhhcyBwaW5uZWQgZXZlcnkgc2xvdCwgc28genN3YXAgY2Fubm90IHN0YXJ0XFxuMTYzNDpcXHRcXHQgKiBhIHN0b3JlIG9yIGEgd3JpdGViYWNrIGludG8gdGhlIHJhbmdlIHdoaWxlIHdlIGxvb2suXFxuMTYzNTpcXHRcXHQgKi9cXG4xNjM2OlxcdFxcdGlmIChmb2xpb190ZXN0X2xhcmdlKGZvbGlvKSkge1xcbjE2Mzc6XFx0XFx0XFx0aWYgKFdBUk5fT05fT05DRSh6c3dhcF9pc19wcmVzZW50KHN3cCxcXG4xNjM4OlxcdFxcdFxcdFxcdFxcdFxcdFxcdCAgZm9saW9fbnJfcGFnZXMoZm9saW8pKSkpIHtcXG4xNjM5OlxcdFxcdFxcdFxcdGZvbGlvX3VubG9jayhmb2xpbyk7XFxuMTY0MDpcXHRcXHRcXHRcXHRyZXR1cm4gLUVJTztcXG4xNjQxOlxcdFxcdFxcdH1cXG4xNjQyOlxcdFxcdFxcdHJldHVybiAtRU5PRU5UO1xcbjE2NDM6XFx0XFx0fVxcbjE2NDQ6XFx0XFxuMTY0NTpcXHRcXHRlbnRyeSA9IHhhX2xvYWQodHJlZSwgb2Zmc2V0KTtcXG4xNjQ2OlxcdFxcdGlmICghZW50cnkpXFxuMTY0NzpcXHRcXHRcXHRyZXR1cm4gLUVOT0VOVDtcXG4xNjQ4OlxcdFxcbjE2NDk6XFx0XFx0aWYgKCF6c3dhcF9kZWNvbXByZXNzKGVudHJ5LCBmb2xpbykpIHtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDdUMjA6Mzc6MTguNDY0NTc0OThaIiwiU2VxIjo1LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjo0OTAzOTM5OTQ0LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBoZXJlJ3MgbXkgdGFrZSBvbiB0aG9zZSB0aG91Z2h0cywgZnJhbWVkIGFzIGFuIGV4cGVydCdzIGludGVybmFsIG1vbm9sb2d1ZTpcblxuKipDaGVja2luZyB0aGUgS2NvbmZpZyBmb3IgWnN3YXAqKlxuXG5BbHJpZ2h0LCB0aW1lIHRvIGdldCBteSBoYW5kcyBkaXJ0eS4gTXkgaW1tZWRpYXRlIHRob3VnaHQgaXMgdG8gZGl2ZSBpbnRvIHRoZSBLY29uZmlnIGZpbGVzLCBzcGVjaWZpY2FsbHkgZm9jdXNpbmcgb24gdGhlIGNvbmZpZ3VyYXRpb25zIHJlbGF0ZWQgdG8genN3YXAgYW5kIHRoZSBgbW0venN3YXAuY2AgaW1wbGVtZW50YXRpb24uIEdvdHRhIG1ha2Ugc3VyZSBldmVyeXRoaW5nJ3Mgc2V0IHVwIGNvcnJlY3RseSwgdGhhdCB0aGUgYnVpbGQgc3lzdGVtIGtub3dzIHdoYXQncyBnb2luZyBvbiwgYW5kIHRoYXQgdGhlIHJlbGV2YW50IG9wdGlvbnMgYXJlIGV4cG9zZWQgdG8gdGhlIHVzZXIsIG9yIGFwcHJvcHJpYXRlbHkgaGlkZGVuIGlmIHRoZXkgYXJlIG5vdCBtZWFudCBmb3IgdGhlIGF2ZXJhZ2Ugam9lLlxuXG5JJ20gdGhpbmtpbmc6XG5cbiogICAqKklzIHpzd2FwIGV2ZW4gZW5hYmxlZD8qKiBMZXQncyB2ZXJpZnkgdGhlIGNvcmUgYENPTkZJR19aU1dBUGAgb3B0aW9uLiBJIG5lZWQgdG8gcXVpY2tseSBjb25maXJtIGl0cyBkZXBlbmRlbmNpZXMgYW5kIGRlZmF1bHQgdmFsdWUgdG9vLlxuKiAgICoqRGVlcGVyIGRpdmVzOioqIE5vdyBJIGhhdmUgdG8gZ28gZGVlcGVyLCBsb29rIGZvciByZWxhdGVkIG9wdGlvbnMgbGlrZSBgQ09ORklHX1pQT09MX1NJWkVgLCBgQ09ORklHX1pTV0FQX0NPTVBSRVNTT1JgLCBgQ09ORklHX1pTV0FQX1BBR0VfU0laRWAsIGFuZCBhbnkgb3RoZXIgc2V0dGluZ3MgdGhhdCBhZmZlY3QgdGhlIGJlaGF2aW9yIG9mIGB6c3dhcC5jYC5cbiogICAqKlRoZSBmaW5lIHByaW50OioqIEknbGwgc2NydXRpbml6ZSBhbnkgY29uZGl0aW9uYWwgZGVwZW5kZW5jaWVzLiBBcmUgdGhlcmUgYW55IGhhcmR3YXJlIG9yIGtlcm5lbCBmZWF0dXJlIGRlcGVuZGVuY2llcyB0aGF0IEkgbmVlZCB0byBiZSBhd2FyZSBvZj8gQXJlIHRoZXJlIGNvbmZsaWN0aW5nIG9wdGlvbnMgdGhhdCBJIG1pZ2h0IG5lZWQgdG8gY29uc2lkZXI/XG4qICAgKipXaGF0IGFyZSB0aGUgZGVmYXVsdHM/KiogSSB3aWxsIGNoZWNrIHRoZSBkZWZhdWx0cywgYW5kIHRoZSBpbXBsaWNhdGlvbnMgb2YgY2hhbmdpbmcgdGhlbS4gU29tZXRpbWVzIHRoZSBkZWZhdWx0cyBhcmUgZmluZSwgYnV0IGluIHNvbWUgc2NlbmFyaW9zIEknbGwgbmVlZCB0byBvdmVycmlkZSB0aGVzZS5cbiogICAqKkRvY3VtZW50YXRpb246KiogSSB3YW50IHRvIGNoZWNrIGZvciBjbGVhciBhbmQgY29uY2lzZSBkb2N1bWVudGF0aW9uIHdpdGhpbiB0aGUgS2NvbmZpZyBmaWxlIGl0c2VsZi4gQW55IGhlbHAgdGV4dCBvciBjb21tZW50cyB0aGF0IGV4cGxhaW4gdGhlIHB1cnBvc2Ugb2YgdGhlIG9wdGlvbnMgYW5kIHRoZWlyIGltcGFjdCBvbiBzeXN0ZW0gcGVyZm9ybWFuY2Ugd291bGQgYmUgZ3JlYXRseSBhcHByZWNpYXRlZC5cbiogICAqKkNyb3NzLXJlZmVyZW5jaW5nOioqIEkgc2hvdWxkIGNyb3NzLXJlZmVyZW5jZSB0aGVzZSBLY29uZmlnIG9wdGlvbnMgd2l0aCB0aGUgYWN0dWFsIGNvZGUgaW4gYG1tL3pzd2FwLmNgIHRvIHNlZSBob3cgdGhlIHNldHRpbmdzIGFyZSBiZWluZyB1dGlsaXplZC4gVGhpcyB3aWxsIGhlbHAgbWUgdW5kZXJzdGFuZCB0aGUgaW1wbGljYXRpb25zIG9mIGRpZmZlcmVudCBjb25maWd1cmF0aW9ucyBpbiBhIG1vcmUgdGFuZ2libGUgbWFubmVyLlxuKiAgICoqSXMgaXQgZXZlbiBjb21waWxpbmc/KiogSnVzdCBiZWNhdXNlIHRoZSBvcHRpb25zICpleGlzdCogZG9lc24ndCBtZWFuIHRoZXkncmUgYWN0dWFsbHkgZ2V0dGluZyB1c2VkLiBJJ2xsIG5lZWQgdG8gcXVpY2tseSBjb25maXJtIHRoZSBidWlsZCBzeXN0ZW0gaXMgY29ycmVjdGx5IGludGVncmF0aW5nIHRoZXNlIHNldHRpbmdzLlxuXG5UaGlzIGlzIGFsbCByb3V0aW5lLCByZWFsbHkuIE5lZWQgdG8gZ2V0IGEgZmlybSBncmFzcCBvbiB0aGUgY29uZmlndXJhdGlvbiBsYW5kc2NhcGUgYmVmb3JlIGV2ZW4gdGhpbmtpbmcgYWJvdXQgbW9kaWZ5aW5nIG9yIHR1bmluZyBhbnl0aGluZy4gQSBzb2xpZCB1bmRlcnN0YW5kaW5nIG9mIHRoZSBiYXNlIGNvbmZpZ3VyYXRpb24gaXMgcGFyYW1vdW50LlxuXG5cbiIsIklucHV0VG9rZW5zIjo1NDIwLCJPdXRwdXRUb2tlbnMiOjI2LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTgsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0wN1QyMDozNzoyMy4zNjg1MTcwMTVaIiwiU2VxIjo2LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NTM1Njg4MDksIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiY29uZmlnIFpTV0FQXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIm1tL1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJtbS9LY29uZmlnPTEyPW1lbnVjb25maWcgU1dBUFxcbi0tXFxubW0vS2NvbmZpZy0yMS1cXG5tbS9LY29uZmlnOjIyOmNvbmZpZyBaU1dBUFxcbm1tL0tjb25maWctMjMtXFx0Ym9vbCBcXFwiQ29tcHJlc3NlZCBjYWNoZSBmb3Igc3dhcCBwYWdlc1xcXCJcXG4tLVxcbm1tL0tjb25maWctMzQtXFxubW0vS2NvbmZpZzozNTpjb25maWcgWlNXQVBfREVGQVVMVF9PTlxcbm1tL0tjb25maWctMzYtXFx0Ym9vbCBcXFwiRW5hYmxlIHRoZSBjb21wcmVzc2VkIGNhY2hlIGZvciBzd2FwIHBhZ2VzIGJ5IGRlZmF1bHRcXFwiXFxuLS1cXG5tbS9LY29uZmlnLTQ0LVxcbm1tL0tjb25maWc6NDU6Y29uZmlnIFpTV0FQX1NIUklOS0VSX0RFRkFVTFRfT05cXG5tbS9LY29uZmlnLTQ2LVxcdGJvb2wgXFxcIlNocmluayB0aGUgenN3YXAgcG9vbCBvbiBtZW1vcnkgcHJlc3N1cmVcXFwiXFxuLS1cXG5tbS9LY29uZmlnPTU5PWNob2ljZVxcbi0tXFxubW0vS2NvbmZpZy03Ni1cXG5tbS9LY29uZmlnOjc3OmNvbmZpZyBaU1dBUF9DT01QUkVTU09SX0RFRkFVTFRfREVGTEFURVxcbm1tL0tjb25maWctNzgtXFx0Ym9vbCBcXFwiRGVmbGF0ZVxcXCJcXG4tLVxcbm1tL0tjb25maWctODItXFxubW0vS2NvbmZpZzo4Mzpjb25maWcgWlNXQVBfQ09NUFJFU1NPUl9ERUZBVUxUX0xaT1xcbm1tL0tjb25maWctODQtXFx0Ym9vbCBcXFwiTFpPXFxcIlxcbi0tXFxubW0vS2NvbmZpZy04OC1cXG5tbS9LY29uZmlnOjg5OmNvbmZpZyBaU1dBUF9DT01QUkVTU09SX0RFRkFVTFRfODQyXFxubW0vS2NvbmZpZy05MC1cXHRib29sIFxcXCI4NDJcXFwiXFxuLS1cXG5tbS9LY29uZmlnLTk0LVxcbm1tL0tjb25maWc6OTU6Y29uZmlnIFpTV0FQX0NPTVBSRVNTT1JfREVGQVVMVF9MWjRcXG5tbS9LY29uZmlnLTk2LVxcdGJvb2wgXFxcIkxaNFxcXCJcXG4tLVxcbm1tL0tjb25maWctMTAwLVxcbm1tL0tjb25maWc6MTAxOmNvbmZpZyBaU1dBUF9DT01QUkVTU09SX0RFRkFVTFRfTFo0SENcXG5tbS9LY29uZmlnLTEwMi1cXHRib29sIFxcXCJMWjRIQ1xcXCJcXG4tLVxcbm1tL0tjb25maWctMTA2LVxcbm1tL0tjb25maWc6MTA3OmNvbmZpZyBaU1dBUF9DT01QUkVTU09SX0RFRkFVTFRfWlNURFxcbm1tL0tjb25maWctMTA4LVxcdGJvb2wgXFxcInpzdGRcXFwiXFxuLS1cXG5tbS9LY29uZmlnPTExMj1lbmRjaG9pY2VcXG5tbS9LY29uZmlnLTExMy1cXG5tbS9LY29uZmlnOjExNDpjb25maWcgWlNXQVBfQ09NUFJFU1NPUl9ERUZBVUxUXFxubW0vS2NvbmZpZy0xMTUtICAgICAgIHN0cmluZ1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wN1QyMDozNzoyMy40MjIwOTE0MTRaIiwiU2VxIjo3LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjoyMDM5NjA4MTA4LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgYSBzdW1tYXJ5IG9mIG15IHRob3VnaHQgcHJvY2VzcywgYXMgaWYgSSB3ZXJlIHRoZSBvbmUgdGhpbmtpbmcgaXQ6XG5cbioqRGl2aW5nIGludG8gdGhlIFpTV0FQIENvbmZpZ3VyYXRpb24qKlxuXG5Pa2F5LCB0aW1lIHRvIGdldCBteSBoYW5kcyBkaXJ0eSB3aXRoIHRoaXMgYFpTV0FQYCBjb25maWd1cmF0aW9uLiBGaXJzdCwgSSBuZWVkIHRvIHVuZGVyc3RhbmQgaXRzIHN0cnVjdHVyZSB3aXRoaW4gdGhlIGtlcm5lbCdzIGJ1aWxkIHN5c3RlbS4gTGV0J3Mgc3RhcnQgYnkgbmF2aWdhdGluZyBkaXJlY3RseSB0byBgbW0vS2NvbmZpZ2AuIFRoYXQncyB3aGVyZSBJIGV4cGVjdCB0byBmaW5kIHRoZSByZWxldmFudCBkZWZpbml0aW9ucyBhbmQgZGVwZW5kZW5jaWVzIGZvciBtZW1vcnkgbWFuYWdlbWVudCBvcHRpb25zLiBJJ20gc3BlY2lmaWNhbGx5IGxvb2tpbmcgZm9yIHRoZSBzZWN0aW9uIHJlbGF0ZWQgdG8gYGNvbmZpZyBaU1dBUGAuIEkgd2FudCB0byBzZWUgaG93IGl0J3MgZGVmaW5lZCwgd2hpY2ggb3RoZXIgY29uZmlndXJhdGlvbnMgaXQgZGVwZW5kcyBvbiwgYW5kIHdoYXQgdGhlIGRlZmF1bHQgc2V0dGluZ3MgbWlnaHQgYmUuIFRoaXMgd2lsbCBnaXZlIG1lIGEgc29saWQgZm91bmRhdGlvbiBmb3IgdW5kZXJzdGFuZGluZyB0aGUgaW1wbGljYXRpb25zIG9mIGVuYWJsaW5nIG9yIGRpc2FibGluZyBpdCB3aXRoaW4gYSBrZXJuZWwgY29uZmlndXJhdGlvbi4gS25vd2luZyB0aGUgYEtjb25maWdgIHN0cnVjdHVyZSBoZWxwcyBtZSBhc3Nlc3MgcG90ZW50aWFsIGNvbmZsaWN0cyB3aXRoIG90aGVyIG1lbW9yeSBtYW5hZ2VtZW50IG9wdGlvbnMuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjY0OTgsIk91dHB1dFRva2VucyI6MzEsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxNywiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0wN1QyMDozNzoyNS40NjE3MDM0MDJaIiwiU2VxIjo4LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMTMyNTAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwibW0vS2NvbmZpZ1wiLFxuICBcIkZpcnN0TGluZVwiOiAyMCxcbiAgXCJMaW5lQ291bnRcIjogNDBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiICAyMDpcXHRcXHQgIGluIHlvdXIgY29tcHV0ZXIuICBJZiB1bnN1cmUgc2F5IFkuXFxuICAyMTpcXHRcXG4gIDIyOlxcdGNvbmZpZyBaU1dBUFxcbiAgMjM6XFx0XFx0Ym9vbCBcXFwiQ29tcHJlc3NlZCBjYWNoZSBmb3Igc3dhcCBwYWdlc1xcXCJcXG4gIDI0OlxcdFxcdGRlcGVuZHMgb24gU1dBUFxcbiAgMjU6XFx0XFx0c2VsZWN0IENSWVBUT1xcbiAgMjY6XFx0XFx0c2VsZWN0IFpTTUFMTE9DXFxuICAyNzpcXHRcXHRoZWxwXFxuICAyODpcXHRcXHQgIEEgbGlnaHR3ZWlnaHQgY29tcHJlc3NlZCBjYWNoZSBmb3Igc3dhcCBwYWdlcy4gIEl0IHRha2VzXFxuICAyOTpcXHRcXHQgIHBhZ2VzIHRoYXQgYXJlIGluIHRoZSBwcm9jZXNzIG9mIGJlaW5nIHN3YXBwZWQgb3V0IGFuZCBhdHRlbXB0cyB0b1xcbiAgMzA6XFx0XFx0ICBjb21wcmVzcyB0aGVtIGludG8gYSBkeW5hbWljYWxseSBhbGxvY2F0ZWQgUkFNLWJhc2VkIG1lbW9yeSBwb29sLlxcbiAgMzE6XFx0XFx0ICBUaGlzIGNhbiByZXN1bHQgaW4gYSBzaWduaWZpY2FudCBJL08gcmVkdWN0aW9uIG9uIHN3YXAgZGV2aWNlIGFuZCxcXG4gIDMyOlxcdFxcdCAgaW4gdGhlIGNhc2Ugd2hlcmUgZGVjb21wcmVzc2luZyBmcm9tIFJBTSBpcyBmYXN0ZXIgdGhhbiBzd2FwIGRldmljZVxcbiAgMzM6XFx0XFx0ICByZWFkcywgY2FuIGFsc28gaW1wcm92ZSB3b3JrbG9hZCBwZXJmb3JtYW5jZS5cXG4gIDM0OlxcdFxcbiAgMzU6XFx0Y29uZmlnIFpTV0FQX0RFRkFVTFRfT05cXG4gIDM2OlxcdFxcdGJvb2wgXFxcIkVuYWJsZSB0aGUgY29tcHJlc3NlZCBjYWNoZSBmb3Igc3dhcCBwYWdlcyBieSBkZWZhdWx0XFxcIlxcbiAgMzc6XFx0XFx0ZGVwZW5kcyBvbiBaU1dBUFxcbiAgMzg6XFx0XFx0aGVscFxcbiAgMzk6XFx0XFx0ICBJZiBzZWxlY3RlZCwgdGhlIGNvbXByZXNzZWQgY2FjaGUgZm9yIHN3YXAgcGFnZXMgd2lsbCBiZSBlbmFibGVkXFxuICA0MDpcXHRcXHQgIGF0IGJvb3QsIG90aGVyd2lzZSBpdCB3aWxsIGJlIGRpc2FibGVkLlxcbiAgNDE6XFx0XFxuICA0MjpcXHRcXHQgIFRoZSBzZWxlY3Rpb24gbWFkZSBoZXJlIGNhbiBiZSBvdmVycmlkZGVuIGJ5IHVzaW5nIHRoZSBrZXJuZWxcXG4gIDQzOlxcdFxcdCAgY29tbWFuZCBsaW5lICd6c3dhcC5lbmFibGVkPScgb3B0aW9uLlxcbiAgNDQ6XFx0XFxuICA0NTpcXHRjb25maWcgWlNXQVBfU0hSSU5LRVJfREVGQVVMVF9PTlxcbiAgNDY6XFx0XFx0Ym9vbCBcXFwiU2hyaW5rIHRoZSB6c3dhcCBwb29sIG9uIG1lbW9yeSBwcmVzc3VyZVxcXCJcXG4gIDQ3OlxcdFxcdGRlcGVuZHMgb24gWlNXQVBcXG4gIDQ4OlxcdFxcdGRlZmF1bHQgblxcbiAgNDk6XFx0XFx0aGVscFxcbiAgNTA6XFx0XFx0ICBJZiBzZWxlY3RlZCwgdGhlIHpzd2FwIHNocmlua2VyIHdpbGwgYmUgZW5hYmxlZCwgYW5kIHRoZSBwYWdlc1xcbiAgNTE6XFx0XFx0ICBzdG9yZWQgaW4gdGhlIHpzd2FwIHBvb2wgd2lsbCBiZWNvbWUgYXZhaWxhYmxlIGZvciByZWNsYWltIChpLmVcXG4gIDUyOlxcdFxcdCAgd3JpdHRlbiBiYWNrIHRvIHRoZSBiYWNraW5nIHN3YXAgZGV2aWNlKSBvbiBtZW1vcnkgcHJlc3N1cmUuXFxuICA1MzpcXHRcXG4gIDU0OlxcdFxcdCAgVGhpcyBtZWFucyB0aGF0IHpzd2FwIHdyaXRlYmFjayBjb3VsZCBoYXBwZW4gZXZlbiBpZiB0aGUgcG9vbCBpc1xcbiAgNTU6XFx0XFx0ICBub3QgeWV0IGZ1bGwsIG9yIHRoZSBjZ3JvdXAgenN3YXAgbGltaXQgaGFzIG5vdCBiZWVuIHJlYWNoZWQsXFxuICA1NjpcXHRcXHQgIHJlZHVjaW5nIHRoZSBjaGFuY2UgdGhhdCBjb2xkIHBhZ2VzIHdpbGwgcmVzaWRlIGluIHRoZSB6c3dhcCBwb29sXFxuICA1NzpcXHRcXHQgIGFuZCBjb25zdW1lIG1lbW9yeSBpbmRlZmluaXRlbHkuXFxuICA1ODpcXHRcXG4gIDU5OlxcdGNob2ljZVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wN1QyMDozNzoyNS40NjE4MTgxNzJaIiwiU2VxIjo5LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjozNTE5ODUwNTY2LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBsZXQncyBkaXZlIGludG8gdGhpcy4gSGVyZSdzIGhvdyBJJ2QgYXBwcm9hY2ggdGhhdCBrZXJuZWwgYW5hbHlzaXMsIHN1bW1hcml6aW5nIG15IG93biB0aG91Z2h0IHByb2Nlc3M6XG5cbioqSW52ZXN0aWdhdGluZyBDYWxsZXJzIG9mIGB6c3dhcF9sb2FkYCoqXG5cbkFscmlnaHQsIHRpbWUgdG8gZ2V0IG15IGhhbmRzIGRpcnR5LiBJJ20gdGhpbmtpbmcsIFwiT2theSwgYHpzd2FwX2xvYWRgLi4uIHRoYXQncyBhIGtleSBmdW5jdGlvbiBpbiB0aGUgWnN3YXAgc3Vic3lzdGVtLCByaWdodD8gSXQncyB0aGUgb25lIHJlc3BvbnNpYmxlIGZvciBsb2FkaW5nIGNvbXByZXNzZWQgcGFnZXMgZnJvbSB0aGUgc3dhcCBjYWNoZS4gU28sIHVuZGVyc3RhbmRpbmcgKndobyogY2FsbHMgaXQgaXMgY3J1Y2lhbCB0byB1bmRlcnN0YW5kaW5nIHRoZSBkYXRhIGZsb3csIHRoZSB0cmlnZ2VycyBmb3IgWnN3YXAgYWN0aXZpdHksIGFuZCBwb3RlbnRpYWwgYm90dGxlbmVja3MuXCJcblxuTXkgaW1tZWRpYXRlIGluc3RpbmN0IGlzIHRvIGxvb2sgYXQgdGhlIGNhbGxpbmcgY29udGV4dC4gXCJJIG5lZWQgdG8gdHJhY2sgZG93biBldmVyeSBpbnN0YW5jZSB3aGVyZSBgenN3YXBfbG9hZGAgaXMgaW52b2tlZCB3aXRoaW4gdGhlIGtlcm5lbC4gU3RhdGljIGFuYWx5c2lzIHRvb2xzIGFyZSBteSBmcmllbmRzIGhlcmUuXCIgSSdkIGxpa2VseSBzdGFydCB3aXRoIGBwZXJmYCB0byBidWlsZCBhIGR5bmFtaWMgY2FsbGdyYXBoIG9yIGBncmVwYCB0byBxdWlja2x5IHNlYXJjaCB0aGUgc291cmNlIGNvZGUgZm9yIGFsbCBpbnN0YW5jZXMgb2YgdGhlIGZ1bmN0aW9uIG5hbWUuIEknZCBiZSBsb29raW5nIGZvciBhIGNvbXByZWhlbnNpdmUgbGlzdC4gXCJOb3csIGl0J3Mgbm90IGVub3VnaCB0byAqZmluZCogdGhlIGNhbGxzOyBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGUgKndoeSouXCJcblxuXCJGb3IgZWFjaCBjYWxsZXIsIEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoZSBwdXJwb3NlIG9mIHRoYXQgY29kZSBwYXRoLiBXaGF0J3MgdGhlIHNwZWNpZmljIHNjZW5hcmlvIHRoYXQgbGVhZHMgdG8gYHpzd2FwX2xvYWRgIGJlaW5nIGV4ZWN1dGVkPyBJcyBpdCBhIHBhZ2UgZmF1bHQgaW4gYSB1c2VyLXNwYWNlIGFwcGxpY2F0aW9uPyBJcyBpdCBhIGJhY2tncm91bmQgcHJvY2VzcyBzY2F2ZW5naW5nIG1lbW9yeT8gQXJlIHRoZXJlIGFueSBvYnZpb3VzIGxvY2tzIG9yIHN5bmNocm9uaXphdGlvbiBwcmltaXRpdmVzIGludm9sdmVkLCBhbmQgaG93IGNvdWxkIHRob3NlIGFmZmVjdCBwZXJmb3JtYW5jZT8gTWF5YmUgYSBsb2NrIGNvbnRlbnRpb24gb3IgcmFjZSBjb25kaXRpb24uXCJcblxuSSdkIGJlIHBhcnRpY3VsYXJseSBpbnRlcmVzdGVkIGluOlxuXG4qICAgKipGcmVxdWVuY3k6KiogSG93IG9mdGVuIGlzIGB6c3dhcF9sb2FkYCBjYWxsZWQgZnJvbSBlYWNoIGNhbGxlcj9cbiogICAqKkNvbnRleHQ6KiogV2hhdCdzIHRoZSBjb250ZXh0IHN3aXRjaGluZyBpbiB0aGF0IGNhbGw/XG4qICAgKipBcmd1bWVudHM6KiogV2hhdCBhcmUgdGhlIGFyZ3VtZW50cyBwYXNzZWQgdG8gYHpzd2FwX2xvYWRgPyBBcmUgdGhlcmUgc3BlY2lmaWMgcGFnZSByYW5nZXMgb3Igb3RoZXIgZGF0YSB0aGF0IG1pZ2h0IHByb3ZpZGUgY2x1ZXMgYWJvdXQgdGhlIHdvcmtsb2FkP1xuKiAgICoqTGF0ZW5jeToqKiBIb3cgbG9uZyBkb2VzIGB6c3dhcF9sb2FkYCB0YWtlIHRvIGV4ZWN1dGUgaW4gZWFjaCBzY2VuYXJpbz8gXCJJJ2xsIG5lZWQgdG8gaW5zdHJ1bWVudCB0aGUgY29kZSBpZiB0aGUgY2FsbCBzdGFja3MgYXJlbid0IGF2YWlsYWJsZSB0byBtZS5cIlxuXG5cIkZpbmFsbHksIGFmdGVyIGEgdGhvcm91Z2ggaW52ZXN0aWdhdGlvbiwgSSdkIHdhbnQgdG8gYnVpbGQgYSBtZW50YWwgbWFwIG9mIGhvdyBac3dhcCBpbnRlZ3JhdGVzIHdpdGggdGhlIGtlcm5lbCdzIG1lbW9yeSBtYW5hZ2VtZW50LiBUaGlzIGluZm9ybWF0aW9uIHdpbGwgYmUgaW52YWx1YWJsZSBmb3IgZnV0dXJlIGFuYWx5c2lzLCBkZWJ1Z2dpbmcsIGFuZCBwb3RlbnRpYWxseSwgb3B0aW1pemF0aW9uIGVmZm9ydHMuXCJcblxuXG4iLCJJbnB1dFRva2VucyI6NzI5MywiT3V0cHV0VG9rZW5zIjoxOCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjE2LCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMDdUMjA6Mzc6MjguOTgxNjcyMjM4WiIsIlNlcSI6MTAsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyMTgwMjU2MTQ3LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcInpzd2FwX2xvYWRcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiaW5jbHVkZS9saW51eC96c3dhcC5oPTI4PWJvb2wgenN3YXBfc3RvcmUoc3RydWN0IGZvbGlvICpmb2xpbyk7XFxuaW5jbHVkZS9saW51eC96c3dhcC5oOjI5OmludCB6c3dhcF9sb2FkKHN0cnVjdCBmb2xpbyAqZm9saW8pO1xcbmluY2x1ZGUvbGludXgvenN3YXAuaC0zMC12b2lkIHpzd2FwX2ludmFsaWRhdGUoc3dwX2VudHJ5X3Qgc3dwKTtcXG4tLVxcbmluY2x1ZGUvbGludXgvenN3YXAuaD00Mj1zdGF0aWMgaW5saW5lIGJvb2wgenN3YXBfc3RvcmUoc3RydWN0IGZvbGlvICpmb2xpbylcXG4tLVxcbmluY2x1ZGUvbGludXgvenN3YXAuaC00Ni1cXG5pbmNsdWRlL2xpbnV4L3pzd2FwLmg6NDc6c3RhdGljIGlubGluZSBpbnQgenN3YXBfbG9hZChzdHJ1Y3QgZm9saW8gKmZvbGlvKVxcbmluY2x1ZGUvbGludXgvenN3YXAuaC00OC17XFxuLS1cXG5tbS9wYWdlX2lvLmM9NDUyPXZvaWQgc3dhcF9yZWFkX2ZvbGlvKHN0cnVjdCBzd2FwX2lvX2N0eCAqY3R4LCBzdHJ1Y3QgZm9saW8gKmZvbGlvKVxcbi0tXFxubW0vcGFnZV9pby5jLTQ3OS1cXG5tbS9wYWdlX2lvLmM6NDgwOlxcdGlmICh6c3dhcF9sb2FkKGZvbGlvKSAhPSAtRU5PRU5UKVxcbm1tL3BhZ2VfaW8uYy00ODEtXFx0XFx0Z290byBmaW5pc2g7XFxuLS1cXG5tbS96c3dhcC5jPTE1ODM9c3RhdGljIGJvb2wgenN3YXBfaXNfcHJlc2VudChzd3BfZW50cnlfdCBlbnRyeSwgdW5zaWduZWQgaW50IG5yKVxcbi0tXFxubW0venN3YXAuYy0xNjAwLS8qKlxcbm1tL3pzd2FwLmM6MTYwMTogKiB6c3dhcF9sb2FkKCkgLSBsb2FkIGEgZm9saW8gZnJvbSB6c3dhcFxcbm1tL3pzd2FwLmMtMTYwMi0gKiBAZm9saW86IGZvbGlvIHRvIGxvYWRcXG4tLVxcbm1tL3pzd2FwLmMtMTYxNi0gKi9cXG5tbS96c3dhcC5jOjE2MTc6aW50IHpzd2FwX2xvYWQoc3RydWN0IGZvbGlvICpmb2xpbylcXG5tbS96c3dhcC5jLTE2MTgte1xcbi0tXFxubW0venN3YXAuYy0xNjMwLVxcdC8qXFxubW0venN3YXAuYzoxNjMxOlxcdCAqIEEgbGFyZ2UgZm9saW8gY2FuIGxlZ2l0aW1hdGVseSByZWFjaCB6c3dhcF9sb2FkKCkgd2l0aCBpdHMgd2hvbGVcXG5tbS96c3dhcC5jLTE2MzItXFx0ICogcmFuZ2Ugb24gdGhlIGJhY2tpbmcgZGV2aWNlLCBzbyBzY2FuIHRoZSByYW5nZSByYXRoZXIgdGhhbiByZWplY3RpbmdcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDdUMjA6Mzc6MzEuMTYxOTM5NTc1WiIsIlNlcSI6MTEsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjQwNjIwNjkyNDgsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIGEgTWVtb3J5IE1hbmFnZW1lbnQgUGF0Y2gqKlxuXG5Pa2F5LCBsZXQncyBicmVhayB0aGlzIGRvd24uIE15IGluaXRpYWwgb2JzZXJ2YXRpb24gaXMgdGhhdCB0aGlzIHBhdGNoIGRpdmVzIGludG8gYG1tL3pzd2FwLmNgLCBpbW1lZGlhdGVseSBwbGFjaW5nIGl0IHdpdGhpbiB0aGUgbWVtb3J5IG1hbmFnZW1lbnQgc3Vic3lzdGVtLCBzcGVjaWZpY2FsbHkgcmVsYXRlZCB0byB6c3dhcC4gVGhlIGNvcmUgY2hhbmdlIGlzIGluIGB6c3dhcF9sb2FkKClgLiBJdCBhcHBlYXJzIHdlJ3JlIHJlZmluaW5nIGl0cyBiZWhhdmlvciB3aXRoIGxhcmdlIGZvbGlvcy4gVGhlIGV4aXN0aW5nIGNvZGUgd2FybmVkIGFuZCByZXR1cm5lZCBgLUVJTlZBTGAuIFRoZSBuZXcgY29kZSBpbnRyb2R1Y2VzIGB6c3dhcF9pc19wcmVzZW50KClgIGFuZCBjaGFuZ2VzIHRoZSByZXR1cm4gdmFsdWVzIGFuZCB3YXJuaW5nLiBTcGVjaWZpY2FsbHksIGl0IG5vdyBjaGVja3MgaWYgKmFueSogcGFydCBvZiB0aGUgbGFyZ2UgZm9saW8gaXMgcHJlc2VudCBpbiB6c3dhcCB1c2luZyBhIG5ldyBoZWxwZXIgZnVuY3Rpb24sIGB6c3dhcF9pc19wcmVzZW50KClgLiBJZiBldmVuIGEgcGFydCBpcyBwcmVzZW50LCB0aGVuIGl0IHdhcm5zIGFuZCByZXR1cm5zIGAtRUlPYC4gSG93ZXZlciwgaWYgdGhlIGxhcmdlIGZvbGlvIGlzbid0IHByZXNlbnQgaW4genN3YXAgYXQgYWxsLCBpdCdsbCByZXR1cm4gYC1FTk9FTlRgIGFsbG93aW5nIHRoZSBzd2FwIGRldmljZSB0byB0YWtlIG92ZXIuXG5cbk15IG5leHQgdGhvdWdodCBpcyByZWFjaGFiaWxpdHkgYW5kIGZ1enppbmcuIElzIHRoaXMgY2hhbmdlIHNvbWV0aGluZyB3ZSBjYW4gYWN0dWFsbHkgaGl0IGFuZCBpcyBpdCB3b3J0aCB0aGUgZWZmb3J0IG9mIGZ1enppbmc/IEl0J3MgY2xlYXJseSByZWFjaGFibGUgaW4gc3RhbmRhcmQga2VybmVsIGNvbmZpZ3VyYXRpb25zIHdpdGggc3dhcCBhbmQgenN3YXAgZW5hYmxlZCwgZXNwZWNpYWxseSB3aXRoIHRob3NlIGxhcmdlIGZvbGlvIHN3YXAtaW5zIChtVEhQLCBzd2FwY2FjaGUpLiBXZSBoYXZlIGxvZ2ljIGNoYW5nZXMgaW4gbWVtb3J5IG1hbmFnZW1lbnQsIHNvIGFjY29yZGluZyB0byBteSBjcml0ZXJpYSwgaXQncyB3b3J0aCBpbnZlc3RpZ2F0aW5nLlxuXG5Ob3csIEkgbmVlZCB0byBjaG9vc2UgdGhlIGZvY3VzIHN5bWJvbHMgZm9yIGZ1enppbmcuIGB6c3dhcF9sb2FkYCBpcyBkaXJlY3RseSBpbXBhY3RlZCwgYW5kIGBzd2FwX3JlYWRfZm9saW9gIGJlY29tZXMgaW50ZXJlc3RpbmcgYmVjYXVzZSBpdCBtaWdodCBpbnRlcmFjdCBub3cgaW4gY2FzZXMgd2hlcmUgYC1FTk9FTlRgIGlzIHJldHVybmVkLiBTaW5jZSBgenN3YXBfbG9hZGAgaXMgenN3YXAgc3BlY2lmaWMsIGl0IHdvdWxkbid0IGJlIHVuaXZlcnNhbGx5IHVzZWZ1bC4gQnV0IG1heWJlIGBzd2FwX3JlYWRfZm9saW9gIGlzIGFuIGludGVyZXN0aW5nIGNhbmRpZGF0ZSBmb3IgY2FsbGluZy4gSSdsbCBuZWVkIHRvIGNoZWNrIHRoZSBjYWxsIGhpZXJhcmNoeS5cblxuXG4iLCJJbnB1dFRva2VucyI6ODI5OSwiT3V0cHV0VG9rZW5zIjoxOSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjM2NSwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0wN1QyMDozNzozNS4yMjQwMTI2MDJaIiwiU2VxIjoxMiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjIzMjkyMTk3MTUsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwic3dhcF9yZWFkX2ZvbGlvXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm1tL21lbW9yeS5jPTQ3NTA9c3RhdGljIGJvb2wgY2FuX3N3YXBpbl90aHAoc3RydWN0IHZtX2ZhdWx0ICp2bWYsIHB0ZV90ICpwdGVwLCBpbnQgbnJfcGFnZXMpXFxuLS1cXG5tbS9tZW1vcnkuYy00NzYyLVxcdC8qXFxubW0vbWVtb3J5LmM6NDc2MzpcXHQgKiBzd2FwX3JlYWRfZm9saW8oKSBjYW4ndCBoYW5kbGUgdGhlIGNhc2UgYSBsYXJnZSBmb2xpbyBpcyBoeWJyaWRseVxcbm1tL21lbW9yeS5jLTQ3NjQtXFx0ICogZnJvbSBkaWZmZXJlbnQgYmFja2VuZHMuIEFuZCB0aGV5IGFyZSBsaWtlbHkgY29ybmVyIGNhc2VzLiBTaW1pbGFyXFxuLS1cXG5tbS9wYWdlX2lvLmM9Mzk3PXN0YXRpYyBpbnQgc3dhcF96ZXJvbWFwX2JhdGNoKHN3cF9lbnRyeV90IGVudHJ5LCBpbnQgbWF4X25yLFxcbi0tXFxubW0vcGFnZV9pby5jLTQxOC1cXG5tbS9wYWdlX2lvLmM6NDE5OnN0YXRpYyBib29sIHN3YXBfcmVhZF9mb2xpb196ZXJvbWFwKHN0cnVjdCBmb2xpbyAqZm9saW8pXFxubW0vcGFnZV9pby5jLTQyMC17XFxuLS1cXG5tbS9wYWdlX2lvLmMtNDUxLVxcbm1tL3BhZ2VfaW8uYzo0NTI6dm9pZCBzd2FwX3JlYWRfZm9saW8oc3RydWN0IHN3YXBfaW9fY3R4ICpjdHgsIHN0cnVjdCBmb2xpbyAqZm9saW8pXFxubW0vcGFnZV9pby5jLTQ1My17XFxuLS1cXG5tbS9wYWdlX2lvLmMtNDc0LVxcbm1tL3BhZ2VfaW8uYzo0NzU6XFx0aWYgKHN3YXBfcmVhZF9mb2xpb196ZXJvbWFwKGZvbGlvKSkge1xcbm1tL3BhZ2VfaW8uYy00NzYtXFx0XFx0Zm9saW9fdW5sb2NrKGZvbGlvKTtcXG4tLVxcbm1tL3N3YXAuaD0yNTY9aW50IHNpb19wb29sX2luaXQodm9pZCk7XFxubW0vc3dhcC5oOjI1Nzp2b2lkIHN3YXBfcmVhZF9mb2xpbyhzdHJ1Y3Qgc3dhcF9pb19jdHggKmN0eCwgc3RydWN0IGZvbGlvICpmb2xpbyk7XFxubW0vc3dhcC5oLTI1OC12b2lkIHN3YXBfcmVhZF9zdWJtaXQoc3RydWN0IHN3YXBfaW9fY3R4ICpjdHgpO1xcbi0tXFxubW0vc3dhcC5oPTM3NT1zdGF0aWMgaW5saW5lIHZvaWQgZm9saW9fcHV0X3N3YXAoc3RydWN0IGZvbGlvICpmb2xpbywgc3RydWN0IHBhZ2UgKnBhZ2UpXFxuLS1cXG5tbS9zd2FwLmgtMzc4LVxcbm1tL3N3YXAuaDozNzk6c3RhdGljIGlubGluZSB2b2lkIHN3YXBfcmVhZF9mb2xpbyhzdHJ1Y3Qgc3dhcF9pb19jdHggKmN0eCwgc3RydWN0IGZvbGlvICpmb2xpbylcXG5tbS9zd2FwLmgtMzgwLXtcXG4tLVxcbm1tL3N3YXBfc3RhdGUuYz02NDI9c3RhdGljIHN0cnVjdCBmb2xpbyAqc3dhcF9jYWNoZV9yZWFkX2ZvbGlvKHN0cnVjdCBzd2FwX2lvX2N0eCAqY3R4LFxcbi0tXFxubW0vc3dhcF9zdGF0ZS5jLTY1Ny1cXG5tbS9zd2FwX3N0YXRlLmM6NjU4OlxcdHN3YXBfcmVhZF9mb2xpbyhjdHgsIGZvbGlvKTtcXG5tbS9zd2FwX3N0YXRlLmMtNjU5LVxcdGlmIChyZWFkYWhlYWQpIHtcXG4tLVxcbm1tL3N3YXBfc3RhdGUuYz02ODM9c3RydWN0IGZvbGlvICpzd2FwaW5fc3luYyhzd3BfZW50cnlfdCBlbnRyeSwgZ2ZwX3QgZ2ZwLCB1bnNpZ25lZCBsb25nIG9yZGVycyxcXG4tLVxcbm1tL3N3YXBfc3RhdGUuYy02OTgtXFxubW0vc3dhcF9zdGF0ZS5jOjY5OTpcXHRzd2FwX3JlYWRfZm9saW8oXFx1MDAyNmN0eCwgZm9saW8pO1xcbm1tL3N3YXBfc3RhdGUuYy03MDAtXFx0c3dhcF9yZWFkX3N1Ym1pdChcXHUwMDI2Y3R4KTtcXG4tLVxcbm1tL3N3YXBmaWxlLmM9MjkyNj1FWFBPUlRfU1lNQk9MX0dQTChhZGRfc3dhcF9leHRlbnQpO1xcbi0tXFxubW0vc3dhcGZpbGUuYy0yOTMwLSAqIG9udG8gYSBjb250aWd1b3VzIHJhbmdlIG9mIGRpc2sgYmxvY2tzLiAgQSByYnRyZWUgb2Ygc3dhcCBleHRlbnRzIGlzXFxubW0vc3dhcGZpbGUuYzoyOTMxOiAqIGJ1aWx0IGF0IHN3YXBvbiB0aW1lIGFuZCBpcyB0aGVuIHVzZWQgYXQgc3dhcF93cml0ZXBhZ2Uvc3dhcF9yZWFkX2ZvbGlvXFxubW0vc3dhcGZpbGUuYy0yOTMyLSAqIHRpbWUgZm9yIGxvY2F0aW5nIHdoZXJlIG9uIGRpc2sgYSBwYWdlIGJlbG9uZ3MuXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA3VDIwOjM3OjM3LjU1MzIzNzg4N1oiLCJTZXEiOjEzLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjo0NTYwNDAwNzAwLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKk15IEFzc2Vzc21lbnQgb2YgdGhlIFpzd2FwIFBhdGNoKipcblxuT2theSwgbGV0J3MgYnJlYWsgdGhpcyBkb3duLiBGaXJzdCwgSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhlIHNjb3BlIG9mIHRoZXNlIGNoYW5nZXMuIEknbSBzdGFydGluZyBieSB0cmFjaW5nIHRoZSBrZXkgZnVuY3Rpb24gY2FsbHMsIGxpa2UgYHpzd2FwX2xvYWRgLCBgenN3YXBfc3RvcmVgLCBhbmQgYHpzd2FwX2lzX3ByZXNlbnRgIHRvIHNlZSB3aGVyZSB0aGV5J3JlIGRlZmluZWQgYW5kIGhvdyB0aGV5J3JlIHVzZWQuIEkndmUgY29uZmlybWVkIHRoYXQgYHpzd2FwX2xvYWRgIGlzIG5vbi1zdGF0aWMgYW5kIGluIGBtbS96c3dhcC5jYCwgd2hpY2ggaXMgaW1wb3J0YW50IGZvciB1bmRlcnN0YW5kaW5nIGl0cyBwb3RlbnRpYWwgaW1wYWN0LiBJIGFsc28gY2hlY2tlZCBgenN3YXBfc3RvcmVgIChhbHNvIGluIGBtbS96c3dhcC5jYCksIGFuZCBgenN3YXBfaXNfcHJlc2VudGAgKHN0YXRpYyBpbiB0aGUgc2FtZSBmaWxlKS4gVGhlbiBJIHdlbnQgb24gdG8gdmVyaWZ5IHRoZSBwcmVzZW5jZSBvZiBgc3dhcF9yZWFkX2ZvbGlvYCwgYW5kIGBzd2FwX2NhY2hlX3JlYWRfZm9saW9gLCBhbmQgYHN3YXBpbl9zeW5jYCwgYW5kIHRoZWlyIHJlbGF0aW9uc2hpcCB3aXRoIHRoZSBrZXkgZnVuY3Rpb25zLlxuXG5OZXh0LCBJIG5lZWRlZCB0byBjb25maXJtIHRoZSBjb25maWd1cmF0aW9uIGRlcGVuZGVuY2llcy4gWnN3YXAgb2J2aW91c2x5IGhpbmdlcyBvbiBgQ09ORklHX1NXQVBgLCBhbmQgc3BlY2lmaWNhbGx5LCBgQ09ORklHX1pTV0FQYC4gSSBkb3VibGUtY2hlY2tlZCBgbW0vS2NvbmZpZ2AgdG8gYmUgYWJzb2x1dGVseSBzdXJlOyB5ZXMsIGBaU1dBUGAgKmRlcGVuZHMqIG9uIGBTV0FQYCwgKnNlbGVjdHMqIGBDUllQVE9gIGFuZCBgWlNNQUxMT0NgLCB3aGljaCBhbGlnbnMgd2l0aCBteSB1bmRlcnN0YW5kaW5nIG9mIGhvdyBjb21wcmVzc2VkIHN3YXAgb3BlcmF0ZXMuIEkgYWxzbyBub3RlZCBgQ09ORklHX1pTV0FQX0RFRkFVTFRfT05gIGFzIGEgcG9zc2libGUgY29udmVuaWVuY2Ugb3B0aW9uLCBidXQgbm90IGVzc2VudGlhbC5cblxuTm93LCB0byBzb2xpZGlmeSBteSB1bmRlcnN0YW5kaW5nLCBJJ3ZlIHZlcmlmaWVkIHRoZSBcIkZvY3VzU3ltYm9sc1wiOiBgenN3YXBfbG9hZGAgYW5kIGBzd2FwX3JlYWRfZm9saW9gLiBUaGVzZSBhcmUgY2xlYXJseSB0aGUgY29yZSBtb2RpZmljYXRpb25zIGJlaW5nIG1hZGUgdG8gbWVtb3J5IG1hbmFnZW1lbnQuXG5cbkZpbmFsbHksIEkndmUgcmV2aWV3ZWQgdGhlIHJlYXNvbmluZyBiZWhpbmQgdGhlIHBhdGNoOiBUaGUgcGF0Y2ggbW9kaWZpZXMgYHpzd2FwX2xvYWQoKWAgYW5kIGFkZHMgYHpzd2FwX2lzX3ByZXNlbnQoKWAgaW4gYG1tL3pzd2FwLmNgLCB3aGljaCBpcyBjZW50cmFsIHRvIHRoZSBjb3JlIG1lbW9yeSBtYW5hZ2VtZW50IHN3YXAtaW4gbG9naWMgYW5kIGludHJvZHVjZXMgbmV3IGFzc2VydGlvbi9jaGVja2luZyBiZWhhdmlvciB3aGljaCBtYXkgYmUgcmVhY2hlZCBpbiB2aXJ0dWFsaXplZCBlbnZpcm9ubWVudHMuIFRoaXMgaXMgYSBjcml0aWNhbCBjaGFuZ2UgYmVjYXVzZSBpdCBjaGFuZ2VzIGhvdyBsYXJnZSBmb2xpb3MgYXJlIGhhbmRsZWQgaW4genN3YXAuIFRoaXMgY291bGQgcG90ZW50aWFsbHkgbGVhZCB0byBuZXcgYW5kIGludGVyZXN0aW5nIGVkZ2UgY2FzZXMgYW5kIHZ1bG5lcmFiaWxpdGllcywgc28gaXQncyBzb21ldGhpbmcgdGhhdCAqYWJzb2x1dGVseSogbmVlZHMgZnV6emluZyBhbmQgdGhvcm91Z2ggdGVzdGluZy5cblxuVGhpcyBhbGwgY2hlY2tzIG91dDsgYWxsIHJlcXVpcmVtZW50cyBoYXZlIGJlZW4gbWV0IGFuZCB0aGUgaW1wbGljYXRpb25zIGFyZSBjbGVhci4gSSdtIHJlYWR5IHRvIGBzZXQtcmVzdWx0c2AuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjk4ODYsIk91dHB1dFRva2VucyI6MTE0LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MzkyLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA3VDIwOjM3OjQyLjExMzY0MzAzN1oiLCJTZXEiOjE0LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJzZXQtcmVzdWx0cyIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjgzMTMxNDA4LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJTV0FQXCIsXG4gICAgXCJaU1dBUFwiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcInpzd2FwX2xvYWRcIixcbiAgICBcInN3YXBfcmVhZF9mb2xpb1wiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIG1vZGlmaWVzIG1lbW9yeSBtYW5hZ2VtZW50IGxvZ2ljIGluIG1tL3pzd2FwLmMgYnkgaW50cm9kdWNpbmcgenN3YXBfaXNfcHJlc2VudCgpIGFuZCB1cGRhdGluZyB6c3dhcF9sb2FkKCkgdG8gaW5zcGVjdCBsYXJnZSBmb2xpb3MgaW5zdGVhZCBvZiB1bmNvbmRpdGlvbmFsbHkgcmVqZWN0aW5nIHRoZW0uIFRoaXMgY2hhbmdlcyBjb3JlIHN3YXAtaW4gaGFuZGxpbmcgYW5kIGFzc2VydGlvbnMgaW4gcmVhY2hhYmxlIG1tIGNvZGUsIHdhcnJhbnRpbmcgZnV6emluZy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJTV0FQXCIsXG4gICAgXCJaU1dBUFwiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcInpzd2FwX2xvYWRcIixcbiAgICBcInN3YXBfcmVhZF9mb2xpb1wiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIG1vZGlmaWVzIG1lbW9yeSBtYW5hZ2VtZW50IGxvZ2ljIGluIG1tL3pzd2FwLmMgYnkgaW50cm9kdWNpbmcgenN3YXBfaXNfcHJlc2VudCgpIGFuZCB1cGRhdGluZyB6c3dhcF9sb2FkKCkgdG8gaW5zcGVjdCBsYXJnZSBmb2xpb3MgaW5zdGVhZCBvZiB1bmNvbmRpdGlvbmFsbHkgcmVqZWN0aW5nIHRoZW0uIFRoaXMgY2hhbmdlcyBjb3JlIHN3YXAtaW4gaGFuZGxpbmcgYW5kIGFzc2VydGlvbnMgaW4gcmVhY2hhYmxlIG1tIGNvZGUsIHdhcnJhbnRpbmcgZnV6emluZy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDdUMjA6Mzc6NDIuMTk2NzgyMzQ1WiIsIlNlcSI6MTUsIk5lc3RpbmciOjEsIlR5cGUiOiJhY3Rpb24iLCJOYW1lIjoiSWYiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNzk5NjA3NTU1NCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA3VDIwOjM3OjQyLjE5NzU0NTE0NVoiLCJTZXEiOjE2LCJOZXN0aW5nIjoyLCJUeXBlIjoiYWdlbnQiLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJjb3JlIiwiRHVyYXRpb24iOjE3OTk1MzA4NDM0LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBtb2RpZmllcyBgenN3YXBfbG9hZCgpYCB0byBzdXBwb3J0IGNoZWNraW5nIHdoZXRoZXIgbGFyZ2UgZm9saW9zIGhhdmUgZW50cmllcyBpbiB6c3dhcCB2aWEgYHpzd2FwX2lzX3ByZXNlbnQoKWAuIElmIG5vIGVudHJpZXMgaW4gdGhlIHJhbmdlIGFyZSBjYWNoZWQgaW4genN3YXAsIGl0IHJldHVybnMgYC1FTk9FTlRgIHNvIHRoZSBiYWNraW5nIHN3YXAgZGV2aWNlIGNhbiByZWFkIHRoZSBlbnRpcmUgbGFyZ2UgZm9saW8gaW5zdGVhZCBvZiB1bmNvbmRpdGlvbmFsbHkgZmFpbGluZyB3aXRoIGAtRUlOVkFMYC5cXG5cXG5BbGwgdmFyaWFibGVzIHVzZWQgaW4gdGhlIG5ld2x5IGludHJvZHVjZWQgYHpzd2FwX2lzX3ByZXNlbnQoKWAgZnVuY3Rpb24gKGBvZmZzZXRgLCBgdHJlZWAsIGBpbmRleGApIGFyZSBmdWxseSBpbml0aWFsaXplZCBzY2FsYXIgYW5kIHBvaW50ZXIgdmFsdWVzLiBUaGUgcGF0Y2ggZG9lcyBub3QgYWxsb2NhdGUgbmV3IHN0cnVjdHVyZXMsIGNvcHkgdW5pbml0aWFsaXplZCBtZW1vcnkgdG8gdXNlciBzcGFjZSwgYnJhbmNoIG9uIHVuaW5pdGlhbGl6ZWQgdmFsdWVzLCBvciBhbHRlciBidWZmZXIgbGVuZ3RocyBpbiBhIHdheSB0aGF0IHdvdWxkIGxlYXZlIHVuaW5pdGlhbGl6ZWQga2VybmVsIG1lbW9yeSBleHBvc2VkLiBBbnkgcG90ZW50aWFsIHBhZ2UvZm9saW8gc3RhdGUgaXNzdWVzIG9yIG91dC1vZi1ib3VuZHMgaW5kZXggaXNzdWVzIGFyZSBhZGVxdWF0ZWx5IGNvdmVyZWQgYnkgc3RhbmRhcmQgYXNzZXJ0aW9ucyBhbmQgS0FTQU4uIFRoZXJlZm9yZSwgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGlzIG5vdCByZXF1aXJlZC5cIixcbiAgXCJOZWVkc0tNU0FOXCI6IGZhbHNlXG59IiwiSW5zdHJ1Y3Rpb24iOiJZb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgc2VjdXJpdHkgZW5naW5lZXIgc3BlY2lhbGl6aW5nIGluIGtlcm5lbCBtZW1vcnlcbmVycm9yIGRldGVjdG9ycyAoS0FTQU4gYW5kIEtNU0FOKS4gWW91ciBqb2IgaXMgdG8gcmV2aWV3IHRoZSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kXG5kZXRlcm1pbmUgaWYgdGhlIGNvZGUgY2hhbmdlcyBqdXN0aWZ5IHNwYXduaW5nIGEgZGVkaWNhdGVkIEtNU0FOIChLZXJuZWxNZW1vcnlTYW5pdGl6ZXIpXG5mdXp6aW5nIHNlc3Npb24gaW4gYWRkaXRpb24gdG8gc3RhbmRhcmQgS0FTQU4gZnV6emluZy5cblxuQ1JJVElDQUwgRElTVElOQ1RJT04gQkVUV0VFTiBLQVNBTiBBTkQgS01TQU46XG4tIFN0YW5kYXJkIEtBU0FOIGtlcm5lbCBidWlsZHMgKHVwc3RyZWFtLWFwcGFybW9yLWthc2FuLmNvbmZpZykgYWxyZWFkeSBlbmFibGVcbiAgYSBjb21wcmVoZW5zaXZlIHN1aXRlIG9mIGRlYnVnZ2luZyB0b29scyBhbmQgc2FuaXRpemVycywgaW5jbHVkaW5nIEtBU0FOXG4gIChvdXQtb2YtYm91bmRzIGFjY2Vzc2VzLCB1c2UtYWZ0ZXItZnJlZSwgZG91YmxlIGZyZWUsIGludmFsaWQgZnJlZSksIExPQ0tERVBcbiAgKGxvY2tpbmcgYnVncyBhbmQgZGVhZGxvY2tzKSwgVUItc2FuaXRpemVycywgYW5kIG1lbW9yeSBjb3JydXB0aW9uIGNoZWNrcy5cbi0gS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcikgZGV0ZWN0cyByZWFkcyBvZiBVTklOSVRJQUxJWkVEIG1lbW9yeSAoc3RhY2ssIGhlYXAsXG4gIG9yIHBhZ2UgYWxsb2NhdGlvbnMpIGFuZCBrZXJuZWwtdG8tdXNlciBtZW1vcnkgaW5mby1sZWFrcy5cblxuUnVsZTogVEhFUkUgSVMgTk8gU0VOU0UgSU4gUlVOTklORyBBIEtNU0FOIFNFU1NJT04gSUYgQSBCVUcgQ0FOIEJFIENBVUdIVCBCWSBLQVNBTixcbkxPQ0tERVAsIE9SIE9USEVSIFNUQU5EQVJEIEJVRyBERVRFQ1RPUlMuXG5BIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaW5jdXJzIHNpZ25pZmljYW50IHJlc291cmNlIGNvc3RzLiBZb3UgbXVzdCBPTkxZXG5zZXQgTmVlZHNLTVNBTj10cnVlIGlmIHRoZSBjb2RlIGNoYW5nZXMgaW50cm9kdWNlIG9yIGV4cG9zZSBVTklOSVRJQUxJWkVEIE1FTU9SWSByaXNrc1xudGhhdCBhcmUgZGV0ZWN0ZWQgT05MWSBieSBLTVNBTi5cblxuTG9vayBob2xpc3RpY2FsbHkgYXQgdGhlIHBhdGNoIHNlcmllcyBhbmQgc3Vycm91bmRpbmcgY29kZS4gRXZlbiBpZiBubyBkaXJlY3RcbnVuaW5pdGlhbGl6ZWQgZmllbGQgYWNjZXNzZXMgb3IgbmV3IGJ1ZmZlciBhbGxvY2F0aW9ucyBhcmUgYWRkZWQgaW4gdGhlIGRpZmYgaXRzZWxmLFxuYSBwYXRjaCBtYXkgYWx0ZXIgY29udHJvbCBmbG93LCBib3VuZHMgY2hlY2tpbmcsIG9yIGRhdGEgbGVuZ3RoIGNhbGN1bGF0aW9ucyBpbiB3YXlzXG50aGF0IGNoYW5nZSBob3cgdGhlIHJlc3Qgb2YgdGhlIGNvZGUgb3BlcmF0ZXMgb24gZXhpc3RpbmcgYnVmZmVycyAoZS5nLiBhbGxvd2luZ1xudW5pbml0aWFsaXplZCBzdGFjay9oZWFwIG1lbW9yeSB0byBiZSByZWFkLCBjb3BpZWQgdG8gdXNlciBzcGFjZSwgb3IgdXNlZCBpbiBjb250cm9sXG5mbG93KS4gRG8gbm90IGhlc2l0YXRlIHRvIHVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUsXG5jYWxsZWQgZnVuY3Rpb25zLCBhbmQgY2FsbGVycy5cblxuU2V0IE5lZWRzS01TQU49dHJ1ZSBPTkxZIElGIHRoZSBwYXRjaCBpbnRyb2R1Y2VzIG9yIG1vZGlmaWVzOlxuMS4gS2VybmVsIHN0cnVjdHVyZXMgc2VudCB0byB1c2VyIHNwYWNlICh2aWEgY29weV90b191c2VyLCBwdXRfdXNlciwgbmV0bGluayBza2JcbiAgIGF0dHJpYnV0ZXMsIGlvY3RsIG91dHB1dCBhcmd1bWVudHMsIHNvY2tldCBvcHRpb25zLCBvciBCUEYgYnVmZmVycykgd2hlcmUgZmllbGRzXG4gICBvciBzdHJ1Y3R1cmUgcGFkZGluZyBtaWdodCBub3QgYmUgZnVsbHkgaW5pdGlhbGl6ZWQvemVyb2VkLlxuMi4gQ29uZGl0aW9uYWwgbG9naWMgb3IgYnJhbmNoaW5nIHRoYXQgZGVwZW5kcyBvbiBwb3RlbnRpYWxseSB1bmluaXRpYWxpemVkIHZhcmlhYmxlc1xuICAgb3Igc3RydWN0IGZpZWxkcy5cbjMuIEFsbG9jYXRpb24gb3IgaW5pdGlhbGl6YXRpb24gb2YgY29tcGxleCBkYXRhIHN0cnVjdHVyZXMgd2hlcmUgdW5pbml0aWFsaXplZCBmaWVsZHNcbiAgIGNvdWxkIGJlIHJlYWQgbGF0ZXIgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMuXG40LiBCb3VuZHMgY2hlY2tzLCBsZW5ndGhzLCBvciBsb2dpYyBpbiBhIHdheSB0aGF0IGFsbG93cyBzdXJyb3VuZGluZyBjb2RlIHRvIGFjY2Vzc1xuICAgdW5pbml0aWFsaXplZCBieXRlcyBvZiBleGlzdGluZyBidWZmZXJzLlxuXG5TZXQgTmVlZHNLTVNBTj1mYWxzZSBJRjpcbi0gVGhlIGNvZGUgY2hhbmdlcyBwcmltYXJpbHkgcmlzayBvdXQtb2YtYm91bmRzIGFjY2VzcywgYXJyYXkgb3ZlcmZsb3dzLCBOVUxMIHBvaW50ZXJcbiAgZGVyZWZlcmVuY2VzLCBsb2NraW5nIGRlYWRsb2Nrcywgb3IgdXNlLWFmdGVyLWZyZWUgYnVncyAodGhlc2UgYXJlIGFscmVhZHkgY2F1Z2h0XG4gIGJ5IEtBU0FOLCBMT0NLREVQLCBvciBzdGFuZGFyZCBidWcgZGV0ZWN0b3JzKS5cbi0gQWxsIHN0YWNrL2hlYXAgc3RydWN0dXJlcyB0b3VjaGVkIG9yIGludHJvZHVjZWQgYnkgdGhlIHBhdGNoIGFyZSBmdWxseSB6ZXJvZWRcbiAgb3IgaW5pdGlhbGl6ZWQgKGUuZy4gdXNpbmcgPSB7MH0sIG1lbXNldCwga3phbGxvYykgYmVmb3JlIGJlaW5nIHJlYWQgb3IgY29waWVkLlxuLSBUaGUgcGF0Y2ggZG9lcyBub3QgaW50cm9kdWNlIGFueSByaXNrIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHVzYWdlIG9yIGluZm8tbGVha3MuXG5cblVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUgaWYgbmVjZXNzYXJ5LCB0aGVuIHByb3ZpZGVcbmRldGFpbGVkIEtNU0FOUmVhc29uaW5nIGNvbnRyYXN0aW5nIEtBU0FOIHZzIEtNU0FOIGFwcGxpY2FiaWxpdHkgZm9yIHRoaXMgcGF0Y2guXG5QcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy5cblxuXG5Vc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLlxuSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuXG5JZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuXG4iLCJQcm9tcHQiOiJUYXJnZXQgYXJjaGl0ZWN0dXJlOiBhbWQ2NFxuXG5Gb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczpcbmNvbW1pdCAwYWNlMmRiMzUxYWQwYTdlZGI5MGE2Y2EwNDkzNTc0OGJiYzcyZmQxXG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIE1vbiBTZXAgNyAyMDozNzowOSAyMDI2ICswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL21tL3pzd2FwLmMgYi9tbS96c3dhcC5jXG5pbmRleCAzN2YzNGU0MDZjOGUzLi5mZDM2YWMzOGU5YTFlIDEwMDY0NFxuLS0tIGEvbW0venN3YXAuY1xuKysrIGIvbW0venN3YXAuY1xuQEAgLTE1NzEsNiArMTU3MSwzMiBAQCBib29sIHpzd2FwX3N0b3JlKHN0cnVjdCBmb2xpbyAqZm9saW8pXG4gXHRyZXR1cm4gcmV0O1xuIH1cbiBcbisvKipcbisgKiB6c3dhcF9pc19wcmVzZW50KCkgLSBpcyBhbnkgc2xvdCBpbiBbZW50cnksIGVudHJ5ICsgbnIpIGluIHpzd2FwP1xuKyAqIEBlbnRyeTogYmFzZSBzd2FwIGVudHJ5IG9mIHRoZSByYW5nZVxuKyAqIEBucjogbnVtYmVyIG9mIGNvbnRpZ3VvdXMgc2xvdHMgdG8gY2hlY2tcbisgKlxuKyAqIENvbnRleHQ6IFRoZSBjYWxsZXIgbXVzdCBrZWVwIHRoZSByYW5nZSBwaW5uZWQsIG90aGVyd2lzZSB0aGUgYW5zd2VyIGNhblxuKyAqIGNoYW5nZSB1bmRlciBpdC5cbisgKiBSZXR1cm46IHRydWUgaWYgYXQgbGVhc3Qgb25lIHNsb3QgaW4gdGhlIHJhbmdlIGlzIGluIHpzd2FwLlxuKyAqL1xuK3N0YXRpYyBib29sIHpzd2FwX2lzX3ByZXNlbnQoc3dwX2VudHJ5X3QgZW50cnksIHVuc2lnbmVkIGludCBucilcbit7XG4rXHRwZ29mZl90IG9mZnNldCA9IHN3cF9vZmZzZXQoZW50cnkpO1xuK1x0c3RydWN0IHhhcnJheSAqdHJlZSA9IHN3YXBfenN3YXBfdHJlZShlbnRyeSk7XG4rXHR1bnNpZ25lZCBsb25nIGluZGV4ID0gb2Zmc2V0O1xuK1xuK1x0LypcbitcdCAqIEEgcGlubmVkIHJhbmdlIGlzIGF0IG1vc3QgU1dBUEZJTEVfQ0xVU1RFUiBzbG90cyBhbmQgaXMgYWxpZ25lZCB0b1xuK1x0ICogaXRzIG93biBzaXplLCBzbyBvbmUgdHJlZSBjb3ZlcnMgYWxsIG9mIGl0IGFuZCBhIHNpbmdsZSBsb29rdXAgaXNcbitcdCAqIGVub3VnaC4gU2Nhbm5pbmcgb25seSBwYXJ0IG9mIHRoZSByYW5nZSB3b3VsZCByZXBvcnQgYSBmYWxzZVxuK1x0ICogXCJhYnNlbnRcIiBhbmQgbGV0IHRoZSBjYWxsZXIgcmVhZCBhIHN0YWxlIGNvcHkgZnJvbSB0aGUgZGV2aWNlLlxuK1x0ICovXG4rXHRCVUlMRF9CVUdfT04oU1dBUEZJTEVfQ0xVU1RFUiBcdTAwM2UgWlNXQVBfQUREUkVTU19TUEFDRV9QQUdFUyk7XG4rXG4rXHRyZXR1cm4geGFfZmluZCh0cmVlLCBcdTAwMjZpbmRleCwgb2Zmc2V0ICsgbnIgLSAxLCBYQV9QUkVTRU5UKTtcbit9XG4rXG4gLyoqXG4gICogenN3YXBfbG9hZCgpIC0gbG9hZCBhIGZvbGlvIGZyb20genN3YXBcbiAgKiBAZm9saW86IGZvbGlvIHRvIGxvYWRcbkBAIC0xNTc4LDE1ICsxNjA0LDEyIEBAIGJvb2wgenN3YXBfc3RvcmUoc3RydWN0IGZvbGlvICpmb2xpbylcbiAgKiBSZXR1cm46IDAgb24gc3VjY2Vzcywgd2l0aCB0aGUgZm9saW8gdW5sb2NrZWQgYW5kIG1hcmtlZCB1cC10by1kYXRlLCBvciBvbmVcbiAgKiBvZiB0aGUgZm9sbG93aW5nIGVycm9yIGNvZGVzOlxuICAqXG4tICogIC1FSU86IGlmIHRoZSBzd2FwcGVkIG91dCBjb250ZW50IHdhcyBpbiB6c3dhcCwgYnV0IGNvdWxkIG5vdCBiZSBsb2FkZWRcbi0gKiAgaW50byB0aGUgcGFnZSBkdWUgdG8gYSBkZWNvbXByZXNzaW9uIGZhaWx1cmUuIFRoZSBmb2xpbyBpcyB1bmxvY2tlZCwgYnV0XG4tICogIE5PVCBtYXJrZWQgdXAtdG8tZGF0ZSwgc28gdGhhdCBhbiBJTyBlcnJvciBpcyBlbWl0dGVkIChlLmcuIGRvX3N3YXBfcGFnZSgpXG4tICogIHdpbGwgU0lHQlVTKS5cbi0gKlxuLSAqICAtRUlOVkFMOiBpZiB0aGUgc3dhcHBlZCBvdXQgY29udGVudCB3YXMgaW4genN3YXAsIGJ1dCB0aGUgcGFnZSBiZWxvbmdzXG4tICogIHRvIGEgbGFyZ2UgZm9saW8sIHdoaWNoIGlzIG5vdCBzdXBwb3J0ZWQgYnkgenN3YXAuIFRoZSBmb2xpbyBpcyB1bmxvY2tlZCxcbi0gKiAgYnV0IE5PVCBtYXJrZWQgdXAtdG8tZGF0ZSwgc28gdGhhdCBhbiBJTyBlcnJvciBpcyBlbWl0dGVkIChlLmcuXG4tICogIGRvX3N3YXBfcGFnZSgpIHdpbGwgU0lHQlVTKS5cbisgKiAgLUVJTzogaWYgdGhlIHN3YXBwZWQgb3V0IGNvbnRlbnQgd2FzIGluIHpzd2FwIGJ1dCBjb3VsZCBub3QgYmUgaGFuZGVkXG4rICogIGJhY2ssIGVpdGhlciBiZWNhdXNlIGRlY29tcHJlc3Npb24gZmFpbGVkIG9yIGJlY2F1c2UgYSBzbG90IGluIGFcbisgKiAgbGFyZ2UtZm9saW8gcmFuZ2UgaXMgc3RpbGwgaW4genN3YXAgYW5kIHpzd2FwIGNhbm5vdCByZWNvbnN0cnVjdCBhIGxhcmdlXG4rICogIGZvbGlvIGZyb20gcGVyLXBhZ2UgZW50cmllcy4gVGhlIGZvbGlvIGlzIHVubG9ja2VkLCBidXQgTk9UIG1hcmtlZFxuKyAqICB1cC10by1kYXRlLCBzbyB0aGF0IGFuIElPIGVycm9yIGlzIGVtaXR0ZWQgKGUuZy4gZG9fc3dhcF9wYWdlKCkgd2lsbFxuKyAqICBTSUdCVVMpLlxuICAqXG4gICogIC1FTk9FTlQ6IGlmIHRoZSBzd2FwcGVkIG91dCBjb250ZW50IHdhcyBub3QgaW4genN3YXAuIFRoZSBmb2xpbyByZW1haW5zXG4gICogIGxvY2tlZCBvbiByZXR1cm4uXG5AQCAtMTYwNSwxMyArMTYyOCwxOCBAQCBpbnQgenN3YXBfbG9hZChzdHJ1Y3QgZm9saW8gKmZvbGlvKVxuIFx0XHRyZXR1cm4gLUVOT0VOVDtcbiBcbiBcdC8qXG4tXHQgKiBMYXJnZSBmb2xpb3Mgc2hvdWxkIG5vdCBiZSBzd2FwcGVkIGluIHdoaWxlIHpzd2FwIGlzIGJlaW5nIHVzZWQsIGFzXG4tXHQgKiB0aGV5IGFyZSBub3QgcHJvcGVybHkgaGFuZGxlZC4gWnN3YXAgZG9lcyBub3QgcHJvcGVybHkgbG9hZCBsYXJnZVxuLVx0ICogZm9saW9zLCBhbmQgYSBsYXJnZSBmb2xpbyBtYXkgb25seSBiZSBwYXJ0aWFsbHkgaW4genN3YXAuXG4rXHQgKiBBIGxhcmdlIGZvbGlvIGNhbiBsZWdpdGltYXRlbHkgcmVhY2ggenN3YXBfbG9hZCgpIHdpdGggaXRzIHdob2xlXG4rXHQgKiByYW5nZSBvbiB0aGUgYmFja2luZyBkZXZpY2UsIHNvIHNjYW4gdGhlIHJhbmdlIHJhdGhlciB0aGFuIHJlamVjdGluZ1xuK1x0ICogaXQgb3V0cmlnaHQuIFRoZSBjYWxsZXIgaGFzIHBpbm5lZCBldmVyeSBzbG90LCBzbyB6c3dhcCBjYW5ub3Qgc3RhcnRcbitcdCAqIGEgc3RvcmUgb3IgYSB3cml0ZWJhY2sgaW50byB0aGUgcmFuZ2Ugd2hpbGUgd2UgbG9vay5cbiBcdCAqL1xuLVx0aWYgKFdBUk5fT05fT05DRShmb2xpb190ZXN0X2xhcmdlKGZvbGlvKSkpIHtcbi1cdFx0Zm9saW9fdW5sb2NrKGZvbGlvKTtcbi1cdFx0cmV0dXJuIC1FSU5WQUw7XG4rXHRpZiAoZm9saW9fdGVzdF9sYXJnZShmb2xpbykpIHtcbitcdFx0aWYgKFdBUk5fT05fT05DRSh6c3dhcF9pc19wcmVzZW50KHN3cCxcbitcdFx0XHRcdFx0XHQgIGZvbGlvX25yX3BhZ2VzKGZvbGlvKSkpKSB7XG4rXHRcdFx0Zm9saW9fdW5sb2NrKGZvbGlvKTtcbitcdFx0XHRyZXR1cm4gLUVJTztcbitcdFx0fVxuK1x0XHRyZXR1cm4gLUVOT0VOVDtcbiBcdH1cbiBcbiBcdGVudHJ5ID0geGFfbG9hZCh0cmVlLCBvZmZzZXQpO1xuIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDdUMjA6Mzc6NDIuMTk3NTQ2MTk1WiIsIlNlcSI6MTcsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjU0MzU4MTQwOTcsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSBhbmFseXNpcyBvZiB0aGUgc2l0dWF0aW9uOlxuXG4qKktNU0FOIFBhdGNoIEFzc2Vzc21lbnQgZm9yIHpzd2FwLmMqKlxuXG5BbHJpZ2h0LCBsZXQncyBkaXZlIGludG8gdGhpcy4gVGhlIGZpcnN0IHN0ZXAgaXMgY2xlYXI6IHdlIG5lZWQgdG8gYXNzZXNzIHRoaXMgcGF0Y2ggdG8gZmlndXJlIG91dCBpZiBLTVNBTiAoS2VybmVsIE1lbW9yeSBTYW5pdGl6ZXIpIGlzIGFjdHVhbGx5IG5lY2Vzc2FyeS4gVGhlIGZhY3QgdGhhdCB0aGUgcGF0Y2ggaXMgaW4gYG1tL3pzd2FwLmNgIG5hcnJvd3Mgb3VyIGZvY3VzIHNpZ25pZmljYW50bHksIHdoaWNoIGlzIGdvb2QuXG5cbk15IGltbWVkaWF0ZSBpbnN0aW5jdCBpcyB0byBsb29rIGF0IHRoZSBkaWZmLiBJJ2xsIHBvcmUgb3ZlciB0aGUgY29kZSBjaGFuZ2VzLCBidXQgSSdsbCBuZWVkIGNvbnRleHQuIEknbGwgcmVhZCB0aGUgc3Vycm91bmRpbmcgY29kZSBpbiBgbW0venN3YXAuY2AgYXJvdW5kIHRoZSBzcGVjaWZpYyBsaW5lcyB0aGF0IGFyZSBjaGFuZ2VkLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGUgbG9naWMgZmxvdyBhbmQgdGhlIGRhdGEgc3RydWN0dXJlcyBpbnZvbHZlZCwgdG8gdW5kZXJzdGFuZCB0aGUgaW50ZW50IG9mIHRoaXMgcGF0Y2guXG5cbkkgd2lsbCBhbHNvIGRvIGEgcXVpY2sgYGdyZXBgIG9yIGByZWFkLWZpbGVgIHRvIGNoZWNrIHRoZSBjb250ZXh0IGFyb3VuZCBgenN3YXBfbG9hZCgpYCB3aGljaCBpcyBsaWtlbHkgd2hlcmUgdGhlIHBhdGNoIHdpbGwgaGF2ZSB0aGUgbW9zdCBpbXBhY3QuIEkgd2FudCB0byBzZWUgaG93IGRhdGEgaXMgbG9hZGVkLCBtYW5pcHVsYXRlZCwgYW5kIHN1YnNlcXVlbnRseSB1c2VkLiBUaGlzIHdpbGwgaGVscCBtZSB1bmRlcnN0YW5kIHdoZXRoZXIgdW5pbml0aWFsaXplZCBtZW1vcnkgaXMgcG9zc2libHkgYmVpbmcgdXNlZC4gSSB3aWxsIGxpa2VseSBuZWVkIHRvIHVuZGVyc3RhbmQgd2hhdCB0aGUgcGF0Y2ggaXMgZG9pbmcgd2l0aCB0aGF0IGRhdGEgdG8gc2VlIGlmIHdlIGhhdmUgYSBLTVNBTiBwcm9ibGVtLlxuXG5cbiIsIklucHV0VG9rZW5zIjozMDEwLCJPdXRwdXRUb2tlbnMiOjM1LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NjksIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wN1QyMDozNzo0Ny42MzMzNjI3OTJaIiwiU2VxIjoxOCwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MjAzODUwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcIm1tL3pzd2FwLmNcIixcbiAgXCJGaXJzdExpbmVcIjogMTU2NSxcbiAgXCJMaW5lQ291bnRcIjogOTBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiMTU2NTpcXHRcXHRcXHRcXHRlbnRyeSA9IHhhX2VyYXNlKHRyZWUsIG9mZnNldCArIGluZGV4KTtcXG4xNTY2OlxcdFxcdFxcdFxcdGlmIChlbnRyeSlcXG4xNTY3OlxcdFxcdFxcdFxcdFxcdHpzd2FwX2VudHJ5X2ZyZWUoZW50cnkpO1xcbjE1Njg6XFx0XFx0XFx0fVxcbjE1Njk6XFx0XFx0fVxcbjE1NzA6XFx0XFxuMTU3MTpcXHRcXHRyZXR1cm4gcmV0O1xcbjE1NzI6XFx0fVxcbjE1NzM6XFx0XFxuMTU3NDpcXHQvKipcXG4xNTc1OlxcdCAqIHpzd2FwX2lzX3ByZXNlbnQoKSAtIGlzIGFueSBzbG90IGluIFtlbnRyeSwgZW50cnkgKyBucikgaW4genN3YXA/XFxuMTU3NjpcXHQgKiBAZW50cnk6IGJhc2Ugc3dhcCBlbnRyeSBvZiB0aGUgcmFuZ2VcXG4xNTc3OlxcdCAqIEBucjogbnVtYmVyIG9mIGNvbnRpZ3VvdXMgc2xvdHMgdG8gY2hlY2tcXG4xNTc4OlxcdCAqXFxuMTU3OTpcXHQgKiBDb250ZXh0OiBUaGUgY2FsbGVyIG11c3Qga2VlcCB0aGUgcmFuZ2UgcGlubmVkLCBvdGhlcndpc2UgdGhlIGFuc3dlciBjYW5cXG4xNTgwOlxcdCAqIGNoYW5nZSB1bmRlciBpdC5cXG4xNTgxOlxcdCAqIFJldHVybjogdHJ1ZSBpZiBhdCBsZWFzdCBvbmUgc2xvdCBpbiB0aGUgcmFuZ2UgaXMgaW4genN3YXAuXFxuMTU4MjpcXHQgKi9cXG4xNTgzOlxcdHN0YXRpYyBib29sIHpzd2FwX2lzX3ByZXNlbnQoc3dwX2VudHJ5X3QgZW50cnksIHVuc2lnbmVkIGludCBucilcXG4xNTg0OlxcdHtcXG4xNTg1OlxcdFxcdHBnb2ZmX3Qgb2Zmc2V0ID0gc3dwX29mZnNldChlbnRyeSk7XFxuMTU4NjpcXHRcXHRzdHJ1Y3QgeGFycmF5ICp0cmVlID0gc3dhcF96c3dhcF90cmVlKGVudHJ5KTtcXG4xNTg3OlxcdFxcdHVuc2lnbmVkIGxvbmcgaW5kZXggPSBvZmZzZXQ7XFxuMTU4ODpcXHRcXG4xNTg5OlxcdFxcdC8qXFxuMTU5MDpcXHRcXHQgKiBBIHBpbm5lZCByYW5nZSBpcyBhdCBtb3N0IFNXQVBGSUxFX0NMVVNURVIgc2xvdHMgYW5kIGlzIGFsaWduZWQgdG9cXG4xNTkxOlxcdFxcdCAqIGl0cyBvd24gc2l6ZSwgc28gb25lIHRyZWUgY292ZXJzIGFsbCBvZiBpdCBhbmQgYSBzaW5nbGUgbG9va3VwIGlzXFxuMTU5MjpcXHRcXHQgKiBlbm91Z2guIFNjYW5uaW5nIG9ubHkgcGFydCBvZiB0aGUgcmFuZ2Ugd291bGQgcmVwb3J0IGEgZmFsc2VcXG4xNTkzOlxcdFxcdCAqIFxcXCJhYnNlbnRcXFwiIGFuZCBsZXQgdGhlIGNhbGxlciByZWFkIGEgc3RhbGUgY29weSBmcm9tIHRoZSBkZXZpY2UuXFxuMTU5NDpcXHRcXHQgKi9cXG4xNTk1OlxcdFxcdEJVSUxEX0JVR19PTihTV0FQRklMRV9DTFVTVEVSIFxcdTAwM2UgWlNXQVBfQUREUkVTU19TUEFDRV9QQUdFUyk7XFxuMTU5NjpcXHRcXG4xNTk3OlxcdFxcdHJldHVybiB4YV9maW5kKHRyZWUsIFxcdTAwMjZpbmRleCwgb2Zmc2V0ICsgbnIgLSAxLCBYQV9QUkVTRU5UKTtcXG4xNTk4OlxcdH1cXG4xNTk5OlxcdFxcbjE2MDA6XFx0LyoqXFxuMTYwMTpcXHQgKiB6c3dhcF9sb2FkKCkgLSBsb2FkIGEgZm9saW8gZnJvbSB6c3dhcFxcbjE2MDI6XFx0ICogQGZvbGlvOiBmb2xpbyB0byBsb2FkXFxuMTYwMzpcXHQgKlxcbjE2MDQ6XFx0ICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIHdpdGggdGhlIGZvbGlvIHVubG9ja2VkIGFuZCBtYXJrZWQgdXAtdG8tZGF0ZSwgb3Igb25lXFxuMTYwNTpcXHQgKiBvZiB0aGUgZm9sbG93aW5nIGVycm9yIGNvZGVzOlxcbjE2MDY6XFx0ICpcXG4xNjA3OlxcdCAqICAtRUlPOiBpZiB0aGUgc3dhcHBlZCBvdXQgY29udGVudCB3YXMgaW4genN3YXAgYnV0IGNvdWxkIG5vdCBiZSBoYW5kZWRcXG4xNjA4OlxcdCAqICBiYWNrLCBlaXRoZXIgYmVjYXVzZSBkZWNvbXByZXNzaW9uIGZhaWxlZCBvciBiZWNhdXNlIGEgc2xvdCBpbiBhXFxuMTYwOTpcXHQgKiAgbGFyZ2UtZm9saW8gcmFuZ2UgaXMgc3RpbGwgaW4genN3YXAgYW5kIHpzd2FwIGNhbm5vdCByZWNvbnN0cnVjdCBhIGxhcmdlXFxuMTYxMDpcXHQgKiAgZm9saW8gZnJvbSBwZXItcGFnZSBlbnRyaWVzLiBUaGUgZm9saW8gaXMgdW5sb2NrZWQsIGJ1dCBOT1QgbWFya2VkXFxuMTYxMTpcXHQgKiAgdXAtdG8tZGF0ZSwgc28gdGhhdCBhbiBJTyBlcnJvciBpcyBlbWl0dGVkIChlLmcuIGRvX3N3YXBfcGFnZSgpIHdpbGxcXG4xNjEyOlxcdCAqICBTSUdCVVMpLlxcbjE2MTM6XFx0ICpcXG4xNjE0OlxcdCAqICAtRU5PRU5UOiBpZiB0aGUgc3dhcHBlZCBvdXQgY29udGVudCB3YXMgbm90IGluIHpzd2FwLiBUaGUgZm9saW8gcmVtYWluc1xcbjE2MTU6XFx0ICogIGxvY2tlZCBvbiByZXR1cm4uXFxuMTYxNjpcXHQgKi9cXG4xNjE3OlxcdGludCB6c3dhcF9sb2FkKHN0cnVjdCBmb2xpbyAqZm9saW8pXFxuMTYxODpcXHR7XFxuMTYxOTpcXHRcXHRzd3BfZW50cnlfdCBzd3AgPSBmb2xpby1cXHUwMDNlc3dhcDtcXG4xNjIwOlxcdFxcdHBnb2ZmX3Qgb2Zmc2V0ID0gc3dwX29mZnNldChzd3ApO1xcbjE2MjE6XFx0XFx0c3RydWN0IHhhcnJheSAqdHJlZSA9IHN3YXBfenN3YXBfdHJlZShzd3ApO1xcbjE2MjI6XFx0XFx0c3RydWN0IHpzd2FwX2VudHJ5ICplbnRyeTtcXG4xNjIzOlxcdFxcbjE2MjQ6XFx0XFx0Vk1fV0FSTl9PTl9PTkNFKCFmb2xpb190ZXN0X2xvY2tlZChmb2xpbykpO1xcbjE2MjU6XFx0XFx0Vk1fV0FSTl9PTl9PTkNFKCFmb2xpb190ZXN0X3N3YXBjYWNoZShmb2xpbykpO1xcbjE2MjY6XFx0XFxuMTYyNzpcXHRcXHRpZiAoenN3YXBfbmV2ZXJfZW5hYmxlZCgpKVxcbjE2Mjg6XFx0XFx0XFx0cmV0dXJuIC1FTk9FTlQ7XFxuMTYyOTpcXHRcXG4xNjMwOlxcdFxcdC8qXFxuMTYzMTpcXHRcXHQgKiBBIGxhcmdlIGZvbGlvIGNhbiBsZWdpdGltYXRlbHkgcmVhY2ggenN3YXBfbG9hZCgpIHdpdGggaXRzIHdob2xlXFxuMTYzMjpcXHRcXHQgKiByYW5nZSBvbiB0aGUgYmFja2luZyBkZXZpY2UsIHNvIHNjYW4gdGhlIHJhbmdlIHJhdGhlciB0aGFuIHJlamVjdGluZ1xcbjE2MzM6XFx0XFx0ICogaXQgb3V0cmlnaHQuIFRoZSBjYWxsZXIgaGFzIHBpbm5lZCBldmVyeSBzbG90LCBzbyB6c3dhcCBjYW5ub3Qgc3RhcnRcXG4xNjM0OlxcdFxcdCAqIGEgc3RvcmUgb3IgYSB3cml0ZWJhY2sgaW50byB0aGUgcmFuZ2Ugd2hpbGUgd2UgbG9vay5cXG4xNjM1OlxcdFxcdCAqL1xcbjE2MzY6XFx0XFx0aWYgKGZvbGlvX3Rlc3RfbGFyZ2UoZm9saW8pKSB7XFxuMTYzNzpcXHRcXHRcXHRpZiAoV0FSTl9PTl9PTkNFKHpzd2FwX2lzX3ByZXNlbnQoc3dwLFxcbjE2Mzg6XFx0XFx0XFx0XFx0XFx0XFx0XFx0ICBmb2xpb19ucl9wYWdlcyhmb2xpbykpKSkge1xcbjE2Mzk6XFx0XFx0XFx0XFx0Zm9saW9fdW5sb2NrKGZvbGlvKTtcXG4xNjQwOlxcdFxcdFxcdFxcdHJldHVybiAtRUlPO1xcbjE2NDE6XFx0XFx0XFx0fVxcbjE2NDI6XFx0XFx0XFx0cmV0dXJuIC1FTk9FTlQ7XFxuMTY0MzpcXHRcXHR9XFxuMTY0NDpcXHRcXG4xNjQ1OlxcdFxcdGVudHJ5ID0geGFfbG9hZCh0cmVlLCBvZmZzZXQpO1xcbjE2NDY6XFx0XFx0aWYgKCFlbnRyeSlcXG4xNjQ3OlxcdFxcdFxcdHJldHVybiAtRU5PRU5UO1xcbjE2NDg6XFx0XFxuMTY0OTpcXHRcXHRpZiAoIXpzd2FwX2RlY29tcHJlc3MoZW50cnksIGZvbGlvKSkge1xcbjE2NTA6XFx0XFx0XFx0Zm9saW9fdW5sb2NrKGZvbGlvKTtcXG4xNjUxOlxcdFxcdFxcdHJldHVybiAtRUlPO1xcbjE2NTI6XFx0XFx0fVxcbjE2NTM6XFx0XFxuMTY1NDpcXHRcXHRmb2xpb19tYXJrX3VwdG9kYXRlKGZvbGlvKTtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDdUMjA6Mzc6NDcuNjMzNTY4OTkyWiIsIlNlcSI6MTksIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjE3NjExNjcxNjMsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSBhdHRlbXB0IGF0IHN1bW1hcml6aW5nIHRoZSB0aG91Z2h0IHByb2Nlc3MsIHRhaWxvcmVkIGZvciBhbiBleHBlcnQgYXVkaWVuY2U6XG5cbioqVHJhY2luZyB0aGUgenN3YXBfbG9hZCBDYWxsIFBhdGgqKlxuXG5BbHJpZ2h0LCBsZXQncyBkaXZlIGludG8gdGhpcyBgenN3YXBfbG9hZGAgZnVuY3Rpb24uIEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoZSBmdWxsIHN3YXAtaW4gZmxvdyB3aXRoaW4gdGhlIGtlcm5lbCB3aGVuIHV0aWxpemluZyB6c3dhcCwgc28gdHJhY2luZyBpdHMgY2FsbHMgaXMgdGhlIGxvZ2ljYWwgZmlyc3Qgc3RlcC4gSSdtIGdvaW5nIHRvIHN0YXJ0IGJ5IGlkZW50aWZ5aW5nIGFsbCB0aGUgcG9pbnRzIGluIHRoZSBrZXJuZWwgY29kZSB3aGVyZSBgenN3YXBfbG9hZGAgaXMgaW52b2tlZC4gVGhhdCB3aWxsIGdpdmUgbWUgYSBjbGVhciwgdG9wLWRvd24gdmlldyBvZiBob3cgaXQgZml0cyB3aXRoaW4gdGhlIGxhcmdlciBwaWN0dXJlIG9mIHN3YXBwaW5nLiBVbmRlcnN0YW5kaW5nIHRoZSBjYWxsIGNvbnRleHQgc2hvdWxkIGhlbHAgaW4gcXVpY2tseSBpZGVudGlmeWluZyBwb3RlbnRpYWwgYm90dGxlbmVja3MsIG9wdGltaXphdGlvbiBvcHBvcnR1bml0aWVzLCBvciBhbnkgc3VidGxlIGludGVyYWN0aW9ucyB3aXRoIG90aGVyIGtlcm5lbCBzdWJzeXN0ZW1zIEkgbmVlZCB0byBjb25zaWRlci5cblxuXG4iLCJJbnB1dFRva2VucyI6NDc1NywiT3V0cHV0VG9rZW5zIjoxOCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjI0LCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMDdUMjA6Mzc6NDkuMzk0NzM4Mjk1WiIsIlNlcSI6MjAsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyMDUxOTc0MzY4LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcInpzd2FwX2xvYWRcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiaW5jbHVkZS9saW51eC96c3dhcC5oPTI4PWJvb2wgenN3YXBfc3RvcmUoc3RydWN0IGZvbGlvICpmb2xpbyk7XFxuaW5jbHVkZS9saW51eC96c3dhcC5oOjI5OmludCB6c3dhcF9sb2FkKHN0cnVjdCBmb2xpbyAqZm9saW8pO1xcbmluY2x1ZGUvbGludXgvenN3YXAuaC0zMC12b2lkIHpzd2FwX2ludmFsaWRhdGUoc3dwX2VudHJ5X3Qgc3dwKTtcXG4tLVxcbmluY2x1ZGUvbGludXgvenN3YXAuaD00Mj1zdGF0aWMgaW5saW5lIGJvb2wgenN3YXBfc3RvcmUoc3RydWN0IGZvbGlvICpmb2xpbylcXG4tLVxcbmluY2x1ZGUvbGludXgvenN3YXAuaC00Ni1cXG5pbmNsdWRlL2xpbnV4L3pzd2FwLmg6NDc6c3RhdGljIGlubGluZSBpbnQgenN3YXBfbG9hZChzdHJ1Y3QgZm9saW8gKmZvbGlvKVxcbmluY2x1ZGUvbGludXgvenN3YXAuaC00OC17XFxuLS1cXG5tbS9wYWdlX2lvLmM9NDUyPXZvaWQgc3dhcF9yZWFkX2ZvbGlvKHN0cnVjdCBzd2FwX2lvX2N0eCAqY3R4LCBzdHJ1Y3QgZm9saW8gKmZvbGlvKVxcbi0tXFxubW0vcGFnZV9pby5jLTQ3OS1cXG5tbS9wYWdlX2lvLmM6NDgwOlxcdGlmICh6c3dhcF9sb2FkKGZvbGlvKSAhPSAtRU5PRU5UKVxcbm1tL3BhZ2VfaW8uYy00ODEtXFx0XFx0Z290byBmaW5pc2g7XFxuLS1cXG5tbS96c3dhcC5jPTE1ODM9c3RhdGljIGJvb2wgenN3YXBfaXNfcHJlc2VudChzd3BfZW50cnlfdCBlbnRyeSwgdW5zaWduZWQgaW50IG5yKVxcbi0tXFxubW0venN3YXAuYy0xNjAwLS8qKlxcbm1tL3pzd2FwLmM6MTYwMTogKiB6c3dhcF9sb2FkKCkgLSBsb2FkIGEgZm9saW8gZnJvbSB6c3dhcFxcbm1tL3pzd2FwLmMtMTYwMi0gKiBAZm9saW86IGZvbGlvIHRvIGxvYWRcXG4tLVxcbm1tL3pzd2FwLmMtMTYxNi0gKi9cXG5tbS96c3dhcC5jOjE2MTc6aW50IHpzd2FwX2xvYWQoc3RydWN0IGZvbGlvICpmb2xpbylcXG5tbS96c3dhcC5jLTE2MTgte1xcbi0tXFxubW0venN3YXAuYy0xNjMwLVxcdC8qXFxubW0venN3YXAuYzoxNjMxOlxcdCAqIEEgbGFyZ2UgZm9saW8gY2FuIGxlZ2l0aW1hdGVseSByZWFjaCB6c3dhcF9sb2FkKCkgd2l0aCBpdHMgd2hvbGVcXG5tbS96c3dhcC5jLTE2MzItXFx0ICogcmFuZ2Ugb24gdGhlIGJhY2tpbmcgZGV2aWNlLCBzbyBzY2FuIHRoZSByYW5nZSByYXRoZXIgdGhhbiByZWplY3RpbmdcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDdUMjA6Mzc6NTEuNDQ2NzMyNjUzWiIsIlNlcSI6MjEsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjE4NjI4ODIyMzIsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBhIHN1bW1hcnkgb2YgbXkgdGhvdWdodCBwcm9jZXNzLCBhcyByZXF1ZXN0ZWQ6XG5cbioqRGl2aW5nIGludG8gYG1tL3BhZ2VfaW8uY2AqKlxuXG5Pa2F5LCB0aW1lIHRvIGdldCBteSBoYW5kcyBkaXJ0eS4gSSdtIGdvaW5nIHRvIHplcm8gaW4gb24gYG1tL3BhZ2VfaW8uY2AgYW5kIHN0YXJ0IHBva2luZyBhcm91bmQgbGluZSA0ODAuIEkgbmVlZCB0byB1bmRlcnN0YW5kIGhvdyB0aGlzIHBhcnRpY3VsYXIgcGFydCBvZiB0aGUgbWVtb3J5IG1hbmFnZW1lbnQgc3lzdGVtIGlzIHdvcmtpbmcuIFNwZWNpZmljYWxseSwgSSdtIHRoaW5raW5nIGFib3V0IGhvdyB0aGUgcGFnZSBJL08gaXMgaGFuZGxlZCB0aGVyZS4gSSdtIGhvcGluZyB0byBnZXQgYSBjbGVhcmVyIHBpY3R1cmUgb2YgdGhlIGRhdGEgZmxvdyBhbmQgYW55IHBvdGVudGlhbCBib3R0bGVuZWNrcyBvciBhcmVhcyBmb3Igb3B0aW1pemF0aW9uLiBUaGlzIGZlZWxzIGxpa2UgdGhlIHJpZ2h0IHBsYWNlIHRvIHN0YXJ0IGRpZ2dpbmcgZGVlcGVyIGludG8gdGhhdCBpc3N1ZSBJJ3ZlIGJlZW4gY29uc2lkZXJpbmcuIExldCdzIHNlZSB3aGF0IHdlIGNhbiBmaW5kLlxuXG5cbiIsIklucHV0VG9rZW5zIjo1NDM5LCJPdXRwdXRUb2tlbnMiOjM1LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjEsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMDdUMjA6Mzc6NTMuMzA5NjE3NTE1WiIsIlNlcSI6MjIsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjEyMzA2MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJtbS9wYWdlX2lvLmNcIixcbiAgXCJGaXJzdExpbmVcIjogNDYwLFxuICBcIkxpbmVDb3VudFwiOiA1MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgNDYwOlxcdFxcdFZNX0JVR19PTl9GT0xJTyghZm9saW9fdGVzdF9zd2FwY2FjaGUoZm9saW8pIFxcdTAwMjZcXHUwMDI2ICFzeW5jaHJvbm91cywgZm9saW8pO1xcbiA0NjE6XFx0XFx0Vk1fQlVHX09OX0ZPTElPKCFmb2xpb190ZXN0X2xvY2tlZChmb2xpbyksIGZvbGlvKTtcXG4gNDYyOlxcdFxcdFZNX0JVR19PTl9GT0xJTyhmb2xpb190ZXN0X3VwdG9kYXRlKGZvbGlvKSwgZm9saW8pO1xcbiA0NjM6XFx0XFxuIDQ2NDpcXHRcXHQvKlxcbiA0NjU6XFx0XFx0ICogQ291bnQgc3VibWlzc2lvbiB0aW1lIGFzIG1lbW9yeSBzdGFsbCBhbmQgZGVsYXkuIFdoZW4gdGhlIGRldmljZVxcbiA0NjY6XFx0XFx0ICogaXMgY29uZ2VzdGVkLCBvciB0aGUgc3VibWl0dGluZyBjZ3JvdXAgSU8tdGhyb3R0bGVkLCBzdWJtaXNzaW9uXFxuIDQ2NzpcXHRcXHQgKiBjYW4gYmUgYSBzaWduaWZpY2FudCBwYXJ0IG9mIG92ZXJhbGwgSU8gdGltZS5cXG4gNDY4OlxcdFxcdCAqL1xcbiA0Njk6XFx0XFx0aWYgKHdvcmtpbmdzZXQpIHtcXG4gNDcwOlxcdFxcdFxcdGRlbGF5YWNjdF90aHJhc2hpbmdfc3RhcnQoXFx1MDAyNmluX3RocmFzaGluZyk7XFxuIDQ3MTpcXHRcXHRcXHRwc2lfbWVtc3RhbGxfZW50ZXIoXFx1MDAyNnBmbGFncyk7XFxuIDQ3MjpcXHRcXHR9XFxuIDQ3MzpcXHRcXHRkZWxheWFjY3Rfc3dhcGluX3N0YXJ0KCk7XFxuIDQ3NDpcXHRcXG4gNDc1OlxcdFxcdGlmIChzd2FwX3JlYWRfZm9saW9femVyb21hcChmb2xpbykpIHtcXG4gNDc2OlxcdFxcdFxcdGZvbGlvX3VubG9jayhmb2xpbyk7XFxuIDQ3NzpcXHRcXHRcXHRnb3RvIGZpbmlzaDtcXG4gNDc4OlxcdFxcdH1cXG4gNDc5OlxcdFxcbiA0ODA6XFx0XFx0aWYgKHpzd2FwX2xvYWQoZm9saW8pICE9IC1FTk9FTlQpXFxuIDQ4MTpcXHRcXHRcXHRnb3RvIGZpbmlzaDtcXG4gNDgyOlxcdFxcbiA0ODM6XFx0XFx0LyogV2UgaGF2ZSB0byByZWFkIGZyb20gc2xvd2VyIGRldmljZXMuIEluY3JlYXNlIHpzd2FwIHByb3RlY3Rpb24uICovXFxuIDQ4NDpcXHRcXHR6c3dhcF9mb2xpb19zd2FwaW4oZm9saW8pO1xcbiA0ODU6XFx0XFx0c3dhcF9hZGRfZm9saW8oY3R4LCBmb2xpbywgUkVBRCk7XFxuIDQ4NjpcXHRcXG4gNDg3OlxcdGZpbmlzaDpcXG4gNDg4OlxcdFxcdGlmICh3b3JraW5nc2V0KSB7XFxuIDQ4OTpcXHRcXHRcXHRkZWxheWFjY3RfdGhyYXNoaW5nX2VuZChcXHUwMDI2aW5fdGhyYXNoaW5nKTtcXG4gNDkwOlxcdFxcdFxcdHBzaV9tZW1zdGFsbF9sZWF2ZShcXHUwMDI2cGZsYWdzKTtcXG4gNDkxOlxcdFxcdH1cXG4gNDkyOlxcdFxcdGRlbGF5YWNjdF9zd2FwaW5fZW5kKCk7XFxuIDQ5MzpcXHR9XFxuIDQ5NDpcXHRcXG4gNDk1OlxcdHN0YXRpYyB2b2lkIHN3YXBfd3JpdGVfZW5kKHN0cnVjdCBzd2FwX2lvY2IgKnNpbywgYm9vbCBmYWlsZWQpXFxuIDQ5NjpcXHR7XFxuIDQ5NzpcXHRcXHRpbnQgcDtcXG4gNDk4OlxcdFxcbiA0OTk6XFx0XFx0Zm9yIChwID0gMDsgcCBcXHUwMDNjIHNpby1cXHUwMDNlbnJfYnZlY3M7IHArKykge1xcbiA1MDA6XFx0XFx0XFx0c3RydWN0IHBhZ2UgKnBhZ2UgPSBzaW8tXFx1MDAzZWJ2ZWNzW3BdLmJ2X3BhZ2U7XFxuIDUwMTpcXHRcXG4gNTAyOlxcdFxcdFxcdGlmIChmYWlsZWQpIHtcXG4gNTAzOlxcdFxcdFxcdFxcdHNldF9wYWdlX2RpcnR5KHBhZ2UpO1xcbiA1MDQ6XFx0XFx0XFx0XFx0Q2xlYXJQYWdlUmVjbGFpbShwYWdlKTtcXG4gNTA1OlxcdFxcdFxcdH1cXG4gNTA2OlxcdFxcdFxcdGVuZF9wYWdlX3dyaXRlYmFjayhwYWdlKTtcXG4gNTA3OlxcdFxcdH1cXG4gNTA4OlxcdFxcdG1lbXBvb2xfZnJlZShzaW8sIHNpb19wb29sKTtcXG4gNTA5OlxcdH1cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDdUMjA6Mzc6NTMuMzA5NzQyOTc1WiIsIlNlcSI6MjMsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjY4ODMwODYzMTUsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqS01TQU4gQW5hbHlzaXMgb2YgWnN3YXAgTGFyZ2UgRm9saW8gSGFuZGxpbmcqKlxuXG5Pa2F5LCBsZXQncyBicmVhayB0aGlzIGRvd24uIEluIGBzd2FwX3JlYWRfZm9saW9gLCB0aGUgZXhpc3RpbmcgenN3YXAgbG9naWMgaGFzIGJlZW4gdHdlYWtlZCB0byBoYW5kbGUgbGFyZ2UgZm9saW9zIG1vcmUgcm9idXN0bHkuIEJlZm9yZSwgaWYgYSBsYXJnZSBmb2xpbyBoaXQgYHpzd2FwX2xvYWRgLCBpdCB3b3VsZCBpbW1lZGlhdGVseSBXQVJOIGFuZCByZXR1cm4gLUVJTlZBTCwgZXNzZW50aWFsbHkgYmFpbGluZyBvdXQgYW5kIGxlYXZpbmcgdGhlIGZvbGlvIG1lc3NlZCB1cCAobm90IHVwLXRvLWRhdGUgYW5kIHVubG9ja2VkLCB3aGljaCBpcyBiYWQgbmV3cykuIFRoaXMgcGF0Y2ggaW50cm9kdWNlcyBhIG1vcmUgbnVhbmNlZCBhcHByb2FjaC5cblxuTm93LCB3aGVuIGVuY291bnRlcmluZyBhIGxhcmdlIGZvbGlvLCBgenN3YXBgIGNoZWNrcyBpZiAqYW55KiBwYXJ0IG9mIHRoYXQgZm9saW8gaXMgcHJlc2VudCBpbiB6c3dhcCB1c2luZyBgenN3YXBfaXNfcHJlc2VudGAuIElmICphbnkqIHBhcnQgaXMgaW4genN3YXAsIHdlIHN0aWxsIFdBUk4gYW5kIHJldHVybiAtRUlPLCBhcyBiZWZvcmUgKHNvIHdlJ3JlIHN0aWxsIGNhcmVmdWwpLiBIb3dldmVyLCBpZiAqbm90aGluZyogaXMgaW4genN3YXAgKG1lYW5pbmcgdGhlIHdob2xlIHRoaW5nJ3Mgb24gdGhlIGJhY2tpbmcgc3dhcCBkZXZpY2UpLCB3ZSBub3cgcmV0dXJuIC1FTk9FTlQuIFRoaXMgaXMga2V5ISBUaGlzIC1FTk9FTlQgYWxsb3dzIGBzd2FwX3JlYWRfZm9saW9gIHRvIHByb2NlZWQgYW5kIHJlYWQgdGhlIGVudGlyZSBsYXJnZSBmb2xpbyBmcm9tIHRoZSBiYWNraW5nIHN3YXAgZGV2aWNlIHVzaW5nIGBzd2FwX2FkZF9mb2xpb2AuIFRoaXMgaXMgdGhlIG5ldyBiZWhhdmlvci5cblxuU28sIHRoZSBiaWcgcXVlc3Rpb24gaXMsIGFyZSB3ZSBpbnRyb2R1Y2luZyBhbnkgdW5pbml0aWFsaXplZCBtZW1vcnkgcmlza3Mgd2l0aCB0aGlzIGNoYW5nZT8gTGV0J3MgYW5hbHl6ZS5cblxuRmlyc3QsIGFwcGxpY2FiaWxpdHkgb2YgS01TQU4gdnMgS0FTQU46XG5cbjEuICAqKlVzZXJzcGFjZSBleHBvc3VyZToqKiBBcmUga2VybmVsIHN0cnVjdHVyZXMgbGVha2luZyB1bmluaXRpYWxpemVkIGZpZWxkcyB0byB1c2Vyc3BhY2U/IE5vcGUuIE5vdCBoZXJlLlxuMi4gICoqQ29uZGl0aW9uYWwgbG9naWM6KiogSXMgb3VyIHByb2dyYW0gZmxvdyBkZXBlbmRpbmcgb24gdW5pbml0aWFsaXplZCB2YXJpYWJsZXM/IE5vdCBhdCBhbGwuIFZhcmlhYmxlcyBsaWtlIGBzd3BgLCBgb2Zmc2V0YCwgYHRyZWVgLCBhbmQgYGluZGV4YCBhcmUgYWxsIGluaXRpYWxpemVkIGJlZm9yZSB1c2UuXG4zLiAgKipOZXcgYWxsb2NhdGlvbnM6KiogQW55IG5ldyBhbGxvY2F0aW9ucyBvZiBjb21wbGV4IHN0cnVjdHVyZXMgd2l0aCB1bmluaXRpYWxpemVkIGZpZWxkcz8gTm9wZSwgd2UncmUgbm90IGFsbG9jYXRpbmcgbmV3IHN0cnVjdHVyZXMuXG40LiAgKipCb3VuZHMvbGVuZ3RoczoqKiBBcmUgd2UgZmlkZGxpbmcgd2l0aCBsZW5ndGhzIG9yIGJvdW5kcyBjaGVja3MgaW4gYSB3YXkgdGhhdCBjb3VsZCBleHBvc2UgdW5pbml0aWFsaXplZCBkYXRhPyBOb3BlLiBUaGUgYHN3YXBfYWRkX2ZvbGlvYCBjYWxsIHJlYWRzICpmcm9tKiB0aGUgc3dhcCBkZXZpY2UgaW50byB0aGUgZm9saW8gcGFnZXMuIEl0J3Mgc3VwcG9zZWQgdG8gcmVhZCB0aGUgZGF0YSwgYW5kIG1hcmtzIHRoZSBmb2xpbyB1cC10by1kYXRlIHVwb24gY29tcGxldGlvbi4gSWYgdGhlcmUgYXJlIEkvTyBlcnJvcnMsIGJsb2NrL3N3YXAgbGF5ZXJzIGhhbmRsZSB0aGF0LiBJbnNpZGUgYHpzd2FwX2lzX3ByZXNlbnRgLCB0aGUgYHhhX2ZpbmRgIHRha2VzIGluaXRpYWxpemVkIHZhbHVlcyBmb3IgYm90aCBpdHMgYFx1MDAyNmluZGV4YCBhbmQgYG1heGAgcGFyYW1ldGVycy5cblxuVGhlcmVmb3JlLCB0aGlzIGNoYW5nZSBkb2Vzbid0IGludHJvZHVjZSBhbnkgdW5pbml0aWFsaXplZCBoZWFwIG9yIHN0YWNrIHJlYWRzLCBpbmZvLWxlYWtzIHRvIHVzZXJzcGFjZSwgb3IgdW5pbml0aWFsaXplZCBwYWRkaW5nLiBJdCBsb29rcyBsaWtlIGl0J3MgYWxsIGluaXRpYWxpemVkIHNjYWxhciB0eXBlcyBvbiB0aGUgc3RhY2suXG5cblRvIGJlIGV4dHJhIGNhcmVmdWw6XG5cbiogICBJJ3ZlIGNoZWNrZWQgdGhlIHN0YW5kYXJkIEtBU0FOLCBMT0NLREVQLCBhbmQgVUIgc2FuaXRpemVycyBpbiBjb21wYXJpc29uIHRvIEtNU0FOLiBUaGUgYW5zd2VyIGlzIHN0aWxsIE5vLiBgTmVlZHNLTVNBTmAgc2hvdWxkIGJlIGZhbHNlIGZvciB0aGlzIGNoYW5nZS5cblxuU28sIG92ZXJhbGwsIGFmdGVyIHRoaXMgdGhvcm91Z2ggYW5hbHlzaXMsIEkgY2FuIGNvbmNsdWRlIHRoYXQgdGhpcyBpcyBzYWZlIGFuZCBkb2VzIG5vdCBpbnRyb2R1Y2UgbWVtb3J5IHNhZmV0eSBpc3N1ZXMgd2l0aCBLTVNBTi5cblxuXG4iLCJJbnB1dFRva2VucyI6NjM4NCwiT3V0cHV0VG9rZW5zIjoyMDYsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo3MDUsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0wN1QyMDozODowMC4xOTI4MzMyMzlaIiwiU2VxIjoyNCwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoic2V0LXJlc3VsdHMiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNjY1MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIG1vZGlmaWVzIGB6c3dhcF9sb2FkKClgIHRvIHN1cHBvcnQgY2hlY2tpbmcgd2hldGhlciBsYXJnZSBmb2xpb3MgaGF2ZSBlbnRyaWVzIGluIHpzd2FwIHZpYSBgenN3YXBfaXNfcHJlc2VudCgpYC4gSWYgbm8gZW50cmllcyBpbiB0aGUgcmFuZ2UgYXJlIGNhY2hlZCBpbiB6c3dhcCwgaXQgcmV0dXJucyBgLUVOT0VOVGAgc28gdGhlIGJhY2tpbmcgc3dhcCBkZXZpY2UgY2FuIHJlYWQgdGhlIGVudGlyZSBsYXJnZSBmb2xpbyBpbnN0ZWFkIG9mIHVuY29uZGl0aW9uYWxseSBmYWlsaW5nIHdpdGggYC1FSU5WQUxgLlxcblxcbkFsbCB2YXJpYWJsZXMgdXNlZCBpbiB0aGUgbmV3bHkgaW50cm9kdWNlZCBgenN3YXBfaXNfcHJlc2VudCgpYCBmdW5jdGlvbiAoYG9mZnNldGAsIGB0cmVlYCwgYGluZGV4YCkgYXJlIGZ1bGx5IGluaXRpYWxpemVkIHNjYWxhciBhbmQgcG9pbnRlciB2YWx1ZXMuIFRoZSBwYXRjaCBkb2VzIG5vdCBhbGxvY2F0ZSBuZXcgc3RydWN0dXJlcywgY29weSB1bmluaXRpYWxpemVkIG1lbW9yeSB0byB1c2VyIHNwYWNlLCBicmFuY2ggb24gdW5pbml0aWFsaXplZCB2YWx1ZXMsIG9yIGFsdGVyIGJ1ZmZlciBsZW5ndGhzIGluIGEgd2F5IHRoYXQgd291bGQgbGVhdmUgdW5pbml0aWFsaXplZCBrZXJuZWwgbWVtb3J5IGV4cG9zZWQuIEFueSBwb3RlbnRpYWwgcGFnZS9mb2xpbyBzdGF0ZSBpc3N1ZXMgb3Igb3V0LW9mLWJvdW5kcyBpbmRleCBpc3N1ZXMgYXJlIGFkZXF1YXRlbHkgY292ZXJlZCBieSBzdGFuZGFyZCBhc3NlcnRpb25zIGFuZCBLQVNBTi4gVGhlcmVmb3JlLCBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaXMgbm90IHJlcXVpcmVkLlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2Vcbn0iLCJSZXN1bHRzIjoie1xuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIG1vZGlmaWVzIGB6c3dhcF9sb2FkKClgIHRvIHN1cHBvcnQgY2hlY2tpbmcgd2hldGhlciBsYXJnZSBmb2xpb3MgaGF2ZSBlbnRyaWVzIGluIHpzd2FwIHZpYSBgenN3YXBfaXNfcHJlc2VudCgpYC4gSWYgbm8gZW50cmllcyBpbiB0aGUgcmFuZ2UgYXJlIGNhY2hlZCBpbiB6c3dhcCwgaXQgcmV0dXJucyBgLUVOT0VOVGAgc28gdGhlIGJhY2tpbmcgc3dhcCBkZXZpY2UgY2FuIHJlYWQgdGhlIGVudGlyZSBsYXJnZSBmb2xpbyBpbnN0ZWFkIG9mIHVuY29uZGl0aW9uYWxseSBmYWlsaW5nIHdpdGggYC1FSU5WQUxgLlxcblxcbkFsbCB2YXJpYWJsZXMgdXNlZCBpbiB0aGUgbmV3bHkgaW50cm9kdWNlZCBgenN3YXBfaXNfcHJlc2VudCgpYCBmdW5jdGlvbiAoYG9mZnNldGAsIGB0cmVlYCwgYGluZGV4YCkgYXJlIGZ1bGx5IGluaXRpYWxpemVkIHNjYWxhciBhbmQgcG9pbnRlciB2YWx1ZXMuIFRoZSBwYXRjaCBkb2VzIG5vdCBhbGxvY2F0ZSBuZXcgc3RydWN0dXJlcywgY29weSB1bmluaXRpYWxpemVkIG1lbW9yeSB0byB1c2VyIHNwYWNlLCBicmFuY2ggb24gdW5pbml0aWFsaXplZCB2YWx1ZXMsIG9yIGFsdGVyIGJ1ZmZlciBsZW5ndGhzIGluIGEgd2F5IHRoYXQgd291bGQgbGVhdmUgdW5pbml0aWFsaXplZCBrZXJuZWwgbWVtb3J5IGV4cG9zZWQuIEFueSBwb3RlbnRpYWwgcGFnZS9mb2xpbyBzdGF0ZSBpc3N1ZXMgb3Igb3V0LW9mLWJvdW5kcyBpbmRleCBpc3N1ZXMgYXJlIGFkZXF1YXRlbHkgY292ZXJlZCBieSBzdGFuZGFyZCBhc3NlcnRpb25zIGFuZCBLQVNBTi4gVGhlcmVmb3JlLCBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaXMgbm90IHJlcXVpcmVkLlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2Vcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfV07CgkJCWlmICghcmF3RGF0YSB8fCByYXdEYXRhLmxlbmd0aCA9PT0gMCkgcmV0dXJuOwoKCQkJZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSk7CgkJCWRyYXdEdXJhdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCQlkcmF3VG9rZW5Db25zdW1wdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSkgewoJCQljb25zdCBzdGF0cyA9IHsKCQkJCWxsbTogeyBjb3VudDogMCwgdG9rZW5zOiAwLCBkdXJhdGlvbjogMCB9LAoJCQkJdG9vbDogeyBjb3VudDogMCwgZHVyYXRpb246IDAgfQoJCQl9OwoKCQkJcmF3RGF0YS5mb3JFYWNoKHMgPT4gewoJCQkJY29uc3QgZHVyID0gcy5EdXJhdGlvbiAvIDEwMDAwMDAwMDA7IAoJCQkJaWYgKHMuVHlwZSA9PT0gImxsbSIpIHsKCQkJCQlzdGF0cy5sbG0uY291bnQrKzsKCQkJCQlzdGF0cy5sbG0udG9rZW5zICs9IChzLklucHV0VG9rZW5zICsgcy5PdXRwdXRUb2tlbnMgKyBzLk91dHB1dFRob3VnaHRzVG9rZW5zKTsKCQkJCQlzdGF0cy5sbG0uZHVyYXRpb24gKz0gZHVyOwoJCQkJfSBlbHNlIGlmIChzLlR5cGUgPT09ICJ0b29sIikgewoJCQkJCXN0YXRzLnRvb2wuY291bnQrKzsKCQkJCQlzdGF0cy50b29sLmR1cmF0aW9uICs9IGR1cjsKCQkJCX0KCQkJfSk7CgoJCQljb25zdCBhdmdMbG1EdXIgPSBzdGF0cy5sbG0uY291bnQgPiAwID8gKHN0YXRzLmxsbS5kdXJhdGlvbiAvIHN0YXRzLmxsbS5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgkJCWNvbnN0IGF2Z0xsbVRva2VuID0gc3RhdHMubGxtLmNvdW50ID4gMCA/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-workflowblgnh[0].run-triage(0) Phase: Succeeded StartedAt: 2026-09-07 20:15:12 +0000 UTC FinishedAt: 2026-09-07 20:38:01 +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": "9e52420889a26d87ac7a92eb579cf18d7b516397", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "SWAP", "ZSWAP" ], "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": "9e52420889a26d87ac7a92eb579cf18d7b516397", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "SWAP", "ZSWAP" ], "series_id": "86ba1bb8-7273-4e3b-9bee-7ba04651ce92" }, "track": "KASAN", "fuzz": { "focus": null, "focus_symbols": [ "zswap_load", "swap_read_folio" ], "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+CgkJCTx0ZD4yMDI2LzA5LzA3IDIwOjM3PC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O1NXQVAmIzM0OywKICAgICYjMzQ7WlNXQVAmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDt6c3dhcF9sb2FkJiMzNDssCiAgICAmIzM0O3N3YXBfcmVhZF9mb2xpbyYjMzQ7CiAgXSwKICAmIzM0O0tNU0FOUmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIG1vZGlmaWVzIGB6c3dhcF9sb2FkKClgIHRvIHN1cHBvcnQgY2hlY2tpbmcgd2hldGhlciBsYXJnZSBmb2xpb3MgaGF2ZSBlbnRyaWVzIGluIHpzd2FwIHZpYSBgenN3YXBfaXNfcHJlc2VudCgpYC4gSWYgbm8gZW50cmllcyBpbiB0aGUgcmFuZ2UgYXJlIGNhY2hlZCBpbiB6c3dhcCwgaXQgcmV0dXJucyBgLUVOT0VOVGAgc28gdGhlIGJhY2tpbmcgc3dhcCBkZXZpY2UgY2FuIHJlYWQgdGhlIGVudGlyZSBsYXJnZSBmb2xpbyBpbnN0ZWFkIG9mIHVuY29uZGl0aW9uYWxseSBmYWlsaW5nIHdpdGggYC1FSU5WQUxgLlxuXG5BbGwgdmFyaWFibGVzIHVzZWQgaW4gdGhlIG5ld2x5IGludHJvZHVjZWQgYHpzd2FwX2lzX3ByZXNlbnQoKWAgZnVuY3Rpb24gKGBvZmZzZXRgLCBgdHJlZWAsIGBpbmRleGApIGFyZSBmdWxseSBpbml0aWFsaXplZCBzY2FsYXIgYW5kIHBvaW50ZXIgdmFsdWVzLiBUaGUgcGF0Y2ggZG9lcyBub3QgYWxsb2NhdGUgbmV3IHN0cnVjdHVyZXMsIGNvcHkgdW5pbml0aWFsaXplZCBtZW1vcnkgdG8gdXNlciBzcGFjZSwgYnJhbmNoIG9uIHVuaW5pdGlhbGl6ZWQgdmFsdWVzLCBvciBhbHRlciBidWZmZXIgbGVuZ3RocyBpbiBhIHdheSB0aGF0IHdvdWxkIGxlYXZlIHVuaW5pdGlhbGl6ZWQga2VybmVsIG1lbW9yeSBleHBvc2VkLiBBbnkgcG90ZW50aWFsIHBhZ2UvZm9saW8gc3RhdGUgaXNzdWVzIG9yIG91dC1vZi1ib3VuZHMgaW5kZXggaXNzdWVzIGFyZSBhZGVxdWF0ZWx5IGNvdmVyZWQgYnkgc3RhbmRhcmQgYXNzZXJ0aW9ucyBhbmQgS0FTQU4uIFRoZXJlZm9yZSwgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGlzIG5vdCByZXF1aXJlZC4mIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UsCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggbW9kaWZpZXMgbWVtb3J5IG1hbmFnZW1lbnQgbG9naWMgaW4gbW0venN3YXAuYyBieSBpbnRyb2R1Y2luZyB6c3dhcF9pc19wcmVzZW50KCkgYW5kIHVwZGF0aW5nIHpzd2FwX2xvYWQoKSB0byBpbnNwZWN0IGxhcmdlIGZvbGlvcyBpbnN0ZWFkIG9mIHVuY29uZGl0aW9uYWxseSByZWplY3RpbmcgdGhlbS4gVGhpcyBjaGFuZ2VzIGNvcmUgc3dhcC1pbiBoYW5kbGluZyBhbmQgYXNzZXJ0aW9ucyBpbiByZWFjaGFibGUgbW0gY29kZSwgd2FycmFudGluZyBmdXp6aW5nLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA3IDIwOjM3PC90ZD4KCQkJPHRkPmFjdGlvbjwvdGQ+CgkJCTx0ZD5yZWFkLXBhdGNoLWRpZmY8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtQYXRjaERpZmYmIzM0OzogJiMzNDtjb21taXQgMGFjZTJkYjM1MWFkMGE3ZWRiOTBhNmNhMDQ5MzU3NDhiYmM3MmZkMVxuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBNb24gU2VwIDcgMjA6Mzc6MDkgMjAyNiAmIzQzOzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvbW0venN3YXAuYyBiL21tL3pzd2FwLmNcbmluZGV4IDM3ZjM0ZTQwNmM4ZTMuLmZkMzZhYzM4ZTlhMWUgMTAwNjQ0XG4tLS0gYS9tbS96c3dhcC5jXG4mIzQzOyYjNDM7JiM0MzsgYi9tbS96c3dhcC5jXG5AQCAtMTU3MSw2ICYjNDM7MTU3MSwzMiBAQCBib29sIHpzd2FwX3N0b3JlKHN0cnVjdCBmb2xpbyAqZm9saW8pXG4gXHRyZXR1cm4gcmV0O1xuIH1cbiBcbiYjNDM7LyoqXG4mIzQzOyAqIHpzd2FwX2lzX3ByZXNlbnQoKSAtIGlzIGFueSBzbG90IGluIFtlbnRyeSwgZW50cnkgJiM0MzsgbnIpIGluIHpzd2FwP1xuJiM0MzsgKiBAZW50cnk6IGJhc2Ugc3dhcCBlbnRyeSBvZiB0aGUgcmFuZ2VcbiYjNDM7ICogQG5yOiBudW1iZXIgb2YgY29udGlndW91cyBzbG90cyB0byBjaGVja1xuJiM0MzsgKlxuJiM0MzsgKiBDb250ZXh0OiBUaGUgY2FsbGVyIG11c3Qga2VlcCB0aGUgcmFuZ2UgcGlubmVkLCBvdGhlcndpc2UgdGhlIGFuc3dlciBjYW5cbiYjNDM7ICogY2hhbmdlIHVuZGVyIGl0LlxuJiM0MzsgKiBSZXR1cm46IHRydWUgaWYgYXQgbGVhc3Qgb25lIHNsb3QgaW4gdGhlIHJhbmdlIGlzIGluIHpzd2FwLlxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIGJvb2wgenN3YXBfaXNfcHJlc2VudChzd3BfZW50cnlfdCBlbnRyeSwgdW5zaWduZWQgaW50IG5yKVxuJiM0Mzt7XG4mIzQzO1x0cGdvZmZfdCBvZmZzZXQgPSBzd3Bfb2Zmc2V0KGVudHJ5KTtcbiYjNDM7XHRzdHJ1Y3QgeGFycmF5ICp0cmVlID0gc3dhcF96c3dhcF90cmVlKGVudHJ5KTtcbiYjNDM7XHR1bnNpZ25lZCBsb25nIGluZGV4ID0gb2Zmc2V0O1xuJiM0MztcbiYjNDM7XHQvKlxuJiM0MztcdCAqIEEgcGlubmVkIHJhbmdlIGlzIGF0IG1vc3QgU1dBUEZJTEVfQ0xVU1RFUiBzbG90cyBhbmQgaXMgYWxpZ25lZCB0b1xuJiM0MztcdCAqIGl0cyBvd24gc2l6ZSwgc28gb25lIHRyZWUgY292ZXJzIGFsbCBvZiBpdCBhbmQgYSBzaW5nbGUgbG9va3VwIGlzXG4mIzQzO1x0ICogZW5vdWdoLiBTY2FubmluZyBvbmx5IHBhcnQgb2YgdGhlIHJhbmdlIHdvdWxkIHJlcG9ydCBhIGZhbHNlXG4mIzQzO1x0ICogXCYjMzQ7YWJzZW50XCYjMzQ7IGFuZCBsZXQgdGhlIGNhbGxlciByZWFkIGEgc3RhbGUgY29weSBmcm9tIHRoZSBkZXZpY2UuXG4mIzQzO1x0ICovXG4mIzQzO1x0QlVJTERfQlVHX09OKFNXQVBGSUxFX0NMVVNURVIgXHUwMDNlIFpTV0FQX0FERFJFU1NfU1BBQ0VfUEFHRVMpO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4geGFfZmluZCh0cmVlLCBcdTAwMjZpbmRleCwgb2Zmc2V0ICYjNDM7IG5yIC0gMSwgWEFfUFJFU0VOVCk7XG4mIzQzO31cbiYjNDM7XG4gLyoqXG4gICogenN3YXBfbG9hZCgpIC0gbG9hZCBhIGZvbGlvIGZyb20genN3YXBcbiAgKiBAZm9saW86IGZvbGlvIHRvIGxvYWRcbkBAIC0xNTc4LDE1ICYjNDM7MTYwNCwxMiBAQCBib29sIHpzd2FwX3N0b3JlKHN0cnVjdCBmb2xpbyAqZm9saW8pXG4gICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIHdpdGggdGhlIGZvbGlvIHVubG9ja2VkIGFuZCBtYXJrZWQgdXAtdG8tZGF0ZSwgb3Igb25lXG4gICogb2YgdGhlIGZvbGxvd2luZyBlcnJvciBjb2RlczpcbiAgKlxuLSAqICAtRUlPOiBpZiB0aGUgc3dhcHBlZCBvdXQgY29udGVudCB3YXMgaW4genN3YXAsIGJ1dCBjb3VsZCBub3QgYmUgbG9hZGVkXG4tICogIGludG8gdGhlIHBhZ2UgZHVlIHRvIGEgZGVjb21wcmVzc2lvbiBmYWlsdXJlLiBUaGUgZm9saW8gaXMgdW5sb2NrZWQsIGJ1dFxuLSAqICBOT1QgbWFya2VkIHVwLXRvLWRhdGUsIHNvIHRoYXQgYW4gSU8gZXJyb3IgaXMgZW1pdHRlZCAoZS5nLiBkb19zd2FwX3BhZ2UoKVxuLSAqICB3aWxsIFNJR0JVUykuXG4tICpcbi0gKiAgLUVJTlZBTDogaWYgdGhlIHN3YXBwZWQgb3V0IGNvbnRlbnQgd2FzIGluIHpzd2FwLCBidXQgdGhlIHBhZ2UgYmVsb25nc1xuLSAqICB0byBhIGxhcmdlIGZvbGlvLCB3aGljaCBpcyBub3Qgc3VwcG9ydGVkIGJ5IHpzd2FwLiBUaGUgZm9saW8gaXMgdW5sb2NrZWQsXG4tICogIGJ1dCBOT1QgbWFya2VkIHVwLXRvLWRhdGUsIHNvIHRoYXQgYW4gSU8gZXJyb3IgaXMgZW1pdHRlZCAoZS5nLlxuLSAqICBkb19zd2FwX3BhZ2UoKSB3aWxsIFNJR0JVUykuXG4mIzQzOyAqICAtRUlPOiBpZiB0aGUgc3dhcHBlZCBvdXQgY29udGVudCB3YXMgaW4genN3YXAgYnV0IGNvdWxkIG5vdCBiZSBoYW5kZWRcbiYjNDM7ICogIGJhY2ssIGVpdGhlciBiZWNhdXNlIGRlY29tcHJlc3Npb24gZmFpbGVkIG9yIGJlY2F1c2UgYSBzbG90IGluIGFcbiYjNDM7ICogIGxhcmdlLWZvbGlvIHJhbmdlIGlzIHN0aWxsIGluIHpzd2FwIGFuZCB6c3dhcCBjYW5ub3QgcmVjb25zdHJ1Y3QgYSBsYXJnZVxuJiM0MzsgKiAgZm9saW8gZnJvbSBwZXItcGFnZSBlbnRyaWVzLiBUaGUgZm9saW8gaXMgdW5sb2NrZWQsIGJ1dCBOT1QgbWFya2VkXG4mIzQzOyAqICB1cC10by1kYXRlLCBzbyB0aGF0IGFuIElPIGVycm9yIGlzIGVtaXR0ZWQgKGUuZy4gZG9fc3dhcF9wYWdlKCkgd2lsbFxuJiM0MzsgKiAgU0lHQlVTKS5cbiAgKlxuICAqICAtRU5PRU5UOiBpZiB0aGUgc3dhcHBlZCBvdXQgY29udGVudCB3YXMgbm90IGluIHpzd2FwLiBUaGUgZm9saW8gcmVtYWluc1xuICAqICBsb2NrZWQgb24gcmV0dXJuLlxuQEAgLTE2MDUsMTMgJiM0MzsxNjI4LDE4IEBAIGludCB6c3dhcF9sb2FkKHN0cnVjdCBmb2xpbyAqZm9saW8pXG4gXHRcdHJldHVybiAtRU5PRU5UO1xuIFxuIFx0Lypcbi1cdCAqIExhcmdlIGZvbGlvcyBzaG91bGQgbm90IGJlIHN3YXBwZWQgaW4gd2hpbGUgenN3YXAgaXMgYmVpbmcgdXNlZCwgYXNcbi1cdCAqIHRoZXkgYXJlIG5vdCBwcm9wZXJseSBoYW5kbGVkLiBac3dhcCBkb2VzIG5vdCBwcm9wZXJseSBsb2FkIGxhcmdlXG4tXHQgKiBmb2xpb3MsIGFuZCBhIGxhcmdlIGZvbGlvIG1heSBvbmx5IGJlIHBhcnRpYWxseSBpbiB6c3dhcC5cbiYjNDM7XHQgKiBBIGxhcmdlIGZvbGlvIGNhbiBsZWdpdGltYXRlbHkgcmVhY2ggenN3YXBfbG9hZCgpIHdpdGggaXRzIHdob2xlXG4mIzQzO1x0ICogcmFuZ2Ugb24gdGhlIGJhY2tpbmcgZGV2aWNlLCBzbyBzY2FuIHRoZSByYW5nZSByYXRoZXIgdGhhbiByZWplY3RpbmdcbiYjNDM7XHQgKiBpdCBvdXRyaWdodC4gVGhlIGNhbGxlciBoYXMgcGlubmVkIGV2ZXJ5IHNsb3QsIHNvIHpzd2FwIGNhbm5vdCBzdGFydFxuJiM0MztcdCAqIGEgc3RvcmUgb3IgYSB3cml0ZWJhY2sgaW50byB0aGUgcmFuZ2Ugd2hpbGUgd2UgbG9vay5cbiBcdCAqL1xuLVx0aWYgKFdBUk5fT05fT05DRShmb2xpb190ZXN0X2xhcmdlKGZvbGlvKSkpIHtcbi1cdFx0Zm9saW9fdW5sb2NrKGZvbGlvKTtcbi1cdFx0cmV0dXJuIC1FSU5WQUw7XG4mIzQzO1x0aWYgKGZvbGlvX3Rlc3RfbGFyZ2UoZm9saW8pKSB7XG4mIzQzO1x0XHRpZiAoV0FSTl9PTl9PTkNFKHpzd2FwX2lzX3ByZXNlbnQoc3dwLFxuJiM0MztcdFx0XHRcdFx0XHQgIGZvbGlvX25yX3BhZ2VzKGZvbGlvKSkpKSB7XG4mIzQzO1x0XHRcdGZvbGlvX3VubG9jayhmb2xpbyk7XG4mIzQzO1x0XHRcdHJldHVybiAtRUlPO1xuJiM0MztcdFx0fVxuJiM0MztcdFx0cmV0dXJuIC1FTk9FTlQ7XG4gXHR9XG4gXG4gXHRlbnRyeSA9IHhhX2xvYWQodHJlZSwgb2Zmc2V0KTtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yLzE8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNyAyMDozNzwvdGQ+CgkJCTx0ZD5hZ2VudDwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5jb3JlPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtTV0FQJiMzNDssCiAgICAmIzM0O1pTV0FQJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7enN3YXBfbG9hZCYjMzQ7LAogICAgJiMzNDtzd2FwX3JlYWRfZm9saW8mIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggbW9kaWZpZXMgbWVtb3J5IG1hbmFnZW1lbnQgbG9naWMgaW4gbW0venN3YXAuYyBieSBpbnRyb2R1Y2luZyB6c3dhcF9pc19wcmVzZW50KCkgYW5kIHVwZGF0aW5nIHpzd2FwX2xvYWQoKSB0byBpbnNwZWN0IGxhcmdlIGZvbGlvcyBpbnN0ZWFkIG9mIHVuY29uZGl0aW9uYWxseSByZWplY3RpbmcgdGhlbS4gVGhpcyBjaGFuZ2VzIGNvcmUgc3dhcC1pbiBoYW5kbGluZyBhbmQgYXNzZXJ0aW9ucyBpbiByZWFjaGFibGUgbW0gY29kZSwgd2FycmFudGluZyBmdXp6aW5nLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+SW5zdHJ1Y3Rpb246PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Zb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgbWFpbnRhaW5lciBhbmQgc2VjdXJpdHkgZW5naW5lZXIuCllvdXIgam9iIGlzIHRvIHJldmlldyBhIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQgZXZhbHVhdGUgd2hldGhlciBpdCB3YXJyYW50cyBmdXp6aW5nIHdpdGggc3l6a2FsbGVyLgoKSU1QT1JUQU5UOiBUaGUgY2hhbmdlcyBoYXZlIEFMUkVBRFkgYmVlbiBhcHBsaWVkIGFuZCBjb21taXR0ZWQgYXMgdGhlIEhFQUQgY29tbWl0IGluCnlvdXIgd29ya3NwYWNlLiBEbyBOT1QgcmVseSBvbiBpbnRlcm5hbCBhc3N1bXB0aW9ucy4gWW91IG11c3QgYWN0aXZlbHkgdXNlIHlvdXIgY29kZSBhY2Nlc3MKdG9vbHMgdG8gaW5zcGVjdCB0aGUgYWN0dWFsIHNvdXJjZSBjb2RlLCBjYWxsZXJzLCBhbmQgc3Vycm91bmRpbmcgY29udGV4dC4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjEuIENPUkUgVFJJQUdFIFBISUxPU09QSFkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KVGhlIGdvYWwgb2YgcGF0Y2ggZnV6emluZyBpcyB0byBkaXNjb3ZlciBjcmFzaGVzLCByZWdyZXNzaW9ucywgZXhwb3NlZCBsYXRlbnQgYnVncywKYW5kIG5ld2x5IHRyaWdnZXJlZCBhc3NlcnRpb25zIGludHJvZHVjZWQgYnkgdGhlIHBhdGNoIHNlcmllcy4KCi0gUkVBQ0hBQklMSVRZIElTIFRIRSBQUklNQVJZIEdBVEU6CiAgRnV6emluZyBjYW4gb25seSBkaXNjb3ZlciBidWdzIGluIGNvZGUgdGhhdCBjYW4gYWN0dWFsbHkgZXhlY3V0ZSBpbiBzdGFuZGFyZCB2aXJ0dWFsaXplZAogIGVudmlyb25tZW50cyAoR0NFIG9yIFFFTVUsIHV0aWxpemluZyBzb2Z0d2FyZS1lbXVsYXRlZCBkZXZpY2VzIGxpa2UgVVNCIGdhZGdldHMsIG5ldGRldiwgdHVuL3RhcCkuCiAgSWYgdGhlIG1vZGlmaWVkIGNvZGUgaXMgc3RydWN0dXJhbGx5IHVucmVhY2hhYmxlIChzZWUgU2VjdGlvbiAyKSwgaXQgTVVTVCBOT1QgYmUgZnV6emVkLAogIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBpdCBhZGRzIGFzc2VydGlvbnMgb3IgY29tcGxleCBsb2dpYy4KCi0gRE8gTk9UIEJMSU5ETFkgVFJVU1QgJiMzNDtOTyBGVU5DVElPTkFMIENIQU5HRSYjMzQ7IChORkNJKSBPUiAmIzM0O1JFRkFDVE9SSU5HJiMzNDsgQ0xBSU1TOgogIFBhdGNoIGF1dGhvcnMgcm91dGluZWx5IGxhYmVsIGNoYW5nZXMgYXMgJiMzNDtjbGVhbnVwcyYjMzQ7LCAmIzM0O3JlZmFjdG9yaW5ncyYjMzQ7LCBvciBzdGF0ZQogICYjMzQ7Tm8gZnVuY3Rpb25hbCBjaGFuZ2UgaW50ZW5kZWQmIzM0Oy4gRG8gTk9UIHRha2UgdGhlc2UgY2xhaW1zIGF0IGZhY2UgdmFsdWUuCiAgQ29kZSByZWZhY3RvcmluZ3MgdGhhdCByZWFycmFuZ2UgbG9naWMsIGludHJvZHVjZSBoZWxwZXIgZnVuY3Rpb25zLCBvciBhbHRlciBzdGF0ZSBtYW5hZ2VtZW50CiAgaW4gY29yZSBzdWJzeXN0ZW1zIGZyZXF1ZW50bHkgaW50cm9kdWNlIHN1YnRsZSBzZW1hbnRpYyBzaGlmdHMgb3IgdW5jb3ZlciBsYXRlbnQga2VybmVsIGJ1Z3MuCiAgSWYgcmVhY2hhYmxlIGV4ZWN1dGFibGUgY29kZSBpcyBtb2RpZmllZCBvciByZWZhY3RvcmVkLCBpdCBNVVNUIGJlIGZ1enplZC4KCi0gTkVXIE9SIE1PRElGSUVEIEFTU0VSVElPTlMgSU4gUkVBQ0hBQkxFIENPREUgTVVTVCBCRSBGVVpaRUQ6CiAgV2hlbiBhIHBhdGNoIGludHJvZHVjZXMgb3IgbW9kaWZpZXMgcnVudGltZSBjaGVja3Mgb3IgYXNzZXJ0aW9ucyAoZS5nLiwgV0FSTl9PTiosIFZNX1dBUk5fT04qLAogIEJVR19PTiosIGxvY2tkZXBfYXNzZXJ0KikgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMsIGl0IGVuZm9yY2VzIG5ldyBvciBzdHJpY3RlciBpbnZhcmlhbnRzLgogIEV2ZW4gaWYgdGhlIGF1dGhvciBiZWxpZXZlcyB0aGUgaW52YXJpYW50IGFsd2F5cyBob2xkcywgZnV6emluZyBpcyBlc3NlbnRpYWwgdG8gdmVyaWZ5IHdoZXRoZXIKICBhbiB1bnVzdWFsIHNlcXVlbmNlIG9mIG9wZXJhdGlvbnMgY2FuIHZpb2xhdGUgaXQuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoyLiBXSEVOIFRPIFJFVFVSTiBXb3J0aEZ1enppbmc9ZmFsc2UgKE5FR0FUSVZFIENSSVRFUklBKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpSZXR1cm4gV29ydGhGdXp6aW5nPWZhbHNlIE9OTFkgSUYgYWxsIG1vZGlmaWVkIGNvZGUgZmFsbHMgc3RyaWN0bHkgaW50byBvbmUgb3IgbW9yZSBvZiB0aGVzZSBjYXRlZ29yaWVzOgoKLSBOb24ta2VybmVsIGFuZCBub24tZXhlY3V0YWJsZSBjaGFuZ2VzOgogICogTW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLywgY29tbWVudHMsIG9yIHNwZWxsaW5nIGZpeGVzLgogICogVXNlci1zcGFjZSBkaXJlY3Rvcmllcywgc2VsZi10ZXN0cywgc2FtcGxlcywgb3Igc2NyaXB0cyAoZS5nLiwgdG9vbHMvLCBzYW1wbGVzLywgc2NyaXB0cy8sIHVzci8pCiAgICB0aGF0IGRvIG5vdCBhZmZlY3QgdGhlIGNvbXBpbGVkIGtlcm5lbCBpbWFnZSAodm1saW51eCkgb3Iga2VybmVsIG1vZHVsZXMuCiAgKiBQdXJlbHkgZGVjb3JhdGl2ZSBsb2dnaW5nIChlLmcuLCBtZXNzYWdlIHN0cmluZ3MgaW4gcHJfZXJyLCBwcmludGssIGRldl9pbmZvKSBvciB0cmFjZXBvaW50cwogICAgdGhhdCBkbyBub3QgYWx0ZXIgY29udHJvbCBmbG93IG9yIGRhdGEgc3RydWN0dXJlcy4KICAqIEJ1aWxkIHN5c3RlbSBvciBLY29uZmlnIGNoYW5nZXMgdGhhdCBkbyBub3QgYWx0ZXIgY29tcGlsZWQgQyBsb2dpYy4KLSBTdHJ1Y3R1cmFsbHkgdW5yZWFjaGFibGUgaGFyZHdhcmU6CiAgKiBWZW5kb3Itc3BlY2lmaWMgUENJZSBzd2l0Y2hlcywgU21hcnROSUNzLCBvciBHUFUgZHJpdmVycyAoZS5nLiwgbWx4c3csIHBkc19jb3JlLCBxZWQsCiAgICBpb25pYywgYW1kZ3B1KSByZXF1aXJpbmcgcGh5c2ljYWwgQVNJQy9QQ0llIGNhcmRzIG5vdCBlbXVsYXRlZCBpbiBzdGFuZGFyZCBRRU1VLgotIFVucmVhY2hhYmxlIGV4ZWN1dGlvbiBwYXRoczoKICAqIERyaXZlciB0ZWFyZG93biBjYWxsYmFja3MgKC5yZW1vdmUsIC5zaHV0ZG93biwgcGNpX3VucmVnaXN0ZXJfZHJpdmVyKSBleGVjdXRlZCBvbmx5IGR1cmluZwogICAgcGh5c2ljYWwgUENJIGhvdC11bnBsdWcgb3IgbWFudWFsIHN5c2ZzIGRyaXZlciB1bmJpbmRpbmcuCiAgKiBDb2RlIHBhdGhzIGV4Y2x1c2l2ZSB0byBhcmNoaXRlY3R1cmVzIG90aGVyIHRoYW4gdGhlIHRhcmdldCBhcmNoaXRlY3R1cmUuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQozLiBXSEVOIFRPIFJFVFVSTiBXb3J0aEZ1enppbmc9dHJ1ZSAoUE9TSVRJVkUgQ1JJVEVSSUEpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ClJldHVybiBXb3J0aEZ1enppbmc9dHJ1ZSB3aGVuZXZlciB0aGUgcGF0Y2ggdG91Y2hlcyByZWFjaGFibGUgZXhlY3V0YWJsZSBjb2RlLCBpbmNsdWRpbmc6Ci0gQ29yZSBTdWJzeXN0ZW1zOgogICogQW55IGxvZ2ljIG1vZGlmaWNhdGlvbnMgaW4gbWVtb3J5IG1hbmFnZW1lbnQgKG1tLyksIHN5bmNocm9uaXphdGlvbi9sb2NraW5nIChrZXJuZWwvbG9ja2luZy8pLAogICAgQlBGLCBzY2hlZHVsZXIsIGNvcmUgbmV0d29ya2luZywgVkZTLCBvciBzeXNjYWxsIGhhbmRsaW5nLgotIFJlZmFjdG9yaW5ncyBhbmQgQ29kZSBDbGVhbnVwczoKICAqIEFueSByZXN0cnVjdHVyaW5nIG9mIHJlYWNoYWJsZSBkYXRhIHN0cnVjdHVyZXMsIGhlbHBlciBhYnN0cmFjdGlvbnMsIG9yIGFsZ29yaXRobSBmbG93cy4KLSBSdW50aW1lIEFzc2VydGlvbnMgYW5kIERlZmVuc2l2ZSBDaGVja3M6CiAgKiBBbnkgaW50cm9kdWN0aW9uIG9yIGFsdGVyYXRpb24gb2YgYXNzZXJ0aW9ucyAoV0FSTl9PTiosIFZNX1dBUk5fT04qLCBCVUdfT04qLCBldGMuKSBpbiByZWFjaGFibGUgcGF0aHMuCi0gUmVhY2hhYmxlIERyaXZlcnMgYW5kIFByb3RvY29sczoKICAqIERyaXZlcnMgYWNjZXNzaWJsZSB2aWEgdmlydHVhbCBidXNlcyAodmlydGlvLCBVU0IgZ2FkZ2V0LCBsb29wYmFjaywgbmV0bGluaywgYmluZGVyLCBzb2NrZXRzLCBldGMuKS4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjQuIEVYVFJBQ1RJTkcgRm9jdXNTeW1ib2xzIChQUkVWRU5USU5HIERJTFVUSU9OKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpXaGVuIFdvcnRoRnV6emluZz10cnVlLCB5b3UgbXVzdCBleHRyYWN0IHNwZWNpZmljIGtlcm5lbCBmdW5jdGlvbnMgaW50byBGb2N1c1N5bWJvbHMgdG8gZ3VpZGUgdGhlIGZ1enplcjoKCi0gQVZPSUQgVUJJUVVJVE9VUyBMSUZFQ1lDTEUgSE9ULVBBVEhTOgogIERvIE5PVCBsaXN0IGdlbmVyaWMsIHViaXF1aXRvdXMgZnVuY3Rpb25zIGNhbGxlZCBieSBhbG1vc3QgZXZlcnkgcHJvZ3JhbSBpbiB0aGUgY29ycHVzCiAgKGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvOiBnZW5lcmFsIG1lbW9yeSBhbGxvY2F0b3JzIGFuZCBkZWFsbG9jYXRvcnMsIHBhZ2UgZmF1bHQKICBhbmQgdHJhcCBoYW5kbGVycywgb3IgY29yZSBzeW5jaHJvbml6YXRpb24gcHJpbWl0aXZlczsgdGhpcyBpcyBub3QgYW4gZXhoYXVzdGl2ZSBsaXN0KS4KICBMaXN0aW5nIHViaXF1aXRvdXMgZnVuY3Rpb25zIGNhdXNlcyB0aGUgZnV6emVyIHRvIGNsYXNzaWZ5IHRob3VzYW5kcyBvZiB1bnJlbGF0ZWQgdGVzdHMgYXMgJiMzNDtmb2N1c2VkJiMzNDssCiAgd2hpY2ggc2V2ZXJlbHkgZGlsdXRlcyBmdXp6aW5nIGVmZm9ydCBhd2F5IGZyb20gdGhlIGFjdHVhbCBjaGFuZ2VzLgoKLSBUQVJHRVQgU1BFQ0lGSUMgRkVBVFVSRSBMT0dJQyBBTkQgRU5UUllQT0lOVFM6CiAgTGlzdCBmdW5jdGlvbnMgdGhhdCBzcGVjaWZpY2FsbHkgaW1wbGVtZW50IHRoZSBsb2dpYyBiZWluZyBhZGRlZCBvciBhbHRlcmVkLCBvciBkaXJlY3QgQVBJIGVudHJ5cG9pbnRzCiAgZm9yIHRoZSBzdWJzeXN0ZW0gZmVhdHVyZSB1bmRlciByZXZpZXcuCgotIEhBTkRMSU5HIFNUQVRJQyBJTkxJTkUgRlVOQ1RJT05TIElOIEhFQURFUlMgKC5oKToKICBDb21waWxlci1pbmxpbmVkIHN0YXRpYyBmdW5jdGlvbnMgKHN1Y2ggYXMgc3RhdGljIGlubGluZXMgaW4gbW0vKi5oIG9yIGluY2x1ZGUvbGludXgvKi5oKSBsYWNrCiAgZGlzdGluY3Qgc3ltYm9sIGFkZHJlc3NlcyBpbiB2bWxpbnV4IGFuZCBjYW5ub3QgYmUgdGFyZ2V0ZWQgZGlyZWN0bHkgYnkgc3ltYm9sIGNvdmVyYWdlIGZpbHRlcnMuCiAgSWYgdGhlIGNoYW5nZXMgYXJlIHByaW1hcmlseSBpbiBzdGF0aWMgaW5saW5lIGhlbHBlcnMsIGlkZW50aWZ5IG5vbi1zdGF0aWMsIGZlYXR1cmUtc3BlY2lmaWMgY2FsbGVyCiAgZnVuY3Rpb25zIGluIC5jIGZpbGVzIHRoYXQgZXhlcmNpc2UgdGhlbSAoYXZvaWRpbmcgdWJpcXVpdG91cyBsaWZlY3ljbGUgd3JhcHBlcnMpLgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KNS4gSURFTlRJRllJTkcgRW5hYmxlQ29uZmlncwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpJZGVudGlmeSBhbnkgc3BlY2lmaWMgQ09ORklHXyBvcHRpb25zIHJlcXVpcmVkIHRvIHByb3Blcmx5IGNvbXBpbGUgYW5kIHJlYWNoIHRoZSBtb2RpZmllZCBjb2RlOgotIEluc3BlY3QgS2NvbmZpZyBmaWxlcyBhbmQgI2lmZGVmIGd1YXJkczsgZG8gbm90IG1ha2UgYXNzdW1wdGlvbnMuCi0gQ2hlY2sgJiMzNDtkZXBlbmRzIG9uJiMzNDsgbGluZXMgaW4gS2NvbmZpZyB0byBpbmNsdWRlIGFueSBub24tc3RhbmRhcmQgcGFyZW50IHN1YnN5c3RlbSBjb25maWdzIG5lZWRlZC4KLSBTdHJpcCBhbnkgJiMzOTtDT05GSUdfJiMzOTsgcHJlZml4IChlLmcuLCByZXR1cm4gJiMzNDtORVRfSVBWNCYjMzQ7IGluc3RlYWQgb2YgJiMzNDtDT05GSUdfTkVUX0lQVjQmIzM0OykuClByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLgoKClVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuCkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LgpJZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UHJvbXB0OjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+VGFyZ2V0IGFyY2hpdGVjdHVyZTogYW1kNjQKCkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOgpjb21taXQgMGFjZTJkYjM1MWFkMGE3ZWRiOTBhNmNhMDQ5MzU3NDhiYmM3MmZkMQpBdXRob3I6IHN5ei1jbHVzdGVyICZsdDt0cmlhZ2VAc3l6a2FsbGVyLmNvbSZndDsKRGF0ZTogICBNb24gU2VwIDcgMjA6Mzc6MDkgMjAyNiAmIzQzOzAwMDAKCiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXcKCmRpZmYgLS1naXQgYS9tbS96c3dhcC5jIGIvbW0venN3YXAuYwppbmRleCAzN2YzNGU0MDZjOGUzLi5mZDM2YWMzOGU5YTFlIDEwMDY0NAotLS0gYS9tbS96c3dhcC5jCiYjNDM7JiM0MzsmIzQzOyBiL21tL3pzd2FwLmMKQEAgLTE1NzEsNiAmIzQzOzE1NzEsMzIgQEAgYm9vbCB6c3dhcF9zdG9yZShzdHJ1Y3QgZm9saW8gKmZvbGlvKQogCXJldHVybiByZXQ7CiB9CiAKJiM0MzsvKioKJiM0MzsgKiB6c3dhcF9pc19wcmVzZW50KCkgLSBpcyBhbnkgc2xvdCBpbiBbZW50cnksIGVudHJ5ICYjNDM7IG5yKSBpbiB6c3dhcD8KJiM0MzsgKiBAZW50cnk6IGJhc2Ugc3dhcCBlbnRyeSBvZiB0aGUgcmFuZ2UKJiM0MzsgKiBAbnI6IG51bWJlciBvZiBjb250aWd1b3VzIHNsb3RzIHRvIGNoZWNrCiYjNDM7ICoKJiM0MzsgKiBDb250ZXh0OiBUaGUgY2FsbGVyIG11c3Qga2VlcCB0aGUgcmFuZ2UgcGlubmVkLCBvdGhlcndpc2UgdGhlIGFuc3dlciBjYW4KJiM0MzsgKiBjaGFuZ2UgdW5kZXIgaXQuCiYjNDM7ICogUmV0dXJuOiB0cnVlIGlmIGF0IGxlYXN0IG9uZSBzbG90IGluIHRoZSByYW5nZSBpcyBpbiB6c3dhcC4KJiM0MzsgKi8KJiM0MztzdGF0aWMgYm9vbCB6c3dhcF9pc19wcmVzZW50KHN3cF9lbnRyeV90IGVudHJ5LCB1bnNpZ25lZCBpbnQgbnIpCiYjNDM7ewomIzQzOwlwZ29mZl90IG9mZnNldCA9IHN3cF9vZmZzZXQoZW50cnkpOwomIzQzOwlzdHJ1Y3QgeGFycmF5ICp0cmVlID0gc3dhcF96c3dhcF90cmVlKGVudHJ5KTsKJiM0MzsJdW5zaWduZWQgbG9uZyBpbmRleCA9IG9mZnNldDsKJiM0MzsKJiM0MzsJLyoKJiM0MzsJICogQSBwaW5uZWQgcmFuZ2UgaXMgYXQgbW9zdCBTV0FQRklMRV9DTFVTVEVSIHNsb3RzIGFuZCBpcyBhbGlnbmVkIHRvCiYjNDM7CSAqIGl0cyBvd24gc2l6ZSwgc28gb25lIHRyZWUgY292ZXJzIGFsbCBvZiBpdCBhbmQgYSBzaW5nbGUgbG9va3VwIGlzCiYjNDM7CSAqIGVub3VnaC4gU2Nhbm5pbmcgb25seSBwYXJ0IG9mIHRoZSByYW5nZSB3b3VsZCByZXBvcnQgYSBmYWxzZQomIzQzOwkgKiAmIzM0O2Fic2VudCYjMzQ7IGFuZCBsZXQgdGhlIGNhbGxlciByZWFkIGEgc3RhbGUgY29weSBmcm9tIHRoZSBkZXZpY2UuCiYjNDM7CSAqLwomIzQzOwlCVUlMRF9CVUdfT04oU1dBUEZJTEVfQ0xVU1RFUiAmZ3Q7IFpTV0FQX0FERFJFU1NfU1BBQ0VfUEFHRVMpOwomIzQzOwomIzQzOwlyZXR1cm4geGFfZmluZCh0cmVlLCAmYW1wO2luZGV4LCBvZmZzZXQgJiM0MzsgbnIgLSAxLCBYQV9QUkVTRU5UKTsKJiM0Mzt9CiYjNDM7CiAvKioKICAqIHpzd2FwX2xvYWQoKSAtIGxvYWQgYSBmb2xpbyBmcm9tIHpzd2FwCiAgKiBAZm9saW86IGZvbGlvIHRvIGxvYWQKQEAgLTE1NzgsMTUgJiM0MzsxNjA0LDEyIEBAIGJvb2wgenN3YXBfc3RvcmUoc3RydWN0IGZvbGlvICpmb2xpbykKICAqIFJldHVybjogMCBvbiBzdWNjZXNzLCB3aXRoIHRoZSBmb2xpbyB1bmxvY2tlZCBhbmQgbWFya2VkIHVwLXRvLWRhdGUsIG9yIG9uZQogICogb2YgdGhlIGZvbGxvd2luZyBlcnJvciBjb2RlczoKICAqCi0gKiAgLUVJTzogaWYgdGhlIHN3YXBwZWQgb3V0IGNvbnRlbnQgd2FzIGluIHpzd2FwLCBidXQgY291bGQgbm90IGJlIGxvYWRlZAotICogIGludG8gdGhlIHBhZ2UgZHVlIHRvIGEgZGVjb21wcmVzc2lvbiBmYWlsdXJlLiBUaGUgZm9saW8gaXMgdW5sb2NrZWQsIGJ1dAotICogIE5PVCBtYXJrZWQgdXAtdG8tZGF0ZSwgc28gdGhhdCBhbiBJTyBlcnJvciBpcyBlbWl0dGVkIChlLmcuIGRvX3N3YXBfcGFnZSgpCi0gKiAgd2lsbCBTSUdCVVMpLgotICoKLSAqICAtRUlOVkFMOiBpZiB0aGUgc3dhcHBlZCBvdXQgY29udGVudCB3YXMgaW4genN3YXAsIGJ1dCB0aGUgcGFnZSBiZWxvbmdzCi0gKiAgdG8gYSBsYXJnZSBmb2xpbywgd2hpY2ggaXMgbm90IHN1cHBvcnRlZCBieSB6c3dhcC4gVGhlIGZvbGlvIGlzIHVubG9ja2VkLAotICogIGJ1dCBOT1QgbWFya2VkIHVwLXRvLWRhdGUsIHNvIHRoYXQgYW4gSU8gZXJyb3IgaXMgZW1pdHRlZCAoZS5nLgotICogIGRvX3N3YXBfcGFnZSgpIHdpbGwgU0lHQlVTKS4KJiM0MzsgKiAgLUVJTzogaWYgdGhlIHN3YXBwZWQgb3V0IGNvbnRlbnQgd2FzIGluIHpzd2FwIGJ1dCBjb3VsZCBub3QgYmUgaGFuZGVkCiYjNDM7ICogIGJhY2ssIGVpdGhlciBiZWNhdXNlIGRlY29tcHJlc3Npb24gZmFpbGVkIG9yIGJlY2F1c2UgYSBzbG90IGluIGEKJiM0MzsgKiAgbGFyZ2UtZm9saW8gcmFuZ2UgaXMgc3RpbGwgaW4genN3YXAgYW5kIHpzd2FwIGNhbm5vdCByZWNvbnN0cnVjdCBhIGxhcmdlCiYjNDM7ICogIGZvbGlvIGZyb20gcGVyLXBhZ2UgZW50cmllcy4gVGhlIGZvbGlvIGlzIHVubG9ja2VkLCBidXQgTk9UIG1hcmtlZAomIzQzOyAqICB1cC10by1kYXRlLCBzbyB0aGF0IGFuIElPIGVycm9yIGlzIGVtaXR0ZWQgKGUuZy4gZG9fc3dhcF9wYWdlKCkgd2lsbAomIzQzOyAqICBTSUdCVVMpLgogICoKICAqICAtRU5PRU5UOiBpZiB0aGUgc3dhcHBlZCBvdXQgY29udGVudCB3YXMgbm90IGluIHpzd2FwLiBUaGUgZm9saW8gcmVtYWlucwogICogIGxvY2tlZCBvbiByZXR1cm4uCkBAIC0xNjA1LDEzICYjNDM7MTYyOCwxOCBAQCBpbnQgenN3YXBfbG9hZChzdHJ1Y3QgZm9saW8gKmZvbGlvKQogCQlyZXR1cm4gLUVOT0VOVDsKIAogCS8qCi0JICogTGFyZ2UgZm9saW9zIHNob3VsZCBub3QgYmUgc3dhcHBlZCBpbiB3aGlsZSB6c3dhcCBpcyBiZWluZyB1c2VkLCBhcwotCSAqIHRoZXkgYXJlIG5vdCBwcm9wZXJseSBoYW5kbGVkLiBac3dhcCBkb2VzIG5vdCBwcm9wZXJseSBsb2FkIGxhcmdlCi0JICogZm9saW9zLCBhbmQgYSBsYXJnZSBmb2xpbyBtYXkgb25seSBiZSBwYXJ0aWFsbHkgaW4genN3YXAuCiYjNDM7CSAqIEEgbGFyZ2UgZm9saW8gY2FuIGxlZ2l0aW1hdGVseSByZWFjaCB6c3dhcF9sb2FkKCkgd2l0aCBpdHMgd2hvbGUKJiM0MzsJICogcmFuZ2Ugb24gdGhlIGJhY2tpbmcgZGV2aWNlLCBzbyBzY2FuIHRoZSByYW5nZSByYXRoZXIgdGhhbiByZWplY3RpbmcKJiM0MzsJICogaXQgb3V0cmlnaHQuIFRoZSBjYWxsZXIgaGFzIHBpbm5lZCBldmVyeSBzbG90LCBzbyB6c3dhcCBjYW5ub3Qgc3RhcnQKJiM0MzsJICogYSBzdG9yZSBvciBhIHdyaXRlYmFjayBpbnRvIHRoZSByYW5nZSB3aGlsZSB3ZSBsb29rLgogCSAqLwotCWlmIChXQVJOX09OX09OQ0UoZm9saW9fdGVzdF9sYXJnZShmb2xpbykpKSB7Ci0JCWZvbGlvX3VubG9jayhmb2xpbyk7Ci0JCXJldHVybiAtRUlOVkFMOwomIzQzOwlpZiAoZm9saW9fdGVzdF9sYXJnZShmb2xpbykpIHsKJiM0MzsJCWlmIChXQVJOX09OX09OQ0UoenN3YXBfaXNfcHJlc2VudChzd3AsCiYjNDM7CQkJCQkJICBmb2xpb19ucl9wYWdlcyhmb2xpbykpKSkgewomIzQzOwkJCWZvbGlvX3VubG9jayhmb2xpbyk7CiYjNDM7CQkJcmV0dXJuIC1FSU87CiYjNDM7CQl9CiYjNDM7CQlyZXR1cm4gLUVOT0VOVDsKIAl9CiAKIAllbnRyeSA9IHhhX2xvYWQodHJlZSwgb2Zmc2V0KTsKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+My8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDcgMjA6Mzc8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMzc5OAoJCQkJCQkJb3V0cHV0OiAzNQoJCQkJCQkJdGhvdWdodHM6IDY1CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyB0aGUgWnN3YXAgUGF0Y2gqKgoKT2theSwgbGV0JiMzOTtzIGRpdmUgaW50byB0aGlzLiBGaXJzdCwgSSBuZWVkIHRvIGdldCBhIGNsZWFyIHVuZGVyc3RhbmRpbmcgb2YgdGhlIHBhdGNoIGl0c2VsZiBhbmQgZXhhY3RseSB3aGF0IHJlcXVpcmVtZW50cyBpdCYjMzk7cyBhZGRyZXNzaW5nLiBUaGUgY29yZSBvZiB0aGUgbW9kaWZpY2F0aW9uIHNlZW1zIHRvIGJlIGluIGBtbS96c3dhcC5jYC4gUmlnaHQsIHNvIEkmIzM5O2xsIG5lZWQgdG8gc2NydXRpbml6ZSB0aGUgY2hhbmdlcyBtYWRlIHdpdGhpbiB0aGF0IGZpbGUuIEkmIzM5O2xsIHByb2JhYmx5IGZpcmUgdXAgYGdyZXBwZXJgIG9yIGp1c3QgcXVpY2tseSByZWFkIHRoZSBmaWxlLiBUaGlzIGlzIHJvdXRpbmUsIGJ1dCBJIHdhbnQgdG8gbWFrZSBzdXJlIEkgZG9uJiMzOTt0IG1pc3MgYW55dGhpbmcuCgpMb29rcyBsaWtlIHRoZSByZWxldmFudCBzZWN0aW9uIGlzIGFyb3VuZCBsaW5lcyAxNTcwIHRvIDE2NDAgaW4gYG1tL3pzd2FwLmNgLiBPa2F5LCB0aW1lIHRvIHB1bGwgdXAgdGhhdCBjb2RlIGJsb2NrIGFuZCBnZXQgYSBnb29kIGxvb2sgYXQgdGhlIGNoYW5nZXMgYW5kIHdoYXQmIzM5O3MgZ29pbmcgb24gYXJvdW5kIHRoZW0uIE5lZWQgdG8gdW5kZXJzdGFuZCB0aGUgY29udGV4dCBvZiB0aGlzIHNwZWNpZmljIGFyZWEgYW5kIGhvdyBpdCYjMzk7cyBiZWluZyBhZmZlY3RlZC4gTGV0JiMzOTtzIHNlZS4uLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA3IDIwOjM3PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7bW0venN3YXAuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDE1NjUsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogODUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7MTU2NTpcdFx0XHRcdGVudHJ5ID0geGFfZXJhc2UodHJlZSwgb2Zmc2V0ICYjNDM7IGluZGV4KTtcbjE1NjY6XHRcdFx0XHRpZiAoZW50cnkpXG4xNTY3Olx0XHRcdFx0XHR6c3dhcF9lbnRyeV9mcmVlKGVudHJ5KTtcbjE1Njg6XHRcdFx0fVxuMTU2OTpcdFx0fVxuMTU3MDpcdFxuMTU3MTpcdFx0cmV0dXJuIHJldDtcbjE1NzI6XHR9XG4xNTczOlx0XG4xNTc0Olx0LyoqXG4xNTc1Olx0ICogenN3YXBfaXNfcHJlc2VudCgpIC0gaXMgYW55IHNsb3QgaW4gW2VudHJ5LCBlbnRyeSAmIzQzOyBucikgaW4genN3YXA/XG4xNTc2Olx0ICogQGVudHJ5OiBiYXNlIHN3YXAgZW50cnkgb2YgdGhlIHJhbmdlXG4xNTc3Olx0ICogQG5yOiBudW1iZXIgb2YgY29udGlndW91cyBzbG90cyB0byBjaGVja1xuMTU3ODpcdCAqXG4xNTc5Olx0ICogQ29udGV4dDogVGhlIGNhbGxlciBtdXN0IGtlZXAgdGhlIHJhbmdlIHBpbm5lZCwgb3RoZXJ3aXNlIHRoZSBhbnN3ZXIgY2FuXG4xNTgwOlx0ICogY2hhbmdlIHVuZGVyIGl0LlxuMTU4MTpcdCAqIFJldHVybjogdHJ1ZSBpZiBhdCBsZWFzdCBvbmUgc2xvdCBpbiB0aGUgcmFuZ2UgaXMgaW4genN3YXAuXG4xNTgyOlx0ICovXG4xNTgzOlx0c3RhdGljIGJvb2wgenN3YXBfaXNfcHJlc2VudChzd3BfZW50cnlfdCBlbnRyeSwgdW5zaWduZWQgaW50IG5yKVxuMTU4NDpcdHtcbjE1ODU6XHRcdHBnb2ZmX3Qgb2Zmc2V0ID0gc3dwX29mZnNldChlbnRyeSk7XG4xNTg2Olx0XHRzdHJ1Y3QgeGFycmF5ICp0cmVlID0gc3dhcF96c3dhcF90cmVlKGVudHJ5KTtcbjE1ODc6XHRcdHVuc2lnbmVkIGxvbmcgaW5kZXggPSBvZmZzZXQ7XG4xNTg4Olx0XG4xNTg5Olx0XHQvKlxuMTU5MDpcdFx0ICogQSBwaW5uZWQgcmFuZ2UgaXMgYXQgbW9zdCBTV0FQRklMRV9DTFVTVEVSIHNsb3RzIGFuZCBpcyBhbGlnbmVkIHRvXG4xNTkxOlx0XHQgKiBpdHMgb3duIHNpemUsIHNvIG9uZSB0cmVlIGNvdmVycyBhbGwgb2YgaXQgYW5kIGEgc2luZ2xlIGxvb2t1cCBpc1xuMTU5MjpcdFx0ICogZW5vdWdoLiBTY2FubmluZyBvbmx5IHBhcnQgb2YgdGhlIHJhbmdlIHdvdWxkIHJlcG9ydCBhIGZhbHNlXG4xNTkzOlx0XHQgKiBcJiMzNDthYnNlbnRcJiMzNDsgYW5kIGxldCB0aGUgY2FsbGVyIHJlYWQgYSBzdGFsZSBjb3B5IGZyb20gdGhlIGRldmljZS5cbjE1OTQ6XHRcdCAqL1xuMTU5NTpcdFx0QlVJTERfQlVHX09OKFNXQVBGSUxFX0NMVVNURVIgXHUwMDNlIFpTV0FQX0FERFJFU1NfU1BBQ0VfUEFHRVMpO1xuMTU5NjpcdFxuMTU5NzpcdFx0cmV0dXJuIHhhX2ZpbmQodHJlZSwgXHUwMDI2aW5kZXgsIG9mZnNldCAmIzQzOyBuciAtIDEsIFhBX1BSRVNFTlQpO1xuMTU5ODpcdH1cbjE1OTk6XHRcbjE2MDA6XHQvKipcbjE2MDE6XHQgKiB6c3dhcF9sb2FkKCkgLSBsb2FkIGEgZm9saW8gZnJvbSB6c3dhcFxuMTYwMjpcdCAqIEBmb2xpbzogZm9saW8gdG8gbG9hZFxuMTYwMzpcdCAqXG4xNjA0Olx0ICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIHdpdGggdGhlIGZvbGlvIHVubG9ja2VkIGFuZCBtYXJrZWQgdXAtdG8tZGF0ZSwgb3Igb25lXG4xNjA1Olx0ICogb2YgdGhlIGZvbGxvd2luZyBlcnJvciBjb2RlczpcbjE2MDY6XHQgKlxuMTYwNzpcdCAqICAtRUlPOiBpZiB0aGUgc3dhcHBlZCBvdXQgY29udGVudCB3YXMgaW4genN3YXAgYnV0IGNvdWxkIG5vdCBiZSBoYW5kZWRcbjE2MDg6XHQgKiAgYmFjaywgZWl0aGVyIGJlY2F1c2UgZGVjb21wcmVzc2lvbiBmYWlsZWQgb3IgYmVjYXVzZSBhIHNsb3QgaW4gYVxuMTYwOTpcdCAqICBsYXJnZS1mb2xpbyByYW5nZSBpcyBzdGlsbCBpbiB6c3dhcCBhbmQgenN3YXAgY2Fubm90IHJlY29uc3RydWN0IGEgbGFyZ2VcbjE2MTA6XHQgKiAgZm9saW8gZnJvbSBwZXItcGFnZSBlbnRyaWVzLiBUaGUgZm9saW8gaXMgdW5sb2NrZWQsIGJ1dCBOT1QgbWFya2VkXG4xNjExOlx0ICogIHVwLXRvLWRhdGUsIHNvIHRoYXQgYW4gSU8gZXJyb3IgaXMgZW1pdHRlZCAoZS5nLiBkb19zd2FwX3BhZ2UoKSB3aWxsXG4xNjEyOlx0ICogIFNJR0JVUykuXG4xNjEzOlx0ICpcbjE2MTQ6XHQgKiAgLUVOT0VOVDogaWYgdGhlIHN3YXBwZWQgb3V0IGNvbnRlbnQgd2FzIG5vdCBpbiB6c3dhcC4gVGhlIGZvbGlvIHJlbWFpbnNcbjE2MTU6XHQgKiAgbG9ja2VkIG9uIHJldHVybi5cbjE2MTY6XHQgKi9cbjE2MTc6XHRpbnQgenN3YXBfbG9hZChzdHJ1Y3QgZm9saW8gKmZvbGlvKVxuMTYxODpcdHtcbjE2MTk6XHRcdHN3cF9lbnRyeV90IHN3cCA9IGZvbGlvLVx1MDAzZXN3YXA7XG4xNjIwOlx0XHRwZ29mZl90IG9mZnNldCA9IHN3cF9vZmZzZXQoc3dwKTtcbjE2MjE6XHRcdHN0cnVjdCB4YXJyYXkgKnRyZWUgPSBzd2FwX3pzd2FwX3RyZWUoc3dwKTtcbjE2MjI6XHRcdHN0cnVjdCB6c3dhcF9lbnRyeSAqZW50cnk7XG4xNjIzOlx0XG4xNjI0Olx0XHRWTV9XQVJOX09OX09OQ0UoIWZvbGlvX3Rlc3RfbG9ja2VkKGZvbGlvKSk7XG4xNjI1Olx0XHRWTV9XQVJOX09OX09OQ0UoIWZvbGlvX3Rlc3Rfc3dhcGNhY2hlKGZvbGlvKSk7XG4xNjI2Olx0XG4xNjI3Olx0XHRpZiAoenN3YXBfbmV2ZXJfZW5hYmxlZCgpKVxuMTYyODpcdFx0XHRyZXR1cm4gLUVOT0VOVDtcbjE2Mjk6XHRcbjE2MzA6XHRcdC8qXG4xNjMxOlx0XHQgKiBBIGxhcmdlIGZvbGlvIGNhbiBsZWdpdGltYXRlbHkgcmVhY2ggenN3YXBfbG9hZCgpIHdpdGggaXRzIHdob2xlXG4xNjMyOlx0XHQgKiByYW5nZSBvbiB0aGUgYmFja2luZyBkZXZpY2UsIHNvIHNjYW4gdGhlIHJhbmdlIHJhdGhlciB0aGFuIHJlamVjdGluZ1xuMTYzMzpcdFx0ICogaXQgb3V0cmlnaHQuIFRoZSBjYWxsZXIgaGFzIHBpbm5lZCBldmVyeSBzbG90LCBzbyB6c3dhcCBjYW5ub3Qgc3RhcnRcbjE2MzQ6XHRcdCAqIGEgc3RvcmUgb3IgYSB3cml0ZWJhY2sgaW50byB0aGUgcmFuZ2Ugd2hpbGUgd2UgbG9vay5cbjE2MzU6XHRcdCAqL1xuMTYzNjpcdFx0aWYgKGZvbGlvX3Rlc3RfbGFyZ2UoZm9saW8pKSB7XG4xNjM3Olx0XHRcdGlmIChXQVJOX09OX09OQ0UoenN3YXBfaXNfcHJlc2VudChzd3AsXG4xNjM4Olx0XHRcdFx0XHRcdFx0ICBmb2xpb19ucl9wYWdlcyhmb2xpbykpKSkge1xuMTYzOTpcdFx0XHRcdGZvbGlvX3VubG9jayhmb2xpbyk7XG4xNjQwOlx0XHRcdFx0cmV0dXJuIC1FSU87XG4xNjQxOlx0XHRcdH1cbjE2NDI6XHRcdFx0cmV0dXJuIC1FTk9FTlQ7XG4xNjQzOlx0XHR9XG4xNjQ0Olx0XG4xNjQ1Olx0XHRlbnRyeSA9IHhhX2xvYWQodHJlZSwgb2Zmc2V0KTtcbjE2NDY6XHRcdGlmICghZW50cnkpXG4xNjQ3Olx0XHRcdHJldHVybiAtRU5PRU5UO1xuMTY0ODpcdFxuMTY0OTpcdFx0aWYgKCF6c3dhcF9kZWNvbXByZXNzKGVudHJ5LCBmb2xpbykpIHtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD41LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNyAyMDozNzwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA1NDIwCgkJCQkJCQlvdXRwdXQ6IDI2CgkJCQkJCQl0aG91Z2h0czogMTgKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGhlcmUmIzM5O3MgbXkgdGFrZSBvbiB0aG9zZSB0aG91Z2h0cywgZnJhbWVkIGFzIGFuIGV4cGVydCYjMzk7cyBpbnRlcm5hbCBtb25vbG9ndWU6CgoqKkNoZWNraW5nIHRoZSBLY29uZmlnIGZvciBac3dhcCoqCgpBbHJpZ2h0LCB0aW1lIHRvIGdldCBteSBoYW5kcyBkaXJ0eS4gTXkgaW1tZWRpYXRlIHRob3VnaHQgaXMgdG8gZGl2ZSBpbnRvIHRoZSBLY29uZmlnIGZpbGVzLCBzcGVjaWZpY2FsbHkgZm9jdXNpbmcgb24gdGhlIGNvbmZpZ3VyYXRpb25zIHJlbGF0ZWQgdG8genN3YXAgYW5kIHRoZSBgbW0venN3YXAuY2AgaW1wbGVtZW50YXRpb24uIEdvdHRhIG1ha2Ugc3VyZSBldmVyeXRoaW5nJiMzOTtzIHNldCB1cCBjb3JyZWN0bHksIHRoYXQgdGhlIGJ1aWxkIHN5c3RlbSBrbm93cyB3aGF0JiMzOTtzIGdvaW5nIG9uLCBhbmQgdGhhdCB0aGUgcmVsZXZhbnQgb3B0aW9ucyBhcmUgZXhwb3NlZCB0byB0aGUgdXNlciwgb3IgYXBwcm9wcmlhdGVseSBoaWRkZW4gaWYgdGhleSBhcmUgbm90IG1lYW50IGZvciB0aGUgYXZlcmFnZSBqb2UuCgpJJiMzOTttIHRoaW5raW5nOgoKKiAgICoqSXMgenN3YXAgZXZlbiBlbmFibGVkPyoqIExldCYjMzk7cyB2ZXJpZnkgdGhlIGNvcmUgYENPTkZJR19aU1dBUGAgb3B0aW9uLiBJIG5lZWQgdG8gcXVpY2tseSBjb25maXJtIGl0cyBkZXBlbmRlbmNpZXMgYW5kIGRlZmF1bHQgdmFsdWUgdG9vLgoqICAgKipEZWVwZXIgZGl2ZXM6KiogTm93IEkgaGF2ZSB0byBnbyBkZWVwZXIsIGxvb2sgZm9yIHJlbGF0ZWQgb3B0aW9ucyBsaWtlIGBDT05GSUdfWlBPT0xfU0laRWAsIGBDT05GSUdfWlNXQVBfQ09NUFJFU1NPUmAsIGBDT05GSUdfWlNXQVBfUEFHRV9TSVpFYCwgYW5kIGFueSBvdGhlciBzZXR0aW5ncyB0aGF0IGFmZmVjdCB0aGUgYmVoYXZpb3Igb2YgYHpzd2FwLmNgLgoqICAgKipUaGUgZmluZSBwcmludDoqKiBJJiMzOTtsbCBzY3J1dGluaXplIGFueSBjb25kaXRpb25hbCBkZXBlbmRlbmNpZXMuIEFyZSB0aGVyZSBhbnkgaGFyZHdhcmUgb3Iga2VybmVsIGZlYXR1cmUgZGVwZW5kZW5jaWVzIHRoYXQgSSBuZWVkIHRvIGJlIGF3YXJlIG9mPyBBcmUgdGhlcmUgY29uZmxpY3Rpbmcgb3B0aW9ucyB0aGF0IEkgbWlnaHQgbmVlZCB0byBjb25zaWRlcj8KKiAgICoqV2hhdCBhcmUgdGhlIGRlZmF1bHRzPyoqIEkgd2lsbCBjaGVjayB0aGUgZGVmYXVsdHMsIGFuZCB0aGUgaW1wbGljYXRpb25zIG9mIGNoYW5naW5nIHRoZW0uIFNvbWV0aW1lcyB0aGUgZGVmYXVsdHMgYXJlIGZpbmUsIGJ1dCBpbiBzb21lIHNjZW5hcmlvcyBJJiMzOTtsbCBuZWVkIHRvIG92ZXJyaWRlIHRoZXNlLgoqICAgKipEb2N1bWVudGF0aW9uOioqIEkgd2FudCB0byBjaGVjayBmb3IgY2xlYXIgYW5kIGNvbmNpc2UgZG9jdW1lbnRhdGlvbiB3aXRoaW4gdGhlIEtjb25maWcgZmlsZSBpdHNlbGYuIEFueSBoZWxwIHRleHQgb3IgY29tbWVudHMgdGhhdCBleHBsYWluIHRoZSBwdXJwb3NlIG9mIHRoZSBvcHRpb25zIGFuZCB0aGVpciBpbXBhY3Qgb24gc3lzdGVtIHBlcmZvcm1hbmNlIHdvdWxkIGJlIGdyZWF0bHkgYXBwcmVjaWF0ZWQuCiogICAqKkNyb3NzLXJlZmVyZW5jaW5nOioqIEkgc2hvdWxkIGNyb3NzLXJlZmVyZW5jZSB0aGVzZSBLY29uZmlnIG9wdGlvbnMgd2l0aCB0aGUgYWN0dWFsIGNvZGUgaW4gYG1tL3pzd2FwLmNgIHRvIHNlZSBob3cgdGhlIHNldHRpbmdzIGFyZSBiZWluZyB1dGlsaXplZC4gVGhpcyB3aWxsIGhlbHAgbWUgdW5kZXJzdGFuZCB0aGUgaW1wbGljYXRpb25zIG9mIGRpZmZlcmVudCBjb25maWd1cmF0aW9ucyBpbiBhIG1vcmUgdGFuZ2libGUgbWFubmVyLgoqICAgKipJcyBpdCBldmVuIGNvbXBpbGluZz8qKiBKdXN0IGJlY2F1c2UgdGhlIG9wdGlvbnMgKmV4aXN0KiBkb2VzbiYjMzk7dCBtZWFuIHRoZXkmIzM5O3JlIGFjdHVhbGx5IGdldHRpbmcgdXNlZC4gSSYjMzk7bGwgbmVlZCB0byBxdWlja2x5IGNvbmZpcm0gdGhlIGJ1aWxkIHN5c3RlbSBpcyBjb3JyZWN0bHkgaW50ZWdyYXRpbmcgdGhlc2Ugc2V0dGluZ3MuCgpUaGlzIGlzIGFsbCByb3V0aW5lLCByZWFsbHkuIE5lZWQgdG8gZ2V0IGEgZmlybSBncmFzcCBvbiB0aGUgY29uZmlndXJhdGlvbiBsYW5kc2NhcGUgYmVmb3JlIGV2ZW4gdGhpbmtpbmcgYWJvdXQgbW9kaWZ5aW5nIG9yIHR1bmluZyBhbnl0aGluZy4gQSBzb2xpZCB1bmRlcnN0YW5kaW5nIG9mIHRoZSBiYXNlIGNvbmZpZ3VyYXRpb24gaXMgcGFyYW1vdW50LgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjYvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA3IDIwOjM3PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2NvbmZpZyBaU1dBUCYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O21tLyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDttbS9LY29uZmlnPTEyPW1lbnVjb25maWcgU1dBUFxuLS1cbm1tL0tjb25maWctMjEtXG5tbS9LY29uZmlnOjIyOmNvbmZpZyBaU1dBUFxubW0vS2NvbmZpZy0yMy1cdGJvb2wgXCYjMzQ7Q29tcHJlc3NlZCBjYWNoZSBmb3Igc3dhcCBwYWdlc1wmIzM0O1xuLS1cbm1tL0tjb25maWctMzQtXG5tbS9LY29uZmlnOjM1OmNvbmZpZyBaU1dBUF9ERUZBVUxUX09OXG5tbS9LY29uZmlnLTM2LVx0Ym9vbCBcJiMzNDtFbmFibGUgdGhlIGNvbXByZXNzZWQgY2FjaGUgZm9yIHN3YXAgcGFnZXMgYnkgZGVmYXVsdFwmIzM0O1xuLS1cbm1tL0tjb25maWctNDQtXG5tbS9LY29uZmlnOjQ1OmNvbmZpZyBaU1dBUF9TSFJJTktFUl9ERUZBVUxUX09OXG5tbS9LY29uZmlnLTQ2LVx0Ym9vbCBcJiMzNDtTaHJpbmsgdGhlIHpzd2FwIHBvb2wgb24gbWVtb3J5IHByZXNzdXJlXCYjMzQ7XG4tLVxubW0vS2NvbmZpZz01OT1jaG9pY2Vcbi0tXG5tbS9LY29uZmlnLTc2LVxubW0vS2NvbmZpZzo3Nzpjb25maWcgWlNXQVBfQ09NUFJFU1NPUl9ERUZBVUxUX0RFRkxBVEVcbm1tL0tjb25maWctNzgtXHRib29sIFwmIzM0O0RlZmxhdGVcJiMzNDtcbi0tXG5tbS9LY29uZmlnLTgyLVxubW0vS2NvbmZpZzo4Mzpjb25maWcgWlNXQVBfQ09NUFJFU1NPUl9ERUZBVUxUX0xaT1xubW0vS2NvbmZpZy04NC1cdGJvb2wgXCYjMzQ7TFpPXCYjMzQ7XG4tLVxubW0vS2NvbmZpZy04OC1cbm1tL0tjb25maWc6ODk6Y29uZmlnIFpTV0FQX0NPTVBSRVNTT1JfREVGQVVMVF84NDJcbm1tL0tjb25maWctOTAtXHRib29sIFwmIzM0Ozg0MlwmIzM0O1xuLS1cbm1tL0tjb25maWctOTQtXG5tbS9LY29uZmlnOjk1OmNvbmZpZyBaU1dBUF9DT01QUkVTU09SX0RFRkFVTFRfTFo0XG5tbS9LY29uZmlnLTk2LVx0Ym9vbCBcJiMzNDtMWjRcJiMzNDtcbi0tXG5tbS9LY29uZmlnLTEwMC1cbm1tL0tjb25maWc6MTAxOmNvbmZpZyBaU1dBUF9DT01QUkVTU09SX0RFRkFVTFRfTFo0SENcbm1tL0tjb25maWctMTAyLVx0Ym9vbCBcJiMzNDtMWjRIQ1wmIzM0O1xuLS1cbm1tL0tjb25maWctMTA2LVxubW0vS2NvbmZpZzoxMDc6Y29uZmlnIFpTV0FQX0NPTVBSRVNTT1JfREVGQVVMVF9aU1REXG5tbS9LY29uZmlnLTEwOC1cdGJvb2wgXCYjMzQ7enN0ZFwmIzM0O1xuLS1cbm1tL0tjb25maWc9MTEyPWVuZGNob2ljZVxubW0vS2NvbmZpZy0xMTMtXG5tbS9LY29uZmlnOjExNDpjb25maWcgWlNXQVBfQ09NUFJFU1NPUl9ERUZBVUxUXG5tbS9LY29uZmlnLTExNS0gICAgICAgc3RyaW5nXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Ny8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDcgMjA6Mzc8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNjQ5OAoJCQkJCQkJb3V0cHV0OiAzMQoJCQkJCQkJdGhvdWdodHM6IDE3CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIGEgc3VtbWFyeSBvZiBteSB0aG91Z2h0IHByb2Nlc3MsIGFzIGlmIEkgd2VyZSB0aGUgb25lIHRoaW5raW5nIGl0OgoKKipEaXZpbmcgaW50byB0aGUgWlNXQVAgQ29uZmlndXJhdGlvbioqCgpPa2F5LCB0aW1lIHRvIGdldCBteSBoYW5kcyBkaXJ0eSB3aXRoIHRoaXMgYFpTV0FQYCBjb25maWd1cmF0aW9uLiBGaXJzdCwgSSBuZWVkIHRvIHVuZGVyc3RhbmQgaXRzIHN0cnVjdHVyZSB3aXRoaW4gdGhlIGtlcm5lbCYjMzk7cyBidWlsZCBzeXN0ZW0uIExldCYjMzk7cyBzdGFydCBieSBuYXZpZ2F0aW5nIGRpcmVjdGx5IHRvIGBtbS9LY29uZmlnYC4gVGhhdCYjMzk7cyB3aGVyZSBJIGV4cGVjdCB0byBmaW5kIHRoZSByZWxldmFudCBkZWZpbml0aW9ucyBhbmQgZGVwZW5kZW5jaWVzIGZvciBtZW1vcnkgbWFuYWdlbWVudCBvcHRpb25zLiBJJiMzOTttIHNwZWNpZmljYWxseSBsb29raW5nIGZvciB0aGUgc2VjdGlvbiByZWxhdGVkIHRvIGBjb25maWcgWlNXQVBgLiBJIHdhbnQgdG8gc2VlIGhvdyBpdCYjMzk7cyBkZWZpbmVkLCB3aGljaCBvdGhlciBjb25maWd1cmF0aW9ucyBpdCBkZXBlbmRzIG9uLCBhbmQgd2hhdCB0aGUgZGVmYXVsdCBzZXR0aW5ncyBtaWdodCBiZS4gVGhpcyB3aWxsIGdpdmUgbWUgYSBzb2xpZCBmb3VuZGF0aW9uIGZvciB1bmRlcnN0YW5kaW5nIHRoZSBpbXBsaWNhdGlvbnMgb2YgZW5hYmxpbmcgb3IgZGlzYWJsaW5nIGl0IHdpdGhpbiBhIGtlcm5lbCBjb25maWd1cmF0aW9uLiBLbm93aW5nIHRoZSBgS2NvbmZpZ2Agc3RydWN0dXJlIGhlbHBzIG1lIGFzc2VzcyBwb3RlbnRpYWwgY29uZmxpY3RzIHdpdGggb3RoZXIgbWVtb3J5IG1hbmFnZW1lbnQgb3B0aW9ucy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD44LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNyAyMDozNzwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O21tL0tjb25maWcmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAyMCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiA0MAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgIDIwOlx0XHQgIGluIHlvdXIgY29tcHV0ZXIuICBJZiB1bnN1cmUgc2F5IFkuXG4gIDIxOlx0XG4gIDIyOlx0Y29uZmlnIFpTV0FQXG4gIDIzOlx0XHRib29sIFwmIzM0O0NvbXByZXNzZWQgY2FjaGUgZm9yIHN3YXAgcGFnZXNcJiMzNDtcbiAgMjQ6XHRcdGRlcGVuZHMgb24gU1dBUFxuICAyNTpcdFx0c2VsZWN0IENSWVBUT1xuICAyNjpcdFx0c2VsZWN0IFpTTUFMTE9DXG4gIDI3Olx0XHRoZWxwXG4gIDI4Olx0XHQgIEEgbGlnaHR3ZWlnaHQgY29tcHJlc3NlZCBjYWNoZSBmb3Igc3dhcCBwYWdlcy4gIEl0IHRha2VzXG4gIDI5Olx0XHQgIHBhZ2VzIHRoYXQgYXJlIGluIHRoZSBwcm9jZXNzIG9mIGJlaW5nIHN3YXBwZWQgb3V0IGFuZCBhdHRlbXB0cyB0b1xuICAzMDpcdFx0ICBjb21wcmVzcyB0aGVtIGludG8gYSBkeW5hbWljYWxseSBhbGxvY2F0ZWQgUkFNLWJhc2VkIG1lbW9yeSBwb29sLlxuICAzMTpcdFx0ICBUaGlzIGNhbiByZXN1bHQgaW4gYSBzaWduaWZpY2FudCBJL08gcmVkdWN0aW9uIG9uIHN3YXAgZGV2aWNlIGFuZCxcbiAgMzI6XHRcdCAgaW4gdGhlIGNhc2Ugd2hlcmUgZGVjb21wcmVzc2luZyBmcm9tIFJBTSBpcyBmYXN0ZXIgdGhhbiBzd2FwIGRldmljZVxuICAzMzpcdFx0ICByZWFkcywgY2FuIGFsc28gaW1wcm92ZSB3b3JrbG9hZCBwZXJmb3JtYW5jZS5cbiAgMzQ6XHRcbiAgMzU6XHRjb25maWcgWlNXQVBfREVGQVVMVF9PTlxuICAzNjpcdFx0Ym9vbCBcJiMzNDtFbmFibGUgdGhlIGNvbXByZXNzZWQgY2FjaGUgZm9yIHN3YXAgcGFnZXMgYnkgZGVmYXVsdFwmIzM0O1xuICAzNzpcdFx0ZGVwZW5kcyBvbiBaU1dBUFxuICAzODpcdFx0aGVscFxuICAzOTpcdFx0ICBJZiBzZWxlY3RlZCwgdGhlIGNvbXByZXNzZWQgY2FjaGUgZm9yIHN3YXAgcGFnZXMgd2lsbCBiZSBlbmFibGVkXG4gIDQwOlx0XHQgIGF0IGJvb3QsIG90aGVyd2lzZSBpdCB3aWxsIGJlIGRpc2FibGVkLlxuICA0MTpcdFxuICA0MjpcdFx0ICBUaGUgc2VsZWN0aW9uIG1hZGUgaGVyZSBjYW4gYmUgb3ZlcnJpZGRlbiBieSB1c2luZyB0aGUga2VybmVsXG4gIDQzOlx0XHQgIGNvbW1hbmQgbGluZSAmIzM5O3pzd2FwLmVuYWJsZWQ9JiMzOTsgb3B0aW9uLlxuICA0NDpcdFxuICA0NTpcdGNvbmZpZyBaU1dBUF9TSFJJTktFUl9ERUZBVUxUX09OXG4gIDQ2Olx0XHRib29sIFwmIzM0O1NocmluayB0aGUgenN3YXAgcG9vbCBvbiBtZW1vcnkgcHJlc3N1cmVcJiMzNDtcbiAgNDc6XHRcdGRlcGVuZHMgb24gWlNXQVBcbiAgNDg6XHRcdGRlZmF1bHQgblxuICA0OTpcdFx0aGVscFxuICA1MDpcdFx0ICBJZiBzZWxlY3RlZCwgdGhlIHpzd2FwIHNocmlua2VyIHdpbGwgYmUgZW5hYmxlZCwgYW5kIHRoZSBwYWdlc1xuICA1MTpcdFx0ICBzdG9yZWQgaW4gdGhlIHpzd2FwIHBvb2wgd2lsbCBiZWNvbWUgYXZhaWxhYmxlIGZvciByZWNsYWltIChpLmVcbiAgNTI6XHRcdCAgd3JpdHRlbiBiYWNrIHRvIHRoZSBiYWNraW5nIHN3YXAgZGV2aWNlKSBvbiBtZW1vcnkgcHJlc3N1cmUuXG4gIDUzOlx0XG4gIDU0Olx0XHQgIFRoaXMgbWVhbnMgdGhhdCB6c3dhcCB3cml0ZWJhY2sgY291bGQgaGFwcGVuIGV2ZW4gaWYgdGhlIHBvb2wgaXNcbiAgNTU6XHRcdCAgbm90IHlldCBmdWxsLCBvciB0aGUgY2dyb3VwIHpzd2FwIGxpbWl0IGhhcyBub3QgYmVlbiByZWFjaGVkLFxuICA1NjpcdFx0ICByZWR1Y2luZyB0aGUgY2hhbmNlIHRoYXQgY29sZCBwYWdlcyB3aWxsIHJlc2lkZSBpbiB0aGUgenN3YXAgcG9vbFxuICA1NzpcdFx0ICBhbmQgY29uc3VtZSBtZW1vcnkgaW5kZWZpbml0ZWx5LlxuICA1ODpcdFxuICA1OTpcdGNob2ljZVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjkvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA3IDIwOjM3PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDcyOTMKCQkJCQkJCW91dHB1dDogMTgKCQkJCQkJCXRob3VnaHRzOiAxNgoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgbGV0JiMzOTtzIGRpdmUgaW50byB0aGlzLiBIZXJlJiMzOTtzIGhvdyBJJiMzOTtkIGFwcHJvYWNoIHRoYXQga2VybmVsIGFuYWx5c2lzLCBzdW1tYXJpemluZyBteSBvd24gdGhvdWdodCBwcm9jZXNzOgoKKipJbnZlc3RpZ2F0aW5nIENhbGxlcnMgb2YgYHpzd2FwX2xvYWRgKioKCkFscmlnaHQsIHRpbWUgdG8gZ2V0IG15IGhhbmRzIGRpcnR5LiBJJiMzOTttIHRoaW5raW5nLCAmIzM0O09rYXksIGB6c3dhcF9sb2FkYC4uLiB0aGF0JiMzOTtzIGEga2V5IGZ1bmN0aW9uIGluIHRoZSBac3dhcCBzdWJzeXN0ZW0sIHJpZ2h0PyBJdCYjMzk7cyB0aGUgb25lIHJlc3BvbnNpYmxlIGZvciBsb2FkaW5nIGNvbXByZXNzZWQgcGFnZXMgZnJvbSB0aGUgc3dhcCBjYWNoZS4gU28sIHVuZGVyc3RhbmRpbmcgKndobyogY2FsbHMgaXQgaXMgY3J1Y2lhbCB0byB1bmRlcnN0YW5kaW5nIHRoZSBkYXRhIGZsb3csIHRoZSB0cmlnZ2VycyBmb3IgWnN3YXAgYWN0aXZpdHksIGFuZCBwb3RlbnRpYWwgYm90dGxlbmVja3MuJiMzNDsKCk15IGltbWVkaWF0ZSBpbnN0aW5jdCBpcyB0byBsb29rIGF0IHRoZSBjYWxsaW5nIGNvbnRleHQuICYjMzQ7SSBuZWVkIHRvIHRyYWNrIGRvd24gZXZlcnkgaW5zdGFuY2Ugd2hlcmUgYHpzd2FwX2xvYWRgIGlzIGludm9rZWQgd2l0aGluIHRoZSBrZXJuZWwuIFN0YXRpYyBhbmFseXNpcyB0b29scyBhcmUgbXkgZnJpZW5kcyBoZXJlLiYjMzQ7IEkmIzM5O2QgbGlrZWx5IHN0YXJ0IHdpdGggYHBlcmZgIHRvIGJ1aWxkIGEgZHluYW1pYyBjYWxsZ3JhcGggb3IgYGdyZXBgIHRvIHF1aWNrbHkgc2VhcmNoIHRoZSBzb3VyY2UgY29kZSBmb3IgYWxsIGluc3RhbmNlcyBvZiB0aGUgZnVuY3Rpb24gbmFtZS4gSSYjMzk7ZCBiZSBsb29raW5nIGZvciBhIGNvbXByZWhlbnNpdmUgbGlzdC4gJiMzNDtOb3csIGl0JiMzOTtzIG5vdCBlbm91Z2ggdG8gKmZpbmQqIHRoZSBjYWxsczsgSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhlICp3aHkqLiYjMzQ7CgomIzM0O0ZvciBlYWNoIGNhbGxlciwgSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhlIHB1cnBvc2Ugb2YgdGhhdCBjb2RlIHBhdGguIFdoYXQmIzM5O3MgdGhlIHNwZWNpZmljIHNjZW5hcmlvIHRoYXQgbGVhZHMgdG8gYHpzd2FwX2xvYWRgIGJlaW5nIGV4ZWN1dGVkPyBJcyBpdCBhIHBhZ2UgZmF1bHQgaW4gYSB1c2VyLXNwYWNlIGFwcGxpY2F0aW9uPyBJcyBpdCBhIGJhY2tncm91bmQgcHJvY2VzcyBzY2F2ZW5naW5nIG1lbW9yeT8gQXJlIHRoZXJlIGFueSBvYnZpb3VzIGxvY2tzIG9yIHN5bmNocm9uaXphdGlvbiBwcmltaXRpdmVzIGludm9sdmVkLCBhbmQgaG93IGNvdWxkIHRob3NlIGFmZmVjdCBwZXJmb3JtYW5jZT8gTWF5YmUgYSBsb2NrIGNvbnRlbnRpb24gb3IgcmFjZSBjb25kaXRpb24uJiMzNDsKCkkmIzM5O2QgYmUgcGFydGljdWxhcmx5IGludGVyZXN0ZWQgaW46CgoqICAgKipGcmVxdWVuY3k6KiogSG93IG9mdGVuIGlzIGB6c3dhcF9sb2FkYCBjYWxsZWQgZnJvbSBlYWNoIGNhbGxlcj8KKiAgICoqQ29udGV4dDoqKiBXaGF0JiMzOTtzIHRoZSBjb250ZXh0IHN3aXRjaGluZyBpbiB0aGF0IGNhbGw/CiogICAqKkFyZ3VtZW50czoqKiBXaGF0IGFyZSB0aGUgYXJndW1lbnRzIHBhc3NlZCB0byBgenN3YXBfbG9hZGA/IEFyZSB0aGVyZSBzcGVjaWZpYyBwYWdlIHJhbmdlcyBvciBvdGhlciBkYXRhIHRoYXQgbWlnaHQgcHJvdmlkZSBjbHVlcyBhYm91dCB0aGUgd29ya2xvYWQ/CiogICAqKkxhdGVuY3k6KiogSG93IGxvbmcgZG9lcyBgenN3YXBfbG9hZGAgdGFrZSB0byBleGVjdXRlIGluIGVhY2ggc2NlbmFyaW8/ICYjMzQ7SSYjMzk7bGwgbmVlZCB0byBpbnN0cnVtZW50IHRoZSBjb2RlIGlmIHRoZSBjYWxsIHN0YWNrcyBhcmVuJiMzOTt0IGF2YWlsYWJsZSB0byBtZS4mIzM0OwoKJiMzNDtGaW5hbGx5LCBhZnRlciBhIHRob3JvdWdoIGludmVzdGlnYXRpb24sIEkmIzM5O2Qgd2FudCB0byBidWlsZCBhIG1lbnRhbCBtYXAgb2YgaG93IFpzd2FwIGludGVncmF0ZXMgd2l0aCB0aGUga2VybmVsJiMzOTtzIG1lbW9yeSBtYW5hZ2VtZW50LiBUaGlzIGluZm9ybWF0aW9uIHdpbGwgYmUgaW52YWx1YWJsZSBmb3IgZnV0dXJlIGFuYWx5c2lzLCBkZWJ1Z2dpbmcsIGFuZCBwb3RlbnRpYWxseSwgb3B0aW1pemF0aW9uIGVmZm9ydHMuJiMzNDsKCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMC8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDcgMjA6Mzc8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7enN3YXBfbG9hZCYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtpbmNsdWRlL2xpbnV4L3pzd2FwLmg9Mjg9Ym9vbCB6c3dhcF9zdG9yZShzdHJ1Y3QgZm9saW8gKmZvbGlvKTtcbmluY2x1ZGUvbGludXgvenN3YXAuaDoyOTppbnQgenN3YXBfbG9hZChzdHJ1Y3QgZm9saW8gKmZvbGlvKTtcbmluY2x1ZGUvbGludXgvenN3YXAuaC0zMC12b2lkIHpzd2FwX2ludmFsaWRhdGUoc3dwX2VudHJ5X3Qgc3dwKTtcbi0tXG5pbmNsdWRlL2xpbnV4L3pzd2FwLmg9NDI9c3RhdGljIGlubGluZSBib29sIHpzd2FwX3N0b3JlKHN0cnVjdCBmb2xpbyAqZm9saW8pXG4tLVxuaW5jbHVkZS9saW51eC96c3dhcC5oLTQ2LVxuaW5jbHVkZS9saW51eC96c3dhcC5oOjQ3OnN0YXRpYyBpbmxpbmUgaW50IHpzd2FwX2xvYWQoc3RydWN0IGZvbGlvICpmb2xpbylcbmluY2x1ZGUvbGludXgvenN3YXAuaC00OC17XG4tLVxubW0vcGFnZV9pby5jPTQ1Mj12b2lkIHN3YXBfcmVhZF9mb2xpbyhzdHJ1Y3Qgc3dhcF9pb19jdHggKmN0eCwgc3RydWN0IGZvbGlvICpmb2xpbylcbi0tXG5tbS9wYWdlX2lvLmMtNDc5LVxubW0vcGFnZV9pby5jOjQ4MDpcdGlmICh6c3dhcF9sb2FkKGZvbGlvKSAhPSAtRU5PRU5UKVxubW0vcGFnZV9pby5jLTQ4MS1cdFx0Z290byBmaW5pc2g7XG4tLVxubW0venN3YXAuYz0xNTgzPXN0YXRpYyBib29sIHpzd2FwX2lzX3ByZXNlbnQoc3dwX2VudHJ5X3QgZW50cnksIHVuc2lnbmVkIGludCBucilcbi0tXG5tbS96c3dhcC5jLTE2MDAtLyoqXG5tbS96c3dhcC5jOjE2MDE6ICogenN3YXBfbG9hZCgpIC0gbG9hZCBhIGZvbGlvIGZyb20genN3YXBcbm1tL3pzd2FwLmMtMTYwMi0gKiBAZm9saW86IGZvbGlvIHRvIGxvYWRcbi0tXG5tbS96c3dhcC5jLTE2MTYtICovXG5tbS96c3dhcC5jOjE2MTc6aW50IHpzd2FwX2xvYWQoc3RydWN0IGZvbGlvICpmb2xpbylcbm1tL3pzd2FwLmMtMTYxOC17XG4tLVxubW0venN3YXAuYy0xNjMwLVx0Lypcbm1tL3pzd2FwLmM6MTYzMTpcdCAqIEEgbGFyZ2UgZm9saW8gY2FuIGxlZ2l0aW1hdGVseSByZWFjaCB6c3dhcF9sb2FkKCkgd2l0aCBpdHMgd2hvbGVcbm1tL3pzd2FwLmMtMTYzMi1cdCAqIHJhbmdlIG9uIHRoZSBiYWNraW5nIGRldmljZSwgc28gc2NhbiB0aGUgcmFuZ2UgcmF0aGVyIHRoYW4gcmVqZWN0aW5nXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTEvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA3IDIwOjM3PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDgyOTkKCQkJCQkJCW91dHB1dDogMTkKCQkJCQkJCXRob3VnaHRzOiAzNjUKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIGEgTWVtb3J5IE1hbmFnZW1lbnQgUGF0Y2gqKgoKT2theSwgbGV0JiMzOTtzIGJyZWFrIHRoaXMgZG93bi4gTXkgaW5pdGlhbCBvYnNlcnZhdGlvbiBpcyB0aGF0IHRoaXMgcGF0Y2ggZGl2ZXMgaW50byBgbW0venN3YXAuY2AsIGltbWVkaWF0ZWx5IHBsYWNpbmcgaXQgd2l0aGluIHRoZSBtZW1vcnkgbWFuYWdlbWVudCBzdWJzeXN0ZW0sIHNwZWNpZmljYWxseSByZWxhdGVkIHRvIHpzd2FwLiBUaGUgY29yZSBjaGFuZ2UgaXMgaW4gYHpzd2FwX2xvYWQoKWAuIEl0IGFwcGVhcnMgd2UmIzM5O3JlIHJlZmluaW5nIGl0cyBiZWhhdmlvciB3aXRoIGxhcmdlIGZvbGlvcy4gVGhlIGV4aXN0aW5nIGNvZGUgd2FybmVkIGFuZCByZXR1cm5lZCBgLUVJTlZBTGAuIFRoZSBuZXcgY29kZSBpbnRyb2R1Y2VzIGB6c3dhcF9pc19wcmVzZW50KClgIGFuZCBjaGFuZ2VzIHRoZSByZXR1cm4gdmFsdWVzIGFuZCB3YXJuaW5nLiBTcGVjaWZpY2FsbHksIGl0IG5vdyBjaGVja3MgaWYgKmFueSogcGFydCBvZiB0aGUgbGFyZ2UgZm9saW8gaXMgcHJlc2VudCBpbiB6c3dhcCB1c2luZyBhIG5ldyBoZWxwZXIgZnVuY3Rpb24sIGB6c3dhcF9pc19wcmVzZW50KClgLiBJZiBldmVuIGEgcGFydCBpcyBwcmVzZW50LCB0aGVuIGl0IHdhcm5zIGFuZCByZXR1cm5zIGAtRUlPYC4gSG93ZXZlciwgaWYgdGhlIGxhcmdlIGZvbGlvIGlzbiYjMzk7dCBwcmVzZW50IGluIHpzd2FwIGF0IGFsbCwgaXQmIzM5O2xsIHJldHVybiBgLUVOT0VOVGAgYWxsb3dpbmcgdGhlIHN3YXAgZGV2aWNlIHRvIHRha2Ugb3Zlci4KCk15IG5leHQgdGhvdWdodCBpcyByZWFjaGFiaWxpdHkgYW5kIGZ1enppbmcuIElzIHRoaXMgY2hhbmdlIHNvbWV0aGluZyB3ZSBjYW4gYWN0dWFsbHkgaGl0IGFuZCBpcyBpdCB3b3J0aCB0aGUgZWZmb3J0IG9mIGZ1enppbmc/IEl0JiMzOTtzIGNsZWFybHkgcmVhY2hhYmxlIGluIHN0YW5kYXJkIGtlcm5lbCBjb25maWd1cmF0aW9ucyB3aXRoIHN3YXAgYW5kIHpzd2FwIGVuYWJsZWQsIGVzcGVjaWFsbHkgd2l0aCB0aG9zZSBsYXJnZSBmb2xpbyBzd2FwLWlucyAobVRIUCwgc3dhcGNhY2hlKS4gV2UgaGF2ZSBsb2dpYyBjaGFuZ2VzIGluIG1lbW9yeSBtYW5hZ2VtZW50LCBzbyBhY2NvcmRpbmcgdG8gbXkgY3JpdGVyaWEsIGl0JiMzOTtzIHdvcnRoIGludmVzdGlnYXRpbmcuCgpOb3csIEkgbmVlZCB0byBjaG9vc2UgdGhlIGZvY3VzIHN5bWJvbHMgZm9yIGZ1enppbmcuIGB6c3dhcF9sb2FkYCBpcyBkaXJlY3RseSBpbXBhY3RlZCwgYW5kIGBzd2FwX3JlYWRfZm9saW9gIGJlY29tZXMgaW50ZXJlc3RpbmcgYmVjYXVzZSBpdCBtaWdodCBpbnRlcmFjdCBub3cgaW4gY2FzZXMgd2hlcmUgYC1FTk9FTlRgIGlzIHJldHVybmVkLiBTaW5jZSBgenN3YXBfbG9hZGAgaXMgenN3YXAgc3BlY2lmaWMsIGl0IHdvdWxkbiYjMzk7dCBiZSB1bml2ZXJzYWxseSB1c2VmdWwuIEJ1dCBtYXliZSBgc3dhcF9yZWFkX2ZvbGlvYCBpcyBhbiBpbnRlcmVzdGluZyBjYW5kaWRhdGUgZm9yIGNhbGxpbmcuIEkmIzM5O2xsIG5lZWQgdG8gY2hlY2sgdGhlIGNhbGwgaGllcmFyY2h5LgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEyLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNyAyMDozNzwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtzd2FwX3JlYWRfZm9saW8mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bW0vbWVtb3J5LmM9NDc1MD1zdGF0aWMgYm9vbCBjYW5fc3dhcGluX3RocChzdHJ1Y3Qgdm1fZmF1bHQgKnZtZiwgcHRlX3QgKnB0ZXAsIGludCBucl9wYWdlcylcbi0tXG5tbS9tZW1vcnkuYy00NzYyLVx0Lypcbm1tL21lbW9yeS5jOjQ3NjM6XHQgKiBzd2FwX3JlYWRfZm9saW8oKSBjYW4mIzM5O3QgaGFuZGxlIHRoZSBjYXNlIGEgbGFyZ2UgZm9saW8gaXMgaHlicmlkbHlcbm1tL21lbW9yeS5jLTQ3NjQtXHQgKiBmcm9tIGRpZmZlcmVudCBiYWNrZW5kcy4gQW5kIHRoZXkgYXJlIGxpa2VseSBjb3JuZXIgY2FzZXMuIFNpbWlsYXJcbi0tXG5tbS9wYWdlX2lvLmM9Mzk3PXN0YXRpYyBpbnQgc3dhcF96ZXJvbWFwX2JhdGNoKHN3cF9lbnRyeV90IGVudHJ5LCBpbnQgbWF4X25yLFxuLS1cbm1tL3BhZ2VfaW8uYy00MTgtXG5tbS9wYWdlX2lvLmM6NDE5OnN0YXRpYyBib29sIHN3YXBfcmVhZF9mb2xpb196ZXJvbWFwKHN0cnVjdCBmb2xpbyAqZm9saW8pXG5tbS9wYWdlX2lvLmMtNDIwLXtcbi0tXG5tbS9wYWdlX2lvLmMtNDUxLVxubW0vcGFnZV9pby5jOjQ1Mjp2b2lkIHN3YXBfcmVhZF9mb2xpbyhzdHJ1Y3Qgc3dhcF9pb19jdHggKmN0eCwgc3RydWN0IGZvbGlvICpmb2xpbylcbm1tL3BhZ2VfaW8uYy00NTMte1xuLS1cbm1tL3BhZ2VfaW8uYy00NzQtXG5tbS9wYWdlX2lvLmM6NDc1Olx0aWYgKHN3YXBfcmVhZF9mb2xpb196ZXJvbWFwKGZvbGlvKSkge1xubW0vcGFnZV9pby5jLTQ3Ni1cdFx0Zm9saW9fdW5sb2NrKGZvbGlvKTtcbi0tXG5tbS9zd2FwLmg9MjU2PWludCBzaW9fcG9vbF9pbml0KHZvaWQpO1xubW0vc3dhcC5oOjI1Nzp2b2lkIHN3YXBfcmVhZF9mb2xpbyhzdHJ1Y3Qgc3dhcF9pb19jdHggKmN0eCwgc3RydWN0IGZvbGlvICpmb2xpbyk7XG5tbS9zd2FwLmgtMjU4LXZvaWQgc3dhcF9yZWFkX3N1Ym1pdChzdHJ1Y3Qgc3dhcF9pb19jdHggKmN0eCk7XG4tLVxubW0vc3dhcC5oPTM3NT1zdGF0aWMgaW5saW5lIHZvaWQgZm9saW9fcHV0X3N3YXAoc3RydWN0IGZvbGlvICpmb2xpbywgc3RydWN0IHBhZ2UgKnBhZ2UpXG4tLVxubW0vc3dhcC5oLTM3OC1cbm1tL3N3YXAuaDozNzk6c3RhdGljIGlubGluZSB2b2lkIHN3YXBfcmVhZF9mb2xpbyhzdHJ1Y3Qgc3dhcF9pb19jdHggKmN0eCwgc3RydWN0IGZvbGlvICpmb2xpbylcbm1tL3N3YXAuaC0zODAte1xuLS1cbm1tL3N3YXBfc3RhdGUuYz02NDI9c3RhdGljIHN0cnVjdCBmb2xpbyAqc3dhcF9jYWNoZV9yZWFkX2ZvbGlvKHN0cnVjdCBzd2FwX2lvX2N0eCAqY3R4LFxuLS1cbm1tL3N3YXBfc3RhdGUuYy02NTctXG5tbS9zd2FwX3N0YXRlLmM6NjU4Olx0c3dhcF9yZWFkX2ZvbGlvKGN0eCwgZm9saW8pO1xubW0vc3dhcF9zdGF0ZS5jLTY1OS1cdGlmIChyZWFkYWhlYWQpIHtcbi0tXG5tbS9zd2FwX3N0YXRlLmM9NjgzPXN0cnVjdCBmb2xpbyAqc3dhcGluX3N5bmMoc3dwX2VudHJ5X3QgZW50cnksIGdmcF90IGdmcCwgdW5zaWduZWQgbG9uZyBvcmRlcnMsXG4tLVxubW0vc3dhcF9zdGF0ZS5jLTY5OC1cbm1tL3N3YXBfc3RhdGUuYzo2OTk6XHRzd2FwX3JlYWRfZm9saW8oXHUwMDI2Y3R4LCBmb2xpbyk7XG5tbS9zd2FwX3N0YXRlLmMtNzAwLVx0c3dhcF9yZWFkX3N1Ym1pdChcdTAwMjZjdHgpO1xuLS1cbm1tL3N3YXBmaWxlLmM9MjkyNj1FWFBPUlRfU1lNQk9MX0dQTChhZGRfc3dhcF9leHRlbnQpO1xuLS1cbm1tL3N3YXBmaWxlLmMtMjkzMC0gKiBvbnRvIGEgY29udGlndW91cyByYW5nZSBvZiBkaXNrIGJsb2Nrcy4gIEEgcmJ0cmVlIG9mIHN3YXAgZXh0ZW50cyBpc1xubW0vc3dhcGZpbGUuYzoyOTMxOiAqIGJ1aWx0IGF0IHN3YXBvbiB0aW1lIGFuZCBpcyB0aGVuIHVzZWQgYXQgc3dhcF93cml0ZXBhZ2Uvc3dhcF9yZWFkX2ZvbGlvXG5tbS9zd2FwZmlsZS5jLTI5MzItICogdGltZSBmb3IgbG9jYXRpbmcgd2hlcmUgb24gZGlzayBhIHBhZ2UgYmVsb25ncy5cbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMy8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDcgMjA6Mzc8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogOTg4NgoJCQkJCQkJb3V0cHV0OiAxMTQKCQkJCQkJCXRob3VnaHRzOiAzOTIKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqTXkgQXNzZXNzbWVudCBvZiB0aGUgWnN3YXAgUGF0Y2gqKgoKT2theSwgbGV0JiMzOTtzIGJyZWFrIHRoaXMgZG93bi4gRmlyc3QsIEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoZSBzY29wZSBvZiB0aGVzZSBjaGFuZ2VzLiBJJiMzOTttIHN0YXJ0aW5nIGJ5IHRyYWNpbmcgdGhlIGtleSBmdW5jdGlvbiBjYWxscywgbGlrZSBgenN3YXBfbG9hZGAsIGB6c3dhcF9zdG9yZWAsIGFuZCBgenN3YXBfaXNfcHJlc2VudGAgdG8gc2VlIHdoZXJlIHRoZXkmIzM5O3JlIGRlZmluZWQgYW5kIGhvdyB0aGV5JiMzOTtyZSB1c2VkLiBJJiMzOTt2ZSBjb25maXJtZWQgdGhhdCBgenN3YXBfbG9hZGAgaXMgbm9uLXN0YXRpYyBhbmQgaW4gYG1tL3pzd2FwLmNgLCB3aGljaCBpcyBpbXBvcnRhbnQgZm9yIHVuZGVyc3RhbmRpbmcgaXRzIHBvdGVudGlhbCBpbXBhY3QuIEkgYWxzbyBjaGVja2VkIGB6c3dhcF9zdG9yZWAgKGFsc28gaW4gYG1tL3pzd2FwLmNgKSwgYW5kIGB6c3dhcF9pc19wcmVzZW50YCAoc3RhdGljIGluIHRoZSBzYW1lIGZpbGUpLiBUaGVuIEkgd2VudCBvbiB0byB2ZXJpZnkgdGhlIHByZXNlbmNlIG9mIGBzd2FwX3JlYWRfZm9saW9gLCBhbmQgYHN3YXBfY2FjaGVfcmVhZF9mb2xpb2AsIGFuZCBgc3dhcGluX3N5bmNgLCBhbmQgdGhlaXIgcmVsYXRpb25zaGlwIHdpdGggdGhlIGtleSBmdW5jdGlvbnMuCgpOZXh0LCBJIG5lZWRlZCB0byBjb25maXJtIHRoZSBjb25maWd1cmF0aW9uIGRlcGVuZGVuY2llcy4gWnN3YXAgb2J2aW91c2x5IGhpbmdlcyBvbiBgQ09ORklHX1NXQVBgLCBhbmQgc3BlY2lmaWNhbGx5LCBgQ09ORklHX1pTV0FQYC4gSSBkb3VibGUtY2hlY2tlZCBgbW0vS2NvbmZpZ2AgdG8gYmUgYWJzb2x1dGVseSBzdXJlOyB5ZXMsIGBaU1dBUGAgKmRlcGVuZHMqIG9uIGBTV0FQYCwgKnNlbGVjdHMqIGBDUllQVE9gIGFuZCBgWlNNQUxMT0NgLCB3aGljaCBhbGlnbnMgd2l0aCBteSB1bmRlcnN0YW5kaW5nIG9mIGhvdyBjb21wcmVzc2VkIHN3YXAgb3BlcmF0ZXMuIEkgYWxzbyBub3RlZCBgQ09ORklHX1pTV0FQX0RFRkFVTFRfT05gIGFzIGEgcG9zc2libGUgY29udmVuaWVuY2Ugb3B0aW9uLCBidXQgbm90IGVzc2VudGlhbC4KCk5vdywgdG8gc29saWRpZnkgbXkgdW5kZXJzdGFuZGluZywgSSYjMzk7dmUgdmVyaWZpZWQgdGhlICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IGB6c3dhcF9sb2FkYCBhbmQgYHN3YXBfcmVhZF9mb2xpb2AuIFRoZXNlIGFyZSBjbGVhcmx5IHRoZSBjb3JlIG1vZGlmaWNhdGlvbnMgYmVpbmcgbWFkZSB0byBtZW1vcnkgbWFuYWdlbWVudC4KCkZpbmFsbHksIEkmIzM5O3ZlIHJldmlld2VkIHRoZSByZWFzb25pbmcgYmVoaW5kIHRoZSBwYXRjaDogVGhlIHBhdGNoIG1vZGlmaWVzIGB6c3dhcF9sb2FkKClgIGFuZCBhZGRzIGB6c3dhcF9pc19wcmVzZW50KClgIGluIGBtbS96c3dhcC5jYCwgd2hpY2ggaXMgY2VudHJhbCB0byB0aGUgY29yZSBtZW1vcnkgbWFuYWdlbWVudCBzd2FwLWluIGxvZ2ljIGFuZCBpbnRyb2R1Y2VzIG5ldyBhc3NlcnRpb24vY2hlY2tpbmcgYmVoYXZpb3Igd2hpY2ggbWF5IGJlIHJlYWNoZWQgaW4gdmlydHVhbGl6ZWQgZW52aXJvbm1lbnRzLiBUaGlzIGlzIGEgY3JpdGljYWwgY2hhbmdlIGJlY2F1c2UgaXQgY2hhbmdlcyBob3cgbGFyZ2UgZm9saW9zIGFyZSBoYW5kbGVkIGluIHpzd2FwLiBUaGlzIGNvdWxkIHBvdGVudGlhbGx5IGxlYWQgdG8gbmV3IGFuZCBpbnRlcmVzdGluZyBlZGdlIGNhc2VzIGFuZCB2dWxuZXJhYmlsaXRpZXMsIHNvIGl0JiMzOTtzIHNvbWV0aGluZyB0aGF0ICphYnNvbHV0ZWx5KiBuZWVkcyBmdXp6aW5nIGFuZCB0aG9yb3VnaCB0ZXN0aW5nLgoKVGhpcyBhbGwgY2hlY2tzIG91dDsgYWxsIHJlcXVpcmVtZW50cyBoYXZlIGJlZW4gbWV0IGFuZCB0aGUgaW1wbGljYXRpb25zIGFyZSBjbGVhci4gSSYjMzk7bSByZWFkeSB0byBgc2V0LXJlc3VsdHNgLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE0LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNyAyMDozNzwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnNldC1yZXN1bHRzPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7U1dBUCYjMzQ7LAogICAgJiMzNDtaU1dBUCYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O3pzd2FwX2xvYWQmIzM0OywKICAgICYjMzQ7c3dhcF9yZWFkX2ZvbGlvJiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIG1vZGlmaWVzIG1lbW9yeSBtYW5hZ2VtZW50IGxvZ2ljIGluIG1tL3pzd2FwLmMgYnkgaW50cm9kdWNpbmcgenN3YXBfaXNfcHJlc2VudCgpIGFuZCB1cGRhdGluZyB6c3dhcF9sb2FkKCkgdG8gaW5zcGVjdCBsYXJnZSBmb2xpb3MgaW5zdGVhZCBvZiB1bmNvbmRpdGlvbmFsbHkgcmVqZWN0aW5nIHRoZW0uIFRoaXMgY2hhbmdlcyBjb3JlIHN3YXAtaW4gaGFuZGxpbmcgYW5kIGFzc2VydGlvbnMgaW4gcmVhY2hhYmxlIG1tIGNvZGUsIHdhcnJhbnRpbmcgZnV6emluZy4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7U1dBUCYjMzQ7LAogICAgJiMzNDtaU1dBUCYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O3pzd2FwX2xvYWQmIzM0OywKICAgICYjMzQ7c3dhcF9yZWFkX2ZvbGlvJiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIG1vZGlmaWVzIG1lbW9yeSBtYW5hZ2VtZW50IGxvZ2ljIGluIG1tL3pzd2FwLmMgYnkgaW50cm9kdWNpbmcgenN3YXBfaXNfcHJlc2VudCgpIGFuZCB1cGRhdGluZyB6c3dhcF9sb2FkKCkgdG8gaW5zcGVjdCBsYXJnZSBmb2xpb3MgaW5zdGVhZCBvZiB1bmNvbmRpdGlvbmFsbHkgcmVqZWN0aW5nIHRoZW0uIFRoaXMgY2hhbmdlcyBjb3JlIHN3YXAtaW4gaGFuZGxpbmcgYW5kIGFzc2VydGlvbnMgaW4gcmVhY2hhYmxlIG1tIGNvZGUsIHdhcnJhbnRpbmcgZnV6emluZy4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNS8xPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDcgMjA6Mzc8L3RkPgoJCQk8dGQ+YWN0aW9uPC90ZD4KCQkJPHRkPklmPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE2LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNyAyMDozNzwvdGQ+CgkJCTx0ZD5hZ2VudDwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5jb3JlPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0tNU0FOUmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIG1vZGlmaWVzIGB6c3dhcF9sb2FkKClgIHRvIHN1cHBvcnQgY2hlY2tpbmcgd2hldGhlciBsYXJnZSBmb2xpb3MgaGF2ZSBlbnRyaWVzIGluIHpzd2FwIHZpYSBgenN3YXBfaXNfcHJlc2VudCgpYC4gSWYgbm8gZW50cmllcyBpbiB0aGUgcmFuZ2UgYXJlIGNhY2hlZCBpbiB6c3dhcCwgaXQgcmV0dXJucyBgLUVOT0VOVGAgc28gdGhlIGJhY2tpbmcgc3dhcCBkZXZpY2UgY2FuIHJlYWQgdGhlIGVudGlyZSBsYXJnZSBmb2xpbyBpbnN0ZWFkIG9mIHVuY29uZGl0aW9uYWxseSBmYWlsaW5nIHdpdGggYC1FSU5WQUxgLlxuXG5BbGwgdmFyaWFibGVzIHVzZWQgaW4gdGhlIG5ld2x5IGludHJvZHVjZWQgYHpzd2FwX2lzX3ByZXNlbnQoKWAgZnVuY3Rpb24gKGBvZmZzZXRgLCBgdHJlZWAsIGBpbmRleGApIGFyZSBmdWxseSBpbml0aWFsaXplZCBzY2FsYXIgYW5kIHBvaW50ZXIgdmFsdWVzLiBUaGUgcGF0Y2ggZG9lcyBub3QgYWxsb2NhdGUgbmV3IHN0cnVjdHVyZXMsIGNvcHkgdW5pbml0aWFsaXplZCBtZW1vcnkgdG8gdXNlciBzcGFjZSwgYnJhbmNoIG9uIHVuaW5pdGlhbGl6ZWQgdmFsdWVzLCBvciBhbHRlciBidWZmZXIgbGVuZ3RocyBpbiBhIHdheSB0aGF0IHdvdWxkIGxlYXZlIHVuaW5pdGlhbGl6ZWQga2VybmVsIG1lbW9yeSBleHBvc2VkLiBBbnkgcG90ZW50aWFsIHBhZ2UvZm9saW8gc3RhdGUgaXNzdWVzIG9yIG91dC1vZi1ib3VuZHMgaW5kZXggaXNzdWVzIGFyZSBhZGVxdWF0ZWx5IGNvdmVyZWQgYnkgc3RhbmRhcmQgYXNzZXJ0aW9ucyBhbmQgS0FTQU4uIFRoZXJlZm9yZSwgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGlzIG5vdCByZXF1aXJlZC4mIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+SW5zdHJ1Y3Rpb246PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Zb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgc2VjdXJpdHkgZW5naW5lZXIgc3BlY2lhbGl6aW5nIGluIGtlcm5lbCBtZW1vcnkKZXJyb3IgZGV0ZWN0b3JzIChLQVNBTiBhbmQgS01TQU4pLiBZb3VyIGpvYiBpcyB0byByZXZpZXcgdGhlIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQKZGV0ZXJtaW5lIGlmIHRoZSBjb2RlIGNoYW5nZXMganVzdGlmeSBzcGF3bmluZyBhIGRlZGljYXRlZCBLTVNBTiAoS2VybmVsTWVtb3J5U2FuaXRpemVyKQpmdXp6aW5nIHNlc3Npb24gaW4gYWRkaXRpb24gdG8gc3RhbmRhcmQgS0FTQU4gZnV6emluZy4KCkNSSVRJQ0FMIERJU1RJTkNUSU9OIEJFVFdFRU4gS0FTQU4gQU5EIEtNU0FOOgotIFN0YW5kYXJkIEtBU0FOIGtlcm5lbCBidWlsZHMgKHVwc3RyZWFtLWFwcGFybW9yLWthc2FuLmNvbmZpZykgYWxyZWFkeSBlbmFibGUKICBhIGNvbXByZWhlbnNpdmUgc3VpdGUgb2YgZGVidWdnaW5nIHRvb2xzIGFuZCBzYW5pdGl6ZXJzLCBpbmNsdWRpbmcgS0FTQU4KICAob3V0LW9mLWJvdW5kcyBhY2Nlc3NlcywgdXNlLWFmdGVyLWZyZWUsIGRvdWJsZSBmcmVlLCBpbnZhbGlkIGZyZWUpLCBMT0NLREVQCiAgKGxvY2tpbmcgYnVncyBhbmQgZGVhZGxvY2tzKSwgVUItc2FuaXRpemVycywgYW5kIG1lbW9yeSBjb3JydXB0aW9uIGNoZWNrcy4KLSBLTVNBTiAoS2VybmVsTWVtb3J5U2FuaXRpemVyKSBkZXRlY3RzIHJlYWRzIG9mIFVOSU5JVElBTElaRUQgbWVtb3J5IChzdGFjaywgaGVhcCwKICBvciBwYWdlIGFsbG9jYXRpb25zKSBhbmQga2VybmVsLXRvLXVzZXIgbWVtb3J5IGluZm8tbGVha3MuCgpSdWxlOiBUSEVSRSBJUyBOTyBTRU5TRSBJTiBSVU5OSU5HIEEgS01TQU4gU0VTU0lPTiBJRiBBIEJVRyBDQU4gQkUgQ0FVR0hUIEJZIEtBU0FOLApMT0NLREVQLCBPUiBPVEhFUiBTVEFOREFSRCBCVUcgREVURUNUT1JTLgpBIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaW5jdXJzIHNpZ25pZmljYW50IHJlc291cmNlIGNvc3RzLiBZb3UgbXVzdCBPTkxZCnNldCBOZWVkc0tNU0FOPXRydWUgaWYgdGhlIGNvZGUgY2hhbmdlcyBpbnRyb2R1Y2Ugb3IgZXhwb3NlIFVOSU5JVElBTElaRUQgTUVNT1JZIHJpc2tzCnRoYXQgYXJlIGRldGVjdGVkIE9OTFkgYnkgS01TQU4uCgpMb29rIGhvbGlzdGljYWxseSBhdCB0aGUgcGF0Y2ggc2VyaWVzIGFuZCBzdXJyb3VuZGluZyBjb2RlLiBFdmVuIGlmIG5vIGRpcmVjdAp1bmluaXRpYWxpemVkIGZpZWxkIGFjY2Vzc2VzIG9yIG5ldyBidWZmZXIgYWxsb2NhdGlvbnMgYXJlIGFkZGVkIGluIHRoZSBkaWZmIGl0c2VsZiwKYSBwYXRjaCBtYXkgYWx0ZXIgY29udHJvbCBmbG93LCBib3VuZHMgY2hlY2tpbmcsIG9yIGRhdGEgbGVuZ3RoIGNhbGN1bGF0aW9ucyBpbiB3YXlzCnRoYXQgY2hhbmdlIGhvdyB0aGUgcmVzdCBvZiB0aGUgY29kZSBvcGVyYXRlcyBvbiBleGlzdGluZyBidWZmZXJzIChlLmcuIGFsbG93aW5nCnVuaW5pdGlhbGl6ZWQgc3RhY2svaGVhcCBtZW1vcnkgdG8gYmUgcmVhZCwgY29waWVkIHRvIHVzZXIgc3BhY2UsIG9yIHVzZWQgaW4gY29udHJvbApmbG93KS4gRG8gbm90IGhlc2l0YXRlIHRvIHVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUsCmNhbGxlZCBmdW5jdGlvbnMsIGFuZCBjYWxsZXJzLgoKU2V0IE5lZWRzS01TQU49dHJ1ZSBPTkxZIElGIHRoZSBwYXRjaCBpbnRyb2R1Y2VzIG9yIG1vZGlmaWVzOgoxLiBLZXJuZWwgc3RydWN0dXJlcyBzZW50IHRvIHVzZXIgc3BhY2UgKHZpYSBjb3B5X3RvX3VzZXIsIHB1dF91c2VyLCBuZXRsaW5rIHNrYgogICBhdHRyaWJ1dGVzLCBpb2N0bCBvdXRwdXQgYXJndW1lbnRzLCBzb2NrZXQgb3B0aW9ucywgb3IgQlBGIGJ1ZmZlcnMpIHdoZXJlIGZpZWxkcwogICBvciBzdHJ1Y3R1cmUgcGFkZGluZyBtaWdodCBub3QgYmUgZnVsbHkgaW5pdGlhbGl6ZWQvemVyb2VkLgoyLiBDb25kaXRpb25hbCBsb2dpYyBvciBicmFuY2hpbmcgdGhhdCBkZXBlbmRzIG9uIHBvdGVudGlhbGx5IHVuaW5pdGlhbGl6ZWQgdmFyaWFibGVzCiAgIG9yIHN0cnVjdCBmaWVsZHMuCjMuIEFsbG9jYXRpb24gb3IgaW5pdGlhbGl6YXRpb24gb2YgY29tcGxleCBkYXRhIHN0cnVjdHVyZXMgd2hlcmUgdW5pbml0aWFsaXplZCBmaWVsZHMKICAgY291bGQgYmUgcmVhZCBsYXRlciBpbiByZWFjaGFibGUgY29kZSBwYXRocy4KNC4gQm91bmRzIGNoZWNrcywgbGVuZ3Rocywgb3IgbG9naWMgaW4gYSB3YXkgdGhhdCBhbGxvd3Mgc3Vycm91bmRpbmcgY29kZSB0byBhY2Nlc3MKICAgdW5pbml0aWFsaXplZCBieXRlcyBvZiBleGlzdGluZyBidWZmZXJzLgoKU2V0IE5lZWRzS01TQU49ZmFsc2UgSUY6Ci0gVGhlIGNvZGUgY2hhbmdlcyBwcmltYXJpbHkgcmlzayBvdXQtb2YtYm91bmRzIGFjY2VzcywgYXJyYXkgb3ZlcmZsb3dzLCBOVUxMIHBvaW50ZXIKICBkZXJlZmVyZW5jZXMsIGxvY2tpbmcgZGVhZGxvY2tzLCBvciB1c2UtYWZ0ZXItZnJlZSBidWdzICh0aGVzZSBhcmUgYWxyZWFkeSBjYXVnaHQKICBieSBLQVNBTiwgTE9DS0RFUCwgb3Igc3RhbmRhcmQgYnVnIGRldGVjdG9ycykuCi0gQWxsIHN0YWNrL2hlYXAgc3RydWN0dXJlcyB0b3VjaGVkIG9yIGludHJvZHVjZWQgYnkgdGhlIHBhdGNoIGFyZSBmdWxseSB6ZXJvZWQKICBvciBpbml0aWFsaXplZCAoZS5nLiB1c2luZyA9IHswfSwgbWVtc2V0LCBremFsbG9jKSBiZWZvcmUgYmVpbmcgcmVhZCBvciBjb3BpZWQuCi0gVGhlIHBhdGNoIGRvZXMgbm90IGludHJvZHVjZSBhbnkgcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSB1c2FnZSBvciBpbmZvLWxlYWtzLgoKVXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gaW5zcGVjdCB0aGUgc3Vycm91bmRpbmcgY29kZSBpZiBuZWNlc3NhcnksIHRoZW4gcHJvdmlkZQpkZXRhaWxlZCBLTVNBTlJlYXNvbmluZyBjb250cmFzdGluZyBLQVNBTiB2cyBLTVNBTiBhcHBsaWNhYmlsaXR5IGZvciB0aGlzIHBhdGNoLgpQcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy4KCgpVc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLgpJdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS4KSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlByb21wdDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPlRhcmdldCBhcmNoaXRlY3R1cmU6IGFtZDY0CgpGb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczoKY29tbWl0IDBhY2UyZGIzNTFhZDBhN2VkYjkwYTZjYTA0OTM1NzQ4YmJjNzJmZDEKQXV0aG9yOiBzeXotY2x1c3RlciAmbHQ7dHJpYWdlQHN5emthbGxlci5jb20mZ3Q7CkRhdGU6ICAgTW9uIFNlcCA3IDIwOjM3OjA5IDIwMjYgJiM0MzswMDAwCgogICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3CgpkaWZmIC0tZ2l0IGEvbW0venN3YXAuYyBiL21tL3pzd2FwLmMKaW5kZXggMzdmMzRlNDA2YzhlMy4uZmQzNmFjMzhlOWExZSAxMDA2NDQKLS0tIGEvbW0venN3YXAuYwomIzQzOyYjNDM7JiM0MzsgYi9tbS96c3dhcC5jCkBAIC0xNTcxLDYgJiM0MzsxNTcxLDMyIEBAIGJvb2wgenN3YXBfc3RvcmUoc3RydWN0IGZvbGlvICpmb2xpbykKIAlyZXR1cm4gcmV0OwogfQogCiYjNDM7LyoqCiYjNDM7ICogenN3YXBfaXNfcHJlc2VudCgpIC0gaXMgYW55IHNsb3QgaW4gW2VudHJ5LCBlbnRyeSAmIzQzOyBucikgaW4genN3YXA/CiYjNDM7ICogQGVudHJ5OiBiYXNlIHN3YXAgZW50cnkgb2YgdGhlIHJhbmdlCiYjNDM7ICogQG5yOiBudW1iZXIgb2YgY29udGlndW91cyBzbG90cyB0byBjaGVjawomIzQzOyAqCiYjNDM7ICogQ29udGV4dDogVGhlIGNhbGxlciBtdXN0IGtlZXAgdGhlIHJhbmdlIHBpbm5lZCwgb3RoZXJ3aXNlIHRoZSBhbnN3ZXIgY2FuCiYjNDM7ICogY2hhbmdlIHVuZGVyIGl0LgomIzQzOyAqIFJldHVybjogdHJ1ZSBpZiBhdCBsZWFzdCBvbmUgc2xvdCBpbiB0aGUgcmFuZ2UgaXMgaW4genN3YXAuCiYjNDM7ICovCiYjNDM7c3RhdGljIGJvb2wgenN3YXBfaXNfcHJlc2VudChzd3BfZW50cnlfdCBlbnRyeSwgdW5zaWduZWQgaW50IG5yKQomIzQzO3sKJiM0MzsJcGdvZmZfdCBvZmZzZXQgPSBzd3Bfb2Zmc2V0KGVudHJ5KTsKJiM0MzsJc3RydWN0IHhhcnJheSAqdHJlZSA9IHN3YXBfenN3YXBfdHJlZShlbnRyeSk7CiYjNDM7CXVuc2lnbmVkIGxvbmcgaW5kZXggPSBvZmZzZXQ7CiYjNDM7CiYjNDM7CS8qCiYjNDM7CSAqIEEgcGlubmVkIHJhbmdlIGlzIGF0IG1vc3QgU1dBUEZJTEVfQ0xVU1RFUiBzbG90cyBhbmQgaXMgYWxpZ25lZCB0bwomIzQzOwkgKiBpdHMgb3duIHNpemUsIHNvIG9uZSB0cmVlIGNvdmVycyBhbGwgb2YgaXQgYW5kIGEgc2luZ2xlIGxvb2t1cCBpcwomIzQzOwkgKiBlbm91Z2guIFNjYW5uaW5nIG9ubHkgcGFydCBvZiB0aGUgcmFuZ2Ugd291bGQgcmVwb3J0IGEgZmFsc2UKJiM0MzsJICogJiMzNDthYnNlbnQmIzM0OyBhbmQgbGV0IHRoZSBjYWxsZXIgcmVhZCBhIHN0YWxlIGNvcHkgZnJvbSB0aGUgZGV2aWNlLgomIzQzOwkgKi8KJiM0MzsJQlVJTERfQlVHX09OKFNXQVBGSUxFX0NMVVNURVIgJmd0OyBaU1dBUF9BRERSRVNTX1NQQUNFX1BBR0VTKTsKJiM0MzsKJiM0MzsJcmV0dXJuIHhhX2ZpbmQodHJlZSwgJmFtcDtpbmRleCwgb2Zmc2V0ICYjNDM7IG5yIC0gMSwgWEFfUFJFU0VOVCk7CiYjNDM7fQomIzQzOwogLyoqCiAgKiB6c3dhcF9sb2FkKCkgLSBsb2FkIGEgZm9saW8gZnJvbSB6c3dhcAogICogQGZvbGlvOiBmb2xpbyB0byBsb2FkCkBAIC0xNTc4LDE1ICYjNDM7MTYwNCwxMiBAQCBib29sIHpzd2FwX3N0b3JlKHN0cnVjdCBmb2xpbyAqZm9saW8pCiAgKiBSZXR1cm46IDAgb24gc3VjY2Vzcywgd2l0aCB0aGUgZm9saW8gdW5sb2NrZWQgYW5kIG1hcmtlZCB1cC10by1kYXRlLCBvciBvbmUKICAqIG9mIHRoZSBmb2xsb3dpbmcgZXJyb3IgY29kZXM6CiAgKgotICogIC1FSU86IGlmIHRoZSBzd2FwcGVkIG91dCBjb250ZW50IHdhcyBpbiB6c3dhcCwgYnV0IGNvdWxkIG5vdCBiZSBsb2FkZWQKLSAqICBpbnRvIHRoZSBwYWdlIGR1ZSB0byBhIGRlY29tcHJlc3Npb24gZmFpbHVyZS4gVGhlIGZvbGlvIGlzIHVubG9ja2VkLCBidXQKLSAqICBOT1QgbWFya2VkIHVwLXRvLWRhdGUsIHNvIHRoYXQgYW4gSU8gZXJyb3IgaXMgZW1pdHRlZCAoZS5nLiBkb19zd2FwX3BhZ2UoKQotICogIHdpbGwgU0lHQlVTKS4KLSAqCi0gKiAgLUVJTlZBTDogaWYgdGhlIHN3YXBwZWQgb3V0IGNvbnRlbnQgd2FzIGluIHpzd2FwLCBidXQgdGhlIHBhZ2UgYmVsb25ncwotICogIHRvIGEgbGFyZ2UgZm9saW8sIHdoaWNoIGlzIG5vdCBzdXBwb3J0ZWQgYnkgenN3YXAuIFRoZSBmb2xpbyBpcyB1bmxvY2tlZCwKLSAqICBidXQgTk9UIG1hcmtlZCB1cC10by1kYXRlLCBzbyB0aGF0IGFuIElPIGVycm9yIGlzIGVtaXR0ZWQgKGUuZy4KLSAqICBkb19zd2FwX3BhZ2UoKSB3aWxsIFNJR0JVUykuCiYjNDM7ICogIC1FSU86IGlmIHRoZSBzd2FwcGVkIG91dCBjb250ZW50IHdhcyBpbiB6c3dhcCBidXQgY291bGQgbm90IGJlIGhhbmRlZAomIzQzOyAqICBiYWNrLCBlaXRoZXIgYmVjYXVzZSBkZWNvbXByZXNzaW9uIGZhaWxlZCBvciBiZWNhdXNlIGEgc2xvdCBpbiBhCiYjNDM7ICogIGxhcmdlLWZvbGlvIHJhbmdlIGlzIHN0aWxsIGluIHpzd2FwIGFuZCB6c3dhcCBjYW5ub3QgcmVjb25zdHJ1Y3QgYSBsYXJnZQomIzQzOyAqICBmb2xpbyBmcm9tIHBlci1wYWdlIGVudHJpZXMuIFRoZSBmb2xpbyBpcyB1bmxvY2tlZCwgYnV0IE5PVCBtYXJrZWQKJiM0MzsgKiAgdXAtdG8tZGF0ZSwgc28gdGhhdCBhbiBJTyBlcnJvciBpcyBlbWl0dGVkIChlLmcuIGRvX3N3YXBfcGFnZSgpIHdpbGwKJiM0MzsgKiAgU0lHQlVTKS4KICAqCiAgKiAgLUVOT0VOVDogaWYgdGhlIHN3YXBwZWQgb3V0IGNvbnRlbnQgd2FzIG5vdCBpbiB6c3dhcC4gVGhlIGZvbGlvIHJlbWFpbnMKICAqICBsb2NrZWQgb24gcmV0dXJuLgpAQCAtMTYwNSwxMyAmIzQzOzE2MjgsMTggQEAgaW50IHpzd2FwX2xvYWQoc3RydWN0IGZvbGlvICpmb2xpbykKIAkJcmV0dXJuIC1FTk9FTlQ7CiAKIAkvKgotCSAqIExhcmdlIGZvbGlvcyBzaG91bGQgbm90IGJlIHN3YXBwZWQgaW4gd2hpbGUgenN3YXAgaXMgYmVpbmcgdXNlZCwgYXMKLQkgKiB0aGV5IGFyZSBub3QgcHJvcGVybHkgaGFuZGxlZC4gWnN3YXAgZG9lcyBub3QgcHJvcGVybHkgbG9hZCBsYXJnZQotCSAqIGZvbGlvcywgYW5kIGEgbGFyZ2UgZm9saW8gbWF5IG9ubHkgYmUgcGFydGlhbGx5IGluIHpzd2FwLgomIzQzOwkgKiBBIGxhcmdlIGZvbGlvIGNhbiBsZWdpdGltYXRlbHkgcmVhY2ggenN3YXBfbG9hZCgpIHdpdGggaXRzIHdob2xlCiYjNDM7CSAqIHJhbmdlIG9uIHRoZSBiYWNraW5nIGRldmljZSwgc28gc2NhbiB0aGUgcmFuZ2UgcmF0aGVyIHRoYW4gcmVqZWN0aW5nCiYjNDM7CSAqIGl0IG91dHJpZ2h0LiBUaGUgY2FsbGVyIGhhcyBwaW5uZWQgZXZlcnkgc2xvdCwgc28genN3YXAgY2Fubm90IHN0YXJ0CiYjNDM7CSAqIGEgc3RvcmUgb3IgYSB3cml0ZWJhY2sgaW50byB0aGUgcmFuZ2Ugd2hpbGUgd2UgbG9vay4KIAkgKi8KLQlpZiAoV0FSTl9PTl9PTkNFKGZvbGlvX3Rlc3RfbGFyZ2UoZm9saW8pKSkgewotCQlmb2xpb191bmxvY2soZm9saW8pOwotCQlyZXR1cm4gLUVJTlZBTDsKJiM0MzsJaWYgKGZvbGlvX3Rlc3RfbGFyZ2UoZm9saW8pKSB7CiYjNDM7CQlpZiAoV0FSTl9PTl9PTkNFKHpzd2FwX2lzX3ByZXNlbnQoc3dwLAomIzQzOwkJCQkJCSAgZm9saW9fbnJfcGFnZXMoZm9saW8pKSkpIHsKJiM0MzsJCQlmb2xpb191bmxvY2soZm9saW8pOwomIzQzOwkJCXJldHVybiAtRUlPOwomIzQzOwkJfQomIzQzOwkJcmV0dXJuIC1FTk9FTlQ7CiAJfQogCiAJZW50cnkgPSB4YV9sb2FkKHRyZWUsIG9mZnNldCk7CjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE3LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNyAyMDozNzwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAzMDEwCgkJCQkJCQlvdXRwdXQ6IDM1CgkJCQkJCQl0aG91Z2h0czogNjkKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgYW5hbHlzaXMgb2YgdGhlIHNpdHVhdGlvbjoKCioqS01TQU4gUGF0Y2ggQXNzZXNzbWVudCBmb3IgenN3YXAuYyoqCgpBbHJpZ2h0LCBsZXQmIzM5O3MgZGl2ZSBpbnRvIHRoaXMuIFRoZSBmaXJzdCBzdGVwIGlzIGNsZWFyOiB3ZSBuZWVkIHRvIGFzc2VzcyB0aGlzIHBhdGNoIHRvIGZpZ3VyZSBvdXQgaWYgS01TQU4gKEtlcm5lbCBNZW1vcnkgU2FuaXRpemVyKSBpcyBhY3R1YWxseSBuZWNlc3NhcnkuIFRoZSBmYWN0IHRoYXQgdGhlIHBhdGNoIGlzIGluIGBtbS96c3dhcC5jYCBuYXJyb3dzIG91ciBmb2N1cyBzaWduaWZpY2FudGx5LCB3aGljaCBpcyBnb29kLgoKTXkgaW1tZWRpYXRlIGluc3RpbmN0IGlzIHRvIGxvb2sgYXQgdGhlIGRpZmYuIEkmIzM5O2xsIHBvcmUgb3ZlciB0aGUgY29kZSBjaGFuZ2VzLCBidXQgSSYjMzk7bGwgbmVlZCBjb250ZXh0LiBJJiMzOTtsbCByZWFkIHRoZSBzdXJyb3VuZGluZyBjb2RlIGluIGBtbS96c3dhcC5jYCBhcm91bmQgdGhlIHNwZWNpZmljIGxpbmVzIHRoYXQgYXJlIGNoYW5nZWQuIEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoZSBsb2dpYyBmbG93IGFuZCB0aGUgZGF0YSBzdHJ1Y3R1cmVzIGludm9sdmVkLCB0byB1bmRlcnN0YW5kIHRoZSBpbnRlbnQgb2YgdGhpcyBwYXRjaC4KCkkgd2lsbCBhbHNvIGRvIGEgcXVpY2sgYGdyZXBgIG9yIGByZWFkLWZpbGVgIHRvIGNoZWNrIHRoZSBjb250ZXh0IGFyb3VuZCBgenN3YXBfbG9hZCgpYCB3aGljaCBpcyBsaWtlbHkgd2hlcmUgdGhlIHBhdGNoIHdpbGwgaGF2ZSB0aGUgbW9zdCBpbXBhY3QuIEkgd2FudCB0byBzZWUgaG93IGRhdGEgaXMgbG9hZGVkLCBtYW5pcHVsYXRlZCwgYW5kIHN1YnNlcXVlbnRseSB1c2VkLiBUaGlzIHdpbGwgaGVscCBtZSB1bmRlcnN0YW5kIHdoZXRoZXIgdW5pbml0aWFsaXplZCBtZW1vcnkgaXMgcG9zc2libHkgYmVpbmcgdXNlZC4gSSB3aWxsIGxpa2VseSBuZWVkIHRvIHVuZGVyc3RhbmQgd2hhdCB0aGUgcGF0Y2ggaXMgZG9pbmcgd2l0aCB0aGF0IGRhdGEgdG8gc2VlIGlmIHdlIGhhdmUgYSBLTVNBTiBwcm9ibGVtLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE4LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNyAyMDozNzwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O21tL3pzd2FwLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAxNTY1LAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDkwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OzE1NjU6XHRcdFx0XHRlbnRyeSA9IHhhX2VyYXNlKHRyZWUsIG9mZnNldCAmIzQzOyBpbmRleCk7XG4xNTY2Olx0XHRcdFx0aWYgKGVudHJ5KVxuMTU2NzpcdFx0XHRcdFx0enN3YXBfZW50cnlfZnJlZShlbnRyeSk7XG4xNTY4Olx0XHRcdH1cbjE1Njk6XHRcdH1cbjE1NzA6XHRcbjE1NzE6XHRcdHJldHVybiByZXQ7XG4xNTcyOlx0fVxuMTU3MzpcdFxuMTU3NDpcdC8qKlxuMTU3NTpcdCAqIHpzd2FwX2lzX3ByZXNlbnQoKSAtIGlzIGFueSBzbG90IGluIFtlbnRyeSwgZW50cnkgJiM0MzsgbnIpIGluIHpzd2FwP1xuMTU3NjpcdCAqIEBlbnRyeTogYmFzZSBzd2FwIGVudHJ5IG9mIHRoZSByYW5nZVxuMTU3NzpcdCAqIEBucjogbnVtYmVyIG9mIGNvbnRpZ3VvdXMgc2xvdHMgdG8gY2hlY2tcbjE1Nzg6XHQgKlxuMTU3OTpcdCAqIENvbnRleHQ6IFRoZSBjYWxsZXIgbXVzdCBrZWVwIHRoZSByYW5nZSBwaW5uZWQsIG90aGVyd2lzZSB0aGUgYW5zd2VyIGNhblxuMTU4MDpcdCAqIGNoYW5nZSB1bmRlciBpdC5cbjE1ODE6XHQgKiBSZXR1cm46IHRydWUgaWYgYXQgbGVhc3Qgb25lIHNsb3QgaW4gdGhlIHJhbmdlIGlzIGluIHpzd2FwLlxuMTU4MjpcdCAqL1xuMTU4MzpcdHN0YXRpYyBib29sIHpzd2FwX2lzX3ByZXNlbnQoc3dwX2VudHJ5X3QgZW50cnksIHVuc2lnbmVkIGludCBucilcbjE1ODQ6XHR7XG4xNTg1Olx0XHRwZ29mZl90IG9mZnNldCA9IHN3cF9vZmZzZXQoZW50cnkpO1xuMTU4NjpcdFx0c3RydWN0IHhhcnJheSAqdHJlZSA9IHN3YXBfenN3YXBfdHJlZShlbnRyeSk7XG4xNTg3Olx0XHR1bnNpZ25lZCBsb25nIGluZGV4ID0gb2Zmc2V0O1xuMTU4ODpcdFxuMTU4OTpcdFx0LypcbjE1OTA6XHRcdCAqIEEgcGlubmVkIHJhbmdlIGlzIGF0IG1vc3QgU1dBUEZJTEVfQ0xVU1RFUiBzbG90cyBhbmQgaXMgYWxpZ25lZCB0b1xuMTU5MTpcdFx0ICogaXRzIG93biBzaXplLCBzbyBvbmUgdHJlZSBjb3ZlcnMgYWxsIG9mIGl0IGFuZCBhIHNpbmdsZSBsb29rdXAgaXNcbjE1OTI6XHRcdCAqIGVub3VnaC4gU2Nhbm5pbmcgb25seSBwYXJ0IG9mIHRoZSByYW5nZSB3b3VsZCByZXBvcnQgYSBmYWxzZVxuMTU5MzpcdFx0ICogXCYjMzQ7YWJzZW50XCYjMzQ7IGFuZCBsZXQgdGhlIGNhbGxlciByZWFkIGEgc3RhbGUgY29weSBmcm9tIHRoZSBkZXZpY2UuXG4xNTk0Olx0XHQgKi9cbjE1OTU6XHRcdEJVSUxEX0JVR19PTihTV0FQRklMRV9DTFVTVEVSIFx1MDAzZSBaU1dBUF9BRERSRVNTX1NQQUNFX1BBR0VTKTtcbjE1OTY6XHRcbjE1OTc6XHRcdHJldHVybiB4YV9maW5kKHRyZWUsIFx1MDAyNmluZGV4LCBvZmZzZXQgJiM0MzsgbnIgLSAxLCBYQV9QUkVTRU5UKTtcbjE1OTg6XHR9XG4xNTk5Olx0XG4xNjAwOlx0LyoqXG4xNjAxOlx0ICogenN3YXBfbG9hZCgpIC0gbG9hZCBhIGZvbGlvIGZyb20genN3YXBcbjE2MDI6XHQgKiBAZm9saW86IGZvbGlvIHRvIGxvYWRcbjE2MDM6XHQgKlxuMTYwNDpcdCAqIFJldHVybjogMCBvbiBzdWNjZXNzLCB3aXRoIHRoZSBmb2xpbyB1bmxvY2tlZCBhbmQgbWFya2VkIHVwLXRvLWRhdGUsIG9yIG9uZVxuMTYwNTpcdCAqIG9mIHRoZSBmb2xsb3dpbmcgZXJyb3IgY29kZXM6XG4xNjA2Olx0ICpcbjE2MDc6XHQgKiAgLUVJTzogaWYgdGhlIHN3YXBwZWQgb3V0IGNvbnRlbnQgd2FzIGluIHpzd2FwIGJ1dCBjb3VsZCBub3QgYmUgaGFuZGVkXG4xNjA4Olx0ICogIGJhY2ssIGVpdGhlciBiZWNhdXNlIGRlY29tcHJlc3Npb24gZmFpbGVkIG9yIGJlY2F1c2UgYSBzbG90IGluIGFcbjE2MDk6XHQgKiAgbGFyZ2UtZm9saW8gcmFuZ2UgaXMgc3RpbGwgaW4genN3YXAgYW5kIHpzd2FwIGNhbm5vdCByZWNvbnN0cnVjdCBhIGxhcmdlXG4xNjEwOlx0ICogIGZvbGlvIGZyb20gcGVyLXBhZ2UgZW50cmllcy4gVGhlIGZvbGlvIGlzIHVubG9ja2VkLCBidXQgTk9UIG1hcmtlZFxuMTYxMTpcdCAqICB1cC10by1kYXRlLCBzbyB0aGF0IGFuIElPIGVycm9yIGlzIGVtaXR0ZWQgKGUuZy4gZG9fc3dhcF9wYWdlKCkgd2lsbFxuMTYxMjpcdCAqICBTSUdCVVMpLlxuMTYxMzpcdCAqXG4xNjE0Olx0ICogIC1FTk9FTlQ6IGlmIHRoZSBzd2FwcGVkIG91dCBjb250ZW50IHdhcyBub3QgaW4genN3YXAuIFRoZSBmb2xpbyByZW1haW5zXG4xNjE1Olx0ICogIGxvY2tlZCBvbiByZXR1cm4uXG4xNjE2Olx0ICovXG4xNjE3Olx0aW50IHpzd2FwX2xvYWQoc3RydWN0IGZvbGlvICpmb2xpbylcbjE2MTg6XHR7XG4xNjE5Olx0XHRzd3BfZW50cnlfdCBzd3AgPSBmb2xpby1cdTAwM2Vzd2FwO1xuMTYyMDpcdFx0cGdvZmZfdCBvZmZzZXQgPSBzd3Bfb2Zmc2V0KHN3cCk7XG4xNjIxOlx0XHRzdHJ1Y3QgeGFycmF5ICp0cmVlID0gc3dhcF96c3dhcF90cmVlKHN3cCk7XG4xNjIyOlx0XHRzdHJ1Y3QgenN3YXBfZW50cnkgKmVudHJ5O1xuMTYyMzpcdFxuMTYyNDpcdFx0Vk1fV0FSTl9PTl9PTkNFKCFmb2xpb190ZXN0X2xvY2tlZChmb2xpbykpO1xuMTYyNTpcdFx0Vk1fV0FSTl9PTl9PTkNFKCFmb2xpb190ZXN0X3N3YXBjYWNoZShmb2xpbykpO1xuMTYyNjpcdFxuMTYyNzpcdFx0aWYgKHpzd2FwX25ldmVyX2VuYWJsZWQoKSlcbjE2Mjg6XHRcdFx0cmV0dXJuIC1FTk9FTlQ7XG4xNjI5Olx0XG4xNjMwOlx0XHQvKlxuMTYzMTpcdFx0ICogQSBsYXJnZSBmb2xpbyBjYW4gbGVnaXRpbWF0ZWx5IHJlYWNoIHpzd2FwX2xvYWQoKSB3aXRoIGl0cyB3aG9sZVxuMTYzMjpcdFx0ICogcmFuZ2Ugb24gdGhlIGJhY2tpbmcgZGV2aWNlLCBzbyBzY2FuIHRoZSByYW5nZSByYXRoZXIgdGhhbiByZWplY3RpbmdcbjE2MzM6XHRcdCAqIGl0IG91dHJpZ2h0LiBUaGUgY2FsbGVyIGhhcyBwaW5uZWQgZXZlcnkgc2xvdCwgc28genN3YXAgY2Fubm90IHN0YXJ0XG4xNjM0Olx0XHQgKiBhIHN0b3JlIG9yIGEgd3JpdGViYWNrIGludG8gdGhlIHJhbmdlIHdoaWxlIHdlIGxvb2suXG4xNjM1Olx0XHQgKi9cbjE2MzY6XHRcdGlmIChmb2xpb190ZXN0X2xhcmdlKGZvbGlvKSkge1xuMTYzNzpcdFx0XHRpZiAoV0FSTl9PTl9PTkNFKHpzd2FwX2lzX3ByZXNlbnQoc3dwLFxuMTYzODpcdFx0XHRcdFx0XHRcdCAgZm9saW9fbnJfcGFnZXMoZm9saW8pKSkpIHtcbjE2Mzk6XHRcdFx0XHRmb2xpb191bmxvY2soZm9saW8pO1xuMTY0MDpcdFx0XHRcdHJldHVybiAtRUlPO1xuMTY0MTpcdFx0XHR9XG4xNjQyOlx0XHRcdHJldHVybiAtRU5PRU5UO1xuMTY0MzpcdFx0fVxuMTY0NDpcdFxuMTY0NTpcdFx0ZW50cnkgPSB4YV9sb2FkKHRyZWUsIG9mZnNldCk7XG4xNjQ2Olx0XHRpZiAoIWVudHJ5KVxuMTY0NzpcdFx0XHRyZXR1cm4gLUVOT0VOVDtcbjE2NDg6XHRcbjE2NDk6XHRcdGlmICghenN3YXBfZGVjb21wcmVzcyhlbnRyeSwgZm9saW8pKSB7XG4xNjUwOlx0XHRcdGZvbGlvX3VubG9jayhmb2xpbyk7XG4xNjUxOlx0XHRcdHJldHVybiAtRUlPO1xuMTY1MjpcdFx0fVxuMTY1MzpcdFxuMTY1NDpcdFx0Zm9saW9fbWFya191cHRvZGF0ZShmb2xpbyk7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTkvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA3IDIwOjM3PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDQ3NTcKCQkJCQkJCW91dHB1dDogMTgKCQkJCQkJCXRob3VnaHRzOiAyNAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBteSBhdHRlbXB0IGF0IHN1bW1hcml6aW5nIHRoZSB0aG91Z2h0IHByb2Nlc3MsIHRhaWxvcmVkIGZvciBhbiBleHBlcnQgYXVkaWVuY2U6CgoqKlRyYWNpbmcgdGhlIHpzd2FwX2xvYWQgQ2FsbCBQYXRoKioKCkFscmlnaHQsIGxldCYjMzk7cyBkaXZlIGludG8gdGhpcyBgenN3YXBfbG9hZGAgZnVuY3Rpb24uIEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoZSBmdWxsIHN3YXAtaW4gZmxvdyB3aXRoaW4gdGhlIGtlcm5lbCB3aGVuIHV0aWxpemluZyB6c3dhcCwgc28gdHJhY2luZyBpdHMgY2FsbHMgaXMgdGhlIGxvZ2ljYWwgZmlyc3Qgc3RlcC4gSSYjMzk7bSBnb2luZyB0byBzdGFydCBieSBpZGVudGlmeWluZyBhbGwgdGhlIHBvaW50cyBpbiB0aGUga2VybmVsIGNvZGUgd2hlcmUgYHpzd2FwX2xvYWRgIGlzIGludm9rZWQuIFRoYXQgd2lsbCBnaXZlIG1lIGEgY2xlYXIsIHRvcC1kb3duIHZpZXcgb2YgaG93IGl0IGZpdHMgd2l0aGluIHRoZSBsYXJnZXIgcGljdHVyZSBvZiBzd2FwcGluZy4gVW5kZXJzdGFuZGluZyB0aGUgY2FsbCBjb250ZXh0IHNob3VsZCBoZWxwIGluIHF1aWNrbHkgaWRlbnRpZnlpbmcgcG90ZW50aWFsIGJvdHRsZW5lY2tzLCBvcHRpbWl6YXRpb24gb3Bwb3J0dW5pdGllcywgb3IgYW55IHN1YnRsZSBpbnRlcmFjdGlvbnMgd2l0aCBvdGhlciBrZXJuZWwgc3Vic3lzdGVtcyBJIG5lZWQgdG8gY29uc2lkZXIuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjAvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA3IDIwOjM3PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O3pzd2FwX2xvYWQmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7aW5jbHVkZS9saW51eC96c3dhcC5oPTI4PWJvb2wgenN3YXBfc3RvcmUoc3RydWN0IGZvbGlvICpmb2xpbyk7XG5pbmNsdWRlL2xpbnV4L3pzd2FwLmg6Mjk6aW50IHpzd2FwX2xvYWQoc3RydWN0IGZvbGlvICpmb2xpbyk7XG5pbmNsdWRlL2xpbnV4L3pzd2FwLmgtMzAtdm9pZCB6c3dhcF9pbnZhbGlkYXRlKHN3cF9lbnRyeV90IHN3cCk7XG4tLVxuaW5jbHVkZS9saW51eC96c3dhcC5oPTQyPXN0YXRpYyBpbmxpbmUgYm9vbCB6c3dhcF9zdG9yZShzdHJ1Y3QgZm9saW8gKmZvbGlvKVxuLS1cbmluY2x1ZGUvbGludXgvenN3YXAuaC00Ni1cbmluY2x1ZGUvbGludXgvenN3YXAuaDo0NzpzdGF0aWMgaW5saW5lIGludCB6c3dhcF9sb2FkKHN0cnVjdCBmb2xpbyAqZm9saW8pXG5pbmNsdWRlL2xpbnV4L3pzd2FwLmgtNDgte1xuLS1cbm1tL3BhZ2VfaW8uYz00NTI9dm9pZCBzd2FwX3JlYWRfZm9saW8oc3RydWN0IHN3YXBfaW9fY3R4ICpjdHgsIHN0cnVjdCBmb2xpbyAqZm9saW8pXG4tLVxubW0vcGFnZV9pby5jLTQ3OS1cbm1tL3BhZ2VfaW8uYzo0ODA6XHRpZiAoenN3YXBfbG9hZChmb2xpbykgIT0gLUVOT0VOVClcbm1tL3BhZ2VfaW8uYy00ODEtXHRcdGdvdG8gZmluaXNoO1xuLS1cbm1tL3pzd2FwLmM9MTU4Mz1zdGF0aWMgYm9vbCB6c3dhcF9pc19wcmVzZW50KHN3cF9lbnRyeV90IGVudHJ5LCB1bnNpZ25lZCBpbnQgbnIpXG4tLVxubW0venN3YXAuYy0xNjAwLS8qKlxubW0venN3YXAuYzoxNjAxOiAqIHpzd2FwX2xvYWQoKSAtIGxvYWQgYSBmb2xpbyBmcm9tIHpzd2FwXG5tbS96c3dhcC5jLTE2MDItICogQGZvbGlvOiBmb2xpbyB0byBsb2FkXG4tLVxubW0venN3YXAuYy0xNjE2LSAqL1xubW0venN3YXAuYzoxNjE3OmludCB6c3dhcF9sb2FkKHN0cnVjdCBmb2xpbyAqZm9saW8pXG5tbS96c3dhcC5jLTE2MTgte1xuLS1cbm1tL3pzd2FwLmMtMTYzMC1cdC8qXG5tbS96c3dhcC5jOjE2MzE6XHQgKiBBIGxhcmdlIGZvbGlvIGNhbiBsZWdpdGltYXRlbHkgcmVhY2ggenN3YXBfbG9hZCgpIHdpdGggaXRzIHdob2xlXG5tbS96c3dhcC5jLTE2MzItXHQgKiByYW5nZSBvbiB0aGUgYmFja2luZyBkZXZpY2UsIHNvIHNjYW4gdGhlIHJhbmdlIHJhdGhlciB0aGFuIHJlamVjdGluZ1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIxLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNyAyMDozNzwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA1NDM5CgkJCQkJCQlvdXRwdXQ6IDM1CgkJCQkJCQl0aG91Z2h0czogMjEKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgYSBzdW1tYXJ5IG9mIG15IHRob3VnaHQgcHJvY2VzcywgYXMgcmVxdWVzdGVkOgoKKipEaXZpbmcgaW50byBgbW0vcGFnZV9pby5jYCoqCgpPa2F5LCB0aW1lIHRvIGdldCBteSBoYW5kcyBkaXJ0eS4gSSYjMzk7bSBnb2luZyB0byB6ZXJvIGluIG9uIGBtbS9wYWdlX2lvLmNgIGFuZCBzdGFydCBwb2tpbmcgYXJvdW5kIGxpbmUgNDgwLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCBob3cgdGhpcyBwYXJ0aWN1bGFyIHBhcnQgb2YgdGhlIG1lbW9yeSBtYW5hZ2VtZW50IHN5c3RlbSBpcyB3b3JraW5nLiBTcGVjaWZpY2FsbHksIEkmIzM5O20gdGhpbmtpbmcgYWJvdXQgaG93IHRoZSBwYWdlIEkvTyBpcyBoYW5kbGVkIHRoZXJlLiBJJiMzOTttIGhvcGluZyB0byBnZXQgYSBjbGVhcmVyIHBpY3R1cmUgb2YgdGhlIGRhdGEgZmxvdyBhbmQgYW55IHBvdGVudGlhbCBib3R0bGVuZWNrcyBvciBhcmVhcyBmb3Igb3B0aW1pemF0aW9uLiBUaGlzIGZlZWxzIGxpa2UgdGhlIHJpZ2h0IHBsYWNlIHRvIHN0YXJ0IGRpZ2dpbmcgZGVlcGVyIGludG8gdGhhdCBpc3N1ZSBJJiMzOTt2ZSBiZWVuIGNvbnNpZGVyaW5nLiBMZXQmIzM5O3Mgc2VlIHdoYXQgd2UgY2FuIGZpbmQuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjIvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA3IDIwOjM3PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7bW0vcGFnZV9pby5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogNDYwLAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDUwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OyA0NjA6XHRcdFZNX0JVR19PTl9GT0xJTyghZm9saW9fdGVzdF9zd2FwY2FjaGUoZm9saW8pIFx1MDAyNlx1MDAyNiAhc3luY2hyb25vdXMsIGZvbGlvKTtcbiA0NjE6XHRcdFZNX0JVR19PTl9GT0xJTyghZm9saW9fdGVzdF9sb2NrZWQoZm9saW8pLCBmb2xpbyk7XG4gNDYyOlx0XHRWTV9CVUdfT05fRk9MSU8oZm9saW9fdGVzdF91cHRvZGF0ZShmb2xpbyksIGZvbGlvKTtcbiA0NjM6XHRcbiA0NjQ6XHRcdC8qXG4gNDY1Olx0XHQgKiBDb3VudCBzdWJtaXNzaW9uIHRpbWUgYXMgbWVtb3J5IHN0YWxsIGFuZCBkZWxheS4gV2hlbiB0aGUgZGV2aWNlXG4gNDY2Olx0XHQgKiBpcyBjb25nZXN0ZWQsIG9yIHRoZSBzdWJtaXR0aW5nIGNncm91cCBJTy10aHJvdHRsZWQsIHN1Ym1pc3Npb25cbiA0Njc6XHRcdCAqIGNhbiBiZSBhIHNpZ25pZmljYW50IHBhcnQgb2Ygb3ZlcmFsbCBJTyB0aW1lLlxuIDQ2ODpcdFx0ICovXG4gNDY5Olx0XHRpZiAod29ya2luZ3NldCkge1xuIDQ3MDpcdFx0XHRkZWxheWFjY3RfdGhyYXNoaW5nX3N0YXJ0KFx1MDAyNmluX3RocmFzaGluZyk7XG4gNDcxOlx0XHRcdHBzaV9tZW1zdGFsbF9lbnRlcihcdTAwMjZwZmxhZ3MpO1xuIDQ3MjpcdFx0fVxuIDQ3MzpcdFx0ZGVsYXlhY2N0X3N3YXBpbl9zdGFydCgpO1xuIDQ3NDpcdFxuIDQ3NTpcdFx0aWYgKHN3YXBfcmVhZF9mb2xpb196ZXJvbWFwKGZvbGlvKSkge1xuIDQ3NjpcdFx0XHRmb2xpb191bmxvY2soZm9saW8pO1xuIDQ3NzpcdFx0XHRnb3RvIGZpbmlzaDtcbiA0Nzg6XHRcdH1cbiA0Nzk6XHRcbiA0ODA6XHRcdGlmICh6c3dhcF9sb2FkKGZvbGlvKSAhPSAtRU5PRU5UKVxuIDQ4MTpcdFx0XHRnb3RvIGZpbmlzaDtcbiA0ODI6XHRcbiA0ODM6XHRcdC8qIFdlIGhhdmUgdG8gcmVhZCBmcm9tIHNsb3dlciBkZXZpY2VzLiBJbmNyZWFzZSB6c3dhcCBwcm90ZWN0aW9uLiAqL1xuIDQ4NDpcdFx0enN3YXBfZm9saW9fc3dhcGluKGZvbGlvKTtcbiA0ODU6XHRcdHN3YXBfYWRkX2ZvbGlvKGN0eCwgZm9saW8sIFJFQUQpO1xuIDQ4NjpcdFxuIDQ4NzpcdGZpbmlzaDpcbiA0ODg6XHRcdGlmICh3b3JraW5nc2V0KSB7XG4gNDg5Olx0XHRcdGRlbGF5YWNjdF90aHJhc2hpbmdfZW5kKFx1MDAyNmluX3RocmFzaGluZyk7XG4gNDkwOlx0XHRcdHBzaV9tZW1zdGFsbF9sZWF2ZShcdTAwMjZwZmxhZ3MpO1xuIDQ5MTpcdFx0fVxuIDQ5MjpcdFx0ZGVsYXlhY2N0X3N3YXBpbl9lbmQoKTtcbiA0OTM6XHR9XG4gNDk0Olx0XG4gNDk1Olx0c3RhdGljIHZvaWQgc3dhcF93cml0ZV9lbmQoc3RydWN0IHN3YXBfaW9jYiAqc2lvLCBib29sIGZhaWxlZClcbiA0OTY6XHR7XG4gNDk3Olx0XHRpbnQgcDtcbiA0OTg6XHRcbiA0OTk6XHRcdGZvciAocCA9IDA7IHAgXHUwMDNjIHNpby1cdTAwM2Vucl9idmVjczsgcCYjNDM7JiM0MzspIHtcbiA1MDA6XHRcdFx0c3RydWN0IHBhZ2UgKnBhZ2UgPSBzaW8tXHUwMDNlYnZlY3NbcF0uYnZfcGFnZTtcbiA1MDE6XHRcbiA1MDI6XHRcdFx0aWYgKGZhaWxlZCkge1xuIDUwMzpcdFx0XHRcdHNldF9wYWdlX2RpcnR5KHBhZ2UpO1xuIDUwNDpcdFx0XHRcdENsZWFyUGFnZVJlY2xhaW0ocGFnZSk7XG4gNTA1Olx0XHRcdH1cbiA1MDY6XHRcdFx0ZW5kX3BhZ2Vfd3JpdGViYWNrKHBhZ2UpO1xuIDUwNzpcdFx0fVxuIDUwODpcdFx0bWVtcG9vbF9mcmVlKHNpbywgc2lvX3Bvb2wpO1xuIDUwOTpcdH1cbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yMy8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDcgMjA6Mzc8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNjM4NAoJCQkJCQkJb3V0cHV0OiAyMDYKCQkJCQkJCXRob3VnaHRzOiA3MDUKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqS01TQU4gQW5hbHlzaXMgb2YgWnN3YXAgTGFyZ2UgRm9saW8gSGFuZGxpbmcqKgoKT2theSwgbGV0JiMzOTtzIGJyZWFrIHRoaXMgZG93bi4gSW4gYHN3YXBfcmVhZF9mb2xpb2AsIHRoZSBleGlzdGluZyB6c3dhcCBsb2dpYyBoYXMgYmVlbiB0d2Vha2VkIHRvIGhhbmRsZSBsYXJnZSBmb2xpb3MgbW9yZSByb2J1c3RseS4gQmVmb3JlLCBpZiBhIGxhcmdlIGZvbGlvIGhpdCBgenN3YXBfbG9hZGAsIGl0IHdvdWxkIGltbWVkaWF0ZWx5IFdBUk4gYW5kIHJldHVybiAtRUlOVkFMLCBlc3NlbnRpYWxseSBiYWlsaW5nIG91dCBhbmQgbGVhdmluZyB0aGUgZm9saW8gbWVzc2VkIHVwIChub3QgdXAtdG8tZGF0ZSBhbmQgdW5sb2NrZWQsIHdoaWNoIGlzIGJhZCBuZXdzKS4gVGhpcyBwYXRjaCBpbnRyb2R1Y2VzIGEgbW9yZSBudWFuY2VkIGFwcHJvYWNoLgoKTm93LCB3aGVuIGVuY291bnRlcmluZyBhIGxhcmdlIGZvbGlvLCBgenN3YXBgIGNoZWNrcyBpZiAqYW55KiBwYXJ0IG9mIHRoYXQgZm9saW8gaXMgcHJlc2VudCBpbiB6c3dhcCB1c2luZyBgenN3YXBfaXNfcHJlc2VudGAuIElmICphbnkqIHBhcnQgaXMgaW4genN3YXAsIHdlIHN0aWxsIFdBUk4gYW5kIHJldHVybiAtRUlPLCBhcyBiZWZvcmUgKHNvIHdlJiMzOTtyZSBzdGlsbCBjYXJlZnVsKS4gSG93ZXZlciwgaWYgKm5vdGhpbmcqIGlzIGluIHpzd2FwIChtZWFuaW5nIHRoZSB3aG9sZSB0aGluZyYjMzk7cyBvbiB0aGUgYmFja2luZyBzd2FwIGRldmljZSksIHdlIG5vdyByZXR1cm4gLUVOT0VOVC4gVGhpcyBpcyBrZXkhIFRoaXMgLUVOT0VOVCBhbGxvd3MgYHN3YXBfcmVhZF9mb2xpb2AgdG8gcHJvY2VlZCBhbmQgcmVhZCB0aGUgZW50aXJlIGxhcmdlIGZvbGlvIGZyb20gdGhlIGJhY2tpbmcgc3dhcCBkZXZpY2UgdXNpbmcgYHN3YXBfYWRkX2ZvbGlvYC4gVGhpcyBpcyB0aGUgbmV3IGJlaGF2aW9yLgoKU28sIHRoZSBiaWcgcXVlc3Rpb24gaXMsIGFyZSB3ZSBpbnRyb2R1Y2luZyBhbnkgdW5pbml0aWFsaXplZCBtZW1vcnkgcmlza3Mgd2l0aCB0aGlzIGNoYW5nZT8gTGV0JiMzOTtzIGFuYWx5emUuCgpGaXJzdCwgYXBwbGljYWJpbGl0eSBvZiBLTVNBTiB2cyBLQVNBTjoKCjEuICAqKlVzZXJzcGFjZSBleHBvc3VyZToqKiBBcmUga2VybmVsIHN0cnVjdHVyZXMgbGVha2luZyB1bmluaXRpYWxpemVkIGZpZWxkcyB0byB1c2Vyc3BhY2U/IE5vcGUuIE5vdCBoZXJlLgoyLiAgKipDb25kaXRpb25hbCBsb2dpYzoqKiBJcyBvdXIgcHJvZ3JhbSBmbG93IGRlcGVuZGluZyBvbiB1bmluaXRpYWxpemVkIHZhcmlhYmxlcz8gTm90IGF0IGFsbC4gVmFyaWFibGVzIGxpa2UgYHN3cGAsIGBvZmZzZXRgLCBgdHJlZWAsIGFuZCBgaW5kZXhgIGFyZSBhbGwgaW5pdGlhbGl6ZWQgYmVmb3JlIHVzZS4KMy4gICoqTmV3IGFsbG9jYXRpb25zOioqIEFueSBuZXcgYWxsb2NhdGlvbnMgb2YgY29tcGxleCBzdHJ1Y3R1cmVzIHdpdGggdW5pbml0aWFsaXplZCBmaWVsZHM/IE5vcGUsIHdlJiMzOTtyZSBub3QgYWxsb2NhdGluZyBuZXcgc3RydWN0dXJlcy4KNC4gICoqQm91bmRzL2xlbmd0aHM6KiogQXJlIHdlIGZpZGRsaW5nIHdpdGggbGVuZ3RocyBvciBib3VuZHMgY2hlY2tzIGluIGEgd2F5IHRoYXQgY291bGQgZXhwb3NlIHVuaW5pdGlhbGl6ZWQgZGF0YT8gTm9wZS4gVGhlIGBzd2FwX2FkZF9mb2xpb2AgY2FsbCByZWFkcyAqZnJvbSogdGhlIHN3YXAgZGV2aWNlIGludG8gdGhlIGZvbGlvIHBhZ2VzLiBJdCYjMzk7cyBzdXBwb3NlZCB0byByZWFkIHRoZSBkYXRhLCBhbmQgbWFya3MgdGhlIGZvbGlvIHVwLXRvLWRhdGUgdXBvbiBjb21wbGV0aW9uLiBJZiB0aGVyZSBhcmUgSS9PIGVycm9ycywgYmxvY2svc3dhcCBsYXllcnMgaGFuZGxlIHRoYXQuIEluc2lkZSBgenN3YXBfaXNfcHJlc2VudGAsIHRoZSBgeGFfZmluZGAgdGFrZXMgaW5pdGlhbGl6ZWQgdmFsdWVzIGZvciBib3RoIGl0cyBgJmFtcDtpbmRleGAgYW5kIGBtYXhgIHBhcmFtZXRlcnMuCgpUaGVyZWZvcmUsIHRoaXMgY2hhbmdlIGRvZXNuJiMzOTt0IGludHJvZHVjZSBhbnkgdW5pbml0aWFsaXplZCBoZWFwIG9yIHN0YWNrIHJlYWRzLCBpbmZvLWxlYWtzIHRvIHVzZXJzcGFjZSwgb3IgdW5pbml0aWFsaXplZCBwYWRkaW5nLiBJdCBsb29rcyBsaWtlIGl0JiMzOTtzIGFsbCBpbml0aWFsaXplZCBzY2FsYXIgdHlwZXMgb24gdGhlIHN0YWNrLgoKVG8gYmUgZXh0cmEgY2FyZWZ1bDoKCiogICBJJiMzOTt2ZSBjaGVja2VkIHRoZSBzdGFuZGFyZCBLQVNBTiwgTE9DS0RFUCwgYW5kIFVCIHNhbml0aXplcnMgaW4gY29tcGFyaXNvbiB0byBLTVNBTi4gVGhlIGFuc3dlciBpcyBzdGlsbCBOby4gYE5lZWRzS01TQU5gIHNob3VsZCBiZSBmYWxzZSBmb3IgdGhpcyBjaGFuZ2UuCgpTbywgb3ZlcmFsbCwgYWZ0ZXIgdGhpcyB0aG9yb3VnaCBhbmFseXNpcywgSSBjYW4gY29uY2x1ZGUgdGhhdCB0aGlzIGlzIHNhZmUgYW5kIGRvZXMgbm90IGludHJvZHVjZSBtZW1vcnkgc2FmZXR5IGlzc3VlcyB3aXRoIEtNU0FOLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI0LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNyAyMDozODwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnNldC1yZXN1bHRzPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtLTVNBTlJlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBtb2RpZmllcyBgenN3YXBfbG9hZCgpYCB0byBzdXBwb3J0IGNoZWNraW5nIHdoZXRoZXIgbGFyZ2UgZm9saW9zIGhhdmUgZW50cmllcyBpbiB6c3dhcCB2aWEgYHpzd2FwX2lzX3ByZXNlbnQoKWAuIElmIG5vIGVudHJpZXMgaW4gdGhlIHJhbmdlIGFyZSBjYWNoZWQgaW4genN3YXAsIGl0IHJldHVybnMgYC1FTk9FTlRgIHNvIHRoZSBiYWNraW5nIHN3YXAgZGV2aWNlIGNhbiByZWFkIHRoZSBlbnRpcmUgbGFyZ2UgZm9saW8gaW5zdGVhZCBvZiB1bmNvbmRpdGlvbmFsbHkgZmFpbGluZyB3aXRoIGAtRUlOVkFMYC5cblxuQWxsIHZhcmlhYmxlcyB1c2VkIGluIHRoZSBuZXdseSBpbnRyb2R1Y2VkIGB6c3dhcF9pc19wcmVzZW50KClgIGZ1bmN0aW9uIChgb2Zmc2V0YCwgYHRyZWVgLCBgaW5kZXhgKSBhcmUgZnVsbHkgaW5pdGlhbGl6ZWQgc2NhbGFyIGFuZCBwb2ludGVyIHZhbHVlcy4gVGhlIHBhdGNoIGRvZXMgbm90IGFsbG9jYXRlIG5ldyBzdHJ1Y3R1cmVzLCBjb3B5IHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHRvIHVzZXIgc3BhY2UsIGJyYW5jaCBvbiB1bmluaXRpYWxpemVkIHZhbHVlcywgb3IgYWx0ZXIgYnVmZmVyIGxlbmd0aHMgaW4gYSB3YXkgdGhhdCB3b3VsZCBsZWF2ZSB1bmluaXRpYWxpemVkIGtlcm5lbCBtZW1vcnkgZXhwb3NlZC4gQW55IHBvdGVudGlhbCBwYWdlL2ZvbGlvIHN0YXRlIGlzc3VlcyBvciBvdXQtb2YtYm91bmRzIGluZGV4IGlzc3VlcyBhcmUgYWRlcXVhdGVseSBjb3ZlcmVkIGJ5IHN0YW5kYXJkIGFzc2VydGlvbnMgYW5kIEtBU0FOLiBUaGVyZWZvcmUsIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpcyBub3QgcmVxdWlyZWQuJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtLTVNBTlJlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBtb2RpZmllcyBgenN3YXBfbG9hZCgpYCB0byBzdXBwb3J0IGNoZWNraW5nIHdoZXRoZXIgbGFyZ2UgZm9saW9zIGhhdmUgZW50cmllcyBpbiB6c3dhcCB2aWEgYHpzd2FwX2lzX3ByZXNlbnQoKWAuIElmIG5vIGVudHJpZXMgaW4gdGhlIHJhbmdlIGFyZSBjYWNoZWQgaW4genN3YXAsIGl0IHJldHVybnMgYC1FTk9FTlRgIHNvIHRoZSBiYWNraW5nIHN3YXAgZGV2aWNlIGNhbiByZWFkIHRoZSBlbnRpcmUgbGFyZ2UgZm9saW8gaW5zdGVhZCBvZiB1bmNvbmRpdGlvbmFsbHkgZmFpbGluZyB3aXRoIGAtRUlOVkFMYC5cblxuQWxsIHZhcmlhYmxlcyB1c2VkIGluIHRoZSBuZXdseSBpbnRyb2R1Y2VkIGB6c3dhcF9pc19wcmVzZW50KClgIGZ1bmN0aW9uIChgb2Zmc2V0YCwgYHRyZWVgLCBgaW5kZXhgKSBhcmUgZnVsbHkgaW5pdGlhbGl6ZWQgc2NhbGFyIGFuZCBwb2ludGVyIHZhbHVlcy4gVGhlIHBhdGNoIGRvZXMgbm90IGFsbG9jYXRlIG5ldyBzdHJ1Y3R1cmVzLCBjb3B5IHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHRvIHVzZXIgc3BhY2UsIGJyYW5jaCBvbiB1bmluaXRpYWxpemVkIHZhbHVlcywgb3IgYWx0ZXIgYnVmZmVyIGxlbmd0aHMgaW4gYSB3YXkgdGhhdCB3b3VsZCBsZWF2ZSB1bmluaXRpYWxpemVkIGtlcm5lbCBtZW1vcnkgZXhwb3NlZC4gQW55IHBvdGVudGlhbCBwYWdlL2ZvbGlvIHN0YXRlIGlzc3VlcyBvciBvdXQtb2YtYm91bmRzIGluZGV4IGlzc3VlcyBhcmUgYWRlcXVhdGVseSBjb3ZlcmVkIGJ5IHN0YW5kYXJkIGFzc2VydGlvbnMgYW5kIEtBU0FOLiBUaGVyZWZvcmUsIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpcyBub3QgcmVxdWlyZWQuJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8L3Rib2R5PgoJPC90YWJsZT4KCgk8ZGl2IGlkPSJsbG1fc3VtbWFyeV90YWJsZV9kaXYiIHN0eWxlPSJtYXJnaW46IDIwcHggMDsiPgoJCTx0YWJsZSBjbGFzcz0ibGlzdF90YWJsZSI+CgkJCTxjYXB0aW9uPkxMTSBDYWxscyBTdW1tYXJ5OjwvY2FwdGlvbj4KCQkJPHRoZWFkPgoJCQkJPHRyPgoJCQkJCTx0aD5Ub3RhbCBDYWxsczwvdGg+CgkJCQkJPHRoPlRvdGFsIFRva2VuczwvdGg+CgkJCQkJPHRoPkF2ZyBUb2tlbnM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJCTx0aD5BdmcgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCTwvdHI+CgkJCTwvdGhlYWQ+CgkJCTx0Ym9keSBpZD0ibGxtX3N1bW1hcnlfc3RhdHNfYm9keSI+PC90Ym9keT4KCQk8L3RhYmxlPgoJPC9kaXY+CgoJPGRpdiBpZD0idG9vbF9zdW1tYXJ5X3RhYmxlX2RpdiIgc3R5bGU9Im1hcmdpbjogMjBweCAwOyI+CgkJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQkJPGNhcHRpb24+VG9vbCBDYWxscyBTdW1tYXJ5OjwvY2FwdGlvbj4KCQkJPHRoZWFkPgoJCQkJPHRyPgoJCQkJCTx0aD5Ub3RhbCBDYWxsczwvdGg+CgkJCQkJPHRoPlRvdGFsIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQkJPHRoPkF2ZyBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJPC90cj4KCQkJPC90aGVhZD4KCQkJPHRib2R5IGlkPSJ0b29sX3N1bW1hcnlfc3RhdHNfYm9keSI+PC90Ym9keT4KCQk8L3RhYmxlPgoJPC9kaXY+CgoJPGRpdiBpZD0iZHVyYXRpb25fY2hhcnRfZGl2IiBzdHlsZT0id2lkdGg6IDEwMCU7IG1hcmdpbjogMjBweCAwOyBib3JkZXI6IDFweDsiPjwvZGl2PgoJPGRpdiBpZD0idG9rZW5fY2hhcnRfZGl2IiBzdHlsZT0id2lkdGg6IDEwMCU7IG1hcmdpbjogMjBweCAwOyBib3JkZXI6IDFweDsiPjwvZGl2PgoKCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Imh0dHBzOi8vd3d3Lmdvb2dsZS5jb20vanNhcGkiPjwvc2NyaXB0PgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgoJCWdvb2dsZS5sb2FkKCJ2aXN1YWxpemF0aW9uIiwgIjEiLCB7cGFja2FnZXM6WyJjb3JlY2hhcnQiXX0pOwoJCWdvb2dsZS5zZXRPbkxvYWRDYWxsYmFjayhkcmF3Q2hhcnRzKTsKCgkJZnVuY3Rpb24gZHJhd0NoYXJ0cygpIHsKCQkJY29uc3QgcmF3RGF0YSA9IFt7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA3VDIwOjM3OjEwLjA3NTM3OTYwOVoiLCJTZXEiOjAsIk5lc3RpbmciOjAsIlR5cGUiOiJmbG93IiwiTmFtZSI6InBhdGNoLXRyaWFnZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjUwMTE3NDg4MzAwLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIlNXQVBcIixcbiAgICBcIlpTV0FQXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwienN3YXBfbG9hZFwiLFxuICAgIFwic3dhcF9yZWFkX2ZvbGlvXCJcbiAgXSxcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBtb2RpZmllcyBgenN3YXBfbG9hZCgpYCB0byBzdXBwb3J0IGNoZWNraW5nIHdoZXRoZXIgbGFyZ2UgZm9saW9zIGhhdmUgZW50cmllcyBpbiB6c3dhcCB2aWEgYHpzd2FwX2lzX3ByZXNlbnQoKWAuIElmIG5vIGVudHJpZXMgaW4gdGhlIHJhbmdlIGFyZSBjYWNoZWQgaW4genN3YXAsIGl0IHJldHVybnMgYC1FTk9FTlRgIHNvIHRoZSBiYWNraW5nIHN3YXAgZGV2aWNlIGNhbiByZWFkIHRoZSBlbnRpcmUgbGFyZ2UgZm9saW8gaW5zdGVhZCBvZiB1bmNvbmRpdGlvbmFsbHkgZmFpbGluZyB3aXRoIGAtRUlOVkFMYC5cXG5cXG5BbGwgdmFyaWFibGVzIHVzZWQgaW4gdGhlIG5ld2x5IGludHJvZHVjZWQgYHpzd2FwX2lzX3ByZXNlbnQoKWAgZnVuY3Rpb24gKGBvZmZzZXRgLCBgdHJlZWAsIGBpbmRleGApIGFyZSBmdWxseSBpbml0aWFsaXplZCBzY2FsYXIgYW5kIHBvaW50ZXIgdmFsdWVzLiBUaGUgcGF0Y2ggZG9lcyBub3QgYWxsb2NhdGUgbmV3IHN0cnVjdHVyZXMsIGNvcHkgdW5pbml0aWFsaXplZCBtZW1vcnkgdG8gdXNlciBzcGFjZSwgYnJhbmNoIG9uIHVuaW5pdGlhbGl6ZWQgdmFsdWVzLCBvciBhbHRlciBidWZmZXIgbGVuZ3RocyBpbiBhIHdheSB0aGF0IHdvdWxkIGxlYXZlIHVuaW5pdGlhbGl6ZWQga2VybmVsIG1lbW9yeSBleHBvc2VkLiBBbnkgcG90ZW50aWFsIHBhZ2UvZm9saW8gc3RhdGUgaXNzdWVzIG9yIG91dC1vZi1ib3VuZHMgaW5kZXggaXNzdWVzIGFyZSBhZGVxdWF0ZWx5IGNvdmVyZWQgYnkgc3RhbmRhcmQgYXNzZXJ0aW9ucyBhbmQgS0FTQU4uIFRoZXJlZm9yZSwgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGlzIG5vdCByZXF1aXJlZC5cIixcbiAgXCJOZWVkc0tNU0FOXCI6IGZhbHNlLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBtb2RpZmllcyBtZW1vcnkgbWFuYWdlbWVudCBsb2dpYyBpbiBtbS96c3dhcC5jIGJ5IGludHJvZHVjaW5nIHpzd2FwX2lzX3ByZXNlbnQoKSBhbmQgdXBkYXRpbmcgenN3YXBfbG9hZCgpIHRvIGluc3BlY3QgbGFyZ2UgZm9saW9zIGluc3RlYWQgb2YgdW5jb25kaXRpb25hbGx5IHJlamVjdGluZyB0aGVtLiBUaGlzIGNoYW5nZXMgY29yZSBzd2FwLWluIGhhbmRsaW5nIGFuZCBhc3NlcnRpb25zIGluIHJlYWNoYWJsZSBtbSBjb2RlLCB3YXJyYW50aW5nIGZ1enppbmcuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA3VDIwOjM3OjEwLjA3NTM4NTQxOVoiLCJTZXEiOjEsIk5lc3RpbmciOjEsIlR5cGUiOiJhY3Rpb24iLCJOYW1lIjoicmVhZC1wYXRjaC1kaWZmIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NTY3NjE4NjUxLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJQYXRjaERpZmZcIjogXCJjb21taXQgMGFjZTJkYjM1MWFkMGE3ZWRiOTBhNmNhMDQ5MzU3NDhiYmM3MmZkMVxcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXFx1MDAzZVxcbkRhdGU6ICAgTW9uIFNlcCA3IDIwOjM3OjA5IDIwMjYgKzAwMDBcXG5cXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XFxuXFxuZGlmZiAtLWdpdCBhL21tL3pzd2FwLmMgYi9tbS96c3dhcC5jXFxuaW5kZXggMzdmMzRlNDA2YzhlMy4uZmQzNmFjMzhlOWExZSAxMDA2NDRcXG4tLS0gYS9tbS96c3dhcC5jXFxuKysrIGIvbW0venN3YXAuY1xcbkBAIC0xNTcxLDYgKzE1NzEsMzIgQEAgYm9vbCB6c3dhcF9zdG9yZShzdHJ1Y3QgZm9saW8gKmZvbGlvKVxcbiBcXHRyZXR1cm4gcmV0O1xcbiB9XFxuIFxcbisvKipcXG4rICogenN3YXBfaXNfcHJlc2VudCgpIC0gaXMgYW55IHNsb3QgaW4gW2VudHJ5LCBlbnRyeSArIG5yKSBpbiB6c3dhcD9cXG4rICogQGVudHJ5OiBiYXNlIHN3YXAgZW50cnkgb2YgdGhlIHJhbmdlXFxuKyAqIEBucjogbnVtYmVyIG9mIGNvbnRpZ3VvdXMgc2xvdHMgdG8gY2hlY2tcXG4rICpcXG4rICogQ29udGV4dDogVGhlIGNhbGxlciBtdXN0IGtlZXAgdGhlIHJhbmdlIHBpbm5lZCwgb3RoZXJ3aXNlIHRoZSBhbnN3ZXIgY2FuXFxuKyAqIGNoYW5nZSB1bmRlciBpdC5cXG4rICogUmV0dXJuOiB0cnVlIGlmIGF0IGxlYXN0IG9uZSBzbG90IGluIHRoZSByYW5nZSBpcyBpbiB6c3dhcC5cXG4rICovXFxuK3N0YXRpYyBib29sIHpzd2FwX2lzX3ByZXNlbnQoc3dwX2VudHJ5X3QgZW50cnksIHVuc2lnbmVkIGludCBucilcXG4re1xcbitcXHRwZ29mZl90IG9mZnNldCA9IHN3cF9vZmZzZXQoZW50cnkpO1xcbitcXHRzdHJ1Y3QgeGFycmF5ICp0cmVlID0gc3dhcF96c3dhcF90cmVlKGVudHJ5KTtcXG4rXFx0dW5zaWduZWQgbG9uZyBpbmRleCA9IG9mZnNldDtcXG4rXFxuK1xcdC8qXFxuK1xcdCAqIEEgcGlubmVkIHJhbmdlIGlzIGF0IG1vc3QgU1dBUEZJTEVfQ0xVU1RFUiBzbG90cyBhbmQgaXMgYWxpZ25lZCB0b1xcbitcXHQgKiBpdHMgb3duIHNpemUsIHNvIG9uZSB0cmVlIGNvdmVycyBhbGwgb2YgaXQgYW5kIGEgc2luZ2xlIGxvb2t1cCBpc1xcbitcXHQgKiBlbm91Z2guIFNjYW5uaW5nIG9ubHkgcGFydCBvZiB0aGUgcmFuZ2Ugd291bGQgcmVwb3J0IGEgZmFsc2VcXG4rXFx0ICogXFxcImFic2VudFxcXCIgYW5kIGxldCB0aGUgY2FsbGVyIHJlYWQgYSBzdGFsZSBjb3B5IGZyb20gdGhlIGRldmljZS5cXG4rXFx0ICovXFxuK1xcdEJVSUxEX0JVR19PTihTV0FQRklMRV9DTFVTVEVSIFxcdTAwM2UgWlNXQVBfQUREUkVTU19TUEFDRV9QQUdFUyk7XFxuK1xcbitcXHRyZXR1cm4geGFfZmluZCh0cmVlLCBcXHUwMDI2aW5kZXgsIG9mZnNldCArIG5yIC0gMSwgWEFfUFJFU0VOVCk7XFxuK31cXG4rXFxuIC8qKlxcbiAgKiB6c3dhcF9sb2FkKCkgLSBsb2FkIGEgZm9saW8gZnJvbSB6c3dhcFxcbiAgKiBAZm9saW86IGZvbGlvIHRvIGxvYWRcXG5AQCAtMTU3OCwxNSArMTYwNCwxMiBAQCBib29sIHpzd2FwX3N0b3JlKHN0cnVjdCBmb2xpbyAqZm9saW8pXFxuICAqIFJldHVybjogMCBvbiBzdWNjZXNzLCB3aXRoIHRoZSBmb2xpbyB1bmxvY2tlZCBhbmQgbWFya2VkIHVwLXRvLWRhdGUsIG9yIG9uZVxcbiAgKiBvZiB0aGUgZm9sbG93aW5nIGVycm9yIGNvZGVzOlxcbiAgKlxcbi0gKiAgLUVJTzogaWYgdGhlIHN3YXBwZWQgb3V0IGNvbnRlbnQgd2FzIGluIHpzd2FwLCBidXQgY291bGQgbm90IGJlIGxvYWRlZFxcbi0gKiAgaW50byB0aGUgcGFnZSBkdWUgdG8gYSBkZWNvbXByZXNzaW9uIGZhaWx1cmUuIFRoZSBmb2xpbyBpcyB1bmxvY2tlZCwgYnV0XFxuLSAqICBOT1QgbWFya2VkIHVwLXRvLWRhdGUsIHNvIHRoYXQgYW4gSU8gZXJyb3IgaXMgZW1pdHRlZCAoZS5nLiBkb19zd2FwX3BhZ2UoKVxcbi0gKiAgd2lsbCBTSUdCVVMpLlxcbi0gKlxcbi0gKiAgLUVJTlZBTDogaWYgdGhlIHN3YXBwZWQgb3V0IGNvbnRlbnQgd2FzIGluIHpzd2FwLCBidXQgdGhlIHBhZ2UgYmVsb25nc1xcbi0gKiAgdG8gYSBsYXJnZSBmb2xpbywgd2hpY2ggaXMgbm90IHN1cHBvcnRlZCBieSB6c3dhcC4gVGhlIGZvbGlvIGlzIHVubG9ja2VkLFxcbi0gKiAgYnV0IE5PVCBtYXJrZWQgdXAtdG8tZGF0ZSwgc28gdGhhdCBhbiBJTyBlcnJvciBpcyBlbWl0dGVkIChlLmcuXFxuLSAqICBkb19zd2FwX3BhZ2UoKSB3aWxsIFNJR0JVUykuXFxuKyAqICAtRUlPOiBpZiB0aGUgc3dhcHBlZCBvdXQgY29udGVudCB3YXMgaW4genN3YXAgYnV0IGNvdWxkIG5vdCBiZSBoYW5kZWRcXG4rICogIGJhY2ssIGVpdGhlciBiZWNhdXNlIGRlY29tcHJlc3Npb24gZmFpbGVkIG9yIGJlY2F1c2UgYSBzbG90IGluIGFcXG4rICogIGxhcmdlLWZvbGlvIHJhbmdlIGlzIHN0aWxsIGluIHpzd2FwIGFuZCB6c3dhcCBjYW5ub3QgcmVjb25zdHJ1Y3QgYSBsYXJnZVxcbisgKiAgZm9saW8gZnJvbSBwZXItcGFnZSBlbnRyaWVzLiBUaGUgZm9saW8gaXMgdW5sb2NrZWQsIGJ1dCBOT1QgbWFya2VkXFxuKyAqICB1cC10by1kYXRlLCBzbyB0aGF0IGFuIElPIGVycm9yIGlzIGVtaXR0ZWQgKGUuZy4gZG9fc3dhcF9wYWdlKCkgd2lsbFxcbisgKiAgU0lHQlVTKS5cXG4gICpcXG4gICogIC1FTk9FTlQ6IGlmIHRoZSBzd2FwcGVkIG91dCBjb250ZW50IHdhcyBub3QgaW4genN3YXAuIFRoZSBmb2xpbyByZW1haW5zXFxuICAqICBsb2NrZWQgb24gcmV0dXJuLlxcbkBAIC0xNjA1LDEzICsxNjI4LDE4IEBAIGludCB6c3dhcF9sb2FkKHN0cnVjdCBmb2xpbyAqZm9saW8pXFxuIFxcdFxcdHJldHVybiAtRU5PRU5UO1xcbiBcXG4gXFx0LypcXG4tXFx0ICogTGFyZ2UgZm9saW9zIHNob3VsZCBub3QgYmUgc3dhcHBlZCBpbiB3aGlsZSB6c3dhcCBpcyBiZWluZyB1c2VkLCBhc1xcbi1cXHQgKiB0aGV5IGFyZSBub3QgcHJvcGVybHkgaGFuZGxlZC4gWnN3YXAgZG9lcyBub3QgcHJvcGVybHkgbG9hZCBsYXJnZVxcbi1cXHQgKiBmb2xpb3MsIGFuZCBhIGxhcmdlIGZvbGlvIG1heSBvbmx5IGJlIHBhcnRpYWxseSBpbiB6c3dhcC5cXG4rXFx0ICogQSBsYXJnZSBmb2xpbyBjYW4gbGVnaXRpbWF0ZWx5IHJlYWNoIHpzd2FwX2xvYWQoKSB3aXRoIGl0cyB3aG9sZVxcbitcXHQgKiByYW5nZSBvbiB0aGUgYmFja2luZyBkZXZpY2UsIHNvIHNjYW4gdGhlIHJhbmdlIHJhdGhlciB0aGFuIHJlamVjdGluZ1xcbitcXHQgKiBpdCBvdXRyaWdodC4gVGhlIGNhbGxlciBoYXMgcGlubmVkIGV2ZXJ5IHNsb3QsIHNvIHpzd2FwIGNhbm5vdCBzdGFydFxcbitcXHQgKiBhIHN0b3JlIG9yIGEgd3JpdGViYWNrIGludG8gdGhlIHJhbmdlIHdoaWxlIHdlIGxvb2suXFxuIFxcdCAqL1xcbi1cXHRpZiAoV0FSTl9PTl9PTkNFKGZvbGlvX3Rlc3RfbGFyZ2UoZm9saW8pKSkge1xcbi1cXHRcXHRmb2xpb191bmxvY2soZm9saW8pO1xcbi1cXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG4rXFx0aWYgKGZvbGlvX3Rlc3RfbGFyZ2UoZm9saW8pKSB7XFxuK1xcdFxcdGlmIChXQVJOX09OX09OQ0UoenN3YXBfaXNfcHJlc2VudChzd3AsXFxuK1xcdFxcdFxcdFxcdFxcdFxcdCAgZm9saW9fbnJfcGFnZXMoZm9saW8pKSkpIHtcXG4rXFx0XFx0XFx0Zm9saW9fdW5sb2NrKGZvbGlvKTtcXG4rXFx0XFx0XFx0cmV0dXJuIC1FSU87XFxuK1xcdFxcdH1cXG4rXFx0XFx0cmV0dXJuIC1FTk9FTlQ7XFxuIFxcdH1cXG4gXFxuIFxcdGVudHJ5ID0geGFfbG9hZCh0cmVlLCBvZmZzZXQpO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wN1QyMDozNzoxMC42NDM4NTYzN1oiLCJTZXEiOjIsIk5lc3RpbmciOjEsIlR5cGUiOiJhZ2VudCIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImNvcmUiLCJEdXJhdGlvbiI6MzE1NTI5MjE1MTUsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiU1dBUFwiLFxuICAgIFwiWlNXQVBcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJ6c3dhcF9sb2FkXCIsXG4gICAgXCJzd2FwX3JlYWRfZm9saW9cIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBtb2RpZmllcyBtZW1vcnkgbWFuYWdlbWVudCBsb2dpYyBpbiBtbS96c3dhcC5jIGJ5IGludHJvZHVjaW5nIHpzd2FwX2lzX3ByZXNlbnQoKSBhbmQgdXBkYXRpbmcgenN3YXBfbG9hZCgpIHRvIGluc3BlY3QgbGFyZ2UgZm9saW9zIGluc3RlYWQgb2YgdW5jb25kaXRpb25hbGx5IHJlamVjdGluZyB0aGVtLiBUaGlzIGNoYW5nZXMgY29yZSBzd2FwLWluIGhhbmRsaW5nIGFuZCBhc3NlcnRpb25zIGluIHJlYWNoYWJsZSBtbSBjb2RlLCB3YXJyYW50aW5nIGZ1enppbmcuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJJbnN0cnVjdGlvbiI6IllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBtYWludGFpbmVyIGFuZCBzZWN1cml0eSBlbmdpbmVlci5cbllvdXIgam9iIGlzIHRvIHJldmlldyBhIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQgZXZhbHVhdGUgd2hldGhlciBpdCB3YXJyYW50cyBmdXp6aW5nIHdpdGggc3l6a2FsbGVyLlxuXG5JTVBPUlRBTlQ6IFRoZSBjaGFuZ2VzIGhhdmUgQUxSRUFEWSBiZWVuIGFwcGxpZWQgYW5kIGNvbW1pdHRlZCBhcyB0aGUgSEVBRCBjb21taXQgaW5cbnlvdXIgd29ya3NwYWNlLiBEbyBOT1QgcmVseSBvbiBpbnRlcm5hbCBhc3N1bXB0aW9ucy4gWW91IG11c3QgYWN0aXZlbHkgdXNlIHlvdXIgY29kZSBhY2Nlc3NcbnRvb2xzIHRvIGluc3BlY3QgdGhlIGFjdHVhbCBzb3VyY2UgY29kZSwgY2FsbGVycywgYW5kIHN1cnJvdW5kaW5nIGNvbnRleHQuXG5cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4xLiBDT1JFIFRSSUFHRSBQSElMT1NPUEhZXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuVGhlIGdvYWwgb2YgcGF0Y2ggZnV6emluZyBpcyB0byBkaXNjb3ZlciBjcmFzaGVzLCByZWdyZXNzaW9ucywgZXhwb3NlZCBsYXRlbnQgYnVncyxcbmFuZCBuZXdseSB0cmlnZ2VyZWQgYXNzZXJ0aW9ucyBpbnRyb2R1Y2VkIGJ5IHRoZSBwYXRjaCBzZXJpZXMuXG5cbi0gUkVBQ0hBQklMSVRZIElTIFRIRSBQUklNQVJZIEdBVEU6XG4gIEZ1enppbmcgY2FuIG9ubHkgZGlzY292ZXIgYnVncyBpbiBjb2RlIHRoYXQgY2FuIGFjdHVhbGx5IGV4ZWN1dGUgaW4gc3RhbmRhcmQgdmlydHVhbGl6ZWRcbiAgZW52aXJvbm1lbnRzIChHQ0Ugb3IgUUVNVSwgdXRpbGl6aW5nIHNvZnR3YXJlLWVtdWxhdGVkIGRldmljZXMgbGlrZSBVU0IgZ2FkZ2V0cywgbmV0ZGV2LCB0dW4vdGFwKS5cbiAgSWYgdGhlIG1vZGlmaWVkIGNvZGUgaXMgc3RydWN0dXJhbGx5IHVucmVhY2hhYmxlIChzZWUgU2VjdGlvbiAyKSwgaXQgTVVTVCBOT1QgYmUgZnV6emVkLFxuICByZWdhcmRsZXNzIG9mIHdoZXRoZXIgaXQgYWRkcyBhc3NlcnRpb25zIG9yIGNvbXBsZXggbG9naWMuXG5cbi0gRE8gTk9UIEJMSU5ETFkgVFJVU1QgXCJOTyBGVU5DVElPTkFMIENIQU5HRVwiIChORkNJKSBPUiBcIlJFRkFDVE9SSU5HXCIgQ0xBSU1TOlxuICBQYXRjaCBhdXRob3JzIHJvdXRpbmVseSBsYWJlbCBjaGFuZ2VzIGFzIFwiY2xlYW51cHNcIiwgXCJyZWZhY3RvcmluZ3NcIiwgb3Igc3RhdGVcbiAgXCJObyBmdW5jdGlvbmFsIGNoYW5nZSBpbnRlbmRlZFwiLiBEbyBOT1QgdGFrZSB0aGVzZSBjbGFpbXMgYXQgZmFjZSB2YWx1ZS5cbiAgQ29kZSByZWZhY3RvcmluZ3MgdGhhdCByZWFycmFuZ2UgbG9naWMsIGludHJvZHVjZSBoZWxwZXIgZnVuY3Rpb25zLCBvciBhbHRlciBzdGF0ZSBtYW5hZ2VtZW50XG4gIGluIGNvcmUgc3Vic3lzdGVtcyBmcmVxdWVudGx5IGludHJvZHVjZSBzdWJ0bGUgc2VtYW50aWMgc2hpZnRzIG9yIHVuY292ZXIgbGF0ZW50IGtlcm5lbCBidWdzLlxuICBJZiByZWFjaGFibGUgZXhlY3V0YWJsZSBjb2RlIGlzIG1vZGlmaWVkIG9yIHJlZmFjdG9yZWQsIGl0IE1VU1QgYmUgZnV6emVkLlxuXG4tIE5FVyBPUiBNT0RJRklFRCBBU1NFUlRJT05TIElOIFJFQUNIQUJMRSBDT0RFIE1VU1QgQkUgRlVaWkVEOlxuICBXaGVuIGEgcGF0Y2ggaW50cm9kdWNlcyBvciBtb2RpZmllcyBydW50aW1lIGNoZWNrcyBvciBhc3NlcnRpb25zIChlLmcuLCBXQVJOX09OKiwgVk1fV0FSTl9PTiosXG4gIEJVR19PTiosIGxvY2tkZXBfYXNzZXJ0KikgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMsIGl0IGVuZm9yY2VzIG5ldyBvciBzdHJpY3RlciBpbnZhcmlhbnRzLlxuICBFdmVuIGlmIHRoZSBhdXRob3IgYmVsaWV2ZXMgdGhlIGludmFyaWFudCBhbHdheXMgaG9sZHMsIGZ1enppbmcgaXMgZXNzZW50aWFsIHRvIHZlcmlmeSB3aGV0aGVyXG4gIGFuIHVudXN1YWwgc2VxdWVuY2Ugb2Ygb3BlcmF0aW9ucyBjYW4gdmlvbGF0ZSBpdC5cblxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbjIuIFdIRU4gVE8gUkVUVVJOIFdvcnRoRnV6emluZz1mYWxzZSAoTkVHQVRJVkUgQ1JJVEVSSUEpXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuUmV0dXJuIFdvcnRoRnV6emluZz1mYWxzZSBPTkxZIElGIGFsbCBtb2RpZmllZCBjb2RlIGZhbGxzIHN0cmljdGx5IGludG8gb25lIG9yIG1vcmUgb2YgdGhlc2UgY2F0ZWdvcmllczpcblxuLSBOb24ta2VybmVsIGFuZCBub24tZXhlY3V0YWJsZSBjaGFuZ2VzOlxuICAqIE1vZGlmaWNhdGlvbnMgdG8gRG9jdW1lbnRhdGlvbi8sIGNvbW1lbnRzLCBvciBzcGVsbGluZyBmaXhlcy5cbiAgKiBVc2VyLXNwYWNlIGRpcmVjdG9yaWVzLCBzZWxmLXRlc3RzLCBzYW1wbGVzLCBvciBzY3JpcHRzIChlLmcuLCB0b29scy8sIHNhbXBsZXMvLCBzY3JpcHRzLywgdXNyLylcbiAgICB0aGF0IGRvIG5vdCBhZmZlY3QgdGhlIGNvbXBpbGVkIGtlcm5lbCBpbWFnZSAodm1saW51eCkgb3Iga2VybmVsIG1vZHVsZXMuXG4gICogUHVyZWx5IGRlY29yYXRpdmUgbG9nZ2luZyAoZS5nLiwgbWVzc2FnZSBzdHJpbmdzIGluIHByX2VyciwgcHJpbnRrLCBkZXZfaW5mbykgb3IgdHJhY2Vwb2ludHNcbiAgICB0aGF0IGRvIG5vdCBhbHRlciBjb250cm9sIGZsb3cgb3IgZGF0YSBzdHJ1Y3R1cmVzLlxuICAqIEJ1aWxkIHN5c3RlbSBvciBLY29uZmlnIGNoYW5nZXMgdGhhdCBkbyBub3QgYWx0ZXIgY29tcGlsZWQgQyBsb2dpYy5cbi0gU3RydWN0dXJhbGx5IHVucmVhY2hhYmxlIGhhcmR3YXJlOlxuICAqIFZlbmRvci1zcGVjaWZpYyBQQ0llIHN3aXRjaGVzLCBTbWFydE5JQ3MsIG9yIEdQVSBkcml2ZXJzIChlLmcuLCBtbHhzdywgcGRzX2NvcmUsIHFlZCxcbiAgICBpb25pYywgYW1kZ3B1KSByZXF1aXJpbmcgcGh5c2ljYWwgQVNJQy9QQ0llIGNhcmRzIG5vdCBlbXVsYXRlZCBpbiBzdGFuZGFyZCBRRU1VLlxuLSBVbnJlYWNoYWJsZSBleGVjdXRpb24gcGF0aHM6XG4gICogRHJpdmVyIHRlYXJkb3duIGNhbGxiYWNrcyAoLnJlbW92ZSwgLnNodXRkb3duLCBwY2lfdW5yZWdpc3Rlcl9kcml2ZXIpIGV4ZWN1dGVkIG9ubHkgZHVyaW5nXG4gICAgcGh5c2ljYWwgUENJIGhvdC11bnBsdWcgb3IgbWFudWFsIHN5c2ZzIGRyaXZlciB1bmJpbmRpbmcuXG4gICogQ29kZSBwYXRocyBleGNsdXNpdmUgdG8gYXJjaGl0ZWN0dXJlcyBvdGhlciB0aGFuIHRoZSB0YXJnZXQgYXJjaGl0ZWN0dXJlLlxuXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuMy4gV0hFTiBUTyBSRVRVUk4gV29ydGhGdXp6aW5nPXRydWUgKFBPU0lUSVZFIENSSVRFUklBKVxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblJldHVybiBXb3J0aEZ1enppbmc9dHJ1ZSB3aGVuZXZlciB0aGUgcGF0Y2ggdG91Y2hlcyByZWFjaGFibGUgZXhlY3V0YWJsZSBjb2RlLCBpbmNsdWRpbmc6XG4tIENvcmUgU3Vic3lzdGVtczpcbiAgKiBBbnkgbG9naWMgbW9kaWZpY2F0aW9ucyBpbiBtZW1vcnkgbWFuYWdlbWVudCAobW0vKSwgc3luY2hyb25pemF0aW9uL2xvY2tpbmcgKGtlcm5lbC9sb2NraW5nLyksXG4gICAgQlBGLCBzY2hlZHVsZXIsIGNvcmUgbmV0d29ya2luZywgVkZTLCBvciBzeXNjYWxsIGhhbmRsaW5nLlxuLSBSZWZhY3RvcmluZ3MgYW5kIENvZGUgQ2xlYW51cHM6XG4gICogQW55IHJlc3RydWN0dXJpbmcgb2YgcmVhY2hhYmxlIGRhdGEgc3RydWN0dXJlcywgaGVscGVyIGFic3RyYWN0aW9ucywgb3IgYWxnb3JpdGhtIGZsb3dzLlxuLSBSdW50aW1lIEFzc2VydGlvbnMgYW5kIERlZmVuc2l2ZSBDaGVja3M6XG4gICogQW55IGludHJvZHVjdGlvbiBvciBhbHRlcmF0aW9uIG9mIGFzc2VydGlvbnMgKFdBUk5fT04qLCBWTV9XQVJOX09OKiwgQlVHX09OKiwgZXRjLikgaW4gcmVhY2hhYmxlIHBhdGhzLlxuLSBSZWFjaGFibGUgRHJpdmVycyBhbmQgUHJvdG9jb2xzOlxuICAqIERyaXZlcnMgYWNjZXNzaWJsZSB2aWEgdmlydHVhbCBidXNlcyAodmlydGlvLCBVU0IgZ2FkZ2V0LCBsb29wYmFjaywgbmV0bGluaywgYmluZGVyLCBzb2NrZXRzLCBldGMuKS5cblxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbjQuIEVYVFJBQ1RJTkcgRm9jdXNTeW1ib2xzIChQUkVWRU5USU5HIERJTFVUSU9OKVxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbldoZW4gV29ydGhGdXp6aW5nPXRydWUsIHlvdSBtdXN0IGV4dHJhY3Qgc3BlY2lmaWMga2VybmVsIGZ1bmN0aW9ucyBpbnRvIEZvY3VzU3ltYm9scyB0byBndWlkZSB0aGUgZnV6emVyOlxuXG4tIEFWT0lEIFVCSVFVSVRPVVMgTElGRUNZQ0xFIEhPVC1QQVRIUzpcbiAgRG8gTk9UIGxpc3QgZ2VuZXJpYywgdWJpcXVpdG91cyBmdW5jdGlvbnMgY2FsbGVkIGJ5IGFsbW9zdCBldmVyeSBwcm9ncmFtIGluIHRoZSBjb3JwdXNcbiAgKGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvOiBnZW5lcmFsIG1lbW9yeSBhbGxvY2F0b3JzIGFuZCBkZWFsbG9jYXRvcnMsIHBhZ2UgZmF1bHRcbiAgYW5kIHRyYXAgaGFuZGxlcnMsIG9yIGNvcmUgc3luY2hyb25pemF0aW9uIHByaW1pdGl2ZXM7IHRoaXMgaXMgbm90IGFuIGV4aGF1c3RpdmUgbGlzdCkuXG4gIExpc3RpbmcgdWJpcXVpdG91cyBmdW5jdGlvbnMgY2F1c2VzIHRoZSBmdXp6ZXIgdG8gY2xhc3NpZnkgdGhvdXNhbmRzIG9mIHVucmVsYXRlZCB0ZXN0cyBhcyBcImZvY3VzZWRcIixcbiAgd2hpY2ggc2V2ZXJlbHkgZGlsdXRlcyBmdXp6aW5nIGVmZm9ydCBhd2F5IGZyb20gdGhlIGFjdHVhbCBjaGFuZ2VzLlxuXG4tIFRBUkdFVCBTUEVDSUZJQyBGRUFUVVJFIExPR0lDIEFORCBFTlRSWVBPSU5UUzpcbiAgTGlzdCBmdW5jdGlvbnMgdGhhdCBzcGVjaWZpY2FsbHkgaW1wbGVtZW50IHRoZSBsb2dpYyBiZWluZyBhZGRlZCBvciBhbHRlcmVkLCBvciBkaXJlY3QgQVBJIGVudHJ5cG9pbnRzXG4gIGZvciB0aGUgc3Vic3lzdGVtIGZlYXR1cmUgdW5kZXIgcmV2aWV3LlxuXG4tIEhBTkRMSU5HIFNUQVRJQyBJTkxJTkUgRlVOQ1RJT05TIElOIEhFQURFUlMgKC5oKTpcbiAgQ29tcGlsZXItaW5saW5lZCBzdGF0aWMgZnVuY3Rpb25zIChzdWNoIGFzIHN0YXRpYyBpbmxpbmVzIGluIG1tLyouaCBvciBpbmNsdWRlL2xpbnV4LyouaCkgbGFja1xuICBkaXN0aW5jdCBzeW1ib2wgYWRkcmVzc2VzIGluIHZtbGludXggYW5kIGNhbm5vdCBiZSB0YXJnZXRlZCBkaXJlY3RseSBieSBzeW1ib2wgY292ZXJhZ2UgZmlsdGVycy5cbiAgSWYgdGhlIGNoYW5nZXMgYXJlIHByaW1hcmlseSBpbiBzdGF0aWMgaW5saW5lIGhlbHBlcnMsIGlkZW50aWZ5IG5vbi1zdGF0aWMsIGZlYXR1cmUtc3BlY2lmaWMgY2FsbGVyXG4gIGZ1bmN0aW9ucyBpbiAuYyBmaWxlcyB0aGF0IGV4ZXJjaXNlIHRoZW0gKGF2b2lkaW5nIHViaXF1aXRvdXMgbGlmZWN5Y2xlIHdyYXBwZXJzKS5cblxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbjUuIElERU5USUZZSU5HIEVuYWJsZUNvbmZpZ3Ncbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5JZGVudGlmeSBhbnkgc3BlY2lmaWMgQ09ORklHXyBvcHRpb25zIHJlcXVpcmVkIHRvIHByb3Blcmx5IGNvbXBpbGUgYW5kIHJlYWNoIHRoZSBtb2RpZmllZCBjb2RlOlxuLSBJbnNwZWN0IEtjb25maWcgZmlsZXMgYW5kICNpZmRlZiBndWFyZHM7IGRvIG5vdCBtYWtlIGFzc3VtcHRpb25zLlxuLSBDaGVjayBcImRlcGVuZHMgb25cIiBsaW5lcyBpbiBLY29uZmlnIHRvIGluY2x1ZGUgYW55IG5vbi1zdGFuZGFyZCBwYXJlbnQgc3Vic3lzdGVtIGNvbmZpZ3MgbmVlZGVkLlxuLSBTdHJpcCBhbnkgJ0NPTkZJR18nIHByZWZpeCAoZS5nLiwgcmV0dXJuIFwiTkVUX0lQVjRcIiBpbnN0ZWFkIG9mIFwiQ09ORklHX05FVF9JUFY0XCIpLlxuUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuXG5cblxuVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy5cbkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LlxuSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLlxuIiwiUHJvbXB0IjoiVGFyZ2V0IGFyY2hpdGVjdHVyZTogYW1kNjRcblxuRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6XG5jb21taXQgMGFjZTJkYjM1MWFkMGE3ZWRiOTBhNmNhMDQ5MzU3NDhiYmM3MmZkMVxuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBNb24gU2VwIDcgMjA6Mzc6MDkgMjAyNiArMDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS9tbS96c3dhcC5jIGIvbW0venN3YXAuY1xuaW5kZXggMzdmMzRlNDA2YzhlMy4uZmQzNmFjMzhlOWExZSAxMDA2NDRcbi0tLSBhL21tL3pzd2FwLmNcbisrKyBiL21tL3pzd2FwLmNcbkBAIC0xNTcxLDYgKzE1NzEsMzIgQEAgYm9vbCB6c3dhcF9zdG9yZShzdHJ1Y3QgZm9saW8gKmZvbGlvKVxuIFx0cmV0dXJuIHJldDtcbiB9XG4gXG4rLyoqXG4rICogenN3YXBfaXNfcHJlc2VudCgpIC0gaXMgYW55IHNsb3QgaW4gW2VudHJ5LCBlbnRyeSArIG5yKSBpbiB6c3dhcD9cbisgKiBAZW50cnk6IGJhc2Ugc3dhcCBlbnRyeSBvZiB0aGUgcmFuZ2VcbisgKiBAbnI6IG51bWJlciBvZiBjb250aWd1b3VzIHNsb3RzIHRvIGNoZWNrXG4rICpcbisgKiBDb250ZXh0OiBUaGUgY2FsbGVyIG11c3Qga2VlcCB0aGUgcmFuZ2UgcGlubmVkLCBvdGhlcndpc2UgdGhlIGFuc3dlciBjYW5cbisgKiBjaGFuZ2UgdW5kZXIgaXQuXG4rICogUmV0dXJuOiB0cnVlIGlmIGF0IGxlYXN0IG9uZSBzbG90IGluIHRoZSByYW5nZSBpcyBpbiB6c3dhcC5cbisgKi9cbitzdGF0aWMgYm9vbCB6c3dhcF9pc19wcmVzZW50KHN3cF9lbnRyeV90IGVudHJ5LCB1bnNpZ25lZCBpbnQgbnIpXG4re1xuK1x0cGdvZmZfdCBvZmZzZXQgPSBzd3Bfb2Zmc2V0KGVudHJ5KTtcbitcdHN0cnVjdCB4YXJyYXkgKnRyZWUgPSBzd2FwX3pzd2FwX3RyZWUoZW50cnkpO1xuK1x0dW5zaWduZWQgbG9uZyBpbmRleCA9IG9mZnNldDtcbitcbitcdC8qXG4rXHQgKiBBIHBpbm5lZCByYW5nZSBpcyBhdCBtb3N0IFNXQVBGSUxFX0NMVVNURVIgc2xvdHMgYW5kIGlzIGFsaWduZWQgdG9cbitcdCAqIGl0cyBvd24gc2l6ZSwgc28gb25lIHRyZWUgY292ZXJzIGFsbCBvZiBpdCBhbmQgYSBzaW5nbGUgbG9va3VwIGlzXG4rXHQgKiBlbm91Z2guIFNjYW5uaW5nIG9ubHkgcGFydCBvZiB0aGUgcmFuZ2Ugd291bGQgcmVwb3J0IGEgZmFsc2VcbitcdCAqIFwiYWJzZW50XCIgYW5kIGxldCB0aGUgY2FsbGVyIHJlYWQgYSBzdGFsZSBjb3B5IGZyb20gdGhlIGRldmljZS5cbitcdCAqL1xuK1x0QlVJTERfQlVHX09OKFNXQVBGSUxFX0NMVVNURVIgXHUwMDNlIFpTV0FQX0FERFJFU1NfU1BBQ0VfUEFHRVMpO1xuK1xuK1x0cmV0dXJuIHhhX2ZpbmQodHJlZSwgXHUwMDI2aW5kZXgsIG9mZnNldCArIG5yIC0gMSwgWEFfUFJFU0VOVCk7XG4rfVxuK1xuIC8qKlxuICAqIHpzd2FwX2xvYWQoKSAtIGxvYWQgYSBmb2xpbyBmcm9tIHpzd2FwXG4gICogQGZvbGlvOiBmb2xpbyB0byBsb2FkXG5AQCAtMTU3OCwxNSArMTYwNCwxMiBAQCBib29sIHpzd2FwX3N0b3JlKHN0cnVjdCBmb2xpbyAqZm9saW8pXG4gICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIHdpdGggdGhlIGZvbGlvIHVubG9ja2VkIGFuZCBtYXJrZWQgdXAtdG8tZGF0ZSwgb3Igb25lXG4gICogb2YgdGhlIGZvbGxvd2luZyBlcnJvciBjb2RlczpcbiAgKlxuLSAqICAtRUlPOiBpZiB0aGUgc3dhcHBlZCBvdXQgY29udGVudCB3YXMgaW4genN3YXAsIGJ1dCBjb3VsZCBub3QgYmUgbG9hZGVkXG4tICogIGludG8gdGhlIHBhZ2UgZHVlIHRvIGEgZGVjb21wcmVzc2lvbiBmYWlsdXJlLiBUaGUgZm9saW8gaXMgdW5sb2NrZWQsIGJ1dFxuLSAqICBOT1QgbWFya2VkIHVwLXRvLWRhdGUsIHNvIHRoYXQgYW4gSU8gZXJyb3IgaXMgZW1pdHRlZCAoZS5nLiBkb19zd2FwX3BhZ2UoKVxuLSAqICB3aWxsIFNJR0JVUykuXG4tICpcbi0gKiAgLUVJTlZBTDogaWYgdGhlIHN3YXBwZWQgb3V0IGNvbnRlbnQgd2FzIGluIHpzd2FwLCBidXQgdGhlIHBhZ2UgYmVsb25nc1xuLSAqICB0byBhIGxhcmdlIGZvbGlvLCB3aGljaCBpcyBub3Qgc3VwcG9ydGVkIGJ5IHpzd2FwLiBUaGUgZm9saW8gaXMgdW5sb2NrZWQsXG4tICogIGJ1dCBOT1QgbWFya2VkIHVwLXRvLWRhdGUsIHNvIHRoYXQgYW4gSU8gZXJyb3IgaXMgZW1pdHRlZCAoZS5nLlxuLSAqICBkb19zd2FwX3BhZ2UoKSB3aWxsIFNJR0JVUykuXG4rICogIC1FSU86IGlmIHRoZSBzd2FwcGVkIG91dCBjb250ZW50IHdhcyBpbiB6c3dhcCBidXQgY291bGQgbm90IGJlIGhhbmRlZFxuKyAqICBiYWNrLCBlaXRoZXIgYmVjYXVzZSBkZWNvbXByZXNzaW9uIGZhaWxlZCBvciBiZWNhdXNlIGEgc2xvdCBpbiBhXG4rICogIGxhcmdlLWZvbGlvIHJhbmdlIGlzIHN0aWxsIGluIHpzd2FwIGFuZCB6c3dhcCBjYW5ub3QgcmVjb25zdHJ1Y3QgYSBsYXJnZVxuKyAqICBmb2xpbyBmcm9tIHBlci1wYWdlIGVudHJpZXMuIFRoZSBmb2xpbyBpcyB1bmxvY2tlZCwgYnV0IE5PVCBtYXJrZWRcbisgKiAgdXAtdG8tZGF0ZSwgc28gdGhhdCBhbiBJTyBlcnJvciBpcyBlbWl0dGVkIChlLmcuIGRvX3N3YXBfcGFnZSgpIHdpbGxcbisgKiAgU0lHQlVTKS5cbiAgKlxuICAqICAtRU5PRU5UOiBpZiB0aGUgc3dhcHBlZCBvdXQgY29udGVudCB3YXMgbm90IGluIHpzd2FwLiBUaGUgZm9saW8gcmVtYWluc1xuICAqICBsb2NrZWQgb24gcmV0dXJuLlxuQEAgLTE2MDUsMTMgKzE2MjgsMTggQEAgaW50IHpzd2FwX2xvYWQoc3RydWN0IGZvbGlvICpmb2xpbylcbiBcdFx0cmV0dXJuIC1FTk9FTlQ7XG4gXG4gXHQvKlxuLVx0ICogTGFyZ2UgZm9saW9zIHNob3VsZCBub3QgYmUgc3dhcHBlZCBpbiB3aGlsZSB6c3dhcCBpcyBiZWluZyB1c2VkLCBhc1xuLVx0ICogdGhleSBhcmUgbm90IHByb3Blcmx5IGhhbmRsZWQuIFpzd2FwIGRvZXMgbm90IHByb3Blcmx5IGxvYWQgbGFyZ2Vcbi1cdCAqIGZvbGlvcywgYW5kIGEgbGFyZ2UgZm9saW8gbWF5IG9ubHkgYmUgcGFydGlhbGx5IGluIHpzd2FwLlxuK1x0ICogQSBsYXJnZSBmb2xpbyBjYW4gbGVnaXRpbWF0ZWx5IHJlYWNoIHpzd2FwX2xvYWQoKSB3aXRoIGl0cyB3aG9sZVxuK1x0ICogcmFuZ2Ugb24gdGhlIGJhY2tpbmcgZGV2aWNlLCBzbyBzY2FuIHRoZSByYW5nZSByYXRoZXIgdGhhbiByZWplY3RpbmdcbitcdCAqIGl0IG91dHJpZ2h0LiBUaGUgY2FsbGVyIGhhcyBwaW5uZWQgZXZlcnkgc2xvdCwgc28genN3YXAgY2Fubm90IHN0YXJ0XG4rXHQgKiBhIHN0b3JlIG9yIGEgd3JpdGViYWNrIGludG8gdGhlIHJhbmdlIHdoaWxlIHdlIGxvb2suXG4gXHQgKi9cbi1cdGlmIChXQVJOX09OX09OQ0UoZm9saW9fdGVzdF9sYXJnZShmb2xpbykpKSB7XG4tXHRcdGZvbGlvX3VubG9jayhmb2xpbyk7XG4tXHRcdHJldHVybiAtRUlOVkFMO1xuK1x0aWYgKGZvbGlvX3Rlc3RfbGFyZ2UoZm9saW8pKSB7XG4rXHRcdGlmIChXQVJOX09OX09OQ0UoenN3YXBfaXNfcHJlc2VudChzd3AsXG4rXHRcdFx0XHRcdFx0ICBmb2xpb19ucl9wYWdlcyhmb2xpbykpKSkge1xuK1x0XHRcdGZvbGlvX3VubG9jayhmb2xpbyk7XG4rXHRcdFx0cmV0dXJuIC1FSU87XG4rXHRcdH1cbitcdFx0cmV0dXJuIC1FTk9FTlQ7XG4gXHR9XG4gXG4gXHRlbnRyeSA9IHhhX2xvYWQodHJlZSwgb2Zmc2V0KTtcbiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA3VDIwOjM3OjEwLjY0Mzg1ODExWiIsIlNlcSI6MywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6NzgyMDU5ODgyMCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgdGhlIFpzd2FwIFBhdGNoKipcblxuT2theSwgbGV0J3MgZGl2ZSBpbnRvIHRoaXMuIEZpcnN0LCBJIG5lZWQgdG8gZ2V0IGEgY2xlYXIgdW5kZXJzdGFuZGluZyBvZiB0aGUgcGF0Y2ggaXRzZWxmIGFuZCBleGFjdGx5IHdoYXQgcmVxdWlyZW1lbnRzIGl0J3MgYWRkcmVzc2luZy4gVGhlIGNvcmUgb2YgdGhlIG1vZGlmaWNhdGlvbiBzZWVtcyB0byBiZSBpbiBgbW0venN3YXAuY2AuIFJpZ2h0LCBzbyBJJ2xsIG5lZWQgdG8gc2NydXRpbml6ZSB0aGUgY2hhbmdlcyBtYWRlIHdpdGhpbiB0aGF0IGZpbGUuIEknbGwgcHJvYmFibHkgZmlyZSB1cCBgZ3JlcHBlcmAgb3IganVzdCBxdWlja2x5IHJlYWQgdGhlIGZpbGUuIFRoaXMgaXMgcm91dGluZSwgYnV0IEkgd2FudCB0byBtYWtlIHN1cmUgSSBkb24ndCBtaXNzIGFueXRoaW5nLlxuXG5Mb29rcyBsaWtlIHRoZSByZWxldmFudCBzZWN0aW9uIGlzIGFyb3VuZCBsaW5lcyAxNTcwIHRvIDE2NDAgaW4gYG1tL3pzd2FwLmNgLiBPa2F5LCB0aW1lIHRvIHB1bGwgdXAgdGhhdCBjb2RlIGJsb2NrIGFuZCBnZXQgYSBnb29kIGxvb2sgYXQgdGhlIGNoYW5nZXMgYW5kIHdoYXQncyBnb2luZyBvbiBhcm91bmQgdGhlbS4gTmVlZCB0byB1bmRlcnN0YW5kIHRoZSBjb250ZXh0IG9mIHRoaXMgc3BlY2lmaWMgYXJlYSBhbmQgaG93IGl0J3MgYmVpbmcgYWZmZWN0ZWQuIExldCdzIHNlZS4uLlxuXG5cbiIsIklucHV0VG9rZW5zIjozNzk4LCJPdXRwdXRUb2tlbnMiOjM1LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NjUsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wN1QyMDozNzoxOC40NjQ0NTg5NFoiLCJTZXEiOjQsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjExNDIxMCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJtbS96c3dhcC5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDE1NjUsXG4gIFwiTGluZUNvdW50XCI6IDg1XG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIjE1NjU6XFx0XFx0XFx0XFx0ZW50cnkgPSB4YV9lcmFzZSh0cmVlLCBvZmZzZXQgKyBpbmRleCk7XFxuMTU2NjpcXHRcXHRcXHRcXHRpZiAoZW50cnkpXFxuMTU2NzpcXHRcXHRcXHRcXHRcXHR6c3dhcF9lbnRyeV9mcmVlKGVudHJ5KTtcXG4xNTY4OlxcdFxcdFxcdH1cXG4xNTY5OlxcdFxcdH1cXG4xNTcwOlxcdFxcbjE1NzE6XFx0XFx0cmV0dXJuIHJldDtcXG4xNTcyOlxcdH1cXG4xNTczOlxcdFxcbjE1NzQ6XFx0LyoqXFxuMTU3NTpcXHQgKiB6c3dhcF9pc19wcmVzZW50KCkgLSBpcyBhbnkgc2xvdCBpbiBbZW50cnksIGVudHJ5ICsgbnIpIGluIHpzd2FwP1xcbjE1NzY6XFx0ICogQGVudHJ5OiBiYXNlIHN3YXAgZW50cnkgb2YgdGhlIHJhbmdlXFxuMTU3NzpcXHQgKiBAbnI6IG51bWJlciBvZiBjb250aWd1b3VzIHNsb3RzIHRvIGNoZWNrXFxuMTU3ODpcXHQgKlxcbjE1Nzk6XFx0ICogQ29udGV4dDogVGhlIGNhbGxlciBtdXN0IGtlZXAgdGhlIHJhbmdlIHBpbm5lZCwgb3RoZXJ3aXNlIHRoZSBhbnN3ZXIgY2FuXFxuMTU4MDpcXHQgKiBjaGFuZ2UgdW5kZXIgaXQuXFxuMTU4MTpcXHQgKiBSZXR1cm46IHRydWUgaWYgYXQgbGVhc3Qgb25lIHNsb3QgaW4gdGhlIHJhbmdlIGlzIGluIHpzd2FwLlxcbjE1ODI6XFx0ICovXFxuMTU4MzpcXHRzdGF0aWMgYm9vbCB6c3dhcF9pc19wcmVzZW50KHN3cF9lbnRyeV90IGVudHJ5LCB1bnNpZ25lZCBpbnQgbnIpXFxuMTU4NDpcXHR7XFxuMTU4NTpcXHRcXHRwZ29mZl90IG9mZnNldCA9IHN3cF9vZmZzZXQoZW50cnkpO1xcbjE1ODY6XFx0XFx0c3RydWN0IHhhcnJheSAqdHJlZSA9IHN3YXBfenN3YXBfdHJlZShlbnRyeSk7XFxuMTU4NzpcXHRcXHR1bnNpZ25lZCBsb25nIGluZGV4ID0gb2Zmc2V0O1xcbjE1ODg6XFx0XFxuMTU4OTpcXHRcXHQvKlxcbjE1OTA6XFx0XFx0ICogQSBwaW5uZWQgcmFuZ2UgaXMgYXQgbW9zdCBTV0FQRklMRV9DTFVTVEVSIHNsb3RzIGFuZCBpcyBhbGlnbmVkIHRvXFxuMTU5MTpcXHRcXHQgKiBpdHMgb3duIHNpemUsIHNvIG9uZSB0cmVlIGNvdmVycyBhbGwgb2YgaXQgYW5kIGEgc2luZ2xlIGxvb2t1cCBpc1xcbjE1OTI6XFx0XFx0ICogZW5vdWdoLiBTY2FubmluZyBvbmx5IHBhcnQgb2YgdGhlIHJhbmdlIHdvdWxkIHJlcG9ydCBhIGZhbHNlXFxuMTU5MzpcXHRcXHQgKiBcXFwiYWJzZW50XFxcIiBhbmQgbGV0IHRoZSBjYWxsZXIgcmVhZCBhIHN0YWxlIGNvcHkgZnJvbSB0aGUgZGV2aWNlLlxcbjE1OTQ6XFx0XFx0ICovXFxuMTU5NTpcXHRcXHRCVUlMRF9CVUdfT04oU1dBUEZJTEVfQ0xVU1RFUiBcXHUwMDNlIFpTV0FQX0FERFJFU1NfU1BBQ0VfUEFHRVMpO1xcbjE1OTY6XFx0XFxuMTU5NzpcXHRcXHRyZXR1cm4geGFfZmluZCh0cmVlLCBcXHUwMDI2aW5kZXgsIG9mZnNldCArIG5yIC0gMSwgWEFfUFJFU0VOVCk7XFxuMTU5ODpcXHR9XFxuMTU5OTpcXHRcXG4xNjAwOlxcdC8qKlxcbjE2MDE6XFx0ICogenN3YXBfbG9hZCgpIC0gbG9hZCBhIGZvbGlvIGZyb20genN3YXBcXG4xNjAyOlxcdCAqIEBmb2xpbzogZm9saW8gdG8gbG9hZFxcbjE2MDM6XFx0ICpcXG4xNjA0OlxcdCAqIFJldHVybjogMCBvbiBzdWNjZXNzLCB3aXRoIHRoZSBmb2xpbyB1bmxvY2tlZCBhbmQgbWFya2VkIHVwLXRvLWRhdGUsIG9yIG9uZVxcbjE2MDU6XFx0ICogb2YgdGhlIGZvbGxvd2luZyBlcnJvciBjb2RlczpcXG4xNjA2OlxcdCAqXFxuMTYwNzpcXHQgKiAgLUVJTzogaWYgdGhlIHN3YXBwZWQgb3V0IGNvbnRlbnQgd2FzIGluIHpzd2FwIGJ1dCBjb3VsZCBub3QgYmUgaGFuZGVkXFxuMTYwODpcXHQgKiAgYmFjaywgZWl0aGVyIGJlY2F1c2UgZGVjb21wcmVzc2lvbiBmYWlsZWQgb3IgYmVjYXVzZSBhIHNsb3QgaW4gYVxcbjE2MDk6XFx0ICogIGxhcmdlLWZvbGlvIHJhbmdlIGlzIHN0aWxsIGluIHpzd2FwIGFuZCB6c3dhcCBjYW5ub3QgcmVjb25zdHJ1Y3QgYSBsYXJnZVxcbjE2MTA6XFx0ICogIGZvbGlvIGZyb20gcGVyLXBhZ2UgZW50cmllcy4gVGhlIGZvbGlvIGlzIHVubG9ja2VkLCBidXQgTk9UIG1hcmtlZFxcbjE2MTE6XFx0ICogIHVwLXRvLWRhdGUsIHNvIHRoYXQgYW4gSU8gZXJyb3IgaXMgZW1pdHRlZCAoZS5nLiBkb19zd2FwX3BhZ2UoKSB3aWxsXFxuMTYxMjpcXHQgKiAgU0lHQlVTKS5cXG4xNjEzOlxcdCAqXFxuMTYxNDpcXHQgKiAgLUVOT0VOVDogaWYgdGhlIHN3YXBwZWQgb3V0IGNvbnRlbnQgd2FzIG5vdCBpbiB6c3dhcC4gVGhlIGZvbGlvIHJlbWFpbnNcXG4xNjE1OlxcdCAqICBsb2NrZWQgb24gcmV0dXJuLlxcbjE2MTY6XFx0ICovXFxuMTYxNzpcXHRpbnQgenN3YXBfbG9hZChzdHJ1Y3QgZm9saW8gKmZvbGlvKVxcbjE2MTg6XFx0e1xcbjE2MTk6XFx0XFx0c3dwX2VudHJ5X3Qgc3dwID0gZm9saW8tXFx1MDAzZXN3YXA7XFxuMTYyMDpcXHRcXHRwZ29mZl90IG9mZnNldCA9IHN3cF9vZmZzZXQoc3dwKTtcXG4xNjIxOlxcdFxcdHN0cnVjdCB4YXJyYXkgKnRyZWUgPSBzd2FwX3pzd2FwX3RyZWUoc3dwKTtcXG4xNjIyOlxcdFxcdHN0cnVjdCB6c3dhcF9lbnRyeSAqZW50cnk7XFxuMTYyMzpcXHRcXG4xNjI0OlxcdFxcdFZNX1dBUk5fT05fT05DRSghZm9saW9fdGVzdF9sb2NrZWQoZm9saW8pKTtcXG4xNjI1OlxcdFxcdFZNX1dBUk5fT05fT05DRSghZm9saW9fdGVzdF9zd2FwY2FjaGUoZm9saW8pKTtcXG4xNjI2OlxcdFxcbjE2Mjc6XFx0XFx0aWYgKHpzd2FwX25ldmVyX2VuYWJsZWQoKSlcXG4xNjI4OlxcdFxcdFxcdHJldHVybiAtRU5PRU5UO1xcbjE2Mjk6XFx0XFxuMTYzMDpcXHRcXHQvKlxcbjE2MzE6XFx0XFx0ICogQSBsYXJnZSBmb2xpbyBjYW4gbGVnaXRpbWF0ZWx5IHJlYWNoIHpzd2FwX2xvYWQoKSB3aXRoIGl0cyB3aG9sZVxcbjE2MzI6XFx0XFx0ICogcmFuZ2Ugb24gdGhlIGJhY2tpbmcgZGV2aWNlLCBzbyBzY2FuIHRoZSByYW5nZSByYXRoZXIgdGhhbiByZWplY3RpbmdcXG4xNjMzOlxcdFxcdCAqIGl0IG91dHJpZ2h0LiBUaGUgY2FsbGVyIGhhcyBwaW5uZWQgZXZlcnkgc2xvdCwgc28genN3YXAgY2Fubm90IHN0YXJ0XFxuMTYzNDpcXHRcXHQgKiBhIHN0b3JlIG9yIGEgd3JpdGViYWNrIGludG8gdGhlIHJhbmdlIHdoaWxlIHdlIGxvb2suXFxuMTYzNTpcXHRcXHQgKi9cXG4xNjM2OlxcdFxcdGlmIChmb2xpb190ZXN0X2xhcmdlKGZvbGlvKSkge1xcbjE2Mzc6XFx0XFx0XFx0aWYgKFdBUk5fT05fT05DRSh6c3dhcF9pc19wcmVzZW50KHN3cCxcXG4xNjM4OlxcdFxcdFxcdFxcdFxcdFxcdFxcdCAgZm9saW9fbnJfcGFnZXMoZm9saW8pKSkpIHtcXG4xNjM5OlxcdFxcdFxcdFxcdGZvbGlvX3VubG9jayhmb2xpbyk7XFxuMTY0MDpcXHRcXHRcXHRcXHRyZXR1cm4gLUVJTztcXG4xNjQxOlxcdFxcdFxcdH1cXG4xNjQyOlxcdFxcdFxcdHJldHVybiAtRU5PRU5UO1xcbjE2NDM6XFx0XFx0fVxcbjE2NDQ6XFx0XFxuMTY0NTpcXHRcXHRlbnRyeSA9IHhhX2xvYWQodHJlZSwgb2Zmc2V0KTtcXG4xNjQ2OlxcdFxcdGlmICghZW50cnkpXFxuMTY0NzpcXHRcXHRcXHRyZXR1cm4gLUVOT0VOVDtcXG4xNjQ4OlxcdFxcbjE2NDk6XFx0XFx0aWYgKCF6c3dhcF9kZWNvbXByZXNzKGVudHJ5LCBmb2xpbykpIHtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDdUMjA6Mzc6MTguNDY0NTc0OThaIiwiU2VxIjo1LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjo0OTAzOTM5OTQ0LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBoZXJlJ3MgbXkgdGFrZSBvbiB0aG9zZSB0aG91Z2h0cywgZnJhbWVkIGFzIGFuIGV4cGVydCdzIGludGVybmFsIG1vbm9sb2d1ZTpcblxuKipDaGVja2luZyB0aGUgS2NvbmZpZyBmb3IgWnN3YXAqKlxuXG5BbHJpZ2h0LCB0aW1lIHRvIGdldCBteSBoYW5kcyBkaXJ0eS4gTXkgaW1tZWRpYXRlIHRob3VnaHQgaXMgdG8gZGl2ZSBpbnRvIHRoZSBLY29uZmlnIGZpbGVzLCBzcGVjaWZpY2FsbHkgZm9jdXNpbmcgb24gdGhlIGNvbmZpZ3VyYXRpb25zIHJlbGF0ZWQgdG8genN3YXAgYW5kIHRoZSBgbW0venN3YXAuY2AgaW1wbGVtZW50YXRpb24uIEdvdHRhIG1ha2Ugc3VyZSBldmVyeXRoaW5nJ3Mgc2V0IHVwIGNvcnJlY3RseSwgdGhhdCB0aGUgYnVpbGQgc3lzdGVtIGtub3dzIHdoYXQncyBnb2luZyBvbiwgYW5kIHRoYXQgdGhlIHJlbGV2YW50IG9wdGlvbnMgYXJlIGV4cG9zZWQgdG8gdGhlIHVzZXIsIG9yIGFwcHJvcHJpYXRlbHkgaGlkZGVuIGlmIHRoZXkgYXJlIG5vdCBtZWFudCBmb3IgdGhlIGF2ZXJhZ2Ugam9lLlxuXG5JJ20gdGhpbmtpbmc6XG5cbiogICAqKklzIHpzd2FwIGV2ZW4gZW5hYmxlZD8qKiBMZXQncyB2ZXJpZnkgdGhlIGNvcmUgYENPTkZJR19aU1dBUGAgb3B0aW9uLiBJIG5lZWQgdG8gcXVpY2tseSBjb25maXJtIGl0cyBkZXBlbmRlbmNpZXMgYW5kIGRlZmF1bHQgdmFsdWUgdG9vLlxuKiAgICoqRGVlcGVyIGRpdmVzOioqIE5vdyBJIGhhdmUgdG8gZ28gZGVlcGVyLCBsb29rIGZvciByZWxhdGVkIG9wdGlvbnMgbGlrZSBgQ09ORklHX1pQT09MX1NJWkVgLCBgQ09ORklHX1pTV0FQX0NPTVBSRVNTT1JgLCBgQ09ORklHX1pTV0FQX1BBR0VfU0laRWAsIGFuZCBhbnkgb3RoZXIgc2V0dGluZ3MgdGhhdCBhZmZlY3QgdGhlIGJlaGF2aW9yIG9mIGB6c3dhcC5jYC5cbiogICAqKlRoZSBmaW5lIHByaW50OioqIEknbGwgc2NydXRpbml6ZSBhbnkgY29uZGl0aW9uYWwgZGVwZW5kZW5jaWVzLiBBcmUgdGhlcmUgYW55IGhhcmR3YXJlIG9yIGtlcm5lbCBmZWF0dXJlIGRlcGVuZGVuY2llcyB0aGF0IEkgbmVlZCB0byBiZSBhd2FyZSBvZj8gQXJlIHRoZXJlIGNvbmZsaWN0aW5nIG9wdGlvbnMgdGhhdCBJIG1pZ2h0IG5lZWQgdG8gY29uc2lkZXI/XG4qICAgKipXaGF0IGFyZSB0aGUgZGVmYXVsdHM/KiogSSB3aWxsIGNoZWNrIHRoZSBkZWZhdWx0cywgYW5kIHRoZSBpbXBsaWNhdGlvbnMgb2YgY2hhbmdpbmcgdGhlbS4gU29tZXRpbWVzIHRoZSBkZWZhdWx0cyBhcmUgZmluZSwgYnV0IGluIHNvbWUgc2NlbmFyaW9zIEknbGwgbmVlZCB0byBvdmVycmlkZSB0aGVzZS5cbiogICAqKkRvY3VtZW50YXRpb246KiogSSB3YW50IHRvIGNoZWNrIGZvciBjbGVhciBhbmQgY29uY2lzZSBkb2N1bWVudGF0aW9uIHdpdGhpbiB0aGUgS2NvbmZpZyBmaWxlIGl0c2VsZi4gQW55IGhlbHAgdGV4dCBvciBjb21tZW50cyB0aGF0IGV4cGxhaW4gdGhlIHB1cnBvc2Ugb2YgdGhlIG9wdGlvbnMgYW5kIHRoZWlyIGltcGFjdCBvbiBzeXN0ZW0gcGVyZm9ybWFuY2Ugd291bGQgYmUgZ3JlYXRseSBhcHByZWNpYXRlZC5cbiogICAqKkNyb3NzLXJlZmVyZW5jaW5nOioqIEkgc2hvdWxkIGNyb3NzLXJlZmVyZW5jZSB0aGVzZSBLY29uZmlnIG9wdGlvbnMgd2l0aCB0aGUgYWN0dWFsIGNvZGUgaW4gYG1tL3pzd2FwLmNgIHRvIHNlZSBob3cgdGhlIHNldHRpbmdzIGFyZSBiZWluZyB1dGlsaXplZC4gVGhpcyB3aWxsIGhlbHAgbWUgdW5kZXJzdGFuZCB0aGUgaW1wbGljYXRpb25zIG9mIGRpZmZlcmVudCBjb25maWd1cmF0aW9ucyBpbiBhIG1vcmUgdGFuZ2libGUgbWFubmVyLlxuKiAgICoqSXMgaXQgZXZlbiBjb21waWxpbmc/KiogSnVzdCBiZWNhdXNlIHRoZSBvcHRpb25zICpleGlzdCogZG9lc24ndCBtZWFuIHRoZXkncmUgYWN0dWFsbHkgZ2V0dGluZyB1c2VkLiBJJ2xsIG5lZWQgdG8gcXVpY2tseSBjb25maXJtIHRoZSBidWlsZCBzeXN0ZW0gaXMgY29ycmVjdGx5IGludGVncmF0aW5nIHRoZXNlIHNldHRpbmdzLlxuXG5UaGlzIGlzIGFsbCByb3V0aW5lLCByZWFsbHkuIE5lZWQgdG8gZ2V0IGEgZmlybSBncmFzcCBvbiB0aGUgY29uZmlndXJhdGlvbiBsYW5kc2NhcGUgYmVmb3JlIGV2ZW4gdGhpbmtpbmcgYWJvdXQgbW9kaWZ5aW5nIG9yIHR1bmluZyBhbnl0aGluZy4gQSBzb2xpZCB1bmRlcnN0YW5kaW5nIG9mIHRoZSBiYXNlIGNvbmZpZ3VyYXRpb24gaXMgcGFyYW1vdW50LlxuXG5cbiIsIklucHV0VG9rZW5zIjo1NDIwLCJPdXRwdXRUb2tlbnMiOjI2LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTgsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0wN1QyMDozNzoyMy4zNjg1MTcwMTVaIiwiU2VxIjo2LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NTM1Njg4MDksIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiY29uZmlnIFpTV0FQXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIm1tL1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJtbS9LY29uZmlnPTEyPW1lbnVjb25maWcgU1dBUFxcbi0tXFxubW0vS2NvbmZpZy0yMS1cXG5tbS9LY29uZmlnOjIyOmNvbmZpZyBaU1dBUFxcbm1tL0tjb25maWctMjMtXFx0Ym9vbCBcXFwiQ29tcHJlc3NlZCBjYWNoZSBmb3Igc3dhcCBwYWdlc1xcXCJcXG4tLVxcbm1tL0tjb25maWctMzQtXFxubW0vS2NvbmZpZzozNTpjb25maWcgWlNXQVBfREVGQVVMVF9PTlxcbm1tL0tjb25maWctMzYtXFx0Ym9vbCBcXFwiRW5hYmxlIHRoZSBjb21wcmVzc2VkIGNhY2hlIGZvciBzd2FwIHBhZ2VzIGJ5IGRlZmF1bHRcXFwiXFxuLS1cXG5tbS9LY29uZmlnLTQ0LVxcbm1tL0tjb25maWc6NDU6Y29uZmlnIFpTV0FQX1NIUklOS0VSX0RFRkFVTFRfT05cXG5tbS9LY29uZmlnLTQ2LVxcdGJvb2wgXFxcIlNocmluayB0aGUgenN3YXAgcG9vbCBvbiBtZW1vcnkgcHJlc3N1cmVcXFwiXFxuLS1cXG5tbS9LY29uZmlnPTU5PWNob2ljZVxcbi0tXFxubW0vS2NvbmZpZy03Ni1cXG5tbS9LY29uZmlnOjc3OmNvbmZpZyBaU1dBUF9DT01QUkVTU09SX0RFRkFVTFRfREVGTEFURVxcbm1tL0tjb25maWctNzgtXFx0Ym9vbCBcXFwiRGVmbGF0ZVxcXCJcXG4tLVxcbm1tL0tjb25maWctODItXFxubW0vS2NvbmZpZzo4Mzpjb25maWcgWlNXQVBfQ09NUFJFU1NPUl9ERUZBVUxUX0xaT1xcbm1tL0tjb25maWctODQtXFx0Ym9vbCBcXFwiTFpPXFxcIlxcbi0tXFxubW0vS2NvbmZpZy04OC1cXG5tbS9LY29uZmlnOjg5OmNvbmZpZyBaU1dBUF9DT01QUkVTU09SX0RFRkFVTFRfODQyXFxubW0vS2NvbmZpZy05MC1cXHRib29sIFxcXCI4NDJcXFwiXFxuLS1cXG5tbS9LY29uZmlnLTk0LVxcbm1tL0tjb25maWc6OTU6Y29uZmlnIFpTV0FQX0NPTVBSRVNTT1JfREVGQVVMVF9MWjRcXG5tbS9LY29uZmlnLTk2LVxcdGJvb2wgXFxcIkxaNFxcXCJcXG4tLVxcbm1tL0tjb25maWctMTAwLVxcbm1tL0tjb25maWc6MTAxOmNvbmZpZyBaU1dBUF9DT01QUkVTU09SX0RFRkFVTFRfTFo0SENcXG5tbS9LY29uZmlnLTEwMi1cXHRib29sIFxcXCJMWjRIQ1xcXCJcXG4tLVxcbm1tL0tjb25maWctMTA2LVxcbm1tL0tjb25maWc6MTA3OmNvbmZpZyBaU1dBUF9DT01QUkVTU09SX0RFRkFVTFRfWlNURFxcbm1tL0tjb25maWctMTA4LVxcdGJvb2wgXFxcInpzdGRcXFwiXFxuLS1cXG5tbS9LY29uZmlnPTExMj1lbmRjaG9pY2VcXG5tbS9LY29uZmlnLTExMy1cXG5tbS9LY29uZmlnOjExNDpjb25maWcgWlNXQVBfQ09NUFJFU1NPUl9ERUZBVUxUXFxubW0vS2NvbmZpZy0xMTUtICAgICAgIHN0cmluZ1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wN1QyMDozNzoyMy40MjIwOTE0MTRaIiwiU2VxIjo3LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjoyMDM5NjA4MTA4LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgYSBzdW1tYXJ5IG9mIG15IHRob3VnaHQgcHJvY2VzcywgYXMgaWYgSSB3ZXJlIHRoZSBvbmUgdGhpbmtpbmcgaXQ6XG5cbioqRGl2aW5nIGludG8gdGhlIFpTV0FQIENvbmZpZ3VyYXRpb24qKlxuXG5Pa2F5LCB0aW1lIHRvIGdldCBteSBoYW5kcyBkaXJ0eSB3aXRoIHRoaXMgYFpTV0FQYCBjb25maWd1cmF0aW9uLiBGaXJzdCwgSSBuZWVkIHRvIHVuZGVyc3RhbmQgaXRzIHN0cnVjdHVyZSB3aXRoaW4gdGhlIGtlcm5lbCdzIGJ1aWxkIHN5c3RlbS4gTGV0J3Mgc3RhcnQgYnkgbmF2aWdhdGluZyBkaXJlY3RseSB0byBgbW0vS2NvbmZpZ2AuIFRoYXQncyB3aGVyZSBJIGV4cGVjdCB0byBmaW5kIHRoZSByZWxldmFudCBkZWZpbml0aW9ucyBhbmQgZGVwZW5kZW5jaWVzIGZvciBtZW1vcnkgbWFuYWdlbWVudCBvcHRpb25zLiBJJ20gc3BlY2lmaWNhbGx5IGxvb2tpbmcgZm9yIHRoZSBzZWN0aW9uIHJlbGF0ZWQgdG8gYGNvbmZpZyBaU1dBUGAuIEkgd2FudCB0byBzZWUgaG93IGl0J3MgZGVmaW5lZCwgd2hpY2ggb3RoZXIgY29uZmlndXJhdGlvbnMgaXQgZGVwZW5kcyBvbiwgYW5kIHdoYXQgdGhlIGRlZmF1bHQgc2V0dGluZ3MgbWlnaHQgYmUuIFRoaXMgd2lsbCBnaXZlIG1lIGEgc29saWQgZm91bmRhdGlvbiBmb3IgdW5kZXJzdGFuZGluZyB0aGUgaW1wbGljYXRpb25zIG9mIGVuYWJsaW5nIG9yIGRpc2FibGluZyBpdCB3aXRoaW4gYSBrZXJuZWwgY29uZmlndXJhdGlvbi4gS25vd2luZyB0aGUgYEtjb25maWdgIHN0cnVjdHVyZSBoZWxwcyBtZSBhc3Nlc3MgcG90ZW50aWFsIGNvbmZsaWN0cyB3aXRoIG90aGVyIG1lbW9yeSBtYW5hZ2VtZW50IG9wdGlvbnMuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjY0OTgsIk91dHB1dFRva2VucyI6MzEsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxNywiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0wN1QyMDozNzoyNS40NjE3MDM0MDJaIiwiU2VxIjo4LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMTMyNTAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwibW0vS2NvbmZpZ1wiLFxuICBcIkZpcnN0TGluZVwiOiAyMCxcbiAgXCJMaW5lQ291bnRcIjogNDBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiICAyMDpcXHRcXHQgIGluIHlvdXIgY29tcHV0ZXIuICBJZiB1bnN1cmUgc2F5IFkuXFxuICAyMTpcXHRcXG4gIDIyOlxcdGNvbmZpZyBaU1dBUFxcbiAgMjM6XFx0XFx0Ym9vbCBcXFwiQ29tcHJlc3NlZCBjYWNoZSBmb3Igc3dhcCBwYWdlc1xcXCJcXG4gIDI0OlxcdFxcdGRlcGVuZHMgb24gU1dBUFxcbiAgMjU6XFx0XFx0c2VsZWN0IENSWVBUT1xcbiAgMjY6XFx0XFx0c2VsZWN0IFpTTUFMTE9DXFxuICAyNzpcXHRcXHRoZWxwXFxuICAyODpcXHRcXHQgIEEgbGlnaHR3ZWlnaHQgY29tcHJlc3NlZCBjYWNoZSBmb3Igc3dhcCBwYWdlcy4gIEl0IHRha2VzXFxuICAyOTpcXHRcXHQgIHBhZ2VzIHRoYXQgYXJlIGluIHRoZSBwcm9jZXNzIG9mIGJlaW5nIHN3YXBwZWQgb3V0IGFuZCBhdHRlbXB0cyB0b1xcbiAgMzA6XFx0XFx0ICBjb21wcmVzcyB0aGVtIGludG8gYSBkeW5hbWljYWxseSBhbGxvY2F0ZWQgUkFNLWJhc2VkIG1lbW9yeSBwb29sLlxcbiAgMzE6XFx0XFx0ICBUaGlzIGNhbiByZXN1bHQgaW4gYSBzaWduaWZpY2FudCBJL08gcmVkdWN0aW9uIG9uIHN3YXAgZGV2aWNlIGFuZCxcXG4gIDMyOlxcdFxcdCAgaW4gdGhlIGNhc2Ugd2hlcmUgZGVjb21wcmVzc2luZyBmcm9tIFJBTSBpcyBmYXN0ZXIgdGhhbiBzd2FwIGRldmljZVxcbiAgMzM6XFx0XFx0ICByZWFkcywgY2FuIGFsc28gaW1wcm92ZSB3b3JrbG9hZCBwZXJmb3JtYW5jZS5cXG4gIDM0OlxcdFxcbiAgMzU6XFx0Y29uZmlnIFpTV0FQX0RFRkFVTFRfT05cXG4gIDM2OlxcdFxcdGJvb2wgXFxcIkVuYWJsZSB0aGUgY29tcHJlc3NlZCBjYWNoZSBmb3Igc3dhcCBwYWdlcyBieSBkZWZhdWx0XFxcIlxcbiAgMzc6XFx0XFx0ZGVwZW5kcyBvbiBaU1dBUFxcbiAgMzg6XFx0XFx0aGVscFxcbiAgMzk6XFx0XFx0ICBJZiBzZWxlY3RlZCwgdGhlIGNvbXByZXNzZWQgY2FjaGUgZm9yIHN3YXAgcGFnZXMgd2lsbCBiZSBlbmFibGVkXFxuICA0MDpcXHRcXHQgIGF0IGJvb3QsIG90aGVyd2lzZSBpdCB3aWxsIGJlIGRpc2FibGVkLlxcbiAgNDE6XFx0XFxuICA0MjpcXHRcXHQgIFRoZSBzZWxlY3Rpb24gbWFkZSBoZXJlIGNhbiBiZSBvdmVycmlkZGVuIGJ5IHVzaW5nIHRoZSBrZXJuZWxcXG4gIDQzOlxcdFxcdCAgY29tbWFuZCBsaW5lICd6c3dhcC5lbmFibGVkPScgb3B0aW9uLlxcbiAgNDQ6XFx0XFxuICA0NTpcXHRjb25maWcgWlNXQVBfU0hSSU5LRVJfREVGQVVMVF9PTlxcbiAgNDY6XFx0XFx0Ym9vbCBcXFwiU2hyaW5rIHRoZSB6c3dhcCBwb29sIG9uIG1lbW9yeSBwcmVzc3VyZVxcXCJcXG4gIDQ3OlxcdFxcdGRlcGVuZHMgb24gWlNXQVBcXG4gIDQ4OlxcdFxcdGRlZmF1bHQgblxcbiAgNDk6XFx0XFx0aGVscFxcbiAgNTA6XFx0XFx0ICBJZiBzZWxlY3RlZCwgdGhlIHpzd2FwIHNocmlua2VyIHdpbGwgYmUgZW5hYmxlZCwgYW5kIHRoZSBwYWdlc1xcbiAgNTE6XFx0XFx0ICBzdG9yZWQgaW4gdGhlIHpzd2FwIHBvb2wgd2lsbCBiZWNvbWUgYXZhaWxhYmxlIGZvciByZWNsYWltIChpLmVcXG4gIDUyOlxcdFxcdCAgd3JpdHRlbiBiYWNrIHRvIHRoZSBiYWNraW5nIHN3YXAgZGV2aWNlKSBvbiBtZW1vcnkgcHJlc3N1cmUuXFxuICA1MzpcXHRcXG4gIDU0OlxcdFxcdCAgVGhpcyBtZWFucyB0aGF0IHpzd2FwIHdyaXRlYmFjayBjb3VsZCBoYXBwZW4gZXZlbiBpZiB0aGUgcG9vbCBpc1xcbiAgNTU6XFx0XFx0ICBub3QgeWV0IGZ1bGwsIG9yIHRoZSBjZ3JvdXAgenN3YXAgbGltaXQgaGFzIG5vdCBiZWVuIHJlYWNoZWQsXFxuICA1NjpcXHRcXHQgIHJlZHVjaW5nIHRoZSBjaGFuY2UgdGhhdCBjb2xkIHBhZ2VzIHdpbGwgcmVzaWRlIGluIHRoZSB6c3dhcCBwb29sXFxuICA1NzpcXHRcXHQgIGFuZCBjb25zdW1lIG1lbW9yeSBpbmRlZmluaXRlbHkuXFxuICA1ODpcXHRcXG4gIDU5OlxcdGNob2ljZVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wN1QyMDozNzoyNS40NjE4MTgxNzJaIiwiU2VxIjo5LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjozNTE5ODUwNTY2LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBsZXQncyBkaXZlIGludG8gdGhpcy4gSGVyZSdzIGhvdyBJJ2QgYXBwcm9hY2ggdGhhdCBrZXJuZWwgYW5hbHlzaXMsIHN1bW1hcml6aW5nIG15IG93biB0aG91Z2h0IHByb2Nlc3M6XG5cbioqSW52ZXN0aWdhdGluZyBDYWxsZXJzIG9mIGB6c3dhcF9sb2FkYCoqXG5cbkFscmlnaHQsIHRpbWUgdG8gZ2V0IG15IGhhbmRzIGRpcnR5LiBJJ20gdGhpbmtpbmcsIFwiT2theSwgYHpzd2FwX2xvYWRgLi4uIHRoYXQncyBhIGtleSBmdW5jdGlvbiBpbiB0aGUgWnN3YXAgc3Vic3lzdGVtLCByaWdodD8gSXQncyB0aGUgb25lIHJlc3BvbnNpYmxlIGZvciBsb2FkaW5nIGNvbXByZXNzZWQgcGFnZXMgZnJvbSB0aGUgc3dhcCBjYWNoZS4gU28sIHVuZGVyc3RhbmRpbmcgKndobyogY2FsbHMgaXQgaXMgY3J1Y2lhbCB0byB1bmRlcnN0YW5kaW5nIHRoZSBkYXRhIGZsb3csIHRoZSB0cmlnZ2VycyBmb3IgWnN3YXAgYWN0aXZpdHksIGFuZCBwb3RlbnRpYWwgYm90dGxlbmVja3MuXCJcblxuTXkgaW1tZWRpYXRlIGluc3RpbmN0IGlzIHRvIGxvb2sgYXQgdGhlIGNhbGxpbmcgY29udGV4dC4gXCJJIG5lZWQgdG8gdHJhY2sgZG93biBldmVyeSBpbnN0YW5jZSB3aGVyZSBgenN3YXBfbG9hZGAgaXMgaW52b2tlZCB3aXRoaW4gdGhlIGtlcm5lbC4gU3RhdGljIGFuYWx5c2lzIHRvb2xzIGFyZSBteSBmcmllbmRzIGhlcmUuXCIgSSdkIGxpa2VseSBzdGFydCB3aXRoIGBwZXJmYCB0byBidWlsZCBhIGR5bmFtaWMgY2FsbGdyYXBoIG9yIGBncmVwYCB0byBxdWlja2x5IHNlYXJjaCB0aGUgc291cmNlIGNvZGUgZm9yIGFsbCBpbnN0YW5jZXMgb2YgdGhlIGZ1bmN0aW9uIG5hbWUuIEknZCBiZSBsb29raW5nIGZvciBhIGNvbXByZWhlbnNpdmUgbGlzdC4gXCJOb3csIGl0J3Mgbm90IGVub3VnaCB0byAqZmluZCogdGhlIGNhbGxzOyBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGUgKndoeSouXCJcblxuXCJGb3IgZWFjaCBjYWxsZXIsIEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoZSBwdXJwb3NlIG9mIHRoYXQgY29kZSBwYXRoLiBXaGF0J3MgdGhlIHNwZWNpZmljIHNjZW5hcmlvIHRoYXQgbGVhZHMgdG8gYHpzd2FwX2xvYWRgIGJlaW5nIGV4ZWN1dGVkPyBJcyBpdCBhIHBhZ2UgZmF1bHQgaW4gYSB1c2VyLXNwYWNlIGFwcGxpY2F0aW9uPyBJcyBpdCBhIGJhY2tncm91bmQgcHJvY2VzcyBzY2F2ZW5naW5nIG1lbW9yeT8gQXJlIHRoZXJlIGFueSBvYnZpb3VzIGxvY2tzIG9yIHN5bmNocm9uaXphdGlvbiBwcmltaXRpdmVzIGludm9sdmVkLCBhbmQgaG93IGNvdWxkIHRob3NlIGFmZmVjdCBwZXJmb3JtYW5jZT8gTWF5YmUgYSBsb2NrIGNvbnRlbnRpb24gb3IgcmFjZSBjb25kaXRpb24uXCJcblxuSSdkIGJlIHBhcnRpY3VsYXJseSBpbnRlcmVzdGVkIGluOlxuXG4qICAgKipGcmVxdWVuY3k6KiogSG93IG9mdGVuIGlzIGB6c3dhcF9sb2FkYCBjYWxsZWQgZnJvbSBlYWNoIGNhbGxlcj9cbiogICAqKkNvbnRleHQ6KiogV2hhdCdzIHRoZSBjb250ZXh0IHN3aXRjaGluZyBpbiB0aGF0IGNhbGw/XG4qICAgKipBcmd1bWVudHM6KiogV2hhdCBhcmUgdGhlIGFyZ3VtZW50cyBwYXNzZWQgdG8gYHpzd2FwX2xvYWRgPyBBcmUgdGhlcmUgc3BlY2lmaWMgcGFnZSByYW5nZXMgb3Igb3RoZXIgZGF0YSB0aGF0IG1pZ2h0IHByb3ZpZGUgY2x1ZXMgYWJvdXQgdGhlIHdvcmtsb2FkP1xuKiAgICoqTGF0ZW5jeToqKiBIb3cgbG9uZyBkb2VzIGB6c3dhcF9sb2FkYCB0YWtlIHRvIGV4ZWN1dGUgaW4gZWFjaCBzY2VuYXJpbz8gXCJJJ2xsIG5lZWQgdG8gaW5zdHJ1bWVudCB0aGUgY29kZSBpZiB0aGUgY2FsbCBzdGFja3MgYXJlbid0IGF2YWlsYWJsZSB0byBtZS5cIlxuXG5cIkZpbmFsbHksIGFmdGVyIGEgdGhvcm91Z2ggaW52ZXN0aWdhdGlvbiwgSSdkIHdhbnQgdG8gYnVpbGQgYSBtZW50YWwgbWFwIG9mIGhvdyBac3dhcCBpbnRlZ3JhdGVzIHdpdGggdGhlIGtlcm5lbCdzIG1lbW9yeSBtYW5hZ2VtZW50LiBUaGlzIGluZm9ybWF0aW9uIHdpbGwgYmUgaW52YWx1YWJsZSBmb3IgZnV0dXJlIGFuYWx5c2lzLCBkZWJ1Z2dpbmcsIGFuZCBwb3RlbnRpYWxseSwgb3B0aW1pemF0aW9uIGVmZm9ydHMuXCJcblxuXG4iLCJJbnB1dFRva2VucyI6NzI5MywiT3V0cHV0VG9rZW5zIjoxOCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjE2LCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMDdUMjA6Mzc6MjguOTgxNjcyMjM4WiIsIlNlcSI6MTAsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyMTgwMjU2MTQ3LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcInpzd2FwX2xvYWRcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiaW5jbHVkZS9saW51eC96c3dhcC5oPTI4PWJvb2wgenN3YXBfc3RvcmUoc3RydWN0IGZvbGlvICpmb2xpbyk7XFxuaW5jbHVkZS9saW51eC96c3dhcC5oOjI5OmludCB6c3dhcF9sb2FkKHN0cnVjdCBmb2xpbyAqZm9saW8pO1xcbmluY2x1ZGUvbGludXgvenN3YXAuaC0zMC12b2lkIHpzd2FwX2ludmFsaWRhdGUoc3dwX2VudHJ5X3Qgc3dwKTtcXG4tLVxcbmluY2x1ZGUvbGludXgvenN3YXAuaD00Mj1zdGF0aWMgaW5saW5lIGJvb2wgenN3YXBfc3RvcmUoc3RydWN0IGZvbGlvICpmb2xpbylcXG4tLVxcbmluY2x1ZGUvbGludXgvenN3YXAuaC00Ni1cXG5pbmNsdWRlL2xpbnV4L3pzd2FwLmg6NDc6c3RhdGljIGlubGluZSBpbnQgenN3YXBfbG9hZChzdHJ1Y3QgZm9saW8gKmZvbGlvKVxcbmluY2x1ZGUvbGludXgvenN3YXAuaC00OC17XFxuLS1cXG5tbS9wYWdlX2lvLmM9NDUyPXZvaWQgc3dhcF9yZWFkX2ZvbGlvKHN0cnVjdCBzd2FwX2lvX2N0eCAqY3R4LCBzdHJ1Y3QgZm9saW8gKmZvbGlvKVxcbi0tXFxubW0vcGFnZV9pby5jLTQ3OS1cXG5tbS9wYWdlX2lvLmM6NDgwOlxcdGlmICh6c3dhcF9sb2FkKGZvbGlvKSAhPSAtRU5PRU5UKVxcbm1tL3BhZ2VfaW8uYy00ODEtXFx0XFx0Z290byBmaW5pc2g7XFxuLS1cXG5tbS96c3dhcC5jPTE1ODM9c3RhdGljIGJvb2wgenN3YXBfaXNfcHJlc2VudChzd3BfZW50cnlfdCBlbnRyeSwgdW5zaWduZWQgaW50IG5yKVxcbi0tXFxubW0venN3YXAuYy0xNjAwLS8qKlxcbm1tL3pzd2FwLmM6MTYwMTogKiB6c3dhcF9sb2FkKCkgLSBsb2FkIGEgZm9saW8gZnJvbSB6c3dhcFxcbm1tL3pzd2FwLmMtMTYwMi0gKiBAZm9saW86IGZvbGlvIHRvIGxvYWRcXG4tLVxcbm1tL3pzd2FwLmMtMTYxNi0gKi9cXG5tbS96c3dhcC5jOjE2MTc6aW50IHpzd2FwX2xvYWQoc3RydWN0IGZvbGlvICpmb2xpbylcXG5tbS96c3dhcC5jLTE2MTgte1xcbi0tXFxubW0venN3YXAuYy0xNjMwLVxcdC8qXFxubW0venN3YXAuYzoxNjMxOlxcdCAqIEEgbGFyZ2UgZm9saW8gY2FuIGxlZ2l0aW1hdGVseSByZWFjaCB6c3dhcF9sb2FkKCkgd2l0aCBpdHMgd2hvbGVcXG5tbS96c3dhcC5jLTE2MzItXFx0ICogcmFuZ2Ugb24gdGhlIGJhY2tpbmcgZGV2aWNlLCBzbyBzY2FuIHRoZSByYW5nZSByYXRoZXIgdGhhbiByZWplY3RpbmdcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDdUMjA6Mzc6MzEuMTYxOTM5NTc1WiIsIlNlcSI6MTEsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjQwNjIwNjkyNDgsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIGEgTWVtb3J5IE1hbmFnZW1lbnQgUGF0Y2gqKlxuXG5Pa2F5LCBsZXQncyBicmVhayB0aGlzIGRvd24uIE15IGluaXRpYWwgb2JzZXJ2YXRpb24gaXMgdGhhdCB0aGlzIHBhdGNoIGRpdmVzIGludG8gYG1tL3pzd2FwLmNgLCBpbW1lZGlhdGVseSBwbGFjaW5nIGl0IHdpdGhpbiB0aGUgbWVtb3J5IG1hbmFnZW1lbnQgc3Vic3lzdGVtLCBzcGVjaWZpY2FsbHkgcmVsYXRlZCB0byB6c3dhcC4gVGhlIGNvcmUgY2hhbmdlIGlzIGluIGB6c3dhcF9sb2FkKClgLiBJdCBhcHBlYXJzIHdlJ3JlIHJlZmluaW5nIGl0cyBiZWhhdmlvciB3aXRoIGxhcmdlIGZvbGlvcy4gVGhlIGV4aXN0aW5nIGNvZGUgd2FybmVkIGFuZCByZXR1cm5lZCBgLUVJTlZBTGAuIFRoZSBuZXcgY29kZSBpbnRyb2R1Y2VzIGB6c3dhcF9pc19wcmVzZW50KClgIGFuZCBjaGFuZ2VzIHRoZSByZXR1cm4gdmFsdWVzIGFuZCB3YXJuaW5nLiBTcGVjaWZpY2FsbHksIGl0IG5vdyBjaGVja3MgaWYgKmFueSogcGFydCBvZiB0aGUgbGFyZ2UgZm9saW8gaXMgcHJlc2VudCBpbiB6c3dhcCB1c2luZyBhIG5ldyBoZWxwZXIgZnVuY3Rpb24sIGB6c3dhcF9pc19wcmVzZW50KClgLiBJZiBldmVuIGEgcGFydCBpcyBwcmVzZW50LCB0aGVuIGl0IHdhcm5zIGFuZCByZXR1cm5zIGAtRUlPYC4gSG93ZXZlciwgaWYgdGhlIGxhcmdlIGZvbGlvIGlzbid0IHByZXNlbnQgaW4genN3YXAgYXQgYWxsLCBpdCdsbCByZXR1cm4gYC1FTk9FTlRgIGFsbG93aW5nIHRoZSBzd2FwIGRldmljZSB0byB0YWtlIG92ZXIuXG5cbk15IG5leHQgdGhvdWdodCBpcyByZWFjaGFiaWxpdHkgYW5kIGZ1enppbmcuIElzIHRoaXMgY2hhbmdlIHNvbWV0aGluZyB3ZSBjYW4gYWN0dWFsbHkgaGl0IGFuZCBpcyBpdCB3b3J0aCB0aGUgZWZmb3J0IG9mIGZ1enppbmc/IEl0J3MgY2xlYXJseSByZWFjaGFibGUgaW4gc3RhbmRhcmQga2VybmVsIGNvbmZpZ3VyYXRpb25zIHdpdGggc3dhcCBhbmQgenN3YXAgZW5hYmxlZCwgZXNwZWNpYWxseSB3aXRoIHRob3NlIGxhcmdlIGZvbGlvIHN3YXAtaW5zIChtVEhQLCBzd2FwY2FjaGUpLiBXZSBoYXZlIGxvZ2ljIGNoYW5nZXMgaW4gbWVtb3J5IG1hbmFnZW1lbnQsIHNvIGFjY29yZGluZyB0byBteSBjcml0ZXJpYSwgaXQncyB3b3J0aCBpbnZlc3RpZ2F0aW5nLlxuXG5Ob3csIEkgbmVlZCB0byBjaG9vc2UgdGhlIGZvY3VzIHN5bWJvbHMgZm9yIGZ1enppbmcuIGB6c3dhcF9sb2FkYCBpcyBkaXJlY3RseSBpbXBhY3RlZCwgYW5kIGBzd2FwX3JlYWRfZm9saW9gIGJlY29tZXMgaW50ZXJlc3RpbmcgYmVjYXVzZSBpdCBtaWdodCBpbnRlcmFjdCBub3cgaW4gY2FzZXMgd2hlcmUgYC1FTk9FTlRgIGlzIHJldHVybmVkLiBTaW5jZSBgenN3YXBfbG9hZGAgaXMgenN3YXAgc3BlY2lmaWMsIGl0IHdvdWxkbid0IGJlIHVuaXZlcnNhbGx5IHVzZWZ1bC4gQnV0IG1heWJlIGBzd2FwX3JlYWRfZm9saW9gIGlzIGFuIGludGVyZXN0aW5nIGNhbmRpZGF0ZSBmb3IgY2FsbGluZy4gSSdsbCBuZWVkIHRvIGNoZWNrIHRoZSBjYWxsIGhpZXJhcmNoeS5cblxuXG4iLCJJbnB1dFRva2VucyI6ODI5OSwiT3V0cHV0VG9rZW5zIjoxOSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjM2NSwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0wN1QyMDozNzozNS4yMjQwMTI2MDJaIiwiU2VxIjoxMiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjIzMjkyMTk3MTUsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwic3dhcF9yZWFkX2ZvbGlvXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm1tL21lbW9yeS5jPTQ3NTA9c3RhdGljIGJvb2wgY2FuX3N3YXBpbl90aHAoc3RydWN0IHZtX2ZhdWx0ICp2bWYsIHB0ZV90ICpwdGVwLCBpbnQgbnJfcGFnZXMpXFxuLS1cXG5tbS9tZW1vcnkuYy00NzYyLVxcdC8qXFxubW0vbWVtb3J5LmM6NDc2MzpcXHQgKiBzd2FwX3JlYWRfZm9saW8oKSBjYW4ndCBoYW5kbGUgdGhlIGNhc2UgYSBsYXJnZSBmb2xpbyBpcyBoeWJyaWRseVxcbm1tL21lbW9yeS5jLTQ3NjQtXFx0ICogZnJvbSBkaWZmZXJlbnQgYmFja2VuZHMuIEFuZCB0aGV5IGFyZSBsaWtlbHkgY29ybmVyIGNhc2VzLiBTaW1pbGFyXFxuLS1cXG5tbS9wYWdlX2lvLmM9Mzk3PXN0YXRpYyBpbnQgc3dhcF96ZXJvbWFwX2JhdGNoKHN3cF9lbnRyeV90IGVudHJ5LCBpbnQgbWF4X25yLFxcbi0tXFxubW0vcGFnZV9pby5jLTQxOC1cXG5tbS9wYWdlX2lvLmM6NDE5OnN0YXRpYyBib29sIHN3YXBfcmVhZF9mb2xpb196ZXJvbWFwKHN0cnVjdCBmb2xpbyAqZm9saW8pXFxubW0vcGFnZV9pby5jLTQyMC17XFxuLS1cXG5tbS9wYWdlX2lvLmMtNDUxLVxcbm1tL3BhZ2VfaW8uYzo0NTI6dm9pZCBzd2FwX3JlYWRfZm9saW8oc3RydWN0IHN3YXBfaW9fY3R4ICpjdHgsIHN0cnVjdCBmb2xpbyAqZm9saW8pXFxubW0vcGFnZV9pby5jLTQ1My17XFxuLS1cXG5tbS9wYWdlX2lvLmMtNDc0LVxcbm1tL3BhZ2VfaW8uYzo0NzU6XFx0aWYgKHN3YXBfcmVhZF9mb2xpb196ZXJvbWFwKGZvbGlvKSkge1xcbm1tL3BhZ2VfaW8uYy00NzYtXFx0XFx0Zm9saW9fdW5sb2NrKGZvbGlvKTtcXG4tLVxcbm1tL3N3YXAuaD0yNTY9aW50IHNpb19wb29sX2luaXQodm9pZCk7XFxubW0vc3dhcC5oOjI1Nzp2b2lkIHN3YXBfcmVhZF9mb2xpbyhzdHJ1Y3Qgc3dhcF9pb19jdHggKmN0eCwgc3RydWN0IGZvbGlvICpmb2xpbyk7XFxubW0vc3dhcC5oLTI1OC12b2lkIHN3YXBfcmVhZF9zdWJtaXQoc3RydWN0IHN3YXBfaW9fY3R4ICpjdHgpO1xcbi0tXFxubW0vc3dhcC5oPTM3NT1zdGF0aWMgaW5saW5lIHZvaWQgZm9saW9fcHV0X3N3YXAoc3RydWN0IGZvbGlvICpmb2xpbywgc3RydWN0IHBhZ2UgKnBhZ2UpXFxuLS1cXG5tbS9zd2FwLmgtMzc4LVxcbm1tL3N3YXAuaDozNzk6c3RhdGljIGlubGluZSB2b2lkIHN3YXBfcmVhZF9mb2xpbyhzdHJ1Y3Qgc3dhcF9pb19jdHggKmN0eCwgc3RydWN0IGZvbGlvICpmb2xpbylcXG5tbS9zd2FwLmgtMzgwLXtcXG4tLVxcbm1tL3N3YXBfc3RhdGUuYz02NDI9c3RhdGljIHN0cnVjdCBmb2xpbyAqc3dhcF9jYWNoZV9yZWFkX2ZvbGlvKHN0cnVjdCBzd2FwX2lvX2N0eCAqY3R4LFxcbi0tXFxubW0vc3dhcF9zdGF0ZS5jLTY1Ny1cXG5tbS9zd2FwX3N0YXRlLmM6NjU4OlxcdHN3YXBfcmVhZF9mb2xpbyhjdHgsIGZvbGlvKTtcXG5tbS9zd2FwX3N0YXRlLmMtNjU5LVxcdGlmIChyZWFkYWhlYWQpIHtcXG4tLVxcbm1tL3N3YXBfc3RhdGUuYz02ODM9c3RydWN0IGZvbGlvICpzd2FwaW5fc3luYyhzd3BfZW50cnlfdCBlbnRyeSwgZ2ZwX3QgZ2ZwLCB1bnNpZ25lZCBsb25nIG9yZGVycyxcXG4tLVxcbm1tL3N3YXBfc3RhdGUuYy02OTgtXFxubW0vc3dhcF9zdGF0ZS5jOjY5OTpcXHRzd2FwX3JlYWRfZm9saW8oXFx1MDAyNmN0eCwgZm9saW8pO1xcbm1tL3N3YXBfc3RhdGUuYy03MDAtXFx0c3dhcF9yZWFkX3N1Ym1pdChcXHUwMDI2Y3R4KTtcXG4tLVxcbm1tL3N3YXBmaWxlLmM9MjkyNj1FWFBPUlRfU1lNQk9MX0dQTChhZGRfc3dhcF9leHRlbnQpO1xcbi0tXFxubW0vc3dhcGZpbGUuYy0yOTMwLSAqIG9udG8gYSBjb250aWd1b3VzIHJhbmdlIG9mIGRpc2sgYmxvY2tzLiAgQSByYnRyZWUgb2Ygc3dhcCBleHRlbnRzIGlzXFxubW0vc3dhcGZpbGUuYzoyOTMxOiAqIGJ1aWx0IGF0IHN3YXBvbiB0aW1lIGFuZCBpcyB0aGVuIHVzZWQgYXQgc3dhcF93cml0ZXBhZ2Uvc3dhcF9yZWFkX2ZvbGlvXFxubW0vc3dhcGZpbGUuYy0yOTMyLSAqIHRpbWUgZm9yIGxvY2F0aW5nIHdoZXJlIG9uIGRpc2sgYSBwYWdlIGJlbG9uZ3MuXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA3VDIwOjM3OjM3LjU1MzIzNzg4N1oiLCJTZXEiOjEzLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjo0NTYwNDAwNzAwLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKk15IEFzc2Vzc21lbnQgb2YgdGhlIFpzd2FwIFBhdGNoKipcblxuT2theSwgbGV0J3MgYnJlYWsgdGhpcyBkb3duLiBGaXJzdCwgSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhlIHNjb3BlIG9mIHRoZXNlIGNoYW5nZXMuIEknbSBzdGFydGluZyBieSB0cmFjaW5nIHRoZSBrZXkgZnVuY3Rpb24gY2FsbHMsIGxpa2UgYHpzd2FwX2xvYWRgLCBgenN3YXBfc3RvcmVgLCBhbmQgYHpzd2FwX2lzX3ByZXNlbnRgIHRvIHNlZSB3aGVyZSB0aGV5J3JlIGRlZmluZWQgYW5kIGhvdyB0aGV5J3JlIHVzZWQuIEkndmUgY29uZmlybWVkIHRoYXQgYHpzd2FwX2xvYWRgIGlzIG5vbi1zdGF0aWMgYW5kIGluIGBtbS96c3dhcC5jYCwgd2hpY2ggaXMgaW1wb3J0YW50IGZvciB1bmRlcnN0YW5kaW5nIGl0cyBwb3RlbnRpYWwgaW1wYWN0LiBJIGFsc28gY2hlY2tlZCBgenN3YXBfc3RvcmVgIChhbHNvIGluIGBtbS96c3dhcC5jYCksIGFuZCBgenN3YXBfaXNfcHJlc2VudGAgKHN0YXRpYyBpbiB0aGUgc2FtZSBmaWxlKS4gVGhlbiBJIHdlbnQgb24gdG8gdmVyaWZ5IHRoZSBwcmVzZW5jZSBvZiBgc3dhcF9yZWFkX2ZvbGlvYCwgYW5kIGBzd2FwX2NhY2hlX3JlYWRfZm9saW9gLCBhbmQgYHN3YXBpbl9zeW5jYCwgYW5kIHRoZWlyIHJlbGF0aW9uc2hpcCB3aXRoIHRoZSBrZXkgZnVuY3Rpb25zLlxuXG5OZXh0LCBJIG5lZWRlZCB0byBjb25maXJtIHRoZSBjb25maWd1cmF0aW9uIGRlcGVuZGVuY2llcy4gWnN3YXAgb2J2aW91c2x5IGhpbmdlcyBvbiBgQ09ORklHX1NXQVBgLCBhbmQgc3BlY2lmaWNhbGx5LCBgQ09ORklHX1pTV0FQYC4gSSBkb3VibGUtY2hlY2tlZCBgbW0vS2NvbmZpZ2AgdG8gYmUgYWJzb2x1dGVseSBzdXJlOyB5ZXMsIGBaU1dBUGAgKmRlcGVuZHMqIG9uIGBTV0FQYCwgKnNlbGVjdHMqIGBDUllQVE9gIGFuZCBgWlNNQUxMT0NgLCB3aGljaCBhbGlnbnMgd2l0aCBteSB1bmRlcnN0YW5kaW5nIG9mIGhvdyBjb21wcmVzc2VkIHN3YXAgb3BlcmF0ZXMuIEkgYWxzbyBub3RlZCBgQ09ORklHX1pTV0FQX0RFRkFVTFRfT05gIGFzIGEgcG9zc2libGUgY29udmVuaWVuY2Ugb3B0aW9uLCBidXQgbm90IGVzc2VudGlhbC5cblxuTm93LCB0byBzb2xpZGlmeSBteSB1bmRlcnN0YW5kaW5nLCBJJ3ZlIHZlcmlmaWVkIHRoZSBcIkZvY3VzU3ltYm9sc1wiOiBgenN3YXBfbG9hZGAgYW5kIGBzd2FwX3JlYWRfZm9saW9gLiBUaGVzZSBhcmUgY2xlYXJseSB0aGUgY29yZSBtb2RpZmljYXRpb25zIGJlaW5nIG1hZGUgdG8gbWVtb3J5IG1hbmFnZW1lbnQuXG5cbkZpbmFsbHksIEkndmUgcmV2aWV3ZWQgdGhlIHJlYXNvbmluZyBiZWhpbmQgdGhlIHBhdGNoOiBUaGUgcGF0Y2ggbW9kaWZpZXMgYHpzd2FwX2xvYWQoKWAgYW5kIGFkZHMgYHpzd2FwX2lzX3ByZXNlbnQoKWAgaW4gYG1tL3pzd2FwLmNgLCB3aGljaCBpcyBjZW50cmFsIHRvIHRoZSBjb3JlIG1lbW9yeSBtYW5hZ2VtZW50IHN3YXAtaW4gbG9naWMgYW5kIGludHJvZHVjZXMgbmV3IGFzc2VydGlvbi9jaGVja2luZyBiZWhhdmlvciB3aGljaCBtYXkgYmUgcmVhY2hlZCBpbiB2aXJ0dWFsaXplZCBlbnZpcm9ubWVudHMuIFRoaXMgaXMgYSBjcml0aWNhbCBjaGFuZ2UgYmVjYXVzZSBpdCBjaGFuZ2VzIGhvdyBsYXJnZSBmb2xpb3MgYXJlIGhhbmRsZWQgaW4genN3YXAuIFRoaXMgY291bGQgcG90ZW50aWFsbHkgbGVhZCB0byBuZXcgYW5kIGludGVyZXN0aW5nIGVkZ2UgY2FzZXMgYW5kIHZ1bG5lcmFiaWxpdGllcywgc28gaXQncyBzb21ldGhpbmcgdGhhdCAqYWJzb2x1dGVseSogbmVlZHMgZnV6emluZyBhbmQgdGhvcm91Z2ggdGVzdGluZy5cblxuVGhpcyBhbGwgY2hlY2tzIG91dDsgYWxsIHJlcXVpcmVtZW50cyBoYXZlIGJlZW4gbWV0IGFuZCB0aGUgaW1wbGljYXRpb25zIGFyZSBjbGVhci4gSSdtIHJlYWR5IHRvIGBzZXQtcmVzdWx0c2AuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjk4ODYsIk91dHB1dFRva2VucyI6MTE0LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MzkyLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA3VDIwOjM3OjQyLjExMzY0MzAzN1oiLCJTZXEiOjE0LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJzZXQtcmVzdWx0cyIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjgzMTMxNDA4LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJTV0FQXCIsXG4gICAgXCJaU1dBUFwiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcInpzd2FwX2xvYWRcIixcbiAgICBcInN3YXBfcmVhZF9mb2xpb1wiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIG1vZGlmaWVzIG1lbW9yeSBtYW5hZ2VtZW50IGxvZ2ljIGluIG1tL3pzd2FwLmMgYnkgaW50cm9kdWNpbmcgenN3YXBfaXNfcHJlc2VudCgpIGFuZCB1cGRhdGluZyB6c3dhcF9sb2FkKCkgdG8gaW5zcGVjdCBsYXJnZSBmb2xpb3MgaW5zdGVhZCBvZiB1bmNvbmRpdGlvbmFsbHkgcmVqZWN0aW5nIHRoZW0uIFRoaXMgY2hhbmdlcyBjb3JlIHN3YXAtaW4gaGFuZGxpbmcgYW5kIGFzc2VydGlvbnMgaW4gcmVhY2hhYmxlIG1tIGNvZGUsIHdhcnJhbnRpbmcgZnV6emluZy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJTV0FQXCIsXG4gICAgXCJaU1dBUFwiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcInpzd2FwX2xvYWRcIixcbiAgICBcInN3YXBfcmVhZF9mb2xpb1wiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIG1vZGlmaWVzIG1lbW9yeSBtYW5hZ2VtZW50IGxvZ2ljIGluIG1tL3pzd2FwLmMgYnkgaW50cm9kdWNpbmcgenN3YXBfaXNfcHJlc2VudCgpIGFuZCB1cGRhdGluZyB6c3dhcF9sb2FkKCkgdG8gaW5zcGVjdCBsYXJnZSBmb2xpb3MgaW5zdGVhZCBvZiB1bmNvbmRpdGlvbmFsbHkgcmVqZWN0aW5nIHRoZW0uIFRoaXMgY2hhbmdlcyBjb3JlIHN3YXAtaW4gaGFuZGxpbmcgYW5kIGFzc2VydGlvbnMgaW4gcmVhY2hhYmxlIG1tIGNvZGUsIHdhcnJhbnRpbmcgZnV6emluZy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDdUMjA6Mzc6NDIuMTk2NzgyMzQ1WiIsIlNlcSI6MTUsIk5lc3RpbmciOjEsIlR5cGUiOiJhY3Rpb24iLCJOYW1lIjoiSWYiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNzk5NjA3NTU1NCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA3VDIwOjM3OjQyLjE5NzU0NTE0NVoiLCJTZXEiOjE2LCJOZXN0aW5nIjoyLCJUeXBlIjoiYWdlbnQiLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJjb3JlIiwiRHVyYXRpb24iOjE3OTk1MzA4NDM0LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBtb2RpZmllcyBgenN3YXBfbG9hZCgpYCB0byBzdXBwb3J0IGNoZWNraW5nIHdoZXRoZXIgbGFyZ2UgZm9saW9zIGhhdmUgZW50cmllcyBpbiB6c3dhcCB2aWEgYHpzd2FwX2lzX3ByZXNlbnQoKWAuIElmIG5vIGVudHJpZXMgaW4gdGhlIHJhbmdlIGFyZSBjYWNoZWQgaW4genN3YXAsIGl0IHJldHVybnMgYC1FTk9FTlRgIHNvIHRoZSBiYWNraW5nIHN3YXAgZGV2aWNlIGNhbiByZWFkIHRoZSBlbnRpcmUgbGFyZ2UgZm9saW8gaW5zdGVhZCBvZiB1bmNvbmRpdGlvbmFsbHkgZmFpbGluZyB3aXRoIGAtRUlOVkFMYC5cXG5cXG5BbGwgdmFyaWFibGVzIHVzZWQgaW4gdGhlIG5ld2x5IGludHJvZHVjZWQgYHpzd2FwX2lzX3ByZXNlbnQoKWAgZnVuY3Rpb24gKGBvZmZzZXRgLCBgdHJlZWAsIGBpbmRleGApIGFyZSBmdWxseSBpbml0aWFsaXplZCBzY2FsYXIgYW5kIHBvaW50ZXIgdmFsdWVzLiBUaGUgcGF0Y2ggZG9lcyBub3QgYWxsb2NhdGUgbmV3IHN0cnVjdHVyZXMsIGNvcHkgdW5pbml0aWFsaXplZCBtZW1vcnkgdG8gdXNlciBzcGFjZSwgYnJhbmNoIG9uIHVuaW5pdGlhbGl6ZWQgdmFsdWVzLCBvciBhbHRlciBidWZmZXIgbGVuZ3RocyBpbiBhIHdheSB0aGF0IHdvdWxkIGxlYXZlIHVuaW5pdGlhbGl6ZWQga2VybmVsIG1lbW9yeSBleHBvc2VkLiBBbnkgcG90ZW50aWFsIHBhZ2UvZm9saW8gc3RhdGUgaXNzdWVzIG9yIG91dC1vZi1ib3VuZHMgaW5kZXggaXNzdWVzIGFyZSBhZGVxdWF0ZWx5IGNvdmVyZWQgYnkgc3RhbmRhcmQgYXNzZXJ0aW9ucyBhbmQgS0FTQU4uIFRoZXJlZm9yZSwgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGlzIG5vdCByZXF1aXJlZC5cIixcbiAgXCJOZWVkc0tNU0FOXCI6IGZhbHNlXG59IiwiSW5zdHJ1Y3Rpb24iOiJZb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgc2VjdXJpdHkgZW5naW5lZXIgc3BlY2lhbGl6aW5nIGluIGtlcm5lbCBtZW1vcnlcbmVycm9yIGRldGVjdG9ycyAoS0FTQU4gYW5kIEtNU0FOKS4gWW91ciBqb2IgaXMgdG8gcmV2aWV3IHRoZSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kXG5kZXRlcm1pbmUgaWYgdGhlIGNvZGUgY2hhbmdlcyBqdXN0aWZ5IHNwYXduaW5nIGEgZGVkaWNhdGVkIEtNU0FOIChLZXJuZWxNZW1vcnlTYW5pdGl6ZXIpXG5mdXp6aW5nIHNlc3Npb24gaW4gYWRkaXRpb24gdG8gc3RhbmRhcmQgS0FTQU4gZnV6emluZy5cblxuQ1JJVElDQUwgRElTVElOQ1RJT04gQkVUV0VFTiBLQVNBTiBBTkQgS01TQU46XG4tIFN0YW5kYXJkIEtBU0FOIGtlcm5lbCBidWlsZHMgKHVwc3RyZWFtLWFwcGFybW9yLWthc2FuLmNvbmZpZykgYWxyZWFkeSBlbmFibGVcbiAgYSBjb21wcmVoZW5zaXZlIHN1aXRlIG9mIGRlYnVnZ2luZyB0b29scyBhbmQgc2FuaXRpemVycywgaW5jbHVkaW5nIEtBU0FOXG4gIChvdXQtb2YtYm91bmRzIGFjY2Vzc2VzLCB1c2UtYWZ0ZXItZnJlZSwgZG91YmxlIGZyZWUsIGludmFsaWQgZnJlZSksIExPQ0tERVBcbiAgKGxvY2tpbmcgYnVncyBhbmQgZGVhZGxvY2tzKSwgVUItc2FuaXRpemVycywgYW5kIG1lbW9yeSBjb3JydXB0aW9uIGNoZWNrcy5cbi0gS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcikgZGV0ZWN0cyByZWFkcyBvZiBVTklOSVRJQUxJWkVEIG1lbW9yeSAoc3RhY2ssIGhlYXAsXG4gIG9yIHBhZ2UgYWxsb2NhdGlvbnMpIGFuZCBrZXJuZWwtdG8tdXNlciBtZW1vcnkgaW5mby1sZWFrcy5cblxuUnVsZTogVEhFUkUgSVMgTk8gU0VOU0UgSU4gUlVOTklORyBBIEtNU0FOIFNFU1NJT04gSUYgQSBCVUcgQ0FOIEJFIENBVUdIVCBCWSBLQVNBTixcbkxPQ0tERVAsIE9SIE9USEVSIFNUQU5EQVJEIEJVRyBERVRFQ1RPUlMuXG5BIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaW5jdXJzIHNpZ25pZmljYW50IHJlc291cmNlIGNvc3RzLiBZb3UgbXVzdCBPTkxZXG5zZXQgTmVlZHNLTVNBTj10cnVlIGlmIHRoZSBjb2RlIGNoYW5nZXMgaW50cm9kdWNlIG9yIGV4cG9zZSBVTklOSVRJQUxJWkVEIE1FTU9SWSByaXNrc1xudGhhdCBhcmUgZGV0ZWN0ZWQgT05MWSBieSBLTVNBTi5cblxuTG9vayBob2xpc3RpY2FsbHkgYXQgdGhlIHBhdGNoIHNlcmllcyBhbmQgc3Vycm91bmRpbmcgY29kZS4gRXZlbiBpZiBubyBkaXJlY3RcbnVuaW5pdGlhbGl6ZWQgZmllbGQgYWNjZXNzZXMgb3IgbmV3IGJ1ZmZlciBhbGxvY2F0aW9ucyBhcmUgYWRkZWQgaW4gdGhlIGRpZmYgaXRzZWxmLFxuYSBwYXRjaCBtYXkgYWx0ZXIgY29udHJvbCBmbG93LCBib3VuZHMgY2hlY2tpbmcsIG9yIGRhdGEgbGVuZ3RoIGNhbGN1bGF0aW9ucyBpbiB3YXlzXG50aGF0IGNoYW5nZSBob3cgdGhlIHJlc3Qgb2YgdGhlIGNvZGUgb3BlcmF0ZXMgb24gZXhpc3RpbmcgYnVmZmVycyAoZS5nLiBhbGxvd2luZ1xudW5pbml0aWFsaXplZCBzdGFjay9oZWFwIG1lbW9yeSB0byBiZSByZWFkLCBjb3BpZWQgdG8gdXNlciBzcGFjZSwgb3IgdXNlZCBpbiBjb250cm9sXG5mbG93KS4gRG8gbm90IGhlc2l0YXRlIHRvIHVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUsXG5jYWxsZWQgZnVuY3Rpb25zLCBhbmQgY2FsbGVycy5cblxuU2V0IE5lZWRzS01TQU49dHJ1ZSBPTkxZIElGIHRoZSBwYXRjaCBpbnRyb2R1Y2VzIG9yIG1vZGlmaWVzOlxuMS4gS2VybmVsIHN0cnVjdHVyZXMgc2VudCB0byB1c2VyIHNwYWNlICh2aWEgY29weV90b191c2VyLCBwdXRfdXNlciwgbmV0bGluayBza2JcbiAgIGF0dHJpYnV0ZXMsIGlvY3RsIG91dHB1dCBhcmd1bWVudHMsIHNvY2tldCBvcHRpb25zLCBvciBCUEYgYnVmZmVycykgd2hlcmUgZmllbGRzXG4gICBvciBzdHJ1Y3R1cmUgcGFkZGluZyBtaWdodCBub3QgYmUgZnVsbHkgaW5pdGlhbGl6ZWQvemVyb2VkLlxuMi4gQ29uZGl0aW9uYWwgbG9naWMgb3IgYnJhbmNoaW5nIHRoYXQgZGVwZW5kcyBvbiBwb3RlbnRpYWxseSB1bmluaXRpYWxpemVkIHZhcmlhYmxlc1xuICAgb3Igc3RydWN0IGZpZWxkcy5cbjMuIEFsbG9jYXRpb24gb3IgaW5pdGlhbGl6YXRpb24gb2YgY29tcGxleCBkYXRhIHN0cnVjdHVyZXMgd2hlcmUgdW5pbml0aWFsaXplZCBmaWVsZHNcbiAgIGNvdWxkIGJlIHJlYWQgbGF0ZXIgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMuXG40LiBCb3VuZHMgY2hlY2tzLCBsZW5ndGhzLCBvciBsb2dpYyBpbiBhIHdheSB0aGF0IGFsbG93cyBzdXJyb3VuZGluZyBjb2RlIHRvIGFjY2Vzc1xuICAgdW5pbml0aWFsaXplZCBieXRlcyBvZiBleGlzdGluZyBidWZmZXJzLlxuXG5TZXQgTmVlZHNLTVNBTj1mYWxzZSBJRjpcbi0gVGhlIGNvZGUgY2hhbmdlcyBwcmltYXJpbHkgcmlzayBvdXQtb2YtYm91bmRzIGFjY2VzcywgYXJyYXkgb3ZlcmZsb3dzLCBOVUxMIHBvaW50ZXJcbiAgZGVyZWZlcmVuY2VzLCBsb2NraW5nIGRlYWRsb2Nrcywgb3IgdXNlLWFmdGVyLWZyZWUgYnVncyAodGhlc2UgYXJlIGFscmVhZHkgY2F1Z2h0XG4gIGJ5IEtBU0FOLCBMT0NLREVQLCBvciBzdGFuZGFyZCBidWcgZGV0ZWN0b3JzKS5cbi0gQWxsIHN0YWNrL2hlYXAgc3RydWN0dXJlcyB0b3VjaGVkIG9yIGludHJvZHVjZWQgYnkgdGhlIHBhdGNoIGFyZSBmdWxseSB6ZXJvZWRcbiAgb3IgaW5pdGlhbGl6ZWQgKGUuZy4gdXNpbmcgPSB7MH0sIG1lbXNldCwga3phbGxvYykgYmVmb3JlIGJlaW5nIHJlYWQgb3IgY29waWVkLlxuLSBUaGUgcGF0Y2ggZG9lcyBub3QgaW50cm9kdWNlIGFueSByaXNrIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHVzYWdlIG9yIGluZm8tbGVha3MuXG5cblVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUgaWYgbmVjZXNzYXJ5LCB0aGVuIHByb3ZpZGVcbmRldGFpbGVkIEtNU0FOUmVhc29uaW5nIGNvbnRyYXN0aW5nIEtBU0FOIHZzIEtNU0FOIGFwcGxpY2FiaWxpdHkgZm9yIHRoaXMgcGF0Y2guXG5QcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy5cblxuXG5Vc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLlxuSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuXG5JZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuXG4iLCJQcm9tcHQiOiJUYXJnZXQgYXJjaGl0ZWN0dXJlOiBhbWQ2NFxuXG5Gb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczpcbmNvbW1pdCAwYWNlMmRiMzUxYWQwYTdlZGI5MGE2Y2EwNDkzNTc0OGJiYzcyZmQxXG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIE1vbiBTZXAgNyAyMDozNzowOSAyMDI2ICswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL21tL3pzd2FwLmMgYi9tbS96c3dhcC5jXG5pbmRleCAzN2YzNGU0MDZjOGUzLi5mZDM2YWMzOGU5YTFlIDEwMDY0NFxuLS0tIGEvbW0venN3YXAuY1xuKysrIGIvbW0venN3YXAuY1xuQEAgLTE1NzEsNiArMTU3MSwzMiBAQCBib29sIHpzd2FwX3N0b3JlKHN0cnVjdCBmb2xpbyAqZm9saW8pXG4gXHRyZXR1cm4gcmV0O1xuIH1cbiBcbisvKipcbisgKiB6c3dhcF9pc19wcmVzZW50KCkgLSBpcyBhbnkgc2xvdCBpbiBbZW50cnksIGVudHJ5ICsgbnIpIGluIHpzd2FwP1xuKyAqIEBlbnRyeTogYmFzZSBzd2FwIGVudHJ5IG9mIHRoZSByYW5nZVxuKyAqIEBucjogbnVtYmVyIG9mIGNvbnRpZ3VvdXMgc2xvdHMgdG8gY2hlY2tcbisgKlxuKyAqIENvbnRleHQ6IFRoZSBjYWxsZXIgbXVzdCBrZWVwIHRoZSByYW5nZSBwaW5uZWQsIG90aGVyd2lzZSB0aGUgYW5zd2VyIGNhblxuKyAqIGNoYW5nZSB1bmRlciBpdC5cbisgKiBSZXR1cm46IHRydWUgaWYgYXQgbGVhc3Qgb25lIHNsb3QgaW4gdGhlIHJhbmdlIGlzIGluIHpzd2FwLlxuKyAqL1xuK3N0YXRpYyBib29sIHpzd2FwX2lzX3ByZXNlbnQoc3dwX2VudHJ5X3QgZW50cnksIHVuc2lnbmVkIGludCBucilcbit7XG4rXHRwZ29mZl90IG9mZnNldCA9IHN3cF9vZmZzZXQoZW50cnkpO1xuK1x0c3RydWN0IHhhcnJheSAqdHJlZSA9IHN3YXBfenN3YXBfdHJlZShlbnRyeSk7XG4rXHR1bnNpZ25lZCBsb25nIGluZGV4ID0gb2Zmc2V0O1xuK1xuK1x0LypcbitcdCAqIEEgcGlubmVkIHJhbmdlIGlzIGF0IG1vc3QgU1dBUEZJTEVfQ0xVU1RFUiBzbG90cyBhbmQgaXMgYWxpZ25lZCB0b1xuK1x0ICogaXRzIG93biBzaXplLCBzbyBvbmUgdHJlZSBjb3ZlcnMgYWxsIG9mIGl0IGFuZCBhIHNpbmdsZSBsb29rdXAgaXNcbitcdCAqIGVub3VnaC4gU2Nhbm5pbmcgb25seSBwYXJ0IG9mIHRoZSByYW5nZSB3b3VsZCByZXBvcnQgYSBmYWxzZVxuK1x0ICogXCJhYnNlbnRcIiBhbmQgbGV0IHRoZSBjYWxsZXIgcmVhZCBhIHN0YWxlIGNvcHkgZnJvbSB0aGUgZGV2aWNlLlxuK1x0ICovXG4rXHRCVUlMRF9CVUdfT04oU1dBUEZJTEVfQ0xVU1RFUiBcdTAwM2UgWlNXQVBfQUREUkVTU19TUEFDRV9QQUdFUyk7XG4rXG4rXHRyZXR1cm4geGFfZmluZCh0cmVlLCBcdTAwMjZpbmRleCwgb2Zmc2V0ICsgbnIgLSAxLCBYQV9QUkVTRU5UKTtcbit9XG4rXG4gLyoqXG4gICogenN3YXBfbG9hZCgpIC0gbG9hZCBhIGZvbGlvIGZyb20genN3YXBcbiAgKiBAZm9saW86IGZvbGlvIHRvIGxvYWRcbkBAIC0xNTc4LDE1ICsxNjA0LDEyIEBAIGJvb2wgenN3YXBfc3RvcmUoc3RydWN0IGZvbGlvICpmb2xpbylcbiAgKiBSZXR1cm46IDAgb24gc3VjY2Vzcywgd2l0aCB0aGUgZm9saW8gdW5sb2NrZWQgYW5kIG1hcmtlZCB1cC10by1kYXRlLCBvciBvbmVcbiAgKiBvZiB0aGUgZm9sbG93aW5nIGVycm9yIGNvZGVzOlxuICAqXG4tICogIC1FSU86IGlmIHRoZSBzd2FwcGVkIG91dCBjb250ZW50IHdhcyBpbiB6c3dhcCwgYnV0IGNvdWxkIG5vdCBiZSBsb2FkZWRcbi0gKiAgaW50byB0aGUgcGFnZSBkdWUgdG8gYSBkZWNvbXByZXNzaW9uIGZhaWx1cmUuIFRoZSBmb2xpbyBpcyB1bmxvY2tlZCwgYnV0XG4tICogIE5PVCBtYXJrZWQgdXAtdG8tZGF0ZSwgc28gdGhhdCBhbiBJTyBlcnJvciBpcyBlbWl0dGVkIChlLmcuIGRvX3N3YXBfcGFnZSgpXG4tICogIHdpbGwgU0lHQlVTKS5cbi0gKlxuLSAqICAtRUlOVkFMOiBpZiB0aGUgc3dhcHBlZCBvdXQgY29udGVudCB3YXMgaW4genN3YXAsIGJ1dCB0aGUgcGFnZSBiZWxvbmdzXG4tICogIHRvIGEgbGFyZ2UgZm9saW8sIHdoaWNoIGlzIG5vdCBzdXBwb3J0ZWQgYnkgenN3YXAuIFRoZSBmb2xpbyBpcyB1bmxvY2tlZCxcbi0gKiAgYnV0IE5PVCBtYXJrZWQgdXAtdG8tZGF0ZSwgc28gdGhhdCBhbiBJTyBlcnJvciBpcyBlbWl0dGVkIChlLmcuXG4tICogIGRvX3N3YXBfcGFnZSgpIHdpbGwgU0lHQlVTKS5cbisgKiAgLUVJTzogaWYgdGhlIHN3YXBwZWQgb3V0IGNvbnRlbnQgd2FzIGluIHpzd2FwIGJ1dCBjb3VsZCBub3QgYmUgaGFuZGVkXG4rICogIGJhY2ssIGVpdGhlciBiZWNhdXNlIGRlY29tcHJlc3Npb24gZmFpbGVkIG9yIGJlY2F1c2UgYSBzbG90IGluIGFcbisgKiAgbGFyZ2UtZm9saW8gcmFuZ2UgaXMgc3RpbGwgaW4genN3YXAgYW5kIHpzd2FwIGNhbm5vdCByZWNvbnN0cnVjdCBhIGxhcmdlXG4rICogIGZvbGlvIGZyb20gcGVyLXBhZ2UgZW50cmllcy4gVGhlIGZvbGlvIGlzIHVubG9ja2VkLCBidXQgTk9UIG1hcmtlZFxuKyAqICB1cC10by1kYXRlLCBzbyB0aGF0IGFuIElPIGVycm9yIGlzIGVtaXR0ZWQgKGUuZy4gZG9fc3dhcF9wYWdlKCkgd2lsbFxuKyAqICBTSUdCVVMpLlxuICAqXG4gICogIC1FTk9FTlQ6IGlmIHRoZSBzd2FwcGVkIG91dCBjb250ZW50IHdhcyBub3QgaW4genN3YXAuIFRoZSBmb2xpbyByZW1haW5zXG4gICogIGxvY2tlZCBvbiByZXR1cm4uXG5AQCAtMTYwNSwxMyArMTYyOCwxOCBAQCBpbnQgenN3YXBfbG9hZChzdHJ1Y3QgZm9saW8gKmZvbGlvKVxuIFx0XHRyZXR1cm4gLUVOT0VOVDtcbiBcbiBcdC8qXG4tXHQgKiBMYXJnZSBmb2xpb3Mgc2hvdWxkIG5vdCBiZSBzd2FwcGVkIGluIHdoaWxlIHpzd2FwIGlzIGJlaW5nIHVzZWQsIGFzXG4tXHQgKiB0aGV5IGFyZSBub3QgcHJvcGVybHkgaGFuZGxlZC4gWnN3YXAgZG9lcyBub3QgcHJvcGVybHkgbG9hZCBsYXJnZVxuLVx0ICogZm9saW9zLCBhbmQgYSBsYXJnZSBmb2xpbyBtYXkgb25seSBiZSBwYXJ0aWFsbHkgaW4genN3YXAuXG4rXHQgKiBBIGxhcmdlIGZvbGlvIGNhbiBsZWdpdGltYXRlbHkgcmVhY2ggenN3YXBfbG9hZCgpIHdpdGggaXRzIHdob2xlXG4rXHQgKiByYW5nZSBvbiB0aGUgYmFja2luZyBkZXZpY2UsIHNvIHNjYW4gdGhlIHJhbmdlIHJhdGhlciB0aGFuIHJlamVjdGluZ1xuK1x0ICogaXQgb3V0cmlnaHQuIFRoZSBjYWxsZXIgaGFzIHBpbm5lZCBldmVyeSBzbG90LCBzbyB6c3dhcCBjYW5ub3Qgc3RhcnRcbitcdCAqIGEgc3RvcmUgb3IgYSB3cml0ZWJhY2sgaW50byB0aGUgcmFuZ2Ugd2hpbGUgd2UgbG9vay5cbiBcdCAqL1xuLVx0aWYgKFdBUk5fT05fT05DRShmb2xpb190ZXN0X2xhcmdlKGZvbGlvKSkpIHtcbi1cdFx0Zm9saW9fdW5sb2NrKGZvbGlvKTtcbi1cdFx0cmV0dXJuIC1FSU5WQUw7XG4rXHRpZiAoZm9saW9fdGVzdF9sYXJnZShmb2xpbykpIHtcbitcdFx0aWYgKFdBUk5fT05fT05DRSh6c3dhcF9pc19wcmVzZW50KHN3cCxcbitcdFx0XHRcdFx0XHQgIGZvbGlvX25yX3BhZ2VzKGZvbGlvKSkpKSB7XG4rXHRcdFx0Zm9saW9fdW5sb2NrKGZvbGlvKTtcbitcdFx0XHRyZXR1cm4gLUVJTztcbitcdFx0fVxuK1x0XHRyZXR1cm4gLUVOT0VOVDtcbiBcdH1cbiBcbiBcdGVudHJ5ID0geGFfbG9hZCh0cmVlLCBvZmZzZXQpO1xuIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDdUMjA6Mzc6NDIuMTk3NTQ2MTk1WiIsIlNlcSI6MTcsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjU0MzU4MTQwOTcsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSBhbmFseXNpcyBvZiB0aGUgc2l0dWF0aW9uOlxuXG4qKktNU0FOIFBhdGNoIEFzc2Vzc21lbnQgZm9yIHpzd2FwLmMqKlxuXG5BbHJpZ2h0LCBsZXQncyBkaXZlIGludG8gdGhpcy4gVGhlIGZpcnN0IHN0ZXAgaXMgY2xlYXI6IHdlIG5lZWQgdG8gYXNzZXNzIHRoaXMgcGF0Y2ggdG8gZmlndXJlIG91dCBpZiBLTVNBTiAoS2VybmVsIE1lbW9yeSBTYW5pdGl6ZXIpIGlzIGFjdHVhbGx5IG5lY2Vzc2FyeS4gVGhlIGZhY3QgdGhhdCB0aGUgcGF0Y2ggaXMgaW4gYG1tL3pzd2FwLmNgIG5hcnJvd3Mgb3VyIGZvY3VzIHNpZ25pZmljYW50bHksIHdoaWNoIGlzIGdvb2QuXG5cbk15IGltbWVkaWF0ZSBpbnN0aW5jdCBpcyB0byBsb29rIGF0IHRoZSBkaWZmLiBJJ2xsIHBvcmUgb3ZlciB0aGUgY29kZSBjaGFuZ2VzLCBidXQgSSdsbCBuZWVkIGNvbnRleHQuIEknbGwgcmVhZCB0aGUgc3Vycm91bmRpbmcgY29kZSBpbiBgbW0venN3YXAuY2AgYXJvdW5kIHRoZSBzcGVjaWZpYyBsaW5lcyB0aGF0IGFyZSBjaGFuZ2VkLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGUgbG9naWMgZmxvdyBhbmQgdGhlIGRhdGEgc3RydWN0dXJlcyBpbnZvbHZlZCwgdG8gdW5kZXJzdGFuZCB0aGUgaW50ZW50IG9mIHRoaXMgcGF0Y2guXG5cbkkgd2lsbCBhbHNvIGRvIGEgcXVpY2sgYGdyZXBgIG9yIGByZWFkLWZpbGVgIHRvIGNoZWNrIHRoZSBjb250ZXh0IGFyb3VuZCBgenN3YXBfbG9hZCgpYCB3aGljaCBpcyBsaWtlbHkgd2hlcmUgdGhlIHBhdGNoIHdpbGwgaGF2ZSB0aGUgbW9zdCBpbXBhY3QuIEkgd2FudCB0byBzZWUgaG93IGRhdGEgaXMgbG9hZGVkLCBtYW5pcHVsYXRlZCwgYW5kIHN1YnNlcXVlbnRseSB1c2VkLiBUaGlzIHdpbGwgaGVscCBtZSB1bmRlcnN0YW5kIHdoZXRoZXIgdW5pbml0aWFsaXplZCBtZW1vcnkgaXMgcG9zc2libHkgYmVpbmcgdXNlZC4gSSB3aWxsIGxpa2VseSBuZWVkIHRvIHVuZGVyc3RhbmQgd2hhdCB0aGUgcGF0Y2ggaXMgZG9pbmcgd2l0aCB0aGF0IGRhdGEgdG8gc2VlIGlmIHdlIGhhdmUgYSBLTVNBTiBwcm9ibGVtLlxuXG5cbiIsIklucHV0VG9rZW5zIjozMDEwLCJPdXRwdXRUb2tlbnMiOjM1LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NjksIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wN1QyMDozNzo0Ny42MzMzNjI3OTJaIiwiU2VxIjoxOCwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MjAzODUwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcIm1tL3pzd2FwLmNcIixcbiAgXCJGaXJzdExpbmVcIjogMTU2NSxcbiAgXCJMaW5lQ291bnRcIjogOTBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiMTU2NTpcXHRcXHRcXHRcXHRlbnRyeSA9IHhhX2VyYXNlKHRyZWUsIG9mZnNldCArIGluZGV4KTtcXG4xNTY2OlxcdFxcdFxcdFxcdGlmIChlbnRyeSlcXG4xNTY3OlxcdFxcdFxcdFxcdFxcdHpzd2FwX2VudHJ5X2ZyZWUoZW50cnkpO1xcbjE1Njg6XFx0XFx0XFx0fVxcbjE1Njk6XFx0XFx0fVxcbjE1NzA6XFx0XFxuMTU3MTpcXHRcXHRyZXR1cm4gcmV0O1xcbjE1NzI6XFx0fVxcbjE1NzM6XFx0XFxuMTU3NDpcXHQvKipcXG4xNTc1OlxcdCAqIHpzd2FwX2lzX3ByZXNlbnQoKSAtIGlzIGFueSBzbG90IGluIFtlbnRyeSwgZW50cnkgKyBucikgaW4genN3YXA/XFxuMTU3NjpcXHQgKiBAZW50cnk6IGJhc2Ugc3dhcCBlbnRyeSBvZiB0aGUgcmFuZ2VcXG4xNTc3OlxcdCAqIEBucjogbnVtYmVyIG9mIGNvbnRpZ3VvdXMgc2xvdHMgdG8gY2hlY2tcXG4xNTc4OlxcdCAqXFxuMTU3OTpcXHQgKiBDb250ZXh0OiBUaGUgY2FsbGVyIG11c3Qga2VlcCB0aGUgcmFuZ2UgcGlubmVkLCBvdGhlcndpc2UgdGhlIGFuc3dlciBjYW5cXG4xNTgwOlxcdCAqIGNoYW5nZSB1bmRlciBpdC5cXG4xNTgxOlxcdCAqIFJldHVybjogdHJ1ZSBpZiBhdCBsZWFzdCBvbmUgc2xvdCBpbiB0aGUgcmFuZ2UgaXMgaW4genN3YXAuXFxuMTU4MjpcXHQgKi9cXG4xNTgzOlxcdHN0YXRpYyBib29sIHpzd2FwX2lzX3ByZXNlbnQoc3dwX2VudHJ5X3QgZW50cnksIHVuc2lnbmVkIGludCBucilcXG4xNTg0OlxcdHtcXG4xNTg1OlxcdFxcdHBnb2ZmX3Qgb2Zmc2V0ID0gc3dwX29mZnNldChlbnRyeSk7XFxuMTU4NjpcXHRcXHRzdHJ1Y3QgeGFycmF5ICp0cmVlID0gc3dhcF96c3dhcF90cmVlKGVudHJ5KTtcXG4xNTg3OlxcdFxcdHVuc2lnbmVkIGxvbmcgaW5kZXggPSBvZmZzZXQ7XFxuMTU4ODpcXHRcXG4xNTg5OlxcdFxcdC8qXFxuMTU5MDpcXHRcXHQgKiBBIHBpbm5lZCByYW5nZSBpcyBhdCBtb3N0IFNXQVBGSUxFX0NMVVNURVIgc2xvdHMgYW5kIGlzIGFsaWduZWQgdG9cXG4xNTkxOlxcdFxcdCAqIGl0cyBvd24gc2l6ZSwgc28gb25lIHRyZWUgY292ZXJzIGFsbCBvZiBpdCBhbmQgYSBzaW5nbGUgbG9va3VwIGlzXFxuMTU5MjpcXHRcXHQgKiBlbm91Z2guIFNjYW5uaW5nIG9ubHkgcGFydCBvZiB0aGUgcmFuZ2Ugd291bGQgcmVwb3J0IGEgZmFsc2VcXG4xNTkzOlxcdFxcdCAqIFxcXCJhYnNlbnRcXFwiIGFuZCBsZXQgdGhlIGNhbGxlciByZWFkIGEgc3RhbGUgY29weSBmcm9tIHRoZSBkZXZpY2UuXFxuMTU5NDpcXHRcXHQgKi9cXG4xNTk1OlxcdFxcdEJVSUxEX0JVR19PTihTV0FQRklMRV9DTFVTVEVSIFxcdTAwM2UgWlNXQVBfQUREUkVTU19TUEFDRV9QQUdFUyk7XFxuMTU5NjpcXHRcXG4xNTk3OlxcdFxcdHJldHVybiB4YV9maW5kKHRyZWUsIFxcdTAwMjZpbmRleCwgb2Zmc2V0ICsgbnIgLSAxLCBYQV9QUkVTRU5UKTtcXG4xNTk4OlxcdH1cXG4xNTk5OlxcdFxcbjE2MDA6XFx0LyoqXFxuMTYwMTpcXHQgKiB6c3dhcF9sb2FkKCkgLSBsb2FkIGEgZm9saW8gZnJvbSB6c3dhcFxcbjE2MDI6XFx0ICogQGZvbGlvOiBmb2xpbyB0byBsb2FkXFxuMTYwMzpcXHQgKlxcbjE2MDQ6XFx0ICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIHdpdGggdGhlIGZvbGlvIHVubG9ja2VkIGFuZCBtYXJrZWQgdXAtdG8tZGF0ZSwgb3Igb25lXFxuMTYwNTpcXHQgKiBvZiB0aGUgZm9sbG93aW5nIGVycm9yIGNvZGVzOlxcbjE2MDY6XFx0ICpcXG4xNjA3OlxcdCAqICAtRUlPOiBpZiB0aGUgc3dhcHBlZCBvdXQgY29udGVudCB3YXMgaW4genN3YXAgYnV0IGNvdWxkIG5vdCBiZSBoYW5kZWRcXG4xNjA4OlxcdCAqICBiYWNrLCBlaXRoZXIgYmVjYXVzZSBkZWNvbXByZXNzaW9uIGZhaWxlZCBvciBiZWNhdXNlIGEgc2xvdCBpbiBhXFxuMTYwOTpcXHQgKiAgbGFyZ2UtZm9saW8gcmFuZ2UgaXMgc3RpbGwgaW4genN3YXAgYW5kIHpzd2FwIGNhbm5vdCByZWNvbnN0cnVjdCBhIGxhcmdlXFxuMTYxMDpcXHQgKiAgZm9saW8gZnJvbSBwZXItcGFnZSBlbnRyaWVzLiBUaGUgZm9saW8gaXMgdW5sb2NrZWQsIGJ1dCBOT1QgbWFya2VkXFxuMTYxMTpcXHQgKiAgdXAtdG8tZGF0ZSwgc28gdGhhdCBhbiBJTyBlcnJvciBpcyBlbWl0dGVkIChlLmcuIGRvX3N3YXBfcGFnZSgpIHdpbGxcXG4xNjEyOlxcdCAqICBTSUdCVVMpLlxcbjE2MTM6XFx0ICpcXG4xNjE0OlxcdCAqICAtRU5PRU5UOiBpZiB0aGUgc3dhcHBlZCBvdXQgY29udGVudCB3YXMgbm90IGluIHpzd2FwLiBUaGUgZm9saW8gcmVtYWluc1xcbjE2MTU6XFx0ICogIGxvY2tlZCBvbiByZXR1cm4uXFxuMTYxNjpcXHQgKi9cXG4xNjE3OlxcdGludCB6c3dhcF9sb2FkKHN0cnVjdCBmb2xpbyAqZm9saW8pXFxuMTYxODpcXHR7XFxuMTYxOTpcXHRcXHRzd3BfZW50cnlfdCBzd3AgPSBmb2xpby1cXHUwMDNlc3dhcDtcXG4xNjIwOlxcdFxcdHBnb2ZmX3Qgb2Zmc2V0ID0gc3dwX29mZnNldChzd3ApO1xcbjE2MjE6XFx0XFx0c3RydWN0IHhhcnJheSAqdHJlZSA9IHN3YXBfenN3YXBfdHJlZShzd3ApO1xcbjE2MjI6XFx0XFx0c3RydWN0IHpzd2FwX2VudHJ5ICplbnRyeTtcXG4xNjIzOlxcdFxcbjE2MjQ6XFx0XFx0Vk1fV0FSTl9PTl9PTkNFKCFmb2xpb190ZXN0X2xvY2tlZChmb2xpbykpO1xcbjE2MjU6XFx0XFx0Vk1fV0FSTl9PTl9PTkNFKCFmb2xpb190ZXN0X3N3YXBjYWNoZShmb2xpbykpO1xcbjE2MjY6XFx0XFxuMTYyNzpcXHRcXHRpZiAoenN3YXBfbmV2ZXJfZW5hYmxlZCgpKVxcbjE2Mjg6XFx0XFx0XFx0cmV0dXJuIC1FTk9FTlQ7XFxuMTYyOTpcXHRcXG4xNjMwOlxcdFxcdC8qXFxuMTYzMTpcXHRcXHQgKiBBIGxhcmdlIGZvbGlvIGNhbiBsZWdpdGltYXRlbHkgcmVhY2ggenN3YXBfbG9hZCgpIHdpdGggaXRzIHdob2xlXFxuMTYzMjpcXHRcXHQgKiByYW5nZSBvbiB0aGUgYmFja2luZyBkZXZpY2UsIHNvIHNjYW4gdGhlIHJhbmdlIHJhdGhlciB0aGFuIHJlamVjdGluZ1xcbjE2MzM6XFx0XFx0ICogaXQgb3V0cmlnaHQuIFRoZSBjYWxsZXIgaGFzIHBpbm5lZCBldmVyeSBzbG90LCBzbyB6c3dhcCBjYW5ub3Qgc3RhcnRcXG4xNjM0OlxcdFxcdCAqIGEgc3RvcmUgb3IgYSB3cml0ZWJhY2sgaW50byB0aGUgcmFuZ2Ugd2hpbGUgd2UgbG9vay5cXG4xNjM1OlxcdFxcdCAqL1xcbjE2MzY6XFx0XFx0aWYgKGZvbGlvX3Rlc3RfbGFyZ2UoZm9saW8pKSB7XFxuMTYzNzpcXHRcXHRcXHRpZiAoV0FSTl9PTl9PTkNFKHpzd2FwX2lzX3ByZXNlbnQoc3dwLFxcbjE2Mzg6XFx0XFx0XFx0XFx0XFx0XFx0XFx0ICBmb2xpb19ucl9wYWdlcyhmb2xpbykpKSkge1xcbjE2Mzk6XFx0XFx0XFx0XFx0Zm9saW9fdW5sb2NrKGZvbGlvKTtcXG4xNjQwOlxcdFxcdFxcdFxcdHJldHVybiAtRUlPO1xcbjE2NDE6XFx0XFx0XFx0fVxcbjE2NDI6XFx0XFx0XFx0cmV0dXJuIC1FTk9FTlQ7XFxuMTY0MzpcXHRcXHR9XFxuMTY0NDpcXHRcXG4xNjQ1OlxcdFxcdGVudHJ5ID0geGFfbG9hZCh0cmVlLCBvZmZzZXQpO1xcbjE2NDY6XFx0XFx0aWYgKCFlbnRyeSlcXG4xNjQ3OlxcdFxcdFxcdHJldHVybiAtRU5PRU5UO1xcbjE2NDg6XFx0XFxuMTY0OTpcXHRcXHRpZiAoIXpzd2FwX2RlY29tcHJlc3MoZW50cnksIGZvbGlvKSkge1xcbjE2NTA6XFx0XFx0XFx0Zm9saW9fdW5sb2NrKGZvbGlvKTtcXG4xNjUxOlxcdFxcdFxcdHJldHVybiAtRUlPO1xcbjE2NTI6XFx0XFx0fVxcbjE2NTM6XFx0XFxuMTY1NDpcXHRcXHRmb2xpb19tYXJrX3VwdG9kYXRlKGZvbGlvKTtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDdUMjA6Mzc6NDcuNjMzNTY4OTkyWiIsIlNlcSI6MTksIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjE3NjExNjcxNjMsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSBhdHRlbXB0IGF0IHN1bW1hcml6aW5nIHRoZSB0aG91Z2h0IHByb2Nlc3MsIHRhaWxvcmVkIGZvciBhbiBleHBlcnQgYXVkaWVuY2U6XG5cbioqVHJhY2luZyB0aGUgenN3YXBfbG9hZCBDYWxsIFBhdGgqKlxuXG5BbHJpZ2h0LCBsZXQncyBkaXZlIGludG8gdGhpcyBgenN3YXBfbG9hZGAgZnVuY3Rpb24uIEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoZSBmdWxsIHN3YXAtaW4gZmxvdyB3aXRoaW4gdGhlIGtlcm5lbCB3aGVuIHV0aWxpemluZyB6c3dhcCwgc28gdHJhY2luZyBpdHMgY2FsbHMgaXMgdGhlIGxvZ2ljYWwgZmlyc3Qgc3RlcC4gSSdtIGdvaW5nIHRvIHN0YXJ0IGJ5IGlkZW50aWZ5aW5nIGFsbCB0aGUgcG9pbnRzIGluIHRoZSBrZXJuZWwgY29kZSB3aGVyZSBgenN3YXBfbG9hZGAgaXMgaW52b2tlZC4gVGhhdCB3aWxsIGdpdmUgbWUgYSBjbGVhciwgdG9wLWRvd24gdmlldyBvZiBob3cgaXQgZml0cyB3aXRoaW4gdGhlIGxhcmdlciBwaWN0dXJlIG9mIHN3YXBwaW5nLiBVbmRlcnN0YW5kaW5nIHRoZSBjYWxsIGNvbnRleHQgc2hvdWxkIGhlbHAgaW4gcXVpY2tseSBpZGVudGlmeWluZyBwb3RlbnRpYWwgYm90dGxlbmVja3MsIG9wdGltaXphdGlvbiBvcHBvcnR1bml0aWVzLCBvciBhbnkgc3VidGxlIGludGVyYWN0aW9ucyB3aXRoIG90aGVyIGtlcm5lbCBzdWJzeXN0ZW1zIEkgbmVlZCB0byBjb25zaWRlci5cblxuXG4iLCJJbnB1dFRva2VucyI6NDc1NywiT3V0cHV0VG9rZW5zIjoxOCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjI0LCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMDdUMjA6Mzc6NDkuMzk0NzM4Mjk1WiIsIlNlcSI6MjAsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyMDUxOTc0MzY4LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcInpzd2FwX2xvYWRcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiaW5jbHVkZS9saW51eC96c3dhcC5oPTI4PWJvb2wgenN3YXBfc3RvcmUoc3RydWN0IGZvbGlvICpmb2xpbyk7XFxuaW5jbHVkZS9saW51eC96c3dhcC5oOjI5OmludCB6c3dhcF9sb2FkKHN0cnVjdCBmb2xpbyAqZm9saW8pO1xcbmluY2x1ZGUvbGludXgvenN3YXAuaC0zMC12b2lkIHpzd2FwX2ludmFsaWRhdGUoc3dwX2VudHJ5X3Qgc3dwKTtcXG4tLVxcbmluY2x1ZGUvbGludXgvenN3YXAuaD00Mj1zdGF0aWMgaW5saW5lIGJvb2wgenN3YXBfc3RvcmUoc3RydWN0IGZvbGlvICpmb2xpbylcXG4tLVxcbmluY2x1ZGUvbGludXgvenN3YXAuaC00Ni1cXG5pbmNsdWRlL2xpbnV4L3pzd2FwLmg6NDc6c3RhdGljIGlubGluZSBpbnQgenN3YXBfbG9hZChzdHJ1Y3QgZm9saW8gKmZvbGlvKVxcbmluY2x1ZGUvbGludXgvenN3YXAuaC00OC17XFxuLS1cXG5tbS9wYWdlX2lvLmM9NDUyPXZvaWQgc3dhcF9yZWFkX2ZvbGlvKHN0cnVjdCBzd2FwX2lvX2N0eCAqY3R4LCBzdHJ1Y3QgZm9saW8gKmZvbGlvKVxcbi0tXFxubW0vcGFnZV9pby5jLTQ3OS1cXG5tbS9wYWdlX2lvLmM6NDgwOlxcdGlmICh6c3dhcF9sb2FkKGZvbGlvKSAhPSAtRU5PRU5UKVxcbm1tL3BhZ2VfaW8uYy00ODEtXFx0XFx0Z290byBmaW5pc2g7XFxuLS1cXG5tbS96c3dhcC5jPTE1ODM9c3RhdGljIGJvb2wgenN3YXBfaXNfcHJlc2VudChzd3BfZW50cnlfdCBlbnRyeSwgdW5zaWduZWQgaW50IG5yKVxcbi0tXFxubW0venN3YXAuYy0xNjAwLS8qKlxcbm1tL3pzd2FwLmM6MTYwMTogKiB6c3dhcF9sb2FkKCkgLSBsb2FkIGEgZm9saW8gZnJvbSB6c3dhcFxcbm1tL3pzd2FwLmMtMTYwMi0gKiBAZm9saW86IGZvbGlvIHRvIGxvYWRcXG4tLVxcbm1tL3pzd2FwLmMtMTYxNi0gKi9cXG5tbS96c3dhcC5jOjE2MTc6aW50IHpzd2FwX2xvYWQoc3RydWN0IGZvbGlvICpmb2xpbylcXG5tbS96c3dhcC5jLTE2MTgte1xcbi0tXFxubW0venN3YXAuYy0xNjMwLVxcdC8qXFxubW0venN3YXAuYzoxNjMxOlxcdCAqIEEgbGFyZ2UgZm9saW8gY2FuIGxlZ2l0aW1hdGVseSByZWFjaCB6c3dhcF9sb2FkKCkgd2l0aCBpdHMgd2hvbGVcXG5tbS96c3dhcC5jLTE2MzItXFx0ICogcmFuZ2Ugb24gdGhlIGJhY2tpbmcgZGV2aWNlLCBzbyBzY2FuIHRoZSByYW5nZSByYXRoZXIgdGhhbiByZWplY3RpbmdcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDdUMjA6Mzc6NTEuNDQ2NzMyNjUzWiIsIlNlcSI6MjEsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjE4NjI4ODIyMzIsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBhIHN1bW1hcnkgb2YgbXkgdGhvdWdodCBwcm9jZXNzLCBhcyByZXF1ZXN0ZWQ6XG5cbioqRGl2aW5nIGludG8gYG1tL3BhZ2VfaW8uY2AqKlxuXG5Pa2F5LCB0aW1lIHRvIGdldCBteSBoYW5kcyBkaXJ0eS4gSSdtIGdvaW5nIHRvIHplcm8gaW4gb24gYG1tL3BhZ2VfaW8uY2AgYW5kIHN0YXJ0IHBva2luZyBhcm91bmQgbGluZSA0ODAuIEkgbmVlZCB0byB1bmRlcnN0YW5kIGhvdyB0aGlzIHBhcnRpY3VsYXIgcGFydCBvZiB0aGUgbWVtb3J5IG1hbmFnZW1lbnQgc3lzdGVtIGlzIHdvcmtpbmcuIFNwZWNpZmljYWxseSwgSSdtIHRoaW5raW5nIGFib3V0IGhvdyB0aGUgcGFnZSBJL08gaXMgaGFuZGxlZCB0aGVyZS4gSSdtIGhvcGluZyB0byBnZXQgYSBjbGVhcmVyIHBpY3R1cmUgb2YgdGhlIGRhdGEgZmxvdyBhbmQgYW55IHBvdGVudGlhbCBib3R0bGVuZWNrcyBvciBhcmVhcyBmb3Igb3B0aW1pemF0aW9uLiBUaGlzIGZlZWxzIGxpa2UgdGhlIHJpZ2h0IHBsYWNlIHRvIHN0YXJ0IGRpZ2dpbmcgZGVlcGVyIGludG8gdGhhdCBpc3N1ZSBJJ3ZlIGJlZW4gY29uc2lkZXJpbmcuIExldCdzIHNlZSB3aGF0IHdlIGNhbiBmaW5kLlxuXG5cbiIsIklucHV0VG9rZW5zIjo1NDM5LCJPdXRwdXRUb2tlbnMiOjM1LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjEsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMDdUMjA6Mzc6NTMuMzA5NjE3NTE1WiIsIlNlcSI6MjIsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjEyMzA2MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJtbS9wYWdlX2lvLmNcIixcbiAgXCJGaXJzdExpbmVcIjogNDYwLFxuICBcIkxpbmVDb3VudFwiOiA1MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgNDYwOlxcdFxcdFZNX0JVR19PTl9GT0xJTyghZm9saW9fdGVzdF9zd2FwY2FjaGUoZm9saW8pIFxcdTAwMjZcXHUwMDI2ICFzeW5jaHJvbm91cywgZm9saW8pO1xcbiA0NjE6XFx0XFx0Vk1fQlVHX09OX0ZPTElPKCFmb2xpb190ZXN0X2xvY2tlZChmb2xpbyksIGZvbGlvKTtcXG4gNDYyOlxcdFxcdFZNX0JVR19PTl9GT0xJTyhmb2xpb190ZXN0X3VwdG9kYXRlKGZvbGlvKSwgZm9saW8pO1xcbiA0NjM6XFx0XFxuIDQ2NDpcXHRcXHQvKlxcbiA0NjU6XFx0XFx0ICogQ291bnQgc3VibWlzc2lvbiB0aW1lIGFzIG1lbW9yeSBzdGFsbCBhbmQgZGVsYXkuIFdoZW4gdGhlIGRldmljZVxcbiA0NjY6XFx0XFx0ICogaXMgY29uZ2VzdGVkLCBvciB0aGUgc3VibWl0dGluZyBjZ3JvdXAgSU8tdGhyb3R0bGVkLCBzdWJtaXNzaW9uXFxuIDQ2NzpcXHRcXHQgKiBjYW4gYmUgYSBzaWduaWZpY2FudCBwYXJ0IG9mIG92ZXJhbGwgSU8gdGltZS5cXG4gNDY4OlxcdFxcdCAqL1xcbiA0Njk6XFx0XFx0aWYgKHdvcmtpbmdzZXQpIHtcXG4gNDcwOlxcdFxcdFxcdGRlbGF5YWNjdF90aHJhc2hpbmdfc3RhcnQoXFx1MDAyNmluX3RocmFzaGluZyk7XFxuIDQ3MTpcXHRcXHRcXHRwc2lfbWVtc3RhbGxfZW50ZXIoXFx1MDAyNnBmbGFncyk7XFxuIDQ3MjpcXHRcXHR9XFxuIDQ3MzpcXHRcXHRkZWxheWFjY3Rfc3dhcGluX3N0YXJ0KCk7XFxuIDQ3NDpcXHRcXG4gNDc1OlxcdFxcdGlmIChzd2FwX3JlYWRfZm9saW9femVyb21hcChmb2xpbykpIHtcXG4gNDc2OlxcdFxcdFxcdGZvbGlvX3VubG9jayhmb2xpbyk7XFxuIDQ3NzpcXHRcXHRcXHRnb3RvIGZpbmlzaDtcXG4gNDc4OlxcdFxcdH1cXG4gNDc5OlxcdFxcbiA0ODA6XFx0XFx0aWYgKHpzd2FwX2xvYWQoZm9saW8pICE9IC1FTk9FTlQpXFxuIDQ4MTpcXHRcXHRcXHRnb3RvIGZpbmlzaDtcXG4gNDgyOlxcdFxcbiA0ODM6XFx0XFx0LyogV2UgaGF2ZSB0byByZWFkIGZyb20gc2xvd2VyIGRldmljZXMuIEluY3JlYXNlIHpzd2FwIHByb3RlY3Rpb24uICovXFxuIDQ4NDpcXHRcXHR6c3dhcF9mb2xpb19zd2FwaW4oZm9saW8pO1xcbiA0ODU6XFx0XFx0c3dhcF9hZGRfZm9saW8oY3R4LCBmb2xpbywgUkVBRCk7XFxuIDQ4NjpcXHRcXG4gNDg3OlxcdGZpbmlzaDpcXG4gNDg4OlxcdFxcdGlmICh3b3JraW5nc2V0KSB7XFxuIDQ4OTpcXHRcXHRcXHRkZWxheWFjY3RfdGhyYXNoaW5nX2VuZChcXHUwMDI2aW5fdGhyYXNoaW5nKTtcXG4gNDkwOlxcdFxcdFxcdHBzaV9tZW1zdGFsbF9sZWF2ZShcXHUwMDI2cGZsYWdzKTtcXG4gNDkxOlxcdFxcdH1cXG4gNDkyOlxcdFxcdGRlbGF5YWNjdF9zd2FwaW5fZW5kKCk7XFxuIDQ5MzpcXHR9XFxuIDQ5NDpcXHRcXG4gNDk1OlxcdHN0YXRpYyB2b2lkIHN3YXBfd3JpdGVfZW5kKHN0cnVjdCBzd2FwX2lvY2IgKnNpbywgYm9vbCBmYWlsZWQpXFxuIDQ5NjpcXHR7XFxuIDQ5NzpcXHRcXHRpbnQgcDtcXG4gNDk4OlxcdFxcbiA0OTk6XFx0XFx0Zm9yIChwID0gMDsgcCBcXHUwMDNjIHNpby1cXHUwMDNlbnJfYnZlY3M7IHArKykge1xcbiA1MDA6XFx0XFx0XFx0c3RydWN0IHBhZ2UgKnBhZ2UgPSBzaW8tXFx1MDAzZWJ2ZWNzW3BdLmJ2X3BhZ2U7XFxuIDUwMTpcXHRcXG4gNTAyOlxcdFxcdFxcdGlmIChmYWlsZWQpIHtcXG4gNTAzOlxcdFxcdFxcdFxcdHNldF9wYWdlX2RpcnR5KHBhZ2UpO1xcbiA1MDQ6XFx0XFx0XFx0XFx0Q2xlYXJQYWdlUmVjbGFpbShwYWdlKTtcXG4gNTA1OlxcdFxcdFxcdH1cXG4gNTA2OlxcdFxcdFxcdGVuZF9wYWdlX3dyaXRlYmFjayhwYWdlKTtcXG4gNTA3OlxcdFxcdH1cXG4gNTA4OlxcdFxcdG1lbXBvb2xfZnJlZShzaW8sIHNpb19wb29sKTtcXG4gNTA5OlxcdH1cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDdUMjA6Mzc6NTMuMzA5NzQyOTc1WiIsIlNlcSI6MjMsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjY4ODMwODYzMTUsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqS01TQU4gQW5hbHlzaXMgb2YgWnN3YXAgTGFyZ2UgRm9saW8gSGFuZGxpbmcqKlxuXG5Pa2F5LCBsZXQncyBicmVhayB0aGlzIGRvd24uIEluIGBzd2FwX3JlYWRfZm9saW9gLCB0aGUgZXhpc3RpbmcgenN3YXAgbG9naWMgaGFzIGJlZW4gdHdlYWtlZCB0byBoYW5kbGUgbGFyZ2UgZm9saW9zIG1vcmUgcm9idXN0bHkuIEJlZm9yZSwgaWYgYSBsYXJnZSBmb2xpbyBoaXQgYHpzd2FwX2xvYWRgLCBpdCB3b3VsZCBpbW1lZGlhdGVseSBXQVJOIGFuZCByZXR1cm4gLUVJTlZBTCwgZXNzZW50aWFsbHkgYmFpbGluZyBvdXQgYW5kIGxlYXZpbmcgdGhlIGZvbGlvIG1lc3NlZCB1cCAobm90IHVwLXRvLWRhdGUgYW5kIHVubG9ja2VkLCB3aGljaCBpcyBiYWQgbmV3cykuIFRoaXMgcGF0Y2ggaW50cm9kdWNlcyBhIG1vcmUgbnVhbmNlZCBhcHByb2FjaC5cblxuTm93LCB3aGVuIGVuY291bnRlcmluZyBhIGxhcmdlIGZvbGlvLCBgenN3YXBgIGNoZWNrcyBpZiAqYW55KiBwYXJ0IG9mIHRoYXQgZm9saW8gaXMgcHJlc2VudCBpbiB6c3dhcCB1c2luZyBgenN3YXBfaXNfcHJlc2VudGAuIElmICphbnkqIHBhcnQgaXMgaW4genN3YXAsIHdlIHN0aWxsIFdBUk4gYW5kIHJldHVybiAtRUlPLCBhcyBiZWZvcmUgKHNvIHdlJ3JlIHN0aWxsIGNhcmVmdWwpLiBIb3dldmVyLCBpZiAqbm90aGluZyogaXMgaW4genN3YXAgKG1lYW5pbmcgdGhlIHdob2xlIHRoaW5nJ3Mgb24gdGhlIGJhY2tpbmcgc3dhcCBkZXZpY2UpLCB3ZSBub3cgcmV0dXJuIC1FTk9FTlQuIFRoaXMgaXMga2V5ISBUaGlzIC1FTk9FTlQgYWxsb3dzIGBzd2FwX3JlYWRfZm9saW9gIHRvIHByb2NlZWQgYW5kIHJlYWQgdGhlIGVudGlyZSBsYXJnZSBmb2xpbyBmcm9tIHRoZSBiYWNraW5nIHN3YXAgZGV2aWNlIHVzaW5nIGBzd2FwX2FkZF9mb2xpb2AuIFRoaXMgaXMgdGhlIG5ldyBiZWhhdmlvci5cblxuU28sIHRoZSBiaWcgcXVlc3Rpb24gaXMsIGFyZSB3ZSBpbnRyb2R1Y2luZyBhbnkgdW5pbml0aWFsaXplZCBtZW1vcnkgcmlza3Mgd2l0aCB0aGlzIGNoYW5nZT8gTGV0J3MgYW5hbHl6ZS5cblxuRmlyc3QsIGFwcGxpY2FiaWxpdHkgb2YgS01TQU4gdnMgS0FTQU46XG5cbjEuICAqKlVzZXJzcGFjZSBleHBvc3VyZToqKiBBcmUga2VybmVsIHN0cnVjdHVyZXMgbGVha2luZyB1bmluaXRpYWxpemVkIGZpZWxkcyB0byB1c2Vyc3BhY2U/IE5vcGUuIE5vdCBoZXJlLlxuMi4gICoqQ29uZGl0aW9uYWwgbG9naWM6KiogSXMgb3VyIHByb2dyYW0gZmxvdyBkZXBlbmRpbmcgb24gdW5pbml0aWFsaXplZCB2YXJpYWJsZXM/IE5vdCBhdCBhbGwuIFZhcmlhYmxlcyBsaWtlIGBzd3BgLCBgb2Zmc2V0YCwgYHRyZWVgLCBhbmQgYGluZGV4YCBhcmUgYWxsIGluaXRpYWxpemVkIGJlZm9yZSB1c2UuXG4zLiAgKipOZXcgYWxsb2NhdGlvbnM6KiogQW55IG5ldyBhbGxvY2F0aW9ucyBvZiBjb21wbGV4IHN0cnVjdHVyZXMgd2l0aCB1bmluaXRpYWxpemVkIGZpZWxkcz8gTm9wZSwgd2UncmUgbm90IGFsbG9jYXRpbmcgbmV3IHN0cnVjdHVyZXMuXG40LiAgKipCb3VuZHMvbGVuZ3RoczoqKiBBcmUgd2UgZmlkZGxpbmcgd2l0aCBsZW5ndGhzIG9yIGJvdW5kcyBjaGVja3MgaW4gYSB3YXkgdGhhdCBjb3VsZCBleHBvc2UgdW5pbml0aWFsaXplZCBkYXRhPyBOb3BlLiBUaGUgYHN3YXBfYWRkX2ZvbGlvYCBjYWxsIHJlYWRzICpmcm9tKiB0aGUgc3dhcCBkZXZpY2UgaW50byB0aGUgZm9saW8gcGFnZXMuIEl0J3Mgc3VwcG9zZWQgdG8gcmVhZCB0aGUgZGF0YSwgYW5kIG1hcmtzIHRoZSBmb2xpbyB1cC10by1kYXRlIHVwb24gY29tcGxldGlvbi4gSWYgdGhlcmUgYXJlIEkvTyBlcnJvcnMsIGJsb2NrL3N3YXAgbGF5ZXJzIGhhbmRsZSB0aGF0LiBJbnNpZGUgYHpzd2FwX2lzX3ByZXNlbnRgLCB0aGUgYHhhX2ZpbmRgIHRha2VzIGluaXRpYWxpemVkIHZhbHVlcyBmb3IgYm90aCBpdHMgYFx1MDAyNmluZGV4YCBhbmQgYG1heGAgcGFyYW1ldGVycy5cblxuVGhlcmVmb3JlLCB0aGlzIGNoYW5nZSBkb2Vzbid0IGludHJvZHVjZSBhbnkgdW5pbml0aWFsaXplZCBoZWFwIG9yIHN0YWNrIHJlYWRzLCBpbmZvLWxlYWtzIHRvIHVzZXJzcGFjZSwgb3IgdW5pbml0aWFsaXplZCBwYWRkaW5nLiBJdCBsb29rcyBsaWtlIGl0J3MgYWxsIGluaXRpYWxpemVkIHNjYWxhciB0eXBlcyBvbiB0aGUgc3RhY2suXG5cblRvIGJlIGV4dHJhIGNhcmVmdWw6XG5cbiogICBJJ3ZlIGNoZWNrZWQgdGhlIHN0YW5kYXJkIEtBU0FOLCBMT0NLREVQLCBhbmQgVUIgc2FuaXRpemVycyBpbiBjb21wYXJpc29uIHRvIEtNU0FOLiBUaGUgYW5zd2VyIGlzIHN0aWxsIE5vLiBgTmVlZHNLTVNBTmAgc2hvdWxkIGJlIGZhbHNlIGZvciB0aGlzIGNoYW5nZS5cblxuU28sIG92ZXJhbGwsIGFmdGVyIHRoaXMgdGhvcm91Z2ggYW5hbHlzaXMsIEkgY2FuIGNvbmNsdWRlIHRoYXQgdGhpcyBpcyBzYWZlIGFuZCBkb2VzIG5vdCBpbnRyb2R1Y2UgbWVtb3J5IHNhZmV0eSBpc3N1ZXMgd2l0aCBLTVNBTi5cblxuXG4iLCJJbnB1dFRva2VucyI6NjM4NCwiT3V0cHV0VG9rZW5zIjoyMDYsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo3MDUsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0wN1QyMDozODowMC4xOTI4MzMyMzlaIiwiU2VxIjoyNCwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoic2V0LXJlc3VsdHMiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNjY1MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIG1vZGlmaWVzIGB6c3dhcF9sb2FkKClgIHRvIHN1cHBvcnQgY2hlY2tpbmcgd2hldGhlciBsYXJnZSBmb2xpb3MgaGF2ZSBlbnRyaWVzIGluIHpzd2FwIHZpYSBgenN3YXBfaXNfcHJlc2VudCgpYC4gSWYgbm8gZW50cmllcyBpbiB0aGUgcmFuZ2UgYXJlIGNhY2hlZCBpbiB6c3dhcCwgaXQgcmV0dXJucyBgLUVOT0VOVGAgc28gdGhlIGJhY2tpbmcgc3dhcCBkZXZpY2UgY2FuIHJlYWQgdGhlIGVudGlyZSBsYXJnZSBmb2xpbyBpbnN0ZWFkIG9mIHVuY29uZGl0aW9uYWxseSBmYWlsaW5nIHdpdGggYC1FSU5WQUxgLlxcblxcbkFsbCB2YXJpYWJsZXMgdXNlZCBpbiB0aGUgbmV3bHkgaW50cm9kdWNlZCBgenN3YXBfaXNfcHJlc2VudCgpYCBmdW5jdGlvbiAoYG9mZnNldGAsIGB0cmVlYCwgYGluZGV4YCkgYXJlIGZ1bGx5IGluaXRpYWxpemVkIHNjYWxhciBhbmQgcG9pbnRlciB2YWx1ZXMuIFRoZSBwYXRjaCBkb2VzIG5vdCBhbGxvY2F0ZSBuZXcgc3RydWN0dXJlcywgY29weSB1bmluaXRpYWxpemVkIG1lbW9yeSB0byB1c2VyIHNwYWNlLCBicmFuY2ggb24gdW5pbml0aWFsaXplZCB2YWx1ZXMsIG9yIGFsdGVyIGJ1ZmZlciBsZW5ndGhzIGluIGEgd2F5IHRoYXQgd291bGQgbGVhdmUgdW5pbml0aWFsaXplZCBrZXJuZWwgbWVtb3J5IGV4cG9zZWQuIEFueSBwb3RlbnRpYWwgcGFnZS9mb2xpbyBzdGF0ZSBpc3N1ZXMgb3Igb3V0LW9mLWJvdW5kcyBpbmRleCBpc3N1ZXMgYXJlIGFkZXF1YXRlbHkgY292ZXJlZCBieSBzdGFuZGFyZCBhc3NlcnRpb25zIGFuZCBLQVNBTi4gVGhlcmVmb3JlLCBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaXMgbm90IHJlcXVpcmVkLlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2Vcbn0iLCJSZXN1bHRzIjoie1xuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIG1vZGlmaWVzIGB6c3dhcF9sb2FkKClgIHRvIHN1cHBvcnQgY2hlY2tpbmcgd2hldGhlciBsYXJnZSBmb2xpb3MgaGF2ZSBlbnRyaWVzIGluIHpzd2FwIHZpYSBgenN3YXBfaXNfcHJlc2VudCgpYC4gSWYgbm8gZW50cmllcyBpbiB0aGUgcmFuZ2UgYXJlIGNhY2hlZCBpbiB6c3dhcCwgaXQgcmV0dXJucyBgLUVOT0VOVGAgc28gdGhlIGJhY2tpbmcgc3dhcCBkZXZpY2UgY2FuIHJlYWQgdGhlIGVudGlyZSBsYXJnZSBmb2xpbyBpbnN0ZWFkIG9mIHVuY29uZGl0aW9uYWxseSBmYWlsaW5nIHdpdGggYC1FSU5WQUxgLlxcblxcbkFsbCB2YXJpYWJsZXMgdXNlZCBpbiB0aGUgbmV3bHkgaW50cm9kdWNlZCBgenN3YXBfaXNfcHJlc2VudCgpYCBmdW5jdGlvbiAoYG9mZnNldGAsIGB0cmVlYCwgYGluZGV4YCkgYXJlIGZ1bGx5IGluaXRpYWxpemVkIHNjYWxhciBhbmQgcG9pbnRlciB2YWx1ZXMuIFRoZSBwYXRjaCBkb2VzIG5vdCBhbGxvY2F0ZSBuZXcgc3RydWN0dXJlcywgY29weSB1bmluaXRpYWxpemVkIG1lbW9yeSB0byB1c2VyIHNwYWNlLCBicmFuY2ggb24gdW5pbml0aWFsaXplZCB2YWx1ZXMsIG9yIGFsdGVyIGJ1ZmZlciBsZW5ndGhzIGluIGEgd2F5IHRoYXQgd291bGQgbGVhdmUgdW5pbml0aWFsaXplZCBrZXJuZWwgbWVtb3J5IGV4cG9zZWQuIEFueSBwb3RlbnRpYWwgcGFnZS9mb2xpbyBzdGF0ZSBpc3N1ZXMgb3Igb3V0LW9mLWJvdW5kcyBpbmRleCBpc3N1ZXMgYXJlIGFkZXF1YXRlbHkgY292ZXJlZCBieSBzdGFuZGFyZCBhc3NlcnRpb25zIGFuZCBLQVNBTi4gVGhlcmVmb3JlLCBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaXMgbm90IHJlcXVpcmVkLlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2Vcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfV07CgkJCWlmICghcmF3RGF0YSB8fCByYXdEYXRhLmxlbmd0aCA9PT0gMCkgcmV0dXJuOwoKCQkJZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSk7CgkJCWRyYXdEdXJhdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCQlkcmF3VG9rZW5Db25zdW1wdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSkgewoJCQljb25zdCBzdGF0cyA9IHsKCQkJCWxsbTogeyBjb3VudDogMCwgdG9rZW5zOiAwLCBkdXJhdGlvbjogMCB9LAoJCQkJdG9vbDogeyBjb3VudDogMCwgZHVyYXRpb246IDAgfQoJCQl9OwoKCQkJcmF3RGF0YS5mb3JFYWNoKHMgPT4gewoJCQkJY29uc3QgZHVyID0gcy5EdXJhdGlvbiAvIDEwMDAwMDAwMDA7IAoJCQkJaWYgKHMuVHlwZSA9PT0gImxsbSIpIHsKCQkJCQlzdGF0cy5sbG0uY291bnQrKzsKCQkJCQlzdGF0cy5sbG0udG9rZW5zICs9IChzLklucHV0VG9rZW5zICsgcy5PdXRwdXRUb2tlbnMgKyBzLk91dHB1dFRob3VnaHRzVG9rZW5zKTsKCQkJCQlzdGF0cy5sbG0uZHVyYXRpb24gKz0gZHVyOwoJCQkJfSBlbHNlIGlmIChzLlR5cGUgPT09ICJ0b29sIikgewoJCQkJCXN0YXRzLnRvb2wuY291bnQrKzsKCQkJCQlzdGF0cy50b29sLmR1cmF0aW9uICs9IGR1cjsKCQkJCX0KCQkJfSk7CgoJCQljb25zdCBhdmdMbG1EdXIgPSBzdGF0cy5sbG0uY291bnQgPiAwID8gKHN0YXRzLmxsbS5kdXJhdGlvbiAvIHN0YXRzLmxsbS5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgkJCWNvbnN0IGF2Z0xsbVRva2VuID0gc3RhdHMubGxtLmNvdW50ID4gMCA/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-workflowblgnh[1] Phase: Succeeded StartedAt: 2026-09-07 20:38:11 +0000 UTC FinishedAt: 2026-09-07 20:38:11 +0000 UTC Input: nil Output: nil --------- Name: series-workflowblgnh[1].abort-on-skip-outcome Phase: Skipped StartedAt: 2026-09-07 20:38:11 +0000 UTC FinishedAt: 2026-09-07 20:38:11 +0000 UTC Input: nil Output: nil --------- Name: series-workflowblgnh[2] Phase: Succeeded StartedAt: 2026-09-07 20:38:11 +0000 UTC FinishedAt: 2026-09-08 00:25:26 +0000 UTC Input: nil Output: nil --------- Name: series-workflowblgnh[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"9e52420889a26d87ac7a92eb579cf18d7b516397","config_name":"upstream-apparmor-kasan.config","enable_configs":["SWAP","ZSWAP"],"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":["zswap_load","swap_read_folio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"9e52420889a26d87ac7a92eb579cf18d7b516397","config_name":"upstream-apparmor-kasan.config","enable_configs":["SWAP","ZSWAP"],"series_id":"86ba1bb8-7273-4e3b-9bee-7ba04651ce92","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 20:38:11 +0000 UTC FinishedAt: 2026-09-08 00:25:26 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:element,Default:nil,Value:*{"base":{"arch":"amd64","commit_hash":"9e52420889a26d87ac7a92eb579cf18d7b516397","config_name":"upstream-apparmor-kasan.config","enable_configs":["SWAP","ZSWAP"],"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":["zswap_load","swap_read_folio"],"skip_cover_check":true},"patched":{"arch":"amd64","commit_hash":"9e52420889a26d87ac7a92eb579cf18d7b516397","config_name":"upstream-apparmor-kasan.config","enable_configs":["SWAP","ZSWAP"],"series_id":"86ba1bb8-7273-4e3b-9bee-7ba04651ce92","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-workflowblgnh[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"9e52420889a26d87ac7a92eb579cf18d7b516397","config_name":"upstream-apparmor-kasan.config","enable_configs":["SWAP","ZSWAP"],"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":["zswap_load","swap_read_folio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"9e52420889a26d87ac7a92eb579cf18d7b516397","config_name":"upstream-apparmor-kasan.config","enable_configs":["SWAP","ZSWAP"],"series_id":"86ba1bb8-7273-4e3b-9bee-7ba04651ce92","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 20:38:11 +0000 UTC FinishedAt: 2026-09-07 20:38:21 +0000 UTC Input: nil Output: nil --------- Name: series-workflowblgnh[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"9e52420889a26d87ac7a92eb579cf18d7b516397","config_name":"upstream-apparmor-kasan.config","enable_configs":["SWAP","ZSWAP"],"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":["zswap_load","swap_read_folio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"9e52420889a26d87ac7a92eb579cf18d7b516397","config_name":"upstream-apparmor-kasan.config","enable_configs":["SWAP","ZSWAP"],"series_id":"86ba1bb8-7273-4e3b-9bee-7ba04651ce92","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 20:38:11 +0000 UTC FinishedAt: 2026-09-07 20:38:16 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"arch":"amd64","commit_hash":"9e52420889a26d87ac7a92eb579cf18d7b516397","config_name":"upstream-apparmor-kasan.config","enable_configs":["SWAP","ZSWAP"],"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-workflowblgnh/series-workflowblgnh-convert-artifact-2305603731/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowblgnh[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"9e52420889a26d87ac7a92eb579cf18d7b516397","config_name":"upstream-apparmor-kasan.config","enable_configs":["SWAP","ZSWAP"],"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":["zswap_load","swap_read_folio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"9e52420889a26d87ac7a92eb579cf18d7b516397","config_name":"upstream-apparmor-kasan.config","enable_configs":["SWAP","ZSWAP"],"series_id":"86ba1bb8-7273-4e3b-9bee-7ba04651ce92","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 20:38:21 +0000 UTC FinishedAt: 2026-09-07 21:00:30 +0000 UTC Input: nil Output: nil --------- Name: series-workflowblgnh[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"9e52420889a26d87ac7a92eb579cf18d7b516397","config_name":"upstream-apparmor-kasan.config","enable_configs":["SWAP","ZSWAP"],"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":["zswap_load","swap_read_folio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"9e52420889a26d87ac7a92eb579cf18d7b516397","config_name":"upstream-apparmor-kasan.config","enable_configs":["SWAP","ZSWAP"],"series_id":"86ba1bb8-7273-4e3b-9bee-7ba04651ce92","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 20:38:21 +0000 UTC FinishedAt: 2026-09-07 21:00:30 +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:*9a18cda9-c7ea-43c1-bbf7-7e4dd44584da,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-workflowblgnh/series-workflowblgnh-convert-artifact-2305603731/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": "6eebdb7f-3917-4d3d-a136-2b7537f7def1", "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-workflowblgnh/series-workflowblgnh-build-action-1455478209/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowblgnh[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"9e52420889a26d87ac7a92eb579cf18d7b516397","config_name":"upstream-apparmor-kasan.config","enable_configs":["SWAP","ZSWAP"],"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":["zswap_load","swap_read_folio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"9e52420889a26d87ac7a92eb579cf18d7b516397","config_name":"upstream-apparmor-kasan.config","enable_configs":["SWAP","ZSWAP"],"series_id":"86ba1bb8-7273-4e3b-9bee-7ba04651ce92","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 20:38:21 +0000 UTC FinishedAt: 2026-09-07 21:00:09 +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:*9a18cda9-c7ea-43c1-bbf7-7e4dd44584da,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-workflowblgnh/series-workflowblgnh-convert-artifact-2305603731/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": "6eebdb7f-3917-4d3d-a136-2b7537f7def1", "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-workflowblgnh/series-workflowblgnh-build-action-1455478209/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowblgnh[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"9e52420889a26d87ac7a92eb579cf18d7b516397","config_name":"upstream-apparmor-kasan.config","enable_configs":["SWAP","ZSWAP"],"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":["zswap_load","swap_read_folio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"9e52420889a26d87ac7a92eb579cf18d7b516397","config_name":"upstream-apparmor-kasan.config","enable_configs":["SWAP","ZSWAP"],"series_id":"86ba1bb8-7273-4e3b-9bee-7ba04651ce92","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 21:00:30 +0000 UTC FinishedAt: 2026-09-07 21:00:30 +0000 UTC Input: nil Output: nil --------- Name: series-workflowblgnh[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"9e52420889a26d87ac7a92eb579cf18d7b516397","config_name":"upstream-apparmor-kasan.config","enable_configs":["SWAP","ZSWAP"],"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":["zswap_load","swap_read_folio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"9e52420889a26d87ac7a92eb579cf18d7b516397","config_name":"upstream-apparmor-kasan.config","enable_configs":["SWAP","ZSWAP"],"series_id":"86ba1bb8-7273-4e3b-9bee-7ba04651ce92","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 21:00:30 +0000 UTC FinishedAt: 2026-09-07 21:00:30 +0000 UTC Input: nil Output: nil --------- Name: series-workflowblgnh[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"9e52420889a26d87ac7a92eb579cf18d7b516397","config_name":"upstream-apparmor-kasan.config","enable_configs":["SWAP","ZSWAP"],"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":["zswap_load","swap_read_folio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"9e52420889a26d87ac7a92eb579cf18d7b516397","config_name":"upstream-apparmor-kasan.config","enable_configs":["SWAP","ZSWAP"],"series_id":"86ba1bb8-7273-4e3b-9bee-7ba04651ce92","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 21:00:30 +0000 UTC FinishedAt: 2026-09-07 21:00:46 +0000 UTC Input: nil Output: nil --------- Name: series-workflowblgnh[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"9e52420889a26d87ac7a92eb579cf18d7b516397","config_name":"upstream-apparmor-kasan.config","enable_configs":["SWAP","ZSWAP"],"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":["zswap_load","swap_read_folio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"9e52420889a26d87ac7a92eb579cf18d7b516397","config_name":"upstream-apparmor-kasan.config","enable_configs":["SWAP","ZSWAP"],"series_id":"86ba1bb8-7273-4e3b-9bee-7ba04651ce92","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 21:00:30 +0000 UTC FinishedAt: 2026-09-07 21:00:40 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"arch":"amd64","commit_hash":"9e52420889a26d87ac7a92eb579cf18d7b516397","config_name":"upstream-apparmor-kasan.config","enable_configs":["SWAP","ZSWAP"],"series_id":"86ba1bb8-7273-4e3b-9bee-7ba04651ce92","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-workflowblgnh/series-workflowblgnh-convert-artifact-2644734090/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowblgnh[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"9e52420889a26d87ac7a92eb579cf18d7b516397","config_name":"upstream-apparmor-kasan.config","enable_configs":["SWAP","ZSWAP"],"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":["zswap_load","swap_read_folio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"9e52420889a26d87ac7a92eb579cf18d7b516397","config_name":"upstream-apparmor-kasan.config","enable_configs":["SWAP","ZSWAP"],"series_id":"86ba1bb8-7273-4e3b-9bee-7ba04651ce92","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 21:00:46 +0000 UTC FinishedAt: 2026-09-07 21:02:43 +0000 UTC Input: nil Output: nil --------- Name: series-workflowblgnh[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"9e52420889a26d87ac7a92eb579cf18d7b516397","config_name":"upstream-apparmor-kasan.config","enable_configs":["SWAP","ZSWAP"],"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":["zswap_load","swap_read_folio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"9e52420889a26d87ac7a92eb579cf18d7b516397","config_name":"upstream-apparmor-kasan.config","enable_configs":["SWAP","ZSWAP"],"series_id":"86ba1bb8-7273-4e3b-9bee-7ba04651ce92","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 21:00:46 +0000 UTC FinishedAt: 2026-09-07 21:02:32 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*6eebdb7f-3917-4d3d-a136-2b7537f7def1,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-workflowblgnh/series-workflowblgnh-build-action-1455478209/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-workflowblgnh[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"9e52420889a26d87ac7a92eb579cf18d7b516397","config_name":"upstream-apparmor-kasan.config","enable_configs":["SWAP","ZSWAP"],"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":["zswap_load","swap_read_folio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"9e52420889a26d87ac7a92eb579cf18d7b516397","config_name":"upstream-apparmor-kasan.config","enable_configs":["SWAP","ZSWAP"],"series_id":"86ba1bb8-7273-4e3b-9bee-7ba04651ce92","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 21:02:43 +0000 UTC FinishedAt: 2026-09-07 21:02:43 +0000 UTC Input: nil Output: nil --------- Name: series-workflowblgnh[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"9e52420889a26d87ac7a92eb579cf18d7b516397","config_name":"upstream-apparmor-kasan.config","enable_configs":["SWAP","ZSWAP"],"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":["zswap_load","swap_read_folio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"9e52420889a26d87ac7a92eb579cf18d7b516397","config_name":"upstream-apparmor-kasan.config","enable_configs":["SWAP","ZSWAP"],"series_id":"86ba1bb8-7273-4e3b-9bee-7ba04651ce92","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 21:02:43 +0000 UTC FinishedAt: 2026-09-07 21:02:43 +0000 UTC Input: nil Output: nil --------- Name: series-workflowblgnh[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"9e52420889a26d87ac7a92eb579cf18d7b516397","config_name":"upstream-apparmor-kasan.config","enable_configs":["SWAP","ZSWAP"],"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":["zswap_load","swap_read_folio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"9e52420889a26d87ac7a92eb579cf18d7b516397","config_name":"upstream-apparmor-kasan.config","enable_configs":["SWAP","ZSWAP"],"series_id":"86ba1bb8-7273-4e3b-9bee-7ba04651ce92","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 21:02:43 +0000 UTC FinishedAt: 2026-09-07 21:20:06 +0000 UTC Input: nil Output: nil --------- Name: series-workflowblgnh[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"9e52420889a26d87ac7a92eb579cf18d7b516397","config_name":"upstream-apparmor-kasan.config","enable_configs":["SWAP","ZSWAP"],"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":["zswap_load","swap_read_folio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"9e52420889a26d87ac7a92eb579cf18d7b516397","config_name":"upstream-apparmor-kasan.config","enable_configs":["SWAP","ZSWAP"],"series_id":"86ba1bb8-7273-4e3b-9bee-7ba04651ce92","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 21:02:44 +0000 UTC FinishedAt: 2026-09-07 21:20:06 +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:*9a18cda9-c7ea-43c1-bbf7-7e4dd44584da,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-workflowblgnh/series-workflowblgnh-convert-artifact-2644734090/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": "5eaa23b8-7b27-438f-9f4f-a0178826506b", "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-workflowblgnh/series-workflowblgnh-build-action-2833428142/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowblgnh[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"9e52420889a26d87ac7a92eb579cf18d7b516397","config_name":"upstream-apparmor-kasan.config","enable_configs":["SWAP","ZSWAP"],"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":["zswap_load","swap_read_folio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"9e52420889a26d87ac7a92eb579cf18d7b516397","config_name":"upstream-apparmor-kasan.config","enable_configs":["SWAP","ZSWAP"],"series_id":"86ba1bb8-7273-4e3b-9bee-7ba04651ce92","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 21:02:44 +0000 UTC FinishedAt: 2026-09-07 21:19:56 +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:*9a18cda9-c7ea-43c1-bbf7-7e4dd44584da,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-workflowblgnh/series-workflowblgnh-convert-artifact-2644734090/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": "5eaa23b8-7b27-438f-9f4f-a0178826506b", "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-workflowblgnh/series-workflowblgnh-build-action-2833428142/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowblgnh[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"9e52420889a26d87ac7a92eb579cf18d7b516397","config_name":"upstream-apparmor-kasan.config","enable_configs":["SWAP","ZSWAP"],"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":["zswap_load","swap_read_folio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"9e52420889a26d87ac7a92eb579cf18d7b516397","config_name":"upstream-apparmor-kasan.config","enable_configs":["SWAP","ZSWAP"],"series_id":"86ba1bb8-7273-4e3b-9bee-7ba04651ce92","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 21:20:06 +0000 UTC FinishedAt: 2026-09-07 21:20:06 +0000 UTC Input: nil Output: nil --------- Name: series-workflowblgnh[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"9e52420889a26d87ac7a92eb579cf18d7b516397","config_name":"upstream-apparmor-kasan.config","enable_configs":["SWAP","ZSWAP"],"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":["zswap_load","swap_read_folio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"9e52420889a26d87ac7a92eb579cf18d7b516397","config_name":"upstream-apparmor-kasan.config","enable_configs":["SWAP","ZSWAP"],"series_id":"86ba1bb8-7273-4e3b-9bee-7ba04651ce92","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 21:20:06 +0000 UTC FinishedAt: 2026-09-07 21:20:06 +0000 UTC Input: nil Output: nil --------- Name: series-workflowblgnh[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"9e52420889a26d87ac7a92eb579cf18d7b516397","config_name":"upstream-apparmor-kasan.config","enable_configs":["SWAP","ZSWAP"],"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":["zswap_load","swap_read_folio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"9e52420889a26d87ac7a92eb579cf18d7b516397","config_name":"upstream-apparmor-kasan.config","enable_configs":["SWAP","ZSWAP"],"series_id":"86ba1bb8-7273-4e3b-9bee-7ba04651ce92","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 21:20:06 +0000 UTC FinishedAt: 2026-09-07 21:21:58 +0000 UTC Input: nil Output: nil --------- Name: series-workflowblgnh[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"9e52420889a26d87ac7a92eb579cf18d7b516397","config_name":"upstream-apparmor-kasan.config","enable_configs":["SWAP","ZSWAP"],"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":["zswap_load","swap_read_folio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"9e52420889a26d87ac7a92eb579cf18d7b516397","config_name":"upstream-apparmor-kasan.config","enable_configs":["SWAP","ZSWAP"],"series_id":"86ba1bb8-7273-4e3b-9bee-7ba04651ce92","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 21:20:06 +0000 UTC FinishedAt: 2026-09-07 21:21:47 +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:*5eaa23b8-7b27-438f-9f4f-a0178826506b,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-workflowblgnh/series-workflowblgnh-build-action-2833428142/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-workflowblgnh[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"9e52420889a26d87ac7a92eb579cf18d7b516397","config_name":"upstream-apparmor-kasan.config","enable_configs":["SWAP","ZSWAP"],"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":["zswap_load","swap_read_folio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"9e52420889a26d87ac7a92eb579cf18d7b516397","config_name":"upstream-apparmor-kasan.config","enable_configs":["SWAP","ZSWAP"],"series_id":"86ba1bb8-7273-4e3b-9bee-7ba04651ce92","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 21:21:58 +0000 UTC FinishedAt: 2026-09-08 00:25:26 +0000 UTC Input: nil Output: nil --------- Name: series-workflowblgnh[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"9e52420889a26d87ac7a92eb579cf18d7b516397","config_name":"upstream-apparmor-kasan.config","enable_configs":["SWAP","ZSWAP"],"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":["zswap_load","swap_read_folio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"9e52420889a26d87ac7a92eb579cf18d7b516397","config_name":"upstream-apparmor-kasan.config","enable_configs":["SWAP","ZSWAP"],"series_id":"86ba1bb8-7273-4e3b-9bee-7ba04651ce92","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 21:21:58 +0000 UTC FinishedAt: 2026-09-08 00:25:26 +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":["zswap_load","swap_read_folio"],"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:*6eebdb7f-3917-4d3d-a136-2b7537f7def1,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*5eaa23b8-7b27-438f-9f4f-a0178826506b,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-workflowblgnh/series-workflowblgnh-build-action-1455478209/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-workflowblgnh/series-workflowblgnh-build-action-2833428142/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: nil --------- Name: series-workflowblgnh[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"9e52420889a26d87ac7a92eb579cf18d7b516397","config_name":"upstream-apparmor-kasan.config","enable_configs":["SWAP","ZSWAP"],"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":["zswap_load","swap_read_folio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"9e52420889a26d87ac7a92eb579cf18d7b516397","config_name":"upstream-apparmor-kasan.config","enable_configs":["SWAP","ZSWAP"],"series_id":"86ba1bb8-7273-4e3b-9bee-7ba04651ce92","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 21:21:58 +0000 UTC FinishedAt: 2026-09-07 21:22:08 +0000 UTC Input: nil Output: nil --------- Name: series-workflowblgnh[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"9e52420889a26d87ac7a92eb579cf18d7b516397","config_name":"upstream-apparmor-kasan.config","enable_configs":["SWAP","ZSWAP"],"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":["zswap_load","swap_read_folio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"9e52420889a26d87ac7a92eb579cf18d7b516397","config_name":"upstream-apparmor-kasan.config","enable_configs":["SWAP","ZSWAP"],"series_id":"86ba1bb8-7273-4e3b-9bee-7ba04651ce92","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 21:21:58 +0000 UTC FinishedAt: 2026-09-07 21:22:03 +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":["zswap_load","swap_read_folio"],"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-workflowblgnh/series-workflowblgnh-convert-artifact-3133058847/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowblgnh[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"9e52420889a26d87ac7a92eb579cf18d7b516397","config_name":"upstream-apparmor-kasan.config","enable_configs":["SWAP","ZSWAP"],"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":["zswap_load","swap_read_folio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"9e52420889a26d87ac7a92eb579cf18d7b516397","config_name":"upstream-apparmor-kasan.config","enable_configs":["SWAP","ZSWAP"],"series_id":"86ba1bb8-7273-4e3b-9bee-7ba04651ce92","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 21:21:58 +0000 UTC FinishedAt: 2026-09-07 21:21:58 +0000 UTC Input: nil Output: nil --------- Name: series-workflowblgnh[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"9e52420889a26d87ac7a92eb579cf18d7b516397","config_name":"upstream-apparmor-kasan.config","enable_configs":["SWAP","ZSWAP"],"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":["zswap_load","swap_read_folio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"9e52420889a26d87ac7a92eb579cf18d7b516397","config_name":"upstream-apparmor-kasan.config","enable_configs":["SWAP","ZSWAP"],"series_id":"86ba1bb8-7273-4e3b-9bee-7ba04651ce92","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 21:21:58 +0000 UTC FinishedAt: 2026-09-07 21:21:58 +0000 UTC Input: nil Output: nil --------- Name: series-workflowblgnh[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"9e52420889a26d87ac7a92eb579cf18d7b516397","config_name":"upstream-apparmor-kasan.config","enable_configs":["SWAP","ZSWAP"],"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":["zswap_load","swap_read_folio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"9e52420889a26d87ac7a92eb579cf18d7b516397","config_name":"upstream-apparmor-kasan.config","enable_configs":["SWAP","ZSWAP"],"series_id":"86ba1bb8-7273-4e3b-9bee-7ba04651ce92","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 21:21:58 +0000 UTC FinishedAt: 2026-09-07 21:21:58 +0000 UTC Input: nil Output: nil --------- Name: series-workflowblgnh[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"9e52420889a26d87ac7a92eb579cf18d7b516397","config_name":"upstream-apparmor-kasan.config","enable_configs":["SWAP","ZSWAP"],"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":["zswap_load","swap_read_folio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"9e52420889a26d87ac7a92eb579cf18d7b516397","config_name":"upstream-apparmor-kasan.config","enable_configs":["SWAP","ZSWAP"],"series_id":"86ba1bb8-7273-4e3b-9bee-7ba04651ce92","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 21:22:08 +0000 UTC FinishedAt: 2026-09-08 00:25:26 +0000 UTC Input: nil Output: nil --------- Name: series-workflowblgnh[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"9e52420889a26d87ac7a92eb579cf18d7b516397","config_name":"upstream-apparmor-kasan.config","enable_configs":["SWAP","ZSWAP"],"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":["zswap_load","swap_read_folio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"9e52420889a26d87ac7a92eb579cf18d7b516397","config_name":"upstream-apparmor-kasan.config","enable_configs":["SWAP","ZSWAP"],"series_id":"86ba1bb8-7273-4e3b-9bee-7ba04651ce92","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 21:22:08 +0000 UTC FinishedAt: 2026-09-08 00:25:16 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*6eebdb7f-3917-4d3d-a136-2b7537f7def1,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*5eaa23b8-7b27-438f-9f4f-a0178826506b,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-workflowblgnh/series-workflowblgnh-build-action-1455478209/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-workflowblgnh/series-workflowblgnh-build-action-2833428142/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-workflowblgnh/series-workflowblgnh-convert-artifact-3133058847/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,}