Name: series-workflown29tn Phase: Succeeded StartedAt: 2026-08-07 21:52:48 +0000 UTC FinishedAt: 2026-08-08 01:40:41 +0000 UTC Input: nil Output: nil --------- Name: series-workflown29tn[0] Phase: Succeeded StartedAt: 2026-08-07 21:52:48 +0000 UTC FinishedAt: 2026-08-07 21:56:05 +0000 UTC Input: nil Output: nil --------- Name: series-workflown29tn[0].run-triage Phase: Succeeded StartedAt: 2026-08-07 21:52:48 +0000 UTC FinishedAt: 2026-08-07 21:56:05 +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": "7e4ead2558f28da16d82a8f5845eee44555ff6ba", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "TRANSPARENT_HUGEPAGE", "SWAP" ], "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": "7e4ead2558f28da16d82a8f5845eee44555ff6ba", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "TRANSPARENT_HUGEPAGE", "SWAP" ], "series_id": "fb72ef26-ac07-4257-9aa2-0a5a49da2bba" }, "track": "KASAN", "fuzz": { "focus": null, "focus_symbols": [ "__split_huge_page_to_list_to_order", "folio_split", "folio_split_unmapped", "__swap_cache_replace_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+CgkJCTx0ZD4yMDI2LzA4LzA3IDIxOjU0PC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MW08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O1RSQU5TUEFSRU5UX0hVR0VQQUdFJiMzNDssCiAgICAmIzM0O1NXQVAmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDtfX3NwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyJiMzNDssCiAgICAmIzM0O2ZvbGlvX3NwbGl0JiMzNDssCiAgICAmIzM0O2ZvbGlvX3NwbGl0X3VubWFwcGVkJiMzNDssCiAgICAmIzM0O19fc3dhcF9jYWNoZV9yZXBsYWNlX2ZvbGlvJiMzNDsKICBdLAogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggcmVmYWN0b3JzIGZvbGlvIHNwbGl0dGluZyBsb2dpYyBpbiB0aGUgbWVtb3J5IG1hbmFnZW1lbnQgc3Vic3lzdGVtIChgbW0vaHVnZV9tZW1vcnkuY2ApLCBzcGVjaWZpY2FsbHkgc2VwYXJhdGluZyB0aGUgaGFuZGxpbmcgb2YgYW5vbnltb3VzLCBzd2FwY2FjaGUsIGFuZCBmaWxlLWJhY2tlZCBmb2xpb3MuIEl0IG1vZGlmaWVzIHJlZmVyZW5jZSBjb3VudGluZywgbG9ja2luZywgYW5kIHBhZ2UgY2FjaGUvc3dhcCBjYWNoZSByZXBsYWNlbWVudCBsb2dpYy4gVGhlc2UgY2hhbmdlcyBwcmltYXJpbHkgcmlzayBpbnRyb2R1Y2luZyB1c2UtYWZ0ZXItZnJlZSwgZG91YmxlLWZyZWUsIGxvY2tpbmcgZGVhZGxvY2tzLCBvciByZWZlcmVuY2UgY291bnQgaW1iYWxhbmNlcy4gU3VjaCBpc3N1ZXMgYXJlIGVmZmVjdGl2ZWx5IGRldGVjdGVkIGJ5IEtBU0FOLCBMT0NLREVQLCBhbmQgc3RhbmRhcmQga2VybmVsIGRlYnVnZ2luZyBhc3NlcnRpb25zIChlLmcuLCBgVk1fV0FSTl9PTmApLiBUaGUgcGF0Y2ggZG9lcyBub3QgaW50cm9kdWNlIG5ldyBhbGxvY2F0aW9ucyBvZiBjb21wbGV4IGRhdGEgc3RydWN0dXJlcywgbm9yIGRvZXMgaXQgbW9kaWZ5IGRhdGEgc2VudCB0byB1c2VyIHNwYWNlIG9yIGFsdGVyIGJvdW5kcyBjaGVja2luZyBpbiBhIHdheSB0aGF0IGNvdWxkIGV4cG9zZSB1bmluaXRpYWxpemVkIG1lbW9yeS4gVGhlcmVmb3JlLCB0aGVyZSBpcyBubyBqdXN0aWZpY2F0aW9uIGZvciBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24uJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIHJld29ya3MgdGhlIGxvZ2ljIGZvciBzcGxpdHRpbmcgdW5tYXBwZWQgZm9saW9zLCBzcGVjaWZpY2FsbHkgaGFuZGxpbmcgc3dhcGNhY2hlIGFuZCBhbm9ueW1vdXMgZm9saW9zLiBJdCBpbnRyb2R1Y2VzIG5ldyBzdGF0aWMgZnVuY3Rpb25zIGBfX2ZvbGlvX2ZyZWV6ZV9zcGxpdF91bm1hcGAgYW5kIGBfX2ZvbGlvX2ZyZWV6ZV9zcGxpdF91bm1hcF9maWxlYCB0byByZXBsYWNlIGBfX2ZvbGlvX2ZyZWV6ZV9hbmRfc3BsaXRfdW5tYXBwZWRgLiBJdCBhbHNvIG1vZGlmaWVzIGBmb2xpb19jaGVja19zcGxpdHRhYmxlYCBhbmQgYF9fZm9saW9fc3BsaXRgIHRvIHVzZSB0aGUgbmV3IGxvZ2ljLiBUaGUgY2hhbmdlcyBhZmZlY3QgY29yZSBtZW1vcnkgbWFuYWdlbWVudCwgc3BlY2lmaWNhbGx5IFRIUCBhbmQgZm9saW8gc3BsaXR0aW5nLCB3aGljaCBhcmUgaGlnaGx5IGNvbXBsZXggYW5kIHByb25lIHRvIHJhY2UgY29uZGl0aW9ucy4gRnV6emluZyB0aGUgbWFpbiBlbnRyeSBwb2ludHMgZm9yIGZvbGlvIHNwbGl0dGluZyBpcyBpbXBvcnRhbnQgdG8gZW5zdXJlIHRoZSBuZXcgbG9naWMgaXMgcm9idXN0LiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA3IDIxOjU0PC90ZD4KCQkJPHRkPmFjdGlvbjwvdGQ+CgkJCTx0ZD5yZWFkLXBhdGNoLWRpZmY8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtQYXRjaERpZmYmIzM0OzogJiMzNDtjb21taXQgZTVlMjQ3OGE1NmI5NTJhOGFjNWY2MmQyZTY1YWY1ODhlYzM0Mjg2OFxuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBGcmkgQXVnIDcgMjE6NTQ6MDQgMjAyNiAmIzQzOzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvbW0vaHVnZV9tZW1vcnkuYyBiL21tL2h1Z2VfbWVtb3J5LmNcbmluZGV4IGNlZDQwMGY3MmQ0M2EuLjBkNzBlZTMwMTdjNDYgMTAwNjQ0XG4tLS0gYS9tbS9odWdlX21lbW9yeS5jXG4mIzQzOyYjNDM7JiM0MzsgYi9tbS9odWdlX21lbW9yeS5jXG5AQCAtMzU4OSw5ICYjNDM7MzU4OSw2IEBAIHN0YXRpYyB2b2lkIHJlbWFwX3BhZ2Uoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgbG9uZyBuciwgaW50IGZsYWdzKVxuIHtcbiBcdGludCBpID0gMDtcbiBcbi1cdC8qIElmIHVubWFwX2ZvbGlvKCkgdXNlcyB0cnlfdG9fbWlncmF0ZSgpIG9uIGZpbGUsIHJlbW92ZSB0aGlzIGNoZWNrICovXG4tXHRpZiAoIWZvbGlvX3Rlc3RfYW5vbihmb2xpbykpXG4tXHRcdHJldHVybjtcbiBcdGZvciAoOzspIHtcbiBcdFx0cmVtb3ZlX21pZ3JhdGlvbl9wdGVzKGZvbGlvLCBmb2xpbywgVFRVX1JNQVBfTE9DS0VEIHwgZmxhZ3MpO1xuIFx0XHRpICYjNDM7PSBmb2xpb19ucl9wYWdlcyhmb2xpbyk7XG5AQCAtMzgwMCw2ICYjNDM7Mzc5Nyw3IEBAIHN0YXRpYyBpbnQgX19zcGxpdF91bm1hcHBlZF9mb2xpbyhzdHJ1Y3QgZm9saW8gKmZvbGlvLCBpbnQgbmV3X29yZGVyLFxuIFx0XHRzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywgZW51bSBzcGxpdF90eXBlIHNwbGl0X3R5cGUpXG4ge1xuIFx0Y29uc3QgYm9vbCBpc19hbm9uID0gZm9saW9fdGVzdF9hbm9uKGZvbGlvKTtcbiYjNDM7XHRjb25zdCBib29sIGlzX3N3YXBjYWNoZSA9IGZvbGlvX3Rlc3Rfc3dhcGNhY2hlKGZvbGlvKTtcbiBcdGludCBvbGRfb3JkZXIgPSBmb2xpb19vcmRlcihmb2xpbyk7XG4gXHRpbnQgc3RhcnRfb3JkZXIgPSBzcGxpdF90eXBlID09IFNQTElUX1RZUEVfVU5JRk9STSA/IG5ld19vcmRlciA6IG9sZF9vcmRlciAtIDE7XG4gXHRzdHJ1Y3QgZm9saW8gKm9sZF9mb2xpbyA9IGZvbGlvO1xuQEAgLTM4MTQsOCAmIzQzOzM4MTIsOCBAQCBzdGF0aWMgaW50IF9fc3BsaXRfdW5tYXBwZWRfZm9saW8oc3RydWN0IGZvbGlvICpmb2xpbywgaW50IG5ld19vcmRlcixcbiBcdCAgICAgc3BsaXRfb3JkZXItLSkge1xuIFx0XHRpbnQgbnJfbmV3X2ZvbGlvcyA9IDFVTCBcdTAwM2NcdTAwM2MgKG9sZF9vcmRlciAtIHNwbGl0X29yZGVyKTtcbiBcbi1cdFx0Lyogb3JkZXItMSBhbm9ueW1vdXMgZm9saW8gaXMgbm90IHN1cHBvcnRlZCAqL1xuLVx0XHRpZiAoaXNfYW5vbiBcdTAwMjZcdTAwMjYgc3BsaXRfb3JkZXIgPT0gMSlcbiYjNDM7XHRcdC8qIG9yZGVyLTEgYW5vbnltb3VzIG9yIHN3YXBjYWNoZSBmb2xpbyBpcyBub3Qgc3VwcG9ydGVkICovXG4mIzQzO1x0XHRpZiAoKGlzX2Fub24gfHwgaXNfc3dhcGNhY2hlKSBcdTAwMjZcdTAwMjYgc3BsaXRfb3JkZXIgPT0gMSlcbiBcdFx0XHRjb250aW51ZTtcbiBcbiBcdFx0aWYgKG1hcHBpbmcpIHtcbkBAIC0zODc4LDMyICYjNDM7Mzg3NiwyNiBAQCBzdGF0aWMgaW50IF9fc3BsaXRfdW5tYXBwZWRfZm9saW8oc3RydWN0IGZvbGlvICpmb2xpbywgaW50IG5ld19vcmRlcixcbiBpbnQgZm9saW9fY2hlY2tfc3BsaXR0YWJsZShzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyLFxuIFx0XHRcdCAgIGVudW0gc3BsaXRfdHlwZSBzcGxpdF90eXBlKVxuIHtcbiYjNDM7XHRib29sIGlzX2Fub24gPSBmb2xpb190ZXN0X2Fub24oZm9saW8pO1xuJiM0MztcdGJvb2wgaXNfc3dhcGNhY2hlID0gZm9saW9fdGVzdF9zd2FwY2FjaGUoZm9saW8pO1xuJiM0MztcbiBcdFZNX1dBUk5fT05fRk9MSU8oIWZvbGlvX3Rlc3RfbG9ja2VkKGZvbGlvKSwgZm9saW8pO1xuIFx0LypcbiBcdCAqIEZvbGlvcyB0aGF0IGp1c3QgZ290IHRydW5jYXRlZCBjYW5ub3QgZ2V0IHNwbGl0LiBTaWduYWwgdG8gdGhlXG4tXHQgKiBjYWxsZXIgdGhhdCB0aGVyZSB3YXMgYSByYWNlLlxuLVx0ICpcbi1cdCAqIFRPRE86IHRoaXMgd2lsbCBhbHNvIGN1cnJlbnRseSByZWZ1c2UgZm9saW9zIHdpdGhvdXQgYSBtYXBwaW5nIGluIHRoZVxuLVx0ICogc3dhcGNhY2hlIChzaG1lbSBvciB0by1iZS1hbm9uIGZvbGlvcykuXG4mIzQzO1x0ICogY2FsbGVyIHRoYXQgdGhlcmUgd2FzIGEgcmFjZS4gQSBtYXBwaW5nbGVzcyBzd2FwIGNhY2hlIGZvbGlvXG4mIzQzO1x0ICogaGFzIG5vIHBhZ2UgY2FjaGUgZW50cmllcyB0byB1cGRhdGUsIHNvIGl0IGlzIGZpbmUgdG8gc3BsaXQuXG4gXHQgKi9cbi1cdGlmICghZm9saW8tXHUwMDNlbWFwcGluZyBcdTAwMjZcdTAwMjYgIWZvbGlvX3Rlc3RfYW5vbihmb2xpbykpXG4mIzQzO1x0aWYgKCFmb2xpby1cdTAwM2VtYXBwaW5nIFx1MDAyNlx1MDAyNiAhaXNfc3dhcGNhY2hlKVxuIFx0XHRyZXR1cm4gLUVCVVNZO1xuIFxuLVx0Lyogb3JkZXItMSBpcyBub3Qgc3VwcG9ydGVkIGZvciBhbm9ueW1vdXMgVEhQLiAqL1xuLVx0aWYgKGZvbGlvX3Rlc3RfYW5vbihmb2xpbykgXHUwMDI2XHUwMDI2IG5ld19vcmRlciA9PSAxKVxuLVx0XHRyZXR1cm4gLUVJTlZBTDtcbi1cbiBcdC8qXG4tXHQgKiBzd2FwY2FjaGUgZm9saW8gY291bGQgb25seSBiZSBzcGxpdCB0byBvcmRlciAwXG4tXHQgKlxuLVx0ICogbm9uLXVuaWZvcm0gc3BsaXQgY3JlYXRlcyBhZnRlci1zcGxpdCBmb2xpb3Mgd2l0aCBvcmRlcnMgZnJvbVxuLVx0ICogZm9saW9fb3JkZXIoZm9saW8pIC0gMSB0byBuZXdfb3JkZXIsIG1ha2luZyBpdCBub3Qgc3VpdGFibGUgZm9yIGFueVxuLVx0ICogc3dhcGNhY2hlIGZvbGlvIHNwbGl0LiBPbmx5IHVuaWZvcm0gc3BsaXQgdG8gb3JkZXItMCBjYW4gYmUgdXNlZFxuLVx0ICogaGVyZS5cbiYjNDM7XHQgKiBPcmRlci0xIGlzIHVuc3VwcG9ydGVkOiBhbm9uIGZvbGlvcyBuZWVkIHN1YnBhZ2UgMiBmb3IgdGhlXG4mIzQzO1x0ICogZGVmZXJyZWQgc3BsaXQgbGlzdCwgaHlicmlkIHNobWVtIFx1MDAyNiBzd2FwIGNhY2hlIGZvbGlvcyBhcmUgbm90XG4mIzQzO1x0ICogc3BsaXR0YWJsZSwgYW5kIGEgc3BsaXR0YWJsZSBtYXBwaW5nbGVzcyBzd2FwIGNhY2hlIGZvbGlvIGNvdWxkXG4mIzQzO1x0ICogYmUgZWl0aGVyIGFub24gb3Igc2htZW0sIHdoaWNoIHdlIGNhbm5vdCB0ZWxsIGFwYXJ0LlxuIFx0ICovXG4tXHRpZiAoKHNwbGl0X3R5cGUgPT0gU1BMSVRfVFlQRV9OT05fVU5JRk9STSB8fCBuZXdfb3JkZXIpIFx1MDAyNlx1MDAyNiBmb2xpb190ZXN0X3N3YXBjYWNoZShmb2xpbykpIHtcbiYjNDM7XHRpZiAoKGlzX2Fub24gfHwgaXNfc3dhcGNhY2hlKSBcdTAwMjZcdTAwMjYgbmV3X29yZGVyID09IDEpXG4gXHRcdHJldHVybiAtRUlOVkFMO1xuLVx0fVxuIFxuIFx0aWYgKGlzX2h1Z2VfemVyb19mb2xpbyhmb2xpbykpXG4gXHRcdHJldHVybiAtRUlOVkFMO1xuQEAgLTM5MTEsMzkgJiM0MzszOTAzLDc4IEBAIGludCBmb2xpb19jaGVja19zcGxpdHRhYmxlKHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIsXG4gXHRpZiAoZm9saW9fdGVzdF93cml0ZWJhY2soZm9saW8pKVxuIFx0XHRyZXR1cm4gLUVCVVNZO1xuIFxuJiM0MztcdC8qXG4mIzQzO1x0ICogQSBub24tYW5vbiBzd2FwY2FjaGUgZm9saW8gdGhhdCBzdGlsbCBoYXMgYSBtYXBwaW5nIHNob3VsZCBvbmx5XG4mIzQzO1x0ICogYmUgYSBzaG1lbSBmb2xpbyB1bmRlciBJTywgdGhlcmUgaXMgbGl0dGxlIGJlbmVmaXQgaW4gc3BsaXR0aW5nXG4mIzQzO1x0ICogdGhlbSBoZW5jZSBub3Qgc3VwcG9ydGVkLiBSZWplY3QgaXQgaGVyZSB1cCBmcm9udDogdGhlIHNwbGl0XG4mIzQzO1x0ICogcm91dGluZSBjYW5ub3QgYmFjayBvdXQgY2xlYW5seSBvbmNlIHRoZSBmb2xpbyByZWYgaXMgZnJvemVuLlxuJiM0MztcdCAqL1xuJiM0MztcdGlmICghaXNfYW5vbiBcdTAwMjZcdTAwMjYgaXNfc3dhcGNhY2hlIFx1MDAyNlx1MDAyNiBmb2xpby1cdTAwM2VtYXBwaW5nKVxuJiM0MztcdFx0cmV0dXJuIC1FSU5WQUw7XG4mIzQzO1xuIFx0cmV0dXJuIDA7XG4gfVxuIFxuLS8qIE51bWJlciBvZiBmb2xpbyByZWZlcmVuY2VzIGZyb20gdGhlIHBhZ2VjYWNoZSBvciB0aGUgc3dhcGNhY2hlLiAqL1xuLXN0YXRpYyB1bnNpZ25lZCBpbnQgZm9saW9fY2FjaGVfcmVmX2NvdW50KGNvbnN0IHN0cnVjdCBmb2xpbyAqZm9saW8pXG4mIzQzOy8qIE51bWJlciBvZiBmb2xpbyByZWZlcmVuY2VzIGZyb20gdGhlIHN3YXBjYWNoZS4gKi9cbiYjNDM7c3RhdGljIHVuc2lnbmVkIGludCBmb2xpb19zd2FwY2FjaGVfcmVmX2NvdW50KGNvbnN0IHN0cnVjdCBmb2xpbyAqZm9saW8pXG4ge1xuLVx0aWYgKGZvbGlvX3Rlc3RfYW5vbihmb2xpbykgXHUwMDI2XHUwMDI2ICFmb2xpb190ZXN0X3N3YXBjYWNoZShmb2xpbykpXG4mIzQzO1x0aWYgKCFmb2xpb190ZXN0X3N3YXBjYWNoZShmb2xpbykpXG4gXHRcdHJldHVybiAwO1xuIFx0cmV0dXJuIGZvbGlvX25yX3BhZ2VzKGZvbGlvKTtcbiB9XG4gXG4tc3RhdGljIGludCBfX2ZvbGlvX2ZyZWV6ZV9hbmRfc3BsaXRfdW5tYXBwZWQoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlcixcbi1cdFx0XHRcdFx0ICAgICBzdHJ1Y3QgcGFnZSAqc3BsaXRfYXQsIHN0cnVjdCB4YV9zdGF0ZSAqeGFzLFxuLVx0XHRcdFx0XHQgICAgIHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLCBib29sIGRvX2xydSxcbi1cdFx0XHRcdFx0ICAgICBzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LCBlbnVtIHNwbGl0X3R5cGUgc3BsaXRfdHlwZSxcbi1cdFx0XHRcdFx0ICAgICBwZ29mZl90IGVuZCwgaW50ICpucl9zaG1lbV9kcm9wcGVkKVxuJiM0MztzdGF0aWMgaW50IF9fZm9saW9fZnJlZXplX3NwbGl0X3VubWFwKHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIsXG4mIzQzO1x0XHRcdFx0ICAgICAgc3RydWN0IHBhZ2UgKnNwbGl0X2F0LCBib29sIGRvX2xydSwgYm9vbCBhbm9uX3VubWFwLFxuJiM0MztcdFx0XHRcdCAgICAgIHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QsIGVudW0gc3BsaXRfdHlwZSBzcGxpdF90eXBlKVxuIHtcbiBcdHN0cnVjdCBmb2xpbyAqZW5kX2ZvbGlvID0gZm9saW9fbmV4dChmb2xpbyk7XG4tXHRzdHJ1Y3QgZm9saW8gKm5ld19mb2xpbywgKm5leHQ7XG4mIzQzO1x0Ym9vbCBpc19hbm9uID0gZm9saW9fdGVzdF9hbm9uKGZvbGlvKTtcbiYjNDM7XHRzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpID0gTlVMTDtcbiYjNDM7XHRzdHJ1Y3QgZm9saW8gKm5ld19mb2xpbztcbiBcdGludCBvbGRfb3JkZXIgPSBmb2xpb19vcmRlcihmb2xpbyk7XG4mIzQzO1x0c3RydWN0IGFub25fdm1hICphbm9uX3ZtYSA9IE5VTEw7XG4mIzQzO1x0ZW51bSB0dHVfZmxhZ3MgdHR1X2ZsYWdzID0gMDtcbiBcdHN0cnVjdCBsaXN0X2xydV9vbmUgKmxydTtcbiYjNDM7XHRzdHJ1Y3QgbHJ1dmVjICpscnV2ZWM7XG4gXHRib29sIGRlcXVldWVfZGVmZXJyZWQ7XG4gXHRpbnQgcmV0ID0gMDtcbiBcbi1cdFZNX1dBUk5fT05fT05DRSghbWFwcGluZyBcdTAwMjZcdTAwMjYgZW5kKTtcbiYjNDM7XHQvKlxuJiM0MztcdCAqIFVubWFwL3JlbWFwIG5lZWRzIHRoZSBhbm9uX3ZtYS4gVGhlIGNhbGxlciBkb2VzIG5vdCBuZWNlc3NhcmlseVxuJiM0MztcdCAqIGhvbGQgYW4gbW1hcF9sb2NrIHRoYXQgd291bGQgcHJldmVudCB0aGUgYW5vbl92bWEgZnJvbVxuJiM0MztcdCAqIGRpc2FwcGVhcmluZywgc28gd2UgZmlyc3QgdGFrZSBhIHJlZmVyZW5jZSBhbmQgbG9jayBpdC4gVGhpcyBpc1xuJiM0MztcdCAqIHNpbWlsYXIgdG8gZm9saW9fbG9ja19hbm9uX3ZtYV9yZWFkKCkgZXhjZXB0IHRoZSB3cml0ZSBsb2NrIGlzXG4mIzQzO1x0ICogdGFrZW4gdG8gc2VyaWFsaXplIGFnYWluc3QgcGFyYWxsZWwgc3BsaXQgb3IgY29sbGFwc2UuXG4mIzQzO1x0ICovXG4mIzQzO1x0aWYgKGFub25fdW5tYXApIHtcbiYjNDM7XHRcdGFub25fdm1hID0gZm9saW9fZ2V0X2Fub25fdm1hKGZvbGlvKTtcbiYjNDM7XHRcdGlmICghYW5vbl92bWEpXG4mIzQzO1x0XHRcdHJldHVybiAtRUJVU1k7XG4mIzQzO1x0XHRhbm9uX3ZtYV9sb2NrX3dyaXRlKGFub25fdm1hKTtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdC8qIFJhY3kgY2hlY2sgaWYgd2UgY2FuIHNwbGl0IHRoZSBwYWdlLCBiZWZvcmUgdGhlIG9wdGlvbmFsIHVubWFwLiAqL1xuJiM0MztcdGlmIChmb2xpb19leHBlY3RlZF9yZWZfY291bnQoZm9saW8pICE9IGZvbGlvX3JlZl9jb3VudChmb2xpbykgLSAxKSB7XG4mIzQzO1x0XHRyZXQgPSAtRUFHQUlOO1xuJiM0MztcdFx0Z290byBvdXRfdW5sb2NrO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0aWYgKGFub25fdW5tYXApXG4mIzQzO1x0XHR1bm1hcF9mb2xpbyhmb2xpbyk7XG4mIzQzO1xuJiM0MztcdGxvY2FsX2lycV9kaXNhYmxlKCk7XG4mIzQzO1xuIFx0LypcbiBcdCAqIElmIHRoaXMgZm9saW8gY2FuIGJlIG9uIHRoZSBkZWZlcnJlZCBzcGxpdCBxdWV1ZSwgbG9jayBvdXRcbiBcdCAqIHRoZSBzaHJpbmtlciBiZWZvcmUgZnJlZXppbmcgdGhlIHJlZi4gSWYgdGhlIHNocmlua2VyIHNlZXNcbiBcdCAqIGEgMC1yZWYgZm9saW8sIGl0IGFzc3VtZXMgaXQgYmVhdCBmb2xpb19wdXQoKSB0byB0aGUgbGlzdFxuIFx0ICogbG9jayBhbmQgbXVzdCBjbGVhbiB1cCB0aGUgTFJVIHN0YXRlIC0gdGhlIHNhbWUgZGVxdWV1ZSB3ZVxuIFx0ICogd2lsbCBkbyBiZWxvdyBhcyBwYXJ0IG9mIHRoZSBzcGxpdC5cbiYjNDM7XHQgKlxuJiM0MztcdCAqIE9ubHkgYW5vbiBmb2xpb3MgYXJlIGV2ZXIgcXVldWVkIG9uIHRoZSBkZWZlcnJlZCBzcGxpdCBsaXN0LFxuJiM0MztcdCAqIHNvIG5vbi1hbm9uIGZvbGlvcyAobWFwcGluZ2xlc3Mgc3dhcGNhY2hlKSBuZXZlciBuZWVkIGRlcXVldWluZy5cbiBcdCAqL1xuLVx0ZGVxdWV1ZV9kZWZlcnJlZCA9IGZvbGlvX3Rlc3RfYW5vbihmb2xpbykgXHUwMDI2XHUwMDI2IG9sZF9vcmRlciBcdTAwM2UgMTtcbiYjNDM7XHRkZXF1ZXVlX2RlZmVycmVkID0gb2xkX29yZGVyIFx1MDAzZSAxIFx1MDAyNlx1MDAyNiBpc19hbm9uO1xuIFx0aWYgKGRlcXVldWVfZGVmZXJyZWQpIHtcbiBcdFx0c3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnO1xuIFxuQEAgLTM5NTIsMTI4ICYjNDM7Mzk4MywyNDMgQEAgc3RhdGljIGludCBfX2ZvbGlvX2ZyZWV6ZV9hbmRfc3BsaXRfdW5tYXBwZWQoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5cbiBcdFx0bHJ1ID0gbGlzdF9scnVfbG9jayhcdTAwMjZkZWZlcnJlZF9zcGxpdF9scnUsXG4gXHRcdFx0XHQgICAgZm9saW9fbmlkKGZvbGlvKSwgXHUwMDI2bWVtY2cpO1xuIFx0fVxuLVx0aWYgKGZvbGlvX3JlZl9mcmVlemUoZm9saW8sIGZvbGlvX2NhY2hlX3JlZl9jb3VudChmb2xpbykgJiM0MzsgMSkpIHtcbi1cdFx0c3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSA9IE5VTEw7XG4tXHRcdHN0cnVjdCBscnV2ZWMgKmxydXZlYztcbiBcbiYjNDM7XHRpZiAoIWZvbGlvX3JlZl9mcmVlemUoZm9saW8sIGZvbGlvX3N3YXBjYWNoZV9yZWZfY291bnQoZm9saW8pICYjNDM7IDEpKSB7XG4gXHRcdGlmIChkZXF1ZXVlX2RlZmVycmVkKSB7XG4tXHRcdFx0X19saXN0X2xydV9kZWwoXHUwMDI2ZGVmZXJyZWRfc3BsaXRfbHJ1LCBscnUsXG4tXHRcdFx0XHQgICAgICAgXHUwMDI2Zm9saW8tXHUwMDNlX2RlZmVycmVkX2xpc3QsIGZvbGlvX25pZChmb2xpbykpO1xuLVx0XHRcdGlmIChmb2xpb190ZXN0X3BhcnRpYWxseV9tYXBwZWQoZm9saW8pKSB7XG4tXHRcdFx0XHRmb2xpb19jbGVhcl9wYXJ0aWFsbHlfbWFwcGVkKGZvbGlvKTtcbi1cdFx0XHRcdG1vZF9tdGhwX3N0YXQob2xkX29yZGVyLFxuLVx0XHRcdFx0XHRNVEhQX1NUQVRfTlJfQU5PTl9QQVJUSUFMTFlfTUFQUEVELCAtMSk7XG4tXHRcdFx0fVxuIFx0XHRcdGxpc3RfbHJ1X3VubG9jayhscnUpO1xuIFx0XHRcdHJjdV9yZWFkX3VubG9jaygpO1xuIFx0XHR9XG4mIzQzO1x0XHRyZXQgPSAtRUFHQUlOO1xuJiM0MztcdFx0Z290byBvdXRfbm9fc3BsaXQ7XG4mIzQzO1x0fVxuIFxuLVx0XHRpZiAobWFwcGluZykge1xuLVx0XHRcdGludCBuciA9IGZvbGlvX25yX3BhZ2VzKGZvbGlvKTtcbi1cbi1cdFx0XHRpZiAoZm9saW9fdGVzdF9wbWRfbWFwcGFibGUoZm9saW8pIFx1MDAyNlx1MDAyNlxuLVx0XHRcdCAgICBuZXdfb3JkZXIgXHUwMDNjIEhQQUdFX1BNRF9PUkRFUikge1xuLVx0XHRcdFx0aWYgKGZvbGlvX3Rlc3Rfc3dhcGJhY2tlZChmb2xpbykpIHtcbi1cdFx0XHRcdFx0bHJ1dmVjX3N0YXRfbW9kX2ZvbGlvKGZvbGlvLFxuLVx0XHRcdFx0XHRcdFx0TlJfU0hNRU1fVEhQUywgLW5yKTtcbi1cdFx0XHRcdH0gZWxzZSB7XG4tXHRcdFx0XHRcdGxydXZlY19zdGF0X21vZF9mb2xpbyhmb2xpbyxcbi1cdFx0XHRcdFx0XHRcdE5SX0ZJTEVfVEhQUywgLW5yKTtcbi1cdFx0XHRcdH1cbi1cdFx0XHR9XG4mIzQzO1x0aWYgKGRlcXVldWVfZGVmZXJyZWQpIHtcbiYjNDM7XHRcdF9fbGlzdF9scnVfZGVsKFx1MDAyNmRlZmVycmVkX3NwbGl0X2xydSwgbHJ1LFxuJiM0MztcdFx0XHQgICAgICAgXHUwMDI2Zm9saW8tXHUwMDNlX2RlZmVycmVkX2xpc3QsIGZvbGlvX25pZChmb2xpbykpO1xuJiM0MztcdFx0aWYgKGZvbGlvX3Rlc3RfcGFydGlhbGx5X21hcHBlZChmb2xpbykpIHtcbiYjNDM7XHRcdFx0Zm9saW9fY2xlYXJfcGFydGlhbGx5X21hcHBlZChmb2xpbyk7XG4mIzQzO1x0XHRcdG1vZF9tdGhwX3N0YXQob2xkX29yZGVyLFxuJiM0MztcdFx0XHRcdCAgICAgIE1USFBfU1RBVF9OUl9BTk9OX1BBUlRJQUxMWV9NQVBQRUQsIC0xKTtcbiBcdFx0fVxuJiM0MztcdFx0bGlzdF9scnVfdW5sb2NrKGxydSk7XG4mIzQzO1x0XHRyY3VfcmVhZF91bmxvY2soKTtcbiYjNDM7XHR9XG4gXG4tXHRcdGlmIChmb2xpb190ZXN0X3N3YXBjYWNoZShmb2xpbykpIHtcbi1cdFx0XHRpZiAobWFwcGluZykge1xuLVx0XHRcdFx0Vk1fV0FSTl9PTl9PTkNFX0ZPTElPKG1hcHBpbmcsIGZvbGlvKTtcbi1cdFx0XHRcdHJldHVybiAtRUlOVkFMO1xuLVx0XHRcdH1cbiYjNDM7XHRpZiAoZm9saW9fdGVzdF9zd2FwY2FjaGUoZm9saW8pKVxuJiM0MztcdFx0Y2kgPSBzd2FwX2NsdXN0ZXJfZ2V0X2FuZF9sb2NrKGZvbGlvKTtcbiBcbi1cdFx0XHRjaSA9IHN3YXBfY2x1c3Rlcl9nZXRfYW5kX2xvY2soZm9saW8pO1xuLVx0XHR9XG4mIzQzO1x0aWYgKGRvX2xydSlcbiYjNDM7XHRcdGxydXZlYyA9IGZvbGlvX2xydXZlY19sb2NrKGZvbGlvKTtcbiYjNDM7XG4mIzQzO1x0cmV0ID0gX19zcGxpdF91bm1hcHBlZF9mb2xpbyhmb2xpbywgbmV3X29yZGVyLCBzcGxpdF9hdCwgTlVMTCxcbiYjNDM7XHRcdFx0XHQgICAgIE5VTEwsIHNwbGl0X3R5cGUpO1xuIFxuLVx0XHQvKiBsb2NrIGxydSBsaXN0L1BhZ2VDb21wb3VuZCwgcmVmIGZyb3plbiBieSBwYWdlX3JlZl9mcmVlemUgKi9cbiYjNDM7XHQvKlxuJiM0MztcdCAqIFVuZnJlZXplIHRoZSBhZnRlci1zcGxpdCBmb2xpb3MgYW5kIHB1dCB0aGVtIGJhY2sgdG8gdGhlIHJpZ2h0XG4mIzQzO1x0ICogcGxhY2UsIGtlZXBpbmcgdGhlIGhlYWQgQGZvbGlvIGZyb3plbiB1bnRpbCB0aGUgZW5kLiBXaGlsZSB0aGVcbiYjNDM7XHQgKiBmb2xpbyBpcyBpbiB0aGUgc3dhcCBjYWNoZSwgdGhlIHN1YiBlbnRyaWVzIG11c3QgYmUgdXBkYXRlZCB3aXRoXG4mIzQzO1x0ICogdGhlaXIgYWZ0ZXItc3BsaXQgZm9saW9zIGJlZm9yZSB0aGUgaGVhZCBpcyB1bmZyb3plbiwgc28gYVxuJiM0MztcdCAqIGNvbmN1cnJlbnQgc3dhcF9jYWNoZV9nZXRfZm9saW8oKSBjYW5ub3QgcmV0dXJuIHRoZSBoZWFkIGZvbGlvXG4mIzQzO1x0ICogZm9yIGEgc3ViIGVudHJ5LiBLZWVwaW5nIHRoZSBoZWFkIGZyb3plbiB0aHJvdWdob3V0IGFsc28gc3RvcHMgYVxuJiM0MztcdCAqIHBhcmFsbGVsIGZvbGlvX3RyeV9nZXQoKSBmcm9tIG9ic2VydmluZyBhIHBhcnRpYWxseSBzcGxpdCBmb2xpby5cbiYjNDM7XHQgKi9cbiYjNDM7XHRmb3IgKG5ld19mb2xpbyA9IGZvbGlvX25leHQoZm9saW8pOyBuZXdfZm9saW8gIT0gZW5kX2ZvbGlvO1xuJiM0MztcdCAgICAgbmV3X2ZvbGlvID0gZm9saW9fbmV4dChuZXdfZm9saW8pKSB7XG4mIzQzO1x0XHR6b25lX2RldmljZV9wcml2YXRlX3NwbGl0X2NiKGZvbGlvLCBuZXdfZm9saW8pO1xuJiM0MztcdFx0Zm9saW9fcmVmX3VuZnJlZXplKG5ld19mb2xpbyxcbiYjNDM7XHRcdFx0XHQgICBmb2xpb19zd2FwY2FjaGVfcmVmX2NvdW50KG5ld19mb2xpbykgJiM0MzsgMSk7XG4gXHRcdGlmIChkb19scnUpXG4tXHRcdFx0bHJ1dmVjID0gZm9saW9fbHJ1dmVjX2xvY2soZm9saW8pO1xuJiM0MztcdFx0XHRscnVfYWRkX3NwbGl0X2ZvbGlvKGZvbGlvLCBuZXdfZm9saW8sIGxydXZlYywgbGlzdCk7XG4mIzQzO1x0XHRpZiAoY2kpXG4mIzQzO1x0XHRcdF9fc3dhcF9jYWNoZV9yZXBsYWNlX2ZvbGlvKGNpLCBmb2xpbywgbmV3X2ZvbGlvKTtcbiYjNDM7XHR9XG4gXG4tXHRcdHJldCA9IF9fc3BsaXRfdW5tYXBwZWRfZm9saW8oZm9saW8sIG5ld19vcmRlciwgc3BsaXRfYXQsIHhhcyxcbi1cdFx0XHRcdFx0ICAgICBtYXBwaW5nLCBzcGxpdF90eXBlKTtcbiYjNDM7XHR6b25lX2RldmljZV9wcml2YXRlX3NwbGl0X2NiKGZvbGlvLCBOVUxMKTtcbiYjNDM7XHRmb2xpb19yZWZfdW5mcmVlemUoZm9saW8sIGZvbGlvX3N3YXBjYWNoZV9yZWZfY291bnQoZm9saW8pICYjNDM7IDEpO1xuIFxuLVx0XHQvKlxuLVx0XHQgKiBVbmZyZWV6ZSBhZnRlci1zcGxpdCBmb2xpb3MgYW5kIHB1dCB0aGVtIGJhY2sgdG8gdGhlIHJpZ2h0XG4tXHRcdCAqIGxpc3QuIEBmb2xpbyBzaG91bGQgYmUga2VwdCBmcm96b24gdW50aWwgcGFnZSBjYWNoZVxuLVx0XHQgKiBlbnRyaWVzIGFyZSB1cGRhdGVkIHdpdGggYWxsIHRoZSBvdGhlciBhZnRlci1zcGxpdCBmb2xpb3Ncbi1cdFx0ICogdG8gcHJldmVudCBvdGhlcnMgc2VlaW5nIHN0YWxlIHBhZ2UgY2FjaGUgZW50cmllcy5cbi1cdFx0ICogQXMgYSByZXN1bHQsIG5ld19mb2xpbyBzdGFydHMgZnJvbSB0aGUgbmV4dCBmb2xpbyBvZlxuLVx0XHQgKiBAZm9saW8uXG4tXHRcdCAqL1xuLVx0XHRmb3IgKG5ld19mb2xpbyA9IGZvbGlvX25leHQoZm9saW8pOyBuZXdfZm9saW8gIT0gZW5kX2ZvbGlvO1xuLVx0XHQgICAgIG5ld19mb2xpbyA9IG5leHQpIHtcbi1cdFx0XHR1bnNpZ25lZCBsb25nIG5yX3BhZ2VzID0gZm9saW9fbnJfcGFnZXMobmV3X2ZvbGlvKTtcbiYjNDM7XHRpZiAoZG9fbHJ1KVxuJiM0MztcdFx0bHJ1dmVjX3VubG9jayhscnV2ZWMpO1xuJiM0MztcdGlmIChjaSlcbiYjNDM7XHRcdHN3YXBfY2x1c3Rlcl91bmxvY2soY2kpO1xuJiM0MztvdXRfbm9fc3BsaXQ6XG4mIzQzO1x0bG9jYWxfaXJxX2VuYWJsZSgpO1xuJiM0MztcdGlmIChhbm9uX3VubWFwKSB7XG4mIzQzO1x0XHRpZiAoIXJldCBcdTAwMjZcdTAwMjYgIWZvbGlvX2lzX2RldmljZV9wcml2YXRlKGZvbGlvKSlcbiYjNDM7XHRcdFx0dHR1X2ZsYWdzID0gVFRVX1VTRV9TSEFSRURfWkVST1BBR0U7XG4mIzQzO1x0XHRyZW1hcF9wYWdlKGZvbGlvLCAxIFx1MDAzY1x1MDAzYyBvbGRfb3JkZXIsIHR0dV9mbGFncyk7XG4mIzQzO1x0fVxuJiM0MztvdXRfdW5sb2NrOlxuJiM0MztcdGlmIChhbm9uX3VubWFwKSB7XG4mIzQzO1x0XHRhbm9uX3ZtYV91bmxvY2tfd3JpdGUoYW5vbl92bWEpO1xuJiM0MztcdFx0cHV0X2Fub25fdm1hKGFub25fdm1hKTtcbiYjNDM7XHR9XG4gXG4tXHRcdFx0bmV4dCA9IGZvbGlvX25leHQobmV3X2ZvbGlvKTtcbiYjNDM7XHRyZXR1cm4gcmV0O1xuJiM0Mzt9XG4gXG4tXHRcdFx0em9uZV9kZXZpY2VfcHJpdmF0ZV9zcGxpdF9jYihmb2xpbywgbmV3X2ZvbGlvKTtcbiYjNDM7c3RhdGljIGludCBfX2ZvbGlvX2ZyZWV6ZV9zcGxpdF91bm1hcF9maWxlKHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIsXG4mIzQzO1x0XHRcdFx0XHQgICBzdHJ1Y3QgcGFnZSAqc3BsaXRfYXQsIGJvb2wgZG9fbHJ1LFxuJiM0MztcdFx0XHRcdFx0ICAgc3RydWN0IGxpc3RfaGVhZCAqbGlzdCwgZW51bSBzcGxpdF90eXBlIHNwbGl0X3R5cGUpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyA9IGZvbGlvLVx1MDAzZW1hcHBpbmc7XG4mIzQzO1x0WEFfU1RBVEUoeGFzLCBcdTAwMjZtYXBwaW5nLVx1MDAzZWlfcGFnZXMsIGZvbGlvLVx1MDAzZWluZGV4KTtcbiYjNDM7XHRzdHJ1Y3QgZm9saW8gKmVuZF9mb2xpbyA9IGZvbGlvX25leHQoZm9saW8pO1xuJiM0MztcdGxvbmcgb2xkX25yX3BhZ2VzID0gZm9saW9fbnJfcGFnZXMoZm9saW8pO1xuJiM0MztcdHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZywgKm9sZF9tZW1jZztcbiYjNDM7XHRzdHJ1Y3QgZm9saW8gKm5ld19mb2xpbywgKm5leHQ7XG4mIzQzO1x0aW50IG5yX3NobWVtX2Ryb3BwZWQgPSAwO1xuJiM0MztcdHVuc2lnbmVkIGludCBtaW5fb3JkZXI7XG4mIzQzO1x0c3RydWN0IGxydXZlYyAqbHJ1dmVjO1xuJiM0MztcdHBnb2ZmX3QgZW5kID0gMDtcbiYjNDM7XHRnZnBfdCBnZnA7XG4mIzQzO1x0aW50IHJldCA9IDA7XG4gXG4tXHRcdFx0Zm9saW9fcmVmX3VuZnJlZXplKG5ld19mb2xpbyxcbi1cdFx0XHRcdFx0ICAgZm9saW9fY2FjaGVfcmVmX2NvdW50KG5ld19mb2xpbykgJiM0MzsgMSk7XG4mIzQzO1x0bWluX29yZGVyID0gbWFwcGluZ19taW5fZm9saW9fb3JkZXIobWFwcGluZyk7XG4mIzQzO1x0aWYgKG5ld19vcmRlciBcdTAwM2MgbWluX29yZGVyKVxuJiM0MztcdFx0cmV0dXJuIC1FSU5WQUw7XG4gXG4tXHRcdFx0aWYgKGRvX2xydSlcbi1cdFx0XHRcdGxydV9hZGRfc3BsaXRfZm9saW8oZm9saW8sIG5ld19mb2xpbywgbHJ1dmVjLCBsaXN0KTtcbiYjNDM7XHQvKlxuJiM0MztcdCAqIFN3aXRjaCB0byBmb2xpbyYjMzk7cyBtZW1jZyBhcyB4YXJyYXkgbm9kZSBhbGxvY2F0aW9uIGNhbiBoYXBwZW4gYW5kXG4mIzQzO1x0ICogbmVlZHMgdG8gY2hhcmdlIHRvIGl0LlxuJiM0MztcdCAqL1xuJiM0MztcdG1lbWNnID0gZ2V0X21lbV9jZ3JvdXBfZnJvbV9mb2xpbyhmb2xpbyk7XG4mIzQzO1x0b2xkX21lbWNnID0gc2V0X2FjdGl2ZV9tZW1jZyhtZW1jZyk7XG4gXG4tXHRcdFx0Lypcbi1cdFx0XHQgKiBBbm9ueW1vdXMgZm9saW8gd2l0aCBzd2FwIGNhY2hlLlxuLVx0XHRcdCAqIE5PVEU6IHNobWVtIGluIHN3YXAgY2FjaGUgaXMgbm90IHN1cHBvcnRlZCB5ZXQuXG4tXHRcdFx0ICovXG4tXHRcdFx0aWYgKGNpKSB7XG4tXHRcdFx0XHRfX3N3YXBfY2FjaGVfcmVwbGFjZV9mb2xpbyhjaSwgZm9saW8sIG5ld19mb2xpbyk7XG4tXHRcdFx0XHRjb250aW51ZTtcbi1cdFx0XHR9XG4mIzQzO1x0Z2ZwID0gY3VycmVudF9nZnBfY29udGV4dChtYXBwaW5nX2dmcF9tYXNrKG1hcHBpbmcpIFx1MDAyNiBHRlBfUkVDTEFJTV9NQVNLKTtcbiYjNDM7XHRpZiAoIWZpbGVtYXBfcmVsZWFzZV9mb2xpbyhmb2xpbywgZ2ZwKSkge1xuJiM0MztcdFx0cmV0ID0gLUVCVVNZO1xuJiM0MztcdFx0Z290byBmYWlsX2ZyZWU7XG4mIzQzO1x0fVxuIFxuLVx0XHRcdC8qIEFub255bW91cyBmb2xpbyB3aXRob3V0IHN3YXAgY2FjaGUgKi9cbi1cdFx0XHRpZiAoIW1hcHBpbmcpXG4tXHRcdFx0XHRjb250aW51ZTtcbiYjNDM7XHRtYXBwaW5nX3NldF91cGRhdGUoXHUwMDI2eGFzLCBtYXBwaW5nKTtcbiBcbi1cdFx0XHQvKiBBZGQgdGhlIG5ldyBmb2xpbyB0byB0aGUgcGFnZSBjYWNoZS4gKi9cbi1cdFx0XHRpZiAobmV3X2ZvbGlvLVx1MDAzZWluZGV4IFx1MDAzYyBlbmQpIHtcbi1cdFx0XHRcdF9feGFfc3RvcmUoXHUwMDI2bWFwcGluZy1cdTAwM2VpX3BhZ2VzLCBuZXdfZm9saW8tXHUwMDNlaW5kZXgsXG4tXHRcdFx0XHRcdCAgIG5ld19mb2xpbywgMCk7XG4tXHRcdFx0XHRjb250aW51ZTtcbi1cdFx0XHR9XG4mIzQzO1x0aWYgKHNwbGl0X3R5cGUgPT0gU1BMSVRfVFlQRV9VTklGT1JNKSB7XG4mIzQzO1x0XHRpbnQgb2xkX29yZGVyID0gZm9saW9fb3JkZXIoZm9saW8pO1xuIFxuLVx0XHRcdFZNX1dBUk5fT05fT05DRSghbnJfc2htZW1fZHJvcHBlZCk7XG4tXHRcdFx0LyogRHJvcCBmb2xpbyBiZXlvbmQgRU9GOiAtXHUwMDNlaW5kZXggXHUwMDNlPSBlbmQgKi9cbi1cdFx0XHRpZiAoc2htZW1fbWFwcGluZyhtYXBwaW5nKSBcdTAwMjZcdTAwMjYgbnJfc2htZW1fZHJvcHBlZClcbi1cdFx0XHRcdCpucl9zaG1lbV9kcm9wcGVkICYjNDM7PSBucl9wYWdlcztcbi1cdFx0XHRlbHNlIGlmIChmb2xpb190ZXN0X2NsZWFyX2RpcnR5KG5ld19mb2xpbykpXG4tXHRcdFx0XHRmb2xpb19hY2NvdW50X2NsZWFuZWQoXG4tXHRcdFx0XHRcdG5ld19mb2xpbywgaW5vZGVfdG9fd2IobWFwcGluZy1cdTAwM2Vob3N0KSk7XG4tXHRcdFx0X19maWxlbWFwX3JlbW92ZV9mb2xpbyhuZXdfZm9saW8sIE5VTEwpO1xuLVx0XHRcdGZvbGlvX3B1dF9yZWZzKG5ld19mb2xpbywgbnJfcGFnZXMpO1xuJiM0MztcdFx0eGFzX3NldF9vcmRlcihcdTAwMjZ4YXMsIGZvbGlvLVx1MDAzZWluZGV4LCBuZXdfb3JkZXIpO1xuJiM0MztcdFx0eGFzX3NwbGl0X2FsbG9jKFx1MDAyNnhhcywgZm9saW8sIG9sZF9vcmRlciwgZ2ZwKTtcbiYjNDM7XHRcdGlmICh4YXNfZXJyb3IoXHUwMDI2eGFzKSkge1xuJiM0MztcdFx0XHRyZXQgPSB4YXNfZXJyb3IoXHUwMDI2eGFzKTtcbiYjNDM7XHRcdFx0Z290byBmYWlsX2ZyZWU7XG4gXHRcdH1cbiYjNDM7XHR9XG4gXG4tXHRcdHpvbmVfZGV2aWNlX3ByaXZhdGVfc3BsaXRfY2IoZm9saW8sIE5VTEwpO1xuLVx0XHQvKlxuLVx0XHQgKiBVbmZyZWV6ZSBAZm9saW8gb25seSBhZnRlciBhbGwgcGFnZSBjYWNoZSBlbnRyaWVzLCB3aGljaFxuLVx0XHQgKiB1c2VkIHRvIHBvaW50IHRvIGl0LCBoYXZlIGJlZW4gdXBkYXRlZCB3aXRoIG5ldyBmb2xpb3MuXG4tXHRcdCAqIE90aGVyd2lzZSwgYSBwYXJhbGxlbCBmb2xpb190cnlfZ2V0KCkgY2FuIGdyYWIgQGZvbGlvXG4tXHRcdCAqIGFuZCBpdHMgY2FsbGVyIGNhbiBzZWUgc3RhbGUgcGFnZSBjYWNoZSBlbnRyaWVzLlxuLVx0XHQgKi9cbi1cdFx0Zm9saW9fcmVmX3VuZnJlZXplKGZvbGlvLCBmb2xpb19jYWNoZV9yZWZfY291bnQoZm9saW8pICYjNDM7IDEpO1xuJiM0MztcdGlfbW1hcF9sb2NrX3JlYWQobWFwcGluZyk7XG4mIzQzO1xuJiM0MztcdC8qIFJhY3kgY2hlY2sgaWYgd2UgY2FuIHNwbGl0IHRoZSBwYWdlLCBiZWZvcmUgdW5tYXBfZm9saW8oKSAqL1xuJiM0MztcdGlmIChmb2xpb19leHBlY3RlZF9yZWZfY291bnQoZm9saW8pICE9IGZvbGlvX3JlZl9jb3VudChmb2xpbykgLSAxKSB7XG4mIzQzO1x0XHRyZXQgPSAtRUFHQUlOO1xuJiM0MztcdFx0Z290byBmYWlsX21tYXBfdW5sb2NrO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0LypcbiYjNDM7XHQgKl9fc3BsaXRfdW5tYXBwZWRfZm9saW8oKSBtYXkgbmVlZCB0byB0cmltIG9mZiBwYWdlcyBiZXlvbmRcbiYjNDM7XHQgKiBFT0Y6IGJ1dCBvbiAzMi1iaXQsIGlfc2l6ZV9yZWFkKCkgdGFrZXMgYW4gaXJxLXVuc2FmZVxuJiM0MztcdCAqIHNlcWxvY2ssIHdoaWNoIGNhbm5vdCBiZSBuZXN0ZWQgaW5zaWRlIHRoZSBwYWdlIHRyZWUgbG9jay5cbiYjNDM7XHQgKiBTbyBub3RlIGVuZCBub3c6IGlfc2l6ZSBpdHNlbGYgbWF5IGJlIGNoYW5nZWQgYXQgYW55IG1vbWVudCxcbiYjNDM7XHQgKiBidXQgZm9saW8gbG9jayBpcyBnb29kIGVub3VnaCB0byBzZXJpYWxpemUgdGhlIHRyaW1taW5nLlxuJiM0MztcdCAqL1xuJiM0MztcdGVuZCA9IERJVl9ST1VORF9VUChpX3NpemVfcmVhZChtYXBwaW5nLVx1MDAzZWhvc3QpLCBQQUdFX1NJWkUpO1xuJiM0MztcdGlmIChzaG1lbV9tYXBwaW5nKG1hcHBpbmcpKVxuJiM0MztcdFx0ZW5kID0gc2htZW1fZmFsbG9jZW5kKG1hcHBpbmctXHUwMDNlaG9zdCwgZW5kKTtcbiYjNDM7XG4mIzQzO1x0dW5tYXBfZm9saW8oZm9saW8pO1xuJiM0MztcbiYjNDM7XHR4YXNfbG9ja19pcnEoXHUwMDI2eGFzKTtcbiYjNDM7XG4mIzQzO1x0LypcbiYjNDM7XHQgKiBDaGVjayBpZiB0aGUgZm9saW8gaXMgcHJlc2VudCBpbiBwYWdlIGNhY2hlLlxuJiM0MztcdCAqIFdlIGFzc3VtZSBhbGwgdGFpbCBhcmUgcHJlc2VudCB0b28sIGlmIGZvbGlvIGlzIHRoZXJlLlxuJiM0MztcdCAqL1xuJiM0MztcdGlmICh4YXNfbG9hZChcdTAwMjZ4YXMpICE9IGZvbGlvKSB7XG4mIzQzO1x0XHRyZXQgPSAtRUFHQUlOO1xuJiM0MztcdFx0Z290byBmYWlsO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0aWYgKCFmb2xpb19yZWZfZnJlZXplKGZvbGlvLCBvbGRfbnJfcGFnZXMgJiM0MzsgMSkpIHtcbiYjNDM7XHRcdHJldCA9IC1FQUdBSU47XG4mIzQzO1x0XHRnb3RvIGZhaWw7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRpZiAoZm9saW9fdGVzdF9wbWRfbWFwcGFibGUoZm9saW8pIFx1MDAyNlx1MDAyNiBuZXdfb3JkZXIgXHUwMDNjIEhQQUdFX1BNRF9PUkRFUikge1xuJiM0MztcdFx0aWYgKGZvbGlvX3Rlc3Rfc3dhcGJhY2tlZChmb2xpbykpXG4mIzQzO1x0XHRcdGxydXZlY19zdGF0X21vZF9mb2xpbyhmb2xpbywgTlJfU0hNRU1fVEhQUywgLW9sZF9ucl9wYWdlcyk7XG4mIzQzO1x0XHRlbHNlXG4mIzQzO1x0XHRcdGxydXZlY19zdGF0X21vZF9mb2xpbyhmb2xpbywgTlJfRklMRV9USFBTLCAtb2xkX25yX3BhZ2VzKTtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdC8qIGxvY2sgbHJ1IGxpc3QvUGFnZUNvbXBvdW5kLCByZWYgZnJvemVuIGJ5IHBhZ2VfcmVmX2ZyZWV6ZSAqL1xuJiM0MztcdGlmIChkb19scnUpXG4mIzQzO1x0XHRscnV2ZWMgPSBmb2xpb19scnV2ZWNfbG9jayhmb2xpbyk7XG4mIzQzO1xuJiM0MztcdHJldCA9IF9fc3BsaXRfdW5tYXBwZWRfZm9saW8oZm9saW8sIG5ld19vcmRlciwgc3BsaXRfYXQsIFx1MDAyNnhhcyxcbiYjNDM7XHRcdFx0XHQgICAgIG1hcHBpbmcsIHNwbGl0X3R5cGUpO1xuJiM0MztcbiYjNDM7XHQvKlxuJiM0MztcdCAqIFVuZnJlZXplIGFmdGVyLXNwbGl0IGZvbGlvcyBhbmQgcHV0IHRoZW0gYmFjayB0byB0aGUgcmlnaHRcbiYjNDM7XHQgKiBsaXN0LiBAZm9saW8gc2hvdWxkIGJlIGtlcHQgZnJvemVuIHVudGlsIHBhZ2UgY2FjaGVcbiYjNDM7XHQgKiBlbnRyaWVzIGFyZSB1cGRhdGVkIHdpdGggYWxsIHRoZSBvdGhlciBhZnRlci1zcGxpdCBmb2xpb3NcbiYjNDM7XHQgKiB0byBwcmV2ZW50IG90aGVycyBzZWVpbmcgc3RhbGUgcGFnZSBjYWNoZSBlbnRyaWVzLlxuJiM0MztcdCAqIEFzIGEgcmVzdWx0LCBuZXdfZm9saW8gc3RhcnRzIGZyb20gdGhlIG5leHQgZm9saW8gb2ZcbiYjNDM7XHQgKiBAZm9saW8uXG4mIzQzO1x0ICovXG4mIzQzO1x0Zm9yIChuZXdfZm9saW8gPSBmb2xpb19uZXh0KGZvbGlvKTsgbmV3X2ZvbGlvICE9IGVuZF9mb2xpbztcbiYjNDM7XHQgICAgIG5ld19mb2xpbyA9IG5leHQpIHtcbiYjNDM7XHRcdHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMgPSBmb2xpb19ucl9wYWdlcyhuZXdfZm9saW8pO1xuJiM0MztcbiYjNDM7XHRcdG5leHQgPSBmb2xpb19uZXh0KG5ld19mb2xpbyk7XG4mIzQzO1xuJiM0MztcdFx0Zm9saW9fcmVmX3VuZnJlZXplKG5ld19mb2xpbyxcbiYjNDM7XHRcdFx0XHQgICBmb2xpb19ucl9wYWdlcyhuZXdfZm9saW8pICYjNDM7IDEpO1xuIFxuIFx0XHRpZiAoZG9fbHJ1KVxuLVx0XHRcdGxydXZlY191bmxvY2sobHJ1dmVjKTtcbiYjNDM7XHRcdFx0bHJ1X2FkZF9zcGxpdF9mb2xpbyhmb2xpbywgbmV3X2ZvbGlvLCBscnV2ZWMsIGxpc3QpO1xuIFxuLVx0XHRpZiAoY2kpXG4tXHRcdFx0c3dhcF9jbHVzdGVyX3VubG9jayhjaSk7XG4tXHR9IGVsc2Uge1xuLVx0XHRpZiAoZGVxdWV1ZV9kZWZlcnJlZCkge1xuLVx0XHRcdGxpc3RfbHJ1X3VubG9jayhscnUpO1xuLVx0XHRcdHJjdV9yZWFkX3VubG9jaygpO1xuJiM0MztcdFx0LyogQWRkIHRoZSBuZXcgZm9saW8gdG8gdGhlIHBhZ2UgY2FjaGUuICovXG4mIzQzO1x0XHRpZiAobmV3X2ZvbGlvLVx1MDAzZWluZGV4IFx1MDAzYyBlbmQpIHtcbiYjNDM7XHRcdFx0X194YV9zdG9yZShcdTAwMjZtYXBwaW5nLVx1MDAzZWlfcGFnZXMsIG5ld19mb2xpby1cdTAwM2VpbmRleCxcbiYjNDM7XHRcdFx0XHQgICBuZXdfZm9saW8sIDApO1xuJiM0MztcdFx0XHRjb250aW51ZTtcbiBcdFx0fVxuLVx0XHRyZXR1cm4gLUVBR0FJTjtcbiYjNDM7XG4mIzQzO1x0XHQvKiBEcm9wIGZvbGlvIGJleW9uZCBFT0Y6IC1cdTAwM2VpbmRleCBcdTAwM2U9IGVuZCAqL1xuJiM0MztcdFx0aWYgKHNobWVtX21hcHBpbmcobWFwcGluZykpXG4mIzQzO1x0XHRcdG5yX3NobWVtX2Ryb3BwZWQgJiM0Mzs9IG5yX3BhZ2VzO1xuJiM0MztcdFx0ZWxzZSBpZiAoZm9saW9fdGVzdF9jbGVhcl9kaXJ0eShuZXdfZm9saW8pKVxuJiM0MztcdFx0XHRmb2xpb19hY2NvdW50X2NsZWFuZWQobmV3X2ZvbGlvLFxuJiM0MztcdFx0XHRcdFx0ICAgICAgaW5vZGVfdG9fd2IobWFwcGluZy1cdTAwM2Vob3N0KSk7XG4mIzQzO1x0XHRfX2ZpbGVtYXBfcmVtb3ZlX2ZvbGlvKG5ld19mb2xpbywgTlVMTCk7XG4mIzQzO1x0XHRmb2xpb19wdXRfcmVmcyhuZXdfZm9saW8sIG5yX3BhZ2VzKTtcbiBcdH1cbiBcbiYjNDM7XHQvKlxuJiM0MztcdCAqIFVuZnJlZXplIEBmb2xpbyBvbmx5IGFmdGVyIGFsbCBwYWdlIGNhY2hlIGVudHJpZXMsIHdoaWNoXG4mIzQzO1x0ICogdXNlZCB0byBwb2ludCB0byBpdCwgaGF2ZSBiZWVuIHVwZGF0ZWQgd2l0aCBuZXcgZm9saW9zLlxuJiM0MztcdCAqIE90aGVyd2lzZSwgYSBwYXJhbGxlbCBmb2xpb190cnlfZ2V0KCkgY2FuIGdyYWIgQGZvbGlvXG4mIzQzO1x0ICogYW5kIGl0cyBjYWxsZXIgY2FuIHNlZSBzdGFsZSBwYWdlIGNhY2hlIGVudHJpZXMuXG4mIzQzO1x0ICovXG4mIzQzO1x0Zm9saW9fcmVmX3VuZnJlZXplKGZvbGlvLCBmb2xpb19ucl9wYWdlcyhmb2xpbykgJiM0MzsgMSk7XG4mIzQzO1xuJiM0MztcdGlmIChkb19scnUpXG4mIzQzO1x0XHRscnV2ZWNfdW5sb2NrKGxydXZlYyk7XG4mIzQzO1xuJiM0MztmYWlsOlxuJiM0MztcdHhhc191bmxvY2tfaXJxKFx1MDAyNnhhcyk7XG4mIzQzO2ZhaWxfbW1hcF91bmxvY2s6XG4mIzQzO1x0aWYgKG5yX3NobWVtX2Ryb3BwZWQpXG4mIzQzO1x0XHRzaG1lbV91bmNoYXJnZShtYXBwaW5nLVx1MDAzZWhvc3QsIG5yX3NobWVtX2Ryb3BwZWQpO1xuJiM0MztcdC8qXG4mIzQzO1x0ICogRHJvcCB0aGUgbWFwcGluZyB3aGlsZSB0aGUgaW5vZGUgaXMgc3RpbGwgcGlubmVkLiBAZm9saW8gc3RheXNcbiYjNDM7XHQgKiBsb2NrZWQgYW5kIHByZXNlbnQgaW4gdGhlIHBhZ2UgY2FjaGUsIHNvIGV2aWN0aW9uIGNhbm5vdCBmcmVlXG4mIzQzO1x0ICogdGhlIGlub2RlIHlldCwgbm90aGluZyBwYXN0IHRoaXMgcG9pbnQgbWF5IHRvdWNoIHRoZSBpbm9kZSBvclxuJiM0MztcdCAqIHRoZSBtYXBwaW5nLlxuJiM0MztcdCAqL1xuJiM0MztcdGlfbW1hcF91bmxvY2tfcmVhZChtYXBwaW5nKTtcbiYjNDM7ZmFpbF9mcmVlOlxuJiM0MztcdC8qIFJlc3RvcmUgdGhlIHByZXZpb3VzbHkgYWN0aXZlIG1lbWNnICovXG4mIzQzO1x0c2V0X2FjdGl2ZV9tZW1jZyhvbGRfbWVtY2cpO1xuJiM0MztcdG1lbV9jZ3JvdXBfcHV0KG1lbWNnKTtcbiYjNDM7XHR4YXNfZGVzdHJveShcdTAwMjZ4YXMpO1xuIFx0cmV0dXJuIHJldDtcbiB9XG4gXG5AQCAtNDEwMiwxNyAmIzQzOzQyNDgsMTEgQEAgc3RhdGljIGludCBfX2ZvbGlvX3NwbGl0KHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIsXG4gXHRcdHN0cnVjdCBwYWdlICpzcGxpdF9hdCwgc3RydWN0IHBhZ2UgKmxvY2tfYXQsXG4gXHRcdHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QsIGVudW0gc3BsaXRfdHlwZSBzcGxpdF90eXBlKVxuIHtcbi1cdFhBX1NUQVRFKHhhcywgXHUwMDI2Zm9saW8tXHUwMDNlbWFwcGluZy1cdTAwM2VpX3BhZ2VzLCBmb2xpby1cdTAwM2VpbmRleCk7XG4mIzQzO1x0Ym9vbCBpc19zd2FwY2FjaGUgPSBmb2xpb190ZXN0X3N3YXBjYWNoZShmb2xpbyk7XG4gXHRzdHJ1Y3QgZm9saW8gKmVuZF9mb2xpbyA9IGZvbGlvX25leHQoZm9saW8pO1xuIFx0Ym9vbCBpc19hbm9uID0gZm9saW9fdGVzdF9hbm9uKGZvbGlvKTtcbi1cdHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZywgKm9sZF9tZW1jZztcbi1cdHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nID0gTlVMTDtcbi1cdHN0cnVjdCBhbm9uX3ZtYSAqYW5vbl92bWEgPSBOVUxMO1xuIFx0aW50IG9sZF9vcmRlciA9IGZvbGlvX29yZGVyKGZvbGlvKTtcbiBcdHN0cnVjdCBmb2xpbyAqbmV3X2ZvbGlvLCAqbmV4dDtcbi1cdGludCBucl9zaG1lbV9kcm9wcGVkID0gMDtcbi1cdGVudW0gdHR1X2ZsYWdzIHR0dV9mbGFncyA9IDA7XG4tXHRwZ29mZl90IGVuZCA9IDA7XG4gXHRpbnQgcmV0O1xuIFxuIFx0Vk1fV0FSTl9PTl9PTkNFX0ZPTElPKCFmb2xpb190ZXN0X2xvY2tlZChmb2xpbyksIGZvbGlvKTtcbkBAIC00MTIwLDE0MSAmIzQzOzQyNjAsMjkgQEAgc3RhdGljIGludCBfX2ZvbGlvX3NwbGl0KHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIsXG4gXG4gXHRpZiAoZm9saW8gIT0gcGFnZV9mb2xpbyhzcGxpdF9hdCkgfHwgZm9saW8gIT0gcGFnZV9mb2xpbyhsb2NrX2F0KSkge1xuIFx0XHRyZXQgPSAtRUlOVkFMO1xuLVx0XHRnb3RvIG91dF9ub19tZW1jZztcbiYjNDM7XHRcdGdvdG8gb3V0O1xuIFx0fVxuIFxuIFx0aWYgKG5ld19vcmRlciBcdTAwM2U9IG9sZF9vcmRlcikge1xuIFx0XHRyZXQgPSAtRUlOVkFMO1xuLVx0XHRnb3RvIG91dF9ub19tZW1jZztcbiYjNDM7XHRcdGdvdG8gb3V0O1xuIFx0fVxuIFxuIFx0cmV0ID0gZm9saW9fY2hlY2tfc3BsaXR0YWJsZShmb2xpbywgbmV3X29yZGVyLCBzcGxpdF90eXBlKTtcbiBcdGlmIChyZXQpIHtcbiBcdFx0Vk1fV0FSTl9PTkNFKHJldCA9PSAtRUlOVkFMLCBcJiMzNDtUcmllZCB0byBzcGxpdCBhbiB1bnNwbGl0dGFibGUgZm9saW9cJiMzNDspO1xuLVx0XHRnb3RvIG91dF9ub19tZW1jZztcbi1cdH1cbi1cbi1cdC8qXG4tXHQgKiBzd2l0Y2ggdG8gZm9saW8mIzM5O3MgbWVtY2cgYXMgeGFycmF5IG5vZGUgYWxsb2NhdGlvbiBjYW4gaGFwcGVuIGFuZFxuLVx0ICogbmVlZHMgdG8gY2hhcmdlIHRvIGl0LlxuLVx0ICovXG4tXHRtZW1jZyA9IGdldF9tZW1fY2dyb3VwX2Zyb21fZm9saW8oZm9saW8pO1xuLVx0b2xkX21lbWNnID0gc2V0X2FjdGl2ZV9tZW1jZyhtZW1jZyk7XG4tXG4tXHRpZiAoaXNfYW5vbikge1xuLVx0XHQvKlxuLVx0XHQgKiBUaGUgY2FsbGVyIGRvZXMgbm90IG5lY2Vzc2FyaWx5IGhvbGQgYW4gbW1hcF9sb2NrIHRoYXQgd291bGRcbi1cdFx0ICogcHJldmVudCB0aGUgYW5vbl92bWEgZGlzYXBwZWFyaW5nIHNvIHdlIGZpcnN0IHdlIHRha2UgYVxuLVx0XHQgKiByZWZlcmVuY2UgdG8gaXQgYW5kIHRoZW4gbG9jayB0aGUgYW5vbl92bWEgZm9yIHdyaXRlLiBUaGlzXG4tXHRcdCAqIGlzIHNpbWlsYXIgdG8gZm9saW9fbG9ja19hbm9uX3ZtYV9yZWFkIGV4Y2VwdCB0aGUgd3JpdGUgbG9ja1xuLVx0XHQgKiBpcyB0YWtlbiB0byBzZXJpYWxpc2UgYWdhaW5zdCBwYXJhbGxlbCBzcGxpdCBvciBjb2xsYXBzZVxuLVx0XHQgKiBvcGVyYXRpb25zLlxuLVx0XHQgKi9cbi1cdFx0YW5vbl92bWEgPSBmb2xpb19nZXRfYW5vbl92bWEoZm9saW8pO1xuLVx0XHRpZiAoIWFub25fdm1hKSB7XG4tXHRcdFx0cmV0ID0gLUVCVVNZO1xuLVx0XHRcdGdvdG8gb3V0O1xuLVx0XHR9XG4tXHRcdGFub25fdm1hX2xvY2tfd3JpdGUoYW5vbl92bWEpO1xuLVx0XHRtYXBwaW5nID0gTlVMTDtcbi1cdH0gZWxzZSB7XG4tXHRcdHVuc2lnbmVkIGludCBtaW5fb3JkZXI7XG4tXHRcdGdmcF90IGdmcDtcbi1cbi1cdFx0bWFwcGluZyA9IGZvbGlvLVx1MDAzZW1hcHBpbmc7XG4tXHRcdG1pbl9vcmRlciA9IG1hcHBpbmdfbWluX2ZvbGlvX29yZGVyKG1hcHBpbmcpO1xuLVx0XHRpZiAobmV3X29yZGVyIFx1MDAzYyBtaW5fb3JkZXIpIHtcbi1cdFx0XHRyZXQgPSAtRUlOVkFMO1xuLVx0XHRcdGdvdG8gb3V0O1xuLVx0XHR9XG4tXG4tXHRcdGdmcCA9IGN1cnJlbnRfZ2ZwX2NvbnRleHQobWFwcGluZ19nZnBfbWFzayhtYXBwaW5nKSBcdTAwMjZcbi1cdFx0XHRcdFx0XHRcdEdGUF9SRUNMQUlNX01BU0spO1xuLVxuLVx0XHRpZiAoIWZpbGVtYXBfcmVsZWFzZV9mb2xpbyhmb2xpbywgZ2ZwKSkge1xuLVx0XHRcdHJldCA9IC1FQlVTWTtcbi1cdFx0XHRnb3RvIG91dDtcbi1cdFx0fVxuLVxuLVx0XHRtYXBwaW5nX3NldF91cGRhdGUoXHUwMDI2eGFzLCBtYXBwaW5nKTtcbi1cbi1cdFx0aWYgKHNwbGl0X3R5cGUgPT0gU1BMSVRfVFlQRV9VTklGT1JNKSB7XG4tXHRcdFx0eGFzX3NldF9vcmRlcihcdTAwMjZ4YXMsIGZvbGlvLVx1MDAzZWluZGV4LCBuZXdfb3JkZXIpO1xuLVx0XHRcdHhhc19zcGxpdF9hbGxvYyhcdTAwMjZ4YXMsIGZvbGlvLCBvbGRfb3JkZXIsIGdmcCk7XG4tXHRcdFx0aWYgKHhhc19lcnJvcihcdTAwMjZ4YXMpKSB7XG4tXHRcdFx0XHRyZXQgPSB4YXNfZXJyb3IoXHUwMDI2eGFzKTtcbi1cdFx0XHRcdGdvdG8gb3V0O1xuLVx0XHRcdH1cbi1cdFx0fVxuLVxuLVx0XHRhbm9uX3ZtYSA9IE5VTEw7XG4tXHRcdGlfbW1hcF9sb2NrX3JlYWQobWFwcGluZyk7XG4tXG4tXHRcdC8qXG4tXHRcdCAqX19zcGxpdF91bm1hcHBlZF9mb2xpbygpIG1heSBuZWVkIHRvIHRyaW0gb2ZmIHBhZ2VzIGJleW9uZFxuLVx0XHQgKiBFT0Y6IGJ1dCBvbiAzMi1iaXQsIGlfc2l6ZV9yZWFkKCkgdGFrZXMgYW4gaXJxLXVuc2FmZVxuLVx0XHQgKiBzZXFsb2NrLCB3aGljaCBjYW5ub3QgYmUgbmVzdGVkIGluc2lkZSB0aGUgcGFnZSB0cmVlIGxvY2suXG4tXHRcdCAqIFNvIG5vdGUgZW5kIG5vdzogaV9zaXplIGl0c2VsZiBtYXkgYmUgY2hhbmdlZCBhdCBhbnkgbW9tZW50LFxuLVx0XHQgKiBidXQgZm9saW8gbG9jayBpcyBnb29kIGVub3VnaCB0byBzZXJpYWxpemUgdGhlIHRyaW1taW5nLlxuLVx0XHQgKi9cbi1cdFx0ZW5kID0gRElWX1JPVU5EX1VQKGlfc2l6ZV9yZWFkKG1hcHBpbmctXHUwMDNlaG9zdCksIFBBR0VfU0laRSk7XG4tXHRcdGlmIChzaG1lbV9tYXBwaW5nKG1hcHBpbmcpKVxuLVx0XHRcdGVuZCA9IHNobWVtX2ZhbGxvY2VuZChtYXBwaW5nLVx1MDAzZWhvc3QsIGVuZCk7XG4tXHR9XG4tXG4tXHQvKlxuLVx0ICogUmFjeSBjaGVjayBpZiB3ZSBjYW4gc3BsaXQgdGhlIHBhZ2UsIGJlZm9yZSB1bm1hcF9mb2xpbygpIHdpbGxcbi1cdCAqIHNwbGl0IFBNRHNcbi1cdCAqL1xuLVx0aWYgKGZvbGlvX2V4cGVjdGVkX3JlZl9jb3VudChmb2xpbykgIT0gZm9saW9fcmVmX2NvdW50KGZvbGlvKSAtIDEpIHtcbi1cdFx0cmV0ID0gLUVBR0FJTjtcbi1cdFx0Z290byBvdXRfdW5sb2NrO1xuLVx0fVxuLVxuLVx0dW5tYXBfZm9saW8oZm9saW8pO1xuLVxuLVx0LyogYmxvY2sgaW50ZXJydXB0IHJlZW50cnkgaW4geGFfbG9jayBhbmQgc3BpbmxvY2sgKi9cbi1cdGxvY2FsX2lycV9kaXNhYmxlKCk7XG4tXHRpZiAobWFwcGluZykge1xuLVx0XHQvKlxuLVx0XHQgKiBDaGVjayBpZiB0aGUgZm9saW8gaXMgcHJlc2VudCBpbiBwYWdlIGNhY2hlLlxuLVx0XHQgKiBXZSBhc3N1bWUgYWxsIHRhaWwgYXJlIHByZXNlbnQgdG9vLCBpZiBmb2xpbyBpcyB0aGVyZS5cbi1cdFx0ICovXG4tXHRcdHhhc19sb2NrKFx1MDAyNnhhcyk7XG4tXHRcdHhhc19yZXNldChcdTAwMjZ4YXMpO1xuLVx0XHRpZiAoeGFzX2xvYWQoXHUwMDI2eGFzKSAhPSBmb2xpbykge1xuLVx0XHRcdHJldCA9IC1FQUdBSU47XG4tXHRcdFx0Z290byBmYWlsO1xuLVx0XHR9XG4mIzQzO1x0XHRnb3RvIG91dDtcbiBcdH1cbiBcbi1cdHJldCA9IF9fZm9saW9fZnJlZXplX2FuZF9zcGxpdF91bm1hcHBlZChmb2xpbywgbmV3X29yZGVyLCBzcGxpdF9hdCwgXHUwMDI2eGFzLCBtYXBwaW5nLFxuLVx0XHRcdFx0XHRcdHRydWUsIGxpc3QsIHNwbGl0X3R5cGUsIGVuZCwgXHUwMDI2bnJfc2htZW1fZHJvcHBlZCk7XG4tZmFpbDpcbi1cdGlmIChtYXBwaW5nKVxuLVx0XHR4YXNfdW5sb2NrKFx1MDAyNnhhcyk7XG4tXG4tXHRsb2NhbF9pcnFfZW5hYmxlKCk7XG4tXG4tXHRpZiAobnJfc2htZW1fZHJvcHBlZClcbi1cdFx0c2htZW1fdW5jaGFyZ2UobWFwcGluZy1cdTAwM2Vob3N0LCBucl9zaG1lbV9kcm9wcGVkKTtcbi1cbi1cdGlmICghcmV0IFx1MDAyNlx1MDAyNiBpc19hbm9uIFx1MDAyNlx1MDAyNiAhZm9saW9faXNfZGV2aWNlX3ByaXZhdGUoZm9saW8pKVxuLVx0XHR0dHVfZmxhZ3MgPSBUVFVfVVNFX1NIQVJFRF9aRVJPUEFHRTtcbi1cbi1cdHJlbWFwX3BhZ2UoZm9saW8sIDEgXHUwMDNjXHUwMDNjIG9sZF9vcmRlciwgdHR1X2ZsYWdzKTtcbi1cbi1cdC8qXG4tXHQgKiBEcm9wIHRoZSBtYXBwaW5nIHdoaWxlIHRoZSBpbm9kZSBpcyBzdGlsbCBwaW5uZWQuIEBmb2xpbyBzdGF5c1xuLVx0ICogbG9ja2VkIGFuZCBwcmVzZW50IGluIHRoZSBwYWdlIGNhY2hlIHVudGlsIHRoZSBsb29wIGJlbG93LCBzb1xuLVx0ICogZXZpY3Rpb24gY2Fubm90IGZyZWUgdGhlIGlub2RlIHlldDsgQGxvY2tfYXQgaXMgbm90IGVub3VnaCwgaXQgbWF5XG4tXHQgKiBiZSBhIHRhaWwgYmV5b25kIEVPRiB0aGF0IHRoZSBzcGxpdCBhbHJlYWR5IGRyb3BwZWQgZnJvbSB0aGUgcGFnZVxuLVx0ICogY2FjaGUuIE5vdGhpbmcgcGFzdCB0aGlzIHBvaW50IG1heSB0b3VjaCB0aGUgaW5vZGUgb3IgdGhlIG1hcHBpbmcuXG4tXHQgKi9cbi1cdGlmIChtYXBwaW5nKSB7XG4tXHRcdGlfbW1hcF91bmxvY2tfcmVhZChtYXBwaW5nKTtcbi1cdFx0bWFwcGluZyA9IE5VTEw7XG4tXHR9XG4mIzQzO1x0aWYgKGlzX2Fub24pXG4mIzQzO1x0XHRyZXQgPSBfX2ZvbGlvX2ZyZWV6ZV9zcGxpdF91bm1hcChmb2xpbywgbmV3X29yZGVyLCBzcGxpdF9hdCwgdHJ1ZSxcbiYjNDM7XHRcdFx0XHRcdFx0IHRydWUsIGxpc3QsIHNwbGl0X3R5cGUpO1xuJiM0MztcdGVsc2UgaWYgKGlzX3N3YXBjYWNoZSlcbiYjNDM7XHRcdHJldCA9IF9fZm9saW9fZnJlZXplX3NwbGl0X3VubWFwKGZvbGlvLCBuZXdfb3JkZXIsIHNwbGl0X2F0LCB0cnVlLFxuJiM0MztcdFx0XHRcdFx0XHQgZmFsc2UsIGxpc3QsIHNwbGl0X3R5cGUpO1xuJiM0MztcdGVsc2VcbiYjNDM7XHRcdHJldCA9IF9fZm9saW9fZnJlZXplX3NwbGl0X3VubWFwX2ZpbGUoZm9saW8sIG5ld19vcmRlciwgc3BsaXRfYXQsXG4mIzQzO1x0XHRcdFx0XHRcdCAgICAgIHRydWUsIGxpc3QsIHNwbGl0X3R5cGUpO1xuIFxuIFx0LypcbiBcdCAqIFVubG9jayBhbGwgYWZ0ZXItc3BsaXQgZm9saW9zIGV4Y2VwdCB0aGUgb25lIGNvbnRhaW5pbmdcbkBAIC00MjY1LDI5ICYjNDM7NDI5MywxOSBAQCBzdGF0aWMgaW50IF9fZm9saW9fc3BsaXQoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlcixcbiBcdFx0aWYgKG5ld19mb2xpbyA9PSBwYWdlX2ZvbGlvKGxvY2tfYXQpKVxuIFx0XHRcdGNvbnRpbnVlO1xuIFxuLVx0XHRmb2xpb191bmxvY2sobmV3X2ZvbGlvKTtcbiBcdFx0LypcbiBcdFx0ICogU3VicGFnZXMgd2hvc2UgbWFwcGluZyBoYXMgYmVlbiB6YXBwZWQgbWF5IGJlIGZyZWVkXG4gXHRcdCAqIGVhcmxpZXIsIGJ1dCBmcmVlaW5nIHRoZW0gcmVxdWlyZXMgdGFraW5nIHRoZVxuIFx0XHQgKiBscnVfbG9jaywgc28gd2UgZGVmZXIgcHV0X3BhZ2UoKSBvbiB0YWlsIHBhZ2VzIHVudGlsXG4gXHRcdCAqIGFmdGVyIHRoZSBzcGxpdCBjb21wbGV0ZXMuXG4gXHRcdCAqL1xuLVx0XHRmcmVlX2ZvbGlvX2FuZF9zd2FwX2NhY2hlKG5ld19mb2xpbyk7XG4mIzQzO1x0XHRpZiAoaXNfc3dhcGNhY2hlKVxuJiM0MztcdFx0XHRmb2xpb19mcmVlX3N3YXAobmV3X2ZvbGlvKTtcbiYjNDM7XHRcdGZvbGlvX3VubG9jayhuZXdfZm9saW8pO1xuJiM0MztcdFx0Zm9saW9fcHV0KG5ld19mb2xpbyk7XG4gXHR9XG4gXG4tb3V0X3VubG9jazpcbi1cdGlmIChhbm9uX3ZtYSkge1xuLVx0XHRhbm9uX3ZtYV91bmxvY2tfd3JpdGUoYW5vbl92bWEpO1xuLVx0XHRwdXRfYW5vbl92bWEoYW5vbl92bWEpO1xuLVx0fVxuLVx0aWYgKG1hcHBpbmcpXG4tXHRcdGlfbW1hcF91bmxvY2tfcmVhZChtYXBwaW5nKTtcbiBvdXQ6XG4tXHQvKiByZXN0b3JlIHRvIGNhbGxlciYjMzk7cyBvbGRfbWVtY2cgKi9cbi1cdHNldF9hY3RpdmVfbWVtY2cob2xkX21lbWNnKTtcbi1cdG1lbV9jZ3JvdXBfcHV0KG1lbWNnKTtcbi1vdXRfbm9fbWVtY2c6XG4tXHR4YXNfZGVzdHJveShcdTAwMjZ4YXMpO1xuIFx0aWYgKGlzX3BtZF9vcmRlcihvbGRfb3JkZXIpKVxuIFx0XHRjb3VudF92bV9ldmVudCghcmV0ID8gVEhQX1NQTElUX1BBR0UgOiBUSFBfU1BMSVRfUEFHRV9GQUlMRUQpO1xuIFx0Y291bnRfbXRocF9zdGF0KG9sZF9vcmRlciwgIXJldCA/IE1USFBfU1RBVF9TUExJVCA6IE1USFBfU1RBVF9TUExJVF9GQUlMRUQpO1xuQEAgLTQzMTgsMjIgJiM0Mzs0MzM2LDEzIEBAIHN0YXRpYyBpbnQgX19mb2xpb19zcGxpdChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyLFxuICAqL1xuIGludCBmb2xpb19zcGxpdF91bm1hcHBlZChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyKVxuIHtcbi1cdGludCByZXQgPSAwO1xuLVxuIFx0Vk1fV0FSTl9PTl9PTkNFX0ZPTElPKGZvbGlvX21hcHBlZChmb2xpbyksIGZvbGlvKTtcbiBcdFZNX1dBUk5fT05fT05DRV9GT0xJTyghZm9saW9fdGVzdF9sb2NrZWQoZm9saW8pLCBmb2xpbyk7XG4gXHRWTV9XQVJOX09OX09OQ0VfRk9MSU8oIWZvbGlvX3Rlc3RfbGFyZ2UoZm9saW8pLCBmb2xpbyk7XG4gXHRWTV9XQVJOX09OX09OQ0VfRk9MSU8oIWZvbGlvX3Rlc3RfYW5vbihmb2xpbyksIGZvbGlvKTtcbiBcbi1cdGlmIChmb2xpb19leHBlY3RlZF9yZWZfY291bnQoZm9saW8pICE9IGZvbGlvX3JlZl9jb3VudChmb2xpbykgLSAxKVxuLVx0XHRyZXR1cm4gLUVBR0FJTjtcbi1cbi1cdGxvY2FsX2lycV9kaXNhYmxlKCk7XG4tXHRyZXQgPSBfX2ZvbGlvX2ZyZWV6ZV9hbmRfc3BsaXRfdW5tYXBwZWQoZm9saW8sIG5ld19vcmRlciwgXHUwMDI2Zm9saW8tXHUwMDNlcGFnZSwgTlVMTCxcbi1cdFx0XHRcdFx0XHROVUxMLCBmYWxzZSwgTlVMTCwgU1BMSVRfVFlQRV9VTklGT1JNLFxuLVx0XHRcdFx0XHRcdDAsIE5VTEwpO1xuLVx0bG9jYWxfaXJxX2VuYWJsZSgpO1xuLVx0cmV0dXJuIHJldDtcbiYjNDM7XHRyZXR1cm4gX19mb2xpb19mcmVlemVfc3BsaXRfdW5tYXAoZm9saW8sIG5ld19vcmRlciwgXHUwMDI2Zm9saW8tXHUwMDNlcGFnZSwgZmFsc2UsXG4mIzQzO1x0XHRcdFx0XHQgIGZhbHNlLCBOVUxMLCBTUExJVF9UWVBFX1VOSUZPUk0pO1xuIH1cbiBcbiAvKlxuQEAgLTQzNTIsMTEgJiM0Mzs0MzYxLDExIEBAIGludCBmb2xpb19zcGxpdF91bm1hcHBlZChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyKVxuICAqICAgIEdVUCBwaW5zLCB3aWxsIHJlc3VsdCBpbiB0aGUgZm9saW8gbm90IGdldHRpbmcgc3BsaXQ7IGluc3RlYWQsIHRoZSBjYWxsZXJcbiAgKiAgICB3aWxsIHJlY2VpdmUgYW4gLUVBR0FJTi5cbiAgKlxuLSAqIDQpIEBuZXdfb3JkZXIgXHUwMDNlIDEsIHVzdWFsbHkuIFNwbGl0dGluZyB0byBvcmRlci0xIGFub255bW91cyBmb2xpb3MgaXMgbm90XG4tICogICAgc3VwcG9ydGVkIGZvciBub24tZmlsZS1iYWNrZWQgZm9saW9zLCBiZWNhdXNlIGZvbGlvLVx1MDAzZV9kZWZlcnJlZF9saXN0LCB3aGljaFxuLSAqICAgIGlzIHVzZWQgYnkgcGFydGlhbGx5IG1hcHBlZCBmb2xpb3MsIGlzIHN0b3JlZCBpbiBzdWJwYWdlIDIsIGJ1dCBhbiBvcmRlci0xXG4tICogICAgZm9saW8gb25seSBoYXMgc3VicGFnZXMgMCBhbmQgMS4gRmlsZS1iYWNrZWQgb3JkZXItMSBmb2xpb3MgYXJlIHN1cHBvcnRlZCxcbi0gKiAgICBzaW5jZSB0aGV5IGRvIG5vdCB1c2UgX2RlZmVycmVkX2xpc3QuXG4mIzQzOyAqIDQpIEBuZXdfb3JkZXIgXHUwMDNlIDEsIHVzdWFsbHkuIE9yZGVyLTEgaXMgbm90IHN1cHBvcnRlZCBmb3IgYW5vbiBvciBzd2FwY2FjaGVcbiYjNDM7ICogICAgZm9saW9zOiBhbm9uIGZvbGlvcyBuZWVkIHN1YnBhZ2UgMiBmb3IgX2RlZmVycmVkX2xpc3QsIHdoaWNoIG9yZGVyLTFcbiYjNDM7ICogICAgZm9saW9zIGxhY2ssIGFuZCBhIHN3YXBjYWNoZSBmb2xpbyBtYXkgYmVjb21lIGFub24gb25jZSBmYXVsdGVkIGluLlxuJiM0MzsgKiAgICBGaWxlLWJhY2tlZCBvcmRlci0xIGZvbGlvcyBhcmUgc3VwcG9ydGVkLCBzaW5jZSB0aGV5IGRvIG5vdCB1c2VcbiYjNDM7ICogICAgX2RlZmVycmVkX2xpc3QuXG4gICpcbiAgKiBBZnRlciBzcGxpdHRpbmcsIHRoZSBjYWxsZXImIzM5O3MgZm9saW8gcmVmZXJlbmNlIHdpbGwgYmUgdHJhbnNmZXJyZWQgdG8gQHBhZ2UsXG4gICogcmVzdWx0aW5nIGluIGEgcmFpc2VkIHJlZmNvdW50IG9mIEBwYWdlIGFmdGVyIHRoaXMgY2FsbC4gVGhlIG90aGVyIHBhZ2VzIG1heVxuZGlmZiAtLWdpdCBhL21tL3N3YXBfc3RhdGUuYyBiL21tL3N3YXBfc3RhdGUuY1xuaW5kZXggNWJlODI1OTExZTY0NS4uZjE0MDVlNWI4MTNlZSAxMDA2NDRcbi0tLSBhL21tL3N3YXBfc3RhdGUuY1xuJiM0MzsmIzQzOyYjNDM7IGIvbW0vc3dhcF9zdGF0ZS5jXG5AQCAtMzg4LDggJiM0MzszODgsOSBAQCB2b2lkIF9fc3dhcF9jYWNoZV9yZXBsYWNlX2ZvbGlvKHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2ksXG4gXHQgICAgZm9saW9fb3JkZXIob2xkKSAhPSBmb2xpb19vcmRlcihuZXcpKSB7XG4gXHRcdGNpX29mZiA9IHN3cF9jbHVzdGVyX29mZnNldChvbGQtXHUwMDNlc3dhcCk7XG4gXHRcdGNpX2VuZCA9IGNpX29mZiAmIzQzOyBmb2xpb19ucl9wYWdlcyhvbGQpO1xuLVx0XHR3aGlsZSAoY2lfb2ZmJiM0MzsmIzQzOyBcdTAwM2MgY2lfZW5kKVxuJiM0MztcdFx0ZG8ge1xuIFx0XHRcdFdBUk5fT05fT05DRShzd3BfdGJfdG9fZm9saW8oX19zd2FwX3RhYmxlX2dldChjaSwgY2lfb2ZmKSkgIT0gb2xkKTtcbiYjNDM7XHRcdH0gd2hpbGUgKCYjNDM7JiM0MztjaV9vZmYgXHUwMDNjIGNpX2VuZCk7XG4gXHR9XG4gfVxuIFxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA3IDIxOjU0PC90ZD4KCQkJPHRkPmFnZW50PC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjFtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmJlc3QtZXhwZW5zaXZlPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtUUkFOU1BBUkVOVF9IVUdFUEFHRSYjMzQ7LAogICAgJiMzNDtTV0FQJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7X19zcGxpdF9odWdlX3BhZ2VfdG9fbGlzdF90b19vcmRlciYjMzQ7LAogICAgJiMzNDtmb2xpb19zcGxpdCYjMzQ7LAogICAgJiMzNDtmb2xpb19zcGxpdF91bm1hcHBlZCYjMzQ7LAogICAgJiMzNDtfX3N3YXBfY2FjaGVfcmVwbGFjZV9mb2xpbyYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCByZXdvcmtzIHRoZSBsb2dpYyBmb3Igc3BsaXR0aW5nIHVubWFwcGVkIGZvbGlvcywgc3BlY2lmaWNhbGx5IGhhbmRsaW5nIHN3YXBjYWNoZSBhbmQgYW5vbnltb3VzIGZvbGlvcy4gSXQgaW50cm9kdWNlcyBuZXcgc3RhdGljIGZ1bmN0aW9ucyBgX19mb2xpb19mcmVlemVfc3BsaXRfdW5tYXBgIGFuZCBgX19mb2xpb19mcmVlemVfc3BsaXRfdW5tYXBfZmlsZWAgdG8gcmVwbGFjZSBgX19mb2xpb19mcmVlemVfYW5kX3NwbGl0X3VubWFwcGVkYC4gSXQgYWxzbyBtb2RpZmllcyBgZm9saW9fY2hlY2tfc3BsaXR0YWJsZWAgYW5kIGBfX2ZvbGlvX3NwbGl0YCB0byB1c2UgdGhlIG5ldyBsb2dpYy4gVGhlIGNoYW5nZXMgYWZmZWN0IGNvcmUgbWVtb3J5IG1hbmFnZW1lbnQsIHNwZWNpZmljYWxseSBUSFAgYW5kIGZvbGlvIHNwbGl0dGluZywgd2hpY2ggYXJlIGhpZ2hseSBjb21wbGV4IGFuZCBwcm9uZSB0byByYWNlIGNvbmRpdGlvbnMuIEZ1enppbmcgdGhlIG1haW4gZW50cnkgcG9pbnRzIGZvciBmb2xpbyBzcGxpdHRpbmcgaXMgaW1wb3J0YW50IHRvIGVuc3VyZSB0aGUgbmV3IGxvZ2ljIGlzIHJvYnVzdC4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPkluc3RydWN0aW9uOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+WW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIG1haW50YWluZXIuCllvdXIgam9iIGlzIHRvIHJldmlldyBhIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQgZGV0ZXJtaW5lCmlmIGl0IG1ha2VzIGZ1bmN0aW9uYWwgY2hhbmdlcyB0byB0aGUga2VybmVsIHRoYXQgc2hvdWxkIGJlIGZ1enplZC4KCklNUE9SVEFOVDogVGhlIGNoYW5nZXMgaGF2ZSBBTFJFQURZIGJlZW4gYXBwbGllZCBhbmQgY29tbWl0dGVkIGFzIHRoZSBIRUFEIGNvbW1pdCBpbgp5b3VyIHdvcmtzcGFjZS4gRG8gTk9UIHJlbHkgb24geW91ciBpbnRlcm5hbCBrbm93bGVkZ2Ugb2YgdGhlIGtlcm5lbC4gWW91IG11c3QgYWN0aXZlbHkKdXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gZXhhbWluZSB0aGUgYWN0dWFsIHNvdXJjZSBjb2RlIGFuZCBjb25maXJtIGFueSBhc3N1bXB0aW9ucy4KClJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgaWYgdGhlIHBhdGNoIG9ubHkgY29udGFpbnM6Ci0gTW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLywgS2NvbmZpZyBmaWxlcywgb3IgY29kZSBjb21tZW50cy4KLSBQdXJlbHkgZGVjb3JhdGl2ZSBjaGFuZ2VzLCBzdWNoIGFzIGxvZ2dpbmcgKGUuZy4sIHByX2VyciwgcHJpbnRrKSBvciB0cmFjZXBvaW50cy4KLSBDaGFuZ2VzIHRvIG51bWVyaWMgY29uc3RhbnRzIG9yIG1hY3JvcyB0aGF0IGRvIG5vdCBmdW5jdGlvbmFsbHkgYWx0ZXIgZXhlY3V0aW9uIGZsb3cuCi0gQ29kZSBwYXRocyB0aGF0IGFyZSBpbXBvc3NpYmxlIHRvIHJlYWNoIGluIHZpcnR1YWxpemVkIGVudmlyb25tZW50cyBsaWtlIEdDRSBvciBRRU1VLAogIGV2ZW4gd2hlbiB1dGlsaXppbmcgc29mdHdhcmUtZW11bGF0ZWQgaGFyZHdhcmUgKGUuZy4sIHVzYiBnYWRnZXQsIG1hYzgwMjExX2h3c2ltKS4KLSBDb2RlIGluIHZlbmRvci1zcGVjaWZpYyBQQ0llIHN3aXRjaCwgU21hcnROSUMsIG9yIEdQVSBkcml2ZXJzIChlLmcuLCBtbHhzdywgcGRzX2NvcmUsIHFlZCwKICBpb25pYywgYW1kZ3B1KSB0aGF0IHJlcXVpcmUgcGh5c2ljYWwgUENJZSBoYXJkd2FyZSBjYXJkcyBub3QgZW11bGF0ZWQgaW4gc3RhbmRhcmQgUUVNVS4KLSBEcml2ZXIgLnJlbW92ZSwgLnNodXRkb3duLCBvciBwY2lfdW5yZWdpc3Rlcl9kcml2ZXIgdGVhcmRvd24gY2FsbGJhY2tzIChlLmcuLCBpZ2JfcmVtb3ZlKQogIHRoYXQgYXJlIGV4ZWN1dGVkIG9ubHkgZHVyaW5nIFBDSSBob3QtdW5wbHVnIG9yIHN5c2ZzIGRyaXZlciB1bmJpbmQgb3BlcmF0aW9ucy4KCklmIGl0IG1vZGlmaWVzIHJlYWNoYWJsZSBjb3JlIGtlcm5lbCBsb2dpYywgZHJpdmVycywgb3IgYXJjaGl0ZWN0dXJlcywgdXNlIHlvdXIgY29kZSBzZWFyY2gKdG9vbHMgdG8gdmVyaWZ5IHRoZSBjb2RlIGNhbiBiZSBleGVjdXRlZCwgdGhlbiByZXR1cm4gV29ydGhGdXp6aW5nPXRydWUuCgpXaGVuIHJldHVybmluZyBXb3J0aEZ1enppbmc9dHJ1ZSwgeW91IE1VU1QgQUxTTzoKMS4gRXh0cmFjdCBhbnkgc3BlY2lmaWMga2VybmVsIGZ1bmN0aW9ucyB0aGF0IHNob3VsZCBiZSBoZWF2aWx5IGZ1enplZCBpbnRvIEZvY3VzU3ltYm9scy4KICAgQXZvaWQgbGlzdGluZyBnZW5lcmljIGhvdC1wYXRoIGZ1bmN0aW9ucyB0byBwcmV2ZW50IHNrZXdlZCB0ZXN0IGRpc3RyaWJ1dGlvbnMuCiAgIFByZWZlciBub24tc3RhdGljLCBub24taW5saW5lZCBBUEkgZW50cnlwb2ludCBmdW5jdGlvbnMgb3ZlciBpbnRlcm5hbCBzdGF0aWMgaGVscGVyIGZ1bmN0aW9ucwogICAod2hpY2ggYXJlIGlubGluZWQgYnkgdGhlIGNvbXBpbGVyIGFuZCBkbyBub3QgaGF2ZSBkaXN0aW5jdCBzeW1ib2wgYWRkcmVzc2VzKS4KMi4gSWRlbnRpZnkgYW55IHNwZWNpZmljIENPTkZJR18gb3B0aW9ucyByZXF1aXJlZCB0byBwcm9wZXJseSB0ZXN0IHRoaXMgbmV3L21vZGlmaWVkIGZlYXR1cmUuCiAgIEdvIGFuZCBsb29rIGludG8gdGhlIEtjb25maWcgZmlsZXMgYW5kIGNoZWNrIGZvciBpZmRlZnMgYXJvdW5kIHRoZSBjb2RlLCBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy4KICAgQWxzbyBjaGVjayAmIzM0O2RlcGVuZHMgb24mIzM0OyBsaW5lcyBpbiBLY29uZmlnIHRvIGluY2x1ZGUgYW55IG5vbi1zdGFuZGFyZCBwYXJlbnQgc3Vic3lzdGVtIGNvbmZpZ3MKICAgbmVlZGVkIGZvciBLYnVpbGQgdG8gY29tcGlsZSB0aGUgY29kZSBzdGF0aWNhbGx5IGludG8gdm1saW51eC4gTGlzdCB0aGVtIGluIHRoZSBFbmFibGVDb25maWdzCiAgIG91dHB1dCBhcnJheSwgYW5kIERPIE5PVCBhZGQgYSAmIzM5O0NPTkZJR18mIzM5OyBwcmVmaXggKGUuZy4sIHJldHVybiAmIzM0O05FVF9JUFY0JiMzNDsgaW5zdGVhZCBvZiAmIzM0O0NPTkZJR19ORVRfSVBWNCYjMzQ7KS4KUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuCgoKVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy4KSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuCklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC4KPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Qcm9tcHQ6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Gb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczoKY29tbWl0IGU1ZTI0NzhhNTZiOTUyYThhYzVmNjJkMmU2NWFmNTg4ZWMzNDI4NjgKQXV0aG9yOiBzeXotY2x1c3RlciAmbHQ7dHJpYWdlQHN5emthbGxlci5jb20mZ3Q7CkRhdGU6ICAgRnJpIEF1ZyA3IDIxOjU0OjA0IDIwMjYgJiM0MzswMDAwCgogICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3CgpkaWZmIC0tZ2l0IGEvbW0vaHVnZV9tZW1vcnkuYyBiL21tL2h1Z2VfbWVtb3J5LmMKaW5kZXggY2VkNDAwZjcyZDQzYS4uMGQ3MGVlMzAxN2M0NiAxMDA2NDQKLS0tIGEvbW0vaHVnZV9tZW1vcnkuYwomIzQzOyYjNDM7JiM0MzsgYi9tbS9odWdlX21lbW9yeS5jCkBAIC0zNTg5LDkgJiM0MzszNTg5LDYgQEAgc3RhdGljIHZvaWQgcmVtYXBfcGFnZShzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBsb25nIG5yLCBpbnQgZmxhZ3MpCiB7CiAJaW50IGkgPSAwOwogCi0JLyogSWYgdW5tYXBfZm9saW8oKSB1c2VzIHRyeV90b19taWdyYXRlKCkgb24gZmlsZSwgcmVtb3ZlIHRoaXMgY2hlY2sgKi8KLQlpZiAoIWZvbGlvX3Rlc3RfYW5vbihmb2xpbykpCi0JCXJldHVybjsKIAlmb3IgKDs7KSB7CiAJCXJlbW92ZV9taWdyYXRpb25fcHRlcyhmb2xpbywgZm9saW8sIFRUVV9STUFQX0xPQ0tFRCB8IGZsYWdzKTsKIAkJaSAmIzQzOz0gZm9saW9fbnJfcGFnZXMoZm9saW8pOwpAQCAtMzgwMCw2ICYjNDM7Mzc5Nyw3IEBAIHN0YXRpYyBpbnQgX19zcGxpdF91bm1hcHBlZF9mb2xpbyhzdHJ1Y3QgZm9saW8gKmZvbGlvLCBpbnQgbmV3X29yZGVyLAogCQlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywgZW51bSBzcGxpdF90eXBlIHNwbGl0X3R5cGUpCiB7CiAJY29uc3QgYm9vbCBpc19hbm9uID0gZm9saW9fdGVzdF9hbm9uKGZvbGlvKTsKJiM0MzsJY29uc3QgYm9vbCBpc19zd2FwY2FjaGUgPSBmb2xpb190ZXN0X3N3YXBjYWNoZShmb2xpbyk7CiAJaW50IG9sZF9vcmRlciA9IGZvbGlvX29yZGVyKGZvbGlvKTsKIAlpbnQgc3RhcnRfb3JkZXIgPSBzcGxpdF90eXBlID09IFNQTElUX1RZUEVfVU5JRk9STSA/IG5ld19vcmRlciA6IG9sZF9vcmRlciAtIDE7CiAJc3RydWN0IGZvbGlvICpvbGRfZm9saW8gPSBmb2xpbzsKQEAgLTM4MTQsOCAmIzQzOzM4MTIsOCBAQCBzdGF0aWMgaW50IF9fc3BsaXRfdW5tYXBwZWRfZm9saW8oc3RydWN0IGZvbGlvICpmb2xpbywgaW50IG5ld19vcmRlciwKIAkgICAgIHNwbGl0X29yZGVyLS0pIHsKIAkJaW50IG5yX25ld19mb2xpb3MgPSAxVUwgJmx0OyZsdDsgKG9sZF9vcmRlciAtIHNwbGl0X29yZGVyKTsKIAotCQkvKiBvcmRlci0xIGFub255bW91cyBmb2xpbyBpcyBub3Qgc3VwcG9ydGVkICovCi0JCWlmIChpc19hbm9uICZhbXA7JmFtcDsgc3BsaXRfb3JkZXIgPT0gMSkKJiM0MzsJCS8qIG9yZGVyLTEgYW5vbnltb3VzIG9yIHN3YXBjYWNoZSBmb2xpbyBpcyBub3Qgc3VwcG9ydGVkICovCiYjNDM7CQlpZiAoKGlzX2Fub24gfHwgaXNfc3dhcGNhY2hlKSAmYW1wOyZhbXA7IHNwbGl0X29yZGVyID09IDEpCiAJCQljb250aW51ZTsKIAogCQlpZiAobWFwcGluZykgewpAQCAtMzg3OCwzMiAmIzQzOzM4NzYsMjYgQEAgc3RhdGljIGludCBfX3NwbGl0X3VubWFwcGVkX2ZvbGlvKHN0cnVjdCBmb2xpbyAqZm9saW8sIGludCBuZXdfb3JkZXIsCiBpbnQgZm9saW9fY2hlY2tfc3BsaXR0YWJsZShzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyLAogCQkJICAgZW51bSBzcGxpdF90eXBlIHNwbGl0X3R5cGUpCiB7CiYjNDM7CWJvb2wgaXNfYW5vbiA9IGZvbGlvX3Rlc3RfYW5vbihmb2xpbyk7CiYjNDM7CWJvb2wgaXNfc3dhcGNhY2hlID0gZm9saW9fdGVzdF9zd2FwY2FjaGUoZm9saW8pOwomIzQzOwogCVZNX1dBUk5fT05fRk9MSU8oIWZvbGlvX3Rlc3RfbG9ja2VkKGZvbGlvKSwgZm9saW8pOwogCS8qCiAJICogRm9saW9zIHRoYXQganVzdCBnb3QgdHJ1bmNhdGVkIGNhbm5vdCBnZXQgc3BsaXQuIFNpZ25hbCB0byB0aGUKLQkgKiBjYWxsZXIgdGhhdCB0aGVyZSB3YXMgYSByYWNlLgotCSAqCi0JICogVE9ETzogdGhpcyB3aWxsIGFsc28gY3VycmVudGx5IHJlZnVzZSBmb2xpb3Mgd2l0aG91dCBhIG1hcHBpbmcgaW4gdGhlCi0JICogc3dhcGNhY2hlIChzaG1lbSBvciB0by1iZS1hbm9uIGZvbGlvcykuCiYjNDM7CSAqIGNhbGxlciB0aGF0IHRoZXJlIHdhcyBhIHJhY2UuIEEgbWFwcGluZ2xlc3Mgc3dhcCBjYWNoZSBmb2xpbwomIzQzOwkgKiBoYXMgbm8gcGFnZSBjYWNoZSBlbnRyaWVzIHRvIHVwZGF0ZSwgc28gaXQgaXMgZmluZSB0byBzcGxpdC4KIAkgKi8KLQlpZiAoIWZvbGlvLSZndDttYXBwaW5nICZhbXA7JmFtcDsgIWZvbGlvX3Rlc3RfYW5vbihmb2xpbykpCiYjNDM7CWlmICghZm9saW8tJmd0O21hcHBpbmcgJmFtcDsmYW1wOyAhaXNfc3dhcGNhY2hlKQogCQlyZXR1cm4gLUVCVVNZOwogCi0JLyogb3JkZXItMSBpcyBub3Qgc3VwcG9ydGVkIGZvciBhbm9ueW1vdXMgVEhQLiAqLwotCWlmIChmb2xpb190ZXN0X2Fub24oZm9saW8pICZhbXA7JmFtcDsgbmV3X29yZGVyID09IDEpCi0JCXJldHVybiAtRUlOVkFMOwotCiAJLyoKLQkgKiBzd2FwY2FjaGUgZm9saW8gY291bGQgb25seSBiZSBzcGxpdCB0byBvcmRlciAwCi0JICoKLQkgKiBub24tdW5pZm9ybSBzcGxpdCBjcmVhdGVzIGFmdGVyLXNwbGl0IGZvbGlvcyB3aXRoIG9yZGVycyBmcm9tCi0JICogZm9saW9fb3JkZXIoZm9saW8pIC0gMSB0byBuZXdfb3JkZXIsIG1ha2luZyBpdCBub3Qgc3VpdGFibGUgZm9yIGFueQotCSAqIHN3YXBjYWNoZSBmb2xpbyBzcGxpdC4gT25seSB1bmlmb3JtIHNwbGl0IHRvIG9yZGVyLTAgY2FuIGJlIHVzZWQKLQkgKiBoZXJlLgomIzQzOwkgKiBPcmRlci0xIGlzIHVuc3VwcG9ydGVkOiBhbm9uIGZvbGlvcyBuZWVkIHN1YnBhZ2UgMiBmb3IgdGhlCiYjNDM7CSAqIGRlZmVycmVkIHNwbGl0IGxpc3QsIGh5YnJpZCBzaG1lbSAmYW1wOyBzd2FwIGNhY2hlIGZvbGlvcyBhcmUgbm90CiYjNDM7CSAqIHNwbGl0dGFibGUsIGFuZCBhIHNwbGl0dGFibGUgbWFwcGluZ2xlc3Mgc3dhcCBjYWNoZSBmb2xpbyBjb3VsZAomIzQzOwkgKiBiZSBlaXRoZXIgYW5vbiBvciBzaG1lbSwgd2hpY2ggd2UgY2Fubm90IHRlbGwgYXBhcnQuCiAJICovCi0JaWYgKChzcGxpdF90eXBlID09IFNQTElUX1RZUEVfTk9OX1VOSUZPUk0gfHwgbmV3X29yZGVyKSAmYW1wOyZhbXA7IGZvbGlvX3Rlc3Rfc3dhcGNhY2hlKGZvbGlvKSkgewomIzQzOwlpZiAoKGlzX2Fub24gfHwgaXNfc3dhcGNhY2hlKSAmYW1wOyZhbXA7IG5ld19vcmRlciA9PSAxKQogCQlyZXR1cm4gLUVJTlZBTDsKLQl9CiAKIAlpZiAoaXNfaHVnZV96ZXJvX2ZvbGlvKGZvbGlvKSkKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0zOTExLDM5ICYjNDM7MzkwMyw3OCBAQCBpbnQgZm9saW9fY2hlY2tfc3BsaXR0YWJsZShzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyLAogCWlmIChmb2xpb190ZXN0X3dyaXRlYmFjayhmb2xpbykpCiAJCXJldHVybiAtRUJVU1k7CiAKJiM0MzsJLyoKJiM0MzsJICogQSBub24tYW5vbiBzd2FwY2FjaGUgZm9saW8gdGhhdCBzdGlsbCBoYXMgYSBtYXBwaW5nIHNob3VsZCBvbmx5CiYjNDM7CSAqIGJlIGEgc2htZW0gZm9saW8gdW5kZXIgSU8sIHRoZXJlIGlzIGxpdHRsZSBiZW5lZml0IGluIHNwbGl0dGluZwomIzQzOwkgKiB0aGVtIGhlbmNlIG5vdCBzdXBwb3J0ZWQuIFJlamVjdCBpdCBoZXJlIHVwIGZyb250OiB0aGUgc3BsaXQKJiM0MzsJICogcm91dGluZSBjYW5ub3QgYmFjayBvdXQgY2xlYW5seSBvbmNlIHRoZSBmb2xpbyByZWYgaXMgZnJvemVuLgomIzQzOwkgKi8KJiM0MzsJaWYgKCFpc19hbm9uICZhbXA7JmFtcDsgaXNfc3dhcGNhY2hlICZhbXA7JmFtcDsgZm9saW8tJmd0O21hcHBpbmcpCiYjNDM7CQlyZXR1cm4gLUVJTlZBTDsKJiM0MzsKIAlyZXR1cm4gMDsKIH0KIAotLyogTnVtYmVyIG9mIGZvbGlvIHJlZmVyZW5jZXMgZnJvbSB0aGUgcGFnZWNhY2hlIG9yIHRoZSBzd2FwY2FjaGUuICovCi1zdGF0aWMgdW5zaWduZWQgaW50IGZvbGlvX2NhY2hlX3JlZl9jb3VudChjb25zdCBzdHJ1Y3QgZm9saW8gKmZvbGlvKQomIzQzOy8qIE51bWJlciBvZiBmb2xpbyByZWZlcmVuY2VzIGZyb20gdGhlIHN3YXBjYWNoZS4gKi8KJiM0MztzdGF0aWMgdW5zaWduZWQgaW50IGZvbGlvX3N3YXBjYWNoZV9yZWZfY291bnQoY29uc3Qgc3RydWN0IGZvbGlvICpmb2xpbykKIHsKLQlpZiAoZm9saW9fdGVzdF9hbm9uKGZvbGlvKSAmYW1wOyZhbXA7ICFmb2xpb190ZXN0X3N3YXBjYWNoZShmb2xpbykpCiYjNDM7CWlmICghZm9saW9fdGVzdF9zd2FwY2FjaGUoZm9saW8pKQogCQlyZXR1cm4gMDsKIAlyZXR1cm4gZm9saW9fbnJfcGFnZXMoZm9saW8pOwogfQogCi1zdGF0aWMgaW50IF9fZm9saW9fZnJlZXplX2FuZF9zcGxpdF91bm1hcHBlZChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyLAotCQkJCQkgICAgIHN0cnVjdCBwYWdlICpzcGxpdF9hdCwgc3RydWN0IHhhX3N0YXRlICp4YXMsCi0JCQkJCSAgICAgc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsIGJvb2wgZG9fbHJ1LAotCQkJCQkgICAgIHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QsIGVudW0gc3BsaXRfdHlwZSBzcGxpdF90eXBlLAotCQkJCQkgICAgIHBnb2ZmX3QgZW5kLCBpbnQgKm5yX3NobWVtX2Ryb3BwZWQpCiYjNDM7c3RhdGljIGludCBfX2ZvbGlvX2ZyZWV6ZV9zcGxpdF91bm1hcChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyLAomIzQzOwkJCQkgICAgICBzdHJ1Y3QgcGFnZSAqc3BsaXRfYXQsIGJvb2wgZG9fbHJ1LCBib29sIGFub25fdW5tYXAsCiYjNDM7CQkJCSAgICAgIHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QsIGVudW0gc3BsaXRfdHlwZSBzcGxpdF90eXBlKQogewogCXN0cnVjdCBmb2xpbyAqZW5kX2ZvbGlvID0gZm9saW9fbmV4dChmb2xpbyk7Ci0Jc3RydWN0IGZvbGlvICpuZXdfZm9saW8sICpuZXh0OwomIzQzOwlib29sIGlzX2Fub24gPSBmb2xpb190ZXN0X2Fub24oZm9saW8pOwomIzQzOwlzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpID0gTlVMTDsKJiM0MzsJc3RydWN0IGZvbGlvICpuZXdfZm9saW87CiAJaW50IG9sZF9vcmRlciA9IGZvbGlvX29yZGVyKGZvbGlvKTsKJiM0MzsJc3RydWN0IGFub25fdm1hICphbm9uX3ZtYSA9IE5VTEw7CiYjNDM7CWVudW0gdHR1X2ZsYWdzIHR0dV9mbGFncyA9IDA7CiAJc3RydWN0IGxpc3RfbHJ1X29uZSAqbHJ1OwomIzQzOwlzdHJ1Y3QgbHJ1dmVjICpscnV2ZWM7CiAJYm9vbCBkZXF1ZXVlX2RlZmVycmVkOwogCWludCByZXQgPSAwOwogCi0JVk1fV0FSTl9PTl9PTkNFKCFtYXBwaW5nICZhbXA7JmFtcDsgZW5kKTsKJiM0MzsJLyoKJiM0MzsJICogVW5tYXAvcmVtYXAgbmVlZHMgdGhlIGFub25fdm1hLiBUaGUgY2FsbGVyIGRvZXMgbm90IG5lY2Vzc2FyaWx5CiYjNDM7CSAqIGhvbGQgYW4gbW1hcF9sb2NrIHRoYXQgd291bGQgcHJldmVudCB0aGUgYW5vbl92bWEgZnJvbQomIzQzOwkgKiBkaXNhcHBlYXJpbmcsIHNvIHdlIGZpcnN0IHRha2UgYSByZWZlcmVuY2UgYW5kIGxvY2sgaXQuIFRoaXMgaXMKJiM0MzsJICogc2ltaWxhciB0byBmb2xpb19sb2NrX2Fub25fdm1hX3JlYWQoKSBleGNlcHQgdGhlIHdyaXRlIGxvY2sgaXMKJiM0MzsJICogdGFrZW4gdG8gc2VyaWFsaXplIGFnYWluc3QgcGFyYWxsZWwgc3BsaXQgb3IgY29sbGFwc2UuCiYjNDM7CSAqLwomIzQzOwlpZiAoYW5vbl91bm1hcCkgewomIzQzOwkJYW5vbl92bWEgPSBmb2xpb19nZXRfYW5vbl92bWEoZm9saW8pOwomIzQzOwkJaWYgKCFhbm9uX3ZtYSkKJiM0MzsJCQlyZXR1cm4gLUVCVVNZOwomIzQzOwkJYW5vbl92bWFfbG9ja193cml0ZShhbm9uX3ZtYSk7CiYjNDM7CX0KJiM0MzsKJiM0MzsJLyogUmFjeSBjaGVjayBpZiB3ZSBjYW4gc3BsaXQgdGhlIHBhZ2UsIGJlZm9yZSB0aGUgb3B0aW9uYWwgdW5tYXAuICovCiYjNDM7CWlmIChmb2xpb19leHBlY3RlZF9yZWZfY291bnQoZm9saW8pICE9IGZvbGlvX3JlZl9jb3VudChmb2xpbykgLSAxKSB7CiYjNDM7CQlyZXQgPSAtRUFHQUlOOwomIzQzOwkJZ290byBvdXRfdW5sb2NrOwomIzQzOwl9CiYjNDM7CiYjNDM7CWlmIChhbm9uX3VubWFwKQomIzQzOwkJdW5tYXBfZm9saW8oZm9saW8pOwomIzQzOwomIzQzOwlsb2NhbF9pcnFfZGlzYWJsZSgpOwomIzQzOwogCS8qCiAJICogSWYgdGhpcyBmb2xpbyBjYW4gYmUgb24gdGhlIGRlZmVycmVkIHNwbGl0IHF1ZXVlLCBsb2NrIG91dAogCSAqIHRoZSBzaHJpbmtlciBiZWZvcmUgZnJlZXppbmcgdGhlIHJlZi4gSWYgdGhlIHNocmlua2VyIHNlZXMKIAkgKiBhIDAtcmVmIGZvbGlvLCBpdCBhc3N1bWVzIGl0IGJlYXQgZm9saW9fcHV0KCkgdG8gdGhlIGxpc3QKIAkgKiBsb2NrIGFuZCBtdXN0IGNsZWFuIHVwIHRoZSBMUlUgc3RhdGUgLSB0aGUgc2FtZSBkZXF1ZXVlIHdlCiAJICogd2lsbCBkbyBiZWxvdyBhcyBwYXJ0IG9mIHRoZSBzcGxpdC4KJiM0MzsJICoKJiM0MzsJICogT25seSBhbm9uIGZvbGlvcyBhcmUgZXZlciBxdWV1ZWQgb24gdGhlIGRlZmVycmVkIHNwbGl0IGxpc3QsCiYjNDM7CSAqIHNvIG5vbi1hbm9uIGZvbGlvcyAobWFwcGluZ2xlc3Mgc3dhcGNhY2hlKSBuZXZlciBuZWVkIGRlcXVldWluZy4KIAkgKi8KLQlkZXF1ZXVlX2RlZmVycmVkID0gZm9saW9fdGVzdF9hbm9uKGZvbGlvKSAmYW1wOyZhbXA7IG9sZF9vcmRlciAmZ3Q7IDE7CiYjNDM7CWRlcXVldWVfZGVmZXJyZWQgPSBvbGRfb3JkZXIgJmd0OyAxICZhbXA7JmFtcDsgaXNfYW5vbjsKIAlpZiAoZGVxdWV1ZV9kZWZlcnJlZCkgewogCQlzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2c7CiAKQEAgLTM5NTIsMTI4ICYjNDM7Mzk4MywyNDMgQEAgc3RhdGljIGludCBfX2ZvbGlvX2ZyZWV6ZV9hbmRfc3BsaXRfdW5tYXBwZWQoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG4KIAkJbHJ1ID0gbGlzdF9scnVfbG9jaygmYW1wO2RlZmVycmVkX3NwbGl0X2xydSwKIAkJCQkgICAgZm9saW9fbmlkKGZvbGlvKSwgJmFtcDttZW1jZyk7CiAJfQotCWlmIChmb2xpb19yZWZfZnJlZXplKGZvbGlvLCBmb2xpb19jYWNoZV9yZWZfY291bnQoZm9saW8pICYjNDM7IDEpKSB7Ci0JCXN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2kgPSBOVUxMOwotCQlzdHJ1Y3QgbHJ1dmVjICpscnV2ZWM7CiAKJiM0MzsJaWYgKCFmb2xpb19yZWZfZnJlZXplKGZvbGlvLCBmb2xpb19zd2FwY2FjaGVfcmVmX2NvdW50KGZvbGlvKSAmIzQzOyAxKSkgewogCQlpZiAoZGVxdWV1ZV9kZWZlcnJlZCkgewotCQkJX19saXN0X2xydV9kZWwoJmFtcDtkZWZlcnJlZF9zcGxpdF9scnUsIGxydSwKLQkJCQkgICAgICAgJmFtcDtmb2xpby0mZ3Q7X2RlZmVycmVkX2xpc3QsIGZvbGlvX25pZChmb2xpbykpOwotCQkJaWYgKGZvbGlvX3Rlc3RfcGFydGlhbGx5X21hcHBlZChmb2xpbykpIHsKLQkJCQlmb2xpb19jbGVhcl9wYXJ0aWFsbHlfbWFwcGVkKGZvbGlvKTsKLQkJCQltb2RfbXRocF9zdGF0KG9sZF9vcmRlciwKLQkJCQkJTVRIUF9TVEFUX05SX0FOT05fUEFSVElBTExZX01BUFBFRCwgLTEpOwotCQkJfQogCQkJbGlzdF9scnVfdW5sb2NrKGxydSk7CiAJCQlyY3VfcmVhZF91bmxvY2soKTsKIAkJfQomIzQzOwkJcmV0ID0gLUVBR0FJTjsKJiM0MzsJCWdvdG8gb3V0X25vX3NwbGl0OwomIzQzOwl9CiAKLQkJaWYgKG1hcHBpbmcpIHsKLQkJCWludCBuciA9IGZvbGlvX25yX3BhZ2VzKGZvbGlvKTsKLQotCQkJaWYgKGZvbGlvX3Rlc3RfcG1kX21hcHBhYmxlKGZvbGlvKSAmYW1wOyZhbXA7Ci0JCQkgICAgbmV3X29yZGVyICZsdDsgSFBBR0VfUE1EX09SREVSKSB7Ci0JCQkJaWYgKGZvbGlvX3Rlc3Rfc3dhcGJhY2tlZChmb2xpbykpIHsKLQkJCQkJbHJ1dmVjX3N0YXRfbW9kX2ZvbGlvKGZvbGlvLAotCQkJCQkJCU5SX1NITUVNX1RIUFMsIC1ucik7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJbHJ1dmVjX3N0YXRfbW9kX2ZvbGlvKGZvbGlvLAotCQkJCQkJCU5SX0ZJTEVfVEhQUywgLW5yKTsKLQkJCQl9Ci0JCQl9CiYjNDM7CWlmIChkZXF1ZXVlX2RlZmVycmVkKSB7CiYjNDM7CQlfX2xpc3RfbHJ1X2RlbCgmYW1wO2RlZmVycmVkX3NwbGl0X2xydSwgbHJ1LAomIzQzOwkJCSAgICAgICAmYW1wO2ZvbGlvLSZndDtfZGVmZXJyZWRfbGlzdCwgZm9saW9fbmlkKGZvbGlvKSk7CiYjNDM7CQlpZiAoZm9saW9fdGVzdF9wYXJ0aWFsbHlfbWFwcGVkKGZvbGlvKSkgewomIzQzOwkJCWZvbGlvX2NsZWFyX3BhcnRpYWxseV9tYXBwZWQoZm9saW8pOwomIzQzOwkJCW1vZF9tdGhwX3N0YXQob2xkX29yZGVyLAomIzQzOwkJCQkgICAgICBNVEhQX1NUQVRfTlJfQU5PTl9QQVJUSUFMTFlfTUFQUEVELCAtMSk7CiAJCX0KJiM0MzsJCWxpc3RfbHJ1X3VubG9jayhscnUpOwomIzQzOwkJcmN1X3JlYWRfdW5sb2NrKCk7CiYjNDM7CX0KIAotCQlpZiAoZm9saW9fdGVzdF9zd2FwY2FjaGUoZm9saW8pKSB7Ci0JCQlpZiAobWFwcGluZykgewotCQkJCVZNX1dBUk5fT05fT05DRV9GT0xJTyhtYXBwaW5nLCBmb2xpbyk7Ci0JCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQl9CiYjNDM7CWlmIChmb2xpb190ZXN0X3N3YXBjYWNoZShmb2xpbykpCiYjNDM7CQljaSA9IHN3YXBfY2x1c3Rlcl9nZXRfYW5kX2xvY2soZm9saW8pOwogCi0JCQljaSA9IHN3YXBfY2x1c3Rlcl9nZXRfYW5kX2xvY2soZm9saW8pOwotCQl9CiYjNDM7CWlmIChkb19scnUpCiYjNDM7CQlscnV2ZWMgPSBmb2xpb19scnV2ZWNfbG9jayhmb2xpbyk7CiYjNDM7CiYjNDM7CXJldCA9IF9fc3BsaXRfdW5tYXBwZWRfZm9saW8oZm9saW8sIG5ld19vcmRlciwgc3BsaXRfYXQsIE5VTEwsCiYjNDM7CQkJCSAgICAgTlVMTCwgc3BsaXRfdHlwZSk7CiAKLQkJLyogbG9jayBscnUgbGlzdC9QYWdlQ29tcG91bmQsIHJlZiBmcm96ZW4gYnkgcGFnZV9yZWZfZnJlZXplICovCiYjNDM7CS8qCiYjNDM7CSAqIFVuZnJlZXplIHRoZSBhZnRlci1zcGxpdCBmb2xpb3MgYW5kIHB1dCB0aGVtIGJhY2sgdG8gdGhlIHJpZ2h0CiYjNDM7CSAqIHBsYWNlLCBrZWVwaW5nIHRoZSBoZWFkIEBmb2xpbyBmcm96ZW4gdW50aWwgdGhlIGVuZC4gV2hpbGUgdGhlCiYjNDM7CSAqIGZvbGlvIGlzIGluIHRoZSBzd2FwIGNhY2hlLCB0aGUgc3ViIGVudHJpZXMgbXVzdCBiZSB1cGRhdGVkIHdpdGgKJiM0MzsJICogdGhlaXIgYWZ0ZXItc3BsaXQgZm9saW9zIGJlZm9yZSB0aGUgaGVhZCBpcyB1bmZyb3plbiwgc28gYQomIzQzOwkgKiBjb25jdXJyZW50IHN3YXBfY2FjaGVfZ2V0X2ZvbGlvKCkgY2Fubm90IHJldHVybiB0aGUgaGVhZCBmb2xpbwomIzQzOwkgKiBmb3IgYSBzdWIgZW50cnkuIEtlZXBpbmcgdGhlIGhlYWQgZnJvemVuIHRocm91Z2hvdXQgYWxzbyBzdG9wcyBhCiYjNDM7CSAqIHBhcmFsbGVsIGZvbGlvX3RyeV9nZXQoKSBmcm9tIG9ic2VydmluZyBhIHBhcnRpYWxseSBzcGxpdCBmb2xpby4KJiM0MzsJICovCiYjNDM7CWZvciAobmV3X2ZvbGlvID0gZm9saW9fbmV4dChmb2xpbyk7IG5ld19mb2xpbyAhPSBlbmRfZm9saW87CiYjNDM7CSAgICAgbmV3X2ZvbGlvID0gZm9saW9fbmV4dChuZXdfZm9saW8pKSB7CiYjNDM7CQl6b25lX2RldmljZV9wcml2YXRlX3NwbGl0X2NiKGZvbGlvLCBuZXdfZm9saW8pOwomIzQzOwkJZm9saW9fcmVmX3VuZnJlZXplKG5ld19mb2xpbywKJiM0MzsJCQkJICAgZm9saW9fc3dhcGNhY2hlX3JlZl9jb3VudChuZXdfZm9saW8pICYjNDM7IDEpOwogCQlpZiAoZG9fbHJ1KQotCQkJbHJ1dmVjID0gZm9saW9fbHJ1dmVjX2xvY2soZm9saW8pOwomIzQzOwkJCWxydV9hZGRfc3BsaXRfZm9saW8oZm9saW8sIG5ld19mb2xpbywgbHJ1dmVjLCBsaXN0KTsKJiM0MzsJCWlmIChjaSkKJiM0MzsJCQlfX3N3YXBfY2FjaGVfcmVwbGFjZV9mb2xpbyhjaSwgZm9saW8sIG5ld19mb2xpbyk7CiYjNDM7CX0KIAotCQlyZXQgPSBfX3NwbGl0X3VubWFwcGVkX2ZvbGlvKGZvbGlvLCBuZXdfb3JkZXIsIHNwbGl0X2F0LCB4YXMsCi0JCQkJCSAgICAgbWFwcGluZywgc3BsaXRfdHlwZSk7CiYjNDM7CXpvbmVfZGV2aWNlX3ByaXZhdGVfc3BsaXRfY2IoZm9saW8sIE5VTEwpOwomIzQzOwlmb2xpb19yZWZfdW5mcmVlemUoZm9saW8sIGZvbGlvX3N3YXBjYWNoZV9yZWZfY291bnQoZm9saW8pICYjNDM7IDEpOwogCi0JCS8qCi0JCSAqIFVuZnJlZXplIGFmdGVyLXNwbGl0IGZvbGlvcyBhbmQgcHV0IHRoZW0gYmFjayB0byB0aGUgcmlnaHQKLQkJICogbGlzdC4gQGZvbGlvIHNob3VsZCBiZSBrZXB0IGZyb3pvbiB1bnRpbCBwYWdlIGNhY2hlCi0JCSAqIGVudHJpZXMgYXJlIHVwZGF0ZWQgd2l0aCBhbGwgdGhlIG90aGVyIGFmdGVyLXNwbGl0IGZvbGlvcwotCQkgKiB0byBwcmV2ZW50IG90aGVycyBzZWVpbmcgc3RhbGUgcGFnZSBjYWNoZSBlbnRyaWVzLgotCQkgKiBBcyBhIHJlc3VsdCwgbmV3X2ZvbGlvIHN0YXJ0cyBmcm9tIHRoZSBuZXh0IGZvbGlvIG9mCi0JCSAqIEBmb2xpby4KLQkJICovCi0JCWZvciAobmV3X2ZvbGlvID0gZm9saW9fbmV4dChmb2xpbyk7IG5ld19mb2xpbyAhPSBlbmRfZm9saW87Ci0JCSAgICAgbmV3X2ZvbGlvID0gbmV4dCkgewotCQkJdW5zaWduZWQgbG9uZyBucl9wYWdlcyA9IGZvbGlvX25yX3BhZ2VzKG5ld19mb2xpbyk7CiYjNDM7CWlmIChkb19scnUpCiYjNDM7CQlscnV2ZWNfdW5sb2NrKGxydXZlYyk7CiYjNDM7CWlmIChjaSkKJiM0MzsJCXN3YXBfY2x1c3Rlcl91bmxvY2soY2kpOwomIzQzO291dF9ub19zcGxpdDoKJiM0MzsJbG9jYWxfaXJxX2VuYWJsZSgpOwomIzQzOwlpZiAoYW5vbl91bm1hcCkgewomIzQzOwkJaWYgKCFyZXQgJmFtcDsmYW1wOyAhZm9saW9faXNfZGV2aWNlX3ByaXZhdGUoZm9saW8pKQomIzQzOwkJCXR0dV9mbGFncyA9IFRUVV9VU0VfU0hBUkVEX1pFUk9QQUdFOwomIzQzOwkJcmVtYXBfcGFnZShmb2xpbywgMSAmbHQ7Jmx0OyBvbGRfb3JkZXIsIHR0dV9mbGFncyk7CiYjNDM7CX0KJiM0MztvdXRfdW5sb2NrOgomIzQzOwlpZiAoYW5vbl91bm1hcCkgewomIzQzOwkJYW5vbl92bWFfdW5sb2NrX3dyaXRlKGFub25fdm1hKTsKJiM0MzsJCXB1dF9hbm9uX3ZtYShhbm9uX3ZtYSk7CiYjNDM7CX0KIAotCQkJbmV4dCA9IGZvbGlvX25leHQobmV3X2ZvbGlvKTsKJiM0MzsJcmV0dXJuIHJldDsKJiM0Mzt9CiAKLQkJCXpvbmVfZGV2aWNlX3ByaXZhdGVfc3BsaXRfY2IoZm9saW8sIG5ld19mb2xpbyk7CiYjNDM7c3RhdGljIGludCBfX2ZvbGlvX2ZyZWV6ZV9zcGxpdF91bm1hcF9maWxlKHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIsCiYjNDM7CQkJCQkgICBzdHJ1Y3QgcGFnZSAqc3BsaXRfYXQsIGJvb2wgZG9fbHJ1LAomIzQzOwkJCQkJICAgc3RydWN0IGxpc3RfaGVhZCAqbGlzdCwgZW51bSBzcGxpdF90eXBlIHNwbGl0X3R5cGUpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyA9IGZvbGlvLSZndDttYXBwaW5nOwomIzQzOwlYQV9TVEFURSh4YXMsICZhbXA7bWFwcGluZy0mZ3Q7aV9wYWdlcywgZm9saW8tJmd0O2luZGV4KTsKJiM0MzsJc3RydWN0IGZvbGlvICplbmRfZm9saW8gPSBmb2xpb19uZXh0KGZvbGlvKTsKJiM0MzsJbG9uZyBvbGRfbnJfcGFnZXMgPSBmb2xpb19ucl9wYWdlcyhmb2xpbyk7CiYjNDM7CXN0cnVjdCBtZW1fY2dyb3VwICptZW1jZywgKm9sZF9tZW1jZzsKJiM0MzsJc3RydWN0IGZvbGlvICpuZXdfZm9saW8sICpuZXh0OwomIzQzOwlpbnQgbnJfc2htZW1fZHJvcHBlZCA9IDA7CiYjNDM7CXVuc2lnbmVkIGludCBtaW5fb3JkZXI7CiYjNDM7CXN0cnVjdCBscnV2ZWMgKmxydXZlYzsKJiM0MzsJcGdvZmZfdCBlbmQgPSAwOwomIzQzOwlnZnBfdCBnZnA7CiYjNDM7CWludCByZXQgPSAwOwogCi0JCQlmb2xpb19yZWZfdW5mcmVlemUobmV3X2ZvbGlvLAotCQkJCQkgICBmb2xpb19jYWNoZV9yZWZfY291bnQobmV3X2ZvbGlvKSAmIzQzOyAxKTsKJiM0MzsJbWluX29yZGVyID0gbWFwcGluZ19taW5fZm9saW9fb3JkZXIobWFwcGluZyk7CiYjNDM7CWlmIChuZXdfb3JkZXIgJmx0OyBtaW5fb3JkZXIpCiYjNDM7CQlyZXR1cm4gLUVJTlZBTDsKIAotCQkJaWYgKGRvX2xydSkKLQkJCQlscnVfYWRkX3NwbGl0X2ZvbGlvKGZvbGlvLCBuZXdfZm9saW8sIGxydXZlYywgbGlzdCk7CiYjNDM7CS8qCiYjNDM7CSAqIFN3aXRjaCB0byBmb2xpbyYjMzk7cyBtZW1jZyBhcyB4YXJyYXkgbm9kZSBhbGxvY2F0aW9uIGNhbiBoYXBwZW4gYW5kCiYjNDM7CSAqIG5lZWRzIHRvIGNoYXJnZSB0byBpdC4KJiM0MzsJICovCiYjNDM7CW1lbWNnID0gZ2V0X21lbV9jZ3JvdXBfZnJvbV9mb2xpbyhmb2xpbyk7CiYjNDM7CW9sZF9tZW1jZyA9IHNldF9hY3RpdmVfbWVtY2cobWVtY2cpOwogCi0JCQkvKgotCQkJICogQW5vbnltb3VzIGZvbGlvIHdpdGggc3dhcCBjYWNoZS4KLQkJCSAqIE5PVEU6IHNobWVtIGluIHN3YXAgY2FjaGUgaXMgbm90IHN1cHBvcnRlZCB5ZXQuCi0JCQkgKi8KLQkJCWlmIChjaSkgewotCQkJCV9fc3dhcF9jYWNoZV9yZXBsYWNlX2ZvbGlvKGNpLCBmb2xpbywgbmV3X2ZvbGlvKTsKLQkJCQljb250aW51ZTsKLQkJCX0KJiM0MzsJZ2ZwID0gY3VycmVudF9nZnBfY29udGV4dChtYXBwaW5nX2dmcF9tYXNrKG1hcHBpbmcpICZhbXA7IEdGUF9SRUNMQUlNX01BU0spOwomIzQzOwlpZiAoIWZpbGVtYXBfcmVsZWFzZV9mb2xpbyhmb2xpbywgZ2ZwKSkgewomIzQzOwkJcmV0ID0gLUVCVVNZOwomIzQzOwkJZ290byBmYWlsX2ZyZWU7CiYjNDM7CX0KIAotCQkJLyogQW5vbnltb3VzIGZvbGlvIHdpdGhvdXQgc3dhcCBjYWNoZSAqLwotCQkJaWYgKCFtYXBwaW5nKQotCQkJCWNvbnRpbnVlOwomIzQzOwltYXBwaW5nX3NldF91cGRhdGUoJmFtcDt4YXMsIG1hcHBpbmcpOwogCi0JCQkvKiBBZGQgdGhlIG5ldyBmb2xpbyB0byB0aGUgcGFnZSBjYWNoZS4gKi8KLQkJCWlmIChuZXdfZm9saW8tJmd0O2luZGV4ICZsdDsgZW5kKSB7Ci0JCQkJX194YV9zdG9yZSgmYW1wO21hcHBpbmctJmd0O2lfcGFnZXMsIG5ld19mb2xpby0mZ3Q7aW5kZXgsCi0JCQkJCSAgIG5ld19mb2xpbywgMCk7Ci0JCQkJY29udGludWU7Ci0JCQl9CiYjNDM7CWlmIChzcGxpdF90eXBlID09IFNQTElUX1RZUEVfVU5JRk9STSkgewomIzQzOwkJaW50IG9sZF9vcmRlciA9IGZvbGlvX29yZGVyKGZvbGlvKTsKIAotCQkJVk1fV0FSTl9PTl9PTkNFKCFucl9zaG1lbV9kcm9wcGVkKTsKLQkJCS8qIERyb3AgZm9saW8gYmV5b25kIEVPRjogLSZndDtpbmRleCAmZ3Q7PSBlbmQgKi8KLQkJCWlmIChzaG1lbV9tYXBwaW5nKG1hcHBpbmcpICZhbXA7JmFtcDsgbnJfc2htZW1fZHJvcHBlZCkKLQkJCQkqbnJfc2htZW1fZHJvcHBlZCAmIzQzOz0gbnJfcGFnZXM7Ci0JCQllbHNlIGlmIChmb2xpb190ZXN0X2NsZWFyX2RpcnR5KG5ld19mb2xpbykpCi0JCQkJZm9saW9fYWNjb3VudF9jbGVhbmVkKAotCQkJCQluZXdfZm9saW8sIGlub2RlX3RvX3diKG1hcHBpbmctJmd0O2hvc3QpKTsKLQkJCV9fZmlsZW1hcF9yZW1vdmVfZm9saW8obmV3X2ZvbGlvLCBOVUxMKTsKLQkJCWZvbGlvX3B1dF9yZWZzKG5ld19mb2xpbywgbnJfcGFnZXMpOwomIzQzOwkJeGFzX3NldF9vcmRlcigmYW1wO3hhcywgZm9saW8tJmd0O2luZGV4LCBuZXdfb3JkZXIpOwomIzQzOwkJeGFzX3NwbGl0X2FsbG9jKCZhbXA7eGFzLCBmb2xpbywgb2xkX29yZGVyLCBnZnApOwomIzQzOwkJaWYgKHhhc19lcnJvcigmYW1wO3hhcykpIHsKJiM0MzsJCQlyZXQgPSB4YXNfZXJyb3IoJmFtcDt4YXMpOwomIzQzOwkJCWdvdG8gZmFpbF9mcmVlOwogCQl9CiYjNDM7CX0KIAotCQl6b25lX2RldmljZV9wcml2YXRlX3NwbGl0X2NiKGZvbGlvLCBOVUxMKTsKLQkJLyoKLQkJICogVW5mcmVlemUgQGZvbGlvIG9ubHkgYWZ0ZXIgYWxsIHBhZ2UgY2FjaGUgZW50cmllcywgd2hpY2gKLQkJICogdXNlZCB0byBwb2ludCB0byBpdCwgaGF2ZSBiZWVuIHVwZGF0ZWQgd2l0aCBuZXcgZm9saW9zLgotCQkgKiBPdGhlcndpc2UsIGEgcGFyYWxsZWwgZm9saW9fdHJ5X2dldCgpIGNhbiBncmFiIEBmb2xpbwotCQkgKiBhbmQgaXRzIGNhbGxlciBjYW4gc2VlIHN0YWxlIHBhZ2UgY2FjaGUgZW50cmllcy4KLQkJICovCi0JCWZvbGlvX3JlZl91bmZyZWV6ZShmb2xpbywgZm9saW9fY2FjaGVfcmVmX2NvdW50KGZvbGlvKSAmIzQzOyAxKTsKJiM0MzsJaV9tbWFwX2xvY2tfcmVhZChtYXBwaW5nKTsKJiM0MzsKJiM0MzsJLyogUmFjeSBjaGVjayBpZiB3ZSBjYW4gc3BsaXQgdGhlIHBhZ2UsIGJlZm9yZSB1bm1hcF9mb2xpbygpICovCiYjNDM7CWlmIChmb2xpb19leHBlY3RlZF9yZWZfY291bnQoZm9saW8pICE9IGZvbGlvX3JlZl9jb3VudChmb2xpbykgLSAxKSB7CiYjNDM7CQlyZXQgPSAtRUFHQUlOOwomIzQzOwkJZ290byBmYWlsX21tYXBfdW5sb2NrOwomIzQzOwl9CiYjNDM7CiYjNDM7CS8qCiYjNDM7CSAqX19zcGxpdF91bm1hcHBlZF9mb2xpbygpIG1heSBuZWVkIHRvIHRyaW0gb2ZmIHBhZ2VzIGJleW9uZAomIzQzOwkgKiBFT0Y6IGJ1dCBvbiAzMi1iaXQsIGlfc2l6ZV9yZWFkKCkgdGFrZXMgYW4gaXJxLXVuc2FmZQomIzQzOwkgKiBzZXFsb2NrLCB3aGljaCBjYW5ub3QgYmUgbmVzdGVkIGluc2lkZSB0aGUgcGFnZSB0cmVlIGxvY2suCiYjNDM7CSAqIFNvIG5vdGUgZW5kIG5vdzogaV9zaXplIGl0c2VsZiBtYXkgYmUgY2hhbmdlZCBhdCBhbnkgbW9tZW50LAomIzQzOwkgKiBidXQgZm9saW8gbG9jayBpcyBnb29kIGVub3VnaCB0byBzZXJpYWxpemUgdGhlIHRyaW1taW5nLgomIzQzOwkgKi8KJiM0MzsJZW5kID0gRElWX1JPVU5EX1VQKGlfc2l6ZV9yZWFkKG1hcHBpbmctJmd0O2hvc3QpLCBQQUdFX1NJWkUpOwomIzQzOwlpZiAoc2htZW1fbWFwcGluZyhtYXBwaW5nKSkKJiM0MzsJCWVuZCA9IHNobWVtX2ZhbGxvY2VuZChtYXBwaW5nLSZndDtob3N0LCBlbmQpOwomIzQzOwomIzQzOwl1bm1hcF9mb2xpbyhmb2xpbyk7CiYjNDM7CiYjNDM7CXhhc19sb2NrX2lycSgmYW1wO3hhcyk7CiYjNDM7CiYjNDM7CS8qCiYjNDM7CSAqIENoZWNrIGlmIHRoZSBmb2xpbyBpcyBwcmVzZW50IGluIHBhZ2UgY2FjaGUuCiYjNDM7CSAqIFdlIGFzc3VtZSBhbGwgdGFpbCBhcmUgcHJlc2VudCB0b28sIGlmIGZvbGlvIGlzIHRoZXJlLgomIzQzOwkgKi8KJiM0MzsJaWYgKHhhc19sb2FkKCZhbXA7eGFzKSAhPSBmb2xpbykgewomIzQzOwkJcmV0ID0gLUVBR0FJTjsKJiM0MzsJCWdvdG8gZmFpbDsKJiM0MzsJfQomIzQzOwomIzQzOwlpZiAoIWZvbGlvX3JlZl9mcmVlemUoZm9saW8sIG9sZF9ucl9wYWdlcyAmIzQzOyAxKSkgewomIzQzOwkJcmV0ID0gLUVBR0FJTjsKJiM0MzsJCWdvdG8gZmFpbDsKJiM0MzsJfQomIzQzOwomIzQzOwlpZiAoZm9saW9fdGVzdF9wbWRfbWFwcGFibGUoZm9saW8pICZhbXA7JmFtcDsgbmV3X29yZGVyICZsdDsgSFBBR0VfUE1EX09SREVSKSB7CiYjNDM7CQlpZiAoZm9saW9fdGVzdF9zd2FwYmFja2VkKGZvbGlvKSkKJiM0MzsJCQlscnV2ZWNfc3RhdF9tb2RfZm9saW8oZm9saW8sIE5SX1NITUVNX1RIUFMsIC1vbGRfbnJfcGFnZXMpOwomIzQzOwkJZWxzZQomIzQzOwkJCWxydXZlY19zdGF0X21vZF9mb2xpbyhmb2xpbywgTlJfRklMRV9USFBTLCAtb2xkX25yX3BhZ2VzKTsKJiM0MzsJfQomIzQzOwomIzQzOwkvKiBsb2NrIGxydSBsaXN0L1BhZ2VDb21wb3VuZCwgcmVmIGZyb3plbiBieSBwYWdlX3JlZl9mcmVlemUgKi8KJiM0MzsJaWYgKGRvX2xydSkKJiM0MzsJCWxydXZlYyA9IGZvbGlvX2xydXZlY19sb2NrKGZvbGlvKTsKJiM0MzsKJiM0MzsJcmV0ID0gX19zcGxpdF91bm1hcHBlZF9mb2xpbyhmb2xpbywgbmV3X29yZGVyLCBzcGxpdF9hdCwgJmFtcDt4YXMsCiYjNDM7CQkJCSAgICAgbWFwcGluZywgc3BsaXRfdHlwZSk7CiYjNDM7CiYjNDM7CS8qCiYjNDM7CSAqIFVuZnJlZXplIGFmdGVyLXNwbGl0IGZvbGlvcyBhbmQgcHV0IHRoZW0gYmFjayB0byB0aGUgcmlnaHQKJiM0MzsJICogbGlzdC4gQGZvbGlvIHNob3VsZCBiZSBrZXB0IGZyb3plbiB1bnRpbCBwYWdlIGNhY2hlCiYjNDM7CSAqIGVudHJpZXMgYXJlIHVwZGF0ZWQgd2l0aCBhbGwgdGhlIG90aGVyIGFmdGVyLXNwbGl0IGZvbGlvcwomIzQzOwkgKiB0byBwcmV2ZW50IG90aGVycyBzZWVpbmcgc3RhbGUgcGFnZSBjYWNoZSBlbnRyaWVzLgomIzQzOwkgKiBBcyBhIHJlc3VsdCwgbmV3X2ZvbGlvIHN0YXJ0cyBmcm9tIHRoZSBuZXh0IGZvbGlvIG9mCiYjNDM7CSAqIEBmb2xpby4KJiM0MzsJICovCiYjNDM7CWZvciAobmV3X2ZvbGlvID0gZm9saW9fbmV4dChmb2xpbyk7IG5ld19mb2xpbyAhPSBlbmRfZm9saW87CiYjNDM7CSAgICAgbmV3X2ZvbGlvID0gbmV4dCkgewomIzQzOwkJdW5zaWduZWQgbG9uZyBucl9wYWdlcyA9IGZvbGlvX25yX3BhZ2VzKG5ld19mb2xpbyk7CiYjNDM7CiYjNDM7CQluZXh0ID0gZm9saW9fbmV4dChuZXdfZm9saW8pOwomIzQzOwomIzQzOwkJZm9saW9fcmVmX3VuZnJlZXplKG5ld19mb2xpbywKJiM0MzsJCQkJICAgZm9saW9fbnJfcGFnZXMobmV3X2ZvbGlvKSAmIzQzOyAxKTsKIAogCQlpZiAoZG9fbHJ1KQotCQkJbHJ1dmVjX3VubG9jayhscnV2ZWMpOwomIzQzOwkJCWxydV9hZGRfc3BsaXRfZm9saW8oZm9saW8sIG5ld19mb2xpbywgbHJ1dmVjLCBsaXN0KTsKIAotCQlpZiAoY2kpCi0JCQlzd2FwX2NsdXN0ZXJfdW5sb2NrKGNpKTsKLQl9IGVsc2UgewotCQlpZiAoZGVxdWV1ZV9kZWZlcnJlZCkgewotCQkJbGlzdF9scnVfdW5sb2NrKGxydSk7Ci0JCQlyY3VfcmVhZF91bmxvY2soKTsKJiM0MzsJCS8qIEFkZCB0aGUgbmV3IGZvbGlvIHRvIHRoZSBwYWdlIGNhY2hlLiAqLwomIzQzOwkJaWYgKG5ld19mb2xpby0mZ3Q7aW5kZXggJmx0OyBlbmQpIHsKJiM0MzsJCQlfX3hhX3N0b3JlKCZhbXA7bWFwcGluZy0mZ3Q7aV9wYWdlcywgbmV3X2ZvbGlvLSZndDtpbmRleCwKJiM0MzsJCQkJICAgbmV3X2ZvbGlvLCAwKTsKJiM0MzsJCQljb250aW51ZTsKIAkJfQotCQlyZXR1cm4gLUVBR0FJTjsKJiM0MzsKJiM0MzsJCS8qIERyb3AgZm9saW8gYmV5b25kIEVPRjogLSZndDtpbmRleCAmZ3Q7PSBlbmQgKi8KJiM0MzsJCWlmIChzaG1lbV9tYXBwaW5nKG1hcHBpbmcpKQomIzQzOwkJCW5yX3NobWVtX2Ryb3BwZWQgJiM0Mzs9IG5yX3BhZ2VzOwomIzQzOwkJZWxzZSBpZiAoZm9saW9fdGVzdF9jbGVhcl9kaXJ0eShuZXdfZm9saW8pKQomIzQzOwkJCWZvbGlvX2FjY291bnRfY2xlYW5lZChuZXdfZm9saW8sCiYjNDM7CQkJCQkgICAgICBpbm9kZV90b193YihtYXBwaW5nLSZndDtob3N0KSk7CiYjNDM7CQlfX2ZpbGVtYXBfcmVtb3ZlX2ZvbGlvKG5ld19mb2xpbywgTlVMTCk7CiYjNDM7CQlmb2xpb19wdXRfcmVmcyhuZXdfZm9saW8sIG5yX3BhZ2VzKTsKIAl9CiAKJiM0MzsJLyoKJiM0MzsJICogVW5mcmVlemUgQGZvbGlvIG9ubHkgYWZ0ZXIgYWxsIHBhZ2UgY2FjaGUgZW50cmllcywgd2hpY2gKJiM0MzsJICogdXNlZCB0byBwb2ludCB0byBpdCwgaGF2ZSBiZWVuIHVwZGF0ZWQgd2l0aCBuZXcgZm9saW9zLgomIzQzOwkgKiBPdGhlcndpc2UsIGEgcGFyYWxsZWwgZm9saW9fdHJ5X2dldCgpIGNhbiBncmFiIEBmb2xpbwomIzQzOwkgKiBhbmQgaXRzIGNhbGxlciBjYW4gc2VlIHN0YWxlIHBhZ2UgY2FjaGUgZW50cmllcy4KJiM0MzsJICovCiYjNDM7CWZvbGlvX3JlZl91bmZyZWV6ZShmb2xpbywgZm9saW9fbnJfcGFnZXMoZm9saW8pICYjNDM7IDEpOwomIzQzOwomIzQzOwlpZiAoZG9fbHJ1KQomIzQzOwkJbHJ1dmVjX3VubG9jayhscnV2ZWMpOwomIzQzOwomIzQzO2ZhaWw6CiYjNDM7CXhhc191bmxvY2tfaXJxKCZhbXA7eGFzKTsKJiM0MztmYWlsX21tYXBfdW5sb2NrOgomIzQzOwlpZiAobnJfc2htZW1fZHJvcHBlZCkKJiM0MzsJCXNobWVtX3VuY2hhcmdlKG1hcHBpbmctJmd0O2hvc3QsIG5yX3NobWVtX2Ryb3BwZWQpOwomIzQzOwkvKgomIzQzOwkgKiBEcm9wIHRoZSBtYXBwaW5nIHdoaWxlIHRoZSBpbm9kZSBpcyBzdGlsbCBwaW5uZWQuIEBmb2xpbyBzdGF5cwomIzQzOwkgKiBsb2NrZWQgYW5kIHByZXNlbnQgaW4gdGhlIHBhZ2UgY2FjaGUsIHNvIGV2aWN0aW9uIGNhbm5vdCBmcmVlCiYjNDM7CSAqIHRoZSBpbm9kZSB5ZXQsIG5vdGhpbmcgcGFzdCB0aGlzIHBvaW50IG1heSB0b3VjaCB0aGUgaW5vZGUgb3IKJiM0MzsJICogdGhlIG1hcHBpbmcuCiYjNDM7CSAqLwomIzQzOwlpX21tYXBfdW5sb2NrX3JlYWQobWFwcGluZyk7CiYjNDM7ZmFpbF9mcmVlOgomIzQzOwkvKiBSZXN0b3JlIHRoZSBwcmV2aW91c2x5IGFjdGl2ZSBtZW1jZyAqLwomIzQzOwlzZXRfYWN0aXZlX21lbWNnKG9sZF9tZW1jZyk7CiYjNDM7CW1lbV9jZ3JvdXBfcHV0KG1lbWNnKTsKJiM0MzsJeGFzX2Rlc3Ryb3koJmFtcDt4YXMpOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTQxMDIsMTcgJiM0Mzs0MjQ4LDExIEBAIHN0YXRpYyBpbnQgX19mb2xpb19zcGxpdChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyLAogCQlzdHJ1Y3QgcGFnZSAqc3BsaXRfYXQsIHN0cnVjdCBwYWdlICpsb2NrX2F0LAogCQlzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LCBlbnVtIHNwbGl0X3R5cGUgc3BsaXRfdHlwZSkKIHsKLQlYQV9TVEFURSh4YXMsICZhbXA7Zm9saW8tJmd0O21hcHBpbmctJmd0O2lfcGFnZXMsIGZvbGlvLSZndDtpbmRleCk7CiYjNDM7CWJvb2wgaXNfc3dhcGNhY2hlID0gZm9saW9fdGVzdF9zd2FwY2FjaGUoZm9saW8pOwogCXN0cnVjdCBmb2xpbyAqZW5kX2ZvbGlvID0gZm9saW9fbmV4dChmb2xpbyk7CiAJYm9vbCBpc19hbm9uID0gZm9saW9fdGVzdF9hbm9uKGZvbGlvKTsKLQlzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csICpvbGRfbWVtY2c7Ci0Jc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSBOVUxMOwotCXN0cnVjdCBhbm9uX3ZtYSAqYW5vbl92bWEgPSBOVUxMOwogCWludCBvbGRfb3JkZXIgPSBmb2xpb19vcmRlcihmb2xpbyk7CiAJc3RydWN0IGZvbGlvICpuZXdfZm9saW8sICpuZXh0OwotCWludCBucl9zaG1lbV9kcm9wcGVkID0gMDsKLQllbnVtIHR0dV9mbGFncyB0dHVfZmxhZ3MgPSAwOwotCXBnb2ZmX3QgZW5kID0gMDsKIAlpbnQgcmV0OwogCiAJVk1fV0FSTl9PTl9PTkNFX0ZPTElPKCFmb2xpb190ZXN0X2xvY2tlZChmb2xpbyksIGZvbGlvKTsKQEAgLTQxMjAsMTQxICYjNDM7NDI2MCwyOSBAQCBzdGF0aWMgaW50IF9fZm9saW9fc3BsaXQoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlciwKIAogCWlmIChmb2xpbyAhPSBwYWdlX2ZvbGlvKHNwbGl0X2F0KSB8fCBmb2xpbyAhPSBwYWdlX2ZvbGlvKGxvY2tfYXQpKSB7CiAJCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gb3V0X25vX21lbWNnOwomIzQzOwkJZ290byBvdXQ7CiAJfQogCiAJaWYgKG5ld19vcmRlciAmZ3Q7PSBvbGRfb3JkZXIpIHsKIAkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBvdXRfbm9fbWVtY2c7CiYjNDM7CQlnb3RvIG91dDsKIAl9CiAKIAlyZXQgPSBmb2xpb19jaGVja19zcGxpdHRhYmxlKGZvbGlvLCBuZXdfb3JkZXIsIHNwbGl0X3R5cGUpOwogCWlmIChyZXQpIHsKIAkJVk1fV0FSTl9PTkNFKHJldCA9PSAtRUlOVkFMLCAmIzM0O1RyaWVkIHRvIHNwbGl0IGFuIHVuc3BsaXR0YWJsZSBmb2xpbyYjMzQ7KTsKLQkJZ290byBvdXRfbm9fbWVtY2c7Ci0JfQotCi0JLyoKLQkgKiBzd2l0Y2ggdG8gZm9saW8mIzM5O3MgbWVtY2cgYXMgeGFycmF5IG5vZGUgYWxsb2NhdGlvbiBjYW4gaGFwcGVuIGFuZAotCSAqIG5lZWRzIHRvIGNoYXJnZSB0byBpdC4KLQkgKi8KLQltZW1jZyA9IGdldF9tZW1fY2dyb3VwX2Zyb21fZm9saW8oZm9saW8pOwotCW9sZF9tZW1jZyA9IHNldF9hY3RpdmVfbWVtY2cobWVtY2cpOwotCi0JaWYgKGlzX2Fub24pIHsKLQkJLyoKLQkJICogVGhlIGNhbGxlciBkb2VzIG5vdCBuZWNlc3NhcmlseSBob2xkIGFuIG1tYXBfbG9jayB0aGF0IHdvdWxkCi0JCSAqIHByZXZlbnQgdGhlIGFub25fdm1hIGRpc2FwcGVhcmluZyBzbyB3ZSBmaXJzdCB3ZSB0YWtlIGEKLQkJICogcmVmZXJlbmNlIHRvIGl0IGFuZCB0aGVuIGxvY2sgdGhlIGFub25fdm1hIGZvciB3cml0ZS4gVGhpcwotCQkgKiBpcyBzaW1pbGFyIHRvIGZvbGlvX2xvY2tfYW5vbl92bWFfcmVhZCBleGNlcHQgdGhlIHdyaXRlIGxvY2sKLQkJICogaXMgdGFrZW4gdG8gc2VyaWFsaXNlIGFnYWluc3QgcGFyYWxsZWwgc3BsaXQgb3IgY29sbGFwc2UKLQkJICogb3BlcmF0aW9ucy4KLQkJICovCi0JCWFub25fdm1hID0gZm9saW9fZ2V0X2Fub25fdm1hKGZvbGlvKTsKLQkJaWYgKCFhbm9uX3ZtYSkgewotCQkJcmV0ID0gLUVCVVNZOwotCQkJZ290byBvdXQ7Ci0JCX0KLQkJYW5vbl92bWFfbG9ja193cml0ZShhbm9uX3ZtYSk7Ci0JCW1hcHBpbmcgPSBOVUxMOwotCX0gZWxzZSB7Ci0JCXVuc2lnbmVkIGludCBtaW5fb3JkZXI7Ci0JCWdmcF90IGdmcDsKLQotCQltYXBwaW5nID0gZm9saW8tJmd0O21hcHBpbmc7Ci0JCW1pbl9vcmRlciA9IG1hcHBpbmdfbWluX2ZvbGlvX29yZGVyKG1hcHBpbmcpOwotCQlpZiAobmV3X29yZGVyICZsdDsgbWluX29yZGVyKSB7Ci0JCQlyZXQgPSAtRUlOVkFMOwotCQkJZ290byBvdXQ7Ci0JCX0KLQotCQlnZnAgPSBjdXJyZW50X2dmcF9jb250ZXh0KG1hcHBpbmdfZ2ZwX21hc2sobWFwcGluZykgJmFtcDsKLQkJCQkJCQlHRlBfUkVDTEFJTV9NQVNLKTsKLQotCQlpZiAoIWZpbGVtYXBfcmVsZWFzZV9mb2xpbyhmb2xpbywgZ2ZwKSkgewotCQkJcmV0ID0gLUVCVVNZOwotCQkJZ290byBvdXQ7Ci0JCX0KLQotCQltYXBwaW5nX3NldF91cGRhdGUoJmFtcDt4YXMsIG1hcHBpbmcpOwotCi0JCWlmIChzcGxpdF90eXBlID09IFNQTElUX1RZUEVfVU5JRk9STSkgewotCQkJeGFzX3NldF9vcmRlcigmYW1wO3hhcywgZm9saW8tJmd0O2luZGV4LCBuZXdfb3JkZXIpOwotCQkJeGFzX3NwbGl0X2FsbG9jKCZhbXA7eGFzLCBmb2xpbywgb2xkX29yZGVyLCBnZnApOwotCQkJaWYgKHhhc19lcnJvcigmYW1wO3hhcykpIHsKLQkJCQlyZXQgPSB4YXNfZXJyb3IoJmFtcDt4YXMpOwotCQkJCWdvdG8gb3V0OwotCQkJfQotCQl9Ci0KLQkJYW5vbl92bWEgPSBOVUxMOwotCQlpX21tYXBfbG9ja19yZWFkKG1hcHBpbmcpOwotCi0JCS8qCi0JCSAqX19zcGxpdF91bm1hcHBlZF9mb2xpbygpIG1heSBuZWVkIHRvIHRyaW0gb2ZmIHBhZ2VzIGJleW9uZAotCQkgKiBFT0Y6IGJ1dCBvbiAzMi1iaXQsIGlfc2l6ZV9yZWFkKCkgdGFrZXMgYW4gaXJxLXVuc2FmZQotCQkgKiBzZXFsb2NrLCB3aGljaCBjYW5ub3QgYmUgbmVzdGVkIGluc2lkZSB0aGUgcGFnZSB0cmVlIGxvY2suCi0JCSAqIFNvIG5vdGUgZW5kIG5vdzogaV9zaXplIGl0c2VsZiBtYXkgYmUgY2hhbmdlZCBhdCBhbnkgbW9tZW50LAotCQkgKiBidXQgZm9saW8gbG9jayBpcyBnb29kIGVub3VnaCB0byBzZXJpYWxpemUgdGhlIHRyaW1taW5nLgotCQkgKi8KLQkJZW5kID0gRElWX1JPVU5EX1VQKGlfc2l6ZV9yZWFkKG1hcHBpbmctJmd0O2hvc3QpLCBQQUdFX1NJWkUpOwotCQlpZiAoc2htZW1fbWFwcGluZyhtYXBwaW5nKSkKLQkJCWVuZCA9IHNobWVtX2ZhbGxvY2VuZChtYXBwaW5nLSZndDtob3N0LCBlbmQpOwotCX0KLQotCS8qCi0JICogUmFjeSBjaGVjayBpZiB3ZSBjYW4gc3BsaXQgdGhlIHBhZ2UsIGJlZm9yZSB1bm1hcF9mb2xpbygpIHdpbGwKLQkgKiBzcGxpdCBQTURzCi0JICovCi0JaWYgKGZvbGlvX2V4cGVjdGVkX3JlZl9jb3VudChmb2xpbykgIT0gZm9saW9fcmVmX2NvdW50KGZvbGlvKSAtIDEpIHsKLQkJcmV0ID0gLUVBR0FJTjsKLQkJZ290byBvdXRfdW5sb2NrOwotCX0KLQotCXVubWFwX2ZvbGlvKGZvbGlvKTsKLQotCS8qIGJsb2NrIGludGVycnVwdCByZWVudHJ5IGluIHhhX2xvY2sgYW5kIHNwaW5sb2NrICovCi0JbG9jYWxfaXJxX2Rpc2FibGUoKTsKLQlpZiAobWFwcGluZykgewotCQkvKgotCQkgKiBDaGVjayBpZiB0aGUgZm9saW8gaXMgcHJlc2VudCBpbiBwYWdlIGNhY2hlLgotCQkgKiBXZSBhc3N1bWUgYWxsIHRhaWwgYXJlIHByZXNlbnQgdG9vLCBpZiBmb2xpbyBpcyB0aGVyZS4KLQkJICovCi0JCXhhc19sb2NrKCZhbXA7eGFzKTsKLQkJeGFzX3Jlc2V0KCZhbXA7eGFzKTsKLQkJaWYgKHhhc19sb2FkKCZhbXA7eGFzKSAhPSBmb2xpbykgewotCQkJcmV0ID0gLUVBR0FJTjsKLQkJCWdvdG8gZmFpbDsKLQkJfQomIzQzOwkJZ290byBvdXQ7CiAJfQogCi0JcmV0ID0gX19mb2xpb19mcmVlemVfYW5kX3NwbGl0X3VubWFwcGVkKGZvbGlvLCBuZXdfb3JkZXIsIHNwbGl0X2F0LCAmYW1wO3hhcywgbWFwcGluZywKLQkJCQkJCXRydWUsIGxpc3QsIHNwbGl0X3R5cGUsIGVuZCwgJmFtcDtucl9zaG1lbV9kcm9wcGVkKTsKLWZhaWw6Ci0JaWYgKG1hcHBpbmcpCi0JCXhhc191bmxvY2soJmFtcDt4YXMpOwotCi0JbG9jYWxfaXJxX2VuYWJsZSgpOwotCi0JaWYgKG5yX3NobWVtX2Ryb3BwZWQpCi0JCXNobWVtX3VuY2hhcmdlKG1hcHBpbmctJmd0O2hvc3QsIG5yX3NobWVtX2Ryb3BwZWQpOwotCi0JaWYgKCFyZXQgJmFtcDsmYW1wOyBpc19hbm9uICZhbXA7JmFtcDsgIWZvbGlvX2lzX2RldmljZV9wcml2YXRlKGZvbGlvKSkKLQkJdHR1X2ZsYWdzID0gVFRVX1VTRV9TSEFSRURfWkVST1BBR0U7Ci0KLQlyZW1hcF9wYWdlKGZvbGlvLCAxICZsdDsmbHQ7IG9sZF9vcmRlciwgdHR1X2ZsYWdzKTsKLQotCS8qCi0JICogRHJvcCB0aGUgbWFwcGluZyB3aGlsZSB0aGUgaW5vZGUgaXMgc3RpbGwgcGlubmVkLiBAZm9saW8gc3RheXMKLQkgKiBsb2NrZWQgYW5kIHByZXNlbnQgaW4gdGhlIHBhZ2UgY2FjaGUgdW50aWwgdGhlIGxvb3AgYmVsb3csIHNvCi0JICogZXZpY3Rpb24gY2Fubm90IGZyZWUgdGhlIGlub2RlIHlldDsgQGxvY2tfYXQgaXMgbm90IGVub3VnaCwgaXQgbWF5Ci0JICogYmUgYSB0YWlsIGJleW9uZCBFT0YgdGhhdCB0aGUgc3BsaXQgYWxyZWFkeSBkcm9wcGVkIGZyb20gdGhlIHBhZ2UKLQkgKiBjYWNoZS4gTm90aGluZyBwYXN0IHRoaXMgcG9pbnQgbWF5IHRvdWNoIHRoZSBpbm9kZSBvciB0aGUgbWFwcGluZy4KLQkgKi8KLQlpZiAobWFwcGluZykgewotCQlpX21tYXBfdW5sb2NrX3JlYWQobWFwcGluZyk7Ci0JCW1hcHBpbmcgPSBOVUxMOwotCX0KJiM0MzsJaWYgKGlzX2Fub24pCiYjNDM7CQlyZXQgPSBfX2ZvbGlvX2ZyZWV6ZV9zcGxpdF91bm1hcChmb2xpbywgbmV3X29yZGVyLCBzcGxpdF9hdCwgdHJ1ZSwKJiM0MzsJCQkJCQkgdHJ1ZSwgbGlzdCwgc3BsaXRfdHlwZSk7CiYjNDM7CWVsc2UgaWYgKGlzX3N3YXBjYWNoZSkKJiM0MzsJCXJldCA9IF9fZm9saW9fZnJlZXplX3NwbGl0X3VubWFwKGZvbGlvLCBuZXdfb3JkZXIsIHNwbGl0X2F0LCB0cnVlLAomIzQzOwkJCQkJCSBmYWxzZSwgbGlzdCwgc3BsaXRfdHlwZSk7CiYjNDM7CWVsc2UKJiM0MzsJCXJldCA9IF9fZm9saW9fZnJlZXplX3NwbGl0X3VubWFwX2ZpbGUoZm9saW8sIG5ld19vcmRlciwgc3BsaXRfYXQsCiYjNDM7CQkJCQkJICAgICAgdHJ1ZSwgbGlzdCwgc3BsaXRfdHlwZSk7CiAKIAkvKgogCSAqIFVubG9jayBhbGwgYWZ0ZXItc3BsaXQgZm9saW9zIGV4Y2VwdCB0aGUgb25lIGNvbnRhaW5pbmcKQEAgLTQyNjUsMjkgJiM0Mzs0MjkzLDE5IEBAIHN0YXRpYyBpbnQgX19mb2xpb19zcGxpdChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyLAogCQlpZiAobmV3X2ZvbGlvID09IHBhZ2VfZm9saW8obG9ja19hdCkpCiAJCQljb250aW51ZTsKIAotCQlmb2xpb191bmxvY2sobmV3X2ZvbGlvKTsKIAkJLyoKIAkJICogU3VicGFnZXMgd2hvc2UgbWFwcGluZyBoYXMgYmVlbiB6YXBwZWQgbWF5IGJlIGZyZWVkCiAJCSAqIGVhcmxpZXIsIGJ1dCBmcmVlaW5nIHRoZW0gcmVxdWlyZXMgdGFraW5nIHRoZQogCQkgKiBscnVfbG9jaywgc28gd2UgZGVmZXIgcHV0X3BhZ2UoKSBvbiB0YWlsIHBhZ2VzIHVudGlsCiAJCSAqIGFmdGVyIHRoZSBzcGxpdCBjb21wbGV0ZXMuCiAJCSAqLwotCQlmcmVlX2ZvbGlvX2FuZF9zd2FwX2NhY2hlKG5ld19mb2xpbyk7CiYjNDM7CQlpZiAoaXNfc3dhcGNhY2hlKQomIzQzOwkJCWZvbGlvX2ZyZWVfc3dhcChuZXdfZm9saW8pOwomIzQzOwkJZm9saW9fdW5sb2NrKG5ld19mb2xpbyk7CiYjNDM7CQlmb2xpb19wdXQobmV3X2ZvbGlvKTsKIAl9CiAKLW91dF91bmxvY2s6Ci0JaWYgKGFub25fdm1hKSB7Ci0JCWFub25fdm1hX3VubG9ja193cml0ZShhbm9uX3ZtYSk7Ci0JCXB1dF9hbm9uX3ZtYShhbm9uX3ZtYSk7Ci0JfQotCWlmIChtYXBwaW5nKQotCQlpX21tYXBfdW5sb2NrX3JlYWQobWFwcGluZyk7CiBvdXQ6Ci0JLyogcmVzdG9yZSB0byBjYWxsZXImIzM5O3Mgb2xkX21lbWNnICovCi0Jc2V0X2FjdGl2ZV9tZW1jZyhvbGRfbWVtY2cpOwotCW1lbV9jZ3JvdXBfcHV0KG1lbWNnKTsKLW91dF9ub19tZW1jZzoKLQl4YXNfZGVzdHJveSgmYW1wO3hhcyk7CiAJaWYgKGlzX3BtZF9vcmRlcihvbGRfb3JkZXIpKQogCQljb3VudF92bV9ldmVudCghcmV0ID8gVEhQX1NQTElUX1BBR0UgOiBUSFBfU1BMSVRfUEFHRV9GQUlMRUQpOwogCWNvdW50X210aHBfc3RhdChvbGRfb3JkZXIsICFyZXQgPyBNVEhQX1NUQVRfU1BMSVQgOiBNVEhQX1NUQVRfU1BMSVRfRkFJTEVEKTsKQEAgLTQzMTgsMjIgJiM0Mzs0MzM2LDEzIEBAIHN0YXRpYyBpbnQgX19mb2xpb19zcGxpdChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyLAogICovCiBpbnQgZm9saW9fc3BsaXRfdW5tYXBwZWQoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlcikKIHsKLQlpbnQgcmV0ID0gMDsKLQogCVZNX1dBUk5fT05fT05DRV9GT0xJTyhmb2xpb19tYXBwZWQoZm9saW8pLCBmb2xpbyk7CiAJVk1fV0FSTl9PTl9PTkNFX0ZPTElPKCFmb2xpb190ZXN0X2xvY2tlZChmb2xpbyksIGZvbGlvKTsKIAlWTV9XQVJOX09OX09OQ0VfRk9MSU8oIWZvbGlvX3Rlc3RfbGFyZ2UoZm9saW8pLCBmb2xpbyk7CiAJVk1fV0FSTl9PTl9PTkNFX0ZPTElPKCFmb2xpb190ZXN0X2Fub24oZm9saW8pLCBmb2xpbyk7CiAKLQlpZiAoZm9saW9fZXhwZWN0ZWRfcmVmX2NvdW50KGZvbGlvKSAhPSBmb2xpb19yZWZfY291bnQoZm9saW8pIC0gMSkKLQkJcmV0dXJuIC1FQUdBSU47Ci0KLQlsb2NhbF9pcnFfZGlzYWJsZSgpOwotCXJldCA9IF9fZm9saW9fZnJlZXplX2FuZF9zcGxpdF91bm1hcHBlZChmb2xpbywgbmV3X29yZGVyLCAmYW1wO2ZvbGlvLSZndDtwYWdlLCBOVUxMLAotCQkJCQkJTlVMTCwgZmFsc2UsIE5VTEwsIFNQTElUX1RZUEVfVU5JRk9STSwKLQkJCQkJCTAsIE5VTEwpOwotCWxvY2FsX2lycV9lbmFibGUoKTsKLQlyZXR1cm4gcmV0OwomIzQzOwlyZXR1cm4gX19mb2xpb19mcmVlemVfc3BsaXRfdW5tYXAoZm9saW8sIG5ld19vcmRlciwgJmFtcDtmb2xpby0mZ3Q7cGFnZSwgZmFsc2UsCiYjNDM7CQkJCQkgIGZhbHNlLCBOVUxMLCBTUExJVF9UWVBFX1VOSUZPUk0pOwogfQogCiAvKgpAQCAtNDM1MiwxMSAmIzQzOzQzNjEsMTEgQEAgaW50IGZvbGlvX3NwbGl0X3VubWFwcGVkKHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIpCiAgKiAgICBHVVAgcGlucywgd2lsbCByZXN1bHQgaW4gdGhlIGZvbGlvIG5vdCBnZXR0aW5nIHNwbGl0OyBpbnN0ZWFkLCB0aGUgY2FsbGVyCiAgKiAgICB3aWxsIHJlY2VpdmUgYW4gLUVBR0FJTi4KICAqCi0gKiA0KSBAbmV3X29yZGVyICZndDsgMSwgdXN1YWxseS4gU3BsaXR0aW5nIHRvIG9yZGVyLTEgYW5vbnltb3VzIGZvbGlvcyBpcyBub3QKLSAqICAgIHN1cHBvcnRlZCBmb3Igbm9uLWZpbGUtYmFja2VkIGZvbGlvcywgYmVjYXVzZSBmb2xpby0mZ3Q7X2RlZmVycmVkX2xpc3QsIHdoaWNoCi0gKiAgICBpcyB1c2VkIGJ5IHBhcnRpYWxseSBtYXBwZWQgZm9saW9zLCBpcyBzdG9yZWQgaW4gc3VicGFnZSAyLCBidXQgYW4gb3JkZXItMQotICogICAgZm9saW8gb25seSBoYXMgc3VicGFnZXMgMCBhbmQgMS4gRmlsZS1iYWNrZWQgb3JkZXItMSBmb2xpb3MgYXJlIHN1cHBvcnRlZCwKLSAqICAgIHNpbmNlIHRoZXkgZG8gbm90IHVzZSBfZGVmZXJyZWRfbGlzdC4KJiM0MzsgKiA0KSBAbmV3X29yZGVyICZndDsgMSwgdXN1YWxseS4gT3JkZXItMSBpcyBub3Qgc3VwcG9ydGVkIGZvciBhbm9uIG9yIHN3YXBjYWNoZQomIzQzOyAqICAgIGZvbGlvczogYW5vbiBmb2xpb3MgbmVlZCBzdWJwYWdlIDIgZm9yIF9kZWZlcnJlZF9saXN0LCB3aGljaCBvcmRlci0xCiYjNDM7ICogICAgZm9saW9zIGxhY2ssIGFuZCBhIHN3YXBjYWNoZSBmb2xpbyBtYXkgYmVjb21lIGFub24gb25jZSBmYXVsdGVkIGluLgomIzQzOyAqICAgIEZpbGUtYmFja2VkIG9yZGVyLTEgZm9saW9zIGFyZSBzdXBwb3J0ZWQsIHNpbmNlIHRoZXkgZG8gbm90IHVzZQomIzQzOyAqICAgIF9kZWZlcnJlZF9saXN0LgogICoKICAqIEFmdGVyIHNwbGl0dGluZywgdGhlIGNhbGxlciYjMzk7cyBmb2xpbyByZWZlcmVuY2Ugd2lsbCBiZSB0cmFuc2ZlcnJlZCB0byBAcGFnZSwKICAqIHJlc3VsdGluZyBpbiBhIHJhaXNlZCByZWZjb3VudCBvZiBAcGFnZSBhZnRlciB0aGlzIGNhbGwuIFRoZSBvdGhlciBwYWdlcyBtYXkKZGlmZiAtLWdpdCBhL21tL3N3YXBfc3RhdGUuYyBiL21tL3N3YXBfc3RhdGUuYwppbmRleCA1YmU4MjU5MTFlNjQ1Li5mMTQwNWU1YjgxM2VlIDEwMDY0NAotLS0gYS9tbS9zd2FwX3N0YXRlLmMKJiM0MzsmIzQzOyYjNDM7IGIvbW0vc3dhcF9zdGF0ZS5jCkBAIC0zODgsOCAmIzQzOzM4OCw5IEBAIHZvaWQgX19zd2FwX2NhY2hlX3JlcGxhY2VfZm9saW8oc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSwKIAkgICAgZm9saW9fb3JkZXIob2xkKSAhPSBmb2xpb19vcmRlcihuZXcpKSB7CiAJCWNpX29mZiA9IHN3cF9jbHVzdGVyX29mZnNldChvbGQtJmd0O3N3YXApOwogCQljaV9lbmQgPSBjaV9vZmYgJiM0MzsgZm9saW9fbnJfcGFnZXMob2xkKTsKLQkJd2hpbGUgKGNpX29mZiYjNDM7JiM0MzsgJmx0OyBjaV9lbmQpCiYjNDM7CQlkbyB7CiAJCQlXQVJOX09OX09OQ0Uoc3dwX3RiX3RvX2ZvbGlvKF9fc3dhcF90YWJsZV9nZXQoY2ksIGNpX29mZikpICE9IG9sZCk7CiYjNDM7CQl9IHdoaWxlICgmIzQzOyYjNDM7Y2lfb2ZmICZsdDsgY2lfZW5kKTsKIAl9CiB9CiAKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+My8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDcgMjE6NTQ8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTE0MTkKCQkJCQkJCW91dHB1dDogMzIKCQkJCQkJCXRob3VnaHRzOiAzNTcKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIHRoZSBGb2xpbyBTcGxpdHRpbmcgUGF0Y2gqKgoKQWxyaWdodCwgbGV0JiMzOTtzIGJyZWFrIGRvd24gdGhpcyBwYXRjaC4gSSBzZWUgbW9kaWZpY2F0aW9ucyB0b3VjaGluZyBgbW0vaHVnZV9tZW1vcnkuY2AgYW5kIGBtbS9zd2FwX3N0YXRlLmNgLiBJdCYjMzk7cyBjbGVhcmx5IGEgY29yZSBtZW1vcnkgbWFuYWdlbWVudCBjaGFuZ2UsIHNwZWNpZmljYWxseSByZWxhdGVkIHRvIGhvdyB3ZSBoYW5kbGUgZm9saW8gc3BsaXR0aW5nLCBwYXJ0aWN1bGFybHkgYXJvdW5kIGh1Z2UgcGFnZXMuIFRoZSBmYWN0IHRoYXQgaXQgcmV3b3JrcyB0aGUgc3BsaXR0aW5nIG9mIHVubWFwcGVkIGZvbGlvcyDigJMgYW5kLCBjcml0aWNhbGx5LCBkaXN0aW5ndWlzaGVzIGJldHdlZW4gYW5vbnltb3VzLCBzd2FwY2FjaGUsIGFuZCBmaWxlLWJhY2tlZCBmb2xpb3Mg4oCTIGltbWVkaWF0ZWx5IHRlbGxzIG1lIHRoaXMgaGFzIGZ1bmN0aW9uYWwgaW1wbGljYXRpb25zIHdlIG5lZWQgdG8gcmVhbGx5IGRpZyBpbnRvLiBEZWZpbml0ZWx5IGZ1enppbmcgbWF0ZXJpYWwuCgpJJiMzOTttIHNlZWluZyB0aGF0IGBfX2ZvbGlvX2ZyZWV6ZV9zcGxpdF91bm1hcGAgYW5kIGBfX2ZvbGlvX2ZyZWV6ZV9zcGxpdF91bm1hcF9maWxlYCBoYXZlIGJlZW4gaW50cm9kdWNlZCB0byByZXBsYWNlIGBfX2ZvbGlvX2ZyZWV6ZV9hbmRfc3BsaXRfdW5tYXBwZWRgLCB3aGljaCBpcyBhIHN0cm9uZyBpbmRpY2F0b3Igb2YgcmVmaW5lZCBsb2dpYyBoZXJlLiBUaGVyZSYjMzk7cyBhbHNvIHNvbWUgc3VidGxlIGJlaGF2aW9yIGNoYW5nZXMgaW4gYGZvbGlvX2NoZWNrX3NwbGl0dGFibGVgIHdoZW4gaXQgY29tZXMgdG8gc3dhcGNhY2hlIGZvbGlvcy4gVGhlIGNvcmUgb2YgdGhpcyBzZWVtcyB0byBiZSBkcml2ZW4gYnkgbW9kaWZpY2F0aW9ucyB0byB0aGUgYF9fZm9saW9fc3BsaXRgIGZ1bmN0aW9uLCB3aGljaCBub3cgY2FsbHMgdGhlIG5ld2x5IGRlZmluZWQgZnVuY3Rpb25zLgoKTm93LCBsZXQmIzM5O3MgaWRlbnRpZnkgdGhlIGtleSBmdW5jdGlvbnMgdG8gcmVhbGx5IGZvY3VzIG9uLiBJJiMzOTttIHNlZWluZyBjaGFuZ2VzIHRvOiBgZm9saW9fY2hlY2tfc3BsaXR0YWJsZWAsIHRoZSBzdGF0aWMgaGVscGVycyBgX19mb2xpb19mcmVlemVfc3BsaXRfdW5tYXBgLCBgX19mb2xpb19mcmVlemVfc3BsaXRfdW5tYXBfZmlsZWAgYW5kIGBfX2ZvbGlvX3NwbGl0YCwgYW5kIHRoZSBnbG9iYWwgZnVuY3Rpb25zIGBmb2xpb19zcGxpdF91bm1hcHBlZGAgYW5kIGBfX3N3YXBfY2FjaGVfcmVwbGFjZV9mb2xpb2AuCgpPa2F5LCBteSBpbml0aWFsIHRob3VnaHRzIHBvaW50IG1lIHRvd2FyZHMgYGZvbGlvX3NwbGl0X3VubWFwcGVkYCBhbmQgaXRzIGludGVyYWN0aW9uIHdpdGggYHNwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyYC4gYHNwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyYCBsb29rcyBsaWtlIHRoZSBtYWluIGVudHJ5IHBvaW50IGZvciBzcGxpdHRpbmcgaHVnZSBwYWdlcywgdGhlIHJlYWwgbWVhdCBvZiB0aGUgb3BlcmF0aW9uLiBTbywgSSBzaG91bGQgc3RhcnQgYnkgbG9va2luZyBmb3Igd2hlcmUgYHNwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyYCBvciBzaW1wbHkgYHNwbGl0X2h1Z2VfcGFnZWAgaXMgY2FsbGVkIHdpdGhpbiBgbW0vaHVnZV9tZW1vcnkuY2AgdG8gc2VlIGhvdyBpdCYjMzk7cyBiZWluZyBpbnZva2VkLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA3IDIxOjU0PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O3NwbGl0X2h1Z2VfcGFnZSYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O21tL2h1Z2VfbWVtb3J5LmMmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bW0vaHVnZV9tZW1vcnkuYz00MzM3PWludCBmb2xpb19zcGxpdF91bm1hcHBlZChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyKVxuLS1cbm1tL2h1Z2VfbWVtb3J5LmMtNDM5NC0gKi9cbm1tL2h1Z2VfbWVtb3J5LmM6NDM5NTppbnQgX19zcGxpdF9odWdlX3BhZ2VfdG9fbGlzdF90b19vcmRlcihzdHJ1Y3QgcGFnZSAqcGFnZSwgc3RydWN0IGxpc3RfaGVhZCAqbGlzdCxcbm1tL2h1Z2VfbWVtb3J5LmMtNDM5Ni1cdFx0XHRcdCAgICAgdW5zaWduZWQgaW50IG5ld19vcmRlcilcbi0tXG5tbS9odWdlX21lbW9yeS5jLTQ0MTItICogSXQgaGFzIHRoZSBzYW1lIHByZXJlcXVpc2l0ZXMgYW5kIHJldHVybnMgYXNcbm1tL2h1Z2VfbWVtb3J5LmM6NDQxMzogKiBzcGxpdF9odWdlX3BhZ2VfdG9fbGlzdF90b19vcmRlcigpLlxubW0vaHVnZV9tZW1vcnkuYy00NDE0LSAqXG4tLVxubW0vaHVnZV9tZW1vcnkuYz00NDYyPWludCBzcGxpdF9mb2xpb190b19saXN0KHN0cnVjdCBmb2xpbyAqZm9saW8sIHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QpXG5tbS9odWdlX21lbW9yeS5jLTQ0NjMte1xubW0vaHVnZV9tZW1vcnkuYzo0NDY0Olx0cmV0dXJuIHNwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyKFx1MDAyNmZvbGlvLVx1MDAzZXBhZ2UsIGxpc3QsIDApO1xubW0vaHVnZV9tZW1vcnkuYy00NDY1LX1cbi0tXG5tbS9odWdlX21lbW9yeS5jPTQ2MjE9c3RhdGljIHVuc2lnbmVkIGxvbmcgZGVmZXJyZWRfc3BsaXRfc2NhbihzdHJ1Y3Qgc2hyaW5rZXIgKnNocmluayxcbi0tXG5tbS9odWdlX21lbW9yeS5jLTQ2ODMtI2lmZGVmIENPTkZJR19ERUJVR19GU1xubW0vaHVnZV9tZW1vcnkuYzo0Njg0OnN0YXRpYyB2b2lkIHNwbGl0X2h1Z2VfcGFnZXNfYWxsKHZvaWQpXG5tbS9odWdlX21lbW9yeS5jLTQ2ODUte1xuLS1cbm1tL2h1Z2VfbWVtb3J5LmM9NDczND1zdGF0aWMgaW5saW5lIGJvb2wgdm1hX25vdF9zdWl0YWJsZV9mb3JfdGhwX3NwbGl0KHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKVxuLS1cbm1tL2h1Z2VfbWVtb3J5LmMtNDc0Ny1cbm1tL2h1Z2VfbWVtb3J5LmM6NDc0ODpzdGF0aWMgaW50IHNwbGl0X2h1Z2VfcGFnZXNfcGlkKGludCBwaWQsIHVuc2lnbmVkIGxvbmcgdmFkZHJfc3RhcnQsXG5tbS9odWdlX21lbW9yeS5jLTQ3NDktXHRcdFx0XHR1bnNpZ25lZCBsb25nIHZhZGRyX2VuZCwgdW5zaWduZWQgaW50IG5ld19vcmRlcixcbi0tXG5tbS9odWdlX21lbW9yeS5jLTQ4MTctXHRcdC8qXG5tbS9odWdlX21lbW9yeS5jOjQ4MTg6XHRcdCAqIEZvciBmb2xpb3Mgd2l0aCBwcml2YXRlLCBzcGxpdF9odWdlX3BhZ2VfdG9fbGlzdF90b19vcmRlcigpXG5tbS9odWdlX21lbW9yeS5jLTQ4MTktXHRcdCAqIHdpbGwgdHJ5IHRvIGRyb3AgaXQgYmVmb3JlIHNwbGl0IGFuZCB0aGVuIGNoZWNrIGlmIHRoZSBmb2xpb1xuLS1cbm1tL2h1Z2VfbWVtb3J5LmMtNDg2NC1cbm1tL2h1Z2VfbWVtb3J5LmM6NDg2NTpzdGF0aWMgaW50IHNwbGl0X2h1Z2VfcGFnZXNfaW5fZmlsZShjb25zdCBjaGFyICpmaWxlX3BhdGgsIHBnb2ZmX3Qgb2ZmX3N0YXJ0LFxubW0vaHVnZV9tZW1vcnkuYy00ODY2LVx0XHRcdFx0cGdvZmZfdCBvZmZfZW5kLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyLFxuLS1cbm1tL2h1Z2VfbWVtb3J5LmMtNDkzNC1cbm1tL2h1Z2VfbWVtb3J5LmM6NDkzNTpzdGF0aWMgc3NpemVfdCBzcGxpdF9odWdlX3BhZ2VzX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLFxubW0vaHVnZV9tZW1vcnkuYy00OTM2LVx0XHRcdFx0c2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3BzKVxuLS1cbm1tL2h1Z2VfbWVtb3J5LmMtNDk4Mi1cdFx0fVxubW0vaHVnZV9tZW1vcnkuYzo0OTgzOlx0XHRyZXQgPSBzcGxpdF9odWdlX3BhZ2VzX2luX2ZpbGUoZmlsZV9wYXRoLCBvZmZfc3RhcnQsIG9mZl9lbmQsXG5tbS9odWdlX21lbW9yeS5jLTQ5ODQtXHRcdFx0XHRuZXdfb3JkZXIsIGluX2ZvbGlvX29mZnNldCk7XG4tLVxubW0vaHVnZV9tZW1vcnkuYy00OTkzLVx0aWYgKHJldCA9PSAxIFx1MDAyNlx1MDAyNiBwaWQgPT0gMSkge1xubW0vaHVnZV9tZW1vcnkuYzo0OTk0Olx0XHRzcGxpdF9odWdlX3BhZ2VzX2FsbCgpO1xubW0vaHVnZV9tZW1vcnkuYy00OTk1LVx0XHRyZXQgPSBzdHJsZW4oaW5wdXRfYnVmKTtcbi0tXG5tbS9odWdlX21lbW9yeS5jLTUwMDEtXG5tbS9odWdlX21lbW9yeS5jOjUwMDI6XHRyZXQgPSBzcGxpdF9odWdlX3BhZ2VzX3BpZChwaWQsIHZhZGRyX3N0YXJ0LCB2YWRkcl9lbmQsIG5ld19vcmRlcixcbm1tL2h1Z2VfbWVtb3J5LmMtNTAwMy1cdFx0XHRpbl9mb2xpb19vZmZzZXQpO1xuLS1cbm1tL2h1Z2VfbWVtb3J5LmMtNTAxMS1cbm1tL2h1Z2VfbWVtb3J5LmM6NTAxMjpzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBzcGxpdF9odWdlX3BhZ2VzX2ZvcHMgPSB7XG5tbS9odWdlX21lbW9yeS5jLTUwMTMtXHQub3duZXJcdCA9IFRISVNfTU9EVUxFLFxubW0vaHVnZV9tZW1vcnkuYzo1MDE0Olx0LndyaXRlXHQgPSBzcGxpdF9odWdlX3BhZ2VzX3dyaXRlLFxubW0vaHVnZV9tZW1vcnkuYy01MDE1LX07XG5tbS9odWdlX21lbW9yeS5jLTUwMTYtXG5tbS9odWdlX21lbW9yeS5jOjUwMTc6c3RhdGljIGludCBfX2luaXQgc3BsaXRfaHVnZV9wYWdlc19kZWJ1Z2ZzKHZvaWQpXG5tbS9odWdlX21lbW9yeS5jLTUwMTgte1xubW0vaHVnZV9tZW1vcnkuYzo1MDE5Olx0ZGVidWdmc19jcmVhdGVfZmlsZShcJiMzNDtzcGxpdF9odWdlX3BhZ2VzXCYjMzQ7LCAwMjAwLCBOVUxMLCBOVUxMLFxubW0vaHVnZV9tZW1vcnkuYzo1MDIwOlx0XHRcdCAgICBcdTAwMjZzcGxpdF9odWdlX3BhZ2VzX2ZvcHMpO1xubW0vaHVnZV9tZW1vcnkuYy01MDIxLVx0cmV0dXJuIDA7XG5tbS9odWdlX21lbW9yeS5jLTUwMjItfVxubW0vaHVnZV9tZW1vcnkuYzo1MDIzOmxhdGVfaW5pdGNhbGwoc3BsaXRfaHVnZV9wYWdlc19kZWJ1Z2ZzKTtcbm1tL2h1Z2VfbWVtb3J5LmMtNTAyNC0jZW5kaWZcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD41LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNyAyMTo1NDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMzU2MgoJCQkJCQkJb3V0cHV0OiAyNgoJCQkJCQkJdGhvdWdodHM6IDk4CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyBGb2xpbyBTcGxpdHRpbmcgYW5kIFN3YXAgQ2FjaGUgT3BlcmF0aW9ucyoqCgpPa2F5LCBzbyBJJiMzOTt2ZSBiZWVuIGxvb2tpbmcgYXQgaG93IGZvbGlvIHNwbGl0dGluZyBhbmQgdGhlIHN3YXAgY2FjaGUgaW50ZXJhY3QuIEkgc2VlIHRoYXQgdGhlc2UgZnVuY3Rpb25zIGhhdmUgYmVlbiB0b3VjaGVkOiBgZm9saW9fY2hlY2tfc3BsaXR0YWJsZWAsIGBfX2ZvbGlvX2ZyZWV6ZV9zcGxpdF91bm1hcGAsIGBfX2ZvbGlvX2ZyZWV6ZV9zcGxpdF91bm1hcF9maWxlYCwgYF9fZm9saW9fc3BsaXRgLCBgZm9saW9fc3BsaXRfdW5tYXBwZWRgLCBhbmQgYF9fc3dhcF9jYWNoZV9yZXBsYWNlX2ZvbGlvYC4gVGhhdCYjMzk7cyBhIGRlY2VudC1zaXplZCBsaXN0LCBhbmQgSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhlIGltcGxpY2F0aW9ucyBvZiB0aGVzZSBjaGFuZ2VzLgoKSSBuZWVkIHRvIGZvY3VzIG9uIGBmb2xpb19zcGxpdF91bm1hcHBlZGAgYW5kIGBfX3N3YXBfY2FjaGVfcmVwbGFjZV9mb2xpb2Agc3BlY2lmaWNhbGx5LiBUaGVzZSBhcmUgdGhlIHR3byB0aGF0IGFyZSBzY3JlYW1pbmcgdGhlIGxvdWRlc3QgcmlnaHQgbm93LiBUaGUgaW50ZXJwbGF5IGJldHdlZW4gc3BsaXR0aW5nIGZvbGlvcyB0aGF0IGFyZSAqdW5tYXBwZWQqIGFuZCBob3cgdGhhdCBpbXBhY3RzIHRoZSBzd2FwIGNhY2hlIGlzIHdoZXJlIEkgYW50aWNpcGF0ZSBmaW5kaW5nIHRoZSBjb3JlIG9mIHRoZSBpc3N1ZSAob3IgdGhlIGltcHJvdmVtZW50LCBkZXBlbmRpbmcpLiBHb3R0YSBmaWd1cmUgb3V0IGhvdyB0aGUgdW5tYXBwaW5nIGlzIGhhbmRsZWQgZHVyaW5nIHRoZSBzcGxpdCwgYW5kIHRoZW4sIGNydWNpYWxseSwgaG93IHRoZSBzd2FwIGNhY2hlIHVwZGF0ZXMgaXRzIHZpZXcgb2YgdGhlIHBhZ2VzIGFmdGVyIHRoZSBzcGxpdCBoYXMgb2NjdXJyZWQuIEkgbmVlZCB0byBrZWVwIGEgY2xvc2UgZXllIG91dCBmb3IgcG90ZW50aWFsIHJhY2VzLCBtaXNzZWQgaW52YWxpZGF0aW9ucywgb3IgaW5jb3JyZWN0IHJlZmVyZW5jZSBjb3VudHMuIEkgZXhwZWN0IHRoZXNlIHR3byBmdW5jdGlvbnMgd2lsbCBiZSB0aGUga2V5cyB0byB1bmRlcnN0YW5kaW5nIHRoZSBjaGFuZ2VzIGluIHRoaXMgcGF0Y2guCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Ni8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDcgMjE6NTQ8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7Zm9saW9fc3BsaXRfdW5tYXBwZWQmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDsmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7aW5jbHVkZS9saW51eC9odWdlX21tLmg9NDAzPWludCBfX3NwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyKHN0cnVjdCBwYWdlICpwYWdlLCBzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LFxuaW5jbHVkZS9saW51eC9odWdlX21tLmgtNDA0LVx0XHR1bnNpZ25lZCBpbnQgbmV3X29yZGVyKTtcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oOjQwNTppbnQgZm9saW9fc3BsaXRfdW5tYXBwZWQoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlcik7XG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaC00MDYtdW5zaWduZWQgaW50IG1pbl9vcmRlcl9mb3Jfc3BsaXQoc3RydWN0IGZvbGlvICpmb2xpbyk7XG4tLVxubW0vaHVnZV9tZW1vcnkuYz00MjQ3PXN0YXRpYyBpbnQgX19mb2xpb19zcGxpdChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyLFxuLS1cbm1tL2h1Z2VfbWVtb3J5LmMtNDMxNS0vKipcbm1tL2h1Z2VfbWVtb3J5LmM6NDMxNjogKiBmb2xpb19zcGxpdF91bm1hcHBlZCgpIC0gc3BsaXQgYSBsYXJnZSBhbm9uIGZvbGlvIHRoYXQgaXMgYWxyZWFkeSB1bm1hcHBlZFxubW0vaHVnZV9tZW1vcnkuYy00MzE3LSAqIEBmb2xpbzogZm9saW8gdG8gc3BsaXRcbi0tXG5tbS9odWdlX21lbW9yeS5jLTQzMzYtICovXG5tbS9odWdlX21lbW9yeS5jOjQzMzc6aW50IGZvbGlvX3NwbGl0X3VubWFwcGVkKHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIpXG5tbS9odWdlX21lbW9yeS5jLTQzMzgte1xuLS1cbm1tL21pZ3JhdGVfZGV2aWNlLmM9OTEyPXN0YXRpYyBpbnQgbWlncmF0ZV92bWFfc3BsaXRfdW5tYXBwZWRfZm9saW8oc3RydWN0IG1pZ3JhdGVfdm1hICptaWdyYXRlLFxuLS1cbm1tL21pZ3JhdGVfZGV2aWNlLmMtOTI2LVx0c3BsaXRfaHVnZV9wbWRfYWRkcmVzcyhtaWdyYXRlLVx1MDAzZXZtYSwgYWRkciwgdHJ1ZSk7XG5tbS9taWdyYXRlX2RldmljZS5jOjkyNzpcdHJldCA9IGZvbGlvX3NwbGl0X3VubWFwcGVkKGZvbGlvLCAwKTtcbm1tL21pZ3JhdGVfZGV2aWNlLmMtOTI4LVx0aWYgKHJldClcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD43LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNyAyMTo1NDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxNDM3OAoJCQkJCQkJb3V0cHV0OiAyOAoJCQkJCQkJdGhvdWdodHM6IDQ5CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBoZXJlJiMzOTtzIG15IHRha2Ugb24gdGhvc2UgdGhvdWdodHMsIGZyYW1lZCBmcm9tIG15IGV4cGVydCBwZXJzcGVjdGl2ZToKCioqRGl2aW5nIGludG8gdGhlIEZvbGlvIFN3YXAgQ2FjaGUqKgoKUmlnaHQsIHNvIGBmb2xpb19zcGxpdF91bm1hcHBlZGAgaXMgYmVpbmcgY2FsbGVkIGZyb20gYG1pZ3JhdGVfdm1hX3NwbGl0X3VubWFwcGVkX2ZvbGlvYCB3aXRoaW4gYG1tL21pZ3JhdGVfZGV2aWNlLmNgLiBUaGF0JiMzOTtzIHRoZSBrZXkuIEkgbmVlZCB0byB1bmRlcnN0YW5kIHdoYXQmIzM5O3MgaGFwcGVuaW5nIGR1cmluZyB0aGlzIHVubWFwcGVkIGZvbGlvIHNwbGl0IGFzIHBhcnQgb2YgdGhlIFZNQSBtaWdyYXRpb24gcHJvY2Vzcy4gU3BlY2lmaWNhbGx5LCBJIG5lZWQgdG8ga25vdyBob3cgdGhlc2UgdW5tYXBwZWQgZm9saW9zIGFyZSBiZWluZyBoYW5kbGVkIHdoZW4gc3BsaXQuCgpNeSBndXQgZmVlbGluZyBpcyB0aGF0IGFueSB0aW1lIHdlIGFyZSBtaWdyYXRpbmcgVk1BcyBhbmQgd2UgYXJlIHNwbGl0dGluZyBhbiB1bm1hcHBlZCBmb2xpbywgaXQgbWVhbnMgdGhpcyBtdXN0IGJlIHZlcnkgaW1wb3J0YW50LgoKVGhlIG5leHQgbG9naWNhbCBzdGVwIGlzIHRvIGRpdmUgaW50byBgX19zd2FwX2NhY2hlX3JlcGxhY2VfZm9saW9gLiBUaGF0IGZ1bmN0aW9uIGlzIGNydWNpYWwgdG8gZm9saW8gc3dhcHBpbmcgb3BlcmF0aW9ucywgc28gSSYjMzk7bSBndWVzc2luZyB0aGF0IGl0IHdpbGwgcGxheSBhIHJvbGUgaW4gaG93IHVubWFwcGVkIGZvbGlvcyBhcmUgaGFuZGxlZC4gSSBleHBlY3QgdG8gZmluZCBzb21lIGNyaXRpY2FsIGNvbnRleHQgdGhlcmUgYXJvdW5kIGhvdyB0aGVzZSBzcGxpdCB1bm1hcHBlZCBmb2xpb3MgYXJlIGludGVncmF0ZWQgd2l0aCB0aGUgc3dhcCBjYWNoZSwgYW5kIGlmIHRoZXJlIGFyZSBhbnkgc3BlY2lmaWMgY29uc2lkZXJhdGlvbnMgZm9yIHVubWFwcGVkIGZvbGlvcy4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgaWYgdGhpcyBpcyBhIGNyaXRpY2FsIGNvZGUgcGF0aCwgb3IgaWYgb3RoZXIgY2FsbHMgYXJlIG1vcmUgc2lnbmlmaWNhbnQuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+OC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDcgMjE6NTQ8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7X19zd2FwX2NhY2hlX3JlcGxhY2VfZm9saW8mIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDsmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bW0vaHVnZV9tZW1vcnkuYz0zOTI2PXN0YXRpYyBpbnQgX19mb2xpb19mcmVlemVfc3BsaXRfdW5tYXAoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlcixcbi0tXG5tbS9odWdlX21lbW9yeS5jLTQwMzMtXHRcdGlmIChjaSlcbm1tL2h1Z2VfbWVtb3J5LmM6NDAzNDpcdFx0XHRfX3N3YXBfY2FjaGVfcmVwbGFjZV9mb2xpbyhjaSwgZm9saW8sIG5ld19mb2xpbyk7XG5tbS9odWdlX21lbW9yeS5jLTQwMzUtXHR9XG4tLVxubW0vbWlncmF0ZS5jPTU4Mz1zdGF0aWMgaW50IF9fZm9saW9fbWlncmF0ZV9tYXBwaW5nKHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLFxuLS1cbm1tL21pZ3JhdGUuYy02NTYtXHRpZiAoZm9saW9fdGVzdF9zd2FwY2FjaGUoZm9saW8pKVxubW0vbWlncmF0ZS5jOjY1NzpcdFx0X19zd2FwX2NhY2hlX3JlcGxhY2VfZm9saW8oY2ksIGZvbGlvLCBuZXdmb2xpbyk7XG5tbS9taWdyYXRlLmMtNjU4LVx0ZWxzZVxuLS1cbm1tL3NobWVtLmM9MjA4OD1zdGF0aWMgaW50IHNobWVtX3JlcGxhY2VfZm9saW8oc3RydWN0IGZvbGlvICoqZm9saW9wLCBnZnBfdCBnZnAsXG4tLVxubW0vc2htZW0uYy0yMTI1LVx0Y2kgPSBzd2FwX2NsdXN0ZXJfZ2V0X2FuZF9sb2NrX2lycShvbGQpO1xubW0vc2htZW0uYzoyMTI2Olx0X19zd2FwX2NhY2hlX3JlcGxhY2VfZm9saW8oY2ksIG9sZCwgbmV3KTtcbm1tL3NobWVtLmMtMjEyNy1cdG1lbV9jZ3JvdXBfcmVwbGFjZV9mb2xpbyhvbGQsIG5ldyk7XG4tLVxubW0vc3dhcC5oPTM0Mj12b2lkIF9fc3dhcF9jYWNoZV9kZWxfZm9saW8oc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSxcbm1tL3N3YXAuaC0zNDMtXHRcdFx0ICAgIHN0cnVjdCBmb2xpbyAqZm9saW8sIHN3cF9lbnRyeV90IGVudHJ5LCB2b2lkICpzaGFkb3cpO1xubW0vc3dhcC5oOjM0NDp2b2lkIF9fc3dhcF9jYWNoZV9yZXBsYWNlX2ZvbGlvKHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2ksXG5tbS9zd2FwLmgtMzQ1LVx0XHRcdFx0c3RydWN0IGZvbGlvICpvbGQsIHN0cnVjdCBmb2xpbyAqbmV3KTtcbi0tXG5tbS9zd2FwLmg9NDc2PXN0YXRpYyBpbmxpbmUgdm9pZCBfX3N3YXBfY2FjaGVfZGVsX2ZvbGlvKHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2ksXG4tLVxubW0vc3dhcC5oLTQ4MC1cbm1tL3N3YXAuaDo0ODE6c3RhdGljIGlubGluZSB2b2lkIF9fc3dhcF9jYWNoZV9yZXBsYWNlX2ZvbGlvKHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2ksXG5tbS9zd2FwLmgtNDgyLVx0XHRzdHJ1Y3QgZm9saW8gKm9sZCwgc3RydWN0IGZvbGlvICpuZXcpXG4tLVxubW0vc3dhcF9zdGF0ZS5jPTMzNT12b2lkIHN3YXBfY2FjaGVfZGVsX2ZvbGlvKHN0cnVjdCBmb2xpbyAqZm9saW8pXG4tLVxubW0vc3dhcF9zdGF0ZS5jLTM0Ny0vKipcbm1tL3N3YXBfc3RhdGUuYzozNDg6ICogX19zd2FwX2NhY2hlX3JlcGxhY2VfZm9saW8gLSBSZXBsYWNlIGEgZm9saW8gaW4gdGhlIHN3YXAgY2FjaGUuXG5tbS9zd2FwX3N0YXRlLmMtMzQ5LSAqIEBjaTogVGhlIGxvY2tlZCBzd2FwIGNsdXN0ZXIuXG4tLVxubW0vc3dhcF9zdGF0ZS5jLTM2MC0gKi9cbm1tL3N3YXBfc3RhdGUuYzozNjE6dm9pZCBfX3N3YXBfY2FjaGVfcmVwbGFjZV9mb2xpbyhzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpLFxubW0vc3dhcF9zdGF0ZS5jLTM2Mi1cdFx0XHRcdHN0cnVjdCBmb2xpbyAqb2xkLCBzdHJ1Y3QgZm9saW8gKm5ldylcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD45LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNyAyMTo1NDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxNTQyOAoJCQkJCQkJb3V0cHV0OiAyOAoJCQkJCQkJdGhvdWdodHM6IDE2NQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgdGhlIEtlcm5lbCBQYXRjaCBmb3IgU3dhcCBhbmQgVEhQIEludGVyYWN0aW9uKioKCk9rYXksIHNvIEkmIzM5O20gbG9va2luZyBhdCB0aGlzIHBhdGNoIGFuZCBpdCBzZWVtcyB0byBiZSBjZW50ZXJlZCBhcm91bmQgdGhlIGludGVyYWN0aW9uIG9mIFRyYW5zcGFyZW50IEh1Z2UgUGFnZXMgKFRIUCkgYW5kIHRoZSBzd2FwIGNhY2hlLCBzcGVjaWZpY2FsbHkgaW4gdGhlIG1lbW9yeSBtYW5hZ2VtZW50IHN1YnN5c3RlbS4gTXkgaW5pdGlhbCB0aG91Z2h0IGlzIHRoYXQgdGhlIGNvcmUgY2hhbmdlIGFwcGVhcnMgdG8gYmUgYSBtb2RpZmljYXRpb24gd2l0aGluIGBtbS9zd2FwX3N0YXRlLmNgLCBzcGVjaWZpY2FsbHkgdG8gdGhlIGBfX3N3YXBfY2FjaGVfcmVwbGFjZV9mb2xpb2AgZnVuY3Rpb24uIEluc3RlYWQgb2YgdXNpbmcgYSBgd2hpbGVgIGxvb3AsIHRoZXkmIzM5O3ZlIHN3aXRjaGVkIHRvIGEgYGRvIHsgLi4uIH0gd2hpbGVgIGNvbnN0cnVjdC4gSSYjMzk7bGwgbmVlZCB0byBkcmlsbCBkb3duIHRvIHVuZGVyc3RhbmQgdGhlIHJhdGlvbmFsZSBiZWhpbmQgdGhhdCBjaGFuZ2UuCgpUaGUgb3RoZXIgY3J1Y2lhbCBhcmVhIHNlZW1zIHRvIGJlIHdpdGhpbiBgbW0vaHVnZV9tZW1vcnkuY2AsIGFuZCBJJiMzOTttIGd1ZXNzaW5nIHRoYXQgdGhpcyBpcyB3aGVyZSB0aGUgVEhQLXNwZWNpZmljIGxvZ2ljIGNvbWVzIGludG8gcGxheS4gSSYjMzk7bGwgbmVlZCB0byBtZXRpY3Vsb3VzbHkgYW5hbHl6ZSB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uczogYHNwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyYCwgYGZvbGlvX3NwbGl0X3VubWFwcGVkYCwgYF9fc3dhcF9jYWNoZV9yZXBsYWNlX2ZvbGlvYCAoYWdhaW4sIHRvIHVuZGVyc3RhbmQgdGhlIGludGVyYWN0aW9ucyksIGFuZCBgc3BsaXRfZm9saW9fdG9fbGlzdGAuIFRoZXNlIGFyZSB0aGUga2V5IHBpZWNlcyB0byB1bmRlcnN0YW5kIGhvdyBhIGh1Z2UgcGFnZSBpcyBoYW5kbGVkIHdoZW4gaXQgbmVlZHMgdG8gYmUgc3dhcHBlZC4KCkJlZm9yZSBJIGdvIGZ1cnRoZXIsIEkmIzM5O2xsIHF1aWNrbHkgY2hlY2sgdGhlIEtjb25maWcgc2V0dGluZ3MuIEkgbmVlZCB0byBtYWtlIHN1cmUgYENPTkZJR19UUkFOU1BBUkVOVF9IVUdFUEFHRWAgaXMgZW5hYmxlZCBiZWNhdXNlIGl0JiMzOTtzIHJlcXVpcmVkIGZvciBUSFAgZnVuY3Rpb25hbGl0eSB0byBiZSBwcmVzZW50LiBTaW1pbGFybHksIEkmIzM5O2xsIGNvbmZpcm0gYENPTkZJR19TV0FQYCBpcyBlbmFibGVkLCBhcyB0aGlzIHdpbGwgYWxsb3cgZm9yIHN3YXBjYWNoZSB0byBiZSBpbiBlZmZlY3QuIEkgc2hvdWxkIGFsc28gZ2xhbmNlIGZvciBhbnkgb3RoZXIgcmVsYXRlZCBjb25maWdzLCBqdXN0IHRvIGVuc3VyZSBJIGhhdmUgdGhlIGZ1bGwgcGljdHVyZS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDcgMjE6NTQ8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7JiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O21tL0tjb25maWc9ODMxPWNvbmZpZyBNTV9JRFxuLS1cbm1tL0tjb25maWctODMzLVxubW0vS2NvbmZpZzo4MzQ6bWVudWNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRVxubW0vS2NvbmZpZy04MzUtXHRib29sIFwmIzM0O1RyYW5zcGFyZW50IEh1Z2VwYWdlIFN1cHBvcnRcJiMzNDtcbi0tXG5tbS9LY29uZmlnPTg1Mj1jaG9pY2Vcbi0tXG5tbS9LY29uZmlnLTg1Ny1cbm1tL0tjb25maWc6ODU4Olx0Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX0FMV0FZU1xubW0vS2NvbmZpZy04NTktXHRcdGJvb2wgXCYjMzQ7YWx3YXlzXCYjMzQ7XG4tLVxubW0vS2NvbmZpZy04NjQtXG5tbS9LY29uZmlnOjg2NTpcdGNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRV9NQURWSVNFXG5tbS9LY29uZmlnLTg2Ni1cdFx0Ym9vbCBcJiMzNDttYWR2aXNlXCYjMzQ7XG4tLVxubW0vS2NvbmZpZy04NzMtXG5tbS9LY29uZmlnOjg3NDpcdGNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRV9ORVZFUlxubW0vS2NvbmZpZy04NzUtXHRcdGJvb2wgXCYjMzQ7bmV2ZXJcJiMzNDtcbi0tXG5tbS9LY29uZmlnPTg4MT1jaG9pY2Vcbi0tXG5tbS9LY29uZmlnLTg5MC1cbm1tL0tjb25maWc6ODkxOlx0Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX1NITUVNX0hVR0VfTkVWRVJcbm1tL0tjb25maWctODkyLVx0XHRib29sIFwmIzM0O25ldmVyXCYjMzQ7XG4tLVxubW0vS2NvbmZpZy05MDAtXG5tbS9LY29uZmlnOjkwMTpcdGNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRV9TSE1FTV9IVUdFX0FMV0FZU1xubW0vS2NvbmZpZy05MDItXHRcdGJvb2wgXCYjMzQ7YWx3YXlzXCYjMzQ7XG4tLVxubW0vS2NvbmZpZy05MDgtXG5tbS9LY29uZmlnOjkwOTpcdGNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRV9TSE1FTV9IVUdFX1dJVEhJTl9TSVpFXG5tbS9LY29uZmlnLTkxMC1cdFx0Ym9vbCBcJiMzNDt3aXRoaW5fc2l6ZVwmIzM0O1xuLS1cbm1tL0tjb25maWctOTE2LVxubW0vS2NvbmZpZzo5MTc6XHRjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VfU0hNRU1fSFVHRV9BRFZJU0Vcbm1tL0tjb25maWctOTE4LVx0XHRib29sIFwmIzM0O2FkdmlzZVwmIzM0O1xuLS1cbm1tL0tjb25maWc9OTI2PWNob2ljZVxuLS1cbm1tL0tjb25maWctOTM1LVxubW0vS2NvbmZpZzo5MzY6XHRjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VfVE1QRlNfSFVHRV9ORVZFUlxubW0vS2NvbmZpZy05MzctXHRcdGJvb2wgXCYjMzQ7bmV2ZXJcJiMzNDtcbi0tXG5tbS9LY29uZmlnLTk0NC1cbm1tL0tjb25maWc6OTQ1Olx0Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX1RNUEZTX0hVR0VfQUxXQVlTXG5tbS9LY29uZmlnLTk0Ni1cdFx0Ym9vbCBcJiMzNDthbHdheXNcJiMzNDtcbi0tXG5tbS9LY29uZmlnLTk1Mi1cbm1tL0tjb25maWc6OTUzOlx0Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX1RNUEZTX0hVR0VfV0lUSElOX1NJWkVcbm1tL0tjb25maWctOTU0LVx0XHRib29sIFwmIzM0O3dpdGhpbl9zaXplXCYjMzQ7XG4tLVxubW0vS2NvbmZpZy05NjAtXG5tbS9LY29uZmlnOjk2MTpcdGNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRV9UTVBGU19IVUdFX0FEVklTRVxubW0vS2NvbmZpZy05NjItXHRcdGJvb2wgXCYjMzQ7YWR2aXNlXCYjMzQ7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTEvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA3IDIxOjU0PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDE2Njc3CgkJCQkJCQlvdXRwdXQ6IDI3CgkJCQkJCQl0aG91Z2h0czogODEKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGhlcmUmIzM5O3MgbXkgdGFrZSBvbiB0aG9zZSB0aG91Z2h0cywgZnJhbWVkIGFzIG15IG93bjoKCioqT3B0aW1pemluZyBNZW1vcnkgTWFuYWdlbWVudDogVHJhbnNwYXJlbnQgSHVnZXBhZ2VzIGFuZCBCZXlvbmQqKgoKQWxyaWdodCwgbGV0JiMzOTtzIHRoaW5rIHRoaXMgdGhyb3VnaC4gSSYjMzk7bSBsZWFuaW5nIHRvd2FyZHMgZW5hYmxpbmcgYFRSQU5TUEFSRU5UX0hVR0VQQUdFYCBhbG9uZ3NpZGUgYFNXQVBgIGluIHRoaXMgZW52aXJvbm1lbnQuIFRoZSBwb3RlbnRpYWwgcGVyZm9ybWFuY2UgZ2FpbnMgd2l0aCBodWdlcGFnZXMgYXJlIHNpZ25pZmljYW50LCBhbmQgcHJvcGVybHkgY29uZmlndXJlZCBzd2FwcGluZyBjYW4gYmUgZXNzZW50aWFsIGZvciBtYW5hZ2luZyBtZW1vcnkgcHJlc3N1cmUuCgpOb3csIEkmIzM5O20gZ2V0dGluZyBjdXJpb3VzIGFib3V0IHRoZSBpbm5lciB3b3JraW5ncy4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgaG93IHBhZ2VzIGFyZSBtYW5hZ2VkIHdpdGhpbiB0aGUgaHVnZXBhZ2Ugc3lzdGVtLiBNeSBpbW1lZGlhdGUgcXVlc3Rpb24gaXMgd2hldGhlciBgc3BsaXRfaHVnZV9wYWdlX3RvX2xpc3RfdG9fb3JkZXJgIGlzIGFjY2Vzc2libGUuIEkgbmVlZCB0byB2ZXJpZnkgdGhhdCBpdCYjMzk7cyBleHBvcnRlZCBhbmQgcmVhY2hhYmxlLiBHb29kLCBpdCBsb29rcyBsaWtlIGBzcGxpdF9mb2xpb190b19saXN0YCBhbmQgYHNwbGl0X2h1Z2VfcGFnZWAgYm90aCB1c2UgYHNwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyYC4gVGhpcyBpcyBwcm9taXNpbmc7IHVuZGVyc3RhbmRpbmcgaXRzIHJvbGUgaXMga2V5LgoKTm93IEkgbmVlZCB0byBkaXZlIGRlZXBlci4gTXkgbmV4dCBzdGVwIGlzIHRvIGV4YW1pbmUgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgYHNwbGl0X2h1Z2VfcGFnZWAuIEkmIzM5O2xsIG5lZWQgdG8gdW5kZXJzdGFuZCBob3cgaXQgaW50ZXJhY3RzIHdpdGggdGhlIGxvd2VyIGxldmVscyBvZiBtZW1vcnkgbWFuYWdlbWVudCwgdGhlIGZvbGlvIHN0cnVjdHVyZSwgYW5kIHRoZSBsaXN0IG1hbmFnZW1lbnQuIFRoaXMgd2lsbCBsaWtlbHkgcHJvdmlkZSBpbnNpZ2h0cyBpbnRvIGhvdyBodWdlcGFnZXMgYXJlIG1hbmFnZWQgYW5kIHNwbGl0IGluIHRoZSBzeXN0ZW0uCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTIvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA3IDIxOjU0PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O3NwbGl0X2h1Z2VfcGFnZSYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O21tLyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDttbS9odWdlX21lbW9yeS5jPTQzMzc9aW50IGZvbGlvX3NwbGl0X3VubWFwcGVkKHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIpXG4tLVxubW0vaHVnZV9tZW1vcnkuYy00Mzk0LSAqL1xubW0vaHVnZV9tZW1vcnkuYzo0Mzk1OmludCBfX3NwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyKHN0cnVjdCBwYWdlICpwYWdlLCBzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LFxubW0vaHVnZV9tZW1vcnkuYy00Mzk2LVx0XHRcdFx0ICAgICB1bnNpZ25lZCBpbnQgbmV3X29yZGVyKVxuLS1cbm1tL2h1Z2VfbWVtb3J5LmMtNDQxMi0gKiBJdCBoYXMgdGhlIHNhbWUgcHJlcmVxdWlzaXRlcyBhbmQgcmV0dXJucyBhc1xubW0vaHVnZV9tZW1vcnkuYzo0NDEzOiAqIHNwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyKCkuXG5tbS9odWdlX21lbW9yeS5jLTQ0MTQtICpcbi0tXG5tbS9odWdlX21lbW9yeS5jPTQ0NjI9aW50IHNwbGl0X2ZvbGlvX3RvX2xpc3Qoc3RydWN0IGZvbGlvICpmb2xpbywgc3RydWN0IGxpc3RfaGVhZCAqbGlzdClcbm1tL2h1Z2VfbWVtb3J5LmMtNDQ2My17XG5tbS9odWdlX21lbW9yeS5jOjQ0NjQ6XHRyZXR1cm4gc3BsaXRfaHVnZV9wYWdlX3RvX2xpc3RfdG9fb3JkZXIoXHUwMDI2Zm9saW8tXHUwMDNlcGFnZSwgbGlzdCwgMCk7XG5tbS9odWdlX21lbW9yeS5jLTQ0NjUtfVxuLS1cbm1tL2h1Z2VfbWVtb3J5LmM9NDYyMT1zdGF0aWMgdW5zaWduZWQgbG9uZyBkZWZlcnJlZF9zcGxpdF9zY2FuKHN0cnVjdCBzaHJpbmtlciAqc2hyaW5rLFxuLS1cbm1tL2h1Z2VfbWVtb3J5LmMtNDY4My0jaWZkZWYgQ09ORklHX0RFQlVHX0ZTXG5tbS9odWdlX21lbW9yeS5jOjQ2ODQ6c3RhdGljIHZvaWQgc3BsaXRfaHVnZV9wYWdlc19hbGwodm9pZClcbm1tL2h1Z2VfbWVtb3J5LmMtNDY4NS17XG4tLVxubW0vaHVnZV9tZW1vcnkuYz00NzM0PXN0YXRpYyBpbmxpbmUgYm9vbCB2bWFfbm90X3N1aXRhYmxlX2Zvcl90aHBfc3BsaXQoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpXG4tLVxubW0vaHVnZV9tZW1vcnkuYy00NzQ3LVxubW0vaHVnZV9tZW1vcnkuYzo0NzQ4OnN0YXRpYyBpbnQgc3BsaXRfaHVnZV9wYWdlc19waWQoaW50IHBpZCwgdW5zaWduZWQgbG9uZyB2YWRkcl9zdGFydCxcbm1tL2h1Z2VfbWVtb3J5LmMtNDc0OS1cdFx0XHRcdHVuc2lnbmVkIGxvbmcgdmFkZHJfZW5kLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyLFxuLS1cbm1tL2h1Z2VfbWVtb3J5LmMtNDgxNy1cdFx0Lypcbm1tL2h1Z2VfbWVtb3J5LmM6NDgxODpcdFx0ICogRm9yIGZvbGlvcyB3aXRoIHByaXZhdGUsIHNwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyKClcbm1tL2h1Z2VfbWVtb3J5LmMtNDgxOS1cdFx0ICogd2lsbCB0cnkgdG8gZHJvcCBpdCBiZWZvcmUgc3BsaXQgYW5kIHRoZW4gY2hlY2sgaWYgdGhlIGZvbGlvXG4tLVxubW0vaHVnZV9tZW1vcnkuYy00ODY0LVxubW0vaHVnZV9tZW1vcnkuYzo0ODY1OnN0YXRpYyBpbnQgc3BsaXRfaHVnZV9wYWdlc19pbl9maWxlKGNvbnN0IGNoYXIgKmZpbGVfcGF0aCwgcGdvZmZfdCBvZmZfc3RhcnQsXG5tbS9odWdlX21lbW9yeS5jLTQ4NjYtXHRcdFx0XHRwZ29mZl90IG9mZl9lbmQsIHVuc2lnbmVkIGludCBuZXdfb3JkZXIsXG4tLVxubW0vaHVnZV9tZW1vcnkuYy00OTM0LVxubW0vaHVnZV9tZW1vcnkuYzo0OTM1OnN0YXRpYyBzc2l6ZV90IHNwbGl0X2h1Z2VfcGFnZXNfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWYsXG5tbS9odWdlX21lbW9yeS5jLTQ5MzYtXHRcdFx0XHRzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcHMpXG4tLVxubW0vaHVnZV9tZW1vcnkuYy00OTgyLVx0XHR9XG5tbS9odWdlX21lbW9yeS5jOjQ5ODM6XHRcdHJldCA9IHNwbGl0X2h1Z2VfcGFnZXNfaW5fZmlsZShmaWxlX3BhdGgsIG9mZl9zdGFydCwgb2ZmX2VuZCxcbm1tL2h1Z2VfbWVtb3J5LmMtNDk4NC1cdFx0XHRcdG5ld19vcmRlciwgaW5fZm9saW9fb2Zmc2V0KTtcbi0tXG5tbS9odWdlX21lbW9yeS5jLTQ5OTMtXHRpZiAocmV0ID09IDEgXHUwMDI2XHUwMDI2IHBpZCA9PSAxKSB7XG5tbS9odWdlX21lbW9yeS5jOjQ5OTQ6XHRcdHNwbGl0X2h1Z2VfcGFnZXNfYWxsKCk7XG5tbS9odWdlX21lbW9yeS5jLTQ5OTUtXHRcdHJldCA9IHN0cmxlbihpbnB1dF9idWYpO1xuLS1cbm1tL2h1Z2VfbWVtb3J5LmMtNTAwMS1cbm1tL2h1Z2VfbWVtb3J5LmM6NTAwMjpcdHJldCA9IHNwbGl0X2h1Z2VfcGFnZXNfcGlkKHBpZCwgdmFkZHJfc3RhcnQsIHZhZGRyX2VuZCwgbmV3X29yZGVyLFxubW0vaHVnZV9tZW1vcnkuYy01MDAzLVx0XHRcdGluX2ZvbGlvX29mZnNldCk7XG4tLVxubW0vaHVnZV9tZW1vcnkuYy01MDExLVxubW0vaHVnZV9tZW1vcnkuYzo1MDEyOnN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHNwbGl0X2h1Z2VfcGFnZXNfZm9wcyA9IHtcbm1tL2h1Z2VfbWVtb3J5LmMtNTAxMy1cdC5vd25lclx0ID0gVEhJU19NT0RVTEUsXG5tbS9odWdlX21lbW9yeS5jOjUwMTQ6XHQud3JpdGVcdCA9IHNwbGl0X2h1Z2VfcGFnZXNfd3JpdGUsXG5tbS9odWdlX21lbW9yeS5jLTUwMTUtfTtcbm1tL2h1Z2VfbWVtb3J5LmMtNTAxNi1cbm1tL2h1Z2VfbWVtb3J5LmM6NTAxNzpzdGF0aWMgaW50IF9faW5pdCBzcGxpdF9odWdlX3BhZ2VzX2RlYnVnZnModm9pZClcbm1tL2h1Z2VfbWVtb3J5LmMtNTAxOC17XG5tbS9odWdlX21lbW9yeS5jOjUwMTk6XHRkZWJ1Z2ZzX2NyZWF0ZV9maWxlKFwmIzM0O3NwbGl0X2h1Z2VfcGFnZXNcJiMzNDssIDAyMDAsIE5VTEwsIE5VTEwsXG5tbS9odWdlX21lbW9yeS5jOjUwMjA6XHRcdFx0ICAgIFx1MDAyNnNwbGl0X2h1Z2VfcGFnZXNfZm9wcyk7XG5tbS9odWdlX21lbW9yeS5jLTUwMjEtXHRyZXR1cm4gMDtcbm1tL2h1Z2VfbWVtb3J5LmMtNTAyMi19XG5tbS9odWdlX21lbW9yeS5jOjUwMjM6bGF0ZV9pbml0Y2FsbChzcGxpdF9odWdlX3BhZ2VzX2RlYnVnZnMpO1xubW0vaHVnZV9tZW1vcnkuYy01MDI0LSNlbmRpZlxuLS1cbm1tL2h1Z2V0bGIuYz0zOTUzPXN0YXRpYyBsb25nIGRlbW90ZV9mcmVlX2h1Z2V0bGJfZm9saW9zKHN0cnVjdCBoc3RhdGUgKnNyYywgc3RydWN0IGhzdGF0ZSAqZHN0LFxuLS1cbm1tL2h1Z2V0bGIuYy0zOTg5LVx0XHRcdHN0cnVjdCBwYWdlICpwYWdlID0gZm9saW9fcGFnZShmb2xpbywgaSk7XG5tbS9odWdldGxiLmM6Mzk5MDpcdFx0XHQvKiBDYXJlZnVsOiBzZWUgX19zcGxpdF9odWdlX3BhZ2VfdGFpbCgpICovXG5tbS9odWdldGxiLmMtMzk5MS1cdFx0XHRzdHJ1Y3QgZm9saW8gKm5ld19mb2xpbyA9IChzdHJ1Y3QgZm9saW8gKilwYWdlO1xuLS1cbm1tL2todWdlcGFnZWQuYz04MTM9c3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgX19jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbi0tXG5tbS9raHVnZXBhZ2VkLmMtODY5LVx0XHQgKiBmb2xpbyBjYW4mIzM5O3QgYmUgZnJlZWQgZnJvbSB1bmRlciB1cy4gTk9URTogZm9saW8gbG9ja1xubW0va2h1Z2VwYWdlZC5jOjg3MDpcdFx0ICogaXMgbmVlZGVkIHRvIHNlcmlhbGl6ZSBhZ2FpbnN0IHNwbGl0X2h1Z2VfcGFnZSgpXG5tbS9raHVnZXBhZ2VkLmMtODcxLVx0XHQgKiB3aGVuIGludm9rZWQgZnJvbSB0aGUgVk0uXG4tLVxubW0va3NtLmM9MTQ5Nj1zdGF0aWMgaW50IHRyeV90b19tZXJnZV9vbmVfcGFnZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbi0tXG5tbS9rc20uYy0xNTE4LVx0aWYgKGZvbGlvX3Rlc3RfbGFyZ2UoZm9saW8pKSB7XG5tbS9rc20uYzoxNTE5Olx0XHRpZiAoc3BsaXRfaHVnZV9wYWdlKHBhZ2UpKVxubW0va3NtLmMtMTUyMC1cdFx0XHRnb3RvIG91dF91bmxvY2s7XG4tLVxubW0va3NtLmM9MjI3Nj1zdGF0aWMgdm9pZCBjbXBfYW5kX21lcmdlX3BhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UsIHN0cnVjdCBrc21fcm1hcF9pdGVtICpybWFwX2l0ZW0pXG4tLVxubW0va3NtLmMtMjM2My1cdFx0ICogZm9saW8sIHRoZW4gd2UgYWN0dWFsbHkgZW5kZWQgdXAgaW5jcmVhc2luZyB0aGUgcmVmZXJlbmNlXG5tbS9rc20uYzoyMzY0Olx0XHQgKiBjb3VudCBvZiB0aGUgc2FtZSBmb2xpbyB0d2ljZSwgYW5kIHNwbGl0X2h1Z2VfcGFnZSBmYWlsZWQuXG5tbS9rc20uYy0yMzY1LVx0XHQgKlxubW0va3NtLmMtMjM2Ni1cdFx0ICogSGVyZSB3ZSBzZXQgYSBmbGFnIGlmIHRoYXQgaGFwcGVuZWQsIGFuZCB3ZSB1c2UgaXQgbGF0ZXIgdG9cbm1tL2tzbS5jOjIzNjc6XHRcdCAqIHRyeSBzcGxpdF9odWdlX3BhZ2UgYWdhaW4uIFNpbmNlIHdlIGNhbGwgZm9saW9fcHV0KCkgcmlnaHRcbm1tL2tzbS5jLTIzNjgtXHRcdCAqIGFmdGVyd2FyZHMsIHRoZSByZWZlcmVuY2UgY291bnQgd2lsbCBiZSBjb3JyZWN0IGFuZFxubW0va3NtLmM6MjM2OTpcdFx0ICogc3BsaXRfaHVnZV9wYWdlIHNob3VsZCBzdWNjZWVkLlxubW0va3NtLmMtMjM3MC1cdFx0ICovXG4tLVxubW0va3NtLmMtMjQwOS1cdFx0XHRcdHJldHVybjtcbm1tL2tzbS5jOjI0MTA6XHRcdFx0c3BsaXRfaHVnZV9wYWdlKHBhZ2UpO1xubW0va3NtLmMtMjQxMS1cdFx0XHRmb2xpbyA9IHBhZ2VfZm9saW8ocGFnZSk7XG4tLVxubW0vbWVtb3J5LWZhaWx1cmUuYz0xNzEzPXN0YXRpYyBpbnQgdHJ5X3RvX3NwbGl0X3RocF9wYWdlKHN0cnVjdCBwYWdlICpwYWdlLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyLFxuLS1cbm1tL21lbW9yeS1mYWlsdXJlLmMtMTcxOC1cdGxvY2tfcGFnZShwYWdlKTtcbm1tL21lbW9yeS1mYWlsdXJlLmM6MTcxOTpcdHJldCA9IHNwbGl0X2h1Z2VfcGFnZV90b19vcmRlcihwYWdlLCBuZXdfb3JkZXIpO1xubW0vbWVtb3J5LWZhaWx1cmUuYy0xNzIwLVx0dW5sb2NrX3BhZ2UocGFnZSk7XG4tLVxubW0vc2htZW0uYz0zNjIyPXN0YXRpYyBsb25nIHNobWVtX2ZhbGxvY2F0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgaW50IG1vZGUsIGxvZmZfdCBvZmZzZXQsXG4tLVxubW0vc2htZW0uYy0zNzEyLVx0ICogaW5mby1cdTAwM2VmYWxsb2NlbmQgaXMgb25seSByZWxldmFudCB3aGVuIGh1Z2UgcGFnZXMgbWlnaHQgYmVcbm1tL3NobWVtLmM6MzcxMzpcdCAqIGludm9sdmVkOiB0byBwcmV2ZW50IHNwbGl0X2h1Z2VfcGFnZSgpIGZyZWVpbmcgZmFsbG9jYXRlZFxubW0vc2htZW0uYy0zNzE0LVx0ICogcGFnZXMgd2hlbiBGQUxMT0NfRkxfS0VFUF9TSVpFIGNvbW1pdHRlZCBiZXlvbmQgaV9zaXplLlxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEzLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNyAyMTo1NDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxOTI1OQoJCQkJCQkJb3V0cHV0OiAzNAoJCQkJCQkJdGhvdWdodHM6IDIyMwoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgSHVnZSBQYWdlIFNwbGl0dGluZyBGdW5jdGlvbnMqKgoKT2theSwgc28gSSBuZWVkIHRvIHplcm8gaW4gb24gdGhlc2UgZnVuY3Rpb25zOiBgc3BsaXRfaHVnZV9wYWdlX3RvX2xpc3RfdG9fb3JkZXJgLCBgZm9saW9fc3BsaXRfdW5tYXBwZWRgLCBgX19zd2FwX2NhY2hlX3JlcGxhY2VfZm9saW9gLCBhbmQgYHNwbGl0X2ZvbGlvX3RvX2xpc3RgLiBJIHRoaW5rIGBzcGxpdF9odWdlX3BhZ2VfdG9fbGlzdF90b19vcmRlcmAgaXMgdGhlIHJpZ2h0IG5hbWUsIGJ1dCBJIHdhbnQgdG8gbWFrZSBhYnNvbHV0ZWx5IHN1cmUuIExldCBtZSBxdWlja2x5IHZlcmlmeSB0aGF0LiBIbW0sIHllcCwgdGhlcmUgaXQgaXMgaW4gYG1tL2h1Z2VfbWVtb3J5LmNgLgoKV2FpdCBhIG1pbnV0ZSwgdGhlIGBncmVwYCBvdXRwdXQgYWxzbyB0dXJuZWQgdXAgYHNwbGl0X2ZvbGlvX3RvX2xpc3RgLiBBbmQsIGhhbmcgb24sIHRoZXJlJiMzOTtzIGBfX3NwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyYCBhcyB3ZWxsISBPa2F5LCBjbGVhcmx5IEkgbmVlZCB0byBjbGFyaWZ5IHdoYXQgdGhlIHJlbGF0aW9uc2hpcCBpcyBiZXR3ZWVuIHRoZXNlIGZ1bmN0aW9ucy4gSXMgYHNwbGl0X2h1Z2VfcGFnZWAgcGVyaGFwcyBhIG1hY3JvIG9yIGlubGluZSBmdW5jdGlvbj8gTGV0JiMzOTtzIGNoZWNrIGBpbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaGAgZm9yIHRoYXQgZGVmaW5pdGlvbi4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDcgMjE6NTQ8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7c3BsaXRfaHVnZV9wYWdlJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7aW5jbHVkZS9saW51eC9odWdlX21tLmgmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7aW5jbHVkZS9saW51eC9odWdlX21tLmg9Mzk4PWVudW0gc3BsaXRfdHlwZSB7XG4tLVxuaW5jbHVkZS9saW51eC9odWdlX21tLmgtNDAyLVxuaW5jbHVkZS9saW51eC9odWdlX21tLmg6NDAzOmludCBfX3NwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyKHN0cnVjdCBwYWdlICpwYWdlLCBzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LFxuaW5jbHVkZS9saW51eC9odWdlX21tLmgtNDA0LVx0XHR1bnNpZ25lZCBpbnQgbmV3X29yZGVyKTtcbi0tXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaD00MTA9aW50IGZvbGlvX3NwbGl0KHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIsIHN0cnVjdCBwYWdlICpwYWdlLFxuLS1cbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oLTQxMi1cbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oOjQxMzpzdGF0aWMgaW5saW5lIGludCBzcGxpdF9odWdlX3BhZ2VfdG9fbGlzdF90b19vcmRlcihzdHJ1Y3QgcGFnZSAqcGFnZSwgc3RydWN0IGxpc3RfaGVhZCAqbGlzdCxcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oLTQxNC1cdFx0dW5zaWduZWQgaW50IG5ld19vcmRlcilcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oLTQxNS17XG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaDo0MTY6XHRyZXR1cm4gX19zcGxpdF9odWdlX3BhZ2VfdG9fbGlzdF90b19vcmRlcihwYWdlLCBsaXN0LCBuZXdfb3JkZXIpO1xuaW5jbHVkZS9saW51eC9odWdlX21tLmgtNDE3LX1cbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oOjQxODpzdGF0aWMgaW5saW5lIGludCBzcGxpdF9odWdlX3BhZ2VfdG9fb3JkZXIoc3RydWN0IHBhZ2UgKnBhZ2UsIHVuc2lnbmVkIGludCBuZXdfb3JkZXIpXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaC00MTkte1xuaW5jbHVkZS9saW51eC9odWdlX21tLmg6NDIwOlx0cmV0dXJuIHNwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyKHBhZ2UsIE5VTEwsIG5ld19vcmRlcik7XG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaC00MjEtfVxuaW5jbHVkZS9saW51eC9odWdlX21tLmgtNDIyLVxuaW5jbHVkZS9saW51eC9odWdlX21tLmg6NDIzOnN0YXRpYyBpbmxpbmUgaW50IHNwbGl0X2h1Z2VfcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSlcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oLTQyNC17XG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaDo0MjU6XHRyZXR1cm4gc3BsaXRfaHVnZV9wYWdlX3RvX2xpc3RfdG9fb3JkZXIocGFnZSwgTlVMTCwgMCk7XG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaC00MjYtfVxuLS1cbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oPTY0NT1zdGF0aWMgaW5saW5lIGludFxuaW5jbHVkZS9saW51eC9odWdlX21tLmg6NjQ2OnNwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyKHN0cnVjdCBwYWdlICpwYWdlLCBzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LFxuaW5jbHVkZS9saW51eC9odWdlX21tLmgtNjQ3LVx0XHR1bnNpZ25lZCBpbnQgbmV3X29yZGVyKVxuLS1cbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oLTY1MS19XG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaDo2NTI6c3RhdGljIGlubGluZSBpbnQgc3BsaXRfaHVnZV9wYWdlX3RvX29yZGVyKHN0cnVjdCBwYWdlICpwYWdlLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyKVxuaW5jbHVkZS9saW51eC9odWdlX21tLmgtNjUzLXtcbi0tXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaC02NTYtfVxuaW5jbHVkZS9saW51eC9odWdlX21tLmg6NjU3OnN0YXRpYyBpbmxpbmUgaW50IHNwbGl0X2h1Z2VfcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSlcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oLTY1OC17XG4tLVxuaW5jbHVkZS9saW51eC9odWdlX21tLmg9ODI2PXN0YXRpYyBpbmxpbmUgaW50IHNwbGl0X2ZvbGlvX3RvX29yZGVyKHN0cnVjdCBmb2xpbyAqZm9saW8sIGludCBuZXdfb3JkZXIpXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaC04Mjcte1xuaW5jbHVkZS9saW51eC9odWdlX21tLmg6ODI4Olx0cmV0dXJuIHNwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyKFx1MDAyNmZvbGlvLVx1MDAzZXBhZ2UsIE5VTEwsIG5ld19vcmRlcik7XG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaC04MjktfVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE1LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNyAyMTo1NDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyMDU4MQoJCQkJCQkJb3V0cHV0OiA0MQoJCQkJCQkJdGhvdWdodHM6IDEwNgoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgSHVnZSBQYWdlIFNwbGl0dGluZyBpbiB0aGUgS2VybmVsKioKCk9rYXksIHNvIEkmIzM5O20gZGl2aW5nIGludG8gdGhlIGh1Z2UgcGFnZSBzcGxpdHRpbmcgbWVjaGFuaXNtcyB3aXRoaW4gdGhlIGtlcm5lbCwgc3BlY2lmaWNhbGx5IGZvY3VzaW5nIG9uIHRoZSBjb3JlIGZ1bmN0aW9ucy4gTXkgaW5pdGlhbCBhc3Nlc3NtZW50IHBvaW50cyB0byBgX19zcGxpdF9odWdlX3BhZ2VfdG9fbGlzdF90b19vcmRlcmAgcmVzaWRpbmcgd2l0aGluIGBtbS9odWdlX21lbW9yeS5jYCBhcyB0aGUga2V5IGZ1bmN0aW9uIGZvciB0aGUgc3BsaXQgb3BlcmF0aW9uLiBJJiMzOTttIGFsc28gbm90aW5nIHRoYXQgYGZvbGlvX3NwbGl0X3VubWFwcGVkYCBpcyBhIGdsb2JhbCBmdW5jdGlvbiwgd2hpY2ggaXMgaW50ZXJlc3RpbmcgYXMgaXQgc3VnZ2VzdHMgaXRzIGF2YWlsYWJpbGl0eSBhY3Jvc3MgZGlmZmVyZW50IG1vZHVsZXMsIHdoaWNoIGltcGxpZXMgZ2VuZXJhbGl0eS4gYF9fc3dhcF9jYWNoZV9yZXBsYWNlX2ZvbGlvYCBpcyBhbHNvIGdsb2JhbGx5IGFjY2Vzc2libGUsIHdoaWNoIGluZGljYXRlcyBpdCYjMzk7cyBlc3NlbnRpYWwgZm9yIG1hbmFnaW5nIHBhZ2UgcmVwbGFjZW1lbnQgZHVyaW5nIHRoZSBzcGxpdCBvcGVyYXRpb25zLiBJJiMzOTttIGFsc28gYWRkaW5nIGBzcGxpdF9mb2xpb190b19saXN0YCB0byB0aGUgbGlzdCBvZiBnbG9iYWxseSBkZWZpbmVkIGZ1bmN0aW9ucy4KCk5vdywgSSYjMzk7bSBnb2luZyB0byBkaWcgZGVlcGVyIGludG8gdGhlIGFjdHVhbCBpbXBsZW1lbnRhdGlvbiBvZiBgX19zcGxpdF9odWdlX3BhZ2VfdG9fbGlzdF90b19vcmRlcmAgaW4gYG1tL2h1Z2VfbWVtb3J5LmNgIHRvIHNlZSBob3cgaXQgYWxsIHdvcmtzLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCBpdHMgbG9naWMuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTYvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA3IDIxOjU0PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O19fc3BsaXRfaHVnZV9wYWdlX3RvX2xpc3RfdG9fb3JkZXImIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDttbS9odWdlX21lbW9yeS5jJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O21tL2h1Z2VfbWVtb3J5LmM9NDMzNz1pbnQgZm9saW9fc3BsaXRfdW5tYXBwZWQoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlcilcbi0tXG5tbS9odWdlX21lbW9yeS5jLTQzOTQtICovXG5tbS9odWdlX21lbW9yeS5jOjQzOTU6aW50IF9fc3BsaXRfaHVnZV9wYWdlX3RvX2xpc3RfdG9fb3JkZXIoc3RydWN0IHBhZ2UgKnBhZ2UsIHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QsXG5tbS9odWdlX21lbW9yeS5jLTQzOTYtXHRcdFx0XHQgICAgIHVuc2lnbmVkIGludCBuZXdfb3JkZXIpXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTcvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA3IDIxOjU0PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDIxMDczCgkJCQkJCQlvdXRwdXQ6IDMwCgkJCQkJCQl0aG91Z2h0czogMTkKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGxldCYjMzk7cyBkaXZlIGludG8gdGhpcy4gSGVyZSYjMzk7cyBteSB0aG91Z2h0IHByb2Nlc3Mgb24gdGhlIG1hdHRlcjoKCioqQ2hlY2tpbmcgYGZvbGlvX3NwbGl0YCBpbiBgbW0vaHVnZV9tZW1vcnkuY2AqKgoKQWxyaWdodCwgdGhlIHRhc2sgYXQgaGFuZCBpcyB0byB1bmRlcnN0YW5kIGhvdyBgZm9saW9fc3BsaXRgIGlzIG9wZXJhdGluZyB3aXRoaW4gdGhlIGBtbS9odWdlX21lbW9yeS5jYCBmaWxlLiBNeSBleHBlcnQgaW50dWl0aW9uIGlzIHRlbGxpbmcgbWUgdGhhdCB0aGlzIGZ1bmN0aW9uIHBsYXlzIGEgY3J1Y2lhbCByb2xlIGluIG1hbmFnaW5nIGFuZCBwb3NzaWJseSBzcGxpdHRpbmcgaHVnZSBwYWdlcywgd2hpY2ggaXMgYSBjb3JlIGZ1bmN0aW9uYWxpdHkgZm9yIG9wdGltaXplZCBtZW1vcnkgdXRpbGl6YXRpb24uIEkgbmVlZCB0byByZWZyZXNoIG15IG1lbW9yeSBvbiB0aGUgaW50cmljYWNpZXMgb2YgdGhlIGh1Z2UgcGFnZSBpbXBsZW1lbnRhdGlvbiB3aXRoaW4gdGhlIGtlcm5lbCYjMzk7cyBtZW1vcnkgbWFuYWdlbWVudCBzeXN0ZW0sIHBhcnRpY3VsYXJseSB3aGVyZSBgZm9saW9fc3BsaXRgIGZpdHMgaW50byB0aGF0IHdvcmtmbG93LiBTbywgSSB3aWxsIGZvY3VzIG9uIHJldmlld2luZyB0aGUgbG9naWMgdG8gY29tcHJlaGVuZCBob3cgYGZvbGlvX3NwbGl0YCBkZWFscyB3aXRoIHRoZSBwYXJ0aXRpb25pbmcgb2YgaHVnZSBwYWdlcyBpbnRvIHNtYWxsZXIgb25lcywgcG90ZW50aWFsbHkgZm9yIGltcHJvdmVkIG1lbW9yeSBhbGxvY2F0aW9uIGZsZXhpYmlsaXR5IG9yIHRvIGRlYWwgd2l0aCBmcmFnbWVudGF0aW9uLiBJJiMzOTtsbCBiZSBsb29raW5nIGZvciBkZXRhaWxzIHJlZ2FyZGluZyBsb2NraW5nIG1lY2hhbmlzbXMsIHJlZmNvdW50IG1hbmFnZW1lbnQsIGFuZCB0aGUgb3ZlcmFsbCBpbXBhY3Qgb2YgdGhlIHNwbGl0IG9uIHRoZSBwYWdlIHRhYmxlcyBhbmQgdGhlIGFzc29jaWF0ZWQgbWV0YWRhdGEuIEkgZXhwZWN0IHRvIHNlZSBpbnRlcmFjdGlvbnMgd2l0aCB0aGUgZm9saW8gc3RydWN0dXJlcywgcGFnZSBmbGFncywgYW5kIHBvdGVudGlhbGx5IHRoZSByYWRpeCB0cmVlLCBzbyBJJiMzOTtsbCBiZSBwYXlpbmcgY2xvc2UgYXR0ZW50aW9uIHRvIHRoZXNlIGVsZW1lbnRzIGFzIEkgcmVhZCB0aHJvdWdoIHRoZSByZWxldmFudCBjb2RlLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE4LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNyAyMTo1NDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtmb2xpb19zcGxpdCYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O21tL2h1Z2VfbWVtb3J5LmMmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bW0vaHVnZV9tZW1vcnkuYz0zNzk1PXN0YXRpYyBpbnQgX19zcGxpdF91bm1hcHBlZF9mb2xpbyhzdHJ1Y3QgZm9saW8gKmZvbGlvLCBpbnQgbmV3X29yZGVyLFxuLS1cbm1tL2h1Z2VfbWVtb3J5LmMtMzgzOC1cbm1tL2h1Z2VfbWVtb3J5LmM6MzgzOTpcdFx0Zm9saW9fc3BsaXRfbWVtY2dfcmVmcyhmb2xpbywgb2xkX29yZGVyLCBzcGxpdF9vcmRlcik7XG5tbS9odWdlX21lbW9yeS5jLTM4NDAtXHRcdHNwbGl0X3BhZ2Vfb3duZXIoXHUwMDI2Zm9saW8tXHUwMDNlcGFnZSwgb2xkX29yZGVyLCBzcGxpdF9vcmRlcik7XG4tLVxubW0vaHVnZV9tZW1vcnkuYz00MDYwPXN0YXRpYyBpbnQgX19mb2xpb19mcmVlemVfc3BsaXRfdW5tYXBfZmlsZShzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyLFxuLS1cbm1tL2h1Z2VfbWVtb3J5LmMtNDIyNi0vKipcbm1tL2h1Z2VfbWVtb3J5LmM6NDIyNzogKiBfX2ZvbGlvX3NwbGl0KCkgLSBzcGxpdCBhIGZvbGlvIGF0IEBzcGxpdF9hdCB0byBhIEBuZXdfb3JkZXIgZm9saW9cbm1tL2h1Z2VfbWVtb3J5LmMtNDIyOC0gKiBAZm9saW86IGZvbGlvIHRvIHNwbGl0XG4tLVxubW0vaHVnZV9tZW1vcnkuYy00MjQ2LSAqL1xubW0vaHVnZV9tZW1vcnkuYzo0MjQ3OnN0YXRpYyBpbnQgX19mb2xpb19zcGxpdChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyLFxubW0vaHVnZV9tZW1vcnkuYy00MjQ4LVx0XHRzdHJ1Y3QgcGFnZSAqc3BsaXRfYXQsIHN0cnVjdCBwYWdlICpsb2NrX2F0LFxuLS1cbm1tL2h1Z2VfbWVtb3J5LmMtNDMxNS0vKipcbm1tL2h1Z2VfbWVtb3J5LmM6NDMxNjogKiBmb2xpb19zcGxpdF91bm1hcHBlZCgpIC0gc3BsaXQgYSBsYXJnZSBhbm9uIGZvbGlvIHRoYXQgaXMgYWxyZWFkeSB1bm1hcHBlZFxubW0vaHVnZV9tZW1vcnkuYy00MzE3LSAqIEBmb2xpbzogZm9saW8gdG8gc3BsaXRcbi0tXG5tbS9odWdlX21lbW9yeS5jLTQzMzYtICovXG5tbS9odWdlX21lbW9yeS5jOjQzMzc6aW50IGZvbGlvX3NwbGl0X3VubWFwcGVkKHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIpXG5tbS9odWdlX21lbW9yeS5jLTQzMzgte1xuLS1cbm1tL2h1Z2VfbWVtb3J5LmM9NDM5NT1pbnQgX19zcGxpdF9odWdlX3BhZ2VfdG9fbGlzdF90b19vcmRlcihzdHJ1Y3QgcGFnZSAqcGFnZSwgc3RydWN0IGxpc3RfaGVhZCAqbGlzdCxcbi0tXG5tbS9odWdlX21lbW9yeS5jLTQzOTktXG5tbS9odWdlX21lbW9yeS5jOjQ0MDA6XHRyZXR1cm4gX19mb2xpb19zcGxpdChmb2xpbywgbmV3X29yZGVyLCBcdTAwMjZmb2xpby1cdTAwM2VwYWdlLCBwYWdlLCBsaXN0LFxubW0vaHVnZV9tZW1vcnkuYy00NDAxLVx0XHRcdCAgICAgU1BMSVRfVFlQRV9VTklGT1JNKTtcbi0tXG5tbS9odWdlX21lbW9yeS5jLTQ0MDQtLyoqXG5tbS9odWdlX21lbW9yeS5jOjQ0MDU6ICogZm9saW9fc3BsaXQoKSAtIHNwbGl0IGEgZm9saW8gYXQgQHNwbGl0X2F0IHRvIGEgQG5ld19vcmRlciBmb2xpb1xubW0vaHVnZV9tZW1vcnkuYy00NDA2LSAqIEBmb2xpbzogZm9saW8gdG8gc3BsaXRcbi0tXG5tbS9odWdlX21lbW9yeS5jLTQ0MjctICovXG5tbS9odWdlX21lbW9yeS5jOjQ0Mjg6aW50IGZvbGlvX3NwbGl0KHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIsXG5tbS9odWdlX21lbW9yeS5jLTQ0MjktXHRcdHN0cnVjdCBwYWdlICpzcGxpdF9hdCwgc3RydWN0IGxpc3RfaGVhZCAqbGlzdClcbm1tL2h1Z2VfbWVtb3J5LmMtNDQzMC17XG5tbS9odWdlX21lbW9yeS5jOjQ0MzE6XHRyZXR1cm4gX19mb2xpb19zcGxpdChmb2xpbywgbmV3X29yZGVyLCBzcGxpdF9hdCwgXHUwMDI2Zm9saW8tXHUwMDNlcGFnZSwgbGlzdCxcbm1tL2h1Z2VfbWVtb3J5LmMtNDQzMi1cdFx0XHQgICAgIFNQTElUX1RZUEVfTk9OX1VOSUZPUk0pO1xuLS1cbm1tL2h1Z2VfbWVtb3J5LmM9NDc0OD1zdGF0aWMgaW50IHNwbGl0X2h1Z2VfcGFnZXNfcGlkKGludCBwaWQsIHVuc2lnbmVkIGxvbmcgdmFkZHJfc3RhcnQsXG4tLVxubW0vaHVnZV9tZW1vcnkuYy00ODQwLVx0XHRcdFx0XHRcdFx0ICAgaW5fZm9saW9fb2Zmc2V0KTtcbm1tL2h1Z2VfbWVtb3J5LmM6NDg0MTpcdFx0XHRpZiAoIWZvbGlvX3NwbGl0KGZvbGlvLCB0YXJnZXRfb3JkZXIsIHNwbGl0X2F0LCBOVUxMKSlcbm1tL2h1Z2VfbWVtb3J5LmMtNDg0Mi1cdFx0XHRcdHNwbGl0JiM0MzsmIzQzOztcbi0tXG5tbS9odWdlX21lbW9yeS5jPTQ4NjU9c3RhdGljIGludCBzcGxpdF9odWdlX3BhZ2VzX2luX2ZpbGUoY29uc3QgY2hhciAqZmlsZV9wYXRoLCBwZ29mZl90IG9mZl9zdGFydCxcbi0tXG5tbS9odWdlX21lbW9yeS5jLTQ5MTYtXHRcdFx0XHRcdFx0XHQgICBpbl9mb2xpb19vZmZzZXQpO1xubW0vaHVnZV9tZW1vcnkuYzo0OTE3Olx0XHRcdGlmICghZm9saW9fc3BsaXQoZm9saW8sIHRhcmdldF9vcmRlciwgc3BsaXRfYXQsIE5VTEwpKVxubW0vaHVnZV9tZW1vcnkuYy00OTE4LVx0XHRcdFx0c3BsaXQmIzQzOyYjNDM7O1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE5LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNyAyMTo1NDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyMjQwMQoJCQkJCQkJb3V0cHV0OiAzMgoJCQkJCQkJdGhvdWdodHM6IDM0CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBoZXJlJiMzOTtzIG15IHRha2Ugb24gdGhvc2UgdGhvdWdodHMsIHRhaWxvcmVkIGZvciBhbiBleHBlcnQgYXVkaWVuY2U6CgoqKkFuYWx5emluZyB0aGUgR2xvYmFsIFNjb3BlIG9mIGBmb2xpb19zcGxpdGAqKgoKQWxyaWdodCwgc28gSSYjMzk7bSBkZWFsaW5nIHdpdGggdGhlIGBmb2xpb19zcGxpdGAgZnVuY3Rpb24uIEkgcmVtZW1iZXIgaXQmIzM5O3MgYSBnbG9iYWwgZnVuY3Rpb24sIG1lYW5pbmcgaXQmIzM5O3MgbGlrZWx5IGFjY2Vzc2libGUgZnJvbSB2YXJpb3VzIHBhcnRzIG9mIHRoZSBrZXJuZWwuIFRoaXMgaW1tZWRpYXRlbHkgbWFrZXMgbWUgdGhpbmsgYWJvdXQgcG90ZW50aWFsIGNyb3NzLW1vZHVsZSBkZXBlbmRlbmNpZXMgYW5kIHRoZSBvdmVyYWxsIGltcGFjdCBvZiBtb2RpZmljYXRpb25zLiBNeSBuZXh0IHN0ZXAgaXMgY2xlYXIuIEkgbmVlZCB0byB6ZXJvIGluIG9uIGl0cyBkZWZpbml0aW9uIGFuZCB1bmRlcnN0YW5kIGl0cyBwcmVjaXNlIGJlaGF2aW9yLiBTcGVjaWZpY2FsbHksIEkmIzM5O20gZ29pbmcgdG8gbG9vayBhdCBgZm9saW9fc3BsaXRgIGluIGBpbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaGAuIFRoYXQgaGVhZGVyIGZpbGUgaXMgYSBwcmltZSBjYW5kaWRhdGUgZm9yIGRlZmluaW5nIGNvcmUgZm9saW8gb3BlcmF0aW9ucyBhbmQgc3RydWN0dXJlcy4gVGhpcyB3aWxsIGdpdmUgbWUgYSBzb2xpZCBmb3VuZGF0aW9uIGZvciB1bmRlcnN0YW5kaW5nIHRoZSBzY29wZSBvZiB3aGF0IEkmIzM5O20gZGVhbGluZyB3aXRoLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIwLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNyAyMTo1NDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtmb2xpb19zcGxpdCYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O2luY2x1ZGUvbGludXgvaHVnZV9tbS5oJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2luY2x1ZGUvbGludXgvaHVnZV9tbS5oPTQwMz1pbnQgX19zcGxpdF9odWdlX3BhZ2VfdG9fbGlzdF90b19vcmRlcihzdHJ1Y3QgcGFnZSAqcGFnZSwgc3RydWN0IGxpc3RfaGVhZCAqbGlzdCxcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oLTQwNC1cdFx0dW5zaWduZWQgaW50IG5ld19vcmRlcik7XG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaDo0MDU6aW50IGZvbGlvX3NwbGl0X3VubWFwcGVkKHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIpO1xuaW5jbHVkZS9saW51eC9odWdlX21tLmgtNDA2LXVuc2lnbmVkIGludCBtaW5fb3JkZXJfZm9yX3NwbGl0KHN0cnVjdCBmb2xpbyAqZm9saW8pO1xuLS1cbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oPTQwOD1pbnQgZm9saW9fY2hlY2tfc3BsaXR0YWJsZShzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyLFxuaW5jbHVkZS9saW51eC9odWdlX21tLmgtNDA5LVx0XHRcdCAgIGVudW0gc3BsaXRfdHlwZSBzcGxpdF90eXBlKTtcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oOjQxMDppbnQgZm9saW9fc3BsaXQoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlciwgc3RydWN0IHBhZ2UgKnBhZ2UsXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaC00MTEtXHRcdHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QpO1xuLS1cbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oPTY2OT1zdGF0aWMgaW5saW5lIGludCBzcGxpdF9mb2xpb190b19saXN0KHN0cnVjdCBmb2xpbyAqZm9saW8sIHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QpXG4tLVxuaW5jbHVkZS9saW51eC9odWdlX21tLmgtNjc0LVxuaW5jbHVkZS9saW51eC9odWdlX21tLmg6Njc1OnN0YXRpYyBpbmxpbmUgaW50IGZvbGlvX3NwbGl0KHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIsXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaC02NzYtXHRcdHN0cnVjdCBwYWdlICpwYWdlLCBzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0KVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIxLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNyAyMTo1NDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyMzAxNQoJCQkJCQkJb3V0cHV0OiAzNAoJCQkJCQkJdGhvdWdodHM6IDE0OAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgSHVnZSBQYWdlIFNwbGl0dGluZyoqCgpPa2F5LCBzbyBJIG5lZWQgdG8gemVybyBpbiBvbiB0aGUgZnVuY3Rpb25zIHJlbGF0ZWQgdG8gc3BsaXR0aW5nIGh1Z2UgcGFnZXMuIEZyb20gd2hhdCBJIGNhbiBzZWUsIHRoZSBjb3JlIG9uZXMgc2VlbSB0byBiZSBgX19zcGxpdF9odWdlX3BhZ2VfdG9fbGlzdF90b19vcmRlcmAsIGBmb2xpb19zcGxpdGAsIGBmb2xpb19zcGxpdF91bm1hcHBlZGAsIGFuZCBgX19zd2FwX2NhY2hlX3JlcGxhY2VfZm9saW9gLiBUaG9zZSBhcmUgZGVmaW5pdGVseSB0aGUgY3J1Y2lhbCBwaWVjZXMgb2YgdGhlIHB1enpsZS4KCk5vdywgbGV0JiMzOTtzIGp1c3QgbWFrZSBzdXJlIEkgaGF2ZW4mIzM5O3QgbWlzc2VkIGFueSByZWxldmFudCBjb25maWd1cmF0aW9uIG9wdGlvbnMuIEkmIzM5O20gYWxyZWFkeSBmYW1pbGlhciB3aXRoIGBUUkFOU1BBUkVOVF9IVUdFUEFHRWAsIG9idmlvdXNseSwgYnV0IEkmIzM5O2xsIG1ha2UgYSBxdWljayBtZW50YWwgbm90ZSBvZiBgU1dBUGAgYXMgd2VsbCDigJMgYWx3YXlzIGdvb2QgdG8ga2VlcCB0aG9zZSBkZXBlbmRlbmNpZXMgaW4gbWluZC4KClJpZ2h0LCBuZXh0IHN0ZXAuIEkgc2hvdWxkIHJlYWxseSBjaGVjayBob3cgYGZvbGlvX2NoZWNrX3NwbGl0dGFibGVgIHdvcmtzLiBJcyBpdCBleHBvcnRlZD8gSG1tLCB5ZXAsIGxvb2tzIGxpa2UgaXQmIzM5O3MgZGVmaW5lZCBpbiBgaW5jbHVkZS9saW51eC9odWdlX21tLmhgLiBUaGF0IG1ha2VzIHRoaW5ncyBlYXNpZXIuIE5vdywgdG8gdW5kZXJzdGFuZCB0aGUgYWN0dWFsIGltcGxlbWVudGF0aW9uLCBJIHNob3VsZCBmaW5kIHdoZXJlIGBmb2xpb19jaGVja19zcGxpdHRhYmxlYCBpcyBkZWZpbmVkLiBJIGJldCBpdCYjMzk7cyBpbiBgbW0vaHVnZV9tZW1vcnkuY2AsIHNvIEkmIzM5O2xsIGdvIHRoZXJlIGFuZCBzdGFydCB0aGVyZS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yMi8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDcgMjE6NTQ8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7Zm9saW9fY2hlY2tfc3BsaXR0YWJsZSYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O21tL2h1Z2VfbWVtb3J5LmMmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bW0vaHVnZV9tZW1vcnkuYz0zNzk1PXN0YXRpYyBpbnQgX19zcGxpdF91bm1hcHBlZF9mb2xpbyhzdHJ1Y3QgZm9saW8gKmZvbGlvLCBpbnQgbmV3X29yZGVyLFxuLS1cbm1tL2h1Z2VfbWVtb3J5LmMtMzg2MC0vKipcbm1tL2h1Z2VfbWVtb3J5LmM6Mzg2MTogKiBmb2xpb19jaGVja19zcGxpdHRhYmxlKCkgLSBjaGVjayBpZiBhIGZvbGlvIGNhbiBiZSBzcGxpdCB0byBhIGdpdmVuIG9yZGVyXG5tbS9odWdlX21lbW9yeS5jLTM4NjItICogQGZvbGlvOiBmb2xpbyB0byBiZSBzcGxpdFxuLS1cbm1tL2h1Z2VfbWVtb3J5LmMtMzg2Ny0gKlxubW0vaHVnZV9tZW1vcnkuYzozODY4OiAqIGZvbGlvX2NoZWNrX3NwbGl0dGFibGUoKSBjaGVja3MgaWYgQGZvbGlvIGNhbiBiZSBzcGxpdCB0byBAbmV3X29yZGVyIHVzaW5nXG5tbS9odWdlX21lbW9yeS5jLTM4NjktICogQHNwbGl0X3R5cGUgbWV0aG9kLiBUaGUgdHJ1bmNhdGVkIGZvbGlvIGNoZWNrIG11c3QgY29tZSBmaXJzdC5cbi0tXG5tbS9odWdlX21lbW9yeS5jLTM4NzUtICovXG5tbS9odWdlX21lbW9yeS5jOjM4NzY6aW50IGZvbGlvX2NoZWNrX3NwbGl0dGFibGUoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlcixcbm1tL2h1Z2VfbWVtb3J5LmMtMzg3Ny1cdFx0XHQgICBlbnVtIHNwbGl0X3R5cGUgc3BsaXRfdHlwZSlcbi0tXG5tbS9odWdlX21lbW9yeS5jPTQyNDc9c3RhdGljIGludCBfX2ZvbGlvX3NwbGl0KHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIsXG4tLVxubW0vaHVnZV9tZW1vcnkuYy00MjcwLVxubW0vaHVnZV9tZW1vcnkuYzo0MjcxOlx0cmV0ID0gZm9saW9fY2hlY2tfc3BsaXR0YWJsZShmb2xpbywgbmV3X29yZGVyLCBzcGxpdF90eXBlKTtcbm1tL2h1Z2VfbWVtb3J5LmMtNDI3Mi1cdGlmIChyZXQpIHtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yMy8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDcgMjE6NTQ8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMjM4MzIKCQkJCQkJCW91dHB1dDogMzIKCQkJCQkJCXRob3VnaHRzOiAyMjkKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqTXkgQW5hbHlzaXMgb2YgdGhlIEZvbGlvIFNwbGl0dGluZyBGdW5jdGlvbnMqKgoKT2theSwgc28gSSYjMzk7bSBsb29raW5nIGF0IHRoaXMgY29kZSBhbmQgdHJ5aW5nIHRvIGdldCBhIGhhbmRsZSBvbiB0aGUga2V5IGZ1bmN0aW9ucyBoZXJlLCBwYXJ0aWN1bGFybHkgZm9yIGZ1enppbmcuIEkgY2FuIHNlZSB0aGF0IHRoaXMgZnVuY3Rpb24sIHdoaWxlIGV4cG9ydGVkLCBpcyBlc3NlbnRpYWxseSBhIGhlbHBlciBmdW5jdGlvbi4gVGhlIHJlYWwgd29ya2hvcnNlcyBzZWVtIHRvIGJlIGBmb2xpb19zcGxpdGAsIGBmb2xpb19zcGxpdF91bm1hcHBlZGAsIGFuZCBgX19zcGxpdF9odWdlX3BhZ2VfdG9fbGlzdF90b19vcmRlcmAuIE15IGluaXRpYWwgdGhvdWdodCBpcyB0byBmb2N1cyBvbiB0aG9zZS4KCk5vdywgbGV0IG1lIGp1c3QgY29uZmlybSBzb21ldGhpbmcuLi4gYWgsIHllcy4gYHNwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyYCBpcyBhbiBpbmxpbmUgZnVuY3Rpb24sIGFuZCBpdCYjMzk7cyBjYWxsaW5nIGBfX3NwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyYC4gU2luY2UgaXQmIzM5O3MgaW5saW5lLCBhbmQgdGhpcyBpcyB0aGUgb25lIGFjdHVhbGx5ICpkb2luZyogdGhlIHdvcmssIGxldCYjMzk7cyB0YXJnZXQgYF9fc3BsaXRfaHVnZV9wYWdlX3RvX2xpc3RfdG9fb3JkZXJgIGluc3RlYWQgb2YgaXRzIGlubGluZWQgY291bnRlcnBhcnQuCgpJIHNlZSB0aGF0IGBzcGxpdF9mb2xpb190b19saXN0YCBpcyBhbHNvIGlubGluZSwgYW5kIGl0IGNhbGxzIGBzcGxpdF9odWdlX3BhZ2VfdG9fbGlzdF90b19vcmRlcmAuIE9rYXksIHRoYXQgY2xhcmlmaWVzIHRoaW5ncy4KClNvLCBoZXJlJiMzOTtzIG15IHVwZGF0ZWQgbGlzdCBvZiBmdW5jdGlvbnMgdG8gZnV6ejoKCiogICBgX19zcGxpdF9odWdlX3BhZ2VfdG9fbGlzdF90b19vcmRlcmAgLSBUaGlzIGlzIGEgcHJpbWFyeSBjYW5kaWRhdGUuCiogICBgZm9saW9fc3BsaXRgIC0gSXQmIzM5O3MgYSBtYWluIGVudHJ5IHBvaW50LgoqICAgYGZvbGlvX3NwbGl0X3VubWFwcGVkYCAtIEFub3RoZXIgbWFpbiBlbnRyeSBwb2ludC4KKiAgIGBfX3N3YXBfY2FjaGVfcmVwbGFjZV9mb2xpb2AgLSBXZSBzaG91bGQgbG9vayBhdCB0aGlzIGFzIHdlbGwuCgpOb3csIGxldCYjMzk7cyBzZWUgaWYgYF9fc3dhcF9jYWNoZV9yZXBsYWNlX2ZvbGlvYCBpcyBhY3R1YWxseSBleHBvcnRlZC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yNC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDcgMjE6NTU8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPkVycm9yOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bm8gbWF0Y2hlczwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtFWFBPUlRfU1lNQk9MLipfX3N3YXBfY2FjaGVfcmVwbGFjZV9mb2xpbyYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0OyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtlcnJvciYjMzQ7OiAmIzM0O25vIG1hdGNoZXMmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjUvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA3IDIxOjU1PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDI0NDY3CgkJCQkJCQlvdXRwdXQ6IDM1CgkJCQkJCQl0aG91Z2h0czogNDIKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGhlcmUmIzM5O3MgbXkgdGFrZSBvbiB0aG9zZSB0aG91Z2h0cywgZnJhbWVkIGFzIG15IG93bjoKCioqQW5hbHl6aW5nIGEgRnVuY3Rpb24mIzM5O3MgU2NvcGUqKgoKQWxyaWdodCwgc28gdGhlIGZ1bmN0aW9uIGluIHF1ZXN0aW9uIGlzbiYjMzk7dCBleHBsaWNpdGx5IGV4cG9ydGVkLCBidXQgaXQmIzM5O3MgZGVmaW5lZCBnbG9iYWxseSDigJMgdGhhdCYjMzk7cyB0aGUga2V5LiBTbywgc2luY2UgaXQgaXNuJiMzOTt0IHN0YXRpYywgaXQmIzM5O3MgZ2xvYmFsbHkgdmlzaWJsZSB3aXRoaW4gdGhlIGtlcm5lbCwgZXZlbiBpZiBpdCYjMzk7cyBub3QgcGFydCBvZiB0aGUgc3RhbmRhcmQgQUJJLiBOb3csIEkgbmVlZCB0byB1bmRlcnN0YW5kIGl0cyByZWxhdGlvbnNoaXAgdG8gdGhlIHN3YXAgY2FjaGUuIFNpbmNlIHRoaXMgbG9va3MgbGlrZSBhIHN3YXAtcmVsYXRlZCBmdW5jdGlvbiwgbXkgaW50dWl0aW9uIGltbWVkaWF0ZWx5IHBvaW50cyBtZSB0b3dhcmQgYG1tL3N3YXBfc3RhdGUuY2AuIExldCYjMzk7cyBkaWcgaW50byB0aGF0IHNvdXJjZSBmaWxlIGFuZCBsb29rIGZvciB0aGUgZnVuY3Rpb24gYF9fc3dhcF9jYWNoZV9yZXBsYWNlX2ZvbGlvYC4gVGhhdCBzaG91bGQgZ2l2ZSBtZSB0aGUgY29udGV4dCBJIG5lZWQgdG8gZmlndXJlIG91dCBpdHMgcHVycG9zZS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yNi8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDcgMjE6NTU8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7X19zd2FwX2NhY2hlX3JlcGxhY2VfZm9saW8mIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDttbS9zd2FwX3N0YXRlLmMmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bW0vc3dhcF9zdGF0ZS5jPTMzNT12b2lkIHN3YXBfY2FjaGVfZGVsX2ZvbGlvKHN0cnVjdCBmb2xpbyAqZm9saW8pXG4tLVxubW0vc3dhcF9zdGF0ZS5jLTM0Ny0vKipcbm1tL3N3YXBfc3RhdGUuYzozNDg6ICogX19zd2FwX2NhY2hlX3JlcGxhY2VfZm9saW8gLSBSZXBsYWNlIGEgZm9saW8gaW4gdGhlIHN3YXAgY2FjaGUuXG5tbS9zd2FwX3N0YXRlLmMtMzQ5LSAqIEBjaTogVGhlIGxvY2tlZCBzd2FwIGNsdXN0ZXIuXG4tLVxubW0vc3dhcF9zdGF0ZS5jLTM2MC0gKi9cbm1tL3N3YXBfc3RhdGUuYzozNjE6dm9pZCBfX3N3YXBfY2FjaGVfcmVwbGFjZV9mb2xpbyhzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpLFxubW0vc3dhcF9zdGF0ZS5jLTM2Mi1cdFx0XHRcdHN0cnVjdCBmb2xpbyAqb2xkLCBzdHJ1Y3QgZm9saW8gKm5ldylcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yNy8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDcgMjE6NTU8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMjQ4ODIKCQkJCQkJCW91dHB1dDogMzMKCQkJCQkJCXRob3VnaHRzOiA4MgoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgaGVyZSYjMzk7cyBteSBpbnRlcnByZXRhdGlvbiBvZiB0aGVzZSB0aG91Z2h0cywgcHV0dGluZyBteXNlbGYgaW4gdGhlIHJvbGUgb2YgYW4gZXhwZXJ0OgoKKipJbnZlc3RpZ2F0aW5nIHRoZSBTY29wZSBhbmQgRGVwZW5kZW5jaWVzKioKCkFscmlnaHQsIHNvIHRoaXMgbG9va3MgbGlrZSBhIGdsb2JhbCBmdW5jdGlvbiwgYSBrZXkgcGllY2Ugb2YgaW5mcmFzdHJ1Y3R1cmUuIEZpcnN0IHRoaW5ncyBmaXJzdCwgSSBuZWVkIHRvIHVuZGVyc3RhbmQgaXRzIGNvbnRleHQuIExldCYjMzk7cyBzZWUuLi4gSSBzaG91bGQgY2hlY2sgZm9yIG90aGVyIHJlbGF0ZWQgY29uZmlndXJhdGlvbnMuIE15IG1lbnRhbCBjaGVja2xpc3Qga2lja3MgaW46IEkmIzM5O20gdGhpbmtpbmcgYWJvdXQgdGhlIGltcGxpY2F0aW9ucyBvZiB0aGUgYENPTkZJR19UUkFOU1BBUkVOVF9IVUdFUEFHRWAsIHNpbmNlIHRoaXMgY291bGQgaW5mbHVlbmNlIG1lbW9yeSBtYW5hZ2VtZW50IHNpZ25pZmljYW50bHkuIFRoZW4sIHRoZSBwcmVzZW5jZSBvZiBgQ09ORklHX1NXQVBgIGRlZmluaXRlbHkgYmVhcnMgd2F0Y2hpbmcuIEZpbmFsbHksIHRoZSB1c2Ugb2YgYG1lbV9jZ3JvdXBfZnJvbV9mb2xpb2AgYW5kIGBzZXRfYWN0aXZlX21lbWNnYCBpcyB0aGUgbW9zdCBpbXBvcnRhbnQgcGFydCBvZiB0aGlzIGZ1bmN0aW9uLiBUaGlzIGZ1bmN0aW9uIGFic29sdXRlbHkgc2NyZWFtcyBgQ09ORklHX01FTUNHYCBkZXBlbmRlbmN5IHRvIG1lLiBNeSBpbnR1aXRpb24gaXMgdGhhdCB0aGlzIGlzIGFic29sdXRlbHkgYSBkZXBlbmRlbmN5LiBMZXQmIzM5O3MgZGlnIGRlZXBlciBhbmQgdmVyaWZ5IHRoYXQgYE1FTUNHYCBjb25maWd1cmF0aW9uIGlzIGFjdHVhbGx5IG5lY2Vzc2FyeSBhbmQgbm90IGp1c3QgYSBsZWZ0b3ZlciB0cmFjZS4gVW5kZXJzdGFuZGluZyAqdGhpcyogaXMgdGhlIG1vc3QgaW1wb3J0YW50IHRoaW5nLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI4LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNyAyMTo1NTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtzZXRfYWN0aXZlX21lbWNnJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7bW0vaHVnZV9tZW1vcnkuYyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDttbS9odWdlX21lbW9yeS5jPTQwNjA9c3RhdGljIGludCBfX2ZvbGlvX2ZyZWV6ZV9zcGxpdF91bm1hcF9maWxlKHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIsXG4tLVxubW0vaHVnZV9tZW1vcnkuYy00MDg1LVx0bWVtY2cgPSBnZXRfbWVtX2Nncm91cF9mcm9tX2ZvbGlvKGZvbGlvKTtcbm1tL2h1Z2VfbWVtb3J5LmM6NDA4NjpcdG9sZF9tZW1jZyA9IHNldF9hY3RpdmVfbWVtY2cobWVtY2cpO1xubW0vaHVnZV9tZW1vcnkuYy00MDg3LVxuLS1cbm1tL2h1Z2VfbWVtb3J5LmMtNDIxOS1cdC8qIFJlc3RvcmUgdGhlIHByZXZpb3VzbHkgYWN0aXZlIG1lbWNnICovXG5tbS9odWdlX21lbW9yeS5jOjQyMjA6XHRzZXRfYWN0aXZlX21lbWNnKG9sZF9tZW1jZyk7XG5tbS9odWdlX21lbW9yeS5jLTQyMjEtXHRtZW1fY2dyb3VwX3B1dChtZW1jZyk7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjkvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA3IDIxOjU1PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDI1NDEzCgkJCQkJCQlvdXRwdXQ6IDM0CgkJCQkJCQl0aG91Z2h0czogNDIKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGhlcmUmIzM5O3MgbXkgdGFrZSBvbiB0aG9zZSB0aG91Z2h0cywgZnJhbWVkIGFzIG15IG93bjoKCioqSW52ZXN0aWdhdGluZyBhIFBvdGVudGlhbCBOby1PcCoqCgpIbW0sIEkgc2VlIHRoaXMgZnVuY3Rpb24gY2FsbC4gSXQgKmxvb2tzKiBsaWtlIGl0JiMzOTtzIGJlaW5nIHVzZWQsIGJ1dCBJJiMzOTt2ZSBnb3QgYSBmZWVsaW5nIGl0IG1pZ2h0IGp1c3QgYmUgYSBuby1vcCB1bmRlciBjZXJ0YWluIGNvbmZpZ3VyYXRpb25zLiBNeSBndXQgdGVsbHMgbWUgaXQmIzM5O3MgcHJvYmFibHkgdGllZCB0byBtZW1vcnkgY29udHJvbCBncm91cHMsIG9yIGBDT05GSUdfTUVNQ0dgLiBMZXQgbWUgcXVpY2tseSBjb25maXJtIHRoaXMgaHlwb3RoZXNpcy4gVGhlIGRlZmluaXRpb25zIGZvciB0aGlzIGtpbmQgb2YgdGhpbmcgYWx3YXlzIHJlc2lkZSBpbiBgaW5jbHVkZS9saW51eC9tZW1jb250cm9sLmhgLiBUaW1lIHRvIGRpZyBpbiB0aGVyZSBhbmQgc2VlIGlmIG15IGh1bmNoIGlzIGNvcnJlY3QuIEkgYmV0IGl0JiMzOTtzIGNvbmRpdGlvbmFsbHkgY29tcGlsZWQuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzAvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA3IDIxOjU1PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O3NldF9hY3RpdmVfbWVtY2cmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtpbmNsdWRlL2xpbnV4L21lbWNvbnRyb2wuaCYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtpbmNsdWRlL2xpbnV4L21lbWNvbnRyb2wuaD0xNzM2PXZvaWQgX19tZW1jZ19rbWVtX3VuY2hhcmdlX3BhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UsIGludCBvcmRlcik7XG4tLVxuaW5jbHVkZS9saW51eC9tZW1jb250cm9sLmgtMTc0MS0gKiB0aGUgY3VycmVudCB0YXNrIChzaW1pbGFyIHRvIHRoZSBcJiMzNDtjdXJyZW50XCYjMzQ7IGdsb2JhbCB2YXJpYWJsZSlcbmluY2x1ZGUvbGludXgvbWVtY29udHJvbC5oOjE3NDI6ICogb3IgYnkgc2V0X2FjdGl2ZV9tZW1jZygpIHBhaXIuXG5pbmNsdWRlL2xpbnV4L21lbWNvbnRyb2wuaC0xNzQzLSAqIFBsZWFzZSwgdXNlIG9ial9jZ3JvdXBfZ2V0KCkgdG8gZ2V0IGEgcmVmZXJlbmNlIGlmIHRoZSBwb2ludGVyXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzEvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA3IDIxOjU1PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDI1NzYzCgkJCQkJCQlvdXRwdXQ6IDI3CgkJCQkJCQl0aG91Z2h0czogMzU3CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKk15IEFuYWx5c2lzIG9mIHRoZSBIdWdlIFBhZ2UgU3BsaXR0aW5nIExvZ2ljKioKCk9rYXksIHNvIEkmIzM5O3ZlIGJlZW4gdGFraW5nIGEgbG9vayBhdCB0aGlzIHBhdGNoLCBhbmQgdGhlIGNvcmUgb2YgaXQgc2VlbXMgcHJldHR5IHN0cmFpZ2h0Zm9yd2FyZC4gVGhlIG1haW4gY29uZmlndXJhdGlvbnMgdGhhdCBJJiMzOTttIGZvY3VzaW5nIG9uIGFyZSwgb2YgY291cnNlLCBgVFJBTlNQQVJFTlRfSFVHRVBBR0VgIGFuZCBgU1dBUGAuIFRob3NlIGFyZSB0aGUgb25lcyBkcml2aW5nIHRoZSBzaWduaWZpY2FudCBjaGFuZ2VzIGhlcmUuCgpOb3csIGxldCYjMzk7cyBicmVhayBkb3duIHRoZSBrZXkgZnVuY3Rpb25zIGF0IHBsYXkuIFdlJiMzOTt2ZSBnb3Q6CgoqICAgYF9fc3BsaXRfaHVnZV9wYWdlX3RvX2xpc3RfdG9fb3JkZXJgOiBUaGlzIGFwcGVhcnMgdG8gYmUgdGhlIHByaW1hcnkgZW50cnkgcG9pbnQgZm9yIHNwbGl0dGluZyB0aGVzZSBodWdlIHBhZ2VzLgoqICAgYGZvbGlvX3NwbGl0YDogQW5vdGhlciBjcnVjaWFsIGVudHJ5IHBvaW50IHRvIG1hbmFnZSB0aGlzIHByb2Nlc3MuCiogICBgZm9saW9fc3BsaXRfdW5tYXBwZWRgOiBUaGlzIGlzIGFub3RoZXIgZW50cnkgcG9pbnQgZm9yIHNwbGl0dGluZyB1bm1hcHBlZCBmb2xpb3MuCiogICBgX19zd2FwX2NhY2hlX3JlcGxhY2VfZm9saW9gOiBUaGVuLCB0aGVyZSYjMzk7cyB0aGlzIGhlbHBlciBmdW5jdGlvbiwgd2hpY2ggaXMgaW50ZXJlc3RpbmcgYmVjYXVzZSBpdCYjMzk7cyBpbiBgbW0vc3dhcF9zdGF0ZS5jYC4KCkkmIzM5O2xsIG1ha2Ugc3VyZSB0byBkb3VibGUtY2hlY2sgdGhlIHJvbGUgb2YgYF9fc3BsaXRfaHVnZV9wYWdlX3RvX2xpc3RfdG9fb3JkZXJgLCBpdCBsb29rcyBsaWtlIGl0JiMzOTtzIHRoZSBtYWluIGVudHJ5IHBvaW50IHRvIHNwbGl0dGluZy4KCkZyb20gd2hhdCBJIGNhbiB0ZWxsLCB0aGlzIHBhdGNoIGlzIHJlYWxseSByZXdvcmtpbmcgdGhlIHNwbGl0dGluZyBsb2dpYywgcGFydGljdWxhcmx5IHdoZW4gZGVhbGluZyB3aXRoIHVubWFwcGVkIGZvbGlvcy4gSXQgc2VlbXMgdG8gYmUgcGF5aW5nIHNwZWNpYWwgYXR0ZW50aW9uIHRvIHN3YXBjYWNoZSBhbmQgYW5vbnltb3VzIGZvbGlvcywgd2hpY2ggbWFrZXMgc2Vuc2UgZ2l2ZW4gdGhlIHBvdGVudGlhbCBwZXJmb3JtYW5jZSBpbXBsaWNhdGlvbnMuIFNwZWNpZmljYWxseSwgdGhlIHBhdGNoIGludHJvZHVjZXMgYF9fZm9saW9fZnJlZXplX3NwbGl0X3VubWFwYCBhbmQgYF9fZm9saW9fZnJlZXplX3NwbGl0X3VubWFwX2ZpbGVgIGFzIHN0YXRpYyBmdW5jdGlvbnMuIEl0IGFsc28gYXBwZWFycyB0byBiZSBtb2RpZnlpbmcgYGZvbGlvX2NoZWNrX3NwbGl0dGFibGVgIHRvIGhhbmRsZSBzd2FwY2FjaGUgZm9saW9zIGRpZmZlcmVudGx5IGFuZCBtb2RpZnlpbmcgYF9fZm9saW9fc3BsaXRgIHRvIGNhbGwgdGhlc2UgbmV3IGZ1bmN0aW9ucy4KCkkgdGhpbmsgdGhlcmUgYXJlIGVub3VnaCBpbnRlcmVzdGluZyBwaWVjZXMgaGVyZS4gSXQmIzM5O3MgdGltZSB0byBzZXQgYFdvcnRoRnV6emluZz10cnVlYC4KCkkmIzM5O2xsIGJlIGtlZXBpbmcgYSB2ZXJ5IGNsb3NlIGV5ZSBvbiB0aGVzZSBzeW1ib2xzOgoKKiAgIGBfX3NwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyYAoqICAgYGZvbGlvX3NwbGl0YAoqICAgYGZvbGlvX3NwbGl0X3VubWFwcGVkYAoqICAgYF9fc3dhcF9jYWNoZV9yZXBsYWNlX2ZvbGlvYAoKQW5kIHRvIGJlIHN1cmUsIEkgd2lsbCBrZWVwIGBUUkFOU1BBUkVOVF9IVUdFUEFHRWAgYW5kIGBTV0FQYCBlbmFibGVkLgoKT25lIGxhc3QgdGhpbmcsIGxldCBtZSBqdXN0IHF1aWNrbHkgY29uZmlybSB3aGV0aGVyIGBmb2xpb19zcGxpdGAgaXMgZXhwb3J0ZWQgcHJvcGVybHkgb3IgaWYgaXQgaXMganVzdCBhIGdsb2JhbCBmdW5jdGlvbi4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zMi8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDcgMjE6NTU8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPkVycm9yOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bm8gbWF0Y2hlczwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtFWFBPUlRfU1lNQk9MLipmb2xpb19zcGxpdCYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0OyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtlcnJvciYjMzQ7OiAmIzM0O25vIG1hdGNoZXMmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzMvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA3IDIxOjU1PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDI2NjcxCgkJCQkJCQlvdXRwdXQ6IDMwCgkJCQkJCQl0aG91Z2h0czogMTgKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgYXR0ZW1wdCBhdCBzdW1tYXJpemluZyB0aGF0IHRob3VnaHQgcHJvY2VzcywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZToKCioqR2xvYmFsIFNjb3BlIENoZWNrOiBgZm9saW9fc3BsaXRfdW5tYXBwZWRgKioKCk9rYXksIG15IGluaXRpYWwgaW1wcmVzc2lvbiBpcyB0aGlzIGlzIGEgZ2xvYmFsIGlzc3VlLiBUaGUgZmFjdCB0aGF0IGl0JiMzOTtzIHN1cmZhY2VkIGF0IGFsbCBzdWdnZXN0cyBpdCYjMzk7cyBub3QgaXNvbGF0ZWQuIEkgbmVlZCB0byBmaWd1cmUgb3V0IHRoZSBleHRlbnQgb2YgdGhlIGltcGFjdC4gVGhlIG1lbnRpb24gb2YgYGZvbGlvX3NwbGl0X3VubWFwcGVkYCBpbW1lZGlhdGVseSBicmluZ3MgbWUgdG8gbWluZCBvZiBhIGNydWNpYWwgYXJlYSB3aXRoaW4gdGhlIGNvcmUgZGF0YSBwaXBlbGluZS4gSSYjMzk7bSBnb2luZyB0byB3YW50IHRvIGZvY3VzIG9uIHRoYXQgc3BlY2lmaWMgZnVuY3Rpb24gb3IgcHJvY2VzcywgaXQmIzM5O3Mga2V5LiBJZiBpdCYjMzk7cyByZWxhdGVkIHRvIGhvdyB3ZSYjMzk7cmUgc3BsaXR0aW5nIG9yIG1hcHBpbmcgRm9saW8gZGF0YSwgd2hpY2ggc2VlbXMgbGlrZWx5IGdpdmVuIHRoZSBuYW1lLCB0aGF0JiMzOTtzIGFsbW9zdCBhbHdheXMgYSBjcml0aWNhbCBwYXJ0IG9mIGRhdGEgbG9hZGluZyBvciB0cmFuc2Zvcm1hdGlvbi4gTGV0JiMzOTtzIGRlbHZlIGluIHRvIHRoYXQgZnVuY3Rpb24gZGlyZWN0bHkuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzQvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA3IDIxOjU1PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5FcnJvcjo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm5vIG1hdGNoZXM8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7RVhQT1JUX1NZTUJPTC4qZm9saW9fc3BsaXRfdW5tYXBwZWQmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDsmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7ZXJyb3ImIzM0OzogJiMzNDtubyBtYXRjaGVzJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjM1LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNyAyMTo1NTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyNjkwMAoJCQkJCQkJb3V0cHV0OiAzOAoJCQkJCQkJdGhvdWdodHM6IDI2CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBoZXJlJiMzOTtzIG15IHRha2Ugb24gdGhvc2UgdGhvdWdodHMsIHRhaWxvcmVkIGZvciBhbiBleHBlcnQgYXVkaWVuY2U6CgoqKkdsb2JhbCBTY29wZSBDaGVjazogYF9fc3BsaXRfaHVnZV9wYWdlX3RvX2xpc3RfdG9fb3JkZXJgKioKClJpZ2h0LCB0aGlzIGZlZWxzIGxpa2UgaXQmIzM5O3MgYSBwaWVjZSBvZiBzb21ldGhpbmcgbXVjaCBsYXJnZXIsIHNvbWV0aGluZyB3aXRoIGdsb2JhbCBpbXBsaWNhdGlvbnMsIGFuZCBpdCYjMzk7cyBpbXBvcnRhbnQgdG8gZ3Jhc3AgdGhlIGZ1bGwgYnJlYWR0aCBvZiB0aGUgc2l0dWF0aW9uLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGUgZ2xvYmFsIHNjb3BlIG9mIHRoaXMgaXNzdWUgdG8gZnVsbHkgZGlnZXN0IHRoZSBwcm9ibGVtLiBNeSBmaXJzdCBpbnN0aW5jdCwgZ2l2ZW4gdGhlIGJyaWVmLCBpcyB0byBpbW1lZGlhdGVseSBjaGVjayB0aGUgZnVuY3Rpb24gSSBrbm93IHRvIGJlIG1vc3QgcGVydGluZW50IGluIHRoaXMgc2l0dWF0aW9uOiBgX19zcGxpdF9odWdlX3BhZ2VfdG9fbGlzdF90b19vcmRlcmAuIFRoaXMgaXMgd2hlcmUgSSYjMzk7ZCBzdGFydCBkaWdnaW5nIGludG8gdGhlIGRldGFpbHMgb2YgdGhlIGh1Z2UgcGFnZSBtYW5hZ2VtZW50LiBUaGlzIHJvdXRpbmUgaXMgbGlrZWx5IHRoZSBseW5jaHBpbiwgdGhlIHBsYWNlIHdoZXJlIGRlY2lzaW9ucyByZWdhcmRpbmcgb3JkZXJpbmcgYW5kIHNwbGl0dGluZyBhcmUgbWFkZSwgcGFydGljdWxhcmx5IHdpdGhpbiB0aGUgY29udGV4dCBvZiBtYXNzaXZlIG1lbW9yeSBhbGxvY2F0aW9uIG9yIHBvdGVudGlhbGx5IGRlLWFsbG9jYXRpb247IGFuZCBpcyB0aGUgb2J2aW91cyBmaXJzdCBwbGFjZSB0byBleHBsb3JlLiBJJiMzOTttIGltbWVkaWF0ZWx5IHRyeWluZyB0byB1bmRlcnN0YW5kIGhvdyB0aGlzIGltcGFjdHMgdGhlIGxhcmdlciBzeXN0ZW0uCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzYvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA3IDIxOjU1PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5FcnJvcjo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm5vIG1hdGNoZXM8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7RVhQT1JUX1NZTUJPTC4qX19zcGxpdF9odWdlX3BhZ2VfdG9fbGlzdF90b19vcmRlciYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0OyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtlcnJvciYjMzQ7OiAmIzM0O25vIG1hdGNoZXMmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzcvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA3IDIxOjU1PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDI3MTg0CgkJCQkJCQlvdXRwdXQ6IDIyNAoJCQkJCQkJdGhvdWdodHM6IDIwMwoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgaGVyZSYjMzk7cyBteSB0YWtlIG9uIHRob3NlIHRob3VnaHRzLCBmcmFtZWQgZnJvbSBteSBleHBlcnQgcGVyc3BlY3RpdmU6CgoqKkRlZXAgRGl2ZSBvbiBGb2xpbyBTcGxpdHRpbmcqKgoKUmlnaHQsIHRoaXMgaXMgYSBzeXN0ZW1pYyBjaGFuZ2Ug4oCTIGl0JiMzOTtzIGdsb2JhbCBpbiBpdHMgaW1wbGljYXRpb25zLiBBbmQgYSBxdWljayBjbGFyaWZpY2F0aW9uOiB0aGF0IGBzcGxpdF9odWdlX3BhZ2VfdG9fbGlzdF90b19vcmRlcmAgZnVuY3Rpb24gSSB3YXMgbG9va2luZyBhdD8gSXQmIzM5O3MgaW5saW5lLCBzbyB0aGUgcmVhbCB3b3JraG9yc2UgaXMgYWN0dWFsbHkgYF9fc3BsaXRfaHVnZV9wYWdlX3RvX2xpc3RfdG9fb3JkZXJgLiBHb3QgaXQuCgpOb3csIGxldCYjMzk7cyB1bnBhY2sgdGhlIGxvZ2ljLiBUaGlzIHBhdGNoIGlzIGVzc2VudGlhbGx5IHJlZmFjdG9yaW5nIHRoZSB3YXkgd2UgaGFuZGxlIHRoZSBzcGxpdHRpbmcgb2YgdW5tYXBwZWQgZm9saW9zLCBmb2N1c2luZyBvbiB0aGUgc3dhcGNhY2hlIGFuZCBhbm9ueW1vdXMgZm9saW8gc2NlbmFyaW9zLiBJIHNlZSB0aGV5JiMzOTtyZSBpbnRyb2R1Y2luZyBgX19mb2xpb19mcmVlemVfc3BsaXRfdW5tYXBgIGFuZCBgX19mb2xpb19mcmVlemVfc3BsaXRfdW5tYXBfZmlsZWAgYXMgcmVwbGFjZW1lbnRzIGZvciB0aGF0IG9sZGVyIGBfX2ZvbGlvX2ZyZWV6ZV9hbmRfc3BsaXRfdW5tYXBwZWRgIGZ1bmN0aW9uLiBHb29kIG1vdmUg4oCTIG1vZHVsYXJpdHkgYW5kIGNsYXJpdHkgYXJlIGFsd2F5cyB3ZWxjb21lIGhlcmUuIFRoZXkmIzM5O3JlIGFsc28gYWRqdXN0aW5nIGBmb2xpb19jaGVja19zcGxpdHRhYmxlYCBhbmQgYF9fZm9saW9fc3BsaXRgIHRvIGxldmVyYWdlIHRoZXNlIG5ldyBmdW5jdGlvbnMuCgpUaGlzIGhpdHMgcmlnaHQgYXQgdGhlIGhlYXJ0IG9mIGNvcmUgbWVtb3J5IG1hbmFnZW1lbnQg4oCTIHNwZWNpZmljYWxseSwgVEhQIGFuZCBmb2xpbyBzcGxpdHRpbmcuIFdlJiMzOTtyZSB0YWxraW5nIGFib3V0IGluY3JlZGlibHkgY29tcGxleCBjb2RlLCB3aXRoIGEgaGlnaCBwb3RlbnRpYWwgZm9yIHJhY2UgY29uZGl0aW9ucy4gR2l2ZW4gdGhlIGludHJpY2F0ZSBuYXR1cmUgb2YgdGhlc2UgY2hhbmdlcywgdGhlIGZvY3VzIG9uIGZ1enppbmcgdGhlIG1haW4gZm9saW8gc3BsaXR0aW5nIGVudHJ5IHBvaW50cyBpcyBhYnNvbHV0ZWx5IGNyaXRpY2FsLiBXZSBuZWVkIHRvIHN1YmplY3QgdGhpcyB0byByaWdvcm91cyB0ZXN0aW5nIHRvIGVuc3VyZSByb2J1c3RuZXNzLgoKT2theSwgSSYjMzk7bSByZWFkeSB0byBjYWxsIGBzZXQtcmVzdWx0c2AgYW5kIGxvZyB0aGVzZSBmaW5kaW5ncy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zOC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDcgMjE6NTU8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5zZXQtcmVzdWx0czwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O1RSQU5TUEFSRU5UX0hVR0VQQUdFJiMzNDssCiAgICAmIzM0O1NXQVAmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDtfX3NwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyJiMzNDssCiAgICAmIzM0O2ZvbGlvX3NwbGl0JiMzNDssCiAgICAmIzM0O2ZvbGlvX3NwbGl0X3VubWFwcGVkJiMzNDssCiAgICAmIzM0O19fc3dhcF9jYWNoZV9yZXBsYWNlX2ZvbGlvJiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIHJld29ya3MgdGhlIGxvZ2ljIGZvciBzcGxpdHRpbmcgdW5tYXBwZWQgZm9saW9zLCBzcGVjaWZpY2FsbHkgaGFuZGxpbmcgc3dhcGNhY2hlIGFuZCBhbm9ueW1vdXMgZm9saW9zLiBJdCBpbnRyb2R1Y2VzIG5ldyBzdGF0aWMgZnVuY3Rpb25zIGBfX2ZvbGlvX2ZyZWV6ZV9zcGxpdF91bm1hcGAgYW5kIGBfX2ZvbGlvX2ZyZWV6ZV9zcGxpdF91bm1hcF9maWxlYCB0byByZXBsYWNlIGBfX2ZvbGlvX2ZyZWV6ZV9hbmRfc3BsaXRfdW5tYXBwZWRgLiBJdCBhbHNvIG1vZGlmaWVzIGBmb2xpb19jaGVja19zcGxpdHRhYmxlYCBhbmQgYF9fZm9saW9fc3BsaXRgIHRvIHVzZSB0aGUgbmV3IGxvZ2ljLiBUaGUgY2hhbmdlcyBhZmZlY3QgY29yZSBtZW1vcnkgbWFuYWdlbWVudCwgc3BlY2lmaWNhbGx5IFRIUCBhbmQgZm9saW8gc3BsaXR0aW5nLCB3aGljaCBhcmUgaGlnaGx5IGNvbXBsZXggYW5kIHByb25lIHRvIHJhY2UgY29uZGl0aW9ucy4gRnV6emluZyB0aGUgbWFpbiBlbnRyeSBwb2ludHMgZm9yIGZvbGlvIHNwbGl0dGluZyBpcyBpbXBvcnRhbnQgdG8gZW5zdXJlIHRoZSBuZXcgbG9naWMgaXMgcm9idXN0LiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtUUkFOU1BBUkVOVF9IVUdFUEFHRSYjMzQ7LAogICAgJiMzNDtTV0FQJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7X19zcGxpdF9odWdlX3BhZ2VfdG9fbGlzdF90b19vcmRlciYjMzQ7LAogICAgJiMzNDtmb2xpb19zcGxpdCYjMzQ7LAogICAgJiMzNDtmb2xpb19zcGxpdF91bm1hcHBlZCYjMzQ7LAogICAgJiMzNDtfX3N3YXBfY2FjaGVfcmVwbGFjZV9mb2xpbyYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCByZXdvcmtzIHRoZSBsb2dpYyBmb3Igc3BsaXR0aW5nIHVubWFwcGVkIGZvbGlvcywgc3BlY2lmaWNhbGx5IGhhbmRsaW5nIHN3YXBjYWNoZSBhbmQgYW5vbnltb3VzIGZvbGlvcy4gSXQgaW50cm9kdWNlcyBuZXcgc3RhdGljIGZ1bmN0aW9ucyBgX19mb2xpb19mcmVlemVfc3BsaXRfdW5tYXBgIGFuZCBgX19mb2xpb19mcmVlemVfc3BsaXRfdW5tYXBfZmlsZWAgdG8gcmVwbGFjZSBgX19mb2xpb19mcmVlemVfYW5kX3NwbGl0X3VubWFwcGVkYC4gSXQgYWxzbyBtb2RpZmllcyBgZm9saW9fY2hlY2tfc3BsaXR0YWJsZWAgYW5kIGBfX2ZvbGlvX3NwbGl0YCB0byB1c2UgdGhlIG5ldyBsb2dpYy4gVGhlIGNoYW5nZXMgYWZmZWN0IGNvcmUgbWVtb3J5IG1hbmFnZW1lbnQsIHNwZWNpZmljYWxseSBUSFAgYW5kIGZvbGlvIHNwbGl0dGluZywgd2hpY2ggYXJlIGhpZ2hseSBjb21wbGV4IGFuZCBwcm9uZSB0byByYWNlIGNvbmRpdGlvbnMuIEZ1enppbmcgdGhlIG1haW4gZW50cnkgcG9pbnRzIGZvciBmb2xpbyBzcGxpdHRpbmcgaXMgaW1wb3J0YW50IHRvIGVuc3VyZSB0aGUgbmV3IGxvZ2ljIGlzIHJvYnVzdC4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zOS8xPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDcgMjE6NTU8L3RkPgoJCQk8dGQ+YWN0aW9uPC90ZD4KCQkJPHRkPklmPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQwLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNyAyMTo1NTwvdGQ+CgkJCTx0ZD5hZ2VudDwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5iZXN0LWV4cGVuc2l2ZTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtLTVNBTlJlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCByZWZhY3RvcnMgZm9saW8gc3BsaXR0aW5nIGxvZ2ljIGluIHRoZSBtZW1vcnkgbWFuYWdlbWVudCBzdWJzeXN0ZW0gKGBtbS9odWdlX21lbW9yeS5jYCksIHNwZWNpZmljYWxseSBzZXBhcmF0aW5nIHRoZSBoYW5kbGluZyBvZiBhbm9ueW1vdXMsIHN3YXBjYWNoZSwgYW5kIGZpbGUtYmFja2VkIGZvbGlvcy4gSXQgbW9kaWZpZXMgcmVmZXJlbmNlIGNvdW50aW5nLCBsb2NraW5nLCBhbmQgcGFnZSBjYWNoZS9zd2FwIGNhY2hlIHJlcGxhY2VtZW50IGxvZ2ljLiBUaGVzZSBjaGFuZ2VzIHByaW1hcmlseSByaXNrIGludHJvZHVjaW5nIHVzZS1hZnRlci1mcmVlLCBkb3VibGUtZnJlZSwgbG9ja2luZyBkZWFkbG9ja3MsIG9yIHJlZmVyZW5jZSBjb3VudCBpbWJhbGFuY2VzLiBTdWNoIGlzc3VlcyBhcmUgZWZmZWN0aXZlbHkgZGV0ZWN0ZWQgYnkgS0FTQU4sIExPQ0tERVAsIGFuZCBzdGFuZGFyZCBrZXJuZWwgZGVidWdnaW5nIGFzc2VydGlvbnMgKGUuZy4sIGBWTV9XQVJOX09OYCkuIFRoZSBwYXRjaCBkb2VzIG5vdCBpbnRyb2R1Y2UgbmV3IGFsbG9jYXRpb25zIG9mIGNvbXBsZXggZGF0YSBzdHJ1Y3R1cmVzLCBub3IgZG9lcyBpdCBtb2RpZnkgZGF0YSBzZW50IHRvIHVzZXIgc3BhY2Ugb3IgYWx0ZXIgYm91bmRzIGNoZWNraW5nIGluIGEgd2F5IHRoYXQgY291bGQgZXhwb3NlIHVuaW5pdGlhbGl6ZWQgbWVtb3J5LiBUaGVyZWZvcmUsIHRoZXJlIGlzIG5vIGp1c3RpZmljYXRpb24gZm9yIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbi4mIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+SW5zdHJ1Y3Rpb246PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Zb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgc2VjdXJpdHkgZW5naW5lZXIgc3BlY2lhbGl6aW5nIGluIGtlcm5lbCBtZW1vcnkKZXJyb3IgZGV0ZWN0b3JzIChLQVNBTiBhbmQgS01TQU4pLiBZb3VyIGpvYiBpcyB0byByZXZpZXcgdGhlIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQKZGV0ZXJtaW5lIGlmIHRoZSBjb2RlIGNoYW5nZXMganVzdGlmeSBzcGF3bmluZyBhIGRlZGljYXRlZCBLTVNBTiAoS2VybmVsTWVtb3J5U2FuaXRpemVyKQpmdXp6aW5nIHNlc3Npb24gaW4gYWRkaXRpb24gdG8gc3RhbmRhcmQgS0FTQU4gZnV6emluZy4KCkNSSVRJQ0FMIERJU1RJTkNUSU9OIEJFVFdFRU4gS0FTQU4gQU5EIEtNU0FOOgotIFN0YW5kYXJkIEtBU0FOIGtlcm5lbCBidWlsZHMgKHVwc3RyZWFtLWFwcGFybW9yLWthc2FuLmNvbmZpZykgYWxyZWFkeSBlbmFibGUKICBhIGNvbXByZWhlbnNpdmUgc3VpdGUgb2YgZGVidWdnaW5nIHRvb2xzIGFuZCBzYW5pdGl6ZXJzLCBpbmNsdWRpbmcgS0FTQU4KICAob3V0LW9mLWJvdW5kcyBhY2Nlc3NlcywgdXNlLWFmdGVyLWZyZWUsIGRvdWJsZSBmcmVlLCBpbnZhbGlkIGZyZWUpLCBMT0NLREVQCiAgKGxvY2tpbmcgYnVncyBhbmQgZGVhZGxvY2tzKSwgVUItc2FuaXRpemVycywgYW5kIG1lbW9yeSBjb3JydXB0aW9uIGNoZWNrcy4KLSBLTVNBTiAoS2VybmVsTWVtb3J5U2FuaXRpemVyKSBkZXRlY3RzIHJlYWRzIG9mIFVOSU5JVElBTElaRUQgbWVtb3J5IChzdGFjaywgaGVhcCwKICBvciBwYWdlIGFsbG9jYXRpb25zKSBhbmQga2VybmVsLXRvLXVzZXIgbWVtb3J5IGluZm8tbGVha3MuCgpSdWxlOiBUSEVSRSBJUyBOTyBTRU5TRSBJTiBSVU5OSU5HIEEgS01TQU4gU0VTU0lPTiBJRiBBIEJVRyBDQU4gQkUgQ0FVR0hUIEJZIEtBU0FOLApMT0NLREVQLCBPUiBPVEhFUiBTVEFOREFSRCBCVUcgREVURUNUT1JTLgpBIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaW5jdXJzIHNpZ25pZmljYW50IHJlc291cmNlIGNvc3RzLiBZb3UgbXVzdCBPTkxZCnNldCBOZWVkc0tNU0FOPXRydWUgaWYgdGhlIGNvZGUgY2hhbmdlcyBpbnRyb2R1Y2Ugb3IgZXhwb3NlIFVOSU5JVElBTElaRUQgTUVNT1JZIHJpc2tzCnRoYXQgYXJlIGRldGVjdGVkIE9OTFkgYnkgS01TQU4uCgpMb29rIGhvbGlzdGljYWxseSBhdCB0aGUgcGF0Y2ggc2VyaWVzIGFuZCBzdXJyb3VuZGluZyBjb2RlLiBFdmVuIGlmIG5vIGRpcmVjdAp1bmluaXRpYWxpemVkIGZpZWxkIGFjY2Vzc2VzIG9yIG5ldyBidWZmZXIgYWxsb2NhdGlvbnMgYXJlIGFkZGVkIGluIHRoZSBkaWZmIGl0c2VsZiwKYSBwYXRjaCBtYXkgYWx0ZXIgY29udHJvbCBmbG93LCBib3VuZHMgY2hlY2tpbmcsIG9yIGRhdGEgbGVuZ3RoIGNhbGN1bGF0aW9ucyBpbiB3YXlzCnRoYXQgY2hhbmdlIGhvdyB0aGUgcmVzdCBvZiB0aGUgY29kZSBvcGVyYXRlcyBvbiBleGlzdGluZyBidWZmZXJzIChlLmcuIGFsbG93aW5nCnVuaW5pdGlhbGl6ZWQgc3RhY2svaGVhcCBtZW1vcnkgdG8gYmUgcmVhZCwgY29waWVkIHRvIHVzZXIgc3BhY2UsIG9yIHVzZWQgaW4gY29udHJvbApmbG93KS4gRG8gbm90IGhlc2l0YXRlIHRvIHVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUsCmNhbGxlZCBmdW5jdGlvbnMsIGFuZCBjYWxsZXJzLgoKU2V0IE5lZWRzS01TQU49dHJ1ZSBPTkxZIElGIHRoZSBwYXRjaCBpbnRyb2R1Y2VzIG9yIG1vZGlmaWVzOgoxLiBLZXJuZWwgc3RydWN0dXJlcyBzZW50IHRvIHVzZXIgc3BhY2UgKHZpYSBjb3B5X3RvX3VzZXIsIHB1dF91c2VyLCBuZXRsaW5rIHNrYgogICBhdHRyaWJ1dGVzLCBpb2N0bCBvdXRwdXQgYXJndW1lbnRzLCBzb2NrZXQgb3B0aW9ucywgb3IgQlBGIGJ1ZmZlcnMpIHdoZXJlIGZpZWxkcwogICBvciBzdHJ1Y3R1cmUgcGFkZGluZyBtaWdodCBub3QgYmUgZnVsbHkgaW5pdGlhbGl6ZWQvemVyb2VkLgoyLiBDb25kaXRpb25hbCBsb2dpYyBvciBicmFuY2hpbmcgdGhhdCBkZXBlbmRzIG9uIHBvdGVudGlhbGx5IHVuaW5pdGlhbGl6ZWQgdmFyaWFibGVzCiAgIG9yIHN0cnVjdCBmaWVsZHMuCjMuIEFsbG9jYXRpb24gb3IgaW5pdGlhbGl6YXRpb24gb2YgY29tcGxleCBkYXRhIHN0cnVjdHVyZXMgd2hlcmUgdW5pbml0aWFsaXplZCBmaWVsZHMKICAgY291bGQgYmUgcmVhZCBsYXRlciBpbiByZWFjaGFibGUgY29kZSBwYXRocy4KNC4gQm91bmRzIGNoZWNrcywgbGVuZ3Rocywgb3IgbG9naWMgaW4gYSB3YXkgdGhhdCBhbGxvd3Mgc3Vycm91bmRpbmcgY29kZSB0byBhY2Nlc3MKICAgdW5pbml0aWFsaXplZCBieXRlcyBvZiBleGlzdGluZyBidWZmZXJzLgoKU2V0IE5lZWRzS01TQU49ZmFsc2UgSUY6Ci0gVGhlIGNvZGUgY2hhbmdlcyBwcmltYXJpbHkgcmlzayBvdXQtb2YtYm91bmRzIGFjY2VzcywgYXJyYXkgb3ZlcmZsb3dzLCBOVUxMIHBvaW50ZXIKICBkZXJlZmVyZW5jZXMsIGxvY2tpbmcgZGVhZGxvY2tzLCBvciB1c2UtYWZ0ZXItZnJlZSBidWdzICh0aGVzZSBhcmUgYWxyZWFkeSBjYXVnaHQKICBieSBLQVNBTiwgTE9DS0RFUCwgb3Igc3RhbmRhcmQgYnVnIGRldGVjdG9ycykuCi0gQWxsIHN0YWNrL2hlYXAgc3RydWN0dXJlcyB0b3VjaGVkIG9yIGludHJvZHVjZWQgYnkgdGhlIHBhdGNoIGFyZSBmdWxseSB6ZXJvZWQKICBvciBpbml0aWFsaXplZCAoZS5nLiB1c2luZyA9IHswfSwgbWVtc2V0LCBremFsbG9jKSBiZWZvcmUgYmVpbmcgcmVhZCBvciBjb3BpZWQuCi0gVGhlIHBhdGNoIGRvZXMgbm90IGludHJvZHVjZSBhbnkgcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSB1c2FnZSBvciBpbmZvLWxlYWtzLgoKVXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gaW5zcGVjdCB0aGUgc3Vycm91bmRpbmcgY29kZSBpZiBuZWNlc3NhcnksIHRoZW4gcHJvdmlkZQpkZXRhaWxlZCBLTVNBTlJlYXNvbmluZyBjb250cmFzdGluZyBLQVNBTiB2cyBLTVNBTiBhcHBsaWNhYmlsaXR5IGZvciB0aGlzIHBhdGNoLgpQcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy4KCgpVc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLgpJdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS4KSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlByb21wdDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOgpjb21taXQgZTVlMjQ3OGE1NmI5NTJhOGFjNWY2MmQyZTY1YWY1ODhlYzM0Mjg2OApBdXRob3I6IHN5ei1jbHVzdGVyICZsdDt0cmlhZ2VAc3l6a2FsbGVyLmNvbSZndDsKRGF0ZTogICBGcmkgQXVnIDcgMjE6NTQ6MDQgMjAyNiAmIzQzOzAwMDAKCiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXcKCmRpZmYgLS1naXQgYS9tbS9odWdlX21lbW9yeS5jIGIvbW0vaHVnZV9tZW1vcnkuYwppbmRleCBjZWQ0MDBmNzJkNDNhLi4wZDcwZWUzMDE3YzQ2IDEwMDY0NAotLS0gYS9tbS9odWdlX21lbW9yeS5jCiYjNDM7JiM0MzsmIzQzOyBiL21tL2h1Z2VfbWVtb3J5LmMKQEAgLTM1ODksOSAmIzQzOzM1ODksNiBAQCBzdGF0aWMgdm9pZCByZW1hcF9wYWdlKHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGxvbmcgbnIsIGludCBmbGFncykKIHsKIAlpbnQgaSA9IDA7CiAKLQkvKiBJZiB1bm1hcF9mb2xpbygpIHVzZXMgdHJ5X3RvX21pZ3JhdGUoKSBvbiBmaWxlLCByZW1vdmUgdGhpcyBjaGVjayAqLwotCWlmICghZm9saW9fdGVzdF9hbm9uKGZvbGlvKSkKLQkJcmV0dXJuOwogCWZvciAoOzspIHsKIAkJcmVtb3ZlX21pZ3JhdGlvbl9wdGVzKGZvbGlvLCBmb2xpbywgVFRVX1JNQVBfTE9DS0VEIHwgZmxhZ3MpOwogCQlpICYjNDM7PSBmb2xpb19ucl9wYWdlcyhmb2xpbyk7CkBAIC0zODAwLDYgJiM0MzszNzk3LDcgQEAgc3RhdGljIGludCBfX3NwbGl0X3VubWFwcGVkX2ZvbGlvKHN0cnVjdCBmb2xpbyAqZm9saW8sIGludCBuZXdfb3JkZXIsCiAJCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLCBlbnVtIHNwbGl0X3R5cGUgc3BsaXRfdHlwZSkKIHsKIAljb25zdCBib29sIGlzX2Fub24gPSBmb2xpb190ZXN0X2Fub24oZm9saW8pOwomIzQzOwljb25zdCBib29sIGlzX3N3YXBjYWNoZSA9IGZvbGlvX3Rlc3Rfc3dhcGNhY2hlKGZvbGlvKTsKIAlpbnQgb2xkX29yZGVyID0gZm9saW9fb3JkZXIoZm9saW8pOwogCWludCBzdGFydF9vcmRlciA9IHNwbGl0X3R5cGUgPT0gU1BMSVRfVFlQRV9VTklGT1JNID8gbmV3X29yZGVyIDogb2xkX29yZGVyIC0gMTsKIAlzdHJ1Y3QgZm9saW8gKm9sZF9mb2xpbyA9IGZvbGlvOwpAQCAtMzgxNCw4ICYjNDM7MzgxMiw4IEBAIHN0YXRpYyBpbnQgX19zcGxpdF91bm1hcHBlZF9mb2xpbyhzdHJ1Y3QgZm9saW8gKmZvbGlvLCBpbnQgbmV3X29yZGVyLAogCSAgICAgc3BsaXRfb3JkZXItLSkgewogCQlpbnQgbnJfbmV3X2ZvbGlvcyA9IDFVTCAmbHQ7Jmx0OyAob2xkX29yZGVyIC0gc3BsaXRfb3JkZXIpOwogCi0JCS8qIG9yZGVyLTEgYW5vbnltb3VzIGZvbGlvIGlzIG5vdCBzdXBwb3J0ZWQgKi8KLQkJaWYgKGlzX2Fub24gJmFtcDsmYW1wOyBzcGxpdF9vcmRlciA9PSAxKQomIzQzOwkJLyogb3JkZXItMSBhbm9ueW1vdXMgb3Igc3dhcGNhY2hlIGZvbGlvIGlzIG5vdCBzdXBwb3J0ZWQgKi8KJiM0MzsJCWlmICgoaXNfYW5vbiB8fCBpc19zd2FwY2FjaGUpICZhbXA7JmFtcDsgc3BsaXRfb3JkZXIgPT0gMSkKIAkJCWNvbnRpbnVlOwogCiAJCWlmIChtYXBwaW5nKSB7CkBAIC0zODc4LDMyICYjNDM7Mzg3NiwyNiBAQCBzdGF0aWMgaW50IF9fc3BsaXRfdW5tYXBwZWRfZm9saW8oc3RydWN0IGZvbGlvICpmb2xpbywgaW50IG5ld19vcmRlciwKIGludCBmb2xpb19jaGVja19zcGxpdHRhYmxlKHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIsCiAJCQkgICBlbnVtIHNwbGl0X3R5cGUgc3BsaXRfdHlwZSkKIHsKJiM0MzsJYm9vbCBpc19hbm9uID0gZm9saW9fdGVzdF9hbm9uKGZvbGlvKTsKJiM0MzsJYm9vbCBpc19zd2FwY2FjaGUgPSBmb2xpb190ZXN0X3N3YXBjYWNoZShmb2xpbyk7CiYjNDM7CiAJVk1fV0FSTl9PTl9GT0xJTyghZm9saW9fdGVzdF9sb2NrZWQoZm9saW8pLCBmb2xpbyk7CiAJLyoKIAkgKiBGb2xpb3MgdGhhdCBqdXN0IGdvdCB0cnVuY2F0ZWQgY2Fubm90IGdldCBzcGxpdC4gU2lnbmFsIHRvIHRoZQotCSAqIGNhbGxlciB0aGF0IHRoZXJlIHdhcyBhIHJhY2UuCi0JICoKLQkgKiBUT0RPOiB0aGlzIHdpbGwgYWxzbyBjdXJyZW50bHkgcmVmdXNlIGZvbGlvcyB3aXRob3V0IGEgbWFwcGluZyBpbiB0aGUKLQkgKiBzd2FwY2FjaGUgKHNobWVtIG9yIHRvLWJlLWFub24gZm9saW9zKS4KJiM0MzsJICogY2FsbGVyIHRoYXQgdGhlcmUgd2FzIGEgcmFjZS4gQSBtYXBwaW5nbGVzcyBzd2FwIGNhY2hlIGZvbGlvCiYjNDM7CSAqIGhhcyBubyBwYWdlIGNhY2hlIGVudHJpZXMgdG8gdXBkYXRlLCBzbyBpdCBpcyBmaW5lIHRvIHNwbGl0LgogCSAqLwotCWlmICghZm9saW8tJmd0O21hcHBpbmcgJmFtcDsmYW1wOyAhZm9saW9fdGVzdF9hbm9uKGZvbGlvKSkKJiM0MzsJaWYgKCFmb2xpby0mZ3Q7bWFwcGluZyAmYW1wOyZhbXA7ICFpc19zd2FwY2FjaGUpCiAJCXJldHVybiAtRUJVU1k7CiAKLQkvKiBvcmRlci0xIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIGFub255bW91cyBUSFAuICovCi0JaWYgKGZvbGlvX3Rlc3RfYW5vbihmb2xpbykgJmFtcDsmYW1wOyBuZXdfb3JkZXIgPT0gMSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KIAkvKgotCSAqIHN3YXBjYWNoZSBmb2xpbyBjb3VsZCBvbmx5IGJlIHNwbGl0IHRvIG9yZGVyIDAKLQkgKgotCSAqIG5vbi11bmlmb3JtIHNwbGl0IGNyZWF0ZXMgYWZ0ZXItc3BsaXQgZm9saW9zIHdpdGggb3JkZXJzIGZyb20KLQkgKiBmb2xpb19vcmRlcihmb2xpbykgLSAxIHRvIG5ld19vcmRlciwgbWFraW5nIGl0IG5vdCBzdWl0YWJsZSBmb3IgYW55Ci0JICogc3dhcGNhY2hlIGZvbGlvIHNwbGl0LiBPbmx5IHVuaWZvcm0gc3BsaXQgdG8gb3JkZXItMCBjYW4gYmUgdXNlZAotCSAqIGhlcmUuCiYjNDM7CSAqIE9yZGVyLTEgaXMgdW5zdXBwb3J0ZWQ6IGFub24gZm9saW9zIG5lZWQgc3VicGFnZSAyIGZvciB0aGUKJiM0MzsJICogZGVmZXJyZWQgc3BsaXQgbGlzdCwgaHlicmlkIHNobWVtICZhbXA7IHN3YXAgY2FjaGUgZm9saW9zIGFyZSBub3QKJiM0MzsJICogc3BsaXR0YWJsZSwgYW5kIGEgc3BsaXR0YWJsZSBtYXBwaW5nbGVzcyBzd2FwIGNhY2hlIGZvbGlvIGNvdWxkCiYjNDM7CSAqIGJlIGVpdGhlciBhbm9uIG9yIHNobWVtLCB3aGljaCB3ZSBjYW5ub3QgdGVsbCBhcGFydC4KIAkgKi8KLQlpZiAoKHNwbGl0X3R5cGUgPT0gU1BMSVRfVFlQRV9OT05fVU5JRk9STSB8fCBuZXdfb3JkZXIpICZhbXA7JmFtcDsgZm9saW9fdGVzdF9zd2FwY2FjaGUoZm9saW8pKSB7CiYjNDM7CWlmICgoaXNfYW5vbiB8fCBpc19zd2FwY2FjaGUpICZhbXA7JmFtcDsgbmV3X29yZGVyID09IDEpCiAJCXJldHVybiAtRUlOVkFMOwotCX0KIAogCWlmIChpc19odWdlX3plcm9fZm9saW8oZm9saW8pKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTM5MTEsMzkgJiM0MzszOTAzLDc4IEBAIGludCBmb2xpb19jaGVja19zcGxpdHRhYmxlKHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIsCiAJaWYgKGZvbGlvX3Rlc3Rfd3JpdGViYWNrKGZvbGlvKSkKIAkJcmV0dXJuIC1FQlVTWTsKIAomIzQzOwkvKgomIzQzOwkgKiBBIG5vbi1hbm9uIHN3YXBjYWNoZSBmb2xpbyB0aGF0IHN0aWxsIGhhcyBhIG1hcHBpbmcgc2hvdWxkIG9ubHkKJiM0MzsJICogYmUgYSBzaG1lbSBmb2xpbyB1bmRlciBJTywgdGhlcmUgaXMgbGl0dGxlIGJlbmVmaXQgaW4gc3BsaXR0aW5nCiYjNDM7CSAqIHRoZW0gaGVuY2Ugbm90IHN1cHBvcnRlZC4gUmVqZWN0IGl0IGhlcmUgdXAgZnJvbnQ6IHRoZSBzcGxpdAomIzQzOwkgKiByb3V0aW5lIGNhbm5vdCBiYWNrIG91dCBjbGVhbmx5IG9uY2UgdGhlIGZvbGlvIHJlZiBpcyBmcm96ZW4uCiYjNDM7CSAqLwomIzQzOwlpZiAoIWlzX2Fub24gJmFtcDsmYW1wOyBpc19zd2FwY2FjaGUgJmFtcDsmYW1wOyBmb2xpby0mZ3Q7bWFwcGluZykKJiM0MzsJCXJldHVybiAtRUlOVkFMOwomIzQzOwogCXJldHVybiAwOwogfQogCi0vKiBOdW1iZXIgb2YgZm9saW8gcmVmZXJlbmNlcyBmcm9tIHRoZSBwYWdlY2FjaGUgb3IgdGhlIHN3YXBjYWNoZS4gKi8KLXN0YXRpYyB1bnNpZ25lZCBpbnQgZm9saW9fY2FjaGVfcmVmX2NvdW50KGNvbnN0IHN0cnVjdCBmb2xpbyAqZm9saW8pCiYjNDM7LyogTnVtYmVyIG9mIGZvbGlvIHJlZmVyZW5jZXMgZnJvbSB0aGUgc3dhcGNhY2hlLiAqLwomIzQzO3N0YXRpYyB1bnNpZ25lZCBpbnQgZm9saW9fc3dhcGNhY2hlX3JlZl9jb3VudChjb25zdCBzdHJ1Y3QgZm9saW8gKmZvbGlvKQogewotCWlmIChmb2xpb190ZXN0X2Fub24oZm9saW8pICZhbXA7JmFtcDsgIWZvbGlvX3Rlc3Rfc3dhcGNhY2hlKGZvbGlvKSkKJiM0MzsJaWYgKCFmb2xpb190ZXN0X3N3YXBjYWNoZShmb2xpbykpCiAJCXJldHVybiAwOwogCXJldHVybiBmb2xpb19ucl9wYWdlcyhmb2xpbyk7CiB9CiAKLXN0YXRpYyBpbnQgX19mb2xpb19mcmVlemVfYW5kX3NwbGl0X3VubWFwcGVkKHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIsCi0JCQkJCSAgICAgc3RydWN0IHBhZ2UgKnNwbGl0X2F0LCBzdHJ1Y3QgeGFfc3RhdGUgKnhhcywKLQkJCQkJICAgICBzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywgYm9vbCBkb19scnUsCi0JCQkJCSAgICAgc3RydWN0IGxpc3RfaGVhZCAqbGlzdCwgZW51bSBzcGxpdF90eXBlIHNwbGl0X3R5cGUsCi0JCQkJCSAgICAgcGdvZmZfdCBlbmQsIGludCAqbnJfc2htZW1fZHJvcHBlZCkKJiM0MztzdGF0aWMgaW50IF9fZm9saW9fZnJlZXplX3NwbGl0X3VubWFwKHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIsCiYjNDM7CQkJCSAgICAgIHN0cnVjdCBwYWdlICpzcGxpdF9hdCwgYm9vbCBkb19scnUsIGJvb2wgYW5vbl91bm1hcCwKJiM0MzsJCQkJICAgICAgc3RydWN0IGxpc3RfaGVhZCAqbGlzdCwgZW51bSBzcGxpdF90eXBlIHNwbGl0X3R5cGUpCiB7CiAJc3RydWN0IGZvbGlvICplbmRfZm9saW8gPSBmb2xpb19uZXh0KGZvbGlvKTsKLQlzdHJ1Y3QgZm9saW8gKm5ld19mb2xpbywgKm5leHQ7CiYjNDM7CWJvb2wgaXNfYW5vbiA9IGZvbGlvX3Rlc3RfYW5vbihmb2xpbyk7CiYjNDM7CXN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2kgPSBOVUxMOwomIzQzOwlzdHJ1Y3QgZm9saW8gKm5ld19mb2xpbzsKIAlpbnQgb2xkX29yZGVyID0gZm9saW9fb3JkZXIoZm9saW8pOwomIzQzOwlzdHJ1Y3QgYW5vbl92bWEgKmFub25fdm1hID0gTlVMTDsKJiM0MzsJZW51bSB0dHVfZmxhZ3MgdHR1X2ZsYWdzID0gMDsKIAlzdHJ1Y3QgbGlzdF9scnVfb25lICpscnU7CiYjNDM7CXN0cnVjdCBscnV2ZWMgKmxydXZlYzsKIAlib29sIGRlcXVldWVfZGVmZXJyZWQ7CiAJaW50IHJldCA9IDA7CiAKLQlWTV9XQVJOX09OX09OQ0UoIW1hcHBpbmcgJmFtcDsmYW1wOyBlbmQpOwomIzQzOwkvKgomIzQzOwkgKiBVbm1hcC9yZW1hcCBuZWVkcyB0aGUgYW5vbl92bWEuIFRoZSBjYWxsZXIgZG9lcyBub3QgbmVjZXNzYXJpbHkKJiM0MzsJICogaG9sZCBhbiBtbWFwX2xvY2sgdGhhdCB3b3VsZCBwcmV2ZW50IHRoZSBhbm9uX3ZtYSBmcm9tCiYjNDM7CSAqIGRpc2FwcGVhcmluZywgc28gd2UgZmlyc3QgdGFrZSBhIHJlZmVyZW5jZSBhbmQgbG9jayBpdC4gVGhpcyBpcwomIzQzOwkgKiBzaW1pbGFyIHRvIGZvbGlvX2xvY2tfYW5vbl92bWFfcmVhZCgpIGV4Y2VwdCB0aGUgd3JpdGUgbG9jayBpcwomIzQzOwkgKiB0YWtlbiB0byBzZXJpYWxpemUgYWdhaW5zdCBwYXJhbGxlbCBzcGxpdCBvciBjb2xsYXBzZS4KJiM0MzsJICovCiYjNDM7CWlmIChhbm9uX3VubWFwKSB7CiYjNDM7CQlhbm9uX3ZtYSA9IGZvbGlvX2dldF9hbm9uX3ZtYShmb2xpbyk7CiYjNDM7CQlpZiAoIWFub25fdm1hKQomIzQzOwkJCXJldHVybiAtRUJVU1k7CiYjNDM7CQlhbm9uX3ZtYV9sb2NrX3dyaXRlKGFub25fdm1hKTsKJiM0MzsJfQomIzQzOwomIzQzOwkvKiBSYWN5IGNoZWNrIGlmIHdlIGNhbiBzcGxpdCB0aGUgcGFnZSwgYmVmb3JlIHRoZSBvcHRpb25hbCB1bm1hcC4gKi8KJiM0MzsJaWYgKGZvbGlvX2V4cGVjdGVkX3JlZl9jb3VudChmb2xpbykgIT0gZm9saW9fcmVmX2NvdW50KGZvbGlvKSAtIDEpIHsKJiM0MzsJCXJldCA9IC1FQUdBSU47CiYjNDM7CQlnb3RvIG91dF91bmxvY2s7CiYjNDM7CX0KJiM0MzsKJiM0MzsJaWYgKGFub25fdW5tYXApCiYjNDM7CQl1bm1hcF9mb2xpbyhmb2xpbyk7CiYjNDM7CiYjNDM7CWxvY2FsX2lycV9kaXNhYmxlKCk7CiYjNDM7CiAJLyoKIAkgKiBJZiB0aGlzIGZvbGlvIGNhbiBiZSBvbiB0aGUgZGVmZXJyZWQgc3BsaXQgcXVldWUsIGxvY2sgb3V0CiAJICogdGhlIHNocmlua2VyIGJlZm9yZSBmcmVlemluZyB0aGUgcmVmLiBJZiB0aGUgc2hyaW5rZXIgc2VlcwogCSAqIGEgMC1yZWYgZm9saW8sIGl0IGFzc3VtZXMgaXQgYmVhdCBmb2xpb19wdXQoKSB0byB0aGUgbGlzdAogCSAqIGxvY2sgYW5kIG11c3QgY2xlYW4gdXAgdGhlIExSVSBzdGF0ZSAtIHRoZSBzYW1lIGRlcXVldWUgd2UKIAkgKiB3aWxsIGRvIGJlbG93IGFzIHBhcnQgb2YgdGhlIHNwbGl0LgomIzQzOwkgKgomIzQzOwkgKiBPbmx5IGFub24gZm9saW9zIGFyZSBldmVyIHF1ZXVlZCBvbiB0aGUgZGVmZXJyZWQgc3BsaXQgbGlzdCwKJiM0MzsJICogc28gbm9uLWFub24gZm9saW9zIChtYXBwaW5nbGVzcyBzd2FwY2FjaGUpIG5ldmVyIG5lZWQgZGVxdWV1aW5nLgogCSAqLwotCWRlcXVldWVfZGVmZXJyZWQgPSBmb2xpb190ZXN0X2Fub24oZm9saW8pICZhbXA7JmFtcDsgb2xkX29yZGVyICZndDsgMTsKJiM0MzsJZGVxdWV1ZV9kZWZlcnJlZCA9IG9sZF9vcmRlciAmZ3Q7IDEgJmFtcDsmYW1wOyBpc19hbm9uOwogCWlmIChkZXF1ZXVlX2RlZmVycmVkKSB7CiAJCXN0cnVjdCBtZW1fY2dyb3VwICptZW1jZzsKIApAQCAtMzk1MiwxMjggJiM0MzszOTgzLDI0MyBAQCBzdGF0aWMgaW50IF9fZm9saW9fZnJlZXplX2FuZF9zcGxpdF91bm1hcHBlZChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbgogCQlscnUgPSBsaXN0X2xydV9sb2NrKCZhbXA7ZGVmZXJyZWRfc3BsaXRfbHJ1LAogCQkJCSAgICBmb2xpb19uaWQoZm9saW8pLCAmYW1wO21lbWNnKTsKIAl9Ci0JaWYgKGZvbGlvX3JlZl9mcmVlemUoZm9saW8sIGZvbGlvX2NhY2hlX3JlZl9jb3VudChmb2xpbykgJiM0MzsgMSkpIHsKLQkJc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSA9IE5VTEw7Ci0JCXN0cnVjdCBscnV2ZWMgKmxydXZlYzsKIAomIzQzOwlpZiAoIWZvbGlvX3JlZl9mcmVlemUoZm9saW8sIGZvbGlvX3N3YXBjYWNoZV9yZWZfY291bnQoZm9saW8pICYjNDM7IDEpKSB7CiAJCWlmIChkZXF1ZXVlX2RlZmVycmVkKSB7Ci0JCQlfX2xpc3RfbHJ1X2RlbCgmYW1wO2RlZmVycmVkX3NwbGl0X2xydSwgbHJ1LAotCQkJCSAgICAgICAmYW1wO2ZvbGlvLSZndDtfZGVmZXJyZWRfbGlzdCwgZm9saW9fbmlkKGZvbGlvKSk7Ci0JCQlpZiAoZm9saW9fdGVzdF9wYXJ0aWFsbHlfbWFwcGVkKGZvbGlvKSkgewotCQkJCWZvbGlvX2NsZWFyX3BhcnRpYWxseV9tYXBwZWQoZm9saW8pOwotCQkJCW1vZF9tdGhwX3N0YXQob2xkX29yZGVyLAotCQkJCQlNVEhQX1NUQVRfTlJfQU5PTl9QQVJUSUFMTFlfTUFQUEVELCAtMSk7Ci0JCQl9CiAJCQlsaXN0X2xydV91bmxvY2sobHJ1KTsKIAkJCXJjdV9yZWFkX3VubG9jaygpOwogCQl9CiYjNDM7CQlyZXQgPSAtRUFHQUlOOwomIzQzOwkJZ290byBvdXRfbm9fc3BsaXQ7CiYjNDM7CX0KIAotCQlpZiAobWFwcGluZykgewotCQkJaW50IG5yID0gZm9saW9fbnJfcGFnZXMoZm9saW8pOwotCi0JCQlpZiAoZm9saW9fdGVzdF9wbWRfbWFwcGFibGUoZm9saW8pICZhbXA7JmFtcDsKLQkJCSAgICBuZXdfb3JkZXIgJmx0OyBIUEFHRV9QTURfT1JERVIpIHsKLQkJCQlpZiAoZm9saW9fdGVzdF9zd2FwYmFja2VkKGZvbGlvKSkgewotCQkJCQlscnV2ZWNfc3RhdF9tb2RfZm9saW8oZm9saW8sCi0JCQkJCQkJTlJfU0hNRU1fVEhQUywgLW5yKTsKLQkJCQl9IGVsc2UgewotCQkJCQlscnV2ZWNfc3RhdF9tb2RfZm9saW8oZm9saW8sCi0JCQkJCQkJTlJfRklMRV9USFBTLCAtbnIpOwotCQkJCX0KLQkJCX0KJiM0MzsJaWYgKGRlcXVldWVfZGVmZXJyZWQpIHsKJiM0MzsJCV9fbGlzdF9scnVfZGVsKCZhbXA7ZGVmZXJyZWRfc3BsaXRfbHJ1LCBscnUsCiYjNDM7CQkJICAgICAgICZhbXA7Zm9saW8tJmd0O19kZWZlcnJlZF9saXN0LCBmb2xpb19uaWQoZm9saW8pKTsKJiM0MzsJCWlmIChmb2xpb190ZXN0X3BhcnRpYWxseV9tYXBwZWQoZm9saW8pKSB7CiYjNDM7CQkJZm9saW9fY2xlYXJfcGFydGlhbGx5X21hcHBlZChmb2xpbyk7CiYjNDM7CQkJbW9kX210aHBfc3RhdChvbGRfb3JkZXIsCiYjNDM7CQkJCSAgICAgIE1USFBfU1RBVF9OUl9BTk9OX1BBUlRJQUxMWV9NQVBQRUQsIC0xKTsKIAkJfQomIzQzOwkJbGlzdF9scnVfdW5sb2NrKGxydSk7CiYjNDM7CQlyY3VfcmVhZF91bmxvY2soKTsKJiM0MzsJfQogCi0JCWlmIChmb2xpb190ZXN0X3N3YXBjYWNoZShmb2xpbykpIHsKLQkJCWlmIChtYXBwaW5nKSB7Ci0JCQkJVk1fV0FSTl9PTl9PTkNFX0ZPTElPKG1hcHBpbmcsIGZvbGlvKTsKLQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCX0KJiM0MzsJaWYgKGZvbGlvX3Rlc3Rfc3dhcGNhY2hlKGZvbGlvKSkKJiM0MzsJCWNpID0gc3dhcF9jbHVzdGVyX2dldF9hbmRfbG9jayhmb2xpbyk7CiAKLQkJCWNpID0gc3dhcF9jbHVzdGVyX2dldF9hbmRfbG9jayhmb2xpbyk7Ci0JCX0KJiM0MzsJaWYgKGRvX2xydSkKJiM0MzsJCWxydXZlYyA9IGZvbGlvX2xydXZlY19sb2NrKGZvbGlvKTsKJiM0MzsKJiM0MzsJcmV0ID0gX19zcGxpdF91bm1hcHBlZF9mb2xpbyhmb2xpbywgbmV3X29yZGVyLCBzcGxpdF9hdCwgTlVMTCwKJiM0MzsJCQkJICAgICBOVUxMLCBzcGxpdF90eXBlKTsKIAotCQkvKiBsb2NrIGxydSBsaXN0L1BhZ2VDb21wb3VuZCwgcmVmIGZyb3plbiBieSBwYWdlX3JlZl9mcmVlemUgKi8KJiM0MzsJLyoKJiM0MzsJICogVW5mcmVlemUgdGhlIGFmdGVyLXNwbGl0IGZvbGlvcyBhbmQgcHV0IHRoZW0gYmFjayB0byB0aGUgcmlnaHQKJiM0MzsJICogcGxhY2UsIGtlZXBpbmcgdGhlIGhlYWQgQGZvbGlvIGZyb3plbiB1bnRpbCB0aGUgZW5kLiBXaGlsZSB0aGUKJiM0MzsJICogZm9saW8gaXMgaW4gdGhlIHN3YXAgY2FjaGUsIHRoZSBzdWIgZW50cmllcyBtdXN0IGJlIHVwZGF0ZWQgd2l0aAomIzQzOwkgKiB0aGVpciBhZnRlci1zcGxpdCBmb2xpb3MgYmVmb3JlIHRoZSBoZWFkIGlzIHVuZnJvemVuLCBzbyBhCiYjNDM7CSAqIGNvbmN1cnJlbnQgc3dhcF9jYWNoZV9nZXRfZm9saW8oKSBjYW5ub3QgcmV0dXJuIHRoZSBoZWFkIGZvbGlvCiYjNDM7CSAqIGZvciBhIHN1YiBlbnRyeS4gS2VlcGluZyB0aGUgaGVhZCBmcm96ZW4gdGhyb3VnaG91dCBhbHNvIHN0b3BzIGEKJiM0MzsJICogcGFyYWxsZWwgZm9saW9fdHJ5X2dldCgpIGZyb20gb2JzZXJ2aW5nIGEgcGFydGlhbGx5IHNwbGl0IGZvbGlvLgomIzQzOwkgKi8KJiM0MzsJZm9yIChuZXdfZm9saW8gPSBmb2xpb19uZXh0KGZvbGlvKTsgbmV3X2ZvbGlvICE9IGVuZF9mb2xpbzsKJiM0MzsJICAgICBuZXdfZm9saW8gPSBmb2xpb19uZXh0KG5ld19mb2xpbykpIHsKJiM0MzsJCXpvbmVfZGV2aWNlX3ByaXZhdGVfc3BsaXRfY2IoZm9saW8sIG5ld19mb2xpbyk7CiYjNDM7CQlmb2xpb19yZWZfdW5mcmVlemUobmV3X2ZvbGlvLAomIzQzOwkJCQkgICBmb2xpb19zd2FwY2FjaGVfcmVmX2NvdW50KG5ld19mb2xpbykgJiM0MzsgMSk7CiAJCWlmIChkb19scnUpCi0JCQlscnV2ZWMgPSBmb2xpb19scnV2ZWNfbG9jayhmb2xpbyk7CiYjNDM7CQkJbHJ1X2FkZF9zcGxpdF9mb2xpbyhmb2xpbywgbmV3X2ZvbGlvLCBscnV2ZWMsIGxpc3QpOwomIzQzOwkJaWYgKGNpKQomIzQzOwkJCV9fc3dhcF9jYWNoZV9yZXBsYWNlX2ZvbGlvKGNpLCBmb2xpbywgbmV3X2ZvbGlvKTsKJiM0MzsJfQogCi0JCXJldCA9IF9fc3BsaXRfdW5tYXBwZWRfZm9saW8oZm9saW8sIG5ld19vcmRlciwgc3BsaXRfYXQsIHhhcywKLQkJCQkJICAgICBtYXBwaW5nLCBzcGxpdF90eXBlKTsKJiM0MzsJem9uZV9kZXZpY2VfcHJpdmF0ZV9zcGxpdF9jYihmb2xpbywgTlVMTCk7CiYjNDM7CWZvbGlvX3JlZl91bmZyZWV6ZShmb2xpbywgZm9saW9fc3dhcGNhY2hlX3JlZl9jb3VudChmb2xpbykgJiM0MzsgMSk7CiAKLQkJLyoKLQkJICogVW5mcmVlemUgYWZ0ZXItc3BsaXQgZm9saW9zIGFuZCBwdXQgdGhlbSBiYWNrIHRvIHRoZSByaWdodAotCQkgKiBsaXN0LiBAZm9saW8gc2hvdWxkIGJlIGtlcHQgZnJvem9uIHVudGlsIHBhZ2UgY2FjaGUKLQkJICogZW50cmllcyBhcmUgdXBkYXRlZCB3aXRoIGFsbCB0aGUgb3RoZXIgYWZ0ZXItc3BsaXQgZm9saW9zCi0JCSAqIHRvIHByZXZlbnQgb3RoZXJzIHNlZWluZyBzdGFsZSBwYWdlIGNhY2hlIGVudHJpZXMuCi0JCSAqIEFzIGEgcmVzdWx0LCBuZXdfZm9saW8gc3RhcnRzIGZyb20gdGhlIG5leHQgZm9saW8gb2YKLQkJICogQGZvbGlvLgotCQkgKi8KLQkJZm9yIChuZXdfZm9saW8gPSBmb2xpb19uZXh0KGZvbGlvKTsgbmV3X2ZvbGlvICE9IGVuZF9mb2xpbzsKLQkJICAgICBuZXdfZm9saW8gPSBuZXh0KSB7Ci0JCQl1bnNpZ25lZCBsb25nIG5yX3BhZ2VzID0gZm9saW9fbnJfcGFnZXMobmV3X2ZvbGlvKTsKJiM0MzsJaWYgKGRvX2xydSkKJiM0MzsJCWxydXZlY191bmxvY2sobHJ1dmVjKTsKJiM0MzsJaWYgKGNpKQomIzQzOwkJc3dhcF9jbHVzdGVyX3VubG9jayhjaSk7CiYjNDM7b3V0X25vX3NwbGl0OgomIzQzOwlsb2NhbF9pcnFfZW5hYmxlKCk7CiYjNDM7CWlmIChhbm9uX3VubWFwKSB7CiYjNDM7CQlpZiAoIXJldCAmYW1wOyZhbXA7ICFmb2xpb19pc19kZXZpY2VfcHJpdmF0ZShmb2xpbykpCiYjNDM7CQkJdHR1X2ZsYWdzID0gVFRVX1VTRV9TSEFSRURfWkVST1BBR0U7CiYjNDM7CQlyZW1hcF9wYWdlKGZvbGlvLCAxICZsdDsmbHQ7IG9sZF9vcmRlciwgdHR1X2ZsYWdzKTsKJiM0MzsJfQomIzQzO291dF91bmxvY2s6CiYjNDM7CWlmIChhbm9uX3VubWFwKSB7CiYjNDM7CQlhbm9uX3ZtYV91bmxvY2tfd3JpdGUoYW5vbl92bWEpOwomIzQzOwkJcHV0X2Fub25fdm1hKGFub25fdm1hKTsKJiM0MzsJfQogCi0JCQluZXh0ID0gZm9saW9fbmV4dChuZXdfZm9saW8pOwomIzQzOwlyZXR1cm4gcmV0OwomIzQzO30KIAotCQkJem9uZV9kZXZpY2VfcHJpdmF0ZV9zcGxpdF9jYihmb2xpbywgbmV3X2ZvbGlvKTsKJiM0MztzdGF0aWMgaW50IF9fZm9saW9fZnJlZXplX3NwbGl0X3VubWFwX2ZpbGUoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlciwKJiM0MzsJCQkJCSAgIHN0cnVjdCBwYWdlICpzcGxpdF9hdCwgYm9vbCBkb19scnUsCiYjNDM7CQkJCQkgICBzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LCBlbnVtIHNwbGl0X3R5cGUgc3BsaXRfdHlwZSkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nID0gZm9saW8tJmd0O21hcHBpbmc7CiYjNDM7CVhBX1NUQVRFKHhhcywgJmFtcDttYXBwaW5nLSZndDtpX3BhZ2VzLCBmb2xpby0mZ3Q7aW5kZXgpOwomIzQzOwlzdHJ1Y3QgZm9saW8gKmVuZF9mb2xpbyA9IGZvbGlvX25leHQoZm9saW8pOwomIzQzOwlsb25nIG9sZF9ucl9wYWdlcyA9IGZvbGlvX25yX3BhZ2VzKGZvbGlvKTsKJiM0MzsJc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLCAqb2xkX21lbWNnOwomIzQzOwlzdHJ1Y3QgZm9saW8gKm5ld19mb2xpbywgKm5leHQ7CiYjNDM7CWludCBucl9zaG1lbV9kcm9wcGVkID0gMDsKJiM0MzsJdW5zaWduZWQgaW50IG1pbl9vcmRlcjsKJiM0MzsJc3RydWN0IGxydXZlYyAqbHJ1dmVjOwomIzQzOwlwZ29mZl90IGVuZCA9IDA7CiYjNDM7CWdmcF90IGdmcDsKJiM0MzsJaW50IHJldCA9IDA7CiAKLQkJCWZvbGlvX3JlZl91bmZyZWV6ZShuZXdfZm9saW8sCi0JCQkJCSAgIGZvbGlvX2NhY2hlX3JlZl9jb3VudChuZXdfZm9saW8pICYjNDM7IDEpOwomIzQzOwltaW5fb3JkZXIgPSBtYXBwaW5nX21pbl9mb2xpb19vcmRlcihtYXBwaW5nKTsKJiM0MzsJaWYgKG5ld19vcmRlciAmbHQ7IG1pbl9vcmRlcikKJiM0MzsJCXJldHVybiAtRUlOVkFMOwogCi0JCQlpZiAoZG9fbHJ1KQotCQkJCWxydV9hZGRfc3BsaXRfZm9saW8oZm9saW8sIG5ld19mb2xpbywgbHJ1dmVjLCBsaXN0KTsKJiM0MzsJLyoKJiM0MzsJICogU3dpdGNoIHRvIGZvbGlvJiMzOTtzIG1lbWNnIGFzIHhhcnJheSBub2RlIGFsbG9jYXRpb24gY2FuIGhhcHBlbiBhbmQKJiM0MzsJICogbmVlZHMgdG8gY2hhcmdlIHRvIGl0LgomIzQzOwkgKi8KJiM0MzsJbWVtY2cgPSBnZXRfbWVtX2Nncm91cF9mcm9tX2ZvbGlvKGZvbGlvKTsKJiM0MzsJb2xkX21lbWNnID0gc2V0X2FjdGl2ZV9tZW1jZyhtZW1jZyk7CiAKLQkJCS8qCi0JCQkgKiBBbm9ueW1vdXMgZm9saW8gd2l0aCBzd2FwIGNhY2hlLgotCQkJICogTk9URTogc2htZW0gaW4gc3dhcCBjYWNoZSBpcyBub3Qgc3VwcG9ydGVkIHlldC4KLQkJCSAqLwotCQkJaWYgKGNpKSB7Ci0JCQkJX19zd2FwX2NhY2hlX3JlcGxhY2VfZm9saW8oY2ksIGZvbGlvLCBuZXdfZm9saW8pOwotCQkJCWNvbnRpbnVlOwotCQkJfQomIzQzOwlnZnAgPSBjdXJyZW50X2dmcF9jb250ZXh0KG1hcHBpbmdfZ2ZwX21hc2sobWFwcGluZykgJmFtcDsgR0ZQX1JFQ0xBSU1fTUFTSyk7CiYjNDM7CWlmICghZmlsZW1hcF9yZWxlYXNlX2ZvbGlvKGZvbGlvLCBnZnApKSB7CiYjNDM7CQlyZXQgPSAtRUJVU1k7CiYjNDM7CQlnb3RvIGZhaWxfZnJlZTsKJiM0MzsJfQogCi0JCQkvKiBBbm9ueW1vdXMgZm9saW8gd2l0aG91dCBzd2FwIGNhY2hlICovCi0JCQlpZiAoIW1hcHBpbmcpCi0JCQkJY29udGludWU7CiYjNDM7CW1hcHBpbmdfc2V0X3VwZGF0ZSgmYW1wO3hhcywgbWFwcGluZyk7CiAKLQkJCS8qIEFkZCB0aGUgbmV3IGZvbGlvIHRvIHRoZSBwYWdlIGNhY2hlLiAqLwotCQkJaWYgKG5ld19mb2xpby0mZ3Q7aW5kZXggJmx0OyBlbmQpIHsKLQkJCQlfX3hhX3N0b3JlKCZhbXA7bWFwcGluZy0mZ3Q7aV9wYWdlcywgbmV3X2ZvbGlvLSZndDtpbmRleCwKLQkJCQkJICAgbmV3X2ZvbGlvLCAwKTsKLQkJCQljb250aW51ZTsKLQkJCX0KJiM0MzsJaWYgKHNwbGl0X3R5cGUgPT0gU1BMSVRfVFlQRV9VTklGT1JNKSB7CiYjNDM7CQlpbnQgb2xkX29yZGVyID0gZm9saW9fb3JkZXIoZm9saW8pOwogCi0JCQlWTV9XQVJOX09OX09OQ0UoIW5yX3NobWVtX2Ryb3BwZWQpOwotCQkJLyogRHJvcCBmb2xpbyBiZXlvbmQgRU9GOiAtJmd0O2luZGV4ICZndDs9IGVuZCAqLwotCQkJaWYgKHNobWVtX21hcHBpbmcobWFwcGluZykgJmFtcDsmYW1wOyBucl9zaG1lbV9kcm9wcGVkKQotCQkJCSpucl9zaG1lbV9kcm9wcGVkICYjNDM7PSBucl9wYWdlczsKLQkJCWVsc2UgaWYgKGZvbGlvX3Rlc3RfY2xlYXJfZGlydHkobmV3X2ZvbGlvKSkKLQkJCQlmb2xpb19hY2NvdW50X2NsZWFuZWQoCi0JCQkJCW5ld19mb2xpbywgaW5vZGVfdG9fd2IobWFwcGluZy0mZ3Q7aG9zdCkpOwotCQkJX19maWxlbWFwX3JlbW92ZV9mb2xpbyhuZXdfZm9saW8sIE5VTEwpOwotCQkJZm9saW9fcHV0X3JlZnMobmV3X2ZvbGlvLCBucl9wYWdlcyk7CiYjNDM7CQl4YXNfc2V0X29yZGVyKCZhbXA7eGFzLCBmb2xpby0mZ3Q7aW5kZXgsIG5ld19vcmRlcik7CiYjNDM7CQl4YXNfc3BsaXRfYWxsb2MoJmFtcDt4YXMsIGZvbGlvLCBvbGRfb3JkZXIsIGdmcCk7CiYjNDM7CQlpZiAoeGFzX2Vycm9yKCZhbXA7eGFzKSkgewomIzQzOwkJCXJldCA9IHhhc19lcnJvcigmYW1wO3hhcyk7CiYjNDM7CQkJZ290byBmYWlsX2ZyZWU7CiAJCX0KJiM0MzsJfQogCi0JCXpvbmVfZGV2aWNlX3ByaXZhdGVfc3BsaXRfY2IoZm9saW8sIE5VTEwpOwotCQkvKgotCQkgKiBVbmZyZWV6ZSBAZm9saW8gb25seSBhZnRlciBhbGwgcGFnZSBjYWNoZSBlbnRyaWVzLCB3aGljaAotCQkgKiB1c2VkIHRvIHBvaW50IHRvIGl0LCBoYXZlIGJlZW4gdXBkYXRlZCB3aXRoIG5ldyBmb2xpb3MuCi0JCSAqIE90aGVyd2lzZSwgYSBwYXJhbGxlbCBmb2xpb190cnlfZ2V0KCkgY2FuIGdyYWIgQGZvbGlvCi0JCSAqIGFuZCBpdHMgY2FsbGVyIGNhbiBzZWUgc3RhbGUgcGFnZSBjYWNoZSBlbnRyaWVzLgotCQkgKi8KLQkJZm9saW9fcmVmX3VuZnJlZXplKGZvbGlvLCBmb2xpb19jYWNoZV9yZWZfY291bnQoZm9saW8pICYjNDM7IDEpOwomIzQzOwlpX21tYXBfbG9ja19yZWFkKG1hcHBpbmcpOwomIzQzOwomIzQzOwkvKiBSYWN5IGNoZWNrIGlmIHdlIGNhbiBzcGxpdCB0aGUgcGFnZSwgYmVmb3JlIHVubWFwX2ZvbGlvKCkgKi8KJiM0MzsJaWYgKGZvbGlvX2V4cGVjdGVkX3JlZl9jb3VudChmb2xpbykgIT0gZm9saW9fcmVmX2NvdW50KGZvbGlvKSAtIDEpIHsKJiM0MzsJCXJldCA9IC1FQUdBSU47CiYjNDM7CQlnb3RvIGZhaWxfbW1hcF91bmxvY2s7CiYjNDM7CX0KJiM0MzsKJiM0MzsJLyoKJiM0MzsJICpfX3NwbGl0X3VubWFwcGVkX2ZvbGlvKCkgbWF5IG5lZWQgdG8gdHJpbSBvZmYgcGFnZXMgYmV5b25kCiYjNDM7CSAqIEVPRjogYnV0IG9uIDMyLWJpdCwgaV9zaXplX3JlYWQoKSB0YWtlcyBhbiBpcnEtdW5zYWZlCiYjNDM7CSAqIHNlcWxvY2ssIHdoaWNoIGNhbm5vdCBiZSBuZXN0ZWQgaW5zaWRlIHRoZSBwYWdlIHRyZWUgbG9jay4KJiM0MzsJICogU28gbm90ZSBlbmQgbm93OiBpX3NpemUgaXRzZWxmIG1heSBiZSBjaGFuZ2VkIGF0IGFueSBtb21lbnQsCiYjNDM7CSAqIGJ1dCBmb2xpbyBsb2NrIGlzIGdvb2QgZW5vdWdoIHRvIHNlcmlhbGl6ZSB0aGUgdHJpbW1pbmcuCiYjNDM7CSAqLwomIzQzOwllbmQgPSBESVZfUk9VTkRfVVAoaV9zaXplX3JlYWQobWFwcGluZy0mZ3Q7aG9zdCksIFBBR0VfU0laRSk7CiYjNDM7CWlmIChzaG1lbV9tYXBwaW5nKG1hcHBpbmcpKQomIzQzOwkJZW5kID0gc2htZW1fZmFsbG9jZW5kKG1hcHBpbmctJmd0O2hvc3QsIGVuZCk7CiYjNDM7CiYjNDM7CXVubWFwX2ZvbGlvKGZvbGlvKTsKJiM0MzsKJiM0MzsJeGFzX2xvY2tfaXJxKCZhbXA7eGFzKTsKJiM0MzsKJiM0MzsJLyoKJiM0MzsJICogQ2hlY2sgaWYgdGhlIGZvbGlvIGlzIHByZXNlbnQgaW4gcGFnZSBjYWNoZS4KJiM0MzsJICogV2UgYXNzdW1lIGFsbCB0YWlsIGFyZSBwcmVzZW50IHRvbywgaWYgZm9saW8gaXMgdGhlcmUuCiYjNDM7CSAqLwomIzQzOwlpZiAoeGFzX2xvYWQoJmFtcDt4YXMpICE9IGZvbGlvKSB7CiYjNDM7CQlyZXQgPSAtRUFHQUlOOwomIzQzOwkJZ290byBmYWlsOwomIzQzOwl9CiYjNDM7CiYjNDM7CWlmICghZm9saW9fcmVmX2ZyZWV6ZShmb2xpbywgb2xkX25yX3BhZ2VzICYjNDM7IDEpKSB7CiYjNDM7CQlyZXQgPSAtRUFHQUlOOwomIzQzOwkJZ290byBmYWlsOwomIzQzOwl9CiYjNDM7CiYjNDM7CWlmIChmb2xpb190ZXN0X3BtZF9tYXBwYWJsZShmb2xpbykgJmFtcDsmYW1wOyBuZXdfb3JkZXIgJmx0OyBIUEFHRV9QTURfT1JERVIpIHsKJiM0MzsJCWlmIChmb2xpb190ZXN0X3N3YXBiYWNrZWQoZm9saW8pKQomIzQzOwkJCWxydXZlY19zdGF0X21vZF9mb2xpbyhmb2xpbywgTlJfU0hNRU1fVEhQUywgLW9sZF9ucl9wYWdlcyk7CiYjNDM7CQllbHNlCiYjNDM7CQkJbHJ1dmVjX3N0YXRfbW9kX2ZvbGlvKGZvbGlvLCBOUl9GSUxFX1RIUFMsIC1vbGRfbnJfcGFnZXMpOwomIzQzOwl9CiYjNDM7CiYjNDM7CS8qIGxvY2sgbHJ1IGxpc3QvUGFnZUNvbXBvdW5kLCByZWYgZnJvemVuIGJ5IHBhZ2VfcmVmX2ZyZWV6ZSAqLwomIzQzOwlpZiAoZG9fbHJ1KQomIzQzOwkJbHJ1dmVjID0gZm9saW9fbHJ1dmVjX2xvY2soZm9saW8pOwomIzQzOwomIzQzOwlyZXQgPSBfX3NwbGl0X3VubWFwcGVkX2ZvbGlvKGZvbGlvLCBuZXdfb3JkZXIsIHNwbGl0X2F0LCAmYW1wO3hhcywKJiM0MzsJCQkJICAgICBtYXBwaW5nLCBzcGxpdF90eXBlKTsKJiM0MzsKJiM0MzsJLyoKJiM0MzsJICogVW5mcmVlemUgYWZ0ZXItc3BsaXQgZm9saW9zIGFuZCBwdXQgdGhlbSBiYWNrIHRvIHRoZSByaWdodAomIzQzOwkgKiBsaXN0LiBAZm9saW8gc2hvdWxkIGJlIGtlcHQgZnJvemVuIHVudGlsIHBhZ2UgY2FjaGUKJiM0MzsJICogZW50cmllcyBhcmUgdXBkYXRlZCB3aXRoIGFsbCB0aGUgb3RoZXIgYWZ0ZXItc3BsaXQgZm9saW9zCiYjNDM7CSAqIHRvIHByZXZlbnQgb3RoZXJzIHNlZWluZyBzdGFsZSBwYWdlIGNhY2hlIGVudHJpZXMuCiYjNDM7CSAqIEFzIGEgcmVzdWx0LCBuZXdfZm9saW8gc3RhcnRzIGZyb20gdGhlIG5leHQgZm9saW8gb2YKJiM0MzsJICogQGZvbGlvLgomIzQzOwkgKi8KJiM0MzsJZm9yIChuZXdfZm9saW8gPSBmb2xpb19uZXh0KGZvbGlvKTsgbmV3X2ZvbGlvICE9IGVuZF9mb2xpbzsKJiM0MzsJICAgICBuZXdfZm9saW8gPSBuZXh0KSB7CiYjNDM7CQl1bnNpZ25lZCBsb25nIG5yX3BhZ2VzID0gZm9saW9fbnJfcGFnZXMobmV3X2ZvbGlvKTsKJiM0MzsKJiM0MzsJCW5leHQgPSBmb2xpb19uZXh0KG5ld19mb2xpbyk7CiYjNDM7CiYjNDM7CQlmb2xpb19yZWZfdW5mcmVlemUobmV3X2ZvbGlvLAomIzQzOwkJCQkgICBmb2xpb19ucl9wYWdlcyhuZXdfZm9saW8pICYjNDM7IDEpOwogCiAJCWlmIChkb19scnUpCi0JCQlscnV2ZWNfdW5sb2NrKGxydXZlYyk7CiYjNDM7CQkJbHJ1X2FkZF9zcGxpdF9mb2xpbyhmb2xpbywgbmV3X2ZvbGlvLCBscnV2ZWMsIGxpc3QpOwogCi0JCWlmIChjaSkKLQkJCXN3YXBfY2x1c3Rlcl91bmxvY2soY2kpOwotCX0gZWxzZSB7Ci0JCWlmIChkZXF1ZXVlX2RlZmVycmVkKSB7Ci0JCQlsaXN0X2xydV91bmxvY2sobHJ1KTsKLQkJCXJjdV9yZWFkX3VubG9jaygpOwomIzQzOwkJLyogQWRkIHRoZSBuZXcgZm9saW8gdG8gdGhlIHBhZ2UgY2FjaGUuICovCiYjNDM7CQlpZiAobmV3X2ZvbGlvLSZndDtpbmRleCAmbHQ7IGVuZCkgewomIzQzOwkJCV9feGFfc3RvcmUoJmFtcDttYXBwaW5nLSZndDtpX3BhZ2VzLCBuZXdfZm9saW8tJmd0O2luZGV4LAomIzQzOwkJCQkgICBuZXdfZm9saW8sIDApOwomIzQzOwkJCWNvbnRpbnVlOwogCQl9Ci0JCXJldHVybiAtRUFHQUlOOwomIzQzOwomIzQzOwkJLyogRHJvcCBmb2xpbyBiZXlvbmQgRU9GOiAtJmd0O2luZGV4ICZndDs9IGVuZCAqLwomIzQzOwkJaWYgKHNobWVtX21hcHBpbmcobWFwcGluZykpCiYjNDM7CQkJbnJfc2htZW1fZHJvcHBlZCAmIzQzOz0gbnJfcGFnZXM7CiYjNDM7CQllbHNlIGlmIChmb2xpb190ZXN0X2NsZWFyX2RpcnR5KG5ld19mb2xpbykpCiYjNDM7CQkJZm9saW9fYWNjb3VudF9jbGVhbmVkKG5ld19mb2xpbywKJiM0MzsJCQkJCSAgICAgIGlub2RlX3RvX3diKG1hcHBpbmctJmd0O2hvc3QpKTsKJiM0MzsJCV9fZmlsZW1hcF9yZW1vdmVfZm9saW8obmV3X2ZvbGlvLCBOVUxMKTsKJiM0MzsJCWZvbGlvX3B1dF9yZWZzKG5ld19mb2xpbywgbnJfcGFnZXMpOwogCX0KIAomIzQzOwkvKgomIzQzOwkgKiBVbmZyZWV6ZSBAZm9saW8gb25seSBhZnRlciBhbGwgcGFnZSBjYWNoZSBlbnRyaWVzLCB3aGljaAomIzQzOwkgKiB1c2VkIHRvIHBvaW50IHRvIGl0LCBoYXZlIGJlZW4gdXBkYXRlZCB3aXRoIG5ldyBmb2xpb3MuCiYjNDM7CSAqIE90aGVyd2lzZSwgYSBwYXJhbGxlbCBmb2xpb190cnlfZ2V0KCkgY2FuIGdyYWIgQGZvbGlvCiYjNDM7CSAqIGFuZCBpdHMgY2FsbGVyIGNhbiBzZWUgc3RhbGUgcGFnZSBjYWNoZSBlbnRyaWVzLgomIzQzOwkgKi8KJiM0MzsJZm9saW9fcmVmX3VuZnJlZXplKGZvbGlvLCBmb2xpb19ucl9wYWdlcyhmb2xpbykgJiM0MzsgMSk7CiYjNDM7CiYjNDM7CWlmIChkb19scnUpCiYjNDM7CQlscnV2ZWNfdW5sb2NrKGxydXZlYyk7CiYjNDM7CiYjNDM7ZmFpbDoKJiM0MzsJeGFzX3VubG9ja19pcnEoJmFtcDt4YXMpOwomIzQzO2ZhaWxfbW1hcF91bmxvY2s6CiYjNDM7CWlmIChucl9zaG1lbV9kcm9wcGVkKQomIzQzOwkJc2htZW1fdW5jaGFyZ2UobWFwcGluZy0mZ3Q7aG9zdCwgbnJfc2htZW1fZHJvcHBlZCk7CiYjNDM7CS8qCiYjNDM7CSAqIERyb3AgdGhlIG1hcHBpbmcgd2hpbGUgdGhlIGlub2RlIGlzIHN0aWxsIHBpbm5lZC4gQGZvbGlvIHN0YXlzCiYjNDM7CSAqIGxvY2tlZCBhbmQgcHJlc2VudCBpbiB0aGUgcGFnZSBjYWNoZSwgc28gZXZpY3Rpb24gY2Fubm90IGZyZWUKJiM0MzsJICogdGhlIGlub2RlIHlldCwgbm90aGluZyBwYXN0IHRoaXMgcG9pbnQgbWF5IHRvdWNoIHRoZSBpbm9kZSBvcgomIzQzOwkgKiB0aGUgbWFwcGluZy4KJiM0MzsJICovCiYjNDM7CWlfbW1hcF91bmxvY2tfcmVhZChtYXBwaW5nKTsKJiM0MztmYWlsX2ZyZWU6CiYjNDM7CS8qIFJlc3RvcmUgdGhlIHByZXZpb3VzbHkgYWN0aXZlIG1lbWNnICovCiYjNDM7CXNldF9hY3RpdmVfbWVtY2cob2xkX21lbWNnKTsKJiM0MzsJbWVtX2Nncm91cF9wdXQobWVtY2cpOwomIzQzOwl4YXNfZGVzdHJveSgmYW1wO3hhcyk7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtNDEwMiwxNyAmIzQzOzQyNDgsMTEgQEAgc3RhdGljIGludCBfX2ZvbGlvX3NwbGl0KHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIsCiAJCXN0cnVjdCBwYWdlICpzcGxpdF9hdCwgc3RydWN0IHBhZ2UgKmxvY2tfYXQsCiAJCXN0cnVjdCBsaXN0X2hlYWQgKmxpc3QsIGVudW0gc3BsaXRfdHlwZSBzcGxpdF90eXBlKQogewotCVhBX1NUQVRFKHhhcywgJmFtcDtmb2xpby0mZ3Q7bWFwcGluZy0mZ3Q7aV9wYWdlcywgZm9saW8tJmd0O2luZGV4KTsKJiM0MzsJYm9vbCBpc19zd2FwY2FjaGUgPSBmb2xpb190ZXN0X3N3YXBjYWNoZShmb2xpbyk7CiAJc3RydWN0IGZvbGlvICplbmRfZm9saW8gPSBmb2xpb19uZXh0KGZvbGlvKTsKIAlib29sIGlzX2Fub24gPSBmb2xpb190ZXN0X2Fub24oZm9saW8pOwotCXN0cnVjdCBtZW1fY2dyb3VwICptZW1jZywgKm9sZF9tZW1jZzsKLQlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyA9IE5VTEw7Ci0Jc3RydWN0IGFub25fdm1hICphbm9uX3ZtYSA9IE5VTEw7CiAJaW50IG9sZF9vcmRlciA9IGZvbGlvX29yZGVyKGZvbGlvKTsKIAlzdHJ1Y3QgZm9saW8gKm5ld19mb2xpbywgKm5leHQ7Ci0JaW50IG5yX3NobWVtX2Ryb3BwZWQgPSAwOwotCWVudW0gdHR1X2ZsYWdzIHR0dV9mbGFncyA9IDA7Ci0JcGdvZmZfdCBlbmQgPSAwOwogCWludCByZXQ7CiAKIAlWTV9XQVJOX09OX09OQ0VfRk9MSU8oIWZvbGlvX3Rlc3RfbG9ja2VkKGZvbGlvKSwgZm9saW8pOwpAQCAtNDEyMCwxNDEgJiM0Mzs0MjYwLDI5IEBAIHN0YXRpYyBpbnQgX19mb2xpb19zcGxpdChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyLAogCiAJaWYgKGZvbGlvICE9IHBhZ2VfZm9saW8oc3BsaXRfYXQpIHx8IGZvbGlvICE9IHBhZ2VfZm9saW8obG9ja19hdCkpIHsKIAkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBvdXRfbm9fbWVtY2c7CiYjNDM7CQlnb3RvIG91dDsKIAl9CiAKIAlpZiAobmV3X29yZGVyICZndDs9IG9sZF9vcmRlcikgewogCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIG91dF9ub19tZW1jZzsKJiM0MzsJCWdvdG8gb3V0OwogCX0KIAogCXJldCA9IGZvbGlvX2NoZWNrX3NwbGl0dGFibGUoZm9saW8sIG5ld19vcmRlciwgc3BsaXRfdHlwZSk7CiAJaWYgKHJldCkgewogCQlWTV9XQVJOX09OQ0UocmV0ID09IC1FSU5WQUwsICYjMzQ7VHJpZWQgdG8gc3BsaXQgYW4gdW5zcGxpdHRhYmxlIGZvbGlvJiMzNDspOwotCQlnb3RvIG91dF9ub19tZW1jZzsKLQl9Ci0KLQkvKgotCSAqIHN3aXRjaCB0byBmb2xpbyYjMzk7cyBtZW1jZyBhcyB4YXJyYXkgbm9kZSBhbGxvY2F0aW9uIGNhbiBoYXBwZW4gYW5kCi0JICogbmVlZHMgdG8gY2hhcmdlIHRvIGl0LgotCSAqLwotCW1lbWNnID0gZ2V0X21lbV9jZ3JvdXBfZnJvbV9mb2xpbyhmb2xpbyk7Ci0Jb2xkX21lbWNnID0gc2V0X2FjdGl2ZV9tZW1jZyhtZW1jZyk7Ci0KLQlpZiAoaXNfYW5vbikgewotCQkvKgotCQkgKiBUaGUgY2FsbGVyIGRvZXMgbm90IG5lY2Vzc2FyaWx5IGhvbGQgYW4gbW1hcF9sb2NrIHRoYXQgd291bGQKLQkJICogcHJldmVudCB0aGUgYW5vbl92bWEgZGlzYXBwZWFyaW5nIHNvIHdlIGZpcnN0IHdlIHRha2UgYQotCQkgKiByZWZlcmVuY2UgdG8gaXQgYW5kIHRoZW4gbG9jayB0aGUgYW5vbl92bWEgZm9yIHdyaXRlLiBUaGlzCi0JCSAqIGlzIHNpbWlsYXIgdG8gZm9saW9fbG9ja19hbm9uX3ZtYV9yZWFkIGV4Y2VwdCB0aGUgd3JpdGUgbG9jawotCQkgKiBpcyB0YWtlbiB0byBzZXJpYWxpc2UgYWdhaW5zdCBwYXJhbGxlbCBzcGxpdCBvciBjb2xsYXBzZQotCQkgKiBvcGVyYXRpb25zLgotCQkgKi8KLQkJYW5vbl92bWEgPSBmb2xpb19nZXRfYW5vbl92bWEoZm9saW8pOwotCQlpZiAoIWFub25fdm1hKSB7Ci0JCQlyZXQgPSAtRUJVU1k7Ci0JCQlnb3RvIG91dDsKLQkJfQotCQlhbm9uX3ZtYV9sb2NrX3dyaXRlKGFub25fdm1hKTsKLQkJbWFwcGluZyA9IE5VTEw7Ci0JfSBlbHNlIHsKLQkJdW5zaWduZWQgaW50IG1pbl9vcmRlcjsKLQkJZ2ZwX3QgZ2ZwOwotCi0JCW1hcHBpbmcgPSBmb2xpby0mZ3Q7bWFwcGluZzsKLQkJbWluX29yZGVyID0gbWFwcGluZ19taW5fZm9saW9fb3JkZXIobWFwcGluZyk7Ci0JCWlmIChuZXdfb3JkZXIgJmx0OyBtaW5fb3JkZXIpIHsKLQkJCXJldCA9IC1FSU5WQUw7Ci0JCQlnb3RvIG91dDsKLQkJfQotCi0JCWdmcCA9IGN1cnJlbnRfZ2ZwX2NvbnRleHQobWFwcGluZ19nZnBfbWFzayhtYXBwaW5nKSAmYW1wOwotCQkJCQkJCUdGUF9SRUNMQUlNX01BU0spOwotCi0JCWlmICghZmlsZW1hcF9yZWxlYXNlX2ZvbGlvKGZvbGlvLCBnZnApKSB7Ci0JCQlyZXQgPSAtRUJVU1k7Ci0JCQlnb3RvIG91dDsKLQkJfQotCi0JCW1hcHBpbmdfc2V0X3VwZGF0ZSgmYW1wO3hhcywgbWFwcGluZyk7Ci0KLQkJaWYgKHNwbGl0X3R5cGUgPT0gU1BMSVRfVFlQRV9VTklGT1JNKSB7Ci0JCQl4YXNfc2V0X29yZGVyKCZhbXA7eGFzLCBmb2xpby0mZ3Q7aW5kZXgsIG5ld19vcmRlcik7Ci0JCQl4YXNfc3BsaXRfYWxsb2MoJmFtcDt4YXMsIGZvbGlvLCBvbGRfb3JkZXIsIGdmcCk7Ci0JCQlpZiAoeGFzX2Vycm9yKCZhbXA7eGFzKSkgewotCQkJCXJldCA9IHhhc19lcnJvcigmYW1wO3hhcyk7Ci0JCQkJZ290byBvdXQ7Ci0JCQl9Ci0JCX0KLQotCQlhbm9uX3ZtYSA9IE5VTEw7Ci0JCWlfbW1hcF9sb2NrX3JlYWQobWFwcGluZyk7Ci0KLQkJLyoKLQkJICpfX3NwbGl0X3VubWFwcGVkX2ZvbGlvKCkgbWF5IG5lZWQgdG8gdHJpbSBvZmYgcGFnZXMgYmV5b25kCi0JCSAqIEVPRjogYnV0IG9uIDMyLWJpdCwgaV9zaXplX3JlYWQoKSB0YWtlcyBhbiBpcnEtdW5zYWZlCi0JCSAqIHNlcWxvY2ssIHdoaWNoIGNhbm5vdCBiZSBuZXN0ZWQgaW5zaWRlIHRoZSBwYWdlIHRyZWUgbG9jay4KLQkJICogU28gbm90ZSBlbmQgbm93OiBpX3NpemUgaXRzZWxmIG1heSBiZSBjaGFuZ2VkIGF0IGFueSBtb21lbnQsCi0JCSAqIGJ1dCBmb2xpbyBsb2NrIGlzIGdvb2QgZW5vdWdoIHRvIHNlcmlhbGl6ZSB0aGUgdHJpbW1pbmcuCi0JCSAqLwotCQllbmQgPSBESVZfUk9VTkRfVVAoaV9zaXplX3JlYWQobWFwcGluZy0mZ3Q7aG9zdCksIFBBR0VfU0laRSk7Ci0JCWlmIChzaG1lbV9tYXBwaW5nKG1hcHBpbmcpKQotCQkJZW5kID0gc2htZW1fZmFsbG9jZW5kKG1hcHBpbmctJmd0O2hvc3QsIGVuZCk7Ci0JfQotCi0JLyoKLQkgKiBSYWN5IGNoZWNrIGlmIHdlIGNhbiBzcGxpdCB0aGUgcGFnZSwgYmVmb3JlIHVubWFwX2ZvbGlvKCkgd2lsbAotCSAqIHNwbGl0IFBNRHMKLQkgKi8KLQlpZiAoZm9saW9fZXhwZWN0ZWRfcmVmX2NvdW50KGZvbGlvKSAhPSBmb2xpb19yZWZfY291bnQoZm9saW8pIC0gMSkgewotCQlyZXQgPSAtRUFHQUlOOwotCQlnb3RvIG91dF91bmxvY2s7Ci0JfQotCi0JdW5tYXBfZm9saW8oZm9saW8pOwotCi0JLyogYmxvY2sgaW50ZXJydXB0IHJlZW50cnkgaW4geGFfbG9jayBhbmQgc3BpbmxvY2sgKi8KLQlsb2NhbF9pcnFfZGlzYWJsZSgpOwotCWlmIChtYXBwaW5nKSB7Ci0JCS8qCi0JCSAqIENoZWNrIGlmIHRoZSBmb2xpbyBpcyBwcmVzZW50IGluIHBhZ2UgY2FjaGUuCi0JCSAqIFdlIGFzc3VtZSBhbGwgdGFpbCBhcmUgcHJlc2VudCB0b28sIGlmIGZvbGlvIGlzIHRoZXJlLgotCQkgKi8KLQkJeGFzX2xvY2soJmFtcDt4YXMpOwotCQl4YXNfcmVzZXQoJmFtcDt4YXMpOwotCQlpZiAoeGFzX2xvYWQoJmFtcDt4YXMpICE9IGZvbGlvKSB7Ci0JCQlyZXQgPSAtRUFHQUlOOwotCQkJZ290byBmYWlsOwotCQl9CiYjNDM7CQlnb3RvIG91dDsKIAl9CiAKLQlyZXQgPSBfX2ZvbGlvX2ZyZWV6ZV9hbmRfc3BsaXRfdW5tYXBwZWQoZm9saW8sIG5ld19vcmRlciwgc3BsaXRfYXQsICZhbXA7eGFzLCBtYXBwaW5nLAotCQkJCQkJdHJ1ZSwgbGlzdCwgc3BsaXRfdHlwZSwgZW5kLCAmYW1wO25yX3NobWVtX2Ryb3BwZWQpOwotZmFpbDoKLQlpZiAobWFwcGluZykKLQkJeGFzX3VubG9jaygmYW1wO3hhcyk7Ci0KLQlsb2NhbF9pcnFfZW5hYmxlKCk7Ci0KLQlpZiAobnJfc2htZW1fZHJvcHBlZCkKLQkJc2htZW1fdW5jaGFyZ2UobWFwcGluZy0mZ3Q7aG9zdCwgbnJfc2htZW1fZHJvcHBlZCk7Ci0KLQlpZiAoIXJldCAmYW1wOyZhbXA7IGlzX2Fub24gJmFtcDsmYW1wOyAhZm9saW9faXNfZGV2aWNlX3ByaXZhdGUoZm9saW8pKQotCQl0dHVfZmxhZ3MgPSBUVFVfVVNFX1NIQVJFRF9aRVJPUEFHRTsKLQotCXJlbWFwX3BhZ2UoZm9saW8sIDEgJmx0OyZsdDsgb2xkX29yZGVyLCB0dHVfZmxhZ3MpOwotCi0JLyoKLQkgKiBEcm9wIHRoZSBtYXBwaW5nIHdoaWxlIHRoZSBpbm9kZSBpcyBzdGlsbCBwaW5uZWQuIEBmb2xpbyBzdGF5cwotCSAqIGxvY2tlZCBhbmQgcHJlc2VudCBpbiB0aGUgcGFnZSBjYWNoZSB1bnRpbCB0aGUgbG9vcCBiZWxvdywgc28KLQkgKiBldmljdGlvbiBjYW5ub3QgZnJlZSB0aGUgaW5vZGUgeWV0OyBAbG9ja19hdCBpcyBub3QgZW5vdWdoLCBpdCBtYXkKLQkgKiBiZSBhIHRhaWwgYmV5b25kIEVPRiB0aGF0IHRoZSBzcGxpdCBhbHJlYWR5IGRyb3BwZWQgZnJvbSB0aGUgcGFnZQotCSAqIGNhY2hlLiBOb3RoaW5nIHBhc3QgdGhpcyBwb2ludCBtYXkgdG91Y2ggdGhlIGlub2RlIG9yIHRoZSBtYXBwaW5nLgotCSAqLwotCWlmIChtYXBwaW5nKSB7Ci0JCWlfbW1hcF91bmxvY2tfcmVhZChtYXBwaW5nKTsKLQkJbWFwcGluZyA9IE5VTEw7Ci0JfQomIzQzOwlpZiAoaXNfYW5vbikKJiM0MzsJCXJldCA9IF9fZm9saW9fZnJlZXplX3NwbGl0X3VubWFwKGZvbGlvLCBuZXdfb3JkZXIsIHNwbGl0X2F0LCB0cnVlLAomIzQzOwkJCQkJCSB0cnVlLCBsaXN0LCBzcGxpdF90eXBlKTsKJiM0MzsJZWxzZSBpZiAoaXNfc3dhcGNhY2hlKQomIzQzOwkJcmV0ID0gX19mb2xpb19mcmVlemVfc3BsaXRfdW5tYXAoZm9saW8sIG5ld19vcmRlciwgc3BsaXRfYXQsIHRydWUsCiYjNDM7CQkJCQkJIGZhbHNlLCBsaXN0LCBzcGxpdF90eXBlKTsKJiM0MzsJZWxzZQomIzQzOwkJcmV0ID0gX19mb2xpb19mcmVlemVfc3BsaXRfdW5tYXBfZmlsZShmb2xpbywgbmV3X29yZGVyLCBzcGxpdF9hdCwKJiM0MzsJCQkJCQkgICAgICB0cnVlLCBsaXN0LCBzcGxpdF90eXBlKTsKIAogCS8qCiAJICogVW5sb2NrIGFsbCBhZnRlci1zcGxpdCBmb2xpb3MgZXhjZXB0IHRoZSBvbmUgY29udGFpbmluZwpAQCAtNDI2NSwyOSAmIzQzOzQyOTMsMTkgQEAgc3RhdGljIGludCBfX2ZvbGlvX3NwbGl0KHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIsCiAJCWlmIChuZXdfZm9saW8gPT0gcGFnZV9mb2xpbyhsb2NrX2F0KSkKIAkJCWNvbnRpbnVlOwogCi0JCWZvbGlvX3VubG9jayhuZXdfZm9saW8pOwogCQkvKgogCQkgKiBTdWJwYWdlcyB3aG9zZSBtYXBwaW5nIGhhcyBiZWVuIHphcHBlZCBtYXkgYmUgZnJlZWQKIAkJICogZWFybGllciwgYnV0IGZyZWVpbmcgdGhlbSByZXF1aXJlcyB0YWtpbmcgdGhlCiAJCSAqIGxydV9sb2NrLCBzbyB3ZSBkZWZlciBwdXRfcGFnZSgpIG9uIHRhaWwgcGFnZXMgdW50aWwKIAkJICogYWZ0ZXIgdGhlIHNwbGl0IGNvbXBsZXRlcy4KIAkJICovCi0JCWZyZWVfZm9saW9fYW5kX3N3YXBfY2FjaGUobmV3X2ZvbGlvKTsKJiM0MzsJCWlmIChpc19zd2FwY2FjaGUpCiYjNDM7CQkJZm9saW9fZnJlZV9zd2FwKG5ld19mb2xpbyk7CiYjNDM7CQlmb2xpb191bmxvY2sobmV3X2ZvbGlvKTsKJiM0MzsJCWZvbGlvX3B1dChuZXdfZm9saW8pOwogCX0KIAotb3V0X3VubG9jazoKLQlpZiAoYW5vbl92bWEpIHsKLQkJYW5vbl92bWFfdW5sb2NrX3dyaXRlKGFub25fdm1hKTsKLQkJcHV0X2Fub25fdm1hKGFub25fdm1hKTsKLQl9Ci0JaWYgKG1hcHBpbmcpCi0JCWlfbW1hcF91bmxvY2tfcmVhZChtYXBwaW5nKTsKIG91dDoKLQkvKiByZXN0b3JlIHRvIGNhbGxlciYjMzk7cyBvbGRfbWVtY2cgKi8KLQlzZXRfYWN0aXZlX21lbWNnKG9sZF9tZW1jZyk7Ci0JbWVtX2Nncm91cF9wdXQobWVtY2cpOwotb3V0X25vX21lbWNnOgotCXhhc19kZXN0cm95KCZhbXA7eGFzKTsKIAlpZiAoaXNfcG1kX29yZGVyKG9sZF9vcmRlcikpCiAJCWNvdW50X3ZtX2V2ZW50KCFyZXQgPyBUSFBfU1BMSVRfUEFHRSA6IFRIUF9TUExJVF9QQUdFX0ZBSUxFRCk7CiAJY291bnRfbXRocF9zdGF0KG9sZF9vcmRlciwgIXJldCA/IE1USFBfU1RBVF9TUExJVCA6IE1USFBfU1RBVF9TUExJVF9GQUlMRUQpOwpAQCAtNDMxOCwyMiAmIzQzOzQzMzYsMTMgQEAgc3RhdGljIGludCBfX2ZvbGlvX3NwbGl0KHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIsCiAgKi8KIGludCBmb2xpb19zcGxpdF91bm1hcHBlZChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyKQogewotCWludCByZXQgPSAwOwotCiAJVk1fV0FSTl9PTl9PTkNFX0ZPTElPKGZvbGlvX21hcHBlZChmb2xpbyksIGZvbGlvKTsKIAlWTV9XQVJOX09OX09OQ0VfRk9MSU8oIWZvbGlvX3Rlc3RfbG9ja2VkKGZvbGlvKSwgZm9saW8pOwogCVZNX1dBUk5fT05fT05DRV9GT0xJTyghZm9saW9fdGVzdF9sYXJnZShmb2xpbyksIGZvbGlvKTsKIAlWTV9XQVJOX09OX09OQ0VfRk9MSU8oIWZvbGlvX3Rlc3RfYW5vbihmb2xpbyksIGZvbGlvKTsKIAotCWlmIChmb2xpb19leHBlY3RlZF9yZWZfY291bnQoZm9saW8pICE9IGZvbGlvX3JlZl9jb3VudChmb2xpbykgLSAxKQotCQlyZXR1cm4gLUVBR0FJTjsKLQotCWxvY2FsX2lycV9kaXNhYmxlKCk7Ci0JcmV0ID0gX19mb2xpb19mcmVlemVfYW5kX3NwbGl0X3VubWFwcGVkKGZvbGlvLCBuZXdfb3JkZXIsICZhbXA7Zm9saW8tJmd0O3BhZ2UsIE5VTEwsCi0JCQkJCQlOVUxMLCBmYWxzZSwgTlVMTCwgU1BMSVRfVFlQRV9VTklGT1JNLAotCQkJCQkJMCwgTlVMTCk7Ci0JbG9jYWxfaXJxX2VuYWJsZSgpOwotCXJldHVybiByZXQ7CiYjNDM7CXJldHVybiBfX2ZvbGlvX2ZyZWV6ZV9zcGxpdF91bm1hcChmb2xpbywgbmV3X29yZGVyLCAmYW1wO2ZvbGlvLSZndDtwYWdlLCBmYWxzZSwKJiM0MzsJCQkJCSAgZmFsc2UsIE5VTEwsIFNQTElUX1RZUEVfVU5JRk9STSk7CiB9CiAKIC8qCkBAIC00MzUyLDExICYjNDM7NDM2MSwxMSBAQCBpbnQgZm9saW9fc3BsaXRfdW5tYXBwZWQoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlcikKICAqICAgIEdVUCBwaW5zLCB3aWxsIHJlc3VsdCBpbiB0aGUgZm9saW8gbm90IGdldHRpbmcgc3BsaXQ7IGluc3RlYWQsIHRoZSBjYWxsZXIKICAqICAgIHdpbGwgcmVjZWl2ZSBhbiAtRUFHQUlOLgogICoKLSAqIDQpIEBuZXdfb3JkZXIgJmd0OyAxLCB1c3VhbGx5LiBTcGxpdHRpbmcgdG8gb3JkZXItMSBhbm9ueW1vdXMgZm9saW9zIGlzIG5vdAotICogICAgc3VwcG9ydGVkIGZvciBub24tZmlsZS1iYWNrZWQgZm9saW9zLCBiZWNhdXNlIGZvbGlvLSZndDtfZGVmZXJyZWRfbGlzdCwgd2hpY2gKLSAqICAgIGlzIHVzZWQgYnkgcGFydGlhbGx5IG1hcHBlZCBmb2xpb3MsIGlzIHN0b3JlZCBpbiBzdWJwYWdlIDIsIGJ1dCBhbiBvcmRlci0xCi0gKiAgICBmb2xpbyBvbmx5IGhhcyBzdWJwYWdlcyAwIGFuZCAxLiBGaWxlLWJhY2tlZCBvcmRlci0xIGZvbGlvcyBhcmUgc3VwcG9ydGVkLAotICogICAgc2luY2UgdGhleSBkbyBub3QgdXNlIF9kZWZlcnJlZF9saXN0LgomIzQzOyAqIDQpIEBuZXdfb3JkZXIgJmd0OyAxLCB1c3VhbGx5LiBPcmRlci0xIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIGFub24gb3Igc3dhcGNhY2hlCiYjNDM7ICogICAgZm9saW9zOiBhbm9uIGZvbGlvcyBuZWVkIHN1YnBhZ2UgMiBmb3IgX2RlZmVycmVkX2xpc3QsIHdoaWNoIG9yZGVyLTEKJiM0MzsgKiAgICBmb2xpb3MgbGFjaywgYW5kIGEgc3dhcGNhY2hlIGZvbGlvIG1heSBiZWNvbWUgYW5vbiBvbmNlIGZhdWx0ZWQgaW4uCiYjNDM7ICogICAgRmlsZS1iYWNrZWQgb3JkZXItMSBmb2xpb3MgYXJlIHN1cHBvcnRlZCwgc2luY2UgdGhleSBkbyBub3QgdXNlCiYjNDM7ICogICAgX2RlZmVycmVkX2xpc3QuCiAgKgogICogQWZ0ZXIgc3BsaXR0aW5nLCB0aGUgY2FsbGVyJiMzOTtzIGZvbGlvIHJlZmVyZW5jZSB3aWxsIGJlIHRyYW5zZmVycmVkIHRvIEBwYWdlLAogICogcmVzdWx0aW5nIGluIGEgcmFpc2VkIHJlZmNvdW50IG9mIEBwYWdlIGFmdGVyIHRoaXMgY2FsbC4gVGhlIG90aGVyIHBhZ2VzIG1heQpkaWZmIC0tZ2l0IGEvbW0vc3dhcF9zdGF0ZS5jIGIvbW0vc3dhcF9zdGF0ZS5jCmluZGV4IDViZTgyNTkxMWU2NDUuLmYxNDA1ZTViODEzZWUgMTAwNjQ0Ci0tLSBhL21tL3N3YXBfc3RhdGUuYwomIzQzOyYjNDM7JiM0MzsgYi9tbS9zd2FwX3N0YXRlLmMKQEAgLTM4OCw4ICYjNDM7Mzg4LDkgQEAgdm9pZCBfX3N3YXBfY2FjaGVfcmVwbGFjZV9mb2xpbyhzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpLAogCSAgICBmb2xpb19vcmRlcihvbGQpICE9IGZvbGlvX29yZGVyKG5ldykpIHsKIAkJY2lfb2ZmID0gc3dwX2NsdXN0ZXJfb2Zmc2V0KG9sZC0mZ3Q7c3dhcCk7CiAJCWNpX2VuZCA9IGNpX29mZiAmIzQzOyBmb2xpb19ucl9wYWdlcyhvbGQpOwotCQl3aGlsZSAoY2lfb2ZmJiM0MzsmIzQzOyAmbHQ7IGNpX2VuZCkKJiM0MzsJCWRvIHsKIAkJCVdBUk5fT05fT05DRShzd3BfdGJfdG9fZm9saW8oX19zd2FwX3RhYmxlX2dldChjaSwgY2lfb2ZmKSkgIT0gb2xkKTsKJiM0MzsJCX0gd2hpbGUgKCYjNDM7JiM0MztjaV9vZmYgJmx0OyBjaV9lbmQpOwogCX0KIH0KIAo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40MS8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDcgMjE6NTU8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTE0MTYKCQkJCQkJCW91dHB1dDogMTg0CgkJCQkJCQl0aG91Z2h0czogNjA1CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKktNU0FOIENoZWNrOiBGb2xpbyBTcGxpdHRpbmcgUmVmYWN0b3IqKgoKT2theSwgc28gSSYjMzk7dmUgYmVlbiByZXZpZXdpbmcgdGhpcyBwYXRjaCwgYW5kIGl0JiMzOTtzIHRvdWNoaW5nIHNvbWUgY29yZSBtZW1vcnkgbWFuYWdlbWVudCBzdHVmZjogYG1tL2h1Z2VfbWVtb3J5LmNgIGFuZCBgbW0vc3dhcF9zdGF0ZS5jYC4gSXQmIzM5O3MgYWxsIGFib3V0IGhvdyBmb2xpb3MgZ2V0IHNwbGl0IHVwLCBwYXJ0aWN1bGFybHkgZGVhbGluZyB3aXRoIHRob3NlIHVubWFwcGVkLCBhbm9ueW1vdXMsIGFuZCBzd2FwY2FjaGUgZm9saW9zLiBUaGUgY29kZSYjMzk7cyByZWZhY3RvcmluZyBzZXZlcmFsIGtleSBmdW5jdGlvbnM6IGByZW1hcF9wYWdlYCwgYSBidW5jaCBvZiBgX19zcGxpdF8qYCwgYGZvbGlvXypgIGFuZCBgX19zd2FwX2NhY2hlX3JlcGxhY2VfZm9saW9gLiBMb29rcyBsaWtlIGEgZmFpcmx5IGludm9sdmVkIGNoYW5nZS4KCk15IGltbWVkaWF0ZSBjb25jZXJuLCBhcyBhbHdheXMgd2l0aCBtZW1vcnkgbWFuYWdlbWVudCwgaXMgdW5pbml0aWFsaXplZCBtZW1vcnkgYWNjZXNzLiBHaXZlbiBteSBleHBlcnRpc2UsIEkgYWx3YXlzIHNjcnV0aW5pemUgdGhlc2UgcGF0Y2hlcyBmb3IgdGhhdCBwb3RlbnRpYWwuIEkgc2VlIHRoaXMgYXMgYSBmb2xpbyBzcGxpdHRpbmcgcGF0Y2gsIHdoaWNoIGRvZXMgbm90IGFsbG9jYXRlICpuZXcqIG1lbW9yeS4gSXQmIzM5O3Mgd29ya2luZyB3aXRoIGV4aXN0aW5nIHBhZ2UgbWV0YWRhdGEgKGVzc2VudGlhbGx5IGBzdHJ1Y3QgcGFnZWAgYWxyZWFkeSBwcmVzZW50IGluIGBtZW1tYXBgKSwgYW5kIHRoZSAqY29udGVudHMqIG9mIHRob3NlIHBhZ2VzIGRvbiYjMzk7dCBzZWVtIHRvIGJlIGNoYW5naW5nLCBqdXN0IHRoZWlyIG1ldGFkYXRhIGFuZCBwYWdlIHRhYmxlIGVudHJpZXMuIFRoZSBwYXRjaCBmb2N1c2VzIG9uIHNwbGl0dGluZyBmb2xpb3MgaW50byBzbWFsbGVyIHVuaXRzIGFuZCBjb3JyZWN0bHkgbWFuYWdpbmcgdGhlaXIgYXNzb2NpYXRlZCBtZXRhZGF0YSBhbmQgY2FjaGUgZW50cmllcy4KCkkmIzM5O20gZm9jdXNpbmcgc3BlY2lmaWNhbGx5IG9uIHJpc2sgZm9yIHVzZS1hZnRlci1mcmVlLCBkb3VibGUtZnJlZSwgbG9ja2luZyBkZWFkbG9ja3MsIG9yIHJlZmVyZW5jZSBjb3VudCBpbWJhbGFuY2VzIGluIHRoaXMgcGF0Y2guIFRoZXNlIGFyZSBhbGwgY29tbW9uIHBpdGZhbGxzLiBCYXNlZCBvbiB0aGUgZGVzY3JpcHRpb24sIHRoZXJlJiMzOTtzIG5vdGhpbmcgaW4gaGVyZSB0aGF0IHNob3VsZCBsZWFkIHRvIG5ldywgY29tcGxleCBkYXRhIHN0cnVjdHVyZXMgYmVpbmcgY3JlYXRlZCwgbm9yIGRvZXMgaXQgbG9vayBsaWtlIGFueSBkYXRhIGlzIGJlaW5nIHNlbnQgdG8gdXNlciBzcGFjZSBkaXJlY3RseSB0aGF0IGNvdWxkIGV4cG9zZSB1bmluaXRpYWxpemVkIG1lbW9yeS4gVGhlIGRlc2NyaXB0aW9uIGFsc28gbWVudGlvbnMgdGhhdCB0aGVyZSBhcmVuJiMzOTt0IGNoYW5nZXMgdG8gYm91bmRzIGNoZWNrcyB0aGF0IHdvdWxkIGV4cG9zZSB1bmluaXRpYWxpemVkIG1lbW9yeS4KClRoZSBzdGF0ZWQgcG90ZW50aWFsIGJ1Z3MgYXJlIHR5cGljYWxseSBkZXRlY3RlZCBieSBLQVNBTiwgTE9DS0RFUCwgYW5kIFZNX1dBUk5fT04gYXNzZXJ0aW9ucywgd2hpY2ggaXMgZ29vZC4gS01TQU4gaXRzZWxmIGlzIGZvciB1bmluaXRpYWxpemVkIG1lbW9yeSByZWFkcyBhbmQgbGVha3MuIFNpbmNlIHRoaXMgcGF0Y2ggZG9lc24mIzM5O3QgYXBwZWFyIHRvIGludHJvZHVjZSB1bmluaXRpYWxpemVkIG1lbW9yeSAqdXNhZ2UqIGRpcmVjdGx5LCBtZWFuaW5nIGl04oCZcyBub3QgY3JlYXRpbmcgbmV3IG1lbW9yeSBhbmQgdGhlbiByZWFkaW5nIGZyb20gaXQgYmVmb3JlIGluaXRpYWxpemF0aW9uLCBLTVNBTiBzaG91bGQgYmUgdW5uZWNlc3NhcnkuIFRoaXMgcGF0Y2ggaXMgYWJvdXQgc3BsaXR0aW5nIGFuZCBtYW5hZ2luZyAqZXhpc3RpbmcqIG1lbW9yeSwgd2hpY2ggbWVhbnMsIGBOZWVkc0tNU0FOYCBpcyBmYWxzZS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40Mi8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDcgMjE6NTU8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5zZXQtcmVzdWx0czwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggcmVmYWN0b3JzIGZvbGlvIHNwbGl0dGluZyBsb2dpYyBpbiB0aGUgbWVtb3J5IG1hbmFnZW1lbnQgc3Vic3lzdGVtIChgbW0vaHVnZV9tZW1vcnkuY2ApLCBzcGVjaWZpY2FsbHkgc2VwYXJhdGluZyB0aGUgaGFuZGxpbmcgb2YgYW5vbnltb3VzLCBzd2FwY2FjaGUsIGFuZCBmaWxlLWJhY2tlZCBmb2xpb3MuIEl0IG1vZGlmaWVzIHJlZmVyZW5jZSBjb3VudGluZywgbG9ja2luZywgYW5kIHBhZ2UgY2FjaGUvc3dhcCBjYWNoZSByZXBsYWNlbWVudCBsb2dpYy4gVGhlc2UgY2hhbmdlcyBwcmltYXJpbHkgcmlzayBpbnRyb2R1Y2luZyB1c2UtYWZ0ZXItZnJlZSwgZG91YmxlLWZyZWUsIGxvY2tpbmcgZGVhZGxvY2tzLCBvciByZWZlcmVuY2UgY291bnQgaW1iYWxhbmNlcy4gU3VjaCBpc3N1ZXMgYXJlIGVmZmVjdGl2ZWx5IGRldGVjdGVkIGJ5IEtBU0FOLCBMT0NLREVQLCBhbmQgc3RhbmRhcmQga2VybmVsIGRlYnVnZ2luZyBhc3NlcnRpb25zIChlLmcuLCBgVk1fV0FSTl9PTmApLiBUaGUgcGF0Y2ggZG9lcyBub3QgaW50cm9kdWNlIG5ldyBhbGxvY2F0aW9ucyBvZiBjb21wbGV4IGRhdGEgc3RydWN0dXJlcywgbm9yIGRvZXMgaXQgbW9kaWZ5IGRhdGEgc2VudCB0byB1c2VyIHNwYWNlIG9yIGFsdGVyIGJvdW5kcyBjaGVja2luZyBpbiBhIHdheSB0aGF0IGNvdWxkIGV4cG9zZSB1bmluaXRpYWxpemVkIG1lbW9yeS4gVGhlcmVmb3JlLCB0aGVyZSBpcyBubyBqdXN0aWZpY2F0aW9uIGZvciBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24uJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtLTVNBTlJlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCByZWZhY3RvcnMgZm9saW8gc3BsaXR0aW5nIGxvZ2ljIGluIHRoZSBtZW1vcnkgbWFuYWdlbWVudCBzdWJzeXN0ZW0gKGBtbS9odWdlX21lbW9yeS5jYCksIHNwZWNpZmljYWxseSBzZXBhcmF0aW5nIHRoZSBoYW5kbGluZyBvZiBhbm9ueW1vdXMsIHN3YXBjYWNoZSwgYW5kIGZpbGUtYmFja2VkIGZvbGlvcy4gSXQgbW9kaWZpZXMgcmVmZXJlbmNlIGNvdW50aW5nLCBsb2NraW5nLCBhbmQgcGFnZSBjYWNoZS9zd2FwIGNhY2hlIHJlcGxhY2VtZW50IGxvZ2ljLiBUaGVzZSBjaGFuZ2VzIHByaW1hcmlseSByaXNrIGludHJvZHVjaW5nIHVzZS1hZnRlci1mcmVlLCBkb3VibGUtZnJlZSwgbG9ja2luZyBkZWFkbG9ja3MsIG9yIHJlZmVyZW5jZSBjb3VudCBpbWJhbGFuY2VzLiBTdWNoIGlzc3VlcyBhcmUgZWZmZWN0aXZlbHkgZGV0ZWN0ZWQgYnkgS0FTQU4sIExPQ0tERVAsIGFuZCBzdGFuZGFyZCBrZXJuZWwgZGVidWdnaW5nIGFzc2VydGlvbnMgKGUuZy4sIGBWTV9XQVJOX09OYCkuIFRoZSBwYXRjaCBkb2VzIG5vdCBpbnRyb2R1Y2UgbmV3IGFsbG9jYXRpb25zIG9mIGNvbXBsZXggZGF0YSBzdHJ1Y3R1cmVzLCBub3IgZG9lcyBpdCBtb2RpZnkgZGF0YSBzZW50IHRvIHVzZXIgc3BhY2Ugb3IgYWx0ZXIgYm91bmRzIGNoZWNraW5nIGluIGEgd2F5IHRoYXQgY291bGQgZXhwb3NlIHVuaW5pdGlhbGl6ZWQgbWVtb3J5LiBUaGVyZWZvcmUsIHRoZXJlIGlzIG5vIGp1c3RpZmljYXRpb24gZm9yIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbi4mIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTwvdGJvZHk+Cgk8L3RhYmxlPgoKCTxkaXYgaWQ9ImxsbV9zdW1tYXJ5X3RhYmxlX2RpdiIgc3R5bGU9Im1hcmdpbjogMjBweCAwOyI+CgkJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQkJPGNhcHRpb24+TExNIENhbGxzIFN1bW1hcnk6PC9jYXB0aW9uPgoJCQk8dGhlYWQ+CgkJCQk8dHI+CgkJCQkJPHRoPlRvdGFsIENhbGxzPC90aD4KCQkJCQk8dGg+VG90YWwgVG9rZW5zPC90aD4KCQkJCQk8dGg+QXZnIFRva2VuczwvdGg+CgkJCQkJPHRoPlRvdGFsIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQkJPHRoPkF2ZyBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJPC90cj4KCQkJPC90aGVhZD4KCQkJPHRib2R5IGlkPSJsbG1fc3VtbWFyeV9zdGF0c19ib2R5Ij48L3Rib2R5PgoJCTwvdGFibGU+Cgk8L2Rpdj4KCgk8ZGl2IGlkPSJ0b29sX3N1bW1hcnlfdGFibGVfZGl2IiBzdHlsZT0ibWFyZ2luOiAyMHB4IDA7Ij4KCQk8dGFibGUgY2xhc3M9Imxpc3RfdGFibGUiPgoJCQk8Y2FwdGlvbj5Ub29sIENhbGxzIFN1bW1hcnk6PC9jYXB0aW9uPgoJCQk8dGhlYWQ+CgkJCQk8dHI+CgkJCQkJPHRoPlRvdGFsIENhbGxzPC90aD4KCQkJCQk8dGg+VG90YWwgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCQk8dGg+QXZnIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQk8L3RyPgoJCQk8L3RoZWFkPgoJCQk8dGJvZHkgaWQ9InRvb2xfc3VtbWFyeV9zdGF0c19ib2R5Ij48L3Rib2R5PgoJCTwvdGFibGU+Cgk8L2Rpdj4KCgk8ZGl2IGlkPSJkdXJhdGlvbl9jaGFydF9kaXYiIHN0eWxlPSJ3aWR0aDogMTAwJTsgbWFyZ2luOiAyMHB4IDA7IGJvcmRlcjogMXB4OyI+PC9kaXY+Cgk8ZGl2IGlkPSJ0b2tlbl9jaGFydF9kaXYiIHN0eWxlPSJ3aWR0aDogMTAwJTsgbWFyZ2luOiAyMHB4IDA7IGJvcmRlcjogMXB4OyI+PC9kaXY+CgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS9qc2FwaSI+PC9zY3JpcHQ+Cgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CgkJZ29vZ2xlLmxvYWQoInZpc3VhbGl6YXRpb24iLCAiMSIsIHtwYWNrYWdlczpbImNvcmVjaGFydCJdfSk7CgkJZ29vZ2xlLnNldE9uTG9hZENhbGxiYWNrKGRyYXdDaGFydHMpOwoKCQlmdW5jdGlvbiBkcmF3Q2hhcnRzKCkgewoJCQljb25zdCByYXdEYXRhID0gW3siU3RhcnRlZCI6IjIwMjYtMDgtMDdUMjE6NTQ6MDYuMTkzMzc5MDUzWiIsIlNlcSI6MCwiTmVzdGluZyI6MCwiVHlwZSI6ImZsb3ciLCJOYW1lIjoicGF0Y2gtdHJpYWdlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTA3ODQzMDM2NDkxLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIlRSQU5TUEFSRU5UX0hVR0VQQUdFXCIsXG4gICAgXCJTV0FQXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwiX19zcGxpdF9odWdlX3BhZ2VfdG9fbGlzdF90b19vcmRlclwiLFxuICAgIFwiZm9saW9fc3BsaXRcIixcbiAgICBcImZvbGlvX3NwbGl0X3VubWFwcGVkXCIsXG4gICAgXCJfX3N3YXBfY2FjaGVfcmVwbGFjZV9mb2xpb1wiXG4gIF0sXG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggcmVmYWN0b3JzIGZvbGlvIHNwbGl0dGluZyBsb2dpYyBpbiB0aGUgbWVtb3J5IG1hbmFnZW1lbnQgc3Vic3lzdGVtIChgbW0vaHVnZV9tZW1vcnkuY2ApLCBzcGVjaWZpY2FsbHkgc2VwYXJhdGluZyB0aGUgaGFuZGxpbmcgb2YgYW5vbnltb3VzLCBzd2FwY2FjaGUsIGFuZCBmaWxlLWJhY2tlZCBmb2xpb3MuIEl0IG1vZGlmaWVzIHJlZmVyZW5jZSBjb3VudGluZywgbG9ja2luZywgYW5kIHBhZ2UgY2FjaGUvc3dhcCBjYWNoZSByZXBsYWNlbWVudCBsb2dpYy4gVGhlc2UgY2hhbmdlcyBwcmltYXJpbHkgcmlzayBpbnRyb2R1Y2luZyB1c2UtYWZ0ZXItZnJlZSwgZG91YmxlLWZyZWUsIGxvY2tpbmcgZGVhZGxvY2tzLCBvciByZWZlcmVuY2UgY291bnQgaW1iYWxhbmNlcy4gU3VjaCBpc3N1ZXMgYXJlIGVmZmVjdGl2ZWx5IGRldGVjdGVkIGJ5IEtBU0FOLCBMT0NLREVQLCBhbmQgc3RhbmRhcmQga2VybmVsIGRlYnVnZ2luZyBhc3NlcnRpb25zIChlLmcuLCBgVk1fV0FSTl9PTmApLiBUaGUgcGF0Y2ggZG9lcyBub3QgaW50cm9kdWNlIG5ldyBhbGxvY2F0aW9ucyBvZiBjb21wbGV4IGRhdGEgc3RydWN0dXJlcywgbm9yIGRvZXMgaXQgbW9kaWZ5IGRhdGEgc2VudCB0byB1c2VyIHNwYWNlIG9yIGFsdGVyIGJvdW5kcyBjaGVja2luZyBpbiBhIHdheSB0aGF0IGNvdWxkIGV4cG9zZSB1bmluaXRpYWxpemVkIG1lbW9yeS4gVGhlcmVmb3JlLCB0aGVyZSBpcyBubyBqdXN0aWZpY2F0aW9uIGZvciBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24uXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiBmYWxzZSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggcmV3b3JrcyB0aGUgbG9naWMgZm9yIHNwbGl0dGluZyB1bm1hcHBlZCBmb2xpb3MsIHNwZWNpZmljYWxseSBoYW5kbGluZyBzd2FwY2FjaGUgYW5kIGFub255bW91cyBmb2xpb3MuIEl0IGludHJvZHVjZXMgbmV3IHN0YXRpYyBmdW5jdGlvbnMgYF9fZm9saW9fZnJlZXplX3NwbGl0X3VubWFwYCBhbmQgYF9fZm9saW9fZnJlZXplX3NwbGl0X3VubWFwX2ZpbGVgIHRvIHJlcGxhY2UgYF9fZm9saW9fZnJlZXplX2FuZF9zcGxpdF91bm1hcHBlZGAuIEl0IGFsc28gbW9kaWZpZXMgYGZvbGlvX2NoZWNrX3NwbGl0dGFibGVgIGFuZCBgX19mb2xpb19zcGxpdGAgdG8gdXNlIHRoZSBuZXcgbG9naWMuIFRoZSBjaGFuZ2VzIGFmZmVjdCBjb3JlIG1lbW9yeSBtYW5hZ2VtZW50LCBzcGVjaWZpY2FsbHkgVEhQIGFuZCBmb2xpbyBzcGxpdHRpbmcsIHdoaWNoIGFyZSBoaWdobHkgY29tcGxleCBhbmQgcHJvbmUgdG8gcmFjZSBjb25kaXRpb25zLiBGdXp6aW5nIHRoZSBtYWluIGVudHJ5IHBvaW50cyBmb3IgZm9saW8gc3BsaXR0aW5nIGlzIGltcG9ydGFudCB0byBlbnN1cmUgdGhlIG5ldyBsb2dpYyBpcyByb2J1c3QuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA3VDIxOjU0OjA2LjE5MzM4NjEyM1oiLCJTZXEiOjEsIk5lc3RpbmciOjEsIlR5cGUiOiJhY3Rpb24iLCJOYW1lIjoicmVhZC1wYXRjaC1kaWZmIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTI1ODA4NjM2MiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiUGF0Y2hEaWZmXCI6IFwiY29tbWl0IGU1ZTI0NzhhNTZiOTUyYThhYzVmNjJkMmU2NWFmNTg4ZWMzNDI4NjhcXG5BdXRob3I6IHN5ei1jbHVzdGVyIFxcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVxcdTAwM2VcXG5EYXRlOiAgIEZyaSBBdWcgNyAyMTo1NDowNCAyMDI2ICswMDAwXFxuXFxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xcblxcbmRpZmYgLS1naXQgYS9tbS9odWdlX21lbW9yeS5jIGIvbW0vaHVnZV9tZW1vcnkuY1xcbmluZGV4IGNlZDQwMGY3MmQ0M2EuLjBkNzBlZTMwMTdjNDYgMTAwNjQ0XFxuLS0tIGEvbW0vaHVnZV9tZW1vcnkuY1xcbisrKyBiL21tL2h1Z2VfbWVtb3J5LmNcXG5AQCAtMzU4OSw5ICszNTg5LDYgQEAgc3RhdGljIHZvaWQgcmVtYXBfcGFnZShzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBsb25nIG5yLCBpbnQgZmxhZ3MpXFxuIHtcXG4gXFx0aW50IGkgPSAwO1xcbiBcXG4tXFx0LyogSWYgdW5tYXBfZm9saW8oKSB1c2VzIHRyeV90b19taWdyYXRlKCkgb24gZmlsZSwgcmVtb3ZlIHRoaXMgY2hlY2sgKi9cXG4tXFx0aWYgKCFmb2xpb190ZXN0X2Fub24oZm9saW8pKVxcbi1cXHRcXHRyZXR1cm47XFxuIFxcdGZvciAoOzspIHtcXG4gXFx0XFx0cmVtb3ZlX21pZ3JhdGlvbl9wdGVzKGZvbGlvLCBmb2xpbywgVFRVX1JNQVBfTE9DS0VEIHwgZmxhZ3MpO1xcbiBcXHRcXHRpICs9IGZvbGlvX25yX3BhZ2VzKGZvbGlvKTtcXG5AQCAtMzgwMCw2ICszNzk3LDcgQEAgc3RhdGljIGludCBfX3NwbGl0X3VubWFwcGVkX2ZvbGlvKHN0cnVjdCBmb2xpbyAqZm9saW8sIGludCBuZXdfb3JkZXIsXFxuIFxcdFxcdHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLCBlbnVtIHNwbGl0X3R5cGUgc3BsaXRfdHlwZSlcXG4ge1xcbiBcXHRjb25zdCBib29sIGlzX2Fub24gPSBmb2xpb190ZXN0X2Fub24oZm9saW8pO1xcbitcXHRjb25zdCBib29sIGlzX3N3YXBjYWNoZSA9IGZvbGlvX3Rlc3Rfc3dhcGNhY2hlKGZvbGlvKTtcXG4gXFx0aW50IG9sZF9vcmRlciA9IGZvbGlvX29yZGVyKGZvbGlvKTtcXG4gXFx0aW50IHN0YXJ0X29yZGVyID0gc3BsaXRfdHlwZSA9PSBTUExJVF9UWVBFX1VOSUZPUk0gPyBuZXdfb3JkZXIgOiBvbGRfb3JkZXIgLSAxO1xcbiBcXHRzdHJ1Y3QgZm9saW8gKm9sZF9mb2xpbyA9IGZvbGlvO1xcbkBAIC0zODE0LDggKzM4MTIsOCBAQCBzdGF0aWMgaW50IF9fc3BsaXRfdW5tYXBwZWRfZm9saW8oc3RydWN0IGZvbGlvICpmb2xpbywgaW50IG5ld19vcmRlcixcXG4gXFx0ICAgICBzcGxpdF9vcmRlci0tKSB7XFxuIFxcdFxcdGludCBucl9uZXdfZm9saW9zID0gMVVMIFxcdTAwM2NcXHUwMDNjIChvbGRfb3JkZXIgLSBzcGxpdF9vcmRlcik7XFxuIFxcbi1cXHRcXHQvKiBvcmRlci0xIGFub255bW91cyBmb2xpbyBpcyBub3Qgc3VwcG9ydGVkICovXFxuLVxcdFxcdGlmIChpc19hbm9uIFxcdTAwMjZcXHUwMDI2IHNwbGl0X29yZGVyID09IDEpXFxuK1xcdFxcdC8qIG9yZGVyLTEgYW5vbnltb3VzIG9yIHN3YXBjYWNoZSBmb2xpbyBpcyBub3Qgc3VwcG9ydGVkICovXFxuK1xcdFxcdGlmICgoaXNfYW5vbiB8fCBpc19zd2FwY2FjaGUpIFxcdTAwMjZcXHUwMDI2IHNwbGl0X29yZGVyID09IDEpXFxuIFxcdFxcdFxcdGNvbnRpbnVlO1xcbiBcXG4gXFx0XFx0aWYgKG1hcHBpbmcpIHtcXG5AQCAtMzg3OCwzMiArMzg3NiwyNiBAQCBzdGF0aWMgaW50IF9fc3BsaXRfdW5tYXBwZWRfZm9saW8oc3RydWN0IGZvbGlvICpmb2xpbywgaW50IG5ld19vcmRlcixcXG4gaW50IGZvbGlvX2NoZWNrX3NwbGl0dGFibGUoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlcixcXG4gXFx0XFx0XFx0ICAgZW51bSBzcGxpdF90eXBlIHNwbGl0X3R5cGUpXFxuIHtcXG4rXFx0Ym9vbCBpc19hbm9uID0gZm9saW9fdGVzdF9hbm9uKGZvbGlvKTtcXG4rXFx0Ym9vbCBpc19zd2FwY2FjaGUgPSBmb2xpb190ZXN0X3N3YXBjYWNoZShmb2xpbyk7XFxuK1xcbiBcXHRWTV9XQVJOX09OX0ZPTElPKCFmb2xpb190ZXN0X2xvY2tlZChmb2xpbyksIGZvbGlvKTtcXG4gXFx0LypcXG4gXFx0ICogRm9saW9zIHRoYXQganVzdCBnb3QgdHJ1bmNhdGVkIGNhbm5vdCBnZXQgc3BsaXQuIFNpZ25hbCB0byB0aGVcXG4tXFx0ICogY2FsbGVyIHRoYXQgdGhlcmUgd2FzIGEgcmFjZS5cXG4tXFx0ICpcXG4tXFx0ICogVE9ETzogdGhpcyB3aWxsIGFsc28gY3VycmVudGx5IHJlZnVzZSBmb2xpb3Mgd2l0aG91dCBhIG1hcHBpbmcgaW4gdGhlXFxuLVxcdCAqIHN3YXBjYWNoZSAoc2htZW0gb3IgdG8tYmUtYW5vbiBmb2xpb3MpLlxcbitcXHQgKiBjYWxsZXIgdGhhdCB0aGVyZSB3YXMgYSByYWNlLiBBIG1hcHBpbmdsZXNzIHN3YXAgY2FjaGUgZm9saW9cXG4rXFx0ICogaGFzIG5vIHBhZ2UgY2FjaGUgZW50cmllcyB0byB1cGRhdGUsIHNvIGl0IGlzIGZpbmUgdG8gc3BsaXQuXFxuIFxcdCAqL1xcbi1cXHRpZiAoIWZvbGlvLVxcdTAwM2VtYXBwaW5nIFxcdTAwMjZcXHUwMDI2ICFmb2xpb190ZXN0X2Fub24oZm9saW8pKVxcbitcXHRpZiAoIWZvbGlvLVxcdTAwM2VtYXBwaW5nIFxcdTAwMjZcXHUwMDI2ICFpc19zd2FwY2FjaGUpXFxuIFxcdFxcdHJldHVybiAtRUJVU1k7XFxuIFxcbi1cXHQvKiBvcmRlci0xIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIGFub255bW91cyBUSFAuICovXFxuLVxcdGlmIChmb2xpb190ZXN0X2Fub24oZm9saW8pIFxcdTAwMjZcXHUwMDI2IG5ld19vcmRlciA9PSAxKVxcbi1cXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG4tXFxuIFxcdC8qXFxuLVxcdCAqIHN3YXBjYWNoZSBmb2xpbyBjb3VsZCBvbmx5IGJlIHNwbGl0IHRvIG9yZGVyIDBcXG4tXFx0ICpcXG4tXFx0ICogbm9uLXVuaWZvcm0gc3BsaXQgY3JlYXRlcyBhZnRlci1zcGxpdCBmb2xpb3Mgd2l0aCBvcmRlcnMgZnJvbVxcbi1cXHQgKiBmb2xpb19vcmRlcihmb2xpbykgLSAxIHRvIG5ld19vcmRlciwgbWFraW5nIGl0IG5vdCBzdWl0YWJsZSBmb3IgYW55XFxuLVxcdCAqIHN3YXBjYWNoZSBmb2xpbyBzcGxpdC4gT25seSB1bmlmb3JtIHNwbGl0IHRvIG9yZGVyLTAgY2FuIGJlIHVzZWRcXG4tXFx0ICogaGVyZS5cXG4rXFx0ICogT3JkZXItMSBpcyB1bnN1cHBvcnRlZDogYW5vbiBmb2xpb3MgbmVlZCBzdWJwYWdlIDIgZm9yIHRoZVxcbitcXHQgKiBkZWZlcnJlZCBzcGxpdCBsaXN0LCBoeWJyaWQgc2htZW0gXFx1MDAyNiBzd2FwIGNhY2hlIGZvbGlvcyBhcmUgbm90XFxuK1xcdCAqIHNwbGl0dGFibGUsIGFuZCBhIHNwbGl0dGFibGUgbWFwcGluZ2xlc3Mgc3dhcCBjYWNoZSBmb2xpbyBjb3VsZFxcbitcXHQgKiBiZSBlaXRoZXIgYW5vbiBvciBzaG1lbSwgd2hpY2ggd2UgY2Fubm90IHRlbGwgYXBhcnQuXFxuIFxcdCAqL1xcbi1cXHRpZiAoKHNwbGl0X3R5cGUgPT0gU1BMSVRfVFlQRV9OT05fVU5JRk9STSB8fCBuZXdfb3JkZXIpIFxcdTAwMjZcXHUwMDI2IGZvbGlvX3Rlc3Rfc3dhcGNhY2hlKGZvbGlvKSkge1xcbitcXHRpZiAoKGlzX2Fub24gfHwgaXNfc3dhcGNhY2hlKSBcXHUwMDI2XFx1MDAyNiBuZXdfb3JkZXIgPT0gMSlcXG4gXFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuLVxcdH1cXG4gXFxuIFxcdGlmIChpc19odWdlX3plcm9fZm9saW8oZm9saW8pKVxcbiBcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG5AQCAtMzkxMSwzOSArMzkwMyw3OCBAQCBpbnQgZm9saW9fY2hlY2tfc3BsaXR0YWJsZShzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyLFxcbiBcXHRpZiAoZm9saW9fdGVzdF93cml0ZWJhY2soZm9saW8pKVxcbiBcXHRcXHRyZXR1cm4gLUVCVVNZO1xcbiBcXG4rXFx0LypcXG4rXFx0ICogQSBub24tYW5vbiBzd2FwY2FjaGUgZm9saW8gdGhhdCBzdGlsbCBoYXMgYSBtYXBwaW5nIHNob3VsZCBvbmx5XFxuK1xcdCAqIGJlIGEgc2htZW0gZm9saW8gdW5kZXIgSU8sIHRoZXJlIGlzIGxpdHRsZSBiZW5lZml0IGluIHNwbGl0dGluZ1xcbitcXHQgKiB0aGVtIGhlbmNlIG5vdCBzdXBwb3J0ZWQuIFJlamVjdCBpdCBoZXJlIHVwIGZyb250OiB0aGUgc3BsaXRcXG4rXFx0ICogcm91dGluZSBjYW5ub3QgYmFjayBvdXQgY2xlYW5seSBvbmNlIHRoZSBmb2xpbyByZWYgaXMgZnJvemVuLlxcbitcXHQgKi9cXG4rXFx0aWYgKCFpc19hbm9uIFxcdTAwMjZcXHUwMDI2IGlzX3N3YXBjYWNoZSBcXHUwMDI2XFx1MDAyNiBmb2xpby1cXHUwMDNlbWFwcGluZylcXG4rXFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuK1xcbiBcXHRyZXR1cm4gMDtcXG4gfVxcbiBcXG4tLyogTnVtYmVyIG9mIGZvbGlvIHJlZmVyZW5jZXMgZnJvbSB0aGUgcGFnZWNhY2hlIG9yIHRoZSBzd2FwY2FjaGUuICovXFxuLXN0YXRpYyB1bnNpZ25lZCBpbnQgZm9saW9fY2FjaGVfcmVmX2NvdW50KGNvbnN0IHN0cnVjdCBmb2xpbyAqZm9saW8pXFxuKy8qIE51bWJlciBvZiBmb2xpbyByZWZlcmVuY2VzIGZyb20gdGhlIHN3YXBjYWNoZS4gKi9cXG4rc3RhdGljIHVuc2lnbmVkIGludCBmb2xpb19zd2FwY2FjaGVfcmVmX2NvdW50KGNvbnN0IHN0cnVjdCBmb2xpbyAqZm9saW8pXFxuIHtcXG4tXFx0aWYgKGZvbGlvX3Rlc3RfYW5vbihmb2xpbykgXFx1MDAyNlxcdTAwMjYgIWZvbGlvX3Rlc3Rfc3dhcGNhY2hlKGZvbGlvKSlcXG4rXFx0aWYgKCFmb2xpb190ZXN0X3N3YXBjYWNoZShmb2xpbykpXFxuIFxcdFxcdHJldHVybiAwO1xcbiBcXHRyZXR1cm4gZm9saW9fbnJfcGFnZXMoZm9saW8pO1xcbiB9XFxuIFxcbi1zdGF0aWMgaW50IF9fZm9saW9fZnJlZXplX2FuZF9zcGxpdF91bm1hcHBlZChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyLFxcbi1cXHRcXHRcXHRcXHRcXHQgICAgIHN0cnVjdCBwYWdlICpzcGxpdF9hdCwgc3RydWN0IHhhX3N0YXRlICp4YXMsXFxuLVxcdFxcdFxcdFxcdFxcdCAgICAgc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsIGJvb2wgZG9fbHJ1LFxcbi1cXHRcXHRcXHRcXHRcXHQgICAgIHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QsIGVudW0gc3BsaXRfdHlwZSBzcGxpdF90eXBlLFxcbi1cXHRcXHRcXHRcXHRcXHQgICAgIHBnb2ZmX3QgZW5kLCBpbnQgKm5yX3NobWVtX2Ryb3BwZWQpXFxuK3N0YXRpYyBpbnQgX19mb2xpb19mcmVlemVfc3BsaXRfdW5tYXAoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlcixcXG4rXFx0XFx0XFx0XFx0ICAgICAgc3RydWN0IHBhZ2UgKnNwbGl0X2F0LCBib29sIGRvX2xydSwgYm9vbCBhbm9uX3VubWFwLFxcbitcXHRcXHRcXHRcXHQgICAgICBzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LCBlbnVtIHNwbGl0X3R5cGUgc3BsaXRfdHlwZSlcXG4ge1xcbiBcXHRzdHJ1Y3QgZm9saW8gKmVuZF9mb2xpbyA9IGZvbGlvX25leHQoZm9saW8pO1xcbi1cXHRzdHJ1Y3QgZm9saW8gKm5ld19mb2xpbywgKm5leHQ7XFxuK1xcdGJvb2wgaXNfYW5vbiA9IGZvbGlvX3Rlc3RfYW5vbihmb2xpbyk7XFxuK1xcdHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2kgPSBOVUxMO1xcbitcXHRzdHJ1Y3QgZm9saW8gKm5ld19mb2xpbztcXG4gXFx0aW50IG9sZF9vcmRlciA9IGZvbGlvX29yZGVyKGZvbGlvKTtcXG4rXFx0c3RydWN0IGFub25fdm1hICphbm9uX3ZtYSA9IE5VTEw7XFxuK1xcdGVudW0gdHR1X2ZsYWdzIHR0dV9mbGFncyA9IDA7XFxuIFxcdHN0cnVjdCBsaXN0X2xydV9vbmUgKmxydTtcXG4rXFx0c3RydWN0IGxydXZlYyAqbHJ1dmVjO1xcbiBcXHRib29sIGRlcXVldWVfZGVmZXJyZWQ7XFxuIFxcdGludCByZXQgPSAwO1xcbiBcXG4tXFx0Vk1fV0FSTl9PTl9PTkNFKCFtYXBwaW5nIFxcdTAwMjZcXHUwMDI2IGVuZCk7XFxuK1xcdC8qXFxuK1xcdCAqIFVubWFwL3JlbWFwIG5lZWRzIHRoZSBhbm9uX3ZtYS4gVGhlIGNhbGxlciBkb2VzIG5vdCBuZWNlc3NhcmlseVxcbitcXHQgKiBob2xkIGFuIG1tYXBfbG9jayB0aGF0IHdvdWxkIHByZXZlbnQgdGhlIGFub25fdm1hIGZyb21cXG4rXFx0ICogZGlzYXBwZWFyaW5nLCBzbyB3ZSBmaXJzdCB0YWtlIGEgcmVmZXJlbmNlIGFuZCBsb2NrIGl0LiBUaGlzIGlzXFxuK1xcdCAqIHNpbWlsYXIgdG8gZm9saW9fbG9ja19hbm9uX3ZtYV9yZWFkKCkgZXhjZXB0IHRoZSB3cml0ZSBsb2NrIGlzXFxuK1xcdCAqIHRha2VuIHRvIHNlcmlhbGl6ZSBhZ2FpbnN0IHBhcmFsbGVsIHNwbGl0IG9yIGNvbGxhcHNlLlxcbitcXHQgKi9cXG4rXFx0aWYgKGFub25fdW5tYXApIHtcXG4rXFx0XFx0YW5vbl92bWEgPSBmb2xpb19nZXRfYW5vbl92bWEoZm9saW8pO1xcbitcXHRcXHRpZiAoIWFub25fdm1hKVxcbitcXHRcXHRcXHRyZXR1cm4gLUVCVVNZO1xcbitcXHRcXHRhbm9uX3ZtYV9sb2NrX3dyaXRlKGFub25fdm1hKTtcXG4rXFx0fVxcbitcXG4rXFx0LyogUmFjeSBjaGVjayBpZiB3ZSBjYW4gc3BsaXQgdGhlIHBhZ2UsIGJlZm9yZSB0aGUgb3B0aW9uYWwgdW5tYXAuICovXFxuK1xcdGlmIChmb2xpb19leHBlY3RlZF9yZWZfY291bnQoZm9saW8pICE9IGZvbGlvX3JlZl9jb3VudChmb2xpbykgLSAxKSB7XFxuK1xcdFxcdHJldCA9IC1FQUdBSU47XFxuK1xcdFxcdGdvdG8gb3V0X3VubG9jaztcXG4rXFx0fVxcbitcXG4rXFx0aWYgKGFub25fdW5tYXApXFxuK1xcdFxcdHVubWFwX2ZvbGlvKGZvbGlvKTtcXG4rXFxuK1xcdGxvY2FsX2lycV9kaXNhYmxlKCk7XFxuK1xcbiBcXHQvKlxcbiBcXHQgKiBJZiB0aGlzIGZvbGlvIGNhbiBiZSBvbiB0aGUgZGVmZXJyZWQgc3BsaXQgcXVldWUsIGxvY2sgb3V0XFxuIFxcdCAqIHRoZSBzaHJpbmtlciBiZWZvcmUgZnJlZXppbmcgdGhlIHJlZi4gSWYgdGhlIHNocmlua2VyIHNlZXNcXG4gXFx0ICogYSAwLXJlZiBmb2xpbywgaXQgYXNzdW1lcyBpdCBiZWF0IGZvbGlvX3B1dCgpIHRvIHRoZSBsaXN0XFxuIFxcdCAqIGxvY2sgYW5kIG11c3QgY2xlYW4gdXAgdGhlIExSVSBzdGF0ZSAtIHRoZSBzYW1lIGRlcXVldWUgd2VcXG4gXFx0ICogd2lsbCBkbyBiZWxvdyBhcyBwYXJ0IG9mIHRoZSBzcGxpdC5cXG4rXFx0ICpcXG4rXFx0ICogT25seSBhbm9uIGZvbGlvcyBhcmUgZXZlciBxdWV1ZWQgb24gdGhlIGRlZmVycmVkIHNwbGl0IGxpc3QsXFxuK1xcdCAqIHNvIG5vbi1hbm9uIGZvbGlvcyAobWFwcGluZ2xlc3Mgc3dhcGNhY2hlKSBuZXZlciBuZWVkIGRlcXVldWluZy5cXG4gXFx0ICovXFxuLVxcdGRlcXVldWVfZGVmZXJyZWQgPSBmb2xpb190ZXN0X2Fub24oZm9saW8pIFxcdTAwMjZcXHUwMDI2IG9sZF9vcmRlciBcXHUwMDNlIDE7XFxuK1xcdGRlcXVldWVfZGVmZXJyZWQgPSBvbGRfb3JkZXIgXFx1MDAzZSAxIFxcdTAwMjZcXHUwMDI2IGlzX2Fub247XFxuIFxcdGlmIChkZXF1ZXVlX2RlZmVycmVkKSB7XFxuIFxcdFxcdHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZztcXG4gXFxuQEAgLTM5NTIsMTI4ICszOTgzLDI0MyBAQCBzdGF0aWMgaW50IF9fZm9saW9fZnJlZXplX2FuZF9zcGxpdF91bm1hcHBlZChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgblxcbiBcXHRcXHRscnUgPSBsaXN0X2xydV9sb2NrKFxcdTAwMjZkZWZlcnJlZF9zcGxpdF9scnUsXFxuIFxcdFxcdFxcdFxcdCAgICBmb2xpb19uaWQoZm9saW8pLCBcXHUwMDI2bWVtY2cpO1xcbiBcXHR9XFxuLVxcdGlmIChmb2xpb19yZWZfZnJlZXplKGZvbGlvLCBmb2xpb19jYWNoZV9yZWZfY291bnQoZm9saW8pICsgMSkpIHtcXG4tXFx0XFx0c3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSA9IE5VTEw7XFxuLVxcdFxcdHN0cnVjdCBscnV2ZWMgKmxydXZlYztcXG4gXFxuK1xcdGlmICghZm9saW9fcmVmX2ZyZWV6ZShmb2xpbywgZm9saW9fc3dhcGNhY2hlX3JlZl9jb3VudChmb2xpbykgKyAxKSkge1xcbiBcXHRcXHRpZiAoZGVxdWV1ZV9kZWZlcnJlZCkge1xcbi1cXHRcXHRcXHRfX2xpc3RfbHJ1X2RlbChcXHUwMDI2ZGVmZXJyZWRfc3BsaXRfbHJ1LCBscnUsXFxuLVxcdFxcdFxcdFxcdCAgICAgICBcXHUwMDI2Zm9saW8tXFx1MDAzZV9kZWZlcnJlZF9saXN0LCBmb2xpb19uaWQoZm9saW8pKTtcXG4tXFx0XFx0XFx0aWYgKGZvbGlvX3Rlc3RfcGFydGlhbGx5X21hcHBlZChmb2xpbykpIHtcXG4tXFx0XFx0XFx0XFx0Zm9saW9fY2xlYXJfcGFydGlhbGx5X21hcHBlZChmb2xpbyk7XFxuLVxcdFxcdFxcdFxcdG1vZF9tdGhwX3N0YXQob2xkX29yZGVyLFxcbi1cXHRcXHRcXHRcXHRcXHRNVEhQX1NUQVRfTlJfQU5PTl9QQVJUSUFMTFlfTUFQUEVELCAtMSk7XFxuLVxcdFxcdFxcdH1cXG4gXFx0XFx0XFx0bGlzdF9scnVfdW5sb2NrKGxydSk7XFxuIFxcdFxcdFxcdHJjdV9yZWFkX3VubG9jaygpO1xcbiBcXHRcXHR9XFxuK1xcdFxcdHJldCA9IC1FQUdBSU47XFxuK1xcdFxcdGdvdG8gb3V0X25vX3NwbGl0O1xcbitcXHR9XFxuIFxcbi1cXHRcXHRpZiAobWFwcGluZykge1xcbi1cXHRcXHRcXHRpbnQgbnIgPSBmb2xpb19ucl9wYWdlcyhmb2xpbyk7XFxuLVxcbi1cXHRcXHRcXHRpZiAoZm9saW9fdGVzdF9wbWRfbWFwcGFibGUoZm9saW8pIFxcdTAwMjZcXHUwMDI2XFxuLVxcdFxcdFxcdCAgICBuZXdfb3JkZXIgXFx1MDAzYyBIUEFHRV9QTURfT1JERVIpIHtcXG4tXFx0XFx0XFx0XFx0aWYgKGZvbGlvX3Rlc3Rfc3dhcGJhY2tlZChmb2xpbykpIHtcXG4tXFx0XFx0XFx0XFx0XFx0bHJ1dmVjX3N0YXRfbW9kX2ZvbGlvKGZvbGlvLFxcbi1cXHRcXHRcXHRcXHRcXHRcXHRcXHROUl9TSE1FTV9USFBTLCAtbnIpO1xcbi1cXHRcXHRcXHRcXHR9IGVsc2Uge1xcbi1cXHRcXHRcXHRcXHRcXHRscnV2ZWNfc3RhdF9tb2RfZm9saW8oZm9saW8sXFxuLVxcdFxcdFxcdFxcdFxcdFxcdFxcdE5SX0ZJTEVfVEhQUywgLW5yKTtcXG4tXFx0XFx0XFx0XFx0fVxcbi1cXHRcXHRcXHR9XFxuK1xcdGlmIChkZXF1ZXVlX2RlZmVycmVkKSB7XFxuK1xcdFxcdF9fbGlzdF9scnVfZGVsKFxcdTAwMjZkZWZlcnJlZF9zcGxpdF9scnUsIGxydSxcXG4rXFx0XFx0XFx0ICAgICAgIFxcdTAwMjZmb2xpby1cXHUwMDNlX2RlZmVycmVkX2xpc3QsIGZvbGlvX25pZChmb2xpbykpO1xcbitcXHRcXHRpZiAoZm9saW9fdGVzdF9wYXJ0aWFsbHlfbWFwcGVkKGZvbGlvKSkge1xcbitcXHRcXHRcXHRmb2xpb19jbGVhcl9wYXJ0aWFsbHlfbWFwcGVkKGZvbGlvKTtcXG4rXFx0XFx0XFx0bW9kX210aHBfc3RhdChvbGRfb3JkZXIsXFxuK1xcdFxcdFxcdFxcdCAgICAgIE1USFBfU1RBVF9OUl9BTk9OX1BBUlRJQUxMWV9NQVBQRUQsIC0xKTtcXG4gXFx0XFx0fVxcbitcXHRcXHRsaXN0X2xydV91bmxvY2sobHJ1KTtcXG4rXFx0XFx0cmN1X3JlYWRfdW5sb2NrKCk7XFxuK1xcdH1cXG4gXFxuLVxcdFxcdGlmIChmb2xpb190ZXN0X3N3YXBjYWNoZShmb2xpbykpIHtcXG4tXFx0XFx0XFx0aWYgKG1hcHBpbmcpIHtcXG4tXFx0XFx0XFx0XFx0Vk1fV0FSTl9PTl9PTkNFX0ZPTElPKG1hcHBpbmcsIGZvbGlvKTtcXG4tXFx0XFx0XFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuLVxcdFxcdFxcdH1cXG4rXFx0aWYgKGZvbGlvX3Rlc3Rfc3dhcGNhY2hlKGZvbGlvKSlcXG4rXFx0XFx0Y2kgPSBzd2FwX2NsdXN0ZXJfZ2V0X2FuZF9sb2NrKGZvbGlvKTtcXG4gXFxuLVxcdFxcdFxcdGNpID0gc3dhcF9jbHVzdGVyX2dldF9hbmRfbG9jayhmb2xpbyk7XFxuLVxcdFxcdH1cXG4rXFx0aWYgKGRvX2xydSlcXG4rXFx0XFx0bHJ1dmVjID0gZm9saW9fbHJ1dmVjX2xvY2soZm9saW8pO1xcbitcXG4rXFx0cmV0ID0gX19zcGxpdF91bm1hcHBlZF9mb2xpbyhmb2xpbywgbmV3X29yZGVyLCBzcGxpdF9hdCwgTlVMTCxcXG4rXFx0XFx0XFx0XFx0ICAgICBOVUxMLCBzcGxpdF90eXBlKTtcXG4gXFxuLVxcdFxcdC8qIGxvY2sgbHJ1IGxpc3QvUGFnZUNvbXBvdW5kLCByZWYgZnJvemVuIGJ5IHBhZ2VfcmVmX2ZyZWV6ZSAqL1xcbitcXHQvKlxcbitcXHQgKiBVbmZyZWV6ZSB0aGUgYWZ0ZXItc3BsaXQgZm9saW9zIGFuZCBwdXQgdGhlbSBiYWNrIHRvIHRoZSByaWdodFxcbitcXHQgKiBwbGFjZSwga2VlcGluZyB0aGUgaGVhZCBAZm9saW8gZnJvemVuIHVudGlsIHRoZSBlbmQuIFdoaWxlIHRoZVxcbitcXHQgKiBmb2xpbyBpcyBpbiB0aGUgc3dhcCBjYWNoZSwgdGhlIHN1YiBlbnRyaWVzIG11c3QgYmUgdXBkYXRlZCB3aXRoXFxuK1xcdCAqIHRoZWlyIGFmdGVyLXNwbGl0IGZvbGlvcyBiZWZvcmUgdGhlIGhlYWQgaXMgdW5mcm96ZW4sIHNvIGFcXG4rXFx0ICogY29uY3VycmVudCBzd2FwX2NhY2hlX2dldF9mb2xpbygpIGNhbm5vdCByZXR1cm4gdGhlIGhlYWQgZm9saW9cXG4rXFx0ICogZm9yIGEgc3ViIGVudHJ5LiBLZWVwaW5nIHRoZSBoZWFkIGZyb3plbiB0aHJvdWdob3V0IGFsc28gc3RvcHMgYVxcbitcXHQgKiBwYXJhbGxlbCBmb2xpb190cnlfZ2V0KCkgZnJvbSBvYnNlcnZpbmcgYSBwYXJ0aWFsbHkgc3BsaXQgZm9saW8uXFxuK1xcdCAqL1xcbitcXHRmb3IgKG5ld19mb2xpbyA9IGZvbGlvX25leHQoZm9saW8pOyBuZXdfZm9saW8gIT0gZW5kX2ZvbGlvO1xcbitcXHQgICAgIG5ld19mb2xpbyA9IGZvbGlvX25leHQobmV3X2ZvbGlvKSkge1xcbitcXHRcXHR6b25lX2RldmljZV9wcml2YXRlX3NwbGl0X2NiKGZvbGlvLCBuZXdfZm9saW8pO1xcbitcXHRcXHRmb2xpb19yZWZfdW5mcmVlemUobmV3X2ZvbGlvLFxcbitcXHRcXHRcXHRcXHQgICBmb2xpb19zd2FwY2FjaGVfcmVmX2NvdW50KG5ld19mb2xpbykgKyAxKTtcXG4gXFx0XFx0aWYgKGRvX2xydSlcXG4tXFx0XFx0XFx0bHJ1dmVjID0gZm9saW9fbHJ1dmVjX2xvY2soZm9saW8pO1xcbitcXHRcXHRcXHRscnVfYWRkX3NwbGl0X2ZvbGlvKGZvbGlvLCBuZXdfZm9saW8sIGxydXZlYywgbGlzdCk7XFxuK1xcdFxcdGlmIChjaSlcXG4rXFx0XFx0XFx0X19zd2FwX2NhY2hlX3JlcGxhY2VfZm9saW8oY2ksIGZvbGlvLCBuZXdfZm9saW8pO1xcbitcXHR9XFxuIFxcbi1cXHRcXHRyZXQgPSBfX3NwbGl0X3VubWFwcGVkX2ZvbGlvKGZvbGlvLCBuZXdfb3JkZXIsIHNwbGl0X2F0LCB4YXMsXFxuLVxcdFxcdFxcdFxcdFxcdCAgICAgbWFwcGluZywgc3BsaXRfdHlwZSk7XFxuK1xcdHpvbmVfZGV2aWNlX3ByaXZhdGVfc3BsaXRfY2IoZm9saW8sIE5VTEwpO1xcbitcXHRmb2xpb19yZWZfdW5mcmVlemUoZm9saW8sIGZvbGlvX3N3YXBjYWNoZV9yZWZfY291bnQoZm9saW8pICsgMSk7XFxuIFxcbi1cXHRcXHQvKlxcbi1cXHRcXHQgKiBVbmZyZWV6ZSBhZnRlci1zcGxpdCBmb2xpb3MgYW5kIHB1dCB0aGVtIGJhY2sgdG8gdGhlIHJpZ2h0XFxuLVxcdFxcdCAqIGxpc3QuIEBmb2xpbyBzaG91bGQgYmUga2VwdCBmcm96b24gdW50aWwgcGFnZSBjYWNoZVxcbi1cXHRcXHQgKiBlbnRyaWVzIGFyZSB1cGRhdGVkIHdpdGggYWxsIHRoZSBvdGhlciBhZnRlci1zcGxpdCBmb2xpb3NcXG4tXFx0XFx0ICogdG8gcHJldmVudCBvdGhlcnMgc2VlaW5nIHN0YWxlIHBhZ2UgY2FjaGUgZW50cmllcy5cXG4tXFx0XFx0ICogQXMgYSByZXN1bHQsIG5ld19mb2xpbyBzdGFydHMgZnJvbSB0aGUgbmV4dCBmb2xpbyBvZlxcbi1cXHRcXHQgKiBAZm9saW8uXFxuLVxcdFxcdCAqL1xcbi1cXHRcXHRmb3IgKG5ld19mb2xpbyA9IGZvbGlvX25leHQoZm9saW8pOyBuZXdfZm9saW8gIT0gZW5kX2ZvbGlvO1xcbi1cXHRcXHQgICAgIG5ld19mb2xpbyA9IG5leHQpIHtcXG4tXFx0XFx0XFx0dW5zaWduZWQgbG9uZyBucl9wYWdlcyA9IGZvbGlvX25yX3BhZ2VzKG5ld19mb2xpbyk7XFxuK1xcdGlmIChkb19scnUpXFxuK1xcdFxcdGxydXZlY191bmxvY2sobHJ1dmVjKTtcXG4rXFx0aWYgKGNpKVxcbitcXHRcXHRzd2FwX2NsdXN0ZXJfdW5sb2NrKGNpKTtcXG4rb3V0X25vX3NwbGl0OlxcbitcXHRsb2NhbF9pcnFfZW5hYmxlKCk7XFxuK1xcdGlmIChhbm9uX3VubWFwKSB7XFxuK1xcdFxcdGlmICghcmV0IFxcdTAwMjZcXHUwMDI2ICFmb2xpb19pc19kZXZpY2VfcHJpdmF0ZShmb2xpbykpXFxuK1xcdFxcdFxcdHR0dV9mbGFncyA9IFRUVV9VU0VfU0hBUkVEX1pFUk9QQUdFO1xcbitcXHRcXHRyZW1hcF9wYWdlKGZvbGlvLCAxIFxcdTAwM2NcXHUwMDNjIG9sZF9vcmRlciwgdHR1X2ZsYWdzKTtcXG4rXFx0fVxcbitvdXRfdW5sb2NrOlxcbitcXHRpZiAoYW5vbl91bm1hcCkge1xcbitcXHRcXHRhbm9uX3ZtYV91bmxvY2tfd3JpdGUoYW5vbl92bWEpO1xcbitcXHRcXHRwdXRfYW5vbl92bWEoYW5vbl92bWEpO1xcbitcXHR9XFxuIFxcbi1cXHRcXHRcXHRuZXh0ID0gZm9saW9fbmV4dChuZXdfZm9saW8pO1xcbitcXHRyZXR1cm4gcmV0O1xcbit9XFxuIFxcbi1cXHRcXHRcXHR6b25lX2RldmljZV9wcml2YXRlX3NwbGl0X2NiKGZvbGlvLCBuZXdfZm9saW8pO1xcbitzdGF0aWMgaW50IF9fZm9saW9fZnJlZXplX3NwbGl0X3VubWFwX2ZpbGUoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlcixcXG4rXFx0XFx0XFx0XFx0XFx0ICAgc3RydWN0IHBhZ2UgKnNwbGl0X2F0LCBib29sIGRvX2xydSxcXG4rXFx0XFx0XFx0XFx0XFx0ICAgc3RydWN0IGxpc3RfaGVhZCAqbGlzdCwgZW51bSBzcGxpdF90eXBlIHNwbGl0X3R5cGUpXFxuK3tcXG4rXFx0c3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSBmb2xpby1cXHUwMDNlbWFwcGluZztcXG4rXFx0WEFfU1RBVEUoeGFzLCBcXHUwMDI2bWFwcGluZy1cXHUwMDNlaV9wYWdlcywgZm9saW8tXFx1MDAzZWluZGV4KTtcXG4rXFx0c3RydWN0IGZvbGlvICplbmRfZm9saW8gPSBmb2xpb19uZXh0KGZvbGlvKTtcXG4rXFx0bG9uZyBvbGRfbnJfcGFnZXMgPSBmb2xpb19ucl9wYWdlcyhmb2xpbyk7XFxuK1xcdHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZywgKm9sZF9tZW1jZztcXG4rXFx0c3RydWN0IGZvbGlvICpuZXdfZm9saW8sICpuZXh0O1xcbitcXHRpbnQgbnJfc2htZW1fZHJvcHBlZCA9IDA7XFxuK1xcdHVuc2lnbmVkIGludCBtaW5fb3JkZXI7XFxuK1xcdHN0cnVjdCBscnV2ZWMgKmxydXZlYztcXG4rXFx0cGdvZmZfdCBlbmQgPSAwO1xcbitcXHRnZnBfdCBnZnA7XFxuK1xcdGludCByZXQgPSAwO1xcbiBcXG4tXFx0XFx0XFx0Zm9saW9fcmVmX3VuZnJlZXplKG5ld19mb2xpbyxcXG4tXFx0XFx0XFx0XFx0XFx0ICAgZm9saW9fY2FjaGVfcmVmX2NvdW50KG5ld19mb2xpbykgKyAxKTtcXG4rXFx0bWluX29yZGVyID0gbWFwcGluZ19taW5fZm9saW9fb3JkZXIobWFwcGluZyk7XFxuK1xcdGlmIChuZXdfb3JkZXIgXFx1MDAzYyBtaW5fb3JkZXIpXFxuK1xcdFxcdHJldHVybiAtRUlOVkFMO1xcbiBcXG4tXFx0XFx0XFx0aWYgKGRvX2xydSlcXG4tXFx0XFx0XFx0XFx0bHJ1X2FkZF9zcGxpdF9mb2xpbyhmb2xpbywgbmV3X2ZvbGlvLCBscnV2ZWMsIGxpc3QpO1xcbitcXHQvKlxcbitcXHQgKiBTd2l0Y2ggdG8gZm9saW8ncyBtZW1jZyBhcyB4YXJyYXkgbm9kZSBhbGxvY2F0aW9uIGNhbiBoYXBwZW4gYW5kXFxuK1xcdCAqIG5lZWRzIHRvIGNoYXJnZSB0byBpdC5cXG4rXFx0ICovXFxuK1xcdG1lbWNnID0gZ2V0X21lbV9jZ3JvdXBfZnJvbV9mb2xpbyhmb2xpbyk7XFxuK1xcdG9sZF9tZW1jZyA9IHNldF9hY3RpdmVfbWVtY2cobWVtY2cpO1xcbiBcXG4tXFx0XFx0XFx0LypcXG4tXFx0XFx0XFx0ICogQW5vbnltb3VzIGZvbGlvIHdpdGggc3dhcCBjYWNoZS5cXG4tXFx0XFx0XFx0ICogTk9URTogc2htZW0gaW4gc3dhcCBjYWNoZSBpcyBub3Qgc3VwcG9ydGVkIHlldC5cXG4tXFx0XFx0XFx0ICovXFxuLVxcdFxcdFxcdGlmIChjaSkge1xcbi1cXHRcXHRcXHRcXHRfX3N3YXBfY2FjaGVfcmVwbGFjZV9mb2xpbyhjaSwgZm9saW8sIG5ld19mb2xpbyk7XFxuLVxcdFxcdFxcdFxcdGNvbnRpbnVlO1xcbi1cXHRcXHRcXHR9XFxuK1xcdGdmcCA9IGN1cnJlbnRfZ2ZwX2NvbnRleHQobWFwcGluZ19nZnBfbWFzayhtYXBwaW5nKSBcXHUwMDI2IEdGUF9SRUNMQUlNX01BU0spO1xcbitcXHRpZiAoIWZpbGVtYXBfcmVsZWFzZV9mb2xpbyhmb2xpbywgZ2ZwKSkge1xcbitcXHRcXHRyZXQgPSAtRUJVU1k7XFxuK1xcdFxcdGdvdG8gZmFpbF9mcmVlO1xcbitcXHR9XFxuIFxcbi1cXHRcXHRcXHQvKiBBbm9ueW1vdXMgZm9saW8gd2l0aG91dCBzd2FwIGNhY2hlICovXFxuLVxcdFxcdFxcdGlmICghbWFwcGluZylcXG4tXFx0XFx0XFx0XFx0Y29udGludWU7XFxuK1xcdG1hcHBpbmdfc2V0X3VwZGF0ZShcXHUwMDI2eGFzLCBtYXBwaW5nKTtcXG4gXFxuLVxcdFxcdFxcdC8qIEFkZCB0aGUgbmV3IGZvbGlvIHRvIHRoZSBwYWdlIGNhY2hlLiAqL1xcbi1cXHRcXHRcXHRpZiAobmV3X2ZvbGlvLVxcdTAwM2VpbmRleCBcXHUwMDNjIGVuZCkge1xcbi1cXHRcXHRcXHRcXHRfX3hhX3N0b3JlKFxcdTAwMjZtYXBwaW5nLVxcdTAwM2VpX3BhZ2VzLCBuZXdfZm9saW8tXFx1MDAzZWluZGV4LFxcbi1cXHRcXHRcXHRcXHRcXHQgICBuZXdfZm9saW8sIDApO1xcbi1cXHRcXHRcXHRcXHRjb250aW51ZTtcXG4tXFx0XFx0XFx0fVxcbitcXHRpZiAoc3BsaXRfdHlwZSA9PSBTUExJVF9UWVBFX1VOSUZPUk0pIHtcXG4rXFx0XFx0aW50IG9sZF9vcmRlciA9IGZvbGlvX29yZGVyKGZvbGlvKTtcXG4gXFxuLVxcdFxcdFxcdFZNX1dBUk5fT05fT05DRSghbnJfc2htZW1fZHJvcHBlZCk7XFxuLVxcdFxcdFxcdC8qIERyb3AgZm9saW8gYmV5b25kIEVPRjogLVxcdTAwM2VpbmRleCBcXHUwMDNlPSBlbmQgKi9cXG4tXFx0XFx0XFx0aWYgKHNobWVtX21hcHBpbmcobWFwcGluZykgXFx1MDAyNlxcdTAwMjYgbnJfc2htZW1fZHJvcHBlZClcXG4tXFx0XFx0XFx0XFx0Km5yX3NobWVtX2Ryb3BwZWQgKz0gbnJfcGFnZXM7XFxuLVxcdFxcdFxcdGVsc2UgaWYgKGZvbGlvX3Rlc3RfY2xlYXJfZGlydHkobmV3X2ZvbGlvKSlcXG4tXFx0XFx0XFx0XFx0Zm9saW9fYWNjb3VudF9jbGVhbmVkKFxcbi1cXHRcXHRcXHRcXHRcXHRuZXdfZm9saW8sIGlub2RlX3RvX3diKG1hcHBpbmctXFx1MDAzZWhvc3QpKTtcXG4tXFx0XFx0XFx0X19maWxlbWFwX3JlbW92ZV9mb2xpbyhuZXdfZm9saW8sIE5VTEwpO1xcbi1cXHRcXHRcXHRmb2xpb19wdXRfcmVmcyhuZXdfZm9saW8sIG5yX3BhZ2VzKTtcXG4rXFx0XFx0eGFzX3NldF9vcmRlcihcXHUwMDI2eGFzLCBmb2xpby1cXHUwMDNlaW5kZXgsIG5ld19vcmRlcik7XFxuK1xcdFxcdHhhc19zcGxpdF9hbGxvYyhcXHUwMDI2eGFzLCBmb2xpbywgb2xkX29yZGVyLCBnZnApO1xcbitcXHRcXHRpZiAoeGFzX2Vycm9yKFxcdTAwMjZ4YXMpKSB7XFxuK1xcdFxcdFxcdHJldCA9IHhhc19lcnJvcihcXHUwMDI2eGFzKTtcXG4rXFx0XFx0XFx0Z290byBmYWlsX2ZyZWU7XFxuIFxcdFxcdH1cXG4rXFx0fVxcbiBcXG4tXFx0XFx0em9uZV9kZXZpY2VfcHJpdmF0ZV9zcGxpdF9jYihmb2xpbywgTlVMTCk7XFxuLVxcdFxcdC8qXFxuLVxcdFxcdCAqIFVuZnJlZXplIEBmb2xpbyBvbmx5IGFmdGVyIGFsbCBwYWdlIGNhY2hlIGVudHJpZXMsIHdoaWNoXFxuLVxcdFxcdCAqIHVzZWQgdG8gcG9pbnQgdG8gaXQsIGhhdmUgYmVlbiB1cGRhdGVkIHdpdGggbmV3IGZvbGlvcy5cXG4tXFx0XFx0ICogT3RoZXJ3aXNlLCBhIHBhcmFsbGVsIGZvbGlvX3RyeV9nZXQoKSBjYW4gZ3JhYiBAZm9saW9cXG4tXFx0XFx0ICogYW5kIGl0cyBjYWxsZXIgY2FuIHNlZSBzdGFsZSBwYWdlIGNhY2hlIGVudHJpZXMuXFxuLVxcdFxcdCAqL1xcbi1cXHRcXHRmb2xpb19yZWZfdW5mcmVlemUoZm9saW8sIGZvbGlvX2NhY2hlX3JlZl9jb3VudChmb2xpbykgKyAxKTtcXG4rXFx0aV9tbWFwX2xvY2tfcmVhZChtYXBwaW5nKTtcXG4rXFxuK1xcdC8qIFJhY3kgY2hlY2sgaWYgd2UgY2FuIHNwbGl0IHRoZSBwYWdlLCBiZWZvcmUgdW5tYXBfZm9saW8oKSAqL1xcbitcXHRpZiAoZm9saW9fZXhwZWN0ZWRfcmVmX2NvdW50KGZvbGlvKSAhPSBmb2xpb19yZWZfY291bnQoZm9saW8pIC0gMSkge1xcbitcXHRcXHRyZXQgPSAtRUFHQUlOO1xcbitcXHRcXHRnb3RvIGZhaWxfbW1hcF91bmxvY2s7XFxuK1xcdH1cXG4rXFxuK1xcdC8qXFxuK1xcdCAqX19zcGxpdF91bm1hcHBlZF9mb2xpbygpIG1heSBuZWVkIHRvIHRyaW0gb2ZmIHBhZ2VzIGJleW9uZFxcbitcXHQgKiBFT0Y6IGJ1dCBvbiAzMi1iaXQsIGlfc2l6ZV9yZWFkKCkgdGFrZXMgYW4gaXJxLXVuc2FmZVxcbitcXHQgKiBzZXFsb2NrLCB3aGljaCBjYW5ub3QgYmUgbmVzdGVkIGluc2lkZSB0aGUgcGFnZSB0cmVlIGxvY2suXFxuK1xcdCAqIFNvIG5vdGUgZW5kIG5vdzogaV9zaXplIGl0c2VsZiBtYXkgYmUgY2hhbmdlZCBhdCBhbnkgbW9tZW50LFxcbitcXHQgKiBidXQgZm9saW8gbG9jayBpcyBnb29kIGVub3VnaCB0byBzZXJpYWxpemUgdGhlIHRyaW1taW5nLlxcbitcXHQgKi9cXG4rXFx0ZW5kID0gRElWX1JPVU5EX1VQKGlfc2l6ZV9yZWFkKG1hcHBpbmctXFx1MDAzZWhvc3QpLCBQQUdFX1NJWkUpO1xcbitcXHRpZiAoc2htZW1fbWFwcGluZyhtYXBwaW5nKSlcXG4rXFx0XFx0ZW5kID0gc2htZW1fZmFsbG9jZW5kKG1hcHBpbmctXFx1MDAzZWhvc3QsIGVuZCk7XFxuK1xcbitcXHR1bm1hcF9mb2xpbyhmb2xpbyk7XFxuK1xcbitcXHR4YXNfbG9ja19pcnEoXFx1MDAyNnhhcyk7XFxuK1xcbitcXHQvKlxcbitcXHQgKiBDaGVjayBpZiB0aGUgZm9saW8gaXMgcHJlc2VudCBpbiBwYWdlIGNhY2hlLlxcbitcXHQgKiBXZSBhc3N1bWUgYWxsIHRhaWwgYXJlIHByZXNlbnQgdG9vLCBpZiBmb2xpbyBpcyB0aGVyZS5cXG4rXFx0ICovXFxuK1xcdGlmICh4YXNfbG9hZChcXHUwMDI2eGFzKSAhPSBmb2xpbykge1xcbitcXHRcXHRyZXQgPSAtRUFHQUlOO1xcbitcXHRcXHRnb3RvIGZhaWw7XFxuK1xcdH1cXG4rXFxuK1xcdGlmICghZm9saW9fcmVmX2ZyZWV6ZShmb2xpbywgb2xkX25yX3BhZ2VzICsgMSkpIHtcXG4rXFx0XFx0cmV0ID0gLUVBR0FJTjtcXG4rXFx0XFx0Z290byBmYWlsO1xcbitcXHR9XFxuK1xcbitcXHRpZiAoZm9saW9fdGVzdF9wbWRfbWFwcGFibGUoZm9saW8pIFxcdTAwMjZcXHUwMDI2IG5ld19vcmRlciBcXHUwMDNjIEhQQUdFX1BNRF9PUkRFUikge1xcbitcXHRcXHRpZiAoZm9saW9fdGVzdF9zd2FwYmFja2VkKGZvbGlvKSlcXG4rXFx0XFx0XFx0bHJ1dmVjX3N0YXRfbW9kX2ZvbGlvKGZvbGlvLCBOUl9TSE1FTV9USFBTLCAtb2xkX25yX3BhZ2VzKTtcXG4rXFx0XFx0ZWxzZVxcbitcXHRcXHRcXHRscnV2ZWNfc3RhdF9tb2RfZm9saW8oZm9saW8sIE5SX0ZJTEVfVEhQUywgLW9sZF9ucl9wYWdlcyk7XFxuK1xcdH1cXG4rXFxuK1xcdC8qIGxvY2sgbHJ1IGxpc3QvUGFnZUNvbXBvdW5kLCByZWYgZnJvemVuIGJ5IHBhZ2VfcmVmX2ZyZWV6ZSAqL1xcbitcXHRpZiAoZG9fbHJ1KVxcbitcXHRcXHRscnV2ZWMgPSBmb2xpb19scnV2ZWNfbG9jayhmb2xpbyk7XFxuK1xcbitcXHRyZXQgPSBfX3NwbGl0X3VubWFwcGVkX2ZvbGlvKGZvbGlvLCBuZXdfb3JkZXIsIHNwbGl0X2F0LCBcXHUwMDI2eGFzLFxcbitcXHRcXHRcXHRcXHQgICAgIG1hcHBpbmcsIHNwbGl0X3R5cGUpO1xcbitcXG4rXFx0LypcXG4rXFx0ICogVW5mcmVlemUgYWZ0ZXItc3BsaXQgZm9saW9zIGFuZCBwdXQgdGhlbSBiYWNrIHRvIHRoZSByaWdodFxcbitcXHQgKiBsaXN0LiBAZm9saW8gc2hvdWxkIGJlIGtlcHQgZnJvemVuIHVudGlsIHBhZ2UgY2FjaGVcXG4rXFx0ICogZW50cmllcyBhcmUgdXBkYXRlZCB3aXRoIGFsbCB0aGUgb3RoZXIgYWZ0ZXItc3BsaXQgZm9saW9zXFxuK1xcdCAqIHRvIHByZXZlbnQgb3RoZXJzIHNlZWluZyBzdGFsZSBwYWdlIGNhY2hlIGVudHJpZXMuXFxuK1xcdCAqIEFzIGEgcmVzdWx0LCBuZXdfZm9saW8gc3RhcnRzIGZyb20gdGhlIG5leHQgZm9saW8gb2ZcXG4rXFx0ICogQGZvbGlvLlxcbitcXHQgKi9cXG4rXFx0Zm9yIChuZXdfZm9saW8gPSBmb2xpb19uZXh0KGZvbGlvKTsgbmV3X2ZvbGlvICE9IGVuZF9mb2xpbztcXG4rXFx0ICAgICBuZXdfZm9saW8gPSBuZXh0KSB7XFxuK1xcdFxcdHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMgPSBmb2xpb19ucl9wYWdlcyhuZXdfZm9saW8pO1xcbitcXG4rXFx0XFx0bmV4dCA9IGZvbGlvX25leHQobmV3X2ZvbGlvKTtcXG4rXFxuK1xcdFxcdGZvbGlvX3JlZl91bmZyZWV6ZShuZXdfZm9saW8sXFxuK1xcdFxcdFxcdFxcdCAgIGZvbGlvX25yX3BhZ2VzKG5ld19mb2xpbykgKyAxKTtcXG4gXFxuIFxcdFxcdGlmIChkb19scnUpXFxuLVxcdFxcdFxcdGxydXZlY191bmxvY2sobHJ1dmVjKTtcXG4rXFx0XFx0XFx0bHJ1X2FkZF9zcGxpdF9mb2xpbyhmb2xpbywgbmV3X2ZvbGlvLCBscnV2ZWMsIGxpc3QpO1xcbiBcXG4tXFx0XFx0aWYgKGNpKVxcbi1cXHRcXHRcXHRzd2FwX2NsdXN0ZXJfdW5sb2NrKGNpKTtcXG4tXFx0fSBlbHNlIHtcXG4tXFx0XFx0aWYgKGRlcXVldWVfZGVmZXJyZWQpIHtcXG4tXFx0XFx0XFx0bGlzdF9scnVfdW5sb2NrKGxydSk7XFxuLVxcdFxcdFxcdHJjdV9yZWFkX3VubG9jaygpO1xcbitcXHRcXHQvKiBBZGQgdGhlIG5ldyBmb2xpbyB0byB0aGUgcGFnZSBjYWNoZS4gKi9cXG4rXFx0XFx0aWYgKG5ld19mb2xpby1cXHUwMDNlaW5kZXggXFx1MDAzYyBlbmQpIHtcXG4rXFx0XFx0XFx0X194YV9zdG9yZShcXHUwMDI2bWFwcGluZy1cXHUwMDNlaV9wYWdlcywgbmV3X2ZvbGlvLVxcdTAwM2VpbmRleCxcXG4rXFx0XFx0XFx0XFx0ICAgbmV3X2ZvbGlvLCAwKTtcXG4rXFx0XFx0XFx0Y29udGludWU7XFxuIFxcdFxcdH1cXG4tXFx0XFx0cmV0dXJuIC1FQUdBSU47XFxuK1xcbitcXHRcXHQvKiBEcm9wIGZvbGlvIGJleW9uZCBFT0Y6IC1cXHUwMDNlaW5kZXggXFx1MDAzZT0gZW5kICovXFxuK1xcdFxcdGlmIChzaG1lbV9tYXBwaW5nKG1hcHBpbmcpKVxcbitcXHRcXHRcXHRucl9zaG1lbV9kcm9wcGVkICs9IG5yX3BhZ2VzO1xcbitcXHRcXHRlbHNlIGlmIChmb2xpb190ZXN0X2NsZWFyX2RpcnR5KG5ld19mb2xpbykpXFxuK1xcdFxcdFxcdGZvbGlvX2FjY291bnRfY2xlYW5lZChuZXdfZm9saW8sXFxuK1xcdFxcdFxcdFxcdFxcdCAgICAgIGlub2RlX3RvX3diKG1hcHBpbmctXFx1MDAzZWhvc3QpKTtcXG4rXFx0XFx0X19maWxlbWFwX3JlbW92ZV9mb2xpbyhuZXdfZm9saW8sIE5VTEwpO1xcbitcXHRcXHRmb2xpb19wdXRfcmVmcyhuZXdfZm9saW8sIG5yX3BhZ2VzKTtcXG4gXFx0fVxcbiBcXG4rXFx0LypcXG4rXFx0ICogVW5mcmVlemUgQGZvbGlvIG9ubHkgYWZ0ZXIgYWxsIHBhZ2UgY2FjaGUgZW50cmllcywgd2hpY2hcXG4rXFx0ICogdXNlZCB0byBwb2ludCB0byBpdCwgaGF2ZSBiZWVuIHVwZGF0ZWQgd2l0aCBuZXcgZm9saW9zLlxcbitcXHQgKiBPdGhlcndpc2UsIGEgcGFyYWxsZWwgZm9saW9fdHJ5X2dldCgpIGNhbiBncmFiIEBmb2xpb1xcbitcXHQgKiBhbmQgaXRzIGNhbGxlciBjYW4gc2VlIHN0YWxlIHBhZ2UgY2FjaGUgZW50cmllcy5cXG4rXFx0ICovXFxuK1xcdGZvbGlvX3JlZl91bmZyZWV6ZShmb2xpbywgZm9saW9fbnJfcGFnZXMoZm9saW8pICsgMSk7XFxuK1xcbitcXHRpZiAoZG9fbHJ1KVxcbitcXHRcXHRscnV2ZWNfdW5sb2NrKGxydXZlYyk7XFxuK1xcbitmYWlsOlxcbitcXHR4YXNfdW5sb2NrX2lycShcXHUwMDI2eGFzKTtcXG4rZmFpbF9tbWFwX3VubG9jazpcXG4rXFx0aWYgKG5yX3NobWVtX2Ryb3BwZWQpXFxuK1xcdFxcdHNobWVtX3VuY2hhcmdlKG1hcHBpbmctXFx1MDAzZWhvc3QsIG5yX3NobWVtX2Ryb3BwZWQpO1xcbitcXHQvKlxcbitcXHQgKiBEcm9wIHRoZSBtYXBwaW5nIHdoaWxlIHRoZSBpbm9kZSBpcyBzdGlsbCBwaW5uZWQuIEBmb2xpbyBzdGF5c1xcbitcXHQgKiBsb2NrZWQgYW5kIHByZXNlbnQgaW4gdGhlIHBhZ2UgY2FjaGUsIHNvIGV2aWN0aW9uIGNhbm5vdCBmcmVlXFxuK1xcdCAqIHRoZSBpbm9kZSB5ZXQsIG5vdGhpbmcgcGFzdCB0aGlzIHBvaW50IG1heSB0b3VjaCB0aGUgaW5vZGUgb3JcXG4rXFx0ICogdGhlIG1hcHBpbmcuXFxuK1xcdCAqL1xcbitcXHRpX21tYXBfdW5sb2NrX3JlYWQobWFwcGluZyk7XFxuK2ZhaWxfZnJlZTpcXG4rXFx0LyogUmVzdG9yZSB0aGUgcHJldmlvdXNseSBhY3RpdmUgbWVtY2cgKi9cXG4rXFx0c2V0X2FjdGl2ZV9tZW1jZyhvbGRfbWVtY2cpO1xcbitcXHRtZW1fY2dyb3VwX3B1dChtZW1jZyk7XFxuK1xcdHhhc19kZXN0cm95KFxcdTAwMjZ4YXMpO1xcbiBcXHRyZXR1cm4gcmV0O1xcbiB9XFxuIFxcbkBAIC00MTAyLDE3ICs0MjQ4LDExIEBAIHN0YXRpYyBpbnQgX19mb2xpb19zcGxpdChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyLFxcbiBcXHRcXHRzdHJ1Y3QgcGFnZSAqc3BsaXRfYXQsIHN0cnVjdCBwYWdlICpsb2NrX2F0LFxcbiBcXHRcXHRzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LCBlbnVtIHNwbGl0X3R5cGUgc3BsaXRfdHlwZSlcXG4ge1xcbi1cXHRYQV9TVEFURSh4YXMsIFxcdTAwMjZmb2xpby1cXHUwMDNlbWFwcGluZy1cXHUwMDNlaV9wYWdlcywgZm9saW8tXFx1MDAzZWluZGV4KTtcXG4rXFx0Ym9vbCBpc19zd2FwY2FjaGUgPSBmb2xpb190ZXN0X3N3YXBjYWNoZShmb2xpbyk7XFxuIFxcdHN0cnVjdCBmb2xpbyAqZW5kX2ZvbGlvID0gZm9saW9fbmV4dChmb2xpbyk7XFxuIFxcdGJvb2wgaXNfYW5vbiA9IGZvbGlvX3Rlc3RfYW5vbihmb2xpbyk7XFxuLVxcdHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZywgKm9sZF9tZW1jZztcXG4tXFx0c3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSBOVUxMO1xcbi1cXHRzdHJ1Y3QgYW5vbl92bWEgKmFub25fdm1hID0gTlVMTDtcXG4gXFx0aW50IG9sZF9vcmRlciA9IGZvbGlvX29yZGVyKGZvbGlvKTtcXG4gXFx0c3RydWN0IGZvbGlvICpuZXdfZm9saW8sICpuZXh0O1xcbi1cXHRpbnQgbnJfc2htZW1fZHJvcHBlZCA9IDA7XFxuLVxcdGVudW0gdHR1X2ZsYWdzIHR0dV9mbGFncyA9IDA7XFxuLVxcdHBnb2ZmX3QgZW5kID0gMDtcXG4gXFx0aW50IHJldDtcXG4gXFxuIFxcdFZNX1dBUk5fT05fT05DRV9GT0xJTyghZm9saW9fdGVzdF9sb2NrZWQoZm9saW8pLCBmb2xpbyk7XFxuQEAgLTQxMjAsMTQxICs0MjYwLDI5IEBAIHN0YXRpYyBpbnQgX19mb2xpb19zcGxpdChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyLFxcbiBcXG4gXFx0aWYgKGZvbGlvICE9IHBhZ2VfZm9saW8oc3BsaXRfYXQpIHx8IGZvbGlvICE9IHBhZ2VfZm9saW8obG9ja19hdCkpIHtcXG4gXFx0XFx0cmV0ID0gLUVJTlZBTDtcXG4tXFx0XFx0Z290byBvdXRfbm9fbWVtY2c7XFxuK1xcdFxcdGdvdG8gb3V0O1xcbiBcXHR9XFxuIFxcbiBcXHRpZiAobmV3X29yZGVyIFxcdTAwM2U9IG9sZF9vcmRlcikge1xcbiBcXHRcXHRyZXQgPSAtRUlOVkFMO1xcbi1cXHRcXHRnb3RvIG91dF9ub19tZW1jZztcXG4rXFx0XFx0Z290byBvdXQ7XFxuIFxcdH1cXG4gXFxuIFxcdHJldCA9IGZvbGlvX2NoZWNrX3NwbGl0dGFibGUoZm9saW8sIG5ld19vcmRlciwgc3BsaXRfdHlwZSk7XFxuIFxcdGlmIChyZXQpIHtcXG4gXFx0XFx0Vk1fV0FSTl9PTkNFKHJldCA9PSAtRUlOVkFMLCBcXFwiVHJpZWQgdG8gc3BsaXQgYW4gdW5zcGxpdHRhYmxlIGZvbGlvXFxcIik7XFxuLVxcdFxcdGdvdG8gb3V0X25vX21lbWNnO1xcbi1cXHR9XFxuLVxcbi1cXHQvKlxcbi1cXHQgKiBzd2l0Y2ggdG8gZm9saW8ncyBtZW1jZyBhcyB4YXJyYXkgbm9kZSBhbGxvY2F0aW9uIGNhbiBoYXBwZW4gYW5kXFxuLVxcdCAqIG5lZWRzIHRvIGNoYXJnZSB0byBpdC5cXG4tXFx0ICovXFxuLVxcdG1lbWNnID0gZ2V0X21lbV9jZ3JvdXBfZnJvbV9mb2xpbyhmb2xpbyk7XFxuLVxcdG9sZF9tZW1jZyA9IHNldF9hY3RpdmVfbWVtY2cobWVtY2cpO1xcbi1cXG4tXFx0aWYgKGlzX2Fub24pIHtcXG4tXFx0XFx0LypcXG4tXFx0XFx0ICogVGhlIGNhbGxlciBkb2VzIG5vdCBuZWNlc3NhcmlseSBob2xkIGFuIG1tYXBfbG9jayB0aGF0IHdvdWxkXFxuLVxcdFxcdCAqIHByZXZlbnQgdGhlIGFub25fdm1hIGRpc2FwcGVhcmluZyBzbyB3ZSBmaXJzdCB3ZSB0YWtlIGFcXG4tXFx0XFx0ICogcmVmZXJlbmNlIHRvIGl0IGFuZCB0aGVuIGxvY2sgdGhlIGFub25fdm1hIGZvciB3cml0ZS4gVGhpc1xcbi1cXHRcXHQgKiBpcyBzaW1pbGFyIHRvIGZvbGlvX2xvY2tfYW5vbl92bWFfcmVhZCBleGNlcHQgdGhlIHdyaXRlIGxvY2tcXG4tXFx0XFx0ICogaXMgdGFrZW4gdG8gc2VyaWFsaXNlIGFnYWluc3QgcGFyYWxsZWwgc3BsaXQgb3IgY29sbGFwc2VcXG4tXFx0XFx0ICogb3BlcmF0aW9ucy5cXG4tXFx0XFx0ICovXFxuLVxcdFxcdGFub25fdm1hID0gZm9saW9fZ2V0X2Fub25fdm1hKGZvbGlvKTtcXG4tXFx0XFx0aWYgKCFhbm9uX3ZtYSkge1xcbi1cXHRcXHRcXHRyZXQgPSAtRUJVU1k7XFxuLVxcdFxcdFxcdGdvdG8gb3V0O1xcbi1cXHRcXHR9XFxuLVxcdFxcdGFub25fdm1hX2xvY2tfd3JpdGUoYW5vbl92bWEpO1xcbi1cXHRcXHRtYXBwaW5nID0gTlVMTDtcXG4tXFx0fSBlbHNlIHtcXG4tXFx0XFx0dW5zaWduZWQgaW50IG1pbl9vcmRlcjtcXG4tXFx0XFx0Z2ZwX3QgZ2ZwO1xcbi1cXG4tXFx0XFx0bWFwcGluZyA9IGZvbGlvLVxcdTAwM2VtYXBwaW5nO1xcbi1cXHRcXHRtaW5fb3JkZXIgPSBtYXBwaW5nX21pbl9mb2xpb19vcmRlcihtYXBwaW5nKTtcXG4tXFx0XFx0aWYgKG5ld19vcmRlciBcXHUwMDNjIG1pbl9vcmRlcikge1xcbi1cXHRcXHRcXHRyZXQgPSAtRUlOVkFMO1xcbi1cXHRcXHRcXHRnb3RvIG91dDtcXG4tXFx0XFx0fVxcbi1cXG4tXFx0XFx0Z2ZwID0gY3VycmVudF9nZnBfY29udGV4dChtYXBwaW5nX2dmcF9tYXNrKG1hcHBpbmcpIFxcdTAwMjZcXG4tXFx0XFx0XFx0XFx0XFx0XFx0XFx0R0ZQX1JFQ0xBSU1fTUFTSyk7XFxuLVxcbi1cXHRcXHRpZiAoIWZpbGVtYXBfcmVsZWFzZV9mb2xpbyhmb2xpbywgZ2ZwKSkge1xcbi1cXHRcXHRcXHRyZXQgPSAtRUJVU1k7XFxuLVxcdFxcdFxcdGdvdG8gb3V0O1xcbi1cXHRcXHR9XFxuLVxcbi1cXHRcXHRtYXBwaW5nX3NldF91cGRhdGUoXFx1MDAyNnhhcywgbWFwcGluZyk7XFxuLVxcbi1cXHRcXHRpZiAoc3BsaXRfdHlwZSA9PSBTUExJVF9UWVBFX1VOSUZPUk0pIHtcXG4tXFx0XFx0XFx0eGFzX3NldF9vcmRlcihcXHUwMDI2eGFzLCBmb2xpby1cXHUwMDNlaW5kZXgsIG5ld19vcmRlcik7XFxuLVxcdFxcdFxcdHhhc19zcGxpdF9hbGxvYyhcXHUwMDI2eGFzLCBmb2xpbywgb2xkX29yZGVyLCBnZnApO1xcbi1cXHRcXHRcXHRpZiAoeGFzX2Vycm9yKFxcdTAwMjZ4YXMpKSB7XFxuLVxcdFxcdFxcdFxcdHJldCA9IHhhc19lcnJvcihcXHUwMDI2eGFzKTtcXG4tXFx0XFx0XFx0XFx0Z290byBvdXQ7XFxuLVxcdFxcdFxcdH1cXG4tXFx0XFx0fVxcbi1cXG4tXFx0XFx0YW5vbl92bWEgPSBOVUxMO1xcbi1cXHRcXHRpX21tYXBfbG9ja19yZWFkKG1hcHBpbmcpO1xcbi1cXG4tXFx0XFx0LypcXG4tXFx0XFx0ICpfX3NwbGl0X3VubWFwcGVkX2ZvbGlvKCkgbWF5IG5lZWQgdG8gdHJpbSBvZmYgcGFnZXMgYmV5b25kXFxuLVxcdFxcdCAqIEVPRjogYnV0IG9uIDMyLWJpdCwgaV9zaXplX3JlYWQoKSB0YWtlcyBhbiBpcnEtdW5zYWZlXFxuLVxcdFxcdCAqIHNlcWxvY2ssIHdoaWNoIGNhbm5vdCBiZSBuZXN0ZWQgaW5zaWRlIHRoZSBwYWdlIHRyZWUgbG9jay5cXG4tXFx0XFx0ICogU28gbm90ZSBlbmQgbm93OiBpX3NpemUgaXRzZWxmIG1heSBiZSBjaGFuZ2VkIGF0IGFueSBtb21lbnQsXFxuLVxcdFxcdCAqIGJ1dCBmb2xpbyBsb2NrIGlzIGdvb2QgZW5vdWdoIHRvIHNlcmlhbGl6ZSB0aGUgdHJpbW1pbmcuXFxuLVxcdFxcdCAqL1xcbi1cXHRcXHRlbmQgPSBESVZfUk9VTkRfVVAoaV9zaXplX3JlYWQobWFwcGluZy1cXHUwMDNlaG9zdCksIFBBR0VfU0laRSk7XFxuLVxcdFxcdGlmIChzaG1lbV9tYXBwaW5nKG1hcHBpbmcpKVxcbi1cXHRcXHRcXHRlbmQgPSBzaG1lbV9mYWxsb2NlbmQobWFwcGluZy1cXHUwMDNlaG9zdCwgZW5kKTtcXG4tXFx0fVxcbi1cXG4tXFx0LypcXG4tXFx0ICogUmFjeSBjaGVjayBpZiB3ZSBjYW4gc3BsaXQgdGhlIHBhZ2UsIGJlZm9yZSB1bm1hcF9mb2xpbygpIHdpbGxcXG4tXFx0ICogc3BsaXQgUE1Ec1xcbi1cXHQgKi9cXG4tXFx0aWYgKGZvbGlvX2V4cGVjdGVkX3JlZl9jb3VudChmb2xpbykgIT0gZm9saW9fcmVmX2NvdW50KGZvbGlvKSAtIDEpIHtcXG4tXFx0XFx0cmV0ID0gLUVBR0FJTjtcXG4tXFx0XFx0Z290byBvdXRfdW5sb2NrO1xcbi1cXHR9XFxuLVxcbi1cXHR1bm1hcF9mb2xpbyhmb2xpbyk7XFxuLVxcbi1cXHQvKiBibG9jayBpbnRlcnJ1cHQgcmVlbnRyeSBpbiB4YV9sb2NrIGFuZCBzcGlubG9jayAqL1xcbi1cXHRsb2NhbF9pcnFfZGlzYWJsZSgpO1xcbi1cXHRpZiAobWFwcGluZykge1xcbi1cXHRcXHQvKlxcbi1cXHRcXHQgKiBDaGVjayBpZiB0aGUgZm9saW8gaXMgcHJlc2VudCBpbiBwYWdlIGNhY2hlLlxcbi1cXHRcXHQgKiBXZSBhc3N1bWUgYWxsIHRhaWwgYXJlIHByZXNlbnQgdG9vLCBpZiBmb2xpbyBpcyB0aGVyZS5cXG4tXFx0XFx0ICovXFxuLVxcdFxcdHhhc19sb2NrKFxcdTAwMjZ4YXMpO1xcbi1cXHRcXHR4YXNfcmVzZXQoXFx1MDAyNnhhcyk7XFxuLVxcdFxcdGlmICh4YXNfbG9hZChcXHUwMDI2eGFzKSAhPSBmb2xpbykge1xcbi1cXHRcXHRcXHRyZXQgPSAtRUFHQUlOO1xcbi1cXHRcXHRcXHRnb3RvIGZhaWw7XFxuLVxcdFxcdH1cXG4rXFx0XFx0Z290byBvdXQ7XFxuIFxcdH1cXG4gXFxuLVxcdHJldCA9IF9fZm9saW9fZnJlZXplX2FuZF9zcGxpdF91bm1hcHBlZChmb2xpbywgbmV3X29yZGVyLCBzcGxpdF9hdCwgXFx1MDAyNnhhcywgbWFwcGluZyxcXG4tXFx0XFx0XFx0XFx0XFx0XFx0dHJ1ZSwgbGlzdCwgc3BsaXRfdHlwZSwgZW5kLCBcXHUwMDI2bnJfc2htZW1fZHJvcHBlZCk7XFxuLWZhaWw6XFxuLVxcdGlmIChtYXBwaW5nKVxcbi1cXHRcXHR4YXNfdW5sb2NrKFxcdTAwMjZ4YXMpO1xcbi1cXG4tXFx0bG9jYWxfaXJxX2VuYWJsZSgpO1xcbi1cXG4tXFx0aWYgKG5yX3NobWVtX2Ryb3BwZWQpXFxuLVxcdFxcdHNobWVtX3VuY2hhcmdlKG1hcHBpbmctXFx1MDAzZWhvc3QsIG5yX3NobWVtX2Ryb3BwZWQpO1xcbi1cXG4tXFx0aWYgKCFyZXQgXFx1MDAyNlxcdTAwMjYgaXNfYW5vbiBcXHUwMDI2XFx1MDAyNiAhZm9saW9faXNfZGV2aWNlX3ByaXZhdGUoZm9saW8pKVxcbi1cXHRcXHR0dHVfZmxhZ3MgPSBUVFVfVVNFX1NIQVJFRF9aRVJPUEFHRTtcXG4tXFxuLVxcdHJlbWFwX3BhZ2UoZm9saW8sIDEgXFx1MDAzY1xcdTAwM2Mgb2xkX29yZGVyLCB0dHVfZmxhZ3MpO1xcbi1cXG4tXFx0LypcXG4tXFx0ICogRHJvcCB0aGUgbWFwcGluZyB3aGlsZSB0aGUgaW5vZGUgaXMgc3RpbGwgcGlubmVkLiBAZm9saW8gc3RheXNcXG4tXFx0ICogbG9ja2VkIGFuZCBwcmVzZW50IGluIHRoZSBwYWdlIGNhY2hlIHVudGlsIHRoZSBsb29wIGJlbG93LCBzb1xcbi1cXHQgKiBldmljdGlvbiBjYW5ub3QgZnJlZSB0aGUgaW5vZGUgeWV0OyBAbG9ja19hdCBpcyBub3QgZW5vdWdoLCBpdCBtYXlcXG4tXFx0ICogYmUgYSB0YWlsIGJleW9uZCBFT0YgdGhhdCB0aGUgc3BsaXQgYWxyZWFkeSBkcm9wcGVkIGZyb20gdGhlIHBhZ2VcXG4tXFx0ICogY2FjaGUuIE5vdGhpbmcgcGFzdCB0aGlzIHBvaW50IG1heSB0b3VjaCB0aGUgaW5vZGUgb3IgdGhlIG1hcHBpbmcuXFxuLVxcdCAqL1xcbi1cXHRpZiAobWFwcGluZykge1xcbi1cXHRcXHRpX21tYXBfdW5sb2NrX3JlYWQobWFwcGluZyk7XFxuLVxcdFxcdG1hcHBpbmcgPSBOVUxMO1xcbi1cXHR9XFxuK1xcdGlmIChpc19hbm9uKVxcbitcXHRcXHRyZXQgPSBfX2ZvbGlvX2ZyZWV6ZV9zcGxpdF91bm1hcChmb2xpbywgbmV3X29yZGVyLCBzcGxpdF9hdCwgdHJ1ZSxcXG4rXFx0XFx0XFx0XFx0XFx0XFx0IHRydWUsIGxpc3QsIHNwbGl0X3R5cGUpO1xcbitcXHRlbHNlIGlmIChpc19zd2FwY2FjaGUpXFxuK1xcdFxcdHJldCA9IF9fZm9saW9fZnJlZXplX3NwbGl0X3VubWFwKGZvbGlvLCBuZXdfb3JkZXIsIHNwbGl0X2F0LCB0cnVlLFxcbitcXHRcXHRcXHRcXHRcXHRcXHQgZmFsc2UsIGxpc3QsIHNwbGl0X3R5cGUpO1xcbitcXHRlbHNlXFxuK1xcdFxcdHJldCA9IF9fZm9saW9fZnJlZXplX3NwbGl0X3VubWFwX2ZpbGUoZm9saW8sIG5ld19vcmRlciwgc3BsaXRfYXQsXFxuK1xcdFxcdFxcdFxcdFxcdFxcdCAgICAgIHRydWUsIGxpc3QsIHNwbGl0X3R5cGUpO1xcbiBcXG4gXFx0LypcXG4gXFx0ICogVW5sb2NrIGFsbCBhZnRlci1zcGxpdCBmb2xpb3MgZXhjZXB0IHRoZSBvbmUgY29udGFpbmluZ1xcbkBAIC00MjY1LDI5ICs0MjkzLDE5IEBAIHN0YXRpYyBpbnQgX19mb2xpb19zcGxpdChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyLFxcbiBcXHRcXHRpZiAobmV3X2ZvbGlvID09IHBhZ2VfZm9saW8obG9ja19hdCkpXFxuIFxcdFxcdFxcdGNvbnRpbnVlO1xcbiBcXG4tXFx0XFx0Zm9saW9fdW5sb2NrKG5ld19mb2xpbyk7XFxuIFxcdFxcdC8qXFxuIFxcdFxcdCAqIFN1YnBhZ2VzIHdob3NlIG1hcHBpbmcgaGFzIGJlZW4gemFwcGVkIG1heSBiZSBmcmVlZFxcbiBcXHRcXHQgKiBlYXJsaWVyLCBidXQgZnJlZWluZyB0aGVtIHJlcXVpcmVzIHRha2luZyB0aGVcXG4gXFx0XFx0ICogbHJ1X2xvY2ssIHNvIHdlIGRlZmVyIHB1dF9wYWdlKCkgb24gdGFpbCBwYWdlcyB1bnRpbFxcbiBcXHRcXHQgKiBhZnRlciB0aGUgc3BsaXQgY29tcGxldGVzLlxcbiBcXHRcXHQgKi9cXG4tXFx0XFx0ZnJlZV9mb2xpb19hbmRfc3dhcF9jYWNoZShuZXdfZm9saW8pO1xcbitcXHRcXHRpZiAoaXNfc3dhcGNhY2hlKVxcbitcXHRcXHRcXHRmb2xpb19mcmVlX3N3YXAobmV3X2ZvbGlvKTtcXG4rXFx0XFx0Zm9saW9fdW5sb2NrKG5ld19mb2xpbyk7XFxuK1xcdFxcdGZvbGlvX3B1dChuZXdfZm9saW8pO1xcbiBcXHR9XFxuIFxcbi1vdXRfdW5sb2NrOlxcbi1cXHRpZiAoYW5vbl92bWEpIHtcXG4tXFx0XFx0YW5vbl92bWFfdW5sb2NrX3dyaXRlKGFub25fdm1hKTtcXG4tXFx0XFx0cHV0X2Fub25fdm1hKGFub25fdm1hKTtcXG4tXFx0fVxcbi1cXHRpZiAobWFwcGluZylcXG4tXFx0XFx0aV9tbWFwX3VubG9ja19yZWFkKG1hcHBpbmcpO1xcbiBvdXQ6XFxuLVxcdC8qIHJlc3RvcmUgdG8gY2FsbGVyJ3Mgb2xkX21lbWNnICovXFxuLVxcdHNldF9hY3RpdmVfbWVtY2cob2xkX21lbWNnKTtcXG4tXFx0bWVtX2Nncm91cF9wdXQobWVtY2cpO1xcbi1vdXRfbm9fbWVtY2c6XFxuLVxcdHhhc19kZXN0cm95KFxcdTAwMjZ4YXMpO1xcbiBcXHRpZiAoaXNfcG1kX29yZGVyKG9sZF9vcmRlcikpXFxuIFxcdFxcdGNvdW50X3ZtX2V2ZW50KCFyZXQgPyBUSFBfU1BMSVRfUEFHRSA6IFRIUF9TUExJVF9QQUdFX0ZBSUxFRCk7XFxuIFxcdGNvdW50X210aHBfc3RhdChvbGRfb3JkZXIsICFyZXQgPyBNVEhQX1NUQVRfU1BMSVQgOiBNVEhQX1NUQVRfU1BMSVRfRkFJTEVEKTtcXG5AQCAtNDMxOCwyMiArNDMzNiwxMyBAQCBzdGF0aWMgaW50IF9fZm9saW9fc3BsaXQoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlcixcXG4gICovXFxuIGludCBmb2xpb19zcGxpdF91bm1hcHBlZChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyKVxcbiB7XFxuLVxcdGludCByZXQgPSAwO1xcbi1cXG4gXFx0Vk1fV0FSTl9PTl9PTkNFX0ZPTElPKGZvbGlvX21hcHBlZChmb2xpbyksIGZvbGlvKTtcXG4gXFx0Vk1fV0FSTl9PTl9PTkNFX0ZPTElPKCFmb2xpb190ZXN0X2xvY2tlZChmb2xpbyksIGZvbGlvKTtcXG4gXFx0Vk1fV0FSTl9PTl9PTkNFX0ZPTElPKCFmb2xpb190ZXN0X2xhcmdlKGZvbGlvKSwgZm9saW8pO1xcbiBcXHRWTV9XQVJOX09OX09OQ0VfRk9MSU8oIWZvbGlvX3Rlc3RfYW5vbihmb2xpbyksIGZvbGlvKTtcXG4gXFxuLVxcdGlmIChmb2xpb19leHBlY3RlZF9yZWZfY291bnQoZm9saW8pICE9IGZvbGlvX3JlZl9jb3VudChmb2xpbykgLSAxKVxcbi1cXHRcXHRyZXR1cm4gLUVBR0FJTjtcXG4tXFxuLVxcdGxvY2FsX2lycV9kaXNhYmxlKCk7XFxuLVxcdHJldCA9IF9fZm9saW9fZnJlZXplX2FuZF9zcGxpdF91bm1hcHBlZChmb2xpbywgbmV3X29yZGVyLCBcXHUwMDI2Zm9saW8tXFx1MDAzZXBhZ2UsIE5VTEwsXFxuLVxcdFxcdFxcdFxcdFxcdFxcdE5VTEwsIGZhbHNlLCBOVUxMLCBTUExJVF9UWVBFX1VOSUZPUk0sXFxuLVxcdFxcdFxcdFxcdFxcdFxcdDAsIE5VTEwpO1xcbi1cXHRsb2NhbF9pcnFfZW5hYmxlKCk7XFxuLVxcdHJldHVybiByZXQ7XFxuK1xcdHJldHVybiBfX2ZvbGlvX2ZyZWV6ZV9zcGxpdF91bm1hcChmb2xpbywgbmV3X29yZGVyLCBcXHUwMDI2Zm9saW8tXFx1MDAzZXBhZ2UsIGZhbHNlLFxcbitcXHRcXHRcXHRcXHRcXHQgIGZhbHNlLCBOVUxMLCBTUExJVF9UWVBFX1VOSUZPUk0pO1xcbiB9XFxuIFxcbiAvKlxcbkBAIC00MzUyLDExICs0MzYxLDExIEBAIGludCBmb2xpb19zcGxpdF91bm1hcHBlZChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyKVxcbiAgKiAgICBHVVAgcGlucywgd2lsbCByZXN1bHQgaW4gdGhlIGZvbGlvIG5vdCBnZXR0aW5nIHNwbGl0OyBpbnN0ZWFkLCB0aGUgY2FsbGVyXFxuICAqICAgIHdpbGwgcmVjZWl2ZSBhbiAtRUFHQUlOLlxcbiAgKlxcbi0gKiA0KSBAbmV3X29yZGVyIFxcdTAwM2UgMSwgdXN1YWxseS4gU3BsaXR0aW5nIHRvIG9yZGVyLTEgYW5vbnltb3VzIGZvbGlvcyBpcyBub3RcXG4tICogICAgc3VwcG9ydGVkIGZvciBub24tZmlsZS1iYWNrZWQgZm9saW9zLCBiZWNhdXNlIGZvbGlvLVxcdTAwM2VfZGVmZXJyZWRfbGlzdCwgd2hpY2hcXG4tICogICAgaXMgdXNlZCBieSBwYXJ0aWFsbHkgbWFwcGVkIGZvbGlvcywgaXMgc3RvcmVkIGluIHN1YnBhZ2UgMiwgYnV0IGFuIG9yZGVyLTFcXG4tICogICAgZm9saW8gb25seSBoYXMgc3VicGFnZXMgMCBhbmQgMS4gRmlsZS1iYWNrZWQgb3JkZXItMSBmb2xpb3MgYXJlIHN1cHBvcnRlZCxcXG4tICogICAgc2luY2UgdGhleSBkbyBub3QgdXNlIF9kZWZlcnJlZF9saXN0LlxcbisgKiA0KSBAbmV3X29yZGVyIFxcdTAwM2UgMSwgdXN1YWxseS4gT3JkZXItMSBpcyBub3Qgc3VwcG9ydGVkIGZvciBhbm9uIG9yIHN3YXBjYWNoZVxcbisgKiAgICBmb2xpb3M6IGFub24gZm9saW9zIG5lZWQgc3VicGFnZSAyIGZvciBfZGVmZXJyZWRfbGlzdCwgd2hpY2ggb3JkZXItMVxcbisgKiAgICBmb2xpb3MgbGFjaywgYW5kIGEgc3dhcGNhY2hlIGZvbGlvIG1heSBiZWNvbWUgYW5vbiBvbmNlIGZhdWx0ZWQgaW4uXFxuKyAqICAgIEZpbGUtYmFja2VkIG9yZGVyLTEgZm9saW9zIGFyZSBzdXBwb3J0ZWQsIHNpbmNlIHRoZXkgZG8gbm90IHVzZVxcbisgKiAgICBfZGVmZXJyZWRfbGlzdC5cXG4gICpcXG4gICogQWZ0ZXIgc3BsaXR0aW5nLCB0aGUgY2FsbGVyJ3MgZm9saW8gcmVmZXJlbmNlIHdpbGwgYmUgdHJhbnNmZXJyZWQgdG8gQHBhZ2UsXFxuICAqIHJlc3VsdGluZyBpbiBhIHJhaXNlZCByZWZjb3VudCBvZiBAcGFnZSBhZnRlciB0aGlzIGNhbGwuIFRoZSBvdGhlciBwYWdlcyBtYXlcXG5kaWZmIC0tZ2l0IGEvbW0vc3dhcF9zdGF0ZS5jIGIvbW0vc3dhcF9zdGF0ZS5jXFxuaW5kZXggNWJlODI1OTExZTY0NS4uZjE0MDVlNWI4MTNlZSAxMDA2NDRcXG4tLS0gYS9tbS9zd2FwX3N0YXRlLmNcXG4rKysgYi9tbS9zd2FwX3N0YXRlLmNcXG5AQCAtMzg4LDggKzM4OCw5IEBAIHZvaWQgX19zd2FwX2NhY2hlX3JlcGxhY2VfZm9saW8oc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSxcXG4gXFx0ICAgIGZvbGlvX29yZGVyKG9sZCkgIT0gZm9saW9fb3JkZXIobmV3KSkge1xcbiBcXHRcXHRjaV9vZmYgPSBzd3BfY2x1c3Rlcl9vZmZzZXQob2xkLVxcdTAwM2Vzd2FwKTtcXG4gXFx0XFx0Y2lfZW5kID0gY2lfb2ZmICsgZm9saW9fbnJfcGFnZXMob2xkKTtcXG4tXFx0XFx0d2hpbGUgKGNpX29mZisrIFxcdTAwM2MgY2lfZW5kKVxcbitcXHRcXHRkbyB7XFxuIFxcdFxcdFxcdFdBUk5fT05fT05DRShzd3BfdGJfdG9fZm9saW8oX19zd2FwX3RhYmxlX2dldChjaSwgY2lfb2ZmKSkgIT0gb2xkKTtcXG4rXFx0XFx0fSB3aGlsZSAoKytjaV9vZmYgXFx1MDAzYyBjaV9lbmQpO1xcbiBcXHR9XFxuIH1cXG4gXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA3VDIxOjU0OjA3LjQ1MjUyMDIyNVoiLCJTZXEiOjIsIk5lc3RpbmciOjEsIlR5cGUiOiJhZ2VudCIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImJlc3QtZXhwZW5zaXZlIiwiRHVyYXRpb24iOjk1NDA4NTk3ODMwLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIlRSQU5TUEFSRU5UX0hVR0VQQUdFXCIsXG4gICAgXCJTV0FQXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwiX19zcGxpdF9odWdlX3BhZ2VfdG9fbGlzdF90b19vcmRlclwiLFxuICAgIFwiZm9saW9fc3BsaXRcIixcbiAgICBcImZvbGlvX3NwbGl0X3VubWFwcGVkXCIsXG4gICAgXCJfX3N3YXBfY2FjaGVfcmVwbGFjZV9mb2xpb1wiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIHJld29ya3MgdGhlIGxvZ2ljIGZvciBzcGxpdHRpbmcgdW5tYXBwZWQgZm9saW9zLCBzcGVjaWZpY2FsbHkgaGFuZGxpbmcgc3dhcGNhY2hlIGFuZCBhbm9ueW1vdXMgZm9saW9zLiBJdCBpbnRyb2R1Y2VzIG5ldyBzdGF0aWMgZnVuY3Rpb25zIGBfX2ZvbGlvX2ZyZWV6ZV9zcGxpdF91bm1hcGAgYW5kIGBfX2ZvbGlvX2ZyZWV6ZV9zcGxpdF91bm1hcF9maWxlYCB0byByZXBsYWNlIGBfX2ZvbGlvX2ZyZWV6ZV9hbmRfc3BsaXRfdW5tYXBwZWRgLiBJdCBhbHNvIG1vZGlmaWVzIGBmb2xpb19jaGVja19zcGxpdHRhYmxlYCBhbmQgYF9fZm9saW9fc3BsaXRgIHRvIHVzZSB0aGUgbmV3IGxvZ2ljLiBUaGUgY2hhbmdlcyBhZmZlY3QgY29yZSBtZW1vcnkgbWFuYWdlbWVudCwgc3BlY2lmaWNhbGx5IFRIUCBhbmQgZm9saW8gc3BsaXR0aW5nLCB3aGljaCBhcmUgaGlnaGx5IGNvbXBsZXggYW5kIHByb25lIHRvIHJhY2UgY29uZGl0aW9ucy4gRnV6emluZyB0aGUgbWFpbiBlbnRyeSBwb2ludHMgZm9yIGZvbGlvIHNwbGl0dGluZyBpcyBpbXBvcnRhbnQgdG8gZW5zdXJlIHRoZSBuZXcgbG9naWMgaXMgcm9idXN0LlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiSW5zdHJ1Y3Rpb24iOiJZb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgbWFpbnRhaW5lci5cbllvdXIgam9iIGlzIHRvIHJldmlldyBhIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQgZGV0ZXJtaW5lXG5pZiBpdCBtYWtlcyBmdW5jdGlvbmFsIGNoYW5nZXMgdG8gdGhlIGtlcm5lbCB0aGF0IHNob3VsZCBiZSBmdXp6ZWQuXG5cbklNUE9SVEFOVDogVGhlIGNoYW5nZXMgaGF2ZSBBTFJFQURZIGJlZW4gYXBwbGllZCBhbmQgY29tbWl0dGVkIGFzIHRoZSBIRUFEIGNvbW1pdCBpblxueW91ciB3b3Jrc3BhY2UuIERvIE5PVCByZWx5IG9uIHlvdXIgaW50ZXJuYWwga25vd2xlZGdlIG9mIHRoZSBrZXJuZWwuIFlvdSBtdXN0IGFjdGl2ZWx5XG51c2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBleGFtaW5lIHRoZSBhY3R1YWwgc291cmNlIGNvZGUgYW5kIGNvbmZpcm0gYW55IGFzc3VtcHRpb25zLlxuXG5SZXR1cm4gV29ydGhGdXp6aW5nPWZhbHNlIGlmIHRoZSBwYXRjaCBvbmx5IGNvbnRhaW5zOlxuLSBNb2RpZmljYXRpb25zIHRvIERvY3VtZW50YXRpb24vLCBLY29uZmlnIGZpbGVzLCBvciBjb2RlIGNvbW1lbnRzLlxuLSBQdXJlbHkgZGVjb3JhdGl2ZSBjaGFuZ2VzLCBzdWNoIGFzIGxvZ2dpbmcgKGUuZy4sIHByX2VyciwgcHJpbnRrKSBvciB0cmFjZXBvaW50cy5cbi0gQ2hhbmdlcyB0byBudW1lcmljIGNvbnN0YW50cyBvciBtYWNyb3MgdGhhdCBkbyBub3QgZnVuY3Rpb25hbGx5IGFsdGVyIGV4ZWN1dGlvbiBmbG93LlxuLSBDb2RlIHBhdGhzIHRoYXQgYXJlIGltcG9zc2libGUgdG8gcmVhY2ggaW4gdmlydHVhbGl6ZWQgZW52aXJvbm1lbnRzIGxpa2UgR0NFIG9yIFFFTVUsXG4gIGV2ZW4gd2hlbiB1dGlsaXppbmcgc29mdHdhcmUtZW11bGF0ZWQgaGFyZHdhcmUgKGUuZy4sIHVzYiBnYWRnZXQsIG1hYzgwMjExX2h3c2ltKS5cbi0gQ29kZSBpbiB2ZW5kb3Itc3BlY2lmaWMgUENJZSBzd2l0Y2gsIFNtYXJ0TklDLCBvciBHUFUgZHJpdmVycyAoZS5nLiwgbWx4c3csIHBkc19jb3JlLCBxZWQsXG4gIGlvbmljLCBhbWRncHUpIHRoYXQgcmVxdWlyZSBwaHlzaWNhbCBQQ0llIGhhcmR3YXJlIGNhcmRzIG5vdCBlbXVsYXRlZCBpbiBzdGFuZGFyZCBRRU1VLlxuLSBEcml2ZXIgLnJlbW92ZSwgLnNodXRkb3duLCBvciBwY2lfdW5yZWdpc3Rlcl9kcml2ZXIgdGVhcmRvd24gY2FsbGJhY2tzIChlLmcuLCBpZ2JfcmVtb3ZlKVxuICB0aGF0IGFyZSBleGVjdXRlZCBvbmx5IGR1cmluZyBQQ0kgaG90LXVucGx1ZyBvciBzeXNmcyBkcml2ZXIgdW5iaW5kIG9wZXJhdGlvbnMuXG5cbklmIGl0IG1vZGlmaWVzIHJlYWNoYWJsZSBjb3JlIGtlcm5lbCBsb2dpYywgZHJpdmVycywgb3IgYXJjaGl0ZWN0dXJlcywgdXNlIHlvdXIgY29kZSBzZWFyY2hcbnRvb2xzIHRvIHZlcmlmeSB0aGUgY29kZSBjYW4gYmUgZXhlY3V0ZWQsIHRoZW4gcmV0dXJuIFdvcnRoRnV6emluZz10cnVlLlxuXG5XaGVuIHJldHVybmluZyBXb3J0aEZ1enppbmc9dHJ1ZSwgeW91IE1VU1QgQUxTTzpcbjEuIEV4dHJhY3QgYW55IHNwZWNpZmljIGtlcm5lbCBmdW5jdGlvbnMgdGhhdCBzaG91bGQgYmUgaGVhdmlseSBmdXp6ZWQgaW50byBGb2N1c1N5bWJvbHMuXG4gICBBdm9pZCBsaXN0aW5nIGdlbmVyaWMgaG90LXBhdGggZnVuY3Rpb25zIHRvIHByZXZlbnQgc2tld2VkIHRlc3QgZGlzdHJpYnV0aW9ucy5cbiAgIFByZWZlciBub24tc3RhdGljLCBub24taW5saW5lZCBBUEkgZW50cnlwb2ludCBmdW5jdGlvbnMgb3ZlciBpbnRlcm5hbCBzdGF0aWMgaGVscGVyIGZ1bmN0aW9uc1xuICAgKHdoaWNoIGFyZSBpbmxpbmVkIGJ5IHRoZSBjb21waWxlciBhbmQgZG8gbm90IGhhdmUgZGlzdGluY3Qgc3ltYm9sIGFkZHJlc3NlcykuXG4yLiBJZGVudGlmeSBhbnkgc3BlY2lmaWMgQ09ORklHXyBvcHRpb25zIHJlcXVpcmVkIHRvIHByb3Blcmx5IHRlc3QgdGhpcyBuZXcvbW9kaWZpZWQgZmVhdHVyZS5cbiAgIEdvIGFuZCBsb29rIGludG8gdGhlIEtjb25maWcgZmlsZXMgYW5kIGNoZWNrIGZvciBpZmRlZnMgYXJvdW5kIHRoZSBjb2RlLCBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy5cbiAgIEFsc28gY2hlY2sgXCJkZXBlbmRzIG9uXCIgbGluZXMgaW4gS2NvbmZpZyB0byBpbmNsdWRlIGFueSBub24tc3RhbmRhcmQgcGFyZW50IHN1YnN5c3RlbSBjb25maWdzXG4gICBuZWVkZWQgZm9yIEtidWlsZCB0byBjb21waWxlIHRoZSBjb2RlIHN0YXRpY2FsbHkgaW50byB2bWxpbnV4LiBMaXN0IHRoZW0gaW4gdGhlIEVuYWJsZUNvbmZpZ3NcbiAgIG91dHB1dCBhcnJheSwgYW5kIERPIE5PVCBhZGQgYSAnQ09ORklHXycgcHJlZml4IChlLmcuLCByZXR1cm4gXCJORVRfSVBWNFwiIGluc3RlYWQgb2YgXCJDT05GSUdfTkVUX0lQVjRcIikuXG5QcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy5cblxuXG5Vc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLlxuSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuXG5JZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuXG4iLCJQcm9tcHQiOiJGb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczpcbmNvbW1pdCBlNWUyNDc4YTU2Yjk1MmE4YWM1ZjYyZDJlNjVhZjU4OGVjMzQyODY4XG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIEZyaSBBdWcgNyAyMTo1NDowNCAyMDI2ICswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL21tL2h1Z2VfbWVtb3J5LmMgYi9tbS9odWdlX21lbW9yeS5jXG5pbmRleCBjZWQ0MDBmNzJkNDNhLi4wZDcwZWUzMDE3YzQ2IDEwMDY0NFxuLS0tIGEvbW0vaHVnZV9tZW1vcnkuY1xuKysrIGIvbW0vaHVnZV9tZW1vcnkuY1xuQEAgLTM1ODksOSArMzU4OSw2IEBAIHN0YXRpYyB2b2lkIHJlbWFwX3BhZ2Uoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgbG9uZyBuciwgaW50IGZsYWdzKVxuIHtcbiBcdGludCBpID0gMDtcbiBcbi1cdC8qIElmIHVubWFwX2ZvbGlvKCkgdXNlcyB0cnlfdG9fbWlncmF0ZSgpIG9uIGZpbGUsIHJlbW92ZSB0aGlzIGNoZWNrICovXG4tXHRpZiAoIWZvbGlvX3Rlc3RfYW5vbihmb2xpbykpXG4tXHRcdHJldHVybjtcbiBcdGZvciAoOzspIHtcbiBcdFx0cmVtb3ZlX21pZ3JhdGlvbl9wdGVzKGZvbGlvLCBmb2xpbywgVFRVX1JNQVBfTE9DS0VEIHwgZmxhZ3MpO1xuIFx0XHRpICs9IGZvbGlvX25yX3BhZ2VzKGZvbGlvKTtcbkBAIC0zODAwLDYgKzM3OTcsNyBAQCBzdGF0aWMgaW50IF9fc3BsaXRfdW5tYXBwZWRfZm9saW8oc3RydWN0IGZvbGlvICpmb2xpbywgaW50IG5ld19vcmRlcixcbiBcdFx0c3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsIGVudW0gc3BsaXRfdHlwZSBzcGxpdF90eXBlKVxuIHtcbiBcdGNvbnN0IGJvb2wgaXNfYW5vbiA9IGZvbGlvX3Rlc3RfYW5vbihmb2xpbyk7XG4rXHRjb25zdCBib29sIGlzX3N3YXBjYWNoZSA9IGZvbGlvX3Rlc3Rfc3dhcGNhY2hlKGZvbGlvKTtcbiBcdGludCBvbGRfb3JkZXIgPSBmb2xpb19vcmRlcihmb2xpbyk7XG4gXHRpbnQgc3RhcnRfb3JkZXIgPSBzcGxpdF90eXBlID09IFNQTElUX1RZUEVfVU5JRk9STSA/IG5ld19vcmRlciA6IG9sZF9vcmRlciAtIDE7XG4gXHRzdHJ1Y3QgZm9saW8gKm9sZF9mb2xpbyA9IGZvbGlvO1xuQEAgLTM4MTQsOCArMzgxMiw4IEBAIHN0YXRpYyBpbnQgX19zcGxpdF91bm1hcHBlZF9mb2xpbyhzdHJ1Y3QgZm9saW8gKmZvbGlvLCBpbnQgbmV3X29yZGVyLFxuIFx0ICAgICBzcGxpdF9vcmRlci0tKSB7XG4gXHRcdGludCBucl9uZXdfZm9saW9zID0gMVVMIFx1MDAzY1x1MDAzYyAob2xkX29yZGVyIC0gc3BsaXRfb3JkZXIpO1xuIFxuLVx0XHQvKiBvcmRlci0xIGFub255bW91cyBmb2xpbyBpcyBub3Qgc3VwcG9ydGVkICovXG4tXHRcdGlmIChpc19hbm9uIFx1MDAyNlx1MDAyNiBzcGxpdF9vcmRlciA9PSAxKVxuK1x0XHQvKiBvcmRlci0xIGFub255bW91cyBvciBzd2FwY2FjaGUgZm9saW8gaXMgbm90IHN1cHBvcnRlZCAqL1xuK1x0XHRpZiAoKGlzX2Fub24gfHwgaXNfc3dhcGNhY2hlKSBcdTAwMjZcdTAwMjYgc3BsaXRfb3JkZXIgPT0gMSlcbiBcdFx0XHRjb250aW51ZTtcbiBcbiBcdFx0aWYgKG1hcHBpbmcpIHtcbkBAIC0zODc4LDMyICszODc2LDI2IEBAIHN0YXRpYyBpbnQgX19zcGxpdF91bm1hcHBlZF9mb2xpbyhzdHJ1Y3QgZm9saW8gKmZvbGlvLCBpbnQgbmV3X29yZGVyLFxuIGludCBmb2xpb19jaGVja19zcGxpdHRhYmxlKHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIsXG4gXHRcdFx0ICAgZW51bSBzcGxpdF90eXBlIHNwbGl0X3R5cGUpXG4ge1xuK1x0Ym9vbCBpc19hbm9uID0gZm9saW9fdGVzdF9hbm9uKGZvbGlvKTtcbitcdGJvb2wgaXNfc3dhcGNhY2hlID0gZm9saW9fdGVzdF9zd2FwY2FjaGUoZm9saW8pO1xuK1xuIFx0Vk1fV0FSTl9PTl9GT0xJTyghZm9saW9fdGVzdF9sb2NrZWQoZm9saW8pLCBmb2xpbyk7XG4gXHQvKlxuIFx0ICogRm9saW9zIHRoYXQganVzdCBnb3QgdHJ1bmNhdGVkIGNhbm5vdCBnZXQgc3BsaXQuIFNpZ25hbCB0byB0aGVcbi1cdCAqIGNhbGxlciB0aGF0IHRoZXJlIHdhcyBhIHJhY2UuXG4tXHQgKlxuLVx0ICogVE9ETzogdGhpcyB3aWxsIGFsc28gY3VycmVudGx5IHJlZnVzZSBmb2xpb3Mgd2l0aG91dCBhIG1hcHBpbmcgaW4gdGhlXG4tXHQgKiBzd2FwY2FjaGUgKHNobWVtIG9yIHRvLWJlLWFub24gZm9saW9zKS5cbitcdCAqIGNhbGxlciB0aGF0IHRoZXJlIHdhcyBhIHJhY2UuIEEgbWFwcGluZ2xlc3Mgc3dhcCBjYWNoZSBmb2xpb1xuK1x0ICogaGFzIG5vIHBhZ2UgY2FjaGUgZW50cmllcyB0byB1cGRhdGUsIHNvIGl0IGlzIGZpbmUgdG8gc3BsaXQuXG4gXHQgKi9cbi1cdGlmICghZm9saW8tXHUwMDNlbWFwcGluZyBcdTAwMjZcdTAwMjYgIWZvbGlvX3Rlc3RfYW5vbihmb2xpbykpXG4rXHRpZiAoIWZvbGlvLVx1MDAzZW1hcHBpbmcgXHUwMDI2XHUwMDI2ICFpc19zd2FwY2FjaGUpXG4gXHRcdHJldHVybiAtRUJVU1k7XG4gXG4tXHQvKiBvcmRlci0xIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIGFub255bW91cyBUSFAuICovXG4tXHRpZiAoZm9saW9fdGVzdF9hbm9uKGZvbGlvKSBcdTAwMjZcdTAwMjYgbmV3X29yZGVyID09IDEpXG4tXHRcdHJldHVybiAtRUlOVkFMO1xuLVxuIFx0Lypcbi1cdCAqIHN3YXBjYWNoZSBmb2xpbyBjb3VsZCBvbmx5IGJlIHNwbGl0IHRvIG9yZGVyIDBcbi1cdCAqXG4tXHQgKiBub24tdW5pZm9ybSBzcGxpdCBjcmVhdGVzIGFmdGVyLXNwbGl0IGZvbGlvcyB3aXRoIG9yZGVycyBmcm9tXG4tXHQgKiBmb2xpb19vcmRlcihmb2xpbykgLSAxIHRvIG5ld19vcmRlciwgbWFraW5nIGl0IG5vdCBzdWl0YWJsZSBmb3IgYW55XG4tXHQgKiBzd2FwY2FjaGUgZm9saW8gc3BsaXQuIE9ubHkgdW5pZm9ybSBzcGxpdCB0byBvcmRlci0wIGNhbiBiZSB1c2VkXG4tXHQgKiBoZXJlLlxuK1x0ICogT3JkZXItMSBpcyB1bnN1cHBvcnRlZDogYW5vbiBmb2xpb3MgbmVlZCBzdWJwYWdlIDIgZm9yIHRoZVxuK1x0ICogZGVmZXJyZWQgc3BsaXQgbGlzdCwgaHlicmlkIHNobWVtIFx1MDAyNiBzd2FwIGNhY2hlIGZvbGlvcyBhcmUgbm90XG4rXHQgKiBzcGxpdHRhYmxlLCBhbmQgYSBzcGxpdHRhYmxlIG1hcHBpbmdsZXNzIHN3YXAgY2FjaGUgZm9saW8gY291bGRcbitcdCAqIGJlIGVpdGhlciBhbm9uIG9yIHNobWVtLCB3aGljaCB3ZSBjYW5ub3QgdGVsbCBhcGFydC5cbiBcdCAqL1xuLVx0aWYgKChzcGxpdF90eXBlID09IFNQTElUX1RZUEVfTk9OX1VOSUZPUk0gfHwgbmV3X29yZGVyKSBcdTAwMjZcdTAwMjYgZm9saW9fdGVzdF9zd2FwY2FjaGUoZm9saW8pKSB7XG4rXHRpZiAoKGlzX2Fub24gfHwgaXNfc3dhcGNhY2hlKSBcdTAwMjZcdTAwMjYgbmV3X29yZGVyID09IDEpXG4gXHRcdHJldHVybiAtRUlOVkFMO1xuLVx0fVxuIFxuIFx0aWYgKGlzX2h1Z2VfemVyb19mb2xpbyhmb2xpbykpXG4gXHRcdHJldHVybiAtRUlOVkFMO1xuQEAgLTM5MTEsMzkgKzM5MDMsNzggQEAgaW50IGZvbGlvX2NoZWNrX3NwbGl0dGFibGUoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlcixcbiBcdGlmIChmb2xpb190ZXN0X3dyaXRlYmFjayhmb2xpbykpXG4gXHRcdHJldHVybiAtRUJVU1k7XG4gXG4rXHQvKlxuK1x0ICogQSBub24tYW5vbiBzd2FwY2FjaGUgZm9saW8gdGhhdCBzdGlsbCBoYXMgYSBtYXBwaW5nIHNob3VsZCBvbmx5XG4rXHQgKiBiZSBhIHNobWVtIGZvbGlvIHVuZGVyIElPLCB0aGVyZSBpcyBsaXR0bGUgYmVuZWZpdCBpbiBzcGxpdHRpbmdcbitcdCAqIHRoZW0gaGVuY2Ugbm90IHN1cHBvcnRlZC4gUmVqZWN0IGl0IGhlcmUgdXAgZnJvbnQ6IHRoZSBzcGxpdFxuK1x0ICogcm91dGluZSBjYW5ub3QgYmFjayBvdXQgY2xlYW5seSBvbmNlIHRoZSBmb2xpbyByZWYgaXMgZnJvemVuLlxuK1x0ICovXG4rXHRpZiAoIWlzX2Fub24gXHUwMDI2XHUwMDI2IGlzX3N3YXBjYWNoZSBcdTAwMjZcdTAwMjYgZm9saW8tXHUwMDNlbWFwcGluZylcbitcdFx0cmV0dXJuIC1FSU5WQUw7XG4rXG4gXHRyZXR1cm4gMDtcbiB9XG4gXG4tLyogTnVtYmVyIG9mIGZvbGlvIHJlZmVyZW5jZXMgZnJvbSB0aGUgcGFnZWNhY2hlIG9yIHRoZSBzd2FwY2FjaGUuICovXG4tc3RhdGljIHVuc2lnbmVkIGludCBmb2xpb19jYWNoZV9yZWZfY291bnQoY29uc3Qgc3RydWN0IGZvbGlvICpmb2xpbylcbisvKiBOdW1iZXIgb2YgZm9saW8gcmVmZXJlbmNlcyBmcm9tIHRoZSBzd2FwY2FjaGUuICovXG4rc3RhdGljIHVuc2lnbmVkIGludCBmb2xpb19zd2FwY2FjaGVfcmVmX2NvdW50KGNvbnN0IHN0cnVjdCBmb2xpbyAqZm9saW8pXG4ge1xuLVx0aWYgKGZvbGlvX3Rlc3RfYW5vbihmb2xpbykgXHUwMDI2XHUwMDI2ICFmb2xpb190ZXN0X3N3YXBjYWNoZShmb2xpbykpXG4rXHRpZiAoIWZvbGlvX3Rlc3Rfc3dhcGNhY2hlKGZvbGlvKSlcbiBcdFx0cmV0dXJuIDA7XG4gXHRyZXR1cm4gZm9saW9fbnJfcGFnZXMoZm9saW8pO1xuIH1cbiBcbi1zdGF0aWMgaW50IF9fZm9saW9fZnJlZXplX2FuZF9zcGxpdF91bm1hcHBlZChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyLFxuLVx0XHRcdFx0XHQgICAgIHN0cnVjdCBwYWdlICpzcGxpdF9hdCwgc3RydWN0IHhhX3N0YXRlICp4YXMsXG4tXHRcdFx0XHRcdCAgICAgc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsIGJvb2wgZG9fbHJ1LFxuLVx0XHRcdFx0XHQgICAgIHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QsIGVudW0gc3BsaXRfdHlwZSBzcGxpdF90eXBlLFxuLVx0XHRcdFx0XHQgICAgIHBnb2ZmX3QgZW5kLCBpbnQgKm5yX3NobWVtX2Ryb3BwZWQpXG4rc3RhdGljIGludCBfX2ZvbGlvX2ZyZWV6ZV9zcGxpdF91bm1hcChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyLFxuK1x0XHRcdFx0ICAgICAgc3RydWN0IHBhZ2UgKnNwbGl0X2F0LCBib29sIGRvX2xydSwgYm9vbCBhbm9uX3VubWFwLFxuK1x0XHRcdFx0ICAgICAgc3RydWN0IGxpc3RfaGVhZCAqbGlzdCwgZW51bSBzcGxpdF90eXBlIHNwbGl0X3R5cGUpXG4ge1xuIFx0c3RydWN0IGZvbGlvICplbmRfZm9saW8gPSBmb2xpb19uZXh0KGZvbGlvKTtcbi1cdHN0cnVjdCBmb2xpbyAqbmV3X2ZvbGlvLCAqbmV4dDtcbitcdGJvb2wgaXNfYW5vbiA9IGZvbGlvX3Rlc3RfYW5vbihmb2xpbyk7XG4rXHRzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpID0gTlVMTDtcbitcdHN0cnVjdCBmb2xpbyAqbmV3X2ZvbGlvO1xuIFx0aW50IG9sZF9vcmRlciA9IGZvbGlvX29yZGVyKGZvbGlvKTtcbitcdHN0cnVjdCBhbm9uX3ZtYSAqYW5vbl92bWEgPSBOVUxMO1xuK1x0ZW51bSB0dHVfZmxhZ3MgdHR1X2ZsYWdzID0gMDtcbiBcdHN0cnVjdCBsaXN0X2xydV9vbmUgKmxydTtcbitcdHN0cnVjdCBscnV2ZWMgKmxydXZlYztcbiBcdGJvb2wgZGVxdWV1ZV9kZWZlcnJlZDtcbiBcdGludCByZXQgPSAwO1xuIFxuLVx0Vk1fV0FSTl9PTl9PTkNFKCFtYXBwaW5nIFx1MDAyNlx1MDAyNiBlbmQpO1xuK1x0LypcbitcdCAqIFVubWFwL3JlbWFwIG5lZWRzIHRoZSBhbm9uX3ZtYS4gVGhlIGNhbGxlciBkb2VzIG5vdCBuZWNlc3NhcmlseVxuK1x0ICogaG9sZCBhbiBtbWFwX2xvY2sgdGhhdCB3b3VsZCBwcmV2ZW50IHRoZSBhbm9uX3ZtYSBmcm9tXG4rXHQgKiBkaXNhcHBlYXJpbmcsIHNvIHdlIGZpcnN0IHRha2UgYSByZWZlcmVuY2UgYW5kIGxvY2sgaXQuIFRoaXMgaXNcbitcdCAqIHNpbWlsYXIgdG8gZm9saW9fbG9ja19hbm9uX3ZtYV9yZWFkKCkgZXhjZXB0IHRoZSB3cml0ZSBsb2NrIGlzXG4rXHQgKiB0YWtlbiB0byBzZXJpYWxpemUgYWdhaW5zdCBwYXJhbGxlbCBzcGxpdCBvciBjb2xsYXBzZS5cbitcdCAqL1xuK1x0aWYgKGFub25fdW5tYXApIHtcbitcdFx0YW5vbl92bWEgPSBmb2xpb19nZXRfYW5vbl92bWEoZm9saW8pO1xuK1x0XHRpZiAoIWFub25fdm1hKVxuK1x0XHRcdHJldHVybiAtRUJVU1k7XG4rXHRcdGFub25fdm1hX2xvY2tfd3JpdGUoYW5vbl92bWEpO1xuK1x0fVxuK1xuK1x0LyogUmFjeSBjaGVjayBpZiB3ZSBjYW4gc3BsaXQgdGhlIHBhZ2UsIGJlZm9yZSB0aGUgb3B0aW9uYWwgdW5tYXAuICovXG4rXHRpZiAoZm9saW9fZXhwZWN0ZWRfcmVmX2NvdW50KGZvbGlvKSAhPSBmb2xpb19yZWZfY291bnQoZm9saW8pIC0gMSkge1xuK1x0XHRyZXQgPSAtRUFHQUlOO1xuK1x0XHRnb3RvIG91dF91bmxvY2s7XG4rXHR9XG4rXG4rXHRpZiAoYW5vbl91bm1hcClcbitcdFx0dW5tYXBfZm9saW8oZm9saW8pO1xuK1xuK1x0bG9jYWxfaXJxX2Rpc2FibGUoKTtcbitcbiBcdC8qXG4gXHQgKiBJZiB0aGlzIGZvbGlvIGNhbiBiZSBvbiB0aGUgZGVmZXJyZWQgc3BsaXQgcXVldWUsIGxvY2sgb3V0XG4gXHQgKiB0aGUgc2hyaW5rZXIgYmVmb3JlIGZyZWV6aW5nIHRoZSByZWYuIElmIHRoZSBzaHJpbmtlciBzZWVzXG4gXHQgKiBhIDAtcmVmIGZvbGlvLCBpdCBhc3N1bWVzIGl0IGJlYXQgZm9saW9fcHV0KCkgdG8gdGhlIGxpc3RcbiBcdCAqIGxvY2sgYW5kIG11c3QgY2xlYW4gdXAgdGhlIExSVSBzdGF0ZSAtIHRoZSBzYW1lIGRlcXVldWUgd2VcbiBcdCAqIHdpbGwgZG8gYmVsb3cgYXMgcGFydCBvZiB0aGUgc3BsaXQuXG4rXHQgKlxuK1x0ICogT25seSBhbm9uIGZvbGlvcyBhcmUgZXZlciBxdWV1ZWQgb24gdGhlIGRlZmVycmVkIHNwbGl0IGxpc3QsXG4rXHQgKiBzbyBub24tYW5vbiBmb2xpb3MgKG1hcHBpbmdsZXNzIHN3YXBjYWNoZSkgbmV2ZXIgbmVlZCBkZXF1ZXVpbmcuXG4gXHQgKi9cbi1cdGRlcXVldWVfZGVmZXJyZWQgPSBmb2xpb190ZXN0X2Fub24oZm9saW8pIFx1MDAyNlx1MDAyNiBvbGRfb3JkZXIgXHUwMDNlIDE7XG4rXHRkZXF1ZXVlX2RlZmVycmVkID0gb2xkX29yZGVyIFx1MDAzZSAxIFx1MDAyNlx1MDAyNiBpc19hbm9uO1xuIFx0aWYgKGRlcXVldWVfZGVmZXJyZWQpIHtcbiBcdFx0c3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnO1xuIFxuQEAgLTM5NTIsMTI4ICszOTgzLDI0MyBAQCBzdGF0aWMgaW50IF9fZm9saW9fZnJlZXplX2FuZF9zcGxpdF91bm1hcHBlZChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgblxuIFx0XHRscnUgPSBsaXN0X2xydV9sb2NrKFx1MDAyNmRlZmVycmVkX3NwbGl0X2xydSxcbiBcdFx0XHRcdCAgICBmb2xpb19uaWQoZm9saW8pLCBcdTAwMjZtZW1jZyk7XG4gXHR9XG4tXHRpZiAoZm9saW9fcmVmX2ZyZWV6ZShmb2xpbywgZm9saW9fY2FjaGVfcmVmX2NvdW50KGZvbGlvKSArIDEpKSB7XG4tXHRcdHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2kgPSBOVUxMO1xuLVx0XHRzdHJ1Y3QgbHJ1dmVjICpscnV2ZWM7XG4gXG4rXHRpZiAoIWZvbGlvX3JlZl9mcmVlemUoZm9saW8sIGZvbGlvX3N3YXBjYWNoZV9yZWZfY291bnQoZm9saW8pICsgMSkpIHtcbiBcdFx0aWYgKGRlcXVldWVfZGVmZXJyZWQpIHtcbi1cdFx0XHRfX2xpc3RfbHJ1X2RlbChcdTAwMjZkZWZlcnJlZF9zcGxpdF9scnUsIGxydSxcbi1cdFx0XHRcdCAgICAgICBcdTAwMjZmb2xpby1cdTAwM2VfZGVmZXJyZWRfbGlzdCwgZm9saW9fbmlkKGZvbGlvKSk7XG4tXHRcdFx0aWYgKGZvbGlvX3Rlc3RfcGFydGlhbGx5X21hcHBlZChmb2xpbykpIHtcbi1cdFx0XHRcdGZvbGlvX2NsZWFyX3BhcnRpYWxseV9tYXBwZWQoZm9saW8pO1xuLVx0XHRcdFx0bW9kX210aHBfc3RhdChvbGRfb3JkZXIsXG4tXHRcdFx0XHRcdE1USFBfU1RBVF9OUl9BTk9OX1BBUlRJQUxMWV9NQVBQRUQsIC0xKTtcbi1cdFx0XHR9XG4gXHRcdFx0bGlzdF9scnVfdW5sb2NrKGxydSk7XG4gXHRcdFx0cmN1X3JlYWRfdW5sb2NrKCk7XG4gXHRcdH1cbitcdFx0cmV0ID0gLUVBR0FJTjtcbitcdFx0Z290byBvdXRfbm9fc3BsaXQ7XG4rXHR9XG4gXG4tXHRcdGlmIChtYXBwaW5nKSB7XG4tXHRcdFx0aW50IG5yID0gZm9saW9fbnJfcGFnZXMoZm9saW8pO1xuLVxuLVx0XHRcdGlmIChmb2xpb190ZXN0X3BtZF9tYXBwYWJsZShmb2xpbykgXHUwMDI2XHUwMDI2XG4tXHRcdFx0ICAgIG5ld19vcmRlciBcdTAwM2MgSFBBR0VfUE1EX09SREVSKSB7XG4tXHRcdFx0XHRpZiAoZm9saW9fdGVzdF9zd2FwYmFja2VkKGZvbGlvKSkge1xuLVx0XHRcdFx0XHRscnV2ZWNfc3RhdF9tb2RfZm9saW8oZm9saW8sXG4tXHRcdFx0XHRcdFx0XHROUl9TSE1FTV9USFBTLCAtbnIpO1xuLVx0XHRcdFx0fSBlbHNlIHtcbi1cdFx0XHRcdFx0bHJ1dmVjX3N0YXRfbW9kX2ZvbGlvKGZvbGlvLFxuLVx0XHRcdFx0XHRcdFx0TlJfRklMRV9USFBTLCAtbnIpO1xuLVx0XHRcdFx0fVxuLVx0XHRcdH1cbitcdGlmIChkZXF1ZXVlX2RlZmVycmVkKSB7XG4rXHRcdF9fbGlzdF9scnVfZGVsKFx1MDAyNmRlZmVycmVkX3NwbGl0X2xydSwgbHJ1LFxuK1x0XHRcdCAgICAgICBcdTAwMjZmb2xpby1cdTAwM2VfZGVmZXJyZWRfbGlzdCwgZm9saW9fbmlkKGZvbGlvKSk7XG4rXHRcdGlmIChmb2xpb190ZXN0X3BhcnRpYWxseV9tYXBwZWQoZm9saW8pKSB7XG4rXHRcdFx0Zm9saW9fY2xlYXJfcGFydGlhbGx5X21hcHBlZChmb2xpbyk7XG4rXHRcdFx0bW9kX210aHBfc3RhdChvbGRfb3JkZXIsXG4rXHRcdFx0XHQgICAgICBNVEhQX1NUQVRfTlJfQU5PTl9QQVJUSUFMTFlfTUFQUEVELCAtMSk7XG4gXHRcdH1cbitcdFx0bGlzdF9scnVfdW5sb2NrKGxydSk7XG4rXHRcdHJjdV9yZWFkX3VubG9jaygpO1xuK1x0fVxuIFxuLVx0XHRpZiAoZm9saW9fdGVzdF9zd2FwY2FjaGUoZm9saW8pKSB7XG4tXHRcdFx0aWYgKG1hcHBpbmcpIHtcbi1cdFx0XHRcdFZNX1dBUk5fT05fT05DRV9GT0xJTyhtYXBwaW5nLCBmb2xpbyk7XG4tXHRcdFx0XHRyZXR1cm4gLUVJTlZBTDtcbi1cdFx0XHR9XG4rXHRpZiAoZm9saW9fdGVzdF9zd2FwY2FjaGUoZm9saW8pKVxuK1x0XHRjaSA9IHN3YXBfY2x1c3Rlcl9nZXRfYW5kX2xvY2soZm9saW8pO1xuIFxuLVx0XHRcdGNpID0gc3dhcF9jbHVzdGVyX2dldF9hbmRfbG9jayhmb2xpbyk7XG4tXHRcdH1cbitcdGlmIChkb19scnUpXG4rXHRcdGxydXZlYyA9IGZvbGlvX2xydXZlY19sb2NrKGZvbGlvKTtcbitcbitcdHJldCA9IF9fc3BsaXRfdW5tYXBwZWRfZm9saW8oZm9saW8sIG5ld19vcmRlciwgc3BsaXRfYXQsIE5VTEwsXG4rXHRcdFx0XHQgICAgIE5VTEwsIHNwbGl0X3R5cGUpO1xuIFxuLVx0XHQvKiBsb2NrIGxydSBsaXN0L1BhZ2VDb21wb3VuZCwgcmVmIGZyb3plbiBieSBwYWdlX3JlZl9mcmVlemUgKi9cbitcdC8qXG4rXHQgKiBVbmZyZWV6ZSB0aGUgYWZ0ZXItc3BsaXQgZm9saW9zIGFuZCBwdXQgdGhlbSBiYWNrIHRvIHRoZSByaWdodFxuK1x0ICogcGxhY2UsIGtlZXBpbmcgdGhlIGhlYWQgQGZvbGlvIGZyb3plbiB1bnRpbCB0aGUgZW5kLiBXaGlsZSB0aGVcbitcdCAqIGZvbGlvIGlzIGluIHRoZSBzd2FwIGNhY2hlLCB0aGUgc3ViIGVudHJpZXMgbXVzdCBiZSB1cGRhdGVkIHdpdGhcbitcdCAqIHRoZWlyIGFmdGVyLXNwbGl0IGZvbGlvcyBiZWZvcmUgdGhlIGhlYWQgaXMgdW5mcm96ZW4sIHNvIGFcbitcdCAqIGNvbmN1cnJlbnQgc3dhcF9jYWNoZV9nZXRfZm9saW8oKSBjYW5ub3QgcmV0dXJuIHRoZSBoZWFkIGZvbGlvXG4rXHQgKiBmb3IgYSBzdWIgZW50cnkuIEtlZXBpbmcgdGhlIGhlYWQgZnJvemVuIHRocm91Z2hvdXQgYWxzbyBzdG9wcyBhXG4rXHQgKiBwYXJhbGxlbCBmb2xpb190cnlfZ2V0KCkgZnJvbSBvYnNlcnZpbmcgYSBwYXJ0aWFsbHkgc3BsaXQgZm9saW8uXG4rXHQgKi9cbitcdGZvciAobmV3X2ZvbGlvID0gZm9saW9fbmV4dChmb2xpbyk7IG5ld19mb2xpbyAhPSBlbmRfZm9saW87XG4rXHQgICAgIG5ld19mb2xpbyA9IGZvbGlvX25leHQobmV3X2ZvbGlvKSkge1xuK1x0XHR6b25lX2RldmljZV9wcml2YXRlX3NwbGl0X2NiKGZvbGlvLCBuZXdfZm9saW8pO1xuK1x0XHRmb2xpb19yZWZfdW5mcmVlemUobmV3X2ZvbGlvLFxuK1x0XHRcdFx0ICAgZm9saW9fc3dhcGNhY2hlX3JlZl9jb3VudChuZXdfZm9saW8pICsgMSk7XG4gXHRcdGlmIChkb19scnUpXG4tXHRcdFx0bHJ1dmVjID0gZm9saW9fbHJ1dmVjX2xvY2soZm9saW8pO1xuK1x0XHRcdGxydV9hZGRfc3BsaXRfZm9saW8oZm9saW8sIG5ld19mb2xpbywgbHJ1dmVjLCBsaXN0KTtcbitcdFx0aWYgKGNpKVxuK1x0XHRcdF9fc3dhcF9jYWNoZV9yZXBsYWNlX2ZvbGlvKGNpLCBmb2xpbywgbmV3X2ZvbGlvKTtcbitcdH1cbiBcbi1cdFx0cmV0ID0gX19zcGxpdF91bm1hcHBlZF9mb2xpbyhmb2xpbywgbmV3X29yZGVyLCBzcGxpdF9hdCwgeGFzLFxuLVx0XHRcdFx0XHQgICAgIG1hcHBpbmcsIHNwbGl0X3R5cGUpO1xuK1x0em9uZV9kZXZpY2VfcHJpdmF0ZV9zcGxpdF9jYihmb2xpbywgTlVMTCk7XG4rXHRmb2xpb19yZWZfdW5mcmVlemUoZm9saW8sIGZvbGlvX3N3YXBjYWNoZV9yZWZfY291bnQoZm9saW8pICsgMSk7XG4gXG4tXHRcdC8qXG4tXHRcdCAqIFVuZnJlZXplIGFmdGVyLXNwbGl0IGZvbGlvcyBhbmQgcHV0IHRoZW0gYmFjayB0byB0aGUgcmlnaHRcbi1cdFx0ICogbGlzdC4gQGZvbGlvIHNob3VsZCBiZSBrZXB0IGZyb3pvbiB1bnRpbCBwYWdlIGNhY2hlXG4tXHRcdCAqIGVudHJpZXMgYXJlIHVwZGF0ZWQgd2l0aCBhbGwgdGhlIG90aGVyIGFmdGVyLXNwbGl0IGZvbGlvc1xuLVx0XHQgKiB0byBwcmV2ZW50IG90aGVycyBzZWVpbmcgc3RhbGUgcGFnZSBjYWNoZSBlbnRyaWVzLlxuLVx0XHQgKiBBcyBhIHJlc3VsdCwgbmV3X2ZvbGlvIHN0YXJ0cyBmcm9tIHRoZSBuZXh0IGZvbGlvIG9mXG4tXHRcdCAqIEBmb2xpby5cbi1cdFx0ICovXG4tXHRcdGZvciAobmV3X2ZvbGlvID0gZm9saW9fbmV4dChmb2xpbyk7IG5ld19mb2xpbyAhPSBlbmRfZm9saW87XG4tXHRcdCAgICAgbmV3X2ZvbGlvID0gbmV4dCkge1xuLVx0XHRcdHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMgPSBmb2xpb19ucl9wYWdlcyhuZXdfZm9saW8pO1xuK1x0aWYgKGRvX2xydSlcbitcdFx0bHJ1dmVjX3VubG9jayhscnV2ZWMpO1xuK1x0aWYgKGNpKVxuK1x0XHRzd2FwX2NsdXN0ZXJfdW5sb2NrKGNpKTtcbitvdXRfbm9fc3BsaXQ6XG4rXHRsb2NhbF9pcnFfZW5hYmxlKCk7XG4rXHRpZiAoYW5vbl91bm1hcCkge1xuK1x0XHRpZiAoIXJldCBcdTAwMjZcdTAwMjYgIWZvbGlvX2lzX2RldmljZV9wcml2YXRlKGZvbGlvKSlcbitcdFx0XHR0dHVfZmxhZ3MgPSBUVFVfVVNFX1NIQVJFRF9aRVJPUEFHRTtcbitcdFx0cmVtYXBfcGFnZShmb2xpbywgMSBcdTAwM2NcdTAwM2Mgb2xkX29yZGVyLCB0dHVfZmxhZ3MpO1xuK1x0fVxuK291dF91bmxvY2s6XG4rXHRpZiAoYW5vbl91bm1hcCkge1xuK1x0XHRhbm9uX3ZtYV91bmxvY2tfd3JpdGUoYW5vbl92bWEpO1xuK1x0XHRwdXRfYW5vbl92bWEoYW5vbl92bWEpO1xuK1x0fVxuIFxuLVx0XHRcdG5leHQgPSBmb2xpb19uZXh0KG5ld19mb2xpbyk7XG4rXHRyZXR1cm4gcmV0O1xuK31cbiBcbi1cdFx0XHR6b25lX2RldmljZV9wcml2YXRlX3NwbGl0X2NiKGZvbGlvLCBuZXdfZm9saW8pO1xuK3N0YXRpYyBpbnQgX19mb2xpb19mcmVlemVfc3BsaXRfdW5tYXBfZmlsZShzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyLFxuK1x0XHRcdFx0XHQgICBzdHJ1Y3QgcGFnZSAqc3BsaXRfYXQsIGJvb2wgZG9fbHJ1LFxuK1x0XHRcdFx0XHQgICBzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LCBlbnVtIHNwbGl0X3R5cGUgc3BsaXRfdHlwZSlcbit7XG4rXHRzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyA9IGZvbGlvLVx1MDAzZW1hcHBpbmc7XG4rXHRYQV9TVEFURSh4YXMsIFx1MDAyNm1hcHBpbmctXHUwMDNlaV9wYWdlcywgZm9saW8tXHUwMDNlaW5kZXgpO1xuK1x0c3RydWN0IGZvbGlvICplbmRfZm9saW8gPSBmb2xpb19uZXh0KGZvbGlvKTtcbitcdGxvbmcgb2xkX25yX3BhZ2VzID0gZm9saW9fbnJfcGFnZXMoZm9saW8pO1xuK1x0c3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLCAqb2xkX21lbWNnO1xuK1x0c3RydWN0IGZvbGlvICpuZXdfZm9saW8sICpuZXh0O1xuK1x0aW50IG5yX3NobWVtX2Ryb3BwZWQgPSAwO1xuK1x0dW5zaWduZWQgaW50IG1pbl9vcmRlcjtcbitcdHN0cnVjdCBscnV2ZWMgKmxydXZlYztcbitcdHBnb2ZmX3QgZW5kID0gMDtcbitcdGdmcF90IGdmcDtcbitcdGludCByZXQgPSAwO1xuIFxuLVx0XHRcdGZvbGlvX3JlZl91bmZyZWV6ZShuZXdfZm9saW8sXG4tXHRcdFx0XHRcdCAgIGZvbGlvX2NhY2hlX3JlZl9jb3VudChuZXdfZm9saW8pICsgMSk7XG4rXHRtaW5fb3JkZXIgPSBtYXBwaW5nX21pbl9mb2xpb19vcmRlcihtYXBwaW5nKTtcbitcdGlmIChuZXdfb3JkZXIgXHUwMDNjIG1pbl9vcmRlcilcbitcdFx0cmV0dXJuIC1FSU5WQUw7XG4gXG4tXHRcdFx0aWYgKGRvX2xydSlcbi1cdFx0XHRcdGxydV9hZGRfc3BsaXRfZm9saW8oZm9saW8sIG5ld19mb2xpbywgbHJ1dmVjLCBsaXN0KTtcbitcdC8qXG4rXHQgKiBTd2l0Y2ggdG8gZm9saW8ncyBtZW1jZyBhcyB4YXJyYXkgbm9kZSBhbGxvY2F0aW9uIGNhbiBoYXBwZW4gYW5kXG4rXHQgKiBuZWVkcyB0byBjaGFyZ2UgdG8gaXQuXG4rXHQgKi9cbitcdG1lbWNnID0gZ2V0X21lbV9jZ3JvdXBfZnJvbV9mb2xpbyhmb2xpbyk7XG4rXHRvbGRfbWVtY2cgPSBzZXRfYWN0aXZlX21lbWNnKG1lbWNnKTtcbiBcbi1cdFx0XHQvKlxuLVx0XHRcdCAqIEFub255bW91cyBmb2xpbyB3aXRoIHN3YXAgY2FjaGUuXG4tXHRcdFx0ICogTk9URTogc2htZW0gaW4gc3dhcCBjYWNoZSBpcyBub3Qgc3VwcG9ydGVkIHlldC5cbi1cdFx0XHQgKi9cbi1cdFx0XHRpZiAoY2kpIHtcbi1cdFx0XHRcdF9fc3dhcF9jYWNoZV9yZXBsYWNlX2ZvbGlvKGNpLCBmb2xpbywgbmV3X2ZvbGlvKTtcbi1cdFx0XHRcdGNvbnRpbnVlO1xuLVx0XHRcdH1cbitcdGdmcCA9IGN1cnJlbnRfZ2ZwX2NvbnRleHQobWFwcGluZ19nZnBfbWFzayhtYXBwaW5nKSBcdTAwMjYgR0ZQX1JFQ0xBSU1fTUFTSyk7XG4rXHRpZiAoIWZpbGVtYXBfcmVsZWFzZV9mb2xpbyhmb2xpbywgZ2ZwKSkge1xuK1x0XHRyZXQgPSAtRUJVU1k7XG4rXHRcdGdvdG8gZmFpbF9mcmVlO1xuK1x0fVxuIFxuLVx0XHRcdC8qIEFub255bW91cyBmb2xpbyB3aXRob3V0IHN3YXAgY2FjaGUgKi9cbi1cdFx0XHRpZiAoIW1hcHBpbmcpXG4tXHRcdFx0XHRjb250aW51ZTtcbitcdG1hcHBpbmdfc2V0X3VwZGF0ZShcdTAwMjZ4YXMsIG1hcHBpbmcpO1xuIFxuLVx0XHRcdC8qIEFkZCB0aGUgbmV3IGZvbGlvIHRvIHRoZSBwYWdlIGNhY2hlLiAqL1xuLVx0XHRcdGlmIChuZXdfZm9saW8tXHUwMDNlaW5kZXggXHUwMDNjIGVuZCkge1xuLVx0XHRcdFx0X194YV9zdG9yZShcdTAwMjZtYXBwaW5nLVx1MDAzZWlfcGFnZXMsIG5ld19mb2xpby1cdTAwM2VpbmRleCxcbi1cdFx0XHRcdFx0ICAgbmV3X2ZvbGlvLCAwKTtcbi1cdFx0XHRcdGNvbnRpbnVlO1xuLVx0XHRcdH1cbitcdGlmIChzcGxpdF90eXBlID09IFNQTElUX1RZUEVfVU5JRk9STSkge1xuK1x0XHRpbnQgb2xkX29yZGVyID0gZm9saW9fb3JkZXIoZm9saW8pO1xuIFxuLVx0XHRcdFZNX1dBUk5fT05fT05DRSghbnJfc2htZW1fZHJvcHBlZCk7XG4tXHRcdFx0LyogRHJvcCBmb2xpbyBiZXlvbmQgRU9GOiAtXHUwMDNlaW5kZXggXHUwMDNlPSBlbmQgKi9cbi1cdFx0XHRpZiAoc2htZW1fbWFwcGluZyhtYXBwaW5nKSBcdTAwMjZcdTAwMjYgbnJfc2htZW1fZHJvcHBlZClcbi1cdFx0XHRcdCpucl9zaG1lbV9kcm9wcGVkICs9IG5yX3BhZ2VzO1xuLVx0XHRcdGVsc2UgaWYgKGZvbGlvX3Rlc3RfY2xlYXJfZGlydHkobmV3X2ZvbGlvKSlcbi1cdFx0XHRcdGZvbGlvX2FjY291bnRfY2xlYW5lZChcbi1cdFx0XHRcdFx0bmV3X2ZvbGlvLCBpbm9kZV90b193YihtYXBwaW5nLVx1MDAzZWhvc3QpKTtcbi1cdFx0XHRfX2ZpbGVtYXBfcmVtb3ZlX2ZvbGlvKG5ld19mb2xpbywgTlVMTCk7XG4tXHRcdFx0Zm9saW9fcHV0X3JlZnMobmV3X2ZvbGlvLCBucl9wYWdlcyk7XG4rXHRcdHhhc19zZXRfb3JkZXIoXHUwMDI2eGFzLCBmb2xpby1cdTAwM2VpbmRleCwgbmV3X29yZGVyKTtcbitcdFx0eGFzX3NwbGl0X2FsbG9jKFx1MDAyNnhhcywgZm9saW8sIG9sZF9vcmRlciwgZ2ZwKTtcbitcdFx0aWYgKHhhc19lcnJvcihcdTAwMjZ4YXMpKSB7XG4rXHRcdFx0cmV0ID0geGFzX2Vycm9yKFx1MDAyNnhhcyk7XG4rXHRcdFx0Z290byBmYWlsX2ZyZWU7XG4gXHRcdH1cbitcdH1cbiBcbi1cdFx0em9uZV9kZXZpY2VfcHJpdmF0ZV9zcGxpdF9jYihmb2xpbywgTlVMTCk7XG4tXHRcdC8qXG4tXHRcdCAqIFVuZnJlZXplIEBmb2xpbyBvbmx5IGFmdGVyIGFsbCBwYWdlIGNhY2hlIGVudHJpZXMsIHdoaWNoXG4tXHRcdCAqIHVzZWQgdG8gcG9pbnQgdG8gaXQsIGhhdmUgYmVlbiB1cGRhdGVkIHdpdGggbmV3IGZvbGlvcy5cbi1cdFx0ICogT3RoZXJ3aXNlLCBhIHBhcmFsbGVsIGZvbGlvX3RyeV9nZXQoKSBjYW4gZ3JhYiBAZm9saW9cbi1cdFx0ICogYW5kIGl0cyBjYWxsZXIgY2FuIHNlZSBzdGFsZSBwYWdlIGNhY2hlIGVudHJpZXMuXG4tXHRcdCAqL1xuLVx0XHRmb2xpb19yZWZfdW5mcmVlemUoZm9saW8sIGZvbGlvX2NhY2hlX3JlZl9jb3VudChmb2xpbykgKyAxKTtcbitcdGlfbW1hcF9sb2NrX3JlYWQobWFwcGluZyk7XG4rXG4rXHQvKiBSYWN5IGNoZWNrIGlmIHdlIGNhbiBzcGxpdCB0aGUgcGFnZSwgYmVmb3JlIHVubWFwX2ZvbGlvKCkgKi9cbitcdGlmIChmb2xpb19leHBlY3RlZF9yZWZfY291bnQoZm9saW8pICE9IGZvbGlvX3JlZl9jb3VudChmb2xpbykgLSAxKSB7XG4rXHRcdHJldCA9IC1FQUdBSU47XG4rXHRcdGdvdG8gZmFpbF9tbWFwX3VubG9jaztcbitcdH1cbitcbitcdC8qXG4rXHQgKl9fc3BsaXRfdW5tYXBwZWRfZm9saW8oKSBtYXkgbmVlZCB0byB0cmltIG9mZiBwYWdlcyBiZXlvbmRcbitcdCAqIEVPRjogYnV0IG9uIDMyLWJpdCwgaV9zaXplX3JlYWQoKSB0YWtlcyBhbiBpcnEtdW5zYWZlXG4rXHQgKiBzZXFsb2NrLCB3aGljaCBjYW5ub3QgYmUgbmVzdGVkIGluc2lkZSB0aGUgcGFnZSB0cmVlIGxvY2suXG4rXHQgKiBTbyBub3RlIGVuZCBub3c6IGlfc2l6ZSBpdHNlbGYgbWF5IGJlIGNoYW5nZWQgYXQgYW55IG1vbWVudCxcbitcdCAqIGJ1dCBmb2xpbyBsb2NrIGlzIGdvb2QgZW5vdWdoIHRvIHNlcmlhbGl6ZSB0aGUgdHJpbW1pbmcuXG4rXHQgKi9cbitcdGVuZCA9IERJVl9ST1VORF9VUChpX3NpemVfcmVhZChtYXBwaW5nLVx1MDAzZWhvc3QpLCBQQUdFX1NJWkUpO1xuK1x0aWYgKHNobWVtX21hcHBpbmcobWFwcGluZykpXG4rXHRcdGVuZCA9IHNobWVtX2ZhbGxvY2VuZChtYXBwaW5nLVx1MDAzZWhvc3QsIGVuZCk7XG4rXG4rXHR1bm1hcF9mb2xpbyhmb2xpbyk7XG4rXG4rXHR4YXNfbG9ja19pcnEoXHUwMDI2eGFzKTtcbitcbitcdC8qXG4rXHQgKiBDaGVjayBpZiB0aGUgZm9saW8gaXMgcHJlc2VudCBpbiBwYWdlIGNhY2hlLlxuK1x0ICogV2UgYXNzdW1lIGFsbCB0YWlsIGFyZSBwcmVzZW50IHRvbywgaWYgZm9saW8gaXMgdGhlcmUuXG4rXHQgKi9cbitcdGlmICh4YXNfbG9hZChcdTAwMjZ4YXMpICE9IGZvbGlvKSB7XG4rXHRcdHJldCA9IC1FQUdBSU47XG4rXHRcdGdvdG8gZmFpbDtcbitcdH1cbitcbitcdGlmICghZm9saW9fcmVmX2ZyZWV6ZShmb2xpbywgb2xkX25yX3BhZ2VzICsgMSkpIHtcbitcdFx0cmV0ID0gLUVBR0FJTjtcbitcdFx0Z290byBmYWlsO1xuK1x0fVxuK1xuK1x0aWYgKGZvbGlvX3Rlc3RfcG1kX21hcHBhYmxlKGZvbGlvKSBcdTAwMjZcdTAwMjYgbmV3X29yZGVyIFx1MDAzYyBIUEFHRV9QTURfT1JERVIpIHtcbitcdFx0aWYgKGZvbGlvX3Rlc3Rfc3dhcGJhY2tlZChmb2xpbykpXG4rXHRcdFx0bHJ1dmVjX3N0YXRfbW9kX2ZvbGlvKGZvbGlvLCBOUl9TSE1FTV9USFBTLCAtb2xkX25yX3BhZ2VzKTtcbitcdFx0ZWxzZVxuK1x0XHRcdGxydXZlY19zdGF0X21vZF9mb2xpbyhmb2xpbywgTlJfRklMRV9USFBTLCAtb2xkX25yX3BhZ2VzKTtcbitcdH1cbitcbitcdC8qIGxvY2sgbHJ1IGxpc3QvUGFnZUNvbXBvdW5kLCByZWYgZnJvemVuIGJ5IHBhZ2VfcmVmX2ZyZWV6ZSAqL1xuK1x0aWYgKGRvX2xydSlcbitcdFx0bHJ1dmVjID0gZm9saW9fbHJ1dmVjX2xvY2soZm9saW8pO1xuK1xuK1x0cmV0ID0gX19zcGxpdF91bm1hcHBlZF9mb2xpbyhmb2xpbywgbmV3X29yZGVyLCBzcGxpdF9hdCwgXHUwMDI2eGFzLFxuK1x0XHRcdFx0ICAgICBtYXBwaW5nLCBzcGxpdF90eXBlKTtcbitcbitcdC8qXG4rXHQgKiBVbmZyZWV6ZSBhZnRlci1zcGxpdCBmb2xpb3MgYW5kIHB1dCB0aGVtIGJhY2sgdG8gdGhlIHJpZ2h0XG4rXHQgKiBsaXN0LiBAZm9saW8gc2hvdWxkIGJlIGtlcHQgZnJvemVuIHVudGlsIHBhZ2UgY2FjaGVcbitcdCAqIGVudHJpZXMgYXJlIHVwZGF0ZWQgd2l0aCBhbGwgdGhlIG90aGVyIGFmdGVyLXNwbGl0IGZvbGlvc1xuK1x0ICogdG8gcHJldmVudCBvdGhlcnMgc2VlaW5nIHN0YWxlIHBhZ2UgY2FjaGUgZW50cmllcy5cbitcdCAqIEFzIGEgcmVzdWx0LCBuZXdfZm9saW8gc3RhcnRzIGZyb20gdGhlIG5leHQgZm9saW8gb2ZcbitcdCAqIEBmb2xpby5cbitcdCAqL1xuK1x0Zm9yIChuZXdfZm9saW8gPSBmb2xpb19uZXh0KGZvbGlvKTsgbmV3X2ZvbGlvICE9IGVuZF9mb2xpbztcbitcdCAgICAgbmV3X2ZvbGlvID0gbmV4dCkge1xuK1x0XHR1bnNpZ25lZCBsb25nIG5yX3BhZ2VzID0gZm9saW9fbnJfcGFnZXMobmV3X2ZvbGlvKTtcbitcbitcdFx0bmV4dCA9IGZvbGlvX25leHQobmV3X2ZvbGlvKTtcbitcbitcdFx0Zm9saW9fcmVmX3VuZnJlZXplKG5ld19mb2xpbyxcbitcdFx0XHRcdCAgIGZvbGlvX25yX3BhZ2VzKG5ld19mb2xpbykgKyAxKTtcbiBcbiBcdFx0aWYgKGRvX2xydSlcbi1cdFx0XHRscnV2ZWNfdW5sb2NrKGxydXZlYyk7XG4rXHRcdFx0bHJ1X2FkZF9zcGxpdF9mb2xpbyhmb2xpbywgbmV3X2ZvbGlvLCBscnV2ZWMsIGxpc3QpO1xuIFxuLVx0XHRpZiAoY2kpXG4tXHRcdFx0c3dhcF9jbHVzdGVyX3VubG9jayhjaSk7XG4tXHR9IGVsc2Uge1xuLVx0XHRpZiAoZGVxdWV1ZV9kZWZlcnJlZCkge1xuLVx0XHRcdGxpc3RfbHJ1X3VubG9jayhscnUpO1xuLVx0XHRcdHJjdV9yZWFkX3VubG9jaygpO1xuK1x0XHQvKiBBZGQgdGhlIG5ldyBmb2xpbyB0byB0aGUgcGFnZSBjYWNoZS4gKi9cbitcdFx0aWYgKG5ld19mb2xpby1cdTAwM2VpbmRleCBcdTAwM2MgZW5kKSB7XG4rXHRcdFx0X194YV9zdG9yZShcdTAwMjZtYXBwaW5nLVx1MDAzZWlfcGFnZXMsIG5ld19mb2xpby1cdTAwM2VpbmRleCxcbitcdFx0XHRcdCAgIG5ld19mb2xpbywgMCk7XG4rXHRcdFx0Y29udGludWU7XG4gXHRcdH1cbi1cdFx0cmV0dXJuIC1FQUdBSU47XG4rXG4rXHRcdC8qIERyb3AgZm9saW8gYmV5b25kIEVPRjogLVx1MDAzZWluZGV4IFx1MDAzZT0gZW5kICovXG4rXHRcdGlmIChzaG1lbV9tYXBwaW5nKG1hcHBpbmcpKVxuK1x0XHRcdG5yX3NobWVtX2Ryb3BwZWQgKz0gbnJfcGFnZXM7XG4rXHRcdGVsc2UgaWYgKGZvbGlvX3Rlc3RfY2xlYXJfZGlydHkobmV3X2ZvbGlvKSlcbitcdFx0XHRmb2xpb19hY2NvdW50X2NsZWFuZWQobmV3X2ZvbGlvLFxuK1x0XHRcdFx0XHQgICAgICBpbm9kZV90b193YihtYXBwaW5nLVx1MDAzZWhvc3QpKTtcbitcdFx0X19maWxlbWFwX3JlbW92ZV9mb2xpbyhuZXdfZm9saW8sIE5VTEwpO1xuK1x0XHRmb2xpb19wdXRfcmVmcyhuZXdfZm9saW8sIG5yX3BhZ2VzKTtcbiBcdH1cbiBcbitcdC8qXG4rXHQgKiBVbmZyZWV6ZSBAZm9saW8gb25seSBhZnRlciBhbGwgcGFnZSBjYWNoZSBlbnRyaWVzLCB3aGljaFxuK1x0ICogdXNlZCB0byBwb2ludCB0byBpdCwgaGF2ZSBiZWVuIHVwZGF0ZWQgd2l0aCBuZXcgZm9saW9zLlxuK1x0ICogT3RoZXJ3aXNlLCBhIHBhcmFsbGVsIGZvbGlvX3RyeV9nZXQoKSBjYW4gZ3JhYiBAZm9saW9cbitcdCAqIGFuZCBpdHMgY2FsbGVyIGNhbiBzZWUgc3RhbGUgcGFnZSBjYWNoZSBlbnRyaWVzLlxuK1x0ICovXG4rXHRmb2xpb19yZWZfdW5mcmVlemUoZm9saW8sIGZvbGlvX25yX3BhZ2VzKGZvbGlvKSArIDEpO1xuK1xuK1x0aWYgKGRvX2xydSlcbitcdFx0bHJ1dmVjX3VubG9jayhscnV2ZWMpO1xuK1xuK2ZhaWw6XG4rXHR4YXNfdW5sb2NrX2lycShcdTAwMjZ4YXMpO1xuK2ZhaWxfbW1hcF91bmxvY2s6XG4rXHRpZiAobnJfc2htZW1fZHJvcHBlZClcbitcdFx0c2htZW1fdW5jaGFyZ2UobWFwcGluZy1cdTAwM2Vob3N0LCBucl9zaG1lbV9kcm9wcGVkKTtcbitcdC8qXG4rXHQgKiBEcm9wIHRoZSBtYXBwaW5nIHdoaWxlIHRoZSBpbm9kZSBpcyBzdGlsbCBwaW5uZWQuIEBmb2xpbyBzdGF5c1xuK1x0ICogbG9ja2VkIGFuZCBwcmVzZW50IGluIHRoZSBwYWdlIGNhY2hlLCBzbyBldmljdGlvbiBjYW5ub3QgZnJlZVxuK1x0ICogdGhlIGlub2RlIHlldCwgbm90aGluZyBwYXN0IHRoaXMgcG9pbnQgbWF5IHRvdWNoIHRoZSBpbm9kZSBvclxuK1x0ICogdGhlIG1hcHBpbmcuXG4rXHQgKi9cbitcdGlfbW1hcF91bmxvY2tfcmVhZChtYXBwaW5nKTtcbitmYWlsX2ZyZWU6XG4rXHQvKiBSZXN0b3JlIHRoZSBwcmV2aW91c2x5IGFjdGl2ZSBtZW1jZyAqL1xuK1x0c2V0X2FjdGl2ZV9tZW1jZyhvbGRfbWVtY2cpO1xuK1x0bWVtX2Nncm91cF9wdXQobWVtY2cpO1xuK1x0eGFzX2Rlc3Ryb3koXHUwMDI2eGFzKTtcbiBcdHJldHVybiByZXQ7XG4gfVxuIFxuQEAgLTQxMDIsMTcgKzQyNDgsMTEgQEAgc3RhdGljIGludCBfX2ZvbGlvX3NwbGl0KHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIsXG4gXHRcdHN0cnVjdCBwYWdlICpzcGxpdF9hdCwgc3RydWN0IHBhZ2UgKmxvY2tfYXQsXG4gXHRcdHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QsIGVudW0gc3BsaXRfdHlwZSBzcGxpdF90eXBlKVxuIHtcbi1cdFhBX1NUQVRFKHhhcywgXHUwMDI2Zm9saW8tXHUwMDNlbWFwcGluZy1cdTAwM2VpX3BhZ2VzLCBmb2xpby1cdTAwM2VpbmRleCk7XG4rXHRib29sIGlzX3N3YXBjYWNoZSA9IGZvbGlvX3Rlc3Rfc3dhcGNhY2hlKGZvbGlvKTtcbiBcdHN0cnVjdCBmb2xpbyAqZW5kX2ZvbGlvID0gZm9saW9fbmV4dChmb2xpbyk7XG4gXHRib29sIGlzX2Fub24gPSBmb2xpb190ZXN0X2Fub24oZm9saW8pO1xuLVx0c3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLCAqb2xkX21lbWNnO1xuLVx0c3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSBOVUxMO1xuLVx0c3RydWN0IGFub25fdm1hICphbm9uX3ZtYSA9IE5VTEw7XG4gXHRpbnQgb2xkX29yZGVyID0gZm9saW9fb3JkZXIoZm9saW8pO1xuIFx0c3RydWN0IGZvbGlvICpuZXdfZm9saW8sICpuZXh0O1xuLVx0aW50IG5yX3NobWVtX2Ryb3BwZWQgPSAwO1xuLVx0ZW51bSB0dHVfZmxhZ3MgdHR1X2ZsYWdzID0gMDtcbi1cdHBnb2ZmX3QgZW5kID0gMDtcbiBcdGludCByZXQ7XG4gXG4gXHRWTV9XQVJOX09OX09OQ0VfRk9MSU8oIWZvbGlvX3Rlc3RfbG9ja2VkKGZvbGlvKSwgZm9saW8pO1xuQEAgLTQxMjAsMTQxICs0MjYwLDI5IEBAIHN0YXRpYyBpbnQgX19mb2xpb19zcGxpdChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyLFxuIFxuIFx0aWYgKGZvbGlvICE9IHBhZ2VfZm9saW8oc3BsaXRfYXQpIHx8IGZvbGlvICE9IHBhZ2VfZm9saW8obG9ja19hdCkpIHtcbiBcdFx0cmV0ID0gLUVJTlZBTDtcbi1cdFx0Z290byBvdXRfbm9fbWVtY2c7XG4rXHRcdGdvdG8gb3V0O1xuIFx0fVxuIFxuIFx0aWYgKG5ld19vcmRlciBcdTAwM2U9IG9sZF9vcmRlcikge1xuIFx0XHRyZXQgPSAtRUlOVkFMO1xuLVx0XHRnb3RvIG91dF9ub19tZW1jZztcbitcdFx0Z290byBvdXQ7XG4gXHR9XG4gXG4gXHRyZXQgPSBmb2xpb19jaGVja19zcGxpdHRhYmxlKGZvbGlvLCBuZXdfb3JkZXIsIHNwbGl0X3R5cGUpO1xuIFx0aWYgKHJldCkge1xuIFx0XHRWTV9XQVJOX09OQ0UocmV0ID09IC1FSU5WQUwsIFwiVHJpZWQgdG8gc3BsaXQgYW4gdW5zcGxpdHRhYmxlIGZvbGlvXCIpO1xuLVx0XHRnb3RvIG91dF9ub19tZW1jZztcbi1cdH1cbi1cbi1cdC8qXG4tXHQgKiBzd2l0Y2ggdG8gZm9saW8ncyBtZW1jZyBhcyB4YXJyYXkgbm9kZSBhbGxvY2F0aW9uIGNhbiBoYXBwZW4gYW5kXG4tXHQgKiBuZWVkcyB0byBjaGFyZ2UgdG8gaXQuXG4tXHQgKi9cbi1cdG1lbWNnID0gZ2V0X21lbV9jZ3JvdXBfZnJvbV9mb2xpbyhmb2xpbyk7XG4tXHRvbGRfbWVtY2cgPSBzZXRfYWN0aXZlX21lbWNnKG1lbWNnKTtcbi1cbi1cdGlmIChpc19hbm9uKSB7XG4tXHRcdC8qXG4tXHRcdCAqIFRoZSBjYWxsZXIgZG9lcyBub3QgbmVjZXNzYXJpbHkgaG9sZCBhbiBtbWFwX2xvY2sgdGhhdCB3b3VsZFxuLVx0XHQgKiBwcmV2ZW50IHRoZSBhbm9uX3ZtYSBkaXNhcHBlYXJpbmcgc28gd2UgZmlyc3Qgd2UgdGFrZSBhXG4tXHRcdCAqIHJlZmVyZW5jZSB0byBpdCBhbmQgdGhlbiBsb2NrIHRoZSBhbm9uX3ZtYSBmb3Igd3JpdGUuIFRoaXNcbi1cdFx0ICogaXMgc2ltaWxhciB0byBmb2xpb19sb2NrX2Fub25fdm1hX3JlYWQgZXhjZXB0IHRoZSB3cml0ZSBsb2NrXG4tXHRcdCAqIGlzIHRha2VuIHRvIHNlcmlhbGlzZSBhZ2FpbnN0IHBhcmFsbGVsIHNwbGl0IG9yIGNvbGxhcHNlXG4tXHRcdCAqIG9wZXJhdGlvbnMuXG4tXHRcdCAqL1xuLVx0XHRhbm9uX3ZtYSA9IGZvbGlvX2dldF9hbm9uX3ZtYShmb2xpbyk7XG4tXHRcdGlmICghYW5vbl92bWEpIHtcbi1cdFx0XHRyZXQgPSAtRUJVU1k7XG4tXHRcdFx0Z290byBvdXQ7XG4tXHRcdH1cbi1cdFx0YW5vbl92bWFfbG9ja193cml0ZShhbm9uX3ZtYSk7XG4tXHRcdG1hcHBpbmcgPSBOVUxMO1xuLVx0fSBlbHNlIHtcbi1cdFx0dW5zaWduZWQgaW50IG1pbl9vcmRlcjtcbi1cdFx0Z2ZwX3QgZ2ZwO1xuLVxuLVx0XHRtYXBwaW5nID0gZm9saW8tXHUwMDNlbWFwcGluZztcbi1cdFx0bWluX29yZGVyID0gbWFwcGluZ19taW5fZm9saW9fb3JkZXIobWFwcGluZyk7XG4tXHRcdGlmIChuZXdfb3JkZXIgXHUwMDNjIG1pbl9vcmRlcikge1xuLVx0XHRcdHJldCA9IC1FSU5WQUw7XG4tXHRcdFx0Z290byBvdXQ7XG4tXHRcdH1cbi1cbi1cdFx0Z2ZwID0gY3VycmVudF9nZnBfY29udGV4dChtYXBwaW5nX2dmcF9tYXNrKG1hcHBpbmcpIFx1MDAyNlxuLVx0XHRcdFx0XHRcdFx0R0ZQX1JFQ0xBSU1fTUFTSyk7XG4tXG4tXHRcdGlmICghZmlsZW1hcF9yZWxlYXNlX2ZvbGlvKGZvbGlvLCBnZnApKSB7XG4tXHRcdFx0cmV0ID0gLUVCVVNZO1xuLVx0XHRcdGdvdG8gb3V0O1xuLVx0XHR9XG4tXG4tXHRcdG1hcHBpbmdfc2V0X3VwZGF0ZShcdTAwMjZ4YXMsIG1hcHBpbmcpO1xuLVxuLVx0XHRpZiAoc3BsaXRfdHlwZSA9PSBTUExJVF9UWVBFX1VOSUZPUk0pIHtcbi1cdFx0XHR4YXNfc2V0X29yZGVyKFx1MDAyNnhhcywgZm9saW8tXHUwMDNlaW5kZXgsIG5ld19vcmRlcik7XG4tXHRcdFx0eGFzX3NwbGl0X2FsbG9jKFx1MDAyNnhhcywgZm9saW8sIG9sZF9vcmRlciwgZ2ZwKTtcbi1cdFx0XHRpZiAoeGFzX2Vycm9yKFx1MDAyNnhhcykpIHtcbi1cdFx0XHRcdHJldCA9IHhhc19lcnJvcihcdTAwMjZ4YXMpO1xuLVx0XHRcdFx0Z290byBvdXQ7XG4tXHRcdFx0fVxuLVx0XHR9XG4tXG4tXHRcdGFub25fdm1hID0gTlVMTDtcbi1cdFx0aV9tbWFwX2xvY2tfcmVhZChtYXBwaW5nKTtcbi1cbi1cdFx0Lypcbi1cdFx0ICpfX3NwbGl0X3VubWFwcGVkX2ZvbGlvKCkgbWF5IG5lZWQgdG8gdHJpbSBvZmYgcGFnZXMgYmV5b25kXG4tXHRcdCAqIEVPRjogYnV0IG9uIDMyLWJpdCwgaV9zaXplX3JlYWQoKSB0YWtlcyBhbiBpcnEtdW5zYWZlXG4tXHRcdCAqIHNlcWxvY2ssIHdoaWNoIGNhbm5vdCBiZSBuZXN0ZWQgaW5zaWRlIHRoZSBwYWdlIHRyZWUgbG9jay5cbi1cdFx0ICogU28gbm90ZSBlbmQgbm93OiBpX3NpemUgaXRzZWxmIG1heSBiZSBjaGFuZ2VkIGF0IGFueSBtb21lbnQsXG4tXHRcdCAqIGJ1dCBmb2xpbyBsb2NrIGlzIGdvb2QgZW5vdWdoIHRvIHNlcmlhbGl6ZSB0aGUgdHJpbW1pbmcuXG4tXHRcdCAqL1xuLVx0XHRlbmQgPSBESVZfUk9VTkRfVVAoaV9zaXplX3JlYWQobWFwcGluZy1cdTAwM2Vob3N0KSwgUEFHRV9TSVpFKTtcbi1cdFx0aWYgKHNobWVtX21hcHBpbmcobWFwcGluZykpXG4tXHRcdFx0ZW5kID0gc2htZW1fZmFsbG9jZW5kKG1hcHBpbmctXHUwMDNlaG9zdCwgZW5kKTtcbi1cdH1cbi1cbi1cdC8qXG4tXHQgKiBSYWN5IGNoZWNrIGlmIHdlIGNhbiBzcGxpdCB0aGUgcGFnZSwgYmVmb3JlIHVubWFwX2ZvbGlvKCkgd2lsbFxuLVx0ICogc3BsaXQgUE1Ec1xuLVx0ICovXG4tXHRpZiAoZm9saW9fZXhwZWN0ZWRfcmVmX2NvdW50KGZvbGlvKSAhPSBmb2xpb19yZWZfY291bnQoZm9saW8pIC0gMSkge1xuLVx0XHRyZXQgPSAtRUFHQUlOO1xuLVx0XHRnb3RvIG91dF91bmxvY2s7XG4tXHR9XG4tXG4tXHR1bm1hcF9mb2xpbyhmb2xpbyk7XG4tXG4tXHQvKiBibG9jayBpbnRlcnJ1cHQgcmVlbnRyeSBpbiB4YV9sb2NrIGFuZCBzcGlubG9jayAqL1xuLVx0bG9jYWxfaXJxX2Rpc2FibGUoKTtcbi1cdGlmIChtYXBwaW5nKSB7XG4tXHRcdC8qXG4tXHRcdCAqIENoZWNrIGlmIHRoZSBmb2xpbyBpcyBwcmVzZW50IGluIHBhZ2UgY2FjaGUuXG4tXHRcdCAqIFdlIGFzc3VtZSBhbGwgdGFpbCBhcmUgcHJlc2VudCB0b28sIGlmIGZvbGlvIGlzIHRoZXJlLlxuLVx0XHQgKi9cbi1cdFx0eGFzX2xvY2soXHUwMDI2eGFzKTtcbi1cdFx0eGFzX3Jlc2V0KFx1MDAyNnhhcyk7XG4tXHRcdGlmICh4YXNfbG9hZChcdTAwMjZ4YXMpICE9IGZvbGlvKSB7XG4tXHRcdFx0cmV0ID0gLUVBR0FJTjtcbi1cdFx0XHRnb3RvIGZhaWw7XG4tXHRcdH1cbitcdFx0Z290byBvdXQ7XG4gXHR9XG4gXG4tXHRyZXQgPSBfX2ZvbGlvX2ZyZWV6ZV9hbmRfc3BsaXRfdW5tYXBwZWQoZm9saW8sIG5ld19vcmRlciwgc3BsaXRfYXQsIFx1MDAyNnhhcywgbWFwcGluZyxcbi1cdFx0XHRcdFx0XHR0cnVlLCBsaXN0LCBzcGxpdF90eXBlLCBlbmQsIFx1MDAyNm5yX3NobWVtX2Ryb3BwZWQpO1xuLWZhaWw6XG4tXHRpZiAobWFwcGluZylcbi1cdFx0eGFzX3VubG9jayhcdTAwMjZ4YXMpO1xuLVxuLVx0bG9jYWxfaXJxX2VuYWJsZSgpO1xuLVxuLVx0aWYgKG5yX3NobWVtX2Ryb3BwZWQpXG4tXHRcdHNobWVtX3VuY2hhcmdlKG1hcHBpbmctXHUwMDNlaG9zdCwgbnJfc2htZW1fZHJvcHBlZCk7XG4tXG4tXHRpZiAoIXJldCBcdTAwMjZcdTAwMjYgaXNfYW5vbiBcdTAwMjZcdTAwMjYgIWZvbGlvX2lzX2RldmljZV9wcml2YXRlKGZvbGlvKSlcbi1cdFx0dHR1X2ZsYWdzID0gVFRVX1VTRV9TSEFSRURfWkVST1BBR0U7XG4tXG4tXHRyZW1hcF9wYWdlKGZvbGlvLCAxIFx1MDAzY1x1MDAzYyBvbGRfb3JkZXIsIHR0dV9mbGFncyk7XG4tXG4tXHQvKlxuLVx0ICogRHJvcCB0aGUgbWFwcGluZyB3aGlsZSB0aGUgaW5vZGUgaXMgc3RpbGwgcGlubmVkLiBAZm9saW8gc3RheXNcbi1cdCAqIGxvY2tlZCBhbmQgcHJlc2VudCBpbiB0aGUgcGFnZSBjYWNoZSB1bnRpbCB0aGUgbG9vcCBiZWxvdywgc29cbi1cdCAqIGV2aWN0aW9uIGNhbm5vdCBmcmVlIHRoZSBpbm9kZSB5ZXQ7IEBsb2NrX2F0IGlzIG5vdCBlbm91Z2gsIGl0IG1heVxuLVx0ICogYmUgYSB0YWlsIGJleW9uZCBFT0YgdGhhdCB0aGUgc3BsaXQgYWxyZWFkeSBkcm9wcGVkIGZyb20gdGhlIHBhZ2Vcbi1cdCAqIGNhY2hlLiBOb3RoaW5nIHBhc3QgdGhpcyBwb2ludCBtYXkgdG91Y2ggdGhlIGlub2RlIG9yIHRoZSBtYXBwaW5nLlxuLVx0ICovXG4tXHRpZiAobWFwcGluZykge1xuLVx0XHRpX21tYXBfdW5sb2NrX3JlYWQobWFwcGluZyk7XG4tXHRcdG1hcHBpbmcgPSBOVUxMO1xuLVx0fVxuK1x0aWYgKGlzX2Fub24pXG4rXHRcdHJldCA9IF9fZm9saW9fZnJlZXplX3NwbGl0X3VubWFwKGZvbGlvLCBuZXdfb3JkZXIsIHNwbGl0X2F0LCB0cnVlLFxuK1x0XHRcdFx0XHRcdCB0cnVlLCBsaXN0LCBzcGxpdF90eXBlKTtcbitcdGVsc2UgaWYgKGlzX3N3YXBjYWNoZSlcbitcdFx0cmV0ID0gX19mb2xpb19mcmVlemVfc3BsaXRfdW5tYXAoZm9saW8sIG5ld19vcmRlciwgc3BsaXRfYXQsIHRydWUsXG4rXHRcdFx0XHRcdFx0IGZhbHNlLCBsaXN0LCBzcGxpdF90eXBlKTtcbitcdGVsc2VcbitcdFx0cmV0ID0gX19mb2xpb19mcmVlemVfc3BsaXRfdW5tYXBfZmlsZShmb2xpbywgbmV3X29yZGVyLCBzcGxpdF9hdCxcbitcdFx0XHRcdFx0XHQgICAgICB0cnVlLCBsaXN0LCBzcGxpdF90eXBlKTtcbiBcbiBcdC8qXG4gXHQgKiBVbmxvY2sgYWxsIGFmdGVyLXNwbGl0IGZvbGlvcyBleGNlcHQgdGhlIG9uZSBjb250YWluaW5nXG5AQCAtNDI2NSwyOSArNDI5MywxOSBAQCBzdGF0aWMgaW50IF9fZm9saW9fc3BsaXQoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlcixcbiBcdFx0aWYgKG5ld19mb2xpbyA9PSBwYWdlX2ZvbGlvKGxvY2tfYXQpKVxuIFx0XHRcdGNvbnRpbnVlO1xuIFxuLVx0XHRmb2xpb191bmxvY2sobmV3X2ZvbGlvKTtcbiBcdFx0LypcbiBcdFx0ICogU3VicGFnZXMgd2hvc2UgbWFwcGluZyBoYXMgYmVlbiB6YXBwZWQgbWF5IGJlIGZyZWVkXG4gXHRcdCAqIGVhcmxpZXIsIGJ1dCBmcmVlaW5nIHRoZW0gcmVxdWlyZXMgdGFraW5nIHRoZVxuIFx0XHQgKiBscnVfbG9jaywgc28gd2UgZGVmZXIgcHV0X3BhZ2UoKSBvbiB0YWlsIHBhZ2VzIHVudGlsXG4gXHRcdCAqIGFmdGVyIHRoZSBzcGxpdCBjb21wbGV0ZXMuXG4gXHRcdCAqL1xuLVx0XHRmcmVlX2ZvbGlvX2FuZF9zd2FwX2NhY2hlKG5ld19mb2xpbyk7XG4rXHRcdGlmIChpc19zd2FwY2FjaGUpXG4rXHRcdFx0Zm9saW9fZnJlZV9zd2FwKG5ld19mb2xpbyk7XG4rXHRcdGZvbGlvX3VubG9jayhuZXdfZm9saW8pO1xuK1x0XHRmb2xpb19wdXQobmV3X2ZvbGlvKTtcbiBcdH1cbiBcbi1vdXRfdW5sb2NrOlxuLVx0aWYgKGFub25fdm1hKSB7XG4tXHRcdGFub25fdm1hX3VubG9ja193cml0ZShhbm9uX3ZtYSk7XG4tXHRcdHB1dF9hbm9uX3ZtYShhbm9uX3ZtYSk7XG4tXHR9XG4tXHRpZiAobWFwcGluZylcbi1cdFx0aV9tbWFwX3VubG9ja19yZWFkKG1hcHBpbmcpO1xuIG91dDpcbi1cdC8qIHJlc3RvcmUgdG8gY2FsbGVyJ3Mgb2xkX21lbWNnICovXG4tXHRzZXRfYWN0aXZlX21lbWNnKG9sZF9tZW1jZyk7XG4tXHRtZW1fY2dyb3VwX3B1dChtZW1jZyk7XG4tb3V0X25vX21lbWNnOlxuLVx0eGFzX2Rlc3Ryb3koXHUwMDI2eGFzKTtcbiBcdGlmIChpc19wbWRfb3JkZXIob2xkX29yZGVyKSlcbiBcdFx0Y291bnRfdm1fZXZlbnQoIXJldCA/IFRIUF9TUExJVF9QQUdFIDogVEhQX1NQTElUX1BBR0VfRkFJTEVEKTtcbiBcdGNvdW50X210aHBfc3RhdChvbGRfb3JkZXIsICFyZXQgPyBNVEhQX1NUQVRfU1BMSVQgOiBNVEhQX1NUQVRfU1BMSVRfRkFJTEVEKTtcbkBAIC00MzE4LDIyICs0MzM2LDEzIEBAIHN0YXRpYyBpbnQgX19mb2xpb19zcGxpdChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyLFxuICAqL1xuIGludCBmb2xpb19zcGxpdF91bm1hcHBlZChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyKVxuIHtcbi1cdGludCByZXQgPSAwO1xuLVxuIFx0Vk1fV0FSTl9PTl9PTkNFX0ZPTElPKGZvbGlvX21hcHBlZChmb2xpbyksIGZvbGlvKTtcbiBcdFZNX1dBUk5fT05fT05DRV9GT0xJTyghZm9saW9fdGVzdF9sb2NrZWQoZm9saW8pLCBmb2xpbyk7XG4gXHRWTV9XQVJOX09OX09OQ0VfRk9MSU8oIWZvbGlvX3Rlc3RfbGFyZ2UoZm9saW8pLCBmb2xpbyk7XG4gXHRWTV9XQVJOX09OX09OQ0VfRk9MSU8oIWZvbGlvX3Rlc3RfYW5vbihmb2xpbyksIGZvbGlvKTtcbiBcbi1cdGlmIChmb2xpb19leHBlY3RlZF9yZWZfY291bnQoZm9saW8pICE9IGZvbGlvX3JlZl9jb3VudChmb2xpbykgLSAxKVxuLVx0XHRyZXR1cm4gLUVBR0FJTjtcbi1cbi1cdGxvY2FsX2lycV9kaXNhYmxlKCk7XG4tXHRyZXQgPSBfX2ZvbGlvX2ZyZWV6ZV9hbmRfc3BsaXRfdW5tYXBwZWQoZm9saW8sIG5ld19vcmRlciwgXHUwMDI2Zm9saW8tXHUwMDNlcGFnZSwgTlVMTCxcbi1cdFx0XHRcdFx0XHROVUxMLCBmYWxzZSwgTlVMTCwgU1BMSVRfVFlQRV9VTklGT1JNLFxuLVx0XHRcdFx0XHRcdDAsIE5VTEwpO1xuLVx0bG9jYWxfaXJxX2VuYWJsZSgpO1xuLVx0cmV0dXJuIHJldDtcbitcdHJldHVybiBfX2ZvbGlvX2ZyZWV6ZV9zcGxpdF91bm1hcChmb2xpbywgbmV3X29yZGVyLCBcdTAwMjZmb2xpby1cdTAwM2VwYWdlLCBmYWxzZSxcbitcdFx0XHRcdFx0ICBmYWxzZSwgTlVMTCwgU1BMSVRfVFlQRV9VTklGT1JNKTtcbiB9XG4gXG4gLypcbkBAIC00MzUyLDExICs0MzYxLDExIEBAIGludCBmb2xpb19zcGxpdF91bm1hcHBlZChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyKVxuICAqICAgIEdVUCBwaW5zLCB3aWxsIHJlc3VsdCBpbiB0aGUgZm9saW8gbm90IGdldHRpbmcgc3BsaXQ7IGluc3RlYWQsIHRoZSBjYWxsZXJcbiAgKiAgICB3aWxsIHJlY2VpdmUgYW4gLUVBR0FJTi5cbiAgKlxuLSAqIDQpIEBuZXdfb3JkZXIgXHUwMDNlIDEsIHVzdWFsbHkuIFNwbGl0dGluZyB0byBvcmRlci0xIGFub255bW91cyBmb2xpb3MgaXMgbm90XG4tICogICAgc3VwcG9ydGVkIGZvciBub24tZmlsZS1iYWNrZWQgZm9saW9zLCBiZWNhdXNlIGZvbGlvLVx1MDAzZV9kZWZlcnJlZF9saXN0LCB3aGljaFxuLSAqICAgIGlzIHVzZWQgYnkgcGFydGlhbGx5IG1hcHBlZCBmb2xpb3MsIGlzIHN0b3JlZCBpbiBzdWJwYWdlIDIsIGJ1dCBhbiBvcmRlci0xXG4tICogICAgZm9saW8gb25seSBoYXMgc3VicGFnZXMgMCBhbmQgMS4gRmlsZS1iYWNrZWQgb3JkZXItMSBmb2xpb3MgYXJlIHN1cHBvcnRlZCxcbi0gKiAgICBzaW5jZSB0aGV5IGRvIG5vdCB1c2UgX2RlZmVycmVkX2xpc3QuXG4rICogNCkgQG5ld19vcmRlciBcdTAwM2UgMSwgdXN1YWxseS4gT3JkZXItMSBpcyBub3Qgc3VwcG9ydGVkIGZvciBhbm9uIG9yIHN3YXBjYWNoZVxuKyAqICAgIGZvbGlvczogYW5vbiBmb2xpb3MgbmVlZCBzdWJwYWdlIDIgZm9yIF9kZWZlcnJlZF9saXN0LCB3aGljaCBvcmRlci0xXG4rICogICAgZm9saW9zIGxhY2ssIGFuZCBhIHN3YXBjYWNoZSBmb2xpbyBtYXkgYmVjb21lIGFub24gb25jZSBmYXVsdGVkIGluLlxuKyAqICAgIEZpbGUtYmFja2VkIG9yZGVyLTEgZm9saW9zIGFyZSBzdXBwb3J0ZWQsIHNpbmNlIHRoZXkgZG8gbm90IHVzZVxuKyAqICAgIF9kZWZlcnJlZF9saXN0LlxuICAqXG4gICogQWZ0ZXIgc3BsaXR0aW5nLCB0aGUgY2FsbGVyJ3MgZm9saW8gcmVmZXJlbmNlIHdpbGwgYmUgdHJhbnNmZXJyZWQgdG8gQHBhZ2UsXG4gICogcmVzdWx0aW5nIGluIGEgcmFpc2VkIHJlZmNvdW50IG9mIEBwYWdlIGFmdGVyIHRoaXMgY2FsbC4gVGhlIG90aGVyIHBhZ2VzIG1heVxuZGlmZiAtLWdpdCBhL21tL3N3YXBfc3RhdGUuYyBiL21tL3N3YXBfc3RhdGUuY1xuaW5kZXggNWJlODI1OTExZTY0NS4uZjE0MDVlNWI4MTNlZSAxMDA2NDRcbi0tLSBhL21tL3N3YXBfc3RhdGUuY1xuKysrIGIvbW0vc3dhcF9zdGF0ZS5jXG5AQCAtMzg4LDggKzM4OCw5IEBAIHZvaWQgX19zd2FwX2NhY2hlX3JlcGxhY2VfZm9saW8oc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSxcbiBcdCAgICBmb2xpb19vcmRlcihvbGQpICE9IGZvbGlvX29yZGVyKG5ldykpIHtcbiBcdFx0Y2lfb2ZmID0gc3dwX2NsdXN0ZXJfb2Zmc2V0KG9sZC1cdTAwM2Vzd2FwKTtcbiBcdFx0Y2lfZW5kID0gY2lfb2ZmICsgZm9saW9fbnJfcGFnZXMob2xkKTtcbi1cdFx0d2hpbGUgKGNpX29mZisrIFx1MDAzYyBjaV9lbmQpXG4rXHRcdGRvIHtcbiBcdFx0XHRXQVJOX09OX09OQ0Uoc3dwX3RiX3RvX2ZvbGlvKF9fc3dhcF90YWJsZV9nZXQoY2ksIGNpX29mZikpICE9IG9sZCk7XG4rXHRcdH0gd2hpbGUgKCsrY2lfb2ZmIFx1MDAzYyBjaV9lbmQpO1xuIFx0fVxuIH1cbiBcbiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA3VDIxOjU0OjA3LjQ1MjUyMjA1NVoiLCJTZXEiOjMsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjcwNjg4Nzk0NDYsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIHRoZSBGb2xpbyBTcGxpdHRpbmcgUGF0Y2gqKlxuXG5BbHJpZ2h0LCBsZXQncyBicmVhayBkb3duIHRoaXMgcGF0Y2guIEkgc2VlIG1vZGlmaWNhdGlvbnMgdG91Y2hpbmcgYG1tL2h1Z2VfbWVtb3J5LmNgIGFuZCBgbW0vc3dhcF9zdGF0ZS5jYC4gSXQncyBjbGVhcmx5IGEgY29yZSBtZW1vcnkgbWFuYWdlbWVudCBjaGFuZ2UsIHNwZWNpZmljYWxseSByZWxhdGVkIHRvIGhvdyB3ZSBoYW5kbGUgZm9saW8gc3BsaXR0aW5nLCBwYXJ0aWN1bGFybHkgYXJvdW5kIGh1Z2UgcGFnZXMuIFRoZSBmYWN0IHRoYXQgaXQgcmV3b3JrcyB0aGUgc3BsaXR0aW5nIG9mIHVubWFwcGVkIGZvbGlvcyDigJMgYW5kLCBjcml0aWNhbGx5LCBkaXN0aW5ndWlzaGVzIGJldHdlZW4gYW5vbnltb3VzLCBzd2FwY2FjaGUsIGFuZCBmaWxlLWJhY2tlZCBmb2xpb3Mg4oCTIGltbWVkaWF0ZWx5IHRlbGxzIG1lIHRoaXMgaGFzIGZ1bmN0aW9uYWwgaW1wbGljYXRpb25zIHdlIG5lZWQgdG8gcmVhbGx5IGRpZyBpbnRvLiBEZWZpbml0ZWx5IGZ1enppbmcgbWF0ZXJpYWwuXG5cbkknbSBzZWVpbmcgdGhhdCBgX19mb2xpb19mcmVlemVfc3BsaXRfdW5tYXBgIGFuZCBgX19mb2xpb19mcmVlemVfc3BsaXRfdW5tYXBfZmlsZWAgaGF2ZSBiZWVuIGludHJvZHVjZWQgdG8gcmVwbGFjZSBgX19mb2xpb19mcmVlemVfYW5kX3NwbGl0X3VubWFwcGVkYCwgd2hpY2ggaXMgYSBzdHJvbmcgaW5kaWNhdG9yIG9mIHJlZmluZWQgbG9naWMgaGVyZS4gVGhlcmUncyBhbHNvIHNvbWUgc3VidGxlIGJlaGF2aW9yIGNoYW5nZXMgaW4gYGZvbGlvX2NoZWNrX3NwbGl0dGFibGVgIHdoZW4gaXQgY29tZXMgdG8gc3dhcGNhY2hlIGZvbGlvcy4gVGhlIGNvcmUgb2YgdGhpcyBzZWVtcyB0byBiZSBkcml2ZW4gYnkgbW9kaWZpY2F0aW9ucyB0byB0aGUgYF9fZm9saW9fc3BsaXRgIGZ1bmN0aW9uLCB3aGljaCBub3cgY2FsbHMgdGhlIG5ld2x5IGRlZmluZWQgZnVuY3Rpb25zLlxuXG5Ob3csIGxldCdzIGlkZW50aWZ5IHRoZSBrZXkgZnVuY3Rpb25zIHRvIHJlYWxseSBmb2N1cyBvbi4gSSdtIHNlZWluZyBjaGFuZ2VzIHRvOiBgZm9saW9fY2hlY2tfc3BsaXR0YWJsZWAsIHRoZSBzdGF0aWMgaGVscGVycyBgX19mb2xpb19mcmVlemVfc3BsaXRfdW5tYXBgLCBgX19mb2xpb19mcmVlemVfc3BsaXRfdW5tYXBfZmlsZWAgYW5kIGBfX2ZvbGlvX3NwbGl0YCwgYW5kIHRoZSBnbG9iYWwgZnVuY3Rpb25zIGBmb2xpb19zcGxpdF91bm1hcHBlZGAgYW5kIGBfX3N3YXBfY2FjaGVfcmVwbGFjZV9mb2xpb2AuXG5cbk9rYXksIG15IGluaXRpYWwgdGhvdWdodHMgcG9pbnQgbWUgdG93YXJkcyBgZm9saW9fc3BsaXRfdW5tYXBwZWRgIGFuZCBpdHMgaW50ZXJhY3Rpb24gd2l0aCBgc3BsaXRfaHVnZV9wYWdlX3RvX2xpc3RfdG9fb3JkZXJgLiBgc3BsaXRfaHVnZV9wYWdlX3RvX2xpc3RfdG9fb3JkZXJgIGxvb2tzIGxpa2UgdGhlIG1haW4gZW50cnkgcG9pbnQgZm9yIHNwbGl0dGluZyBodWdlIHBhZ2VzLCB0aGUgcmVhbCBtZWF0IG9mIHRoZSBvcGVyYXRpb24uIFNvLCBJIHNob3VsZCBzdGFydCBieSBsb29raW5nIGZvciB3aGVyZSBgc3BsaXRfaHVnZV9wYWdlX3RvX2xpc3RfdG9fb3JkZXJgIG9yIHNpbXBseSBgc3BsaXRfaHVnZV9wYWdlYCBpcyBjYWxsZWQgd2l0aGluIGBtbS9odWdlX21lbW9yeS5jYCB0byBzZWUgaG93IGl0J3MgYmVpbmcgaW52b2tlZC5cblxuXG4iLCJJbnB1dFRva2VucyI6MTE0MTksIk91dHB1dFRva2VucyI6MzIsIk91dHB1dFRob3VnaHRzVG9rZW5zIjozNTcsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0wN1QyMTo1NDoxNC41MjE0MDM2NjFaIiwiU2VxIjo0LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NjUwNTEwMjUsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwic3BsaXRfaHVnZV9wYWdlXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIm1tL2h1Z2VfbWVtb3J5LmNcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwibW0vaHVnZV9tZW1vcnkuYz00MzM3PWludCBmb2xpb19zcGxpdF91bm1hcHBlZChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyKVxcbi0tXFxubW0vaHVnZV9tZW1vcnkuYy00Mzk0LSAqL1xcbm1tL2h1Z2VfbWVtb3J5LmM6NDM5NTppbnQgX19zcGxpdF9odWdlX3BhZ2VfdG9fbGlzdF90b19vcmRlcihzdHJ1Y3QgcGFnZSAqcGFnZSwgc3RydWN0IGxpc3RfaGVhZCAqbGlzdCxcXG5tbS9odWdlX21lbW9yeS5jLTQzOTYtXFx0XFx0XFx0XFx0ICAgICB1bnNpZ25lZCBpbnQgbmV3X29yZGVyKVxcbi0tXFxubW0vaHVnZV9tZW1vcnkuYy00NDEyLSAqIEl0IGhhcyB0aGUgc2FtZSBwcmVyZXF1aXNpdGVzIGFuZCByZXR1cm5zIGFzXFxubW0vaHVnZV9tZW1vcnkuYzo0NDEzOiAqIHNwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyKCkuXFxubW0vaHVnZV9tZW1vcnkuYy00NDE0LSAqXFxuLS1cXG5tbS9odWdlX21lbW9yeS5jPTQ0NjI9aW50IHNwbGl0X2ZvbGlvX3RvX2xpc3Qoc3RydWN0IGZvbGlvICpmb2xpbywgc3RydWN0IGxpc3RfaGVhZCAqbGlzdClcXG5tbS9odWdlX21lbW9yeS5jLTQ0NjMte1xcbm1tL2h1Z2VfbWVtb3J5LmM6NDQ2NDpcXHRyZXR1cm4gc3BsaXRfaHVnZV9wYWdlX3RvX2xpc3RfdG9fb3JkZXIoXFx1MDAyNmZvbGlvLVxcdTAwM2VwYWdlLCBsaXN0LCAwKTtcXG5tbS9odWdlX21lbW9yeS5jLTQ0NjUtfVxcbi0tXFxubW0vaHVnZV9tZW1vcnkuYz00NjIxPXN0YXRpYyB1bnNpZ25lZCBsb25nIGRlZmVycmVkX3NwbGl0X3NjYW4oc3RydWN0IHNocmlua2VyICpzaHJpbmssXFxuLS1cXG5tbS9odWdlX21lbW9yeS5jLTQ2ODMtI2lmZGVmIENPTkZJR19ERUJVR19GU1xcbm1tL2h1Z2VfbWVtb3J5LmM6NDY4NDpzdGF0aWMgdm9pZCBzcGxpdF9odWdlX3BhZ2VzX2FsbCh2b2lkKVxcbm1tL2h1Z2VfbWVtb3J5LmMtNDY4NS17XFxuLS1cXG5tbS9odWdlX21lbW9yeS5jPTQ3MzQ9c3RhdGljIGlubGluZSBib29sIHZtYV9ub3Rfc3VpdGFibGVfZm9yX3RocF9zcGxpdChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSlcXG4tLVxcbm1tL2h1Z2VfbWVtb3J5LmMtNDc0Ny1cXG5tbS9odWdlX21lbW9yeS5jOjQ3NDg6c3RhdGljIGludCBzcGxpdF9odWdlX3BhZ2VzX3BpZChpbnQgcGlkLCB1bnNpZ25lZCBsb25nIHZhZGRyX3N0YXJ0LFxcbm1tL2h1Z2VfbWVtb3J5LmMtNDc0OS1cXHRcXHRcXHRcXHR1bnNpZ25lZCBsb25nIHZhZGRyX2VuZCwgdW5zaWduZWQgaW50IG5ld19vcmRlcixcXG4tLVxcbm1tL2h1Z2VfbWVtb3J5LmMtNDgxNy1cXHRcXHQvKlxcbm1tL2h1Z2VfbWVtb3J5LmM6NDgxODpcXHRcXHQgKiBGb3IgZm9saW9zIHdpdGggcHJpdmF0ZSwgc3BsaXRfaHVnZV9wYWdlX3RvX2xpc3RfdG9fb3JkZXIoKVxcbm1tL2h1Z2VfbWVtb3J5LmMtNDgxOS1cXHRcXHQgKiB3aWxsIHRyeSB0byBkcm9wIGl0IGJlZm9yZSBzcGxpdCBhbmQgdGhlbiBjaGVjayBpZiB0aGUgZm9saW9cXG4tLVxcbm1tL2h1Z2VfbWVtb3J5LmMtNDg2NC1cXG5tbS9odWdlX21lbW9yeS5jOjQ4NjU6c3RhdGljIGludCBzcGxpdF9odWdlX3BhZ2VzX2luX2ZpbGUoY29uc3QgY2hhciAqZmlsZV9wYXRoLCBwZ29mZl90IG9mZl9zdGFydCxcXG5tbS9odWdlX21lbW9yeS5jLTQ4NjYtXFx0XFx0XFx0XFx0cGdvZmZfdCBvZmZfZW5kLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyLFxcbi0tXFxubW0vaHVnZV9tZW1vcnkuYy00OTM0LVxcbm1tL2h1Z2VfbWVtb3J5LmM6NDkzNTpzdGF0aWMgc3NpemVfdCBzcGxpdF9odWdlX3BhZ2VzX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLFxcbm1tL2h1Z2VfbWVtb3J5LmMtNDkzNi1cXHRcXHRcXHRcXHRzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcHMpXFxuLS1cXG5tbS9odWdlX21lbW9yeS5jLTQ5ODItXFx0XFx0fVxcbm1tL2h1Z2VfbWVtb3J5LmM6NDk4MzpcXHRcXHRyZXQgPSBzcGxpdF9odWdlX3BhZ2VzX2luX2ZpbGUoZmlsZV9wYXRoLCBvZmZfc3RhcnQsIG9mZl9lbmQsXFxubW0vaHVnZV9tZW1vcnkuYy00OTg0LVxcdFxcdFxcdFxcdG5ld19vcmRlciwgaW5fZm9saW9fb2Zmc2V0KTtcXG4tLVxcbm1tL2h1Z2VfbWVtb3J5LmMtNDk5My1cXHRpZiAocmV0ID09IDEgXFx1MDAyNlxcdTAwMjYgcGlkID09IDEpIHtcXG5tbS9odWdlX21lbW9yeS5jOjQ5OTQ6XFx0XFx0c3BsaXRfaHVnZV9wYWdlc19hbGwoKTtcXG5tbS9odWdlX21lbW9yeS5jLTQ5OTUtXFx0XFx0cmV0ID0gc3RybGVuKGlucHV0X2J1Zik7XFxuLS1cXG5tbS9odWdlX21lbW9yeS5jLTUwMDEtXFxubW0vaHVnZV9tZW1vcnkuYzo1MDAyOlxcdHJldCA9IHNwbGl0X2h1Z2VfcGFnZXNfcGlkKHBpZCwgdmFkZHJfc3RhcnQsIHZhZGRyX2VuZCwgbmV3X29yZGVyLFxcbm1tL2h1Z2VfbWVtb3J5LmMtNTAwMy1cXHRcXHRcXHRpbl9mb2xpb19vZmZzZXQpO1xcbi0tXFxubW0vaHVnZV9tZW1vcnkuYy01MDExLVxcbm1tL2h1Z2VfbWVtb3J5LmM6NTAxMjpzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBzcGxpdF9odWdlX3BhZ2VzX2ZvcHMgPSB7XFxubW0vaHVnZV9tZW1vcnkuYy01MDEzLVxcdC5vd25lclxcdCA9IFRISVNfTU9EVUxFLFxcbm1tL2h1Z2VfbWVtb3J5LmM6NTAxNDpcXHQud3JpdGVcXHQgPSBzcGxpdF9odWdlX3BhZ2VzX3dyaXRlLFxcbm1tL2h1Z2VfbWVtb3J5LmMtNTAxNS19O1xcbm1tL2h1Z2VfbWVtb3J5LmMtNTAxNi1cXG5tbS9odWdlX21lbW9yeS5jOjUwMTc6c3RhdGljIGludCBfX2luaXQgc3BsaXRfaHVnZV9wYWdlc19kZWJ1Z2ZzKHZvaWQpXFxubW0vaHVnZV9tZW1vcnkuYy01MDE4LXtcXG5tbS9odWdlX21lbW9yeS5jOjUwMTk6XFx0ZGVidWdmc19jcmVhdGVfZmlsZShcXFwic3BsaXRfaHVnZV9wYWdlc1xcXCIsIDAyMDAsIE5VTEwsIE5VTEwsXFxubW0vaHVnZV9tZW1vcnkuYzo1MDIwOlxcdFxcdFxcdCAgICBcXHUwMDI2c3BsaXRfaHVnZV9wYWdlc19mb3BzKTtcXG5tbS9odWdlX21lbW9yeS5jLTUwMjEtXFx0cmV0dXJuIDA7XFxubW0vaHVnZV9tZW1vcnkuYy01MDIyLX1cXG5tbS9odWdlX21lbW9yeS5jOjUwMjM6bGF0ZV9pbml0Y2FsbChzcGxpdF9odWdlX3BhZ2VzX2RlYnVnZnMpO1xcbm1tL2h1Z2VfbWVtb3J5LmMtNTAyNC0jZW5kaWZcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDdUMjE6NTQ6MTQuNTg2NDU2NTU2WiIsIlNlcSI6NSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NDA0OTczNTg3NywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgRm9saW8gU3BsaXR0aW5nIGFuZCBTd2FwIENhY2hlIE9wZXJhdGlvbnMqKlxuXG5Pa2F5LCBzbyBJJ3ZlIGJlZW4gbG9va2luZyBhdCBob3cgZm9saW8gc3BsaXR0aW5nIGFuZCB0aGUgc3dhcCBjYWNoZSBpbnRlcmFjdC4gSSBzZWUgdGhhdCB0aGVzZSBmdW5jdGlvbnMgaGF2ZSBiZWVuIHRvdWNoZWQ6IGBmb2xpb19jaGVja19zcGxpdHRhYmxlYCwgYF9fZm9saW9fZnJlZXplX3NwbGl0X3VubWFwYCwgYF9fZm9saW9fZnJlZXplX3NwbGl0X3VubWFwX2ZpbGVgLCBgX19mb2xpb19zcGxpdGAsIGBmb2xpb19zcGxpdF91bm1hcHBlZGAsIGFuZCBgX19zd2FwX2NhY2hlX3JlcGxhY2VfZm9saW9gLiBUaGF0J3MgYSBkZWNlbnQtc2l6ZWQgbGlzdCwgYW5kIEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoZSBpbXBsaWNhdGlvbnMgb2YgdGhlc2UgY2hhbmdlcy5cblxuSSBuZWVkIHRvIGZvY3VzIG9uIGBmb2xpb19zcGxpdF91bm1hcHBlZGAgYW5kIGBfX3N3YXBfY2FjaGVfcmVwbGFjZV9mb2xpb2Agc3BlY2lmaWNhbGx5LiBUaGVzZSBhcmUgdGhlIHR3byB0aGF0IGFyZSBzY3JlYW1pbmcgdGhlIGxvdWRlc3QgcmlnaHQgbm93LiBUaGUgaW50ZXJwbGF5IGJldHdlZW4gc3BsaXR0aW5nIGZvbGlvcyB0aGF0IGFyZSAqdW5tYXBwZWQqIGFuZCBob3cgdGhhdCBpbXBhY3RzIHRoZSBzd2FwIGNhY2hlIGlzIHdoZXJlIEkgYW50aWNpcGF0ZSBmaW5kaW5nIHRoZSBjb3JlIG9mIHRoZSBpc3N1ZSAob3IgdGhlIGltcHJvdmVtZW50LCBkZXBlbmRpbmcpLiBHb3R0YSBmaWd1cmUgb3V0IGhvdyB0aGUgdW5tYXBwaW5nIGlzIGhhbmRsZWQgZHVyaW5nIHRoZSBzcGxpdCwgYW5kIHRoZW4sIGNydWNpYWxseSwgaG93IHRoZSBzd2FwIGNhY2hlIHVwZGF0ZXMgaXRzIHZpZXcgb2YgdGhlIHBhZ2VzIGFmdGVyIHRoZSBzcGxpdCBoYXMgb2NjdXJyZWQuIEkgbmVlZCB0byBrZWVwIGEgY2xvc2UgZXllIG91dCBmb3IgcG90ZW50aWFsIHJhY2VzLCBtaXNzZWQgaW52YWxpZGF0aW9ucywgb3IgaW5jb3JyZWN0IHJlZmVyZW5jZSBjb3VudHMuIEkgZXhwZWN0IHRoZXNlIHR3byBmdW5jdGlvbnMgd2lsbCBiZSB0aGUga2V5cyB0byB1bmRlcnN0YW5kaW5nIHRoZSBjaGFuZ2VzIGluIHRoaXMgcGF0Y2guXG5cblxuIiwiSW5wdXRUb2tlbnMiOjEzNTYyLCJPdXRwdXRUb2tlbnMiOjI2LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6OTgsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDdUMjE6NTQ6MTguNjM2MTk0MTkzWiIsIlNlcSI6NiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE2NTY0NDcyMTQsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiZm9saW9fc3BsaXRfdW5tYXBwZWRcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwiXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImluY2x1ZGUvbGludXgvaHVnZV9tbS5oPTQwMz1pbnQgX19zcGxpdF9odWdlX3BhZ2VfdG9fbGlzdF90b19vcmRlcihzdHJ1Y3QgcGFnZSAqcGFnZSwgc3RydWN0IGxpc3RfaGVhZCAqbGlzdCxcXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaC00MDQtXFx0XFx0dW5zaWduZWQgaW50IG5ld19vcmRlcik7XFxuaW5jbHVkZS9saW51eC9odWdlX21tLmg6NDA1OmludCBmb2xpb19zcGxpdF91bm1hcHBlZChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyKTtcXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaC00MDYtdW5zaWduZWQgaW50IG1pbl9vcmRlcl9mb3Jfc3BsaXQoc3RydWN0IGZvbGlvICpmb2xpbyk7XFxuLS1cXG5tbS9odWdlX21lbW9yeS5jPTQyNDc9c3RhdGljIGludCBfX2ZvbGlvX3NwbGl0KHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIsXFxuLS1cXG5tbS9odWdlX21lbW9yeS5jLTQzMTUtLyoqXFxubW0vaHVnZV9tZW1vcnkuYzo0MzE2OiAqIGZvbGlvX3NwbGl0X3VubWFwcGVkKCkgLSBzcGxpdCBhIGxhcmdlIGFub24gZm9saW8gdGhhdCBpcyBhbHJlYWR5IHVubWFwcGVkXFxubW0vaHVnZV9tZW1vcnkuYy00MzE3LSAqIEBmb2xpbzogZm9saW8gdG8gc3BsaXRcXG4tLVxcbm1tL2h1Z2VfbWVtb3J5LmMtNDMzNi0gKi9cXG5tbS9odWdlX21lbW9yeS5jOjQzMzc6aW50IGZvbGlvX3NwbGl0X3VubWFwcGVkKHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIpXFxubW0vaHVnZV9tZW1vcnkuYy00MzM4LXtcXG4tLVxcbm1tL21pZ3JhdGVfZGV2aWNlLmM9OTEyPXN0YXRpYyBpbnQgbWlncmF0ZV92bWFfc3BsaXRfdW5tYXBwZWRfZm9saW8oc3RydWN0IG1pZ3JhdGVfdm1hICptaWdyYXRlLFxcbi0tXFxubW0vbWlncmF0ZV9kZXZpY2UuYy05MjYtXFx0c3BsaXRfaHVnZV9wbWRfYWRkcmVzcyhtaWdyYXRlLVxcdTAwM2V2bWEsIGFkZHIsIHRydWUpO1xcbm1tL21pZ3JhdGVfZGV2aWNlLmM6OTI3OlxcdHJldCA9IGZvbGlvX3NwbGl0X3VubWFwcGVkKGZvbGlvLCAwKTtcXG5tbS9taWdyYXRlX2RldmljZS5jLTkyOC1cXHRpZiAocmV0KVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0wN1QyMTo1NDoyMC4yOTI2NDYzNzdaIiwiU2VxIjo3LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjozNzE0MTM5NjQxLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBoZXJlJ3MgbXkgdGFrZSBvbiB0aG9zZSB0aG91Z2h0cywgZnJhbWVkIGZyb20gbXkgZXhwZXJ0IHBlcnNwZWN0aXZlOlxuXG4qKkRpdmluZyBpbnRvIHRoZSBGb2xpbyBTd2FwIENhY2hlKipcblxuUmlnaHQsIHNvIGBmb2xpb19zcGxpdF91bm1hcHBlZGAgaXMgYmVpbmcgY2FsbGVkIGZyb20gYG1pZ3JhdGVfdm1hX3NwbGl0X3VubWFwcGVkX2ZvbGlvYCB3aXRoaW4gYG1tL21pZ3JhdGVfZGV2aWNlLmNgLiBUaGF0J3MgdGhlIGtleS4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgd2hhdCdzIGhhcHBlbmluZyBkdXJpbmcgdGhpcyB1bm1hcHBlZCBmb2xpbyBzcGxpdCBhcyBwYXJ0IG9mIHRoZSBWTUEgbWlncmF0aW9uIHByb2Nlc3MuIFNwZWNpZmljYWxseSwgSSBuZWVkIHRvIGtub3cgaG93IHRoZXNlIHVubWFwcGVkIGZvbGlvcyBhcmUgYmVpbmcgaGFuZGxlZCB3aGVuIHNwbGl0LlxuXG5NeSBndXQgZmVlbGluZyBpcyB0aGF0IGFueSB0aW1lIHdlIGFyZSBtaWdyYXRpbmcgVk1BcyBhbmQgd2UgYXJlIHNwbGl0dGluZyBhbiB1bm1hcHBlZCBmb2xpbywgaXQgbWVhbnMgdGhpcyBtdXN0IGJlIHZlcnkgaW1wb3J0YW50LlxuXG5UaGUgbmV4dCBsb2dpY2FsIHN0ZXAgaXMgdG8gZGl2ZSBpbnRvIGBfX3N3YXBfY2FjaGVfcmVwbGFjZV9mb2xpb2AuIFRoYXQgZnVuY3Rpb24gaXMgY3J1Y2lhbCB0byBmb2xpbyBzd2FwcGluZyBvcGVyYXRpb25zLCBzbyBJJ20gZ3Vlc3NpbmcgdGhhdCBpdCB3aWxsIHBsYXkgYSByb2xlIGluIGhvdyB1bm1hcHBlZCBmb2xpb3MgYXJlIGhhbmRsZWQuIEkgZXhwZWN0IHRvIGZpbmQgc29tZSBjcml0aWNhbCBjb250ZXh0IHRoZXJlIGFyb3VuZCBob3cgdGhlc2Ugc3BsaXQgdW5tYXBwZWQgZm9saW9zIGFyZSBpbnRlZ3JhdGVkIHdpdGggdGhlIHN3YXAgY2FjaGUsIGFuZCBpZiB0aGVyZSBhcmUgYW55IHNwZWNpZmljIGNvbnNpZGVyYXRpb25zIGZvciB1bm1hcHBlZCBmb2xpb3MuIEkgbmVlZCB0byB1bmRlcnN0YW5kIGlmIHRoaXMgaXMgYSBjcml0aWNhbCBjb2RlIHBhdGgsIG9yIGlmIG90aGVyIGNhbGxzIGFyZSBtb3JlIHNpZ25pZmljYW50LlxuXG5cbiIsIklucHV0VG9rZW5zIjoxNDM3OCwiT3V0cHV0VG9rZW5zIjoyOCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjQ5LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA3VDIxOjU0OjI0LjAwNjc4ODE4OFoiLCJTZXEiOjgsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxODExMzE5MTczLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcIl9fc3dhcF9jYWNoZV9yZXBsYWNlX2ZvbGlvXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIlwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJtbS9odWdlX21lbW9yeS5jPTM5MjY9c3RhdGljIGludCBfX2ZvbGlvX2ZyZWV6ZV9zcGxpdF91bm1hcChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyLFxcbi0tXFxubW0vaHVnZV9tZW1vcnkuYy00MDMzLVxcdFxcdGlmIChjaSlcXG5tbS9odWdlX21lbW9yeS5jOjQwMzQ6XFx0XFx0XFx0X19zd2FwX2NhY2hlX3JlcGxhY2VfZm9saW8oY2ksIGZvbGlvLCBuZXdfZm9saW8pO1xcbm1tL2h1Z2VfbWVtb3J5LmMtNDAzNS1cXHR9XFxuLS1cXG5tbS9taWdyYXRlLmM9NTgzPXN0YXRpYyBpbnQgX19mb2xpb19taWdyYXRlX21hcHBpbmcoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsXFxuLS1cXG5tbS9taWdyYXRlLmMtNjU2LVxcdGlmIChmb2xpb190ZXN0X3N3YXBjYWNoZShmb2xpbykpXFxubW0vbWlncmF0ZS5jOjY1NzpcXHRcXHRfX3N3YXBfY2FjaGVfcmVwbGFjZV9mb2xpbyhjaSwgZm9saW8sIG5ld2ZvbGlvKTtcXG5tbS9taWdyYXRlLmMtNjU4LVxcdGVsc2VcXG4tLVxcbm1tL3NobWVtLmM9MjA4OD1zdGF0aWMgaW50IHNobWVtX3JlcGxhY2VfZm9saW8oc3RydWN0IGZvbGlvICoqZm9saW9wLCBnZnBfdCBnZnAsXFxuLS1cXG5tbS9zaG1lbS5jLTIxMjUtXFx0Y2kgPSBzd2FwX2NsdXN0ZXJfZ2V0X2FuZF9sb2NrX2lycShvbGQpO1xcbm1tL3NobWVtLmM6MjEyNjpcXHRfX3N3YXBfY2FjaGVfcmVwbGFjZV9mb2xpbyhjaSwgb2xkLCBuZXcpO1xcbm1tL3NobWVtLmMtMjEyNy1cXHRtZW1fY2dyb3VwX3JlcGxhY2VfZm9saW8ob2xkLCBuZXcpO1xcbi0tXFxubW0vc3dhcC5oPTM0Mj12b2lkIF9fc3dhcF9jYWNoZV9kZWxfZm9saW8oc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSxcXG5tbS9zd2FwLmgtMzQzLVxcdFxcdFxcdCAgICBzdHJ1Y3QgZm9saW8gKmZvbGlvLCBzd3BfZW50cnlfdCBlbnRyeSwgdm9pZCAqc2hhZG93KTtcXG5tbS9zd2FwLmg6MzQ0OnZvaWQgX19zd2FwX2NhY2hlX3JlcGxhY2VfZm9saW8oc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSxcXG5tbS9zd2FwLmgtMzQ1LVxcdFxcdFxcdFxcdHN0cnVjdCBmb2xpbyAqb2xkLCBzdHJ1Y3QgZm9saW8gKm5ldyk7XFxuLS1cXG5tbS9zd2FwLmg9NDc2PXN0YXRpYyBpbmxpbmUgdm9pZCBfX3N3YXBfY2FjaGVfZGVsX2ZvbGlvKHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2ksXFxuLS1cXG5tbS9zd2FwLmgtNDgwLVxcbm1tL3N3YXAuaDo0ODE6c3RhdGljIGlubGluZSB2b2lkIF9fc3dhcF9jYWNoZV9yZXBsYWNlX2ZvbGlvKHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2ksXFxubW0vc3dhcC5oLTQ4Mi1cXHRcXHRzdHJ1Y3QgZm9saW8gKm9sZCwgc3RydWN0IGZvbGlvICpuZXcpXFxuLS1cXG5tbS9zd2FwX3N0YXRlLmM9MzM1PXZvaWQgc3dhcF9jYWNoZV9kZWxfZm9saW8oc3RydWN0IGZvbGlvICpmb2xpbylcXG4tLVxcbm1tL3N3YXBfc3RhdGUuYy0zNDctLyoqXFxubW0vc3dhcF9zdGF0ZS5jOjM0ODogKiBfX3N3YXBfY2FjaGVfcmVwbGFjZV9mb2xpbyAtIFJlcGxhY2UgYSBmb2xpbyBpbiB0aGUgc3dhcCBjYWNoZS5cXG5tbS9zd2FwX3N0YXRlLmMtMzQ5LSAqIEBjaTogVGhlIGxvY2tlZCBzd2FwIGNsdXN0ZXIuXFxuLS1cXG5tbS9zd2FwX3N0YXRlLmMtMzYwLSAqL1xcbm1tL3N3YXBfc3RhdGUuYzozNjE6dm9pZCBfX3N3YXBfY2FjaGVfcmVwbGFjZV9mb2xpbyhzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpLFxcbm1tL3N3YXBfc3RhdGUuYy0zNjItXFx0XFx0XFx0XFx0c3RydWN0IGZvbGlvICpvbGQsIHN0cnVjdCBmb2xpbyAqbmV3KVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0wN1QyMTo1NDoyNS44MTgxMTExMDFaIiwiU2VxIjo5LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo0NzQ5MDg0NTM4LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyB0aGUgS2VybmVsIFBhdGNoIGZvciBTd2FwIGFuZCBUSFAgSW50ZXJhY3Rpb24qKlxuXG5Pa2F5LCBzbyBJJ20gbG9va2luZyBhdCB0aGlzIHBhdGNoIGFuZCBpdCBzZWVtcyB0byBiZSBjZW50ZXJlZCBhcm91bmQgdGhlIGludGVyYWN0aW9uIG9mIFRyYW5zcGFyZW50IEh1Z2UgUGFnZXMgKFRIUCkgYW5kIHRoZSBzd2FwIGNhY2hlLCBzcGVjaWZpY2FsbHkgaW4gdGhlIG1lbW9yeSBtYW5hZ2VtZW50IHN1YnN5c3RlbS4gTXkgaW5pdGlhbCB0aG91Z2h0IGlzIHRoYXQgdGhlIGNvcmUgY2hhbmdlIGFwcGVhcnMgdG8gYmUgYSBtb2RpZmljYXRpb24gd2l0aGluIGBtbS9zd2FwX3N0YXRlLmNgLCBzcGVjaWZpY2FsbHkgdG8gdGhlIGBfX3N3YXBfY2FjaGVfcmVwbGFjZV9mb2xpb2AgZnVuY3Rpb24uIEluc3RlYWQgb2YgdXNpbmcgYSBgd2hpbGVgIGxvb3AsIHRoZXkndmUgc3dpdGNoZWQgdG8gYSBgZG8geyAuLi4gfSB3aGlsZWAgY29uc3RydWN0LiBJJ2xsIG5lZWQgdG8gZHJpbGwgZG93biB0byB1bmRlcnN0YW5kIHRoZSByYXRpb25hbGUgYmVoaW5kIHRoYXQgY2hhbmdlLlxuXG5UaGUgb3RoZXIgY3J1Y2lhbCBhcmVhIHNlZW1zIHRvIGJlIHdpdGhpbiBgbW0vaHVnZV9tZW1vcnkuY2AsIGFuZCBJJ20gZ3Vlc3NpbmcgdGhhdCB0aGlzIGlzIHdoZXJlIHRoZSBUSFAtc3BlY2lmaWMgbG9naWMgY29tZXMgaW50byBwbGF5LiBJJ2xsIG5lZWQgdG8gbWV0aWN1bG91c2x5IGFuYWx5emUgdGhlIGZvbGxvd2luZyBmdW5jdGlvbnM6IGBzcGxpdF9odWdlX3BhZ2VfdG9fbGlzdF90b19vcmRlcmAsIGBmb2xpb19zcGxpdF91bm1hcHBlZGAsIGBfX3N3YXBfY2FjaGVfcmVwbGFjZV9mb2xpb2AgKGFnYWluLCB0byB1bmRlcnN0YW5kIHRoZSBpbnRlcmFjdGlvbnMpLCBhbmQgYHNwbGl0X2ZvbGlvX3RvX2xpc3RgLiBUaGVzZSBhcmUgdGhlIGtleSBwaWVjZXMgdG8gdW5kZXJzdGFuZCBob3cgYSBodWdlIHBhZ2UgaXMgaGFuZGxlZCB3aGVuIGl0IG5lZWRzIHRvIGJlIHN3YXBwZWQuXG5cbkJlZm9yZSBJIGdvIGZ1cnRoZXIsIEknbGwgcXVpY2tseSBjaGVjayB0aGUgS2NvbmZpZyBzZXR0aW5ncy4gSSBuZWVkIHRvIG1ha2Ugc3VyZSBgQ09ORklHX1RSQU5TUEFSRU5UX0hVR0VQQUdFYCBpcyBlbmFibGVkIGJlY2F1c2UgaXQncyByZXF1aXJlZCBmb3IgVEhQIGZ1bmN0aW9uYWxpdHkgdG8gYmUgcHJlc2VudC4gU2ltaWxhcmx5LCBJJ2xsIGNvbmZpcm0gYENPTkZJR19TV0FQYCBpcyBlbmFibGVkLCBhcyB0aGlzIHdpbGwgYWxsb3cgZm9yIHN3YXBjYWNoZSB0byBiZSBpbiBlZmZlY3QuIEkgc2hvdWxkIGFsc28gZ2xhbmNlIGZvciBhbnkgb3RoZXIgcmVsYXRlZCBjb25maWdzLCBqdXN0IHRvIGVuc3VyZSBJIGhhdmUgdGhlIGZ1bGwgcGljdHVyZS5cblxuXG4iLCJJbnB1dFRva2VucyI6MTU0MjgsIk91dHB1dFRva2VucyI6MjgsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxNjUsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDdUMjE6NTQ6MzAuNTY3MTk4MDQ5WiIsIlNlcSI6MTAsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNjU0ODQ0NzM0LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRVwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwibW0vS2NvbmZpZz04MzE9Y29uZmlnIE1NX0lEXFxuLS1cXG5tbS9LY29uZmlnLTgzMy1cXG5tbS9LY29uZmlnOjgzNDptZW51Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFXFxubW0vS2NvbmZpZy04MzUtXFx0Ym9vbCBcXFwiVHJhbnNwYXJlbnQgSHVnZXBhZ2UgU3VwcG9ydFxcXCJcXG4tLVxcbm1tL0tjb25maWc9ODUyPWNob2ljZVxcbi0tXFxubW0vS2NvbmZpZy04NTctXFxubW0vS2NvbmZpZzo4NTg6XFx0Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX0FMV0FZU1xcbm1tL0tjb25maWctODU5LVxcdFxcdGJvb2wgXFxcImFsd2F5c1xcXCJcXG4tLVxcbm1tL0tjb25maWctODY0LVxcbm1tL0tjb25maWc6ODY1OlxcdGNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRV9NQURWSVNFXFxubW0vS2NvbmZpZy04NjYtXFx0XFx0Ym9vbCBcXFwibWFkdmlzZVxcXCJcXG4tLVxcbm1tL0tjb25maWctODczLVxcbm1tL0tjb25maWc6ODc0OlxcdGNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRV9ORVZFUlxcbm1tL0tjb25maWctODc1LVxcdFxcdGJvb2wgXFxcIm5ldmVyXFxcIlxcbi0tXFxubW0vS2NvbmZpZz04ODE9Y2hvaWNlXFxuLS1cXG5tbS9LY29uZmlnLTg5MC1cXG5tbS9LY29uZmlnOjg5MTpcXHRjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VfU0hNRU1fSFVHRV9ORVZFUlxcbm1tL0tjb25maWctODkyLVxcdFxcdGJvb2wgXFxcIm5ldmVyXFxcIlxcbi0tXFxubW0vS2NvbmZpZy05MDAtXFxubW0vS2NvbmZpZzo5MDE6XFx0Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX1NITUVNX0hVR0VfQUxXQVlTXFxubW0vS2NvbmZpZy05MDItXFx0XFx0Ym9vbCBcXFwiYWx3YXlzXFxcIlxcbi0tXFxubW0vS2NvbmZpZy05MDgtXFxubW0vS2NvbmZpZzo5MDk6XFx0Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX1NITUVNX0hVR0VfV0lUSElOX1NJWkVcXG5tbS9LY29uZmlnLTkxMC1cXHRcXHRib29sIFxcXCJ3aXRoaW5fc2l6ZVxcXCJcXG4tLVxcbm1tL0tjb25maWctOTE2LVxcbm1tL0tjb25maWc6OTE3OlxcdGNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRV9TSE1FTV9IVUdFX0FEVklTRVxcbm1tL0tjb25maWctOTE4LVxcdFxcdGJvb2wgXFxcImFkdmlzZVxcXCJcXG4tLVxcbm1tL0tjb25maWc9OTI2PWNob2ljZVxcbi0tXFxubW0vS2NvbmZpZy05MzUtXFxubW0vS2NvbmZpZzo5MzY6XFx0Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX1RNUEZTX0hVR0VfTkVWRVJcXG5tbS9LY29uZmlnLTkzNy1cXHRcXHRib29sIFxcXCJuZXZlclxcXCJcXG4tLVxcbm1tL0tjb25maWctOTQ0LVxcbm1tL0tjb25maWc6OTQ1OlxcdGNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRV9UTVBGU19IVUdFX0FMV0FZU1xcbm1tL0tjb25maWctOTQ2LVxcdFxcdGJvb2wgXFxcImFsd2F5c1xcXCJcXG4tLVxcbm1tL0tjb25maWctOTUyLVxcbm1tL0tjb25maWc6OTUzOlxcdGNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRV9UTVBGU19IVUdFX1dJVEhJTl9TSVpFXFxubW0vS2NvbmZpZy05NTQtXFx0XFx0Ym9vbCBcXFwid2l0aGluX3NpemVcXFwiXFxuLS1cXG5tbS9LY29uZmlnLTk2MC1cXG5tbS9LY29uZmlnOjk2MTpcXHRjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VfVE1QRlNfSFVHRV9BRFZJU0VcXG5tbS9LY29uZmlnLTk2Mi1cXHRcXHRib29sIFxcXCJhZHZpc2VcXFwiXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA3VDIxOjU0OjMyLjIyMjA0ODEwM1oiLCJTZXEiOjExLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo0MDQ4MzI3NDA3LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBoZXJlJ3MgbXkgdGFrZSBvbiB0aG9zZSB0aG91Z2h0cywgZnJhbWVkIGFzIG15IG93bjpcblxuKipPcHRpbWl6aW5nIE1lbW9yeSBNYW5hZ2VtZW50OiBUcmFuc3BhcmVudCBIdWdlcGFnZXMgYW5kIEJleW9uZCoqXG5cbkFscmlnaHQsIGxldCdzIHRoaW5rIHRoaXMgdGhyb3VnaC4gSSdtIGxlYW5pbmcgdG93YXJkcyBlbmFibGluZyBgVFJBTlNQQVJFTlRfSFVHRVBBR0VgIGFsb25nc2lkZSBgU1dBUGAgaW4gdGhpcyBlbnZpcm9ubWVudC4gVGhlIHBvdGVudGlhbCBwZXJmb3JtYW5jZSBnYWlucyB3aXRoIGh1Z2VwYWdlcyBhcmUgc2lnbmlmaWNhbnQsIGFuZCBwcm9wZXJseSBjb25maWd1cmVkIHN3YXBwaW5nIGNhbiBiZSBlc3NlbnRpYWwgZm9yIG1hbmFnaW5nIG1lbW9yeSBwcmVzc3VyZS5cblxuTm93LCBJJ20gZ2V0dGluZyBjdXJpb3VzIGFib3V0IHRoZSBpbm5lciB3b3JraW5ncy4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgaG93IHBhZ2VzIGFyZSBtYW5hZ2VkIHdpdGhpbiB0aGUgaHVnZXBhZ2Ugc3lzdGVtLiBNeSBpbW1lZGlhdGUgcXVlc3Rpb24gaXMgd2hldGhlciBgc3BsaXRfaHVnZV9wYWdlX3RvX2xpc3RfdG9fb3JkZXJgIGlzIGFjY2Vzc2libGUuIEkgbmVlZCB0byB2ZXJpZnkgdGhhdCBpdCdzIGV4cG9ydGVkIGFuZCByZWFjaGFibGUuIEdvb2QsIGl0IGxvb2tzIGxpa2UgYHNwbGl0X2ZvbGlvX3RvX2xpc3RgIGFuZCBgc3BsaXRfaHVnZV9wYWdlYCBib3RoIHVzZSBgc3BsaXRfaHVnZV9wYWdlX3RvX2xpc3RfdG9fb3JkZXJgLiBUaGlzIGlzIHByb21pc2luZzsgdW5kZXJzdGFuZGluZyBpdHMgcm9sZSBpcyBrZXkuXG5cbk5vdyBJIG5lZWQgdG8gZGl2ZSBkZWVwZXIuIE15IG5leHQgc3RlcCBpcyB0byBleGFtaW5lIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGBzcGxpdF9odWdlX3BhZ2VgLiBJJ2xsIG5lZWQgdG8gdW5kZXJzdGFuZCBob3cgaXQgaW50ZXJhY3RzIHdpdGggdGhlIGxvd2VyIGxldmVscyBvZiBtZW1vcnkgbWFuYWdlbWVudCwgdGhlIGZvbGlvIHN0cnVjdHVyZSwgYW5kIHRoZSBsaXN0IG1hbmFnZW1lbnQuIFRoaXMgd2lsbCBsaWtlbHkgcHJvdmlkZSBpbnNpZ2h0cyBpbnRvIGhvdyBodWdlcGFnZXMgYXJlIG1hbmFnZWQgYW5kIHNwbGl0IGluIHRoZSBzeXN0ZW0uXG5cblxuIiwiSW5wdXRUb2tlbnMiOjE2Njc3LCJPdXRwdXRUb2tlbnMiOjI3LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6ODEsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDdUMjE6NTQ6MzYuMjcwMzc4WiIsIlNlcSI6MTIsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo0NjU0MDMwNywiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJzcGxpdF9odWdlX3BhZ2VcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwibW0vXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm1tL2h1Z2VfbWVtb3J5LmM9NDMzNz1pbnQgZm9saW9fc3BsaXRfdW5tYXBwZWQoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlcilcXG4tLVxcbm1tL2h1Z2VfbWVtb3J5LmMtNDM5NC0gKi9cXG5tbS9odWdlX21lbW9yeS5jOjQzOTU6aW50IF9fc3BsaXRfaHVnZV9wYWdlX3RvX2xpc3RfdG9fb3JkZXIoc3RydWN0IHBhZ2UgKnBhZ2UsIHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QsXFxubW0vaHVnZV9tZW1vcnkuYy00Mzk2LVxcdFxcdFxcdFxcdCAgICAgdW5zaWduZWQgaW50IG5ld19vcmRlcilcXG4tLVxcbm1tL2h1Z2VfbWVtb3J5LmMtNDQxMi0gKiBJdCBoYXMgdGhlIHNhbWUgcHJlcmVxdWlzaXRlcyBhbmQgcmV0dXJucyBhc1xcbm1tL2h1Z2VfbWVtb3J5LmM6NDQxMzogKiBzcGxpdF9odWdlX3BhZ2VfdG9fbGlzdF90b19vcmRlcigpLlxcbm1tL2h1Z2VfbWVtb3J5LmMtNDQxNC0gKlxcbi0tXFxubW0vaHVnZV9tZW1vcnkuYz00NDYyPWludCBzcGxpdF9mb2xpb190b19saXN0KHN0cnVjdCBmb2xpbyAqZm9saW8sIHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QpXFxubW0vaHVnZV9tZW1vcnkuYy00NDYzLXtcXG5tbS9odWdlX21lbW9yeS5jOjQ0NjQ6XFx0cmV0dXJuIHNwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyKFxcdTAwMjZmb2xpby1cXHUwMDNlcGFnZSwgbGlzdCwgMCk7XFxubW0vaHVnZV9tZW1vcnkuYy00NDY1LX1cXG4tLVxcbm1tL2h1Z2VfbWVtb3J5LmM9NDYyMT1zdGF0aWMgdW5zaWduZWQgbG9uZyBkZWZlcnJlZF9zcGxpdF9zY2FuKHN0cnVjdCBzaHJpbmtlciAqc2hyaW5rLFxcbi0tXFxubW0vaHVnZV9tZW1vcnkuYy00NjgzLSNpZmRlZiBDT05GSUdfREVCVUdfRlNcXG5tbS9odWdlX21lbW9yeS5jOjQ2ODQ6c3RhdGljIHZvaWQgc3BsaXRfaHVnZV9wYWdlc19hbGwodm9pZClcXG5tbS9odWdlX21lbW9yeS5jLTQ2ODUte1xcbi0tXFxubW0vaHVnZV9tZW1vcnkuYz00NzM0PXN0YXRpYyBpbmxpbmUgYm9vbCB2bWFfbm90X3N1aXRhYmxlX2Zvcl90aHBfc3BsaXQoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpXFxuLS1cXG5tbS9odWdlX21lbW9yeS5jLTQ3NDctXFxubW0vaHVnZV9tZW1vcnkuYzo0NzQ4OnN0YXRpYyBpbnQgc3BsaXRfaHVnZV9wYWdlc19waWQoaW50IHBpZCwgdW5zaWduZWQgbG9uZyB2YWRkcl9zdGFydCxcXG5tbS9odWdlX21lbW9yeS5jLTQ3NDktXFx0XFx0XFx0XFx0dW5zaWduZWQgbG9uZyB2YWRkcl9lbmQsIHVuc2lnbmVkIGludCBuZXdfb3JkZXIsXFxuLS1cXG5tbS9odWdlX21lbW9yeS5jLTQ4MTctXFx0XFx0LypcXG5tbS9odWdlX21lbW9yeS5jOjQ4MTg6XFx0XFx0ICogRm9yIGZvbGlvcyB3aXRoIHByaXZhdGUsIHNwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyKClcXG5tbS9odWdlX21lbW9yeS5jLTQ4MTktXFx0XFx0ICogd2lsbCB0cnkgdG8gZHJvcCBpdCBiZWZvcmUgc3BsaXQgYW5kIHRoZW4gY2hlY2sgaWYgdGhlIGZvbGlvXFxuLS1cXG5tbS9odWdlX21lbW9yeS5jLTQ4NjQtXFxubW0vaHVnZV9tZW1vcnkuYzo0ODY1OnN0YXRpYyBpbnQgc3BsaXRfaHVnZV9wYWdlc19pbl9maWxlKGNvbnN0IGNoYXIgKmZpbGVfcGF0aCwgcGdvZmZfdCBvZmZfc3RhcnQsXFxubW0vaHVnZV9tZW1vcnkuYy00ODY2LVxcdFxcdFxcdFxcdHBnb2ZmX3Qgb2ZmX2VuZCwgdW5zaWduZWQgaW50IG5ld19vcmRlcixcXG4tLVxcbm1tL2h1Z2VfbWVtb3J5LmMtNDkzNC1cXG5tbS9odWdlX21lbW9yeS5jOjQ5MzU6c3RhdGljIHNzaXplX3Qgc3BsaXRfaHVnZV9wYWdlc193cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZixcXG5tbS9odWdlX21lbW9yeS5jLTQ5MzYtXFx0XFx0XFx0XFx0c2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3BzKVxcbi0tXFxubW0vaHVnZV9tZW1vcnkuYy00OTgyLVxcdFxcdH1cXG5tbS9odWdlX21lbW9yeS5jOjQ5ODM6XFx0XFx0cmV0ID0gc3BsaXRfaHVnZV9wYWdlc19pbl9maWxlKGZpbGVfcGF0aCwgb2ZmX3N0YXJ0LCBvZmZfZW5kLFxcbm1tL2h1Z2VfbWVtb3J5LmMtNDk4NC1cXHRcXHRcXHRcXHRuZXdfb3JkZXIsIGluX2ZvbGlvX29mZnNldCk7XFxuLS1cXG5tbS9odWdlX21lbW9yeS5jLTQ5OTMtXFx0aWYgKHJldCA9PSAxIFxcdTAwMjZcXHUwMDI2IHBpZCA9PSAxKSB7XFxubW0vaHVnZV9tZW1vcnkuYzo0OTk0OlxcdFxcdHNwbGl0X2h1Z2VfcGFnZXNfYWxsKCk7XFxubW0vaHVnZV9tZW1vcnkuYy00OTk1LVxcdFxcdHJldCA9IHN0cmxlbihpbnB1dF9idWYpO1xcbi0tXFxubW0vaHVnZV9tZW1vcnkuYy01MDAxLVxcbm1tL2h1Z2VfbWVtb3J5LmM6NTAwMjpcXHRyZXQgPSBzcGxpdF9odWdlX3BhZ2VzX3BpZChwaWQsIHZhZGRyX3N0YXJ0LCB2YWRkcl9lbmQsIG5ld19vcmRlcixcXG5tbS9odWdlX21lbW9yeS5jLTUwMDMtXFx0XFx0XFx0aW5fZm9saW9fb2Zmc2V0KTtcXG4tLVxcbm1tL2h1Z2VfbWVtb3J5LmMtNTAxMS1cXG5tbS9odWdlX21lbW9yeS5jOjUwMTI6c3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgc3BsaXRfaHVnZV9wYWdlc19mb3BzID0ge1xcbm1tL2h1Z2VfbWVtb3J5LmMtNTAxMy1cXHQub3duZXJcXHQgPSBUSElTX01PRFVMRSxcXG5tbS9odWdlX21lbW9yeS5jOjUwMTQ6XFx0LndyaXRlXFx0ID0gc3BsaXRfaHVnZV9wYWdlc193cml0ZSxcXG5tbS9odWdlX21lbW9yeS5jLTUwMTUtfTtcXG5tbS9odWdlX21lbW9yeS5jLTUwMTYtXFxubW0vaHVnZV9tZW1vcnkuYzo1MDE3OnN0YXRpYyBpbnQgX19pbml0IHNwbGl0X2h1Z2VfcGFnZXNfZGVidWdmcyh2b2lkKVxcbm1tL2h1Z2VfbWVtb3J5LmMtNTAxOC17XFxubW0vaHVnZV9tZW1vcnkuYzo1MDE5OlxcdGRlYnVnZnNfY3JlYXRlX2ZpbGUoXFxcInNwbGl0X2h1Z2VfcGFnZXNcXFwiLCAwMjAwLCBOVUxMLCBOVUxMLFxcbm1tL2h1Z2VfbWVtb3J5LmM6NTAyMDpcXHRcXHRcXHQgICAgXFx1MDAyNnNwbGl0X2h1Z2VfcGFnZXNfZm9wcyk7XFxubW0vaHVnZV9tZW1vcnkuYy01MDIxLVxcdHJldHVybiAwO1xcbm1tL2h1Z2VfbWVtb3J5LmMtNTAyMi19XFxubW0vaHVnZV9tZW1vcnkuYzo1MDIzOmxhdGVfaW5pdGNhbGwoc3BsaXRfaHVnZV9wYWdlc19kZWJ1Z2ZzKTtcXG5tbS9odWdlX21lbW9yeS5jLTUwMjQtI2VuZGlmXFxuLS1cXG5tbS9odWdldGxiLmM9Mzk1Mz1zdGF0aWMgbG9uZyBkZW1vdGVfZnJlZV9odWdldGxiX2ZvbGlvcyhzdHJ1Y3QgaHN0YXRlICpzcmMsIHN0cnVjdCBoc3RhdGUgKmRzdCxcXG4tLVxcbm1tL2h1Z2V0bGIuYy0zOTg5LVxcdFxcdFxcdHN0cnVjdCBwYWdlICpwYWdlID0gZm9saW9fcGFnZShmb2xpbywgaSk7XFxubW0vaHVnZXRsYi5jOjM5OTA6XFx0XFx0XFx0LyogQ2FyZWZ1bDogc2VlIF9fc3BsaXRfaHVnZV9wYWdlX3RhaWwoKSAqL1xcbm1tL2h1Z2V0bGIuYy0zOTkxLVxcdFxcdFxcdHN0cnVjdCBmb2xpbyAqbmV3X2ZvbGlvID0gKHN0cnVjdCBmb2xpbyAqKXBhZ2U7XFxuLS1cXG5tbS9raHVnZXBhZ2VkLmM9ODEzPXN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IF9fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGUoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXFxuLS1cXG5tbS9raHVnZXBhZ2VkLmMtODY5LVxcdFxcdCAqIGZvbGlvIGNhbid0IGJlIGZyZWVkIGZyb20gdW5kZXIgdXMuIE5PVEU6IGZvbGlvIGxvY2tcXG5tbS9raHVnZXBhZ2VkLmM6ODcwOlxcdFxcdCAqIGlzIG5lZWRlZCB0byBzZXJpYWxpemUgYWdhaW5zdCBzcGxpdF9odWdlX3BhZ2UoKVxcbm1tL2todWdlcGFnZWQuYy04NzEtXFx0XFx0ICogd2hlbiBpbnZva2VkIGZyb20gdGhlIFZNLlxcbi0tXFxubW0va3NtLmM9MTQ5Nj1zdGF0aWMgaW50IHRyeV90b19tZXJnZV9vbmVfcGFnZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcXG4tLVxcbm1tL2tzbS5jLTE1MTgtXFx0aWYgKGZvbGlvX3Rlc3RfbGFyZ2UoZm9saW8pKSB7XFxubW0va3NtLmM6MTUxOTpcXHRcXHRpZiAoc3BsaXRfaHVnZV9wYWdlKHBhZ2UpKVxcbm1tL2tzbS5jLTE1MjAtXFx0XFx0XFx0Z290byBvdXRfdW5sb2NrO1xcbi0tXFxubW0va3NtLmM9MjI3Nj1zdGF0aWMgdm9pZCBjbXBfYW5kX21lcmdlX3BhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UsIHN0cnVjdCBrc21fcm1hcF9pdGVtICpybWFwX2l0ZW0pXFxuLS1cXG5tbS9rc20uYy0yMzYzLVxcdFxcdCAqIGZvbGlvLCB0aGVuIHdlIGFjdHVhbGx5IGVuZGVkIHVwIGluY3JlYXNpbmcgdGhlIHJlZmVyZW5jZVxcbm1tL2tzbS5jOjIzNjQ6XFx0XFx0ICogY291bnQgb2YgdGhlIHNhbWUgZm9saW8gdHdpY2UsIGFuZCBzcGxpdF9odWdlX3BhZ2UgZmFpbGVkLlxcbm1tL2tzbS5jLTIzNjUtXFx0XFx0ICpcXG5tbS9rc20uYy0yMzY2LVxcdFxcdCAqIEhlcmUgd2Ugc2V0IGEgZmxhZyBpZiB0aGF0IGhhcHBlbmVkLCBhbmQgd2UgdXNlIGl0IGxhdGVyIHRvXFxubW0va3NtLmM6MjM2NzpcXHRcXHQgKiB0cnkgc3BsaXRfaHVnZV9wYWdlIGFnYWluLiBTaW5jZSB3ZSBjYWxsIGZvbGlvX3B1dCgpIHJpZ2h0XFxubW0va3NtLmMtMjM2OC1cXHRcXHQgKiBhZnRlcndhcmRzLCB0aGUgcmVmZXJlbmNlIGNvdW50IHdpbGwgYmUgY29ycmVjdCBhbmRcXG5tbS9rc20uYzoyMzY5OlxcdFxcdCAqIHNwbGl0X2h1Z2VfcGFnZSBzaG91bGQgc3VjY2VlZC5cXG5tbS9rc20uYy0yMzcwLVxcdFxcdCAqL1xcbi0tXFxubW0va3NtLmMtMjQwOS1cXHRcXHRcXHRcXHRyZXR1cm47XFxubW0va3NtLmM6MjQxMDpcXHRcXHRcXHRzcGxpdF9odWdlX3BhZ2UocGFnZSk7XFxubW0va3NtLmMtMjQxMS1cXHRcXHRcXHRmb2xpbyA9IHBhZ2VfZm9saW8ocGFnZSk7XFxuLS1cXG5tbS9tZW1vcnktZmFpbHVyZS5jPTE3MTM9c3RhdGljIGludCB0cnlfdG9fc3BsaXRfdGhwX3BhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UsIHVuc2lnbmVkIGludCBuZXdfb3JkZXIsXFxuLS1cXG5tbS9tZW1vcnktZmFpbHVyZS5jLTE3MTgtXFx0bG9ja19wYWdlKHBhZ2UpO1xcbm1tL21lbW9yeS1mYWlsdXJlLmM6MTcxOTpcXHRyZXQgPSBzcGxpdF9odWdlX3BhZ2VfdG9fb3JkZXIocGFnZSwgbmV3X29yZGVyKTtcXG5tbS9tZW1vcnktZmFpbHVyZS5jLTE3MjAtXFx0dW5sb2NrX3BhZ2UocGFnZSk7XFxuLS1cXG5tbS9zaG1lbS5jPTM2MjI9c3RhdGljIGxvbmcgc2htZW1fZmFsbG9jYXRlKHN0cnVjdCBmaWxlICpmaWxlLCBpbnQgbW9kZSwgbG9mZl90IG9mZnNldCxcXG4tLVxcbm1tL3NobWVtLmMtMzcxMi1cXHQgKiBpbmZvLVxcdTAwM2VmYWxsb2NlbmQgaXMgb25seSByZWxldmFudCB3aGVuIGh1Z2UgcGFnZXMgbWlnaHQgYmVcXG5tbS9zaG1lbS5jOjM3MTM6XFx0ICogaW52b2x2ZWQ6IHRvIHByZXZlbnQgc3BsaXRfaHVnZV9wYWdlKCkgZnJlZWluZyBmYWxsb2NhdGVkXFxubW0vc2htZW0uYy0zNzE0LVxcdCAqIHBhZ2VzIHdoZW4gRkFMTE9DX0ZMX0tFRVBfU0laRSBjb21taXR0ZWQgYmV5b25kIGlfc2l6ZS5cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDdUMjE6NTQ6MzYuMzE2OTQ0Mzc3WiIsIlNlcSI6MTMsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjUwMjY2MTY2MTksIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIEh1Z2UgUGFnZSBTcGxpdHRpbmcgRnVuY3Rpb25zKipcblxuT2theSwgc28gSSBuZWVkIHRvIHplcm8gaW4gb24gdGhlc2UgZnVuY3Rpb25zOiBgc3BsaXRfaHVnZV9wYWdlX3RvX2xpc3RfdG9fb3JkZXJgLCBgZm9saW9fc3BsaXRfdW5tYXBwZWRgLCBgX19zd2FwX2NhY2hlX3JlcGxhY2VfZm9saW9gLCBhbmQgYHNwbGl0X2ZvbGlvX3RvX2xpc3RgLiBJIHRoaW5rIGBzcGxpdF9odWdlX3BhZ2VfdG9fbGlzdF90b19vcmRlcmAgaXMgdGhlIHJpZ2h0IG5hbWUsIGJ1dCBJIHdhbnQgdG8gbWFrZSBhYnNvbHV0ZWx5IHN1cmUuIExldCBtZSBxdWlja2x5IHZlcmlmeSB0aGF0LiBIbW0sIHllcCwgdGhlcmUgaXQgaXMgaW4gYG1tL2h1Z2VfbWVtb3J5LmNgLlxuXG5XYWl0IGEgbWludXRlLCB0aGUgYGdyZXBgIG91dHB1dCBhbHNvIHR1cm5lZCB1cCBgc3BsaXRfZm9saW9fdG9fbGlzdGAuIEFuZCwgaGFuZyBvbiwgdGhlcmUncyBgX19zcGxpdF9odWdlX3BhZ2VfdG9fbGlzdF90b19vcmRlcmAgYXMgd2VsbCEgT2theSwgY2xlYXJseSBJIG5lZWQgdG8gY2xhcmlmeSB3aGF0IHRoZSByZWxhdGlvbnNoaXAgaXMgYmV0d2VlbiB0aGVzZSBmdW5jdGlvbnMuIElzIGBzcGxpdF9odWdlX3BhZ2VgIHBlcmhhcHMgYSBtYWNybyBvciBpbmxpbmUgZnVuY3Rpb24/IExldCdzIGNoZWNrIGBpbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaGAgZm9yIHRoYXQgZGVmaW5pdGlvbi5cblxuXG4iLCJJbnB1dFRva2VucyI6MTkyNTksIk91dHB1dFRva2VucyI6MzQsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoyMjMsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDdUMjE6NTQ6NDEuMzQzNTYzMDI2WiIsIlNlcSI6MTQsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo0MTg4MzcwNywiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJzcGxpdF9odWdlX3BhZ2VcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwiaW5jbHVkZS9saW51eC9odWdlX21tLmhcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiaW5jbHVkZS9saW51eC9odWdlX21tLmg9Mzk4PWVudW0gc3BsaXRfdHlwZSB7XFxuLS1cXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaC00MDItXFxuaW5jbHVkZS9saW51eC9odWdlX21tLmg6NDAzOmludCBfX3NwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyKHN0cnVjdCBwYWdlICpwYWdlLCBzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LFxcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oLTQwNC1cXHRcXHR1bnNpZ25lZCBpbnQgbmV3X29yZGVyKTtcXG4tLVxcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oPTQxMD1pbnQgZm9saW9fc3BsaXQoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlciwgc3RydWN0IHBhZ2UgKnBhZ2UsXFxuLS1cXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaC00MTItXFxuaW5jbHVkZS9saW51eC9odWdlX21tLmg6NDEzOnN0YXRpYyBpbmxpbmUgaW50IHNwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyKHN0cnVjdCBwYWdlICpwYWdlLCBzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LFxcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oLTQxNC1cXHRcXHR1bnNpZ25lZCBpbnQgbmV3X29yZGVyKVxcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oLTQxNS17XFxuaW5jbHVkZS9saW51eC9odWdlX21tLmg6NDE2OlxcdHJldHVybiBfX3NwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyKHBhZ2UsIGxpc3QsIG5ld19vcmRlcik7XFxuaW5jbHVkZS9saW51eC9odWdlX21tLmgtNDE3LX1cXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaDo0MTg6c3RhdGljIGlubGluZSBpbnQgc3BsaXRfaHVnZV9wYWdlX3RvX29yZGVyKHN0cnVjdCBwYWdlICpwYWdlLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyKVxcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oLTQxOS17XFxuaW5jbHVkZS9saW51eC9odWdlX21tLmg6NDIwOlxcdHJldHVybiBzcGxpdF9odWdlX3BhZ2VfdG9fbGlzdF90b19vcmRlcihwYWdlLCBOVUxMLCBuZXdfb3JkZXIpO1xcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oLTQyMS19XFxuaW5jbHVkZS9saW51eC9odWdlX21tLmgtNDIyLVxcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oOjQyMzpzdGF0aWMgaW5saW5lIGludCBzcGxpdF9odWdlX3BhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UpXFxuaW5jbHVkZS9saW51eC9odWdlX21tLmgtNDI0LXtcXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaDo0MjU6XFx0cmV0dXJuIHNwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyKHBhZ2UsIE5VTEwsIDApO1xcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oLTQyNi19XFxuLS1cXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaD02NDU9c3RhdGljIGlubGluZSBpbnRcXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaDo2NDY6c3BsaXRfaHVnZV9wYWdlX3RvX2xpc3RfdG9fb3JkZXIoc3RydWN0IHBhZ2UgKnBhZ2UsIHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QsXFxuaW5jbHVkZS9saW51eC9odWdlX21tLmgtNjQ3LVxcdFxcdHVuc2lnbmVkIGludCBuZXdfb3JkZXIpXFxuLS1cXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaC02NTEtfVxcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oOjY1MjpzdGF0aWMgaW5saW5lIGludCBzcGxpdF9odWdlX3BhZ2VfdG9fb3JkZXIoc3RydWN0IHBhZ2UgKnBhZ2UsIHVuc2lnbmVkIGludCBuZXdfb3JkZXIpXFxuaW5jbHVkZS9saW51eC9odWdlX21tLmgtNjUzLXtcXG4tLVxcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oLTY1Ni19XFxuaW5jbHVkZS9saW51eC9odWdlX21tLmg6NjU3OnN0YXRpYyBpbmxpbmUgaW50IHNwbGl0X2h1Z2VfcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSlcXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaC02NTgte1xcbi0tXFxuaW5jbHVkZS9saW51eC9odWdlX21tLmg9ODI2PXN0YXRpYyBpbmxpbmUgaW50IHNwbGl0X2ZvbGlvX3RvX29yZGVyKHN0cnVjdCBmb2xpbyAqZm9saW8sIGludCBuZXdfb3JkZXIpXFxuaW5jbHVkZS9saW51eC9odWdlX21tLmgtODI3LXtcXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaDo4Mjg6XFx0cmV0dXJuIHNwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyKFxcdTAwMjZmb2xpby1cXHUwMDNlcGFnZSwgTlVMTCwgbmV3X29yZGVyKTtcXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaC04MjktfVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0wN1QyMTo1NDo0MS4zODU0NTE5MTNaIiwiU2VxIjoxNSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NDQxOTY1NDUyMSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgSHVnZSBQYWdlIFNwbGl0dGluZyBpbiB0aGUgS2VybmVsKipcblxuT2theSwgc28gSSdtIGRpdmluZyBpbnRvIHRoZSBodWdlIHBhZ2Ugc3BsaXR0aW5nIG1lY2hhbmlzbXMgd2l0aGluIHRoZSBrZXJuZWwsIHNwZWNpZmljYWxseSBmb2N1c2luZyBvbiB0aGUgY29yZSBmdW5jdGlvbnMuIE15IGluaXRpYWwgYXNzZXNzbWVudCBwb2ludHMgdG8gYF9fc3BsaXRfaHVnZV9wYWdlX3RvX2xpc3RfdG9fb3JkZXJgIHJlc2lkaW5nIHdpdGhpbiBgbW0vaHVnZV9tZW1vcnkuY2AgYXMgdGhlIGtleSBmdW5jdGlvbiBmb3IgdGhlIHNwbGl0IG9wZXJhdGlvbi4gSSdtIGFsc28gbm90aW5nIHRoYXQgYGZvbGlvX3NwbGl0X3VubWFwcGVkYCBpcyBhIGdsb2JhbCBmdW5jdGlvbiwgd2hpY2ggaXMgaW50ZXJlc3RpbmcgYXMgaXQgc3VnZ2VzdHMgaXRzIGF2YWlsYWJpbGl0eSBhY3Jvc3MgZGlmZmVyZW50IG1vZHVsZXMsIHdoaWNoIGltcGxpZXMgZ2VuZXJhbGl0eS4gYF9fc3dhcF9jYWNoZV9yZXBsYWNlX2ZvbGlvYCBpcyBhbHNvIGdsb2JhbGx5IGFjY2Vzc2libGUsIHdoaWNoIGluZGljYXRlcyBpdCdzIGVzc2VudGlhbCBmb3IgbWFuYWdpbmcgcGFnZSByZXBsYWNlbWVudCBkdXJpbmcgdGhlIHNwbGl0IG9wZXJhdGlvbnMuIEknbSBhbHNvIGFkZGluZyBgc3BsaXRfZm9saW9fdG9fbGlzdGAgdG8gdGhlIGxpc3Qgb2YgZ2xvYmFsbHkgZGVmaW5lZCBmdW5jdGlvbnMuXG5cbk5vdywgSSdtIGdvaW5nIHRvIGRpZyBkZWVwZXIgaW50byB0aGUgYWN0dWFsIGltcGxlbWVudGF0aW9uIG9mIGBfX3NwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyYCBpbiBgbW0vaHVnZV9tZW1vcnkuY2AgdG8gc2VlIGhvdyBpdCBhbGwgd29ya3MuIEkgbmVlZCB0byB1bmRlcnN0YW5kIGl0cyBsb2dpYy5cblxuXG4iLCJJbnB1dFRva2VucyI6MjA1ODEsIk91dHB1dFRva2VucyI6NDEsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxMDYsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDdUMjE6NTQ6NDUuODA1MTA5NjQ0WiIsIlNlcSI6MTYsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo0Mjk3NzU3NywiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJfX3NwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIm1tL2h1Z2VfbWVtb3J5LmNcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwibW0vaHVnZV9tZW1vcnkuYz00MzM3PWludCBmb2xpb19zcGxpdF91bm1hcHBlZChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyKVxcbi0tXFxubW0vaHVnZV9tZW1vcnkuYy00Mzk0LSAqL1xcbm1tL2h1Z2VfbWVtb3J5LmM6NDM5NTppbnQgX19zcGxpdF9odWdlX3BhZ2VfdG9fbGlzdF90b19vcmRlcihzdHJ1Y3QgcGFnZSAqcGFnZSwgc3RydWN0IGxpc3RfaGVhZCAqbGlzdCxcXG5tbS9odWdlX21lbW9yeS5jLTQzOTYtXFx0XFx0XFx0XFx0ICAgICB1bnNpZ25lZCBpbnQgbmV3X29yZGVyKVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0wN1QyMTo1NDo0NS44NDgwODkwMDFaIiwiU2VxIjoxNywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MzQ4MzgwMzc4NiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgbGV0J3MgZGl2ZSBpbnRvIHRoaXMuIEhlcmUncyBteSB0aG91Z2h0IHByb2Nlc3Mgb24gdGhlIG1hdHRlcjpcblxuKipDaGVja2luZyBgZm9saW9fc3BsaXRgIGluIGBtbS9odWdlX21lbW9yeS5jYCoqXG5cbkFscmlnaHQsIHRoZSB0YXNrIGF0IGhhbmQgaXMgdG8gdW5kZXJzdGFuZCBob3cgYGZvbGlvX3NwbGl0YCBpcyBvcGVyYXRpbmcgd2l0aGluIHRoZSBgbW0vaHVnZV9tZW1vcnkuY2AgZmlsZS4gTXkgZXhwZXJ0IGludHVpdGlvbiBpcyB0ZWxsaW5nIG1lIHRoYXQgdGhpcyBmdW5jdGlvbiBwbGF5cyBhIGNydWNpYWwgcm9sZSBpbiBtYW5hZ2luZyBhbmQgcG9zc2libHkgc3BsaXR0aW5nIGh1Z2UgcGFnZXMsIHdoaWNoIGlzIGEgY29yZSBmdW5jdGlvbmFsaXR5IGZvciBvcHRpbWl6ZWQgbWVtb3J5IHV0aWxpemF0aW9uLiBJIG5lZWQgdG8gcmVmcmVzaCBteSBtZW1vcnkgb24gdGhlIGludHJpY2FjaWVzIG9mIHRoZSBodWdlIHBhZ2UgaW1wbGVtZW50YXRpb24gd2l0aGluIHRoZSBrZXJuZWwncyBtZW1vcnkgbWFuYWdlbWVudCBzeXN0ZW0sIHBhcnRpY3VsYXJseSB3aGVyZSBgZm9saW9fc3BsaXRgIGZpdHMgaW50byB0aGF0IHdvcmtmbG93LiBTbywgSSB3aWxsIGZvY3VzIG9uIHJldmlld2luZyB0aGUgbG9naWMgdG8gY29tcHJlaGVuZCBob3cgYGZvbGlvX3NwbGl0YCBkZWFscyB3aXRoIHRoZSBwYXJ0aXRpb25pbmcgb2YgaHVnZSBwYWdlcyBpbnRvIHNtYWxsZXIgb25lcywgcG90ZW50aWFsbHkgZm9yIGltcHJvdmVkIG1lbW9yeSBhbGxvY2F0aW9uIGZsZXhpYmlsaXR5IG9yIHRvIGRlYWwgd2l0aCBmcmFnbWVudGF0aW9uLiBJJ2xsIGJlIGxvb2tpbmcgZm9yIGRldGFpbHMgcmVnYXJkaW5nIGxvY2tpbmcgbWVjaGFuaXNtcywgcmVmY291bnQgbWFuYWdlbWVudCwgYW5kIHRoZSBvdmVyYWxsIGltcGFjdCBvZiB0aGUgc3BsaXQgb24gdGhlIHBhZ2UgdGFibGVzIGFuZCB0aGUgYXNzb2NpYXRlZCBtZXRhZGF0YS4gSSBleHBlY3QgdG8gc2VlIGludGVyYWN0aW9ucyB3aXRoIHRoZSBmb2xpbyBzdHJ1Y3R1cmVzLCBwYWdlIGZsYWdzLCBhbmQgcG90ZW50aWFsbHkgdGhlIHJhZGl4IHRyZWUsIHNvIEknbGwgYmUgcGF5aW5nIGNsb3NlIGF0dGVudGlvbiB0byB0aGVzZSBlbGVtZW50cyBhcyBJIHJlYWQgdGhyb3VnaCB0aGUgcmVsZXZhbnQgY29kZS5cblxuXG4iLCJJbnB1dFRva2VucyI6MjEwNzMsIk91dHB1dFRva2VucyI6MzAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxOSwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0wN1QyMTo1NDo0OS4zMzE4OTQ5NTdaIiwiU2VxIjoxOCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjU0NTc5OTA2MiwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJmb2xpb19zcGxpdFwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJtbS9odWdlX21lbW9yeS5jXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm1tL2h1Z2VfbWVtb3J5LmM9Mzc5NT1zdGF0aWMgaW50IF9fc3BsaXRfdW5tYXBwZWRfZm9saW8oc3RydWN0IGZvbGlvICpmb2xpbywgaW50IG5ld19vcmRlcixcXG4tLVxcbm1tL2h1Z2VfbWVtb3J5LmMtMzgzOC1cXG5tbS9odWdlX21lbW9yeS5jOjM4Mzk6XFx0XFx0Zm9saW9fc3BsaXRfbWVtY2dfcmVmcyhmb2xpbywgb2xkX29yZGVyLCBzcGxpdF9vcmRlcik7XFxubW0vaHVnZV9tZW1vcnkuYy0zODQwLVxcdFxcdHNwbGl0X3BhZ2Vfb3duZXIoXFx1MDAyNmZvbGlvLVxcdTAwM2VwYWdlLCBvbGRfb3JkZXIsIHNwbGl0X29yZGVyKTtcXG4tLVxcbm1tL2h1Z2VfbWVtb3J5LmM9NDA2MD1zdGF0aWMgaW50IF9fZm9saW9fZnJlZXplX3NwbGl0X3VubWFwX2ZpbGUoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlcixcXG4tLVxcbm1tL2h1Z2VfbWVtb3J5LmMtNDIyNi0vKipcXG5tbS9odWdlX21lbW9yeS5jOjQyMjc6ICogX19mb2xpb19zcGxpdCgpIC0gc3BsaXQgYSBmb2xpbyBhdCBAc3BsaXRfYXQgdG8gYSBAbmV3X29yZGVyIGZvbGlvXFxubW0vaHVnZV9tZW1vcnkuYy00MjI4LSAqIEBmb2xpbzogZm9saW8gdG8gc3BsaXRcXG4tLVxcbm1tL2h1Z2VfbWVtb3J5LmMtNDI0Ni0gKi9cXG5tbS9odWdlX21lbW9yeS5jOjQyNDc6c3RhdGljIGludCBfX2ZvbGlvX3NwbGl0KHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIsXFxubW0vaHVnZV9tZW1vcnkuYy00MjQ4LVxcdFxcdHN0cnVjdCBwYWdlICpzcGxpdF9hdCwgc3RydWN0IHBhZ2UgKmxvY2tfYXQsXFxuLS1cXG5tbS9odWdlX21lbW9yeS5jLTQzMTUtLyoqXFxubW0vaHVnZV9tZW1vcnkuYzo0MzE2OiAqIGZvbGlvX3NwbGl0X3VubWFwcGVkKCkgLSBzcGxpdCBhIGxhcmdlIGFub24gZm9saW8gdGhhdCBpcyBhbHJlYWR5IHVubWFwcGVkXFxubW0vaHVnZV9tZW1vcnkuYy00MzE3LSAqIEBmb2xpbzogZm9saW8gdG8gc3BsaXRcXG4tLVxcbm1tL2h1Z2VfbWVtb3J5LmMtNDMzNi0gKi9cXG5tbS9odWdlX21lbW9yeS5jOjQzMzc6aW50IGZvbGlvX3NwbGl0X3VubWFwcGVkKHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIpXFxubW0vaHVnZV9tZW1vcnkuYy00MzM4LXtcXG4tLVxcbm1tL2h1Z2VfbWVtb3J5LmM9NDM5NT1pbnQgX19zcGxpdF9odWdlX3BhZ2VfdG9fbGlzdF90b19vcmRlcihzdHJ1Y3QgcGFnZSAqcGFnZSwgc3RydWN0IGxpc3RfaGVhZCAqbGlzdCxcXG4tLVxcbm1tL2h1Z2VfbWVtb3J5LmMtNDM5OS1cXG5tbS9odWdlX21lbW9yeS5jOjQ0MDA6XFx0cmV0dXJuIF9fZm9saW9fc3BsaXQoZm9saW8sIG5ld19vcmRlciwgXFx1MDAyNmZvbGlvLVxcdTAwM2VwYWdlLCBwYWdlLCBsaXN0LFxcbm1tL2h1Z2VfbWVtb3J5LmMtNDQwMS1cXHRcXHRcXHQgICAgIFNQTElUX1RZUEVfVU5JRk9STSk7XFxuLS1cXG5tbS9odWdlX21lbW9yeS5jLTQ0MDQtLyoqXFxubW0vaHVnZV9tZW1vcnkuYzo0NDA1OiAqIGZvbGlvX3NwbGl0KCkgLSBzcGxpdCBhIGZvbGlvIGF0IEBzcGxpdF9hdCB0byBhIEBuZXdfb3JkZXIgZm9saW9cXG5tbS9odWdlX21lbW9yeS5jLTQ0MDYtICogQGZvbGlvOiBmb2xpbyB0byBzcGxpdFxcbi0tXFxubW0vaHVnZV9tZW1vcnkuYy00NDI3LSAqL1xcbm1tL2h1Z2VfbWVtb3J5LmM6NDQyODppbnQgZm9saW9fc3BsaXQoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlcixcXG5tbS9odWdlX21lbW9yeS5jLTQ0MjktXFx0XFx0c3RydWN0IHBhZ2UgKnNwbGl0X2F0LCBzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0KVxcbm1tL2h1Z2VfbWVtb3J5LmMtNDQzMC17XFxubW0vaHVnZV9tZW1vcnkuYzo0NDMxOlxcdHJldHVybiBfX2ZvbGlvX3NwbGl0KGZvbGlvLCBuZXdfb3JkZXIsIHNwbGl0X2F0LCBcXHUwMDI2Zm9saW8tXFx1MDAzZXBhZ2UsIGxpc3QsXFxubW0vaHVnZV9tZW1vcnkuYy00NDMyLVxcdFxcdFxcdCAgICAgU1BMSVRfVFlQRV9OT05fVU5JRk9STSk7XFxuLS1cXG5tbS9odWdlX21lbW9yeS5jPTQ3NDg9c3RhdGljIGludCBzcGxpdF9odWdlX3BhZ2VzX3BpZChpbnQgcGlkLCB1bnNpZ25lZCBsb25nIHZhZGRyX3N0YXJ0LFxcbi0tXFxubW0vaHVnZV9tZW1vcnkuYy00ODQwLVxcdFxcdFxcdFxcdFxcdFxcdFxcdCAgIGluX2ZvbGlvX29mZnNldCk7XFxubW0vaHVnZV9tZW1vcnkuYzo0ODQxOlxcdFxcdFxcdGlmICghZm9saW9fc3BsaXQoZm9saW8sIHRhcmdldF9vcmRlciwgc3BsaXRfYXQsIE5VTEwpKVxcbm1tL2h1Z2VfbWVtb3J5LmMtNDg0Mi1cXHRcXHRcXHRcXHRzcGxpdCsrO1xcbi0tXFxubW0vaHVnZV9tZW1vcnkuYz00ODY1PXN0YXRpYyBpbnQgc3BsaXRfaHVnZV9wYWdlc19pbl9maWxlKGNvbnN0IGNoYXIgKmZpbGVfcGF0aCwgcGdvZmZfdCBvZmZfc3RhcnQsXFxuLS1cXG5tbS9odWdlX21lbW9yeS5jLTQ5MTYtXFx0XFx0XFx0XFx0XFx0XFx0XFx0ICAgaW5fZm9saW9fb2Zmc2V0KTtcXG5tbS9odWdlX21lbW9yeS5jOjQ5MTc6XFx0XFx0XFx0aWYgKCFmb2xpb19zcGxpdChmb2xpbywgdGFyZ2V0X29yZGVyLCBzcGxpdF9hdCwgTlVMTCkpXFxubW0vaHVnZV9tZW1vcnkuYy00OTE4LVxcdFxcdFxcdFxcdHNwbGl0Kys7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA3VDIxOjU0OjQ5Ljg3NzY5ODYxOVoiLCJTZXEiOjE5LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjozMDQ5OTA3MTM3LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBoZXJlJ3MgbXkgdGFrZSBvbiB0aG9zZSB0aG91Z2h0cywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZTpcblxuKipBbmFseXppbmcgdGhlIEdsb2JhbCBTY29wZSBvZiBgZm9saW9fc3BsaXRgKipcblxuQWxyaWdodCwgc28gSSdtIGRlYWxpbmcgd2l0aCB0aGUgYGZvbGlvX3NwbGl0YCBmdW5jdGlvbi4gSSByZW1lbWJlciBpdCdzIGEgZ2xvYmFsIGZ1bmN0aW9uLCBtZWFuaW5nIGl0J3MgbGlrZWx5IGFjY2Vzc2libGUgZnJvbSB2YXJpb3VzIHBhcnRzIG9mIHRoZSBrZXJuZWwuIFRoaXMgaW1tZWRpYXRlbHkgbWFrZXMgbWUgdGhpbmsgYWJvdXQgcG90ZW50aWFsIGNyb3NzLW1vZHVsZSBkZXBlbmRlbmNpZXMgYW5kIHRoZSBvdmVyYWxsIGltcGFjdCBvZiBtb2RpZmljYXRpb25zLiBNeSBuZXh0IHN0ZXAgaXMgY2xlYXIuIEkgbmVlZCB0byB6ZXJvIGluIG9uIGl0cyBkZWZpbml0aW9uIGFuZCB1bmRlcnN0YW5kIGl0cyBwcmVjaXNlIGJlaGF2aW9yLiBTcGVjaWZpY2FsbHksIEknbSBnb2luZyB0byBsb29rIGF0IGBmb2xpb19zcGxpdGAgaW4gYGluY2x1ZGUvbGludXgvaHVnZV9tbS5oYC4gVGhhdCBoZWFkZXIgZmlsZSBpcyBhIHByaW1lIGNhbmRpZGF0ZSBmb3IgZGVmaW5pbmcgY29yZSBmb2xpbyBvcGVyYXRpb25zIGFuZCBzdHJ1Y3R1cmVzLiBUaGlzIHdpbGwgZ2l2ZSBtZSBhIHNvbGlkIGZvdW5kYXRpb24gZm9yIHVuZGVyc3RhbmRpbmcgdGhlIHNjb3BlIG9mIHdoYXQgSSdtIGRlYWxpbmcgd2l0aC5cblxuXG4iLCJJbnB1dFRva2VucyI6MjI0MDEsIk91dHB1dFRva2VucyI6MzIsIk91dHB1dFRob3VnaHRzVG9rZW5zIjozNCwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0wN1QyMTo1NDo1Mi45Mjc2MDgwNTZaIiwiU2VxIjoyMCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjQzMTc2OTE3LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImZvbGlvX3NwbGl0XCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcImluY2x1ZGUvbGludXgvaHVnZV9tbS5oXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImluY2x1ZGUvbGludXgvaHVnZV9tbS5oPTQwMz1pbnQgX19zcGxpdF9odWdlX3BhZ2VfdG9fbGlzdF90b19vcmRlcihzdHJ1Y3QgcGFnZSAqcGFnZSwgc3RydWN0IGxpc3RfaGVhZCAqbGlzdCxcXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaC00MDQtXFx0XFx0dW5zaWduZWQgaW50IG5ld19vcmRlcik7XFxuaW5jbHVkZS9saW51eC9odWdlX21tLmg6NDA1OmludCBmb2xpb19zcGxpdF91bm1hcHBlZChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyKTtcXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaC00MDYtdW5zaWduZWQgaW50IG1pbl9vcmRlcl9mb3Jfc3BsaXQoc3RydWN0IGZvbGlvICpmb2xpbyk7XFxuLS1cXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaD00MDg9aW50IGZvbGlvX2NoZWNrX3NwbGl0dGFibGUoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlcixcXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaC00MDktXFx0XFx0XFx0ICAgZW51bSBzcGxpdF90eXBlIHNwbGl0X3R5cGUpO1xcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oOjQxMDppbnQgZm9saW9fc3BsaXQoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlciwgc3RydWN0IHBhZ2UgKnBhZ2UsXFxuaW5jbHVkZS9saW51eC9odWdlX21tLmgtNDExLVxcdFxcdHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QpO1xcbi0tXFxuaW5jbHVkZS9saW51eC9odWdlX21tLmg9NjY5PXN0YXRpYyBpbmxpbmUgaW50IHNwbGl0X2ZvbGlvX3RvX2xpc3Qoc3RydWN0IGZvbGlvICpmb2xpbywgc3RydWN0IGxpc3RfaGVhZCAqbGlzdClcXG4tLVxcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oLTY3NC1cXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaDo2NzU6c3RhdGljIGlubGluZSBpbnQgZm9saW9fc3BsaXQoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlcixcXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaC02NzYtXFx0XFx0c3RydWN0IHBhZ2UgKnBhZ2UsIHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QpXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA3VDIxOjU0OjUyLjk3MDc4ODMzM1oiLCJTZXEiOjIxLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo0NDM3OTM3MTAwLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyBIdWdlIFBhZ2UgU3BsaXR0aW5nKipcblxuT2theSwgc28gSSBuZWVkIHRvIHplcm8gaW4gb24gdGhlIGZ1bmN0aW9ucyByZWxhdGVkIHRvIHNwbGl0dGluZyBodWdlIHBhZ2VzLiBGcm9tIHdoYXQgSSBjYW4gc2VlLCB0aGUgY29yZSBvbmVzIHNlZW0gdG8gYmUgYF9fc3BsaXRfaHVnZV9wYWdlX3RvX2xpc3RfdG9fb3JkZXJgLCBgZm9saW9fc3BsaXRgLCBgZm9saW9fc3BsaXRfdW5tYXBwZWRgLCBhbmQgYF9fc3dhcF9jYWNoZV9yZXBsYWNlX2ZvbGlvYC4gVGhvc2UgYXJlIGRlZmluaXRlbHkgdGhlIGNydWNpYWwgcGllY2VzIG9mIHRoZSBwdXp6bGUuXG5cbk5vdywgbGV0J3MganVzdCBtYWtlIHN1cmUgSSBoYXZlbid0IG1pc3NlZCBhbnkgcmVsZXZhbnQgY29uZmlndXJhdGlvbiBvcHRpb25zLiBJJ20gYWxyZWFkeSBmYW1pbGlhciB3aXRoIGBUUkFOU1BBUkVOVF9IVUdFUEFHRWAsIG9idmlvdXNseSwgYnV0IEknbGwgbWFrZSBhIHF1aWNrIG1lbnRhbCBub3RlIG9mIGBTV0FQYCBhcyB3ZWxsIOKAkyBhbHdheXMgZ29vZCB0byBrZWVwIHRob3NlIGRlcGVuZGVuY2llcyBpbiBtaW5kLlxuXG5SaWdodCwgbmV4dCBzdGVwLiBJIHNob3VsZCByZWFsbHkgY2hlY2sgaG93IGBmb2xpb19jaGVja19zcGxpdHRhYmxlYCB3b3Jrcy4gSXMgaXQgZXhwb3J0ZWQ/IEhtbSwgeWVwLCBsb29rcyBsaWtlIGl0J3MgZGVmaW5lZCBpbiBgaW5jbHVkZS9saW51eC9odWdlX21tLmhgLiBUaGF0IG1ha2VzIHRoaW5ncyBlYXNpZXIuIE5vdywgdG8gdW5kZXJzdGFuZCB0aGUgYWN0dWFsIGltcGxlbWVudGF0aW9uLCBJIHNob3VsZCBmaW5kIHdoZXJlIGBmb2xpb19jaGVja19zcGxpdHRhYmxlYCBpcyBkZWZpbmVkLiBJIGJldCBpdCdzIGluIGBtbS9odWdlX21lbW9yeS5jYCwgc28gSSdsbCBnbyB0aGVyZSBhbmQgc3RhcnQgdGhlcmUuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjIzMDE1LCJPdXRwdXRUb2tlbnMiOjM0LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTQ4LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA3VDIxOjU0OjU3LjQwODcyOTAyM1oiLCJTZXEiOjIyLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NDM4MjEyNTcsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiZm9saW9fY2hlY2tfc3BsaXR0YWJsZVwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJtbS9odWdlX21lbW9yeS5jXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm1tL2h1Z2VfbWVtb3J5LmM9Mzc5NT1zdGF0aWMgaW50IF9fc3BsaXRfdW5tYXBwZWRfZm9saW8oc3RydWN0IGZvbGlvICpmb2xpbywgaW50IG5ld19vcmRlcixcXG4tLVxcbm1tL2h1Z2VfbWVtb3J5LmMtMzg2MC0vKipcXG5tbS9odWdlX21lbW9yeS5jOjM4NjE6ICogZm9saW9fY2hlY2tfc3BsaXR0YWJsZSgpIC0gY2hlY2sgaWYgYSBmb2xpbyBjYW4gYmUgc3BsaXQgdG8gYSBnaXZlbiBvcmRlclxcbm1tL2h1Z2VfbWVtb3J5LmMtMzg2Mi0gKiBAZm9saW86IGZvbGlvIHRvIGJlIHNwbGl0XFxuLS1cXG5tbS9odWdlX21lbW9yeS5jLTM4NjctICpcXG5tbS9odWdlX21lbW9yeS5jOjM4Njg6ICogZm9saW9fY2hlY2tfc3BsaXR0YWJsZSgpIGNoZWNrcyBpZiBAZm9saW8gY2FuIGJlIHNwbGl0IHRvIEBuZXdfb3JkZXIgdXNpbmdcXG5tbS9odWdlX21lbW9yeS5jLTM4NjktICogQHNwbGl0X3R5cGUgbWV0aG9kLiBUaGUgdHJ1bmNhdGVkIGZvbGlvIGNoZWNrIG11c3QgY29tZSBmaXJzdC5cXG4tLVxcbm1tL2h1Z2VfbWVtb3J5LmMtMzg3NS0gKi9cXG5tbS9odWdlX21lbW9yeS5jOjM4NzY6aW50IGZvbGlvX2NoZWNrX3NwbGl0dGFibGUoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlcixcXG5tbS9odWdlX21lbW9yeS5jLTM4NzctXFx0XFx0XFx0ICAgZW51bSBzcGxpdF90eXBlIHNwbGl0X3R5cGUpXFxuLS1cXG5tbS9odWdlX21lbW9yeS5jPTQyNDc9c3RhdGljIGludCBfX2ZvbGlvX3NwbGl0KHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIsXFxuLS1cXG5tbS9odWdlX21lbW9yeS5jLTQyNzAtXFxubW0vaHVnZV9tZW1vcnkuYzo0MjcxOlxcdHJldCA9IGZvbGlvX2NoZWNrX3NwbGl0dGFibGUoZm9saW8sIG5ld19vcmRlciwgc3BsaXRfdHlwZSk7XFxubW0vaHVnZV9tZW1vcnkuYy00MjcyLVxcdGlmIChyZXQpIHtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDdUMjE6NTQ6NTcuNDUyNTU3MzU5WiIsIlNlcSI6MjMsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjU1NTM0NTU5MzIsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqTXkgQW5hbHlzaXMgb2YgdGhlIEZvbGlvIFNwbGl0dGluZyBGdW5jdGlvbnMqKlxuXG5Pa2F5LCBzbyBJJ20gbG9va2luZyBhdCB0aGlzIGNvZGUgYW5kIHRyeWluZyB0byBnZXQgYSBoYW5kbGUgb24gdGhlIGtleSBmdW5jdGlvbnMgaGVyZSwgcGFydGljdWxhcmx5IGZvciBmdXp6aW5nLiBJIGNhbiBzZWUgdGhhdCB0aGlzIGZ1bmN0aW9uLCB3aGlsZSBleHBvcnRlZCwgaXMgZXNzZW50aWFsbHkgYSBoZWxwZXIgZnVuY3Rpb24uIFRoZSByZWFsIHdvcmtob3JzZXMgc2VlbSB0byBiZSBgZm9saW9fc3BsaXRgLCBgZm9saW9fc3BsaXRfdW5tYXBwZWRgLCBhbmQgYF9fc3BsaXRfaHVnZV9wYWdlX3RvX2xpc3RfdG9fb3JkZXJgLiBNeSBpbml0aWFsIHRob3VnaHQgaXMgdG8gZm9jdXMgb24gdGhvc2UuXG5cbk5vdywgbGV0IG1lIGp1c3QgY29uZmlybSBzb21ldGhpbmcuLi4gYWgsIHllcy4gYHNwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyYCBpcyBhbiBpbmxpbmUgZnVuY3Rpb24sIGFuZCBpdCdzIGNhbGxpbmcgYF9fc3BsaXRfaHVnZV9wYWdlX3RvX2xpc3RfdG9fb3JkZXJgLiBTaW5jZSBpdCdzIGlubGluZSwgYW5kIHRoaXMgaXMgdGhlIG9uZSBhY3R1YWxseSAqZG9pbmcqIHRoZSB3b3JrLCBsZXQncyB0YXJnZXQgYF9fc3BsaXRfaHVnZV9wYWdlX3RvX2xpc3RfdG9fb3JkZXJgIGluc3RlYWQgb2YgaXRzIGlubGluZWQgY291bnRlcnBhcnQuXG5cbkkgc2VlIHRoYXQgYHNwbGl0X2ZvbGlvX3RvX2xpc3RgIGlzIGFsc28gaW5saW5lLCBhbmQgaXQgY2FsbHMgYHNwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyYC4gT2theSwgdGhhdCBjbGFyaWZpZXMgdGhpbmdzLlxuXG5TbywgaGVyZSdzIG15IHVwZGF0ZWQgbGlzdCBvZiBmdW5jdGlvbnMgdG8gZnV6ejpcblxuKiAgIGBfX3NwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyYCAtIFRoaXMgaXMgYSBwcmltYXJ5IGNhbmRpZGF0ZS5cbiogICBgZm9saW9fc3BsaXRgIC0gSXQncyBhIG1haW4gZW50cnkgcG9pbnQuXG4qICAgYGZvbGlvX3NwbGl0X3VubWFwcGVkYCAtIEFub3RoZXIgbWFpbiBlbnRyeSBwb2ludC5cbiogICBgX19zd2FwX2NhY2hlX3JlcGxhY2VfZm9saW9gIC0gV2Ugc2hvdWxkIGxvb2sgYXQgdGhpcyBhcyB3ZWxsLlxuXG5Ob3csIGxldCdzIHNlZSBpZiBgX19zd2FwX2NhY2hlX3JlcGxhY2VfZm9saW9gIGlzIGFjdHVhbGx5IGV4cG9ydGVkLlxuXG5cbiIsIklucHV0VG9rZW5zIjoyMzgzMiwiT3V0cHV0VG9rZW5zIjozMiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjIyOSwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0wN1QyMTo1NTowMy4wMDYwMTYxMDFaIiwiU2VxIjoyNCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjIyMjQxOTcxMzUsIkVycm9yIjoibm8gbWF0Y2hlcyIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcIkVYUE9SVF9TWU1CT0wuKl9fc3dhcF9jYWNoZV9yZXBsYWNlX2ZvbGlvXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIlwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJlcnJvclwiOiBcIm5vIG1hdGNoZXNcIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDdUMjE6NTU6MDUuMjMwMjE5ODI2WiIsIlNlcSI6MjUsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjM0NzAxODE3MTcsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGhlcmUncyBteSB0YWtlIG9uIHRob3NlIHRob3VnaHRzLCBmcmFtZWQgYXMgbXkgb3duOlxuXG4qKkFuYWx5emluZyBhIEZ1bmN0aW9uJ3MgU2NvcGUqKlxuXG5BbHJpZ2h0LCBzbyB0aGUgZnVuY3Rpb24gaW4gcXVlc3Rpb24gaXNuJ3QgZXhwbGljaXRseSBleHBvcnRlZCwgYnV0IGl0J3MgZGVmaW5lZCBnbG9iYWxseSDigJMgdGhhdCdzIHRoZSBrZXkuIFNvLCBzaW5jZSBpdCBpc24ndCBzdGF0aWMsIGl0J3MgZ2xvYmFsbHkgdmlzaWJsZSB3aXRoaW4gdGhlIGtlcm5lbCwgZXZlbiBpZiBpdCdzIG5vdCBwYXJ0IG9mIHRoZSBzdGFuZGFyZCBBQkkuIE5vdywgSSBuZWVkIHRvIHVuZGVyc3RhbmQgaXRzIHJlbGF0aW9uc2hpcCB0byB0aGUgc3dhcCBjYWNoZS4gU2luY2UgdGhpcyBsb29rcyBsaWtlIGEgc3dhcC1yZWxhdGVkIGZ1bmN0aW9uLCBteSBpbnR1aXRpb24gaW1tZWRpYXRlbHkgcG9pbnRzIG1lIHRvd2FyZCBgbW0vc3dhcF9zdGF0ZS5jYC4gTGV0J3MgZGlnIGludG8gdGhhdCBzb3VyY2UgZmlsZSBhbmQgbG9vayBmb3IgdGhlIGZ1bmN0aW9uIGBfX3N3YXBfY2FjaGVfcmVwbGFjZV9mb2xpb2AuIFRoYXQgc2hvdWxkIGdpdmUgbWUgdGhlIGNvbnRleHQgSSBuZWVkIHRvIGZpZ3VyZSBvdXQgaXRzIHB1cnBvc2UuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjI0NDY3LCJPdXRwdXRUb2tlbnMiOjM1LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NDIsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDdUMjE6NTU6MDguNzAwNDA0MDczWiIsIlNlcSI6MjYsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo0MTk0Mjk5OCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJfX3N3YXBfY2FjaGVfcmVwbGFjZV9mb2xpb1wiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJtbS9zd2FwX3N0YXRlLmNcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwibW0vc3dhcF9zdGF0ZS5jPTMzNT12b2lkIHN3YXBfY2FjaGVfZGVsX2ZvbGlvKHN0cnVjdCBmb2xpbyAqZm9saW8pXFxuLS1cXG5tbS9zd2FwX3N0YXRlLmMtMzQ3LS8qKlxcbm1tL3N3YXBfc3RhdGUuYzozNDg6ICogX19zd2FwX2NhY2hlX3JlcGxhY2VfZm9saW8gLSBSZXBsYWNlIGEgZm9saW8gaW4gdGhlIHN3YXAgY2FjaGUuXFxubW0vc3dhcF9zdGF0ZS5jLTM0OS0gKiBAY2k6IFRoZSBsb2NrZWQgc3dhcCBjbHVzdGVyLlxcbi0tXFxubW0vc3dhcF9zdGF0ZS5jLTM2MC0gKi9cXG5tbS9zd2FwX3N0YXRlLmM6MzYxOnZvaWQgX19zd2FwX2NhY2hlX3JlcGxhY2VfZm9saW8oc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSxcXG5tbS9zd2FwX3N0YXRlLmMtMzYyLVxcdFxcdFxcdFxcdHN0cnVjdCBmb2xpbyAqb2xkLCBzdHJ1Y3QgZm9saW8gKm5ldylcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDdUMjE6NTU6MDguNzQyMzQ5MzNaIiwiU2VxIjoyNywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NDAzMDAxMTc0OCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgaGVyZSdzIG15IGludGVycHJldGF0aW9uIG9mIHRoZXNlIHRob3VnaHRzLCBwdXR0aW5nIG15c2VsZiBpbiB0aGUgcm9sZSBvZiBhbiBleHBlcnQ6XG5cbioqSW52ZXN0aWdhdGluZyB0aGUgU2NvcGUgYW5kIERlcGVuZGVuY2llcyoqXG5cbkFscmlnaHQsIHNvIHRoaXMgbG9va3MgbGlrZSBhIGdsb2JhbCBmdW5jdGlvbiwgYSBrZXkgcGllY2Ugb2YgaW5mcmFzdHJ1Y3R1cmUuIEZpcnN0IHRoaW5ncyBmaXJzdCwgSSBuZWVkIHRvIHVuZGVyc3RhbmQgaXRzIGNvbnRleHQuIExldCdzIHNlZS4uLiBJIHNob3VsZCBjaGVjayBmb3Igb3RoZXIgcmVsYXRlZCBjb25maWd1cmF0aW9ucy4gTXkgbWVudGFsIGNoZWNrbGlzdCBraWNrcyBpbjogSSdtIHRoaW5raW5nIGFib3V0IHRoZSBpbXBsaWNhdGlvbnMgb2YgdGhlIGBDT05GSUdfVFJBTlNQQVJFTlRfSFVHRVBBR0VgLCBzaW5jZSB0aGlzIGNvdWxkIGluZmx1ZW5jZSBtZW1vcnkgbWFuYWdlbWVudCBzaWduaWZpY2FudGx5LiBUaGVuLCB0aGUgcHJlc2VuY2Ugb2YgYENPTkZJR19TV0FQYCBkZWZpbml0ZWx5IGJlYXJzIHdhdGNoaW5nLiBGaW5hbGx5LCB0aGUgdXNlIG9mIGBtZW1fY2dyb3VwX2Zyb21fZm9saW9gIGFuZCBgc2V0X2FjdGl2ZV9tZW1jZ2AgaXMgdGhlIG1vc3QgaW1wb3J0YW50IHBhcnQgb2YgdGhpcyBmdW5jdGlvbi4gVGhpcyBmdW5jdGlvbiBhYnNvbHV0ZWx5IHNjcmVhbXMgYENPTkZJR19NRU1DR2AgZGVwZW5kZW5jeSB0byBtZS4gTXkgaW50dWl0aW9uIGlzIHRoYXQgdGhpcyBpcyBhYnNvbHV0ZWx5IGEgZGVwZW5kZW5jeS4gTGV0J3MgZGlnIGRlZXBlciBhbmQgdmVyaWZ5IHRoYXQgYE1FTUNHYCBjb25maWd1cmF0aW9uIGlzIGFjdHVhbGx5IG5lY2Vzc2FyeSBhbmQgbm90IGp1c3QgYSBsZWZ0b3ZlciB0cmFjZS4gVW5kZXJzdGFuZGluZyAqdGhpcyogaXMgdGhlIG1vc3QgaW1wb3J0YW50IHRoaW5nLlxuXG5cbiIsIklucHV0VG9rZW5zIjoyNDg4MiwiT3V0cHV0VG9rZW5zIjozMywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjgyLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA3VDIxOjU1OjEyLjc3MjM2MzEzOVoiLCJTZXEiOjI4LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NDM1ODMzNTcsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwic2V0X2FjdGl2ZV9tZW1jZ1wiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJtbS9odWdlX21lbW9yeS5jXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm1tL2h1Z2VfbWVtb3J5LmM9NDA2MD1zdGF0aWMgaW50IF9fZm9saW9fZnJlZXplX3NwbGl0X3VubWFwX2ZpbGUoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlcixcXG4tLVxcbm1tL2h1Z2VfbWVtb3J5LmMtNDA4NS1cXHRtZW1jZyA9IGdldF9tZW1fY2dyb3VwX2Zyb21fZm9saW8oZm9saW8pO1xcbm1tL2h1Z2VfbWVtb3J5LmM6NDA4NjpcXHRvbGRfbWVtY2cgPSBzZXRfYWN0aXZlX21lbWNnKG1lbWNnKTtcXG5tbS9odWdlX21lbW9yeS5jLTQwODctXFxuLS1cXG5tbS9odWdlX21lbW9yeS5jLTQyMTktXFx0LyogUmVzdG9yZSB0aGUgcHJldmlvdXNseSBhY3RpdmUgbWVtY2cgKi9cXG5tbS9odWdlX21lbW9yeS5jOjQyMjA6XFx0c2V0X2FjdGl2ZV9tZW1jZyhvbGRfbWVtY2cpO1xcbm1tL2h1Z2VfbWVtb3J5LmMtNDIyMS1cXHRtZW1fY2dyb3VwX3B1dChtZW1jZyk7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA3VDIxOjU1OjEyLjgxNTk0ODc3NloiLCJTZXEiOjI5LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjozMzQ3MTEyNTY2LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBoZXJlJ3MgbXkgdGFrZSBvbiB0aG9zZSB0aG91Z2h0cywgZnJhbWVkIGFzIG15IG93bjpcblxuKipJbnZlc3RpZ2F0aW5nIGEgUG90ZW50aWFsIE5vLU9wKipcblxuSG1tLCBJIHNlZSB0aGlzIGZ1bmN0aW9uIGNhbGwuIEl0ICpsb29rcyogbGlrZSBpdCdzIGJlaW5nIHVzZWQsIGJ1dCBJJ3ZlIGdvdCBhIGZlZWxpbmcgaXQgbWlnaHQganVzdCBiZSBhIG5vLW9wIHVuZGVyIGNlcnRhaW4gY29uZmlndXJhdGlvbnMuIE15IGd1dCB0ZWxscyBtZSBpdCdzIHByb2JhYmx5IHRpZWQgdG8gbWVtb3J5IGNvbnRyb2wgZ3JvdXBzLCBvciBgQ09ORklHX01FTUNHYC4gTGV0IG1lIHF1aWNrbHkgY29uZmlybSB0aGlzIGh5cG90aGVzaXMuIFRoZSBkZWZpbml0aW9ucyBmb3IgdGhpcyBraW5kIG9mIHRoaW5nIGFsd2F5cyByZXNpZGUgaW4gYGluY2x1ZGUvbGludXgvbWVtY29udHJvbC5oYC4gVGltZSB0byBkaWcgaW4gdGhlcmUgYW5kIHNlZSBpZiBteSBodW5jaCBpcyBjb3JyZWN0LiBJIGJldCBpdCdzIGNvbmRpdGlvbmFsbHkgY29tcGlsZWQuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjI1NDEzLCJPdXRwdXRUb2tlbnMiOjM0LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NDIsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDdUMjE6NTU6MTYuMTYzMDYzODAyWiIsIlNlcSI6MzAsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo0MzU4ODExNywiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJzZXRfYWN0aXZlX21lbWNnXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcImluY2x1ZGUvbGludXgvbWVtY29udHJvbC5oXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImluY2x1ZGUvbGludXgvbWVtY29udHJvbC5oPTE3MzY9dm9pZCBfX21lbWNnX2ttZW1fdW5jaGFyZ2VfcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSwgaW50IG9yZGVyKTtcXG4tLVxcbmluY2x1ZGUvbGludXgvbWVtY29udHJvbC5oLTE3NDEtICogdGhlIGN1cnJlbnQgdGFzayAoc2ltaWxhciB0byB0aGUgXFxcImN1cnJlbnRcXFwiIGdsb2JhbCB2YXJpYWJsZSlcXG5pbmNsdWRlL2xpbnV4L21lbWNvbnRyb2wuaDoxNzQyOiAqIG9yIGJ5IHNldF9hY3RpdmVfbWVtY2coKSBwYWlyLlxcbmluY2x1ZGUvbGludXgvbWVtY29udHJvbC5oLTE3NDMtICogUGxlYXNlLCB1c2Ugb2JqX2Nncm91cF9nZXQoKSB0byBnZXQgYSByZWZlcmVuY2UgaWYgdGhlIHBvaW50ZXJcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDdUMjE6NTU6MTYuMjA2NjU2MDE5WiIsIlNlcSI6MzEsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjY4NTEyMjM0NzEsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqTXkgQW5hbHlzaXMgb2YgdGhlIEh1Z2UgUGFnZSBTcGxpdHRpbmcgTG9naWMqKlxuXG5Pa2F5LCBzbyBJJ3ZlIGJlZW4gdGFraW5nIGEgbG9vayBhdCB0aGlzIHBhdGNoLCBhbmQgdGhlIGNvcmUgb2YgaXQgc2VlbXMgcHJldHR5IHN0cmFpZ2h0Zm9yd2FyZC4gVGhlIG1haW4gY29uZmlndXJhdGlvbnMgdGhhdCBJJ20gZm9jdXNpbmcgb24gYXJlLCBvZiBjb3Vyc2UsIGBUUkFOU1BBUkVOVF9IVUdFUEFHRWAgYW5kIGBTV0FQYC4gVGhvc2UgYXJlIHRoZSBvbmVzIGRyaXZpbmcgdGhlIHNpZ25pZmljYW50IGNoYW5nZXMgaGVyZS5cblxuTm93LCBsZXQncyBicmVhayBkb3duIHRoZSBrZXkgZnVuY3Rpb25zIGF0IHBsYXkuIFdlJ3ZlIGdvdDpcblxuKiAgIGBfX3NwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyYDogVGhpcyBhcHBlYXJzIHRvIGJlIHRoZSBwcmltYXJ5IGVudHJ5IHBvaW50IGZvciBzcGxpdHRpbmcgdGhlc2UgaHVnZSBwYWdlcy5cbiogICBgZm9saW9fc3BsaXRgOiBBbm90aGVyIGNydWNpYWwgZW50cnkgcG9pbnQgdG8gbWFuYWdlIHRoaXMgcHJvY2Vzcy5cbiogICBgZm9saW9fc3BsaXRfdW5tYXBwZWRgOiBUaGlzIGlzIGFub3RoZXIgZW50cnkgcG9pbnQgZm9yIHNwbGl0dGluZyB1bm1hcHBlZCBmb2xpb3MuXG4qICAgYF9fc3dhcF9jYWNoZV9yZXBsYWNlX2ZvbGlvYDogVGhlbiwgdGhlcmUncyB0aGlzIGhlbHBlciBmdW5jdGlvbiwgd2hpY2ggaXMgaW50ZXJlc3RpbmcgYmVjYXVzZSBpdCdzIGluIGBtbS9zd2FwX3N0YXRlLmNgLlxuXG5JJ2xsIG1ha2Ugc3VyZSB0byBkb3VibGUtY2hlY2sgdGhlIHJvbGUgb2YgYF9fc3BsaXRfaHVnZV9wYWdlX3RvX2xpc3RfdG9fb3JkZXJgLCBpdCBsb29rcyBsaWtlIGl0J3MgdGhlIG1haW4gZW50cnkgcG9pbnQgdG8gc3BsaXR0aW5nLlxuXG5Gcm9tIHdoYXQgSSBjYW4gdGVsbCwgdGhpcyBwYXRjaCBpcyByZWFsbHkgcmV3b3JraW5nIHRoZSBzcGxpdHRpbmcgbG9naWMsIHBhcnRpY3VsYXJseSB3aGVuIGRlYWxpbmcgd2l0aCB1bm1hcHBlZCBmb2xpb3MuIEl0IHNlZW1zIHRvIGJlIHBheWluZyBzcGVjaWFsIGF0dGVudGlvbiB0byBzd2FwY2FjaGUgYW5kIGFub255bW91cyBmb2xpb3MsIHdoaWNoIG1ha2VzIHNlbnNlIGdpdmVuIHRoZSBwb3RlbnRpYWwgcGVyZm9ybWFuY2UgaW1wbGljYXRpb25zLiBTcGVjaWZpY2FsbHksIHRoZSBwYXRjaCBpbnRyb2R1Y2VzIGBfX2ZvbGlvX2ZyZWV6ZV9zcGxpdF91bm1hcGAgYW5kIGBfX2ZvbGlvX2ZyZWV6ZV9zcGxpdF91bm1hcF9maWxlYCBhcyBzdGF0aWMgZnVuY3Rpb25zLiBJdCBhbHNvIGFwcGVhcnMgdG8gYmUgbW9kaWZ5aW5nIGBmb2xpb19jaGVja19zcGxpdHRhYmxlYCB0byBoYW5kbGUgc3dhcGNhY2hlIGZvbGlvcyBkaWZmZXJlbnRseSBhbmQgbW9kaWZ5aW5nIGBfX2ZvbGlvX3NwbGl0YCB0byBjYWxsIHRoZXNlIG5ldyBmdW5jdGlvbnMuXG5cbkkgdGhpbmsgdGhlcmUgYXJlIGVub3VnaCBpbnRlcmVzdGluZyBwaWVjZXMgaGVyZS4gSXQncyB0aW1lIHRvIHNldCBgV29ydGhGdXp6aW5nPXRydWVgLlxuXG5JJ2xsIGJlIGtlZXBpbmcgYSB2ZXJ5IGNsb3NlIGV5ZSBvbiB0aGVzZSBzeW1ib2xzOlxuXG4qICAgYF9fc3BsaXRfaHVnZV9wYWdlX3RvX2xpc3RfdG9fb3JkZXJgXG4qICAgYGZvbGlvX3NwbGl0YFxuKiAgIGBmb2xpb19zcGxpdF91bm1hcHBlZGBcbiogICBgX19zd2FwX2NhY2hlX3JlcGxhY2VfZm9saW9gXG5cbkFuZCB0byBiZSBzdXJlLCBJIHdpbGwga2VlcCBgVFJBTlNQQVJFTlRfSFVHRVBBR0VgIGFuZCBgU1dBUGAgZW5hYmxlZC5cblxuT25lIGxhc3QgdGhpbmcsIGxldCBtZSBqdXN0IHF1aWNrbHkgY29uZmlybSB3aGV0aGVyIGBmb2xpb19zcGxpdGAgaXMgZXhwb3J0ZWQgcHJvcGVybHkgb3IgaWYgaXQgaXMganVzdCBhIGdsb2JhbCBmdW5jdGlvbi5cblxuXG4iLCJJbnB1dFRva2VucyI6MjU3NjMsIk91dHB1dFRva2VucyI6MjcsIk91dHB1dFRob3VnaHRzVG9rZW5zIjozNTcsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDdUMjE6NTU6MjMuMDU3ODgyNVoiLCJTZXEiOjMyLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MjIzOTQyNjEzMywiRXJyb3IiOiJubyBtYXRjaGVzIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiRVhQT1JUX1NZTUJPTC4qZm9saW9fc3BsaXRcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwiXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcImVycm9yXCI6IFwibm8gbWF0Y2hlc1wiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0wN1QyMTo1NToyNS4yOTczMTUxMjNaIiwiU2VxIjozMywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MzEzOTI5MzY4MSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IGF0dGVtcHQgYXQgc3VtbWFyaXppbmcgdGhhdCB0aG91Z2h0IHByb2Nlc3MsIHRhaWxvcmVkIGZvciBhbiBleHBlcnQgYXVkaWVuY2U6XG5cbioqR2xvYmFsIFNjb3BlIENoZWNrOiBgZm9saW9fc3BsaXRfdW5tYXBwZWRgKipcblxuT2theSwgbXkgaW5pdGlhbCBpbXByZXNzaW9uIGlzIHRoaXMgaXMgYSBnbG9iYWwgaXNzdWUuIFRoZSBmYWN0IHRoYXQgaXQncyBzdXJmYWNlZCBhdCBhbGwgc3VnZ2VzdHMgaXQncyBub3QgaXNvbGF0ZWQuIEkgbmVlZCB0byBmaWd1cmUgb3V0IHRoZSBleHRlbnQgb2YgdGhlIGltcGFjdC4gVGhlIG1lbnRpb24gb2YgYGZvbGlvX3NwbGl0X3VubWFwcGVkYCBpbW1lZGlhdGVseSBicmluZ3MgbWUgdG8gbWluZCBvZiBhIGNydWNpYWwgYXJlYSB3aXRoaW4gdGhlIGNvcmUgZGF0YSBwaXBlbGluZS4gSSdtIGdvaW5nIHRvIHdhbnQgdG8gZm9jdXMgb24gdGhhdCBzcGVjaWZpYyBmdW5jdGlvbiBvciBwcm9jZXNzLCBpdCdzIGtleS4gSWYgaXQncyByZWxhdGVkIHRvIGhvdyB3ZSdyZSBzcGxpdHRpbmcgb3IgbWFwcGluZyBGb2xpbyBkYXRhLCB3aGljaCBzZWVtcyBsaWtlbHkgZ2l2ZW4gdGhlIG5hbWUsIHRoYXQncyBhbG1vc3QgYWx3YXlzIGEgY3JpdGljYWwgcGFydCBvZiBkYXRhIGxvYWRpbmcgb3IgdHJhbnNmb3JtYXRpb24uIExldCdzIGRlbHZlIGluIHRvIHRoYXQgZnVuY3Rpb24gZGlyZWN0bHkuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjI2NjcxLCJPdXRwdXRUb2tlbnMiOjMwLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTgsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDdUMjE6NTU6MjguNDM2NjExNTY0WiIsIlNlcSI6MzQsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyMjYxNTQxNjcyLCJFcnJvciI6Im5vIG1hdGNoZXMiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJFWFBPUlRfU1lNQk9MLipmb2xpb19zcGxpdF91bm1hcHBlZFwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiZXJyb3JcIjogXCJubyBtYXRjaGVzXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA3VDIxOjU1OjMwLjY5ODE2MjM1NloiLCJTZXEiOjM1LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjozMzUxNjUzMTU1LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBoZXJlJ3MgbXkgdGFrZSBvbiB0aG9zZSB0aG91Z2h0cywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZTpcblxuKipHbG9iYWwgU2NvcGUgQ2hlY2s6IGBfX3NwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyYCoqXG5cblJpZ2h0LCB0aGlzIGZlZWxzIGxpa2UgaXQncyBhIHBpZWNlIG9mIHNvbWV0aGluZyBtdWNoIGxhcmdlciwgc29tZXRoaW5nIHdpdGggZ2xvYmFsIGltcGxpY2F0aW9ucywgYW5kIGl0J3MgaW1wb3J0YW50IHRvIGdyYXNwIHRoZSBmdWxsIGJyZWFkdGggb2YgdGhlIHNpdHVhdGlvbi4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhlIGdsb2JhbCBzY29wZSBvZiB0aGlzIGlzc3VlIHRvIGZ1bGx5IGRpZ2VzdCB0aGUgcHJvYmxlbS4gTXkgZmlyc3QgaW5zdGluY3QsIGdpdmVuIHRoZSBicmllZiwgaXMgdG8gaW1tZWRpYXRlbHkgY2hlY2sgdGhlIGZ1bmN0aW9uIEkga25vdyB0byBiZSBtb3N0IHBlcnRpbmVudCBpbiB0aGlzIHNpdHVhdGlvbjogYF9fc3BsaXRfaHVnZV9wYWdlX3RvX2xpc3RfdG9fb3JkZXJgLiBUaGlzIGlzIHdoZXJlIEknZCBzdGFydCBkaWdnaW5nIGludG8gdGhlIGRldGFpbHMgb2YgdGhlIGh1Z2UgcGFnZSBtYW5hZ2VtZW50LiBUaGlzIHJvdXRpbmUgaXMgbGlrZWx5IHRoZSBseW5jaHBpbiwgdGhlIHBsYWNlIHdoZXJlIGRlY2lzaW9ucyByZWdhcmRpbmcgb3JkZXJpbmcgYW5kIHNwbGl0dGluZyBhcmUgbWFkZSwgcGFydGljdWxhcmx5IHdpdGhpbiB0aGUgY29udGV4dCBvZiBtYXNzaXZlIG1lbW9yeSBhbGxvY2F0aW9uIG9yIHBvdGVudGlhbGx5IGRlLWFsbG9jYXRpb247IGFuZCBpcyB0aGUgb2J2aW91cyBmaXJzdCBwbGFjZSB0byBleHBsb3JlLiBJJ20gaW1tZWRpYXRlbHkgdHJ5aW5nIHRvIHVuZGVyc3RhbmQgaG93IHRoaXMgaW1wYWN0cyB0aGUgbGFyZ2VyIHN5c3RlbS5cblxuXG4iLCJJbnB1dFRva2VucyI6MjY5MDAsIk91dHB1dFRva2VucyI6MzgsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoyNiwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0wN1QyMTo1NTozNC4wNDk4MTgzMDFaIiwiU2VxIjozNiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjIyNDY2MTc2MzMsIkVycm9yIjoibm8gbWF0Y2hlcyIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcIkVYUE9SVF9TWU1CT0wuKl9fc3BsaXRfaHVnZV9wYWdlX3RvX2xpc3RfdG9fb3JkZXJcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwiXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcImVycm9yXCI6IFwibm8gbWF0Y2hlc1wiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0wN1QyMTo1NTozNi4yOTY0NDI0NDRaIiwiU2VxIjozNywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NjQ4NjIxNjA0NywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgaGVyZSdzIG15IHRha2Ugb24gdGhvc2UgdGhvdWdodHMsIGZyYW1lZCBmcm9tIG15IGV4cGVydCBwZXJzcGVjdGl2ZTpcblxuKipEZWVwIERpdmUgb24gRm9saW8gU3BsaXR0aW5nKipcblxuUmlnaHQsIHRoaXMgaXMgYSBzeXN0ZW1pYyBjaGFuZ2Ug4oCTIGl0J3MgZ2xvYmFsIGluIGl0cyBpbXBsaWNhdGlvbnMuIEFuZCBhIHF1aWNrIGNsYXJpZmljYXRpb246IHRoYXQgYHNwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyYCBmdW5jdGlvbiBJIHdhcyBsb29raW5nIGF0PyBJdCdzIGlubGluZSwgc28gdGhlIHJlYWwgd29ya2hvcnNlIGlzIGFjdHVhbGx5IGBfX3NwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyYC4gR290IGl0LlxuXG5Ob3csIGxldCdzIHVucGFjayB0aGUgbG9naWMuIFRoaXMgcGF0Y2ggaXMgZXNzZW50aWFsbHkgcmVmYWN0b3JpbmcgdGhlIHdheSB3ZSBoYW5kbGUgdGhlIHNwbGl0dGluZyBvZiB1bm1hcHBlZCBmb2xpb3MsIGZvY3VzaW5nIG9uIHRoZSBzd2FwY2FjaGUgYW5kIGFub255bW91cyBmb2xpbyBzY2VuYXJpb3MuIEkgc2VlIHRoZXkncmUgaW50cm9kdWNpbmcgYF9fZm9saW9fZnJlZXplX3NwbGl0X3VubWFwYCBhbmQgYF9fZm9saW9fZnJlZXplX3NwbGl0X3VubWFwX2ZpbGVgIGFzIHJlcGxhY2VtZW50cyBmb3IgdGhhdCBvbGRlciBgX19mb2xpb19mcmVlemVfYW5kX3NwbGl0X3VubWFwcGVkYCBmdW5jdGlvbi4gR29vZCBtb3ZlIOKAkyBtb2R1bGFyaXR5IGFuZCBjbGFyaXR5IGFyZSBhbHdheXMgd2VsY29tZSBoZXJlLiBUaGV5J3JlIGFsc28gYWRqdXN0aW5nIGBmb2xpb19jaGVja19zcGxpdHRhYmxlYCBhbmQgYF9fZm9saW9fc3BsaXRgIHRvIGxldmVyYWdlIHRoZXNlIG5ldyBmdW5jdGlvbnMuXG5cblRoaXMgaGl0cyByaWdodCBhdCB0aGUgaGVhcnQgb2YgY29yZSBtZW1vcnkgbWFuYWdlbWVudCDigJMgc3BlY2lmaWNhbGx5LCBUSFAgYW5kIGZvbGlvIHNwbGl0dGluZy4gV2UncmUgdGFsa2luZyBhYm91dCBpbmNyZWRpYmx5IGNvbXBsZXggY29kZSwgd2l0aCBhIGhpZ2ggcG90ZW50aWFsIGZvciByYWNlIGNvbmRpdGlvbnMuIEdpdmVuIHRoZSBpbnRyaWNhdGUgbmF0dXJlIG9mIHRoZXNlIGNoYW5nZXMsIHRoZSBmb2N1cyBvbiBmdXp6aW5nIHRoZSBtYWluIGZvbGlvIHNwbGl0dGluZyBlbnRyeSBwb2ludHMgaXMgYWJzb2x1dGVseSBjcml0aWNhbC4gV2UgbmVlZCB0byBzdWJqZWN0IHRoaXMgdG8gcmlnb3JvdXMgdGVzdGluZyB0byBlbnN1cmUgcm9idXN0bmVzcy5cblxuT2theSwgSSdtIHJlYWR5IHRvIGNhbGwgYHNldC1yZXN1bHRzYCBhbmQgbG9nIHRoZXNlIGZpbmRpbmdzLlxuXG5cbiIsIklucHV0VG9rZW5zIjoyNzE4NCwiT3V0cHV0VG9rZW5zIjoyMjQsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoyMDMsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDdUMjE6NTU6NDIuNzgyNjYxMTgxWiIsIlNlcSI6MzgsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InNldC1yZXN1bHRzIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6Nzg0NTQyNDUsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIlRSQU5TUEFSRU5UX0hVR0VQQUdFXCIsXG4gICAgXCJTV0FQXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwiX19zcGxpdF9odWdlX3BhZ2VfdG9fbGlzdF90b19vcmRlclwiLFxuICAgIFwiZm9saW9fc3BsaXRcIixcbiAgICBcImZvbGlvX3NwbGl0X3VubWFwcGVkXCIsXG4gICAgXCJfX3N3YXBfY2FjaGVfcmVwbGFjZV9mb2xpb1wiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIHJld29ya3MgdGhlIGxvZ2ljIGZvciBzcGxpdHRpbmcgdW5tYXBwZWQgZm9saW9zLCBzcGVjaWZpY2FsbHkgaGFuZGxpbmcgc3dhcGNhY2hlIGFuZCBhbm9ueW1vdXMgZm9saW9zLiBJdCBpbnRyb2R1Y2VzIG5ldyBzdGF0aWMgZnVuY3Rpb25zIGBfX2ZvbGlvX2ZyZWV6ZV9zcGxpdF91bm1hcGAgYW5kIGBfX2ZvbGlvX2ZyZWV6ZV9zcGxpdF91bm1hcF9maWxlYCB0byByZXBsYWNlIGBfX2ZvbGlvX2ZyZWV6ZV9hbmRfc3BsaXRfdW5tYXBwZWRgLiBJdCBhbHNvIG1vZGlmaWVzIGBmb2xpb19jaGVja19zcGxpdHRhYmxlYCBhbmQgYF9fZm9saW9fc3BsaXRgIHRvIHVzZSB0aGUgbmV3IGxvZ2ljLiBUaGUgY2hhbmdlcyBhZmZlY3QgY29yZSBtZW1vcnkgbWFuYWdlbWVudCwgc3BlY2lmaWNhbGx5IFRIUCBhbmQgZm9saW8gc3BsaXR0aW5nLCB3aGljaCBhcmUgaGlnaGx5IGNvbXBsZXggYW5kIHByb25lIHRvIHJhY2UgY29uZGl0aW9ucy4gRnV6emluZyB0aGUgbWFpbiBlbnRyeSBwb2ludHMgZm9yIGZvbGlvIHNwbGl0dGluZyBpcyBpbXBvcnRhbnQgdG8gZW5zdXJlIHRoZSBuZXcgbG9naWMgaXMgcm9idXN0LlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIlRSQU5TUEFSRU5UX0hVR0VQQUdFXCIsXG4gICAgXCJTV0FQXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwiX19zcGxpdF9odWdlX3BhZ2VfdG9fbGlzdF90b19vcmRlclwiLFxuICAgIFwiZm9saW9fc3BsaXRcIixcbiAgICBcImZvbGlvX3NwbGl0X3VubWFwcGVkXCIsXG4gICAgXCJfX3N3YXBfY2FjaGVfcmVwbGFjZV9mb2xpb1wiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIHJld29ya3MgdGhlIGxvZ2ljIGZvciBzcGxpdHRpbmcgdW5tYXBwZWQgZm9saW9zLCBzcGVjaWZpY2FsbHkgaGFuZGxpbmcgc3dhcGNhY2hlIGFuZCBhbm9ueW1vdXMgZm9saW9zLiBJdCBpbnRyb2R1Y2VzIG5ldyBzdGF0aWMgZnVuY3Rpb25zIGBfX2ZvbGlvX2ZyZWV6ZV9zcGxpdF91bm1hcGAgYW5kIGBfX2ZvbGlvX2ZyZWV6ZV9zcGxpdF91bm1hcF9maWxlYCB0byByZXBsYWNlIGBfX2ZvbGlvX2ZyZWV6ZV9hbmRfc3BsaXRfdW5tYXBwZWRgLiBJdCBhbHNvIG1vZGlmaWVzIGBmb2xpb19jaGVja19zcGxpdHRhYmxlYCBhbmQgYF9fZm9saW9fc3BsaXRgIHRvIHVzZSB0aGUgbmV3IGxvZ2ljLiBUaGUgY2hhbmdlcyBhZmZlY3QgY29yZSBtZW1vcnkgbWFuYWdlbWVudCwgc3BlY2lmaWNhbGx5IFRIUCBhbmQgZm9saW8gc3BsaXR0aW5nLCB3aGljaCBhcmUgaGlnaGx5IGNvbXBsZXggYW5kIHByb25lIHRvIHJhY2UgY29uZGl0aW9ucy4gRnV6emluZyB0aGUgbWFpbiBlbnRyeSBwb2ludHMgZm9yIGZvbGlvIHNwbGl0dGluZyBpcyBpbXBvcnRhbnQgdG8gZW5zdXJlIHRoZSBuZXcgbG9naWMgaXMgcm9idXN0LlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0wN1QyMTo1NTo0Mi44NjExMjE2MjVaIiwiU2VxIjozOSwiTmVzdGluZyI6MSwiVHlwZSI6ImFjdGlvbiIsIk5hbWUiOiJJZiIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjExMTc1Mjg1OTM5LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDdUMjE6NTU6NDIuODYxNTMyMDI1WiIsIlNlcSI6NDAsIk5lc3RpbmciOjIsIlR5cGUiOiJhZ2VudCIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImJlc3QtZXhwZW5zaXZlIiwiRHVyYXRpb24iOjExMTc0ODcxOTI5LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCByZWZhY3RvcnMgZm9saW8gc3BsaXR0aW5nIGxvZ2ljIGluIHRoZSBtZW1vcnkgbWFuYWdlbWVudCBzdWJzeXN0ZW0gKGBtbS9odWdlX21lbW9yeS5jYCksIHNwZWNpZmljYWxseSBzZXBhcmF0aW5nIHRoZSBoYW5kbGluZyBvZiBhbm9ueW1vdXMsIHN3YXBjYWNoZSwgYW5kIGZpbGUtYmFja2VkIGZvbGlvcy4gSXQgbW9kaWZpZXMgcmVmZXJlbmNlIGNvdW50aW5nLCBsb2NraW5nLCBhbmQgcGFnZSBjYWNoZS9zd2FwIGNhY2hlIHJlcGxhY2VtZW50IGxvZ2ljLiBUaGVzZSBjaGFuZ2VzIHByaW1hcmlseSByaXNrIGludHJvZHVjaW5nIHVzZS1hZnRlci1mcmVlLCBkb3VibGUtZnJlZSwgbG9ja2luZyBkZWFkbG9ja3MsIG9yIHJlZmVyZW5jZSBjb3VudCBpbWJhbGFuY2VzLiBTdWNoIGlzc3VlcyBhcmUgZWZmZWN0aXZlbHkgZGV0ZWN0ZWQgYnkgS0FTQU4sIExPQ0tERVAsIGFuZCBzdGFuZGFyZCBrZXJuZWwgZGVidWdnaW5nIGFzc2VydGlvbnMgKGUuZy4sIGBWTV9XQVJOX09OYCkuIFRoZSBwYXRjaCBkb2VzIG5vdCBpbnRyb2R1Y2UgbmV3IGFsbG9jYXRpb25zIG9mIGNvbXBsZXggZGF0YSBzdHJ1Y3R1cmVzLCBub3IgZG9lcyBpdCBtb2RpZnkgZGF0YSBzZW50IHRvIHVzZXIgc3BhY2Ugb3IgYWx0ZXIgYm91bmRzIGNoZWNraW5nIGluIGEgd2F5IHRoYXQgY291bGQgZXhwb3NlIHVuaW5pdGlhbGl6ZWQgbWVtb3J5LiBUaGVyZWZvcmUsIHRoZXJlIGlzIG5vIGp1c3RpZmljYXRpb24gZm9yIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbi5cIixcbiAgXCJOZWVkc0tNU0FOXCI6IGZhbHNlXG59IiwiSW5zdHJ1Y3Rpb24iOiJZb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgc2VjdXJpdHkgZW5naW5lZXIgc3BlY2lhbGl6aW5nIGluIGtlcm5lbCBtZW1vcnlcbmVycm9yIGRldGVjdG9ycyAoS0FTQU4gYW5kIEtNU0FOKS4gWW91ciBqb2IgaXMgdG8gcmV2aWV3IHRoZSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kXG5kZXRlcm1pbmUgaWYgdGhlIGNvZGUgY2hhbmdlcyBqdXN0aWZ5IHNwYXduaW5nIGEgZGVkaWNhdGVkIEtNU0FOIChLZXJuZWxNZW1vcnlTYW5pdGl6ZXIpXG5mdXp6aW5nIHNlc3Npb24gaW4gYWRkaXRpb24gdG8gc3RhbmRhcmQgS0FTQU4gZnV6emluZy5cblxuQ1JJVElDQUwgRElTVElOQ1RJT04gQkVUV0VFTiBLQVNBTiBBTkQgS01TQU46XG4tIFN0YW5kYXJkIEtBU0FOIGtlcm5lbCBidWlsZHMgKHVwc3RyZWFtLWFwcGFybW9yLWthc2FuLmNvbmZpZykgYWxyZWFkeSBlbmFibGVcbiAgYSBjb21wcmVoZW5zaXZlIHN1aXRlIG9mIGRlYnVnZ2luZyB0b29scyBhbmQgc2FuaXRpemVycywgaW5jbHVkaW5nIEtBU0FOXG4gIChvdXQtb2YtYm91bmRzIGFjY2Vzc2VzLCB1c2UtYWZ0ZXItZnJlZSwgZG91YmxlIGZyZWUsIGludmFsaWQgZnJlZSksIExPQ0tERVBcbiAgKGxvY2tpbmcgYnVncyBhbmQgZGVhZGxvY2tzKSwgVUItc2FuaXRpemVycywgYW5kIG1lbW9yeSBjb3JydXB0aW9uIGNoZWNrcy5cbi0gS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcikgZGV0ZWN0cyByZWFkcyBvZiBVTklOSVRJQUxJWkVEIG1lbW9yeSAoc3RhY2ssIGhlYXAsXG4gIG9yIHBhZ2UgYWxsb2NhdGlvbnMpIGFuZCBrZXJuZWwtdG8tdXNlciBtZW1vcnkgaW5mby1sZWFrcy5cblxuUnVsZTogVEhFUkUgSVMgTk8gU0VOU0UgSU4gUlVOTklORyBBIEtNU0FOIFNFU1NJT04gSUYgQSBCVUcgQ0FOIEJFIENBVUdIVCBCWSBLQVNBTixcbkxPQ0tERVAsIE9SIE9USEVSIFNUQU5EQVJEIEJVRyBERVRFQ1RPUlMuXG5BIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaW5jdXJzIHNpZ25pZmljYW50IHJlc291cmNlIGNvc3RzLiBZb3UgbXVzdCBPTkxZXG5zZXQgTmVlZHNLTVNBTj10cnVlIGlmIHRoZSBjb2RlIGNoYW5nZXMgaW50cm9kdWNlIG9yIGV4cG9zZSBVTklOSVRJQUxJWkVEIE1FTU9SWSByaXNrc1xudGhhdCBhcmUgZGV0ZWN0ZWQgT05MWSBieSBLTVNBTi5cblxuTG9vayBob2xpc3RpY2FsbHkgYXQgdGhlIHBhdGNoIHNlcmllcyBhbmQgc3Vycm91bmRpbmcgY29kZS4gRXZlbiBpZiBubyBkaXJlY3RcbnVuaW5pdGlhbGl6ZWQgZmllbGQgYWNjZXNzZXMgb3IgbmV3IGJ1ZmZlciBhbGxvY2F0aW9ucyBhcmUgYWRkZWQgaW4gdGhlIGRpZmYgaXRzZWxmLFxuYSBwYXRjaCBtYXkgYWx0ZXIgY29udHJvbCBmbG93LCBib3VuZHMgY2hlY2tpbmcsIG9yIGRhdGEgbGVuZ3RoIGNhbGN1bGF0aW9ucyBpbiB3YXlzXG50aGF0IGNoYW5nZSBob3cgdGhlIHJlc3Qgb2YgdGhlIGNvZGUgb3BlcmF0ZXMgb24gZXhpc3RpbmcgYnVmZmVycyAoZS5nLiBhbGxvd2luZ1xudW5pbml0aWFsaXplZCBzdGFjay9oZWFwIG1lbW9yeSB0byBiZSByZWFkLCBjb3BpZWQgdG8gdXNlciBzcGFjZSwgb3IgdXNlZCBpbiBjb250cm9sXG5mbG93KS4gRG8gbm90IGhlc2l0YXRlIHRvIHVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUsXG5jYWxsZWQgZnVuY3Rpb25zLCBhbmQgY2FsbGVycy5cblxuU2V0IE5lZWRzS01TQU49dHJ1ZSBPTkxZIElGIHRoZSBwYXRjaCBpbnRyb2R1Y2VzIG9yIG1vZGlmaWVzOlxuMS4gS2VybmVsIHN0cnVjdHVyZXMgc2VudCB0byB1c2VyIHNwYWNlICh2aWEgY29weV90b191c2VyLCBwdXRfdXNlciwgbmV0bGluayBza2JcbiAgIGF0dHJpYnV0ZXMsIGlvY3RsIG91dHB1dCBhcmd1bWVudHMsIHNvY2tldCBvcHRpb25zLCBvciBCUEYgYnVmZmVycykgd2hlcmUgZmllbGRzXG4gICBvciBzdHJ1Y3R1cmUgcGFkZGluZyBtaWdodCBub3QgYmUgZnVsbHkgaW5pdGlhbGl6ZWQvemVyb2VkLlxuMi4gQ29uZGl0aW9uYWwgbG9naWMgb3IgYnJhbmNoaW5nIHRoYXQgZGVwZW5kcyBvbiBwb3RlbnRpYWxseSB1bmluaXRpYWxpemVkIHZhcmlhYmxlc1xuICAgb3Igc3RydWN0IGZpZWxkcy5cbjMuIEFsbG9jYXRpb24gb3IgaW5pdGlhbGl6YXRpb24gb2YgY29tcGxleCBkYXRhIHN0cnVjdHVyZXMgd2hlcmUgdW5pbml0aWFsaXplZCBmaWVsZHNcbiAgIGNvdWxkIGJlIHJlYWQgbGF0ZXIgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMuXG40LiBCb3VuZHMgY2hlY2tzLCBsZW5ndGhzLCBvciBsb2dpYyBpbiBhIHdheSB0aGF0IGFsbG93cyBzdXJyb3VuZGluZyBjb2RlIHRvIGFjY2Vzc1xuICAgdW5pbml0aWFsaXplZCBieXRlcyBvZiBleGlzdGluZyBidWZmZXJzLlxuXG5TZXQgTmVlZHNLTVNBTj1mYWxzZSBJRjpcbi0gVGhlIGNvZGUgY2hhbmdlcyBwcmltYXJpbHkgcmlzayBvdXQtb2YtYm91bmRzIGFjY2VzcywgYXJyYXkgb3ZlcmZsb3dzLCBOVUxMIHBvaW50ZXJcbiAgZGVyZWZlcmVuY2VzLCBsb2NraW5nIGRlYWRsb2Nrcywgb3IgdXNlLWFmdGVyLWZyZWUgYnVncyAodGhlc2UgYXJlIGFscmVhZHkgY2F1Z2h0XG4gIGJ5IEtBU0FOLCBMT0NLREVQLCBvciBzdGFuZGFyZCBidWcgZGV0ZWN0b3JzKS5cbi0gQWxsIHN0YWNrL2hlYXAgc3RydWN0dXJlcyB0b3VjaGVkIG9yIGludHJvZHVjZWQgYnkgdGhlIHBhdGNoIGFyZSBmdWxseSB6ZXJvZWRcbiAgb3IgaW5pdGlhbGl6ZWQgKGUuZy4gdXNpbmcgPSB7MH0sIG1lbXNldCwga3phbGxvYykgYmVmb3JlIGJlaW5nIHJlYWQgb3IgY29waWVkLlxuLSBUaGUgcGF0Y2ggZG9lcyBub3QgaW50cm9kdWNlIGFueSByaXNrIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHVzYWdlIG9yIGluZm8tbGVha3MuXG5cblVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUgaWYgbmVjZXNzYXJ5LCB0aGVuIHByb3ZpZGVcbmRldGFpbGVkIEtNU0FOUmVhc29uaW5nIGNvbnRyYXN0aW5nIEtBU0FOIHZzIEtNU0FOIGFwcGxpY2FiaWxpdHkgZm9yIHRoaXMgcGF0Y2guXG5QcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy5cblxuXG5Vc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLlxuSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuXG5JZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuXG4iLCJQcm9tcHQiOiJGb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczpcbmNvbW1pdCBlNWUyNDc4YTU2Yjk1MmE4YWM1ZjYyZDJlNjVhZjU4OGVjMzQyODY4XG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIEZyaSBBdWcgNyAyMTo1NDowNCAyMDI2ICswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL21tL2h1Z2VfbWVtb3J5LmMgYi9tbS9odWdlX21lbW9yeS5jXG5pbmRleCBjZWQ0MDBmNzJkNDNhLi4wZDcwZWUzMDE3YzQ2IDEwMDY0NFxuLS0tIGEvbW0vaHVnZV9tZW1vcnkuY1xuKysrIGIvbW0vaHVnZV9tZW1vcnkuY1xuQEAgLTM1ODksOSArMzU4OSw2IEBAIHN0YXRpYyB2b2lkIHJlbWFwX3BhZ2Uoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgbG9uZyBuciwgaW50IGZsYWdzKVxuIHtcbiBcdGludCBpID0gMDtcbiBcbi1cdC8qIElmIHVubWFwX2ZvbGlvKCkgdXNlcyB0cnlfdG9fbWlncmF0ZSgpIG9uIGZpbGUsIHJlbW92ZSB0aGlzIGNoZWNrICovXG4tXHRpZiAoIWZvbGlvX3Rlc3RfYW5vbihmb2xpbykpXG4tXHRcdHJldHVybjtcbiBcdGZvciAoOzspIHtcbiBcdFx0cmVtb3ZlX21pZ3JhdGlvbl9wdGVzKGZvbGlvLCBmb2xpbywgVFRVX1JNQVBfTE9DS0VEIHwgZmxhZ3MpO1xuIFx0XHRpICs9IGZvbGlvX25yX3BhZ2VzKGZvbGlvKTtcbkBAIC0zODAwLDYgKzM3OTcsNyBAQCBzdGF0aWMgaW50IF9fc3BsaXRfdW5tYXBwZWRfZm9saW8oc3RydWN0IGZvbGlvICpmb2xpbywgaW50IG5ld19vcmRlcixcbiBcdFx0c3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsIGVudW0gc3BsaXRfdHlwZSBzcGxpdF90eXBlKVxuIHtcbiBcdGNvbnN0IGJvb2wgaXNfYW5vbiA9IGZvbGlvX3Rlc3RfYW5vbihmb2xpbyk7XG4rXHRjb25zdCBib29sIGlzX3N3YXBjYWNoZSA9IGZvbGlvX3Rlc3Rfc3dhcGNhY2hlKGZvbGlvKTtcbiBcdGludCBvbGRfb3JkZXIgPSBmb2xpb19vcmRlcihmb2xpbyk7XG4gXHRpbnQgc3RhcnRfb3JkZXIgPSBzcGxpdF90eXBlID09IFNQTElUX1RZUEVfVU5JRk9STSA/IG5ld19vcmRlciA6IG9sZF9vcmRlciAtIDE7XG4gXHRzdHJ1Y3QgZm9saW8gKm9sZF9mb2xpbyA9IGZvbGlvO1xuQEAgLTM4MTQsOCArMzgxMiw4IEBAIHN0YXRpYyBpbnQgX19zcGxpdF91bm1hcHBlZF9mb2xpbyhzdHJ1Y3QgZm9saW8gKmZvbGlvLCBpbnQgbmV3X29yZGVyLFxuIFx0ICAgICBzcGxpdF9vcmRlci0tKSB7XG4gXHRcdGludCBucl9uZXdfZm9saW9zID0gMVVMIFx1MDAzY1x1MDAzYyAob2xkX29yZGVyIC0gc3BsaXRfb3JkZXIpO1xuIFxuLVx0XHQvKiBvcmRlci0xIGFub255bW91cyBmb2xpbyBpcyBub3Qgc3VwcG9ydGVkICovXG4tXHRcdGlmIChpc19hbm9uIFx1MDAyNlx1MDAyNiBzcGxpdF9vcmRlciA9PSAxKVxuK1x0XHQvKiBvcmRlci0xIGFub255bW91cyBvciBzd2FwY2FjaGUgZm9saW8gaXMgbm90IHN1cHBvcnRlZCAqL1xuK1x0XHRpZiAoKGlzX2Fub24gfHwgaXNfc3dhcGNhY2hlKSBcdTAwMjZcdTAwMjYgc3BsaXRfb3JkZXIgPT0gMSlcbiBcdFx0XHRjb250aW51ZTtcbiBcbiBcdFx0aWYgKG1hcHBpbmcpIHtcbkBAIC0zODc4LDMyICszODc2LDI2IEBAIHN0YXRpYyBpbnQgX19zcGxpdF91bm1hcHBlZF9mb2xpbyhzdHJ1Y3QgZm9saW8gKmZvbGlvLCBpbnQgbmV3X29yZGVyLFxuIGludCBmb2xpb19jaGVja19zcGxpdHRhYmxlKHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIsXG4gXHRcdFx0ICAgZW51bSBzcGxpdF90eXBlIHNwbGl0X3R5cGUpXG4ge1xuK1x0Ym9vbCBpc19hbm9uID0gZm9saW9fdGVzdF9hbm9uKGZvbGlvKTtcbitcdGJvb2wgaXNfc3dhcGNhY2hlID0gZm9saW9fdGVzdF9zd2FwY2FjaGUoZm9saW8pO1xuK1xuIFx0Vk1fV0FSTl9PTl9GT0xJTyghZm9saW9fdGVzdF9sb2NrZWQoZm9saW8pLCBmb2xpbyk7XG4gXHQvKlxuIFx0ICogRm9saW9zIHRoYXQganVzdCBnb3QgdHJ1bmNhdGVkIGNhbm5vdCBnZXQgc3BsaXQuIFNpZ25hbCB0byB0aGVcbi1cdCAqIGNhbGxlciB0aGF0IHRoZXJlIHdhcyBhIHJhY2UuXG4tXHQgKlxuLVx0ICogVE9ETzogdGhpcyB3aWxsIGFsc28gY3VycmVudGx5IHJlZnVzZSBmb2xpb3Mgd2l0aG91dCBhIG1hcHBpbmcgaW4gdGhlXG4tXHQgKiBzd2FwY2FjaGUgKHNobWVtIG9yIHRvLWJlLWFub24gZm9saW9zKS5cbitcdCAqIGNhbGxlciB0aGF0IHRoZXJlIHdhcyBhIHJhY2UuIEEgbWFwcGluZ2xlc3Mgc3dhcCBjYWNoZSBmb2xpb1xuK1x0ICogaGFzIG5vIHBhZ2UgY2FjaGUgZW50cmllcyB0byB1cGRhdGUsIHNvIGl0IGlzIGZpbmUgdG8gc3BsaXQuXG4gXHQgKi9cbi1cdGlmICghZm9saW8tXHUwMDNlbWFwcGluZyBcdTAwMjZcdTAwMjYgIWZvbGlvX3Rlc3RfYW5vbihmb2xpbykpXG4rXHRpZiAoIWZvbGlvLVx1MDAzZW1hcHBpbmcgXHUwMDI2XHUwMDI2ICFpc19zd2FwY2FjaGUpXG4gXHRcdHJldHVybiAtRUJVU1k7XG4gXG4tXHQvKiBvcmRlci0xIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIGFub255bW91cyBUSFAuICovXG4tXHRpZiAoZm9saW9fdGVzdF9hbm9uKGZvbGlvKSBcdTAwMjZcdTAwMjYgbmV3X29yZGVyID09IDEpXG4tXHRcdHJldHVybiAtRUlOVkFMO1xuLVxuIFx0Lypcbi1cdCAqIHN3YXBjYWNoZSBmb2xpbyBjb3VsZCBvbmx5IGJlIHNwbGl0IHRvIG9yZGVyIDBcbi1cdCAqXG4tXHQgKiBub24tdW5pZm9ybSBzcGxpdCBjcmVhdGVzIGFmdGVyLXNwbGl0IGZvbGlvcyB3aXRoIG9yZGVycyBmcm9tXG4tXHQgKiBmb2xpb19vcmRlcihmb2xpbykgLSAxIHRvIG5ld19vcmRlciwgbWFraW5nIGl0IG5vdCBzdWl0YWJsZSBmb3IgYW55XG4tXHQgKiBzd2FwY2FjaGUgZm9saW8gc3BsaXQuIE9ubHkgdW5pZm9ybSBzcGxpdCB0byBvcmRlci0wIGNhbiBiZSB1c2VkXG4tXHQgKiBoZXJlLlxuK1x0ICogT3JkZXItMSBpcyB1bnN1cHBvcnRlZDogYW5vbiBmb2xpb3MgbmVlZCBzdWJwYWdlIDIgZm9yIHRoZVxuK1x0ICogZGVmZXJyZWQgc3BsaXQgbGlzdCwgaHlicmlkIHNobWVtIFx1MDAyNiBzd2FwIGNhY2hlIGZvbGlvcyBhcmUgbm90XG4rXHQgKiBzcGxpdHRhYmxlLCBhbmQgYSBzcGxpdHRhYmxlIG1hcHBpbmdsZXNzIHN3YXAgY2FjaGUgZm9saW8gY291bGRcbitcdCAqIGJlIGVpdGhlciBhbm9uIG9yIHNobWVtLCB3aGljaCB3ZSBjYW5ub3QgdGVsbCBhcGFydC5cbiBcdCAqL1xuLVx0aWYgKChzcGxpdF90eXBlID09IFNQTElUX1RZUEVfTk9OX1VOSUZPUk0gfHwgbmV3X29yZGVyKSBcdTAwMjZcdTAwMjYgZm9saW9fdGVzdF9zd2FwY2FjaGUoZm9saW8pKSB7XG4rXHRpZiAoKGlzX2Fub24gfHwgaXNfc3dhcGNhY2hlKSBcdTAwMjZcdTAwMjYgbmV3X29yZGVyID09IDEpXG4gXHRcdHJldHVybiAtRUlOVkFMO1xuLVx0fVxuIFxuIFx0aWYgKGlzX2h1Z2VfemVyb19mb2xpbyhmb2xpbykpXG4gXHRcdHJldHVybiAtRUlOVkFMO1xuQEAgLTM5MTEsMzkgKzM5MDMsNzggQEAgaW50IGZvbGlvX2NoZWNrX3NwbGl0dGFibGUoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlcixcbiBcdGlmIChmb2xpb190ZXN0X3dyaXRlYmFjayhmb2xpbykpXG4gXHRcdHJldHVybiAtRUJVU1k7XG4gXG4rXHQvKlxuK1x0ICogQSBub24tYW5vbiBzd2FwY2FjaGUgZm9saW8gdGhhdCBzdGlsbCBoYXMgYSBtYXBwaW5nIHNob3VsZCBvbmx5XG4rXHQgKiBiZSBhIHNobWVtIGZvbGlvIHVuZGVyIElPLCB0aGVyZSBpcyBsaXR0bGUgYmVuZWZpdCBpbiBzcGxpdHRpbmdcbitcdCAqIHRoZW0gaGVuY2Ugbm90IHN1cHBvcnRlZC4gUmVqZWN0IGl0IGhlcmUgdXAgZnJvbnQ6IHRoZSBzcGxpdFxuK1x0ICogcm91dGluZSBjYW5ub3QgYmFjayBvdXQgY2xlYW5seSBvbmNlIHRoZSBmb2xpbyByZWYgaXMgZnJvemVuLlxuK1x0ICovXG4rXHRpZiAoIWlzX2Fub24gXHUwMDI2XHUwMDI2IGlzX3N3YXBjYWNoZSBcdTAwMjZcdTAwMjYgZm9saW8tXHUwMDNlbWFwcGluZylcbitcdFx0cmV0dXJuIC1FSU5WQUw7XG4rXG4gXHRyZXR1cm4gMDtcbiB9XG4gXG4tLyogTnVtYmVyIG9mIGZvbGlvIHJlZmVyZW5jZXMgZnJvbSB0aGUgcGFnZWNhY2hlIG9yIHRoZSBzd2FwY2FjaGUuICovXG4tc3RhdGljIHVuc2lnbmVkIGludCBmb2xpb19jYWNoZV9yZWZfY291bnQoY29uc3Qgc3RydWN0IGZvbGlvICpmb2xpbylcbisvKiBOdW1iZXIgb2YgZm9saW8gcmVmZXJlbmNlcyBmcm9tIHRoZSBzd2FwY2FjaGUuICovXG4rc3RhdGljIHVuc2lnbmVkIGludCBmb2xpb19zd2FwY2FjaGVfcmVmX2NvdW50KGNvbnN0IHN0cnVjdCBmb2xpbyAqZm9saW8pXG4ge1xuLVx0aWYgKGZvbGlvX3Rlc3RfYW5vbihmb2xpbykgXHUwMDI2XHUwMDI2ICFmb2xpb190ZXN0X3N3YXBjYWNoZShmb2xpbykpXG4rXHRpZiAoIWZvbGlvX3Rlc3Rfc3dhcGNhY2hlKGZvbGlvKSlcbiBcdFx0cmV0dXJuIDA7XG4gXHRyZXR1cm4gZm9saW9fbnJfcGFnZXMoZm9saW8pO1xuIH1cbiBcbi1zdGF0aWMgaW50IF9fZm9saW9fZnJlZXplX2FuZF9zcGxpdF91bm1hcHBlZChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyLFxuLVx0XHRcdFx0XHQgICAgIHN0cnVjdCBwYWdlICpzcGxpdF9hdCwgc3RydWN0IHhhX3N0YXRlICp4YXMsXG4tXHRcdFx0XHRcdCAgICAgc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsIGJvb2wgZG9fbHJ1LFxuLVx0XHRcdFx0XHQgICAgIHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QsIGVudW0gc3BsaXRfdHlwZSBzcGxpdF90eXBlLFxuLVx0XHRcdFx0XHQgICAgIHBnb2ZmX3QgZW5kLCBpbnQgKm5yX3NobWVtX2Ryb3BwZWQpXG4rc3RhdGljIGludCBfX2ZvbGlvX2ZyZWV6ZV9zcGxpdF91bm1hcChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyLFxuK1x0XHRcdFx0ICAgICAgc3RydWN0IHBhZ2UgKnNwbGl0X2F0LCBib29sIGRvX2xydSwgYm9vbCBhbm9uX3VubWFwLFxuK1x0XHRcdFx0ICAgICAgc3RydWN0IGxpc3RfaGVhZCAqbGlzdCwgZW51bSBzcGxpdF90eXBlIHNwbGl0X3R5cGUpXG4ge1xuIFx0c3RydWN0IGZvbGlvICplbmRfZm9saW8gPSBmb2xpb19uZXh0KGZvbGlvKTtcbi1cdHN0cnVjdCBmb2xpbyAqbmV3X2ZvbGlvLCAqbmV4dDtcbitcdGJvb2wgaXNfYW5vbiA9IGZvbGlvX3Rlc3RfYW5vbihmb2xpbyk7XG4rXHRzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpID0gTlVMTDtcbitcdHN0cnVjdCBmb2xpbyAqbmV3X2ZvbGlvO1xuIFx0aW50IG9sZF9vcmRlciA9IGZvbGlvX29yZGVyKGZvbGlvKTtcbitcdHN0cnVjdCBhbm9uX3ZtYSAqYW5vbl92bWEgPSBOVUxMO1xuK1x0ZW51bSB0dHVfZmxhZ3MgdHR1X2ZsYWdzID0gMDtcbiBcdHN0cnVjdCBsaXN0X2xydV9vbmUgKmxydTtcbitcdHN0cnVjdCBscnV2ZWMgKmxydXZlYztcbiBcdGJvb2wgZGVxdWV1ZV9kZWZlcnJlZDtcbiBcdGludCByZXQgPSAwO1xuIFxuLVx0Vk1fV0FSTl9PTl9PTkNFKCFtYXBwaW5nIFx1MDAyNlx1MDAyNiBlbmQpO1xuK1x0LypcbitcdCAqIFVubWFwL3JlbWFwIG5lZWRzIHRoZSBhbm9uX3ZtYS4gVGhlIGNhbGxlciBkb2VzIG5vdCBuZWNlc3NhcmlseVxuK1x0ICogaG9sZCBhbiBtbWFwX2xvY2sgdGhhdCB3b3VsZCBwcmV2ZW50IHRoZSBhbm9uX3ZtYSBmcm9tXG4rXHQgKiBkaXNhcHBlYXJpbmcsIHNvIHdlIGZpcnN0IHRha2UgYSByZWZlcmVuY2UgYW5kIGxvY2sgaXQuIFRoaXMgaXNcbitcdCAqIHNpbWlsYXIgdG8gZm9saW9fbG9ja19hbm9uX3ZtYV9yZWFkKCkgZXhjZXB0IHRoZSB3cml0ZSBsb2NrIGlzXG4rXHQgKiB0YWtlbiB0byBzZXJpYWxpemUgYWdhaW5zdCBwYXJhbGxlbCBzcGxpdCBvciBjb2xsYXBzZS5cbitcdCAqL1xuK1x0aWYgKGFub25fdW5tYXApIHtcbitcdFx0YW5vbl92bWEgPSBmb2xpb19nZXRfYW5vbl92bWEoZm9saW8pO1xuK1x0XHRpZiAoIWFub25fdm1hKVxuK1x0XHRcdHJldHVybiAtRUJVU1k7XG4rXHRcdGFub25fdm1hX2xvY2tfd3JpdGUoYW5vbl92bWEpO1xuK1x0fVxuK1xuK1x0LyogUmFjeSBjaGVjayBpZiB3ZSBjYW4gc3BsaXQgdGhlIHBhZ2UsIGJlZm9yZSB0aGUgb3B0aW9uYWwgdW5tYXAuICovXG4rXHRpZiAoZm9saW9fZXhwZWN0ZWRfcmVmX2NvdW50KGZvbGlvKSAhPSBmb2xpb19yZWZfY291bnQoZm9saW8pIC0gMSkge1xuK1x0XHRyZXQgPSAtRUFHQUlOO1xuK1x0XHRnb3RvIG91dF91bmxvY2s7XG4rXHR9XG4rXG4rXHRpZiAoYW5vbl91bm1hcClcbitcdFx0dW5tYXBfZm9saW8oZm9saW8pO1xuK1xuK1x0bG9jYWxfaXJxX2Rpc2FibGUoKTtcbitcbiBcdC8qXG4gXHQgKiBJZiB0aGlzIGZvbGlvIGNhbiBiZSBvbiB0aGUgZGVmZXJyZWQgc3BsaXQgcXVldWUsIGxvY2sgb3V0XG4gXHQgKiB0aGUgc2hyaW5rZXIgYmVmb3JlIGZyZWV6aW5nIHRoZSByZWYuIElmIHRoZSBzaHJpbmtlciBzZWVzXG4gXHQgKiBhIDAtcmVmIGZvbGlvLCBpdCBhc3N1bWVzIGl0IGJlYXQgZm9saW9fcHV0KCkgdG8gdGhlIGxpc3RcbiBcdCAqIGxvY2sgYW5kIG11c3QgY2xlYW4gdXAgdGhlIExSVSBzdGF0ZSAtIHRoZSBzYW1lIGRlcXVldWUgd2VcbiBcdCAqIHdpbGwgZG8gYmVsb3cgYXMgcGFydCBvZiB0aGUgc3BsaXQuXG4rXHQgKlxuK1x0ICogT25seSBhbm9uIGZvbGlvcyBhcmUgZXZlciBxdWV1ZWQgb24gdGhlIGRlZmVycmVkIHNwbGl0IGxpc3QsXG4rXHQgKiBzbyBub24tYW5vbiBmb2xpb3MgKG1hcHBpbmdsZXNzIHN3YXBjYWNoZSkgbmV2ZXIgbmVlZCBkZXF1ZXVpbmcuXG4gXHQgKi9cbi1cdGRlcXVldWVfZGVmZXJyZWQgPSBmb2xpb190ZXN0X2Fub24oZm9saW8pIFx1MDAyNlx1MDAyNiBvbGRfb3JkZXIgXHUwMDNlIDE7XG4rXHRkZXF1ZXVlX2RlZmVycmVkID0gb2xkX29yZGVyIFx1MDAzZSAxIFx1MDAyNlx1MDAyNiBpc19hbm9uO1xuIFx0aWYgKGRlcXVldWVfZGVmZXJyZWQpIHtcbiBcdFx0c3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnO1xuIFxuQEAgLTM5NTIsMTI4ICszOTgzLDI0MyBAQCBzdGF0aWMgaW50IF9fZm9saW9fZnJlZXplX2FuZF9zcGxpdF91bm1hcHBlZChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgblxuIFx0XHRscnUgPSBsaXN0X2xydV9sb2NrKFx1MDAyNmRlZmVycmVkX3NwbGl0X2xydSxcbiBcdFx0XHRcdCAgICBmb2xpb19uaWQoZm9saW8pLCBcdTAwMjZtZW1jZyk7XG4gXHR9XG4tXHRpZiAoZm9saW9fcmVmX2ZyZWV6ZShmb2xpbywgZm9saW9fY2FjaGVfcmVmX2NvdW50KGZvbGlvKSArIDEpKSB7XG4tXHRcdHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2kgPSBOVUxMO1xuLVx0XHRzdHJ1Y3QgbHJ1dmVjICpscnV2ZWM7XG4gXG4rXHRpZiAoIWZvbGlvX3JlZl9mcmVlemUoZm9saW8sIGZvbGlvX3N3YXBjYWNoZV9yZWZfY291bnQoZm9saW8pICsgMSkpIHtcbiBcdFx0aWYgKGRlcXVldWVfZGVmZXJyZWQpIHtcbi1cdFx0XHRfX2xpc3RfbHJ1X2RlbChcdTAwMjZkZWZlcnJlZF9zcGxpdF9scnUsIGxydSxcbi1cdFx0XHRcdCAgICAgICBcdTAwMjZmb2xpby1cdTAwM2VfZGVmZXJyZWRfbGlzdCwgZm9saW9fbmlkKGZvbGlvKSk7XG4tXHRcdFx0aWYgKGZvbGlvX3Rlc3RfcGFydGlhbGx5X21hcHBlZChmb2xpbykpIHtcbi1cdFx0XHRcdGZvbGlvX2NsZWFyX3BhcnRpYWxseV9tYXBwZWQoZm9saW8pO1xuLVx0XHRcdFx0bW9kX210aHBfc3RhdChvbGRfb3JkZXIsXG4tXHRcdFx0XHRcdE1USFBfU1RBVF9OUl9BTk9OX1BBUlRJQUxMWV9NQVBQRUQsIC0xKTtcbi1cdFx0XHR9XG4gXHRcdFx0bGlzdF9scnVfdW5sb2NrKGxydSk7XG4gXHRcdFx0cmN1X3JlYWRfdW5sb2NrKCk7XG4gXHRcdH1cbitcdFx0cmV0ID0gLUVBR0FJTjtcbitcdFx0Z290byBvdXRfbm9fc3BsaXQ7XG4rXHR9XG4gXG4tXHRcdGlmIChtYXBwaW5nKSB7XG4tXHRcdFx0aW50IG5yID0gZm9saW9fbnJfcGFnZXMoZm9saW8pO1xuLVxuLVx0XHRcdGlmIChmb2xpb190ZXN0X3BtZF9tYXBwYWJsZShmb2xpbykgXHUwMDI2XHUwMDI2XG4tXHRcdFx0ICAgIG5ld19vcmRlciBcdTAwM2MgSFBBR0VfUE1EX09SREVSKSB7XG4tXHRcdFx0XHRpZiAoZm9saW9fdGVzdF9zd2FwYmFja2VkKGZvbGlvKSkge1xuLVx0XHRcdFx0XHRscnV2ZWNfc3RhdF9tb2RfZm9saW8oZm9saW8sXG4tXHRcdFx0XHRcdFx0XHROUl9TSE1FTV9USFBTLCAtbnIpO1xuLVx0XHRcdFx0fSBlbHNlIHtcbi1cdFx0XHRcdFx0bHJ1dmVjX3N0YXRfbW9kX2ZvbGlvKGZvbGlvLFxuLVx0XHRcdFx0XHRcdFx0TlJfRklMRV9USFBTLCAtbnIpO1xuLVx0XHRcdFx0fVxuLVx0XHRcdH1cbitcdGlmIChkZXF1ZXVlX2RlZmVycmVkKSB7XG4rXHRcdF9fbGlzdF9scnVfZGVsKFx1MDAyNmRlZmVycmVkX3NwbGl0X2xydSwgbHJ1LFxuK1x0XHRcdCAgICAgICBcdTAwMjZmb2xpby1cdTAwM2VfZGVmZXJyZWRfbGlzdCwgZm9saW9fbmlkKGZvbGlvKSk7XG4rXHRcdGlmIChmb2xpb190ZXN0X3BhcnRpYWxseV9tYXBwZWQoZm9saW8pKSB7XG4rXHRcdFx0Zm9saW9fY2xlYXJfcGFydGlhbGx5X21hcHBlZChmb2xpbyk7XG4rXHRcdFx0bW9kX210aHBfc3RhdChvbGRfb3JkZXIsXG4rXHRcdFx0XHQgICAgICBNVEhQX1NUQVRfTlJfQU5PTl9QQVJUSUFMTFlfTUFQUEVELCAtMSk7XG4gXHRcdH1cbitcdFx0bGlzdF9scnVfdW5sb2NrKGxydSk7XG4rXHRcdHJjdV9yZWFkX3VubG9jaygpO1xuK1x0fVxuIFxuLVx0XHRpZiAoZm9saW9fdGVzdF9zd2FwY2FjaGUoZm9saW8pKSB7XG4tXHRcdFx0aWYgKG1hcHBpbmcpIHtcbi1cdFx0XHRcdFZNX1dBUk5fT05fT05DRV9GT0xJTyhtYXBwaW5nLCBmb2xpbyk7XG4tXHRcdFx0XHRyZXR1cm4gLUVJTlZBTDtcbi1cdFx0XHR9XG4rXHRpZiAoZm9saW9fdGVzdF9zd2FwY2FjaGUoZm9saW8pKVxuK1x0XHRjaSA9IHN3YXBfY2x1c3Rlcl9nZXRfYW5kX2xvY2soZm9saW8pO1xuIFxuLVx0XHRcdGNpID0gc3dhcF9jbHVzdGVyX2dldF9hbmRfbG9jayhmb2xpbyk7XG4tXHRcdH1cbitcdGlmIChkb19scnUpXG4rXHRcdGxydXZlYyA9IGZvbGlvX2xydXZlY19sb2NrKGZvbGlvKTtcbitcbitcdHJldCA9IF9fc3BsaXRfdW5tYXBwZWRfZm9saW8oZm9saW8sIG5ld19vcmRlciwgc3BsaXRfYXQsIE5VTEwsXG4rXHRcdFx0XHQgICAgIE5VTEwsIHNwbGl0X3R5cGUpO1xuIFxuLVx0XHQvKiBsb2NrIGxydSBsaXN0L1BhZ2VDb21wb3VuZCwgcmVmIGZyb3plbiBieSBwYWdlX3JlZl9mcmVlemUgKi9cbitcdC8qXG4rXHQgKiBVbmZyZWV6ZSB0aGUgYWZ0ZXItc3BsaXQgZm9saW9zIGFuZCBwdXQgdGhlbSBiYWNrIHRvIHRoZSByaWdodFxuK1x0ICogcGxhY2UsIGtlZXBpbmcgdGhlIGhlYWQgQGZvbGlvIGZyb3plbiB1bnRpbCB0aGUgZW5kLiBXaGlsZSB0aGVcbitcdCAqIGZvbGlvIGlzIGluIHRoZSBzd2FwIGNhY2hlLCB0aGUgc3ViIGVudHJpZXMgbXVzdCBiZSB1cGRhdGVkIHdpdGhcbitcdCAqIHRoZWlyIGFmdGVyLXNwbGl0IGZvbGlvcyBiZWZvcmUgdGhlIGhlYWQgaXMgdW5mcm96ZW4sIHNvIGFcbitcdCAqIGNvbmN1cnJlbnQgc3dhcF9jYWNoZV9nZXRfZm9saW8oKSBjYW5ub3QgcmV0dXJuIHRoZSBoZWFkIGZvbGlvXG4rXHQgKiBmb3IgYSBzdWIgZW50cnkuIEtlZXBpbmcgdGhlIGhlYWQgZnJvemVuIHRocm91Z2hvdXQgYWxzbyBzdG9wcyBhXG4rXHQgKiBwYXJhbGxlbCBmb2xpb190cnlfZ2V0KCkgZnJvbSBvYnNlcnZpbmcgYSBwYXJ0aWFsbHkgc3BsaXQgZm9saW8uXG4rXHQgKi9cbitcdGZvciAobmV3X2ZvbGlvID0gZm9saW9fbmV4dChmb2xpbyk7IG5ld19mb2xpbyAhPSBlbmRfZm9saW87XG4rXHQgICAgIG5ld19mb2xpbyA9IGZvbGlvX25leHQobmV3X2ZvbGlvKSkge1xuK1x0XHR6b25lX2RldmljZV9wcml2YXRlX3NwbGl0X2NiKGZvbGlvLCBuZXdfZm9saW8pO1xuK1x0XHRmb2xpb19yZWZfdW5mcmVlemUobmV3X2ZvbGlvLFxuK1x0XHRcdFx0ICAgZm9saW9fc3dhcGNhY2hlX3JlZl9jb3VudChuZXdfZm9saW8pICsgMSk7XG4gXHRcdGlmIChkb19scnUpXG4tXHRcdFx0bHJ1dmVjID0gZm9saW9fbHJ1dmVjX2xvY2soZm9saW8pO1xuK1x0XHRcdGxydV9hZGRfc3BsaXRfZm9saW8oZm9saW8sIG5ld19mb2xpbywgbHJ1dmVjLCBsaXN0KTtcbitcdFx0aWYgKGNpKVxuK1x0XHRcdF9fc3dhcF9jYWNoZV9yZXBsYWNlX2ZvbGlvKGNpLCBmb2xpbywgbmV3X2ZvbGlvKTtcbitcdH1cbiBcbi1cdFx0cmV0ID0gX19zcGxpdF91bm1hcHBlZF9mb2xpbyhmb2xpbywgbmV3X29yZGVyLCBzcGxpdF9hdCwgeGFzLFxuLVx0XHRcdFx0XHQgICAgIG1hcHBpbmcsIHNwbGl0X3R5cGUpO1xuK1x0em9uZV9kZXZpY2VfcHJpdmF0ZV9zcGxpdF9jYihmb2xpbywgTlVMTCk7XG4rXHRmb2xpb19yZWZfdW5mcmVlemUoZm9saW8sIGZvbGlvX3N3YXBjYWNoZV9yZWZfY291bnQoZm9saW8pICsgMSk7XG4gXG4tXHRcdC8qXG4tXHRcdCAqIFVuZnJlZXplIGFmdGVyLXNwbGl0IGZvbGlvcyBhbmQgcHV0IHRoZW0gYmFjayB0byB0aGUgcmlnaHRcbi1cdFx0ICogbGlzdC4gQGZvbGlvIHNob3VsZCBiZSBrZXB0IGZyb3pvbiB1bnRpbCBwYWdlIGNhY2hlXG4tXHRcdCAqIGVudHJpZXMgYXJlIHVwZGF0ZWQgd2l0aCBhbGwgdGhlIG90aGVyIGFmdGVyLXNwbGl0IGZvbGlvc1xuLVx0XHQgKiB0byBwcmV2ZW50IG90aGVycyBzZWVpbmcgc3RhbGUgcGFnZSBjYWNoZSBlbnRyaWVzLlxuLVx0XHQgKiBBcyBhIHJlc3VsdCwgbmV3X2ZvbGlvIHN0YXJ0cyBmcm9tIHRoZSBuZXh0IGZvbGlvIG9mXG4tXHRcdCAqIEBmb2xpby5cbi1cdFx0ICovXG4tXHRcdGZvciAobmV3X2ZvbGlvID0gZm9saW9fbmV4dChmb2xpbyk7IG5ld19mb2xpbyAhPSBlbmRfZm9saW87XG4tXHRcdCAgICAgbmV3X2ZvbGlvID0gbmV4dCkge1xuLVx0XHRcdHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMgPSBmb2xpb19ucl9wYWdlcyhuZXdfZm9saW8pO1xuK1x0aWYgKGRvX2xydSlcbitcdFx0bHJ1dmVjX3VubG9jayhscnV2ZWMpO1xuK1x0aWYgKGNpKVxuK1x0XHRzd2FwX2NsdXN0ZXJfdW5sb2NrKGNpKTtcbitvdXRfbm9fc3BsaXQ6XG4rXHRsb2NhbF9pcnFfZW5hYmxlKCk7XG4rXHRpZiAoYW5vbl91bm1hcCkge1xuK1x0XHRpZiAoIXJldCBcdTAwMjZcdTAwMjYgIWZvbGlvX2lzX2RldmljZV9wcml2YXRlKGZvbGlvKSlcbitcdFx0XHR0dHVfZmxhZ3MgPSBUVFVfVVNFX1NIQVJFRF9aRVJPUEFHRTtcbitcdFx0cmVtYXBfcGFnZShmb2xpbywgMSBcdTAwM2NcdTAwM2Mgb2xkX29yZGVyLCB0dHVfZmxhZ3MpO1xuK1x0fVxuK291dF91bmxvY2s6XG4rXHRpZiAoYW5vbl91bm1hcCkge1xuK1x0XHRhbm9uX3ZtYV91bmxvY2tfd3JpdGUoYW5vbl92bWEpO1xuK1x0XHRwdXRfYW5vbl92bWEoYW5vbl92bWEpO1xuK1x0fVxuIFxuLVx0XHRcdG5leHQgPSBmb2xpb19uZXh0KG5ld19mb2xpbyk7XG4rXHRyZXR1cm4gcmV0O1xuK31cbiBcbi1cdFx0XHR6b25lX2RldmljZV9wcml2YXRlX3NwbGl0X2NiKGZvbGlvLCBuZXdfZm9saW8pO1xuK3N0YXRpYyBpbnQgX19mb2xpb19mcmVlemVfc3BsaXRfdW5tYXBfZmlsZShzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyLFxuK1x0XHRcdFx0XHQgICBzdHJ1Y3QgcGFnZSAqc3BsaXRfYXQsIGJvb2wgZG9fbHJ1LFxuK1x0XHRcdFx0XHQgICBzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LCBlbnVtIHNwbGl0X3R5cGUgc3BsaXRfdHlwZSlcbit7XG4rXHRzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyA9IGZvbGlvLVx1MDAzZW1hcHBpbmc7XG4rXHRYQV9TVEFURSh4YXMsIFx1MDAyNm1hcHBpbmctXHUwMDNlaV9wYWdlcywgZm9saW8tXHUwMDNlaW5kZXgpO1xuK1x0c3RydWN0IGZvbGlvICplbmRfZm9saW8gPSBmb2xpb19uZXh0KGZvbGlvKTtcbitcdGxvbmcgb2xkX25yX3BhZ2VzID0gZm9saW9fbnJfcGFnZXMoZm9saW8pO1xuK1x0c3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLCAqb2xkX21lbWNnO1xuK1x0c3RydWN0IGZvbGlvICpuZXdfZm9saW8sICpuZXh0O1xuK1x0aW50IG5yX3NobWVtX2Ryb3BwZWQgPSAwO1xuK1x0dW5zaWduZWQgaW50IG1pbl9vcmRlcjtcbitcdHN0cnVjdCBscnV2ZWMgKmxydXZlYztcbitcdHBnb2ZmX3QgZW5kID0gMDtcbitcdGdmcF90IGdmcDtcbitcdGludCByZXQgPSAwO1xuIFxuLVx0XHRcdGZvbGlvX3JlZl91bmZyZWV6ZShuZXdfZm9saW8sXG4tXHRcdFx0XHRcdCAgIGZvbGlvX2NhY2hlX3JlZl9jb3VudChuZXdfZm9saW8pICsgMSk7XG4rXHRtaW5fb3JkZXIgPSBtYXBwaW5nX21pbl9mb2xpb19vcmRlcihtYXBwaW5nKTtcbitcdGlmIChuZXdfb3JkZXIgXHUwMDNjIG1pbl9vcmRlcilcbitcdFx0cmV0dXJuIC1FSU5WQUw7XG4gXG4tXHRcdFx0aWYgKGRvX2xydSlcbi1cdFx0XHRcdGxydV9hZGRfc3BsaXRfZm9saW8oZm9saW8sIG5ld19mb2xpbywgbHJ1dmVjLCBsaXN0KTtcbitcdC8qXG4rXHQgKiBTd2l0Y2ggdG8gZm9saW8ncyBtZW1jZyBhcyB4YXJyYXkgbm9kZSBhbGxvY2F0aW9uIGNhbiBoYXBwZW4gYW5kXG4rXHQgKiBuZWVkcyB0byBjaGFyZ2UgdG8gaXQuXG4rXHQgKi9cbitcdG1lbWNnID0gZ2V0X21lbV9jZ3JvdXBfZnJvbV9mb2xpbyhmb2xpbyk7XG4rXHRvbGRfbWVtY2cgPSBzZXRfYWN0aXZlX21lbWNnKG1lbWNnKTtcbiBcbi1cdFx0XHQvKlxuLVx0XHRcdCAqIEFub255bW91cyBmb2xpbyB3aXRoIHN3YXAgY2FjaGUuXG4tXHRcdFx0ICogTk9URTogc2htZW0gaW4gc3dhcCBjYWNoZSBpcyBub3Qgc3VwcG9ydGVkIHlldC5cbi1cdFx0XHQgKi9cbi1cdFx0XHRpZiAoY2kpIHtcbi1cdFx0XHRcdF9fc3dhcF9jYWNoZV9yZXBsYWNlX2ZvbGlvKGNpLCBmb2xpbywgbmV3X2ZvbGlvKTtcbi1cdFx0XHRcdGNvbnRpbnVlO1xuLVx0XHRcdH1cbitcdGdmcCA9IGN1cnJlbnRfZ2ZwX2NvbnRleHQobWFwcGluZ19nZnBfbWFzayhtYXBwaW5nKSBcdTAwMjYgR0ZQX1JFQ0xBSU1fTUFTSyk7XG4rXHRpZiAoIWZpbGVtYXBfcmVsZWFzZV9mb2xpbyhmb2xpbywgZ2ZwKSkge1xuK1x0XHRyZXQgPSAtRUJVU1k7XG4rXHRcdGdvdG8gZmFpbF9mcmVlO1xuK1x0fVxuIFxuLVx0XHRcdC8qIEFub255bW91cyBmb2xpbyB3aXRob3V0IHN3YXAgY2FjaGUgKi9cbi1cdFx0XHRpZiAoIW1hcHBpbmcpXG4tXHRcdFx0XHRjb250aW51ZTtcbitcdG1hcHBpbmdfc2V0X3VwZGF0ZShcdTAwMjZ4YXMsIG1hcHBpbmcpO1xuIFxuLVx0XHRcdC8qIEFkZCB0aGUgbmV3IGZvbGlvIHRvIHRoZSBwYWdlIGNhY2hlLiAqL1xuLVx0XHRcdGlmIChuZXdfZm9saW8tXHUwMDNlaW5kZXggXHUwMDNjIGVuZCkge1xuLVx0XHRcdFx0X194YV9zdG9yZShcdTAwMjZtYXBwaW5nLVx1MDAzZWlfcGFnZXMsIG5ld19mb2xpby1cdTAwM2VpbmRleCxcbi1cdFx0XHRcdFx0ICAgbmV3X2ZvbGlvLCAwKTtcbi1cdFx0XHRcdGNvbnRpbnVlO1xuLVx0XHRcdH1cbitcdGlmIChzcGxpdF90eXBlID09IFNQTElUX1RZUEVfVU5JRk9STSkge1xuK1x0XHRpbnQgb2xkX29yZGVyID0gZm9saW9fb3JkZXIoZm9saW8pO1xuIFxuLVx0XHRcdFZNX1dBUk5fT05fT05DRSghbnJfc2htZW1fZHJvcHBlZCk7XG4tXHRcdFx0LyogRHJvcCBmb2xpbyBiZXlvbmQgRU9GOiAtXHUwMDNlaW5kZXggXHUwMDNlPSBlbmQgKi9cbi1cdFx0XHRpZiAoc2htZW1fbWFwcGluZyhtYXBwaW5nKSBcdTAwMjZcdTAwMjYgbnJfc2htZW1fZHJvcHBlZClcbi1cdFx0XHRcdCpucl9zaG1lbV9kcm9wcGVkICs9IG5yX3BhZ2VzO1xuLVx0XHRcdGVsc2UgaWYgKGZvbGlvX3Rlc3RfY2xlYXJfZGlydHkobmV3X2ZvbGlvKSlcbi1cdFx0XHRcdGZvbGlvX2FjY291bnRfY2xlYW5lZChcbi1cdFx0XHRcdFx0bmV3X2ZvbGlvLCBpbm9kZV90b193YihtYXBwaW5nLVx1MDAzZWhvc3QpKTtcbi1cdFx0XHRfX2ZpbGVtYXBfcmVtb3ZlX2ZvbGlvKG5ld19mb2xpbywgTlVMTCk7XG4tXHRcdFx0Zm9saW9fcHV0X3JlZnMobmV3X2ZvbGlvLCBucl9wYWdlcyk7XG4rXHRcdHhhc19zZXRfb3JkZXIoXHUwMDI2eGFzLCBmb2xpby1cdTAwM2VpbmRleCwgbmV3X29yZGVyKTtcbitcdFx0eGFzX3NwbGl0X2FsbG9jKFx1MDAyNnhhcywgZm9saW8sIG9sZF9vcmRlciwgZ2ZwKTtcbitcdFx0aWYgKHhhc19lcnJvcihcdTAwMjZ4YXMpKSB7XG4rXHRcdFx0cmV0ID0geGFzX2Vycm9yKFx1MDAyNnhhcyk7XG4rXHRcdFx0Z290byBmYWlsX2ZyZWU7XG4gXHRcdH1cbitcdH1cbiBcbi1cdFx0em9uZV9kZXZpY2VfcHJpdmF0ZV9zcGxpdF9jYihmb2xpbywgTlVMTCk7XG4tXHRcdC8qXG4tXHRcdCAqIFVuZnJlZXplIEBmb2xpbyBvbmx5IGFmdGVyIGFsbCBwYWdlIGNhY2hlIGVudHJpZXMsIHdoaWNoXG4tXHRcdCAqIHVzZWQgdG8gcG9pbnQgdG8gaXQsIGhhdmUgYmVlbiB1cGRhdGVkIHdpdGggbmV3IGZvbGlvcy5cbi1cdFx0ICogT3RoZXJ3aXNlLCBhIHBhcmFsbGVsIGZvbGlvX3RyeV9nZXQoKSBjYW4gZ3JhYiBAZm9saW9cbi1cdFx0ICogYW5kIGl0cyBjYWxsZXIgY2FuIHNlZSBzdGFsZSBwYWdlIGNhY2hlIGVudHJpZXMuXG4tXHRcdCAqL1xuLVx0XHRmb2xpb19yZWZfdW5mcmVlemUoZm9saW8sIGZvbGlvX2NhY2hlX3JlZl9jb3VudChmb2xpbykgKyAxKTtcbitcdGlfbW1hcF9sb2NrX3JlYWQobWFwcGluZyk7XG4rXG4rXHQvKiBSYWN5IGNoZWNrIGlmIHdlIGNhbiBzcGxpdCB0aGUgcGFnZSwgYmVmb3JlIHVubWFwX2ZvbGlvKCkgKi9cbitcdGlmIChmb2xpb19leHBlY3RlZF9yZWZfY291bnQoZm9saW8pICE9IGZvbGlvX3JlZl9jb3VudChmb2xpbykgLSAxKSB7XG4rXHRcdHJldCA9IC1FQUdBSU47XG4rXHRcdGdvdG8gZmFpbF9tbWFwX3VubG9jaztcbitcdH1cbitcbitcdC8qXG4rXHQgKl9fc3BsaXRfdW5tYXBwZWRfZm9saW8oKSBtYXkgbmVlZCB0byB0cmltIG9mZiBwYWdlcyBiZXlvbmRcbitcdCAqIEVPRjogYnV0IG9uIDMyLWJpdCwgaV9zaXplX3JlYWQoKSB0YWtlcyBhbiBpcnEtdW5zYWZlXG4rXHQgKiBzZXFsb2NrLCB3aGljaCBjYW5ub3QgYmUgbmVzdGVkIGluc2lkZSB0aGUgcGFnZSB0cmVlIGxvY2suXG4rXHQgKiBTbyBub3RlIGVuZCBub3c6IGlfc2l6ZSBpdHNlbGYgbWF5IGJlIGNoYW5nZWQgYXQgYW55IG1vbWVudCxcbitcdCAqIGJ1dCBmb2xpbyBsb2NrIGlzIGdvb2QgZW5vdWdoIHRvIHNlcmlhbGl6ZSB0aGUgdHJpbW1pbmcuXG4rXHQgKi9cbitcdGVuZCA9IERJVl9ST1VORF9VUChpX3NpemVfcmVhZChtYXBwaW5nLVx1MDAzZWhvc3QpLCBQQUdFX1NJWkUpO1xuK1x0aWYgKHNobWVtX21hcHBpbmcobWFwcGluZykpXG4rXHRcdGVuZCA9IHNobWVtX2ZhbGxvY2VuZChtYXBwaW5nLVx1MDAzZWhvc3QsIGVuZCk7XG4rXG4rXHR1bm1hcF9mb2xpbyhmb2xpbyk7XG4rXG4rXHR4YXNfbG9ja19pcnEoXHUwMDI2eGFzKTtcbitcbitcdC8qXG4rXHQgKiBDaGVjayBpZiB0aGUgZm9saW8gaXMgcHJlc2VudCBpbiBwYWdlIGNhY2hlLlxuK1x0ICogV2UgYXNzdW1lIGFsbCB0YWlsIGFyZSBwcmVzZW50IHRvbywgaWYgZm9saW8gaXMgdGhlcmUuXG4rXHQgKi9cbitcdGlmICh4YXNfbG9hZChcdTAwMjZ4YXMpICE9IGZvbGlvKSB7XG4rXHRcdHJldCA9IC1FQUdBSU47XG4rXHRcdGdvdG8gZmFpbDtcbitcdH1cbitcbitcdGlmICghZm9saW9fcmVmX2ZyZWV6ZShmb2xpbywgb2xkX25yX3BhZ2VzICsgMSkpIHtcbitcdFx0cmV0ID0gLUVBR0FJTjtcbitcdFx0Z290byBmYWlsO1xuK1x0fVxuK1xuK1x0aWYgKGZvbGlvX3Rlc3RfcG1kX21hcHBhYmxlKGZvbGlvKSBcdTAwMjZcdTAwMjYgbmV3X29yZGVyIFx1MDAzYyBIUEFHRV9QTURfT1JERVIpIHtcbitcdFx0aWYgKGZvbGlvX3Rlc3Rfc3dhcGJhY2tlZChmb2xpbykpXG4rXHRcdFx0bHJ1dmVjX3N0YXRfbW9kX2ZvbGlvKGZvbGlvLCBOUl9TSE1FTV9USFBTLCAtb2xkX25yX3BhZ2VzKTtcbitcdFx0ZWxzZVxuK1x0XHRcdGxydXZlY19zdGF0X21vZF9mb2xpbyhmb2xpbywgTlJfRklMRV9USFBTLCAtb2xkX25yX3BhZ2VzKTtcbitcdH1cbitcbitcdC8qIGxvY2sgbHJ1IGxpc3QvUGFnZUNvbXBvdW5kLCByZWYgZnJvemVuIGJ5IHBhZ2VfcmVmX2ZyZWV6ZSAqL1xuK1x0aWYgKGRvX2xydSlcbitcdFx0bHJ1dmVjID0gZm9saW9fbHJ1dmVjX2xvY2soZm9saW8pO1xuK1xuK1x0cmV0ID0gX19zcGxpdF91bm1hcHBlZF9mb2xpbyhmb2xpbywgbmV3X29yZGVyLCBzcGxpdF9hdCwgXHUwMDI2eGFzLFxuK1x0XHRcdFx0ICAgICBtYXBwaW5nLCBzcGxpdF90eXBlKTtcbitcbitcdC8qXG4rXHQgKiBVbmZyZWV6ZSBhZnRlci1zcGxpdCBmb2xpb3MgYW5kIHB1dCB0aGVtIGJhY2sgdG8gdGhlIHJpZ2h0XG4rXHQgKiBsaXN0LiBAZm9saW8gc2hvdWxkIGJlIGtlcHQgZnJvemVuIHVudGlsIHBhZ2UgY2FjaGVcbitcdCAqIGVudHJpZXMgYXJlIHVwZGF0ZWQgd2l0aCBhbGwgdGhlIG90aGVyIGFmdGVyLXNwbGl0IGZvbGlvc1xuK1x0ICogdG8gcHJldmVudCBvdGhlcnMgc2VlaW5nIHN0YWxlIHBhZ2UgY2FjaGUgZW50cmllcy5cbitcdCAqIEFzIGEgcmVzdWx0LCBuZXdfZm9saW8gc3RhcnRzIGZyb20gdGhlIG5leHQgZm9saW8gb2ZcbitcdCAqIEBmb2xpby5cbitcdCAqL1xuK1x0Zm9yIChuZXdfZm9saW8gPSBmb2xpb19uZXh0KGZvbGlvKTsgbmV3X2ZvbGlvICE9IGVuZF9mb2xpbztcbitcdCAgICAgbmV3X2ZvbGlvID0gbmV4dCkge1xuK1x0XHR1bnNpZ25lZCBsb25nIG5yX3BhZ2VzID0gZm9saW9fbnJfcGFnZXMobmV3X2ZvbGlvKTtcbitcbitcdFx0bmV4dCA9IGZvbGlvX25leHQobmV3X2ZvbGlvKTtcbitcbitcdFx0Zm9saW9fcmVmX3VuZnJlZXplKG5ld19mb2xpbyxcbitcdFx0XHRcdCAgIGZvbGlvX25yX3BhZ2VzKG5ld19mb2xpbykgKyAxKTtcbiBcbiBcdFx0aWYgKGRvX2xydSlcbi1cdFx0XHRscnV2ZWNfdW5sb2NrKGxydXZlYyk7XG4rXHRcdFx0bHJ1X2FkZF9zcGxpdF9mb2xpbyhmb2xpbywgbmV3X2ZvbGlvLCBscnV2ZWMsIGxpc3QpO1xuIFxuLVx0XHRpZiAoY2kpXG4tXHRcdFx0c3dhcF9jbHVzdGVyX3VubG9jayhjaSk7XG4tXHR9IGVsc2Uge1xuLVx0XHRpZiAoZGVxdWV1ZV9kZWZlcnJlZCkge1xuLVx0XHRcdGxpc3RfbHJ1X3VubG9jayhscnUpO1xuLVx0XHRcdHJjdV9yZWFkX3VubG9jaygpO1xuK1x0XHQvKiBBZGQgdGhlIG5ldyBmb2xpbyB0byB0aGUgcGFnZSBjYWNoZS4gKi9cbitcdFx0aWYgKG5ld19mb2xpby1cdTAwM2VpbmRleCBcdTAwM2MgZW5kKSB7XG4rXHRcdFx0X194YV9zdG9yZShcdTAwMjZtYXBwaW5nLVx1MDAzZWlfcGFnZXMsIG5ld19mb2xpby1cdTAwM2VpbmRleCxcbitcdFx0XHRcdCAgIG5ld19mb2xpbywgMCk7XG4rXHRcdFx0Y29udGludWU7XG4gXHRcdH1cbi1cdFx0cmV0dXJuIC1FQUdBSU47XG4rXG4rXHRcdC8qIERyb3AgZm9saW8gYmV5b25kIEVPRjogLVx1MDAzZWluZGV4IFx1MDAzZT0gZW5kICovXG4rXHRcdGlmIChzaG1lbV9tYXBwaW5nKG1hcHBpbmcpKVxuK1x0XHRcdG5yX3NobWVtX2Ryb3BwZWQgKz0gbnJfcGFnZXM7XG4rXHRcdGVsc2UgaWYgKGZvbGlvX3Rlc3RfY2xlYXJfZGlydHkobmV3X2ZvbGlvKSlcbitcdFx0XHRmb2xpb19hY2NvdW50X2NsZWFuZWQobmV3X2ZvbGlvLFxuK1x0XHRcdFx0XHQgICAgICBpbm9kZV90b193YihtYXBwaW5nLVx1MDAzZWhvc3QpKTtcbitcdFx0X19maWxlbWFwX3JlbW92ZV9mb2xpbyhuZXdfZm9saW8sIE5VTEwpO1xuK1x0XHRmb2xpb19wdXRfcmVmcyhuZXdfZm9saW8sIG5yX3BhZ2VzKTtcbiBcdH1cbiBcbitcdC8qXG4rXHQgKiBVbmZyZWV6ZSBAZm9saW8gb25seSBhZnRlciBhbGwgcGFnZSBjYWNoZSBlbnRyaWVzLCB3aGljaFxuK1x0ICogdXNlZCB0byBwb2ludCB0byBpdCwgaGF2ZSBiZWVuIHVwZGF0ZWQgd2l0aCBuZXcgZm9saW9zLlxuK1x0ICogT3RoZXJ3aXNlLCBhIHBhcmFsbGVsIGZvbGlvX3RyeV9nZXQoKSBjYW4gZ3JhYiBAZm9saW9cbitcdCAqIGFuZCBpdHMgY2FsbGVyIGNhbiBzZWUgc3RhbGUgcGFnZSBjYWNoZSBlbnRyaWVzLlxuK1x0ICovXG4rXHRmb2xpb19yZWZfdW5mcmVlemUoZm9saW8sIGZvbGlvX25yX3BhZ2VzKGZvbGlvKSArIDEpO1xuK1xuK1x0aWYgKGRvX2xydSlcbitcdFx0bHJ1dmVjX3VubG9jayhscnV2ZWMpO1xuK1xuK2ZhaWw6XG4rXHR4YXNfdW5sb2NrX2lycShcdTAwMjZ4YXMpO1xuK2ZhaWxfbW1hcF91bmxvY2s6XG4rXHRpZiAobnJfc2htZW1fZHJvcHBlZClcbitcdFx0c2htZW1fdW5jaGFyZ2UobWFwcGluZy1cdTAwM2Vob3N0LCBucl9zaG1lbV9kcm9wcGVkKTtcbitcdC8qXG4rXHQgKiBEcm9wIHRoZSBtYXBwaW5nIHdoaWxlIHRoZSBpbm9kZSBpcyBzdGlsbCBwaW5uZWQuIEBmb2xpbyBzdGF5c1xuK1x0ICogbG9ja2VkIGFuZCBwcmVzZW50IGluIHRoZSBwYWdlIGNhY2hlLCBzbyBldmljdGlvbiBjYW5ub3QgZnJlZVxuK1x0ICogdGhlIGlub2RlIHlldCwgbm90aGluZyBwYXN0IHRoaXMgcG9pbnQgbWF5IHRvdWNoIHRoZSBpbm9kZSBvclxuK1x0ICogdGhlIG1hcHBpbmcuXG4rXHQgKi9cbitcdGlfbW1hcF91bmxvY2tfcmVhZChtYXBwaW5nKTtcbitmYWlsX2ZyZWU6XG4rXHQvKiBSZXN0b3JlIHRoZSBwcmV2aW91c2x5IGFjdGl2ZSBtZW1jZyAqL1xuK1x0c2V0X2FjdGl2ZV9tZW1jZyhvbGRfbWVtY2cpO1xuK1x0bWVtX2Nncm91cF9wdXQobWVtY2cpO1xuK1x0eGFzX2Rlc3Ryb3koXHUwMDI2eGFzKTtcbiBcdHJldHVybiByZXQ7XG4gfVxuIFxuQEAgLTQxMDIsMTcgKzQyNDgsMTEgQEAgc3RhdGljIGludCBfX2ZvbGlvX3NwbGl0KHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIsXG4gXHRcdHN0cnVjdCBwYWdlICpzcGxpdF9hdCwgc3RydWN0IHBhZ2UgKmxvY2tfYXQsXG4gXHRcdHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QsIGVudW0gc3BsaXRfdHlwZSBzcGxpdF90eXBlKVxuIHtcbi1cdFhBX1NUQVRFKHhhcywgXHUwMDI2Zm9saW8tXHUwMDNlbWFwcGluZy1cdTAwM2VpX3BhZ2VzLCBmb2xpby1cdTAwM2VpbmRleCk7XG4rXHRib29sIGlzX3N3YXBjYWNoZSA9IGZvbGlvX3Rlc3Rfc3dhcGNhY2hlKGZvbGlvKTtcbiBcdHN0cnVjdCBmb2xpbyAqZW5kX2ZvbGlvID0gZm9saW9fbmV4dChmb2xpbyk7XG4gXHRib29sIGlzX2Fub24gPSBmb2xpb190ZXN0X2Fub24oZm9saW8pO1xuLVx0c3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLCAqb2xkX21lbWNnO1xuLVx0c3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSBOVUxMO1xuLVx0c3RydWN0IGFub25fdm1hICphbm9uX3ZtYSA9IE5VTEw7XG4gXHRpbnQgb2xkX29yZGVyID0gZm9saW9fb3JkZXIoZm9saW8pO1xuIFx0c3RydWN0IGZvbGlvICpuZXdfZm9saW8sICpuZXh0O1xuLVx0aW50IG5yX3NobWVtX2Ryb3BwZWQgPSAwO1xuLVx0ZW51bSB0dHVfZmxhZ3MgdHR1X2ZsYWdzID0gMDtcbi1cdHBnb2ZmX3QgZW5kID0gMDtcbiBcdGludCByZXQ7XG4gXG4gXHRWTV9XQVJOX09OX09OQ0VfRk9MSU8oIWZvbGlvX3Rlc3RfbG9ja2VkKGZvbGlvKSwgZm9saW8pO1xuQEAgLTQxMjAsMTQxICs0MjYwLDI5IEBAIHN0YXRpYyBpbnQgX19mb2xpb19zcGxpdChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyLFxuIFxuIFx0aWYgKGZvbGlvICE9IHBhZ2VfZm9saW8oc3BsaXRfYXQpIHx8IGZvbGlvICE9IHBhZ2VfZm9saW8obG9ja19hdCkpIHtcbiBcdFx0cmV0ID0gLUVJTlZBTDtcbi1cdFx0Z290byBvdXRfbm9fbWVtY2c7XG4rXHRcdGdvdG8gb3V0O1xuIFx0fVxuIFxuIFx0aWYgKG5ld19vcmRlciBcdTAwM2U9IG9sZF9vcmRlcikge1xuIFx0XHRyZXQgPSAtRUlOVkFMO1xuLVx0XHRnb3RvIG91dF9ub19tZW1jZztcbitcdFx0Z290byBvdXQ7XG4gXHR9XG4gXG4gXHRyZXQgPSBmb2xpb19jaGVja19zcGxpdHRhYmxlKGZvbGlvLCBuZXdfb3JkZXIsIHNwbGl0X3R5cGUpO1xuIFx0aWYgKHJldCkge1xuIFx0XHRWTV9XQVJOX09OQ0UocmV0ID09IC1FSU5WQUwsIFwiVHJpZWQgdG8gc3BsaXQgYW4gdW5zcGxpdHRhYmxlIGZvbGlvXCIpO1xuLVx0XHRnb3RvIG91dF9ub19tZW1jZztcbi1cdH1cbi1cbi1cdC8qXG4tXHQgKiBzd2l0Y2ggdG8gZm9saW8ncyBtZW1jZyBhcyB4YXJyYXkgbm9kZSBhbGxvY2F0aW9uIGNhbiBoYXBwZW4gYW5kXG4tXHQgKiBuZWVkcyB0byBjaGFyZ2UgdG8gaXQuXG4tXHQgKi9cbi1cdG1lbWNnID0gZ2V0X21lbV9jZ3JvdXBfZnJvbV9mb2xpbyhmb2xpbyk7XG4tXHRvbGRfbWVtY2cgPSBzZXRfYWN0aXZlX21lbWNnKG1lbWNnKTtcbi1cbi1cdGlmIChpc19hbm9uKSB7XG4tXHRcdC8qXG4tXHRcdCAqIFRoZSBjYWxsZXIgZG9lcyBub3QgbmVjZXNzYXJpbHkgaG9sZCBhbiBtbWFwX2xvY2sgdGhhdCB3b3VsZFxuLVx0XHQgKiBwcmV2ZW50IHRoZSBhbm9uX3ZtYSBkaXNhcHBlYXJpbmcgc28gd2UgZmlyc3Qgd2UgdGFrZSBhXG4tXHRcdCAqIHJlZmVyZW5jZSB0byBpdCBhbmQgdGhlbiBsb2NrIHRoZSBhbm9uX3ZtYSBmb3Igd3JpdGUuIFRoaXNcbi1cdFx0ICogaXMgc2ltaWxhciB0byBmb2xpb19sb2NrX2Fub25fdm1hX3JlYWQgZXhjZXB0IHRoZSB3cml0ZSBsb2NrXG4tXHRcdCAqIGlzIHRha2VuIHRvIHNlcmlhbGlzZSBhZ2FpbnN0IHBhcmFsbGVsIHNwbGl0IG9yIGNvbGxhcHNlXG4tXHRcdCAqIG9wZXJhdGlvbnMuXG4tXHRcdCAqL1xuLVx0XHRhbm9uX3ZtYSA9IGZvbGlvX2dldF9hbm9uX3ZtYShmb2xpbyk7XG4tXHRcdGlmICghYW5vbl92bWEpIHtcbi1cdFx0XHRyZXQgPSAtRUJVU1k7XG4tXHRcdFx0Z290byBvdXQ7XG4tXHRcdH1cbi1cdFx0YW5vbl92bWFfbG9ja193cml0ZShhbm9uX3ZtYSk7XG4tXHRcdG1hcHBpbmcgPSBOVUxMO1xuLVx0fSBlbHNlIHtcbi1cdFx0dW5zaWduZWQgaW50IG1pbl9vcmRlcjtcbi1cdFx0Z2ZwX3QgZ2ZwO1xuLVxuLVx0XHRtYXBwaW5nID0gZm9saW8tXHUwMDNlbWFwcGluZztcbi1cdFx0bWluX29yZGVyID0gbWFwcGluZ19taW5fZm9saW9fb3JkZXIobWFwcGluZyk7XG4tXHRcdGlmIChuZXdfb3JkZXIgXHUwMDNjIG1pbl9vcmRlcikge1xuLVx0XHRcdHJldCA9IC1FSU5WQUw7XG4tXHRcdFx0Z290byBvdXQ7XG4tXHRcdH1cbi1cbi1cdFx0Z2ZwID0gY3VycmVudF9nZnBfY29udGV4dChtYXBwaW5nX2dmcF9tYXNrKG1hcHBpbmcpIFx1MDAyNlxuLVx0XHRcdFx0XHRcdFx0R0ZQX1JFQ0xBSU1fTUFTSyk7XG4tXG4tXHRcdGlmICghZmlsZW1hcF9yZWxlYXNlX2ZvbGlvKGZvbGlvLCBnZnApKSB7XG4tXHRcdFx0cmV0ID0gLUVCVVNZO1xuLVx0XHRcdGdvdG8gb3V0O1xuLVx0XHR9XG4tXG4tXHRcdG1hcHBpbmdfc2V0X3VwZGF0ZShcdTAwMjZ4YXMsIG1hcHBpbmcpO1xuLVxuLVx0XHRpZiAoc3BsaXRfdHlwZSA9PSBTUExJVF9UWVBFX1VOSUZPUk0pIHtcbi1cdFx0XHR4YXNfc2V0X29yZGVyKFx1MDAyNnhhcywgZm9saW8tXHUwMDNlaW5kZXgsIG5ld19vcmRlcik7XG4tXHRcdFx0eGFzX3NwbGl0X2FsbG9jKFx1MDAyNnhhcywgZm9saW8sIG9sZF9vcmRlciwgZ2ZwKTtcbi1cdFx0XHRpZiAoeGFzX2Vycm9yKFx1MDAyNnhhcykpIHtcbi1cdFx0XHRcdHJldCA9IHhhc19lcnJvcihcdTAwMjZ4YXMpO1xuLVx0XHRcdFx0Z290byBvdXQ7XG4tXHRcdFx0fVxuLVx0XHR9XG4tXG4tXHRcdGFub25fdm1hID0gTlVMTDtcbi1cdFx0aV9tbWFwX2xvY2tfcmVhZChtYXBwaW5nKTtcbi1cbi1cdFx0Lypcbi1cdFx0ICpfX3NwbGl0X3VubWFwcGVkX2ZvbGlvKCkgbWF5IG5lZWQgdG8gdHJpbSBvZmYgcGFnZXMgYmV5b25kXG4tXHRcdCAqIEVPRjogYnV0IG9uIDMyLWJpdCwgaV9zaXplX3JlYWQoKSB0YWtlcyBhbiBpcnEtdW5zYWZlXG4tXHRcdCAqIHNlcWxvY2ssIHdoaWNoIGNhbm5vdCBiZSBuZXN0ZWQgaW5zaWRlIHRoZSBwYWdlIHRyZWUgbG9jay5cbi1cdFx0ICogU28gbm90ZSBlbmQgbm93OiBpX3NpemUgaXRzZWxmIG1heSBiZSBjaGFuZ2VkIGF0IGFueSBtb21lbnQsXG4tXHRcdCAqIGJ1dCBmb2xpbyBsb2NrIGlzIGdvb2QgZW5vdWdoIHRvIHNlcmlhbGl6ZSB0aGUgdHJpbW1pbmcuXG4tXHRcdCAqL1xuLVx0XHRlbmQgPSBESVZfUk9VTkRfVVAoaV9zaXplX3JlYWQobWFwcGluZy1cdTAwM2Vob3N0KSwgUEFHRV9TSVpFKTtcbi1cdFx0aWYgKHNobWVtX21hcHBpbmcobWFwcGluZykpXG4tXHRcdFx0ZW5kID0gc2htZW1fZmFsbG9jZW5kKG1hcHBpbmctXHUwMDNlaG9zdCwgZW5kKTtcbi1cdH1cbi1cbi1cdC8qXG4tXHQgKiBSYWN5IGNoZWNrIGlmIHdlIGNhbiBzcGxpdCB0aGUgcGFnZSwgYmVmb3JlIHVubWFwX2ZvbGlvKCkgd2lsbFxuLVx0ICogc3BsaXQgUE1Ec1xuLVx0ICovXG4tXHRpZiAoZm9saW9fZXhwZWN0ZWRfcmVmX2NvdW50KGZvbGlvKSAhPSBmb2xpb19yZWZfY291bnQoZm9saW8pIC0gMSkge1xuLVx0XHRyZXQgPSAtRUFHQUlOO1xuLVx0XHRnb3RvIG91dF91bmxvY2s7XG4tXHR9XG4tXG4tXHR1bm1hcF9mb2xpbyhmb2xpbyk7XG4tXG4tXHQvKiBibG9jayBpbnRlcnJ1cHQgcmVlbnRyeSBpbiB4YV9sb2NrIGFuZCBzcGlubG9jayAqL1xuLVx0bG9jYWxfaXJxX2Rpc2FibGUoKTtcbi1cdGlmIChtYXBwaW5nKSB7XG4tXHRcdC8qXG4tXHRcdCAqIENoZWNrIGlmIHRoZSBmb2xpbyBpcyBwcmVzZW50IGluIHBhZ2UgY2FjaGUuXG4tXHRcdCAqIFdlIGFzc3VtZSBhbGwgdGFpbCBhcmUgcHJlc2VudCB0b28sIGlmIGZvbGlvIGlzIHRoZXJlLlxuLVx0XHQgKi9cbi1cdFx0eGFzX2xvY2soXHUwMDI2eGFzKTtcbi1cdFx0eGFzX3Jlc2V0KFx1MDAyNnhhcyk7XG4tXHRcdGlmICh4YXNfbG9hZChcdTAwMjZ4YXMpICE9IGZvbGlvKSB7XG4tXHRcdFx0cmV0ID0gLUVBR0FJTjtcbi1cdFx0XHRnb3RvIGZhaWw7XG4tXHRcdH1cbitcdFx0Z290byBvdXQ7XG4gXHR9XG4gXG4tXHRyZXQgPSBfX2ZvbGlvX2ZyZWV6ZV9hbmRfc3BsaXRfdW5tYXBwZWQoZm9saW8sIG5ld19vcmRlciwgc3BsaXRfYXQsIFx1MDAyNnhhcywgbWFwcGluZyxcbi1cdFx0XHRcdFx0XHR0cnVlLCBsaXN0LCBzcGxpdF90eXBlLCBlbmQsIFx1MDAyNm5yX3NobWVtX2Ryb3BwZWQpO1xuLWZhaWw6XG4tXHRpZiAobWFwcGluZylcbi1cdFx0eGFzX3VubG9jayhcdTAwMjZ4YXMpO1xuLVxuLVx0bG9jYWxfaXJxX2VuYWJsZSgpO1xuLVxuLVx0aWYgKG5yX3NobWVtX2Ryb3BwZWQpXG4tXHRcdHNobWVtX3VuY2hhcmdlKG1hcHBpbmctXHUwMDNlaG9zdCwgbnJfc2htZW1fZHJvcHBlZCk7XG4tXG4tXHRpZiAoIXJldCBcdTAwMjZcdTAwMjYgaXNfYW5vbiBcdTAwMjZcdTAwMjYgIWZvbGlvX2lzX2RldmljZV9wcml2YXRlKGZvbGlvKSlcbi1cdFx0dHR1X2ZsYWdzID0gVFRVX1VTRV9TSEFSRURfWkVST1BBR0U7XG4tXG4tXHRyZW1hcF9wYWdlKGZvbGlvLCAxIFx1MDAzY1x1MDAzYyBvbGRfb3JkZXIsIHR0dV9mbGFncyk7XG4tXG4tXHQvKlxuLVx0ICogRHJvcCB0aGUgbWFwcGluZyB3aGlsZSB0aGUgaW5vZGUgaXMgc3RpbGwgcGlubmVkLiBAZm9saW8gc3RheXNcbi1cdCAqIGxvY2tlZCBhbmQgcHJlc2VudCBpbiB0aGUgcGFnZSBjYWNoZSB1bnRpbCB0aGUgbG9vcCBiZWxvdywgc29cbi1cdCAqIGV2aWN0aW9uIGNhbm5vdCBmcmVlIHRoZSBpbm9kZSB5ZXQ7IEBsb2NrX2F0IGlzIG5vdCBlbm91Z2gsIGl0IG1heVxuLVx0ICogYmUgYSB0YWlsIGJleW9uZCBFT0YgdGhhdCB0aGUgc3BsaXQgYWxyZWFkeSBkcm9wcGVkIGZyb20gdGhlIHBhZ2Vcbi1cdCAqIGNhY2hlLiBOb3RoaW5nIHBhc3QgdGhpcyBwb2ludCBtYXkgdG91Y2ggdGhlIGlub2RlIG9yIHRoZSBtYXBwaW5nLlxuLVx0ICovXG4tXHRpZiAobWFwcGluZykge1xuLVx0XHRpX21tYXBfdW5sb2NrX3JlYWQobWFwcGluZyk7XG4tXHRcdG1hcHBpbmcgPSBOVUxMO1xuLVx0fVxuK1x0aWYgKGlzX2Fub24pXG4rXHRcdHJldCA9IF9fZm9saW9fZnJlZXplX3NwbGl0X3VubWFwKGZvbGlvLCBuZXdfb3JkZXIsIHNwbGl0X2F0LCB0cnVlLFxuK1x0XHRcdFx0XHRcdCB0cnVlLCBsaXN0LCBzcGxpdF90eXBlKTtcbitcdGVsc2UgaWYgKGlzX3N3YXBjYWNoZSlcbitcdFx0cmV0ID0gX19mb2xpb19mcmVlemVfc3BsaXRfdW5tYXAoZm9saW8sIG5ld19vcmRlciwgc3BsaXRfYXQsIHRydWUsXG4rXHRcdFx0XHRcdFx0IGZhbHNlLCBsaXN0LCBzcGxpdF90eXBlKTtcbitcdGVsc2VcbitcdFx0cmV0ID0gX19mb2xpb19mcmVlemVfc3BsaXRfdW5tYXBfZmlsZShmb2xpbywgbmV3X29yZGVyLCBzcGxpdF9hdCxcbitcdFx0XHRcdFx0XHQgICAgICB0cnVlLCBsaXN0LCBzcGxpdF90eXBlKTtcbiBcbiBcdC8qXG4gXHQgKiBVbmxvY2sgYWxsIGFmdGVyLXNwbGl0IGZvbGlvcyBleGNlcHQgdGhlIG9uZSBjb250YWluaW5nXG5AQCAtNDI2NSwyOSArNDI5MywxOSBAQCBzdGF0aWMgaW50IF9fZm9saW9fc3BsaXQoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlcixcbiBcdFx0aWYgKG5ld19mb2xpbyA9PSBwYWdlX2ZvbGlvKGxvY2tfYXQpKVxuIFx0XHRcdGNvbnRpbnVlO1xuIFxuLVx0XHRmb2xpb191bmxvY2sobmV3X2ZvbGlvKTtcbiBcdFx0LypcbiBcdFx0ICogU3VicGFnZXMgd2hvc2UgbWFwcGluZyBoYXMgYmVlbiB6YXBwZWQgbWF5IGJlIGZyZWVkXG4gXHRcdCAqIGVhcmxpZXIsIGJ1dCBmcmVlaW5nIHRoZW0gcmVxdWlyZXMgdGFraW5nIHRoZVxuIFx0XHQgKiBscnVfbG9jaywgc28gd2UgZGVmZXIgcHV0X3BhZ2UoKSBvbiB0YWlsIHBhZ2VzIHVudGlsXG4gXHRcdCAqIGFmdGVyIHRoZSBzcGxpdCBjb21wbGV0ZXMuXG4gXHRcdCAqL1xuLVx0XHRmcmVlX2ZvbGlvX2FuZF9zd2FwX2NhY2hlKG5ld19mb2xpbyk7XG4rXHRcdGlmIChpc19zd2FwY2FjaGUpXG4rXHRcdFx0Zm9saW9fZnJlZV9zd2FwKG5ld19mb2xpbyk7XG4rXHRcdGZvbGlvX3VubG9jayhuZXdfZm9saW8pO1xuK1x0XHRmb2xpb19wdXQobmV3X2ZvbGlvKTtcbiBcdH1cbiBcbi1vdXRfdW5sb2NrOlxuLVx0aWYgKGFub25fdm1hKSB7XG4tXHRcdGFub25fdm1hX3VubG9ja193cml0ZShhbm9uX3ZtYSk7XG4tXHRcdHB1dF9hbm9uX3ZtYShhbm9uX3ZtYSk7XG4tXHR9XG4tXHRpZiAobWFwcGluZylcbi1cdFx0aV9tbWFwX3VubG9ja19yZWFkKG1hcHBpbmcpO1xuIG91dDpcbi1cdC8qIHJlc3RvcmUgdG8gY2FsbGVyJ3Mgb2xkX21lbWNnICovXG4tXHRzZXRfYWN0aXZlX21lbWNnKG9sZF9tZW1jZyk7XG4tXHRtZW1fY2dyb3VwX3B1dChtZW1jZyk7XG4tb3V0X25vX21lbWNnOlxuLVx0eGFzX2Rlc3Ryb3koXHUwMDI2eGFzKTtcbiBcdGlmIChpc19wbWRfb3JkZXIob2xkX29yZGVyKSlcbiBcdFx0Y291bnRfdm1fZXZlbnQoIXJldCA/IFRIUF9TUExJVF9QQUdFIDogVEhQX1NQTElUX1BBR0VfRkFJTEVEKTtcbiBcdGNvdW50X210aHBfc3RhdChvbGRfb3JkZXIsICFyZXQgPyBNVEhQX1NUQVRfU1BMSVQgOiBNVEhQX1NUQVRfU1BMSVRfRkFJTEVEKTtcbkBAIC00MzE4LDIyICs0MzM2LDEzIEBAIHN0YXRpYyBpbnQgX19mb2xpb19zcGxpdChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyLFxuICAqL1xuIGludCBmb2xpb19zcGxpdF91bm1hcHBlZChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyKVxuIHtcbi1cdGludCByZXQgPSAwO1xuLVxuIFx0Vk1fV0FSTl9PTl9PTkNFX0ZPTElPKGZvbGlvX21hcHBlZChmb2xpbyksIGZvbGlvKTtcbiBcdFZNX1dBUk5fT05fT05DRV9GT0xJTyghZm9saW9fdGVzdF9sb2NrZWQoZm9saW8pLCBmb2xpbyk7XG4gXHRWTV9XQVJOX09OX09OQ0VfRk9MSU8oIWZvbGlvX3Rlc3RfbGFyZ2UoZm9saW8pLCBmb2xpbyk7XG4gXHRWTV9XQVJOX09OX09OQ0VfRk9MSU8oIWZvbGlvX3Rlc3RfYW5vbihmb2xpbyksIGZvbGlvKTtcbiBcbi1cdGlmIChmb2xpb19leHBlY3RlZF9yZWZfY291bnQoZm9saW8pICE9IGZvbGlvX3JlZl9jb3VudChmb2xpbykgLSAxKVxuLVx0XHRyZXR1cm4gLUVBR0FJTjtcbi1cbi1cdGxvY2FsX2lycV9kaXNhYmxlKCk7XG4tXHRyZXQgPSBfX2ZvbGlvX2ZyZWV6ZV9hbmRfc3BsaXRfdW5tYXBwZWQoZm9saW8sIG5ld19vcmRlciwgXHUwMDI2Zm9saW8tXHUwMDNlcGFnZSwgTlVMTCxcbi1cdFx0XHRcdFx0XHROVUxMLCBmYWxzZSwgTlVMTCwgU1BMSVRfVFlQRV9VTklGT1JNLFxuLVx0XHRcdFx0XHRcdDAsIE5VTEwpO1xuLVx0bG9jYWxfaXJxX2VuYWJsZSgpO1xuLVx0cmV0dXJuIHJldDtcbitcdHJldHVybiBfX2ZvbGlvX2ZyZWV6ZV9zcGxpdF91bm1hcChmb2xpbywgbmV3X29yZGVyLCBcdTAwMjZmb2xpby1cdTAwM2VwYWdlLCBmYWxzZSxcbitcdFx0XHRcdFx0ICBmYWxzZSwgTlVMTCwgU1BMSVRfVFlQRV9VTklGT1JNKTtcbiB9XG4gXG4gLypcbkBAIC00MzUyLDExICs0MzYxLDExIEBAIGludCBmb2xpb19zcGxpdF91bm1hcHBlZChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyKVxuICAqICAgIEdVUCBwaW5zLCB3aWxsIHJlc3VsdCBpbiB0aGUgZm9saW8gbm90IGdldHRpbmcgc3BsaXQ7IGluc3RlYWQsIHRoZSBjYWxsZXJcbiAgKiAgICB3aWxsIHJlY2VpdmUgYW4gLUVBR0FJTi5cbiAgKlxuLSAqIDQpIEBuZXdfb3JkZXIgXHUwMDNlIDEsIHVzdWFsbHkuIFNwbGl0dGluZyB0byBvcmRlci0xIGFub255bW91cyBmb2xpb3MgaXMgbm90XG4tICogICAgc3VwcG9ydGVkIGZvciBub24tZmlsZS1iYWNrZWQgZm9saW9zLCBiZWNhdXNlIGZvbGlvLVx1MDAzZV9kZWZlcnJlZF9saXN0LCB3aGljaFxuLSAqICAgIGlzIHVzZWQgYnkgcGFydGlhbGx5IG1hcHBlZCBmb2xpb3MsIGlzIHN0b3JlZCBpbiBzdWJwYWdlIDIsIGJ1dCBhbiBvcmRlci0xXG4tICogICAgZm9saW8gb25seSBoYXMgc3VicGFnZXMgMCBhbmQgMS4gRmlsZS1iYWNrZWQgb3JkZXItMSBmb2xpb3MgYXJlIHN1cHBvcnRlZCxcbi0gKiAgICBzaW5jZSB0aGV5IGRvIG5vdCB1c2UgX2RlZmVycmVkX2xpc3QuXG4rICogNCkgQG5ld19vcmRlciBcdTAwM2UgMSwgdXN1YWxseS4gT3JkZXItMSBpcyBub3Qgc3VwcG9ydGVkIGZvciBhbm9uIG9yIHN3YXBjYWNoZVxuKyAqICAgIGZvbGlvczogYW5vbiBmb2xpb3MgbmVlZCBzdWJwYWdlIDIgZm9yIF9kZWZlcnJlZF9saXN0LCB3aGljaCBvcmRlci0xXG4rICogICAgZm9saW9zIGxhY2ssIGFuZCBhIHN3YXBjYWNoZSBmb2xpbyBtYXkgYmVjb21lIGFub24gb25jZSBmYXVsdGVkIGluLlxuKyAqICAgIEZpbGUtYmFja2VkIG9yZGVyLTEgZm9saW9zIGFyZSBzdXBwb3J0ZWQsIHNpbmNlIHRoZXkgZG8gbm90IHVzZVxuKyAqICAgIF9kZWZlcnJlZF9saXN0LlxuICAqXG4gICogQWZ0ZXIgc3BsaXR0aW5nLCB0aGUgY2FsbGVyJ3MgZm9saW8gcmVmZXJlbmNlIHdpbGwgYmUgdHJhbnNmZXJyZWQgdG8gQHBhZ2UsXG4gICogcmVzdWx0aW5nIGluIGEgcmFpc2VkIHJlZmNvdW50IG9mIEBwYWdlIGFmdGVyIHRoaXMgY2FsbC4gVGhlIG90aGVyIHBhZ2VzIG1heVxuZGlmZiAtLWdpdCBhL21tL3N3YXBfc3RhdGUuYyBiL21tL3N3YXBfc3RhdGUuY1xuaW5kZXggNWJlODI1OTExZTY0NS4uZjE0MDVlNWI4MTNlZSAxMDA2NDRcbi0tLSBhL21tL3N3YXBfc3RhdGUuY1xuKysrIGIvbW0vc3dhcF9zdGF0ZS5jXG5AQCAtMzg4LDggKzM4OCw5IEBAIHZvaWQgX19zd2FwX2NhY2hlX3JlcGxhY2VfZm9saW8oc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSxcbiBcdCAgICBmb2xpb19vcmRlcihvbGQpICE9IGZvbGlvX29yZGVyKG5ldykpIHtcbiBcdFx0Y2lfb2ZmID0gc3dwX2NsdXN0ZXJfb2Zmc2V0KG9sZC1cdTAwM2Vzd2FwKTtcbiBcdFx0Y2lfZW5kID0gY2lfb2ZmICsgZm9saW9fbnJfcGFnZXMob2xkKTtcbi1cdFx0d2hpbGUgKGNpX29mZisrIFx1MDAzYyBjaV9lbmQpXG4rXHRcdGRvIHtcbiBcdFx0XHRXQVJOX09OX09OQ0Uoc3dwX3RiX3RvX2ZvbGlvKF9fc3dhcF90YWJsZV9nZXQoY2ksIGNpX29mZikpICE9IG9sZCk7XG4rXHRcdH0gd2hpbGUgKCsrY2lfb2ZmIFx1MDAzYyBjaV9lbmQpO1xuIFx0fVxuIH1cbiBcbiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA3VDIxOjU1OjQyLjg2MTUzMjgzNloiLCJTZXEiOjQxLCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjoxMTE3NDg1MDYyOSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipLTVNBTiBDaGVjazogRm9saW8gU3BsaXR0aW5nIFJlZmFjdG9yKipcblxuT2theSwgc28gSSd2ZSBiZWVuIHJldmlld2luZyB0aGlzIHBhdGNoLCBhbmQgaXQncyB0b3VjaGluZyBzb21lIGNvcmUgbWVtb3J5IG1hbmFnZW1lbnQgc3R1ZmY6IGBtbS9odWdlX21lbW9yeS5jYCBhbmQgYG1tL3N3YXBfc3RhdGUuY2AuIEl0J3MgYWxsIGFib3V0IGhvdyBmb2xpb3MgZ2V0IHNwbGl0IHVwLCBwYXJ0aWN1bGFybHkgZGVhbGluZyB3aXRoIHRob3NlIHVubWFwcGVkLCBhbm9ueW1vdXMsIGFuZCBzd2FwY2FjaGUgZm9saW9zLiBUaGUgY29kZSdzIHJlZmFjdG9yaW5nIHNldmVyYWwga2V5IGZ1bmN0aW9uczogYHJlbWFwX3BhZ2VgLCBhIGJ1bmNoIG9mIGBfX3NwbGl0XypgLCBgZm9saW9fKmAgYW5kIGBfX3N3YXBfY2FjaGVfcmVwbGFjZV9mb2xpb2AuIExvb2tzIGxpa2UgYSBmYWlybHkgaW52b2x2ZWQgY2hhbmdlLlxuXG5NeSBpbW1lZGlhdGUgY29uY2VybiwgYXMgYWx3YXlzIHdpdGggbWVtb3J5IG1hbmFnZW1lbnQsIGlzIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGFjY2Vzcy4gR2l2ZW4gbXkgZXhwZXJ0aXNlLCBJIGFsd2F5cyBzY3J1dGluaXplIHRoZXNlIHBhdGNoZXMgZm9yIHRoYXQgcG90ZW50aWFsLiBJIHNlZSB0aGlzIGFzIGEgZm9saW8gc3BsaXR0aW5nIHBhdGNoLCB3aGljaCBkb2VzIG5vdCBhbGxvY2F0ZSAqbmV3KiBtZW1vcnkuIEl0J3Mgd29ya2luZyB3aXRoIGV4aXN0aW5nIHBhZ2UgbWV0YWRhdGEgKGVzc2VudGlhbGx5IGBzdHJ1Y3QgcGFnZWAgYWxyZWFkeSBwcmVzZW50IGluIGBtZW1tYXBgKSwgYW5kIHRoZSAqY29udGVudHMqIG9mIHRob3NlIHBhZ2VzIGRvbid0IHNlZW0gdG8gYmUgY2hhbmdpbmcsIGp1c3QgdGhlaXIgbWV0YWRhdGEgYW5kIHBhZ2UgdGFibGUgZW50cmllcy4gVGhlIHBhdGNoIGZvY3VzZXMgb24gc3BsaXR0aW5nIGZvbGlvcyBpbnRvIHNtYWxsZXIgdW5pdHMgYW5kIGNvcnJlY3RseSBtYW5hZ2luZyB0aGVpciBhc3NvY2lhdGVkIG1ldGFkYXRhIGFuZCBjYWNoZSBlbnRyaWVzLlxuXG5JJ20gZm9jdXNpbmcgc3BlY2lmaWNhbGx5IG9uIHJpc2sgZm9yIHVzZS1hZnRlci1mcmVlLCBkb3VibGUtZnJlZSwgbG9ja2luZyBkZWFkbG9ja3MsIG9yIHJlZmVyZW5jZSBjb3VudCBpbWJhbGFuY2VzIGluIHRoaXMgcGF0Y2guIFRoZXNlIGFyZSBhbGwgY29tbW9uIHBpdGZhbGxzLiBCYXNlZCBvbiB0aGUgZGVzY3JpcHRpb24sIHRoZXJlJ3Mgbm90aGluZyBpbiBoZXJlIHRoYXQgc2hvdWxkIGxlYWQgdG8gbmV3LCBjb21wbGV4IGRhdGEgc3RydWN0dXJlcyBiZWluZyBjcmVhdGVkLCBub3IgZG9lcyBpdCBsb29rIGxpa2UgYW55IGRhdGEgaXMgYmVpbmcgc2VudCB0byB1c2VyIHNwYWNlIGRpcmVjdGx5IHRoYXQgY291bGQgZXhwb3NlIHVuaW5pdGlhbGl6ZWQgbWVtb3J5LiBUaGUgZGVzY3JpcHRpb24gYWxzbyBtZW50aW9ucyB0aGF0IHRoZXJlIGFyZW4ndCBjaGFuZ2VzIHRvIGJvdW5kcyBjaGVja3MgdGhhdCB3b3VsZCBleHBvc2UgdW5pbml0aWFsaXplZCBtZW1vcnkuXG5cblRoZSBzdGF0ZWQgcG90ZW50aWFsIGJ1Z3MgYXJlIHR5cGljYWxseSBkZXRlY3RlZCBieSBLQVNBTiwgTE9DS0RFUCwgYW5kIFZNX1dBUk5fT04gYXNzZXJ0aW9ucywgd2hpY2ggaXMgZ29vZC4gS01TQU4gaXRzZWxmIGlzIGZvciB1bmluaXRpYWxpemVkIG1lbW9yeSByZWFkcyBhbmQgbGVha3MuIFNpbmNlIHRoaXMgcGF0Y2ggZG9lc24ndCBhcHBlYXIgdG8gaW50cm9kdWNlIHVuaW5pdGlhbGl6ZWQgbWVtb3J5ICp1c2FnZSogZGlyZWN0bHksIG1lYW5pbmcgaXTigJlzIG5vdCBjcmVhdGluZyBuZXcgbWVtb3J5IGFuZCB0aGVuIHJlYWRpbmcgZnJvbSBpdCBiZWZvcmUgaW5pdGlhbGl6YXRpb24sIEtNU0FOIHNob3VsZCBiZSB1bm5lY2Vzc2FyeS4gVGhpcyBwYXRjaCBpcyBhYm91dCBzcGxpdHRpbmcgYW5kIG1hbmFnaW5nICpleGlzdGluZyogbWVtb3J5LCB3aGljaCBtZWFucywgYE5lZWRzS01TQU5gIGlzIGZhbHNlLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxMTQxNiwiT3V0cHV0VG9rZW5zIjoxODQsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo2MDUsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0wN1QyMTo1NTo1NC4wMzYzODY5OTRaIiwiU2VxIjo0MiwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoic2V0LXJlc3VsdHMiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNTUwMCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIHJlZmFjdG9ycyBmb2xpbyBzcGxpdHRpbmcgbG9naWMgaW4gdGhlIG1lbW9yeSBtYW5hZ2VtZW50IHN1YnN5c3RlbSAoYG1tL2h1Z2VfbWVtb3J5LmNgKSwgc3BlY2lmaWNhbGx5IHNlcGFyYXRpbmcgdGhlIGhhbmRsaW5nIG9mIGFub255bW91cywgc3dhcGNhY2hlLCBhbmQgZmlsZS1iYWNrZWQgZm9saW9zLiBJdCBtb2RpZmllcyByZWZlcmVuY2UgY291bnRpbmcsIGxvY2tpbmcsIGFuZCBwYWdlIGNhY2hlL3N3YXAgY2FjaGUgcmVwbGFjZW1lbnQgbG9naWMuIFRoZXNlIGNoYW5nZXMgcHJpbWFyaWx5IHJpc2sgaW50cm9kdWNpbmcgdXNlLWFmdGVyLWZyZWUsIGRvdWJsZS1mcmVlLCBsb2NraW5nIGRlYWRsb2Nrcywgb3IgcmVmZXJlbmNlIGNvdW50IGltYmFsYW5jZXMuIFN1Y2ggaXNzdWVzIGFyZSBlZmZlY3RpdmVseSBkZXRlY3RlZCBieSBLQVNBTiwgTE9DS0RFUCwgYW5kIHN0YW5kYXJkIGtlcm5lbCBkZWJ1Z2dpbmcgYXNzZXJ0aW9ucyAoZS5nLiwgYFZNX1dBUk5fT05gKS4gVGhlIHBhdGNoIGRvZXMgbm90IGludHJvZHVjZSBuZXcgYWxsb2NhdGlvbnMgb2YgY29tcGxleCBkYXRhIHN0cnVjdHVyZXMsIG5vciBkb2VzIGl0IG1vZGlmeSBkYXRhIHNlbnQgdG8gdXNlciBzcGFjZSBvciBhbHRlciBib3VuZHMgY2hlY2tpbmcgaW4gYSB3YXkgdGhhdCBjb3VsZCBleHBvc2UgdW5pbml0aWFsaXplZCBtZW1vcnkuIFRoZXJlZm9yZSwgdGhlcmUgaXMgbm8ganVzdGlmaWNhdGlvbiBmb3IgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uLlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2Vcbn0iLCJSZXN1bHRzIjoie1xuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIHJlZmFjdG9ycyBmb2xpbyBzcGxpdHRpbmcgbG9naWMgaW4gdGhlIG1lbW9yeSBtYW5hZ2VtZW50IHN1YnN5c3RlbSAoYG1tL2h1Z2VfbWVtb3J5LmNgKSwgc3BlY2lmaWNhbGx5IHNlcGFyYXRpbmcgdGhlIGhhbmRsaW5nIG9mIGFub255bW91cywgc3dhcGNhY2hlLCBhbmQgZmlsZS1iYWNrZWQgZm9saW9zLiBJdCBtb2RpZmllcyByZWZlcmVuY2UgY291bnRpbmcsIGxvY2tpbmcsIGFuZCBwYWdlIGNhY2hlL3N3YXAgY2FjaGUgcmVwbGFjZW1lbnQgbG9naWMuIFRoZXNlIGNoYW5nZXMgcHJpbWFyaWx5IHJpc2sgaW50cm9kdWNpbmcgdXNlLWFmdGVyLWZyZWUsIGRvdWJsZS1mcmVlLCBsb2NraW5nIGRlYWRsb2Nrcywgb3IgcmVmZXJlbmNlIGNvdW50IGltYmFsYW5jZXMuIFN1Y2ggaXNzdWVzIGFyZSBlZmZlY3RpdmVseSBkZXRlY3RlZCBieSBLQVNBTiwgTE9DS0RFUCwgYW5kIHN0YW5kYXJkIGtlcm5lbCBkZWJ1Z2dpbmcgYXNzZXJ0aW9ucyAoZS5nLiwgYFZNX1dBUk5fT05gKS4gVGhlIHBhdGNoIGRvZXMgbm90IGludHJvZHVjZSBuZXcgYWxsb2NhdGlvbnMgb2YgY29tcGxleCBkYXRhIHN0cnVjdHVyZXMsIG5vciBkb2VzIGl0IG1vZGlmeSBkYXRhIHNlbnQgdG8gdXNlciBzcGFjZSBvciBhbHRlciBib3VuZHMgY2hlY2tpbmcgaW4gYSB3YXkgdGhhdCBjb3VsZCBleHBvc2UgdW5pbml0aWFsaXplZCBtZW1vcnkuIFRoZXJlZm9yZSwgdGhlcmUgaXMgbm8ganVzdGlmaWNhdGlvbiBmb3IgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uLlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2Vcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfV07CgkJCWlmICghcmF3RGF0YSB8fCByYXdEYXRhLmxlbmd0aCA9PT0gMCkgcmV0dXJuOwoKCQkJZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSk7CgkJCWRyYXdEdXJhdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCQlkcmF3VG9rZW5Db25zdW1wdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSkgewoJCQljb25zdCBzdGF0cyA9IHsKCQkJCWxsbTogeyBjb3VudDogMCwgdG9rZW5zOiAwLCBkdXJhdGlvbjogMCB9LAoJCQkJdG9vbDogeyBjb3VudDogMCwgZHVyYXRpb246IDAgfQoJCQl9OwoKCQkJcmF3RGF0YS5mb3JFYWNoKHMgPT4gewoJCQkJY29uc3QgZHVyID0gcy5EdXJhdGlvbiAvIDEwMDAwMDAwMDA7IAoJCQkJaWYgKHMuVHlwZSA9PT0gImxsbSIpIHsKCQkJCQlzdGF0cy5sbG0uY291bnQrKzsKCQkJCQlzdGF0cy5sbG0udG9rZW5zICs9IChzLklucHV0VG9rZW5zICsgcy5PdXRwdXRUb2tlbnMgKyBzLk91dHB1dFRob3VnaHRzVG9rZW5zKTsKCQkJCQlzdGF0cy5sbG0uZHVyYXRpb24gKz0gZHVyOwoJCQkJfSBlbHNlIGlmIChzLlR5cGUgPT09ICJ0b29sIikgewoJCQkJCXN0YXRzLnRvb2wuY291bnQrKzsKCQkJCQlzdGF0cy50b29sLmR1cmF0aW9uICs9IGR1cjsKCQkJCX0KCQkJfSk7CgoJCQljb25zdCBhdmdMbG1EdXIgPSBzdGF0cy5sbG0uY291bnQgPiAwID8gKHN0YXRzLmxsbS5kdXJhdGlvbiAvIHN0YXRzLmxsbS5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgkJCWNvbnN0IGF2Z0xsbVRva2VuID0gc3RhdHMubGxtLmNvdW50ID4gMCA/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-workflown29tn[0].run-triage(0) Phase: Succeeded StartedAt: 2026-08-07 21:52:48 +0000 UTC FinishedAt: 2026-08-07 21:55:55 +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": "7e4ead2558f28da16d82a8f5845eee44555ff6ba", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "TRANSPARENT_HUGEPAGE", "SWAP" ], "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": "7e4ead2558f28da16d82a8f5845eee44555ff6ba", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "TRANSPARENT_HUGEPAGE", "SWAP" ], "series_id": "fb72ef26-ac07-4257-9aa2-0a5a49da2bba" }, "track": "KASAN", "fuzz": { "focus": null, "focus_symbols": [ "__split_huge_page_to_list_to_order", "folio_split", "folio_split_unmapped", "__swap_cache_replace_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+CgkJCTx0ZD4yMDI2LzA4LzA3IDIxOjU0PC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MW08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O1RSQU5TUEFSRU5UX0hVR0VQQUdFJiMzNDssCiAgICAmIzM0O1NXQVAmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDtfX3NwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyJiMzNDssCiAgICAmIzM0O2ZvbGlvX3NwbGl0JiMzNDssCiAgICAmIzM0O2ZvbGlvX3NwbGl0X3VubWFwcGVkJiMzNDssCiAgICAmIzM0O19fc3dhcF9jYWNoZV9yZXBsYWNlX2ZvbGlvJiMzNDsKICBdLAogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggcmVmYWN0b3JzIGZvbGlvIHNwbGl0dGluZyBsb2dpYyBpbiB0aGUgbWVtb3J5IG1hbmFnZW1lbnQgc3Vic3lzdGVtIChgbW0vaHVnZV9tZW1vcnkuY2ApLCBzcGVjaWZpY2FsbHkgc2VwYXJhdGluZyB0aGUgaGFuZGxpbmcgb2YgYW5vbnltb3VzLCBzd2FwY2FjaGUsIGFuZCBmaWxlLWJhY2tlZCBmb2xpb3MuIEl0IG1vZGlmaWVzIHJlZmVyZW5jZSBjb3VudGluZywgbG9ja2luZywgYW5kIHBhZ2UgY2FjaGUvc3dhcCBjYWNoZSByZXBsYWNlbWVudCBsb2dpYy4gVGhlc2UgY2hhbmdlcyBwcmltYXJpbHkgcmlzayBpbnRyb2R1Y2luZyB1c2UtYWZ0ZXItZnJlZSwgZG91YmxlLWZyZWUsIGxvY2tpbmcgZGVhZGxvY2tzLCBvciByZWZlcmVuY2UgY291bnQgaW1iYWxhbmNlcy4gU3VjaCBpc3N1ZXMgYXJlIGVmZmVjdGl2ZWx5IGRldGVjdGVkIGJ5IEtBU0FOLCBMT0NLREVQLCBhbmQgc3RhbmRhcmQga2VybmVsIGRlYnVnZ2luZyBhc3NlcnRpb25zIChlLmcuLCBgVk1fV0FSTl9PTmApLiBUaGUgcGF0Y2ggZG9lcyBub3QgaW50cm9kdWNlIG5ldyBhbGxvY2F0aW9ucyBvZiBjb21wbGV4IGRhdGEgc3RydWN0dXJlcywgbm9yIGRvZXMgaXQgbW9kaWZ5IGRhdGEgc2VudCB0byB1c2VyIHNwYWNlIG9yIGFsdGVyIGJvdW5kcyBjaGVja2luZyBpbiBhIHdheSB0aGF0IGNvdWxkIGV4cG9zZSB1bmluaXRpYWxpemVkIG1lbW9yeS4gVGhlcmVmb3JlLCB0aGVyZSBpcyBubyBqdXN0aWZpY2F0aW9uIGZvciBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24uJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIHJld29ya3MgdGhlIGxvZ2ljIGZvciBzcGxpdHRpbmcgdW5tYXBwZWQgZm9saW9zLCBzcGVjaWZpY2FsbHkgaGFuZGxpbmcgc3dhcGNhY2hlIGFuZCBhbm9ueW1vdXMgZm9saW9zLiBJdCBpbnRyb2R1Y2VzIG5ldyBzdGF0aWMgZnVuY3Rpb25zIGBfX2ZvbGlvX2ZyZWV6ZV9zcGxpdF91bm1hcGAgYW5kIGBfX2ZvbGlvX2ZyZWV6ZV9zcGxpdF91bm1hcF9maWxlYCB0byByZXBsYWNlIGBfX2ZvbGlvX2ZyZWV6ZV9hbmRfc3BsaXRfdW5tYXBwZWRgLiBJdCBhbHNvIG1vZGlmaWVzIGBmb2xpb19jaGVja19zcGxpdHRhYmxlYCBhbmQgYF9fZm9saW9fc3BsaXRgIHRvIHVzZSB0aGUgbmV3IGxvZ2ljLiBUaGUgY2hhbmdlcyBhZmZlY3QgY29yZSBtZW1vcnkgbWFuYWdlbWVudCwgc3BlY2lmaWNhbGx5IFRIUCBhbmQgZm9saW8gc3BsaXR0aW5nLCB3aGljaCBhcmUgaGlnaGx5IGNvbXBsZXggYW5kIHByb25lIHRvIHJhY2UgY29uZGl0aW9ucy4gRnV6emluZyB0aGUgbWFpbiBlbnRyeSBwb2ludHMgZm9yIGZvbGlvIHNwbGl0dGluZyBpcyBpbXBvcnRhbnQgdG8gZW5zdXJlIHRoZSBuZXcgbG9naWMgaXMgcm9idXN0LiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA3IDIxOjU0PC90ZD4KCQkJPHRkPmFjdGlvbjwvdGQ+CgkJCTx0ZD5yZWFkLXBhdGNoLWRpZmY8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtQYXRjaERpZmYmIzM0OzogJiMzNDtjb21taXQgZTVlMjQ3OGE1NmI5NTJhOGFjNWY2MmQyZTY1YWY1ODhlYzM0Mjg2OFxuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBGcmkgQXVnIDcgMjE6NTQ6MDQgMjAyNiAmIzQzOzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvbW0vaHVnZV9tZW1vcnkuYyBiL21tL2h1Z2VfbWVtb3J5LmNcbmluZGV4IGNlZDQwMGY3MmQ0M2EuLjBkNzBlZTMwMTdjNDYgMTAwNjQ0XG4tLS0gYS9tbS9odWdlX21lbW9yeS5jXG4mIzQzOyYjNDM7JiM0MzsgYi9tbS9odWdlX21lbW9yeS5jXG5AQCAtMzU4OSw5ICYjNDM7MzU4OSw2IEBAIHN0YXRpYyB2b2lkIHJlbWFwX3BhZ2Uoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgbG9uZyBuciwgaW50IGZsYWdzKVxuIHtcbiBcdGludCBpID0gMDtcbiBcbi1cdC8qIElmIHVubWFwX2ZvbGlvKCkgdXNlcyB0cnlfdG9fbWlncmF0ZSgpIG9uIGZpbGUsIHJlbW92ZSB0aGlzIGNoZWNrICovXG4tXHRpZiAoIWZvbGlvX3Rlc3RfYW5vbihmb2xpbykpXG4tXHRcdHJldHVybjtcbiBcdGZvciAoOzspIHtcbiBcdFx0cmVtb3ZlX21pZ3JhdGlvbl9wdGVzKGZvbGlvLCBmb2xpbywgVFRVX1JNQVBfTE9DS0VEIHwgZmxhZ3MpO1xuIFx0XHRpICYjNDM7PSBmb2xpb19ucl9wYWdlcyhmb2xpbyk7XG5AQCAtMzgwMCw2ICYjNDM7Mzc5Nyw3IEBAIHN0YXRpYyBpbnQgX19zcGxpdF91bm1hcHBlZF9mb2xpbyhzdHJ1Y3QgZm9saW8gKmZvbGlvLCBpbnQgbmV3X29yZGVyLFxuIFx0XHRzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywgZW51bSBzcGxpdF90eXBlIHNwbGl0X3R5cGUpXG4ge1xuIFx0Y29uc3QgYm9vbCBpc19hbm9uID0gZm9saW9fdGVzdF9hbm9uKGZvbGlvKTtcbiYjNDM7XHRjb25zdCBib29sIGlzX3N3YXBjYWNoZSA9IGZvbGlvX3Rlc3Rfc3dhcGNhY2hlKGZvbGlvKTtcbiBcdGludCBvbGRfb3JkZXIgPSBmb2xpb19vcmRlcihmb2xpbyk7XG4gXHRpbnQgc3RhcnRfb3JkZXIgPSBzcGxpdF90eXBlID09IFNQTElUX1RZUEVfVU5JRk9STSA/IG5ld19vcmRlciA6IG9sZF9vcmRlciAtIDE7XG4gXHRzdHJ1Y3QgZm9saW8gKm9sZF9mb2xpbyA9IGZvbGlvO1xuQEAgLTM4MTQsOCAmIzQzOzM4MTIsOCBAQCBzdGF0aWMgaW50IF9fc3BsaXRfdW5tYXBwZWRfZm9saW8oc3RydWN0IGZvbGlvICpmb2xpbywgaW50IG5ld19vcmRlcixcbiBcdCAgICAgc3BsaXRfb3JkZXItLSkge1xuIFx0XHRpbnQgbnJfbmV3X2ZvbGlvcyA9IDFVTCBcdTAwM2NcdTAwM2MgKG9sZF9vcmRlciAtIHNwbGl0X29yZGVyKTtcbiBcbi1cdFx0Lyogb3JkZXItMSBhbm9ueW1vdXMgZm9saW8gaXMgbm90IHN1cHBvcnRlZCAqL1xuLVx0XHRpZiAoaXNfYW5vbiBcdTAwMjZcdTAwMjYgc3BsaXRfb3JkZXIgPT0gMSlcbiYjNDM7XHRcdC8qIG9yZGVyLTEgYW5vbnltb3VzIG9yIHN3YXBjYWNoZSBmb2xpbyBpcyBub3Qgc3VwcG9ydGVkICovXG4mIzQzO1x0XHRpZiAoKGlzX2Fub24gfHwgaXNfc3dhcGNhY2hlKSBcdTAwMjZcdTAwMjYgc3BsaXRfb3JkZXIgPT0gMSlcbiBcdFx0XHRjb250aW51ZTtcbiBcbiBcdFx0aWYgKG1hcHBpbmcpIHtcbkBAIC0zODc4LDMyICYjNDM7Mzg3NiwyNiBAQCBzdGF0aWMgaW50IF9fc3BsaXRfdW5tYXBwZWRfZm9saW8oc3RydWN0IGZvbGlvICpmb2xpbywgaW50IG5ld19vcmRlcixcbiBpbnQgZm9saW9fY2hlY2tfc3BsaXR0YWJsZShzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyLFxuIFx0XHRcdCAgIGVudW0gc3BsaXRfdHlwZSBzcGxpdF90eXBlKVxuIHtcbiYjNDM7XHRib29sIGlzX2Fub24gPSBmb2xpb190ZXN0X2Fub24oZm9saW8pO1xuJiM0MztcdGJvb2wgaXNfc3dhcGNhY2hlID0gZm9saW9fdGVzdF9zd2FwY2FjaGUoZm9saW8pO1xuJiM0MztcbiBcdFZNX1dBUk5fT05fRk9MSU8oIWZvbGlvX3Rlc3RfbG9ja2VkKGZvbGlvKSwgZm9saW8pO1xuIFx0LypcbiBcdCAqIEZvbGlvcyB0aGF0IGp1c3QgZ290IHRydW5jYXRlZCBjYW5ub3QgZ2V0IHNwbGl0LiBTaWduYWwgdG8gdGhlXG4tXHQgKiBjYWxsZXIgdGhhdCB0aGVyZSB3YXMgYSByYWNlLlxuLVx0ICpcbi1cdCAqIFRPRE86IHRoaXMgd2lsbCBhbHNvIGN1cnJlbnRseSByZWZ1c2UgZm9saW9zIHdpdGhvdXQgYSBtYXBwaW5nIGluIHRoZVxuLVx0ICogc3dhcGNhY2hlIChzaG1lbSBvciB0by1iZS1hbm9uIGZvbGlvcykuXG4mIzQzO1x0ICogY2FsbGVyIHRoYXQgdGhlcmUgd2FzIGEgcmFjZS4gQSBtYXBwaW5nbGVzcyBzd2FwIGNhY2hlIGZvbGlvXG4mIzQzO1x0ICogaGFzIG5vIHBhZ2UgY2FjaGUgZW50cmllcyB0byB1cGRhdGUsIHNvIGl0IGlzIGZpbmUgdG8gc3BsaXQuXG4gXHQgKi9cbi1cdGlmICghZm9saW8tXHUwMDNlbWFwcGluZyBcdTAwMjZcdTAwMjYgIWZvbGlvX3Rlc3RfYW5vbihmb2xpbykpXG4mIzQzO1x0aWYgKCFmb2xpby1cdTAwM2VtYXBwaW5nIFx1MDAyNlx1MDAyNiAhaXNfc3dhcGNhY2hlKVxuIFx0XHRyZXR1cm4gLUVCVVNZO1xuIFxuLVx0Lyogb3JkZXItMSBpcyBub3Qgc3VwcG9ydGVkIGZvciBhbm9ueW1vdXMgVEhQLiAqL1xuLVx0aWYgKGZvbGlvX3Rlc3RfYW5vbihmb2xpbykgXHUwMDI2XHUwMDI2IG5ld19vcmRlciA9PSAxKVxuLVx0XHRyZXR1cm4gLUVJTlZBTDtcbi1cbiBcdC8qXG4tXHQgKiBzd2FwY2FjaGUgZm9saW8gY291bGQgb25seSBiZSBzcGxpdCB0byBvcmRlciAwXG4tXHQgKlxuLVx0ICogbm9uLXVuaWZvcm0gc3BsaXQgY3JlYXRlcyBhZnRlci1zcGxpdCBmb2xpb3Mgd2l0aCBvcmRlcnMgZnJvbVxuLVx0ICogZm9saW9fb3JkZXIoZm9saW8pIC0gMSB0byBuZXdfb3JkZXIsIG1ha2luZyBpdCBub3Qgc3VpdGFibGUgZm9yIGFueVxuLVx0ICogc3dhcGNhY2hlIGZvbGlvIHNwbGl0LiBPbmx5IHVuaWZvcm0gc3BsaXQgdG8gb3JkZXItMCBjYW4gYmUgdXNlZFxuLVx0ICogaGVyZS5cbiYjNDM7XHQgKiBPcmRlci0xIGlzIHVuc3VwcG9ydGVkOiBhbm9uIGZvbGlvcyBuZWVkIHN1YnBhZ2UgMiBmb3IgdGhlXG4mIzQzO1x0ICogZGVmZXJyZWQgc3BsaXQgbGlzdCwgaHlicmlkIHNobWVtIFx1MDAyNiBzd2FwIGNhY2hlIGZvbGlvcyBhcmUgbm90XG4mIzQzO1x0ICogc3BsaXR0YWJsZSwgYW5kIGEgc3BsaXR0YWJsZSBtYXBwaW5nbGVzcyBzd2FwIGNhY2hlIGZvbGlvIGNvdWxkXG4mIzQzO1x0ICogYmUgZWl0aGVyIGFub24gb3Igc2htZW0sIHdoaWNoIHdlIGNhbm5vdCB0ZWxsIGFwYXJ0LlxuIFx0ICovXG4tXHRpZiAoKHNwbGl0X3R5cGUgPT0gU1BMSVRfVFlQRV9OT05fVU5JRk9STSB8fCBuZXdfb3JkZXIpIFx1MDAyNlx1MDAyNiBmb2xpb190ZXN0X3N3YXBjYWNoZShmb2xpbykpIHtcbiYjNDM7XHRpZiAoKGlzX2Fub24gfHwgaXNfc3dhcGNhY2hlKSBcdTAwMjZcdTAwMjYgbmV3X29yZGVyID09IDEpXG4gXHRcdHJldHVybiAtRUlOVkFMO1xuLVx0fVxuIFxuIFx0aWYgKGlzX2h1Z2VfemVyb19mb2xpbyhmb2xpbykpXG4gXHRcdHJldHVybiAtRUlOVkFMO1xuQEAgLTM5MTEsMzkgJiM0MzszOTAzLDc4IEBAIGludCBmb2xpb19jaGVja19zcGxpdHRhYmxlKHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIsXG4gXHRpZiAoZm9saW9fdGVzdF93cml0ZWJhY2soZm9saW8pKVxuIFx0XHRyZXR1cm4gLUVCVVNZO1xuIFxuJiM0MztcdC8qXG4mIzQzO1x0ICogQSBub24tYW5vbiBzd2FwY2FjaGUgZm9saW8gdGhhdCBzdGlsbCBoYXMgYSBtYXBwaW5nIHNob3VsZCBvbmx5XG4mIzQzO1x0ICogYmUgYSBzaG1lbSBmb2xpbyB1bmRlciBJTywgdGhlcmUgaXMgbGl0dGxlIGJlbmVmaXQgaW4gc3BsaXR0aW5nXG4mIzQzO1x0ICogdGhlbSBoZW5jZSBub3Qgc3VwcG9ydGVkLiBSZWplY3QgaXQgaGVyZSB1cCBmcm9udDogdGhlIHNwbGl0XG4mIzQzO1x0ICogcm91dGluZSBjYW5ub3QgYmFjayBvdXQgY2xlYW5seSBvbmNlIHRoZSBmb2xpbyByZWYgaXMgZnJvemVuLlxuJiM0MztcdCAqL1xuJiM0MztcdGlmICghaXNfYW5vbiBcdTAwMjZcdTAwMjYgaXNfc3dhcGNhY2hlIFx1MDAyNlx1MDAyNiBmb2xpby1cdTAwM2VtYXBwaW5nKVxuJiM0MztcdFx0cmV0dXJuIC1FSU5WQUw7XG4mIzQzO1xuIFx0cmV0dXJuIDA7XG4gfVxuIFxuLS8qIE51bWJlciBvZiBmb2xpbyByZWZlcmVuY2VzIGZyb20gdGhlIHBhZ2VjYWNoZSBvciB0aGUgc3dhcGNhY2hlLiAqL1xuLXN0YXRpYyB1bnNpZ25lZCBpbnQgZm9saW9fY2FjaGVfcmVmX2NvdW50KGNvbnN0IHN0cnVjdCBmb2xpbyAqZm9saW8pXG4mIzQzOy8qIE51bWJlciBvZiBmb2xpbyByZWZlcmVuY2VzIGZyb20gdGhlIHN3YXBjYWNoZS4gKi9cbiYjNDM7c3RhdGljIHVuc2lnbmVkIGludCBmb2xpb19zd2FwY2FjaGVfcmVmX2NvdW50KGNvbnN0IHN0cnVjdCBmb2xpbyAqZm9saW8pXG4ge1xuLVx0aWYgKGZvbGlvX3Rlc3RfYW5vbihmb2xpbykgXHUwMDI2XHUwMDI2ICFmb2xpb190ZXN0X3N3YXBjYWNoZShmb2xpbykpXG4mIzQzO1x0aWYgKCFmb2xpb190ZXN0X3N3YXBjYWNoZShmb2xpbykpXG4gXHRcdHJldHVybiAwO1xuIFx0cmV0dXJuIGZvbGlvX25yX3BhZ2VzKGZvbGlvKTtcbiB9XG4gXG4tc3RhdGljIGludCBfX2ZvbGlvX2ZyZWV6ZV9hbmRfc3BsaXRfdW5tYXBwZWQoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlcixcbi1cdFx0XHRcdFx0ICAgICBzdHJ1Y3QgcGFnZSAqc3BsaXRfYXQsIHN0cnVjdCB4YV9zdGF0ZSAqeGFzLFxuLVx0XHRcdFx0XHQgICAgIHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLCBib29sIGRvX2xydSxcbi1cdFx0XHRcdFx0ICAgICBzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LCBlbnVtIHNwbGl0X3R5cGUgc3BsaXRfdHlwZSxcbi1cdFx0XHRcdFx0ICAgICBwZ29mZl90IGVuZCwgaW50ICpucl9zaG1lbV9kcm9wcGVkKVxuJiM0MztzdGF0aWMgaW50IF9fZm9saW9fZnJlZXplX3NwbGl0X3VubWFwKHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIsXG4mIzQzO1x0XHRcdFx0ICAgICAgc3RydWN0IHBhZ2UgKnNwbGl0X2F0LCBib29sIGRvX2xydSwgYm9vbCBhbm9uX3VubWFwLFxuJiM0MztcdFx0XHRcdCAgICAgIHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QsIGVudW0gc3BsaXRfdHlwZSBzcGxpdF90eXBlKVxuIHtcbiBcdHN0cnVjdCBmb2xpbyAqZW5kX2ZvbGlvID0gZm9saW9fbmV4dChmb2xpbyk7XG4tXHRzdHJ1Y3QgZm9saW8gKm5ld19mb2xpbywgKm5leHQ7XG4mIzQzO1x0Ym9vbCBpc19hbm9uID0gZm9saW9fdGVzdF9hbm9uKGZvbGlvKTtcbiYjNDM7XHRzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpID0gTlVMTDtcbiYjNDM7XHRzdHJ1Y3QgZm9saW8gKm5ld19mb2xpbztcbiBcdGludCBvbGRfb3JkZXIgPSBmb2xpb19vcmRlcihmb2xpbyk7XG4mIzQzO1x0c3RydWN0IGFub25fdm1hICphbm9uX3ZtYSA9IE5VTEw7XG4mIzQzO1x0ZW51bSB0dHVfZmxhZ3MgdHR1X2ZsYWdzID0gMDtcbiBcdHN0cnVjdCBsaXN0X2xydV9vbmUgKmxydTtcbiYjNDM7XHRzdHJ1Y3QgbHJ1dmVjICpscnV2ZWM7XG4gXHRib29sIGRlcXVldWVfZGVmZXJyZWQ7XG4gXHRpbnQgcmV0ID0gMDtcbiBcbi1cdFZNX1dBUk5fT05fT05DRSghbWFwcGluZyBcdTAwMjZcdTAwMjYgZW5kKTtcbiYjNDM7XHQvKlxuJiM0MztcdCAqIFVubWFwL3JlbWFwIG5lZWRzIHRoZSBhbm9uX3ZtYS4gVGhlIGNhbGxlciBkb2VzIG5vdCBuZWNlc3NhcmlseVxuJiM0MztcdCAqIGhvbGQgYW4gbW1hcF9sb2NrIHRoYXQgd291bGQgcHJldmVudCB0aGUgYW5vbl92bWEgZnJvbVxuJiM0MztcdCAqIGRpc2FwcGVhcmluZywgc28gd2UgZmlyc3QgdGFrZSBhIHJlZmVyZW5jZSBhbmQgbG9jayBpdC4gVGhpcyBpc1xuJiM0MztcdCAqIHNpbWlsYXIgdG8gZm9saW9fbG9ja19hbm9uX3ZtYV9yZWFkKCkgZXhjZXB0IHRoZSB3cml0ZSBsb2NrIGlzXG4mIzQzO1x0ICogdGFrZW4gdG8gc2VyaWFsaXplIGFnYWluc3QgcGFyYWxsZWwgc3BsaXQgb3IgY29sbGFwc2UuXG4mIzQzO1x0ICovXG4mIzQzO1x0aWYgKGFub25fdW5tYXApIHtcbiYjNDM7XHRcdGFub25fdm1hID0gZm9saW9fZ2V0X2Fub25fdm1hKGZvbGlvKTtcbiYjNDM7XHRcdGlmICghYW5vbl92bWEpXG4mIzQzO1x0XHRcdHJldHVybiAtRUJVU1k7XG4mIzQzO1x0XHRhbm9uX3ZtYV9sb2NrX3dyaXRlKGFub25fdm1hKTtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdC8qIFJhY3kgY2hlY2sgaWYgd2UgY2FuIHNwbGl0IHRoZSBwYWdlLCBiZWZvcmUgdGhlIG9wdGlvbmFsIHVubWFwLiAqL1xuJiM0MztcdGlmIChmb2xpb19leHBlY3RlZF9yZWZfY291bnQoZm9saW8pICE9IGZvbGlvX3JlZl9jb3VudChmb2xpbykgLSAxKSB7XG4mIzQzO1x0XHRyZXQgPSAtRUFHQUlOO1xuJiM0MztcdFx0Z290byBvdXRfdW5sb2NrO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0aWYgKGFub25fdW5tYXApXG4mIzQzO1x0XHR1bm1hcF9mb2xpbyhmb2xpbyk7XG4mIzQzO1xuJiM0MztcdGxvY2FsX2lycV9kaXNhYmxlKCk7XG4mIzQzO1xuIFx0LypcbiBcdCAqIElmIHRoaXMgZm9saW8gY2FuIGJlIG9uIHRoZSBkZWZlcnJlZCBzcGxpdCBxdWV1ZSwgbG9jayBvdXRcbiBcdCAqIHRoZSBzaHJpbmtlciBiZWZvcmUgZnJlZXppbmcgdGhlIHJlZi4gSWYgdGhlIHNocmlua2VyIHNlZXNcbiBcdCAqIGEgMC1yZWYgZm9saW8sIGl0IGFzc3VtZXMgaXQgYmVhdCBmb2xpb19wdXQoKSB0byB0aGUgbGlzdFxuIFx0ICogbG9jayBhbmQgbXVzdCBjbGVhbiB1cCB0aGUgTFJVIHN0YXRlIC0gdGhlIHNhbWUgZGVxdWV1ZSB3ZVxuIFx0ICogd2lsbCBkbyBiZWxvdyBhcyBwYXJ0IG9mIHRoZSBzcGxpdC5cbiYjNDM7XHQgKlxuJiM0MztcdCAqIE9ubHkgYW5vbiBmb2xpb3MgYXJlIGV2ZXIgcXVldWVkIG9uIHRoZSBkZWZlcnJlZCBzcGxpdCBsaXN0LFxuJiM0MztcdCAqIHNvIG5vbi1hbm9uIGZvbGlvcyAobWFwcGluZ2xlc3Mgc3dhcGNhY2hlKSBuZXZlciBuZWVkIGRlcXVldWluZy5cbiBcdCAqL1xuLVx0ZGVxdWV1ZV9kZWZlcnJlZCA9IGZvbGlvX3Rlc3RfYW5vbihmb2xpbykgXHUwMDI2XHUwMDI2IG9sZF9vcmRlciBcdTAwM2UgMTtcbiYjNDM7XHRkZXF1ZXVlX2RlZmVycmVkID0gb2xkX29yZGVyIFx1MDAzZSAxIFx1MDAyNlx1MDAyNiBpc19hbm9uO1xuIFx0aWYgKGRlcXVldWVfZGVmZXJyZWQpIHtcbiBcdFx0c3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnO1xuIFxuQEAgLTM5NTIsMTI4ICYjNDM7Mzk4MywyNDMgQEAgc3RhdGljIGludCBfX2ZvbGlvX2ZyZWV6ZV9hbmRfc3BsaXRfdW5tYXBwZWQoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5cbiBcdFx0bHJ1ID0gbGlzdF9scnVfbG9jayhcdTAwMjZkZWZlcnJlZF9zcGxpdF9scnUsXG4gXHRcdFx0XHQgICAgZm9saW9fbmlkKGZvbGlvKSwgXHUwMDI2bWVtY2cpO1xuIFx0fVxuLVx0aWYgKGZvbGlvX3JlZl9mcmVlemUoZm9saW8sIGZvbGlvX2NhY2hlX3JlZl9jb3VudChmb2xpbykgJiM0MzsgMSkpIHtcbi1cdFx0c3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSA9IE5VTEw7XG4tXHRcdHN0cnVjdCBscnV2ZWMgKmxydXZlYztcbiBcbiYjNDM7XHRpZiAoIWZvbGlvX3JlZl9mcmVlemUoZm9saW8sIGZvbGlvX3N3YXBjYWNoZV9yZWZfY291bnQoZm9saW8pICYjNDM7IDEpKSB7XG4gXHRcdGlmIChkZXF1ZXVlX2RlZmVycmVkKSB7XG4tXHRcdFx0X19saXN0X2xydV9kZWwoXHUwMDI2ZGVmZXJyZWRfc3BsaXRfbHJ1LCBscnUsXG4tXHRcdFx0XHQgICAgICAgXHUwMDI2Zm9saW8tXHUwMDNlX2RlZmVycmVkX2xpc3QsIGZvbGlvX25pZChmb2xpbykpO1xuLVx0XHRcdGlmIChmb2xpb190ZXN0X3BhcnRpYWxseV9tYXBwZWQoZm9saW8pKSB7XG4tXHRcdFx0XHRmb2xpb19jbGVhcl9wYXJ0aWFsbHlfbWFwcGVkKGZvbGlvKTtcbi1cdFx0XHRcdG1vZF9tdGhwX3N0YXQob2xkX29yZGVyLFxuLVx0XHRcdFx0XHRNVEhQX1NUQVRfTlJfQU5PTl9QQVJUSUFMTFlfTUFQUEVELCAtMSk7XG4tXHRcdFx0fVxuIFx0XHRcdGxpc3RfbHJ1X3VubG9jayhscnUpO1xuIFx0XHRcdHJjdV9yZWFkX3VubG9jaygpO1xuIFx0XHR9XG4mIzQzO1x0XHRyZXQgPSAtRUFHQUlOO1xuJiM0MztcdFx0Z290byBvdXRfbm9fc3BsaXQ7XG4mIzQzO1x0fVxuIFxuLVx0XHRpZiAobWFwcGluZykge1xuLVx0XHRcdGludCBuciA9IGZvbGlvX25yX3BhZ2VzKGZvbGlvKTtcbi1cbi1cdFx0XHRpZiAoZm9saW9fdGVzdF9wbWRfbWFwcGFibGUoZm9saW8pIFx1MDAyNlx1MDAyNlxuLVx0XHRcdCAgICBuZXdfb3JkZXIgXHUwMDNjIEhQQUdFX1BNRF9PUkRFUikge1xuLVx0XHRcdFx0aWYgKGZvbGlvX3Rlc3Rfc3dhcGJhY2tlZChmb2xpbykpIHtcbi1cdFx0XHRcdFx0bHJ1dmVjX3N0YXRfbW9kX2ZvbGlvKGZvbGlvLFxuLVx0XHRcdFx0XHRcdFx0TlJfU0hNRU1fVEhQUywgLW5yKTtcbi1cdFx0XHRcdH0gZWxzZSB7XG4tXHRcdFx0XHRcdGxydXZlY19zdGF0X21vZF9mb2xpbyhmb2xpbyxcbi1cdFx0XHRcdFx0XHRcdE5SX0ZJTEVfVEhQUywgLW5yKTtcbi1cdFx0XHRcdH1cbi1cdFx0XHR9XG4mIzQzO1x0aWYgKGRlcXVldWVfZGVmZXJyZWQpIHtcbiYjNDM7XHRcdF9fbGlzdF9scnVfZGVsKFx1MDAyNmRlZmVycmVkX3NwbGl0X2xydSwgbHJ1LFxuJiM0MztcdFx0XHQgICAgICAgXHUwMDI2Zm9saW8tXHUwMDNlX2RlZmVycmVkX2xpc3QsIGZvbGlvX25pZChmb2xpbykpO1xuJiM0MztcdFx0aWYgKGZvbGlvX3Rlc3RfcGFydGlhbGx5X21hcHBlZChmb2xpbykpIHtcbiYjNDM7XHRcdFx0Zm9saW9fY2xlYXJfcGFydGlhbGx5X21hcHBlZChmb2xpbyk7XG4mIzQzO1x0XHRcdG1vZF9tdGhwX3N0YXQob2xkX29yZGVyLFxuJiM0MztcdFx0XHRcdCAgICAgIE1USFBfU1RBVF9OUl9BTk9OX1BBUlRJQUxMWV9NQVBQRUQsIC0xKTtcbiBcdFx0fVxuJiM0MztcdFx0bGlzdF9scnVfdW5sb2NrKGxydSk7XG4mIzQzO1x0XHRyY3VfcmVhZF91bmxvY2soKTtcbiYjNDM7XHR9XG4gXG4tXHRcdGlmIChmb2xpb190ZXN0X3N3YXBjYWNoZShmb2xpbykpIHtcbi1cdFx0XHRpZiAobWFwcGluZykge1xuLVx0XHRcdFx0Vk1fV0FSTl9PTl9PTkNFX0ZPTElPKG1hcHBpbmcsIGZvbGlvKTtcbi1cdFx0XHRcdHJldHVybiAtRUlOVkFMO1xuLVx0XHRcdH1cbiYjNDM7XHRpZiAoZm9saW9fdGVzdF9zd2FwY2FjaGUoZm9saW8pKVxuJiM0MztcdFx0Y2kgPSBzd2FwX2NsdXN0ZXJfZ2V0X2FuZF9sb2NrKGZvbGlvKTtcbiBcbi1cdFx0XHRjaSA9IHN3YXBfY2x1c3Rlcl9nZXRfYW5kX2xvY2soZm9saW8pO1xuLVx0XHR9XG4mIzQzO1x0aWYgKGRvX2xydSlcbiYjNDM7XHRcdGxydXZlYyA9IGZvbGlvX2xydXZlY19sb2NrKGZvbGlvKTtcbiYjNDM7XG4mIzQzO1x0cmV0ID0gX19zcGxpdF91bm1hcHBlZF9mb2xpbyhmb2xpbywgbmV3X29yZGVyLCBzcGxpdF9hdCwgTlVMTCxcbiYjNDM7XHRcdFx0XHQgICAgIE5VTEwsIHNwbGl0X3R5cGUpO1xuIFxuLVx0XHQvKiBsb2NrIGxydSBsaXN0L1BhZ2VDb21wb3VuZCwgcmVmIGZyb3plbiBieSBwYWdlX3JlZl9mcmVlemUgKi9cbiYjNDM7XHQvKlxuJiM0MztcdCAqIFVuZnJlZXplIHRoZSBhZnRlci1zcGxpdCBmb2xpb3MgYW5kIHB1dCB0aGVtIGJhY2sgdG8gdGhlIHJpZ2h0XG4mIzQzO1x0ICogcGxhY2UsIGtlZXBpbmcgdGhlIGhlYWQgQGZvbGlvIGZyb3plbiB1bnRpbCB0aGUgZW5kLiBXaGlsZSB0aGVcbiYjNDM7XHQgKiBmb2xpbyBpcyBpbiB0aGUgc3dhcCBjYWNoZSwgdGhlIHN1YiBlbnRyaWVzIG11c3QgYmUgdXBkYXRlZCB3aXRoXG4mIzQzO1x0ICogdGhlaXIgYWZ0ZXItc3BsaXQgZm9saW9zIGJlZm9yZSB0aGUgaGVhZCBpcyB1bmZyb3plbiwgc28gYVxuJiM0MztcdCAqIGNvbmN1cnJlbnQgc3dhcF9jYWNoZV9nZXRfZm9saW8oKSBjYW5ub3QgcmV0dXJuIHRoZSBoZWFkIGZvbGlvXG4mIzQzO1x0ICogZm9yIGEgc3ViIGVudHJ5LiBLZWVwaW5nIHRoZSBoZWFkIGZyb3plbiB0aHJvdWdob3V0IGFsc28gc3RvcHMgYVxuJiM0MztcdCAqIHBhcmFsbGVsIGZvbGlvX3RyeV9nZXQoKSBmcm9tIG9ic2VydmluZyBhIHBhcnRpYWxseSBzcGxpdCBmb2xpby5cbiYjNDM7XHQgKi9cbiYjNDM7XHRmb3IgKG5ld19mb2xpbyA9IGZvbGlvX25leHQoZm9saW8pOyBuZXdfZm9saW8gIT0gZW5kX2ZvbGlvO1xuJiM0MztcdCAgICAgbmV3X2ZvbGlvID0gZm9saW9fbmV4dChuZXdfZm9saW8pKSB7XG4mIzQzO1x0XHR6b25lX2RldmljZV9wcml2YXRlX3NwbGl0X2NiKGZvbGlvLCBuZXdfZm9saW8pO1xuJiM0MztcdFx0Zm9saW9fcmVmX3VuZnJlZXplKG5ld19mb2xpbyxcbiYjNDM7XHRcdFx0XHQgICBmb2xpb19zd2FwY2FjaGVfcmVmX2NvdW50KG5ld19mb2xpbykgJiM0MzsgMSk7XG4gXHRcdGlmIChkb19scnUpXG4tXHRcdFx0bHJ1dmVjID0gZm9saW9fbHJ1dmVjX2xvY2soZm9saW8pO1xuJiM0MztcdFx0XHRscnVfYWRkX3NwbGl0X2ZvbGlvKGZvbGlvLCBuZXdfZm9saW8sIGxydXZlYywgbGlzdCk7XG4mIzQzO1x0XHRpZiAoY2kpXG4mIzQzO1x0XHRcdF9fc3dhcF9jYWNoZV9yZXBsYWNlX2ZvbGlvKGNpLCBmb2xpbywgbmV3X2ZvbGlvKTtcbiYjNDM7XHR9XG4gXG4tXHRcdHJldCA9IF9fc3BsaXRfdW5tYXBwZWRfZm9saW8oZm9saW8sIG5ld19vcmRlciwgc3BsaXRfYXQsIHhhcyxcbi1cdFx0XHRcdFx0ICAgICBtYXBwaW5nLCBzcGxpdF90eXBlKTtcbiYjNDM7XHR6b25lX2RldmljZV9wcml2YXRlX3NwbGl0X2NiKGZvbGlvLCBOVUxMKTtcbiYjNDM7XHRmb2xpb19yZWZfdW5mcmVlemUoZm9saW8sIGZvbGlvX3N3YXBjYWNoZV9yZWZfY291bnQoZm9saW8pICYjNDM7IDEpO1xuIFxuLVx0XHQvKlxuLVx0XHQgKiBVbmZyZWV6ZSBhZnRlci1zcGxpdCBmb2xpb3MgYW5kIHB1dCB0aGVtIGJhY2sgdG8gdGhlIHJpZ2h0XG4tXHRcdCAqIGxpc3QuIEBmb2xpbyBzaG91bGQgYmUga2VwdCBmcm96b24gdW50aWwgcGFnZSBjYWNoZVxuLVx0XHQgKiBlbnRyaWVzIGFyZSB1cGRhdGVkIHdpdGggYWxsIHRoZSBvdGhlciBhZnRlci1zcGxpdCBmb2xpb3Ncbi1cdFx0ICogdG8gcHJldmVudCBvdGhlcnMgc2VlaW5nIHN0YWxlIHBhZ2UgY2FjaGUgZW50cmllcy5cbi1cdFx0ICogQXMgYSByZXN1bHQsIG5ld19mb2xpbyBzdGFydHMgZnJvbSB0aGUgbmV4dCBmb2xpbyBvZlxuLVx0XHQgKiBAZm9saW8uXG4tXHRcdCAqL1xuLVx0XHRmb3IgKG5ld19mb2xpbyA9IGZvbGlvX25leHQoZm9saW8pOyBuZXdfZm9saW8gIT0gZW5kX2ZvbGlvO1xuLVx0XHQgICAgIG5ld19mb2xpbyA9IG5leHQpIHtcbi1cdFx0XHR1bnNpZ25lZCBsb25nIG5yX3BhZ2VzID0gZm9saW9fbnJfcGFnZXMobmV3X2ZvbGlvKTtcbiYjNDM7XHRpZiAoZG9fbHJ1KVxuJiM0MztcdFx0bHJ1dmVjX3VubG9jayhscnV2ZWMpO1xuJiM0MztcdGlmIChjaSlcbiYjNDM7XHRcdHN3YXBfY2x1c3Rlcl91bmxvY2soY2kpO1xuJiM0MztvdXRfbm9fc3BsaXQ6XG4mIzQzO1x0bG9jYWxfaXJxX2VuYWJsZSgpO1xuJiM0MztcdGlmIChhbm9uX3VubWFwKSB7XG4mIzQzO1x0XHRpZiAoIXJldCBcdTAwMjZcdTAwMjYgIWZvbGlvX2lzX2RldmljZV9wcml2YXRlKGZvbGlvKSlcbiYjNDM7XHRcdFx0dHR1X2ZsYWdzID0gVFRVX1VTRV9TSEFSRURfWkVST1BBR0U7XG4mIzQzO1x0XHRyZW1hcF9wYWdlKGZvbGlvLCAxIFx1MDAzY1x1MDAzYyBvbGRfb3JkZXIsIHR0dV9mbGFncyk7XG4mIzQzO1x0fVxuJiM0MztvdXRfdW5sb2NrOlxuJiM0MztcdGlmIChhbm9uX3VubWFwKSB7XG4mIzQzO1x0XHRhbm9uX3ZtYV91bmxvY2tfd3JpdGUoYW5vbl92bWEpO1xuJiM0MztcdFx0cHV0X2Fub25fdm1hKGFub25fdm1hKTtcbiYjNDM7XHR9XG4gXG4tXHRcdFx0bmV4dCA9IGZvbGlvX25leHQobmV3X2ZvbGlvKTtcbiYjNDM7XHRyZXR1cm4gcmV0O1xuJiM0Mzt9XG4gXG4tXHRcdFx0em9uZV9kZXZpY2VfcHJpdmF0ZV9zcGxpdF9jYihmb2xpbywgbmV3X2ZvbGlvKTtcbiYjNDM7c3RhdGljIGludCBfX2ZvbGlvX2ZyZWV6ZV9zcGxpdF91bm1hcF9maWxlKHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIsXG4mIzQzO1x0XHRcdFx0XHQgICBzdHJ1Y3QgcGFnZSAqc3BsaXRfYXQsIGJvb2wgZG9fbHJ1LFxuJiM0MztcdFx0XHRcdFx0ICAgc3RydWN0IGxpc3RfaGVhZCAqbGlzdCwgZW51bSBzcGxpdF90eXBlIHNwbGl0X3R5cGUpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyA9IGZvbGlvLVx1MDAzZW1hcHBpbmc7XG4mIzQzO1x0WEFfU1RBVEUoeGFzLCBcdTAwMjZtYXBwaW5nLVx1MDAzZWlfcGFnZXMsIGZvbGlvLVx1MDAzZWluZGV4KTtcbiYjNDM7XHRzdHJ1Y3QgZm9saW8gKmVuZF9mb2xpbyA9IGZvbGlvX25leHQoZm9saW8pO1xuJiM0MztcdGxvbmcgb2xkX25yX3BhZ2VzID0gZm9saW9fbnJfcGFnZXMoZm9saW8pO1xuJiM0MztcdHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZywgKm9sZF9tZW1jZztcbiYjNDM7XHRzdHJ1Y3QgZm9saW8gKm5ld19mb2xpbywgKm5leHQ7XG4mIzQzO1x0aW50IG5yX3NobWVtX2Ryb3BwZWQgPSAwO1xuJiM0MztcdHVuc2lnbmVkIGludCBtaW5fb3JkZXI7XG4mIzQzO1x0c3RydWN0IGxydXZlYyAqbHJ1dmVjO1xuJiM0MztcdHBnb2ZmX3QgZW5kID0gMDtcbiYjNDM7XHRnZnBfdCBnZnA7XG4mIzQzO1x0aW50IHJldCA9IDA7XG4gXG4tXHRcdFx0Zm9saW9fcmVmX3VuZnJlZXplKG5ld19mb2xpbyxcbi1cdFx0XHRcdFx0ICAgZm9saW9fY2FjaGVfcmVmX2NvdW50KG5ld19mb2xpbykgJiM0MzsgMSk7XG4mIzQzO1x0bWluX29yZGVyID0gbWFwcGluZ19taW5fZm9saW9fb3JkZXIobWFwcGluZyk7XG4mIzQzO1x0aWYgKG5ld19vcmRlciBcdTAwM2MgbWluX29yZGVyKVxuJiM0MztcdFx0cmV0dXJuIC1FSU5WQUw7XG4gXG4tXHRcdFx0aWYgKGRvX2xydSlcbi1cdFx0XHRcdGxydV9hZGRfc3BsaXRfZm9saW8oZm9saW8sIG5ld19mb2xpbywgbHJ1dmVjLCBsaXN0KTtcbiYjNDM7XHQvKlxuJiM0MztcdCAqIFN3aXRjaCB0byBmb2xpbyYjMzk7cyBtZW1jZyBhcyB4YXJyYXkgbm9kZSBhbGxvY2F0aW9uIGNhbiBoYXBwZW4gYW5kXG4mIzQzO1x0ICogbmVlZHMgdG8gY2hhcmdlIHRvIGl0LlxuJiM0MztcdCAqL1xuJiM0MztcdG1lbWNnID0gZ2V0X21lbV9jZ3JvdXBfZnJvbV9mb2xpbyhmb2xpbyk7XG4mIzQzO1x0b2xkX21lbWNnID0gc2V0X2FjdGl2ZV9tZW1jZyhtZW1jZyk7XG4gXG4tXHRcdFx0Lypcbi1cdFx0XHQgKiBBbm9ueW1vdXMgZm9saW8gd2l0aCBzd2FwIGNhY2hlLlxuLVx0XHRcdCAqIE5PVEU6IHNobWVtIGluIHN3YXAgY2FjaGUgaXMgbm90IHN1cHBvcnRlZCB5ZXQuXG4tXHRcdFx0ICovXG4tXHRcdFx0aWYgKGNpKSB7XG4tXHRcdFx0XHRfX3N3YXBfY2FjaGVfcmVwbGFjZV9mb2xpbyhjaSwgZm9saW8sIG5ld19mb2xpbyk7XG4tXHRcdFx0XHRjb250aW51ZTtcbi1cdFx0XHR9XG4mIzQzO1x0Z2ZwID0gY3VycmVudF9nZnBfY29udGV4dChtYXBwaW5nX2dmcF9tYXNrKG1hcHBpbmcpIFx1MDAyNiBHRlBfUkVDTEFJTV9NQVNLKTtcbiYjNDM7XHRpZiAoIWZpbGVtYXBfcmVsZWFzZV9mb2xpbyhmb2xpbywgZ2ZwKSkge1xuJiM0MztcdFx0cmV0ID0gLUVCVVNZO1xuJiM0MztcdFx0Z290byBmYWlsX2ZyZWU7XG4mIzQzO1x0fVxuIFxuLVx0XHRcdC8qIEFub255bW91cyBmb2xpbyB3aXRob3V0IHN3YXAgY2FjaGUgKi9cbi1cdFx0XHRpZiAoIW1hcHBpbmcpXG4tXHRcdFx0XHRjb250aW51ZTtcbiYjNDM7XHRtYXBwaW5nX3NldF91cGRhdGUoXHUwMDI2eGFzLCBtYXBwaW5nKTtcbiBcbi1cdFx0XHQvKiBBZGQgdGhlIG5ldyBmb2xpbyB0byB0aGUgcGFnZSBjYWNoZS4gKi9cbi1cdFx0XHRpZiAobmV3X2ZvbGlvLVx1MDAzZWluZGV4IFx1MDAzYyBlbmQpIHtcbi1cdFx0XHRcdF9feGFfc3RvcmUoXHUwMDI2bWFwcGluZy1cdTAwM2VpX3BhZ2VzLCBuZXdfZm9saW8tXHUwMDNlaW5kZXgsXG4tXHRcdFx0XHRcdCAgIG5ld19mb2xpbywgMCk7XG4tXHRcdFx0XHRjb250aW51ZTtcbi1cdFx0XHR9XG4mIzQzO1x0aWYgKHNwbGl0X3R5cGUgPT0gU1BMSVRfVFlQRV9VTklGT1JNKSB7XG4mIzQzO1x0XHRpbnQgb2xkX29yZGVyID0gZm9saW9fb3JkZXIoZm9saW8pO1xuIFxuLVx0XHRcdFZNX1dBUk5fT05fT05DRSghbnJfc2htZW1fZHJvcHBlZCk7XG4tXHRcdFx0LyogRHJvcCBmb2xpbyBiZXlvbmQgRU9GOiAtXHUwMDNlaW5kZXggXHUwMDNlPSBlbmQgKi9cbi1cdFx0XHRpZiAoc2htZW1fbWFwcGluZyhtYXBwaW5nKSBcdTAwMjZcdTAwMjYgbnJfc2htZW1fZHJvcHBlZClcbi1cdFx0XHRcdCpucl9zaG1lbV9kcm9wcGVkICYjNDM7PSBucl9wYWdlcztcbi1cdFx0XHRlbHNlIGlmIChmb2xpb190ZXN0X2NsZWFyX2RpcnR5KG5ld19mb2xpbykpXG4tXHRcdFx0XHRmb2xpb19hY2NvdW50X2NsZWFuZWQoXG4tXHRcdFx0XHRcdG5ld19mb2xpbywgaW5vZGVfdG9fd2IobWFwcGluZy1cdTAwM2Vob3N0KSk7XG4tXHRcdFx0X19maWxlbWFwX3JlbW92ZV9mb2xpbyhuZXdfZm9saW8sIE5VTEwpO1xuLVx0XHRcdGZvbGlvX3B1dF9yZWZzKG5ld19mb2xpbywgbnJfcGFnZXMpO1xuJiM0MztcdFx0eGFzX3NldF9vcmRlcihcdTAwMjZ4YXMsIGZvbGlvLVx1MDAzZWluZGV4LCBuZXdfb3JkZXIpO1xuJiM0MztcdFx0eGFzX3NwbGl0X2FsbG9jKFx1MDAyNnhhcywgZm9saW8sIG9sZF9vcmRlciwgZ2ZwKTtcbiYjNDM7XHRcdGlmICh4YXNfZXJyb3IoXHUwMDI2eGFzKSkge1xuJiM0MztcdFx0XHRyZXQgPSB4YXNfZXJyb3IoXHUwMDI2eGFzKTtcbiYjNDM7XHRcdFx0Z290byBmYWlsX2ZyZWU7XG4gXHRcdH1cbiYjNDM7XHR9XG4gXG4tXHRcdHpvbmVfZGV2aWNlX3ByaXZhdGVfc3BsaXRfY2IoZm9saW8sIE5VTEwpO1xuLVx0XHQvKlxuLVx0XHQgKiBVbmZyZWV6ZSBAZm9saW8gb25seSBhZnRlciBhbGwgcGFnZSBjYWNoZSBlbnRyaWVzLCB3aGljaFxuLVx0XHQgKiB1c2VkIHRvIHBvaW50IHRvIGl0LCBoYXZlIGJlZW4gdXBkYXRlZCB3aXRoIG5ldyBmb2xpb3MuXG4tXHRcdCAqIE90aGVyd2lzZSwgYSBwYXJhbGxlbCBmb2xpb190cnlfZ2V0KCkgY2FuIGdyYWIgQGZvbGlvXG4tXHRcdCAqIGFuZCBpdHMgY2FsbGVyIGNhbiBzZWUgc3RhbGUgcGFnZSBjYWNoZSBlbnRyaWVzLlxuLVx0XHQgKi9cbi1cdFx0Zm9saW9fcmVmX3VuZnJlZXplKGZvbGlvLCBmb2xpb19jYWNoZV9yZWZfY291bnQoZm9saW8pICYjNDM7IDEpO1xuJiM0MztcdGlfbW1hcF9sb2NrX3JlYWQobWFwcGluZyk7XG4mIzQzO1xuJiM0MztcdC8qIFJhY3kgY2hlY2sgaWYgd2UgY2FuIHNwbGl0IHRoZSBwYWdlLCBiZWZvcmUgdW5tYXBfZm9saW8oKSAqL1xuJiM0MztcdGlmIChmb2xpb19leHBlY3RlZF9yZWZfY291bnQoZm9saW8pICE9IGZvbGlvX3JlZl9jb3VudChmb2xpbykgLSAxKSB7XG4mIzQzO1x0XHRyZXQgPSAtRUFHQUlOO1xuJiM0MztcdFx0Z290byBmYWlsX21tYXBfdW5sb2NrO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0LypcbiYjNDM7XHQgKl9fc3BsaXRfdW5tYXBwZWRfZm9saW8oKSBtYXkgbmVlZCB0byB0cmltIG9mZiBwYWdlcyBiZXlvbmRcbiYjNDM7XHQgKiBFT0Y6IGJ1dCBvbiAzMi1iaXQsIGlfc2l6ZV9yZWFkKCkgdGFrZXMgYW4gaXJxLXVuc2FmZVxuJiM0MztcdCAqIHNlcWxvY2ssIHdoaWNoIGNhbm5vdCBiZSBuZXN0ZWQgaW5zaWRlIHRoZSBwYWdlIHRyZWUgbG9jay5cbiYjNDM7XHQgKiBTbyBub3RlIGVuZCBub3c6IGlfc2l6ZSBpdHNlbGYgbWF5IGJlIGNoYW5nZWQgYXQgYW55IG1vbWVudCxcbiYjNDM7XHQgKiBidXQgZm9saW8gbG9jayBpcyBnb29kIGVub3VnaCB0byBzZXJpYWxpemUgdGhlIHRyaW1taW5nLlxuJiM0MztcdCAqL1xuJiM0MztcdGVuZCA9IERJVl9ST1VORF9VUChpX3NpemVfcmVhZChtYXBwaW5nLVx1MDAzZWhvc3QpLCBQQUdFX1NJWkUpO1xuJiM0MztcdGlmIChzaG1lbV9tYXBwaW5nKG1hcHBpbmcpKVxuJiM0MztcdFx0ZW5kID0gc2htZW1fZmFsbG9jZW5kKG1hcHBpbmctXHUwMDNlaG9zdCwgZW5kKTtcbiYjNDM7XG4mIzQzO1x0dW5tYXBfZm9saW8oZm9saW8pO1xuJiM0MztcbiYjNDM7XHR4YXNfbG9ja19pcnEoXHUwMDI2eGFzKTtcbiYjNDM7XG4mIzQzO1x0LypcbiYjNDM7XHQgKiBDaGVjayBpZiB0aGUgZm9saW8gaXMgcHJlc2VudCBpbiBwYWdlIGNhY2hlLlxuJiM0MztcdCAqIFdlIGFzc3VtZSBhbGwgdGFpbCBhcmUgcHJlc2VudCB0b28sIGlmIGZvbGlvIGlzIHRoZXJlLlxuJiM0MztcdCAqL1xuJiM0MztcdGlmICh4YXNfbG9hZChcdTAwMjZ4YXMpICE9IGZvbGlvKSB7XG4mIzQzO1x0XHRyZXQgPSAtRUFHQUlOO1xuJiM0MztcdFx0Z290byBmYWlsO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0aWYgKCFmb2xpb19yZWZfZnJlZXplKGZvbGlvLCBvbGRfbnJfcGFnZXMgJiM0MzsgMSkpIHtcbiYjNDM7XHRcdHJldCA9IC1FQUdBSU47XG4mIzQzO1x0XHRnb3RvIGZhaWw7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRpZiAoZm9saW9fdGVzdF9wbWRfbWFwcGFibGUoZm9saW8pIFx1MDAyNlx1MDAyNiBuZXdfb3JkZXIgXHUwMDNjIEhQQUdFX1BNRF9PUkRFUikge1xuJiM0MztcdFx0aWYgKGZvbGlvX3Rlc3Rfc3dhcGJhY2tlZChmb2xpbykpXG4mIzQzO1x0XHRcdGxydXZlY19zdGF0X21vZF9mb2xpbyhmb2xpbywgTlJfU0hNRU1fVEhQUywgLW9sZF9ucl9wYWdlcyk7XG4mIzQzO1x0XHRlbHNlXG4mIzQzO1x0XHRcdGxydXZlY19zdGF0X21vZF9mb2xpbyhmb2xpbywgTlJfRklMRV9USFBTLCAtb2xkX25yX3BhZ2VzKTtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdC8qIGxvY2sgbHJ1IGxpc3QvUGFnZUNvbXBvdW5kLCByZWYgZnJvemVuIGJ5IHBhZ2VfcmVmX2ZyZWV6ZSAqL1xuJiM0MztcdGlmIChkb19scnUpXG4mIzQzO1x0XHRscnV2ZWMgPSBmb2xpb19scnV2ZWNfbG9jayhmb2xpbyk7XG4mIzQzO1xuJiM0MztcdHJldCA9IF9fc3BsaXRfdW5tYXBwZWRfZm9saW8oZm9saW8sIG5ld19vcmRlciwgc3BsaXRfYXQsIFx1MDAyNnhhcyxcbiYjNDM7XHRcdFx0XHQgICAgIG1hcHBpbmcsIHNwbGl0X3R5cGUpO1xuJiM0MztcbiYjNDM7XHQvKlxuJiM0MztcdCAqIFVuZnJlZXplIGFmdGVyLXNwbGl0IGZvbGlvcyBhbmQgcHV0IHRoZW0gYmFjayB0byB0aGUgcmlnaHRcbiYjNDM7XHQgKiBsaXN0LiBAZm9saW8gc2hvdWxkIGJlIGtlcHQgZnJvemVuIHVudGlsIHBhZ2UgY2FjaGVcbiYjNDM7XHQgKiBlbnRyaWVzIGFyZSB1cGRhdGVkIHdpdGggYWxsIHRoZSBvdGhlciBhZnRlci1zcGxpdCBmb2xpb3NcbiYjNDM7XHQgKiB0byBwcmV2ZW50IG90aGVycyBzZWVpbmcgc3RhbGUgcGFnZSBjYWNoZSBlbnRyaWVzLlxuJiM0MztcdCAqIEFzIGEgcmVzdWx0LCBuZXdfZm9saW8gc3RhcnRzIGZyb20gdGhlIG5leHQgZm9saW8gb2ZcbiYjNDM7XHQgKiBAZm9saW8uXG4mIzQzO1x0ICovXG4mIzQzO1x0Zm9yIChuZXdfZm9saW8gPSBmb2xpb19uZXh0KGZvbGlvKTsgbmV3X2ZvbGlvICE9IGVuZF9mb2xpbztcbiYjNDM7XHQgICAgIG5ld19mb2xpbyA9IG5leHQpIHtcbiYjNDM7XHRcdHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMgPSBmb2xpb19ucl9wYWdlcyhuZXdfZm9saW8pO1xuJiM0MztcbiYjNDM7XHRcdG5leHQgPSBmb2xpb19uZXh0KG5ld19mb2xpbyk7XG4mIzQzO1xuJiM0MztcdFx0Zm9saW9fcmVmX3VuZnJlZXplKG5ld19mb2xpbyxcbiYjNDM7XHRcdFx0XHQgICBmb2xpb19ucl9wYWdlcyhuZXdfZm9saW8pICYjNDM7IDEpO1xuIFxuIFx0XHRpZiAoZG9fbHJ1KVxuLVx0XHRcdGxydXZlY191bmxvY2sobHJ1dmVjKTtcbiYjNDM7XHRcdFx0bHJ1X2FkZF9zcGxpdF9mb2xpbyhmb2xpbywgbmV3X2ZvbGlvLCBscnV2ZWMsIGxpc3QpO1xuIFxuLVx0XHRpZiAoY2kpXG4tXHRcdFx0c3dhcF9jbHVzdGVyX3VubG9jayhjaSk7XG4tXHR9IGVsc2Uge1xuLVx0XHRpZiAoZGVxdWV1ZV9kZWZlcnJlZCkge1xuLVx0XHRcdGxpc3RfbHJ1X3VubG9jayhscnUpO1xuLVx0XHRcdHJjdV9yZWFkX3VubG9jaygpO1xuJiM0MztcdFx0LyogQWRkIHRoZSBuZXcgZm9saW8gdG8gdGhlIHBhZ2UgY2FjaGUuICovXG4mIzQzO1x0XHRpZiAobmV3X2ZvbGlvLVx1MDAzZWluZGV4IFx1MDAzYyBlbmQpIHtcbiYjNDM7XHRcdFx0X194YV9zdG9yZShcdTAwMjZtYXBwaW5nLVx1MDAzZWlfcGFnZXMsIG5ld19mb2xpby1cdTAwM2VpbmRleCxcbiYjNDM7XHRcdFx0XHQgICBuZXdfZm9saW8sIDApO1xuJiM0MztcdFx0XHRjb250aW51ZTtcbiBcdFx0fVxuLVx0XHRyZXR1cm4gLUVBR0FJTjtcbiYjNDM7XG4mIzQzO1x0XHQvKiBEcm9wIGZvbGlvIGJleW9uZCBFT0Y6IC1cdTAwM2VpbmRleCBcdTAwM2U9IGVuZCAqL1xuJiM0MztcdFx0aWYgKHNobWVtX21hcHBpbmcobWFwcGluZykpXG4mIzQzO1x0XHRcdG5yX3NobWVtX2Ryb3BwZWQgJiM0Mzs9IG5yX3BhZ2VzO1xuJiM0MztcdFx0ZWxzZSBpZiAoZm9saW9fdGVzdF9jbGVhcl9kaXJ0eShuZXdfZm9saW8pKVxuJiM0MztcdFx0XHRmb2xpb19hY2NvdW50X2NsZWFuZWQobmV3X2ZvbGlvLFxuJiM0MztcdFx0XHRcdFx0ICAgICAgaW5vZGVfdG9fd2IobWFwcGluZy1cdTAwM2Vob3N0KSk7XG4mIzQzO1x0XHRfX2ZpbGVtYXBfcmVtb3ZlX2ZvbGlvKG5ld19mb2xpbywgTlVMTCk7XG4mIzQzO1x0XHRmb2xpb19wdXRfcmVmcyhuZXdfZm9saW8sIG5yX3BhZ2VzKTtcbiBcdH1cbiBcbiYjNDM7XHQvKlxuJiM0MztcdCAqIFVuZnJlZXplIEBmb2xpbyBvbmx5IGFmdGVyIGFsbCBwYWdlIGNhY2hlIGVudHJpZXMsIHdoaWNoXG4mIzQzO1x0ICogdXNlZCB0byBwb2ludCB0byBpdCwgaGF2ZSBiZWVuIHVwZGF0ZWQgd2l0aCBuZXcgZm9saW9zLlxuJiM0MztcdCAqIE90aGVyd2lzZSwgYSBwYXJhbGxlbCBmb2xpb190cnlfZ2V0KCkgY2FuIGdyYWIgQGZvbGlvXG4mIzQzO1x0ICogYW5kIGl0cyBjYWxsZXIgY2FuIHNlZSBzdGFsZSBwYWdlIGNhY2hlIGVudHJpZXMuXG4mIzQzO1x0ICovXG4mIzQzO1x0Zm9saW9fcmVmX3VuZnJlZXplKGZvbGlvLCBmb2xpb19ucl9wYWdlcyhmb2xpbykgJiM0MzsgMSk7XG4mIzQzO1xuJiM0MztcdGlmIChkb19scnUpXG4mIzQzO1x0XHRscnV2ZWNfdW5sb2NrKGxydXZlYyk7XG4mIzQzO1xuJiM0MztmYWlsOlxuJiM0MztcdHhhc191bmxvY2tfaXJxKFx1MDAyNnhhcyk7XG4mIzQzO2ZhaWxfbW1hcF91bmxvY2s6XG4mIzQzO1x0aWYgKG5yX3NobWVtX2Ryb3BwZWQpXG4mIzQzO1x0XHRzaG1lbV91bmNoYXJnZShtYXBwaW5nLVx1MDAzZWhvc3QsIG5yX3NobWVtX2Ryb3BwZWQpO1xuJiM0MztcdC8qXG4mIzQzO1x0ICogRHJvcCB0aGUgbWFwcGluZyB3aGlsZSB0aGUgaW5vZGUgaXMgc3RpbGwgcGlubmVkLiBAZm9saW8gc3RheXNcbiYjNDM7XHQgKiBsb2NrZWQgYW5kIHByZXNlbnQgaW4gdGhlIHBhZ2UgY2FjaGUsIHNvIGV2aWN0aW9uIGNhbm5vdCBmcmVlXG4mIzQzO1x0ICogdGhlIGlub2RlIHlldCwgbm90aGluZyBwYXN0IHRoaXMgcG9pbnQgbWF5IHRvdWNoIHRoZSBpbm9kZSBvclxuJiM0MztcdCAqIHRoZSBtYXBwaW5nLlxuJiM0MztcdCAqL1xuJiM0MztcdGlfbW1hcF91bmxvY2tfcmVhZChtYXBwaW5nKTtcbiYjNDM7ZmFpbF9mcmVlOlxuJiM0MztcdC8qIFJlc3RvcmUgdGhlIHByZXZpb3VzbHkgYWN0aXZlIG1lbWNnICovXG4mIzQzO1x0c2V0X2FjdGl2ZV9tZW1jZyhvbGRfbWVtY2cpO1xuJiM0MztcdG1lbV9jZ3JvdXBfcHV0KG1lbWNnKTtcbiYjNDM7XHR4YXNfZGVzdHJveShcdTAwMjZ4YXMpO1xuIFx0cmV0dXJuIHJldDtcbiB9XG4gXG5AQCAtNDEwMiwxNyAmIzQzOzQyNDgsMTEgQEAgc3RhdGljIGludCBfX2ZvbGlvX3NwbGl0KHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIsXG4gXHRcdHN0cnVjdCBwYWdlICpzcGxpdF9hdCwgc3RydWN0IHBhZ2UgKmxvY2tfYXQsXG4gXHRcdHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QsIGVudW0gc3BsaXRfdHlwZSBzcGxpdF90eXBlKVxuIHtcbi1cdFhBX1NUQVRFKHhhcywgXHUwMDI2Zm9saW8tXHUwMDNlbWFwcGluZy1cdTAwM2VpX3BhZ2VzLCBmb2xpby1cdTAwM2VpbmRleCk7XG4mIzQzO1x0Ym9vbCBpc19zd2FwY2FjaGUgPSBmb2xpb190ZXN0X3N3YXBjYWNoZShmb2xpbyk7XG4gXHRzdHJ1Y3QgZm9saW8gKmVuZF9mb2xpbyA9IGZvbGlvX25leHQoZm9saW8pO1xuIFx0Ym9vbCBpc19hbm9uID0gZm9saW9fdGVzdF9hbm9uKGZvbGlvKTtcbi1cdHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZywgKm9sZF9tZW1jZztcbi1cdHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nID0gTlVMTDtcbi1cdHN0cnVjdCBhbm9uX3ZtYSAqYW5vbl92bWEgPSBOVUxMO1xuIFx0aW50IG9sZF9vcmRlciA9IGZvbGlvX29yZGVyKGZvbGlvKTtcbiBcdHN0cnVjdCBmb2xpbyAqbmV3X2ZvbGlvLCAqbmV4dDtcbi1cdGludCBucl9zaG1lbV9kcm9wcGVkID0gMDtcbi1cdGVudW0gdHR1X2ZsYWdzIHR0dV9mbGFncyA9IDA7XG4tXHRwZ29mZl90IGVuZCA9IDA7XG4gXHRpbnQgcmV0O1xuIFxuIFx0Vk1fV0FSTl9PTl9PTkNFX0ZPTElPKCFmb2xpb190ZXN0X2xvY2tlZChmb2xpbyksIGZvbGlvKTtcbkBAIC00MTIwLDE0MSAmIzQzOzQyNjAsMjkgQEAgc3RhdGljIGludCBfX2ZvbGlvX3NwbGl0KHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIsXG4gXG4gXHRpZiAoZm9saW8gIT0gcGFnZV9mb2xpbyhzcGxpdF9hdCkgfHwgZm9saW8gIT0gcGFnZV9mb2xpbyhsb2NrX2F0KSkge1xuIFx0XHRyZXQgPSAtRUlOVkFMO1xuLVx0XHRnb3RvIG91dF9ub19tZW1jZztcbiYjNDM7XHRcdGdvdG8gb3V0O1xuIFx0fVxuIFxuIFx0aWYgKG5ld19vcmRlciBcdTAwM2U9IG9sZF9vcmRlcikge1xuIFx0XHRyZXQgPSAtRUlOVkFMO1xuLVx0XHRnb3RvIG91dF9ub19tZW1jZztcbiYjNDM7XHRcdGdvdG8gb3V0O1xuIFx0fVxuIFxuIFx0cmV0ID0gZm9saW9fY2hlY2tfc3BsaXR0YWJsZShmb2xpbywgbmV3X29yZGVyLCBzcGxpdF90eXBlKTtcbiBcdGlmIChyZXQpIHtcbiBcdFx0Vk1fV0FSTl9PTkNFKHJldCA9PSAtRUlOVkFMLCBcJiMzNDtUcmllZCB0byBzcGxpdCBhbiB1bnNwbGl0dGFibGUgZm9saW9cJiMzNDspO1xuLVx0XHRnb3RvIG91dF9ub19tZW1jZztcbi1cdH1cbi1cbi1cdC8qXG4tXHQgKiBzd2l0Y2ggdG8gZm9saW8mIzM5O3MgbWVtY2cgYXMgeGFycmF5IG5vZGUgYWxsb2NhdGlvbiBjYW4gaGFwcGVuIGFuZFxuLVx0ICogbmVlZHMgdG8gY2hhcmdlIHRvIGl0LlxuLVx0ICovXG4tXHRtZW1jZyA9IGdldF9tZW1fY2dyb3VwX2Zyb21fZm9saW8oZm9saW8pO1xuLVx0b2xkX21lbWNnID0gc2V0X2FjdGl2ZV9tZW1jZyhtZW1jZyk7XG4tXG4tXHRpZiAoaXNfYW5vbikge1xuLVx0XHQvKlxuLVx0XHQgKiBUaGUgY2FsbGVyIGRvZXMgbm90IG5lY2Vzc2FyaWx5IGhvbGQgYW4gbW1hcF9sb2NrIHRoYXQgd291bGRcbi1cdFx0ICogcHJldmVudCB0aGUgYW5vbl92bWEgZGlzYXBwZWFyaW5nIHNvIHdlIGZpcnN0IHdlIHRha2UgYVxuLVx0XHQgKiByZWZlcmVuY2UgdG8gaXQgYW5kIHRoZW4gbG9jayB0aGUgYW5vbl92bWEgZm9yIHdyaXRlLiBUaGlzXG4tXHRcdCAqIGlzIHNpbWlsYXIgdG8gZm9saW9fbG9ja19hbm9uX3ZtYV9yZWFkIGV4Y2VwdCB0aGUgd3JpdGUgbG9ja1xuLVx0XHQgKiBpcyB0YWtlbiB0byBzZXJpYWxpc2UgYWdhaW5zdCBwYXJhbGxlbCBzcGxpdCBvciBjb2xsYXBzZVxuLVx0XHQgKiBvcGVyYXRpb25zLlxuLVx0XHQgKi9cbi1cdFx0YW5vbl92bWEgPSBmb2xpb19nZXRfYW5vbl92bWEoZm9saW8pO1xuLVx0XHRpZiAoIWFub25fdm1hKSB7XG4tXHRcdFx0cmV0ID0gLUVCVVNZO1xuLVx0XHRcdGdvdG8gb3V0O1xuLVx0XHR9XG4tXHRcdGFub25fdm1hX2xvY2tfd3JpdGUoYW5vbl92bWEpO1xuLVx0XHRtYXBwaW5nID0gTlVMTDtcbi1cdH0gZWxzZSB7XG4tXHRcdHVuc2lnbmVkIGludCBtaW5fb3JkZXI7XG4tXHRcdGdmcF90IGdmcDtcbi1cbi1cdFx0bWFwcGluZyA9IGZvbGlvLVx1MDAzZW1hcHBpbmc7XG4tXHRcdG1pbl9vcmRlciA9IG1hcHBpbmdfbWluX2ZvbGlvX29yZGVyKG1hcHBpbmcpO1xuLVx0XHRpZiAobmV3X29yZGVyIFx1MDAzYyBtaW5fb3JkZXIpIHtcbi1cdFx0XHRyZXQgPSAtRUlOVkFMO1xuLVx0XHRcdGdvdG8gb3V0O1xuLVx0XHR9XG4tXG4tXHRcdGdmcCA9IGN1cnJlbnRfZ2ZwX2NvbnRleHQobWFwcGluZ19nZnBfbWFzayhtYXBwaW5nKSBcdTAwMjZcbi1cdFx0XHRcdFx0XHRcdEdGUF9SRUNMQUlNX01BU0spO1xuLVxuLVx0XHRpZiAoIWZpbGVtYXBfcmVsZWFzZV9mb2xpbyhmb2xpbywgZ2ZwKSkge1xuLVx0XHRcdHJldCA9IC1FQlVTWTtcbi1cdFx0XHRnb3RvIG91dDtcbi1cdFx0fVxuLVxuLVx0XHRtYXBwaW5nX3NldF91cGRhdGUoXHUwMDI2eGFzLCBtYXBwaW5nKTtcbi1cbi1cdFx0aWYgKHNwbGl0X3R5cGUgPT0gU1BMSVRfVFlQRV9VTklGT1JNKSB7XG4tXHRcdFx0eGFzX3NldF9vcmRlcihcdTAwMjZ4YXMsIGZvbGlvLVx1MDAzZWluZGV4LCBuZXdfb3JkZXIpO1xuLVx0XHRcdHhhc19zcGxpdF9hbGxvYyhcdTAwMjZ4YXMsIGZvbGlvLCBvbGRfb3JkZXIsIGdmcCk7XG4tXHRcdFx0aWYgKHhhc19lcnJvcihcdTAwMjZ4YXMpKSB7XG4tXHRcdFx0XHRyZXQgPSB4YXNfZXJyb3IoXHUwMDI2eGFzKTtcbi1cdFx0XHRcdGdvdG8gb3V0O1xuLVx0XHRcdH1cbi1cdFx0fVxuLVxuLVx0XHRhbm9uX3ZtYSA9IE5VTEw7XG4tXHRcdGlfbW1hcF9sb2NrX3JlYWQobWFwcGluZyk7XG4tXG4tXHRcdC8qXG4tXHRcdCAqX19zcGxpdF91bm1hcHBlZF9mb2xpbygpIG1heSBuZWVkIHRvIHRyaW0gb2ZmIHBhZ2VzIGJleW9uZFxuLVx0XHQgKiBFT0Y6IGJ1dCBvbiAzMi1iaXQsIGlfc2l6ZV9yZWFkKCkgdGFrZXMgYW4gaXJxLXVuc2FmZVxuLVx0XHQgKiBzZXFsb2NrLCB3aGljaCBjYW5ub3QgYmUgbmVzdGVkIGluc2lkZSB0aGUgcGFnZSB0cmVlIGxvY2suXG4tXHRcdCAqIFNvIG5vdGUgZW5kIG5vdzogaV9zaXplIGl0c2VsZiBtYXkgYmUgY2hhbmdlZCBhdCBhbnkgbW9tZW50LFxuLVx0XHQgKiBidXQgZm9saW8gbG9jayBpcyBnb29kIGVub3VnaCB0byBzZXJpYWxpemUgdGhlIHRyaW1taW5nLlxuLVx0XHQgKi9cbi1cdFx0ZW5kID0gRElWX1JPVU5EX1VQKGlfc2l6ZV9yZWFkKG1hcHBpbmctXHUwMDNlaG9zdCksIFBBR0VfU0laRSk7XG4tXHRcdGlmIChzaG1lbV9tYXBwaW5nKG1hcHBpbmcpKVxuLVx0XHRcdGVuZCA9IHNobWVtX2ZhbGxvY2VuZChtYXBwaW5nLVx1MDAzZWhvc3QsIGVuZCk7XG4tXHR9XG4tXG4tXHQvKlxuLVx0ICogUmFjeSBjaGVjayBpZiB3ZSBjYW4gc3BsaXQgdGhlIHBhZ2UsIGJlZm9yZSB1bm1hcF9mb2xpbygpIHdpbGxcbi1cdCAqIHNwbGl0IFBNRHNcbi1cdCAqL1xuLVx0aWYgKGZvbGlvX2V4cGVjdGVkX3JlZl9jb3VudChmb2xpbykgIT0gZm9saW9fcmVmX2NvdW50KGZvbGlvKSAtIDEpIHtcbi1cdFx0cmV0ID0gLUVBR0FJTjtcbi1cdFx0Z290byBvdXRfdW5sb2NrO1xuLVx0fVxuLVxuLVx0dW5tYXBfZm9saW8oZm9saW8pO1xuLVxuLVx0LyogYmxvY2sgaW50ZXJydXB0IHJlZW50cnkgaW4geGFfbG9jayBhbmQgc3BpbmxvY2sgKi9cbi1cdGxvY2FsX2lycV9kaXNhYmxlKCk7XG4tXHRpZiAobWFwcGluZykge1xuLVx0XHQvKlxuLVx0XHQgKiBDaGVjayBpZiB0aGUgZm9saW8gaXMgcHJlc2VudCBpbiBwYWdlIGNhY2hlLlxuLVx0XHQgKiBXZSBhc3N1bWUgYWxsIHRhaWwgYXJlIHByZXNlbnQgdG9vLCBpZiBmb2xpbyBpcyB0aGVyZS5cbi1cdFx0ICovXG4tXHRcdHhhc19sb2NrKFx1MDAyNnhhcyk7XG4tXHRcdHhhc19yZXNldChcdTAwMjZ4YXMpO1xuLVx0XHRpZiAoeGFzX2xvYWQoXHUwMDI2eGFzKSAhPSBmb2xpbykge1xuLVx0XHRcdHJldCA9IC1FQUdBSU47XG4tXHRcdFx0Z290byBmYWlsO1xuLVx0XHR9XG4mIzQzO1x0XHRnb3RvIG91dDtcbiBcdH1cbiBcbi1cdHJldCA9IF9fZm9saW9fZnJlZXplX2FuZF9zcGxpdF91bm1hcHBlZChmb2xpbywgbmV3X29yZGVyLCBzcGxpdF9hdCwgXHUwMDI2eGFzLCBtYXBwaW5nLFxuLVx0XHRcdFx0XHRcdHRydWUsIGxpc3QsIHNwbGl0X3R5cGUsIGVuZCwgXHUwMDI2bnJfc2htZW1fZHJvcHBlZCk7XG4tZmFpbDpcbi1cdGlmIChtYXBwaW5nKVxuLVx0XHR4YXNfdW5sb2NrKFx1MDAyNnhhcyk7XG4tXG4tXHRsb2NhbF9pcnFfZW5hYmxlKCk7XG4tXG4tXHRpZiAobnJfc2htZW1fZHJvcHBlZClcbi1cdFx0c2htZW1fdW5jaGFyZ2UobWFwcGluZy1cdTAwM2Vob3N0LCBucl9zaG1lbV9kcm9wcGVkKTtcbi1cbi1cdGlmICghcmV0IFx1MDAyNlx1MDAyNiBpc19hbm9uIFx1MDAyNlx1MDAyNiAhZm9saW9faXNfZGV2aWNlX3ByaXZhdGUoZm9saW8pKVxuLVx0XHR0dHVfZmxhZ3MgPSBUVFVfVVNFX1NIQVJFRF9aRVJPUEFHRTtcbi1cbi1cdHJlbWFwX3BhZ2UoZm9saW8sIDEgXHUwMDNjXHUwMDNjIG9sZF9vcmRlciwgdHR1X2ZsYWdzKTtcbi1cbi1cdC8qXG4tXHQgKiBEcm9wIHRoZSBtYXBwaW5nIHdoaWxlIHRoZSBpbm9kZSBpcyBzdGlsbCBwaW5uZWQuIEBmb2xpbyBzdGF5c1xuLVx0ICogbG9ja2VkIGFuZCBwcmVzZW50IGluIHRoZSBwYWdlIGNhY2hlIHVudGlsIHRoZSBsb29wIGJlbG93LCBzb1xuLVx0ICogZXZpY3Rpb24gY2Fubm90IGZyZWUgdGhlIGlub2RlIHlldDsgQGxvY2tfYXQgaXMgbm90IGVub3VnaCwgaXQgbWF5XG4tXHQgKiBiZSBhIHRhaWwgYmV5b25kIEVPRiB0aGF0IHRoZSBzcGxpdCBhbHJlYWR5IGRyb3BwZWQgZnJvbSB0aGUgcGFnZVxuLVx0ICogY2FjaGUuIE5vdGhpbmcgcGFzdCB0aGlzIHBvaW50IG1heSB0b3VjaCB0aGUgaW5vZGUgb3IgdGhlIG1hcHBpbmcuXG4tXHQgKi9cbi1cdGlmIChtYXBwaW5nKSB7XG4tXHRcdGlfbW1hcF91bmxvY2tfcmVhZChtYXBwaW5nKTtcbi1cdFx0bWFwcGluZyA9IE5VTEw7XG4tXHR9XG4mIzQzO1x0aWYgKGlzX2Fub24pXG4mIzQzO1x0XHRyZXQgPSBfX2ZvbGlvX2ZyZWV6ZV9zcGxpdF91bm1hcChmb2xpbywgbmV3X29yZGVyLCBzcGxpdF9hdCwgdHJ1ZSxcbiYjNDM7XHRcdFx0XHRcdFx0IHRydWUsIGxpc3QsIHNwbGl0X3R5cGUpO1xuJiM0MztcdGVsc2UgaWYgKGlzX3N3YXBjYWNoZSlcbiYjNDM7XHRcdHJldCA9IF9fZm9saW9fZnJlZXplX3NwbGl0X3VubWFwKGZvbGlvLCBuZXdfb3JkZXIsIHNwbGl0X2F0LCB0cnVlLFxuJiM0MztcdFx0XHRcdFx0XHQgZmFsc2UsIGxpc3QsIHNwbGl0X3R5cGUpO1xuJiM0MztcdGVsc2VcbiYjNDM7XHRcdHJldCA9IF9fZm9saW9fZnJlZXplX3NwbGl0X3VubWFwX2ZpbGUoZm9saW8sIG5ld19vcmRlciwgc3BsaXRfYXQsXG4mIzQzO1x0XHRcdFx0XHRcdCAgICAgIHRydWUsIGxpc3QsIHNwbGl0X3R5cGUpO1xuIFxuIFx0LypcbiBcdCAqIFVubG9jayBhbGwgYWZ0ZXItc3BsaXQgZm9saW9zIGV4Y2VwdCB0aGUgb25lIGNvbnRhaW5pbmdcbkBAIC00MjY1LDI5ICYjNDM7NDI5MywxOSBAQCBzdGF0aWMgaW50IF9fZm9saW9fc3BsaXQoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlcixcbiBcdFx0aWYgKG5ld19mb2xpbyA9PSBwYWdlX2ZvbGlvKGxvY2tfYXQpKVxuIFx0XHRcdGNvbnRpbnVlO1xuIFxuLVx0XHRmb2xpb191bmxvY2sobmV3X2ZvbGlvKTtcbiBcdFx0LypcbiBcdFx0ICogU3VicGFnZXMgd2hvc2UgbWFwcGluZyBoYXMgYmVlbiB6YXBwZWQgbWF5IGJlIGZyZWVkXG4gXHRcdCAqIGVhcmxpZXIsIGJ1dCBmcmVlaW5nIHRoZW0gcmVxdWlyZXMgdGFraW5nIHRoZVxuIFx0XHQgKiBscnVfbG9jaywgc28gd2UgZGVmZXIgcHV0X3BhZ2UoKSBvbiB0YWlsIHBhZ2VzIHVudGlsXG4gXHRcdCAqIGFmdGVyIHRoZSBzcGxpdCBjb21wbGV0ZXMuXG4gXHRcdCAqL1xuLVx0XHRmcmVlX2ZvbGlvX2FuZF9zd2FwX2NhY2hlKG5ld19mb2xpbyk7XG4mIzQzO1x0XHRpZiAoaXNfc3dhcGNhY2hlKVxuJiM0MztcdFx0XHRmb2xpb19mcmVlX3N3YXAobmV3X2ZvbGlvKTtcbiYjNDM7XHRcdGZvbGlvX3VubG9jayhuZXdfZm9saW8pO1xuJiM0MztcdFx0Zm9saW9fcHV0KG5ld19mb2xpbyk7XG4gXHR9XG4gXG4tb3V0X3VubG9jazpcbi1cdGlmIChhbm9uX3ZtYSkge1xuLVx0XHRhbm9uX3ZtYV91bmxvY2tfd3JpdGUoYW5vbl92bWEpO1xuLVx0XHRwdXRfYW5vbl92bWEoYW5vbl92bWEpO1xuLVx0fVxuLVx0aWYgKG1hcHBpbmcpXG4tXHRcdGlfbW1hcF91bmxvY2tfcmVhZChtYXBwaW5nKTtcbiBvdXQ6XG4tXHQvKiByZXN0b3JlIHRvIGNhbGxlciYjMzk7cyBvbGRfbWVtY2cgKi9cbi1cdHNldF9hY3RpdmVfbWVtY2cob2xkX21lbWNnKTtcbi1cdG1lbV9jZ3JvdXBfcHV0KG1lbWNnKTtcbi1vdXRfbm9fbWVtY2c6XG4tXHR4YXNfZGVzdHJveShcdTAwMjZ4YXMpO1xuIFx0aWYgKGlzX3BtZF9vcmRlcihvbGRfb3JkZXIpKVxuIFx0XHRjb3VudF92bV9ldmVudCghcmV0ID8gVEhQX1NQTElUX1BBR0UgOiBUSFBfU1BMSVRfUEFHRV9GQUlMRUQpO1xuIFx0Y291bnRfbXRocF9zdGF0KG9sZF9vcmRlciwgIXJldCA/IE1USFBfU1RBVF9TUExJVCA6IE1USFBfU1RBVF9TUExJVF9GQUlMRUQpO1xuQEAgLTQzMTgsMjIgJiM0Mzs0MzM2LDEzIEBAIHN0YXRpYyBpbnQgX19mb2xpb19zcGxpdChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyLFxuICAqL1xuIGludCBmb2xpb19zcGxpdF91bm1hcHBlZChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyKVxuIHtcbi1cdGludCByZXQgPSAwO1xuLVxuIFx0Vk1fV0FSTl9PTl9PTkNFX0ZPTElPKGZvbGlvX21hcHBlZChmb2xpbyksIGZvbGlvKTtcbiBcdFZNX1dBUk5fT05fT05DRV9GT0xJTyghZm9saW9fdGVzdF9sb2NrZWQoZm9saW8pLCBmb2xpbyk7XG4gXHRWTV9XQVJOX09OX09OQ0VfRk9MSU8oIWZvbGlvX3Rlc3RfbGFyZ2UoZm9saW8pLCBmb2xpbyk7XG4gXHRWTV9XQVJOX09OX09OQ0VfRk9MSU8oIWZvbGlvX3Rlc3RfYW5vbihmb2xpbyksIGZvbGlvKTtcbiBcbi1cdGlmIChmb2xpb19leHBlY3RlZF9yZWZfY291bnQoZm9saW8pICE9IGZvbGlvX3JlZl9jb3VudChmb2xpbykgLSAxKVxuLVx0XHRyZXR1cm4gLUVBR0FJTjtcbi1cbi1cdGxvY2FsX2lycV9kaXNhYmxlKCk7XG4tXHRyZXQgPSBfX2ZvbGlvX2ZyZWV6ZV9hbmRfc3BsaXRfdW5tYXBwZWQoZm9saW8sIG5ld19vcmRlciwgXHUwMDI2Zm9saW8tXHUwMDNlcGFnZSwgTlVMTCxcbi1cdFx0XHRcdFx0XHROVUxMLCBmYWxzZSwgTlVMTCwgU1BMSVRfVFlQRV9VTklGT1JNLFxuLVx0XHRcdFx0XHRcdDAsIE5VTEwpO1xuLVx0bG9jYWxfaXJxX2VuYWJsZSgpO1xuLVx0cmV0dXJuIHJldDtcbiYjNDM7XHRyZXR1cm4gX19mb2xpb19mcmVlemVfc3BsaXRfdW5tYXAoZm9saW8sIG5ld19vcmRlciwgXHUwMDI2Zm9saW8tXHUwMDNlcGFnZSwgZmFsc2UsXG4mIzQzO1x0XHRcdFx0XHQgIGZhbHNlLCBOVUxMLCBTUExJVF9UWVBFX1VOSUZPUk0pO1xuIH1cbiBcbiAvKlxuQEAgLTQzNTIsMTEgJiM0Mzs0MzYxLDExIEBAIGludCBmb2xpb19zcGxpdF91bm1hcHBlZChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyKVxuICAqICAgIEdVUCBwaW5zLCB3aWxsIHJlc3VsdCBpbiB0aGUgZm9saW8gbm90IGdldHRpbmcgc3BsaXQ7IGluc3RlYWQsIHRoZSBjYWxsZXJcbiAgKiAgICB3aWxsIHJlY2VpdmUgYW4gLUVBR0FJTi5cbiAgKlxuLSAqIDQpIEBuZXdfb3JkZXIgXHUwMDNlIDEsIHVzdWFsbHkuIFNwbGl0dGluZyB0byBvcmRlci0xIGFub255bW91cyBmb2xpb3MgaXMgbm90XG4tICogICAgc3VwcG9ydGVkIGZvciBub24tZmlsZS1iYWNrZWQgZm9saW9zLCBiZWNhdXNlIGZvbGlvLVx1MDAzZV9kZWZlcnJlZF9saXN0LCB3aGljaFxuLSAqICAgIGlzIHVzZWQgYnkgcGFydGlhbGx5IG1hcHBlZCBmb2xpb3MsIGlzIHN0b3JlZCBpbiBzdWJwYWdlIDIsIGJ1dCBhbiBvcmRlci0xXG4tICogICAgZm9saW8gb25seSBoYXMgc3VicGFnZXMgMCBhbmQgMS4gRmlsZS1iYWNrZWQgb3JkZXItMSBmb2xpb3MgYXJlIHN1cHBvcnRlZCxcbi0gKiAgICBzaW5jZSB0aGV5IGRvIG5vdCB1c2UgX2RlZmVycmVkX2xpc3QuXG4mIzQzOyAqIDQpIEBuZXdfb3JkZXIgXHUwMDNlIDEsIHVzdWFsbHkuIE9yZGVyLTEgaXMgbm90IHN1cHBvcnRlZCBmb3IgYW5vbiBvciBzd2FwY2FjaGVcbiYjNDM7ICogICAgZm9saW9zOiBhbm9uIGZvbGlvcyBuZWVkIHN1YnBhZ2UgMiBmb3IgX2RlZmVycmVkX2xpc3QsIHdoaWNoIG9yZGVyLTFcbiYjNDM7ICogICAgZm9saW9zIGxhY2ssIGFuZCBhIHN3YXBjYWNoZSBmb2xpbyBtYXkgYmVjb21lIGFub24gb25jZSBmYXVsdGVkIGluLlxuJiM0MzsgKiAgICBGaWxlLWJhY2tlZCBvcmRlci0xIGZvbGlvcyBhcmUgc3VwcG9ydGVkLCBzaW5jZSB0aGV5IGRvIG5vdCB1c2VcbiYjNDM7ICogICAgX2RlZmVycmVkX2xpc3QuXG4gICpcbiAgKiBBZnRlciBzcGxpdHRpbmcsIHRoZSBjYWxsZXImIzM5O3MgZm9saW8gcmVmZXJlbmNlIHdpbGwgYmUgdHJhbnNmZXJyZWQgdG8gQHBhZ2UsXG4gICogcmVzdWx0aW5nIGluIGEgcmFpc2VkIHJlZmNvdW50IG9mIEBwYWdlIGFmdGVyIHRoaXMgY2FsbC4gVGhlIG90aGVyIHBhZ2VzIG1heVxuZGlmZiAtLWdpdCBhL21tL3N3YXBfc3RhdGUuYyBiL21tL3N3YXBfc3RhdGUuY1xuaW5kZXggNWJlODI1OTExZTY0NS4uZjE0MDVlNWI4MTNlZSAxMDA2NDRcbi0tLSBhL21tL3N3YXBfc3RhdGUuY1xuJiM0MzsmIzQzOyYjNDM7IGIvbW0vc3dhcF9zdGF0ZS5jXG5AQCAtMzg4LDggJiM0MzszODgsOSBAQCB2b2lkIF9fc3dhcF9jYWNoZV9yZXBsYWNlX2ZvbGlvKHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2ksXG4gXHQgICAgZm9saW9fb3JkZXIob2xkKSAhPSBmb2xpb19vcmRlcihuZXcpKSB7XG4gXHRcdGNpX29mZiA9IHN3cF9jbHVzdGVyX29mZnNldChvbGQtXHUwMDNlc3dhcCk7XG4gXHRcdGNpX2VuZCA9IGNpX29mZiAmIzQzOyBmb2xpb19ucl9wYWdlcyhvbGQpO1xuLVx0XHR3aGlsZSAoY2lfb2ZmJiM0MzsmIzQzOyBcdTAwM2MgY2lfZW5kKVxuJiM0MztcdFx0ZG8ge1xuIFx0XHRcdFdBUk5fT05fT05DRShzd3BfdGJfdG9fZm9saW8oX19zd2FwX3RhYmxlX2dldChjaSwgY2lfb2ZmKSkgIT0gb2xkKTtcbiYjNDM7XHRcdH0gd2hpbGUgKCYjNDM7JiM0MztjaV9vZmYgXHUwMDNjIGNpX2VuZCk7XG4gXHR9XG4gfVxuIFxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA3IDIxOjU0PC90ZD4KCQkJPHRkPmFnZW50PC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjFtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmJlc3QtZXhwZW5zaXZlPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtUUkFOU1BBUkVOVF9IVUdFUEFHRSYjMzQ7LAogICAgJiMzNDtTV0FQJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7X19zcGxpdF9odWdlX3BhZ2VfdG9fbGlzdF90b19vcmRlciYjMzQ7LAogICAgJiMzNDtmb2xpb19zcGxpdCYjMzQ7LAogICAgJiMzNDtmb2xpb19zcGxpdF91bm1hcHBlZCYjMzQ7LAogICAgJiMzNDtfX3N3YXBfY2FjaGVfcmVwbGFjZV9mb2xpbyYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCByZXdvcmtzIHRoZSBsb2dpYyBmb3Igc3BsaXR0aW5nIHVubWFwcGVkIGZvbGlvcywgc3BlY2lmaWNhbGx5IGhhbmRsaW5nIHN3YXBjYWNoZSBhbmQgYW5vbnltb3VzIGZvbGlvcy4gSXQgaW50cm9kdWNlcyBuZXcgc3RhdGljIGZ1bmN0aW9ucyBgX19mb2xpb19mcmVlemVfc3BsaXRfdW5tYXBgIGFuZCBgX19mb2xpb19mcmVlemVfc3BsaXRfdW5tYXBfZmlsZWAgdG8gcmVwbGFjZSBgX19mb2xpb19mcmVlemVfYW5kX3NwbGl0X3VubWFwcGVkYC4gSXQgYWxzbyBtb2RpZmllcyBgZm9saW9fY2hlY2tfc3BsaXR0YWJsZWAgYW5kIGBfX2ZvbGlvX3NwbGl0YCB0byB1c2UgdGhlIG5ldyBsb2dpYy4gVGhlIGNoYW5nZXMgYWZmZWN0IGNvcmUgbWVtb3J5IG1hbmFnZW1lbnQsIHNwZWNpZmljYWxseSBUSFAgYW5kIGZvbGlvIHNwbGl0dGluZywgd2hpY2ggYXJlIGhpZ2hseSBjb21wbGV4IGFuZCBwcm9uZSB0byByYWNlIGNvbmRpdGlvbnMuIEZ1enppbmcgdGhlIG1haW4gZW50cnkgcG9pbnRzIGZvciBmb2xpbyBzcGxpdHRpbmcgaXMgaW1wb3J0YW50IHRvIGVuc3VyZSB0aGUgbmV3IGxvZ2ljIGlzIHJvYnVzdC4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPkluc3RydWN0aW9uOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+WW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIG1haW50YWluZXIuCllvdXIgam9iIGlzIHRvIHJldmlldyBhIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQgZGV0ZXJtaW5lCmlmIGl0IG1ha2VzIGZ1bmN0aW9uYWwgY2hhbmdlcyB0byB0aGUga2VybmVsIHRoYXQgc2hvdWxkIGJlIGZ1enplZC4KCklNUE9SVEFOVDogVGhlIGNoYW5nZXMgaGF2ZSBBTFJFQURZIGJlZW4gYXBwbGllZCBhbmQgY29tbWl0dGVkIGFzIHRoZSBIRUFEIGNvbW1pdCBpbgp5b3VyIHdvcmtzcGFjZS4gRG8gTk9UIHJlbHkgb24geW91ciBpbnRlcm5hbCBrbm93bGVkZ2Ugb2YgdGhlIGtlcm5lbC4gWW91IG11c3QgYWN0aXZlbHkKdXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gZXhhbWluZSB0aGUgYWN0dWFsIHNvdXJjZSBjb2RlIGFuZCBjb25maXJtIGFueSBhc3N1bXB0aW9ucy4KClJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgaWYgdGhlIHBhdGNoIG9ubHkgY29udGFpbnM6Ci0gTW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLywgS2NvbmZpZyBmaWxlcywgb3IgY29kZSBjb21tZW50cy4KLSBQdXJlbHkgZGVjb3JhdGl2ZSBjaGFuZ2VzLCBzdWNoIGFzIGxvZ2dpbmcgKGUuZy4sIHByX2VyciwgcHJpbnRrKSBvciB0cmFjZXBvaW50cy4KLSBDaGFuZ2VzIHRvIG51bWVyaWMgY29uc3RhbnRzIG9yIG1hY3JvcyB0aGF0IGRvIG5vdCBmdW5jdGlvbmFsbHkgYWx0ZXIgZXhlY3V0aW9uIGZsb3cuCi0gQ29kZSBwYXRocyB0aGF0IGFyZSBpbXBvc3NpYmxlIHRvIHJlYWNoIGluIHZpcnR1YWxpemVkIGVudmlyb25tZW50cyBsaWtlIEdDRSBvciBRRU1VLAogIGV2ZW4gd2hlbiB1dGlsaXppbmcgc29mdHdhcmUtZW11bGF0ZWQgaGFyZHdhcmUgKGUuZy4sIHVzYiBnYWRnZXQsIG1hYzgwMjExX2h3c2ltKS4KLSBDb2RlIGluIHZlbmRvci1zcGVjaWZpYyBQQ0llIHN3aXRjaCwgU21hcnROSUMsIG9yIEdQVSBkcml2ZXJzIChlLmcuLCBtbHhzdywgcGRzX2NvcmUsIHFlZCwKICBpb25pYywgYW1kZ3B1KSB0aGF0IHJlcXVpcmUgcGh5c2ljYWwgUENJZSBoYXJkd2FyZSBjYXJkcyBub3QgZW11bGF0ZWQgaW4gc3RhbmRhcmQgUUVNVS4KLSBEcml2ZXIgLnJlbW92ZSwgLnNodXRkb3duLCBvciBwY2lfdW5yZWdpc3Rlcl9kcml2ZXIgdGVhcmRvd24gY2FsbGJhY2tzIChlLmcuLCBpZ2JfcmVtb3ZlKQogIHRoYXQgYXJlIGV4ZWN1dGVkIG9ubHkgZHVyaW5nIFBDSSBob3QtdW5wbHVnIG9yIHN5c2ZzIGRyaXZlciB1bmJpbmQgb3BlcmF0aW9ucy4KCklmIGl0IG1vZGlmaWVzIHJlYWNoYWJsZSBjb3JlIGtlcm5lbCBsb2dpYywgZHJpdmVycywgb3IgYXJjaGl0ZWN0dXJlcywgdXNlIHlvdXIgY29kZSBzZWFyY2gKdG9vbHMgdG8gdmVyaWZ5IHRoZSBjb2RlIGNhbiBiZSBleGVjdXRlZCwgdGhlbiByZXR1cm4gV29ydGhGdXp6aW5nPXRydWUuCgpXaGVuIHJldHVybmluZyBXb3J0aEZ1enppbmc9dHJ1ZSwgeW91IE1VU1QgQUxTTzoKMS4gRXh0cmFjdCBhbnkgc3BlY2lmaWMga2VybmVsIGZ1bmN0aW9ucyB0aGF0IHNob3VsZCBiZSBoZWF2aWx5IGZ1enplZCBpbnRvIEZvY3VzU3ltYm9scy4KICAgQXZvaWQgbGlzdGluZyBnZW5lcmljIGhvdC1wYXRoIGZ1bmN0aW9ucyB0byBwcmV2ZW50IHNrZXdlZCB0ZXN0IGRpc3RyaWJ1dGlvbnMuCiAgIFByZWZlciBub24tc3RhdGljLCBub24taW5saW5lZCBBUEkgZW50cnlwb2ludCBmdW5jdGlvbnMgb3ZlciBpbnRlcm5hbCBzdGF0aWMgaGVscGVyIGZ1bmN0aW9ucwogICAod2hpY2ggYXJlIGlubGluZWQgYnkgdGhlIGNvbXBpbGVyIGFuZCBkbyBub3QgaGF2ZSBkaXN0aW5jdCBzeW1ib2wgYWRkcmVzc2VzKS4KMi4gSWRlbnRpZnkgYW55IHNwZWNpZmljIENPTkZJR18gb3B0aW9ucyByZXF1aXJlZCB0byBwcm9wZXJseSB0ZXN0IHRoaXMgbmV3L21vZGlmaWVkIGZlYXR1cmUuCiAgIEdvIGFuZCBsb29rIGludG8gdGhlIEtjb25maWcgZmlsZXMgYW5kIGNoZWNrIGZvciBpZmRlZnMgYXJvdW5kIHRoZSBjb2RlLCBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy4KICAgQWxzbyBjaGVjayAmIzM0O2RlcGVuZHMgb24mIzM0OyBsaW5lcyBpbiBLY29uZmlnIHRvIGluY2x1ZGUgYW55IG5vbi1zdGFuZGFyZCBwYXJlbnQgc3Vic3lzdGVtIGNvbmZpZ3MKICAgbmVlZGVkIGZvciBLYnVpbGQgdG8gY29tcGlsZSB0aGUgY29kZSBzdGF0aWNhbGx5IGludG8gdm1saW51eC4gTGlzdCB0aGVtIGluIHRoZSBFbmFibGVDb25maWdzCiAgIG91dHB1dCBhcnJheSwgYW5kIERPIE5PVCBhZGQgYSAmIzM5O0NPTkZJR18mIzM5OyBwcmVmaXggKGUuZy4sIHJldHVybiAmIzM0O05FVF9JUFY0JiMzNDsgaW5zdGVhZCBvZiAmIzM0O0NPTkZJR19ORVRfSVBWNCYjMzQ7KS4KUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuCgoKVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy4KSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuCklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC4KPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Qcm9tcHQ6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Gb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczoKY29tbWl0IGU1ZTI0NzhhNTZiOTUyYThhYzVmNjJkMmU2NWFmNTg4ZWMzNDI4NjgKQXV0aG9yOiBzeXotY2x1c3RlciAmbHQ7dHJpYWdlQHN5emthbGxlci5jb20mZ3Q7CkRhdGU6ICAgRnJpIEF1ZyA3IDIxOjU0OjA0IDIwMjYgJiM0MzswMDAwCgogICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3CgpkaWZmIC0tZ2l0IGEvbW0vaHVnZV9tZW1vcnkuYyBiL21tL2h1Z2VfbWVtb3J5LmMKaW5kZXggY2VkNDAwZjcyZDQzYS4uMGQ3MGVlMzAxN2M0NiAxMDA2NDQKLS0tIGEvbW0vaHVnZV9tZW1vcnkuYwomIzQzOyYjNDM7JiM0MzsgYi9tbS9odWdlX21lbW9yeS5jCkBAIC0zNTg5LDkgJiM0MzszNTg5LDYgQEAgc3RhdGljIHZvaWQgcmVtYXBfcGFnZShzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBsb25nIG5yLCBpbnQgZmxhZ3MpCiB7CiAJaW50IGkgPSAwOwogCi0JLyogSWYgdW5tYXBfZm9saW8oKSB1c2VzIHRyeV90b19taWdyYXRlKCkgb24gZmlsZSwgcmVtb3ZlIHRoaXMgY2hlY2sgKi8KLQlpZiAoIWZvbGlvX3Rlc3RfYW5vbihmb2xpbykpCi0JCXJldHVybjsKIAlmb3IgKDs7KSB7CiAJCXJlbW92ZV9taWdyYXRpb25fcHRlcyhmb2xpbywgZm9saW8sIFRUVV9STUFQX0xPQ0tFRCB8IGZsYWdzKTsKIAkJaSAmIzQzOz0gZm9saW9fbnJfcGFnZXMoZm9saW8pOwpAQCAtMzgwMCw2ICYjNDM7Mzc5Nyw3IEBAIHN0YXRpYyBpbnQgX19zcGxpdF91bm1hcHBlZF9mb2xpbyhzdHJ1Y3QgZm9saW8gKmZvbGlvLCBpbnQgbmV3X29yZGVyLAogCQlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywgZW51bSBzcGxpdF90eXBlIHNwbGl0X3R5cGUpCiB7CiAJY29uc3QgYm9vbCBpc19hbm9uID0gZm9saW9fdGVzdF9hbm9uKGZvbGlvKTsKJiM0MzsJY29uc3QgYm9vbCBpc19zd2FwY2FjaGUgPSBmb2xpb190ZXN0X3N3YXBjYWNoZShmb2xpbyk7CiAJaW50IG9sZF9vcmRlciA9IGZvbGlvX29yZGVyKGZvbGlvKTsKIAlpbnQgc3RhcnRfb3JkZXIgPSBzcGxpdF90eXBlID09IFNQTElUX1RZUEVfVU5JRk9STSA/IG5ld19vcmRlciA6IG9sZF9vcmRlciAtIDE7CiAJc3RydWN0IGZvbGlvICpvbGRfZm9saW8gPSBmb2xpbzsKQEAgLTM4MTQsOCAmIzQzOzM4MTIsOCBAQCBzdGF0aWMgaW50IF9fc3BsaXRfdW5tYXBwZWRfZm9saW8oc3RydWN0IGZvbGlvICpmb2xpbywgaW50IG5ld19vcmRlciwKIAkgICAgIHNwbGl0X29yZGVyLS0pIHsKIAkJaW50IG5yX25ld19mb2xpb3MgPSAxVUwgJmx0OyZsdDsgKG9sZF9vcmRlciAtIHNwbGl0X29yZGVyKTsKIAotCQkvKiBvcmRlci0xIGFub255bW91cyBmb2xpbyBpcyBub3Qgc3VwcG9ydGVkICovCi0JCWlmIChpc19hbm9uICZhbXA7JmFtcDsgc3BsaXRfb3JkZXIgPT0gMSkKJiM0MzsJCS8qIG9yZGVyLTEgYW5vbnltb3VzIG9yIHN3YXBjYWNoZSBmb2xpbyBpcyBub3Qgc3VwcG9ydGVkICovCiYjNDM7CQlpZiAoKGlzX2Fub24gfHwgaXNfc3dhcGNhY2hlKSAmYW1wOyZhbXA7IHNwbGl0X29yZGVyID09IDEpCiAJCQljb250aW51ZTsKIAogCQlpZiAobWFwcGluZykgewpAQCAtMzg3OCwzMiAmIzQzOzM4NzYsMjYgQEAgc3RhdGljIGludCBfX3NwbGl0X3VubWFwcGVkX2ZvbGlvKHN0cnVjdCBmb2xpbyAqZm9saW8sIGludCBuZXdfb3JkZXIsCiBpbnQgZm9saW9fY2hlY2tfc3BsaXR0YWJsZShzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyLAogCQkJICAgZW51bSBzcGxpdF90eXBlIHNwbGl0X3R5cGUpCiB7CiYjNDM7CWJvb2wgaXNfYW5vbiA9IGZvbGlvX3Rlc3RfYW5vbihmb2xpbyk7CiYjNDM7CWJvb2wgaXNfc3dhcGNhY2hlID0gZm9saW9fdGVzdF9zd2FwY2FjaGUoZm9saW8pOwomIzQzOwogCVZNX1dBUk5fT05fRk9MSU8oIWZvbGlvX3Rlc3RfbG9ja2VkKGZvbGlvKSwgZm9saW8pOwogCS8qCiAJICogRm9saW9zIHRoYXQganVzdCBnb3QgdHJ1bmNhdGVkIGNhbm5vdCBnZXQgc3BsaXQuIFNpZ25hbCB0byB0aGUKLQkgKiBjYWxsZXIgdGhhdCB0aGVyZSB3YXMgYSByYWNlLgotCSAqCi0JICogVE9ETzogdGhpcyB3aWxsIGFsc28gY3VycmVudGx5IHJlZnVzZSBmb2xpb3Mgd2l0aG91dCBhIG1hcHBpbmcgaW4gdGhlCi0JICogc3dhcGNhY2hlIChzaG1lbSBvciB0by1iZS1hbm9uIGZvbGlvcykuCiYjNDM7CSAqIGNhbGxlciB0aGF0IHRoZXJlIHdhcyBhIHJhY2UuIEEgbWFwcGluZ2xlc3Mgc3dhcCBjYWNoZSBmb2xpbwomIzQzOwkgKiBoYXMgbm8gcGFnZSBjYWNoZSBlbnRyaWVzIHRvIHVwZGF0ZSwgc28gaXQgaXMgZmluZSB0byBzcGxpdC4KIAkgKi8KLQlpZiAoIWZvbGlvLSZndDttYXBwaW5nICZhbXA7JmFtcDsgIWZvbGlvX3Rlc3RfYW5vbihmb2xpbykpCiYjNDM7CWlmICghZm9saW8tJmd0O21hcHBpbmcgJmFtcDsmYW1wOyAhaXNfc3dhcGNhY2hlKQogCQlyZXR1cm4gLUVCVVNZOwogCi0JLyogb3JkZXItMSBpcyBub3Qgc3VwcG9ydGVkIGZvciBhbm9ueW1vdXMgVEhQLiAqLwotCWlmIChmb2xpb190ZXN0X2Fub24oZm9saW8pICZhbXA7JmFtcDsgbmV3X29yZGVyID09IDEpCi0JCXJldHVybiAtRUlOVkFMOwotCiAJLyoKLQkgKiBzd2FwY2FjaGUgZm9saW8gY291bGQgb25seSBiZSBzcGxpdCB0byBvcmRlciAwCi0JICoKLQkgKiBub24tdW5pZm9ybSBzcGxpdCBjcmVhdGVzIGFmdGVyLXNwbGl0IGZvbGlvcyB3aXRoIG9yZGVycyBmcm9tCi0JICogZm9saW9fb3JkZXIoZm9saW8pIC0gMSB0byBuZXdfb3JkZXIsIG1ha2luZyBpdCBub3Qgc3VpdGFibGUgZm9yIGFueQotCSAqIHN3YXBjYWNoZSBmb2xpbyBzcGxpdC4gT25seSB1bmlmb3JtIHNwbGl0IHRvIG9yZGVyLTAgY2FuIGJlIHVzZWQKLQkgKiBoZXJlLgomIzQzOwkgKiBPcmRlci0xIGlzIHVuc3VwcG9ydGVkOiBhbm9uIGZvbGlvcyBuZWVkIHN1YnBhZ2UgMiBmb3IgdGhlCiYjNDM7CSAqIGRlZmVycmVkIHNwbGl0IGxpc3QsIGh5YnJpZCBzaG1lbSAmYW1wOyBzd2FwIGNhY2hlIGZvbGlvcyBhcmUgbm90CiYjNDM7CSAqIHNwbGl0dGFibGUsIGFuZCBhIHNwbGl0dGFibGUgbWFwcGluZ2xlc3Mgc3dhcCBjYWNoZSBmb2xpbyBjb3VsZAomIzQzOwkgKiBiZSBlaXRoZXIgYW5vbiBvciBzaG1lbSwgd2hpY2ggd2UgY2Fubm90IHRlbGwgYXBhcnQuCiAJICovCi0JaWYgKChzcGxpdF90eXBlID09IFNQTElUX1RZUEVfTk9OX1VOSUZPUk0gfHwgbmV3X29yZGVyKSAmYW1wOyZhbXA7IGZvbGlvX3Rlc3Rfc3dhcGNhY2hlKGZvbGlvKSkgewomIzQzOwlpZiAoKGlzX2Fub24gfHwgaXNfc3dhcGNhY2hlKSAmYW1wOyZhbXA7IG5ld19vcmRlciA9PSAxKQogCQlyZXR1cm4gLUVJTlZBTDsKLQl9CiAKIAlpZiAoaXNfaHVnZV96ZXJvX2ZvbGlvKGZvbGlvKSkKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0zOTExLDM5ICYjNDM7MzkwMyw3OCBAQCBpbnQgZm9saW9fY2hlY2tfc3BsaXR0YWJsZShzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyLAogCWlmIChmb2xpb190ZXN0X3dyaXRlYmFjayhmb2xpbykpCiAJCXJldHVybiAtRUJVU1k7CiAKJiM0MzsJLyoKJiM0MzsJICogQSBub24tYW5vbiBzd2FwY2FjaGUgZm9saW8gdGhhdCBzdGlsbCBoYXMgYSBtYXBwaW5nIHNob3VsZCBvbmx5CiYjNDM7CSAqIGJlIGEgc2htZW0gZm9saW8gdW5kZXIgSU8sIHRoZXJlIGlzIGxpdHRsZSBiZW5lZml0IGluIHNwbGl0dGluZwomIzQzOwkgKiB0aGVtIGhlbmNlIG5vdCBzdXBwb3J0ZWQuIFJlamVjdCBpdCBoZXJlIHVwIGZyb250OiB0aGUgc3BsaXQKJiM0MzsJICogcm91dGluZSBjYW5ub3QgYmFjayBvdXQgY2xlYW5seSBvbmNlIHRoZSBmb2xpbyByZWYgaXMgZnJvemVuLgomIzQzOwkgKi8KJiM0MzsJaWYgKCFpc19hbm9uICZhbXA7JmFtcDsgaXNfc3dhcGNhY2hlICZhbXA7JmFtcDsgZm9saW8tJmd0O21hcHBpbmcpCiYjNDM7CQlyZXR1cm4gLUVJTlZBTDsKJiM0MzsKIAlyZXR1cm4gMDsKIH0KIAotLyogTnVtYmVyIG9mIGZvbGlvIHJlZmVyZW5jZXMgZnJvbSB0aGUgcGFnZWNhY2hlIG9yIHRoZSBzd2FwY2FjaGUuICovCi1zdGF0aWMgdW5zaWduZWQgaW50IGZvbGlvX2NhY2hlX3JlZl9jb3VudChjb25zdCBzdHJ1Y3QgZm9saW8gKmZvbGlvKQomIzQzOy8qIE51bWJlciBvZiBmb2xpbyByZWZlcmVuY2VzIGZyb20gdGhlIHN3YXBjYWNoZS4gKi8KJiM0MztzdGF0aWMgdW5zaWduZWQgaW50IGZvbGlvX3N3YXBjYWNoZV9yZWZfY291bnQoY29uc3Qgc3RydWN0IGZvbGlvICpmb2xpbykKIHsKLQlpZiAoZm9saW9fdGVzdF9hbm9uKGZvbGlvKSAmYW1wOyZhbXA7ICFmb2xpb190ZXN0X3N3YXBjYWNoZShmb2xpbykpCiYjNDM7CWlmICghZm9saW9fdGVzdF9zd2FwY2FjaGUoZm9saW8pKQogCQlyZXR1cm4gMDsKIAlyZXR1cm4gZm9saW9fbnJfcGFnZXMoZm9saW8pOwogfQogCi1zdGF0aWMgaW50IF9fZm9saW9fZnJlZXplX2FuZF9zcGxpdF91bm1hcHBlZChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyLAotCQkJCQkgICAgIHN0cnVjdCBwYWdlICpzcGxpdF9hdCwgc3RydWN0IHhhX3N0YXRlICp4YXMsCi0JCQkJCSAgICAgc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsIGJvb2wgZG9fbHJ1LAotCQkJCQkgICAgIHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QsIGVudW0gc3BsaXRfdHlwZSBzcGxpdF90eXBlLAotCQkJCQkgICAgIHBnb2ZmX3QgZW5kLCBpbnQgKm5yX3NobWVtX2Ryb3BwZWQpCiYjNDM7c3RhdGljIGludCBfX2ZvbGlvX2ZyZWV6ZV9zcGxpdF91bm1hcChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyLAomIzQzOwkJCQkgICAgICBzdHJ1Y3QgcGFnZSAqc3BsaXRfYXQsIGJvb2wgZG9fbHJ1LCBib29sIGFub25fdW5tYXAsCiYjNDM7CQkJCSAgICAgIHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QsIGVudW0gc3BsaXRfdHlwZSBzcGxpdF90eXBlKQogewogCXN0cnVjdCBmb2xpbyAqZW5kX2ZvbGlvID0gZm9saW9fbmV4dChmb2xpbyk7Ci0Jc3RydWN0IGZvbGlvICpuZXdfZm9saW8sICpuZXh0OwomIzQzOwlib29sIGlzX2Fub24gPSBmb2xpb190ZXN0X2Fub24oZm9saW8pOwomIzQzOwlzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpID0gTlVMTDsKJiM0MzsJc3RydWN0IGZvbGlvICpuZXdfZm9saW87CiAJaW50IG9sZF9vcmRlciA9IGZvbGlvX29yZGVyKGZvbGlvKTsKJiM0MzsJc3RydWN0IGFub25fdm1hICphbm9uX3ZtYSA9IE5VTEw7CiYjNDM7CWVudW0gdHR1X2ZsYWdzIHR0dV9mbGFncyA9IDA7CiAJc3RydWN0IGxpc3RfbHJ1X29uZSAqbHJ1OwomIzQzOwlzdHJ1Y3QgbHJ1dmVjICpscnV2ZWM7CiAJYm9vbCBkZXF1ZXVlX2RlZmVycmVkOwogCWludCByZXQgPSAwOwogCi0JVk1fV0FSTl9PTl9PTkNFKCFtYXBwaW5nICZhbXA7JmFtcDsgZW5kKTsKJiM0MzsJLyoKJiM0MzsJICogVW5tYXAvcmVtYXAgbmVlZHMgdGhlIGFub25fdm1hLiBUaGUgY2FsbGVyIGRvZXMgbm90IG5lY2Vzc2FyaWx5CiYjNDM7CSAqIGhvbGQgYW4gbW1hcF9sb2NrIHRoYXQgd291bGQgcHJldmVudCB0aGUgYW5vbl92bWEgZnJvbQomIzQzOwkgKiBkaXNhcHBlYXJpbmcsIHNvIHdlIGZpcnN0IHRha2UgYSByZWZlcmVuY2UgYW5kIGxvY2sgaXQuIFRoaXMgaXMKJiM0MzsJICogc2ltaWxhciB0byBmb2xpb19sb2NrX2Fub25fdm1hX3JlYWQoKSBleGNlcHQgdGhlIHdyaXRlIGxvY2sgaXMKJiM0MzsJICogdGFrZW4gdG8gc2VyaWFsaXplIGFnYWluc3QgcGFyYWxsZWwgc3BsaXQgb3IgY29sbGFwc2UuCiYjNDM7CSAqLwomIzQzOwlpZiAoYW5vbl91bm1hcCkgewomIzQzOwkJYW5vbl92bWEgPSBmb2xpb19nZXRfYW5vbl92bWEoZm9saW8pOwomIzQzOwkJaWYgKCFhbm9uX3ZtYSkKJiM0MzsJCQlyZXR1cm4gLUVCVVNZOwomIzQzOwkJYW5vbl92bWFfbG9ja193cml0ZShhbm9uX3ZtYSk7CiYjNDM7CX0KJiM0MzsKJiM0MzsJLyogUmFjeSBjaGVjayBpZiB3ZSBjYW4gc3BsaXQgdGhlIHBhZ2UsIGJlZm9yZSB0aGUgb3B0aW9uYWwgdW5tYXAuICovCiYjNDM7CWlmIChmb2xpb19leHBlY3RlZF9yZWZfY291bnQoZm9saW8pICE9IGZvbGlvX3JlZl9jb3VudChmb2xpbykgLSAxKSB7CiYjNDM7CQlyZXQgPSAtRUFHQUlOOwomIzQzOwkJZ290byBvdXRfdW5sb2NrOwomIzQzOwl9CiYjNDM7CiYjNDM7CWlmIChhbm9uX3VubWFwKQomIzQzOwkJdW5tYXBfZm9saW8oZm9saW8pOwomIzQzOwomIzQzOwlsb2NhbF9pcnFfZGlzYWJsZSgpOwomIzQzOwogCS8qCiAJICogSWYgdGhpcyBmb2xpbyBjYW4gYmUgb24gdGhlIGRlZmVycmVkIHNwbGl0IHF1ZXVlLCBsb2NrIG91dAogCSAqIHRoZSBzaHJpbmtlciBiZWZvcmUgZnJlZXppbmcgdGhlIHJlZi4gSWYgdGhlIHNocmlua2VyIHNlZXMKIAkgKiBhIDAtcmVmIGZvbGlvLCBpdCBhc3N1bWVzIGl0IGJlYXQgZm9saW9fcHV0KCkgdG8gdGhlIGxpc3QKIAkgKiBsb2NrIGFuZCBtdXN0IGNsZWFuIHVwIHRoZSBMUlUgc3RhdGUgLSB0aGUgc2FtZSBkZXF1ZXVlIHdlCiAJICogd2lsbCBkbyBiZWxvdyBhcyBwYXJ0IG9mIHRoZSBzcGxpdC4KJiM0MzsJICoKJiM0MzsJICogT25seSBhbm9uIGZvbGlvcyBhcmUgZXZlciBxdWV1ZWQgb24gdGhlIGRlZmVycmVkIHNwbGl0IGxpc3QsCiYjNDM7CSAqIHNvIG5vbi1hbm9uIGZvbGlvcyAobWFwcGluZ2xlc3Mgc3dhcGNhY2hlKSBuZXZlciBuZWVkIGRlcXVldWluZy4KIAkgKi8KLQlkZXF1ZXVlX2RlZmVycmVkID0gZm9saW9fdGVzdF9hbm9uKGZvbGlvKSAmYW1wOyZhbXA7IG9sZF9vcmRlciAmZ3Q7IDE7CiYjNDM7CWRlcXVldWVfZGVmZXJyZWQgPSBvbGRfb3JkZXIgJmd0OyAxICZhbXA7JmFtcDsgaXNfYW5vbjsKIAlpZiAoZGVxdWV1ZV9kZWZlcnJlZCkgewogCQlzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2c7CiAKQEAgLTM5NTIsMTI4ICYjNDM7Mzk4MywyNDMgQEAgc3RhdGljIGludCBfX2ZvbGlvX2ZyZWV6ZV9hbmRfc3BsaXRfdW5tYXBwZWQoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG4KIAkJbHJ1ID0gbGlzdF9scnVfbG9jaygmYW1wO2RlZmVycmVkX3NwbGl0X2xydSwKIAkJCQkgICAgZm9saW9fbmlkKGZvbGlvKSwgJmFtcDttZW1jZyk7CiAJfQotCWlmIChmb2xpb19yZWZfZnJlZXplKGZvbGlvLCBmb2xpb19jYWNoZV9yZWZfY291bnQoZm9saW8pICYjNDM7IDEpKSB7Ci0JCXN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2kgPSBOVUxMOwotCQlzdHJ1Y3QgbHJ1dmVjICpscnV2ZWM7CiAKJiM0MzsJaWYgKCFmb2xpb19yZWZfZnJlZXplKGZvbGlvLCBmb2xpb19zd2FwY2FjaGVfcmVmX2NvdW50KGZvbGlvKSAmIzQzOyAxKSkgewogCQlpZiAoZGVxdWV1ZV9kZWZlcnJlZCkgewotCQkJX19saXN0X2xydV9kZWwoJmFtcDtkZWZlcnJlZF9zcGxpdF9scnUsIGxydSwKLQkJCQkgICAgICAgJmFtcDtmb2xpby0mZ3Q7X2RlZmVycmVkX2xpc3QsIGZvbGlvX25pZChmb2xpbykpOwotCQkJaWYgKGZvbGlvX3Rlc3RfcGFydGlhbGx5X21hcHBlZChmb2xpbykpIHsKLQkJCQlmb2xpb19jbGVhcl9wYXJ0aWFsbHlfbWFwcGVkKGZvbGlvKTsKLQkJCQltb2RfbXRocF9zdGF0KG9sZF9vcmRlciwKLQkJCQkJTVRIUF9TVEFUX05SX0FOT05fUEFSVElBTExZX01BUFBFRCwgLTEpOwotCQkJfQogCQkJbGlzdF9scnVfdW5sb2NrKGxydSk7CiAJCQlyY3VfcmVhZF91bmxvY2soKTsKIAkJfQomIzQzOwkJcmV0ID0gLUVBR0FJTjsKJiM0MzsJCWdvdG8gb3V0X25vX3NwbGl0OwomIzQzOwl9CiAKLQkJaWYgKG1hcHBpbmcpIHsKLQkJCWludCBuciA9IGZvbGlvX25yX3BhZ2VzKGZvbGlvKTsKLQotCQkJaWYgKGZvbGlvX3Rlc3RfcG1kX21hcHBhYmxlKGZvbGlvKSAmYW1wOyZhbXA7Ci0JCQkgICAgbmV3X29yZGVyICZsdDsgSFBBR0VfUE1EX09SREVSKSB7Ci0JCQkJaWYgKGZvbGlvX3Rlc3Rfc3dhcGJhY2tlZChmb2xpbykpIHsKLQkJCQkJbHJ1dmVjX3N0YXRfbW9kX2ZvbGlvKGZvbGlvLAotCQkJCQkJCU5SX1NITUVNX1RIUFMsIC1ucik7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJbHJ1dmVjX3N0YXRfbW9kX2ZvbGlvKGZvbGlvLAotCQkJCQkJCU5SX0ZJTEVfVEhQUywgLW5yKTsKLQkJCQl9Ci0JCQl9CiYjNDM7CWlmIChkZXF1ZXVlX2RlZmVycmVkKSB7CiYjNDM7CQlfX2xpc3RfbHJ1X2RlbCgmYW1wO2RlZmVycmVkX3NwbGl0X2xydSwgbHJ1LAomIzQzOwkJCSAgICAgICAmYW1wO2ZvbGlvLSZndDtfZGVmZXJyZWRfbGlzdCwgZm9saW9fbmlkKGZvbGlvKSk7CiYjNDM7CQlpZiAoZm9saW9fdGVzdF9wYXJ0aWFsbHlfbWFwcGVkKGZvbGlvKSkgewomIzQzOwkJCWZvbGlvX2NsZWFyX3BhcnRpYWxseV9tYXBwZWQoZm9saW8pOwomIzQzOwkJCW1vZF9tdGhwX3N0YXQob2xkX29yZGVyLAomIzQzOwkJCQkgICAgICBNVEhQX1NUQVRfTlJfQU5PTl9QQVJUSUFMTFlfTUFQUEVELCAtMSk7CiAJCX0KJiM0MzsJCWxpc3RfbHJ1X3VubG9jayhscnUpOwomIzQzOwkJcmN1X3JlYWRfdW5sb2NrKCk7CiYjNDM7CX0KIAotCQlpZiAoZm9saW9fdGVzdF9zd2FwY2FjaGUoZm9saW8pKSB7Ci0JCQlpZiAobWFwcGluZykgewotCQkJCVZNX1dBUk5fT05fT05DRV9GT0xJTyhtYXBwaW5nLCBmb2xpbyk7Ci0JCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQl9CiYjNDM7CWlmIChmb2xpb190ZXN0X3N3YXBjYWNoZShmb2xpbykpCiYjNDM7CQljaSA9IHN3YXBfY2x1c3Rlcl9nZXRfYW5kX2xvY2soZm9saW8pOwogCi0JCQljaSA9IHN3YXBfY2x1c3Rlcl9nZXRfYW5kX2xvY2soZm9saW8pOwotCQl9CiYjNDM7CWlmIChkb19scnUpCiYjNDM7CQlscnV2ZWMgPSBmb2xpb19scnV2ZWNfbG9jayhmb2xpbyk7CiYjNDM7CiYjNDM7CXJldCA9IF9fc3BsaXRfdW5tYXBwZWRfZm9saW8oZm9saW8sIG5ld19vcmRlciwgc3BsaXRfYXQsIE5VTEwsCiYjNDM7CQkJCSAgICAgTlVMTCwgc3BsaXRfdHlwZSk7CiAKLQkJLyogbG9jayBscnUgbGlzdC9QYWdlQ29tcG91bmQsIHJlZiBmcm96ZW4gYnkgcGFnZV9yZWZfZnJlZXplICovCiYjNDM7CS8qCiYjNDM7CSAqIFVuZnJlZXplIHRoZSBhZnRlci1zcGxpdCBmb2xpb3MgYW5kIHB1dCB0aGVtIGJhY2sgdG8gdGhlIHJpZ2h0CiYjNDM7CSAqIHBsYWNlLCBrZWVwaW5nIHRoZSBoZWFkIEBmb2xpbyBmcm96ZW4gdW50aWwgdGhlIGVuZC4gV2hpbGUgdGhlCiYjNDM7CSAqIGZvbGlvIGlzIGluIHRoZSBzd2FwIGNhY2hlLCB0aGUgc3ViIGVudHJpZXMgbXVzdCBiZSB1cGRhdGVkIHdpdGgKJiM0MzsJICogdGhlaXIgYWZ0ZXItc3BsaXQgZm9saW9zIGJlZm9yZSB0aGUgaGVhZCBpcyB1bmZyb3plbiwgc28gYQomIzQzOwkgKiBjb25jdXJyZW50IHN3YXBfY2FjaGVfZ2V0X2ZvbGlvKCkgY2Fubm90IHJldHVybiB0aGUgaGVhZCBmb2xpbwomIzQzOwkgKiBmb3IgYSBzdWIgZW50cnkuIEtlZXBpbmcgdGhlIGhlYWQgZnJvemVuIHRocm91Z2hvdXQgYWxzbyBzdG9wcyBhCiYjNDM7CSAqIHBhcmFsbGVsIGZvbGlvX3RyeV9nZXQoKSBmcm9tIG9ic2VydmluZyBhIHBhcnRpYWxseSBzcGxpdCBmb2xpby4KJiM0MzsJICovCiYjNDM7CWZvciAobmV3X2ZvbGlvID0gZm9saW9fbmV4dChmb2xpbyk7IG5ld19mb2xpbyAhPSBlbmRfZm9saW87CiYjNDM7CSAgICAgbmV3X2ZvbGlvID0gZm9saW9fbmV4dChuZXdfZm9saW8pKSB7CiYjNDM7CQl6b25lX2RldmljZV9wcml2YXRlX3NwbGl0X2NiKGZvbGlvLCBuZXdfZm9saW8pOwomIzQzOwkJZm9saW9fcmVmX3VuZnJlZXplKG5ld19mb2xpbywKJiM0MzsJCQkJICAgZm9saW9fc3dhcGNhY2hlX3JlZl9jb3VudChuZXdfZm9saW8pICYjNDM7IDEpOwogCQlpZiAoZG9fbHJ1KQotCQkJbHJ1dmVjID0gZm9saW9fbHJ1dmVjX2xvY2soZm9saW8pOwomIzQzOwkJCWxydV9hZGRfc3BsaXRfZm9saW8oZm9saW8sIG5ld19mb2xpbywgbHJ1dmVjLCBsaXN0KTsKJiM0MzsJCWlmIChjaSkKJiM0MzsJCQlfX3N3YXBfY2FjaGVfcmVwbGFjZV9mb2xpbyhjaSwgZm9saW8sIG5ld19mb2xpbyk7CiYjNDM7CX0KIAotCQlyZXQgPSBfX3NwbGl0X3VubWFwcGVkX2ZvbGlvKGZvbGlvLCBuZXdfb3JkZXIsIHNwbGl0X2F0LCB4YXMsCi0JCQkJCSAgICAgbWFwcGluZywgc3BsaXRfdHlwZSk7CiYjNDM7CXpvbmVfZGV2aWNlX3ByaXZhdGVfc3BsaXRfY2IoZm9saW8sIE5VTEwpOwomIzQzOwlmb2xpb19yZWZfdW5mcmVlemUoZm9saW8sIGZvbGlvX3N3YXBjYWNoZV9yZWZfY291bnQoZm9saW8pICYjNDM7IDEpOwogCi0JCS8qCi0JCSAqIFVuZnJlZXplIGFmdGVyLXNwbGl0IGZvbGlvcyBhbmQgcHV0IHRoZW0gYmFjayB0byB0aGUgcmlnaHQKLQkJICogbGlzdC4gQGZvbGlvIHNob3VsZCBiZSBrZXB0IGZyb3pvbiB1bnRpbCBwYWdlIGNhY2hlCi0JCSAqIGVudHJpZXMgYXJlIHVwZGF0ZWQgd2l0aCBhbGwgdGhlIG90aGVyIGFmdGVyLXNwbGl0IGZvbGlvcwotCQkgKiB0byBwcmV2ZW50IG90aGVycyBzZWVpbmcgc3RhbGUgcGFnZSBjYWNoZSBlbnRyaWVzLgotCQkgKiBBcyBhIHJlc3VsdCwgbmV3X2ZvbGlvIHN0YXJ0cyBmcm9tIHRoZSBuZXh0IGZvbGlvIG9mCi0JCSAqIEBmb2xpby4KLQkJICovCi0JCWZvciAobmV3X2ZvbGlvID0gZm9saW9fbmV4dChmb2xpbyk7IG5ld19mb2xpbyAhPSBlbmRfZm9saW87Ci0JCSAgICAgbmV3X2ZvbGlvID0gbmV4dCkgewotCQkJdW5zaWduZWQgbG9uZyBucl9wYWdlcyA9IGZvbGlvX25yX3BhZ2VzKG5ld19mb2xpbyk7CiYjNDM7CWlmIChkb19scnUpCiYjNDM7CQlscnV2ZWNfdW5sb2NrKGxydXZlYyk7CiYjNDM7CWlmIChjaSkKJiM0MzsJCXN3YXBfY2x1c3Rlcl91bmxvY2soY2kpOwomIzQzO291dF9ub19zcGxpdDoKJiM0MzsJbG9jYWxfaXJxX2VuYWJsZSgpOwomIzQzOwlpZiAoYW5vbl91bm1hcCkgewomIzQzOwkJaWYgKCFyZXQgJmFtcDsmYW1wOyAhZm9saW9faXNfZGV2aWNlX3ByaXZhdGUoZm9saW8pKQomIzQzOwkJCXR0dV9mbGFncyA9IFRUVV9VU0VfU0hBUkVEX1pFUk9QQUdFOwomIzQzOwkJcmVtYXBfcGFnZShmb2xpbywgMSAmbHQ7Jmx0OyBvbGRfb3JkZXIsIHR0dV9mbGFncyk7CiYjNDM7CX0KJiM0MztvdXRfdW5sb2NrOgomIzQzOwlpZiAoYW5vbl91bm1hcCkgewomIzQzOwkJYW5vbl92bWFfdW5sb2NrX3dyaXRlKGFub25fdm1hKTsKJiM0MzsJCXB1dF9hbm9uX3ZtYShhbm9uX3ZtYSk7CiYjNDM7CX0KIAotCQkJbmV4dCA9IGZvbGlvX25leHQobmV3X2ZvbGlvKTsKJiM0MzsJcmV0dXJuIHJldDsKJiM0Mzt9CiAKLQkJCXpvbmVfZGV2aWNlX3ByaXZhdGVfc3BsaXRfY2IoZm9saW8sIG5ld19mb2xpbyk7CiYjNDM7c3RhdGljIGludCBfX2ZvbGlvX2ZyZWV6ZV9zcGxpdF91bm1hcF9maWxlKHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIsCiYjNDM7CQkJCQkgICBzdHJ1Y3QgcGFnZSAqc3BsaXRfYXQsIGJvb2wgZG9fbHJ1LAomIzQzOwkJCQkJICAgc3RydWN0IGxpc3RfaGVhZCAqbGlzdCwgZW51bSBzcGxpdF90eXBlIHNwbGl0X3R5cGUpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyA9IGZvbGlvLSZndDttYXBwaW5nOwomIzQzOwlYQV9TVEFURSh4YXMsICZhbXA7bWFwcGluZy0mZ3Q7aV9wYWdlcywgZm9saW8tJmd0O2luZGV4KTsKJiM0MzsJc3RydWN0IGZvbGlvICplbmRfZm9saW8gPSBmb2xpb19uZXh0KGZvbGlvKTsKJiM0MzsJbG9uZyBvbGRfbnJfcGFnZXMgPSBmb2xpb19ucl9wYWdlcyhmb2xpbyk7CiYjNDM7CXN0cnVjdCBtZW1fY2dyb3VwICptZW1jZywgKm9sZF9tZW1jZzsKJiM0MzsJc3RydWN0IGZvbGlvICpuZXdfZm9saW8sICpuZXh0OwomIzQzOwlpbnQgbnJfc2htZW1fZHJvcHBlZCA9IDA7CiYjNDM7CXVuc2lnbmVkIGludCBtaW5fb3JkZXI7CiYjNDM7CXN0cnVjdCBscnV2ZWMgKmxydXZlYzsKJiM0MzsJcGdvZmZfdCBlbmQgPSAwOwomIzQzOwlnZnBfdCBnZnA7CiYjNDM7CWludCByZXQgPSAwOwogCi0JCQlmb2xpb19yZWZfdW5mcmVlemUobmV3X2ZvbGlvLAotCQkJCQkgICBmb2xpb19jYWNoZV9yZWZfY291bnQobmV3X2ZvbGlvKSAmIzQzOyAxKTsKJiM0MzsJbWluX29yZGVyID0gbWFwcGluZ19taW5fZm9saW9fb3JkZXIobWFwcGluZyk7CiYjNDM7CWlmIChuZXdfb3JkZXIgJmx0OyBtaW5fb3JkZXIpCiYjNDM7CQlyZXR1cm4gLUVJTlZBTDsKIAotCQkJaWYgKGRvX2xydSkKLQkJCQlscnVfYWRkX3NwbGl0X2ZvbGlvKGZvbGlvLCBuZXdfZm9saW8sIGxydXZlYywgbGlzdCk7CiYjNDM7CS8qCiYjNDM7CSAqIFN3aXRjaCB0byBmb2xpbyYjMzk7cyBtZW1jZyBhcyB4YXJyYXkgbm9kZSBhbGxvY2F0aW9uIGNhbiBoYXBwZW4gYW5kCiYjNDM7CSAqIG5lZWRzIHRvIGNoYXJnZSB0byBpdC4KJiM0MzsJICovCiYjNDM7CW1lbWNnID0gZ2V0X21lbV9jZ3JvdXBfZnJvbV9mb2xpbyhmb2xpbyk7CiYjNDM7CW9sZF9tZW1jZyA9IHNldF9hY3RpdmVfbWVtY2cobWVtY2cpOwogCi0JCQkvKgotCQkJICogQW5vbnltb3VzIGZvbGlvIHdpdGggc3dhcCBjYWNoZS4KLQkJCSAqIE5PVEU6IHNobWVtIGluIHN3YXAgY2FjaGUgaXMgbm90IHN1cHBvcnRlZCB5ZXQuCi0JCQkgKi8KLQkJCWlmIChjaSkgewotCQkJCV9fc3dhcF9jYWNoZV9yZXBsYWNlX2ZvbGlvKGNpLCBmb2xpbywgbmV3X2ZvbGlvKTsKLQkJCQljb250aW51ZTsKLQkJCX0KJiM0MzsJZ2ZwID0gY3VycmVudF9nZnBfY29udGV4dChtYXBwaW5nX2dmcF9tYXNrKG1hcHBpbmcpICZhbXA7IEdGUF9SRUNMQUlNX01BU0spOwomIzQzOwlpZiAoIWZpbGVtYXBfcmVsZWFzZV9mb2xpbyhmb2xpbywgZ2ZwKSkgewomIzQzOwkJcmV0ID0gLUVCVVNZOwomIzQzOwkJZ290byBmYWlsX2ZyZWU7CiYjNDM7CX0KIAotCQkJLyogQW5vbnltb3VzIGZvbGlvIHdpdGhvdXQgc3dhcCBjYWNoZSAqLwotCQkJaWYgKCFtYXBwaW5nKQotCQkJCWNvbnRpbnVlOwomIzQzOwltYXBwaW5nX3NldF91cGRhdGUoJmFtcDt4YXMsIG1hcHBpbmcpOwogCi0JCQkvKiBBZGQgdGhlIG5ldyBmb2xpbyB0byB0aGUgcGFnZSBjYWNoZS4gKi8KLQkJCWlmIChuZXdfZm9saW8tJmd0O2luZGV4ICZsdDsgZW5kKSB7Ci0JCQkJX194YV9zdG9yZSgmYW1wO21hcHBpbmctJmd0O2lfcGFnZXMsIG5ld19mb2xpby0mZ3Q7aW5kZXgsCi0JCQkJCSAgIG5ld19mb2xpbywgMCk7Ci0JCQkJY29udGludWU7Ci0JCQl9CiYjNDM7CWlmIChzcGxpdF90eXBlID09IFNQTElUX1RZUEVfVU5JRk9STSkgewomIzQzOwkJaW50IG9sZF9vcmRlciA9IGZvbGlvX29yZGVyKGZvbGlvKTsKIAotCQkJVk1fV0FSTl9PTl9PTkNFKCFucl9zaG1lbV9kcm9wcGVkKTsKLQkJCS8qIERyb3AgZm9saW8gYmV5b25kIEVPRjogLSZndDtpbmRleCAmZ3Q7PSBlbmQgKi8KLQkJCWlmIChzaG1lbV9tYXBwaW5nKG1hcHBpbmcpICZhbXA7JmFtcDsgbnJfc2htZW1fZHJvcHBlZCkKLQkJCQkqbnJfc2htZW1fZHJvcHBlZCAmIzQzOz0gbnJfcGFnZXM7Ci0JCQllbHNlIGlmIChmb2xpb190ZXN0X2NsZWFyX2RpcnR5KG5ld19mb2xpbykpCi0JCQkJZm9saW9fYWNjb3VudF9jbGVhbmVkKAotCQkJCQluZXdfZm9saW8sIGlub2RlX3RvX3diKG1hcHBpbmctJmd0O2hvc3QpKTsKLQkJCV9fZmlsZW1hcF9yZW1vdmVfZm9saW8obmV3X2ZvbGlvLCBOVUxMKTsKLQkJCWZvbGlvX3B1dF9yZWZzKG5ld19mb2xpbywgbnJfcGFnZXMpOwomIzQzOwkJeGFzX3NldF9vcmRlcigmYW1wO3hhcywgZm9saW8tJmd0O2luZGV4LCBuZXdfb3JkZXIpOwomIzQzOwkJeGFzX3NwbGl0X2FsbG9jKCZhbXA7eGFzLCBmb2xpbywgb2xkX29yZGVyLCBnZnApOwomIzQzOwkJaWYgKHhhc19lcnJvcigmYW1wO3hhcykpIHsKJiM0MzsJCQlyZXQgPSB4YXNfZXJyb3IoJmFtcDt4YXMpOwomIzQzOwkJCWdvdG8gZmFpbF9mcmVlOwogCQl9CiYjNDM7CX0KIAotCQl6b25lX2RldmljZV9wcml2YXRlX3NwbGl0X2NiKGZvbGlvLCBOVUxMKTsKLQkJLyoKLQkJICogVW5mcmVlemUgQGZvbGlvIG9ubHkgYWZ0ZXIgYWxsIHBhZ2UgY2FjaGUgZW50cmllcywgd2hpY2gKLQkJICogdXNlZCB0byBwb2ludCB0byBpdCwgaGF2ZSBiZWVuIHVwZGF0ZWQgd2l0aCBuZXcgZm9saW9zLgotCQkgKiBPdGhlcndpc2UsIGEgcGFyYWxsZWwgZm9saW9fdHJ5X2dldCgpIGNhbiBncmFiIEBmb2xpbwotCQkgKiBhbmQgaXRzIGNhbGxlciBjYW4gc2VlIHN0YWxlIHBhZ2UgY2FjaGUgZW50cmllcy4KLQkJICovCi0JCWZvbGlvX3JlZl91bmZyZWV6ZShmb2xpbywgZm9saW9fY2FjaGVfcmVmX2NvdW50KGZvbGlvKSAmIzQzOyAxKTsKJiM0MzsJaV9tbWFwX2xvY2tfcmVhZChtYXBwaW5nKTsKJiM0MzsKJiM0MzsJLyogUmFjeSBjaGVjayBpZiB3ZSBjYW4gc3BsaXQgdGhlIHBhZ2UsIGJlZm9yZSB1bm1hcF9mb2xpbygpICovCiYjNDM7CWlmIChmb2xpb19leHBlY3RlZF9yZWZfY291bnQoZm9saW8pICE9IGZvbGlvX3JlZl9jb3VudChmb2xpbykgLSAxKSB7CiYjNDM7CQlyZXQgPSAtRUFHQUlOOwomIzQzOwkJZ290byBmYWlsX21tYXBfdW5sb2NrOwomIzQzOwl9CiYjNDM7CiYjNDM7CS8qCiYjNDM7CSAqX19zcGxpdF91bm1hcHBlZF9mb2xpbygpIG1heSBuZWVkIHRvIHRyaW0gb2ZmIHBhZ2VzIGJleW9uZAomIzQzOwkgKiBFT0Y6IGJ1dCBvbiAzMi1iaXQsIGlfc2l6ZV9yZWFkKCkgdGFrZXMgYW4gaXJxLXVuc2FmZQomIzQzOwkgKiBzZXFsb2NrLCB3aGljaCBjYW5ub3QgYmUgbmVzdGVkIGluc2lkZSB0aGUgcGFnZSB0cmVlIGxvY2suCiYjNDM7CSAqIFNvIG5vdGUgZW5kIG5vdzogaV9zaXplIGl0c2VsZiBtYXkgYmUgY2hhbmdlZCBhdCBhbnkgbW9tZW50LAomIzQzOwkgKiBidXQgZm9saW8gbG9jayBpcyBnb29kIGVub3VnaCB0byBzZXJpYWxpemUgdGhlIHRyaW1taW5nLgomIzQzOwkgKi8KJiM0MzsJZW5kID0gRElWX1JPVU5EX1VQKGlfc2l6ZV9yZWFkKG1hcHBpbmctJmd0O2hvc3QpLCBQQUdFX1NJWkUpOwomIzQzOwlpZiAoc2htZW1fbWFwcGluZyhtYXBwaW5nKSkKJiM0MzsJCWVuZCA9IHNobWVtX2ZhbGxvY2VuZChtYXBwaW5nLSZndDtob3N0LCBlbmQpOwomIzQzOwomIzQzOwl1bm1hcF9mb2xpbyhmb2xpbyk7CiYjNDM7CiYjNDM7CXhhc19sb2NrX2lycSgmYW1wO3hhcyk7CiYjNDM7CiYjNDM7CS8qCiYjNDM7CSAqIENoZWNrIGlmIHRoZSBmb2xpbyBpcyBwcmVzZW50IGluIHBhZ2UgY2FjaGUuCiYjNDM7CSAqIFdlIGFzc3VtZSBhbGwgdGFpbCBhcmUgcHJlc2VudCB0b28sIGlmIGZvbGlvIGlzIHRoZXJlLgomIzQzOwkgKi8KJiM0MzsJaWYgKHhhc19sb2FkKCZhbXA7eGFzKSAhPSBmb2xpbykgewomIzQzOwkJcmV0ID0gLUVBR0FJTjsKJiM0MzsJCWdvdG8gZmFpbDsKJiM0MzsJfQomIzQzOwomIzQzOwlpZiAoIWZvbGlvX3JlZl9mcmVlemUoZm9saW8sIG9sZF9ucl9wYWdlcyAmIzQzOyAxKSkgewomIzQzOwkJcmV0ID0gLUVBR0FJTjsKJiM0MzsJCWdvdG8gZmFpbDsKJiM0MzsJfQomIzQzOwomIzQzOwlpZiAoZm9saW9fdGVzdF9wbWRfbWFwcGFibGUoZm9saW8pICZhbXA7JmFtcDsgbmV3X29yZGVyICZsdDsgSFBBR0VfUE1EX09SREVSKSB7CiYjNDM7CQlpZiAoZm9saW9fdGVzdF9zd2FwYmFja2VkKGZvbGlvKSkKJiM0MzsJCQlscnV2ZWNfc3RhdF9tb2RfZm9saW8oZm9saW8sIE5SX1NITUVNX1RIUFMsIC1vbGRfbnJfcGFnZXMpOwomIzQzOwkJZWxzZQomIzQzOwkJCWxydXZlY19zdGF0X21vZF9mb2xpbyhmb2xpbywgTlJfRklMRV9USFBTLCAtb2xkX25yX3BhZ2VzKTsKJiM0MzsJfQomIzQzOwomIzQzOwkvKiBsb2NrIGxydSBsaXN0L1BhZ2VDb21wb3VuZCwgcmVmIGZyb3plbiBieSBwYWdlX3JlZl9mcmVlemUgKi8KJiM0MzsJaWYgKGRvX2xydSkKJiM0MzsJCWxydXZlYyA9IGZvbGlvX2xydXZlY19sb2NrKGZvbGlvKTsKJiM0MzsKJiM0MzsJcmV0ID0gX19zcGxpdF91bm1hcHBlZF9mb2xpbyhmb2xpbywgbmV3X29yZGVyLCBzcGxpdF9hdCwgJmFtcDt4YXMsCiYjNDM7CQkJCSAgICAgbWFwcGluZywgc3BsaXRfdHlwZSk7CiYjNDM7CiYjNDM7CS8qCiYjNDM7CSAqIFVuZnJlZXplIGFmdGVyLXNwbGl0IGZvbGlvcyBhbmQgcHV0IHRoZW0gYmFjayB0byB0aGUgcmlnaHQKJiM0MzsJICogbGlzdC4gQGZvbGlvIHNob3VsZCBiZSBrZXB0IGZyb3plbiB1bnRpbCBwYWdlIGNhY2hlCiYjNDM7CSAqIGVudHJpZXMgYXJlIHVwZGF0ZWQgd2l0aCBhbGwgdGhlIG90aGVyIGFmdGVyLXNwbGl0IGZvbGlvcwomIzQzOwkgKiB0byBwcmV2ZW50IG90aGVycyBzZWVpbmcgc3RhbGUgcGFnZSBjYWNoZSBlbnRyaWVzLgomIzQzOwkgKiBBcyBhIHJlc3VsdCwgbmV3X2ZvbGlvIHN0YXJ0cyBmcm9tIHRoZSBuZXh0IGZvbGlvIG9mCiYjNDM7CSAqIEBmb2xpby4KJiM0MzsJICovCiYjNDM7CWZvciAobmV3X2ZvbGlvID0gZm9saW9fbmV4dChmb2xpbyk7IG5ld19mb2xpbyAhPSBlbmRfZm9saW87CiYjNDM7CSAgICAgbmV3X2ZvbGlvID0gbmV4dCkgewomIzQzOwkJdW5zaWduZWQgbG9uZyBucl9wYWdlcyA9IGZvbGlvX25yX3BhZ2VzKG5ld19mb2xpbyk7CiYjNDM7CiYjNDM7CQluZXh0ID0gZm9saW9fbmV4dChuZXdfZm9saW8pOwomIzQzOwomIzQzOwkJZm9saW9fcmVmX3VuZnJlZXplKG5ld19mb2xpbywKJiM0MzsJCQkJICAgZm9saW9fbnJfcGFnZXMobmV3X2ZvbGlvKSAmIzQzOyAxKTsKIAogCQlpZiAoZG9fbHJ1KQotCQkJbHJ1dmVjX3VubG9jayhscnV2ZWMpOwomIzQzOwkJCWxydV9hZGRfc3BsaXRfZm9saW8oZm9saW8sIG5ld19mb2xpbywgbHJ1dmVjLCBsaXN0KTsKIAotCQlpZiAoY2kpCi0JCQlzd2FwX2NsdXN0ZXJfdW5sb2NrKGNpKTsKLQl9IGVsc2UgewotCQlpZiAoZGVxdWV1ZV9kZWZlcnJlZCkgewotCQkJbGlzdF9scnVfdW5sb2NrKGxydSk7Ci0JCQlyY3VfcmVhZF91bmxvY2soKTsKJiM0MzsJCS8qIEFkZCB0aGUgbmV3IGZvbGlvIHRvIHRoZSBwYWdlIGNhY2hlLiAqLwomIzQzOwkJaWYgKG5ld19mb2xpby0mZ3Q7aW5kZXggJmx0OyBlbmQpIHsKJiM0MzsJCQlfX3hhX3N0b3JlKCZhbXA7bWFwcGluZy0mZ3Q7aV9wYWdlcywgbmV3X2ZvbGlvLSZndDtpbmRleCwKJiM0MzsJCQkJICAgbmV3X2ZvbGlvLCAwKTsKJiM0MzsJCQljb250aW51ZTsKIAkJfQotCQlyZXR1cm4gLUVBR0FJTjsKJiM0MzsKJiM0MzsJCS8qIERyb3AgZm9saW8gYmV5b25kIEVPRjogLSZndDtpbmRleCAmZ3Q7PSBlbmQgKi8KJiM0MzsJCWlmIChzaG1lbV9tYXBwaW5nKG1hcHBpbmcpKQomIzQzOwkJCW5yX3NobWVtX2Ryb3BwZWQgJiM0Mzs9IG5yX3BhZ2VzOwomIzQzOwkJZWxzZSBpZiAoZm9saW9fdGVzdF9jbGVhcl9kaXJ0eShuZXdfZm9saW8pKQomIzQzOwkJCWZvbGlvX2FjY291bnRfY2xlYW5lZChuZXdfZm9saW8sCiYjNDM7CQkJCQkgICAgICBpbm9kZV90b193YihtYXBwaW5nLSZndDtob3N0KSk7CiYjNDM7CQlfX2ZpbGVtYXBfcmVtb3ZlX2ZvbGlvKG5ld19mb2xpbywgTlVMTCk7CiYjNDM7CQlmb2xpb19wdXRfcmVmcyhuZXdfZm9saW8sIG5yX3BhZ2VzKTsKIAl9CiAKJiM0MzsJLyoKJiM0MzsJICogVW5mcmVlemUgQGZvbGlvIG9ubHkgYWZ0ZXIgYWxsIHBhZ2UgY2FjaGUgZW50cmllcywgd2hpY2gKJiM0MzsJICogdXNlZCB0byBwb2ludCB0byBpdCwgaGF2ZSBiZWVuIHVwZGF0ZWQgd2l0aCBuZXcgZm9saW9zLgomIzQzOwkgKiBPdGhlcndpc2UsIGEgcGFyYWxsZWwgZm9saW9fdHJ5X2dldCgpIGNhbiBncmFiIEBmb2xpbwomIzQzOwkgKiBhbmQgaXRzIGNhbGxlciBjYW4gc2VlIHN0YWxlIHBhZ2UgY2FjaGUgZW50cmllcy4KJiM0MzsJICovCiYjNDM7CWZvbGlvX3JlZl91bmZyZWV6ZShmb2xpbywgZm9saW9fbnJfcGFnZXMoZm9saW8pICYjNDM7IDEpOwomIzQzOwomIzQzOwlpZiAoZG9fbHJ1KQomIzQzOwkJbHJ1dmVjX3VubG9jayhscnV2ZWMpOwomIzQzOwomIzQzO2ZhaWw6CiYjNDM7CXhhc191bmxvY2tfaXJxKCZhbXA7eGFzKTsKJiM0MztmYWlsX21tYXBfdW5sb2NrOgomIzQzOwlpZiAobnJfc2htZW1fZHJvcHBlZCkKJiM0MzsJCXNobWVtX3VuY2hhcmdlKG1hcHBpbmctJmd0O2hvc3QsIG5yX3NobWVtX2Ryb3BwZWQpOwomIzQzOwkvKgomIzQzOwkgKiBEcm9wIHRoZSBtYXBwaW5nIHdoaWxlIHRoZSBpbm9kZSBpcyBzdGlsbCBwaW5uZWQuIEBmb2xpbyBzdGF5cwomIzQzOwkgKiBsb2NrZWQgYW5kIHByZXNlbnQgaW4gdGhlIHBhZ2UgY2FjaGUsIHNvIGV2aWN0aW9uIGNhbm5vdCBmcmVlCiYjNDM7CSAqIHRoZSBpbm9kZSB5ZXQsIG5vdGhpbmcgcGFzdCB0aGlzIHBvaW50IG1heSB0b3VjaCB0aGUgaW5vZGUgb3IKJiM0MzsJICogdGhlIG1hcHBpbmcuCiYjNDM7CSAqLwomIzQzOwlpX21tYXBfdW5sb2NrX3JlYWQobWFwcGluZyk7CiYjNDM7ZmFpbF9mcmVlOgomIzQzOwkvKiBSZXN0b3JlIHRoZSBwcmV2aW91c2x5IGFjdGl2ZSBtZW1jZyAqLwomIzQzOwlzZXRfYWN0aXZlX21lbWNnKG9sZF9tZW1jZyk7CiYjNDM7CW1lbV9jZ3JvdXBfcHV0KG1lbWNnKTsKJiM0MzsJeGFzX2Rlc3Ryb3koJmFtcDt4YXMpOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTQxMDIsMTcgJiM0Mzs0MjQ4LDExIEBAIHN0YXRpYyBpbnQgX19mb2xpb19zcGxpdChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyLAogCQlzdHJ1Y3QgcGFnZSAqc3BsaXRfYXQsIHN0cnVjdCBwYWdlICpsb2NrX2F0LAogCQlzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LCBlbnVtIHNwbGl0X3R5cGUgc3BsaXRfdHlwZSkKIHsKLQlYQV9TVEFURSh4YXMsICZhbXA7Zm9saW8tJmd0O21hcHBpbmctJmd0O2lfcGFnZXMsIGZvbGlvLSZndDtpbmRleCk7CiYjNDM7CWJvb2wgaXNfc3dhcGNhY2hlID0gZm9saW9fdGVzdF9zd2FwY2FjaGUoZm9saW8pOwogCXN0cnVjdCBmb2xpbyAqZW5kX2ZvbGlvID0gZm9saW9fbmV4dChmb2xpbyk7CiAJYm9vbCBpc19hbm9uID0gZm9saW9fdGVzdF9hbm9uKGZvbGlvKTsKLQlzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csICpvbGRfbWVtY2c7Ci0Jc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSBOVUxMOwotCXN0cnVjdCBhbm9uX3ZtYSAqYW5vbl92bWEgPSBOVUxMOwogCWludCBvbGRfb3JkZXIgPSBmb2xpb19vcmRlcihmb2xpbyk7CiAJc3RydWN0IGZvbGlvICpuZXdfZm9saW8sICpuZXh0OwotCWludCBucl9zaG1lbV9kcm9wcGVkID0gMDsKLQllbnVtIHR0dV9mbGFncyB0dHVfZmxhZ3MgPSAwOwotCXBnb2ZmX3QgZW5kID0gMDsKIAlpbnQgcmV0OwogCiAJVk1fV0FSTl9PTl9PTkNFX0ZPTElPKCFmb2xpb190ZXN0X2xvY2tlZChmb2xpbyksIGZvbGlvKTsKQEAgLTQxMjAsMTQxICYjNDM7NDI2MCwyOSBAQCBzdGF0aWMgaW50IF9fZm9saW9fc3BsaXQoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlciwKIAogCWlmIChmb2xpbyAhPSBwYWdlX2ZvbGlvKHNwbGl0X2F0KSB8fCBmb2xpbyAhPSBwYWdlX2ZvbGlvKGxvY2tfYXQpKSB7CiAJCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gb3V0X25vX21lbWNnOwomIzQzOwkJZ290byBvdXQ7CiAJfQogCiAJaWYgKG5ld19vcmRlciAmZ3Q7PSBvbGRfb3JkZXIpIHsKIAkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBvdXRfbm9fbWVtY2c7CiYjNDM7CQlnb3RvIG91dDsKIAl9CiAKIAlyZXQgPSBmb2xpb19jaGVja19zcGxpdHRhYmxlKGZvbGlvLCBuZXdfb3JkZXIsIHNwbGl0X3R5cGUpOwogCWlmIChyZXQpIHsKIAkJVk1fV0FSTl9PTkNFKHJldCA9PSAtRUlOVkFMLCAmIzM0O1RyaWVkIHRvIHNwbGl0IGFuIHVuc3BsaXR0YWJsZSBmb2xpbyYjMzQ7KTsKLQkJZ290byBvdXRfbm9fbWVtY2c7Ci0JfQotCi0JLyoKLQkgKiBzd2l0Y2ggdG8gZm9saW8mIzM5O3MgbWVtY2cgYXMgeGFycmF5IG5vZGUgYWxsb2NhdGlvbiBjYW4gaGFwcGVuIGFuZAotCSAqIG5lZWRzIHRvIGNoYXJnZSB0byBpdC4KLQkgKi8KLQltZW1jZyA9IGdldF9tZW1fY2dyb3VwX2Zyb21fZm9saW8oZm9saW8pOwotCW9sZF9tZW1jZyA9IHNldF9hY3RpdmVfbWVtY2cobWVtY2cpOwotCi0JaWYgKGlzX2Fub24pIHsKLQkJLyoKLQkJICogVGhlIGNhbGxlciBkb2VzIG5vdCBuZWNlc3NhcmlseSBob2xkIGFuIG1tYXBfbG9jayB0aGF0IHdvdWxkCi0JCSAqIHByZXZlbnQgdGhlIGFub25fdm1hIGRpc2FwcGVhcmluZyBzbyB3ZSBmaXJzdCB3ZSB0YWtlIGEKLQkJICogcmVmZXJlbmNlIHRvIGl0IGFuZCB0aGVuIGxvY2sgdGhlIGFub25fdm1hIGZvciB3cml0ZS4gVGhpcwotCQkgKiBpcyBzaW1pbGFyIHRvIGZvbGlvX2xvY2tfYW5vbl92bWFfcmVhZCBleGNlcHQgdGhlIHdyaXRlIGxvY2sKLQkJICogaXMgdGFrZW4gdG8gc2VyaWFsaXNlIGFnYWluc3QgcGFyYWxsZWwgc3BsaXQgb3IgY29sbGFwc2UKLQkJICogb3BlcmF0aW9ucy4KLQkJICovCi0JCWFub25fdm1hID0gZm9saW9fZ2V0X2Fub25fdm1hKGZvbGlvKTsKLQkJaWYgKCFhbm9uX3ZtYSkgewotCQkJcmV0ID0gLUVCVVNZOwotCQkJZ290byBvdXQ7Ci0JCX0KLQkJYW5vbl92bWFfbG9ja193cml0ZShhbm9uX3ZtYSk7Ci0JCW1hcHBpbmcgPSBOVUxMOwotCX0gZWxzZSB7Ci0JCXVuc2lnbmVkIGludCBtaW5fb3JkZXI7Ci0JCWdmcF90IGdmcDsKLQotCQltYXBwaW5nID0gZm9saW8tJmd0O21hcHBpbmc7Ci0JCW1pbl9vcmRlciA9IG1hcHBpbmdfbWluX2ZvbGlvX29yZGVyKG1hcHBpbmcpOwotCQlpZiAobmV3X29yZGVyICZsdDsgbWluX29yZGVyKSB7Ci0JCQlyZXQgPSAtRUlOVkFMOwotCQkJZ290byBvdXQ7Ci0JCX0KLQotCQlnZnAgPSBjdXJyZW50X2dmcF9jb250ZXh0KG1hcHBpbmdfZ2ZwX21hc2sobWFwcGluZykgJmFtcDsKLQkJCQkJCQlHRlBfUkVDTEFJTV9NQVNLKTsKLQotCQlpZiAoIWZpbGVtYXBfcmVsZWFzZV9mb2xpbyhmb2xpbywgZ2ZwKSkgewotCQkJcmV0ID0gLUVCVVNZOwotCQkJZ290byBvdXQ7Ci0JCX0KLQotCQltYXBwaW5nX3NldF91cGRhdGUoJmFtcDt4YXMsIG1hcHBpbmcpOwotCi0JCWlmIChzcGxpdF90eXBlID09IFNQTElUX1RZUEVfVU5JRk9STSkgewotCQkJeGFzX3NldF9vcmRlcigmYW1wO3hhcywgZm9saW8tJmd0O2luZGV4LCBuZXdfb3JkZXIpOwotCQkJeGFzX3NwbGl0X2FsbG9jKCZhbXA7eGFzLCBmb2xpbywgb2xkX29yZGVyLCBnZnApOwotCQkJaWYgKHhhc19lcnJvcigmYW1wO3hhcykpIHsKLQkJCQlyZXQgPSB4YXNfZXJyb3IoJmFtcDt4YXMpOwotCQkJCWdvdG8gb3V0OwotCQkJfQotCQl9Ci0KLQkJYW5vbl92bWEgPSBOVUxMOwotCQlpX21tYXBfbG9ja19yZWFkKG1hcHBpbmcpOwotCi0JCS8qCi0JCSAqX19zcGxpdF91bm1hcHBlZF9mb2xpbygpIG1heSBuZWVkIHRvIHRyaW0gb2ZmIHBhZ2VzIGJleW9uZAotCQkgKiBFT0Y6IGJ1dCBvbiAzMi1iaXQsIGlfc2l6ZV9yZWFkKCkgdGFrZXMgYW4gaXJxLXVuc2FmZQotCQkgKiBzZXFsb2NrLCB3aGljaCBjYW5ub3QgYmUgbmVzdGVkIGluc2lkZSB0aGUgcGFnZSB0cmVlIGxvY2suCi0JCSAqIFNvIG5vdGUgZW5kIG5vdzogaV9zaXplIGl0c2VsZiBtYXkgYmUgY2hhbmdlZCBhdCBhbnkgbW9tZW50LAotCQkgKiBidXQgZm9saW8gbG9jayBpcyBnb29kIGVub3VnaCB0byBzZXJpYWxpemUgdGhlIHRyaW1taW5nLgotCQkgKi8KLQkJZW5kID0gRElWX1JPVU5EX1VQKGlfc2l6ZV9yZWFkKG1hcHBpbmctJmd0O2hvc3QpLCBQQUdFX1NJWkUpOwotCQlpZiAoc2htZW1fbWFwcGluZyhtYXBwaW5nKSkKLQkJCWVuZCA9IHNobWVtX2ZhbGxvY2VuZChtYXBwaW5nLSZndDtob3N0LCBlbmQpOwotCX0KLQotCS8qCi0JICogUmFjeSBjaGVjayBpZiB3ZSBjYW4gc3BsaXQgdGhlIHBhZ2UsIGJlZm9yZSB1bm1hcF9mb2xpbygpIHdpbGwKLQkgKiBzcGxpdCBQTURzCi0JICovCi0JaWYgKGZvbGlvX2V4cGVjdGVkX3JlZl9jb3VudChmb2xpbykgIT0gZm9saW9fcmVmX2NvdW50KGZvbGlvKSAtIDEpIHsKLQkJcmV0ID0gLUVBR0FJTjsKLQkJZ290byBvdXRfdW5sb2NrOwotCX0KLQotCXVubWFwX2ZvbGlvKGZvbGlvKTsKLQotCS8qIGJsb2NrIGludGVycnVwdCByZWVudHJ5IGluIHhhX2xvY2sgYW5kIHNwaW5sb2NrICovCi0JbG9jYWxfaXJxX2Rpc2FibGUoKTsKLQlpZiAobWFwcGluZykgewotCQkvKgotCQkgKiBDaGVjayBpZiB0aGUgZm9saW8gaXMgcHJlc2VudCBpbiBwYWdlIGNhY2hlLgotCQkgKiBXZSBhc3N1bWUgYWxsIHRhaWwgYXJlIHByZXNlbnQgdG9vLCBpZiBmb2xpbyBpcyB0aGVyZS4KLQkJICovCi0JCXhhc19sb2NrKCZhbXA7eGFzKTsKLQkJeGFzX3Jlc2V0KCZhbXA7eGFzKTsKLQkJaWYgKHhhc19sb2FkKCZhbXA7eGFzKSAhPSBmb2xpbykgewotCQkJcmV0ID0gLUVBR0FJTjsKLQkJCWdvdG8gZmFpbDsKLQkJfQomIzQzOwkJZ290byBvdXQ7CiAJfQogCi0JcmV0ID0gX19mb2xpb19mcmVlemVfYW5kX3NwbGl0X3VubWFwcGVkKGZvbGlvLCBuZXdfb3JkZXIsIHNwbGl0X2F0LCAmYW1wO3hhcywgbWFwcGluZywKLQkJCQkJCXRydWUsIGxpc3QsIHNwbGl0X3R5cGUsIGVuZCwgJmFtcDtucl9zaG1lbV9kcm9wcGVkKTsKLWZhaWw6Ci0JaWYgKG1hcHBpbmcpCi0JCXhhc191bmxvY2soJmFtcDt4YXMpOwotCi0JbG9jYWxfaXJxX2VuYWJsZSgpOwotCi0JaWYgKG5yX3NobWVtX2Ryb3BwZWQpCi0JCXNobWVtX3VuY2hhcmdlKG1hcHBpbmctJmd0O2hvc3QsIG5yX3NobWVtX2Ryb3BwZWQpOwotCi0JaWYgKCFyZXQgJmFtcDsmYW1wOyBpc19hbm9uICZhbXA7JmFtcDsgIWZvbGlvX2lzX2RldmljZV9wcml2YXRlKGZvbGlvKSkKLQkJdHR1X2ZsYWdzID0gVFRVX1VTRV9TSEFSRURfWkVST1BBR0U7Ci0KLQlyZW1hcF9wYWdlKGZvbGlvLCAxICZsdDsmbHQ7IG9sZF9vcmRlciwgdHR1X2ZsYWdzKTsKLQotCS8qCi0JICogRHJvcCB0aGUgbWFwcGluZyB3aGlsZSB0aGUgaW5vZGUgaXMgc3RpbGwgcGlubmVkLiBAZm9saW8gc3RheXMKLQkgKiBsb2NrZWQgYW5kIHByZXNlbnQgaW4gdGhlIHBhZ2UgY2FjaGUgdW50aWwgdGhlIGxvb3AgYmVsb3csIHNvCi0JICogZXZpY3Rpb24gY2Fubm90IGZyZWUgdGhlIGlub2RlIHlldDsgQGxvY2tfYXQgaXMgbm90IGVub3VnaCwgaXQgbWF5Ci0JICogYmUgYSB0YWlsIGJleW9uZCBFT0YgdGhhdCB0aGUgc3BsaXQgYWxyZWFkeSBkcm9wcGVkIGZyb20gdGhlIHBhZ2UKLQkgKiBjYWNoZS4gTm90aGluZyBwYXN0IHRoaXMgcG9pbnQgbWF5IHRvdWNoIHRoZSBpbm9kZSBvciB0aGUgbWFwcGluZy4KLQkgKi8KLQlpZiAobWFwcGluZykgewotCQlpX21tYXBfdW5sb2NrX3JlYWQobWFwcGluZyk7Ci0JCW1hcHBpbmcgPSBOVUxMOwotCX0KJiM0MzsJaWYgKGlzX2Fub24pCiYjNDM7CQlyZXQgPSBfX2ZvbGlvX2ZyZWV6ZV9zcGxpdF91bm1hcChmb2xpbywgbmV3X29yZGVyLCBzcGxpdF9hdCwgdHJ1ZSwKJiM0MzsJCQkJCQkgdHJ1ZSwgbGlzdCwgc3BsaXRfdHlwZSk7CiYjNDM7CWVsc2UgaWYgKGlzX3N3YXBjYWNoZSkKJiM0MzsJCXJldCA9IF9fZm9saW9fZnJlZXplX3NwbGl0X3VubWFwKGZvbGlvLCBuZXdfb3JkZXIsIHNwbGl0X2F0LCB0cnVlLAomIzQzOwkJCQkJCSBmYWxzZSwgbGlzdCwgc3BsaXRfdHlwZSk7CiYjNDM7CWVsc2UKJiM0MzsJCXJldCA9IF9fZm9saW9fZnJlZXplX3NwbGl0X3VubWFwX2ZpbGUoZm9saW8sIG5ld19vcmRlciwgc3BsaXRfYXQsCiYjNDM7CQkJCQkJICAgICAgdHJ1ZSwgbGlzdCwgc3BsaXRfdHlwZSk7CiAKIAkvKgogCSAqIFVubG9jayBhbGwgYWZ0ZXItc3BsaXQgZm9saW9zIGV4Y2VwdCB0aGUgb25lIGNvbnRhaW5pbmcKQEAgLTQyNjUsMjkgJiM0Mzs0MjkzLDE5IEBAIHN0YXRpYyBpbnQgX19mb2xpb19zcGxpdChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyLAogCQlpZiAobmV3X2ZvbGlvID09IHBhZ2VfZm9saW8obG9ja19hdCkpCiAJCQljb250aW51ZTsKIAotCQlmb2xpb191bmxvY2sobmV3X2ZvbGlvKTsKIAkJLyoKIAkJICogU3VicGFnZXMgd2hvc2UgbWFwcGluZyBoYXMgYmVlbiB6YXBwZWQgbWF5IGJlIGZyZWVkCiAJCSAqIGVhcmxpZXIsIGJ1dCBmcmVlaW5nIHRoZW0gcmVxdWlyZXMgdGFraW5nIHRoZQogCQkgKiBscnVfbG9jaywgc28gd2UgZGVmZXIgcHV0X3BhZ2UoKSBvbiB0YWlsIHBhZ2VzIHVudGlsCiAJCSAqIGFmdGVyIHRoZSBzcGxpdCBjb21wbGV0ZXMuCiAJCSAqLwotCQlmcmVlX2ZvbGlvX2FuZF9zd2FwX2NhY2hlKG5ld19mb2xpbyk7CiYjNDM7CQlpZiAoaXNfc3dhcGNhY2hlKQomIzQzOwkJCWZvbGlvX2ZyZWVfc3dhcChuZXdfZm9saW8pOwomIzQzOwkJZm9saW9fdW5sb2NrKG5ld19mb2xpbyk7CiYjNDM7CQlmb2xpb19wdXQobmV3X2ZvbGlvKTsKIAl9CiAKLW91dF91bmxvY2s6Ci0JaWYgKGFub25fdm1hKSB7Ci0JCWFub25fdm1hX3VubG9ja193cml0ZShhbm9uX3ZtYSk7Ci0JCXB1dF9hbm9uX3ZtYShhbm9uX3ZtYSk7Ci0JfQotCWlmIChtYXBwaW5nKQotCQlpX21tYXBfdW5sb2NrX3JlYWQobWFwcGluZyk7CiBvdXQ6Ci0JLyogcmVzdG9yZSB0byBjYWxsZXImIzM5O3Mgb2xkX21lbWNnICovCi0Jc2V0X2FjdGl2ZV9tZW1jZyhvbGRfbWVtY2cpOwotCW1lbV9jZ3JvdXBfcHV0KG1lbWNnKTsKLW91dF9ub19tZW1jZzoKLQl4YXNfZGVzdHJveSgmYW1wO3hhcyk7CiAJaWYgKGlzX3BtZF9vcmRlcihvbGRfb3JkZXIpKQogCQljb3VudF92bV9ldmVudCghcmV0ID8gVEhQX1NQTElUX1BBR0UgOiBUSFBfU1BMSVRfUEFHRV9GQUlMRUQpOwogCWNvdW50X210aHBfc3RhdChvbGRfb3JkZXIsICFyZXQgPyBNVEhQX1NUQVRfU1BMSVQgOiBNVEhQX1NUQVRfU1BMSVRfRkFJTEVEKTsKQEAgLTQzMTgsMjIgJiM0Mzs0MzM2LDEzIEBAIHN0YXRpYyBpbnQgX19mb2xpb19zcGxpdChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyLAogICovCiBpbnQgZm9saW9fc3BsaXRfdW5tYXBwZWQoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlcikKIHsKLQlpbnQgcmV0ID0gMDsKLQogCVZNX1dBUk5fT05fT05DRV9GT0xJTyhmb2xpb19tYXBwZWQoZm9saW8pLCBmb2xpbyk7CiAJVk1fV0FSTl9PTl9PTkNFX0ZPTElPKCFmb2xpb190ZXN0X2xvY2tlZChmb2xpbyksIGZvbGlvKTsKIAlWTV9XQVJOX09OX09OQ0VfRk9MSU8oIWZvbGlvX3Rlc3RfbGFyZ2UoZm9saW8pLCBmb2xpbyk7CiAJVk1fV0FSTl9PTl9PTkNFX0ZPTElPKCFmb2xpb190ZXN0X2Fub24oZm9saW8pLCBmb2xpbyk7CiAKLQlpZiAoZm9saW9fZXhwZWN0ZWRfcmVmX2NvdW50KGZvbGlvKSAhPSBmb2xpb19yZWZfY291bnQoZm9saW8pIC0gMSkKLQkJcmV0dXJuIC1FQUdBSU47Ci0KLQlsb2NhbF9pcnFfZGlzYWJsZSgpOwotCXJldCA9IF9fZm9saW9fZnJlZXplX2FuZF9zcGxpdF91bm1hcHBlZChmb2xpbywgbmV3X29yZGVyLCAmYW1wO2ZvbGlvLSZndDtwYWdlLCBOVUxMLAotCQkJCQkJTlVMTCwgZmFsc2UsIE5VTEwsIFNQTElUX1RZUEVfVU5JRk9STSwKLQkJCQkJCTAsIE5VTEwpOwotCWxvY2FsX2lycV9lbmFibGUoKTsKLQlyZXR1cm4gcmV0OwomIzQzOwlyZXR1cm4gX19mb2xpb19mcmVlemVfc3BsaXRfdW5tYXAoZm9saW8sIG5ld19vcmRlciwgJmFtcDtmb2xpby0mZ3Q7cGFnZSwgZmFsc2UsCiYjNDM7CQkJCQkgIGZhbHNlLCBOVUxMLCBTUExJVF9UWVBFX1VOSUZPUk0pOwogfQogCiAvKgpAQCAtNDM1MiwxMSAmIzQzOzQzNjEsMTEgQEAgaW50IGZvbGlvX3NwbGl0X3VubWFwcGVkKHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIpCiAgKiAgICBHVVAgcGlucywgd2lsbCByZXN1bHQgaW4gdGhlIGZvbGlvIG5vdCBnZXR0aW5nIHNwbGl0OyBpbnN0ZWFkLCB0aGUgY2FsbGVyCiAgKiAgICB3aWxsIHJlY2VpdmUgYW4gLUVBR0FJTi4KICAqCi0gKiA0KSBAbmV3X29yZGVyICZndDsgMSwgdXN1YWxseS4gU3BsaXR0aW5nIHRvIG9yZGVyLTEgYW5vbnltb3VzIGZvbGlvcyBpcyBub3QKLSAqICAgIHN1cHBvcnRlZCBmb3Igbm9uLWZpbGUtYmFja2VkIGZvbGlvcywgYmVjYXVzZSBmb2xpby0mZ3Q7X2RlZmVycmVkX2xpc3QsIHdoaWNoCi0gKiAgICBpcyB1c2VkIGJ5IHBhcnRpYWxseSBtYXBwZWQgZm9saW9zLCBpcyBzdG9yZWQgaW4gc3VicGFnZSAyLCBidXQgYW4gb3JkZXItMQotICogICAgZm9saW8gb25seSBoYXMgc3VicGFnZXMgMCBhbmQgMS4gRmlsZS1iYWNrZWQgb3JkZXItMSBmb2xpb3MgYXJlIHN1cHBvcnRlZCwKLSAqICAgIHNpbmNlIHRoZXkgZG8gbm90IHVzZSBfZGVmZXJyZWRfbGlzdC4KJiM0MzsgKiA0KSBAbmV3X29yZGVyICZndDsgMSwgdXN1YWxseS4gT3JkZXItMSBpcyBub3Qgc3VwcG9ydGVkIGZvciBhbm9uIG9yIHN3YXBjYWNoZQomIzQzOyAqICAgIGZvbGlvczogYW5vbiBmb2xpb3MgbmVlZCBzdWJwYWdlIDIgZm9yIF9kZWZlcnJlZF9saXN0LCB3aGljaCBvcmRlci0xCiYjNDM7ICogICAgZm9saW9zIGxhY2ssIGFuZCBhIHN3YXBjYWNoZSBmb2xpbyBtYXkgYmVjb21lIGFub24gb25jZSBmYXVsdGVkIGluLgomIzQzOyAqICAgIEZpbGUtYmFja2VkIG9yZGVyLTEgZm9saW9zIGFyZSBzdXBwb3J0ZWQsIHNpbmNlIHRoZXkgZG8gbm90IHVzZQomIzQzOyAqICAgIF9kZWZlcnJlZF9saXN0LgogICoKICAqIEFmdGVyIHNwbGl0dGluZywgdGhlIGNhbGxlciYjMzk7cyBmb2xpbyByZWZlcmVuY2Ugd2lsbCBiZSB0cmFuc2ZlcnJlZCB0byBAcGFnZSwKICAqIHJlc3VsdGluZyBpbiBhIHJhaXNlZCByZWZjb3VudCBvZiBAcGFnZSBhZnRlciB0aGlzIGNhbGwuIFRoZSBvdGhlciBwYWdlcyBtYXkKZGlmZiAtLWdpdCBhL21tL3N3YXBfc3RhdGUuYyBiL21tL3N3YXBfc3RhdGUuYwppbmRleCA1YmU4MjU5MTFlNjQ1Li5mMTQwNWU1YjgxM2VlIDEwMDY0NAotLS0gYS9tbS9zd2FwX3N0YXRlLmMKJiM0MzsmIzQzOyYjNDM7IGIvbW0vc3dhcF9zdGF0ZS5jCkBAIC0zODgsOCAmIzQzOzM4OCw5IEBAIHZvaWQgX19zd2FwX2NhY2hlX3JlcGxhY2VfZm9saW8oc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSwKIAkgICAgZm9saW9fb3JkZXIob2xkKSAhPSBmb2xpb19vcmRlcihuZXcpKSB7CiAJCWNpX29mZiA9IHN3cF9jbHVzdGVyX29mZnNldChvbGQtJmd0O3N3YXApOwogCQljaV9lbmQgPSBjaV9vZmYgJiM0MzsgZm9saW9fbnJfcGFnZXMob2xkKTsKLQkJd2hpbGUgKGNpX29mZiYjNDM7JiM0MzsgJmx0OyBjaV9lbmQpCiYjNDM7CQlkbyB7CiAJCQlXQVJOX09OX09OQ0Uoc3dwX3RiX3RvX2ZvbGlvKF9fc3dhcF90YWJsZV9nZXQoY2ksIGNpX29mZikpICE9IG9sZCk7CiYjNDM7CQl9IHdoaWxlICgmIzQzOyYjNDM7Y2lfb2ZmICZsdDsgY2lfZW5kKTsKIAl9CiB9CiAKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+My8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDcgMjE6NTQ8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTE0MTkKCQkJCQkJCW91dHB1dDogMzIKCQkJCQkJCXRob3VnaHRzOiAzNTcKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIHRoZSBGb2xpbyBTcGxpdHRpbmcgUGF0Y2gqKgoKQWxyaWdodCwgbGV0JiMzOTtzIGJyZWFrIGRvd24gdGhpcyBwYXRjaC4gSSBzZWUgbW9kaWZpY2F0aW9ucyB0b3VjaGluZyBgbW0vaHVnZV9tZW1vcnkuY2AgYW5kIGBtbS9zd2FwX3N0YXRlLmNgLiBJdCYjMzk7cyBjbGVhcmx5IGEgY29yZSBtZW1vcnkgbWFuYWdlbWVudCBjaGFuZ2UsIHNwZWNpZmljYWxseSByZWxhdGVkIHRvIGhvdyB3ZSBoYW5kbGUgZm9saW8gc3BsaXR0aW5nLCBwYXJ0aWN1bGFybHkgYXJvdW5kIGh1Z2UgcGFnZXMuIFRoZSBmYWN0IHRoYXQgaXQgcmV3b3JrcyB0aGUgc3BsaXR0aW5nIG9mIHVubWFwcGVkIGZvbGlvcyDigJMgYW5kLCBjcml0aWNhbGx5LCBkaXN0aW5ndWlzaGVzIGJldHdlZW4gYW5vbnltb3VzLCBzd2FwY2FjaGUsIGFuZCBmaWxlLWJhY2tlZCBmb2xpb3Mg4oCTIGltbWVkaWF0ZWx5IHRlbGxzIG1lIHRoaXMgaGFzIGZ1bmN0aW9uYWwgaW1wbGljYXRpb25zIHdlIG5lZWQgdG8gcmVhbGx5IGRpZyBpbnRvLiBEZWZpbml0ZWx5IGZ1enppbmcgbWF0ZXJpYWwuCgpJJiMzOTttIHNlZWluZyB0aGF0IGBfX2ZvbGlvX2ZyZWV6ZV9zcGxpdF91bm1hcGAgYW5kIGBfX2ZvbGlvX2ZyZWV6ZV9zcGxpdF91bm1hcF9maWxlYCBoYXZlIGJlZW4gaW50cm9kdWNlZCB0byByZXBsYWNlIGBfX2ZvbGlvX2ZyZWV6ZV9hbmRfc3BsaXRfdW5tYXBwZWRgLCB3aGljaCBpcyBhIHN0cm9uZyBpbmRpY2F0b3Igb2YgcmVmaW5lZCBsb2dpYyBoZXJlLiBUaGVyZSYjMzk7cyBhbHNvIHNvbWUgc3VidGxlIGJlaGF2aW9yIGNoYW5nZXMgaW4gYGZvbGlvX2NoZWNrX3NwbGl0dGFibGVgIHdoZW4gaXQgY29tZXMgdG8gc3dhcGNhY2hlIGZvbGlvcy4gVGhlIGNvcmUgb2YgdGhpcyBzZWVtcyB0byBiZSBkcml2ZW4gYnkgbW9kaWZpY2F0aW9ucyB0byB0aGUgYF9fZm9saW9fc3BsaXRgIGZ1bmN0aW9uLCB3aGljaCBub3cgY2FsbHMgdGhlIG5ld2x5IGRlZmluZWQgZnVuY3Rpb25zLgoKTm93LCBsZXQmIzM5O3MgaWRlbnRpZnkgdGhlIGtleSBmdW5jdGlvbnMgdG8gcmVhbGx5IGZvY3VzIG9uLiBJJiMzOTttIHNlZWluZyBjaGFuZ2VzIHRvOiBgZm9saW9fY2hlY2tfc3BsaXR0YWJsZWAsIHRoZSBzdGF0aWMgaGVscGVycyBgX19mb2xpb19mcmVlemVfc3BsaXRfdW5tYXBgLCBgX19mb2xpb19mcmVlemVfc3BsaXRfdW5tYXBfZmlsZWAgYW5kIGBfX2ZvbGlvX3NwbGl0YCwgYW5kIHRoZSBnbG9iYWwgZnVuY3Rpb25zIGBmb2xpb19zcGxpdF91bm1hcHBlZGAgYW5kIGBfX3N3YXBfY2FjaGVfcmVwbGFjZV9mb2xpb2AuCgpPa2F5LCBteSBpbml0aWFsIHRob3VnaHRzIHBvaW50IG1lIHRvd2FyZHMgYGZvbGlvX3NwbGl0X3VubWFwcGVkYCBhbmQgaXRzIGludGVyYWN0aW9uIHdpdGggYHNwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyYC4gYHNwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyYCBsb29rcyBsaWtlIHRoZSBtYWluIGVudHJ5IHBvaW50IGZvciBzcGxpdHRpbmcgaHVnZSBwYWdlcywgdGhlIHJlYWwgbWVhdCBvZiB0aGUgb3BlcmF0aW9uLiBTbywgSSBzaG91bGQgc3RhcnQgYnkgbG9va2luZyBmb3Igd2hlcmUgYHNwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyYCBvciBzaW1wbHkgYHNwbGl0X2h1Z2VfcGFnZWAgaXMgY2FsbGVkIHdpdGhpbiBgbW0vaHVnZV9tZW1vcnkuY2AgdG8gc2VlIGhvdyBpdCYjMzk7cyBiZWluZyBpbnZva2VkLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA3IDIxOjU0PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O3NwbGl0X2h1Z2VfcGFnZSYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O21tL2h1Z2VfbWVtb3J5LmMmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bW0vaHVnZV9tZW1vcnkuYz00MzM3PWludCBmb2xpb19zcGxpdF91bm1hcHBlZChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyKVxuLS1cbm1tL2h1Z2VfbWVtb3J5LmMtNDM5NC0gKi9cbm1tL2h1Z2VfbWVtb3J5LmM6NDM5NTppbnQgX19zcGxpdF9odWdlX3BhZ2VfdG9fbGlzdF90b19vcmRlcihzdHJ1Y3QgcGFnZSAqcGFnZSwgc3RydWN0IGxpc3RfaGVhZCAqbGlzdCxcbm1tL2h1Z2VfbWVtb3J5LmMtNDM5Ni1cdFx0XHRcdCAgICAgdW5zaWduZWQgaW50IG5ld19vcmRlcilcbi0tXG5tbS9odWdlX21lbW9yeS5jLTQ0MTItICogSXQgaGFzIHRoZSBzYW1lIHByZXJlcXVpc2l0ZXMgYW5kIHJldHVybnMgYXNcbm1tL2h1Z2VfbWVtb3J5LmM6NDQxMzogKiBzcGxpdF9odWdlX3BhZ2VfdG9fbGlzdF90b19vcmRlcigpLlxubW0vaHVnZV9tZW1vcnkuYy00NDE0LSAqXG4tLVxubW0vaHVnZV9tZW1vcnkuYz00NDYyPWludCBzcGxpdF9mb2xpb190b19saXN0KHN0cnVjdCBmb2xpbyAqZm9saW8sIHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QpXG5tbS9odWdlX21lbW9yeS5jLTQ0NjMte1xubW0vaHVnZV9tZW1vcnkuYzo0NDY0Olx0cmV0dXJuIHNwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyKFx1MDAyNmZvbGlvLVx1MDAzZXBhZ2UsIGxpc3QsIDApO1xubW0vaHVnZV9tZW1vcnkuYy00NDY1LX1cbi0tXG5tbS9odWdlX21lbW9yeS5jPTQ2MjE9c3RhdGljIHVuc2lnbmVkIGxvbmcgZGVmZXJyZWRfc3BsaXRfc2NhbihzdHJ1Y3Qgc2hyaW5rZXIgKnNocmluayxcbi0tXG5tbS9odWdlX21lbW9yeS5jLTQ2ODMtI2lmZGVmIENPTkZJR19ERUJVR19GU1xubW0vaHVnZV9tZW1vcnkuYzo0Njg0OnN0YXRpYyB2b2lkIHNwbGl0X2h1Z2VfcGFnZXNfYWxsKHZvaWQpXG5tbS9odWdlX21lbW9yeS5jLTQ2ODUte1xuLS1cbm1tL2h1Z2VfbWVtb3J5LmM9NDczND1zdGF0aWMgaW5saW5lIGJvb2wgdm1hX25vdF9zdWl0YWJsZV9mb3JfdGhwX3NwbGl0KHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKVxuLS1cbm1tL2h1Z2VfbWVtb3J5LmMtNDc0Ny1cbm1tL2h1Z2VfbWVtb3J5LmM6NDc0ODpzdGF0aWMgaW50IHNwbGl0X2h1Z2VfcGFnZXNfcGlkKGludCBwaWQsIHVuc2lnbmVkIGxvbmcgdmFkZHJfc3RhcnQsXG5tbS9odWdlX21lbW9yeS5jLTQ3NDktXHRcdFx0XHR1bnNpZ25lZCBsb25nIHZhZGRyX2VuZCwgdW5zaWduZWQgaW50IG5ld19vcmRlcixcbi0tXG5tbS9odWdlX21lbW9yeS5jLTQ4MTctXHRcdC8qXG5tbS9odWdlX21lbW9yeS5jOjQ4MTg6XHRcdCAqIEZvciBmb2xpb3Mgd2l0aCBwcml2YXRlLCBzcGxpdF9odWdlX3BhZ2VfdG9fbGlzdF90b19vcmRlcigpXG5tbS9odWdlX21lbW9yeS5jLTQ4MTktXHRcdCAqIHdpbGwgdHJ5IHRvIGRyb3AgaXQgYmVmb3JlIHNwbGl0IGFuZCB0aGVuIGNoZWNrIGlmIHRoZSBmb2xpb1xuLS1cbm1tL2h1Z2VfbWVtb3J5LmMtNDg2NC1cbm1tL2h1Z2VfbWVtb3J5LmM6NDg2NTpzdGF0aWMgaW50IHNwbGl0X2h1Z2VfcGFnZXNfaW5fZmlsZShjb25zdCBjaGFyICpmaWxlX3BhdGgsIHBnb2ZmX3Qgb2ZmX3N0YXJ0LFxubW0vaHVnZV9tZW1vcnkuYy00ODY2LVx0XHRcdFx0cGdvZmZfdCBvZmZfZW5kLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyLFxuLS1cbm1tL2h1Z2VfbWVtb3J5LmMtNDkzNC1cbm1tL2h1Z2VfbWVtb3J5LmM6NDkzNTpzdGF0aWMgc3NpemVfdCBzcGxpdF9odWdlX3BhZ2VzX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLFxubW0vaHVnZV9tZW1vcnkuYy00OTM2LVx0XHRcdFx0c2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3BzKVxuLS1cbm1tL2h1Z2VfbWVtb3J5LmMtNDk4Mi1cdFx0fVxubW0vaHVnZV9tZW1vcnkuYzo0OTgzOlx0XHRyZXQgPSBzcGxpdF9odWdlX3BhZ2VzX2luX2ZpbGUoZmlsZV9wYXRoLCBvZmZfc3RhcnQsIG9mZl9lbmQsXG5tbS9odWdlX21lbW9yeS5jLTQ5ODQtXHRcdFx0XHRuZXdfb3JkZXIsIGluX2ZvbGlvX29mZnNldCk7XG4tLVxubW0vaHVnZV9tZW1vcnkuYy00OTkzLVx0aWYgKHJldCA9PSAxIFx1MDAyNlx1MDAyNiBwaWQgPT0gMSkge1xubW0vaHVnZV9tZW1vcnkuYzo0OTk0Olx0XHRzcGxpdF9odWdlX3BhZ2VzX2FsbCgpO1xubW0vaHVnZV9tZW1vcnkuYy00OTk1LVx0XHRyZXQgPSBzdHJsZW4oaW5wdXRfYnVmKTtcbi0tXG5tbS9odWdlX21lbW9yeS5jLTUwMDEtXG5tbS9odWdlX21lbW9yeS5jOjUwMDI6XHRyZXQgPSBzcGxpdF9odWdlX3BhZ2VzX3BpZChwaWQsIHZhZGRyX3N0YXJ0LCB2YWRkcl9lbmQsIG5ld19vcmRlcixcbm1tL2h1Z2VfbWVtb3J5LmMtNTAwMy1cdFx0XHRpbl9mb2xpb19vZmZzZXQpO1xuLS1cbm1tL2h1Z2VfbWVtb3J5LmMtNTAxMS1cbm1tL2h1Z2VfbWVtb3J5LmM6NTAxMjpzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBzcGxpdF9odWdlX3BhZ2VzX2ZvcHMgPSB7XG5tbS9odWdlX21lbW9yeS5jLTUwMTMtXHQub3duZXJcdCA9IFRISVNfTU9EVUxFLFxubW0vaHVnZV9tZW1vcnkuYzo1MDE0Olx0LndyaXRlXHQgPSBzcGxpdF9odWdlX3BhZ2VzX3dyaXRlLFxubW0vaHVnZV9tZW1vcnkuYy01MDE1LX07XG5tbS9odWdlX21lbW9yeS5jLTUwMTYtXG5tbS9odWdlX21lbW9yeS5jOjUwMTc6c3RhdGljIGludCBfX2luaXQgc3BsaXRfaHVnZV9wYWdlc19kZWJ1Z2ZzKHZvaWQpXG5tbS9odWdlX21lbW9yeS5jLTUwMTgte1xubW0vaHVnZV9tZW1vcnkuYzo1MDE5Olx0ZGVidWdmc19jcmVhdGVfZmlsZShcJiMzNDtzcGxpdF9odWdlX3BhZ2VzXCYjMzQ7LCAwMjAwLCBOVUxMLCBOVUxMLFxubW0vaHVnZV9tZW1vcnkuYzo1MDIwOlx0XHRcdCAgICBcdTAwMjZzcGxpdF9odWdlX3BhZ2VzX2ZvcHMpO1xubW0vaHVnZV9tZW1vcnkuYy01MDIxLVx0cmV0dXJuIDA7XG5tbS9odWdlX21lbW9yeS5jLTUwMjItfVxubW0vaHVnZV9tZW1vcnkuYzo1MDIzOmxhdGVfaW5pdGNhbGwoc3BsaXRfaHVnZV9wYWdlc19kZWJ1Z2ZzKTtcbm1tL2h1Z2VfbWVtb3J5LmMtNTAyNC0jZW5kaWZcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD41LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNyAyMTo1NDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMzU2MgoJCQkJCQkJb3V0cHV0OiAyNgoJCQkJCQkJdGhvdWdodHM6IDk4CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyBGb2xpbyBTcGxpdHRpbmcgYW5kIFN3YXAgQ2FjaGUgT3BlcmF0aW9ucyoqCgpPa2F5LCBzbyBJJiMzOTt2ZSBiZWVuIGxvb2tpbmcgYXQgaG93IGZvbGlvIHNwbGl0dGluZyBhbmQgdGhlIHN3YXAgY2FjaGUgaW50ZXJhY3QuIEkgc2VlIHRoYXQgdGhlc2UgZnVuY3Rpb25zIGhhdmUgYmVlbiB0b3VjaGVkOiBgZm9saW9fY2hlY2tfc3BsaXR0YWJsZWAsIGBfX2ZvbGlvX2ZyZWV6ZV9zcGxpdF91bm1hcGAsIGBfX2ZvbGlvX2ZyZWV6ZV9zcGxpdF91bm1hcF9maWxlYCwgYF9fZm9saW9fc3BsaXRgLCBgZm9saW9fc3BsaXRfdW5tYXBwZWRgLCBhbmQgYF9fc3dhcF9jYWNoZV9yZXBsYWNlX2ZvbGlvYC4gVGhhdCYjMzk7cyBhIGRlY2VudC1zaXplZCBsaXN0LCBhbmQgSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhlIGltcGxpY2F0aW9ucyBvZiB0aGVzZSBjaGFuZ2VzLgoKSSBuZWVkIHRvIGZvY3VzIG9uIGBmb2xpb19zcGxpdF91bm1hcHBlZGAgYW5kIGBfX3N3YXBfY2FjaGVfcmVwbGFjZV9mb2xpb2Agc3BlY2lmaWNhbGx5LiBUaGVzZSBhcmUgdGhlIHR3byB0aGF0IGFyZSBzY3JlYW1pbmcgdGhlIGxvdWRlc3QgcmlnaHQgbm93LiBUaGUgaW50ZXJwbGF5IGJldHdlZW4gc3BsaXR0aW5nIGZvbGlvcyB0aGF0IGFyZSAqdW5tYXBwZWQqIGFuZCBob3cgdGhhdCBpbXBhY3RzIHRoZSBzd2FwIGNhY2hlIGlzIHdoZXJlIEkgYW50aWNpcGF0ZSBmaW5kaW5nIHRoZSBjb3JlIG9mIHRoZSBpc3N1ZSAob3IgdGhlIGltcHJvdmVtZW50LCBkZXBlbmRpbmcpLiBHb3R0YSBmaWd1cmUgb3V0IGhvdyB0aGUgdW5tYXBwaW5nIGlzIGhhbmRsZWQgZHVyaW5nIHRoZSBzcGxpdCwgYW5kIHRoZW4sIGNydWNpYWxseSwgaG93IHRoZSBzd2FwIGNhY2hlIHVwZGF0ZXMgaXRzIHZpZXcgb2YgdGhlIHBhZ2VzIGFmdGVyIHRoZSBzcGxpdCBoYXMgb2NjdXJyZWQuIEkgbmVlZCB0byBrZWVwIGEgY2xvc2UgZXllIG91dCBmb3IgcG90ZW50aWFsIHJhY2VzLCBtaXNzZWQgaW52YWxpZGF0aW9ucywgb3IgaW5jb3JyZWN0IHJlZmVyZW5jZSBjb3VudHMuIEkgZXhwZWN0IHRoZXNlIHR3byBmdW5jdGlvbnMgd2lsbCBiZSB0aGUga2V5cyB0byB1bmRlcnN0YW5kaW5nIHRoZSBjaGFuZ2VzIGluIHRoaXMgcGF0Y2guCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Ni8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDcgMjE6NTQ8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7Zm9saW9fc3BsaXRfdW5tYXBwZWQmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDsmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7aW5jbHVkZS9saW51eC9odWdlX21tLmg9NDAzPWludCBfX3NwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyKHN0cnVjdCBwYWdlICpwYWdlLCBzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LFxuaW5jbHVkZS9saW51eC9odWdlX21tLmgtNDA0LVx0XHR1bnNpZ25lZCBpbnQgbmV3X29yZGVyKTtcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oOjQwNTppbnQgZm9saW9fc3BsaXRfdW5tYXBwZWQoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlcik7XG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaC00MDYtdW5zaWduZWQgaW50IG1pbl9vcmRlcl9mb3Jfc3BsaXQoc3RydWN0IGZvbGlvICpmb2xpbyk7XG4tLVxubW0vaHVnZV9tZW1vcnkuYz00MjQ3PXN0YXRpYyBpbnQgX19mb2xpb19zcGxpdChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyLFxuLS1cbm1tL2h1Z2VfbWVtb3J5LmMtNDMxNS0vKipcbm1tL2h1Z2VfbWVtb3J5LmM6NDMxNjogKiBmb2xpb19zcGxpdF91bm1hcHBlZCgpIC0gc3BsaXQgYSBsYXJnZSBhbm9uIGZvbGlvIHRoYXQgaXMgYWxyZWFkeSB1bm1hcHBlZFxubW0vaHVnZV9tZW1vcnkuYy00MzE3LSAqIEBmb2xpbzogZm9saW8gdG8gc3BsaXRcbi0tXG5tbS9odWdlX21lbW9yeS5jLTQzMzYtICovXG5tbS9odWdlX21lbW9yeS5jOjQzMzc6aW50IGZvbGlvX3NwbGl0X3VubWFwcGVkKHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIpXG5tbS9odWdlX21lbW9yeS5jLTQzMzgte1xuLS1cbm1tL21pZ3JhdGVfZGV2aWNlLmM9OTEyPXN0YXRpYyBpbnQgbWlncmF0ZV92bWFfc3BsaXRfdW5tYXBwZWRfZm9saW8oc3RydWN0IG1pZ3JhdGVfdm1hICptaWdyYXRlLFxuLS1cbm1tL21pZ3JhdGVfZGV2aWNlLmMtOTI2LVx0c3BsaXRfaHVnZV9wbWRfYWRkcmVzcyhtaWdyYXRlLVx1MDAzZXZtYSwgYWRkciwgdHJ1ZSk7XG5tbS9taWdyYXRlX2RldmljZS5jOjkyNzpcdHJldCA9IGZvbGlvX3NwbGl0X3VubWFwcGVkKGZvbGlvLCAwKTtcbm1tL21pZ3JhdGVfZGV2aWNlLmMtOTI4LVx0aWYgKHJldClcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD43LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNyAyMTo1NDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxNDM3OAoJCQkJCQkJb3V0cHV0OiAyOAoJCQkJCQkJdGhvdWdodHM6IDQ5CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBoZXJlJiMzOTtzIG15IHRha2Ugb24gdGhvc2UgdGhvdWdodHMsIGZyYW1lZCBmcm9tIG15IGV4cGVydCBwZXJzcGVjdGl2ZToKCioqRGl2aW5nIGludG8gdGhlIEZvbGlvIFN3YXAgQ2FjaGUqKgoKUmlnaHQsIHNvIGBmb2xpb19zcGxpdF91bm1hcHBlZGAgaXMgYmVpbmcgY2FsbGVkIGZyb20gYG1pZ3JhdGVfdm1hX3NwbGl0X3VubWFwcGVkX2ZvbGlvYCB3aXRoaW4gYG1tL21pZ3JhdGVfZGV2aWNlLmNgLiBUaGF0JiMzOTtzIHRoZSBrZXkuIEkgbmVlZCB0byB1bmRlcnN0YW5kIHdoYXQmIzM5O3MgaGFwcGVuaW5nIGR1cmluZyB0aGlzIHVubWFwcGVkIGZvbGlvIHNwbGl0IGFzIHBhcnQgb2YgdGhlIFZNQSBtaWdyYXRpb24gcHJvY2Vzcy4gU3BlY2lmaWNhbGx5LCBJIG5lZWQgdG8ga25vdyBob3cgdGhlc2UgdW5tYXBwZWQgZm9saW9zIGFyZSBiZWluZyBoYW5kbGVkIHdoZW4gc3BsaXQuCgpNeSBndXQgZmVlbGluZyBpcyB0aGF0IGFueSB0aW1lIHdlIGFyZSBtaWdyYXRpbmcgVk1BcyBhbmQgd2UgYXJlIHNwbGl0dGluZyBhbiB1bm1hcHBlZCBmb2xpbywgaXQgbWVhbnMgdGhpcyBtdXN0IGJlIHZlcnkgaW1wb3J0YW50LgoKVGhlIG5leHQgbG9naWNhbCBzdGVwIGlzIHRvIGRpdmUgaW50byBgX19zd2FwX2NhY2hlX3JlcGxhY2VfZm9saW9gLiBUaGF0IGZ1bmN0aW9uIGlzIGNydWNpYWwgdG8gZm9saW8gc3dhcHBpbmcgb3BlcmF0aW9ucywgc28gSSYjMzk7bSBndWVzc2luZyB0aGF0IGl0IHdpbGwgcGxheSBhIHJvbGUgaW4gaG93IHVubWFwcGVkIGZvbGlvcyBhcmUgaGFuZGxlZC4gSSBleHBlY3QgdG8gZmluZCBzb21lIGNyaXRpY2FsIGNvbnRleHQgdGhlcmUgYXJvdW5kIGhvdyB0aGVzZSBzcGxpdCB1bm1hcHBlZCBmb2xpb3MgYXJlIGludGVncmF0ZWQgd2l0aCB0aGUgc3dhcCBjYWNoZSwgYW5kIGlmIHRoZXJlIGFyZSBhbnkgc3BlY2lmaWMgY29uc2lkZXJhdGlvbnMgZm9yIHVubWFwcGVkIGZvbGlvcy4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgaWYgdGhpcyBpcyBhIGNyaXRpY2FsIGNvZGUgcGF0aCwgb3IgaWYgb3RoZXIgY2FsbHMgYXJlIG1vcmUgc2lnbmlmaWNhbnQuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+OC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDcgMjE6NTQ8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7X19zd2FwX2NhY2hlX3JlcGxhY2VfZm9saW8mIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDsmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bW0vaHVnZV9tZW1vcnkuYz0zOTI2PXN0YXRpYyBpbnQgX19mb2xpb19mcmVlemVfc3BsaXRfdW5tYXAoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlcixcbi0tXG5tbS9odWdlX21lbW9yeS5jLTQwMzMtXHRcdGlmIChjaSlcbm1tL2h1Z2VfbWVtb3J5LmM6NDAzNDpcdFx0XHRfX3N3YXBfY2FjaGVfcmVwbGFjZV9mb2xpbyhjaSwgZm9saW8sIG5ld19mb2xpbyk7XG5tbS9odWdlX21lbW9yeS5jLTQwMzUtXHR9XG4tLVxubW0vbWlncmF0ZS5jPTU4Mz1zdGF0aWMgaW50IF9fZm9saW9fbWlncmF0ZV9tYXBwaW5nKHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLFxuLS1cbm1tL21pZ3JhdGUuYy02NTYtXHRpZiAoZm9saW9fdGVzdF9zd2FwY2FjaGUoZm9saW8pKVxubW0vbWlncmF0ZS5jOjY1NzpcdFx0X19zd2FwX2NhY2hlX3JlcGxhY2VfZm9saW8oY2ksIGZvbGlvLCBuZXdmb2xpbyk7XG5tbS9taWdyYXRlLmMtNjU4LVx0ZWxzZVxuLS1cbm1tL3NobWVtLmM9MjA4OD1zdGF0aWMgaW50IHNobWVtX3JlcGxhY2VfZm9saW8oc3RydWN0IGZvbGlvICoqZm9saW9wLCBnZnBfdCBnZnAsXG4tLVxubW0vc2htZW0uYy0yMTI1LVx0Y2kgPSBzd2FwX2NsdXN0ZXJfZ2V0X2FuZF9sb2NrX2lycShvbGQpO1xubW0vc2htZW0uYzoyMTI2Olx0X19zd2FwX2NhY2hlX3JlcGxhY2VfZm9saW8oY2ksIG9sZCwgbmV3KTtcbm1tL3NobWVtLmMtMjEyNy1cdG1lbV9jZ3JvdXBfcmVwbGFjZV9mb2xpbyhvbGQsIG5ldyk7XG4tLVxubW0vc3dhcC5oPTM0Mj12b2lkIF9fc3dhcF9jYWNoZV9kZWxfZm9saW8oc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSxcbm1tL3N3YXAuaC0zNDMtXHRcdFx0ICAgIHN0cnVjdCBmb2xpbyAqZm9saW8sIHN3cF9lbnRyeV90IGVudHJ5LCB2b2lkICpzaGFkb3cpO1xubW0vc3dhcC5oOjM0NDp2b2lkIF9fc3dhcF9jYWNoZV9yZXBsYWNlX2ZvbGlvKHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2ksXG5tbS9zd2FwLmgtMzQ1LVx0XHRcdFx0c3RydWN0IGZvbGlvICpvbGQsIHN0cnVjdCBmb2xpbyAqbmV3KTtcbi0tXG5tbS9zd2FwLmg9NDc2PXN0YXRpYyBpbmxpbmUgdm9pZCBfX3N3YXBfY2FjaGVfZGVsX2ZvbGlvKHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2ksXG4tLVxubW0vc3dhcC5oLTQ4MC1cbm1tL3N3YXAuaDo0ODE6c3RhdGljIGlubGluZSB2b2lkIF9fc3dhcF9jYWNoZV9yZXBsYWNlX2ZvbGlvKHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2ksXG5tbS9zd2FwLmgtNDgyLVx0XHRzdHJ1Y3QgZm9saW8gKm9sZCwgc3RydWN0IGZvbGlvICpuZXcpXG4tLVxubW0vc3dhcF9zdGF0ZS5jPTMzNT12b2lkIHN3YXBfY2FjaGVfZGVsX2ZvbGlvKHN0cnVjdCBmb2xpbyAqZm9saW8pXG4tLVxubW0vc3dhcF9zdGF0ZS5jLTM0Ny0vKipcbm1tL3N3YXBfc3RhdGUuYzozNDg6ICogX19zd2FwX2NhY2hlX3JlcGxhY2VfZm9saW8gLSBSZXBsYWNlIGEgZm9saW8gaW4gdGhlIHN3YXAgY2FjaGUuXG5tbS9zd2FwX3N0YXRlLmMtMzQ5LSAqIEBjaTogVGhlIGxvY2tlZCBzd2FwIGNsdXN0ZXIuXG4tLVxubW0vc3dhcF9zdGF0ZS5jLTM2MC0gKi9cbm1tL3N3YXBfc3RhdGUuYzozNjE6dm9pZCBfX3N3YXBfY2FjaGVfcmVwbGFjZV9mb2xpbyhzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpLFxubW0vc3dhcF9zdGF0ZS5jLTM2Mi1cdFx0XHRcdHN0cnVjdCBmb2xpbyAqb2xkLCBzdHJ1Y3QgZm9saW8gKm5ldylcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD45LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNyAyMTo1NDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxNTQyOAoJCQkJCQkJb3V0cHV0OiAyOAoJCQkJCQkJdGhvdWdodHM6IDE2NQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgdGhlIEtlcm5lbCBQYXRjaCBmb3IgU3dhcCBhbmQgVEhQIEludGVyYWN0aW9uKioKCk9rYXksIHNvIEkmIzM5O20gbG9va2luZyBhdCB0aGlzIHBhdGNoIGFuZCBpdCBzZWVtcyB0byBiZSBjZW50ZXJlZCBhcm91bmQgdGhlIGludGVyYWN0aW9uIG9mIFRyYW5zcGFyZW50IEh1Z2UgUGFnZXMgKFRIUCkgYW5kIHRoZSBzd2FwIGNhY2hlLCBzcGVjaWZpY2FsbHkgaW4gdGhlIG1lbW9yeSBtYW5hZ2VtZW50IHN1YnN5c3RlbS4gTXkgaW5pdGlhbCB0aG91Z2h0IGlzIHRoYXQgdGhlIGNvcmUgY2hhbmdlIGFwcGVhcnMgdG8gYmUgYSBtb2RpZmljYXRpb24gd2l0aGluIGBtbS9zd2FwX3N0YXRlLmNgLCBzcGVjaWZpY2FsbHkgdG8gdGhlIGBfX3N3YXBfY2FjaGVfcmVwbGFjZV9mb2xpb2AgZnVuY3Rpb24uIEluc3RlYWQgb2YgdXNpbmcgYSBgd2hpbGVgIGxvb3AsIHRoZXkmIzM5O3ZlIHN3aXRjaGVkIHRvIGEgYGRvIHsgLi4uIH0gd2hpbGVgIGNvbnN0cnVjdC4gSSYjMzk7bGwgbmVlZCB0byBkcmlsbCBkb3duIHRvIHVuZGVyc3RhbmQgdGhlIHJhdGlvbmFsZSBiZWhpbmQgdGhhdCBjaGFuZ2UuCgpUaGUgb3RoZXIgY3J1Y2lhbCBhcmVhIHNlZW1zIHRvIGJlIHdpdGhpbiBgbW0vaHVnZV9tZW1vcnkuY2AsIGFuZCBJJiMzOTttIGd1ZXNzaW5nIHRoYXQgdGhpcyBpcyB3aGVyZSB0aGUgVEhQLXNwZWNpZmljIGxvZ2ljIGNvbWVzIGludG8gcGxheS4gSSYjMzk7bGwgbmVlZCB0byBtZXRpY3Vsb3VzbHkgYW5hbHl6ZSB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uczogYHNwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyYCwgYGZvbGlvX3NwbGl0X3VubWFwcGVkYCwgYF9fc3dhcF9jYWNoZV9yZXBsYWNlX2ZvbGlvYCAoYWdhaW4sIHRvIHVuZGVyc3RhbmQgdGhlIGludGVyYWN0aW9ucyksIGFuZCBgc3BsaXRfZm9saW9fdG9fbGlzdGAuIFRoZXNlIGFyZSB0aGUga2V5IHBpZWNlcyB0byB1bmRlcnN0YW5kIGhvdyBhIGh1Z2UgcGFnZSBpcyBoYW5kbGVkIHdoZW4gaXQgbmVlZHMgdG8gYmUgc3dhcHBlZC4KCkJlZm9yZSBJIGdvIGZ1cnRoZXIsIEkmIzM5O2xsIHF1aWNrbHkgY2hlY2sgdGhlIEtjb25maWcgc2V0dGluZ3MuIEkgbmVlZCB0byBtYWtlIHN1cmUgYENPTkZJR19UUkFOU1BBUkVOVF9IVUdFUEFHRWAgaXMgZW5hYmxlZCBiZWNhdXNlIGl0JiMzOTtzIHJlcXVpcmVkIGZvciBUSFAgZnVuY3Rpb25hbGl0eSB0byBiZSBwcmVzZW50LiBTaW1pbGFybHksIEkmIzM5O2xsIGNvbmZpcm0gYENPTkZJR19TV0FQYCBpcyBlbmFibGVkLCBhcyB0aGlzIHdpbGwgYWxsb3cgZm9yIHN3YXBjYWNoZSB0byBiZSBpbiBlZmZlY3QuIEkgc2hvdWxkIGFsc28gZ2xhbmNlIGZvciBhbnkgb3RoZXIgcmVsYXRlZCBjb25maWdzLCBqdXN0IHRvIGVuc3VyZSBJIGhhdmUgdGhlIGZ1bGwgcGljdHVyZS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDcgMjE6NTQ8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7JiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O21tL0tjb25maWc9ODMxPWNvbmZpZyBNTV9JRFxuLS1cbm1tL0tjb25maWctODMzLVxubW0vS2NvbmZpZzo4MzQ6bWVudWNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRVxubW0vS2NvbmZpZy04MzUtXHRib29sIFwmIzM0O1RyYW5zcGFyZW50IEh1Z2VwYWdlIFN1cHBvcnRcJiMzNDtcbi0tXG5tbS9LY29uZmlnPTg1Mj1jaG9pY2Vcbi0tXG5tbS9LY29uZmlnLTg1Ny1cbm1tL0tjb25maWc6ODU4Olx0Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX0FMV0FZU1xubW0vS2NvbmZpZy04NTktXHRcdGJvb2wgXCYjMzQ7YWx3YXlzXCYjMzQ7XG4tLVxubW0vS2NvbmZpZy04NjQtXG5tbS9LY29uZmlnOjg2NTpcdGNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRV9NQURWSVNFXG5tbS9LY29uZmlnLTg2Ni1cdFx0Ym9vbCBcJiMzNDttYWR2aXNlXCYjMzQ7XG4tLVxubW0vS2NvbmZpZy04NzMtXG5tbS9LY29uZmlnOjg3NDpcdGNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRV9ORVZFUlxubW0vS2NvbmZpZy04NzUtXHRcdGJvb2wgXCYjMzQ7bmV2ZXJcJiMzNDtcbi0tXG5tbS9LY29uZmlnPTg4MT1jaG9pY2Vcbi0tXG5tbS9LY29uZmlnLTg5MC1cbm1tL0tjb25maWc6ODkxOlx0Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX1NITUVNX0hVR0VfTkVWRVJcbm1tL0tjb25maWctODkyLVx0XHRib29sIFwmIzM0O25ldmVyXCYjMzQ7XG4tLVxubW0vS2NvbmZpZy05MDAtXG5tbS9LY29uZmlnOjkwMTpcdGNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRV9TSE1FTV9IVUdFX0FMV0FZU1xubW0vS2NvbmZpZy05MDItXHRcdGJvb2wgXCYjMzQ7YWx3YXlzXCYjMzQ7XG4tLVxubW0vS2NvbmZpZy05MDgtXG5tbS9LY29uZmlnOjkwOTpcdGNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRV9TSE1FTV9IVUdFX1dJVEhJTl9TSVpFXG5tbS9LY29uZmlnLTkxMC1cdFx0Ym9vbCBcJiMzNDt3aXRoaW5fc2l6ZVwmIzM0O1xuLS1cbm1tL0tjb25maWctOTE2LVxubW0vS2NvbmZpZzo5MTc6XHRjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VfU0hNRU1fSFVHRV9BRFZJU0Vcbm1tL0tjb25maWctOTE4LVx0XHRib29sIFwmIzM0O2FkdmlzZVwmIzM0O1xuLS1cbm1tL0tjb25maWc9OTI2PWNob2ljZVxuLS1cbm1tL0tjb25maWctOTM1LVxubW0vS2NvbmZpZzo5MzY6XHRjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VfVE1QRlNfSFVHRV9ORVZFUlxubW0vS2NvbmZpZy05MzctXHRcdGJvb2wgXCYjMzQ7bmV2ZXJcJiMzNDtcbi0tXG5tbS9LY29uZmlnLTk0NC1cbm1tL0tjb25maWc6OTQ1Olx0Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX1RNUEZTX0hVR0VfQUxXQVlTXG5tbS9LY29uZmlnLTk0Ni1cdFx0Ym9vbCBcJiMzNDthbHdheXNcJiMzNDtcbi0tXG5tbS9LY29uZmlnLTk1Mi1cbm1tL0tjb25maWc6OTUzOlx0Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX1RNUEZTX0hVR0VfV0lUSElOX1NJWkVcbm1tL0tjb25maWctOTU0LVx0XHRib29sIFwmIzM0O3dpdGhpbl9zaXplXCYjMzQ7XG4tLVxubW0vS2NvbmZpZy05NjAtXG5tbS9LY29uZmlnOjk2MTpcdGNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRV9UTVBGU19IVUdFX0FEVklTRVxubW0vS2NvbmZpZy05NjItXHRcdGJvb2wgXCYjMzQ7YWR2aXNlXCYjMzQ7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTEvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA3IDIxOjU0PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDE2Njc3CgkJCQkJCQlvdXRwdXQ6IDI3CgkJCQkJCQl0aG91Z2h0czogODEKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGhlcmUmIzM5O3MgbXkgdGFrZSBvbiB0aG9zZSB0aG91Z2h0cywgZnJhbWVkIGFzIG15IG93bjoKCioqT3B0aW1pemluZyBNZW1vcnkgTWFuYWdlbWVudDogVHJhbnNwYXJlbnQgSHVnZXBhZ2VzIGFuZCBCZXlvbmQqKgoKQWxyaWdodCwgbGV0JiMzOTtzIHRoaW5rIHRoaXMgdGhyb3VnaC4gSSYjMzk7bSBsZWFuaW5nIHRvd2FyZHMgZW5hYmxpbmcgYFRSQU5TUEFSRU5UX0hVR0VQQUdFYCBhbG9uZ3NpZGUgYFNXQVBgIGluIHRoaXMgZW52aXJvbm1lbnQuIFRoZSBwb3RlbnRpYWwgcGVyZm9ybWFuY2UgZ2FpbnMgd2l0aCBodWdlcGFnZXMgYXJlIHNpZ25pZmljYW50LCBhbmQgcHJvcGVybHkgY29uZmlndXJlZCBzd2FwcGluZyBjYW4gYmUgZXNzZW50aWFsIGZvciBtYW5hZ2luZyBtZW1vcnkgcHJlc3N1cmUuCgpOb3csIEkmIzM5O20gZ2V0dGluZyBjdXJpb3VzIGFib3V0IHRoZSBpbm5lciB3b3JraW5ncy4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgaG93IHBhZ2VzIGFyZSBtYW5hZ2VkIHdpdGhpbiB0aGUgaHVnZXBhZ2Ugc3lzdGVtLiBNeSBpbW1lZGlhdGUgcXVlc3Rpb24gaXMgd2hldGhlciBgc3BsaXRfaHVnZV9wYWdlX3RvX2xpc3RfdG9fb3JkZXJgIGlzIGFjY2Vzc2libGUuIEkgbmVlZCB0byB2ZXJpZnkgdGhhdCBpdCYjMzk7cyBleHBvcnRlZCBhbmQgcmVhY2hhYmxlLiBHb29kLCBpdCBsb29rcyBsaWtlIGBzcGxpdF9mb2xpb190b19saXN0YCBhbmQgYHNwbGl0X2h1Z2VfcGFnZWAgYm90aCB1c2UgYHNwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyYC4gVGhpcyBpcyBwcm9taXNpbmc7IHVuZGVyc3RhbmRpbmcgaXRzIHJvbGUgaXMga2V5LgoKTm93IEkgbmVlZCB0byBkaXZlIGRlZXBlci4gTXkgbmV4dCBzdGVwIGlzIHRvIGV4YW1pbmUgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgYHNwbGl0X2h1Z2VfcGFnZWAuIEkmIzM5O2xsIG5lZWQgdG8gdW5kZXJzdGFuZCBob3cgaXQgaW50ZXJhY3RzIHdpdGggdGhlIGxvd2VyIGxldmVscyBvZiBtZW1vcnkgbWFuYWdlbWVudCwgdGhlIGZvbGlvIHN0cnVjdHVyZSwgYW5kIHRoZSBsaXN0IG1hbmFnZW1lbnQuIFRoaXMgd2lsbCBsaWtlbHkgcHJvdmlkZSBpbnNpZ2h0cyBpbnRvIGhvdyBodWdlcGFnZXMgYXJlIG1hbmFnZWQgYW5kIHNwbGl0IGluIHRoZSBzeXN0ZW0uCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTIvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA3IDIxOjU0PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O3NwbGl0X2h1Z2VfcGFnZSYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O21tLyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDttbS9odWdlX21lbW9yeS5jPTQzMzc9aW50IGZvbGlvX3NwbGl0X3VubWFwcGVkKHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIpXG4tLVxubW0vaHVnZV9tZW1vcnkuYy00Mzk0LSAqL1xubW0vaHVnZV9tZW1vcnkuYzo0Mzk1OmludCBfX3NwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyKHN0cnVjdCBwYWdlICpwYWdlLCBzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LFxubW0vaHVnZV9tZW1vcnkuYy00Mzk2LVx0XHRcdFx0ICAgICB1bnNpZ25lZCBpbnQgbmV3X29yZGVyKVxuLS1cbm1tL2h1Z2VfbWVtb3J5LmMtNDQxMi0gKiBJdCBoYXMgdGhlIHNhbWUgcHJlcmVxdWlzaXRlcyBhbmQgcmV0dXJucyBhc1xubW0vaHVnZV9tZW1vcnkuYzo0NDEzOiAqIHNwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyKCkuXG5tbS9odWdlX21lbW9yeS5jLTQ0MTQtICpcbi0tXG5tbS9odWdlX21lbW9yeS5jPTQ0NjI9aW50IHNwbGl0X2ZvbGlvX3RvX2xpc3Qoc3RydWN0IGZvbGlvICpmb2xpbywgc3RydWN0IGxpc3RfaGVhZCAqbGlzdClcbm1tL2h1Z2VfbWVtb3J5LmMtNDQ2My17XG5tbS9odWdlX21lbW9yeS5jOjQ0NjQ6XHRyZXR1cm4gc3BsaXRfaHVnZV9wYWdlX3RvX2xpc3RfdG9fb3JkZXIoXHUwMDI2Zm9saW8tXHUwMDNlcGFnZSwgbGlzdCwgMCk7XG5tbS9odWdlX21lbW9yeS5jLTQ0NjUtfVxuLS1cbm1tL2h1Z2VfbWVtb3J5LmM9NDYyMT1zdGF0aWMgdW5zaWduZWQgbG9uZyBkZWZlcnJlZF9zcGxpdF9zY2FuKHN0cnVjdCBzaHJpbmtlciAqc2hyaW5rLFxuLS1cbm1tL2h1Z2VfbWVtb3J5LmMtNDY4My0jaWZkZWYgQ09ORklHX0RFQlVHX0ZTXG5tbS9odWdlX21lbW9yeS5jOjQ2ODQ6c3RhdGljIHZvaWQgc3BsaXRfaHVnZV9wYWdlc19hbGwodm9pZClcbm1tL2h1Z2VfbWVtb3J5LmMtNDY4NS17XG4tLVxubW0vaHVnZV9tZW1vcnkuYz00NzM0PXN0YXRpYyBpbmxpbmUgYm9vbCB2bWFfbm90X3N1aXRhYmxlX2Zvcl90aHBfc3BsaXQoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpXG4tLVxubW0vaHVnZV9tZW1vcnkuYy00NzQ3LVxubW0vaHVnZV9tZW1vcnkuYzo0NzQ4OnN0YXRpYyBpbnQgc3BsaXRfaHVnZV9wYWdlc19waWQoaW50IHBpZCwgdW5zaWduZWQgbG9uZyB2YWRkcl9zdGFydCxcbm1tL2h1Z2VfbWVtb3J5LmMtNDc0OS1cdFx0XHRcdHVuc2lnbmVkIGxvbmcgdmFkZHJfZW5kLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyLFxuLS1cbm1tL2h1Z2VfbWVtb3J5LmMtNDgxNy1cdFx0Lypcbm1tL2h1Z2VfbWVtb3J5LmM6NDgxODpcdFx0ICogRm9yIGZvbGlvcyB3aXRoIHByaXZhdGUsIHNwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyKClcbm1tL2h1Z2VfbWVtb3J5LmMtNDgxOS1cdFx0ICogd2lsbCB0cnkgdG8gZHJvcCBpdCBiZWZvcmUgc3BsaXQgYW5kIHRoZW4gY2hlY2sgaWYgdGhlIGZvbGlvXG4tLVxubW0vaHVnZV9tZW1vcnkuYy00ODY0LVxubW0vaHVnZV9tZW1vcnkuYzo0ODY1OnN0YXRpYyBpbnQgc3BsaXRfaHVnZV9wYWdlc19pbl9maWxlKGNvbnN0IGNoYXIgKmZpbGVfcGF0aCwgcGdvZmZfdCBvZmZfc3RhcnQsXG5tbS9odWdlX21lbW9yeS5jLTQ4NjYtXHRcdFx0XHRwZ29mZl90IG9mZl9lbmQsIHVuc2lnbmVkIGludCBuZXdfb3JkZXIsXG4tLVxubW0vaHVnZV9tZW1vcnkuYy00OTM0LVxubW0vaHVnZV9tZW1vcnkuYzo0OTM1OnN0YXRpYyBzc2l6ZV90IHNwbGl0X2h1Z2VfcGFnZXNfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWYsXG5tbS9odWdlX21lbW9yeS5jLTQ5MzYtXHRcdFx0XHRzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcHMpXG4tLVxubW0vaHVnZV9tZW1vcnkuYy00OTgyLVx0XHR9XG5tbS9odWdlX21lbW9yeS5jOjQ5ODM6XHRcdHJldCA9IHNwbGl0X2h1Z2VfcGFnZXNfaW5fZmlsZShmaWxlX3BhdGgsIG9mZl9zdGFydCwgb2ZmX2VuZCxcbm1tL2h1Z2VfbWVtb3J5LmMtNDk4NC1cdFx0XHRcdG5ld19vcmRlciwgaW5fZm9saW9fb2Zmc2V0KTtcbi0tXG5tbS9odWdlX21lbW9yeS5jLTQ5OTMtXHRpZiAocmV0ID09IDEgXHUwMDI2XHUwMDI2IHBpZCA9PSAxKSB7XG5tbS9odWdlX21lbW9yeS5jOjQ5OTQ6XHRcdHNwbGl0X2h1Z2VfcGFnZXNfYWxsKCk7XG5tbS9odWdlX21lbW9yeS5jLTQ5OTUtXHRcdHJldCA9IHN0cmxlbihpbnB1dF9idWYpO1xuLS1cbm1tL2h1Z2VfbWVtb3J5LmMtNTAwMS1cbm1tL2h1Z2VfbWVtb3J5LmM6NTAwMjpcdHJldCA9IHNwbGl0X2h1Z2VfcGFnZXNfcGlkKHBpZCwgdmFkZHJfc3RhcnQsIHZhZGRyX2VuZCwgbmV3X29yZGVyLFxubW0vaHVnZV9tZW1vcnkuYy01MDAzLVx0XHRcdGluX2ZvbGlvX29mZnNldCk7XG4tLVxubW0vaHVnZV9tZW1vcnkuYy01MDExLVxubW0vaHVnZV9tZW1vcnkuYzo1MDEyOnN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHNwbGl0X2h1Z2VfcGFnZXNfZm9wcyA9IHtcbm1tL2h1Z2VfbWVtb3J5LmMtNTAxMy1cdC5vd25lclx0ID0gVEhJU19NT0RVTEUsXG5tbS9odWdlX21lbW9yeS5jOjUwMTQ6XHQud3JpdGVcdCA9IHNwbGl0X2h1Z2VfcGFnZXNfd3JpdGUsXG5tbS9odWdlX21lbW9yeS5jLTUwMTUtfTtcbm1tL2h1Z2VfbWVtb3J5LmMtNTAxNi1cbm1tL2h1Z2VfbWVtb3J5LmM6NTAxNzpzdGF0aWMgaW50IF9faW5pdCBzcGxpdF9odWdlX3BhZ2VzX2RlYnVnZnModm9pZClcbm1tL2h1Z2VfbWVtb3J5LmMtNTAxOC17XG5tbS9odWdlX21lbW9yeS5jOjUwMTk6XHRkZWJ1Z2ZzX2NyZWF0ZV9maWxlKFwmIzM0O3NwbGl0X2h1Z2VfcGFnZXNcJiMzNDssIDAyMDAsIE5VTEwsIE5VTEwsXG5tbS9odWdlX21lbW9yeS5jOjUwMjA6XHRcdFx0ICAgIFx1MDAyNnNwbGl0X2h1Z2VfcGFnZXNfZm9wcyk7XG5tbS9odWdlX21lbW9yeS5jLTUwMjEtXHRyZXR1cm4gMDtcbm1tL2h1Z2VfbWVtb3J5LmMtNTAyMi19XG5tbS9odWdlX21lbW9yeS5jOjUwMjM6bGF0ZV9pbml0Y2FsbChzcGxpdF9odWdlX3BhZ2VzX2RlYnVnZnMpO1xubW0vaHVnZV9tZW1vcnkuYy01MDI0LSNlbmRpZlxuLS1cbm1tL2h1Z2V0bGIuYz0zOTUzPXN0YXRpYyBsb25nIGRlbW90ZV9mcmVlX2h1Z2V0bGJfZm9saW9zKHN0cnVjdCBoc3RhdGUgKnNyYywgc3RydWN0IGhzdGF0ZSAqZHN0LFxuLS1cbm1tL2h1Z2V0bGIuYy0zOTg5LVx0XHRcdHN0cnVjdCBwYWdlICpwYWdlID0gZm9saW9fcGFnZShmb2xpbywgaSk7XG5tbS9odWdldGxiLmM6Mzk5MDpcdFx0XHQvKiBDYXJlZnVsOiBzZWUgX19zcGxpdF9odWdlX3BhZ2VfdGFpbCgpICovXG5tbS9odWdldGxiLmMtMzk5MS1cdFx0XHRzdHJ1Y3QgZm9saW8gKm5ld19mb2xpbyA9IChzdHJ1Y3QgZm9saW8gKilwYWdlO1xuLS1cbm1tL2todWdlcGFnZWQuYz04MTM9c3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgX19jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbi0tXG5tbS9raHVnZXBhZ2VkLmMtODY5LVx0XHQgKiBmb2xpbyBjYW4mIzM5O3QgYmUgZnJlZWQgZnJvbSB1bmRlciB1cy4gTk9URTogZm9saW8gbG9ja1xubW0va2h1Z2VwYWdlZC5jOjg3MDpcdFx0ICogaXMgbmVlZGVkIHRvIHNlcmlhbGl6ZSBhZ2FpbnN0IHNwbGl0X2h1Z2VfcGFnZSgpXG5tbS9raHVnZXBhZ2VkLmMtODcxLVx0XHQgKiB3aGVuIGludm9rZWQgZnJvbSB0aGUgVk0uXG4tLVxubW0va3NtLmM9MTQ5Nj1zdGF0aWMgaW50IHRyeV90b19tZXJnZV9vbmVfcGFnZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbi0tXG5tbS9rc20uYy0xNTE4LVx0aWYgKGZvbGlvX3Rlc3RfbGFyZ2UoZm9saW8pKSB7XG5tbS9rc20uYzoxNTE5Olx0XHRpZiAoc3BsaXRfaHVnZV9wYWdlKHBhZ2UpKVxubW0va3NtLmMtMTUyMC1cdFx0XHRnb3RvIG91dF91bmxvY2s7XG4tLVxubW0va3NtLmM9MjI3Nj1zdGF0aWMgdm9pZCBjbXBfYW5kX21lcmdlX3BhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UsIHN0cnVjdCBrc21fcm1hcF9pdGVtICpybWFwX2l0ZW0pXG4tLVxubW0va3NtLmMtMjM2My1cdFx0ICogZm9saW8sIHRoZW4gd2UgYWN0dWFsbHkgZW5kZWQgdXAgaW5jcmVhc2luZyB0aGUgcmVmZXJlbmNlXG5tbS9rc20uYzoyMzY0Olx0XHQgKiBjb3VudCBvZiB0aGUgc2FtZSBmb2xpbyB0d2ljZSwgYW5kIHNwbGl0X2h1Z2VfcGFnZSBmYWlsZWQuXG5tbS9rc20uYy0yMzY1LVx0XHQgKlxubW0va3NtLmMtMjM2Ni1cdFx0ICogSGVyZSB3ZSBzZXQgYSBmbGFnIGlmIHRoYXQgaGFwcGVuZWQsIGFuZCB3ZSB1c2UgaXQgbGF0ZXIgdG9cbm1tL2tzbS5jOjIzNjc6XHRcdCAqIHRyeSBzcGxpdF9odWdlX3BhZ2UgYWdhaW4uIFNpbmNlIHdlIGNhbGwgZm9saW9fcHV0KCkgcmlnaHRcbm1tL2tzbS5jLTIzNjgtXHRcdCAqIGFmdGVyd2FyZHMsIHRoZSByZWZlcmVuY2UgY291bnQgd2lsbCBiZSBjb3JyZWN0IGFuZFxubW0va3NtLmM6MjM2OTpcdFx0ICogc3BsaXRfaHVnZV9wYWdlIHNob3VsZCBzdWNjZWVkLlxubW0va3NtLmMtMjM3MC1cdFx0ICovXG4tLVxubW0va3NtLmMtMjQwOS1cdFx0XHRcdHJldHVybjtcbm1tL2tzbS5jOjI0MTA6XHRcdFx0c3BsaXRfaHVnZV9wYWdlKHBhZ2UpO1xubW0va3NtLmMtMjQxMS1cdFx0XHRmb2xpbyA9IHBhZ2VfZm9saW8ocGFnZSk7XG4tLVxubW0vbWVtb3J5LWZhaWx1cmUuYz0xNzEzPXN0YXRpYyBpbnQgdHJ5X3RvX3NwbGl0X3RocF9wYWdlKHN0cnVjdCBwYWdlICpwYWdlLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyLFxuLS1cbm1tL21lbW9yeS1mYWlsdXJlLmMtMTcxOC1cdGxvY2tfcGFnZShwYWdlKTtcbm1tL21lbW9yeS1mYWlsdXJlLmM6MTcxOTpcdHJldCA9IHNwbGl0X2h1Z2VfcGFnZV90b19vcmRlcihwYWdlLCBuZXdfb3JkZXIpO1xubW0vbWVtb3J5LWZhaWx1cmUuYy0xNzIwLVx0dW5sb2NrX3BhZ2UocGFnZSk7XG4tLVxubW0vc2htZW0uYz0zNjIyPXN0YXRpYyBsb25nIHNobWVtX2ZhbGxvY2F0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgaW50IG1vZGUsIGxvZmZfdCBvZmZzZXQsXG4tLVxubW0vc2htZW0uYy0zNzEyLVx0ICogaW5mby1cdTAwM2VmYWxsb2NlbmQgaXMgb25seSByZWxldmFudCB3aGVuIGh1Z2UgcGFnZXMgbWlnaHQgYmVcbm1tL3NobWVtLmM6MzcxMzpcdCAqIGludm9sdmVkOiB0byBwcmV2ZW50IHNwbGl0X2h1Z2VfcGFnZSgpIGZyZWVpbmcgZmFsbG9jYXRlZFxubW0vc2htZW0uYy0zNzE0LVx0ICogcGFnZXMgd2hlbiBGQUxMT0NfRkxfS0VFUF9TSVpFIGNvbW1pdHRlZCBiZXlvbmQgaV9zaXplLlxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEzLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNyAyMTo1NDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxOTI1OQoJCQkJCQkJb3V0cHV0OiAzNAoJCQkJCQkJdGhvdWdodHM6IDIyMwoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgSHVnZSBQYWdlIFNwbGl0dGluZyBGdW5jdGlvbnMqKgoKT2theSwgc28gSSBuZWVkIHRvIHplcm8gaW4gb24gdGhlc2UgZnVuY3Rpb25zOiBgc3BsaXRfaHVnZV9wYWdlX3RvX2xpc3RfdG9fb3JkZXJgLCBgZm9saW9fc3BsaXRfdW5tYXBwZWRgLCBgX19zd2FwX2NhY2hlX3JlcGxhY2VfZm9saW9gLCBhbmQgYHNwbGl0X2ZvbGlvX3RvX2xpc3RgLiBJIHRoaW5rIGBzcGxpdF9odWdlX3BhZ2VfdG9fbGlzdF90b19vcmRlcmAgaXMgdGhlIHJpZ2h0IG5hbWUsIGJ1dCBJIHdhbnQgdG8gbWFrZSBhYnNvbHV0ZWx5IHN1cmUuIExldCBtZSBxdWlja2x5IHZlcmlmeSB0aGF0LiBIbW0sIHllcCwgdGhlcmUgaXQgaXMgaW4gYG1tL2h1Z2VfbWVtb3J5LmNgLgoKV2FpdCBhIG1pbnV0ZSwgdGhlIGBncmVwYCBvdXRwdXQgYWxzbyB0dXJuZWQgdXAgYHNwbGl0X2ZvbGlvX3RvX2xpc3RgLiBBbmQsIGhhbmcgb24sIHRoZXJlJiMzOTtzIGBfX3NwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyYCBhcyB3ZWxsISBPa2F5LCBjbGVhcmx5IEkgbmVlZCB0byBjbGFyaWZ5IHdoYXQgdGhlIHJlbGF0aW9uc2hpcCBpcyBiZXR3ZWVuIHRoZXNlIGZ1bmN0aW9ucy4gSXMgYHNwbGl0X2h1Z2VfcGFnZWAgcGVyaGFwcyBhIG1hY3JvIG9yIGlubGluZSBmdW5jdGlvbj8gTGV0JiMzOTtzIGNoZWNrIGBpbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaGAgZm9yIHRoYXQgZGVmaW5pdGlvbi4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDcgMjE6NTQ8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7c3BsaXRfaHVnZV9wYWdlJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7aW5jbHVkZS9saW51eC9odWdlX21tLmgmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7aW5jbHVkZS9saW51eC9odWdlX21tLmg9Mzk4PWVudW0gc3BsaXRfdHlwZSB7XG4tLVxuaW5jbHVkZS9saW51eC9odWdlX21tLmgtNDAyLVxuaW5jbHVkZS9saW51eC9odWdlX21tLmg6NDAzOmludCBfX3NwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyKHN0cnVjdCBwYWdlICpwYWdlLCBzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LFxuaW5jbHVkZS9saW51eC9odWdlX21tLmgtNDA0LVx0XHR1bnNpZ25lZCBpbnQgbmV3X29yZGVyKTtcbi0tXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaD00MTA9aW50IGZvbGlvX3NwbGl0KHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIsIHN0cnVjdCBwYWdlICpwYWdlLFxuLS1cbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oLTQxMi1cbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oOjQxMzpzdGF0aWMgaW5saW5lIGludCBzcGxpdF9odWdlX3BhZ2VfdG9fbGlzdF90b19vcmRlcihzdHJ1Y3QgcGFnZSAqcGFnZSwgc3RydWN0IGxpc3RfaGVhZCAqbGlzdCxcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oLTQxNC1cdFx0dW5zaWduZWQgaW50IG5ld19vcmRlcilcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oLTQxNS17XG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaDo0MTY6XHRyZXR1cm4gX19zcGxpdF9odWdlX3BhZ2VfdG9fbGlzdF90b19vcmRlcihwYWdlLCBsaXN0LCBuZXdfb3JkZXIpO1xuaW5jbHVkZS9saW51eC9odWdlX21tLmgtNDE3LX1cbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oOjQxODpzdGF0aWMgaW5saW5lIGludCBzcGxpdF9odWdlX3BhZ2VfdG9fb3JkZXIoc3RydWN0IHBhZ2UgKnBhZ2UsIHVuc2lnbmVkIGludCBuZXdfb3JkZXIpXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaC00MTkte1xuaW5jbHVkZS9saW51eC9odWdlX21tLmg6NDIwOlx0cmV0dXJuIHNwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyKHBhZ2UsIE5VTEwsIG5ld19vcmRlcik7XG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaC00MjEtfVxuaW5jbHVkZS9saW51eC9odWdlX21tLmgtNDIyLVxuaW5jbHVkZS9saW51eC9odWdlX21tLmg6NDIzOnN0YXRpYyBpbmxpbmUgaW50IHNwbGl0X2h1Z2VfcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSlcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oLTQyNC17XG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaDo0MjU6XHRyZXR1cm4gc3BsaXRfaHVnZV9wYWdlX3RvX2xpc3RfdG9fb3JkZXIocGFnZSwgTlVMTCwgMCk7XG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaC00MjYtfVxuLS1cbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oPTY0NT1zdGF0aWMgaW5saW5lIGludFxuaW5jbHVkZS9saW51eC9odWdlX21tLmg6NjQ2OnNwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyKHN0cnVjdCBwYWdlICpwYWdlLCBzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LFxuaW5jbHVkZS9saW51eC9odWdlX21tLmgtNjQ3LVx0XHR1bnNpZ25lZCBpbnQgbmV3X29yZGVyKVxuLS1cbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oLTY1MS19XG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaDo2NTI6c3RhdGljIGlubGluZSBpbnQgc3BsaXRfaHVnZV9wYWdlX3RvX29yZGVyKHN0cnVjdCBwYWdlICpwYWdlLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyKVxuaW5jbHVkZS9saW51eC9odWdlX21tLmgtNjUzLXtcbi0tXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaC02NTYtfVxuaW5jbHVkZS9saW51eC9odWdlX21tLmg6NjU3OnN0YXRpYyBpbmxpbmUgaW50IHNwbGl0X2h1Z2VfcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSlcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oLTY1OC17XG4tLVxuaW5jbHVkZS9saW51eC9odWdlX21tLmg9ODI2PXN0YXRpYyBpbmxpbmUgaW50IHNwbGl0X2ZvbGlvX3RvX29yZGVyKHN0cnVjdCBmb2xpbyAqZm9saW8sIGludCBuZXdfb3JkZXIpXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaC04Mjcte1xuaW5jbHVkZS9saW51eC9odWdlX21tLmg6ODI4Olx0cmV0dXJuIHNwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyKFx1MDAyNmZvbGlvLVx1MDAzZXBhZ2UsIE5VTEwsIG5ld19vcmRlcik7XG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaC04MjktfVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE1LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNyAyMTo1NDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyMDU4MQoJCQkJCQkJb3V0cHV0OiA0MQoJCQkJCQkJdGhvdWdodHM6IDEwNgoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgSHVnZSBQYWdlIFNwbGl0dGluZyBpbiB0aGUgS2VybmVsKioKCk9rYXksIHNvIEkmIzM5O20gZGl2aW5nIGludG8gdGhlIGh1Z2UgcGFnZSBzcGxpdHRpbmcgbWVjaGFuaXNtcyB3aXRoaW4gdGhlIGtlcm5lbCwgc3BlY2lmaWNhbGx5IGZvY3VzaW5nIG9uIHRoZSBjb3JlIGZ1bmN0aW9ucy4gTXkgaW5pdGlhbCBhc3Nlc3NtZW50IHBvaW50cyB0byBgX19zcGxpdF9odWdlX3BhZ2VfdG9fbGlzdF90b19vcmRlcmAgcmVzaWRpbmcgd2l0aGluIGBtbS9odWdlX21lbW9yeS5jYCBhcyB0aGUga2V5IGZ1bmN0aW9uIGZvciB0aGUgc3BsaXQgb3BlcmF0aW9uLiBJJiMzOTttIGFsc28gbm90aW5nIHRoYXQgYGZvbGlvX3NwbGl0X3VubWFwcGVkYCBpcyBhIGdsb2JhbCBmdW5jdGlvbiwgd2hpY2ggaXMgaW50ZXJlc3RpbmcgYXMgaXQgc3VnZ2VzdHMgaXRzIGF2YWlsYWJpbGl0eSBhY3Jvc3MgZGlmZmVyZW50IG1vZHVsZXMsIHdoaWNoIGltcGxpZXMgZ2VuZXJhbGl0eS4gYF9fc3dhcF9jYWNoZV9yZXBsYWNlX2ZvbGlvYCBpcyBhbHNvIGdsb2JhbGx5IGFjY2Vzc2libGUsIHdoaWNoIGluZGljYXRlcyBpdCYjMzk7cyBlc3NlbnRpYWwgZm9yIG1hbmFnaW5nIHBhZ2UgcmVwbGFjZW1lbnQgZHVyaW5nIHRoZSBzcGxpdCBvcGVyYXRpb25zLiBJJiMzOTttIGFsc28gYWRkaW5nIGBzcGxpdF9mb2xpb190b19saXN0YCB0byB0aGUgbGlzdCBvZiBnbG9iYWxseSBkZWZpbmVkIGZ1bmN0aW9ucy4KCk5vdywgSSYjMzk7bSBnb2luZyB0byBkaWcgZGVlcGVyIGludG8gdGhlIGFjdHVhbCBpbXBsZW1lbnRhdGlvbiBvZiBgX19zcGxpdF9odWdlX3BhZ2VfdG9fbGlzdF90b19vcmRlcmAgaW4gYG1tL2h1Z2VfbWVtb3J5LmNgIHRvIHNlZSBob3cgaXQgYWxsIHdvcmtzLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCBpdHMgbG9naWMuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTYvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA3IDIxOjU0PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O19fc3BsaXRfaHVnZV9wYWdlX3RvX2xpc3RfdG9fb3JkZXImIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDttbS9odWdlX21lbW9yeS5jJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O21tL2h1Z2VfbWVtb3J5LmM9NDMzNz1pbnQgZm9saW9fc3BsaXRfdW5tYXBwZWQoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlcilcbi0tXG5tbS9odWdlX21lbW9yeS5jLTQzOTQtICovXG5tbS9odWdlX21lbW9yeS5jOjQzOTU6aW50IF9fc3BsaXRfaHVnZV9wYWdlX3RvX2xpc3RfdG9fb3JkZXIoc3RydWN0IHBhZ2UgKnBhZ2UsIHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QsXG5tbS9odWdlX21lbW9yeS5jLTQzOTYtXHRcdFx0XHQgICAgIHVuc2lnbmVkIGludCBuZXdfb3JkZXIpXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTcvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA3IDIxOjU0PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDIxMDczCgkJCQkJCQlvdXRwdXQ6IDMwCgkJCQkJCQl0aG91Z2h0czogMTkKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGxldCYjMzk7cyBkaXZlIGludG8gdGhpcy4gSGVyZSYjMzk7cyBteSB0aG91Z2h0IHByb2Nlc3Mgb24gdGhlIG1hdHRlcjoKCioqQ2hlY2tpbmcgYGZvbGlvX3NwbGl0YCBpbiBgbW0vaHVnZV9tZW1vcnkuY2AqKgoKQWxyaWdodCwgdGhlIHRhc2sgYXQgaGFuZCBpcyB0byB1bmRlcnN0YW5kIGhvdyBgZm9saW9fc3BsaXRgIGlzIG9wZXJhdGluZyB3aXRoaW4gdGhlIGBtbS9odWdlX21lbW9yeS5jYCBmaWxlLiBNeSBleHBlcnQgaW50dWl0aW9uIGlzIHRlbGxpbmcgbWUgdGhhdCB0aGlzIGZ1bmN0aW9uIHBsYXlzIGEgY3J1Y2lhbCByb2xlIGluIG1hbmFnaW5nIGFuZCBwb3NzaWJseSBzcGxpdHRpbmcgaHVnZSBwYWdlcywgd2hpY2ggaXMgYSBjb3JlIGZ1bmN0aW9uYWxpdHkgZm9yIG9wdGltaXplZCBtZW1vcnkgdXRpbGl6YXRpb24uIEkgbmVlZCB0byByZWZyZXNoIG15IG1lbW9yeSBvbiB0aGUgaW50cmljYWNpZXMgb2YgdGhlIGh1Z2UgcGFnZSBpbXBsZW1lbnRhdGlvbiB3aXRoaW4gdGhlIGtlcm5lbCYjMzk7cyBtZW1vcnkgbWFuYWdlbWVudCBzeXN0ZW0sIHBhcnRpY3VsYXJseSB3aGVyZSBgZm9saW9fc3BsaXRgIGZpdHMgaW50byB0aGF0IHdvcmtmbG93LiBTbywgSSB3aWxsIGZvY3VzIG9uIHJldmlld2luZyB0aGUgbG9naWMgdG8gY29tcHJlaGVuZCBob3cgYGZvbGlvX3NwbGl0YCBkZWFscyB3aXRoIHRoZSBwYXJ0aXRpb25pbmcgb2YgaHVnZSBwYWdlcyBpbnRvIHNtYWxsZXIgb25lcywgcG90ZW50aWFsbHkgZm9yIGltcHJvdmVkIG1lbW9yeSBhbGxvY2F0aW9uIGZsZXhpYmlsaXR5IG9yIHRvIGRlYWwgd2l0aCBmcmFnbWVudGF0aW9uLiBJJiMzOTtsbCBiZSBsb29raW5nIGZvciBkZXRhaWxzIHJlZ2FyZGluZyBsb2NraW5nIG1lY2hhbmlzbXMsIHJlZmNvdW50IG1hbmFnZW1lbnQsIGFuZCB0aGUgb3ZlcmFsbCBpbXBhY3Qgb2YgdGhlIHNwbGl0IG9uIHRoZSBwYWdlIHRhYmxlcyBhbmQgdGhlIGFzc29jaWF0ZWQgbWV0YWRhdGEuIEkgZXhwZWN0IHRvIHNlZSBpbnRlcmFjdGlvbnMgd2l0aCB0aGUgZm9saW8gc3RydWN0dXJlcywgcGFnZSBmbGFncywgYW5kIHBvdGVudGlhbGx5IHRoZSByYWRpeCB0cmVlLCBzbyBJJiMzOTtsbCBiZSBwYXlpbmcgY2xvc2UgYXR0ZW50aW9uIHRvIHRoZXNlIGVsZW1lbnRzIGFzIEkgcmVhZCB0aHJvdWdoIHRoZSByZWxldmFudCBjb2RlLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE4LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNyAyMTo1NDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtmb2xpb19zcGxpdCYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O21tL2h1Z2VfbWVtb3J5LmMmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bW0vaHVnZV9tZW1vcnkuYz0zNzk1PXN0YXRpYyBpbnQgX19zcGxpdF91bm1hcHBlZF9mb2xpbyhzdHJ1Y3QgZm9saW8gKmZvbGlvLCBpbnQgbmV3X29yZGVyLFxuLS1cbm1tL2h1Z2VfbWVtb3J5LmMtMzgzOC1cbm1tL2h1Z2VfbWVtb3J5LmM6MzgzOTpcdFx0Zm9saW9fc3BsaXRfbWVtY2dfcmVmcyhmb2xpbywgb2xkX29yZGVyLCBzcGxpdF9vcmRlcik7XG5tbS9odWdlX21lbW9yeS5jLTM4NDAtXHRcdHNwbGl0X3BhZ2Vfb3duZXIoXHUwMDI2Zm9saW8tXHUwMDNlcGFnZSwgb2xkX29yZGVyLCBzcGxpdF9vcmRlcik7XG4tLVxubW0vaHVnZV9tZW1vcnkuYz00MDYwPXN0YXRpYyBpbnQgX19mb2xpb19mcmVlemVfc3BsaXRfdW5tYXBfZmlsZShzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyLFxuLS1cbm1tL2h1Z2VfbWVtb3J5LmMtNDIyNi0vKipcbm1tL2h1Z2VfbWVtb3J5LmM6NDIyNzogKiBfX2ZvbGlvX3NwbGl0KCkgLSBzcGxpdCBhIGZvbGlvIGF0IEBzcGxpdF9hdCB0byBhIEBuZXdfb3JkZXIgZm9saW9cbm1tL2h1Z2VfbWVtb3J5LmMtNDIyOC0gKiBAZm9saW86IGZvbGlvIHRvIHNwbGl0XG4tLVxubW0vaHVnZV9tZW1vcnkuYy00MjQ2LSAqL1xubW0vaHVnZV9tZW1vcnkuYzo0MjQ3OnN0YXRpYyBpbnQgX19mb2xpb19zcGxpdChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyLFxubW0vaHVnZV9tZW1vcnkuYy00MjQ4LVx0XHRzdHJ1Y3QgcGFnZSAqc3BsaXRfYXQsIHN0cnVjdCBwYWdlICpsb2NrX2F0LFxuLS1cbm1tL2h1Z2VfbWVtb3J5LmMtNDMxNS0vKipcbm1tL2h1Z2VfbWVtb3J5LmM6NDMxNjogKiBmb2xpb19zcGxpdF91bm1hcHBlZCgpIC0gc3BsaXQgYSBsYXJnZSBhbm9uIGZvbGlvIHRoYXQgaXMgYWxyZWFkeSB1bm1hcHBlZFxubW0vaHVnZV9tZW1vcnkuYy00MzE3LSAqIEBmb2xpbzogZm9saW8gdG8gc3BsaXRcbi0tXG5tbS9odWdlX21lbW9yeS5jLTQzMzYtICovXG5tbS9odWdlX21lbW9yeS5jOjQzMzc6aW50IGZvbGlvX3NwbGl0X3VubWFwcGVkKHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIpXG5tbS9odWdlX21lbW9yeS5jLTQzMzgte1xuLS1cbm1tL2h1Z2VfbWVtb3J5LmM9NDM5NT1pbnQgX19zcGxpdF9odWdlX3BhZ2VfdG9fbGlzdF90b19vcmRlcihzdHJ1Y3QgcGFnZSAqcGFnZSwgc3RydWN0IGxpc3RfaGVhZCAqbGlzdCxcbi0tXG5tbS9odWdlX21lbW9yeS5jLTQzOTktXG5tbS9odWdlX21lbW9yeS5jOjQ0MDA6XHRyZXR1cm4gX19mb2xpb19zcGxpdChmb2xpbywgbmV3X29yZGVyLCBcdTAwMjZmb2xpby1cdTAwM2VwYWdlLCBwYWdlLCBsaXN0LFxubW0vaHVnZV9tZW1vcnkuYy00NDAxLVx0XHRcdCAgICAgU1BMSVRfVFlQRV9VTklGT1JNKTtcbi0tXG5tbS9odWdlX21lbW9yeS5jLTQ0MDQtLyoqXG5tbS9odWdlX21lbW9yeS5jOjQ0MDU6ICogZm9saW9fc3BsaXQoKSAtIHNwbGl0IGEgZm9saW8gYXQgQHNwbGl0X2F0IHRvIGEgQG5ld19vcmRlciBmb2xpb1xubW0vaHVnZV9tZW1vcnkuYy00NDA2LSAqIEBmb2xpbzogZm9saW8gdG8gc3BsaXRcbi0tXG5tbS9odWdlX21lbW9yeS5jLTQ0MjctICovXG5tbS9odWdlX21lbW9yeS5jOjQ0Mjg6aW50IGZvbGlvX3NwbGl0KHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIsXG5tbS9odWdlX21lbW9yeS5jLTQ0MjktXHRcdHN0cnVjdCBwYWdlICpzcGxpdF9hdCwgc3RydWN0IGxpc3RfaGVhZCAqbGlzdClcbm1tL2h1Z2VfbWVtb3J5LmMtNDQzMC17XG5tbS9odWdlX21lbW9yeS5jOjQ0MzE6XHRyZXR1cm4gX19mb2xpb19zcGxpdChmb2xpbywgbmV3X29yZGVyLCBzcGxpdF9hdCwgXHUwMDI2Zm9saW8tXHUwMDNlcGFnZSwgbGlzdCxcbm1tL2h1Z2VfbWVtb3J5LmMtNDQzMi1cdFx0XHQgICAgIFNQTElUX1RZUEVfTk9OX1VOSUZPUk0pO1xuLS1cbm1tL2h1Z2VfbWVtb3J5LmM9NDc0OD1zdGF0aWMgaW50IHNwbGl0X2h1Z2VfcGFnZXNfcGlkKGludCBwaWQsIHVuc2lnbmVkIGxvbmcgdmFkZHJfc3RhcnQsXG4tLVxubW0vaHVnZV9tZW1vcnkuYy00ODQwLVx0XHRcdFx0XHRcdFx0ICAgaW5fZm9saW9fb2Zmc2V0KTtcbm1tL2h1Z2VfbWVtb3J5LmM6NDg0MTpcdFx0XHRpZiAoIWZvbGlvX3NwbGl0KGZvbGlvLCB0YXJnZXRfb3JkZXIsIHNwbGl0X2F0LCBOVUxMKSlcbm1tL2h1Z2VfbWVtb3J5LmMtNDg0Mi1cdFx0XHRcdHNwbGl0JiM0MzsmIzQzOztcbi0tXG5tbS9odWdlX21lbW9yeS5jPTQ4NjU9c3RhdGljIGludCBzcGxpdF9odWdlX3BhZ2VzX2luX2ZpbGUoY29uc3QgY2hhciAqZmlsZV9wYXRoLCBwZ29mZl90IG9mZl9zdGFydCxcbi0tXG5tbS9odWdlX21lbW9yeS5jLTQ5MTYtXHRcdFx0XHRcdFx0XHQgICBpbl9mb2xpb19vZmZzZXQpO1xubW0vaHVnZV9tZW1vcnkuYzo0OTE3Olx0XHRcdGlmICghZm9saW9fc3BsaXQoZm9saW8sIHRhcmdldF9vcmRlciwgc3BsaXRfYXQsIE5VTEwpKVxubW0vaHVnZV9tZW1vcnkuYy00OTE4LVx0XHRcdFx0c3BsaXQmIzQzOyYjNDM7O1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE5LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNyAyMTo1NDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyMjQwMQoJCQkJCQkJb3V0cHV0OiAzMgoJCQkJCQkJdGhvdWdodHM6IDM0CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBoZXJlJiMzOTtzIG15IHRha2Ugb24gdGhvc2UgdGhvdWdodHMsIHRhaWxvcmVkIGZvciBhbiBleHBlcnQgYXVkaWVuY2U6CgoqKkFuYWx5emluZyB0aGUgR2xvYmFsIFNjb3BlIG9mIGBmb2xpb19zcGxpdGAqKgoKQWxyaWdodCwgc28gSSYjMzk7bSBkZWFsaW5nIHdpdGggdGhlIGBmb2xpb19zcGxpdGAgZnVuY3Rpb24uIEkgcmVtZW1iZXIgaXQmIzM5O3MgYSBnbG9iYWwgZnVuY3Rpb24sIG1lYW5pbmcgaXQmIzM5O3MgbGlrZWx5IGFjY2Vzc2libGUgZnJvbSB2YXJpb3VzIHBhcnRzIG9mIHRoZSBrZXJuZWwuIFRoaXMgaW1tZWRpYXRlbHkgbWFrZXMgbWUgdGhpbmsgYWJvdXQgcG90ZW50aWFsIGNyb3NzLW1vZHVsZSBkZXBlbmRlbmNpZXMgYW5kIHRoZSBvdmVyYWxsIGltcGFjdCBvZiBtb2RpZmljYXRpb25zLiBNeSBuZXh0IHN0ZXAgaXMgY2xlYXIuIEkgbmVlZCB0byB6ZXJvIGluIG9uIGl0cyBkZWZpbml0aW9uIGFuZCB1bmRlcnN0YW5kIGl0cyBwcmVjaXNlIGJlaGF2aW9yLiBTcGVjaWZpY2FsbHksIEkmIzM5O20gZ29pbmcgdG8gbG9vayBhdCBgZm9saW9fc3BsaXRgIGluIGBpbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaGAuIFRoYXQgaGVhZGVyIGZpbGUgaXMgYSBwcmltZSBjYW5kaWRhdGUgZm9yIGRlZmluaW5nIGNvcmUgZm9saW8gb3BlcmF0aW9ucyBhbmQgc3RydWN0dXJlcy4gVGhpcyB3aWxsIGdpdmUgbWUgYSBzb2xpZCBmb3VuZGF0aW9uIGZvciB1bmRlcnN0YW5kaW5nIHRoZSBzY29wZSBvZiB3aGF0IEkmIzM5O20gZGVhbGluZyB3aXRoLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIwLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNyAyMTo1NDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtmb2xpb19zcGxpdCYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O2luY2x1ZGUvbGludXgvaHVnZV9tbS5oJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2luY2x1ZGUvbGludXgvaHVnZV9tbS5oPTQwMz1pbnQgX19zcGxpdF9odWdlX3BhZ2VfdG9fbGlzdF90b19vcmRlcihzdHJ1Y3QgcGFnZSAqcGFnZSwgc3RydWN0IGxpc3RfaGVhZCAqbGlzdCxcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oLTQwNC1cdFx0dW5zaWduZWQgaW50IG5ld19vcmRlcik7XG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaDo0MDU6aW50IGZvbGlvX3NwbGl0X3VubWFwcGVkKHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIpO1xuaW5jbHVkZS9saW51eC9odWdlX21tLmgtNDA2LXVuc2lnbmVkIGludCBtaW5fb3JkZXJfZm9yX3NwbGl0KHN0cnVjdCBmb2xpbyAqZm9saW8pO1xuLS1cbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oPTQwOD1pbnQgZm9saW9fY2hlY2tfc3BsaXR0YWJsZShzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyLFxuaW5jbHVkZS9saW51eC9odWdlX21tLmgtNDA5LVx0XHRcdCAgIGVudW0gc3BsaXRfdHlwZSBzcGxpdF90eXBlKTtcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oOjQxMDppbnQgZm9saW9fc3BsaXQoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlciwgc3RydWN0IHBhZ2UgKnBhZ2UsXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaC00MTEtXHRcdHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QpO1xuLS1cbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oPTY2OT1zdGF0aWMgaW5saW5lIGludCBzcGxpdF9mb2xpb190b19saXN0KHN0cnVjdCBmb2xpbyAqZm9saW8sIHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QpXG4tLVxuaW5jbHVkZS9saW51eC9odWdlX21tLmgtNjc0LVxuaW5jbHVkZS9saW51eC9odWdlX21tLmg6Njc1OnN0YXRpYyBpbmxpbmUgaW50IGZvbGlvX3NwbGl0KHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIsXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaC02NzYtXHRcdHN0cnVjdCBwYWdlICpwYWdlLCBzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0KVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIxLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNyAyMTo1NDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyMzAxNQoJCQkJCQkJb3V0cHV0OiAzNAoJCQkJCQkJdGhvdWdodHM6IDE0OAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgSHVnZSBQYWdlIFNwbGl0dGluZyoqCgpPa2F5LCBzbyBJIG5lZWQgdG8gemVybyBpbiBvbiB0aGUgZnVuY3Rpb25zIHJlbGF0ZWQgdG8gc3BsaXR0aW5nIGh1Z2UgcGFnZXMuIEZyb20gd2hhdCBJIGNhbiBzZWUsIHRoZSBjb3JlIG9uZXMgc2VlbSB0byBiZSBgX19zcGxpdF9odWdlX3BhZ2VfdG9fbGlzdF90b19vcmRlcmAsIGBmb2xpb19zcGxpdGAsIGBmb2xpb19zcGxpdF91bm1hcHBlZGAsIGFuZCBgX19zd2FwX2NhY2hlX3JlcGxhY2VfZm9saW9gLiBUaG9zZSBhcmUgZGVmaW5pdGVseSB0aGUgY3J1Y2lhbCBwaWVjZXMgb2YgdGhlIHB1enpsZS4KCk5vdywgbGV0JiMzOTtzIGp1c3QgbWFrZSBzdXJlIEkgaGF2ZW4mIzM5O3QgbWlzc2VkIGFueSByZWxldmFudCBjb25maWd1cmF0aW9uIG9wdGlvbnMuIEkmIzM5O20gYWxyZWFkeSBmYW1pbGlhciB3aXRoIGBUUkFOU1BBUkVOVF9IVUdFUEFHRWAsIG9idmlvdXNseSwgYnV0IEkmIzM5O2xsIG1ha2UgYSBxdWljayBtZW50YWwgbm90ZSBvZiBgU1dBUGAgYXMgd2VsbCDigJMgYWx3YXlzIGdvb2QgdG8ga2VlcCB0aG9zZSBkZXBlbmRlbmNpZXMgaW4gbWluZC4KClJpZ2h0LCBuZXh0IHN0ZXAuIEkgc2hvdWxkIHJlYWxseSBjaGVjayBob3cgYGZvbGlvX2NoZWNrX3NwbGl0dGFibGVgIHdvcmtzLiBJcyBpdCBleHBvcnRlZD8gSG1tLCB5ZXAsIGxvb2tzIGxpa2UgaXQmIzM5O3MgZGVmaW5lZCBpbiBgaW5jbHVkZS9saW51eC9odWdlX21tLmhgLiBUaGF0IG1ha2VzIHRoaW5ncyBlYXNpZXIuIE5vdywgdG8gdW5kZXJzdGFuZCB0aGUgYWN0dWFsIGltcGxlbWVudGF0aW9uLCBJIHNob3VsZCBmaW5kIHdoZXJlIGBmb2xpb19jaGVja19zcGxpdHRhYmxlYCBpcyBkZWZpbmVkLiBJIGJldCBpdCYjMzk7cyBpbiBgbW0vaHVnZV9tZW1vcnkuY2AsIHNvIEkmIzM5O2xsIGdvIHRoZXJlIGFuZCBzdGFydCB0aGVyZS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yMi8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDcgMjE6NTQ8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7Zm9saW9fY2hlY2tfc3BsaXR0YWJsZSYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O21tL2h1Z2VfbWVtb3J5LmMmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bW0vaHVnZV9tZW1vcnkuYz0zNzk1PXN0YXRpYyBpbnQgX19zcGxpdF91bm1hcHBlZF9mb2xpbyhzdHJ1Y3QgZm9saW8gKmZvbGlvLCBpbnQgbmV3X29yZGVyLFxuLS1cbm1tL2h1Z2VfbWVtb3J5LmMtMzg2MC0vKipcbm1tL2h1Z2VfbWVtb3J5LmM6Mzg2MTogKiBmb2xpb19jaGVja19zcGxpdHRhYmxlKCkgLSBjaGVjayBpZiBhIGZvbGlvIGNhbiBiZSBzcGxpdCB0byBhIGdpdmVuIG9yZGVyXG5tbS9odWdlX21lbW9yeS5jLTM4NjItICogQGZvbGlvOiBmb2xpbyB0byBiZSBzcGxpdFxuLS1cbm1tL2h1Z2VfbWVtb3J5LmMtMzg2Ny0gKlxubW0vaHVnZV9tZW1vcnkuYzozODY4OiAqIGZvbGlvX2NoZWNrX3NwbGl0dGFibGUoKSBjaGVja3MgaWYgQGZvbGlvIGNhbiBiZSBzcGxpdCB0byBAbmV3X29yZGVyIHVzaW5nXG5tbS9odWdlX21lbW9yeS5jLTM4NjktICogQHNwbGl0X3R5cGUgbWV0aG9kLiBUaGUgdHJ1bmNhdGVkIGZvbGlvIGNoZWNrIG11c3QgY29tZSBmaXJzdC5cbi0tXG5tbS9odWdlX21lbW9yeS5jLTM4NzUtICovXG5tbS9odWdlX21lbW9yeS5jOjM4NzY6aW50IGZvbGlvX2NoZWNrX3NwbGl0dGFibGUoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlcixcbm1tL2h1Z2VfbWVtb3J5LmMtMzg3Ny1cdFx0XHQgICBlbnVtIHNwbGl0X3R5cGUgc3BsaXRfdHlwZSlcbi0tXG5tbS9odWdlX21lbW9yeS5jPTQyNDc9c3RhdGljIGludCBfX2ZvbGlvX3NwbGl0KHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIsXG4tLVxubW0vaHVnZV9tZW1vcnkuYy00MjcwLVxubW0vaHVnZV9tZW1vcnkuYzo0MjcxOlx0cmV0ID0gZm9saW9fY2hlY2tfc3BsaXR0YWJsZShmb2xpbywgbmV3X29yZGVyLCBzcGxpdF90eXBlKTtcbm1tL2h1Z2VfbWVtb3J5LmMtNDI3Mi1cdGlmIChyZXQpIHtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yMy8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDcgMjE6NTQ8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMjM4MzIKCQkJCQkJCW91dHB1dDogMzIKCQkJCQkJCXRob3VnaHRzOiAyMjkKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqTXkgQW5hbHlzaXMgb2YgdGhlIEZvbGlvIFNwbGl0dGluZyBGdW5jdGlvbnMqKgoKT2theSwgc28gSSYjMzk7bSBsb29raW5nIGF0IHRoaXMgY29kZSBhbmQgdHJ5aW5nIHRvIGdldCBhIGhhbmRsZSBvbiB0aGUga2V5IGZ1bmN0aW9ucyBoZXJlLCBwYXJ0aWN1bGFybHkgZm9yIGZ1enppbmcuIEkgY2FuIHNlZSB0aGF0IHRoaXMgZnVuY3Rpb24sIHdoaWxlIGV4cG9ydGVkLCBpcyBlc3NlbnRpYWxseSBhIGhlbHBlciBmdW5jdGlvbi4gVGhlIHJlYWwgd29ya2hvcnNlcyBzZWVtIHRvIGJlIGBmb2xpb19zcGxpdGAsIGBmb2xpb19zcGxpdF91bm1hcHBlZGAsIGFuZCBgX19zcGxpdF9odWdlX3BhZ2VfdG9fbGlzdF90b19vcmRlcmAuIE15IGluaXRpYWwgdGhvdWdodCBpcyB0byBmb2N1cyBvbiB0aG9zZS4KCk5vdywgbGV0IG1lIGp1c3QgY29uZmlybSBzb21ldGhpbmcuLi4gYWgsIHllcy4gYHNwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyYCBpcyBhbiBpbmxpbmUgZnVuY3Rpb24sIGFuZCBpdCYjMzk7cyBjYWxsaW5nIGBfX3NwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyYC4gU2luY2UgaXQmIzM5O3MgaW5saW5lLCBhbmQgdGhpcyBpcyB0aGUgb25lIGFjdHVhbGx5ICpkb2luZyogdGhlIHdvcmssIGxldCYjMzk7cyB0YXJnZXQgYF9fc3BsaXRfaHVnZV9wYWdlX3RvX2xpc3RfdG9fb3JkZXJgIGluc3RlYWQgb2YgaXRzIGlubGluZWQgY291bnRlcnBhcnQuCgpJIHNlZSB0aGF0IGBzcGxpdF9mb2xpb190b19saXN0YCBpcyBhbHNvIGlubGluZSwgYW5kIGl0IGNhbGxzIGBzcGxpdF9odWdlX3BhZ2VfdG9fbGlzdF90b19vcmRlcmAuIE9rYXksIHRoYXQgY2xhcmlmaWVzIHRoaW5ncy4KClNvLCBoZXJlJiMzOTtzIG15IHVwZGF0ZWQgbGlzdCBvZiBmdW5jdGlvbnMgdG8gZnV6ejoKCiogICBgX19zcGxpdF9odWdlX3BhZ2VfdG9fbGlzdF90b19vcmRlcmAgLSBUaGlzIGlzIGEgcHJpbWFyeSBjYW5kaWRhdGUuCiogICBgZm9saW9fc3BsaXRgIC0gSXQmIzM5O3MgYSBtYWluIGVudHJ5IHBvaW50LgoqICAgYGZvbGlvX3NwbGl0X3VubWFwcGVkYCAtIEFub3RoZXIgbWFpbiBlbnRyeSBwb2ludC4KKiAgIGBfX3N3YXBfY2FjaGVfcmVwbGFjZV9mb2xpb2AgLSBXZSBzaG91bGQgbG9vayBhdCB0aGlzIGFzIHdlbGwuCgpOb3csIGxldCYjMzk7cyBzZWUgaWYgYF9fc3dhcF9jYWNoZV9yZXBsYWNlX2ZvbGlvYCBpcyBhY3R1YWxseSBleHBvcnRlZC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yNC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDcgMjE6NTU8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPkVycm9yOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bm8gbWF0Y2hlczwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtFWFBPUlRfU1lNQk9MLipfX3N3YXBfY2FjaGVfcmVwbGFjZV9mb2xpbyYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0OyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtlcnJvciYjMzQ7OiAmIzM0O25vIG1hdGNoZXMmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjUvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA3IDIxOjU1PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDI0NDY3CgkJCQkJCQlvdXRwdXQ6IDM1CgkJCQkJCQl0aG91Z2h0czogNDIKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGhlcmUmIzM5O3MgbXkgdGFrZSBvbiB0aG9zZSB0aG91Z2h0cywgZnJhbWVkIGFzIG15IG93bjoKCioqQW5hbHl6aW5nIGEgRnVuY3Rpb24mIzM5O3MgU2NvcGUqKgoKQWxyaWdodCwgc28gdGhlIGZ1bmN0aW9uIGluIHF1ZXN0aW9uIGlzbiYjMzk7dCBleHBsaWNpdGx5IGV4cG9ydGVkLCBidXQgaXQmIzM5O3MgZGVmaW5lZCBnbG9iYWxseSDigJMgdGhhdCYjMzk7cyB0aGUga2V5LiBTbywgc2luY2UgaXQgaXNuJiMzOTt0IHN0YXRpYywgaXQmIzM5O3MgZ2xvYmFsbHkgdmlzaWJsZSB3aXRoaW4gdGhlIGtlcm5lbCwgZXZlbiBpZiBpdCYjMzk7cyBub3QgcGFydCBvZiB0aGUgc3RhbmRhcmQgQUJJLiBOb3csIEkgbmVlZCB0byB1bmRlcnN0YW5kIGl0cyByZWxhdGlvbnNoaXAgdG8gdGhlIHN3YXAgY2FjaGUuIFNpbmNlIHRoaXMgbG9va3MgbGlrZSBhIHN3YXAtcmVsYXRlZCBmdW5jdGlvbiwgbXkgaW50dWl0aW9uIGltbWVkaWF0ZWx5IHBvaW50cyBtZSB0b3dhcmQgYG1tL3N3YXBfc3RhdGUuY2AuIExldCYjMzk7cyBkaWcgaW50byB0aGF0IHNvdXJjZSBmaWxlIGFuZCBsb29rIGZvciB0aGUgZnVuY3Rpb24gYF9fc3dhcF9jYWNoZV9yZXBsYWNlX2ZvbGlvYC4gVGhhdCBzaG91bGQgZ2l2ZSBtZSB0aGUgY29udGV4dCBJIG5lZWQgdG8gZmlndXJlIG91dCBpdHMgcHVycG9zZS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yNi8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDcgMjE6NTU8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7X19zd2FwX2NhY2hlX3JlcGxhY2VfZm9saW8mIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDttbS9zd2FwX3N0YXRlLmMmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bW0vc3dhcF9zdGF0ZS5jPTMzNT12b2lkIHN3YXBfY2FjaGVfZGVsX2ZvbGlvKHN0cnVjdCBmb2xpbyAqZm9saW8pXG4tLVxubW0vc3dhcF9zdGF0ZS5jLTM0Ny0vKipcbm1tL3N3YXBfc3RhdGUuYzozNDg6ICogX19zd2FwX2NhY2hlX3JlcGxhY2VfZm9saW8gLSBSZXBsYWNlIGEgZm9saW8gaW4gdGhlIHN3YXAgY2FjaGUuXG5tbS9zd2FwX3N0YXRlLmMtMzQ5LSAqIEBjaTogVGhlIGxvY2tlZCBzd2FwIGNsdXN0ZXIuXG4tLVxubW0vc3dhcF9zdGF0ZS5jLTM2MC0gKi9cbm1tL3N3YXBfc3RhdGUuYzozNjE6dm9pZCBfX3N3YXBfY2FjaGVfcmVwbGFjZV9mb2xpbyhzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpLFxubW0vc3dhcF9zdGF0ZS5jLTM2Mi1cdFx0XHRcdHN0cnVjdCBmb2xpbyAqb2xkLCBzdHJ1Y3QgZm9saW8gKm5ldylcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yNy8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDcgMjE6NTU8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMjQ4ODIKCQkJCQkJCW91dHB1dDogMzMKCQkJCQkJCXRob3VnaHRzOiA4MgoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgaGVyZSYjMzk7cyBteSBpbnRlcnByZXRhdGlvbiBvZiB0aGVzZSB0aG91Z2h0cywgcHV0dGluZyBteXNlbGYgaW4gdGhlIHJvbGUgb2YgYW4gZXhwZXJ0OgoKKipJbnZlc3RpZ2F0aW5nIHRoZSBTY29wZSBhbmQgRGVwZW5kZW5jaWVzKioKCkFscmlnaHQsIHNvIHRoaXMgbG9va3MgbGlrZSBhIGdsb2JhbCBmdW5jdGlvbiwgYSBrZXkgcGllY2Ugb2YgaW5mcmFzdHJ1Y3R1cmUuIEZpcnN0IHRoaW5ncyBmaXJzdCwgSSBuZWVkIHRvIHVuZGVyc3RhbmQgaXRzIGNvbnRleHQuIExldCYjMzk7cyBzZWUuLi4gSSBzaG91bGQgY2hlY2sgZm9yIG90aGVyIHJlbGF0ZWQgY29uZmlndXJhdGlvbnMuIE15IG1lbnRhbCBjaGVja2xpc3Qga2lja3MgaW46IEkmIzM5O20gdGhpbmtpbmcgYWJvdXQgdGhlIGltcGxpY2F0aW9ucyBvZiB0aGUgYENPTkZJR19UUkFOU1BBUkVOVF9IVUdFUEFHRWAsIHNpbmNlIHRoaXMgY291bGQgaW5mbHVlbmNlIG1lbW9yeSBtYW5hZ2VtZW50IHNpZ25pZmljYW50bHkuIFRoZW4sIHRoZSBwcmVzZW5jZSBvZiBgQ09ORklHX1NXQVBgIGRlZmluaXRlbHkgYmVhcnMgd2F0Y2hpbmcuIEZpbmFsbHksIHRoZSB1c2Ugb2YgYG1lbV9jZ3JvdXBfZnJvbV9mb2xpb2AgYW5kIGBzZXRfYWN0aXZlX21lbWNnYCBpcyB0aGUgbW9zdCBpbXBvcnRhbnQgcGFydCBvZiB0aGlzIGZ1bmN0aW9uLiBUaGlzIGZ1bmN0aW9uIGFic29sdXRlbHkgc2NyZWFtcyBgQ09ORklHX01FTUNHYCBkZXBlbmRlbmN5IHRvIG1lLiBNeSBpbnR1aXRpb24gaXMgdGhhdCB0aGlzIGlzIGFic29sdXRlbHkgYSBkZXBlbmRlbmN5LiBMZXQmIzM5O3MgZGlnIGRlZXBlciBhbmQgdmVyaWZ5IHRoYXQgYE1FTUNHYCBjb25maWd1cmF0aW9uIGlzIGFjdHVhbGx5IG5lY2Vzc2FyeSBhbmQgbm90IGp1c3QgYSBsZWZ0b3ZlciB0cmFjZS4gVW5kZXJzdGFuZGluZyAqdGhpcyogaXMgdGhlIG1vc3QgaW1wb3J0YW50IHRoaW5nLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI4LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNyAyMTo1NTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtzZXRfYWN0aXZlX21lbWNnJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7bW0vaHVnZV9tZW1vcnkuYyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDttbS9odWdlX21lbW9yeS5jPTQwNjA9c3RhdGljIGludCBfX2ZvbGlvX2ZyZWV6ZV9zcGxpdF91bm1hcF9maWxlKHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIsXG4tLVxubW0vaHVnZV9tZW1vcnkuYy00MDg1LVx0bWVtY2cgPSBnZXRfbWVtX2Nncm91cF9mcm9tX2ZvbGlvKGZvbGlvKTtcbm1tL2h1Z2VfbWVtb3J5LmM6NDA4NjpcdG9sZF9tZW1jZyA9IHNldF9hY3RpdmVfbWVtY2cobWVtY2cpO1xubW0vaHVnZV9tZW1vcnkuYy00MDg3LVxuLS1cbm1tL2h1Z2VfbWVtb3J5LmMtNDIxOS1cdC8qIFJlc3RvcmUgdGhlIHByZXZpb3VzbHkgYWN0aXZlIG1lbWNnICovXG5tbS9odWdlX21lbW9yeS5jOjQyMjA6XHRzZXRfYWN0aXZlX21lbWNnKG9sZF9tZW1jZyk7XG5tbS9odWdlX21lbW9yeS5jLTQyMjEtXHRtZW1fY2dyb3VwX3B1dChtZW1jZyk7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjkvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA3IDIxOjU1PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDI1NDEzCgkJCQkJCQlvdXRwdXQ6IDM0CgkJCQkJCQl0aG91Z2h0czogNDIKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGhlcmUmIzM5O3MgbXkgdGFrZSBvbiB0aG9zZSB0aG91Z2h0cywgZnJhbWVkIGFzIG15IG93bjoKCioqSW52ZXN0aWdhdGluZyBhIFBvdGVudGlhbCBOby1PcCoqCgpIbW0sIEkgc2VlIHRoaXMgZnVuY3Rpb24gY2FsbC4gSXQgKmxvb2tzKiBsaWtlIGl0JiMzOTtzIGJlaW5nIHVzZWQsIGJ1dCBJJiMzOTt2ZSBnb3QgYSBmZWVsaW5nIGl0IG1pZ2h0IGp1c3QgYmUgYSBuby1vcCB1bmRlciBjZXJ0YWluIGNvbmZpZ3VyYXRpb25zLiBNeSBndXQgdGVsbHMgbWUgaXQmIzM5O3MgcHJvYmFibHkgdGllZCB0byBtZW1vcnkgY29udHJvbCBncm91cHMsIG9yIGBDT05GSUdfTUVNQ0dgLiBMZXQgbWUgcXVpY2tseSBjb25maXJtIHRoaXMgaHlwb3RoZXNpcy4gVGhlIGRlZmluaXRpb25zIGZvciB0aGlzIGtpbmQgb2YgdGhpbmcgYWx3YXlzIHJlc2lkZSBpbiBgaW5jbHVkZS9saW51eC9tZW1jb250cm9sLmhgLiBUaW1lIHRvIGRpZyBpbiB0aGVyZSBhbmQgc2VlIGlmIG15IGh1bmNoIGlzIGNvcnJlY3QuIEkgYmV0IGl0JiMzOTtzIGNvbmRpdGlvbmFsbHkgY29tcGlsZWQuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzAvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA3IDIxOjU1PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O3NldF9hY3RpdmVfbWVtY2cmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtpbmNsdWRlL2xpbnV4L21lbWNvbnRyb2wuaCYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtpbmNsdWRlL2xpbnV4L21lbWNvbnRyb2wuaD0xNzM2PXZvaWQgX19tZW1jZ19rbWVtX3VuY2hhcmdlX3BhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UsIGludCBvcmRlcik7XG4tLVxuaW5jbHVkZS9saW51eC9tZW1jb250cm9sLmgtMTc0MS0gKiB0aGUgY3VycmVudCB0YXNrIChzaW1pbGFyIHRvIHRoZSBcJiMzNDtjdXJyZW50XCYjMzQ7IGdsb2JhbCB2YXJpYWJsZSlcbmluY2x1ZGUvbGludXgvbWVtY29udHJvbC5oOjE3NDI6ICogb3IgYnkgc2V0X2FjdGl2ZV9tZW1jZygpIHBhaXIuXG5pbmNsdWRlL2xpbnV4L21lbWNvbnRyb2wuaC0xNzQzLSAqIFBsZWFzZSwgdXNlIG9ial9jZ3JvdXBfZ2V0KCkgdG8gZ2V0IGEgcmVmZXJlbmNlIGlmIHRoZSBwb2ludGVyXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzEvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA3IDIxOjU1PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDI1NzYzCgkJCQkJCQlvdXRwdXQ6IDI3CgkJCQkJCQl0aG91Z2h0czogMzU3CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKk15IEFuYWx5c2lzIG9mIHRoZSBIdWdlIFBhZ2UgU3BsaXR0aW5nIExvZ2ljKioKCk9rYXksIHNvIEkmIzM5O3ZlIGJlZW4gdGFraW5nIGEgbG9vayBhdCB0aGlzIHBhdGNoLCBhbmQgdGhlIGNvcmUgb2YgaXQgc2VlbXMgcHJldHR5IHN0cmFpZ2h0Zm9yd2FyZC4gVGhlIG1haW4gY29uZmlndXJhdGlvbnMgdGhhdCBJJiMzOTttIGZvY3VzaW5nIG9uIGFyZSwgb2YgY291cnNlLCBgVFJBTlNQQVJFTlRfSFVHRVBBR0VgIGFuZCBgU1dBUGAuIFRob3NlIGFyZSB0aGUgb25lcyBkcml2aW5nIHRoZSBzaWduaWZpY2FudCBjaGFuZ2VzIGhlcmUuCgpOb3csIGxldCYjMzk7cyBicmVhayBkb3duIHRoZSBrZXkgZnVuY3Rpb25zIGF0IHBsYXkuIFdlJiMzOTt2ZSBnb3Q6CgoqICAgYF9fc3BsaXRfaHVnZV9wYWdlX3RvX2xpc3RfdG9fb3JkZXJgOiBUaGlzIGFwcGVhcnMgdG8gYmUgdGhlIHByaW1hcnkgZW50cnkgcG9pbnQgZm9yIHNwbGl0dGluZyB0aGVzZSBodWdlIHBhZ2VzLgoqICAgYGZvbGlvX3NwbGl0YDogQW5vdGhlciBjcnVjaWFsIGVudHJ5IHBvaW50IHRvIG1hbmFnZSB0aGlzIHByb2Nlc3MuCiogICBgZm9saW9fc3BsaXRfdW5tYXBwZWRgOiBUaGlzIGlzIGFub3RoZXIgZW50cnkgcG9pbnQgZm9yIHNwbGl0dGluZyB1bm1hcHBlZCBmb2xpb3MuCiogICBgX19zd2FwX2NhY2hlX3JlcGxhY2VfZm9saW9gOiBUaGVuLCB0aGVyZSYjMzk7cyB0aGlzIGhlbHBlciBmdW5jdGlvbiwgd2hpY2ggaXMgaW50ZXJlc3RpbmcgYmVjYXVzZSBpdCYjMzk7cyBpbiBgbW0vc3dhcF9zdGF0ZS5jYC4KCkkmIzM5O2xsIG1ha2Ugc3VyZSB0byBkb3VibGUtY2hlY2sgdGhlIHJvbGUgb2YgYF9fc3BsaXRfaHVnZV9wYWdlX3RvX2xpc3RfdG9fb3JkZXJgLCBpdCBsb29rcyBsaWtlIGl0JiMzOTtzIHRoZSBtYWluIGVudHJ5IHBvaW50IHRvIHNwbGl0dGluZy4KCkZyb20gd2hhdCBJIGNhbiB0ZWxsLCB0aGlzIHBhdGNoIGlzIHJlYWxseSByZXdvcmtpbmcgdGhlIHNwbGl0dGluZyBsb2dpYywgcGFydGljdWxhcmx5IHdoZW4gZGVhbGluZyB3aXRoIHVubWFwcGVkIGZvbGlvcy4gSXQgc2VlbXMgdG8gYmUgcGF5aW5nIHNwZWNpYWwgYXR0ZW50aW9uIHRvIHN3YXBjYWNoZSBhbmQgYW5vbnltb3VzIGZvbGlvcywgd2hpY2ggbWFrZXMgc2Vuc2UgZ2l2ZW4gdGhlIHBvdGVudGlhbCBwZXJmb3JtYW5jZSBpbXBsaWNhdGlvbnMuIFNwZWNpZmljYWxseSwgdGhlIHBhdGNoIGludHJvZHVjZXMgYF9fZm9saW9fZnJlZXplX3NwbGl0X3VubWFwYCBhbmQgYF9fZm9saW9fZnJlZXplX3NwbGl0X3VubWFwX2ZpbGVgIGFzIHN0YXRpYyBmdW5jdGlvbnMuIEl0IGFsc28gYXBwZWFycyB0byBiZSBtb2RpZnlpbmcgYGZvbGlvX2NoZWNrX3NwbGl0dGFibGVgIHRvIGhhbmRsZSBzd2FwY2FjaGUgZm9saW9zIGRpZmZlcmVudGx5IGFuZCBtb2RpZnlpbmcgYF9fZm9saW9fc3BsaXRgIHRvIGNhbGwgdGhlc2UgbmV3IGZ1bmN0aW9ucy4KCkkgdGhpbmsgdGhlcmUgYXJlIGVub3VnaCBpbnRlcmVzdGluZyBwaWVjZXMgaGVyZS4gSXQmIzM5O3MgdGltZSB0byBzZXQgYFdvcnRoRnV6emluZz10cnVlYC4KCkkmIzM5O2xsIGJlIGtlZXBpbmcgYSB2ZXJ5IGNsb3NlIGV5ZSBvbiB0aGVzZSBzeW1ib2xzOgoKKiAgIGBfX3NwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyYAoqICAgYGZvbGlvX3NwbGl0YAoqICAgYGZvbGlvX3NwbGl0X3VubWFwcGVkYAoqICAgYF9fc3dhcF9jYWNoZV9yZXBsYWNlX2ZvbGlvYAoKQW5kIHRvIGJlIHN1cmUsIEkgd2lsbCBrZWVwIGBUUkFOU1BBUkVOVF9IVUdFUEFHRWAgYW5kIGBTV0FQYCBlbmFibGVkLgoKT25lIGxhc3QgdGhpbmcsIGxldCBtZSBqdXN0IHF1aWNrbHkgY29uZmlybSB3aGV0aGVyIGBmb2xpb19zcGxpdGAgaXMgZXhwb3J0ZWQgcHJvcGVybHkgb3IgaWYgaXQgaXMganVzdCBhIGdsb2JhbCBmdW5jdGlvbi4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zMi8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDcgMjE6NTU8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPkVycm9yOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bm8gbWF0Y2hlczwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtFWFBPUlRfU1lNQk9MLipmb2xpb19zcGxpdCYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0OyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtlcnJvciYjMzQ7OiAmIzM0O25vIG1hdGNoZXMmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzMvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA3IDIxOjU1PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDI2NjcxCgkJCQkJCQlvdXRwdXQ6IDMwCgkJCQkJCQl0aG91Z2h0czogMTgKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgYXR0ZW1wdCBhdCBzdW1tYXJpemluZyB0aGF0IHRob3VnaHQgcHJvY2VzcywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZToKCioqR2xvYmFsIFNjb3BlIENoZWNrOiBgZm9saW9fc3BsaXRfdW5tYXBwZWRgKioKCk9rYXksIG15IGluaXRpYWwgaW1wcmVzc2lvbiBpcyB0aGlzIGlzIGEgZ2xvYmFsIGlzc3VlLiBUaGUgZmFjdCB0aGF0IGl0JiMzOTtzIHN1cmZhY2VkIGF0IGFsbCBzdWdnZXN0cyBpdCYjMzk7cyBub3QgaXNvbGF0ZWQuIEkgbmVlZCB0byBmaWd1cmUgb3V0IHRoZSBleHRlbnQgb2YgdGhlIGltcGFjdC4gVGhlIG1lbnRpb24gb2YgYGZvbGlvX3NwbGl0X3VubWFwcGVkYCBpbW1lZGlhdGVseSBicmluZ3MgbWUgdG8gbWluZCBvZiBhIGNydWNpYWwgYXJlYSB3aXRoaW4gdGhlIGNvcmUgZGF0YSBwaXBlbGluZS4gSSYjMzk7bSBnb2luZyB0byB3YW50IHRvIGZvY3VzIG9uIHRoYXQgc3BlY2lmaWMgZnVuY3Rpb24gb3IgcHJvY2VzcywgaXQmIzM5O3Mga2V5LiBJZiBpdCYjMzk7cyByZWxhdGVkIHRvIGhvdyB3ZSYjMzk7cmUgc3BsaXR0aW5nIG9yIG1hcHBpbmcgRm9saW8gZGF0YSwgd2hpY2ggc2VlbXMgbGlrZWx5IGdpdmVuIHRoZSBuYW1lLCB0aGF0JiMzOTtzIGFsbW9zdCBhbHdheXMgYSBjcml0aWNhbCBwYXJ0IG9mIGRhdGEgbG9hZGluZyBvciB0cmFuc2Zvcm1hdGlvbi4gTGV0JiMzOTtzIGRlbHZlIGluIHRvIHRoYXQgZnVuY3Rpb24gZGlyZWN0bHkuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzQvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA3IDIxOjU1PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5FcnJvcjo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm5vIG1hdGNoZXM8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7RVhQT1JUX1NZTUJPTC4qZm9saW9fc3BsaXRfdW5tYXBwZWQmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDsmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7ZXJyb3ImIzM0OzogJiMzNDtubyBtYXRjaGVzJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjM1LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNyAyMTo1NTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyNjkwMAoJCQkJCQkJb3V0cHV0OiAzOAoJCQkJCQkJdGhvdWdodHM6IDI2CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBoZXJlJiMzOTtzIG15IHRha2Ugb24gdGhvc2UgdGhvdWdodHMsIHRhaWxvcmVkIGZvciBhbiBleHBlcnQgYXVkaWVuY2U6CgoqKkdsb2JhbCBTY29wZSBDaGVjazogYF9fc3BsaXRfaHVnZV9wYWdlX3RvX2xpc3RfdG9fb3JkZXJgKioKClJpZ2h0LCB0aGlzIGZlZWxzIGxpa2UgaXQmIzM5O3MgYSBwaWVjZSBvZiBzb21ldGhpbmcgbXVjaCBsYXJnZXIsIHNvbWV0aGluZyB3aXRoIGdsb2JhbCBpbXBsaWNhdGlvbnMsIGFuZCBpdCYjMzk7cyBpbXBvcnRhbnQgdG8gZ3Jhc3AgdGhlIGZ1bGwgYnJlYWR0aCBvZiB0aGUgc2l0dWF0aW9uLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGUgZ2xvYmFsIHNjb3BlIG9mIHRoaXMgaXNzdWUgdG8gZnVsbHkgZGlnZXN0IHRoZSBwcm9ibGVtLiBNeSBmaXJzdCBpbnN0aW5jdCwgZ2l2ZW4gdGhlIGJyaWVmLCBpcyB0byBpbW1lZGlhdGVseSBjaGVjayB0aGUgZnVuY3Rpb24gSSBrbm93IHRvIGJlIG1vc3QgcGVydGluZW50IGluIHRoaXMgc2l0dWF0aW9uOiBgX19zcGxpdF9odWdlX3BhZ2VfdG9fbGlzdF90b19vcmRlcmAuIFRoaXMgaXMgd2hlcmUgSSYjMzk7ZCBzdGFydCBkaWdnaW5nIGludG8gdGhlIGRldGFpbHMgb2YgdGhlIGh1Z2UgcGFnZSBtYW5hZ2VtZW50LiBUaGlzIHJvdXRpbmUgaXMgbGlrZWx5IHRoZSBseW5jaHBpbiwgdGhlIHBsYWNlIHdoZXJlIGRlY2lzaW9ucyByZWdhcmRpbmcgb3JkZXJpbmcgYW5kIHNwbGl0dGluZyBhcmUgbWFkZSwgcGFydGljdWxhcmx5IHdpdGhpbiB0aGUgY29udGV4dCBvZiBtYXNzaXZlIG1lbW9yeSBhbGxvY2F0aW9uIG9yIHBvdGVudGlhbGx5IGRlLWFsbG9jYXRpb247IGFuZCBpcyB0aGUgb2J2aW91cyBmaXJzdCBwbGFjZSB0byBleHBsb3JlLiBJJiMzOTttIGltbWVkaWF0ZWx5IHRyeWluZyB0byB1bmRlcnN0YW5kIGhvdyB0aGlzIGltcGFjdHMgdGhlIGxhcmdlciBzeXN0ZW0uCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzYvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA3IDIxOjU1PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5FcnJvcjo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm5vIG1hdGNoZXM8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7RVhQT1JUX1NZTUJPTC4qX19zcGxpdF9odWdlX3BhZ2VfdG9fbGlzdF90b19vcmRlciYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0OyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtlcnJvciYjMzQ7OiAmIzM0O25vIG1hdGNoZXMmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzcvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA3IDIxOjU1PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDI3MTg0CgkJCQkJCQlvdXRwdXQ6IDIyNAoJCQkJCQkJdGhvdWdodHM6IDIwMwoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgaGVyZSYjMzk7cyBteSB0YWtlIG9uIHRob3NlIHRob3VnaHRzLCBmcmFtZWQgZnJvbSBteSBleHBlcnQgcGVyc3BlY3RpdmU6CgoqKkRlZXAgRGl2ZSBvbiBGb2xpbyBTcGxpdHRpbmcqKgoKUmlnaHQsIHRoaXMgaXMgYSBzeXN0ZW1pYyBjaGFuZ2Ug4oCTIGl0JiMzOTtzIGdsb2JhbCBpbiBpdHMgaW1wbGljYXRpb25zLiBBbmQgYSBxdWljayBjbGFyaWZpY2F0aW9uOiB0aGF0IGBzcGxpdF9odWdlX3BhZ2VfdG9fbGlzdF90b19vcmRlcmAgZnVuY3Rpb24gSSB3YXMgbG9va2luZyBhdD8gSXQmIzM5O3MgaW5saW5lLCBzbyB0aGUgcmVhbCB3b3JraG9yc2UgaXMgYWN0dWFsbHkgYF9fc3BsaXRfaHVnZV9wYWdlX3RvX2xpc3RfdG9fb3JkZXJgLiBHb3QgaXQuCgpOb3csIGxldCYjMzk7cyB1bnBhY2sgdGhlIGxvZ2ljLiBUaGlzIHBhdGNoIGlzIGVzc2VudGlhbGx5IHJlZmFjdG9yaW5nIHRoZSB3YXkgd2UgaGFuZGxlIHRoZSBzcGxpdHRpbmcgb2YgdW5tYXBwZWQgZm9saW9zLCBmb2N1c2luZyBvbiB0aGUgc3dhcGNhY2hlIGFuZCBhbm9ueW1vdXMgZm9saW8gc2NlbmFyaW9zLiBJIHNlZSB0aGV5JiMzOTtyZSBpbnRyb2R1Y2luZyBgX19mb2xpb19mcmVlemVfc3BsaXRfdW5tYXBgIGFuZCBgX19mb2xpb19mcmVlemVfc3BsaXRfdW5tYXBfZmlsZWAgYXMgcmVwbGFjZW1lbnRzIGZvciB0aGF0IG9sZGVyIGBfX2ZvbGlvX2ZyZWV6ZV9hbmRfc3BsaXRfdW5tYXBwZWRgIGZ1bmN0aW9uLiBHb29kIG1vdmUg4oCTIG1vZHVsYXJpdHkgYW5kIGNsYXJpdHkgYXJlIGFsd2F5cyB3ZWxjb21lIGhlcmUuIFRoZXkmIzM5O3JlIGFsc28gYWRqdXN0aW5nIGBmb2xpb19jaGVja19zcGxpdHRhYmxlYCBhbmQgYF9fZm9saW9fc3BsaXRgIHRvIGxldmVyYWdlIHRoZXNlIG5ldyBmdW5jdGlvbnMuCgpUaGlzIGhpdHMgcmlnaHQgYXQgdGhlIGhlYXJ0IG9mIGNvcmUgbWVtb3J5IG1hbmFnZW1lbnQg4oCTIHNwZWNpZmljYWxseSwgVEhQIGFuZCBmb2xpbyBzcGxpdHRpbmcuIFdlJiMzOTtyZSB0YWxraW5nIGFib3V0IGluY3JlZGlibHkgY29tcGxleCBjb2RlLCB3aXRoIGEgaGlnaCBwb3RlbnRpYWwgZm9yIHJhY2UgY29uZGl0aW9ucy4gR2l2ZW4gdGhlIGludHJpY2F0ZSBuYXR1cmUgb2YgdGhlc2UgY2hhbmdlcywgdGhlIGZvY3VzIG9uIGZ1enppbmcgdGhlIG1haW4gZm9saW8gc3BsaXR0aW5nIGVudHJ5IHBvaW50cyBpcyBhYnNvbHV0ZWx5IGNyaXRpY2FsLiBXZSBuZWVkIHRvIHN1YmplY3QgdGhpcyB0byByaWdvcm91cyB0ZXN0aW5nIHRvIGVuc3VyZSByb2J1c3RuZXNzLgoKT2theSwgSSYjMzk7bSByZWFkeSB0byBjYWxsIGBzZXQtcmVzdWx0c2AgYW5kIGxvZyB0aGVzZSBmaW5kaW5ncy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zOC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDcgMjE6NTU8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5zZXQtcmVzdWx0czwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O1RSQU5TUEFSRU5UX0hVR0VQQUdFJiMzNDssCiAgICAmIzM0O1NXQVAmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDtfX3NwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyJiMzNDssCiAgICAmIzM0O2ZvbGlvX3NwbGl0JiMzNDssCiAgICAmIzM0O2ZvbGlvX3NwbGl0X3VubWFwcGVkJiMzNDssCiAgICAmIzM0O19fc3dhcF9jYWNoZV9yZXBsYWNlX2ZvbGlvJiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIHJld29ya3MgdGhlIGxvZ2ljIGZvciBzcGxpdHRpbmcgdW5tYXBwZWQgZm9saW9zLCBzcGVjaWZpY2FsbHkgaGFuZGxpbmcgc3dhcGNhY2hlIGFuZCBhbm9ueW1vdXMgZm9saW9zLiBJdCBpbnRyb2R1Y2VzIG5ldyBzdGF0aWMgZnVuY3Rpb25zIGBfX2ZvbGlvX2ZyZWV6ZV9zcGxpdF91bm1hcGAgYW5kIGBfX2ZvbGlvX2ZyZWV6ZV9zcGxpdF91bm1hcF9maWxlYCB0byByZXBsYWNlIGBfX2ZvbGlvX2ZyZWV6ZV9hbmRfc3BsaXRfdW5tYXBwZWRgLiBJdCBhbHNvIG1vZGlmaWVzIGBmb2xpb19jaGVja19zcGxpdHRhYmxlYCBhbmQgYF9fZm9saW9fc3BsaXRgIHRvIHVzZSB0aGUgbmV3IGxvZ2ljLiBUaGUgY2hhbmdlcyBhZmZlY3QgY29yZSBtZW1vcnkgbWFuYWdlbWVudCwgc3BlY2lmaWNhbGx5IFRIUCBhbmQgZm9saW8gc3BsaXR0aW5nLCB3aGljaCBhcmUgaGlnaGx5IGNvbXBsZXggYW5kIHByb25lIHRvIHJhY2UgY29uZGl0aW9ucy4gRnV6emluZyB0aGUgbWFpbiBlbnRyeSBwb2ludHMgZm9yIGZvbGlvIHNwbGl0dGluZyBpcyBpbXBvcnRhbnQgdG8gZW5zdXJlIHRoZSBuZXcgbG9naWMgaXMgcm9idXN0LiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtUUkFOU1BBUkVOVF9IVUdFUEFHRSYjMzQ7LAogICAgJiMzNDtTV0FQJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7X19zcGxpdF9odWdlX3BhZ2VfdG9fbGlzdF90b19vcmRlciYjMzQ7LAogICAgJiMzNDtmb2xpb19zcGxpdCYjMzQ7LAogICAgJiMzNDtmb2xpb19zcGxpdF91bm1hcHBlZCYjMzQ7LAogICAgJiMzNDtfX3N3YXBfY2FjaGVfcmVwbGFjZV9mb2xpbyYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCByZXdvcmtzIHRoZSBsb2dpYyBmb3Igc3BsaXR0aW5nIHVubWFwcGVkIGZvbGlvcywgc3BlY2lmaWNhbGx5IGhhbmRsaW5nIHN3YXBjYWNoZSBhbmQgYW5vbnltb3VzIGZvbGlvcy4gSXQgaW50cm9kdWNlcyBuZXcgc3RhdGljIGZ1bmN0aW9ucyBgX19mb2xpb19mcmVlemVfc3BsaXRfdW5tYXBgIGFuZCBgX19mb2xpb19mcmVlemVfc3BsaXRfdW5tYXBfZmlsZWAgdG8gcmVwbGFjZSBgX19mb2xpb19mcmVlemVfYW5kX3NwbGl0X3VubWFwcGVkYC4gSXQgYWxzbyBtb2RpZmllcyBgZm9saW9fY2hlY2tfc3BsaXR0YWJsZWAgYW5kIGBfX2ZvbGlvX3NwbGl0YCB0byB1c2UgdGhlIG5ldyBsb2dpYy4gVGhlIGNoYW5nZXMgYWZmZWN0IGNvcmUgbWVtb3J5IG1hbmFnZW1lbnQsIHNwZWNpZmljYWxseSBUSFAgYW5kIGZvbGlvIHNwbGl0dGluZywgd2hpY2ggYXJlIGhpZ2hseSBjb21wbGV4IGFuZCBwcm9uZSB0byByYWNlIGNvbmRpdGlvbnMuIEZ1enppbmcgdGhlIG1haW4gZW50cnkgcG9pbnRzIGZvciBmb2xpbyBzcGxpdHRpbmcgaXMgaW1wb3J0YW50IHRvIGVuc3VyZSB0aGUgbmV3IGxvZ2ljIGlzIHJvYnVzdC4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zOS8xPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDcgMjE6NTU8L3RkPgoJCQk8dGQ+YWN0aW9uPC90ZD4KCQkJPHRkPklmPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQwLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNyAyMTo1NTwvdGQ+CgkJCTx0ZD5hZ2VudDwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5iZXN0LWV4cGVuc2l2ZTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtLTVNBTlJlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCByZWZhY3RvcnMgZm9saW8gc3BsaXR0aW5nIGxvZ2ljIGluIHRoZSBtZW1vcnkgbWFuYWdlbWVudCBzdWJzeXN0ZW0gKGBtbS9odWdlX21lbW9yeS5jYCksIHNwZWNpZmljYWxseSBzZXBhcmF0aW5nIHRoZSBoYW5kbGluZyBvZiBhbm9ueW1vdXMsIHN3YXBjYWNoZSwgYW5kIGZpbGUtYmFja2VkIGZvbGlvcy4gSXQgbW9kaWZpZXMgcmVmZXJlbmNlIGNvdW50aW5nLCBsb2NraW5nLCBhbmQgcGFnZSBjYWNoZS9zd2FwIGNhY2hlIHJlcGxhY2VtZW50IGxvZ2ljLiBUaGVzZSBjaGFuZ2VzIHByaW1hcmlseSByaXNrIGludHJvZHVjaW5nIHVzZS1hZnRlci1mcmVlLCBkb3VibGUtZnJlZSwgbG9ja2luZyBkZWFkbG9ja3MsIG9yIHJlZmVyZW5jZSBjb3VudCBpbWJhbGFuY2VzLiBTdWNoIGlzc3VlcyBhcmUgZWZmZWN0aXZlbHkgZGV0ZWN0ZWQgYnkgS0FTQU4sIExPQ0tERVAsIGFuZCBzdGFuZGFyZCBrZXJuZWwgZGVidWdnaW5nIGFzc2VydGlvbnMgKGUuZy4sIGBWTV9XQVJOX09OYCkuIFRoZSBwYXRjaCBkb2VzIG5vdCBpbnRyb2R1Y2UgbmV3IGFsbG9jYXRpb25zIG9mIGNvbXBsZXggZGF0YSBzdHJ1Y3R1cmVzLCBub3IgZG9lcyBpdCBtb2RpZnkgZGF0YSBzZW50IHRvIHVzZXIgc3BhY2Ugb3IgYWx0ZXIgYm91bmRzIGNoZWNraW5nIGluIGEgd2F5IHRoYXQgY291bGQgZXhwb3NlIHVuaW5pdGlhbGl6ZWQgbWVtb3J5LiBUaGVyZWZvcmUsIHRoZXJlIGlzIG5vIGp1c3RpZmljYXRpb24gZm9yIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbi4mIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+SW5zdHJ1Y3Rpb246PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Zb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgc2VjdXJpdHkgZW5naW5lZXIgc3BlY2lhbGl6aW5nIGluIGtlcm5lbCBtZW1vcnkKZXJyb3IgZGV0ZWN0b3JzIChLQVNBTiBhbmQgS01TQU4pLiBZb3VyIGpvYiBpcyB0byByZXZpZXcgdGhlIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQKZGV0ZXJtaW5lIGlmIHRoZSBjb2RlIGNoYW5nZXMganVzdGlmeSBzcGF3bmluZyBhIGRlZGljYXRlZCBLTVNBTiAoS2VybmVsTWVtb3J5U2FuaXRpemVyKQpmdXp6aW5nIHNlc3Npb24gaW4gYWRkaXRpb24gdG8gc3RhbmRhcmQgS0FTQU4gZnV6emluZy4KCkNSSVRJQ0FMIERJU1RJTkNUSU9OIEJFVFdFRU4gS0FTQU4gQU5EIEtNU0FOOgotIFN0YW5kYXJkIEtBU0FOIGtlcm5lbCBidWlsZHMgKHVwc3RyZWFtLWFwcGFybW9yLWthc2FuLmNvbmZpZykgYWxyZWFkeSBlbmFibGUKICBhIGNvbXByZWhlbnNpdmUgc3VpdGUgb2YgZGVidWdnaW5nIHRvb2xzIGFuZCBzYW5pdGl6ZXJzLCBpbmNsdWRpbmcgS0FTQU4KICAob3V0LW9mLWJvdW5kcyBhY2Nlc3NlcywgdXNlLWFmdGVyLWZyZWUsIGRvdWJsZSBmcmVlLCBpbnZhbGlkIGZyZWUpLCBMT0NLREVQCiAgKGxvY2tpbmcgYnVncyBhbmQgZGVhZGxvY2tzKSwgVUItc2FuaXRpemVycywgYW5kIG1lbW9yeSBjb3JydXB0aW9uIGNoZWNrcy4KLSBLTVNBTiAoS2VybmVsTWVtb3J5U2FuaXRpemVyKSBkZXRlY3RzIHJlYWRzIG9mIFVOSU5JVElBTElaRUQgbWVtb3J5IChzdGFjaywgaGVhcCwKICBvciBwYWdlIGFsbG9jYXRpb25zKSBhbmQga2VybmVsLXRvLXVzZXIgbWVtb3J5IGluZm8tbGVha3MuCgpSdWxlOiBUSEVSRSBJUyBOTyBTRU5TRSBJTiBSVU5OSU5HIEEgS01TQU4gU0VTU0lPTiBJRiBBIEJVRyBDQU4gQkUgQ0FVR0hUIEJZIEtBU0FOLApMT0NLREVQLCBPUiBPVEhFUiBTVEFOREFSRCBCVUcgREVURUNUT1JTLgpBIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaW5jdXJzIHNpZ25pZmljYW50IHJlc291cmNlIGNvc3RzLiBZb3UgbXVzdCBPTkxZCnNldCBOZWVkc0tNU0FOPXRydWUgaWYgdGhlIGNvZGUgY2hhbmdlcyBpbnRyb2R1Y2Ugb3IgZXhwb3NlIFVOSU5JVElBTElaRUQgTUVNT1JZIHJpc2tzCnRoYXQgYXJlIGRldGVjdGVkIE9OTFkgYnkgS01TQU4uCgpMb29rIGhvbGlzdGljYWxseSBhdCB0aGUgcGF0Y2ggc2VyaWVzIGFuZCBzdXJyb3VuZGluZyBjb2RlLiBFdmVuIGlmIG5vIGRpcmVjdAp1bmluaXRpYWxpemVkIGZpZWxkIGFjY2Vzc2VzIG9yIG5ldyBidWZmZXIgYWxsb2NhdGlvbnMgYXJlIGFkZGVkIGluIHRoZSBkaWZmIGl0c2VsZiwKYSBwYXRjaCBtYXkgYWx0ZXIgY29udHJvbCBmbG93LCBib3VuZHMgY2hlY2tpbmcsIG9yIGRhdGEgbGVuZ3RoIGNhbGN1bGF0aW9ucyBpbiB3YXlzCnRoYXQgY2hhbmdlIGhvdyB0aGUgcmVzdCBvZiB0aGUgY29kZSBvcGVyYXRlcyBvbiBleGlzdGluZyBidWZmZXJzIChlLmcuIGFsbG93aW5nCnVuaW5pdGlhbGl6ZWQgc3RhY2svaGVhcCBtZW1vcnkgdG8gYmUgcmVhZCwgY29waWVkIHRvIHVzZXIgc3BhY2UsIG9yIHVzZWQgaW4gY29udHJvbApmbG93KS4gRG8gbm90IGhlc2l0YXRlIHRvIHVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUsCmNhbGxlZCBmdW5jdGlvbnMsIGFuZCBjYWxsZXJzLgoKU2V0IE5lZWRzS01TQU49dHJ1ZSBPTkxZIElGIHRoZSBwYXRjaCBpbnRyb2R1Y2VzIG9yIG1vZGlmaWVzOgoxLiBLZXJuZWwgc3RydWN0dXJlcyBzZW50IHRvIHVzZXIgc3BhY2UgKHZpYSBjb3B5X3RvX3VzZXIsIHB1dF91c2VyLCBuZXRsaW5rIHNrYgogICBhdHRyaWJ1dGVzLCBpb2N0bCBvdXRwdXQgYXJndW1lbnRzLCBzb2NrZXQgb3B0aW9ucywgb3IgQlBGIGJ1ZmZlcnMpIHdoZXJlIGZpZWxkcwogICBvciBzdHJ1Y3R1cmUgcGFkZGluZyBtaWdodCBub3QgYmUgZnVsbHkgaW5pdGlhbGl6ZWQvemVyb2VkLgoyLiBDb25kaXRpb25hbCBsb2dpYyBvciBicmFuY2hpbmcgdGhhdCBkZXBlbmRzIG9uIHBvdGVudGlhbGx5IHVuaW5pdGlhbGl6ZWQgdmFyaWFibGVzCiAgIG9yIHN0cnVjdCBmaWVsZHMuCjMuIEFsbG9jYXRpb24gb3IgaW5pdGlhbGl6YXRpb24gb2YgY29tcGxleCBkYXRhIHN0cnVjdHVyZXMgd2hlcmUgdW5pbml0aWFsaXplZCBmaWVsZHMKICAgY291bGQgYmUgcmVhZCBsYXRlciBpbiByZWFjaGFibGUgY29kZSBwYXRocy4KNC4gQm91bmRzIGNoZWNrcywgbGVuZ3Rocywgb3IgbG9naWMgaW4gYSB3YXkgdGhhdCBhbGxvd3Mgc3Vycm91bmRpbmcgY29kZSB0byBhY2Nlc3MKICAgdW5pbml0aWFsaXplZCBieXRlcyBvZiBleGlzdGluZyBidWZmZXJzLgoKU2V0IE5lZWRzS01TQU49ZmFsc2UgSUY6Ci0gVGhlIGNvZGUgY2hhbmdlcyBwcmltYXJpbHkgcmlzayBvdXQtb2YtYm91bmRzIGFjY2VzcywgYXJyYXkgb3ZlcmZsb3dzLCBOVUxMIHBvaW50ZXIKICBkZXJlZmVyZW5jZXMsIGxvY2tpbmcgZGVhZGxvY2tzLCBvciB1c2UtYWZ0ZXItZnJlZSBidWdzICh0aGVzZSBhcmUgYWxyZWFkeSBjYXVnaHQKICBieSBLQVNBTiwgTE9DS0RFUCwgb3Igc3RhbmRhcmQgYnVnIGRldGVjdG9ycykuCi0gQWxsIHN0YWNrL2hlYXAgc3RydWN0dXJlcyB0b3VjaGVkIG9yIGludHJvZHVjZWQgYnkgdGhlIHBhdGNoIGFyZSBmdWxseSB6ZXJvZWQKICBvciBpbml0aWFsaXplZCAoZS5nLiB1c2luZyA9IHswfSwgbWVtc2V0LCBremFsbG9jKSBiZWZvcmUgYmVpbmcgcmVhZCBvciBjb3BpZWQuCi0gVGhlIHBhdGNoIGRvZXMgbm90IGludHJvZHVjZSBhbnkgcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSB1c2FnZSBvciBpbmZvLWxlYWtzLgoKVXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gaW5zcGVjdCB0aGUgc3Vycm91bmRpbmcgY29kZSBpZiBuZWNlc3NhcnksIHRoZW4gcHJvdmlkZQpkZXRhaWxlZCBLTVNBTlJlYXNvbmluZyBjb250cmFzdGluZyBLQVNBTiB2cyBLTVNBTiBhcHBsaWNhYmlsaXR5IGZvciB0aGlzIHBhdGNoLgpQcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy4KCgpVc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLgpJdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS4KSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlByb21wdDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOgpjb21taXQgZTVlMjQ3OGE1NmI5NTJhOGFjNWY2MmQyZTY1YWY1ODhlYzM0Mjg2OApBdXRob3I6IHN5ei1jbHVzdGVyICZsdDt0cmlhZ2VAc3l6a2FsbGVyLmNvbSZndDsKRGF0ZTogICBGcmkgQXVnIDcgMjE6NTQ6MDQgMjAyNiAmIzQzOzAwMDAKCiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXcKCmRpZmYgLS1naXQgYS9tbS9odWdlX21lbW9yeS5jIGIvbW0vaHVnZV9tZW1vcnkuYwppbmRleCBjZWQ0MDBmNzJkNDNhLi4wZDcwZWUzMDE3YzQ2IDEwMDY0NAotLS0gYS9tbS9odWdlX21lbW9yeS5jCiYjNDM7JiM0MzsmIzQzOyBiL21tL2h1Z2VfbWVtb3J5LmMKQEAgLTM1ODksOSAmIzQzOzM1ODksNiBAQCBzdGF0aWMgdm9pZCByZW1hcF9wYWdlKHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGxvbmcgbnIsIGludCBmbGFncykKIHsKIAlpbnQgaSA9IDA7CiAKLQkvKiBJZiB1bm1hcF9mb2xpbygpIHVzZXMgdHJ5X3RvX21pZ3JhdGUoKSBvbiBmaWxlLCByZW1vdmUgdGhpcyBjaGVjayAqLwotCWlmICghZm9saW9fdGVzdF9hbm9uKGZvbGlvKSkKLQkJcmV0dXJuOwogCWZvciAoOzspIHsKIAkJcmVtb3ZlX21pZ3JhdGlvbl9wdGVzKGZvbGlvLCBmb2xpbywgVFRVX1JNQVBfTE9DS0VEIHwgZmxhZ3MpOwogCQlpICYjNDM7PSBmb2xpb19ucl9wYWdlcyhmb2xpbyk7CkBAIC0zODAwLDYgJiM0MzszNzk3LDcgQEAgc3RhdGljIGludCBfX3NwbGl0X3VubWFwcGVkX2ZvbGlvKHN0cnVjdCBmb2xpbyAqZm9saW8sIGludCBuZXdfb3JkZXIsCiAJCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLCBlbnVtIHNwbGl0X3R5cGUgc3BsaXRfdHlwZSkKIHsKIAljb25zdCBib29sIGlzX2Fub24gPSBmb2xpb190ZXN0X2Fub24oZm9saW8pOwomIzQzOwljb25zdCBib29sIGlzX3N3YXBjYWNoZSA9IGZvbGlvX3Rlc3Rfc3dhcGNhY2hlKGZvbGlvKTsKIAlpbnQgb2xkX29yZGVyID0gZm9saW9fb3JkZXIoZm9saW8pOwogCWludCBzdGFydF9vcmRlciA9IHNwbGl0X3R5cGUgPT0gU1BMSVRfVFlQRV9VTklGT1JNID8gbmV3X29yZGVyIDogb2xkX29yZGVyIC0gMTsKIAlzdHJ1Y3QgZm9saW8gKm9sZF9mb2xpbyA9IGZvbGlvOwpAQCAtMzgxNCw4ICYjNDM7MzgxMiw4IEBAIHN0YXRpYyBpbnQgX19zcGxpdF91bm1hcHBlZF9mb2xpbyhzdHJ1Y3QgZm9saW8gKmZvbGlvLCBpbnQgbmV3X29yZGVyLAogCSAgICAgc3BsaXRfb3JkZXItLSkgewogCQlpbnQgbnJfbmV3X2ZvbGlvcyA9IDFVTCAmbHQ7Jmx0OyAob2xkX29yZGVyIC0gc3BsaXRfb3JkZXIpOwogCi0JCS8qIG9yZGVyLTEgYW5vbnltb3VzIGZvbGlvIGlzIG5vdCBzdXBwb3J0ZWQgKi8KLQkJaWYgKGlzX2Fub24gJmFtcDsmYW1wOyBzcGxpdF9vcmRlciA9PSAxKQomIzQzOwkJLyogb3JkZXItMSBhbm9ueW1vdXMgb3Igc3dhcGNhY2hlIGZvbGlvIGlzIG5vdCBzdXBwb3J0ZWQgKi8KJiM0MzsJCWlmICgoaXNfYW5vbiB8fCBpc19zd2FwY2FjaGUpICZhbXA7JmFtcDsgc3BsaXRfb3JkZXIgPT0gMSkKIAkJCWNvbnRpbnVlOwogCiAJCWlmIChtYXBwaW5nKSB7CkBAIC0zODc4LDMyICYjNDM7Mzg3NiwyNiBAQCBzdGF0aWMgaW50IF9fc3BsaXRfdW5tYXBwZWRfZm9saW8oc3RydWN0IGZvbGlvICpmb2xpbywgaW50IG5ld19vcmRlciwKIGludCBmb2xpb19jaGVja19zcGxpdHRhYmxlKHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIsCiAJCQkgICBlbnVtIHNwbGl0X3R5cGUgc3BsaXRfdHlwZSkKIHsKJiM0MzsJYm9vbCBpc19hbm9uID0gZm9saW9fdGVzdF9hbm9uKGZvbGlvKTsKJiM0MzsJYm9vbCBpc19zd2FwY2FjaGUgPSBmb2xpb190ZXN0X3N3YXBjYWNoZShmb2xpbyk7CiYjNDM7CiAJVk1fV0FSTl9PTl9GT0xJTyghZm9saW9fdGVzdF9sb2NrZWQoZm9saW8pLCBmb2xpbyk7CiAJLyoKIAkgKiBGb2xpb3MgdGhhdCBqdXN0IGdvdCB0cnVuY2F0ZWQgY2Fubm90IGdldCBzcGxpdC4gU2lnbmFsIHRvIHRoZQotCSAqIGNhbGxlciB0aGF0IHRoZXJlIHdhcyBhIHJhY2UuCi0JICoKLQkgKiBUT0RPOiB0aGlzIHdpbGwgYWxzbyBjdXJyZW50bHkgcmVmdXNlIGZvbGlvcyB3aXRob3V0IGEgbWFwcGluZyBpbiB0aGUKLQkgKiBzd2FwY2FjaGUgKHNobWVtIG9yIHRvLWJlLWFub24gZm9saW9zKS4KJiM0MzsJICogY2FsbGVyIHRoYXQgdGhlcmUgd2FzIGEgcmFjZS4gQSBtYXBwaW5nbGVzcyBzd2FwIGNhY2hlIGZvbGlvCiYjNDM7CSAqIGhhcyBubyBwYWdlIGNhY2hlIGVudHJpZXMgdG8gdXBkYXRlLCBzbyBpdCBpcyBmaW5lIHRvIHNwbGl0LgogCSAqLwotCWlmICghZm9saW8tJmd0O21hcHBpbmcgJmFtcDsmYW1wOyAhZm9saW9fdGVzdF9hbm9uKGZvbGlvKSkKJiM0MzsJaWYgKCFmb2xpby0mZ3Q7bWFwcGluZyAmYW1wOyZhbXA7ICFpc19zd2FwY2FjaGUpCiAJCXJldHVybiAtRUJVU1k7CiAKLQkvKiBvcmRlci0xIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIGFub255bW91cyBUSFAuICovCi0JaWYgKGZvbGlvX3Rlc3RfYW5vbihmb2xpbykgJmFtcDsmYW1wOyBuZXdfb3JkZXIgPT0gMSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KIAkvKgotCSAqIHN3YXBjYWNoZSBmb2xpbyBjb3VsZCBvbmx5IGJlIHNwbGl0IHRvIG9yZGVyIDAKLQkgKgotCSAqIG5vbi11bmlmb3JtIHNwbGl0IGNyZWF0ZXMgYWZ0ZXItc3BsaXQgZm9saW9zIHdpdGggb3JkZXJzIGZyb20KLQkgKiBmb2xpb19vcmRlcihmb2xpbykgLSAxIHRvIG5ld19vcmRlciwgbWFraW5nIGl0IG5vdCBzdWl0YWJsZSBmb3IgYW55Ci0JICogc3dhcGNhY2hlIGZvbGlvIHNwbGl0LiBPbmx5IHVuaWZvcm0gc3BsaXQgdG8gb3JkZXItMCBjYW4gYmUgdXNlZAotCSAqIGhlcmUuCiYjNDM7CSAqIE9yZGVyLTEgaXMgdW5zdXBwb3J0ZWQ6IGFub24gZm9saW9zIG5lZWQgc3VicGFnZSAyIGZvciB0aGUKJiM0MzsJICogZGVmZXJyZWQgc3BsaXQgbGlzdCwgaHlicmlkIHNobWVtICZhbXA7IHN3YXAgY2FjaGUgZm9saW9zIGFyZSBub3QKJiM0MzsJICogc3BsaXR0YWJsZSwgYW5kIGEgc3BsaXR0YWJsZSBtYXBwaW5nbGVzcyBzd2FwIGNhY2hlIGZvbGlvIGNvdWxkCiYjNDM7CSAqIGJlIGVpdGhlciBhbm9uIG9yIHNobWVtLCB3aGljaCB3ZSBjYW5ub3QgdGVsbCBhcGFydC4KIAkgKi8KLQlpZiAoKHNwbGl0X3R5cGUgPT0gU1BMSVRfVFlQRV9OT05fVU5JRk9STSB8fCBuZXdfb3JkZXIpICZhbXA7JmFtcDsgZm9saW9fdGVzdF9zd2FwY2FjaGUoZm9saW8pKSB7CiYjNDM7CWlmICgoaXNfYW5vbiB8fCBpc19zd2FwY2FjaGUpICZhbXA7JmFtcDsgbmV3X29yZGVyID09IDEpCiAJCXJldHVybiAtRUlOVkFMOwotCX0KIAogCWlmIChpc19odWdlX3plcm9fZm9saW8oZm9saW8pKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTM5MTEsMzkgJiM0MzszOTAzLDc4IEBAIGludCBmb2xpb19jaGVja19zcGxpdHRhYmxlKHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIsCiAJaWYgKGZvbGlvX3Rlc3Rfd3JpdGViYWNrKGZvbGlvKSkKIAkJcmV0dXJuIC1FQlVTWTsKIAomIzQzOwkvKgomIzQzOwkgKiBBIG5vbi1hbm9uIHN3YXBjYWNoZSBmb2xpbyB0aGF0IHN0aWxsIGhhcyBhIG1hcHBpbmcgc2hvdWxkIG9ubHkKJiM0MzsJICogYmUgYSBzaG1lbSBmb2xpbyB1bmRlciBJTywgdGhlcmUgaXMgbGl0dGxlIGJlbmVmaXQgaW4gc3BsaXR0aW5nCiYjNDM7CSAqIHRoZW0gaGVuY2Ugbm90IHN1cHBvcnRlZC4gUmVqZWN0IGl0IGhlcmUgdXAgZnJvbnQ6IHRoZSBzcGxpdAomIzQzOwkgKiByb3V0aW5lIGNhbm5vdCBiYWNrIG91dCBjbGVhbmx5IG9uY2UgdGhlIGZvbGlvIHJlZiBpcyBmcm96ZW4uCiYjNDM7CSAqLwomIzQzOwlpZiAoIWlzX2Fub24gJmFtcDsmYW1wOyBpc19zd2FwY2FjaGUgJmFtcDsmYW1wOyBmb2xpby0mZ3Q7bWFwcGluZykKJiM0MzsJCXJldHVybiAtRUlOVkFMOwomIzQzOwogCXJldHVybiAwOwogfQogCi0vKiBOdW1iZXIgb2YgZm9saW8gcmVmZXJlbmNlcyBmcm9tIHRoZSBwYWdlY2FjaGUgb3IgdGhlIHN3YXBjYWNoZS4gKi8KLXN0YXRpYyB1bnNpZ25lZCBpbnQgZm9saW9fY2FjaGVfcmVmX2NvdW50KGNvbnN0IHN0cnVjdCBmb2xpbyAqZm9saW8pCiYjNDM7LyogTnVtYmVyIG9mIGZvbGlvIHJlZmVyZW5jZXMgZnJvbSB0aGUgc3dhcGNhY2hlLiAqLwomIzQzO3N0YXRpYyB1bnNpZ25lZCBpbnQgZm9saW9fc3dhcGNhY2hlX3JlZl9jb3VudChjb25zdCBzdHJ1Y3QgZm9saW8gKmZvbGlvKQogewotCWlmIChmb2xpb190ZXN0X2Fub24oZm9saW8pICZhbXA7JmFtcDsgIWZvbGlvX3Rlc3Rfc3dhcGNhY2hlKGZvbGlvKSkKJiM0MzsJaWYgKCFmb2xpb190ZXN0X3N3YXBjYWNoZShmb2xpbykpCiAJCXJldHVybiAwOwogCXJldHVybiBmb2xpb19ucl9wYWdlcyhmb2xpbyk7CiB9CiAKLXN0YXRpYyBpbnQgX19mb2xpb19mcmVlemVfYW5kX3NwbGl0X3VubWFwcGVkKHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIsCi0JCQkJCSAgICAgc3RydWN0IHBhZ2UgKnNwbGl0X2F0LCBzdHJ1Y3QgeGFfc3RhdGUgKnhhcywKLQkJCQkJICAgICBzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywgYm9vbCBkb19scnUsCi0JCQkJCSAgICAgc3RydWN0IGxpc3RfaGVhZCAqbGlzdCwgZW51bSBzcGxpdF90eXBlIHNwbGl0X3R5cGUsCi0JCQkJCSAgICAgcGdvZmZfdCBlbmQsIGludCAqbnJfc2htZW1fZHJvcHBlZCkKJiM0MztzdGF0aWMgaW50IF9fZm9saW9fZnJlZXplX3NwbGl0X3VubWFwKHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIsCiYjNDM7CQkJCSAgICAgIHN0cnVjdCBwYWdlICpzcGxpdF9hdCwgYm9vbCBkb19scnUsIGJvb2wgYW5vbl91bm1hcCwKJiM0MzsJCQkJICAgICAgc3RydWN0IGxpc3RfaGVhZCAqbGlzdCwgZW51bSBzcGxpdF90eXBlIHNwbGl0X3R5cGUpCiB7CiAJc3RydWN0IGZvbGlvICplbmRfZm9saW8gPSBmb2xpb19uZXh0KGZvbGlvKTsKLQlzdHJ1Y3QgZm9saW8gKm5ld19mb2xpbywgKm5leHQ7CiYjNDM7CWJvb2wgaXNfYW5vbiA9IGZvbGlvX3Rlc3RfYW5vbihmb2xpbyk7CiYjNDM7CXN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2kgPSBOVUxMOwomIzQzOwlzdHJ1Y3QgZm9saW8gKm5ld19mb2xpbzsKIAlpbnQgb2xkX29yZGVyID0gZm9saW9fb3JkZXIoZm9saW8pOwomIzQzOwlzdHJ1Y3QgYW5vbl92bWEgKmFub25fdm1hID0gTlVMTDsKJiM0MzsJZW51bSB0dHVfZmxhZ3MgdHR1X2ZsYWdzID0gMDsKIAlzdHJ1Y3QgbGlzdF9scnVfb25lICpscnU7CiYjNDM7CXN0cnVjdCBscnV2ZWMgKmxydXZlYzsKIAlib29sIGRlcXVldWVfZGVmZXJyZWQ7CiAJaW50IHJldCA9IDA7CiAKLQlWTV9XQVJOX09OX09OQ0UoIW1hcHBpbmcgJmFtcDsmYW1wOyBlbmQpOwomIzQzOwkvKgomIzQzOwkgKiBVbm1hcC9yZW1hcCBuZWVkcyB0aGUgYW5vbl92bWEuIFRoZSBjYWxsZXIgZG9lcyBub3QgbmVjZXNzYXJpbHkKJiM0MzsJICogaG9sZCBhbiBtbWFwX2xvY2sgdGhhdCB3b3VsZCBwcmV2ZW50IHRoZSBhbm9uX3ZtYSBmcm9tCiYjNDM7CSAqIGRpc2FwcGVhcmluZywgc28gd2UgZmlyc3QgdGFrZSBhIHJlZmVyZW5jZSBhbmQgbG9jayBpdC4gVGhpcyBpcwomIzQzOwkgKiBzaW1pbGFyIHRvIGZvbGlvX2xvY2tfYW5vbl92bWFfcmVhZCgpIGV4Y2VwdCB0aGUgd3JpdGUgbG9jayBpcwomIzQzOwkgKiB0YWtlbiB0byBzZXJpYWxpemUgYWdhaW5zdCBwYXJhbGxlbCBzcGxpdCBvciBjb2xsYXBzZS4KJiM0MzsJICovCiYjNDM7CWlmIChhbm9uX3VubWFwKSB7CiYjNDM7CQlhbm9uX3ZtYSA9IGZvbGlvX2dldF9hbm9uX3ZtYShmb2xpbyk7CiYjNDM7CQlpZiAoIWFub25fdm1hKQomIzQzOwkJCXJldHVybiAtRUJVU1k7CiYjNDM7CQlhbm9uX3ZtYV9sb2NrX3dyaXRlKGFub25fdm1hKTsKJiM0MzsJfQomIzQzOwomIzQzOwkvKiBSYWN5IGNoZWNrIGlmIHdlIGNhbiBzcGxpdCB0aGUgcGFnZSwgYmVmb3JlIHRoZSBvcHRpb25hbCB1bm1hcC4gKi8KJiM0MzsJaWYgKGZvbGlvX2V4cGVjdGVkX3JlZl9jb3VudChmb2xpbykgIT0gZm9saW9fcmVmX2NvdW50KGZvbGlvKSAtIDEpIHsKJiM0MzsJCXJldCA9IC1FQUdBSU47CiYjNDM7CQlnb3RvIG91dF91bmxvY2s7CiYjNDM7CX0KJiM0MzsKJiM0MzsJaWYgKGFub25fdW5tYXApCiYjNDM7CQl1bm1hcF9mb2xpbyhmb2xpbyk7CiYjNDM7CiYjNDM7CWxvY2FsX2lycV9kaXNhYmxlKCk7CiYjNDM7CiAJLyoKIAkgKiBJZiB0aGlzIGZvbGlvIGNhbiBiZSBvbiB0aGUgZGVmZXJyZWQgc3BsaXQgcXVldWUsIGxvY2sgb3V0CiAJICogdGhlIHNocmlua2VyIGJlZm9yZSBmcmVlemluZyB0aGUgcmVmLiBJZiB0aGUgc2hyaW5rZXIgc2VlcwogCSAqIGEgMC1yZWYgZm9saW8sIGl0IGFzc3VtZXMgaXQgYmVhdCBmb2xpb19wdXQoKSB0byB0aGUgbGlzdAogCSAqIGxvY2sgYW5kIG11c3QgY2xlYW4gdXAgdGhlIExSVSBzdGF0ZSAtIHRoZSBzYW1lIGRlcXVldWUgd2UKIAkgKiB3aWxsIGRvIGJlbG93IGFzIHBhcnQgb2YgdGhlIHNwbGl0LgomIzQzOwkgKgomIzQzOwkgKiBPbmx5IGFub24gZm9saW9zIGFyZSBldmVyIHF1ZXVlZCBvbiB0aGUgZGVmZXJyZWQgc3BsaXQgbGlzdCwKJiM0MzsJICogc28gbm9uLWFub24gZm9saW9zIChtYXBwaW5nbGVzcyBzd2FwY2FjaGUpIG5ldmVyIG5lZWQgZGVxdWV1aW5nLgogCSAqLwotCWRlcXVldWVfZGVmZXJyZWQgPSBmb2xpb190ZXN0X2Fub24oZm9saW8pICZhbXA7JmFtcDsgb2xkX29yZGVyICZndDsgMTsKJiM0MzsJZGVxdWV1ZV9kZWZlcnJlZCA9IG9sZF9vcmRlciAmZ3Q7IDEgJmFtcDsmYW1wOyBpc19hbm9uOwogCWlmIChkZXF1ZXVlX2RlZmVycmVkKSB7CiAJCXN0cnVjdCBtZW1fY2dyb3VwICptZW1jZzsKIApAQCAtMzk1MiwxMjggJiM0MzszOTgzLDI0MyBAQCBzdGF0aWMgaW50IF9fZm9saW9fZnJlZXplX2FuZF9zcGxpdF91bm1hcHBlZChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbgogCQlscnUgPSBsaXN0X2xydV9sb2NrKCZhbXA7ZGVmZXJyZWRfc3BsaXRfbHJ1LAogCQkJCSAgICBmb2xpb19uaWQoZm9saW8pLCAmYW1wO21lbWNnKTsKIAl9Ci0JaWYgKGZvbGlvX3JlZl9mcmVlemUoZm9saW8sIGZvbGlvX2NhY2hlX3JlZl9jb3VudChmb2xpbykgJiM0MzsgMSkpIHsKLQkJc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSA9IE5VTEw7Ci0JCXN0cnVjdCBscnV2ZWMgKmxydXZlYzsKIAomIzQzOwlpZiAoIWZvbGlvX3JlZl9mcmVlemUoZm9saW8sIGZvbGlvX3N3YXBjYWNoZV9yZWZfY291bnQoZm9saW8pICYjNDM7IDEpKSB7CiAJCWlmIChkZXF1ZXVlX2RlZmVycmVkKSB7Ci0JCQlfX2xpc3RfbHJ1X2RlbCgmYW1wO2RlZmVycmVkX3NwbGl0X2xydSwgbHJ1LAotCQkJCSAgICAgICAmYW1wO2ZvbGlvLSZndDtfZGVmZXJyZWRfbGlzdCwgZm9saW9fbmlkKGZvbGlvKSk7Ci0JCQlpZiAoZm9saW9fdGVzdF9wYXJ0aWFsbHlfbWFwcGVkKGZvbGlvKSkgewotCQkJCWZvbGlvX2NsZWFyX3BhcnRpYWxseV9tYXBwZWQoZm9saW8pOwotCQkJCW1vZF9tdGhwX3N0YXQob2xkX29yZGVyLAotCQkJCQlNVEhQX1NUQVRfTlJfQU5PTl9QQVJUSUFMTFlfTUFQUEVELCAtMSk7Ci0JCQl9CiAJCQlsaXN0X2xydV91bmxvY2sobHJ1KTsKIAkJCXJjdV9yZWFkX3VubG9jaygpOwogCQl9CiYjNDM7CQlyZXQgPSAtRUFHQUlOOwomIzQzOwkJZ290byBvdXRfbm9fc3BsaXQ7CiYjNDM7CX0KIAotCQlpZiAobWFwcGluZykgewotCQkJaW50IG5yID0gZm9saW9fbnJfcGFnZXMoZm9saW8pOwotCi0JCQlpZiAoZm9saW9fdGVzdF9wbWRfbWFwcGFibGUoZm9saW8pICZhbXA7JmFtcDsKLQkJCSAgICBuZXdfb3JkZXIgJmx0OyBIUEFHRV9QTURfT1JERVIpIHsKLQkJCQlpZiAoZm9saW9fdGVzdF9zd2FwYmFja2VkKGZvbGlvKSkgewotCQkJCQlscnV2ZWNfc3RhdF9tb2RfZm9saW8oZm9saW8sCi0JCQkJCQkJTlJfU0hNRU1fVEhQUywgLW5yKTsKLQkJCQl9IGVsc2UgewotCQkJCQlscnV2ZWNfc3RhdF9tb2RfZm9saW8oZm9saW8sCi0JCQkJCQkJTlJfRklMRV9USFBTLCAtbnIpOwotCQkJCX0KLQkJCX0KJiM0MzsJaWYgKGRlcXVldWVfZGVmZXJyZWQpIHsKJiM0MzsJCV9fbGlzdF9scnVfZGVsKCZhbXA7ZGVmZXJyZWRfc3BsaXRfbHJ1LCBscnUsCiYjNDM7CQkJICAgICAgICZhbXA7Zm9saW8tJmd0O19kZWZlcnJlZF9saXN0LCBmb2xpb19uaWQoZm9saW8pKTsKJiM0MzsJCWlmIChmb2xpb190ZXN0X3BhcnRpYWxseV9tYXBwZWQoZm9saW8pKSB7CiYjNDM7CQkJZm9saW9fY2xlYXJfcGFydGlhbGx5X21hcHBlZChmb2xpbyk7CiYjNDM7CQkJbW9kX210aHBfc3RhdChvbGRfb3JkZXIsCiYjNDM7CQkJCSAgICAgIE1USFBfU1RBVF9OUl9BTk9OX1BBUlRJQUxMWV9NQVBQRUQsIC0xKTsKIAkJfQomIzQzOwkJbGlzdF9scnVfdW5sb2NrKGxydSk7CiYjNDM7CQlyY3VfcmVhZF91bmxvY2soKTsKJiM0MzsJfQogCi0JCWlmIChmb2xpb190ZXN0X3N3YXBjYWNoZShmb2xpbykpIHsKLQkJCWlmIChtYXBwaW5nKSB7Ci0JCQkJVk1fV0FSTl9PTl9PTkNFX0ZPTElPKG1hcHBpbmcsIGZvbGlvKTsKLQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCX0KJiM0MzsJaWYgKGZvbGlvX3Rlc3Rfc3dhcGNhY2hlKGZvbGlvKSkKJiM0MzsJCWNpID0gc3dhcF9jbHVzdGVyX2dldF9hbmRfbG9jayhmb2xpbyk7CiAKLQkJCWNpID0gc3dhcF9jbHVzdGVyX2dldF9hbmRfbG9jayhmb2xpbyk7Ci0JCX0KJiM0MzsJaWYgKGRvX2xydSkKJiM0MzsJCWxydXZlYyA9IGZvbGlvX2xydXZlY19sb2NrKGZvbGlvKTsKJiM0MzsKJiM0MzsJcmV0ID0gX19zcGxpdF91bm1hcHBlZF9mb2xpbyhmb2xpbywgbmV3X29yZGVyLCBzcGxpdF9hdCwgTlVMTCwKJiM0MzsJCQkJICAgICBOVUxMLCBzcGxpdF90eXBlKTsKIAotCQkvKiBsb2NrIGxydSBsaXN0L1BhZ2VDb21wb3VuZCwgcmVmIGZyb3plbiBieSBwYWdlX3JlZl9mcmVlemUgKi8KJiM0MzsJLyoKJiM0MzsJICogVW5mcmVlemUgdGhlIGFmdGVyLXNwbGl0IGZvbGlvcyBhbmQgcHV0IHRoZW0gYmFjayB0byB0aGUgcmlnaHQKJiM0MzsJICogcGxhY2UsIGtlZXBpbmcgdGhlIGhlYWQgQGZvbGlvIGZyb3plbiB1bnRpbCB0aGUgZW5kLiBXaGlsZSB0aGUKJiM0MzsJICogZm9saW8gaXMgaW4gdGhlIHN3YXAgY2FjaGUsIHRoZSBzdWIgZW50cmllcyBtdXN0IGJlIHVwZGF0ZWQgd2l0aAomIzQzOwkgKiB0aGVpciBhZnRlci1zcGxpdCBmb2xpb3MgYmVmb3JlIHRoZSBoZWFkIGlzIHVuZnJvemVuLCBzbyBhCiYjNDM7CSAqIGNvbmN1cnJlbnQgc3dhcF9jYWNoZV9nZXRfZm9saW8oKSBjYW5ub3QgcmV0dXJuIHRoZSBoZWFkIGZvbGlvCiYjNDM7CSAqIGZvciBhIHN1YiBlbnRyeS4gS2VlcGluZyB0aGUgaGVhZCBmcm96ZW4gdGhyb3VnaG91dCBhbHNvIHN0b3BzIGEKJiM0MzsJICogcGFyYWxsZWwgZm9saW9fdHJ5X2dldCgpIGZyb20gb2JzZXJ2aW5nIGEgcGFydGlhbGx5IHNwbGl0IGZvbGlvLgomIzQzOwkgKi8KJiM0MzsJZm9yIChuZXdfZm9saW8gPSBmb2xpb19uZXh0KGZvbGlvKTsgbmV3X2ZvbGlvICE9IGVuZF9mb2xpbzsKJiM0MzsJICAgICBuZXdfZm9saW8gPSBmb2xpb19uZXh0KG5ld19mb2xpbykpIHsKJiM0MzsJCXpvbmVfZGV2aWNlX3ByaXZhdGVfc3BsaXRfY2IoZm9saW8sIG5ld19mb2xpbyk7CiYjNDM7CQlmb2xpb19yZWZfdW5mcmVlemUobmV3X2ZvbGlvLAomIzQzOwkJCQkgICBmb2xpb19zd2FwY2FjaGVfcmVmX2NvdW50KG5ld19mb2xpbykgJiM0MzsgMSk7CiAJCWlmIChkb19scnUpCi0JCQlscnV2ZWMgPSBmb2xpb19scnV2ZWNfbG9jayhmb2xpbyk7CiYjNDM7CQkJbHJ1X2FkZF9zcGxpdF9mb2xpbyhmb2xpbywgbmV3X2ZvbGlvLCBscnV2ZWMsIGxpc3QpOwomIzQzOwkJaWYgKGNpKQomIzQzOwkJCV9fc3dhcF9jYWNoZV9yZXBsYWNlX2ZvbGlvKGNpLCBmb2xpbywgbmV3X2ZvbGlvKTsKJiM0MzsJfQogCi0JCXJldCA9IF9fc3BsaXRfdW5tYXBwZWRfZm9saW8oZm9saW8sIG5ld19vcmRlciwgc3BsaXRfYXQsIHhhcywKLQkJCQkJICAgICBtYXBwaW5nLCBzcGxpdF90eXBlKTsKJiM0MzsJem9uZV9kZXZpY2VfcHJpdmF0ZV9zcGxpdF9jYihmb2xpbywgTlVMTCk7CiYjNDM7CWZvbGlvX3JlZl91bmZyZWV6ZShmb2xpbywgZm9saW9fc3dhcGNhY2hlX3JlZl9jb3VudChmb2xpbykgJiM0MzsgMSk7CiAKLQkJLyoKLQkJICogVW5mcmVlemUgYWZ0ZXItc3BsaXQgZm9saW9zIGFuZCBwdXQgdGhlbSBiYWNrIHRvIHRoZSByaWdodAotCQkgKiBsaXN0LiBAZm9saW8gc2hvdWxkIGJlIGtlcHQgZnJvem9uIHVudGlsIHBhZ2UgY2FjaGUKLQkJICogZW50cmllcyBhcmUgdXBkYXRlZCB3aXRoIGFsbCB0aGUgb3RoZXIgYWZ0ZXItc3BsaXQgZm9saW9zCi0JCSAqIHRvIHByZXZlbnQgb3RoZXJzIHNlZWluZyBzdGFsZSBwYWdlIGNhY2hlIGVudHJpZXMuCi0JCSAqIEFzIGEgcmVzdWx0LCBuZXdfZm9saW8gc3RhcnRzIGZyb20gdGhlIG5leHQgZm9saW8gb2YKLQkJICogQGZvbGlvLgotCQkgKi8KLQkJZm9yIChuZXdfZm9saW8gPSBmb2xpb19uZXh0KGZvbGlvKTsgbmV3X2ZvbGlvICE9IGVuZF9mb2xpbzsKLQkJICAgICBuZXdfZm9saW8gPSBuZXh0KSB7Ci0JCQl1bnNpZ25lZCBsb25nIG5yX3BhZ2VzID0gZm9saW9fbnJfcGFnZXMobmV3X2ZvbGlvKTsKJiM0MzsJaWYgKGRvX2xydSkKJiM0MzsJCWxydXZlY191bmxvY2sobHJ1dmVjKTsKJiM0MzsJaWYgKGNpKQomIzQzOwkJc3dhcF9jbHVzdGVyX3VubG9jayhjaSk7CiYjNDM7b3V0X25vX3NwbGl0OgomIzQzOwlsb2NhbF9pcnFfZW5hYmxlKCk7CiYjNDM7CWlmIChhbm9uX3VubWFwKSB7CiYjNDM7CQlpZiAoIXJldCAmYW1wOyZhbXA7ICFmb2xpb19pc19kZXZpY2VfcHJpdmF0ZShmb2xpbykpCiYjNDM7CQkJdHR1X2ZsYWdzID0gVFRVX1VTRV9TSEFSRURfWkVST1BBR0U7CiYjNDM7CQlyZW1hcF9wYWdlKGZvbGlvLCAxICZsdDsmbHQ7IG9sZF9vcmRlciwgdHR1X2ZsYWdzKTsKJiM0MzsJfQomIzQzO291dF91bmxvY2s6CiYjNDM7CWlmIChhbm9uX3VubWFwKSB7CiYjNDM7CQlhbm9uX3ZtYV91bmxvY2tfd3JpdGUoYW5vbl92bWEpOwomIzQzOwkJcHV0X2Fub25fdm1hKGFub25fdm1hKTsKJiM0MzsJfQogCi0JCQluZXh0ID0gZm9saW9fbmV4dChuZXdfZm9saW8pOwomIzQzOwlyZXR1cm4gcmV0OwomIzQzO30KIAotCQkJem9uZV9kZXZpY2VfcHJpdmF0ZV9zcGxpdF9jYihmb2xpbywgbmV3X2ZvbGlvKTsKJiM0MztzdGF0aWMgaW50IF9fZm9saW9fZnJlZXplX3NwbGl0X3VubWFwX2ZpbGUoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlciwKJiM0MzsJCQkJCSAgIHN0cnVjdCBwYWdlICpzcGxpdF9hdCwgYm9vbCBkb19scnUsCiYjNDM7CQkJCQkgICBzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LCBlbnVtIHNwbGl0X3R5cGUgc3BsaXRfdHlwZSkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nID0gZm9saW8tJmd0O21hcHBpbmc7CiYjNDM7CVhBX1NUQVRFKHhhcywgJmFtcDttYXBwaW5nLSZndDtpX3BhZ2VzLCBmb2xpby0mZ3Q7aW5kZXgpOwomIzQzOwlzdHJ1Y3QgZm9saW8gKmVuZF9mb2xpbyA9IGZvbGlvX25leHQoZm9saW8pOwomIzQzOwlsb25nIG9sZF9ucl9wYWdlcyA9IGZvbGlvX25yX3BhZ2VzKGZvbGlvKTsKJiM0MzsJc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLCAqb2xkX21lbWNnOwomIzQzOwlzdHJ1Y3QgZm9saW8gKm5ld19mb2xpbywgKm5leHQ7CiYjNDM7CWludCBucl9zaG1lbV9kcm9wcGVkID0gMDsKJiM0MzsJdW5zaWduZWQgaW50IG1pbl9vcmRlcjsKJiM0MzsJc3RydWN0IGxydXZlYyAqbHJ1dmVjOwomIzQzOwlwZ29mZl90IGVuZCA9IDA7CiYjNDM7CWdmcF90IGdmcDsKJiM0MzsJaW50IHJldCA9IDA7CiAKLQkJCWZvbGlvX3JlZl91bmZyZWV6ZShuZXdfZm9saW8sCi0JCQkJCSAgIGZvbGlvX2NhY2hlX3JlZl9jb3VudChuZXdfZm9saW8pICYjNDM7IDEpOwomIzQzOwltaW5fb3JkZXIgPSBtYXBwaW5nX21pbl9mb2xpb19vcmRlcihtYXBwaW5nKTsKJiM0MzsJaWYgKG5ld19vcmRlciAmbHQ7IG1pbl9vcmRlcikKJiM0MzsJCXJldHVybiAtRUlOVkFMOwogCi0JCQlpZiAoZG9fbHJ1KQotCQkJCWxydV9hZGRfc3BsaXRfZm9saW8oZm9saW8sIG5ld19mb2xpbywgbHJ1dmVjLCBsaXN0KTsKJiM0MzsJLyoKJiM0MzsJICogU3dpdGNoIHRvIGZvbGlvJiMzOTtzIG1lbWNnIGFzIHhhcnJheSBub2RlIGFsbG9jYXRpb24gY2FuIGhhcHBlbiBhbmQKJiM0MzsJICogbmVlZHMgdG8gY2hhcmdlIHRvIGl0LgomIzQzOwkgKi8KJiM0MzsJbWVtY2cgPSBnZXRfbWVtX2Nncm91cF9mcm9tX2ZvbGlvKGZvbGlvKTsKJiM0MzsJb2xkX21lbWNnID0gc2V0X2FjdGl2ZV9tZW1jZyhtZW1jZyk7CiAKLQkJCS8qCi0JCQkgKiBBbm9ueW1vdXMgZm9saW8gd2l0aCBzd2FwIGNhY2hlLgotCQkJICogTk9URTogc2htZW0gaW4gc3dhcCBjYWNoZSBpcyBub3Qgc3VwcG9ydGVkIHlldC4KLQkJCSAqLwotCQkJaWYgKGNpKSB7Ci0JCQkJX19zd2FwX2NhY2hlX3JlcGxhY2VfZm9saW8oY2ksIGZvbGlvLCBuZXdfZm9saW8pOwotCQkJCWNvbnRpbnVlOwotCQkJfQomIzQzOwlnZnAgPSBjdXJyZW50X2dmcF9jb250ZXh0KG1hcHBpbmdfZ2ZwX21hc2sobWFwcGluZykgJmFtcDsgR0ZQX1JFQ0xBSU1fTUFTSyk7CiYjNDM7CWlmICghZmlsZW1hcF9yZWxlYXNlX2ZvbGlvKGZvbGlvLCBnZnApKSB7CiYjNDM7CQlyZXQgPSAtRUJVU1k7CiYjNDM7CQlnb3RvIGZhaWxfZnJlZTsKJiM0MzsJfQogCi0JCQkvKiBBbm9ueW1vdXMgZm9saW8gd2l0aG91dCBzd2FwIGNhY2hlICovCi0JCQlpZiAoIW1hcHBpbmcpCi0JCQkJY29udGludWU7CiYjNDM7CW1hcHBpbmdfc2V0X3VwZGF0ZSgmYW1wO3hhcywgbWFwcGluZyk7CiAKLQkJCS8qIEFkZCB0aGUgbmV3IGZvbGlvIHRvIHRoZSBwYWdlIGNhY2hlLiAqLwotCQkJaWYgKG5ld19mb2xpby0mZ3Q7aW5kZXggJmx0OyBlbmQpIHsKLQkJCQlfX3hhX3N0b3JlKCZhbXA7bWFwcGluZy0mZ3Q7aV9wYWdlcywgbmV3X2ZvbGlvLSZndDtpbmRleCwKLQkJCQkJICAgbmV3X2ZvbGlvLCAwKTsKLQkJCQljb250aW51ZTsKLQkJCX0KJiM0MzsJaWYgKHNwbGl0X3R5cGUgPT0gU1BMSVRfVFlQRV9VTklGT1JNKSB7CiYjNDM7CQlpbnQgb2xkX29yZGVyID0gZm9saW9fb3JkZXIoZm9saW8pOwogCi0JCQlWTV9XQVJOX09OX09OQ0UoIW5yX3NobWVtX2Ryb3BwZWQpOwotCQkJLyogRHJvcCBmb2xpbyBiZXlvbmQgRU9GOiAtJmd0O2luZGV4ICZndDs9IGVuZCAqLwotCQkJaWYgKHNobWVtX21hcHBpbmcobWFwcGluZykgJmFtcDsmYW1wOyBucl9zaG1lbV9kcm9wcGVkKQotCQkJCSpucl9zaG1lbV9kcm9wcGVkICYjNDM7PSBucl9wYWdlczsKLQkJCWVsc2UgaWYgKGZvbGlvX3Rlc3RfY2xlYXJfZGlydHkobmV3X2ZvbGlvKSkKLQkJCQlmb2xpb19hY2NvdW50X2NsZWFuZWQoCi0JCQkJCW5ld19mb2xpbywgaW5vZGVfdG9fd2IobWFwcGluZy0mZ3Q7aG9zdCkpOwotCQkJX19maWxlbWFwX3JlbW92ZV9mb2xpbyhuZXdfZm9saW8sIE5VTEwpOwotCQkJZm9saW9fcHV0X3JlZnMobmV3X2ZvbGlvLCBucl9wYWdlcyk7CiYjNDM7CQl4YXNfc2V0X29yZGVyKCZhbXA7eGFzLCBmb2xpby0mZ3Q7aW5kZXgsIG5ld19vcmRlcik7CiYjNDM7CQl4YXNfc3BsaXRfYWxsb2MoJmFtcDt4YXMsIGZvbGlvLCBvbGRfb3JkZXIsIGdmcCk7CiYjNDM7CQlpZiAoeGFzX2Vycm9yKCZhbXA7eGFzKSkgewomIzQzOwkJCXJldCA9IHhhc19lcnJvcigmYW1wO3hhcyk7CiYjNDM7CQkJZ290byBmYWlsX2ZyZWU7CiAJCX0KJiM0MzsJfQogCi0JCXpvbmVfZGV2aWNlX3ByaXZhdGVfc3BsaXRfY2IoZm9saW8sIE5VTEwpOwotCQkvKgotCQkgKiBVbmZyZWV6ZSBAZm9saW8gb25seSBhZnRlciBhbGwgcGFnZSBjYWNoZSBlbnRyaWVzLCB3aGljaAotCQkgKiB1c2VkIHRvIHBvaW50IHRvIGl0LCBoYXZlIGJlZW4gdXBkYXRlZCB3aXRoIG5ldyBmb2xpb3MuCi0JCSAqIE90aGVyd2lzZSwgYSBwYXJhbGxlbCBmb2xpb190cnlfZ2V0KCkgY2FuIGdyYWIgQGZvbGlvCi0JCSAqIGFuZCBpdHMgY2FsbGVyIGNhbiBzZWUgc3RhbGUgcGFnZSBjYWNoZSBlbnRyaWVzLgotCQkgKi8KLQkJZm9saW9fcmVmX3VuZnJlZXplKGZvbGlvLCBmb2xpb19jYWNoZV9yZWZfY291bnQoZm9saW8pICYjNDM7IDEpOwomIzQzOwlpX21tYXBfbG9ja19yZWFkKG1hcHBpbmcpOwomIzQzOwomIzQzOwkvKiBSYWN5IGNoZWNrIGlmIHdlIGNhbiBzcGxpdCB0aGUgcGFnZSwgYmVmb3JlIHVubWFwX2ZvbGlvKCkgKi8KJiM0MzsJaWYgKGZvbGlvX2V4cGVjdGVkX3JlZl9jb3VudChmb2xpbykgIT0gZm9saW9fcmVmX2NvdW50KGZvbGlvKSAtIDEpIHsKJiM0MzsJCXJldCA9IC1FQUdBSU47CiYjNDM7CQlnb3RvIGZhaWxfbW1hcF91bmxvY2s7CiYjNDM7CX0KJiM0MzsKJiM0MzsJLyoKJiM0MzsJICpfX3NwbGl0X3VubWFwcGVkX2ZvbGlvKCkgbWF5IG5lZWQgdG8gdHJpbSBvZmYgcGFnZXMgYmV5b25kCiYjNDM7CSAqIEVPRjogYnV0IG9uIDMyLWJpdCwgaV9zaXplX3JlYWQoKSB0YWtlcyBhbiBpcnEtdW5zYWZlCiYjNDM7CSAqIHNlcWxvY2ssIHdoaWNoIGNhbm5vdCBiZSBuZXN0ZWQgaW5zaWRlIHRoZSBwYWdlIHRyZWUgbG9jay4KJiM0MzsJICogU28gbm90ZSBlbmQgbm93OiBpX3NpemUgaXRzZWxmIG1heSBiZSBjaGFuZ2VkIGF0IGFueSBtb21lbnQsCiYjNDM7CSAqIGJ1dCBmb2xpbyBsb2NrIGlzIGdvb2QgZW5vdWdoIHRvIHNlcmlhbGl6ZSB0aGUgdHJpbW1pbmcuCiYjNDM7CSAqLwomIzQzOwllbmQgPSBESVZfUk9VTkRfVVAoaV9zaXplX3JlYWQobWFwcGluZy0mZ3Q7aG9zdCksIFBBR0VfU0laRSk7CiYjNDM7CWlmIChzaG1lbV9tYXBwaW5nKG1hcHBpbmcpKQomIzQzOwkJZW5kID0gc2htZW1fZmFsbG9jZW5kKG1hcHBpbmctJmd0O2hvc3QsIGVuZCk7CiYjNDM7CiYjNDM7CXVubWFwX2ZvbGlvKGZvbGlvKTsKJiM0MzsKJiM0MzsJeGFzX2xvY2tfaXJxKCZhbXA7eGFzKTsKJiM0MzsKJiM0MzsJLyoKJiM0MzsJICogQ2hlY2sgaWYgdGhlIGZvbGlvIGlzIHByZXNlbnQgaW4gcGFnZSBjYWNoZS4KJiM0MzsJICogV2UgYXNzdW1lIGFsbCB0YWlsIGFyZSBwcmVzZW50IHRvbywgaWYgZm9saW8gaXMgdGhlcmUuCiYjNDM7CSAqLwomIzQzOwlpZiAoeGFzX2xvYWQoJmFtcDt4YXMpICE9IGZvbGlvKSB7CiYjNDM7CQlyZXQgPSAtRUFHQUlOOwomIzQzOwkJZ290byBmYWlsOwomIzQzOwl9CiYjNDM7CiYjNDM7CWlmICghZm9saW9fcmVmX2ZyZWV6ZShmb2xpbywgb2xkX25yX3BhZ2VzICYjNDM7IDEpKSB7CiYjNDM7CQlyZXQgPSAtRUFHQUlOOwomIzQzOwkJZ290byBmYWlsOwomIzQzOwl9CiYjNDM7CiYjNDM7CWlmIChmb2xpb190ZXN0X3BtZF9tYXBwYWJsZShmb2xpbykgJmFtcDsmYW1wOyBuZXdfb3JkZXIgJmx0OyBIUEFHRV9QTURfT1JERVIpIHsKJiM0MzsJCWlmIChmb2xpb190ZXN0X3N3YXBiYWNrZWQoZm9saW8pKQomIzQzOwkJCWxydXZlY19zdGF0X21vZF9mb2xpbyhmb2xpbywgTlJfU0hNRU1fVEhQUywgLW9sZF9ucl9wYWdlcyk7CiYjNDM7CQllbHNlCiYjNDM7CQkJbHJ1dmVjX3N0YXRfbW9kX2ZvbGlvKGZvbGlvLCBOUl9GSUxFX1RIUFMsIC1vbGRfbnJfcGFnZXMpOwomIzQzOwl9CiYjNDM7CiYjNDM7CS8qIGxvY2sgbHJ1IGxpc3QvUGFnZUNvbXBvdW5kLCByZWYgZnJvemVuIGJ5IHBhZ2VfcmVmX2ZyZWV6ZSAqLwomIzQzOwlpZiAoZG9fbHJ1KQomIzQzOwkJbHJ1dmVjID0gZm9saW9fbHJ1dmVjX2xvY2soZm9saW8pOwomIzQzOwomIzQzOwlyZXQgPSBfX3NwbGl0X3VubWFwcGVkX2ZvbGlvKGZvbGlvLCBuZXdfb3JkZXIsIHNwbGl0X2F0LCAmYW1wO3hhcywKJiM0MzsJCQkJICAgICBtYXBwaW5nLCBzcGxpdF90eXBlKTsKJiM0MzsKJiM0MzsJLyoKJiM0MzsJICogVW5mcmVlemUgYWZ0ZXItc3BsaXQgZm9saW9zIGFuZCBwdXQgdGhlbSBiYWNrIHRvIHRoZSByaWdodAomIzQzOwkgKiBsaXN0LiBAZm9saW8gc2hvdWxkIGJlIGtlcHQgZnJvemVuIHVudGlsIHBhZ2UgY2FjaGUKJiM0MzsJICogZW50cmllcyBhcmUgdXBkYXRlZCB3aXRoIGFsbCB0aGUgb3RoZXIgYWZ0ZXItc3BsaXQgZm9saW9zCiYjNDM7CSAqIHRvIHByZXZlbnQgb3RoZXJzIHNlZWluZyBzdGFsZSBwYWdlIGNhY2hlIGVudHJpZXMuCiYjNDM7CSAqIEFzIGEgcmVzdWx0LCBuZXdfZm9saW8gc3RhcnRzIGZyb20gdGhlIG5leHQgZm9saW8gb2YKJiM0MzsJICogQGZvbGlvLgomIzQzOwkgKi8KJiM0MzsJZm9yIChuZXdfZm9saW8gPSBmb2xpb19uZXh0KGZvbGlvKTsgbmV3X2ZvbGlvICE9IGVuZF9mb2xpbzsKJiM0MzsJICAgICBuZXdfZm9saW8gPSBuZXh0KSB7CiYjNDM7CQl1bnNpZ25lZCBsb25nIG5yX3BhZ2VzID0gZm9saW9fbnJfcGFnZXMobmV3X2ZvbGlvKTsKJiM0MzsKJiM0MzsJCW5leHQgPSBmb2xpb19uZXh0KG5ld19mb2xpbyk7CiYjNDM7CiYjNDM7CQlmb2xpb19yZWZfdW5mcmVlemUobmV3X2ZvbGlvLAomIzQzOwkJCQkgICBmb2xpb19ucl9wYWdlcyhuZXdfZm9saW8pICYjNDM7IDEpOwogCiAJCWlmIChkb19scnUpCi0JCQlscnV2ZWNfdW5sb2NrKGxydXZlYyk7CiYjNDM7CQkJbHJ1X2FkZF9zcGxpdF9mb2xpbyhmb2xpbywgbmV3X2ZvbGlvLCBscnV2ZWMsIGxpc3QpOwogCi0JCWlmIChjaSkKLQkJCXN3YXBfY2x1c3Rlcl91bmxvY2soY2kpOwotCX0gZWxzZSB7Ci0JCWlmIChkZXF1ZXVlX2RlZmVycmVkKSB7Ci0JCQlsaXN0X2xydV91bmxvY2sobHJ1KTsKLQkJCXJjdV9yZWFkX3VubG9jaygpOwomIzQzOwkJLyogQWRkIHRoZSBuZXcgZm9saW8gdG8gdGhlIHBhZ2UgY2FjaGUuICovCiYjNDM7CQlpZiAobmV3X2ZvbGlvLSZndDtpbmRleCAmbHQ7IGVuZCkgewomIzQzOwkJCV9feGFfc3RvcmUoJmFtcDttYXBwaW5nLSZndDtpX3BhZ2VzLCBuZXdfZm9saW8tJmd0O2luZGV4LAomIzQzOwkJCQkgICBuZXdfZm9saW8sIDApOwomIzQzOwkJCWNvbnRpbnVlOwogCQl9Ci0JCXJldHVybiAtRUFHQUlOOwomIzQzOwomIzQzOwkJLyogRHJvcCBmb2xpbyBiZXlvbmQgRU9GOiAtJmd0O2luZGV4ICZndDs9IGVuZCAqLwomIzQzOwkJaWYgKHNobWVtX21hcHBpbmcobWFwcGluZykpCiYjNDM7CQkJbnJfc2htZW1fZHJvcHBlZCAmIzQzOz0gbnJfcGFnZXM7CiYjNDM7CQllbHNlIGlmIChmb2xpb190ZXN0X2NsZWFyX2RpcnR5KG5ld19mb2xpbykpCiYjNDM7CQkJZm9saW9fYWNjb3VudF9jbGVhbmVkKG5ld19mb2xpbywKJiM0MzsJCQkJCSAgICAgIGlub2RlX3RvX3diKG1hcHBpbmctJmd0O2hvc3QpKTsKJiM0MzsJCV9fZmlsZW1hcF9yZW1vdmVfZm9saW8obmV3X2ZvbGlvLCBOVUxMKTsKJiM0MzsJCWZvbGlvX3B1dF9yZWZzKG5ld19mb2xpbywgbnJfcGFnZXMpOwogCX0KIAomIzQzOwkvKgomIzQzOwkgKiBVbmZyZWV6ZSBAZm9saW8gb25seSBhZnRlciBhbGwgcGFnZSBjYWNoZSBlbnRyaWVzLCB3aGljaAomIzQzOwkgKiB1c2VkIHRvIHBvaW50IHRvIGl0LCBoYXZlIGJlZW4gdXBkYXRlZCB3aXRoIG5ldyBmb2xpb3MuCiYjNDM7CSAqIE90aGVyd2lzZSwgYSBwYXJhbGxlbCBmb2xpb190cnlfZ2V0KCkgY2FuIGdyYWIgQGZvbGlvCiYjNDM7CSAqIGFuZCBpdHMgY2FsbGVyIGNhbiBzZWUgc3RhbGUgcGFnZSBjYWNoZSBlbnRyaWVzLgomIzQzOwkgKi8KJiM0MzsJZm9saW9fcmVmX3VuZnJlZXplKGZvbGlvLCBmb2xpb19ucl9wYWdlcyhmb2xpbykgJiM0MzsgMSk7CiYjNDM7CiYjNDM7CWlmIChkb19scnUpCiYjNDM7CQlscnV2ZWNfdW5sb2NrKGxydXZlYyk7CiYjNDM7CiYjNDM7ZmFpbDoKJiM0MzsJeGFzX3VubG9ja19pcnEoJmFtcDt4YXMpOwomIzQzO2ZhaWxfbW1hcF91bmxvY2s6CiYjNDM7CWlmIChucl9zaG1lbV9kcm9wcGVkKQomIzQzOwkJc2htZW1fdW5jaGFyZ2UobWFwcGluZy0mZ3Q7aG9zdCwgbnJfc2htZW1fZHJvcHBlZCk7CiYjNDM7CS8qCiYjNDM7CSAqIERyb3AgdGhlIG1hcHBpbmcgd2hpbGUgdGhlIGlub2RlIGlzIHN0aWxsIHBpbm5lZC4gQGZvbGlvIHN0YXlzCiYjNDM7CSAqIGxvY2tlZCBhbmQgcHJlc2VudCBpbiB0aGUgcGFnZSBjYWNoZSwgc28gZXZpY3Rpb24gY2Fubm90IGZyZWUKJiM0MzsJICogdGhlIGlub2RlIHlldCwgbm90aGluZyBwYXN0IHRoaXMgcG9pbnQgbWF5IHRvdWNoIHRoZSBpbm9kZSBvcgomIzQzOwkgKiB0aGUgbWFwcGluZy4KJiM0MzsJICovCiYjNDM7CWlfbW1hcF91bmxvY2tfcmVhZChtYXBwaW5nKTsKJiM0MztmYWlsX2ZyZWU6CiYjNDM7CS8qIFJlc3RvcmUgdGhlIHByZXZpb3VzbHkgYWN0aXZlIG1lbWNnICovCiYjNDM7CXNldF9hY3RpdmVfbWVtY2cob2xkX21lbWNnKTsKJiM0MzsJbWVtX2Nncm91cF9wdXQobWVtY2cpOwomIzQzOwl4YXNfZGVzdHJveSgmYW1wO3hhcyk7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtNDEwMiwxNyAmIzQzOzQyNDgsMTEgQEAgc3RhdGljIGludCBfX2ZvbGlvX3NwbGl0KHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIsCiAJCXN0cnVjdCBwYWdlICpzcGxpdF9hdCwgc3RydWN0IHBhZ2UgKmxvY2tfYXQsCiAJCXN0cnVjdCBsaXN0X2hlYWQgKmxpc3QsIGVudW0gc3BsaXRfdHlwZSBzcGxpdF90eXBlKQogewotCVhBX1NUQVRFKHhhcywgJmFtcDtmb2xpby0mZ3Q7bWFwcGluZy0mZ3Q7aV9wYWdlcywgZm9saW8tJmd0O2luZGV4KTsKJiM0MzsJYm9vbCBpc19zd2FwY2FjaGUgPSBmb2xpb190ZXN0X3N3YXBjYWNoZShmb2xpbyk7CiAJc3RydWN0IGZvbGlvICplbmRfZm9saW8gPSBmb2xpb19uZXh0KGZvbGlvKTsKIAlib29sIGlzX2Fub24gPSBmb2xpb190ZXN0X2Fub24oZm9saW8pOwotCXN0cnVjdCBtZW1fY2dyb3VwICptZW1jZywgKm9sZF9tZW1jZzsKLQlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyA9IE5VTEw7Ci0Jc3RydWN0IGFub25fdm1hICphbm9uX3ZtYSA9IE5VTEw7CiAJaW50IG9sZF9vcmRlciA9IGZvbGlvX29yZGVyKGZvbGlvKTsKIAlzdHJ1Y3QgZm9saW8gKm5ld19mb2xpbywgKm5leHQ7Ci0JaW50IG5yX3NobWVtX2Ryb3BwZWQgPSAwOwotCWVudW0gdHR1X2ZsYWdzIHR0dV9mbGFncyA9IDA7Ci0JcGdvZmZfdCBlbmQgPSAwOwogCWludCByZXQ7CiAKIAlWTV9XQVJOX09OX09OQ0VfRk9MSU8oIWZvbGlvX3Rlc3RfbG9ja2VkKGZvbGlvKSwgZm9saW8pOwpAQCAtNDEyMCwxNDEgJiM0Mzs0MjYwLDI5IEBAIHN0YXRpYyBpbnQgX19mb2xpb19zcGxpdChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyLAogCiAJaWYgKGZvbGlvICE9IHBhZ2VfZm9saW8oc3BsaXRfYXQpIHx8IGZvbGlvICE9IHBhZ2VfZm9saW8obG9ja19hdCkpIHsKIAkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBvdXRfbm9fbWVtY2c7CiYjNDM7CQlnb3RvIG91dDsKIAl9CiAKIAlpZiAobmV3X29yZGVyICZndDs9IG9sZF9vcmRlcikgewogCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIG91dF9ub19tZW1jZzsKJiM0MzsJCWdvdG8gb3V0OwogCX0KIAogCXJldCA9IGZvbGlvX2NoZWNrX3NwbGl0dGFibGUoZm9saW8sIG5ld19vcmRlciwgc3BsaXRfdHlwZSk7CiAJaWYgKHJldCkgewogCQlWTV9XQVJOX09OQ0UocmV0ID09IC1FSU5WQUwsICYjMzQ7VHJpZWQgdG8gc3BsaXQgYW4gdW5zcGxpdHRhYmxlIGZvbGlvJiMzNDspOwotCQlnb3RvIG91dF9ub19tZW1jZzsKLQl9Ci0KLQkvKgotCSAqIHN3aXRjaCB0byBmb2xpbyYjMzk7cyBtZW1jZyBhcyB4YXJyYXkgbm9kZSBhbGxvY2F0aW9uIGNhbiBoYXBwZW4gYW5kCi0JICogbmVlZHMgdG8gY2hhcmdlIHRvIGl0LgotCSAqLwotCW1lbWNnID0gZ2V0X21lbV9jZ3JvdXBfZnJvbV9mb2xpbyhmb2xpbyk7Ci0Jb2xkX21lbWNnID0gc2V0X2FjdGl2ZV9tZW1jZyhtZW1jZyk7Ci0KLQlpZiAoaXNfYW5vbikgewotCQkvKgotCQkgKiBUaGUgY2FsbGVyIGRvZXMgbm90IG5lY2Vzc2FyaWx5IGhvbGQgYW4gbW1hcF9sb2NrIHRoYXQgd291bGQKLQkJICogcHJldmVudCB0aGUgYW5vbl92bWEgZGlzYXBwZWFyaW5nIHNvIHdlIGZpcnN0IHdlIHRha2UgYQotCQkgKiByZWZlcmVuY2UgdG8gaXQgYW5kIHRoZW4gbG9jayB0aGUgYW5vbl92bWEgZm9yIHdyaXRlLiBUaGlzCi0JCSAqIGlzIHNpbWlsYXIgdG8gZm9saW9fbG9ja19hbm9uX3ZtYV9yZWFkIGV4Y2VwdCB0aGUgd3JpdGUgbG9jawotCQkgKiBpcyB0YWtlbiB0byBzZXJpYWxpc2UgYWdhaW5zdCBwYXJhbGxlbCBzcGxpdCBvciBjb2xsYXBzZQotCQkgKiBvcGVyYXRpb25zLgotCQkgKi8KLQkJYW5vbl92bWEgPSBmb2xpb19nZXRfYW5vbl92bWEoZm9saW8pOwotCQlpZiAoIWFub25fdm1hKSB7Ci0JCQlyZXQgPSAtRUJVU1k7Ci0JCQlnb3RvIG91dDsKLQkJfQotCQlhbm9uX3ZtYV9sb2NrX3dyaXRlKGFub25fdm1hKTsKLQkJbWFwcGluZyA9IE5VTEw7Ci0JfSBlbHNlIHsKLQkJdW5zaWduZWQgaW50IG1pbl9vcmRlcjsKLQkJZ2ZwX3QgZ2ZwOwotCi0JCW1hcHBpbmcgPSBmb2xpby0mZ3Q7bWFwcGluZzsKLQkJbWluX29yZGVyID0gbWFwcGluZ19taW5fZm9saW9fb3JkZXIobWFwcGluZyk7Ci0JCWlmIChuZXdfb3JkZXIgJmx0OyBtaW5fb3JkZXIpIHsKLQkJCXJldCA9IC1FSU5WQUw7Ci0JCQlnb3RvIG91dDsKLQkJfQotCi0JCWdmcCA9IGN1cnJlbnRfZ2ZwX2NvbnRleHQobWFwcGluZ19nZnBfbWFzayhtYXBwaW5nKSAmYW1wOwotCQkJCQkJCUdGUF9SRUNMQUlNX01BU0spOwotCi0JCWlmICghZmlsZW1hcF9yZWxlYXNlX2ZvbGlvKGZvbGlvLCBnZnApKSB7Ci0JCQlyZXQgPSAtRUJVU1k7Ci0JCQlnb3RvIG91dDsKLQkJfQotCi0JCW1hcHBpbmdfc2V0X3VwZGF0ZSgmYW1wO3hhcywgbWFwcGluZyk7Ci0KLQkJaWYgKHNwbGl0X3R5cGUgPT0gU1BMSVRfVFlQRV9VTklGT1JNKSB7Ci0JCQl4YXNfc2V0X29yZGVyKCZhbXA7eGFzLCBmb2xpby0mZ3Q7aW5kZXgsIG5ld19vcmRlcik7Ci0JCQl4YXNfc3BsaXRfYWxsb2MoJmFtcDt4YXMsIGZvbGlvLCBvbGRfb3JkZXIsIGdmcCk7Ci0JCQlpZiAoeGFzX2Vycm9yKCZhbXA7eGFzKSkgewotCQkJCXJldCA9IHhhc19lcnJvcigmYW1wO3hhcyk7Ci0JCQkJZ290byBvdXQ7Ci0JCQl9Ci0JCX0KLQotCQlhbm9uX3ZtYSA9IE5VTEw7Ci0JCWlfbW1hcF9sb2NrX3JlYWQobWFwcGluZyk7Ci0KLQkJLyoKLQkJICpfX3NwbGl0X3VubWFwcGVkX2ZvbGlvKCkgbWF5IG5lZWQgdG8gdHJpbSBvZmYgcGFnZXMgYmV5b25kCi0JCSAqIEVPRjogYnV0IG9uIDMyLWJpdCwgaV9zaXplX3JlYWQoKSB0YWtlcyBhbiBpcnEtdW5zYWZlCi0JCSAqIHNlcWxvY2ssIHdoaWNoIGNhbm5vdCBiZSBuZXN0ZWQgaW5zaWRlIHRoZSBwYWdlIHRyZWUgbG9jay4KLQkJICogU28gbm90ZSBlbmQgbm93OiBpX3NpemUgaXRzZWxmIG1heSBiZSBjaGFuZ2VkIGF0IGFueSBtb21lbnQsCi0JCSAqIGJ1dCBmb2xpbyBsb2NrIGlzIGdvb2QgZW5vdWdoIHRvIHNlcmlhbGl6ZSB0aGUgdHJpbW1pbmcuCi0JCSAqLwotCQllbmQgPSBESVZfUk9VTkRfVVAoaV9zaXplX3JlYWQobWFwcGluZy0mZ3Q7aG9zdCksIFBBR0VfU0laRSk7Ci0JCWlmIChzaG1lbV9tYXBwaW5nKG1hcHBpbmcpKQotCQkJZW5kID0gc2htZW1fZmFsbG9jZW5kKG1hcHBpbmctJmd0O2hvc3QsIGVuZCk7Ci0JfQotCi0JLyoKLQkgKiBSYWN5IGNoZWNrIGlmIHdlIGNhbiBzcGxpdCB0aGUgcGFnZSwgYmVmb3JlIHVubWFwX2ZvbGlvKCkgd2lsbAotCSAqIHNwbGl0IFBNRHMKLQkgKi8KLQlpZiAoZm9saW9fZXhwZWN0ZWRfcmVmX2NvdW50KGZvbGlvKSAhPSBmb2xpb19yZWZfY291bnQoZm9saW8pIC0gMSkgewotCQlyZXQgPSAtRUFHQUlOOwotCQlnb3RvIG91dF91bmxvY2s7Ci0JfQotCi0JdW5tYXBfZm9saW8oZm9saW8pOwotCi0JLyogYmxvY2sgaW50ZXJydXB0IHJlZW50cnkgaW4geGFfbG9jayBhbmQgc3BpbmxvY2sgKi8KLQlsb2NhbF9pcnFfZGlzYWJsZSgpOwotCWlmIChtYXBwaW5nKSB7Ci0JCS8qCi0JCSAqIENoZWNrIGlmIHRoZSBmb2xpbyBpcyBwcmVzZW50IGluIHBhZ2UgY2FjaGUuCi0JCSAqIFdlIGFzc3VtZSBhbGwgdGFpbCBhcmUgcHJlc2VudCB0b28sIGlmIGZvbGlvIGlzIHRoZXJlLgotCQkgKi8KLQkJeGFzX2xvY2soJmFtcDt4YXMpOwotCQl4YXNfcmVzZXQoJmFtcDt4YXMpOwotCQlpZiAoeGFzX2xvYWQoJmFtcDt4YXMpICE9IGZvbGlvKSB7Ci0JCQlyZXQgPSAtRUFHQUlOOwotCQkJZ290byBmYWlsOwotCQl9CiYjNDM7CQlnb3RvIG91dDsKIAl9CiAKLQlyZXQgPSBfX2ZvbGlvX2ZyZWV6ZV9hbmRfc3BsaXRfdW5tYXBwZWQoZm9saW8sIG5ld19vcmRlciwgc3BsaXRfYXQsICZhbXA7eGFzLCBtYXBwaW5nLAotCQkJCQkJdHJ1ZSwgbGlzdCwgc3BsaXRfdHlwZSwgZW5kLCAmYW1wO25yX3NobWVtX2Ryb3BwZWQpOwotZmFpbDoKLQlpZiAobWFwcGluZykKLQkJeGFzX3VubG9jaygmYW1wO3hhcyk7Ci0KLQlsb2NhbF9pcnFfZW5hYmxlKCk7Ci0KLQlpZiAobnJfc2htZW1fZHJvcHBlZCkKLQkJc2htZW1fdW5jaGFyZ2UobWFwcGluZy0mZ3Q7aG9zdCwgbnJfc2htZW1fZHJvcHBlZCk7Ci0KLQlpZiAoIXJldCAmYW1wOyZhbXA7IGlzX2Fub24gJmFtcDsmYW1wOyAhZm9saW9faXNfZGV2aWNlX3ByaXZhdGUoZm9saW8pKQotCQl0dHVfZmxhZ3MgPSBUVFVfVVNFX1NIQVJFRF9aRVJPUEFHRTsKLQotCXJlbWFwX3BhZ2UoZm9saW8sIDEgJmx0OyZsdDsgb2xkX29yZGVyLCB0dHVfZmxhZ3MpOwotCi0JLyoKLQkgKiBEcm9wIHRoZSBtYXBwaW5nIHdoaWxlIHRoZSBpbm9kZSBpcyBzdGlsbCBwaW5uZWQuIEBmb2xpbyBzdGF5cwotCSAqIGxvY2tlZCBhbmQgcHJlc2VudCBpbiB0aGUgcGFnZSBjYWNoZSB1bnRpbCB0aGUgbG9vcCBiZWxvdywgc28KLQkgKiBldmljdGlvbiBjYW5ub3QgZnJlZSB0aGUgaW5vZGUgeWV0OyBAbG9ja19hdCBpcyBub3QgZW5vdWdoLCBpdCBtYXkKLQkgKiBiZSBhIHRhaWwgYmV5b25kIEVPRiB0aGF0IHRoZSBzcGxpdCBhbHJlYWR5IGRyb3BwZWQgZnJvbSB0aGUgcGFnZQotCSAqIGNhY2hlLiBOb3RoaW5nIHBhc3QgdGhpcyBwb2ludCBtYXkgdG91Y2ggdGhlIGlub2RlIG9yIHRoZSBtYXBwaW5nLgotCSAqLwotCWlmIChtYXBwaW5nKSB7Ci0JCWlfbW1hcF91bmxvY2tfcmVhZChtYXBwaW5nKTsKLQkJbWFwcGluZyA9IE5VTEw7Ci0JfQomIzQzOwlpZiAoaXNfYW5vbikKJiM0MzsJCXJldCA9IF9fZm9saW9fZnJlZXplX3NwbGl0X3VubWFwKGZvbGlvLCBuZXdfb3JkZXIsIHNwbGl0X2F0LCB0cnVlLAomIzQzOwkJCQkJCSB0cnVlLCBsaXN0LCBzcGxpdF90eXBlKTsKJiM0MzsJZWxzZSBpZiAoaXNfc3dhcGNhY2hlKQomIzQzOwkJcmV0ID0gX19mb2xpb19mcmVlemVfc3BsaXRfdW5tYXAoZm9saW8sIG5ld19vcmRlciwgc3BsaXRfYXQsIHRydWUsCiYjNDM7CQkJCQkJIGZhbHNlLCBsaXN0LCBzcGxpdF90eXBlKTsKJiM0MzsJZWxzZQomIzQzOwkJcmV0ID0gX19mb2xpb19mcmVlemVfc3BsaXRfdW5tYXBfZmlsZShmb2xpbywgbmV3X29yZGVyLCBzcGxpdF9hdCwKJiM0MzsJCQkJCQkgICAgICB0cnVlLCBsaXN0LCBzcGxpdF90eXBlKTsKIAogCS8qCiAJICogVW5sb2NrIGFsbCBhZnRlci1zcGxpdCBmb2xpb3MgZXhjZXB0IHRoZSBvbmUgY29udGFpbmluZwpAQCAtNDI2NSwyOSAmIzQzOzQyOTMsMTkgQEAgc3RhdGljIGludCBfX2ZvbGlvX3NwbGl0KHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIsCiAJCWlmIChuZXdfZm9saW8gPT0gcGFnZV9mb2xpbyhsb2NrX2F0KSkKIAkJCWNvbnRpbnVlOwogCi0JCWZvbGlvX3VubG9jayhuZXdfZm9saW8pOwogCQkvKgogCQkgKiBTdWJwYWdlcyB3aG9zZSBtYXBwaW5nIGhhcyBiZWVuIHphcHBlZCBtYXkgYmUgZnJlZWQKIAkJICogZWFybGllciwgYnV0IGZyZWVpbmcgdGhlbSByZXF1aXJlcyB0YWtpbmcgdGhlCiAJCSAqIGxydV9sb2NrLCBzbyB3ZSBkZWZlciBwdXRfcGFnZSgpIG9uIHRhaWwgcGFnZXMgdW50aWwKIAkJICogYWZ0ZXIgdGhlIHNwbGl0IGNvbXBsZXRlcy4KIAkJICovCi0JCWZyZWVfZm9saW9fYW5kX3N3YXBfY2FjaGUobmV3X2ZvbGlvKTsKJiM0MzsJCWlmIChpc19zd2FwY2FjaGUpCiYjNDM7CQkJZm9saW9fZnJlZV9zd2FwKG5ld19mb2xpbyk7CiYjNDM7CQlmb2xpb191bmxvY2sobmV3X2ZvbGlvKTsKJiM0MzsJCWZvbGlvX3B1dChuZXdfZm9saW8pOwogCX0KIAotb3V0X3VubG9jazoKLQlpZiAoYW5vbl92bWEpIHsKLQkJYW5vbl92bWFfdW5sb2NrX3dyaXRlKGFub25fdm1hKTsKLQkJcHV0X2Fub25fdm1hKGFub25fdm1hKTsKLQl9Ci0JaWYgKG1hcHBpbmcpCi0JCWlfbW1hcF91bmxvY2tfcmVhZChtYXBwaW5nKTsKIG91dDoKLQkvKiByZXN0b3JlIHRvIGNhbGxlciYjMzk7cyBvbGRfbWVtY2cgKi8KLQlzZXRfYWN0aXZlX21lbWNnKG9sZF9tZW1jZyk7Ci0JbWVtX2Nncm91cF9wdXQobWVtY2cpOwotb3V0X25vX21lbWNnOgotCXhhc19kZXN0cm95KCZhbXA7eGFzKTsKIAlpZiAoaXNfcG1kX29yZGVyKG9sZF9vcmRlcikpCiAJCWNvdW50X3ZtX2V2ZW50KCFyZXQgPyBUSFBfU1BMSVRfUEFHRSA6IFRIUF9TUExJVF9QQUdFX0ZBSUxFRCk7CiAJY291bnRfbXRocF9zdGF0KG9sZF9vcmRlciwgIXJldCA/IE1USFBfU1RBVF9TUExJVCA6IE1USFBfU1RBVF9TUExJVF9GQUlMRUQpOwpAQCAtNDMxOCwyMiAmIzQzOzQzMzYsMTMgQEAgc3RhdGljIGludCBfX2ZvbGlvX3NwbGl0KHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIsCiAgKi8KIGludCBmb2xpb19zcGxpdF91bm1hcHBlZChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyKQogewotCWludCByZXQgPSAwOwotCiAJVk1fV0FSTl9PTl9PTkNFX0ZPTElPKGZvbGlvX21hcHBlZChmb2xpbyksIGZvbGlvKTsKIAlWTV9XQVJOX09OX09OQ0VfRk9MSU8oIWZvbGlvX3Rlc3RfbG9ja2VkKGZvbGlvKSwgZm9saW8pOwogCVZNX1dBUk5fT05fT05DRV9GT0xJTyghZm9saW9fdGVzdF9sYXJnZShmb2xpbyksIGZvbGlvKTsKIAlWTV9XQVJOX09OX09OQ0VfRk9MSU8oIWZvbGlvX3Rlc3RfYW5vbihmb2xpbyksIGZvbGlvKTsKIAotCWlmIChmb2xpb19leHBlY3RlZF9yZWZfY291bnQoZm9saW8pICE9IGZvbGlvX3JlZl9jb3VudChmb2xpbykgLSAxKQotCQlyZXR1cm4gLUVBR0FJTjsKLQotCWxvY2FsX2lycV9kaXNhYmxlKCk7Ci0JcmV0ID0gX19mb2xpb19mcmVlemVfYW5kX3NwbGl0X3VubWFwcGVkKGZvbGlvLCBuZXdfb3JkZXIsICZhbXA7Zm9saW8tJmd0O3BhZ2UsIE5VTEwsCi0JCQkJCQlOVUxMLCBmYWxzZSwgTlVMTCwgU1BMSVRfVFlQRV9VTklGT1JNLAotCQkJCQkJMCwgTlVMTCk7Ci0JbG9jYWxfaXJxX2VuYWJsZSgpOwotCXJldHVybiByZXQ7CiYjNDM7CXJldHVybiBfX2ZvbGlvX2ZyZWV6ZV9zcGxpdF91bm1hcChmb2xpbywgbmV3X29yZGVyLCAmYW1wO2ZvbGlvLSZndDtwYWdlLCBmYWxzZSwKJiM0MzsJCQkJCSAgZmFsc2UsIE5VTEwsIFNQTElUX1RZUEVfVU5JRk9STSk7CiB9CiAKIC8qCkBAIC00MzUyLDExICYjNDM7NDM2MSwxMSBAQCBpbnQgZm9saW9fc3BsaXRfdW5tYXBwZWQoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlcikKICAqICAgIEdVUCBwaW5zLCB3aWxsIHJlc3VsdCBpbiB0aGUgZm9saW8gbm90IGdldHRpbmcgc3BsaXQ7IGluc3RlYWQsIHRoZSBjYWxsZXIKICAqICAgIHdpbGwgcmVjZWl2ZSBhbiAtRUFHQUlOLgogICoKLSAqIDQpIEBuZXdfb3JkZXIgJmd0OyAxLCB1c3VhbGx5LiBTcGxpdHRpbmcgdG8gb3JkZXItMSBhbm9ueW1vdXMgZm9saW9zIGlzIG5vdAotICogICAgc3VwcG9ydGVkIGZvciBub24tZmlsZS1iYWNrZWQgZm9saW9zLCBiZWNhdXNlIGZvbGlvLSZndDtfZGVmZXJyZWRfbGlzdCwgd2hpY2gKLSAqICAgIGlzIHVzZWQgYnkgcGFydGlhbGx5IG1hcHBlZCBmb2xpb3MsIGlzIHN0b3JlZCBpbiBzdWJwYWdlIDIsIGJ1dCBhbiBvcmRlci0xCi0gKiAgICBmb2xpbyBvbmx5IGhhcyBzdWJwYWdlcyAwIGFuZCAxLiBGaWxlLWJhY2tlZCBvcmRlci0xIGZvbGlvcyBhcmUgc3VwcG9ydGVkLAotICogICAgc2luY2UgdGhleSBkbyBub3QgdXNlIF9kZWZlcnJlZF9saXN0LgomIzQzOyAqIDQpIEBuZXdfb3JkZXIgJmd0OyAxLCB1c3VhbGx5LiBPcmRlci0xIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIGFub24gb3Igc3dhcGNhY2hlCiYjNDM7ICogICAgZm9saW9zOiBhbm9uIGZvbGlvcyBuZWVkIHN1YnBhZ2UgMiBmb3IgX2RlZmVycmVkX2xpc3QsIHdoaWNoIG9yZGVyLTEKJiM0MzsgKiAgICBmb2xpb3MgbGFjaywgYW5kIGEgc3dhcGNhY2hlIGZvbGlvIG1heSBiZWNvbWUgYW5vbiBvbmNlIGZhdWx0ZWQgaW4uCiYjNDM7ICogICAgRmlsZS1iYWNrZWQgb3JkZXItMSBmb2xpb3MgYXJlIHN1cHBvcnRlZCwgc2luY2UgdGhleSBkbyBub3QgdXNlCiYjNDM7ICogICAgX2RlZmVycmVkX2xpc3QuCiAgKgogICogQWZ0ZXIgc3BsaXR0aW5nLCB0aGUgY2FsbGVyJiMzOTtzIGZvbGlvIHJlZmVyZW5jZSB3aWxsIGJlIHRyYW5zZmVycmVkIHRvIEBwYWdlLAogICogcmVzdWx0aW5nIGluIGEgcmFpc2VkIHJlZmNvdW50IG9mIEBwYWdlIGFmdGVyIHRoaXMgY2FsbC4gVGhlIG90aGVyIHBhZ2VzIG1heQpkaWZmIC0tZ2l0IGEvbW0vc3dhcF9zdGF0ZS5jIGIvbW0vc3dhcF9zdGF0ZS5jCmluZGV4IDViZTgyNTkxMWU2NDUuLmYxNDA1ZTViODEzZWUgMTAwNjQ0Ci0tLSBhL21tL3N3YXBfc3RhdGUuYwomIzQzOyYjNDM7JiM0MzsgYi9tbS9zd2FwX3N0YXRlLmMKQEAgLTM4OCw4ICYjNDM7Mzg4LDkgQEAgdm9pZCBfX3N3YXBfY2FjaGVfcmVwbGFjZV9mb2xpbyhzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpLAogCSAgICBmb2xpb19vcmRlcihvbGQpICE9IGZvbGlvX29yZGVyKG5ldykpIHsKIAkJY2lfb2ZmID0gc3dwX2NsdXN0ZXJfb2Zmc2V0KG9sZC0mZ3Q7c3dhcCk7CiAJCWNpX2VuZCA9IGNpX29mZiAmIzQzOyBmb2xpb19ucl9wYWdlcyhvbGQpOwotCQl3aGlsZSAoY2lfb2ZmJiM0MzsmIzQzOyAmbHQ7IGNpX2VuZCkKJiM0MzsJCWRvIHsKIAkJCVdBUk5fT05fT05DRShzd3BfdGJfdG9fZm9saW8oX19zd2FwX3RhYmxlX2dldChjaSwgY2lfb2ZmKSkgIT0gb2xkKTsKJiM0MzsJCX0gd2hpbGUgKCYjNDM7JiM0MztjaV9vZmYgJmx0OyBjaV9lbmQpOwogCX0KIH0KIAo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40MS8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDcgMjE6NTU8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTE0MTYKCQkJCQkJCW91dHB1dDogMTg0CgkJCQkJCQl0aG91Z2h0czogNjA1CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKktNU0FOIENoZWNrOiBGb2xpbyBTcGxpdHRpbmcgUmVmYWN0b3IqKgoKT2theSwgc28gSSYjMzk7dmUgYmVlbiByZXZpZXdpbmcgdGhpcyBwYXRjaCwgYW5kIGl0JiMzOTtzIHRvdWNoaW5nIHNvbWUgY29yZSBtZW1vcnkgbWFuYWdlbWVudCBzdHVmZjogYG1tL2h1Z2VfbWVtb3J5LmNgIGFuZCBgbW0vc3dhcF9zdGF0ZS5jYC4gSXQmIzM5O3MgYWxsIGFib3V0IGhvdyBmb2xpb3MgZ2V0IHNwbGl0IHVwLCBwYXJ0aWN1bGFybHkgZGVhbGluZyB3aXRoIHRob3NlIHVubWFwcGVkLCBhbm9ueW1vdXMsIGFuZCBzd2FwY2FjaGUgZm9saW9zLiBUaGUgY29kZSYjMzk7cyByZWZhY3RvcmluZyBzZXZlcmFsIGtleSBmdW5jdGlvbnM6IGByZW1hcF9wYWdlYCwgYSBidW5jaCBvZiBgX19zcGxpdF8qYCwgYGZvbGlvXypgIGFuZCBgX19zd2FwX2NhY2hlX3JlcGxhY2VfZm9saW9gLiBMb29rcyBsaWtlIGEgZmFpcmx5IGludm9sdmVkIGNoYW5nZS4KCk15IGltbWVkaWF0ZSBjb25jZXJuLCBhcyBhbHdheXMgd2l0aCBtZW1vcnkgbWFuYWdlbWVudCwgaXMgdW5pbml0aWFsaXplZCBtZW1vcnkgYWNjZXNzLiBHaXZlbiBteSBleHBlcnRpc2UsIEkgYWx3YXlzIHNjcnV0aW5pemUgdGhlc2UgcGF0Y2hlcyBmb3IgdGhhdCBwb3RlbnRpYWwuIEkgc2VlIHRoaXMgYXMgYSBmb2xpbyBzcGxpdHRpbmcgcGF0Y2gsIHdoaWNoIGRvZXMgbm90IGFsbG9jYXRlICpuZXcqIG1lbW9yeS4gSXQmIzM5O3Mgd29ya2luZyB3aXRoIGV4aXN0aW5nIHBhZ2UgbWV0YWRhdGEgKGVzc2VudGlhbGx5IGBzdHJ1Y3QgcGFnZWAgYWxyZWFkeSBwcmVzZW50IGluIGBtZW1tYXBgKSwgYW5kIHRoZSAqY29udGVudHMqIG9mIHRob3NlIHBhZ2VzIGRvbiYjMzk7dCBzZWVtIHRvIGJlIGNoYW5naW5nLCBqdXN0IHRoZWlyIG1ldGFkYXRhIGFuZCBwYWdlIHRhYmxlIGVudHJpZXMuIFRoZSBwYXRjaCBmb2N1c2VzIG9uIHNwbGl0dGluZyBmb2xpb3MgaW50byBzbWFsbGVyIHVuaXRzIGFuZCBjb3JyZWN0bHkgbWFuYWdpbmcgdGhlaXIgYXNzb2NpYXRlZCBtZXRhZGF0YSBhbmQgY2FjaGUgZW50cmllcy4KCkkmIzM5O20gZm9jdXNpbmcgc3BlY2lmaWNhbGx5IG9uIHJpc2sgZm9yIHVzZS1hZnRlci1mcmVlLCBkb3VibGUtZnJlZSwgbG9ja2luZyBkZWFkbG9ja3MsIG9yIHJlZmVyZW5jZSBjb3VudCBpbWJhbGFuY2VzIGluIHRoaXMgcGF0Y2guIFRoZXNlIGFyZSBhbGwgY29tbW9uIHBpdGZhbGxzLiBCYXNlZCBvbiB0aGUgZGVzY3JpcHRpb24sIHRoZXJlJiMzOTtzIG5vdGhpbmcgaW4gaGVyZSB0aGF0IHNob3VsZCBsZWFkIHRvIG5ldywgY29tcGxleCBkYXRhIHN0cnVjdHVyZXMgYmVpbmcgY3JlYXRlZCwgbm9yIGRvZXMgaXQgbG9vayBsaWtlIGFueSBkYXRhIGlzIGJlaW5nIHNlbnQgdG8gdXNlciBzcGFjZSBkaXJlY3RseSB0aGF0IGNvdWxkIGV4cG9zZSB1bmluaXRpYWxpemVkIG1lbW9yeS4gVGhlIGRlc2NyaXB0aW9uIGFsc28gbWVudGlvbnMgdGhhdCB0aGVyZSBhcmVuJiMzOTt0IGNoYW5nZXMgdG8gYm91bmRzIGNoZWNrcyB0aGF0IHdvdWxkIGV4cG9zZSB1bmluaXRpYWxpemVkIG1lbW9yeS4KClRoZSBzdGF0ZWQgcG90ZW50aWFsIGJ1Z3MgYXJlIHR5cGljYWxseSBkZXRlY3RlZCBieSBLQVNBTiwgTE9DS0RFUCwgYW5kIFZNX1dBUk5fT04gYXNzZXJ0aW9ucywgd2hpY2ggaXMgZ29vZC4gS01TQU4gaXRzZWxmIGlzIGZvciB1bmluaXRpYWxpemVkIG1lbW9yeSByZWFkcyBhbmQgbGVha3MuIFNpbmNlIHRoaXMgcGF0Y2ggZG9lc24mIzM5O3QgYXBwZWFyIHRvIGludHJvZHVjZSB1bmluaXRpYWxpemVkIG1lbW9yeSAqdXNhZ2UqIGRpcmVjdGx5LCBtZWFuaW5nIGl04oCZcyBub3QgY3JlYXRpbmcgbmV3IG1lbW9yeSBhbmQgdGhlbiByZWFkaW5nIGZyb20gaXQgYmVmb3JlIGluaXRpYWxpemF0aW9uLCBLTVNBTiBzaG91bGQgYmUgdW5uZWNlc3NhcnkuIFRoaXMgcGF0Y2ggaXMgYWJvdXQgc3BsaXR0aW5nIGFuZCBtYW5hZ2luZyAqZXhpc3RpbmcqIG1lbW9yeSwgd2hpY2ggbWVhbnMsIGBOZWVkc0tNU0FOYCBpcyBmYWxzZS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40Mi8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDcgMjE6NTU8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5zZXQtcmVzdWx0czwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggcmVmYWN0b3JzIGZvbGlvIHNwbGl0dGluZyBsb2dpYyBpbiB0aGUgbWVtb3J5IG1hbmFnZW1lbnQgc3Vic3lzdGVtIChgbW0vaHVnZV9tZW1vcnkuY2ApLCBzcGVjaWZpY2FsbHkgc2VwYXJhdGluZyB0aGUgaGFuZGxpbmcgb2YgYW5vbnltb3VzLCBzd2FwY2FjaGUsIGFuZCBmaWxlLWJhY2tlZCBmb2xpb3MuIEl0IG1vZGlmaWVzIHJlZmVyZW5jZSBjb3VudGluZywgbG9ja2luZywgYW5kIHBhZ2UgY2FjaGUvc3dhcCBjYWNoZSByZXBsYWNlbWVudCBsb2dpYy4gVGhlc2UgY2hhbmdlcyBwcmltYXJpbHkgcmlzayBpbnRyb2R1Y2luZyB1c2UtYWZ0ZXItZnJlZSwgZG91YmxlLWZyZWUsIGxvY2tpbmcgZGVhZGxvY2tzLCBvciByZWZlcmVuY2UgY291bnQgaW1iYWxhbmNlcy4gU3VjaCBpc3N1ZXMgYXJlIGVmZmVjdGl2ZWx5IGRldGVjdGVkIGJ5IEtBU0FOLCBMT0NLREVQLCBhbmQgc3RhbmRhcmQga2VybmVsIGRlYnVnZ2luZyBhc3NlcnRpb25zIChlLmcuLCBgVk1fV0FSTl9PTmApLiBUaGUgcGF0Y2ggZG9lcyBub3QgaW50cm9kdWNlIG5ldyBhbGxvY2F0aW9ucyBvZiBjb21wbGV4IGRhdGEgc3RydWN0dXJlcywgbm9yIGRvZXMgaXQgbW9kaWZ5IGRhdGEgc2VudCB0byB1c2VyIHNwYWNlIG9yIGFsdGVyIGJvdW5kcyBjaGVja2luZyBpbiBhIHdheSB0aGF0IGNvdWxkIGV4cG9zZSB1bmluaXRpYWxpemVkIG1lbW9yeS4gVGhlcmVmb3JlLCB0aGVyZSBpcyBubyBqdXN0aWZpY2F0aW9uIGZvciBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24uJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtLTVNBTlJlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCByZWZhY3RvcnMgZm9saW8gc3BsaXR0aW5nIGxvZ2ljIGluIHRoZSBtZW1vcnkgbWFuYWdlbWVudCBzdWJzeXN0ZW0gKGBtbS9odWdlX21lbW9yeS5jYCksIHNwZWNpZmljYWxseSBzZXBhcmF0aW5nIHRoZSBoYW5kbGluZyBvZiBhbm9ueW1vdXMsIHN3YXBjYWNoZSwgYW5kIGZpbGUtYmFja2VkIGZvbGlvcy4gSXQgbW9kaWZpZXMgcmVmZXJlbmNlIGNvdW50aW5nLCBsb2NraW5nLCBhbmQgcGFnZSBjYWNoZS9zd2FwIGNhY2hlIHJlcGxhY2VtZW50IGxvZ2ljLiBUaGVzZSBjaGFuZ2VzIHByaW1hcmlseSByaXNrIGludHJvZHVjaW5nIHVzZS1hZnRlci1mcmVlLCBkb3VibGUtZnJlZSwgbG9ja2luZyBkZWFkbG9ja3MsIG9yIHJlZmVyZW5jZSBjb3VudCBpbWJhbGFuY2VzLiBTdWNoIGlzc3VlcyBhcmUgZWZmZWN0aXZlbHkgZGV0ZWN0ZWQgYnkgS0FTQU4sIExPQ0tERVAsIGFuZCBzdGFuZGFyZCBrZXJuZWwgZGVidWdnaW5nIGFzc2VydGlvbnMgKGUuZy4sIGBWTV9XQVJOX09OYCkuIFRoZSBwYXRjaCBkb2VzIG5vdCBpbnRyb2R1Y2UgbmV3IGFsbG9jYXRpb25zIG9mIGNvbXBsZXggZGF0YSBzdHJ1Y3R1cmVzLCBub3IgZG9lcyBpdCBtb2RpZnkgZGF0YSBzZW50IHRvIHVzZXIgc3BhY2Ugb3IgYWx0ZXIgYm91bmRzIGNoZWNraW5nIGluIGEgd2F5IHRoYXQgY291bGQgZXhwb3NlIHVuaW5pdGlhbGl6ZWQgbWVtb3J5LiBUaGVyZWZvcmUsIHRoZXJlIGlzIG5vIGp1c3RpZmljYXRpb24gZm9yIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbi4mIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTwvdGJvZHk+Cgk8L3RhYmxlPgoKCTxkaXYgaWQ9ImxsbV9zdW1tYXJ5X3RhYmxlX2RpdiIgc3R5bGU9Im1hcmdpbjogMjBweCAwOyI+CgkJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQkJPGNhcHRpb24+TExNIENhbGxzIFN1bW1hcnk6PC9jYXB0aW9uPgoJCQk8dGhlYWQ+CgkJCQk8dHI+CgkJCQkJPHRoPlRvdGFsIENhbGxzPC90aD4KCQkJCQk8dGg+VG90YWwgVG9rZW5zPC90aD4KCQkJCQk8dGg+QXZnIFRva2VuczwvdGg+CgkJCQkJPHRoPlRvdGFsIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQkJPHRoPkF2ZyBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJPC90cj4KCQkJPC90aGVhZD4KCQkJPHRib2R5IGlkPSJsbG1fc3VtbWFyeV9zdGF0c19ib2R5Ij48L3Rib2R5PgoJCTwvdGFibGU+Cgk8L2Rpdj4KCgk8ZGl2IGlkPSJ0b29sX3N1bW1hcnlfdGFibGVfZGl2IiBzdHlsZT0ibWFyZ2luOiAyMHB4IDA7Ij4KCQk8dGFibGUgY2xhc3M9Imxpc3RfdGFibGUiPgoJCQk8Y2FwdGlvbj5Ub29sIENhbGxzIFN1bW1hcnk6PC9jYXB0aW9uPgoJCQk8dGhlYWQ+CgkJCQk8dHI+CgkJCQkJPHRoPlRvdGFsIENhbGxzPC90aD4KCQkJCQk8dGg+VG90YWwgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCQk8dGg+QXZnIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQk8L3RyPgoJCQk8L3RoZWFkPgoJCQk8dGJvZHkgaWQ9InRvb2xfc3VtbWFyeV9zdGF0c19ib2R5Ij48L3Rib2R5PgoJCTwvdGFibGU+Cgk8L2Rpdj4KCgk8ZGl2IGlkPSJkdXJhdGlvbl9jaGFydF9kaXYiIHN0eWxlPSJ3aWR0aDogMTAwJTsgbWFyZ2luOiAyMHB4IDA7IGJvcmRlcjogMXB4OyI+PC9kaXY+Cgk8ZGl2IGlkPSJ0b2tlbl9jaGFydF9kaXYiIHN0eWxlPSJ3aWR0aDogMTAwJTsgbWFyZ2luOiAyMHB4IDA7IGJvcmRlcjogMXB4OyI+PC9kaXY+CgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS9qc2FwaSI+PC9zY3JpcHQ+Cgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CgkJZ29vZ2xlLmxvYWQoInZpc3VhbGl6YXRpb24iLCAiMSIsIHtwYWNrYWdlczpbImNvcmVjaGFydCJdfSk7CgkJZ29vZ2xlLnNldE9uTG9hZENhbGxiYWNrKGRyYXdDaGFydHMpOwoKCQlmdW5jdGlvbiBkcmF3Q2hhcnRzKCkgewoJCQljb25zdCByYXdEYXRhID0gW3siU3RhcnRlZCI6IjIwMjYtMDgtMDdUMjE6NTQ6MDYuMTkzMzc5MDUzWiIsIlNlcSI6MCwiTmVzdGluZyI6MCwiVHlwZSI6ImZsb3ciLCJOYW1lIjoicGF0Y2gtdHJpYWdlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTA3ODQzMDM2NDkxLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIlRSQU5TUEFSRU5UX0hVR0VQQUdFXCIsXG4gICAgXCJTV0FQXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwiX19zcGxpdF9odWdlX3BhZ2VfdG9fbGlzdF90b19vcmRlclwiLFxuICAgIFwiZm9saW9fc3BsaXRcIixcbiAgICBcImZvbGlvX3NwbGl0X3VubWFwcGVkXCIsXG4gICAgXCJfX3N3YXBfY2FjaGVfcmVwbGFjZV9mb2xpb1wiXG4gIF0sXG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggcmVmYWN0b3JzIGZvbGlvIHNwbGl0dGluZyBsb2dpYyBpbiB0aGUgbWVtb3J5IG1hbmFnZW1lbnQgc3Vic3lzdGVtIChgbW0vaHVnZV9tZW1vcnkuY2ApLCBzcGVjaWZpY2FsbHkgc2VwYXJhdGluZyB0aGUgaGFuZGxpbmcgb2YgYW5vbnltb3VzLCBzd2FwY2FjaGUsIGFuZCBmaWxlLWJhY2tlZCBmb2xpb3MuIEl0IG1vZGlmaWVzIHJlZmVyZW5jZSBjb3VudGluZywgbG9ja2luZywgYW5kIHBhZ2UgY2FjaGUvc3dhcCBjYWNoZSByZXBsYWNlbWVudCBsb2dpYy4gVGhlc2UgY2hhbmdlcyBwcmltYXJpbHkgcmlzayBpbnRyb2R1Y2luZyB1c2UtYWZ0ZXItZnJlZSwgZG91YmxlLWZyZWUsIGxvY2tpbmcgZGVhZGxvY2tzLCBvciByZWZlcmVuY2UgY291bnQgaW1iYWxhbmNlcy4gU3VjaCBpc3N1ZXMgYXJlIGVmZmVjdGl2ZWx5IGRldGVjdGVkIGJ5IEtBU0FOLCBMT0NLREVQLCBhbmQgc3RhbmRhcmQga2VybmVsIGRlYnVnZ2luZyBhc3NlcnRpb25zIChlLmcuLCBgVk1fV0FSTl9PTmApLiBUaGUgcGF0Y2ggZG9lcyBub3QgaW50cm9kdWNlIG5ldyBhbGxvY2F0aW9ucyBvZiBjb21wbGV4IGRhdGEgc3RydWN0dXJlcywgbm9yIGRvZXMgaXQgbW9kaWZ5IGRhdGEgc2VudCB0byB1c2VyIHNwYWNlIG9yIGFsdGVyIGJvdW5kcyBjaGVja2luZyBpbiBhIHdheSB0aGF0IGNvdWxkIGV4cG9zZSB1bmluaXRpYWxpemVkIG1lbW9yeS4gVGhlcmVmb3JlLCB0aGVyZSBpcyBubyBqdXN0aWZpY2F0aW9uIGZvciBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24uXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiBmYWxzZSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggcmV3b3JrcyB0aGUgbG9naWMgZm9yIHNwbGl0dGluZyB1bm1hcHBlZCBmb2xpb3MsIHNwZWNpZmljYWxseSBoYW5kbGluZyBzd2FwY2FjaGUgYW5kIGFub255bW91cyBmb2xpb3MuIEl0IGludHJvZHVjZXMgbmV3IHN0YXRpYyBmdW5jdGlvbnMgYF9fZm9saW9fZnJlZXplX3NwbGl0X3VubWFwYCBhbmQgYF9fZm9saW9fZnJlZXplX3NwbGl0X3VubWFwX2ZpbGVgIHRvIHJlcGxhY2UgYF9fZm9saW9fZnJlZXplX2FuZF9zcGxpdF91bm1hcHBlZGAuIEl0IGFsc28gbW9kaWZpZXMgYGZvbGlvX2NoZWNrX3NwbGl0dGFibGVgIGFuZCBgX19mb2xpb19zcGxpdGAgdG8gdXNlIHRoZSBuZXcgbG9naWMuIFRoZSBjaGFuZ2VzIGFmZmVjdCBjb3JlIG1lbW9yeSBtYW5hZ2VtZW50LCBzcGVjaWZpY2FsbHkgVEhQIGFuZCBmb2xpbyBzcGxpdHRpbmcsIHdoaWNoIGFyZSBoaWdobHkgY29tcGxleCBhbmQgcHJvbmUgdG8gcmFjZSBjb25kaXRpb25zLiBGdXp6aW5nIHRoZSBtYWluIGVudHJ5IHBvaW50cyBmb3IgZm9saW8gc3BsaXR0aW5nIGlzIGltcG9ydGFudCB0byBlbnN1cmUgdGhlIG5ldyBsb2dpYyBpcyByb2J1c3QuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA3VDIxOjU0OjA2LjE5MzM4NjEyM1oiLCJTZXEiOjEsIk5lc3RpbmciOjEsIlR5cGUiOiJhY3Rpb24iLCJOYW1lIjoicmVhZC1wYXRjaC1kaWZmIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTI1ODA4NjM2MiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiUGF0Y2hEaWZmXCI6IFwiY29tbWl0IGU1ZTI0NzhhNTZiOTUyYThhYzVmNjJkMmU2NWFmNTg4ZWMzNDI4NjhcXG5BdXRob3I6IHN5ei1jbHVzdGVyIFxcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVxcdTAwM2VcXG5EYXRlOiAgIEZyaSBBdWcgNyAyMTo1NDowNCAyMDI2ICswMDAwXFxuXFxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xcblxcbmRpZmYgLS1naXQgYS9tbS9odWdlX21lbW9yeS5jIGIvbW0vaHVnZV9tZW1vcnkuY1xcbmluZGV4IGNlZDQwMGY3MmQ0M2EuLjBkNzBlZTMwMTdjNDYgMTAwNjQ0XFxuLS0tIGEvbW0vaHVnZV9tZW1vcnkuY1xcbisrKyBiL21tL2h1Z2VfbWVtb3J5LmNcXG5AQCAtMzU4OSw5ICszNTg5LDYgQEAgc3RhdGljIHZvaWQgcmVtYXBfcGFnZShzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBsb25nIG5yLCBpbnQgZmxhZ3MpXFxuIHtcXG4gXFx0aW50IGkgPSAwO1xcbiBcXG4tXFx0LyogSWYgdW5tYXBfZm9saW8oKSB1c2VzIHRyeV90b19taWdyYXRlKCkgb24gZmlsZSwgcmVtb3ZlIHRoaXMgY2hlY2sgKi9cXG4tXFx0aWYgKCFmb2xpb190ZXN0X2Fub24oZm9saW8pKVxcbi1cXHRcXHRyZXR1cm47XFxuIFxcdGZvciAoOzspIHtcXG4gXFx0XFx0cmVtb3ZlX21pZ3JhdGlvbl9wdGVzKGZvbGlvLCBmb2xpbywgVFRVX1JNQVBfTE9DS0VEIHwgZmxhZ3MpO1xcbiBcXHRcXHRpICs9IGZvbGlvX25yX3BhZ2VzKGZvbGlvKTtcXG5AQCAtMzgwMCw2ICszNzk3LDcgQEAgc3RhdGljIGludCBfX3NwbGl0X3VubWFwcGVkX2ZvbGlvKHN0cnVjdCBmb2xpbyAqZm9saW8sIGludCBuZXdfb3JkZXIsXFxuIFxcdFxcdHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLCBlbnVtIHNwbGl0X3R5cGUgc3BsaXRfdHlwZSlcXG4ge1xcbiBcXHRjb25zdCBib29sIGlzX2Fub24gPSBmb2xpb190ZXN0X2Fub24oZm9saW8pO1xcbitcXHRjb25zdCBib29sIGlzX3N3YXBjYWNoZSA9IGZvbGlvX3Rlc3Rfc3dhcGNhY2hlKGZvbGlvKTtcXG4gXFx0aW50IG9sZF9vcmRlciA9IGZvbGlvX29yZGVyKGZvbGlvKTtcXG4gXFx0aW50IHN0YXJ0X29yZGVyID0gc3BsaXRfdHlwZSA9PSBTUExJVF9UWVBFX1VOSUZPUk0gPyBuZXdfb3JkZXIgOiBvbGRfb3JkZXIgLSAxO1xcbiBcXHRzdHJ1Y3QgZm9saW8gKm9sZF9mb2xpbyA9IGZvbGlvO1xcbkBAIC0zODE0LDggKzM4MTIsOCBAQCBzdGF0aWMgaW50IF9fc3BsaXRfdW5tYXBwZWRfZm9saW8oc3RydWN0IGZvbGlvICpmb2xpbywgaW50IG5ld19vcmRlcixcXG4gXFx0ICAgICBzcGxpdF9vcmRlci0tKSB7XFxuIFxcdFxcdGludCBucl9uZXdfZm9saW9zID0gMVVMIFxcdTAwM2NcXHUwMDNjIChvbGRfb3JkZXIgLSBzcGxpdF9vcmRlcik7XFxuIFxcbi1cXHRcXHQvKiBvcmRlci0xIGFub255bW91cyBmb2xpbyBpcyBub3Qgc3VwcG9ydGVkICovXFxuLVxcdFxcdGlmIChpc19hbm9uIFxcdTAwMjZcXHUwMDI2IHNwbGl0X29yZGVyID09IDEpXFxuK1xcdFxcdC8qIG9yZGVyLTEgYW5vbnltb3VzIG9yIHN3YXBjYWNoZSBmb2xpbyBpcyBub3Qgc3VwcG9ydGVkICovXFxuK1xcdFxcdGlmICgoaXNfYW5vbiB8fCBpc19zd2FwY2FjaGUpIFxcdTAwMjZcXHUwMDI2IHNwbGl0X29yZGVyID09IDEpXFxuIFxcdFxcdFxcdGNvbnRpbnVlO1xcbiBcXG4gXFx0XFx0aWYgKG1hcHBpbmcpIHtcXG5AQCAtMzg3OCwzMiArMzg3NiwyNiBAQCBzdGF0aWMgaW50IF9fc3BsaXRfdW5tYXBwZWRfZm9saW8oc3RydWN0IGZvbGlvICpmb2xpbywgaW50IG5ld19vcmRlcixcXG4gaW50IGZvbGlvX2NoZWNrX3NwbGl0dGFibGUoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlcixcXG4gXFx0XFx0XFx0ICAgZW51bSBzcGxpdF90eXBlIHNwbGl0X3R5cGUpXFxuIHtcXG4rXFx0Ym9vbCBpc19hbm9uID0gZm9saW9fdGVzdF9hbm9uKGZvbGlvKTtcXG4rXFx0Ym9vbCBpc19zd2FwY2FjaGUgPSBmb2xpb190ZXN0X3N3YXBjYWNoZShmb2xpbyk7XFxuK1xcbiBcXHRWTV9XQVJOX09OX0ZPTElPKCFmb2xpb190ZXN0X2xvY2tlZChmb2xpbyksIGZvbGlvKTtcXG4gXFx0LypcXG4gXFx0ICogRm9saW9zIHRoYXQganVzdCBnb3QgdHJ1bmNhdGVkIGNhbm5vdCBnZXQgc3BsaXQuIFNpZ25hbCB0byB0aGVcXG4tXFx0ICogY2FsbGVyIHRoYXQgdGhlcmUgd2FzIGEgcmFjZS5cXG4tXFx0ICpcXG4tXFx0ICogVE9ETzogdGhpcyB3aWxsIGFsc28gY3VycmVudGx5IHJlZnVzZSBmb2xpb3Mgd2l0aG91dCBhIG1hcHBpbmcgaW4gdGhlXFxuLVxcdCAqIHN3YXBjYWNoZSAoc2htZW0gb3IgdG8tYmUtYW5vbiBmb2xpb3MpLlxcbitcXHQgKiBjYWxsZXIgdGhhdCB0aGVyZSB3YXMgYSByYWNlLiBBIG1hcHBpbmdsZXNzIHN3YXAgY2FjaGUgZm9saW9cXG4rXFx0ICogaGFzIG5vIHBhZ2UgY2FjaGUgZW50cmllcyB0byB1cGRhdGUsIHNvIGl0IGlzIGZpbmUgdG8gc3BsaXQuXFxuIFxcdCAqL1xcbi1cXHRpZiAoIWZvbGlvLVxcdTAwM2VtYXBwaW5nIFxcdTAwMjZcXHUwMDI2ICFmb2xpb190ZXN0X2Fub24oZm9saW8pKVxcbitcXHRpZiAoIWZvbGlvLVxcdTAwM2VtYXBwaW5nIFxcdTAwMjZcXHUwMDI2ICFpc19zd2FwY2FjaGUpXFxuIFxcdFxcdHJldHVybiAtRUJVU1k7XFxuIFxcbi1cXHQvKiBvcmRlci0xIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIGFub255bW91cyBUSFAuICovXFxuLVxcdGlmIChmb2xpb190ZXN0X2Fub24oZm9saW8pIFxcdTAwMjZcXHUwMDI2IG5ld19vcmRlciA9PSAxKVxcbi1cXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG4tXFxuIFxcdC8qXFxuLVxcdCAqIHN3YXBjYWNoZSBmb2xpbyBjb3VsZCBvbmx5IGJlIHNwbGl0IHRvIG9yZGVyIDBcXG4tXFx0ICpcXG4tXFx0ICogbm9uLXVuaWZvcm0gc3BsaXQgY3JlYXRlcyBhZnRlci1zcGxpdCBmb2xpb3Mgd2l0aCBvcmRlcnMgZnJvbVxcbi1cXHQgKiBmb2xpb19vcmRlcihmb2xpbykgLSAxIHRvIG5ld19vcmRlciwgbWFraW5nIGl0IG5vdCBzdWl0YWJsZSBmb3IgYW55XFxuLVxcdCAqIHN3YXBjYWNoZSBmb2xpbyBzcGxpdC4gT25seSB1bmlmb3JtIHNwbGl0IHRvIG9yZGVyLTAgY2FuIGJlIHVzZWRcXG4tXFx0ICogaGVyZS5cXG4rXFx0ICogT3JkZXItMSBpcyB1bnN1cHBvcnRlZDogYW5vbiBmb2xpb3MgbmVlZCBzdWJwYWdlIDIgZm9yIHRoZVxcbitcXHQgKiBkZWZlcnJlZCBzcGxpdCBsaXN0LCBoeWJyaWQgc2htZW0gXFx1MDAyNiBzd2FwIGNhY2hlIGZvbGlvcyBhcmUgbm90XFxuK1xcdCAqIHNwbGl0dGFibGUsIGFuZCBhIHNwbGl0dGFibGUgbWFwcGluZ2xlc3Mgc3dhcCBjYWNoZSBmb2xpbyBjb3VsZFxcbitcXHQgKiBiZSBlaXRoZXIgYW5vbiBvciBzaG1lbSwgd2hpY2ggd2UgY2Fubm90IHRlbGwgYXBhcnQuXFxuIFxcdCAqL1xcbi1cXHRpZiAoKHNwbGl0X3R5cGUgPT0gU1BMSVRfVFlQRV9OT05fVU5JRk9STSB8fCBuZXdfb3JkZXIpIFxcdTAwMjZcXHUwMDI2IGZvbGlvX3Rlc3Rfc3dhcGNhY2hlKGZvbGlvKSkge1xcbitcXHRpZiAoKGlzX2Fub24gfHwgaXNfc3dhcGNhY2hlKSBcXHUwMDI2XFx1MDAyNiBuZXdfb3JkZXIgPT0gMSlcXG4gXFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuLVxcdH1cXG4gXFxuIFxcdGlmIChpc19odWdlX3plcm9fZm9saW8oZm9saW8pKVxcbiBcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG5AQCAtMzkxMSwzOSArMzkwMyw3OCBAQCBpbnQgZm9saW9fY2hlY2tfc3BsaXR0YWJsZShzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyLFxcbiBcXHRpZiAoZm9saW9fdGVzdF93cml0ZWJhY2soZm9saW8pKVxcbiBcXHRcXHRyZXR1cm4gLUVCVVNZO1xcbiBcXG4rXFx0LypcXG4rXFx0ICogQSBub24tYW5vbiBzd2FwY2FjaGUgZm9saW8gdGhhdCBzdGlsbCBoYXMgYSBtYXBwaW5nIHNob3VsZCBvbmx5XFxuK1xcdCAqIGJlIGEgc2htZW0gZm9saW8gdW5kZXIgSU8sIHRoZXJlIGlzIGxpdHRsZSBiZW5lZml0IGluIHNwbGl0dGluZ1xcbitcXHQgKiB0aGVtIGhlbmNlIG5vdCBzdXBwb3J0ZWQuIFJlamVjdCBpdCBoZXJlIHVwIGZyb250OiB0aGUgc3BsaXRcXG4rXFx0ICogcm91dGluZSBjYW5ub3QgYmFjayBvdXQgY2xlYW5seSBvbmNlIHRoZSBmb2xpbyByZWYgaXMgZnJvemVuLlxcbitcXHQgKi9cXG4rXFx0aWYgKCFpc19hbm9uIFxcdTAwMjZcXHUwMDI2IGlzX3N3YXBjYWNoZSBcXHUwMDI2XFx1MDAyNiBmb2xpby1cXHUwMDNlbWFwcGluZylcXG4rXFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuK1xcbiBcXHRyZXR1cm4gMDtcXG4gfVxcbiBcXG4tLyogTnVtYmVyIG9mIGZvbGlvIHJlZmVyZW5jZXMgZnJvbSB0aGUgcGFnZWNhY2hlIG9yIHRoZSBzd2FwY2FjaGUuICovXFxuLXN0YXRpYyB1bnNpZ25lZCBpbnQgZm9saW9fY2FjaGVfcmVmX2NvdW50KGNvbnN0IHN0cnVjdCBmb2xpbyAqZm9saW8pXFxuKy8qIE51bWJlciBvZiBmb2xpbyByZWZlcmVuY2VzIGZyb20gdGhlIHN3YXBjYWNoZS4gKi9cXG4rc3RhdGljIHVuc2lnbmVkIGludCBmb2xpb19zd2FwY2FjaGVfcmVmX2NvdW50KGNvbnN0IHN0cnVjdCBmb2xpbyAqZm9saW8pXFxuIHtcXG4tXFx0aWYgKGZvbGlvX3Rlc3RfYW5vbihmb2xpbykgXFx1MDAyNlxcdTAwMjYgIWZvbGlvX3Rlc3Rfc3dhcGNhY2hlKGZvbGlvKSlcXG4rXFx0aWYgKCFmb2xpb190ZXN0X3N3YXBjYWNoZShmb2xpbykpXFxuIFxcdFxcdHJldHVybiAwO1xcbiBcXHRyZXR1cm4gZm9saW9fbnJfcGFnZXMoZm9saW8pO1xcbiB9XFxuIFxcbi1zdGF0aWMgaW50IF9fZm9saW9fZnJlZXplX2FuZF9zcGxpdF91bm1hcHBlZChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyLFxcbi1cXHRcXHRcXHRcXHRcXHQgICAgIHN0cnVjdCBwYWdlICpzcGxpdF9hdCwgc3RydWN0IHhhX3N0YXRlICp4YXMsXFxuLVxcdFxcdFxcdFxcdFxcdCAgICAgc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsIGJvb2wgZG9fbHJ1LFxcbi1cXHRcXHRcXHRcXHRcXHQgICAgIHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QsIGVudW0gc3BsaXRfdHlwZSBzcGxpdF90eXBlLFxcbi1cXHRcXHRcXHRcXHRcXHQgICAgIHBnb2ZmX3QgZW5kLCBpbnQgKm5yX3NobWVtX2Ryb3BwZWQpXFxuK3N0YXRpYyBpbnQgX19mb2xpb19mcmVlemVfc3BsaXRfdW5tYXAoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlcixcXG4rXFx0XFx0XFx0XFx0ICAgICAgc3RydWN0IHBhZ2UgKnNwbGl0X2F0LCBib29sIGRvX2xydSwgYm9vbCBhbm9uX3VubWFwLFxcbitcXHRcXHRcXHRcXHQgICAgICBzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LCBlbnVtIHNwbGl0X3R5cGUgc3BsaXRfdHlwZSlcXG4ge1xcbiBcXHRzdHJ1Y3QgZm9saW8gKmVuZF9mb2xpbyA9IGZvbGlvX25leHQoZm9saW8pO1xcbi1cXHRzdHJ1Y3QgZm9saW8gKm5ld19mb2xpbywgKm5leHQ7XFxuK1xcdGJvb2wgaXNfYW5vbiA9IGZvbGlvX3Rlc3RfYW5vbihmb2xpbyk7XFxuK1xcdHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2kgPSBOVUxMO1xcbitcXHRzdHJ1Y3QgZm9saW8gKm5ld19mb2xpbztcXG4gXFx0aW50IG9sZF9vcmRlciA9IGZvbGlvX29yZGVyKGZvbGlvKTtcXG4rXFx0c3RydWN0IGFub25fdm1hICphbm9uX3ZtYSA9IE5VTEw7XFxuK1xcdGVudW0gdHR1X2ZsYWdzIHR0dV9mbGFncyA9IDA7XFxuIFxcdHN0cnVjdCBsaXN0X2xydV9vbmUgKmxydTtcXG4rXFx0c3RydWN0IGxydXZlYyAqbHJ1dmVjO1xcbiBcXHRib29sIGRlcXVldWVfZGVmZXJyZWQ7XFxuIFxcdGludCByZXQgPSAwO1xcbiBcXG4tXFx0Vk1fV0FSTl9PTl9PTkNFKCFtYXBwaW5nIFxcdTAwMjZcXHUwMDI2IGVuZCk7XFxuK1xcdC8qXFxuK1xcdCAqIFVubWFwL3JlbWFwIG5lZWRzIHRoZSBhbm9uX3ZtYS4gVGhlIGNhbGxlciBkb2VzIG5vdCBuZWNlc3NhcmlseVxcbitcXHQgKiBob2xkIGFuIG1tYXBfbG9jayB0aGF0IHdvdWxkIHByZXZlbnQgdGhlIGFub25fdm1hIGZyb21cXG4rXFx0ICogZGlzYXBwZWFyaW5nLCBzbyB3ZSBmaXJzdCB0YWtlIGEgcmVmZXJlbmNlIGFuZCBsb2NrIGl0LiBUaGlzIGlzXFxuK1xcdCAqIHNpbWlsYXIgdG8gZm9saW9fbG9ja19hbm9uX3ZtYV9yZWFkKCkgZXhjZXB0IHRoZSB3cml0ZSBsb2NrIGlzXFxuK1xcdCAqIHRha2VuIHRvIHNlcmlhbGl6ZSBhZ2FpbnN0IHBhcmFsbGVsIHNwbGl0IG9yIGNvbGxhcHNlLlxcbitcXHQgKi9cXG4rXFx0aWYgKGFub25fdW5tYXApIHtcXG4rXFx0XFx0YW5vbl92bWEgPSBmb2xpb19nZXRfYW5vbl92bWEoZm9saW8pO1xcbitcXHRcXHRpZiAoIWFub25fdm1hKVxcbitcXHRcXHRcXHRyZXR1cm4gLUVCVVNZO1xcbitcXHRcXHRhbm9uX3ZtYV9sb2NrX3dyaXRlKGFub25fdm1hKTtcXG4rXFx0fVxcbitcXG4rXFx0LyogUmFjeSBjaGVjayBpZiB3ZSBjYW4gc3BsaXQgdGhlIHBhZ2UsIGJlZm9yZSB0aGUgb3B0aW9uYWwgdW5tYXAuICovXFxuK1xcdGlmIChmb2xpb19leHBlY3RlZF9yZWZfY291bnQoZm9saW8pICE9IGZvbGlvX3JlZl9jb3VudChmb2xpbykgLSAxKSB7XFxuK1xcdFxcdHJldCA9IC1FQUdBSU47XFxuK1xcdFxcdGdvdG8gb3V0X3VubG9jaztcXG4rXFx0fVxcbitcXG4rXFx0aWYgKGFub25fdW5tYXApXFxuK1xcdFxcdHVubWFwX2ZvbGlvKGZvbGlvKTtcXG4rXFxuK1xcdGxvY2FsX2lycV9kaXNhYmxlKCk7XFxuK1xcbiBcXHQvKlxcbiBcXHQgKiBJZiB0aGlzIGZvbGlvIGNhbiBiZSBvbiB0aGUgZGVmZXJyZWQgc3BsaXQgcXVldWUsIGxvY2sgb3V0XFxuIFxcdCAqIHRoZSBzaHJpbmtlciBiZWZvcmUgZnJlZXppbmcgdGhlIHJlZi4gSWYgdGhlIHNocmlua2VyIHNlZXNcXG4gXFx0ICogYSAwLXJlZiBmb2xpbywgaXQgYXNzdW1lcyBpdCBiZWF0IGZvbGlvX3B1dCgpIHRvIHRoZSBsaXN0XFxuIFxcdCAqIGxvY2sgYW5kIG11c3QgY2xlYW4gdXAgdGhlIExSVSBzdGF0ZSAtIHRoZSBzYW1lIGRlcXVldWUgd2VcXG4gXFx0ICogd2lsbCBkbyBiZWxvdyBhcyBwYXJ0IG9mIHRoZSBzcGxpdC5cXG4rXFx0ICpcXG4rXFx0ICogT25seSBhbm9uIGZvbGlvcyBhcmUgZXZlciBxdWV1ZWQgb24gdGhlIGRlZmVycmVkIHNwbGl0IGxpc3QsXFxuK1xcdCAqIHNvIG5vbi1hbm9uIGZvbGlvcyAobWFwcGluZ2xlc3Mgc3dhcGNhY2hlKSBuZXZlciBuZWVkIGRlcXVldWluZy5cXG4gXFx0ICovXFxuLVxcdGRlcXVldWVfZGVmZXJyZWQgPSBmb2xpb190ZXN0X2Fub24oZm9saW8pIFxcdTAwMjZcXHUwMDI2IG9sZF9vcmRlciBcXHUwMDNlIDE7XFxuK1xcdGRlcXVldWVfZGVmZXJyZWQgPSBvbGRfb3JkZXIgXFx1MDAzZSAxIFxcdTAwMjZcXHUwMDI2IGlzX2Fub247XFxuIFxcdGlmIChkZXF1ZXVlX2RlZmVycmVkKSB7XFxuIFxcdFxcdHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZztcXG4gXFxuQEAgLTM5NTIsMTI4ICszOTgzLDI0MyBAQCBzdGF0aWMgaW50IF9fZm9saW9fZnJlZXplX2FuZF9zcGxpdF91bm1hcHBlZChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgblxcbiBcXHRcXHRscnUgPSBsaXN0X2xydV9sb2NrKFxcdTAwMjZkZWZlcnJlZF9zcGxpdF9scnUsXFxuIFxcdFxcdFxcdFxcdCAgICBmb2xpb19uaWQoZm9saW8pLCBcXHUwMDI2bWVtY2cpO1xcbiBcXHR9XFxuLVxcdGlmIChmb2xpb19yZWZfZnJlZXplKGZvbGlvLCBmb2xpb19jYWNoZV9yZWZfY291bnQoZm9saW8pICsgMSkpIHtcXG4tXFx0XFx0c3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSA9IE5VTEw7XFxuLVxcdFxcdHN0cnVjdCBscnV2ZWMgKmxydXZlYztcXG4gXFxuK1xcdGlmICghZm9saW9fcmVmX2ZyZWV6ZShmb2xpbywgZm9saW9fc3dhcGNhY2hlX3JlZl9jb3VudChmb2xpbykgKyAxKSkge1xcbiBcXHRcXHRpZiAoZGVxdWV1ZV9kZWZlcnJlZCkge1xcbi1cXHRcXHRcXHRfX2xpc3RfbHJ1X2RlbChcXHUwMDI2ZGVmZXJyZWRfc3BsaXRfbHJ1LCBscnUsXFxuLVxcdFxcdFxcdFxcdCAgICAgICBcXHUwMDI2Zm9saW8tXFx1MDAzZV9kZWZlcnJlZF9saXN0LCBmb2xpb19uaWQoZm9saW8pKTtcXG4tXFx0XFx0XFx0aWYgKGZvbGlvX3Rlc3RfcGFydGlhbGx5X21hcHBlZChmb2xpbykpIHtcXG4tXFx0XFx0XFx0XFx0Zm9saW9fY2xlYXJfcGFydGlhbGx5X21hcHBlZChmb2xpbyk7XFxuLVxcdFxcdFxcdFxcdG1vZF9tdGhwX3N0YXQob2xkX29yZGVyLFxcbi1cXHRcXHRcXHRcXHRcXHRNVEhQX1NUQVRfTlJfQU5PTl9QQVJUSUFMTFlfTUFQUEVELCAtMSk7XFxuLVxcdFxcdFxcdH1cXG4gXFx0XFx0XFx0bGlzdF9scnVfdW5sb2NrKGxydSk7XFxuIFxcdFxcdFxcdHJjdV9yZWFkX3VubG9jaygpO1xcbiBcXHRcXHR9XFxuK1xcdFxcdHJldCA9IC1FQUdBSU47XFxuK1xcdFxcdGdvdG8gb3V0X25vX3NwbGl0O1xcbitcXHR9XFxuIFxcbi1cXHRcXHRpZiAobWFwcGluZykge1xcbi1cXHRcXHRcXHRpbnQgbnIgPSBmb2xpb19ucl9wYWdlcyhmb2xpbyk7XFxuLVxcbi1cXHRcXHRcXHRpZiAoZm9saW9fdGVzdF9wbWRfbWFwcGFibGUoZm9saW8pIFxcdTAwMjZcXHUwMDI2XFxuLVxcdFxcdFxcdCAgICBuZXdfb3JkZXIgXFx1MDAzYyBIUEFHRV9QTURfT1JERVIpIHtcXG4tXFx0XFx0XFx0XFx0aWYgKGZvbGlvX3Rlc3Rfc3dhcGJhY2tlZChmb2xpbykpIHtcXG4tXFx0XFx0XFx0XFx0XFx0bHJ1dmVjX3N0YXRfbW9kX2ZvbGlvKGZvbGlvLFxcbi1cXHRcXHRcXHRcXHRcXHRcXHRcXHROUl9TSE1FTV9USFBTLCAtbnIpO1xcbi1cXHRcXHRcXHRcXHR9IGVsc2Uge1xcbi1cXHRcXHRcXHRcXHRcXHRscnV2ZWNfc3RhdF9tb2RfZm9saW8oZm9saW8sXFxuLVxcdFxcdFxcdFxcdFxcdFxcdFxcdE5SX0ZJTEVfVEhQUywgLW5yKTtcXG4tXFx0XFx0XFx0XFx0fVxcbi1cXHRcXHRcXHR9XFxuK1xcdGlmIChkZXF1ZXVlX2RlZmVycmVkKSB7XFxuK1xcdFxcdF9fbGlzdF9scnVfZGVsKFxcdTAwMjZkZWZlcnJlZF9zcGxpdF9scnUsIGxydSxcXG4rXFx0XFx0XFx0ICAgICAgIFxcdTAwMjZmb2xpby1cXHUwMDNlX2RlZmVycmVkX2xpc3QsIGZvbGlvX25pZChmb2xpbykpO1xcbitcXHRcXHRpZiAoZm9saW9fdGVzdF9wYXJ0aWFsbHlfbWFwcGVkKGZvbGlvKSkge1xcbitcXHRcXHRcXHRmb2xpb19jbGVhcl9wYXJ0aWFsbHlfbWFwcGVkKGZvbGlvKTtcXG4rXFx0XFx0XFx0bW9kX210aHBfc3RhdChvbGRfb3JkZXIsXFxuK1xcdFxcdFxcdFxcdCAgICAgIE1USFBfU1RBVF9OUl9BTk9OX1BBUlRJQUxMWV9NQVBQRUQsIC0xKTtcXG4gXFx0XFx0fVxcbitcXHRcXHRsaXN0X2xydV91bmxvY2sobHJ1KTtcXG4rXFx0XFx0cmN1X3JlYWRfdW5sb2NrKCk7XFxuK1xcdH1cXG4gXFxuLVxcdFxcdGlmIChmb2xpb190ZXN0X3N3YXBjYWNoZShmb2xpbykpIHtcXG4tXFx0XFx0XFx0aWYgKG1hcHBpbmcpIHtcXG4tXFx0XFx0XFx0XFx0Vk1fV0FSTl9PTl9PTkNFX0ZPTElPKG1hcHBpbmcsIGZvbGlvKTtcXG4tXFx0XFx0XFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuLVxcdFxcdFxcdH1cXG4rXFx0aWYgKGZvbGlvX3Rlc3Rfc3dhcGNhY2hlKGZvbGlvKSlcXG4rXFx0XFx0Y2kgPSBzd2FwX2NsdXN0ZXJfZ2V0X2FuZF9sb2NrKGZvbGlvKTtcXG4gXFxuLVxcdFxcdFxcdGNpID0gc3dhcF9jbHVzdGVyX2dldF9hbmRfbG9jayhmb2xpbyk7XFxuLVxcdFxcdH1cXG4rXFx0aWYgKGRvX2xydSlcXG4rXFx0XFx0bHJ1dmVjID0gZm9saW9fbHJ1dmVjX2xvY2soZm9saW8pO1xcbitcXG4rXFx0cmV0ID0gX19zcGxpdF91bm1hcHBlZF9mb2xpbyhmb2xpbywgbmV3X29yZGVyLCBzcGxpdF9hdCwgTlVMTCxcXG4rXFx0XFx0XFx0XFx0ICAgICBOVUxMLCBzcGxpdF90eXBlKTtcXG4gXFxuLVxcdFxcdC8qIGxvY2sgbHJ1IGxpc3QvUGFnZUNvbXBvdW5kLCByZWYgZnJvemVuIGJ5IHBhZ2VfcmVmX2ZyZWV6ZSAqL1xcbitcXHQvKlxcbitcXHQgKiBVbmZyZWV6ZSB0aGUgYWZ0ZXItc3BsaXQgZm9saW9zIGFuZCBwdXQgdGhlbSBiYWNrIHRvIHRoZSByaWdodFxcbitcXHQgKiBwbGFjZSwga2VlcGluZyB0aGUgaGVhZCBAZm9saW8gZnJvemVuIHVudGlsIHRoZSBlbmQuIFdoaWxlIHRoZVxcbitcXHQgKiBmb2xpbyBpcyBpbiB0aGUgc3dhcCBjYWNoZSwgdGhlIHN1YiBlbnRyaWVzIG11c3QgYmUgdXBkYXRlZCB3aXRoXFxuK1xcdCAqIHRoZWlyIGFmdGVyLXNwbGl0IGZvbGlvcyBiZWZvcmUgdGhlIGhlYWQgaXMgdW5mcm96ZW4sIHNvIGFcXG4rXFx0ICogY29uY3VycmVudCBzd2FwX2NhY2hlX2dldF9mb2xpbygpIGNhbm5vdCByZXR1cm4gdGhlIGhlYWQgZm9saW9cXG4rXFx0ICogZm9yIGEgc3ViIGVudHJ5LiBLZWVwaW5nIHRoZSBoZWFkIGZyb3plbiB0aHJvdWdob3V0IGFsc28gc3RvcHMgYVxcbitcXHQgKiBwYXJhbGxlbCBmb2xpb190cnlfZ2V0KCkgZnJvbSBvYnNlcnZpbmcgYSBwYXJ0aWFsbHkgc3BsaXQgZm9saW8uXFxuK1xcdCAqL1xcbitcXHRmb3IgKG5ld19mb2xpbyA9IGZvbGlvX25leHQoZm9saW8pOyBuZXdfZm9saW8gIT0gZW5kX2ZvbGlvO1xcbitcXHQgICAgIG5ld19mb2xpbyA9IGZvbGlvX25leHQobmV3X2ZvbGlvKSkge1xcbitcXHRcXHR6b25lX2RldmljZV9wcml2YXRlX3NwbGl0X2NiKGZvbGlvLCBuZXdfZm9saW8pO1xcbitcXHRcXHRmb2xpb19yZWZfdW5mcmVlemUobmV3X2ZvbGlvLFxcbitcXHRcXHRcXHRcXHQgICBmb2xpb19zd2FwY2FjaGVfcmVmX2NvdW50KG5ld19mb2xpbykgKyAxKTtcXG4gXFx0XFx0aWYgKGRvX2xydSlcXG4tXFx0XFx0XFx0bHJ1dmVjID0gZm9saW9fbHJ1dmVjX2xvY2soZm9saW8pO1xcbitcXHRcXHRcXHRscnVfYWRkX3NwbGl0X2ZvbGlvKGZvbGlvLCBuZXdfZm9saW8sIGxydXZlYywgbGlzdCk7XFxuK1xcdFxcdGlmIChjaSlcXG4rXFx0XFx0XFx0X19zd2FwX2NhY2hlX3JlcGxhY2VfZm9saW8oY2ksIGZvbGlvLCBuZXdfZm9saW8pO1xcbitcXHR9XFxuIFxcbi1cXHRcXHRyZXQgPSBfX3NwbGl0X3VubWFwcGVkX2ZvbGlvKGZvbGlvLCBuZXdfb3JkZXIsIHNwbGl0X2F0LCB4YXMsXFxuLVxcdFxcdFxcdFxcdFxcdCAgICAgbWFwcGluZywgc3BsaXRfdHlwZSk7XFxuK1xcdHpvbmVfZGV2aWNlX3ByaXZhdGVfc3BsaXRfY2IoZm9saW8sIE5VTEwpO1xcbitcXHRmb2xpb19yZWZfdW5mcmVlemUoZm9saW8sIGZvbGlvX3N3YXBjYWNoZV9yZWZfY291bnQoZm9saW8pICsgMSk7XFxuIFxcbi1cXHRcXHQvKlxcbi1cXHRcXHQgKiBVbmZyZWV6ZSBhZnRlci1zcGxpdCBmb2xpb3MgYW5kIHB1dCB0aGVtIGJhY2sgdG8gdGhlIHJpZ2h0XFxuLVxcdFxcdCAqIGxpc3QuIEBmb2xpbyBzaG91bGQgYmUga2VwdCBmcm96b24gdW50aWwgcGFnZSBjYWNoZVxcbi1cXHRcXHQgKiBlbnRyaWVzIGFyZSB1cGRhdGVkIHdpdGggYWxsIHRoZSBvdGhlciBhZnRlci1zcGxpdCBmb2xpb3NcXG4tXFx0XFx0ICogdG8gcHJldmVudCBvdGhlcnMgc2VlaW5nIHN0YWxlIHBhZ2UgY2FjaGUgZW50cmllcy5cXG4tXFx0XFx0ICogQXMgYSByZXN1bHQsIG5ld19mb2xpbyBzdGFydHMgZnJvbSB0aGUgbmV4dCBmb2xpbyBvZlxcbi1cXHRcXHQgKiBAZm9saW8uXFxuLVxcdFxcdCAqL1xcbi1cXHRcXHRmb3IgKG5ld19mb2xpbyA9IGZvbGlvX25leHQoZm9saW8pOyBuZXdfZm9saW8gIT0gZW5kX2ZvbGlvO1xcbi1cXHRcXHQgICAgIG5ld19mb2xpbyA9IG5leHQpIHtcXG4tXFx0XFx0XFx0dW5zaWduZWQgbG9uZyBucl9wYWdlcyA9IGZvbGlvX25yX3BhZ2VzKG5ld19mb2xpbyk7XFxuK1xcdGlmIChkb19scnUpXFxuK1xcdFxcdGxydXZlY191bmxvY2sobHJ1dmVjKTtcXG4rXFx0aWYgKGNpKVxcbitcXHRcXHRzd2FwX2NsdXN0ZXJfdW5sb2NrKGNpKTtcXG4rb3V0X25vX3NwbGl0OlxcbitcXHRsb2NhbF9pcnFfZW5hYmxlKCk7XFxuK1xcdGlmIChhbm9uX3VubWFwKSB7XFxuK1xcdFxcdGlmICghcmV0IFxcdTAwMjZcXHUwMDI2ICFmb2xpb19pc19kZXZpY2VfcHJpdmF0ZShmb2xpbykpXFxuK1xcdFxcdFxcdHR0dV9mbGFncyA9IFRUVV9VU0VfU0hBUkVEX1pFUk9QQUdFO1xcbitcXHRcXHRyZW1hcF9wYWdlKGZvbGlvLCAxIFxcdTAwM2NcXHUwMDNjIG9sZF9vcmRlciwgdHR1X2ZsYWdzKTtcXG4rXFx0fVxcbitvdXRfdW5sb2NrOlxcbitcXHRpZiAoYW5vbl91bm1hcCkge1xcbitcXHRcXHRhbm9uX3ZtYV91bmxvY2tfd3JpdGUoYW5vbl92bWEpO1xcbitcXHRcXHRwdXRfYW5vbl92bWEoYW5vbl92bWEpO1xcbitcXHR9XFxuIFxcbi1cXHRcXHRcXHRuZXh0ID0gZm9saW9fbmV4dChuZXdfZm9saW8pO1xcbitcXHRyZXR1cm4gcmV0O1xcbit9XFxuIFxcbi1cXHRcXHRcXHR6b25lX2RldmljZV9wcml2YXRlX3NwbGl0X2NiKGZvbGlvLCBuZXdfZm9saW8pO1xcbitzdGF0aWMgaW50IF9fZm9saW9fZnJlZXplX3NwbGl0X3VubWFwX2ZpbGUoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlcixcXG4rXFx0XFx0XFx0XFx0XFx0ICAgc3RydWN0IHBhZ2UgKnNwbGl0X2F0LCBib29sIGRvX2xydSxcXG4rXFx0XFx0XFx0XFx0XFx0ICAgc3RydWN0IGxpc3RfaGVhZCAqbGlzdCwgZW51bSBzcGxpdF90eXBlIHNwbGl0X3R5cGUpXFxuK3tcXG4rXFx0c3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSBmb2xpby1cXHUwMDNlbWFwcGluZztcXG4rXFx0WEFfU1RBVEUoeGFzLCBcXHUwMDI2bWFwcGluZy1cXHUwMDNlaV9wYWdlcywgZm9saW8tXFx1MDAzZWluZGV4KTtcXG4rXFx0c3RydWN0IGZvbGlvICplbmRfZm9saW8gPSBmb2xpb19uZXh0KGZvbGlvKTtcXG4rXFx0bG9uZyBvbGRfbnJfcGFnZXMgPSBmb2xpb19ucl9wYWdlcyhmb2xpbyk7XFxuK1xcdHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZywgKm9sZF9tZW1jZztcXG4rXFx0c3RydWN0IGZvbGlvICpuZXdfZm9saW8sICpuZXh0O1xcbitcXHRpbnQgbnJfc2htZW1fZHJvcHBlZCA9IDA7XFxuK1xcdHVuc2lnbmVkIGludCBtaW5fb3JkZXI7XFxuK1xcdHN0cnVjdCBscnV2ZWMgKmxydXZlYztcXG4rXFx0cGdvZmZfdCBlbmQgPSAwO1xcbitcXHRnZnBfdCBnZnA7XFxuK1xcdGludCByZXQgPSAwO1xcbiBcXG4tXFx0XFx0XFx0Zm9saW9fcmVmX3VuZnJlZXplKG5ld19mb2xpbyxcXG4tXFx0XFx0XFx0XFx0XFx0ICAgZm9saW9fY2FjaGVfcmVmX2NvdW50KG5ld19mb2xpbykgKyAxKTtcXG4rXFx0bWluX29yZGVyID0gbWFwcGluZ19taW5fZm9saW9fb3JkZXIobWFwcGluZyk7XFxuK1xcdGlmIChuZXdfb3JkZXIgXFx1MDAzYyBtaW5fb3JkZXIpXFxuK1xcdFxcdHJldHVybiAtRUlOVkFMO1xcbiBcXG4tXFx0XFx0XFx0aWYgKGRvX2xydSlcXG4tXFx0XFx0XFx0XFx0bHJ1X2FkZF9zcGxpdF9mb2xpbyhmb2xpbywgbmV3X2ZvbGlvLCBscnV2ZWMsIGxpc3QpO1xcbitcXHQvKlxcbitcXHQgKiBTd2l0Y2ggdG8gZm9saW8ncyBtZW1jZyBhcyB4YXJyYXkgbm9kZSBhbGxvY2F0aW9uIGNhbiBoYXBwZW4gYW5kXFxuK1xcdCAqIG5lZWRzIHRvIGNoYXJnZSB0byBpdC5cXG4rXFx0ICovXFxuK1xcdG1lbWNnID0gZ2V0X21lbV9jZ3JvdXBfZnJvbV9mb2xpbyhmb2xpbyk7XFxuK1xcdG9sZF9tZW1jZyA9IHNldF9hY3RpdmVfbWVtY2cobWVtY2cpO1xcbiBcXG4tXFx0XFx0XFx0LypcXG4tXFx0XFx0XFx0ICogQW5vbnltb3VzIGZvbGlvIHdpdGggc3dhcCBjYWNoZS5cXG4tXFx0XFx0XFx0ICogTk9URTogc2htZW0gaW4gc3dhcCBjYWNoZSBpcyBub3Qgc3VwcG9ydGVkIHlldC5cXG4tXFx0XFx0XFx0ICovXFxuLVxcdFxcdFxcdGlmIChjaSkge1xcbi1cXHRcXHRcXHRcXHRfX3N3YXBfY2FjaGVfcmVwbGFjZV9mb2xpbyhjaSwgZm9saW8sIG5ld19mb2xpbyk7XFxuLVxcdFxcdFxcdFxcdGNvbnRpbnVlO1xcbi1cXHRcXHRcXHR9XFxuK1xcdGdmcCA9IGN1cnJlbnRfZ2ZwX2NvbnRleHQobWFwcGluZ19nZnBfbWFzayhtYXBwaW5nKSBcXHUwMDI2IEdGUF9SRUNMQUlNX01BU0spO1xcbitcXHRpZiAoIWZpbGVtYXBfcmVsZWFzZV9mb2xpbyhmb2xpbywgZ2ZwKSkge1xcbitcXHRcXHRyZXQgPSAtRUJVU1k7XFxuK1xcdFxcdGdvdG8gZmFpbF9mcmVlO1xcbitcXHR9XFxuIFxcbi1cXHRcXHRcXHQvKiBBbm9ueW1vdXMgZm9saW8gd2l0aG91dCBzd2FwIGNhY2hlICovXFxuLVxcdFxcdFxcdGlmICghbWFwcGluZylcXG4tXFx0XFx0XFx0XFx0Y29udGludWU7XFxuK1xcdG1hcHBpbmdfc2V0X3VwZGF0ZShcXHUwMDI2eGFzLCBtYXBwaW5nKTtcXG4gXFxuLVxcdFxcdFxcdC8qIEFkZCB0aGUgbmV3IGZvbGlvIHRvIHRoZSBwYWdlIGNhY2hlLiAqL1xcbi1cXHRcXHRcXHRpZiAobmV3X2ZvbGlvLVxcdTAwM2VpbmRleCBcXHUwMDNjIGVuZCkge1xcbi1cXHRcXHRcXHRcXHRfX3hhX3N0b3JlKFxcdTAwMjZtYXBwaW5nLVxcdTAwM2VpX3BhZ2VzLCBuZXdfZm9saW8tXFx1MDAzZWluZGV4LFxcbi1cXHRcXHRcXHRcXHRcXHQgICBuZXdfZm9saW8sIDApO1xcbi1cXHRcXHRcXHRcXHRjb250aW51ZTtcXG4tXFx0XFx0XFx0fVxcbitcXHRpZiAoc3BsaXRfdHlwZSA9PSBTUExJVF9UWVBFX1VOSUZPUk0pIHtcXG4rXFx0XFx0aW50IG9sZF9vcmRlciA9IGZvbGlvX29yZGVyKGZvbGlvKTtcXG4gXFxuLVxcdFxcdFxcdFZNX1dBUk5fT05fT05DRSghbnJfc2htZW1fZHJvcHBlZCk7XFxuLVxcdFxcdFxcdC8qIERyb3AgZm9saW8gYmV5b25kIEVPRjogLVxcdTAwM2VpbmRleCBcXHUwMDNlPSBlbmQgKi9cXG4tXFx0XFx0XFx0aWYgKHNobWVtX21hcHBpbmcobWFwcGluZykgXFx1MDAyNlxcdTAwMjYgbnJfc2htZW1fZHJvcHBlZClcXG4tXFx0XFx0XFx0XFx0Km5yX3NobWVtX2Ryb3BwZWQgKz0gbnJfcGFnZXM7XFxuLVxcdFxcdFxcdGVsc2UgaWYgKGZvbGlvX3Rlc3RfY2xlYXJfZGlydHkobmV3X2ZvbGlvKSlcXG4tXFx0XFx0XFx0XFx0Zm9saW9fYWNjb3VudF9jbGVhbmVkKFxcbi1cXHRcXHRcXHRcXHRcXHRuZXdfZm9saW8sIGlub2RlX3RvX3diKG1hcHBpbmctXFx1MDAzZWhvc3QpKTtcXG4tXFx0XFx0XFx0X19maWxlbWFwX3JlbW92ZV9mb2xpbyhuZXdfZm9saW8sIE5VTEwpO1xcbi1cXHRcXHRcXHRmb2xpb19wdXRfcmVmcyhuZXdfZm9saW8sIG5yX3BhZ2VzKTtcXG4rXFx0XFx0eGFzX3NldF9vcmRlcihcXHUwMDI2eGFzLCBmb2xpby1cXHUwMDNlaW5kZXgsIG5ld19vcmRlcik7XFxuK1xcdFxcdHhhc19zcGxpdF9hbGxvYyhcXHUwMDI2eGFzLCBmb2xpbywgb2xkX29yZGVyLCBnZnApO1xcbitcXHRcXHRpZiAoeGFzX2Vycm9yKFxcdTAwMjZ4YXMpKSB7XFxuK1xcdFxcdFxcdHJldCA9IHhhc19lcnJvcihcXHUwMDI2eGFzKTtcXG4rXFx0XFx0XFx0Z290byBmYWlsX2ZyZWU7XFxuIFxcdFxcdH1cXG4rXFx0fVxcbiBcXG4tXFx0XFx0em9uZV9kZXZpY2VfcHJpdmF0ZV9zcGxpdF9jYihmb2xpbywgTlVMTCk7XFxuLVxcdFxcdC8qXFxuLVxcdFxcdCAqIFVuZnJlZXplIEBmb2xpbyBvbmx5IGFmdGVyIGFsbCBwYWdlIGNhY2hlIGVudHJpZXMsIHdoaWNoXFxuLVxcdFxcdCAqIHVzZWQgdG8gcG9pbnQgdG8gaXQsIGhhdmUgYmVlbiB1cGRhdGVkIHdpdGggbmV3IGZvbGlvcy5cXG4tXFx0XFx0ICogT3RoZXJ3aXNlLCBhIHBhcmFsbGVsIGZvbGlvX3RyeV9nZXQoKSBjYW4gZ3JhYiBAZm9saW9cXG4tXFx0XFx0ICogYW5kIGl0cyBjYWxsZXIgY2FuIHNlZSBzdGFsZSBwYWdlIGNhY2hlIGVudHJpZXMuXFxuLVxcdFxcdCAqL1xcbi1cXHRcXHRmb2xpb19yZWZfdW5mcmVlemUoZm9saW8sIGZvbGlvX2NhY2hlX3JlZl9jb3VudChmb2xpbykgKyAxKTtcXG4rXFx0aV9tbWFwX2xvY2tfcmVhZChtYXBwaW5nKTtcXG4rXFxuK1xcdC8qIFJhY3kgY2hlY2sgaWYgd2UgY2FuIHNwbGl0IHRoZSBwYWdlLCBiZWZvcmUgdW5tYXBfZm9saW8oKSAqL1xcbitcXHRpZiAoZm9saW9fZXhwZWN0ZWRfcmVmX2NvdW50KGZvbGlvKSAhPSBmb2xpb19yZWZfY291bnQoZm9saW8pIC0gMSkge1xcbitcXHRcXHRyZXQgPSAtRUFHQUlOO1xcbitcXHRcXHRnb3RvIGZhaWxfbW1hcF91bmxvY2s7XFxuK1xcdH1cXG4rXFxuK1xcdC8qXFxuK1xcdCAqX19zcGxpdF91bm1hcHBlZF9mb2xpbygpIG1heSBuZWVkIHRvIHRyaW0gb2ZmIHBhZ2VzIGJleW9uZFxcbitcXHQgKiBFT0Y6IGJ1dCBvbiAzMi1iaXQsIGlfc2l6ZV9yZWFkKCkgdGFrZXMgYW4gaXJxLXVuc2FmZVxcbitcXHQgKiBzZXFsb2NrLCB3aGljaCBjYW5ub3QgYmUgbmVzdGVkIGluc2lkZSB0aGUgcGFnZSB0cmVlIGxvY2suXFxuK1xcdCAqIFNvIG5vdGUgZW5kIG5vdzogaV9zaXplIGl0c2VsZiBtYXkgYmUgY2hhbmdlZCBhdCBhbnkgbW9tZW50LFxcbitcXHQgKiBidXQgZm9saW8gbG9jayBpcyBnb29kIGVub3VnaCB0byBzZXJpYWxpemUgdGhlIHRyaW1taW5nLlxcbitcXHQgKi9cXG4rXFx0ZW5kID0gRElWX1JPVU5EX1VQKGlfc2l6ZV9yZWFkKG1hcHBpbmctXFx1MDAzZWhvc3QpLCBQQUdFX1NJWkUpO1xcbitcXHRpZiAoc2htZW1fbWFwcGluZyhtYXBwaW5nKSlcXG4rXFx0XFx0ZW5kID0gc2htZW1fZmFsbG9jZW5kKG1hcHBpbmctXFx1MDAzZWhvc3QsIGVuZCk7XFxuK1xcbitcXHR1bm1hcF9mb2xpbyhmb2xpbyk7XFxuK1xcbitcXHR4YXNfbG9ja19pcnEoXFx1MDAyNnhhcyk7XFxuK1xcbitcXHQvKlxcbitcXHQgKiBDaGVjayBpZiB0aGUgZm9saW8gaXMgcHJlc2VudCBpbiBwYWdlIGNhY2hlLlxcbitcXHQgKiBXZSBhc3N1bWUgYWxsIHRhaWwgYXJlIHByZXNlbnQgdG9vLCBpZiBmb2xpbyBpcyB0aGVyZS5cXG4rXFx0ICovXFxuK1xcdGlmICh4YXNfbG9hZChcXHUwMDI2eGFzKSAhPSBmb2xpbykge1xcbitcXHRcXHRyZXQgPSAtRUFHQUlOO1xcbitcXHRcXHRnb3RvIGZhaWw7XFxuK1xcdH1cXG4rXFxuK1xcdGlmICghZm9saW9fcmVmX2ZyZWV6ZShmb2xpbywgb2xkX25yX3BhZ2VzICsgMSkpIHtcXG4rXFx0XFx0cmV0ID0gLUVBR0FJTjtcXG4rXFx0XFx0Z290byBmYWlsO1xcbitcXHR9XFxuK1xcbitcXHRpZiAoZm9saW9fdGVzdF9wbWRfbWFwcGFibGUoZm9saW8pIFxcdTAwMjZcXHUwMDI2IG5ld19vcmRlciBcXHUwMDNjIEhQQUdFX1BNRF9PUkRFUikge1xcbitcXHRcXHRpZiAoZm9saW9fdGVzdF9zd2FwYmFja2VkKGZvbGlvKSlcXG4rXFx0XFx0XFx0bHJ1dmVjX3N0YXRfbW9kX2ZvbGlvKGZvbGlvLCBOUl9TSE1FTV9USFBTLCAtb2xkX25yX3BhZ2VzKTtcXG4rXFx0XFx0ZWxzZVxcbitcXHRcXHRcXHRscnV2ZWNfc3RhdF9tb2RfZm9saW8oZm9saW8sIE5SX0ZJTEVfVEhQUywgLW9sZF9ucl9wYWdlcyk7XFxuK1xcdH1cXG4rXFxuK1xcdC8qIGxvY2sgbHJ1IGxpc3QvUGFnZUNvbXBvdW5kLCByZWYgZnJvemVuIGJ5IHBhZ2VfcmVmX2ZyZWV6ZSAqL1xcbitcXHRpZiAoZG9fbHJ1KVxcbitcXHRcXHRscnV2ZWMgPSBmb2xpb19scnV2ZWNfbG9jayhmb2xpbyk7XFxuK1xcbitcXHRyZXQgPSBfX3NwbGl0X3VubWFwcGVkX2ZvbGlvKGZvbGlvLCBuZXdfb3JkZXIsIHNwbGl0X2F0LCBcXHUwMDI2eGFzLFxcbitcXHRcXHRcXHRcXHQgICAgIG1hcHBpbmcsIHNwbGl0X3R5cGUpO1xcbitcXG4rXFx0LypcXG4rXFx0ICogVW5mcmVlemUgYWZ0ZXItc3BsaXQgZm9saW9zIGFuZCBwdXQgdGhlbSBiYWNrIHRvIHRoZSByaWdodFxcbitcXHQgKiBsaXN0LiBAZm9saW8gc2hvdWxkIGJlIGtlcHQgZnJvemVuIHVudGlsIHBhZ2UgY2FjaGVcXG4rXFx0ICogZW50cmllcyBhcmUgdXBkYXRlZCB3aXRoIGFsbCB0aGUgb3RoZXIgYWZ0ZXItc3BsaXQgZm9saW9zXFxuK1xcdCAqIHRvIHByZXZlbnQgb3RoZXJzIHNlZWluZyBzdGFsZSBwYWdlIGNhY2hlIGVudHJpZXMuXFxuK1xcdCAqIEFzIGEgcmVzdWx0LCBuZXdfZm9saW8gc3RhcnRzIGZyb20gdGhlIG5leHQgZm9saW8gb2ZcXG4rXFx0ICogQGZvbGlvLlxcbitcXHQgKi9cXG4rXFx0Zm9yIChuZXdfZm9saW8gPSBmb2xpb19uZXh0KGZvbGlvKTsgbmV3X2ZvbGlvICE9IGVuZF9mb2xpbztcXG4rXFx0ICAgICBuZXdfZm9saW8gPSBuZXh0KSB7XFxuK1xcdFxcdHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMgPSBmb2xpb19ucl9wYWdlcyhuZXdfZm9saW8pO1xcbitcXG4rXFx0XFx0bmV4dCA9IGZvbGlvX25leHQobmV3X2ZvbGlvKTtcXG4rXFxuK1xcdFxcdGZvbGlvX3JlZl91bmZyZWV6ZShuZXdfZm9saW8sXFxuK1xcdFxcdFxcdFxcdCAgIGZvbGlvX25yX3BhZ2VzKG5ld19mb2xpbykgKyAxKTtcXG4gXFxuIFxcdFxcdGlmIChkb19scnUpXFxuLVxcdFxcdFxcdGxydXZlY191bmxvY2sobHJ1dmVjKTtcXG4rXFx0XFx0XFx0bHJ1X2FkZF9zcGxpdF9mb2xpbyhmb2xpbywgbmV3X2ZvbGlvLCBscnV2ZWMsIGxpc3QpO1xcbiBcXG4tXFx0XFx0aWYgKGNpKVxcbi1cXHRcXHRcXHRzd2FwX2NsdXN0ZXJfdW5sb2NrKGNpKTtcXG4tXFx0fSBlbHNlIHtcXG4tXFx0XFx0aWYgKGRlcXVldWVfZGVmZXJyZWQpIHtcXG4tXFx0XFx0XFx0bGlzdF9scnVfdW5sb2NrKGxydSk7XFxuLVxcdFxcdFxcdHJjdV9yZWFkX3VubG9jaygpO1xcbitcXHRcXHQvKiBBZGQgdGhlIG5ldyBmb2xpbyB0byB0aGUgcGFnZSBjYWNoZS4gKi9cXG4rXFx0XFx0aWYgKG5ld19mb2xpby1cXHUwMDNlaW5kZXggXFx1MDAzYyBlbmQpIHtcXG4rXFx0XFx0XFx0X194YV9zdG9yZShcXHUwMDI2bWFwcGluZy1cXHUwMDNlaV9wYWdlcywgbmV3X2ZvbGlvLVxcdTAwM2VpbmRleCxcXG4rXFx0XFx0XFx0XFx0ICAgbmV3X2ZvbGlvLCAwKTtcXG4rXFx0XFx0XFx0Y29udGludWU7XFxuIFxcdFxcdH1cXG4tXFx0XFx0cmV0dXJuIC1FQUdBSU47XFxuK1xcbitcXHRcXHQvKiBEcm9wIGZvbGlvIGJleW9uZCBFT0Y6IC1cXHUwMDNlaW5kZXggXFx1MDAzZT0gZW5kICovXFxuK1xcdFxcdGlmIChzaG1lbV9tYXBwaW5nKG1hcHBpbmcpKVxcbitcXHRcXHRcXHRucl9zaG1lbV9kcm9wcGVkICs9IG5yX3BhZ2VzO1xcbitcXHRcXHRlbHNlIGlmIChmb2xpb190ZXN0X2NsZWFyX2RpcnR5KG5ld19mb2xpbykpXFxuK1xcdFxcdFxcdGZvbGlvX2FjY291bnRfY2xlYW5lZChuZXdfZm9saW8sXFxuK1xcdFxcdFxcdFxcdFxcdCAgICAgIGlub2RlX3RvX3diKG1hcHBpbmctXFx1MDAzZWhvc3QpKTtcXG4rXFx0XFx0X19maWxlbWFwX3JlbW92ZV9mb2xpbyhuZXdfZm9saW8sIE5VTEwpO1xcbitcXHRcXHRmb2xpb19wdXRfcmVmcyhuZXdfZm9saW8sIG5yX3BhZ2VzKTtcXG4gXFx0fVxcbiBcXG4rXFx0LypcXG4rXFx0ICogVW5mcmVlemUgQGZvbGlvIG9ubHkgYWZ0ZXIgYWxsIHBhZ2UgY2FjaGUgZW50cmllcywgd2hpY2hcXG4rXFx0ICogdXNlZCB0byBwb2ludCB0byBpdCwgaGF2ZSBiZWVuIHVwZGF0ZWQgd2l0aCBuZXcgZm9saW9zLlxcbitcXHQgKiBPdGhlcndpc2UsIGEgcGFyYWxsZWwgZm9saW9fdHJ5X2dldCgpIGNhbiBncmFiIEBmb2xpb1xcbitcXHQgKiBhbmQgaXRzIGNhbGxlciBjYW4gc2VlIHN0YWxlIHBhZ2UgY2FjaGUgZW50cmllcy5cXG4rXFx0ICovXFxuK1xcdGZvbGlvX3JlZl91bmZyZWV6ZShmb2xpbywgZm9saW9fbnJfcGFnZXMoZm9saW8pICsgMSk7XFxuK1xcbitcXHRpZiAoZG9fbHJ1KVxcbitcXHRcXHRscnV2ZWNfdW5sb2NrKGxydXZlYyk7XFxuK1xcbitmYWlsOlxcbitcXHR4YXNfdW5sb2NrX2lycShcXHUwMDI2eGFzKTtcXG4rZmFpbF9tbWFwX3VubG9jazpcXG4rXFx0aWYgKG5yX3NobWVtX2Ryb3BwZWQpXFxuK1xcdFxcdHNobWVtX3VuY2hhcmdlKG1hcHBpbmctXFx1MDAzZWhvc3QsIG5yX3NobWVtX2Ryb3BwZWQpO1xcbitcXHQvKlxcbitcXHQgKiBEcm9wIHRoZSBtYXBwaW5nIHdoaWxlIHRoZSBpbm9kZSBpcyBzdGlsbCBwaW5uZWQuIEBmb2xpbyBzdGF5c1xcbitcXHQgKiBsb2NrZWQgYW5kIHByZXNlbnQgaW4gdGhlIHBhZ2UgY2FjaGUsIHNvIGV2aWN0aW9uIGNhbm5vdCBmcmVlXFxuK1xcdCAqIHRoZSBpbm9kZSB5ZXQsIG5vdGhpbmcgcGFzdCB0aGlzIHBvaW50IG1heSB0b3VjaCB0aGUgaW5vZGUgb3JcXG4rXFx0ICogdGhlIG1hcHBpbmcuXFxuK1xcdCAqL1xcbitcXHRpX21tYXBfdW5sb2NrX3JlYWQobWFwcGluZyk7XFxuK2ZhaWxfZnJlZTpcXG4rXFx0LyogUmVzdG9yZSB0aGUgcHJldmlvdXNseSBhY3RpdmUgbWVtY2cgKi9cXG4rXFx0c2V0X2FjdGl2ZV9tZW1jZyhvbGRfbWVtY2cpO1xcbitcXHRtZW1fY2dyb3VwX3B1dChtZW1jZyk7XFxuK1xcdHhhc19kZXN0cm95KFxcdTAwMjZ4YXMpO1xcbiBcXHRyZXR1cm4gcmV0O1xcbiB9XFxuIFxcbkBAIC00MTAyLDE3ICs0MjQ4LDExIEBAIHN0YXRpYyBpbnQgX19mb2xpb19zcGxpdChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyLFxcbiBcXHRcXHRzdHJ1Y3QgcGFnZSAqc3BsaXRfYXQsIHN0cnVjdCBwYWdlICpsb2NrX2F0LFxcbiBcXHRcXHRzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LCBlbnVtIHNwbGl0X3R5cGUgc3BsaXRfdHlwZSlcXG4ge1xcbi1cXHRYQV9TVEFURSh4YXMsIFxcdTAwMjZmb2xpby1cXHUwMDNlbWFwcGluZy1cXHUwMDNlaV9wYWdlcywgZm9saW8tXFx1MDAzZWluZGV4KTtcXG4rXFx0Ym9vbCBpc19zd2FwY2FjaGUgPSBmb2xpb190ZXN0X3N3YXBjYWNoZShmb2xpbyk7XFxuIFxcdHN0cnVjdCBmb2xpbyAqZW5kX2ZvbGlvID0gZm9saW9fbmV4dChmb2xpbyk7XFxuIFxcdGJvb2wgaXNfYW5vbiA9IGZvbGlvX3Rlc3RfYW5vbihmb2xpbyk7XFxuLVxcdHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZywgKm9sZF9tZW1jZztcXG4tXFx0c3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSBOVUxMO1xcbi1cXHRzdHJ1Y3QgYW5vbl92bWEgKmFub25fdm1hID0gTlVMTDtcXG4gXFx0aW50IG9sZF9vcmRlciA9IGZvbGlvX29yZGVyKGZvbGlvKTtcXG4gXFx0c3RydWN0IGZvbGlvICpuZXdfZm9saW8sICpuZXh0O1xcbi1cXHRpbnQgbnJfc2htZW1fZHJvcHBlZCA9IDA7XFxuLVxcdGVudW0gdHR1X2ZsYWdzIHR0dV9mbGFncyA9IDA7XFxuLVxcdHBnb2ZmX3QgZW5kID0gMDtcXG4gXFx0aW50IHJldDtcXG4gXFxuIFxcdFZNX1dBUk5fT05fT05DRV9GT0xJTyghZm9saW9fdGVzdF9sb2NrZWQoZm9saW8pLCBmb2xpbyk7XFxuQEAgLTQxMjAsMTQxICs0MjYwLDI5IEBAIHN0YXRpYyBpbnQgX19mb2xpb19zcGxpdChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyLFxcbiBcXG4gXFx0aWYgKGZvbGlvICE9IHBhZ2VfZm9saW8oc3BsaXRfYXQpIHx8IGZvbGlvICE9IHBhZ2VfZm9saW8obG9ja19hdCkpIHtcXG4gXFx0XFx0cmV0ID0gLUVJTlZBTDtcXG4tXFx0XFx0Z290byBvdXRfbm9fbWVtY2c7XFxuK1xcdFxcdGdvdG8gb3V0O1xcbiBcXHR9XFxuIFxcbiBcXHRpZiAobmV3X29yZGVyIFxcdTAwM2U9IG9sZF9vcmRlcikge1xcbiBcXHRcXHRyZXQgPSAtRUlOVkFMO1xcbi1cXHRcXHRnb3RvIG91dF9ub19tZW1jZztcXG4rXFx0XFx0Z290byBvdXQ7XFxuIFxcdH1cXG4gXFxuIFxcdHJldCA9IGZvbGlvX2NoZWNrX3NwbGl0dGFibGUoZm9saW8sIG5ld19vcmRlciwgc3BsaXRfdHlwZSk7XFxuIFxcdGlmIChyZXQpIHtcXG4gXFx0XFx0Vk1fV0FSTl9PTkNFKHJldCA9PSAtRUlOVkFMLCBcXFwiVHJpZWQgdG8gc3BsaXQgYW4gdW5zcGxpdHRhYmxlIGZvbGlvXFxcIik7XFxuLVxcdFxcdGdvdG8gb3V0X25vX21lbWNnO1xcbi1cXHR9XFxuLVxcbi1cXHQvKlxcbi1cXHQgKiBzd2l0Y2ggdG8gZm9saW8ncyBtZW1jZyBhcyB4YXJyYXkgbm9kZSBhbGxvY2F0aW9uIGNhbiBoYXBwZW4gYW5kXFxuLVxcdCAqIG5lZWRzIHRvIGNoYXJnZSB0byBpdC5cXG4tXFx0ICovXFxuLVxcdG1lbWNnID0gZ2V0X21lbV9jZ3JvdXBfZnJvbV9mb2xpbyhmb2xpbyk7XFxuLVxcdG9sZF9tZW1jZyA9IHNldF9hY3RpdmVfbWVtY2cobWVtY2cpO1xcbi1cXG4tXFx0aWYgKGlzX2Fub24pIHtcXG4tXFx0XFx0LypcXG4tXFx0XFx0ICogVGhlIGNhbGxlciBkb2VzIG5vdCBuZWNlc3NhcmlseSBob2xkIGFuIG1tYXBfbG9jayB0aGF0IHdvdWxkXFxuLVxcdFxcdCAqIHByZXZlbnQgdGhlIGFub25fdm1hIGRpc2FwcGVhcmluZyBzbyB3ZSBmaXJzdCB3ZSB0YWtlIGFcXG4tXFx0XFx0ICogcmVmZXJlbmNlIHRvIGl0IGFuZCB0aGVuIGxvY2sgdGhlIGFub25fdm1hIGZvciB3cml0ZS4gVGhpc1xcbi1cXHRcXHQgKiBpcyBzaW1pbGFyIHRvIGZvbGlvX2xvY2tfYW5vbl92bWFfcmVhZCBleGNlcHQgdGhlIHdyaXRlIGxvY2tcXG4tXFx0XFx0ICogaXMgdGFrZW4gdG8gc2VyaWFsaXNlIGFnYWluc3QgcGFyYWxsZWwgc3BsaXQgb3IgY29sbGFwc2VcXG4tXFx0XFx0ICogb3BlcmF0aW9ucy5cXG4tXFx0XFx0ICovXFxuLVxcdFxcdGFub25fdm1hID0gZm9saW9fZ2V0X2Fub25fdm1hKGZvbGlvKTtcXG4tXFx0XFx0aWYgKCFhbm9uX3ZtYSkge1xcbi1cXHRcXHRcXHRyZXQgPSAtRUJVU1k7XFxuLVxcdFxcdFxcdGdvdG8gb3V0O1xcbi1cXHRcXHR9XFxuLVxcdFxcdGFub25fdm1hX2xvY2tfd3JpdGUoYW5vbl92bWEpO1xcbi1cXHRcXHRtYXBwaW5nID0gTlVMTDtcXG4tXFx0fSBlbHNlIHtcXG4tXFx0XFx0dW5zaWduZWQgaW50IG1pbl9vcmRlcjtcXG4tXFx0XFx0Z2ZwX3QgZ2ZwO1xcbi1cXG4tXFx0XFx0bWFwcGluZyA9IGZvbGlvLVxcdTAwM2VtYXBwaW5nO1xcbi1cXHRcXHRtaW5fb3JkZXIgPSBtYXBwaW5nX21pbl9mb2xpb19vcmRlcihtYXBwaW5nKTtcXG4tXFx0XFx0aWYgKG5ld19vcmRlciBcXHUwMDNjIG1pbl9vcmRlcikge1xcbi1cXHRcXHRcXHRyZXQgPSAtRUlOVkFMO1xcbi1cXHRcXHRcXHRnb3RvIG91dDtcXG4tXFx0XFx0fVxcbi1cXG4tXFx0XFx0Z2ZwID0gY3VycmVudF9nZnBfY29udGV4dChtYXBwaW5nX2dmcF9tYXNrKG1hcHBpbmcpIFxcdTAwMjZcXG4tXFx0XFx0XFx0XFx0XFx0XFx0XFx0R0ZQX1JFQ0xBSU1fTUFTSyk7XFxuLVxcbi1cXHRcXHRpZiAoIWZpbGVtYXBfcmVsZWFzZV9mb2xpbyhmb2xpbywgZ2ZwKSkge1xcbi1cXHRcXHRcXHRyZXQgPSAtRUJVU1k7XFxuLVxcdFxcdFxcdGdvdG8gb3V0O1xcbi1cXHRcXHR9XFxuLVxcbi1cXHRcXHRtYXBwaW5nX3NldF91cGRhdGUoXFx1MDAyNnhhcywgbWFwcGluZyk7XFxuLVxcbi1cXHRcXHRpZiAoc3BsaXRfdHlwZSA9PSBTUExJVF9UWVBFX1VOSUZPUk0pIHtcXG4tXFx0XFx0XFx0eGFzX3NldF9vcmRlcihcXHUwMDI2eGFzLCBmb2xpby1cXHUwMDNlaW5kZXgsIG5ld19vcmRlcik7XFxuLVxcdFxcdFxcdHhhc19zcGxpdF9hbGxvYyhcXHUwMDI2eGFzLCBmb2xpbywgb2xkX29yZGVyLCBnZnApO1xcbi1cXHRcXHRcXHRpZiAoeGFzX2Vycm9yKFxcdTAwMjZ4YXMpKSB7XFxuLVxcdFxcdFxcdFxcdHJldCA9IHhhc19lcnJvcihcXHUwMDI2eGFzKTtcXG4tXFx0XFx0XFx0XFx0Z290byBvdXQ7XFxuLVxcdFxcdFxcdH1cXG4tXFx0XFx0fVxcbi1cXG4tXFx0XFx0YW5vbl92bWEgPSBOVUxMO1xcbi1cXHRcXHRpX21tYXBfbG9ja19yZWFkKG1hcHBpbmcpO1xcbi1cXG4tXFx0XFx0LypcXG4tXFx0XFx0ICpfX3NwbGl0X3VubWFwcGVkX2ZvbGlvKCkgbWF5IG5lZWQgdG8gdHJpbSBvZmYgcGFnZXMgYmV5b25kXFxuLVxcdFxcdCAqIEVPRjogYnV0IG9uIDMyLWJpdCwgaV9zaXplX3JlYWQoKSB0YWtlcyBhbiBpcnEtdW5zYWZlXFxuLVxcdFxcdCAqIHNlcWxvY2ssIHdoaWNoIGNhbm5vdCBiZSBuZXN0ZWQgaW5zaWRlIHRoZSBwYWdlIHRyZWUgbG9jay5cXG4tXFx0XFx0ICogU28gbm90ZSBlbmQgbm93OiBpX3NpemUgaXRzZWxmIG1heSBiZSBjaGFuZ2VkIGF0IGFueSBtb21lbnQsXFxuLVxcdFxcdCAqIGJ1dCBmb2xpbyBsb2NrIGlzIGdvb2QgZW5vdWdoIHRvIHNlcmlhbGl6ZSB0aGUgdHJpbW1pbmcuXFxuLVxcdFxcdCAqL1xcbi1cXHRcXHRlbmQgPSBESVZfUk9VTkRfVVAoaV9zaXplX3JlYWQobWFwcGluZy1cXHUwMDNlaG9zdCksIFBBR0VfU0laRSk7XFxuLVxcdFxcdGlmIChzaG1lbV9tYXBwaW5nKG1hcHBpbmcpKVxcbi1cXHRcXHRcXHRlbmQgPSBzaG1lbV9mYWxsb2NlbmQobWFwcGluZy1cXHUwMDNlaG9zdCwgZW5kKTtcXG4tXFx0fVxcbi1cXG4tXFx0LypcXG4tXFx0ICogUmFjeSBjaGVjayBpZiB3ZSBjYW4gc3BsaXQgdGhlIHBhZ2UsIGJlZm9yZSB1bm1hcF9mb2xpbygpIHdpbGxcXG4tXFx0ICogc3BsaXQgUE1Ec1xcbi1cXHQgKi9cXG4tXFx0aWYgKGZvbGlvX2V4cGVjdGVkX3JlZl9jb3VudChmb2xpbykgIT0gZm9saW9fcmVmX2NvdW50KGZvbGlvKSAtIDEpIHtcXG4tXFx0XFx0cmV0ID0gLUVBR0FJTjtcXG4tXFx0XFx0Z290byBvdXRfdW5sb2NrO1xcbi1cXHR9XFxuLVxcbi1cXHR1bm1hcF9mb2xpbyhmb2xpbyk7XFxuLVxcbi1cXHQvKiBibG9jayBpbnRlcnJ1cHQgcmVlbnRyeSBpbiB4YV9sb2NrIGFuZCBzcGlubG9jayAqL1xcbi1cXHRsb2NhbF9pcnFfZGlzYWJsZSgpO1xcbi1cXHRpZiAobWFwcGluZykge1xcbi1cXHRcXHQvKlxcbi1cXHRcXHQgKiBDaGVjayBpZiB0aGUgZm9saW8gaXMgcHJlc2VudCBpbiBwYWdlIGNhY2hlLlxcbi1cXHRcXHQgKiBXZSBhc3N1bWUgYWxsIHRhaWwgYXJlIHByZXNlbnQgdG9vLCBpZiBmb2xpbyBpcyB0aGVyZS5cXG4tXFx0XFx0ICovXFxuLVxcdFxcdHhhc19sb2NrKFxcdTAwMjZ4YXMpO1xcbi1cXHRcXHR4YXNfcmVzZXQoXFx1MDAyNnhhcyk7XFxuLVxcdFxcdGlmICh4YXNfbG9hZChcXHUwMDI2eGFzKSAhPSBmb2xpbykge1xcbi1cXHRcXHRcXHRyZXQgPSAtRUFHQUlOO1xcbi1cXHRcXHRcXHRnb3RvIGZhaWw7XFxuLVxcdFxcdH1cXG4rXFx0XFx0Z290byBvdXQ7XFxuIFxcdH1cXG4gXFxuLVxcdHJldCA9IF9fZm9saW9fZnJlZXplX2FuZF9zcGxpdF91bm1hcHBlZChmb2xpbywgbmV3X29yZGVyLCBzcGxpdF9hdCwgXFx1MDAyNnhhcywgbWFwcGluZyxcXG4tXFx0XFx0XFx0XFx0XFx0XFx0dHJ1ZSwgbGlzdCwgc3BsaXRfdHlwZSwgZW5kLCBcXHUwMDI2bnJfc2htZW1fZHJvcHBlZCk7XFxuLWZhaWw6XFxuLVxcdGlmIChtYXBwaW5nKVxcbi1cXHRcXHR4YXNfdW5sb2NrKFxcdTAwMjZ4YXMpO1xcbi1cXG4tXFx0bG9jYWxfaXJxX2VuYWJsZSgpO1xcbi1cXG4tXFx0aWYgKG5yX3NobWVtX2Ryb3BwZWQpXFxuLVxcdFxcdHNobWVtX3VuY2hhcmdlKG1hcHBpbmctXFx1MDAzZWhvc3QsIG5yX3NobWVtX2Ryb3BwZWQpO1xcbi1cXG4tXFx0aWYgKCFyZXQgXFx1MDAyNlxcdTAwMjYgaXNfYW5vbiBcXHUwMDI2XFx1MDAyNiAhZm9saW9faXNfZGV2aWNlX3ByaXZhdGUoZm9saW8pKVxcbi1cXHRcXHR0dHVfZmxhZ3MgPSBUVFVfVVNFX1NIQVJFRF9aRVJPUEFHRTtcXG4tXFxuLVxcdHJlbWFwX3BhZ2UoZm9saW8sIDEgXFx1MDAzY1xcdTAwM2Mgb2xkX29yZGVyLCB0dHVfZmxhZ3MpO1xcbi1cXG4tXFx0LypcXG4tXFx0ICogRHJvcCB0aGUgbWFwcGluZyB3aGlsZSB0aGUgaW5vZGUgaXMgc3RpbGwgcGlubmVkLiBAZm9saW8gc3RheXNcXG4tXFx0ICogbG9ja2VkIGFuZCBwcmVzZW50IGluIHRoZSBwYWdlIGNhY2hlIHVudGlsIHRoZSBsb29wIGJlbG93LCBzb1xcbi1cXHQgKiBldmljdGlvbiBjYW5ub3QgZnJlZSB0aGUgaW5vZGUgeWV0OyBAbG9ja19hdCBpcyBub3QgZW5vdWdoLCBpdCBtYXlcXG4tXFx0ICogYmUgYSB0YWlsIGJleW9uZCBFT0YgdGhhdCB0aGUgc3BsaXQgYWxyZWFkeSBkcm9wcGVkIGZyb20gdGhlIHBhZ2VcXG4tXFx0ICogY2FjaGUuIE5vdGhpbmcgcGFzdCB0aGlzIHBvaW50IG1heSB0b3VjaCB0aGUgaW5vZGUgb3IgdGhlIG1hcHBpbmcuXFxuLVxcdCAqL1xcbi1cXHRpZiAobWFwcGluZykge1xcbi1cXHRcXHRpX21tYXBfdW5sb2NrX3JlYWQobWFwcGluZyk7XFxuLVxcdFxcdG1hcHBpbmcgPSBOVUxMO1xcbi1cXHR9XFxuK1xcdGlmIChpc19hbm9uKVxcbitcXHRcXHRyZXQgPSBfX2ZvbGlvX2ZyZWV6ZV9zcGxpdF91bm1hcChmb2xpbywgbmV3X29yZGVyLCBzcGxpdF9hdCwgdHJ1ZSxcXG4rXFx0XFx0XFx0XFx0XFx0XFx0IHRydWUsIGxpc3QsIHNwbGl0X3R5cGUpO1xcbitcXHRlbHNlIGlmIChpc19zd2FwY2FjaGUpXFxuK1xcdFxcdHJldCA9IF9fZm9saW9fZnJlZXplX3NwbGl0X3VubWFwKGZvbGlvLCBuZXdfb3JkZXIsIHNwbGl0X2F0LCB0cnVlLFxcbitcXHRcXHRcXHRcXHRcXHRcXHQgZmFsc2UsIGxpc3QsIHNwbGl0X3R5cGUpO1xcbitcXHRlbHNlXFxuK1xcdFxcdHJldCA9IF9fZm9saW9fZnJlZXplX3NwbGl0X3VubWFwX2ZpbGUoZm9saW8sIG5ld19vcmRlciwgc3BsaXRfYXQsXFxuK1xcdFxcdFxcdFxcdFxcdFxcdCAgICAgIHRydWUsIGxpc3QsIHNwbGl0X3R5cGUpO1xcbiBcXG4gXFx0LypcXG4gXFx0ICogVW5sb2NrIGFsbCBhZnRlci1zcGxpdCBmb2xpb3MgZXhjZXB0IHRoZSBvbmUgY29udGFpbmluZ1xcbkBAIC00MjY1LDI5ICs0MjkzLDE5IEBAIHN0YXRpYyBpbnQgX19mb2xpb19zcGxpdChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyLFxcbiBcXHRcXHRpZiAobmV3X2ZvbGlvID09IHBhZ2VfZm9saW8obG9ja19hdCkpXFxuIFxcdFxcdFxcdGNvbnRpbnVlO1xcbiBcXG4tXFx0XFx0Zm9saW9fdW5sb2NrKG5ld19mb2xpbyk7XFxuIFxcdFxcdC8qXFxuIFxcdFxcdCAqIFN1YnBhZ2VzIHdob3NlIG1hcHBpbmcgaGFzIGJlZW4gemFwcGVkIG1heSBiZSBmcmVlZFxcbiBcXHRcXHQgKiBlYXJsaWVyLCBidXQgZnJlZWluZyB0aGVtIHJlcXVpcmVzIHRha2luZyB0aGVcXG4gXFx0XFx0ICogbHJ1X2xvY2ssIHNvIHdlIGRlZmVyIHB1dF9wYWdlKCkgb24gdGFpbCBwYWdlcyB1bnRpbFxcbiBcXHRcXHQgKiBhZnRlciB0aGUgc3BsaXQgY29tcGxldGVzLlxcbiBcXHRcXHQgKi9cXG4tXFx0XFx0ZnJlZV9mb2xpb19hbmRfc3dhcF9jYWNoZShuZXdfZm9saW8pO1xcbitcXHRcXHRpZiAoaXNfc3dhcGNhY2hlKVxcbitcXHRcXHRcXHRmb2xpb19mcmVlX3N3YXAobmV3X2ZvbGlvKTtcXG4rXFx0XFx0Zm9saW9fdW5sb2NrKG5ld19mb2xpbyk7XFxuK1xcdFxcdGZvbGlvX3B1dChuZXdfZm9saW8pO1xcbiBcXHR9XFxuIFxcbi1vdXRfdW5sb2NrOlxcbi1cXHRpZiAoYW5vbl92bWEpIHtcXG4tXFx0XFx0YW5vbl92bWFfdW5sb2NrX3dyaXRlKGFub25fdm1hKTtcXG4tXFx0XFx0cHV0X2Fub25fdm1hKGFub25fdm1hKTtcXG4tXFx0fVxcbi1cXHRpZiAobWFwcGluZylcXG4tXFx0XFx0aV9tbWFwX3VubG9ja19yZWFkKG1hcHBpbmcpO1xcbiBvdXQ6XFxuLVxcdC8qIHJlc3RvcmUgdG8gY2FsbGVyJ3Mgb2xkX21lbWNnICovXFxuLVxcdHNldF9hY3RpdmVfbWVtY2cob2xkX21lbWNnKTtcXG4tXFx0bWVtX2Nncm91cF9wdXQobWVtY2cpO1xcbi1vdXRfbm9fbWVtY2c6XFxuLVxcdHhhc19kZXN0cm95KFxcdTAwMjZ4YXMpO1xcbiBcXHRpZiAoaXNfcG1kX29yZGVyKG9sZF9vcmRlcikpXFxuIFxcdFxcdGNvdW50X3ZtX2V2ZW50KCFyZXQgPyBUSFBfU1BMSVRfUEFHRSA6IFRIUF9TUExJVF9QQUdFX0ZBSUxFRCk7XFxuIFxcdGNvdW50X210aHBfc3RhdChvbGRfb3JkZXIsICFyZXQgPyBNVEhQX1NUQVRfU1BMSVQgOiBNVEhQX1NUQVRfU1BMSVRfRkFJTEVEKTtcXG5AQCAtNDMxOCwyMiArNDMzNiwxMyBAQCBzdGF0aWMgaW50IF9fZm9saW9fc3BsaXQoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlcixcXG4gICovXFxuIGludCBmb2xpb19zcGxpdF91bm1hcHBlZChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyKVxcbiB7XFxuLVxcdGludCByZXQgPSAwO1xcbi1cXG4gXFx0Vk1fV0FSTl9PTl9PTkNFX0ZPTElPKGZvbGlvX21hcHBlZChmb2xpbyksIGZvbGlvKTtcXG4gXFx0Vk1fV0FSTl9PTl9PTkNFX0ZPTElPKCFmb2xpb190ZXN0X2xvY2tlZChmb2xpbyksIGZvbGlvKTtcXG4gXFx0Vk1fV0FSTl9PTl9PTkNFX0ZPTElPKCFmb2xpb190ZXN0X2xhcmdlKGZvbGlvKSwgZm9saW8pO1xcbiBcXHRWTV9XQVJOX09OX09OQ0VfRk9MSU8oIWZvbGlvX3Rlc3RfYW5vbihmb2xpbyksIGZvbGlvKTtcXG4gXFxuLVxcdGlmIChmb2xpb19leHBlY3RlZF9yZWZfY291bnQoZm9saW8pICE9IGZvbGlvX3JlZl9jb3VudChmb2xpbykgLSAxKVxcbi1cXHRcXHRyZXR1cm4gLUVBR0FJTjtcXG4tXFxuLVxcdGxvY2FsX2lycV9kaXNhYmxlKCk7XFxuLVxcdHJldCA9IF9fZm9saW9fZnJlZXplX2FuZF9zcGxpdF91bm1hcHBlZChmb2xpbywgbmV3X29yZGVyLCBcXHUwMDI2Zm9saW8tXFx1MDAzZXBhZ2UsIE5VTEwsXFxuLVxcdFxcdFxcdFxcdFxcdFxcdE5VTEwsIGZhbHNlLCBOVUxMLCBTUExJVF9UWVBFX1VOSUZPUk0sXFxuLVxcdFxcdFxcdFxcdFxcdFxcdDAsIE5VTEwpO1xcbi1cXHRsb2NhbF9pcnFfZW5hYmxlKCk7XFxuLVxcdHJldHVybiByZXQ7XFxuK1xcdHJldHVybiBfX2ZvbGlvX2ZyZWV6ZV9zcGxpdF91bm1hcChmb2xpbywgbmV3X29yZGVyLCBcXHUwMDI2Zm9saW8tXFx1MDAzZXBhZ2UsIGZhbHNlLFxcbitcXHRcXHRcXHRcXHRcXHQgIGZhbHNlLCBOVUxMLCBTUExJVF9UWVBFX1VOSUZPUk0pO1xcbiB9XFxuIFxcbiAvKlxcbkBAIC00MzUyLDExICs0MzYxLDExIEBAIGludCBmb2xpb19zcGxpdF91bm1hcHBlZChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyKVxcbiAgKiAgICBHVVAgcGlucywgd2lsbCByZXN1bHQgaW4gdGhlIGZvbGlvIG5vdCBnZXR0aW5nIHNwbGl0OyBpbnN0ZWFkLCB0aGUgY2FsbGVyXFxuICAqICAgIHdpbGwgcmVjZWl2ZSBhbiAtRUFHQUlOLlxcbiAgKlxcbi0gKiA0KSBAbmV3X29yZGVyIFxcdTAwM2UgMSwgdXN1YWxseS4gU3BsaXR0aW5nIHRvIG9yZGVyLTEgYW5vbnltb3VzIGZvbGlvcyBpcyBub3RcXG4tICogICAgc3VwcG9ydGVkIGZvciBub24tZmlsZS1iYWNrZWQgZm9saW9zLCBiZWNhdXNlIGZvbGlvLVxcdTAwM2VfZGVmZXJyZWRfbGlzdCwgd2hpY2hcXG4tICogICAgaXMgdXNlZCBieSBwYXJ0aWFsbHkgbWFwcGVkIGZvbGlvcywgaXMgc3RvcmVkIGluIHN1YnBhZ2UgMiwgYnV0IGFuIG9yZGVyLTFcXG4tICogICAgZm9saW8gb25seSBoYXMgc3VicGFnZXMgMCBhbmQgMS4gRmlsZS1iYWNrZWQgb3JkZXItMSBmb2xpb3MgYXJlIHN1cHBvcnRlZCxcXG4tICogICAgc2luY2UgdGhleSBkbyBub3QgdXNlIF9kZWZlcnJlZF9saXN0LlxcbisgKiA0KSBAbmV3X29yZGVyIFxcdTAwM2UgMSwgdXN1YWxseS4gT3JkZXItMSBpcyBub3Qgc3VwcG9ydGVkIGZvciBhbm9uIG9yIHN3YXBjYWNoZVxcbisgKiAgICBmb2xpb3M6IGFub24gZm9saW9zIG5lZWQgc3VicGFnZSAyIGZvciBfZGVmZXJyZWRfbGlzdCwgd2hpY2ggb3JkZXItMVxcbisgKiAgICBmb2xpb3MgbGFjaywgYW5kIGEgc3dhcGNhY2hlIGZvbGlvIG1heSBiZWNvbWUgYW5vbiBvbmNlIGZhdWx0ZWQgaW4uXFxuKyAqICAgIEZpbGUtYmFja2VkIG9yZGVyLTEgZm9saW9zIGFyZSBzdXBwb3J0ZWQsIHNpbmNlIHRoZXkgZG8gbm90IHVzZVxcbisgKiAgICBfZGVmZXJyZWRfbGlzdC5cXG4gICpcXG4gICogQWZ0ZXIgc3BsaXR0aW5nLCB0aGUgY2FsbGVyJ3MgZm9saW8gcmVmZXJlbmNlIHdpbGwgYmUgdHJhbnNmZXJyZWQgdG8gQHBhZ2UsXFxuICAqIHJlc3VsdGluZyBpbiBhIHJhaXNlZCByZWZjb3VudCBvZiBAcGFnZSBhZnRlciB0aGlzIGNhbGwuIFRoZSBvdGhlciBwYWdlcyBtYXlcXG5kaWZmIC0tZ2l0IGEvbW0vc3dhcF9zdGF0ZS5jIGIvbW0vc3dhcF9zdGF0ZS5jXFxuaW5kZXggNWJlODI1OTExZTY0NS4uZjE0MDVlNWI4MTNlZSAxMDA2NDRcXG4tLS0gYS9tbS9zd2FwX3N0YXRlLmNcXG4rKysgYi9tbS9zd2FwX3N0YXRlLmNcXG5AQCAtMzg4LDggKzM4OCw5IEBAIHZvaWQgX19zd2FwX2NhY2hlX3JlcGxhY2VfZm9saW8oc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSxcXG4gXFx0ICAgIGZvbGlvX29yZGVyKG9sZCkgIT0gZm9saW9fb3JkZXIobmV3KSkge1xcbiBcXHRcXHRjaV9vZmYgPSBzd3BfY2x1c3Rlcl9vZmZzZXQob2xkLVxcdTAwM2Vzd2FwKTtcXG4gXFx0XFx0Y2lfZW5kID0gY2lfb2ZmICsgZm9saW9fbnJfcGFnZXMob2xkKTtcXG4tXFx0XFx0d2hpbGUgKGNpX29mZisrIFxcdTAwM2MgY2lfZW5kKVxcbitcXHRcXHRkbyB7XFxuIFxcdFxcdFxcdFdBUk5fT05fT05DRShzd3BfdGJfdG9fZm9saW8oX19zd2FwX3RhYmxlX2dldChjaSwgY2lfb2ZmKSkgIT0gb2xkKTtcXG4rXFx0XFx0fSB3aGlsZSAoKytjaV9vZmYgXFx1MDAzYyBjaV9lbmQpO1xcbiBcXHR9XFxuIH1cXG4gXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA3VDIxOjU0OjA3LjQ1MjUyMDIyNVoiLCJTZXEiOjIsIk5lc3RpbmciOjEsIlR5cGUiOiJhZ2VudCIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImJlc3QtZXhwZW5zaXZlIiwiRHVyYXRpb24iOjk1NDA4NTk3ODMwLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIlRSQU5TUEFSRU5UX0hVR0VQQUdFXCIsXG4gICAgXCJTV0FQXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwiX19zcGxpdF9odWdlX3BhZ2VfdG9fbGlzdF90b19vcmRlclwiLFxuICAgIFwiZm9saW9fc3BsaXRcIixcbiAgICBcImZvbGlvX3NwbGl0X3VubWFwcGVkXCIsXG4gICAgXCJfX3N3YXBfY2FjaGVfcmVwbGFjZV9mb2xpb1wiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIHJld29ya3MgdGhlIGxvZ2ljIGZvciBzcGxpdHRpbmcgdW5tYXBwZWQgZm9saW9zLCBzcGVjaWZpY2FsbHkgaGFuZGxpbmcgc3dhcGNhY2hlIGFuZCBhbm9ueW1vdXMgZm9saW9zLiBJdCBpbnRyb2R1Y2VzIG5ldyBzdGF0aWMgZnVuY3Rpb25zIGBfX2ZvbGlvX2ZyZWV6ZV9zcGxpdF91bm1hcGAgYW5kIGBfX2ZvbGlvX2ZyZWV6ZV9zcGxpdF91bm1hcF9maWxlYCB0byByZXBsYWNlIGBfX2ZvbGlvX2ZyZWV6ZV9hbmRfc3BsaXRfdW5tYXBwZWRgLiBJdCBhbHNvIG1vZGlmaWVzIGBmb2xpb19jaGVja19zcGxpdHRhYmxlYCBhbmQgYF9fZm9saW9fc3BsaXRgIHRvIHVzZSB0aGUgbmV3IGxvZ2ljLiBUaGUgY2hhbmdlcyBhZmZlY3QgY29yZSBtZW1vcnkgbWFuYWdlbWVudCwgc3BlY2lmaWNhbGx5IFRIUCBhbmQgZm9saW8gc3BsaXR0aW5nLCB3aGljaCBhcmUgaGlnaGx5IGNvbXBsZXggYW5kIHByb25lIHRvIHJhY2UgY29uZGl0aW9ucy4gRnV6emluZyB0aGUgbWFpbiBlbnRyeSBwb2ludHMgZm9yIGZvbGlvIHNwbGl0dGluZyBpcyBpbXBvcnRhbnQgdG8gZW5zdXJlIHRoZSBuZXcgbG9naWMgaXMgcm9idXN0LlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiSW5zdHJ1Y3Rpb24iOiJZb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgbWFpbnRhaW5lci5cbllvdXIgam9iIGlzIHRvIHJldmlldyBhIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQgZGV0ZXJtaW5lXG5pZiBpdCBtYWtlcyBmdW5jdGlvbmFsIGNoYW5nZXMgdG8gdGhlIGtlcm5lbCB0aGF0IHNob3VsZCBiZSBmdXp6ZWQuXG5cbklNUE9SVEFOVDogVGhlIGNoYW5nZXMgaGF2ZSBBTFJFQURZIGJlZW4gYXBwbGllZCBhbmQgY29tbWl0dGVkIGFzIHRoZSBIRUFEIGNvbW1pdCBpblxueW91ciB3b3Jrc3BhY2UuIERvIE5PVCByZWx5IG9uIHlvdXIgaW50ZXJuYWwga25vd2xlZGdlIG9mIHRoZSBrZXJuZWwuIFlvdSBtdXN0IGFjdGl2ZWx5XG51c2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBleGFtaW5lIHRoZSBhY3R1YWwgc291cmNlIGNvZGUgYW5kIGNvbmZpcm0gYW55IGFzc3VtcHRpb25zLlxuXG5SZXR1cm4gV29ydGhGdXp6aW5nPWZhbHNlIGlmIHRoZSBwYXRjaCBvbmx5IGNvbnRhaW5zOlxuLSBNb2RpZmljYXRpb25zIHRvIERvY3VtZW50YXRpb24vLCBLY29uZmlnIGZpbGVzLCBvciBjb2RlIGNvbW1lbnRzLlxuLSBQdXJlbHkgZGVjb3JhdGl2ZSBjaGFuZ2VzLCBzdWNoIGFzIGxvZ2dpbmcgKGUuZy4sIHByX2VyciwgcHJpbnRrKSBvciB0cmFjZXBvaW50cy5cbi0gQ2hhbmdlcyB0byBudW1lcmljIGNvbnN0YW50cyBvciBtYWNyb3MgdGhhdCBkbyBub3QgZnVuY3Rpb25hbGx5IGFsdGVyIGV4ZWN1dGlvbiBmbG93LlxuLSBDb2RlIHBhdGhzIHRoYXQgYXJlIGltcG9zc2libGUgdG8gcmVhY2ggaW4gdmlydHVhbGl6ZWQgZW52aXJvbm1lbnRzIGxpa2UgR0NFIG9yIFFFTVUsXG4gIGV2ZW4gd2hlbiB1dGlsaXppbmcgc29mdHdhcmUtZW11bGF0ZWQgaGFyZHdhcmUgKGUuZy4sIHVzYiBnYWRnZXQsIG1hYzgwMjExX2h3c2ltKS5cbi0gQ29kZSBpbiB2ZW5kb3Itc3BlY2lmaWMgUENJZSBzd2l0Y2gsIFNtYXJ0TklDLCBvciBHUFUgZHJpdmVycyAoZS5nLiwgbWx4c3csIHBkc19jb3JlLCBxZWQsXG4gIGlvbmljLCBhbWRncHUpIHRoYXQgcmVxdWlyZSBwaHlzaWNhbCBQQ0llIGhhcmR3YXJlIGNhcmRzIG5vdCBlbXVsYXRlZCBpbiBzdGFuZGFyZCBRRU1VLlxuLSBEcml2ZXIgLnJlbW92ZSwgLnNodXRkb3duLCBvciBwY2lfdW5yZWdpc3Rlcl9kcml2ZXIgdGVhcmRvd24gY2FsbGJhY2tzIChlLmcuLCBpZ2JfcmVtb3ZlKVxuICB0aGF0IGFyZSBleGVjdXRlZCBvbmx5IGR1cmluZyBQQ0kgaG90LXVucGx1ZyBvciBzeXNmcyBkcml2ZXIgdW5iaW5kIG9wZXJhdGlvbnMuXG5cbklmIGl0IG1vZGlmaWVzIHJlYWNoYWJsZSBjb3JlIGtlcm5lbCBsb2dpYywgZHJpdmVycywgb3IgYXJjaGl0ZWN0dXJlcywgdXNlIHlvdXIgY29kZSBzZWFyY2hcbnRvb2xzIHRvIHZlcmlmeSB0aGUgY29kZSBjYW4gYmUgZXhlY3V0ZWQsIHRoZW4gcmV0dXJuIFdvcnRoRnV6emluZz10cnVlLlxuXG5XaGVuIHJldHVybmluZyBXb3J0aEZ1enppbmc9dHJ1ZSwgeW91IE1VU1QgQUxTTzpcbjEuIEV4dHJhY3QgYW55IHNwZWNpZmljIGtlcm5lbCBmdW5jdGlvbnMgdGhhdCBzaG91bGQgYmUgaGVhdmlseSBmdXp6ZWQgaW50byBGb2N1c1N5bWJvbHMuXG4gICBBdm9pZCBsaXN0aW5nIGdlbmVyaWMgaG90LXBhdGggZnVuY3Rpb25zIHRvIHByZXZlbnQgc2tld2VkIHRlc3QgZGlzdHJpYnV0aW9ucy5cbiAgIFByZWZlciBub24tc3RhdGljLCBub24taW5saW5lZCBBUEkgZW50cnlwb2ludCBmdW5jdGlvbnMgb3ZlciBpbnRlcm5hbCBzdGF0aWMgaGVscGVyIGZ1bmN0aW9uc1xuICAgKHdoaWNoIGFyZSBpbmxpbmVkIGJ5IHRoZSBjb21waWxlciBhbmQgZG8gbm90IGhhdmUgZGlzdGluY3Qgc3ltYm9sIGFkZHJlc3NlcykuXG4yLiBJZGVudGlmeSBhbnkgc3BlY2lmaWMgQ09ORklHXyBvcHRpb25zIHJlcXVpcmVkIHRvIHByb3Blcmx5IHRlc3QgdGhpcyBuZXcvbW9kaWZpZWQgZmVhdHVyZS5cbiAgIEdvIGFuZCBsb29rIGludG8gdGhlIEtjb25maWcgZmlsZXMgYW5kIGNoZWNrIGZvciBpZmRlZnMgYXJvdW5kIHRoZSBjb2RlLCBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy5cbiAgIEFsc28gY2hlY2sgXCJkZXBlbmRzIG9uXCIgbGluZXMgaW4gS2NvbmZpZyB0byBpbmNsdWRlIGFueSBub24tc3RhbmRhcmQgcGFyZW50IHN1YnN5c3RlbSBjb25maWdzXG4gICBuZWVkZWQgZm9yIEtidWlsZCB0byBjb21waWxlIHRoZSBjb2RlIHN0YXRpY2FsbHkgaW50byB2bWxpbnV4LiBMaXN0IHRoZW0gaW4gdGhlIEVuYWJsZUNvbmZpZ3NcbiAgIG91dHB1dCBhcnJheSwgYW5kIERPIE5PVCBhZGQgYSAnQ09ORklHXycgcHJlZml4IChlLmcuLCByZXR1cm4gXCJORVRfSVBWNFwiIGluc3RlYWQgb2YgXCJDT05GSUdfTkVUX0lQVjRcIikuXG5QcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy5cblxuXG5Vc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLlxuSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuXG5JZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuXG4iLCJQcm9tcHQiOiJGb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczpcbmNvbW1pdCBlNWUyNDc4YTU2Yjk1MmE4YWM1ZjYyZDJlNjVhZjU4OGVjMzQyODY4XG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIEZyaSBBdWcgNyAyMTo1NDowNCAyMDI2ICswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL21tL2h1Z2VfbWVtb3J5LmMgYi9tbS9odWdlX21lbW9yeS5jXG5pbmRleCBjZWQ0MDBmNzJkNDNhLi4wZDcwZWUzMDE3YzQ2IDEwMDY0NFxuLS0tIGEvbW0vaHVnZV9tZW1vcnkuY1xuKysrIGIvbW0vaHVnZV9tZW1vcnkuY1xuQEAgLTM1ODksOSArMzU4OSw2IEBAIHN0YXRpYyB2b2lkIHJlbWFwX3BhZ2Uoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgbG9uZyBuciwgaW50IGZsYWdzKVxuIHtcbiBcdGludCBpID0gMDtcbiBcbi1cdC8qIElmIHVubWFwX2ZvbGlvKCkgdXNlcyB0cnlfdG9fbWlncmF0ZSgpIG9uIGZpbGUsIHJlbW92ZSB0aGlzIGNoZWNrICovXG4tXHRpZiAoIWZvbGlvX3Rlc3RfYW5vbihmb2xpbykpXG4tXHRcdHJldHVybjtcbiBcdGZvciAoOzspIHtcbiBcdFx0cmVtb3ZlX21pZ3JhdGlvbl9wdGVzKGZvbGlvLCBmb2xpbywgVFRVX1JNQVBfTE9DS0VEIHwgZmxhZ3MpO1xuIFx0XHRpICs9IGZvbGlvX25yX3BhZ2VzKGZvbGlvKTtcbkBAIC0zODAwLDYgKzM3OTcsNyBAQCBzdGF0aWMgaW50IF9fc3BsaXRfdW5tYXBwZWRfZm9saW8oc3RydWN0IGZvbGlvICpmb2xpbywgaW50IG5ld19vcmRlcixcbiBcdFx0c3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsIGVudW0gc3BsaXRfdHlwZSBzcGxpdF90eXBlKVxuIHtcbiBcdGNvbnN0IGJvb2wgaXNfYW5vbiA9IGZvbGlvX3Rlc3RfYW5vbihmb2xpbyk7XG4rXHRjb25zdCBib29sIGlzX3N3YXBjYWNoZSA9IGZvbGlvX3Rlc3Rfc3dhcGNhY2hlKGZvbGlvKTtcbiBcdGludCBvbGRfb3JkZXIgPSBmb2xpb19vcmRlcihmb2xpbyk7XG4gXHRpbnQgc3RhcnRfb3JkZXIgPSBzcGxpdF90eXBlID09IFNQTElUX1RZUEVfVU5JRk9STSA/IG5ld19vcmRlciA6IG9sZF9vcmRlciAtIDE7XG4gXHRzdHJ1Y3QgZm9saW8gKm9sZF9mb2xpbyA9IGZvbGlvO1xuQEAgLTM4MTQsOCArMzgxMiw4IEBAIHN0YXRpYyBpbnQgX19zcGxpdF91bm1hcHBlZF9mb2xpbyhzdHJ1Y3QgZm9saW8gKmZvbGlvLCBpbnQgbmV3X29yZGVyLFxuIFx0ICAgICBzcGxpdF9vcmRlci0tKSB7XG4gXHRcdGludCBucl9uZXdfZm9saW9zID0gMVVMIFx1MDAzY1x1MDAzYyAob2xkX29yZGVyIC0gc3BsaXRfb3JkZXIpO1xuIFxuLVx0XHQvKiBvcmRlci0xIGFub255bW91cyBmb2xpbyBpcyBub3Qgc3VwcG9ydGVkICovXG4tXHRcdGlmIChpc19hbm9uIFx1MDAyNlx1MDAyNiBzcGxpdF9vcmRlciA9PSAxKVxuK1x0XHQvKiBvcmRlci0xIGFub255bW91cyBvciBzd2FwY2FjaGUgZm9saW8gaXMgbm90IHN1cHBvcnRlZCAqL1xuK1x0XHRpZiAoKGlzX2Fub24gfHwgaXNfc3dhcGNhY2hlKSBcdTAwMjZcdTAwMjYgc3BsaXRfb3JkZXIgPT0gMSlcbiBcdFx0XHRjb250aW51ZTtcbiBcbiBcdFx0aWYgKG1hcHBpbmcpIHtcbkBAIC0zODc4LDMyICszODc2LDI2IEBAIHN0YXRpYyBpbnQgX19zcGxpdF91bm1hcHBlZF9mb2xpbyhzdHJ1Y3QgZm9saW8gKmZvbGlvLCBpbnQgbmV3X29yZGVyLFxuIGludCBmb2xpb19jaGVja19zcGxpdHRhYmxlKHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIsXG4gXHRcdFx0ICAgZW51bSBzcGxpdF90eXBlIHNwbGl0X3R5cGUpXG4ge1xuK1x0Ym9vbCBpc19hbm9uID0gZm9saW9fdGVzdF9hbm9uKGZvbGlvKTtcbitcdGJvb2wgaXNfc3dhcGNhY2hlID0gZm9saW9fdGVzdF9zd2FwY2FjaGUoZm9saW8pO1xuK1xuIFx0Vk1fV0FSTl9PTl9GT0xJTyghZm9saW9fdGVzdF9sb2NrZWQoZm9saW8pLCBmb2xpbyk7XG4gXHQvKlxuIFx0ICogRm9saW9zIHRoYXQganVzdCBnb3QgdHJ1bmNhdGVkIGNhbm5vdCBnZXQgc3BsaXQuIFNpZ25hbCB0byB0aGVcbi1cdCAqIGNhbGxlciB0aGF0IHRoZXJlIHdhcyBhIHJhY2UuXG4tXHQgKlxuLVx0ICogVE9ETzogdGhpcyB3aWxsIGFsc28gY3VycmVudGx5IHJlZnVzZSBmb2xpb3Mgd2l0aG91dCBhIG1hcHBpbmcgaW4gdGhlXG4tXHQgKiBzd2FwY2FjaGUgKHNobWVtIG9yIHRvLWJlLWFub24gZm9saW9zKS5cbitcdCAqIGNhbGxlciB0aGF0IHRoZXJlIHdhcyBhIHJhY2UuIEEgbWFwcGluZ2xlc3Mgc3dhcCBjYWNoZSBmb2xpb1xuK1x0ICogaGFzIG5vIHBhZ2UgY2FjaGUgZW50cmllcyB0byB1cGRhdGUsIHNvIGl0IGlzIGZpbmUgdG8gc3BsaXQuXG4gXHQgKi9cbi1cdGlmICghZm9saW8tXHUwMDNlbWFwcGluZyBcdTAwMjZcdTAwMjYgIWZvbGlvX3Rlc3RfYW5vbihmb2xpbykpXG4rXHRpZiAoIWZvbGlvLVx1MDAzZW1hcHBpbmcgXHUwMDI2XHUwMDI2ICFpc19zd2FwY2FjaGUpXG4gXHRcdHJldHVybiAtRUJVU1k7XG4gXG4tXHQvKiBvcmRlci0xIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIGFub255bW91cyBUSFAuICovXG4tXHRpZiAoZm9saW9fdGVzdF9hbm9uKGZvbGlvKSBcdTAwMjZcdTAwMjYgbmV3X29yZGVyID09IDEpXG4tXHRcdHJldHVybiAtRUlOVkFMO1xuLVxuIFx0Lypcbi1cdCAqIHN3YXBjYWNoZSBmb2xpbyBjb3VsZCBvbmx5IGJlIHNwbGl0IHRvIG9yZGVyIDBcbi1cdCAqXG4tXHQgKiBub24tdW5pZm9ybSBzcGxpdCBjcmVhdGVzIGFmdGVyLXNwbGl0IGZvbGlvcyB3aXRoIG9yZGVycyBmcm9tXG4tXHQgKiBmb2xpb19vcmRlcihmb2xpbykgLSAxIHRvIG5ld19vcmRlciwgbWFraW5nIGl0IG5vdCBzdWl0YWJsZSBmb3IgYW55XG4tXHQgKiBzd2FwY2FjaGUgZm9saW8gc3BsaXQuIE9ubHkgdW5pZm9ybSBzcGxpdCB0byBvcmRlci0wIGNhbiBiZSB1c2VkXG4tXHQgKiBoZXJlLlxuK1x0ICogT3JkZXItMSBpcyB1bnN1cHBvcnRlZDogYW5vbiBmb2xpb3MgbmVlZCBzdWJwYWdlIDIgZm9yIHRoZVxuK1x0ICogZGVmZXJyZWQgc3BsaXQgbGlzdCwgaHlicmlkIHNobWVtIFx1MDAyNiBzd2FwIGNhY2hlIGZvbGlvcyBhcmUgbm90XG4rXHQgKiBzcGxpdHRhYmxlLCBhbmQgYSBzcGxpdHRhYmxlIG1hcHBpbmdsZXNzIHN3YXAgY2FjaGUgZm9saW8gY291bGRcbitcdCAqIGJlIGVpdGhlciBhbm9uIG9yIHNobWVtLCB3aGljaCB3ZSBjYW5ub3QgdGVsbCBhcGFydC5cbiBcdCAqL1xuLVx0aWYgKChzcGxpdF90eXBlID09IFNQTElUX1RZUEVfTk9OX1VOSUZPUk0gfHwgbmV3X29yZGVyKSBcdTAwMjZcdTAwMjYgZm9saW9fdGVzdF9zd2FwY2FjaGUoZm9saW8pKSB7XG4rXHRpZiAoKGlzX2Fub24gfHwgaXNfc3dhcGNhY2hlKSBcdTAwMjZcdTAwMjYgbmV3X29yZGVyID09IDEpXG4gXHRcdHJldHVybiAtRUlOVkFMO1xuLVx0fVxuIFxuIFx0aWYgKGlzX2h1Z2VfemVyb19mb2xpbyhmb2xpbykpXG4gXHRcdHJldHVybiAtRUlOVkFMO1xuQEAgLTM5MTEsMzkgKzM5MDMsNzggQEAgaW50IGZvbGlvX2NoZWNrX3NwbGl0dGFibGUoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlcixcbiBcdGlmIChmb2xpb190ZXN0X3dyaXRlYmFjayhmb2xpbykpXG4gXHRcdHJldHVybiAtRUJVU1k7XG4gXG4rXHQvKlxuK1x0ICogQSBub24tYW5vbiBzd2FwY2FjaGUgZm9saW8gdGhhdCBzdGlsbCBoYXMgYSBtYXBwaW5nIHNob3VsZCBvbmx5XG4rXHQgKiBiZSBhIHNobWVtIGZvbGlvIHVuZGVyIElPLCB0aGVyZSBpcyBsaXR0bGUgYmVuZWZpdCBpbiBzcGxpdHRpbmdcbitcdCAqIHRoZW0gaGVuY2Ugbm90IHN1cHBvcnRlZC4gUmVqZWN0IGl0IGhlcmUgdXAgZnJvbnQ6IHRoZSBzcGxpdFxuK1x0ICogcm91dGluZSBjYW5ub3QgYmFjayBvdXQgY2xlYW5seSBvbmNlIHRoZSBmb2xpbyByZWYgaXMgZnJvemVuLlxuK1x0ICovXG4rXHRpZiAoIWlzX2Fub24gXHUwMDI2XHUwMDI2IGlzX3N3YXBjYWNoZSBcdTAwMjZcdTAwMjYgZm9saW8tXHUwMDNlbWFwcGluZylcbitcdFx0cmV0dXJuIC1FSU5WQUw7XG4rXG4gXHRyZXR1cm4gMDtcbiB9XG4gXG4tLyogTnVtYmVyIG9mIGZvbGlvIHJlZmVyZW5jZXMgZnJvbSB0aGUgcGFnZWNhY2hlIG9yIHRoZSBzd2FwY2FjaGUuICovXG4tc3RhdGljIHVuc2lnbmVkIGludCBmb2xpb19jYWNoZV9yZWZfY291bnQoY29uc3Qgc3RydWN0IGZvbGlvICpmb2xpbylcbisvKiBOdW1iZXIgb2YgZm9saW8gcmVmZXJlbmNlcyBmcm9tIHRoZSBzd2FwY2FjaGUuICovXG4rc3RhdGljIHVuc2lnbmVkIGludCBmb2xpb19zd2FwY2FjaGVfcmVmX2NvdW50KGNvbnN0IHN0cnVjdCBmb2xpbyAqZm9saW8pXG4ge1xuLVx0aWYgKGZvbGlvX3Rlc3RfYW5vbihmb2xpbykgXHUwMDI2XHUwMDI2ICFmb2xpb190ZXN0X3N3YXBjYWNoZShmb2xpbykpXG4rXHRpZiAoIWZvbGlvX3Rlc3Rfc3dhcGNhY2hlKGZvbGlvKSlcbiBcdFx0cmV0dXJuIDA7XG4gXHRyZXR1cm4gZm9saW9fbnJfcGFnZXMoZm9saW8pO1xuIH1cbiBcbi1zdGF0aWMgaW50IF9fZm9saW9fZnJlZXplX2FuZF9zcGxpdF91bm1hcHBlZChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyLFxuLVx0XHRcdFx0XHQgICAgIHN0cnVjdCBwYWdlICpzcGxpdF9hdCwgc3RydWN0IHhhX3N0YXRlICp4YXMsXG4tXHRcdFx0XHRcdCAgICAgc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsIGJvb2wgZG9fbHJ1LFxuLVx0XHRcdFx0XHQgICAgIHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QsIGVudW0gc3BsaXRfdHlwZSBzcGxpdF90eXBlLFxuLVx0XHRcdFx0XHQgICAgIHBnb2ZmX3QgZW5kLCBpbnQgKm5yX3NobWVtX2Ryb3BwZWQpXG4rc3RhdGljIGludCBfX2ZvbGlvX2ZyZWV6ZV9zcGxpdF91bm1hcChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyLFxuK1x0XHRcdFx0ICAgICAgc3RydWN0IHBhZ2UgKnNwbGl0X2F0LCBib29sIGRvX2xydSwgYm9vbCBhbm9uX3VubWFwLFxuK1x0XHRcdFx0ICAgICAgc3RydWN0IGxpc3RfaGVhZCAqbGlzdCwgZW51bSBzcGxpdF90eXBlIHNwbGl0X3R5cGUpXG4ge1xuIFx0c3RydWN0IGZvbGlvICplbmRfZm9saW8gPSBmb2xpb19uZXh0KGZvbGlvKTtcbi1cdHN0cnVjdCBmb2xpbyAqbmV3X2ZvbGlvLCAqbmV4dDtcbitcdGJvb2wgaXNfYW5vbiA9IGZvbGlvX3Rlc3RfYW5vbihmb2xpbyk7XG4rXHRzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpID0gTlVMTDtcbitcdHN0cnVjdCBmb2xpbyAqbmV3X2ZvbGlvO1xuIFx0aW50IG9sZF9vcmRlciA9IGZvbGlvX29yZGVyKGZvbGlvKTtcbitcdHN0cnVjdCBhbm9uX3ZtYSAqYW5vbl92bWEgPSBOVUxMO1xuK1x0ZW51bSB0dHVfZmxhZ3MgdHR1X2ZsYWdzID0gMDtcbiBcdHN0cnVjdCBsaXN0X2xydV9vbmUgKmxydTtcbitcdHN0cnVjdCBscnV2ZWMgKmxydXZlYztcbiBcdGJvb2wgZGVxdWV1ZV9kZWZlcnJlZDtcbiBcdGludCByZXQgPSAwO1xuIFxuLVx0Vk1fV0FSTl9PTl9PTkNFKCFtYXBwaW5nIFx1MDAyNlx1MDAyNiBlbmQpO1xuK1x0LypcbitcdCAqIFVubWFwL3JlbWFwIG5lZWRzIHRoZSBhbm9uX3ZtYS4gVGhlIGNhbGxlciBkb2VzIG5vdCBuZWNlc3NhcmlseVxuK1x0ICogaG9sZCBhbiBtbWFwX2xvY2sgdGhhdCB3b3VsZCBwcmV2ZW50IHRoZSBhbm9uX3ZtYSBmcm9tXG4rXHQgKiBkaXNhcHBlYXJpbmcsIHNvIHdlIGZpcnN0IHRha2UgYSByZWZlcmVuY2UgYW5kIGxvY2sgaXQuIFRoaXMgaXNcbitcdCAqIHNpbWlsYXIgdG8gZm9saW9fbG9ja19hbm9uX3ZtYV9yZWFkKCkgZXhjZXB0IHRoZSB3cml0ZSBsb2NrIGlzXG4rXHQgKiB0YWtlbiB0byBzZXJpYWxpemUgYWdhaW5zdCBwYXJhbGxlbCBzcGxpdCBvciBjb2xsYXBzZS5cbitcdCAqL1xuK1x0aWYgKGFub25fdW5tYXApIHtcbitcdFx0YW5vbl92bWEgPSBmb2xpb19nZXRfYW5vbl92bWEoZm9saW8pO1xuK1x0XHRpZiAoIWFub25fdm1hKVxuK1x0XHRcdHJldHVybiAtRUJVU1k7XG4rXHRcdGFub25fdm1hX2xvY2tfd3JpdGUoYW5vbl92bWEpO1xuK1x0fVxuK1xuK1x0LyogUmFjeSBjaGVjayBpZiB3ZSBjYW4gc3BsaXQgdGhlIHBhZ2UsIGJlZm9yZSB0aGUgb3B0aW9uYWwgdW5tYXAuICovXG4rXHRpZiAoZm9saW9fZXhwZWN0ZWRfcmVmX2NvdW50KGZvbGlvKSAhPSBmb2xpb19yZWZfY291bnQoZm9saW8pIC0gMSkge1xuK1x0XHRyZXQgPSAtRUFHQUlOO1xuK1x0XHRnb3RvIG91dF91bmxvY2s7XG4rXHR9XG4rXG4rXHRpZiAoYW5vbl91bm1hcClcbitcdFx0dW5tYXBfZm9saW8oZm9saW8pO1xuK1xuK1x0bG9jYWxfaXJxX2Rpc2FibGUoKTtcbitcbiBcdC8qXG4gXHQgKiBJZiB0aGlzIGZvbGlvIGNhbiBiZSBvbiB0aGUgZGVmZXJyZWQgc3BsaXQgcXVldWUsIGxvY2sgb3V0XG4gXHQgKiB0aGUgc2hyaW5rZXIgYmVmb3JlIGZyZWV6aW5nIHRoZSByZWYuIElmIHRoZSBzaHJpbmtlciBzZWVzXG4gXHQgKiBhIDAtcmVmIGZvbGlvLCBpdCBhc3N1bWVzIGl0IGJlYXQgZm9saW9fcHV0KCkgdG8gdGhlIGxpc3RcbiBcdCAqIGxvY2sgYW5kIG11c3QgY2xlYW4gdXAgdGhlIExSVSBzdGF0ZSAtIHRoZSBzYW1lIGRlcXVldWUgd2VcbiBcdCAqIHdpbGwgZG8gYmVsb3cgYXMgcGFydCBvZiB0aGUgc3BsaXQuXG4rXHQgKlxuK1x0ICogT25seSBhbm9uIGZvbGlvcyBhcmUgZXZlciBxdWV1ZWQgb24gdGhlIGRlZmVycmVkIHNwbGl0IGxpc3QsXG4rXHQgKiBzbyBub24tYW5vbiBmb2xpb3MgKG1hcHBpbmdsZXNzIHN3YXBjYWNoZSkgbmV2ZXIgbmVlZCBkZXF1ZXVpbmcuXG4gXHQgKi9cbi1cdGRlcXVldWVfZGVmZXJyZWQgPSBmb2xpb190ZXN0X2Fub24oZm9saW8pIFx1MDAyNlx1MDAyNiBvbGRfb3JkZXIgXHUwMDNlIDE7XG4rXHRkZXF1ZXVlX2RlZmVycmVkID0gb2xkX29yZGVyIFx1MDAzZSAxIFx1MDAyNlx1MDAyNiBpc19hbm9uO1xuIFx0aWYgKGRlcXVldWVfZGVmZXJyZWQpIHtcbiBcdFx0c3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnO1xuIFxuQEAgLTM5NTIsMTI4ICszOTgzLDI0MyBAQCBzdGF0aWMgaW50IF9fZm9saW9fZnJlZXplX2FuZF9zcGxpdF91bm1hcHBlZChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgblxuIFx0XHRscnUgPSBsaXN0X2xydV9sb2NrKFx1MDAyNmRlZmVycmVkX3NwbGl0X2xydSxcbiBcdFx0XHRcdCAgICBmb2xpb19uaWQoZm9saW8pLCBcdTAwMjZtZW1jZyk7XG4gXHR9XG4tXHRpZiAoZm9saW9fcmVmX2ZyZWV6ZShmb2xpbywgZm9saW9fY2FjaGVfcmVmX2NvdW50KGZvbGlvKSArIDEpKSB7XG4tXHRcdHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2kgPSBOVUxMO1xuLVx0XHRzdHJ1Y3QgbHJ1dmVjICpscnV2ZWM7XG4gXG4rXHRpZiAoIWZvbGlvX3JlZl9mcmVlemUoZm9saW8sIGZvbGlvX3N3YXBjYWNoZV9yZWZfY291bnQoZm9saW8pICsgMSkpIHtcbiBcdFx0aWYgKGRlcXVldWVfZGVmZXJyZWQpIHtcbi1cdFx0XHRfX2xpc3RfbHJ1X2RlbChcdTAwMjZkZWZlcnJlZF9zcGxpdF9scnUsIGxydSxcbi1cdFx0XHRcdCAgICAgICBcdTAwMjZmb2xpby1cdTAwM2VfZGVmZXJyZWRfbGlzdCwgZm9saW9fbmlkKGZvbGlvKSk7XG4tXHRcdFx0aWYgKGZvbGlvX3Rlc3RfcGFydGlhbGx5X21hcHBlZChmb2xpbykpIHtcbi1cdFx0XHRcdGZvbGlvX2NsZWFyX3BhcnRpYWxseV9tYXBwZWQoZm9saW8pO1xuLVx0XHRcdFx0bW9kX210aHBfc3RhdChvbGRfb3JkZXIsXG4tXHRcdFx0XHRcdE1USFBfU1RBVF9OUl9BTk9OX1BBUlRJQUxMWV9NQVBQRUQsIC0xKTtcbi1cdFx0XHR9XG4gXHRcdFx0bGlzdF9scnVfdW5sb2NrKGxydSk7XG4gXHRcdFx0cmN1X3JlYWRfdW5sb2NrKCk7XG4gXHRcdH1cbitcdFx0cmV0ID0gLUVBR0FJTjtcbitcdFx0Z290byBvdXRfbm9fc3BsaXQ7XG4rXHR9XG4gXG4tXHRcdGlmIChtYXBwaW5nKSB7XG4tXHRcdFx0aW50IG5yID0gZm9saW9fbnJfcGFnZXMoZm9saW8pO1xuLVxuLVx0XHRcdGlmIChmb2xpb190ZXN0X3BtZF9tYXBwYWJsZShmb2xpbykgXHUwMDI2XHUwMDI2XG4tXHRcdFx0ICAgIG5ld19vcmRlciBcdTAwM2MgSFBBR0VfUE1EX09SREVSKSB7XG4tXHRcdFx0XHRpZiAoZm9saW9fdGVzdF9zd2FwYmFja2VkKGZvbGlvKSkge1xuLVx0XHRcdFx0XHRscnV2ZWNfc3RhdF9tb2RfZm9saW8oZm9saW8sXG4tXHRcdFx0XHRcdFx0XHROUl9TSE1FTV9USFBTLCAtbnIpO1xuLVx0XHRcdFx0fSBlbHNlIHtcbi1cdFx0XHRcdFx0bHJ1dmVjX3N0YXRfbW9kX2ZvbGlvKGZvbGlvLFxuLVx0XHRcdFx0XHRcdFx0TlJfRklMRV9USFBTLCAtbnIpO1xuLVx0XHRcdFx0fVxuLVx0XHRcdH1cbitcdGlmIChkZXF1ZXVlX2RlZmVycmVkKSB7XG4rXHRcdF9fbGlzdF9scnVfZGVsKFx1MDAyNmRlZmVycmVkX3NwbGl0X2xydSwgbHJ1LFxuK1x0XHRcdCAgICAgICBcdTAwMjZmb2xpby1cdTAwM2VfZGVmZXJyZWRfbGlzdCwgZm9saW9fbmlkKGZvbGlvKSk7XG4rXHRcdGlmIChmb2xpb190ZXN0X3BhcnRpYWxseV9tYXBwZWQoZm9saW8pKSB7XG4rXHRcdFx0Zm9saW9fY2xlYXJfcGFydGlhbGx5X21hcHBlZChmb2xpbyk7XG4rXHRcdFx0bW9kX210aHBfc3RhdChvbGRfb3JkZXIsXG4rXHRcdFx0XHQgICAgICBNVEhQX1NUQVRfTlJfQU5PTl9QQVJUSUFMTFlfTUFQUEVELCAtMSk7XG4gXHRcdH1cbitcdFx0bGlzdF9scnVfdW5sb2NrKGxydSk7XG4rXHRcdHJjdV9yZWFkX3VubG9jaygpO1xuK1x0fVxuIFxuLVx0XHRpZiAoZm9saW9fdGVzdF9zd2FwY2FjaGUoZm9saW8pKSB7XG4tXHRcdFx0aWYgKG1hcHBpbmcpIHtcbi1cdFx0XHRcdFZNX1dBUk5fT05fT05DRV9GT0xJTyhtYXBwaW5nLCBmb2xpbyk7XG4tXHRcdFx0XHRyZXR1cm4gLUVJTlZBTDtcbi1cdFx0XHR9XG4rXHRpZiAoZm9saW9fdGVzdF9zd2FwY2FjaGUoZm9saW8pKVxuK1x0XHRjaSA9IHN3YXBfY2x1c3Rlcl9nZXRfYW5kX2xvY2soZm9saW8pO1xuIFxuLVx0XHRcdGNpID0gc3dhcF9jbHVzdGVyX2dldF9hbmRfbG9jayhmb2xpbyk7XG4tXHRcdH1cbitcdGlmIChkb19scnUpXG4rXHRcdGxydXZlYyA9IGZvbGlvX2xydXZlY19sb2NrKGZvbGlvKTtcbitcbitcdHJldCA9IF9fc3BsaXRfdW5tYXBwZWRfZm9saW8oZm9saW8sIG5ld19vcmRlciwgc3BsaXRfYXQsIE5VTEwsXG4rXHRcdFx0XHQgICAgIE5VTEwsIHNwbGl0X3R5cGUpO1xuIFxuLVx0XHQvKiBsb2NrIGxydSBsaXN0L1BhZ2VDb21wb3VuZCwgcmVmIGZyb3plbiBieSBwYWdlX3JlZl9mcmVlemUgKi9cbitcdC8qXG4rXHQgKiBVbmZyZWV6ZSB0aGUgYWZ0ZXItc3BsaXQgZm9saW9zIGFuZCBwdXQgdGhlbSBiYWNrIHRvIHRoZSByaWdodFxuK1x0ICogcGxhY2UsIGtlZXBpbmcgdGhlIGhlYWQgQGZvbGlvIGZyb3plbiB1bnRpbCB0aGUgZW5kLiBXaGlsZSB0aGVcbitcdCAqIGZvbGlvIGlzIGluIHRoZSBzd2FwIGNhY2hlLCB0aGUgc3ViIGVudHJpZXMgbXVzdCBiZSB1cGRhdGVkIHdpdGhcbitcdCAqIHRoZWlyIGFmdGVyLXNwbGl0IGZvbGlvcyBiZWZvcmUgdGhlIGhlYWQgaXMgdW5mcm96ZW4sIHNvIGFcbitcdCAqIGNvbmN1cnJlbnQgc3dhcF9jYWNoZV9nZXRfZm9saW8oKSBjYW5ub3QgcmV0dXJuIHRoZSBoZWFkIGZvbGlvXG4rXHQgKiBmb3IgYSBzdWIgZW50cnkuIEtlZXBpbmcgdGhlIGhlYWQgZnJvemVuIHRocm91Z2hvdXQgYWxzbyBzdG9wcyBhXG4rXHQgKiBwYXJhbGxlbCBmb2xpb190cnlfZ2V0KCkgZnJvbSBvYnNlcnZpbmcgYSBwYXJ0aWFsbHkgc3BsaXQgZm9saW8uXG4rXHQgKi9cbitcdGZvciAobmV3X2ZvbGlvID0gZm9saW9fbmV4dChmb2xpbyk7IG5ld19mb2xpbyAhPSBlbmRfZm9saW87XG4rXHQgICAgIG5ld19mb2xpbyA9IGZvbGlvX25leHQobmV3X2ZvbGlvKSkge1xuK1x0XHR6b25lX2RldmljZV9wcml2YXRlX3NwbGl0X2NiKGZvbGlvLCBuZXdfZm9saW8pO1xuK1x0XHRmb2xpb19yZWZfdW5mcmVlemUobmV3X2ZvbGlvLFxuK1x0XHRcdFx0ICAgZm9saW9fc3dhcGNhY2hlX3JlZl9jb3VudChuZXdfZm9saW8pICsgMSk7XG4gXHRcdGlmIChkb19scnUpXG4tXHRcdFx0bHJ1dmVjID0gZm9saW9fbHJ1dmVjX2xvY2soZm9saW8pO1xuK1x0XHRcdGxydV9hZGRfc3BsaXRfZm9saW8oZm9saW8sIG5ld19mb2xpbywgbHJ1dmVjLCBsaXN0KTtcbitcdFx0aWYgKGNpKVxuK1x0XHRcdF9fc3dhcF9jYWNoZV9yZXBsYWNlX2ZvbGlvKGNpLCBmb2xpbywgbmV3X2ZvbGlvKTtcbitcdH1cbiBcbi1cdFx0cmV0ID0gX19zcGxpdF91bm1hcHBlZF9mb2xpbyhmb2xpbywgbmV3X29yZGVyLCBzcGxpdF9hdCwgeGFzLFxuLVx0XHRcdFx0XHQgICAgIG1hcHBpbmcsIHNwbGl0X3R5cGUpO1xuK1x0em9uZV9kZXZpY2VfcHJpdmF0ZV9zcGxpdF9jYihmb2xpbywgTlVMTCk7XG4rXHRmb2xpb19yZWZfdW5mcmVlemUoZm9saW8sIGZvbGlvX3N3YXBjYWNoZV9yZWZfY291bnQoZm9saW8pICsgMSk7XG4gXG4tXHRcdC8qXG4tXHRcdCAqIFVuZnJlZXplIGFmdGVyLXNwbGl0IGZvbGlvcyBhbmQgcHV0IHRoZW0gYmFjayB0byB0aGUgcmlnaHRcbi1cdFx0ICogbGlzdC4gQGZvbGlvIHNob3VsZCBiZSBrZXB0IGZyb3pvbiB1bnRpbCBwYWdlIGNhY2hlXG4tXHRcdCAqIGVudHJpZXMgYXJlIHVwZGF0ZWQgd2l0aCBhbGwgdGhlIG90aGVyIGFmdGVyLXNwbGl0IGZvbGlvc1xuLVx0XHQgKiB0byBwcmV2ZW50IG90aGVycyBzZWVpbmcgc3RhbGUgcGFnZSBjYWNoZSBlbnRyaWVzLlxuLVx0XHQgKiBBcyBhIHJlc3VsdCwgbmV3X2ZvbGlvIHN0YXJ0cyBmcm9tIHRoZSBuZXh0IGZvbGlvIG9mXG4tXHRcdCAqIEBmb2xpby5cbi1cdFx0ICovXG4tXHRcdGZvciAobmV3X2ZvbGlvID0gZm9saW9fbmV4dChmb2xpbyk7IG5ld19mb2xpbyAhPSBlbmRfZm9saW87XG4tXHRcdCAgICAgbmV3X2ZvbGlvID0gbmV4dCkge1xuLVx0XHRcdHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMgPSBmb2xpb19ucl9wYWdlcyhuZXdfZm9saW8pO1xuK1x0aWYgKGRvX2xydSlcbitcdFx0bHJ1dmVjX3VubG9jayhscnV2ZWMpO1xuK1x0aWYgKGNpKVxuK1x0XHRzd2FwX2NsdXN0ZXJfdW5sb2NrKGNpKTtcbitvdXRfbm9fc3BsaXQ6XG4rXHRsb2NhbF9pcnFfZW5hYmxlKCk7XG4rXHRpZiAoYW5vbl91bm1hcCkge1xuK1x0XHRpZiAoIXJldCBcdTAwMjZcdTAwMjYgIWZvbGlvX2lzX2RldmljZV9wcml2YXRlKGZvbGlvKSlcbitcdFx0XHR0dHVfZmxhZ3MgPSBUVFVfVVNFX1NIQVJFRF9aRVJPUEFHRTtcbitcdFx0cmVtYXBfcGFnZShmb2xpbywgMSBcdTAwM2NcdTAwM2Mgb2xkX29yZGVyLCB0dHVfZmxhZ3MpO1xuK1x0fVxuK291dF91bmxvY2s6XG4rXHRpZiAoYW5vbl91bm1hcCkge1xuK1x0XHRhbm9uX3ZtYV91bmxvY2tfd3JpdGUoYW5vbl92bWEpO1xuK1x0XHRwdXRfYW5vbl92bWEoYW5vbl92bWEpO1xuK1x0fVxuIFxuLVx0XHRcdG5leHQgPSBmb2xpb19uZXh0KG5ld19mb2xpbyk7XG4rXHRyZXR1cm4gcmV0O1xuK31cbiBcbi1cdFx0XHR6b25lX2RldmljZV9wcml2YXRlX3NwbGl0X2NiKGZvbGlvLCBuZXdfZm9saW8pO1xuK3N0YXRpYyBpbnQgX19mb2xpb19mcmVlemVfc3BsaXRfdW5tYXBfZmlsZShzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyLFxuK1x0XHRcdFx0XHQgICBzdHJ1Y3QgcGFnZSAqc3BsaXRfYXQsIGJvb2wgZG9fbHJ1LFxuK1x0XHRcdFx0XHQgICBzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LCBlbnVtIHNwbGl0X3R5cGUgc3BsaXRfdHlwZSlcbit7XG4rXHRzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyA9IGZvbGlvLVx1MDAzZW1hcHBpbmc7XG4rXHRYQV9TVEFURSh4YXMsIFx1MDAyNm1hcHBpbmctXHUwMDNlaV9wYWdlcywgZm9saW8tXHUwMDNlaW5kZXgpO1xuK1x0c3RydWN0IGZvbGlvICplbmRfZm9saW8gPSBmb2xpb19uZXh0KGZvbGlvKTtcbitcdGxvbmcgb2xkX25yX3BhZ2VzID0gZm9saW9fbnJfcGFnZXMoZm9saW8pO1xuK1x0c3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLCAqb2xkX21lbWNnO1xuK1x0c3RydWN0IGZvbGlvICpuZXdfZm9saW8sICpuZXh0O1xuK1x0aW50IG5yX3NobWVtX2Ryb3BwZWQgPSAwO1xuK1x0dW5zaWduZWQgaW50IG1pbl9vcmRlcjtcbitcdHN0cnVjdCBscnV2ZWMgKmxydXZlYztcbitcdHBnb2ZmX3QgZW5kID0gMDtcbitcdGdmcF90IGdmcDtcbitcdGludCByZXQgPSAwO1xuIFxuLVx0XHRcdGZvbGlvX3JlZl91bmZyZWV6ZShuZXdfZm9saW8sXG4tXHRcdFx0XHRcdCAgIGZvbGlvX2NhY2hlX3JlZl9jb3VudChuZXdfZm9saW8pICsgMSk7XG4rXHRtaW5fb3JkZXIgPSBtYXBwaW5nX21pbl9mb2xpb19vcmRlcihtYXBwaW5nKTtcbitcdGlmIChuZXdfb3JkZXIgXHUwMDNjIG1pbl9vcmRlcilcbitcdFx0cmV0dXJuIC1FSU5WQUw7XG4gXG4tXHRcdFx0aWYgKGRvX2xydSlcbi1cdFx0XHRcdGxydV9hZGRfc3BsaXRfZm9saW8oZm9saW8sIG5ld19mb2xpbywgbHJ1dmVjLCBsaXN0KTtcbitcdC8qXG4rXHQgKiBTd2l0Y2ggdG8gZm9saW8ncyBtZW1jZyBhcyB4YXJyYXkgbm9kZSBhbGxvY2F0aW9uIGNhbiBoYXBwZW4gYW5kXG4rXHQgKiBuZWVkcyB0byBjaGFyZ2UgdG8gaXQuXG4rXHQgKi9cbitcdG1lbWNnID0gZ2V0X21lbV9jZ3JvdXBfZnJvbV9mb2xpbyhmb2xpbyk7XG4rXHRvbGRfbWVtY2cgPSBzZXRfYWN0aXZlX21lbWNnKG1lbWNnKTtcbiBcbi1cdFx0XHQvKlxuLVx0XHRcdCAqIEFub255bW91cyBmb2xpbyB3aXRoIHN3YXAgY2FjaGUuXG4tXHRcdFx0ICogTk9URTogc2htZW0gaW4gc3dhcCBjYWNoZSBpcyBub3Qgc3VwcG9ydGVkIHlldC5cbi1cdFx0XHQgKi9cbi1cdFx0XHRpZiAoY2kpIHtcbi1cdFx0XHRcdF9fc3dhcF9jYWNoZV9yZXBsYWNlX2ZvbGlvKGNpLCBmb2xpbywgbmV3X2ZvbGlvKTtcbi1cdFx0XHRcdGNvbnRpbnVlO1xuLVx0XHRcdH1cbitcdGdmcCA9IGN1cnJlbnRfZ2ZwX2NvbnRleHQobWFwcGluZ19nZnBfbWFzayhtYXBwaW5nKSBcdTAwMjYgR0ZQX1JFQ0xBSU1fTUFTSyk7XG4rXHRpZiAoIWZpbGVtYXBfcmVsZWFzZV9mb2xpbyhmb2xpbywgZ2ZwKSkge1xuK1x0XHRyZXQgPSAtRUJVU1k7XG4rXHRcdGdvdG8gZmFpbF9mcmVlO1xuK1x0fVxuIFxuLVx0XHRcdC8qIEFub255bW91cyBmb2xpbyB3aXRob3V0IHN3YXAgY2FjaGUgKi9cbi1cdFx0XHRpZiAoIW1hcHBpbmcpXG4tXHRcdFx0XHRjb250aW51ZTtcbitcdG1hcHBpbmdfc2V0X3VwZGF0ZShcdTAwMjZ4YXMsIG1hcHBpbmcpO1xuIFxuLVx0XHRcdC8qIEFkZCB0aGUgbmV3IGZvbGlvIHRvIHRoZSBwYWdlIGNhY2hlLiAqL1xuLVx0XHRcdGlmIChuZXdfZm9saW8tXHUwMDNlaW5kZXggXHUwMDNjIGVuZCkge1xuLVx0XHRcdFx0X194YV9zdG9yZShcdTAwMjZtYXBwaW5nLVx1MDAzZWlfcGFnZXMsIG5ld19mb2xpby1cdTAwM2VpbmRleCxcbi1cdFx0XHRcdFx0ICAgbmV3X2ZvbGlvLCAwKTtcbi1cdFx0XHRcdGNvbnRpbnVlO1xuLVx0XHRcdH1cbitcdGlmIChzcGxpdF90eXBlID09IFNQTElUX1RZUEVfVU5JRk9STSkge1xuK1x0XHRpbnQgb2xkX29yZGVyID0gZm9saW9fb3JkZXIoZm9saW8pO1xuIFxuLVx0XHRcdFZNX1dBUk5fT05fT05DRSghbnJfc2htZW1fZHJvcHBlZCk7XG4tXHRcdFx0LyogRHJvcCBmb2xpbyBiZXlvbmQgRU9GOiAtXHUwMDNlaW5kZXggXHUwMDNlPSBlbmQgKi9cbi1cdFx0XHRpZiAoc2htZW1fbWFwcGluZyhtYXBwaW5nKSBcdTAwMjZcdTAwMjYgbnJfc2htZW1fZHJvcHBlZClcbi1cdFx0XHRcdCpucl9zaG1lbV9kcm9wcGVkICs9IG5yX3BhZ2VzO1xuLVx0XHRcdGVsc2UgaWYgKGZvbGlvX3Rlc3RfY2xlYXJfZGlydHkobmV3X2ZvbGlvKSlcbi1cdFx0XHRcdGZvbGlvX2FjY291bnRfY2xlYW5lZChcbi1cdFx0XHRcdFx0bmV3X2ZvbGlvLCBpbm9kZV90b193YihtYXBwaW5nLVx1MDAzZWhvc3QpKTtcbi1cdFx0XHRfX2ZpbGVtYXBfcmVtb3ZlX2ZvbGlvKG5ld19mb2xpbywgTlVMTCk7XG4tXHRcdFx0Zm9saW9fcHV0X3JlZnMobmV3X2ZvbGlvLCBucl9wYWdlcyk7XG4rXHRcdHhhc19zZXRfb3JkZXIoXHUwMDI2eGFzLCBmb2xpby1cdTAwM2VpbmRleCwgbmV3X29yZGVyKTtcbitcdFx0eGFzX3NwbGl0X2FsbG9jKFx1MDAyNnhhcywgZm9saW8sIG9sZF9vcmRlciwgZ2ZwKTtcbitcdFx0aWYgKHhhc19lcnJvcihcdTAwMjZ4YXMpKSB7XG4rXHRcdFx0cmV0ID0geGFzX2Vycm9yKFx1MDAyNnhhcyk7XG4rXHRcdFx0Z290byBmYWlsX2ZyZWU7XG4gXHRcdH1cbitcdH1cbiBcbi1cdFx0em9uZV9kZXZpY2VfcHJpdmF0ZV9zcGxpdF9jYihmb2xpbywgTlVMTCk7XG4tXHRcdC8qXG4tXHRcdCAqIFVuZnJlZXplIEBmb2xpbyBvbmx5IGFmdGVyIGFsbCBwYWdlIGNhY2hlIGVudHJpZXMsIHdoaWNoXG4tXHRcdCAqIHVzZWQgdG8gcG9pbnQgdG8gaXQsIGhhdmUgYmVlbiB1cGRhdGVkIHdpdGggbmV3IGZvbGlvcy5cbi1cdFx0ICogT3RoZXJ3aXNlLCBhIHBhcmFsbGVsIGZvbGlvX3RyeV9nZXQoKSBjYW4gZ3JhYiBAZm9saW9cbi1cdFx0ICogYW5kIGl0cyBjYWxsZXIgY2FuIHNlZSBzdGFsZSBwYWdlIGNhY2hlIGVudHJpZXMuXG4tXHRcdCAqL1xuLVx0XHRmb2xpb19yZWZfdW5mcmVlemUoZm9saW8sIGZvbGlvX2NhY2hlX3JlZl9jb3VudChmb2xpbykgKyAxKTtcbitcdGlfbW1hcF9sb2NrX3JlYWQobWFwcGluZyk7XG4rXG4rXHQvKiBSYWN5IGNoZWNrIGlmIHdlIGNhbiBzcGxpdCB0aGUgcGFnZSwgYmVmb3JlIHVubWFwX2ZvbGlvKCkgKi9cbitcdGlmIChmb2xpb19leHBlY3RlZF9yZWZfY291bnQoZm9saW8pICE9IGZvbGlvX3JlZl9jb3VudChmb2xpbykgLSAxKSB7XG4rXHRcdHJldCA9IC1FQUdBSU47XG4rXHRcdGdvdG8gZmFpbF9tbWFwX3VubG9jaztcbitcdH1cbitcbitcdC8qXG4rXHQgKl9fc3BsaXRfdW5tYXBwZWRfZm9saW8oKSBtYXkgbmVlZCB0byB0cmltIG9mZiBwYWdlcyBiZXlvbmRcbitcdCAqIEVPRjogYnV0IG9uIDMyLWJpdCwgaV9zaXplX3JlYWQoKSB0YWtlcyBhbiBpcnEtdW5zYWZlXG4rXHQgKiBzZXFsb2NrLCB3aGljaCBjYW5ub3QgYmUgbmVzdGVkIGluc2lkZSB0aGUgcGFnZSB0cmVlIGxvY2suXG4rXHQgKiBTbyBub3RlIGVuZCBub3c6IGlfc2l6ZSBpdHNlbGYgbWF5IGJlIGNoYW5nZWQgYXQgYW55IG1vbWVudCxcbitcdCAqIGJ1dCBmb2xpbyBsb2NrIGlzIGdvb2QgZW5vdWdoIHRvIHNlcmlhbGl6ZSB0aGUgdHJpbW1pbmcuXG4rXHQgKi9cbitcdGVuZCA9IERJVl9ST1VORF9VUChpX3NpemVfcmVhZChtYXBwaW5nLVx1MDAzZWhvc3QpLCBQQUdFX1NJWkUpO1xuK1x0aWYgKHNobWVtX21hcHBpbmcobWFwcGluZykpXG4rXHRcdGVuZCA9IHNobWVtX2ZhbGxvY2VuZChtYXBwaW5nLVx1MDAzZWhvc3QsIGVuZCk7XG4rXG4rXHR1bm1hcF9mb2xpbyhmb2xpbyk7XG4rXG4rXHR4YXNfbG9ja19pcnEoXHUwMDI2eGFzKTtcbitcbitcdC8qXG4rXHQgKiBDaGVjayBpZiB0aGUgZm9saW8gaXMgcHJlc2VudCBpbiBwYWdlIGNhY2hlLlxuK1x0ICogV2UgYXNzdW1lIGFsbCB0YWlsIGFyZSBwcmVzZW50IHRvbywgaWYgZm9saW8gaXMgdGhlcmUuXG4rXHQgKi9cbitcdGlmICh4YXNfbG9hZChcdTAwMjZ4YXMpICE9IGZvbGlvKSB7XG4rXHRcdHJldCA9IC1FQUdBSU47XG4rXHRcdGdvdG8gZmFpbDtcbitcdH1cbitcbitcdGlmICghZm9saW9fcmVmX2ZyZWV6ZShmb2xpbywgb2xkX25yX3BhZ2VzICsgMSkpIHtcbitcdFx0cmV0ID0gLUVBR0FJTjtcbitcdFx0Z290byBmYWlsO1xuK1x0fVxuK1xuK1x0aWYgKGZvbGlvX3Rlc3RfcG1kX21hcHBhYmxlKGZvbGlvKSBcdTAwMjZcdTAwMjYgbmV3X29yZGVyIFx1MDAzYyBIUEFHRV9QTURfT1JERVIpIHtcbitcdFx0aWYgKGZvbGlvX3Rlc3Rfc3dhcGJhY2tlZChmb2xpbykpXG4rXHRcdFx0bHJ1dmVjX3N0YXRfbW9kX2ZvbGlvKGZvbGlvLCBOUl9TSE1FTV9USFBTLCAtb2xkX25yX3BhZ2VzKTtcbitcdFx0ZWxzZVxuK1x0XHRcdGxydXZlY19zdGF0X21vZF9mb2xpbyhmb2xpbywgTlJfRklMRV9USFBTLCAtb2xkX25yX3BhZ2VzKTtcbitcdH1cbitcbitcdC8qIGxvY2sgbHJ1IGxpc3QvUGFnZUNvbXBvdW5kLCByZWYgZnJvemVuIGJ5IHBhZ2VfcmVmX2ZyZWV6ZSAqL1xuK1x0aWYgKGRvX2xydSlcbitcdFx0bHJ1dmVjID0gZm9saW9fbHJ1dmVjX2xvY2soZm9saW8pO1xuK1xuK1x0cmV0ID0gX19zcGxpdF91bm1hcHBlZF9mb2xpbyhmb2xpbywgbmV3X29yZGVyLCBzcGxpdF9hdCwgXHUwMDI2eGFzLFxuK1x0XHRcdFx0ICAgICBtYXBwaW5nLCBzcGxpdF90eXBlKTtcbitcbitcdC8qXG4rXHQgKiBVbmZyZWV6ZSBhZnRlci1zcGxpdCBmb2xpb3MgYW5kIHB1dCB0aGVtIGJhY2sgdG8gdGhlIHJpZ2h0XG4rXHQgKiBsaXN0LiBAZm9saW8gc2hvdWxkIGJlIGtlcHQgZnJvemVuIHVudGlsIHBhZ2UgY2FjaGVcbitcdCAqIGVudHJpZXMgYXJlIHVwZGF0ZWQgd2l0aCBhbGwgdGhlIG90aGVyIGFmdGVyLXNwbGl0IGZvbGlvc1xuK1x0ICogdG8gcHJldmVudCBvdGhlcnMgc2VlaW5nIHN0YWxlIHBhZ2UgY2FjaGUgZW50cmllcy5cbitcdCAqIEFzIGEgcmVzdWx0LCBuZXdfZm9saW8gc3RhcnRzIGZyb20gdGhlIG5leHQgZm9saW8gb2ZcbitcdCAqIEBmb2xpby5cbitcdCAqL1xuK1x0Zm9yIChuZXdfZm9saW8gPSBmb2xpb19uZXh0KGZvbGlvKTsgbmV3X2ZvbGlvICE9IGVuZF9mb2xpbztcbitcdCAgICAgbmV3X2ZvbGlvID0gbmV4dCkge1xuK1x0XHR1bnNpZ25lZCBsb25nIG5yX3BhZ2VzID0gZm9saW9fbnJfcGFnZXMobmV3X2ZvbGlvKTtcbitcbitcdFx0bmV4dCA9IGZvbGlvX25leHQobmV3X2ZvbGlvKTtcbitcbitcdFx0Zm9saW9fcmVmX3VuZnJlZXplKG5ld19mb2xpbyxcbitcdFx0XHRcdCAgIGZvbGlvX25yX3BhZ2VzKG5ld19mb2xpbykgKyAxKTtcbiBcbiBcdFx0aWYgKGRvX2xydSlcbi1cdFx0XHRscnV2ZWNfdW5sb2NrKGxydXZlYyk7XG4rXHRcdFx0bHJ1X2FkZF9zcGxpdF9mb2xpbyhmb2xpbywgbmV3X2ZvbGlvLCBscnV2ZWMsIGxpc3QpO1xuIFxuLVx0XHRpZiAoY2kpXG4tXHRcdFx0c3dhcF9jbHVzdGVyX3VubG9jayhjaSk7XG4tXHR9IGVsc2Uge1xuLVx0XHRpZiAoZGVxdWV1ZV9kZWZlcnJlZCkge1xuLVx0XHRcdGxpc3RfbHJ1X3VubG9jayhscnUpO1xuLVx0XHRcdHJjdV9yZWFkX3VubG9jaygpO1xuK1x0XHQvKiBBZGQgdGhlIG5ldyBmb2xpbyB0byB0aGUgcGFnZSBjYWNoZS4gKi9cbitcdFx0aWYgKG5ld19mb2xpby1cdTAwM2VpbmRleCBcdTAwM2MgZW5kKSB7XG4rXHRcdFx0X194YV9zdG9yZShcdTAwMjZtYXBwaW5nLVx1MDAzZWlfcGFnZXMsIG5ld19mb2xpby1cdTAwM2VpbmRleCxcbitcdFx0XHRcdCAgIG5ld19mb2xpbywgMCk7XG4rXHRcdFx0Y29udGludWU7XG4gXHRcdH1cbi1cdFx0cmV0dXJuIC1FQUdBSU47XG4rXG4rXHRcdC8qIERyb3AgZm9saW8gYmV5b25kIEVPRjogLVx1MDAzZWluZGV4IFx1MDAzZT0gZW5kICovXG4rXHRcdGlmIChzaG1lbV9tYXBwaW5nKG1hcHBpbmcpKVxuK1x0XHRcdG5yX3NobWVtX2Ryb3BwZWQgKz0gbnJfcGFnZXM7XG4rXHRcdGVsc2UgaWYgKGZvbGlvX3Rlc3RfY2xlYXJfZGlydHkobmV3X2ZvbGlvKSlcbitcdFx0XHRmb2xpb19hY2NvdW50X2NsZWFuZWQobmV3X2ZvbGlvLFxuK1x0XHRcdFx0XHQgICAgICBpbm9kZV90b193YihtYXBwaW5nLVx1MDAzZWhvc3QpKTtcbitcdFx0X19maWxlbWFwX3JlbW92ZV9mb2xpbyhuZXdfZm9saW8sIE5VTEwpO1xuK1x0XHRmb2xpb19wdXRfcmVmcyhuZXdfZm9saW8sIG5yX3BhZ2VzKTtcbiBcdH1cbiBcbitcdC8qXG4rXHQgKiBVbmZyZWV6ZSBAZm9saW8gb25seSBhZnRlciBhbGwgcGFnZSBjYWNoZSBlbnRyaWVzLCB3aGljaFxuK1x0ICogdXNlZCB0byBwb2ludCB0byBpdCwgaGF2ZSBiZWVuIHVwZGF0ZWQgd2l0aCBuZXcgZm9saW9zLlxuK1x0ICogT3RoZXJ3aXNlLCBhIHBhcmFsbGVsIGZvbGlvX3RyeV9nZXQoKSBjYW4gZ3JhYiBAZm9saW9cbitcdCAqIGFuZCBpdHMgY2FsbGVyIGNhbiBzZWUgc3RhbGUgcGFnZSBjYWNoZSBlbnRyaWVzLlxuK1x0ICovXG4rXHRmb2xpb19yZWZfdW5mcmVlemUoZm9saW8sIGZvbGlvX25yX3BhZ2VzKGZvbGlvKSArIDEpO1xuK1xuK1x0aWYgKGRvX2xydSlcbitcdFx0bHJ1dmVjX3VubG9jayhscnV2ZWMpO1xuK1xuK2ZhaWw6XG4rXHR4YXNfdW5sb2NrX2lycShcdTAwMjZ4YXMpO1xuK2ZhaWxfbW1hcF91bmxvY2s6XG4rXHRpZiAobnJfc2htZW1fZHJvcHBlZClcbitcdFx0c2htZW1fdW5jaGFyZ2UobWFwcGluZy1cdTAwM2Vob3N0LCBucl9zaG1lbV9kcm9wcGVkKTtcbitcdC8qXG4rXHQgKiBEcm9wIHRoZSBtYXBwaW5nIHdoaWxlIHRoZSBpbm9kZSBpcyBzdGlsbCBwaW5uZWQuIEBmb2xpbyBzdGF5c1xuK1x0ICogbG9ja2VkIGFuZCBwcmVzZW50IGluIHRoZSBwYWdlIGNhY2hlLCBzbyBldmljdGlvbiBjYW5ub3QgZnJlZVxuK1x0ICogdGhlIGlub2RlIHlldCwgbm90aGluZyBwYXN0IHRoaXMgcG9pbnQgbWF5IHRvdWNoIHRoZSBpbm9kZSBvclxuK1x0ICogdGhlIG1hcHBpbmcuXG4rXHQgKi9cbitcdGlfbW1hcF91bmxvY2tfcmVhZChtYXBwaW5nKTtcbitmYWlsX2ZyZWU6XG4rXHQvKiBSZXN0b3JlIHRoZSBwcmV2aW91c2x5IGFjdGl2ZSBtZW1jZyAqL1xuK1x0c2V0X2FjdGl2ZV9tZW1jZyhvbGRfbWVtY2cpO1xuK1x0bWVtX2Nncm91cF9wdXQobWVtY2cpO1xuK1x0eGFzX2Rlc3Ryb3koXHUwMDI2eGFzKTtcbiBcdHJldHVybiByZXQ7XG4gfVxuIFxuQEAgLTQxMDIsMTcgKzQyNDgsMTEgQEAgc3RhdGljIGludCBfX2ZvbGlvX3NwbGl0KHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIsXG4gXHRcdHN0cnVjdCBwYWdlICpzcGxpdF9hdCwgc3RydWN0IHBhZ2UgKmxvY2tfYXQsXG4gXHRcdHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QsIGVudW0gc3BsaXRfdHlwZSBzcGxpdF90eXBlKVxuIHtcbi1cdFhBX1NUQVRFKHhhcywgXHUwMDI2Zm9saW8tXHUwMDNlbWFwcGluZy1cdTAwM2VpX3BhZ2VzLCBmb2xpby1cdTAwM2VpbmRleCk7XG4rXHRib29sIGlzX3N3YXBjYWNoZSA9IGZvbGlvX3Rlc3Rfc3dhcGNhY2hlKGZvbGlvKTtcbiBcdHN0cnVjdCBmb2xpbyAqZW5kX2ZvbGlvID0gZm9saW9fbmV4dChmb2xpbyk7XG4gXHRib29sIGlzX2Fub24gPSBmb2xpb190ZXN0X2Fub24oZm9saW8pO1xuLVx0c3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLCAqb2xkX21lbWNnO1xuLVx0c3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSBOVUxMO1xuLVx0c3RydWN0IGFub25fdm1hICphbm9uX3ZtYSA9IE5VTEw7XG4gXHRpbnQgb2xkX29yZGVyID0gZm9saW9fb3JkZXIoZm9saW8pO1xuIFx0c3RydWN0IGZvbGlvICpuZXdfZm9saW8sICpuZXh0O1xuLVx0aW50IG5yX3NobWVtX2Ryb3BwZWQgPSAwO1xuLVx0ZW51bSB0dHVfZmxhZ3MgdHR1X2ZsYWdzID0gMDtcbi1cdHBnb2ZmX3QgZW5kID0gMDtcbiBcdGludCByZXQ7XG4gXG4gXHRWTV9XQVJOX09OX09OQ0VfRk9MSU8oIWZvbGlvX3Rlc3RfbG9ja2VkKGZvbGlvKSwgZm9saW8pO1xuQEAgLTQxMjAsMTQxICs0MjYwLDI5IEBAIHN0YXRpYyBpbnQgX19mb2xpb19zcGxpdChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyLFxuIFxuIFx0aWYgKGZvbGlvICE9IHBhZ2VfZm9saW8oc3BsaXRfYXQpIHx8IGZvbGlvICE9IHBhZ2VfZm9saW8obG9ja19hdCkpIHtcbiBcdFx0cmV0ID0gLUVJTlZBTDtcbi1cdFx0Z290byBvdXRfbm9fbWVtY2c7XG4rXHRcdGdvdG8gb3V0O1xuIFx0fVxuIFxuIFx0aWYgKG5ld19vcmRlciBcdTAwM2U9IG9sZF9vcmRlcikge1xuIFx0XHRyZXQgPSAtRUlOVkFMO1xuLVx0XHRnb3RvIG91dF9ub19tZW1jZztcbitcdFx0Z290byBvdXQ7XG4gXHR9XG4gXG4gXHRyZXQgPSBmb2xpb19jaGVja19zcGxpdHRhYmxlKGZvbGlvLCBuZXdfb3JkZXIsIHNwbGl0X3R5cGUpO1xuIFx0aWYgKHJldCkge1xuIFx0XHRWTV9XQVJOX09OQ0UocmV0ID09IC1FSU5WQUwsIFwiVHJpZWQgdG8gc3BsaXQgYW4gdW5zcGxpdHRhYmxlIGZvbGlvXCIpO1xuLVx0XHRnb3RvIG91dF9ub19tZW1jZztcbi1cdH1cbi1cbi1cdC8qXG4tXHQgKiBzd2l0Y2ggdG8gZm9saW8ncyBtZW1jZyBhcyB4YXJyYXkgbm9kZSBhbGxvY2F0aW9uIGNhbiBoYXBwZW4gYW5kXG4tXHQgKiBuZWVkcyB0byBjaGFyZ2UgdG8gaXQuXG4tXHQgKi9cbi1cdG1lbWNnID0gZ2V0X21lbV9jZ3JvdXBfZnJvbV9mb2xpbyhmb2xpbyk7XG4tXHRvbGRfbWVtY2cgPSBzZXRfYWN0aXZlX21lbWNnKG1lbWNnKTtcbi1cbi1cdGlmIChpc19hbm9uKSB7XG4tXHRcdC8qXG4tXHRcdCAqIFRoZSBjYWxsZXIgZG9lcyBub3QgbmVjZXNzYXJpbHkgaG9sZCBhbiBtbWFwX2xvY2sgdGhhdCB3b3VsZFxuLVx0XHQgKiBwcmV2ZW50IHRoZSBhbm9uX3ZtYSBkaXNhcHBlYXJpbmcgc28gd2UgZmlyc3Qgd2UgdGFrZSBhXG4tXHRcdCAqIHJlZmVyZW5jZSB0byBpdCBhbmQgdGhlbiBsb2NrIHRoZSBhbm9uX3ZtYSBmb3Igd3JpdGUuIFRoaXNcbi1cdFx0ICogaXMgc2ltaWxhciB0byBmb2xpb19sb2NrX2Fub25fdm1hX3JlYWQgZXhjZXB0IHRoZSB3cml0ZSBsb2NrXG4tXHRcdCAqIGlzIHRha2VuIHRvIHNlcmlhbGlzZSBhZ2FpbnN0IHBhcmFsbGVsIHNwbGl0IG9yIGNvbGxhcHNlXG4tXHRcdCAqIG9wZXJhdGlvbnMuXG4tXHRcdCAqL1xuLVx0XHRhbm9uX3ZtYSA9IGZvbGlvX2dldF9hbm9uX3ZtYShmb2xpbyk7XG4tXHRcdGlmICghYW5vbl92bWEpIHtcbi1cdFx0XHRyZXQgPSAtRUJVU1k7XG4tXHRcdFx0Z290byBvdXQ7XG4tXHRcdH1cbi1cdFx0YW5vbl92bWFfbG9ja193cml0ZShhbm9uX3ZtYSk7XG4tXHRcdG1hcHBpbmcgPSBOVUxMO1xuLVx0fSBlbHNlIHtcbi1cdFx0dW5zaWduZWQgaW50IG1pbl9vcmRlcjtcbi1cdFx0Z2ZwX3QgZ2ZwO1xuLVxuLVx0XHRtYXBwaW5nID0gZm9saW8tXHUwMDNlbWFwcGluZztcbi1cdFx0bWluX29yZGVyID0gbWFwcGluZ19taW5fZm9saW9fb3JkZXIobWFwcGluZyk7XG4tXHRcdGlmIChuZXdfb3JkZXIgXHUwMDNjIG1pbl9vcmRlcikge1xuLVx0XHRcdHJldCA9IC1FSU5WQUw7XG4tXHRcdFx0Z290byBvdXQ7XG4tXHRcdH1cbi1cbi1cdFx0Z2ZwID0gY3VycmVudF9nZnBfY29udGV4dChtYXBwaW5nX2dmcF9tYXNrKG1hcHBpbmcpIFx1MDAyNlxuLVx0XHRcdFx0XHRcdFx0R0ZQX1JFQ0xBSU1fTUFTSyk7XG4tXG4tXHRcdGlmICghZmlsZW1hcF9yZWxlYXNlX2ZvbGlvKGZvbGlvLCBnZnApKSB7XG4tXHRcdFx0cmV0ID0gLUVCVVNZO1xuLVx0XHRcdGdvdG8gb3V0O1xuLVx0XHR9XG4tXG4tXHRcdG1hcHBpbmdfc2V0X3VwZGF0ZShcdTAwMjZ4YXMsIG1hcHBpbmcpO1xuLVxuLVx0XHRpZiAoc3BsaXRfdHlwZSA9PSBTUExJVF9UWVBFX1VOSUZPUk0pIHtcbi1cdFx0XHR4YXNfc2V0X29yZGVyKFx1MDAyNnhhcywgZm9saW8tXHUwMDNlaW5kZXgsIG5ld19vcmRlcik7XG4tXHRcdFx0eGFzX3NwbGl0X2FsbG9jKFx1MDAyNnhhcywgZm9saW8sIG9sZF9vcmRlciwgZ2ZwKTtcbi1cdFx0XHRpZiAoeGFzX2Vycm9yKFx1MDAyNnhhcykpIHtcbi1cdFx0XHRcdHJldCA9IHhhc19lcnJvcihcdTAwMjZ4YXMpO1xuLVx0XHRcdFx0Z290byBvdXQ7XG4tXHRcdFx0fVxuLVx0XHR9XG4tXG4tXHRcdGFub25fdm1hID0gTlVMTDtcbi1cdFx0aV9tbWFwX2xvY2tfcmVhZChtYXBwaW5nKTtcbi1cbi1cdFx0Lypcbi1cdFx0ICpfX3NwbGl0X3VubWFwcGVkX2ZvbGlvKCkgbWF5IG5lZWQgdG8gdHJpbSBvZmYgcGFnZXMgYmV5b25kXG4tXHRcdCAqIEVPRjogYnV0IG9uIDMyLWJpdCwgaV9zaXplX3JlYWQoKSB0YWtlcyBhbiBpcnEtdW5zYWZlXG4tXHRcdCAqIHNlcWxvY2ssIHdoaWNoIGNhbm5vdCBiZSBuZXN0ZWQgaW5zaWRlIHRoZSBwYWdlIHRyZWUgbG9jay5cbi1cdFx0ICogU28gbm90ZSBlbmQgbm93OiBpX3NpemUgaXRzZWxmIG1heSBiZSBjaGFuZ2VkIGF0IGFueSBtb21lbnQsXG4tXHRcdCAqIGJ1dCBmb2xpbyBsb2NrIGlzIGdvb2QgZW5vdWdoIHRvIHNlcmlhbGl6ZSB0aGUgdHJpbW1pbmcuXG4tXHRcdCAqL1xuLVx0XHRlbmQgPSBESVZfUk9VTkRfVVAoaV9zaXplX3JlYWQobWFwcGluZy1cdTAwM2Vob3N0KSwgUEFHRV9TSVpFKTtcbi1cdFx0aWYgKHNobWVtX21hcHBpbmcobWFwcGluZykpXG4tXHRcdFx0ZW5kID0gc2htZW1fZmFsbG9jZW5kKG1hcHBpbmctXHUwMDNlaG9zdCwgZW5kKTtcbi1cdH1cbi1cbi1cdC8qXG4tXHQgKiBSYWN5IGNoZWNrIGlmIHdlIGNhbiBzcGxpdCB0aGUgcGFnZSwgYmVmb3JlIHVubWFwX2ZvbGlvKCkgd2lsbFxuLVx0ICogc3BsaXQgUE1Ec1xuLVx0ICovXG4tXHRpZiAoZm9saW9fZXhwZWN0ZWRfcmVmX2NvdW50KGZvbGlvKSAhPSBmb2xpb19yZWZfY291bnQoZm9saW8pIC0gMSkge1xuLVx0XHRyZXQgPSAtRUFHQUlOO1xuLVx0XHRnb3RvIG91dF91bmxvY2s7XG4tXHR9XG4tXG4tXHR1bm1hcF9mb2xpbyhmb2xpbyk7XG4tXG4tXHQvKiBibG9jayBpbnRlcnJ1cHQgcmVlbnRyeSBpbiB4YV9sb2NrIGFuZCBzcGlubG9jayAqL1xuLVx0bG9jYWxfaXJxX2Rpc2FibGUoKTtcbi1cdGlmIChtYXBwaW5nKSB7XG4tXHRcdC8qXG4tXHRcdCAqIENoZWNrIGlmIHRoZSBmb2xpbyBpcyBwcmVzZW50IGluIHBhZ2UgY2FjaGUuXG4tXHRcdCAqIFdlIGFzc3VtZSBhbGwgdGFpbCBhcmUgcHJlc2VudCB0b28sIGlmIGZvbGlvIGlzIHRoZXJlLlxuLVx0XHQgKi9cbi1cdFx0eGFzX2xvY2soXHUwMDI2eGFzKTtcbi1cdFx0eGFzX3Jlc2V0KFx1MDAyNnhhcyk7XG4tXHRcdGlmICh4YXNfbG9hZChcdTAwMjZ4YXMpICE9IGZvbGlvKSB7XG4tXHRcdFx0cmV0ID0gLUVBR0FJTjtcbi1cdFx0XHRnb3RvIGZhaWw7XG4tXHRcdH1cbitcdFx0Z290byBvdXQ7XG4gXHR9XG4gXG4tXHRyZXQgPSBfX2ZvbGlvX2ZyZWV6ZV9hbmRfc3BsaXRfdW5tYXBwZWQoZm9saW8sIG5ld19vcmRlciwgc3BsaXRfYXQsIFx1MDAyNnhhcywgbWFwcGluZyxcbi1cdFx0XHRcdFx0XHR0cnVlLCBsaXN0LCBzcGxpdF90eXBlLCBlbmQsIFx1MDAyNm5yX3NobWVtX2Ryb3BwZWQpO1xuLWZhaWw6XG4tXHRpZiAobWFwcGluZylcbi1cdFx0eGFzX3VubG9jayhcdTAwMjZ4YXMpO1xuLVxuLVx0bG9jYWxfaXJxX2VuYWJsZSgpO1xuLVxuLVx0aWYgKG5yX3NobWVtX2Ryb3BwZWQpXG4tXHRcdHNobWVtX3VuY2hhcmdlKG1hcHBpbmctXHUwMDNlaG9zdCwgbnJfc2htZW1fZHJvcHBlZCk7XG4tXG4tXHRpZiAoIXJldCBcdTAwMjZcdTAwMjYgaXNfYW5vbiBcdTAwMjZcdTAwMjYgIWZvbGlvX2lzX2RldmljZV9wcml2YXRlKGZvbGlvKSlcbi1cdFx0dHR1X2ZsYWdzID0gVFRVX1VTRV9TSEFSRURfWkVST1BBR0U7XG4tXG4tXHRyZW1hcF9wYWdlKGZvbGlvLCAxIFx1MDAzY1x1MDAzYyBvbGRfb3JkZXIsIHR0dV9mbGFncyk7XG4tXG4tXHQvKlxuLVx0ICogRHJvcCB0aGUgbWFwcGluZyB3aGlsZSB0aGUgaW5vZGUgaXMgc3RpbGwgcGlubmVkLiBAZm9saW8gc3RheXNcbi1cdCAqIGxvY2tlZCBhbmQgcHJlc2VudCBpbiB0aGUgcGFnZSBjYWNoZSB1bnRpbCB0aGUgbG9vcCBiZWxvdywgc29cbi1cdCAqIGV2aWN0aW9uIGNhbm5vdCBmcmVlIHRoZSBpbm9kZSB5ZXQ7IEBsb2NrX2F0IGlzIG5vdCBlbm91Z2gsIGl0IG1heVxuLVx0ICogYmUgYSB0YWlsIGJleW9uZCBFT0YgdGhhdCB0aGUgc3BsaXQgYWxyZWFkeSBkcm9wcGVkIGZyb20gdGhlIHBhZ2Vcbi1cdCAqIGNhY2hlLiBOb3RoaW5nIHBhc3QgdGhpcyBwb2ludCBtYXkgdG91Y2ggdGhlIGlub2RlIG9yIHRoZSBtYXBwaW5nLlxuLVx0ICovXG4tXHRpZiAobWFwcGluZykge1xuLVx0XHRpX21tYXBfdW5sb2NrX3JlYWQobWFwcGluZyk7XG4tXHRcdG1hcHBpbmcgPSBOVUxMO1xuLVx0fVxuK1x0aWYgKGlzX2Fub24pXG4rXHRcdHJldCA9IF9fZm9saW9fZnJlZXplX3NwbGl0X3VubWFwKGZvbGlvLCBuZXdfb3JkZXIsIHNwbGl0X2F0LCB0cnVlLFxuK1x0XHRcdFx0XHRcdCB0cnVlLCBsaXN0LCBzcGxpdF90eXBlKTtcbitcdGVsc2UgaWYgKGlzX3N3YXBjYWNoZSlcbitcdFx0cmV0ID0gX19mb2xpb19mcmVlemVfc3BsaXRfdW5tYXAoZm9saW8sIG5ld19vcmRlciwgc3BsaXRfYXQsIHRydWUsXG4rXHRcdFx0XHRcdFx0IGZhbHNlLCBsaXN0LCBzcGxpdF90eXBlKTtcbitcdGVsc2VcbitcdFx0cmV0ID0gX19mb2xpb19mcmVlemVfc3BsaXRfdW5tYXBfZmlsZShmb2xpbywgbmV3X29yZGVyLCBzcGxpdF9hdCxcbitcdFx0XHRcdFx0XHQgICAgICB0cnVlLCBsaXN0LCBzcGxpdF90eXBlKTtcbiBcbiBcdC8qXG4gXHQgKiBVbmxvY2sgYWxsIGFmdGVyLXNwbGl0IGZvbGlvcyBleGNlcHQgdGhlIG9uZSBjb250YWluaW5nXG5AQCAtNDI2NSwyOSArNDI5MywxOSBAQCBzdGF0aWMgaW50IF9fZm9saW9fc3BsaXQoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlcixcbiBcdFx0aWYgKG5ld19mb2xpbyA9PSBwYWdlX2ZvbGlvKGxvY2tfYXQpKVxuIFx0XHRcdGNvbnRpbnVlO1xuIFxuLVx0XHRmb2xpb191bmxvY2sobmV3X2ZvbGlvKTtcbiBcdFx0LypcbiBcdFx0ICogU3VicGFnZXMgd2hvc2UgbWFwcGluZyBoYXMgYmVlbiB6YXBwZWQgbWF5IGJlIGZyZWVkXG4gXHRcdCAqIGVhcmxpZXIsIGJ1dCBmcmVlaW5nIHRoZW0gcmVxdWlyZXMgdGFraW5nIHRoZVxuIFx0XHQgKiBscnVfbG9jaywgc28gd2UgZGVmZXIgcHV0X3BhZ2UoKSBvbiB0YWlsIHBhZ2VzIHVudGlsXG4gXHRcdCAqIGFmdGVyIHRoZSBzcGxpdCBjb21wbGV0ZXMuXG4gXHRcdCAqL1xuLVx0XHRmcmVlX2ZvbGlvX2FuZF9zd2FwX2NhY2hlKG5ld19mb2xpbyk7XG4rXHRcdGlmIChpc19zd2FwY2FjaGUpXG4rXHRcdFx0Zm9saW9fZnJlZV9zd2FwKG5ld19mb2xpbyk7XG4rXHRcdGZvbGlvX3VubG9jayhuZXdfZm9saW8pO1xuK1x0XHRmb2xpb19wdXQobmV3X2ZvbGlvKTtcbiBcdH1cbiBcbi1vdXRfdW5sb2NrOlxuLVx0aWYgKGFub25fdm1hKSB7XG4tXHRcdGFub25fdm1hX3VubG9ja193cml0ZShhbm9uX3ZtYSk7XG4tXHRcdHB1dF9hbm9uX3ZtYShhbm9uX3ZtYSk7XG4tXHR9XG4tXHRpZiAobWFwcGluZylcbi1cdFx0aV9tbWFwX3VubG9ja19yZWFkKG1hcHBpbmcpO1xuIG91dDpcbi1cdC8qIHJlc3RvcmUgdG8gY2FsbGVyJ3Mgb2xkX21lbWNnICovXG4tXHRzZXRfYWN0aXZlX21lbWNnKG9sZF9tZW1jZyk7XG4tXHRtZW1fY2dyb3VwX3B1dChtZW1jZyk7XG4tb3V0X25vX21lbWNnOlxuLVx0eGFzX2Rlc3Ryb3koXHUwMDI2eGFzKTtcbiBcdGlmIChpc19wbWRfb3JkZXIob2xkX29yZGVyKSlcbiBcdFx0Y291bnRfdm1fZXZlbnQoIXJldCA/IFRIUF9TUExJVF9QQUdFIDogVEhQX1NQTElUX1BBR0VfRkFJTEVEKTtcbiBcdGNvdW50X210aHBfc3RhdChvbGRfb3JkZXIsICFyZXQgPyBNVEhQX1NUQVRfU1BMSVQgOiBNVEhQX1NUQVRfU1BMSVRfRkFJTEVEKTtcbkBAIC00MzE4LDIyICs0MzM2LDEzIEBAIHN0YXRpYyBpbnQgX19mb2xpb19zcGxpdChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyLFxuICAqL1xuIGludCBmb2xpb19zcGxpdF91bm1hcHBlZChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyKVxuIHtcbi1cdGludCByZXQgPSAwO1xuLVxuIFx0Vk1fV0FSTl9PTl9PTkNFX0ZPTElPKGZvbGlvX21hcHBlZChmb2xpbyksIGZvbGlvKTtcbiBcdFZNX1dBUk5fT05fT05DRV9GT0xJTyghZm9saW9fdGVzdF9sb2NrZWQoZm9saW8pLCBmb2xpbyk7XG4gXHRWTV9XQVJOX09OX09OQ0VfRk9MSU8oIWZvbGlvX3Rlc3RfbGFyZ2UoZm9saW8pLCBmb2xpbyk7XG4gXHRWTV9XQVJOX09OX09OQ0VfRk9MSU8oIWZvbGlvX3Rlc3RfYW5vbihmb2xpbyksIGZvbGlvKTtcbiBcbi1cdGlmIChmb2xpb19leHBlY3RlZF9yZWZfY291bnQoZm9saW8pICE9IGZvbGlvX3JlZl9jb3VudChmb2xpbykgLSAxKVxuLVx0XHRyZXR1cm4gLUVBR0FJTjtcbi1cbi1cdGxvY2FsX2lycV9kaXNhYmxlKCk7XG4tXHRyZXQgPSBfX2ZvbGlvX2ZyZWV6ZV9hbmRfc3BsaXRfdW5tYXBwZWQoZm9saW8sIG5ld19vcmRlciwgXHUwMDI2Zm9saW8tXHUwMDNlcGFnZSwgTlVMTCxcbi1cdFx0XHRcdFx0XHROVUxMLCBmYWxzZSwgTlVMTCwgU1BMSVRfVFlQRV9VTklGT1JNLFxuLVx0XHRcdFx0XHRcdDAsIE5VTEwpO1xuLVx0bG9jYWxfaXJxX2VuYWJsZSgpO1xuLVx0cmV0dXJuIHJldDtcbitcdHJldHVybiBfX2ZvbGlvX2ZyZWV6ZV9zcGxpdF91bm1hcChmb2xpbywgbmV3X29yZGVyLCBcdTAwMjZmb2xpby1cdTAwM2VwYWdlLCBmYWxzZSxcbitcdFx0XHRcdFx0ICBmYWxzZSwgTlVMTCwgU1BMSVRfVFlQRV9VTklGT1JNKTtcbiB9XG4gXG4gLypcbkBAIC00MzUyLDExICs0MzYxLDExIEBAIGludCBmb2xpb19zcGxpdF91bm1hcHBlZChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyKVxuICAqICAgIEdVUCBwaW5zLCB3aWxsIHJlc3VsdCBpbiB0aGUgZm9saW8gbm90IGdldHRpbmcgc3BsaXQ7IGluc3RlYWQsIHRoZSBjYWxsZXJcbiAgKiAgICB3aWxsIHJlY2VpdmUgYW4gLUVBR0FJTi5cbiAgKlxuLSAqIDQpIEBuZXdfb3JkZXIgXHUwMDNlIDEsIHVzdWFsbHkuIFNwbGl0dGluZyB0byBvcmRlci0xIGFub255bW91cyBmb2xpb3MgaXMgbm90XG4tICogICAgc3VwcG9ydGVkIGZvciBub24tZmlsZS1iYWNrZWQgZm9saW9zLCBiZWNhdXNlIGZvbGlvLVx1MDAzZV9kZWZlcnJlZF9saXN0LCB3aGljaFxuLSAqICAgIGlzIHVzZWQgYnkgcGFydGlhbGx5IG1hcHBlZCBmb2xpb3MsIGlzIHN0b3JlZCBpbiBzdWJwYWdlIDIsIGJ1dCBhbiBvcmRlci0xXG4tICogICAgZm9saW8gb25seSBoYXMgc3VicGFnZXMgMCBhbmQgMS4gRmlsZS1iYWNrZWQgb3JkZXItMSBmb2xpb3MgYXJlIHN1cHBvcnRlZCxcbi0gKiAgICBzaW5jZSB0aGV5IGRvIG5vdCB1c2UgX2RlZmVycmVkX2xpc3QuXG4rICogNCkgQG5ld19vcmRlciBcdTAwM2UgMSwgdXN1YWxseS4gT3JkZXItMSBpcyBub3Qgc3VwcG9ydGVkIGZvciBhbm9uIG9yIHN3YXBjYWNoZVxuKyAqICAgIGZvbGlvczogYW5vbiBmb2xpb3MgbmVlZCBzdWJwYWdlIDIgZm9yIF9kZWZlcnJlZF9saXN0LCB3aGljaCBvcmRlci0xXG4rICogICAgZm9saW9zIGxhY2ssIGFuZCBhIHN3YXBjYWNoZSBmb2xpbyBtYXkgYmVjb21lIGFub24gb25jZSBmYXVsdGVkIGluLlxuKyAqICAgIEZpbGUtYmFja2VkIG9yZGVyLTEgZm9saW9zIGFyZSBzdXBwb3J0ZWQsIHNpbmNlIHRoZXkgZG8gbm90IHVzZVxuKyAqICAgIF9kZWZlcnJlZF9saXN0LlxuICAqXG4gICogQWZ0ZXIgc3BsaXR0aW5nLCB0aGUgY2FsbGVyJ3MgZm9saW8gcmVmZXJlbmNlIHdpbGwgYmUgdHJhbnNmZXJyZWQgdG8gQHBhZ2UsXG4gICogcmVzdWx0aW5nIGluIGEgcmFpc2VkIHJlZmNvdW50IG9mIEBwYWdlIGFmdGVyIHRoaXMgY2FsbC4gVGhlIG90aGVyIHBhZ2VzIG1heVxuZGlmZiAtLWdpdCBhL21tL3N3YXBfc3RhdGUuYyBiL21tL3N3YXBfc3RhdGUuY1xuaW5kZXggNWJlODI1OTExZTY0NS4uZjE0MDVlNWI4MTNlZSAxMDA2NDRcbi0tLSBhL21tL3N3YXBfc3RhdGUuY1xuKysrIGIvbW0vc3dhcF9zdGF0ZS5jXG5AQCAtMzg4LDggKzM4OCw5IEBAIHZvaWQgX19zd2FwX2NhY2hlX3JlcGxhY2VfZm9saW8oc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSxcbiBcdCAgICBmb2xpb19vcmRlcihvbGQpICE9IGZvbGlvX29yZGVyKG5ldykpIHtcbiBcdFx0Y2lfb2ZmID0gc3dwX2NsdXN0ZXJfb2Zmc2V0KG9sZC1cdTAwM2Vzd2FwKTtcbiBcdFx0Y2lfZW5kID0gY2lfb2ZmICsgZm9saW9fbnJfcGFnZXMob2xkKTtcbi1cdFx0d2hpbGUgKGNpX29mZisrIFx1MDAzYyBjaV9lbmQpXG4rXHRcdGRvIHtcbiBcdFx0XHRXQVJOX09OX09OQ0Uoc3dwX3RiX3RvX2ZvbGlvKF9fc3dhcF90YWJsZV9nZXQoY2ksIGNpX29mZikpICE9IG9sZCk7XG4rXHRcdH0gd2hpbGUgKCsrY2lfb2ZmIFx1MDAzYyBjaV9lbmQpO1xuIFx0fVxuIH1cbiBcbiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA3VDIxOjU0OjA3LjQ1MjUyMjA1NVoiLCJTZXEiOjMsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjcwNjg4Nzk0NDYsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIHRoZSBGb2xpbyBTcGxpdHRpbmcgUGF0Y2gqKlxuXG5BbHJpZ2h0LCBsZXQncyBicmVhayBkb3duIHRoaXMgcGF0Y2guIEkgc2VlIG1vZGlmaWNhdGlvbnMgdG91Y2hpbmcgYG1tL2h1Z2VfbWVtb3J5LmNgIGFuZCBgbW0vc3dhcF9zdGF0ZS5jYC4gSXQncyBjbGVhcmx5IGEgY29yZSBtZW1vcnkgbWFuYWdlbWVudCBjaGFuZ2UsIHNwZWNpZmljYWxseSByZWxhdGVkIHRvIGhvdyB3ZSBoYW5kbGUgZm9saW8gc3BsaXR0aW5nLCBwYXJ0aWN1bGFybHkgYXJvdW5kIGh1Z2UgcGFnZXMuIFRoZSBmYWN0IHRoYXQgaXQgcmV3b3JrcyB0aGUgc3BsaXR0aW5nIG9mIHVubWFwcGVkIGZvbGlvcyDigJMgYW5kLCBjcml0aWNhbGx5LCBkaXN0aW5ndWlzaGVzIGJldHdlZW4gYW5vbnltb3VzLCBzd2FwY2FjaGUsIGFuZCBmaWxlLWJhY2tlZCBmb2xpb3Mg4oCTIGltbWVkaWF0ZWx5IHRlbGxzIG1lIHRoaXMgaGFzIGZ1bmN0aW9uYWwgaW1wbGljYXRpb25zIHdlIG5lZWQgdG8gcmVhbGx5IGRpZyBpbnRvLiBEZWZpbml0ZWx5IGZ1enppbmcgbWF0ZXJpYWwuXG5cbkknbSBzZWVpbmcgdGhhdCBgX19mb2xpb19mcmVlemVfc3BsaXRfdW5tYXBgIGFuZCBgX19mb2xpb19mcmVlemVfc3BsaXRfdW5tYXBfZmlsZWAgaGF2ZSBiZWVuIGludHJvZHVjZWQgdG8gcmVwbGFjZSBgX19mb2xpb19mcmVlemVfYW5kX3NwbGl0X3VubWFwcGVkYCwgd2hpY2ggaXMgYSBzdHJvbmcgaW5kaWNhdG9yIG9mIHJlZmluZWQgbG9naWMgaGVyZS4gVGhlcmUncyBhbHNvIHNvbWUgc3VidGxlIGJlaGF2aW9yIGNoYW5nZXMgaW4gYGZvbGlvX2NoZWNrX3NwbGl0dGFibGVgIHdoZW4gaXQgY29tZXMgdG8gc3dhcGNhY2hlIGZvbGlvcy4gVGhlIGNvcmUgb2YgdGhpcyBzZWVtcyB0byBiZSBkcml2ZW4gYnkgbW9kaWZpY2F0aW9ucyB0byB0aGUgYF9fZm9saW9fc3BsaXRgIGZ1bmN0aW9uLCB3aGljaCBub3cgY2FsbHMgdGhlIG5ld2x5IGRlZmluZWQgZnVuY3Rpb25zLlxuXG5Ob3csIGxldCdzIGlkZW50aWZ5IHRoZSBrZXkgZnVuY3Rpb25zIHRvIHJlYWxseSBmb2N1cyBvbi4gSSdtIHNlZWluZyBjaGFuZ2VzIHRvOiBgZm9saW9fY2hlY2tfc3BsaXR0YWJsZWAsIHRoZSBzdGF0aWMgaGVscGVycyBgX19mb2xpb19mcmVlemVfc3BsaXRfdW5tYXBgLCBgX19mb2xpb19mcmVlemVfc3BsaXRfdW5tYXBfZmlsZWAgYW5kIGBfX2ZvbGlvX3NwbGl0YCwgYW5kIHRoZSBnbG9iYWwgZnVuY3Rpb25zIGBmb2xpb19zcGxpdF91bm1hcHBlZGAgYW5kIGBfX3N3YXBfY2FjaGVfcmVwbGFjZV9mb2xpb2AuXG5cbk9rYXksIG15IGluaXRpYWwgdGhvdWdodHMgcG9pbnQgbWUgdG93YXJkcyBgZm9saW9fc3BsaXRfdW5tYXBwZWRgIGFuZCBpdHMgaW50ZXJhY3Rpb24gd2l0aCBgc3BsaXRfaHVnZV9wYWdlX3RvX2xpc3RfdG9fb3JkZXJgLiBgc3BsaXRfaHVnZV9wYWdlX3RvX2xpc3RfdG9fb3JkZXJgIGxvb2tzIGxpa2UgdGhlIG1haW4gZW50cnkgcG9pbnQgZm9yIHNwbGl0dGluZyBodWdlIHBhZ2VzLCB0aGUgcmVhbCBtZWF0IG9mIHRoZSBvcGVyYXRpb24uIFNvLCBJIHNob3VsZCBzdGFydCBieSBsb29raW5nIGZvciB3aGVyZSBgc3BsaXRfaHVnZV9wYWdlX3RvX2xpc3RfdG9fb3JkZXJgIG9yIHNpbXBseSBgc3BsaXRfaHVnZV9wYWdlYCBpcyBjYWxsZWQgd2l0aGluIGBtbS9odWdlX21lbW9yeS5jYCB0byBzZWUgaG93IGl0J3MgYmVpbmcgaW52b2tlZC5cblxuXG4iLCJJbnB1dFRva2VucyI6MTE0MTksIk91dHB1dFRva2VucyI6MzIsIk91dHB1dFRob3VnaHRzVG9rZW5zIjozNTcsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0wN1QyMTo1NDoxNC41MjE0MDM2NjFaIiwiU2VxIjo0LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NjUwNTEwMjUsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwic3BsaXRfaHVnZV9wYWdlXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIm1tL2h1Z2VfbWVtb3J5LmNcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwibW0vaHVnZV9tZW1vcnkuYz00MzM3PWludCBmb2xpb19zcGxpdF91bm1hcHBlZChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyKVxcbi0tXFxubW0vaHVnZV9tZW1vcnkuYy00Mzk0LSAqL1xcbm1tL2h1Z2VfbWVtb3J5LmM6NDM5NTppbnQgX19zcGxpdF9odWdlX3BhZ2VfdG9fbGlzdF90b19vcmRlcihzdHJ1Y3QgcGFnZSAqcGFnZSwgc3RydWN0IGxpc3RfaGVhZCAqbGlzdCxcXG5tbS9odWdlX21lbW9yeS5jLTQzOTYtXFx0XFx0XFx0XFx0ICAgICB1bnNpZ25lZCBpbnQgbmV3X29yZGVyKVxcbi0tXFxubW0vaHVnZV9tZW1vcnkuYy00NDEyLSAqIEl0IGhhcyB0aGUgc2FtZSBwcmVyZXF1aXNpdGVzIGFuZCByZXR1cm5zIGFzXFxubW0vaHVnZV9tZW1vcnkuYzo0NDEzOiAqIHNwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyKCkuXFxubW0vaHVnZV9tZW1vcnkuYy00NDE0LSAqXFxuLS1cXG5tbS9odWdlX21lbW9yeS5jPTQ0NjI9aW50IHNwbGl0X2ZvbGlvX3RvX2xpc3Qoc3RydWN0IGZvbGlvICpmb2xpbywgc3RydWN0IGxpc3RfaGVhZCAqbGlzdClcXG5tbS9odWdlX21lbW9yeS5jLTQ0NjMte1xcbm1tL2h1Z2VfbWVtb3J5LmM6NDQ2NDpcXHRyZXR1cm4gc3BsaXRfaHVnZV9wYWdlX3RvX2xpc3RfdG9fb3JkZXIoXFx1MDAyNmZvbGlvLVxcdTAwM2VwYWdlLCBsaXN0LCAwKTtcXG5tbS9odWdlX21lbW9yeS5jLTQ0NjUtfVxcbi0tXFxubW0vaHVnZV9tZW1vcnkuYz00NjIxPXN0YXRpYyB1bnNpZ25lZCBsb25nIGRlZmVycmVkX3NwbGl0X3NjYW4oc3RydWN0IHNocmlua2VyICpzaHJpbmssXFxuLS1cXG5tbS9odWdlX21lbW9yeS5jLTQ2ODMtI2lmZGVmIENPTkZJR19ERUJVR19GU1xcbm1tL2h1Z2VfbWVtb3J5LmM6NDY4NDpzdGF0aWMgdm9pZCBzcGxpdF9odWdlX3BhZ2VzX2FsbCh2b2lkKVxcbm1tL2h1Z2VfbWVtb3J5LmMtNDY4NS17XFxuLS1cXG5tbS9odWdlX21lbW9yeS5jPTQ3MzQ9c3RhdGljIGlubGluZSBib29sIHZtYV9ub3Rfc3VpdGFibGVfZm9yX3RocF9zcGxpdChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSlcXG4tLVxcbm1tL2h1Z2VfbWVtb3J5LmMtNDc0Ny1cXG5tbS9odWdlX21lbW9yeS5jOjQ3NDg6c3RhdGljIGludCBzcGxpdF9odWdlX3BhZ2VzX3BpZChpbnQgcGlkLCB1bnNpZ25lZCBsb25nIHZhZGRyX3N0YXJ0LFxcbm1tL2h1Z2VfbWVtb3J5LmMtNDc0OS1cXHRcXHRcXHRcXHR1bnNpZ25lZCBsb25nIHZhZGRyX2VuZCwgdW5zaWduZWQgaW50IG5ld19vcmRlcixcXG4tLVxcbm1tL2h1Z2VfbWVtb3J5LmMtNDgxNy1cXHRcXHQvKlxcbm1tL2h1Z2VfbWVtb3J5LmM6NDgxODpcXHRcXHQgKiBGb3IgZm9saW9zIHdpdGggcHJpdmF0ZSwgc3BsaXRfaHVnZV9wYWdlX3RvX2xpc3RfdG9fb3JkZXIoKVxcbm1tL2h1Z2VfbWVtb3J5LmMtNDgxOS1cXHRcXHQgKiB3aWxsIHRyeSB0byBkcm9wIGl0IGJlZm9yZSBzcGxpdCBhbmQgdGhlbiBjaGVjayBpZiB0aGUgZm9saW9cXG4tLVxcbm1tL2h1Z2VfbWVtb3J5LmMtNDg2NC1cXG5tbS9odWdlX21lbW9yeS5jOjQ4NjU6c3RhdGljIGludCBzcGxpdF9odWdlX3BhZ2VzX2luX2ZpbGUoY29uc3QgY2hhciAqZmlsZV9wYXRoLCBwZ29mZl90IG9mZl9zdGFydCxcXG5tbS9odWdlX21lbW9yeS5jLTQ4NjYtXFx0XFx0XFx0XFx0cGdvZmZfdCBvZmZfZW5kLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyLFxcbi0tXFxubW0vaHVnZV9tZW1vcnkuYy00OTM0LVxcbm1tL2h1Z2VfbWVtb3J5LmM6NDkzNTpzdGF0aWMgc3NpemVfdCBzcGxpdF9odWdlX3BhZ2VzX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLFxcbm1tL2h1Z2VfbWVtb3J5LmMtNDkzNi1cXHRcXHRcXHRcXHRzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcHMpXFxuLS1cXG5tbS9odWdlX21lbW9yeS5jLTQ5ODItXFx0XFx0fVxcbm1tL2h1Z2VfbWVtb3J5LmM6NDk4MzpcXHRcXHRyZXQgPSBzcGxpdF9odWdlX3BhZ2VzX2luX2ZpbGUoZmlsZV9wYXRoLCBvZmZfc3RhcnQsIG9mZl9lbmQsXFxubW0vaHVnZV9tZW1vcnkuYy00OTg0LVxcdFxcdFxcdFxcdG5ld19vcmRlciwgaW5fZm9saW9fb2Zmc2V0KTtcXG4tLVxcbm1tL2h1Z2VfbWVtb3J5LmMtNDk5My1cXHRpZiAocmV0ID09IDEgXFx1MDAyNlxcdTAwMjYgcGlkID09IDEpIHtcXG5tbS9odWdlX21lbW9yeS5jOjQ5OTQ6XFx0XFx0c3BsaXRfaHVnZV9wYWdlc19hbGwoKTtcXG5tbS9odWdlX21lbW9yeS5jLTQ5OTUtXFx0XFx0cmV0ID0gc3RybGVuKGlucHV0X2J1Zik7XFxuLS1cXG5tbS9odWdlX21lbW9yeS5jLTUwMDEtXFxubW0vaHVnZV9tZW1vcnkuYzo1MDAyOlxcdHJldCA9IHNwbGl0X2h1Z2VfcGFnZXNfcGlkKHBpZCwgdmFkZHJfc3RhcnQsIHZhZGRyX2VuZCwgbmV3X29yZGVyLFxcbm1tL2h1Z2VfbWVtb3J5LmMtNTAwMy1cXHRcXHRcXHRpbl9mb2xpb19vZmZzZXQpO1xcbi0tXFxubW0vaHVnZV9tZW1vcnkuYy01MDExLVxcbm1tL2h1Z2VfbWVtb3J5LmM6NTAxMjpzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBzcGxpdF9odWdlX3BhZ2VzX2ZvcHMgPSB7XFxubW0vaHVnZV9tZW1vcnkuYy01MDEzLVxcdC5vd25lclxcdCA9IFRISVNfTU9EVUxFLFxcbm1tL2h1Z2VfbWVtb3J5LmM6NTAxNDpcXHQud3JpdGVcXHQgPSBzcGxpdF9odWdlX3BhZ2VzX3dyaXRlLFxcbm1tL2h1Z2VfbWVtb3J5LmMtNTAxNS19O1xcbm1tL2h1Z2VfbWVtb3J5LmMtNTAxNi1cXG5tbS9odWdlX21lbW9yeS5jOjUwMTc6c3RhdGljIGludCBfX2luaXQgc3BsaXRfaHVnZV9wYWdlc19kZWJ1Z2ZzKHZvaWQpXFxubW0vaHVnZV9tZW1vcnkuYy01MDE4LXtcXG5tbS9odWdlX21lbW9yeS5jOjUwMTk6XFx0ZGVidWdmc19jcmVhdGVfZmlsZShcXFwic3BsaXRfaHVnZV9wYWdlc1xcXCIsIDAyMDAsIE5VTEwsIE5VTEwsXFxubW0vaHVnZV9tZW1vcnkuYzo1MDIwOlxcdFxcdFxcdCAgICBcXHUwMDI2c3BsaXRfaHVnZV9wYWdlc19mb3BzKTtcXG5tbS9odWdlX21lbW9yeS5jLTUwMjEtXFx0cmV0dXJuIDA7XFxubW0vaHVnZV9tZW1vcnkuYy01MDIyLX1cXG5tbS9odWdlX21lbW9yeS5jOjUwMjM6bGF0ZV9pbml0Y2FsbChzcGxpdF9odWdlX3BhZ2VzX2RlYnVnZnMpO1xcbm1tL2h1Z2VfbWVtb3J5LmMtNTAyNC0jZW5kaWZcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDdUMjE6NTQ6MTQuNTg2NDU2NTU2WiIsIlNlcSI6NSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NDA0OTczNTg3NywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgRm9saW8gU3BsaXR0aW5nIGFuZCBTd2FwIENhY2hlIE9wZXJhdGlvbnMqKlxuXG5Pa2F5LCBzbyBJJ3ZlIGJlZW4gbG9va2luZyBhdCBob3cgZm9saW8gc3BsaXR0aW5nIGFuZCB0aGUgc3dhcCBjYWNoZSBpbnRlcmFjdC4gSSBzZWUgdGhhdCB0aGVzZSBmdW5jdGlvbnMgaGF2ZSBiZWVuIHRvdWNoZWQ6IGBmb2xpb19jaGVja19zcGxpdHRhYmxlYCwgYF9fZm9saW9fZnJlZXplX3NwbGl0X3VubWFwYCwgYF9fZm9saW9fZnJlZXplX3NwbGl0X3VubWFwX2ZpbGVgLCBgX19mb2xpb19zcGxpdGAsIGBmb2xpb19zcGxpdF91bm1hcHBlZGAsIGFuZCBgX19zd2FwX2NhY2hlX3JlcGxhY2VfZm9saW9gLiBUaGF0J3MgYSBkZWNlbnQtc2l6ZWQgbGlzdCwgYW5kIEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoZSBpbXBsaWNhdGlvbnMgb2YgdGhlc2UgY2hhbmdlcy5cblxuSSBuZWVkIHRvIGZvY3VzIG9uIGBmb2xpb19zcGxpdF91bm1hcHBlZGAgYW5kIGBfX3N3YXBfY2FjaGVfcmVwbGFjZV9mb2xpb2Agc3BlY2lmaWNhbGx5LiBUaGVzZSBhcmUgdGhlIHR3byB0aGF0IGFyZSBzY3JlYW1pbmcgdGhlIGxvdWRlc3QgcmlnaHQgbm93LiBUaGUgaW50ZXJwbGF5IGJldHdlZW4gc3BsaXR0aW5nIGZvbGlvcyB0aGF0IGFyZSAqdW5tYXBwZWQqIGFuZCBob3cgdGhhdCBpbXBhY3RzIHRoZSBzd2FwIGNhY2hlIGlzIHdoZXJlIEkgYW50aWNpcGF0ZSBmaW5kaW5nIHRoZSBjb3JlIG9mIHRoZSBpc3N1ZSAob3IgdGhlIGltcHJvdmVtZW50LCBkZXBlbmRpbmcpLiBHb3R0YSBmaWd1cmUgb3V0IGhvdyB0aGUgdW5tYXBwaW5nIGlzIGhhbmRsZWQgZHVyaW5nIHRoZSBzcGxpdCwgYW5kIHRoZW4sIGNydWNpYWxseSwgaG93IHRoZSBzd2FwIGNhY2hlIHVwZGF0ZXMgaXRzIHZpZXcgb2YgdGhlIHBhZ2VzIGFmdGVyIHRoZSBzcGxpdCBoYXMgb2NjdXJyZWQuIEkgbmVlZCB0byBrZWVwIGEgY2xvc2UgZXllIG91dCBmb3IgcG90ZW50aWFsIHJhY2VzLCBtaXNzZWQgaW52YWxpZGF0aW9ucywgb3IgaW5jb3JyZWN0IHJlZmVyZW5jZSBjb3VudHMuIEkgZXhwZWN0IHRoZXNlIHR3byBmdW5jdGlvbnMgd2lsbCBiZSB0aGUga2V5cyB0byB1bmRlcnN0YW5kaW5nIHRoZSBjaGFuZ2VzIGluIHRoaXMgcGF0Y2guXG5cblxuIiwiSW5wdXRUb2tlbnMiOjEzNTYyLCJPdXRwdXRUb2tlbnMiOjI2LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6OTgsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDdUMjE6NTQ6MTguNjM2MTk0MTkzWiIsIlNlcSI6NiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE2NTY0NDcyMTQsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiZm9saW9fc3BsaXRfdW5tYXBwZWRcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwiXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImluY2x1ZGUvbGludXgvaHVnZV9tbS5oPTQwMz1pbnQgX19zcGxpdF9odWdlX3BhZ2VfdG9fbGlzdF90b19vcmRlcihzdHJ1Y3QgcGFnZSAqcGFnZSwgc3RydWN0IGxpc3RfaGVhZCAqbGlzdCxcXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaC00MDQtXFx0XFx0dW5zaWduZWQgaW50IG5ld19vcmRlcik7XFxuaW5jbHVkZS9saW51eC9odWdlX21tLmg6NDA1OmludCBmb2xpb19zcGxpdF91bm1hcHBlZChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyKTtcXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaC00MDYtdW5zaWduZWQgaW50IG1pbl9vcmRlcl9mb3Jfc3BsaXQoc3RydWN0IGZvbGlvICpmb2xpbyk7XFxuLS1cXG5tbS9odWdlX21lbW9yeS5jPTQyNDc9c3RhdGljIGludCBfX2ZvbGlvX3NwbGl0KHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIsXFxuLS1cXG5tbS9odWdlX21lbW9yeS5jLTQzMTUtLyoqXFxubW0vaHVnZV9tZW1vcnkuYzo0MzE2OiAqIGZvbGlvX3NwbGl0X3VubWFwcGVkKCkgLSBzcGxpdCBhIGxhcmdlIGFub24gZm9saW8gdGhhdCBpcyBhbHJlYWR5IHVubWFwcGVkXFxubW0vaHVnZV9tZW1vcnkuYy00MzE3LSAqIEBmb2xpbzogZm9saW8gdG8gc3BsaXRcXG4tLVxcbm1tL2h1Z2VfbWVtb3J5LmMtNDMzNi0gKi9cXG5tbS9odWdlX21lbW9yeS5jOjQzMzc6aW50IGZvbGlvX3NwbGl0X3VubWFwcGVkKHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIpXFxubW0vaHVnZV9tZW1vcnkuYy00MzM4LXtcXG4tLVxcbm1tL21pZ3JhdGVfZGV2aWNlLmM9OTEyPXN0YXRpYyBpbnQgbWlncmF0ZV92bWFfc3BsaXRfdW5tYXBwZWRfZm9saW8oc3RydWN0IG1pZ3JhdGVfdm1hICptaWdyYXRlLFxcbi0tXFxubW0vbWlncmF0ZV9kZXZpY2UuYy05MjYtXFx0c3BsaXRfaHVnZV9wbWRfYWRkcmVzcyhtaWdyYXRlLVxcdTAwM2V2bWEsIGFkZHIsIHRydWUpO1xcbm1tL21pZ3JhdGVfZGV2aWNlLmM6OTI3OlxcdHJldCA9IGZvbGlvX3NwbGl0X3VubWFwcGVkKGZvbGlvLCAwKTtcXG5tbS9taWdyYXRlX2RldmljZS5jLTkyOC1cXHRpZiAocmV0KVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0wN1QyMTo1NDoyMC4yOTI2NDYzNzdaIiwiU2VxIjo3LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjozNzE0MTM5NjQxLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBoZXJlJ3MgbXkgdGFrZSBvbiB0aG9zZSB0aG91Z2h0cywgZnJhbWVkIGZyb20gbXkgZXhwZXJ0IHBlcnNwZWN0aXZlOlxuXG4qKkRpdmluZyBpbnRvIHRoZSBGb2xpbyBTd2FwIENhY2hlKipcblxuUmlnaHQsIHNvIGBmb2xpb19zcGxpdF91bm1hcHBlZGAgaXMgYmVpbmcgY2FsbGVkIGZyb20gYG1pZ3JhdGVfdm1hX3NwbGl0X3VubWFwcGVkX2ZvbGlvYCB3aXRoaW4gYG1tL21pZ3JhdGVfZGV2aWNlLmNgLiBUaGF0J3MgdGhlIGtleS4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgd2hhdCdzIGhhcHBlbmluZyBkdXJpbmcgdGhpcyB1bm1hcHBlZCBmb2xpbyBzcGxpdCBhcyBwYXJ0IG9mIHRoZSBWTUEgbWlncmF0aW9uIHByb2Nlc3MuIFNwZWNpZmljYWxseSwgSSBuZWVkIHRvIGtub3cgaG93IHRoZXNlIHVubWFwcGVkIGZvbGlvcyBhcmUgYmVpbmcgaGFuZGxlZCB3aGVuIHNwbGl0LlxuXG5NeSBndXQgZmVlbGluZyBpcyB0aGF0IGFueSB0aW1lIHdlIGFyZSBtaWdyYXRpbmcgVk1BcyBhbmQgd2UgYXJlIHNwbGl0dGluZyBhbiB1bm1hcHBlZCBmb2xpbywgaXQgbWVhbnMgdGhpcyBtdXN0IGJlIHZlcnkgaW1wb3J0YW50LlxuXG5UaGUgbmV4dCBsb2dpY2FsIHN0ZXAgaXMgdG8gZGl2ZSBpbnRvIGBfX3N3YXBfY2FjaGVfcmVwbGFjZV9mb2xpb2AuIFRoYXQgZnVuY3Rpb24gaXMgY3J1Y2lhbCB0byBmb2xpbyBzd2FwcGluZyBvcGVyYXRpb25zLCBzbyBJJ20gZ3Vlc3NpbmcgdGhhdCBpdCB3aWxsIHBsYXkgYSByb2xlIGluIGhvdyB1bm1hcHBlZCBmb2xpb3MgYXJlIGhhbmRsZWQuIEkgZXhwZWN0IHRvIGZpbmQgc29tZSBjcml0aWNhbCBjb250ZXh0IHRoZXJlIGFyb3VuZCBob3cgdGhlc2Ugc3BsaXQgdW5tYXBwZWQgZm9saW9zIGFyZSBpbnRlZ3JhdGVkIHdpdGggdGhlIHN3YXAgY2FjaGUsIGFuZCBpZiB0aGVyZSBhcmUgYW55IHNwZWNpZmljIGNvbnNpZGVyYXRpb25zIGZvciB1bm1hcHBlZCBmb2xpb3MuIEkgbmVlZCB0byB1bmRlcnN0YW5kIGlmIHRoaXMgaXMgYSBjcml0aWNhbCBjb2RlIHBhdGgsIG9yIGlmIG90aGVyIGNhbGxzIGFyZSBtb3JlIHNpZ25pZmljYW50LlxuXG5cbiIsIklucHV0VG9rZW5zIjoxNDM3OCwiT3V0cHV0VG9rZW5zIjoyOCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjQ5LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA3VDIxOjU0OjI0LjAwNjc4ODE4OFoiLCJTZXEiOjgsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxODExMzE5MTczLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcIl9fc3dhcF9jYWNoZV9yZXBsYWNlX2ZvbGlvXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIlwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJtbS9odWdlX21lbW9yeS5jPTM5MjY9c3RhdGljIGludCBfX2ZvbGlvX2ZyZWV6ZV9zcGxpdF91bm1hcChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyLFxcbi0tXFxubW0vaHVnZV9tZW1vcnkuYy00MDMzLVxcdFxcdGlmIChjaSlcXG5tbS9odWdlX21lbW9yeS5jOjQwMzQ6XFx0XFx0XFx0X19zd2FwX2NhY2hlX3JlcGxhY2VfZm9saW8oY2ksIGZvbGlvLCBuZXdfZm9saW8pO1xcbm1tL2h1Z2VfbWVtb3J5LmMtNDAzNS1cXHR9XFxuLS1cXG5tbS9taWdyYXRlLmM9NTgzPXN0YXRpYyBpbnQgX19mb2xpb19taWdyYXRlX21hcHBpbmcoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsXFxuLS1cXG5tbS9taWdyYXRlLmMtNjU2LVxcdGlmIChmb2xpb190ZXN0X3N3YXBjYWNoZShmb2xpbykpXFxubW0vbWlncmF0ZS5jOjY1NzpcXHRcXHRfX3N3YXBfY2FjaGVfcmVwbGFjZV9mb2xpbyhjaSwgZm9saW8sIG5ld2ZvbGlvKTtcXG5tbS9taWdyYXRlLmMtNjU4LVxcdGVsc2VcXG4tLVxcbm1tL3NobWVtLmM9MjA4OD1zdGF0aWMgaW50IHNobWVtX3JlcGxhY2VfZm9saW8oc3RydWN0IGZvbGlvICoqZm9saW9wLCBnZnBfdCBnZnAsXFxuLS1cXG5tbS9zaG1lbS5jLTIxMjUtXFx0Y2kgPSBzd2FwX2NsdXN0ZXJfZ2V0X2FuZF9sb2NrX2lycShvbGQpO1xcbm1tL3NobWVtLmM6MjEyNjpcXHRfX3N3YXBfY2FjaGVfcmVwbGFjZV9mb2xpbyhjaSwgb2xkLCBuZXcpO1xcbm1tL3NobWVtLmMtMjEyNy1cXHRtZW1fY2dyb3VwX3JlcGxhY2VfZm9saW8ob2xkLCBuZXcpO1xcbi0tXFxubW0vc3dhcC5oPTM0Mj12b2lkIF9fc3dhcF9jYWNoZV9kZWxfZm9saW8oc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSxcXG5tbS9zd2FwLmgtMzQzLVxcdFxcdFxcdCAgICBzdHJ1Y3QgZm9saW8gKmZvbGlvLCBzd3BfZW50cnlfdCBlbnRyeSwgdm9pZCAqc2hhZG93KTtcXG5tbS9zd2FwLmg6MzQ0OnZvaWQgX19zd2FwX2NhY2hlX3JlcGxhY2VfZm9saW8oc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSxcXG5tbS9zd2FwLmgtMzQ1LVxcdFxcdFxcdFxcdHN0cnVjdCBmb2xpbyAqb2xkLCBzdHJ1Y3QgZm9saW8gKm5ldyk7XFxuLS1cXG5tbS9zd2FwLmg9NDc2PXN0YXRpYyBpbmxpbmUgdm9pZCBfX3N3YXBfY2FjaGVfZGVsX2ZvbGlvKHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2ksXFxuLS1cXG5tbS9zd2FwLmgtNDgwLVxcbm1tL3N3YXAuaDo0ODE6c3RhdGljIGlubGluZSB2b2lkIF9fc3dhcF9jYWNoZV9yZXBsYWNlX2ZvbGlvKHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2ksXFxubW0vc3dhcC5oLTQ4Mi1cXHRcXHRzdHJ1Y3QgZm9saW8gKm9sZCwgc3RydWN0IGZvbGlvICpuZXcpXFxuLS1cXG5tbS9zd2FwX3N0YXRlLmM9MzM1PXZvaWQgc3dhcF9jYWNoZV9kZWxfZm9saW8oc3RydWN0IGZvbGlvICpmb2xpbylcXG4tLVxcbm1tL3N3YXBfc3RhdGUuYy0zNDctLyoqXFxubW0vc3dhcF9zdGF0ZS5jOjM0ODogKiBfX3N3YXBfY2FjaGVfcmVwbGFjZV9mb2xpbyAtIFJlcGxhY2UgYSBmb2xpbyBpbiB0aGUgc3dhcCBjYWNoZS5cXG5tbS9zd2FwX3N0YXRlLmMtMzQ5LSAqIEBjaTogVGhlIGxvY2tlZCBzd2FwIGNsdXN0ZXIuXFxuLS1cXG5tbS9zd2FwX3N0YXRlLmMtMzYwLSAqL1xcbm1tL3N3YXBfc3RhdGUuYzozNjE6dm9pZCBfX3N3YXBfY2FjaGVfcmVwbGFjZV9mb2xpbyhzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpLFxcbm1tL3N3YXBfc3RhdGUuYy0zNjItXFx0XFx0XFx0XFx0c3RydWN0IGZvbGlvICpvbGQsIHN0cnVjdCBmb2xpbyAqbmV3KVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0wN1QyMTo1NDoyNS44MTgxMTExMDFaIiwiU2VxIjo5LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo0NzQ5MDg0NTM4LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyB0aGUgS2VybmVsIFBhdGNoIGZvciBTd2FwIGFuZCBUSFAgSW50ZXJhY3Rpb24qKlxuXG5Pa2F5LCBzbyBJJ20gbG9va2luZyBhdCB0aGlzIHBhdGNoIGFuZCBpdCBzZWVtcyB0byBiZSBjZW50ZXJlZCBhcm91bmQgdGhlIGludGVyYWN0aW9uIG9mIFRyYW5zcGFyZW50IEh1Z2UgUGFnZXMgKFRIUCkgYW5kIHRoZSBzd2FwIGNhY2hlLCBzcGVjaWZpY2FsbHkgaW4gdGhlIG1lbW9yeSBtYW5hZ2VtZW50IHN1YnN5c3RlbS4gTXkgaW5pdGlhbCB0aG91Z2h0IGlzIHRoYXQgdGhlIGNvcmUgY2hhbmdlIGFwcGVhcnMgdG8gYmUgYSBtb2RpZmljYXRpb24gd2l0aGluIGBtbS9zd2FwX3N0YXRlLmNgLCBzcGVjaWZpY2FsbHkgdG8gdGhlIGBfX3N3YXBfY2FjaGVfcmVwbGFjZV9mb2xpb2AgZnVuY3Rpb24uIEluc3RlYWQgb2YgdXNpbmcgYSBgd2hpbGVgIGxvb3AsIHRoZXkndmUgc3dpdGNoZWQgdG8gYSBgZG8geyAuLi4gfSB3aGlsZWAgY29uc3RydWN0LiBJJ2xsIG5lZWQgdG8gZHJpbGwgZG93biB0byB1bmRlcnN0YW5kIHRoZSByYXRpb25hbGUgYmVoaW5kIHRoYXQgY2hhbmdlLlxuXG5UaGUgb3RoZXIgY3J1Y2lhbCBhcmVhIHNlZW1zIHRvIGJlIHdpdGhpbiBgbW0vaHVnZV9tZW1vcnkuY2AsIGFuZCBJJ20gZ3Vlc3NpbmcgdGhhdCB0aGlzIGlzIHdoZXJlIHRoZSBUSFAtc3BlY2lmaWMgbG9naWMgY29tZXMgaW50byBwbGF5LiBJJ2xsIG5lZWQgdG8gbWV0aWN1bG91c2x5IGFuYWx5emUgdGhlIGZvbGxvd2luZyBmdW5jdGlvbnM6IGBzcGxpdF9odWdlX3BhZ2VfdG9fbGlzdF90b19vcmRlcmAsIGBmb2xpb19zcGxpdF91bm1hcHBlZGAsIGBfX3N3YXBfY2FjaGVfcmVwbGFjZV9mb2xpb2AgKGFnYWluLCB0byB1bmRlcnN0YW5kIHRoZSBpbnRlcmFjdGlvbnMpLCBhbmQgYHNwbGl0X2ZvbGlvX3RvX2xpc3RgLiBUaGVzZSBhcmUgdGhlIGtleSBwaWVjZXMgdG8gdW5kZXJzdGFuZCBob3cgYSBodWdlIHBhZ2UgaXMgaGFuZGxlZCB3aGVuIGl0IG5lZWRzIHRvIGJlIHN3YXBwZWQuXG5cbkJlZm9yZSBJIGdvIGZ1cnRoZXIsIEknbGwgcXVpY2tseSBjaGVjayB0aGUgS2NvbmZpZyBzZXR0aW5ncy4gSSBuZWVkIHRvIG1ha2Ugc3VyZSBgQ09ORklHX1RSQU5TUEFSRU5UX0hVR0VQQUdFYCBpcyBlbmFibGVkIGJlY2F1c2UgaXQncyByZXF1aXJlZCBmb3IgVEhQIGZ1bmN0aW9uYWxpdHkgdG8gYmUgcHJlc2VudC4gU2ltaWxhcmx5LCBJJ2xsIGNvbmZpcm0gYENPTkZJR19TV0FQYCBpcyBlbmFibGVkLCBhcyB0aGlzIHdpbGwgYWxsb3cgZm9yIHN3YXBjYWNoZSB0byBiZSBpbiBlZmZlY3QuIEkgc2hvdWxkIGFsc28gZ2xhbmNlIGZvciBhbnkgb3RoZXIgcmVsYXRlZCBjb25maWdzLCBqdXN0IHRvIGVuc3VyZSBJIGhhdmUgdGhlIGZ1bGwgcGljdHVyZS5cblxuXG4iLCJJbnB1dFRva2VucyI6MTU0MjgsIk91dHB1dFRva2VucyI6MjgsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxNjUsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDdUMjE6NTQ6MzAuNTY3MTk4MDQ5WiIsIlNlcSI6MTAsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNjU0ODQ0NzM0LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRVwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwibW0vS2NvbmZpZz04MzE9Y29uZmlnIE1NX0lEXFxuLS1cXG5tbS9LY29uZmlnLTgzMy1cXG5tbS9LY29uZmlnOjgzNDptZW51Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFXFxubW0vS2NvbmZpZy04MzUtXFx0Ym9vbCBcXFwiVHJhbnNwYXJlbnQgSHVnZXBhZ2UgU3VwcG9ydFxcXCJcXG4tLVxcbm1tL0tjb25maWc9ODUyPWNob2ljZVxcbi0tXFxubW0vS2NvbmZpZy04NTctXFxubW0vS2NvbmZpZzo4NTg6XFx0Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX0FMV0FZU1xcbm1tL0tjb25maWctODU5LVxcdFxcdGJvb2wgXFxcImFsd2F5c1xcXCJcXG4tLVxcbm1tL0tjb25maWctODY0LVxcbm1tL0tjb25maWc6ODY1OlxcdGNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRV9NQURWSVNFXFxubW0vS2NvbmZpZy04NjYtXFx0XFx0Ym9vbCBcXFwibWFkdmlzZVxcXCJcXG4tLVxcbm1tL0tjb25maWctODczLVxcbm1tL0tjb25maWc6ODc0OlxcdGNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRV9ORVZFUlxcbm1tL0tjb25maWctODc1LVxcdFxcdGJvb2wgXFxcIm5ldmVyXFxcIlxcbi0tXFxubW0vS2NvbmZpZz04ODE9Y2hvaWNlXFxuLS1cXG5tbS9LY29uZmlnLTg5MC1cXG5tbS9LY29uZmlnOjg5MTpcXHRjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VfU0hNRU1fSFVHRV9ORVZFUlxcbm1tL0tjb25maWctODkyLVxcdFxcdGJvb2wgXFxcIm5ldmVyXFxcIlxcbi0tXFxubW0vS2NvbmZpZy05MDAtXFxubW0vS2NvbmZpZzo5MDE6XFx0Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX1NITUVNX0hVR0VfQUxXQVlTXFxubW0vS2NvbmZpZy05MDItXFx0XFx0Ym9vbCBcXFwiYWx3YXlzXFxcIlxcbi0tXFxubW0vS2NvbmZpZy05MDgtXFxubW0vS2NvbmZpZzo5MDk6XFx0Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX1NITUVNX0hVR0VfV0lUSElOX1NJWkVcXG5tbS9LY29uZmlnLTkxMC1cXHRcXHRib29sIFxcXCJ3aXRoaW5fc2l6ZVxcXCJcXG4tLVxcbm1tL0tjb25maWctOTE2LVxcbm1tL0tjb25maWc6OTE3OlxcdGNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRV9TSE1FTV9IVUdFX0FEVklTRVxcbm1tL0tjb25maWctOTE4LVxcdFxcdGJvb2wgXFxcImFkdmlzZVxcXCJcXG4tLVxcbm1tL0tjb25maWc9OTI2PWNob2ljZVxcbi0tXFxubW0vS2NvbmZpZy05MzUtXFxubW0vS2NvbmZpZzo5MzY6XFx0Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX1RNUEZTX0hVR0VfTkVWRVJcXG5tbS9LY29uZmlnLTkzNy1cXHRcXHRib29sIFxcXCJuZXZlclxcXCJcXG4tLVxcbm1tL0tjb25maWctOTQ0LVxcbm1tL0tjb25maWc6OTQ1OlxcdGNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRV9UTVBGU19IVUdFX0FMV0FZU1xcbm1tL0tjb25maWctOTQ2LVxcdFxcdGJvb2wgXFxcImFsd2F5c1xcXCJcXG4tLVxcbm1tL0tjb25maWctOTUyLVxcbm1tL0tjb25maWc6OTUzOlxcdGNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRV9UTVBGU19IVUdFX1dJVEhJTl9TSVpFXFxubW0vS2NvbmZpZy05NTQtXFx0XFx0Ym9vbCBcXFwid2l0aGluX3NpemVcXFwiXFxuLS1cXG5tbS9LY29uZmlnLTk2MC1cXG5tbS9LY29uZmlnOjk2MTpcXHRjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VfVE1QRlNfSFVHRV9BRFZJU0VcXG5tbS9LY29uZmlnLTk2Mi1cXHRcXHRib29sIFxcXCJhZHZpc2VcXFwiXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA3VDIxOjU0OjMyLjIyMjA0ODEwM1oiLCJTZXEiOjExLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo0MDQ4MzI3NDA3LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBoZXJlJ3MgbXkgdGFrZSBvbiB0aG9zZSB0aG91Z2h0cywgZnJhbWVkIGFzIG15IG93bjpcblxuKipPcHRpbWl6aW5nIE1lbW9yeSBNYW5hZ2VtZW50OiBUcmFuc3BhcmVudCBIdWdlcGFnZXMgYW5kIEJleW9uZCoqXG5cbkFscmlnaHQsIGxldCdzIHRoaW5rIHRoaXMgdGhyb3VnaC4gSSdtIGxlYW5pbmcgdG93YXJkcyBlbmFibGluZyBgVFJBTlNQQVJFTlRfSFVHRVBBR0VgIGFsb25nc2lkZSBgU1dBUGAgaW4gdGhpcyBlbnZpcm9ubWVudC4gVGhlIHBvdGVudGlhbCBwZXJmb3JtYW5jZSBnYWlucyB3aXRoIGh1Z2VwYWdlcyBhcmUgc2lnbmlmaWNhbnQsIGFuZCBwcm9wZXJseSBjb25maWd1cmVkIHN3YXBwaW5nIGNhbiBiZSBlc3NlbnRpYWwgZm9yIG1hbmFnaW5nIG1lbW9yeSBwcmVzc3VyZS5cblxuTm93LCBJJ20gZ2V0dGluZyBjdXJpb3VzIGFib3V0IHRoZSBpbm5lciB3b3JraW5ncy4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgaG93IHBhZ2VzIGFyZSBtYW5hZ2VkIHdpdGhpbiB0aGUgaHVnZXBhZ2Ugc3lzdGVtLiBNeSBpbW1lZGlhdGUgcXVlc3Rpb24gaXMgd2hldGhlciBgc3BsaXRfaHVnZV9wYWdlX3RvX2xpc3RfdG9fb3JkZXJgIGlzIGFjY2Vzc2libGUuIEkgbmVlZCB0byB2ZXJpZnkgdGhhdCBpdCdzIGV4cG9ydGVkIGFuZCByZWFjaGFibGUuIEdvb2QsIGl0IGxvb2tzIGxpa2UgYHNwbGl0X2ZvbGlvX3RvX2xpc3RgIGFuZCBgc3BsaXRfaHVnZV9wYWdlYCBib3RoIHVzZSBgc3BsaXRfaHVnZV9wYWdlX3RvX2xpc3RfdG9fb3JkZXJgLiBUaGlzIGlzIHByb21pc2luZzsgdW5kZXJzdGFuZGluZyBpdHMgcm9sZSBpcyBrZXkuXG5cbk5vdyBJIG5lZWQgdG8gZGl2ZSBkZWVwZXIuIE15IG5leHQgc3RlcCBpcyB0byBleGFtaW5lIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGBzcGxpdF9odWdlX3BhZ2VgLiBJJ2xsIG5lZWQgdG8gdW5kZXJzdGFuZCBob3cgaXQgaW50ZXJhY3RzIHdpdGggdGhlIGxvd2VyIGxldmVscyBvZiBtZW1vcnkgbWFuYWdlbWVudCwgdGhlIGZvbGlvIHN0cnVjdHVyZSwgYW5kIHRoZSBsaXN0IG1hbmFnZW1lbnQuIFRoaXMgd2lsbCBsaWtlbHkgcHJvdmlkZSBpbnNpZ2h0cyBpbnRvIGhvdyBodWdlcGFnZXMgYXJlIG1hbmFnZWQgYW5kIHNwbGl0IGluIHRoZSBzeXN0ZW0uXG5cblxuIiwiSW5wdXRUb2tlbnMiOjE2Njc3LCJPdXRwdXRUb2tlbnMiOjI3LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6ODEsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDdUMjE6NTQ6MzYuMjcwMzc4WiIsIlNlcSI6MTIsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo0NjU0MDMwNywiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJzcGxpdF9odWdlX3BhZ2VcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwibW0vXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm1tL2h1Z2VfbWVtb3J5LmM9NDMzNz1pbnQgZm9saW9fc3BsaXRfdW5tYXBwZWQoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlcilcXG4tLVxcbm1tL2h1Z2VfbWVtb3J5LmMtNDM5NC0gKi9cXG5tbS9odWdlX21lbW9yeS5jOjQzOTU6aW50IF9fc3BsaXRfaHVnZV9wYWdlX3RvX2xpc3RfdG9fb3JkZXIoc3RydWN0IHBhZ2UgKnBhZ2UsIHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QsXFxubW0vaHVnZV9tZW1vcnkuYy00Mzk2LVxcdFxcdFxcdFxcdCAgICAgdW5zaWduZWQgaW50IG5ld19vcmRlcilcXG4tLVxcbm1tL2h1Z2VfbWVtb3J5LmMtNDQxMi0gKiBJdCBoYXMgdGhlIHNhbWUgcHJlcmVxdWlzaXRlcyBhbmQgcmV0dXJucyBhc1xcbm1tL2h1Z2VfbWVtb3J5LmM6NDQxMzogKiBzcGxpdF9odWdlX3BhZ2VfdG9fbGlzdF90b19vcmRlcigpLlxcbm1tL2h1Z2VfbWVtb3J5LmMtNDQxNC0gKlxcbi0tXFxubW0vaHVnZV9tZW1vcnkuYz00NDYyPWludCBzcGxpdF9mb2xpb190b19saXN0KHN0cnVjdCBmb2xpbyAqZm9saW8sIHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QpXFxubW0vaHVnZV9tZW1vcnkuYy00NDYzLXtcXG5tbS9odWdlX21lbW9yeS5jOjQ0NjQ6XFx0cmV0dXJuIHNwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyKFxcdTAwMjZmb2xpby1cXHUwMDNlcGFnZSwgbGlzdCwgMCk7XFxubW0vaHVnZV9tZW1vcnkuYy00NDY1LX1cXG4tLVxcbm1tL2h1Z2VfbWVtb3J5LmM9NDYyMT1zdGF0aWMgdW5zaWduZWQgbG9uZyBkZWZlcnJlZF9zcGxpdF9zY2FuKHN0cnVjdCBzaHJpbmtlciAqc2hyaW5rLFxcbi0tXFxubW0vaHVnZV9tZW1vcnkuYy00NjgzLSNpZmRlZiBDT05GSUdfREVCVUdfRlNcXG5tbS9odWdlX21lbW9yeS5jOjQ2ODQ6c3RhdGljIHZvaWQgc3BsaXRfaHVnZV9wYWdlc19hbGwodm9pZClcXG5tbS9odWdlX21lbW9yeS5jLTQ2ODUte1xcbi0tXFxubW0vaHVnZV9tZW1vcnkuYz00NzM0PXN0YXRpYyBpbmxpbmUgYm9vbCB2bWFfbm90X3N1aXRhYmxlX2Zvcl90aHBfc3BsaXQoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpXFxuLS1cXG5tbS9odWdlX21lbW9yeS5jLTQ3NDctXFxubW0vaHVnZV9tZW1vcnkuYzo0NzQ4OnN0YXRpYyBpbnQgc3BsaXRfaHVnZV9wYWdlc19waWQoaW50IHBpZCwgdW5zaWduZWQgbG9uZyB2YWRkcl9zdGFydCxcXG5tbS9odWdlX21lbW9yeS5jLTQ3NDktXFx0XFx0XFx0XFx0dW5zaWduZWQgbG9uZyB2YWRkcl9lbmQsIHVuc2lnbmVkIGludCBuZXdfb3JkZXIsXFxuLS1cXG5tbS9odWdlX21lbW9yeS5jLTQ4MTctXFx0XFx0LypcXG5tbS9odWdlX21lbW9yeS5jOjQ4MTg6XFx0XFx0ICogRm9yIGZvbGlvcyB3aXRoIHByaXZhdGUsIHNwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyKClcXG5tbS9odWdlX21lbW9yeS5jLTQ4MTktXFx0XFx0ICogd2lsbCB0cnkgdG8gZHJvcCBpdCBiZWZvcmUgc3BsaXQgYW5kIHRoZW4gY2hlY2sgaWYgdGhlIGZvbGlvXFxuLS1cXG5tbS9odWdlX21lbW9yeS5jLTQ4NjQtXFxubW0vaHVnZV9tZW1vcnkuYzo0ODY1OnN0YXRpYyBpbnQgc3BsaXRfaHVnZV9wYWdlc19pbl9maWxlKGNvbnN0IGNoYXIgKmZpbGVfcGF0aCwgcGdvZmZfdCBvZmZfc3RhcnQsXFxubW0vaHVnZV9tZW1vcnkuYy00ODY2LVxcdFxcdFxcdFxcdHBnb2ZmX3Qgb2ZmX2VuZCwgdW5zaWduZWQgaW50IG5ld19vcmRlcixcXG4tLVxcbm1tL2h1Z2VfbWVtb3J5LmMtNDkzNC1cXG5tbS9odWdlX21lbW9yeS5jOjQ5MzU6c3RhdGljIHNzaXplX3Qgc3BsaXRfaHVnZV9wYWdlc193cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZixcXG5tbS9odWdlX21lbW9yeS5jLTQ5MzYtXFx0XFx0XFx0XFx0c2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3BzKVxcbi0tXFxubW0vaHVnZV9tZW1vcnkuYy00OTgyLVxcdFxcdH1cXG5tbS9odWdlX21lbW9yeS5jOjQ5ODM6XFx0XFx0cmV0ID0gc3BsaXRfaHVnZV9wYWdlc19pbl9maWxlKGZpbGVfcGF0aCwgb2ZmX3N0YXJ0LCBvZmZfZW5kLFxcbm1tL2h1Z2VfbWVtb3J5LmMtNDk4NC1cXHRcXHRcXHRcXHRuZXdfb3JkZXIsIGluX2ZvbGlvX29mZnNldCk7XFxuLS1cXG5tbS9odWdlX21lbW9yeS5jLTQ5OTMtXFx0aWYgKHJldCA9PSAxIFxcdTAwMjZcXHUwMDI2IHBpZCA9PSAxKSB7XFxubW0vaHVnZV9tZW1vcnkuYzo0OTk0OlxcdFxcdHNwbGl0X2h1Z2VfcGFnZXNfYWxsKCk7XFxubW0vaHVnZV9tZW1vcnkuYy00OTk1LVxcdFxcdHJldCA9IHN0cmxlbihpbnB1dF9idWYpO1xcbi0tXFxubW0vaHVnZV9tZW1vcnkuYy01MDAxLVxcbm1tL2h1Z2VfbWVtb3J5LmM6NTAwMjpcXHRyZXQgPSBzcGxpdF9odWdlX3BhZ2VzX3BpZChwaWQsIHZhZGRyX3N0YXJ0LCB2YWRkcl9lbmQsIG5ld19vcmRlcixcXG5tbS9odWdlX21lbW9yeS5jLTUwMDMtXFx0XFx0XFx0aW5fZm9saW9fb2Zmc2V0KTtcXG4tLVxcbm1tL2h1Z2VfbWVtb3J5LmMtNTAxMS1cXG5tbS9odWdlX21lbW9yeS5jOjUwMTI6c3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgc3BsaXRfaHVnZV9wYWdlc19mb3BzID0ge1xcbm1tL2h1Z2VfbWVtb3J5LmMtNTAxMy1cXHQub3duZXJcXHQgPSBUSElTX01PRFVMRSxcXG5tbS9odWdlX21lbW9yeS5jOjUwMTQ6XFx0LndyaXRlXFx0ID0gc3BsaXRfaHVnZV9wYWdlc193cml0ZSxcXG5tbS9odWdlX21lbW9yeS5jLTUwMTUtfTtcXG5tbS9odWdlX21lbW9yeS5jLTUwMTYtXFxubW0vaHVnZV9tZW1vcnkuYzo1MDE3OnN0YXRpYyBpbnQgX19pbml0IHNwbGl0X2h1Z2VfcGFnZXNfZGVidWdmcyh2b2lkKVxcbm1tL2h1Z2VfbWVtb3J5LmMtNTAxOC17XFxubW0vaHVnZV9tZW1vcnkuYzo1MDE5OlxcdGRlYnVnZnNfY3JlYXRlX2ZpbGUoXFxcInNwbGl0X2h1Z2VfcGFnZXNcXFwiLCAwMjAwLCBOVUxMLCBOVUxMLFxcbm1tL2h1Z2VfbWVtb3J5LmM6NTAyMDpcXHRcXHRcXHQgICAgXFx1MDAyNnNwbGl0X2h1Z2VfcGFnZXNfZm9wcyk7XFxubW0vaHVnZV9tZW1vcnkuYy01MDIxLVxcdHJldHVybiAwO1xcbm1tL2h1Z2VfbWVtb3J5LmMtNTAyMi19XFxubW0vaHVnZV9tZW1vcnkuYzo1MDIzOmxhdGVfaW5pdGNhbGwoc3BsaXRfaHVnZV9wYWdlc19kZWJ1Z2ZzKTtcXG5tbS9odWdlX21lbW9yeS5jLTUwMjQtI2VuZGlmXFxuLS1cXG5tbS9odWdldGxiLmM9Mzk1Mz1zdGF0aWMgbG9uZyBkZW1vdGVfZnJlZV9odWdldGxiX2ZvbGlvcyhzdHJ1Y3QgaHN0YXRlICpzcmMsIHN0cnVjdCBoc3RhdGUgKmRzdCxcXG4tLVxcbm1tL2h1Z2V0bGIuYy0zOTg5LVxcdFxcdFxcdHN0cnVjdCBwYWdlICpwYWdlID0gZm9saW9fcGFnZShmb2xpbywgaSk7XFxubW0vaHVnZXRsYi5jOjM5OTA6XFx0XFx0XFx0LyogQ2FyZWZ1bDogc2VlIF9fc3BsaXRfaHVnZV9wYWdlX3RhaWwoKSAqL1xcbm1tL2h1Z2V0bGIuYy0zOTkxLVxcdFxcdFxcdHN0cnVjdCBmb2xpbyAqbmV3X2ZvbGlvID0gKHN0cnVjdCBmb2xpbyAqKXBhZ2U7XFxuLS1cXG5tbS9raHVnZXBhZ2VkLmM9ODEzPXN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IF9fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGUoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXFxuLS1cXG5tbS9raHVnZXBhZ2VkLmMtODY5LVxcdFxcdCAqIGZvbGlvIGNhbid0IGJlIGZyZWVkIGZyb20gdW5kZXIgdXMuIE5PVEU6IGZvbGlvIGxvY2tcXG5tbS9raHVnZXBhZ2VkLmM6ODcwOlxcdFxcdCAqIGlzIG5lZWRlZCB0byBzZXJpYWxpemUgYWdhaW5zdCBzcGxpdF9odWdlX3BhZ2UoKVxcbm1tL2todWdlcGFnZWQuYy04NzEtXFx0XFx0ICogd2hlbiBpbnZva2VkIGZyb20gdGhlIFZNLlxcbi0tXFxubW0va3NtLmM9MTQ5Nj1zdGF0aWMgaW50IHRyeV90b19tZXJnZV9vbmVfcGFnZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcXG4tLVxcbm1tL2tzbS5jLTE1MTgtXFx0aWYgKGZvbGlvX3Rlc3RfbGFyZ2UoZm9saW8pKSB7XFxubW0va3NtLmM6MTUxOTpcXHRcXHRpZiAoc3BsaXRfaHVnZV9wYWdlKHBhZ2UpKVxcbm1tL2tzbS5jLTE1MjAtXFx0XFx0XFx0Z290byBvdXRfdW5sb2NrO1xcbi0tXFxubW0va3NtLmM9MjI3Nj1zdGF0aWMgdm9pZCBjbXBfYW5kX21lcmdlX3BhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UsIHN0cnVjdCBrc21fcm1hcF9pdGVtICpybWFwX2l0ZW0pXFxuLS1cXG5tbS9rc20uYy0yMzYzLVxcdFxcdCAqIGZvbGlvLCB0aGVuIHdlIGFjdHVhbGx5IGVuZGVkIHVwIGluY3JlYXNpbmcgdGhlIHJlZmVyZW5jZVxcbm1tL2tzbS5jOjIzNjQ6XFx0XFx0ICogY291bnQgb2YgdGhlIHNhbWUgZm9saW8gdHdpY2UsIGFuZCBzcGxpdF9odWdlX3BhZ2UgZmFpbGVkLlxcbm1tL2tzbS5jLTIzNjUtXFx0XFx0ICpcXG5tbS9rc20uYy0yMzY2LVxcdFxcdCAqIEhlcmUgd2Ugc2V0IGEgZmxhZyBpZiB0aGF0IGhhcHBlbmVkLCBhbmQgd2UgdXNlIGl0IGxhdGVyIHRvXFxubW0va3NtLmM6MjM2NzpcXHRcXHQgKiB0cnkgc3BsaXRfaHVnZV9wYWdlIGFnYWluLiBTaW5jZSB3ZSBjYWxsIGZvbGlvX3B1dCgpIHJpZ2h0XFxubW0va3NtLmMtMjM2OC1cXHRcXHQgKiBhZnRlcndhcmRzLCB0aGUgcmVmZXJlbmNlIGNvdW50IHdpbGwgYmUgY29ycmVjdCBhbmRcXG5tbS9rc20uYzoyMzY5OlxcdFxcdCAqIHNwbGl0X2h1Z2VfcGFnZSBzaG91bGQgc3VjY2VlZC5cXG5tbS9rc20uYy0yMzcwLVxcdFxcdCAqL1xcbi0tXFxubW0va3NtLmMtMjQwOS1cXHRcXHRcXHRcXHRyZXR1cm47XFxubW0va3NtLmM6MjQxMDpcXHRcXHRcXHRzcGxpdF9odWdlX3BhZ2UocGFnZSk7XFxubW0va3NtLmMtMjQxMS1cXHRcXHRcXHRmb2xpbyA9IHBhZ2VfZm9saW8ocGFnZSk7XFxuLS1cXG5tbS9tZW1vcnktZmFpbHVyZS5jPTE3MTM9c3RhdGljIGludCB0cnlfdG9fc3BsaXRfdGhwX3BhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UsIHVuc2lnbmVkIGludCBuZXdfb3JkZXIsXFxuLS1cXG5tbS9tZW1vcnktZmFpbHVyZS5jLTE3MTgtXFx0bG9ja19wYWdlKHBhZ2UpO1xcbm1tL21lbW9yeS1mYWlsdXJlLmM6MTcxOTpcXHRyZXQgPSBzcGxpdF9odWdlX3BhZ2VfdG9fb3JkZXIocGFnZSwgbmV3X29yZGVyKTtcXG5tbS9tZW1vcnktZmFpbHVyZS5jLTE3MjAtXFx0dW5sb2NrX3BhZ2UocGFnZSk7XFxuLS1cXG5tbS9zaG1lbS5jPTM2MjI9c3RhdGljIGxvbmcgc2htZW1fZmFsbG9jYXRlKHN0cnVjdCBmaWxlICpmaWxlLCBpbnQgbW9kZSwgbG9mZl90IG9mZnNldCxcXG4tLVxcbm1tL3NobWVtLmMtMzcxMi1cXHQgKiBpbmZvLVxcdTAwM2VmYWxsb2NlbmQgaXMgb25seSByZWxldmFudCB3aGVuIGh1Z2UgcGFnZXMgbWlnaHQgYmVcXG5tbS9zaG1lbS5jOjM3MTM6XFx0ICogaW52b2x2ZWQ6IHRvIHByZXZlbnQgc3BsaXRfaHVnZV9wYWdlKCkgZnJlZWluZyBmYWxsb2NhdGVkXFxubW0vc2htZW0uYy0zNzE0LVxcdCAqIHBhZ2VzIHdoZW4gRkFMTE9DX0ZMX0tFRVBfU0laRSBjb21taXR0ZWQgYmV5b25kIGlfc2l6ZS5cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDdUMjE6NTQ6MzYuMzE2OTQ0Mzc3WiIsIlNlcSI6MTMsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjUwMjY2MTY2MTksIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIEh1Z2UgUGFnZSBTcGxpdHRpbmcgRnVuY3Rpb25zKipcblxuT2theSwgc28gSSBuZWVkIHRvIHplcm8gaW4gb24gdGhlc2UgZnVuY3Rpb25zOiBgc3BsaXRfaHVnZV9wYWdlX3RvX2xpc3RfdG9fb3JkZXJgLCBgZm9saW9fc3BsaXRfdW5tYXBwZWRgLCBgX19zd2FwX2NhY2hlX3JlcGxhY2VfZm9saW9gLCBhbmQgYHNwbGl0X2ZvbGlvX3RvX2xpc3RgLiBJIHRoaW5rIGBzcGxpdF9odWdlX3BhZ2VfdG9fbGlzdF90b19vcmRlcmAgaXMgdGhlIHJpZ2h0IG5hbWUsIGJ1dCBJIHdhbnQgdG8gbWFrZSBhYnNvbHV0ZWx5IHN1cmUuIExldCBtZSBxdWlja2x5IHZlcmlmeSB0aGF0LiBIbW0sIHllcCwgdGhlcmUgaXQgaXMgaW4gYG1tL2h1Z2VfbWVtb3J5LmNgLlxuXG5XYWl0IGEgbWludXRlLCB0aGUgYGdyZXBgIG91dHB1dCBhbHNvIHR1cm5lZCB1cCBgc3BsaXRfZm9saW9fdG9fbGlzdGAuIEFuZCwgaGFuZyBvbiwgdGhlcmUncyBgX19zcGxpdF9odWdlX3BhZ2VfdG9fbGlzdF90b19vcmRlcmAgYXMgd2VsbCEgT2theSwgY2xlYXJseSBJIG5lZWQgdG8gY2xhcmlmeSB3aGF0IHRoZSByZWxhdGlvbnNoaXAgaXMgYmV0d2VlbiB0aGVzZSBmdW5jdGlvbnMuIElzIGBzcGxpdF9odWdlX3BhZ2VgIHBlcmhhcHMgYSBtYWNybyBvciBpbmxpbmUgZnVuY3Rpb24/IExldCdzIGNoZWNrIGBpbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaGAgZm9yIHRoYXQgZGVmaW5pdGlvbi5cblxuXG4iLCJJbnB1dFRva2VucyI6MTkyNTksIk91dHB1dFRva2VucyI6MzQsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoyMjMsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDdUMjE6NTQ6NDEuMzQzNTYzMDI2WiIsIlNlcSI6MTQsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo0MTg4MzcwNywiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJzcGxpdF9odWdlX3BhZ2VcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwiaW5jbHVkZS9saW51eC9odWdlX21tLmhcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiaW5jbHVkZS9saW51eC9odWdlX21tLmg9Mzk4PWVudW0gc3BsaXRfdHlwZSB7XFxuLS1cXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaC00MDItXFxuaW5jbHVkZS9saW51eC9odWdlX21tLmg6NDAzOmludCBfX3NwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyKHN0cnVjdCBwYWdlICpwYWdlLCBzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LFxcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oLTQwNC1cXHRcXHR1bnNpZ25lZCBpbnQgbmV3X29yZGVyKTtcXG4tLVxcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oPTQxMD1pbnQgZm9saW9fc3BsaXQoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlciwgc3RydWN0IHBhZ2UgKnBhZ2UsXFxuLS1cXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaC00MTItXFxuaW5jbHVkZS9saW51eC9odWdlX21tLmg6NDEzOnN0YXRpYyBpbmxpbmUgaW50IHNwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyKHN0cnVjdCBwYWdlICpwYWdlLCBzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LFxcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oLTQxNC1cXHRcXHR1bnNpZ25lZCBpbnQgbmV3X29yZGVyKVxcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oLTQxNS17XFxuaW5jbHVkZS9saW51eC9odWdlX21tLmg6NDE2OlxcdHJldHVybiBfX3NwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyKHBhZ2UsIGxpc3QsIG5ld19vcmRlcik7XFxuaW5jbHVkZS9saW51eC9odWdlX21tLmgtNDE3LX1cXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaDo0MTg6c3RhdGljIGlubGluZSBpbnQgc3BsaXRfaHVnZV9wYWdlX3RvX29yZGVyKHN0cnVjdCBwYWdlICpwYWdlLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyKVxcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oLTQxOS17XFxuaW5jbHVkZS9saW51eC9odWdlX21tLmg6NDIwOlxcdHJldHVybiBzcGxpdF9odWdlX3BhZ2VfdG9fbGlzdF90b19vcmRlcihwYWdlLCBOVUxMLCBuZXdfb3JkZXIpO1xcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oLTQyMS19XFxuaW5jbHVkZS9saW51eC9odWdlX21tLmgtNDIyLVxcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oOjQyMzpzdGF0aWMgaW5saW5lIGludCBzcGxpdF9odWdlX3BhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UpXFxuaW5jbHVkZS9saW51eC9odWdlX21tLmgtNDI0LXtcXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaDo0MjU6XFx0cmV0dXJuIHNwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyKHBhZ2UsIE5VTEwsIDApO1xcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oLTQyNi19XFxuLS1cXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaD02NDU9c3RhdGljIGlubGluZSBpbnRcXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaDo2NDY6c3BsaXRfaHVnZV9wYWdlX3RvX2xpc3RfdG9fb3JkZXIoc3RydWN0IHBhZ2UgKnBhZ2UsIHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QsXFxuaW5jbHVkZS9saW51eC9odWdlX21tLmgtNjQ3LVxcdFxcdHVuc2lnbmVkIGludCBuZXdfb3JkZXIpXFxuLS1cXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaC02NTEtfVxcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oOjY1MjpzdGF0aWMgaW5saW5lIGludCBzcGxpdF9odWdlX3BhZ2VfdG9fb3JkZXIoc3RydWN0IHBhZ2UgKnBhZ2UsIHVuc2lnbmVkIGludCBuZXdfb3JkZXIpXFxuaW5jbHVkZS9saW51eC9odWdlX21tLmgtNjUzLXtcXG4tLVxcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oLTY1Ni19XFxuaW5jbHVkZS9saW51eC9odWdlX21tLmg6NjU3OnN0YXRpYyBpbmxpbmUgaW50IHNwbGl0X2h1Z2VfcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSlcXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaC02NTgte1xcbi0tXFxuaW5jbHVkZS9saW51eC9odWdlX21tLmg9ODI2PXN0YXRpYyBpbmxpbmUgaW50IHNwbGl0X2ZvbGlvX3RvX29yZGVyKHN0cnVjdCBmb2xpbyAqZm9saW8sIGludCBuZXdfb3JkZXIpXFxuaW5jbHVkZS9saW51eC9odWdlX21tLmgtODI3LXtcXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaDo4Mjg6XFx0cmV0dXJuIHNwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyKFxcdTAwMjZmb2xpby1cXHUwMDNlcGFnZSwgTlVMTCwgbmV3X29yZGVyKTtcXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaC04MjktfVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0wN1QyMTo1NDo0MS4zODU0NTE5MTNaIiwiU2VxIjoxNSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NDQxOTY1NDUyMSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgSHVnZSBQYWdlIFNwbGl0dGluZyBpbiB0aGUgS2VybmVsKipcblxuT2theSwgc28gSSdtIGRpdmluZyBpbnRvIHRoZSBodWdlIHBhZ2Ugc3BsaXR0aW5nIG1lY2hhbmlzbXMgd2l0aGluIHRoZSBrZXJuZWwsIHNwZWNpZmljYWxseSBmb2N1c2luZyBvbiB0aGUgY29yZSBmdW5jdGlvbnMuIE15IGluaXRpYWwgYXNzZXNzbWVudCBwb2ludHMgdG8gYF9fc3BsaXRfaHVnZV9wYWdlX3RvX2xpc3RfdG9fb3JkZXJgIHJlc2lkaW5nIHdpdGhpbiBgbW0vaHVnZV9tZW1vcnkuY2AgYXMgdGhlIGtleSBmdW5jdGlvbiBmb3IgdGhlIHNwbGl0IG9wZXJhdGlvbi4gSSdtIGFsc28gbm90aW5nIHRoYXQgYGZvbGlvX3NwbGl0X3VubWFwcGVkYCBpcyBhIGdsb2JhbCBmdW5jdGlvbiwgd2hpY2ggaXMgaW50ZXJlc3RpbmcgYXMgaXQgc3VnZ2VzdHMgaXRzIGF2YWlsYWJpbGl0eSBhY3Jvc3MgZGlmZmVyZW50IG1vZHVsZXMsIHdoaWNoIGltcGxpZXMgZ2VuZXJhbGl0eS4gYF9fc3dhcF9jYWNoZV9yZXBsYWNlX2ZvbGlvYCBpcyBhbHNvIGdsb2JhbGx5IGFjY2Vzc2libGUsIHdoaWNoIGluZGljYXRlcyBpdCdzIGVzc2VudGlhbCBmb3IgbWFuYWdpbmcgcGFnZSByZXBsYWNlbWVudCBkdXJpbmcgdGhlIHNwbGl0IG9wZXJhdGlvbnMuIEknbSBhbHNvIGFkZGluZyBgc3BsaXRfZm9saW9fdG9fbGlzdGAgdG8gdGhlIGxpc3Qgb2YgZ2xvYmFsbHkgZGVmaW5lZCBmdW5jdGlvbnMuXG5cbk5vdywgSSdtIGdvaW5nIHRvIGRpZyBkZWVwZXIgaW50byB0aGUgYWN0dWFsIGltcGxlbWVudGF0aW9uIG9mIGBfX3NwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyYCBpbiBgbW0vaHVnZV9tZW1vcnkuY2AgdG8gc2VlIGhvdyBpdCBhbGwgd29ya3MuIEkgbmVlZCB0byB1bmRlcnN0YW5kIGl0cyBsb2dpYy5cblxuXG4iLCJJbnB1dFRva2VucyI6MjA1ODEsIk91dHB1dFRva2VucyI6NDEsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxMDYsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDdUMjE6NTQ6NDUuODA1MTA5NjQ0WiIsIlNlcSI6MTYsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo0Mjk3NzU3NywiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJfX3NwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIm1tL2h1Z2VfbWVtb3J5LmNcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwibW0vaHVnZV9tZW1vcnkuYz00MzM3PWludCBmb2xpb19zcGxpdF91bm1hcHBlZChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyKVxcbi0tXFxubW0vaHVnZV9tZW1vcnkuYy00Mzk0LSAqL1xcbm1tL2h1Z2VfbWVtb3J5LmM6NDM5NTppbnQgX19zcGxpdF9odWdlX3BhZ2VfdG9fbGlzdF90b19vcmRlcihzdHJ1Y3QgcGFnZSAqcGFnZSwgc3RydWN0IGxpc3RfaGVhZCAqbGlzdCxcXG5tbS9odWdlX21lbW9yeS5jLTQzOTYtXFx0XFx0XFx0XFx0ICAgICB1bnNpZ25lZCBpbnQgbmV3X29yZGVyKVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0wN1QyMTo1NDo0NS44NDgwODkwMDFaIiwiU2VxIjoxNywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MzQ4MzgwMzc4NiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgbGV0J3MgZGl2ZSBpbnRvIHRoaXMuIEhlcmUncyBteSB0aG91Z2h0IHByb2Nlc3Mgb24gdGhlIG1hdHRlcjpcblxuKipDaGVja2luZyBgZm9saW9fc3BsaXRgIGluIGBtbS9odWdlX21lbW9yeS5jYCoqXG5cbkFscmlnaHQsIHRoZSB0YXNrIGF0IGhhbmQgaXMgdG8gdW5kZXJzdGFuZCBob3cgYGZvbGlvX3NwbGl0YCBpcyBvcGVyYXRpbmcgd2l0aGluIHRoZSBgbW0vaHVnZV9tZW1vcnkuY2AgZmlsZS4gTXkgZXhwZXJ0IGludHVpdGlvbiBpcyB0ZWxsaW5nIG1lIHRoYXQgdGhpcyBmdW5jdGlvbiBwbGF5cyBhIGNydWNpYWwgcm9sZSBpbiBtYW5hZ2luZyBhbmQgcG9zc2libHkgc3BsaXR0aW5nIGh1Z2UgcGFnZXMsIHdoaWNoIGlzIGEgY29yZSBmdW5jdGlvbmFsaXR5IGZvciBvcHRpbWl6ZWQgbWVtb3J5IHV0aWxpemF0aW9uLiBJIG5lZWQgdG8gcmVmcmVzaCBteSBtZW1vcnkgb24gdGhlIGludHJpY2FjaWVzIG9mIHRoZSBodWdlIHBhZ2UgaW1wbGVtZW50YXRpb24gd2l0aGluIHRoZSBrZXJuZWwncyBtZW1vcnkgbWFuYWdlbWVudCBzeXN0ZW0sIHBhcnRpY3VsYXJseSB3aGVyZSBgZm9saW9fc3BsaXRgIGZpdHMgaW50byB0aGF0IHdvcmtmbG93LiBTbywgSSB3aWxsIGZvY3VzIG9uIHJldmlld2luZyB0aGUgbG9naWMgdG8gY29tcHJlaGVuZCBob3cgYGZvbGlvX3NwbGl0YCBkZWFscyB3aXRoIHRoZSBwYXJ0aXRpb25pbmcgb2YgaHVnZSBwYWdlcyBpbnRvIHNtYWxsZXIgb25lcywgcG90ZW50aWFsbHkgZm9yIGltcHJvdmVkIG1lbW9yeSBhbGxvY2F0aW9uIGZsZXhpYmlsaXR5IG9yIHRvIGRlYWwgd2l0aCBmcmFnbWVudGF0aW9uLiBJJ2xsIGJlIGxvb2tpbmcgZm9yIGRldGFpbHMgcmVnYXJkaW5nIGxvY2tpbmcgbWVjaGFuaXNtcywgcmVmY291bnQgbWFuYWdlbWVudCwgYW5kIHRoZSBvdmVyYWxsIGltcGFjdCBvZiB0aGUgc3BsaXQgb24gdGhlIHBhZ2UgdGFibGVzIGFuZCB0aGUgYXNzb2NpYXRlZCBtZXRhZGF0YS4gSSBleHBlY3QgdG8gc2VlIGludGVyYWN0aW9ucyB3aXRoIHRoZSBmb2xpbyBzdHJ1Y3R1cmVzLCBwYWdlIGZsYWdzLCBhbmQgcG90ZW50aWFsbHkgdGhlIHJhZGl4IHRyZWUsIHNvIEknbGwgYmUgcGF5aW5nIGNsb3NlIGF0dGVudGlvbiB0byB0aGVzZSBlbGVtZW50cyBhcyBJIHJlYWQgdGhyb3VnaCB0aGUgcmVsZXZhbnQgY29kZS5cblxuXG4iLCJJbnB1dFRva2VucyI6MjEwNzMsIk91dHB1dFRva2VucyI6MzAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxOSwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0wN1QyMTo1NDo0OS4zMzE4OTQ5NTdaIiwiU2VxIjoxOCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjU0NTc5OTA2MiwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJmb2xpb19zcGxpdFwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJtbS9odWdlX21lbW9yeS5jXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm1tL2h1Z2VfbWVtb3J5LmM9Mzc5NT1zdGF0aWMgaW50IF9fc3BsaXRfdW5tYXBwZWRfZm9saW8oc3RydWN0IGZvbGlvICpmb2xpbywgaW50IG5ld19vcmRlcixcXG4tLVxcbm1tL2h1Z2VfbWVtb3J5LmMtMzgzOC1cXG5tbS9odWdlX21lbW9yeS5jOjM4Mzk6XFx0XFx0Zm9saW9fc3BsaXRfbWVtY2dfcmVmcyhmb2xpbywgb2xkX29yZGVyLCBzcGxpdF9vcmRlcik7XFxubW0vaHVnZV9tZW1vcnkuYy0zODQwLVxcdFxcdHNwbGl0X3BhZ2Vfb3duZXIoXFx1MDAyNmZvbGlvLVxcdTAwM2VwYWdlLCBvbGRfb3JkZXIsIHNwbGl0X29yZGVyKTtcXG4tLVxcbm1tL2h1Z2VfbWVtb3J5LmM9NDA2MD1zdGF0aWMgaW50IF9fZm9saW9fZnJlZXplX3NwbGl0X3VubWFwX2ZpbGUoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlcixcXG4tLVxcbm1tL2h1Z2VfbWVtb3J5LmMtNDIyNi0vKipcXG5tbS9odWdlX21lbW9yeS5jOjQyMjc6ICogX19mb2xpb19zcGxpdCgpIC0gc3BsaXQgYSBmb2xpbyBhdCBAc3BsaXRfYXQgdG8gYSBAbmV3X29yZGVyIGZvbGlvXFxubW0vaHVnZV9tZW1vcnkuYy00MjI4LSAqIEBmb2xpbzogZm9saW8gdG8gc3BsaXRcXG4tLVxcbm1tL2h1Z2VfbWVtb3J5LmMtNDI0Ni0gKi9cXG5tbS9odWdlX21lbW9yeS5jOjQyNDc6c3RhdGljIGludCBfX2ZvbGlvX3NwbGl0KHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIsXFxubW0vaHVnZV9tZW1vcnkuYy00MjQ4LVxcdFxcdHN0cnVjdCBwYWdlICpzcGxpdF9hdCwgc3RydWN0IHBhZ2UgKmxvY2tfYXQsXFxuLS1cXG5tbS9odWdlX21lbW9yeS5jLTQzMTUtLyoqXFxubW0vaHVnZV9tZW1vcnkuYzo0MzE2OiAqIGZvbGlvX3NwbGl0X3VubWFwcGVkKCkgLSBzcGxpdCBhIGxhcmdlIGFub24gZm9saW8gdGhhdCBpcyBhbHJlYWR5IHVubWFwcGVkXFxubW0vaHVnZV9tZW1vcnkuYy00MzE3LSAqIEBmb2xpbzogZm9saW8gdG8gc3BsaXRcXG4tLVxcbm1tL2h1Z2VfbWVtb3J5LmMtNDMzNi0gKi9cXG5tbS9odWdlX21lbW9yeS5jOjQzMzc6aW50IGZvbGlvX3NwbGl0X3VubWFwcGVkKHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIpXFxubW0vaHVnZV9tZW1vcnkuYy00MzM4LXtcXG4tLVxcbm1tL2h1Z2VfbWVtb3J5LmM9NDM5NT1pbnQgX19zcGxpdF9odWdlX3BhZ2VfdG9fbGlzdF90b19vcmRlcihzdHJ1Y3QgcGFnZSAqcGFnZSwgc3RydWN0IGxpc3RfaGVhZCAqbGlzdCxcXG4tLVxcbm1tL2h1Z2VfbWVtb3J5LmMtNDM5OS1cXG5tbS9odWdlX21lbW9yeS5jOjQ0MDA6XFx0cmV0dXJuIF9fZm9saW9fc3BsaXQoZm9saW8sIG5ld19vcmRlciwgXFx1MDAyNmZvbGlvLVxcdTAwM2VwYWdlLCBwYWdlLCBsaXN0LFxcbm1tL2h1Z2VfbWVtb3J5LmMtNDQwMS1cXHRcXHRcXHQgICAgIFNQTElUX1RZUEVfVU5JRk9STSk7XFxuLS1cXG5tbS9odWdlX21lbW9yeS5jLTQ0MDQtLyoqXFxubW0vaHVnZV9tZW1vcnkuYzo0NDA1OiAqIGZvbGlvX3NwbGl0KCkgLSBzcGxpdCBhIGZvbGlvIGF0IEBzcGxpdF9hdCB0byBhIEBuZXdfb3JkZXIgZm9saW9cXG5tbS9odWdlX21lbW9yeS5jLTQ0MDYtICogQGZvbGlvOiBmb2xpbyB0byBzcGxpdFxcbi0tXFxubW0vaHVnZV9tZW1vcnkuYy00NDI3LSAqL1xcbm1tL2h1Z2VfbWVtb3J5LmM6NDQyODppbnQgZm9saW9fc3BsaXQoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlcixcXG5tbS9odWdlX21lbW9yeS5jLTQ0MjktXFx0XFx0c3RydWN0IHBhZ2UgKnNwbGl0X2F0LCBzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0KVxcbm1tL2h1Z2VfbWVtb3J5LmMtNDQzMC17XFxubW0vaHVnZV9tZW1vcnkuYzo0NDMxOlxcdHJldHVybiBfX2ZvbGlvX3NwbGl0KGZvbGlvLCBuZXdfb3JkZXIsIHNwbGl0X2F0LCBcXHUwMDI2Zm9saW8tXFx1MDAzZXBhZ2UsIGxpc3QsXFxubW0vaHVnZV9tZW1vcnkuYy00NDMyLVxcdFxcdFxcdCAgICAgU1BMSVRfVFlQRV9OT05fVU5JRk9STSk7XFxuLS1cXG5tbS9odWdlX21lbW9yeS5jPTQ3NDg9c3RhdGljIGludCBzcGxpdF9odWdlX3BhZ2VzX3BpZChpbnQgcGlkLCB1bnNpZ25lZCBsb25nIHZhZGRyX3N0YXJ0LFxcbi0tXFxubW0vaHVnZV9tZW1vcnkuYy00ODQwLVxcdFxcdFxcdFxcdFxcdFxcdFxcdCAgIGluX2ZvbGlvX29mZnNldCk7XFxubW0vaHVnZV9tZW1vcnkuYzo0ODQxOlxcdFxcdFxcdGlmICghZm9saW9fc3BsaXQoZm9saW8sIHRhcmdldF9vcmRlciwgc3BsaXRfYXQsIE5VTEwpKVxcbm1tL2h1Z2VfbWVtb3J5LmMtNDg0Mi1cXHRcXHRcXHRcXHRzcGxpdCsrO1xcbi0tXFxubW0vaHVnZV9tZW1vcnkuYz00ODY1PXN0YXRpYyBpbnQgc3BsaXRfaHVnZV9wYWdlc19pbl9maWxlKGNvbnN0IGNoYXIgKmZpbGVfcGF0aCwgcGdvZmZfdCBvZmZfc3RhcnQsXFxuLS1cXG5tbS9odWdlX21lbW9yeS5jLTQ5MTYtXFx0XFx0XFx0XFx0XFx0XFx0XFx0ICAgaW5fZm9saW9fb2Zmc2V0KTtcXG5tbS9odWdlX21lbW9yeS5jOjQ5MTc6XFx0XFx0XFx0aWYgKCFmb2xpb19zcGxpdChmb2xpbywgdGFyZ2V0X29yZGVyLCBzcGxpdF9hdCwgTlVMTCkpXFxubW0vaHVnZV9tZW1vcnkuYy00OTE4LVxcdFxcdFxcdFxcdHNwbGl0Kys7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA3VDIxOjU0OjQ5Ljg3NzY5ODYxOVoiLCJTZXEiOjE5LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjozMDQ5OTA3MTM3LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBoZXJlJ3MgbXkgdGFrZSBvbiB0aG9zZSB0aG91Z2h0cywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZTpcblxuKipBbmFseXppbmcgdGhlIEdsb2JhbCBTY29wZSBvZiBgZm9saW9fc3BsaXRgKipcblxuQWxyaWdodCwgc28gSSdtIGRlYWxpbmcgd2l0aCB0aGUgYGZvbGlvX3NwbGl0YCBmdW5jdGlvbi4gSSByZW1lbWJlciBpdCdzIGEgZ2xvYmFsIGZ1bmN0aW9uLCBtZWFuaW5nIGl0J3MgbGlrZWx5IGFjY2Vzc2libGUgZnJvbSB2YXJpb3VzIHBhcnRzIG9mIHRoZSBrZXJuZWwuIFRoaXMgaW1tZWRpYXRlbHkgbWFrZXMgbWUgdGhpbmsgYWJvdXQgcG90ZW50aWFsIGNyb3NzLW1vZHVsZSBkZXBlbmRlbmNpZXMgYW5kIHRoZSBvdmVyYWxsIGltcGFjdCBvZiBtb2RpZmljYXRpb25zLiBNeSBuZXh0IHN0ZXAgaXMgY2xlYXIuIEkgbmVlZCB0byB6ZXJvIGluIG9uIGl0cyBkZWZpbml0aW9uIGFuZCB1bmRlcnN0YW5kIGl0cyBwcmVjaXNlIGJlaGF2aW9yLiBTcGVjaWZpY2FsbHksIEknbSBnb2luZyB0byBsb29rIGF0IGBmb2xpb19zcGxpdGAgaW4gYGluY2x1ZGUvbGludXgvaHVnZV9tbS5oYC4gVGhhdCBoZWFkZXIgZmlsZSBpcyBhIHByaW1lIGNhbmRpZGF0ZSBmb3IgZGVmaW5pbmcgY29yZSBmb2xpbyBvcGVyYXRpb25zIGFuZCBzdHJ1Y3R1cmVzLiBUaGlzIHdpbGwgZ2l2ZSBtZSBhIHNvbGlkIGZvdW5kYXRpb24gZm9yIHVuZGVyc3RhbmRpbmcgdGhlIHNjb3BlIG9mIHdoYXQgSSdtIGRlYWxpbmcgd2l0aC5cblxuXG4iLCJJbnB1dFRva2VucyI6MjI0MDEsIk91dHB1dFRva2VucyI6MzIsIk91dHB1dFRob3VnaHRzVG9rZW5zIjozNCwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0wN1QyMTo1NDo1Mi45Mjc2MDgwNTZaIiwiU2VxIjoyMCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjQzMTc2OTE3LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImZvbGlvX3NwbGl0XCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcImluY2x1ZGUvbGludXgvaHVnZV9tbS5oXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImluY2x1ZGUvbGludXgvaHVnZV9tbS5oPTQwMz1pbnQgX19zcGxpdF9odWdlX3BhZ2VfdG9fbGlzdF90b19vcmRlcihzdHJ1Y3QgcGFnZSAqcGFnZSwgc3RydWN0IGxpc3RfaGVhZCAqbGlzdCxcXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaC00MDQtXFx0XFx0dW5zaWduZWQgaW50IG5ld19vcmRlcik7XFxuaW5jbHVkZS9saW51eC9odWdlX21tLmg6NDA1OmludCBmb2xpb19zcGxpdF91bm1hcHBlZChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyKTtcXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaC00MDYtdW5zaWduZWQgaW50IG1pbl9vcmRlcl9mb3Jfc3BsaXQoc3RydWN0IGZvbGlvICpmb2xpbyk7XFxuLS1cXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaD00MDg9aW50IGZvbGlvX2NoZWNrX3NwbGl0dGFibGUoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlcixcXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaC00MDktXFx0XFx0XFx0ICAgZW51bSBzcGxpdF90eXBlIHNwbGl0X3R5cGUpO1xcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oOjQxMDppbnQgZm9saW9fc3BsaXQoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlciwgc3RydWN0IHBhZ2UgKnBhZ2UsXFxuaW5jbHVkZS9saW51eC9odWdlX21tLmgtNDExLVxcdFxcdHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QpO1xcbi0tXFxuaW5jbHVkZS9saW51eC9odWdlX21tLmg9NjY5PXN0YXRpYyBpbmxpbmUgaW50IHNwbGl0X2ZvbGlvX3RvX2xpc3Qoc3RydWN0IGZvbGlvICpmb2xpbywgc3RydWN0IGxpc3RfaGVhZCAqbGlzdClcXG4tLVxcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oLTY3NC1cXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaDo2NzU6c3RhdGljIGlubGluZSBpbnQgZm9saW9fc3BsaXQoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlcixcXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaC02NzYtXFx0XFx0c3RydWN0IHBhZ2UgKnBhZ2UsIHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QpXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA3VDIxOjU0OjUyLjk3MDc4ODMzM1oiLCJTZXEiOjIxLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo0NDM3OTM3MTAwLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyBIdWdlIFBhZ2UgU3BsaXR0aW5nKipcblxuT2theSwgc28gSSBuZWVkIHRvIHplcm8gaW4gb24gdGhlIGZ1bmN0aW9ucyByZWxhdGVkIHRvIHNwbGl0dGluZyBodWdlIHBhZ2VzLiBGcm9tIHdoYXQgSSBjYW4gc2VlLCB0aGUgY29yZSBvbmVzIHNlZW0gdG8gYmUgYF9fc3BsaXRfaHVnZV9wYWdlX3RvX2xpc3RfdG9fb3JkZXJgLCBgZm9saW9fc3BsaXRgLCBgZm9saW9fc3BsaXRfdW5tYXBwZWRgLCBhbmQgYF9fc3dhcF9jYWNoZV9yZXBsYWNlX2ZvbGlvYC4gVGhvc2UgYXJlIGRlZmluaXRlbHkgdGhlIGNydWNpYWwgcGllY2VzIG9mIHRoZSBwdXp6bGUuXG5cbk5vdywgbGV0J3MganVzdCBtYWtlIHN1cmUgSSBoYXZlbid0IG1pc3NlZCBhbnkgcmVsZXZhbnQgY29uZmlndXJhdGlvbiBvcHRpb25zLiBJJ20gYWxyZWFkeSBmYW1pbGlhciB3aXRoIGBUUkFOU1BBUkVOVF9IVUdFUEFHRWAsIG9idmlvdXNseSwgYnV0IEknbGwgbWFrZSBhIHF1aWNrIG1lbnRhbCBub3RlIG9mIGBTV0FQYCBhcyB3ZWxsIOKAkyBhbHdheXMgZ29vZCB0byBrZWVwIHRob3NlIGRlcGVuZGVuY2llcyBpbiBtaW5kLlxuXG5SaWdodCwgbmV4dCBzdGVwLiBJIHNob3VsZCByZWFsbHkgY2hlY2sgaG93IGBmb2xpb19jaGVja19zcGxpdHRhYmxlYCB3b3Jrcy4gSXMgaXQgZXhwb3J0ZWQ/IEhtbSwgeWVwLCBsb29rcyBsaWtlIGl0J3MgZGVmaW5lZCBpbiBgaW5jbHVkZS9saW51eC9odWdlX21tLmhgLiBUaGF0IG1ha2VzIHRoaW5ncyBlYXNpZXIuIE5vdywgdG8gdW5kZXJzdGFuZCB0aGUgYWN0dWFsIGltcGxlbWVudGF0aW9uLCBJIHNob3VsZCBmaW5kIHdoZXJlIGBmb2xpb19jaGVja19zcGxpdHRhYmxlYCBpcyBkZWZpbmVkLiBJIGJldCBpdCdzIGluIGBtbS9odWdlX21lbW9yeS5jYCwgc28gSSdsbCBnbyB0aGVyZSBhbmQgc3RhcnQgdGhlcmUuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjIzMDE1LCJPdXRwdXRUb2tlbnMiOjM0LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTQ4LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA3VDIxOjU0OjU3LjQwODcyOTAyM1oiLCJTZXEiOjIyLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NDM4MjEyNTcsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiZm9saW9fY2hlY2tfc3BsaXR0YWJsZVwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJtbS9odWdlX21lbW9yeS5jXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm1tL2h1Z2VfbWVtb3J5LmM9Mzc5NT1zdGF0aWMgaW50IF9fc3BsaXRfdW5tYXBwZWRfZm9saW8oc3RydWN0IGZvbGlvICpmb2xpbywgaW50IG5ld19vcmRlcixcXG4tLVxcbm1tL2h1Z2VfbWVtb3J5LmMtMzg2MC0vKipcXG5tbS9odWdlX21lbW9yeS5jOjM4NjE6ICogZm9saW9fY2hlY2tfc3BsaXR0YWJsZSgpIC0gY2hlY2sgaWYgYSBmb2xpbyBjYW4gYmUgc3BsaXQgdG8gYSBnaXZlbiBvcmRlclxcbm1tL2h1Z2VfbWVtb3J5LmMtMzg2Mi0gKiBAZm9saW86IGZvbGlvIHRvIGJlIHNwbGl0XFxuLS1cXG5tbS9odWdlX21lbW9yeS5jLTM4NjctICpcXG5tbS9odWdlX21lbW9yeS5jOjM4Njg6ICogZm9saW9fY2hlY2tfc3BsaXR0YWJsZSgpIGNoZWNrcyBpZiBAZm9saW8gY2FuIGJlIHNwbGl0IHRvIEBuZXdfb3JkZXIgdXNpbmdcXG5tbS9odWdlX21lbW9yeS5jLTM4NjktICogQHNwbGl0X3R5cGUgbWV0aG9kLiBUaGUgdHJ1bmNhdGVkIGZvbGlvIGNoZWNrIG11c3QgY29tZSBmaXJzdC5cXG4tLVxcbm1tL2h1Z2VfbWVtb3J5LmMtMzg3NS0gKi9cXG5tbS9odWdlX21lbW9yeS5jOjM4NzY6aW50IGZvbGlvX2NoZWNrX3NwbGl0dGFibGUoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlcixcXG5tbS9odWdlX21lbW9yeS5jLTM4NzctXFx0XFx0XFx0ICAgZW51bSBzcGxpdF90eXBlIHNwbGl0X3R5cGUpXFxuLS1cXG5tbS9odWdlX21lbW9yeS5jPTQyNDc9c3RhdGljIGludCBfX2ZvbGlvX3NwbGl0KHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIsXFxuLS1cXG5tbS9odWdlX21lbW9yeS5jLTQyNzAtXFxubW0vaHVnZV9tZW1vcnkuYzo0MjcxOlxcdHJldCA9IGZvbGlvX2NoZWNrX3NwbGl0dGFibGUoZm9saW8sIG5ld19vcmRlciwgc3BsaXRfdHlwZSk7XFxubW0vaHVnZV9tZW1vcnkuYy00MjcyLVxcdGlmIChyZXQpIHtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDdUMjE6NTQ6NTcuNDUyNTU3MzU5WiIsIlNlcSI6MjMsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjU1NTM0NTU5MzIsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqTXkgQW5hbHlzaXMgb2YgdGhlIEZvbGlvIFNwbGl0dGluZyBGdW5jdGlvbnMqKlxuXG5Pa2F5LCBzbyBJJ20gbG9va2luZyBhdCB0aGlzIGNvZGUgYW5kIHRyeWluZyB0byBnZXQgYSBoYW5kbGUgb24gdGhlIGtleSBmdW5jdGlvbnMgaGVyZSwgcGFydGljdWxhcmx5IGZvciBmdXp6aW5nLiBJIGNhbiBzZWUgdGhhdCB0aGlzIGZ1bmN0aW9uLCB3aGlsZSBleHBvcnRlZCwgaXMgZXNzZW50aWFsbHkgYSBoZWxwZXIgZnVuY3Rpb24uIFRoZSByZWFsIHdvcmtob3JzZXMgc2VlbSB0byBiZSBgZm9saW9fc3BsaXRgLCBgZm9saW9fc3BsaXRfdW5tYXBwZWRgLCBhbmQgYF9fc3BsaXRfaHVnZV9wYWdlX3RvX2xpc3RfdG9fb3JkZXJgLiBNeSBpbml0aWFsIHRob3VnaHQgaXMgdG8gZm9jdXMgb24gdGhvc2UuXG5cbk5vdywgbGV0IG1lIGp1c3QgY29uZmlybSBzb21ldGhpbmcuLi4gYWgsIHllcy4gYHNwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyYCBpcyBhbiBpbmxpbmUgZnVuY3Rpb24sIGFuZCBpdCdzIGNhbGxpbmcgYF9fc3BsaXRfaHVnZV9wYWdlX3RvX2xpc3RfdG9fb3JkZXJgLiBTaW5jZSBpdCdzIGlubGluZSwgYW5kIHRoaXMgaXMgdGhlIG9uZSBhY3R1YWxseSAqZG9pbmcqIHRoZSB3b3JrLCBsZXQncyB0YXJnZXQgYF9fc3BsaXRfaHVnZV9wYWdlX3RvX2xpc3RfdG9fb3JkZXJgIGluc3RlYWQgb2YgaXRzIGlubGluZWQgY291bnRlcnBhcnQuXG5cbkkgc2VlIHRoYXQgYHNwbGl0X2ZvbGlvX3RvX2xpc3RgIGlzIGFsc28gaW5saW5lLCBhbmQgaXQgY2FsbHMgYHNwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyYC4gT2theSwgdGhhdCBjbGFyaWZpZXMgdGhpbmdzLlxuXG5TbywgaGVyZSdzIG15IHVwZGF0ZWQgbGlzdCBvZiBmdW5jdGlvbnMgdG8gZnV6ejpcblxuKiAgIGBfX3NwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyYCAtIFRoaXMgaXMgYSBwcmltYXJ5IGNhbmRpZGF0ZS5cbiogICBgZm9saW9fc3BsaXRgIC0gSXQncyBhIG1haW4gZW50cnkgcG9pbnQuXG4qICAgYGZvbGlvX3NwbGl0X3VubWFwcGVkYCAtIEFub3RoZXIgbWFpbiBlbnRyeSBwb2ludC5cbiogICBgX19zd2FwX2NhY2hlX3JlcGxhY2VfZm9saW9gIC0gV2Ugc2hvdWxkIGxvb2sgYXQgdGhpcyBhcyB3ZWxsLlxuXG5Ob3csIGxldCdzIHNlZSBpZiBgX19zd2FwX2NhY2hlX3JlcGxhY2VfZm9saW9gIGlzIGFjdHVhbGx5IGV4cG9ydGVkLlxuXG5cbiIsIklucHV0VG9rZW5zIjoyMzgzMiwiT3V0cHV0VG9rZW5zIjozMiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjIyOSwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0wN1QyMTo1NTowMy4wMDYwMTYxMDFaIiwiU2VxIjoyNCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjIyMjQxOTcxMzUsIkVycm9yIjoibm8gbWF0Y2hlcyIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcIkVYUE9SVF9TWU1CT0wuKl9fc3dhcF9jYWNoZV9yZXBsYWNlX2ZvbGlvXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIlwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJlcnJvclwiOiBcIm5vIG1hdGNoZXNcIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDdUMjE6NTU6MDUuMjMwMjE5ODI2WiIsIlNlcSI6MjUsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjM0NzAxODE3MTcsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGhlcmUncyBteSB0YWtlIG9uIHRob3NlIHRob3VnaHRzLCBmcmFtZWQgYXMgbXkgb3duOlxuXG4qKkFuYWx5emluZyBhIEZ1bmN0aW9uJ3MgU2NvcGUqKlxuXG5BbHJpZ2h0LCBzbyB0aGUgZnVuY3Rpb24gaW4gcXVlc3Rpb24gaXNuJ3QgZXhwbGljaXRseSBleHBvcnRlZCwgYnV0IGl0J3MgZGVmaW5lZCBnbG9iYWxseSDigJMgdGhhdCdzIHRoZSBrZXkuIFNvLCBzaW5jZSBpdCBpc24ndCBzdGF0aWMsIGl0J3MgZ2xvYmFsbHkgdmlzaWJsZSB3aXRoaW4gdGhlIGtlcm5lbCwgZXZlbiBpZiBpdCdzIG5vdCBwYXJ0IG9mIHRoZSBzdGFuZGFyZCBBQkkuIE5vdywgSSBuZWVkIHRvIHVuZGVyc3RhbmQgaXRzIHJlbGF0aW9uc2hpcCB0byB0aGUgc3dhcCBjYWNoZS4gU2luY2UgdGhpcyBsb29rcyBsaWtlIGEgc3dhcC1yZWxhdGVkIGZ1bmN0aW9uLCBteSBpbnR1aXRpb24gaW1tZWRpYXRlbHkgcG9pbnRzIG1lIHRvd2FyZCBgbW0vc3dhcF9zdGF0ZS5jYC4gTGV0J3MgZGlnIGludG8gdGhhdCBzb3VyY2UgZmlsZSBhbmQgbG9vayBmb3IgdGhlIGZ1bmN0aW9uIGBfX3N3YXBfY2FjaGVfcmVwbGFjZV9mb2xpb2AuIFRoYXQgc2hvdWxkIGdpdmUgbWUgdGhlIGNvbnRleHQgSSBuZWVkIHRvIGZpZ3VyZSBvdXQgaXRzIHB1cnBvc2UuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjI0NDY3LCJPdXRwdXRUb2tlbnMiOjM1LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NDIsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDdUMjE6NTU6MDguNzAwNDA0MDczWiIsIlNlcSI6MjYsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo0MTk0Mjk5OCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJfX3N3YXBfY2FjaGVfcmVwbGFjZV9mb2xpb1wiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJtbS9zd2FwX3N0YXRlLmNcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwibW0vc3dhcF9zdGF0ZS5jPTMzNT12b2lkIHN3YXBfY2FjaGVfZGVsX2ZvbGlvKHN0cnVjdCBmb2xpbyAqZm9saW8pXFxuLS1cXG5tbS9zd2FwX3N0YXRlLmMtMzQ3LS8qKlxcbm1tL3N3YXBfc3RhdGUuYzozNDg6ICogX19zd2FwX2NhY2hlX3JlcGxhY2VfZm9saW8gLSBSZXBsYWNlIGEgZm9saW8gaW4gdGhlIHN3YXAgY2FjaGUuXFxubW0vc3dhcF9zdGF0ZS5jLTM0OS0gKiBAY2k6IFRoZSBsb2NrZWQgc3dhcCBjbHVzdGVyLlxcbi0tXFxubW0vc3dhcF9zdGF0ZS5jLTM2MC0gKi9cXG5tbS9zd2FwX3N0YXRlLmM6MzYxOnZvaWQgX19zd2FwX2NhY2hlX3JlcGxhY2VfZm9saW8oc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSxcXG5tbS9zd2FwX3N0YXRlLmMtMzYyLVxcdFxcdFxcdFxcdHN0cnVjdCBmb2xpbyAqb2xkLCBzdHJ1Y3QgZm9saW8gKm5ldylcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDdUMjE6NTU6MDguNzQyMzQ5MzNaIiwiU2VxIjoyNywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NDAzMDAxMTc0OCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgaGVyZSdzIG15IGludGVycHJldGF0aW9uIG9mIHRoZXNlIHRob3VnaHRzLCBwdXR0aW5nIG15c2VsZiBpbiB0aGUgcm9sZSBvZiBhbiBleHBlcnQ6XG5cbioqSW52ZXN0aWdhdGluZyB0aGUgU2NvcGUgYW5kIERlcGVuZGVuY2llcyoqXG5cbkFscmlnaHQsIHNvIHRoaXMgbG9va3MgbGlrZSBhIGdsb2JhbCBmdW5jdGlvbiwgYSBrZXkgcGllY2Ugb2YgaW5mcmFzdHJ1Y3R1cmUuIEZpcnN0IHRoaW5ncyBmaXJzdCwgSSBuZWVkIHRvIHVuZGVyc3RhbmQgaXRzIGNvbnRleHQuIExldCdzIHNlZS4uLiBJIHNob3VsZCBjaGVjayBmb3Igb3RoZXIgcmVsYXRlZCBjb25maWd1cmF0aW9ucy4gTXkgbWVudGFsIGNoZWNrbGlzdCBraWNrcyBpbjogSSdtIHRoaW5raW5nIGFib3V0IHRoZSBpbXBsaWNhdGlvbnMgb2YgdGhlIGBDT05GSUdfVFJBTlNQQVJFTlRfSFVHRVBBR0VgLCBzaW5jZSB0aGlzIGNvdWxkIGluZmx1ZW5jZSBtZW1vcnkgbWFuYWdlbWVudCBzaWduaWZpY2FudGx5LiBUaGVuLCB0aGUgcHJlc2VuY2Ugb2YgYENPTkZJR19TV0FQYCBkZWZpbml0ZWx5IGJlYXJzIHdhdGNoaW5nLiBGaW5hbGx5LCB0aGUgdXNlIG9mIGBtZW1fY2dyb3VwX2Zyb21fZm9saW9gIGFuZCBgc2V0X2FjdGl2ZV9tZW1jZ2AgaXMgdGhlIG1vc3QgaW1wb3J0YW50IHBhcnQgb2YgdGhpcyBmdW5jdGlvbi4gVGhpcyBmdW5jdGlvbiBhYnNvbHV0ZWx5IHNjcmVhbXMgYENPTkZJR19NRU1DR2AgZGVwZW5kZW5jeSB0byBtZS4gTXkgaW50dWl0aW9uIGlzIHRoYXQgdGhpcyBpcyBhYnNvbHV0ZWx5IGEgZGVwZW5kZW5jeS4gTGV0J3MgZGlnIGRlZXBlciBhbmQgdmVyaWZ5IHRoYXQgYE1FTUNHYCBjb25maWd1cmF0aW9uIGlzIGFjdHVhbGx5IG5lY2Vzc2FyeSBhbmQgbm90IGp1c3QgYSBsZWZ0b3ZlciB0cmFjZS4gVW5kZXJzdGFuZGluZyAqdGhpcyogaXMgdGhlIG1vc3QgaW1wb3J0YW50IHRoaW5nLlxuXG5cbiIsIklucHV0VG9rZW5zIjoyNDg4MiwiT3V0cHV0VG9rZW5zIjozMywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjgyLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA3VDIxOjU1OjEyLjc3MjM2MzEzOVoiLCJTZXEiOjI4LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NDM1ODMzNTcsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwic2V0X2FjdGl2ZV9tZW1jZ1wiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJtbS9odWdlX21lbW9yeS5jXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm1tL2h1Z2VfbWVtb3J5LmM9NDA2MD1zdGF0aWMgaW50IF9fZm9saW9fZnJlZXplX3NwbGl0X3VubWFwX2ZpbGUoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlcixcXG4tLVxcbm1tL2h1Z2VfbWVtb3J5LmMtNDA4NS1cXHRtZW1jZyA9IGdldF9tZW1fY2dyb3VwX2Zyb21fZm9saW8oZm9saW8pO1xcbm1tL2h1Z2VfbWVtb3J5LmM6NDA4NjpcXHRvbGRfbWVtY2cgPSBzZXRfYWN0aXZlX21lbWNnKG1lbWNnKTtcXG5tbS9odWdlX21lbW9yeS5jLTQwODctXFxuLS1cXG5tbS9odWdlX21lbW9yeS5jLTQyMTktXFx0LyogUmVzdG9yZSB0aGUgcHJldmlvdXNseSBhY3RpdmUgbWVtY2cgKi9cXG5tbS9odWdlX21lbW9yeS5jOjQyMjA6XFx0c2V0X2FjdGl2ZV9tZW1jZyhvbGRfbWVtY2cpO1xcbm1tL2h1Z2VfbWVtb3J5LmMtNDIyMS1cXHRtZW1fY2dyb3VwX3B1dChtZW1jZyk7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA3VDIxOjU1OjEyLjgxNTk0ODc3NloiLCJTZXEiOjI5LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjozMzQ3MTEyNTY2LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBoZXJlJ3MgbXkgdGFrZSBvbiB0aG9zZSB0aG91Z2h0cywgZnJhbWVkIGFzIG15IG93bjpcblxuKipJbnZlc3RpZ2F0aW5nIGEgUG90ZW50aWFsIE5vLU9wKipcblxuSG1tLCBJIHNlZSB0aGlzIGZ1bmN0aW9uIGNhbGwuIEl0ICpsb29rcyogbGlrZSBpdCdzIGJlaW5nIHVzZWQsIGJ1dCBJJ3ZlIGdvdCBhIGZlZWxpbmcgaXQgbWlnaHQganVzdCBiZSBhIG5vLW9wIHVuZGVyIGNlcnRhaW4gY29uZmlndXJhdGlvbnMuIE15IGd1dCB0ZWxscyBtZSBpdCdzIHByb2JhYmx5IHRpZWQgdG8gbWVtb3J5IGNvbnRyb2wgZ3JvdXBzLCBvciBgQ09ORklHX01FTUNHYC4gTGV0IG1lIHF1aWNrbHkgY29uZmlybSB0aGlzIGh5cG90aGVzaXMuIFRoZSBkZWZpbml0aW9ucyBmb3IgdGhpcyBraW5kIG9mIHRoaW5nIGFsd2F5cyByZXNpZGUgaW4gYGluY2x1ZGUvbGludXgvbWVtY29udHJvbC5oYC4gVGltZSB0byBkaWcgaW4gdGhlcmUgYW5kIHNlZSBpZiBteSBodW5jaCBpcyBjb3JyZWN0LiBJIGJldCBpdCdzIGNvbmRpdGlvbmFsbHkgY29tcGlsZWQuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjI1NDEzLCJPdXRwdXRUb2tlbnMiOjM0LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NDIsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDdUMjE6NTU6MTYuMTYzMDYzODAyWiIsIlNlcSI6MzAsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo0MzU4ODExNywiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJzZXRfYWN0aXZlX21lbWNnXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcImluY2x1ZGUvbGludXgvbWVtY29udHJvbC5oXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImluY2x1ZGUvbGludXgvbWVtY29udHJvbC5oPTE3MzY9dm9pZCBfX21lbWNnX2ttZW1fdW5jaGFyZ2VfcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSwgaW50IG9yZGVyKTtcXG4tLVxcbmluY2x1ZGUvbGludXgvbWVtY29udHJvbC5oLTE3NDEtICogdGhlIGN1cnJlbnQgdGFzayAoc2ltaWxhciB0byB0aGUgXFxcImN1cnJlbnRcXFwiIGdsb2JhbCB2YXJpYWJsZSlcXG5pbmNsdWRlL2xpbnV4L21lbWNvbnRyb2wuaDoxNzQyOiAqIG9yIGJ5IHNldF9hY3RpdmVfbWVtY2coKSBwYWlyLlxcbmluY2x1ZGUvbGludXgvbWVtY29udHJvbC5oLTE3NDMtICogUGxlYXNlLCB1c2Ugb2JqX2Nncm91cF9nZXQoKSB0byBnZXQgYSByZWZlcmVuY2UgaWYgdGhlIHBvaW50ZXJcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDdUMjE6NTU6MTYuMjA2NjU2MDE5WiIsIlNlcSI6MzEsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjY4NTEyMjM0NzEsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqTXkgQW5hbHlzaXMgb2YgdGhlIEh1Z2UgUGFnZSBTcGxpdHRpbmcgTG9naWMqKlxuXG5Pa2F5LCBzbyBJJ3ZlIGJlZW4gdGFraW5nIGEgbG9vayBhdCB0aGlzIHBhdGNoLCBhbmQgdGhlIGNvcmUgb2YgaXQgc2VlbXMgcHJldHR5IHN0cmFpZ2h0Zm9yd2FyZC4gVGhlIG1haW4gY29uZmlndXJhdGlvbnMgdGhhdCBJJ20gZm9jdXNpbmcgb24gYXJlLCBvZiBjb3Vyc2UsIGBUUkFOU1BBUkVOVF9IVUdFUEFHRWAgYW5kIGBTV0FQYC4gVGhvc2UgYXJlIHRoZSBvbmVzIGRyaXZpbmcgdGhlIHNpZ25pZmljYW50IGNoYW5nZXMgaGVyZS5cblxuTm93LCBsZXQncyBicmVhayBkb3duIHRoZSBrZXkgZnVuY3Rpb25zIGF0IHBsYXkuIFdlJ3ZlIGdvdDpcblxuKiAgIGBfX3NwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyYDogVGhpcyBhcHBlYXJzIHRvIGJlIHRoZSBwcmltYXJ5IGVudHJ5IHBvaW50IGZvciBzcGxpdHRpbmcgdGhlc2UgaHVnZSBwYWdlcy5cbiogICBgZm9saW9fc3BsaXRgOiBBbm90aGVyIGNydWNpYWwgZW50cnkgcG9pbnQgdG8gbWFuYWdlIHRoaXMgcHJvY2Vzcy5cbiogICBgZm9saW9fc3BsaXRfdW5tYXBwZWRgOiBUaGlzIGlzIGFub3RoZXIgZW50cnkgcG9pbnQgZm9yIHNwbGl0dGluZyB1bm1hcHBlZCBmb2xpb3MuXG4qICAgYF9fc3dhcF9jYWNoZV9yZXBsYWNlX2ZvbGlvYDogVGhlbiwgdGhlcmUncyB0aGlzIGhlbHBlciBmdW5jdGlvbiwgd2hpY2ggaXMgaW50ZXJlc3RpbmcgYmVjYXVzZSBpdCdzIGluIGBtbS9zd2FwX3N0YXRlLmNgLlxuXG5JJ2xsIG1ha2Ugc3VyZSB0byBkb3VibGUtY2hlY2sgdGhlIHJvbGUgb2YgYF9fc3BsaXRfaHVnZV9wYWdlX3RvX2xpc3RfdG9fb3JkZXJgLCBpdCBsb29rcyBsaWtlIGl0J3MgdGhlIG1haW4gZW50cnkgcG9pbnQgdG8gc3BsaXR0aW5nLlxuXG5Gcm9tIHdoYXQgSSBjYW4gdGVsbCwgdGhpcyBwYXRjaCBpcyByZWFsbHkgcmV3b3JraW5nIHRoZSBzcGxpdHRpbmcgbG9naWMsIHBhcnRpY3VsYXJseSB3aGVuIGRlYWxpbmcgd2l0aCB1bm1hcHBlZCBmb2xpb3MuIEl0IHNlZW1zIHRvIGJlIHBheWluZyBzcGVjaWFsIGF0dGVudGlvbiB0byBzd2FwY2FjaGUgYW5kIGFub255bW91cyBmb2xpb3MsIHdoaWNoIG1ha2VzIHNlbnNlIGdpdmVuIHRoZSBwb3RlbnRpYWwgcGVyZm9ybWFuY2UgaW1wbGljYXRpb25zLiBTcGVjaWZpY2FsbHksIHRoZSBwYXRjaCBpbnRyb2R1Y2VzIGBfX2ZvbGlvX2ZyZWV6ZV9zcGxpdF91bm1hcGAgYW5kIGBfX2ZvbGlvX2ZyZWV6ZV9zcGxpdF91bm1hcF9maWxlYCBhcyBzdGF0aWMgZnVuY3Rpb25zLiBJdCBhbHNvIGFwcGVhcnMgdG8gYmUgbW9kaWZ5aW5nIGBmb2xpb19jaGVja19zcGxpdHRhYmxlYCB0byBoYW5kbGUgc3dhcGNhY2hlIGZvbGlvcyBkaWZmZXJlbnRseSBhbmQgbW9kaWZ5aW5nIGBfX2ZvbGlvX3NwbGl0YCB0byBjYWxsIHRoZXNlIG5ldyBmdW5jdGlvbnMuXG5cbkkgdGhpbmsgdGhlcmUgYXJlIGVub3VnaCBpbnRlcmVzdGluZyBwaWVjZXMgaGVyZS4gSXQncyB0aW1lIHRvIHNldCBgV29ydGhGdXp6aW5nPXRydWVgLlxuXG5JJ2xsIGJlIGtlZXBpbmcgYSB2ZXJ5IGNsb3NlIGV5ZSBvbiB0aGVzZSBzeW1ib2xzOlxuXG4qICAgYF9fc3BsaXRfaHVnZV9wYWdlX3RvX2xpc3RfdG9fb3JkZXJgXG4qICAgYGZvbGlvX3NwbGl0YFxuKiAgIGBmb2xpb19zcGxpdF91bm1hcHBlZGBcbiogICBgX19zd2FwX2NhY2hlX3JlcGxhY2VfZm9saW9gXG5cbkFuZCB0byBiZSBzdXJlLCBJIHdpbGwga2VlcCBgVFJBTlNQQVJFTlRfSFVHRVBBR0VgIGFuZCBgU1dBUGAgZW5hYmxlZC5cblxuT25lIGxhc3QgdGhpbmcsIGxldCBtZSBqdXN0IHF1aWNrbHkgY29uZmlybSB3aGV0aGVyIGBmb2xpb19zcGxpdGAgaXMgZXhwb3J0ZWQgcHJvcGVybHkgb3IgaWYgaXQgaXMganVzdCBhIGdsb2JhbCBmdW5jdGlvbi5cblxuXG4iLCJJbnB1dFRva2VucyI6MjU3NjMsIk91dHB1dFRva2VucyI6MjcsIk91dHB1dFRob3VnaHRzVG9rZW5zIjozNTcsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDdUMjE6NTU6MjMuMDU3ODgyNVoiLCJTZXEiOjMyLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MjIzOTQyNjEzMywiRXJyb3IiOiJubyBtYXRjaGVzIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiRVhQT1JUX1NZTUJPTC4qZm9saW9fc3BsaXRcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwiXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcImVycm9yXCI6IFwibm8gbWF0Y2hlc1wiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0wN1QyMTo1NToyNS4yOTczMTUxMjNaIiwiU2VxIjozMywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MzEzOTI5MzY4MSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IGF0dGVtcHQgYXQgc3VtbWFyaXppbmcgdGhhdCB0aG91Z2h0IHByb2Nlc3MsIHRhaWxvcmVkIGZvciBhbiBleHBlcnQgYXVkaWVuY2U6XG5cbioqR2xvYmFsIFNjb3BlIENoZWNrOiBgZm9saW9fc3BsaXRfdW5tYXBwZWRgKipcblxuT2theSwgbXkgaW5pdGlhbCBpbXByZXNzaW9uIGlzIHRoaXMgaXMgYSBnbG9iYWwgaXNzdWUuIFRoZSBmYWN0IHRoYXQgaXQncyBzdXJmYWNlZCBhdCBhbGwgc3VnZ2VzdHMgaXQncyBub3QgaXNvbGF0ZWQuIEkgbmVlZCB0byBmaWd1cmUgb3V0IHRoZSBleHRlbnQgb2YgdGhlIGltcGFjdC4gVGhlIG1lbnRpb24gb2YgYGZvbGlvX3NwbGl0X3VubWFwcGVkYCBpbW1lZGlhdGVseSBicmluZ3MgbWUgdG8gbWluZCBvZiBhIGNydWNpYWwgYXJlYSB3aXRoaW4gdGhlIGNvcmUgZGF0YSBwaXBlbGluZS4gSSdtIGdvaW5nIHRvIHdhbnQgdG8gZm9jdXMgb24gdGhhdCBzcGVjaWZpYyBmdW5jdGlvbiBvciBwcm9jZXNzLCBpdCdzIGtleS4gSWYgaXQncyByZWxhdGVkIHRvIGhvdyB3ZSdyZSBzcGxpdHRpbmcgb3IgbWFwcGluZyBGb2xpbyBkYXRhLCB3aGljaCBzZWVtcyBsaWtlbHkgZ2l2ZW4gdGhlIG5hbWUsIHRoYXQncyBhbG1vc3QgYWx3YXlzIGEgY3JpdGljYWwgcGFydCBvZiBkYXRhIGxvYWRpbmcgb3IgdHJhbnNmb3JtYXRpb24uIExldCdzIGRlbHZlIGluIHRvIHRoYXQgZnVuY3Rpb24gZGlyZWN0bHkuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjI2NjcxLCJPdXRwdXRUb2tlbnMiOjMwLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTgsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDdUMjE6NTU6MjguNDM2NjExNTY0WiIsIlNlcSI6MzQsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyMjYxNTQxNjcyLCJFcnJvciI6Im5vIG1hdGNoZXMiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJFWFBPUlRfU1lNQk9MLipmb2xpb19zcGxpdF91bm1hcHBlZFwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiZXJyb3JcIjogXCJubyBtYXRjaGVzXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA3VDIxOjU1OjMwLjY5ODE2MjM1NloiLCJTZXEiOjM1LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjozMzUxNjUzMTU1LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBoZXJlJ3MgbXkgdGFrZSBvbiB0aG9zZSB0aG91Z2h0cywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZTpcblxuKipHbG9iYWwgU2NvcGUgQ2hlY2s6IGBfX3NwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyYCoqXG5cblJpZ2h0LCB0aGlzIGZlZWxzIGxpa2UgaXQncyBhIHBpZWNlIG9mIHNvbWV0aGluZyBtdWNoIGxhcmdlciwgc29tZXRoaW5nIHdpdGggZ2xvYmFsIGltcGxpY2F0aW9ucywgYW5kIGl0J3MgaW1wb3J0YW50IHRvIGdyYXNwIHRoZSBmdWxsIGJyZWFkdGggb2YgdGhlIHNpdHVhdGlvbi4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhlIGdsb2JhbCBzY29wZSBvZiB0aGlzIGlzc3VlIHRvIGZ1bGx5IGRpZ2VzdCB0aGUgcHJvYmxlbS4gTXkgZmlyc3QgaW5zdGluY3QsIGdpdmVuIHRoZSBicmllZiwgaXMgdG8gaW1tZWRpYXRlbHkgY2hlY2sgdGhlIGZ1bmN0aW9uIEkga25vdyB0byBiZSBtb3N0IHBlcnRpbmVudCBpbiB0aGlzIHNpdHVhdGlvbjogYF9fc3BsaXRfaHVnZV9wYWdlX3RvX2xpc3RfdG9fb3JkZXJgLiBUaGlzIGlzIHdoZXJlIEknZCBzdGFydCBkaWdnaW5nIGludG8gdGhlIGRldGFpbHMgb2YgdGhlIGh1Z2UgcGFnZSBtYW5hZ2VtZW50LiBUaGlzIHJvdXRpbmUgaXMgbGlrZWx5IHRoZSBseW5jaHBpbiwgdGhlIHBsYWNlIHdoZXJlIGRlY2lzaW9ucyByZWdhcmRpbmcgb3JkZXJpbmcgYW5kIHNwbGl0dGluZyBhcmUgbWFkZSwgcGFydGljdWxhcmx5IHdpdGhpbiB0aGUgY29udGV4dCBvZiBtYXNzaXZlIG1lbW9yeSBhbGxvY2F0aW9uIG9yIHBvdGVudGlhbGx5IGRlLWFsbG9jYXRpb247IGFuZCBpcyB0aGUgb2J2aW91cyBmaXJzdCBwbGFjZSB0byBleHBsb3JlLiBJJ20gaW1tZWRpYXRlbHkgdHJ5aW5nIHRvIHVuZGVyc3RhbmQgaG93IHRoaXMgaW1wYWN0cyB0aGUgbGFyZ2VyIHN5c3RlbS5cblxuXG4iLCJJbnB1dFRva2VucyI6MjY5MDAsIk91dHB1dFRva2VucyI6MzgsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoyNiwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0wN1QyMTo1NTozNC4wNDk4MTgzMDFaIiwiU2VxIjozNiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjIyNDY2MTc2MzMsIkVycm9yIjoibm8gbWF0Y2hlcyIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcIkVYUE9SVF9TWU1CT0wuKl9fc3BsaXRfaHVnZV9wYWdlX3RvX2xpc3RfdG9fb3JkZXJcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwiXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcImVycm9yXCI6IFwibm8gbWF0Y2hlc1wiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0wN1QyMTo1NTozNi4yOTY0NDI0NDRaIiwiU2VxIjozNywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NjQ4NjIxNjA0NywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgaGVyZSdzIG15IHRha2Ugb24gdGhvc2UgdGhvdWdodHMsIGZyYW1lZCBmcm9tIG15IGV4cGVydCBwZXJzcGVjdGl2ZTpcblxuKipEZWVwIERpdmUgb24gRm9saW8gU3BsaXR0aW5nKipcblxuUmlnaHQsIHRoaXMgaXMgYSBzeXN0ZW1pYyBjaGFuZ2Ug4oCTIGl0J3MgZ2xvYmFsIGluIGl0cyBpbXBsaWNhdGlvbnMuIEFuZCBhIHF1aWNrIGNsYXJpZmljYXRpb246IHRoYXQgYHNwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyYCBmdW5jdGlvbiBJIHdhcyBsb29raW5nIGF0PyBJdCdzIGlubGluZSwgc28gdGhlIHJlYWwgd29ya2hvcnNlIGlzIGFjdHVhbGx5IGBfX3NwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyYC4gR290IGl0LlxuXG5Ob3csIGxldCdzIHVucGFjayB0aGUgbG9naWMuIFRoaXMgcGF0Y2ggaXMgZXNzZW50aWFsbHkgcmVmYWN0b3JpbmcgdGhlIHdheSB3ZSBoYW5kbGUgdGhlIHNwbGl0dGluZyBvZiB1bm1hcHBlZCBmb2xpb3MsIGZvY3VzaW5nIG9uIHRoZSBzd2FwY2FjaGUgYW5kIGFub255bW91cyBmb2xpbyBzY2VuYXJpb3MuIEkgc2VlIHRoZXkncmUgaW50cm9kdWNpbmcgYF9fZm9saW9fZnJlZXplX3NwbGl0X3VubWFwYCBhbmQgYF9fZm9saW9fZnJlZXplX3NwbGl0X3VubWFwX2ZpbGVgIGFzIHJlcGxhY2VtZW50cyBmb3IgdGhhdCBvbGRlciBgX19mb2xpb19mcmVlemVfYW5kX3NwbGl0X3VubWFwcGVkYCBmdW5jdGlvbi4gR29vZCBtb3ZlIOKAkyBtb2R1bGFyaXR5IGFuZCBjbGFyaXR5IGFyZSBhbHdheXMgd2VsY29tZSBoZXJlLiBUaGV5J3JlIGFsc28gYWRqdXN0aW5nIGBmb2xpb19jaGVja19zcGxpdHRhYmxlYCBhbmQgYF9fZm9saW9fc3BsaXRgIHRvIGxldmVyYWdlIHRoZXNlIG5ldyBmdW5jdGlvbnMuXG5cblRoaXMgaGl0cyByaWdodCBhdCB0aGUgaGVhcnQgb2YgY29yZSBtZW1vcnkgbWFuYWdlbWVudCDigJMgc3BlY2lmaWNhbGx5LCBUSFAgYW5kIGZvbGlvIHNwbGl0dGluZy4gV2UncmUgdGFsa2luZyBhYm91dCBpbmNyZWRpYmx5IGNvbXBsZXggY29kZSwgd2l0aCBhIGhpZ2ggcG90ZW50aWFsIGZvciByYWNlIGNvbmRpdGlvbnMuIEdpdmVuIHRoZSBpbnRyaWNhdGUgbmF0dXJlIG9mIHRoZXNlIGNoYW5nZXMsIHRoZSBmb2N1cyBvbiBmdXp6aW5nIHRoZSBtYWluIGZvbGlvIHNwbGl0dGluZyBlbnRyeSBwb2ludHMgaXMgYWJzb2x1dGVseSBjcml0aWNhbC4gV2UgbmVlZCB0byBzdWJqZWN0IHRoaXMgdG8gcmlnb3JvdXMgdGVzdGluZyB0byBlbnN1cmUgcm9idXN0bmVzcy5cblxuT2theSwgSSdtIHJlYWR5IHRvIGNhbGwgYHNldC1yZXN1bHRzYCBhbmQgbG9nIHRoZXNlIGZpbmRpbmdzLlxuXG5cbiIsIklucHV0VG9rZW5zIjoyNzE4NCwiT3V0cHV0VG9rZW5zIjoyMjQsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoyMDMsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDdUMjE6NTU6NDIuNzgyNjYxMTgxWiIsIlNlcSI6MzgsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InNldC1yZXN1bHRzIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6Nzg0NTQyNDUsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIlRSQU5TUEFSRU5UX0hVR0VQQUdFXCIsXG4gICAgXCJTV0FQXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwiX19zcGxpdF9odWdlX3BhZ2VfdG9fbGlzdF90b19vcmRlclwiLFxuICAgIFwiZm9saW9fc3BsaXRcIixcbiAgICBcImZvbGlvX3NwbGl0X3VubWFwcGVkXCIsXG4gICAgXCJfX3N3YXBfY2FjaGVfcmVwbGFjZV9mb2xpb1wiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIHJld29ya3MgdGhlIGxvZ2ljIGZvciBzcGxpdHRpbmcgdW5tYXBwZWQgZm9saW9zLCBzcGVjaWZpY2FsbHkgaGFuZGxpbmcgc3dhcGNhY2hlIGFuZCBhbm9ueW1vdXMgZm9saW9zLiBJdCBpbnRyb2R1Y2VzIG5ldyBzdGF0aWMgZnVuY3Rpb25zIGBfX2ZvbGlvX2ZyZWV6ZV9zcGxpdF91bm1hcGAgYW5kIGBfX2ZvbGlvX2ZyZWV6ZV9zcGxpdF91bm1hcF9maWxlYCB0byByZXBsYWNlIGBfX2ZvbGlvX2ZyZWV6ZV9hbmRfc3BsaXRfdW5tYXBwZWRgLiBJdCBhbHNvIG1vZGlmaWVzIGBmb2xpb19jaGVja19zcGxpdHRhYmxlYCBhbmQgYF9fZm9saW9fc3BsaXRgIHRvIHVzZSB0aGUgbmV3IGxvZ2ljLiBUaGUgY2hhbmdlcyBhZmZlY3QgY29yZSBtZW1vcnkgbWFuYWdlbWVudCwgc3BlY2lmaWNhbGx5IFRIUCBhbmQgZm9saW8gc3BsaXR0aW5nLCB3aGljaCBhcmUgaGlnaGx5IGNvbXBsZXggYW5kIHByb25lIHRvIHJhY2UgY29uZGl0aW9ucy4gRnV6emluZyB0aGUgbWFpbiBlbnRyeSBwb2ludHMgZm9yIGZvbGlvIHNwbGl0dGluZyBpcyBpbXBvcnRhbnQgdG8gZW5zdXJlIHRoZSBuZXcgbG9naWMgaXMgcm9idXN0LlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIlRSQU5TUEFSRU5UX0hVR0VQQUdFXCIsXG4gICAgXCJTV0FQXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwiX19zcGxpdF9odWdlX3BhZ2VfdG9fbGlzdF90b19vcmRlclwiLFxuICAgIFwiZm9saW9fc3BsaXRcIixcbiAgICBcImZvbGlvX3NwbGl0X3VubWFwcGVkXCIsXG4gICAgXCJfX3N3YXBfY2FjaGVfcmVwbGFjZV9mb2xpb1wiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIHJld29ya3MgdGhlIGxvZ2ljIGZvciBzcGxpdHRpbmcgdW5tYXBwZWQgZm9saW9zLCBzcGVjaWZpY2FsbHkgaGFuZGxpbmcgc3dhcGNhY2hlIGFuZCBhbm9ueW1vdXMgZm9saW9zLiBJdCBpbnRyb2R1Y2VzIG5ldyBzdGF0aWMgZnVuY3Rpb25zIGBfX2ZvbGlvX2ZyZWV6ZV9zcGxpdF91bm1hcGAgYW5kIGBfX2ZvbGlvX2ZyZWV6ZV9zcGxpdF91bm1hcF9maWxlYCB0byByZXBsYWNlIGBfX2ZvbGlvX2ZyZWV6ZV9hbmRfc3BsaXRfdW5tYXBwZWRgLiBJdCBhbHNvIG1vZGlmaWVzIGBmb2xpb19jaGVja19zcGxpdHRhYmxlYCBhbmQgYF9fZm9saW9fc3BsaXRgIHRvIHVzZSB0aGUgbmV3IGxvZ2ljLiBUaGUgY2hhbmdlcyBhZmZlY3QgY29yZSBtZW1vcnkgbWFuYWdlbWVudCwgc3BlY2lmaWNhbGx5IFRIUCBhbmQgZm9saW8gc3BsaXR0aW5nLCB3aGljaCBhcmUgaGlnaGx5IGNvbXBsZXggYW5kIHByb25lIHRvIHJhY2UgY29uZGl0aW9ucy4gRnV6emluZyB0aGUgbWFpbiBlbnRyeSBwb2ludHMgZm9yIGZvbGlvIHNwbGl0dGluZyBpcyBpbXBvcnRhbnQgdG8gZW5zdXJlIHRoZSBuZXcgbG9naWMgaXMgcm9idXN0LlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0wN1QyMTo1NTo0Mi44NjExMjE2MjVaIiwiU2VxIjozOSwiTmVzdGluZyI6MSwiVHlwZSI6ImFjdGlvbiIsIk5hbWUiOiJJZiIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjExMTc1Mjg1OTM5LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDdUMjE6NTU6NDIuODYxNTMyMDI1WiIsIlNlcSI6NDAsIk5lc3RpbmciOjIsIlR5cGUiOiJhZ2VudCIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImJlc3QtZXhwZW5zaXZlIiwiRHVyYXRpb24iOjExMTc0ODcxOTI5LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCByZWZhY3RvcnMgZm9saW8gc3BsaXR0aW5nIGxvZ2ljIGluIHRoZSBtZW1vcnkgbWFuYWdlbWVudCBzdWJzeXN0ZW0gKGBtbS9odWdlX21lbW9yeS5jYCksIHNwZWNpZmljYWxseSBzZXBhcmF0aW5nIHRoZSBoYW5kbGluZyBvZiBhbm9ueW1vdXMsIHN3YXBjYWNoZSwgYW5kIGZpbGUtYmFja2VkIGZvbGlvcy4gSXQgbW9kaWZpZXMgcmVmZXJlbmNlIGNvdW50aW5nLCBsb2NraW5nLCBhbmQgcGFnZSBjYWNoZS9zd2FwIGNhY2hlIHJlcGxhY2VtZW50IGxvZ2ljLiBUaGVzZSBjaGFuZ2VzIHByaW1hcmlseSByaXNrIGludHJvZHVjaW5nIHVzZS1hZnRlci1mcmVlLCBkb3VibGUtZnJlZSwgbG9ja2luZyBkZWFkbG9ja3MsIG9yIHJlZmVyZW5jZSBjb3VudCBpbWJhbGFuY2VzLiBTdWNoIGlzc3VlcyBhcmUgZWZmZWN0aXZlbHkgZGV0ZWN0ZWQgYnkgS0FTQU4sIExPQ0tERVAsIGFuZCBzdGFuZGFyZCBrZXJuZWwgZGVidWdnaW5nIGFzc2VydGlvbnMgKGUuZy4sIGBWTV9XQVJOX09OYCkuIFRoZSBwYXRjaCBkb2VzIG5vdCBpbnRyb2R1Y2UgbmV3IGFsbG9jYXRpb25zIG9mIGNvbXBsZXggZGF0YSBzdHJ1Y3R1cmVzLCBub3IgZG9lcyBpdCBtb2RpZnkgZGF0YSBzZW50IHRvIHVzZXIgc3BhY2Ugb3IgYWx0ZXIgYm91bmRzIGNoZWNraW5nIGluIGEgd2F5IHRoYXQgY291bGQgZXhwb3NlIHVuaW5pdGlhbGl6ZWQgbWVtb3J5LiBUaGVyZWZvcmUsIHRoZXJlIGlzIG5vIGp1c3RpZmljYXRpb24gZm9yIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbi5cIixcbiAgXCJOZWVkc0tNU0FOXCI6IGZhbHNlXG59IiwiSW5zdHJ1Y3Rpb24iOiJZb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgc2VjdXJpdHkgZW5naW5lZXIgc3BlY2lhbGl6aW5nIGluIGtlcm5lbCBtZW1vcnlcbmVycm9yIGRldGVjdG9ycyAoS0FTQU4gYW5kIEtNU0FOKS4gWW91ciBqb2IgaXMgdG8gcmV2aWV3IHRoZSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kXG5kZXRlcm1pbmUgaWYgdGhlIGNvZGUgY2hhbmdlcyBqdXN0aWZ5IHNwYXduaW5nIGEgZGVkaWNhdGVkIEtNU0FOIChLZXJuZWxNZW1vcnlTYW5pdGl6ZXIpXG5mdXp6aW5nIHNlc3Npb24gaW4gYWRkaXRpb24gdG8gc3RhbmRhcmQgS0FTQU4gZnV6emluZy5cblxuQ1JJVElDQUwgRElTVElOQ1RJT04gQkVUV0VFTiBLQVNBTiBBTkQgS01TQU46XG4tIFN0YW5kYXJkIEtBU0FOIGtlcm5lbCBidWlsZHMgKHVwc3RyZWFtLWFwcGFybW9yLWthc2FuLmNvbmZpZykgYWxyZWFkeSBlbmFibGVcbiAgYSBjb21wcmVoZW5zaXZlIHN1aXRlIG9mIGRlYnVnZ2luZyB0b29scyBhbmQgc2FuaXRpemVycywgaW5jbHVkaW5nIEtBU0FOXG4gIChvdXQtb2YtYm91bmRzIGFjY2Vzc2VzLCB1c2UtYWZ0ZXItZnJlZSwgZG91YmxlIGZyZWUsIGludmFsaWQgZnJlZSksIExPQ0tERVBcbiAgKGxvY2tpbmcgYnVncyBhbmQgZGVhZGxvY2tzKSwgVUItc2FuaXRpemVycywgYW5kIG1lbW9yeSBjb3JydXB0aW9uIGNoZWNrcy5cbi0gS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcikgZGV0ZWN0cyByZWFkcyBvZiBVTklOSVRJQUxJWkVEIG1lbW9yeSAoc3RhY2ssIGhlYXAsXG4gIG9yIHBhZ2UgYWxsb2NhdGlvbnMpIGFuZCBrZXJuZWwtdG8tdXNlciBtZW1vcnkgaW5mby1sZWFrcy5cblxuUnVsZTogVEhFUkUgSVMgTk8gU0VOU0UgSU4gUlVOTklORyBBIEtNU0FOIFNFU1NJT04gSUYgQSBCVUcgQ0FOIEJFIENBVUdIVCBCWSBLQVNBTixcbkxPQ0tERVAsIE9SIE9USEVSIFNUQU5EQVJEIEJVRyBERVRFQ1RPUlMuXG5BIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaW5jdXJzIHNpZ25pZmljYW50IHJlc291cmNlIGNvc3RzLiBZb3UgbXVzdCBPTkxZXG5zZXQgTmVlZHNLTVNBTj10cnVlIGlmIHRoZSBjb2RlIGNoYW5nZXMgaW50cm9kdWNlIG9yIGV4cG9zZSBVTklOSVRJQUxJWkVEIE1FTU9SWSByaXNrc1xudGhhdCBhcmUgZGV0ZWN0ZWQgT05MWSBieSBLTVNBTi5cblxuTG9vayBob2xpc3RpY2FsbHkgYXQgdGhlIHBhdGNoIHNlcmllcyBhbmQgc3Vycm91bmRpbmcgY29kZS4gRXZlbiBpZiBubyBkaXJlY3RcbnVuaW5pdGlhbGl6ZWQgZmllbGQgYWNjZXNzZXMgb3IgbmV3IGJ1ZmZlciBhbGxvY2F0aW9ucyBhcmUgYWRkZWQgaW4gdGhlIGRpZmYgaXRzZWxmLFxuYSBwYXRjaCBtYXkgYWx0ZXIgY29udHJvbCBmbG93LCBib3VuZHMgY2hlY2tpbmcsIG9yIGRhdGEgbGVuZ3RoIGNhbGN1bGF0aW9ucyBpbiB3YXlzXG50aGF0IGNoYW5nZSBob3cgdGhlIHJlc3Qgb2YgdGhlIGNvZGUgb3BlcmF0ZXMgb24gZXhpc3RpbmcgYnVmZmVycyAoZS5nLiBhbGxvd2luZ1xudW5pbml0aWFsaXplZCBzdGFjay9oZWFwIG1lbW9yeSB0byBiZSByZWFkLCBjb3BpZWQgdG8gdXNlciBzcGFjZSwgb3IgdXNlZCBpbiBjb250cm9sXG5mbG93KS4gRG8gbm90IGhlc2l0YXRlIHRvIHVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUsXG5jYWxsZWQgZnVuY3Rpb25zLCBhbmQgY2FsbGVycy5cblxuU2V0IE5lZWRzS01TQU49dHJ1ZSBPTkxZIElGIHRoZSBwYXRjaCBpbnRyb2R1Y2VzIG9yIG1vZGlmaWVzOlxuMS4gS2VybmVsIHN0cnVjdHVyZXMgc2VudCB0byB1c2VyIHNwYWNlICh2aWEgY29weV90b191c2VyLCBwdXRfdXNlciwgbmV0bGluayBza2JcbiAgIGF0dHJpYnV0ZXMsIGlvY3RsIG91dHB1dCBhcmd1bWVudHMsIHNvY2tldCBvcHRpb25zLCBvciBCUEYgYnVmZmVycykgd2hlcmUgZmllbGRzXG4gICBvciBzdHJ1Y3R1cmUgcGFkZGluZyBtaWdodCBub3QgYmUgZnVsbHkgaW5pdGlhbGl6ZWQvemVyb2VkLlxuMi4gQ29uZGl0aW9uYWwgbG9naWMgb3IgYnJhbmNoaW5nIHRoYXQgZGVwZW5kcyBvbiBwb3RlbnRpYWxseSB1bmluaXRpYWxpemVkIHZhcmlhYmxlc1xuICAgb3Igc3RydWN0IGZpZWxkcy5cbjMuIEFsbG9jYXRpb24gb3IgaW5pdGlhbGl6YXRpb24gb2YgY29tcGxleCBkYXRhIHN0cnVjdHVyZXMgd2hlcmUgdW5pbml0aWFsaXplZCBmaWVsZHNcbiAgIGNvdWxkIGJlIHJlYWQgbGF0ZXIgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMuXG40LiBCb3VuZHMgY2hlY2tzLCBsZW5ndGhzLCBvciBsb2dpYyBpbiBhIHdheSB0aGF0IGFsbG93cyBzdXJyb3VuZGluZyBjb2RlIHRvIGFjY2Vzc1xuICAgdW5pbml0aWFsaXplZCBieXRlcyBvZiBleGlzdGluZyBidWZmZXJzLlxuXG5TZXQgTmVlZHNLTVNBTj1mYWxzZSBJRjpcbi0gVGhlIGNvZGUgY2hhbmdlcyBwcmltYXJpbHkgcmlzayBvdXQtb2YtYm91bmRzIGFjY2VzcywgYXJyYXkgb3ZlcmZsb3dzLCBOVUxMIHBvaW50ZXJcbiAgZGVyZWZlcmVuY2VzLCBsb2NraW5nIGRlYWRsb2Nrcywgb3IgdXNlLWFmdGVyLWZyZWUgYnVncyAodGhlc2UgYXJlIGFscmVhZHkgY2F1Z2h0XG4gIGJ5IEtBU0FOLCBMT0NLREVQLCBvciBzdGFuZGFyZCBidWcgZGV0ZWN0b3JzKS5cbi0gQWxsIHN0YWNrL2hlYXAgc3RydWN0dXJlcyB0b3VjaGVkIG9yIGludHJvZHVjZWQgYnkgdGhlIHBhdGNoIGFyZSBmdWxseSB6ZXJvZWRcbiAgb3IgaW5pdGlhbGl6ZWQgKGUuZy4gdXNpbmcgPSB7MH0sIG1lbXNldCwga3phbGxvYykgYmVmb3JlIGJlaW5nIHJlYWQgb3IgY29waWVkLlxuLSBUaGUgcGF0Y2ggZG9lcyBub3QgaW50cm9kdWNlIGFueSByaXNrIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHVzYWdlIG9yIGluZm8tbGVha3MuXG5cblVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUgaWYgbmVjZXNzYXJ5LCB0aGVuIHByb3ZpZGVcbmRldGFpbGVkIEtNU0FOUmVhc29uaW5nIGNvbnRyYXN0aW5nIEtBU0FOIHZzIEtNU0FOIGFwcGxpY2FiaWxpdHkgZm9yIHRoaXMgcGF0Y2guXG5QcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy5cblxuXG5Vc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLlxuSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuXG5JZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuXG4iLCJQcm9tcHQiOiJGb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczpcbmNvbW1pdCBlNWUyNDc4YTU2Yjk1MmE4YWM1ZjYyZDJlNjVhZjU4OGVjMzQyODY4XG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIEZyaSBBdWcgNyAyMTo1NDowNCAyMDI2ICswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL21tL2h1Z2VfbWVtb3J5LmMgYi9tbS9odWdlX21lbW9yeS5jXG5pbmRleCBjZWQ0MDBmNzJkNDNhLi4wZDcwZWUzMDE3YzQ2IDEwMDY0NFxuLS0tIGEvbW0vaHVnZV9tZW1vcnkuY1xuKysrIGIvbW0vaHVnZV9tZW1vcnkuY1xuQEAgLTM1ODksOSArMzU4OSw2IEBAIHN0YXRpYyB2b2lkIHJlbWFwX3BhZ2Uoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgbG9uZyBuciwgaW50IGZsYWdzKVxuIHtcbiBcdGludCBpID0gMDtcbiBcbi1cdC8qIElmIHVubWFwX2ZvbGlvKCkgdXNlcyB0cnlfdG9fbWlncmF0ZSgpIG9uIGZpbGUsIHJlbW92ZSB0aGlzIGNoZWNrICovXG4tXHRpZiAoIWZvbGlvX3Rlc3RfYW5vbihmb2xpbykpXG4tXHRcdHJldHVybjtcbiBcdGZvciAoOzspIHtcbiBcdFx0cmVtb3ZlX21pZ3JhdGlvbl9wdGVzKGZvbGlvLCBmb2xpbywgVFRVX1JNQVBfTE9DS0VEIHwgZmxhZ3MpO1xuIFx0XHRpICs9IGZvbGlvX25yX3BhZ2VzKGZvbGlvKTtcbkBAIC0zODAwLDYgKzM3OTcsNyBAQCBzdGF0aWMgaW50IF9fc3BsaXRfdW5tYXBwZWRfZm9saW8oc3RydWN0IGZvbGlvICpmb2xpbywgaW50IG5ld19vcmRlcixcbiBcdFx0c3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsIGVudW0gc3BsaXRfdHlwZSBzcGxpdF90eXBlKVxuIHtcbiBcdGNvbnN0IGJvb2wgaXNfYW5vbiA9IGZvbGlvX3Rlc3RfYW5vbihmb2xpbyk7XG4rXHRjb25zdCBib29sIGlzX3N3YXBjYWNoZSA9IGZvbGlvX3Rlc3Rfc3dhcGNhY2hlKGZvbGlvKTtcbiBcdGludCBvbGRfb3JkZXIgPSBmb2xpb19vcmRlcihmb2xpbyk7XG4gXHRpbnQgc3RhcnRfb3JkZXIgPSBzcGxpdF90eXBlID09IFNQTElUX1RZUEVfVU5JRk9STSA/IG5ld19vcmRlciA6IG9sZF9vcmRlciAtIDE7XG4gXHRzdHJ1Y3QgZm9saW8gKm9sZF9mb2xpbyA9IGZvbGlvO1xuQEAgLTM4MTQsOCArMzgxMiw4IEBAIHN0YXRpYyBpbnQgX19zcGxpdF91bm1hcHBlZF9mb2xpbyhzdHJ1Y3QgZm9saW8gKmZvbGlvLCBpbnQgbmV3X29yZGVyLFxuIFx0ICAgICBzcGxpdF9vcmRlci0tKSB7XG4gXHRcdGludCBucl9uZXdfZm9saW9zID0gMVVMIFx1MDAzY1x1MDAzYyAob2xkX29yZGVyIC0gc3BsaXRfb3JkZXIpO1xuIFxuLVx0XHQvKiBvcmRlci0xIGFub255bW91cyBmb2xpbyBpcyBub3Qgc3VwcG9ydGVkICovXG4tXHRcdGlmIChpc19hbm9uIFx1MDAyNlx1MDAyNiBzcGxpdF9vcmRlciA9PSAxKVxuK1x0XHQvKiBvcmRlci0xIGFub255bW91cyBvciBzd2FwY2FjaGUgZm9saW8gaXMgbm90IHN1cHBvcnRlZCAqL1xuK1x0XHRpZiAoKGlzX2Fub24gfHwgaXNfc3dhcGNhY2hlKSBcdTAwMjZcdTAwMjYgc3BsaXRfb3JkZXIgPT0gMSlcbiBcdFx0XHRjb250aW51ZTtcbiBcbiBcdFx0aWYgKG1hcHBpbmcpIHtcbkBAIC0zODc4LDMyICszODc2LDI2IEBAIHN0YXRpYyBpbnQgX19zcGxpdF91bm1hcHBlZF9mb2xpbyhzdHJ1Y3QgZm9saW8gKmZvbGlvLCBpbnQgbmV3X29yZGVyLFxuIGludCBmb2xpb19jaGVja19zcGxpdHRhYmxlKHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIsXG4gXHRcdFx0ICAgZW51bSBzcGxpdF90eXBlIHNwbGl0X3R5cGUpXG4ge1xuK1x0Ym9vbCBpc19hbm9uID0gZm9saW9fdGVzdF9hbm9uKGZvbGlvKTtcbitcdGJvb2wgaXNfc3dhcGNhY2hlID0gZm9saW9fdGVzdF9zd2FwY2FjaGUoZm9saW8pO1xuK1xuIFx0Vk1fV0FSTl9PTl9GT0xJTyghZm9saW9fdGVzdF9sb2NrZWQoZm9saW8pLCBmb2xpbyk7XG4gXHQvKlxuIFx0ICogRm9saW9zIHRoYXQganVzdCBnb3QgdHJ1bmNhdGVkIGNhbm5vdCBnZXQgc3BsaXQuIFNpZ25hbCB0byB0aGVcbi1cdCAqIGNhbGxlciB0aGF0IHRoZXJlIHdhcyBhIHJhY2UuXG4tXHQgKlxuLVx0ICogVE9ETzogdGhpcyB3aWxsIGFsc28gY3VycmVudGx5IHJlZnVzZSBmb2xpb3Mgd2l0aG91dCBhIG1hcHBpbmcgaW4gdGhlXG4tXHQgKiBzd2FwY2FjaGUgKHNobWVtIG9yIHRvLWJlLWFub24gZm9saW9zKS5cbitcdCAqIGNhbGxlciB0aGF0IHRoZXJlIHdhcyBhIHJhY2UuIEEgbWFwcGluZ2xlc3Mgc3dhcCBjYWNoZSBmb2xpb1xuK1x0ICogaGFzIG5vIHBhZ2UgY2FjaGUgZW50cmllcyB0byB1cGRhdGUsIHNvIGl0IGlzIGZpbmUgdG8gc3BsaXQuXG4gXHQgKi9cbi1cdGlmICghZm9saW8tXHUwMDNlbWFwcGluZyBcdTAwMjZcdTAwMjYgIWZvbGlvX3Rlc3RfYW5vbihmb2xpbykpXG4rXHRpZiAoIWZvbGlvLVx1MDAzZW1hcHBpbmcgXHUwMDI2XHUwMDI2ICFpc19zd2FwY2FjaGUpXG4gXHRcdHJldHVybiAtRUJVU1k7XG4gXG4tXHQvKiBvcmRlci0xIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIGFub255bW91cyBUSFAuICovXG4tXHRpZiAoZm9saW9fdGVzdF9hbm9uKGZvbGlvKSBcdTAwMjZcdTAwMjYgbmV3X29yZGVyID09IDEpXG4tXHRcdHJldHVybiAtRUlOVkFMO1xuLVxuIFx0Lypcbi1cdCAqIHN3YXBjYWNoZSBmb2xpbyBjb3VsZCBvbmx5IGJlIHNwbGl0IHRvIG9yZGVyIDBcbi1cdCAqXG4tXHQgKiBub24tdW5pZm9ybSBzcGxpdCBjcmVhdGVzIGFmdGVyLXNwbGl0IGZvbGlvcyB3aXRoIG9yZGVycyBmcm9tXG4tXHQgKiBmb2xpb19vcmRlcihmb2xpbykgLSAxIHRvIG5ld19vcmRlciwgbWFraW5nIGl0IG5vdCBzdWl0YWJsZSBmb3IgYW55XG4tXHQgKiBzd2FwY2FjaGUgZm9saW8gc3BsaXQuIE9ubHkgdW5pZm9ybSBzcGxpdCB0byBvcmRlci0wIGNhbiBiZSB1c2VkXG4tXHQgKiBoZXJlLlxuK1x0ICogT3JkZXItMSBpcyB1bnN1cHBvcnRlZDogYW5vbiBmb2xpb3MgbmVlZCBzdWJwYWdlIDIgZm9yIHRoZVxuK1x0ICogZGVmZXJyZWQgc3BsaXQgbGlzdCwgaHlicmlkIHNobWVtIFx1MDAyNiBzd2FwIGNhY2hlIGZvbGlvcyBhcmUgbm90XG4rXHQgKiBzcGxpdHRhYmxlLCBhbmQgYSBzcGxpdHRhYmxlIG1hcHBpbmdsZXNzIHN3YXAgY2FjaGUgZm9saW8gY291bGRcbitcdCAqIGJlIGVpdGhlciBhbm9uIG9yIHNobWVtLCB3aGljaCB3ZSBjYW5ub3QgdGVsbCBhcGFydC5cbiBcdCAqL1xuLVx0aWYgKChzcGxpdF90eXBlID09IFNQTElUX1RZUEVfTk9OX1VOSUZPUk0gfHwgbmV3X29yZGVyKSBcdTAwMjZcdTAwMjYgZm9saW9fdGVzdF9zd2FwY2FjaGUoZm9saW8pKSB7XG4rXHRpZiAoKGlzX2Fub24gfHwgaXNfc3dhcGNhY2hlKSBcdTAwMjZcdTAwMjYgbmV3X29yZGVyID09IDEpXG4gXHRcdHJldHVybiAtRUlOVkFMO1xuLVx0fVxuIFxuIFx0aWYgKGlzX2h1Z2VfemVyb19mb2xpbyhmb2xpbykpXG4gXHRcdHJldHVybiAtRUlOVkFMO1xuQEAgLTM5MTEsMzkgKzM5MDMsNzggQEAgaW50IGZvbGlvX2NoZWNrX3NwbGl0dGFibGUoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlcixcbiBcdGlmIChmb2xpb190ZXN0X3dyaXRlYmFjayhmb2xpbykpXG4gXHRcdHJldHVybiAtRUJVU1k7XG4gXG4rXHQvKlxuK1x0ICogQSBub24tYW5vbiBzd2FwY2FjaGUgZm9saW8gdGhhdCBzdGlsbCBoYXMgYSBtYXBwaW5nIHNob3VsZCBvbmx5XG4rXHQgKiBiZSBhIHNobWVtIGZvbGlvIHVuZGVyIElPLCB0aGVyZSBpcyBsaXR0bGUgYmVuZWZpdCBpbiBzcGxpdHRpbmdcbitcdCAqIHRoZW0gaGVuY2Ugbm90IHN1cHBvcnRlZC4gUmVqZWN0IGl0IGhlcmUgdXAgZnJvbnQ6IHRoZSBzcGxpdFxuK1x0ICogcm91dGluZSBjYW5ub3QgYmFjayBvdXQgY2xlYW5seSBvbmNlIHRoZSBmb2xpbyByZWYgaXMgZnJvemVuLlxuK1x0ICovXG4rXHRpZiAoIWlzX2Fub24gXHUwMDI2XHUwMDI2IGlzX3N3YXBjYWNoZSBcdTAwMjZcdTAwMjYgZm9saW8tXHUwMDNlbWFwcGluZylcbitcdFx0cmV0dXJuIC1FSU5WQUw7XG4rXG4gXHRyZXR1cm4gMDtcbiB9XG4gXG4tLyogTnVtYmVyIG9mIGZvbGlvIHJlZmVyZW5jZXMgZnJvbSB0aGUgcGFnZWNhY2hlIG9yIHRoZSBzd2FwY2FjaGUuICovXG4tc3RhdGljIHVuc2lnbmVkIGludCBmb2xpb19jYWNoZV9yZWZfY291bnQoY29uc3Qgc3RydWN0IGZvbGlvICpmb2xpbylcbisvKiBOdW1iZXIgb2YgZm9saW8gcmVmZXJlbmNlcyBmcm9tIHRoZSBzd2FwY2FjaGUuICovXG4rc3RhdGljIHVuc2lnbmVkIGludCBmb2xpb19zd2FwY2FjaGVfcmVmX2NvdW50KGNvbnN0IHN0cnVjdCBmb2xpbyAqZm9saW8pXG4ge1xuLVx0aWYgKGZvbGlvX3Rlc3RfYW5vbihmb2xpbykgXHUwMDI2XHUwMDI2ICFmb2xpb190ZXN0X3N3YXBjYWNoZShmb2xpbykpXG4rXHRpZiAoIWZvbGlvX3Rlc3Rfc3dhcGNhY2hlKGZvbGlvKSlcbiBcdFx0cmV0dXJuIDA7XG4gXHRyZXR1cm4gZm9saW9fbnJfcGFnZXMoZm9saW8pO1xuIH1cbiBcbi1zdGF0aWMgaW50IF9fZm9saW9fZnJlZXplX2FuZF9zcGxpdF91bm1hcHBlZChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyLFxuLVx0XHRcdFx0XHQgICAgIHN0cnVjdCBwYWdlICpzcGxpdF9hdCwgc3RydWN0IHhhX3N0YXRlICp4YXMsXG4tXHRcdFx0XHRcdCAgICAgc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsIGJvb2wgZG9fbHJ1LFxuLVx0XHRcdFx0XHQgICAgIHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QsIGVudW0gc3BsaXRfdHlwZSBzcGxpdF90eXBlLFxuLVx0XHRcdFx0XHQgICAgIHBnb2ZmX3QgZW5kLCBpbnQgKm5yX3NobWVtX2Ryb3BwZWQpXG4rc3RhdGljIGludCBfX2ZvbGlvX2ZyZWV6ZV9zcGxpdF91bm1hcChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyLFxuK1x0XHRcdFx0ICAgICAgc3RydWN0IHBhZ2UgKnNwbGl0X2F0LCBib29sIGRvX2xydSwgYm9vbCBhbm9uX3VubWFwLFxuK1x0XHRcdFx0ICAgICAgc3RydWN0IGxpc3RfaGVhZCAqbGlzdCwgZW51bSBzcGxpdF90eXBlIHNwbGl0X3R5cGUpXG4ge1xuIFx0c3RydWN0IGZvbGlvICplbmRfZm9saW8gPSBmb2xpb19uZXh0KGZvbGlvKTtcbi1cdHN0cnVjdCBmb2xpbyAqbmV3X2ZvbGlvLCAqbmV4dDtcbitcdGJvb2wgaXNfYW5vbiA9IGZvbGlvX3Rlc3RfYW5vbihmb2xpbyk7XG4rXHRzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpID0gTlVMTDtcbitcdHN0cnVjdCBmb2xpbyAqbmV3X2ZvbGlvO1xuIFx0aW50IG9sZF9vcmRlciA9IGZvbGlvX29yZGVyKGZvbGlvKTtcbitcdHN0cnVjdCBhbm9uX3ZtYSAqYW5vbl92bWEgPSBOVUxMO1xuK1x0ZW51bSB0dHVfZmxhZ3MgdHR1X2ZsYWdzID0gMDtcbiBcdHN0cnVjdCBsaXN0X2xydV9vbmUgKmxydTtcbitcdHN0cnVjdCBscnV2ZWMgKmxydXZlYztcbiBcdGJvb2wgZGVxdWV1ZV9kZWZlcnJlZDtcbiBcdGludCByZXQgPSAwO1xuIFxuLVx0Vk1fV0FSTl9PTl9PTkNFKCFtYXBwaW5nIFx1MDAyNlx1MDAyNiBlbmQpO1xuK1x0LypcbitcdCAqIFVubWFwL3JlbWFwIG5lZWRzIHRoZSBhbm9uX3ZtYS4gVGhlIGNhbGxlciBkb2VzIG5vdCBuZWNlc3NhcmlseVxuK1x0ICogaG9sZCBhbiBtbWFwX2xvY2sgdGhhdCB3b3VsZCBwcmV2ZW50IHRoZSBhbm9uX3ZtYSBmcm9tXG4rXHQgKiBkaXNhcHBlYXJpbmcsIHNvIHdlIGZpcnN0IHRha2UgYSByZWZlcmVuY2UgYW5kIGxvY2sgaXQuIFRoaXMgaXNcbitcdCAqIHNpbWlsYXIgdG8gZm9saW9fbG9ja19hbm9uX3ZtYV9yZWFkKCkgZXhjZXB0IHRoZSB3cml0ZSBsb2NrIGlzXG4rXHQgKiB0YWtlbiB0byBzZXJpYWxpemUgYWdhaW5zdCBwYXJhbGxlbCBzcGxpdCBvciBjb2xsYXBzZS5cbitcdCAqL1xuK1x0aWYgKGFub25fdW5tYXApIHtcbitcdFx0YW5vbl92bWEgPSBmb2xpb19nZXRfYW5vbl92bWEoZm9saW8pO1xuK1x0XHRpZiAoIWFub25fdm1hKVxuK1x0XHRcdHJldHVybiAtRUJVU1k7XG4rXHRcdGFub25fdm1hX2xvY2tfd3JpdGUoYW5vbl92bWEpO1xuK1x0fVxuK1xuK1x0LyogUmFjeSBjaGVjayBpZiB3ZSBjYW4gc3BsaXQgdGhlIHBhZ2UsIGJlZm9yZSB0aGUgb3B0aW9uYWwgdW5tYXAuICovXG4rXHRpZiAoZm9saW9fZXhwZWN0ZWRfcmVmX2NvdW50KGZvbGlvKSAhPSBmb2xpb19yZWZfY291bnQoZm9saW8pIC0gMSkge1xuK1x0XHRyZXQgPSAtRUFHQUlOO1xuK1x0XHRnb3RvIG91dF91bmxvY2s7XG4rXHR9XG4rXG4rXHRpZiAoYW5vbl91bm1hcClcbitcdFx0dW5tYXBfZm9saW8oZm9saW8pO1xuK1xuK1x0bG9jYWxfaXJxX2Rpc2FibGUoKTtcbitcbiBcdC8qXG4gXHQgKiBJZiB0aGlzIGZvbGlvIGNhbiBiZSBvbiB0aGUgZGVmZXJyZWQgc3BsaXQgcXVldWUsIGxvY2sgb3V0XG4gXHQgKiB0aGUgc2hyaW5rZXIgYmVmb3JlIGZyZWV6aW5nIHRoZSByZWYuIElmIHRoZSBzaHJpbmtlciBzZWVzXG4gXHQgKiBhIDAtcmVmIGZvbGlvLCBpdCBhc3N1bWVzIGl0IGJlYXQgZm9saW9fcHV0KCkgdG8gdGhlIGxpc3RcbiBcdCAqIGxvY2sgYW5kIG11c3QgY2xlYW4gdXAgdGhlIExSVSBzdGF0ZSAtIHRoZSBzYW1lIGRlcXVldWUgd2VcbiBcdCAqIHdpbGwgZG8gYmVsb3cgYXMgcGFydCBvZiB0aGUgc3BsaXQuXG4rXHQgKlxuK1x0ICogT25seSBhbm9uIGZvbGlvcyBhcmUgZXZlciBxdWV1ZWQgb24gdGhlIGRlZmVycmVkIHNwbGl0IGxpc3QsXG4rXHQgKiBzbyBub24tYW5vbiBmb2xpb3MgKG1hcHBpbmdsZXNzIHN3YXBjYWNoZSkgbmV2ZXIgbmVlZCBkZXF1ZXVpbmcuXG4gXHQgKi9cbi1cdGRlcXVldWVfZGVmZXJyZWQgPSBmb2xpb190ZXN0X2Fub24oZm9saW8pIFx1MDAyNlx1MDAyNiBvbGRfb3JkZXIgXHUwMDNlIDE7XG4rXHRkZXF1ZXVlX2RlZmVycmVkID0gb2xkX29yZGVyIFx1MDAzZSAxIFx1MDAyNlx1MDAyNiBpc19hbm9uO1xuIFx0aWYgKGRlcXVldWVfZGVmZXJyZWQpIHtcbiBcdFx0c3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnO1xuIFxuQEAgLTM5NTIsMTI4ICszOTgzLDI0MyBAQCBzdGF0aWMgaW50IF9fZm9saW9fZnJlZXplX2FuZF9zcGxpdF91bm1hcHBlZChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgblxuIFx0XHRscnUgPSBsaXN0X2xydV9sb2NrKFx1MDAyNmRlZmVycmVkX3NwbGl0X2xydSxcbiBcdFx0XHRcdCAgICBmb2xpb19uaWQoZm9saW8pLCBcdTAwMjZtZW1jZyk7XG4gXHR9XG4tXHRpZiAoZm9saW9fcmVmX2ZyZWV6ZShmb2xpbywgZm9saW9fY2FjaGVfcmVmX2NvdW50KGZvbGlvKSArIDEpKSB7XG4tXHRcdHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2kgPSBOVUxMO1xuLVx0XHRzdHJ1Y3QgbHJ1dmVjICpscnV2ZWM7XG4gXG4rXHRpZiAoIWZvbGlvX3JlZl9mcmVlemUoZm9saW8sIGZvbGlvX3N3YXBjYWNoZV9yZWZfY291bnQoZm9saW8pICsgMSkpIHtcbiBcdFx0aWYgKGRlcXVldWVfZGVmZXJyZWQpIHtcbi1cdFx0XHRfX2xpc3RfbHJ1X2RlbChcdTAwMjZkZWZlcnJlZF9zcGxpdF9scnUsIGxydSxcbi1cdFx0XHRcdCAgICAgICBcdTAwMjZmb2xpby1cdTAwM2VfZGVmZXJyZWRfbGlzdCwgZm9saW9fbmlkKGZvbGlvKSk7XG4tXHRcdFx0aWYgKGZvbGlvX3Rlc3RfcGFydGlhbGx5X21hcHBlZChmb2xpbykpIHtcbi1cdFx0XHRcdGZvbGlvX2NsZWFyX3BhcnRpYWxseV9tYXBwZWQoZm9saW8pO1xuLVx0XHRcdFx0bW9kX210aHBfc3RhdChvbGRfb3JkZXIsXG4tXHRcdFx0XHRcdE1USFBfU1RBVF9OUl9BTk9OX1BBUlRJQUxMWV9NQVBQRUQsIC0xKTtcbi1cdFx0XHR9XG4gXHRcdFx0bGlzdF9scnVfdW5sb2NrKGxydSk7XG4gXHRcdFx0cmN1X3JlYWRfdW5sb2NrKCk7XG4gXHRcdH1cbitcdFx0cmV0ID0gLUVBR0FJTjtcbitcdFx0Z290byBvdXRfbm9fc3BsaXQ7XG4rXHR9XG4gXG4tXHRcdGlmIChtYXBwaW5nKSB7XG4tXHRcdFx0aW50IG5yID0gZm9saW9fbnJfcGFnZXMoZm9saW8pO1xuLVxuLVx0XHRcdGlmIChmb2xpb190ZXN0X3BtZF9tYXBwYWJsZShmb2xpbykgXHUwMDI2XHUwMDI2XG4tXHRcdFx0ICAgIG5ld19vcmRlciBcdTAwM2MgSFBBR0VfUE1EX09SREVSKSB7XG4tXHRcdFx0XHRpZiAoZm9saW9fdGVzdF9zd2FwYmFja2VkKGZvbGlvKSkge1xuLVx0XHRcdFx0XHRscnV2ZWNfc3RhdF9tb2RfZm9saW8oZm9saW8sXG4tXHRcdFx0XHRcdFx0XHROUl9TSE1FTV9USFBTLCAtbnIpO1xuLVx0XHRcdFx0fSBlbHNlIHtcbi1cdFx0XHRcdFx0bHJ1dmVjX3N0YXRfbW9kX2ZvbGlvKGZvbGlvLFxuLVx0XHRcdFx0XHRcdFx0TlJfRklMRV9USFBTLCAtbnIpO1xuLVx0XHRcdFx0fVxuLVx0XHRcdH1cbitcdGlmIChkZXF1ZXVlX2RlZmVycmVkKSB7XG4rXHRcdF9fbGlzdF9scnVfZGVsKFx1MDAyNmRlZmVycmVkX3NwbGl0X2xydSwgbHJ1LFxuK1x0XHRcdCAgICAgICBcdTAwMjZmb2xpby1cdTAwM2VfZGVmZXJyZWRfbGlzdCwgZm9saW9fbmlkKGZvbGlvKSk7XG4rXHRcdGlmIChmb2xpb190ZXN0X3BhcnRpYWxseV9tYXBwZWQoZm9saW8pKSB7XG4rXHRcdFx0Zm9saW9fY2xlYXJfcGFydGlhbGx5X21hcHBlZChmb2xpbyk7XG4rXHRcdFx0bW9kX210aHBfc3RhdChvbGRfb3JkZXIsXG4rXHRcdFx0XHQgICAgICBNVEhQX1NUQVRfTlJfQU5PTl9QQVJUSUFMTFlfTUFQUEVELCAtMSk7XG4gXHRcdH1cbitcdFx0bGlzdF9scnVfdW5sb2NrKGxydSk7XG4rXHRcdHJjdV9yZWFkX3VubG9jaygpO1xuK1x0fVxuIFxuLVx0XHRpZiAoZm9saW9fdGVzdF9zd2FwY2FjaGUoZm9saW8pKSB7XG4tXHRcdFx0aWYgKG1hcHBpbmcpIHtcbi1cdFx0XHRcdFZNX1dBUk5fT05fT05DRV9GT0xJTyhtYXBwaW5nLCBmb2xpbyk7XG4tXHRcdFx0XHRyZXR1cm4gLUVJTlZBTDtcbi1cdFx0XHR9XG4rXHRpZiAoZm9saW9fdGVzdF9zd2FwY2FjaGUoZm9saW8pKVxuK1x0XHRjaSA9IHN3YXBfY2x1c3Rlcl9nZXRfYW5kX2xvY2soZm9saW8pO1xuIFxuLVx0XHRcdGNpID0gc3dhcF9jbHVzdGVyX2dldF9hbmRfbG9jayhmb2xpbyk7XG4tXHRcdH1cbitcdGlmIChkb19scnUpXG4rXHRcdGxydXZlYyA9IGZvbGlvX2xydXZlY19sb2NrKGZvbGlvKTtcbitcbitcdHJldCA9IF9fc3BsaXRfdW5tYXBwZWRfZm9saW8oZm9saW8sIG5ld19vcmRlciwgc3BsaXRfYXQsIE5VTEwsXG4rXHRcdFx0XHQgICAgIE5VTEwsIHNwbGl0X3R5cGUpO1xuIFxuLVx0XHQvKiBsb2NrIGxydSBsaXN0L1BhZ2VDb21wb3VuZCwgcmVmIGZyb3plbiBieSBwYWdlX3JlZl9mcmVlemUgKi9cbitcdC8qXG4rXHQgKiBVbmZyZWV6ZSB0aGUgYWZ0ZXItc3BsaXQgZm9saW9zIGFuZCBwdXQgdGhlbSBiYWNrIHRvIHRoZSByaWdodFxuK1x0ICogcGxhY2UsIGtlZXBpbmcgdGhlIGhlYWQgQGZvbGlvIGZyb3plbiB1bnRpbCB0aGUgZW5kLiBXaGlsZSB0aGVcbitcdCAqIGZvbGlvIGlzIGluIHRoZSBzd2FwIGNhY2hlLCB0aGUgc3ViIGVudHJpZXMgbXVzdCBiZSB1cGRhdGVkIHdpdGhcbitcdCAqIHRoZWlyIGFmdGVyLXNwbGl0IGZvbGlvcyBiZWZvcmUgdGhlIGhlYWQgaXMgdW5mcm96ZW4sIHNvIGFcbitcdCAqIGNvbmN1cnJlbnQgc3dhcF9jYWNoZV9nZXRfZm9saW8oKSBjYW5ub3QgcmV0dXJuIHRoZSBoZWFkIGZvbGlvXG4rXHQgKiBmb3IgYSBzdWIgZW50cnkuIEtlZXBpbmcgdGhlIGhlYWQgZnJvemVuIHRocm91Z2hvdXQgYWxzbyBzdG9wcyBhXG4rXHQgKiBwYXJhbGxlbCBmb2xpb190cnlfZ2V0KCkgZnJvbSBvYnNlcnZpbmcgYSBwYXJ0aWFsbHkgc3BsaXQgZm9saW8uXG4rXHQgKi9cbitcdGZvciAobmV3X2ZvbGlvID0gZm9saW9fbmV4dChmb2xpbyk7IG5ld19mb2xpbyAhPSBlbmRfZm9saW87XG4rXHQgICAgIG5ld19mb2xpbyA9IGZvbGlvX25leHQobmV3X2ZvbGlvKSkge1xuK1x0XHR6b25lX2RldmljZV9wcml2YXRlX3NwbGl0X2NiKGZvbGlvLCBuZXdfZm9saW8pO1xuK1x0XHRmb2xpb19yZWZfdW5mcmVlemUobmV3X2ZvbGlvLFxuK1x0XHRcdFx0ICAgZm9saW9fc3dhcGNhY2hlX3JlZl9jb3VudChuZXdfZm9saW8pICsgMSk7XG4gXHRcdGlmIChkb19scnUpXG4tXHRcdFx0bHJ1dmVjID0gZm9saW9fbHJ1dmVjX2xvY2soZm9saW8pO1xuK1x0XHRcdGxydV9hZGRfc3BsaXRfZm9saW8oZm9saW8sIG5ld19mb2xpbywgbHJ1dmVjLCBsaXN0KTtcbitcdFx0aWYgKGNpKVxuK1x0XHRcdF9fc3dhcF9jYWNoZV9yZXBsYWNlX2ZvbGlvKGNpLCBmb2xpbywgbmV3X2ZvbGlvKTtcbitcdH1cbiBcbi1cdFx0cmV0ID0gX19zcGxpdF91bm1hcHBlZF9mb2xpbyhmb2xpbywgbmV3X29yZGVyLCBzcGxpdF9hdCwgeGFzLFxuLVx0XHRcdFx0XHQgICAgIG1hcHBpbmcsIHNwbGl0X3R5cGUpO1xuK1x0em9uZV9kZXZpY2VfcHJpdmF0ZV9zcGxpdF9jYihmb2xpbywgTlVMTCk7XG4rXHRmb2xpb19yZWZfdW5mcmVlemUoZm9saW8sIGZvbGlvX3N3YXBjYWNoZV9yZWZfY291bnQoZm9saW8pICsgMSk7XG4gXG4tXHRcdC8qXG4tXHRcdCAqIFVuZnJlZXplIGFmdGVyLXNwbGl0IGZvbGlvcyBhbmQgcHV0IHRoZW0gYmFjayB0byB0aGUgcmlnaHRcbi1cdFx0ICogbGlzdC4gQGZvbGlvIHNob3VsZCBiZSBrZXB0IGZyb3pvbiB1bnRpbCBwYWdlIGNhY2hlXG4tXHRcdCAqIGVudHJpZXMgYXJlIHVwZGF0ZWQgd2l0aCBhbGwgdGhlIG90aGVyIGFmdGVyLXNwbGl0IGZvbGlvc1xuLVx0XHQgKiB0byBwcmV2ZW50IG90aGVycyBzZWVpbmcgc3RhbGUgcGFnZSBjYWNoZSBlbnRyaWVzLlxuLVx0XHQgKiBBcyBhIHJlc3VsdCwgbmV3X2ZvbGlvIHN0YXJ0cyBmcm9tIHRoZSBuZXh0IGZvbGlvIG9mXG4tXHRcdCAqIEBmb2xpby5cbi1cdFx0ICovXG4tXHRcdGZvciAobmV3X2ZvbGlvID0gZm9saW9fbmV4dChmb2xpbyk7IG5ld19mb2xpbyAhPSBlbmRfZm9saW87XG4tXHRcdCAgICAgbmV3X2ZvbGlvID0gbmV4dCkge1xuLVx0XHRcdHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMgPSBmb2xpb19ucl9wYWdlcyhuZXdfZm9saW8pO1xuK1x0aWYgKGRvX2xydSlcbitcdFx0bHJ1dmVjX3VubG9jayhscnV2ZWMpO1xuK1x0aWYgKGNpKVxuK1x0XHRzd2FwX2NsdXN0ZXJfdW5sb2NrKGNpKTtcbitvdXRfbm9fc3BsaXQ6XG4rXHRsb2NhbF9pcnFfZW5hYmxlKCk7XG4rXHRpZiAoYW5vbl91bm1hcCkge1xuK1x0XHRpZiAoIXJldCBcdTAwMjZcdTAwMjYgIWZvbGlvX2lzX2RldmljZV9wcml2YXRlKGZvbGlvKSlcbitcdFx0XHR0dHVfZmxhZ3MgPSBUVFVfVVNFX1NIQVJFRF9aRVJPUEFHRTtcbitcdFx0cmVtYXBfcGFnZShmb2xpbywgMSBcdTAwM2NcdTAwM2Mgb2xkX29yZGVyLCB0dHVfZmxhZ3MpO1xuK1x0fVxuK291dF91bmxvY2s6XG4rXHRpZiAoYW5vbl91bm1hcCkge1xuK1x0XHRhbm9uX3ZtYV91bmxvY2tfd3JpdGUoYW5vbl92bWEpO1xuK1x0XHRwdXRfYW5vbl92bWEoYW5vbl92bWEpO1xuK1x0fVxuIFxuLVx0XHRcdG5leHQgPSBmb2xpb19uZXh0KG5ld19mb2xpbyk7XG4rXHRyZXR1cm4gcmV0O1xuK31cbiBcbi1cdFx0XHR6b25lX2RldmljZV9wcml2YXRlX3NwbGl0X2NiKGZvbGlvLCBuZXdfZm9saW8pO1xuK3N0YXRpYyBpbnQgX19mb2xpb19mcmVlemVfc3BsaXRfdW5tYXBfZmlsZShzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyLFxuK1x0XHRcdFx0XHQgICBzdHJ1Y3QgcGFnZSAqc3BsaXRfYXQsIGJvb2wgZG9fbHJ1LFxuK1x0XHRcdFx0XHQgICBzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LCBlbnVtIHNwbGl0X3R5cGUgc3BsaXRfdHlwZSlcbit7XG4rXHRzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyA9IGZvbGlvLVx1MDAzZW1hcHBpbmc7XG4rXHRYQV9TVEFURSh4YXMsIFx1MDAyNm1hcHBpbmctXHUwMDNlaV9wYWdlcywgZm9saW8tXHUwMDNlaW5kZXgpO1xuK1x0c3RydWN0IGZvbGlvICplbmRfZm9saW8gPSBmb2xpb19uZXh0KGZvbGlvKTtcbitcdGxvbmcgb2xkX25yX3BhZ2VzID0gZm9saW9fbnJfcGFnZXMoZm9saW8pO1xuK1x0c3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLCAqb2xkX21lbWNnO1xuK1x0c3RydWN0IGZvbGlvICpuZXdfZm9saW8sICpuZXh0O1xuK1x0aW50IG5yX3NobWVtX2Ryb3BwZWQgPSAwO1xuK1x0dW5zaWduZWQgaW50IG1pbl9vcmRlcjtcbitcdHN0cnVjdCBscnV2ZWMgKmxydXZlYztcbitcdHBnb2ZmX3QgZW5kID0gMDtcbitcdGdmcF90IGdmcDtcbitcdGludCByZXQgPSAwO1xuIFxuLVx0XHRcdGZvbGlvX3JlZl91bmZyZWV6ZShuZXdfZm9saW8sXG4tXHRcdFx0XHRcdCAgIGZvbGlvX2NhY2hlX3JlZl9jb3VudChuZXdfZm9saW8pICsgMSk7XG4rXHRtaW5fb3JkZXIgPSBtYXBwaW5nX21pbl9mb2xpb19vcmRlcihtYXBwaW5nKTtcbitcdGlmIChuZXdfb3JkZXIgXHUwMDNjIG1pbl9vcmRlcilcbitcdFx0cmV0dXJuIC1FSU5WQUw7XG4gXG4tXHRcdFx0aWYgKGRvX2xydSlcbi1cdFx0XHRcdGxydV9hZGRfc3BsaXRfZm9saW8oZm9saW8sIG5ld19mb2xpbywgbHJ1dmVjLCBsaXN0KTtcbitcdC8qXG4rXHQgKiBTd2l0Y2ggdG8gZm9saW8ncyBtZW1jZyBhcyB4YXJyYXkgbm9kZSBhbGxvY2F0aW9uIGNhbiBoYXBwZW4gYW5kXG4rXHQgKiBuZWVkcyB0byBjaGFyZ2UgdG8gaXQuXG4rXHQgKi9cbitcdG1lbWNnID0gZ2V0X21lbV9jZ3JvdXBfZnJvbV9mb2xpbyhmb2xpbyk7XG4rXHRvbGRfbWVtY2cgPSBzZXRfYWN0aXZlX21lbWNnKG1lbWNnKTtcbiBcbi1cdFx0XHQvKlxuLVx0XHRcdCAqIEFub255bW91cyBmb2xpbyB3aXRoIHN3YXAgY2FjaGUuXG4tXHRcdFx0ICogTk9URTogc2htZW0gaW4gc3dhcCBjYWNoZSBpcyBub3Qgc3VwcG9ydGVkIHlldC5cbi1cdFx0XHQgKi9cbi1cdFx0XHRpZiAoY2kpIHtcbi1cdFx0XHRcdF9fc3dhcF9jYWNoZV9yZXBsYWNlX2ZvbGlvKGNpLCBmb2xpbywgbmV3X2ZvbGlvKTtcbi1cdFx0XHRcdGNvbnRpbnVlO1xuLVx0XHRcdH1cbitcdGdmcCA9IGN1cnJlbnRfZ2ZwX2NvbnRleHQobWFwcGluZ19nZnBfbWFzayhtYXBwaW5nKSBcdTAwMjYgR0ZQX1JFQ0xBSU1fTUFTSyk7XG4rXHRpZiAoIWZpbGVtYXBfcmVsZWFzZV9mb2xpbyhmb2xpbywgZ2ZwKSkge1xuK1x0XHRyZXQgPSAtRUJVU1k7XG4rXHRcdGdvdG8gZmFpbF9mcmVlO1xuK1x0fVxuIFxuLVx0XHRcdC8qIEFub255bW91cyBmb2xpbyB3aXRob3V0IHN3YXAgY2FjaGUgKi9cbi1cdFx0XHRpZiAoIW1hcHBpbmcpXG4tXHRcdFx0XHRjb250aW51ZTtcbitcdG1hcHBpbmdfc2V0X3VwZGF0ZShcdTAwMjZ4YXMsIG1hcHBpbmcpO1xuIFxuLVx0XHRcdC8qIEFkZCB0aGUgbmV3IGZvbGlvIHRvIHRoZSBwYWdlIGNhY2hlLiAqL1xuLVx0XHRcdGlmIChuZXdfZm9saW8tXHUwMDNlaW5kZXggXHUwMDNjIGVuZCkge1xuLVx0XHRcdFx0X194YV9zdG9yZShcdTAwMjZtYXBwaW5nLVx1MDAzZWlfcGFnZXMsIG5ld19mb2xpby1cdTAwM2VpbmRleCxcbi1cdFx0XHRcdFx0ICAgbmV3X2ZvbGlvLCAwKTtcbi1cdFx0XHRcdGNvbnRpbnVlO1xuLVx0XHRcdH1cbitcdGlmIChzcGxpdF90eXBlID09IFNQTElUX1RZUEVfVU5JRk9STSkge1xuK1x0XHRpbnQgb2xkX29yZGVyID0gZm9saW9fb3JkZXIoZm9saW8pO1xuIFxuLVx0XHRcdFZNX1dBUk5fT05fT05DRSghbnJfc2htZW1fZHJvcHBlZCk7XG4tXHRcdFx0LyogRHJvcCBmb2xpbyBiZXlvbmQgRU9GOiAtXHUwMDNlaW5kZXggXHUwMDNlPSBlbmQgKi9cbi1cdFx0XHRpZiAoc2htZW1fbWFwcGluZyhtYXBwaW5nKSBcdTAwMjZcdTAwMjYgbnJfc2htZW1fZHJvcHBlZClcbi1cdFx0XHRcdCpucl9zaG1lbV9kcm9wcGVkICs9IG5yX3BhZ2VzO1xuLVx0XHRcdGVsc2UgaWYgKGZvbGlvX3Rlc3RfY2xlYXJfZGlydHkobmV3X2ZvbGlvKSlcbi1cdFx0XHRcdGZvbGlvX2FjY291bnRfY2xlYW5lZChcbi1cdFx0XHRcdFx0bmV3X2ZvbGlvLCBpbm9kZV90b193YihtYXBwaW5nLVx1MDAzZWhvc3QpKTtcbi1cdFx0XHRfX2ZpbGVtYXBfcmVtb3ZlX2ZvbGlvKG5ld19mb2xpbywgTlVMTCk7XG4tXHRcdFx0Zm9saW9fcHV0X3JlZnMobmV3X2ZvbGlvLCBucl9wYWdlcyk7XG4rXHRcdHhhc19zZXRfb3JkZXIoXHUwMDI2eGFzLCBmb2xpby1cdTAwM2VpbmRleCwgbmV3X29yZGVyKTtcbitcdFx0eGFzX3NwbGl0X2FsbG9jKFx1MDAyNnhhcywgZm9saW8sIG9sZF9vcmRlciwgZ2ZwKTtcbitcdFx0aWYgKHhhc19lcnJvcihcdTAwMjZ4YXMpKSB7XG4rXHRcdFx0cmV0ID0geGFzX2Vycm9yKFx1MDAyNnhhcyk7XG4rXHRcdFx0Z290byBmYWlsX2ZyZWU7XG4gXHRcdH1cbitcdH1cbiBcbi1cdFx0em9uZV9kZXZpY2VfcHJpdmF0ZV9zcGxpdF9jYihmb2xpbywgTlVMTCk7XG4tXHRcdC8qXG4tXHRcdCAqIFVuZnJlZXplIEBmb2xpbyBvbmx5IGFmdGVyIGFsbCBwYWdlIGNhY2hlIGVudHJpZXMsIHdoaWNoXG4tXHRcdCAqIHVzZWQgdG8gcG9pbnQgdG8gaXQsIGhhdmUgYmVlbiB1cGRhdGVkIHdpdGggbmV3IGZvbGlvcy5cbi1cdFx0ICogT3RoZXJ3aXNlLCBhIHBhcmFsbGVsIGZvbGlvX3RyeV9nZXQoKSBjYW4gZ3JhYiBAZm9saW9cbi1cdFx0ICogYW5kIGl0cyBjYWxsZXIgY2FuIHNlZSBzdGFsZSBwYWdlIGNhY2hlIGVudHJpZXMuXG4tXHRcdCAqL1xuLVx0XHRmb2xpb19yZWZfdW5mcmVlemUoZm9saW8sIGZvbGlvX2NhY2hlX3JlZl9jb3VudChmb2xpbykgKyAxKTtcbitcdGlfbW1hcF9sb2NrX3JlYWQobWFwcGluZyk7XG4rXG4rXHQvKiBSYWN5IGNoZWNrIGlmIHdlIGNhbiBzcGxpdCB0aGUgcGFnZSwgYmVmb3JlIHVubWFwX2ZvbGlvKCkgKi9cbitcdGlmIChmb2xpb19leHBlY3RlZF9yZWZfY291bnQoZm9saW8pICE9IGZvbGlvX3JlZl9jb3VudChmb2xpbykgLSAxKSB7XG4rXHRcdHJldCA9IC1FQUdBSU47XG4rXHRcdGdvdG8gZmFpbF9tbWFwX3VubG9jaztcbitcdH1cbitcbitcdC8qXG4rXHQgKl9fc3BsaXRfdW5tYXBwZWRfZm9saW8oKSBtYXkgbmVlZCB0byB0cmltIG9mZiBwYWdlcyBiZXlvbmRcbitcdCAqIEVPRjogYnV0IG9uIDMyLWJpdCwgaV9zaXplX3JlYWQoKSB0YWtlcyBhbiBpcnEtdW5zYWZlXG4rXHQgKiBzZXFsb2NrLCB3aGljaCBjYW5ub3QgYmUgbmVzdGVkIGluc2lkZSB0aGUgcGFnZSB0cmVlIGxvY2suXG4rXHQgKiBTbyBub3RlIGVuZCBub3c6IGlfc2l6ZSBpdHNlbGYgbWF5IGJlIGNoYW5nZWQgYXQgYW55IG1vbWVudCxcbitcdCAqIGJ1dCBmb2xpbyBsb2NrIGlzIGdvb2QgZW5vdWdoIHRvIHNlcmlhbGl6ZSB0aGUgdHJpbW1pbmcuXG4rXHQgKi9cbitcdGVuZCA9IERJVl9ST1VORF9VUChpX3NpemVfcmVhZChtYXBwaW5nLVx1MDAzZWhvc3QpLCBQQUdFX1NJWkUpO1xuK1x0aWYgKHNobWVtX21hcHBpbmcobWFwcGluZykpXG4rXHRcdGVuZCA9IHNobWVtX2ZhbGxvY2VuZChtYXBwaW5nLVx1MDAzZWhvc3QsIGVuZCk7XG4rXG4rXHR1bm1hcF9mb2xpbyhmb2xpbyk7XG4rXG4rXHR4YXNfbG9ja19pcnEoXHUwMDI2eGFzKTtcbitcbitcdC8qXG4rXHQgKiBDaGVjayBpZiB0aGUgZm9saW8gaXMgcHJlc2VudCBpbiBwYWdlIGNhY2hlLlxuK1x0ICogV2UgYXNzdW1lIGFsbCB0YWlsIGFyZSBwcmVzZW50IHRvbywgaWYgZm9saW8gaXMgdGhlcmUuXG4rXHQgKi9cbitcdGlmICh4YXNfbG9hZChcdTAwMjZ4YXMpICE9IGZvbGlvKSB7XG4rXHRcdHJldCA9IC1FQUdBSU47XG4rXHRcdGdvdG8gZmFpbDtcbitcdH1cbitcbitcdGlmICghZm9saW9fcmVmX2ZyZWV6ZShmb2xpbywgb2xkX25yX3BhZ2VzICsgMSkpIHtcbitcdFx0cmV0ID0gLUVBR0FJTjtcbitcdFx0Z290byBmYWlsO1xuK1x0fVxuK1xuK1x0aWYgKGZvbGlvX3Rlc3RfcG1kX21hcHBhYmxlKGZvbGlvKSBcdTAwMjZcdTAwMjYgbmV3X29yZGVyIFx1MDAzYyBIUEFHRV9QTURfT1JERVIpIHtcbitcdFx0aWYgKGZvbGlvX3Rlc3Rfc3dhcGJhY2tlZChmb2xpbykpXG4rXHRcdFx0bHJ1dmVjX3N0YXRfbW9kX2ZvbGlvKGZvbGlvLCBOUl9TSE1FTV9USFBTLCAtb2xkX25yX3BhZ2VzKTtcbitcdFx0ZWxzZVxuK1x0XHRcdGxydXZlY19zdGF0X21vZF9mb2xpbyhmb2xpbywgTlJfRklMRV9USFBTLCAtb2xkX25yX3BhZ2VzKTtcbitcdH1cbitcbitcdC8qIGxvY2sgbHJ1IGxpc3QvUGFnZUNvbXBvdW5kLCByZWYgZnJvemVuIGJ5IHBhZ2VfcmVmX2ZyZWV6ZSAqL1xuK1x0aWYgKGRvX2xydSlcbitcdFx0bHJ1dmVjID0gZm9saW9fbHJ1dmVjX2xvY2soZm9saW8pO1xuK1xuK1x0cmV0ID0gX19zcGxpdF91bm1hcHBlZF9mb2xpbyhmb2xpbywgbmV3X29yZGVyLCBzcGxpdF9hdCwgXHUwMDI2eGFzLFxuK1x0XHRcdFx0ICAgICBtYXBwaW5nLCBzcGxpdF90eXBlKTtcbitcbitcdC8qXG4rXHQgKiBVbmZyZWV6ZSBhZnRlci1zcGxpdCBmb2xpb3MgYW5kIHB1dCB0aGVtIGJhY2sgdG8gdGhlIHJpZ2h0XG4rXHQgKiBsaXN0LiBAZm9saW8gc2hvdWxkIGJlIGtlcHQgZnJvemVuIHVudGlsIHBhZ2UgY2FjaGVcbitcdCAqIGVudHJpZXMgYXJlIHVwZGF0ZWQgd2l0aCBhbGwgdGhlIG90aGVyIGFmdGVyLXNwbGl0IGZvbGlvc1xuK1x0ICogdG8gcHJldmVudCBvdGhlcnMgc2VlaW5nIHN0YWxlIHBhZ2UgY2FjaGUgZW50cmllcy5cbitcdCAqIEFzIGEgcmVzdWx0LCBuZXdfZm9saW8gc3RhcnRzIGZyb20gdGhlIG5leHQgZm9saW8gb2ZcbitcdCAqIEBmb2xpby5cbitcdCAqL1xuK1x0Zm9yIChuZXdfZm9saW8gPSBmb2xpb19uZXh0KGZvbGlvKTsgbmV3X2ZvbGlvICE9IGVuZF9mb2xpbztcbitcdCAgICAgbmV3X2ZvbGlvID0gbmV4dCkge1xuK1x0XHR1bnNpZ25lZCBsb25nIG5yX3BhZ2VzID0gZm9saW9fbnJfcGFnZXMobmV3X2ZvbGlvKTtcbitcbitcdFx0bmV4dCA9IGZvbGlvX25leHQobmV3X2ZvbGlvKTtcbitcbitcdFx0Zm9saW9fcmVmX3VuZnJlZXplKG5ld19mb2xpbyxcbitcdFx0XHRcdCAgIGZvbGlvX25yX3BhZ2VzKG5ld19mb2xpbykgKyAxKTtcbiBcbiBcdFx0aWYgKGRvX2xydSlcbi1cdFx0XHRscnV2ZWNfdW5sb2NrKGxydXZlYyk7XG4rXHRcdFx0bHJ1X2FkZF9zcGxpdF9mb2xpbyhmb2xpbywgbmV3X2ZvbGlvLCBscnV2ZWMsIGxpc3QpO1xuIFxuLVx0XHRpZiAoY2kpXG4tXHRcdFx0c3dhcF9jbHVzdGVyX3VubG9jayhjaSk7XG4tXHR9IGVsc2Uge1xuLVx0XHRpZiAoZGVxdWV1ZV9kZWZlcnJlZCkge1xuLVx0XHRcdGxpc3RfbHJ1X3VubG9jayhscnUpO1xuLVx0XHRcdHJjdV9yZWFkX3VubG9jaygpO1xuK1x0XHQvKiBBZGQgdGhlIG5ldyBmb2xpbyB0byB0aGUgcGFnZSBjYWNoZS4gKi9cbitcdFx0aWYgKG5ld19mb2xpby1cdTAwM2VpbmRleCBcdTAwM2MgZW5kKSB7XG4rXHRcdFx0X194YV9zdG9yZShcdTAwMjZtYXBwaW5nLVx1MDAzZWlfcGFnZXMsIG5ld19mb2xpby1cdTAwM2VpbmRleCxcbitcdFx0XHRcdCAgIG5ld19mb2xpbywgMCk7XG4rXHRcdFx0Y29udGludWU7XG4gXHRcdH1cbi1cdFx0cmV0dXJuIC1FQUdBSU47XG4rXG4rXHRcdC8qIERyb3AgZm9saW8gYmV5b25kIEVPRjogLVx1MDAzZWluZGV4IFx1MDAzZT0gZW5kICovXG4rXHRcdGlmIChzaG1lbV9tYXBwaW5nKG1hcHBpbmcpKVxuK1x0XHRcdG5yX3NobWVtX2Ryb3BwZWQgKz0gbnJfcGFnZXM7XG4rXHRcdGVsc2UgaWYgKGZvbGlvX3Rlc3RfY2xlYXJfZGlydHkobmV3X2ZvbGlvKSlcbitcdFx0XHRmb2xpb19hY2NvdW50X2NsZWFuZWQobmV3X2ZvbGlvLFxuK1x0XHRcdFx0XHQgICAgICBpbm9kZV90b193YihtYXBwaW5nLVx1MDAzZWhvc3QpKTtcbitcdFx0X19maWxlbWFwX3JlbW92ZV9mb2xpbyhuZXdfZm9saW8sIE5VTEwpO1xuK1x0XHRmb2xpb19wdXRfcmVmcyhuZXdfZm9saW8sIG5yX3BhZ2VzKTtcbiBcdH1cbiBcbitcdC8qXG4rXHQgKiBVbmZyZWV6ZSBAZm9saW8gb25seSBhZnRlciBhbGwgcGFnZSBjYWNoZSBlbnRyaWVzLCB3aGljaFxuK1x0ICogdXNlZCB0byBwb2ludCB0byBpdCwgaGF2ZSBiZWVuIHVwZGF0ZWQgd2l0aCBuZXcgZm9saW9zLlxuK1x0ICogT3RoZXJ3aXNlLCBhIHBhcmFsbGVsIGZvbGlvX3RyeV9nZXQoKSBjYW4gZ3JhYiBAZm9saW9cbitcdCAqIGFuZCBpdHMgY2FsbGVyIGNhbiBzZWUgc3RhbGUgcGFnZSBjYWNoZSBlbnRyaWVzLlxuK1x0ICovXG4rXHRmb2xpb19yZWZfdW5mcmVlemUoZm9saW8sIGZvbGlvX25yX3BhZ2VzKGZvbGlvKSArIDEpO1xuK1xuK1x0aWYgKGRvX2xydSlcbitcdFx0bHJ1dmVjX3VubG9jayhscnV2ZWMpO1xuK1xuK2ZhaWw6XG4rXHR4YXNfdW5sb2NrX2lycShcdTAwMjZ4YXMpO1xuK2ZhaWxfbW1hcF91bmxvY2s6XG4rXHRpZiAobnJfc2htZW1fZHJvcHBlZClcbitcdFx0c2htZW1fdW5jaGFyZ2UobWFwcGluZy1cdTAwM2Vob3N0LCBucl9zaG1lbV9kcm9wcGVkKTtcbitcdC8qXG4rXHQgKiBEcm9wIHRoZSBtYXBwaW5nIHdoaWxlIHRoZSBpbm9kZSBpcyBzdGlsbCBwaW5uZWQuIEBmb2xpbyBzdGF5c1xuK1x0ICogbG9ja2VkIGFuZCBwcmVzZW50IGluIHRoZSBwYWdlIGNhY2hlLCBzbyBldmljdGlvbiBjYW5ub3QgZnJlZVxuK1x0ICogdGhlIGlub2RlIHlldCwgbm90aGluZyBwYXN0IHRoaXMgcG9pbnQgbWF5IHRvdWNoIHRoZSBpbm9kZSBvclxuK1x0ICogdGhlIG1hcHBpbmcuXG4rXHQgKi9cbitcdGlfbW1hcF91bmxvY2tfcmVhZChtYXBwaW5nKTtcbitmYWlsX2ZyZWU6XG4rXHQvKiBSZXN0b3JlIHRoZSBwcmV2aW91c2x5IGFjdGl2ZSBtZW1jZyAqL1xuK1x0c2V0X2FjdGl2ZV9tZW1jZyhvbGRfbWVtY2cpO1xuK1x0bWVtX2Nncm91cF9wdXQobWVtY2cpO1xuK1x0eGFzX2Rlc3Ryb3koXHUwMDI2eGFzKTtcbiBcdHJldHVybiByZXQ7XG4gfVxuIFxuQEAgLTQxMDIsMTcgKzQyNDgsMTEgQEAgc3RhdGljIGludCBfX2ZvbGlvX3NwbGl0KHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIsXG4gXHRcdHN0cnVjdCBwYWdlICpzcGxpdF9hdCwgc3RydWN0IHBhZ2UgKmxvY2tfYXQsXG4gXHRcdHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QsIGVudW0gc3BsaXRfdHlwZSBzcGxpdF90eXBlKVxuIHtcbi1cdFhBX1NUQVRFKHhhcywgXHUwMDI2Zm9saW8tXHUwMDNlbWFwcGluZy1cdTAwM2VpX3BhZ2VzLCBmb2xpby1cdTAwM2VpbmRleCk7XG4rXHRib29sIGlzX3N3YXBjYWNoZSA9IGZvbGlvX3Rlc3Rfc3dhcGNhY2hlKGZvbGlvKTtcbiBcdHN0cnVjdCBmb2xpbyAqZW5kX2ZvbGlvID0gZm9saW9fbmV4dChmb2xpbyk7XG4gXHRib29sIGlzX2Fub24gPSBmb2xpb190ZXN0X2Fub24oZm9saW8pO1xuLVx0c3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLCAqb2xkX21lbWNnO1xuLVx0c3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSBOVUxMO1xuLVx0c3RydWN0IGFub25fdm1hICphbm9uX3ZtYSA9IE5VTEw7XG4gXHRpbnQgb2xkX29yZGVyID0gZm9saW9fb3JkZXIoZm9saW8pO1xuIFx0c3RydWN0IGZvbGlvICpuZXdfZm9saW8sICpuZXh0O1xuLVx0aW50IG5yX3NobWVtX2Ryb3BwZWQgPSAwO1xuLVx0ZW51bSB0dHVfZmxhZ3MgdHR1X2ZsYWdzID0gMDtcbi1cdHBnb2ZmX3QgZW5kID0gMDtcbiBcdGludCByZXQ7XG4gXG4gXHRWTV9XQVJOX09OX09OQ0VfRk9MSU8oIWZvbGlvX3Rlc3RfbG9ja2VkKGZvbGlvKSwgZm9saW8pO1xuQEAgLTQxMjAsMTQxICs0MjYwLDI5IEBAIHN0YXRpYyBpbnQgX19mb2xpb19zcGxpdChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyLFxuIFxuIFx0aWYgKGZvbGlvICE9IHBhZ2VfZm9saW8oc3BsaXRfYXQpIHx8IGZvbGlvICE9IHBhZ2VfZm9saW8obG9ja19hdCkpIHtcbiBcdFx0cmV0ID0gLUVJTlZBTDtcbi1cdFx0Z290byBvdXRfbm9fbWVtY2c7XG4rXHRcdGdvdG8gb3V0O1xuIFx0fVxuIFxuIFx0aWYgKG5ld19vcmRlciBcdTAwM2U9IG9sZF9vcmRlcikge1xuIFx0XHRyZXQgPSAtRUlOVkFMO1xuLVx0XHRnb3RvIG91dF9ub19tZW1jZztcbitcdFx0Z290byBvdXQ7XG4gXHR9XG4gXG4gXHRyZXQgPSBmb2xpb19jaGVja19zcGxpdHRhYmxlKGZvbGlvLCBuZXdfb3JkZXIsIHNwbGl0X3R5cGUpO1xuIFx0aWYgKHJldCkge1xuIFx0XHRWTV9XQVJOX09OQ0UocmV0ID09IC1FSU5WQUwsIFwiVHJpZWQgdG8gc3BsaXQgYW4gdW5zcGxpdHRhYmxlIGZvbGlvXCIpO1xuLVx0XHRnb3RvIG91dF9ub19tZW1jZztcbi1cdH1cbi1cbi1cdC8qXG4tXHQgKiBzd2l0Y2ggdG8gZm9saW8ncyBtZW1jZyBhcyB4YXJyYXkgbm9kZSBhbGxvY2F0aW9uIGNhbiBoYXBwZW4gYW5kXG4tXHQgKiBuZWVkcyB0byBjaGFyZ2UgdG8gaXQuXG4tXHQgKi9cbi1cdG1lbWNnID0gZ2V0X21lbV9jZ3JvdXBfZnJvbV9mb2xpbyhmb2xpbyk7XG4tXHRvbGRfbWVtY2cgPSBzZXRfYWN0aXZlX21lbWNnKG1lbWNnKTtcbi1cbi1cdGlmIChpc19hbm9uKSB7XG4tXHRcdC8qXG4tXHRcdCAqIFRoZSBjYWxsZXIgZG9lcyBub3QgbmVjZXNzYXJpbHkgaG9sZCBhbiBtbWFwX2xvY2sgdGhhdCB3b3VsZFxuLVx0XHQgKiBwcmV2ZW50IHRoZSBhbm9uX3ZtYSBkaXNhcHBlYXJpbmcgc28gd2UgZmlyc3Qgd2UgdGFrZSBhXG4tXHRcdCAqIHJlZmVyZW5jZSB0byBpdCBhbmQgdGhlbiBsb2NrIHRoZSBhbm9uX3ZtYSBmb3Igd3JpdGUuIFRoaXNcbi1cdFx0ICogaXMgc2ltaWxhciB0byBmb2xpb19sb2NrX2Fub25fdm1hX3JlYWQgZXhjZXB0IHRoZSB3cml0ZSBsb2NrXG4tXHRcdCAqIGlzIHRha2VuIHRvIHNlcmlhbGlzZSBhZ2FpbnN0IHBhcmFsbGVsIHNwbGl0IG9yIGNvbGxhcHNlXG4tXHRcdCAqIG9wZXJhdGlvbnMuXG4tXHRcdCAqL1xuLVx0XHRhbm9uX3ZtYSA9IGZvbGlvX2dldF9hbm9uX3ZtYShmb2xpbyk7XG4tXHRcdGlmICghYW5vbl92bWEpIHtcbi1cdFx0XHRyZXQgPSAtRUJVU1k7XG4tXHRcdFx0Z290byBvdXQ7XG4tXHRcdH1cbi1cdFx0YW5vbl92bWFfbG9ja193cml0ZShhbm9uX3ZtYSk7XG4tXHRcdG1hcHBpbmcgPSBOVUxMO1xuLVx0fSBlbHNlIHtcbi1cdFx0dW5zaWduZWQgaW50IG1pbl9vcmRlcjtcbi1cdFx0Z2ZwX3QgZ2ZwO1xuLVxuLVx0XHRtYXBwaW5nID0gZm9saW8tXHUwMDNlbWFwcGluZztcbi1cdFx0bWluX29yZGVyID0gbWFwcGluZ19taW5fZm9saW9fb3JkZXIobWFwcGluZyk7XG4tXHRcdGlmIChuZXdfb3JkZXIgXHUwMDNjIG1pbl9vcmRlcikge1xuLVx0XHRcdHJldCA9IC1FSU5WQUw7XG4tXHRcdFx0Z290byBvdXQ7XG4tXHRcdH1cbi1cbi1cdFx0Z2ZwID0gY3VycmVudF9nZnBfY29udGV4dChtYXBwaW5nX2dmcF9tYXNrKG1hcHBpbmcpIFx1MDAyNlxuLVx0XHRcdFx0XHRcdFx0R0ZQX1JFQ0xBSU1fTUFTSyk7XG4tXG4tXHRcdGlmICghZmlsZW1hcF9yZWxlYXNlX2ZvbGlvKGZvbGlvLCBnZnApKSB7XG4tXHRcdFx0cmV0ID0gLUVCVVNZO1xuLVx0XHRcdGdvdG8gb3V0O1xuLVx0XHR9XG4tXG4tXHRcdG1hcHBpbmdfc2V0X3VwZGF0ZShcdTAwMjZ4YXMsIG1hcHBpbmcpO1xuLVxuLVx0XHRpZiAoc3BsaXRfdHlwZSA9PSBTUExJVF9UWVBFX1VOSUZPUk0pIHtcbi1cdFx0XHR4YXNfc2V0X29yZGVyKFx1MDAyNnhhcywgZm9saW8tXHUwMDNlaW5kZXgsIG5ld19vcmRlcik7XG4tXHRcdFx0eGFzX3NwbGl0X2FsbG9jKFx1MDAyNnhhcywgZm9saW8sIG9sZF9vcmRlciwgZ2ZwKTtcbi1cdFx0XHRpZiAoeGFzX2Vycm9yKFx1MDAyNnhhcykpIHtcbi1cdFx0XHRcdHJldCA9IHhhc19lcnJvcihcdTAwMjZ4YXMpO1xuLVx0XHRcdFx0Z290byBvdXQ7XG4tXHRcdFx0fVxuLVx0XHR9XG4tXG4tXHRcdGFub25fdm1hID0gTlVMTDtcbi1cdFx0aV9tbWFwX2xvY2tfcmVhZChtYXBwaW5nKTtcbi1cbi1cdFx0Lypcbi1cdFx0ICpfX3NwbGl0X3VubWFwcGVkX2ZvbGlvKCkgbWF5IG5lZWQgdG8gdHJpbSBvZmYgcGFnZXMgYmV5b25kXG4tXHRcdCAqIEVPRjogYnV0IG9uIDMyLWJpdCwgaV9zaXplX3JlYWQoKSB0YWtlcyBhbiBpcnEtdW5zYWZlXG4tXHRcdCAqIHNlcWxvY2ssIHdoaWNoIGNhbm5vdCBiZSBuZXN0ZWQgaW5zaWRlIHRoZSBwYWdlIHRyZWUgbG9jay5cbi1cdFx0ICogU28gbm90ZSBlbmQgbm93OiBpX3NpemUgaXRzZWxmIG1heSBiZSBjaGFuZ2VkIGF0IGFueSBtb21lbnQsXG4tXHRcdCAqIGJ1dCBmb2xpbyBsb2NrIGlzIGdvb2QgZW5vdWdoIHRvIHNlcmlhbGl6ZSB0aGUgdHJpbW1pbmcuXG4tXHRcdCAqL1xuLVx0XHRlbmQgPSBESVZfUk9VTkRfVVAoaV9zaXplX3JlYWQobWFwcGluZy1cdTAwM2Vob3N0KSwgUEFHRV9TSVpFKTtcbi1cdFx0aWYgKHNobWVtX21hcHBpbmcobWFwcGluZykpXG4tXHRcdFx0ZW5kID0gc2htZW1fZmFsbG9jZW5kKG1hcHBpbmctXHUwMDNlaG9zdCwgZW5kKTtcbi1cdH1cbi1cbi1cdC8qXG4tXHQgKiBSYWN5IGNoZWNrIGlmIHdlIGNhbiBzcGxpdCB0aGUgcGFnZSwgYmVmb3JlIHVubWFwX2ZvbGlvKCkgd2lsbFxuLVx0ICogc3BsaXQgUE1Ec1xuLVx0ICovXG4tXHRpZiAoZm9saW9fZXhwZWN0ZWRfcmVmX2NvdW50KGZvbGlvKSAhPSBmb2xpb19yZWZfY291bnQoZm9saW8pIC0gMSkge1xuLVx0XHRyZXQgPSAtRUFHQUlOO1xuLVx0XHRnb3RvIG91dF91bmxvY2s7XG4tXHR9XG4tXG4tXHR1bm1hcF9mb2xpbyhmb2xpbyk7XG4tXG4tXHQvKiBibG9jayBpbnRlcnJ1cHQgcmVlbnRyeSBpbiB4YV9sb2NrIGFuZCBzcGlubG9jayAqL1xuLVx0bG9jYWxfaXJxX2Rpc2FibGUoKTtcbi1cdGlmIChtYXBwaW5nKSB7XG4tXHRcdC8qXG4tXHRcdCAqIENoZWNrIGlmIHRoZSBmb2xpbyBpcyBwcmVzZW50IGluIHBhZ2UgY2FjaGUuXG4tXHRcdCAqIFdlIGFzc3VtZSBhbGwgdGFpbCBhcmUgcHJlc2VudCB0b28sIGlmIGZvbGlvIGlzIHRoZXJlLlxuLVx0XHQgKi9cbi1cdFx0eGFzX2xvY2soXHUwMDI2eGFzKTtcbi1cdFx0eGFzX3Jlc2V0KFx1MDAyNnhhcyk7XG4tXHRcdGlmICh4YXNfbG9hZChcdTAwMjZ4YXMpICE9IGZvbGlvKSB7XG4tXHRcdFx0cmV0ID0gLUVBR0FJTjtcbi1cdFx0XHRnb3RvIGZhaWw7XG4tXHRcdH1cbitcdFx0Z290byBvdXQ7XG4gXHR9XG4gXG4tXHRyZXQgPSBfX2ZvbGlvX2ZyZWV6ZV9hbmRfc3BsaXRfdW5tYXBwZWQoZm9saW8sIG5ld19vcmRlciwgc3BsaXRfYXQsIFx1MDAyNnhhcywgbWFwcGluZyxcbi1cdFx0XHRcdFx0XHR0cnVlLCBsaXN0LCBzcGxpdF90eXBlLCBlbmQsIFx1MDAyNm5yX3NobWVtX2Ryb3BwZWQpO1xuLWZhaWw6XG4tXHRpZiAobWFwcGluZylcbi1cdFx0eGFzX3VubG9jayhcdTAwMjZ4YXMpO1xuLVxuLVx0bG9jYWxfaXJxX2VuYWJsZSgpO1xuLVxuLVx0aWYgKG5yX3NobWVtX2Ryb3BwZWQpXG4tXHRcdHNobWVtX3VuY2hhcmdlKG1hcHBpbmctXHUwMDNlaG9zdCwgbnJfc2htZW1fZHJvcHBlZCk7XG4tXG4tXHRpZiAoIXJldCBcdTAwMjZcdTAwMjYgaXNfYW5vbiBcdTAwMjZcdTAwMjYgIWZvbGlvX2lzX2RldmljZV9wcml2YXRlKGZvbGlvKSlcbi1cdFx0dHR1X2ZsYWdzID0gVFRVX1VTRV9TSEFSRURfWkVST1BBR0U7XG4tXG4tXHRyZW1hcF9wYWdlKGZvbGlvLCAxIFx1MDAzY1x1MDAzYyBvbGRfb3JkZXIsIHR0dV9mbGFncyk7XG4tXG4tXHQvKlxuLVx0ICogRHJvcCB0aGUgbWFwcGluZyB3aGlsZSB0aGUgaW5vZGUgaXMgc3RpbGwgcGlubmVkLiBAZm9saW8gc3RheXNcbi1cdCAqIGxvY2tlZCBhbmQgcHJlc2VudCBpbiB0aGUgcGFnZSBjYWNoZSB1bnRpbCB0aGUgbG9vcCBiZWxvdywgc29cbi1cdCAqIGV2aWN0aW9uIGNhbm5vdCBmcmVlIHRoZSBpbm9kZSB5ZXQ7IEBsb2NrX2F0IGlzIG5vdCBlbm91Z2gsIGl0IG1heVxuLVx0ICogYmUgYSB0YWlsIGJleW9uZCBFT0YgdGhhdCB0aGUgc3BsaXQgYWxyZWFkeSBkcm9wcGVkIGZyb20gdGhlIHBhZ2Vcbi1cdCAqIGNhY2hlLiBOb3RoaW5nIHBhc3QgdGhpcyBwb2ludCBtYXkgdG91Y2ggdGhlIGlub2RlIG9yIHRoZSBtYXBwaW5nLlxuLVx0ICovXG4tXHRpZiAobWFwcGluZykge1xuLVx0XHRpX21tYXBfdW5sb2NrX3JlYWQobWFwcGluZyk7XG4tXHRcdG1hcHBpbmcgPSBOVUxMO1xuLVx0fVxuK1x0aWYgKGlzX2Fub24pXG4rXHRcdHJldCA9IF9fZm9saW9fZnJlZXplX3NwbGl0X3VubWFwKGZvbGlvLCBuZXdfb3JkZXIsIHNwbGl0X2F0LCB0cnVlLFxuK1x0XHRcdFx0XHRcdCB0cnVlLCBsaXN0LCBzcGxpdF90eXBlKTtcbitcdGVsc2UgaWYgKGlzX3N3YXBjYWNoZSlcbitcdFx0cmV0ID0gX19mb2xpb19mcmVlemVfc3BsaXRfdW5tYXAoZm9saW8sIG5ld19vcmRlciwgc3BsaXRfYXQsIHRydWUsXG4rXHRcdFx0XHRcdFx0IGZhbHNlLCBsaXN0LCBzcGxpdF90eXBlKTtcbitcdGVsc2VcbitcdFx0cmV0ID0gX19mb2xpb19mcmVlemVfc3BsaXRfdW5tYXBfZmlsZShmb2xpbywgbmV3X29yZGVyLCBzcGxpdF9hdCxcbitcdFx0XHRcdFx0XHQgICAgICB0cnVlLCBsaXN0LCBzcGxpdF90eXBlKTtcbiBcbiBcdC8qXG4gXHQgKiBVbmxvY2sgYWxsIGFmdGVyLXNwbGl0IGZvbGlvcyBleGNlcHQgdGhlIG9uZSBjb250YWluaW5nXG5AQCAtNDI2NSwyOSArNDI5MywxOSBAQCBzdGF0aWMgaW50IF9fZm9saW9fc3BsaXQoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlcixcbiBcdFx0aWYgKG5ld19mb2xpbyA9PSBwYWdlX2ZvbGlvKGxvY2tfYXQpKVxuIFx0XHRcdGNvbnRpbnVlO1xuIFxuLVx0XHRmb2xpb191bmxvY2sobmV3X2ZvbGlvKTtcbiBcdFx0LypcbiBcdFx0ICogU3VicGFnZXMgd2hvc2UgbWFwcGluZyBoYXMgYmVlbiB6YXBwZWQgbWF5IGJlIGZyZWVkXG4gXHRcdCAqIGVhcmxpZXIsIGJ1dCBmcmVlaW5nIHRoZW0gcmVxdWlyZXMgdGFraW5nIHRoZVxuIFx0XHQgKiBscnVfbG9jaywgc28gd2UgZGVmZXIgcHV0X3BhZ2UoKSBvbiB0YWlsIHBhZ2VzIHVudGlsXG4gXHRcdCAqIGFmdGVyIHRoZSBzcGxpdCBjb21wbGV0ZXMuXG4gXHRcdCAqL1xuLVx0XHRmcmVlX2ZvbGlvX2FuZF9zd2FwX2NhY2hlKG5ld19mb2xpbyk7XG4rXHRcdGlmIChpc19zd2FwY2FjaGUpXG4rXHRcdFx0Zm9saW9fZnJlZV9zd2FwKG5ld19mb2xpbyk7XG4rXHRcdGZvbGlvX3VubG9jayhuZXdfZm9saW8pO1xuK1x0XHRmb2xpb19wdXQobmV3X2ZvbGlvKTtcbiBcdH1cbiBcbi1vdXRfdW5sb2NrOlxuLVx0aWYgKGFub25fdm1hKSB7XG4tXHRcdGFub25fdm1hX3VubG9ja193cml0ZShhbm9uX3ZtYSk7XG4tXHRcdHB1dF9hbm9uX3ZtYShhbm9uX3ZtYSk7XG4tXHR9XG4tXHRpZiAobWFwcGluZylcbi1cdFx0aV9tbWFwX3VubG9ja19yZWFkKG1hcHBpbmcpO1xuIG91dDpcbi1cdC8qIHJlc3RvcmUgdG8gY2FsbGVyJ3Mgb2xkX21lbWNnICovXG4tXHRzZXRfYWN0aXZlX21lbWNnKG9sZF9tZW1jZyk7XG4tXHRtZW1fY2dyb3VwX3B1dChtZW1jZyk7XG4tb3V0X25vX21lbWNnOlxuLVx0eGFzX2Rlc3Ryb3koXHUwMDI2eGFzKTtcbiBcdGlmIChpc19wbWRfb3JkZXIob2xkX29yZGVyKSlcbiBcdFx0Y291bnRfdm1fZXZlbnQoIXJldCA/IFRIUF9TUExJVF9QQUdFIDogVEhQX1NQTElUX1BBR0VfRkFJTEVEKTtcbiBcdGNvdW50X210aHBfc3RhdChvbGRfb3JkZXIsICFyZXQgPyBNVEhQX1NUQVRfU1BMSVQgOiBNVEhQX1NUQVRfU1BMSVRfRkFJTEVEKTtcbkBAIC00MzE4LDIyICs0MzM2LDEzIEBAIHN0YXRpYyBpbnQgX19mb2xpb19zcGxpdChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyLFxuICAqL1xuIGludCBmb2xpb19zcGxpdF91bm1hcHBlZChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyKVxuIHtcbi1cdGludCByZXQgPSAwO1xuLVxuIFx0Vk1fV0FSTl9PTl9PTkNFX0ZPTElPKGZvbGlvX21hcHBlZChmb2xpbyksIGZvbGlvKTtcbiBcdFZNX1dBUk5fT05fT05DRV9GT0xJTyghZm9saW9fdGVzdF9sb2NrZWQoZm9saW8pLCBmb2xpbyk7XG4gXHRWTV9XQVJOX09OX09OQ0VfRk9MSU8oIWZvbGlvX3Rlc3RfbGFyZ2UoZm9saW8pLCBmb2xpbyk7XG4gXHRWTV9XQVJOX09OX09OQ0VfRk9MSU8oIWZvbGlvX3Rlc3RfYW5vbihmb2xpbyksIGZvbGlvKTtcbiBcbi1cdGlmIChmb2xpb19leHBlY3RlZF9yZWZfY291bnQoZm9saW8pICE9IGZvbGlvX3JlZl9jb3VudChmb2xpbykgLSAxKVxuLVx0XHRyZXR1cm4gLUVBR0FJTjtcbi1cbi1cdGxvY2FsX2lycV9kaXNhYmxlKCk7XG4tXHRyZXQgPSBfX2ZvbGlvX2ZyZWV6ZV9hbmRfc3BsaXRfdW5tYXBwZWQoZm9saW8sIG5ld19vcmRlciwgXHUwMDI2Zm9saW8tXHUwMDNlcGFnZSwgTlVMTCxcbi1cdFx0XHRcdFx0XHROVUxMLCBmYWxzZSwgTlVMTCwgU1BMSVRfVFlQRV9VTklGT1JNLFxuLVx0XHRcdFx0XHRcdDAsIE5VTEwpO1xuLVx0bG9jYWxfaXJxX2VuYWJsZSgpO1xuLVx0cmV0dXJuIHJldDtcbitcdHJldHVybiBfX2ZvbGlvX2ZyZWV6ZV9zcGxpdF91bm1hcChmb2xpbywgbmV3X29yZGVyLCBcdTAwMjZmb2xpby1cdTAwM2VwYWdlLCBmYWxzZSxcbitcdFx0XHRcdFx0ICBmYWxzZSwgTlVMTCwgU1BMSVRfVFlQRV9VTklGT1JNKTtcbiB9XG4gXG4gLypcbkBAIC00MzUyLDExICs0MzYxLDExIEBAIGludCBmb2xpb19zcGxpdF91bm1hcHBlZChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyKVxuICAqICAgIEdVUCBwaW5zLCB3aWxsIHJlc3VsdCBpbiB0aGUgZm9saW8gbm90IGdldHRpbmcgc3BsaXQ7IGluc3RlYWQsIHRoZSBjYWxsZXJcbiAgKiAgICB3aWxsIHJlY2VpdmUgYW4gLUVBR0FJTi5cbiAgKlxuLSAqIDQpIEBuZXdfb3JkZXIgXHUwMDNlIDEsIHVzdWFsbHkuIFNwbGl0dGluZyB0byBvcmRlci0xIGFub255bW91cyBmb2xpb3MgaXMgbm90XG4tICogICAgc3VwcG9ydGVkIGZvciBub24tZmlsZS1iYWNrZWQgZm9saW9zLCBiZWNhdXNlIGZvbGlvLVx1MDAzZV9kZWZlcnJlZF9saXN0LCB3aGljaFxuLSAqICAgIGlzIHVzZWQgYnkgcGFydGlhbGx5IG1hcHBlZCBmb2xpb3MsIGlzIHN0b3JlZCBpbiBzdWJwYWdlIDIsIGJ1dCBhbiBvcmRlci0xXG4tICogICAgZm9saW8gb25seSBoYXMgc3VicGFnZXMgMCBhbmQgMS4gRmlsZS1iYWNrZWQgb3JkZXItMSBmb2xpb3MgYXJlIHN1cHBvcnRlZCxcbi0gKiAgICBzaW5jZSB0aGV5IGRvIG5vdCB1c2UgX2RlZmVycmVkX2xpc3QuXG4rICogNCkgQG5ld19vcmRlciBcdTAwM2UgMSwgdXN1YWxseS4gT3JkZXItMSBpcyBub3Qgc3VwcG9ydGVkIGZvciBhbm9uIG9yIHN3YXBjYWNoZVxuKyAqICAgIGZvbGlvczogYW5vbiBmb2xpb3MgbmVlZCBzdWJwYWdlIDIgZm9yIF9kZWZlcnJlZF9saXN0LCB3aGljaCBvcmRlci0xXG4rICogICAgZm9saW9zIGxhY2ssIGFuZCBhIHN3YXBjYWNoZSBmb2xpbyBtYXkgYmVjb21lIGFub24gb25jZSBmYXVsdGVkIGluLlxuKyAqICAgIEZpbGUtYmFja2VkIG9yZGVyLTEgZm9saW9zIGFyZSBzdXBwb3J0ZWQsIHNpbmNlIHRoZXkgZG8gbm90IHVzZVxuKyAqICAgIF9kZWZlcnJlZF9saXN0LlxuICAqXG4gICogQWZ0ZXIgc3BsaXR0aW5nLCB0aGUgY2FsbGVyJ3MgZm9saW8gcmVmZXJlbmNlIHdpbGwgYmUgdHJhbnNmZXJyZWQgdG8gQHBhZ2UsXG4gICogcmVzdWx0aW5nIGluIGEgcmFpc2VkIHJlZmNvdW50IG9mIEBwYWdlIGFmdGVyIHRoaXMgY2FsbC4gVGhlIG90aGVyIHBhZ2VzIG1heVxuZGlmZiAtLWdpdCBhL21tL3N3YXBfc3RhdGUuYyBiL21tL3N3YXBfc3RhdGUuY1xuaW5kZXggNWJlODI1OTExZTY0NS4uZjE0MDVlNWI4MTNlZSAxMDA2NDRcbi0tLSBhL21tL3N3YXBfc3RhdGUuY1xuKysrIGIvbW0vc3dhcF9zdGF0ZS5jXG5AQCAtMzg4LDggKzM4OCw5IEBAIHZvaWQgX19zd2FwX2NhY2hlX3JlcGxhY2VfZm9saW8oc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSxcbiBcdCAgICBmb2xpb19vcmRlcihvbGQpICE9IGZvbGlvX29yZGVyKG5ldykpIHtcbiBcdFx0Y2lfb2ZmID0gc3dwX2NsdXN0ZXJfb2Zmc2V0KG9sZC1cdTAwM2Vzd2FwKTtcbiBcdFx0Y2lfZW5kID0gY2lfb2ZmICsgZm9saW9fbnJfcGFnZXMob2xkKTtcbi1cdFx0d2hpbGUgKGNpX29mZisrIFx1MDAzYyBjaV9lbmQpXG4rXHRcdGRvIHtcbiBcdFx0XHRXQVJOX09OX09OQ0Uoc3dwX3RiX3RvX2ZvbGlvKF9fc3dhcF90YWJsZV9nZXQoY2ksIGNpX29mZikpICE9IG9sZCk7XG4rXHRcdH0gd2hpbGUgKCsrY2lfb2ZmIFx1MDAzYyBjaV9lbmQpO1xuIFx0fVxuIH1cbiBcbiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA3VDIxOjU1OjQyLjg2MTUzMjgzNloiLCJTZXEiOjQxLCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjoxMTE3NDg1MDYyOSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipLTVNBTiBDaGVjazogRm9saW8gU3BsaXR0aW5nIFJlZmFjdG9yKipcblxuT2theSwgc28gSSd2ZSBiZWVuIHJldmlld2luZyB0aGlzIHBhdGNoLCBhbmQgaXQncyB0b3VjaGluZyBzb21lIGNvcmUgbWVtb3J5IG1hbmFnZW1lbnQgc3R1ZmY6IGBtbS9odWdlX21lbW9yeS5jYCBhbmQgYG1tL3N3YXBfc3RhdGUuY2AuIEl0J3MgYWxsIGFib3V0IGhvdyBmb2xpb3MgZ2V0IHNwbGl0IHVwLCBwYXJ0aWN1bGFybHkgZGVhbGluZyB3aXRoIHRob3NlIHVubWFwcGVkLCBhbm9ueW1vdXMsIGFuZCBzd2FwY2FjaGUgZm9saW9zLiBUaGUgY29kZSdzIHJlZmFjdG9yaW5nIHNldmVyYWwga2V5IGZ1bmN0aW9uczogYHJlbWFwX3BhZ2VgLCBhIGJ1bmNoIG9mIGBfX3NwbGl0XypgLCBgZm9saW9fKmAgYW5kIGBfX3N3YXBfY2FjaGVfcmVwbGFjZV9mb2xpb2AuIExvb2tzIGxpa2UgYSBmYWlybHkgaW52b2x2ZWQgY2hhbmdlLlxuXG5NeSBpbW1lZGlhdGUgY29uY2VybiwgYXMgYWx3YXlzIHdpdGggbWVtb3J5IG1hbmFnZW1lbnQsIGlzIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGFjY2Vzcy4gR2l2ZW4gbXkgZXhwZXJ0aXNlLCBJIGFsd2F5cyBzY3J1dGluaXplIHRoZXNlIHBhdGNoZXMgZm9yIHRoYXQgcG90ZW50aWFsLiBJIHNlZSB0aGlzIGFzIGEgZm9saW8gc3BsaXR0aW5nIHBhdGNoLCB3aGljaCBkb2VzIG5vdCBhbGxvY2F0ZSAqbmV3KiBtZW1vcnkuIEl0J3Mgd29ya2luZyB3aXRoIGV4aXN0aW5nIHBhZ2UgbWV0YWRhdGEgKGVzc2VudGlhbGx5IGBzdHJ1Y3QgcGFnZWAgYWxyZWFkeSBwcmVzZW50IGluIGBtZW1tYXBgKSwgYW5kIHRoZSAqY29udGVudHMqIG9mIHRob3NlIHBhZ2VzIGRvbid0IHNlZW0gdG8gYmUgY2hhbmdpbmcsIGp1c3QgdGhlaXIgbWV0YWRhdGEgYW5kIHBhZ2UgdGFibGUgZW50cmllcy4gVGhlIHBhdGNoIGZvY3VzZXMgb24gc3BsaXR0aW5nIGZvbGlvcyBpbnRvIHNtYWxsZXIgdW5pdHMgYW5kIGNvcnJlY3RseSBtYW5hZ2luZyB0aGVpciBhc3NvY2lhdGVkIG1ldGFkYXRhIGFuZCBjYWNoZSBlbnRyaWVzLlxuXG5JJ20gZm9jdXNpbmcgc3BlY2lmaWNhbGx5IG9uIHJpc2sgZm9yIHVzZS1hZnRlci1mcmVlLCBkb3VibGUtZnJlZSwgbG9ja2luZyBkZWFkbG9ja3MsIG9yIHJlZmVyZW5jZSBjb3VudCBpbWJhbGFuY2VzIGluIHRoaXMgcGF0Y2guIFRoZXNlIGFyZSBhbGwgY29tbW9uIHBpdGZhbGxzLiBCYXNlZCBvbiB0aGUgZGVzY3JpcHRpb24sIHRoZXJlJ3Mgbm90aGluZyBpbiBoZXJlIHRoYXQgc2hvdWxkIGxlYWQgdG8gbmV3LCBjb21wbGV4IGRhdGEgc3RydWN0dXJlcyBiZWluZyBjcmVhdGVkLCBub3IgZG9lcyBpdCBsb29rIGxpa2UgYW55IGRhdGEgaXMgYmVpbmcgc2VudCB0byB1c2VyIHNwYWNlIGRpcmVjdGx5IHRoYXQgY291bGQgZXhwb3NlIHVuaW5pdGlhbGl6ZWQgbWVtb3J5LiBUaGUgZGVzY3JpcHRpb24gYWxzbyBtZW50aW9ucyB0aGF0IHRoZXJlIGFyZW4ndCBjaGFuZ2VzIHRvIGJvdW5kcyBjaGVja3MgdGhhdCB3b3VsZCBleHBvc2UgdW5pbml0aWFsaXplZCBtZW1vcnkuXG5cblRoZSBzdGF0ZWQgcG90ZW50aWFsIGJ1Z3MgYXJlIHR5cGljYWxseSBkZXRlY3RlZCBieSBLQVNBTiwgTE9DS0RFUCwgYW5kIFZNX1dBUk5fT04gYXNzZXJ0aW9ucywgd2hpY2ggaXMgZ29vZC4gS01TQU4gaXRzZWxmIGlzIGZvciB1bmluaXRpYWxpemVkIG1lbW9yeSByZWFkcyBhbmQgbGVha3MuIFNpbmNlIHRoaXMgcGF0Y2ggZG9lc24ndCBhcHBlYXIgdG8gaW50cm9kdWNlIHVuaW5pdGlhbGl6ZWQgbWVtb3J5ICp1c2FnZSogZGlyZWN0bHksIG1lYW5pbmcgaXTigJlzIG5vdCBjcmVhdGluZyBuZXcgbWVtb3J5IGFuZCB0aGVuIHJlYWRpbmcgZnJvbSBpdCBiZWZvcmUgaW5pdGlhbGl6YXRpb24sIEtNU0FOIHNob3VsZCBiZSB1bm5lY2Vzc2FyeS4gVGhpcyBwYXRjaCBpcyBhYm91dCBzcGxpdHRpbmcgYW5kIG1hbmFnaW5nICpleGlzdGluZyogbWVtb3J5LCB3aGljaCBtZWFucywgYE5lZWRzS01TQU5gIGlzIGZhbHNlLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxMTQxNiwiT3V0cHV0VG9rZW5zIjoxODQsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo2MDUsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0wN1QyMTo1NTo1NC4wMzYzODY5OTRaIiwiU2VxIjo0MiwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoic2V0LXJlc3VsdHMiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNTUwMCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIHJlZmFjdG9ycyBmb2xpbyBzcGxpdHRpbmcgbG9naWMgaW4gdGhlIG1lbW9yeSBtYW5hZ2VtZW50IHN1YnN5c3RlbSAoYG1tL2h1Z2VfbWVtb3J5LmNgKSwgc3BlY2lmaWNhbGx5IHNlcGFyYXRpbmcgdGhlIGhhbmRsaW5nIG9mIGFub255bW91cywgc3dhcGNhY2hlLCBhbmQgZmlsZS1iYWNrZWQgZm9saW9zLiBJdCBtb2RpZmllcyByZWZlcmVuY2UgY291bnRpbmcsIGxvY2tpbmcsIGFuZCBwYWdlIGNhY2hlL3N3YXAgY2FjaGUgcmVwbGFjZW1lbnQgbG9naWMuIFRoZXNlIGNoYW5nZXMgcHJpbWFyaWx5IHJpc2sgaW50cm9kdWNpbmcgdXNlLWFmdGVyLWZyZWUsIGRvdWJsZS1mcmVlLCBsb2NraW5nIGRlYWRsb2Nrcywgb3IgcmVmZXJlbmNlIGNvdW50IGltYmFsYW5jZXMuIFN1Y2ggaXNzdWVzIGFyZSBlZmZlY3RpdmVseSBkZXRlY3RlZCBieSBLQVNBTiwgTE9DS0RFUCwgYW5kIHN0YW5kYXJkIGtlcm5lbCBkZWJ1Z2dpbmcgYXNzZXJ0aW9ucyAoZS5nLiwgYFZNX1dBUk5fT05gKS4gVGhlIHBhdGNoIGRvZXMgbm90IGludHJvZHVjZSBuZXcgYWxsb2NhdGlvbnMgb2YgY29tcGxleCBkYXRhIHN0cnVjdHVyZXMsIG5vciBkb2VzIGl0IG1vZGlmeSBkYXRhIHNlbnQgdG8gdXNlciBzcGFjZSBvciBhbHRlciBib3VuZHMgY2hlY2tpbmcgaW4gYSB3YXkgdGhhdCBjb3VsZCBleHBvc2UgdW5pbml0aWFsaXplZCBtZW1vcnkuIFRoZXJlZm9yZSwgdGhlcmUgaXMgbm8ganVzdGlmaWNhdGlvbiBmb3IgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uLlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2Vcbn0iLCJSZXN1bHRzIjoie1xuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIHJlZmFjdG9ycyBmb2xpbyBzcGxpdHRpbmcgbG9naWMgaW4gdGhlIG1lbW9yeSBtYW5hZ2VtZW50IHN1YnN5c3RlbSAoYG1tL2h1Z2VfbWVtb3J5LmNgKSwgc3BlY2lmaWNhbGx5IHNlcGFyYXRpbmcgdGhlIGhhbmRsaW5nIG9mIGFub255bW91cywgc3dhcGNhY2hlLCBhbmQgZmlsZS1iYWNrZWQgZm9saW9zLiBJdCBtb2RpZmllcyByZWZlcmVuY2UgY291bnRpbmcsIGxvY2tpbmcsIGFuZCBwYWdlIGNhY2hlL3N3YXAgY2FjaGUgcmVwbGFjZW1lbnQgbG9naWMuIFRoZXNlIGNoYW5nZXMgcHJpbWFyaWx5IHJpc2sgaW50cm9kdWNpbmcgdXNlLWFmdGVyLWZyZWUsIGRvdWJsZS1mcmVlLCBsb2NraW5nIGRlYWRsb2Nrcywgb3IgcmVmZXJlbmNlIGNvdW50IGltYmFsYW5jZXMuIFN1Y2ggaXNzdWVzIGFyZSBlZmZlY3RpdmVseSBkZXRlY3RlZCBieSBLQVNBTiwgTE9DS0RFUCwgYW5kIHN0YW5kYXJkIGtlcm5lbCBkZWJ1Z2dpbmcgYXNzZXJ0aW9ucyAoZS5nLiwgYFZNX1dBUk5fT05gKS4gVGhlIHBhdGNoIGRvZXMgbm90IGludHJvZHVjZSBuZXcgYWxsb2NhdGlvbnMgb2YgY29tcGxleCBkYXRhIHN0cnVjdHVyZXMsIG5vciBkb2VzIGl0IG1vZGlmeSBkYXRhIHNlbnQgdG8gdXNlciBzcGFjZSBvciBhbHRlciBib3VuZHMgY2hlY2tpbmcgaW4gYSB3YXkgdGhhdCBjb3VsZCBleHBvc2UgdW5pbml0aWFsaXplZCBtZW1vcnkuIFRoZXJlZm9yZSwgdGhlcmUgaXMgbm8ganVzdGlmaWNhdGlvbiBmb3IgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uLlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2Vcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfV07CgkJCWlmICghcmF3RGF0YSB8fCByYXdEYXRhLmxlbmd0aCA9PT0gMCkgcmV0dXJuOwoKCQkJZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSk7CgkJCWRyYXdEdXJhdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCQlkcmF3VG9rZW5Db25zdW1wdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSkgewoJCQljb25zdCBzdGF0cyA9IHsKCQkJCWxsbTogeyBjb3VudDogMCwgdG9rZW5zOiAwLCBkdXJhdGlvbjogMCB9LAoJCQkJdG9vbDogeyBjb3VudDogMCwgZHVyYXRpb246IDAgfQoJCQl9OwoKCQkJcmF3RGF0YS5mb3JFYWNoKHMgPT4gewoJCQkJY29uc3QgZHVyID0gcy5EdXJhdGlvbiAvIDEwMDAwMDAwMDA7IAoJCQkJaWYgKHMuVHlwZSA9PT0gImxsbSIpIHsKCQkJCQlzdGF0cy5sbG0uY291bnQrKzsKCQkJCQlzdGF0cy5sbG0udG9rZW5zICs9IChzLklucHV0VG9rZW5zICsgcy5PdXRwdXRUb2tlbnMgKyBzLk91dHB1dFRob3VnaHRzVG9rZW5zKTsKCQkJCQlzdGF0cy5sbG0uZHVyYXRpb24gKz0gZHVyOwoJCQkJfSBlbHNlIGlmIChzLlR5cGUgPT09ICJ0b29sIikgewoJCQkJCXN0YXRzLnRvb2wuY291bnQrKzsKCQkJCQlzdGF0cy50b29sLmR1cmF0aW9uICs9IGR1cjsKCQkJCX0KCQkJfSk7CgoJCQljb25zdCBhdmdMbG1EdXIgPSBzdGF0cy5sbG0uY291bnQgPiAwID8gKHN0YXRzLmxsbS5kdXJhdGlvbiAvIHN0YXRzLmxsbS5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgkJCWNvbnN0IGF2Z0xsbVRva2VuID0gc3RhdHMubGxtLmNvdW50ID4gMCA/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-workflown29tn[1] Phase: Succeeded StartedAt: 2026-08-07 21:56:05 +0000 UTC FinishedAt: 2026-08-07 21:56:05 +0000 UTC Input: nil Output: nil --------- Name: series-workflown29tn[1].abort-on-skip-outcome Phase: Skipped StartedAt: 2026-08-07 21:56:05 +0000 UTC FinishedAt: 2026-08-07 21:56:05 +0000 UTC Input: nil Output: nil --------- Name: series-workflown29tn[2] Phase: Succeeded StartedAt: 2026-08-07 21:56:05 +0000 UTC FinishedAt: 2026-08-08 01:40:41 +0000 UTC Input: nil Output: nil --------- Name: series-workflown29tn[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"7e4ead2558f28da16d82a8f5845eee44555ff6ba","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"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":["__split_huge_page_to_list_to_order","folio_split","folio_split_unmapped","__swap_cache_replace_folio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"7e4ead2558f28da16d82a8f5845eee44555ff6ba","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"series_id":"fb72ef26-ac07-4257-9aa2-0a5a49da2bba","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-08-07 21:56:05 +0000 UTC FinishedAt: 2026-08-08 01:40:41 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:element,Default:nil,Value:*{"base":{"arch":"amd64","commit_hash":"7e4ead2558f28da16d82a8f5845eee44555ff6ba","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"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":["__split_huge_page_to_list_to_order","folio_split","folio_split_unmapped","__swap_cache_replace_folio"],"skip_cover_check":true},"patched":{"arch":"amd64","commit_hash":"7e4ead2558f28da16d82a8f5845eee44555ff6ba","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"series_id":"fb72ef26-ac07-4257-9aa2-0a5a49da2bba","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-workflown29tn[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"7e4ead2558f28da16d82a8f5845eee44555ff6ba","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"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":["__split_huge_page_to_list_to_order","folio_split","folio_split_unmapped","__swap_cache_replace_folio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"7e4ead2558f28da16d82a8f5845eee44555ff6ba","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"series_id":"fb72ef26-ac07-4257-9aa2-0a5a49da2bba","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-08-07 21:56:05 +0000 UTC FinishedAt: 2026-08-07 21:56:15 +0000 UTC Input: nil Output: nil --------- Name: series-workflown29tn[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"7e4ead2558f28da16d82a8f5845eee44555ff6ba","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"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":["__split_huge_page_to_list_to_order","folio_split","folio_split_unmapped","__swap_cache_replace_folio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"7e4ead2558f28da16d82a8f5845eee44555ff6ba","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"series_id":"fb72ef26-ac07-4257-9aa2-0a5a49da2bba","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-08-07 21:56:05 +0000 UTC FinishedAt: 2026-08-07 21:56:10 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"arch":"amd64","commit_hash":"7e4ead2558f28da16d82a8f5845eee44555ff6ba","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"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-workflown29tn/series-workflown29tn-convert-artifact-1496291992/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflown29tn[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"7e4ead2558f28da16d82a8f5845eee44555ff6ba","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"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":["__split_huge_page_to_list_to_order","folio_split","folio_split_unmapped","__swap_cache_replace_folio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"7e4ead2558f28da16d82a8f5845eee44555ff6ba","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"series_id":"fb72ef26-ac07-4257-9aa2-0a5a49da2bba","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-08-07 21:56:15 +0000 UTC FinishedAt: 2026-08-07 22:16:53 +0000 UTC Input: nil Output: nil --------- Name: series-workflown29tn[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"7e4ead2558f28da16d82a8f5845eee44555ff6ba","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"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":["__split_huge_page_to_list_to_order","folio_split","folio_split_unmapped","__swap_cache_replace_folio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"7e4ead2558f28da16d82a8f5845eee44555ff6ba","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"series_id":"fb72ef26-ac07-4257-9aa2-0a5a49da2bba","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-08-07 21:56:15 +0000 UTC FinishedAt: 2026-08-07 22:16:53 +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:*7879ff8d-281d-49b9-9330-2f15763fe99e,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-workflown29tn/series-workflown29tn-convert-artifact-1496291992/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": "b97e7227-9ae6-4a4d-b622-249504df57da", "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-workflown29tn/series-workflown29tn-build-action-3076446158/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflown29tn[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"7e4ead2558f28da16d82a8f5845eee44555ff6ba","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"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":["__split_huge_page_to_list_to_order","folio_split","folio_split_unmapped","__swap_cache_replace_folio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"7e4ead2558f28da16d82a8f5845eee44555ff6ba","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"series_id":"fb72ef26-ac07-4257-9aa2-0a5a49da2bba","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-08-07 21:56:15 +0000 UTC FinishedAt: 2026-08-07 22:16:43 +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:*7879ff8d-281d-49b9-9330-2f15763fe99e,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-workflown29tn/series-workflown29tn-convert-artifact-1496291992/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": "b97e7227-9ae6-4a4d-b622-249504df57da", "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-workflown29tn/series-workflown29tn-build-action-3076446158/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflown29tn[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"7e4ead2558f28da16d82a8f5845eee44555ff6ba","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"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":["__split_huge_page_to_list_to_order","folio_split","folio_split_unmapped","__swap_cache_replace_folio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"7e4ead2558f28da16d82a8f5845eee44555ff6ba","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"series_id":"fb72ef26-ac07-4257-9aa2-0a5a49da2bba","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-08-07 22:16:53 +0000 UTC FinishedAt: 2026-08-07 22:16:53 +0000 UTC Input: nil Output: nil --------- Name: series-workflown29tn[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"7e4ead2558f28da16d82a8f5845eee44555ff6ba","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"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":["__split_huge_page_to_list_to_order","folio_split","folio_split_unmapped","__swap_cache_replace_folio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"7e4ead2558f28da16d82a8f5845eee44555ff6ba","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"series_id":"fb72ef26-ac07-4257-9aa2-0a5a49da2bba","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-08-07 22:16:53 +0000 UTC FinishedAt: 2026-08-07 22:16:53 +0000 UTC Input: nil Output: nil --------- Name: series-workflown29tn[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"7e4ead2558f28da16d82a8f5845eee44555ff6ba","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"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":["__split_huge_page_to_list_to_order","folio_split","folio_split_unmapped","__swap_cache_replace_folio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"7e4ead2558f28da16d82a8f5845eee44555ff6ba","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"series_id":"fb72ef26-ac07-4257-9aa2-0a5a49da2bba","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-08-07 22:16:53 +0000 UTC FinishedAt: 2026-08-07 22:17:04 +0000 UTC Input: nil Output: nil --------- Name: series-workflown29tn[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"7e4ead2558f28da16d82a8f5845eee44555ff6ba","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"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":["__split_huge_page_to_list_to_order","folio_split","folio_split_unmapped","__swap_cache_replace_folio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"7e4ead2558f28da16d82a8f5845eee44555ff6ba","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"series_id":"fb72ef26-ac07-4257-9aa2-0a5a49da2bba","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-08-07 22:16:53 +0000 UTC FinishedAt: 2026-08-07 22:16:59 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"arch":"amd64","commit_hash":"7e4ead2558f28da16d82a8f5845eee44555ff6ba","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"series_id":"fb72ef26-ac07-4257-9aa2-0a5a49da2bba","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-workflown29tn/series-workflown29tn-convert-artifact-572734207/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflown29tn[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"7e4ead2558f28da16d82a8f5845eee44555ff6ba","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"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":["__split_huge_page_to_list_to_order","folio_split","folio_split_unmapped","__swap_cache_replace_folio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"7e4ead2558f28da16d82a8f5845eee44555ff6ba","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"series_id":"fb72ef26-ac07-4257-9aa2-0a5a49da2bba","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-08-07 22:17:04 +0000 UTC FinishedAt: 2026-08-07 22:19:13 +0000 UTC Input: nil Output: nil --------- Name: series-workflown29tn[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"7e4ead2558f28da16d82a8f5845eee44555ff6ba","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"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":["__split_huge_page_to_list_to_order","folio_split","folio_split_unmapped","__swap_cache_replace_folio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"7e4ead2558f28da16d82a8f5845eee44555ff6ba","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"series_id":"fb72ef26-ac07-4257-9aa2-0a5a49da2bba","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-08-07 22:17:04 +0000 UTC FinishedAt: 2026-08-07 22:19:03 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*b97e7227-9ae6-4a4d-b622-249504df57da,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-workflown29tn/series-workflown29tn-build-action-3076446158/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-workflown29tn[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"7e4ead2558f28da16d82a8f5845eee44555ff6ba","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"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":["__split_huge_page_to_list_to_order","folio_split","folio_split_unmapped","__swap_cache_replace_folio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"7e4ead2558f28da16d82a8f5845eee44555ff6ba","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"series_id":"fb72ef26-ac07-4257-9aa2-0a5a49da2bba","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-08-07 22:19:13 +0000 UTC FinishedAt: 2026-08-07 22:19:13 +0000 UTC Input: nil Output: nil --------- Name: series-workflown29tn[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"7e4ead2558f28da16d82a8f5845eee44555ff6ba","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"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":["__split_huge_page_to_list_to_order","folio_split","folio_split_unmapped","__swap_cache_replace_folio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"7e4ead2558f28da16d82a8f5845eee44555ff6ba","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"series_id":"fb72ef26-ac07-4257-9aa2-0a5a49da2bba","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-08-07 22:19:13 +0000 UTC FinishedAt: 2026-08-07 22:19:13 +0000 UTC Input: nil Output: nil --------- Name: series-workflown29tn[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"7e4ead2558f28da16d82a8f5845eee44555ff6ba","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"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":["__split_huge_page_to_list_to_order","folio_split","folio_split_unmapped","__swap_cache_replace_folio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"7e4ead2558f28da16d82a8f5845eee44555ff6ba","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"series_id":"fb72ef26-ac07-4257-9aa2-0a5a49da2bba","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-08-07 22:19:13 +0000 UTC FinishedAt: 2026-08-07 22:35:44 +0000 UTC Input: nil Output: nil --------- Name: series-workflown29tn[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"7e4ead2558f28da16d82a8f5845eee44555ff6ba","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"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":["__split_huge_page_to_list_to_order","folio_split","folio_split_unmapped","__swap_cache_replace_folio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"7e4ead2558f28da16d82a8f5845eee44555ff6ba","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"series_id":"fb72ef26-ac07-4257-9aa2-0a5a49da2bba","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-08-07 22:19:13 +0000 UTC FinishedAt: 2026-08-07 22:35:44 +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:*7879ff8d-281d-49b9-9330-2f15763fe99e,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-workflown29tn/series-workflown29tn-convert-artifact-572734207/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": "48a9aace-99ff-40ed-bf4f-06d39f669a49", "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-workflown29tn/series-workflown29tn-build-action-2117468435/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflown29tn[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"7e4ead2558f28da16d82a8f5845eee44555ff6ba","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"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":["__split_huge_page_to_list_to_order","folio_split","folio_split_unmapped","__swap_cache_replace_folio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"7e4ead2558f28da16d82a8f5845eee44555ff6ba","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"series_id":"fb72ef26-ac07-4257-9aa2-0a5a49da2bba","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-08-07 22:19:13 +0000 UTC FinishedAt: 2026-08-07 22:35:34 +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:*7879ff8d-281d-49b9-9330-2f15763fe99e,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-workflown29tn/series-workflown29tn-convert-artifact-572734207/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": "48a9aace-99ff-40ed-bf4f-06d39f669a49", "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-workflown29tn/series-workflown29tn-build-action-2117468435/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflown29tn[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"7e4ead2558f28da16d82a8f5845eee44555ff6ba","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"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":["__split_huge_page_to_list_to_order","folio_split","folio_split_unmapped","__swap_cache_replace_folio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"7e4ead2558f28da16d82a8f5845eee44555ff6ba","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"series_id":"fb72ef26-ac07-4257-9aa2-0a5a49da2bba","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-08-07 22:35:44 +0000 UTC FinishedAt: 2026-08-07 22:35:44 +0000 UTC Input: nil Output: nil --------- Name: series-workflown29tn[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"7e4ead2558f28da16d82a8f5845eee44555ff6ba","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"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":["__split_huge_page_to_list_to_order","folio_split","folio_split_unmapped","__swap_cache_replace_folio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"7e4ead2558f28da16d82a8f5845eee44555ff6ba","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"series_id":"fb72ef26-ac07-4257-9aa2-0a5a49da2bba","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-08-07 22:35:44 +0000 UTC FinishedAt: 2026-08-07 22:35:44 +0000 UTC Input: nil Output: nil --------- Name: series-workflown29tn[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"7e4ead2558f28da16d82a8f5845eee44555ff6ba","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"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":["__split_huge_page_to_list_to_order","folio_split","folio_split_unmapped","__swap_cache_replace_folio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"7e4ead2558f28da16d82a8f5845eee44555ff6ba","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"series_id":"fb72ef26-ac07-4257-9aa2-0a5a49da2bba","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-08-07 22:35:44 +0000 UTC FinishedAt: 2026-08-07 22:37:47 +0000 UTC Input: nil Output: nil --------- Name: series-workflown29tn[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"7e4ead2558f28da16d82a8f5845eee44555ff6ba","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"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":["__split_huge_page_to_list_to_order","folio_split","folio_split_unmapped","__swap_cache_replace_folio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"7e4ead2558f28da16d82a8f5845eee44555ff6ba","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"series_id":"fb72ef26-ac07-4257-9aa2-0a5a49da2bba","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-08-07 22:35:44 +0000 UTC FinishedAt: 2026-08-07 22:37:37 +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:*48a9aace-99ff-40ed-bf4f-06d39f669a49,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-workflown29tn/series-workflown29tn-build-action-2117468435/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-workflown29tn[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"7e4ead2558f28da16d82a8f5845eee44555ff6ba","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"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":["__split_huge_page_to_list_to_order","folio_split","folio_split_unmapped","__swap_cache_replace_folio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"7e4ead2558f28da16d82a8f5845eee44555ff6ba","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"series_id":"fb72ef26-ac07-4257-9aa2-0a5a49da2bba","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-08-07 22:37:47 +0000 UTC FinishedAt: 2026-08-08 01:40:41 +0000 UTC Input: nil Output: nil --------- Name: series-workflown29tn[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"7e4ead2558f28da16d82a8f5845eee44555ff6ba","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"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":["__split_huge_page_to_list_to_order","folio_split","folio_split_unmapped","__swap_cache_replace_folio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"7e4ead2558f28da16d82a8f5845eee44555ff6ba","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"series_id":"fb72ef26-ac07-4257-9aa2-0a5a49da2bba","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-08-07 22:37:47 +0000 UTC FinishedAt: 2026-08-08 01:40:41 +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":["__split_huge_page_to_list_to_order","folio_split","folio_split_unmapped","__swap_cache_replace_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:*b97e7227-9ae6-4a4d-b622-249504df57da,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*48a9aace-99ff-40ed-bf4f-06d39f669a49,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-workflown29tn/series-workflown29tn-build-action-3076446158/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-workflown29tn/series-workflown29tn-build-action-2117468435/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: nil --------- Name: series-workflown29tn[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"7e4ead2558f28da16d82a8f5845eee44555ff6ba","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"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":["__split_huge_page_to_list_to_order","folio_split","folio_split_unmapped","__swap_cache_replace_folio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"7e4ead2558f28da16d82a8f5845eee44555ff6ba","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"series_id":"fb72ef26-ac07-4257-9aa2-0a5a49da2bba","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-08-07 22:37:47 +0000 UTC FinishedAt: 2026-08-07 22:37:58 +0000 UTC Input: nil Output: nil --------- Name: series-workflown29tn[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"7e4ead2558f28da16d82a8f5845eee44555ff6ba","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"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":["__split_huge_page_to_list_to_order","folio_split","folio_split_unmapped","__swap_cache_replace_folio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"7e4ead2558f28da16d82a8f5845eee44555ff6ba","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"series_id":"fb72ef26-ac07-4257-9aa2-0a5a49da2bba","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-08-07 22:37:47 +0000 UTC FinishedAt: 2026-08-07 22:37:52 +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":["__split_huge_page_to_list_to_order","folio_split","folio_split_unmapped","__swap_cache_replace_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-workflown29tn/series-workflown29tn-convert-artifact-2972520856/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflown29tn[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"7e4ead2558f28da16d82a8f5845eee44555ff6ba","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"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":["__split_huge_page_to_list_to_order","folio_split","folio_split_unmapped","__swap_cache_replace_folio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"7e4ead2558f28da16d82a8f5845eee44555ff6ba","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"series_id":"fb72ef26-ac07-4257-9aa2-0a5a49da2bba","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-08-07 22:37:47 +0000 UTC FinishedAt: 2026-08-07 22:37:47 +0000 UTC Input: nil Output: nil --------- Name: series-workflown29tn[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"7e4ead2558f28da16d82a8f5845eee44555ff6ba","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"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":["__split_huge_page_to_list_to_order","folio_split","folio_split_unmapped","__swap_cache_replace_folio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"7e4ead2558f28da16d82a8f5845eee44555ff6ba","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"series_id":"fb72ef26-ac07-4257-9aa2-0a5a49da2bba","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-08-07 22:37:47 +0000 UTC FinishedAt: 2026-08-07 22:37:47 +0000 UTC Input: nil Output: nil --------- Name: series-workflown29tn[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"7e4ead2558f28da16d82a8f5845eee44555ff6ba","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"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":["__split_huge_page_to_list_to_order","folio_split","folio_split_unmapped","__swap_cache_replace_folio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"7e4ead2558f28da16d82a8f5845eee44555ff6ba","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"series_id":"fb72ef26-ac07-4257-9aa2-0a5a49da2bba","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-08-07 22:37:48 +0000 UTC FinishedAt: 2026-08-07 22:37:48 +0000 UTC Input: nil Output: nil --------- Name: series-workflown29tn[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"7e4ead2558f28da16d82a8f5845eee44555ff6ba","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"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":["__split_huge_page_to_list_to_order","folio_split","folio_split_unmapped","__swap_cache_replace_folio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"7e4ead2558f28da16d82a8f5845eee44555ff6ba","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"series_id":"fb72ef26-ac07-4257-9aa2-0a5a49da2bba","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-08-07 22:37:58 +0000 UTC FinishedAt: 2026-08-08 01:40:41 +0000 UTC Input: nil Output: nil --------- Name: series-workflown29tn[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"7e4ead2558f28da16d82a8f5845eee44555ff6ba","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"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":["__split_huge_page_to_list_to_order","folio_split","folio_split_unmapped","__swap_cache_replace_folio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"7e4ead2558f28da16d82a8f5845eee44555ff6ba","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"series_id":"fb72ef26-ac07-4257-9aa2-0a5a49da2bba","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-08-07 22:37:58 +0000 UTC FinishedAt: 2026-08-08 01:40:31 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*b97e7227-9ae6-4a4d-b622-249504df57da,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*48a9aace-99ff-40ed-bf4f-06d39f669a49,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-workflown29tn/series-workflown29tn-build-action-3076446158/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-workflown29tn/series-workflown29tn-build-action-2117468435/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-workflown29tn/series-workflown29tn-convert-artifact-2972520856/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,}